返回金融系统设计
高频与风险科学 · 章节

08 - ML模型生命周期

06-hft-risk-science/08-ml-model-lifecycle.md

08 - ML模型生命周期

定位:给有10年金融经验的架构师/PM讲清楚"模型不是训练完就完了" 目标:理解模型训练科学、评估指标、上线策略、监控方法、迭代退役的完整闭环 前提:你了解基本的ML概念(分类/回归/过拟合),理解风控业务场景


一、核心概念与直觉

1.1 模型会"过期"

一个常见的认知误区:
  "我们花了3个月开发了一个AUC=0.92的模型,部署上线就完事了"

现实是:
  模型是有"保质期"的——
  
  训练时的数据 ≠ 3个月后的真实数据
  3个月前的欺诈模式 ≠ 现在的欺诈模式
  用户行为在持续变化(概念漂移)
  
  如果不监控和更新,AUC会从0.92逐渐下降到0.75甚至更低
  → 模型从"利器"变成"摆设"

1.2 模型生命周期全景

┌──────────────────────────────────────────────────────────┐
│                    模型生命周期                            │
│                                                            │
│   ┌──────┐   ┌──────┐   ┌──────┐   ┌──────┐   ┌──────┐  │
│   │ 开发  │──→│ 验证  │──→│ 上线  │──→│ 监控  │──→│ 迭代  │  │
│   │      │   │      │   │      │   │      │   │/退役  │  │
│   └──────┘   └──────┘   └──────┘   └──────┘   └──────┘  │
│       │                                  │         │       │
│       │          ←←← 反馈循环 ←←←        │         │       │
│       └──────────────────────────────────┘─────────┘       │
│                                                            │
│   时间跨度:                                                │
│   开发:2-8周                                               │
│   验证:1-2周                                               │
│   上线:1-2周(灰度)                                       │
│   监控:持续                                                │
│   迭代:每3-12个月重训                                      │
└──────────────────────────────────────────────────────────┘

1.3 PM/架构师的视角

你不需要自己训练模型——但你需要能回答这些问题:

开发阶段:
  "为什么选XGBoost而不是深度学习?" → 可解释性 vs 精度的trade-off
  "类别不平衡怎么处理?" → SMOTE/代价敏感/采样策略
  "如何避免过拟合?" → 交叉验证/正则化/early stopping

验证阶段:
  "AUC=0.85算好吗?" → 取决于业务场景和基线
  "线下效果好就能上线吗?" → 不,还要验证特征一致性和稳定性

上线阶段:
  "新模型直接替换旧模型?" → 不,要灰度切换/影子模式
  "怎么做A/B测试?" → 样本量计算、统计显著性检验

监控阶段:
  "怎么知道模型变差了?" → PSI/KS监控/AUC趋势
  "什么时候需要重训?" → PSI > 0.25 或 KS下降超过阈值

治理阶段:
  "模型需要文档吗?" → Model Card是监管要求
  "模型有偏见怎么办?" → 公平性检查是合规必须

二、模型训练科学

2.1 类别不平衡处理(风控核心问题)

为什么不平衡是风控的核心挑战?

在风控场景中,正负样本极度不平衡:

反欺诈:
  正常交易 : 欺诈交易 = 1000 : 1(欺诈率0.1%)
  
信用评分:
  好客户 : 坏客户 = 20 : 1(违约率5%)

问题:
  如果模型直接学习——
  一个"永远预测正常"的模型准确率 = 99.9%
  但它一个欺诈也抓不到(召回率 = 0%)
  
  模型"偷懒"了——只要全部预测多数类就能得到高准确率
  → 必须对不平衡做特殊处理

数据层面的处理

1. SMOTE(Synthetic Minority Oversampling Technique)
   
   原理:在少数类样本之间"插值"生成新样本
   
   步骤:
     a. 选一个少数类样本 x_i
     b. 找到它的K个最近邻(同为少数类)
     c. 随机选一个近邻 x_nn
     d. 在 x_i 和 x_nn 之间随机插值:
        x_new = x_i + rand(0,1) × (x_nn - x_i)
   
   图示:
     x_i ●────────────● x_nn
              ↑
         x_new(在连线上随机取一点)
   
   效果:
     原始:正常1000个,欺诈10个
     SMOTE后:正常1000个,欺诈500个
     → 类别比例从100:1变成2:1
   
   注意事项:
     ✗ 不要对测试集做SMOTE!只对训练集做
     ✗ 过度SMOTE会导致过拟合(生成的样本太"规整")
     ✗ 高维稀疏数据效果差

2. ADASYN(Adaptive Synthetic Sampling)
   
   改进点:在"难分类"的区域生成更多样本
   
   原理:
     对每个少数类样本,计算它的K个近邻中多数类的比例
     比例越高 → 说明这个区域越难分类 → 生成更多样本
   
   直觉:
     在少数类和多数类"交界处"重点补充样本
     而不是在少数类"腹地"无意义地生成样本

3. 随机欠采样 + Tomek Links清洗
   
   欠采样:随机删除多数类样本,使比例平衡
     优点:快速、简单
     缺点:丢失信息
   
   Tomek Links:
     如果一个正样本和一个负样本互为最近邻 → 这对是Tomek Link
     删除Tomek Link中的多数类样本 → 清理决策边界
   
   组合使用:先欠采样到5:1 → 再用Tomek Links清洗边界

4. 绝对禁令:不要对测试集做采样!

   正确流程:
     全部数据 → 按时间拆分 → 训练集 | 验证集 | 测试集
                                ↓         ↓         ↓
                         做SMOTE/欠采样  不处理    不处理
   
   原因:测试集必须反映真实的类别比例
         否则评估指标会失真

算法层面的处理

1. 代价敏感学习(Cost-Sensitive Learning)
   
   核心思想:对不同类别的误分类赋予不同的代价
   
   在XGBoost中:
     scale_pos_weight = 负样本数/正样本数 = 1000/10 = 100
     → 告诉模型:漏掉一个欺诈 = 误杀100个正常交易
   
   在逻辑回归中:
     sample_weight: 正样本权重=100, 负样本权重=1
   
   业务直觉:
     漏放一个欺诈交易的损失 = 10万元
     误杀一个正常交易的损失 = 100元(用户投诉/流失)
     → 代价比 = 10万/100 = 1000:1
     → scale_pos_weight应该接近1000

2. Focal Loss
   
   来源:RetinaNet目标检测论文(Facebook AI Research, 2017)
   
   标准交叉熵损失:
     CE(p_t) = -log(p_t)
     
   Focal Loss:
     FL(p_t) = -α_t × (1 - p_t)^γ × log(p_t)
   
   其中:
     p_t = 模型对真实类别的预测概率
     α_t = 类别权重(处理不平衡)
     γ   = 聚焦参数(通常γ=2)
   
   直觉:
     当模型对某个样本已经很确定(p_t≈1)时:
       (1-p_t)^γ ≈ 0 → 这个样本的loss≈0 → 不再关注
     当模型对某个样本不确定(p_t≈0.5)时:
       (1-p_t)^γ ≈ 0.25 → loss减半
     当模型犯错(p_t≈0)时:
       (1-p_t)^γ ≈ 1 → loss保持不变 → 重点关注
   
   效果:
     让模型把注意力集中在"难分类"的样本上
     而不是在"已经分对"的大量简单样本上浪费梯度

3. 集成方法:EasyEnsemble
   
   原理:
     从多数类中随机欠采样M次,得到M个平衡子集
     每个子集训练一个基础模型
     最终预测 = M个模型投票/平均
   
   优点:
     既利用了欠采样(每个子集平衡)
     又不浪费数据(M个子集覆盖了大部分多数类样本)
   
   推荐M:5-10个子集

2.2 交叉验证

K-Fold的陷阱

标准K-Fold交叉验证:
  将数据随机分成K份
  每次用K-1份训练,1份验证
  重复K次,取平均性能

金融数据的问题:数据有时间依赖!

随机分割可能导致:
  训练集包含2026年3月的数据
  验证集包含2026年1月的数据
  → 模型用"未来"的数据训练去预测"过去" → 信息泄露

例:
  如果欺诈模式在2月发生变化:
    随机K-Fold:训练集混入了2月后的数据 → 验证集AUC虚高
    时间切分:训练集只用2月前 → 验证集用2月后 → AUC反映真实效果

正确的时间序列分割方法

1. Walk-Forward Validation(前向验证)
   
   │ Train 1         │ Val 1│
   │ Train 2              │ Val 2│
   │ Train 3                   │ Val 3│
   ──────────────────────────────────── time →
   
   特点:每次验证后,把验证数据加入训练集
   优点:模拟真实的"用历史数据预测未来"场景
   缺点:早期训练集很小

2. Time-Series Split
   
   │ Train │ Val │
   │ Train      │ Val │
   │ Train           │ Val │
   ──────────────────────── time →
   
   特点:训练集只增不减
   优点:最接近真实场景
   缺点:验证集大小不一致

3. Purged K-Fold(净化K折)
   
   │ Train │ Gap │ Val │ Gap │ Train │
   ──────────────────────────────── time →
   
   关键:训练集和验证集之间留间隔(Gap)
   
   为什么需要Gap?
     假设特征包含"近5天交易频率"
     如果验证集紧接训练集 → 验证集第1天的特征包含训练集最后5天的数据
     → 信息泄露
     
     留5天Gap → 验证集的特征不再包含训练集的数据
   
   Gap大小 = max(所有特征的时间窗口长度)
   
   推荐:
     风控模型标准做法是Purged K-Fold
     Gap = 30天(如果有30天窗口的特征)

2.3 超参调优

超参数 = 模型训练前需要人工设定的参数
  XGBoost: max_depth, learning_rate, n_estimators, min_child_weight...
  逻辑回归: C(正则化强度), penalty(L1/L2)

1. Grid Search(网格搜索)
   穷举所有可能的参数组合
   
   例:max_depth = [3, 5, 7], learning_rate = [0.01, 0.1, 0.3]
   → 3 × 3 = 9种组合,每种都训练一个模型
   
   优点:一定找到最优(在网格内)
   缺点:参数多时组合爆炸

2. Random Search(随机搜索)
   随机采样参数组合
   
   Bergstra & Bengio (2012) 证明:
     随机搜索比网格搜索更高效
     因为大多数参数对模型影响很小
     随机搜索更可能探索到"重要参数"的好值
   
   推荐:先做100次Random Search → 缩小范围 → 再精调

3. Bayesian Optimization(贝叶斯优化)
   
   核心思想:
     用高斯过程(GP)建模"超参→性能"的映射
     每次迭代选择"最有可能提升性能"的参数点
   
   流程:
     a. 用几个随机点初始化GP
     b. GP预测每个参数点的"期望性能"和"不确定性"
     c. 用采集函数(Acquisition Function)选择下一个参数点
        - EI(Expected Improvement): 平衡探索和利用
        - UCB(Upper Confidence Bound): 偏向不确定区域
     d. 训练模型,更新GP
     e. 重复b-d
   
   优点:通常20-30次迭代就能找到很好的参数
   缺点:不适合并行化(每次只试一个点)
   
   工具:Optuna, Hyperopt, BayesianOptimization

实际建议:
  1. 先Random Search 50-100次 → 确定参数范围
  2. 再Bayesian Optimization 20-30次 → 精细调优
  3. 关注的重点参数(XGBoost):
     max_depth(3-10), learning_rate(0.01-0.3), 
     n_estimators(100-1000), min_child_weight(1-10)

2.4 集成学习

单个模型有局限 → 多个模型组合通常更好

1. Bagging(Bootstrap Aggregating)
   代表:Random Forest
   
   原理:
     从训练数据中有放回地抽样M次
     训练M个决策树
     最终预测 = M个树投票/平均
   
   效果:降低方差(不容易过拟合)
   直觉:"三个臭皮匠,顶个诸葛亮"

2. Boosting
   代表:XGBoost, LightGBM, CatBoost
   
   原理:
     顺序训练多个弱学习器
     每个新学习器重点关注前一个的错误
     最终预测 = 所有学习器的加权和
   
   效果:降低偏差(更准确)
   直觉:"一个人做错了,下一个人来纠正"
   
   XGBoost vs LightGBM:
     XGBoost:按层生长(Level-wise) → 更均衡但慢
     LightGBM:按叶子生长(Leaf-wise) → 更快但可能过拟合
     
     数据量大(>100万) → LightGBM更快
     数据量小(<10万) → XGBoost更稳定

3. Stacking(堆叠)
   
   原理:
     第1层:多个不同类型的模型(XGBoost + LRF + NN)
     第2层:用第1层的预测结果作为特征,训练一个元模型(通常是LR)
     最终预测 = 第2层元模型的输出
   
   效果:综合不同模型的优势
   缺点:复杂度高、过拟合风险、线上维护难

4. 风控中的最佳实践

   推荐组合策略:
     步骤1:用XGBoost训练 → 看Feature Importance → 选Top 30-50个特征
     步骤2:用选出的特征训练逻辑回归(LR) → 作为最终模型
     
   为什么?
     XGBoost:擅长特征选择和非线性关系发现
     逻辑回归:可解释性强、监管合规、易于维护
     
     组合后:兼顾性能和可解释性
   
   银行评分卡领域的标准做法:
     XGBoost做特征筛选 → WOE编码 → 逻辑回归 → 评分映射

