集成學習與隨機森林(Random Forest)詳述

集成學習與隨機森林(Random Forest)

個體與集成

集成學習(ensemble learning)的一般結構:先產生一組“個體學習器”(individual learner),再用某種策略將他們結合起來,如下圖所示,

個體學習器通常由一個現有的學習算法從訓練數據產生:

  • 只包含同種類型的個體學習器,這樣的集成是“同質”的(homogeneous)。同質集成中的個體學習器亦稱爲”基學習器“(base learning),相應的學習算法稱爲”基學習算法“(base learning algorithm)。

  • 集成也可包含不同類型的個體學習器,這樣集成是”異質“的(heterogeneous)。相應的個體學習器,常稱爲”組件學習器“(component learning)或直接稱爲個體學習器。

在一般的經驗中,如果把好壞不等的東西摻到一起,那麼通常結果會是比壞的好一些,比好的要壞一些。集成學習把多個學習器結合起來,如何能獲得比最好的單一學習器更好的性能呢?

弱學習器:弱學習器常指泛化性能略優於隨機猜測的學習期;例如在二分類問題上精度略高於50%的分類器。

要獲得好的集成個體學習器應“好而不同”,即個體學習器要有一定的“準確性”,即學習器不能太壞,並且要有“多樣性”(diversity),即學習器間具有差異。

個體學習器應該至少不差於弱學習器

目前集成學習的方法大致可以分爲兩種:

  1. 個體學習器之間存在強依賴關係、必須串行生成的序列化方法。(Boosting)
  2. 個體學習器之間不存在強依賴關係、可同時生成的並行化方法。(Bagging和RF)

Boosting

Boosting是一族將弱學習器提升爲強學習器的算法。工作機制如下:

先從初始訓練集中訓練出一個基學習器,再根據基學習器的表現對訓練樣本進行調整,使得先前基學習器做的的訓練樣本在後繼受到更多的關注,然後基於調整後的樣本分佈來訓練下一個基學習器;如此重複進行,直至基學習器的數目達到實現指定的值T,最終將這T個學習器進行加權結合。

具體概念可參考本博客中關於AdaBoost, GBDT與XGBoost區別章節

AdaBoost

Boosting 族算法最著名的代表是AdaBoost。該算法有多重推導方式,比較容易理解的是“加性模型”,即基學習器的線性組合來最小化指數損失函數。

算法基本流程如下:

  1. 初始化樣本權值分佈
  2. 基於分佈Dt 從數據集中訓練出分類器ht
  3. 估計ht 的誤差,若誤差>0.5則重新下一輪訓練
  4. 確定分類器ht的權重
  5. 更新樣本分佈
  6. 若未達到預製的訓練輪數,則繼續進行訓練

Boosting算法要求基學習器能對特定的數據分佈進行學習,這可以通過“重賦權”實施,即在訓練的每一輪中,根據樣本爲每個訓練樣本重新賦予一個權重。

對於無法接受帶權樣本的基學習算法,可以通過“重採樣”來處理,再用重採樣的樣本集對基學習器進行訓練。一般而言這兩種算法沒有優劣差別。

需要注意的是Boosting算法在訓練的每一輪都要檢查當前生成的基學習器是否滿足基本條件(檢查基分類器是否比隨機猜測好),一旦條件不滿足,當前基學習器被拋棄掉,學習過程停止。

在這種情形下,初始設置的學習輪數T也許還遠遠未達到,可能導致最終集成中只包含很少的基學習器而導致性能不佳。

若採用“重採樣”,則可以獲得“重啓動”機會避免過早停止。即在拋棄不滿足條件的當前基學習器之後,根據當前的分佈重新對訓練樣本進行採樣,再基於新的採樣結果重新訓練出基學習器,從而使得學習過程可以持續到預製的T輪。

從“偏差-方差”分解的角度看,Boosting主要關注降低偏差,因此基於泛化性能相當弱學習器能構建出很強的集成。

關於AdaBoost的詳細推導可參考本博客中
AdaBoost算法詳述

Bagging與隨機森林:

爲了訓練出獨立的學習器,我們可以考慮用不同的樣本的子集分別產生學習器,然而這樣每個基學習器值用到了一小部分的訓練樣本,甚至不足以有效學習,無法確保產生較好的基學習器,爲解決這個問題,我們考慮使用互相有交疊的採樣子集。

Bagging

