医学数据分析实训 项目四回归分析--预测帕金森病病情的严重程度

news2024/11/13 10:32:39

文章目录

  • 项目四:回归分析
      • 实践目的
      • 实践平台
      • 实践内容
  • 预测帕金森病病情的严重程度作业
    • (一)数据读入及理解
    • (二)数据准备
    • (三)模型建立
    • (四)模型预测
    • (五)模型评价及优化

项目四:回归分析

实践目的

  • 熟悉并掌握线性回归模型及其使用方法;
  • 理解回归分析算法并能使用回归模型分析数据集;
  • 熟悉模型性能评估的方法;

实践平台

  • 操作系统:Windows 7 及以上
  • Python 版本:3.8.x 及以上
  • 开发环境:PyCharm 或 Anoconda 集成环境

实践内容

数据集:“parkinsons_updrs.data”,专注于通过远程监测设备记录帕金森病患者的语音信号来预测病情严重程度。

主要属性

  • subject#:受试者编号;
  • age:受试者年龄;
  • sex:受试者性别;
  • test_time:从招募日期开始的时间间隔;
  • motor_UPDRS:运动症状帕金森病评分量表分数;
  • total_UPDRS:总体帕金森病评分量表分数;
  • Jitter(%):声音信号频率抖动的百分比;
  • Jitter(Abs):声音信号频率抖动的绝对值;
  • Jitter:RAP:声音信号频率抖动的相对平均扰动;
  • Jitter:PPQ5:与五个周期相关的频率抖动特征;
  • Jitter:DDP:与差分相关的频率抖动特征;
  • Shimmer:声音信号振幅的抖动;
  • Shimmer(dB):以分贝为单位的振幅抖动;
  • Shimmer:APQ3:与三个周期相关的振幅抖动特征;
  • Shimmer:APQ5:与五个周期相关的振幅抖动特征;
  • Shimmer:APQ11:与十一个周期相关的振幅抖动特征;
  • Shimmer:DDA:与差分相关的振幅抖动特征;
  • NHR:噪声谐波比;
  • HNR:谐波噪声比;
  • RPDE:循环周期密度熵;
  • DFA:趋势波动分析;
  • PPE: 基频变化的非线性测量。

步骤

  1. 数据读入及理解

    • 导入所需Python包;
    • 将数据读入DataFrame格式,查看前5行数据;
    • 使用describe()info()方法和shape属性进行探索性分析;
  2. 数据准备

    • 数据清洗:处理缺失值、重复值、异常值;
    • 标准化处理;
    • 使用Seaborn.pairplot()可视化展示“Jitter:RAP”、“Jitter:DDP”、“Shimmer:DDA”与“motor_UPDRS”、“total_UPDRS”的相关性;
    • 准备特征矩阵(X)和目标向量(y);
  3. 模型建立

    • 使用train_test_split()方法划分训练集和测试集(random_state=1,25%测试,75%训练);
    • 使用LinearRegression进行线性回归,并通过score()方法输出模型准确率;
  4. 模型预测

    • 输出预测值(y_pred);
    • 对比y_pred与y_test;
  5. 模型评价及优化

    • 使用sklearn.metrics模块中的MSE、RMSE、R²对模型进行评价;
    • 建立岭回归或Lasso回归模型,进行训练和预测;
    • 对岭回归或Lasso回归模型进行评价;
    • 对比两种模型预测结果。

预测帕金森病病情的严重程度作业

(一)数据读入及理解

# 1. 导入本案例所需的 Python 包
import json
import os
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
# 显示负号
plt.rcParams['axes.unicode_minus'] = False

# 2. 将数据读入并存为 DataFrame 格式,查看前 5 行数据
data = pd.read_csv('input/parkinsons_updrs.data')
print(data.head())

# 3. 通过 describe()、info()方法和 shape 属性等方法对读入的数据对象进行探索性分析
# 显示数据的基本统计信息
print(data.describe())
# 显示数据的信息
print(data.info())
# 显示数据的形状
print(f"数据形状: {data.shape}")

(二)数据准备

# 1.	对数据集从缺失值、重复值、异常值等方面进行数据清洗;

# 检查缺失值
print('缺失值情况:', data.isnull().sum())
# 处理缺失值(假设用均值填充)
# data.fillna(data.mean(), inplace=True)

