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_format
为False
,编码器将自动选择类型为对象或分类的变量,或检查用户输入的变量是否为对象或分类类型。如果为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
将转换器拟合到X
和y
,并返回X
的转换版本。- 参数
- X类似数组的形状 (n_samples, n_features)
输入样本。
- y类似数组的形状 (n_samples,) 或 (n_samples, n_outputs), 默认=None
目标值(无监督变换为 None)。
- **拟合参数dict
附加的拟合参数。
- 返回
- X_newndarray 数组,形状为 (n_samples, n_features_new)
变换后的数组。
- get_metadata_routing()[源代码]#
获取此对象的元数据路由。
请查看 用户指南 以了解路由机制的工作原理。
- 返回
- 路由MetadataRequest
一个封装了路由信息的
MetadataRequest
。
- get_params(deep=True)[源代码]#
获取此估计器的参数。
- 参数
- 深度bool, 默认=True
如果为真,将返回此估计器及其包含的作为估计器的子对象的参数。
- 返回
- 参数dict
参数名称映射到它们的值。