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()
功能的详细信息:
Jupyter notebook 的链接
有关此方法及其他特征工程方法的更多详情,请查看以下资源:
或者阅读我们的书:
我们的书籍和课程都适合初学者和更高级的数据科学家。通过购买它们,您正在支持 Feature-engine 的主要开发者 Sole。