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

TechFlow2019發表於2020-08-06

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


今天是機器學習專題的第30篇文章,我們今天來聊一個機器學習時代可以說是最厲害的模型——GBDT。

雖然文無第一武無第二,在機器學習領域並沒有什麼最厲害的模型這一說。但在深度學習興起和流行之前,GBDT的確是公認效果最出色的幾個模型之一。雖然現在已經號稱進入了深度學習以及人工智慧時代,但是GBDT也沒有落伍,它依然在很多的場景和公司當中被廣泛使用。也是面試當中經常會問到的模型之一。

遺憾的是市面上關於GBDT的資料雖然不少,但是很少有人把其中的核心精髓介紹清楚的。新手在初學的時候往往會被”梯度“,”殘差“等這些令人費解的概念給困惑住,耽誤了演算法原理的學習和理解。但其實GBDT整體的原理還是比較直觀和簡單的,只要我們找對了方法,抓住了核心,我相信對於絕大多數人來說,應該都不會問題。

GBDT基礎概念

GBDT的英文原文是Gradient Boosting Decision Tree,即梯度提升決策樹。從它的英文表述我們可以看出來,GBDT的基礎還是決策樹。決策樹我們在之前的文章當中曾經有過詳細的討論,我們這裡就不再贅述了。在GBDT當中用到的主要是決策樹的CART演算法,在CART演算法當中,我們每次都會選擇一個特徵並且尋找一個閾值進行二分。將樣本根據閾值分成小於等於閾值的以及大於閾值的兩個部分,在CART樹當中,同一個特徵可以重複使用,其他類似的ID3和C4.5都沒有這個性質。

另外一個關鍵詞是Boosting,Boosting表示一種整合模型的訓練方法,我們之前在介紹AdaBoost模型的時候曾經提到過。它最大的特點就是會訓練多個模型,通過不斷地迭代來降低整體模型的偏差。比如在Adaboost模型當中,會設定多個弱分類器,根據這些分類器的表現我們會給與它們不同的權值。通過這種設計儘可能讓效果好的分類器擁有高權重,從而保證模型的擬合能力。

但GBDT的Boosting方法與眾不同,它是一個由多棵CART決策迴歸樹構成的加法模型。我們可以簡單理解成最後整個模型的預測結果是所有迴歸樹預測結果的和,理解了這一點對於後面理解梯度和殘差非常重要。

我們可以試著寫一下GBDT的預測公式:

公式中的M表示CART樹的個數,表示第i棵迴歸樹對於樣本的預測結果,其中的表示每一棵迴歸樹當中的引數。所以整個過程就和我剛才說的一樣,GBDT模型最後的結果是所有迴歸樹預測結果的加和

但是這就有了一個問題,如果是迴歸問題那還好說,如果是分類問題那怎麼辦?難道分類結果也能加和嗎?

其實也是可以的,我們知道在邏輯迴歸當中,我們用到的公式是,這個式子的結果表示樣本的類別是1的概率。我們當然不能直接來擬合這個概率,但是我們可以用加和的方式來擬合的結果,這樣我們就間接得到了概率。

今天的文章當中我們主要先來講解迴歸問題,因為它的公式和理解最直觀簡單。分類的問題我們將會放到下一篇文章當中,因此這裡稍作了解即可。

梯度和殘差

下面我們要介紹到梯度和殘差的概念了,我們先來回顧一下線性迴歸當中梯度下降的用法。

線上性迴歸當中我們使用梯度下降法是為了尋找最佳的引數,使得損失函式最小。實際上目前絕大多數的模型都是這麼做的,計算梯度的目的是為了調整引數。但是GBDT不同,計算梯度是為了下一輪的迭代,這句話非常關鍵,一定要理解。

我們來舉個例子,假設我們用線性迴歸擬合一個值,這裡的目標y是20。我們當前的得到的是10,那麼我們應該計算梯度來調整引數,明顯應該將它調大一些從而降低偏差。

