Boosting算法進化史

背景算法

當前的熱門算法中,除了神經網絡在圖像和文字、音頻等領域大放異彩以外,集成學習中的xgboost,lightGBM,CatBoost也在kaggle等機器學習平臺上成爲了煊赫一時的工具。網絡

 

明確概念:機器學習

一、Boosting(提高)ide

二、Adaptive Boosting(自適應加強)函數

三、Gradient Boosting(梯度提高)工具

四、Decision Tree(決策樹)性能

 

1、Boosting學習

關於boosting(提高算法)的概念,上文有簡單介紹過,提高算法(這是一類算法族的稱呼,不是指某種具體算法)是經過改變訓練樣本的權重(若是基分類器不支持則經過調整採樣的方式改變基分類器的訓練樣本分佈),學習多個分類器,並將這些分類器進行線性組合,提升分類的性能。下面要講的集成算法都屬於提高算法優化

 

2、Adaboost(Adaptive Boosting自適應加強算法)spa

 針對分類任務,李航的《統計學習方法》中有詳細介紹

 

 

 

總結一下流程以下圖所示

 

 

 

 

 

通過上述學習,咱們已經能夠明確adaboost的核心是

1)計算基分類器的偏差

2)計算基分類器的權重

3)更新樣本的權重

4)最後的結合策略

針對迴歸任務,adaboost有如下步驟

 

 

 

 

 

 

3、GBDTGBDT泛指全部梯度提高樹算法,包括XGBoost,它也是GBDT的一種變種,爲了區分它們,GBDT通常特指「Greedy Function Approximation:A Gradient Boosting Machine」裏提出的算法,只用了一階導數信息。)

參考自:https://zhuanlan.zhihu.com/p/46445201

GBDT是以CART樹(迴歸樹)做爲基分類器的boosting算法。與Adaboost經過每次調整樣本的權值來訓練不一樣的基分類器不一樣,GBDT是經過將殘差做爲擬合目標訓練心得基分類器。

先看一下GBDT應用於迴歸任務的原理

 

 

 

其實,我一直對GBDT中的「梯度提高」很不理解,由於最優化理論中,梯度降低優化算法已經很熟悉了,拿二者進行比較,我老是以爲GBDT依然是「梯度降低」而非「梯度提高」,以下圖是某個博客上的對比

 

 ,這分明都是使用的「梯度降低」。

在參考了不少資料以後,我終於明白了GBDT爲何使用「梯度提高」的叫法了。這裏的「梯度提高」並非和「梯度降低」對立的概念,相反,應該把它拆解開來

 「梯度提高」=「梯度」+「提高」

「梯度」是指GBDT算法中使用梯度近似擬合殘差的作法

「提高」是指boosting方法中將弱學習器提高爲強學習器的作法

再附一個GBDT實際應用於迴歸任務的例子

 

 

 

GBDT應用於分類任務

 針對二分類任務,

 

 

 

 

 

 

 

 以上,最重要的一點就是,針對分類任務每一個基分類器擬合的是真實標籤與和對應類別預測機率的殘差。

 

 

4、XGBoost(eXtreme Gradient Boosting)

從名字就能夠看出,xgboost是GBDT的加強版本。

若是把xgboost對gbdt的全部改進細節列出來,那牽扯的point有點多,因此選擇幾個點進行闡述。

爲了用最容易理解的思路,咱們就假設不知道xgboost算法,先去思考GBDT的過程當中有哪些點能夠改進:

一、基學習器的選擇。

GBDT使用CART(迴歸樹)做爲基學習器,咱們還能夠考慮支持其餘的基學習器,因此xgboost也支持線性學習器

二、損失函數的選擇。

GBDT大多數狀況下采用平方偏差和做爲損失函數,咱們還能夠考慮更優秀的損失函數,因此xgboost實現了本身的損失函數。

三、特徵分裂點及特徵選擇。

GBDT採用CART樹的特徵分裂點及特徵選擇方式,具體爲串行遍歷全部的特徵分裂點和特徵,選擇平方偏差和最小的特徵及特徵分裂點;

這個過程當中,咱們注意到各特徵及分割點的損失函數的計算能夠並行執行,並且若是對樣本按照特徵排序的結果在全局能夠複用,可大大提升計算效率,而xgboost也是這樣作的。

另外,GBDT的每棵樹的特徵選擇策略都是相同的,方差較小,多樣性不足,咱們能夠借鑑隨機森林中列抽樣(隨機變量選擇)的思想,xgboost也實現了這一點。

四、不一樣的樹對於殘差的擬合策略

GBDT採用殘差的一階導數代替殘差進行擬合(這裏須要說明,許多資料說用一階導代替殘差的緣由是殘差難以得到,這好扯淡啊,擬合一階導的優勢明明是爲了更快地進行擬合,並且當損失函數爲平方偏差和時,一階導就等於殘差),發散一下咱們就想到了梯度降低和牛頓法,那咱們能不能使用二階導來擬合殘差呢,答案是確定的,且xgboost也是這樣作的,並且經過二階導擬合策略計算出了xgboost的損失函數(見步驟2)。損失函數不只考慮到了經驗風險,也考慮到告終構風險,經過結構風險正則化,使得xgboost泛化性能更佳,更不容易過擬合。

 

5、LightGBM

該算法在精度,運行效率和內存消耗等方面在絕大多數數據集上的表現都優於xgboost。

咱們沿用上面的思路,繼續思考在xgboost的優化基礎上,怎樣進一步優化GB類的算法。

一、boosting過程當中,最耗時的就是特徵選擇及連續特徵分裂點選取的問題,xgboost已經經過pre-sorted預排序的方法進行了優化,可是若是樣本對應的特徵枚舉值過多,仍是會致使耗時過長的問題。因此咱們能夠考慮HistoGram(直方圖)算法,經過預先對樣本的特徵進行分桶(bin)的方式,在選擇分裂點的時候遍歷各個桶,就能夠有效地提升運行效率,雖然會稍微損失一點精度,可是能夠經過其它的優化進行彌補。

二、結點的分裂策略。GBDT和xgboost在樹的分裂過程當中,都採用level-wise(相似層序遍歷)的分裂方式,這種方式平等地對待了分裂貢獻可能相差很大的同一層的不一樣子結點。lightGBM採用leaf-wise(相似深度優先遍歷)分裂策略,每一步都選擇最深的貢獻最大的子結點進行分裂。

三、採樣方法。不管是GBDT仍是xgboost,咱們都是在不停地訓練基學習器去擬合殘差,當殘差小於某個閾值時中止訓練,可能存在這樣一種狀況,對於大多數樣原本講,其梯度已經較小,而小部分樣本的梯度仍較大,因此咱們想到能夠在每次訓練新的基學習器時,保留梯度較大的樣本,減小梯度較小的樣本數量(隨機採樣),這即是GOSS方法(Gradient-based One-Side Sampling)。

 

ok,,,寫得本身很不滿意,先出初版,後面迭代優化吧。。。還想補一下catboost。。。

相關文章
相關標籤/搜索