3. PSI 计算的分箱策略:等距分箱、等频分箱、分位数分箱的优缺点对比,以及精算评分卡场景下的推荐分箱方式
在精算模型监控中,PSI(Population Stability Index)的计算高度依赖分箱策略。不同的分箱方式会直接影响 PSI 值的敏感度与稳定性,进而影响告警阈值的有效性。本节将系统对比三种主流分箱策略,并给出精算评分卡场景下的推荐方案。
3.1 三种分箱策略的核心原理
| 分箱策略 | 定义 | 分箱依据 | 典型应用场景 |
|---|---|---|---|
| 等距分箱 | 将变量取值范围划分为宽度相等的区间 | 数值区间长度固定 | 变量分布均匀、无极端值场景 |
| 等频分箱 | 使每个分箱包含大致相等的样本数量 | 样本频次均等 | 样本分布不均、需保证每箱统计稳定性 |
| 分位数分箱 | 基于数据的分位数点进行切分 | 数据分布的分位点 | 评分卡分数分布监控、尾部风险关注 |
3.2 优缺点深度对比
| 对比维度 | 等距分箱 | 等频分箱 | 分位数分箱 |
|---|---|---|---|
| 计算复杂度 | 低,直接按区间长度划分 | 中,需排序并累计频次 | 中高,需计算分位点 |
| 对极端值敏感度 | 高,极端值易导致空箱或单箱占比过高 | 低,极端值会被分散到各箱 | 低,分位点天然抗极端值 |
| 分布变化捕捉能力 | 弱,分布偏移可能被区间宽度掩盖 | 中,频次变化可反映分布漂移 | 强,分位点变化直接反映分布形态改变 |
| PSI 稳定性 | 不稳定,空箱或零占比易导致 PSI 计算异常 | 较稳定,每箱均有样本保障 | 稳定,分位点自适应数据分布 |
| 业务可解释性 | 高,区间边界直观 | 低,边界值无业务含义 | 中,分位点可对应评分等级 |
精算实务提示: 等距分箱在评分卡场景中极易出现“空箱”问题——当模型分数分布发生偏移时,部分区间可能无样本落入,导致 PSI 公式中分母为 0 或占比为 0,引发计算异常。因此,精算评分卡监控中应优先避免使用纯等距分箱。
3.3 精算评分卡场景下的推荐分箱方式
精算评分卡输出的分数通常具有明确的业务含义(如 300-850 分),且分数分布往往呈现偏态或双峰特征。基于上述对比,推荐采用 分位数分箱 作为 PSI 计算的主策略,并辅以以下优化规则:
- 分箱数量固定为 10 箱:以十分位点为切分点,每箱代表 10% 的样本量,保证统计稳定性。
- 边界对齐评分卡等级:将分位点与业务定义的“优/良/中/差”等级边界对齐,增强可解释性。
- 尾部箱合并处理:当首尾分箱样本占比低于 5% 时,与相邻箱合并,避免稀疏箱导致的 PSI 波动。
- 基准期分箱固定:以模型上线时的基准期数据确定分位点边界,后续监控期沿用同一套边界,确保 PSI 纵向可比。
最佳实践: 在精算评分卡监控中,建议将分位数分箱与等频分箱结合使用——基准期采用分位数分箱确定边界,监控期采用等频分箱验证样本量分布是否均匀。两种策略的 PSI 结果应趋势一致,若出现背离,则提示可能存在数据质量问题。
3.4 分箱策略选择流程图
3.5 三种分箱策略的 PSI 计算对比示例
以下代码展示了在 Python 中实现三种分箱策略并计算 PSI 的核心逻辑:
import numpy as np
import pandas as pd
def psi_equidistant(actual, expected, bins=10):
"""等距分箱 PSI 计算"""
min_val, max_val = min(expected.min(), actual.min()), max(expected.max(), actual.max())
bin_edges = np.linspace(min_val, max_val, bins + 1)
return _psi_from_edges(actual, expected, bin_edges)
def psi_equifrequency(actual, expected, bins=10):
"""等频分箱 PSI 计算(基于期望分布的分位点)"""
bin_edges = np.percentile(expected, np.linspace(0, 100, bins + 1))
return _psi_from_edges(actual, expected, bin_edges)
def psi_quantile(actual, expected, bins=10):
"""分位数分箱 PSI 计算(基于基准期分位点)"""
bin_edges = np.percentile(expected, np.linspace(0, 100, bins + 1))
# 分位数分箱与等频分箱边界相同,但分位数分箱强调边界固定
return _psi_from_edges(actual, expected, bin_edges)
def _psi_from_edges(actual, expected, bin_edges):
"""通用 PSI 计算函数"""
actual_bins = np.histogram(actual, bins=bin_edges)[0]
expected_bins = np.histogram(expected, bins=bin_edges)[0]
actual_pct = actual_bins / len(actual)
expected_pct = expected_bins / len(expected)
# 处理零占比:加极小值避免除零
actual_pct = np.where(actual_pct == 0, 1e-6, actual_pct)
expected_pct = np.where(expected_pct == 0, 1e-6, expected_pct)
psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi
精算实务避坑: 等距分箱在评分卡分数偏移场景下,极易出现“空箱”导致 PSI 计算异常。例如,当模型分数整体上移 50 分时,等距分箱可能使前 2 箱为空,后 2 箱占比过高,PSI 值被严重高估。而分位数分箱由于边界随分布自适应,能更真实地反映分布形态变化。
3.6 精算评分卡场景推荐总结
| 场景 | 推荐分箱策略 | 分箱数量 | 边界确定方式 | 监控期边界 |
|---|---|---|---|---|
| 评分卡主模型监控 | 分位数分箱 | 10 箱 | 基准期十分位点 | 固定不变 |
| 评分卡子模型/辅助变量 | 等频分箱 | 10-20 箱 | 基准期等频边界 | 固定不变 |
| 分布均匀的连续变量 | 等距分箱 | 10 箱 | 等距区间 | 固定不变 |
| 尾部风险关注场景 | 分位数分箱 + 尾部合并 | 8-10 箱 | 分位点 + 尾部合并规则 | 固定不变 |
精算评分卡场景下,分位数分箱 是 PSI 计算的首选策略。它既能保证每箱的统计稳定性,又能与业务等级边界对齐,同时具备对分布偏移的敏感捕捉能力。在实际落地中,建议以分位数分箱为主策略,等频分箱作为验证策略,等距分箱仅用于分布均匀的辅助变量监控。