机器学习模型需要通过数据训练,也需要通过数据评价。但如果同一批数据既用于训练模型,又用于证明模型有效,评价结果就没有说服力。
为了区分“模型学得怎么样”和“模型对新样本是否有效”,通常需要把数据划分为训练集、验证集和测试集。
这三类数据看起来只是把样本分成几份,实际上承担着完全不同的职责。划分是否合理,直接决定我们看到的模型性能是真实泛化能力,还是被高估的结果。
一、训练集、验证集和测试集分别做什么
训练集:用于学习模型参数
训练集直接参与模型训练。
神经网络会根据训练样本计算预测误差,再通过优化算法调整模型参数。这个过程可能重复很多轮,直到训练损失下降到可接受水平。
因此,训练集回答的是:
模型能否从这些样本中学到一定规律?
训练集上的表现很重要,但不能单独证明模型有效。模型可能只是记住了这些样本。
验证集:用于选择模型和训练方案
验证集不直接用于更新模型参数,主要用于比较不同方案,例如:
- 选择网络层数和宽度;
- 调整学习率;
- 选择正则化强度;
- 判断训练何时停止;
- 比较不同模型;
- 选择最终版本。
研究者实际上会根据验证结果不断作出决策。因此,验证集虽然没有直接参与梯度计算,却参与了模型开发。
验证集回答的是:
在多个候选方案中,哪一个更值得保留?
测试集:用于最终独立评价
测试集应当只在模型和方案确定后使用,用于估计模型面对新样本时的性能。
它回答的是:
已经确定的模型,对未参与开发的数据表现如何?
测试集最重要的特征不是“没有用于训练”,而是:
它没有参与模型选择和反复调整。
如果研究者根据测试结果继续修改模型,测试集就逐渐失去了独立性。
二、8000、1000、1000只是教学示例
假设一共有一万个样本,可以划分为:
8000个训练样本
1000个验证样本
1000个测试样本
这一划分便于说明三类数据的职责,但不能把它当成固定公式。
实际比例取决于:
- 数据总量;
- 模型复杂度;
- 任务难度;
- 样本生成成本;
- 测试结果所需的统计可靠性;
- 是否采用交叉验证;
- 是否存在独立实验数据。
当数据规模很大时,即使测试集只占较小比例,也可能已经包含大量样本;当数据很少时,简单划分可能导致训练数据不足,此时可以采用交叉验证等方法。
因此,真正重要的不是机械遵守某个比例,而是保证:
- 训练数据足以支持模型学习;
- 验证数据可以比较不同方案;
- 测试数据能够提供独立、可信的最终评价。
三、随机划分不一定合理
最常见的数据划分方法,是把全部样本随机打乱后,按照一定比例分配到三个集合中。
这种做法简单,但对于工程数据可能不够严格。
例如,一个天线结构通过轻微改变尺寸生成了大量相邻样本。如果随机划分,这些高度相似的结构可能同时出现在训练集和测试集中。
此时,测试样本虽然在文件编号上不同,实际上与训练样本非常接近。模型只需要在局部范围内插值,就可能取得很小误差。
这种结果不能证明模型能够处理真正不同的新结构。
对于具有结构关联的数据,更合理的划分单位可能是:
- 按几何结构族划分;
- 按设备或样品划分;
- 按参数区域划分;
- 按仿真批次划分;
- 按实验对象划分;
- 按时间顺序划分。
划分原则应当服从未来应用方式。
如果未来任务是预测一种从未见过的结构类型,测试集就应包含训练阶段完全没有出现过的结构类型,而不是只随机抽取相似样本。
四、什么是数据泄漏
数据泄漏是指模型训练或开发过程中,以直接或间接方式获得了本不应知道的测试信息,导致评价结果虚高。
明显的数据泄漏包括:
- 把测试样本混入训练集;
- 使用测试标签训练模型;
- 在全部数据上先做特征选择,再划分数据;
- 根据测试结果不断调整模型。
还有一些更隐蔽的泄漏。
1. 相似样本泄漏
同一原始对象经过轻微变换产生多个样本,然后分别进入训练集和测试集。
例如,同一天线结构在相邻频点上的数据被随机拆开,模型可能通过高度相关的数据间接“见过”测试对象。
2. 预处理泄漏
在全部数据上计算归一化参数,再划分训练集和测试集。
正确做法通常是:
- 只用训练集计算均值、方差或缩放范围;
- 使用同一组参数处理验证集和测试集。
否则,测试数据的统计信息已经提前进入训练流程。
3. 目标信息泄漏
某个输入特征包含了只有在结果产生之后才能知道的信息,或者与目标值存在不合理的直接关联。
这种模型可能获得很高准确率,但实际部署时根本无法获得相同输入。
数据泄漏之所以危险,是因为程序可能运行正常、指标甚至非常漂亮,却没有真正的泛化能力。
五、测试集不能被反复“看”
研究者通常不会直接把测试集加入训练,但可能不断查看测试结果:
- 第一个模型测试效果不好;
- 修改网络结构;
- 再看测试结果;
- 调整损失函数;
- 再次测试;
- 选择测试成绩最好的版本。
经过多轮调整后,测试集实际上已经参与了模型选择。最终报告的测试成绩不再是完全独立的评价。
更规范的流程是:
训练集:学习参数
验证集:反复比较和调整
测试集:最终方案确定后使用
如果项目需要长期迭代,可以保留一个更严格的最终测试集,直到关键版本完成时才启用。
在高要求工程应用中,还可以增加:
- 外部测试集;
- 独立实验数据;
- 跨设备数据;
- 跨时间数据;
- 分布外测试集。
评价层次越接近真实应用,结果越有价值。
六、电磁问题中的划分案例
假设我们用不同尺寸、介电常数和馈电位置的微带天线数据训练谐振频率预测模型。
简单随机划分可能让相邻尺寸的样本同时出现在训练集和测试集中,模型测试误差很小。
但如果真实应用要求预测一种新的天线结构族,更严格的做法是:
- 训练集:若干已知结构族;
- 验证集:已知结构族中的独立参数组合;
- 测试集:完全留出的结构族。
这时测试结果可能明显下降,但它更接近真实任务。
另一个例子是仿真数据与实验数据的区别。
如果模型训练和测试都来自同一求解器、同一网格规则和同一材料模型,它证明的是模型对该仿真数据分布的泛化能力,并不自动证明模型能够适应实验测量。
可以进一步使用实验数据作为外部测试,检查仿真与现实之间的差异。
七、学习者认识的修正
初步认识: 只要把数据随机分成训练集、验证集和测试集,就能够检验泛化能力。
这个认识不够完整。
随机划分只有在样本相对独立、数据分布合理,并且符合未来应用方式时才有效。对于高度相关、成组生成或具有结构层级的工程数据,随机划分可能严重高估模型能力。
更准确的判断是:
数据集划分不仅是数量比例问题,更是独立性和任务模拟问题。
一个好的测试集,应当尽可能模拟模型未来真正面对的新问题。
八、本节小结
训练集、验证集和测试集承担不同职责:
- 训练集用于学习模型参数;
- 验证集用于选择模型和训练方案;
- 测试集用于最终独立评价;
- 测试集反复参与调整后,就不再真正独立;
- 工程数据不能只机械随机划分,还要防止相关样本和预处理造成数据泄漏。
数据划分的目标,不是形式上得到三个文件夹,而是建立一道可信的评价边界。
下一节将讨论模型表现不佳的两种典型原因:
模型究竟是没有学会,还是把训练数据学得过于具体?
这分别对应欠拟合和过拟合。