数据分享|R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病...

2023-09-13 17:19:00

全文链接:http://tecdat.cn/?p=23061

这个数据集(查看文末了解数据免费获取方式)可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0=无病,1=有病点击文末“阅读原文”获取完整代码数据

数据集信息:

目标:

主要目的是预测给定的人是否有心脏病,借助于几个因素,如年龄、胆固醇水平、胸痛类型等。

我们在这个问题上使用的算法是:

  • 二元逻辑回归

  • Naive Bayes算法

  • 决策树

  • 随机森林

相关视频

数据集的描述:

该数据有303个观察值和14个变量。每个观察值都包含关于个人的以下信息。

  • 年龄:- 个人的年龄,以年为单位

  • sex:- 性别(1=男性;0=女性)

  • cp - 胸痛类型(1=典型心绞痛;2=非典型心绞痛;3=非心绞痛;4=无症状)。

  • trestbps--静息血压

  • chol - 血清胆固醇,单位:mg/dl

  • fbs - 空腹血糖水平>120 mg/dl(1=真;0=假)

  • restecg - 静息心电图结果(0=正常;1=有ST-T;2=肥大)

  • thalach - 达到的最大心率

  • exang - 运动诱发的心绞痛(1=是;0=否)

  • oldpeak - 相对于静止状态,运动诱发的ST压低

  • slope - 运动时ST段峰值的斜率(1=上斜;2=平坦;3=下斜)

  • ca - 主要血管的数量(0-4),由Flourosopy着色

  • 地中海贫血症--地中海贫血症是一种遗传性血液疾病,会影响身体产生血红蛋白和红细胞的能力。1=正常;2=固定缺陷;3=可逆转缺陷

  • 目标--预测属性--心脏疾病的诊断(血管造影疾病状态)(值0=<50%直径狭窄;值1=>50%直径狭窄)

在Rstudio中加载数据

heart<-read.csv("heart.csv",header = T)

header = T意味着给定的数据有自己的标题,或者换句话说,第一个观测值也被考虑用于预测。

head(heart)

outside_default.png

当我们想查看和检查数据的前六个观察点时,我们使用head函数。

tail(heart)

outside_default.png

显示的是我们数据中最后面的六个观察点

colSums(is.na(heart))

outside_default.png

这个函数是用来检查我们的数据是否包含任何NA值。
如果没有发现NA,我们就可以继续前进,否则我们就必须在之前删除NA。

检查我们的数据结构

str(heart)

outside_default.png

查看我们的数据摘要

summary(heart)

outside_default.png

通过观察以上的总结,我们可以说以下几点

  • 性别不是连续变量,因为根据我们的描述,它可以是男性或女性。因此,我们必须将性别这个变量名称从整数转换为因子。

  • cp不能成为连续变量,因为它是胸痛的类型。由于它是胸痛的类型,我们必须将变量cp转换为因子。

  • fbs不能是连续变量或整数,因为它显示血糖水平是否低于120mg/dl。

  • restecg是因子,因为它是心电图结果的类型。它不能是整数。所以,我们要把它转换为因子和标签。

  • 根据数据集的描述,exang应该是因子。心绞痛发生或不发生。因此,将该变量转换为因子。

  • 斜率不能是整数,因为它是在心电图中观察到的斜率类型。因此,我们将变量转换为因子。

  • 根据数据集的描述,ca不是整数。因此,我们要将该变量转换为因子。

  • thal不是整数,因为它是地中海贫血的类型。因此,我们将变量转换为因子。

  • 目标是预测变量,告诉我们这个人是否有心脏病。因此,我们将该变量转换为因子,并为其贴上标签。

根据上述考虑,我们对变量做了一些变化

#例如
sex<-as.factor(sex)
levels(sex)<-c("Female","Male")

检查上述变化是否执行成功

str(heart)

outside_default.png

summary(heart)

bc3cfaa1c09265b015898de294b25fb1.png

EDA

EDA是探索性数据分析(Exploratory Data Analysis)的缩写,它是一种数据分析的方法/哲学,采用各种技术(主要是图形技术)来深入了解数据集。

对于图形表示,我们需要库 "ggplot2"

