大数据分析案例-基于随机森林算法构建心力衰竭预测模型

news2024/10/5 1:17:24

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

大数据分析案例合集
大数据分析案例-基于随机森林算法预测人类预期寿命
大数据分析案例-基于随机森林算法的商品评价情感分析
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-对电信客户流失分析预警预测
大数据分析案例-基于随机森林模型对北京房价进行预测
大数据分析案例-基于RFM模型对电商客户价值分析
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
大数据分析案例-基于决策树算法构建员工离职预测模型

大数据分析案例-基于KNN算法对茅台股票进行预测

大数据分析案例-基于多元线性回归算法构建广告投放收益模型
大数据分析案例-基于随机森林算法构建返乡人群预测模型
大数据分析案例-基于决策树算法构建金融反欺诈分类模型

目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2数据预处理

4.3探索性数据分析

4.3.1患心脏病的比例

4.3.2峰值运动ST段的斜率对心脏病的影响

4.3.3运动性心绞痛对于心力衰竭的影响

4.3.4分析最大心率对心力衰竭的影响

4.3.5胸痛类型对心力衰竭的影响

4.3.6年龄对心力衰竭的影响

4.3.7相关性分析

4.4特征工程

4.5模型构建

4.6模型评估

4.7模型预测

5.实验总结

源代码


1.项目背景

        心力衰竭是一种严重的心脏疾病,全球范围内广泛存在,对患者的生活质量和生命健康造成了重大影响。根据世界卫生组织的统计数据,心力衰竭是导致住院治疗和死亡的主要原因之一。

        早期预测和识别心力衰竭的风险对于采取及时干预和治疗措施至关重要。通过建立有效的预测模型,可以对心力衰竭发展的趋势进行监测,并在早期采取适当的治疗策略,从而延缓疾病的进展并提高患者的生活质量。

        传统的心力衰竭预测方法通常依赖于临床医生的经验和专业知识,这可能存在主观性和不一致性。因此,引入机器学习算法成为一种有前景的方法,可以通过分析大规模的患者数据来建立预测模型,从而提高心力衰竭的预测准确性和效率。

        随机森林是一种常用的机器学习算法,在医学领域中被广泛应用于疾病预测和诊断。它基于决策树的集成方法,通过组合多个决策树的预测结果来进行分类和回归任务。随机森林具有良好的鲁棒性和准确性,能够处理高维特征和大规模数据,并且具备一定的解释能力。

        因此,基于随机森林算法构建心力衰竭预测模型可以提供一种有效的手段,通过分析患者的临床特征和医学数据,预测心力衰竭的风险,并为临床医生提供决策支持,帮助提前干预和治疗,最终改善患者的生活质量和预后。这一研究有望在心力衰竭的预防、诊断和治疗中发挥重要作用,并为临床实践带来显著的临床和公共卫生意义。

2.项目简介

2.1项目说明

        本实验旨在基于随机森林算法构建心力衰竭的预测模型,通过分析患者的临床特征和医学数据,预测患者是否有心力衰竭的风险。具体步骤如下:

  1. 数据收集:收集包括患者的临床特征、生理指标和病史等数据。这些数据可以来自医院的电子病历系统、生物传感器或调查问卷等来源。

  2. 数据预处理:对收集到的数据进行预处理,包括数据清洗、缺失值处理、异常值处理等。确保数据的质量和一致性,以便于后续的特征选择和模型构建。

  3. 特征选择:根据领域知识和特征选择算法,选择对心力衰竭预测具有重要意义的特征。这可以帮助提高模型的准确性和可解释性,减少计算开销。

  4. 数据划分:将数据集划分为训练集和测试集,通常采用交叉验证的方法。训练集用于构建随机森林模型,测试集用于评估模型的性能。

  5. 模型构建:使用训练集数据,利用随机森林算法构建心力衰竭预测模型。随机森林通过集成多个决策树的预测结果来进行分类,每个决策树由不同的特征子集和样本子集构建,以降低过拟合的风险。

  6. 模型评估:使用测试集数据评估构建的心力衰竭预测模型的性能,包括准确率、召回率、F1值等指标。同时,可以绘制ROC曲线和计算AUC值来评估模型的分类性能。

  7. 模型应用:最终,将构建的心力衰竭预测模型应用于实际临床场景中,帮助医生和临床团队进行心力衰竭的早期诊断和风险评估,从而采取适当的治疗措施。

2.2数据说明

        本数据集来源于Kaggle,原始数据集共有918条,12列变量,各变量解释如下:

Age:患者的年龄[年]

Sex:患者性别[M:男,F:女]

