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

tidymodels中`recipe`与`resample`数据关联及重复传入冲突疑问

正则化回归工作流中数据传入的关联与冲突问题

核心问题

向recipe传入的数据与向resample函数传入的数据有何关联?在带交叉验证的正则化回归workflow中,数据会被传入两次:一次在recipe调用中,一次在vfold_cv调用中。若recipe执行了排序、扩展哑变量等预处理操作,改变了观测顺序和数据框列的数据类型,而vfold_cv未进行此类处理,这是否会引发冲突?

详细解答

1. 两次传入数据的关联

两次传入的必须是结构、内容完全一致的原始数据集:

  • recipe(data = ...)中的数据仅用于定义预处理规则:识别变量类型(数值/分类)、确认公式的响应变量与预测变量关系,不会直接参与后续的交叉验证计算。
  • vfold_cv(data = ...)中的数据是实际用于拆分交叉验证折的原始数据,后续的预处理、模型拟合都会基于这份数据拆分后的子集执行。

2. 预处理操作不会引发冲突

tidymodels的工作流是按折隔离执行预处理的,完全避免了预处理与折拆分的冲突:

  • 第一步:vfold_cv先对原始数据完成K折拆分,得到K组训练/验证子集对。
  • 第二步:对每个折的训练子集单独执行recipe中的所有预处理操作(缩放、中心化、哑变量扩展、排序等),并且所有预处理的统计量(比如均值、标准差、哑变量类别)都只基于当前训练子集计算。
  • 第三步:用训练子集处理后的结果拟合模型,再用同一套训练子集生成的预处理规则处理对应的验证子集,最后评估模型性能。
  • 整个过程中,预处理操作仅作用于单折的子集,不会改变原始数据的顺序或结构,自然不会影响折的拆分逻辑。

3. 代码中警告的说明

你代码里出现的警告,是因为部分变量(比如vs/am这类二元变量)在某个交叉验证折的训练子集里取值完全一致(全0或全1),导致step_scale()计算标准差时出现除以0的情况,和数据传入的关联、预处理与折拆分的冲突无关。

原代码示例

library(tidymodels)

model <- workflow() |> 
  add_recipe(
    recipe(mpg ~ wt + cyl + drat + qsec + vs + am, data = mtcars) |> # 定义预处理规则
      step_scale() |> 
      step_center()
  ) |> 
  add_model(
    linear_reg(penalty = tune()) |> 
      set_engine("glmnet")
  ) |> 
  tune_grid(
    resamples = vfold_cv(v = 5, data = mtcars), # 拆分交叉验证折
    grid = tibble(penalty = 10^seq(-8, 1, length.out = 40))
  )

model |> 
  autoplot()

模型调优可视化结果

模型调优RMSE与penalty关系图


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:03:11