随机森林_R代码及用法

随机森林(Random Forests)简介

Nilsson在1965年提出:由多位专家组合而成,按一些特定的方式(如投票法,权重法)整合各位专家的意见进行决策,其得到的结果会比只有单个专家的效果更好。由于每位专家的擅长之处不同,因此通过组合的机制可以让专家之间彼此互补,得到更好的结果。
随机森林(Random Forests)属于套袋法的一种,是基于决策树所建立的,结合多个决策树的预测结果,而每棵树都是根据随机森林的随机向量的值所建立的。
随机森林在影响因素探讨上,现有研究表明,随机森林不需要估计一般回归分析面临的多元共线性的问题,不需要做变量选择,便于计算变量的非线性作用,而且可以评估自变量的重要性。

张雷, 王琳琳, 张旭东, 等. 随机森林算法基本思想及其在生态学中的应用: 以云南松分布模拟为例. 生态学报, 2014, 34(3): 650-659.

随机森林的估计过程
1)指定m值,即随机产生m个变量用于节点上的二叉树,二叉树变量的选择仍然满足节点不纯度最小原则;
2)应用Bootstrap自助法在原数据集中有放回地随机抽取k个样本集,组成k棵决策树,而对于未被抽取的样本用于单棵决策树的预测;
3)根据k个决策树组成的随机森林对待分类样本进行分类或预测,分类的原则是投票法,预测的原则是简单平均。
随机森林的两个重要参数:
1.树节点预选的变量个数:单棵决策树决策树的情况。
2.随机森林中树的个数:随机森林的总体规模。
随机森林模型评价因素
1)每棵树生长越茂盛,组成森林的分类性能越好;
2)每棵树之间的相关性越差,或树之间是独立的,则森林的分类性能越好。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
  对于分类问题(将某个样本划分到某一类),也就是离散变量问题,CART使用Gini值作为评判标准。定义为Gini=1-∑(P(i)*P(i)),P(i)为当前节点上数据集中第i类样本的比例。例如:分为2类,当前节点上有100个样本,属于第一类的样本有70个,属于第二类的样本有30个,则Gini=1-0.7×07-0.3×03=0.42,可以看出,类别分布越平均,Gini值越大,类分布越不均匀,Gini值越小。
在寻找最佳的分类特征和阈值时,评判标准为:argmax(Gini-GiniLeft-GiniRight),即寻找最佳的特征f和阈值th,使得当前节点的Gini值减去左子节点的Gini和右子节点的Gini值最大。

研究数据

iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的各50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
该数据集包含了4个属性:
& Sepal.Length(花萼长度),单位是cm;
& Sepal.Width(花萼宽度),单位是cm;
& Petal.Length(花瓣长度),单位是cm;
& Petal.Width(花瓣宽度),单位是cm;
种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
ris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类,本文将利用R中的Random Forests包来对iris数据进行分类、预测和变量重要性判断,并对预测结果进行检验。
用法如下:

1. 安装包与加载数据

 ##library packages
> library(randomForest)
randomForest 4.6-14
Type rfNews() to see new features/changes/bug fixes.
> ##import data 
> data("iris")
> #view data 
> head(iris) #view six rows of the data
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> summary(iris) #summary data
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

2. 数据分类
将数据分为训练数据集(80%)和测试数据集(20%)

#divid data
ind <- sample(2,nrow(iris),replace = TRUE,prob = c(0.8,0.2))
train_data <- iris[ind==1,] #训练数据集
test_data <- iris[ind==2,] #测试数据集

3. 随机森林简单用法

>rf_sample <- randomForest(Species~.,data = train_data,ntree=100)
> irisPred <- predict(rf_sample,newdata=test_data)
> test_data$SP_pr <- irisPred
> test_data
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species      SP_pr
5            5.0         3.6          1.4         0.2     setosa     setosa
19           5.7         3.8          1.7         0.3     setosa     setosa
32           5.4         3.4          1.5         0.4     setosa     setosa
33           5.2         4.1          1.5         0.1     setosa     setosa
50           5.0         3.3          1.4         0.2     setosa     setosa
51           7.0         3.2          4.7         1.4 versicolor versicolor
52           6.4         3.2          4.5         1.5 versicolor versicolor
53           6.9         3.1          4.9         1.5 versicolor versicolor
64           6.1         2.9          4.7         1.4 versicolor versicolor
74           6.1         2.8          4.7         1.2 versicolor versicolor
75           6.4         2.9          4.3         1.3 versicolor versicolor
84           6.0         2.7          5.1         1.6 **versicolor  virginica**
87           6.7         3.1          4.7         1.5 versicolor versicolor
91           5.5         2.6          4.4         1.2 versicolor versicolor
95           5.6         2.7          4.2         1.3 versicolor versicolor
99           5.1         2.5          3.0         1.1 versicolor versicolor
104          6.3         2.9          5.6         1.8  virginica  virginica
110          7.2         3.6          6.1         2.5  virginica  virginica
111          6.5         3.2          5.1         2.0  virginica  virginica
112          6.4         2.7          5.3         1.9  virginica  virginica
117          6.5         3.0          5.5         1.8  virginica  virginica
121          6.9         3.2          5.7         2.3  virginica  virginica
126          7.2         3.2          6.0         1.8  virginica  virginica
136          7.7         3.0          6.1         2.3  virginica  virginica