三、模型评估科学

3.1 混淆矩阵

                      预测值
                  Positive    Negative
实际值 Positive │   TP      │   FN      │
       Negative │   FP      │   TN      │

在反欺诈场景中:
  Positive = 欺诈
  Negative = 正常

  TP(True Positive):  模型说欺诈 → 确实是欺诈 ✓ 成功拦截
  FP(False Positive): 模型说欺诈 → 其实是正常 ✗ 误杀(客户投诉)
  TN(True Negative):  模型说正常 → 确实是正常 ✓ 正确放行
  FN(False Negative): 模型说正常 → 其实是欺诈 ✗ 漏放(资金损失)

关键指标:
  精确率(Precision) = TP / (TP + FP) = "模型标记为欺诈的里面,真的有多少"
  召回率(Recall)    = TP / (TP + FN) = "所有欺诈交易中,模型抓到了多少"
  
  风控的核心权衡:
    提高Precision → 少误杀 → 但可能漏放更多欺诈
    提高Recall    → 少漏放 → 但可能误杀更多正常交易
    
    通常风控偏向高Recall(宁可多拦一点,不能漏掉欺诈)
    Precision通过人工审核环节弥补

3.2 AUC-ROC

ROC曲线:
  X轴 = FPR(False Positive Rate) = FP / (FP + TN) = "正常交易被误杀的比例"
  Y轴 = TPR(True Positive Rate)  = TP / (TP + FN) = "欺诈交易被抓到的比例"
  
绘制方法:
  将模型评分从高到低排序
  逐步降低阈值 → 每个阈值计算一对(FPR, TPR)
  连成曲线

  TPR
  1.0 │        ╭──────────
      │      ╭─╯
      │    ╭─╯
      │  ╭─╯         ← 模型曲线(越靠左上越好)
  0.5 │╭─╯
      │╱  ╱ ← 对角线(随机模型:AUC=0.5)
      │ ╱
  0.0 ├────────────── FPR
      0.0          0.5          1.0

AUC的直觉:
  AUC = 随机取一个正样本和一个负样本,模型给正样本打分更高的概率

  AUC = 0.5  → 模型等于瞎猜
  AUC = 0.7  → 有一定区分力
  AUC = 0.8  → 区分力不错
  AUC = 0.9  → 很强的区分力
  AUC = 1.0  → 完美区分(现实中不存在)

AUC的优点:
  ✓ 不受阈值影响(衡量的是排序能力)
  ✓ 不受类别不平衡影响(FPR和TPR分别在正负样本内计算)

AUC的局限:
  ✗ 在类别极度不平衡时,AUC可能过于乐观
     因为FPR分母是大量负样本,少量FP被稀释了
     → 推荐配合AUPRC使用

3.3 KS(Kolmogorov-Smirnov)

KS统计量:
  KS = max(|CDF_good(x) - CDF_bad(x)|)

直觉:
  把所有好人(正常交易)和坏人(欺诈交易)按模型评分排序
  画两个累积分布函数(CDF)
  KS = 两条CDF之间的最大距离

KS图:
  CDF
  1.0 │         ╭───── Good CDF
      │        ╱╭──── Bad CDF
      │       ╱╱
      │      ╱╱
  0.5 │     ╱╱ ← KS = 这里两条线的最大距离
      │    ╱╱
      │   ╱╱
      │  ╱╱
  0.0 ├─╱╱───────────── Score
      Low              High

KS值解读:
  KS < 0.2  → 区分力弱
  0.2 ≤ KS < 0.3  → 一般
  0.3 ≤ KS < 0.5  → 较好 ✓
  0.5 ≤ KS < 0.7  → 很好 ✓
  KS ≥ 0.7  → 可疑(可能有特征穿越)

KS vs AUC:
  两者都衡量区分能力,但视角不同:
  AUC:整体排序能力
  KS:最大分离点的区分度
  
  实际中AUC和KS通常同向变化
  但可能出现AUC高而KS低的情况(模型在中间段区分好但两端差)

计算示例:
  将模型评分分成10等分(Decile):
  
  Decile  样本数  坏人数  好人数  坏人CDF  好人CDF  |差值|
  1(高分)  1000    45     955    45%      10%      35%
  2        1000    20     980    65%      20%      45%  ← KS
  3        1000    12     988    77%      31%      46%  ← KS最大值
  4        1000     8     992    85%      41%      44%
  5        1000     5     995    90%      52%      38%
  ...
  
  KS ≈ 46%(在第3个Decile达到最大)

3.4 Lift/累积增益

Lift的定义:
  Lift@K% = (Top K%中坏人浓度) / (全体坏人浓度)

直觉:
  "如果我只看模型评分最高(最可疑)的K%客户,
   能捕捉到多少倍于平均水平的坏人?"

计算示例:
  全体10000个客户中有100个坏人(坏人率=1%)
  
  按模型评分排序,取Top 10%(1000人):
    其中有40个坏人
    坏人浓度 = 40/1000 = 4%
    Lift@10% = 4% / 1% = 4.0
    → "只看Top 10%就能捕捉到4倍于随机的坏人"
  
  累积增益@10%:
    捕获率 = 40/100 = 40%
    → "只看Top 10%就能捕获40%的坏人"

业务意义:
  如果人工审核产能有限(只能审1000人/天)
  Lift@10% = 4 意味着用模型辅助比随机抽查效率高4倍
  
  Lift曲线:
  Lift
  5.0 │╲
      │  ╲
  3.0 │    ╲
      │      ╲──── 模型
  1.0 │──────────── 随机(Lift永远=1)
      ├──────────── Decile
      1  2  3  4  5  6  7  8  9  10

3.5 AUPRC(精确率-召回率曲线下面积)

PR曲线:
  X轴 = Recall(召回率)
  Y轴 = Precision(精确率)

AUPRC = PR曲线下的面积

为什么在类别不平衡时比AUC更好?

  考虑一个极端场景:10000正常 + 10欺诈
  
  模型预测100个为欺诈,其中9个确实是(1个漏掉)
  
  ROC视角:
    TPR = 9/10 = 0.9
    FPR = 91/10000 = 0.009
    → 看起来很好(TPR高,FPR低)
  
  PR视角:
    Recall = 9/10 = 0.9
    Precision = 9/100 = 0.09
    → Precision只有9%(100个拦截中91个是误杀)
  
  AUC看不出Precision的问题(因为FPR被大量负样本稀释了)
  AUPRC能捕捉到这个问题

