R caret: полностью воспроизводимые результаты с параллельным rfe на разных машинах - PullRequest
0 голосов
/ 22 мая 2019

У меня есть следующий код, использующий случайный лес в качестве метода, который полностью воспроизводим, если вы запускаете его в параллельном режиме на той же машине:

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

Я использую ОС Windows с одним процессором и 4 ядрами. Если код выполняется в ОС UNIX с использованием нескольких процессоров с несколькими ядрами, результат будет другим. Я думаю, что такое поведение проявляется из-за генерации случайных чисел, которая, очевидно, отличается между моей системой и системой с несколькими процессорами. То же самое происходит с train().

Как получить полностью воспроизводимые результаты независимо от ОС и независимо от того, сколько процессоров и ядер используется для распараллеливания?

Как я могу убедиться, что одни и те же случайные числа используются для каждого внутреннего процесса rfe и randomForest независимо от того, в какой последовательности во время параллельных вычислений запускается процесс?

Как генерируются случайные числа для каждого параллельного процесса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...