1. 项目概述
心血管疾病是全球范围内导致死亡的主要原因之一,每年造成约1790万人死亡。早期预测和诊断对于降低死亡率至关重要。这个项目基于Kaggle上的心脏病数据集,利用机器学习方法构建二元分类模型,预测患者是否存在心血管疾病风险。
数据集包含13个医学特征指标和1个目标变量,涵盖了患者的基本信息、体检数据和实验室检查结果。通过特征工程和多种机器学习算法的比较,我们最终选择了表现最优的模型,并实现了85.3%的准确率。
提示:心血管疾病预测模型的开发不仅需要技术能力,还需要对医学数据的深入理解。特征选择和模型解释在医疗领域尤为重要。
2. 数据准备与探索
2.1 数据集介绍
Kaggle上的心脏病数据集包含303个样本,每个样本有14个属性:
- 年龄(age)
- 性别(sex)
- 胸痛类型(cp)
- 静息血压(trestbps)
- 血清胆固醇(chol)
- 空腹血糖(fbs)
- 静息心电图结果(restecg)
- 最大心率(thalach)
- 运动诱发心绞痛(exang)
- ST段压低(oldpeak)
- ST段斜率(slope)
- 主要血管数量(ca)
- 地中海贫血(thal)
- 目标变量(target)
2.2 数据预处理
数据预处理是建模前的关键步骤,我们进行了以下处理:
- 缺失值处理:检查并填补缺失值
- 异常值检测:使用IQR方法识别和处理异常值
- 特征缩放:对数值型特征进行标准化
- 类别编码:对分类变量进行独热编码
% 数据标准化示例代码 data = readtable('heart.csv'); numericVars = {'age','trestbps','chol','thalach','oldpeak'}; data{:,numericVars} = normalize(data{:,numericVars});2.3 特征相关性分析
通过计算特征间的Pearson相关系数,我们发现:
- 最大心率(thalach)与目标变量呈负相关
- ST段压低(oldpeak)与目标变量呈正相关
- 年龄与目标变量相关性较弱
3. 模型构建与评估
3.1 算法选择与比较
我们测试了五种常见分类算法:
- 逻辑回归
- 支持向量机(SVM)
- 随机森林
- XGBoost
- 神经网络
每种算法都使用5折交叉验证进行评估,比较指标包括准确率、精确率、召回率和F1分数。
3.2 模型性能对比
| 算法 | 准确率 | 精确率 | 召回率 | F1分数 |
|---|---|---|---|---|
| 逻辑回归 | 0.812 | 0.803 | 0.824 | 0.813 |
| SVM | 0.832 | 0.821 | 0.843 | 0.832 |
| 随机森林 | 0.853 | 0.847 | 0.859 | 0.853 |
| XGBoost | 0.841 | 0.836 | 0.846 | 0.841 |
| 神经网络 | 0.826 | 0.818 | 0.834 | 0.826 |
随机森林表现最优,因此我们选择它作为最终模型。
3.3 随机森林参数调优
通过网格搜索优化随机森林的关键参数:
% 随机森林参数调优示例 params = struct('NumLearningCycles', [50, 100, 150], ... 'MinLeafSize', [1, 3, 5], ... 'MaxNumSplits', [10, 20, 30]); model = fitcensemble(X_train, y_train, 'Method', 'Bag', ... 'OptimizeHyperparameters', params);最优参数组合:
- 树数量: 150
- 最小叶节点样本数: 1
- 最大分裂数: 20
4. 模型解释与特征重要性
4.1 特征重要性分析
随机森林提供了特征重要性排序:
- ST段压低(oldpeak)
- 最大心率(thalach)
- 胸痛类型(cp)
- 血清胆固醇(chol)
- 年龄(age)
4.2 部分依赖分析
通过部分依赖图(PDP)分析关键特征对预测结果的影响:
- ST段压低值越高,患病概率越大
- 最大心率与患病概率呈负相关
- 特定类型的胸痛(如典型心绞痛)与高患病风险相关
5. 部署与应用
5.1 模型保存与加载
% 保存模型 save('heart_disease_model.mat', 'model'); % 加载模型 loadedModel = load('heart_disease_model.mat');5.2 预测新样本
% 新样本预测示例 newData = [63, 1, 3, 145, 233, 1, 0, 150, 0, 2.3, 0, 0, 1]; prediction = predict(loadedModel.model, newData);5.3 实际应用场景
- 临床辅助诊断:帮助医生快速评估患者风险
- 健康筛查:用于体检中心的初步筛查
- 个人健康管理:集成到健康APP中提供风险评估
6. 项目挑战与解决方案
6.1 数据不平衡问题
原始数据中正负样本比例约为1:1.5,我们采用以下方法处理:
- 调整类别权重
- 使用SMOTE算法生成合成样本
- 选择对不平衡数据鲁棒的评估指标(F1分数)
6.2 特征工程挑战
医学特征往往存在复杂的非线性关系,我们:
- 尝试了多种特征组合
- 使用多项式特征扩展
- 应用主成分分析(PCA)降维
6.3 模型解释性要求
医疗领域需要可解释的模型,我们:
- 选择 inherently interpretable 的算法(如随机森林)
- 使用SHAP值进行个体预测解释
- 生成决策路径可视化
7. 改进方向与未来工作
- 集成更多数据源:结合影像学检查结果
- 开发时序预测模型:跟踪患者指标变化
- 构建多任务学习框架:同时预测多种心血管疾病
- 优化部署性能:开发轻量级模型用于移动设备
在实际应用中,我发现模型对某些特殊人群(如年轻女性)的预测准确率较低,这可能与训练数据中这类样本较少有关。未来可以考虑收集更多样化的数据来提高模型的泛化能力。