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 个内核工作?