天天看點

[機器學習]One-Hot編碼總結(獨熱編碼)

One-Hot編碼,又稱“獨熱編碼”,是一種編碼方式。

一、問題的産生

在進行機器學習,例如回歸,分類,聚類或者NLP等問題的時候,通常很多資料都是無法直接利用的。例如一個學生資訊資料集中樣本有三種類别,每個類别分别對應不同種類的标簽:“性别”(男、女)、“班級”(1班、2班、3班)、“年級”(一年級、二年級、三年級、四年級)。

在計算機中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基于的就是歐式空間。是以在處理上面學生資訊資料集的時候就要考慮如何将其進行恰當的編碼,以便于後續的計算處理。這個時候就提出了One-Hot編碼格式。

二、什麼是One-Hot編碼

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

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

看到這裡可能有一些蒙,沒有關系,下面給出一個具體的例子。

三、執行個體分析

我們還是用最上面的例子,按照N位寄存器來對N個狀态進行編碼,并且除了整數索引之外,其他都是零值。

性别:[“男”,”女”]

隻有兩個特征,是以N為2,下面同理。

男=>10

女=>01

班級:[“1班”,”2班”,”3班”]

1班=>100

2班=>010

3班=>001

年紀:[“一年級”,”二年級”,”三年級”,”四年級”]

一年級=>1000

二年級=>0100

三年級=>0010

四年級=>0001

是以如果一個樣本為[“男”,”2班”,”四年級”]的時候,完整的特征數字化的結果為:

[1,0,0,1,0,0,0,0,1]

到這裡我們就實作了對資料集樣本的編碼,就可以順利進行後續的回歸、聚類或者其他操作。

四、優缺點

優點:

(1)能夠處理非連續型數值特征,也就是離散值。

(2)在一定程度上也擴充了特征。比如性别本身是一個特征,經過one hot編碼以後,就變成了男或女兩個特征,将離散特征通過one-hot編碼映射到歐式空間,在回歸,分類,聚類等機器學習算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基于的就是歐式空間。

(3)将離散型特征使用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).即每兩個工作之間的距離是一樣的,顯得更合理。

缺點:

(1)如果原本的标簽編碼是有序的,那one hot編碼就不合适了——會丢失順序資訊。

(2)如果特征的特征值數目特别多,特征向量就會非常大,且非常稀疏。

五、NLP用途

我們在自然語言領域,可以将文本分詞,分詞後的所有單詞作為一個總體的特征數目,進行one-hot編碼,其中每一個單詞就是一個one-hot向量,然後文本中每個句子也同樣分詞,分詞後将這些單詞作為一個句子的表示方式,這樣一個句子就是一個二維向量,向量的行數是這個句子包含的單詞總數,如此還可以用one-hot向量組成表示為文章。

六、代碼展示

from sklearn import preprocessing

enc = preprocessing.OneHotEncoder() #One-Hot編碼
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #定義樣本

print(enc.transform([[0,1,1]]).toarray())  #[[1.0.0.1.0.0.1.0.0.]]
print(enc.transform([[1,1,1]]).toarray())  #[[0.1.0.1.0.0.1.0.0.]]
print(enc.transform([[1,2,1]]).toarray())  #[[0.1.0.0.1.0.1.0.0.]]
           

參考連結:

https://blog.csdn.net/Dorothy_Xue/article/details/84641417

https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html

https://www.imooc.com/article/35900

https://blog.csdn.net/randompeople/article/details/83244766

https://www.cnblogs.com/fujian-code/p/8717579.html

繼續閱讀