繁体   English   中英

通过并行计算加速交叉验证的随机森林方法

[英]Speed up cross validated random forest approach by parallel computing

我正在尝试通过并行计算来加快我的随机森林方法的速度。 我的数据集包含20.000行和10列。 可以预测的因变量是一个数值,自变量之间有两个因素(一个具有2个级别,第二个具有504个级别)。

我认为功能火车确实将所有因子变量编码为伪变量,因此在这种情况下不需要解码。

请给我一些有用的建议,如何加快以下代码的速度,我将不胜感激。 下面的解决方案永无止境。 非常感谢。

library(doParallel); library(caret)

set.seed(975)
forTraining <- createDataPartition(DATA$NumVar,
                               p = 3/4)[[1]]
trainingSet <- DATA[forTraining,]
testSet <- DATA[-forTraining,]

controlObject <- trainControl(method = "repeatedcv",
                          repeats = 5,
                          number = 10)
#run model in parallel
cl <- makeCluster(detectCores())
registerDoParallel(cl)

set.seed(669)
rfModel <- train(NumVar ~ .,
             data = trainingSet,
             method = "rf",
             tuneLength = 10,
             ntrees = 1000,
             importance = TRUE,
             trControl = controlObject)
stopCluster(cl)

我的回应太冗长,无法发表评论,希望我能帮助您。 这是上面评论中要点的摘要。

  1. 我们最关心的是- 计算时间
  2. 随机森林计算的一个主要限制- 树数

一般的想法是,随着树数的增加,您的randomforest模型将得到改善(即,较低的误差)。 但是,随着您继续添加树,性能的增加将减少,而计算时间将继续增加。 这样,您就达到了收益递减的地步。 因此, 我们如何确定要使用多少棵树?

好吧,天真的,我们可以简单地将randomForest模型与您提供的调用相匹配。 另一种选择是在ntree上进行交叉验证,但是默认情况下在caret未实现交叉验证,Max Kuhn(作者)在预测模型方面确实了解他的知识。 因此,要开始使用,您在上面提供的通话中将处于正确的轨道:

randomForest(dependentVariable ~ ., data = dataSet, mtry = 522, ntree=3000, importance=TRUE, do.trace=100)

但是,让我们使其可重现并使用mlbench Sonar数据集。

library(mlbench)
data(Sonar)

但是我们目前暂时不在乎变量的重要性,因此我们将其删除。 另外,您的ntree太高而无法启动。 如果您最终需要那么高的价格,我会感到惊讶。 从较低的级别开始,我们有以下内容:

set.seed(825)
rf1 <- randomForest(Class~., data=Sonar, mtry=3, ntree=200, do.trace=25)

> rf1 <- randomForest(Class~., data=Sonar, mtry=3, ntree=200, do.trace=25)
ntree      OOB      1      2
   25:  16.83% 11.71% 22.68%
   50:  18.27% 12.61% 24.74%
   75:  17.31% 17.12% 17.53%
  100:  15.38% 12.61% 18.56%
  125:  15.38% 10.81% 20.62%
  150:  16.35% 13.51% 19.59%
  175:  15.87% 10.81% 21.65%
  200:  14.42%  8.11% 21.65%

如您所见,OOB达到约100棵树的最低点。 但是,如果我不确定或OOB仍在大幅下降,则可以使用大量树来再次运行该调用。 一旦您有了可用的树木数量,就可以使用caret::training调整mtry

如果您确实需要使用大量树(即1000棵树),那么您的代码可能会变慢。 如果您可以访问具有许多处理器和大量RAM的计算机,那么您的并行实现可以提供帮助,但是在更常见的计算机上,运行速度会很慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM