sklearn.preprocessing.OneHotEncoder


1.概要

sklearn.preprocessing.OneHotEncoder將類別變量、順序變量轉化為二值化的標志變量

 

2. 解析

格式:

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

實例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]]).toarray()  # 如果不加 toarray() 的話,輸出的是稀疏的存儲格式,即索引加值的形式,也可以通過參數指定 sparse = False 來達到同樣的效果
print(ans) 


#
輸出 [[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]

對於輸入數組,每一行當做一個樣本,每一列當做一個特征。

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

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

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

 

注意:雖然訓練樣本中的數值僅僅代表類別,但是也必須使用數值格式的數據,如果使用字符串格式的數據會報錯。

參數:

n_values='auto'表示每個特征使用幾維,由數據集自動推斷,即幾種類別就使用幾位來表示

也可以自己指定。舉例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(n_values = [2, 3, 4])   # 第一個特征:2維;第二個特征:3維;第三個特征:4維
enc.fit([[0, 0, 3],
         [1, 1, 0]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans)


# 輸出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]

注意到訓練樣本中第二個特征列沒有類別2,但是結果依然將類別2給編碼了出來,這就是自己指定維數的作用(我們使用3位來表示第二個特征,自然包括了類別2),第三列特征同樣如此。

這也告誡我們,如果訓練樣本中有丟失的分類特征值,我們就必須顯示的設置參數n_value了,這樣防止編碼出錯。

categorical_features='all':這個參數指定對哪些特征進行編碼,默認對所有類別都進行編碼。

也可以自己指定選擇哪些特征,通過索引或者bool值來指定。舉例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categorical_features = [0,2]) # 等價於 [True, False, True]
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 輸出 [[ 1. 0. 0. 0. 0. 1. 2.]]

輸出結果中前兩位[1,0]表示0,中間四位[0,0,0,1]表示對第三個特征3編碼,第二個特征2沒有進行編碼,就放在最后一位。

dtype=<class 'numpy.float64'>:表示編碼數值格式,默認為浮點型。

sparse=True:表示編碼的格式,默認為True,稀疏的格式,指定False就不用toarray()了。

handle_unknown='error':其值可以為‘error’或'ignore',即如果碰到未知的類別,是返回一個錯誤還是忽略。

 

3. 熱編碼的意義

獨熱編碼又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候,其中只有一位有效。

可以理解為對於每一個特征,如果它有m個可能值,那么經過獨熱編碼后,就變成了m個二元特征。並且,這些特征互斥,每次只有一個激活。因此,數據會變成稀疏的。

 

① 為什么進行 OneHotEncoding 編碼:

  1. 許多機器學習算法不能直接操作類別變量,這些算法要求輸入輸出變量都是數值。
  2. 整數編碼可以將類別變量轉換為數值,但會讓類別間存在次序關系
  3. 將類別變量轉換為數值,可以提高計算效率。

② 進行 OneHotEncoding 的優點:

  1. 解決了分類器不好處理分類特征數據的問題。
  2. 在一定程度上也起到了擴充特征的作用

 

4. 自寫代碼實現OneHotEncoder

def to_categorical(x, n_col=None):
    if not n_col:
        n_col = np.amax(x) + 1
    one_hot = np.zeros((x.shape[0], n_col))
    print(one_hot)
    # one_hot[[0, 1], [1, 2]] = 5
    one_hot[np.arange(x.shape[0]), x] = 1
    return one_hot

x = np.array([[1, 2],
              [3, 4]])
print(to_categorical(x)

輸出:

[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[0. 1. 0. 1. 0.]
 [0. 0. 1. 0. 1.]]

 

 

來自:https://www.cnblogs.com/zhoukui/p/9159909.html


免責聲明!

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



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