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 編碼:
- 許多機器學習算法不能直接操作類別變量,這些算法要求輸入輸出變量都是數值。
- 整數編碼可以將類別變量轉換為數值,但會讓類別間存在次序關系。
- 將類別變量轉換為數值,可以提高計算效率。
② 進行 OneHotEncoding 的優點:
- 解決了分類器不好處理分類特征數據的問題。
- 在一定程度上也起到了擴充特征的作用。
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