1. 程式人生 > >第七講:決策樹+隨機森林+AdaBoost(下)

第七講:決策樹+隨機森林+AdaBoost(下)

本講主要內容

4 整合學習(下)

    4.3 Boosting

        4.3.1 AdaBoost

        4.3.2 損失函式回顧

        4.3.3 提升樹(Boosting Trees)

        4.3.4 正則化


4 整合學習(下)

4.3 Boosting

 

提升(Boosting)是一種常用的統計學習方法,在分類問題中,它通過改變訓練樣本的權重,學習多個分類器(一般是弱分類器),並將這些分類器線性組合,最終提高分類器的效能。而針對於這種提升方法而言,需要回答兩個問題,一是在每一輪如何改變訓練樣本的權值或概率分佈;二是如何將弱分類器組合成一個強分類器。

----摘自《統計學習方法》


4.3.1 AdaBoost

 

Adaboost屬於Boosting一種,那麼,它是如何回答上面兩個問題的呢?針對第一個問題,Adaboost的做法是提高那些被前一輪弱分類器錯誤分類樣本的權值,而降低那些被正確分類的樣本的權重。從而使得那些被錯誤分類的樣本由於其權值被加大而受到後一輪弱分類器的更多的關照(關注)。而針對第二個問題,Adaboost採取加權多數表決的方法,加大分類誤差率小的弱分類器的權重,使其在最終的分類器表決中起較大作用,減小分類誤差率大的弱分類器的權重,使其在表決中起較小的作用。總結起來,有兩個權重的概念,一個是增大錯誤分類樣本的權重,一個增大分類誤差率小的弱分類器的權重。

 

演算法

古人有云,吃虧是福。AdaBoost顯然就是這樣一種善於“積(chi)福(ku)”的方法。在每一輪的迭代中,它都想辦法從上一輪迭代中“欺負”它的樣本身上學到更多東西,即提高那些錯誤分類資料的權值。同時,AdaBoost還是一種非常有自知之明的方法,它知道自己那些地方做得好,哪些地方做得不好,據此給分類誤差率小的基本分類器以大的權值,給分類誤差率大的基本分類器以小的權值。AdaBoost的演算法流程如下:


演算法描述:

 

1)首先初始化各個樣本的權重,為1/m,m為樣本數量,有些書本可能會這樣初始化,每個正樣本權重為1/2u,每個負樣本權重為1/2v,u+v等於樣本總數。這對於得到最終的強分類器並沒有影響。

 

2)開始進行迭代,在每一輪的迭代中:

  ◆ 尋找到一個弱分類器使得在當前樣本權重分佈下的錯誤率最小;

  ◆ 當確定了這樣一個弱分類器後,計算錯誤率

  ◆ 根據誤差率計算此弱分類器在最終的強分類器中所佔的權重

  ◆ 根據公式更新訓練樣本的權值分佈;

  ◆ 將此弱分類器加入到當前迭代次數下的強分類器中。

 

3)直到迭代次數達到指定數值或者強分類器在訓練集上的誤差達到指定範圍停止迭代。

 

從以上的論述中我們可以得到AdaBoost的兩個特點,一是不改變所給的訓練資料,而不斷改變訓練資料權值的分佈,使得訓練資料在基本分類器的學習中起不同的作用;二是利用基本分類器的線性組合構建最終分類器。

 


例子 

 

  1. 第一次迭代我們給所有樣本相同的權重,找到當前權重分佈下,分類誤差率最小的一個弱分類器;

  2. 第二次迭代,經過上一輪弱分類器分類之後,有三個樣本被分錯,加大其權重,找到在當前權重分佈下,誤差率最小的一個弱分類器;

  3. 以此類推;

  4. 最終,我們將得到的一系列弱分類器加權組合起來就得到了一個強分類器(實黑線所示)。


策略

細心的讀者可能發現了,AdaBoost的學習與以往的機器學習演算法不同,我們已經學習了AdaBoost演算法,AdaBoost[4]演算法是早在1995年就被提出,但是一直無人能夠給出一個合理的演算法解釋,直到2000年才有人用很好的理論[3]來解釋它的模型以及損失函式。那麼它的模型和損失函式是什麼呢?為什麼弱分類器的分類誤差計算公式及其權值更新公式是演算法中描述的那樣的呢?首先給出結論:

AdaBoost演算法是前向分步演算法的一個特例。這時,模型是基本模型組成的加法模型,損失函式是指數函式,演算法是前向分步演算法。損失函式:

模型:

如何得到在訓練集上的分類誤差率的係數,以及訓練集樣本的權值更新公式呢?

   

 

在證明前,我們先介紹前向分步演算法。給定一個加法模型:

其中,b為基函式,γm為基函式的引數,βm為基函式的係數。在給定訓練資料及損失函式L(y,f(x))的條件下,學習加法模型f(x)成為經驗風險最小化即損失函式最小化問題:

 

