分享

随机森林分析-Random Forest

 科白君 2021-10-03



 知其然必知其所以然”   --科白君


"R实战"专题·第19篇
  编辑 | free傻孩子
  3158字 |8分钟阅读

本期推送内容

随机森林分析是一种使用决策树的方法对变量重要性进行评估的分析方法。相信不少人或多或少的都有所了解。具体随机森林分析的原理可以参考百度百科和R语言实战,本节我们只讲如何在R中实现随机森林分析并绘图。

一般来说,通过随机森林评估其它变量对目标变量的重要性可以因目标变量类型的差异而分为两种类型的随机森林。第一种类型(classification),当目标变量是分组/处理(factors)时,此时通过随机森林分析能够预测分组的准确性(即袋外误差OOB[out-of-big] error的高低)以及其它变量对该分组的重要性;第二种类型(regression),当目标变量是连续(数值)变量时,此时通过随机森林分析能够预测其它变量构成的模型对目标变量的解释量(% Var Explained)以及其它变量对该目标变量的重要性。接下来,我们分别阐述这两种类型的随机森林在R中实现的过程。

1、目标变量为分组/处理

加载所有需要的安装包:
#rm(list=ls())
library(tidyverse)
library("randomForest")
library("rfUtilities")
library("rfPermute")

加载数据如下

load("RFdata1.RData")
head(RFdata3[,1:6])

RFdata3 %>%
  mutate(treatments = as.factor(treatments)) -> RFdata3.1#目标变量转变为factors
set.seed(123)
treat_rf <- randomForest(treatments ~ ., data= RFdata3.1,
                         importance=TRUE,proximity=TRUE)
treat_rf

通过建立500棵决策树,计算结果表明在该组数据中3个处理(downward、in_situ和upward)对数据分类的准确性为63.04%(100-OOB)。

进一步通过置换检验我们可以验证该模型是否显著以及计算更准确模型准确性(100-OOB),代码如下:
set.seed(123)
treat_perm <- rf.significance(treat_rf, RFdata3.1[,-1], nperm=99, ntree=501)
treat_perm

通过置换99次验证表明,该模型的显著性水平为0.01,且分类的准确性为60.87%。

最后检验每一个变量对目标变量的重要性,代码如下:
treat_rfP<- rfPermute(treatments ~ ., data = RFdata3.1, ntree = 500,
                  na.action = na.omit, nrep = 100,num.cores = 1)
treat_dat <- rp.importance(treat_rfP, sort.by = NULL, decreasing = TRUE)
treat_dat[,c("MeanDecreaseAccuracy","MeanDecreaseAccuracy.pval")] %>%
  as_tibble(rownames = "names") %>%
  mutate(label = if_else(MeanDecreaseAccuracy.pval<0.001,"***",
                         if_else(MeanDecreaseAccuracy.pval<0.01,"**",
                                 if_else(MeanDecreaseAccuracy.pval<0.05,"*","ns")))) %>%
  arrange(MeanDecreaseAccuracy) %>%
  mutate(group = if_else(label=="ns","In_sig","Sig"),
         names = forcats::fct_inorder(names)) %>%
  ggplot(aes(x = names, y = MeanDecreaseAccuracy))+
  geom_bar(aes(fill = group),stat = "identity")+
  geom_text(aes(y = MeanDecreaseAccuracy+0.5,label = label))+
  labs(x = "", y = "% Mean decrease accuracy")+
  coord_flip()

MeanDecreaseAccuracy的含义是除去该变量后模型预测的准确度减少多少。结果表明碳氮比对此时的数据分类的准确性影响最大,其次是初始温度(Torigin)。

2、目标变量为连续变量/数值

当目标变量为数值时此时随机森林的类型为回归分析(regression),此时通过随机森林能够计算其它变量构成的模型对目标变量变化的解释量以及其它变量对目标变量的重要性。代码如下:
load("RFdata2.RData")
head(RFdata2)

set.seed(123)
richness_rf <- randomForest(Richness ~ ., data= RFdata2,
                         importance=TRUE,proximity=TRUE)
richness_rf

通过建立500棵决策树,发现模型对目标变量(richness)变化的对的解释量为26.8%。

通过置换检验,检测该模型的显著性代码如下:
set.seed(123)
richness_perm <- rf.significance(richness_rf, RFdata2[,-1], nperm=99, ntree=501)
richness_perm

结果表明模型的显著性为0.01,模型的解释量为25.45%。

最后检测模型中每个变量对目标变量的重要性,代码如下:
set.seed(123)
richness_rfP<- rfPermute(Richness ~ ., data = RFdata2, ntree = 500,
                      na.action = na.omit, nrep = 100,num.cores = 1)
richness_dat <- rp.importance(richness_rfP, sort.by = NULL, decreasing = TRUE)
richness_dat %>%
  as_tibble(rownames = "names") %>%
  data.frame() %>%
  mutate(label = if_else(X.IncMSE.pval < 0.001,"***",
                 if_else(X.IncMSE.pval <0.01,"**",
                         if_else(X.IncMSE.pval<0.05,"*","ns"))),
         X.IncMSE = as.numeric(X.IncMSE)) %>%
  arrange(X.IncMSE) %>%
  mutate(group = if_else(label=="ns","In_sig","Sig"),
         names = forcats::fct_inorder(names)) %>%
  ggplot(aes(x = names, y = X.IncMSE))+
  geom_bar(aes(fill = group),stat = "identity")+
  geom_text(aes(y = X.IncMSE + 1,label = label))+
  labs(x = "", y = "%IncMSE")+
  coord_flip()

%IncMSE指平均增加的均方误差,也就是说去除该变量后,均方误差的增加量。结果表明,pH对物种的丰富度的重要性更高,而其它变量对丰富度的变化均不重要。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多