1. Gradient boosting(GB)
Gradient boosting的思想是迭代生多個(M個)弱的模型,然后將每個弱模型的預測結果相加,后面的模型Fm+1(x)基於前面學習模型的Fm(x)的效果生成的,關系如下:
實際中往往是基於loss Function 在函數空間的的負梯度學習,對於回歸問題殘差和負梯度也是相同的。
中的f,不要理解為傳統意義上的函數,而是一個函數向量
,向量中元素的個數與訓練樣本的個數相同,因此基於Loss Function函數空間的負梯度的學習也稱為“偽殘差”。
2. Gradient boosting Decision Tree(GBDT)
GBDT是GB和DT的結合。要注意的是這里的決策樹是回歸樹,
GBDT實際的核心問題變成怎么基於使用CART回歸樹生成
?
3. Xgboost
xgboost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)
(1). xgboost在目標函數中顯示的加上了正則化項,基學習為CART時,正則化項與樹的葉子節點的數量T和葉子節點的值有關。
正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。
從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
(2). GB中使用Loss Function對f(x)的一階導數計算出偽殘差用於學習生成fm(x),xgboost不僅使用到了一階導數,還使用二階導數。
第t次的loss:
對上式做二階泰勒展開:g為一階導數,h為二階導數
(3). 上面提到CART回歸樹中尋找最佳分割點的衡量標准是最小化均方差,XGBoost的並行是在特征粒度上的,XGBoost預先對特征的值進行排序,然后保存為block結構
xgboost尋找分割點的標准是最大化,lamda,gama與正則化項相關
xgboost算法的步驟和GB基本相同,都是首先初始化為一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。
4)xgboost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率
5)列抽樣。xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。
凡是這種循環迭代的方式必定有停止條件,什么時候停止呢:
(1)當引入的分裂帶來的增益小於一個閥值的時候,我們可以剪掉這個分裂,所以並不是每一次分裂loss function整體都會增加的,有點預剪枝的意思(其實我這里有點疑問的,一般后剪枝效果比預剪枝要好點吧,只不過復雜麻煩些,這里大神請指教,為啥這里使用的是預剪枝的思想,當然Xgboost支持后剪枝),閾值參數為γγ 正則項里葉子節點數T的系數(大神請確認下);
(2)當樹達到最大深度時則停止建立決策樹,設置一個超參數max_depth,這個好理解吧,樹太深很容易出現的情況學習局部樣本,過擬合;
(3)當樣本權重和小於設定閾值時則停止建樹,這個解釋一下,涉及到一個超參數-最小的樣本權重和min_child_weight,和GBM的 min_child_leaf 參數類似,但不完全一樣,大意就是一個葉子節點樣本太少了,也終止同樣是過擬合;