2

次のコードで再現可能なforeachループを作成する方法を見つけたと思いましたdoSNOW

library(foreach)
library(doSNOW)
library(parallel)
ncores <- 2
cl <- makeCluster(ncores)
registerDoSNOW(cl)

foreach(i=1:ncores) %dopar% {
  set.seed(i)
  rnorm(1)
}

stopCluster(cl)

foreach ループ内でシードを使用したため、(コンピューター/OS に関係なく) 常に同じ結果が得られます。

[[1]]
[1] -0.6264538

[[2]]
[1] -0.8969145

しかし、randomForest 関数を使用すると、OS によって異なる結果が得られます。

library(foreach)
library(doSNOW)
library(parallel)
library(randomForest)
set.seed(123)
ncores <- 2
cl <- makeCluster(ncores)
registerDoSNOW(cl)
nr <- 1000
x <- matrix(runif(100000), nr)
y <- gl(4, nr/4)

trainX <- x[1:800,]
trainY <- y[1:800]

testX <- x[801:nrow(x),]
testY <- y[801:length(y)]

rf <- foreach(i=1:ncores, ntree=rep(100, ncores), .packages='randomForest', .combine=combine) %dopar% {
  set.seed(i)
  randomForest(trainX, trainY, ntree=ntree)
}
stopCluster(cl)

pred <- predict(rf, new=testX)

各Windowsコンピューター(2台のWindowsコンピューターを試しました)で

R version 3.0.1 (2013-05-16)
Platform: i386-w64-mingw32/i386 (32-bit)

次の出力が得られました

table(pred)
 1  2  3  4 
60 68 72  0 

Linuxコンピューターで同じコードを実行します(2台のLinuxコンピューターを試しました)

R version 2.15.3 (2013-03-01)
Platform: x86_64-pc-linux-gnu (64-bit)

次の出力が得られました

table(pred)
 1  2  3  4 
69 58 73  0 

foreach ループ内でシードを使用したので、同じ結果が得られるはずだと思っていましたが、同じ OS のコンピューターでは同じ結果しか得られませんでした。これが でのみ発生し、 では発生しないのはなぜrandomForestですかrnorm? doSNOWWindows コンピューターと Linux コンピューターの間で同じ結果を得るために何かを行うことはできますか? を使用した方が良いことはわかっていますが、可能であれば でdoRNG同じ結果を得たいと思います...doSNOW

4

0 に答える 0