DropHighPSIFeatures#

class feature_engine.selection.DropHighPSIFeatures(split_col=None, split_frac=0.5, split_distinct=False, cut_off=None, switch=False, threshold=0.25, bins=10, strategy='equal_frequency', min_pct_empty_bins=0.0001, missing_values='raise', variables=None, confirm_variables=False, p_value=0.001)[源代码][源代码]#

DropHighPSIFeatures() 会删除人口稳定性指数 (PSI) 高于给定阈值的特征。

PSI 用于比较分布。PSI 值越高意味着特征分布的变化越大。因此,PSI 值高的特征可以被认为是稳定性较差的。

为了计算PSI,DropHighPSIFeatures() 将数据集分为两部分:基础集和测试集。然后,它比较这些集合中每个特征的分布。

为了确定PSI,连续特征被排序到离散区间中,然后,比较两个分布在每个区间的观察数量。

PSI 的计算公式为:

PSI = sum ( (test_i - basis_i) x ln(test_i/basis_i) )

其中 basistest 是两个数据集,i 指的是每个区间,然后,test_ibasis_i 分别是每个数据集中区间 i 的观测数量。

PSI 传统上用于评估连续变量分布的变化。

在1.7版本中,我们扩展了 DropHighPSIFeatures() 的功能,使其也能计算分类特征的PSI。在这种情况下,i 是每个唯一的类别,而 test_ibasis_i 是类别 i 中的观察数量。

阈值

可以根据PSI值使用不同的阈值来评估分布偏移的程度。最常用的阈值是:

  • 低于10%时,该变量未经历显著变化。

  • 超过25%,该变量经历了重大变化。

  • 在这两个值之间,变化是中等的。

数据分割

为了计算PSI,DropHighPSIFeatures() 将数据集分为两部分:基础集和测试集。然后,它比较这些集合中每个特征的分布。

有多种选项可以拆分数据集:

首先,您可以指定哪个变量应用于指导数据分割。此变量可以是任何数据类型。如果您不输入变量名称,DropHighPSIFeatures() 将使用数据框索引。

接下来,您需要指定如何使用该变量(或索引)来分割数据。您可以指定每个数据集中包含的观察值比例,或者提供一个截止值。

如果你通过 split_frac 参数指定一个比例,数据将被排序以适应这个比例。如果 split_frac 是 0.5,50% 的观测值将分别进入基础集或测试集。如果 split_frac 是 0.6,60% 的样本将进入基础数据集,剩下的 40% 进入测试集。

如果 split_distinct 为 True,数据将根据所选变量中的唯一值进行排序。请查看下面的参数以获取更多详情。

如果你使用 cut_off 参数定义了一个数值截止值或一个特定日期,那么值 <= 截止值的观察结果将进入基础数据集,其余的将进入测试集。如果用于指导分割的变量是分类的,则其值按字母顺序排序并相应地进行分割。

如果你在 cut-off 中传递一个值列表,那么列表中的值对应的观察结果将进入基础集,其余的则进入测试集。

更多详情请参阅 用户指南

参数
split_col: 字符串或整数, 默认=None.

用于将数据集分割为基础集和测试集的变量。如果为 None,将使用数据框索引。split_col 可以是数值型、类别型或日期时间型变量。如果 split_col 是类别型变量,并且分割标准由 split_frac 给出,则假定该变量的标签按字母顺序排序。

split_frac: float, default=0.5.

每个基础和测试数据框中观测值的比例。如果 split_frac 是 0.6,60% 的观测值将被放入基础数据集中。

如果 split_distinct 为 True,则可能无法精确达到指定的比例。有关更多详细信息,请参阅参数 split_distinct

如果 cut_off 不是 None,split_frac 将被忽略,数据将根据 cut_off 值进行分割。

split_distinct: boolean, 默认=False.

如果为 True,split_frac 将应用于 split_col 中唯一值的向量,而不是应用于整个值向量。例如,如果 split_col 中的值为 [1, 1, 1, 1, 2, 2, 3, 4],且 split_frac 为 0.5,则结果如下:

  • split_distinct=False 将向量分成两个大小相等的部分:

    [1, 1, 1, 1] 和 [2, 2, 3, 4]。这涉及使用两个各有4个观测值的数据框进行PSI计算。

  • split_distinct=True 计算 split_col 中的唯一值向量

    ([1, 2, 3, 4]) 并将该向量分成两个相等的部分:[1, 2] 和 [3, 4]。用于计算PSI的两个数据框中的观察次数分别为6([1, 1, 1, 1, 2, 2])和2([3, 4])。

cut_off: int, float, date 或 list, default=None

基于 split_col 变量分割数据集的阈值。如果是整数、浮点数或日期,split_col 值 <= 阈值的观测值将进入基础数据集,其余的进入测试集。如果 cut_off 是一个列表,split_col 值在列表中的观测值将进入基础数据集,其余的观测值进入测试集。如果 cut_off 不是 None,此参数将用于分割数据,split_frac 将被忽略。

switch: boolean, default=False.

如果为 True,用于确定 PSI(基础和测试)的两个数据框的顺序将被切换。这一点很重要,因为 PSI 不是对称的,即 PSI(a, b) != PSI(b, a)。

threshold: float, str, default = 0.25.

丢弃特征的阈值。如果一个特征的PSI >= 阈值,该特征将被丢弃。最常见的阈值是0.25(大偏移)和0.10(中等偏移)。如果设置为’auto’,阈值将根据基数据集和测试数据集的大小以及分箱数量计算为:

threshold = χ2(q, B−1) × (1/N + 1/M)

哪里:

  • q = 分布的分位数(或 1 - p值),

  • B = 箱子/类别的数量,

  • N = 基础数据集的大小,

  • M = 测试数据集的大小。

参见参考文献 [1] 中的公式 (5.2)。

bins: int, default = 10

箱数或区间数。对于值分布良好的连续特征,通常使用10个箱。对于基数较低或分布高度偏斜的特征,可能需要较低的值。

strategy: string, default=’equal_frequency’

如果特征应离散化的区间大小相等或观测数量相等。取值为“equal_width”表示等间距的区间,或“equal_frequency”表示基于分位数的区间,即观测数量相似的区间。

min_pct_empty_bins: float, 默认值 = 0.0001

添加到空箱或区间的值。如果在将变量值排序到箱中后,某个箱是空的,则无法确定PSI。通过向空箱添加一个小的数值,我们可以避免这个问题。注意,如果添加的值太大,可能会干扰PSI的计算。

missing_values: str, default=’raise’

是否在包含缺失值的数据框上执行PSI特征选择。取值为’raise’或’ignore’。如果为’ignore’,在确定该特征的PSI时将删除缺失值。如果为’raise’,转换器将引发错误,并且不会选择特征。

p_value: float, 默认值 = 0.001

用于检验零假设的p值,即不存在特征漂移。在这种情况下,PSI值近似于一个服从卡方分布的随机变量。详见[1]。仅当`threshold`设置为’auto’时使用此参数。

变量: int, str, list, 默认 = None

要评估的变量列表。如果为 None,转换器将评估数据集中所有数值变量。如果为 "all",转换器将评估数据集中所有类别和数值变量。或者,转换器将评估列表或字符串中指示的变量。

confirm_variables: bool, default=False

如果设置为 True,输入数据框中不存在的变量将从变量列表中移除。仅在向参数 variables 传递变量列表时使用。更多详情请参见参数 variables。

属性
features_to_drop_:

列出将被移除的功能。

变量_

将考虑用于特征选择过程的变量。

psi_values_:

包含每个特征的PSI值的字典。

cut_off_

用于将数据框分割为基础和测试的值。当未作为参数给出时,此值会被计算。

feature_names_in_:

列出在 fit 过程中看到的特征名称。

n_features_in_:

在拟合过程中使用的训练集中的特征数量。

参考文献

1

