基于python心脏病分类模型构建实践

一、引言 在医疗大数据浪潮席卷下,机器学习正深度融入疾病诊断领域,成为破解复杂医疗数据、辅助精准诊断的关键力量。心脏病作为全球健康的“头号杀手”,其早期精准识别对挽救生命意义重大。本文聚焦医疗数据集,以Python为工具,全方位呈现心脏病诊断分类模型构建全流程——从原始数据清洗打磨,到模型构建评估,力求为医疗数据分析与智能诊断落地,提供清晰可循的实践路径,助力挖掘数据背后的疾病诊疗价值。 二、环境准备与数据读取 (一)库导入:搭建分析“工具箱” 机器学习实践,离不开高效工具库支撑。我们导入 pandas 作为数据处理“基石”,用 numpy 夯实数值计算基础; matplotlib 与 seaborn (虽本文未显式调用 seaborn ,但其在可视化场景中常作补充 )构建可视化“窗口”,直观呈现数据特征; scikit-learn 覆盖数据预处理、模型构建到评估全环节,是机器学习核心“武器”; xgboost 则以高性能梯度提升,为模型精度“加码”。同时,通过设置忽略警告、配置中文显示,扫清实践障碍: python import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import scipy.stats as stats from scipy.stats import chi2_contingency from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier from sklearn.metrics import classification_report, confusion_matrix, roc_curve, auc import warnings warnings.filterwarnings('ignore') # 屏蔽干扰警告,聚焦核心分析 plt.rcParams['font.sans-serif'] = 'SimHei' # 让图表中文清晰显示 plt.rcParams['axes.unicode_minus'] = False # 修复负号显示异常问题   (二)数据读取:开启医疗数据“探秘” 借助 pandas 读取 Medicaldataset.csv 数据集,通过 head() 快速浏览数据概貌,初步认知字段构成—— Age (年龄)、 Gender (性别)等特征,搭配目标变量 Result (诊断结果, positive / negative 标识患病与否 ),为后续分析锚定方向: python data = pd.read_csv('Medicaldataset.csv') data.head() # 一瞥数据结构,把握分析起点   三、数据预处理:为模型筑牢“地基” (一)数据基本信息查看:洞察数据“原生态” 调用 info() 方法,深度扫描数据——列名、非空值数量、数据类型清晰呈现。本数据集无空缺值,为后续处理省去插值等繁琐操作, int64 、 float64 、 object 等类型有序分布,确保分析流程顺畅推进: python data.info() # 摸清数据“家底”,规划处理路径   (二)重复值处理:守护数据“纯净度” 数据重复会干扰模型学习,通过 duplicated().sum() 排查,本数据集幸运“无重复”,但通用流程不能少——若存在重复, drop_duplicates() 一键净化,保障数据唯一性: python data.duplicated().sum() # 排查重复“隐患” data = data.drop_duplicates() # 净化数据,留存唯一   (三)异常值检测与处理:雕琢数据“精度” 为特征创建中文映射 feature_map ,让箱线图解读更直观。绘制箱线图,心率、血压等特征的极端异常值“原形毕露”。结合医疗常识,精准“手术刀”处理:删除心率>1000、收缩压140的离谱记录;发现舒张压>收缩压的“乌龙”数据,果断调换修正,让数据贴合医疗逻辑: python feature_map = { 'Age': '年龄', 'Gender': '性别', 'Heart rate': '心率', 'Systolic blood pressure': '收缩压', 'Diastolic blood pressure': '舒张压', 'Blood sugar': '血糖', 'CK-MB': '肌酸激酶同工酶', 'Troponin': '肌钙蛋白', 'Result': '诊断结果' } plt.figure(figsize=(20, 15)) for i, (col, col_name) in enumerate(feature_map.items(), 1): plt.subplot(3, 3, i) plt.boxplot(data[col]) plt.title(f'{col_name}的箱线图', fontsize=14) plt.ylabel('数值', fontsize=12) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show() # 可视化异常,精准定位问题 print(f'处理前数据量: {len(data)}') data = data[data['Heart rate'] = 50] data = data[data['Diastolic blood pressure'] data['Systolic blood pressure']] print(f'发现舒张压大于收缩压的记录数: {len(wrong_bloodpressure)}') wrong_bloodpressure_index = wrong_bloodpressure.index data.loc[wrong_bloodpressure_index, ['Systolic blood pressure', 'Diastolic blood pressure']] = data.loc[wrong_bloodpressure_index, ['Diastolic blood pressure', 'Systolic blood pressure']].values # 修正数据逻辑错误   四、数据分析与可视化:挖掘数据“隐藏密码” (一)描述性统计分析:勾勒数据“轮廓”  describe().T 横向展开数据统计画卷——均值、标准差、最值等指标,清晰呈现患者年龄、心率、血压等分布特征。年龄均值约56岁、心率均值约76次/分钟等信息,为理解患者群体基线水平提供依据: python data.describe().T # 一键获取数据统计“全景图”   (二)单特征分布可视化:洞察特征“规律” 以年龄、性别为例,绘制核密度图+直方图、饼图,多维呈现数据分布。年龄核密度图勾勒分布形态,直方图量化区间人数;性别饼图直观展现男女占比,让特征分布“可视化、可解读”,为后续关联分析铺陈: python # 患者年龄分布:核密度+直方图,双视角洞察 plt.figure(figsize=(20, 15)) plt.subplot(3, 3, 1) data['Age'].plot(kind='kde', color='red', label='核密度图') data['Age'].plot(kind='hist', bins=12, secondary_y=True) plt.title('患者年龄分布') plt.xlabel('年龄(岁)') plt.ylabel('人数') plt.grid(axis='y', linestyle='--') # 患者性别分布:饼图直观呈现占比 plt.subplot(3, 3, 2) gender_counts = data['Gender'].value_counts() plt.pie(gender_counts, labels=['男', '女'], autopct='%1.1f%%', startangle=75, colors=['#66b3ff', '#ff9999']) plt.title('患者性别分布') plt.axis('equal') # 让饼图更规整   同理,心率、血压等特征可依此可视化,全面掌握数据分布脉络。 (三)特征与诊断结果关联分析:挖掘疾病“关联因子” 通过箱线图、饼图,深度剖析特征与诊断结果( positive 患病/ negative 未患病 )的关联。年龄箱线图对比患病与未患病群体年龄分布差异;性别饼图聚焦患病群体男女占比,为挖掘疾病影响因素提供线索。延伸分析心率、血压、 CK-MB 、 Troponin 等与诊断结果的关联,层层剥茧,探寻疾病潜在规律: python # 年龄与诊断结果:箱线图对比分布差异 plt.subplot(3, 3, 1) positive_ages = data[data['Result'] == 'positive']['Age'] negative_ages = data[data['Result'] == 'negative']['Age'] plt.boxplot([positive_ages, negative_ages], labels=['Positive', 'Negative']) plt.title('年龄与心脏病诊断结果的关系') plt.ylabel('年龄') # 性别与诊断结果:饼图聚焦患病群体占比 plt.subplot(3, 3, 2) positive_data = data.loc[data['Result'] == 'positive'] gender_positive_counts = positive_data['Gender'].value_counts() plt.pie(gender_positive_counts, labels=['男', '女'], autopct='%1.1f%%', startangle=75, colors=['#66b3ff', '#ff9999']) plt.title('性别与心脏病诊断结果的关系')   五、分类模型构建与预测:开启智能诊断“新篇” (一)数据转换与划分:为模型“备粮” 将目标变量 Result 转换为0-1( positive →1, negative →0 ),明确特征( Gender 、 Age 等 )与目标变量。对连续变量标准化,消除量纲影响;按8:2划分训练集、测试集,保障模型训练与评估科学有效: python # 目标变量二值化,适配模型输入 data['Result_Binary'] = (data['Result'] == 'positive').astype(int) # 定义特征与目标变量,锁定分析维度 features = ['Gender', 'Age', 'CK-MB', 'Troponin'] X = data[features].copy() y = data['Result_Binary'] # 连续变量标准化,让模型“公平”学习 continuous_vars = ['Age', 'CK-MB', 'Troponin'] X[continuous_vars] = X[continuous_vars].astype(float) scaler = StandardScaler() X.loc[:, continuous_vars] = scaler.fit_transform(X[continuous_vars]) # 划分数据集,构建训练-测试闭环 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=15, stratify=y)   (二)模型评估函数定义:打造评估“标尺” 定义 evaluate_model 函数,封装模型训练、预测、评估全流程——输出分类报告(精确率、召回率等 ),绘制混淆矩阵(可视化分类正误 )、ROC曲线(衡量模型区分能力 ),让不同模型评估“标准化、自动化”: python def evaluate_model(model, model_name, X_train, X_test, y_train, y_test): # 模型训练:让模型“学习”数据规律 model.fit(X_train, y_train) # 预测:检验模型“学习成果” y_pred = model.predict(X_test) # 分类报告:量化评估指标 print(f'=== {model_name} 模型评估 ===') print(classification_report(y_test, y_pred)) # 混淆矩阵:可视化分类正误 cm = confusion_matrix(y_test, y_pred) plt.figure(figsize=(8, 6)) plt.imshow(cm, cmap='hot', interpolation='nearest') plt.colorbar() for i in range(2): for j in range(2): plt.text(j, i, f'{cm[i, j]:.2f}', ha='center', va='center', color='black') plt.title(f'{model_name}模型混淆矩阵') plt.show() # ROC曲线:评估模型区分能力 if hasattr(model, "predict_proba"): y_prob = model.predict_proba(X_test)[:, 1] else: y_prob = model.decision_function(X_test) if hasattr(model, "decision_function") else y_pred fpr, tpr, _ = roc_curve(y_test, y_prob) roc_auc = auc(fpr, tpr) plt.figure(figsize=(8, 6)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线(面积 = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') plt.xlabel('假阳性率') plt.ylabel('真阳性率') plt.title(f'{model_name}模型ROC曲线') plt.legend(loc='lower right') plt.show() return model, roc_auc   (三)不同模型构建与评估:角逐智能诊断“赛场” 1. 逻辑回归模型:作为线性模型“经典代表”,以简洁性、可解释性见长。 class_weight='balanced' 平衡样本,适配医疗数据类别不均场景,通过 evaluate_model 输出评估报告,展现线性分类能力: python lr_model = LogisticRegression(random_state=15, class_weight='balanced') lr_model, lr_auc = evaluate_model(lr_model, "逻辑回归", X_train, X_test, y_train, y_test)   2. 决策树模型:基于树结构“分段”分类,直观可解释。同样配置 class_weight ,平衡类别影响,在测试集检验其对非线性关系的捕捉能力: python dt_model = DecisionTreeClassifier(random_state=15, class_weight='balanced') dt_model, dt_auc = evaluate_model(dt_model, "决策树", X_train, X_test, y_train, y_test)   3. 随机森林模型:集成多棵决策树,以“集体智慧”提升泛化能力。通过随机采样、特征随机选择,降低过拟合风险,在医疗数据分类中常展现稳健性能: python rf_model = RandomForestClassifier(random_state=15, class_weight='balanced') rf_model, rf_auc = evaluate_model(rf_model, "随机森林", X_train, X_test, y_train, y_test)   4. XGBoost模型:梯度提升框架“佼佼者”,兼顾精度与效率。 scale_pos_weight 平衡样本权重,针对医疗数据优化,挖掘复杂特征关联,助力精准诊断: python xgb_model = XGBClassifier(random_state=15, scale_pos_weight=sum(y_train==0)/sum(y_train==1)) xgb_model, xgb_auc = evaluate_model(xgb_model, "XGBoost", X_train, X_test, y_train, y_test)   六、结果分析与总结:锚定智能诊断“方向” 对比逻辑回归、决策树、随机森林、XGBoost模型表现: - 随机森林、XGBoost:分类报告指标(精确率、召回率、F1-score )优异,混淆矩阵正确分类多,ROC曲线AUC高,展现强大的患病-未患病区分能力,适配医疗诊断对精度的高要求。 ​ - 逻辑回归:线性假设使其在简单关系中高效,但面对医疗数据复杂非线性,拟合能力受限,胜在模型简洁、可解释性强,适合初步分析或需解释特征影响场景。 ​ - 决策树:可解释性突出,便于挖掘特征重要性,但易过拟合,需精细调参(如限制树深度、设置样本划分阈值 ),在医疗场景中,若需解释诊断依据,是不错的选择。 本次实践完整贯通医疗数据预处理、分析、模型构建全流程,验证了机器学习在心脏病诊断中的应用潜力。不同模型各有适配场景,实际开发中,需结合数据特性(如特征复杂度、样本规模 )、资源(计算力、存储 )与需求(可解释性优先级 )择优选取,甚至尝试模型融合(如Stacking、Blending ),进一步突破性能瓶颈,为医疗智能诊断筑牢技术根基,让数据驱动的精准医疗触手可及。

