将 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 模型对新的未标记数据进行预测