xgboost算法_手把手机器学习实战系列:xgboost 算法
算法簡介
xgboost算法是一種boosting的集成學習算法,是將多個弱學習模型進行組合,從而獲得更好的效果,使得組合后的模型有更強的泛化能力, 它通常是由基本的回歸樹(CART)樹模型組成
如圖所示:通過輸入用戶的年齡,性別來判斷用戶喜歡玩游戲的得分值
上面是一個CART的實例,它是將輸入的樣本根據輸入的屬性分配到不同的葉子節點中,每個葉子節點中都會得到一個預測分值
由于單個CART模型過于簡單,常常會出現過擬合的現象,所以可以用多棵樹進行預測
假設現在有K個樹,那么預測模型表示為
fk(xi)就是某個葉子節點的預測值,當建立了K-1棵樹后,第K顆樹的對應的葉子節點的預測值如何確定?
通常的方法是用葉子節點內的樣本的標簽值的均值,能不能通過目標函數進行優化得到呢?
目標函數
在XGboost算法中,目標函數由損失函數和正則項組成,如下式所示:
損失函數表示
(1)平方誤差函數
(2)如果不是平方誤差函數,可以通過泰勒公式進行展開
正則項表示
由公式發現: 如果要求目標函數預測誤差盡量小,需要葉子節點盡量少,葉子節點數值盡量不極端(要保持大致相同)
舉例說明: 如果樣本的標簽數值是4
如果第一個回歸樹預測為3,另外一顆預測為1 另外一組回歸樹,一顆預測為2,另一顆預測為2, 此時選擇的是后一種,因為第一種第一課樹預測為3,太接近真實值了,有些過擬合了
模型學習
在XGboost算法中,目標函數由損失函數和正則項組成,如下式所示:
現在需要通過數據進行學習出這個模型,那么首先需要確定我們優化的參數是什么呢?
優化每個葉子節點的得分值,即f(xi)
XGboost是以CART回歸樹作為基本分類器,當給定訓練數據后,單個樹的結構基本確定了(如葉子節點個數,樹深度)
但是Xgboost并不是將這幾顆回歸樹簡單的相組合,而是利用加法模型,它將模型上次的預測(t-1顆樹組成的模型)產生的誤差作為參數進行下一顆樹的參考,如下圖就為加法模型案例,它將模型預測值與實際值殘差作為下一顆樹的輸入數據
模型的加法策略
初始化,模型沒有樹,預測結果為0,往模型中加入第2顆樹,往模型中加入第N顆樹
目標函數的表示:
泰勒公式:
樹結構分數
在建立好樹結構后,每個樣本肯定會落到某個葉子節點中,
定義:
落在葉子序號為j的所有的樣本,i 代表的是樣本的序號
目標函數變為:
對目標函數求導,令導數為0, 可得:
Obj表示在某個確定的樹結構下的結構分數(structure score), 類似于基尼系數,信息增益等,分數越小,樹結構越好
樹結構學習
貪心算法:
每一次嘗試去對已有的葉子加入一個分割。對于一個具體的分割方案,增益計算如下
對于每次樹的擴展,需要枚舉所有可能的分割方案,如何高效地枚舉所有的分割呢?
首先根據需要劃分的那列特征值排序,然后從左到右的掃描就可以枚舉出所有分割的梯度和
算法如下:
過擬合問題
1.Shrinkage
在每次迭代中對樹的每個葉子節點中的分數乘上一個縮減權重w, 可以使得每一顆樹的影響力不會太大,防止已經預測的非常正確了,使得后面的優化沒有了必要,從而產生了過擬合
舉例: 假如第一顆樹的預測值是3.8,而實際的label是4, 那么它的參數是0.2, 意味著第二顆樹只是學習0.2,沒什么學習內容了,為了減少過擬合,對葉子節點預測值乘以一個權重0.3,那么誤差是4 - 3.8*0.3=2.86,類似梯度下降學習率
2.Column Subsampling:
類似于隨機森林中的選取部分特征進行建樹
(1)按層隨機采樣在,對同一層內每個結點分裂之前,先隨機選擇一部分特征,然后只需要遍歷這部分的特征,來確定最優的分割點, 對應參數 colsample_bylevel,選擇0.5-1
(2)隨機選擇特征,則建樹前隨機選擇一部分特征然后分裂就只遍歷這些特征。一般情況下前者效果更好
總結
以上是生活随笔為你收集整理的xgboost算法_手把手机器学习实战系列:xgboost 算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一家反欺诈公司的面试经历——3.hibe
- 下一篇: 搜索练习2(P6207 [USACO06