3. PSI 概念与数学原理:群体稳定性指标
群体稳定性指标(Population Stability Index, PSI)是信用评分模型监控中最核心的量化指标,用于衡量模型评分在时间维度上的分布偏移程度。当模型上线后,如果评分分布发生显著变化,往往意味着模型预测能力下降或客群结构改变,需要触发告警并启动模型迭代。
3.1 PSI 的定义与业务含义
PSI 通过比较两个样本(通常为建模样本与当前样本)在评分区间上的分布差异,量化群体稳定程度。其核心思想是:如果模型对同一客群的评分分布保持稳定,则各分数段上的样本占比应基本一致;反之,占比差异越大,PSI 值越高,模型越不稳定。
| PSI 值范围 | 稳定性等级 | 业务建议 |
|---|---|---|
| < 0.10 | 稳定 | 模型表现正常,无需干预 |
| 0.10 – 0.25 | 轻度漂移 | 需关注,排查客群或特征变化 |
| > 0.25 | 严重漂移 | 立即告警,启动模型重训或调整 |
业务经验:PSI 阈值并非绝对固定。在信贷周期波动较大时,可适当放宽至 0.15/0.30;在监管严格场景下,建议收紧至 0.05/0.15。
3.2 PSI 计算公式与推导
PSI 的数学本质是信息论中的 KL 散度(Kullback-Leibler divergence)的对称化形式。其计算公式如下:
PSI = Σ (P_i - Q_i) × ln(P_i / Q_i)
其中:
- P_i:实际样本(当前样本)在第 i 个分数段的占比
- Q_i:预期样本(建模样本)在第 i 个分数段的占比
- i = 1, 2, ..., n,n 为分箱总数
公式解读:
- (P_i - Q_i):衡量两个分布在该箱上的绝对差异
- ln(P_i / Q_i):衡量相对差异,即该箱占比变化的倍数
- 乘积求和:将各箱的差异加权汇总,得到整体偏移量
数学性质:当 P_i = Q_i 时,ln(1)=0,该箱贡献为 0;当 P_i 与 Q_i 差异越大,PSI 值越大。PSI 值域为 [0, +∞),实际应用中极少超过 1.0。
3.3 分箱方法详解
PSI 计算依赖分箱操作,不同的分箱方法会直接影响 PSI 值的敏感性和稳定性。常用的分箱方法有三种:等距分箱、等频分箱和最优分箱。
| 分箱方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 等距分箱 | 将评分区间按固定宽度等分 | 计算简单,箱边界固定 | 样本分布不均时,部分箱可能为空 | 评分分布均匀时使用 |
| 等频分箱 | 使每个箱包含相同数量的样本 | 避免空箱,对稀疏区间更鲁棒 | 箱边界随样本变化,可解释性略差 | 样本分布偏态时推荐 |
| 最优分箱 | 基于统计检验或信息量自动寻找最佳切点 | 最大化组间差异,PSI 更敏感 | 计算复杂,可能过拟合 | 高精度监控场景 |
3.3.1 等距分箱
将评分范围 [min_score, max_score] 等分为 n 个区间,每个区间宽度相同。例如评分 300~900,分 10 箱,则每箱宽度为 60。
# 等距分箱示例(Python)
import numpy as np
scores = np.array([350, 420, 580, 650, 780, 820])
bins = np.linspace(300, 900, 11) # 10个箱,11个边界
indices = np.digitize(scores, bins)
3.3.2 等频分箱
基于分位数将样本划分为 n 个箱,使每个箱的样本数大致相等。通常使用建模样本的分位数作为固定边界,再应用到当前样本。
# 等频分箱示例(Python)
import pandas as pd
scores = pd.Series([350, 420, 580, 650, 780, 820])
# 基于建模样本计算分位数边界
quantiles = scores.quantile([0, 0.1, 0.2, ..., 1.0])
bins = quantiles.values
3.3.3 最优分箱
最优分箱通过卡方检验、信息价值(IV)或决策树等算法,自动寻找使组间差异最大化的切点。在 PSI 监控中,最优分箱能更早捕捉到细微漂移。
# 最优分箱示例(使用决策树思想)
from sklearn.tree import DecisionTreeClassifier
# 将评分作为特征,目标变量为样本来源(建模样本 vs 当前样本)
X = np.concatenate([scores_expected, scores_actual]).reshape(-1, 1)
y = np.array([0]*len(scores_expected) + [1]*len(scores_actual))
tree = DecisionTreeClassifier(max_leaf_nodes=10)
tree.fit(X, y)
# 获取树的分裂点作为最优分箱边界
thresholds = tree.tree_.threshold[tree.tree_.feature != -2]
实践注意:分箱数量通常取 10~20 箱。箱数过少会掩盖局部漂移,箱数过多则导致统计噪声放大。建议在建模阶段固定分箱边界,避免每次监控时重新分箱。
3.4 PSI 计算流程与分箱方法对比
下图展示了 PSI 计算的完整流程,以及三种分箱方法在流程中的位置差异:
3.5 三种分箱方法对 PSI 的影响对比
为直观展示分箱方法对 PSI 计算结果的影响,以下使用同一组模拟数据,分别用三种方法计算 PSI:
| 分箱方法 | 箱数 | PSI 值 | 是否触发告警(阈值0.10) | 特点 |
|---|---|---|---|---|
| 等距分箱 | 10 | 0.087 | 未触发 | 中间箱占比大,局部漂移被稀释 |
| 等频分箱 | 10 | 0.124 | 触发 | 各箱样本均衡,漂移更易捕捉 |
| 最优分箱 | 8 | 0.153 | 触发 | 自动聚焦差异大的区间,敏感度最高 |
关键结论:等频分箱在大多数场景下是 PSI 监控的最佳实践——它避免了空箱问题,对偏态分布鲁棒,且计算稳定。最优分箱适合高精度场景,但需注意过拟合风险。等距分箱仅推荐在评分分布接近均匀时使用。
3.6 PSI 计算的注意事项
- 零值处理:当某箱 Q_i = 0 时,ln(P_i/0) 无定义。实践中通常对占比做平滑处理,如加极小值 1e-6 或使用 Laplace 平滑。
- 分箱边界固定:建模阶段确定分箱边界后,在监控阶段应使用同一组边界,避免因边界变化导致 PSI 值失真。
- 样本量要求:每个箱的样本数建议不少于 30,否则统计波动过大,PSI 值不可靠。
- 多维度监控:PSI 仅反映评分分布的整体偏移,建议结合特征级 PSI(变量稳定性指标)定位具体漂移原因。
常见误区:PSI 值低并不一定代表模型表现好。如果模型已经失效但评分分布恰好与建模样本一致(如所有样本都被判为低分),PSI 仍可能很低。因此 PSI 需与模型性能指标(KS、AUC)联合监控。