OneHotEncoder#

class feature_engine.encoding.OneHotEncoder(top_categories=None, drop_last=False, drop_last_binary=False, variables=None, ignore_format=False)[源代码][源代码]#

OneHotEncoder() 通过一组二进制变量替换分类变量,每个二进制变量代表变量中的一个唯一类别。

编码器可以选择创建 k 或 k-1 个二进制变量,其中 k 是唯一类别的数量。

编码器有一个额外的选项,只为最流行的类别生成二进制变量,即数据集中大多数观测值共享的类别。这种行为可以通过参数 top_categories 来指定。

默认情况下,编码器只会对类别变量(类型为 ‘object’ 或 ‘categorical’)进行编码。你可以传递一个变量列表进行编码。或者,编码器会找到并编码所有类别变量(类型为 ‘object’ 或 ‘categorical’)。

使用 ignore_format=True 时,您可以选择将数值变量也进行编码。该过程是相同的,您可以输入要编码的变量列表,或者转换器将自动选择所有变量。

编码器首先为每个变量找到要编码的类别(拟合)。然后,编码器为每个变量的每个类别创建一个虚拟变量(转换)。

注意

数据中需要转换的新类别,即那些在训练集中未出现的类别,将被忽略(不会为它们创建二进制变量)。这意味着,具有训练集中不存在的类别的观测值,将在所有二进制变量中被编码为0。

另请注意

当我们应用 transform() 方法时,原始的分类变量会从返回的数据集中移除。取而代之的是,返回二进制变量。

更多细节请参见 用户指南

参数
top_categories: int, default=None

如果为 None,将为变量的每个唯一类别创建虚拟变量。或者,我们可以指定要编码的最频繁类别的数量。在这种情况下,只会为这些流行类别创建虚拟变量,其余的将被忽略,即它们在所有二进制变量中将显示值 0。请注意,如果 top_categories 不是 None,则忽略参数 drop_last

drop_last: boolean, 默认=False

仅在 top_categories = None 时使用。它指示是否为所有类别创建虚拟变量(k 个虚拟变量),或者如果设置为 True,它将忽略最后一个二进制变量并返回 k-1 个虚拟变量。

drop_last_binary: boolean, 默认=False

是否为二元分类变量返回1或2个虚拟变量。当一个分类变量只有2个类别时,通过独热编码创建的第二个虚拟变量可能完全冗余。将此参数设置为 True,将确保数据集中每个二元变量只创建1个虚拟变量。

变量: 列表, 默认=无

将被编码的分类变量列表。如果为 None,编码器将默认查找并转换所有类型为对象或分类的变量。你也可以让转换器接受数值变量,参见参数 ignore_format

ignore_format: bool, default=False

此转换器仅对对象类型或分类类型的变量进行操作。要覆盖此行为并允许转换器也转换数值变量,请设置为 True

如果 ignore_formatFalse,编码器将自动选择类型为对象或分类的变量,或检查用户输入的变量是否为对象或分类类型。如果为 True,编码器将选择所有变量或接受用户输入的所有变量,包括那些被转换为数值类型的变量。

简而言之,当你想要编码数值变量时,设置为 True

属性
encoder_dict_:

包含将为哪些类别创建虚拟变量的字典。

变量_

将被转换的变量组。

variables_binary_

数据中识别出的二元变量列表。即,只有两个类别的变量。

feature_names_in_:

列出在 fit 过程中看到的特征名称。

n_features_in_:

在拟合中使用的训练集中的特征数量。

注释

如果变量用于线性模型,建议编码为 k-1 或前几个类别。如果变量用于基于树的算法,建议编码为 k 或前 n 个类别。如果将进行特征选择,则也建议编码为 k 或前 n 个类别。线性模型在拟合过程中评估所有特征,而基于树的模型和许多特征选择算法分别评估变量或变量组。因此,如果编码为 k-1,则不会检查最后一个变量/类别。

参考文献

在以下文章中描述了顶级类别的热编码:

1

Niculescu-Mizil 等人。“使用集成选择赢得KDD杯Orange挑战”。JMLR: 研讨会和会议论文集 7: 23-34. KDD 2009 http://proceedings.mlr.press/v7/niculescu09/niculescu09.pdf

示例

>>> import pandas as pd
>>> from feature_engine.encoding import OneHotEncoder
>>> X = pd.DataFrame(dict(x1 = [1,2,3,4], x2 = ["a", "a", "b", "c"]))
>>> ohe = OneHotEncoder()
>>> ohe.fit(X)
>>> ohe.transform(X)
   x1  x2_a  x2_b  x2_c
0   1     1     0     0
1   2     1     0     0
2   3     0     1     0
3   4     0     0     1

方法

拟合:

学习每个变量的独特类别

fit_transform:

拟合数据,然后进行转换。

get_feature_names_out:

获取转换后的输出特征名称。

get_params:

获取此估计器的参数。

设置参数:

设置此估计器的参数。

转换:

用二进制变量替换分类变量。

fit(X, y=None)[源代码][源代码]#

学习每个变量的唯一类别。如果指定了 top_categories,它将学习最流行的类别。或者,它将学习每个变量的所有唯一类别。

参数
X: pandas 数据框,形状为 = [样本数, 特征数]

训练输入样本。可以是整个数据框,而不仅仅是选定的变量。

y: pandas 系列, 默认=None

目标。在此编码中不需要。你可以传递 y 或 None。

fit_transform(X, y=None, **fit_params)[源代码]#

拟合数据,然后进行转换。

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

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

输入样本。

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

目标值(无监督变换为 None)。

**拟合参数dict

附加的拟合参数。

返回
X_newndarray 数组,形状为 (n_samples, n_features_new)

变换后的数组。

get_feature_names_out(input_features=None)[源代码]#

获取转换后的特征名称。换句话说,返回转换后的数据框的变量名称。

参数
输入特征数组或列表,默认=None

此参数仅为了与 Scikit-learn 管道兼容而存在。

  • 如果 None,则使用 feature_names_in_ 作为特征名称。

  • 如果是一个数组或列表,那么 input_features 必须与 feature_names_in_ 匹配。

返回
feature_names_out: 列表

转换后的特征名称。

rtype

List[Union[str, int]] ..

get_metadata_routing()[源代码]#

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

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

返回
路由MetadataRequest

一个封装了路由信息的 MetadataRequest

get_params(deep=True)[源代码]#

获取此估计器的参数。

参数
深度bool, 默认=True

如果为真,将返回此估计器及其包含的作为估计器的子对象的参数。

返回
参数dict

参数名称映射到它们的值。

inverse_transform(X)[源代码][源代码]#

此转换器未实现 inverse_transform

set_params(**params)[源代码]#

设置此估计器的参数。

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

参数
**参数dict

估计器参数。

返回
self估计器实例

估计器实例。

transform(X)[源代码][源代码]#

用二进制变量替换分类变量。

参数
X: pandas 数据框,形状为 = [样本数, 特征数]

要转换的数据。

返回
X_new: pandas 数据框。

转换后的数据框。数据框的形状将与原始数据框不同,因为它包含了原始分类变量的虚拟变量。

rtype

DataFrame ..