日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】XGBoost学习笔记

發(fā)布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】XGBoost学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

推薦博文

https://blog.csdn.net/sb19931201/article/details/52557382

https://www.jianshu.com/p/7467e616f227


xgb講起來還有點復雜,剛開始看算法的時候也是一愣一愣的。白話講一講吧。

先確定一個概念,xgboost是什么?就是一堆二叉樹,準確來講是CART樹,和GBDT一樣,在GBDT中,無論是分類還是回歸,也都是一堆CART樹。當然xgboost還支持其它的基分類器。


直接上與GBDT的一些比較吧,從比較中來分析,為什么XGB能這么牛叉。

XGB的改進

  • 傳統(tǒng)GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。?—可以通過booster [default=gbtree]設置參數(shù):gbtree: tree-based models/gblinear: linear models
  • xgboost在代價函數(shù)里加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節(jié)點個數(shù)、每個葉子節(jié)點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個特性?
    —正則化包括了兩個部分,都是為了防止過擬合,剪枝是都有的,葉子結(jié)點輸出L2平滑是新增的。
    下面的式子就是正則化的式子。加號左邊為葉子節(jié)點樹的復雜度懲罰,右邊是L2正則化。
  • 傳統(tǒng)GBDT在優(yōu)化時只用到一階導數(shù)信息,xgboost則對代價函數(shù)進行了二階泰勒展開,同時用到了一階和二階導數(shù)。順便提一下,xgboost工具支持自定義代價函數(shù),只要函數(shù)可一階和二階求導。?—對損失函數(shù)做了改進(泰勒展開,一階信息g和二階信息h),下圖就具體展示了目標函數(shù)。
  • 去掉常數(shù)項之后就長這個樣子。這個損失函數(shù)就是用來建樹的,可以理解成cart樹的MSE建樹過程。后面會做一些變形。

    • Shrinkage(縮減),相當于學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節(jié)點的權重乘上該系數(shù),主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數(shù)設置得大一點。(補充:傳統(tǒng)GBDT的實現(xiàn)也有學習速率)
    • column subsampling列(特征)抽樣,說是從隨機森林那邊學習來的,防止過擬合的效果比傳統(tǒng)的行抽樣還好(行抽樣功能也有),并且有利于后面提到的并行化處理算法。
    • xgboost工具支持并行。boosting不是一種串行的結(jié)構(gòu)嗎?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數(shù)里包含了前面t-1次迭代的預測值)。xgboost的并行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對數(shù)據(jù)進行了排序,然后保存為block結(jié)構(gòu),后面的迭代中重復地使用這個結(jié)構(gòu),大大減小計算量。這個block結(jié)構(gòu)也使得并行成為了可能,在進行節(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é):

    可并行的近似直方圖算法。樹節(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時刻的任務就是擬合使得結(jié)果盡可能好,這就是上圖中第二個公式所表達的意思。第三個公式只是把式子展開來之后,把與當前時刻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ù),這樣就可以分離開來。


    做個小結(jié)吧,前面做了這么多事都在干什么呢!其實都是在定義目標函數(shù)。僅僅完成了GBDT中對應的1,2兩步,第一步就是初始化模型為常數(shù)0,第二步對應的是計算負梯度(殘差)。因為在xgb中用到了一階導二階導,所以目標函數(shù)的定義比較復雜。前面這么長的篇幅都只是在解釋,當xgb是如何在gbdt的基礎上改進了這個目標函數(shù)。利用了二階導信息和更新了目標函數(shù)的公式使得模型具有更強大 性能。

    補充:其實到這里xgb第二步“負梯度”還沒有計算出來,只是計算了損失函數(shù)L,后面還要推導真正的對應“負梯度”的葉節(jié)點值。


    好了,大家回想一下gbdt做完這兩步接下來要做什么了!bingo,接下來就是根據(jù)計算得到的負梯度建新的cart樹。那來回想一下在gbdt中cart樹是怎么被構(gòu)建的(這里再提一嘴,gbdt無論是分類還是回歸,都是cart回歸樹,對于分類問題只是在最后加了一層激活層,將數(shù)值型變量轉(zhuǎn)換成對應類別的概率輸出而已。),很簡單,cart樹的構(gòu)建是通過最小化均方誤差損失來構(gòu)建的。

    在xgb中也差不多類似,不過就是最小化的目標函數(shù)變了一個東西。

    先要鋪墊一點東西,xgb做了一些新的定義。

    這整個都算是正則項,模型的懲罰項,就在前面的目標函數(shù)中已經(jīng)有了。

    在上面我們已經(jīng)得到了目標函數(shù)最后長這個樣子

    現(xiàn)在我們把最后的正則項帶進去,然后把替換掉,表示這個樣本在t時刻被樹預測成什么值,其實就是,表示被分到的葉子節(jié)點的值。這么一替換,公式就好看多了


    接下來就是一個樹特征分裂的判斷標準了。

    臥槽,其實到這邊才真正搞出來對應GDBT中殘差或者負梯度的葉子節(jié)點值W的計算。……


    損失函數(shù)的作用在這里才用到了。求增益最大的特征進行分裂。gain越大越好


    好,特征分裂完,最后一步就是更新強學習器,用加法模型加上去就結(jié)束了。


    接下來貼一下完整的算法流程。

    好了,接下講一下XGB的一些注意事項

    • 多類別分類時,類別需要從0開始編碼
    • Watchlist不會影響模型訓練。
    • 類別特征必須編碼,因為xgboost把特征默認都當成數(shù)值型的
    • 調(diào)參:Notes on Parameter Tuning?以及??Complete Guide to Parameter Tuning in XGBoost (with codes in Python)
    • 訓練的時候,為了結(jié)果可復現(xiàn),記得設置隨機數(shù)種子。
    • XGBoost的特征重要性是如何得到的?某個特征的重要性(feature score),等于它被選中為樹節(jié)點分裂特征的次數(shù)的和,比如特征A在第一次迭代中(即第一棵樹)被選中了1次去分裂樹節(jié)點,在第二次迭代被選中2次…..那么最終特征A的feature score就是 1+2+….

    正則項:

    LightGBM

    以后有時間再另開一章。

    總結(jié)

    以上是生活随笔為你收集整理的【机器学习】XGBoost学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。