【ML小結10】集成學習

1. 集成學習的思想

對於訓練集數據,我們通過訓練若干個個體學習器,通過一定的結合策略,就可以最終形成一個強學習器,以達到博採衆長的目的。
集成學習(Ensemble learning)可以用於分類問題集成,迴歸問題集成,特徵選取集成,異常點檢測集成等等。
Q1:如何獲得若干個個體學習器
Q2:採用什麼樣的結合策略

2. 集成學習-個體學習器

不穩定的學習器更適合作爲基學習器,因爲不穩定的學習器容易受到樣本分佈的影響(方差大),很好的引入了隨機性,這有助於在集成學習中提升模型的泛化能力

2.1 同質學習器(常用)

比如都是決策樹個體學習器,或者都是神經網絡個體學習器。

  • 強依賴同質學習器
    個體學習器之間存在強依賴關係,一系列個體學習器基本都需要串行生成,代表算法是boosting系列算法,Boosting主要關注降低偏差,因此Boosting能基於泛化性能相當弱的學習器構建出很強的集成;

  • 無依賴同質學習器
    個體學習器之間不存在強依賴關係,一系列個體學習器可以並行生成,代表算法是bagging隨機森林系列算法,Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網絡等學習器上效用更爲明顯。

2.2 異質學習器

對訓練集採用支持向量機個體學習器,邏輯迴歸個體學習器和樸素貝葉斯個體學習器來學習,再通過某種結合策略(如stacking)來確定最終的分類強學習器。

3. 集成學習-結合策略

  • 平均法
    對於若干個弱學習器的輸出進行平均得到最終的預測輸出。
  • 投票法
    相對多數投票法、絕對多數投票法、加權多數投票法
  • 學習法
    代表方法是stacking(常用於異質集成),當使用stacking的結合策略時, 我們不是對弱學習器的結果做簡單的邏輯處理,而是再加上一層學習器,也就是說,我們將訓練集弱學習器的學習結果作爲輸入,將訓練集的輸出作爲輸出,重新訓練一個學習器來得到最終結果。在這種情況下,我們將弱學習器稱爲初級學習器,將用於結合的學習器稱爲次級學習器

4. 集成學習算法

4.1 boosting

Boosting系列算法裏最著名算法主要有AdaBoost算法和提升樹(boosting tree)系列算法。提升樹系列算法裏面應用最廣泛的是梯度提升樹(Gradient Boosting Tree)。

4.1.1 boosting原理

在這裏插入圖片描述

  • 先從初始訓練集訓練出一個基學習器
  • 再根據基學習器的表現對訓練樣本分佈進行調整(數據加權),使得先前基學習器做錯的訓練樣本在後續受到更多關注
  • 基於調整後的樣本分佈來訓練下一個基學習器;
  • 重複進行上述步驟,直至基學習器數目達到事先指定的值T,最終將這T個基學習器進行加權結合

Q1:如何計算第k個弱分類器在訓練集上的學習誤差率eke_k
Q2:如何由學習誤差率eke_k更新第k個弱分類器的權重係數αk\alpha_k
Q3:如何更新訓練集上的樣本權重D
Q4:使用何種結合策略

4.1.2 boosting基分類器

對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原數據,所以可以保證偏差小,所以對於每個基分類器來說,問題就在於如何選擇方差更小的分類器(即更簡單的分類器),所以我們選擇了深度很淺的決策樹。

爲什麼使用決策樹作爲基學習器/ 基學習器有什麼特點

(1). 決策樹的表達能力和泛化能力,可以通過剪枝快速調整;
(2). 決策樹可以方便地將樣本的權重整合到訓練過程中;
(3). 決策樹是一種不穩定的學習器;

爲什麼不穩定的學習器更適合作爲基學習器?
  • 所謂不穩定,指的是數據樣本的擾動會對學習器的結果產生較大的影響;
  • 不穩定的學習器容易受到樣本分佈的影響(方差大),很好的引入了隨機性;這有助於在集成學習(特別是採用 Bagging 策略)中提升模型的泛化能力
  • 爲了更好的引入隨機性,有時會隨機選擇一個屬性子集中的最優分裂屬性,而不是全局最優(隨機森林
還有哪些模型也適合作爲基學習器?

神經網絡也屬於不穩定的學習器,通過調整神經元的數量、網絡層數,連接方式初始權重也能很好的引入隨機性和改變模型的表達能力和泛化能力。

4.1.3 boosting系列算法之AdaBoost算法

Adaboost算法的特點是通過迭代每次學習一個基分類器,在每次迭代中,提高那些被前一輪分類器錯誤分類的樣本權值,降低那些被正確分類的樣本權值。最後,將這些基分類器的線性組合作爲強分類器,其中給分類誤差率小的基分類器以大的權值,給分類誤差率大的基分類器以小的權值。簡單點說:Adaboost 是讓“錯分的樣本權重越來越大,使它們更被重視”。

一般來說,使用最廣泛的Adaboost弱學習器是決策樹和神經網絡。對於決策樹,Adaboost分類用了CART分類樹,而Adaboost迴歸用了CART迴歸樹。

在這裏插入圖片描述
Adaboost是模型爲加法模型,學習算法爲前向分步學習算法,損失函數爲指數函數的分類問題。上述公式均可由其損失函數推導得出,詳情見參考教程

Adaboost的優點

1)Adaboost作爲分類器時,分類精度很高

