1. 程式人生 > >整合學習方法及思想總結

整合學習方法及思想總結

整合學習(Ensemble Learning)有時也被籠統地稱作提升(Boosting)方法,廣泛用於分類和迴歸任務。它最初的思想很簡單:使用一些(不同的)方法改變原始訓練樣本的分佈,從而構建多個不同的分類器,並將這些分類器線性組合得到一個更強大的分類器,來做最後的決策。也就是常說的“三個臭皮匠頂個諸葛亮”的想法。

整合學習的理論基礎來自於Kearns和Valiant提出的基於PAC(probably approximately correct)的可學習性理論 ,PAC 定義了學習演算法的強弱:

弱學習演算法:識別錯誤率小於1/2(即準確率僅比隨機猜測略高的演算法)
強學習演算法:識別準確率很高並能在多項式時間內完成的演算法

根據這兩個概念,後來產生了一個重要的結論:
強可學習與弱可學習是等價的,即:一個概念是強可學習的充要條件是這個概念是弱可學習的

據此,為了得到一個優秀的強學習模型,我們可以將多個簡單的弱學習模型“提升”。

對於整合學習,我們面臨兩個主要問題:
1.如何改變資料的分佈或權重
2.如何將多個弱分類器組合成一個強分類器

針對上述問題,目前主流方法有三種:
1.Boosting方法:包括Adaboosting,提升樹(代表是GBDT), XGBoost等
2.Bagging方法:典型的是隨機森林
3.Stacking演算法

首先介紹經典的樣本估計方法:Bootstrapping


Bootstrapping的名字來自成語“pull up by your own bootstraps”,意思是依靠自己的資源,稱做自助法,是一種有放回的抽樣方法。它是非引數統計中一種重要的通過估計統計量方差進而進行區間估計的統計方法,遵從“在不知道資料總體分佈時,對總體分佈的最好的猜測便是由資料提供的分佈”原則。自助法的要點是:
1.假定觀察值就是資料總體
2.由這一假定的總體抽取樣本,即再抽樣

由原始資料經過再抽樣所獲得的與原始資料集含量相等的樣本稱為再抽樣樣本或自助樣本。由原始資料集計算所得的統計量稱為觀察統計量,由再抽樣樣本計算所得的統計量稱為自助統計量。自助法的關鍵在於自助統計量與觀察統計量間的關係,等價於觀察統計量與真實值之間的關係,即:
自助統計量:觀察統計量 <==> 觀察統計量:真值

具體步驟如下:
1.採用重抽樣方式從原始樣本中抽取一定數量(容量m)的資料,重複抽樣m次,得到一個自助樣本。
2.根據得到的自助樣本計算特定的統計量。
3.重複上述N次,得到N個自助統計量。
4.根據上述N個自助統計量估計出真實值。
  
bootstrap實質上是一種再抽樣過程,相對於其他方法,在小樣本時也具有較好效果。

Boosting

Boosting方法是一種典型的基於bootstrapping思想的應用,其特點是:每一次迭代時訓練集的選擇與前面各輪的學習結果有關,而且每次是通過更新各個樣本權重的方式來改變資料分佈。總結起來如下:

1.分步學習每個弱分類器,最終的強分類器由分步產生的分類器組合而成
2.根據每步學習到的分類器去改變各個樣本的權重(被錯分的樣本權重加大,反之減小)

Adaboosting:

Adaboosting(adaptive boosting)演算法由Schapire於1996年提出,是具體實現boosting方法的最典型代表。

演算法過程簡述為:前一個分類器改變權重w後,成為後一個新的分類器。
如果一個訓練樣本在前一個分類器中被誤分,那麼它的權重會被加大,相反,被正確分類的樣本權重會降低

即:AdaBoost演算法通過給已有模型預測錯誤的樣本更高的權重,使得之前的分類模型出錯的訓練樣本在後續受到更多關注的方式來彌補已有模型的不足。通過每一次迭代改變訓練資料的權值分佈,使得資料在每一個基本分類器的學習中起到不同作用,從而使不同資料發揮各自不同的作用,因此不易發生過擬合

