如何并行化workflowsets::workflow_map()的模型拟合?
问题
我需要通过workflowsets::workflow_map()拟合一组模型,现有示例代码如下。想实现模型拟合的并行化,让date_lm、plus_holidays_lm、plus_pca_lm各自占用一个核心运行,优先用tidymodels生态内的方案,不要自定义并行逻辑。
library(workflowsets) library(workflows) library(modeldata) library(recipes) library(parsnip) library(dplyr) library(rsample) library(tune) library(yardstick) library(dials) data(Chicago) Chicago <- Chicago[1:1195,] time_val_split <- sliding_period( Chicago, date, "month", lookback = 38, assess_stop = 1 ) base_recipe <- recipe(ridership ~ ., data = Chicago) %>% step_date(date) %>% step_holiday(date) %>% update_role(date, new_role = "id") %>% step_dummy(all_nominal()) %>% step_zv(all_predictors()) %>% step_normalize(all_predictors()) date_only <- recipe(ridership ~ ., data = Chicago) %>% step_date(date) %>% update_role(date, new_role = "id") %>% step_dummy(all_nominal()) %>% step_zv(all_predictors()) date_and_holidays <- recipe(ridership ~ ., data = Chicago) %>% step_date(date) %>% step_holiday(date) %>% update_role(date, new_role = "id") %>% step_dummy(all_nominal()) %>% step_zv(all_predictors()) date_and_holidays_and_pca <- recipe(ridership ~ ., data = Chicago) %>% step_date(date) %>% step_holiday(date) %>% update_role(date, new_role = "id") %>% step_dummy(all_nominal()) %>% step_zv(all_predictors()) %>% step_pca(!!stations, num_comp = tune()) lm_spec <- linear_reg() %>% set_engine("lm") pca_param <- parameters(num_comp()) %>% update(num_comp = num_comp(c(0, 20))) chi_features_set <- workflow_set( preproc = list(date = date_only, plus_holidays = date_and_holidays, plus_pca = date_and_holidays_and_pca), models = list(lm = lm_spec), cross = TRUE ) chi_features_res_new <- chi_features_set %>% option_add(param_info = pca_param, id = "plus_pca_lm") %>% workflow_map(resamples = time_val_split, grid = 21, seed = 1, verbose = TRUE)
解决方案
tidymodels生态官方推荐用furrr(搭配future)实现workflow_map()的并行化,无需自定义逻辑,步骤如下:
1. 安装并加载并行依赖
furrr是purrr的并行扩展,与tidymodels深度兼容,future用于管理并行会话:
install.packages(c("furrr", "future")) library(furrr) library(future)
2. 配置并行计划
指定并行模式和核心数,这里设置3个核心刚好匹配你的3个workflow:
# Windows系统用multisession;Linux/macOS可替换为multicore以获得更好性能 plan(multisession, workers = 3)
3. 执行并行拟合
修改workflow_map调用,添加随机数种子保证结果可复现,此时每个workflow会分配到独立核心运行:
chi_features_res_new <- chi_features_set %>% option_add(param_info = pca_param, id = "plus_pca_lm") %>% workflow_map( resamples = time_val_split, grid = 21, seed = 1, verbose = TRUE, .options = furrr_options(seed = TRUE) # 确保并行过程随机数一致 )
补充说明
- 若核心数多于3,设置更大的
workers值不会加速,因为最多同时运行3个workflow - 并行完成后,可执行
plan(sequential)恢复单线程模式,避免后续代码意外并行 furrr_options(seed = TRUE)是必要的,否则并行过程中随机数会出现不一致,导致结果不可复现
内容的提问来源于stack exchange,提问作者Aegis
相关产品推荐
相关产品推荐

