机器学习项目二:帕金森病检测

news2025/4/16 19:54:54

目录

下载数据

一、导入相关包

二、数据加载

 三、特征工程

 四、构建模型

 五、评估与可视化

六、程序流程

 七、完整代码



一、导入相关包

# 导入库部分
import numpy as np  # 数值计算基础库
import pandas as pd  # 数据处理库
from sklearn.preprocessing import MinMaxScaler  # 数据标准化
from xgboost import XGBClassifier  # XGBoost分类器
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold  # 数据分割和超参数优化
from sklearn.metrics import (accuracy_score, classification_report, 
                           confusion_matrix, roc_auc_score)  # 评估指标
import matplotlib.pyplot as plt  # 可视化
import seaborn as sns  # 高级可视化
import joblib  # 模型持久化
from datetime import datetime  # 时间戳生成

二、数据加载

def load_data(path):
    """加载并预处理数据"""
    df = pd.read_csv(path)  # 读取CSV文件
    
    # 数据质量断言检查
    assert 'status' in df.columns, "数据必须包含status列"
    
    # 打印关键统计信息(调试用)
    print(f"数据分布:\n{df['status'].value_counts()}")
    print(f"\n缺失值统计:\n{df.isnull().sum()}")
    
    # 用中位数填充缺失值(比均值更抗异常值)
    df = df.fillna(df.median())
    return df

 三、特征工程

def feature_engineering(df):
    """特征处理"""
    # 移除标签列和无关列(患者姓名)
    features = df.drop(['status', 'name'], axis=1)  
    labels = df['status'].values
    
    # MinMax标准化到[-1,1]范围
    scaler = MinMaxScaler(feature_range=(-1, 1))
    features_scaled = scaler.fit_transform(features)
    
    return features_scaled, labels, scaler  # 返回scaler对象用于后续推理

 四、构建模型

def optimize_model(X_train, y_train):
    """使用网格搜索优化XGBoost"""
    
    # 扩展的参数网格(基于文献和实验)
    param_grid = {
        'learning_rate': [0.01, 0.05, 0.1],  # 更精细的学习率设置
        'max_depth': [3, 5, 7],  # 树深度范围
        'min_child_weight': [1, 3],  # 子节点最小权重
        'gamma': [0, 0.1],  # 分裂最小损失下降
        'subsample': [0.7, 0.9],  # 样本采样比例
        'colsample_bytree': [0.7, 0.9],  # 特征采样比例
        'reg_alpha': [0, 0.1],  # L1正则化
        'reg_lambda': [0.1, 1],  # L2正则化
        'n_estimators': [100, 200]  # 树的数量
    }
    
    # 分层K折交叉验证(保持类别分布)
    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
    
    # 配置基准模型(带早停机制)
    base_model = XGBClassifier(
        objective='binary:logistic',
        eval_metric='logloss',  # 使用对数损失
        early_stopping_rounds=10,  # 早停轮数
        random_state=39
    )
    
    # 网格搜索配置
    grid_search = GridSearchCV(
        estimator=base_model,
        param_grid=param_grid,
        cv=cv,
        scoring='roc_auc',  # 使用AUC作为优化目标
        n_jobs=-1,  # 使用所有CPU核心
        verbose=1  # 打印进度
    )
    
    grid_search.fit(X_train, y_train)
    return grid_search.best_estimator_, grid_search.best_params_

 五、评估与可视化

def evaluate_model(model, X_test, y_test):
    """模型评估与结果可视化"""
    # 生成预测结果
    y_pred = model.predict(X_test)
    y_proba = model.predict_proba(X_test)[:, 1]  # 获取正类概率
    
    # 打印分类报告
    print("\n分类报告:")
    print(classification_report(y_test, y_pred))
    
    # 输出AUC分数
    print(f"\nAUC分数: {roc_auc_score(y_test, y_proba):.4f}")
    
    # 混淆矩阵热力图
    plt.figure(figsize=(6,4))
    cm = confusion_matrix(y_test, y_pred)
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
               xticklabels=['健康', '患病'],
               yticklabels=['健康', '患病'])
    plt.title('混淆矩阵')
    plt.show()
    
    # 特征重要性可视化
    plt.figure(figsize=(10, 6))
    feat_imp = pd.Series(model.feature_importances_, 
                        index=df.drop(['status', 'name'], axis=1).columns)
    feat_imp.nlargest(15).plot(kind='barh')
    plt.title('Top 15特征重要性')
    plt.tight_layout()
    plt.show()

