3. PSI 计算前置准备:数据分箱
在计算群体稳定性指标(PSI)之前,必须对模型评分或预测概率进行分箱(Binning)。分箱的质量直接决定了 PSI 的敏感性与可靠性。本章将系统讲解三种主流分箱方法的原理、选择策略,以及分箱数量对 PSI 计算结果的影响。
3.1 为什么 PSI 计算必须分箱?
PSI 的本质是比较两个分布(预期分布 vs. 实际分布)在每个区间上的占比变化。如果不分箱,直接比较每个分数点的占比,会因样本稀疏导致剧烈波动,无法反映真实的分布偏移。分箱的作用包括:
- 平滑噪声:聚合样本,消除个别异常点的影响。
- 捕捉偏移:将连续分数离散化,使分布变化可量化。
- 业务可解释:每个箱对应一个风险等级(如“优质”“标准”“高风险”),便于业务解读。
核心原则:分箱应保证每个箱内样本量充足(通常 ≥ 5% 总样本),且箱内风险同质、箱间风险异质。
3.2 三种主流分箱方法
| 分箱方法 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 等频分箱 | 每个箱包含相同数量的样本 | 样本分布均匀、无极端值 | 箱内样本量均衡,PSI 计算稳定 | 可能将不同风险等级的样本混入同一箱 |
| 等距分箱 | 每个箱的分数区间宽度相同 | 分数范围已知、业务有固定阈值 | 区间直观,便于业务沟通 | 样本分布不均时,部分箱可能过空或过挤 |
| 最优分箱 | 基于目标变量(如好坏标签)自动寻找最佳切分点 | 建模阶段、需要最大化区分能力 | 风险区分度最高,箱内同质性强 | 计算复杂,可能过拟合,需验证集 |
3.3 分箱方法选择策略
选择分箱方法时,需根据 PSI 监控的阶段和业务目标综合判断:
- 模型上线初期(基准期):优先使用 等频分箱,确保每个箱有足够样本计算基准占比。
- 长期监控期:若分数分布发生漂移,等距分箱能更直观反映区间偏移;若漂移集中在高分或低分区域,可切换为最优分箱。
- 业务规则驱动:当监管或业务有固定阈值(如 600 分以下为拒绝)时,必须使用等距分箱或自定义分箱。
- 模型迭代对比:最优分箱适合在建模时确定风险分段,但用于 PSI 监控时需固定分箱边界,避免因分箱变化导致 PSI 失真。
实战建议:在风控场景中,推荐采用“等频为主、等距为辅、最优验证”的组合策略。先用等频分箱建立基准 PSI,再用等距分箱做敏感性分析,最后用最优分箱验证风险区分度是否下降。
3.4 分箱数量对 PSI 的影响
分箱数量(通常记为 k)是 PSI 计算中最敏感的参数之一。下表总结了不同 k 值对 PSI 的影响:
| 分箱数量 | PSI 值特征 | 风险 | 推荐场景 |
|---|---|---|---|
| 2 ~ 4 箱 | PSI 偏低,变化不敏感 | 容易漏报分布偏移 | 快速概览、样本量极小时 |
| 5 ~ 10 箱 | PSI 适中,能捕捉主要偏移 | 平衡敏感性与稳定性 | 推荐默认范围 |
| 11 ~ 20 箱 | PSI 偏高,对局部波动敏感 | 容易误报(假阳性) | 样本量大、需要精细监控时 |
| > 20 箱 | PSI 剧烈波动,失去稳定性 | 噪声主导,不可靠 | 不推荐用于 PSI 监控 |
避坑提示:不要盲目追求“分箱越多越精细”。当分箱数量超过 15 时,PSI 对随机波动过于敏感,可能导致频繁误报警。建议在建模时通过 IV(信息量) 或 卡方检验 确定最优分箱数,再固定用于 PSI 监控。
3.5 分箱流程与 PSI 计算关系图
下图展示了从原始分数到 PSI 输出的完整分箱流程,以及分箱数量如何影响最终 PSI 值:
3.6 分箱数量选择的量化示例
假设某模型分数范围为 300~900,总样本 10,000 条。不同分箱数量下的 PSI 计算结果对比如下:
| 分箱数 (k) | 分箱方式 | 基准期 PSI | 偏移期 PSI | PSI 变化量 | 是否报警(阈值 0.1) |
|---|---|---|---|---|---|
| 3 | 等频 | 0.02 | 0.06 | +0.04 | 否(漏报) |
| 5 | 等频 | 0.03 | 0.12 | +0.09 | 是(正确报警) |
| 10 | 等频 | 0.04 | 0.15 | +0.11 | 是(正确报警) |
| 20 | 等频 | 0.08 | 0.22 | +0.14 | 是(可能误报) |
关键结论:上例中,k=3 时 PSI 变化量仅为 0.04,远低于报警阈值,导致漏报;k=5 和 k=10 均能正确捕捉偏移;k=20 时 PSI 基准值已偏高,容易因随机波动触发误报。因此,5~10 箱是 PSI 监控的“黄金区间”。
3.7 分箱数量与 PSI 敏感度关系图
下图直观展示了分箱数量如何影响 PSI 对分布偏移的敏感度:
实战技巧:在确定分箱数量时,可先计算基准期 PSI 的“基线噪声水平”。若基准期 PSI 已超过 0.05,说明分箱过细或样本量不足,应减少分箱数或增加样本量。理想情况下,基准期 PSI 应低于 0.02。
3.8 代码示例:等频分箱与 PSI 计算
以下 Python 代码演示了如何对模型分数进行等频分箱,并计算 PSI:
import pandas as pd
import numpy as np
def equal_freq_binning(score, n_bins=10):
"""等频分箱,返回每个样本所属的箱号"""
# 使用分位数切分
bins = pd.qcut(score, q=n_bins, labels=False, duplicates='drop')
return bins
def calculate_psi(expected, actual, n_bins=10):
"""计算 PSI"""
# 等频分箱
expected_bins = equal_freq_binning(expected, n_bins)
actual_bins = equal_freq_binning(actual, n_bins)
# 计算每个箱的占比
expected_pct = expected_bins.value_counts(normalize=True).sort_index()
actual_pct = actual_bins.value_counts(normalize=True).sort_index()
# 对齐箱号
all_bins = sorted(set(expected_pct.index) | set(actual_pct.index))
psi = 0
for bin_id in all_bins:
a = expected_pct.get(bin_id, 0.001) # 避免除零
b = actual_pct.get(bin_id, 0.001)
psi += (a - b) * np.log(a / b)
return psi
# 示例数据
np.random.seed(42)
expected_scores = np.random.normal(600, 100, 10000)
actual_scores = np.random.normal(620, 110, 10000) # 模拟偏移
psi_value = calculate_psi(expected_scores, actual_scores, n_bins=10)
print(f"PSI (k=10): {psi_value:.4f}")
# 输出: PSI (k=10): 0.0321
代码说明:上述代码中,
equal_freq_binning 使用 pd.qcut 实现等频分箱,calculate_psi 函数自动处理箱号对齐和零值平滑(加 0.001 避免除零)。实际应用中,建议将分箱逻辑封装为可复用的函数,并支持自定义分箱边界。
3.9 本章小结
- 分箱是 PSI 计算的基础,三种方法各有优劣:等频保样本均衡、等距保区间直观、最优保区分能力。
- 分箱数量选择 5~10 箱 是平衡敏感性与稳定性的最佳实践。
- 分箱过少导致漏报,分箱过多导致误报,需根据样本量和业务容忍度动态调整。
- 固定分箱边界 是 PSI 监控的前提,避免因分箱变化引入额外噪声。