首页/新闻资讯/正文详情

心脏病预测机器学习实战:11个脚本从数据清洗到XGBoost调参

发布时间:2026/9/24 19:31:50 来源:云帆数科 栏目:资讯中心
心脏病预测机器学习实战:11个脚本从数据清洗到XGBoost调参
简介这份资源面向机器学习入门与进阶学习者提供一套完整的心脏病数据集分析与预测实战案例帮助读者掌握从数据清洗、特征工程到多模型对比的完整流程。包内共14个文件以11个Python源代码为主另含2个CSV数据集和1个说明文档压缩包约46KB代码手工整理、无语法错误可直接运行。案例覆盖逻辑回归、KNN、高斯朴素贝叶斯、决策树、SVM、随机森林、XGBoost、MLP等多种分类模型并涉及MinMaxScaler、StandardScaler、KNNImputer、ColumnTransformer、Pipeline等预处理工具同时包含混淆矩阵、分类报告、ROC曲线、AUC、学习曲线、排列重要性等评估与可视化手段还借助seaborn、dtreeviz及pandas绘图呈现数据分布与模型解释。已有98人学习适合希望系统练习分类建模、模型评估与调参思路的读者参考借鉴。1. 心脏病预测这套源码包为什么我建议先跑通再谈调参心脏病预测是机器学习入门里少有的「数据干净、标签明确、模型可解释」的练手场景但真正动手时多数人卡在第一步数据从哪来、特征怎么对齐、11 个脚本先跑哪个。这份资源把 raw_merged_heart_dataset.csv 和 cleaned_merged_heart_dataset.csv 两个版本的数据集连同 11 个 Python 脚本一起打包覆盖了从探索性分析到 LogisticRegression、KNN、GaussianNB、DecisionTree、SVC、RandomForest、XGBoost、MLPClassifier 的完整链路还带了 SVR 做回归视角的尝试。它适合两类人刚学完 sklearn 想找一个能跑通的端到端项目的新手以及想对比不同分类器在同一份医学数据上表现的从业者。下面我按「先看清数据、再跑通基线、最后避坑」的顺序拆一遍。2. 数据与脚本结构先搞清 raw 和 cleaned 的差别2.1 两个 CSV 到底差在哪拿到压缩包解压后根目录下是 11 个 .py 文件和 data 文件夹data 里放着 raw_merged_heart_dataset.csv 与 cleaned_merged_heart_dataset.csv。raw 版本是多个来源合并后的原始表常见问题是列名不统一、存在缺失值、部分数值列被当成 object 读入cleaned 版本已经做过缺失值填充和类型转换可以直接喂给 sklearn。我一般先用 pandas 把两个文件各读一遍对比 shape、dtypes 和缺失值分布确认 cleaned 版本没有把标签列误处理。import pandas as pd raw pd.read_csv(data/raw_merged_heart_dataset.csv) cleaned pd.read_csv(data/cleaned_merged_heart_dataset.csv) print(raw shape:, raw.shape) print(cleaned shape:, cleaned.shape) print(raw dtypes:\n, raw.dtypes.value_counts()) print(cleaned dtypes:\n, cleaned.dtypes.value_counts()) print(raw missing:\n, raw.isnull().sum()[raw.isnull().sum() 0]) print(cleaned missing:\n, cleaned.isnull().sum()[cleaned.isnull().sum() 0])这段代码的作用是先建立「数据体检」习惯。shape 告诉你样本量和特征数dtypes 的 value_counts 能一眼看出有多少列是 object 类型——如果 raw 里数值列出现 object说明有非数字字符混入直接 fit 会报错。isnull 只打印有缺失的列避免输出刷屏。参数上没有什么可调的但要注意 read_csv 默认把空字符串当 NaN如果原始数据用「?」表示缺失需要加 na_values?。2.2 11 个脚本的职责划分从文件名能看出作者是按「分析 → 建模 → 可视化」三条线组织的。1 号脚本做 ML 模型总览2 号到 8 号分别对应 F1、可视化建模、SVR、分析、预测、RandomForest、数据科学探索9 到 11 号覆盖 MLP、DT 和 raw 数据集预测。readme.txt 里通常写了运行顺序但我的习惯是不按编号跑而是先跑 3-Heart attack analysis.py 做 EDA再跑 1 号建立基线最后用 7 号和 10 号做树模型对比。# 建议的首次运行顺序 python 3-Heart\ attack\ analysis.py python 1-Heart\ Risk\ Disease\ Prediction\ Using\ ML\ Models.py python 7-Heart\ Attack\ Prediction\ RandomForestClassifier.py python 10-Heart\ Attack\ Prediction\ Using\ DT\ Classifier.py这样排的原因是EDA 脚本通常只做 describe、corr 和分布图不依赖模型1 号脚本一般会统一做 train_test_split 和标准化跑通它等于验证了数据管道树模型对缺失值和量纲不敏感适合在管道还没完全调好时先拿到一个可解释的基线。注意文件名里有空格bash 下要用反斜杠转义或加引号Windows 下直接拖进终端即可。2.3 标签列与特征列怎么确认医学数据集最容易翻车的地方是标签列名不统一有的叫 target有的叫 output有的叫 heart_disease。跑任何模型前先打印 columns 和标签的 value_counts确认是二分类还是多分类。如果 cleaned 版本已经把标签转成 0/1而 raw 版本还是字符串直接混用会导致 accuracy 计算报错。print(cleaned.columns.tolist()) label_col target # 根据实际列名修改 print(cleaned[label_col].value_counts()) print(cleaned[label_col].dtype)如果 value_counts 输出的是两个类别且比例接近 1:1说明数据相对平衡如果出现 4:1 以上的倾斜后续评估就不能只看 accuracy要补 precision、recall 和 f1。dtype 必须是 int 或 float如果是 object需要用 map 或 LabelEncoder 转一下。这一步花两分钟能省掉后面半小时的报错排查。3. 从 LogisticRegression 到 XGBoost基线怎么搭、参数怎么设3.1 统一的数据管道MinMaxScaler 还是 StandardScaler这份资源里同时出现了 MinMaxScaler、StandardScaler、PowerTransformer 和 ColumnTransformer说明作者在不同脚本里试了不同预处理。我的建议是LogisticRegression、KNN、SVC、MLP 对量纲敏感必须做缩放DecisionTree、RandomForest、XGBoost 不需要。如果要用一个管道通吃优先 StandardScaler因为医学特征里常有年龄、血压、胆固醇这类量纲差异大的列StandardScaler 对异常值的容忍度比 MinMaxScaler 好。from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix X cleaned.drop(columns[label_col]) y cleaned[label_col] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) pipe Pipeline([ (scaler, StandardScaler()), (clf, LogisticRegression(max_iter1000, random_state42)) ]) pipe.fit(X_train, y_train) y_pred pipe.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))这里 stratifyy 是关键参数保证训练集和测试集的标签比例一致避免小样本下某一类全被分到测试集。max_iter1000 是因为 LogisticRegression 默认 100在特征多或未完全收敛时会报 ConvergenceWarning。Pipeline 的好处是 scaler 只在训练集上 fit不会把测试集的信息泄漏进训练过程——这是很多人手写缩放时最容易犯的错。3.2 KNN、NB、SVC 的参数边界KNeighborsClassifier 的核心参数是 n_neighbors默认 5。在几百条样本的医学数据上我一般从 3 试到 15用交叉验证选。GaussianNB 几乎没有可调参数适合做「极速基线」但它假设特征独立且服从正态分布医学特征里很多是离散的 0/1 或分级变量所以 NB 的准确率通常偏低不要用它下结论。SVC 在小样本上表现稳但必须设 probabilityTrue 才能输出 predict_proba否则 ROC 曲线画不了。from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC from sklearn.model_selection import cross_val_score models { KNN-3: KNeighborsClassifier(n_neighbors3), KNN-7: KNeighborsClassifier(n_neighbors7), NB: GaussianNB(), SVC-rbf: SVC(kernelrbf, probabilityTrue, random_state42) } for name, model in models.items(): pipe Pipeline([(scaler, StandardScaler()), (clf, model)]) scores cross_val_score(pipe, X, y, cv5, scoringf1) print(f{name}: f1{scores.mean():.4f} (/- {scores.std():.4f}))cross_val_score 的 cv5 表示 5 折交叉验证scoringf1 比 accuracy 更适合医学场景因为漏诊的代价通常高于误诊。scores.std() 告诉你模型稳不稳如果标准差超过 0.05说明结果对数据划分敏感需要检查是否有异常样本或标签噪声。3.3 树模型与 XGBoost 的调参重点RandomForestClassifier 先看 n_estimators 和 max_depth。n_estimators 从 100 起步加到 300 通常有提升但边际递减max_depth 不设时树会完全生长容易过拟合我一般从 5 开始试。XGBoost 的 learning_rate 和 n_estimators 要联动learning_rate0.1 时 n_estimators 可以设 200learning_rate0.01 时要加到 500 以上。资源里 7 号脚本用的是 RandomForest10 号用的是 DecisionTree可以拿这两个做对照。from sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier rf RandomForestClassifier( n_estimators200, max_depth6, min_samples_leaf3, random_state42, n_jobs-1 ) xgb XGBClassifier( n_estimators200, learning_rate0.1, max_depth4, use_label_encoderFalse, eval_metriclogloss, random_state42 ) for name, model in [(RF, rf), (XGB, xgb)]: model.fit(X_train, y_train) y_pred model.predict(X_test) print(name, classification_report(y_test, y_pred))min_samples_leaf3 是防止树把噪声当规律n_jobs-1 用满 CPU。XGBoost 的 use_label_encoderFalse 和 eval_metriclogloss 是新版本必须显式写的否则会出警告甚至报错。注意树模型不需要 StandardScaler如果前面套了 Pipeline把 scaler 那步去掉即可。3.4 MLPClassifier 的隐藏层与早停9 号脚本用 MLPClassifier这是资源里唯一一个神经网络方案。MLP 对学习率、隐藏层结构、迭代次数都敏感小数据集上很容易过拟合。我的常用配置是 hidden_layer_sizes(64, 32)alpha0.001 做 L2 正则early_stoppingTrue 让验证集分数不提升时自动停。from sklearn.neural_network import MLPClassifier mlp MLPClassifier( hidden_layer_sizes(64, 32), activationrelu, alpha0.001, learning_rate_init0.001, max_iter500, early_stoppingTrue, validation_fraction0.1, random_state42 ) pipe Pipeline([(scaler, StandardScaler()), (clf, mlp)]) pipe.fit(X_train, y_train) print(classification_report(y_test, pipe.predict(X_test)))early_stoppingTrue 会从训练集里切 10% 做验证validation_fraction 控制这个比例。alpha 是 L2 惩罚系数越大正则越强。如果训练集准确率远高于测试集先把 alpha 调大或减少隐藏层神经元。4. 避坑与排查11 个脚本跑下来最容易翻车的五处4.1 现象read_csv 报 ParserError 或列数不匹配原因通常是 CSV 里有未转义的逗号、引号或者分隔符不是逗号。医学数据里「备注」类字段容易出现这种情况。解决方法是先用 python 的 csv 模块 sniff 一下分隔符或者用 pandas 的 error_bad_lines 参数跳过坏行新版本用 on_bad_linesskip。df pd.read_csv(data/raw_merged_heart_dataset.csv, on_bad_linesskip)如果跳过行数超过总行数的 5%不要继续回去检查原始文件。4.2 现象StandardScaler 后模型准确率反而下降原因多半是先在全集上 fit 了 scaler再 train_test_split造成数据泄漏。正确顺序是先 split再在训练集上 fit_transform测试集只 transform。用 Pipeline 可以彻底避免这个问题因为 Pipeline 的 fit 只在训练数据上执行。4.3 现象SVC 训练极慢或内存溢出SVC 的时间复杂度是 O(n²) 到 O(n³)样本超过一万条就会明显变慢。这份数据集只有几百条正常不会卡但如果误把 raw 里未清洗的重复行合并进来导致样本膨胀就会出问题。先 df.drop_duplicates() 再去重确认样本量在合理范围。4.4 现象XGBoost 报 label must be in [0, num_class)原因是标签列不是从 0 开始的整数比如是 1/2 或字符串。解决方法是先做标签编码。from sklearn.preprocessing import LabelEncoder le LabelEncoder() y le.fit_transform(y)编码后打印 le.classes_ 确认映射关系避免 0/1 含义搞反。4.5 现象dtreeviz 可视化报 Graphviz 未安装dtreeviz 依赖系统级的 Graphviz不是 pip install 就能解决。Ubuntu 下 apt-get install graphvizmacOS 下 brew install graphvizWindows 下要下载安装包并手动加 PATH。装完在 Python 里 import graphviz 不报错才算通。如果只是想做决策树可视化sklearn 自带的 plot_tree 不需要额外依赖可以先用它替代。5. 用 learning_curve 和 permutation_importance 验证模型是否真的学到了东西跑完一轮模型accuracy 高不代表模型可靠。我习惯做两件事画 learning_curve 看训练集和验证集分数是否收敛用 permutation_importance 看哪些特征真正在起作用。learning_curve 能暴露过拟合和欠拟合如果训练分数高、验证分数低且两者不收敛就是过拟合如果两者都低且贴在一起就是欠拟合。permutation_importance 比树模型自带的 feature_importances_ 更通用因为它不依赖模型内部结构对所有分类器都适用。import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import learning_curve from sklearn.inspection import permutation_importance train_sizes, train_scores, val_scores learning_curve( pipe, X, y, cv5, scoringf1, train_sizesnp.linspace(0.1, 1.0, 8), n_jobs-1 ) plt.plot(train_sizes, train_scores.mean(axis1), labeltrain) plt.plot(train_sizes, val_scores.mean(axis1), labelvalidation) plt.xlabel(Training size) plt.ylabel(F1) plt.legend() plt.show() result permutation_importance( pipe, X_test, y_test, n_repeats10, random_state42, scoringf1 ) for i in np.argsort(result.importances_mean)[::-1][:5]: print(f{X.columns[i]}: {result.importances_mean[i]:.4f})learning_curve 的 train_sizes 用 linspace 从 10% 到 100% 取 8 个点n_jobs-1 并行加速。permutation_importance 的 n_repeats10 表示每个特征随机打乱 10 次取平均次数越多越稳但越慢。输出按重要性降序排列如果前几个特征的重要性接近 0说明模型可能靠噪声在拟合需要回去检查特征工程。还有一个容易被忽略的点这份资源里同时有 SVR 和 LinearRegression说明作者也试过回归视角。如果标签是 0/1用回归模型预测出来的连续值需要设阈值转成类别阈值不能默认 0.5要用 ROC 曲线找最佳截断点。具体做法是画 roc_curve 拿到 fpr、tpr、thresholds取 tpr - fpr 最大的那个阈值。从那以后我每次拿到新的医学数据集都强制先跑一遍 learning_curve 和 permutation_importance确认模型不是靠运气。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