2)在Adaboost的框架下,可以使用各種迴歸分類模型來構建弱學習器,非常靈活。

3)作爲簡單的二元分類器時,構造簡單,結果可理解。

4)不容易發生過擬合

Adaboost的缺點

對異常樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終的強學習器的預測準確性。

4.1.4 boosting系列算法之提升樹

提升樹是以決策樹(分類樹或迴歸樹)爲基分類器,採用加法模型與前向分佈算法的提升方法。由於樹的線性組合可以很好地擬合訓練數據,即使數據中的輸入與輸出之間的關係很複雜也是如此,所以提升樹是一個高功能的學習算法。

提升樹模型可以表示爲決策樹的加法模型:fm(x)=m=1MT(x;θm)f_m(x)=\sum_{m=1}^MT(x;\theta_m)其中,T(x;θm)T(x;\theta_m)表示決策樹;θm\theta_m爲決策樹的參數;M爲樹的個數。

迴歸問題提升樹使用以下前向分步算法:
f0(x)=0f_0(x)=0fm(x)=fm1(x)+T(x;θm)m=1,...Mf_m(x)=f_{m-1}(x)+T(x;\theta_m)\quad m=1,...MfM(x)=m=1MT(x;θm)f_M(x)=\sum_{m=1}^MT(x;\theta_m)在前向分步算法的第m步,給定當前模型fm1(x)f_{m-1}(x),需求解θ^m=argminθmi=1NL(yi,fm1(xi)+T(xi;θm))\hat\theta_m=argmin_{\theta_m}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\theta_m))得到θ^m\hat\theta_m,即第m棵樹的參數。

常用損失函數
  • 分類問題
    • 指數損失L(y,f(x))=exp(yf(x))L(y,f(x))=exp(-yf(x))
    • 對數損失L(y,f(x)=k=1Kyklogpk(x)L(y,f(x)=-\sum_{k=1}^Ky_klogp_k(x)K是類別數
  • 迴歸問題
    • 均方損失L(y,f(x))=(yf(x))2L(y,f(x))=(y-f(x))^2
    • 絕對損失L(y,f(x))=yf(x)L(y,f(x))=|y-f(x)|

以均方損失爲例,L(yi,fm1(xi)+T(xi;θm))=[yfm1(x)T(x;θm)]2=[rT(x;θm)]2L(y_i,f_{m-1}(x_i)+T(x_i;\theta_m))=[y-f_{m-1}(x)-T(x;\theta_m)]^2=[r-T(x;\theta_m)]^2其中,rm=yfm1(x)r_m=y-f_{m-1}(x)表示當前模型擬合數據的殘差,通過擬合殘差rmi(i=1,2,...,N)r_{mi}(i=1,2,...,N)學習一個迴歸樹,得到T(x;θm)T(x;\theta_m),從而可以更新fm(x)f_m(x)

4.1.4.1 梯度提升GBDT(Gradient Boosting Decison Tree)

當損失函數是平方損失和指數損失函數時,每一步優化是很簡單的。但對於一般損失函數而言,每一步的優化並不容易。
於是就有了梯度提升算法,這是利用最速下降法的近似方法,關鍵在於利用損失函數的負梯度在當前模型的值作爲殘差的近似值,擬合一個迴歸樹[L(y,f(xi))f(xi)]f(x)=fm1(x)-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}

GBDT每一次的計算是爲了減少上一次的殘差,而爲了消除殘差,我們可以在殘差減少的梯度方向上建立一個新的模型。所以說,在GBDT中,每個新模型的建立是爲了使得之前模型的殘差往梯度方向減少。

GBDT的優點
  • 非線性變換比較多,表達能力強
  • 不需要做複雜的特徵工程和特徵變換
GBDT的缺點
  • Boost是一個串行過程,不好並行化,計算複雜度高
  • 不太適合高維稀疏特徵。

GBDT和基於樹的adaboost的區別
1、相同點:
加性模型+前向分步算法
每一步訓練一個弱學習器以彌補前面模型的不足
2、不同點:
Adaboost的迭代是重點擬合那些之前分錯的樣本,讓“錯分的樣本權重越來越大,使它們更被重視”。
GBDT則是直接用梯度擬合殘差,沒有樣本權重的概念。

4.1.4.2 XGB:GBDT的C++實現

xgboost(XGB) 是GBDT的一個c++實現能自動利用cpu的多線程,而且適當改進了GBDT,加了剪枝,控制了模型的複雜程度。因而在計算速度和準確率上,較GBDT有明顯的提升。

xgboost的優點
  • 自動利用cpu的多線程進行並行:這是XGBoost最大的特點!
  • 支持線性分類器: 傳統GBDT只能以CART作爲基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)
  • 對代價函數作二階展開:傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數,精度更高。
  • 支持自定義代價函數:只要函數可一階和二階求導。
  • 加入正則項:主要是對樹模型的複雜度(樹的葉子數和葉子分數)做懲罰,確保了樹模型的簡單性,防止過擬合。
  • 節點分裂算法:利用局部近似算法對分裂節點的貪心算法優化,取適當的eps時,可以保持算法的性能且提高算法的運算速度。
  • 支持列抽樣:借鑑了隨機森林的做法,不僅能降低過擬合,還能減少計算。
  • 缺失值處理:對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。
  • 樣本預排序:樣本數據事先排好序並以block的形式存儲,利於並行計算
