基于机器学习的阿尔兹海默症智能分析预测系统

news2024/11/15 17:43:06

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 

1. 项目简介

        阿尔兹海默症(Alzheimer's Disease, AD)是一种常见的神经退行性疾病,主要影响老年人的认知功能。随着全球人口老龄化的加剧,阿尔兹海默症的患病率逐年上升,对社会和个人健康造成了巨大的负担。因此,开发一种能够有效预测和辅助诊断阿尔兹海默症的智能系统具有重要意义。本项目旨在利用机器学习技术,结合临床数据和生物标志物,通过 XGBoost 机器学习模型来预测阿尔兹海默症发病风险,测试集预测 AUC 达到 97.9%,并利用 Flask、Bootstrap、Ajax 构建一个智能分析预测系统,以期在早期阶段识别阿尔兹海默症患者,为临床治疗提供支持。

基于机器学习的阿尔兹海默症智能分析预测系统

2. 数据探索式可视化分析

        为了更好地理解数据分布和特征之间的关系,我们首先进行了数据探索式的可视化分析。这一步骤对于发现异常值、理解数据分布以及发现潜在的模式至关重要。

        关键技术点:

  • Pandas: 用于数据处理和清洗。
  • Matplotlib: 绘制基本图表。
  • Seaborn: 进行更复杂的统计图形绘制。
  • 柱状图和饼状图: 直观展示类别数据和比例数据。

2.1 数据集读取与预处理

        该数据集是2149名被诊断患有阿尔茨海默病或有阿尔茨海默病风险的患者的健康记录的综合集合。数据集中的每个患者都有一个唯一的ID号,范围从4751到6900。该数据集涵盖了广泛的信息,这些信息对于理解与阿尔茨海默病相关的各种因素至关重要。它包括人口统计细节、生活习惯、病史、临床测量、认知和功能评估、症状和诊断信息。

English Field NameChinese DescriptionValue 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 构建一个智能分析预测系统,以期在早期阶段识别阿尔兹海默症患者,为临床治疗提供支持。

 欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。技术交流、源码获取认准下方 CSDN 官方提供的师姐 QQ 名片 :)

精彩专栏推荐订阅:

1. Python数据挖掘精品实战案例

2. 计算机视觉 CV 精品实战案例

3. 自然语言处理 NLP 精品实战案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2117322.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs 使用kafka案例,node-red配置kafka案例,从安装配置kafka开始

生产者测试: bin/kafka-console-producer.sh --broker-list 1.2.3.4:9092 --topic test-topic消费者测试: bin/kafka-console-consumer.sh --bootstrap-server 1.2.3.4:9092 --topic test-topic --from-beginningconst { Kafka } require(kafkajs)con…

【AIGC数字人】EchoMimic:基于可编辑关键点条件的类人音频驱动肖像动画

GitHub:https://github.com/BadToBest/EchoMimic 论文: https://arxiv.org/pdf/2407.08136 comfyui: https://github.com/smthemex/ComfyUI_EchoMimic 相关工作 Wav2Lip Wav2Lip是一个开创性的工作 ,但输出会出现面部模糊或扭…

粒子群算法原理的示例介绍

一:粒子群优化算法的介绍 粒子群优化算法(PSO)是一种基于群体智能的优化算法,于1995年提出。它受到鸟群狩猎行为的启发,通过模拟鸟群或鱼群的社会行为来进行问题的求解。 基本原理 粒子群算法中,每个解决…

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比

顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比 目录 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比预测效果基本介绍…

一种小众且适合发文的智能优化算法应用——三维TSP问题

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天给大家介绍一种非常小众的智能优化算法应用&am…

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等…

2024/9/9 408“回头看”:

B树是什么?有什么作用?B树的插入和删除具体细节是什么?除了B树还有一个是B+树、还是B-树,他们有什么区别,又有什么相同点? b树在王道考研查找这一章,所以他的主要作用就是查找。 在…

MySQL中binary放在判断语句之前有什么作用

为什么要加binary进行判断 ① 因为 mysql中等号比较是不区分大小写的,select aA这个输出结果为1。 ② 在判断语句之前 加上binary可以以区分大小写比较 ,因为这样底层会用二进制形式比较,实现精确匹配。 代码比较 忽略大小写比较 select …

Ftrans跨域文件传输方案,数据流动无阻的高效路径

大型集团企业由于其规模庞大、业务广泛且往往将分支机构、办事处分布在多个地域,因此会涉及到跨域文件传输的需求。主要源于以下几个方面: 1.业务协同:集团内部的不同部门或子公司可能位于不同的地理位置,但需要进行紧密的业务协…

【C++】STL学习——priority_queue(了解仿函数)

目录 priority_queue介绍迭代器种类priority_queue实现仿函数仿函数的使用 priority_queue介绍 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素&#x…

Linux 磁盘管理-RAID磁盘冗余阵列看这一篇就够了

今天给伙伴们分享一下Linux 磁盘管理-RAID磁盘冗余阵列,希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到…

机器学习深度学习

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 深度学习概述 1.1 定义与历史背景 深度学习作为机器学习领域的一个重要分支,其核心在于构建由多层(深层)的人工神经网络组成的计算模型,这些模型能够学习数据的多层次抽象表示。深度学习的…

东大成贤资源库-数据挖掘技术与应用 实验一:数据预处理_熟悉数据挖掘数据预处理流程。 基于给定的数据集(csv)文件,完成下列数据处理。 1

【实验内容】 程序清单 import pandas as pd import numpy as np# 读入文件,存放在字典data里 data pd.read_csv("D:\\Desktop\\data1.csv")# 填入Id列空缺的值 for i in range(1,len(data)):if pd.isnull(data[Id][i]):data[Id][i]i1# Id属性列去重&a…

虚拟机的安装步骤

我这里使用的是VMware 1.下载centos7 2.配置 跟这图来就好 开启虚拟机 第一个页面直接回车,忘了截图 等待安装 选择语言,看自己 点击完成 点击继续安装 设置账号密码 然后等待就行 安装完成之后会有一个重启,点击(又忘了截图) 完成许可和网络 最后就可以了

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵…

数据权限的设计与实现系列7——前端筛选器组件Everright-filter用法说明

背景 官方给了全局性的介绍和示例,不过到了具体使用环节,介绍就不是那么清楚明确了,往往是直接放 demo,需要去推测和揣测,然后动手验证。去百度了下,也没找到现成的对该组件的使用说明,得以开荒…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题(及5个解决方案) 在引擎里模拟毛发,并且把它缓存下来,我们就不需要从外部导入了,所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介&am…

P1071 [NOIP2009 提高组] 潜伏者

1.题目太长要耐性总结出题目的要求 2.map中count的使用方法 #include <bits/stdc.h> using namespace std; map<char, char>m0, m1;//m0记录密文对明文&#xff0c;m1记录明文对密文int main() {string x, y, z ;//x为密文&#xff0c;y为明文&#xff0c;z为待翻…