相關的訓練誤差分析表明,每一次迭代後構建的分類器,其分類誤差率隨著迭代次數增加而穩定下降

詳細演算法流程如下:
這裡寫圖片描述
AdaBoost演算法實際上是一種加法模型,損失函式為指數函式,學習演算法為前向分步演算法。

AdaBoost的主要優點如下:
1.是一種有高精度的分類器
2.可以使用各種方法構建子分類器,adaboost演算法提供的是一種框架
3.基本分類器構建簡單,易於理解
4.演算法過程簡單,不用做特徵篩選
5.不易發生過擬合

GBDT:

GBDT (Gradient Boosting Decision Tree),即梯度提升決策樹,又叫又叫 MART(Multiple Additive Regression Tree),是常用的以迴歸樹作為基本分類器、採用梯度提升作為學習演算法、迭代生成決策樹的一種解決迴歸問題的提升模型。

通用的提升樹演算法(boosting tree)是以決策樹作為基本模型,利用前向分步演算法迭代生成新的數,最後組合決策,可以用不同的損失函式,迴歸問題常用平方誤差損失函式,分類問題常用指數損失函式。
這裡寫圖片描述
其中,T表示決策樹

每一次迭代過程中,都是在根據當前模型擬合數據的殘差(residual),即預測值與真實值的差值,作為新的資料去擬合,來生成新樹。

GBDT則是以損失函式的負梯度值作為殘差的近似值,來擬合出一個迴歸樹,使每一步的優化變得簡單。(相比通用的平方損失和指數損失函式更易優化),相當於每一次建立的樹模型是在之前所建樹的損失函式的梯度下降方向上,即:每次模型在梯度方向上的減少的部分,可以看作是一個弱的模型。

GBDT在損失函式中引入了樹的複雜度作為正則項,樹的複雜度定義為:樹的葉子節點的個數T和葉子節點的權重的平方之和:
這裡寫圖片描述
此時,損失函式即目標函式為:
這裡寫圖片描述
具體演算法流程如下:
這裡寫圖片描述
2(a)表示計算損失函式的負梯度在當前模型的值,將其作為殘差的估計值
2(b)表示估計迴歸樹葉子節點的區域,以擬合殘差的近似值
2(c)表示利用線性搜尋估計葉子節點區域的值,使得損失函式最小化
2(d)更新迴歸樹

解釋:
1.初始化,估計使損失函式極小化的常數值,它是隻有一個根節點的樹,即ganma是一個常數值。
2.(a)計算損失函式的負梯度在當前模型的值,將它作為殘差的估計
(b)估計迴歸樹葉節點區域,以擬合殘差的近似值
(c)利用線性搜尋估計葉節點區域的值,使損失函式極小化
(d)更新迴歸樹
3.得到輸出的最終模型 f(x)

總結如下:
1. 演算法每次迭代生成一顆新的決策樹
2. 計算損失函式對每個樣本的一階導和二階導
3. 通過貪心演算法生成新的決策樹,同時計算每個葉子節點的權重w
4. 把新生成的決策樹f(x)新增到模型中

GBDT正則化方法:
1.梯度更新時加入正則化項:即學習率(或叫做步長)([0,1])

2.通過子取樣方法每次選取一部分資料擬合:設定一個子取樣比例,取值為(0,1]。(這裡的子取樣不同於隨機森林,隨機森林使用的是有放回抽樣,這裡是不放回抽樣)如果取值為1,則全部樣本都使用,等於沒有使用子取樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。

選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間。

使用了無放回子取樣的GBDT有時也稱作隨機梯度提升樹(Stochastic Gradient Boosting Tree, SGBT)。由於使用了子取樣,程式可以通過取樣分發到不同的任務去做boosting的迭代過程,最後形成新樹,從而減少弱學習器難以並行學習的弱點,可以在不同分類器層面實現資料的並行訓練。(由於對全體資料存在一個隨機抽樣過程,因此可以並行構建多個不同的梯度提升樹,但對於每一個提升樹仍然是“序列”生成)