六、程序流程

# 主程序流程
if __name__ == "__main__":
    # 数据加载
    df = load_data('./data/parkinsons.data')
    
    # 特征工程
    X, y, scaler = feature_engineering(df)
    
    # 数据分割(分层抽样)
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, 
        test_size=0.2, 
        stratify=y,  # 保持类别比例
        random_state=39
    )
    
    # 模型优化
    print("\n开始参数优化...")
    best_model, best_params = optimize_model(X_train, y_train)
    print(f"\n最佳参数: {best_params}")
    
    # 模型评估
    evaluate_model(best_model, X_test, y_test)
    
    # 模型保存(带时间戳)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M")
    model_path = f"parkinson_model_v{timestamp}.pkl"
    joblib.dump({'model': best_model, 'scaler': scaler}, model_path)
    print(f"\n模型已保存到: {model_path}")

 七、完整代码

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_auc_score
import matplotlib.pyplot as plt
import seaborn as sns
import joblib
from datetime import datetime


# 1. 数据加载与预处理
def load_data(path):
    """加载并预处理数据"""
    df = pd.read_csv(path)

    # 数据质量检查
    assert 'status' in df.columns, "数据必须包含status列"
    print(f"数据分布:\n{df['status'].value_counts()}")
    print(f"\n缺失值统计:\n{df.isnull().sum()}")

    # 识别数值列和非数值列
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    non_numeric_cols = df.select_dtypes(exclude=[np.number]).columns
    
    print(f"\n数值列: {list(numeric_cols)}")
    print(f"非数值列: {list(non_numeric_cols)}")
    
    # 仅对数值列填充中位数
    df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())
    
    return df


# 2. 特征工程
def feature_engineering(df):
    """特征处理"""
    # 分离特征和标签
    features = df.drop(['status', 'name'], axis=1)  # 移除无关列
    labels = df['status'].values

    # 数据标准化
    scaler = MinMaxScaler(feature_range=(-1, 1))
    features_scaled = scaler.fit_transform(features)

    return features_scaled, labels, scaler


# 3. 模型优化
def optimize_model(X_train, y_train):
    """使用网格搜索优化XGBoost"""

    # 改进的参数网格(基于文献和实验)
    param_grid = {
        'learning_rate': [0.01, 0.05, 0.1],  # 更精细的学习率
        'max_depth': [3, 5, 7],
        'min_child_weight': [1, 3],
        'gamma': [0, 0.1],  # 添加gamma参数控制分裂
        'subsample': [0.7, 0.9],
        'colsample_bytree': [0.7, 0.9],
        'reg_alpha': [0, 0.1],
        'reg_lambda': [0.1, 1],
        'n_estimators': [100, 200]
    }

    # 改进的交叉验证策略(分层K折)
    cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

    # 使用早停的基准模型
    base_model = XGBClassifier(
        objective='binary:logistic',
        eval_metric='logloss',
        early_stopping_rounds=10,
        random_state=39
    )

    # 网格搜索配置
    grid_search = GridSearchCV(
        estimator=base_model,
        param_grid=param_grid,
        cv=cv,
        scoring='roc_auc',  # 使用AUC作为评估指标
        n_jobs=-1,
        verbose=1
    )

    grid_search.fit(X_train, y_train)
    return grid_search.best_estimator_, grid_search.best_params_


# 4. 评估与可视化
def evaluate_model(model, X_test, y_test):
    """模型评估与结果可视化"""
    y_pred = model.predict(X_test)
    y_proba = model.predict_proba(X_test)[:, 1]

    print("\n分类报告:")
    print(classification_report(y_test, y_pred))

    print(f"\nAUC分数: {roc_auc_score(y_test, y_proba):.4f}")

    # 混淆矩阵可视化
    cm = confusion_matrix(y_test, y_pred)
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
    plt.title('混淆矩阵')
    plt.show()

    # 特征重要性
    plt.figure(figsize=(10, 6))
    feat_imp = pd.Series(model.feature_importances_,
                         index=df.drop(['status', 'name'], axis=1).columns)
    feat_imp.nlargest(15).plot(kind='barh')
    plt.title('Top 15特征重要性')
    plt.show()


