外观
数据与数据工程
概念定义:数据是模型的上限
机器学习界流传一句话:"垃圾进,垃圾出"(Garbage In, Garbage Out)。模型再强,也填不平数据的坑。现实中 ML 项目的时间分配也印证了这一点:数据准备与清洗通常占 60–80% 的时间,建模反而只是一小部分。
数据工程(Data Engineering)在 ML 语境下指:把原始数据变成高质量、可复现、可版本化的训练数据及推理数据的全部工作——采集、清洗、标注、划分、管道、存储。
一、数据生命周期全景
text
业务系统/日志/外部数据
│ ① 采集(日志、DB、API、爬虫、购买)
▼
原始数据存储(数据湖/数仓)
│ ② 清洗(缺失/异常/重复/格式)
▼
干净数据(可版本化)
│ ③ 标注(监督学习需要)
▼
训练/验证/测试集(防泄露划分)
│ ④ 特征工程(见特征工程章)
▼
特征存储(训练/推理统一)
│ ⑤ 训练 → 评估 → 部署(见 MLOps 章)
▼
监控 → 数据漂移 → 重新采集/标注(闭环)二、采集与存储
采集的三种来源
| 来源 | 例子 | 注意 |
|---|---|---|
| 业务系统 | 交易、点击、行为日志 | 数据定义随产品迭代变化(schema 漂移) |
| 外部数据 | 公开数据集、API、爬虫 | 版权、合规(GDPR)、稳定性 |
| 标注数据 | 人工标注、众包、远程监督 | 标注成本与质量是核心瓶颈 |
存储选型
- 数据湖(Data Lake):原始格式随便存(对象存储),灵活但脏;
- 数据仓库(Data Warehouse):结构化、ETL 后,查询快(BigQuery、Snowflake、ClickHouse);
- 特征存储(Feature Store):统一训练/推理特征(Feast、Tecton、字节 FeatureStore)——解决"训练特征与线上特征不一致"的头号工程事故。
特征存储为什么重要
训练时你用了"用户近 30 天消费均值"这个特征,线上推理时怎么保证用同样口径、同时刻算出来?特征存储把特征的定义、计算、时效统一管理,训练和推理都从它取数——这是 MLOps 成熟度的分水岭,详见MLOps 与模型部署。
三、数据清洗:脏数据的八种形态
| 脏数据 | 例子 | 处理 |
|---|---|---|
| 缺失值 | 用户没填年龄 | 填充/删除/标记,见特征工程 |
| 异常值 | 房价 1 个亿 | 业务判断 + 分位数截断 |
| 重复值 | 同一订单两条记录 | 去重(注意合法的"天然重复") |
| 格式不一致 | 日期 2023/1/1 vs 01-01-2023 | 统一解析与标准化 |
| 单位不一致 | 米 vs 英尺、元 vs 美元 | 单位归一化(易错!) |
| 编码混乱 | 中文乱码、emoji | 统一编码(UTF-8) |
| 逻辑矛盾 | 年龄 5 岁却有驾照 | 规则校验 |
| 数据漂移 | 双 11 前后购买分布剧变 | 监控 + 分群建模 |
清洗的原则是"可审计":每一次清洗决策(删了什么、填了什么)都要能追溯、可回放,否则你永远不知道模型为什么"突然变好/变坏"——可能是清洗逻辑改了,而不是模型进步了。
四、数据标注:监督学习的瓶颈
标注质量直接决定模型上限。三类常见方式:
| 方式 | 成本 | 质量 | 适用 |
|---|---|---|---|
| 人工标注(内部/众包) | 高 | 高 | 核心业务数据 |
| 远程监督(规则/知识库自动打标) | 低 | 中(有噪声) | 大规模初标 |
| 弱监督 / 预标注 + 人工复核 | 中 | 中高 | 标注工具的主流 |
标注的三大纪律:
- 标注指南先行:模糊案例("这张图里算不算猫?")必须先定规则,否则不同标注者各标各的;
- 一致性校验:同一批样本让多人标注,计算标注一致性(Cohen's Kappa),一致性低说明指南不清;
- 标注者偏差:不同标注者的标准差异会变成模型学到的"噪声标签"——考虑用多人投票、标注审核。
五、数据划分与数据泄露
划分的铁律
- 测试集绝不能在迭代中碰(见模型评估与验证);
- 划分口径要与真实预测场景一致:
- 独立同分布数据 → 随机划分;
- 时间序列 → 按时间切(前训练后测试);
- 分组数据(同用户/同患者)→ 组级别划分(GroupSplit),否则同用户样本跨集合 = 泄露。
数据泄露的六大来源
数据泄露(data leakage)是 ML 工程头号事故:测试信息混入训练,离线指标虚高,上线崩盘。高频来源:
| 泄露来源 | 例子 |
|---|---|
| 全局统计量 | 用全量数据(含测试集)做标准化/填充 |
| 未来信息 | 用"整月数据"的统计预测月初(时间泄漏) |
| 目标泄漏 | 特征里包含"结果"(如用"是否退款"预测"是否流失") |
| 重复样本 | 同一样本同时出现在训练和测试(去重没做干净) |
| 分组泄漏 | 同一用户的样本被随机切到两边 |
| 数据增强泄漏 | 增强样本与原始样本跨集合 |
自检问题:预测那一刻我能看到什么?
每次设计特征和划分,问自己:"如果我现在要上线预测,这一刻我手上真的会有这个值吗?"答案是否定的,就是泄露。这是数据工程师最重要的心智模型。
六、数据版本化与可复现性
模型要可复现,数据必须可版本化:"同样的代码 + 不同的数据 = 不同的结果",反之亦然。三个层次:
- 原始数据不可变:原始采集数据只读、永不原地修改(改了也要留版本);
- 处理逻辑版本化:清洗/特征代码进 Git,与数据版本绑定(
data_v1 + code_v2 → dataset_v3); - 数据集清单:用 DVC(Data Version Control)、lakeFS 或"清单文件 + 对象存储"记录数据哈希、来源、处理参数。
实践最简方案:数据目录(dataset card)+ 哈希 + 处理脚本版本号。机器学习实验的"不可复现",多半是数据版本没管好,而不是代码问题。
七、权衡与取舍
- 数据量 vs 数据质量:更多脏数据不如更少干净数据——但"先粗后精"(先用少量干净数据跑通流程,再扩展量)是常见节奏;
- 标注成本 vs 模型收益:标注贵时先无监督/半监督(聚类、预训练)拿到初步价值,再精准补标(主动学习);
- 清洗彻底 vs 快速迭代:清洗洁癖会拖慢节奏——先做"够用"的清洗跑通基线,再迭代清洗逻辑;
- 特征存储 vs 简单管道:团队小、特征少可以先"脚本 + 约定",特征一多或跨团队就必须上 Feature Store。
延伸阅读
- 特征工程——清洗之后的下游
- 模型评估与验证——划分与泄露的评估视角
- MLOps 与模型部署——数据管道与部署监控的衔接
- 从零构建一个 ML 项目——端到端数据流程的落地
- 常见陷阱与反模式——数据泄露翻车现场集锦
- 数据集与工具档案——公开数据集与工具清单