【问题标题】:Error: "Missing data in columns" when using tidymodels workflow to predict test set错误:使用 tidymodels 工作流预测测试集时出现“列中缺少数据”
【发布时间】:2021-06-17 04:28:11
【问题描述】:

最近我学习使用 tidymodels 来构建机器学习工作流程,但是当我使用工作流程对测试集进行预测时,它会引发错误“缺少列中的数据”,但我确信火车和测试集缺少数据。这是我的代码和示例:

# Imformation of the data:the Primary_type in test set has several novel levels
str(train_sample)
tibble [500,000 x 3] (S3: tbl_df/tbl/data.frame)
 $ ID          : num [1:500000] 6590508 2902772 6162081 7777470 7134849 ...
 $ Primary_type: Factor w/ 29 levels "ARSON","ASSAULT",..: 16 8 3 3 28 7 3 4 25 15 ...
 $ Arrest      : Factor w/ 2 levels "FALSE","TRUE": 2 1 1 1 1 2 1 1 1 1 ...

str(test_sample)
tibble [300,000 x 3] (S3: tbl_df/tbl/data.frame)
 $ ID          : num [1:300000] 8876633 9868538 9210518 9279377 8707153 ...
 $ Primary_type: Factor w/ 32 levels "ARSON","ASSAULT",..: 3 7 31 7 2 8 7 2 31 18 ...
 $ Arrest      : Factor w/ 2 levels "FALSE","TRUE": 1 1 1 1 2 1 1 1 2 2 ...

# set the recipe
rec <- recipe(Arrest ~ ., data = train_sample) %>% 
  update_role(ID, new_role = "ID") %>% 
  step_novel(Primary_type)

# set the model
rf_model <- rand_forest(trees = 10) %>%
  set_engine("ranger", seed = 100, num.threads = 12, verbose = TRUE) %>%
  set_mode("classification")

# set the workflow
wf <- workflow() %>% 
  add_recipe(rec) %>% 
  add_model(rf_model)

# fit the train data
wf_fit <- wf %>% fit(train_sample)

# predict the test data
wf_pred <- wf_fit %>% predict(test_sample)

预测引发以下错误:

ERROR:Missing data in columns: Primary_type.

但是,当我使用 prep()bake() 分别构建工作流程时,预测不会引发错误:

# set the workflow seperately
train_prep <- prep(rec, training = train_sample)
train_bake <- bake(train_prep, new_data = NULL)
test_bake <- bake(train_prep, new_data = test_sample)

# fit the baked train data
rf_model_fit <- rf_model %>% fit(Arrest ~ Primary_type, train_bake)

# predict the baked test data
rf_model_pred <- rf_model_fit %>% predict(test_bake) # No missing data error

我发现两个烘焙数据集中的 Primary_type 级别是相同的,这意味着 step_novel() 有效。

# compare the levels bewteen baked data sets
identical(levels(train_bake$Primary_type), levels(test_bake$Primary_type))
[1] TRUE

那么,为什么预测在工作流程中失败,而在单独执行时成功?以及丢失的数据是如何产生的?非常感谢。

【问题讨论】:

    标签: r machine-learning feature-engineering tidymodels


    【解决方案1】:

    我建议您在"Ordering of Steps" 上查看此建议,尤其是handling levels in categorical data 上的部分。您应该在其他因素处理操作之前使用step_novel()

    【讨论】:

    • 感谢您的建议!我阅读了该部分并修改了step_novel() 的顺序,将其放在update_role() 之后,但是当我使用工作流进行预测时仍然会出现错误。同时,当我使用prep()bake() 分开工作流来处理数据集和预测时,它没有出错,我仍然不知道为什么。测试后我更清楚地重写了我的问题。谢谢!
    • 啊,如果您想预测在训练期间没有看到的新因子水平,请查看this issue 并将allow_novel_levels = TRUE 添加到您的配方蓝图中。不过,请务必仔细考虑这意味着什么,因为您在训练中根本没有看到这一点。
    • 问题解决了我的问题!在add_recipe()中设置allow_novel_levels = TRUE后,丢失数据错误消失!非常感谢!我将继续深入研究 tidymodels。正如你所说,思考新数据中的新级别很重要,但在现实世界的生产中,新数据中总会出现一些新级别,我不能每次出现时都训练模型,所以像step_novel()这样的函数, step_unknown()step_other() in tidymodels 很好地满足了我的需求!
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-05-04
    相关资源
    最近更新 更多