У меня есть следующий код, использующий случайный лес в качестве метода, который полностью воспроизводим, если вы запускаете его в параллельном режиме на той же машине:
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
независимо от того, в какой последовательности во время параллельных вычислений запускается процесс?
Как генерируются случайные числа для каждого параллельного процесса?