一步步透視 GBDT Classifier
TL;DR
- 訓練完的 GBDT 是由多棵樹組成的 function set $f_1(x), …,f_{M}(x)$
- $F_M(x) = F_0(x) + \nu\sum^M_{i=1}f_i(x)$
- 訓練中的 GBDT,每棵新樹 $f_m(x)$ 都去擬合 target $y$ 與 $F_{m-1}(x)$ 的 $residual$,也就是 $\textit{gradient decent}$ 的方向
- $F_m(x) = F_{m-1}(x) + \nu f_m(x)$
- GBDT classifier 常用的 loss function 為 cross entropy
- classifier $F(x)$ 輸出的是 $log(odds)$,但衡量 $residual$ 跟 $probability$ 有關,得將 $F(x)$ 通過 $\textit{sigmoid function }$ 獲得 probability
- $p = \sigma(F(x))$
GBDT 簡介在 一步步透視 GBDT Regression Tree
直接進入正題吧
GBDT Algorithm - step by step
GBDT classification tree algorithm 跟 regression tree 並無不同
Input Dat and Loss Function
Input Data $\{(x_i, y_i)\}^n_{i=1}$ and a differentiable Loss Function $L(y_i, F(x))$
Data
- target $y_i$: who loves Troll2
- features of $x_i$: “likes popcorn”, “Age”, “favorite”
Our goal is using $x_i$ to predict someone like Trolls 2 or not
loss function 為 cross entropy
值得注意的是,GBDT - classifier $F(x)$ 輸出的是 $log(odds)$ 而不是 $probability$
要將 $F(x)$ 輸出轉換成 $probability$,得將他通過 $\textit{sigmoide function}$
$log(odds)$ 轉換成 $probability$ 公式
Step 1 Initial model with a constant value $F_0(X)$
初始 GBDT 模型的 $F_0(x)$ 直接計算 loves_troll 的 $log(odds)$ 即可
計算完,得到 $F_0(x) = 0.69$,每個 data point 的初始 prediction 都一樣就是 $F_0(x)$。
$F_0(x)$ 是 $\log(odds)$ 若要計算 probability of loving Troll 2 呢?
$\textit{Probability of loving Troll 2} = 0.67$ , 初始值每個 data sample 的 probability 都一樣。
- ep_0_pre 表 epoch 0 時 data sample $x$ 的 prediction, $F_0(x)$ 的輸出是 $log(odds)$
- ep_0_prob 表 epoch 0 時 data sample $x$ 的 probability loving Troll 2
Step2
For $m=1$ to $M$,重複做以下的事
- (A) calculate residuals of $F_{m-1}(x)$
- (B) construct new regression tree $f_m(x)$
- (C) compute each leaf node’s output of new tree $f_m(x)$
- (D) update $F_m(x)$ with new tree $f_m(x)$
At Epoch m = 1
(A) Calculate Residuals of $F_{0}(x)$
classification 問題中 residual 為 predicted probability 與 observed label $y$ 之間的差距
$residual = observed - \textit{predicted probability}$
- true label 為 1
- false label 為 0
注意!! 當我們再說 residual 時,是 derived from probability,而 $F(x)$ 輸出的是 $log(odds)$
計算各 data sample 的 residual 後:
- ep_0_pre 表 $F_0(x)$ 的輸出 $log(odds)$
- ep_0_prob 表 $F_0(x)$ predicted probability,$\sigma(F_0(x))$
- ep_1_residual 表 target label lovel_trolls2 與 ep_0_prob 間的 residual
(B) Construct New Regression Tree $f_1(x)$
此階段要建立新樹擬合 (A) 算出的 residual,用 columns: “like_popcorn”, “age”, “favorite_color” 擬合 ep_1_residual 來建新樹 $f_1(x)$
建樹為一般 fit regression tree 的過程,criterion 為 mean square error,假設找到的樹結構為
可以看到綠色為 leaf node,所有的 data sample $x$ 都被歸到特定 leaf node 下
- ep_1_leaf_index 表 data sample $x_i$ 所屬的 leaf node index
(C) Compute Each Leaf Node’s Output of New Tree $f_1(x)$
現在每個 leaf node 下有數個 data sample $x$ ,但每個 leaf node 只能有一個值作為輸出, 決定每個 leaf node 的輸出公式如下
- 分子是 each leaf node 下的 data sample $x$ 的 residual 和
- 分母的 previous probability 為 $m -1$ 步 GBDT 輸出的 probability $p = \sigma(F(x))$ 。
在這個 epoch 是指 $F_0(x)$
經過計算後,每個 leaf node 輸出
- ep_0_prob 表 $\sigma(F_0(x))$ 計算出的 probability of loving Troll2
- ep_1_residual 表 new tree $f_1(x)$ 要擬合的 residual ,其值來自 love_troll2 - ep_0_prob
- ep_1_leaf_output 表 data sample $x$ 在 tree $f_1(x)$ 中的輸出值,相同的 leaf node 下會有一樣的值
(D) update $F_1(x)$ with new tree $f_1(x)$
現在 epoch $m=1$,只建成一顆樹 $f_1(x)$ , 所以 GBDT classifier 輸出 $log(odds)$ 為
輸出的 probability 為 $\sigma(F_1(x))$
令 $\textit{learnign rate = 0.8}$,得到 epoch 2 每個 data sample 的 $\log(odds)$ prediction 與 probability prediction
- ep_1_pre 為 $F_1(x)$ 輸出的 $log(odds)$
- ep_1_prob 為 $F_1(x)$ 輸出的 probability $\sigma(F_1(x))$
At Epoch m = 2
(A) Calculate Residuals of $F_1(x)$
計算上一步 $\textit{residual of } F_1(X)$
- ep_1_prob 表 $F_1(x)$ 輸出的 $probability$ $\sigma(F_1(x))$
- ep_2_residual 表 target love_troll2 與 ep_1_prob 間的 $residual$
(B) Construct New Regression Tree $f_2(x)$
用 data sample x 的 columns “like_popcor”, “age”, “favorite_color” 擬合 ep_2_residual build a new tree $f_2(x)$
假設得到 $f_2(x)$ 的樹結構:
每個 data sample 對應的 leaf index
- ep_2_leaf_index 表 data sample 對應到 $f_2(x)$ 上的 leaf node index
(D) Compute Each Leaf Node’s Output of New Tree $f_2(x)$
計算 $f_2(x)$ 下每個 leaf node 的輸出:
對應到 data sample 上:
- ep_2_leaf_output 表 data sample $x$ 在 $f_2(x)$ 的輸出值,相同 leaf node 下會有一樣的值
Update $F_2(x)$ with New Tree $f_2(x)$
到目前為止,總共建立了兩顆樹 $f_1(x), f_2(x)$,所以 GBDT 輸出的 $log(odds)$為
$F_2(x) = F_0(x) + \nu(f_1(x) + f_2(x))$
- $\nu$ 為 learning rate,假設為 0.8
GBDT 輸出的 probability 為 $\sigma(F_2(x))$,計算 epoch 2 的 prediction of probability of loving troll2:
- love_toll2: our target
- ep_0_pre 表 $F_0(x)$
- ep_1_leaf_output 表 data sample x 在第一顆樹 $f_1(x)$ 的輸出值
- ep_2_leaf_output 表 data sample x 在第二顆樹 $f_2(x)$ 的輸出值
- ep_2_pre 表 $F_2(x)$ 對 data sample x 輸出的 $log(odds)$
- ep_2_prob 表 $F_2(x)$ 對 data sample x 的 probability: $\sigma(F_2(x))$
Step 3 Output GBDT fitted model
Output GBDT fitted model $F_M(x)$
把 $\textit{epoch 1 to M}$ 建的 tree $f_1(x),f_2(x), …..f_M(x)$ 整合起來就是 $F_M(x)$
$F_M(x)$ 的每棵樹 $f_m(x)$ 都是去 fit $F_{m-1}(x)$ 與 target label love_troll2 之間的 $residual$
所以 $F_m(x)$ 又可以寫成
這邊很容易搞混 $log(odds)$ 與 probability,實際上只要記住:
- $F_m(x)$ 輸出 $log(odds)$
- $residual$ 的計算與 probability 有關
GBDT Classifier 背後的數學
Q: 為什麼用 cross entropy 做為 loss function ?
在分類問題上,我們預測的是 $\textit{The probability of loving Troll 2}$ $P(Y|x)$,$\textit{}$ 以 $maximize$ $\textit{log likelihood}$ 來解 $P(Y|x)$。
令 GBDT - classification tree 的 probability prediction 為 $P(Y| x) = \sigma(F(x))$,則 objective function 為
- $p = P(Y=1|x)$,表 the probability of loving movie Troll 2
- $y_i$ : observation of data sample $x_i$ loving Troll 2 or not
- $y \in \{1, 0\}$
而 $\text{maximize log likelihood = minimize negative log likelihood}$,objective funtion 改寫成
所以 $\text{loss function} = -[y \log(p) + (1-y)\log(1-p)]$
把 loss function 用 $odds$ 表示:
- 第三個等號 到 第四個等號用到 $odds=\cfrac{p}{1-p}$
- 第四個等號 到 第五個等號用到 $p = \cfrac{\exp(\log(odds))}{1 + \exp(\log(odds))}$ 這個結論
- $\log(1-p) = \log(1- \cfrac{\exp(\log(odds))}{1 + \exp(\log(odds))}) = \log(\cfrac{1}{1 + \exp(\log(odds))}) = -\log(1 + \exp(\log(odds)))$
把 loss function 表示成 odds 的好處是, $ -y\log(odds) + \log(1 + \exp(\log(odds)))$ 對 $log(odds)$ 微分形式很簡潔
loss function 對 $log(odds)$ 的微分,既可以以 $\log(odds)$ 表示,也可以以 probability $p$ 表示
- 以 $log(odds)$ 表示: $\cfrac{d}{d \log(odds)}L(y_i, p) = -y -\cfrac{\exp(\log(odds))}{1 + \exp(\log(odds))}$
- 以 $p$ 表示:$\cfrac{d}{d \log(odds)}L(y_i, p) = -y + p$
用 $p$ 表示時,loss function 對 $log(odds)$ 的微分
Q: 為什麼 $F_0(x)$ 可以直接計算 $log(\cfrac{count(true)}{count(false)})$ ?
來自 Step 1 的問題
根據選定的 loss function
- $P(Y=1|x) = p$ 為出現正類的 probability
- $y \in \{1, 0\}$
將 loss function 以 $\log(odds)$ 表示
$F_0(x)$ 為能使 $\textit{cost function}$ 最小的 $\log(odds): \gamma$
- $n$ 為 number of data sample $x$
令 $n$中,正樣本 $n^{(1)}$; 負樣本 $n^{(0)}$,$n = n^{(1)} + n^{(0)}$
cost function 對 $log(odds)$ 微分取極值:
移項得到 $p$
故得證,給定 $\text{loss function } = -[y \log(p) + (1-y)\log(1-p)]$, 能使 $argmin_{\gamma}\sum^n_{i=1} L(y_i, \gamma)$ 的 $\gamma$ 為
Q: 為什麼可以直接計算 residual,他跟 loss function 甚麼關係?
問題來自 Step 2 - (A)
在 $m$ 步的一開始還沒建 新 tree $f_m(x)$ 時,classifier 是 $F_{m-1}(x)$,此時的 cost function 是
- $y$ 為 target label
- $p = P(Y=1|x)$ 表正類的 probability
注意,$F(x)$ 輸出的是 log(odds),恆量 loss 是 probability $p$ 與 target label $y$ 的 cross entropy
我們接下來想建一顆新 tree $f_m(x)$ 使得 $F_m(x) = F_{m-1}(x) + \nu f_m(x)$ 的 cost function $\sum^n_{i=1} L(y_i,F_{m}(x_i))$ 進一步變小要怎麼做?
觀察 $F_m(x) = F_{m-1}(x) + \nu f_m(x)$,是不是很像 gradient decent update 的公式
讓 $f_m(x)$ 的方向與 gradient decent 方向一致,對應一下,新的 tree $f_m(x)$ 即是
新建的 tree $f_m(x)$ 要擬合的就是 gradient decent 的方向和值, 也就是 residual
Q: leaf node 的輸出公式怎麼來的?
問題來自 Step 2-(C)
在 new tree $f_m(x)$ 結構確定後,我們要計算每個 leaf node $j$ 的唯一輸出 $\gamma_{jm}$,使的 cost function 最小
- $j$ 表 leaf node index
- $m$ 表第 $m$ 步
- $\gamma_{j,m}$ $m$ 步 第 $j$ 個 leaf node 的輸出值
- $R_{jm}$ 表 $m$ 步 第 $j$ 個 leaf node,包含的 data sample $x$ 集合
將 loss function 以 $\log(odds)$ 表示後的 objective function
- $-[y \log(p) + (1-y)\log(1-p)] = -[y\log(odds) + \log(1 + e^{\log(odds)})]$
- $F_{m-1}(x)$ 輸出為 $\log(odds)$
cost function 對 $\gamma$ 微分求極值不好處理,換個思路,利用 second order Tylor Polynomoal 逼近 loss function 處理
讓 2nd Tyler approximation of $L(y_i, F_{m-1}(x_i) + \gamma)$ 在 $F_{m-1}(x)$ 處展開
將 cost function 對 $\gamma$ 微分取極值,求 $\gamma_{j,m}$
移項得到 $\gamma$
分子是 derivative of Loss function ; 分母是 second derivative of loss function
分子部分:
- $F_{m-1}(x_i)$ 是 $m-1$ 步時 $classifier$ 輸出的 $\log(odds)$
- 分子部分為 $\text{summation of residual}$
分母部分
綜合分子分母,能使 $F_m(x)$ cost function 最小化的 tree $f_m(x)$ 第 $j$ 個 leaf node 輸出為
寫在最後
Data Sample
learning by doing it
1 | import pandas as pd |
Reference
- Gradient Boosting In Classification: Not a Black Box Anymore! https://blog.paperspace.com/gradient-boosting-for-classification/
- statquest 整理
- StatQuest: Odds Ratios and Log(Odds Ratios), Clearly Explained!!! https://www.youtube.com/watch?v=8nm0G-1uJzA&t=925s
- The Logit and Sigmoid Functions https://nathanbrixius.wordpress.com/2016/06/04/functions-i-have-known-logit-and-sigmoid/
- Logistic Regression — The journey from Odds to log(odds) to MLE to WOE to … let’s see where it ends https://medium.com/analytics-vidhya/logistic-regression-the-journey-from-odds-to-log-odds-to-mle-to-woe-to-lets-see-where-it-2982d1584979
一步步透視 GBDT Classifier