4. 模型训练数据:数据来源、数据规模、数据预处理、数据分布、数据标签说明

好,咱们聊聊数据。模型训练这事儿,说白了就是「喂数据」。数据质量不行,模型再花哨也是白搭。我见过太多团队把精力全砸在调参上,结果数据本身就有硬伤——嗯,那真是白忙活一场。

4.1 数据来源:你的数据从哪来?

数据来源这块,我习惯先问三个问题:合法吗?够用吗?有偏吗?

常见的来源有这么几类:

  • 公开数据集:比如 ImageNet、COCO、GLUE 这些。优点是省事,缺点是跟你的业务场景可能不搭。我曾经用过一个公开的医疗影像数据集做预训练,结果发现它拍摄设备跟我们的完全不同,模型迁移过去直接崩了。
  • 业务日志/用户行为数据:这是最贴近真实场景的。但要注意隐私合规,别踩红线。我建议在数据采集阶段就做好脱敏处理,不然后面返工成本极高。
  • 人工标注/众包:适合需要精细标签的任务。但质量控制是个大坑。我记得有个项目,标注员把「猫」和「狗」的标签搞反了将近 10%,模型学了一周愣是没收敛——后来查出来是标注指南写得太模糊。
  • 合成数据:用规则或生成模型造数据。适合极端场景(比如自动驾驶中的事故案例)。但合成数据跟真实数据之间总有 gap,别太依赖。
我的小习惯:在模型卡片里,我会把数据来源写清楚,包括采集时间、采集环境、是否有筛选逻辑。这样别人复现时能少踩坑。

4.2 数据规模:多大才算够?

这个问题其实没有标准答案。你想想看,一个简单的线性分类器可能几百条数据就够了,但一个深度 Transformer 模型,没个百万级数据根本喂不饱。

我一般会从两个维度去评估:

  • 任务复杂度:分类类别越多、输入维度越高,需要的数据就越多。
  • 模型容量:参数量越大,数据需求越大。一个经验值是:参数量的 10 倍以上数据量,算是比较稳妥的起点。

举个例子,我之前做一个文本分类任务,类别只有 5 个,用 BERT 微调。一开始只准备了 2 万条数据,结果验证集 F1 只有 0.78。后来扩充到 10 万条,F1 直接跳到 0.91。数据规模的影响,就是这么直接。

注意:数据规模不是越大越好。数据量过大但质量差,反而会引入噪声。我建议先做小规模实验,确认数据质量没问题,再考虑扩量。

4.3 数据预处理:脏数据怎么处理?

数据预处理,说白了就是「洗数据」。我见过最离谱的情况——有个团队拿到的数据里,20% 的字段是空的,他们直接喂给模型训练了。结果可想而知。

常见的预处理步骤:

  1. 缺失值处理:删除、填充(均值/中位数/众数)、或者用模型预测填充。我个人习惯先看缺失比例,超过 50% 的字段直接删掉。
  2. 异常值检测:用箱线图或 Z-score 找出离群点。但别一刀切——有些异常值其实是关键信号(比如金融欺诈数据)。
  3. 标准化/归一化:让不同特征在同一个量级上。尤其是用梯度下降的模型,这一步不能省。
  4. 数据增强:图像翻转、文本同义词替换、语音加噪等。能有效提升泛化能力。
# 一个简单的预处理流程示例(伪代码)
def preprocess(df):
    # 1. 删除缺失率超过 50% 的列
    df = df.dropna(thresh=len(df)*0.5, axis=1)
    # 2. 填充剩余缺失值
    df = df.fillna(df.median())
    # 3. 标准化
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    df_scaled = scaler.fit_transform(df)
    return df_scaled
避坑指南:我曾经在预处理时不小心把标签列也标准化了,结果模型训练了三天,准确率始终在 10% 左右徘徊。后来才发现标签被缩放了——嗯,这种低级错误,犯过一次就再也不会忘了。

4.4 数据分布:你的数据「长什么样」?

数据分布,说白了就是看看数据在特征空间里是怎么分布的。我习惯在建模前先做可视化——用 t-SNE 或 PCA 降维到 2D 看一眼。

重点关注几个点:

  • 类别平衡性:正负样本比例是不是悬殊?如果 99% 都是负样本,模型学出来就是个「全否定」机器。解决办法:重采样、加权损失、或者用 Focal Loss。
  • 特征分布:连续特征是不是长尾分布?离散特征的取值频率如何?这些都会影响模型的学习效果。
  • 训练集 vs 测试集分布一致性:这是个大坑。我遇到过训练集和测试集来自不同时间段,数据分布发生了漂移,模型上线后效果直接腰斩。
分布问题 常见表现 我的处理方式
类别不平衡 模型偏向多数类 使用加权损失或过采样少数类
特征长尾 模型对极端值不敏感 做 log 变换或分箱处理
分布漂移 训练好,上线差 定期用新数据重新训练

4.5 数据标签说明:标签是怎么来的?

标签是监督学习的「标准答案」。但标准答案本身可能就不标准。

我一般会在模型卡片里写清楚:

  • 标注流程:谁标的?几个人标?有没有交叉验证?我记得有个项目,标注员之间的一致性只有 0.6,这种标签质量,模型上限也就那样了。
  • 标签定义:每个类别具体指什么?有没有边界情况?比如「垃圾邮件」的定义——包含广告算不算?包含链接算不算?这些不写清楚,后面全是扯皮。
  • 标签分布:每个类别的样本数量、占比。如果某个类别只有几十条数据,那模型基本学不到什么。
我的建议:在模型卡片里附上一份标签说明文档,哪怕只有一页纸。这能帮后续的开发者省下大量沟通成本。

好了,数据这部分就聊到这儿。说白了,数据工作虽然琐碎,但它是整个模型 pipeline 的基石。你花在数据上的每一分钟,都会在模型效果上得到回报。下一章咱们聊聊模型架构的选择——那又是另一番天地了。