集成學習
原理
8.1 個體與集成
- 集成學習(ensemble learning) 通過構建并結合多個學習器來完成學習任務,有時也被稱為多分類器系統(multi-classifier system)、基于委員會的學習(committee-based learning)等。
- 先產生一組“個體學習器” (individual learner),再用某種策略將它們結合起來。個體學習器通常由一個現有的學習算法從訓練數據產生,例如決策樹算法、BP神經網絡算法等,此時集成中只包含同種類型的個體學習器,例如“決策樹集成”中全是決策樹,“神經網絡集成”中全是神經網絡,這樣的集成是“同質”的(homogeneous)。同質集成中的個體學習器亦稱“基學習器”(base learner),相應的學習算法稱為“基學習算法”(base learning algorithm)。集成也可包含不同類型的個體學習器,例如同時包含決策樹和神經網絡,這樣的集成是“異質”的(heterogenous)。異質集成中的個體學習器由不同的學習算法生成,這時就不再有基學習算法;相應的,個體學習器一般不稱為基學習器,常稱為“組件學習器”(component learner)或直接稱為個體學習器。
- 集成學習通過將多個學習器進行結合,常可獲得比單一學習器顯著優越的泛化性能。這對“弱學習器”(weak learner)尤為明顯,因此集成學習的很多理論研究都是針對弱學習器進行的,而基學習器有時也被直接稱為弱學習器。弱學習器常指泛化性能略優于隨機猜想的學習器。但需注意的是,雖然從理論上來說使用弱學習器集成足以獲得很好的性能,但在實踐中出于種種考慮,例如希望使用較少的個體學習器,或是重用關于常見學習器的一些經驗等,人們往往會使用比較強的學習器。
- 考慮一個簡單的例子:在二分類任務中,假定三個分類器在三個測試樣本上的表現,用√表示分類正確,X表示分類錯誤,集成學習的結果通過投票法(voting)產生,即“少數服從多數”。要獲得好的集成,個體學習器應“好而不同”,即個體學習器要有一定的“準確性”,并且要有“多樣性”(diversity),即學習器間具有差異。
- 在現實任務中,個體學習器是為解決同一個問題訓練出來的,它們顯然不可能相互獨立!事實上,個體學習器的“準確性”和“多樣性”本身就存在沖突。一般的,準確性很高之后,要增加多樣性就需犧牲準確性。事實上,如何產生并結合“好而不同”的個體學習器,恰是集成學習研究的核心。
- 根據個體學習器的生成方式,目前的集成學習方法大致可分為兩大類,即個體學習器間存在強依賴關系、必須串行生成的序列方法,以及個體學習器間不存在強依賴關系、可同時生成的并行化方法;前者的代表是Boosting,后者的代表是 Bagging 和“隨機森林” (Random Forest)。
8.2 Boosting
- Boosting 是一族可將弱學習器提升為強學習器的算法。這族算法的工作機制類似:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對訓練樣本分布進行調整,使得先前基學習器做錯的訓練樣本在后續受到更多關注,然后基于調整后的樣本分布來訓練下一個基學習器;如此重復進行,直至基學習器數目達到事先指定的值T,最終將這 T 個基學習器進行加權結合。
- Boosting 族算法最著名的代表是 AdaBoost。
- Boosting 算法要求基學習器能對特定的數據分布進行學習,這可通過“重賦權法”(re-weighting)實施,即在訓練過程的每一輪中,根據樣本分布為每個訓練樣本重新賦予一個權重。對無法接受帶權樣本的基學習算法,則可通過“重采樣法”(re-sampling)來處理,即在每一輪學習中,根據樣本分布對訓練集重新進行采用,再用重采樣而得的樣本集對基學習器進行訓練。一般而言,這兩種做法沒有顯著的優劣差別。
- 需要注意的是,Boosting算法在訓練的每一輪都要檢查當前生成的基學習器是否滿足條件(例如檢查當前基分類器是否比隨機猜測好),一旦條件不滿足,則當前基學習器即被拋棄,且學習過程停止。在此種情形下,初始設置的學習輪數 T 也許還遠未達到,可能導致最終集成中只包含很少的基學習器而性能不佳。若采用“重采樣法”,則可獲得“重啟動”機會以避免訓練過程過早停止,即在拋棄不滿足條件的當前基學習器之后,可根據當前分布重新對訓練樣本進行采用,再基于新的采樣結果重新訓練出基學習器,從而使得學習過程可以持續到預設的T輪完成。
- 從偏差-方差分解的角度看,Boosting主要關注降低偏差,因此Boosting能基于泛化性能相當弱的學習器構造出很強的集成。
8.3 Bagging與隨機森林
- 欲得到泛化性能強的集成,集成中的個體學習器應盡可能相互獨立;雖然“獨立”在現實任務中無法做到,但可以設法使基學習器盡可能有較大的差異。給定一個訓練數據集,一種可能的做法是對訓練樣本進行采用,產生出若干個不同的子集,再從每個數據子集中訓練出一個基學習器。這樣,由于訓練數據不同,我們獲得的基學習器可望具有比較大的差異。然而,為獲得好的集成,我們同事還希望個體學習器不能太差。如果采樣出的每個子集都完全不同,則每個基學習器只用到了一小部分訓練數據,甚至不足以進行有效學習,這顯然無法確保產生出比較好的基學習器。為解決這個問題,我們可考慮使用相互有交疊的采樣子集。
8.3.1 Bagging
- Bagging 是并行式集成學習方法最著名的代表,從名字可以看出,它直接基于我們的自助采樣法(bootstrap sampling)。給定包含 m 個樣本的數據集,我們先隨機取出一個樣本放入采樣集中,再把該樣本放回初始數據集,使得下次采樣時該樣本仍有可能被選中,這樣,經過 m 次隨機采樣操作,我們得到含 m 個樣本的采樣集,初始訓練集中有的樣本在采樣集里多次出現,有的則從未出現。初始訓練集中約有63.2%的樣本在采樣集中。
- 照這樣,我們可采樣出 T 個含 m 個訓練樣本的采樣集,然后基于每個采樣集訓練出一個基學習器,再將這些基學習器進行結合。這就是 Bagging 的基本流程。在對預測輸入進行結合時,Bagging 通常對分類任務使用簡單投票法,對回歸任務使用簡單平均法。若分類預測時出現兩個類收到同樣票數的情形,則最簡單的做法是隨機選擇一個,也可進一步考察學習器投票的置信度來確定最終勝者。
- 假定基學習器的計算復雜度為 O(m),則 Bagging 的復雜度大致為 T(O (m) + O(s)),考慮到采樣與投票/平均過程的復雜度 O(s) 很小,而 T 通常是一個不太大的常數,因此,訓練一個 Bagging 集成與直接使用基學習算法訓練一個學習器的復雜度同階,這說明 Bagging 是一個很高效的集成學習算法。另外,與標準 AdaBoost 只適用于二分類任務不同,Bagging 能不經修改地用于多分類、回歸等任務。
- 值得一提的是,自助采樣過程還給Bagging帶來了另一個優點:由于每個基學習器只使用了初始訓練集中約63.2%的樣本,剩下約36.8%的樣本可用作驗證集來對泛化性能進行“包外估計”(out-of-bag estimate)。為此需記錄每個基學習器所使用的訓練樣本。
- 事實上,包外樣本還有許多其他用途。例如當基學習器是決策樹時,可使用包外樣本來輔助剪枝,或用于估計決策樹中各節點的后驗概率以輔助對零訓練樣本節點的處理;當基學習器是神經網絡時,可使用包外樣本來輔助早期停止以減小過擬合風險。
- 從偏差-方差分解的角度看,Bagging主要關注降低方差,因此它在不剪枝決策樹、神經網絡等易受樣本擾動的學習器上效用更為明顯。
8.3.2 隨機森林
- 隨機森林(Random Forest, RF) 是Bagging的一個擴展變體。RF在以決策樹為基學習器構建 Bagging 集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇。具體來說,傳統決策樹在選擇劃分屬性時是在當前結點的屬性集合(假定有d個屬性)中選擇一個最優屬性;而在RF中,對基決策樹的每個結點,先從該結點的屬性集合中隨機選擇一個包含k個屬性的子集,然后再從這個子集中選擇一個最優屬性用于劃分。這里的參數k控制了隨機性的引入程度:若令 k = d,則基決策樹的構建與傳統決策樹相同;若令 k = 1,則是隨機選擇一個屬性用于劃分;一般情況下,推薦值 k = log2 d。
- 隨機森林簡單、容易實現、計算開銷小,令人驚奇的是,它在很多現實任務中展現出強大的性能,被譽為“代表集成學習技術水平的方法”。可以看出,隨機森林對 Bagging 只做了小改動,但是與 Bagging 中基學習器的“多樣性”僅通過樣本擾動(通過對初始訓練集采樣)而來不同,隨機森林中基學習器的多樣性不僅來自樣本擾動,還來自屬性擾動,這就使得最終集成的泛化性能可通過個體學習器之間差異度的增加而進一步提升。
- 隨機森林的收斂性與 Bagging 相似。隨機森林的起始性能往往相對較差,特別是在集成中只包含一個基學習器時。這很容易理解,因為通過引入屬性擾動,隨機森林中個體學習器的性能往往有所降低。然而,隨著個體學習器數據的增加,隨機森林通常會收斂到更低的泛化誤差。值得一提的是,隨機森林的訓練效率常優于 Bagging,因為在個體決策樹的構建過程中,Bagging使用的是“確定型”決策樹,在選擇劃分屬性時要對結點的所有屬性進行考察,而隨機森林使用的“隨機型”決策樹則只考察一個屬性子集。
8.4 結合策略
- 學習器結合可能會從三個方面帶來好處:首先,從統計的方面來看,由于學習任務的假設空間往往很大,可能有多個假設在訓練集上達到同等性能,此時若使用單學習器可能因誤選而導致泛化性能不佳,結合多個學習器則會減小這一風險;第二,從計算的方面來看,學習算法往往會陷入局部極小,有的局部極小點所對應的泛化性能可能很糟糕,而通過多次運行之后進行結合,可降低陷入糟糕局部極小點的風險;第三,從表示的方面來看,某些學習任務的真實假設可能不在當前學習算法所考慮的假設空間中,此時若使用單學習器則肯定無效,而通過結合多個學習器,由于相應的假設空間有所擴大,有可能學得更好的近似。
8.4.1 平均法
對數值型輸出,最常見的結合策略是使用平均法(averaging)
- 簡單平均法(simple averaging)
- 加權平均法(weighted averaging)
加權平均法的權重一般是從訓練數據中學習而得,現實任務中的訓練樣本通常不充分或存在噪聲,這將使得學出的權重不完全可靠,尤其是對規模比較大的集成來說,要學習的權重比較多,較容易導致過擬合。因此,實現和應用均顯示出,加權平均法未必一定優于簡單平均法。一般而言,在個體學習器性能相差較大時宜使用加權平均法,而個體學習器性能相近時宜使用簡單平均法。
8.4.2 投票法
對分類任務來說, 學習器將從標記集合中預測出一個標記,最常見的結合策略是使用投票法(voting)。
- 絕對多數投票法(majority voting)。若某標記得票過半數,則預測為該標記;否則拒絕預測。
- 相對多數投票法(plurality voting)。預測為得票最多的標記,若同時有多個標記獲最高票,則從中隨機選取一個。
- 加權投票法(weighted voting)。與加權平均法類似。
標準的絕對多數投票法提供了“拒絕預測”選項,這在可靠性要求較高的學習任務中是一個很好的機制。但若學習任務要求必須提供預測結果,則絕對多數投票法將退化為相對多數投票法。因此,在不允許拒絕預測的任務中,絕對多數、相對多數投票法統稱為“多數投票法”。
- 類標記:使用類標記的投票亦稱為“硬投票”(hard voting)。
- 類概率:使用類概率的投票亦稱為“軟投票”(soft voting)。
8.4.3 學習法
- 當訓練數據很多時,一種更為強大的結合策略是使用“學習法”,即通過另一個學習器來進行結合。Stacking 是學習法的典型代表,這里我們把個體學習器稱為初級學習器,用于結合的學習器稱為次級學習器或元學習器(meta-learner)。
- Stacking 先從初始數據集訓練出初始學習器,然后“生成”一個新數據集用于訓練次級學習器。在這個新數據集中,初級學習器的輸出被當作樣例輸入特征,而初始樣本的標記仍被當作樣例標記。
- 在訓練階段,次級訓練集是利用初級學習器產生的,若直接用初級學習器的訓練集來產生次級訓練集,則過擬合風險會比較大;因此,一般是通過使用交叉驗證或留一法這樣的方式,用訓練初級學習器未使用的樣本來產生次級學習器的訓練樣本。
- 次級學習器的輸入屬性表示和次級學習算法對 Stacking 集成的泛化性能有很大影響。有研究表明,將初級學習器的輸出類概率作為次級學習器的輸入屬性,用多響應線性回歸(Multi-response Linear Regression, MLR) 作為次級學習算法效果最好,在MLR中使用不同的屬性集更佳。
- 貝葉斯模型平均(Bayes Model Averagign, BMA)基于后驗概率來為不同模型賦予權重,可視為加權平均法的一種特殊實現。Stacking 和 BMA 進行比較,理論上來說,若數據生成模型恰在當前考慮的模型中,且數據噪聲很少,則BMA不差于Stacking;然而,在現實應用中無法確保數據生成模型一定在當前考慮的模型中,甚至可能難以用當前考慮的模型來進行近似,因此,Stacking通常優于BMA,因為其魯棒性比BMA更好,而且BMA對模型近似誤差非常敏感。
8.5 多樣性
8.5.1 誤差-分歧分解
- 欲構建泛化能力強的集成,個體學習器應“好而不同”。現在我們來做一個簡單的理論分析。
- 個體學習器準確性越高、多樣性越大,則集成越好。“誤差-分歧分解”(error-ambiguity decomposition)
8.5.2 多樣性度量
- 多樣性度量(diversity measure)是用于度量集成個體分類器的多樣性,即估算個體學習器的多樣化程度,典型做法是考慮個體分類器的兩兩相似/不相似性。
- 不合度量(disagreement measure)
- 相關系數(correlation coefficient)
- Q-統計量(Q-statistic)
- k-統計量(k-statistic)
8.5.3 多樣性增強
- 數據樣本擾動:給定初始數據集,可從中產生出不同的數據子集,再利用不同的數據子集訓練出不同的個體學習器。數據樣本擾動通常是基于采樣法,例如在 Bagging 中使用自助采樣,在 AdaBoost 中使用序列采樣。此類做法簡單高效,使用最廣。對很多常見的基學習器,例如決策樹、神經網絡等,訓練樣本稍加變化就會導致學習器由顯著變動,數據樣本擾動法對這樣的“不穩定基學習器”很有效;然而,有一些基學習器對數據樣本的擾動不敏感,例如線性學習器、支持向量機、樸素貝葉斯、k近鄰學習器等,這樣的基學習器稱為穩定基學習器(stable base learner),對此類基學習器進行集成往往需使用輸入屬性擾動等其他機制。
- 輸入屬性擾動:訓練樣本通常由一組屬性描述,不同的“子空間”(subsapce,即屬性子集)提供了觀察數據的不同視角。顯然,從不同子空間訓練出的個體學習器必然有所不同。著名的隨機子空間(random subspace)算法就依賴于輸入屬性擾動,該算法從初始屬性集中抽取出若干個屬性子集,再基于每個屬性子集訓練一個基學習器。對包含大量冗余屬性的數據,在子空間中訓練個體學習器不僅能產生多樣性大的個體,還會因屬性數的減少而大幅節省時間開銷,同時,由于榮譽屬性多,減少一些屬性后訓練出的個體學習器也不至于太差。若數據只包含少量屬性,或者冗余屬性很少,則不宜使用輸入屬性擾動法。
- 輸出表示擾動:此類做法的基本思路是對輸出表示進行操縱以增強多樣性。可對訓練樣本的類標記稍作變動,如“翻轉法”(Filpping Output)隨機改變一些訓練樣本的標記;也可對輸出表示進行轉化,如“輸出調制法”(Output Smearing)將分類輸出轉化為回歸輸出后構建個體學習器;還可將原任務拆解為多個可同時求解的子任務,如 ECOC法利用糾錯輸出碼將多分類任務拆解為一系列二分類任務來訓練基學習器。
- 算法參數擾動:基學習算法一般都有參數需進行設置,例如神經網絡的隱層神經元數、初始連接權值等,通過隨機設置不同的參數,往往可產生差別較大的個體學習器,例如“負相關法”(Negative Correlation)顯式地通過正則化項來強制個體神經網絡使用不同的參數。對參數算法較少的算法,可通過將其學習過程中某些環節用跟其他類似方式代替,從而達到擾動的目的,例如可將決策樹使用的屬性選擇機制替換成其他的屬性選擇機制。值得指出的是,使用單一學習器時通常需使用交叉驗證等方法來確定參數值,這事實上已使用了不同參數訓練出多個學習器,只不過最終僅選擇其中一個學習器進行使用,而集成學習則相當于把這些學習器都利用起來;由此也可以看出,集成學習技術的實際計算開銷并不比使用單一學習器大得多。