# 检查重复值
print("\n重复值数量:", data.duplicated().sum())
# 删除重复值
# data.drop_duplicates(inplace=True)

# 异常值处理(假设使用 IQR 方法)
Q1 = data.quantile(0.25, axis=0)
Q3 = data.quantile(0.75, axis=0)
IQR = Q3 - Q1

# 定义异常值范围
outliers = ((data < (Q1 - 1.5 * IQR)) | (data > (Q3 + 1.5 * IQR)))

# 替换异常值(例如用中位数)
for column in data.columns:
    if column in outliers.columns:
        data.loc[outliers[column], column] = data[column].median()

# 查看异常值处理后的数据
print("异常值处理后的数据:\n", data.head())
# 2.对数据进行标准化处理;
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

# 选定需要标准化的特征(排除非数值类型特征)
features = ["Jitter:RAP", "Jitter:DDP", "Shimmer:DDA"]
data[features] = scaler.fit_transform(data[features])

print("标准化后的数据:\n", data.head())

# 3. 通过 Seaborn.pairplot()可视化展示"Jitter:RAP","Jitter:DDP","Shimmer:DDA"与"motor_UPDRS","total_UPDRS"的相关性;
selected_columns = ['Jitter:RAP', 'Jitter:DDP', 'Shimmer:DDA', 'motor_UPDRS', 'total_UPDRS']

# 绘制 pairplot
sns.pairplot(data[selected_columns])
plt.show()

在这里插入图片描述

# 4.	进行回归分析前,准备好模型所需的特征矩阵(X)和目标向量(y)。
# # 特征矩阵
# X = data[["Jitter:RAP", "Jitter:DDP", "Shimmer:DDA","total_UPDRS"]]
# 
# # 目标变量
# y_motor = data["motor_UPDRS"]
# 准备特征矩阵(X)和目标向量(y)

X = data[["Jitter:RAP", "Jitter:DDP", "Shimmer:DDA","total_UPDRS"]]
y_motor = data['motor_UPDRS']
y_total = data['total_UPDRS']

# 查看特征矩阵和目标向量的形状
print("特征矩阵 X 的形状:", X.shape)
print("目标向量 y_motor 的形状:", y_motor.shape[0])
print("目标向量 y_total 的形状:", y_total.shape[0])

特征矩阵 X 的形状: (5875, 4)
目标向量 y_motor 的形状: 5875
目标向量 y_total 的形状: 5875

(三)模型建立

# 1 调用 sklearn.model_selection 中的 train_test_split() 方法进行训练集和测试集的拆分
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

#  X 和 y_motor 已经定义
# X = data.drop(['motor_UPDRS', 'total_UPDRS'], axis=1)
# y_motor = data['motor_UPDRS']

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y_motor, test_size=0.25, random_state=1)

# 查看训练数据和测试数据的数量
print("训练数据数量:", len(X_train))
print("测试数据数量:", len(X_test))

训练数据数量: 4406
测试数据数量: 1469

# 2.	调用 sklearn.linear_model 中的 LinearRegression 对训练集进行线性回归,并通过 score()方法输出模型的准确率;
# 创建线性回归模型
linear_reg = LinearRegression()

# 训练模型
linear_reg.fit(X_train, y_train)

# 输出模型的准确率(R^2 分数)
train_score = linear_reg.score(X_train, y_train)
test_score = linear_reg.score(X_test, y_test)

print("训练集准确率 (R^2):", train_score)
print("测试集准确率 (R^2):", test_score)

训练集准确率 (R^2): 0.8968939783000226
测试集准确率 (R^2): 0.8984946250185042

(四)模型预测

# 1.	输出预测值(y_pred);
# 使用训练好的模型进行预测
y_pred = linear_reg.predict(X_test)

# 输出预测值
print("预测值 (y_pred):", y_pred)

# 2.	通过可视化图表对 y_pred 和 y_test 进行对比;
import matplotlib.pyplot as plt

# 设置显示中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
# 设置正常显示符号
plt.rcParams['axes.unicode_minus'] = False
# 创建一个图形
plt.figure(figsize=(10, 6))

# 绘制实际值和预测值
plt.scatter(y_test, y_pred, color='blue', label='预测值')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linewidth=2, label='实际值')