# 主流程
if __name__ == "__main__":
    # 数据加载
    df = load_data('data/parkinsons.csv')

    # 特征工程
    X, y, scaler = feature_engineering(df)

    # 数据分割(分层抽样)
    X_train, X_test, y_train, y_test = train_test_split(
        X, y,
        test_size=0.2,
        stratify=y,
        random_state=39
    )

    # 模型优化
    print("\n开始参数优化...")
    best_model, best_params = optimize_model(X_train, y_train)
    print(f"\n最佳参数: {best_params}")

    # 模型评估
    evaluate_model(best_model, X_test, y_test)

    # 模型保存(带时间戳)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M")
    model_path = f"parkinson_model_v{timestamp}.pkl"
    joblib.dump({'model': best_model, 'scaler': scaler}, model_path)
    print(f"\n模型已保存到: {model_path}")

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

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

相关文章

五笔输入法学习的抉择:86版 or 98版?(一场关于效率与传承的思辨)

新开直接98,纯粹高开;老版过渡艰辛自知😋。 笔记模板由python脚本于2025-04-14 19:22:22创建,本篇笔记适合喜好汉字衷情母语的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,…

为您的 Web 应用选择最佳文档阅读器

为显示选择合适的文档查看器是开发 Web 应用过程中至关重要的一步。文档查看器应能在提供功能性的同时,确保用户体验的流畅性。 开发人员必须评估多种因素,以确保效率、性能和兼容性。本文将帮助您了解影响用户文档浏览体验成功与否的关键指标。 渲染质…

微服务之protobuf:下载、语法和使用一站式教程

基本介绍 Protobuf全称 Protocol Buffer,是 Google 公司于2008年开源的一种语言无关、平台无关、可扩展的用于序列化结构化数据——类似于XML,但比XML更小、更快、更简单,它可用于(数据)通信协议、数据存储等。你只需…

Ollama调用多GPU实现负载均衡

文章目录 📊 背景说明🛠️ 修改 systemd 服务配置1. 配置文件路径2. 编辑服务文件2. 重新加载配置并重启服务3. 验证配置是否成功 📈 应用效果示例1. 调用单个70b模型2. 调用多个模型(70b和32b模型) 总结📌…

WebRTC实时通话EasyRTC嵌入式音视频通信SDK,构建智慧医疗远程会诊高效方案

一、方案背景 当前医疗领域,医疗资源分布不均问题尤为突出,大城市和发达地区优质医疗资源集中,偏远地区医疗设施陈旧、人才稀缺,患者难以获得高质量的医疗服务,制约医疗事业均衡发展。 EasyRTC技术基于WebRTC等先进技…

AIoT 智变浪潮演讲实录 | 刘浩然:让硬件会思考:边缘大模型网关助力硬件智能革新

4 月 2 日,由火山引擎与英特尔联合主办的 AIoT “智变浪潮”技术沙龙在深圳成功举行,活动聚焦 AI 硬件产业的技术落地与生态协同,吸引了芯片厂商、技术方案商、品牌方及投资机构代表等 700 多位嘉宾参会。 会上,火山引擎边缘智能高…

【Windows】系统安全移除移动存储设备指南:告别「设备被占用」弹窗

Windows系统安全移除移动存储设备指南:告别「设备被占用」弹窗 解决移动硬盘和U盘正在被占用无法弹出 一、问题背景 使用Windows系统时,经常遇到移动硬盘/U盘弹出失败提示「设备正在使用中」,即使已关闭所有可见程序。本文将系统梳理已验证…

ArmSoM Sige5 CM5:RK3576 上 Ultralytics YOLOv11 边缘计算新标杆

在计算机视觉技术加速落地的今天,ArmSoM 正式宣布其基于 ​​Rockchip RK3576​​ 的旗舰产品 ​​Sige5 开发板​​ 和 ​​CM5 核心板​​ 全面支持 Ultralytics YOLOv11 模型的 RKNN 部署。这一突破标志着边缘计算领域迎来新一代高性能、低功耗的 AI 解决方案&am…

【ubuntu】linux开机自启动

