3

WindowsのRでクラスターを使用するとき、クラスターからマスターに結果を転送する簡単な方法を見つけようとしていました。結果が配列または単純な数値の場合、foreach /%dopar%ステートメントの.combineオプションがこれを処理しますが、結果が複雑なオブジェクトの場合、そのようなrandomForestモデルを許可し、モデル全体をスレーブクラスターから転送する方法マスターに戻りますか?

私は試してみました:で評価しenv=.Globalますが、私のWindows7では機能しません。

最後に、オブジェクトをファイルに保存することで回避します。その後、マスターはオブジェクトを回復できます。誰かがもっとエレガントな方法を知っているか、なぜ評価がうまくいかないのかを知っているなら、私はコメントに感謝します。

サンプルコード:

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 に答える