一、XGBoost目標函數
首先認清一點,它是GBDT的升級版,由陳天奇發明,在效率、方法方面都進行了優化。 不管對於回歸問題還是分類問題,好的機器學習方法的目的就是降低目標函數(也可稱為損失函數)的值,目標函數包括2個部分:一是模型的損失函數,二是模型的複雜度。也就是目標函數具有下面的形式:
上面公式中,前者表示模型的損失函數的值,降低它是為了降低偏差,也就是使得預測的數據和真實的數據更為接近;後者表示這個模型的複雜度,是為了降低方差,增強模型的泛化能力。
對於XGBoost框架而言,以弱模型選擇決策樹(因為在XGBoost框架中,弱模型可以有多種選擇,而在GBDT中,弱模型就是決策樹)為例,來說明XGBoost,其目標函數為:
其中H(T_j)表示樹T_j的葉子節點的個數,w是葉子節點的輸出數值。
二、XGBoost目標函數求解
現在說一下XGBoost是如何求解上述目標函數的最小值的。可以看出,上面的目標函數的參數其實也是一個函數(其實樹可看作一個函數),因此要求解需要換個思路。也就是Boosing,利用弱模型的加法形式轉換上面的目標函數。此外,在這裡利用貪心演算法,也就是當前一代的損失函數比上一代的低就可以,不是從整體考慮。轉換後的第t代的目標函數為:
根據二階泰勒展開公式,可得到上述目標函數的近似值:
從上面的式子可以看出XGBoost和GBDT的差異,GBDT只是利用了一階導數,而XGBoost利用了一階導數和二階導數。還有就是GBDT並沒有涉及到模型的複雜度。這個式子求和中的第一項是個常數項,公式的最後一項也是常數項,將它們去掉,變為下式:
從上面式子可知,目標函數只是與損失函數的一階、二階導數有關係,因此XGBoost支持自定義的損失函數。
下面再結合樹的複雜度,首先回顧下複雜度的函數:
其中H(T_j)表示樹T_j的葉子節點的個數,w_r是葉子節點r的輸出數值。
其中q(i)表示樣本i所屬的葉子節點q的樣本集合。w(q(i))表示葉子節點q的輸出值。I_r表示葉子節點r的樣本集合。w_r表示葉子節點r的輸出值。上面的函數是一個沒有交叉項的多元二次函數。下面將每個葉子節點包括的樣本的gi, hi的和各自定義為一個變數。
因為上面是一個二次函數,當樹固定時,就可以獲得上面式子的最小值。對w求導設置為0即可。下面給出最優的w值以及相應的最小的目標函數的值:
再回顧下,目標函數分了2部分,前一部分通過二階泰勒公式的轉換,只是和前一次形成的樹有關係了。後一部分,也就是怎麼構建當前的這個樹呢。上面的式子其實可看作一個樹的評分公式。樹從一開始只是有一個葉子節點(也就是根節點),按照上面的式子計算分數,然後這個節點開始分裂,分裂後再按照上面的公式計算分數,如此下去,遍歷所有的可能性,選擇上述值最小的那個。暴力可行,但是還有更好的方法。
下面給出分裂一個當前的葉子節點,這個目標函數的變化值Change,通過變化值的正負變化,就可以判斷這個葉子節點該不該分裂:如果下面的值小於0,則說明需要分裂。
舉個例子說明,假如現在要以特徵為年齡,年齡值為10作為分割點,則有
下面給出如何得到最優分割點(也就是上圖中的年齡、10):
遍歷所有的特徵,將每個特徵的值從小到大順序排列,然後從左到右遍歷一次即可得到這個特徵中哪個分割點的Change最小,然後在所有特徵中選擇Change最小的那個作為最終的分割點。
三、XGBoost相比GBDT的改進
四、XGBoost實例
預測數據集結果對比
代碼下載:
歡迎Fork,感謝Star!!!
微信搜索,關注微信訂閱號pythonfan, 獲取更多機器學習實例和代碼。