xgboost演算法最近真是越來越火,趁著這個浪頭,我們在最近一次的精準營銷活動中,也使用了xgboost演算法對某產品簽約行為進行預測和營銷,取得了不錯的效果。說到xgboost,不得不說它的兩大優勢,一是準確率高,這次營銷模型的AUC達到了94%;二是訓練速度快,在幾十萬樣本集,幾十個特徵的情況下,1分鐘就可以訓練完畢。到底是什麼原因使得這門武功又快又準?下面就來簡單分析一下。
Xgboost的全稱是Extreme Gradient Boosting,它是由華盛頓大學的陳天奇於2014年所創,由於它的高精度和高效率,在近幾年的演算法比賽中被廣泛應用並取得了很好的成績,大放異彩。xgboost可以看作在決策樹和GBDT的基礎上進化而來的,這個過程簡略表示如下:
1、決策樹(Decision Tree)
決策樹的優點是解釋性強、簡單、速度快,缺點是模型不穩定、對特徵純度依賴高,是最簡單的模型。
2、GBDT(Gradient Boosting Decision Tree)
因為單個決策樹的表達能力、範化能力和精度有限,所以GBDT引入了複合樹和增量學習的概念。與隨機森林相似,GBDT也是由多個CART樹組合形成一個最終分類器。在GBDT生成樹的時候,每棵樹沿著前一棵樹誤差減小的梯度方向進行訓練。舉例來說,一個手機的價格100元,用GBDT進行建模,第一棵樹擬合結果是90元,第二棵樹是8元,第三棵樹是2元,每一棵新生成的樹都使得模型的偏差越來越小,三棵樹級聯起來形成最終的模型。xgboost的g也體現在這個地方。
舉個原論文中的栗子,判斷一個人是否使用電腦?
如圖很好地解釋了複合樹和增量學習的概念,通過這兩點,GBDT的範化能力和精度比決策樹有了大幅提高。
3、Xgboost
Xgboost在GBDT的基礎上又進行了大幅改進,演算法的綜合效能有飛躍式的提高,與GBDT相比,Xgboost的優點主要體現精度高、速度快、可擴充套件性高、防止過擬合這幾點,下面逐條分析。
(1)精度高
Xgboost的損失函式用到了二階導數資訊,而GBDT只用到一階;
在大多數情況,資料集都無法避免出現null值的情況,從而導致梯度稀疏,在這種情況下,xgboost為損失函式指定了預設的梯度方向,間接提升了模型精度和速度。
(2)速度快
Xgboost在生成樹的最佳分割點時,放棄了貪心演算法,而是採用了一種從若干備選點中選擇出最優分割點的近似演算法,而且可以多執行緒搜尋最佳分割點。Xgboost還以塊為單位優化了特徵在記憶體中的存取,解決了Cache-miss問題,間接提高了訓練效率。根據論文所說,通過這些方法優化之後,xgboost的訓練速度比scikit-learn快40倍。
(3)可擴充套件性高
GBDT的基分類器是CART,而xgboost的基分類器支援CART,Linear,LR;
Xgboost的目標函式支援linear、logistic、softmax等,可以處理迴歸、二分類,多分類問題。另外,Xgboost還可以自定義損失函式。
(4)防止過擬合
xgboost在損失函式里加入了正則項,降低模型的方差,使模型更簡單,防止過擬合,還能自動處理one-hot特徵,但是one-hot會增加記憶體消耗,增加訓練時間,陳天奇建議one-hot類別數量在[0, 100]範圍內使用;
xgboost在每一輪迭代時為每棵樹增加一個權重,以此來縮減個別樹的影響力;
xgboost還支援特徵的下采樣,類似於隨機森林,也可以防止過擬合,並且提高速度,不過這個功能在當前版本沒有實現。
Xgboost的優缺點:
每門武功都有自己的優缺點,xgboost也不例外,這裡我用隨機森林作為對比,從正反兩個角度來解釋一下這兩種演算法的區別。xgboost適用於高偏差,低方差的訓練集。而隨機森林適用於高方差,低偏差的訓練集,二者是決策樹進化的兩個方向。
Xgboost的思想是增量學習,通過樹的級聯不斷修正偏差,方差較大的資料和異常值會對模型造成一定的影響。而隨機森林的思想是bagging,樹與樹之間互相獨立,通過多次有放回的取樣,然後所有樹共同投票,以此降低模型的方差,二者有所區別。從正面來說,對於偏差大的訓練集,隨機森林必須訓練到20層樹的深度才能達到的準確率,xgboost只需幾層樹就能達到,因為隨機森林依賴的樹的深度降低偏差,xgboost通過幾個樹的級聯就把偏差輕鬆修正了。從反面來說,對於方差大的訓練集,隨機森林可以輕鬆擬合,xgboost就不容易擬合好,同理不再贅述。