但是GBDT不是這麼幹的,同樣假設我們第一棵迴歸樹得到的結果也是10,和真實結果相差了10,我們一樣來計算梯度。在迴歸問題當中,我們通常使用均方差MSE作為損失函式,那麼我們可以來算一下這個函式的梯度。我們先寫出損失函式的公式:

L關於的負梯度值剛好等於,看起來剛好是我們要預測的目標值減去之前模型預測的結果。這個值也就是我們常說的殘差。

我們用表示第m棵迴歸樹對於樣本i的訓練目標,它的公式為:

從直觀上來講究很簡單了,我們要預測的結果是20,第一棵樹預測了10,相差還剩10,於是我們用第二棵樹來逼近。第二棵樹預測了5,相差變成了5,我們繼續建立第三棵樹……

一直到我們已經逼近到了非常接近小於我們設定的閾值的時候,或者子樹的數量達到了上限,這個時候模型的訓練就停止了。

這裡要注意,不能把殘差簡單理解成目標值和的差值,它本質是由損失函式計算負梯度得到的。

訓練過程

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

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

  1. 初始化

    首先,我們建立第一棵迴歸樹即,在迴歸問題當中,它是直接用迴歸樹擬合目標值的結果,所以:

  2. 迭代

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

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

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

    接著,我們更新,這裡的I是一個函式,如果樣本落在了節點上,那麼I=1,否則I=0。

  3. 最後我們得到迴歸樹

上述的公式看起來有些複雜,其實就是我們藉助和I把迴歸樹的情況表示了出來而已。因為我們訓練模型最終希望得到的其實是模型的引數,對於迴歸樹而言,它的參數列示比較複雜,所以看起來可能會有些迷惑。

我們可以簡單一點理解,GBDT就是利用的加法模型訓練多棵迴歸樹,預測的結果是這些迴歸樹的和。而每一棵迴歸樹的訓練目標都是之前模型的殘差。

Shrinkage

Shinkage是一種優化避免GBDT陷入過擬合的方法,這個方法的本質是減小每一次迭代對於殘差的收斂程度,認為每一次逼近少一些多次收斂的效果好於一次逼近很多,逼近次數較少的結果。具體的表現措施就是給我們的每一棵迴歸樹的結果乘上一個類似於學習率的引數,通過增大回歸樹的個數來彌補。

說白了就和梯度下降的時候我們乘上學習率是一樣的,只不過在梯度下降的問題當中,我們明確知道不乘學習率的話會陷入震盪無法收斂的問題。而在GBDT當中,Shrinkage的機制並沒有一個明確的證明或者是感性的認識,它的效果更多是基於經驗的。

我們寫一下加上Shrinkage之後的方程來做個對比:

這裡的就是我們的Shrinkage的引數,一般取值在0.001到0.01之間

總結

到這裡,關於GBDT模型的基本原理就算是介紹完了。如果你對於之前關於決策樹的相關文章都認真閱讀的話,相信理解GBDT對於你來說應該不是一件困難的事。如果你沒有讀過或者是錯過了之前的文章的話,可以看一下文末的相關閱讀的部分,回顧一下之前的內容。

GBDT最大的創新就在於,將傳統的調整引數來降低梯度的過程轉化成了建立新的樹模型來逼近,我第一次看到的時候深深為之驚豔。和傳統的模型相比,由於GBDT是綜合了多個分類器的結果,所以更加不容易陷入過擬合,並且對於一些複雜的場景的擬合效果會更好。今天我們介紹的只是最基本的迴歸問題當中的解法,在分類問題當中,公式會稍稍有些不同,這部分內容我們放在下篇文章當中。

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

相關閱讀

機器學習——十大資料探勘之一的決策樹CART演算法

機器學習——開啟整合方法的大門,手把手帶你實現AdaBoost模型

GBDT開原始碼: https://github.com/RRdmlearning/Machine-Learning-From-Scratch/tree/master/gradient_boosting_decision_tree

相關文章