首页游戏资讯R语言随机丛林RandomForest、逻辑回回Logisitc揣测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回回Logisitc揣测心脏病数据|附代码数据

misa2 04-13 4次浏览 0条评论

全文链接:

比来我们被客户要求撰写关于揣测心脏病的研究陈述,包罗一些图形和统计输出。

本陈述是对心脏研究的机器进修/数据科学查询拜访阐发。更详细地说,我们的目标是在心脏研究的数据集上成立一些揣测模子,并成立探痛快和建模办法。但什么是心脏研究?

研究纲领

介绍数据集和研究的目标

摸索数据集

可视化

利用Chi-Square独立查验、Cramer's V查验和GoodmanKruskal tau值对数据集停止摸索

揣测模子,Logisitic回回和RandomForest

step()

bestglm()

两个逻辑回回的实例

利用5折穿插验证对模子实例停止评估

变量抉择改进

随机丛林模子

用RandomForest和Logisitc回回停止揣测

利用可视化停止最末的模子摸索

结论和下一步改进

1.简介

我们阅读了关于FHS的材料:

心脏研究是对社区自在生活的人群中心血管疾病病因的持久前瞻性研究。心脏研究是时髦病学的一个里程碑式的研究,因为它是第一个关于心血管疾病的前瞻性研究,并确定了风险因素的概念。

该数据集是FHS数据集的一个相当小的子集,有4240个看测值和16个变量。那些变量如下:

最初是因变量:冠心病(CHD)的10年风险。

那4240条笔录中有3658条是完全的病例,其余的有一些缺失值。

2.领会数据的意义

在每一步之前,要加载所需的库。

require(knitr)

require(dplyr)

require(ggplot2)

require(readr)

require(gridExtra) #闪现多幅图

然后,加载心脏研究的数据集。

2.1 变量和数据集构造的查抄

我们对数据集停止一次查抄。

dim(dataset)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

展开全文

kable(head(dataset))

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

str(dataset)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

##查抄变量的摘要

summary(dataset)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

2.2 数据集的单变量图

生成一个数据集的所有单变量图。

# 需要删除字符、时间和日期等变量

