任意离散化器#
The ArbitraryDiscretiser() 将变量值排序到由用户任意定义的连续区间中。因此,在设置离散器时,您必须提供一个字典,其中键为变量名,值为包含区间限制的列表。
The ArbitraryDiscretiser() 仅适用于数值变量。该离散器将检查用户输入的变量是否存在于训练集中,并将其转换为数值类型。
示例#
让我们来看看这个转换器是如何工作的。首先,让我们加载一个数据集并绘制一个连续变量的直方图。我们使用 Scikit-learn 自带的加利福尼亚住房数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from feature_engine.discretisation import ArbitraryDiscretiser
X, y = fetch_california_housing( return_X_y=True, as_frame=True)
X['MedInc'].hist(bins=20)
plt.xlabel('MedInc')
plt.ylabel('Number of obs')
plt.title('Histogram of MedInc')
plt.show()
在下图中,我们看到了变量中位收入的直方图:
现在,让我们将变量离散化为任意确定的时间间隔。我们希望结果转换中的间隔为整数,因此我们将 return_boundaries 设置为 False。
user_dict = {'MedInc': [0, 2, 4, 6, np.inf]}
transformer = ArbitraryDiscretiser(
binning_dict=user_dict, return_object=False, return_boundaries=False)
X = transformer.fit_transform(X)
现在,我们可以继续绘制变换后的变量:
X['MedInc'].value_counts().plot.bar(rot=0)
plt.xlabel('MedInc - bins')
plt.ylabel('Number of observations')
plt.title('Discretised MedInc')
plt.show()
在下图中,我们可以看到每个区间的观测数量:
请注意,在上图中,区间由数字表示。
另外,我们可以通过将 return_boundaries 设置为 True 来返回离散化变量的区间界限。
X, y = fetch_california_housing( return_X_y=True, as_frame=True)
user_dict = {'MedInc': [0, 2, 4, 6, np.inf]}
transformer = ArbitraryDiscretiser(
binning_dict=user_dict, return_object=False, return_boundaries=True)
X = transformer.fit_transform(X)
X['MedInc'].value_counts().plot.bar(rot=0)
plt.xlabel('MedInc - bins')
plt.ylabel('Number of observations')
plt.title('Discretised MedInc')
plt.show()
在下图中,我们可以看到每个区间的观测数量:
离散化加编码
如果我们以整数形式返回区间值,离散器可以选择将转换后的变量作为整数或对象返回。为什么我们希望转换后的变量作为对象?
Feature-engine 中的分类编码器默认设计为处理对象类型的变量。因此,如果您希望进一步编码返回的区间,例如尝试获得变量与目标之间的单调关系,您可以通过将 return_object 设置为 True 来无缝地实现这一点。您可以在 这里 找到如何使用此功能的示例。

