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) )
其中
basis
和test
是两个数据集,i
指的是每个区间,然后,test_i
和basis_i
分别是每个数据集中区间 i 的观测数量。PSI 传统上用于评估连续变量分布的变化。
在1.7版本中,我们扩展了 DropHighPSIFeatures() 的功能,使其也能计算分类特征的PSI。在这种情况下,
i
是每个唯一的类别,而test_i
和basis_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
将转换器拟合到X
和y
,并返回X
的转换版本。- 参数
- X类似数组的形状 (n_samples, n_features)
输入样本。
- y形状为 (n_samples,) 或 (n_samples, n_outputs) 的类数组,默认=None
目标值(无监督变换为None)。
- **拟合参数dict
附加的拟合参数。
- 返回
- X_newndarray 数组,形状为 (n_samples, n_features_new)
转换后的数组。
- get_metadata_routing()[源代码]#
获取此对象的元数据路由。
请查看 用户指南 以了解路由机制的工作原理。
- 返回
- 路由MetadataRequest
一个封装了路由信息的
MetadataRequest
。
- get_params(deep=True)[源代码]#
获取此估计器的参数。
- 参数
- 深度bool, 默认=True
如果为真,将返回此估计器及其包含的作为估计器的子对象的参数。
- 返回
- 参数dict
参数名称映射到它们的值。
- get_support(indices=False)[源代码]#
获取所选特征的掩码或整数索引。
- 参数
- 索引bool, 默认=False
如果为真,返回值将是一个整数数组,而不是布尔掩码。
- 返回
- 支持数组
一个从特征向量中选择保留特征的索引。如果
indices
为 False,这是一个形状为 [# 输入特征] 的布尔数组,其中元素为 True 表示其对应的特征被选择保留。如果indices
为 True,这是一个形状为 [# 输出特征] 的整数数组,其值为输入特征向量中的索引。