1、PSI概念及计算公式
PSI(Population Stability Index)是一种用于衡量两个分布之间差异的指标,常用于评估模型在不同时间段或不同群体上的稳定性。
PSI的计算公式如下:
PSI = ∑((P_i - Q_i) * ln(P_i / Q_i))
其中,P_i和Q_i分别表示两个分布中第i个区间的占比。
PSI值的计算步骤如下:
-
将数据集分为两个时间段或两个群体,分别计算每个时间段或群体中每个区间的占比。
-
对于每个区间,计算P_i和Q_i的值,分别表示两个时间段或群体中该区间的占比。
-
计算(P_i - Q_i) * ln(P_i / Q_i)的值,并将所有区间的结果求和,得到PSI值。
PSI值的范围通常在0到正无穷之间,值越大表示两个分布之间的差异越大,稳定性越低。
2、定义PSI函数
import pandas as pd
import numpy as np
def filter_high_psi_features(train_data, test_data,psi_threshold):
# 计算每个特征的PSI值
psi, psi_values = calculate_psi(train_data, test_data)
# 找到PSI值超过阈值的特征
high_psi_features = psi_values[psi> psi_threshold].index
# 过滤掉PSI值过大的特征
filtered_train_data = train_data.drop(columns=high_psi_features)
return filtered_train_data
def calculate_psi(train_data, test_data, num_bins=10):
"""
计算PSI值
参数:
train_data:训练集数据,numpy数组或列表
test_data:测试集数据,numpy数组或列表
num_bins:分箱数,默认为10
返回:
psi:PSI值
psi_values:每个分箱的PSI值列表
"""
# 将数据分成num_bins个分箱
train_bins = np.histogram(train_data, bins=num_bins)[1]
test_bins = np.histogram(test_data, bins=num_bins)[1]
# 计算训练集和测试集中每个分箱的占比
train_counts = np.histogram(train_data, bins=train_bins)[0]
test_counts = np.histogram(test_data, bins=test_bins)[0]
train_ratio = train_counts / len(train_data)
test_ratio = test_counts / len(test_data)
# 计算每个分箱的PSI值
psi_values = (test_ratio - train_ratio) * np.log(test_ratio / train_ratio)
# 计算总的PSI值
psi = np.sum(psi_values)
return psi, psi_values
每个特征分箱数需要根据特征来决定。
3、使用案例
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 创建一个示例数据集
X, y = make_classification(n_samples=1000, n_features=10, random_state=42)
data = pd.DataFrame(X, columns=[f"feature_{i}" for i in range(10)])
data["target"] = y
# 将数据集划分为训练集和测试集
train_data, test_data, train_target, test_target = train_test_split(data.drop("target", axis=1), data["target"], test_size=0.2, random_state=42)
# 过滤掉PSI值过大的特征
filtered_train_data = filter_high_psi_features(train_data, test_data, psi_threshold=0.2)
# 输出过滤后的特征
print(filtered_train_data.columns)