r - 随机森林回归 - 累积 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$mse
或model$rsq
包含累积值吗?
在最后一次编辑之后,我发现 Andy Liaw(包的创建者之一)的这篇文章说 MSE 和 %var 解释实际上是累积的!:https ://stat.ethz.ch/pipermail/r-help/ 2004 年 4 月/049943.html。
解决方案
不确定我是否理解您的问题;不过我会试一试...
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:
几种方式:
- 阅读 ?randomForest,尤其是“价值”部分。
- 查看 str(myforest.rf)。
- 查看 print.randomForest。
如果森林有 100 棵树,则 mse 和 rsq 是每个具有 100 个元素的向量,第 i 个元素是由前 i 个树组成的森林的 mse(或 rsq)。所以最后一个元素是整个森林的mse(或rsq)。
推荐阅读
- java - Sort .txt data in a special way in java
- python - 熊猫没有替换大型数据框中的字符
- python - Django 动态生成序列化器
- session - 使用多个域的多租户会话管理
- unit-testing - Angular 11 单元测试代码覆盖率现已突破
- python - 如何从python中的文件文件夹中获取列表列表?
- leaflet - 手绘传单(手机)
- visual-studio-code - 如何将 bundle.js 或其他构建文件排除在 Visual Studio 代码搜索结果之外?
- python - 模块命名重叠
- javascript - 如何在 javascript 中访问对象中的值?