random - 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
无论在并行计算过程中以哪个顺序运行该进程?
每个并行进程如何生成随机数?
解决方案
推荐阅读
- django - 当创建用户并选择特定组时,如何在 Django 中将 is_staff 设置为 True
- html - 如何修复 Bootstrap 5 中的填充问题?
- c - 为什么这个结构数组会覆盖 char * 而不是 int?
- nginx - 应用程序的 Nginx 配置问题
- javascript - 图像上的 Fabric JS 设置填充不起作用
- laravel-8 - SQLSTATE[23000]:完整性约束违规 1452 无法添加或更新子行:外键约束失败
- java - 如何使用 JDBC Driver 9.2 连接到 SQL Server?
- r - 如何使用R基于空间自相关规则聚合空间点?
- javascript - 使用 python 创建交互式自动电子邮件
- django - 我的自定义日期时间字段的 DATETIME_FORMAT 设置