3

在 Windows 上使用 R 中的集群时,我一直在尝试找到一种简单的方法将结果从集群传输到主服务器。如果结果是一个数组或一个简单的数字,foreach / %dopar% 语句的 .combine 选项会处理这个问题,但是如果结果是一个复杂的对象,让这样一个 randomForest 模型,如何从从属集群转移整个模型还给主人?

我尝试:assing withenv=.Global但它在我的 Windows 7 上不起作用。

最后,我通过将对象保存到文件来解决问题。然后主人可以恢复对象。如果有人知道更优雅的方式或为什么 assing 不起作用,我很感激评论。

示例代码:

print(" paralelize with 8 cores ------------------------------")
library(doSNOW)
cl<-makeCluster(8)
registerDoSNOW(cl)
clusterEvalQ(cl, library(randomForest))
clusterExport(cl, "x")
clusterExport(cl, "y")
clusterExport(cl, "x.selected")

makeModel <- function(i){
  m <- randomForest(x,x.selected[i,],mtry=250,sampsize=3200,ntree = 3000,do.trace=TRUE) 
  eval(parse(text = paste("model_",i," <- m",sep="")))
  eval(parse( text =paste("save(model_", i, ", file =\"model_", i, ".Rdata\")",sep="" ) ))
}

foreach(i = 1:length(x.selected[,1]),.verbose = TRUE ) %dopar% makeModel(i)
stopCluster(cl)

foreach(i = 1:length(x.selected[,1]),.verbose = TRUE ) %do% 
load(paste("model_",i,".RData",sep=""))
4

1 回答 1

4

如果您不指定 .combine 函数,foreach 将返回一个列表,以便像 clusterApply 函数一样处理任意对象。许多 foreach 示例使用.combine="c",但这不适用于 randomForest 模型对象。如果 foreach 循环的主体评估为 randomForest 模型对象,则 foreach 将返回这些对象的列表。

这是 foreach 包中 randomForest 示例的简化版本,它返回列表中的模型对象,然后将它们组合起来。我还修改了它以使用 doSNOW 包,如您的示例所示:

library(doSNOW)
library(randomForest)
cl <- makeCluster(8)
registerDoSNOW(cl)
nr <- 1000
x <- matrix(runif(100000), nr)
y <- gl(2, nr/2)
rf <- foreach(ntree=rep(125, 8), .packages='randomForest') %dopar% {
  randomForest(x, y, ntree=ntree)
}
crf <- do.call('combine', rf)
print(crf)
stopCluster(cl)
于 2013-03-22T15:22:09.653 回答