温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :)
1. 项目简介
阿尔兹海默症(Alzheimer's Disease, AD)是一种常见的神经退行性疾病,主要影响老年人的认知功能。随着全球人口老龄化的加剧,阿尔兹海默症的患病率逐年上升,对社会和个人健康造成了巨大的负担。因此,开发一种能够有效预测和辅助诊断阿尔兹海默症的智能系统具有重要意义。本项目旨在利用机器学习技术,结合临床数据和生物标志物,通过 XGBoost 机器学习模型来预测阿尔兹海默症发病风险,测试集预测 AUC 达到 97.9%,并利用 Flask、Bootstrap、Ajax 构建一个智能分析预测系统,以期在早期阶段识别阿尔兹海默症患者,为临床治疗提供支持。
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="ypk77Yaa-1725549408866" src="https://player.bilibili.com/player.html?aid=113085599777805"></iframe>基于机器学习的阿尔兹海默症智能分析预测系统
2. 数据探索式可视化分析
为了更好地理解数据分布和特征之间的关系,我们首先进行了数据探索式的可视化分析。这一步骤对于发现异常值、理解数据分布以及发现潜在的模式至关重要。
关键技术点:
- Pandas: 用于数据处理和清洗。
- Matplotlib: 绘制基本图表。
- Seaborn: 进行更复杂的统计图形绘制。
- 柱状图和饼状图: 直观展示类别数据和比例数据。
2.1 数据集读取与预处理
该数据集是2149名被诊断患有阿尔茨海默病或有阿尔茨海默病风险的患者的健康记录的综合集合。数据集中的每个患者都有一个唯一的ID号,范围从4751到6900。该数据集涵盖了广泛的信息,这些信息对于理解与阿尔茨海默病相关的各种因素至关重要。它包括人口统计细节、生活习惯、病史、临床测量、认知和功能评估、症状和诊断信息。
English Field Name | Chinese Description | Value Range / Meaning |
---|---|---|
Age | 年龄 | 60至90岁 |
Gender | 性别 | 0=男性,1=女性 |
Ethnicity | 种族 | 高加索人、非裔美国人、亚洲人、其他 |
Education Level | 教育水平 | 无到高等教育 |
Body Mass Index (BMI) | 身体质量指数(BMI) | 15至40 |
Smoking Status | 吸烟状况 | 1=吸烟,0=不吸烟 |
Alcohol Consumption | 酒精摄入量 | 0至20单位 |
Physical Activity | 体育活动时间 | 0至10小时 |
Diet Quality | 饮食质量评分 | 0至10分 |
Sleep Quality | 睡眠质量评分 | 4至10分 |
Family History of Alzheimer's | 家族阿尔茨海默病史 | 1=有,0=没有 |
Cardiovascular Disease | 心血管疾病 | 有/无 |
Diabetes | 糖尿病 | 有/无 |
Depression | 抑郁症史 | 有/无 |
Head Injury | 头部受伤 | 有/无 |
Hypertension | 高血压 | 有/无 |
Systolic Blood Pressure | 收缩压 | 90-180 mmHg |
Diastolic Blood Pressure | 舒张压 | 60-120 mmHg |
Total Cholesterol | 胆固醇总量 | 150-300 mg/dL |
LDL Cholesterol | 低密度脂蛋白胆固醇(LDL) | 50-200 mg/dL |
HDL Cholesterol | 高密度脂蛋白胆固醇(HDL) | 20-100 mg/dL |
Triglycerides | 甘油三酯 | 50-400 mg/dL |
Mini-Mental State Examination (MMSE) Score | 简易精神状态检查(MMSE)得分 | 0至30分,分数越低表示认知功能障碍越严重 |
Functional Assessment Score | 功能评估得分 | 0至10分,分数越低表示功能障碍越严重 |
Memory Complaints | 记忆抱怨 | 1=有,0=没有 |
Behavioral Problems | 行为问题 | 有/无 |
Activities of Daily Living (ADL) Score | 日常生活活动(ADL)得分 | 0至10分,分数越低表示日常活动能力受损越严重 |
Confusion and Disorientation | 混乱与定向障碍 | 有/无 |
Personality Changes | 人格变化 | 有/无 |
Difficulty Completing Tasks | 完成任务困难 | 有/无 |
Forgetfulness | 健忘 | 有/无 |
Alzheimer's Diagnosis Status | 阿尔茨海默病诊断状态 | 1=确诊,0=未确诊 |
Doctor in Charge | 主诊医生 | 保护患者隐私的信息占位符 |
df = pd.read_csv("./alzheimers_disease_patient_data.csv")
## 列名汉化
df.rename(columns={ "Age": "年龄", "Gender": "性别", "Ethnicity": "种族", "EducationLevel": "教育水平", "BMI": "身体质量指数(BMI)", "Smoking": "吸烟状况", "AlcoholConsumption": "酒精摄入量", "PhysicalActivity": "体育活动时间", "DietQuality": "饮食质量评分", "SleepQuality": "睡眠质量评分", "FamilyHistoryAlzheimers": "家族阿尔茨海默病史", "CardiovascularDisease": "心血管疾病", "Diabetes": "糖尿病", "Depression": "抑郁症史", "HeadInjury": "头部受伤", "Hypertension": "高血压", "SystolicBP": "收缩压", "DiastolicBP": "舒张压", "CholesterolTotal": "胆固醇总量", "CholesterolLDL": "低密度脂蛋白胆固醇(LDL)", "CholesterolHDL": "高密度脂蛋白胆固醇(HDL)", "CholesterolTriglycerides": "甘油三酯", "MMSE": "简易精神状态检查(MMSE)得分", "FunctionalAssessment": "功能评估得分", "MemoryComplaints": "记忆抱怨", "BehavioralProblems": "行为问题", "ADL": "日常生活活动(ADL)得分", "Confusion": "混乱与定向障碍", "Disorientation": "迷失方向", "PersonalityChanges": "人格变化", "DifficultyCompletingTasks": "完成任务困难", "Forgetfulness": "健忘", "Diagnosis": "诊断状态", "DoctorInCharge": "主诊医生" },inplace=True)
df.info()
2.2 类别标签数量分布
tmp = df["诊断状态"].value_counts().to_frame().reset_index().rename(columns={"count":"数量"})
tmp["诊断状态"] = tmp["诊断状态"].map(lambda x:"是" if x == 1 else "否")
tmp["百分比"] = tmp["数量"].map(lambda x:round(x/tmp["数量"].sum()*100,2))
labels,values,percent = tmp["诊断状态"].tolist(),tmp["数量"].tolist(),tmp["百分比"].tolist()
可以看出,诊断为阿尔兹海默症的患者占 35.37%,这是一个类别不均衡的二分类问题,需要采用采样算法去平衡数据集的占比。
2.3 特征与目标的相关性分析
fig,ax = plt.subplots(1,1,figsize=(20, 16))
cmap = sns.diverging_palette(230, 20, as_cmap=True)
sns.heatmap(df.corr(), annot= True, cmap=cmap, vmax=.5, center=0,
square=True, linewidths=.5, cbar_kws={"shrink": .5})
ax.set_xticklabels(labels=df.columns, rotation=90, fontsize=12)
ax.set_yticklabels(labels=df.columns, rotation=00, fontsize=12)
plt.show()
可以看出:与诊断为阿尔兹海默症的相关性较高的特征有:MMSE、功能评估得分、记忆抱怨、行为问题、ADL得分等,其中ADL得分、MMSE得分、功能性评估得分呈现较强负相关,另外2个呈现较强的正相关。
2.4 阿尔兹海默症患病与年龄分布
可以看出,阿尔茨海默症的发病风险随年龄增长而增加,尤其是在70岁及以上的人群中更为突出。60岁以上的老年人更容易受到阿尔茨海默症的影响,尤其是70岁及以上的老年人。虽然总人口中大多数人在没有阿尔茨海默症的情况下,但是随着年龄的增长,患病比例也在逐步提高。
2.5 阿尔兹海默症患病与性别分布
从这两张饼图来看,似乎并没有明显的性别差异导致阿尔茨海默症的风险高低。男性和女性在患病率上的差异并不显著。
2.6 阿尔兹海默症患病与种族分布
可以看出,高加索人是阿尔茨海默症的主要受影响群体,其次是非裔美国人,再次是亚洲人,最低的是其他人。
2.7 阿尔兹海默症患病与功能评估得分分布
plt.figure(figsize=(12, 8))
sns.violinplot(x='诊断状态', y='功能评估得分', data=df)
plt.title('功能评估得分与患阿尔兹海默症的相关性分布', fontsize=20)
plt.xlabel('诊断状态', fontsize=16)
plt.ylabel('功能评估得分', fontsize=16)
plt.show()
小提琴图是一种用于展示连续变量分组分布的统计图形,它结合了箱线图和密度图的特点,能够清晰地展现各个组别内数据的分布情况和频率。功能评估得分与阿尔茨海默症的诊断状态有关联,未患阿尔茨海默症的人群通常得分较高且分布较为集中,而患有阿尔茨海默症的人群得分较低且分布较分散。这也符合预期,因为功能评估得分通常反映个体的能力和表现,较高的得分可能意味着较好的认知能力和身体机能,反之亦然。
2.8 阿尔兹海默症患病与日常生活活动(ADL)得分分布
从这些重要特征的分布可以看出:简易精神状态检查(MMSE)得分、记忆抱怨、日常生活活动(ADL)得分,对于是否患阿尔兹海默症,具有较明显的分布区分性,这将会为模型提供很好的特征值。
3. 样本采样均衡与扩充处理
在处理不平衡的数据集时,数据集扩充技术显得尤为重要。不平衡数据集是指目标变量的各类别之间存在显著数量差异的数据集,在这种情况下,模型可能会偏向于多数类,导致少数类别的预测性能较差。为了解决这个问题,我们可以使用imbalanced-learn库中的两种常用方法:过采样和欠采样。
(1)过采样 (RandomOverSampler)
过采样是指增加少数类样本的数量,通常通过复制现有的样本或合成新的样本实现。RandomOverSampler是一种简单直接的方法,它随机重复少数类样本以平衡数据集。
(2)欠采样 (RandomUnderSampler)
欠采样是指减少多数类样本的数量,以平衡各类别之间的比例。RandomUnderSampler同样是一个简单直接的方法,它随机选择多数类样本的一部分,使多数类与少数类的数量相同。
(3)结合使用过采样和欠采样
在某些情况下,同时使用过采样和欠采样的方法可以达到更好的效果。例如,先使用RandomUnderSampler减少多数类样本的数量,然后再使用RandomOverSampler增加少数类样本的数量。
# Separate features and target variable
X = df.drop(columns=['诊断状态'])
y = df['诊断状态']
# Count the occurrences of each class
class_counts = y.value_counts()
# Calculate the target count for each class
target_count = min(class_counts)
# 此处省略部分关键代码
# ....
# Apply resampling
# 此处省略部分关键代码
# ....
print('X_over:', X_over.shape)
X_resampled, y_resampled = under_sampler.fit_resample(X_over, y_over)
print('X_resampled:', X_resampled.shape)
# Concat
df_resampled = pd.concat([pd.DataFrame(X_resampled, columns=X.columns), pd.DataFrame(y_resampled, columns=['诊断状态'])], axis=1)
df_resampled.shape
4. 基于机器学习的阿尔兹海默症患病预测建模
在完成数据预处理之后,我们采用XGBoost算法构建了预测模型。XGBoost是一种高效的梯度提升框架,适用于大规模数据集。
关键技术点:
- XGBoost: 构建模型。
- 模型训练: 使用训练数据集训练模型。
- 特征重要性: 评估模型中各个特征的重要性。
- AUC评估: 通过计算模型的曲线下面积(Area Under the Curve, AUC)来评估模型性能。
- ROC曲线: 绘制接收者操作特性(Receiver Operating Characteristic, ROC)曲线。
- 混淆矩阵: 计算分类结果的准确性和其他指标。
4.1 多模型预测性能对比初探
利用切分的数据集对 "Ada Boost", "Gradient Boosting", "Logistic Regression", "Support Vector Machine", "XGBoost" 6个基础模型进行了初步试探,选择默认参数最后的模型,以后续进行针对性的优化:
4.2 Xgboost 模型继续优化
df_columns = X_train.columns.values
print('===> feature count: {}'.format(len(df_columns)))
xgb_params = {
'eta': 0.1,
'colsample_bytree': 0.4,
'max_depth': 8,
'lambda': 2.0,
'eval_metric': 'auc',
'objective': 'binary:logistic',
'nthread': -1,
'silent': 1,
'booster': 'gbtree'
}
dtrain = xgb.DMatrix(X_train, y_train, feature_names=df_columns)
dvalid = xgb.DMatrix(X_valid, y_valid, feature_names=df_columns)
watchlist = [(dtrain, 'train'), (dvalid, 'valid')]
利用验证集的预测指标,去优化 eta、lambda 等参数,得到最优参数组合,利用最优参数进行模型训练:
model = xgb.train(dict(xgb_params),
dtrain,
evals=watchlist,
verbose_eval=10,
early_stopping_rounds=100,
num_boost_round=4000)
训练日志:
[0] train-auc:0.84304 valid-auc:0.75025
[10] train-auc:0.99302 valid-auc:0.97291
[20] train-auc:0.99644 valid-auc:0.98094
[30] train-auc:0.99884 valid-auc:0.98591
[40] train-auc:0.99925 valid-auc:0.98565
[50] train-auc:0.99980 valid-auc:0.98726
......
[310] train-auc:1.00000 valid-auc:0.99140
[320] train-auc:1.00000 valid-auc:0.99135
[330] train-auc:1.00000 valid-auc:0.99150
[340] train-auc:1.00000 valid-auc:0.99150
[350] train-auc:1.00000 valid-auc:0.99150
[356] train-auc:1.00000 valid-auc:0.99135
4.3 特征重要程度情况
可以看出,最重要的几个特征分别是BMI、酒精摄入量、饮食质量评分、ADL得分、HDL、LDL、收缩压、MIMSE得分、年龄、舒张压、记忆衰退等。
4.4 模型性能评估
4.4.1 AUC 指标评估
# predict train
predict_train = model.predict(dtrain)
train_auc = evaluate_score(predict_train, y_train)
# predict validate
predict_valid = model.predict(dvalid)
valid_auc = evaluate_score(predict_valid, y_valid)
# predict test
dtest = xgb.DMatrix(X_test, feature_names=df_columns)
predict_test = model.predict(dtest)
test_auc = evaluate_score(predict_test, y_test)
print('训练集 auc = {:.7f} , 验证集 auc = {:.7f} , 测试集 auc = {:.7f}\n'.format(train_auc, valid_auc, test_auc))
训练集 auc = 1.0000000 , 验证集 auc = 0.9914012 , 测试集 auc = 0.9797993
4.4.2 测试集预测 ROC 曲线
4.4.3 测试集预测结果混淆矩阵计算
5. 基于机器学习的阿尔兹海默症智能分析预测系统
5.1 系统首页
5.2 阿尔兹海默症在线检测
6. 结论
本项目旨在利用机器学习技术,结合临床数据和生物标志物,通过 XGBoost 机器学习模型来预测阿尔兹海默症发病风险,测试集预测 AUC 达到 97.9%,并利用 Flask、Bootstrap、Ajax 构建一个智能分析预测系统,以期在早期阶段识别阿尔兹海默症患者,为临床治疗提供支持。
标签:阿尔兹,auc,海默症,得分,智能,train,valid From: https://blog.csdn.net/andrew_extra/article/details/141941961欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的师姐 QQ 名片 :)
精彩专栏推荐订阅: