Kaggle Categorical Encoding 3大絕招

Leave-One-Out Encoding, Beta Target Encoding 跟 Generalized Linear Mixed Model Encoding簡介

倢愷 Oscar
9 min readApr 19, 2021

--

在機器學習的特徵處理步驟中,我們必定會經歷的一步就是把 類別型特徵(Categorical Features)轉換成 數值型特徵(Numerical Features),而這一步就稱為Categorical Encoding

在我的前一篇文章中,已經解釋了為甚麼我們大多時候都不應該使用One-Hot Encoding,然而這是在台灣ML書籍、課程中最主流教的Categorical Encoding,也介紹了兩個非常Baseline、通常效果不錯的Categorical Encoding — Frequency Encoding跟Target Encoding,如果還沒有看過上一篇文章的話建議大家先去複習一下相關內容~

實際上在大部分的機器學習Project中我都只使用上面兩種Categorical Encoding的方法,不然就是依賴Domain Knowledge自行設計針對這個dataset的Categorical Encoding的方法。

而在這篇文章我會額外簡介3種我有使用過,並且曾經在Kaggle或是實務上出奇效的方法!!

這篇文章我會介紹1. Leave-One-Out Encoding
2. Beta Target Encoding
3. Generalized Linear Mixed Model Encoding

Leave-One-Out Encoding

在前一篇文章我有提到,Target Encoding使用上需要注意的點

因為我們算的是 Target value (Label)的 Mean(平均值),我們要對Outlier特別注意。

因為每個人都知道,平均值在有Outlier存在時,特別不準確,就像是台灣平均年薪調查超過60W,全台薪資中位數卻不足50W,這就是Outlier對統計量影響。

同時偶爾我們使用Target Encoding的時候會發現,Model對於Target Encoding的結果過於敏感,因為我們Target Encoding完會對同一個類別的資料給完全相同的值,這導致我們model看到的數值變化很少。

Leave-One-Out Encoding(後簡稱LOO Encoding)就是想設計一些方法來減低 Model 對於 Target Encoding過於敏感的問題。

LOO Encoding的做法相當簡單,跟Target Encoding步驟一模一樣,只有在對每一筆Data的Feature算Target平均值時,去除掉自己這筆Data的Target,也就是說只拿「其他跟我同類別的資料的Target來計算

重新看Target Encoding的計算方法

Target Encoding

如果使用LOO Encoding,則會變成這樣

Leave-One-Out Encoding

這邊可以看到一個小細節,像是「藍色」這種只出現一次的類別,做Leave-One-Out他沒有其他資料可以拿來做平均,所以遇到這種只出現一次的類別時,會直接拿他的Target Value來填入。(圖上避免混淆我先略過)

LOO Encoding一樣在Category Encoders這個Package裡面有支援,使用方法跟所有sklearn的feature transform一樣。

import category_encoders as ceencoder = ce.LeaveOneOutEncoder(cols=[...])encoder.fit(X, y)
X_cleaned = encoder.transform(X_dirty)

在使用LOO Encoding的時候有一個非常重要的Hyperparameter : sigma

encoder = ce.LeaveOneOutEncoder(cols=[...], sigma = 0.05)

如果有指定sigma的話,在算LOO的平均值時,會在每個Target值上加一個random noise,而這個noise是一個mean = 0, standard deviation = sigma的normal distribution。

也就是說

sigma會讓我們LOO Encoding得到的值有些微變化,而這個些微變化往往能夠讓我們Model變更穩定

sigma官方推薦給定0.6~0.05之間的值,不過我都直接GridSearch試試看,通常有給都會比沒給還要好一小截!!!

Beta Target Encoding

Beta Target Encoding(後簡稱 BTE),基本上流程也跟Target Encoding一模一樣,改變的是,我們在Target Encoding時最終只抓取「平均值」這個統計量,而BTE認為除了平均值以外,其他統計量也都很有意義。