基线对比:
  随机模型的AUC基线 = 0.5(固定的)
  随机模型的AUPRC基线 = 正类比例(如0.1%)→ 变化的
  
  所以AUPRC = 0.3在不平衡场景下可能已经很好了
  (因为基线是0.001)

3.6 PSI(Population Stability Index)

PSI衡量模型输入数据的分布是否发生了变化

公式:
  PSI = Σ (A_i - E_i) × ln(A_i / E_i)

  E = Expected(基线分布,通常是训练集的分布)
  A = Actual(当前分布,即线上数据的分布)

计算步骤:
  1. 将模型评分分成10个等距区间(如0-0.1, 0.1-0.2, ...)
  2. 计算基线期每个区间的样本占比 E_i
  3. 计算当前期每个区间的样本占比 A_i
  4. 对每个区间计算 (A_i - E_i) × ln(A_i / E_i)
  5. 求和得到PSI

计算示例:

  分箱    基线(E)   当前(A)   A-E     ln(A/E)   贡献
  0-0.1   0.05      0.04     -0.01   -0.223     0.002
  0.1-0.2 0.10      0.09     -0.01   -0.105     0.001
  0.2-0.3 0.15      0.14     -0.01   -0.069     0.001
  0.3-0.4 0.20      0.18     -0.02   -0.105     0.002
  0.4-0.5 0.15      0.16     +0.01   +0.065     0.001
  0.5-0.6 0.12      0.14     +0.02   +0.154     0.003
  0.6-0.7 0.10      0.12     +0.02   +0.182     0.004
  0.7-0.8 0.07      0.08     +0.01   +0.134     0.001
  0.8-0.9 0.04      0.03     -0.01   -0.288     0.003
  0.9-1.0 0.02      0.02     0.00    0.000      0.000
  
  PSI = 0.002 + 0.001 + ... + 0.000 = 0.018

PSI阈值:
  PSI < 0.1   → 稳定(绿灯)
  0.1 ≤ PSI < 0.25 → 需关注(黄灯)→ 调查原因
  PSI ≥ 0.25  → 不稳定(红灯)→ 必须重训模型

直觉:
  PSI回答的是:"模型现在看到的数据和训练时的数据还像吗?"
  如果分布变了 → 模型可能在一个它"没见过"的数据上做预测
  → 效果可能大幅下降

3.7 CSI(Characteristic Stability Index)

CSI = 特征级别的PSI

PSI告诉你"模型输出分布变了"
CSI告诉你"哪个特征的分布变了"→ 找到根因

计算方法:对每个输入特征计算PSI

示例:
  特征                    CSI      状态
  txn_count_5min          0.03     ✅ 稳定
  txn_sum_1hour           0.05     ✅ 稳定
  user_age_days           0.02     ✅ 稳定
  device_change_count     0.42     🚨 不稳定!← 这个特征出问题了
  geo_distance            0.08     ✅ 稳定

排查发现:
  device_change_count的分布突变
  原因:APP升级后设备指纹生成逻辑变了
  所有用户的设备指纹都变了 → device_change_count暴增
  → 这不是用户行为变了,是数据bug

修复:
  更新设备指纹逻辑后重新计算
  或者临时下线这个特征(降级)

3.8 可解释性

SHAP(SHapley Additive exPlanations)

来源:博弈论中的Shapley值

核心问题:
  模型预测用户A的欺诈概率是0.87
  → 为什么是0.87?哪些特征导致了高分?

SHAP值的定义:
  对于特征j,它的SHAP值 = 该特征加入所有可能特征子集的边际贡献的加权平均

数学表达:
  φ_j = Σ_{S⊆N\{j}} [|S|! × (|N|-|S|-1)! / |N|!] × [f(S∪{j}) - f(S)]

直觉(用类比解释):
  想象一个团队项目,5个人合作完成了一个任务
  每个人的"贡献" = 把TA加入任何可能的子团队时带来的提升的平均
  
  SHAP做的就是这件事:
  把"特征j"加入任何可能的"特征子集"时
  模型预测值的变化(边际贡献)
  对所有可能子集取加权平均

SHAP值的性质:
  1. Σ φ_j = f(x) - E[f(x)]
     → 所有特征的SHAP值之和 = 预测值 - 基线值
  2. φ_j > 0 → 该特征推高了预测值
     φ_j < 0 → 该特征降低了预测值

可视化类型:

1. Force Plot(单个预测解释)
   基线值 = 0.15(平均欺诈率)
   
   推高的特征:                    推低的特征:
   txn_count_5min=8 → +0.25       user_age=1825d → -0.08
   new_payee=1     → +0.20       kyc_verified=1 → -0.05
   amount=15000    → +0.15       
   night_flag=1    → +0.10       
   
   0.15 + 0.25 + 0.20 + 0.15 + 0.10 - 0.08 - 0.05 = 0.72

2. Summary Plot(全局特征重要性)
   对所有样本的|SHAP值|取均值,排序
   
   Mean |SHAP|
   txn_count_5min    ████████████████  0.18
   amount            ██████████████    0.15
   new_payee_flag    ████████████      0.12
   device_change     ██████████        0.10
   geo_distance      ████████          0.08
   ...

3. Dependence Plot(特征与SHAP值的关系)
   X轴 = 特征值(如交易金额)
   Y轴 = SHAP值
   
   可以看到:金额越高 → SHAP值越正 → 风险越高
   但可能在某个阈值处出现非线性跳变

LIME(Local Interpretable Model-agnostic Explanations)

核心思想:
  在某个预测点的"邻域",用简单模型(线性回归)近似黑箱模型
  然后用简单模型来解释

步骤:
  1. 对要解释的样本 x,在附近随机生成N个扰动样本
  2. 用黑箱模型对这N个样本预测
  3. 用加权线性回归拟合这N个(扰动, 预测)
     权重 = 与x的距离(越近权重越大)
  4. 线性回归的系数 = 每个特征的"局部重要性"

优点:
  模型无关——可以解释任何黑箱模型
  局部解释——聚焦于具体预测
  直观——线性系数容易理解

缺点:
  不稳定——不同的随机扰动可能给出不同的解释
  局部性——不能做全局解释
  
SHAP vs LIME:
  SHAP:理论严谨、全局+局部、但计算量大
  LIME:简单直观、只能局部、但可能不稳定
  推荐:生产环境用SHAP,快速分析用LIME

规则蒸馏

目标:从复杂模型中提取可解释的if-else规则

方法:
  1. 用XGBoost训练一个高性能模型(AUC=0.90)
  2. 用XGBoost的预测结果作为"标签"
  3. 训练一棵浅决策树(max_depth=5)去拟合XGBoost的预测
  4. 从决策树中提取规则