xgboost的缺點
  • 樣本預排序需要消耗很多的內存空間(2 * #data * # features)
  • 數據分割點上,由於XGB對不同的數據特徵使用pre-sorted算法而不同特徵其排序順序是不同的,所以分裂時需要對每個特徵單獨做依次分割,遍歷次數爲#data * #features來將數據分裂到左右子節點上。
  • 儘管使用了局部近似計算,但是處理粒度還是太細
  • 由於pre-sorted處理數據,在尋找特徵分裂點時(level-wise),會產生大量的cache隨機訪問

參考:
『我愛機器學習』集成學習(三)XGBoost - 細語呢喃

4.1.4.3 LightGBM

LightGBM 是一個梯度 boosting 框架, 使用基於學習算法的決策樹. 它是分佈式的, 高效的, 裝逼的。相比較XGB,LightGBM 速度更快,內存消耗更低。

LightGBM的主要特性
  • 速度和內存使用的優化
    許多提升工具對於決策樹的學習使用基於 pre-sorted 的算法(例如,在xgboost中默認的算法) ,這是一個簡單的解決方案,但是不易於優化。LightGBM 利用基於 histogram 的算法,通過將連續特徵(屬性)值分段爲 discrete bins 來加快訓練的速度並減少內存的使用。
  • 稀疏優化
    對於稀疏的特徵僅僅需要 O(2 * #non_zero_data) 來建立直方圖
  • 準確率的優化
    • Leaf-wise (Best-first) 的決策樹生長策略:選取具有最大 delta loss 的葉節點來生長
      • 當生長相同的 #leaf,leaf-wise 算法可以比 level-wise 算法減少更多的損失
      • 當 #data 較小的時候,leaf-wise 可能會造成過擬合。 所以,LightGBM 可以利用額外的參數 max_depth 來限制樹的深度並避免過擬合。
    • 類別特徵值的最優分割:根據訓練目標的相關性對類別進行重排序
      • 我們通常將類別特徵轉化爲 one-hot coding。 然而,對於學習樹來說這不是個好的解決方案。 原因是,對於一個基數較大的類別特徵,學習樹會生長的非常不平衡,並且需要非常深的深度才能來達到較好的準確率。
      • LightGBM則是根據訓練目標的相關性對類別進行重排序。 更具體的說,根據累加值(sum_gradient / sum_hessian)重新對(類別特徵的)直方圖進行排序,然後在排好序的直方圖中尋找最好的分割點。
  • 網絡通信的優化
    LightGBM 實現了 state-of-art 算法, 這些聚合通信算法可以提供比點對點通信更好的性能。
  • 並行學習的優化
    • 特徵並行
    • 數據並行
    • 投票並行
  • GPU 支持可處理大規模數據

參考:LightGBM 中文文檔
http://lightgbm.apachecn.org/#/

4.1.4.4 ThunderGBM:快成一道閃電的梯度提升決策樹

儘管 XGBoost 等庫已經支持 GPU 了,但畢竟不是一開始就爲 GPU 而設計的,因此在優化和加速上會有一些瑕疵。而 ThunderGBM 旨在幫助用戶輕鬆高效地應用 GBDT 和隨機森林來解決問題,它可以利用 GPU 完成高效訓練

ThunderGBM的主要特性
  • 速度通常是其它庫的 10 倍。
  • 支持 Python(scikit-learn)接口。
  • 支持操作系統 Linux。
  • 支持分類、迴歸和排序。

4.2 bagging

Bagging是引導聚合的意思。 通過對 n 個獨立不相關的模型預測結果取平均,來減少估計方差(方差是原來的1/n)

對於Bagging需要注意的是,每次訓練集可以取全部的特徵進行訓練,也可以隨機選取部分特徵訓練,例如隨機森林就是每次隨機選取部分特徵。
在這裏插入圖片描述
bagging的個體弱學習器的訓練集是通過隨機採樣得到的。通過T次的隨機採樣,我們就可以得到T個採樣集,對於這T個採樣集,我們可以分別獨立的訓練出T個弱學習器,再對這T個弱學習器通過集合策略來得到最終的強學習器。通常分類任務使用投票的方式集成,而回歸任務通過平均的方式集成。

隨機採樣:
一般採用的是自助採樣法(bootstrap),即對於m個樣本的原始訓練集,我們每次先隨機採集一個樣本放入採樣集,接着把該樣本放回,也就是說下次採樣時該樣本仍有可能被採集到,這樣採集m次,最終可以得到m個樣本的採樣集,由於是隨機採樣,這樣每次的採樣集是和原始訓練集不同的,和其他採樣集也是不同的,這樣得到多個不同的弱學習器。m次採樣都沒有被採集中的概率:(11m)m1e=36.8%(1-\frac{1}{m})^m\to\frac{1}{e}=36.8\%這36.8%的數據稱爲袋外數據,它們沒有參與訓練集模型的擬合,因此可以用來檢測模型的泛化能力。

4.3 隨機森林

隨機森林就是通過集成學習的思想將多棵決策樹集成的一種算法,是bagging的一個特化進階版,所謂的特化是因爲隨機森林的弱學習器都是決策樹。所謂的進階是隨機森林在bagging的樣本隨機採樣基礎上,又加上了特徵的隨機選擇,其基本思想沒有脫離bagging的範疇。

RF的算法思路
  1. 樣本的隨機:從樣本集中用自助採樣法隨機選取n個樣本

  2. 特徵的隨機:從所有屬性中隨機選取K個屬性,選擇最佳分割屬性作爲節點建立CART決策樹(泛化的理解,這裏面也可以是其他類型的分類器,比如SVM、Logistics)

  3. 重複以上兩步m次,即建立了m棵CART決策樹

  4. 這m個CART形成隨機森林,通過投票表決結果,決定數據屬於哪一類(投票機制有一票否決制、少數服從多數、加權多數)

在隨機森林中,每個樹模型都是隨機採樣訓練的。另外,特徵也是隨機選擇的,最後對於訓練好的樹也是隨機選擇的。這種處理的結果是隨機森林的偏差增加的很少,而由於弱相關樹模型的平均,方差也得以降低,最終得到一個方差小,偏差也小的模型。

RF的主要優點

1) 訓練可以高度並行化,對於大數據時代的大樣本訓練速度有優勢。個人覺得這是的最主要的優點。

2) 由於可以隨機選擇決策樹節點劃分特徵,這樣在樣本特徵維度很高的時候,仍然能高效的訓練模型。

