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:两个类别,因此是一个二分类问题。

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

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

go 复制代码
head(heartDiseaseData)
go 复制代码
sum(is.na(heartDiseaseData))
go 复制代码
## [1] 0
go 复制代码
colnames(heartDiseaseData)[1]<-"age"
str(heartDiseaseData)

数据预处理

go 复制代码
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"
...

检查缺失值

go 复制代码
sum(is.na(heartDiseaseData))
go 复制代码
## [1] 0

数据摘要

go 复制代码
summary(heartDiseaseData)

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

go 复制代码
ggplot(heartDiseaseData,aes(t...

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

go 复制代码
ggplot(heartDiseaseData,aes(target, fill=target)) +
...

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

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

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

go 复制代码
ggplot(heartDiseaseData,aes(age, fill=target)) + ...
go 复制代码
ggplot(heartDiseaseData,aes(x=target, y=age, fill=target)) + 
...

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

go 复制代码
ggplot(heartDiseaseData,aes(thalach, fill=target)) +
...
  ggtitle("Max Heart Rate Histogram")

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

go 复制代码
ggplot(heartDiseaseData,aes(chol, fill=target)) +
 ...

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


点击标题查阅往期内容

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

左右滑动查看更多

01

02

03

04

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

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

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

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

go 复制代码
ggplot(heartDiseaseData,aes(target, fill=target)) +
...

空腹血糖没有明显差异。

go 复制代码
ggplot(heartDiseaseData,aes(target, fill=target)) +
...

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

go 复制代码
ggplot(heartDiseaseData,aes(target, fill=target)) +
...

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

go 复制代码
ggplot(heartDiseaseData,aes(target, fill=target)) +
...
  scale_fill_manual(values=c("#97BE11","#DC1E0B"))

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

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

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

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

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

go 复制代码
R
log <- glm(...

显著特征的总结

go 复制代码
R
d <- heartDiseaseDa...

逻辑回归

go 复制代码
R
log <- glm(...=binomial)
summary(log)
go 复制代码
R
log.df <- tidy...

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

go 复制代码
R
log.df %>%
  mutate(term=reorder(term,estimate)) %>%
...
  geom_hline(yintercept=0) +
  coord_flip()

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

逻辑回归

go 复制代码
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)
go 复制代码
R
gbm.ada.1 <- caret::train(target ~ ., 
                    ...
                          metric="ROC")

gbm.ada.1

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

go 复制代码
varImp(gbm.ada.1)
go 复制代码
pred <- predict(gbm.ada.1,ValidSet)
....
res<-caret::confusionMatrix(t...

混淆矩阵

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

随机森林

go 复制代码
gbm.ada.1 <- caret::train(target ~ ., 
                          ...
                                      metric="ROC")

gbm.ada.1

变量重要性

go 复制代码
varImp(gbm.ada.1)
go 复制代码
pred <- predict(gbm.ada.1,ValidSet)
...
res<-caret::confusionMatrix(t, positive="Heart Disease")
res

混淆矩阵

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

绘制决策树

go 复制代码
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))
go 复制代码
gbm.ada.1
go 复制代码
varImp(gbm.ada.1)
go 复制代码
rpart.plot(gbm.ada.1$finalModel,   
    ...
           nn=TRUE)

神经网络

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

变量重要性

go 复制代码
varImp(gbm.ada.1)
go 复制代码
pred <- predict(gbm.ada.1,ValidSet)
...
res<-caret::confusionMa...

混淆矩阵

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

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

点击文末**"阅读原文"**

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

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

点击标题查阅往期内容

数据分享|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、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化

相关推荐
艾派森18 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
Chef_Chen1 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
MarkHD2 小时前
第十一天 线性代数基础
线性代数·决策树·机器学习
正义的彬彬侠3 小时前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
让学习成为一种生活方式3 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
羊小猪~~3 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
西柚小萌新7 小时前
8.机器学习--决策树
人工智能·决策树·机器学习
985小水博一枚呀8 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
985小水博一枚呀8 小时前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习