结果示例:
  IF txn_count_5min > 5 AND amount > 5000 AND new_payee = 1:
    → HIGH RISK (score = 0.85)
  ELIF txn_count_5min > 3 AND night_flag = 1:
    → MEDIUM RISK (score = 0.55)
  ELIF amount > 10000:
    → MEDIUM RISK (score = 0.45)
  ELSE:
    → LOW RISK (score = 0.12)

价值:
  ✓ 可以给监管看("我们的模型逻辑是这样的")
  ✓ 业务团队能理解和审核
  ✓ 可以作为模型的"兜底规则"(模型不可用时启用规则)

代价:
  ✗ 规则的精度低于原始模型(AUC可能从0.90降到0.82)
  ✗ 规则太复杂就不可解释了(控制树深度≤5)

四、模型上线与A/B测试

4.1 Champion-Challenger框架

Champion = 当前生产环境正在使用的模型
Challenger = 候选的新模型(待验证)

上线流程(灰度切换):

阶段1:影子模式(Shadow Mode)(1-2周)
  所有流量 → Champion做决策
              Challenger并行预测但不做决策
              记录两者的预测结果差异
  
  验证:
    ✓ Challenger在线性能是否与线下一致(排除特征偏移)
    ✓ Challenger预测延迟是否可接受
    ✓ 预测分布是否合理

阶段2:小流量切换(2周)
  5%流量 → Challenger做决策
  95%流量 → Champion做决策
  
  对比指标:
    拦截率、误杀率、客户投诉率
    如果Challenger明显更差 → 立即回滚

阶段3:逐步放量
  5% → 20% → 50% → 100%
  每个阶段持续1-2周
  每个阶段都监控核心指标

阶段4:全量切换
  旧Champion退役或降级为兜底
  新模型成为Champion

回滚方案:
  任何阶段发现问题 → 1分钟内切回Champion
  实现:
    模型版本路由器:根据配置决定使用哪个模型
    A/B分流器:按用户ID哈希分配流量

4.2 影子模式(Shadow Mode)详解

架构设计:

  ┌──────────┐     ┌───────────────────────────┐
  │  交易事件  │────→│     模型路由器              │
  └──────────┘     │                             │
                    │  ┌─────────────┐            │
                    │  │ Champion    │──→ 做决策   │
                    │  │ (v2.1)      │             │
                    │  └─────────────┘            │
                    │                             │
                    │  ┌─────────────┐            │
                    │  │ Challenger  │──→ 只记录   │
                    │  │ (v3.0)      │   不决策    │
                    │  └─────────────┘            │
                    └───────────────────────────┘
                                │
                                ↓
                    ┌───────────────────────┐
                    │   对比分析报告          │
                    │                         │
                    │   Champion Score: 0.35  │
                    │   Challenger Score: 0.72│
                    │   Divergence: 37%      │
                    │                         │
                    │   Champion Decision: PASS│
                    │   Challenger Decision: BLOCK│
                    └───────────────────────┘

关键分析维度:
  1. 预测一致率:两个模型给出相同决策的比例
     一致率 > 90% → Challenger没有太大变化
     一致率 < 70% → 差异很大,需要仔细分析

  2. 分歧分析:在哪些样本上不一致?
     Champion PASS + Challenger BLOCK → Challenger更严格
     Champion BLOCK + Challenger PASS → Challenger更宽松
     
     哪种更好?需要等标签回流后验证

  3. 评分分布对比:
     Challenger的评分分布是否与训练时一致?(PSI检查)

4.3 A/B测试的统计学

问题:怎么判断Challenger是否真的比Champion好?
  不能只看"Challenger的拦截率更高"——可能是随机波动

需要统计检验来回答:"这个差异是真实的还是偶然的?"

1. 假设检验框架
   H0(零假设):Challenger没有比Champion好(差异=0)
   H1(备择假设):Challenger比Champion好(差异>0)
   
   如果数据强烈反对H0 → 拒绝H0 → 接受Challenger更好

2. 样本量计算(功效分析)
   
   在A/B测试开始前,必须算好需要多少样本
   
   公式(简化版):
     n = (z_{α/2} + z_β)² × 2σ² / δ²
   
   其中:
     α = 显著性水平(通常0.05)→ z_{α/2} = 1.96
     β = 第二类错误概率(通常0.2)→ z_β = 0.84
     σ = 指标的标准差
     δ = 最小可检测效应(MDE)
   
   例:
     当前拦截率 = 85%(σ ≈ 0.36)
     希望检测到2%的提升(δ = 0.02)
     
     n = (1.96 + 0.84)² × 2 × 0.36² / 0.02²
       = 7.84 × 0.2592 / 0.0004
       = 5,080 每组
     
     总共需要约10,000个样本
     如果每天1000笔交易 → 需要至少10天

3. 常见陷阱
   
   ✗ "看到差异就宣布成功"
     → 必须等到样本量达到预计要求
   
   ✗ "多次看结果直到显著就停止"
     → 这是p-hacking,会导致假阳性膨胀
     → 正确做法:预先确定检验时间和样本量
   
   ✗ "只看p值不看效应量"
     → 样本量足够大时,任何微小差异都"显著"
     → 但0.1%的提升可能没有业务价值

五、模型监控

5.1 实时监控指标

监控层次:

层次1:系统健康(运维视角)
  - 模型服务是否可用
  - 推理延迟P50/P99
  - QPS和错误率
  - 资源使用率(CPU/内存/GPU)

层次2:模型行为(数据科学视角)
  - 模型评分分布(今天 vs 基线期)
  - 特征分布(PSI/CSI)
  - 决策分布(通过率/拦截率/人工审核率)
  - 评分均值和方差变化

层次3:业务效果(业务视角)
  - 实际损失率
  - 客户投诉率
  - 误杀率
  - 漏放率

监控看板设计:
  ┌──────────────────────────────────────────────────────┐
  │              Model Monitoring Dashboard               │
  ├──────────────────────────────────────────────────────┤
  │                                                        │
  │  [系统健康]                                            │
  │  Service: ✅ UP    Latency P99: 8ms    QPS: 1,234     │
  │  Error Rate: 0.01%  CPU: 45%  Memory: 62%             │
  │                                                        │
  │  [模型行为]                                            │
  │  Score Distribution PSI: 0.08 ✅                       │
  │  Feature CSI Max: 0.12 ⚠️ (device_change)            │
  │  Pass Rate: 92.3% (baseline: 93.1%)                   │
  │  Block Rate: 4.2% (baseline: 3.8%)                    │
  │  Review Rate: 3.5% (baseline: 3.1%)                   │
  │                                                        │
  │  [业务效果 - 滞后指标]                                  │
  │  Fraud Loss (MTD): $45,678 (vs $52,341 LM)            │
  │  False Positive Rate: 12.3%                            │
  │  Customer Complaints: 23 (vs 31 LM)                   │
  │                                                        │
  │  [告警]                                                │
  │  ⚠️ 2026-04-13 09:15 CSI(device_change) = 0.12       │
  │     Action: Investigating upstream data change         │
  │                                                        │
  └──────────────────────────────────────────────────────┘

