将 tidymodels 拟合模型应用于新的未标记数据

Posted

技术标签:

【中文标题】将 tidymodels 拟合模型应用于新的未标记数据【英文标题】:Applying tidymodels fitted model to new, unlabeled data 【发布时间】:2022-01-01 08:16:18 【问题描述】:

我一直在阅读文章和文档、浏览 youtube 视频等,但我找不到持续使用 tidymodels 工作流程的流程。

例如,https://tune.tidymodels.org/reference/last_fit.html 规定“下一步将使用整个训练集进行拟合,并使用测试数据验证性能。”

我想用训练/测试数据调整模型,创建 last_fit,然后将其应用于性能无法验证的数据,因为它没有标记/没有结果。

在我的特定情况下,我正在创建一个分类模型来预测特定产品订阅是否会流失或续订。提前,比如 30 天,我想为给定订阅的结果(或所有将在未来 30 天内到期的订阅)创建预测。

据我所知,rsample 不包含以这种方式拆分数据的方法,否则我会这样做。我觉得我一定遗漏了一些简单的东西,但我只能找到人们使用完全标记数据的示例。

【问题讨论】:

要将拟合模型应用于新数据,您将使用通用 predict() 函数。你问的是这个吗? 【参考方案1】:

您可以分别使用extract_fit_parsnip()extract_workflow()last_fit() 的结果中精确得出最终拟合的模型/工作流程。

library(tidymodels)

set.seed(6735)
tr_te_split <- initial_split(mtcars)

rec_spec <- recipe(mpg ~ ., data = training(tr_te_split)) %>%
  step_normalize(all_predictors())

lin_mod <- linear_reg() %>%
  set_engine("lm")

wf_spec <-
 workflow() %>%
 add_recipe(rec_spec) %>%
 add_model(lin_mod)

wf_res <- last_fit(wf_spec, split = tr_te_split)

final_wf <- wf_res %>%
  extract_workflow()
final_wf
#> ══ Workflow [trained] ══════════════════════════════════════════════════════════
#> Preprocessor: Recipe
#> Model: linear_reg()
#> 
#> ── Preprocessor ────────────────────────────────────────────────────────────────
#> 1 Recipe Step
#> 
#> • step_normalize()
#> 
#> ── Model ───────────────────────────────────────────────────────────────────────
#> 
#> Call:
#> stats::lm(formula = ..y ~ ., data = data)
#> 
#> Coefficients:
#> (Intercept)          cyl         disp           hp         drat           wt  
#>   19.387500    -1.167165    -1.311400    -0.005379     0.237784    -0.602792  
#>        qsec           vs           am         gear         carb  
#>    0.262839     0.758393     2.791441    -0.516713    -1.773907

然后为了模拟未标记的数据,我们创建了一些随机汽车。请注意,此数据集没有响应变量mpg

random_cars <- mtcars %>%
  select(-mpg) %>%
  map_dfc(sample)

random_cars
#> # A tibble: 32 × 10
#>      cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1     8  79     205  3.07  2.46  18.6     0     0     3     4
#>  2     8 460     180  3.77  2.77  18.0     1     0     4     1
#>  3     8  95.1   175  3     3.22  18.9     0     1     4     4
#>  4     8 145     123  4.93  3.44  14.6     1     1     4     1
#>  5     8 360      52  4.11  3.44  20.0     1     1     4     3
#>  6     4 276.    230  4.08  2.78  14.5     0     0     4     4
#>  7     6 472      95  3.9   3.44  19.5     0     0     4     2
#>  8     6  78.7   215  2.76  3.15  17.3     0     1     3     4
#>  9     8 225     113  3.92  1.62  18.5     1     0     5     1
#> 10     8 160     175  3.7   2.62  17.4     1     0     3     2
#> # … with 22 more rows

我们现在可以使用 predict() 预测此工作流程

predict(final_wf, random_cars)
#> # A tibble: 32 × 1
#>    .pred
#>    <dbl>
#>  1  17.4
#>  2  17.4
#>  3  21.9
#>  4  26.2
#>  5  22.2
#>  6  16.9
#>  7  15.9
#>  8  23.8
#>  9  20.1
#> 10  20.2
#> # … with 22 more rows

【讨论】:

谢谢,extract_workflow(),让最终的 wf 是我需要但还没有找到的。现在我遇到的问题是,我在拆分数据上使用的配方中的一些转换需要在我的预测集上完成。为简单起见,可以专注于一个:我使用step_dummy(all_nominal_predictors())。如何将其应用于我的新数据?我尝试制作配方的副本,将其应用于我的新数据,然后从中创建工作流,但它创建的对象不是工作流,我无法将其添加到 final_wf 当您predict()工作流时,配方中的预处理步骤将自动执行 我之前尝试过,在sub_id 中收到“新级别”的警告消息,它不应该用作预测器,因为我的食谱中有这个:update_role(sub_id, renewal_decision_date, next_renewal_decision_date, new_role = "ID")。所以我假设这个食谱没有得到应用。

以上是关于将 tidymodels 拟合模型应用于新的未标记数据的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 tidymodels 包使用分类预测器训练 Poisson glmnet

如何将经过训练和测试的随机森林模型应用于 tidymodels 中的新数据集?

如何使用训练有素的 Keras CNN 模型对新的未标记数据进行预测

Tidymodels 包:使用 ggplot() 可视化随机森林模型以显示最重要的预测变量

如何将诊断预测模型应用于新数据

如何获得欧洲防风多项逻辑回归模型的系数?