3. Champion 模型基线建立:如何选择当前最优模型作为 Champion

在 Champion / Challenger 框架中,Champion 模型是当前生产环境中表现最稳定、风险区分能力最强的评分卡或机器学习模型。建立 Champion 基线不是简单选一个 AUC 最高的模型,而是需要综合评估区分度、稳定性、业务可解释性三个维度。本章将系统讲解 Champion 选择流程与基线性能指标的设定方法。

3.1 Champion 模型选择流程

选择 Champion 模型应遵循以下 5 步标准化流程,确保选出的模型既在统计上显著优于候选模型,又能在实际业务中稳定运行。

  1. 候选模型池构建:收集近期开发的所有候选模型(包括逻辑回归、XGBoost、LightGBM、神经网络等),确保所有模型使用相同的训练集与验证集。
  2. 区分度指标排序:在验证集上计算每个模型的 KS、AUC、Lift@10% 等指标,按综合得分降序排列。
  3. 稳定性检验:对排名前 3 的模型进行 PSI(群体稳定性指标)检验,剔除 PSI > 0.25 的不稳定模型。
  4. 业务可解释性评估:检查模型特征是否符合业务逻辑,拒绝黑箱模型中存在明显反直觉的特征权重。
  5. Champion 确认与冻结:通过上述筛选的模型正式标记为 Champion,冻结模型文件、特征工程代码与阈值设定。
关键原则:Champion 模型不一定是 AUC 最高的模型,但一定是“区分度 + 稳定性 + 可解释性”三者加权得分最高的模型。在信贷风控场景中,稳定性权重通常不低于 40%。

3.2 基线性能指标设定

Champion 基线需要设定三个核心指标:KS、AUC、Lift。每个指标都有其特定的业务含义与可接受阈值。下表总结了三个指标的定义、计算方式与风控场景下的典型基线值。

指标 定义 计算方式 风控基线值 说明
KS Kolmogorov-Smirnov 统计量 max(TPR - FPR) ≥ 0.30 衡量模型区分好坏样本的最大差距
AUC ROC 曲线下面积 ROC 曲线积分 ≥ 0.75 整体排序能力,不受阈值影响
Lift@10% 提升度(前 10% 样本) 坏样本率 / 整体坏样本率 ≥ 3.0 业务实用指标,关注高风险客群捕获效率
基线设定技巧:如果当前业务坏账率较高,可适当提高 KS 基线至 0.35 以上;如果业务处于增长期且客群质量较好,AUC 基线可放宽至 0.70。Lift 指标建议结合业务通过率一起看,避免过度拒绝优质客户。

3.3 Champion 基线建立流程 SVG 图

下图展示了从候选模型到 Champion 基线的完整建立流程,包含指标排序、稳定性检验、可解释性评估三个核心筛选环节。

Champion 模型基线建立流程 Champion 模型基线建立流程 候选模型池 区分度指标排序 (KS/AUC/Lift) Top 3 模型 稳定性检验 (PSI ≤ 0.25) 业务可解释性评估 Champion 确认与冻结 稳定性权重 ≥ 40% 可解释性为否决项

3.4 基线指标设定示例代码

以下 Python 代码演示了如何计算 KS、AUC、Lift 三个基线指标,并输出 Champion 模型的基线报告。

import numpy as np
import pandas as pd
from sklearn.metrics import roc_auc_score, roc_curve

def calculate_baseline_metrics(y_true, y_score, top_lift_pct=0.1):
    """
    计算 Champion 基线三大指标
    
    Parameters:
    y_true : array-like, 真实标签 (1=坏, 0=好)
    y_score : array-like, 模型预测分数
    top_lift_pct : float, Lift 计算的前百分之几
    
    Returns:
    dict : 包含 KS, AUC, Lift 的字典
    """
    # 1. 计算 AUC
    auc = roc_auc_score(y_true, y_score)
    
    # 2. 计算 KS
    fpr, tpr, thresholds = roc_curve(y_true, y_score)
    ks = max(tpr - fpr)
    
    # 3. 计算 Lift@top_lift_pct
    df = pd.DataFrame({'y_true': y_true, 'y_score': y_score})
    df = df.sort_values('y_score', ascending=False)
    total_bad_rate = df['y_true'].mean()
    top_n = int(len(df) * top_lift_pct)
    top_bad_rate = df.head(top_n)['y_true'].mean()
    lift = top_bad_rate / total_bad_rate if total_bad_rate > 0 else 0
    
    return {
        'KS': round(ks, 4),
        'AUC': round(auc, 4),
        f'Lift@{int(top_lift_pct*100)}%': round(lift, 2)
    }

# 示例使用
y_true = np.array([0,0,1,0,1,0,0,1,0,0,1,0,0,0,1])
y_score = np.array([0.1,0.2,0.8,0.3,0.7,0.4,0.2,0.9,0.3,0.1,0.6,0.2,0.3,0.4,0.5])

metrics = calculate_baseline_metrics(y_true, y_score, top_lift_pct=0.1)
print("Champion 模型基线报告")
print("=" * 30)
for key, value in metrics.items():
    print(f"{key}: {value}")

3.5 基线指标对比矩阵

在实际项目中,通常会有多个候选模型同时竞争 Champion 位置。下表展示了一个典型的 3 模型对比矩阵,帮助决策者快速定位最优模型。

模型名称 KS AUC Lift@10% PSI 可解释性 综合评分
模型 A (LR) 0.32 0.76 3.2 0.08 高 92
模型 B (XGBoost) 0.38 0.81 4.1 0.22 中 85
模型 C (LightGBM) 0.40 0.83 4.5 0.31 低 78
注意:模型 B 和 C 虽然区分度更高,但 PSI 接近或超过 0.25 阈值,说明模型在时间维度上不稳定。模型 A 虽然 KS 和 AUC 略低,但稳定性极佳且可解释性高,综合评分最高,应被选为 Champion。切勿盲目追求高 AUC 而忽略稳定性风险。

3.6 Champion 基线冻结清单

确认 Champion 模型后,需要冻结以下 6 项基线资产,确保后续 Challenger 模型有统一的比较基准。

  • 模型文件:序列化的模型对象(.pkl / .joblib / .onnx)
  • 特征工程代码:特征衍生、分箱、WOE 编码等完整 pipeline
  • 阈值设定:拒绝阈值、预警阈值、通过阈值
  • 基线指标快照:KS、AUC、Lift 在验证集上的具体数值
  • PSI 参考分布:训练集与验证集的特征分布快照
  • 业务规则文档:模型可解释性说明与特征业务含义

完成上述冻结后,Champion 基线正式建立。后续所有 Challenger 模型必须与 Champion 在同一验证集上比较,且至少在一个核心指标上显著超越 Champion 才能进入替换评审流程。