獨熱編碼器#

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')[原始碼]#

將類別特徵編碼為 one-hot 數值陣列。

此轉換器的輸入應該是整數或字串的類陣列,表示類別(離散)特徵所取的值。這些特徵會使用 one-hot(又稱 'one-of-K' 或 'dummy')編碼方案進行編碼。這會為每個類別建立一個二元欄位,並傳回稀疏矩陣或密集陣列(取決於 sparse_output 參數)。

預設情況下,編碼器會根據每個特徵中的唯一值來推導類別。或者,您也可以手動指定 categories

將類別資料提供給許多 scikit-learn 估計器(特別是具有標準核心的線性模型和 SVM)時,需要此編碼。

注意:y 標籤的 one-hot 編碼應改用 LabelBinarizer。

請在使用者指南中閱讀更多資訊。如需比較不同的編碼器,請參閱:比較目標編碼器與其他編碼器

參數:
categories'auto' 或 array-like 列表,預設值='auto'

每個特徵的類別(唯一值)

  • 'auto':從訓練資料自動決定類別。

  • list:categories[i] 保留第 i 個欄位中預期的類別。傳入的類別不應在單一特徵中混合字串和數值,並且在數值的情況下應進行排序。

已使用的類別可以在 categories_ 屬性中找到。

0.20 版新增。

drop{'first', 'if_binary'} 或形狀為 (n_features,) 的 array-like,預設值=None

指定一種方法來捨棄每個特徵的一個類別。這在完美共線的特徵導致問題的情況下非常有用,例如將結果資料輸入到未正規化的線性迴歸模型時。

然而,捨棄一個類別會破壞原始表示的對稱性,因此可能會在下游模型中產生偏差,例如對於懲罰性線性分類或迴歸模型。

  • None:保留所有特徵(預設值)。

  • 'first':捨棄每個特徵中的第一個類別。如果只有一個類別存在,則會完全捨棄該特徵。

  • 'if_binary':捨棄每個具有兩個類別的特徵中的第一個類別。具有 1 個或 2 個以上類別的特徵保持不變。

  • array:drop[i] 是應捨棄的特徵 X[:, i] 中的類別。

max_categoriesmin_frequency 配置為分組不常出現的類別時,將在分組後處理捨棄行為。

0.21 版新增:參數 drop 在 0.21 版中新增。

0.23 版變更:選項 drop='if_binary' 在 0.23 版中新增。

1.1 版變更:支援捨棄不常出現的類別。

sparse_outputbool,預設值=True

True 時,它會傳回 scipy.sparse.csr_matrix,即「壓縮稀疏行」(CSR)格式的稀疏矩陣。

1.2 版新增:sparse 已重新命名為 sparse_output

dtype數字類型,預設值=np.float64

輸出所需的 dtype。

handle_unknown{'error'、'ignore'、'infrequent_if_exist'、'warn'},預設值='error'

指定在 transform 期間處理未知類別的方式。

  • 'error':如果在轉換期間出現未知類別,則會引發錯誤。

  • 'ignore':當在轉換期間遇到未知類別時,此特徵產生的 one-hot 編碼欄位將全部為零。在反向轉換中,未知類別將表示為 None。

  • 'infrequent_if_exist':當在轉換期間遇到未知類別時,此特徵產生的 one-hot 編碼欄位將會對應到不常出現的類別(如果存在)。不常出現的類別將會對應到編碼中的最後一個位置。在反向轉換期間,未知類別將會對應到標示為 'infrequent' 的類別(如果存在)。如果 'infrequent' 類別不存在,則 transforminverse_transform 將會使用 handle_unknown='ignore' 來處理未知類別。不常出現的類別會根據 min_frequencymax_categories 而存在。請在使用者指南中閱讀更多資訊。

  • 'warn':當在轉換期間遇到未知類別時,會發出警告,然後會按照 handle_unknown="infrequent_if_exist" 的描述繼續進行編碼。

在 1.1 版本中變更: 新增了 'infrequent_if_exist',以自動處理未知類別和不常出現的類別。

在 1.6 版本中新增: 在 1.6 版本中新增了 "warn" 選項。

min_frequencyint 或 float,預設值為 None

指定被視為不常出現的類別的最小頻率。

  • 如果為 int,則基數較小的類別將被視為不常出現。

  • 如果為 float,則基數小於 min_frequency * n_samples 的類別將被視為不常出現。

在 1.1 版本中新增: 請參閱使用者指南以了解更多資訊。

max_categoriesint,預設值為 None