通常這是一個複雜的優化問題,一次性求解所有基函式的引數以及其係數比較困難。前向分步演算法(forward stagewise algorithm)求解這一優化問題的思路是:因為學習的是加法模型,如果能夠從後向前,每一步只學習一個基函式及其係數,逐步逼近其目標函式式,那麼就可以簡化優化的複雜度。具體地,每步只需優化如下損失函式:

瞭解了前向分步演算法,下面我們就要證明上述結論了。

從我們的模型入手:

假設表示第0次迭代後的模型,表示第m次迭代後的模型,有:

那麼經過m次迭代所產生的最終模型,表示為前m-1次迭代產生的模型,加上第m次迭代產生的加權基函式。帶入我們的損失函式:

即第m輪迭代的基函式以及其係數必然滿足下述極小化式:

對上式變形:

其中,注意到這一項是與以及無關的。

即:

進一步展開,

其中從第一步到第二步,因為

同異號可用指示函式表示。

 

因為以及無關,可以看到所求的滿足下列極小化式(藍色方框)

 

假設我們已經求得了,那接下來求它的係數。對求偏導,令其等於0:

 

即得:

其中,

進一步化簡:

 

可以看到的公式是不是與演算法中的一模一樣呢?最後推匯出訓練集樣本權值的更新公式:

 

由模型:

以及權值:

可以方便得到:

看完上述內容,是不是對AdaBoost理解更加深刻了一些呢?

 

4.3.2 損失函式回顧

 

  • 理想的0-1損失函式

0-1損失是指,預測值和目標值不相等為1,否則為0:

這類損失函式並不常用,因為其有間斷點,不可導。

 

  • 基於最小二乘法的分類

最小二乘法是線性迴歸的一種,OLS將問題轉化成了一個凸優化問題。線上性迴歸中,它假設樣本和噪聲都服從高斯分佈,最後通過極大似然估計(MLE)可以推匯出最小二乘式子。最小二乘的基本原則是:最優擬合直線應該是使各點到迴歸直線的距離和最小的直線,即平方和最小。換言之,OLS是基於距離的,而這個距離就是我們用的最多的歐幾里得距離。

這類損失函式的優點是有解析解,但它的缺點也很明顯,就是對“壞點”非常敏感,並且當f(x)的值很大時損失也很大,“妒忌心”很重。

 

  • SVM的合頁損失函式

在機器學習演算法中,hinge損失函式和SVM是息息相關的。線上性支援向量機中,最優化問題可以等價於下列式子:

接下來對這個式子做一下變形,令

於是,原式就變成了

若進一步表示成

那麼它和下式就非常像了

前半部分中的就是hinge損失函式,而後面相當於L2正則項,說明SVM損失函式是正則化了的hinge損失函式。這類損失函式線性懲罰誤分類的點,魯棒性較強。

 

  • AdaBoost的指數損失函式

在上文中我們已經討論過,AdaBoost方法的損失函式是指數損失函式。這類損失函式連續,可導,接近理想的0-1損失,對太正確的點懲罰低,收斂快,誤分類點的損失指數增長,魯棒性較差。

 

  • 邏輯斯蒂迴歸的指數損失函式

AdaBoost的損失函式可以改成Logistic Regression的損失函式,從而更加魯棒,這樣的演算法稱作“GentleBoost”。在每次迭代時,基於最小二乘去做一個加權迴歸,最後所有迴歸函式的和作為最終的分類器。

 

這幾種損失函式隨y*f(x)的變化如下圖所示。

4.3.3 提升樹(Boosting Trees)

 

提升樹是以分類樹或迴歸樹為基本分類器的提升方法。提升樹被認為是統計學習中效能最好的方法之一。


模型

提升方法實際採用加法模型(即基函式的線性組合)與前向分步演算法。以決策樹為基函式的提升方法成為提升樹。對分類問題決策樹是二叉分類樹,對迴歸問題決策樹是二叉迴歸樹。只有一個條件的基本分類器可以看做是由一個根結點直接連線兩個葉結點簡單決策樹,即所謂的決策樹樁(decision stump)。提升樹模型可以表示為決策樹的加法模型:

其中,T(x; θm)表示決策樹;θm為決策樹的引數;M為樹的個數。提升樹中樹之間沒有權重,或者說它們的權重都是一樣的,樹之間是獨立的,訓練樣本之間也沒有權重的概念,這是提升樹和隨機森林、AdaBoost之間的區別。


演算法

提升樹演算法採用前向分步演算法。首先確定初始提升樹f0(x)=0,第m步的模型是:

其中,m-1(x)為當前模型,通過經驗風險最小化確定下一決策樹的引數θm:

