3. PSI 计算步骤详解:分箱方法、各分箱占比计算、PSI 逐项求和过程
群体稳定性指标(PSI)的计算并非单一公式的简单套用,其核心在于通过“分箱”将连续分布离散化,进而量化两个分布之间的差异。本章将拆解 PSI 计算的三个核心步骤:分箱方法、各分箱占比计算以及逐项求和过程,确保每一步都有清晰的操作依据。
3.1 分箱方法:离散化的基础
分箱是将连续变量(如模型评分)划分为若干个离散区间(箱)的过程。分箱的粗细直接影响 PSI 的敏感度与稳定性。常用的分箱方法包括等距分箱、等频分箱和自定义分箱。
| 分箱方法 | 原理 | 适用场景 | 注意事项 |
|---|---|---|---|
| 等距分箱 | 将评分范围划分为宽度相等的区间 | 评分分布均匀,无极端长尾 | 若样本集中在少数区间,会导致部分箱为空或样本极少 |
| 等频分箱 | 使每个箱包含大致相等的样本数量 | 评分分布不均匀,存在长尾或尖峰 | 分箱边界可能不规整,需注意业务可解释性 |
| 自定义分箱 | 根据业务规则或风险等级划分区间 | 有明确业务含义的评分卡(如 A/B/C/D 级) | 需保证每个箱在预期分布中有足够的样本量 |
实践建议:在风控模型监控中,推荐使用 等频分箱 作为默认方法。它能确保每个箱在预期分布(训练集)中都有足够的样本,避免因空箱导致 PSI 计算异常。通常分箱数量建议在 10~20 之间。
3.2 各分箱占比计算:预期分布 vs 实际分布
确定分箱边界后,需要分别计算预期分布(Expected)和实际分布(Actual)在每个箱中的样本占比。预期分布通常来自模型开发时的训练集或验证集,实际分布来自当前监控期的样本。
计算公式如下:
# 假设分箱边界为 bins = [0, 100, 200, 300, 400, 500]
# 预期样本数组 expected_samples = [150, 200, 300, 200, 150]
# 实际样本数组 actual_samples = [180, 220, 260, 190, 150]
# 计算占比
total_expected = sum(expected_samples) # 1000
total_actual = sum(actual_samples) # 1000
expected_pct = [count / total_expected for count in expected_samples]
actual_pct = [count / total_actual for count in actual_samples]
print("预期占比:", expected_pct)
print("实际占比:", actual_pct)
输出结果示例:
| 分箱区间 | 预期样本数 | 预期占比 | 实际样本数 | 实际占比 |
|---|---|---|---|---|
| [0, 100) | 150 | 15.0% | 180 | 18.0% |
| [100, 200) | 200 | 20.0% | 220 | 22.0% |
| [200, 300) | 300 | 30.0% | 260 | 26.0% |
| [300, 400) | 200 | 20.0% | 190 | 19.0% |
| [400, 500] | 150 | 15.0% | 150 | 15.0% |
避坑提示:当某个箱的实际占比为 0% 时,计算 (Actual% - Expected%) * ln(Actual% / Expected%) 会出现除零错误。此时通常将该箱的贡献值视为 0,或对该箱进行合并处理。
3.3 PSI 逐项求和过程
得到每个箱的预期占比和实际占比后,PSI 的计算公式为:
PSI = Σ (Actual% - Expected%) × ln(Actual% / Expected%)
逐项求和的过程如下表所示:
| 分箱区间 | 预期占比 (E) | 实际占比 (A) | A - E | ln(A / E) | 单项贡献 |
|---|---|---|---|---|---|
| [0, 100) | 0.150 | 0.180 | +0.030 | 0.1823 | 0.0055 |
| [100, 200) | 0.200 | 0.220 | +0.020 | 0.0953 | 0.0019 |
| [200, 300) | 0.300 | 0.260 | -0.040 | -0.1431 | 0.0057 |
| [300, 400) | 0.200 | 0.190 | -0.010 | -0.0513 | 0.0005 |
| [400, 500] | 0.150 | 0.150 | 0.000 | 0.0000 | 0.0000 |
| PSI 总和 | 0.0136 | ||||
最终 PSI 值为 0.0136,远低于 0.1 的警戒线,表明当前实际分布与预期分布基本一致,模型表现稳定。
关键理解:PSI 的逐项求和过程本质上是将两个分布的差异分解到每个分箱中。每个箱的贡献值反映了该区间内样本迁移的幅度。贡献值较大的箱往往是模型漂移的“重灾区”,需要重点关注。
3.4 分箱数量与边界对 PSI 的影响
分箱的数量和边界选择会直接影响 PSI 的计算结果。以下表格展示了不同分箱策略对同一组数据计算出的 PSI 差异:
| 分箱策略 | 分箱数量 | PSI 值 | 结论 |
|---|---|---|---|
| 等距分箱 | 5 | 0.0136 | 稳定 |
| 等距分箱 | 10 | 0.0284 | 稳定(但更敏感) |
| 等频分箱 | 10 | 0.0210 | 稳定 |
| 自定义分箱(3 箱) | 3 | 0.0052 | 稳定(过于粗糙) |
重要提醒:分箱数量过少会掩盖局部漂移,分箱数量过多则可能放大随机波动。建议在模型上线前固定分箱策略,并在监控周期内保持一致,以确保 PSI 的可比性。