XGBoost = Extreme Gradient Boosting蒂培,也就是說(shuō),XGBoost 把 Gradient Boosting 做到了極致瑟捣,具體來(lái)說(shuō)末荐,這種極致體現(xiàn)在訓(xùn)練精度高、所需計(jì)算資源少勃救。正如陳天奇大神在 Quora 的相關(guān)回答中說(shuō):
The name xgboost, though, actually refers to the engineering goal to push the limit of computations resources for boosted tree algorithms. Which is the reason why many people use xgboost.
下圖是基于樹(shù)的算法的發(fā)展路徑圖碍讨,可以看到 XGBoost 是 Gradient Boosting 的(終極)強(qiáng)化版(圖自here)。
接下來(lái)我們按照原論文的組織順序來(lái)大概記錄一下對(duì) XGBoost 的原理理解蒙秒。
1勃黍、Model
首先模型可以表示如下:
這里各個(gè)表示回歸樹(shù)模型,
表示回歸樹(shù)空間晕讲。
表示一個(gè)樹(shù)結(jié)構(gòu)對(duì)應(yīng)的映射覆获,這個(gè)映射是將一個(gè)樣本映射到所劃分的葉子結(jié)點(diǎn)的編號(hào)。
則表示樣本所屬結(jié)點(diǎn)的得分或權(quán)重瓢省。
表示樹(shù)的葉子結(jié)點(diǎn)數(shù)弄息。
聽(tīng)起來(lái)很復(fù)雜的樣子,實(shí)際上就是建立棵回歸樹(shù)勤婚,然后對(duì)一個(gè)輸入
摹量,在
顆樹(shù)中都找到其所屬葉子結(jié)點(diǎn)的得分,然后加起來(lái)就得到最終的預(yù)測(cè)
馒胆。原論文中有清晰的圖解:
2缨称、Loss Function & Quality Score
有了模型,下一步就是定義損失函數(shù):
這里是一個(gè)可導(dǎo)的凸損失函數(shù)祝迂,衡量模型預(yù)測(cè)值和真實(shí)值之間的差異睦尽,
是針對(duì)模型復(fù)雜度的罰項(xiàng),可以視作正則項(xiàng)液兽。這里的
由兩部分組成骂删,第一項(xiàng)是限制葉子結(jié)點(diǎn)數(shù),第二項(xiàng)則是限制各葉子結(jié)點(diǎn)的分?jǐn)?shù)四啰,目的都是防止過(guò)擬合宁玫。刪去正則項(xiàng)則損失函數(shù)退化至普通 Gradient Boosting 的情形。
需要注意的是柑晒,損失函數(shù)的輸入是一個(gè)函數(shù)欧瘪,因此不能用像SGD這樣的方法去找到各個(gè)
,因?yàn)樗麄兪菢?shù)而不是數(shù)值向量匙赞。解決問(wèn)題的方法就是加法訓(xùn)練(Additive Training)佛掖。定義
為第
個(gè)樣本在第
輪迭代得到的模型上做出的預(yù)測(cè)妖碉。則假設(shè)當(dāng)前我們已經(jīng)進(jìn)行了
輪迭代,則我們希望得到一個(gè)
使得下面的損失函數(shù)最薪姹弧:
我們用 Taylor 公式對(duì)上式進(jìn)行二次近似欧宜,之所以用二次而不是一次,是為了優(yōu)化時(shí)使得損失更快下降拴魄。這里我們回顧一下泰勒公式:
把中的
當(dāng)作上式中的
冗茸,
當(dāng)作上式中的
,則:
其中為一階導(dǎo)匹中,
為二階導(dǎo)夏漱。值得注意的是,如果這里只做一次近似顶捷,那么當(dāng)
沿
方向下降最快挂绰,因此可以用
擬合
,這實(shí)際上就是 Gradient Boosting服赎。
由于和當(dāng)前要優(yōu)化的函數(shù)
無(wú)關(guān)葵蒂,因此可以作為常數(shù)項(xiàng)去掉,從而:
定義為第
個(gè)葉結(jié)點(diǎn)包含的樣本专肪,則上式可以寫(xiě)作:
對(duì)于固定的樹(shù)結(jié)構(gòu)刹勃,可以計(jì)算出各葉子結(jié)點(diǎn)的最優(yōu)分?jǐn)?shù):
代回原損失函數(shù)可以得到最優(yōu)損失:
于是上式就可以作為衡量一個(gè)樹(shù)結(jié)構(gòu)好壞的分?jǐn)?shù),這個(gè)分?jǐn)?shù)類似于決策樹(shù)中的基尼系數(shù)或信息增益嚎尤,可以用于判斷結(jié)點(diǎn)如何分裂荔仁。
假設(shè)當(dāng)前樹(shù)中一個(gè)葉子結(jié)點(diǎn)的樣本集為,分裂后得到的左孩子和右孩子的樣本為
和
芽死,則結(jié)點(diǎn)分裂后得到的樹(shù)結(jié)構(gòu)的最優(yōu)損失為:
上面兩式相減乏梁,損失減少量為:
當(dāng)然遍歷所有可能的樹(shù)結(jié)構(gòu)是不可能的,我們只能采用貪心的算法关贵,即從初始的根節(jié)點(diǎn)開(kāi)始遇骑,每一步都采用當(dāng)前的最優(yōu)結(jié)點(diǎn)劃分策略,直至達(dá)到終止條件揖曾。這部分的算例原論文也有給出:
而上面所述的貪心算法的正規(guī)化表達(dá)如下:
3落萎、Additional Techniques
在防止過(guò)擬合的措施方面,除了上面 loss function 中正則項(xiàng)對(duì)樹(shù)模型的限制炭剪,還可以使用 Shrinkage 和 Column Subsampling 的方法练链。
所謂 Shrinkage,就是在每一輪添加一棵樹(shù)的時(shí)候加入一個(gè)收縮系數(shù)奴拦,類似于梯度下降算法中的學(xué)習(xí)率:
收縮系數(shù)通常設(shè)置為大約 0.1媒鼓。這樣做的原因很簡(jiǎn)單,就是減小單個(gè)樹(shù)模型對(duì)結(jié)果的影響,并為未來(lái)的樹(shù)對(duì)模型的改進(jìn)留足空間绿鸣,從而有效緩解過(guò)擬合疚沐。
所謂 Column Subsampling ,其實(shí)就是 Feature Subsampling潮模,特征抽樣亮蛔。這個(gè)防止過(guò)擬合的方法就是 Random Forest 中所采用的,論文中提到再登,Column Subsampling 在防止過(guò)擬合方面的效果通常優(yōu)于 Row Subsampling (Sample Subsampling)尔邓。
4晾剖、Approximate Algorithm
上面提到的貪心算法是確定性的锉矢,因?yàn)槊看谓Y(jié)點(diǎn)劃分前,我們都要遍歷各個(gè)特征以及各特征可能的劃分點(diǎn)齿尽,所以計(jì)算消耗較大沽损,尤其是數(shù)據(jù)分布很集中的情形會(huì)造成很多不必要的計(jì)算,且對(duì)于數(shù)據(jù)量大到無(wú)法全部存在內(nèi)存中的情形循头,計(jì)算效率很低(因?yàn)槊總€(gè)結(jié)點(diǎn)判斷如何劃分的過(guò)程中都要進(jìn)行內(nèi)存的存取操作)绵估。
為了加速計(jì)算,論文中提出了相應(yīng)的近似算法:
概括一下就是卡骂,枚舉所有特征国裳,根據(jù)特征,比如第個(gè)特征的分位數(shù)來(lái)決定出
個(gè)候選切分點(diǎn)
全跨,然后根據(jù)這些候選切分點(diǎn)把相應(yīng)的樣本映射到對(duì)應(yīng)的桶中缝左,對(duì)每個(gè)桶的
進(jìn)行累加。最后在候選切分點(diǎn)集合上貪心查找浓若。
下面是一個(gè)三分位數(shù)的例子渺杉,圖自知乎wepon。
論文中提到了該近似算法的兩種形式挪钓,一種是 global是越,另一種是 local。
所謂 global碌上,就是在建樹(shù)之前預(yù)先將數(shù)據(jù)進(jìn)行全局(global)分桶倚评,所謂 local,就是在各個(gè)結(jié)點(diǎn)分裂時(shí)重新局部(local)分桶馏予。
直覺(jué)上講天梧,global 需要設(shè)置更小的分位數(shù)間隔(這里用表示,3分位的分位數(shù)間隔就是
)吗蚌,產(chǎn)生更多的桶腿倚。而 local 可以設(shè)置較大的
,產(chǎn)生更少的桶。
論文給出了兩種近似算法效果的比較:
可以看到敷燎,兩種近似算法在設(shè)置合適的分位數(shù)間隔的情況下都可以達(dá)到與確定性算法相當(dāng)?shù)男Ч蒹荩@證明了近似算法的有效性。此外硬贯,論文中還提到焕襟,local 算法更適合樹(shù)較深的場(chǎng)景。
5饭豹、Weighted Quantile Sketch
上面我們提到的近似算法中很重要的步驟就是對(duì)各個(gè)特征找到合適的分位數(shù)作為候選劃分點(diǎn)鸵赖,從所舉的3分位數(shù)的例子中我們也可以看到,對(duì)于各個(gè)樣本我們是一視同仁的拄衰,也就是說(shuō)它褪,我們?cè)谟?jì)算分位數(shù)的時(shí)候把各個(gè)樣本的權(quán)重都視為1。論文中提出了一種更加合理的 Weighted Quantile Sketch翘悉,即帶權(quán)的分位方案茫打。
記為各樣本的第
個(gè)特征的值以及其對(duì)應(yīng)的二階梯度構(gòu)成的點(diǎn)對(duì)集合。
在此基礎(chǔ)上妖混,我們可以定義一個(gè)排序函數(shù):
上式表示的就是該特征的值小于的樣本權(quán)重和占總樣本權(quán)重和的比例老赤。我們發(fā)現(xiàn),這里我們把二階梯度的值
作為樣本的權(quán)重制市,為什么這樣做接下來(lái)會(huì)提到抬旺。
于是我們就能用下面這個(gè)不等式來(lái)尋找分裂候選點(diǎn):
設(shè)定合適的,并控制相鄰兩個(gè)候選分裂點(diǎn)相差不超過(guò)某個(gè)值
祥楣,則
的整數(shù)值就代表幾分位开财,比如
就是三分位,即有 2 個(gè)候選分裂點(diǎn)荣堰。
下面我們來(lái)看一下為什么用二階導(dǎo)作為樣本的權(quán)重是合理的床未,回到之前我們定義的 loss function 并做一下變形:
注意,這里我們說(shuō)是常數(shù)是因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=g_i" alt="g_i" mathimg="1">和
都是由上一輪迭代的結(jié)果得到的振坚,與當(dāng)前的
無(wú)關(guān)薇搁。此外,這里原論文中把
寫(xiě)成了
渡八,少了一個(gè)負(fù)號(hào)啃洋,這里應(yīng)該是一個(gè)小小的錯(cuò)誤,stackexchange上的相關(guān)回答也指出了這一點(diǎn)屎鳍。
總之宏娄,變形后的 loss function 可以視作標(biāo)簽為,權(quán)重為
的平方損失逮壁。
那么為什么我們?cè)谶x取候選分裂點(diǎn)時(shí)要考慮平方損失的系數(shù)呢孵坚?一種直觀的理解是,越是權(quán)重大的樣本我們?cè)揭?jǐn)慎對(duì)待,因?yàn)橥瑯拥念A(yù)測(cè)偏差卖宠,權(quán)重大的樣本會(huì)帶來(lái)更大的損失巍杈,因此對(duì)權(quán)重大的樣本我們應(yīng)該細(xì)粒度劃分,即盡可能考慮每個(gè)大權(quán)重樣本應(yīng)該劃入左孩子還是右孩子結(jié)點(diǎn)扛伍,而對(duì)小權(quán)重的樣本則不必這么謹(jǐn)慎筷畦,可以采取粗粒度劃分。
一個(gè)實(shí)際的例子如下(圖自知乎wepon):
不難看出刺洒,隨著樣本權(quán)重的增加鳖宾,我們劃分的粒度越來(lái)越細(xì)。
6逆航、 Sparsity-aware Split Finding
在實(shí)際問(wèn)題中鼎文,數(shù)據(jù)稀疏性是十分常見(jiàn)的,可能的原因有:1)數(shù)據(jù)缺失纸泡;2)數(shù)據(jù)零值過(guò)多漂问;3)特征工程的結(jié)果,比如One-hot編碼女揭。
在訓(xùn)練集出現(xiàn)大量數(shù)據(jù)稀疏的情況下,XGBoost 在建樹(shù)時(shí)可能由于當(dāng)前樣例數(shù)據(jù)值缺失無(wú)法判斷被分配到哪個(gè)分支栏饮,最直接的想法就是給定一個(gè)默認(rèn)方向吧兔,當(dāng)數(shù)據(jù)值缺失時(shí)直接將樣例分配給默認(rèn)方向的分支。至于默認(rèn)方向是左還是右則需從數(shù)據(jù)集中學(xué)習(xí)得到袍嬉。
論文中給出的算法如下:
上述算法的主要特點(diǎn)在于只需訪問(wèn)數(shù)據(jù)值無(wú)缺失的樣例境蔼,算法的計(jì)算復(fù)雜度與無(wú)缺失數(shù)據(jù)集的大小呈線性關(guān)系,在數(shù)據(jù)稀疏的情況下能大大減少計(jì)算量伺通。
可以看到箍土,我們對(duì)每個(gè)特征都做兩次遍歷,分別按照無(wú)缺失數(shù)據(jù)集的升序和降序來(lái)遍歷無(wú)缺失的值罐监,從中尋找最優(yōu)的分裂點(diǎn)吴藻。因?yàn)樗惴ㄔ谟?jì)算
和
時(shí)既包含了缺失值的樣例,又包括了無(wú)缺失值的樣例弓柱,而遍歷的時(shí)候只包含了無(wú)缺失值的樣例沟堡,所以兩次遍歷的結(jié)果是不一樣的。
我們把當(dāng)前結(jié)點(diǎn)的數(shù)據(jù)集劃分成在特征
上無(wú)缺失值的
和有缺失值的
矢空,則上述算法考慮兩種情形航罗,第一種是將
按升序排列,并遍歷候選分裂點(diǎn)屁药,得到
和
兩個(gè)分支粥血,然后計(jì)算這樣分裂結(jié)點(diǎn)的得分,找到其中的最大得分作為默認(rèn)方向?yàn)橛业牡梅郑坏诙N是將
按降序排列复亏,并遍歷候選分裂點(diǎn)绢彤,得到
和
兩個(gè)分支,然后計(jì)算這樣分裂結(jié)點(diǎn)的得分蜓耻,找到其中的最大得分作為默認(rèn)方向?yàn)樽蟮牡梅置2啊W詈蟊容^這兩個(gè)得分,選擇得分大的方向作為默認(rèn)方向刹淌。
舉例來(lái)說(shuō)饶氏,當(dāng)前節(jié)點(diǎn)有三個(gè)樣例,其中
是缺失值樣例有勾,
是無(wú)缺失值的樣例疹启。則默認(rèn)方向?yàn)橛倚枰紤]的兩種情形如下:
默認(rèn)方向?yàn)樽笮枰紤]的兩種情形如下:
看起來(lái)是個(gè)很簡(jiǎn)單的做法對(duì)不對(duì),但算法的性能非常不錯(cuò)蔼卡,論文中給出了具體的量化:比基礎(chǔ)算法快50倍喊崖。是非常大的提升了。
7雇逞、Summary
以上就是根據(jù)原論文前 3 章及文中提到的資料整理的對(duì) XGBoost 的粗淺理解荤懂,第 4 章及之后章節(jié)的關(guān)于系統(tǒng)設(shè)計(jì)的部分不是我關(guān)注的重點(diǎn),所以跳過(guò)了塘砸,希望理解到這個(gè)程度可以應(yīng)付大部分面試节仿,日后若發(fā)現(xiàn)有需要進(jìn)一步理解的地方再來(lái)補(bǔ)充。