对比变量Spcies和预测变量SP_pr可以发现,该模型预测的正确率为23/24=95.83%
随机森林高级用法
4. 寻找最优参数mytree

> ##寻找最优mytree
> n <- length(names(train_data))
> rate=1 #设置模型误判率向量初始值
> for (i in 1:(n-1)) {
+   set.seed(1234)
+   rf_train <- randomForest(Species~.,data = train_data,mytree=i,ntree=1000)
+   rate[i] <- mean(rf_train$err.rate)  #计算基于OOB数据的模型误判率均值
+   print(rf_train)
+ }

Call:
 randomForest(formula = Species ~ ., data = train_data, mytree = i,      ntree = 1000) 
               Type of random forest: classification
                     Number of trees: 1000
No. of variables tried at each split: 2

        OOB estimate of  error rate: 3.97%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         45          0         0  0.00000000
versicolor      0         36         3  0.07692308
virginica       0          2        40  0.04761905

Call:
 randomForest(formula = Species ~ ., data = train_data, mytree = i,      ntree = 1000) 
               Type of random forest: classification
                     Number of trees: 1000
No. of variables tried at each split: 2

        OOB estimate of  error rate: 3.97%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         45          0         0  0.00000000
versicolor      0         36         3  0.07692308
virginica       0          2        40  0.04761905

Call:
 randomForest(formula = Species ~ ., data = train_data, mytree = i,      ntree = 1000) 
               Type of random forest: classification
                     Number of trees: 1000
No. of variables tried at each split: 2

        OOB estimate of  error rate: 3.97%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         45          0         0  0.00000000
versicolor      0         36         3  0.07692308
virginica       0          2        40  0.04761905

Call:
 randomForest(formula = Species ~ ., data = train_data, mytree = i,      ntree = 1000) 
               Type of random forest: classification
                     Number of trees: 1000
No. of variables tried at each split: 2

        OOB estimate of  error rate: 3.97%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         45          0         0  0.00000000
versicolor      0         36         3  0.07692308
virginica       0          2        40  0.04761905
> rate
[1] 0.04167252 0.04167252 0.04167252 0.04167252

可以发现mytree参数从1至4对模型的结果没有影响,所以mytree参数值在该模型中可以不用设置
5. 寻找最佳参数ntree
可以将ntree值设置为1000,观察模型误差,如下图,可以发现当ntree>80时,误差(error)不再变化,所以ntree在该模型中设置为80即可

rf_1 <- randomForest(Species~.,data = train_data,ntree=1000)
plot(rf_1) #绘制模型误差与ntree的关系图

在这里插入图片描述
6. 构建模型
综上,ntree参数不用设置,mytree参数设置为80,开始构建模型

rf_1 <- randomForest(Species~.,data = train_data,ntree=80,importance=TRUE)

7. 模型预测

扫描二维码关注公众号,回复: 11387574 查看本文章
> Species_pre_rf1 <- predict(rf_1,newdata = test_data)
> Species_pre_rf1
         5         19         32         33         50         51         52         53         64         74 
    setosa     setosa     setosa     setosa     setosa versicolor versicolor versicolor versicolor versicolor 
        75         84         87         91         95         99        104        110        111        112 
versicolor  virginica versicolor versicolor versicolor versicolor  virginica  virginica  virginica  virginica 
       117        121        126        136 
 virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica

8. 变量重要性
变量重要性如下图,可知对于鸢尾花数据来讲,根据花萼和花瓣的长度及宽度来判断花的类型,花瓣的重要性高于花萼,即通过花瓣的长度和宽度更容易判断花的类型。

par(mfrow=c(1,2))
rf_1 <- randomForest(Species~.,data = train_data,ntree=100,importance=TRUE)
importance(rf_1,type = 1)[,1] %>% barplot(cex.names=0.8,main = " MeanDecreaseAccuracy")
importance(rf_1,type = 2)[,1] %>% barplot(cex.names=0.8,main = " MeanDecreaseGini")

在这里插入图片描述
9. 模型检验

> pp <- table(Species_pre_rf1,test_data$Species)
> accrucy_rf1 <- sum(diag(pp))/length(test_data$Species)
> accrucy_rf1
[1] 0.9583333

可知模型预测准确率为95.83%。

猜你喜欢

转载自blog.csdn.net/qingchen98/article/details/106868272