1 概念作用

1.1 定义:训练集与测试集

训练集与测试集(Train-test split)指将一个已标注的数据集拆分为两部分:训练集用于学习模型参数,测试集用于在训练未见过的数据上衡量模型的预测效果。两者通常在抽样层面被尽量分离,以减少评估结果被“记住训练数据”的现象影响。

1.2 为什么需要划分:泛化评估

机器学习的目标不仅是拟合已知样本,更重要的是对未见样本保持稳定预测能力。若不划分数据,评估往往会混入“训练集上的拟合成绩”,从而高估模型能力。通过保留一个独立的测试集,可以更贴近真实部署时对新数据的表现,从而得到对泛化能力的估计。

1.3 与“模型训练/评估”流程的关系

在标准流程中,切分发生在训练过程开始之前,并贯穿后续各环节:

  • 训练阶段只使用训练集进行拟合与(必要时的)特征处理拟合参数;
  • 评估阶段仅使用测试集计算指标,不参与任何形式的模型选择
  • 若流程包含验证或超参搜索,则需要把数据划分成更细的集合,并确保“测试集”保持纯粹的最终评估用途。

2 数据划分的基本方法

2.1 随机划分(Random split)

随机划分指在不考虑样本属性、仅按索引或样本本身随机抽样的方式生成训练集与测试集。其优点是实现简单、统计意义较直观;缺点是当数据存在分布偏移、类别不平衡或时间依赖时,随机结果可能导致训练与测试分布不一致,从而降低评估的可解释性

2.2 分层划分(Stratified split)

分层划分是在抽样时保持类别(或更一般的离散标签)的比例相近,使得训练集与测试集在类别构成上更一致。尤其当类别比例差异明显、少数类样本稀缺时,分层能显著减少测试集中类别分布失衡带来的指标偏差

2.3 按时间划分(Time-based split)

当数据存在时间顺序、目标在未来发生、或特征含有随时间变化的影响时,常采用按时间划分:例如用更早的时间段作为训练集、较晚时间段作为测试集。这样做能避免未来信息泄漏,并更符合“训练后面向未来预测”的实际使用情景。

2.4 按组划分(Group-based split)

组划分用于样本之间存在相关性但这种相关性不应同时出现在训练与测试中。常见于同一主体、同一设备、同一用户、同一会话或同一作品的多条样本。通过以“组”为单位切分,可以降低因近似重复或高度相似样本跨集合导致的评估虚高。

3 划分比例与实验设计

3.1 常见比例:如 80/20 与 70/30

实践中常见的划分比例包括 80/20 与 70/30 等:前者倾向于给模型更多训练样本,后者给测试阶段更充足的评估样本。比例选择通常取决于数据规模、类别复杂度以及评估指标对样本量的敏感程度。对于样本充足的任务,较大的训练比例往往有利于拟合;对于需要稳健估计测试指标波动的场景,可能更偏向提高测试集占比。

3.2 样本量不足时的权衡

当数据较少时,增加测试集会减少训练数据,进而可能导致模型欠拟合或学习不充分;反之,减少测试集则会让测试指标的统计波动增大。此时更常见的做法是配合重采样交叉验证以获得更稳定的评估,同时保留一个严格的最终评估集合或遵循相应的验证策略,避免反复“看测试结果”导致隐性污染。

3.3 评估指标与测试集大小的匹配

不同指标对测试集规模的敏感性不同。例如某些基于排序或置信度的指标,或涉及少数类表现的度量,通常需要足够数量的相关样本才能稳定。若测试集中少数类样本过少,指标可能出现较大方差,从而使不同模型或不同设置之间的对比不可靠。因而在设计切分时,需把“测试集大小—指标方差—决策稳定性”一起考虑。

3.4 复现性随机种子与版本记录

当切分方式包含随机性时,应记录随机种子以及数据预处理与划分所依赖的版本信息。复现性不仅体现在同一次实验能否复现切分结果,还包括:数据是否在不同时间点发生过清洗差异、特征计算是否使用了不同参数、以及模型训练代码版本是否一致。良好的记录能使指标差异被归因到合理因素,而不是切分不一致。

4 可靠性与常见陷阱

4.1 数据泄漏Data leakage)的来源

数据泄漏指训练或评估过程中不恰当地使用了测试集所包含的信息,使得模型表现被人为抬高。常见来源包括:

  • 在全数据上计算归一化标准化统计量
  • 特征工程使用了与目标相关、且在测试阶段本应不可得的派生信息;
  • 使用了重复样本或近似样本导致的“记忆性”预测;
  • 在时间任务中未遵循时间顺序,导致未来信息进入训练。

4.2 特征工程是否也应同步划分

若特征工程包含“需要从数据中学习参数”的步骤(例如目标编码、基于频率的编码、统计特征的估计),应确保这些参数仅从训练集获得,再应用到测试集。即使特征工程本身不直接使用标签,也可能通过数据分布统计产生间接泄漏。相反,纯粹的确定性变换(例如固定规则的字符串处理)通常不涉及学习参数,可以与切分后流程更灵活地组合。

4.3 重复样本与相似样本导致的“假高分”