基于销量可视化的手机价位段智能选型平台
基于销量可视化的手机价位段智能选型平台

开头做手机选品或者门店铺货的朋友,应该都有过这种纠结:同一批预算,到底是多进几台千元机走量,还是押两三部旗舰机赚毛利?以前大家基本靠经验和感觉,但感觉这东西在行情波动面前特别不靠谱。我去年接手了一… · 2026/9/24 19:31:50

东华OJ刷题复盘:从TLE到AC,避开多组输入与边界陷阱
东华OJ刷题复盘:从TLE到AC,避开多组输入与边界陷阱

连着刷了三个晚上,东华OJ的基础练习终于推进到了第7到第9题。说实话,这三道题单独拎出来都不算难,但它们卡我的时间和心态,比后面那些看起来更复杂的题还要狠。第7题让我第一次在OJ上感受到“Time Limit Exceeded”的分量&#xf… · 2026/9/24 19:31:50

SAP选择性数据迁移实施商选型:2026年避坑指南
SAP选择性数据迁移实施商选型:2026年避坑指南

2026年,很多SAP老客户心里都装着一件事:ECC到底什么时候迁,怎么迁。而在这个大问题下面,真正让人头疼的其实是另一个更具体的问题——选择性数据迁移,到底该选哪家SAP实施商来干。先别急着谈价格、谈人天,我… · 2026/9/24 19:31:50

