Winsorizer#

The Winsorizer() 将变量的最大值和/或最小值限制在自动确定的值上。最小值和最大值可以通过以下三种方式之一计算:

高斯极限:

  • 右尾:均值 + 3* 标准差

  • 左尾: 均值 - 3*标准差

IQR 限制:

  • 右尾: 75%分位数 + 1.5* IQR

  • 左尾: 25%分位数 - 1.5* IQR

其中 IQR 是四分位距:75% 分位数 - 25% 分位数。

MAD 限制:

  • 右尾: 中位数 + 3.29* 绝对中位差

  • 左尾: 中位数 - 3.29* 绝对中位差

其中 MAD 是中位数绝对偏差。

百分位数或分位数:

  • 右尾: 第95百分位数

  • 左尾: 第5百分位数

示例

让我们在泰坦尼克号数据集中处理一些异常值。首先,加载数据并将其分为训练集和测试集:

from sklearn.model_selection import train_test_split
from feature_engine.datasets import load_titanic
from feature_engine.outliers import Winsorizer

X, y = load_titanic(
    return_X_y_frame=True,
    predictors_only=True,
    handle_missing=True,
)


X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0,
)

print(X_train.head())

我们在下面看到生成的数据:

      pclass     sex        age  sibsp  parch     fare    cabin embarked
501        2  female  13.000000      0      1  19.5000  Missing        S
588        2  female   4.000000      1      1  23.0000  Missing        S
402        2  female  30.000000      1      0  13.8583  Missing        C
1193       3    male  29.881135      0      0   7.7250  Missing        Q
686        3  female  22.000000      0      0   7.7250  Missing        Q

现在,我们将设置 Winsorizer() 仅在分布的右侧上限异常值(参数 tail)。我们希望最大值由变量的平均值(参数 capping_method)加上 3 倍的标准差(参数 fold)来确定。并且我们只想在 2 个变量中上限异常值,我们在列表中指定了这些变量。

capper = Winsorizer(capping_method='gaussian',
                    tail='right',
                    fold=3,
                    variables=['age', 'fare'])

capper.fit(X_train)

通过 fit()Winsorizer() 找到应该对变量进行封顶的值。这些值存储在其属性中:

capper.right_tail_caps_
{'age': 67.73951212364803, 'fare': 174.70395336846678}

我们现在可以继续并审查异常值:

# transform the data
train_t = capper.transform(X_train)
test_t = capper.transform(X_test)

如果我们现在评估转换后的数据集中变量的最大值,它们应该与属性 right_tail_caps_ 中观察到的值一致。

train_t[['fare', 'age']].max()
fare    174.703953
age      67.739512
dtype: float64

设置严格性(参数 fold#

默认情况下,Winsorizer() 会根据所选的 capping_method 自动确定参数 fold。该参数决定了标准差、四分位距(IQR)或中位数绝对偏差(MAD)的乘数,或设置在哪个百分位上限定变量。

折叠的默认值如下:

  • ‘gaussian’: fold 设置为 3.0;

  • ‘iqr’: fold 设置为 1.5;

  • ‘mad’: fold 设置为 3.29;

  • ‘percentiles’: fold 设置为 0.05。

您可以手动调整 fold 值,使异常检测过程更加或更少保守,从而自定义异常值上限的范围。

附加资源#

你可以在以下笔记本中找到更多关于 Winsorizer() 功能的详细信息:

有关此方法及其他特征工程方法的更多详情,请查看以下资源:

../../_images/feml.png

机器学习的特征工程#











或者阅读我们的书:

../../_images/cookbook.png

Python 特征工程手册#














我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。