Bagging是“並行式”集成學習方法中最著名的代表,基於我們之前介紹的自主採樣法。

  1. 給定包含m個樣本的數據集,隨機取出一個樣本放入採樣機,再將樣本放回初始數據集,使得下次採樣仍有可能被選中,經過m次隨機採樣,得到m個樣本的數據集,初始數據集中約63.2%出現在採樣集中。
  2. 我們採樣出T個含m個(Tm )訓練樣本的採樣集,然後基於每個採樣集訓練出一個基學習器,再將這些基學習器進行結合。
  3. 在對預測輸出進行結合的時候,Bagging通常對分類任務採用簡單投票法,迴歸任務採用簡單平均法,若遇到相同票數則隨機選擇一個或者根據投票置信度來選擇。

訓練一個Bagging集成與直接使用基學習算法訓練一個學習器複雜度同階,說明是一個高效的集成算法,與標準AdaBoost只適用於二分類任務不同,Bagging可以不經修改的用於多分類、迴歸等任務。

注:標準的AdaBoost只能處理二分類,現在已有變體能處理多分類或者回歸任務。

自助採樣的優點

  1. 由於只用了原始訓練集的63.2%樣本進行訓練,剩下的36.8%可以用作驗證集來對泛化性能進行“包外估計”。

  2. 包外估計還可以輔助決策樹進行剪枝,或者估計決策樹中各節點的後驗概率用於輔助對零訓練樣本節點的處理;還可以輔助神經網絡早期停止減小過擬合風險。

  3. 從“偏差-方差”分解的角度看,Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網絡等易受樣本擾動的學習器上效用更爲明顯。

從“偏差-方差”分解的角度看,即Bagging更適用於強分類器(如不剪枝的決策樹、神經網絡)集成,旨在降低方差;Boosting則更側重於弱分類器集成,旨在降低偏差。(AdaBoost、GBDT可以算是兩種不同實現類型的Boosting算法,而XGBoost可以理解爲GBDT算法架構的一種擴展變體(目標函數loss function不同,加入了正則化以及貪婪法加入新的決策樹等方式),具體可參考本博客中關於AdaBoost, GBDT與XGBoost區別章節,而隨機森林則是Bagging的一個擴展變體)

隨機森林(Random Forest, RF)

隨機森林是Bagging的一個擴展變體。

RF在以決策樹爲基學習器,構建Bagging的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇。

具體來說,傳統的決策樹在選擇劃分屬性的時候是在當前節點的屬性集合中選擇一個最優屬性,而在RF中,對基決策樹的每個節點,先從該節點的屬性集中隨機選擇一個包含k個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分。

這裏的參數k控制了隨機性的引入程度,若令k=d,則基決策樹的構建與傳統決策樹相同;
若k=1,則隨機選擇一個屬性進行劃分;一般情況下推薦k=log2d

可以看出,隨機森林對Bagging只做了微小的改動,但是與Bagging中基學習器的“多樣性”僅通過樣本擾動(通過對初始訓練集採樣)而來不同,隨機森林中基學習器的多樣性不僅來自於樣本擾動,還來自於屬性擾動,這就使得最終集成的泛化性能可以通過個體學習器之間的差異度的增加而進一步提升。

Bagging中基學習器的“多樣性”僅通過樣本擾動(通過對初始訓練集採樣),而RF中基學習器的多樣性不僅來自於樣本擾動,還來自於屬性擾動。

隨機森林的收斂性與bagging相似,隨機森林其實性能很差,隨着個體學習器增加,會收斂到更低泛化性能。
隨機森林訓練效率通常優於bagging,因爲在個體決策樹的構建過程中,bagging使用的是“確定型”決策樹,需要考慮全部屬性,但是隨機森林使用的是“隨機型”只需要考慮一個屬性集合。

隨機森林的建立

基本就是兩個步驟:隨機採樣與完全分裂。

(1)隨機採樣

首先是兩個隨機採樣的過程,random forest對輸入的數據要進行行、列的採樣。

對於行採樣,採用有放回的方式,也就是在採樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本爲N個,那麼採樣的樣本也爲N個,這選擇好了的N個樣本用來訓練一個決策樹,作爲決策樹根節點處的樣本,同時使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。

對於列採樣,從M個feature中,選擇m個(m << M),即:當每個樣本有M個屬性時,在決策樹的每個節點需要分裂時,隨機從這M個屬性中選取出m個屬性,滿足條件m << M。

(2)完全分裂

