tidymodel配方和step_lag:使用predict时出错

问题描述

这可能是用法上的误解,但我希望以下玩具示例能够奏效。我想在配方中使用滞后的预测变量,但是一旦将其包含在配方中,并尝试使用配方的工作流程对相同的数据进行预测,它将无法识别列foo并且无法计算它的滞后时间。

现在,如果我可以使用此功能

  1. 从适合的工作流程中拉出适合的内容
  2. 独立准备和烘焙我要容纳的数据。

在失败的工作流程适合之后,我该进行编码,然后它成功。根据文档,我应该能够将工作流程放置在预测位置:https://www.tidymodels.org/start/recipes/#predict-workflow

我可能从根本上误解了工作流应该如何运行。我有一个我认为可以解决方法,但是我不明白为什么失败的语句不能以该解决方法的方式工作。我希望失败的工作流构造能够像我所遇到的解决方法一样在幕后起作用。

简而言之,如果work_df一个数据帧,the_rec一个基于work_df的配方,rf_mod一个模型,那么您将创建工作流{{1} },那么我应该期望rf_workflow函数在下面的两个predict()调用中一样工作吗?

predict()

下面的完整reprex示例。

## Workflow
rf_workflow <-
    workflow() %>%
    add_model(rf_mod) %>%
    add_recipe(the_rec)

## fit
rf_workflow_fit <-
    rf_workflow %>%
    fit(data = work_df)

## Predict with workflow.  I expect since a workflow has a fit model and
## a recipe as part of it,it should kNow how to do the following:
predict(rf_workflow_fit,work_df)
#> Error: Problem with `mutate()` input `lag_1_foo`.
#> x object 'foo' not found
#> i Input `lag_1_foo` is `dplyr::lag(x = foo,n = 1L,default = NA)`.


## Predict by explicitly prepping and baking the data,and pulling out the
## fit from the workflow:
predict(
    rf_workflow_fit %>%
        pull_workflow_fit(),bake(prep(the_rec),work_df))
#> # A tibble: 995 x 1
#>     .pred
#>     <dbl>
#>  1  2.24 
#>  2  0.595
#>  3  0.262

reprex package(v0.3.0)于2020-10-13创建

解决方法

遇到错误的原因是您已经从结果中创建了一个预测变量。当需要预测新数据时,结果将不可用。我们正在预测新数据的结果,而不是假设它已经存在。

这是tidymodels框架(用于建模或预处理)的相当强大的假设,可以防止信息泄漏。您可以阅读about this a bit more here

您可能已经知道这些资源,但是如果您正在使用时间序列模型,建议您检查以下资源: