1. 程式人生 > >【機器學習】XGBoost學習筆記

【機器學習】XGBoost學習筆記

推薦博文

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

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

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

XGB的改進

  1. 傳統GBDT以CART作為基分類器,xgboost還支援線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。 —可以通過booster [default=gbtree]設定引數:gbtree: tree-based models/gblinear: linear models
  2. xgboost在代價函式里加入了正則項,用於控制模型的複雜度。正則項裡包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性 
    —正則化包括了兩個部分,都是為了防止過擬合,剪枝是都有的,葉子結點輸出L2平滑是新增的。
    下面的式子就是正則化的式子。加號左邊為葉子節點樹的複雜度懲罰,右邊是L2正則化。
  3. 傳統GBDT在優化時只用到一階導數資訊,xgboost則對代價函式進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支援自定義代價函式,只要函式可一階和二階求導。 —對損失函式做了改進(泰勒展開,一階資訊g和二階資訊h),下圖就具體展示了目標函式。

去掉常數項之後就長這個樣子。這個損失函式就是用來建樹的,可以理解成cart樹的MSE建樹過程。後面會做一些變形。

  • Shrinkage(縮減),相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是為了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,一般把eta設定得小一點,然後迭代次數設定得大一點。(補充:傳統GBDT的實現也有學習速率)
  • column subsampling列(特徵)抽樣,說是從隨機森林那邊學習來的,防止過擬合的效果比傳統的行抽樣還好(行抽樣功能也有),並且有利於後面提到的並行化處理演算法。
  • xgboost工具支援並行。boosting不是一種序列的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函式裡包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對資料進行了排序,然後儲存為block結構,後面的迭代中重複地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多執行緒進行。(其實就是在特徵分類的時候,傳統的做法是遍歷每個特徵再遍歷每個特徵的所有分裂點,然後去尋找一個損失最小的特徵的分裂點。這些特徵與特徵間的選擇是獨立的,所以給了實現平行計算的可能性。同時在分裂點的選取的時候還需要對特徵進行排序,這個也是獨立的,所以也給了實現平行計算的可能。)
  • 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。  —稀疏感知演算法,論文3.4節,Algorithm 3: Sparsity-aware Split Finding
  • split finding algorithms(劃分點查詢演算法):

(1)exact greedy algorithm—貪心演算法獲取最優切分點 
(2)approximate algorithm— 近似演算法,提出了候選分割點概念,先通過直方圖演算法獲得候選分割點的分佈情況,然後根據候選分割點將連續的特徵資訊對映到不同的buckets中,並統計彙總資訊。詳細見論文3.3節 
(3)Weighted Quantile Sketch—分散式加權直方圖演算法,論文3.4節 
這裡的演算法(2)、(3)是為了解決資料無法一次載入記憶體或者在分散式情況下演算法(1)效率低的問題,以下引用的還是wepon大神的總結:

可並行的近似直方圖演算法。樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法列舉所有可能的分割點。當資料無法一次載入記憶體或者在分散式情況下,貪心演算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖演算法,用於高效地生成候選的分割點。

好了,講完了優缺點,大概可以知道了XGBoost改進了哪些地方,接下來就來介紹一下具體的演算法流程。

爭取講的簡單一點。

監督學習中總會有目標函式和模型。上圖中就是我們最終想要得到的模型和優化模型所用的目標函式。這裡可能什麼都看不懂,後面會慢慢解釋。

xbg也是一個加法模型,通GBDT一樣,下一個模型是之前所有模型的累加。但有一點區別,在GBDT中第二步是計算殘差,但在xgb中新模型的輸出就是實際的預測值了,我們不計算殘差而是直接用預測值與損失函式去得到下一時刻的決策樹。

\tilde{y}_i^{(t)}是t時刻的預測,我們希望\tilde{y}_i^{(t)}能夠越接近真實值越好,而由加法公式可以知道\tilde{y}_i^{(t)} = \tilde{y}_i^{(t-1)} +f_t{(x_i)}\tilde{y}_i^{(t-1)}是t-1時刻的預測值,我們已經知道了。可想而知,t時刻的任務就是擬合f_t{(x_i)}使得結果儘可能好,這就是上圖中第二個公式所表達的意思。第三個公式只是把式子展開來之後,把與當前時刻t無關的變數通通扔到了const中去。

