獨熱編碼器#
- 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_categories
或min_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'
類別不存在,則transform
和inverse_transform
將會使用handle_unknown='ignore'
來處理未知類別。不常出現的類別會根據min_frequency
和max_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_frequency
或max_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_categories
或min_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
將轉換器擬合到X
和y
,並傳回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_features
為None
,則會使用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
設定
transform
和fit_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_categories
或min_frequency
設定,則這些不常見的類別會被分組到單一類別中。- 參數:
- X形狀為 (n_samples, n_features) 的類陣列
要編碼的資料。
- 傳回:
- X_out形狀為 (n_samples, n_encoded_features) 的 {ndarray, 稀疏矩陣}
轉換後的輸入。如果
sparse_output=True
,則會回傳一個稀疏矩陣。