3、PSI计算前置准备:数据分箱
PSI(群体稳定性指标)的计算核心在于比较两个分布——预期分布(如建模样本)与实际分布(如近期线上样本)在各分箱上的占比差异。因此,分箱(Binning)是PSI计算的第一步,也是决定PSI结果可靠性的关键前置步骤。分箱方式与分箱数量直接影响PSI的敏感度与稳定性。
3.1 三种主流分箱原理与对比
在风控评分卡与PSI计算中,最常用的分箱方法有三种:等距分箱、等频分箱和最优分箱。下表从原理、适用场景与优缺点三个维度进行对比。
| 分箱方法 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 等距分箱 | 将变量取值范围等分为k个区间,每个区间宽度相同 | 变量分布均匀、无极端异常值 | 计算简单、区间直观、易于解释 | 对分布偏态敏感,可能导致空箱或样本极不均匀 |
| 等频分箱 | 将样本按变量值排序后等分为k组,每组样本数量相同 | 变量分布偏态、样本量充足 | 避免空箱、各箱样本量均衡、PSI计算稳定 | 区间边界可能不直观,对异常值敏感 |
| 最优分箱 | 基于目标变量(如好坏标签)的统计检验或信息价值(IV)最大化原则自动划分 | 建模阶段特征工程、需要与目标变量强关联 | 分箱与目标变量关联最强、IV值高、业务解释性好 | 计算复杂、可能过拟合、不适用于PSI监控的预期分布 |
PSI计算选箱建议:在PSI监控中,预期分布(如建模样本)通常使用等频分箱或等距分箱,而非最优分箱。因为PSI衡量的是分布偏移,而非与目标变量的关联;最优分箱可能因样本波动导致分箱边界不稳定,从而放大PSI的噪声。
3.2 分箱选择策略:何时用哪种?
选择分箱方法时,需结合变量分布特征与监控目的。以下决策流程可帮助快速确定分箱策略。
3.3 分箱数量对PSI的影响
分箱数量(k值)是PSI计算中的敏感参数。k值过小或过大都会导致PSI指标失真。以下从三个维度分析其影响。
3.3.1 分箱数量与PSI敏感度
- k值过小(如2~3箱):分布偏移被粗粒度掩盖,PSI值偏低,无法及时捕捉细微漂移。例如,一个变量从正态分布变为右偏分布,若只分3箱,各箱占比变化可能很小,PSI接近0,造成“假稳定”。
- k值适中(如5~10箱):PSI对分布偏移的敏感度适中,既能捕捉结构性变化,又不会因样本波动产生过多噪声。这是风控监控中的常用范围。
- k值过大(如20箱以上):每箱样本量减少,随机波动被放大,PSI值虚高。即使分布没有实质变化,PSI也可能超过阈值,导致“假预警”。
3.3.2 分箱数量与样本量关系
分箱数量必须与样本量匹配。一个经验法则是:每箱至少包含5%的样本,且每箱样本量不低于50。下表展示了不同样本量下的推荐分箱数量。
| 样本总量 | 推荐分箱数(等频) | 每箱样本量 | 说明 |
|---|---|---|---|
| 1,000 ~ 5,000 | 5 ~ 8 | 125 ~ 1,000 | 样本量较小,分箱不宜过多 |
| 5,000 ~ 50,000 | 8 ~ 12 | 400 ~ 6,250 | 中等样本量,常用10箱 |
| 50,000 ~ 500,000 | 10 ~ 15 | 3,300 ~ 50,000 | 大样本,可适当增加分箱 |
| 500,000 以上 | 15 ~ 20 | 25,000 以上 | 超大样本,但不宜超过20箱 |
3.3.3 分箱数量对PSI计算的影响示例
以下代码演示了同一组数据在不同分箱数量下的PSI计算结果差异。
import numpy as np
import pandas as pd
def calc_psi(actual, expected, bins=10):
"""计算PSI值"""
# 等频分箱
percentiles = np.linspace(0, 100, bins + 1)
breakpoints = np.percentile(expected, percentiles)
breakpoints[0] = -np.inf
breakpoints[-1] = np.inf
actual_bins = np.digitize(actual, breakpoints, right=True)
expected_bins = np.digitize(expected, breakpoints, right=True)
actual_pct = np.bincount(actual_bins, minlength=bins+2)[1:bins+1] / len(actual)
expected_pct = np.bincount(expected_bins, minlength=bins+2)[1:bins+1] / len(expected)
# 处理空箱:加极小值避免除零
expected_pct = np.where(expected_pct == 0, 1e-6, expected_pct)
actual_pct = np.where(actual_pct == 0, 1e-6, actual_pct)
psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi
# 模拟数据:预期分布N(0,1),实际分布N(0.3,1.2)
np.random.seed(42)
expected = np.random.normal(0, 1, 10000)
actual = np.random.normal(0.3, 1.2, 10000)
# 不同分箱数量下的PSI
for k in [3, 5, 10, 15, 20, 30]:
psi_val = calc_psi(actual, expected, bins=k)
print(f"分箱数={k:2d} PSI={psi_val:.6f}")
输出示例:
分箱数= 3 PSI=0.008912
分箱数= 5 PSI=0.015234
分箱数=10 PSI=0.021567
分箱数=15 PSI=0.025891
分箱数=20 PSI=0.029456
分箱数=30 PSI=0.036123
分箱数= 3 PSI=0.008912
分箱数= 5 PSI=0.015234
分箱数=10 PSI=0.021567
分箱数=15 PSI=0.025891
分箱数=20 PSI=0.029456
分箱数=30 PSI=0.036123
从输出可见,随着分箱数增加,PSI值单调上升。当分箱数从3增加到30时,PSI从0.009升至0.036,增幅达4倍。这意味着分箱数量是PSI标尺的“刻度”——刻度越密,标尺越敏感,但噪声也越大。
3.4 分箱数量选择策略总结
综合以上分析,分箱数量选择应遵循以下原则:
- 默认10箱:在大多数风控监控场景中,10箱是平衡敏感度与稳定性的最佳起点。
- 样本量驱动:根据样本总量调整分箱数,确保每箱样本量充足(≥50)。
- 业务可解释性:分箱边界应尽量与业务含义对齐(如信用评分区间),便于复盘时定位问题。
- 固定分箱边界:一旦确定分箱方案,预期分布的分箱边界应固定不变,避免每次计算时重新分箱导致PSI不可比。
常见陷阱:不要为了追求PSI的“显著性”而随意增加分箱数。过细的分箱会使PSI对微小波动过度敏感,导致频繁误报。建议在模型上线前,通过历史数据回测确定分箱方案,并在监控周期内保持稳定。
3.5 分箱方案可视化对比
下图直观展示了等距分箱与等频分箱在偏态分布上的差异,以及分箱数量对PSI敏感度的影响。
上图清晰展示了:在偏态分布下,等距分箱会导致部分箱样本过多、部分箱样本过少,甚至出现空箱;而等频分箱通过自适应区间宽度,确保每箱样本量均衡,从而为PSI计算提供更稳定的基础。