這一步對應回GBDT中就是計算負梯度(MSE損失函式的化就是殘差),不過這邊用了二階導數,海森矩陣。這也是xgb效能更強大的原因之一。(廢話,計算複雜度高了,精度不提高要它幹嘛T_T)

樹分裂的打分函式是什麼,就是cart分類樹中的基尼係數增益或者回歸樹中的mse

xgb也允許我們自定義損失函式,只要它是一階二階可導的

這樣我們就得到了新的目標函式,白話一點也就是t時刻的損失函式。去掉常數項時因為l(y_i,\hat{y}_i^{t-1})是t-1時刻的損失,所以在t時刻是已知的,當作常數項就去掉了。

後面一串英文講的是,為什麼我們要話費如此大的精力去得到目標函式,而不是直接去生成樹。論文從兩方面來講,一方面從理論層面上講,我們是做什麼,讓模型達到最優解,最優解怎麼達到,降低誤差,誤差怎麼降低,讓損失函式收斂。從工程層面上來理解,就是為了方便實現,可以把模型分離開來,就是損失函式不依賴於樹的生成過程,只依賴於一階導數與二階導數,這樣就可以分離開來。

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

補充:其實到這裡xgb第二步“負梯度”還沒有計算出來,只是計算了損失函式L,後面還要推導真正的對應“負梯度”的葉節點值。

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

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

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

這整個都算是正則項,模型的懲罰項,就在前面的目標函式中已經有了。

在上面我們已經得到了目標函式最後長這個樣子

現在我們把最後的正則項帶進去,然後把f_t{(x_i)}替換掉,f_t{(x_i)}表示x_i這個樣本在t時刻被樹預測成什麼值,其實就是w_{q(x_i)},表示x_i被分到的葉子節點的值。這麼一替換,公式就好看多了

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

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

損失函式的作用在這裡才用到了。求增益最大的特徵進行分裂。gain越大越好

好,特徵分裂完,最後一步就是更新強學習器,用加法模型加上去就結束了。

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

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

  • 多類別分類時,類別需要從0開始編碼
  • Watchlist不會影響模型訓練。
  • 類別特徵必須編碼,因為xgboost把特徵預設都當成數值型的
  • 訓練的時候,為了結果可復現,記得設定隨機數種子。
  • XGBoost的特徵重要性是如何得到的?某個特徵的重要性(feature score),等於它被選中為樹節點分裂特徵的次數的和,比如特徵A在第一次迭代中(即第一棵樹)被選中了1次去分裂樹節點,在第二次迭代被選中2次…..那麼最終特徵A的feature score就是 1+2+….

正則項:

LightGBM

以後有時間再另開一章。

相關推薦

機器學習XGBoost學習筆記

推薦博文 xgb講起來還有點複雜,剛開始看演算法的時候也是一愣一愣的。白話講一講吧。 先確定一個概念,xgboost是什麼?就是一堆二叉樹,準確來講是CART樹,和GBDT一樣,在GBDT中,無論是分類還是迴歸,也都是一堆CART樹。當然xgboost還支援其它的

機器學習XgBoost 原理詳解 數學推導

XgBoost   (Xtreme Gradient Boosting 極限 梯度 增強) 1.基本描述:             假設Xg-模型有 t 顆決策樹數,t棵樹有序串聯構成整個模型,各決策樹的葉子節點數為 k1,k2,...,kt,             

Apache KafkaKafka學習筆記

local ets prop strong 當前 text 生產 create topic 0x00 基本信息 1、Kafka架構圖 2、環境信息 服務器IP:xx.xx.xx.xx 操作系統:CentOS7.2_x64 Kafka版本:kafka_2.12-1.1

深度學習Pytorch 學習筆記

chang www. ans 如何 ret == 筆記 etc finished 目錄 Pytorch Leture 05: Linear Rregression in the Pytorch Way Logistic Regression 邏輯回歸 - 二分類 Lect

Redis資料庫命令學習筆記——釋出訂閱、事務、指令碼、連線命令彙總

本篇基於redis 4.0.11版本,學習釋出訂閱、事務、指令碼、連線的相關命令。 Redis 釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息。 序

微服務Springcloud學習筆記(一) —— Eureka

SpringCloud基本特性 分散式配置中心 服務註冊/發現(Eureka) 智慧路由(Zuul) 服務間的呼叫 客戶端負載均衡(Ribbon) 斷路器(Hystrix) 分散式訊息管理

機器學習整合學習+程式碼實現

