單個學習器要么容易欠擬合要么容易過擬合,為了獲得泛化性能優良的學習器,可以訓練多個個體學習器,通過一定的結合策略,最終形成一個強學習器。這種集成多個個體學習器的方法稱為集成學習(ensemble learning)。
集成學習通過組合多種模型來改善機器學習的結果,與單一的模型相比,這種方法允許產生更好的預測性能。
集成學習屬於元算法,即結合數個“好而不同”的機器學習技術,形成一個預測模型,以此來降方差(bagging),減偏差(boosting),提升預測准確性(stacking)。
1. 集成學習之個體學習器
個體學習器(又稱為“基學習器”)的選擇有兩種方式:
- 集成中只包含同種類型的個體學習器,稱為同質集成 。
- 集成中包含不同類型的個體學習器,為異質集成 。
目前同質集成 的應用最廣泛,而基學習器使用最多的模型是CART決策樹和神經網絡。
按照個體學習器之間是否存在依賴關系可以分為兩類:
- 個體學習器之間存在強依賴關系,一系列個體學習器基本必須串行生成,代表是boosting系列算法。
- 個體學習器之間不存在強依賴關系 ,一系列個體學習器可以並行生成,代表是bagging系列算法。
1.1 boosting算法原理
boosting的算法原理如下所示:
Boosting算法的工作機制是:
(1)先從初始訓練集訓練出一個基學習器;
(2)再根據基學習器的表現對樣本權重進行調整,增加基學習器誤分類樣本的權重(又稱重采樣);
(3)基於調整后的樣本分布來訓練下一個基學習器;
(4)如此重復進行,直至基學習器數目達到事先指定的個數 ,將這
個基學習器通過集合策略進行整合,得到最終的強學習器。
Boosting系列算法里最著名算法主要有AdaBoost算法和提升樹(boosting tree)系列算法。提升樹系列算法里面應用最廣泛的是梯度提升樹(Gradient Boosting Tree)<GDBT>。
1.1.1以adaboost算法為例
“強學習”和“弱學習”的概念:一個分類,如果存在一個多項式算法能夠學習他,並得到很高的正確率,那么這個算法稱為強學習器,反之如果正確率只是稍大於隨機猜測(50%),則稱為弱學習器。
在實際情況中,我們往往會發現弱學習器比強學習器更容易獲得,所以就有了能否把弱學習器提升(boosting)為強學習器的疑問。
於是提升類方法應運而生,它代表了一類從弱學習器出發,反復訓練,得到一系列弱學習器,然后組合這些弱學習器,構成一個強學習器的算法。
大多數boost方法會改變數據的概率分布(改變數據權值),具體而言就是提高前一輪訓練中被錯分類的數據的權值,降低正確分類數據的權值,使得被錯誤分類的數據在下輪的訓練中更受關注;
然后根據不同分布調用弱學習算法得到一系列弱學習器實現的,再將這些學習器線性組合,具體組合方法是誤差率小的學習器會被增大權值,誤差率大的學習器會被減小權值,典型代表adaboost算法。
1.2. 集成學習之Bagging 算法原理
Bagging的算法原理如下:
bagging算法的工作機制為:
(1)對訓練集利用自助采樣法進行次隨機采樣,每次采樣得到
個樣本的采樣集;
(2)對於這 個采樣集,我們可以分別獨立的訓練出
個基學習器;
(3)再對這 個基學習器通過集合策略來得到最終的強學習器。
值得注意的是這里的隨機采樣采用的是自助采樣法(Bootstrap sampling),自助采樣法是一種有放回的采樣。
即對於 個樣本的原始訓練集,我們每次先隨機采集一個樣本放入采樣集,接着把該樣本放回,這樣采集
次,最終可以得到
個樣本的采樣集,由於是隨機采樣,這樣每次的采樣集是和原始訓練集不同的,和其他采樣集也是不同的。
對於一個樣本,它每次被采集到的概率是 。不被采集到的概率為
。如果
次采樣都沒有被采集中的概率是
。則
,
即當抽樣的樣本量足夠大時,在bagging的每輪隨機采樣中,訓練集中大約有36.8%的數據沒有被采集中。對於這部分大約36.8%的沒有被采樣到的數據,
我們常常稱之為袋外數據(Out Of Bag, 簡稱OOB)。這些數據未參與訓練集模型的擬合,可以用來檢測模型的泛化能力。
bagging對於弱學習器最常用的一般也是決策樹和神經網絡。bagging的集合策略也比較簡單,對於分類問題,通常使用相對多數投票法。對於回歸問題,通常使用算術平均法。
2. 集成學習之結合策略
上面幾節主要關注於學習器,下面就對集成學習之結合策略做一個總結。我們假定我得到的T個弱學習器是
2.1 平均法
平均法通常用於回歸問題。
最簡單的平均是算術平均,即:
也可以是每個個體學習器的加權平均,即 :
其中 是個體學習器
的權重,
。
2.2 投票法
對於分類問題通常使用投票法。
假設我們的預測類別是 ,對於任意一個預測樣本
,我們的
個弱學習器的預測結果分別是
。主要有以下三種:
- 相對多數投票法:也就是少數服從多數,即預測結果中票數最高的分類類別。如果不止一個類別獲得最高票,則隨機選擇一個作為最終類別。
- 絕對多數投票法:即不光要求獲得最高票,還要求票過半數。
- 加權投票法:每個弱學習器的分類票數要乘以一個權重,最終將各個類別的加權票數求和,最大的值對應的類別為最終類別。
2.3 Stacking
平均法和投票法僅是對弱學習器的結果做簡單的邏輯處理,而stacking是再加上一層權重學習器(Meta Learner),基學習器(Base learner)的結果作為該權重學習器的輸入,得到最終結果。
以兩層為例,第一層由多個基學習器組成,其輸入為原始訓練集,第二層的模型則是以第一層基學習器的輸出作為訓練集進行再訓練,從而得到完整的stacking模型。
如下圖所示為Stacking的工作原理:
其中基學習器(Base learner)稱為初級學習器,用於結合的學習器(Meta Learner)稱為次級學習器。對於測試集,我們首先用初級學習器預測一次,將其輸入次級學習器預測,得到最終的預測結果。
以5折划分為例,我們將原始訓練集分為5折,分別記為fold1、fold2、fold3、fold4和fold5。此時我們使用fold2-fold5的數據來訓練基模型1,並對fold1進行預測,該預測值即作為基模型1對fold1生成的元特征;
同樣地,使用fold1、fold3-fold5的數據來訓練基模型1,並對fold2進行預測,該預測值即作為基模型1對fold2生成的元特征;以此類推,得到基模型1對整個原始訓練集生成的元特征。
同樣地,對其他基模型也采用相同的方法生成元特征,從而構成用於第二層模型(下記為元模型,meta model)訓練的完整元特征集。對於測試集,我們可以在每次基模型訓練好時預測,再將預測值做均值處理;
也可以將基模型擬合全部的訓練集之后再對測試集進行預測。
需要注意的是,在生成第二層特征的時候,各個基模型要采用相同的Kfold,這樣得到的元特征的每一折(對應於之前的K折划分)都將不會泄露進該折數據的目標值信息 ,
從而盡可能的降低過擬合的風險。雖然如此,實際上我們得到的元特征還是存在一定程度上的信息泄露,比如我們在預測第二折的時候,是利用了第一折的目標值信息用於訓練基模型的,
也就是說第一折的目標值信息雜糅在對第二折進行預測的基模型里。但是,實踐中,這種程度的信息泄露所造成的過擬合程度很小。
可能還是比較抽象,那我們用案例描述一下:
上半部分是用一個基礎模型進行5折交叉驗證,如:用XGBoost作為基礎模型Model1,5折交叉驗證就是先拿出四折作為training data,另外一折作為testing data。
注意:在stacking中此部分數據會用到整個traing set。如:假設我們整個training set包含10000行數據,testing set包含2500行數據,那么每一次交叉驗證其實就是對training set進行划分,在每一次的交叉驗證中training data將會是8000行,testing data是2000行。
每一次的交叉驗證包含兩個過程,1. 基於training data訓練模型;2. 基於training data訓練生成的模型對testing data進行預測。
在整個第一次的交叉驗證完成之后我們將會得到關於當前testing data的預測值,這將會是一個一維2000行的數據,記為a1。
注意!在這部分操作完成后,我們還要對數據集原來的整個testing set進行預測,這個過程會生成2500個預測值,
這部分預測值將會作為下一層模型testing data的一部分,記為b1。
因為我們進行的是5折交叉驗證,所以以上提及的過程將會進行五次,最終會生成針對trainning set數據預測的5列2000行的數據a1,a2,a3,a4,a5,對testing set的預測會是5列2500行數據b1,b2,b3,b4,b5。
在完成對Model1的整個步驟之后,我們可以發現a1,a2,a3,a4,a5其實就是對原來整個training set的預測值,將他們拼湊起來,會形成一個10000行一列的矩陣,記為A1。
而對於b1,b2,b3,b4,b5這部分數據,我們將各部分相加取平均值,得到一個2500行一列的矩陣,記為B1。
以上就是stacking中一個模型的完整流程,stacking中同一層通常包含多個模型,假設還有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,
對於這四個模型,我們可以重復以上的步驟,在整個流程結束之后,我們可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩陣。
在此之后,我們把A1,A2,A3,A4,A5並列合並得到一個10000行五列的矩陣作為training data,B1,B2,B3,B4,B5並列合並得到一個2500行五列的矩陣作為testing data。讓下一層的模型,基於他們進一步訓練。
其實西瓜書里講的比較粗,我也不清楚到底是上面的博客講錯了,還是西瓜沒有講細節,吐血三升。
西瓜書內容如下: