【问题标题】:running multiple regression models using tidymodels使用 tidymodels 运行多个回归模型
【发布时间】:2021-02-09 10:52:53
【问题描述】:

我最近一直在使用 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

【问题讨论】:

    标签: r regression tidymodels


    【解决方案1】:

    我们正在开发一个名为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-02-09 创建

    这是在处理中,所以如果你有很高的稳定性需求,我会等几个月才能使用它。不过,我们对它将如何满足人们的需求感到兴奋!

    【讨论】:

    • 完美-期待使用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2015-02-10
    • 2020-11-23
    • 2023-01-21
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多