所以 BTE就是拓展 Target Encoding到更多的統計量上

而使用Beta Distribution的理由最主要就是Beta Distribution是Bernoulli Distribution的共軛分布,而當我們做Binary Classification的時候,Target本身就可以視為是Bernoulli Distribution。(這邊過多數學細節,不是我要強調的重點,有興趣可以參考machine learning a probabilistic perspective draft P.109)

BTE會紅起來最主要是在Kaggle Avito Demand Prediction Challenge中,第14名(top 1%)的選手公布了這個方法,並且顯現了在LightGBM上達到顯著的改善。

https://mattmotoki.github.io/beta-target-encoding.html

順帶一提,Kaggle Avito Demand Prediction Challenge雖然已經是3年前的比賽了,但是其數據的複雜性,即便放到現在仍然是極困難的問題,包含著圖像、文字、地理位置、Unlabeled data …

而BTE目前要使用,我也仍然是使用這個選手的Implementation。

實際上我自己也不少用BTE,因為原本Target Encoding只使用Mean這個做法本身就很直覺可以拓展到更多的統計量,而大部分都是有益無害的事情。非常推薦大家使用。

具體作者的介紹可以看這篇(比較多數學)

Generalized linear mixed model

最後這個方法我是在Category Encoders這個Package裡面發現的,簡而言之,就是他使用Generalized Linear Model來分析我們的Catergorical Features。

具體的數學很複雜,加上Generalized Linear Model也在我後期會寫的文章規劃中,所以這邊我先跳過細節。

不過可以想Target Encoding跟BTE、LOO Encoding的核心都還是統計,而GLM其實是在統計上使用像是Linear Regression的方法,比純粹算各種統計量更有彈性,但是又不會過於複雜到難以理解。

而Generalized Linear Mixed Model(簡稱GLMM)最大的好處就是,GLMM幾乎不用調參數。

就像我在Clustering裡面提到HDBSCAN的一大好處是Hyperparamters只剩一個一調,大部分的ML方法如果要調的Hyperparamters變少,但是效果依舊不錯的話,那這就會是一個非常好用的方法。

而我最看重GLMM的就是這個性值,不用調Hyperparameters,但是效果依然Robust。

import category_encoders as ceencoder = ce.GLMMEncoder(cols=[...])encoder.fit(X, y)
X_cleaned = encoder.transform(X_dirty)

不過這邊要注意一件事,就是binomial_target這個Argument一般我都會給

binomial_target = True 代表我們做的是Classification
binomial_target = False 代表我們做的是Regression
如果沒有給的話他會自己分析,在一些比較複雜的情況會出錯(Ex Classification剛好Target是數值,並且有比較多個類別)

這次講了3個比較冷門但是好用的Categorical Encoding,我在兩年前左右就把這三個方法加到我的ML pipeline中,而在很多問題上都有比Target Encoding更好的效果,更不用講跟One-Hot Encoding比了XD

但是相對像是GLMM的處理時間會比較久,我自己相對少用。

其他還有很多Categorical Encoding的方法我沒用過,大家可以自己從Category Encoders裡面研究。

如果喜歡這篇文章可以幫我多拍手幾次XD,或是對於哪個類型文章有興趣都可以在留言區跟我講~ 後續會以中難度的ML/DS/AI知識為主,以及AI/HCI研究相關知識

我現在在整理一般課程、書籍不會提到但是很重要的DS、ML知識,有興趣可以關注我,並且隨時關注我的文章目錄。

參考資料

Beta Target Encoding : https://mattmotoki.github.io/beta-target-encoding.html

--

--

倢愷 Oscar

我是倢愷,CTO at TeraThinker an AI Adaptive Learning System Company。AI/HCI研究者,超過100場的ML、DL演講、workshop經驗。主要學習如何將AI落地於業界。 有家教、演講合作,可以email跟我聯絡:axk51013@gmail.com