對採樣之後的數據使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裏面的所有樣本的都是指向的同一個分類。分裂的辦法是:採用上面說的列採樣的過程從這m個屬性中採用某種策略(比如說信息增益)來選擇1個屬性作爲該節點的分裂屬性。

決策樹形成過程中每個節點都要按完全分裂的方式來分裂,一直到不能夠再分裂爲止(如果下一次該節點選出來的那一個屬性是剛剛其父節點分裂時用過的屬性,則該節點已經達到了葉子節點,無須繼續分裂了)。

我們用LearnUnprunedTree(X,Y)表示生成一棵未剪枝的決策樹的過程,以下簡寫LUT (X,Y):

LearnUnprunedTree(X,Y)

輸入:
      X是RxM的矩陣,Xij表示第i個樣本的第j個特徵。
      Y是Rx1的向量,Yi表示第i個樣本的類別標籤。
輸出:
      一棵未剪枝的樹

if X的所有樣本值都相同,或Y的所有類別標籤相同,或者R<2:
則產生一個葉結點,該結點的類別即是X中最多數的類別。
else:
從M個特徵中隨機挑選m個,這m個特徵中,信息增益最大的記爲p。(信息增益的計算方法見下文)
if 特徵p 的取值是非連續的(如性別:“男”,“女”):
則對p 的任一取值v,用Xv 表示特徵p 取值爲v 的樣本,Yv 爲其對應類別Childv=LUT(Xv,Yv)
返回一個樹結點,在特徵p 處分裂,孩子的數量與特徵p 的不同取值數量相同。第v 個孩子即是Childv=LUT(Xv,Yv)
if 特徵p 的取值是連續的(如溫度,長度等):
t 爲最佳分裂閾值, XLO 表示特徵p 的值<t 的樣本集合,YLO 爲其對應類別;
ChildLO=LUT(XLO,YLO)
XHI 表示特徵p 的值>=t的樣本集合,YHI 爲其對應類別
ChildLO=LUT(XHI,YHI)
返回一個樹結點,在特徵p處分裂,有2個孩子,分別是ChildLO=LUT(XLO,YLO)ChildHO=LUT(XHI,YHI)

隨機森林的生成過程相比於一般決策樹生成過程多了:Bagging步驟的bootstrap sampling(自助採樣)與屬性集(M個)隨機選擇m個(由參數m控制,建議m=log2M

一般決策樹的生成過程可參考本博客決策樹之ID3, C4.5與CART區別與聯繫

自助採樣的優點

由於只用了原始訓練集的63.2%樣本進行訓練,剩下的36.8%可以用作驗證集來對泛化性能進行“包外估計”。

包外估計還可以輔助決策樹進行剪枝,或者估計決策樹中各節點的後驗概率用於輔助對零訓練樣本節點的處理;還可以輔助神經網絡早期停止減小過擬合風險。

因爲是自助採用是Bagging訓練基分類器的策略,而即分類器可以是決策樹也可以是神經網絡。

從“偏差-方差”分解的角度看,Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網絡等易受樣本擾動的學習器上效用更爲明顯。

隨機森林的優點

  1. 在數據集上表現良好
  2. 在當前的很多數據集上,相對其他算法有着很大的優勢
  3. 它能夠處理很高維度(feature很多)的數據,並且不用做特徵選擇
  4. 在訓練完後,它能夠給出哪些feature比較重要
  5. 在創建隨機森林的時候,對generlization error使用的是無偏估計
  6. 訓練速度快
  7. 在訓練過程中,能夠檢測到feature間的互相影響
  8. 容易做成並行化方法
  9. 實現比較簡單
  10. 能夠處理帶有缺失數據的樣本

RF小結

隨機森林顧名思義,是用隨機的方式建立一個森林,森林裏面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類算法),然後看看哪一類被選擇最多,就預測這個樣本爲那一類。

  1. 在建立每一棵決策樹的過程中,有兩點需要注意自助採樣與完全分裂。

    • 首先是兩個隨機採樣的過程,random forest對輸入的數據要進行行、列的採樣。對於行採樣,採用有放回的方式,也就是在採樣得到的樣本集合中,可能有重複的樣本。
    • 假設輸入樣本爲N個,那麼採樣的樣本也爲N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。
    • 然後進行列採樣,從M個feature中,選擇m個(m << M)。
    • 之後就是對採樣之後的數據使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裏面的所有樣本的都是指向的同一個分類。
    • 一般很多的決策樹算法都有一個重要的步驟 - 剪枝,但是這裏不這樣幹,由於之前的兩個隨機採樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。
  2. 按這種算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。

    • 我覺得可以這樣比喻隨機森林算法:每一棵決策樹就是一個精通於某一個窄領域的專家(因爲我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數據),可以用不同的角度去看待它,最終由各個專家,投票得到結果。

