集成學習的不二法門bagging、boosting和三大法寶<結合策略>平均法,投票法和學習法(stacking)

單個學習器要麼容易欠擬合要麼容易過擬合,爲了得到泛化性能優良的學習器,能夠訓練多個個體學習器,經過必定的結合策略,最終造成一個強學習器。這種集成多個個體學習器的方法稱爲集成學習(ensemble learning)。算法

集成學習經過組合多種模型來改善機器學習的結果,與單一的模型相比,這種方法容許產生更好的預測性能。網絡

集成學習屬於元算法,即結合數個「好而不一樣」的機器學習技術,造成一個預測模型,以此來降方差(bagging),減誤差(boosting),提高預測準確性(stacking)。機器學習

1. 集成學習之個體學習器

個體學習器(又稱爲「基學習器」)的選擇有兩種方式:性能

  • 集成中只包含同種類型的個體學習器,稱爲同質集成 。
  • 集成中包含不一樣類型的個體學習器,爲異質集成 。

目前同質集成 的應用最普遍,而基學習器使用最多的模型是CART決策樹和神經網絡。學習

按照個體學習器之間是否存在依賴關係能夠分爲兩類:測試

  • 個體學習器之間存在強依賴關係,一系列個體學習器基本必須串行生成,表明是boosting系列算法。
  • 個體學習器之間不存在強依賴關係 ,一系列個體學習器能夠並行生成,表明是bagging系列算法。

1.1 boosting算法原理

boosting的算法原理以下所示:spa

 

 

Boosting算法的工做機制是:3d

(1)先從初始訓練集訓練出一個基學習器;blog

(2)再根據基學習器的表現對樣本權重進行調整,增長基學習器誤分類樣本的權重(又稱重採樣);博客

(3)基於調整後的樣本分佈來訓練下一個基學習器;

(4)如此重複進行,直至基學習器數目達到事先指定的個數 [公式] ,將這 [公式] 個基學習器經過集合策略進行整合,獲得最終的強學習器。

Boosting系列算法裏最著名算法主要有AdaBoost算法和提高樹(boosting tree)系列算法。提高樹系列算法裏面應用最普遍的是梯度提高樹(Gradient Boosting Tree)<GDBT>。

1.1.1以adaboost算法爲例

「強學習」和「弱學習」的概念:一個分類,若是存在一個多項式算法可以學習他,並獲得很高的正確率,那麼這個算法稱爲強學習器,反之若是正確率只是稍大於隨機猜想(50%),則稱爲弱學習器。

在實際狀況中,咱們每每會發現弱學習器比強學習器更容易得到,因此就有了可否把弱學習器提高(boosting)爲強學習器的疑問。

因而提高類方法應運而生,它表明了一類從弱學習器出發,反覆訓練,獲得一系列弱學習器,而後組合這些弱學習器,構成一個強學習器的算法。

大多數boost方法會改變數據的機率分佈(改變數據權值),具體而言就是提升前一輪訓練中被錯分類的數據的權值,下降正確分類數據的權值,使得被錯誤分類的數據在下輪的訓練中更受關注;

而後根據不一樣分佈調用弱學習算法獲得一系列弱學習器實現的,再將這些學習器線性組合,具體組合方法是偏差率小的學習器會被增大權值,偏差率大的學習器會被減少權值,典型表明adaboost算法。

1.2. 集成學習之Bagging 算法原理

Bagging的算法原理以下:

 

 

bagging算法的工做機制爲:

(1)對訓練集利用自助採樣法進行[公式]次隨機採樣,每次採樣獲得 [公式] 個樣本的採樣集;

(2)對於這 [公式] 個採樣集,咱們能夠分別獨立的訓練出 [公式] 個基學習器;

(3)再對這 [公式] 個基學習器經過集合策略來獲得最終的強學習器。

值得注意的是這裏的隨機採樣採用的是自助採樣法(Bootstrap sampling),自助採樣法是一種有放回的採樣。

即對於 [公式] 個樣本的原始訓練集,咱們每次先隨機採集一個樣本放入採樣集,接着把該樣本放回,這樣採集 [公式] 次,最終能夠獲得 [公式] 個樣本的採樣集,因爲是隨機採樣,這樣每次的採樣集是和原始訓練集不一樣的,和其餘採樣集也是不一樣的。

對於一個樣本,它每次被採集到的機率是 [公式] 。不被採集到的機率爲 [公式] 。若是[公式]次採樣都沒有被採集中的機率是 [公式] 。則 [公式] ,

即當抽樣的樣本量足夠大時,在bagging的每輪隨機採樣中,訓練集中大約有36.8%的數據沒有被採集中。對於這部分大約36.8%的沒有被採樣到的數據,

咱們經常稱之爲袋外數據(Out Of Bag, 簡稱OOB)。這些數據未參與訓練集模型的擬合,能夠用來檢測模型的泛化能力。

bagging對於弱學習器最經常使用的通常也是決策樹和神經網絡。bagging的集合策略也比較簡單,對於分類問題,一般使用相對多數投票法。對於迴歸問題,一般使用算術平均法。

2. 集成學習之結合策略

上面幾節主要關注於學習器,下面就對集成學習之結合策略作一個總結。咱們假定我獲得的T個弱學習器是 [公式]

2.1 平均法

平均法一般用於迴歸問題。