本文围绕医疗大数据为背景,借助Python完整呈现心脏病诊断分类模型构建流程,为医疗智能诊断实践提供清晰路径。 一、核心流程回顾 1. 数据处理:从读取 Medicaldataset.csv 数据集起步,经 info() 确认数据质量(无空缺值 ), drop_duplicates() 保障唯一性;通过箱线图精准识别异常值,结合医疗知识删除极端记录、修正舒张压与收缩压逻辑错误,为模型筑牢数据基础。 ​ 2. 分析可视化:利用 describe().T 开展描述性统计,把握患者年龄、心率等指标分布;绘制核密度图、直方图、饼图等,直观呈现单特征分布;借箱线图、饼图剖析特征与诊断结果关联,挖掘疾病潜在影响因素。 ​ 3. 模型构建评估:转换目标变量、标准化连续特征、划分训练测试集后,定义 evaluate_model 函数封装训练、预测、评估流程;构建逻辑回归、决策树、随机森林、XGBoost模型,对比发现随机森林与XGBoost在分类精度、区分能力上表现更优,逻辑回归简洁可解释,决策树易过拟合但可解释性强。 二、实践价值与启示 该实践验证机器学习在医疗诊断的应用潜力,不同模型适配场景各异:数据简单、需强解释性选逻辑回归;需挖掘特征重要性、可接受一定过拟合风险用决策树;追求泛化能力、精度优先则选随机森林或XGBoost 。实际开发可依数据特性(复杂度、规模 )、资源(计算力 )与需求(可解释性优先级 )择取模型,或尝试融合(如Stacking )突破性能瓶颈,助力数据驱动的精准医疗落地,为医疗智能诊断技术发展与应用提供实操参考,推动医疗数据分析从理论探索迈向实际效能提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值