最近我们被客户要求撰写关于预测心脏病的研究报告,包括一些图形和统计输出。
这个数据集可以追溯到1988年,由四个数据库组成。克利夫兰、匈牙利、瑞士和长滩。"目标 "字段是指病人是否有心脏病。它的数值为整数,0=无病,1=有病 。
主要目的是预测给定的人是否有心脏病,借助于几个因素,如年龄、胆固醇水平、胸痛类型等。
我们在这个问题上使用的算法是:
该数据有303个观察值和14个变量。每个观察值都包含关于个人的以下信息。
在Rstudio中加载数据
heart<-read.csv("heart.csv",header = T)
header = T意味着给定的数据有自己的标题,或者换句话说,第一个观测值也被考虑用于预测。
head(heart)
当我们想查看和检查数据的前六个观察点时,我们使用head函数。
tail(heart)
显示的是我们数据中最后面的六个观察点
colSums(is.na(heart))
这个函数是用来检查我们的数据是否包含任何NA值。 如果没有发现NA,我们就可以继续前进,否则我们就必须在之前删除NA。
str(heart)
查看我们的数据摘要
summary(heart)
通过观察以上的总结,我们可以说以下几点
根据上述考虑,我们对变量做了一些变化
#例如
sex<-as.factor(sex)
levels(sex)<-c("Female","Male")
检查上述变化是否执行成功
str(heart)
summary(heart)
EDA是探索性数据分析(Exploratory Data Analysis)的缩写,它是一种数据分析的方法/哲学,采用各种技术(主要是图形技术)来深入了解数据集。
对于图形表示,我们需要库 "ggplot2"
library(ggplot2)
ggplot(heart,aes(x=age,fill=target,color=target)) + geom_histogram(binwidth = 1,color="black") + labs(x = "Age",y = "Frequency", title = "Heart Disease w.r.t. Age")
我们可以得出结论,与60岁以上的人相比,40至60岁的人患心脏病的概率最高。
table <- table(cp)
pie(table)
我们可以得出结论,在所有类型的胸痛中,在个人身上观察到的大多数是典型的胸痛类型,然后是非心绞痛。
点击标题查阅往期内容
左右滑动查看更多
01
02
03
04
首先,我们将数据集分为训练数据(75%)和测试数据(25%)。
set.seed(100)
#100用于控制抽样的permutation为100.
index<-sample(nrow(heart),0.75*nrow(heart))
在训练数据上生成模型,然后用测试数据验证模型。
glm(family = "binomial")
# family = " 二项式 "意味着只包含两个结果。
为了检查我们的模型是如何生成的,我们需要计算预测分数和建立混淆矩阵来了解模型的准确性。
pred<-fitted(blr)
# 拟合只能用于获得生成模型的数据的预测分数。
我们可以看到,预测的分数是患心脏病的概率。但我们必须找到一个适当的分界点,从这个分界点可以很容易地区分是否患有心脏病。
为此,我们需要ROC曲线,这是一个显示分类模型在所有分类阈值下的性能的图形。它将使我们能够采取适当的临界值。
pred<-prediction(train$pred,train$target)
perf<-performance(pred,"tpr","fpr")
plot(perf,colorize = T,print.cutoffs.at = seq(0.1,by = 0.1))
通过使用ROC曲线,我们可以观察到0.6具有更好的敏感性和特异性,因此我们选择0.6作为区分的分界点。
pred1<-ifelse(pred<0.6,"No","Yes")
# 训练数据的准确性
acc_tr
从训练数据的混淆矩阵中,我们知道模型有88.55%的准确性。
现在在测试数据上验证该模型
predict(type = "response")
## type = "response "是用来获得患有心脏病的概率的结果。
head(test)
我们知道,对于训练数据来说,临界点是0.6。同样地,测试数据也会有相同的临界点。
confusionMatrix((pred1),target)
#测试数据的准确性.
检查我们的预测值有多少位于曲线内
auc@y.values
我们可以得出结论,我们的准确率为81.58%,90.26%的预测值位于曲线之下。同时,我们的错误分类率为18.42%。
在执行Naive Bayes算法之前,需要删除我们在执行BLR时添加的额外预测列。
#naivebayes模型
nB(target~.)
用训练数据检查模型,并创建其混淆矩阵,来了解模型的准确程度。
predict(train)
confMat(pred,target)
我们可以说,贝叶斯算法对训练数据的准确率为85.46%。
现在,通过预测和创建混淆矩阵来验证测试数据的模型。
Matrix(pred,target)
我们可以得出结论,在Naive Bayes算法的帮助下生成的模型准确率为78.95%,或者我们也可以说Naive Bayes算法的错误分类率为21.05%。
在实施决策树之前,我们需要删除我们在执行Naive Bayes算法时添加的额外列。
train$pred<-NULL
rpart代表递归分区和回归树
当自变量和因变量都是连续的或分类的时候,就会用到rpart。
rpart会自动检测是否要根据因变量进行回归或分类。
plot(tree)
在决策树的帮助下,我们可以说所有变量中最重要的是CP、CA、THAL、Oldpeak。
让我们用测试数据来验证这个模型,并找出模型的准确性。
conMat(pred,targ)
我们可以说,决策树的准确率为76.32%,或者说它的错误分类率为23.68%。
在执行随机森林之前,我们需要删除我们在执行决策树时添加的额外预测列。
test$pred<-NULL
在随机森林中,我们不需要将数据分成训练数据和测试数据,我们直接在整个数据上生成模型。为了生成模型,我们需要使用随机森林库
# Set.seed通过限制permutation来控制随机性。
set.seed(100)
model_rf<-randomForest(target~.,data = heart)
model_rf
在图上绘制出随机森林与误差的关系。
plot(model_rf)
红线代表没有心脏病的MCR,绿线代表有心脏病的MCR,黑线代表总体MCR或OOB误差。总体误差率是我们感兴趣的,结果不错。
在进行了各种分类技术并考虑到它们的准确性后,我们可以得出结论,所有模型的准确性都在76%到84%之间。其中,随机森林的准确率略高,为83.5%。
本文摘选 《 R语言逻辑回归、Naive Bayes贝叶斯、决策树、随机森林算法预测心脏病 》 ,点击“阅读原文”获取全文完整资料。
点击标题查阅往期内容
R语言逻辑回归logistic模型分析泰坦尼克titanic数据集预测生还情况R语言是否对二分连续变量执行逻辑回归 R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据 R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析 R语言基于Bagging分类的逻辑回归(Logistic Regression)、决策树、森林分析心脏病患者 R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险 R语言用局部加权回归(Lowess)对logistic逻辑回归诊断和残差分析R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化 R语言用线性模型进行臭氧预测:加权泊松回归,普通最小二乘,加权负二项式模型,多重插补缺失值R语言Bootstrap的岭回归和自适应LASSO回归可视化 R语言中回归和分类模型选择的性能指标 R语言多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分析 R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据 R语言计量经济学:虚拟变量(哑变量)在线性回归模型中的应用 R语言 线性混合效应模型实战案例 R语言混合效应逻辑回归(mixed effects logistic)模型分析肺癌数据 R语言如何用潜类别混合效应模型(LCMM)分析抑郁症状 R语言基于copula的贝叶斯分层混合模型的诊断准确性研究 R语言建立和可视化混合效应模型mixed effect model R语言LME4混合效应模型研究教师的受欢迎程度 R语言 线性混合效应模型实战案例 R语言用Rshiny探索lme4广义线性混合模型(GLMM)和线性混合模型(LMM) R语言基于copula的贝叶斯分层混合模型的诊断准确性研究 R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题 基于R语言的lmer混合线性回归模型 R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型 R语言分层线性模型案例 R语言用WinBUGS 软件对学术能力测验(SAT)建立分层模型 使用SAS,Stata,HLM,R,SPSS和Mplus的分层线性模型HLM R语言用WinBUGS 软件对学术能力测验建立层次(分层)贝叶斯模型 SPSS中的多层(等级)线性模型Multilevel linear models研究整容手术数据 用SPSS估计HLM多层(层次)线性模型模型
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。