1、集成學習概述
集成學習算法可以說是現在最火爆的機器學習算法,參加過Kaggle比賽的同學應該都領略過集成算法的強大。集成算法本身不是一個單獨的機器學習算法,而是通過將基於其他的機器學習算法構建多個學習器並集成到一起。集成算法可以分為同質集成和異質集成,同質集成是值集成算法中的個體學習器都是同一類型的學習器,比如都是決策樹;異質集成是集成算法中的個體學習器由不同類型的學習器組成的。(目前比較流行的集成算法都是同質算法,而且基本都是基於決策樹或者神經網絡的)
集成算法是由多個弱學習器組成的算法,而對於這些弱學習器我們希望每個學習器的具有較好的准確性、而且各個學習器之間又存在較大的差異性,這樣的集成算法才會有較好的結果,然而實際上准確性和多樣性往往是相互沖突的,這就需要我們去找到較好的臨界點來保證集成算法的效果。根據個體學習器的生成方式不同,我們可以將集成算法分成兩類:
1)個體學習器之間存在強依賴關系,必須串行化生成的序列化方法,這一類的代表是Boosting(常見的算法有Adaboost、GBDT);
2)個體學習器之間不存在強依賴關系,可以並行化生成每個個體學習器,這一類的代表是Bagging(常見的算法有RandomForest)。
接下來我們來介紹這兩種不同的集成算法。
2、集成算法—Boosting
對於分類問題,給定一個訓練集,求得一個弱學習器要比求一個強學習器容易得多,Boosting方法就是從弱學習器出發,反復學習而得到一系列弱學習器,然后組合這些弱學習器,構成一個強學習器。Boosting算法的工作機制可以概括為:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分布進行調整,使得先前基學習器做錯的樣本受到更多的關注(通過施加權重來控制),然后基於調整后的樣本集訓練下一個基學習器,如此反復進行,直到學得的基學習器的個數達到設定的個數T(基學習器的個數是我們需要調試的超參,通過交叉驗證來選擇),最終對這T個基學習器根據他們的預測表現來施加不同的權重並結合在一起構成我們的強學習器。
Boosting算法最具代表的是Adaboost算法,關於Adaboost算法的具體流程如下:
1)初始化訓練集的權值分布,每個樣本的權值一樣
2)對於第m個基學習器,使用權值分布Dm的訓練數據集訓練模型,得到基學習器Gm
計算Gm(x)在訓練數據集上的分類誤差率,在這里我們可以看到分類誤差率是和樣本權重有關的,是分類錯誤的樣本權重之和,這樣就使得下一次分類時在最小化損失函數時,會更加關注本次分類錯誤的樣本
計算Gm(x)的系數αm,該系數最后會用來作為基學習器的權重,權重系數是隨着分類誤差率較小而增大的,也就是分類准確性越高的模型,權重也越大
更新訓練數據集的權值分布,求得Dm+1
其中Zm是規范場因子,其表達式為
3)構建基學習器的線性組合
則最終的學習器模型如下
3、集成算法—Bagging
Bagging算法的核心是通過在原始數據集上進行采樣,獲得多份不同的樣本集,用這些樣本集來訓練基學習器。第一節中我們提到基學習器需要平衡准確性和多樣性,因此我們所采集的樣本需要滿足這兩點,Bagging采用自助采樣法(Bootstrap)進行采樣,自助采樣法的規則如下:給定包含m的樣本的數據集,我們先隨機從中抽取一個樣本出來,再將該樣本放回,以便在下一次仍有機會抽到,這樣經過m次隨機采樣,我們就可以獲得m的樣本的樣本集(這樣的樣本集中約含有原始數據集中的63.2%的樣本),按照這種方式抽取出T份樣本集出來,用這T份樣本集訓練出T個基學習器,在預測時根據這T個基學習器預測的結果,通常采用投票法來決定最終的輸出。Bagging與Adaboost只適用於二分類問題不同,可以不經修改的用於多分類問題。
Bagging算法中最常見的算法就是RandomForest(隨機森林)算法,RandomForest是Bagging的一種變體,在Bagging的基礎上引進了屬性干擾這一策略,主要是用來提高基學習器之間的多樣性,具體規則:傳統的決策樹是在整個屬性集上選擇最優的屬性來划分樣本集合,而RandomForest先在屬性集上隨機選取k個屬性組成一個子屬性集,然后在這個子屬性集上選擇最優的屬性來划分樣本集合,這里的參數k控制了隨機性的引入程度,一般情況下推薦k=log2d,d為屬性集的大小。
Bagging算法的作用主要是減小模型的方差,我們來看看bagging和方差具體有什么樣的關系。假設有$n$個隨機變量,方差記為${\sigma}^2$,兩兩變量之間為$\epsilon$,則$n$個隨機變量的均值方差為:
${\epsilon} * {\sigma}^2 + (1 - {\epsilon}) * {\sigma}^2 / n$
因此當兩兩變量之間的相關性為0時,$n$個隨機變量的均值方差則為:${\sigma}^2 / n$。
因此對於$n$個模型,若是模型之間相互獨立,則方差會降低 $n$倍,但實際中模型之間不可能相互獨立,因此我們只能盡量增加模型的多樣性,當前也得平衡基學習器的准確率。
4、集成學習的輸出方式
最終的強學習器的輸出結果是和每個弱學習器相關的,但是對於這些弱學習器的輸出值,我們以什么樣的方式整合輸出呢?
1)平均法
對於數值類的回歸問題,通常使用的方式是平均法,也即是對每個弱學習器的輸出加和取平均值,將該平均值作為最后的輸出,當然有的時候會給每個學習器帶上權重,此時就是加權平均獲得最終的輸出值。
2)投票法
對於分類問題的輸出方式常采用投票法,最簡單的投票方式就是取弱學習器中預測最多的那一類作為我們的輸出值,其次嚴格一點的投票方式是不但要輸出預測最多的那一類的值,且該類的值要占到預測的值的一半以上,最后還有對每個弱學習器賦予權重,對於最終的投票計算會乘以對應的權重(比如選舉時班長的一票頂五票,而普通學生一票就只是一票)。
3)學習法
對於平均法和投票法相對比較簡單,有時候在預測時可能存在誤差,於是就衍生出了學習法,例如stacking,當使用stacking時是將所有弱學習器的輸出作為輸入,在這基礎上再建立一個模型,讓機器自己去學習輸出方式,有時候我們會訓練多個強學習器,比如將訓練一個隨機森林的學習器,再訓練一個Adaboost的學習器,然后將這兩個學習器的弱學習器的輸出作為輸入(這樣我們就有兩條輸入數據),訓練一個用於最終預測的學習器來輸出結果。
5、Adaboost和RandomForest對比
Adaboost算法常用的弱學習器是決策樹和神經網絡(理論上可以用任何學習器作為基學習器)。對於決策樹,Adaboost分類用了CART分類樹,Adaboost回歸用了CART回歸樹。Adaboost和Boosting算法一樣,重點關注模型的偏差,迭代的過程中是以降低偏差為目的,一般偏差會較小,但這並不意味這Adaboost的方差很大,很容易過擬合,實際上是可以通過調整模型的復雜度來避免過擬合的,例如決策樹為基學習器時,可以調節樹深,或者是葉節點中樣本的個數等來實現。Adaboost只能做二分類問題,最終的輸出是用sign函數決定的。當然對算法上做一些修改也是可以用於回歸問題的,但是對於多分類問題就比較復雜。
Adaboost的主要優點:
1)Adaboost作為分類器時,分類精度很高
2)在Adaboost的框架下,可以使用各種分類回歸模型來構建基學習器
3)作為簡單的二分類問題,構建簡單,結果可理解
4)不容易發生過擬合
Adaboost的主要缺點:
1)對異常樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終的強學習其的預測准確性
2)Adaboost只能做二分類問題,要做多分類問需要做其他的變通
RandomForest算法常用的弱學習器也是決策樹和神經網絡,對於決策樹,在隨機森林中也是使用CART分類回歸樹來處理分類回歸問題,通常采用投票法和平均法來決定最后的輸出,對於分類問題采用投票法也決定了隨機森林能無修改的應用於多分類問題,隨機森林和Bagging算法一樣,重點關注降低模型的方差,泛化能力強,但是有時候也會出現較大的訓練誤差,這可以通過加大模型的復雜度來解決,另外在隨機森林中是采用隨機選擇子特征集的,子特征集的個數也會影響要模型的方差和偏差,一般認為子特征集越大,模型的偏差會越小。因為隨機森林的模型簡單,效果好,因此也產生了很多變種算法,這些變種算法可以用來處理分類回歸問題,也可以處理特征轉換,異常點檢測等。
例如extra trees就是隨機森林的一種推廣形式,它改變了兩個地方,一是不再采取自助采樣法去隨機抽取樣本,而是采用原始集作為訓練樣本;二是直接隨機選擇特征(相當於子特征集只有一個元素)。extra trees的方差比隨機森林更小,因此泛化能力更強,但是偏差也更大。
隨機森林的主要優點:
1)訓練可以高度並行化,因此算法的速度要選快於Adaboost。
2)由於隨機子特征集,因此在高維特征下,算法仍具有較好的效率
3)在訓練后可以給出各個特征對輸出的重要性
4)由於隨機采樣,訓練出的模型的方差小,泛化能力強
5)算法實現起來比Boosting更簡單
6)對部分特征缺失不敏感
隨機森林的主要缺點:
1)在某些噪聲比較大的樣本集上,RF模型容易陷入過擬合
2)取值比較多的特征容易影響隨機森林的決策,影響模型的擬合效果
最后關於Bagging重點降低方差,Boosting重點降低偏差來說一說。首先對於Bagging來說,利用對樣本進行重采樣,然后用類似的模型來訓練基學習器,由於子樣本集的相似性和使用的模型相同,因此最終的基學習器有近似相等的方差和偏差,對於類似的偏差是無法通過模型平均來降低的,而對於方差在模型平均時會弱化每個基學習器的異常值,強化每個基學習器的共通值,因此會降低模型的方差。對於Boosting,其算法的核心就是關注偏差,在算法優化過程中每次都最小化弱學習器,這本身就是一種以降低偏差為目的的優化方式,因此會降低模型的偏差,當然Boosting也會降低模型的方差,只是沒有偏差明顯。