机器学习建模流程
一个完整的机器学习项目并不是"选个模型 → 训练 → 完事",而是一条贯穿业务、数据、模型、工程、运营的闭环流水线。工业界普遍遵循的流程可以归纳为下面 10 个阶段。
所属专题:机器学习基础 (ml-basics·03)
机器学习建模流程
一个完整的机器学习项目并不是”选个模型 → 训练 → 完事”,而是一条贯穿业务、数据、模型、工程、运营的闭环流水线。工业界普遍遵循的流程可以归纳为下面 10 个阶段。
全流程总览
① 业务理解 ─┐
├──→ ② 数据采集 ──→ ③ 数据探索(EDA) ──→ ④ 数据预处理
│ │
│ ▼
│ ⑤ 特征工程
│ │
│ ▼
│ ⑦ 模型评估 ←── ⑥ 模型训练 & 选择
│ │
│ ▼
│ ⑧ 超参数调优
│ │
│ ▼
└──→ ⑨ 模型部署 ──→ ⑩ 监控 & 迭代 ──→ (回到 ①)
① 业务理解与问题定义
这是最重要、也最容易被跳过的一步。做得不好,后面所有的技术工作都会走偏。
要回答的问题:
- 业务目标是什么?(提升转化率?降低坏账?减少人工成本?)
- 这个问题是否适合用机器学习解决?规则系统能不能搞定?
- 属于什么类型的任务?(分类 / 回归 / 排序 / 聚类 / 生成 …)
- 成功的评判标准是什么?(业务指标 vs 技术指标)
- 上线后的决策链路是什么?模型输出如何被使用?
- 有哪些约束?(延迟、内存、可解释性、公平性、合规性)
产出:项目立项文档、评价指标定义、数据需求清单
常见陷阱:
- 用技术指标(AUC 高)代替业务指标(GMV 提升)
- 忽略基线(Baseline):不知道当前非 ML 方案能做到什么水平
- 目标不可度量、不可归因
② 数据采集与理解
数据来源:
- 内部业务数据库(MySQL、Hive、数据仓库)
- 日志系统(Kafka、埋点日志)
- 第三方 API / 公开数据集
- 人工标注、爬虫、合成数据
关注点:
- 数据的时效性(是否与线上一致?有没有穿越 / 数据泄露?)
- 数据的代表性(样本分布是否覆盖真实场景?)
- 数据的可获得性(上线时线上能否拿到相同的特征?—— 特征可用性)
- 数据规模与存储成本
- 合规性与隐私(GDPR、个保法、脱敏)
产出:原始数据集、数据字典、样本量与分布统计
③ 探索性数据分析(EDA)
在动手建模前,先”看懂”数据。
主要工作:
| 类别 | 内容 |
|---|---|
| 基本描述 | 样本数、特征数、字段类型、数据规模 |
| 单变量分析 | 均值、方差、分位数、分布形态、缺失比例 |
| 双变量分析 | 特征与标签的相关性、特征之间的相关性 |
| 可视化 | 直方图、箱线图、散点图、热力图 |
| 数据质量 | 缺失、异常、重复、不一致、类别不均衡 |
| 标签分析 | 类别分布、长尾情况、噪声比例 |
常用工具:Pandas、Matplotlib、Seaborn、Sweetviz、ydata-profiling
产出:EDA 报告、数据质量问题清单、初步的特征假设
④ 数据预处理(Data Preprocessing)
把”脏”数据变成模型可用的”干净”数据。
4.1 缺失值处理
- 删除(缺失比例高、样本充足时)
- 填充:均值 / 中位数 / 众数 / 常数 / 前后值 / 模型预测填充
- 缺失本身作为一个特征(“是否缺失”)
4.2 异常值处理
- 统计方法:3σ 原则、IQR
- 模型方法:Isolation Forest、LOF
- 处理:删除、截断(Winsorize)、单独建模
4.3 数据类型转换
- 数值型:类型统一(int / float)
- 类别型:编码(下面会讲)
- 时间型:拆分成年/月/日/星期/时段等
4.4 数值特征处理
- 归一化(Min-Max Scaling):缩放到 [0, 1]
- 标准化(Z-Score):均值 0、方差 1
- 对数变换 / Box-Cox:处理偏态分布
- 分箱(Binning):连续值 → 离散区间
4.5 类别特征编码
| 方法 | 适用场景 |
|---|---|
| Label Encoding | 有序类别(低 / 中 / 高) |
| One-Hot | 类别少、无序 |
| Target/Mean Encoding | 类别多、树模型 |
| Frequency Encoding | 类别多,用出现频率替代 |
| Embedding | 深度学习、超高基数(如用户 ID) |
4.6 类别不均衡处理
- 重采样:过采样(SMOTE)、欠采样
- 调整类别权重(class_weight)
- 修改损失函数(Focal Loss)
- 阈值调整(不是所有场景都要 0.5)
4.7 数据集划分
- 训练集 / 验证集 / 测试集 常见比例:70/15/15 或 80/10/10
- 交叉验证:K-Fold、StratifiedKFold、TimeSeriesSplit(时序数据)
- ⚠️ 严禁数据泄露:任何依赖标签的处理(如目标编码)必须在训练集上 fit,再 transform 到验证/测试集
⑤ 特征工程(Feature Engineering)
“Applied machine learning is basically feature engineering.” —— Andrew Ng
好的特征往往比复杂的模型带来更大的提升。
5.1 特征构造
- 业务特征:基于领域知识组合,如”7 日购买频次”、“客单价 / 收入比”
- 交叉特征:特征 A × 特征 B(LR/FM 中很重要)
- 统计特征:分组聚合(如”用户过去 30 天平均消费”)
- 时序特征:滑动窗口、滞后(Lag)、趋势、周期
- 文本特征:TF-IDF、词向量、句向量
- 图像特征:预训练 CNN 提取的中间层特征
- 图特征:节点度、PageRank、图嵌入
5.2 特征选择
- 过滤法(Filter):方差过滤、相关系数、卡方检验、互信息
- 包装法(Wrapper):递归特征消除(RFE)
- 嵌入法(Embedded):L1 正则(Lasso)、树模型特征重要性
- 实际经验:树模型可容纳大量冗余特征;线性模型对冗余敏感
5.3 特征降维
- PCA:线性降维
- t-SNE / UMAP:非线性降维,用于可视化
- Autoencoder:非线性降维,可保留复杂结构
产出:可用于建模的特征矩阵 X 和标签 y、特征生产脚本(离线与在线必须一致)
⑥ 模型训练与选择
6.1 建立基线(Baseline)
- 不要一上来就上 XGBoost 或深度模型
- 先用最简单的模型(规则、逻辑回归、随机预测)建立参考线
- 之后每个复杂模型的收益都要与 baseline 对比
6.2 模型候选
根据任务类型选择候选模型:
- 结构化数据 → 逻辑回归 / GBDT(XGBoost / LightGBM / CatBoost)
- 图像 → CNN / Vision Transformer
- 文本 → Transformer / 预训练大模型微调
- 序列 → LSTM / Transformer
- 推荐 → 双塔 / DeepFM / DIN
6.3 训练技巧
- 合适的损失函数(回归 MSE、分类交叉熵、排序 pairwise loss)
- 合理的 batch size 与学习率
- 正则化:L1、L2、Dropout、Early Stopping
- 梯度裁剪(RNN、大模型训练)
- 混合精度训练(FP16 / BF16 加速)
- 分布式训练(数据并行 / 模型并行)
6.4 训练过程监控
- 训练 loss vs 验证 loss 曲线(判断过拟合/欠拟合)
- 各类指标随 epoch 变化
- 梯度、权重分布
- 工具:TensorBoard、Weights & Biases、MLflow
⑦ 模型评估
7.1 离线指标
| 任务 | 常用指标 |
|---|---|
| 二分类 | 准确率、精确率、召回率、F1、AUC-ROC、AUC-PR、KS |
| 多分类 | Macro/Micro/Weighted F1、混淆矩阵 |
| 回归 | MAE、MSE、RMSE、R²、MAPE |
| 排序/推荐 | NDCG、MAP、MRR、Hit Rate、Recall@K |
| 生成 | BLEU、ROUGE、Perplexity、人工评估 |
| 目标检测 | mAP、IoU |
7.2 多维度评估
- 整体表现 vs 分群表现(不同用户群、不同地区、不同时段)
- 鲁棒性:对噪声、扰动、对抗样本的稳定性
- 公平性:不同人群的表现差异(Demographic Parity、Equal Opportunity)
- 可解释性:特征重要性、SHAP、LIME
- 业务指标模拟:离线模拟上线后的业务影响
7.3 错误分析
比”看指标”更重要 —— 拿出错分样本逐个看,找到系统性错误。
⑧ 超参数调优
8.1 调优策略
- 网格搜索(Grid Search):小规模参数空间
- 随机搜索(Random Search):中等规模
- 贝叶斯优化(Optuna、Hyperopt):昂贵评估、复杂空间
- 进化算法 / 强化学习 NAS:搜索神经网络结构
8.2 调参顺序(经验)
- 学习率(最敏感)
- 模型容量(层数 / 宽度 / 深度)
- 正则化强度
- 优化器与调度策略
- Batch size
8.3 注意事项
- 在验证集上调参,测试集只用于最终评估
- 避免过度调参 → 过拟合验证集
- 记录每次实验(种子、数据版本、代码版本、参数、结果) → 实验管理
⑨ 模型部署(Deployment)
9.1 部署形式
| 形式 | 场景 |
|---|---|
| 批处理(Batch) | 离线打分(每日跑一次) |
| 实时服务(Online) | REST/gRPC 服务,毫秒级响应 |
| 流式(Streaming) | Flink / Kafka Streams |
| 边缘部署(Edge) | 手机、IoT、浏览器(TFLite、ONNX、CoreML) |
9.2 工程化关注点
- 训练-推理一致性:预处理逻辑、特征生产在训练和线上必须一致
- 特征平台(Feature Store):如 Feast,保证离线/在线特征对齐
- 模型格式:Pickle、SavedModel、ONNX、TorchScript
- 性能优化:量化(INT8)、剪枝、蒸馏、批推理、缓存
- A/B 测试:小流量放量、灰度发布
- 回滚机制:模型出问题能快速切回旧版本
9.3 常见服务化框架
TensorFlow Serving、TorchServe、Triton Inference Server、BentoML、FastAPI + 自封装
⑩ 监控与迭代
模型上线不是终点,而是MLOps 闭环的起点。
10.1 监控维度
| 维度 | 指标 |
|---|---|
| 模型性能 | 线上 AUC / 准确率、业务指标 |
| 数据分布漂移(Data Drift) | PSI、KS、KL 散度 |
| 概念漂移(Concept Drift) | 标签 & 特征关系随时间变化 |
| 系统健康 | QPS、延迟、错误率、资源占用 |
| 公平性/合规 | 分群表现、可疑输出 |
10.2 触发再训练的信号
- 模型指标下降超过阈值
- 特征分布漂移显著
- 业务场景发生变化
- 新数据到达(定时再训练)
10.3 MLOps 工具链
| 环节 | 工具 |
|---|---|
| 实验管理 | MLflow、Weights & Biases、Neptune |
| 数据/模型版本 | DVC、LakeFS、MLflow Model Registry |
| 流水线编排 | Airflow、Kubeflow、Prefect |
| 特征平台 | Feast、Tecton |
| 部署与服务 | Seldon、KServe、BentoML |
| 监控 | Evidently、WhyLabs、Arize |
各阶段时间占比(工业界经验)
业务理解 + 数据 + 特征工程 ████████████████████████████████████████ 70-80%
模型训练 + 调参 ████████ 10-15%
部署 + 监控 ████████ 10-15%
结论:建模只占很小一部分,绝大部分时间在数据和工程上。
关键原则(避坑指南)
- 先有 Baseline,再谈优化:没有基线就没有对比。
- 警惕数据泄露(Data Leakage):任何”未来信息”进入训练都会导致线上崩盘。
- 训练/线上一致性:预处理、特征、时区、缺失填充……必须完全一致。
- 能用简单模型解决就别上复杂模型:可维护性、可解释性、成本都更好。
- 业务指标 > 技术指标:AUC 提升 0.01 不等于业务收益。
- 实验可复现:固定随机种子、版本控制数据/代码/模型。
- 上线不是终点:数据在变、用户在变、模型必然衰减。
- 错误分析比盯指标更有价值:真正的洞察来自看错分样本。
一图流总结
| 阶段 | 核心问题 | 主要产出 |
|---|---|---|
| ① 业务理解 | 要解决什么?如何衡量成功? | 项目立项、指标定义 |
| ② 数据采集 | 数据从哪来?够不够? | 原始数据集 |
| ③ EDA | 数据长什么样?质量如何? | EDA 报告 |
| ④ 预处理 | 如何变干净? | 干净的数据集 |
| ⑤ 特征工程 | 如何变有用? | 特征矩阵 X, y |
| ⑥ 模型训练 | 选什么模型?如何训? | 训练好的模型 |
| ⑦ 评估 | 好不好?哪里不好? | 评估报告 |
| ⑧ 调优 | 能不能更好? | 最优模型 |
| ⑨ 部署 | 怎么用起来? | 线上服务 |
| ⑩ 监控迭代 | 还行不行?该更新了吗? | 监控看板、新版本 |