1. 程式人生 > >xgboost原理分析以及實踐

xgboost原理分析以及實踐

摘要

本文在寫完GBDT的三篇文章後本來就想寫的,但一直沒有時間,終於剛好碰上需要,有空來寫這篇關於xgboost原理以及一些實踐的東西(這裡實踐不是指給出程式碼然後跑結果,而是我們來手動算一算整個xgboost流程)

由於網上已經許多優秀的文章對xgboost原理進行了詳細的介紹,特別是xgboost作者陳天奇的論文以及slide已經非常完整闡述了整個xgboost的來龍去脈,現有的文章基本也是參考了這兩個資料。
但是卻少涉及把原理對應到實際實現過程的文章,許多人看完原理之後可能對整個過程還是抱有好奇心,所以本文從另一個角度,原理到實際執行的角度來分析xgboost,相當於結合原理,仔細看看xgboost每一步到底計算了什麼。

原理

當然,我們還是需要簡要的回顧一下xgboost的整個推導過程,以及做一些鋪墊,方便後面敘述。

我們知道,任何機器學習的問題都可以從目標函式(objective function)出發,目標函式的主要由兩部分組成 損失函式+正則項。

Obj(Θ)=L(Θ)+Ω(Θ)

損失函式用於描述模型擬合數據的程度。
正則項用於控制模型的複雜度。

對於正則項,我們常用的L2正則和L1正則。

L1正則:Ω(w)=λ||w||1
L2正則:Ω(w)=λ||w||2

在這裡,當我選擇樹模型為基學習器時,我們需要正則的物件,或者說需要控制複雜度的物件就是這

K顆樹,通常樹的引數有樹的深度,葉子節點的個數,葉子節點值的取值(xgboost裡稱為權重weight)。

所以,我們的目標函式形式如下:

L(yi,y^i)+k=1KΩ(fk(xi))

對一個目標函式,我們最理想的方法就選擇一個優化方法演算法去一步步的迭代的學習出引數。但是這裡的引數是一顆顆的樹,沒有辦法通過這種方式來學習。

既然如此,我們可以利用Boosting的思想來解決這個問題,我們把學習的過程分解成先學第一顆樹,然後基於第一棵樹學習第二顆樹。也就是說:

y^i0=

y^
i1=y^i0+f1(xi)

y^i2=y^i1+f2(xi)

(0)y^iK=y^iK1+fK(xi)

所以,對於第K次的目標函式為:

ObjK=iL(yi,y^iK)+Ω(fK)+constant
==>