OneHotEncoder#

class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse_output=True, dtype=<class 'numpy.float64'>, handle_unknown='error', min_frequency=None, max_categories=None, feature_name_combiner='concat')[源代码]#

将类别功能编码为一热数字数组。

此Transformer的输入应该是一个类似数组的数组,表示类别(离散)特征所采用的值。这些特征使用独热(one-hot,也称为“one-of-K”或“dummy”)编码方案进行编码。这将为每个类别创建一个二进制列,并返回稀疏矩阵或密集数组(取决于 sparse_output 参数)。

默认情况下,编码器根据每个特征中的唯一值推导类别。或者,您还可以指定 categories 手工

需要这种编码来将分类数据提供给许多scikit-learn估计器,特别是线性模型和具有标准内核的支持者。

注意:y标签的一次性编码应该使用LabelBinarizer。

阅读更多的 User Guide .有关不同编码器的比较,请参阅: 比较目标编码器与其他编码器 .

参数:
categories“Auto”或类似数组的列表,默认=“Auto”

每个功能的类别(唯一值):

  • “自动”:根据训练数据自动确定类别。

  • 列表: categories[i] 保存第i列中预期的类别。传递的类别不应该在单个特征中混合字符串和数值,并且应该在数值的情况下进行排序。

使用的类别可以在 categories_ 属性

Added in version 0.20.

drop'第一'、' if_binary '}或类似数组的形状(n_features,), 默认值=无

指定用于删除每个要素中的一个类别的方法。这在完全共线特征导致问题的情况下很有用,例如将结果数据输入到非正规化线性回归模型中时。

然而,放弃一个类别会破坏原始表示的对称性,因此可能会在下游模型中引起偏差,例如对于惩罚线性分类或回归模型。

  • 无:保留所有功能(默认)。

  • “第一”:删除每个功能中的第一个类别。如果仅存在一个类别,则该功能将完全删除。

  • “if_binary”:删除具有两个类别的每个功能中的第一个类别。具有1个或2个以上类别的功能将保持不变。

  • 数组: drop[i] 是特征中的类别 X[:, i] 这个应该被放弃。

max_categoriesmin_frequency 配置为对不常见的类别进行分组,则在分组后处理删除行为。

Added in version 0.21: 参数 drop 是在0.21添加的。

在 0.23 版本发生变更: 的选项 drop='if_binary' 是在0.23添加的。

在 1.1 版本发生变更: 支持删除不常见的类别。

sparse_output布尔,默认=True

True ,它返回一个 scipy.sparse.csr_matrix ,即“压缩稀疏行”(CSR)格式的稀疏矩阵。

Added in version 1.2: sparse 更名为 sparse_output

dtypenumber type, default=np.float64

所需的输出类型。

handle_unknown请输入'error','error','infrequent_if_exist ','warn'}, default='error'

指定期间处理未知类别的方式 transform .

  • “错误”:如果转换期间存在未知类别,则引发错误。

  • “忽略”:当转换过程中遇到未知类别时,此功能生成的一热编码列将全为零。在逆变换中,未知类别将被表示为无。

  • 'infrequent_if_exist' : When an unknown category is encountered during transform, the resulting one-hot encoded columns for this feature will map to the infrequent category if it exists. The infrequent category will be mapped to the last position in the encoding. During inverse transform, an unknown category will be mapped to the category denoted 'infrequent' if it exists. If the 'infrequent' category does not exist, then transforminverse_transform 将处理未知类别, handle_unknown='ignore' .不常见的类别基于 min_frequencymax_categories .阅读更多的 User Guide .

  • “警告”:当在转换过程中遇到未知类别时,会发出警告,然后按照描述的方式继续编码 handle_unknown="infrequent_if_exist" .

在 1.1 版本发生变更: 'infrequent_if_exist' 自动处理未知类别和不常见类别。

Added in version 1.6: 的选项 "warn" 添加到1.6中。

min_frequencyint或float,默认=无

指定最低频率,低于该频率的类别将被视为不频繁。

  • 如果 int ,基数较小的类别将被视为不常见。

  • 如果 float ,基数小于 min_frequency * n_samples 将被认为不常见。

Added in version 1.1: 阅读更多的 User Guide .

