機器學習:數據預處理之獨熱編碼(One-Hot)


前言

————————————————————————————————————————

在機器學習算法中,我們經常會遇到分類特征,例如:人的性別有男女,祖國有中國,美國,法國等。
這些特征值並不是連續的,而是離散的,無序的。通常我們需要對其進行特征數字化。

那什么是特征數字化呢?例子如下:

  • 性別特征:["男","女"]

  • 祖國特征:["中國","美國,"法國"]

  • 運動特征:["足球","籃球","羽毛球","乒乓球"]

假如某個樣本(某個人),他的特征是這樣的["男","中國","乒乓球"],我們可以用 [0,0,4] 來表示,但是這樣的特征處理並不能直接放入機器學習算法中。因為類別之間是無序的(運動數據就是任意排序的)。

 

什么是獨熱編碼(One-Hot)?

————————————————————————————————————————

One-Hot編碼,又稱為一位有效編碼,主要是采用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。

One-Hot編碼是分類變量作為二進制向量的表示。這首先要求將分類值映射到整數值。然后,每個整數值被表示為二進制向量,除了整數的索引之外,它都是零值,它被標記為1。

 

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]

下圖可能會更好理解:

https://img.mukewang.com/5b20f1b90001cc2202550045.jpg

 

One-Hot在python中的使用

————————————————————————————————————————

1
2
3
4
5
6
7
8
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]]

結果為 1 0 0 1 0 0 0 0 1

 

為什么使用one-hot編碼來處理離散型特征?

————————————————————————————————————————

在回歸,分類,聚類等機器學習算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算余弦相似性,基於的就是歐式空間。

而我們使用one-hot編碼,將離散特征的取值擴展到了歐式空間,離散特征的某個取值就對應歐式空間的某個點。

將離散型特征使用one-hot編碼,確實會讓特征之間的距離計算更加合理。

比如,有一個離散型特征,代表工作類型,該離散型特征,共有三個取值,不使用one-hot編碼,其表示分別是x_1 = (1), x_2 = (2), x_3 = (3)。兩個工作之間的距離是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之間就越不相似嗎?顯然這樣的表示,計算出來的特征的距離是不合理。那如果使用one-hot編碼,則得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么兩個工作之間的距離就都是sqrt(2).即每兩個工作之間的距離是一樣的,顯得更合理。

 

不需要使用one-hot編碼來處理的情況

————————————————————————————————————————電動叉車

將離散型特征進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特征是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那么就沒必要進行one-hot編碼。

比如,該離散特征共有1000個取值,我們分成兩組,分別是400和600,兩個小組之間的距離有合適的定義,組內的距離也有合適的定義,那就沒必要用one-hot 編碼。

離散特征進行one-hot編碼后,編碼后的特征,其實每一維度的特征都可以看做是連續的特征。就可以跟對連續型特征的歸一化方法一樣,對每一維特征進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。


免責聲明!

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



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