前言:
在機器學習算法中,我們經常會遇到分類特征,例如:人的性别有男女,祖國有中國,美國,法國等。
這些特征值并不是連續的,而是離散的,無序的。通常我們需要對其進行特征數字化。
那什麼是特征數字化呢?例子如下:
- 性别特征:[“男”,“女”]
- 祖國特征:[“中國”,"美國,“法國”]
- 運動特征:[“足球”,“籃球”,“羽毛球”,“乒乓球”]
假如某個樣本(某個人),他的特征是這樣的[“男”,“中國”,“乒乓球”],我們可以用 [0,0,4]
來表示,但是這樣的特征處理并不能直接放入機器學習算法中。因為類别之間是無序的(運動資料就是任意排序的)。
One-Hot 編碼
獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀态寄存器來對N個狀态進行編碼,每個狀态都由他獨立的寄存器位,并且在任意時候,其中隻有一位有效。獨熱編碼恰好是一種解決上述問題的好辦法。不過資料也是以變得稀疏。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR5UeBpXT4tmaNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0IjNyETOwkTMyETMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
One-Hot實際案例
就拿上面的例子來說吧,性别特征:[“男”,“女”],按照N位狀态寄存器來對N個狀态進行編碼的原理,咱們處理後應該是這樣的(這裡隻有兩個特征,是以N=2):
男 => 10
女 => 01
祖國特征:[“中國”,"美國,“法國”](這裡N=3):
中國 => 100
美國 => 010
法國 => 001
運動特征:[“足球”,“籃球”,“羽毛球”,“乒乓球”](這裡N=4):
足球 => 1000
籃球 => 0100
羽毛球 => 0010
乒乓球 => 0001
是以,當一個樣本為[“男”,“中國”,“乒乓球”]的時候,完整的特征數字化的結果為:
[1,0,1,0,0,0,0,0,1]
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #這裡一共有4個資料,3種特征
array = enc.transform([[0,1,3]]).toarray() #這裡使用一個新的資料來測試
print array # [[ 1 0 0 1 0 0 0 0 1]]
為什麼使用one-hot編碼來處理離散型特征?
關注微信公衆号:讓我愛上它Computer 擷取更多學習資料