R caret randomforest

时间:2016-11-28 16:51:21

标签: r random-forest r-caret

使用插入符号包中列车的默认值,我正在尝试为数据集xtr2(dim(xtr2):765 9408)训练随机森林模型。问题是难以置信地花费太长时间(一次训练超过一天)来适应这种功能。据我所知,火车在其默认情况下使用自举采样(25次)和三次随机选择mtry,那为什么它需要这么长时间呢? 请注意我需要在每次运行中训练rf三次(因为我需要使用相同的数据来表示不同随机森林模型的结果),并且需要大约三天,我需要运行10个不同样本的代码,所以我需要30天才能得到结果。

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

  1. 可以更改列车的默认值,使操作时间减少吗?例如使用CV进行培训?

  2. 可以使用插入符包进行并行处理吗?如果是的话,该如何做?

  3. 随机林包的tuneRF可以对时间进行任何更改吗?

  4. 这是代码:

    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)
    

    谢谢,

3 个答案:

答案 0 :(得分:2)

我对你的问题的看法:

  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倍交叉验证更快。

  4. 总体而言,caret的在线手册非常好:http://topepo.github.io/caret/index.html

    祝你好运!

答案 1 :(得分:2)

您仅使用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倍。

答案 2 :(得分:0)

我还要补充一点,它的主要问题是速度,caret中还有其他几种随机森林实现,其中许多要比原始的randomForest快得多,而原始的ranger却很慢。我发现caret是满足我非常简单需求的不错选择。

这是一个不错的summary of the random forest packges in R。其中许多已经在data() { return { splitDays:[], // :splitDays }; }, mounted() { axios .get(`${process.env.*****}/users?role=***&active=***`) .then(response => ( this.users = response.data, console.log(this.users) )) console.log(this.users) /* for (let splitDayIndex in mySplitDays){ let splitDay= mySplitDays[splitDayIndex] splitDay.class = splitDay.lastname splitDay.label = splitDay.lastname mySplitDays[splitDayIndex]=splitDay } */ }, 中。

还有一个有趣的study of the performance of ranger vs rborist,您可以在其中查看样本大小和特征之间的权衡如何影响性能。