随机森林回归-累积MSE?

时间:2019-03-16 14:49:57

标签: r machine-learning random-forest

我是Random Forests的新手,我对回归有疑问。我正在使用R包randomForests计算RF模型。

我的最终目标是选择对预测连续性状重要的变量集,因此我正在计算一个模型,然后删除平均准确度下降最低的变量,然后计算一个新模型,依此类推。这适用于RF分类,我使用了来自预测(训练集),开发和验证数据集的OOB错误对模型进行了比较。现在,通过回归,我想根据解释的%variation和MSE比较模型。

我正在评估MSE和%var的结果,当使用model$predicted的预测手动计算时,我得到的结果完全相同。但是当我执行model$mse时,显示的值与最后计算的树的MSE值相对应,%var的解释也是如此。

作为示例,您可以在R中尝试以下代码:

library(randomForest)
data("iris")
head(iris)

TrainingX<-iris[1:100,2:4] #creating training set - X matrix
TrainingY<-iris[1:100,1]  #creating training set - Y vector

TestingX<-iris[101:150,2:4]  #creating test set - X matrix
TestingY<-iris[101:150,1]  #creating test set - Y vector

set.seed(2)

model<-randomForest(x=TrainingX, y= TrainingY, ntree=500, #calculating model
                    xtest = TestingX, ytest = TestingY)

#for prediction (training set)

pred<-model$predicted

meanY<-sum(TrainingY)/length(TrainingY)

varpY<-sum((TrainingY-meanY)^2)/length(TrainingY)

mseY<-sum((TrainingY-pred)^2)/length(TrainingY)

r2<-(1-(mseY/varpY))*100

#for testing (test set)

pred_2<-model$test$predicted

meanY_2<-sum(TestingY)/length(TestingY)

varpY_2<-sum((TestingY-meanY_2)^2)/length(TestingY)

mseY_2<-sum((TestingY-pred_2)^2)/length(TestingY)

r2_2<-(1-(mseY_2/varpY_2))*100

training_set_mse<-c(model$mse[500], mseY)
training_set_rsq<-c(model$rsq[500]*100, r2)
testing_set_mse<-c(model$test$mse[500],mseY_2)
testing_set_rsq<-c(model$test$rsq[500]*100, r2_2)

c<-cbind(training_set_mse,training_set_rsq,testing_set_mse, testing_set_rsq)
rownames(c)<-c("last tree", "by hand")
c
model

运行此代码后,您将获得一个表,其中包含MSE和%var说明(也称为rsq)的值。第一行称为“最后一棵树”,其中包含森林中第500棵树的MSE和%var的值。第二行称为“手动”,它包含基于向量model$predictedmodel$test$predicted在R中计算的结果。

所以,我的问题是:

1-是否以某种方式累积了树木的预测?还是它们彼此独立? (我以为他们是独立的)

2-是否将最后一棵树视为所有其他树的平均值?

3-为什么对RF模型(调用model时出现在主板上)的MSE和%var的解释与第500树中的解释相同(请参阅表的第一行)?向量model$msemodel$rsq是否包含累积值?

在最后一次编辑后,我发现了来自Andy Liaw(软件包的创建者之一)的帖子,其中说MSE和%var的解释实际上是累积的!:https://stat.ethz.ch/pipermail/r-help/2004-April/049943.html

1 个答案:

答案 0 :(得分:0)

不确定我了解您的问题是什么;我还是试试看...

  

1-是否以某种方式累积了树木的预测?还是他们   彼此独立? (我以为他们是独立的)

您的想法正确;树木彼此独立,因此它们的预测确实是独立的。实际上,这是RF模型的关键优势,因为它允许并行实现。

  

2-是否将最后一棵树视为所有其他树的平均值?

;如上所述,所有树都是独立的。

  

3-如果每棵树都能得到预测,我该如何获取所有树的矩阵,因为我需要为森林解释MSE和%var?

鉴于上面的代码,您在这里开始真正不清楚的地方;您说您需要的MSE和r2正是您在mseYr2中已经计算的:

mseY
[1] 0.1232342

r2
[1] 81.90718

毫无疑问,它们是model报告的值:

model
# result:

Call:
 randomForest(x = TrainingX, y = TrainingY, ntree = 500) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 0.1232342
                    % Var explained: 81.91

所以我不确定我是否真的能看到您的问题,或者这些值与“所有树木的矩阵”有什么关系……

  

但是当我做model$mse时,显示的值对应于该值   最后一棵树的MSE的百分比,%var也是如此   解释。

最肯定model$mse是一个长度等于树数(此处为500)的向量,其中包含每棵树的MSE; (请参见下面的UPDATE)我在实践中从未见过任何使用(类似model$rsq):

length(model$mse)
[1] 500

length(model$rsq)
[1] 500

更新:对OP本身表示敬意(请参阅评论),他们发现model$msemodel$rsq中的数量确实是累积( !);来自软件包维护者Andy Liaw的旧(2004)线程,Extracting the MSE and % Variance from RandomForest

  

几种方法:

     
      
  1. 阅读?randomForest,尤其是“值”部分。
  2.   
  3. 看看str(myforest.rf)。
  4.   
  5. 看看print.randomForest。
  6.   
     

如果森林有100棵树,则mse和rsq是具有100的向量   每个元素,第i个元素是森林的mse(或rsq)   由第一批i树组成。所以最后一个元素是mse(或   rsq)。