5.2 定期评估

月度评估(Monthly Model Review):
  ✓ AUC/KS趋势(近3个月)
  ✓ PSI(模型评分分布稳定性)
  ✓ 特征CSI(哪些特征在变化)
  ✓ 业务指标(拦截率、损失率、投诉率)
  
  输出:月度模型健康报告

季度评估(Quarterly Validation):
  ✓ 完整的Vintage分析(按月队列跟踪表现)
  ✓ 亚群体分析(不同客群的模型效果差异)
  ✓ 公平性检查(不同群体的通过率是否有偏差)
  ✓ 与行业基准对比
  
  输出:季度模型验证报告

Vintage分析解释:
  按"客户入场月份"分组(队列/Vintage)
  跟踪每个Vintage在后续月份的表现

  入场月  M1逾期  M3逾期  M6逾期  M12逾期
  2025/10  0.8%    1.5%    2.3%    3.1%
  2025/11  0.9%    1.7%    2.5%    -
  2025/12  1.2%    2.1%    -       -
  2026/01  1.5%    -       -       -    ← 逾期率上升趋势!
  
  → 如果新Vintage的逾期率持续高于旧Vintage → 模型可能需要更新

年度评估(Annual Model Re-validation):
  ✓ 全面模型性能评估
  ✓ 替代模型比较
  ✓ 监管合规审查
  ✓ 决定是否重训/退役

5.3 概念漂移检测

概念漂移(Concept Drift):
  数据的底层统计特性随时间变化
  模型学到的"规律"不再适用

漂移类型:

1. 突变型(Sudden Drift)
   特征分布突然变化
   
   PSI ────────── ╱ ──────────
                  ╱ ← 某天突然飙升
   
   常见原因:
     系统升级/数据源变更/外部事件(如疫情)
   对策:立即告警 + 排查根因

2. 渐变型(Gradual Drift)
   特征分布缓慢变化
   
   KS  ──────────╲
                    ╲──────── ← 缓慢下降
   
   常见原因:
     用户行为自然演化/欺诈模式迭代
   对策:定期重训 + 趋势监控

3. 周期型(Recurring Drift)
   分布呈周期性变化
   
   PSI  ╱╲  ╱╲  ╱╲
       ╱  ╲╱  ╲╱  ╲ ← 每年双11前后变化
   
   常见原因:
     季节性因素(节假日/购物季/财年末)
   对策:建立季节性基线 + 使用同比而非环比

4. 检测方法

   DDM(Drift Detection Method):
     监控模型误差率的均值μ和标准差σ
     如果 μ + σ > μ_min + 2σ_min → 警告
     如果 μ + σ > μ_min + 3σ_min → 确认漂移
   
   EDDM(Early DDM):
     监控连续两次误差之间的距离
     更早检测到渐变漂移
   
   ADWIN(Adaptive Windowing):
     自适应调整监控窗口大小
     统计检验窗口内外的分布差异
     窗口内外差异显著 → 漂移发生 → 收缩窗口
   
   Page-Hinkley Test:
     累积偏差检测
     监控预测误差的累积偏离

5.4 重训策略

1. 定期重训(Scheduled Retraining)
   
   频率:每季度/每半年
   数据:最近12-18个月的数据
   
   流程:
     收集新数据 → 重新训练 → 离线评估 → 
     影子模式验证 → 灰度上线 → 全量切换
   
   优点:可预测、流程清晰
   缺点:可能来不及应对突发变化

2. 触发式重训(Event-triggered Retraining)
   
   触发条件:
     PSI > 0.25 → 数据分布显著变化
     KS下降 > 10% → 模型区分力明显下降
     业务指标恶化 → 损失率/投诉率超过阈值
   
   优点:及时响应变化
   缺点:重训频率不可预测,资源规划难

3. 增量学习(Incremental Learning)
   
   不完全重训——在现有模型上用新数据微调
   
   方法:
     在线学习:每来一个新样本就更新参数
     Mini-batch更新:积累一批新样本后批量更新
     Fine-tuning:用新数据对预训练模型微调
   
   适用场景:
     模型参数可以增量更新(如逻辑回归、在线梯度下降)
     数据变化是渐变的(不是突变)
   
   注意:
     ✗ 可能导致"灾难性遗忘"——新数据覆盖了旧知识
     ✗ 增量更新的模型可能偏离最优——定期全量重训作为校准

4. 推荐组合策略
   
   日常:增量更新(快速适应小变化)
   季度:全量重训(校准模型参数)
   触发:紧急重训(应对突发事件)
   
   类比:
     增量更新 = 每天保养汽车
     全量重训 = 每年大修
     触发重训 = 抛锚了紧急修理

六、模型治理与合规

6.1 模型清单管理

企业级模型管理需要一个"模型清单"(Model Inventory)

每个模型登记:
  ┌────────────────────────────────────────────┐
  │ Model ID: FRD-001                          │
  │ Name: 实时反欺诈评分模型                      │
  │ Version: v3.2                               │
  │ Type: XGBoost                               │
  │ Owner: 风控模型团队 - 张三                     │
  │ Status: Production                          │
  │ Deployed: 2026-01-15                        │
  │ Last Validated: 2026-03-30                  │
  │ Next Review: 2026-06-30                     │
  │ Risk Tier: Tier 1 (Critical)                │
  │ Input Features: 42                          │
  │ Training Data: 2025-01 to 2025-12           │
  │ AUC: 0.91 (training) / 0.88 (production)   │
  │ KS: 0.52 (training) / 0.48 (production)    │
  │ PSI: 0.08 (current)                        │
  │ Dependencies: Feature Store v2.1, Redis 7   │
  │ Fallback: Rule-based scoring (score=0.5)    │
  │ Audit Trail: [link]                        │
  └────────────────────────────────────────────┘

风险分级:
  Tier 1 (Critical): 直接影响客户资金安全(反欺诈、授信)
    → 月度监控 + 季度验证 + 年度全面审计
  
  Tier 2 (Important): 影响业务效率(营销、推荐)
    → 季度监控 + 半年度验证
  
  Tier 3 (Low): 辅助决策(内部报表、趋势分析)
    → 半年度监控

6.2 Model Card(模型文档标准)

Model Card是Google在2019年提出的模型文档标准
现已成为行业最佳实践

Model Card结构:

