說明:若出現部分圖片沒法正常顯示而影響閱讀,請以此處的文章爲準:xgboost 題庫版。
時間:二零一九年三月二十五日。php
xgboost一直在競賽江湖裏被傳爲神器,好比時不時某個kaggle/天池比賽中,某人用xgboost於千軍萬馬中斬獲冠軍。git
而咱們的機器學習課程裏也必講xgboost,如寒所說:「RF和GBDT是工業界大愛的模型,Xgboost 是大殺器包裹,Kaggle各類Top排行榜曾一度呈現Xgboost一統江湖的局面,另外某次滴滴比賽第一名的改進也少不了Xgboost的功勞」。github
此外,公司七月在線從2016年上半年起,就開始組織學員參加各類比賽,以在實際競賽項目中成長(畢竟,搞AI不可能沒實戰,而參加比賽歷經數據處理、特徵選擇、模型調優、代碼調參,是一個極好的真刀真槍的實戰機會,對能力的提高和找/換工做的幫助都很是大)。算法
AI大潮之下,今年特別多從傳統IT轉行轉崗轉型AI的朋友,不少朋友都諮詢如何轉行AI,我通常都會着重強調學習AI或找/換AI的四大金剛:課程 + 題庫 + OJ + kaggle/天池。包括集訓營的畢業考覈更會融合kaggle或天池比賽。api
考慮到kaggle/天池比賽對搞數學科學的重要性,特寫此文介紹xgboost,助力你們快速入門xgboost以及在比賽中得到優異成績。markdown
最後,xgboost不是我July發明的,但我會確保本文對它的介紹是最通俗易懂的(且本文獲得七月在線AI lab負責人陳博士審校)。另,感謝文末所列的所有參考文獻,有何問題,歡迎隨時留言評論,thanks。框架
舉個例子,集訓營某一期有100多名學員,假定給你一個任務,要你統計男生女生各多少人,當一個一個學員依次上臺站到你面前時,你會怎麼區分誰是男誰是女呢?dom
很快,你考慮到男生的頭髮通常很短,女生的頭髮通常比較長,因此你經過頭髮的長短將這個班的全部學員分爲兩撥,長髮的爲「女」,短髮爲「男」。機器學習
至關於你依靠一個指標「頭髮長短」將整個班的人進行了劃分,因而造成了一個簡單的決策樹,而劃分的依據是頭髮長短。
這時,有的人可能有不一樣意見了:爲何要用「頭髮長短」劃分呀,我可不能夠用「穿的鞋子是不是高跟鞋」,「有沒有喉結」等等這些來劃分呢,答案固然是能夠的。函數
但究竟根據哪一個指標劃分更好呢?很直接的判斷是哪一個分類效果更好則優先用哪一個。因此,這時就須要一個評價標準來量化分類效果了。
怎麼判斷「頭髮長短」或者「是否有喉結」是最好的劃分方式,效果怎麼量化呢?直觀上來講,若是根據某個標準分類人羣后,純度越高效果越好,好比說你分爲兩羣,「女」那一羣都是女的,「男」那一羣全是男的,那這個效果是最好的。但有時實際的分類狀況不是那麼理想,因此只能說越接近這種狀況,咱們則認爲效果越好。
量化分類效果的方式有不少,好比信息增益(ID3)、信息增益率(C4.5)、基尼係數(CART)等等。
信息增益的度量標準:熵
ID3算法的核心思想就是以信息增益度量屬性選擇,選擇分裂後信息增益最大的屬性進行分裂。
什麼是信息增益呢?爲了精確地定義信息增益,咱們先定義信息論中普遍使用的一個度量標準,稱爲熵(entropy),它刻畫了任意樣例集的純度(purity)。給定包含關於某個目標概念的正反樣例的樣例集S,那麼S相對這個布爾型分類的熵爲:
上述公式中,p+表明正樣例,好比在本文開頭第二個例子中p+則意味着去打羽毛球,而p-則表明反樣例,不去打球(在有關熵的全部計算中咱們定義0log0爲0)。
舉例來講,假設S是一個關於布爾概念的有14個樣例的集合,它包括9個正例和5個反例(咱們採用記號[9+,5-]來歸納這樣的數據樣例),那麼S相對於這個布爾樣例的熵爲:
Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940。
So,根據上述這個公式,咱們能夠獲得:
- 若是S的全部成員屬於同一類,則Entropy(S)=0;
- 若是S的正反樣例數量相等,則Entropy(S)=1;
- 若是S的正反樣例數量不等,則熵介於0,1之間
以下圖所示:
看到沒,經過Entropy的值,你就能評估當前分類樹的分類效果好壞了。
更多細節如剪枝、過擬合、優缺點、能夠參考此文《決策樹學習》。
因此,如今決策樹的靈魂已經有了,即依靠某種指標進行樹的分裂達到分類/迴歸的目的,老是但願純度越高越好。
若是用一句話定義xgboost,很簡單:Xgboost就是由不少CART樹集成。但,什麼是CART樹?
數據挖掘或機器學習中使用的決策樹有兩種主要類型:
- 分類樹分析是指預測結果是數據所屬的類(好比某個電影去看仍是不看)
- 迴歸樹分析是指預測結果能夠被認爲是實數(例如房屋的價格,或患者在醫院中的逗留時間)
而術語分類迴歸樹(CART,Classification And Regression Tree)分析是用於指代上述兩種樹的總稱,由Breiman等人首先提出。
2.1 迴歸樹
事實上,分類與迴歸是兩個很接近的問題,分類的目標是根據已知樣本的某些特徵,判斷一個新的樣本屬於哪一種已知的樣本類,它的結果是離散值。而回歸的結果是連續的值。固然,本質是同樣的,都是特徵(feature)到結果/標籤(label)之間的映射。
理清了什麼是分類和迴歸以後,理解分類樹和迴歸樹就不難了。
分類樹的樣本輸出(即響應值)是類的形式,好比判斷這個救命藥是真的仍是假的,週末去看電影《風語咒》仍是不去。而回歸樹的樣本輸出是數值的形式,好比給某人發放房屋貸款的數額就是具體的數值,能夠是0到300萬元之間的任意值。
因此,對於迴歸樹,你無法再用分類樹那套信息增益、信息增益率、基尼係數來斷定樹的節點分裂了,你須要採起新的方式評估效果,包括預測偏差(經常使用的有均方偏差、對數偏差等)。並且節點再也不是類別,是數值(預測值),那麼怎麼肯定呢?有的是節點內樣本均值,有的是最優化算出來的好比Xgboost。
CART迴歸樹是假設樹爲二叉樹,經過不斷將特徵進行分裂。好比當前樹結點是基於第j個特徵值進行分裂的,設該特徵值小於s的樣本劃分爲左子樹,大於s的樣本劃分爲右子樹。
而CART迴歸樹實質上就是在該特徵維度對樣本空間進行劃分,而這種空間劃分的優化是一種NP難問題,所以,在決策樹模型中是使用啓發式方法解決。典型CART迴歸樹產生的目標函數爲:
所以,當咱們爲了求解最優的切分特徵j和最優的切分點s,就轉化爲求解這麼一個目標函數:
因此咱們只要遍歷全部特徵的的全部切分點,就能找到最優的切分特徵和切分點。最終獲得一棵迴歸樹。
2.2 boosting集成學習
所謂集成學習,是指構建多個分類器(弱分類器)對數據集進行預測,而後用某種策略將多個分類器預測的結果集成起來,做爲最終預測結果。通俗比喻就是「三個臭皮匠勝過諸葛亮」,或一個公司董事會上的各董事投票決策,它要求每一個弱分類器具有必定的「準確性」,分類器之間具有「差別性」。
集成學習根據各個弱分類器之間有無依賴關係,分爲Boosting和Bagging兩大流派:
而著名的Adaboost做爲boosting流派中最具表明性的一種方法,本博客曾詳細介紹它。
AdaBoost,是英文"Adaptive Boosting"(自適應加強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。它的自適應在於:前一個基本分類器分錯的樣本會獲得增強,加權後的全體樣本再次被用來訓練下一個基本分類器。同時,在每一輪中加入一個新的弱分類器,直到達到某個預約的足夠小的錯誤率或達到預先指定的最大迭代次數。
具體說來,整個Adaboost 迭代算法就3步:
- 初始化訓練數據的權值分佈。若是有N個樣本,則每個訓練樣本最開始時都被賦予相同的權值:1/N。
- 訓練弱分類器。具體訓練過程當中,若是某個樣本點已經被準確地分類,那麼在構造下一個訓練集中,它的權值就被下降;相反,若是某個樣本點沒有被準確地分類,那麼它的權值就獲得提升。而後,權值更新過的樣本集被用於訓練下一個分類器,整個訓練過程如此迭代地進行下去。
- 將各個訓練獲得的弱分類器組合成強分類器。各個弱分類器的訓練過程結束後,加大分類偏差率小的弱分類器的權重,使其在最終的分類函數中起着較大的決定做用,而下降分類偏差率大的弱分類器的權重,使其在最終的分類函數中起着較小的決定做用。換言之,偏差率低的弱分類器在最終分類器中佔的權重較大,不然較小。
而另外一種boosting方法GBDT(Gradient Boost Decision Tree),則與AdaBoost不一樣,GBDT每一次的計算是都爲了減小上一次的殘差,進而在殘差減小(負梯度)的方向上創建一個新的模型。
boosting集成學習由多個相關聯的決策樹聯合決策,什麼叫相關聯?舉個例子
很快你會意識到,Xgboost爲什麼也是一個boosting的集成學習了。
而一個迴歸樹造成的關鍵點在於:
至於另外一類集成學習方法,好比Random Forest(隨機森林)算法,各個決策樹是獨立的、每一個決策樹在樣本堆裏隨機選一批樣本,隨機選一批特徵進行獨立訓練,各個決策樹之間沒有啥關係。本文暫不展開介紹。
說到Xgboost,不得不先從GBDT(Gradient Boosting Decision Tree)提及。由於xgboost本質上仍是一個GBDT,可是力爭把速度和效率發揮到極致,因此叫X (Extreme) GBoosted。包括前面說過,二者都是boosting方法。
GBDT的原理很簡單,就是全部弱分類器的結果相加等於預測值,而後下一個弱分類器去擬合偏差函數對預測值的梯度/殘差(這個梯度/殘差就是預測值與真實值之間的偏差)。固然了,它裏面的弱分類器的表現形式就是各棵樹。如圖所示:Y = Y1 + Y2 + Y3。
舉一個很是簡單的例子,好比我今年30歲了,但計算機或者模型GBDT並不知道我今年多少歲,那GBDT咋辦呢?
最終,四棵樹的結論加起來,就是真實年齡30歲。實際工程中,gbdt是計算負梯度,用負梯度近似殘差。
注意,爲什麼gbdt能夠用用負梯度近似殘差呢?
迴歸任務下,GBDT 在每一輪的迭代時對每一個樣本都會有一個預測值,此時的損失函數爲均方差損失函數,
那此時的負梯度是這樣計算的
因此,當損失函數選用均方損失函數是時,每一次擬合的值就是(真實值 - 當前模型預測的值),即殘差。此時的變量是,即「當前預測模型的值」,也就是對它求負梯度。
另外,這裏還得再囉嗦一下,上面預測年齡的第一個步驟中的「隨便」二字看似隨便,其實深刻思考一下一點都不隨便,你會發現大部分作預測的模型,基本都是這麼個常規套路,先隨便用一個值去預測,而後對比預測值與真實值的差距,最後不斷調整 縮小差距。因此會出來一系列目標函數:肯定目標,和損失函數:縮小偏差。
再進一步思考,你會發現這徹底符合人類作預測的廣泛常識、廣泛作法,當對一個事物不太瞭解時,一開始也是根據經驗嘗試、初探,直到逼近某種意義上的接近或者徹底吻合。
仍是年齡預測的例子。
簡單起見,假定訓練集只有4我的:A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工做兩年的員工。
因此,如今的問題就是咱們要預測這4我的的年齡,咋下手?很簡單,先隨便用一個年齡好比20歲去擬合他們,而後根據實際狀況不斷調整。
若是是用一棵傳統的迴歸決策樹來訓練,會獲得以下圖所示結果:
如今咱們使用GBDT來作這件事,因爲數據太少,咱們限定葉子節點作多有兩個,即每棵樹都只有一個分枝,而且限定只學兩棵樹。
咱們會獲得以下圖所示結果:
在第一棵樹分枝和圖1同樣,因爲A,B年齡較爲相近,C,D年齡較爲相近,他們被分爲左右兩撥,每撥用平均年齡做爲預測值。
殘差在數理統計中是指實際觀察值與估計值(擬合值)之間的差。「殘差」蘊含了有關模型基本假設的重要信息。若是迴歸模型正確的話, 咱們能夠將殘差看做偏差的觀測值。
進而獲得A,B,C,D的殘差分別爲-1,1,-1,1。
而後拿它們的殘差-一、一、-一、1代替A B C D的原值,到第二棵樹去學習,第二棵樹只有兩個值1和-1,直接分紅兩個節點,即A和C分在左邊,B和D分在右邊,通過計算(好比A,實際值-1 - 預測值-1 = 殘差0,好比C,實際值-1 - 預測值-1 = 0),此時全部人的殘差都是0。
殘差值都爲0,至關於第二棵樹的預測值和它們的實際值相等,則只需把第二棵樹的結論累加到第一棵樹上就能獲得真實年齡了,即每一個人都獲得了真實的預測值。
換句話說,如今A,B,C,D的預測值都和真實年齡一致了。Perfect!
A: 14歲高一學生,購物較少,常常問學長問題,預測年齡A = 15 – 1 = 14
B: 16歲高三學生,購物較少,常常被學弟問問題,預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生,購物較多,常常問師兄問題,預測年齡C = 25 – 1 = 24
D: 26歲工做兩年員工,購物較多,常常被師弟問問題,預測年齡D = 25 + 1 = 26
因此,GBDT須要將多棵樹的得分累加獲得最終的預測得分,且每一次迭代,都在現有樹的基礎上,增長一棵樹去擬合前面樹的預測結果與真實值之間的殘差。
4.1 xgboost樹的定義
本節的示意圖基本引用自xgboost原做者陳天奇的講義PPT中。
舉個例子,咱們要預測一家人對電子遊戲的喜愛程度,考慮到年輕和年老相比,年輕更可能喜歡電子遊戲,以及男性和女性相比,男性更喜歡電子遊戲,故先根據年齡大小區分小孩和大人,而後再經過性別區分開是男是女,逐一給各人在電子遊戲喜愛程度上打分,以下圖所示。
就這樣,訓練出了2棵樹tree1和tree2,相似以前gbdt的原理,兩棵樹的結論累加起來即是最終的結論,因此小孩的預測分數就是兩棵樹中小孩所落到的結點的分數相加:2 + 0.9 = 2.9。爺爺的預測分數同理:-1 + (-0.9)= -1.9。具體以下圖所示
恩,你可能要拍案而起了,驚呼,這不是跟上文介紹的gbdt乃殊途同歸麼?
事實上,若是不考慮工程實現、解決問題上的一些差別,xgboost與gbdt比較大的不一樣就是目標函數的定義。xgboost的目標函數以下圖所示:
其中
咱們能夠很清晰地看到,最終的目標函數只依賴於每一個數據點在偏差函數上的一階導數和二階導數。
額,峯迴路轉,忽然丟這麼大一個公式,很多人可能瞬間就懵了。沒事,下面我們來拆解下這個目標函數,並一一剖析每一個公式、每一個符號、每一個下標的含義。
4.2 xgboost目標函數
xgboost的核心算法思想不難,基本就是
不斷地添加樹,不斷地進行特徵分裂來生長一棵樹,每次添加一個樹,實際上是學習一個新函數,去擬合上次預測的殘差。
注:w_q(x)爲葉子節點q的分數,對應了全部K棵迴歸樹(regression tree)的集合,而f(x)爲其中一棵迴歸樹。
當咱們訓練完成獲得k棵樹,咱們要預測一個樣本的分數,其實就是根據這個樣本的特徵,在每棵樹中會落到對應的一個葉子節點,每一個葉子節點就對應一個分數
最後只須要將每棵樹對應的分數加起來就是該樣本的預測值。
顯然,咱們的目標是要使得樹羣的預測值儘可能接近真實值,並且有儘可能大的泛化能力。
因此,從數學角度看這是一個泛函最優化問題,故把目標函數簡化以下:
如你所見,這個目標函數分爲兩部分:損失函數和正則化項。且損失函數揭示訓練偏差(即預測分數和真實分數的差距) ,正則化定義複雜度。
對於上式而言,是整個累加模型的輸出,正則化項是則表示樹的複雜度的函數,值越小複雜度越低,泛化能力越強,其表達式爲
T表示葉子節點的個數,w表示葉子節點的分數。直觀上看,目標要求預測偏差儘可能小,且葉子節點T儘可能少(γ控制葉子結點的個數),節點數值w儘可能不極端(λ控制葉子節點的分數不會過大),防止過擬合。
插一句,通常的目標函數都包含下面兩項
其中,偏差/損失函數鼓勵咱們的模型儘可能去擬合訓練數據,使得最後的模型會有比較少的 bias。而正則化項則鼓勵更加簡單的模型。由於當模型簡單以後,有限數據擬合出來結果的隨機性比較小,不容易過擬合,使得最後模型的預測更加穩定。
4.2.1 模型學習與訓練偏差
具體來講,目標函數第一部分中的 表示第個樣本, ( − ) 表示第 個樣本的預測偏差,咱們的目標固然是偏差越小越好。
相似以前GBDT的套路,xgboost也是須要將多棵樹的得分累加獲得最終的預測得分(每一次迭代,都在現有樹的基礎上,增長一棵樹去擬合前面樹的預測結果與真實值之間的殘差)。
但,咱們如何選擇每一輪加入什麼呢?答案是很是直接的,選取一個 來使得咱們的目標函數儘可能最大地下降。
再強調一下,考慮到第t輪的模型預測值 = 前t-1輪的模型預測 + ,所以偏差函數記爲: ( , + ) ,後面一項爲正則化項。
對於這個偏差函數的式子而言,在第t步,是真實值,即已知,****可由上一步第t-1步中的加上計算所得,某種意義上也算已知值,故模型學習的是。
上面那個Obj的公式表達的可能有些過於抽象,咱們能夠考慮當 是平方偏差的狀況(至關於),這個時候咱們的目標能夠被寫成下面這樣的二次函數(圖中畫圈的部分表示的就是預測值和真實值之間的殘差):
更加通常的,損失函數不是二次函數咋辦?利用泰勒展開,不是二次的想辦法近似爲二次(如你所見,定義了一階導和二階導)。
恩恩,注意了!很多人可能就會在這裏卡殼,網上也不多有文章解釋清楚,在和七月在線AI lab陳博士討論以後,發現這裏面最關鍵的其實就是把泰勒二階展開各項和xgboost 目標函數的對應關係搞清楚,至關於咱們能夠利用泰勒二階展開去作目標函數的近似。
首先,這是泰勒二階展開
對應到xgboost的目標函數裏頭
忽略損失函數 中的(別忘了上面說的「 在第t步,是真實值,即已知 」,不影響後續目標函數對的偏導計算),作下一一對應:
獲得:
其中,,
嗚呼,透了!不過,這個轉化過程當中的關鍵泰勒二次展開究竟是哪來的呢?
在數學中,泰勒公式(英語:Taylor's Formula)是一個用函數在某點的信息描述其附近取值的公式。這個公式來自於微積分的泰勒定理(Taylor's theorem),泰勒定理描述了一個可微函數,若是函數足夠光滑的話,在已知函數在某一點的各階導數值的狀況之下,泰勒公式能夠用這些導數值作係數構建一個多項式來近似函數在這一點的鄰域中的值,這個多項式稱爲泰勒多項式(Taylor polynomial)。
至關於告訴咱們可由利用泰勒多項式的某些次項作原函數的近似。
泰勒定理:
設 n 是一個正整數。若是定義在一個包含 a 的區間上的函數 f 在 a 點處 n+1 次可導,那麼對於這個區間上的任意 x,都有:其中的多項式稱爲函數在a 處的泰勒展開式,剩餘的是泰勒公式的餘項,是的高階無窮小。
接下來,考慮到咱們的第t 顆迴歸樹是根據前面的t-1顆迴歸樹的殘差得來的,至關於t-1顆樹的值****是已知的。換句話說,對目標函數的優化不影響,能夠直接去掉,且常數項也能夠移除,從而獲得以下一個比較統一的目標函數。
這時,目標函數只依賴於每一個數據點在偏差函數上的一階導數和二階導數(相信你已經看出xgboost和gbdt的不一樣了,目標函數保留了泰勒展開的二次項)。
總的指導原則如就任Google的讀者crab6789所說:
實質是把樣本分配到葉子結點會對應一個obj,優化過程就是obj優化。也就是分裂節點到葉子不一樣的組合,不一樣的組合對應不一樣obj,全部的優化圍繞這個思想展開。
到目前爲止咱們討論了目標函數中的第一個部分:訓練偏差。接下來咱們討論目標函數的第二個部分:正則項,即如何定義樹的複雜度。
4.2.2 正則項:樹的複雜度
首先,梳理下幾個規則
因此當咱們把樹成結構部分q和葉子權重部分w後, 結構函數q把輸入映射到葉子的索引號上面去,而w給定了每一個索引號對應的葉子分數是什麼。
另外,以下圖所示,xgboost對樹的複雜度包含了兩個部分:
在這種新的定義下,咱們能夠把以前的目標函數進行以下變形(另,別忘了:)
其中被定義爲每一個葉節點 j 上面樣本下標的集合 ,g是一階導數,h是二階導數。這一步是因爲xgboost目標函數第二部分加了兩個正則項,一個是葉子節點個數(T),一個是葉子節點的分數(w)。
從而,加了正則項的目標函數裏就出現了兩種累加
這一個目標包含了T個相互獨立的單變量二次函數。
理解這個推導的關鍵在哪呢?在和AI lab陳博士討論以後,其實就在於理解這個定義:被定義爲每一個葉節點 j 上面樣本下標的集合 ,這個定義裏的q(xi)要表達的是:每一個樣本值xi 都能經過函數q(xi)映射到樹上的某個葉子節點,從而經過這個定義把兩種累加統一到了一塊兒。
接着,咱們能夠定義
最終公式能夠化簡爲
經過對求導等於0,能夠獲得
而後把最優解代入獲得:
4.3 打分函數計算
Obj表明了當咱們指定一個樹的結構的時候,咱們在目標上面最多減小多少。咱們能夠把它叫作結構分數(structure score)
4.3.1 分裂節點
頗有意思的一個事是,咱們從頭至尾瞭解了xgboost如何優化、如何計算,但樹到底長啥樣,咱們卻一直沒看到。很顯然,一棵樹的生成是由一個節點一分爲二,而後不斷分裂最終造成爲整棵樹。那麼樹怎麼分裂的就成爲了接下來咱們要探討的關鍵。
對於一個葉子節點如何進行分裂,xgboost做者在其原始論文中給出了兩種分裂節點的方法
(1)枚舉全部不一樣樹結構的貪心法
如今的狀況是隻要知道樹的結構,就能獲得一個該結構下的最好分數,那如何肯定樹的結構呢?
一個想固然的方法是:不斷地枚舉不一樣樹的結構,而後利用打分函數來尋找出一個最優結構的樹,接着加入到模型中,不斷重複這樣的操做。而再一想,你會意識到要枚舉的狀態太多了,基本屬於無窮種,那咋辦呢?
咱們試下貪心法,從樹深度0開始,每一節點都遍歷全部的特徵,好比年齡、性別等等,而後對於某個特徵,先按照該特徵裏的值進行排序,而後線性掃描該特徵進而肯定最好的分割點,最後對全部特徵進行分割後,咱們選擇所謂的增益Gain最高的那個特徵,而Gain如何計算呢?
還記得4.2節最後,咱們獲得的計算式子吧?
換句話說,目標函數中的G/(H+λ)部分,表示着每個葉子節點對當前模型損失的貢獻程度,融合一下,獲得Gain的計算表達式,以下所示:
第一個值得注意的事情是「對於某個特徵,先按照該特徵裏的值進行排序」,這裏舉個例子。
好比設置一個值a,而後枚舉全部x < a、a < x這樣的條件(x表明某個特徵好比年齡age,把age從小到大排序:假定從左至右依次增大,則比a小的放在左邊,比a大的放在右邊),對於某個特定的分割a,咱們要計算a左邊和右邊的導數和。
好比總共五我的,按年齡排好序後,一開始咱們總共有以下4種劃分方法:
接下來,把上面4種劃分方法全都各自計算一下Gain,看哪一種劃分方法獲得的Gain值最大則選取哪一種劃分方法,通過計算,發現把第2種劃分方法「前面兩我的和後面三我的劃分開」獲得的Gain值最大,意味着在一分爲二這個第一層層面上這種劃分方法是最合適的。
換句話說,對於全部的特徵x,咱們只要作一遍從左到右的掃描就能夠枚舉出全部分割的梯度和GL和GR。而後用計算Gain的公式計算每一個分割方案的分數就能夠了。
而後後續則依然按照這種劃分方法繼續第二層、第三層、第四層、第N層的分裂。
第二個值得注意的事情就是引入分割不必定會使得狀況變好,因此咱們有一個引入新葉子的懲罰項。優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小於一個閥值γ 的時候,則忽略這個分割。
換句話說,當引入某項分割,結果分割以後獲得的分數 - 不分割獲得的分數獲得的值過小(好比小於咱們的最低指望閥值γ),但卻所以獲得的複雜度太高,則至關於得不償失,不如不分割。即作某個動做帶來的好處比所以帶來的壞處大不了太多,則爲避免複雜 多一事不如少一事的態度,不如不作。
至關於在咱們發現「分」還不如「不分」的狀況下後(獲得的增益過小,小到小於閾值γ),會有2個葉子節點存在同一棵子樹上的狀況。
下面是論文中的算法
(2)近似算法
主要針對數據太大,不能直接進行計算
就任於Google的讀者crab6789點評:
把樣本從根分配到葉子結點,就是個排列組合。不一樣的組合對應的cost不一樣。求最好的組合你就要try,一味窮舉是不可能的,因此纔出來貪婪法。不看從頭至尾 就看當下節點怎麼分配最好。這纔有了那個exact greddy方法,後來還想加速纔有了histogram的作法。
4.4 小結:Boosted Tree Algorithm
總結一下,如圖所示
我們來再次回顧整個過程。
若是某個樣本label數值爲4,那麼第一個迴歸樹預測3,第二個預測爲1; 另一組迴歸樹,一個預測2,一個預測2,那麼傾向後一種,爲何呢?前一種狀況,第一棵樹學的太多,太接近4,也就意味着有較大的過擬合的風險。
OK,聽起來很美好,但是怎麼實現呢,上面這個目標函數跟實際的參數怎麼聯繫起來,記得咱們說過,迴歸樹的參數:
最終的策略就是:貪心 + 最優化(對的,二次最優化) 。
通俗解釋貪心策略:就是決策時刻按照當前目標最優化決定,說白了就是眼前利益最大化決定,「目光短淺」策略。
這裏是怎麼用貪心策略的呢,剛開始你有一羣樣本,放在第一個節點,這時候T=1,w多少呢,不知道,是求出來的,這時候全部樣本的預測值都是w,帶入樣本的label數值,此時loss function變爲
接着來,接下來要選個feature分裂成兩個節點,變成一棵弱小的樹苗,那麼須要:
在分裂的時候,你能夠注意到,每次節點分裂,loss function被影響的只有這個節點的樣本,於是每次分裂,計算分裂的增益(loss function的下降量)只須要關注打算分裂的那個節點的樣本。
總而言之,XGBoost使用了和CART迴歸樹同樣的想法,利用貪婪算法,遍歷全部特徵的全部特徵劃分點,不一樣的是使用的目標函數不同。具體作法就是分裂後的目標函數值比單子葉子節點的目標函數的增益,同時爲了限制樹生長過深,還加了個閾值,只有當增益大於該閾值才進行分裂。
如下便爲設定的閾值
從而繼續分裂,造成一棵樹,再造成一棵樹,每次在上一次的預測基礎上取最優進一步分裂/建樹,是否是貪心策略?
凡是這種循環迭代的方式一定有中止條件,何時中止呢?簡言之,設置樹的最大深度、當樣本權重和小於設定閾值時中止生長以防止過擬合。具體而言,則
終於大體搞懂了這個常常刷屏的xgboost,再次印證我以前說過的一句話:當你學習某個知識點感受學不懂時,十有八九不是你不夠聰明,十有八九是你所看的資料不夠通俗、不夠易懂(若是仍是不行,問人)。
但願閱讀此文的你,也有一樣的感覺。
如下的本文的改進過程,供理解上參考:
看徹底文後,你會發現理解xgboost有三個關鍵點:①4.2.1節中,理清楚xgboost目標函數各項和泰勒展開二項的一一對應關係,②4.2.2節中對計算數的得分w時使用的一個數學技巧,③4.3.1節中所示的樹的分裂算法。理清了這三點,則理解xgboost再也不有障礙。
July、二零一八年八月六日晚上~二零一九年一月十四日晚上。