You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:56