1. 程式人生 > >資料預處理之獨熱編碼(One-Hot):為什麼要使用one-hot編碼?

資料預處理之獨熱編碼(One-Hot):為什麼要使用one-hot編碼?

一、問題由來

最近在做ctr預估的實驗時,還沒思考過為何資料處理的時候要先進行one-hot編碼,於是整理學習如下:

在很多機器學習任務如ctr預估任務中,特徵不全是連續值,而有可能是分類值。如下:

 

    分類變數(定量特徵)與連續變數(定性特徵)。我們訓練模型的變數,一般分為兩種形式。以廣告收入增長率為例,如果取值為0-1之間任意數,則此時變數為連續變數。如果把增長率進行分段處理,表示成如下形式:[0,0.3],(0.3,0.6],(0.6,1],那麼此時變數為分類變數。

    特徵轉換。對於分類變數,建模時要進行轉換,通常直接轉換為數字。比如將[0,0.3],(0.3,0.6],(0.6,1]表示為0,1,2。原因主要有兩點:

      1,轉換後可以提高模型運算效率。

      2,對於一些模型,比如邏輯迴歸或計算距離時,無法對分類值直接進行計算。

              直接轉換為數字,也會帶來一些問題:

      1,轉換為數字後,預設為連續變數,違背最初設計,影響效率。

      2,轉換後的值會影響同一特徵在樣本中的權重。比如轉換為1000和轉換為1對模型影響明顯不同。

      因此,需要更好的編碼方式對特徵進行轉換。

 

    one-hot編碼。one-hot編碼的定義是用N位狀態暫存器來對N個狀態進行編碼。比如上面的例子[0,0.3],(0.3,0.6],(0.6,1],有3個分類值,因此N為3,對應的one-hot編碼可以表示為100,010,001。

    使用步驟:比如用LR演算法做模型,在資料處理過程中,可以先對連續變數進行離散化處理,然後對離散化後資料進行one-hot編碼,最後放入LR模型中。這樣可以增強模型的非線效能力。

    再看一個sklearn的例子:

 

from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])    # fit來學習編碼
enc.transform([[0, 1, 3]]).toarray()    # 進行編碼

 

輸出:array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

資料矩陣是4*3,即4個數據,3個特徵維度。

          0 0 3                             觀察左邊的資料矩陣,第一列為第一個特徵維度,有兩種取值0\1. 所以對應編碼方式為10 、01

          1 1 0                                               同理,第二列為第二個特徵維度,有三種取值0\1\2,所以對應編碼方式為100、010、001

     0 2 1                                               同理,第三列為第三個特徵維度,有四種取值0\1\2\3,所以對應編碼方式為1000、0100、0010、0001

     1 0 2

再來看要進行編碼的引數[0 , 1,  3], 0作為第一個特徵編碼為10,  1作為第二個特徵編碼為010, 3作為第三個特徵編碼為0001.  故此編碼結果為 1 0 0 1 0 0 0 0 1

 

二. 為什麼要獨熱編碼?

       獨熱編碼(是因為大部分演算法是基於向量空間中的度量來進行計算的,為了使非偏序關係的變數取值不具有偏序性,並且到原點是等距的。使用one-hot編碼,將離散特徵的取值擴充套件到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。將離散型特徵使用one-hot編碼,會讓特徵之間的距離計算更加合理。離散特徵進行one-hot編碼後,編碼後的特徵,其實每一維度的特徵都可以看做是連續的特徵。就可以跟對連續型特徵的歸一化方法一樣,對每一維特徵進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。       

        為什麼特徵向量要對映到歐式空間?

        將離散特徵通過one-hot編碼對映到歐式空間,是因為,在迴歸,分類,聚類等機器學習演算法中,特徵之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基於的就是歐式空間。

 

三 .獨熱編碼的優缺點

  • 優點:獨熱編碼解決了分類器不好處理屬性資料的問題,在一定程度上也起到了擴充特徵的作用。它的值只有0和1,不同的型別儲存在垂直的空間。
  • 缺點:當類別的數量很多時,特徵空間會變得非常大,成為一個高維稀疏矩陣。在這種情況下,一般可以用PCA來減少維度。而且one hot encoding+PCA這種組合在實際中也非常有用。

 

四. 什麼情況下(不)用獨熱編碼?

  • 用:獨熱編碼用來解決類別型資料的離散值問題,
  • 不用:將離散型特徵進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特徵是離散的,並且不用one-hot編碼就可以很合理的計算出距離,那麼就沒必要進行one-hot編碼。 有些基於樹的演算法在處理變數時,並不是基於向量空間度量,數值只是個類別符號,即沒有偏序關係,所以不用進行獨熱編碼。  Tree Model不太需要one-hot編碼: 對於決策樹來說,one-hot的本質是增加樹的深度。

  總的來說,要是one hot encoding的類別數目不太多,建議優先考慮。 

 

五.  什麼情況下(不)需要歸一化?

  • 需要: 基於引數的模型或基於距離的模型,都是要進行特徵的歸一化。
  • 不需要:基於樹的方法是不需要進行特徵的歸一化,例如隨機森林,bagging 和 boosting等。