Skip to content

ML 项目最佳实践

一句话定义:ML 项目不只是训练模型,而是从问题定义生产部署的完整流程。80% 的时间花在数据上,只有 20% 在模型上。


  1. 问题定义 & 数据收集

    • 明确业务目标和成功指标
    • 收集、标注数据
    • 评估数据质量和数量
  2. 数据探索 & 预处理

    • EDA (探索性数据分析)
    • 处理缺失值、异常值
    • 特征工程
  3. 数据集划分

    • Train / Validation / Test 划分
    • 避免数据泄露
  4. 模型选择 & 训练

    • 基线模型 → 复杂模型
    • 交叉验证
    • 超参数调优
  5. 误差分析 & 迭代

    • 分析错误案例
    • 偏差/方差诊断
    • 迭代改进
  6. 部署 & 监控

    • 模型服务化
    • A/B 测试
    • 持续监控

数据量TrainValidationTest
< 10,00060%20%20%
10,000 - 1M80%10%10%
> 1M98%1%1%
from sklearn.model_selection import train_test_split
# 正确做法:先分出 Test,再从剩余数据分 Train/Val
X_temp, X_test, y_temp, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y # 分层采样
)
X_train, X_val, y_train, y_val = train_test_split(
X_temp, y_temp, test_size=0.25, random_state=42, stratify=y_temp
)
# 最终比例: 60% train, 20% val, 20% test

定义:训练时使用了测试集的信息,导致评估结果虚高。

常见泄露正确做法
先标准化再划分先划分,用 Train 的统计量标准化 Val/Test
时序数据随机划分按时间顺序划分,用过去预测未来
特征包含目标信息检查特征与目标的相关性
# ❌ 错误:先标准化再划分
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 用了全部数据的统计量!
X_train, X_test = train_test_split(X_scaled, ...)
# ✅ 正确:先划分再标准化
X_train, X_test = train_test_split(X, ...)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # 只用 Train 的统计量
X_test_scaled = scaler.transform(X_test) # 用同样的 scaler

情况Train ErrorVal Error诊断解决方案
高偏差欠拟合更复杂模型、更多特征、减少正则化
高方差过拟合更多数据、正则化、简化模型、Dropout
理想-
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
train_sizes, train_scores, val_scores = learning_curve(
model, X_train, y_train, cv=5,
train_sizes=np.linspace(0.1, 1.0, 10)
)
plt.plot(train_sizes, train_scores.mean(axis=1), label='Train')
plt.plot(train_sizes, val_scores.mean(axis=1), label='Validation')
plt.xlabel('Training Size')
plt.ylabel('Score')
plt.legend()
  • 高偏差:两条线都低且接近
  • 高方差:Train 高,Val 低,差距大

  1. 收集错误样本:找出模型预测错误的案例
  2. 分类错误类型:手动标注错误原因
  3. 计算各类型占比:确定优先解决哪类问题
  4. 针对性改进:数据增强、特征工程、模型调整
错误类型占比解决方案
模糊图像40%数据增强(模糊处理)
背景干扰30%增加背景多样性
标注错误20%清洗标注
其他10%-

优先解决占比最高的问题!


  1. 基线模型

    • 分类:逻辑回归、决策树
    • 回归:线性回归
    • 建立性能下限
  2. 中等复杂度

    • Random Forest、XGBoost
    • 调参验证
  3. 复杂模型

    • 神经网络、深度学习
    • 需要更多数据和计算资源
  4. 集成/融合

    • 多模型投票/平均
    • 比赛常用
场景推荐模型原因
表格数据 < 10KXGBoost/LightGBM效果好,训练快
表格数据 > 10K深度学习可考虑数据量足够
图像CNN / ViT专门架构
文本Transformer预训练模型
时序LSTM / Transformer序列建模

ml-project/
├── data/
│ ├── raw/ # 原始数据
│ ├── processed/ # 处理后的数据
│ └── external/ # 外部数据
├── notebooks/
│ ├── 01_eda.ipynb # 探索性分析
│ ├── 02_baseline.ipynb # 基线模型
│ └── 03_experiments.ipynb
├── src/
│ ├── data/ # 数据处理
│ ├── features/ # 特征工程
│ ├── models/ # 模型定义
│ └── utils/ # 工具函数
├── models/ # 保存的模型
├── configs/ # 配置文件
├── requirements.txt
└── README.md

  • 数据质量检查(缺失值、异常值、重复值)
  • 数据集划分(无数据泄露)
  • 类别不平衡处理
  • 基线模型建立
  • 交叉验证
  • 超参数调优
  • 学习曲线分析
  • Test Set 只在最后使用一次
  • 误差分析
  • 模型保存与版本管理
  • 监控指标定义

  1. 梯度下降 - 理解优化过程
  2. 正则化 - 防止过拟合
  3. RAG 实战 - 大模型应用开发