【机器学习】XGBoost学习笔记
推薦博文
https://blog.csdn.net/sb19931201/article/details/52557382
https://www.jianshu.com/p/7467e616f227
xgb講起來還有點復雜,剛開始看算法的時候也是一愣一愣的。白話講一講吧。
先確定一個概念,xgboost是什么?就是一堆二叉樹,準確來講是CART樹,和GBDT一樣,在GBDT中,無論是分類還是回歸,也都是一堆CART樹。當然xgboost還支持其它的基分類器。
直接上與GBDT的一些比較吧,從比較中來分析,為什么XGB能這么牛叉。
XGB的改進
—正則化包括了兩個部分,都是為了防止過擬合,剪枝是都有的,葉子結點輸出L2平滑是新增的。下面的式子就是正則化的式子。加號左邊為葉子節(jié)點樹的復雜度懲罰,右邊是L2正則化。
去掉常數(shù)項之后就長這個樣子。這個損失函數(shù)就是用來建樹的,可以理解成cart樹的MSE建樹過程。后面會做一些變形。
- Shrinkage(縮減),相當于學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節(jié)點的權重乘上該系數(shù),主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數(shù)設置得大一點。(補充:傳統(tǒng)GBDT的實現(xiàn)也有學習速率)
- column subsampling列(特征)抽樣,說是從隨機森林那邊學習來的,防止過擬合的效果比傳統(tǒng)的行抽樣還好(行抽樣功能也有),并且有利于后面提到的并行化處理算法。
- xgboost工具支持并行。boosting不是一種串行的結構嗎?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數(shù)里包含了前面t-1次迭代的預測值)。xgboost的并行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數(shù)據(jù)進行了排序,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得并行成為了可能,在進行節(jié)點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。(其實就是在特征分類的時候,傳統(tǒng)的做法是遍歷每個特征再遍歷每個特征的所有分裂點,然后去尋找一個損失最小的特征的分裂點。這些特征與特征間的選擇是獨立的,所以給了實現(xiàn)并行計算的可能性。同時在分裂點的選取的時候還需要對特征進行排序,這個也是獨立的,所以也給了實現(xiàn)并行計算的可能。)
- 對缺失值的處理。對于特征的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。??—稀疏感知算法,論文3.4節(jié),Algorithm 3: Sparsity-aware Split Finding
- split finding algorithms(劃分點查找算法):
(1)exact greedy algorithm—貪心算法獲取最優(yōu)切分點?
(2)approximate algorithm—?近似算法,提出了候選分割點概念,先通過直方圖算法獲得候選分割點的分布情況,然后根據(jù)候選分割點將連續(xù)的特征信息映射到不同的buckets中,并統(tǒng)計匯總信息。詳細見論文3.3節(jié)?
(3)Weighted Quantile Sketch—分布式加權直方圖算法,論文3.4節(jié)?
這里的算法(2)、(3)是為了解決數(shù)據(jù)無法一次載入內(nèi)存或者在分布式情況下算法(1)效率低的問題,以下引用的還是wepon大神的總結:
可并行的近似直方圖算法。樹節(jié)點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數(shù)據(jù)無法一次載入內(nèi)存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可并行的近似直方圖算法,用于高效地生成候選的分割點。
好了,講完了優(yōu)缺點,大概可以知道了XGBoost改進了哪些地方,接下來就來介紹一下具體的算法流程。
爭取講的簡單一點。
監(jiān)督學習中總會有目標函數(shù)和模型。上圖中就是我們最終想要得到的模型和優(yōu)化模型所用的目標函數(shù)。這里可能什么都看不懂,后面會慢慢解釋。
xbg也是一個加法模型,通GBDT一樣,下一個模型是之前所有模型的累加。但有一點區(qū)別,在GBDT中第二步是計算殘差,但在xgb中新模型的輸出就是實際的預測值了,我們不計算殘差而是直接用預測值與損失函數(shù)去得到下一時刻的決策樹。
是t時刻的預測,我們希望能夠越接近真實值越好,而由加法公式可以知道,是t-1時刻的預測值,我們已經(jīng)知道了。可想而知,t時刻的任務就是擬合使得結果盡可能好,這就是上圖中第二個公式所表達的意思。第三個公式只是把式子展開來之后,把與當前時刻t無關的變量通通扔到了const中去。
這一步對應回GBDT中就是計算負梯度(MSE損失函數(shù)的化就是殘差),不過這邊用了二階導數(shù),海森矩陣。這也是xgb性能更強大的原因之一。(廢話,計算復雜度高了,精度不提高要它干嘛T_T)
樹分裂的打分函數(shù)是什么,就是cart分類樹中的基尼系數(shù)增益或者回歸樹中的mse
xgb也允許我們自定義損失函數(shù),只要它是一階二階可導的
這樣我們就得到了新的目標函數(shù),白話一點也就是t時刻的損失函數(shù)。去掉常數(shù)項時因為是t-1時刻的損失,所以在t時刻是已知的,當作常數(shù)項就去掉了。
后面一串英文講的是,為什么我們要話費如此大的精力去得到目標函數(shù),而不是直接去生成樹。論文從兩方面來講,一方面從理論層面上講,我們是做什么,讓模型達到最優(yōu)解,最優(yōu)解怎么達到,降低誤差,誤差怎么降低,讓損失函數(shù)收斂。從工程層面上來理解,就是為了方便實現(xiàn),可以把模型分離開來,就是損失函數(shù)不依賴于樹的生成過程,只依賴于一階導數(shù)與二階導數(shù),這樣就可以分離開來。
做個小結吧,前面做了這么多事都在干什么呢!其實都是在定義目標函數(shù)。僅僅完成了GBDT中對應的1,2兩步,第一步就是初始化模型為常數(shù)0,第二步對應的是計算負梯度(殘差)。因為在xgb中用到了一階導二階導,所以目標函數(shù)的定義比較復雜。前面這么長的篇幅都只是在解釋,當xgb是如何在gbdt的基礎上改進了這個目標函數(shù)。利用了二階導信息和更新了目標函數(shù)的公式使得模型具有更強大 性能。
補充:其實到這里xgb第二步“負梯度”還沒有計算出來,只是計算了損失函數(shù)L,后面還要推導真正的對應“負梯度”的葉節(jié)點值。
好了,大家回想一下gbdt做完這兩步接下來要做什么了!bingo,接下來就是根據(jù)計算得到的負梯度建新的cart樹。那來回想一下在gbdt中cart樹是怎么被構建的(這里再提一嘴,gbdt無論是分類還是回歸,都是cart回歸樹,對于分類問題只是在最后加了一層激活層,將數(shù)值型變量轉換成對應類別的概率輸出而已。),很簡單,cart樹的構建是通過最小化均方誤差損失來構建的。
在xgb中也差不多類似,不過就是最小化的目標函數(shù)變了一個東西。
先要鋪墊一點東西,xgb做了一些新的定義。
這整個都算是正則項,模型的懲罰項,就在前面的目標函數(shù)中已經(jīng)有了。
在上面我們已經(jīng)得到了目標函數(shù)最后長這個樣子
現(xiàn)在我們把最后的正則項帶進去,然后把替換掉,表示這個樣本在t時刻被樹預測成什么值,其實就是,表示被分到的葉子節(jié)點的值。這么一替換,公式就好看多了
接下來就是一個樹特征分裂的判斷標準了。
臥槽,其實到這邊才真正搞出來對應GDBT中殘差或者負梯度的葉子節(jié)點值W的計算。……
損失函數(shù)的作用在這里才用到了。求增益最大的特征進行分裂。gain越大越好
好,特征分裂完,最后一步就是更新強學習器,用加法模型加上去就結束了。
接下來貼一下完整的算法流程。
好了,接下講一下XGB的一些注意事項
- 多類別分類時,類別需要從0開始編碼
- Watchlist不會影響模型訓練。
- 類別特征必須編碼,因為xgboost把特征默認都當成數(shù)值型的
- 調參:Notes on Parameter Tuning?以及??Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
- 訓練的時候,為了結果可復現(xiàn),記得設置隨機數(shù)種子。
- XGBoost的特征重要性是如何得到的?某個特征的重要性(feature score),等于它被選中為樹節(jié)點分裂特征的次數(shù)的和,比如特征A在第一次迭代中(即第一棵樹)被選中了1次去分裂樹節(jié)點,在第二次迭代被選中2次…..那么最終特征A的feature score就是 1+2+….
正則項:
LightGBM
以后有時間再另開一章。
總結
以上是生活随笔為你收集整理的【机器学习】XGBoost学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】集成学习之梯度提升树GBDT
- 下一篇: 【机器学习】集成学习各方法优缺点特征总结