library(ggplot2)
ggplot(heart,aes(x=age,fill=target,color=target)) + geom_histogram(binwidth = 1,color="black") + labs(x = "Age",y = "Frequency", title = "Heart Disease w.r.t. Age")

72556361f2545f7355578e535a109c60.png

我们可以得出结论,与60岁以上的人相比,40至60岁的人患心脏病的概率最高。

table <- table(cp)

pie(table)

1accfa6610c110aa67b5f3c46fc2aac4.png

我们可以得出结论,在所有类型的胸痛中,在个人身上观察到的大多数是典型的胸痛类型,然后是非心绞痛。


点击标题查阅往期内容

7a047a55f465ee1f919b1103c9ade342.jpeg

R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测

outside_default.png

左右滑动查看更多

outside_default.png

01

4242e41c3a8d42f636b5aa744a1a054b.png

02

4e8dc976f4741c7b6250909e4273ab10.png

03

6ee71d50f348834d9372d2c94ad01914.png

04

909dc75e996b7a0f04dd8cbf61e7c2c7.png

执行机器学习算法

Logistic回归

首先,我们将数据集分为训练数据(75%)和测试数据(25%)。

set.seed(100) 
#100用于控制抽样的permutation为100. 
index<-sample(nrow(heart),0.75*nrow(heart))

在训练数据上生成模型,然后用测试数据验证模型。

glm(family = "binomial")
# family = " 二项式 "意味着只包含两个结果。

为了检查我们的模型是如何生成的,我们需要计算预测分数和建立混淆矩阵来了解模型的准确性。

pred<-fitted(blr)
# 拟合只能用于获得生成模型的数据的预测分数。

339643331ef78d456df089ed7ecd6a85.png

我们可以看到,预测的分数是患心脏病的概率。但我们必须找到一个适当的分界点,从这个分界点可以很容易地区分是否患有心脏病。

为此,我们需要ROC曲线,这是一个显示分类模型在所有分类阈值下的性能的图形。它将使我们能够采取适当的临界值。

pred<-prediction(train$pred,train$target)
perf<-performance(pred,"tpr","fpr")
plot(perf,colorize = T,print.cutoffs.at = seq(0.1,by = 0.1))

c03272a22141a6f3c81e5005c982d9da.png

通过使用ROC曲线,我们可以观察到0.6具有更好的敏感性和特异性,因此我们选择0.6作为区分的分界点。

pred1<-ifelse(pred<0.6,"No","Yes")

936e1107326648f91c718918563cad20.png

# 训练数据的准确性
acc_tr

9be09304e512b11f25364af53ecb3a1c.png

从训练数据的混淆矩阵中,我们知道模型有88.55%的准确性。

现在在测试数据上验证该模型

predict(type = "response")
## type = "response "是用来获得患有心脏病的概率的结果。
head(test)

2cb8fcb0647de39afd1fac6a02cb8a82.png

我们知道,对于训练数据来说,临界点是0.6。同样地,测试数据也会有相同的临界点。

confusionMatrix((pred1),target)

b6dc005e6f90eb902de0b1016f86feea.png

#测试数据的准确性.

1d85e6ba177ebb7cd739b5e83bded90d.png

检查我们的预测值有多少位于曲线内

auc@y.values

27c2cb4f298b102f2b494d533f99d194.png

我们可以得出结论,我们的准确率为81.58%,90.26%的预测值位于曲线之下。同时,我们的错误分类率为18.42%。

Naive Bayes算法

在执行Naive Bayes算法之前,需要删除我们在执行BLR时添加的额外预测列。

#naivebayes模型
nB(target~.)

用训练数据检查模型,并创建其混淆矩阵,来了解模型的准确程度。

predict(train)
confMat(pred,target)

b511b0beac24866ad89c7abbab25b8a0.png

808daa9f31a1bfc7fa0da26ab732c758.png

我们可以说,贝叶斯算法对训练数据的准确率为85.46%。

现在,通过预测和创建混淆矩阵来验证测试数据的模型。

Matrix(pred,target)

0abfb75b4abecfa9af6f6d1c8d9aa01d.png

3191daa1114c60744789802a5ba260e5.png

我们可以得出结论,在Naive Bayes算法的帮助下生成的模型准确率为78.95%,或者我们也可以说Naive Bayes算法的错误分类率为21.05%。

决策树