geom_bar(data = dataset,

theme_linedraw()+

#colnames(dataset)

marrangeGrob(grobs=all_plots, nrow=2, ncol=2)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

那是为了获得对变量,对整个问题和数据集的理解,将通过多变量或至少双变量的可视化来实现。

点击题目查阅往期内容

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

数据分享|R语言逻辑回回、Naive Bayes贝叶斯、决策树、随机丛林算法揣测心脏病

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

摆布滑动查看更多

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

01

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

02

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

03

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

04

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

2.3 数据集的双变量图:因变量和揣测因素之间的关系

如今我们能够停止一些双变量的可视化,特殊是为了看到因变量(TenYearCHD)和揣测因素之间的关系。因为图的数量太多,不是所有的一对变量都能被查询拜访到!我们能够在后面的步调中陆续查询拜访。我们能够稍后再回到那一步,深进领会。

下面的代码能够生成因变量的所有双变量图。因为因变量是一个二元变量,所以当揣测变量是定量的时候,我们会有boxplots,或者当揣测变量是定性的时候,我们会有分段的bar图。

for (var in colnames(dataset) ){

if (class(dataset[,var]) %in% c("factor","logical") ) {

ggplot(data = dataset) +

geom_bar( aes_string(x = var,

} else if (class(dataset[,var]) %in% c("numeric","double","integer") ) {

ggplot(data = dataset) +

geom_boxplot()

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

根据我们掌握的情状,男性与TenYearCHD间接相关,因而男性那个变量似乎是一个相对较好的揣测因素。同样,年龄似乎也是一个很好的揣测因素,因为TenYearCHD == TRUE的病人有较高的年龄中位数,其散布几乎类似。相反,差别类此外教导和因变量之间似乎没有关系。目前的抽烟者变量与因变量有略微的关系,因为目前的抽烟者患TenYearCHD的风险略高。

2.4 利用GoodmanKruskal tau查验定性变量之间的关系

然而,除了那些素质上是定性办法的图表外,人们可能期看对那种联系关系有一个数字值。为了有如许的数字丈量,我想利用GoodmanKruskal的tau丈量,那是两个无序因子,即两个分类/名义变量之间的联系关系丈量。在我们那个数据集中的因子变量中,只要教导是_序数变量_,即它的类别有意义。那种丈量办法比Cramer's V或chi-square丈量办法更具信息量。

GKtauData(cat_variables)

plot(dataset)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

能够看出,关于因变量的变异性,揣测因素的阐明力十分小。换句话说,根据Goodman和Kruskal's tau度量,我们的揣测因素和因变量之间几乎没有联系关系。那能够从TenYearCHD一栏的数值中看出。

假设我的GKtau查验准确的话,那对模子来说并非一个好动静。

为了查验那些发现,我们能够用Chi-square查验来查验分类变量与因变量的联系关系的显著性,然后用Phi相关系数来评估可能的联系关系的强度。Phi用于2x2等值表。关于更大的表格,即有更多条理的变量,能够操纵Cramer's V。

chisq.test(table(dataset_cat$p.value ))

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

phi(matrix(table(dataset_cat_variables[,7],

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

希罕的是,当Chi-square的P值如斯之低时,可能的联系关系的显著性为零。那两个测试(Chi-square和Phi相关)在大量的看察中根本上得出不异的成果,因为一个是基于正态散布的,另一个是基于t散布的。

2.5 多重共线性的双变量阐发

该模子的实正问题在于共线性现象。共线性关系发作在两个揣测因子高度相关的情状下。我们需要查抄那种特征,然后陆续成立对数回回模子。

根据Goodman和Kruskal's tau图,我们不该该担忧共线性。但是,有序变量的教导变量呢?Cramer's V查验展现,其强度不大。

# 教导与其他分类变量的Chi square独立性测试

chisq.test(table(education,variables[,x]))$p.value )

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

#将教导变量从头定位到数据集的第一个变量上

assocstats(x = table(dataset_cat_variables[,1], dataset_$cramer ) )

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

没有一个变量展现与教导有很强的联系关系。Cramer's V的更高值是0.145,那在教导和性别之间是相当弱的。

但是诸如currentSmoker和cigsPerDay如许的变量呢?很明显,此中一个是能够揣测的。有一个数字变量和一个分类变量,我们能够把数字变量分红几个类别,然后利用Goodman和Kruskal's tau。GroupNumeric()函数能够搀扶帮助将定量变量转换成定性变量,然而,基于对数据的主看理解,以及之前看到的cigsPerDay的多模态散布,在那里利用cut()函数很随便。

如今让我们查抄一下GKtau的数值

class_list - lapply(X = 1:ncol(dataset_2), function(x) class(dataset_2[,x]))

t - sapply(X = names(class_list) , FUN = function(x) TRUE %in% ( class_list[x] %in% c("factor","logical")) )

dataset_cat_variables_2 - subset(x = dataset_2, select = t )

plot(dataset_2)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

从矩阵图上的tau值及其布景外形,我们能够看到cigsPerDay能够完全阐明currentSmoker的变异性。那其实不希罕,因为假设我们晓得一小我天天抽几收烟就能够断言我们晓得一小我能否是抽烟者!

第二个联系关系是cigsPerDay与男性的关系,但它其实不强烈。因而,前者能够阐明后者的较小的改变性。

鄙人一个数据集中,我把所有定量变量转换成定性/分类变量。如今我们能够有一个全面的矩阵,虽然因为转换,一些信息会丧失。

dataset_3$totChol - GroupNumeric(x = dataset$totChol , n = 5 )

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

我们能够看到,sysBP和diaBP能够揣测prevalentHyp,但不是很强。(0.5摆布)。因而我们能够在模子中保留prevalentHyp。第二点是关于GK tau的输出。

3.揣测模子:Logistic回回和RandomForest

如今是评估模子实例的时候了。在那里,我们把逻辑回回称为模子。

我们有两个实例。

3.1 两个Logistic回回模子实例

# 因为下一步的cv.glm()不克不及处置缺失值。

# 我只保留模子中的完全案例。

dataset_1 - dataset[complete.cases(dataset),]

glm(TenYearCHD ~ . , family = "binomial")

那个模子是基于原始数据集的。出缺失值的笔录被从数据集中省略,模子展现变量男性、年龄、cigsPerDay、totChol、sysBP和葡萄糖是显著的,而prevalentHyp在某种水平上是显著的。

glm(formula = TenYearCHD ~ . , family = "binomial")

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

在第二个模子实例中,重要变量与前一个模子实例不异。

一个十分重要的问题是,若何权衡那两个模子实例的性能以及若何比力它们?有各类办法来权衡性能,但我在那里抉择了5折穿插验证法。

为了停止穿插验证和评估模子实例,我们需要一个成本函数。boot软件包选举的一个函数,是一个简单的函数,它能够根据一个阈值返回错误分类的均匀数。阈值默认设置为0.5,那意味着任何看察到的超越50%的CHD时机都被标识表记标帜为有继续疾病的TRUE病例。从医学的角度来看,我把阈值降低到0.4,如许即便是有40%时机得心脏病的病例,也会被标识表记标帜为承受进一步的医疗存眷。降低阈值,增加了假阳性率,从而增加了医疗费用,但削减了假阴性率,挽救了生命。我们能够利用灵敏度或特异性做为成本函数。此外,也能够利用cvAUC软件包将曲线下面积(AUC)与CV连系起来。

3.2 模子实例的穿插验证评估

model1_cv_delta - cv.glm( model1, cost = cost, K = 5)$delta[1]

kable(data.frame("model1" = model1_cv_delta ,

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

kable(

caption = "CV-Accuracy", digits = 4)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

我们能够看到,两个模子十分类似,然而,模子2展现出略微的优势。准确率确实相当高。但是,让我们看看我们能否能够通过删除一些变量来改进model1。

3.3 通过变量抉择改进模子

我们看一下model1的总结。

summary(model1)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

到如今为行,我们不断假设所有的变量都必需包罗在模子中,除非是共线性的情状。如今,我们被容许通过删除不重要的变量。那里有几种办法,如前向抉择和后向抉择。

例如,后向抉择法是基于不显著变量的P值。裁减陆续停止,曲到AIC展现没有进一步改进。还有stats::step()和bestglm::bestglm()函数来主动停止变量抉择过程。后者的软件包及其次要函数有许多抉择信息原则的选项,如AIC、BIC、LOOCV和CV,而前者的逐渐算法是基于AIC的。

bestglm(Xy = dataset_1 , family = binomial , IC = "BIC")

step(object = model1 )

如今让我们来看看那两个模子和它们的穿插验证误差。

bestglm_bic_model

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

基于BIC的bestglm::bestglm()将模子变量削减到5个:男性、年龄、cigsPerDay、sysBP和葡萄糖。所有的变量都长短常显著的,正如预期的那样。

summary(step_aic_model)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

基于AIC的step()函数将模子变量削减到8个:男性、年龄、cigsPerDay,prevalentStroke、prevalentHyp、totChol、sysBP和glucose。值得重视的是,通过step()找到的更佳模子实例具有不显著的变量。

glm_cv_error - cv.glm(

glmfit = glm(formula

family = binomial, data = dataset_1),

step_cv_error - cv.glm(glmfit = step_aic_model, cost = cost, K = 5)$delta[1]

kable(bestglm_model_cv_error ,

step_model_cv_error )

穿插验证误分类误差

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

kable(data.frame("bestglm() bic model"

"step() aic model"

穿插验证-准确度

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

AIC办法和BIC办法都能产生不异的准确性。该抉择哪种办法呢?我甘愿抉择AIC,因为该模子实例有更多的揣测因素,因而更有洞察力。然而,抉择BIC模子实例也是合理的,因为它更简明。与model1的准确度比拟,我们通过变量抉择在准确度上有0.8475-0.842=0.00550.8475-0.842=0.0055的进步。然而,我们失往了关于其他揣测因子和因变量关系的信息。

3.4 RandomForest模子

到目前为行,我只做了逻辑回回模子。有更多的模子能够用来为当前的问题建模,而RandomForest是一个受欢送的模子。让我们试一试,并将成果与之前的模子停止比力。

#---- 差是每个RF模子实例的CV输出的错误分类率

#---- 每个选定的树的CV错误分类率的最末成果被绘造出来

# 关于差别数量的树,我们计算CV误差。

for (n in seq(50,1000,50))

for (k in 1:5)

rf_dataset_train - dataset_1[fold_seq != k ,]

rf_dataset_test - dataset_1[fold_seq == k , ]

rf_model - randomForest( formula,

kable(rf_df[sort(x = rf_df[,2])

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

#----- 误差基于RandomForest OOB,即RandomForest输出的稠浊矩阵

for (n in seq(50,1000,50)) {

counter - counter + 1

rf_model - randomForest( formula ntree = n, x =

ggplot() +

geom_point(data = rf_df , aes(x = ntree , y = accuracy)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

在那里,我同时利用了CV和out-of-bag(OOB)来评估随机丛林性能。

我们能够看到,在50到1000棵树的范畴内,RandomForest模子的更高精度能够通过设置CV办法的树数等于400来获得。图中的红线展现了我们从逻辑回回模子实例中得到的更佳CV精度。因为OOB的更高准确率高于CV的更高准确率,所以我抉择了CV的准确率,使其愈加隆重。ntree=400的CVaccuracy=0.8486CVaccuracy=0.8486,比更好的逻辑回回模子差0.00020.0002! 然而,假设我们考虑OOB的准确性,那么RandomForest模子比更佳逻辑回回模子好0.00120.0012。

在RF中,模子的准确性有所进步,但代价是失往了可阐明性。RF是一个黑箱,我们无法阐明揣测因子和因变量之间的关系。

3.5 模子对小我数据若何揣测?

那里为了完成那个陈述,我想在一个新的数据集上增加一个揣测部门。该数据集只要一条笔录,此中包罗我本身的小我数据。换句话说,我已经创建了一个模子,我想晓得它能否揣测了我的CHD。

pred_data$年龄 - 31

pred_data$教导 - factor(4, levels = c(1,2,3,4))

pred_data$当前抽烟者 - FALSE

pred_data$每日抽烟量 - 0

pred_data$抗高血压药物 - FALSE

pred_data$时髦性中风 - FALSE

pred_data$时髦性高血压 - FALSE

逻辑回回模子的揣测输出。

glm_BIC_opt - glm(data = dataset_1 , formula ,family = binomial )

predict(glm_BIC_opt, newdata = pred_data)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

随机丛林揣测。

rf_model - randomForest( formula = . ,

predict(rf_model, pred_data)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

因而,如今看来,我没有风险! 然而,正如我之前提到的,那些模子是为了教导和机器进修的理论,而不是为了医学揣测!所以,我认为那些模子是有价值的。

4.最末模子摸索

让我们最初看一下那个模子

dataset_3 - dataset_2[complete.cases(dataset_2),]

dataset_3_GK -

plot(dataset_3_GK)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

ggpplot(data = dataset , text.angle = 0,label.size =2 , order = 0 ) +

scale_colour_manual(values = color)+

scale_fill_manual(values = color)

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

摆布滑动查看更多

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

01

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

02

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

03

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

04

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

成果大多契合预期。根据GKtau值,揣测因子之间的联系关系最小。那恰是我们想要的,以制止共线性现象。

然而,平行坐标仍然展现了一些有趣的点。例如,年龄组与 "十年安康开展 "成果之间的联系关系很有意思。较低的年龄组在TenYearCHD==TRUE中的参与度很低,那意味着年龄与该疾病有正相关。另一方面,与男性比拟,女性(男性==FALSE)在0收烟和[1,20]收烟组的奉献更大。换句话说,男性倾向于抽更多的烟,并且是重度抽烟者。

桑吉图能够产生更好的洞察力,因为我们能够沿着坐标轴看察样本。

5.结论

在那项研究中,为了成立揣测模子,利用了包罗4240个看测值和16个变量的心脏研究的数据集。那些模子旨在揣测十年后的冠心病(CHD)。

在对数据集停止摸索后,操纵逻辑回回和随机丛林模子来成立模子。利用K-Fold Cross-Validation对模子停止了评估。

为了扩展那项研究,能够利用进一步的分类办法,如撑持向量机(SVM)、梯度提拔(GB)、神经收集模子、K-近邻算法,以至决策树。

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

点击文末 “阅读原文”

获取全文完全代码材料。

本文选自《R语言随机丛林RandomForest、逻辑回回Logisitc揣测心脏病数据和可视化阐发》。

R语言随机丛林RandomForest、逻辑回归Logisitc预测心脏病数据|附代码数据

点击题目查阅往期内容

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

无法定位序数5377
生化大逃杀神器指令 冒险岛外挂下载的简单介绍
相关内容
发表评论

游客 回复需填写必要信息