集成學習(ensemble learning)經過構建並結合多個學習器來完成學習任務。
html
如何產生「好而不一樣」的個體學習器,是集成學習研究的核心。python
集成學習的思路是經過合併多個模型來提高機器學習性能,這種方法相較於當個單個模型一般可以得到更好的預測結果。這也是集成學習在衆多高水平的比賽如奈飛比賽,KDD和Kaggle,被首先推薦使用的緣由。git
通常來講集成學習能夠分爲三大類:github
集成學習方法也能夠歸爲以下兩大類:算法
大部分集成模型都經過一個基礎學習算法來生成一個同質的基礎學習器,即同類型的學習器,也叫同質集成。api
有同質集成就有異質集成,爲了集成後的結果表現最好,異質基礎學習器須要儘量準確而且差別性夠大。架構
Bagging是引導聚合的意思。減小一個估計方差的一種方式就是對多個估計進行平均。例如,咱們能夠用訓練集的不一樣子集(隨機選擇並替代訓練集)訓練M個不一樣的樹而後計算最後的結果:dom
Bagging使用裝袋採樣來獲取數據子集訓練基礎學習器。一般分類任務使用投票的方式集成,而回歸任務經過平均的方式集成。1)從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping(有放回)的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被屢次抽取到,而有些樣本可能一次都沒有被抽中)。共進行k輪抽取,獲得k個訓練集。(咱們這裏假設k個訓練集之間是相互獨立的,事實上不是徹底獨立)機器學習
2)每次使用一個訓練集獲得一個模型,k個訓練集共獲得k個模型。可是是同種模型。(注:,k個訓練集雖然有重合不徹底獨立,訓練出來的模型由於是同種模型也是不徹底獨立。這裏並無具體的分類算法或迴歸方法,咱們能夠根據具體問題採用不一樣的分類或迴歸方法,如決策樹、感知器等)ide
3)對分類問題:將上步獲得的k個模型採用投票的方式獲得分類結果;對迴歸問題,計算上述模型的均值做爲最後的結果。(全部模型的重要性相同)
對於Bagging須要注意的是,每次訓練集能夠取所有的特徵進行訓練,也能夠隨機選取部分特徵訓練,例如隨機森林就是每次隨機選取部分特徵
經常使用的集成算法模型是隨機森林和隨機樹
在隨機森林中,每一個樹模型都是裝袋採樣訓練的。另外,特徵也是隨機選擇的,最後對於訓練好的樹也是隨機選擇的。
這種處理的結果是隨機森林的誤差增長的不多,而因爲弱相關樹模型的平均,方差也得以下降,最終獲得一個方差小,誤差也小的模型。
在一個極端的隨機樹算法中,隨機應用的更爲完全:訓練集分割的閾值也是隨機的,即每次劃分獲得的訓練集是不同的。這樣一般可以進一步減小方差,可是會帶來誤差的輕微增長。
下面經過應用Iris數據集的分類問題來距離說明bagging。
咱們可使用兩種基礎模型:決策樹和KNN。圖中展現了基礎模型與集成模型學習獲得的決策邊界。
Accuracy: 0.63 (+/- 0.02) [Decision Tree] Accuracy: 0.64 (+/- 0.01) [Bagging Tree]
Accuracy: 0.70 (+/- 0.02) [K-NN] 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和bagging的區別在因而對加權後的數據利用弱分類器依次進行訓練。
boosting是一族可將弱學習器提高爲強學習器的算法,這族算法的工做機制相似:
下面描述的算法是最經常使用的一種boosting算法,叫作AdaBoost,表示自適應boosting。
AdaBoost算法每一輪都要判斷當前基學習器是否知足條件,一旦條件不知足,則當前學習器被拋棄,且學習過程中止。
AdaBoost算法中的個體學習器存在着強依賴關係,應用的是串行生成的序列化方法。每個基生成器的目標,都是爲了最小化損失函數。因此,能夠說AdaBoost算法注重減少誤差。
因爲屬於boosting算法族,採用的是加性模型,對每一個基學習器的輸出結果加權處理,只會獲得一個輸出預測結果。因此標準的AdaBoost只適用於二分類任務。
咱們能夠看到第一個分類器y1(x)是用相等的權重係數進行訓練的。在隨後的boosting中,錯分的數據權重係數將會增長,正確分類的數據權重係數將會減少。
epsilon表示單個分類器的加權錯誤率。alpha是分類器的權重,正確的分類器alpha較大。
AdaBoost算法的表現如上圖所示。每一個基礎模型包含一個深度爲1的決策樹,這種決策樹依靠線性劃分進行分類,決策平面跟其中一個軸平行。上圖還展現了集成規模的增長帶來的測試準確率變化以及訓練和測試集的學習曲線。
梯度樹提高(Gradient Tree Boosting)是一個boosting算法在損失函數上的泛化。可以用於分類和迴歸問題。Gradient Boosting採用串行方式構建模型。
每新增一個決策樹hm(x)都儘量的選擇是的當前模型Fm-1(x)損失最小的那個:
注意:分類和迴歸使用的損失函數有所差異。
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)。
結構以下:
集成學習的第二類模型,爲了提升集成的泛化能力,每一個基學習器之間不存在很強的依賴性,因此最終預測結果時,須要必定的策略對T個結果進行結合。下面介紹結合策略。
對數值型輸出,最多見的結合策略是使用平均法。
通常而言,在個體學習器性能相差較大時,宜使用加權平均法,而在個體學習器性能相近時,宜使用簡單平均法。
這一點在第二個項目中深有體會,該模型有三個損失函數,每一個損失函數的性能差異比較大,因此用了加權,在第一個數據集中調好參數之後,在第二個數據集中,效果就不是很好,須要從新進行調參。
當訓練數據不少時,一種更爲強大的結合策略是使用「學習法」,即經過另外一個學習器來進行結合。
本文的代碼參見: ipython notebook.
除了本文所提到的集成學習研究以外,集成學習還被普遍應用於利用多種分類器作訓練的深度學習模型中。深度學習模型中的分類器可能在架構、超參數以及訓練技巧上存在差別,均可以進行集成。
集成學習已經被證實在Kaggle數據科學競賽中可以得到較好的成績。
參考:
https://blog.statsbot.co/ensemble-learning-d1dcd548e936
https://www.jianshu.com/p/0a23d578ac81