R插入符随机森林

R caret randomforest

使用 caret 包中训练的默认值,我正在尝试为数据集 xtr2 (dim(xtr2): 765 9408) 训练随机森林模型。问题是它需要太长的时间(一次培训超过一天)来适应这个功能。据我所知,train 默认使用 bootstrap 采样(25 次)和 mtry 的三个随机选择,那么为什么要花这么长时间? 请注意,我需要训练 rf,每次 运行 三次(因为我需要对具有相同数据的不同随机森林模型的结果进行平均),大约需要三天时间,我需要 运行 10 个不同样本的代码,所以我需要 30 天才能得到结果。

我的问题是如何让它更快?

  1. 改变train的默认值可以减少运行时间吗?例如使用 CV 进行训练?

  2. 使用 caret 包进行并行处理有帮助吗?如果可以,如何实现?

  3. 随机森林包的tuneRF可以修改时间吗?

这是代码:

rffit=train(xtr2,ytr2,method="rf",ntree=500)
rf.mdl =randomForest(x=xtr2,y=as.factor(ytr2),ntree=500,
                     keep.forest=TRUE,importance=TRUE,oob.prox =FALSE ,
                     mtry = rffit$bestTune$mtry)

谢谢,

我对你的问题的看法:

  1. 是的!但是不要忘记,您还可以控制 caret 用于调整参数的搜索网格;在这种情况下,mtry。我不确定 mtry 的默认搜索网格是什么,但请尝试以下操作:

    ctrl <- trainControl("cv", number = 5, verboseIter = TRUE)

    set.seed(101) # 重现性

    rffit <- train(xtr2, ytr2, method = "rf", trControl = ctrl, tuneLength = 5)

  2. 是的!请参阅 caret 网站:http://topepo.github.io/caret/parallel-processing.html

  3. 是也不是! tuneRF 简单地使用 OOB 错误来找到 mtry 的最佳值(randomForest 中唯一的调整参数)。使用交叉验证往往会更好地工作并产生更诚实的模型性能估计。 tuneRF 可能需要很长时间,但应该比 k 折交叉验证更快。

总的来说,caret的在线手册还是不错的:http://topepo.github.io/caret/index.html

祝你好运!

您使用 train 仅用于确定 mtry。我会跳过 train 步骤,并保持默认 mtry:

rf.mdl =randomForest(x=xtr2,y=as.factor(ytr2),ntree=500,
                    keep.forest=TRUE,importance=TRUE,oob.prox =FALSE)

我强烈怀疑 3 个不同的 运行 是个好主意。

如果你做 10 次交叉验证(我不确定是否应该这样做,因为验证是随机森林中根深蒂固的),如果你时间不够,10 个部分太多了。 5份就够了。

最后,randomForest的时间与nTree成正比。设置 nTree=100,您的程序将 运行 快 5 倍。

我还要补充一点,主要问题是速度,caret 中还有其他几个随机森林实现,其中许多比原来的 randomForest 快得多出了名的慢。我发现 ranger 是一个不错的选择,可以满足我非常简单的需求。

这是一个不错的 summary of the random forest packges in R。其中许多已经 caret

另外考虑一下,这里有一个有趣的 study of the performance of ranger vs rborist,您可以在其中了解样本大小和特征之间的权衡如何影响性能。