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

news2024/9/20 16:51:12

 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    float64
 1   贫血      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    float64
 7   血清肌酐    299 non-null    float64
 8   血清纳     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 类别标签数量分布

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 特征与目标的相关性分析

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 风险因素分析

  • 分析类别特征(如贫血、糖尿病、高血压等)与死亡事件的关系,使用条形图来表示。
  • 分析数值特征(如年龄、肌酸激酶水平、射血分数等)与死亡事件的关系,使用箱线图来表示。
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()

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增加少数类样本的数量。

# 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 模型

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)

         训练日志:

[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 指标评估

# 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 曲线

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 测试集预测结果混淆矩阵 

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模型进行风险评估,并返回预测结果。

@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.coloradmin.cn/o/2072842.html

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

相关文章

eleme

设置主从从mysql57服务器 --配置主数据库 # systemctl stop firewalld # setenforce 0 # systemctl disable firewalld # ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz # cp -r mysql-5.7.44-linux-…

【题解】【循环】——[NOIP2010 普及组] 数字统计

【题解】【循环】——[NOIP2010 普及组] 数字统计 [NOIP2010 普及组] 数字统计题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.题意解析2.AC代码 [NOIP2010 普及组] 数字统计 戳我查看题目&#xff08;洛谷&#xff09; 题目描述 请统计某个给定…

Spring cloud 网关信息

网关简绍 就是网络的关口&#xff0c;负责请求的路由、转发、身份校验。 引入网关依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependenc…

html+css 实现爱心跳动

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 实现爱心跳动&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f49…

速通教程:如何使用Coze+剪映,捏一个爆款悟空视频

程哥最近做了一个和黑神话悟空有关的视频&#xff0c;没想到就火了&#xff0c;视频主打一个玉石风格&#xff0c;就是下面这个视频。 视频请移步飞书观看&#xff1a;黑神话悟空玉石版 制作过程不算很复杂&#xff0c;全程只需要用到Coze智能体和剪映这两个工具。 智能体用…

做个实验

做个实验 #include <bits/stdc.h> using namespace std; #define int long long #define ll __int128_t #define ar array<int, 2> #define arr array<int, 3> int n, m, k, inf 1LL << 61, mod 998244353;// 1e97; const int N 5e5 50;void sol…

存储架构模式之数据库存储架构

数据库读写分离 读写分离解决了读的问题。读被分离出去了&#xff0c;写性能的提升还是会有的。 数据库慢不需要直接上读写分离&#xff0c;先尝试优化索引&#xff0c;加入缓存等操作。 数据库读写分离复杂度分析 任务分解&#xff1a;读请求打到从机&#xff0c;写请求打到…

kafka发送消息-生产者发送消息的分区策略(消息发送到哪个分区中?是什么策略)

生产者发送消息的分区策略&#xff08;消息发送到哪个分区中&#xff1f;是什么策略&#xff09; 1、默认策略&#xff0c;程序自动计算并指定分区1.1、指定key&#xff0c;不指定分区1.2、不指定key&#xff0c;不指定分区 2、轮询分配策略RoundRobinPartitioner2.1、创建配置…

【前端基础篇】CSS基础速通万字介绍(上篇)

文章目录 前言CSS介绍什么是CSS基本语法规范 引入方式内部样式表行内样式表外部样式总结 代码风格样式格式样式大小写空格规范 选择器选择器的功能选择器的种类基础选择器标签选择器类选择器id选择器通配符选择器基础选择器总结 复合选择器后代选择器子代选择器并集选择器 伪类…

杀软对抗 ----> 你真的Bypass火绒了吗?

目录 1.白加黑&#xff1f;syscall&#xff1f; ......绕过火绒&#xff1f;&#xff1f;&#xff1f; 2.内存对抗 ​3.CS已死 &#xff1f;&#xff1f;&#xff1f; 是真的 &#xff01; 玩免杀的都知道&#xff0c;我们说到国产&#xff0c;基本上都是360&#xff0c;对于…

AutoCAD 2010 x64图文安装教程及下载.

AutoCAD 2010 是 Autodesk 于2009年发布的一个版本&#xff0c;是 AutoCAD 系列中的一个重要里程碑。以下是 AutoCAD 2010 x64 的一些关键特性和改进&#xff1a; 参数化绘图&#xff1a;增加了几何约束和尺寸约束功能&#xff0c;使用户能够创建更精确、可调整的设计模型。动…

树章节习题

今天也是小小的把树的章节的内容大体过了一遍&#xff0c;总共有树上dp&#xff0c;LCA&#xff08;最近公共祖先&#xff09;&#xff0c;树的直径&#xff0c;以及树上差分 P1395 会议 很经典的树上dp里面的换根dp问题&#xff0c;现在这里说几个数组 sz数组&#xff0c;用…

多模态协同学习框架 DMCL

https://arxiv.org/pdf/2408.05914 一.discriminative and robust model 早期传统的reid的工作方式&#xff0c;因无法在大规模数据集上产生有竞争力的结果&#xff0c;所以本文中为相关工作&#xff0c;并未成为本文方法。 二.Dynamic Multimodal Feature Fusion Strategy 提…

计算机毕业设计选题推荐-产品订单管理系统-产品销售管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

YOLOv8目标检测推理流程及Python代码

在这章中将介绍目标检测推理原理,以及基于onnx模型使用Python语言进行推理。在推理原理章节中,将了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作等;在Python代码篇,将给出推理代码。 这里注意一下的是,由于在导出onnx模型…

【数学分析笔记】第2章第4节收敛准则(2)

2. 数列极限 2.4 收敛准则 2.4.1 单调有界定理 【例2.4.3】 x 1 2 , x n 1 3 2 x n , n 1 , 2 , 3 , . . . x_{1}\sqrt{2},x_{n1}\sqrt{32x_{n}},n1,2,3,... x1​2 ​,xn1​32xn​ ​,n1,2,3,...&#xff0c;证明 { x n } \{x_{n}\} {xn​}收敛并求极限。 【证】 0 <…

InternVL 多模态模型部署微调实践

一、什么是InternVL nternVL 是一种用于多模态任务的深度学习模型&#xff0c;旨在处理和理解多种类型的数据输入&#xff0c;如图像和文本。它结合了视觉和语言模型&#xff0c;能够执行复杂的跨模态任务&#xff0c;比如图文匹配、图像描述生成等。通过整合视觉特征和语言信…

中仕公考怎么样?事业编联考、统考、单招介绍

一、事业编考试流程 发布公告——注册报名——交报名费——报名确认——打印准考证|——笔试——调剂——面试——体检——录用 二、招聘公告查看渠道&#xff1a; ①事业单位招聘网 事业单位公告都会发布&#xff0c;包括各类招考信息、报名信息等; ②各省人事考试网 是…

Telnet不止于端口测试:探索经典工具的多样化应用

文章目录 Telnet详解与实用指南1. 引言2. Telnet 的安装和启动2.1 在 Windows 上安装 Telnet2.2 在 Linux 上安装 Telnet2.3 在 macOS 上使用 Telnet 3. Telnet 的基本命令与操作3.1 远程登录3.2 测试端口连通性3.3 调试网络服务3.4 网络协议调试3.5 简单的文件传输 4. Telnet …

继承的初始化顺序

B类继承A类后&#xff0c;new B()后执行顺序如下&#xff1a; 1、执行A类的静态方法&#xff08;只执行一次&#xff09; 2、执行B类的静态方法&#xff08;只执行一次&#xff09; 3、执行A类的成员变量的赋值&#xff08;没有赋值操作则忽略此步&#xff09; 4、执行A类的…