R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

逻辑玄铁探
• 阅读 738

全文链接:https://tecdat.cn/?p=33760

原文出处:拓端数据部落公众号

概述:

众所周知,心脏疾病是目前全球最主要的死因。开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器学习可以在预测关键疾病(例如心脏病)的存在或不存在方面发挥重要作用。

如果能提前准确预测这些信息,可以为医生提供重要见解,从而能够相应并有效地进行患者治疗。以下演示了对流行的心脏疾病数据库进行的探索性数据分析。除此之外,还使用不同方法(如逻辑回归、随机森林和神经网络)进行心脏病预测。

数据集:数据集包含76个属性,但建议我们只使用其中的14个进行分析。在本文中,使用一个合并的数据集构建分类器,并使用交叉验证技术进行性能评估。

特征:

  1. Age:年龄(以年为单位)。
  2. Gender:性别,1表示男性,0表示女性。
  3. Cp:胸痛类型,取值1:典型心绞痛,取值2:非典型心绞痛,取值3:非心绞痛疼痛,取值4:无症状。
  4. Trestbps:静息血压(以毫米汞柱为单位)。
  5. Chol:血清胆固醇(以毫克/分升为单位)。
  6. Fbs:空腹血糖 > 120 mg/dl,1表示真,0表示假。
  7. Restecg:静息心电图结果,取值0:正常,取值1:ST-T波异常,取值2:根据Estes标准显示可能或明确的左室肥厚。
  8. Thalach:达到的最高心率(每分钟心跳数)。
  9. Exang:运动诱发心绞痛,1表示是,0表示否。
  10. Oldpeak:相对于休息引起的ST段压低。
  11. Slope:峰值运动ST段的斜率,取值1:上坡,取值2:平坦,取值3:下坡。
  12. Ca:血管数量(0-3)。
  13. Thal:3 = 正常;6 = 固定缺陷;7 = 可逆性缺陷。
  14. Target:两个类别,因此是一个二分类问题。

目标:预测一个人是否患有心脏疾病。

读取数据集并检查是否有缺失值


head(heartDiseaseData)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

sum(is.na(heartDiseaseData))
## [1] 0
colnames(heartDiseaseData)[1]<-"age"
str(heartDiseaseData)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

数据预处理


heartDiseaseData$cp<-as.factor(heartDiseaseData$cp)
levels(heartDiseaseData$cp)[levels(heartDiseaseData$cp)==0] <- "Chest Pain Type 0"
levels(heartDiseaseData$cp)[levels(heartDiseaseData$cp)==1] <- "Chest Pain Type 1"
levels(heartDiseaseData$cp)[levels(heartDiseaseData$cp)==2] <- "Chest Pain Type 2"
levels(heartDiseaseData$cp)[levels(heartDiseaseData$cp)==3] <- "Chest Pain Type 3"
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

检查缺失值

sum(is.na(heartDiseaseData))
## [1] 0

数据摘要

summary(heartDiseaseData)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

健康人和心脏病患者的观测总数。