3.剪枝:類似決策樹剪枝,在生成一顆樹後,最小化損失函式(含有誤差項和正則項:樹複雜度)來實現剪枝

GBDT主要的優點有:
1.可靈活處理各種型別的資料,包括連續值和離散值
2.在相對少的調參時間情況下,預測的準準確率較高。(相對於SVM)
3.若使用一些健壯的損失函式,使得演算法對異常值的魯棒性非常強。比如 Huber損失函式和Quantile損失函式

GBDT的主要缺點有:
由於弱學習器之間存在依賴關係,難以並行訓練資料。(但可以通過子取樣的SGBT實現部分並行訓練)

目前GBDT的演算法比較好的庫是xgboost和scikit-learn。

Bagging

Bagging (bootstrap aggregating) 方法完全基於bootstrapping思想,即把訓練集看做全體資料的子集,訓練集對全體資料中某引數的估計等價於用訓練集子取樣獲得的資料來估計訓練集。其中,每一次迭代前,採用有放回的隨機抽樣來獲取訓練資料。這樣做直接體現了bagging的一大特點每次迭代不依賴之前建立的模型,即生成的各個弱模型之間沒有關聯,因此就可以徹底實現資料並行訓練。這是bagging方法與上述boosting方法最大的區別。

對於一個樣本,在一次含m個樣本的訓練集的隨機取樣,每次被抽到的概率是1/m。不被抽到的概率為1−1/m。如果m次取樣都沒有被抽到的概率是(1−1/m)m。當m→∞時,(1−1/m)m→1e≃0.368。就是說,在bagging的每輪隨機取樣中,訓練集中大約有36.8%的資料沒有被取樣集抽到。這大約36.8%的沒有被取樣到的資料,我們常常稱之為袋外資料(Out Of Bag, OOB)。這些資料沒有參與訓練集模型的擬合,因此可作為驗證集檢驗模型的效果。

和boosting方法一樣,bagging方法常用的基本模型也是決策樹和神經網路,而且基本模型越簡單,往往最終的整合模型泛化能力越強,越不易發生過擬合。模型組合的方法也很簡單,對於分類任務,一般採用多數投票;對於迴歸任務,則採用算術平均法。

boosting和bagging的區別:
對於Bagging演算法,並行訓練多個不同分類器的目的主要是降低方差,採用了相互獨立的基本分類器後,模型之間不存在依賴關係,效能較為平均,因此對每個基本分類器來說,目標是如何降低偏差,因此通常會採用深度很深而且不剪枝的決策樹。

對於Boosting演算法,每一次迭代都是在上一輪的基礎上擬合原資料,可以保證偏差持續降低,因此對於每一個基本分類器來說,目標是如何選擇方差較小的分類器,也就是選擇更簡單的分類器,因而通常選擇深度很淺的決策樹。反之,如果基本模型較複雜,則方差相對較大,這將導致整體模型的方差很大,從而很容易產生過擬合。因此,boosting框架中的基本模型必須為弱模型

總結如下:
Boosting利用前一輪迭代的誤差率(或殘差)進行擬合訓練(相當於改變原始樣本的權重),每輪的訓練集分佈依賴之前的訓練結果,因而每輪模型只能順序生成。主要關注降低偏差,因此Boosting能基於泛化效能很弱的分類器構建出很強的整合模型

Bagging採取對原始樣本有放回的均勻抽樣方式獲取每一次的資料來訓練,每輪訓練集相互獨立,因而模型可以並行生成。主要關注降低方差,因此它在不剪枝的決策樹、神經網路等模型上效果更好

boosting方法的擬合效果(準確度)更高,bagging方法更不易發生過擬合

隨機森林:

隨機森林(Random Forest)演算法由上世紀八十年代Breiman等人提出來,基本思想就是構造多棵相互獨立的CART決策樹,形成一個森林,利用這些決策樹共同決策輸出類別。隨機森林演算法秉承了bagging方法的思想,以構建單一決策樹為基礎,同時也是單一決策樹演算法的延伸和改進。

在整個隨機森林演算法的過程中,有兩個隨機過程

