【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost
Python機器學習算法實現
Author:louwill
Machine Learning Lab
? ? ?
本文介紹GBDT系列的最后一個強大的工程實現模型——CatBoost。CatBoost與XGBoost、LightGBM并稱為GBDT框架下三大主流模型。CatBoost是俄羅斯搜索巨頭公司Yandex于2017年開源出來的一款GBDT計算框架,因其能夠高效處理數據中的類別特征而取名為CatBoost(Categorical+Boosting)。相較于XGBoost和LightGBM,CatBoost的主要創新點在于類別特征處理和排序提升(Ordered Boosting)。?
處理類別型特征
對于類別特征的處理是CatBoost的一大特點,這也是其命名的由來。CatBoost通過對常規的目標變量統計方法添加先驗項來對其進行改進。除此之外,CatBoost還考慮使用類別特征的不同組合來擴大數據集特征維度。
通用處理方法
類別型特征在結構化數據集中是一個非常普遍的特征。這類特征區別于常見的數值型特征,它是一個離散的集合,比如說性別(男、女),學歷(本科、碩士、博士等),地點(杭州、北京、上海等),有些時候我們還會碰到幾十上百個取值的類別特征。
對于類別型特征,以往最通用的方法就是one-hot編碼,如果類別型特征取值數目較少的話,one-hot編碼不失為一種比較高效的方法。但當類別型特征取值數目較多的話,one-hot編碼就不劃算了,它會產生大量冗余特征,試想一下一個類別數目為100個的類別型特征,one-hot編碼會產生100個稀疏特征,茫茫零海中的一個1,這對訓練算法本身而言就是個累贅。
所以,對于特征取值數目較多的類別型特征,一種折中的方法是將類別數目進行重新歸類,使其類別數目降到較少數目再進行one-hot編碼。另一種最常用的方法則是目標變量統計(Target Statisitics,TS),TS計算每個類別對于的目標變量的期望值并將類別特征轉換為新的數值特征。CatBoost在常規TS方法上做了改進。
目標變量統計
CatBoost算法設計一個最大的目的就是要更好的處理GBDT特征中的類別特征。常規的TS方法最直接的做法就是將類別對應的標簽平均值來進行替換。在GBDT構建決策樹的過程中,替換后的類別標簽平均值作為節點分裂的標準,這種做法也被稱為Greedy Target-based Statistics , 簡稱Greedy TS,其計算公式可表示為:
Greedy TS一個比較明顯的缺陷就是當特征比標簽包含更多信息時,統一用標簽平均值來代替分類特征表達的話,訓練集和測試集可能會因為數據分布不一樣而產生條件偏移問題。CatBoost對Greedy TS方法的改進就是添加先驗分布項,用以減少噪聲和低頻類別型數據對于數據分布的影響。改進后的Greedy TS方法數學表達如下:
其中為添加的先驗項,為大于的權重系數。
除了上述方法之外,CatBoost還提供了Holdout TS、Leave-one-out TS、Ordered TS等幾種改進的TS方法,這里不一一詳述。
特征組合
CatBoost另外一種對類別特征處理方法的創新在于可以構建任意幾個類別型特征的任意組合為新的特征。比如說用戶ID和廣告主題之間的聯合信息。如果單純地將二者轉換為數值特征,二者之間的聯合信息可能就會丟失掉。CatBoost則考慮將這兩個分類特征進行組合構成新的分類特征。但組合的數量會隨著數據集中類別型特征的數量成指數增長,因此不可能考慮所有的組合。
所以,CatBoost在構建新的分裂節點時,會采用貪心的策略考慮特征之間的組合。CatBoost將當前樹的所有組合、類別型特征與數據集中的所有類別型特征相結合,并將新的類別組合型特征動態地轉換為數值型特征。
預測偏移與排序提升
CatBoost另一大創新點在于提出使用排序提升(Ordered Boosting)的方法解決預測偏移(Prediction Shift)的問題。
預測偏移
所謂預測偏移,即訓練樣本的分布與測試樣本的分布之間產生的偏移。
CatBoost首次揭示了梯度提升中的預測偏移問題。認為預測偏移就像是TS處理方法一樣,是由一種特殊的特征target leakage和梯度偏差造成的,我們來看一下在梯度提升過程中這種預測偏移是這么傳遞的。
假設前一輪訓練得到強學習器為,當前損失函數為,則本輪迭代則要擬合的弱學習器為:
進一步的梯度表達為:
的數據近似表達為:
最終的鏈式的預測偏移可以描述為:
梯度的條件分布和測試數據的分布存在偏移;
的數據近似估計與梯度表達式之間存在偏差;
預測偏移會影響到的泛化性能。
排序提升
CatBoost采用基于Ordered TS的Ordered Boosting方法來處理預測偏移問題。排序提升算法流程如下圖所示。
對于訓練數據,排序提升先生成一個隨機排列,隨機配列用于之后的模型訓練,即在訓練第個模型時,使用排列中前個樣本進行訓練。在迭代過程中,為得到第個樣本的殘差估計值,使用第個模型進行估計。
但這種訓練個模型的做法會大大增加內存消耗和時間復雜度,實際上可操作性不強。因此,CatBoost在以決策樹為基學習器的梯度提升算法的基礎上,對這種排序提升算法進行了改進。
CatBoost提供了兩種Boosting模式,Ordered和Plain。Plain就是在標準的GBDT算法上內置了排序TS操作。而Ordered模式則是則排序提升算法上做出了改進。
完整的Ordered模式描述如下:CatBoost對訓練集產生個獨立隨機序列用來定義和評估樹結構的分裂,用來計算分裂所得到葉子節點的值。CatBoost采用對稱樹作為基學習器,對稱意味著在樹的同一層,其分裂標準都是相同的。對稱樹具有平衡、不易過擬合并能夠大大減少測試時間的特點。CatBoost構建樹的算法流程如下圖所示。
在Ordered模式學習過程中:
我們訓練了一個模型,其中表示在序列中前個樣本學習得到的模型對于第個樣本的預測。
在每一次迭代中,算法從中抽樣一個序列,并基于此構建第步的學習樹。
基于計算對應梯度。
使用余弦相似度來近似梯度,對于每個樣本,取梯度。
在評估候選分裂節點過程中,第個樣本的葉子節點值由與同屬一個葉子的的所有樣本的前個樣本的梯度值求平均得到。
當第步迭代的樹結構確定以后,便可用其來提升所有模型。
注:這一段比較晦澀難懂,筆者也沒有完全深入理解,建議各位讀者一定去讀一下CatBoost論文原文。
基于構建樹算法的完整CatBoost算法流程如下圖所示。
除了類別特征處理和排序提升以外,CatBoost還有許多其他亮點。比如說基于對稱樹(Oblivious Trees)的基學習器,提供多GPU訓練加速支持等。
CatBoost與XGBoost、LightGBM對比
CatBoost與LightGBM開源前后時間相差不到3個月,二者都是在XGBoost基礎上做出的改進和優化。除了算法整體性能上的差異之外,基于CatBoost最主要的類別型特征處理特色,三者的主要差異如下:
CatBoost支持最全面的類別型特征處理,可直接傳入類別型特征所在列標識然后進行自動化處理。
LightGBM同樣也支持對類別型特征的快速處理,訓練時傳入類別型特征列所在標識符即可。但LightGBM對于類別特征只是采用直接的硬編碼處理,雖然速度較快但不如CatBoost的處理方法細致。
XGBoost作為最早的GBDT工程實現,其本身并不支持處理類別型特征,只能傳入數值型數據。所以一般都需要手動對類別型特征進行one-hot等預處理。
CatBoost論文也給出了在多個開源數據集上與XGBoost和LightGBM性能對比。如下圖所示。
CatBoost算法實現
? 手動實現一個CatBoost系統過于復雜,限于時間精力這里筆者選擇放棄。CatBoost源? ? 碼可參考:
https://github.com/catboost/catboost
CatBoost官方為我們提供相關的開源實現庫catboost,直接pip安裝即可。
下面以catboost一個分類例子作為演示。完整的catboost用法文檔參考:
https://catboost.ai/docs/concepts/tutorials.html
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split import catboost as cb from sklearn.metrics import f1_score# 讀取數據 data = pd.read_csv('./adult.data', header=None) # 變量重命名 data.columns = ['age', 'workclass', 'fnlwgt', 'education', 'education-num', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'capital-gain', 'capital-loss', 'hours-per-week', 'native-country', 'income'] # 標簽轉換 data['income'] = data['income'].astype("category").cat.codes # 劃分數據集 X_train, X_test, y_train, y_test = train_test_split(data.drop(['income'], axis=1), data['income'],random_state=10, test_size=0.3) # 配置訓練參數 clf = cb.CatBoostClassifier(eval_metric="AUC", depth=4, iterations=500, l2_leaf_reg=1,learning_rate=0.1) # 類別特征索引 cat_features_index = [1, 3, 5, 6, 7, 8, 9, 13] # 訓練 clf.fit(X_train, y_train, cat_features=cat_features_index) # 預測 y_pred = clf.predict(X_test) # 測試集f1得分 print(f1_score(y_test, y_pred))參考資料:
https://catboost.ai/
CatBoost: unbiased boosting with categorical features
往期精彩:
數學推導+純Python實現機器學習算法24:LightGBM
數學推導+純Python實現機器學習算法23:kmeans聚類
數學推導+純Python實現機器學習算法22:最大熵模型
數學推導+純Python實現機器學習算法21:馬爾科夫鏈蒙特卡洛
數學推導+純Python實現機器學習算法20:LDA線性判別分析
數學推導+純Python實現機器學習算法19:PCA降維
數學推導+純Python實現機器學習算法18:奇異值分解SVD
數學推導+純Python實現機器學習算法17:XGBoost
數學推導+純Python實現機器學習算法16:Adaboost
數學推導+純Python實現機器學習算法15:GBDT
數學推導+純Python實現機器學習算法14:Ridge嶺回歸
數學推導+純Python實現機器學習算法13:Lasso回歸
數學推導+純Python實現機器學習算法12:貝葉斯網絡
數學推導+純Python實現機器學習算法11:樸素貝葉斯
數學推導+純Python實現機器學習算法10:線性不可分支持向量機
數學推導+純Python實現機器學習算法8-9:線性可分支持向量機和線性支持向量機
數學推導+純Python實現機器學習算法7:神經網絡
數學推導+純Python實現機器學習算法6:感知機
數學推導+純Python實現機器學習算法5:決策樹之CART算法
數學推導+純Python實現機器學習算法4:決策樹之ID3算法
數學推導+純Python實現機器學習算法3:k近鄰
數學推導+純Python實現機器學習算法2:邏輯回歸
數學推導+純Python實現機器學習算法1:線性回歸
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群: 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【面试招聘】据说这里有一份关于BAT的
- 下一篇: 【机器学习基础】机器学习模型的度量选择(