特征工程-特征稳定性

1、PSI概念及计算公式

PSI(Population Stability Index)是一种用于衡量两个分布之间差异的指标,常用于评估模型在不同时间段或不同群体上的稳定性。

PSI的计算公式如下:

PSI = ∑((P_i - Q_i) * ln(P_i / Q_i))

其中,P_i和Q_i分别表示两个分布中第i个区间的占比。

PSI值的计算步骤如下:

  1. 将数据集分为两个时间段或两个群体,分别计算每个时间段或群体中每个区间的占比。

  2. 对于每个区间,计算P_i和Q_i的值,分别表示两个时间段或群体中该区间的占比。

  3. 计算(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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值