2、PSI计算原理:分箱方法(等频、等距、自定义)对PSI结果的影响

群体稳定性指标(PSI)的核心计算依赖于将模型评分或预测概率划分为若干区间(即“分箱”),然后比较各区间内样本占比的变化。分箱方法的选择直接决定了PSI数值的敏感性与可靠性。不同的分箱策略会改变每个箱体的边界、样本分布以及最终的PSI得分,进而影响模型漂移告警的准确性。

2.1 PSI计算的标准流程

在深入分箱方法之前,首先回顾PSI的标准计算公式与计算步骤。PSI衡量的是预期分布(通常为建模时的训练集或验证集)与实际分布(当前监控期样本)之间的差异。

PSI计算公式:

PSI = Σ (Actual_i - Expected_i) * ln(Actual_i / Expected_i)

其中:

  • Expected_i:第 i 个分箱中,预期样本占比(如训练集占比)。
  • Actual_i:第 i 个分箱中,实际样本占比(如监控期占比)。

标准计算步骤:

  1. 分箱:将评分范围划分为 k 个连续的区间(箱体)。
  2. 计算预期占比:统计训练集中落入每个箱体的样本数,除以总样本数,得到 Expected_i。
  3. 计算实际占比:统计监控期中落入每个箱体的样本数,除以总样本数,得到 Actual_i。
  4. 计算每个箱体的贡献:对每个箱体计算 (Actual_i - Expected_i) * ln(Actual_i / Expected_i)。
  5. 求和:将所有箱体的贡献值相加,得到最终的PSI值。
关键点:分箱是PSI计算的第一步,也是影响结果最显著的一步。箱体边界一旦确定,后续的占比计算和PSI值就完全被决定了。

2.2 三种主流分箱方法对比

在实际风控建模中,常用的分箱方法包括等频分箱、等距分箱和自定义分箱。下表从原理、适用场景和对PSI结果的影响三个维度进行对比。

分箱方法 原理 适用场景 对PSI结果的影响
等频分箱 每个箱体包含大致相同数量的样本(如每箱10%的样本)。 评分分布不均匀时,确保每个箱体都有足够的样本量,避免空箱或样本过少。 对分布形状变化敏感。当评分分布整体平移时,等频分箱的边界会随之移动,可能导致PSI低估漂移。
等距分箱 将评分范围划分为等宽的区间(如每20分一个箱)。 评分分布均匀或需要固定评分刻度进行解释时。 对评分尺度变化敏感。当评分分布整体平移时,等距分箱的边界固定,能更直接地反映分布偏移,PSI值通常更高。
自定义分箱 根据业务经验或模型特性手动设定箱体边界(如按风险等级划分)。 业务规则明确,需要与风险策略对齐时(如按“优质/标准/次级”划分)。 结果高度依赖业务判断。如果边界设定合理,能精准捕捉业务关注的漂移;如果边界设定不当,可能掩盖或放大漂移。

2.3 分箱方法对PSI结果的影响机制

为了直观展示不同分箱方法对PSI结果的影响,下面通过一个简化的示例进行说明。假设训练集评分范围为0-100,监控期评分整体向右偏移了10分。

示例场景:训练集评分分布集中在30-70分,监控期评分分布集中在40-80分。我们分别使用等频分箱(5箱,每箱20%样本)和等距分箱(5箱,每箱20分)计算PSI。

等频分箱下的PSI计算:

  • 训练集等频分箱边界:基于训练集百分位数确定,例如边界为[30, 45, 55, 65, 70]。
  • 监控期样本落入这些固定边界时,由于分布右移,原本在低分箱的样本减少,高分箱的样本增加。
  • PSI值会反映这种变化,但由于边界是根据训练集动态确定的,对整体平移的敏感度相对较低。