在实施决策树之前,我们需要删除我们在执行Naive Bayes算法时添加的额外列。

train$pred<-NULL

rpart代表递归分区和回归树

当自变量和因变量都是连续的或分类的时候,就会用到rpart。

rpart会自动检测是否要根据因变量进行回归或分类。

实施决策树

plot(tree)

189a343a5ce8153e7e20af723e0c7bb9.png

在决策树的帮助下,我们可以说所有变量中最重要的是CP、CA、THAL、Oldpeak。

让我们用测试数据来验证这个模型,并找出模型的准确性。

conMat(pred,targ)

3de6424e4ec3fea5dc66e5c3701583e4.png

a11ba1ffedc7bb01fa469599da61637d.png

我们可以说,决策树的准确率为76.32%,或者说它的错误分类率为23.68%。

随机森林

在执行随机森林之前,我们需要删除我们在执行决策树时添加的额外预测列。

test$pred<-NULL

在随机森林中,我们不需要将数据分成训练数据和测试数据,我们直接在整个数据上生成模型。为了生成模型,我们需要使用随机森林库

# Set.seed通过限制permutation来控制随机性。

set.seed(100)
model_rf<-randomForest(target~.,data = heart)
model_rf

36de9dfe1acf432dcbf9bea61cb18c5c.png

在图上绘制出随机森林与误差的关系。

plot(model_rf)

98e2962a383df820cc272d661396b128.png

红线代表没有心脏病的MCR,绿线代表有心脏病的MCR,黑线代表总体MCR或OOB误差。总体误差率是我们感兴趣的,结果不错。

结论

在进行了各种分类技术并考虑到它们的准确性后,我们可以得出结论,所有模型的准确性都在76%到84%之间。其中,随机森林的准确率略高,为83.5%。

数据获取

在下面公众号后台回复“心脏病数”,可免费获取完整数据。

5f3e929207c7b37299829e931a700de2.jpeg

本文摘选R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病,点击“阅读原文”获取全文完整资料。

8771c781ed99ddc06a6a8618471c73da.jpeg

本文中的心脏病数据分享到会员群,扫描下面二维码即可加群!

a0591b9e4365d181ecbc10bf46a102c4.png

e1312f8f95538d8028a2e2fb4106dfa1.jpeg

0393d8c9cfdd67fed382fcd2f2b09df1.png

点击标题查阅往期内容

R语言逻辑回归logistic模型分析泰坦尼克titanic数据集预测生还情况

R语言是否对二分连续变量执行逻辑回归

R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据

R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析

R语言基于Bagging分类的逻辑回归(Logistic Regression)、决策树、森林分析心脏病患者

R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险

R语言用局部加权回归(Lowess)对logistic逻辑回归诊断和残差分析

R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

R语言用线性模型进行臭氧预测:加权泊松回归,普通最小二乘,加权负二项式模型,多重插补缺失值

R语言Bootstrap的岭回归和自适应LASSO回归可视化

R语言中回归和分类模型选择的性能指标

R语言多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分析

R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据

R语言计量经济学:虚拟变量(哑变量)在线性回归模型中的应用

R语言 线性混合效应模型实战案例

R语言混合效应逻辑回归(mixed effects logistic)模型分析肺癌数据

R语言如何用潜类别混合效应模型(LCMM)分析抑郁症状

R语言基于copula的贝叶斯分层混合模型的诊断准确性研究

R语言建立和可视化混合效应模型mixed effect model

R语言LME4混合效应模型研究教师的受欢迎程度

R语言 线性混合效应模型实战案例

R语言用Rshiny探索lme4广义线性混合模型(GLMM)和线性混合模型(LMM)

R语言基于copula的贝叶斯分层混合模型的诊断准确性研究

R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题

基于R语言的lmer混合线性回归模型

R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型

R语言分层线性模型案例

R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型

使用SAS,Stata,HLM,R,SPSS和Mplus的分层线性模型HLM

R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型

SPSS中的多层(等级)线性模型Multilevel linear models研究整容手术数据

用SPSS估计HLM多层(层次)线性模型模型

9e958115d6a856bcedb23b4f4c3684aa.png

a3be88b0ffc3df64185d132769d437fd.jpeg

bf752fb08841c2ae0911cf9c99981ade.png

更多推荐