ChestPainType:胸痛类型[TA:典型心绞痛,ATA:非典型心绞痛,NAP:非心绞痛,ASY:无症状]

RestingBP:静息血压[mm Hg]

Cholesterol :血清胆固醇[mm/dl]

FastingBS[1:如果空腹血糖> 120 mg/dl, 0:否则]

RestingECG:静息心电图结果[正常:正常,ST:有ST-T波异常(T波反转和/或ST波升高或下降> 0.05 mV), LVH:根据Estes标准显示可能或明确的左心室肥厚]

MaxHR:达到的最大心率[数值在60到202之间]

ExerciseAngina:运动性心绞痛[Y:有,N:没有]

Oldpeak: Oldpeak = ST[在抑郁中测量的数值]

ST_Slope:峰值运动ST段的斜率[Up:向上倾斜,Flat:平坦,Down:向下倾斜]

HeartDisease:输出等级[1:心脏病,0:正常]

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

        随机森林是一种有监督学习算法。就像它的名字一样,它创建了一个森林,并使它拥有某种方式随机性。所构建的“森林”是决策树的集成,大部分时候都是用“bagging”方法训练的。bagging 方法,即 bootstrapaggregating,采用的是随机有放回的选择训练数据然后构造分类器,最后组合学习到的模型来增加整体的效果。简而言之,随机森林建立了多个决策树,并将它们合并在一起以获得更准确和稳定的预测。其一大优势在于它既可用于分类,也可用于回归问题,这两类问题恰好构成了当前的大多数机器学习系统所需要面对的。

        随机森林分类器使用所有的决策树分类器以及 bagging 分类器的超参数来控制整体结构。与其先构建 bagging分类器,并将其传递给决策树分类器,我们可以直接使用随机森林分类器类,这样对于决策树而言,更加方便和优化。要注意的是,回归问题同样有一个随机森林回归器与之相对应。

        随机森林算法中树的增长会给模型带来额外的随机性。与决策树不同的是,每个节点被分割成最小化误差的最佳指标,在随机森林中我们选择随机选择的指标来构建最佳分割。因此,在随机森林中,仅考虑用于分割节点的随机子集,甚至可以通过在每个指标上使用随机阈值来使树更加随机,而不是如正常的决策树一样搜索最佳阈值。这个过程产生了广泛的多样性,通常可以得到更好的模型。

4.项目实施步骤

4.1理解数据

首先导入第三方库,接着加载数据集

 查看数据大小

 查看数据基本信息

查看数值型变量的描述性统计 

 查看非数值型变量的描述性统计

4.2数据预处理

删除缺失值和重复值

可以发现数据大小没有发生变化,说明原始数据集中不存在缺失值和重复值

4.3探索性数据分析

4.3.1患心脏病的比例

4.3.2峰值运动ST段的斜率对心脏病的影响

 可以发现ST的斜度向上的时候是不容易出现心力衰竭的,但是ST是平坦或向下倾斜的时候是很容易出现心力衰竭的。

4.3.3运动性心绞痛对于心力衰竭的影响

 可以发现有运动性心绞痛的人更容易出现心力衰竭。

4.3.4分析最大心率对心力衰竭的影响

 可以发现出现心力衰竭的人的最大心率比正常人小20左右。

4.3.5胸痛类型对心力衰竭的影响

 可以发现无症状的胸痛更容易出现心力衰竭。

4.3.6年龄对心力衰竭的影响

 可以发现出现心力衰竭的人一般都在50-60岁之间。

4.3.7相关性分析

4.4特征工程

首先需要对非数值型变量进行编码处理

 接着准备建模用到的数据并拆分数据集为训练集和测试集

4.5模型构建

 

对比上面构建的6个模型,我们发现随机森林算法准确率最高,故我们选用其做为最终的算法模型。 

4.6模型评估

 

特征重要性评分

 

4.7模型预测

我们随机抽取10个预测结果来检验模型效果,发现10个中预测正确9个,错误1个

5.实验总结

        本实验旨在基于随机森林算法构建心力衰竭预测模型,通过分析患者的临床特征和医学数据,提前预测心力衰竭的风险,为早期干预和治疗提供支持。通过本实验,我们成功构建了基于随机森林算法的心力衰竭预测模型,并验证了其在预测心力衰竭风险方面的有效性。该模型可以为临床医生提供决策支持,帮助实现早期干预和治疗,从而减少心力衰竭的发病和死亡风险,改善患者的生活质量。进一步的研究可以探索模型的解释能力、扩展到更大的样本和多个数据源,并与其他预测模型进行比较,以进一步提高预测准确性和临床实用性。

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
import warnings
import plotly.express as px
import seaborn as sns
sns.set(font='SimHei')
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns',None)