指定在考慮不常出現的類別時,每個輸入特徵的輸出特徵數量的上限。如果有不常出現的類別,max_categories 會包含代表不常出現類別的類別以及頻繁出現的類別。如果為 None,則輸出特徵的數量沒有限制。

在 1.1 版本中新增: 請參閱使用者指南以了解更多資訊。

feature_name_combiner“concat” 或 callable,預設值為 “concat”

具有簽名 def callable(input_feature, category) 並返回字串的可調用物件。這用於建立由 get_feature_names_out 返回的特徵名稱。

"concat" 會將編碼的特徵名稱和類別與 feature + "_" + str(category) 連接起來。例如,具有值 1、6、7 的特徵 X 會建立特徵名稱 X_1、 X_6、 X_7

在 1.3 版本中新增。

屬性:
categories_陣列列表

在擬合過程中確定的每個特徵的類別(按照 X 中的特徵順序排列,並與 transform 的輸出相對應)。這包括在 drop 中指定的類別(如果有的話)。

drop_idx_形狀為 (n_features,) 的陣列
  • drop_idx_[i]categories_[i] 中要針對每個特徵刪除的類別的索引。

  • 如果沒有類別要從索引為 i 的特徵中刪除,則 drop_idx_[i] = None,例如當 drop='if_binary' 且特徵不是二元的時。

  • 如果所有轉換後的特徵都將保留,則 drop_idx_ = None

如果透過將 min_frequencymax_categories 設定為非預設值來啟用不常出現的類別,且 drop_idx[i] 對應於不常出現的類別,則會刪除整個不常出現的類別。

在 0.23 版本中變更: 新增了包含 None 值的可能性。

infrequent_categories_ndarray 列表

每個特徵的不常出現類別。

n_features_in_int

fit 期間看到的特徵數量。

在 1.0 版本中新增。

feature_names_in_形狀為 (n_features_in_,) 的 ndarray

fit 期間看到的特徵名稱。只有當 X 的特徵名稱都是字串時才會定義。

在 1.0 版本中新增。

feature_name_combinercallable 或 None

具有簽名 def callable(input_feature, category) 並返回字串的可調用物件。這用於建立由 get_feature_names_out 返回的特徵名稱。

在 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) 的類陣列

用於確定每個特徵類別的資料。

yNone

已忽略。此參數僅為了與 Pipeline 相容而存在。

傳回:
self

擬合的編碼器。

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)。

**fit_params**dict

額外的擬合參數。

傳回:
X_new形狀為 (n_samples, n_features_new) 的 ndarray 陣列

轉換後的陣列。

get_feature_names_out(input_features=None)[原始碼]#

取得轉換的輸出特徵名稱。

參數:
input_features類陣列的字串或 None,預設值為 None

輸入特徵。

  • 如果 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字串物件的 ndarray

轉換後的特徵名稱。

get_metadata_routing()[原始碼]#

取得此物件的中繼資料路由。

請查看 使用者指南 以了解路由機制如何運作。

傳回:
routingMetadataRequest

一個 MetadataRequest,封裝了路由資訊。

get_params(deep=True)[原始碼]#

取得此估算器的參數。

參數:
deep布林值,預設值為 True

如果為 True,將會回傳此估算器以及所包含的子物件(亦為估算器)的參數。

傳回:
paramsdict

參數名稱對應到它們的值。

property infrequent_categories_#

每個特徵的不常出現類別。

inverse_transform(X)[原始碼]#

將資料轉換回原始表示法。

當遇到未知類別(獨熱編碼中的所有零)時,會使用 None 來表示此類別。如果具有未知類別的特徵有被捨棄的類別,則捨棄的類別將是其反向。

對於給定的輸入特徵,如果存在不頻繁的類別,則會使用 ‘infrequent_sklearn’ 來表示不頻繁的類別。

參數:
X形狀為 (n_samples, n_encoded_features) 的 {類陣列、稀疏矩陣}

轉換後的資料。

傳回:
X_tr形狀為 (n_samples, n_features) 的 ndarray

反向轉換後的陣列。

set_output(*, transform=None)[原始碼]#

設定輸出容器。

請參閱 介紹 set_output API 以取得如何使用 API 的範例。

參數:
transform{"default", "pandas", "polars"},預設值為 None

設定 transformfit_transform 的輸出。

  • "default":轉換器的預設輸出格式

  • "pandas":DataFrame 輸出

  • "polars":Polars 輸出

  • None:轉換設定保持不變

於 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形狀為 (n_samples, n_encoded_features) 的 {ndarray, 稀疏矩陣}

轉換後的輸入。如果 sparse_output=True,則會回傳一個稀疏矩陣。