首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算随机森林的OOB?

如何计算随机森林的OOB?
EN

Stack Overflow用户
提问于 2017-12-24 20:03:43
回答 1查看 16.4K关注 0票数 2

我正在比较一些模型,以获得最好的模型。现在,我想得到随机森林模型的OOB误差,并将其与其他模型的交叉验证误差进行比较。我能做个比较吗?如果可以,如何通过R代码获取OOB错误?

EN

回答 1

Stack Overflow用户

发布于 2017-12-24 20:58:35

要获得R中随机森林模型的OOB,您可以执行以下操作:

代码语言:javascript
复制
library(randomForest)

set.seed(1)
model <- randomForest(Species ~ ., data = iris)

OOB错误在以下位置:

代码语言:javascript
复制
model$err.rate[,1]

其中,第i个元素是直到第i个的所有树的(OOB)错误率。

可以绘制它并检查它是否与为rf模型定义的plot方法中的OOB相同:

代码语言:javascript
复制
par(mfrow = c(2,1))
plot(model$err.rate[,1], type = "l")
plot(model)

OOB对于挑选超参数mtryntree很有用,应该与k倍CV相关,但不应该使用它来比较rf与k倍CV测试的不同类型的模型。OOB是伟大的,因为它几乎是免费的,而不是k倍CV,后者需要运行k次。

在R中运行k倍简历的一种简单方法是:

定义折叠(将5替换为k(大于1的正整数)以运行k -fold CV:

代码语言:javascript
复制
folds <- sample(1:5, size = nrow(iris), replace = T) #5 fold CV

这种方法不会产生相同大小的折叠(特别是对于较小的数据集),这通常不是什么大问题。

代码语言:javascript
复制
table(folds)
#output
 1  2  3  4  5 
30 28 28 33 31 

要解决此问题,请执行以下操作:

代码语言:javascript
复制
folds <- sample(rep(1:5, length.out = nrow(iris)), size = nrow(iris), replace = F)

table(folds)
#output
 1  2  3  4  5 
30 30 30 30 30 

在4个折叠中的每一个上训练模型,并在5号进行预测。在这里,我只返回一个包含预测值和实际值的数据框列表,用户可以自定义调用以返回任何他想要的统计数据。

代码语言:javascript
复制
CV_rf <- lapply(1:5, function(x){ #5 corresponds to the number of folds defined earlier
  model <- randomForest(Species ~ ., data = iris[folds != x,])
  preds <- predict(model,  iris[folds == x,], type="response")
  return(data.frame(preds, real = iris$Species[folds == x]))
  })

您可以使用相同的代码来获得岭模型的性能。

将数据框列表转换为数据框:

代码语言:javascript
复制
CV_rf <- do.call(rbind, CV_rf)

检查准确性

代码语言:javascript
复制
caret::confusionMatrix(CV_rf$preds, CV_rf$real) 
#part of output:
Overall Statistics

               Accuracy : 0.9533         
                 95% CI : (0.9062, 0.981)
    No Information Rate : 0.3333         
    P-Value [Acc > NIR] : < 2.2e-16 

所以这里的准确率是0.9533

而第500个(500在rf中默认适合)的OOB为:

代码语言:javascript
复制
model$err.rate[500,1]
#OOB 
0.04666667 

它们是相同的,完全击败了我的观点,但例如,尝试运行10折CV或3折,你会发现它们是不同的。

另一种方法是使用caretmlr库。我不使用mlr,但是caret非常适合这样的任务。这里是something,让你开始使用插入符号和rf。另外,插入符号有很好的documentation。即使你不打算使用这个包,我也可以推荐它。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47960427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档