PSI(Population Stability Index)是一种用于评估两个数据集或时间点之间的分布变化的指标。它常用于监测模型在不同时间段或不同群体上的稳定性。PSI的计算基于两个分布的累积分布函数(CDF)之间的差异。
在模型监测和评估的背景下,通常将 PSI 用于检测模型在不同时间点或群体上的预测稳定性,尤其是在评估模型在生产环境中的性能变化时。
PSI的计算步骤如下:
- 分箱(Binning): 将数据按照预测概率或分数等进行分箱。分箱的目的是为了计算每个箱中的观测数和观测比例。
- 计算累积分布函数(CDF): 对于每个数据集或时间点,计算每个箱的累积分布函数,得到累积分布百分比。
- 计算PSI: 对于每个箱,计算两个时间点或群体之间的CDF差异,然后将这些差异进行累加,得到总的PSI。
其中:
N 是分箱的数量。P1i 是时间点或群体1中第i个箱的累积分布比例。P0i 是时间点或群体0中第i个箱的累积分布比例。
PSI的值越大,表示两个时间点或群体之间的分布变化越大,模型在不同时间点或群体上的预测稳定性越差。通常,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)
上述代码中,
请注意,PSI 的计算方法可能因具体业务场景而异,上述示例代码仅提供了一种通用的计算方法。在实际应用中,你可能需要根据具体情况进行调整。