数据泄漏:标准化参数只能从训练集学习
先对全量数据求均值再切分,看起来只是预处理,却让测试集信息进入了训练流程。这样得到的评估可能过于乐观。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Intro to Large Language Models
视频介绍分类神经网络的基础;本文进一步讨论数据划分或评估指标,视频不是这些指标的逐项教程。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
先对全量数据求均值再切分,看起来只是预处理,却让测试集信息进入了训练流程。这样得到的评估可能过于乐观。
理解核心机制
切分应先于任何需要拟合的预处理。训练集计算的均值、词表或填补规则,应原样应用于验证和测试集。下面用故意不同的数值范围显露两种均值的差异。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
train = [1.0, 2.0, 3.0]
test = [100.0, 101.0]
train_mean = sum(train) / len(train)
leaked_mean = sum(train + test) / len(train + test)
transformed_test = [x - train_mean for x in test]
assert train_mean == 2.0 and leaked_mean != train_mean
print(train_mean, leaked_mean, transformed_test)适用边界与常见误区
随机切分也无法阻止同一用户、重复文档或未来信息跨集合泄漏。时间序列与分组数据要采用符合部署场景的切分方式。
继续练习
构造同一用户多条记录的数据,比较逐行随机切分与按用户切分,并追踪每个预处理参数来自哪个集合。