使用doSNOW的并行randomForest具有不同的结果

时间:2013-07-26 12:42:29

标签: linux r foreach parallel-processing random-forest

我以为我找到了一种方法,可以使用以下代码与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循环中使用了种子,所以我总是得到相同的结果(独立于计算机/操作系统),即

[[1]]
[1] -0.6264538

[[2]]
[1] -0.8969145

但是如果我使用randomForest函数,我会得到不同的结果,具体取决于操作系统:

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循环中使用了种子,所以我认为它应该给我相同的结果,但是对于具有相同操作系统的计算机,它只给出了相同的结果。 为什么这只发生在randomForest而不发生在rnorm? 我可以使用doSNOW做一些事情来获得Windows和Linux计算机之间相同的结果吗? 我知道使用doRNG会更好,但如果有可能,我希望doSNOW得到相同的结果......

0 个答案:

没有答案