首页 > 解决方案 > 随机森林回归 - 累积 MSE?

问题描述

我是随机森林的新手,我有一个关于回归的问题。我正在使用 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 值。第二行称为“手动”,它包含在 R 中基于向量model$predicted和计算的结果model$test$predicted

所以,我的问题是:

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

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

3- 为什么对 RF 模型的 MSE 和 %var 解释(在您调用时显示在主板上model)与第 500 棵树中的相同(见表的第一行)?向量model$msemodel$rsq包含累积值吗?

在最后一次编辑之后,我发现 Andy Liaw(包的创建者之一)的这篇文章说 MSE 和 %var 解释实际上是累积的!:https ://stat.ethz.ch/pipermail/r-help/ 2004 年 4 月/049943.html

标签: rmachine-learningrandom-forest

解决方案


不确定我是否理解您的问题;不过我会试一试...

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

你想对了;这些树相互独立,因此它们的预测确实是独立的。事实上,这是 RF 模型的一个关键优势,因为它允许并行实现。

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

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

3-如果每棵树都有一个预测,我怎样才能得到所有树的矩阵,因为我需要的是为森林解释的 MSE 和 % var?

鉴于您上面的代码,这就是您所要求的内容开始变得非常不清楚的地方;你说你需要的 MSE 和 r2 正是你已经在计算的,mseY并且r2

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;(请参阅下面的更新)我在实践中从未见过任何用途(类似地model$rsq):

length(model$mse)
[1] 500

length(model$rsq)
[1] 500

更新:对 OP 本人表示敬意(见评论),他发现其中的数量model$mse确实model$rsq累积的(!);来自包维护者 Andy Liaw 的旧(2004 年)线程,从 RandomForest 中提取 MSE 和 % Variance

几种方式:

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

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


推荐阅读