训练集、验证集和测试集的数据可视化

模型与算力

用几张图把训练集、验证集、测试集的分布摊开检查,判断切分是否合理、有没有泄漏和偏斜。

模型上线后效果不对,很多人第一反应是换模型、调参数,其实问题常出在数据切分上:三个集子分布不一致、同一条数据跨集重复、测试集里多了训练时没见过的类别。这些毛病光看数字看不出来,画几张图就一目了然。这篇给一套可以直接照做的可视化检查顺序,从标签分布到来源构成,逐项对照。

模型上线后效果不对,很多人第一反应是换模型、加数据、调参数,其实问题常常出在数据切分上:三个集子分布对不上、同一条数据跨集重复、测试集里冒出训练时没见过的类别。这些毛病光看汇总数字看不出来,画几张图基本一目了然。这篇给一套可以照做的可视化检查顺序,从标签分布到来源构成,逐项对照。

前提是你手里已经有了一份切分好的数据,或者正在写切分脚本。下面的做法不依赖任何特定框架,画图库用什么顺手就用什么,重点是看什么、怎么比、超过什么程度该停下来重切。

先想清楚:可视化要回答哪三个问题

画图不是为了好看,是为了回答三个具体问题。题目定了,图才有判断标准,不然画完一堆图还是不知道该不该重切。建议在动手前先把这三个问题写在纸上,后面每张图都往这三个问题上靠。

标签分布是否一致
三个集子的类别占比差距超过多少就该警惕,按业务容忍度自己定阈值
数据来源是否同质
同一批采集、同一时间段、同一渠道的数据有没有被切散到三个集子
有没有跨集重复
文本近乎相同、图片高度相似、同一实体的多条记录,都是泄漏高发区

关于第一个问题的阈值:类别本身很稀少、绝对数量只有几十条时,占比波动天然就大,这时候死抠几个百分点的差距没意义,应该看绝对条数够不够。反过来说,类别占比很高的大类,哪怕差一点点也值得追问。所以阈值要按业务容忍度和类别基数分别定,没有一个通用数字。涉及具体模型和数据集规模时可以到 模型资料库(/models) 对照当时的记录。

标签分布图:条形比饼图好用

饼图看着直观,但三个集子放一起比就废了,角度差几度肉眼根本分不出来。横条形图才是干活的工具:同一类别排在同一行,三个集子叠着画或者并排画,横轴刻度统一,谁多谁少一眼就看出来。刻度不统一是最常见的坑,两张图各自自动缩放,看起来一样高,实际差一倍。

图形适用场景注意点
横条形图看类别占比,三集对比横轴必须统一刻度
占比差值图快速找异常类别以训练集为基准,正负偏移一起看
密度图看连续特征分布三集叠一张,别分三张
热力图来源与数据集交叉颜色区间要固定,别每张自适应

更省事的做法是画占比差值图:以训练集占比为基准,验证集和测试集各画一根偏移条,偏移超过阈值直接标红。这样一眼就能定位是哪个类别出了问题,不用在三张条形图之间来回瞄。多标签任务记得按标签分别画,别把多标签压成一个单标签再看,那样会掩盖真实的偏斜。

来源与长度:查批量偏差和长短样本偏向

标签分布对上了,不代表切分就没问题。样本长度分布要画成密度图或直方图,三条曲线放同一张图上。如果测试集明显偏向长样本或短样本,往往说明切分时是按行数随机切,而没有按长度分层。有些任务里长样本和短样本的难度差别很大,这种偏向会直接反映到指标上。

  • 长度分布:三条密度曲线叠一张,看尾部是不是某一集特别胖
  • 来源字段:做来源 × 数据集的交叉热力图,某个来源在测试集里占比异常高,多半是按文件切的
  • 时间字段:画时间轴散点,训练集集中早期、测试集集中后期属于正常的时间切分,反过来就要排查
  • 语言或地域字段:多语言、多地区数据同样画交叉表,别只盯着标签看

这里有个容易搞反的判断:时间切分时训练集靠前、测试集靠后是正常的,这叫按时间防泄漏;但如果你是随机切分却出现明显的时间聚集,那就是切分逻辑出了问题。两种情况的图长得很像,判断依据是你当初用的切分方式,不是图本身。所以每张图旁边最好记一句「这份数据是按什么方式切的」。

重复与泄漏扫描:切分前就该跑一遍

这一步最容易被跳过,也最伤。文本归一化后算相似度、图片算感知哈希、表格类按主键去重,把跨集高相似的对儿都找出来,再人工抽看若干条确认是不是真重复。别指望全自动判定,模糊匹配总会有一批边界样本,抽查几十条就能估出整体重复率大概在什么量级。

  1. 归一化后再比对文本去空格、统一大小写、去标点后再算相似度;图片缩到固定尺寸再算哈希。不归一化会漏掉大量近似重复
  2. 按实体整组切分同一用户、同一文档、同一次会话的多条记录必须整组进同一个集子,不能随机打散
  3. 画实体覆盖图用实体 ID 分组后画一张覆盖图,统计有多少实体横跨了两个或三个集子,这个数应该接近零
  4. 固化进切分脚本把去重和分组写成切分脚本里的固定步骤,而不是训练完再回头补,补的时候往往已经晚了

分组键选错是另一个隐蔽问题。用了用户名做分组键,但业务上同一家公司有多个账号,那这些账号其实还是同一实体,该合并没合并,泄漏照样存在。这一步没有通用答案,得结合业务实体来定,定完写进切分脚本的注释里。

排查顺序清单:从快到慢排一遍

四项检查别乱序跑,按命中概率和返工成本排。跨集重复一旦命中,后面三项查得再细也得重切,所以放第一步。标签分布差值排第二,因为改动切分策略通常就能解决。长度与来源排第三,时间与分组排第四。这个顺序的好处是每一步都能提前结束,不用全查完才发现问题在第一项。

  • 第一步看跨集重复,命中就直接重切,别继续往下查
  • 第二步看标签分布差值图,按类别基数定各自的阈值
  • 第三步看长度与来源交叉表,判断是不是按行切导致的
  • 第四步看时间与实体分组,确认切分方式和业务实体是否匹配
  • 每步留一张图存进版本库,换数据版本时直接对比,比重新跑判断快得多

发现问题优先改切分逻辑重切,不要靠重采样硬把分布凑齐。凑出来的分布会引入新的选择偏差,而且把真实的数据特征抹掉了,上线后表现往往更差。重切一次的成本,比反复调参试错低得多。

下一步切分检查完,接下来要确认你用的模型和接口对不对路,各家官方口径和当前数字可以到模型资料库和价格页核对,避免拿过期信息做决策

常见问题

三个集子比例怎么定,可视化能帮我判断吗?

比例本身按数据总量和任务定,可视化只能帮你验证结果是否合理:类别的相对占比是否保持、稀有类是否有足够样本落进验证和测试。占比偏差对照表和分层切分的具体做法可以到 /ai-dict 和 /training 相关页面看当期的说明,别死记一个固定比例。

图画出来差异很大,是不是一定要重新切分?

先分清差异来自真实分布不同还是切分方式不同。如果测试集本来就来自不同渠道、不同时间段,差异是正常的,这时该做的是把这份差异写进评估说明,而不是硬凑齐。只有差异来自随机切分却没保持住分布时,才需要改成按标签分层切。

小数据集也要画这么多图吗?

样本量小的时候条形图和热力图容易全是噪声,优先做两件事就够:跨集重复扫描和实体分组检查。长度、时间的分布图可以合并成一张看,不必逐项拆开。样本再少到每类只有个位数,统计图形基本失去意义,改成直接列表人工核对。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。