由於樹的線性組合可以很好地擬合訓練資料,即使資料中的輸入與輸出之間關係很複雜也是如此。所以提升樹是一個高功能的學習演算法。

不同問題中的提升樹學習演算法的主要區別在於使用的損失函式不同。例如用平方損失函式的迴歸問題,用指數損失函式的分類問題,以及用一般損失函式的一般決策問題。

  • 迴歸問題

迴歸問題提升樹使用以下前向分步演算法:

在前向分步演算法的第m步,給定當前模型m-1(x),需求解

得到第m棵樹的引數。

 

當採用平方誤差損失函式時,

其損失變為

r是當前模型擬合數據的殘差(residual)。所以,對迴歸問題的提升樹演算法來說,只需簡單地擬合當前模型的殘差。

  • 一般決策問題-梯度提升樹(GBDT)

對於梯度提升樹,其學習流程與提升樹類似,只是不再使用殘差作為新的訓練資料而是使用損失函式的梯度作為新的新的訓練資料的y值,具體的來說就是使用損失函式對f(x)求梯度然後帶入fm-1(x)計算:

GDBT與提升樹之間的關係:

提升樹模型每一次的提升都是靠上次的預測結果與訓練資料的label值差值作為新的訓練資料進行重新訓練,GDBT則是將殘差計算替換成了損失函式的梯度方向,將上一次的預測結果帶入梯度中求出本輪的訓練資料,也就是說這兩種模型在生成新的訓練資料時採用了不同的方法。在使用平方誤差損失函式和指數損失函式時,提升樹的殘差求解比較簡單,但是在使用一般的損失誤差函式時,殘差求解起來不是那麼容易,所以就使用損失函式的負梯度在當前模型的值作為迴歸問題中殘差的近似值。

 

上述給出的提升樹是損失函式採用平方損失的版本,當採用其他損失函式的時候,可以將其細分為若干類演算法。

注:該表來源於《Machine learning:A Probabilistic Perspective》p587.

 

工具


✓ Ensemble Learning Framework

(http://elf-project.sourceforge.net/)

✓ AdaBoost Matlab Toolbox

(http://graphics.cs.msu.ru/en/science/research/machinelearning/adaboosttoolbox)

✓ XGBoost

(https://github.com/dmlc/xgboost)

✓ LightGBM

( https://github.com/Microsoft/LightGBM/wiki/Features)

 

其中XGBoost以及微軟推出的LightGBM可以說是Boosting利器,其在cup以及kaggle上的眾多資料探勘競賽中,幫助參賽者取得了很多優秀的成果。關於XGBoost以及LightGBM的安裝和使用,筆者將會在近期推送一篇相關文章,幫助大家快速上手。

 

4.3.4 正則化

在這一部分我們來討論Boosting方法中的幾種正則化方法。

 


驗證集

 

為了防止過擬合,首先我們可以設定一個驗證集,在驗證集上調整葉子結點的個數J和樹的課數M。尋找最優M的過程類似神經網路的Early Stopping策略。

 

Early stopping:一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練資料集迭代收斂之前停止迭代來防止過擬合。 Early stopping方法的具體做法:1. 首先將訓練資料劃分為訓練集和驗證集(劃分比例為2:1); 2. 在訓練集上進行訓練,並且在驗證集上獲取測試結果(比如每隔5個epoch測試一下),隨著epoch的增加,如果在驗證集上發現測試誤差上升,則停止訓練; 3. 將停止之後的權重作為網路的最終引數。

 


Shrinkage

 

我們可以採用的第二種正則化策略是對加入模型的樹進行縮放:

這裡的縮放因子我們可以將其理解為學習率。那麼類比學習率對模型的影響,我們不難得出這樣的結論:相同的M,較小的v導致較大的訓練風險;v較小,需要較大的M;v和M共同控制模型的泛化能力。在實際應用中通常採用使用較小的v ,通過early stopping選擇M。

 


Penalty

 

最後要介紹的這種策略是一種“廣泛撒網,重點選拔”的方法,即先訓練出大量的樹,然後選擇好的樹放到最終的模型中。大致的迴歸演算法如下所示。

 

即在原本的策略中加一個罰項,從而訓練並選出泛化能力更好的模型。

 

注:文中所有推導均可在課件中找到,回覆「課件」二字即可領取。

 

Reference

[1] 李航 . 統計學習方法 . 清華大學出版社,北京(2012)

[2] 周志華 . 機器學習 . 清華大學出版社,北京(2016)

[3]Friedman, Jerome, T. Hastie, and R. Tibshirani. "Additive logistic regression: a statistical view of boosting (With discussion and a rejoinder by the authors)." Annals of Statistics 28.2(2000):337-374.

[4]Yoav Freund, and Robert E. Schapire. A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting ☆, ☆☆Computational Learning Theory. Springer Berlin Heidelberg, 1995:119-139.