catboost學習筆記



原文鏈接

優勢對比

CatBoost和XGBoost、LightGBM並稱為GBDT的三大主流神器,都是在GBDT算法框架下的一種改進實現。

正如其名字所說那樣,CatBoost主要是在類別特征上的處理上做了很多的改進。

從用戶使用角度來看,相比XGBoost和LightGBM,CatBoost具有如下特點。

模型精度:XGBoost和LightGBM相當,CatBoost往往略好一些,無需調參即可獲取很好的結果。
訓練速度:LightGBM遠快於XGBoost,CatBoost快於XGBoost但比LightGBM慢。
預測速度:LightGBM與XGBoost相當,CatBoost遠快於LightGBM與XGBoost,是它們的幾十分之一。
內存消耗:LightGBM遠小於XGBoost,CatBoost小於XGBoost,但大於LightGBM。
類別特征:XGBoost不支持類別特征,需要OneHot編碼預處理。LightGBM支持類別特征,需轉換成整數編碼。CatBoost提供更強大的對類別特征的支持,直接支持字符串類型的類別特征,無需預處理。
缺失值特征:XGBoost和LightGBM都可以自動處理特征缺失值,CatBoost不能自動處理缺失值(或者將缺失值視為最小值/最大值)。
GPU支持:LightGBM與CatBoost支持GPU訓練,XGBoost不支持GPU訓練。
可視化:CatBoost還自帶一套可視化工具,可以在Jupyter Notebook或者TensorBoard中實時看到指標變化。

創新點

CatBoost主要創新點如下:

1.類別特征的 Ordered Target Statistics 數值編碼方法。

其次,它用特殊的方式處理categorical features。
首先他們會計算一些數據的statistics。計算某個category出現的頻率,加上超參數,生成新的numerical features。這一策略要求同一標簽數據不能排列在一起(即先全是0之后全是1這種方式),訓練之前需要打亂數據集。
第二,使用數據的不同排列(實際上是4個)。在每一輪建立樹之前,先扔一輪骰子,決定使用哪個排列來生成樹。
第三,考慮使用categorical features的不同組合。例如顏色和種類組合起來,可以構成類似於blue dog這樣的feature。當需要組合的categorical features變多時,catboost只考慮一部分combinations。在選擇第一個節點時,只考慮選擇一個feature,例如A。在生成第二個節點時,考慮A和任意一個categorical feature的組合,選擇其中最好的。就這樣使用貪心算法生成combinations。
第四,除非向gender這種維數很小的情況,不建議自己生成one-hot vectors,最好交給算法來處理。參考

target statistic詳解

