Kaggle心血管疾病数据集实战:5种算法对比与投票法融合,准确率提升3%
心血管疾病预测一直是医疗数据分析中的经典课题。Kaggle上的心血管疾病数据集包含7万条记录和13个特征,为研究者提供了丰富的建模素材。本文将采用5种经典机器学习算法(逻辑回归、KNN、决策树、随机森林、随机梯度下降)进行对比实验,并通过投票法集成策略提升模型性能。实验结果显示,集成后的模型准确率比单一最佳模型提升了3%,F1分数提升2.8%。
1. 数据预处理与特征工程
高质量的数据预处理是模型成功的基础。原始数据集包含年龄、身高、体重、血压等13个特征,首先需要进行系统性的数据清洗:
import pandas as pd from sklearn.preprocessing import StandardScaler # 加载数据 df = pd.read_csv('cardio_data.csv', sep=';') # 异常值处理 df = df[(df['ap_hi'] > df['ap_lo']) & (df['height'] >= df['height'].quantile(0.025)) & (df['height'] <= df['height'].quantile(0.975))]关键预处理步骤:
- 血压逻辑校验:删除收缩压低于舒张压的记录
- 身高体重过滤:移除前后2.5%的极端值
- 年龄转换:将天数转换为年数
- 特征衍生:计算BMI指数
# 特征工程 df['bmi'] = df['weight'] / (df['height']/100)**2 df['age_years'] = (df['age'] / 365).round().astype(int)表1:特征相关性分析结果
| 特征 | 与目标相关性 | 处理方式 |
|---|---|---|
| 年龄 | 0.38 | 转换为年数 |
| 胆固醇 | 0.22 | 类别编码 |
| 葡萄糖 | 0.18 | 类别编码 |
| BMI | 0.15 | 新衍生特征 |
| 吸烟 | 0.09 | 二元编码 |
提示:胆固醇和葡萄糖虽然是分类变量,但具有明确的等级关系,建议保留原始数值编码而非独热编码
2. 五种算法对比实验
采用相同训练集(80%)和测试集(20%)划分,使用Scikit-learn实现五种算法:
2.1 逻辑回归
from sklearn.linear_model import LogisticRegression lr = LogisticRegression(max_iter=1000) lr.fit(X_train, y_train) print(f"LR准确率: {lr.score(X_test, y_test):.3f}")调参要点:
- 增加max_iter避免未收敛警告
- 使用L2正则化防止过拟合
- 类别不平衡时设置class_weight='balanced'
2.2 K近邻算法
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=15) knn.fit(X_train, y_train)关键发现:
- 通过网格搜索确定最优K=15
- 欧式距离表现优于曼哈顿距离
- 特征缩放对KNN影响显著
2.3 决策树
from sklearn.tree import DecisionTreeClassifier dt = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10) dt.fit(X_train, y_train)优化策略:
- 限制max_depth控制过拟合
- 设置min_samples_leaf确保节点足够样本
- 使用特征重要性进行特征选择
2.4 随机森林
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=200, max_features='sqrt') rf.fit(X_train, y_train)优势分析:
- 内置特征重要性评估
- 对异常值不敏感
- 可并行化训练加速
2.5 随机梯度下降
from sklearn.linear_model import SGDClassifier sgd = SGDClassifier(loss='log_loss', early_stopping=True) sgd.fit(X_train, y_train)适用场景:
- 大数据集下的高效训练
- 在线学习能力
- 灵活选择损失函数
表2:五种算法性能对比
| 算法 | 准确率 | 召回率 | F1分数 | 训练时间(s) |
|---|---|---|---|---|
| 逻辑回归 | 0.712 | 0.698 | 0.705 | 0.8 |
| KNN | 0.703 | 0.674 | 0.688 | 1.2 |
| 决策树 | 0.721 | 0.707 | 0.714 | 3.5 |
| 随机森林 | 0.735 | 0.723 | 0.729 | 28.7 |
| SGD | 0.708 | 0.691 | 0.699 | 1.1 |
3. 投票法集成策略
单一模型各有优劣,集成学习可以综合各模型优势。采用软投票策略,考虑各分类器的预测概率:
from sklearn.ensemble import VotingClassifier voting = VotingClassifier( estimators=[ ('lr', lr), ('rf', rf), ('dt', dt)], voting='soft') voting.fit(X_train, y_train)集成效果分析:
- 准确率提升至0.758(+3%)
- F1分数提升至0.749(+2.8%)
- 对少数类的识别改善明显
注意:集成模型训练时间约为各子模型之和,需权衡性能提升与计算成本
4. 模型解释与业务应用
医疗领域模型需要可解释性。通过SHAP值分析特征重要性:
import shap explainer = shap.TreeExplainer(rf) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)关键发现:
- 年龄和收缩压是最重要预测因子
- 胆固醇水平的影响呈阶梯式上升
- BMI在过高区间才有显著影响
落地建议:
- 将模型部署为风险评估工具
- 重点关注高风险人群的干预
- 定期用新数据重新训练模型
在实际医疗场景中,这类预测模型应作为辅助决策工具而非最终诊断依据。模型输出的风险评估分数可与临床指标结合使用,为预防性医疗提供数据支持。