![](/img/trans.png)
[英]Random forest cross validated k fold with caret package R best auc
[英]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)
我的回应太冗长,无法发表评论,希望我能帮助您。 这是上面评论中要点的摘要。
一般的想法是,随着树数的增加,您的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.