r-tidymode错误,当调用predict函数询问目标变量时



我已经用客户数据(超过200列(训练了一个客户流失tidymode。使用xgbboost获得了相当好的指标,但问题是在尝试预测新数据时。

Predict函数要求目标变量(流失(,我有点困惑,因为这个变量不应该出现在真实的场景数据中,因为这是我想要预测的变量。

下面的示例代码,也许我错过了程序的要点。出现了一些问题:

  1. 我应该在配方结束时执行prep((吗?

  2. 在预测之前,我应该对我的新数据执行配方吗?

  3. 为什么从配方中删除与目标变量有关的行可以使预测工作?

  4. 为什么要询问我的目标变量?

    churn_recipe <- recipes::recipe(churn ~ ., data = churn_train) %>%
    recipes::step_naomit(everything(), skip = TRUE) %>% 
    recipes::step_rm(c(v1, v2, v3, v4, v5, v6)) %>%
    #  removing/commenting the next 2 lines makes predict() work
    recipes::step_string2factor(churn) %>%  
    themis::step_downsample(churn) %>%
    recipes::step_dummy(all_nominal_predictors()) %>% 
    recipes::step_novel(all_nominal(), -all_outcomes())  ### %>% prep()
    xgboost_model <-
    parsnip::boost_tree(
    mode = "classification",
    trees = 100
    ) %>%
    set_engine("xgboost") %>% 
    set_mode("classification")
    xgboost_workflow <-
    workflows::workflow() %>%
    add_recipe(churn_recipe) %>% 
    add_model(xgboost_model) 
    my_fit <- last_fit(xgboost_workflow, churn_split)
    collect_metrics(my_fit)
    
    churn_wf_model <- my_fit$.workflow[[1]]
    predict(churn_wf_model, new_data[1,])
    Error: Can't subset columns that don't exist.
    x Column `churn` doesn't exist.
    

我很确定自己有一些误解,但无法解决这个问题。

我正忙于把我的模型投入生产。Tidymodels的文档中缺乏这样的主题是巨大的。

由于recipes::step_string2factor(churn)而出现此错误

当您训练数据时,此步骤非常有效。但是,当需要将相同的转换应用于训练集时,step_string2factor()会抱怨,因为它被要求将churn从字符串转换为因子,但数据集不包括churn变量。你可以用两种方法来处理这个问题。

step_string2factor()中的skip = FALSE(不太有利(

通过在step_string2factor()中设置skip = FALSE,您告知步骤o仅在准备/训练配方时应用。这是不好的,因为当响应被期望为一个因子而不是字符串时,这种方法在使用{tune}的某些重采样场景中可能会产生错误。

library(tidymodels)
data("mlc_churn")
set.seed(1234)
churn_split <- initial_split(mlc_churn)
churn_train <- training(churn_split)
churn_test <- testing(churn_split)

churn_recipe <- recipes::recipe(churn ~ ., data = churn_train) %>%
recipes::step_naomit(everything(), skip = TRUE) %>% 
recipes::step_string2factor(churn, skip = TRUE) %>%  
themis::step_downsample(churn) %>%
recipes::step_dummy(all_nominal_predictors()) %>% 
recipes::step_novel(all_nominal(), -all_outcomes())
xgboost_model <-
parsnip::boost_tree(
mode = "classification",
trees = 100
) %>%
set_engine("xgboost") %>% 
set_mode("classification")
xgboost_workflow <-
workflows::workflow() %>%
add_recipe(churn_recipe) %>% 
add_model(xgboost_model) 
my_fit <- last_fit(xgboost_workflow, churn_split)
churn_wf_model <- my_fit$.workflow[[1]]
predict(churn_wf_model, churn_test)
#> # A tibble: 1,250 x 1
#>    .pred_class
#>    <fct>      
#>  1 no         
#>  2 no         
#>  3 no         
#>  4 no         
#>  5 no         
#>  6 no         
#>  7 no         
#>  8 no         
#>  9 no         
#> 10 yes        
#> # … with 1,240 more rows

创建于2021-06-10由reprex包(v2.0.0(

在拆分之前将响应作为一个因素(推荐(

建议解决此问题的方法是,在将响应churn传递到{recipes}之前,确保它是一个因素。我发现这样做最容易,因为我用initial_split()创建了验证分割。然后你就不需要在配方中的响应中使用step_string2factor()

churn_split <- mlc_churn %>%
mutate(churn = factor(churn)) %>%
initial_split()

最新更新