常見的集成學習&模型融合方法包括:簡單的Voting/Averaging(分別對於分類和回歸問題)、Stacking、Boosting和Bagging。
在不改變模型的情況下,直接對各個不同的模型預測的結果,進行投票或者平均,這是壹種簡單卻行之有效的融合方式。
比如對於 分類問題 ,假設有三個相互獨立的模型,每個正確率都是70%,采用少數服從多數的方式進行投票。那麽最終的正確率將是:
即結果經過簡單的投票,使得正確率提升了8%。這是壹個簡單的概率學問題——如果進行投票的模型越多,那麽顯然其結果將會更好。但是其 前提條件是模型之間相互獨立,結果之間沒有相關性。越相近的模型進行融合,融合效果也會越差。
比如對於壹個正確輸出全為1的測試,我們有三個很相近的的預測結果,分別為:
進行投票其結果為:
而假如我們的各個預測結果之間有很大差異:
其投票結果將為:
可見模型之間差異越大,融合所得的結果將會更好。//這種特性不會受融合方式的影響。 註意這裏所指模型之間的差異,並不是指正確率的差異,而是指模型之間相關性的差異。
? ?對於 回歸問題 ,對各種模型的預測結果進行平均,所得到的結果通過能夠減少過擬合,並使得邊界更加平滑,單個模型的邊界可能很粗糙。這是很直觀的性質,隨便放張圖②就不另外詳細舉例了。
在上述融合方法的基礎上,壹個進行改良的方式是對各個投票者/平均者分配不同的權重以改變其對最終結果影響的大小。對於正確率低的模型給予更低的權重,而正確率更高的模型給予更高的權重。這也是可以直觀理解的—— 想要推翻專家模型(高正確率模型)的唯壹方式,就是臭皮匠模型(低正確率模型)同時投出相同選項的反對票 。 具體的對於權重的賦值,可以用正確率排名的正則化等。
這種方法看似簡單,但是卻是下面各種“高級”方法的基礎。
Boosting是壹種將各種弱分類器串聯起來的集成學習方式,每壹個分類器的訓練都依賴於前壹個分類器的結果,順序運行的方式導致了運行速度慢。和所有融合方式壹樣,它不會考慮各個弱分類器模型本身結構為何,而是對訓練數據(樣本集)和連接方式進行操縱以獲得更小的誤差。但是為了將最終的強分類器的誤差均衡,之前所選取的分類器壹般都是相對比較弱的分類器,因為壹旦某個分類器較強將使得後續結果受到影響太大。 所以多用於集成學習而非模型融合(將多個已經有較好效果的模型融合成更好的模型)。
這裏引用知乎專欄 《機器學習模型融合方法概述》③處引用的加州大學歐文分校Alex Ihler教授的兩頁PPT:
其基本工作機制如下:
1、從初始樣本集中訓練出壹個基學習器;
2、根據基學習器的表現對樣本集分布進行調整,使得做錯的樣本能在之後的過程中受到更多的關註;
3、用調整後的樣本集訓練下壹個基學習器;
4、重復上述步驟,直到滿足壹定條件。
註意,壹般只有弱分類器都是同壹種分類器(即同質集成)的時候,才將弱分類器稱為基學習器,如果是異質集成,則稱之為個體學習器。由於不是本文重點,所以此處不作區分。特此說明。
最終將這些弱分類器進行 加權相加 。
常見的Boosting方法有Adaboost、GBDT、XGBOOST等。 //下面僅從思想層次上簡單介紹各種方法,具體的算法推理公式推導以及可用的工具包等參考本文附錄。
Bagging是 Bootstrap?Aggregating 的縮寫。這種方法同樣不對模型本身進行操作,而是作用於樣本集上。采用的是隨機有放回的選擇訓練數據然後構造分類器,最後進行組合。與Boosting方法中各分類器之間的相互依賴和串行運行不同,Bagging方法中基學習器之間不存在強依賴關系,且同時生成並行運行。
其基本思路為:
1、在樣本集中進行K輪有放回的抽樣,每次抽取n個樣本,得到K個訓練集;
2、分別用K個訓練集訓練得到K個模型。
3、對得到的K個模型預測結果用投票或平均的方式進行融合。
在這裏,訓練集的選取可能不會包含所有樣本集,未被包含的數據成為包/袋外數據,可用來進行包外誤差的泛化估計。每個模型的訓練過程中,每次訓練集可以取全部的特征進行訓練,也可以隨機選取部分特征訓練,例如極有代表性的隨機森林算法就是每次隨機選取部分特征。
下面僅從思想層面介紹隨機森林算法:
1、在樣本集中進行K輪有放回的抽樣,每次抽取n個樣本,得到K個訓練集,其中n壹般遠小於樣本集總數;
2、選取訓練集,在整體特征集M中選取部分特征集m構建決策樹,其中m壹般遠小於M;
3、在構造每棵決策樹的過程中,按照選取最小的基尼指數進行分裂節點的選取進行決策樹的構建。決策樹的其他結點都采取相同的分裂規則進行構建,直到該節點的所有訓練樣例都屬於同壹類或者達到樹的最大深度;
4、重復上述步驟,得到隨機森林;
5、多棵決策樹同時進行預測,對結果進行投票或平均得到最終的分類結果。
多次隨機選擇的過程,使得隨機森林不容易過擬合且有很好的抗幹擾能力。
優化方式上 >
在機器學習中,我們訓練壹個模型通常是將定義的Loss最小化的過程。但是單單的最小化loss並不能保證模型在解決壹般化的問題時能夠最優,甚至不能保證模型可用。訓練數據集的Loss與壹般化數據集的Loss之間的差異被稱為generalization error。
Variance過大會導致模型過擬合,而Bias過大會使得模型欠擬合。
? Bagging 方法主要通過降低 Variance 來降低 error , Boosting 方法主要通過降低 Bias 來降低 error 。
Bagging方法采用多個不完全相同的訓練集訓練多個模型,最後結果取平均。由於
所以最終結果的Bias與單個模型的Bias相近,壹般不會顯著降低Bias。
另壹方面,對於Variance則有:
Bagging的多個子模型由不完全相同的數據集訓練而成,所以子模型間有壹定的相關性但又不完全獨立,所以其結果在上述兩式的中間狀態。因此可以在壹定程度上降低Variance從而使得總error減小。
Boosting方法從優化角度來說,是用forward-stagewise這種貪心法去最小化損失函數
。所謂forward-stagewise,就是在叠代的第n步,求解新的子模型f(x)及步長a(或者稱組合系數),來最小化
,這裏
是前n步得到的子模型的和。因此Boosting在最小化損失函數,Bias自然逐步下降,而由於模型間強相關,不能顯著降低Variance。
Bagging裏面每個分類器是強分類器,因為他降低的是方差,方差過高需要降低是過擬合。
boosting裏面每個分類器是弱分類器,因為他降低的是偏差,偏差過高是欠擬合。
樣本選擇上>
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
Boosting:每壹輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上壹輪的分類結果進行調整。
樣例權重 >
Bagging:使用均勻取樣,每個樣例的權重相等
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大
預測函數 >
Bagging:所有預測函數的權重相等。
Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重
並行計算 >
Bagging:各個預測函數可以並行生成
Boosting:理論上各個預測函數只能順序生成,因為後壹個模型參數需要前壹輪模型的結果。計算角度來看,兩種方法都可以並行。bagging,random forest並行化方法顯而意見。boosting有強力工具stochastic gradient boosting
接下來介紹在 各種機器學習比賽中 被譽為“七頭龍神技”的Stacking方法。
(但因其模型的龐大程度與效果的提升程度往往不成正比,所以壹般很難應用於實際生產中)
下面以壹種易於理解但不會實際使用的兩層的stacking方法為例,簡要說明其結構和工作原理: (這種模型問題將在後續說明)
假設我們有三個基模型M1,M2,M3,用訓練集對其進行訓練後,分別用來預測訓練集和測試集的結果,得到P1,T1,P2,T2,P3,T3
這種方法的問題在於,模型M1/2/3是我們用整個訓練集訓練出來的,我們又用這些模型來預測整個訓練集的結果,毫無疑問過擬合將會非常嚴重。因此在實際應用中往往采用 交叉驗證 的方法來解決過擬合問題。
首先放幾張圖⑤,我們著眼於Stacking方法的第壹層,以5折交叉驗證為例說明其工作原理:
1、首先我們將訓練集分為五份。
2、對於每壹個基模型來說,我們用其中的四份來訓練,然後對未用來的訓練的壹份訓練集和測試集進行預測。然後改變所選的用來訓練的訓練集和用來驗證的訓練集,重復此步驟,直到獲得完整的訓練集的預測結果。
3、對五個模型,分別進行步驟2,我們將獲得5個模型,以及五個模型分別通過交叉驗證獲得的訓練集預測結果。即P1、P2、P3、P4、P5。
4、用五個模型分別對測試集進行預測,得到測試集的預測結果:T1、T2、T3、T4、T5。
5、將P1~5、T1~5作為下壹層的訓練集和測試集。在圖中分別作為了模型6的訓練集和測試集。
Stacking方法的整體結構如下圖所示:
Blending是壹種和Stacking很相像的模型融合方式,它與Stacking的區別在於訓練集不是通過K-Fold的CV策略來獲得預測值從而生成第二階段模型的特征,而是建立壹個Holdout集,例如10%的訓練數據,第二階段的stacker模型就基於第壹階段模型對這10%訓練數據的預測值進行擬合。
說白了,就是把Stacking流程中的K-Fold CV 改成HoldOut CV。
以第壹層為例,其5折HoldOut交叉驗證將如下圖③所示:
需要註意的是,網上很多文章在介紹 Stacking 的時候都用了上面 Blending 的圖還強行解釋了的,比如③、⑤等。
Stacking 與 Blending 相比 ,Blending的優勢在於:
1、Blending比較簡單,而Stacking相對比較復雜;
2、能夠防止信息泄露:generalizers和stackers使用不同的數據;
3、不需要和妳的隊友分享妳的隨機種子;
而缺點在於:
1、只用了整體數據的壹部分;
2、最終模型可能對留出集(holdout set)過擬合;
3、Stacking多次交叉驗證要更加穩健。
文獻②中表示兩種技術所得的結果都相差不多,如何選擇取決於個人喜好。如果難以抉擇的話,可以同時使用兩種技術並來個第三層將其結果合並起來。
以上為本人學習的總結,很多內容都未經實際驗證,如果發現總結中有錯誤或與實際表現不符,敬請指正。
參考文獻
①/c/otto-group-product-classification-challenge
②/kaggle-ensembling-guide/
③/p/25836678
④/human-ensemble-learning/
⑦/sinat_29819401/article/details/71191219
⑧/zwqjoy/article/details/80431496
⑨/article/machinelearning/35135