寫本文的目的:
- 博主本人正在入門機器學習,期間對於每個算法都看了幾遍書,寫下這篇文章希望可以用自己理解的方式來記錄,加深對算法的理解。
- 記下自己的理解,方便日後進行復習。
集成學習(Ensemble learning)通過構建並結合多個學習器來完成學習任務,有時也被稱爲多分類器系統、基於委員會的學習等。
集成學習的一般結構爲:先產生一組“個體學習器”,再用某種策略將它們結合起來。集成中只包含同種類型的個體學習器,稱爲同質,當中的個體學習器亦稱爲“基學習器”,相應的算法稱爲“基學習算法”。集成中包含不同類型的個體學習器,稱爲“異質”,當中的個體學習器稱爲“組建學習器”。
要獲得好的集成,個體學習器應“好而不同”,即個體學習器要有一定的“準確性”,即學習器不能太壞,並且要有多樣性,即個體學習器間具有差異。
根據個體學習器的生成方式,目前的集成學習方法大致可以分爲兩類:
- 個體學習器間存在強依賴關係、必須串行生成的序列化方法,代表爲Boosting;
- 個體學習器間不存在強依賴關係、可同時生成的並行化方法,代表爲Bagging和隨機森林。
注:所謂串行生成的序列化方法就是除了訓練第一個之外,其他的學習器學習都需要依賴於前面生成的學習的結果。
一、Boosting
Boosting是一簇可將弱學習器提升爲強學習器的算法。其工作機制爲:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對樣本分佈進行調整,使得先前的基學習器做錯的訓練樣本在後續收到更多的關注,然後基於調整後的樣本分佈來訓練下一個基學習器;如此重複進行,直至基學習器數目達到實現指定的值T,或整個集成結果達到退出條件,然後將這些學習器進行加權結合。
1、AdaBoost
AdaBoost 是Boosting中的經典算法,其主要應用於二分類問題。
Adaboost 算法採用調整樣本權重的方式來對樣本分佈進行調整,即提高前一輪個體學習器錯誤分類的樣本的權重,而降低那些正確分類的樣本的權重,這樣就能使得錯誤分類的樣本可以受到更多的關注,從而在下一輪中可以正確分類,使得分類問題被一系列的弱分類器“分而治之”。對於組合方式,AdaBoost採用加權多數表決的方法,具體地,加大分類誤差率小的若分類器的權值,減小分類誤差率大的若分類器的權值,從而調整他們在表決中的作用。 其算法流程如下:
【AdaBoost 算法流程】
有如下二分類數據集
輸入:數據集 T,弱學習算法
輸出:最終分類器G(x)
(1) 初始化訓練數據的權值分佈
(2) 對m=1,2,...,M (弱分類器的個數,對每個弱分類器做如下):
(a)使用具有權值分佈訓練數據集學習,得到基本分類器
(b) 計算在訓練數據集上的分類誤差率 (錯誤分類的樣本的權重之和)
(c) 計算的係數 (弱分類器的權重, 反函數,誤差率越大,則權重越小,反之越大)
(d) 更新訓練數據集的權值分佈
其中,爲規範化因子
它使得成爲一個概率分佈。
(3) 構建基本分類器的線性組合
得到最終的分類器
注:
例子:
AdaBoost算法是模型爲加法模型、損失函數爲指數函數、學習算法爲前向分步算法時的二分類算法。
加法模型就是說強分類器由一系列弱分類器線性相加而成。
考慮加法模型:
其中爲基函數,爲基函數的參數,爲係數。在給定訓練數據及損失函數的條件下,學習加法模型稱爲經驗風險最小化即損失函數極小化問題:
通常該極小化問題是一個複雜的優化問題,常常採用前向分步算法(forward stagewise algorithm)求解該問題,其思路爲:因爲學習的是加法模型,如果能夠從前向後,每一步只學習一個基函數及其係數,逐步逼近優化目標函數式,那麼就可以簡化優化的複雜度。具體的,每步只需優化如下的損失函數:
即每步只需要求解該基學習器的參數以及係數即可。
AdaBoost的公式推導:
假設經過m-1論迭代前向分步算法已經得到:
在第m輪迭代得到和.
目標是前向分步算法得到得到的使得在訓練數據集T上的指數損失函數最小,即
又可以表示爲
其中,(每輪迭代的樣本權重,後面解釋)
因爲都不依賴於和G,所以與最小化無關。但其依賴於,所以隨着每一輪迭代而發生改變。
現在求和:
(1)、求。對任意,使式<1>最小的由下式得到:
其中。此分類器就是AdaBoost算法的基本分類器,因爲它是使得第m輪加權訓練數據分類誤差率最小的基本分類器。
(2)、求。對損失函數L並把帶入得:
L對求導並令結果爲0,即可得到使上式爲最小值的,
由上面的推導可得,
其中,爲分類誤差率:
最後我們來看一下每一輪樣本權值的更新,由
以及
有:
此處所得權值與算法流程中的權值只差規範化因子,所以等價。
2、提升樹(Boosting Tree)
提升樹是以分類樹或迴歸樹爲基本分類器的提升方法。
提升樹模型
提升方法採用加法模型(即基函數的線性組合)與前向分步算法。以決策樹爲基函數的提升方法稱爲提升樹(boosting tree)。對於分類問題決策樹是二叉分類樹,對迴歸問題決策樹是二叉迴歸樹。提升樹模型可以表示爲決策樹的加法模型:
其中,表示決策樹;爲決策樹的參數;爲決策樹的個數。
提升樹算法
提升樹算法採用前向分步算法。首先確定初始提升樹,第m步的模型爲:
其中,爲當前模型,通過經驗風險極小化確定下一棵決策樹的參數,
提升樹對不同問題有不同的提升樹學習算法,其主要區別在於使用的損失函數不同。主要有用平方誤差損失函數的迴歸問題,用指數損失函數的分類問題,以及一般損失函數的一般決策問題。
對於二分類問題,提升樹算法只需將AdaBoost算法的基本分類器限定爲二分類決策樹即可,此時的提升樹算法是AdaBoost算法的特例情況。
迴歸問題的提升樹
把輸入空間X劃分爲J個互不相交的區域,並且在每個區域上確定的輸出常量,那麼樹可以表示爲
其中,參數表示樹的區域劃分和各個區域上的常數。J是迴歸樹的複雜度即葉子結點個數。
迴歸問題提升樹使用以下前向分佈算法:
在第m步,給定當前模型,需要求解
得到,即第m棵樹的參數。
因爲爲迴歸問題,所以採用平方誤差損失函數,所以
由上式容易知道,爲使損失函數最小,則需要
即需要擬合r,其中,
爲當前模型擬合數據的殘差(residual),所以對於迴歸問題的提升樹算法來說,只需要簡單的擬合當前模型的殘差,即輸入空間不變,只是對應的輸出值( y )改變。
【迴歸問題的提升樹算法】
輸入:訓練數據集
輸出:提升樹
(1) 初始化
(2)對m=1,2,...,M (M棵樹,對每個樹進行遍歷)
(a) 計算殘差:
(b) 擬合殘差學習一個迴歸樹,得到
(c) 更新
(3) 得到迴歸問題的提升樹
3、梯度提升樹(Gradient Boosting Decision Tree, GBDT)
GBDT 是多棵樹的輸出預測值的累加,GBDT的樹都是 迴歸樹 而不是分類樹
梯度提升樹是爲了解決提升樹在損失函數爲一般損失函數時優化算法,稱爲梯度提升算法,其利用最速下降法的近似方法,關鍵是利用損失函數的負梯度在當前模型的值
作爲迴歸問題提升樹算法中殘差的近似值,擬合一個迴歸樹。
對於不同的Loss function,其梯度有不同的表達式:
前三種對應的loss function如下圖:其中Huber是低於某個值表現爲square error,高於某個值則表現爲線性
【梯度提升樹算法】
輸入:訓練數據集,損失函數
輸出:提升樹
(1) 初始化:
(2)對m=1,2,...,M (M棵樹,對每個樹進行遍歷)
(a) 對i=1,2,...,N,計算
(b) 對擬合一個迴歸樹,得到第m棵樹的葉結點區域
(c) 對,計算
(c) 更新
(3) 得到梯度提升迴歸樹
所謂Gradient就是去擬合Loss function的梯度,將其作爲新的弱迴歸樹加入到總的算法中即可。
例子:
GBDT——二分類
在梯度提升決策樹GBDT中,通過定義不同的損失函數,可以完成不同的學習任務,二分類是機器學習中一類比較重要的分類算法,在二分類中,其損失函數爲:
套用上面介紹的GB框架,得到下述的二分類GBDT的算法:
二、Bagging與隨機森林
1、Bagging
bagging 是一種個體學習器之間不存在強依賴關係、可同時生成的並行式集成學習方法。
bagging 基於自助採樣法(bootstrap sampling),也叫有放回重採樣法.即給定包含m個樣本的數據集,先隨機從樣本中取出一個樣本放入採樣集中,再把該樣本返回初始數據集,使得下次採樣時該樣本仍可以被選中,這樣,經過m次隨機採樣操作,就可以得到包含m個樣本的採樣集,初始數據集中有的樣本多次出現,有的則未出現,其中,初始訓練集中約有63.2%的樣本出現在採樣集中。
照上面的方式進行T次操作,採樣出T個含有m個訓練集的採樣集,然後基於每個採樣集訓練出T個基學習器,再將這些基學習器進行結合,即可得到集成學習器。在對輸出進行預測時,Bagging通常對分類進行簡單投票法,對迴歸使用簡單平均法。若出現形同,則任選其一。
Bagging的優點:
- 訓練一個 Bagging集成與直接使用基分類器算法訓練一個學習器的複雜度同階,說明Bagging是一個高效的集成學習算法。
- 此外,與標準的AdaBoost算法只適用於二分類問題不同,Bagging能不經過修改用於多分類、迴歸等任務。
- 由於每個基學習器只使用63.2%的數據,所以剩下36.8%的數據可以用來做驗證集來對泛化性能進行“包外估計”。
從偏差-方差的角度來說,boosting主要關注減小偏差,而Bagging主要關注降低方差,也就說明boosting在弱學習器上表現更好,而降低方差可以減小過擬合的風險,所以Bagging通常在強分類和複雜模型上表現得很好。舉個例子:bagging在不減枝決策樹、神經網絡等易受樣本擾動的學習器上效果更爲明顯。
2、隨機森林(Random Forest,簡稱RF)
隨機森林是bagging的擴展體。RF在以決策樹爲基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇。具體地,傳統決策樹在選擇劃分屬性時是在當前結點的屬性集合(假定有d個屬性)中選擇一個最優屬性,而在RF上,對基決策樹的每個結點,先從該結點的屬性集中隨機選擇其中的k個屬性組成屬性集,然後從該屬性集中選擇最優的劃分屬性,一般情況下,推薦。
隨機森林的優勢:
- 能夠處理很高維度的數據,並且不用做特徵選擇;
- 在訓練完成後,可以給出哪些屬性比較重要;
- 容易做成並行化方法,速度快;
- 可以進行可視化展示,便於分析。
隨機森林和Bagging比較:
兩者的收斂性相似,但RF的起始性能相對較差,特別只有一個基學習器時。隨着基學習器數量的增加,隨機森林通常會收斂到更低的泛化誤差。隨機森林的訓練效率常優於Bagging,因爲Bagging是“確定型”決策樹,而隨機森林使用“隨機型”決策樹。
三、結合策略
通過上文,我們對集成學習算法也有了大概的瞭解,簡單來說,集成算法就是訓練一堆基學習器,然後通過某種策略把各個基學習器的結果進行合成,從而得到集成學習器的結果。下面我們就來認識一下常用的結合策略:
1、平均法(Averaging)
對數值型(連續)輸出,最常見的結合策略爲平均法。
---簡單平均法(simple averaging)
---加權平均法(weighted averaging)
其中爲權重,通常要求:
注:加權平均法的權重一般從訓練數據中學習而得,對規模比較大額集成來說,要學習的權重比較多,較容易導致過擬合,因此加權平均法不一定優於簡單平均法。一般而言,在個體學習器性能相差較大時宜使用加權平均法,而在個體學習器性能相近時宜使用簡單平均法。
2、投票法(Voting)
對分類來說,學習器將從類別集合中預測出一個類別標記,最常用的是投票法。
---絕對多數投票法(majority voting)
即如某標記的投票過半數,則預計爲該標記;否則拒絕預測。
---相對多數投票法(plurality voting)
即預測爲得票最多的標記,若同時出現多個票數最多,則任選其一。
---加權投票法(weighted voting)
與加權平均法類似。
3、學習法
當數據很多時,一種更爲強大的結合策略是使用“學習法”,即通過另一個學習器來結合。其中典型代表爲Stacking,在stacking中我們把個體學習器稱爲初級學習器,用於結合的學習器稱爲次學習器或者元學習器。
注:Stacking本身就是一種出名的集成學習方法,且有不少集成學習方法可以認爲是其變體或者特例,stacking也可以認是一種結合策略,此處同周志華的西瓜書一樣,把其看成一種結合策略。
stacking的主要思想爲:先從初始數據集訓練出初級學習器,然後“生成”一個新的數據集用於訓練次級學習器。生成的該新數據中,初級學習器的輸出被當做樣例輸入特徵,而初始樣本的標記仍被當做樣例標記。也就是說,假設初級學習器有M個,那麼對於一個原始數據集中的樣本(x; y),通過這M個初級學習器有M個輸出{h1(x),h2(x),...,hM(x)},把{h1(x),h2(x),...,hM(x); y}作爲新數據的一個樣本,所以一個初級學習器的輸出作爲新數據集中對應樣本的一個特徵,而其標記爲原始數據中該樣本的標記。算法描述如下圖(圖來自周志華《機器學習》),假定初級學習器使用不同的算法,如LR、RF、SVM、GBDT等。
在訓練階段,次級學習器(用來結合結果的學習器)的訓練數據集是利用初級學習器來產生的,若直接用初級學習器的訓練集來產生訓練數據集,則很有可能會出現過擬合,也就是過擬合風險較大;所以一般在使用Stacking時,採用交叉驗證或留一法的方式,用訓練初級學習器未使用的樣本來產生次級學習器的訓練樣本。下面以k=5折交叉驗證作爲例子:
首先把整個數據集分成量訓練集(Training Data)和測試集(Test Data)兩部分,上圖最左邊,然後把訓練數據集進行k折,此處k=5,即把訓練數據分成5份,在進行第j折時,使用其餘的四份進行初級學習器的訓練,得到一個初級學習器,並用該初始學習器把該折(即留下用來驗證的)數據進行預測,進行完所有折數,把預測輸出作爲新數據集的特徵,即次級學習器的訓練數據集,其中標記沒變,用該新數據集訓練次級學習器,從而得到一個完整的stacking。最後用原始數據的測試集來對該Stacking進行測試評估。
次級學習器的輸入屬性表示和次級學習算法的選擇對Stacking集成的泛化性能有很大影響。有研究表明,將初級學習器的輸出類概率最爲次級學習器的輸入屬性,用多響應線性迴歸(Multi-reponse Linear Regression,簡稱MLR)作爲次級學習器算法效果更好,在MLR中使用不同的屬性集更佳。
注:MLR是基於線性迴歸的分類器,其對每個類分別進行線性迴歸,屬於該類的訓練樣例所對應的輸出爲1,其他類置0;測試示例將被分給輸出值最大的類。
四、總結
該文主要寫了關於集成學習的一些常用算法,當然最牛逼的XGBoost和lightGBM都沒有開始學到,都說想成爲一名優秀的機器學習算法er那麼肯定繞不過該兩個算法,不過在此先不談,而是來總結一下該文的內容。
一開始先介紹了何爲集成學習,然後將了Boosting算法和bagging算法。boosting算法與Bagging算法的主要區別在於:
- Boosting算法中個體學習器間存在強依賴關係、必須串行生成的序列化方法,即下個學習器要依賴刪一個學習器進行學習,不能進行並行化。
- Bagging算法個體學習器間不存在強依賴關係、可同時生成的並行化方法,即可以並行化。
Boosting算法的代表有AdaBoost,Boosting Tree和GBDT。boosting是一種模型加法模型、學習方式爲前向分步算法的算法,而幾種代表的不同在於選擇的損失函數不同。
標準的AdaBoost算法用於二分類問題,損失函數爲指數函數,其主要思想:通過提高錯分類樣本的權重使得該樣本在下次可以得到更大的關注,從而可以正確分類,降低正確分類的樣本的權重,最後在結合的時候,對分類誤差率小的個體學習器設置大的權重,對分類誤差率大的個體學習器設置小的權重。
Boosting Tree(提升樹)是模型爲加法模型,學習算法爲前向分步算法,個體學習器爲決策樹的一種集成方法。當Boosting Tree在解決迴歸問題時,使用CART作爲個體學習器,採用平方誤差函數作爲損失函數,學習過程爲不斷擬合當前模型的殘差,知道滿足停止條件的過程。
GBDT與Boosting Tree在解決回顧問題時類似,只是把損失函數的負梯度最爲擬合的目標來進行學習。
Bagging方法主要通過又放回抽取樣本的方式進行數據集的產生來訓練個體學習器,對於一個個體學習器的訓練樣本,其數目上與原始訓練樣本數一致,只是有些重複,有些沒有出現,出現的樣本約爲原始樣本的63.2%,剩餘部分可以用來進行做包外估計。
Random Forest(隨機森林)是Bagging的變體,其不同的地方在於在生成個體學習器的過程中不僅有樣本擾動,還加入了屬性擾動。
最後,講了結合策略,有平均法、投票法和學習法,其中學習法的代表爲Stacking方法,Stacking方法也是一種集成方法,其主要思想爲:先從初始數據集訓練出初級學習器,然後“生成”一個新的數據集用於訓練次級學習器。生成的該新數據中,初級學習器的輸出被當做樣例輸入特徵,而初始樣本的標記仍被當做樣例標記。
五、參考:
周志華 ------《機器學習》
李航 ------ 《統計學習方法》
李銳 ------ 《機器學習實戰》
zhiyong_will的博客:https://blog.csdn.net/google19890102/article/details/51746402