Tidymodels+XGBoost工作流step_dummy后预测列缺失报错求助
使用tidymodels + XGBoost时step_dummy导致预测报错的解决方法
问题描述
执行预测操作时触发如下报错:
Error in `validate_column_names()`: ! The following required columns are missing: 'A', 'B', 'C', 'D'.
核心原因是:你手动提前对测试集执行了bake()预处理,但tidymodels工作流本身已集成了配方逻辑,预测时会自动调用训练阶段拟合好的配方处理新数据。此时传入预处理后的测试集,会缺失工作流期望的原始分类列A、B、C、D。
解决方法
无需手动对测试集做bake()处理,直接将原始测试集传入predict()函数即可。工作流会自动应用训练阶段的配方(包括step_dummy生成哑变量、step_zv移除零方差特征、step_normalize标准化等操作),生成模型所需的特征。
修改后的完整代码
library(tidymodels) library(xgboost) library(dplyr) set.seed(123) datensatz <- tibble( outcome = rnorm(100, mean = 60, sd = 10), A = factor(sample(c("h", "i", "j"), 100, replace = TRUE)), B = factor(sample(c("e", "f", "g"), 100, replace = TRUE)), C = factor(sample(1:3, 100, replace = TRUE)), D = factor(sample(c("a", "b"), 100, replace = TRUE)) ) # 数据拆分 data_split <- initial_split(datensatz, prop = 0.75) train_data <- training(data_split) test_data <- testing(data_split) # 配方定义 recipe_obj <- recipe(outcome ~ ., data = train_data) %>% step_dummy(all_nominal(), -all_outcomes()) %>% step_zv(all_predictors()) %>% step_normalize(all_numeric_predictors()) # XGBoost模型规格 xgboost_spec <- boost_tree( trees = 1000, tree_depth = 6, min_n = 10, loss_reduction = 0.01, sample_size = 0.8, mtry = 0.8, learn_rate = 0.01 ) %>% set_mode("regression") %>% set_engine("xgboost", count = FALSE, colsample_bytree = 0.8) # 工作流构建 workflow_obj <- workflow() %>% add_recipe(recipe_obj) %>% add_model(xgboost_spec) # 模型训练 xgboost_fit <- fit(workflow_obj, data = train_data) # 直接传入原始测试集,工作流自动处理预处理 predictions <- predict(xgboost_fit, new_data = test_data) # 查看预测结果 predictions
关键提示
- tidymodels的工作流核心是封装全流程,从数据预处理到模型训练、预测的逻辑都被整合在一起,拆分步骤手动处理数据会破坏流程一致性,引发类似的列缺失问题。
- 如果需要验证预处理后的数据集,可以使用
bake(prep(recipe_obj), new_data = test_data)查看,但不要将该预处理结果传入predict函数。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

