6.3 数据集构建与管理:进料质量决定出厂质量


6.3 数据集构建与管理:进料质量决定出厂质量

本节摘要:模型的上限是数据集写定的,算法只是在逼近它。本节把数据工程的三道关立成清单:切分纪律(防泄漏)、类别结构(不平衡的加权处方)、标注质量(错误标签的抽检法),并交代数据版本管理这个最容易被跳过、又最常背锅的环节。

指标造假的重灾区

项目复盘时最难看的发现,往往不是模型不行,而是数据有病:训练集与测试集里有同一秒连拍的两张图(近重复泄漏),模型"认出"的是拍摄现场而不是目标;验证集混进了训练过的图,指标虚高一片祥和;某类样本只有别的十分之一,模型干脆当它不存在。这些事故的共同点是——全都过了模型这一关才暴露。数据工程的意义就是把它们拦在训练之前,本节的三道关按暴露频率排序。

学习目标

阅读完本节,你应当能够:

  1. 制定防泄漏的切分规则:按拍摄批次分组切分而非按图随机;
  2. 用加权采样与类平衡损失处理不平衡,复算采样权重;
  3. 用分层抽样保持切分前后的类别比例;
  4. 建立标注质量抽检与数据版本管理的基本动作。

一、切分纪律:泄漏防在源头

最隐蔽的泄漏是"近重复":连拍、视频抽帧、同一来源的近似图。按图随机切分时,它们的兄弟几乎必然分居训练与测试两侧,模型背下训练侧就等于抄到了测试侧的答案。处方是把"同源单元"作为整体切分:同一批次、同一设备、同一患者的图捆在一起,要么全在训练、要么全在测试。医疗影像的按患者切分、工业质检的按批次切分,都是同一原则的变体。

import torch torch.manual_seed(42) n_per = 100 idx_by_class = [torch.randperm(n_per) + c * n_per for c in range(4)] train_idx = torch.cat([t[:80] for t in idx_by_class]) val_idx = torch.cat([t[80:] for t in idx_by_class]) print("训练集:", len(train_idx), "验证集:", len(val_idx)) # 320 80 # 每类各 80 训、20 验:分层抽样保证切分前后类别比例不变

切分之外还有一条铁律:测试集只允许最终验收碰一次。反复"看测试集调方法",测试集就退化成了第二个验证集,交付后的真实表现会给你上一课。

二、不平衡:加权采样与加权损失

真实数据几乎天然长尾。设一个四类数据集,样本数 700、200、80、20:直接训练,模型会把稀有类当噪声。两条互补的路子:采样端给稀有类更高的出场率,损失端给稀有类更高的罚分。

import torch labels = torch.tensor([0] * 700 + [1] * 200 + [2] * 80 + [3] * 20) counts = torch.bincount(labels, minlength=4) print("每类样本数:", counts.tolist()) # [700, 200, 80, 20] print("多数类占比:", round(counts.max().item() / len(labels), 3)) # 0.7 weights = len(labels) / (4 * counts.float()) # 反频率加权 print("采样权重:", [round(w, 3) for w in weights.tolist()]) # [0.357, 1.25, 3.125, 12.5]:稀有类的单次出场价值是多数类的 35 倍 sampler = torch.utils.data.WeightedRandomSampler(weights[labels], num_samples=len(labels)) # 用它替换 shuffle,各类在每个轮次的期望出场数即被拉平

权重的口径值得记:样本权重 = 总数 ÷ (类数 × 该类样本数),多数类小于一、稀有类远大于一。极端长尾(最稀有类只有个位数样本)时,加权要配合 4.4 节的增强一起上,光靠重采样会让稀有类在几十个轮次里被翻来覆去背到过拟合。

三、标注质量与版本管理

标注错误是另一类慢性病。成熟的应对不是"更仔细",而是制度化的抽检:每批标注随机抽一成双人复标,按一致性指标(如逐类的 Cohen kappa)设准入线;训练后再用模型反查——那些"损失极低却与多数同类样本特征相悖"或"无论怎么训都判错"的顽固样本,一大部分是标注错了而不是模型错了。这类"数据质检"反转了通常的信任方向:让模型当标注的审计员。

版本管理回答"上次实验用的到底是哪版数据":数据快照与代码同等对待,切分脚本入库、随实验记录指纹(各集大小、类别分布的哈希),事后任何指标都能追溯到确切的数据版本。这套动作朴素,却能让团队避开"复现不出来"的内耗。

一份最小可行制度

数据工程不需要重流程,需要的是几条被严格执行的最小规则:每次切分由脚本完成并记录各集大小与类别分布指纹;每次标注交付附一成抽检报告;每次实验开头打印数据版本号与训练验证各一组的样本预览图。三件事加起来不过几十行脚本,却能挡住"复现不出来""指标虚高""错标混入"这三类最贵的返工。制度的要点不在全,在于每次都执行。

追问三则

问:增强会不会和切分纪律冲突?答:增强只在训练侧发生,不跨集复制信息,与泄漏无关;但"按批次分组"的规则要先于增强定好,顺序反了容易在增广文件层面把同源图分开。问:每类最少要多少张才值得训?答:经验上冻结换头的路线每类几十张能起步、几百张像样;从零训练每类低于几百张基本注定背题——数字不绝对,但量级判断够用。问:测试集真的只能碰一次吗?答:碰一次指的是"据它做决策";例行健康检查可以跑,但任何依据测试集结果改方法的行为,都会让它退化为验证集,指标从此不可信。

巡检记录

  • 切分单元:防泄漏的单位不是图,是"同源批次"——连拍、抽帧、同一患者必须整体进同一侧;
  • 加权口径:样本权重 = 总数 ÷(类数 × 类样本数),四类例子的权重表 0.357、1.25、3.125、12.5;
  • 抽检制度:批批抽一成双人复标,训练后让模型反查顽固样本揪错标;
  • 版本纪律:数据快照加切分指纹,指标可追溯,复现不靠回忆。

💡 关键直觉:把数据集当代码管理——版本、评审、回归测试一样不少。模型的问题是局部的,数据的问题是全局的;预算有限时,整理数据永远优先于调模型。

原料、工具、风险全部到位,最后一节抬头看路:注意力时代,CNN 的手艺值多少。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U