使用并行化对 mlr3 进行重采样时如何获得可重现的结果
How to get a reproducible result when using parallelization to do resampling with mlr3
最近我在学习如何使用 mlr3 包进行并行化。正如 mlr3 书(https://mlr3book.mlr-org.com/technical.html) and tutorial(https://www.youtube.com/watch?v=T43hO2o_nZw&t=1s)中的介绍,mlr3 使用未来后端进行并行化。我运行一个简单的测试,代码如下:
# load the packages
library(future)
library(future.apply)
library(mlr3)
# set the task
task_train <- TaskClassif$new(id = "survey_train", backend = train, target = "r_yn", positive = "yes")
# set the learner
learner_ranger <- mlr_learners$get("classif.ranger")
# set the cv
cv_5 <- rsmp("cv", folds = 5)
# run the resampling in parallelization
plan(multisession, workers = 5)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
plan(sequential)
task_train_cv_5_par$aggregate(msr("classif.auc"))
AUC 每次都在变化,我知道这是因为我没有为并行化设置随机种子。但是我发现了很多关于未来包的教程,未来获得可重现结果的方法是使用 future.apply 包中的 future_lapply 并设置 future.seed = 真。另一种方法是使用 %dorng% 或 registerDoRNG() 为 foreach 循环设置未来后端。
我的问题是如何在不使用 future_lapply 的情况下在 mlr3 中获得可重现的重采样结果或
foreach?我想可能有一种简单的方法可以做到这一点。非常感谢!
您需要使用支持并行化的 RNG 种类设置种子。
set.seed(42, "L'Ecuyer-CMRG")
有关详细信息,请参阅 ?RNGkind
。
AFAIK 对于 R 中的确定性并行结果,除了使用这种 RNG 类型之外别无他法。当 运行 顺序时,您可以使用默认的 RNG 种类 set.seed(42)
。
My question is how can I get a reproducible resampling result in mlr3 without using future_lapply or foreach?
{mlr3} 使用 {future} 进行所有类型的内部并行化,因此没有办法绕过 {future}。所以是的,设置 future.seed = TRUE
你应该没问题。
我已将您的示例更改为可重现,以表明您只需要使用 set.seed()
:
设置种子
library(mlr3)
library(mlr3learners)
task_train <- tsk("sonar")
learner_ranger <- lrn("classif.ranger", predict_type = "prob")
cv_5 <- rsmp("cv", folds = 5)
plan(multisession, workers = 5)
# 1st resampling
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
# 2nd resampling
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
# 3rd resampling, now sequential
plan(sequential)
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
所有三个重采样都应该得到相同的分数。
最近我在学习如何使用 mlr3 包进行并行化。正如 mlr3 书(https://mlr3book.mlr-org.com/technical.html) and tutorial(https://www.youtube.com/watch?v=T43hO2o_nZw&t=1s)中的介绍,mlr3 使用未来后端进行并行化。我运行一个简单的测试,代码如下:
# load the packages
library(future)
library(future.apply)
library(mlr3)
# set the task
task_train <- TaskClassif$new(id = "survey_train", backend = train, target = "r_yn", positive = "yes")
# set the learner
learner_ranger <- mlr_learners$get("classif.ranger")
# set the cv
cv_5 <- rsmp("cv", folds = 5)
# run the resampling in parallelization
plan(multisession, workers = 5)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
plan(sequential)
task_train_cv_5_par$aggregate(msr("classif.auc"))
AUC 每次都在变化,我知道这是因为我没有为并行化设置随机种子。但是我发现了很多关于未来包的教程,未来获得可重现结果的方法是使用 future.apply 包中的 future_lapply 并设置 future.seed = 真。另一种方法是使用 %dorng% 或 registerDoRNG() 为 foreach 循环设置未来后端。
我的问题是如何在不使用 future_lapply 的情况下在 mlr3 中获得可重现的重采样结果或 foreach?我想可能有一种简单的方法可以做到这一点。非常感谢!
您需要使用支持并行化的 RNG 种类设置种子。
set.seed(42, "L'Ecuyer-CMRG")
有关详细信息,请参阅 ?RNGkind
。
AFAIK 对于 R 中的确定性并行结果,除了使用这种 RNG 类型之外别无他法。当 运行 顺序时,您可以使用默认的 RNG 种类 set.seed(42)
。
My question is how can I get a reproducible resampling result in mlr3 without using future_lapply or foreach?
{mlr3} 使用 {future} 进行所有类型的内部并行化,因此没有办法绕过 {future}。所以是的,设置 future.seed = TRUE
你应该没问题。
我已将您的示例更改为可重现,以表明您只需要使用 set.seed()
:
library(mlr3)
library(mlr3learners)
task_train <- tsk("sonar")
learner_ranger <- lrn("classif.ranger", predict_type = "prob")
cv_5 <- rsmp("cv", folds = 5)
plan(multisession, workers = 5)
# 1st resampling
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
# 2nd resampling
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
# 3rd resampling, now sequential
plan(sequential)
set.seed(1)
task_train_cv_5_par <- resample(task = task_train, learner = learner_ranger, resampling = cv_5)
task_train_cv_5_par$aggregate(msr("classif.auc"))
所有三个重采样都应该得到相同的分数。