機器學習 | 詳解GBDT在分類場景中的應用原理與公式推導

TechFlow2019發表於2020-08-17

本文始發於個人公眾號:TechFlow,原創不易,求個關注


今天是機器學習專題的第31篇文章,我們一起繼續來聊聊GBDT模型。

在上一篇文章當中,我們學習了GBDT這個模型在迴歸問題當中的原理。GBDT最大的特點就是對於損失函式的降低不是通過調整模型當中已有的引數實現的,若是通過訓練新的CART決策樹來逼近的。也就是說是通過增加引數而不是調整引數來逼近損失函式最低點。

如果對於這部分不是很理解的話,可以通過下方的連結回顧一下之前的內容:

機器學習 | 詳解GBDT梯度提升樹原理,看完再也不怕面試了


邏輯迴歸損失函式


在我們開始GBDT模型原理的講解和推導之前,我們先來回顧一下邏輯迴歸當中的相關公式和概念。

首先,我們先來寫出邏輯迴歸的預測函式:

\[h_{\theta}(x) = \frac{1}{1 + e^{-\theta^Tx}} \]

影像畫出來是這樣的,其中的\(h_{\theta}(x)\)表示表示了模型預測x這個樣本屬於類別1的概率。

在二分類問題當中,只有0和1兩個類別, 兩個類別的概率只和為1。所以我們可以得到\(P(y=0|x;\theta)=1 - h_{\theta}(x)\)

我們希望模型在y=0的時候,使得\(1 - h_{\theta}(x)\)儘量大,否則則使得\(h_{\theta}(x)\)儘量大,我們用指數的形式把兩者綜合寫出了它的損失函式L。

\[l(\theta) = -h_{\theta}(x)^y(1 - h_{\theta}(x))^{1-y} \]

這個值涉及到指數,計算起來不太方便,所以我們會對它求對數進行簡化。等式兩邊都取對數之後,可以得到:

\[L(\theta)=log(l(\theta))=-\sum_{i=1}^N[y_i\log h_{\theta}(x_i)+(1 - y_i)\log (1 - h_{\theta}(x_i))] \]

這個就是邏輯迴歸損失函式的由來。


GBDT二分類


我們將GBDT模型應用在二分類的場景當中的原理其實和邏輯迴歸一樣,只不過在邏輯迴歸當中\(h_{\theta}(x)\)是一個線性函式,而在GBDT當中,\(h_{\theta} = \sum_{m=1}^M f_m(x)\),是一個加法模型

在GBDT的迴歸問題當中,\(h_{\theta}\)就是GBDT產出的最後結果,而在二分類問題當中,我們還需要對這個結果加上一個sigmoid函式。我們令上面的\(h_{\theta}\)\(F_M(x)\),所以模型可以表達為:

\[P(y=1|x) = \frac{1}{1 + e^{-F_M(x)}} \]

我們把這個式子帶入邏輯迴歸的損失函式當中,可以得到:

\[\begin{aligned} L(x_i, y_i | F_M(x)) &= -y_i\log (\frac{1}{1 + e^{-F_M(x_i)}}) - (1 - y_i)\log (1 - \frac{1}{1 + e^{-F_M(x_i)}} )\\ &= y_i \log(1 + e^{-F_M(x_i)}) + (1 - y_i)[F_M(x_i) + \log (1 + e^{-F_M(x_i)})] \end{aligned} \]

我們對損失函式計算負梯度,也即計算\(L(x, y |F_M(X))\)\(F_M(x)\)的偏導:

\[-\frac{\partial L}{\partial F_M} = y_i - \frac{1}{1 + e^{-F_M(x)}} = y_i - \hat{y_i} \]

這個負梯度也就是我們常說的殘差,這個殘差的結果和我們之前在迴歸問題當中的推導結果非常近似。它表示預測概率和真實概率的概率差,這個殘差就是下一棵CART樹的訓練目標。


