这个坑值得记一笔。从标注平台导出 3 万条分类数据,label 字段里同时存在 positive、Positive 和 POSITIVE,训练脚本按类别建映射时报 KeyError,验证集准确率也异常低。

刚开始盯着「同义词没有合并,如 good 与 positive」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。平台字段没有做枚举约束,人工填了不同写法;导出时按 label 原样输出,没有走标准化;训练脚本对未知类别直接抛错而不是告警。

第一件事是列出全部 label 与计数

python -c "import pandas as pd;print(pd.read_csv('lab.csv').label.value_counts())"

再往下统一小写并去掉首尾空格

python -c "import pandas as pd;d=pd.read_csv('lab.csv');d['label']=d.label.str.strip().str.lower();print(d.label.nunique())"

维护同义词映射表再归并

python -c "print({'good':'positive','pos':'positive','bad':'negative'})"

训练前加一道未知类别校验

python -c "print(set(['positive'])-set(['positive','negative']))"

改之前先确认了最近有没有人动过配置,避免白查一遍。

别只看报错消失,验证要多做一步。label 只剩两个取值,训练不再报未知类别,验证集准确率回到与上一版相当的水平。

label 清洗要放在数据入口而不是训练脚本里,入口拦一次,后面所有下游都干净。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189