你现在明白了为什么我们需要独立的训练集和测试集:为了公平评估模型在新数据、未见过的数据上的表现。你也清楚每个集合的用途:训练集用于教导模型,测试集则用于后续的评估。但我们如何实际进行这种划分呢?这个过程本身很简单。以下是标准训练-测试集划分的逐步指南:划分过程从你的整个带标签数据集开始: 设想你已收集所有数据,包括特征(输入)和目标变量(你希望预测的内容,如“垃圾邮件”/“非垃圾邮件”或房价)。这个完整的数据集是你的起点。打乱数据(通常建议): 在划分之前,通常非常推荐随机打乱数据集中行(即单个数据点或样本)的顺序。为什么?有时数据是按特定顺序收集或存储的。例如,可能所有“垃圾邮件”都列在前面,或者房价数据按社区排序。如果你在未打乱的情况下划分有序数据,你的训练集可能只包含一种类型的样本,而测试集包含另一种,这会导致训练效果不佳和评估结果有偏差。打乱数据可确保不同类型的样本能够随机分布在训练集和测试集中。我们将在本章后面更多地讨论这种随机性的意义。选择划分比例: 你需要决定你的数据中多少比例用于训练,多少比例用于测试。这个比例通常以百分比表示,例如 80/20(80% 用于训练,20% 用于测试)或 70/30。选择取决于几个因素,包括数据集的总大小。我们将在下一节讨论常见的比例。执行划分: 根据所选比例,将你打乱后的数据集分成两个独立、不重叠的子集。训练集: 包含数据中较大的部分(例如,80%)。这些数据将用于训练你的机器学习模型。模型从这个集合中学习模式、关系和规则。测试集: 包含剩余的较小部分(例如,20%)。这些数据被预留起来,在训练期间不向模型展示。它作为未见过的数据,用于评估。保持测试集独立: 这是一个非常重要的步骤。划分完成后,你应该像测试集不存在一样对待它,直到你有一个最终的、已训练好的模型准备好进行评估。不要使用测试集来决定如何构建或调整模型(例如选择要使用的特征或调整模型参数)。在模型构建过程中使用来自测试集的信息会污染它,你的最终评估将无法反映在真正新数据上的真实表现。划分的可视化可以把它想象成:你拿出完整的数据卡片,彻底洗牌,然后将一定比例的卡片分发到“训练堆”,其余的卡片分发到“测试堆”。digraph G { rankdir=LR; node [shape=box, style=filled, fontname="sans-serif", margin=0.2]; bgcolor="transparent"; subgraph cluster_0 { label = "原始数据集"; style=filled; color="#e9ecef"; node [style=filled, color="#adb5bd"]; OrigData [label="完整数据集\n(例如,1000个样本)", shape=folder]; } subgraph cluster_1 { label = "打乱"; style=filled; color="#e9ecef"; node [style=filled, color="#ced4da"]; ShuffledData [label="打乱后的数据集\n(随机顺序)", shape=folder]; } subgraph cluster_2 { label = "划分(例如,80/20)"; style=filled; color="#e9ecef"; subgraph cluster_train { label = "训练集"; style=filled; color="#a5d8ff"; node [style=filled, color="#74c0fc", fontcolor="#1c7ed6"]; TrainSet [label="训练数据\n(80% = 800个样本)\n\n用于构建模型"]; } subgraph cluster_test { label = "测试集"; style=filled; color="#ffc9c9"; node [style=filled, color="#ffa8a8", fontcolor="#f03e3e"]; TestSet [label="测试数据\n(20% = 200个样本)\n\n用于评估最终模型"]; } } OrigData -> ShuffledData [label=" 打乱行"]; ShuffledData -> TrainSet [label=" 取80% "]; ShuffledData -> TestSet [label=" 取20% "]; TrainSet -> Model [style=invis]; # Placeholder to structure layout if needed TestSet -> ModelEval [style=invis]; # Placeholder }一个流程图,显示数据集被打乱后,再分成独立的训练集和测试集。大多数机器学习库都提供了函数,可以轻松执行这种打乱和划分操作。例如,在 Python 的 scikit-learn 库中,train_test_split 函数通过一个命令就可以处理打乱和划分,它将你的特征、目标变量和所需的测试集大小作为输入。遵循此步骤,你便能在用于学习的数据与用于公正评估的数据之间建立必要的区分,这对于理解模型在实际中可能表现如何非常重要。