訓練過程


我們再把模型訓練的整個過程給整理一下,把所有的細節串聯起來。

首先我們先明確幾個引數,M表示決策樹的數量。\(F_m(x_i)\)表示第m輪訓練之後的整體,\(F_m(x_i)\)即為最終輸出的GBDT模型。

  1. 初始化

    首先,我們建立第一棵迴歸樹即\(f_1(x)\),在二分類問題當中,它是先驗資訊,所以:

    \[f_1(x) = \log \frac{p1}{1-p1}$$,p1表示**樣本中類別1的比例** \]

    i. 對於第2到第m棵迴歸樹,我們要計算出每一棵樹的訓練目標, 也就是前面結果的殘差:

    \[r_{mi}=-[\frac{\partial L(y_i, f(x_i))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)}=y_i - \hat{y_i} \]

    ii. 對於當前第m棵子樹而言,我們需要遍歷它的可行的切分點以及閾值,找到最優的預測值c對應的引數,使得儘可能逼近殘差,我們來寫出這段公式:

    \[c_{mj}=\mathop{\arg\min}_{c} \ \ \ \sum_{x_i\in R_{mj}}L(y_i, f_{m-1}(x_i) + c) \]

    這裡的\(R_{mj}\)指的是第m棵子樹所有的劃分方法中葉子節點預測值的集合,也就是第m棵迴歸樹可能達到的預測值。其中j的範圍是1,2,3...J。

    接著,我們更新\(f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})\),這裡的I是一個函式,如果樣本落在了\(R_{mj}\)節點上,那麼I=1,否則I=0。

  2. 我們得到

    \[F_M(x) = f_M(x) = \sum_{m=1}^Mf_m(x)=\sum_{m=1}^M\sum_{j=1}^J c_{mj}I(x \in R_{mj}) \]
  3. 某條樣本類別為1的概率為:

    \[P(x_i) = \frac{1}{1 + e^{-F_M(x_i)}} \]

多分類問題


二分類的問題解決了,多分類也並不困難,其實也只是二分類的一個簡單擴充。

我們假設樣本的類別數量是k,那麼我們需要k個不同的樹集合來擬合每個類別的概率。我們寫出類別q的概率的公式:

\[P(y=q|x) = \frac{e^{F_q(x)}}{\sum_{i=1}^k e^{F_i(x)}} \]

softmax函式的損失函式為:\(L = -\sum y_i \log(P(y_i | x))\),雖然從公式裡看這是一個求和值,但是對於多分類問題來說,只會有一個類別為1,其餘均為0,所以只會有一項不為0,我們假設這一項為q。我們代入求出它的負梯度:

\[-\frac{\partial L}{\partial F_q} = y_q - \frac{e^{F_q(x)}}{\sum_{i=1}^k e^{F_i(x)}}= y_q - \hat{y_q} \]

可見在多分類問題當中,這k個樹集合同樣是擬合真實的樣本標籤與預測的概率的差值,本質上和二分類問題是一樣的。


總結


到這裡,關於GBDT在分類場景當中的原理我們也介紹完了。其實整篇推倒下來,無論是過程和結果都和迴歸問題大同小異。只不過由於分類問題用到了sigmoid函式,使得計算偏導以及殘差的過程稍稍複雜了一些,其他並沒有什麼本質差別。

從今天的文章當中我們也可以看出來,GBDT模型適用的範圍很廣,迴歸、二分類以及多分類問題都可以適用,是一個非常強大的模型。也正因此,它在深度學習興起之前一度非常流行,基於它也衍生出了許多的改進的版本和應用。比如XGboost,GBDT + LR等等。也因此在面試的時候經常會問到其中的問題,如果有準備面試的同學,建議一定要將原理吃透哦。

今天的文章到這裡就結束了,如果喜歡本文的話,請來一波素質三連,給我一點支援吧(關注、轉發、點贊)。

相關文章