等距分箱下的PSI计算:

  • 等距分箱边界固定为[0-20, 20-40, 40-60, 60-80, 80-100]。
  • 训练集样本主要集中在20-60分区间;监控期样本主要集中在40-80分区间。
  • 这种固定边界会直接捕捉到分布的整体右移,导致PSI值显著高于等频分箱的结果。
实践警示:在模型监控中,如果使用等频分箱且评分分布发生整体平移,PSI可能无法及时告警,导致模型漂移被低估。建议在模型上线初期使用等距分箱或自定义分箱,以更敏感地捕捉分布变化。

2.4 分箱方法选择对PSI阈值设定的影响

由于分箱方法直接影响PSI的数值大小,因此在设定PSI漂移告警阈值时,必须考虑分箱方法的选择。下表展示了不同分箱方法下,PSI阈值的一般参考范围。

分箱方法 PSI < 0.1 0.1 ≤ PSI < 0.25 PSI ≥ 0.25
等频分箱 无显著变化 轻度漂移(需关注) 中度漂移(需告警)
等距分箱 无显著变化 轻度漂移(需关注) 中度漂移(需告警)
自定义分箱 无显著变化 轻度漂移(需关注) 中度漂移(需告警)

需要注意的是,上表中的阈值仅为通用参考。在实际应用中,等距分箱的PSI值通常比等频分箱高出0.05-0.15,因此使用等距分箱时,告警阈值应适当上调(如从0.25调整为0.30),以避免频繁误报。

2.5 分箱方法选择的最佳实践

为了确保PSI能够准确反映模型稳定性,建议遵循以下最佳实践:

  • 上线初期使用等距分箱:在模型刚上线时,对分布变化最敏感,等距分箱能快速捕捉到评分尺度的偏移。
  • 稳定期使用等频分箱:当模型运行一段时间后,等频分箱能更稳健地反映分布形状的变化,减少因评分尺度微小波动导致的误报。
  • 业务对齐使用自定义分箱:当模型评分直接用于风险分层决策时,自定义分箱能确保PSI告警与业务风险变化直接挂钩。
  • 定期验证分箱效果:建议每季度或每半年重新评估分箱方法是否仍然适用,特别是在评分分布发生结构性变化时。

2.6 分箱方法对PSI影响的SVG示意图

下图展示了等频分箱与等距分箱在相同数据分布下,对PSI计算结果的影响差异。图中左侧为等频分箱,右侧为等距分箱,通过对比可以直观理解分箱边界固定与否对PSI敏感度的影响。

分箱方法对PSI结果的影响对比 等频分箱(边界动态) 训练集分布 等频边界(基于训练集百分位数) 监控期分布(右移) PSI = 0.08(低估漂移) 等距分箱(边界固定) 训练集分布 等距边界(固定评分刻度) 监控期分布(右移) PSI = 0.18(正确反映漂移) 关键结论 • 等频分箱:边界随训练集分布动态调整,对整体平移不敏感,可能低估PSI。 • 等距分箱:边界固定,能直接捕捉评分尺度的偏移,PSI值更高,告警更及时。 • 建议:上线初期用等距分箱,稳定期用等频分箱,业务对齐用自定义分箱。

2.7 分箱数量对PSI结果的影响

除了分箱方法,分箱数量(即箱体个数)也会显著影响PSI结果。分箱数量过多或过少都会带来问题。

分箱数量 优点 缺点 对PSI的影响
过少(如3-5箱) 计算简单,每个箱体样本量大,统计稳定。 可能掩盖局部漂移,对细微变化不敏感。 PSI值偏低,容易漏报。
适中(如10-20箱) 平衡了敏感性和稳定性,是行业推荐做法。 需要确保每个箱体有足够样本(建议至少30个)。 PSI值适中,能有效反映分布变化。
过多(如30箱以上) 对局部变化非常敏感。 容易产生空箱或样本过少,导致PSI计算不稳定,产生噪声。 PSI值偏高,容易误报。
推荐实践:在信用评分模型中,通常建议使用10-20个分箱。如果样本量较大(如超过10万),可以适当增加分箱数量;如果样本量较小(如低于1万),建议减少分箱数量或使用等频分箱确保每个箱体有足够样本。

