4、PSI分箱策略与分箱方法:等距分箱、等频分箱、最优分箱(决策树分箱)在PSI计算中的应用与选择
PSI(群体稳定性指标)的计算高度依赖评分卡分数的离散化处理,即“分箱”。分箱策略直接决定了PSI的敏感度与稳定性。不合理的分箱可能导致PSI掩盖真实漂移,或对微小波动过度告警。本章系统讲解三种主流分箱方法——等距分箱、等频分箱、最优分箱(决策树分箱)的原理、实现步骤及在PSI场景下的选型策略。
核心原则:PSI分箱并非追求模型预测精度,而是追求“分布对比的稳定性”。分箱边界一旦确定,应在观察期(OOT)与当前期之间保持固定,不可随新数据动态变化。
4.1 分箱在PSI计算中的角色
PSI的计算公式为:
PSI = Σ (实际占比_i - 预期占比_i) * ln(实际占比_i / 预期占比_i)
其中“占比”是基于分箱后的样本计数计算。分箱决定了:
- 粒度:箱数越多,PSI对局部漂移越敏感,但噪声也越大。
- 边界:边界位置影响每个箱的样本量,进而影响占比的稳定性。
- 可比性:两期数据必须使用完全相同的分箱边界。
| 分箱属性 | 对PSI的影响 |
|---|---|
| 箱数过少(如2-3箱) | 掩盖局部漂移,PSI值偏低,漏报风险高 |
| 箱数过多(如20+箱) | 部分箱样本稀疏,占比波动大,PSI虚高,误报频繁 |
| 边界不合理 | 样本分布不均,少数箱主导PSI,失去整体代表性 |
推荐实践:评分卡PSI监控通常采用10箱(deciles),在敏感度与稳定性之间取得平衡。若评分卡分数范围较窄(如300-700分),可适当减少至5-6箱。
4.2 等距分箱(Equal Width Binning)
等距分箱将分数范围划分为宽度相等的区间。例如,评分卡分数范围300-900分,若分10箱,则每箱宽度为60分:300-360, 360-420, …, 840-900。
4.2.1 实现步骤
- 确定分数最小值 \( min \) 与最大值 \( max \)。
- 设定箱数 \( k \),计算箱宽 \( w = (max - min) / k \)。
- 生成边界序列:\( min, min+w, min+2w, …, max \)。
- 将预期期与当前期数据按同一边界分箱,计算各箱占比。
4.2.2 优缺点
| 优点 | 缺点 |
|---|---|
| 实现简单,边界直观可解释 | 无法适应数据分布,高分/低分箱可能样本极少 |
| 边界固定,跨期对比一致性好 | 样本稀疏箱的占比波动大,PSI易受噪声干扰 |
| 适合分数分布均匀的场景 | 对尾部漂移不敏感,可能漏掉极端客户群变化 |
避坑提示:当评分卡分数分布严重偏态(如大量客户集中在600-700分)时,等距分箱会导致中间箱样本过密、两端箱样本过少。此时PSI会被中间箱的微小波动主导,而两端箱的实质性漂移被稀释。
4.3 等频分箱(Equal Frequency Binning)
等频分箱(又称分位数分箱)使每个箱包含大致相同数量的样本。例如,分10箱时,每箱包含约10%的样本。
4.3.1 实现步骤
- 基于预期期(建模样本或OOT样本)的分数排序。
- 按分位数确定边界:第10%、20%、…、90%分位数。
- 将边界固定,应用于当前期数据。
- 计算两期各箱占比(注意:当前期各箱样本数可能不再相等)。
4.3.2 优缺点
| 优点 | 缺点 |
|---|---|
| 各箱样本量均衡,占比统计稳定 | 边界依赖预期期分布,若分布变化大,边界可能不合理 |
| 对整体漂移敏感,能反映分布形态变化 | 边界不直观,解释性弱于等距分箱 |
| PSI计算受稀疏箱影响小 | 若当前期分布偏移严重,部分箱可能样本极少 |
行业实践:等频分箱是信贷评分卡PSI监控的默认选择。多数银行与消费金融公司采用10等频分箱(deciles),因其在统计稳健性与漂移敏感度之间表现均衡。
4.4 最优分箱(决策树分箱)
最优分箱利用决策树算法(如CART)自动寻找使目标变量(如好坏客户标签)区分度最大的分割点。在PSI场景中,最优分箱的目标是“使两期分布差异最大化”,即找到最能暴露漂移的分割点。
4.4.1 实现步骤
- 构造训练数据:将预期期与当前期数据合并,新增标签列(0=预期期,1=当前期)。
- 训练决策树(深度受限,如max_depth=3-4),以分数为特征,以“期别”为预测目标。
- 提取决策树的分割点作为分箱边界。
- 将边界应用于两期数据,计算PSI。
4.4.2 优缺点
| 优点 | 缺点 |
|---|---|
| 自动识别漂移最显著的分割点 | 计算复杂度高,需两期数据同时参与 |
| 对局部漂移敏感,能捕捉特定分数段的突变 | 边界可能过拟合当前期噪声,泛化性差 |
| 分箱边界具有统计依据,非人为预设 | 解释性差,业务方难以理解边界含义 |
使用限制:决策树分箱仅适用于“已知两期数据”的回顾性分析,不适合实时监控场景。若用于监控,需定期(如每月)重新训练决策树,但边界变化会导致PSI不可比。
4.5 三种分箱方法对比与选型
| 维度 | 等距分箱 | 等频分箱 | 最优分箱(决策树) |
|---|---|---|---|
| 边界确定依据 | 分数范围等分 | 预期期分位数 | 两期分布差异最大化 |
| 箱内样本均衡性 | 差(两端稀疏) | 好(预期期均衡) | 中等(取决于分割点) |
| 对整体漂移敏感度 | 中等 | 高 | 高 |
| 对局部漂移敏感度 | 低 | 中等 | 高 |
| 解释性 | 高 | 中等 | 低 |
| 计算复杂度 | 低 | 低 | 高 |
| 适用场景 | 分数均匀分布、业务要求边界整数 | 常规PSI监控(推荐) | 漂移归因分析、回顾性诊断 |
选型建议:
- 日常监控:优先使用等频分箱(10箱),兼顾稳健性与敏感度。
- 监管报送或业务沟通:使用等距分箱,边界直观易解释。
- 漂移归因与深度分析:使用决策树分箱,定位具体漂移区间。
4.6 分箱方法选择流程图
4.7 代码示例:三种分箱方法实现
以下Python代码演示了三种分箱方法在PSI计算中的应用。假设已有预期期分数 score_base 与当前期分数 score_current。
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# 示例数据
np.random.seed(42)
score_base = np.random.normal(600, 100, 10000)
score_current = np.random.normal(620, 110, 10000)
# ---------- 等距分箱 ----------
def equal_width_binning(score_base, score_current, n_bins=10):
min_val = min(score_base.min(), score_current.min())
max_val = max(score_base.max(), score_current.max())
bins = np.linspace(min_val, max_val, n_bins + 1)
base_binned = np.digitize(score_base, bins)
current_binned = np.digitize(score_current, bins)
return base_binned, current_binned, bins
# ---------- 等频分箱 ----------
def equal_freq_binning(score_base, score_current, n_bins=10):
percentiles = np.linspace(0, 100, n_bins + 1)[1:-1]
bins = np.percentile(score_base, percentiles)
bins = np.concatenate(([score_base.min() - 1], bins, [score_base.max() + 1]))
base_binned = np.digitize(score_base, bins)
current_binned = np.digitize(score_current, bins)
return base_binned, current_binned, bins
# ---------- 决策树分箱 ----------
def tree_binning(score_base, score_current, max_depth=3):
X = np.concatenate([score_base, score_current]).reshape(-1, 1)
y = np.concatenate([np.zeros(len(score_base)), np.ones(len(score_current))])
clf = DecisionTreeClassifier(max_depth=max_depth, min_samples_leaf=0.05)
clf.fit(X, y)
thresholds = clf.tree_.threshold[clf.tree_.feature != -2]
thresholds = np.sort(thresholds[thresholds != -2])
bins = np.concatenate(([X.min() - 1], thresholds, [X.max() + 1]))
base_binned = np.digitize(score_base, bins)
current_binned = np.digitize(score_current, bins)
return base_binned, current_binned, bins
# ---------- PSI计算函数 ----------
def calculate_psi(base_binned, current_binned, n_bins):
base_counts = np.bincount(base_binned, minlength=n_bins+1)[1:n_bins+1]
current_counts = np.bincount(current_binned, minlength=n_bins+1)[1:n_bins+1]
base_pct = base_counts / base_counts.sum()
current_pct = current_counts / current_counts.sum()
# 避免除零
base_pct = np.clip(base_pct, 0.001, 0.999)
current_pct = np.clip(current_pct, 0.001, 0.999)
psi = np.sum((current_pct - base_pct) * np.log(current_pct / base_pct))
return psi
# 计算三种分箱的PSI
n_bins = 10
base_bin_eqw, curr_bin_eqw, _ = equal_width_binning(score_base, score_current, n_bins)
base_bin_eqf, curr_bin_eqf, _ = equal_freq_binning(score_base, score_current, n_bins)
base_bin_tree, curr_bin_tree, _ = tree_binning(score_base, score_current, max_depth=3)
psi_eqw = calculate_psi(base_bin_eqw, curr_bin_eqw, n_bins)
psi_eqf = calculate_psi(base_bin_eqf, curr_bin_eqf, n_bins)
psi_tree = calculate_psi(base_bin_tree, curr_bin_tree, n_bins)
print(f"等距分箱 PSI: {psi_eqw:.4f}")
print(f"等频分箱 PSI: {psi_eqf:.4f}")
print(f"决策树分箱 PSI: {psi_tree:.4f}")
输出解读:在本示例中,等频分箱PSI通常介于等距与决策树之间。决策树分箱因聚焦于分布差异最大的分割点,PSI值往往最高,但也最易受噪声影响。实际应用中,建议同时计算三种分箱的PSI,观察趋势一致性,避免单一方法误判。
4.8 分箱边界固定性验证
无论采用哪种分箱方法,边界固定是PSI计算的前提。以下验证方法可确保边界一致性:
- 边界存储:将分箱边界以JSON或数据库表形式持久化,每次计算PSI时读取同一边界。
- 边界漂移检测:若当前期分数超出历史边界范围,需记录“越界样本”占比,作为额外告警信号。
- 定期重分箱:每季度或半年重新评估分箱边界,但新旧边界切换时需并行计算PSI,确保趋势连续。
| 边界类型 | 固定方式 | 更新频率 |
|---|---|---|
| 等距边界 | 基于分数范围固定 | 仅当评分卡版本更新时 |
| 等频边界 | 基于预期期分位数固定 | 每季度或半年 |
| 决策树边界 | 基于两期数据训练固定 | 每次归因分析时重新训练 |
常见错误:部分实践者每次计算PSI时重新分箱,导致边界随当前期数据变化。这会使PSI失去“固定参照系”的意义,无法区分“分布漂移”与“分箱变化”。务必使用固定边界。
4.9 本章小结
- PSI分箱的核心是“固定边界下的分布对比”,分箱方法的选择直接影响监控效果。
- 等距分箱适合业务解释与监管报送,等频分箱是日常监控的稳健选择,决策树分箱专用于漂移归因分析。
- 箱数建议5-10箱,在敏感度与稳定性之间取得平衡。
- 分箱边界一旦确定,应持久化存储,避免随新数据动态变化。
- 实际应用中,可并行计算多种分箱方法的PSI,综合判断漂移信号。