基于数据挖掘的心力衰竭疾病风险评估系统

 B站视频及代码下载:基于数据挖掘的心力衰竭疾病风险评估系统_哔哩哔哩_bilibili

1. 项目简介

        心力衰竭是一种常见的心脏疾病,它严重影响患者的生活质量和预期寿命。早期识别和干预对于改善患者的预后至关重要。近年来,随着大数据技术和机器学习的发展,利用数据挖掘技术来构建心力衰竭的风险评估模型已经成为可能。本项目它利用大量患者数据,覆盖了40至95岁的广泛年龄群体,包含了丰富的生理和生活方式指标,通过 XGBoost 机器学习模型来预测心力衰竭的发作风险,测试集预测 AUC 达到 90.7%,并利用 Flask、Bootstrap、Ajax 搭建web系统,为医疗专业人员提供了深入理解心衰风险因素的新视角。

基于数据挖掘的心力衰竭疾病风险评估系统

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

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

关键技术点:

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

2.1 数据集读取与预处理

        本数据集包含了多个与心力衰竭相关的特征,用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体,提供了广泛的生理和生活方式指标,以帮助研究人员和医疗专业人员更好地理解心衰的潜在风险因素。

df = pd.read_csv("./heart_failure_clinical_records_dataset.csv")
## 列名汉化
df.rename(columns={"age":"年龄","anaemia":"贫血","creatinine_phosphokinase":"肌酸激酶","diabetes":"糖尿病","ejection_fraction":"射血分数",\"high_blood_pressure":"高血压","platelets":"血小板","serum_creatinine":"血清肌酐","serum_sodium":"血清纳","sex":"性别","smoking":"吸烟",\"time":"随访时长","DEATH_EVENT":"死亡事件"},inplace=True)df.sample(10)df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 299 entries, 0 to 298
Data columns (total 13 columns):#   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  0   年龄      299 non-null    float641   贫血      299 non-null    int64  2   肌酸激酶    299 non-null    int64  3   糖尿病     299 non-null    int64  4   射血分数    299 non-null    int64  5   高血压     299 non-null    int64  6   血小板     299 non-null    float647   血清肌酐    299 non-null    float648   血清纳     299 non-null    int64  9   性别      299 non-null    int64  10  吸烟      299 non-null    int64  11  随访时长    299 non-null    int64  12  死亡事件    299 non-null    int64  
dtypes: float64(3), int64(10)
memory usage: 30.5 KB

2.2 类别标签数量分布

python">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()

        可以看出,死亡的占 32.11%,这是一个类别非常不均衡的二分类问题,需要采用采样算法去平衡数据集的占比。

2.3 特征与目标的相关性分析

python">fig,ax = plt.subplots(1,1,figsize=(10,8))
sns.heatmap(df.corr(), cmap="coolwarm", annot= True)
ax.set_xticklabels(labels=df.columns, rotation=90, fontsize=12)
ax.set_yticklabels(labels=df.columns, rotation=00, fontsize=12)
plt.show()

        可以看出:与观测值(死亡事件)的相关性较高的特征有:年龄、血清肌酐、射血分数以及随访时长,其中前两项呈弱正相关,后两者呈弱负相关,此外,其他特征与观测值的相关性不明显. 

2.4 风险因素分析

  • 分析类别特征(如贫血、糖尿病、高血压等)与死亡事件的关系,使用条形图来表示。
  • 分析数值特征(如年龄、肌酸激酶水平、射血分数等)与死亡事件的关系,使用箱线图来表示。
python">cat_columns = ['贫血', '糖尿病', '高血压', '性别', '吸烟']
plt.figure(figsize=(15, 10))
for i, column in enumerate(cat_columns, 1):plt.subplot(3, 2, i)sns.countplot(data=df, x=column, hue='死亡事件')plt.title(f'DEATH_EVENT by {column}')plt.ylabel(column if i % 3 != 1 else '')plt.xlabel('心力衰竭死亡' if i >= 6 else '')plt.tight_layout()
plt.show()

python">num_columns = ['年龄', '肌酸激酶', '射血分数', '血小板', '血清肌酐', '血清纳']
plt.figure(figsize=(15, 10))
for i, column in enumerate(num_columns, 1):plt.subplot(3, 3, i)sns.kdeplot(df[df['死亡事件'] == 1][column], label='死亡')sns.kdeplot(df[df['死亡事件'] == 0][column], label='未死亡')plt.title(f'{column} by DEATH_EVENT')plt.ylabel(column if i % 3 != 1 else '') plt.xlabel('心力衰竭死亡' if i >= 7 else '')plt.legend()plt.tight_layout()
plt.show()

 可以看出,心力衰竭的风险因素分析可以得出如下结论:

  • 分类特征与死亡事件的关系:通过条形图展示了不同分类特征(如贫血、糖尿病、高血压、性别、吸烟)与死亡事件的关系。这些图表可以帮助我们了解哪些特征与心力衰竭风险增加有关。
  • 数值特征与死亡事件的关系:通过箱线图展示了不同数值特征(如年龄、肌酸激酶水平、射血分数、血小板、血清肌酐、血清钠、随访时间)与死亡事件的关系。这些图表可以帮助我们了解这些数值特征在不同风险组(存活与死亡)中的分布情况。

