最近我在学习使用tidymodels构建机器学习工作流,但在使用工作流对测试集进行预测时,出现了“列中缺少数据”的错误,但我确信训练集和测试集中都没有缺失数据。以下是我的代码和示例:
# 关于数据的信息:测试集中的Primary_type有几个新的级别
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 ...
# 设置配方
rec <- recipe(Arrest ~ ., data = train_sample) %>%
update_role(ID, new_role = "ID") %>%
step_novel(Primary_type)
# 设置模型
rf_model <- rand_forest(trees = 10) %>%
set_engine("ranger", seed = 100, num.threads = 12, verbose = TRUE) %>%
set_mode("classification")
# 设置工作流
wf <- workflow() %>%
add_recipe(rec) %>%
add_model(rf_model)
# 拟合训练数据
wf_fit <- wf %>% fit(train_sample)
# 预测测试数据
wf_pred <- wf_fit %>% predict(test_sample)
预测时出现了以下错误:
ERROR:Missing data in columns: Primary_type.
然而,当我单独使用prep()和bake()构建工作流时,预测不会出现错误:
# 单独设置工作流
train_prep <- prep(rec, training = train_sample)
train_bake <- bake(train_prep, new_data = NULL)
test_bake <- bake(train_prep, new_data = test_sample)
# 拟合baked的训练数据
rf_model_fit <- rf_model %>% fit(Arrest ~ Primary_type, train_bake)
# 预测baked的测试数据
rf_model_pred <- rf_model_fit %>% predict(test_bake) # 没有缺失数据错误
我发现两个baked数据集中的Primary_type的级别是相同的,这意味着step_novel()生效了。
# 比较baked数据集之间的级别
identical(levels(train_bake$Primary_type), levels(test_bake$Primary_type))
[1] TRUE
那么,为什么在工作流中预测失败,而单独进行时成功呢?缺失数据是如何产生的?非常感谢。
回答:
我建议你查看关于“步骤顺序”的建议,特别是关于处理分类数据级别的部分。你应该在其他因子处理操作之前使用step_novel()
。