# 添加标签和标题
plt.xlabel('实际值 (y_test)')
plt.ylabel('预测值 (y_pred)')
plt.title('实际值 vs 预测值')
plt.legend()

# 显示图形
plt.show()

在这里插入图片描述

(五)模型评价及优化

# 1.	调用 sklearn.metrics 模块,通过均方误差(MSE)“mean_squared_error”、均方根误差(RMSE)以及决定系数(R2) “r2_score” 对模型进行评价;
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np
# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)

# 计算均方根误差(RMSE)
# rmse = mean_squared_error(y_test, y_pred, squared=False)
# FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.
rmse = np.sqrt(mse)# 直接用 numpy 计算 RMSE

# 计算决定系数(R2)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("均方根误差 (RMSE):", rmse)
print("决定系数 (R2_score):", r2)

# 2.	建立岭回归或 Lasso 回归模型,对数据集进行训练并预测;
from sklearn.linear_model import Ridge, Lasso

# 建立岭回归模型
ridge_reg = Ridge(alpha=1.0)
ridge_reg.fit(X_train, y_train)
y_pred_ridge = ridge_reg.predict(X_test)

# 建立 Lasso 回归模型
lasso_reg = Lasso(alpha=1.0)
lasso_reg.fit(X_train, y_train)
y_pred_lasso = lasso_reg.predict(X_test)

# 3 通过均方误差(MSE)、均方根误差(RMSE)以及决定系数(R2) 对岭回归或 Lasso 回归模型进行评价
# 评价岭回归模型
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
rmse_ridge = np.sqrt(mse_ridge)
r2_ridge = r2_score(y_test, y_pred_ridge)

print("岭回归 均方误差 (MSE):", mse_ridge)
print("岭回归 均方根误差 (RMSE):", rmse_ridge)
print("岭回归 决定系数 (R2_SCORE):", r2_ridge)

# 评价 Lasso 回归模型
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
rmse_lasso = np.sqrt(mse_lasso)
r2_lasso = r2_score(y_test, y_pred_lasso)

print("Lasso 回归 均方误差 (MSE):", mse_lasso)
print("Lasso 回归 均方根误差 (RMSE):", rmse_lasso)
print("Lasso 回归 决定系数 (R2_SCORE):", r2_lasso)

# 保存数据
results = {}
results['线性回归'] = {'均方误差': mse, '均方根误差': rmse, '决定系数': r2}
results['岭回归'] = {'均方误差': mse_ridge, '均方根误差': rmse_ridge, '决定系数': r2_ridge}
results['Lasso 回归'] = {'均方误差': mse_lasso, '均方根误差': rmse_lasso, '决定系数': r2_lasso}
# print(results)

# 保存数据
output_dir = 'output'

# 保存 JSON 文件
json_file_path = os.path.join(output_dir, '三种回归评价.json')

with open(json_file_path, 'w', encoding='utf-8') as f:
    json.dump(results, f, ensure_ascii=False, indent=4)
    print('已完成保存 JSON 文件')

{
    "线性回归": {
        "均方误差": 6.914145184671658,
        "均方根误差": 2.6294762186929277,
        "决定系数": 0.8984946250185042
    },
    "岭回归": {
        "均方误差": 6.914213719729213,
        "均方根误差": 2.629489250734677,
        "决定系数": 0.8984936188671246
    },
    "Lasso 回归": {
        "均方误差": 6.916797056785589,
        "均方根误差": 2.6299804289738717,
        "决定系数": 0.8984556933405978
    }
}
# 4 通过可视化图表对比两种模型预测结果
# 创建一个图形
plt.figure(figsize=(15, 5))

# 绘制线性回归模型的预测结果
plt.subplot(1, 3, 1)
plt.scatter(y_test, y_pred, color='blue', label='预测值')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linewidth=2, label='实际值')
plt.xlabel('实际值 (y_test)')
plt.ylabel('预测值 (y_pred)')
plt.title('线性回归 实际值 vs 预测值')
plt.legend()

