首頁 > 軟體

機器學習資料預處理之獨熱One-Hot編碼及其程式碼詳解

2022-07-12 14:01:32

1. 為什麼使用 one-hot 編碼?

問題:

在機器學習演演算法中,我們經常會遇到分類特徵,例如:人的性別有男女,祖國有中國,美國,法國等。 這些特徵值並不是連續的,而是離散的,無序的。

目的:

如果要作為機器學習演演算法的輸入,通常我們需要對其進行特徵數位化。什麼是特徵數位化呢?例如:

性別特徵:["男","女"]

祖國特徵:["中國","美國,"法國"]

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

瓶頸:

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

2. 什麼是 one-hot 編碼?

定義:

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

理解:

One-Hot 編碼是分類變數作為二進位制向量的表示。

(1) 將分類值對映到整數值。

(2) 然後,每個整數值被表示為二進位制向量,除了整數的索引之外,它都是零值,它被標記為1。

舉例1:

舉個例子,假設我們有四個樣本(行),每個樣本有三個特徵(列),如圖:

上述feature_1有兩種可能的取值,比如是男/女,這裡男用1表示,女用2表示。feature_2 和 feature_3 各有4種取值(狀態)。

one-hot 編碼就是保證每個樣本中的單個特徵只有1位處於狀態1,其他的都是0

上述狀態用 one-hot 編碼如下圖所示:

舉例2:

按照 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]

下圖可能會更好理解:

python 程式碼範例:

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()  # 測試。這裡使用1個新資料來測試
   
print array   # [[ 1  0  0  1  0  0  0  0  1]] # 獨熱編碼結果

以上對應關係可以解釋為下圖:

3. one-hot 編碼優缺點?

優點:

(1) 解決了 分類器不好處理離散資料 的問題。

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

b. one-hot 編碼。使用 one-hot 編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值 就 對應歐式空間的某個點。將離散型特徵使用 one-hot 編碼,確實會讓特徵之間的距離計算更加合理。

(2) 在一定程度上也起到了 擴充特徵 的作用。

缺點:

在文字特徵表示上有些缺點就非常突出了。

(1) 它是一個詞袋模型,不考慮詞與詞之間的順序(文字中詞的順序資訊也是很重要的);

(2) 它假設詞與詞相互獨立(在大多數情況下,詞與詞是相互影響的);

(3) 它得到的特徵是離散稀疏的 (這個問題最嚴重)。

上述第3點展開:

(1) 為什麼得到的特徵是離散稀疏的?

例如,如果將世界所有城市名稱作為語料庫的話,那這個向量會過於稀疏,並且會造成維度災難。如下:

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
寧波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值為1,其餘都為0。

(2)能不能把詞向量的維度變小呢?

a) Dristributed representation:

可以解決 One hot representation 的問題,它的思路是:

1. 通過訓練,將每個詞都對映到一個較短的詞向量上來。

2. 所有的這些 詞向量 就構成了 向量空間

3. 進而可以用 普通的統計學的方法 來研究詞與詞之間的關係

這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。

b) 舉例:

1. 比如將詞彙表裡的詞用 "Royalty", "Masculinity", "Femininity" 和 "Age" 4個維度來表示,King 這個詞對應的詞向量可能是 (0.99,0.99,0.05,0.7)。

2. 在實際情況中,並不能對詞向量的每個維度做一個很好的解釋

3.將king這個詞從一個可能非常稀疏的向量坐在的空間,對映到現在這個 四維向量 所在的空間,必須滿足以下性質:

(1)這個對映是單射;
(2)對映之後的向量 不會丟失之前的 那種向量 所含的資訊 。

4.這個過程稱為word embedding(詞嵌入),即將高維詞向量嵌入到一個低維空間。如圖:

5.經過我們一系列的降維神操作,有了用 representation 表示的較短的詞向量,我們就可以較容易的分析詞之間的關係了,比如我們將詞的維度降維到 2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:

6. 出現這種現象的原因是,我們得到最後的詞向量的訓練過程中引入了詞的上下文。舉例:

想到得到 "learning" 的詞向量,但訓練過程中,你同時考慮了它左右的上下文,那麼就可以使 "learning" 帶有語意資訊了。通過這種操作,我們可以得到近義詞,甚至 cat 和它的複數 cats 的向量極其相近。

--------------------------------------------------------------------

參考部落格:

通俗理解word2vec

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

到此這篇關於機器學習資料預處理之獨熱One-Hot編碼及其程式碼詳解的文章就介紹到這了,更多相關one-hot 編碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com