机器学习模型需要通过数据训练,也需要通过数据评价。但如果同一批数据既用于训练模型,又用于证明模型有效,评价结果就没有说服力。

为了区分“模型学得怎么样”和“模型对新样本是否有效”,通常需要把数据划分为训练集、验证集和测试集。

这三类数据看起来只是把样本分成几份,实际上承担着完全不同的职责。划分是否合理,直接决定我们看到的模型性能是真实泛化能力,还是被高估的结果。


一、训练集、验证集和测试集分别做什么

训练集:用于学习模型参数

训练集直接参与模型训练。

神经网络会根据训练样本计算预测误差,再通过优化算法调整模型参数。这个过程可能重复很多轮,直到训练损失下降到可接受水平。

因此,训练集回答的是:

模型能否从这些样本中学到一定规律?

训练集上的表现很重要,但不能单独证明模型有效。模型可能只是记住了这些样本。

验证集:用于选择模型和训练方案

验证集不直接用于更新模型参数,主要用于比较不同方案,例如:

  • 选择网络层数和宽度;
  • 调整学习率;
  • 选择正则化强度;
  • 判断训练何时停止;
  • 比较不同模型;
  • 选择最终版本。

研究者实际上会根据验证结果不断作出决策。因此,验证集虽然没有直接参与梯度计算,却参与了模型开发。

验证集回答的是:

在多个候选方案中,哪一个更值得保留?

测试集:用于最终独立评价

测试集应当只在模型和方案确定后使用,用于估计模型面对新样本时的性能。

它回答的是:

已经确定的模型,对未参与开发的数据表现如何?

测试集最重要的特征不是“没有用于训练”,而是:

它没有参与模型选择和反复调整。

如果研究者根据测试结果继续修改模型,测试集就逐渐失去了独立性。


二、8000、1000、1000只是教学示例

假设一共有一万个样本,可以划分为:

8000个训练样本
1000个验证样本
1000个测试样本

这一划分便于说明三类数据的职责,但不能把它当成固定公式。

实际比例取决于:

  • 数据总量;
  • 模型复杂度;
  • 任务难度;
  • 样本生成成本;
  • 测试结果所需的统计可靠性;
  • 是否采用交叉验证;
  • 是否存在独立实验数据。

当数据规模很大时,即使测试集只占较小比例,也可能已经包含大量样本;当数据很少时,简单划分可能导致训练数据不足,此时可以采用交叉验证等方法。

因此,真正重要的不是机械遵守某个比例,而是保证:

  1. 训练数据足以支持模型学习;
  2. 验证数据可以比较不同方案;
  3. 测试数据能够提供独立、可信的最终评价。

三、随机划分不一定合理

最常见的数据划分方法,是把全部样本随机打乱后,按照一定比例分配到三个集合中。

这种做法简单,但对于工程数据可能不够严格。

例如,一个天线结构通过轻微改变尺寸生成了大量相邻样本。如果随机划分,这些高度相似的结构可能同时出现在训练集和测试集中。

此时,测试样本虽然在文件编号上不同,实际上与训练样本非常接近。模型只需要在局部范围内插值,就可能取得很小误差。

这种结果不能证明模型能够处理真正不同的新结构。

对于具有结构关联的数据,更合理的划分单位可能是:

  • 按几何结构族划分;
  • 按设备或样品划分;
  • 按参数区域划分;
  • 按仿真批次划分;
  • 按实验对象划分;
  • 按时间顺序划分。

划分原则应当服从未来应用方式。

如果未来任务是预测一种从未见过的结构类型,测试集就应包含训练阶段完全没有出现过的结构类型,而不是只随机抽取相似样本。


四、什么是数据泄漏

数据泄漏是指模型训练或开发过程中,以直接或间接方式获得了本不应知道的测试信息,导致评价结果虚高。

