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

36次阅读

共计 4918 个字符,预计需要花费 13 分钟才能阅读完成。

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

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

数据预处理


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

查看缺失值

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

数据摘要

summary(heartDiseaseData)

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

ggplot(heartDiseaseData,aes(t...

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

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

能够察看到,健康人和患有心脏病的人的 Rest ECG 散布没有显著差别。

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

能够察看到心脏病在各个年龄段均匀分布。此外,患者的中位年龄为 56 岁,最年老和最年长的患者别离为 29 岁和 77 岁。能够从图表中察看到,患有心脏病的人的中位年龄小于健康人。此外,患心脏病的患者的散布稍微歪斜。因而,咱们能够将年龄作为一个预测特色。

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

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

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

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

此外,能够察看到大多数患有心脏病的人其血清胆固醇在 200-300 mg/dl 范畴内。

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

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

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

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

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

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

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

空腹血糖没有显著差别。

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

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

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

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

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

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

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

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

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

能够察看到仅有多数参数,如胸痛类型、性别、静止诱发心绞痛、血管数量和 ST 段压低,对后果有显著影响。因而,能够舍弃其余参数。

log <- glm(...

显著特色的总结

d <- heartDiseaseDa...

逻辑回归

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

log.df <- tidy...

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

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

随着 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

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

varImp(gbm.ada.1)

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

混同矩阵

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

随机森林

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

gbm.ada.1

变量重要性

varImp(gbm.ada.1)

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

混同矩阵

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

绘制决策树

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

varImp(gbm.ada.1)

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

神经网络

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

gbm.ada.1

变量重要性

varImp(gbm.ada.1)

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

混同矩阵

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


最受欢迎的见解

1.PYTHON 用户散失数据挖掘:建设逻辑回归、XGBOOST、随机森林、决策树、反对向量机、奢侈贝叶斯模型和 KMEANS 聚类用户画像

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

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

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

5. R 语言用随机森林和文本开掘进步航空公司客户满意度

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

7. 用机器学习辨认一直变动的股市情况——隐马尔可夫模型的利用

8.python 机器学习:举荐零碎实现(以矩阵合成来协同过滤)

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

正文完
 0