训练集与测试集即使没有重复行,也可能发生信息泄漏。如果先用全部数据计算均值、填补规则或筛选特征,再拆分训练与测试,测试数据已经参与了模型准备过程。

区分学习规则与应用规则
以均值中心化为例:训练阶段先从训练集计算均值,之后对训练集和测试集都减去这个均值。测试集需要同样的变换,但不应该重新参与均值估计。fit与transform的区别就在这里体现出来。
用两个小数组看清信息来源
自拟训练数据为0和2,测试数据为100。训练均值是1,全部数据均值却是34。两种处理得到的训练数值不同,说明测试值已经影响了处理规则。下面只演示这条信息路径,不把小数组当作真实模型效果实验。
交叉验证时也要守住边界
每一折中需要学习的预处理应只使用该折训练部分。官方建议用Pipeline串联转换与估计器,减少错误调用。本站建议在交付时记录数据拆分时点、哪些步骤会学习参数,以及最终测试集是否参与过调参。
可以运行的练习
from statistics import mean
train = [0, 2]
test = [100]
train_mean = mean(train)
leaked_mean = mean(train + test)
assert train_mean == 1
assert leaked_mean == 34
assert [x - train_mean for x in train] == [-1, 1]
assert [x - train_mean for x in test] == [99]
print("测试值不参与训练均值估计")
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
scikit-learn:数据泄漏与预处理。资料查阅日期:2026年10月5日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年10月5日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







