1

R 中的 gbm 包有一个方便的特性,即通过将每个折叠发送到它自己的节点来并行化交叉验证。我想构建在一系列超参数上运行的多个交叉验证的 GBM 模型。理想情况下,因为我有多个内核,我还可以并行构建这些多个模型。理论上,我可以使用 12 个内核同时构建 4 个模型,每个模型都使用 3 倍验证。像这样的东西:

tuneGrid <- expand.grid(
        n_trees = 5000, 
        shrink = c(.0001),
        i.depth = seq(10,25,5),
        minobs = 100,
        distro = c(0,1) #0 = bernoulli, 1 = adaboost
        )
cl <- makeCluster(4, outfile="GBMlistening.txt")
registerDoParallel(cl) #4 parent cores to run in parallel
err.vect <- NA #initialize
system.time(
err.vect <- foreach (j=1:nrow(tuneGrid), .packages=c('gbm'),.combine=rbind) %dopar% {
        fit <- gbm(Label~., data=training, 
            n.trees = tuneGrid[j, 'n_trees'], 
            shrinkage = tuneGrid[j, 'shrink'],
            interaction.depth=tuneGrid[j, 'i.depth'], 
            n.minobsinnode = tuneGrid[j, 'minobs'], 
            distribution=ifelse(tuneGrid[j, 'distro']==0, "bernoulli", "adaboost"),
            w=weights$Weight,
            bag.fraction=0.5,
            cv.folds=3,
            n.cores = 3) #will this make 4X3=12 workers?
        cv.test <- data.frame(scores=1/(1 + exp(-fit$cv.fitted)), Weight=training$Weight, Label=training$Label)
        print(j) #write out to the listener
        cbind(gbm.roc.area(cv.test$Label, cv.test$scores), getAMS(cv.test), tuneGrid[j, 'n_trees'], tuneGrid[j, 'shrink'], tuneGrid[j, 'i.depth'],tuneGrid[j, 'minobs'], tuneGrid[j, 'distro'], j )
}
)
stopCluster(cl) #clean up after ourselves

我会使用 caret 包,但是我有一些超参数超出了 caret 中的默认值,而且我现在不希望在 caret 中构建我自己的自定义模型。我在 Windows 机器上,因为我知道这会影响使用哪个并行后端。

如果我这样做,我启动的 4 个集群中的每一个是否会产生 3 个工作人员,总共有 12 个工作人员离开?还是我一次只能有 4 个内核工作?

4

1 回答 1

0

我相信这会做你想要的。foreach 循环将运行四个 gbm 实例,每个实例将使用 makeCluster 创建一个三节点集群。所以你实际上会有 16 名工人,但任何时候只有 12 名工人会执行严肃的计算。您必须小心嵌套并行性,但我认为这会起作用。

于 2014-08-28T13:04:23.043 回答