问题描述
我最近一直在使用 tidymodels 来运行模型并选择最能满足某些目标函数的参数。例如对 mtcars 数据 (using the regression examples from the bottom answer of this question as an example)
使用假设回归library(tidymodels)
library(tidyverse)
#some regression model
cars_recipe <- recipe(mpg ~ disp + drat,data = mtcars)
wf <- workflow() %>%
add_recipe(cars_recipe)
(粗略地使用 this blog post 中的语法进行比较;在本示例中,为了清晰起见,我没有执行诸如拆分测试/训练之类的各种步骤)
然后我可以运行许多模型并从这些模型中获取指标(在这种情况下,针对某些弹性网络的各种惩罚)
#run over a parameter space and find metrics as an objective
mtcars_bootstrap <- bootstraps(mtcars)
tune_spec <- linear_reg(penalty = tune(),mixture = 1) %>%
set_engine("glmnet")
lambda_grid <- grid_regular(penalty(),levels = 50)
lasso_grid <- tune_grid(
wf %>% add_model(tune_spec),resamples = mtcars_bootstrap,grid = lambda_grid
)
但是假设我有充分的理由认为有两个独立的模型可以最好地捕捉(例如)汽车 mpg 的影响,因此我创建了第二个模型作为配方
cars_recipe2 <- recipe(mpg ~ I(disp + drat),data = mtcars)
现在我也可以使用 lapply 或 purrr 系列函数通过上述管道运行此配方,但是,我想知道是否有一些内置方法可以通过 tidymodels 运行多个配方?
似乎应该有,但我也认为它可能被设计排除以防止 p-hacking
解决方法
我们正在开发一个名为 workflowsets 的实验包来完成此任务。如果您准备试用一个仍在开发中的新软件包,您现在可以从 GitHub 安装它:
devtools::install_github("tidymodels/workflowsets")
然后你可以像这样设置分析:
library(tidymodels)
library(workflowsets)
mtcars_boot <- bootstraps(mtcars)
rec1 <- recipe(mpg ~ disp + drat,data = mtcars)
rec2 <- recipe(mpg ~ disp + drat,data = mtcars) %>%
step_log(disp) %>%
step_normalize(disp,drat)
lasso_spec <- linear_reg(penalty = tune(),mixture = 1) %>%
set_engine("glmnet")
# put it all together in a "workflow set"
car_models <-
workflow_set(
preproc = list(simple = rec1,preproc = rec2),models = list(lasso = lasso_spec),cross = TRUE
)
car_models
#> # A workflow set/tibble: 2 x 4
#> wflow_id info option result
#> <chr> <list> <list> <list>
#> 1 simple_lasso <tibble [1 × 4]> <opts[0]> <list [0]>
#> 2 preproc_lasso <tibble [1 × 4]> <opts[0]> <list [0]>
既然您有一个工作流集,您就可以“映射”它,在本例中为 tune_grid()
以及您想使用的其他参数,如重采样和网格。
lambda_grid <- grid_regular(penalty(range = c(-2,0)),levels = 10)
car_res <- car_models %>%
workflow_map("tune_grid",resamples = mtcars_boot,grid = lambda_grid,verbose = TRUE)
#> i 1 of 2 tuning: simple_lasso
#> ✓ 1 of 2 tuning: simple_lasso (7.7s)
#> i 2 of 2 tuning: preproc_lasso
#> ✓ 2 of 2 tuning: preproc_lasso (8.4s)
## some autoplot methods are available
autoplot(car_res)
由 reprex package (v1.0.0) 于 2021 年 2 月 9 日创建
这是在进行中,所以如果你有很高的稳定性需求,我会等几个月才能使用它。不过,我们很高兴它能够满足人们的需求!