XGBoost核心讲解笔记(贪心学院)
Bagging和Boosting對比
老師的PPT中對比了 Bagging 和 Boosting 兩種常用的集成學習方法。
- Bagging:利用多個過擬合的弱學習器來獲得更好的效果。典型的算法有隨機森林。
(請了很多專家回答問題,一起討論爭論) - Boosting:利用多個欠擬合的弱學習器來獲得更好的效果。典型的算法有GBDT/GBRT,Adaboost,XGBoost和LightGBM。(請了一群小學生回答問題)
Bagging
像是隨機森林,這種bagging系的算法,它們的思想是訓練多個模型每個模型去預測一個結果,然后對這些結果進行加權平均得到最終的預測結果。
Boosting
boosting是基于殘差的訓練,每個模型在上一個模型預測結果與真實值的殘差的基礎上再進行訓練,達到迭代次數或設定的閾值后停止,最終將各個模型的結果進行求和得到。
提升樹-基于殘差的訓練
在介紹XGBoost之前,還要介紹一下提升樹的概念,其實提升樹的算法思想是跟XGBoost相同的。
就像上面的三幅圖像展示的那樣,模型2在模型1的殘差基礎上進行擬合預測,而模型3則在模型2的基礎上進行,最終的結果就像下面的圖所示的那樣是多個模型預測結果的和。
XGBoost
學習路徑
XGBoost的介紹流程將會像圖片展示的那樣進行,算法的核心也就是這四個步驟。在第一步構建目標函數后,后面的三步則更傾向于是對目標函數的優化。由于構造的目標函數并不能夠像邏輯回歸那樣是連續的,可以直接使用SGD進行優化,因此在算法的第二步使用了泰勒級數的方法去展開目標函數,將一些常量給提取分離出來,能夠簡化計算;在第三步中,則是考慮如何將樹的結構進行參數化,帶入到目標方程;第四步則是要查找結構最優的一棵樹,而在查找的過程中采用貪心的算法進行,整個查找的過程是一個NP—hard問題。
目標函數構建
我們的預測一定是相加的。
i表示第i個樣本,k表示第k棵樹
第二顆樹來預測第i個樣本+第二顆樹來預測第i個樣本+······+第k顆樹來預測第i個樣本
我們最終的預測結果是k棵樹預測結果之和,而目標函數的組成有兩部分,第一部分是損失函數(loss function),表示真實值與預測值的差距,具體的損失函數可以選用MSE、交叉熵等,在這篇博客中不做詳細介紹;第二部分是penalty /regularization用來控制模型的復雜度,是在控制樹的復雜度,是一個懲罰項,經典的示例是正則化。樹的復雜度可能會涉及到樹的葉節點數、深度、葉節點值等,但具體如何去參數化實現我們還不太清楚,這個會在后面進一步講解。
葉節點值越大,說明這顆樹的復雜度越高。
我們要預測的值是1000,每顆樹要預測的值在100-200之間,這個時候我們只需要10棵樹,或是說不到10棵樹就能湊夠1000了。
當我們降低復雜度的時候,比方說100-200變成了20-30,這個時候我們需要50棵樹。
化簡目標函數
有了目標函數以后,我們還沒有好的辦法直接對它進行求解,還需要進行化簡。
當我訓練第k棵樹,1到k-1棵樹是已知的。
上面的推導,我們做的主要工作是將前k-1個模型的相關表示和第k個模型給分開,這樣當我們在訓練第k個模型時前k-1個的相關表示便是常量,能夠簡化運算。
觀察上面經過簡化的目標函數,我們現在不知道是fk(xi)f_{k}(x_{i})fk?(xi?)和Ω(fk)\Omega (f_{k})Ω(fk?)這兩個函數如何表達,這將會在下面兩節中進行介紹。
使用泰勒級數近似目標函數
泰勒展開在我們大學的高等數學中就已經學過了,它的主要思想是用多項式的形式去近似一些復雜函數,使得在實際工程能夠求解得到算數解。
在我們學習優化算法時,梯度下降算法就是利用了一階的泰勒展開,而牛頓法則是使用的二階泰勒展開,所以在實際的使用中,牛頓法比梯度下降收斂得更快。
盡管我們對目標函數進行了化簡,但直接對目標函數進行求解,運算的復雜度會非常高,所以我們選擇對目標函數進行二級泰勒展開,提高模型的訓練速度。
當訓練第k棵樹的時候,gig_{i}gi?和hih_{i}hi?是前k-1棵樹傳遞給訓練第k棵樹時的信息
接下來我們要做的事情就是把fk(xi)f_{k}(x_{i})fk?(xi?)和Ω(fk)\Omega(f_{k})Ω(fk?)用參數的方式表示,然后把參數找出來。
樹結構的參數化
重新定義一棵樹
這里詳細介紹一下,各個符號的含義
- www是一個向量,存儲的是葉子節點的值
- q(x)q(x)q(x)表示樣本x的位置,即它屬于哪一個葉節點,在公式中用作表示ω的下標
- 再需要定義一個IjI_{j}Ij?,是一個集合,表示落在j節點的樣本
IjI_{j}Ij?用作解決函數中q(x)q(x)q(x)為www的下標問題(參數的下標也是一個函數,處理起來非常麻煩),這種表示方式并不標準化,IjI_{j}Ij?就用來將這個公式給標準化。
樹的復雜度
樹的復雜度 = 葉節點個數 + 葉節點值
T是葉節點個數數,γ和λ控制權重,是樹的葉節點數更重要呢,還是葉節點的值更重要呢?若嚴格控制葉節點個數γ要調大一些,若嚴格控制葉節點值(值越小越好)λ要調大一些。
新的目標函數
這樣,將上面得到的表達式帶入到我們化簡得到的目標函數中,得
樹的形狀已知的條件下,我們可以得到新目標函數的最優解
上面紅框部分依舊是常數,我們用GiG_{i}Gi?和HiH_{i}Hi?i表示,得
其實,得到的這個函數本質上是一個一元二次函數,因此在wiw_{i}wi?=-b/2a時,能夠取到整個函數的最值
這樣就得到了第k棵樹的最優解。
第k棵樹的形狀可能有很多個,知道第k棵樹的形狀(其中一種)我們可以立馬求出目標函數的最優解(其中一個)。
現在的問題變成怎么從這么多樹的形狀中去尋找其中一種樹的形狀讓目標函數最小。
貪心尋找最優結構樹
尋找樹的形狀
利用brute-force search的方法把書的所有結構羅列出來,是指數級別的復雜度,顯然是不可取的,還是得回到貪心的法則上。
尋找的思路與決策樹的構建是一致的,都是去最大程度降低系統的混亂度,比如說,ID3算法每次尋找某個特征去分割節點時,依據的標準就是讓信息增益最大,也就是讓整個系統的混亂度降低。
在這里采用的不是熵,而是Obj的值,每次分割節點都是依據Obj值的增量盡可能的大。
尋找最好的Split
以這個方式不斷去構造我們的樹
總結
以上是生活随笔為你收集整理的XGBoost核心讲解笔记(贪心学院)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LESSON 10.110.210.3
- 下一篇: Lesson 2.矩阵运算基础、矩阵求导