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 个分箱中,实际样本占比(如监控期占比)。
标准计算步骤:
- 分箱:将评分范围划分为 k 个连续的区间(箱体)。
- 计算预期占比:统计训练集中落入每个箱体的样本数,除以总样本数,得到 Expected_i。
- 计算实际占比:统计监控期中落入每个箱体的样本数,除以总样本数,得到 Actual_i。
- 计算每个箱体的贡献:对每个箱体计算 (Actual_i - Expected_i) * ln(Actual_i / Expected_i)。
- 求和:将所有箱体的贡献值相加,得到最终的PSI值。
2.2 三种主流分箱方法对比
在实际风控建模中,常用的分箱方法包括等频分箱、等距分箱和自定义分箱。下表从原理、适用场景和对PSI结果的影响三个维度进行对比。
| 分箱方法 | 原理 | 适用场景 | 对PSI结果的影响 |
|---|---|---|---|
| 等频分箱 | 每个箱体包含大致相同数量的样本(如每箱10%的样本)。 | 评分分布不均匀时,确保每个箱体都有足够的样本量,避免空箱或样本过少。 | 对分布形状变化敏感。当评分分布整体平移时,等频分箱的边界会随之移动,可能导致PSI低估漂移。 |
| 等距分箱 | 将评分范围划分为等宽的区间(如每20分一个箱)。 | 评分分布均匀或需要固定评分刻度进行解释时。 | 对评分尺度变化敏感。当评分分布整体平移时,等距分箱的边界固定,能更直接地反映分布偏移,PSI值通常更高。 |
| 自定义分箱 | 根据业务经验或模型特性手动设定箱体边界(如按风险等级划分)。 | 业务规则明确,需要与风险策略对齐时(如按“优质/标准/次级”划分)。 | 结果高度依赖业务判断。如果边界设定合理,能精准捕捉业务关注的漂移;如果边界设定不当,可能掩盖或放大漂移。 |
2.3 分箱方法对PSI结果的影响机制
为了直观展示不同分箱方法对PSI结果的影响,下面通过一个简化的示例进行说明。假设训练集评分范围为0-100,监控期评分整体向右偏移了10分。
等频分箱下的PSI计算:
- 训练集等频分箱边界:基于训练集百分位数确定,例如边界为[30, 45, 55, 65, 70]。
- 监控期样本落入这些固定边界时,由于分布右移,原本在低分箱的样本减少,高分箱的样本增加。
- PSI值会反映这种变化,但由于边界是根据训练集动态确定的,对整体平移的敏感度相对较低。
等距分箱下的PSI计算:
- 等距分箱边界固定为[0-20, 20-40, 40-60, 60-80, 80-100]。
- 训练集样本主要集中在20-60分区间;监控期样本主要集中在40-80分区间。
- 这种固定边界会直接捕捉到分布的整体右移,导致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敏感度的影响。
2.7 分箱数量对PSI结果的影响
除了分箱方法,分箱数量(即箱体个数)也会显著影响PSI结果。分箱数量过多或过少都会带来问题。
| 分箱数量 | 优点 | 缺点 | 对PSI的影响 |
|---|---|---|---|
| 过少(如3-5箱) | 计算简单,每个箱体样本量大,统计稳定。 | 可能掩盖局部漂移,对细微变化不敏感。 | PSI值偏低,容易漏报。 |
| 适中(如10-20箱) | 平衡了敏感性和稳定性,是行业推荐做法。 | 需要确保每个箱体有足够样本(建议至少30个)。 | PSI值适中,能有效反映分布变化。 |
| 过多(如30箱以上) | 对局部变化非常敏感。 | 容易产生空箱或样本过少,导致PSI计算不稳定,产生噪声。 | PSI值偏高,容易误报。 |
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
2.10 本章小结
分箱方法是PSI计算的核心环节,直接影响模型漂移监控的准确性。等频分箱对分布形状变化敏感但对整体平移不敏感,适合稳定期监控;等距分箱对评分尺度变化敏感,适合上线初期监控;自定义分箱则适合与业务风险分层对齐的场景。在实际应用中,建议根据模型所处的生命周期阶段和业务需求,灵活选择分箱方法,并定期验证分箱效果,确保PSI告警阈值能够有效反映模型稳定性变化。