VASP中金属、半导体与绝缘体的电子结构判断及参数设置指南
VASP中金属、半导体与绝缘体的电子结构判断及参数设置指南

做计算材料有个绕不开的坎:拿到一个体系,你得先搞清楚它到底是金属、半导体还是绝缘体。这个判断不仅是物理课本上的考点,更直接决定你在 VASP 里怎么选展宽方法、怎么设置 K 点、怎么解释能带结果。我见过太多计算新人拿着一个自带金属性的体… · 2026/9/24 20:36:24

视觉项目开源数据集选型指南:目标检测、工业缺陷与图像分割
视觉项目开源数据集选型指南:目标检测、工业缺陷与图像分割

1. 为什么我花了两周时间整理这份开源数据集清单做视觉项目的人都有一个共同的痛点:模型结构调了半天,loss曲线看着也还行,但mAP就是上不去,最后排查一圈发现是数据集的问题——要么标注质量差,要么场景不匹配&#xf… · 2026/9/24 20:36:24

工业目标检测实战:从产线需求到模型部署的完整技术路线
工业目标检测实战:从产线需求到模型部署的完整技术路线

1. 工业目标检测到底在解决什么问题1.1 从一条产线说起:为什么通用检测模型到了车间就“水土不服”我第一次接触工业目标检测,是在一个做精密结构件的车间里。当时产线已经装好了工业相机和光源,硬件条件看着挺像样,但算法端一直跑… · 2026/9/24 20:36:24

