GeometricWidthDiscretiser#

The GeometricWidthDiscretiser() 将连续数值变量划分为宽度递增的区间。每个后续区间的宽度比前一个区间大一个常量值(cw)。

常量金额计算如下:

\[cw = (Max - Min)^{1/n}\]

其中 Max 和 Min 是变量的最大值和最小值,n 是间隔的数量。

区间本身的大小通过几何级数计算:

\[a_{i+1} = a_i cw\]

因此,第一个区间的宽度等于 cw,第二个区间的宽度等于 2 * cw,以此类推。

请注意,每个区间的观测比例可能会有所不同。

这种离散化技术在变量的分布右偏时非常有效。

注意:某些箱子的宽度可能非常小。因此,为了使这个转换器能够正常工作,增加精度值可能会有所帮助,即允许定义每个箱子的小数位数。如果变量的范围较窄或您正在分入多个箱子,请允许更高的精度(例如,如果精度 = 3,则为 0.001;如果精度 = 7,则为 0.0001)。

GeometricWidthDiscretiser() 仅适用于数值变量。可以指定要离散化的变量列表,或者离散器将自动选择训练集中所有数值变量。

示例

让我们来看一个使用房价数据集的例子(关于数据集的更多细节 请参见此处)。

让我们加载房价数据集并将其分为训练集和测试集:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

from feature_engine.discretisation import GeometricWidthDiscretiser

# Load dataset
data = pd.read_csv('houseprice.csv')

# Separate into train and test sets
X_train, X_test, y_train, y_test =  train_test_split(
            data.drop(['Id', 'SalePrice'], axis=1),
            data['SalePrice'], test_size=0.3, random_state=0)

现在,我们希望将下面指示的2个变量离散化为10个宽度递增的区间:

# set up the discretisation transformer
disc = GeometricWidthDiscretiser(bins=10, variables=['LotArea', 'GrLivArea'])

# fit the transformer
disc.fit(X_train)

通过 fit() 方法,转换器学习每个区间的边界。然后,我们可以继续将值排序到这些区间中:

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

binner_dict_ 存储了为每个变量识别的区间限制。

disc.binner_dict_
'LotArea': [-inf,
1303.412,
1311.643,
1339.727,
1435.557,
1762.542,
2878.27,
6685.32,
19675.608,
64000.633,
inf],
'GrLivArea': [-inf,
336.311,
339.34,
346.34,
362.515,
399.894,
486.27,
685.871,
1147.115,
2212.974,
inf]}

随着宽度离散化的增加,每个区间不一定包含相同数量的观测值。此转换器适用于具有右偏分布的变量。

让我们比较一下离散化前后的变量分布:

fig, ax = plt.subplots(1, 2)
X_train['LotArea'].hist(ax=ax[0], bins=10);
train_t['LotArea'].hist(ax=ax[1], bins=10);

我们可以看到,下面的区间包含不同数量的观测值。我们还可以看到,分布的形状从偏态变为更“钟形”的分布。

../../_images/increasingwidthdisc.png

离散化加编码

如果我们返回区间值为整数,离散器可以选择将转换后的变量返回为整数或对象。为什么我们希望转换后的变量为对象?

Feature-engine 中的分类编码器默认设计为处理类型为对象的变量。因此,如果您希望进一步编码返回的区间,例如尝试获得变量与目标之间的单调关系,您可以通过将 return_object 设置为 True 来无缝地实现这一点。您可以在此处找到如何使用此功能的示例 https://nbviewer.org/github/feature-engine/feature-engine-examples/blob/main/discretisation/GeometricWidthDiscretiser_plus_MeanEncoder.ipynb

附加资源#

有关如何使用此转换器的更多详细信息,请查看:

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

../../_images/feml.png

机器学习的特征工程#











或者阅读我们的书:

../../_images/cookbook.png

Python 特征工程手册#














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