想象您正在教学生一门新学科。您会给他们学习资料和练习题。您怎么知道他们是否真正掌握了知识点,或者只是记住了您给他们的特定问题的答案?您不会用完全相同的练习题来测试他们,对吗?您会给他们一个包含不同问题但涵盖相同主题的新测试。机器学习模型也面临类似的挑战。如果我们用所有现有数据训练模型,然后用相同数据进行测试,它可能会表现完美,仅仅因为它“记住了”答案。这无法说明模型未来在新数据上的表现如何,而这通常是构建模型的主要目的。这种在新数据上表现良好的能力称为泛化能力。为了正确评估泛化能力并构建可靠的模型,我们将数据集划分为不同的子集。最常见的方法使用三个不同的集合:训练集这是您数据中最大的部分,通常占总数据集的 60% 到 80%。机器学习算法使用这些数据来实际学习输入特征与输出标签之间的模式和关联(在监督学习中)。可以将其视为模型的“教科书”和“家庭作业问题”。模型通过查看训练集中的示例,迭代调整其内部参数,力求最小化在此数据上产生的误差。验证集(或开发集)这是一个较小的、独立的数据块,约占总量的 10% 到 20%。模型不会直接在此数据上训练。相反,验证集有两个主要作用:超参数调整: 正如我们之前所学,超参数是我们在训练开始前选择的参数(与模型在训练期间学习的参数不同)。例如,可能包括选择模型的复杂度或设置训练算法的学习率。我们通常会尝试超参数的几种不同组合,为每种组合使用训练集训练单独的模型,然后评估每个训练模型在验证集上的表现。在验证集上带来最佳表现的超参数设置通常会被最终模型选用。模型选择与过拟合检查: 我们还可以使用验证集来比较不同类型的模型(例如,对于这个问题,我们应该使用线性回归还是 KNN?)。此外,通过在训练过程中监控模型在验证集上的表现,我们可以发现模型是否开始在训练数据上表现极好但在验证数据上表现不佳。这种差异常表明****过拟合,即模型过度记忆了训练数据,包括其噪声,并正在失去其泛化能力。验证集起到早期预警系统的作用。可以把验证集想象成学习过程中使用的“小测验”或“模拟考试”。它有助于指导学习策略(超参数调整),并检查真正的理解程度(泛化),而无需使用期末考试题目。测试集这个最终的子集,通常也占数据的 10% 到 20%,被保留下来,并且只在所有训练和超参数调整完成后使用一次。模型在构建过程中从未见过这些数据。“测试集的唯一目的是对所选模型的表现提供无偏的最终评估。它模拟了模型在新数据上的预期表现。”测试集绝对不能用于任何训练或调整决策,这一点非常重要。如果您在测试集上评估,然后根据结果回头调整模型或超参数,再重新评估,您就有效地“污染”了测试集。它不再提供无偏估计,因为您的决策受到了其特定数据的影响。可以把它想象成最终的、正式的考试。您只考一次,那个分数就代表您的知识。您不能在看到问题后反复重考。可视化划分我们可以可视化数据的这种划分:digraph G { rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", fontsize=10, margin=0.1]; edge [fontname="sans-serif", fontsize=9]; Dataset [label="完整数据集", fillcolor="#e9ecef", shape=folder]; Split [label="划分过程\n(通常随机)", shape=oval, fillcolor="#ced4da"]; Train [label="训练集\n(~60-80%)\n用于学习参数", fillcolor="#a5d8ff"]; Val [label="验证集\n(~10-20%)\n用于调整超参数\n和选择模型", fillcolor="#b2f2bb"]; Test [label="测试集\n(~10-20%)\n用于最终、无偏的\n性能评估", fillcolor="#ffec99"]; Dataset -> Split [arrowhead=none]; Split -> Train; Split -> Val; Split -> Test; }一个典型的工作流程涉及将初始数据集划分为训练集、验证集和测试集。模型从训练集学习,使用验证集进行调整,并最终在测试集上评估。常见做法数据在划分前通常会随机打乱,以确保每个集合都能代表数据的整体分布。具体的百分比(例如,70/15/15、80/10/10)可能会根据数据集的大小和具体问题而有所不同。对于非常大的数据集,较小的百分比可能足以用于验证和测试。有时,特别是对于更简单的工作流程或较小的数据集,人们可能只划分为训练集和测试集(例如,80/20),或许会使用交叉验证等技术在训练集上进行超参数调整和模型选择(我们稍后可能会遇到交叉验证)。然而,三集合划分(训练/验证/测试)是一种基本做法,被广泛接受,尤其是在开发更复杂的模型时。总而言之,将数据划分为训练集、验证集和测试集是机器学习中的一项基本技术。它使我们能够训练模型,有效地调整它们,并获得模型在新数据上表现如何的可靠估计,这对于构建值得信赖和有用的应用至关重要。这种做法直接有助于诊断和预防过拟合等常见问题,我们稍后将讨论此问题。