最簡單的平均是算術平均,即:
[公式] 
也能夠是每一個個體學習器的加權平均,即 :
[公式] 
其中 [公式] 是個體學習器 [公式] 的權重, [公式] 。

2.2 投票法

對於分類問題一般使用投票法。

假設咱們的預測類別是 [公式] ,對於任意一個預測樣本 [公式] ,咱們的 [公式] 個弱學習器的預測結果分別是 [公式] 。主要有如下三種:

  • 相對多數投票法:也就是少數服從多數,即預測結果中票數最高的分類類別。若是不止一個類別得到最高票,則隨機選擇一個做爲最終類別。
  • 絕對多數投票法:即不光要求得到最高票,還要求票過半數。
  • 加權投票法:每一個弱學習器的分類票數要乘以一個權重,最終將各個類別的加權票數求和,最大的值對應的類別爲最終類別。

2.3 Stacking

平均法和投票法僅是對弱學習器的結果作簡單的邏輯處理,而stacking是再加上一層權重學習器(Meta Learner),基學習器(Base learner)的結果做爲該權重學習器的輸入,獲得最終結果。

以兩層爲例,第一層由多個基學習器組成,其輸入爲原始訓練集,第二層的模型則是以第一層基學習器的輸出做爲訓練集進行再訓練,從而獲得完整的stacking模型。

以下圖所示爲Stacking的工做原理:

其中基學習器(Base learner)稱爲初級學習器,用於結合的學習器(Meta Learner)稱爲次級學習器。對於測試集,咱們首先用初級學習器預測一次,將其輸入次級學習器預測,獲得最終的預測結果。

以5折劃分爲例,咱們將原始訓練集分爲5折,分別記爲fold一、fold二、fold三、fold4和fold5。此時咱們使用fold2-fold5的數據來訓練基模型1,並對fold1進行預測,該預測值即做爲基模型1對fold1生成的元特徵;

一樣地,使用fold一、fold3-fold5的數據來訓練基模型1,並對fold2進行預測,該預測值即做爲基模型1對fold2生成的元特徵;以此類推,獲得基模型1對整個原始訓練集生成的元特徵。

一樣地,對其餘基模型也採用相同的方法生成元特徵,從而構成用於第二層模型(下記爲元模型,meta model)訓練的完整元特徵集。對於測試集,咱們能夠在每次基模型訓練好時預測,再將預測值作均值處理;

也能夠將基模型擬合所有的訓練集以後再對測試集進行預測。

須要注意的是,在生成第二層特徵的時候,各個基模型要採用相同的Kfold,這樣獲得的元特徵的每一折(對應於以前的K折劃分)都將不會泄露進該折數據的目標值信息 ,

從而儘量的下降過擬合的風險。雖然如此,實際上咱們獲得的元特徵仍是存在必定程度上的信息泄露,好比咱們在預測第二折的時候,是利用了第一折的目標值信息用於訓練基模型的,

也就是說第一折的目標值信息雜糅在對第二折進行預測的基模型裏。可是,實踐中,這種程度的信息泄露所形成的過擬合程度很小。

可能仍是比較抽象,那咱們用案例描述一下:

上半部分是用一個基礎模型進行5折交叉驗證,如:用XGBoost做爲基礎模型Model1,5折交叉驗證就是先拿出四折做爲training data,另一折做爲testing data。

注意:在stacking中此部分數據會用到整個traing set。如:假設咱們整個training set包含10000行數據,testing set包含2500行數據,那麼每一次交叉驗證其實就是對training set進行劃分,在每一次的交叉驗證中training data將會是8000行,testing data是2000行。

每一次的交叉驗證包含兩個過程,1. 基於training data訓練模型;2. 基於training data訓練生成的模型對testing data進行預測。

在整個第一次的交叉驗證完成以後咱們將會獲得關於當前testing data的預測值,這將會是一個一維2000行的數據,記爲a1。

注意!在這部分操做完成後,咱們還要對數據集原來的整個testing set進行預測,這個過程會生成2500個預測值,

這部分預測值將會做爲下一層模型testing data的一部分,記爲b1。

由於咱們進行的是5折交叉驗證,因此以上說起的過程將會進行五次,最終會生成針對trainning set數據預測的5列2000行的數據a1,a2,a3,a4,a5,對testing set的預測會是5列2500行數據b1,b2,b3,b4,b5。

在完成對Model1的整個步驟以後,咱們能夠發現a1,a2,a3,a4,a5其實就是對原來整個training set的預測值,將他們拼湊起來,會造成一個10000行一列的矩陣,記爲A1。

而對於b1,b2,b3,b4,b5這部分數據,咱們將各部分相加取平均值,獲得一個2500行一列的矩陣,記爲B1。

以上就是stacking中一個模型的完整流程,stacking中同一層一般包含多個模型,假設還有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,

對於這四個模型,咱們能夠重複以上的步驟,在整個流程結束以後,咱們能夠獲得新的A2,A3,A4,A5,B2,B3,B4,B5矩陣。

在此以後,咱們把A1,A2,A3,A4,A5並列合併獲得一個10000行五列的矩陣做爲training data,B1,B2,B3,B4,B5並列合併獲得一個2500行五列的矩陣做爲testing data。讓下一層的模型,基於他們進一步訓練。

 

 

 

 

其實西瓜書裏講的比較粗,我也不清楚究竟是上面的博客講錯了,仍是西瓜沒有講細節,吐血三升。

西瓜書內容以下:

相關文章
相關標籤/搜索