1.基分類器的選擇:傳統GBDT以CART作為基分類器,XGBoost還支持線性分類器,這個時候XGBoost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
2.二階泰勒展開:傳統GBDT在優化時只用到一階導數信息;XGBoost則對代價函數進行了二階泰勒展開,同時用到了一階和二階損失函數的導數。順便提一下,XGBoost工具支持自定義損失函數,只要函數可一階和二階求導。GBDT和GBDT擬合的是都是殘差。
a.二階泰勒展開:

b.xgboost訓練:




c.最后等式被優化成這個樣子,包含gi和hi兩個變量,因為ft(xi)是當前樹的預測值,已知,而gi和hi是從損失函數來的,所以自定義的損失函數只要滿足一階和二階可導就行,因為帶入到整體的式子中要滿足泰勒二階展開。
3.方差-方差權衡:XGBoost在目標函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出分數的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是XGBoost優於傳統GBDT的一個特性。
4.Shrinkage(縮減):相當於學習速率(xgboost中的)。XGBoost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
5.列抽樣(column subsampling):XGBoost借鑒了隨機森林的做法,支持列抽樣,我們會在同一層的結點分割前先隨機選一部分特征,遍歷的時候只用遍歷這部分特征就行了,不需要便利全部特征,不僅能降低過擬合,還能減少計算,這也是XGBoost異於傳統GBDT的一個特性。
6.缺失值處理:XGBoost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,論文中“枚舉”指的不是枚舉每個缺失樣本在左邊還是在右邊,而是枚舉缺失樣本整體在左邊,還是在右邊兩種情況。分裂點還是只評估特征不缺失的樣本,paper提到50倍。即對於特征的值有缺失的樣本,XGBoost可以自動學習出它的分裂方向。
7.XGBoost工具支持並行:
8.線程緩沖區存儲:按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer(緩沖區),主要是結合多線程、數據壓縮、分片的方法,然后再計算,提高算法的效率。
9.可並行的近似直方圖算法:樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。