# 绘制岭回归模型的预测结果
plt.subplot(1, 3, 2)
plt.scatter(y_test, y_pred_ridge, color='green', label='预测值')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linewidth=2, label='实际值')
plt.xlabel('实际值 (y_test)')
plt.ylabel('预测值 (y_pred_ridge)')
plt.title('岭回归 实际值 vs 预测值')
plt.legend()

# 绘制 Lasso 回归模型的预测结果
plt.subplot(1, 3, 3)
plt.scatter(y_test, y_pred_lasso, color='orange', label='预测值')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linewidth=2, label='实际值')
plt.xlabel('实际值 (y_test)')
plt.ylabel('预测值 (y_pred_lasso)')
plt.title('Lasso 回归 实际值 vs 预测值')
plt.legend()

# 显示图形
plt.tight_layout()
plt.savefig('./output/三种回归预测结果.png')
plt.show()

# 保存图片

print('已完成保存图片')

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络通俗理解学习笔记(4) 深度生成模型VAE、GAN

深度生成模型 什么是生成式模型蒙特卡洛方法变分推断Variational Inference变分自编码器VAE生成对抗网络Generative Adversarial NetworkDiffusion 扩散模型VAE和GAN 代码实现 什么是生成式模型 判别式和生成式模型 判别式:CNN/RNN/transformer;生成式:AE/VAE/GAN 判别式模型学…

Linux:RPM软件包管理以及Yum软件包仓库

挂载光驱设备 RPM软件包管理 RPM软件包简介 区分软件名和软件包名 软件名&#xff1a;firefox 软件包名&#xff1a;firefox-52.7.0-1.el7.centos.x86_64.rpm 查询软件信息 查询软件&#xff08;参数为软件名&#xff09; ]# rpm -qa #当前系统中所有已安装的软件包 ]# r…

Unity实战案例全解析 :PVZ 植物脚本分析

植物都继承了Pants脚本&#xff0c;但是我因为没注意听讲&#xff0c;把Pants也挂在植物上了&#xff0c;所以子类的PlantEnableUpdate和PlantDisableUpdate抢不过父类&#xff0c;无法正确触发动画&#xff0c;我还找不到哪里出了问题&#xff0c;所以就使用了携程加while强行…

Navicat使用 笔记04

Navicat调用数据库 1.创建一个自己的链接&#xff08;文件-->新建连接-->MySQL&#xff09; 进入到这个界面中&#xff1a; 【注意&#xff1a;密码是下载登录软件时设定过的】 创建一个连接完成&#xff08;通过双击激活&#xff09;。 2.在创建好的连接中创建数据库…

神经网络通俗理解学习笔记(5) 自然语言处理

自然语言处理 词嵌入和word2vec词义搜索和句意表示预训练模型Hugging Face库介绍经典NLP数据集代码案例-电影评论情感分析 词嵌入和word2vec 词嵌入是一种 将高维的数据表示映射到低维空间的方法 word embedding 是将语言中的词编码成向量便于后续的分析和处理 词嵌入和词向量…

感知器神经网络

1、原理 感知器是一种前馈人工神经网络&#xff0c;是人工神经网络中的一种典型结构。感知器具有分层结构&#xff0c;信息从输入层进入网络&#xff0c;逐层向前传递至输出层。根据感知器神经元变换函数、隐层数以及权值调整规则的不同&#xff0c;可以形成具有各种功能特点的…

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…

django学习入门系列之第十点《A 案例: 员工管理系统8》

文章目录 10.6 重写样式10.7 判断数据是否合法10.8 保存内容至数据库10.9 修改入职时间10.10 错误提示10.11 重写错误信息往期回顾 10.6 重写样式 注意&#xff1a;因为他框架都已经给你写好了&#xff0c;所以如果要使用样式的话可能要自己重新定义框架来进行修改 他有两种方…

衣食住行的投资与消费

机器人工程课程与科研采取敏捷开发的弊端和反思_工业机器人适合敏捷开发吗-CSDN博客 →学历消费者←自我救赎↑2024↓(*Φ皿Φ*)-CSDN博客 大部分衣食住行相关的产品都是消费品&#xff0c;只有极少部分是能保值的资产。 物以稀为贵&#xff0c;量产供应的一般而言都是消费品…

第二百三十五节 JPA教程 - JPA Lob列示例

