【ML專欄】談One-hot的本質功能

TL;DR

  • One-hot是對低維高信息量的特徵在高維中進行打散,使之在模型中更容易被優化/學習。也是ML中常用套路「先升維」的一個方案。

本文不討論ML乃至DL中某些ID特徵對模型最終效果是否有貢獻的問題,只是針對於One-hot的作用進行解釋。

從ID類特徵講起

說起One-hot就得說起userid、itemid各種ID類特徵,所以下面先看下ID類特徵的處理方案演進:

  1. 在大數據之前的時代,一般領域的ML中取值上萬乃至千萬的id類特徵基本是直接丟棄的,新人的常犯錯誤之一就是把id的值直接作為一個特徵加入到模型中進行訓練。
  2. 但在NLP中,各種字元(字元ID)基本是唯一的重要特徵,丟棄了就沒法學了。這裡有代表性的就是n-gram,可以作為一個按某些ID n-gram進行分桶的統計模型,也可以以n-gram的one-hot作為特徵。
  3. 大數據時代,隨著FTRL、FM、DL中的embedding以及定製的word2vec等方案的崛起,ID類特徵做one-hot也被發現能提升模型效果。

初接觸ML的人往往對ID類特徵到底提供了什麼信息感覺模糊,每個用戶的id其實沒有什麼意義,只是單純的和其他人、其他對象區別開了而已,「這個特徵有信息量么?」

簡單的來說,ID類特徵其實主要沒有提供什麼信息(這個描述不準確,後面會進行修正),而是給ML模型提供了一個空間,是指能對於不同的對象分別進行一些「統計」或者說記憶,這個信息沒法泛化,但確實可以改善模型的效果。某種意義上說,統計結果本身就是可以泛化的,但可能和一般人想像的可以學習出某種規則的那種泛化不是同一個含義。

One-hot的作用

除了對ID直接做One-hot外,還可以對userid*itemid這樣的交叉特徵做One-hot,很多領域中所謂的萬億級特徵就是這麼來的:一百萬用戶、一百萬商品,就有一萬億個組合,用One-hot編碼一下就有一萬億維,聽起來高大上,但說白了就是一個很簡單的處理。當然,能不能訓好模型才是關鍵,也是另一個問題,本文不展開。

剩下還有哪裡可以用One-hot就不是那麼廣為人知的了,這裡舉兩個應用:

  1. 對於某一維或少數某些維度的高度非線性的特徵,可以對其值域做分區one-hot編碼作為特徵。這種方式有信息損失,也可以對其稍加改動變成一個無信息損失的方案。
  2. 作為上面的一個特例,在GIS領域中坐標特徵處理的一個常見手段就是分區域做one-hot,例如這篇文章里描述的:Modeling Trajectories with Recurrent Neural Networks

那麼問題來了,這些場景中,One-hot的作用到底是什麼呢?如果都是對某個特徵的可逆變換,那麼One-hot的價值是什麼呢?

為了回答這個問題,首先我們得承認,目前魯棒的ML模型的學習能力理論上可能可以充分學到所有信息,但實際上是有限的。例子就是DL收到優化方式的影響,理論上信息在特徵里都有,但可能只能學到20%,這裡面就有難學習和容易學習的差異。在給定問題的場景下,特徵工程的方式可以顯著影響這個難易度,而One-hot的價值就在於對上面這種低維度、高信息量、且距離超過一定程度的不同的值之間關係很弱的特徵,可以通過one-hot的方式來顯著降低模型學習的難度。當然往往以增加了模型的容量為代價。

這也是為什麼交叉特徵明明可以做userid*1e9 + itemid這樣的方式來無損的表達所有信息,但效果並不好的原因。

目前FM、DL等模型對於特定數據上的理論研究還不夠完善,所以下面這只是我個人的看法,尚未看到其他出處,有看到的同學請留言指出:

對於上面所說的這類特徵,相對於其高維度的表示,以DL為代表的很多模型更難以學習其低維高度非線性的表示。DL中特徵的「自然」表示可能就是高維低密度而非低維高密度。

題外話,說起來還有一類方案可以起到One-hot的反向效果,將高維表示的數據丟棄高維中遠距離的信息,保留局部距離關係,轉換為低維的表示——那就是t-SNE為代表的非線性降維,如下圖。如果你對於GIS中的坐標特徵的性質不熟悉,那麼下面這個圖和真實數據的坐標特徵分布其實有些相似。

圖片來源:lvdmaaten.github.io/tsn

也不能說One-hot未來就是這種特徵最好的特徵工程方式,但目前它是最佳實踐。

補:再說ID類特徵

前面說「ID類特徵其實主要沒有提供什麼信息」,這個其實是不準確的,這取決於ID的生成方式:隨機ID是沒有信息,但流水號ID其實是有信息的,例如流水號生成的用戶ID,同一個ID附近的用戶很可能是時間上同一批活動或同一時期成為該產品用戶的,雖然這個數據比較臟,但作為特徵來說對ML來說是足夠的,只是需要一個好的特徵工程方式而已。

例如在已有ID one-hot的基礎上,增加下面這類方式對於流水號型的ID是可能有效果的:

  • 對ID的取值分段做One-hot,分段長度可以不止一種
  • 對ID的的二進位表示的每一位做One-hot

推薦閱讀:

第三節:簡單的數據處理和分析(2)
大數據「殺熟」,懂你才能更狠的「宰」你,蘋果用戶扎心了。
中華財寶:珠寶行業在大數據時代該如何前行?
《數據架構》閱讀筆記(七)重複型分析
如何利用八爪魚,實現餐飲大數據(以辰智商圈秀為例)

TAG:機器學習 | 大數據 | 特徵工程 |