1. 模型详情(Model Details)
   - 开发者、日期、版本
   - 模型类型和架构
   - 训练算法和超参数

2. 预期用途(Intended Use)
   - 主要使用场景
   - 不适用的场景
   - 目标用户

3. 性能指标(Metrics)
   - AUC/KS/Lift
   - 分人群表现
   - 与基线模型的对比

4. 训练数据(Training Data)
   - 数据来源和时间范围
   - 样本量和标签分布
   - 数据预处理步骤

5. 评估数据(Evaluation Data)
   - 测试集的构成
   - 是否与训练数据独立

6. 公平性分析(Fairness Analysis)
   - 不同群体的通过率差异
   - 是否存在歧视性偏差

7. 局限性(Limitations)
   - 已知的局限
   - 不适用的边界条件

8. 建议(Recommendations)
   - 监控建议
   - 使用注意事项

6.3 模型审计轨迹

审计需要回答的问题:
  "某一笔交易为什么被拦截了?"
  → 需要完整的决策链路可追溯

审计链路:
  交易事件 → 特征值 → 模型版本 → 模型评分 → 规则判断 → 最终决策

存储设计:
  每笔交易的决策日志:
  {
    "txn_id": "TXN-2026041312345",
    "timestamp": "2026-04-13T14:32:15Z",
    "model_version": "FRD-001-v3.2",
    "features": {
      "txn_count_5min": 8,
      "amount": 15000,
      "new_payee": true,
      "zscore_amount": 3.2,
      ...
    },
    "model_score": 0.87,
    "shap_top5": [
      {"feature": "txn_count_5min", "shap": 0.25},
      {"feature": "new_payee", "shap": 0.20},
      {"feature": "amount", "shap": 0.15},
      {"feature": "night_flag", "shap": 0.10},
      {"feature": "zscore_amount", "shap": 0.08}
    ],
    "rules_triggered": ["R001_high_freq", "R005_new_payee"],
    "decision": "BLOCK",
    "decision_reason": "Model score > threshold (0.85) + Rule R001 triggered"
  }

存储策略:
  热数据(近7天)→ Elasticsearch(快速查询)
  温数据(近1年)→ HBase/Cassandra(大量存储)
  冷数据(>1年)→ S3/HDFS(归档合规)

保留期限:
  监管要求通常5-7年
  反洗钱相关可能更长

6.4 公平性检查

问题:模型是否对某些群体产生系统性的歧视?

检查维度:
  性别、年龄、地区、种族、收入阶层

核心指标:

1. Demographic Parity(人口平等)
   不同群体的通过率应该接近
   
   例:
     男性贷款通过率: 72%
     女性贷款通过率: 65%
     → 差距7%,需要调查原因

2. Equal Opportunity(机会平等)
   不同群体中"好客户被正确通过"的比例应该接近
   
   例:
     男性好客户通过率: 92%
     女性好客户通过率: 88%
     → 好的女性客户更容易被误拒

3. Predictive Parity(预测平等)
   不同群体中"被通过的客户的违约率"应该接近
   
   例:
     男性通过客户违约率: 3%
     女性通过客户违约率: 2%
     → 模型对女性更严格(通过的女性质量更好)

处理方法:
  ✓ 检查是否有敏感特征直接或间接进入模型
  ✓ 使用公平性约束的训练方法
  ✓ 对不同群体使用不同的阈值(校准后切分点)
  ✓ 定期报告和审查

七、工程落地要点

7.1 MLOps平台架构

完整的模型生命周期需要平台支撑:

  ┌──────────────────────────────────────────────────┐
  │                MLOps Platform                      │
  │                                                    │
  │  ┌───────────┐  ┌────────────┐  ┌────────────┐   │
  │  │ Feature    │  │ Training   │  │ Model      │   │
  │  │ Store      │  │ Pipeline   │  │ Registry   │   │
  │  │            │  │            │  │            │   │
  │  │ 特征定义   │  │ 数据准备   │  │ 版本管理   │   │
  │  │ 特征计算   │  │ 模型训练   │  │ 模型存储   │   │
  │  │ 特征存储   │  │ 超参调优   │  │ 元数据     │   │
  │  └─────┬─────┘  └─────┬──────┘  └─────┬──────┘   │
  │        │              │               │            │
  │        ↓              ↓               ↓            │
  │  ┌───────────┐  ┌────────────┐  ┌────────────┐   │
  │  │ Evaluation│  │ Serving    │  │ Monitoring │   │
  │  │ Engine    │  │ Engine     │  │ Engine     │   │
  │  │            │  │            │  │            │   │
  │  │ AUC/KS    │  │ A/B分流    │  │ PSI/CSI    │   │
  │  │ Lift/PSI  │  │ 影子模式   │  │ AUC趋势   │   │
  │  │ 公平性    │  │ 灰度切换   │  │ 告警       │   │
  │  │ SHAP      │  │ 回滚       │  │ 报告       │   │
  │  └───────────┘  └────────────┘  └────────────┘   │
  └──────────────────────────────────────────────────┘

各组件的技术选型:

Feature Store: Feast / Tecton / 自研
Training Pipeline: Kubeflow Pipelines / Airflow + MLflow
Model Registry: MLflow Model Registry / Seldon
Serving Engine: TensorFlow Serving / Triton / 自研
Monitoring: Evidently AI / Grafana + Prometheus / 自研

7.2 模型版本管理

用MLflow管理模型版本:

  MLflow Model Registry
  ├── FRD-001 (反欺诈模型)
  │   ├── Version 1 (2025-06): XGBoost, AUC=0.88
  │   │   └── Stage: Archived
  │   ├── Version 2 (2025-09): XGBoost, AUC=0.90
  │   │   └── Stage: Archived  
  │   ├── Version 3 (2026-01): XGBoost, AUC=0.91
  │   │   └── Stage: Production ← 当前生产版本
  │   └── Version 4 (2026-04): LightGBM, AUC=0.92
  │       └── Stage: Staging ← 正在影子模式验证
  │
  └── CRS-001 (信用评分模型)
      ├── Version 1 ...
      └── Version 2 ...

每个版本记录:
  - 训练代码commit hash
  - 训练数据版本
  - 超参数
  - 评估指标
  - 特征列表
  - 模型文件(pickle/ONNX/PMML)
  - Model Card

7.3 全链路可追溯

从特征到模型到决策的完整追溯链:

  ┌─────────┐     ┌─────────┐     ┌─────────┐     ┌─────────┐
  │ Feature │────→│ Model   │────→│Decision │────→│ Outcome │
  │ Lineage │     │ Lineage │     │ Lineage │     │ Lineage │
  │         │     │         │     │         │     │         │
  │ 哪些特征│     │ 哪个版本│     │ 什么决策│     │ 最终结果│
  │ 什么值  │     │ 什么分数│     │ 什么规则│     │ 是否欺诈│
  │ 什么时候│     │ 什么时候│     │ 什么时候│     │ 标签回流│
  └─────────┘     └─────────┘     └─────────┘     └─────────┘

