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

