問題引入
在作特徵工程的時候,都會使用到one_hot編碼,編碼能夠解決某些不能被數值化的問題,可是這種編碼會帶來不少問題,這點以前已經說過,那麼如何解決這個問題呢?git
問題解答
- 類別特徵的最優切分。這個方法須要對應工具的支持,我所知的支持這個方法的工具備h2o.gbm和LightGBM,用LightGBM能夠直接輸入類別特徵,併產生同圖1右邊的最優切分。在一個k維的類別特徵尋找最優切分,樸素的枚舉算法的複雜度是指數的 O(2^k)。LightGBM 用了一個 O(klogk)[1] 的算法。算法流程如圖2所示:在枚舉分割點以前,先把直方圖按照每一個類別對應的label均值進行排序;而後按照排序的結果依次枚舉最優分割點。固然,這個方法很容易過擬合,因此LightGBM裏面還增長了不少對於這個方法的約束和正則化。圖3是一個簡單的對比實驗,能夠看到Optimal的切分方法在AUC提升了1.5個點,而且時間只多了20% 。
- 轉成數值特徵。在使用 sklearn 或 XGBoost 等不支持類別特徵的最優切分工具時,能夠用這個方法。常見的轉換方法有: a) 把類別特徵轉成one-hot coding扔到NN裏訓練個embedding;b) 相似於CTR特徵,統計每一個類別對應的label(訓練目標)的均值。統計的時候有一些小技巧,好比不把自身的label算進去(leave-me-out, leave-one-out)統計, 防止信息泄露。
- 其餘的編碼方法,好比binary coding等等,一樣能夠用於不支持類別特徵的算法。這裏有一個比較好的開源項目,封裝了常見的各類編碼方法: https://github.com/scikit-learn-contrib/category_encoders
喜歡就關注一下啦~~~github