目录 开机自启动: /etc/rc.loacl system V 使用/etc/rc*.d/系统运行优先级 遇到的问题: 1. Linux 系统启动阶段概述 方法1:/etc/rc5.d/ 脚本延时日志 方法二:使用 udev 规则来触发脚本执行 开机自启动: /etc/…

操作系统导论——第19章 分页:快速地址转换(TLB)

使用分页作为核心机制来实现虚拟内存,可能会带来较高的性能开销。使用分页,就要将内存地址空间切分成大量固定大小的单元(页),并且需要记录这些单元的地址映射信息。因为这些映射信息一般存储在物理内存中,…

计算机网络:流量控制与可靠传输机制

目录 基本概念 流量控制:别噎着啦! 可靠传输:快递必达服务 传输差错:现实中的意外 滑动窗口 基本概念 换句话说:批量发货排队验收 停止-等待协议 SW(发1份等1份) 超时重传:…

架构生命周期(高软57)

系列文章目录 架构生命周期 文章目录 系列文章目录前言一、软件架构是什么?二、软件架构的内容三、软件设计阶段四、构件总结 前言 本节讲明架构设计的架构生命周期概念。 一、软件架构是什么? 二、软件架构的内容 三、软件设计阶段 四、构件 总结 就…

JMeter使用

1.简介 1.1 打开方式 ①点击bat,打开 ②添加JMeter系统环境变量,输⼊命令jmeter即可启动JMeter⼯具 1.2 配置 简体中文 放大字体 1.3 使用 ①添加线程组 ②创建http请求 2. 组件 2.1 线程组 控制JMeter将⽤于执⾏测试的线程数,也可以把⼀个线程理解为⼀个测…

Ant Design Vue 表格复杂数据合并单元格

Ant Design Vue 表格复杂数据合并单元格 官方合并效果 官方示例 表头只支持列合并&#xff0c;使用 column 里的 colSpan 进行设置。 表格支持行/列合并&#xff0c;使用 render 里的单元格属性 colSpan 或者 rowSpan 设值为 0 时&#xff0c;设置的表格不会渲染。 <temp…

ECharts 如何实现柱状图悬停时,整个背景区域均可触发点击事件

1. 前言 ECharts 柱状图的点击事件默认仅响应柱子本身的点击&#xff0c;本文旨在实现整个背景区域均可触发点击事件 2. 实现思路 核心&#xff1a;全局监听 坐标判断 数据转换 通过 getZr() 监听整个画布点击&#xff0c;结合像素坐标判断是否在图表区域内‌通过 containPi…

金融简单介绍及金融诈骗防范

在当今社会&#xff0c;金融学如同一股无形却强大的力量&#xff0c;深刻影响着我们生活的方方面面。无论是个人的日常收支、投资理财&#xff0c;还是国家的宏观经济调控&#xff0c;都与金融学紧密相连。​ 一、金融学的概念​ 金融学&#xff0c;简单来说&#xff0c;是研…

cursor+高德MCP:制作一份旅游攻略

高德开放平台 | 高德地图API (amap.com) 1.注册成为开发者 2.进入控制台选择应用管理----->我的应用 3.新建应用 4.点击添加Key 5.在高德开发平台找到MCP的文档 6.按照快速接入的步骤&#xff0c;进行操作 一定要按照最新版的cursor, 如果之前已经安装旧的版本卸载掉重新安…

Kubernetes控制平面组件:API Server Webhook 授权机制 详解

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

【Python爬虫】简单案例介绍2

本文继续接着我的上一篇博客【Python爬虫】简单案例介绍1-CSDN博客 目录 跨页 3.2 环境准备 跨页 当对单个页面的结构有了清晰的认识并成功提取数据后&#xff0c;接下来就需要考虑页面之间的跨页问题。此时我们便迎来了下一个关键任务&#xff1a;如何实现跨页爬取&#xf…

【神经网络】python实现神经网络(四)——误差反向传播的基础理论

一.反向传播 本章将介绍能够高效计算权重参数的梯度的方法——误差反向传播法,这里简单介绍一下什么是反向传播,加入有个函数y = f(x),那么它的反向传播为图下这个样子: 反向传播的计算顺序是,将输入信号E乘以节点的局部导数,然后将结果传递给下一个节点。这里所…