說到XGBoost,不得不說GBDT,GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認爲是泛化能力(generalization)較強的算法。近些年更因爲被用於搜索排序的機器學習模型而引起大家關注。
GBDT是基於決策樹,想學習關於決策樹的內容可以看這篇文章https://blog.csdn.net/blank_tj/article/details/82081002
決策樹分爲兩大類,迴歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標籤值,如晴天/陰天/霧/雨、用戶性別、網頁是否是垃圾頁面。這裏要強調的是,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無意義,如男+男+女=到底是男是女? GBDT的核心在於累加所有樹的結果作爲最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,所以GBDT中的樹都是迴歸樹,不是分類樹,這點對理解GBDT相當重要(儘管GBDT調整後也可用於分類但不代表GBDT的樹是分類樹)。
迴歸樹總體流程是在每個節點(不一定是葉子節點)都會得一個預測值,以年齡爲例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但衡量最好的標準不再是最大熵,而是最小化均方差:即(每個人的年齡-預測年齡)^2 的總和 / N,或者說是每個人的預測誤差平方和 除以 N。這很好理解,被預測出錯的人數越多,錯的越離譜,均方差就越大,通過最小化均方差能夠找到最靠譜的分枝依據。
加法模型
XGBoost算法可以看成是由K棵樹組成的加法模型:
其中 爲所有樹組成的函數空間,以迴歸任務爲例,迴歸樹可以看作爲一個把特徵向量映射爲某個score的函數。該模型的參數爲: 。於一般的機器學習算法不同的是,加法模型不是學習d維空間中的權重,而是直接學習函數(決策樹)集合。上述加法模型的目標函數定義爲:
其中 表示決策樹的複雜度,那麼該如何定義樹的複雜度呢?比如,可以考慮樹的節點數量、樹的深度或者葉子節點所對應的分數的 範數等等。
如何來學習加法模型呢?
解這一優化問題,可以用前向分佈算法(forward stagewise algorithm)。因爲學習的是加法模型,如果能夠從前往後,每一步只學習一個基函數及其係數(結構),逐步逼近優化目標函數,那麼就可以簡化複雜度。這一學習過程稱之爲Boosting。具體地,我們從一個常量預測開始,每次學習一個新的函數,過程如下:
那麼,在每一步如何決定哪一個函數 被加入呢?指導原則還是最小化目標函數。
在第 步,模型對 的預測爲: ,其中 爲這一輪我們要學習的函數(決策樹)。這個時候目標函數可以寫爲:
舉例說明,假設損失函數爲平方損失(square loss),則目標函數爲:
其中, 稱之爲殘差 。因此,使用平方損失函數時,GBDT算法的每一步在生成決策樹時只需要擬合前面的模型的殘差。
泰勒公式
設n是一個正整數,如果定義在一個包含 的區間上的函數 在 點處n+1次可導,那麼對於這個區間上的任意x都有: ,其中的多項式稱爲函數在 處的泰勒展開式, 是泰勒公式的餘項且是 的高階無窮小。
根據泰勒公式把函數
由等式(1)可知,目標函數是關於變量 的函數,若把變量 看成是等式(3)中的 ,把變量 看成是等式(3)中的 ,則等式(1)可轉化爲:
其中, 定義爲損失函數的一階導數,即 定義爲損失函數的二階導數,即 。
假設損失函數爲平方損失函數,則 ,把 和 帶入等式(4)和(2)。
由於函數中的常量在函數最小化的過程中不起作用,因此我們可以從等式(4)中移除掉常量項,得:
由於要學習的函數僅僅依賴於目標函數,從等式(5)可以看出只需爲學習任務定義好損失函數,併爲每個訓練樣本計算出損失函數的一階導數和二階導數,通過在訓練樣本集上最小化等式(5)即可求得每步要學習的函數 ,從而根據加法模型等式(0)可得最終要學習的模型。
XGBoost算法
一顆生成好的決策樹,假設其葉子節點個數爲,該決策樹是由所有葉子節點對應的值組成的向量 ,以及一個把特徵向量映射到葉子節點索引 的函數 組成的。因此,決策樹可以定義爲 。
決策樹的複雜度可以由正則項 來定義,即決策樹模型的複雜度由生成的樹的葉子節點數量和葉子節點對應的值向量的L2範數決定。
定義集合 { }爲所有被劃分到葉子節點j的訓練樣本的集合。等式(5)可以根據樹的葉子節點重新組織爲 個獨立的二次函數的和:
定義 ,則等式 可寫爲:
假設樹的結構是固定的,即函數 確定,令函數 的一階導數等於0,即可求得葉子節點j對應的值爲:
此時,目標函數的值爲:
綜上,爲了便於理解,單顆決策樹的學習過程可以大致描述爲:
1)枚舉所有可能的樹結構 。
2)用等式(8)爲每個 計算其對應的分數 ,分數越小說明對應的樹結構越好。
3)根據上一步的結果,找到最佳的樹結構,用等式(7)爲樹的每個葉子節點計算預測值。
然而,可能的樹結構數量是無窮的,所以實際上我們不可能枚舉所有可能的樹結構。通常情況下,我們採用貪心策略來生成決策樹的每個節點。
1)從深度爲0的樹開始,對每個葉節點枚舉所有的可用特徵。
2)針對每個特徵,把屬於該節點的訓練樣本根據該特徵值升序排列,通過線性掃描的方式來決定該特徵的最佳分裂點,並記錄該特徵的最大收益(採用最佳分裂點時的收益)。
3)選擇收益最大的特徵作爲分裂特徵,用該特徵的最佳分裂點作爲分裂位置,把該節點生長出左右兩個新的葉節點,併爲每個新節點關聯對應的樣本集。
4)回到第1步,遞歸執行到滿足特定條件爲止。
如何計算每次分裂的收益呢?假設當前節點記爲 ,分裂之後左孩子節點記爲 ,右孩子節點記爲 ,則該分裂獲得的收益定義爲當前節點的目標函數值減去左右兩個孩子節點的目標函數值之和: ,具體地,根據等式(8)可得:
其中,− 項表示因爲增加了樹的複雜性(該分裂增加了一個葉子節點)帶來的懲罰。
總結一下GBDT算法
1)算法每次迭代生成一顆新的決策樹
2)在每次迭代開始之前,計算損失函數在每個訓練樣本點的一階導數 和二階導數
3)通過貪心策略生成新的決策樹,通過等式(7)計算每個葉節點對應的預測值
4)把新生成的決策樹 添加到模型中:
通常在第四步,我們把模型更新公式替換爲: ,其中 稱之爲步長或者學習率。增加 因子的目的是爲了避免模型過擬合。
機器學習算法的目的
GBDT算法是一種監督學習算法。監督學習算法需要解決如下兩個問題:
:是損失函數,損失函數儘可能的小,這樣使得目標函數能夠儘可能的符合樣本。
:是正則化函數, 正則化函數對訓練結果進行懲罰,避免過擬合,這樣在預測的時候才能夠更準確。
目標函數之所以定義爲損失函數和正則項兩部分,是爲了儘可能平衡模型的偏差和方差(Bias Variance Trade-off)。
機器學習算法需要最終學習到損失函數儘可能小並且有效的防止過擬合。
以樣本隨時間變化對某件事情發生的變化爲例,如下幾副圖形象的說明了機器學習的作用。
假設隨着時間的變化對K話題存在如下樣本:
如果沒有有效的正則化,則學習結果會如下圖所示:
這種情況下,學習結果跟樣本非常符合,損失函數也非常小,但是這種樣本在預測的時候,由於過擬合,失敗率會很高。
如果損失函數太大,則學習結果如下圖所示:
這種情況,學習結果跟樣本差別太大,損失函數也很大,在預測的時候由於誤差跳大,失敗率也會很高。
損失函數和正則化防止過擬合平衡後的學習結果如下圖所示:
在這種情況下損失函數和正則化函數防止過擬合達到了一個平衡,預測會比較準。
參考了一篇非常不錯的文章:https://www.cnblogs.com/yangxudong/p/6220485.html