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()
模型调优可视化结果

内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