ggplot(heartDiseaseData,aes(t...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

女性心脏病的发病率高于男性

ggplot(heartDiseaseData,aes(target, fill=target)) +
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

可以观察到,健康人和患有心脏病的人的 Rest ECG 分布没有明显差异。

ggplot(heartDiseaseData,aes(trestbps, fill=target)) + 
  geom_histogram(aes(y=..density..),breaks=seq(90, 200, by=10), ...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

可以观察到心脏病在各个年龄段均匀分布。此外,患者的中位年龄为56岁,最年轻和最年长的患者分别为29岁和77岁。可以从图表中观察到,患有心脏病的人的中位年龄小于健康人。此外,患心脏病的患者的分布略微倾斜。因此,我们可以将年龄作为一个预测特征。

ggplot(heartDiseaseData,aes(age, fill=target)) + ...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

ggplot(heartDiseaseData,aes(x=target, y=age, fill=target)) + 
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

此外,患有心脏病的人通常具有比健康人更高的最高心率。

ggplot(heartDiseaseData,aes(thalach, fill=target)) +
...
  ggtitle("Max Heart Rate Histogram")

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

此外,可以观察到大多数患有心脏病的人其血清胆固醇在200-300 mg/dl范围内。

ggplot(heartDiseaseData,aes(chol, fill=target)) +
 ...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

大多数心脏病患者的ST段压低为0.1。

ggplot(heartDiseaseData,aes(oldpeak, fill=target)) +
  geom_histogram(aes(y=..density..),breaks=seq(0, 7, by=0.1), ...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

大多数拥有0个主要血管的人患有心脏病。

ggplot(heartDiseaseData,aes(ca, fill=target)) +
  geom_histogram(aes(y=..density..),breaks=seq(0, 5, by=1), ...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

大多数患有心脏病的人胸痛类型为1或2。

ggplot(heartDiseaseData,aes(target, fill=target)) +
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

空腹血糖没有明显差异。

ggplot(heartDiseaseData,aes(target, fill=target)) +
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

拥有静息心电图异常类型1的人患心脏病的可能性较高。

ggplot(heartDiseaseData,aes(target, fill=target)) +
...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

没有运动诱发性心绞痛的人患心脏病的可能性较高。

ggplot(heartDiseaseData,aes(target, fill=target)) +
...
  scale_fill_manual(values=c("#97BE11","#DC1E0B"))

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

具有最高斜率2的人患心脏病的可能性更高

ggplot(heartDiseaseData, aes(target, fill=target)) +
...
  scale_fill_manual(values=c("#97BE11", "#DC1E0B"))

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

具有固定缺陷地中海贫血的人患心脏病的可能性更高

ggplot(heartDiseaseData,aes(target, fill=target)) +
...
  scale_fill_manual(values=c("#97BE11","#DC1E0B"))

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

可以观察到仅有少数参数,如胸痛类型、性别、运动诱发心绞痛、血管数量和ST段压低,对结果有显著影响。因此,可以舍弃其他参数。

log <- glm(...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

显著特征的总结

d <- heartDiseaseDa...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

逻辑回归

log <- glm(...=binomial)
summary(log)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

log.df <- tidy...

观察表明,如果个体患有2型或3型胸痛,患心脏病的可能性更高。随着血管数量、运动诱发心绞痛、ST段压低和男性性别数值的增加,患心脏病的可能性较低。

log.df %>%
  mutate(term=reorder(term,estimate)) %>%
...
  geom_hline(yintercept=0) +
  coord_flip()

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

随着ST段压低值的增加,患心脏病的可能性降低。随着血管数量的增加,女性患心脏病的可能性降低,而男性的可能性增加。

逻辑回归

data <- d
set.seed(1237)
train <- sample(nrow(data), .8*nrow(data), replace = FALSE)
...

#调整参数
fitControl <- trainControl(method = "repeatedcv",
      ...
TrainSet$target <- as.factor(TrainSet$target)
gbm.ada.1 <- caret::train(target ~ ., 
                    ...
                          metric="ROC")

gbm.ada.1

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

ST段压低是最重要的特征,其次是胸痛类型2等等。

varImp(gbm.ada.1)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

pred <- predict(gbm.ada.1,ValidSet)
....
res<-caret::confusionMatrix(t...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

混淆矩阵

ggplot(data = t.df, aes(x = Var2, y = pred, label=Freq)) +
...
  ggtitle("Logistic Regression")

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

随机森林

gbm.ada.1 <- caret::train(target ~ ., 
                          ...
                                      metric="ROC")

gbm.ada.1

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

变量重要性

varImp(gbm.ada.1)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

pred <- predict(gbm.ada.1,ValidSet)
...
res<-caret::confusionMatrix(t, positive="Heart Disease")
res

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

混淆矩阵

ggplot(data = t.df, aes(x = Var1, y = pred, label=Freq)) +
 ...
  ggtitle("Random Forest")

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

绘制决策树

gbmGrid <-  expand.grid(cp=c(0.01))
fitControl <- trainControl(method = "repeatedcv",
                    ...
                           summaryFunction = twoClassSummary)
d$target<-make.names(d$target)
system.time(gbm.ada.1 <- caret::train(target ~ ., 
                    ...
                                      tuneGrid=gbmGrid))
gbm.ada.1

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

varImp(gbm.ada.1)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

rpart.plot(gbm.ada.1$finalModel,   
    ...
           nn=TRUE)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

神经网络

fitControl <- trainControl(method = "repeatedcv",
                      ...
                           summaryFunction = twoClassSummary)
gbm.ada.1 <- caret::train(target ~ ., 
                             ...
                                      metric="ROC")

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

gbm.ada.1

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

变量重要性

varImp(gbm.ada.1)

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

pred <- predict(gbm.ada.1,ValidSet)
...
res<-caret::confusionMa...

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

混淆矩阵

混淆矩阵(Confusion Matrix)是用于评估分类模型性能的一种表格。它以四个不同的指标来总结模型对样本的分类结果:真阳性(True Positive, TP)、真阴性(True Negative, TN)、假阳性(False Positive, FP)和假阴性(False Negative, FN)。

ggplot(data = t.df, aes(x = Var1, y = pred, label=Freq)) +
...
  ggtitle("Neural Network")

R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化


R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化

最受欢迎的见解

1.PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯模型和KMEANS聚类用户画像

2.R语言基于树的方法:决策树,随机森林

3.python中使用scikit-learn和pandas决策树

4.机器学习:在SAS中运行随机森林数据分析报告

5.R语言用随机森林和文本挖掘提高航空公司客户满意度

6.机器学习助推快时尚精准销售时间序列

7.用机器学习识别不断变化的股市状况——隐马尔可夫模型的应用

8.python机器学习:推荐系统实现(以矩阵分解来协同过滤)

9.python中用pytorch机器学习分类预测银行客户流失

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
PhoneGap设置Icon
参考:http://cordova.apache.org/docs/en/latest/config\_ref/images.html通过config.xml中的<icon标签来设置Icon<iconsrc"res/ios/icon.png"platform"ios"width"57"height"57"densi
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(