明显的数据泄漏包括:

  • 把测试样本混入训练集;
  • 使用测试标签训练模型;
  • 在全部数据上先做特征选择,再划分数据;
  • 根据测试结果不断调整模型。

还有一些更隐蔽的泄漏。

1. 相似样本泄漏

同一原始对象经过轻微变换产生多个样本,然后分别进入训练集和测试集。

例如,同一天线结构在相邻频点上的数据被随机拆开,模型可能通过高度相关的数据间接“见过”测试对象。

2. 预处理泄漏

在全部数据上计算归一化参数,再划分训练集和测试集。

正确做法通常是:

  1. 只用训练集计算均值、方差或缩放范围;
  2. 使用同一组参数处理验证集和测试集。

否则,测试数据的统计信息已经提前进入训练流程。

3. 目标信息泄漏

某个输入特征包含了只有在结果产生之后才能知道的信息,或者与目标值存在不合理的直接关联。

这种模型可能获得很高准确率,但实际部署时根本无法获得相同输入。

数据泄漏之所以危险,是因为程序可能运行正常、指标甚至非常漂亮,却没有真正的泛化能力。


五、测试集不能被反复“看”

研究者通常不会直接把测试集加入训练,但可能不断查看测试结果:

  1. 第一个模型测试效果不好;
  2. 修改网络结构;
  3. 再看测试结果;
  4. 调整损失函数;
  5. 再次测试;
  6. 选择测试成绩最好的版本。

经过多轮调整后,测试集实际上已经参与了模型选择。最终报告的测试成绩不再是完全独立的评价。

更规范的流程是:

训练集:学习参数
验证集:反复比较和调整
测试集:最终方案确定后使用

如果项目需要长期迭代,可以保留一个更严格的最终测试集,直到关键版本完成时才启用。

在高要求工程应用中,还可以增加:

  • 外部测试集;
  • 独立实验数据;
  • 跨设备数据;
  • 跨时间数据;
  • 分布外测试集。

评价层次越接近真实应用,结果越有价值。


六、电磁问题中的划分案例

假设我们用不同尺寸、介电常数和馈电位置的微带天线数据训练谐振频率预测模型。

简单随机划分可能让相邻尺寸的样本同时出现在训练集和测试集中,模型测试误差很小。

但如果真实应用要求预测一种新的天线结构族,更严格的做法是:

  • 训练集:若干已知结构族;
  • 验证集:已知结构族中的独立参数组合;
  • 测试集:完全留出的结构族。

这时测试结果可能明显下降,但它更接近真实任务。

另一个例子是仿真数据与实验数据的区别。

如果模型训练和测试都来自同一求解器、同一网格规则和同一材料模型,它证明的是模型对该仿真数据分布的泛化能力,并不自动证明模型能够适应实验测量。

可以进一步使用实验数据作为外部测试,检查仿真与现实之间的差异。


七、学习者认识的修正

初步认识: 只要把数据随机分成训练集、验证集和测试集,就能够检验泛化能力。

这个认识不够完整。

随机划分只有在样本相对独立、数据分布合理,并且符合未来应用方式时才有效。对于高度相关、成组生成或具有结构层级的工程数据,随机划分可能严重高估模型能力。

更准确的判断是:

数据集划分不仅是数量比例问题,更是独立性和任务模拟问题。

一个好的测试集,应当尽可能模拟模型未来真正面对的新问题。


八、本节小结

训练集、验证集和测试集承担不同职责:

  1. 训练集用于学习模型参数;
  2. 验证集用于选择模型和训练方案;
  3. 测试集用于最终独立评价;
  4. 测试集反复参与调整后,就不再真正独立;
  5. 工程数据不能只机械随机划分,还要防止相关样本和预处理造成数据泄漏。

数据划分的目标,不是形式上得到三个文件夹,而是建立一道可信的评价边界。

下一节将讨论模型表现不佳的两种典型原因:

模型究竟是没有学会,还是把训练数据学得过于具体?

这分别对应欠拟合和过拟合。