2.8 分箱方法选择的决策流程

为了帮助风控团队在实际工作中快速选择合适的分箱方法,下图提供了一个决策流程。

分箱方法选择决策流程 开始选择分箱方法 是否需要与业务风险分层对齐? 是 → 自定义分箱 否 → 继续判断 模型是否处于上线初期? 是 → 等距分箱 否 → 等频分箱

2.9 代码示例:Python中实现不同分箱方法的PSI计算

以下代码展示了在Python中如何使用等频分箱和等距分箱计算PSI。实际应用中,建议将分箱逻辑封装为函数,便于复用和测试。

import numpy as np
import pandas as pd

def calculate_psi(expected, actual, bins=10, method='equal_width'):
    """
    计算PSI(群体稳定性指标)
    
    参数:
        expected: 预期样本(训练集)的评分数组
        actual: 实际样本(监控期)的评分数组
        bins: 分箱数量
        method: 分箱方法,'equal_width'(等距)或'equal_freq'(等频)
    
    返回:
        psi: PSI值
        bin_edges: 分箱边界
    """
    if method == 'equal_width':
        # 等距分箱:基于评分范围等宽划分
        bin_edges = np.linspace(min(expected.min(), actual.min()), 
                                max(expected.max(), actual.max()), bins + 1)
    elif method == 'equal_freq':
        # 等频分箱:基于预期样本的百分位数划分
        bin_edges = np.percentile(expected, np.linspace(0, 100, bins + 1))
        # 确保边界唯一
        bin_edges = np.unique(bin_edges)
    else:
        raise ValueError("method must be 'equal_width' or 'equal_freq'")
    
    # 计算每个箱体的样本占比
    expected_counts, _ = np.histogram(expected, bins=bin_edges)
    actual_counts, _ = np.histogram(actual, bins=bin_edges)
    
    expected_pct = expected_counts / len(expected)
    actual_pct = actual_counts / len(actual)
    
    # 处理零占比情况,避免除零错误
    expected_pct = np.where(expected_pct == 0, 0.0001, expected_pct)
    actual_pct = np.where(actual_pct == 0, 0.0001, actual_pct)
    
    # 计算PSI
    psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
    
    return psi, bin_edges

# 示例用法
np.random.seed(42)
train_scores = np.random.normal(600, 100, 10000)  # 训练集评分
monitor_scores = np.random.normal(620, 110, 10000)  # 监控期评分(右移)

psi_equal_width, edges_width = calculate_psi(train_scores, monitor_scores, 
                                              bins=10, method='equal_width')
psi_equal_freq, edges_freq = calculate_psi(train_scores, monitor_scores, 
                                            bins=10, method='equal_freq')

print(f"等距分箱 PSI: {psi_equal_width:.4f}")
print(f"等频分箱 PSI: {psi_equal_freq:.4f}")
# 输出示例:
# 等距分箱 PSI: 0.1523
# 等频分箱 PSI: 0.0876
代码说明:上述代码中,等距分箱的PSI值(0.1523)显著高于等频分箱(0.0876),验证了前文的理论分析。在实际监控中,如果使用等频分箱且阈值设为0.25,则可能无法触发告警;而使用等距分箱则能及时捕捉到分布偏移。

2.10 本章小结

分箱方法是PSI计算的核心环节,直接影响模型漂移监控的准确性。等频分箱对分布形状变化敏感但对整体平移不敏感,适合稳定期监控;等距分箱对评分尺度变化敏感,适合上线初期监控;自定义分箱则适合与业务风险分层对齐的场景。在实际应用中,建议根据模型所处的生命周期阶段和业务需求,灵活选择分箱方法,并定期验证分箱效果,确保PSI告警阈值能够有效反映模型稳定性变化。