3. 样本采样均衡与扩充处理

        在处理不平衡的数据集时,数据集扩充技术显得尤为重要。不平衡数据集是指目标变量的各类别之间存在显著数量差异的数据集,在这种情况下,模型可能会偏向于多数类,导致少数类别的预测性能较差。为了解决这个问题,我们可以使用imbalanced-learn库中的两种常用方法:过采样和欠采样。

        (1)过采样 (RandomOverSampler)

        过采样是指增加少数类样本的数量,通常通过复制现有的样本或合成新的样本实现。RandomOverSampler是一种简单直接的方法,它随机重复少数类样本以平衡数据集。

        (2)欠采样 (RandomUnderSampler)

        欠采样是指减少多数类样本的数量,以平衡各类别之间的比例。RandomUnderSampler同样是一个简单直接的方法,它随机选择多数类样本的一部分,使多数类与少数类的数量相同。

        (3)结合使用过采样和欠采样

        在某些情况下,同时使用过采样和欠采样的方法可以达到更好的效果。例如,先使用RandomUnderSampler减少多数类样本的数量,然后再使用RandomOverSampler增加少数类样本的数量。

python"># 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:', X.shape)
X_over, y_over = over_sampler.fit_resample(X, y)
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 梯度提升决策树 Xgboost 模型

