使用tidymodels构建XGBoost的Recipe时报unused argument (values)错误
问题根因定位
错误完全来自step_dummy()的参数写法错误:
all_nominal()是tidyselect的类型选择器,本身不支持传入列名作为参数,你直接在括号内写values相当于传递了不存在的入参,因此直接抛出unused argument (values)报错。- 额外逻辑问题:你的数据集仅包含
values(数值型因变量)和dates(日期格式列)两列,没有名义型分类变量,完全不需要调用step_dummy()做独热编码。如果是想把日期转为模型可接受的特征,应该使用时间序列专用的特征衍生步骤。
修复方案
根据你的实际需求二选一即可:
场景1:仅保留基础配方结构,不需要额外特征处理
直接删除错误的step_dummy()行:
basic_rec <- recipe(values ~ ., data = data_train) basic_rec %>% prep()
运行后无报错,配方会直接保留日期列作为输入。
场景2:需要衍生时间特征适配XGBoost训练
XGBoost无法直接处理日期格式,需要先拆分出年、月、季度等时间特征,正确写法如下:
basic_rec <- recipe(values ~ ., data = data_train) %>% # 从日期列衍生全量时间特征 step_timeseries_signature(dates) %>% # 清理时间序列场景下无用的冗余特征(可选) step_rm(matches("(iso)|(xts)|(hour)|(minute)|(second)|(am.pm)")) %>% # 可选:对衍生出的名义型预测特征做独热编码,XGBoost也支持直接输入整数型分类特征,可按需省略该步 step_dummy(all_nominal_predictors()) basic_rec %>% prep() %>% juice()
运行后输出的特征可直接用于后续XGBoost调优训练。
调优注意事项
- 拉丁超立方采样搜索超参数时,建议先收敛参数取值范围,避免出现极限值导致训练异常中断。
- 时间序列交叉验证的切片数量建议根据数据长度调整,避免训练集样本量不足导致模型拟合失效。
内容的提问来源于stack exchange,提问作者LGe
相关产品推荐
相关产品推荐