1.輸入資料是隨機的:從全體訓練資料中選取一部分來構建一棵決策樹,並且是有放回的選取
2.每棵決策樹的構建所需的特徵是從全體特徵中隨機選取的

這兩個隨機過程使得隨機森林在很大程度上避免了過擬合的出現。

具體來說:對於普通的決策樹,一般會在節點上對所有的n個樣本特徵中選擇一個最優的特徵來做決策樹左右子樹的劃分,但隨機森林通過隨機選擇節點上的一部分樣本特徵:nsub個,然後在這些隨機選擇的特徵中,選擇一個最優的特徵來做決策樹的左右子樹劃分,這兩個隨機性使得基本模型之間的相關性顯著降低,方差下降,從而進一步增強了模型的泛化能力。 

如果nsub=n,則此時隨機森林和普通的CART決策樹相同。nsub越小,模型越健壯,然而對於訓練集的擬合程度會變差。nsub越小,模型方差越小,但偏差越大。因此,通常會利用交叉驗證調參來獲取一個合適的nsub值。

隨機森林演算法具體流程:
1.從原始訓練資料中隨機選取n個數據作為訓練資料輸入(通常n遠小於全體訓練資料N,這樣就存在一部分“袋外資料”始終不被取到,它們可以直接用於測試誤差(而無需單獨的測試集或驗證集)。
2.選取了要輸入的訓練資料後,開始構建決策樹,具體方法是每一個結點從全體特徵集M中選取m個特徵進行構建(通常m遠小於M)。
3.在構造每棵決策樹時,選取基尼指數最小的特徵來分裂節點構建決策樹。決策樹的其他結點都採取相同的分裂規則進行構建,直到該節點的所有訓練樣例都屬於同一類或者達到樹的最大深度。(該步驟與構建單一決策樹相同)
4.重複第2步和第3步多次,每一次輸入資料對應一顆決策樹,這樣就得到了一個隨機森林,用於對預測資料進行決策。
5.對待預測資料進行預測時,多棵決策樹同時進行決策,採用多數投票的方式產生最終決策結果。

隨機森林演算法的注意點:
1.在構建決策樹的過程中不需要剪枝
2.整個森林中樹的數量和每棵樹的特徵需要人為設定
3.構建決策樹的時候分裂節點的選擇依據最小基尼係數
4.在訓練時,對於預選變數個數和隨機森林中樹的個數這兩個引數的調優很重要。

隨機森林的優點:
1.兩個隨機性的引入,使得隨機森林抗噪聲能力強,方差小泛化能力強,不易陷入過擬合(因此不需要剪枝
2.易於高度並行訓練,且訓練速度快,適合處理大資料
3.由於可以隨機選擇決策樹節點劃分的特徵,因此能夠處理高維度(特徵多)的資料,事先不用做特徵選擇;而且連續和離散資料均可,且無需歸一化資料。
4.建立隨機森林時,是對引數的無偏估計
5.訓練後,可以給出各個特徵對於輸出結果的重要性排序,並且能夠檢測到特徵間的相互影響
6.相對於boosting系列演算法,實現簡單
7.對部分特徵缺失不敏感
8.由於隨機森林對誤差率是無偏估計,因此在演算法中不需要再進行交叉驗證或者設定單獨的測試集來獲取測試集上誤差的無偏估計

隨機森林的缺點:
對於取值劃分比較多的特徵,容易對隨機森林的決策產生較大影響,從而影響擬合效果。

Stacking

stacking是一種組合多個模型的方法,它主要注重分類器的組合,相對於bagging和boosting使用較少,具體過程如下:

1.劃分訓練資料集為兩個不相交的集合。
2.在第一個集合上訓練多個學習器。
3.在第二個集合上測試這幾個學習器
4.將第三步得到的預測結果作為輸入,將正確的對映作為輸出,訓練一個更高層的分類器

由此可見,對於模型組合方式,不同於前面兩個方法採用多數投票或算術平均的線性組合策略,stacking採用的是基本模型非線性組合的方式。

最後總結一點:bagging和stacking中的基本模型須為強模型(低偏差高方差),boosting中的基本模型為弱模型(低方差高偏差)。