本文並不打算介紹分類決策樹(你們可自行查詢和學習ID3,C4.5,Random Forest等經常使用的基礎決策樹的原理,以及決策樹的裁剪),而主要是爲了介紹GBDT及XGBoost的原理。在介紹GBDT和xgboost以前,咱們先介紹一下CART。git
後文的標誌:github
分類和迴歸樹(classification and regression tree, CART)是Breiman等人在1984提出的決策樹學習方法。CART假設決策樹是二叉樹,內部節點表示的是對數據根據某個特徵的某個值得劃分,特徵小於或等於該劃分值得數據分配在該內部節點的作節點,大於劃分值的數據則被劃分到右節點。算法
那麼,咱們要怎樣構建CART呢?決策樹的構建問題主要有兩點:內部節點選取哪一個特徵的哪一個值做爲劃分特徵?dom
首先要明確的是,咱們的劃分目的是使得劃分後的到的數據相較於劃分前更爲純粹(使得劃分後的數據的不肯定性更小),或者使得偏差(損失值)更小。通常,咱們對於不肯定性的度量方法有信息熵(使用信息增益最大的劃分方法做爲劃分依據)、基尼指數等,對於損失值能夠採用平方損失函數等。對於迴歸分析,本文使用平方損失函數做爲劃分依據和損失函數。機器學習
D={(x1,y1),(x2,y2),...,(xn,yn)},其中xi是k維的向量,yi是第i個訓練樣本的標準結果。訓練過程——從根節點開始,遞歸得對每一節點進行一下操做:函數
至此,一顆CART就訓練完成了。學習
提高樹(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(Gradient Boosting Decision Tree)是一種迭代的決策樹算法,又叫 MART(Multiple Additive Regression Tree),它經過構造一組弱的學習器(樹),並把多顆決策樹的結果累加起來做爲最終的預測輸出。該算法將決策樹與集成思想進行了有效的結合。rest
咱們須要知道的是,度量任何一個模型最重要的就是這個模型的損失函數。咱們訓練的目標就是使得損失函數L最小化。
當損失函數是平方損失和指數損失時,每一步優化是很簡單的。但對通常損失函數而言,每每每一步優化沒那麼容易,如絕對值損失函數和Huber損失函數。常見的損失函數及其梯度以下表所示:
如何使得損失函數最小化?調整參數,使得損失沿着梯度方向降低!(不懂的話要重學數學分析。。。)
對於損失函數爲平方損失函數的,咱們可使用的是yj-Ti對xj的預測結果做爲殘差。那麼對於其餘類型的損失函數咱們應該使用什麼做爲殘差以達到最好的效果呢呢?針對這一問題,Freidman(機器學習界的大佬)提出了梯度提高算法:利用最速降低的近似方法,即利用損失函數的負梯度在當前模型的值。
若是咱們對提高樹的損失函數求偏導,就能夠發現,偏導是等於殘差的~,見上上圖。(由於上文的殘差是損失函數梯度的一個特例,對應的損失函數爲平方損失函數)。所以,對於不一樣的損失函數,咱們可使用損失函數的偏導做爲咱們的殘差。
這就是梯度提高決策樹了。
XGBoost的全稱爲eXtreme Gradient Boosting,是GBDT的一種高效實現,XGBoost中的基學習器除了能夠是CART(gbtree)也能夠是線性分類器(gblinear)。
參考:
推薦: