3. Champion 模型基线建立:如何选择当前最优模型作为 Champion
在 Champion / Challenger 框架中,Champion 模型是当前生产环境中表现最稳定、风险区分能力最强的评分卡或机器学习模型。建立 Champion 基线不是简单选一个 AUC 最高的模型,而是需要综合评估区分度、稳定性、业务可解释性三个维度。本章将系统讲解 Champion 选择流程与基线性能指标的设定方法。
3.1 Champion 模型选择流程
选择 Champion 模型应遵循以下 5 步标准化流程,确保选出的模型既在统计上显著优于候选模型,又能在实际业务中稳定运行。
- 候选模型池构建:收集近期开发的所有候选模型(包括逻辑回归、XGBoost、LightGBM、神经网络等),确保所有模型使用相同的训练集与验证集。
- 区分度指标排序:在验证集上计算每个模型的 KS、AUC、Lift@10% 等指标,按综合得分降序排列。
- 稳定性检验:对排名前 3 的模型进行 PSI(群体稳定性指标)检验,剔除 PSI > 0.25 的不稳定模型。
- 业务可解释性评估:检查模型特征是否符合业务逻辑,拒绝黑箱模型中存在明显反直觉的特征权重。
- 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 基线的完整建立流程,包含指标排序、稳定性检验、可解释性评估三个核心筛选环节。
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 才能进入替换评审流程。