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

使用tidymodels时broom::augment与recipes::step_log报错求解

问题解决:tidymodels中broom::augment()因log变换结果变量报错

错误原因

你遇到的核心问题是:在recipe中使用step_log()处理结果变量outcome时,默认会替换原始的outcome列(参数keep_original_cols = FALSE)。当调用augment()时,workflow会自动对new_data应用整个预处理流程,此时需要原始outcome列来执行log变换,但模型拟合后的预处理蓝图中,原始列的角色被覆盖,导致bake步骤报错。


三种可行解决方案

方案1:保留原始结果列

在step_log()中显式设置keep_original_cols = TRUE,让预处理流程同时保留原始outcome列和变换后的列:

df <- 
  data.frame(
    outcome = c(0,1,3,6,0,7,3,5,6,7),
    predictor = 1:10
  )

rec <-
  df |> 
  recipes::recipe(outcome ~ predictor) |>
  recipes::step_log(outcome, offset = 0.0001, keep_original_cols = TRUE)

wf <-
  workflows::workflow(
    rec,
    parsnip::linear_reg()
  )  

fit_model <- parsnip::fit(wf, df)

# 正常运行augment
augment_result <- broom::augment(fit_model, new_data = df)
# 可选:将预测值反变换回原始尺度
augment_result <- augment_result |> 
  dplyr::mutate(.pred_original = exp(.pred) - 0.0001)

方案2:创建独立的变换后目标变量

通过step_mutate()生成一个新的log变换变量作为模型的预测目标,完全避免修改原始outcome列:

df <- 
  data.frame(
    outcome = c(0,1,3,6,0,7,3,5,6,7),
    predictor = 1:10
  )

rec <-
  df |> 
  recipes::recipe() |>
  recipes::step_mutate(log_outcome = log(outcome + 0.0001)) |>
  recipes::update_role(predictor, new_role = "predictor") |>
  recipes::update_role(log_outcome, new_role = "outcome")

wf <-
  workflows::workflow(
    rec,
    parsnip::linear_reg() |> parsnip::set_formula(log_outcome ~ predictor)
  )  

fit_model <- parsnip::fit(wf, df)

augment_result <- broom::augment(fit_model, new_data = df)
# 反变换预测值到原始尺度
augment_result <- augment_result |> 
  dplyr::mutate(.pred_original = exp(.pred) - 0.0001)

方案3:直接在模型公式中定义变换

跳过recipe预处理,直接在模型公式中完成log变换,这种方式最简洁:

df <- 
  data.frame(
    outcome = c(0,1,3,6,0,7,3,5,6,7),
    predictor = 1:10
  )

wf <-
  workflows::workflow() |>
  workflows::add_formula(log(outcome + 0.0001) ~ predictor) |>
  workflows::add_model(parsnip::linear_reg())

fit_model <- parsnip::fit(wf, df)

augment_result <- broom::augment(fit_model, new_data = df)
# 反变换预测值到原始尺度
augment_result <- augment_result |> 
  dplyr::mutate(.pred_original = exp(.pred) - 0.0001)

内容的提问来源于stack exchange,提问作者joshbrows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:10:41