如同我们上一章所谈到的,在模型学习过的数据上评估它,就像在考试前给学生提供考题和答案。他们可能获得满分,但这几乎不能说明他们是否真正理解了材料或能处理新问题。为了可靠地评估模型在新数据(未见过的数据)上的表现,我们必须在训练前预留一部分数据集。这项步骤,即训练-测试集划分,是评估流程的一个基本构成部分。将您的整个数据集视为所有可用信息的集合。我们需要将这个集合分成两个不同的部分:训练集: 这是较大的一部分,通常占总数据的70-80%。模型将完全从这些数据中学习模式、关系和规则。它是模型的“学习资料”。测试集: 这是剩余的较小部分(20-30%)。这些数据在训练阶段会完全独立存放。它充当模型的“期末考试”。我们只在模型训练完成后才使用它,以观察模型对从未见过的新实例的泛化能力如何。划分过程过程本身很简单:打乱顺序: 在划分之前,通常好的做法是随机打乱整个数据集的顺序。想象一下您的数据有某种固有顺序(例如按日期排序)。如果您只是简单地将前80%作为训练数据,后20%作为测试数据,您的测试集可能代表与训练集非常不同的时间段或条件,从而可能导致有偏差的结果。打乱顺序可确保训练集和测试集都包含各类数据点的代表性组合。划分: 打乱顺序后,您按照选择的比例(例如80/20)划分数据。digraph G { rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", color="#ced4da", fillcolor="#e9ecef"]; edge [fontname="sans-serif"]; FullData [label="完整数据集\n(100%)"]; TrainData [label="训练集\n(例如,80%)", color="#74c0fc", fillcolor="#a5d8ff"]; TestData [label="测试集\n(例如,20%)", color="#ffc078", fillcolor="#ffd8a8"]; FullData -> TrainData [label=" 划分 "]; FullData -> TestData [label=" 划分 "]; subgraph cluster_process { label = "训练-测试集划分"; style=filled; color="#f8f9fa"; node [style=filled,color=white]; FullData; TrainData; TestData; } }完整数据集被划分为独立的训练集和测试集的示意图。为何在此流程位置进行?在模型训练前进行划分是非常重要的。如果您在完整数据集上训练模型,然后才尝试选择测试集,模型就已经“见过”测试数据了,即使是间接的。这就失去了拥有独立评估集的意义。测试集必须保持原始和未触碰状态,直到最终评估阶段。实现说明大多数机器学习库都提供函数来轻松处理这一点。例如,在Python的scikit-learn库中,train_test_split函数被普遍使用。它根据指定的测试集大小比例处理数据的打乱和划分。通常,您会看到像random_state这样的选项。将其设置为特定数字可确保每次运行代码时都发生相同的随机打乱和划分。这使您的结果可重复,这对于调试和分享工作很重要。虽然我们在此不会查看具体的代码,但请记住,其主要思想是在流程中进一步操作之前,将您的数据随机划分为这两个不同的集合。通过仔细分离数据,我们为在一部分数据上训练模型,然后在预留的测试部分上对其性能进行公正无偏的评估奠定了基础。可靠模型评估正是建立在这种划分之上。