max_categoriesint,默认=无

指定考虑不常见类别时每个输入要素的输出要素数上限。如果有不常见的类别, max_categories 包括代表不频繁类别的类别以及频繁类别。如果 None ,输出特征的数量没有限制。

Added in version 1.1: 阅读更多的 User Guide .

feature_name_combiner“concat”或可调用,默认=“concat”

可签名致电 def callable(input_feature, category) 返回字符串。这用于创建要由返回的要素名称 get_feature_names_out .

"concat" 将编码要素名称和类别与 feature + "_" + str(category) 。例如,值为1、6、7的要素X创建要素名称 X_1, X_6, X_7 .

Added in version 1.3.

属性:
categories_list of arrays

匹配过程中确定的每个要素的类别(按照X中要素的顺序并与 transform ).这包括中指定的类别 drop (if任何)。

drop_idx_形状数组(n_features,)
  • drop_idx_[i] 指数是否在 categories_[i] 每个功能要删除的类别。

  • drop_idx_[i] = None 如果不从具有索引的要素中删除任何类别 i ,例如何时 drop='if_binary' 而且该功能不是二进制的。

  • drop_idx_ = None 如果所有变换的特征将被保留。

如果通过设置启用了不常见类别 min_frequencymax_categories 变为非默认值,并且 drop_idx[i] 对应于一个不频繁类别,则整个不频繁类别被丢弃。

在 0.23 版本发生变更: 添加了包含的可能性 None 价值观

infrequent_categories_ndray列表

每个特征的不常见类别。

n_features_in_int

期间看到的功能数量 fit .

Added in version 1.0.

