使用最终工作流预测测试数据时遇step_log()错误,求解决方案
问题分析与解决方案
错误提示step_log()找不到shares列,核心原因是你的recipe对响应变量的处理逻辑存在混淆,或者提取的workflow与你定义的recipe不一致。以下是具体解决步骤:
1. 修正Recipe的响应变量变换逻辑
你当前的step_log(shares)虽然能在训练时对响应变量做对数变换,但不够明确,容易让预处理流程混淆响应变量和预测变量。改为明确针对响应变量的写法:
recipe_kc <- recipe(shares ~ ., data = articles_train) %>% step_log(all_outcomes()) %>% # 明确指定对响应变量应用对数变换 step_normalize(all_numeric_predictors()) %>% step_zv(all_predictors())
2. 检查提取的Workflow是否匹配
你代码中提取的是extract_workflow("recipe3_bt"),但定义的recipe是recipe_kc,两者可能不是同一个对象。确认bt_tuned中的recipe3_bt是否使用了上述修正后的recipe,如果不是,更新workflow_set或直接用修正后的recipe创建新workflow:
# 替换为你实际使用的模型定义,这里以boosting模型为例 bt_model <- boost_tree(trees = tune(), min_n = tune()) %>% set_engine("xgboost") %>% set_mode("regression") # 用修正后的recipe创建workflow workflow_kc <- workflow() %>% add_recipe(recipe_kc) %>% add_model(bt_model)
3. 调整预测代码
预测时仅传递预测变量即可(无需包含响应变量,避免预处理流程的混淆),同时注意summarize是聚合函数,你需要保留每行的预测结果,改用select:
final_pred <- articles_test %>% select(shares) %>% # 保留真实值用于后续评估 bind_cols(predict(final_fit, new_data = articles_test %>% select(-shares))) %>% # 仅传入预测变量 mutate( .pred_log = .pred, .pred = 10^.pred_log # 反变换得到原始尺度的预测值 ) %>% select(.pred, shares, .pred_log) # 选择需要的列
4. 无需重新调优模型
只要你之前的调优是基于对数变换后的响应变量进行的,修正recipe后直接重新拟合final_workflow即可,不需要重新跑调优流程,节省时间。
5. 验证测试集数据
最后确认测试集的shares列确实存在且无异常:
# 检查列名 colnames(articles_test) # 检查是否有缺失值 sum(is.na(articles_test$shares))
内容的提问来源于stack exchange,提问作者Chelsea Lu
相关产品推荐
相关产品推荐