1. 概念與分類 整合學習(ensemble learning)構建並結合多個學習器,先學習基學習器,再根據某種策略結合起來。 結合可以是:①整合不同演算法;②整合同一演算法不同設定;③資料集分成多部分分給不同分類器的整合。 分類:bagging, boosting 2

論文閱讀深度學習與多種機器學習方法在不同的藥物發現數據集進行對比

論文來源: Comparison of Deep Learning With Multiple Machine Learning Methods and Metrics Using Diverse Drug Discovery Data Sets 機器學習方法在醫藥研究

機器學習整合學習(一)----基本思想和方法

整合學習可謂是機器學習中的大殺器,諸如GBDT(梯度提升樹),RF(隨機森林)這些演算法都是用到了整合學習的思想。這一篇主要就是複習一下Boosting,Bagging和Stacking這三種方法和常用的結合策略。 整合學習(Ensemble Learni

我的javaEE學習elTagJsl學習筆記

一、EL表示式 1、EL簡介 不是一種語言,只是一個表示式而已,是JSP中專門用於顯示資料用的,從JSP2.0主要作用:獲取資料並顯示到頁面上。     簡單易用: <% List<Book> cart = (List<Book>)requ

整理自用統計學習機器學習常見演算法(整理更新)

K近鄰法 詳見《統計學習》P53頁。 程式碼收藏90Zeng的部落格Kd樹的c++實現。 在利用kd樹搜尋最鄰近點的時候有一句話: 當前最近點一定存在於該結點一個子結點對應的區域,檢查子結點的父結點的另一子結點對應的區域是否有更近的點。具體做法是,

點分治學習筆記和眾多例題

【前言】   最近一段時間變成了通過題目學習演算法,似乎整個人都亂套了(反思ing)   不過還好,現在又調整為了學演算法後做題。(唉,最近一段時間有點急躁,要記住萬事不能速成啊) 【正題】點分治   一句話:點分治主要用於樹上路徑點權統計問題。

尚矽谷spring學習筆記(1):HelloWorld

1、安裝SPRING TOOL SUITE 這個 Eclipse 外掛。2、搭建spring開發環境,引入jar包。3、建立spring專案3.1、建立一個HelloWorld類public class HelloWorld { private String name;

IOS學習CoreText學習筆記(二)設定文字屬性和插入圖片

設定文字和圖片的方法: 繪製文字的步驟是:設定NSAttributedString 或NSMutableAttributedString——> 通過attributedString 生成frameSetter ——> 生成CTFrame——>畫出來設定文字

C/C++STL學習筆記

STL 什麼是STL STL(Standard Template Library)是C++標準庫的一部分(80%),是用C++ Template機制來表達泛型的庫。 面向過程——基於物件——面向物件——泛型 STL其實就是一個模板庫,這個模板庫主要由

Unity開發Unity3d學習筆記記錄

1.釋出到 ipad字型顯示不出來,改變Position位置的Z軸為-1 2.釋出打包有問題,記得使用者許可權有沒有設定 3.ipad4解析度:2048*1536 4.調整介面大小,儘量調整底下子物件位置 5.Anchor->offset->(錨定位置,讓位置固

GTD180007:運維LINUX學習

from .com inux adt shel http https chat pub Linux運維入門教程 --阿銘出品 https://ke.qq.com/course/71060#tuin=9a54a3fd10天學會Linux Shell編程 --阿銘出品 htt

dubbo基礎dubbo學習過程、使用經驗分享及實現原理簡單介紹

multi spring配置 不同 影響 為什麽 exception 同事 sock services 一、前言 部門去年年中開始各種改造,第一步是模塊服務化,這邊初選dubbo試用在一些非重要模塊上,慢慢引入到一些稍微重要的功能上,半年時間,學習過程及線上使用遇到的些問

收集資料OpenGL學習

cor mic spa post 學習 sch code 開源 HR 1、課本配套網站,有Sample Code和書中的圖片等 http://math.ucsd.edu/~sbuss/MathCG/ 2、Visual C++的幫助系統可查閱基本OpenGL函數(不包括G

衛星軌道初步學習,零散知識點

說明:加粗為矩陣或者向量 常數項 m*a = (G*M*m) / r^2;   可知a = (G*M) / r^2;  a = -(G*M*r) / r^3 (負號代表加速度a指向地心) G(引力常數) = 6.67259*e^-11( m^3*kg