Yurdakul B. “人口稳定性指数的统计特性”。西密歇根大学,2018年。https://scholarworks.wmich.edu/dissertations/3208/

示例

>>> import pandas as pd
>>> from feature_engine.selection import DropHighPSIFeatures
>>> X = pd.DataFrame(dict(
>>>         x1 = [1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
>>>         x2 = [32,87,6,32,11,44,8,7,9,0,32,87,6,32,11,44,8,7,9,0],
>>>         ))
>>> psi = DropHighPSIFeatures()
>>> psi.fit_transform(X)
    x2
0   32
1   87
2    6
3   32
4   11
5   44
6    8
7    7
8    9
9    0
10  32

方法

拟合:

查找具有高PSI值的特征。

fit_transform:

拟合数据,然后进行转换。

get_feature_names_out:

获取转换后的输出特征名称。

get_params:

获取此估计器的参数。

设置参数:

设置此估计器的参数。

获取支持:

获取所选特征的掩码或整数索引。

变换:

移除具有高 PSI 值的功能。

fit(X, y=None)[源代码][源代码]#

查找具有高PSI值的特征。

参数
Xpandas 数据框,形状为 = [样本数, 特征数]

训练数据集。

ypandas 系列。默认 = 无

在这个转换器中不需要 y。你可以传递 y 或 None。

fit_transform(X, y=None, **fit_params)[源代码]#

拟合数据,然后进行转换。

使用可选参数 fit_params 将转换器拟合到 Xy,并返回 X 的转换版本。

参数
X类似数组的形状 (n_samples, n_features)

输入样本。

y形状为 (n_samples,) 或 (n_samples, n_outputs) 的类数组,默认=None

目标值(无监督变换为None)。

**拟合参数dict

附加的拟合参数。

返回
X_newndarray 数组,形状为 (n_samples, n_features_new)

转换后的数组。

get_feature_names_out(input_features=None)[源代码]#

获取转换后的输出特征名称。换句话说,返回转换后的数据框的变量名称。

参数
input_features数组或列表,默认=None

此参数仅为了与 Scikit-learn 管道兼容而存在。

  • 如果 None,则使用 feature_names_in_ 作为特征名称。

  • 如果是一个数组或列表,那么 input_features 必须与 feature_names_in_ 匹配。

返回
feature_names_out: 列表

转换后的特征名称。

rtype

List[Union[str, int]] ..

get_metadata_routing()[源代码]#

获取此对象的元数据路由。

请查看 用户指南 以了解路由机制的工作原理。

返回
路由MetadataRequest

一个封装了路由信息的 MetadataRequest

get_params(deep=True)[源代码]#

获取此估计器的参数。

参数
深度bool, 默认=True

如果为真,将返回此估计器及其包含的作为估计器的子对象的参数。

返回
参数dict

参数名称映射到它们的值。

get_support(indices=False)[源代码]#

获取所选特征的掩码或整数索引。

参数
索引bool, 默认=False

如果为真,返回值将是一个整数数组,而不是布尔掩码。

返回
支持数组

一个从特征向量中选择保留特征的索引。如果 indices 为 False,这是一个形状为 [# 输入特征] 的布尔数组,其中元素为 True 表示其对应的特征被选择保留。如果 indices 为 True,这是一个形状为 [# 输出特征] 的整数数组,其值为输入特征向量中的索引。

set_params(**params)[源代码]#

设置此估计器的参数。

该方法适用于简单的估计器以及嵌套对象(如 Pipeline)。后者的参数形式为 <component>__<parameter>,因此可以更新嵌套对象的每个组件。

参数
**参数dict

估计器参数。

返回
self估计器实例

估计器实例。

transform(X)[源代码]#

返回包含所选特征的数据框。

参数
X: 形状为 [n_samples, n_features] 的 pandas 数据框。

输入的数据框。

返回
X_new: 形状为 [n_samples, n_selected_features] 的 pandas dataframe

包含所选特征的 Pandas 数据框。

rtype

DataFrame ..