模型的 PSI(Population Stability Index)

PSI(Population Stability Index)是一种用于评估两个数据集或时间点之间的分布变化的指标。它常用于监测模型在不同时间段或不同群体上的稳定性。PSI的计算基于两个分布的累积分布函数(CDF)之间的差异。

在模型监测和评估的背景下,通常将 PSI 用于检测模型在不同时间点或群体上的预测稳定性,尤其是在评估模型在生产环境中的性能变化时。

PSI的计算步骤如下:

  1. 分箱(Binning): 将数据按照预测概率或分数等进行分箱。分箱的目的是为了计算每个箱中的观测数和观测比例。
  2. 计算累积分布函数(CDF): 对于每个数据集或时间点,计算每个箱的累积分布函数,得到累积分布百分比。
  3. 计算PSI: 对于每个箱,计算两个时间点或群体之间的CDF差异,然后将这些差异进行累加,得到总的PSI。

在这里插入图片描述

其中:

  1. N 是分箱的数量。
  2. P1i 是时间点或群体1中第i个箱的累积分布比例。
  3. P0i 是时间点或群体0中第i个箱的累积分布比例。

PSI的值越大,表示两个时间点或群体之间的分布变化越大,模型在不同时间点或群体上的预测稳定性越差。通常,PSI的阈值可以根据具体问题的要求和业务场景来确定。

scikit-learn 中,目前并没有专门用于计算 Population Stability Index (PSI) 的内置函数。计算 PSI 通常需要自定义代码,以下是一个简单的 Python 示例代码,用于计算两个分布之间的 PSI 值:

import numpy as np
from scipy.stats import norm

def calculate_psi(expected, actual, bins=10):
    # 分箱
    expected_bins = np.histogram(expected, bins=bins)[0]
    actual_bins = np.histogram(actual, bins=bins)[0]

    # 计算累积分布函数(CDF)
    expected_cdf = np.cumsum(expected_bins) / np.sum(expected_bins)
    actual_cdf = np.cumsum(actual_bins) / np.sum(actual_bins)

    # 计算 PSI
    psi = np.sum((actual_cdf - expected_cdf) * np.log(actual_cdf / expected_cdf))

    return psi

# 示例用法
expected_distribution = np.random.normal(0, 1, 1000)
actual_distribution = np.random.normal(0.2, 1.2, 1000)

psi_value = calculate_psi(expected_distribution, actual_distribution)
print("PSI:", psi_value)

上述代码中,calculate_psi 函数接受两个分布(expected 和 actual),并计算它们之间的 PSI 值。你可以根据实际情况调整分箱数量(bins 参数),以满足你的需求。

请注意,PSI 的计算方法可能因具体业务场景而异,上述示例代码仅提供了一种通用的计算方法。在实际应用中,你可能需要根据具体情况进行调整。