GBDT、XGboost原理介紹

決策樹

  • 決策樹是一種基本的分類和迴歸方法。決策樹模型呈樹形結構,能夠認爲是if-else形式的判斷集合。其主要的優勢有:可讀性好;分類速度快。
  • 決策樹由節點和有向邊組成,節點的類型有:內部節點——表示一個特徵及其劃分值;葉節點——類別或輸出值。當使用決策樹進行分類或者回歸預測的時候,只需遞歸地按照內部節點的特徵及劃分值找到對應的葉節點便可,葉節點的類別或者值即爲輸出。

本文並不打算介紹分類決策樹(你們可自行查詢和學習ID3,C4.5,Random Forest等經常使用的基礎決策樹的原理,以及決策樹的裁剪),而主要是爲了介紹GBDT及XGBoost的原理。在介紹GBDT和xgboost以前,咱們先介紹一下CART。git

後文的標誌:github

  • 訓練集: D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是m維的向量,yi是第i個訓練樣本的標準結果。(若是yi的取值是離散的,則是分類問題;若是yi的取值範圍是連續的,則是迴歸問題)。本文中的yi爲離散取值。

CART

分類和迴歸樹(classification and regression tree, CART)是Breiman等人在1984提出的決策樹學習方法。CART假設決策樹是二叉樹,內部節點表示的是對數據根據某個特徵的某個值得劃分,特徵小於或等於該劃分值得數據分配在該內部節點的作節點,大於劃分值的數據則被劃分到右節點。算法

那麼,咱們要怎樣構建CART呢?決策樹的構建問題主要有兩點:內部節點選取哪一個特徵的哪一個值做爲劃分特徵?dom

首先要明確的是,咱們的劃分目的是使得劃分後的到的數據相較於劃分前更爲純粹(使得劃分後的數據的不肯定性更小),或者使得偏差(損失值)更小。通常,咱們對於不肯定性的度量方法有信息熵(使用信息增益最大的劃分方法做爲劃分依據)、基尼指數等,對於損失值能夠採用平方損失函數等。對於迴歸分析,本文使用平方損失函數做爲劃分依據和損失函數。機器學習

算法流程

D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是k維的向量,yi是第i個訓練樣本的標準結果。訓練過程——從根節點開始,遞歸得對每一節點進行一下操做:函數

  1. 設節點的數據集合爲D,根據每一個特徵j的每一個可能的取值(劃分值)s,將數據劃分爲兩個集合節點R一、R2,節點內數據樣例的平均值c1,c2做爲節點值(或者按比例使用加權值做爲節點值)。計算劃分後的損失:圖片描述
  2. 選取劃分損失最小的特徵及其對應的劃分值做爲該節點的劃分方式。
  3. 對兩個子節點R1,R2,遞歸進行步驟一、2的處理直至知足中止條件(節點的數據樣例個數爲1;樣例個數不爲1,可是y相同;深度超過d等)。若是知足中止條件,則葉子節點內數據樣例的平均值做爲節點值(或者使用加權值做爲節點值)。

至此,一顆CART就訓練完成了。學習

提高決策樹BDT

提高樹(Boosting Decision Tree)是迭代多棵迴歸樹來共同決策。當採用平方偏差損失函數時,每一棵迴歸樹學習的是以前全部樹的結論和殘差,擬合獲得一個當前的殘差迴歸樹,通常,殘差的意義如公式:殘差 = 真實值 - 預測值 。提高樹便是整個迭代過程生成的迴歸樹的累加。提高樹模型能夠表示爲決策樹的加法模型:
圖片描述優化

其中T(x;Θm)表示決策樹;Θm爲決策樹的參數;M爲樹的個數。spa

算法流程:

D1=訓練集D
// m爲迴歸樹數量(自定義),m越大表示越精確,同時也意味着可能過擬合
for i range m:
  Ti=根據Di使用訓練出的一棵CART
  使用Ti對Di進行預測,rj=Ti對Di第j個樣例的預測結果,並獲取每一個訓練樣本的殘差yj', 其中yj'=yj-rj
  Di+1={(x1,y1'),(x2,y2'),...,(xn,yn')}

// 最後的模型爲:
f(x)=T1+T2+...+Tm

梯度提高決策樹GBDT

GBDT(Gradient Boosting Decision Tree)是一種迭代的決策樹算法,又叫 MART(Multiple Additive Regression Tree),它經過構造一組弱的學習器(樹),並把多顆決策樹的結果累加起來做爲最終的預測輸出。該算法將決策樹與集成思想進行了有效的結合。rest

咱們須要知道的是,度量任何一個模型最重要的就是這個模型的損失函數。咱們訓練的目標就是使得損失函數L最小化。圖片描述

當損失函數是平方損失和指數損失時,每一步優化是很簡單的。但對通常損失函數而言,每每每一步優化沒那麼容易,如絕對值損失函數和Huber損失函數。常見的損失函數及其梯度以下表所示:圖片描述

如何使得損失函數最小化?調整參數,使得損失沿着梯度方向降低!(不懂的話要重學數學分析。。。)

對於損失函數爲平方損失函數的,咱們可使用的是yj-Ti對xj的預測結果做爲殘差。那麼對於其餘類型的損失函數咱們應該使用什麼做爲殘差以達到最好的效果呢呢?針對這一問題,Freidman(機器學習界的大佬)提出了梯度提高算法:利用最速降低的近似方法,即利用損失函數的負梯度在當前模型的值。圖片描述

若是咱們對提高樹的損失函數求偏導,就能夠發現,偏導是等於殘差的~,見上上圖。(由於上文的殘差是損失函數梯度的一個特例,對應的損失函數爲平方損失函數)。所以,對於不一樣的損失函數,咱們可使用損失函數的偏導做爲咱們的殘差。

這就是梯度提高決策樹了。

XGBoost

XGBoost的全稱爲eXtreme Gradient Boosting,是GBDT的一種高效實現,XGBoost中的基學習器除了能夠是CART(gbtree)也能夠是線性分類器(gblinear)。

  • 和GBDT不一樣,xgboost給損失函數增長了正則化項(L1或L2正則化項,視學習目標不一樣而取不一樣正則化參數。)
  • 有些損失函數是難以計算導數的,鑑於這種狀況,xgboost使用損失函數的二階泰勒展開做爲損失函數的擬合
  • GBDT的節點分裂方式是遍歷全部特徵的全部可能劃分,再選取最優者分裂。xgboost使用分位點及分位數法,近似地計算,有效下降計算量

參考:

推薦:

  • 《統計學習方法》——李航
  • 西瓜書——周志華
相關文章
相關標籤/搜索