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

news2024/9/23 23:58:27

文章目录

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

项目四:回归分析

实践目的

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

实践平台

  • 操作系统: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/2158820.html

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

相关文章

如何使用cmd命令查看本机电脑的主机名?

1、按键盘win R 键&#xff0c;输入cmd&#xff0c;然后按一下【回车】 2、输入ping -a localhost , 然后按下【回车】 3、如下Ping 后面的DESKTOP-ALB9JF7即是本机电脑的【主机名】

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…

linux的ssh命令使用介绍

目录 一、SSH的基本概念 二、SSH的工作原理 1、建立连接 2、密钥交换 3、认证 4、加密通信 三、SSH的主要功能 1、远程登录 2、文件传输 3、端口转发 四、SSH的安全性 五、SSH的应用场景 六、SSH的实现软件 一、SSH的基本概念 SSH主要用于登录远程服务器和执行命令、传输文…

使用Conda配置python环境到Pycharm------Window小白版

使用Conda配置python环境到Pycharm 一、Conda安装和环境配置1.1 安装Conda软件1.2 判断是否安装成功1.3 创建Conda虚拟环境 二、 pycharm的安装2.1 Pycharm使用手册2.2 安装pycharm 三、 pycharm导入Conda环境 一、Conda安装和环境配置 anaconda官网 1.1 安装Conda软件 运行…

TryHackMe 第4天 | Pre Security (三)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去两篇已经对计算机网络和网络协议进行了简单介绍&#xff0c;本篇博客将记录 Linux命令 部分。 Linux 系统的优点就是其轻量级&#xff0c;有些 Linux 系…

通过spring-boot创建web项目

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…

Linux:Bash中的文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

2012-2019全球地表平均夜光年度数据

数据详情 2012-2019全球地表平均夜光年度数据 数据属性 数据名称&#xff1a;全球地表平均夜光年度数据 数据时间&#xff1a;2012-2019 空间位置&#xff1a;全球 数据格式&#xff1a;tif 空间分辨率&#xff1a;1500米 时间分辨率&#xff1a;年 坐标系&#xff1a;…

【自学笔记】支持向量机(3)——软间隔

引入 上一回解决了SVM在曲线边界的上的使用&#xff0c;使得非线性数据集也能得到正确的分类。然而&#xff0c;对于一个大数据集来说&#xff0c;极有可能大体呈线性分类趋势&#xff0c;但是边界处混杂&#xff0c;若仍采用原来的方式&#xff0c;会得到极其复杂的超平面边界…

高效高质量SCI论文撰写及投稿

第一章、论文写作准备即为最关键 1、科技论文写作前期的重要性及其分类 2、AI工具如何助力学术论文 3、研究主题确定及提高创新性 兴趣与背景&#xff1a;选择一个您感兴趣且有背景知识的研究领域。 创新性&#xff1a;选题和研究设计阶段如何提高学术创新性的方法。 研究缺…

FreeMarker 禁止自动转义标签-noautoesc

&#x1f496;简介 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它被设计用来生成文本输出&#xff08;HTML 网页、电子邮件、配置文件等&#xff09;。在 FreeMarker 中&#xff0c;默认情况下&#xff0c;当你在模板中输出变量时&#xff0c;如果这些变量包含 …

应用密码学第一次作业(9.23)

一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…

在线思维导图怎么制作?只需要台这些组合分析法!

思维导图经历了漫长的进化&#xff0c;现已成为信息组织、记忆和头脑风暴的重要工具。其制作方式主要有手绘和软件两种&#xff0c;随着互联网的发展&#xff0c;软件制作因其便捷性和易于保存逐渐占据主导。如今&#xff0c;在线工具使得用户能够免费创建思维导图。本文将以即…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案&#xff0c;能够在多个节点之间分片存储数据&#xff0c;实现水平扩展和高可用性。与传统的主从架构不同&#xff0c;Redis 集群支持数据自动分片、主节点故…

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…

通信工程学习:什么是MANO管理编排

MANO&#xff1a;管理编排 MANO&#xff1a;Management and Network Orchestration&#xff08;管理和网络编排&#xff09;在网络功能虚拟化&#xff08;NFV&#xff09;架构中扮演着至关重要的角色。MANO是一个由多个功能实体组合而成的层次&#xff0c;这些功能实体负责管理…

嘉宾云集旌城 只为大赛而来 2024ISGC国际烈酒(中国)大奖赛在德阳落下帷幕

秋高气爽、古蜀之源&#xff0c;迎来第六届国际烈酒&#xff08;中国&#xff09;大奖赛&#xff1b;五谷丰登、重装之都&#xff0c;齐聚百名国际烈酒大奖赛评委。 9月18日&#xff0c;由德阳市人民政府、国家葡萄酒及白酒露酒产品质量检验检测中心、上海合作组织多功能经贸平…

数据结构之图的遍历

文章目录 广度优先遍历深度优先遍历 广度优先遍历 广度优先遍历过程类似于二叉树的层序遍历&#xff0c;从起始顶点开始一层一层向外进行遍历 比如现在要找东西&#xff0c;假设有三个抽屉&#xff0c;东西在那个抽屉不清楚&#xff0c;现在要将其找到&#xff0c;广度优先遍历…

【第十二周】李宏毅机器学习笔记10:生成式对抗网络2

目录 摘要Abstract1.GAN is Still Challenging2.Evaluation of Generation2.1 Mode Collapse2.2.Mode Dropping2.3.Diversity 3.Conditional GAN4.Learning from Unpaired Data总结 摘要 本周主要学习了上周关于生成式对抗网络的剩余知识&#xff0c;了解了为什么 GAN 难以训练…

2024全球超模大赛(北京|山东|内蒙三城联动)顺利举办

近日&#xff0c;2024 全球超模大赛&#xff08;北京|山东|内蒙&#xff09;三城联动暨新国潮文化赛事主题发布会在紫薇美力集团国贸鲁采赋盛大举行。此次发布会旨在鼓励优质模特共同传播中国传统文化&#xff0c;让其在全球范围内绽放光彩&#xff0c;展现中国人的骄傲与风采&…