當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python sklearn OneHotEncoder用法及代碼示例


本文簡要介紹python語言中 sklearn.preprocessing.OneHotEncoder 的用法。

用法:

class sklearn.preprocessing.OneHotEncoder(*, categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')

將分類特征編碼為 one-hot 數值數組。

該轉換器的輸入應該是類似整數或字符串的數組,表示分類(離散)特征所采用的值。這些特征使用one-hot(又名“one-of-K”或‘dummy’)編碼方案進行編碼。這將為每個類別創建一個二進製列並返回稀疏矩陣或密集數組(取決於sparse參數)

默認情況下,編碼器根據每個特征中的唯一值派生類別。或者,您也可以手動指定categories

將分類數據提供給許多 scikit-learn 估計器需要這種編碼,特別是線性模型和具有標準內核的 SVM。

注意:y 標簽的 one-hot 編碼應使用 LabelBinarizer 代替。

在用戶指南中閱讀更多信息。

參數

categories‘auto’ 或類似數組的列表,默認=’auto’

每個函數的類別(唯一值):

  • ‘auto’:根據訓練數據自動確定類別。
  • list : categories[i] 包含第 i 列中預期的類別。傳遞的類別不應在單個特征中混合字符串和數值,並且應在數值的情況下進行排序。

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

drop{‘first’, ‘if_binary’} 或類似數組的形狀 (n_features,),默認=無

指定用於刪除每個函數的一個類別的方法。這在完全共線特征導致問題的情況下很有用,例如將結果數據輸入神經網絡或非正則化回歸時。

但是,刪除一個類別會破壞原始表示的對稱性,因此可能會導致下遊模型出現偏差,例如懲罰線性分類或回歸模型。

  • 無:保留所有特征(默認)。
  • ‘first’:刪除每個特征中的第一個類別。如果隻存在一個類別,則該函數將被完全刪除。
  • ‘if_binary’:將每個特征中的第一個類別去掉兩個類別。具有 1 個或超過 2 個類別的特征保持不變。
  • 數組:drop[i] 是函數X[:, i] 中應該刪除的類別。
sparse布爾,默認=真

如果設置為 True 將返回稀疏矩陣,否則將返回一個數組。

dtype數字類型,默認=浮點數

所需的輸出數據類型。

handle_unknown{‘error’, ‘ignore’},默認='錯誤'

如果在轉換期間存在未知的分類特征,是否引發錯誤或忽略(默認為引發)。當此參數設置為 ‘ignore’ 並且在轉換過程中遇到未知類別時,生成的此函數的 one-hot 編碼列將全為零。在逆變換中,未知類別將表示為無。

屬性

categories_數組列表

擬合期間確定的每個特征的類別(按 X 中特征的順序並與 transform 的輸出相對應)。這包括drop(如果有)中指定的類別。

drop_idx_形狀數組(n_features,)
  • drop_idx_[i]categories_[i] 中每個特征要刪除的類別的索引。
  • drop_idx_[i] = None 如果不從索引為 i 的特征中刪除任何類別,例如當drop='if_binary' 並且該函數不是二進製時。
  • drop_idx_ = None 如果將保留所有轉換後的特征。
n_features_in_int

擬合期間看到的特征數。

feature_names_in_ndarray 形狀(n_features_in_,)

擬合期間看到的特征名稱。僅當 X 具有全為字符串的函數名稱時才定義。

例子

給定一個具有兩個特征的數據集,我們讓編碼器找到每個特征的唯一值,並將數據轉換為二進製 one-hot 編碼。

>>> 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.]])

相關用法


注:本文由純淨天空篩選整理自scikit-learn.org大神的英文原創作品 sklearn.preprocessing.OneHotEncoder。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。