4. PSI计算前置准备:数据分箱(等距分箱、等频分箱、最优分箱)的原理与选择策略

在计算群体稳定性指标(PSI)之前,必须对模型预测分数进行分箱(Binning)处理。分箱的质量直接决定PSI的敏感性与可靠性。不合理的分箱可能导致PSI掩盖真实分布漂移,或对微小波动过度反应。本节系统讲解三种主流分箱方法的原理、实现与选择策略。

4.1 为什么PSI计算必须依赖分箱?

PSI的本质是衡量两个分布(预期分布 vs. 实际分布)在各区间上的比例变化。原始分数是连续变量,直接计算每个分数点的概率密度差异既不现实也无统计意义。分箱将连续分数离散化为有限个区间,使得每个区间内的样本占比成为可比较的统计量。

核心逻辑: PSI = Σ (实际占比 - 预期占比) × ln(实际占比 / 预期占比)。
若不分箱,则无法定义“区间占比”,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计算场景下选择分箱方法的决策逻辑:

PSI分箱方法选择决策流程 开始:确定PSI分箱 监控期是否有好坏标签? (或标签定义是否与建模期一致) 否 是 使用等频分箱 (默认推荐) 考虑最优分箱 (需验证边界稳定性) 检查每箱样本量 是否 ≥ 50? 验证分箱边界 在时间轴上是否稳定? 条件满足? 是 → 使用该分箱方案 否 → 调整箱数或改用等频

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分箱的标准操作流程

  1. 确定基准分布(预期分布): 使用建模样本或验证样本的分数,采用等频分箱(k=10)确定初始边界。
  2. 固定分箱边界: 将基准分布的分箱边界保存为固定值,后续所有监控期的PSI计算均使用同一组边界。
  3. 检查边界稳定性: 若监控期某箱样本占比低于5%或样本量小于50,考虑合并相邻箱或增加基准样本量。
  4. 记录分箱方案: 在模型监控文档中明确记录分箱方法、箱数、边界值,确保可复现。
最终结论: 在信用评分模型PSI计算中,等频分箱(k=10)是经过行业验证的默认标准方案。它兼顾了统计稳定性、实现简便性和跨时间可比性。最优分箱仅在建模阶段用于特征工程,不推荐直接用于PSI监控。