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

tidymodels工作流中结果变量对数变换后无法预测的问题

解决tidymodels预测时结果变量log变换的报错问题

错误原因很明确:你的配方(recipe)里用step_log同时处理了结果变量Transactions和预测变量Total.Attendance,但预测阶段的测试数据里没有Transactions列,配方执行到log变换步骤时找不到该列,因此抛出错误。

下面是两种可行的解决方案,都能保留对结果变量的对数变换:

方案1:拆分log变换步骤,对结果变量的变换设置skip=TRUE

这是最直接的tidymodels原生解决方案,通过skip参数让配方在预测时跳过对结果变量的log变换步骤:

# 修改后的recipe
trans_rec <- 
  recipe(Transactions ~ ., data = train.data) %>% 
  update_role(Event.ID, Opponent, new_role = "ID") %>%
  step_date(Calendar.Date, features = c("dow",'month','year'), keep_original_cols = FALSE) %>% 
  step_log(Total.Attendance) %>%  # 处理预测变量的log变换,无需跳过
  step_log(Transactions, skip = TRUE)  # 处理结果变量的log变换,预测时跳过

后续处理注意事项

因为模型是基于对数变换后的Transactions训练的,所以直接预测得到的是对数尺度的结果,需要用exp()反变换还原为原始数值:

# 生成预测并反变换
predictions <- predict(fit_mod, test.data) %>%
  mutate(Transactions_original = exp(.pred))

方案2:用条件判断自动处理训练/预测场景

通过step_mutate结合条件判断,仅当数据中存在Transactions列时(即训练阶段)才执行对数变换:

# 修改后的recipe
trans_rec <- 
  recipe(Transactions ~ ., data = train.data) %>% 
  update_role(Event.ID, Opponent, new_role = "ID") %>%
  step_date(Calendar.Date, features = c("dow",'month','year'), keep_original_cols = FALSE) %>% 
  step_log(Total.Attendance) %>%
  step_mutate(Transactions = if ("Transactions" %in% colnames(.data)) log(Transactions) else Transactions)

这种方法无需手动设置跳过参数,配方会自动适配训练和预测数据,但实际使用中方案1更符合tidymodels的设计规范。

额外确认步骤

确保你已经从调优结果中选出了最优参数:

# 从mod_res中选择最优penalty(以RMSE为例)
final_lass <- select_best(mod_res, metric = "rmse")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:53:16