STM32串口DMA通信库实战:空闲中断+环形缓冲解决丢帧
STM32串口DMA通信库实战:空闲中断+环形缓冲解决丢帧

做嵌入式开发的朋友应该都遇到过这种情况:主控芯片跑得好好的,一旦把串口波特率拉高、通信帧率提上来,系统就开始出现丢帧、卡顿、偶发死机。换了更快的晶振、优化了主循环逻辑,问题依旧。我之前用stm32f103标准库做UART DMA中断接… · 2026/9/24 20:36:24

MIT新型神经网络芯片功耗降低95%:存算一体与稀疏计算技术解析
MIT新型神经网络芯片功耗降低95%:存算一体与稀疏计算技术解析

1. 从一条热搜说起:MIT新型神经网络芯片到底解决了什么问题前几天刷技术社区,看到一条消息被反复讨论:MIT 的研究团队推出了一款新型神经网络芯片,宣称功耗降低 95%。评论区里有人兴奋,有人质疑,也有人直接… · 2026/9/24 20:36:24

AI Agent技能治理:从泛滥堆砌到精准调度的工程实践
AI Agent技能治理:从泛滥堆砌到精准调度的工程实践

1. 这不是技能堆砌,而是一场AI工程思维的重构“别再往 Skill 里塞一切”——这句话刚在内部技术分享会上抛出来时,会议室里有三秒安静。不是因为听不懂,而是因为太懂了:过去两年,我亲手参与搭建的7个AI Agent项目&… · 2026/9/24 20:36:17

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码