df = pd.read_csv('heart.csv')
df.head()
df.shape
df.info()
df.describe()
df.describe(include='O')
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)
df.shape
# 患心脏病的比例
sns.countplot(x='HeartDisease',data=df)
plt.show()
# 峰值运动ST段的斜率对心脏病的影响
sns.countplot(data=df,x='ST_Slope',hue='HeartDisease')
plt.show()
可以发现ST的斜度向上的时候是不容易出现心力衰竭的,但是ST是平坦或向下倾斜的时候是很容易出现心力衰竭的
# 分析运动性心绞痛对于心力衰竭的影响
sns.countplot(data=df,x='ExerciseAngina',hue='HeartDisease')
plt.show()
可以发现有运动性心绞痛的人更容易出现心力衰竭
# 分析最大心率对心力衰竭的影响
sns.boxplot(data=df,x='HeartDisease',y='MaxHR')
plt.show()
可以发现出现心力衰竭的人的最大心率比正常人小20左右
# 分析胸痛类型对心力衰竭的影响
sns.countplot(data=df,x='ChestPainType',hue='HeartDisease')
plt.show()
可以发现无症状的胸痛更容易出现心力衰竭
# 分析年龄对心力衰竭的影响
sns.boxplot(data=df,x='HeartDisease',y='Age')
plt.show()
可以发现出现心力衰竭的人一般都在50-60岁之间
# 相关性分析
fig = plt.figure(figsize=(18,18))
sns.heatmap(df.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.title('各个因素之间的相关系数',fontsize=20)
plt.show()
# 对非数值型变量进行编码处理
from sklearn.preprocessing import LabelEncoder
for col in df.describe(include='O').columns.to_list():
    df[col] = LabelEncoder().fit_transform(df[col])
df.head()
from sklearn.model_selection import train_test_split
# 准备建模的数据
X = df.drop('HeartDisease',axis=1)
y = df['HeartDisease']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
# 构建逻辑回归模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
print('逻辑回归模型准确率:',lr.score(X_test,y_test))
# 构建KNN模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print('KNN模型准确率:',knn.score(X_test,y_test))
# 构建朴素贝叶斯模型
from sklearn.naive_bayes import GaussianNB
gb = GaussianNB()
gb.fit(X_train,y_train)
print('朴素贝叶斯模型准确率:',gb.score(X_test,y_test))
# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
print('决策树模型准确率:',tree.score(X_test,y_test))
# 构建xgboost模型
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print('xgboost模型准确率:',xgb.score(X_test,y_test))
# 构建随机森林模型
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier()
forest.fit(X_train,y_train)
print('随机森林模型准确率:',forest.score(X_test,y_test))
from sklearn.metrics import f1_score,r2_score,confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = forest.predict(X_test)
print('模型的F1值:',f1_score(y_test,y_pred))
print('模型的R方值:',r2_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = forest.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob) 
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 特征重要性评分
feat_labels = X_train.columns[0:]
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
    index_list.append(feat_labels[j])
    value_list.append(importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('feature importance',fontsize=14)
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)

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

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

相关文章

云原生周刊:6 项 K8s 成本控制策略 | 2023.7.17

开源项目推荐 Base Image Finder 当使用容器扫描工具来识别已知漏洞(CVE,或常见漏洞和暴露)时,可能很难理解漏洞在容器中的位置,以及如何缓解这些漏洞。通常,最简单、最有效的缓解方法是更新 "基本映…

EasyPoi实战系列集合

历史文章(文章累计480) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 导…

【黑马头条之对象存储服务MinIO】

本笔记内容为黑马头条项目的对象存储服务MinIO部分 目录 一、MinIO简介 二、MinIO特点 三、开箱使用 1、安装启动 2、管理控制台 四、快速入门 1、创建工程,导入pom依赖 五、封装MinIO为starter 1、创建模块heima-file-starter 2、配置类 3、封装操作mi…

VBA命令及语法列表之字典Dictionaries相关

【分享成果,随喜正能量】真正的修佛之人。首先,得明白自己的来处和归宿,懂得敬畏自己的生命和他人的生命,尽其所能释放善意。学会悲天悯人,渡人的同时渡己,始终走在止于至善的路上。真正的慈悲为怀&#xf…

有哪些方法可将PPT转成PDF?分享三个方法给大家!

将PPT(演示文稿)文件转换为PDF(便携式文档格式)是一种常见的需求,特别适用于共享演示文稿、打印或以静态格式保存的情况。本文将介绍三种简单易用的方法来实现PPT转PDF的操作,其中方法一是使用记灵在线工具…

MarkDown 生成目录的树结构

1. tree 命令的使用 Markdown没有办法直接生成目录的树结构,需要借助Windows下的tree命令,具体如下: 显示所有目录,不包含目录下的文件,tree 文件夹路径 显示所有目录,包含目录下的文件,tree …

命令行查看numpy版本

问题 查看numpy版本 解决方法 python -c "import numpy;print(numpy.version.version)"成功

OpenCV中reshape()函数详解-改变矩阵的通道数,对矩阵元素进行序列化

文章目录 1、函数原型2、示例3、结论: OpenCV中reshape()函数详解-改变矩阵的通道数,对矩阵元素进行序列化 在opencv中reshape函数,既可以改变矩阵的通道数,又可以对矩阵元素进行序列化 1、函数原型 Mat Mat::reshape(int cn, in…

echarts_雷达图

目录 雷达图(radar)需求[1] 复制案例[2] 色调统一[3] 配置项实现代码 雷达图(radar) 需求 [1] 复制案例 如上图,先复制一个最简单的雷达图 [2] 色调统一 直角系坐标都是使用xAxis/yAxis配置项,但是雷达图使用的是radar配置项配置坐标系。 配置项注解区…

GoFrame v2.5 版本发布,企业级 Golang 开发框架

大家好啊,GoFrame 框架今天发布了 v2.5.0 正式版本啦!👏👏👏👏 本次版本主要是对已有功能组件以及开发工具上的改进工作。其中,开发工具新增了 gf gen ctrl 命令,以规范化定义、开发…

【C#】并行编程实战:使用并发集合

在上一章的并行编程实现里,为了保护资源,我们对共享资源加锁(各种同步原语)来进行保护,避免多线程同时访问(主要是写入)。但一般来说,共享资源是一个可以由多个线程读写的集合&#…

AR气象博物馆模拟体验提升青少年认知

国际气象节主要目的是唤起人们对气象工作的重视和热爱。近年来,极端天气频发,人们需要提高警惕,AR气象远程普利用ar技术特有的沉浸式的体感互动,通过模拟演练提升体验者的安全防范意识和求生技巧。 系统结合VR虚拟现实、AR增强现实…

【多模态】1、几种多模态 vision-language 任务和数据集介绍

文章目录 一、Phrase Grounding1.1 概念介绍1.2 常用数据集介绍 二、Referring Expression Comprehension(REC)2.1 概念介绍2.2 常用数据集介绍 三、Visual Question Answer(VQA)3.1 概念介绍 四、Image Caption4.1 概念介绍 现在…

MySQL-数据库读写分离(上)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

(学习笔记-TCP连接建立)为什么每次建立TCP连接时,初始化的序列号都要求不一样?

主要原因有两个方面: 为了防止历史报文被下一个相同的四元组的连接接收(主要)为了安全性,防止黑客伪造相同序列号的TCP报文被对方接收 展开第一点: 假设每次建立连接,客户端恶核服务端的初始化序列号都是从0开始: 过程…

Mysql教程(一):Mysql数据模型和SQL语法分析

Mysql教程(一):Mysql数据模型和SQL语法分析 1、Mysql数据模型 1.1 关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 使用表存储数…

H5活动营销系统怎么做?H5活动营销系统有哪些优势?

H5营销系统广泛用于各类线下活动场景,即将传统线下活动搬到线上,结合互动和奖励设计,引导用户产生转发、分享等目标行为,从而扩大活动影响力,以获得曝光和转化。因此,h5活动营销系统通常用于拉新促活、刺激…

【LeetCode 75】第三题(1431)拥有最多糖果的孩子

题目: 示例: 分析: 题目是简单题,也确实简单,不过示例给出的解释有些复杂,甚至有些误导.我们只需要遍历得出分配糖果之前的糖果最大值,然后再依次遍历每个孩子拥有的糖果数,若某孩子原有的糖果数加上待分配的所有糖果数大于等于分配前的糖果最大值,则给该孩子对应下标的结果置…

Linux--进程替换(转载)

目录 0.引入 1.替换原理 2.替换函数 execl execv execlp execle execvp execvpe execve 3.调用自定义程序 4.exec函数解释 5.命名理解 0.引入 创建子进程的目的是什么? 就是为了让子进程帮我执行特定的任务 让子进程执行父进程的一部分代码 如果子进程…

深度学习——自编码器AutoEncoder

基本概念 概述 自编码器(Autoencoder)是一种无监督学习的神经网络模型,用于学习数据的低维表示。它由编码器(Encoder)和解码器(Decoder)两部分组成,通过将输入数据压缩到低维编码空…