一步步透視 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

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)$

初始 data samples

初始 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$,重複做以下的事

  1. (A) calculate residuals of $F_{m-1}(x)$
  2. (B) construct new regression tree $f_m(x)$
  3. (C) compute each leaf node’s output of new tree $f_m(x)$
  4. (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}$

residual

  • 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
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
data = [
(True, 12, 'blue', True),
(True, 87, 'gree', True),
(False, 44, 'blue', False),
(True, 19, 'red', False),
(False, 32, 'green', True),
(False, 14, 'blue', True)
]
columns = ['like_popcorn', 'age', 'favorite_color', 'love_troll2']
target = 'love_troll2'
df = pd.DataFrame.from_records(data, index=None, columns=columns)

Reference

Author

seed9D

Posted on

2021-01-24

Updated on

2021-02-09

Licensed under


Comments