K箱离散化器#

class sklearn.preprocessing.KBinsDiscretizer(n_bins=5, *, encode='onehot', strategy='quantile', dtype=None, subsample=200000, random_state=None)[source]#

将连续数据划分为区间。

更多信息请参见 用户指南

版本 0.20 中新增。

参数:
n_binsint 或 array-like,shape (n_features,),默认为 5

要生成的箱数。如果 n_bins < 2,则引发 ValueError。

encode{'onehot', 'onehot-dense', 'ordinal'},默认为 'onehot'

用于编码转换结果的方法。

  • ‘onehot’:使用独热编码对转换结果进行编码并返回稀疏矩阵。被忽略的特征始终堆叠在右侧。

  • ‘onehot-dense’:使用独热编码对转换后的结果进行编码,并返回一个稠密数组。被忽略的特征始终堆叠在右侧。

  • ‘ordinal’:返回编码为整数值的箱标识符。

strategy{‘uniform’, ‘quantile’, ‘kmeans’}, default=’quantile’

用于定义箱宽度的策略。

  • ‘uniform’:每个特征中的所有箱具有相同的宽度。

  • ‘quantile’:每个特征中的所有箱具有相同数量的点。

  • ‘kmeans’:每个箱中的值具有相同的 1D k 均值聚类的最近中心。

有关不同策略的示例,请参见:KBinsDiscretizer的不同策略演示

dtype{np.float32, np.float64}, default=None

所需的输出数据类型。如果为 None,则输出 dtype 与输入 dtype 保持一致。仅支持 np.float32 和 np.float64。

0.24 版本中新增。

subsampleint 或 None,默认值为 200_000

用于拟合模型的最大样本数,用于提高计算效率。subsample=None 表示在计算确定分箱阈值的百分位数时使用所有训练样本。由于百分位数计算依赖于对 X 的每一列进行排序,并且排序具有 n log(n) 的时间复杂度,因此建议在具有大量样本的数据集上使用子采样。

1.3 版本中的更改:strategy="quantile" 时,subsample 的默认值从 None 更改为 200_000

1.5 版本中的更改:strategy="uniform"strategy="kmeans" 时,subsample 的默认值从 None 更改为 200_000

random_stateint、RandomState 实例或 None,默认为 None

确定子采样的随机数生成。传递一个整数以在多次函数调用中获得可重复的结果。有关更多详细信息,请参见 subsample 参数。参见 词汇表

1.1 版本中新增。

属性:
bin_edges_形状为 (n_features,) 的 ndarray 数组

每个箱的边缘。包含形状 (n_bins_, ) 各不相同的数组。被忽略的特征将具有空数组。

n_bins_形状为 (n_features,),dtype=np.int64 的 ndarray

每个特征的箱数。宽度太小的箱(即 <= 1e-8)将发出警告并被移除。

n_features_in_int

拟合期间看到的特征数。

0.24 版本中新增。

feature_names_in_形状为 (n_features_in_,) 的 ndarray

拟合期间看到的特征名称。仅当 X 具有全是字符串的特征名称时才定义。

1.0 版本中新增。

另请参阅

二值化器

用于基于参数 threshold 将值分箱为 01 的类。

备注

有关在不同数据集上进行离散化的可视化,请参考 特征离散化。关于离散化对线性模型的影响,请参见:使用 KBinsDiscretizer 对连续特征进行离散化

在特征 i 的箱边缘中,第一个和最后一个值仅用于 inverse_transform。在转换期间,箱边缘将扩展到

np.concatenate([-np.inf, bin_edges_[i][1:-1], np.inf])

如果只想预处理部分特征,可以将 KBinsDiscretizerColumnTransformer 结合使用。

KBinsDiscretizer 可能会产生常数特征(例如,当 encode = 'onehot' 并且某些箱不包含任何数据时)。可以使用特征选择算法(例如,VarianceThreshold)去除这些特征。

示例

>>> from sklearn.preprocessing import KBinsDiscretizer
>>> X = [[-2, 1, -4,   -1],
...      [-1, 2, -3, -0.5],
...      [ 0, 3, -2,  0.5],
...      [ 1, 4, -1,    2]]
>>> est = KBinsDiscretizer(
...     n_bins=3, encode='ordinal', strategy='uniform'
... )
>>> est.fit(X)
KBinsDiscretizer(...)
>>> Xt = est.transform(X)
>>> Xt  
array([[ 0., 0., 0., 0.],
       [ 1., 1., 1., 0.],
       [ 2., 2., 2., 1.],
       [ 2., 2., 2., 2.]])

有时可能需要将数据转换回原始特征空间。 inverse_transform 函数将分箱后的数据转换为原始特征空间。每个值将等于两个箱边缘的平均值。

>>> est.bin_edges_[0]
array([-2., -1.,  0.,  1.])
>>> est.inverse_transform(Xt)
array([[-1.5,  1.5, -3.5, -0.5],
       [-0.5,  2.5, -2.5, -0.5],
       [ 0.5,  3.5, -1.5,  0.5],
       [ 0.5,  3.5, -1.5,  1.5]])
