使用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
相关产品推荐
相关产品推荐