feature_names_in_ :nd形状数组 (n_features_in_ ,)nd数组形状(

Names of features seen during fit. Defined only when X has feature names that are all strings.

Added in version 1.0.

feature_name_combiner可调用或无

可签名致电 def callable(input_feature, category) 返回字符串。这用于创建要由返回的要素名称 get_feature_names_out .

Added in version 1.3.

参见

OrdinalEncoder

执行分类特征的序数(整数)编码。

TargetEncoder

使用目标编码分类特征。

sklearn.feature_extraction.DictVectorizer

执行字典项的独热编码(也处理字符串值特征)。

sklearn.feature_extraction.FeatureHasher

对字典项或字符串执行大约一次性编码。

LabelBinarizer

以一对所有的方式将标签二进制化。

MultiLabelBinarizer

可迭代项和多标签格式之间的转换,例如指示类标签存在的(样本x类)二进制矩阵。

示例

给定具有两个特征的数据集,我们让编码器找到每个特征的唯一值,并将数据转换为二进制单热编码。

>>> from sklearn.preprocessing import OneHotEncoder

可以丢弃在期间未看到的类别 fit :

>>> enc = OneHotEncoder(handle_unknown='ignore')
>>> X = [['Male', 1], ['Female', 3], ['Female', 2]]
>>> enc.fit(X)
OneHotEncoder(handle_unknown='ignore')
>>> enc.categories_
[array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]
>>> enc.transform([['Female', 1], ['Male', 4]]).toarray()
array([[1., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0.]])
>>> enc.inverse_transform([[0, 1, 1, 0, 0], [0, 0, 0, 1, 0]])
array([['Male', 1],
       [None, 2]], dtype=object)
>>> enc.get_feature_names_out(['gender', 'group'])
array(['gender_Female', 'gender_Male', 'group_1', 'group_2', 'group_3'], ...)

人们总是可以删除每个功能的第一列:

>>> drop_enc = OneHotEncoder(drop='first').fit(X)
>>> drop_enc.categories_
[array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]
>>> drop_enc.transform([['Female', 1], ['Male', 2]]).toarray()
array([[0., 0., 0.],
       [1., 1., 0.]])

或者删除仅具有2个类别的功能的列:

>>> drop_binary_enc = OneHotEncoder(drop='if_binary').fit(X)
>>> drop_binary_enc.transform([['Female', 1], ['Male', 2]]).toarray()
array([[0., 1., 0., 0.],
       [1., 0., 1., 0.]])

可以更改要素名称的创建方式。

>>> def custom_combiner(feature, category):
...     return str(feature) + "_" + type(category).__name__ + "_" + str(category)
>>> custom_fnames_enc = OneHotEncoder(feature_name_combiner=custom_combiner).fit(X)
>>> custom_fnames_enc.get_feature_names_out()
array(['x0_str_Female', 'x0_str_Male', 'x1_int_1', 'x1_int_2', 'x1_int_3'],
      dtype=object)

通过设置启用罕见类别 max_categoriesmin_frequency .

>>> import numpy as np
>>> X = np.array([["a"] * 5 + ["b"] * 20 + ["c"] * 10 + ["d"] * 3], dtype=object).T
>>> ohe = OneHotEncoder(max_categories=3, sparse_output=False).fit(X)
>>> ohe.infrequent_categories_
[array(['a', 'd'], dtype=object)]
>>> ohe.transform([["a"], ["b"]])
array([[0., 0., 1.],
       [1., 0., 0.]])
fit(X, y=None)[源代码]#

将OneHotEncoder调整到X。

参数:
X形状类似阵列(n_samples,n_features)

用于确定每个功能类别的数据。

y没有一

忽视此参数仅为与兼容而存在 Pipeline .

返回:
自我

安装编码器。

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

适应数据,然后对其进行转换。

适合变压器 Xy 具有可选参数 fit_params 并返回的转换版本 X .

参数:
X形状类似阵列(n_samples,n_features)

输入样本。

y形状为(n_samples,)或(n_samples,n_outputs)的阵列状, 默认值=无

目标值(无监督转换)。

**fit_paramsdict

其他适合参数。

返回:
X_newndray形状数组(n_samples,n_features_new)

变形的数组。

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

获取用于转换的输出要素名称。

参数:
input_features字符串或无的类数组,默认=无

输入功能。

  • 如果 input_featuresNone 那么 feature_names_in_ 在中用作功能名称。如果 feature_names_in_ 未定义,则生成以下输入要素名称: ["x0", "x1", ..., "x(n_features_in_ - 1)"] .

  • 如果 input_features 是一个类似阵列的,那么 input_features 必须匹配 feature_names_in_ 如果 feature_names_in_ 是定义的。

返回:
feature_names_out字符串对象的nd数组

转换的功能名称。

get_metadata_routing()[源代码]#

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

请检查 User Guide 关于路由机制如何工作。

返回:
routingMetadataRequest

A MetadataRequest 封装路由信息。

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

获取此估计器的参数。

参数:
deep布尔,默认=True

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

返回:
paramsdict

参数名称映射到其值。

inverse_transform(X)[源代码]#

将数据转换回原始表示形式。

当遇到未知类别时(一热编码中全为零), None 用于代表此类别。如果具有未知类别的要素具有已删除的类别,则已删除的类别将是其逆类别。

对于给定的输入功能,如果存在不频繁类别,则将使用“infrequent_sklearn”来表示不频繁类别。

参数:
X形状的{类数组,稀疏矩阵} (n_samples,n_encoded_features)

转换后的数据。

返回:
X_tr形状的nd数组(n_samples,n_features)

逆变换数组。

set_output(*, transform=None)[源代码]#

设置输出容器。

看到 介绍 set_output API 了解如何使用API的示例。

参数:
transform{“默认”,“pandas”,“polars”},默认=无

配置输出 transformfit_transform .

  • "default" :Transformer的默认输出格式

  • "pandas" :DataFrame输出

  • "polars" :两极输出

  • None :转换配置不变

Added in version 1.4: "polars" 添加了选项。

返回:
self估计器实例

估计实例。

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

设置此估计器的参数。

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

参数:
**paramsdict

估计参数。

返回:
self估计器实例

估计实例。

transform(X)[源代码]#

使用一热编码变换X。

如果 sparse_output=True (默认),则返回 scipy.sparse._csr.csr_matrix (CSR格式)。

如果要素有不常见的类别,请通过指定进行设置 max_categoriesmin_frequency ,将不常见的类别分组为一个类别。

参数:
X形状类似阵列(n_samples,n_features)

要编码的数据。

返回:
X_out形状的{nd数组,稀疏矩阵} (n_samples,n_encoded_features)

转换的输入。如果 sparse_output=True ,将返回稀疏矩阵。