fit(X, y=None, sample_weight=None)[source]#

拟合估计器。

参数:
X形状为 (n_samples, n_features) 的类数组

要离散化的数据。

yNone

忽略。此参数仅为了与 Pipeline 保持兼容性而存在。

sample_weight形状为 (n_samples,) 的 ndarray

包含要与每个样本关联的权重值。当 strategy 设置为 "uniform" 时,不能使用。

1.3 版本中新增。

返回:
self对象

返回实例本身。

fit_transform(X, y=None, **fit_params)[source]#

拟合数据,然后转换它。

将转换器拟合到Xy,使用可选参数fit_params,并返回X的转换版本。

参数:
X形状为 (n_samples, n_features) 的类数组

输入样本。

y形状为 (n_samples,) 或 (n_samples, n_outputs) 的类数组,默认为 None

目标值(对于无监督转换则为 None)。

**fit_paramsdict

附加拟合参数。

返回:
X_new形状为 (n_samples, n_features_new) 的ndarray 数组

转换后的数组。

get_feature_names_out(input_features=None)[source]#

获取输出特征名称。

参数:
input_featuresstr 类数组或 None,默认为 None

输入特征。

  • 如果input_featuresNone,则使用feature_names_in_作为输入特征名称。如果feature_names_in_未定义,则生成以下输入特征名称:["x0", "x1", ..., "x(n_features_in_ - 1)"]

  • 如果input_features是类数组,则如果feature_names_in_已定义,input_features必须与feature_names_in_匹配。

返回:
feature_names_outstr 对象的ndarray

转换后的特征名称。

get_metadata_routing()[source]#

获取此对象的元数据路由。

请查看用户指南,了解路由机制的工作原理。

返回:
routingMetadataRequest

一个MetadataRequest,封装了路由信息。

get_params(deep=True)[source]#

获取此估计器的参数。

参数:
deepbool,默认为 True

如果为 True,则将返回此估计器和作为估计器的包含子对象的参数。

返回:
paramsdict

参数名称与其值的映射。

inverse_transform(X=None, *, Xt=None)[source]#

将离散化数据转换回原始特征空间。

请注意,由于离散化舍入,此函数不会重新生成原始数据。

参数:
X形状为 (n_samples, n_features) 的类数组

分箱空间中的转换数据。

Xt形状为 (n_samples, n_features) 的类数组

分箱空间中的转换数据。

自版本 1.5 起已弃用: Xt 在 1.5 中已弃用,将在 1.7 中移除。请改用 X

返回:
Xinvndarray,dtype={np.float32, np.float64}

原始特征空间中的数据。

set_fit_request(*, sample_weight: bool | None | str = '$UNCHANGED$') KBinsDiscretizer[source]#

请求传递到fit方法的元数据。

请注意,只有当enable_metadata_routing=True时(参见sklearn.set_config),此方法才相关。请参阅用户指南,了解路由机制的工作原理。

每个参数的选项为

  • True:请求元数据,如果提供则传递给fit。如果未提供元数据,则忽略请求。

  • False:不请求元数据,元估计器不会将其传递给fit

  • None:不请求元数据,如果用户提供元数据,元估计器将引发错误。

  • str:元数据应使用此给定的别名而不是原始名称传递给元估计器。

默认值(sklearn.utils.metadata_routing.UNCHANGED)保留现有的请求。这允许您更改某些参数的请求而不对其他参数进行更改。

1.3 版本中新增。

注意

仅当将此估计器用作元估计器的子估计器时(例如,在Pipeline中使用)此方法才相关。否则,它无效。

参数:
sample_weightstr、True、False 或 None,默认为 sklearn.utils.metadata_routing.UNCHANGED

fitsample_weight参数的元数据路由。

返回:
self对象

更新后的对象。

set_output(*, transform=None)[source]#

设置输出容器。

参见 set_output API 介绍,了解如何使用该 API 的示例。

参数:
transform{“default”, “pandas”, “polars”}, default=None

配置transformfit_transform 的输出。

  • "default": 变换器的默认输出格式

  • "pandas": DataFrame 输出

  • "polars": Polars 输出

  • None: 变换配置不变

版本 1.4 中新增: "polars" 选项已添加。

返回:
self估计器实例

估计器实例。

set_params(**params)[source]#

设置此估计器的参数。

此方法适用于简单的估计器以及嵌套对象(例如 Pipeline)。后者具有 <component>__<parameter> 形式的参数,因此可以更新嵌套对象的每个组件。

参数:
**params字典

估计器参数。

返回:
self估计器实例

估计器实例。

transform(X)[source]#

离散化数据。

参数:
X形状为 (n_samples, n_features) 的类数组

要离散化的数据。

返回:
Xt{ndarray, 稀疏矩阵}, dtype={np.float32, np.float64}

分箱空间中的数据。如果 self.encode='onehot',则为稀疏矩阵;否则为 ndarray。