【譯文】集成學習三大法寶-bagging、boosting、stacking
【譯者說明】
本文翻譯自:https://blog.statsbot.co/ensemble-learning-d1dcd548e936
對於機器學習中集成學習三種方法的介紹和對比的較為清晰。
【正文】
集成學習的思路是通過合併多個模型來提升機器學習性能,這種方法相較於當個單個模型通常能夠獲得更好的預測結果。這也是集成學習在眾多高水平的比賽如奈飛比賽,KDD和Kaggle,被首先推薦使用的原因。
一般來說集成學習可以分為三大類:
- 用於減少方差的bagging
- 用於減少偏差的boosting
- 用於提升預測結果的stacking
集成學習方法也可以歸為如下兩大類:
- 串列集成方法,這種方法串列地生成基礎模型(如AdaBoost)。串列集成的基本動機是利用基礎模型之間的依賴。通過給錯分樣本一個較大的權重來提升性能。
- 並行集成方法,這種方法並行地生成基礎模型(如Random Forest)。並行集成的基本動機是利用基礎模型的獨立性,因為通過平均能夠較大地降低誤差。
大部分集成模型都通過一個基礎學習演算法來生成一個同質的基礎學習器,即同類型的學習器,也叫同質集成。
有同質集成就有異質集成,為了集成後的結果表現最好,異質基礎學習器需要儘可能準確並且差異性夠大。
Bagging(裝袋)
Bagging是引導聚合的意思。減少一個估計方差的一種方式就是對多個估計進行平均。例如,我們可以用訓練集的不同子集(隨機選擇並替代??)訓練M個不同的樹然後計算最後的結果:
Bagging使用裝袋採樣來獲取數據子集訓練基礎學習器。通常分類任務使用投票的方式集成,而回歸任務通過平均的方式集成。
下面通過應用Iris數據集的分類問題來距離說明bagging。我們可以使用兩種基礎模型:決策樹和KNN。圖像1展示了基礎模型與集成模型學習得到的決策邊界。
Accuracy: 0.63 (+/- 0.02) [Decision Tree]
Accuracy: 0.70 (+/- 0.02) [K-NN]
Accuracy: 0.64 (+/- 0.01) [Bagging Tree]
Accuracy: 0.59 (+/- 0.07) [Bagging K-NN]
決策樹學到的是軸平行邊界,然而k=1最近鄰對數據擬合的最好。bagging通過訓練10個基礎模型以及)。隨機選擇80%的數據作為訓練集,同樣隨機選擇80%的特徵進行訓練。
決策樹bagging集成相比K-NN bagging集成獲得了更高的準確率。K-NN對於訓練樣本的擾動並不敏感,這也是為什麼K-NN成為穩定學習器的原因。
整合穩定學習器對於提升泛化性能沒有幫助。
圖像結果同樣展示了通過增加集成模型的個數帶來的測試準確率變化。基於交叉驗證的結果,我們可以看到整合基礎模型個數大於10個之後性能就基本不再提升了,只是帶來了計算複雜度的增加。
最後一張圖繪製的是集成學習模型的學習曲線,注意訓練集數據的平均誤差為0.3,在對訓練集做80%採樣的時候訓練集和驗證集誤差最小。
最常用的集成演算法原模型是森林和隨機數。
在隨機森林中,每個樹模型都是裝袋採樣訓練的。另外,特徵也是隨機選擇的,最後對於訓練好的樹也是隨機選擇的。
這種處理的結果是隨機森林的偏差增加的很少,而由於弱相關樹模型的平均,方差也得以降低,最終得到一個方差小,偏差也小的模型。
在一個極端的隨機樹演算法中,隨機應用的更為徹底:訓練集分割的閾值也是隨機的,即每次劃分得到的訓練集是不一樣的。這樣通常能夠進一步減少方差,但是會帶來偏差的輕微增加。
Boosting(提高)
Boosting指的是通過演算法集合將弱學習器轉換為強學習器。boosting的主要原則是訓練一系列的弱學習器,所謂弱學習器是指僅比隨機猜測好一點點的模型,例如較小的決策樹,訓練的方式是利用加權的數據。在訓練的早期對於錯分數據給予較大的權重。
對於訓練好的弱分類器,如果是分類任務按照權重進行投票,而對於回歸任務進行加權,然後再進行預測。boosting和bagging的區別在於是對加權後的數據利用弱分類器依次進行訓練。
下面描述的演算法是最常用的一種boosting演算法,叫做AdaBoost,表示自適應boosting。
我們可以看到第一個分類器y1(x)是用相等的權重係數進行訓練的。在隨後的boosting中,錯分的數據權重係數將會增加,正確分類的數據權重係數將會減小。
epsilon表示單個分類器的加權錯誤率。alpha是分類器的權重,正確的分類器alpha較大。
AdaBoost演算法的表現如上圖所示。每個基礎模型包含一個深度為1的決策樹,這種決策樹依靠線性劃分進行分類,決策平面跟其中一個軸平行。上圖還展示了集成規模的增加帶來的測試準確率變化以及訓練和測試集的學習曲線。
梯度樹提升(Gradient Tree Boosting)是一個boosting演算法在損失函數上的泛化。能夠用於分類和回歸問題。Gradient Boosting採用串列方式構建模型。
每新增一個決策樹hm(x)都儘可能的選擇是的當前模型Fm-1(x)損失最小的那個:
注意:分類和回歸使用的損失函數有所差別。
Stacking(堆疊)
Stacking是通過一個元分類器或者元回歸器來整合多個分類模型或回歸模型的集成學習技術。基礎模型利用整個訓練集做訓練,元模型將基礎模型的特徵作為特徵進行訓練。
基礎模型通常包含不同的學習演算法,因此stacking通常是異質集成。演算法偽代碼如下:
各基礎模型的預測結果如下:
Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.91 (+/- 0.06) [Random Forest]
Accuracy: 0.92 (+/- 0.03) [Naive Bayes]
Accuracy: 0.95 (+/- 0.03) [Stacking Classifier]
Stacking集成效果如上圖所示。分別在K-NN,Random Forest,Naive Bayes做訓練和預測,然後將其輸出結果作為特徵,利用邏輯回歸作為元模型進一步訓練。如圖所示,stacking集成的結果由於每個基礎模型,並且沒有過擬合。
Stacking被Kaggle競賽獲獎者廣泛使用。例如,Otto Group Product分類挑戰賽的第一名通過對30個模型做stacking贏得了冠軍。他將30個模型的輸出作為特徵,繼續在三個模型中訓練,這三個模型XGBoost,Neural Network和Adaboost,最後再加權平均。詳見文章(https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14335)。
譯者言:鑒於這個網路結構很有代表性,我直接貼過來了,結構如下:
代碼
本文的代碼參見:
https://github.com/vsmolyakov/experiments_with_python/blob/master/chp01/ensemble_methods.ipynb
總結
除了本文所提到的集成學習研究之外,集成學習還被廣泛應用於利用多種分類器做訓練的深度學習模型中。深度學習模型中的分類器可能在架構、超參數以及訓練技巧上存在差異,都可以進行集成。
集成學習已經被證明在數據比賽中能夠獲得較好的成績。
推薦閱讀
- Zhi-Hua Zhou, 「Ensemble Methods: Foundations and Algorithms」, CRC Press, 2012
- L. Kuncheva, 「Combining Pattern Classifiers: Methods and Algorithms」, Wiley, 2004
- Kaggle Ensembling Guide
- Scikit Learn Ensemble Guide
- S. Rachka, MLxtend library
- Kaggle Winning Ensemble
推薦閱讀:
TAG:深度學習DeepLearning | 數據挖掘 | 機器學習 |