交叉验证中做特征工程要注意什么?
简化版
交叉验证中的特征工程必须在每个训练折内拟合,再应用到对应验证折;若先用全量数据计算标准化、筛选、目标编码或词表,就会把验证信息泄漏进训练。最稳妥的实现是把全部变换封装进 Pipeline。
详细版
-
无监督变换也可能泄漏总体分布,不能只防标签泄漏。
-
目标编码、特征选择必须严格折内计算。
-
验证折只能调用 transform,不能参与 fit。
-
时间数据使用向前滚动切分,不能随机 K 折。
-
最终方案确定后才用全部开发数据重训流水线。
完整版教学
一、评估单位是完整流水线,不只是模型
交叉验证模拟的是“拿一批旧数据训练,再处理未见数据”。
任何从数据估计参数的步骤都属于训练过程,包括均值、词表和缺失填充值。
先全量 fit 会让每个验证样本改变训练变换,即使幅度很小,指标仍不再是严格的未见数据泛化。
二、底层机制与公式
for train_idx,val_idx in folds:
pipeline.fit(X_train,y_train)
pred=pipeline.predict(X_val)
never: transformer.fit(X_all) before CV
三、带数字的推演
1000 个样本做 5 折。
若全量均值 10,而某训练折均值 8,提前标准化会让验证折信息把中心从 8 推到 10;正确做法是该折只用 800 个训练样本得到均值 8。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| Pipeline 折内拟合 | 最安全可复现 | 实现需组件化 |
| 全量预处理后 CV | 代码简单 | 产生泄漏 |
| 嵌套 CV | 调参与评估分离 | 计算成本高 |
五、执行流程
外层划分 -> 克隆流水线 -> 训练折 fit 所有变换与模型
-> 验证折只 transform/predict -> 汇总折指标 -> 全量重训
六、边界条件与工程代价
缓存折内特征时,缓存键必须包含折号、变换参数和数据版本,否则可能误复用其他折结果。
同一用户多条记录需分组切分;流水线正确也修复不了主体跨折造成的关联泄漏。
记忆钩子:把交叉验证对象记成“从原始数据到预测的整条生产线”。
七、常见误区与追问
-
误区:标准化不看标签,所以可以全量拟合。 它仍使用验证集分布,严格评估中属于泄漏。
-
追问:目标编码如何做? 在训练折内部再做折外编码,验证折只查训练统计。
-
误区:先选特征再交叉验证没有影响。 全量标签驱动的筛选会严重高估性能。
-
追问:Pipeline 解决什么? 保证每折按相同顺序独立 fit/transform。
-
追问:时间数据怎样切? 训练窗口必须早于验证窗口,并为标签延迟留间隔。
八、加强记忆
把交叉验证对象记成“从原始数据到预测的整条生产线”。
凡是有 fit 的步骤都关进训练折,验证折只能被动 transform。