GBDT 演算法:原理篇

qcloud發表於2019-01-03

本文由雲+社群發表

GBDT 是常用的機器學習演算法之一,因其出色的特徵自動組合能力和高效的運算大受歡迎。 這裡簡單介紹一下 GBDT 演算法的原理,後續再寫一個實戰篇。

1、決策樹的分類

決策樹分為兩大類,分類樹和迴歸樹。

分類樹用於分類標籤值,如晴天/陰天/霧/雨、使用者性別、網頁是否是垃圾頁面;

迴歸樹用於預測實數值,如明天的溫度、使用者的年齡、網頁的相關程度;

兩者的區別:

  • 分類樹的結果不能進行加減運算,晴天 晴天沒有實際意義;
  • 迴歸樹的結果是預測一個數值,可以進行加減運算,例如 20 歲 3 歲=23 歲。
  • GBDT 中的決策樹是迴歸樹,預測結果是一個數值,在點選率預測方面常用 GBDT,例如使用者點選某個內容的概率。

2、GBDT 概念

GBDT 的全稱是 Gradient Boosting Decision Tree,梯度提升決策樹。

要理解 GBDT,首先就要理解這個 B(Boosting)。

Boosting 是一族可將弱學習器提升為強學習器的演算法,屬於整合學習(ensemble learning)的範疇。Boosting 方法基於這樣一種思想:對於一個複雜任務來說,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。通俗地說,就是"三個臭皮匠頂個諸葛亮"的道理。

基於梯度提升演算法的學習器叫做 GBM(Gradient Boosting Machine)。理論上,GBM 可以選擇各種不同的學習演算法作為基學習器。GBDT 實際上是 GBM 的一種情況。

為什麼梯度提升方法傾向於選擇決策樹作為基學習器呢?(也就是 GB 為什麼要和 DT 結合,形成 GBDT) 決策樹可以認為是 if-then 規則的集合,易於理解,可解釋性強,預測速度快。同時,決策樹演算法相比於其他的演算法需要更少的特徵工程,比如可以不用做特徵標準化,可以很好的處理欄位缺失的資料,也可以不用關心特徵間是否相互依賴等。決策樹能夠自動組合多個特徵。

不過,單獨使用決策樹演算法時,有容易過擬合缺點。所幸的是,通過各種方法,抑制決策樹的複雜性,降低單顆決策樹的擬合能力,再通過梯度提升的方法整合多個決策樹,最終能夠很好的解決過擬合的問題。由此可見,梯度提升方法和決策樹學習演算法可以互相取長補短,是一對完美的搭檔。

至於抑制單顆決策樹的複雜度的方法有很多,比如限制樹的最大深度、限制葉子節點的最少樣本數量、限制節點分裂時的最少樣本數量、吸收 bagging 的思想對訓練樣本取樣(subsample),在學習單顆決策樹時只使用一部分訓練樣本、借鑑隨機森林的思路在學習單顆決策樹時只取樣一部分特徵、在目標函式中新增正則項懲罰複雜的樹結構等。

演示例子:

考慮一個簡單的例子來演示 GBDT 演算法原理。

下面是一個二分類問題,1 表示可以考慮的相親物件,0 表示不考慮的相親物件。

特徵維度有 3 個維度,分別物件 身高,金錢,顏值

img

對應這個例子,訓練結果是 perfect 的,全部正確, 特徵權重可以看出,對應這個例子訓練結果顏值的重要度最大,看一下訓練得到的樹。

Tree 0:

img

Tree 1:

img

3、原理推導

3.1 目標函式

監督學習的關鍵概念:模型(model)、引數(parameters)、目標函式(objective function)

模型就是所要學習的條件概率分佈或者決策函式,它決定了在給定特徵向量時如何預測出目標。

引數就是我們要從資料中學習得到的內容。模型通常是由一個引數向量決定的函式。

目標函式通常定義為如下形式:

img

其中,L 是損失函式,用來衡量模型擬合訓練資料的好壞程度;Ω稱之為正則項,用來衡量學習到的模型的複雜度。

對正則項的優化鼓勵演算法學習到較簡單的模型,簡單模型一般在測試樣本上的預測結果比較穩定、方差較小(奧坎姆剃刀原則)。也就是說,優化損失函式儘量使模型走出欠擬合的狀態,優化正則項儘量使模型避免過擬合。

3.2 加法模型

GBDT 演算法可以看成是由 K 棵樹組成的加法模型:

img

如何來學習加法模型呢?

解這一優化問題,可以用前向分佈演算法(forward stagewise algorithm)。因為學習的是加法模型,如果能夠從前往後,每一步只學習一個基函式及其係數(結構),逐步逼近優化目標函式,那麼就可以簡化複雜度。這一學習過程稱之為 Boosting。具體地,我們從一個常量預測開始,每次學習一個新的函式,過程如下:

img

在第 t 步,這個時候目標函式可以寫為:

img

