Xgboost理解

1、xgboost模型函數形式算法

  xgboost也是GBDT的一種,只不過GBDT在函數空間進行搜索最優F的時候,採用的是梯度降低法也就是一階泰勒展開;而xgboost採用的是二階泰勒展開也就是牛頓法,去每次逼近最優的F,泰勒展開越多與原函數形狀越接近,好比在x0處進行展開,其展開越多,x0附近與原函數值越接近,且這個附近的區域越大。另一個xgboost加入了正則化項,有效防止過擬合。機器學習

  xgboost與GBDT都是採用的cart樹中的迴歸樹來解決全部問題,迴歸樹的預測輸出是實數分數,能夠用於迴歸、分類、排序等任務中。對於迴歸問題,能夠直接做爲目標值,對於分類問題,須要映射成機率,好比採用邏輯迴歸的sigmoid函數。函數

additive表示附加的,所謂additive training,就是每次add一顆樹進行學習,直到損失最小。學習

偏差函數儘可能去擬合訓練數據,正則化項則鼓勵更加簡單的模型。由於當模型簡單以後,有限數據擬合出來結果的隨機性比較小,不容易過擬合,使得最後模型的預測更加穩定。優化

 

2、目標函數spa

1)回顧傳統參數空間的目標函數3d

偏差函數能夠是square loss,logloss等,正則項能夠是L1正則,L2正則等。正則項若是從Bayes角度來看,至關於對模型參數引入先驗分佈:blog

L1正則,模型參數服從拉普拉斯分佈,對參數加了分佈約束,大部分取值爲0。排序

L2正則,模型參數服從高斯分佈,對參數加了分佈約束,大部分絕對值很小。索引

2)xgboost在函數空間搜索的目標函數

函數空間的目標函數是多棵樹一塊兒構建的目標損失函數,求解多棵樹一塊兒的總體最優解。

 第一部分屬於偏差項,訓練模型的精度;第二部分正則項對每一棵迴歸樹的複雜度進行了懲罰,使得學習出來的模型不容易過擬合。

 哪些指標能夠衡量樹的複雜度呢?

樹的深度,內部節點個數,葉子節點個數,葉子節點分數等。

xgboost採用葉子節點個數T和葉子節點分數w(其實就是預測值)對樹的複雜度進行約束:

對葉子節點個數進行懲罰,至關於進行了剪枝。

 

3、泰勒展開

基本形式:

一階與二階泰勒展開:

1)一階泰勒展開(梯度降低法)

在機器學習任務中,須要最小化損失函數L(θ) ,其中θ 是要求解的模型參數。梯度降低法經常使用來求解這種無約束最優化問題,它是一種迭代方法:選取初值 θ0,不斷迭代,更新θ的值,進行損失函數的極小化。

從上面可知,當△θ=-αLt-1)時候,θ的更新就跟咱們以前理解的梯度降低方法是一摸同樣。將△θ帶入損失函數便可知,這個時候L(θt)是確定比L(θt-1)變小的。

因此,從梯度降低法角度理解,就是函數值沿着梯度的負方向進行減小;從泰勒展開角度理解,就是函數在θt-1處進行一階展開,並根據展開公式找到了比L(θt-1)更小的近似於L(θt)的值,由於泰勒展開自己就是用多項式形式近似表達函數的原形式。

2)二階泰勒展開(牛頓法)

此時如何進行優化,尋找更小的L(θt)?

 這時候利用泰勒二階展開求解最優的△θ,使得L(θt)更小,泰勒二階比一階確定更接近原函數的值,所求得的△θ也使得L(θt)降低的更快,這就是牛頓法的優點。

 

4、xgboost目標函數進行泰勒展開

xgboost在第t次迭代後,模型的預測等於前t-1次的模型預測加上第t棵樹的預測:

 

因爲模型已經進行了t-1次迭代,也就是已經學習了t-1棵樹,此時只要學習尋找最優的第t棵樹函數ft便可,因此目標函數以下:

其中yiyi(t-1)都屬於已知的,能夠理解爲常數。

將目標函數在yi(t-1)處進行泰勒二次展開,由於咱們一步步尋找的是最優的函數yi(t)使得L最小,就是上面所說的在函數空間進行的搜索,因此在yi(t-1)處進行泰勒二次展開尋找並學習下一顆樹ft,這裏的ft其實就至關於上文第三部門牛頓法中的△θ,不停的尋找ft,最後將這些樹加起來就成了最優的yt,上文中也是不停的尋找△θ,最後θ*0+Σ△θ,同樣的道理。無非一個是在參數空間進行搜索,一個是在函數空間進行搜索。二次展開以下:

其中gihi分佈以下:

                                

將常數項去掉,並把樹的結構形式帶入獲得以下:

其實這個時候已經簡潔地變成對t棵樹的學習優化問題了,以葉子節點形式表示上述目標函數以下,其中Ij={i|q(xi)=j}表示j葉子節點上的樣本集合。

 爲了使目標函數最小,能夠令其導數爲0,解得每一個葉節點的最優預測分數爲:

帶入目標函數,獲得最小損失爲:

5、如何進行分裂?

 1)如何評測節點分裂的優劣?

  ID3採用信息增益來評測,C4.5採用信息增益率、CART樹採用基尼係數和平方損失來評測,xgboost採用以下的打分評測:

其實就是上面的最小損失值的公式,若是分裂後能讓損失變得更小,就值得去分裂,因此分裂先後增益定義爲:

這個Gain就是分裂前的損失-分裂後的損失,差值越大,表明分裂後的損失越小,因此當對一個節點進行分裂時,計算全部候選(feature,value)對應的gain,選區gain最大的進行分裂。

2)尋找分裂節點

一、精確算法-暴力窮舉搜索法

      遍歷全部特徵的全部可能的分割點,計算gain值,選取gain值最大的(feature,value)去分割。該方式優勢是精度高,缺點是計算量太大。

二、近似算法-分位點分割

      對於某一個特徵,按照百分比肯定候選分裂點,經過遍歷全部特徵的全部候選分裂點來找到最佳分裂點,減小了計算複雜度。

  原論文指出兩種近似算法:一種是全局算法,即在初始化tree的時候劃分好候選節點,而且在樹的每一層都使用這些候選節點;另外一種是局部算法,即每一次劃分的時候都從新計算候選節點。這二者各有利弊,全局算法不須要屢次計算候選節點,但須要一次獲取較多的候選節點供後續樹生長使用,而局部算法一次獲取的候選節點較少,能夠在分支過程當中不斷改善,即適用於生長更深的樹,二者在effect和accuracy作trade off。
 

3.weighted quantile sketch(按權重的分位點算法)

該方法將樣本對應的殘差二階導h做爲劃分依據,假設每個分位點區間的h之和佔總h的比率爲rk(z),則兩個相鄰區間的rk之差小於一個固定值,以下所示:

從上圖可知ε是一個小數,其實也就是將權重約分爲了1/ε個分位點。

舉例以下:
第一行爲一列特徵對應的特徵值,第二行爲該特徵值對應的樣本xi的二階導數值hi。
個人理解在一個個特徵列上尋找分位點的時候,首先按照該列的特徵值進行排序如上圖從小到大,而後再按權重hi計算rk,以上圖爲例子計算以下:
rk(1)=0
rk(3)=(0.1+0.1)/(1.8)=1/9
rk(4)=(0.1+0.1+0.1)/(1.8)=1/6
rk(5)=0.4/1.8=2/9
rk(12)=0.5/1.8=5/18
rk(45)=0.6/1.8=1/3
rk(50)=1.0/1.8=5/9
rk(99)=1.2/1.8=2/3
因此如果取三分位點的時候,就是按rk=1/3,2/3的位置做爲候選分裂點(即45,99兩個點)進行分裂增益計算,這樣大大減小了計算量。
之因此按二階導數h做爲分位點劃分,是由於咱們要均分的是loss,而不是樣本的數量,而每一個樣本對loss的貢獻多是不同的,按樣本均分會致使loss分佈不均勻,取到的分位點會有誤差,而h是對loss貢獻很是大的權重量,因此按h選取合適的分位點。
 
6、爲何要用泰勒二階展開?
1)能夠很方便地自定義損失函數,只要這個損失函數能夠求一階和二階 ,實現形式上的"統一"。
2)二階展開精度上更接近原函數,既有一階導數,也有二階導數,至關於既有速度信息,還有加速度信息,所以收斂更快。
 
7、其它
1)缺失值或者稀疏數據自動處理
    原論文中缺失值的處理與稀疏數據(大量爲0的數據)的處理看做同樣。在尋找split point的時候,不會對該特徵爲missing的樣本進行遍歷統計,只對該列特徵值爲non-missing的樣本上對應的特徵值進行遍歷,經過這個技巧來減小了爲稀疏離散特徵尋找split point的時間開銷。在邏輯實現上,爲了保證完備性,會分別處理將missing該特徵值的樣本分配到左葉子結點和右葉子結點的兩種情形,計算增益後選擇增益大的方向進行分裂便可。能夠爲缺失值或者指定的值指定分支的默認方向,這能大大提高算法的效率。若是在訓練中沒有缺失值而在預測中出現缺失,那麼會自動將缺失值的劃分方向放到右子樹。
 
2)特徵預排序,存儲樣本索引。
    這樣加速了split finding的過程,只須要在建樹前排序一次,後面節點分裂時候,直接根據樣本能索引獲得其樣本對應的梯度信息。
3)如何解決二分類問題輸出的機率值呢?
獲得樹模型後,輸入一個原始數據,通過T個樹打分,殘差相加,獲得的數值通過logictic function映射,而後就獲得機率值了。
多分類問題,就採用softmax函數便可。
相關文章
相關標籤/搜索