3) 在訓練後,可以給出各個特徵對於輸出的重要性

4) 由於採用了隨機採樣,訓練出的模型的方差小,泛化能力強。

5) 相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單

6) 對部分特徵缺失不敏感。

RF的主要缺點

1)在某些噪音比較大的樣本集上,RF模型容易陷入過擬合

2) 取值劃分比較多的特徵容易對RF的決策產生更大的影響,從而影響擬合的模型的效果。

4.4 stacking

在這裏插入圖片描述
Stacking是指訓練一個模型用於組合(combine)其他各個模型,即首先我們先訓練多個不同的基礎模型(基礎模型利用整個訓練集做訓練),然後再以之前訓練的各個基礎模型的輸出爲輸入來訓練一個元模型(元模型將基礎模型的特徵作爲特徵進行訓練),以得到一個最終的輸出。在實際應用中,我們通常使用單層logistic迴歸作爲組合模型。通過一個元分類器或者元迴歸器來整合多個分類模型或迴歸模型的集成學習技術。由於基礎模型通常包含不同的學習算法,因此stacking通常是異質集成。

Stacking被Kaggle競賽獲獎者廣泛使用。例如,Otto Group Product分類挑戰賽的第一名通過對30個模型做stacking贏得了冠軍。他將30個模型的輸出作爲特徵,繼續在三個模型中訓練,這三個模型XGBoost,Neural Network和Adaboost,最後再加權平均。詳見文章

參考教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章