4. PSI计算前置准备:数据分箱(等距分箱、等频分箱、最优分箱)的原理与选择策略
在计算群体稳定性指标(PSI)之前,必须对模型预测分数进行分箱(Binning)处理。分箱的质量直接决定PSI的敏感性与可靠性。不合理的分箱可能导致PSI掩盖真实分布漂移,或对微小波动过度反应。本节系统讲解三种主流分箱方法的原理、实现与选择策略。
4.1 为什么PSI计算必须依赖分箱?
PSI的本质是衡量两个分布(预期分布 vs. 实际分布)在各区间上的比例变化。原始分数是连续变量,直接计算每个分数点的概率密度差异既不现实也无统计意义。分箱将连续分数离散化为有限个区间,使得每个区间内的样本占比成为可比较的统计量。
核心逻辑: PSI = Σ (实际占比 - 预期占比) × ln(实际占比 / 预期占比)。
若不分箱,则无法定义“区间占比”,PSI计算无从谈起。
若不分箱,则无法定义“区间占比”,PSI计算无从谈起。
4.2 三种分箱方法原理对比
| 分箱方法 | 核心原理 | 区间宽度 | 区间样本量 | 对异常值敏感度 |
|---|---|---|---|---|
| 等距分箱 | 将分数范围等分为k个固定宽度的区间 | 固定 | 不固定(可能悬殊) | 高 |
| 等频分箱 | 使每个区间包含大致相等的样本数量 | 不固定 | 固定 | 低 |
| 最优分箱 | 基于目标变量(如好坏标签)最大化组间差异 | 不固定 | 不固定 | 中 |
4.3 等距分箱(Equal Width Binning)
将分数从最小值到最大值划分为k个等宽的区间。例如分数范围[300, 900],分5箱,则每箱宽度为(900-300)/5=120,区间为[300,420)、[420,540)、[540,660)、[660,780)、[780,900]。
适用场景: 分数分布均匀、无极端异常值、业务上对分数区间有固定解释(如每100分一个等级)时使用。
import numpy as np
import pandas as pd
def equal_width_binning(score_series, n_bins=10):
"""等距分箱:返回区间标签和边界"""
bins = np.linspace(score_series.min(), score_series.max(), n_bins + 1)
labels = [f'[{bins[i]:.0f}, {bins[i+1]:.0f})' for i in range(n_bins - 1)] + [f'[{bins[-2]:.0f}, {bins[-1]:.0f}]']
binned = pd.cut(score_series, bins=bins, labels=labels, include_lowest=True)
return binned, bins
避坑提示: 等距分箱极易出现“空箱”或“极稀疏箱”。若模型分数集中在狭窄区间,两端区间可能只有个位数样本,导致PSI计算时ln(占比)出现极端值或除零错误。
4.4 等频分箱(Equal Frequency Binning / Quantile Binning)
基于分位数将数据划分为k个区间,每个区间包含相同数量的样本。这是PSI计算中最常用的分箱方式,因为它保证了每个区间都有足够的统计稳定性。
def equal_freq_binning(score_series, n_bins=10):
"""等频分箱:基于分位数,确保每箱样本量近似相等"""
# 计算分位数边界
quantiles = np.linspace(0, 1, n_bins + 1)
bins = score_series.quantile(quantiles).values
# 处理重复边界(当大量样本分数相同时)
bins = np.unique(bins)
if len(bins) < n_bins + 1:
# 若唯一边界不足,自动降箱数
n_actual = len(bins) - 1
print(f'警告:由于分数重复,实际箱数降为 {n_actual}')
labels = [f'Q{i+1}' for i in range(len(bins)-1)]
binned = pd.cut(score_series, bins=bins, labels=labels, include_lowest=True)
return binned, bins
推荐理由: 等频分箱对分布形态不敏感,无论分数是正态、偏态还是双峰,都能保证每箱样本量均衡。在PSI监控中,这避免了因某箱样本过少而导致的统计波动。
4.5 最优分箱(Optimal Binning)
最优分箱利用目标变量(如好坏标签)来寻找使组间差异最大化的切分点。常用算法包括卡方分箱(ChiMerge)、决策树分箱、基于IV(信息价值)的分箱等。最优分箱在建模阶段用于特征离散化,但在PSI计算中需谨慎使用。
# 示例:使用决策树进行最优分箱(仅用于建模阶段)
from sklearn.tree import DecisionTreeClassifier
def optimal_binning_tree(score_series, target, max_bins=5):
"""基于决策树的最优分箱(监督式)"""
tree = DecisionTreeClassifier(max_leaf_nodes=max_bins, min_samples_leaf=0.05)
tree.fit(score_series.values.reshape(-1, 1), target)
# 提取树的分割阈值
thresholds = tree.tree_.threshold[tree.tree_.feature != -2]
thresholds = np.sort(thresholds)
bins = np.concatenate([[score_series.min()], thresholds, [score_series.max()]])
bins = np.unique(bins)
labels = [f'Bin{i+1}' for i in range(len(bins)-1)]
binned = pd.cut(score_series, bins=bins, labels=labels, include_lowest=True)
return binned, bins
PSI场景限制: 最优分箱依赖建模时的目标变量(如逾期标签)。在PSI监控阶段,实际分布可能没有标签,或标签定义已变化。此时最优分箱的边界可能不再最优,甚至产生误导。因此,PSI计算通常不推荐使用最优分箱,除非能确保分箱边界在监控期内保持稳定且可解释。
4.6 分箱选择策略:决策流程
下图展示了在PSI计算场景下选择分箱方法的决策逻辑:
4.7 分箱数量选择与PSI敏感性
箱数(k)的选择直接影响PSI的敏感度:
- 箱数过少(k < 5): 分布漂移被粗粒度区间掩盖,PSI值偏低,容易漏报风险。
- 箱数过多(k > 20): 每个区间样本量减少,随机波动被放大,PSI值偏高,容易误报。
- 推荐范围: 信用评分模型PSI计算通常取 k = 10 ~ 15,在敏感性与稳定性之间取得平衡。
经验法则: 每箱至少包含50个样本。若总样本量N较小,箱数应相应减少,可参考公式 k ≈ min(15, N/50)。
4.8 三种分箱方法在PSI场景下的综合对比
| 评估维度 | 等距分箱 | 等频分箱 | 最优分箱 |
|---|---|---|---|
| PSI推荐度 | 低 | 高(首选) | 中(有条件使用) |
| 实现复杂度 | 低 | 低 | 高 |
| 对分布漂移的敏感度 | 不均匀(稀疏箱敏感) | 均匀 | 依赖标签质量 |
| 跨时间可比性 | 好(边界固定) | 好(边界随分布变化) | 差(边界可能变化) |
| 业务可解释性 | 高(整数边界) | 中(分位数边界) | 低(统计边界) |
| 主要风险 | 空箱/稀疏箱 | 边界漂移导致区间含义变化 | 标签偏移导致分箱失效 |
4.9 实战建议:PSI分箱的标准操作流程
- 确定基准分布(预期分布): 使用建模样本或验证样本的分数,采用等频分箱(k=10)确定初始边界。
- 固定分箱边界: 将基准分布的分箱边界保存为固定值,后续所有监控期的PSI计算均使用同一组边界。
- 检查边界稳定性: 若监控期某箱样本占比低于5%或样本量小于50,考虑合并相邻箱或增加基准样本量。
- 记录分箱方案: 在模型监控文档中明确记录分箱方法、箱数、边界值,确保可复现。
最终结论: 在信用评分模型PSI计算中,等频分箱(k=10)是经过行业验证的默认标准方案。它兼顾了统计稳定性、实现简便性和跨时间可比性。最优分箱仅在建模阶段用于特征工程,不推荐直接用于PSI监控。