舉例說明,假設損失函式為平方損失(square loss),則目標函式為:

img

其中,稱

img

之為殘差(residual)。因此,使用平方損失函式時,GBDT 演算法的每一步在生成決策樹時只需要擬合前面的模型的殘差。

3.3 泰勒公式

定義:

img

泰勒公式簡單的理解,就是函式某個點的取值可以用參考點取值和 n+1 階導數的來表示,而且這個公式是有規律的比較好記。

根據泰勒公式把函式

img

img

點處二階展開,可得到如下等式:

img

則等式(1) 可轉化為:

img

假設損失函式為平方損失函式,把對應的一階導數和二階導數代入等式(4) 即得等式(2)。

由於函式中的常量在函式最小化的過程中不起作用,因此我們可以從等式(4) 中移除掉常量項,得:

img

3.4 GBDT 演算法

一顆生成好的決策樹,假設其葉子節點個數為

img

決策樹的複雜度可以由正則項

img

來定義,即決策樹模型的複雜度由生成的樹的葉子節點數量和葉子節點對應的值向量的 L2 範數決定。

定義集合

img

為所有被劃分到葉子節點的訓練樣本的集合。等式(5) 可以根據樹的葉子節點重新組織為 T 個獨立的二次函式的和:

img

定義

img

,則等式(6) 可寫為:

img

因為一元二次函式最小值處,一階導數等於 0:

img

此時,目標函式的值為

img

綜上,為了便於理解,單顆決策樹的學習過程可以大致描述為: 1. 列舉所有可能的樹結構 q 2. 用等式(8) 為每個 q 計算其對應的分數 Obj,分數越小說明對應的樹結構越好 3. 根據上一步的結果,找到最佳的樹結構,用等式(7) 為樹的每個葉子節點計算預測值

然而,可能的樹結構數量是無窮的,所以實際上我們不可能列舉所有可能的樹結構。通常情況下,我們採用貪心策略來生成決策樹的每個節點。

\1. 從深度為 0 的樹開始,對每個葉節點列舉所有的可用特徵 2. 針對每個特徵,把屬於該節點的訓練樣本根據該特徵值升序排列,通過線性掃描的方式來決定該特徵的最佳分裂點,並記錄該特徵的最大收益(採用最佳分裂點時的收益) 3. 選擇收益最大的特徵作為分裂特徵,用該特徵的最佳分裂點作為分裂位置,把該節點生長出左右兩個新的葉節點,併為每個新節點關聯對應的樣本集 4. 回到第 1 步,遞迴執行到滿足特定條件為止

3.5 收益的計算

如何計算每次分裂的收益呢?假設當前節點記為 C,分裂之後左孩子節點記為 L,右孩子節點記為 R,則該分裂獲得的收益定義為當前節點的目標函式值減去左右兩個孩子節點的目標函式值之和:

img

根據等式(8) 可得:

img

其中,

img

項表示因為增加了樹的複雜性(該分裂增加了一個葉子節點)帶來的懲罰。

最後,總結一下 GBDT 的學習演算法:

  1. 演算法每次迭代生成一顆新的決策樹 ;
  2. 在每次迭代開始之前,計算損失函式在每個訓練樣本點的一階導數和二階導數 ;
  3. 通過貪心策略生成新的決策樹,通過等式(7) 計算每個葉節點對應的預測值
  4. 把新生成的決策樹

img

新增到模型中:

img

保持簡單

易經中說道"易則易知,簡則易從",就是越是簡易的東西,越是容易被理解和得到執行。很多機器學習模型都會盡量讓學習到的模型儘量簡單,儘量減少引數,越是簡單的模型,通用性越好,也是這個道理。

Xgboost 和 GBDT 的區別:

GBDT:

  • GBDT 它的非線性變換比較多,表達能力強,而且不需要做複雜的特徵工程和特徵變換。
  • GBDT 的缺點也很明顯,Boost 是一個序列過程,不好並行化,而且計算複雜度高,同時不太適合高維稀疏特徵;
  • 傳統 GBDT 在優化時只用到一階導數資訊。

Xgboost:

它有以下幾個優良的特性:

  1. 顯示的把樹模型複雜度作為正則項加到優化目標中。
  2. 公式推導中用到了二階導數,用了二階泰勒展開。(GBDT 用牛頓法貌似也是二階資訊)
  3. 實現了分裂點尋找近似演算法。
  4. 利用了特徵的稀疏性。
  5. 資料事先排序並且以 block 形式儲存,有利於平行計算。
  6. 基於分散式通訊框架 rabit,可以執行在 MPI 和 yarn 上。(最新已經不基於 rabit 了)
  7. 實現做了面向體系結構的優化,針對 cache 和記憶體做了效能優化。

此文已由作者授權騰訊雲+社群在各渠道釋出

獲取更多新鮮技術乾貨,可以關注我們騰訊雲技術社群-雲加社群官方號及知乎機構號

相關文章