1.1 什么是預測偏移?
在GBDT一類模型中,弱學習器模型均在同一完整訓練集上訓練,然后不斷提升成強學習器,但如果訓練集和測試集存在分布不一致,模型就會過擬合訓練集而在測試集上表現不好 (即預測偏移到訓練集上),預測偏移也算是目標泄露 (Target Leakage)的一種。
預測偏移發生在哪里?
預測偏移發生在兩個地方:類別特征編碼和梯度提升方法。
(1) 類別特征編碼中的預測偏移

  1. GBDT:直接把類別型當作連續型數據對待。

  2. XGBoost:建議提前對類別特征One-hot編碼后再輸入模型。

  3. LightGBM:在每步梯度提升下,將類別特征轉為GS (梯度統計Gradient Statistics)。注:很對不起,【務實基礎】LightGBM 中 “5. 支持類別特征” 這塊存在錯誤,LGBM不是采用TS編碼 (目標統計Target Statistics,即平均值\(\frac{\operatorname{sum}(y)}{\operatorname{count}(y)}\),而是GS編碼,將類別特征轉為累積值\(\frac{\operatorname{sum}(\text { gradient })}{\operatorname{sum}(\text { hessian })}\), (一階偏導數之和/二階偏導數之和)再進行直方圖特征排序 [2]。

雖然LGBM用GS編碼類別特征看起來挺厲害的,但是存在兩個問題:

計算時間長:因為每輪都要為每個類別值進行GS計算。
內存消耗大:對於每次分裂,都存儲給定類別特征下,它不同樣本划分到不同葉節點的索引信息。
為了克服以上問題,LGBM將長尾特征聚集到一類,但也因此丟失了部分信息。對此,Catboost作者認為,LGBM的GS沒有TS好,因為TS省空間且速度快,每個類別存一個數就好了。但TS不是完美的,因為它存在預測偏移。這很明顯,因為TS是依賴訓練集的目標標簽進行類別特征編碼(算是目標泄露),如果訓練集和測試集分布過大,那么類別編碼就會偏移向訓練集,導致模型的通用性差。

如果我們要了解“預測偏移是怎么發生在TS類別特征編碼 (也稱目標編碼Target Encoding) 過程當中?”,我們得先了解下TS的編碼機制。

一個有效且高效處理類別型特征的方法是用一個 TS編碼的數值型變量 \(\hat{x}_{i}^{k}\) 來替代第 \(k\) 個訓練樣本的 類別 \(x_{i}^{k}\) 。通常來說, TS是基於類別的目標變量 \(\mathrm{y}\) 的期望來進行估算: \(\hat{x} i^{k} \approx \mathbb{E}\left(y \mid x^{i}=x_{k}^{i}\right)\) 。 直白來說, \(\hat{x} i^{k}\)\(\mathrm{TS}\) 編碼值, \(\mathbb{E}\left(y \mid x^{i}=x_{k}^{i}\right)\) 是基於目標變量y估算函數。

圖1: Greedy TS編碼方式
估算函數最直接方式就是采用訓練集中相同類別的 \(x_{i}^{k}\) 樣本的目標變量y的平均值, 如上圖所示。 這種估算方式在低基類別上有噪聲, 因此常常會加先驗概率p進行平滑:

\[\hat{x} i^{k}=\frac{\sum_{j=1}^{n} \mathbb{I}_{\left\{x j^{i}=x_{k}^{i}\right\}} \cdot y_{j}+a p}{\sum_{j=1}^{n} \mathbb{I}_{\left\{x j^{i}=x_{k}^{i}\right\}}+a} \]

i指示類別i, \(\mathrm{k}\) 指示樣本 \(\mathrm{k}\) 。而 \(\mathbb{I}\left\{x j^{i}=x_{k}^{i}\right\}\) 的意思是判斷:當前樣本j是否與樣本 \(\mathrm{k}\) 是同一類別i, 如果是則為 1 , 反之則為 0 。而先驗概率 \(p\) 為數據集所有目標值的均值, \(\alpha\) 是控制先驗參與編碼的 權重。
現在, 我們舉個具體的例子, 看下預測偏移是怎么影響模型通用性。假設特征為類別型且它的值 都是獨特的 (unique)。那么如果TS編碼就會發生嚴重的目標泄露, 如下圖所示:

圖2: Greedy TS編碼出現目標泄露的樣例
有幾種方法可以避免條件偏移 (Conditional shift)。其中一個通用的想法是為x_k計算其TS時, 用 除去 \(x_{k}\) 后的樣本集 \(D_{k}\) 去計算, \(D_{k} \subset D \backslash\left\{x_{k}\right\}\)

\[\hat{x} i^{k}=\frac{\sum_{x_{j} \in D_{k}} \mathbb{I}\left\{x j^{i}=x k^{i}\right\} \cdot y_{j}+a p}{\sum_{x_{j} \in D_{k}} \mathbb{I}\left\{x j^{i}=x k^{i}\right\}+a} \]

(2) 梯度提升方法中的預測偏移
我們已經知道TS因目標泄露帶來預測偏移。那接下來, 我們來看下GBDT一類模型中, 它們梯度提 升方法里的預測偏移是在哪發生的。我們先簡單回顧下GBDT的梯度提升方法。假設我們上一輪獲 得強學習器 \(F^{t-1}\), 那么, 當前第 \(\mathrm{t}\) 輪下的強學習器為: \(F^{t}=F^{t-1}+\alpha h^{t} 。 h^{t}\) 為第t輪的弱 學習器, \(\alpha\) 為學習率。 \(h^{t}\) 目標是使損失函數最小化:

\[h^{t}=\underset{h \in H}{\operatorname{argmin}} L\left(F^{t-1}+h\right)=\underset{h \in H}{\operatorname{argmin}} \mathbb{E} L\left(y, F^{t-1}(x)+h(x)\right) \]

最小化問題可通過牛頓法或梯度下降求解。在梯度下降中, GBDT是用損失函數的負梯度去幫助擬 合, 負梯度如下:

\[g^{t}(x, y):=-\left.\frac{\partial L(y, s)}{\partial s}\right|_{s=F^{t-1}(x)} \]

還記得我在之前文章里說過, GBDT當前輪的弱學習器是擬合上一輪的負梯度值, 因此, \(h^{t}\) 可以 為:

\[h^{t}=\underset{h \in H}{\operatorname{argmin}} \mathbb{E}\left(-g^{t}(x, y)-h(x)\right)^{2} \]

如果訓練集和測試集分布不一致, 那么用訓練集得到的梯度值分布就跟測試集的梯度值分布不一 致, 那么便會有預測偏移, 最終影響了模型的通用性。

order taget statistic

Catboost針對類別特征TS編碼時發生的預測偏移采用了Ordered TS方法,針對梯度提升方法中的偏移采用Ordered Boosting方法。
a: Ordered TS
之前在背景里有講Greedy TS的編碼思路,但其實還有其它TS編碼方式。這里,我根據論文整理了下Greedy TS、Holdout TS和Leave-one-out TS的編碼思路對比圖如下:

圖3:其它常見TS編碼方式對比圖
我們發現, 常見的TS的編碼方式沒有平衡好"充分利用數據集“和"目標泄露“。Catboost作者受到 在線學習算法 (即隨時間變化不斷獲取訓練集) 的啟發, 提出了Ordered TS。Ordered TS是基於排 序原則, 對於每個樣本的TS編碼計算式依賴於可觀測的樣本。為了使這個想法符合標准線下設 定, 作者人為構造了"時間"。具體步驟如下:
(1) 隨機打亂訓練集, 獲取一個隨機排列順序 \(\sigma\)
(2) 在訓練集中, 用 \(x_{k}\) 的"歷史"樣本去計算樣本 \(x_{k}\) 的TS, 即訓練集采用 \(D_{k}=\left\{x_{j}: \sigma(j)<\sigma(k)\right\}\)
(3) 在測試集中, 用全測試集數據去計算 \(x_{k}\)\(\mathrm{TS}\)
該方法既充分利用了數據集, 又避免了目標泄露。 \(D_{k}=D\) 注意如果只用一個隨機排列順序, 那 么最高進行 \(T S\) 編碼的樣本會比后面才TS編碼的樣本具有更高方差 (即先編碼比后編碼更欠擬合), 因此, Catboost在不同梯度提升輪數中采用不同的排列順序去計算 \(\mathrm{TS}\), 這樣模型的方差會變低, 利於擬合。
為了方便理解,我畫了個Ordered TS的計算樣例圖:

其余參考推斷參考:https://zhuanlan.zhihu.com/p/346420728

2.基於貪心策略的特征組合方法。

3.避免預測偏移的 Ordered Boosting 方法。

4.使用對稱二叉樹作為基模型,有正則作用且預測極快。

Catboost使用對稱樹。XGboost一層一層地建立節點,lightGBM一個一個地建立節點,而Catboost總是使用完全二叉樹。它的節點是鏡像的。Catboost稱對稱樹有利於避免overfit,增加可靠性,並且能大大加速預測等等。
具體可以參考這篇文章:https://www.zhihu.com/question/311641149/answer/593286799

原理推導

個人覺得這個寫的很詳細,看上去是讀過原文的https://zhuanlan.zhihu.com/p/102570430?utm_source=qq

代碼實現

https://catboost.ai/en/docs/concepts/python-installation

參考文章
Anna Veronika Dorogush, Andrey Gulin, Gleb Gusev, Nikita Kazeev, Liudmila Ostroumova Prokhorenkova, Aleksandr Vorobev "Fighting biases with dynamic boosting". arXiv:1706.09516, 2017
Anna Veronika Dorogush, Vasily Ershov, Andrey Gulin "CatBoost: gradient boosting with categorical features support". Workshop on ML Systems at NIPS 2017


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM