1.引言
最近,由於一些緣由,本身須要作一個小範圍的XGBoost的實現層面的分享,因而乾脆就整理了一下相關的資料,串接出了這份report,也算跟這裏的問題相關,算是從一個更偏算法實現的角度,提供一份參考資料吧。這份report從建模原理、單機實現、分佈式實現這幾個角度展開。
在切入到細節以前,特別提一下,對於有過GBDT算法實現經驗的同窗(與我有過直接connection的同窗,至少有將四位同窗都有過直接實現GBDT算法的經驗)來講,這份report可能不會有太多新意,這更可能是一個技術細節的梳理,一來用做技術分享的素材,二來也是順便整理一下本身對這個問題的理解,由於本身實際上並無親自動手實現過度布式的GBDT算法,因此但願借這個機會也來梳理一下相關的知識體系。本文基於XGBoost官網代碼[12],commit是b3c9e6a0db0a7eb755949ac6b26e3ef805738350。
2.建模原理
我我的的理解,從算法實現的角度,把握一個機器學習算法的關鍵點有兩個,一個是loss function的理解(包括對特徵X/標籤Y配對的建模,以及基於X/Y配對建模的loss function的設計,前者應用於inference,後者應用於training,而前者又是後者的組成部分),另外一個是對求解過程的把握。這兩個點串接在一塊兒構成了算法實現的主框架。具體到XGBoost,也不出其外。
XGBoost的loss function能夠拆解爲兩個部分,第一部分是X/Y配對的建模,第二部分是基於X/Y建模的loss function的設計。
2.1. X/Y建模
做爲GBDT算法的具體實現,XGBoost表明了Tree Model的一個特例(boosting tree v.s. bagging tree),基本的思想用下圖描述起來會更爲直觀:git
若是從形式化的角度來觀察,則能夠描述以下:算法
其中F表明一個泛函,表徵決策樹的函數空間,K表示構成GBDT模型的Tree的個數,T表示一個決策樹的葉子結點的數目, w是一個向量。看到上面X/Y的建模方式,也許咱們會有一個疑問:上面的建模方式輸出的會是一個浮點標量,這種建模方式,對於Regression Problem擬合得很天然,可是對於classification問題,怎樣將浮點標量與離散分類問題聯繫起來呢?理解這個問題,實際上,能夠經過Logistic Regression分類模型來得到啓發。咱們知道,LR模型的建模形式,輸出的也會是一個浮點數,這個浮點數又是怎樣跟離散分類問題(分類面)聯繫起來的呢?實際上,從廣義線性模型[13]的角度,待學習的分類面建模的其實是Logit[3],Logit自己是是由LR預測的浮點數結合建模目標知足Bernoulli分佈來表徵的,數學形式以下:框架
對上面這個式子作一下數學變換,可以得出下面的形式: 機器學習
這樣一來,咱們實際上將模型的浮點預測值與離散分類問題創建起了聯繫。
相同的建模技巧套用到GBDT裏,也就找到了樹模型的浮點預測值與離散分類問題的聯繫: 分佈式
考慮到GBDT應用於分類問題的建模更爲tricky一些,因此後續關於loss function以及實現的討論都會基於GBDT在分類問題上的展開,後續再也不贅述。
2.2. Loss Function設計
分類問題的典型Loss建模方式是基於極大似然估計,具體到每一個樣本上,實際上就是典型的二項分佈機率建模式[1]: 函數