獨家 | 一文讀懂集成學習(附學習資源)
集成算法(Ensemble Algorithms)綜述
嚴格意義上來說,這不算是一種機器學習算法,而更像是一種優化手段或者策略,它通常是結合多個簡單的弱機器學習算法,去做更可靠的決策。有人把它稱為機器學習中的“屠龍刀”,非常萬能且有效,集成模型是一種能在各種的機器學習任務上提高準確率的強有力技術,集成算法往往是很多數據競賽關鍵的一步,能夠很好地提升算法的性能。哲學思想為“三個臭皮匠賽過諸葛亮”。拿分類問題舉個例,直觀的理解,就是單個分類器的分類是可能出錯,不可靠的,但是如果多個分類器投票,那可靠度就會高很多。
現實生活中,我們經常會通過投票,開會等方式,以做出更加可靠的決策。集成學習就與此類似。集成學習就是有策略的生成一些基礎模型,然後有策略地把它們都結合起來以做出最終的決策。集成學習又叫多分類器係統。
集成方法是由多個較弱的模型集成模型組,一般的弱分類器可以是DT, SVM, NN, KNN等構成。其中的模型可以單獨進行訓練,並且它們的預測能以某種方式結合起來去做出一個總體預測。該算法主要的問題是要找出哪些較弱的模型可以結合起來,以及如何結合的方法。這是一個非常強大的技術集,因此廣受歡迎。
集成算法家族強大,思想多樣,但是好像沒有同一的術語,很多書本上寫得也不一樣, 不同的學者有不同的描述方式,最常見的一種就是依據集成思想的架構分為 Bagging ,Boosting, Stacking三種。國內,南京大學的周誌華教授對集成學習有深入的研究,其在09年發表的一篇概述性論文《Ensemple Learning》對這三種架構做出了明確的定義。
算法鳥瞰
-
Bagging:基於數據隨機重抽樣的分類器構建方法。從訓練集從進行子抽樣組成每個基模型所需要的子訓練集,對所有基模型預測的結果進行綜合產生最終的預測結果 :
-
Boosting:訓練過程為階梯狀,基模型按次序一一進行訓練(實現上可以做到並行),基模型的訓練集按照某種策略每次都進行一定的轉化,每次都是提高前一次分錯了的數據集的權值,最後對所有基模型預測的結果進行線性組合產生最終的預測結果 :
-
Stacking:將訓練好的所有基模型對訓練基進行預測,第j個基模型對第i個訓練樣本的預測值將作為新的訓練集中第i個樣本的第j個特征值,最後基於新的訓練集進行訓練。同理,預測的過程也要先經過所有基模型的預測形成新的測試集,最後再對測試集進行預測:
Stacking算法分為2層,第一層是用不同的算法形成T個弱分類器,同時產生一個與原數據集大小相同的新數據集,利用這個新數據集和一個新算法構成第二層的分類器。
算法鳥瞰部分圖片均來自《使用sklearn進行集成學習——理論》@jasonfreak
(https://www.cnblogs.com/jasonfreak/p/5657196.html)
- Bagging (Bootstrapped Aggregation)
- Random Forest
- Boosting
- AdaBoost (Adaptive Boosting)
- Gradient Boosting Machines (GBM)梯度推進機
- Gradient Boosted Regression Trees (GBRT)梯度提升回歸樹
- Stacked Generalization (blending)層疊泛化
1. 對於回歸預測(數值預測)
- 簡單平均(Simple Average),就是取各個分類器結果的平均值。
- 加權平均(Weighted Average)
2. 對於分類(類別預測)
- 簡單投票(Majority Voting):就是每個分類器的權重大小一樣,少數服從多數,類別得票數超過一半的作為分類結果。
- 加權投票(Weighted Majority Voting):每個分類器權重不一。
- 概率投票(Soft vote):有的分類器的輸出是有概率信息的,因此可用概率投票。
集成學習的關鍵有兩點:
- 如何構建具有差異性的分類器 ,
- 如何多這些分類器的結果進行整合。
基學習器之間的性能要有較大的差別,否則集成效果會很不好,也就是要保證多樣性(Diversity),基學習器可以是DT, SVM, NN, KNN等,也可以是訓練過程不同的同一種模型,例如不同的參數,不同的訓練集,或者不同的特征選擇等。
Bootstrap方法是非常有用的一種統計學上的估計方法。 Bootstrap是一類非參Monte Carlo方法,其實質是對觀測信息進行再抽樣,進而對總體的分布特性進行統計推斷。首先,Bootstrap通過重抽樣,避免了Cross-Validation造成的樣本減少問題,其次,Bootstrap也可以創造數據的隨機性。Bootstrap是一種有放回的重複抽樣方法,抽樣策略就是簡單的隨機抽樣。
基於Bootstrap 的Bagging 算法Bagging(Bootstrapped Aggregation的簡稱)對於給定數據處理任務,采用不同的模型、參數、特征訓練出多個模型,最後采用投票或者加權平均的方式輸出最終結果。基學習器可以是相同的模型,也可以是不同的,一般使用的是同一種基學習器,最常用的是DT決策樹。
Bagging通過對原數據集進行有放回的采樣構建出大小和原數據集D一樣的新數據集D1,D2,D3.....,然後用這些新的數據集訓練多個分類器g1,g2,g3....。因為是有放回的采樣,所以一些樣本可能會出現多次,而有些樣本會被忽略,理論上新的樣本會包含67%的原訓練數據。
Bagging通過降低基分類器的方差改善了泛化能力,因此Bagging的性能依賴於基分類器的穩定性,如果基分類器是不穩定的,Bagging有助於降低訓練數據的隨機擾動導致的誤差,但是如果基分類器是穩定的,即對數據變化不敏感,那麼bagging方法就得不到性能的提升。
算法流程如下:
-
基於Bagging的Random Forest
隨機森林(Random Forest)是許多決策樹的平均,每個決策樹都用通過Bootstrap的方式獲得隨機樣本訓練。森林中的每個獨立的樹都比一個完整的決策樹弱,但是通過將它們結合,可以通過多樣性獲得更高的整體表現。
隨機森林會首先生成許多不同的決策樹,每棵樹變量的個數可以為(K為可用變量的個數),這樣能夠顯著的加速模型的訓練速度。一般的基礎分類器的個數為500棵或者可以更多。
隨機森林具有Self-testing的特性,因為隨機森林是通過Bootstrap的方式采樣,理論上往往會有大約1/3的原始數據沒有被選中,我們叫做OOB(out of bag),而這部分數據剛好可以用來做測試,類似於Cross-Validation的作用。
隨機森林是當今機器學習中非常流行的算法。它是一種“集群智慧”,非常容易訓練(或構建),且它往往表現良好。
隨機森林具有很多的優點:
- 所有的數據都能夠有效利用,而且不用人為的分出一部分數據來做cross-validation
- 隨機森林可以實現很高的精確度,但是隻有很少的參數,而且對於分類和回歸都適用
- 不用擔心過擬合的問題,
- 不需要事先做特征選擇,每次隻用隨機的選取幾個特征來訓練樹
它的缺點是:
- 相比於其他算法,其輸出預測可能較慢。
Boosting
Boosting(Adaptive Boosting的簡稱),基於錯誤提升分類器性能,通過集中關注被已有分類器分類錯誤的樣本,構建新分類器並集成。其思想為模型每次迭代時通過調整錯誤樣本的損失權重,提升對數據樣本整體的處理精度。Boosting與Bagging 相比來說最大的區別就是 Boosting是串行的,而Bagging中所有的分類器是可以同時生成的,之間沒有什麼關係,而Boosting中則必須先生成第一個分類器,然後根據第一個分類器的結果生成第二個分類器,依次往後進行。
| 項目 | Bagging | Boosting | | -------- | -----: | :----: | | 結構 | 並行 | 串行 | | 訓練集 | 獨立 | 依賴 | | 測試 | 可並行 | 需串行 | | 作用 | 減小variance | 減小bias |
核心思想是通過改變訓練集進行有針對性的學習。通過每次迭代,增加錯誤樣本的權重,減小正確樣本的權重。知錯就改,越來越好。
上圖(圖片來自prml p660)就是一個Boosting的過程,綠色的線表示目前取得的模型(模型是由前m次得到的模型合並得到的),虛線表示當前這次模型。每次分類的時候,會更關注分錯的數據,上圖中,紅色和藍色的點就是數據,點越大表示權重越高,看看右下角的圖片,當m=150的時候,獲取的模型已經幾乎能夠將紅色和藍色的點區分開了。
算法流程如下:
增加前邊學錯樣本的權重,減小已經判斷正確的樣本的權重,有點亡羊補牢,知錯就改的意思,進行有針對性的學習。理論上,Boosting 可以生成任意精確的分類器,而基礎學習器則可以任意弱,隻需要比瞎猜好一點就OK~
Bagging 減小方差 (variance ),而Boosting減小偏差(bias),關於具體的細節,可以參考知乎網友的解答“為什麼說bagging是減少variance,而boosting是減少bias?——基於Boosting的AdaBoost"(https://www.zhihu.com/question/26760839)
AdaBoost 是Boosting中最具代表性的算法。AdaBoost 是一種Boosting方法,與Bagging不同的是,Adaboost中不同的子模型必須是串行訓練獲得,每個新的子模型是都根據已訓練出的模型性能來進行訓練的,而且Boosting算法中基學習器為弱學習,可以理解為隻比隨機猜測好一點,在二分類情況下,正確率略高於0.5即可。
AdaBoost中每個訓練樣本都有一個權重,初始值都為Wi=1/N。Adaboost中每次迭代生成新的子模型使用的訓練數據都相同,但是樣本的權重會不一樣。AdaBoost會根據當前的錯誤率,按照增大錯誤樣本權重,減小正確樣本權重的原則更新每個樣本的權重。不斷重複訓練和調整權重,直到訓練錯誤率或基學習器的個數滿足用戶指定的數目為止。Adaboost的最終結果為每個弱學習器加權的結果。
算法流程如下:
AdaBoost 優點:
- 很容易實施
- 幾乎沒有參數需要調整
- 不用擔心過擬合
缺點:
- 公式中的α是局部最優解,不能保證是最優解
- 對噪聲很敏感
林軒田老師課程中AdaBoost的算法流程可能更加容易理解一些。
-
Gradient Boosting Machines (GBM)梯度推進機
梯度提升和隨機森林類似,都是由弱決策樹構成的。最大的區別是,在梯度提升中樹是被一個接一個相繼訓練的。每個隨後的樹主要用被先前樹錯誤識別的數據進行訓練。這使得梯度提升更少地集中在容易預測的情況並更多地集中在困難的情況。
Gradient Boost與傳統Boost的區別在於每個新的模型是為了使之前的模型的殘差往梯度方向減少。Gradient Boost與傳統的Boost的區別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的建立是為了使得之前模型的殘差往梯度方向減少,與傳統Boost對正確、錯誤的樣本進行加權有著很大的區別。
梯度提升訓練速度也很快且表現非常好。然而,訓練數據的小變化可以在模型中產生徹底的改變,因此它可能不會產生最可解釋的結果。
Gradient Boosted Regression Trees (GBRT)梯度提升回歸樹首先應該說明的一點是,這個算法有很多名字,但其實是一樣的~
- Gradient Tree Boosting
- GBRT (Gradient BoostRegression Tree) 梯度提升回歸樹
- GBDT (Gradient BoostDecision Tree) 梯度提升決策樹
- MART (MultipleAdditive Regression Tree) 多決策回歸樹
- Tree Net決策樹網絡
GBRT也是一種Boosting方法,每個子模型是根據已訓練出的學習器的性能(殘差)訓練出來的,子模型是串行訓練獲得,不易並行化。GBRT基於殘差學習的算,沒有AdaBoost中的樣本權重的概念。GBRT結合了梯度迭代和回歸樹,準確率非常高,但是也有過擬合的風險。GBRT中迭代的是殘差的梯度,殘差就是目前結合所有得到的訓練器預測的結果與實際值的差值。
GBRT使用非常廣泛的,能分類,能回歸預測。GBRT是回歸樹,不是分類樹。其核心就在於,每一棵樹是從之前所有樹的殘差中來學習的。GBRT不是分類樹而是回歸樹。
決策樹分為回歸樹和分類樹:
回歸樹用於預測實數值,如溫度、用戶年齡等 分類樹用於分類標簽值,如天氣情況、用戶性別等。模型組合+決策樹相關的算法有兩種比較基本的形式 :隨機森林與GBDT(Gradient Boost Decision Tree)。其他的比較新的模型組合+決策樹的算法都是來自這兩種算法的延伸。
算法流程如下:
關於Bagging和Boosting架構下,集成算法更多細節,包括算法實現,可以參看Python官網機器學習包集成模塊 sk-learn(https://scikit-learn.org/stable/modules/ensemble.html)
Wolpert在1992年的一篇論文中對 stacked generalization進行了介紹 , stacked generalization背後的基本思想是使用大量基分類器,然後使用另一種分類器來融合它們的預測,旨在降低泛化誤差。
Stacking 主要分為兩大部分。第一層就是傳統的訓練,訓練出許多小分類器;第二層則是把這些小分類器的輸出重新組合成為一個新的訓練集,訓練出來一個更高層次的分類器,目的就是尋找相應的權重或者它們之間的組合方式。
在訓練第二層分類器時采用各基礎分類器的輸出作為輸入,第二層分類器的作用就是對基礎分類器的輸出進行集成。
圖釋:
算法流程如下:
Stacking 就像是 Bagging的升級版,Bagging中的融合各個基礎分類器是相同權重,而Stacking中則不同,Stacking中第二層學習的過程就是為了尋找合適的權重或者合適的組合方式。
值得注意的是,在Stacking的架構下,有一些經常出現的說法如Stacking, Blending , Stacked Generalization 很多文章也沒有明確說明他們之間的關係。
如果不嚴格來區分的話,可以認為堆疊(Stacking),混合(Blending)和層疊泛化(Stacked Generalization)其實是同一種算法的不同名字罷了。在傳統的集成學習中,我們有多個分類器試圖適應訓練集來近似目標函數。 由於每個分類器都有自己的輸出,我們需要找到一個組合結果的組合機製,可以通過投票(大多數勝利),加權投票(一些分類器具有比其他權力更多的權威),平均結果等。
在堆疊中,組合機製是分類器(0級分類器)的輸出將被用作另一個分類器(1級分類器)的訓練數據,以近似相同的目標函數。基本上,讓1級分類器找出合並機製。
Stacking, Blending and and Stacked Generalization are all the same thing with different names. It is a kind of ensemble learning. In traditional ensemble learning, we have multiple classifiers trying to fit to a training set to approximate the target function. Since each classifier will have its own output, we will need to find a combining mechanism to combine the results. This can be through voting (majority wins), weighted voting (some classifier has more authority than the others), averaging the results, etc.
關於Stacking與Blending更多的細節可以參考 KAGGLE ENSEMBLING GUIDE,中文 kaggle比賽集成指南@qjgods(https://blog.csdn.net/a358463121/article/details/53054686)
最後我們也可以按照林軒田老師課程中的講述來對機器學習集成算法做一個歸納。集成模型主要分為兩條主線,一條Blending 線,一條 Learning線。Blending 假設我們已經得到了各個基礎分類器 ,learning 主要指我們麵對的是一堆數據,需要一邊獲得基礎分類器 ,同時一邊學習融合它們的方法。
-
Blending框架
當然還有更加複雜一點的,就是集成的集成。
模型的評價
評價模型優劣的準則有很多。
欠擬合和過擬合是經常出現的兩種情況,簡單的判定方法是比較訓練誤差和測試誤差的關係,當欠擬合時,可以設計更多特征來提升模型訓練精度,當過擬合時,可以優化特征量降低模型複雜度來提升模型測試精度。
過擬合與欠擬合圖釋:
機器學習模型的Bias和Variance分析, Understanding the Bias-Variance Tradeoff中的一副圖生動形象地為我們展示了偏差和方差的關係:
簡單來說,一個模型越複雜,對訓練樣本的擬合度會越高,其Bias會越小(訓練誤差小)。但是,由於對數據過於敏感,生成的模型的變化範圍可能比較大(Variance較大),可能導致在測試數據上性能的不確定性較高。
在線課程 機器學習基石&技法 台灣大學 林軒田老師
這兩門課是台大林軒田老師開設的機器學習入門課。基石課注重理論,涵蓋了 VC Dimension、Overfitting、Regularization、Validation 等非常基本的問題,;技法課則將 SVM、AdaBoost、Decision Tree、Random Forest、Deep Learning、RBF Network 等大量實際算法分成三類加以介紹,每個算法都講的較深,有大量的數學推導,並且非常注重模型、算法之間的相互聯係。課程幻燈片製作精美,講課深入淺出。它的作業很具有挑戰性,需要花費大量的時間。 關於集成學習(aggregation),林軒田老師在技法課中設為lecture 7 到lecture 11,大概五個小時,可以全麵的了解集成算法的相關細節,以及背後的數學原理,可以更好的在實踐中運用集成算法。
課程視頻和講義:
https://www.csie.ntu.edu.tw/~htlin/mooc/
討論區:
https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/
參考用書:
https://book.caltech.edu/bookforum/
作業參考:
https://blog.csdn.net/a1015553840/article/details/51085129#reply
數據挖掘:理論與算法(袁博)學堂在線版數據挖掘課程:
https://www.xuetangx.com/courses/course-v1:TsinghuaX+80240372X+sp/about
銀河係的後裔,袁博老師,明明是實力派,卻偏要走偶像路線。 袁博老師生動幽默的講述了數據挖掘中的核心思想、關鍵技術以及一些在其它相關課程和教科書中少有涉及的重要知識點。關於集成學習的模塊在課程的第八周。
本文來自雲棲社區合作夥伴“數據派THU”,了解相關信息可以關注“數據派THU”微信公眾號
最後更新:2017-10-26 11:34:40