定义每个样本代表什么
先写一句决策说明:识别新工单的类别、从文档中抽取三个字段,还是结合附件回答一个问题。描述预测时可用的输入、期望的输出以及范围之外的情况。在工单解决之后才加入的信息,不应出现在本应代表其到达时刻的输入中。
接下来区分数据行与独立单元。同一对话中的五条消息共享一个上下文;同一卷宗中的十页共享其来源。如果你的目标针对的是新卷宗,就要让每个卷宗只落在同一个划分中。按用户、文档、设备或时段来分离,对应的是不同的问题:请选择最接近未来使用场景的那一种,并在清单中写明其理由。
为每个数据集分配角色
训练集用于调整模型。验证集指导开发决策:提示词、阈值、超参数或变体的选择。最终测试集回答一个已经固定的问题。若为了挑出最佳设置而查看它,就会逐步把这个测试集变成开发工具,即便并未在其上计算任何梯度。
还要分离用于学习变换的数据。在整个语料上拟合的归一化、变量选择或缺失值填补,都可能把信息传递给模型。请在允许的划分上学习这些变换,再把保存下来的变换应用到其他数据集。流水线有助于这种控制;但仅靠它并不能修正分组划分不当的问题。
| 数据集 | 允许的用途 | 应避免的决策 |
|---|---|---|
| 训练集 | 调整参数和学习到的变换 | 把最终测试集的答案导入其中 |
| 验证集 | 选择设置、提示词和阈值 | 把最佳探索性分数当作独立的最终结果来呈现 |
| 最终测试集 | 按照既定规则评估选定的配置 | 在查看之后修改设置,再把同一个分数当作确认结果来复用 |
| 可能的校准集 | 为需要它的量化方法做准备 | 用最终测试集来构建待评估的变体 |
处理重复项而不抹去困难样本
保留原始语料,然后构建一个带有标识符、来源和分组的工作清单。根据所选表示方式对内容做指纹,可检测完全相同的副本。请记录这种表示方式:去除所有标点或将文本转为小写,可能会合并那些差异对任务而言很关键的条目。保留被剔除副本与保留样本之间的对应关系。
近似重复项需要额外复核:修改后的导出、改写的回答、共同段落或重新编辑的文档。高度相似是一个需要审视的信号,而不是两条标注可以互换的证据。在划分数据之前,先对相关联的变体进行分组。如果两个副本带有相互矛盾的参考标注,请开立一个标注问题;不要自动选择模型预测得最好的那一个。
实例演示:1 200 行并不等于 1 200 个独立观测
此示例完全为说明性质:未对任何语料或模型进行测量。假设有 240 段对话,每段导出为五行。每段对话中有一行是完全相同的副本,另外四行各不相同。去掉这 240 个副本后剩下 960 个样本,仍然组织为 240 个组。下述教学性划分将 70% 的组留给训练,15% 用于验证,15% 用于测试。
得到 168、36 和 36 段对话,即 672、144 和 144 个样本。这里按行和按组的比例相等,源于每段对话有四个样本。在规模各异的真实语料中,这并不会自动成立。这些比例并非通用规则:它们必须在每个集合中留下足够多的组和重要样本。
| 划分 | 完整对话 | 样本 | 用途 |
|---|---|---|---|
| 训练集 | 168 | 672 | 调整 |
| 验证集 | 36 | 144 | 选择 |
| 最终测试集 | 36 | 144 | 在留出的集合上确认 |
检查类别、长度和时间顺序
划分之后,统计各类别及其所属的组。一个类别若出现在很多行中但只属于一段对话,并不能提供很多独立样本。还要检查长度、实际覆盖的语言、不完整的文档以及决策所依赖的重要类别。一个令人安心的平均值可能掩盖某个关键样本在划分中一个例子都没有的情况。
按组进行分层旨在保留各类别的比例,同时不打散分组。当组数较少或组间差异很大时,它并不能保证完全均衡。如果任务是根据现有数据预测未来的观测值,按时间顺序划分可能比随机混合更合适。还要检查这些变量在预测日期时是否已经可用。
技术来源: scikit-learn 1.9 — StratifiedGroupKFold 及其局限 · scikit-learn 1.9 — 时间数据的验证
让参考标准足够精确,以便评判输出
编写一份带有示例和边界情况的标注说明。对于抽取任务,明确字段缺失的含义、日期格式、货币以及可接受的等价形式。对于分类任务,描述各类别之间的边界。与参考标准不同的回答并不总是模型出错:参考标准本身可能含糊或错误。
让一份多样化的样本接受复核,尤其是分歧和重要样本,然后记录裁定结果。将修正保留在数据集的新版本中。如果某项修正改变了一次比较的结果,请在同一参考标准上重新计算所有相关变体;不要只修正对您偏爱的模型不利的那一行。
在 GPU 任务开始前产出评估包
这项准备工作的交付物是一个可识别且附带其规则的数据集。它能让数据选择得以复现,而不必依赖对 notebook 的记忆。在租用之前准备好这个包,可避免把计算时间耗费在解决文件或标准差异上。
- 固定标识符、分组、数据划分及其依据;保留生成它们的脚本或列表。
- 检查各分区之间标识符、分组和指纹的交集。任何意外的交集都必须说明原因或予以纠正。
- 按分区、类别和有用的子组导出样本数量,以及排除清单及其原因。
- 在开始比较之前,先固定基准、归一化规则、主指标和阈值。
- 保留版本、指纹、使用权限和数据位置。指纹只能确保可识别,并不等于匿名。
- 在预定决策之前,保留对最终测试的访问权限;记录查阅日志和协议变更。
明确该检查能证明什么
当样本数量与清单一致、重叠得到控制、且每个输出都能依据明确规则评判时,准备工作就算合格。它并不能证明模型一定会成功,也不能证明所有未来用途都被覆盖。一个小数据集可以描述一个具体问题,但对于罕见的类别仍然不足以得出定论。
如果你利用最终测试的错误来改进系统,就应把该测试保留为历史记录,并另行准备一次独立的确认。对于原始数据未知的预训练模型,你的分区无法证明此前从未接触过该数据。请记录这一局限,而不是宣称数据集完全未曾使用。
实际问题
是否总要把 20% 的数据留作测试?
不是。有用的比例取决于独立单元的数量和需要覆盖的情形。检查分组、重要类别以及预期结论的精确度;仅靠一个百分比并不能保证测试具有信息量。
标识符不同就足以排除重复项吗?
不能。两次导出可能标识符不同,却包含相同的文本或同一份档案的变体。请检查内容和来源,然后按照你的分组规则,把相关联的样本保留在同一个分区中。
在用测试错误纠正模型后,我还能复用该测试吗?
您可以保留它用于追踪历史,但它参与了开发。要在一份留出的数据上确认改进,请使用一个新的独立数据集,并明确说明各自的作用。