价值:
  1. 审计合规:监管要求能解释每个决策
  2. 问题排查:模型效果下降时快速定位原因
  3. 模型改进:了解什么样的样本被误判 → 改进特征/模型
  4. 业务分析:了解风控策略的整体效果

实现要点:
  每个环节写入统一的事件日志
  用唯一ID(txn_id)串联整个链路
  日志格式标准化(JSON Schema定义)
  存储按时间分区、按查询模式建索引

八、常见误区与面试重点

8.1 常见误区

误区1:"AUC越高越好"
  ✗ AUC=0.99可能意味着特征穿越
  ✗ AUC=0.82的稳定模型 > AUC=0.92但PSI=0.3的不稳定模型
  ✓ 关注稳定性和可解释性,不只是精度

误区2:"模型训练好就能上线"
  ✗ 训练→上线之间还有:特征一致性验证、影子模式、灰度切换
  ✗ 跳过这些步骤可能导致线上事故
  ✓ Champion-Challenger流程是必须的

误区3:"用最新最强的算法"
  ✗ 深度学习在风控场景不一定比XGBoost好
  ✗ 评分卡场景逻辑回归仍然是首选(监管可解释性要求)
  ✓ 选择合适的,不是选最新的

误区4:"SMOTE解决一切不平衡问题"
  ✗ SMOTE在高维稀疏数据效果差
  ✗ 对测试集做SMOTE会导致评估指标虚高
  ✓ 代价敏感学习往往更实用

误区5:"PSI低就没问题"
  ✗ PSI低只说明数据分布没变
  ✗ 但概念漂移可能发生了(P(Y|X)变了而P(X)没变)
  ✓ 需要同时监控PSI(数据分布)和KS/AUC(模型效果)

误区6:"增量学习可以替代重训"
  ✗ 增量学习只能应对渐变漂移
  ✗ 长期增量更新可能偏离最优
  ✓ 增量+定期全量重训组合使用

误区7:"模型解释是可选的"
  ✗ 金融监管越来越要求模型可解释
  ✗ EU AI Act对高风险AI系统有严格的解释性要求
  ✓ SHAP/LIME/规则蒸馏是必备能力

8.2 面试高频问题

Q: 类别不平衡怎么处理?说说你知道的方法。
A: 数据层面(SMOTE过采样/欠采样/Tomek Links清洗)+ 
   算法层面(代价敏感学习/Focal Loss/EasyEnsemble)。
   风控实战中代价敏感学习最实用,注意不要对测试集做采样。

Q: 金融数据为什么不能用随机K-Fold?
A: 金融数据有时间依赖,随机分割导致"用未来预测过去"。
   应该用Time-Series Split或Purged K-Fold,
   训练集和验证集之间留Gap避免特征时间窗口的信息泄露。

Q: AUC和KS的区别?
A: AUC衡量整体排序能力(随机正样本得分>负样本的概率),
   KS衡量最大分离度(好坏人CDF的最大距离)。
   AUC是全局指标,KS是单点最优指标。

Q: 什么时候需要重训模型?
A: 三种策略组合:定期重训(每季度)+ 触发式重训
   (PSI>0.25或KS下降>10%)+ 增量更新(日常微调)。

Q: 新模型上线的流程是什么?
A: 影子模式(并行不决策)→ 小流量灰度(5%)→ 逐步放量
  (20%/50%/100%)。每个阶段监控核心指标,任何异常立即回滚。

Q: 什么是Model Card?为什么需要?
A: 标准化的模型文档,包含模型详情/预期用途/性能指标/
   公平性分析/局限性。金融监管要求模型可审计可解释,
   Model Card是合规的基础。

Q: SHAP和LIME的区别?
A: SHAP基于博弈论Shapley值,理论严谨,能做全局+局部解释,
   但计算量大。LIME在局部用线性模型近似黑箱,简单直观但
   不稳定。生产环境推荐SHAP。

九、延伸阅读

经典教材

  • Chip Huyen - Designing Machine Learning Systems — MLOps最佳实践,强烈推荐
  • Christopher Bishop - Pattern Recognition and Machine Learning — ML理论经典
  • Aurélien Géron - Hands-On Machine Learning — ML实战入门

论文

  • Mitchell et al. (2019) - Model Cards for Model Reporting — Model Card原始论文
  • Lundberg & Lee (2017) - SHAP: A Unified Approach to Interpreting Model Predictions — SHAP原始论文
  • Ribeiro et al. (2016) - "Why Should I Trust You?": LIME — LIME原始论文
  • Lin et al. (2017) - Focal Loss for Dense Object Detection — Focal Loss
  • Chawla et al. (2002) - SMOTE — 过采样经典

在线资源

  • MLflow 官方文档 — 模型版本管理实战
  • Evidently AI — 开源模型监控工具
  • Feast 官方文档 — Feature Store实践
  • Google Cloud MLOps Whitepaper — MLOps成熟度模型

工具

  • MLflow — 实验跟踪和模型管理
  • Kubeflow — ML工作流编排
  • SHAP库 — 可解释性计算
  • Evidently — 数据和模型监控

十、与已有笔记的关联

关联笔记矩阵:

本笔记主题              已有笔记                      关联点
───────────────────────────────────────────────────────────
类别不平衡          →    04-credit-risk-modeling       评分卡中的好坏客户比例
AUC/KS/PSI         →    04-credit-risk-modeling       评分卡模型评估
SHAP/可解释性       →    03-risk-engine               风控引擎的决策审计
Feature Store       →    07-feature-engineering        特征一致性保障
A/B测试            →    Arch Day 70+                  灰度发布架构
模型版本管理        →    Arch Day 100+                 配置中心/版本管理
概念漂移            →    05-fraud-detection            欺诈模式演化
SMOTE/采样          →    05-fraud-detection            反欺诈数据处理
模型治理            →    Arch Day 110+                 企业架构治理

关键要点回顾:
  → 类别不平衡处理(SMOTE/代价敏感/Focal Loss)是面试核心考点
  → 金融数据必须用时间序列切分(Purged K-Fold),不能随机K-Fold
  → AUC/KS/PSI三个指标的含义和阈值必须烂熟于心
  → Champion-Challenger上线流程必须能讲清楚
  → SHAP vs LIME的区别和适用场景
  → 概念漂移的四种类型和检测方法
  → Model Card和模型治理是合规必须