数据集:拆分原始数据集

所有优秀的软件工程项目都会投入大量精力来测试其应用。同样,我们强烈建议您测试机器学习模型,以确定其预测的正确性。

训练集、验证集和测试集

您应使用与训练模型所用示例不同的示例集来测试模型。正如您将在稍后了解到的那样,与对同一组示例进行测试相比,对不同的示例进行测试更能证明模型的适用性。您从哪里找到这些不同的示例?在传统的机器学习中,您可以通过拆分原始数据集来获取这些不同的示例。因此,您可能会假设应将原始数据集拆分为两个子集:

图 8. 水平条分为两段:约 80% 属于训练集,约 20% 属于测试集。
图 8. 这不是最佳分配。

 

练习:检查您的直觉

假设您在训练集中进行训练,并在多个回合中对测试集进行评估。在每一轮中,您都可以使用测试集结果来指导如何更新超参数和特征集。您能否发现此方法有什么问题?请仅选择一个答案。
多次重复执行该流程可能导致模型不知不觉地拟合测试集的特性。
是的!使用同一测试集的频率越高,模型与测试集的拟合度就越高。 就像老师“因考试而教”一样,模型会无意中拟合测试集,这可能会使模型更难拟合真实数据。
这种方法没问题。毕竟,您是使用训练集进行训练,并使用单独的测试集进行评估。
实际上有一个小问题。想想可能会逐渐出现什么问题。
这种方法的计算效率较低。不要在每轮测试后更改超参数或特征集。
频繁测试费用高昂,但至关重要。不过,频繁测试的费用远低于额外训练的费用。优化超参数和特征集可以显著提高模型质量,因此请务必预留时间和计算资源来进行优化。

将数据集划分为两组是一个不错的主意,但更好的方法是将数据集划分为 三个子集。除了训练集和测试集之外,第三个子集是:

  • 验证集会在模型训练期间对其进行初始测试。
图 9. 水平条分为三段:70% 属于训练集,15% 属于验证集,15% 属于测试集
图 9. 效果好多了。

使用验证集评估训练集中的结果。反复使用验证集后,如果模型的预测结果良好,请使用测试集仔细检查模型。

下图展示了此工作流。在图中,“调整模型”是指调整模型的任何方面,从更改学习速率、添加或移除特征,到从头设计全新的模型。完成此工作流后,您可以选择在测试集上效果最佳的模型。

图 10。包含以下阶段的工作流程图:
            1. 使用训练集训练模型。
            2. 在验证集上评估模型。
            3. 根据验证集上的结果调整模型。
            4. 迭代 1、2 和 3,最终选择在验证集上表现最佳的模型。
            5. 确认测试集的结果。
图 10. 良好的开发和测试工作流程。

图 10 中显示的工作流是最佳实践,但即使采用该工作流,测试集和验证集在反复使用后仍会“磨损”。也就是说,您越是使用相同的数据来做出超参数设置或其他模型改进方面的决策,模型对新数据做出准确预测的信心就越小。因此,最好收集更多数据来“刷新”测试集和验证集。重新开始是一次很好的重置。

练习:检查您的直觉

您已对数据集中的所有示例进行随机排序,并将随机排序的示例划分为训练集、验证集和测试集。但是,测试集上的损失值非常低,因此您怀疑自己出错了。可能出现了什么问题?
测试集中的许多示例与训练集中的示例重复。
可以。如果数据集中包含大量冗余示例,就可能会出现这种问题。我们强烈建议您在测试前从测试集中删除重复示例。
训练和测试是非确定性的。有时,测试损失率可能会出于偶然原因而非常低。重新运行测试以确认结果。
虽然每次运行时损失确实会略有不同,但不应相差太大,否则您可能会认为自己中了机器学习彩票。
测试集恰好包含模型表现出色的示例。
示例已被充分打乱,因此这种情况极不可能发生。

测试集的其他问题

如前面的问题所示,重复示例可能会影响模型评估。将数据集拆分为训练集、验证集和测试集后,请删除验证集或测试集中与训练集中的示例重复的所有示例。对模型进行公平测试的唯一方法是使用新示例,而不是重复示例。

例如,假设有一个模型,它使用主题行、电子邮件正文和发件人的电子邮件地址作为特征来预测某封电子邮件是否为垃圾邮件。假设您将数据划分为训练集和测试集,比例为 80-20。训练后,该模型在训练集和测试集中都达到了 99% 的精确度。您可能预计测试集的精确率会较低,因此您再次查看数据,发现测试集中的许多示例与训练集中的示例重复。问题在于,您在拆分数据之前,忘记从输入数据库中清除同一垃圾邮件的重复条目。您无意中使用了部分测试数据进行训练。

总而言之,一个好的测试集或验证集应满足以下所有条件:

  • 足够大,能够得出具有统计显著性的测试结果。
  • 能代表整个数据集。换言之,挑选的测试集的特征应该与训练集的特征相同。
  • 代表模型在履行其业务用途时会遇到的真实数据。
  • 训练集中没有重复的示例。

练习:检查您的理解情况

假设有一个包含固定数量示例的单个数据集,以下哪个陈述是正确的?
用于测试模型的每个示例都会减少用于训练模型的示例数量。
将示例划分为训练集/测试集/验证集是一场零和游戏。 这是核心的权衡。
测试集中的示例数必须大于验证集中的示例数。
从理论上讲,验证集和测试集应包含相同数量(或几乎相同数量)的示例。
测试集中的示例数必须大于验证集或训练集中的示例数。
训练集中的示例数量通常多于验证集或测试集中的示例数量;不过,不同集没有百分比要求。
假设您的测试集包含足够的示例来执行具有统计显著性的测试。此外,针对测试集进行测试会产生较低的损失。不过,该模型在实际环境中的表现不佳。您该怎么做?
确定原始数据集与实际数据的差异。
可以。即使是最好的数据集也只是真实数据的快照;底层标准答案往往会随时间而变化。虽然您的测试集与训练集的匹配度足以表明模型质量良好,但您的数据集可能与真实数据不完全匹配。 您可能需要针对新数据集重新训练和重新测试。
在同一测试集中重新测试。测试结果可能属于异常情况。
虽然重新测试可能会产生略有不同的结果,但这种做法可能没有多大帮助。
测试集应包含多少个示例?
足够的示例,可获得具有统计显著性的测试结果。
可以。有多少个示例?您需要进行实验。
至少占原始数据集的 15%。
15% 的示例数量可能不够,也可能足够。