機器學習之類別性特征


  類別型特征原始輸入通常是字符串形式,除了決策樹等少數模型能直接處理字符串形式的輸入,對於邏輯回歸、支持向量機等模型來說,類別型特征必須經過處理轉換成數值型。Sklearn中提供了幾個轉換器來處理文本屬性,下面將總結LabelEncode(序號編碼)、OneHotEncoder(獨熱編碼)和LabelBinarizer(二進制編碼)轉換器用法

1. 類圖結構

  

2. LabelEncode用法

  官方文檔:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

示例:

labels = [1,2,2,6]
le = LabelEncoder()
le.fit(labels)
print("classes_:",le.classes_)
print("transform:",le.transform([1, 2, 2, 6]))
print('fit_transform:',le.fit_transform(labels))
print('inverser_transform:',le.inverse_transform([0, 0, 1, 2]))

 輸出:

  當labels換成文本標簽時

labels = ['aa','cc','dd','bb']
le = LabelEncoder()
le.fit(labels)
print("classes_:",le.classes_)
print("transform:",le.transform(['aa','cc','dd','bb']))
print('fit_transform:',le.fit_transform(labels))
print('inverser_transform:',le.inverse_transform([0, 2, 3, 1]))

輸出:

3. OneHotEncoder用法

OneHotEncoder(n_values=’auto’,  categorical_features=’all’,  dtype=<class ‘numpy.float64’>,  sparse=True,  handle_unknown=’error’)

(1)參數

  n_values = 'auto' --->表示每個特征使用幾維的數值由數據集自動推斷,即幾種類別就使用幾位來表示,還可以自己設置

- int : number of categorical values per feature.
            Each feature value should be in ``range(n_values)``
- array : ``n_values[i]`` is the number of categorical values in
          ``X[:, i]``. Each feature value should be
          in ``range(n_values[i])``

  categorical_features = 'all' --->這個參數指定了對哪些特征進行編碼,默認對所有類別都進行編碼。也可以自己指定選擇哪些特征,通過索引或者 bool 值來指定

  dtype --->表示編碼數值格式,默認為浮點型
  spares--->表示編碼的格式,默認為True,即為稀疏的格式,指定False則就不用toarray了
  handle_unknow --->指定為‘error’或者'ignore',即如果碰到未知的類型,是返回一個錯誤還是忽略它
(2)示例
enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])
print(enc.transform([[0,1,3]]).toarray())

  輸出:

  我們先來看第一個特征,即第一列 [0,1,0,1][0,1,0,1],也就是說它有兩個取值 0 或者 1,那么 one-hot 就會使用兩位來表示這個特征,[1,0][1,0] 表示 0, [0,1][0,1] 表示 1,在上例輸出結果中的前兩位 [1,0...][1,0...] 也就是表示該特征為 0

  第二個特征,第二列 [0,1,2,0][0,1,2,0],它有三種值,那么 one-hot 就會使用三位來表示這個特征,[1,0,0][1,0,0] 表示 0, [0,1,0][0,1,0] 表示 1,[0,0,1][0,0,1] 表示 2,在上例輸出結果中的第三位到第六位 [...0,1,0,0...][...0,1,0,0...] 也就是表示該特征為 1

  第二個特征,第三列 [3,0,1,2][3,0,1,2],它有四種值,那么 one-hot 就會使用四位來表示這個特征,[1,0,0,0][1,0,0,0] 表示 0, [0,1,0,0][0,1,0,0] 表示 1,[0,0,1,0][0,0,1,0] 表示 2,[0,0,0,1][0,0,0,1] 表示 3,在上例輸出結果中的最后四位 [...0,0,0,1][...0,0,0,1] 也就是表示該特征為 3

示例:

array = np.array([1,2,3])
ohe = OneHotEncoder()
labels = ohe.fit_transform(array.reshape(-1,1))
print(labels.toarray())
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

4. LabelBinarizer用法

(1)參數

neg_label : int (default: 0)
    Value with which negative labels must be encoded.

pos_label : int (default: 1)
    Value with which positive labels must be encoded.

sparse_output : boolean (default: False)
    True if the returned array from transform is desired to be in sparse
    CSR format.

(2)示例

  使用LabelBinarizer可以一次性完成LabelEncoder和OneHotEncoder(從文本類別轉化為整數類別,再從整數類別轉換為獨熱向量)

lb = preprocessing.LabelBinarizer()
lb.fit_transform(['yes', 'no', 'no', 'yes'])
array([[1],[0],[0],[1]])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM