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

如何避免tidymodels中predict()输出列名不一致问题?

解决tidymodels线性模型预测列名异常(.pred_res而非.pred)导致的报错问题

问题核心

使用tidymodels构建线性模型工作流时,predict()输出的预测列名为.pred_res而非默认的.pred,导致tune::last_fit()或DALEXtra::explain_tidymodels()因找不到.pred列报错,且该问题仅在自身数据集上出现,示例数据集无法复现。

可能原因及解决办法

1. 配方中对响应变量的重命名操作

如果在recipe()定义里通过step_mutate()或rename()将响应变量重命名为res(或其他自定义后缀),tidymodels会自动将预测列命名为.pred_<响应变量名>,比如响应变量名为res时生成.pred_res。

解决步骤:

  • 检查配方代码,移除对响应变量的自定义重命名,或保持响应变量名为常规名称(比如y)
  • 示例修正:
    # 错误示例:重命名了响应变量
    bad_recipe <- recipe(res ~ ., data = train_data) %>% 
      step_mutate(res = original_response_col)
    
    # 修正后:使用原始响应变量名
    good_recipe <- recipe(original_response_col ~ ., data = train_data)
    

2. 手动修正预测列名

若无法修改配方或数据结构,可在预测后手动将.pred_res重命名为.pred,适配后续函数要求:

针对tune::last_fit()结果:

last_fit_result <- last_fit(your_workflow, split = data_split)

# 重命名预测列
last_fit_result$.predictions <- last_fit_result$.predictions %>%
  dplyr::rename(.pred = .pred_res)

针对DALEXtra::explain_tidymodels():

自定义预测函数,直接返回.pred_res列的值,无需修改原始数据:

# 定义自定义预测函数
custom_predict <- function(model, newdata) {
  predict(model, newdata)$.pred_res
}

# 创建解释器时指定该函数
explainer <- DALEXtra::explain_tidymodels(
  model = your_fitted_workflow,
  data = test_data,
  y = test_data$your_response_variable,
  predict_function = custom_predict
)

3. 排查工作流的特殊配置

逐步简化工作流,排查是否有其他步骤导致列名异常:

  • 先构建最简线性模型工作流(仅基础配方+线性模型),验证预测列名是否为.pred
  • 逐步添加配方中的预处理步骤(如标准化、缺失值填充等),定位引发列名变化的具体步骤

验证方法

取自身数据集的小样本子集,运行最简工作流测试:

# 取10行数据测试
small_train <- train_data %>% slice(1:10)
small_test <- test_data %>% slice(1:10)

# 最简工作流
simple_workflow <- workflow() %>%
  add_recipe(recipe(response_col ~ ., data = small_train)) %>%
  add_model(linear_reg() %>% set_engine("lm"))

# 拟合并预测
fit <- fit(simple_workflow, small_train)
pred <- predict(fit, small_test)

# 查看列名
colnames(pred)

若此时列名正常为.pred,则逐步添加原工作流中的其他步骤,找到问题根源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:35:09