我已经用客户数据(超过200列(训练了一个客户流失tidymode。使用xgbboost获得了相当好的指标,但问题是在尝试预测新数据时。
Predict函数要求目标变量(流失(,我有点困惑,因为这个变量不应该出现在真实的场景数据中,因为这是我想要预测的变量。
下面的示例代码,也许我错过了程序的要点。出现了一些问题:
-
我应该在配方结束时执行prep((吗?
-
在预测之前,我应该对我的新数据执行配方吗?
-
为什么从配方中删除与目标变量有关的行可以使预测工作?
-
为什么要询问我的目标变量?
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()