码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化...


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

    02332570e88dea6c4dc8c57fc75bd742.png

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

    382c0c10ac3b2a5f1bb78426134895f7.png

    数据预处理

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

    06d085cccc88288d641e91e0272b1cba.png

    检查缺失值

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

    数据摘要

    summary(heartDiseaseData)

    ad5050ac56ec66dafbdecf62c74457a9.png

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

    ggplot(heartDiseaseData,aes(t...

    555f19d56c119b7d158e929d49946049.png

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

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

    a8addb1aae31dd5bb75440f1c069bc03.png

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

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

    44ed01af12c7322dcfb31325da70c15d.png

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

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

    8c74c3a3c79d3339a1651de857eecda5.png

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

    b3ae7b702cd760215a559a2bf6bfc77e.png

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

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

    e672b59e2b51cce4e58b452ca9bea482.png

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

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

    2f483c467264f2fef9c2d81fec567de8.png

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


    点击标题查阅往期内容

    41bb0fc5004fe2c4931bdfb636e0bfe7.jpeg

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

    outside_default.png

    左右滑动查看更多

    outside_default.png

    01

    5abd12a93d6679299cb1e75109fd0550.png

    02

    20ba08d5434edf475395efcdb20fada1.png

    03

    39794d3aea28dc7802e3e59dcf7efe16.png

    04

    bc81459bb2fb49a6fb62b8b3dcbaf5da.png

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

    9939bb4058524d7464d224205a9671d5.png

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

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

    29ca23d0a937f01c0d2bc27f0a9950f7.png

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

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

    f2ea07747b3cb8221713a24822742c73.png

    空腹血糖没有明显差异。

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

    7781bfe2f703a21233a4e3454b429989.png

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

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

    315cfc4129f00adf808298f35486a4e4.png

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

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

    5e71890c3878e3d3462a9080cb68f56d.png

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

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

    3ddc42c35452dfcb17b62e003a41132d.png

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

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

    95a97a16f9ba1899e7680b138ec331fb.png

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

    1. R
    2. log <- glm(...

    76654f579075fbe2a27acf291895e6de.png

    8d594055d7b527656616870573f5133b.png

    显著特征的总结

    1. R
    2. d <- heartDiseaseDa...

    896f0f1e199ce2870898a954cf5b54e9.png

    逻辑回归

    1. R
    2. log <- glm(...=binomial)
    3. summary(log)

    5c1439ebb3ea9be31f17208d78663e3b.png

    1. R
    2. log.df <- tidy...

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

    1. R
    2. log.df %>%
    3. mutate(term=reorder(term,estimate)) %>%
    4. ...
    5. geom_hline(yintercept=0) +
    6. coord_flip()

    dde8eb5c31e61e36d2b99d5341e5a2cc.png

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

    逻辑回归

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

    8e44bbdf5793286711949a4975229398.png

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

    varImp(gbm.ada.1)

    4e3e6777d34c0f2a12b67d57435c4daa.png

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

    47feb6b0dd10c4a85d9833d31b7d8c4e.png

    混淆矩阵

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

    276559ded73d8d3b2714bdda8dd74eea.png

    随机森林

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

    0676d67abe0a000cb1afb54b3665a05e.png

    变量重要性

    varImp(gbm.ada.1)

    3a716567a241356dd4cfc21d136d6c17.png

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

    30d2f12d7f7c29d08a3eb14c7b85156a.png

    混淆矩阵

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

    e873afc4efada4882e36b7c97b8e6604.png

    绘制决策树

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

    152743c1960ea2d2ae0bb13a288590bc.png

    varImp(gbm.ada.1)

    e34cbb5d1264ceee193d7cd916d78ee4.png

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

    da6c9a8d2ee0030c0ab806d3a83ccb33.png

    神经网络

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

    94c2c2ec2defec3dcfe91e89438e4d8b.png

    gbm.ada.1

    bc9848ce37f928cb1d2957bb3587482b.png

    变量重要性

    varImp(gbm.ada.1)

    01bbec2c9435ff2ad46b92684037ef27.png

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

    c77146fd82fca8b9e9580fb8a7b1a73a.png

    混淆矩阵

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

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

    a1523553d678227ebfae1b29a7c2df71.png


    b9fce0b3f451698d18ce0ec9f89483dd.jpeg

    点击文末“阅读原文”

    获取全文完整代码数据资料。

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

    9be5847b44f561d53dd6ef59bfe0e033.jpeg

    91827ad0c3c7edc859a428684bc65934.png

    点击标题查阅往期内容

    数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC

    MATLAB随机森林优化贝叶斯预测分析汽车燃油经济性

    R语言用Rcpp加速Metropolis-Hastings抽样估计贝叶斯逻辑回归模型的参数

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

    R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据

    R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归

    Python贝叶斯回归分析住房负担能力数据集

    R语言实现贝叶斯分位数回归、lasso和自适应lasso贝叶斯分位数回归分析

    Python用PyMC3实现贝叶斯线性回归模型

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

    R语言Gibbs抽样的贝叶斯简单线性回归仿真分析

    R语言和STAN,JAGS:用RSTAN,RJAG建立贝叶斯多元线性回归预测选举数据

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

    R语言贝叶斯线性回归和多元线性回归构建工资预测模型

    R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例

    R语言stan进行基于贝叶斯推断的回归模型

    R语言中RStan贝叶斯层次模型分析示例

    R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化

    R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型

    WinBUGS对多元随机波动率模型:贝叶斯估计与模型比较

    R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样

    R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例

    R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化

    视频:R语言中的Stan概率编程MCMC采样的贝叶斯模型

    R语言MCMC:Metropolis-Hastings采样用于回归的贝叶斯估计

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

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

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

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

    6727e50170ec32236200e58de9032b2b.png

    6bbfbe810279cd2633788b685afbdb95.jpeg

    2780618a8c5464aa204ee4ed7294e093.png

  • 相关阅读:
    电子管是什么?
    Java调用OpenDDS(1)-编译安装openDDS-补上了所有网络上其他文章遗漏的细节
    【论文速读】 | AI驱动修复:漏洞自动化修复的未来
    JAVA集合问答
    Java开发:Java SE 基础知识篇
    DNS的原理介绍
    前端本地开发中,代理配置是如何解决跨域的?
    错误记录2022.11.22
    (二十二)devops持续集成开发——jenkins服务代理Agent搭建
    BAT020:将文本文档中多行文本拼接为;分隔的单行文本
  • 原文地址:https://blog.csdn.net/tecdat/article/details/133191677
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号