2023年全网最全的软件测试八股文,稳进大厂(含答案)

Part11、你的测试职业发展是什么?测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断更新自己改正自己,做好测试任务。优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本

ModStartCMS v7.3.0 富文本MP3支持,后台组件优化

ModStart是一个基于Laravel模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。系统完全开源,基于Apache2.0开源协议,免费且不限制商业使用。功能特性丰富的模块市场,后台一键快速安装会员模块通用且完整,支持完整的API调用大文件分片上传,进度条显示,已

芯科蓝牙BG27开发笔记8-片上Flash读写

目标熟悉片上Flash的特点,知道如何使用,最好找到示例代码,有完整例程那是最好的查找参考手册除了768K的主空间,还包含:1.USERDATA区域,用户定义数据,可以读写。大小只有1K。2.设备特性和识别信息的DEVINFO空间3.内部生产测试和校准信息的CHIPCONFIG。RAM有两个部分:RAM0:共64K,0

微软(TTS)文本转语音服务API实现

此博客实现与java实现微软文本转语音(TTS)经验总结_javatts_${简简单单}的博客-CSDN博客之上,首先感谢博客源码的提供,本人在上面添加了一些详细的注释,方便大家跟好的理解和使用,毕竟我已经用原文调试了一下午才调通,一些细节的问题给大家标注出来,免得浪费大家的时间,下面直接开始代码吧!首先大家需要去微软

NFTScan 正式上线 TON NFTScan 浏览器!

2023年9月12号,NFTScan团队正式对外发布了TONNFTScan基础设施,将为TON生态的NFT开发者和用户提供简洁高效的NFT数据搜索查询服务。NFTScan作为全球领先的NFT数据基础设施服务商,TON是继Bitcoin、Ethereum、BNBChain、Polygon、Solana、Arbitrum、

删库跑路?掌握rm命令的技巧,高效删除文件和目录!

文章目录前言1.什么是rm命令?简介:认识这位特殊成员,他到底是好还是坏?2.如何使用rm命令?语法和选项:掌握rm命令的技巧和要点3.删除文件使用示例:轻松删除文件,释放磁盘空间4.删除目录使用示例:彻底删除目录及其内容,整理文件系统5.强制删除使用示例:一键强制删除,不再犹豫6.交互式删除使用示例:审慎删除,确保操

安防监控视频AI智能分析网关:人流量统计算法的应用场景汇总

TSINGSEE青犀人流量检测算法是内置在智能分析网关中的一种能够通过AI分析和计算人群数量以及密度的算法技术,在提升城市管理效率、改善用户体验和增加安全性方面发挥着重要作用。人流量检测算法在许多领域都有广泛的应用,如智慧城市、智慧交通、智慧景区等。人流量检测算法在一网统管与智慧城市中,可以用于日常交通管理中,例如实时

MyBatis-Plus的常用注解

一、@TableName在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表,由此得出结论,MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和

Challenges and Applications of Large Language Models

本文是LLM系列文章,针对《ChallengesandApplicationsofLargeLanguageModels》的翻译。大语言模型的挑战与应用摘要1引言2挑战3应用3.1聊天机器人3.2计算生物学3.3计算机程序3.4创造性工作3.5知识工作3.6法律3.7医学3.8推理3.9机器人和嵌入式代理3.10社会科

Continual Pre-Training of Large Language Models: How to (re)warm your model?

本文是LLM系列文章,针对《ContinualPre-TrainingofLargeLanguageModels:Howto(re)warmyourmodel?》的翻译。大型语言模型的持续预训练:如何(重新)预热你的模型摘要1引言2设置3相关工作4持续加热5讨论/局限性6结论摘要大型语言模型(LLM)通常在数十亿个to

【Python】多线程编程 ② ( 进程与线程 | 进程的内存空间 | 并行执行概念 | 线程的创建和执行 | threading.Thread() 函数解析 )

文章目录一、进程与线程1、进程的内存空间2、线程之间的共享内存3、并行执行概念二、Python多线程编程1、线程的创建和执行2、threading.Thread()函数解析3、代码示例-线程创建运行4、代码示例-线程并行运行一、进程与线程1、进程的内存空间在操作系统中,进程之间的内存空间是隔离的,不同的进程拥有各自的内

热文推荐