机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解

发布于:2025-02-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

机器学习在脑卒中预测中的应用:不平衡数据集处理方法详解


目录

  1. 引言

    • 脑卒中的全球影响
    • 机器学习在医疗预测中的挑战
    • 类别不平衡问题的核心痛点
  2. 数据预处理与特征选择

    • 数据来源与清洗
    • 缺失值处理方法
    • 类别特征编码
    • 特征选择技术
  3. 处理类别不平衡的四大方法

    • SMOTE(合成少数类过采样技术)
    • 加权投票集成分类器
    • DNN结合Focal Loss
    • PCA-Kmeans聚类与DNN-Focal Loss的混合方法
  4. 实验设计与结果分析

    • 数据集描述与实验设置
    • 不同方法的性能对比
    • 关键指标解读(F1分数、AUC、准确率)
  5. 代码示例

    • 数据预处理与特征工程
    • SMOTE实现
    • 加权投票分类器构建
    • DNN与Focal Loss模型训练
    • PCA-Kmeans与DNN的混合方法
  6. 结论与未来方向

    • 方法优缺点总结
    • 实际应用建议
    • 研究展望

1. 引言

1.1 脑卒中的全球影响

脑卒中是全球第二大死亡原因,占所有死亡病例的11.8%(GBD 2013)。早期预测中风风险对降低死亡率至关重要,而机器学习技术为此提供了新思路。然而,医疗数据集通常存在严重的类别不平衡问题,即中风病例(少数类)远少于非中风病例(多数类),导致模型倾向于忽略少数类,预测性能下降。

1.2 类别不平衡问题的核心痛点

  • 多数类主导:传统模型(如逻辑回归、SVM)在训练时会偏向多数类。
  • 评估指标误导性:仅依赖准确率会掩盖模型对少数类的预测失败。
  • 数据稀缺性:少数类样本不足,难以捕捉关键特征。

本文基于Kaggle的脑卒中数据集,系统比较了四种解决类别不平衡的方法,并通过实验验证其有效性。


2. 数据预处理与特征选择

2.1 数据介绍

特征名称 描述 取值范围 作用
Patient ID 患者的唯一标识符,用于区分不同的个体。 1到5110(整数) 主要用于数据管理和分析,但在建模时通常会被移除,因为它对预测中风没有直接帮助。
Gender(性别) 患者的性别。 Male(男性)、Female(女性)、Other(其他) 性别可能与中风的风险相关,例如某些研究表明男性中风的风险可能高于女性。
Age(年龄) 患者的年龄。 0.08岁到82岁 年龄是中风的重要风险因素之一,通常中风在老年人中更为常见。
Hypertension(高血压) 患者是否患有高血压。 Yes(是)、No(否) 高血压是中风的主要风险因素之一,与中风的发生有很强的相关性。
Heart Disease(心脏病) 患者是否患有心脏病。 Yes(是)、No(否) 心脏病可能增加中风的风险,因为心脏问题可能导致血液流动异常。
Ever Married(是否曾经结婚) 患者是否曾经结婚。 Yes(是)、No(否) 婚姻状况可能与生活方式和健康行为相关,间接影响中风风险。
Work Type(工作类型) 患者的工作类型。 Self-employed(自雇)、Private(私营企业员工)、Government(政府雇员) 工作类型可能与生活方式相关,间接影响健康。
Residence Type(居住类型) 患者的居住类型。 Urban(城市)、Rural(农村) 居住环境可能与生活方式和健康资源相关,间接影响中风风险。
Avg-Glucose Level(平均血糖水平) 患者的平均血糖水平。 55到272 高血糖是中风的风险因素之一。
BMI(体质指数) 患者的体质指数。 10到98 BMI与肥胖相关,肥胖是中风的潜在风险因素。
Smoking Status(吸烟状态) 患者的吸烟状态。 Unknown(未知)、Never(从不吸烟)、Formerly(曾经吸烟)、Smoked(吸烟) 吸烟是中风的重要风险因素。
Stroke(目标变量) 表示患者是否中风。 1(中风)、0(未中风) 这是需要预测的目标变量。

2.2 数据来源与清洗

数据集包含5110个样本,11个特征(如年龄、血糖水平、BMI等),目标变量为是否中风。清洗步骤包括:

  • 移除异常值(如BMI > 60、年龄 < 25、性别为“其他”的样本)。
  • 处理缺失值(仅BMI存在缺失)。
import pandas as pd

# 加载数据
df = pd.read_csv("stroke_dataset.csv")

# 移除异常值
df = df[(df['BMI'] <= 60) & (df['Age'] >= 25) & (df['Gender'] != 'Other')]

# 处理缺失值(简单填补:用中位数填充BMI)
df['BMI'].fillna(df['BMI'].median(), inplace=True)

2.3 缺失值处理方法对比

论文对比了两种方法:

  1. 简单填补:用中位数、众数等填充。
  2. 回归填补:基于其他特征训练回归模型预测缺失值。