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

news/2024/11/15 9:33:06/文章来源:https://www.cnblogs.com/tecdat/p/18203066

全文链接: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)

image.png

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

image.png

数据预处理

 
 

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"
...

image.png

检查缺失值

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

数据摘要

 
 
summary(heartDiseaseData)

image.png

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

 
 
ggplot(heartDiseaseData,aes(t...

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

空腹血糖没有明显差异。

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

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

image.png

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

 
R
log <- glm(...

image.png

image.png

显著特征的总结

 
R
d <- heartDiseaseDa...

image.png

逻辑回归

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

image.png

 
R
log.df <- tidy...

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

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

image.png

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

逻辑回归

 
R
data <- d
set.seed(1237)
train <- sample(nrow(data), .8*nrow(data), replace = FALSE)
...#调整参数
fitControl <- trainControl(method = "repeatedcv",...
TrainSet$target <- as.factor(TrainSet$target)
 
R
gbm.ada.1 <- caret::train(target ~ ., ...metric="ROC")gbm.ada.1

image.png

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

 
 
varImp(gbm.ada.1)

image.png

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

image.png

混淆矩阵

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

image.png

随机森林

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

image.png

变量重要性

 
 
varImp(gbm.ada.1)

image.png

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

image.png

混淆矩阵

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

image.png

绘制决策树

 
 
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

image.png

 
 
varImp(gbm.ada.1)

image.png

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

下载 (1).png

神经网络

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

image.png

 
 
gbm.ada.1

image.png

变量重要性

 
 
varImp(gbm.ada.1)

image.png

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

image.png

混淆矩阵

混淆矩阵(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")

下载.png


out of the shadows- a brighter future for pharma technical development_1209427002_standard_1536x1536.webp

最受欢迎的见解

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++菱形继承、多态与类内存模型

目录1.菱形继承1.1.菱形继承的问题1.2.解决办法2.虚函数与多态2.1.普通函数不能实现多态2.2.虚函数(子类重写)+ 父类指向子类——实现多态2.3.多态原理3.c++内存模型4.参考 1.菱形继承 先看下面的例子,SheepTuo同时继承了Sheep和Tuo,而他们同时继承Animal类#include <io…

痞子衡嵌入式:从JLink V7.62开始优化了手动增加新MCU型号支持方法

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是JLink 7.62优化了手动增加新MCU型号支持方法。JLink 工具可以说是搞单片机开发的必备神器,JLink 包括一个硬件仿真器(分不同用途的 EDU/BASE/PLUS/WIFI/ULTRA+/PRO)和 PC 机上的驱动软件(从有迹可循的 20…

AnimationClip同步工具

用途:列出动画的第1帧与预制体GameObject当前值不同的,需要同步的可以手动同步 效果图 public struct ValueNotSameItem {public EditorCurveBinding curveBinding; //关联参数public AnimationCurve animCurve; //动画曲线public float kfValue; //动画曲线上第1帧的值publi…

鸿蒙HarmonyOS实战-Stage模型(开发卡片事件)

🚀一、开发卡片事件 HarmonyOS元服务卡片页面(Metaservice Card Page)是指在HarmonyOS系统中,用于展示元服务的页面界面。元服务是指一组提供特定功能或服务的组件,例如天气服务、音乐播放服务等。元服务卡片页面可以显示元服务的相关信息和操作选项,用户可以通过点击卡…

【论文阅读】FlexGraph: A Flexible and Efficient Distributed Framework for GNN Training

阅读思考问题: Please briefly describe how hierarchical dependency graphs are built in FlexGraph, and point out the specific stage in the NAU abstraction where this process takes place. 请简要描述在FlexGraph中如何构建分层依赖图,并指出在NAU抽象中的具体阶段…

N 年前,为了学习分库分表,我把 Cobar 源码抄了一遍

10 几年前,互联网产业蓬勃发展,相比传统 IT 企业,互联网应用每天会产生海量的数据。 如何存储和分析这些数据成为了当时技术圈的痛点,彼时,分库分表解决方案应运而生。 当时最流行的 Java 技术论坛是 javaeye ,有位淘宝的技术人员分享了一篇分库分表的文章 ,这篇文章,我…

4、Git之分支操作

4.1、分支的概述 在版本控制过程中,当需要同时推进多个任务时,可以为每个任务创建的单独分支。 虽然分支的底层实现是指针的引用,但是初学阶段可以将分支简单理解为副本,一个分支就是一个单独的副本。 使用分支,意味着从原来的主干上分离开,在分支上做的任何改动,在合并…

Spring 对 Junit4,Junit5 的支持上的运用

1. Spring 对 Junit4,Junit5 的支持上的运用 @目录1. Spring 对 Junit4,Junit5 的支持上的运用每博一文案2. Spring对Junit4 的支持3. Spring对Junit5的支持4. 总结:5. 最后:每博一文案 关于理想主义,在知乎上看到一句话:“他们并不是不懂别人口中的现实,他们只是不信,事…

Eclipase的JNnit导包报错

在使用Eclipase 创建项目时系统会自动帮我们生成一个module文件,JNnit单元测试时,记得删除自动生成的 module-info.java文件,不然会一直报错找不到 org

来玩 GitHub 啊,SSH 连接方式

Windows 11 git version 2.32.0.windows.2 GitHub 20240520 --今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的过程。 简述为:创建SSH密钥对 公钥注…

来玩 GitHub 啊,SSH 连接

今天找回了自己的 GitHub 账号密码,继续玩吧,再次加入 蓝星的开源软件基地。 使用邮箱注册的,找回密码也很方便。本文简要展示 按照官方文档的介绍 使用 SSH 连接 GitHub 的国产。主要文档 1、Connecting to GitHub with SSH https://docs.github.com/en/authentication/con…

ABC 354 (atcoder beginer 354) D、E、F

D检查: 1. 有可能是推导式有问题,比如-/+写错 2. x,y A、B、C、D 顺序可能搞反了 不要盲目调试,先用人眼看一下代码的情况,找一下错误很简单的找规律的题目。 很不能理解过的人,就这些。 x方向,y方向,都是4行/列,一个规律的循环。求(0,0)到(x,y)中的黑色块: 第0-3…