You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用最终工作流预测测试数据时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:35:40