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

众所周知,心脏疾病是目前全球最主要的死因。

由Kaizong Ye,Colin Ge撰写

开发一个能够预测患者心脏疾病存在的计算系统将显著降低死亡率并大幅降低医疗保健成本。


机器学习在全球许多领域中被广泛应用,尤其在医疗行业中越来越受欢迎。机器学习可以在预测关键疾病(例如心脏病)的存在或不存在方面发挥重要作用。

机器学习,作为人工智能的一个分支,已经深入渗透到全球众多领域,并在其中发挥着举足轻重的作用。而其在医疗行业的应用,更是为这一领域带来了前所未有的变革。特别是在预测关键疾病,如心脏病方面,机器学习正逐渐展现出其独特的价值和潜力。

心脏病是全球范围内导致死亡的主要原因之一,因此,能够提前、准确地预测其存在或风险,对于降低死亡率、提高患者生活质量具有重要意义。

传统的预测方法往往依赖于医生的经验和患者的病史、体征等,虽然有一定的准确性,但难免存在主观性和局限性。而机器学习则能够通过大量的数据学习和分析,发现隐藏在数据中的规律和模式,从而更准确地预测疾病的发生。

如果能提前准确预测这些信息,可以为医生提供重要见解,从而能够相应并有效地进行患者治疗。

以下演示了对流行的心脏疾病数据库进行的探索性数据分析。除此之外,还使用不同方法(如逻辑回归、随机森林和神经网络)进行心脏病预测。

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


视频

逻辑回归Logistic模型原理和R语言分类预测冠心病风险实例

探索见解

去bilibili观看

探索更多视频


视频

从决策树到随机森林:R语言信用卡违约分析信贷数据实例

探索见解

去bilibili观看

探索更多视频


视频

决策树模型原理和R语言预测心脏病实例

探索见解

去bilibili观看

探索更多视频


视频

人工神经网络ANN中的前向传播和R语言分析学生成绩数据案例

探索见解

去bilibili观看

探索更多视频


视频

神经网络正则化技术减少过拟合和R语言CNN卷积神经网络手写数字图像数据MNIST分类

探索见解

去bilibili观看

探索更多视频

特征:

  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

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

image.png

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


图片

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

阅读文章



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的人患心脏病的可能性更高

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

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

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

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

Rlog <- glm(...
image.png
image.png

显著特征的总结

Rd <- heartDiseaseDa...
image.png

逻辑回归

Rlog <- glm(...=binomial) summary(log)
image.png
Rlog.df <- tidy...

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

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

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

逻辑回归

Rdata <- d set.seed(1237) train <- sample(nrow(data), .8*nrow(data), replace = FALSE) ... #调整参数 fitControl <- trainControl(method = "repeatedcv", ... TrainSet$target <- as.factor(TrainSet$target)
Rgbm.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


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds