测试集是机器学习中专门留出、用于评估已训练模型的一组样本。其目的是衡量泛化(机器学习)能力,即模型在未用于拟合模型或指导其开发的数据上的表现。在监督学习中,测试样本通常包含输入和参考目标值,用于将预测结果与目标值进行比较。测试集的本质特征在于其独立评估的作用,而非某种特定的规模或文件格式。(developers.google.com)
与训练数据和验证数据的关系
常规开发流程将数据分为三部分。训练数据提供样本,模型从中学习参数。验证集用于支持开发过程中的决策,例如选择超参数配置、选择特征或确定何时停止训练。测试集则在这些选择完成后评估最终得到的模型。这样的划分有助于降低一种风险:将模型对开发数据的适应误认为它在真正未见过的样本上的表现。(developers.google.com)
这些角色由实际用途决定,而不只是名称。如果开发者反复查看测试得分并据此修改模型,那么即使测试样本从未参与参数拟合,测试集也已成为模型选择过程的一部分。这可能导致模型对测试集过拟合,并使性能估计过于乐观。另行留出一组独立数据用于最终评估,可以重新确立开发与测试之间的区别。(developers.google.com)
构建测试集
数据划分应当反映所要评估的预测情境。当有理由将各个观测视为来自同一概率分布的独立样本时,适合采用随机划分。对于分类任务,分层划分可使各子集中的类别比例大致相同,从而减少划分造成的偶然差异。(scikit-learn.org)
其他情境则需要按数据结构进行划分。当多条记录属于同一个人、同一台设备或同一份文档,而评估目标是模型在未见过的组别上的表现时,按组划分可避免相关观测同时出现在划分后的两侧。对于时间序列,按时间顺序划分可以评估模型利用较早数据对较晚观测进行预测的表现;随机打乱数据可能掩盖时间依赖关系,产生误导性的估计。(scikit-learn.org)
测试集是否足够,不能由某个固定比例来界定。分配更多样本用于测试,通常就会减少可用于训练的样本;而测试样本过少,又会降低估计的精确程度。测试集是否合适,取决于观测数量、任务难度,以及相关情形是否得到充分体现。如果一个数据集与训练数据相似,却不能代表预期部署时面向的总体,就可能得到很好的测试结果,但在现实应用中并无相应表现。(developers.google.com)
防止数据泄漏
数据泄漏(机器学习)是指模型构建过程使用了在预期预测条件下无法获得的信息。除直接接触测试目标值外,预处理也可能造成泄漏。例如,在整个数据集上拟合特征缩放变换,会将测试集的统计信息引入开发过程。正确做法是仅从训练数据中学习变换,再将其原样应用于测试样本。(scikit-learn.org)
同样的原则也适用于缺失数据插补、特征选择和主成分分析。在重采样过程中,这些操作应纳入每次划分对应的训练流程。处理流水线有助于维持这一界限。训练集和测试集中出现重复样本也会破坏独立性,因为看似良好的表现可能源于模型先前接触过这些样本,而非泛化能力。(scikit-learn.org)
性能指标与不确定性
测试性能通过适合任务的指标来表示。分类指标包括准确率、精确率、召回率和F值。回归指标包括均方误差、平均绝对误差和决定系数。概率预测可使用交叉熵等指标进行评估。因此,报告的得分描述的是模型在特定评估规则下的表现,而非模型在所有可能意义上的质量。(scikit-learn.org)
测试集上损失函数的平均值可写为
其中, 是拟合得到的预测器, 衡量预测结果与参考目标值之间的差异。对于一个固定模型,如果评估使用的是来自目标分布的独立观测,那么这一平均值估计的是预测损失的期望值。如何解释这一估计,取决于采样假设,以及评估是否独立于模型选择。(scikit-learn.org)
测试得分存在采样不确定性。置信区间和自助采样可以量化这种不确定性的某些方面,所采用的方法和假设会影响结果。多个模型在同一个有限测试集上的得分差异,并不必然意味着其真实预测性能存在可靠差异。(arxiv.org)
交叉验证与评估范围
交叉验证反复将数据划分为用于拟合和用于评估的折。它可以在开发数据内部支持模型选择,同时让另行留出的测试集保持不被使用。术语用法有所不同:某一折可能被称为“测试折”,即使其得分被用于开发;这与最终留出的测试集并不相同。(arxiv.org)
嵌套交叉验证通过内层折进行调优、外层折进行评估,从而将这两种角色分开。它估计的是学习与选择这一整套流程的性能,而不只是报告调优得到的最高得分。如果随后根据外层折的结果在多个候选流程之间进行选择,却未再做进一步评估,那么这些结果也就失去了独立评估的作用。(scikit-learn.org)
测试结果始终只适用于评估中所体现的样本、目标和条件。部署时面向的总体或数据生成过程发生变化,都可能削弱测试结果的参考价值。因此,仅凭模型在一个预留数据集上的表现,无法确定它在其他总体或未来条件下的表现。(developers.google.com)