JPA教程 - JPA Lob列示例 以下代码显示了如何使用Lob注释将字节数组保存到数据库。 LOB在数据库中有两种类型&#xff1a;字符大对象&#xff08;称为CLOB&#xff09;和二进制大对象&#xff08;或BLOB&#xff09;。 CLOB列保存大字符序列&#xff0c;BLOB列可存储大字节序…

JDK的选择安装和下载

搭建Java开发环境 要使用Java首先必须搭建Java的开发环境&#xff1b;Java的产品叫JDK&#xff08;Java Development Kit&#xff1a;Java开发工具包&#xff09;&#xff0c;必须安装JDK才能使用Java。 JDK发展史 那么这么多JDK&#xff0c;应该使用哪个版本&#xff0c;此处…

C# 比较对象新思路,利用反射技术打造更灵活的比较工具

前言 嘿&#xff0c;大家好&#xff01;如果你之前看过我分享的文章《C# 7个方法比较两个对象是否相等》&#xff0c;你可能会意识到对象比较在实际业务中经常出现的场景。今天&#xff0c;我想继续与大家分享一个在实际项目中遇到的问题。 有一次&#xff0c;我接手了一个别…

LLVM PASS-PWN-前置

文章目录 参考环境搭建基础知识![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dced705dcbb045ceb8df2237c9b0fd71.png)LLVM IR实例1. **.ll 格式&#xff08;人类可读的文本格式&#xff09;**2. **.bc 格式&#xff08;二进制格式&#xff09;**3. **内存表示** …

无心剑英译张九龄《望月怀远》

望月怀远 Watching the Moon and Missing You Far Away 张九龄 By Zhang Jiuling 海上生明月&#xff0c;天涯共此时 情人怨遥夜&#xff0c;竟夕起相思 灭烛怜光满&#xff0c;披衣觉露滋 不堪盈手赠&#xff0c;还寝梦佳期 The bright moon rises from the sea, So far apart…

【宠物小精灵之收服(待更新)】

题目 代码 #include <bits/stdc.h> using namespace std; int f[1010][510]; int main() {int n, m, k;cin >> n >> m >> k;int c 0;for(int i 1; i < k; i){int cost, hp;cin >> cost >> hp;for(int j n; j > cost; j--){for(i…

java技术栈介绍

Java技术栈是一个庞大而丰富的生态系统&#xff0c;它包含了从基础语言特性到高级框架、库和工具的整个集合。这个技术栈为开发者提供了构建各种类型应用&#xff08;包括企业级应用、Web应用、移动应用、大数据应用等&#xff09;所需的全部组件。以下是对Java技术栈的一个更详…

【webpack4系列】编写可维护的webpack构建配置(四)

文章目录 构建配置包设计功能模块设计和目录结构设计功能模块设计目录结构设计 使用ESLint规范构建脚本冒烟测试介绍和实际运用冒烟测试 (smoke testing)冒烟测试执行判断构建是否成功判断基本功能是否正常 单元测试和测试覆盖率测试框架编写单元测试用例单元测试接入测试覆盖率…

新发布!Streamlab X系列第二版:短视频电影直播全能主题,赋能苹果CMS

Streamlab X系列第二版强势登陆&#xff0c;专为苹果CMS设计的短视频与电影直播融合的多功能主题模板震撼首发&#xff01; 这款主题以其非凡的适应性和极致的视觉效果&#xff0c;重新定义了网站构建的边界。采用独家精心研发的框架&#xff0c;它能够无缝跨越从移动设备到超…

在实际LabVIEW开发中,哪些算法是常用的?

在LabVIEW的实际开发中&#xff0c;常用的算法主要集中在数据处理、控制系统、信号处理、图像处理等领域。以下是一些常用算法的介绍&#xff1a; 1. PID控制算法 PID&#xff08;比例-积分-微分&#xff09;控制是LabVIEW中常用的算法之一&#xff0c;广泛应用于工业自动化和…

【四】k8s部署 TDengine集群

k8s部署 TDengine集群 目录 k8s部署 TDengine集群 一、在 Kubernetes 上部署 TDengine 集群 第一步&#xff1a;创建命名空间 第二步&#xff1a;从yaml创建有状态服务 StatefulSet 第三步&#xff1a;配置 Service 服务 二、集群测试 一、在 Kubernetes 上部署 TDengine…