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
我会使用插入符号包,但是我有一些超参数超出插入符号的超参数,我宁愿不在此时在插入符号中构建我自己的自定义模型。我在Windows机器上,因为我知道这会影响使用哪个并行后端。
如果我这样做,我开始生产的4个集群中的每个集群都会产生3个工人,总共有12个工人在忙碌吗?或者我只能同时使用4个核心?
答案 0 :(得分:0)
我相信这会做你想要的。 foreach循环将运行四个gbm实例,每个实例将使用makeCluster创建一个三节点集群。所以你实际上有16名工人,但只有12名工人在任何时候都会进行严肃的计算。你必须小心嵌套并行性,但我认为这样可行。