【问题标题】:Depth and OOB error of a randomForest and randomForestSRCrandomForest 和 randomForestSRC 的深度和 OOB 误差
【发布时间】:2020-08-12 03:30:34
【问题描述】:

这是我在 R 中的随机森林和 rfsrc 代码;无论如何在我的 R 代码中包含 n_estimators 和 max_depth 之类的 sklearn 版本?另外,我怎样才能像这样绘制 OBB 误差与树的数量?

set.seed(2234)
tic("Time to train RFSRC fast")
fast.o <- rfsrc.fast(Label ~ ., data = train[(1:50000),],forest=TRUE)
toc()
print(fast.o)

#print(vimp(fast.o)$importance)

set.seed(2367)
tic("Time to test RFSRC fast ")
#data(breast, package = "randomForestSRC")
fast.pred <- predict(fast.o, test[(1:50000),])
toc()
print(fast.pred)


set.seed(3)
tic("RF model fitting without Parallelization")
rf <-randomForest(Label~.,data=train[(1:50000),])
toc()
print(rf)
plot(rf)
varImp(rf,sort = T)
varImpPlot(rf, sort=T, n.var= 10, main= "Variable Importance", pch=16)

rf_pred <- predict(rf, newdata=test[(1:50000),])
confMatrix <- confusionMatrix(rf_pred,test[(1:50000),]$Label)
confMatrix

感谢您的宝贵时间。

【问题讨论】:

  • 这不是一个编程论坛,所以我担心你的问题跑题了。 sklearn 所称的n_estimators 被称为ntree。 rfsrc 有一个nodedepth 参数来控制深度。

标签: r machine-learning python random-forest


【解决方案1】:

你需要设置 block.size=1 ,并且注意采样是没有替换的,你可以查看 rfsrc 的小插图:

与 Breiman 的随机森林不同,这里的默认操作是采样 无需更换。因此袋外(OOB)在技术上意味着 样本外,但出于遗留原因,我们保留了 OOB 一词。

所以使用示例数据集,

library(mlbench)
library(randomForestSRC)
data(Sonar)
set.seed(911)
trn = sample(nrow(Sonar),150)
rf <- rfsrc(Class ~ ., data = Sonar[trn,],ntree=500,block.size=1,importance=TRUE)
pred <- predict(rf,Sonar[-trn,],block.size=1)
plot(rf$err.rate[,1],type="l",col="steelblue",xlab="ntrees",ylab="err.rate",
ylim=c(0,0.5))
lines(pred$err.rate[,1],col="orange")
legend("topright",fill=c("steelblue","orange"),c("test","OOB.train"))

在随机森林中:

library(randomForest)
rf <- randomForest(Class ~ ., data = Sonar[trn,],ntree=500)
pred <- predict(rf,Sonar[-trn,],predict.all=TRUE)

不太确定是否有更容易得到 ntrees 错误:

err_by_tree = sapply(1:ncol(pred$individual),function(i){
apply(pred$individual[,1:i,drop=FALSE],1,
function(i)with(rle(i),values[which.max(lengths)]))
})

err_by_tree = colMeans(err_by_tree!=Sonar$Class[-trn])

然后绘制:

plot(rf$err.rate[,1],type="l",col="steelblue",xlab="ntrees",ylab="err.rate",
    ylim=c(0,0.5))
    lines(err_by_tree,col="orange")
    legend("topright",fill=c("steelblue","orange"),c("test","OOB.train"))

【讨论】:

  • 酷。如果它对你有用:) 你也可以考虑接受stats.stackexchange.com/help/accepted-answer,以表明它解决了你的问题并对其他人有所帮助
  • 当然!我会做。但是,我有一个快速的问题。如果我想为更大的样本绘制图表,比如 5000+,它不起作用。我的样本量是 754590。如何绘制大样本?它适用于 500 个样本!
  • 好的,对于上面的代码,您将其用于 1 棵树的增量。因此,对于 src,您执行 block.size=10 或 20 .. 然后取出 rf$err.rate 矩阵,并将非 NA 子集化.. 这应该很容易做到
  • 对于randomForest,而不是1:ncol(pred$individual) , you would so seq(1,ncol(pred$individual), by=20) for example
  • 希望这可以减少计算点数,然后您可以绘制它。再说一次我没有你的数据,我只能猜测你遇到的障碍是什么。此外,如果这是您现在面临的编程问题,最好将其作为一个单独的问题发布在 stackoverflow 上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2016-02-28
  • 1970-01-01
  • 2016-03-24
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多