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

发布时间:2026/9/24 19:31:53

心脏病预测机器学习实战: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:53

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

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

2026/9/24 19:31:53

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

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

2026/9/24 19:31:53

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

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

2026/9/24 20:36:59

Flask+SQLite初始化避坑指南:从路径问题到迁移实战

1. 为什么Flask sqlite的初始化总是先踩坑但凡用Flask做过一点正经项目,十有八九在数据库初始化这一步卡过壳。不是no such table,就是table already exists,再或者更隐蔽的——本地跑得好好的,部署到服务器上就崩溃,…

2026/9/24 20:36:59

Element UI 表格固定表头全攻略:height、max-height 与 sticky 实战

做后台管理系统的前端,绕不开一张表格。Element UI 的el-table我用了好几年,被问得最多的问题不是“这个表格怎么渲染数据”,而是:数据一多,表格一长,表头跟着页面滚走了,根本分不清哪一列是哪一…

2026/9/24 20:36:59

SSM+JSP农场供销系统实战:从部署到交付的全链路指南

简介:本资源是一套基于Java SSM框架与JSP技术实现的农场供销一体化系统完整源码,面向Java初学者、Web开发入门者及农业信息化项目实践者,解决农产品信息管理、会员订购、分类维护与配送协同等实际业务场景问题。压缩包为ZIP格式,大…

2026/9/24 20:36:59

Element UI 表格固定表头:原理、高度策略与避坑实战

你是不是也遇到过这种问题:一个满屏数据的表格,页面一滚起来,表头跟着内容跑了。数据一多,根本分不清哪列对应哪个字段,尤其是几十个字段的后台管理页面,下拉滚动几下就直接看花眼。其实在 Element UI 里&a…

2026/9/24 20:31:59

大模型多Agent协作架构实战:核心能力与任务调度指南

看到“大模型多Agent核心能力”这个标题,我第一反应是:圈里终于开始认真讨论这个方向了。这两年大模型应用爆发,单Agent的Demo到处都是,但真到了复杂的生产级任务面前,单个Agent的上下文窗口、工具调用能力和决策深度迟…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

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

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

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码