天天看點

離散型特征編碼方式:one-hot與啞變量*

本文我們簡單介紹了one-hot編碼和啞變量編碼是如何進行編碼過程的,然後又分析了它們各自的特征,最後讨論了它們是如何提升線性模型的非線性能力的。

  在機器學習問題中,我們通過訓練資料集學習得到的其實就是一組模型的參數,然後通過學習得到的參數确定模型的表示,最後用這個模型再去進行我們後續的預測分類等工作。在模型訓練過程中,我們會對訓練資料集進行抽象、抽取大量特征,這些特征中有離散型特征也有連續型特征。若此時你使用的模型是簡單模型(如LR),那麼通常我們會對連續型特征進行離散化操作,然後再對離散的特征,進行one-hot編碼或啞變量編碼。這樣的操作通常會使得我們模型具有較強的非線性能力。那麼這兩種編碼方式是如何進行的呢?它們之間是否有聯系?又有什麼樣的差別?是如何提升模型的非線性能力的呢?下面我們一一介紹:

one-hot encoding

  關于one-hot編碼的具體介紹,可以參考我之前的一篇部落格,部落格位址:特征提取方法: one-hot 和 IF-IDF。這裡,不再詳細介紹。one-hot的基本思想:将離散型特征的每一種取值都看成一種狀态,若你的這一特征中有N個不相同的取值,那麼我們就可以将該特征抽象成N種不同的狀态,one-hot編碼保證了每一個取值隻會使得一種狀态處于“激活态”,也就是說這N種狀态中隻有一個狀态位值為1,其他狀态位都是0。舉個例子,假設我們以學曆為例,我們想要研究的類别為國小、中學、大學、碩士、博士五種類别,我們使用one-hot對其編碼就會得到:

       

離散型特征編碼方式:one-hot與啞變量*

dummy encoding

  啞變量編碼直覺的解釋就是任意的将一個狀态位去除。還是拿上面的例子來說,我們用4個狀态位就足夠反應上述5個類别的資訊,也就是我們僅僅使用前四個狀态位 [0,0,0,0] 就可以表達博士了。隻是因為對于一個我們研究的樣本,他已不是國小生、也不是中學生、也不是大學生、又不是研究所學生,那麼我們就可以預設他是博士,是不是。(額,當然他現實生活也可能上幼稚園,但是我們統計的樣本中他并不是,^-^)。是以,我們用啞變量編碼可以将上述5類表示成:

      

離散型特征編碼方式:one-hot與啞變量*

one-hot編碼和dummy編碼:差別與聯系

  通過上面的例子,我們可以看出它們的“思想路線”是相同的,隻是啞變量編碼覺得one-hot編碼太羅嗦了(一些很明顯的事實還說的這麼清楚),是以它就很那麼很明顯的東西省去了。這種簡化不能說到底好不好,這要看使用的場景。下面我們以一個例子來說明:

  假設我們現在獲得了一個模型

離散型特征編碼方式:one-hot與啞變量*

,這裡自變量滿足

離散型特征編碼方式:one-hot與啞變量*

(因為特征是one-hot獲得的,所有隻有一個狀态位為1,其他都為了0,是以它們加和總是等于1),故我們可以用

離散型特征編碼方式:one-hot與啞變量*

表示第三個特征,将其帶入模型中,得到:

     

離散型特征編碼方式:one-hot與啞變量*

這時,我們就驚奇的發現

離散型特征編碼方式:one-hot與啞變量*

離散型特征編碼方式:one-hot與啞變量*

這兩個參數是等價的!那麼我們模型的穩定性就成了一個待解決的問題。這個問題這麼解決呢?有三種方法:

(1)使用

離散型特征編碼方式:one-hot與啞變量*

正則化手段,将參數的選擇上加一個限制,就是選擇參數元素值小的那個作為最終參數,這樣我們得到的參數就唯一了,模型也就穩定了。

(2)把偏置項

離散型特征編碼方式:one-hot與啞變量*

去掉,這時我們發現也可以解決同一個模型參數等價的問題。

    

離散型特征編碼方式:one-hot與啞變量*

  因為有了bias項,是以和我們去掉bias項的模型是完全不同的模型,不存在參數等價的問題。

(3)再加上bias項的前提下,使用啞變量編碼代替one-hot編碼,這時去除了

離散型特征編碼方式:one-hot與啞變量*

,也就不存在之前一種特征可以用其他特征表示的問題了。

總結:我們使用one-hot編碼時,通常我們的模型不加bias項 或者 加上bias項然後使用

離散型特征編碼方式:one-hot與啞變量*

正則化手段去限制參數;當我們使用啞變量編碼時,通常我們的模型都會加bias項,因為不加bias項會導緻固有屬性的丢失。

選擇建議:我感覺最好是選擇正則化 + one-hot編碼;啞變量編碼也可以使用,不過最好選擇前者。雖然啞變量可以去除one-hot編碼的備援資訊,但是因為每個離散型特征各個取值的地位都是對等的,随意取舍未免來的太随意。

連續值的離散化為什麼會提升模型的非線性能力?

   簡單的說,使用連續變量的LR模型,模型表示為公式(1),而使用了one-hot或啞變量編碼後的模型表示為公式(2)

離散型特征編碼方式:one-hot與啞變量*

式中

離散型特征編碼方式:one-hot與啞變量*

表示連續型特征,

離散型特征編碼方式:one-hot與啞變量*

離散型特征編碼方式:one-hot與啞變量*
離散型特征編碼方式:one-hot與啞變量*

分别是離散化後在使用one-hot或啞變量編碼後的若幹個特征表示。這時我們發現使用連續值的LR模型用一個權值去管理該特征,而one-hot後有三個權值管理了這個特征,這樣使得參數管理的更加精細,是以這樣拓展了LR模型的非線性能力。

  這樣做除了增強了模型的非線性能力外,還有什麼好處呢?這樣做了我們至少不用再去對變量進行歸一化,也可以加速參數的更新速度;再者使得一個很大權值管理一個特征,拆分成了許多小的權值管理這個特征多個表示,這樣做降低了特征值擾動對模型為穩定性影響,也降低了異常資料對模型的影響,進而使得模型具有更好的魯棒性。