使用并行训练带有插入符号的随机森林

Posted

技术标签:

【中文标题】使用并行训练带有插入符号的随机森林【英文标题】:Train random forest with caret using parallel 【发布时间】:2019-06-16 18:36:08 【问题描述】:

我想利用手头的 20 个 CPU 内核在 R 中训练随机森林。我通常使用 randomForest 包的代码是这样的:

rf = randomForest(Pred~., train, ntree=100, importance=TRUE)
rf

因此,我使用具有 11 个级别的因子 Pred 和具有 74 个数字特征和约 84k 观察值的数据框 train 训练了一个包含 100 棵树的森林。

我的想法是通过在我的代码中使用插入符号来加快这一速度(源自example):

cluster <- makeCluster(19)
registerDoParallel(cluster)
trainctrl <- trainControl(method="none", number=1, allowParallel=TRUE)
fit <- train(Driver~., train, method="parRF", trControl=trainctrl, ntree=100)
stopCluster(cluster)
registerDoSEQ()
fit

我将示例中的method=cv 替换为method=none,因为我确实想在整个训练集上进行训练(请参阅documentation)。但是我没有从fit 得到准确度,fit$results 是空的。如果我设置method=oob,那么mtry 的优化就完成了,这也给了我准确度。

有没有一种方法可以简单地使用插入符号并行运行第一个代码 sn-p 而无需任何超参数优化?

【问题讨论】:

我建议使用ranger 包。开箱即用。 method = "ranger" 插入符号。 感谢您的提示,乍一看似乎很有希望。我会调查的。 【参考方案1】:

这是一个老问题,但您可以尝试使用 doMC 包(但它可能无法在 Windows 中运行)。

示例代码:

library(randomForest)
library(caret)
library(e1071)
library(doMC)

# Define the control
trControl <- trainControl(method = "cv",
    number = 10,
    search = "grid")

# Define number of parallel instances you want
registerDoMC(8)

# define parameters for grid search
tuneGrid <- expand.grid(.mtry = c(2: 5))

# train Random Forest model
rf_mtry <- train(TrainSet,yTrain,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    ntree = 300)

print(rf_mtry)

您也可以参考this post。

【讨论】:

以上是关于使用并行训练带有插入符号的随机森林的主要内容,如果未能解决你的问题,请参考以下文章

在 Macbook 中并行执行随机森林的小速度增益(使用 R,插入符号)

并行化随机森林

带有随机森林的 Spark 流程数据框

随机森林 - 插入符号 - 时间序列

带有 doSMP 和 foreach 的并行随机森林大大增加了内存使用量(在 Windows 上)

随机森林