首页 > 解决方案 > R 插入符号:在不同机器上使用并行 rfe 完全可重现的结果

问题描述

我有以下代码使用随机森林作为方法,如果您在同一台机器上以并行模式运行它,它是完全可重现的:

library(doParallel)
library(caret)

recursive_feature_elimination <- function(dat){

  all_preds <- dat[,which(names(dat) %in% c("Time", "Chick", "Diet"))]
  response <- dat[,which(names(dat) == "weight")]

  sizes <- c(1:(ncol(all_preds)-1))

  # set seeds manually
  set.seed(42, kind = "Mersenne-Twister", normal.kind = "Inversion")
  # an optional vector of integers for the size. The vector should have length of length(sizes)+1
  # length is n_repeats*nresampling+1
  seeds <- vector(mode = "list", length = 16)
  for(i in 1:15) seeds[[i]]<- sample.int(n=1000, size = length(sizes)+1)
  # for the last model
  seeds[[16]]<-sample.int(1000, 1)
  seeds_list <- list(rfe_seeds = seeds,
                     train_seeds = NA)

  # specify rfeControl
  contr <- caret::rfeControl(functions=rfFuncs, method="repeatedcv", number=3, repeats=5, 
                             saveDetails = TRUE, seeds = seeds, allowParallel = TRUE)

  # recursive feature elimination caret 
  results <- caret::rfe(x = all_preds, 
                        y = response,
                        sizes = sizes, 
                        method ="rf",
                        ntree = 250, 
                        metric= "RMSE", 
                        rfeControl=contr )


 return(results)


}

dat <- as.data.frame(ChickWeight)

cores <- detectCores()
cl <- makePSOCKcluster(cores, outfile="")
registerDoParallel(cl)
results <- recursive_feature_elimination(dat)
stopCluster(cl)
registerDoSEQ()

我机器上的结果是:

 Variables  RMSE Rsquared   MAE RMSESD RsquaredSD MAESD Selected
         1 39.14   0.6978 24.60  2.755    0.02908 1.697         
         2 23.12   0.8998 13.90  2.675    0.02273 1.361        *
         3 28.18   0.8997 20.32  2.243    0.01915 1.225         

The top 2 variables (out of 2):
   Time, Chick

我正在使用具有一个 CPU 和 4 个内核的 Windows 操作系统。如果代码在使用多核多核 CPU 的 UNIX 操作系统上运行,结果会有所不同。我认为这种行为是由于随机数生成而出现的,这在我的系统和多 CPU 系统之间显然不同。同样的情况也发生在train().

我如何才能获得完全可重现的结果,而不受操作系统的影响,也不受用于并行化的 CPU 和内核数量的影响?

我如何确保相同的随机数用于每个内部进程,rfe并且randomForest无论在并行计算过程中以哪个顺序运行该进程?

每个并行进程如何生成随机数?

标签: randomparallel-processingrandom-forestr-caretrandom-seed

解决方案


推荐阅读