結合策略

學習器結合可能會從三個方面帶來好處。

  1. 統計方面
    由於學習任務的假設空間往往很大,可能有多個假設在訓練集上達到同等性能,此時若使用單學習器可能導致泛化性能不佳。結合多個學習器可以減少這一風險。
  2. 計算方面
    學習算法會陷入局部極小值,有的局部極小值對應的泛化性能可能很糟,多次運行可以降低陷入糟糕局部極小點的風險
  3. 表示方面
    某些學習任務的真實假設可能不在當前學習算法的假設空間中,此時若使用單學習器肯定無效,而應該通過多結合多個學習器,擴大假設空間才能獲得更好近似。

平均法(數值型)

  1. 簡單平均法
  2. 加權平均法
    由於加權平均法一般是從訓練數據中學習而得,現實任務中訓練樣本通常不充分或者存在噪聲,使得學出來的權值不可靠。同時學習的權重過多會導致過擬合,因此加權平均未必優於簡單平均。
    一般性能相差大學習器加權平均,相近簡單平均。

投票法(分類任務)

對分類任務來說,學習器hi 將從類別標記集合c1,c2,,cN 中預測出一個標記,最常見的結合策略是使用投票法(voting)。爲了便於討論,我們將hi 在樣本x 上的預測輸出表示爲一個N 維向量hi1(x);hi2(x);;hiN(x) ,其中hij(x)hi 在類別標記cj 上的輸出。

  1. 絕對多數投票法(majority voting)

    H(x)={cj,if i=1Thij(x)>0.5k=1Ni=1Thik(x);reject, otherwise.

    即若某標記得票過半數,則預測爲該標記;否則拒絕預測。
  2. 相對多數投票法(plurality voting)

H(x)=carg maxji=1Thij(x)

即預測爲得票最多的標記,若同時有多個暴擊獲最高票,則從中隨機選取一個。
  1. 加權投票法(weighted voting)

H(x)=carg maxji=1Twihij(x)

與加權平均法類似,wihi 的權重,通常wi/geq0 , i=1T=1

標準的絕對多數投票法提供了“拒絕預測”選項,這在可靠性要求較高的學習任務中是一個很好的機制。但若學習任務要求必須提供預測結果,則絕對多數投票法將退化爲相對多數投票法。

詳細論述可參考周志華 《機器學習》 P183 頁解釋。

  1. 學習法
    初級學習器+次級學習器,引入stacking集成架構,這個需要再開一章節詳細展開。

多樣性

誤差-分歧分解

欲構建泛化能力強的集成,個體學習器應“好而不同”,其中,“誤差-分歧分解”(error-ambiguity decomposition)是一個簡單的理論分析方法。但該推導過程只適用於迴歸學習,難以直接推廣到分類學習任務中。

多樣性度量

多樣性度量(diversity measure)是用於度量集成中個體分類器的多樣性,即估算個體學習器的多樣化程度。常用的多樣性度量包括:

不合度量(disagreement measure)
相關係數(correlation coefficient)
Q-統計量(Q-statistics)
k-統計量(k-statistics)

多樣性增強

在集成學習中需有效地生成多樣性大的個體學習器。與簡單地直接用初始數據訓練出個體學習器相比,一般思路是在學習過程中引入隨機性,常見的做法主要有,

  • 數據樣本擾動:數據樣本擾動基於採樣法。
  • 輸入屬性擾動:隨機子空間算法。
  • 輸出表示擾動:翻轉法(隨機改變一些訓練樣本的標記);輸出調製法(將分類輸出轉化爲迴歸輸出後構建學習器)…
  • 算法參數擾動:負相關法;單一學習器通常需要交叉驗證等來確定參數值。

注:常見的“不穩定基學習器”:決策樹、神經網絡,訓練樣本稍加變化就會導致學習器有顯著變動,數據樣本擾動法對這樣的“不穩定基學習器”很有效;

常見的“穩定基學習器”:線性學習器、支持向量機、樸素貝葉斯、k近鄰學習器,對此類基學習器進行集成往往需要使用輸入屬性擾動等其他幾種。

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