3. PSI 计算前置准备:数据分箱

在计算群体稳定性指标(PSI)之前,必须对模型评分或预测概率进行分箱(Binning)。分箱的质量直接决定了 PSI 的敏感性与可靠性。本章将系统讲解三种主流分箱方法的原理、选择策略,以及分箱数量对 PSI 计算结果的影响。

3.1 为什么 PSI 计算必须分箱?

PSI 的本质是比较两个分布(预期分布 vs. 实际分布)在每个区间上的占比变化。如果不分箱,直接比较每个分数点的占比,会因样本稀疏导致剧烈波动,无法反映真实的分布偏移。分箱的作用包括:

  • 平滑噪声:聚合样本,消除个别异常点的影响。
  • 捕捉偏移:将连续分数离散化,使分布变化可量化。
  • 业务可解释:每个箱对应一个风险等级(如“优质”“标准”“高风险”),便于业务解读。
核心原则:分箱应保证每个箱内样本量充足(通常 ≥ 5% 总样本),且箱内风险同质、箱间风险异质。

3.2 三种主流分箱方法

分箱方法 原理 适用场景 优点 缺点
等频分箱 每个箱包含相同数量的样本 样本分布均匀、无极端值 箱内样本量均衡,PSI 计算稳定 可能将不同风险等级的样本混入同一箱
等距分箱 每个箱的分数区间宽度相同 分数范围已知、业务有固定阈值 区间直观,便于业务沟通 样本分布不均时,部分箱可能过空或过挤
最优分箱 基于目标变量(如好坏标签)自动寻找最佳切分点 建模阶段、需要最大化区分能力 风险区分度最高,箱内同质性强 计算复杂,可能过拟合,需验证集

3.3 分箱方法选择策略

选择分箱方法时,需根据 PSI 监控的阶段和业务目标综合判断:

  1. 模型上线初期(基准期):优先使用 等频分箱,确保每个箱有足够样本计算基准占比。
  2. 长期监控期:若分数分布发生漂移,等距分箱能更直观反映区间偏移;若漂移集中在高分或低分区域,可切换为最优分箱。
  3. 业务规则驱动:当监管或业务有固定阈值(如 600 分以下为拒绝)时,必须使用等距分箱或自定义分箱。
  4. 模型迭代对比:最优分箱适合在建模时确定风险分段,但用于 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 值:

分箱流程与 PSI 计算关系 原始模型分数 分箱方法选择(等频/等距/最优) 分箱数量决策(k=5~10 推荐) 计算基准占比(A_i) 计算实际占比(B_i) 输出 PSI = Σ(A_i-B_i)·ln(A_i/B_i) 分箱数量影响 • k 过小 → 漏报偏移 • k 适中 → 平衡敏感 • k 过大 → 误报噪声 • 推荐 k = 5~10

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 对分布偏移的敏感度:

分箱数量 vs. PSI 敏感度曲线 2 5 10 15 20 分箱数量 (k) 0.00 0.05 0.10 0.15 PSI 值 基准期 偏移期 阈值 0.1 k=5~10 最佳敏感区
实战技巧:在确定分箱数量时,可先计算基准期 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 监控的前提,避免因分箱变化引入额外噪声。