如果数据集中存在重复记录、近重复文本、同一来源的重采样版本,且它们分布在训练与测试两侧,模型可能通过相似性而不是泛化能力取得高分。此类“假高分”在图像、文本与多源采集任务中尤为常见。通常需要进行去重策略或采用组划分,避免同一实体的相似样本跨集合。

4.4 类别极不平衡下的测试偏差

当类别分布高度不均衡,随机切分可能导致测试集中少数类样本极少,从而使指标对偶然抽样高度敏感。即便总体比例接近,少数类在测试集的绝对数量仍可能不足以支撑稳定判断。分层划分、合适的指标选择,以及必要时的重采样与置信区间评估,都是降低偏差的常用手段。

4.5 结果方差与测试集波动

测试指标不仅取决于模型,还受到切分随机性的影响。若测试集较小或分布复杂,不同随机种子可能带来显著差异。此时应报告或至少评估指标的波动范围,例如通过多次切分的重复实验、或借助重采样/交叉验证来获得更稳健的估计。这样可以避免“单次切分的偶然运气”被误认为普遍性能。

5 与其他评估策略的关系

5.1 训练集/测试集 vs 交叉验证

训练集/测试集是一次性划分的评估思路;交叉验证则通过多次划分轮换训练与验证/测试角色,从而减少单次切分带来的方差。两者差异在于:前者更接近“最终部署前的单次评估”,后者更强调“更稳健的性能估计”。在数据较少或希望降低结果波动时,交叉验证通常更有优势。

5.2 训练集/验证集/测试集的三段式

三段式将数据进一步分为训练集、验证集和测试集:

  • 训练集用于学习;
  • 验证集用于超参选择、模型比较与早停等决策;
  • 测试集仅在最终定型后使用一次,用于报告可信的泛化效果。

该结构的核心是保持测试集的“不可用于决策”,从流程上防止评估污染。

5.3 重采样方法(如 bootstrap)概览

重采样方法通过对数据进行重复抽样来估计指标分布。以 bootstrap 为例,它能从抽样机制带来对性能波动与置信度的刻画。需要注意的是,重采样在存在样本相关性(如同组重复、时间依赖)时可能仍产生偏差,因此应结合合适的分组策略或采用改进版重采样框架。

5.4 超参搜索中的划分策略(避免评估污染)

超参搜索(如网格搜索或贝叶斯优化)往往伴随多次训练与评估。若在搜索过程中使用了测试集来选择最佳模型,会导致对测试结果的“迭代拟合”,从而失去测试集作为最终评估的公正性。更规范的做法是:

  • 使用训练集进行学习;
  • 用验证集进行模型选择;
  • 把测试集留到全部选择完成后再做一次测量。

在实践中,也可采用交叉验证来替代验证集,从而更充分利用数据,但仍需确保最终报告阶段不再受选择过程影响。

6 实践操作要点

6.1 选择划分策略的决策流程

选择切分策略可按以下思路展开: 1) 明确任务是否存在时间依赖或未来信息不可得;若存在,优先考虑时间划分; 2) 检查数据是否存在同一主体/同一来源的多条相关样本;若存在,采用组划分; 3) 判断类别是否不平衡且少数类是否影响关键指标;若存在,采用分层划分; 4) 若以上都不突出且数据规模足够,可使用随机划分,并配合多次切分评估波动。 在所有情况下,应尽量使训练与评估在“数据生成机制”上保持一致。

6.2 分层与时间约束的具体实现思路

分层与时间约束可能同时存在,例如按时间切片后再在每个时间窗口内做分层。实现时需要确保:时间顺序不会被打乱,分层只在允许的集合内完成。对于复杂场景,通常先确定边界(例如训练窗口与测试窗口),再在边界内满足类别比例约束;若还涉及组相关性,则以组为单位进一步组织抽样顺序。

6.3 在管道(Pipeline)中防止泄漏

在工程实践中,常用管道将预处理、特征构建与模型训练串联。为防止泄漏,应做到:

  • 管道中“需要学习参数”的步骤只在训练数据上拟合;
  • 在将模型应用到测试集时,只执行变换部分,不再接触测试集的统计信息;
  • 切分点应位于管道之前,或在管道框架中明确区分 fit 与 transform 的数据流。

这样可以降低人为疏漏造成的评估失真。

6.4 如何报告实验:数据切分描述规范

报告切分信息通常至少包含:

  • 划分方式(随机/分层/时间/组);
  • 训练集与测试集比例;
  • 是否设置随机种子;
  • 类别分布或关键统计的对齐方式;
  • 若涉及时间任务,说明时间边界;
  • 若涉及组划分,说明组的定义与去重/过滤策略。

充分的描述有助于他人复现实验,也便于比较不同研究是否在同一评估条件下得到结果。

6.5 常见调参“梗”:别把测试集当验证集

一个常见但非常致命的错误是:把测试集当作“反复调参的验证集”。当研究者不断查看测试指标来决定模型结构、超参范围或特征选择时,测试集就被无意间用于决策,最终报告的数字会变得不再可信。这种情况有时被形容为“偷看答案”:一开始看起来提升很明显,然而当真正的新数据到来时,性能可能明显回落。更稳妥的做法是建立验证集(或用交叉验证)来做选择,并在最后才触碰测试集。