python">df_columns = X_train.columns.values
print('===> feature count: {}'.format(len(df_columns)))xgb_params = {'eta': 0.005,# 'colsample_bytree': 0.5,'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')]# 模型训练
model = xgb.train(dict(xgb_params),dtrain,evals=watchlist,verbose_eval=10,early_stopping_rounds=100,num_boost_round=4000)

         训练日志:

python">[0]	train-auc:0.94398	valid-auc:0.94191
[10]	train-auc:0.94147	valid-auc:0.94712
[20]	train-auc:0.95585	valid-auc:0.94591
[30]	train-auc:0.95676	valid-auc:0.94591
[40]	train-auc:0.96397	valid-auc:0.94471
[50]	train-auc:0.96779	valid-auc:0.94311
[60]	train-auc:0.96820	valid-auc:0.93429
[70]	train-auc:0.96819	valid-auc:0.93550
[80]	train-auc:0.96794	valid-auc:0.93550
[90]	train-auc:0.96797	valid-auc:0.93950
[100]	train-auc:0.97112	valid-auc:0.94231
[110]	train-auc:0.97628	valid-auc:0.94391
[111]	train-auc:0.97643	valid-auc:0.94391

 4.2 特征重要程度情况

        可以看出,肌酸激酶的特征对于预测是否患病的重要程度最高. 

4.3 模型性能评估

4.3.1 AUC 指标评估

python"># 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 = 0.9768533 , 验证集 auc = 0.9439103 , 测试集 auc = 0.9078431

 4.3.2 测试集预测 ROC 曲线

python">fpr, tpr, _ = roc_curve(y_test, predict_test)
roc_auc = auc(fpr, tpr)plt.figure(figsize=(8,8))
plt.plot(fpr, tpr, color='darkorange',lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([-0.02, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC curve')
plt.legend(loc="lower right")
plt.show()

4.3.3 测试集预测结果混淆矩阵 

python">confusion_matrix_test = confusion_matrix(y_test, predict_test > 0.5, labels=None, sample_weight=None)attack_types = ['未患病', '患糖尿病']
plot_confusion_matrix(confusion_matrix_test, classes=attack_types, normalize=False, title='测试集预测结果的混淆矩阵')

5. 心力衰竭疾病风险评估系统 

最后,我们将XGBoost模型封装成API,并集成到一个Web应用中,使得用户可以通过简单的界面输入数据,获取心力衰竭的风险评估结果。

关键技术点:

  • Flask: 构建Web服务。
  • Bootstrap: 提供美观的前端界面。
  • Ajax: 实现异步数据交互。
  • XGBoost模型加载: 在后端加载训练好的模型进行预测。

5.1 系统首页

5.2 心力衰竭风险评估在线预测

        使用Flask作为后端框架来搭建Web服务,Bootstrap用于构建响应式的前端界面,Ajax技术实现了无需刷新页面的数据交互。用户可以通过Web界面输入患者的生理和生活方式数据,系统将实时加载XGBoost模型进行风险评估,并返回预测结果。

python">@app.route('/submit_and_predict', methods=['POST'])
def submit_and_predict():"""糖尿病在线预测"""test_file = request.files['file']filename = test_file.filename# 保存上传的文件test_file_path = './static/img/predict_test/{}'.format(filename)test_file.save(test_file_path)test_data = pd.read_csv(test_file_path)# 此处省略关键代码......dtest = xgb.DMatrix(test_data, feature_names=df_columns)preds = model.predict(dtest)pred_labels = (preds > 0.5).astype(int)header = ''cols = ['模型预测']cols.extend(df_columns)for col in cols:if col == '模型预测':header += '<th style="color: red;">' + col + '</th>'else:header += '<th>' + col + '</th>'# 此处省略关键代码......return jsonify({'success': True,'header': header,'rows': rows})

 6. 结论

        本项目它利用大量患者数据,覆盖了40至95岁的广泛年龄群体,包含了丰富的生理和生活方式指标,通过 XGBoost 机器学习模型来预测心力衰竭的发作风险,测试集预测 AUC 达到 90.7%,并利用 Flask、Bootstrap、Ajax 搭建web系统,为医疗专业人员提供了深入理解心衰风险因素的新视角。

  B站视频及代码下载:基于数据挖掘的心力衰竭疾病风险评估系统_哔哩哔哩_bilibili

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

精彩专栏推荐订阅:

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

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

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


http://www.ppmy.cn/news/1515946.html

相关文章

C语言小项目源码大全(60套)

C语言小项目源码大全60套 目录源码文件 目录 纯c语言迷宫源码.exe . c语言五子棋源码.exe c语言24点游戏源码.exe c语言万年历源码.exe c语言别踩白块儿(双人版)源码.exe c语言奔跑的火柴人游戏源码.exe c语言吃逗游戏源码.exe C语言超市管理系统.exe c语言对对碰游戏…

ansible:远程自动化运维

ansible是基于python开发的配置管理和应用部署工具。 也是自动化运维的重要工具。 可以批量配置&#xff0c;部署&#xff0c;管理上千台主机。 只需要在一台主机配置ansible就可以完成其他主机的操作。 操作模式&#xff1a; 1、模块化操作&#xff1a;命令行执行 2、pl…

搭建 Vue 项目博客

一、引言 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;非常适合用于构建用户界面。本篇博客将详细介绍如何使用 Vue CLI 搭建一个简单的 Vue 项目博客。 二、安装 Node.js 和 npm 在开始之前&#xff0c;请确保你的计算机上已经安装了 Node.js 和 npm。如果没有&…

嵌入式UI开发-lvgl+wsl2+vscode系列:11、SSD202移植运行评估demo程序

一、前言 接下来我们根据开发板的LVGL指南移植lvgl的demo程序到开发板上&#xff0c;以及将一个评估的项目移植到开发板上&#xff0c;你将会发现移植lvgl到ssd2xx的板子上似乎很简单&#xff0c;但通过评估程序你将更加方便了解lvgl是否可以满足你的开发需求&#xff0c;除了…

电脑U口管理软件分享|U口管理软件哪个好?

电脑U口&#xff08;即USB端口&#xff09;管理软件是保护电脑安全、防止数据泄露和恶意软件入侵的重要工具。 在选择U口管理软件时&#xff0c;需要考虑其功能、易用性、安全性以及是否满足个人或企业的具体需求。以下是一些值得推荐的电脑U口管理软件及其特点&#xff1a; 1…

SpringBoot整合定时任务

定时任务是企业级开发中必不可少的组成部分&#xff0c;诸如长周期业务数据的计算&#xff0c;例如年度报表&#xff0c;诸如系统脏数据的处理&#xff0c;再比如系统性能监控报告&#xff0c;还有抢购类活动的商品上架&#xff0c;这些都离不开定时任务。本节将介绍两种不同的…

Obsidian Publish的开源替代品Markopolis

什么是 Markopolis &#xff1f; Markopolis 是一款旨在提供 Markdown 文件的 Web 应用和 API 服务器。它允许您以网站形式共享 Markdown 笔记&#xff0c;并使用 API 与 Markdown 文件交互和操作它们。类似于 Obsidian Publish&#xff0c;但又不会被锁定在 Obsidian 生态系统…

微分方程(Blanchard Differential Equations 4th)中文版Section4.2

正弦强迫系统 在本节中,我们研究的是外力为正弦或余弦函数的强迫谐振子方程: d 2 y d t 2 + p d y d t + q y = g ( t ) , \frac{d^2 y}{dt^2} + p \frac{dy}{dt} + qy = g(t), dt2d2y​+pdtdy​+qy=g(t), 其中 g ( t ) g(t) g(t) 是一个正弦或余弦函数。这种类型的外部强…

qt creator自动运行单元测试

qt creator自动运行单元测试 工具-选项-Testing-General&#xff0c;找到Automatically run&#xff0c;选项卡选择All。

SwiftUI 革命:打造未来派用户界面的艺术

标题&#xff1a;SwiftUI 革命&#xff1a;打造未来派用户界面的艺术 在当今快速发展的移动应用领域&#xff0c;用户界面(UI)的设计和实现已经成为开发者们关注的焦点。SwiftUI&#xff0c;作为苹果公司推出的现代UI框架&#xff0c;以其声明式编程范式、强大的数据绑定能力和…

【C#】【EXCEL】BumblebeeComponentsAnalysisGH_Ex_Ana_CondUnique.cs

这段代码定义了一个名为 GH_Ex_Ana_CondUnique 的 Grasshopper 组件。以下是该组件的功能和介绍&#xff1a; 功能介绍&#xff1a; 这个组件是用于在 Excel 范围内添加基于唯一值的条件格式。它允许用户高亮显示工作表中的唯一值或非唯一值。 主要特点&#xff1a; 条件格式…

稳石机器人 | 工业级AMR S1200L,专为多样化需求设计,柔性拓展更易用

近日&#xff0c;稳石机器人重磅推出基于新品控制器ROC1000的全新移动机器人AMR S1200L&#xff0c;专为满足生产制造和仓储物流的多样化需求而设计&#xff0c;无需改造现场&#xff0c;最快可在1周内完成部署。 重载型AMR-S1200L设计注重实用性和灵活性&#xff0c;可在室内…

解决执行npm run dev报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS

问题&#xff1a; 最近下载了一个开源系统&#xff0c;执行npm install很顺利&#xff0c;以为大功告成&#xff0c;结果运行npm run dev时报错node: --openssl-legacy-provider is not allowed in NODE_OPTIONS 解决方法&#xff1a; 应用程序配置&#xff08;package.json&a…

Ansible初识

ansible初识 Ansible是一种自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它基于Python语言开发&#xff0c;使用SSH协议进行通信&#xff0c;并且不需要在被管理的主机上安装任何客户端。Ansible使用简单的YAML语言来描述任务和配置&#xff0c;使得操作简…

测试用例的设计

*涉及概念来源于《软件测试的艺术》 目录 一、为什么要设计测试用例&#xff1f; 二、黑盒测试与白盒测试介绍 三、测试用例常见设计方法 1.黑盒测试(功能测试) 2.白盒测试(结构测试) 四、测试策略 五、测试用例怎么写 一、为什么要设计测试用例&#xff1f; 由于时间…

一本读懂数据库发展史的书

数据库及其存储技术&#xff0c;一直以来都是基础软件的主力。数据库系统的操作接口标准&#xff0c;也是应用型软件的重要接口&#xff0c;关系重大。 作为最“有感”的系统软件&#xff0c;数据库的历史悠久、品类繁多、创新活跃。 对数据库历史发展的介绍&#xff0c;有利…

前端知识点

1.常见文本标签 2.属性 3.区块 4.表单 如果那个性别只能是单选的话要加上name属性 css 相邻选择器就是跟在被选中的里面的所有 js基本语法 js函数&#xff1a;就跟C语言差不多啊 改文本 引入js

【C#】【EXCEL】Bumblebee/Classes/ExColumn.cs

文章目录 Bumblebee/Classes/ExColumn.csFlow diagramDescriptionCode Bumblebee/Classes/ExColumn.cs Flow diagram #mermaid-svg-6WUm4r0wDJG9uelI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6WUm4r0wDJG9ue…

[Algorithm][综合训练][对称之美][经此一役小红所向无敌][连续子数组最大和]详细讲解

目录 1.对称之美1.题目链接2.算法原理详解 && 代码实现 2.经此一役小红所向无敌1.题目链接2.算法原理详解 && 代码实现 3.连续子数组最大和1.题目链接2.算法原理详解 && 代码实现 1.对称之美 1.题目链接 对称之美 2.算法原理详解 && 代码实现…

C# 循环访问目录树详解与示例

文章目录 一、目录树遍历的概念二、使用System.IO命名空间三、DirectoryInfo和FileInfo类四、递归遍历目录树五、示例&#xff1a;列出目录树中的所有文件和文件夹六、异常处理七、迭代方法八、总结 在C#中&#xff0c;访问文件系统是常见的需求之一。有时我们需要遍历目录树以…