首先我們**一下理解xgboost的核心的一件事。那就是xgboost的數學模型,想要理解它,這個數學是跳不過去的。
xgboost是基於提公升樹的概念,這種思想就是說學習一棵樹可能效果很差,因為一棵樹比較不穩定,去除某些特徵或者樣本以後,重新訓練樹的結構會變化,這就導致**的結果不穩定。
為了讓模型的效果更魯棒(結果更穩定一點),我們可以訓練一棵樹後,然後看樹哪些地方沒訓練好,也就是說和目標的差距。然後再建一棵樹,擬合這些差距。這就是boost方法的思路,
xgbosot是boost方法的一種。
下面我將從下面我將從它的目標函式、正則化、分割點搜尋這幾個方面說一下xgbosot的思想。
在講理論之前,先複習一下泰勒展開式,上過高中的人,都知道泰勒展開式可以用來逼進二階可導的函式。
一、優化的目標函式
首先xgboost的目標函式(損失函式)如下:
等式左邊是t時刻的損失函式,右邊的小l表示每個樣本的損失,n表示樣本數量。
小l裡面有兩項,第一項為:
這是需要優化的損失,xgboost的**值是第t步的**值和t-1棵樹的所有**值的和作為**的值。對於每個樣本,每棵樹都會給他分到乙個葉節點。把這t棵樹的葉節點相加就是樹第t步的**。
我們希望**和真實值之間相差很小,比如可以選擇mse作為損失函式。
第二項為:
這是乙個正則項。式子中的t都表示第t顆樹,也就是說對每棵樹都這麼操作。
二、正則項的真實面目
剛接觸到xgboost,我感覺非常的牛,樹不像lr或者神經網路一樣有明顯的引數,怎麼做正則化呢?
正則化的本質是減少樹的複雜度,樹的複雜度可以用樹的深度、葉節點的個數表示。
xgboost也用到了類似的想法。xgboost的一棵樹的正則化公式如下:
等式右邊第一項t表示葉節點的個數。第二項的w看著跟神經網路的引數類似,其實我們可以把樹的葉節點的值當作樹優化的目標,這個w就是每個葉節點的值。
三、如何最小化目標函式?
高數中我們都學過泰勒展開式,xgboost也用了泰勒展開式的例子。假如我們在
把損失函式按照二階泰勒公式展開,則損失函式變成:
gi為在
(對應泰勒展開式的x0)
的一階導數,hi為二階倒數。
將常數去掉後,損失函式為:
如果定義ij為第j個葉節點,公式為:
裡面的i是說第i個樣本,q是乙個對映函式,意思是將xi對映到第j個節點。
上面的公式表明,如果需要計算損失函式,需要知道gi和hi,這兩個是可以算出來,但是ft
是要求解的引數,暫時不知道。
先別急,可以先做一下變換:
將損失函式改寫成下式:
我們需要求極值,我們需要求的引數是w,也就是葉節點的值,直接將第二行求導等於0就可以,得:
將wj帶入到上面損失函式的式子中得:
得到這個式子後,後續找**點,本質就是將樣本劃分兩堆,損失函式減少最多的就是最優。
四、**點的度量
在第三小節,我們知道了當我們知道樹的結構的時候,如何分配葉節點的值,讓損失函式最小化。本小結講述xgboost如何度量**點。決策樹可以是資訊增益、基尼指數等。xgboost也有乙個類似的度量方法。
xgboost是乙個二叉樹,也就是說,從根節點出發, 分出兩個岔。它的計算方法是**一棵樹,然後計算損失函式減小的值,哪種**方法損失函式減小得越多,就選哪種方法,計算公式如下:
這個公式就是把當前的損失減去左右節點的損失。
萬物有源,將xgboost之前,首先知道它的前輩是什麼,而xgboost就是相對於gbdt的一種改進,如果有不是很熟悉的,可以先學習一下gbdt。
我認為xgboost相對於gbdt的改進有兩方面,乙個是理論上,乙個是工程實踐上
理論方面:
工程方面:
[1]
DGA系列之XGBoost(二)
xgboost全名叫 extreme gradient boosting 極端梯度提公升,經常被用在一些比賽中,其效果顯著。它是大規模並行boosted tree的工具,它是目前最快最好的開源boosted tree工具包。xgboost 所應用的演算法就是 gbdt gradient boosti...
GBDT 以及 xgboost 總結一
gbdt的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是乙個加 值後能得真實值的累加量。同時gbdt是以決策樹 cart 為基學習器的gb演算法,是迭代樹,而不是分類樹。xgboost 常用來做特徵選擇 xgboost相比於gbdt來說,更加有效應用了數值優化,最重要是對損失函式 值...
Xgboost的一些坑
這兩天做乙個競賽,用xgboost作為工具來做了一些事情。主要的框架是 xgboost的python擴充套件。然後這過程中花了不少時間在解決各種xgboost的error上。大部分的問題都在這個函式裡 dtrain xgb.dmatrix train.txt dtest xgb.dmatrix te...