整合學習(Ensemble learning)透過組合幾種模型來提高機器學習的效果。與單一模型相比,該方法可以提供更好的預測結果。正因為如此,整合方法在許多著名的機器學習比賽(如 Netflix、KDD 2009 和 Kaggle 比賽)中能夠取得很好的名次。
整合方法是將幾種機器學習技術組合成一個預測模型的元演算法,以達到減小方差(bagging)、偏差(boosting)或改進預測(stacking)的效果。
集合方法可分為兩類:
- 序列整合方法,其中參與訓練的基礎學習器按照順序生成(例如 AdaBoost)。序列方法的原理是利用基礎學習器之間的依賴關係。透過對之前訓練中錯誤標記的樣本賦值較高的權重,可以提高整體的預測效果。
- 並行整合方法,其中參與訓練的基礎學習器並行生成(例如 Random Forest)。並行方法的原理是利用基礎學習器之間的獨立性,透過平均可以顯著降低錯誤。
大多數整合方法使用單一基礎學習演算法來產生同質的基礎學習器,即相同型別的學習器,為同質整合。
還有一些使用異構學習器的方法,即不同型別的學習器,為異構整合。為了使整合方法比其中的任何單一演算法更準確,基礎學習器必須儘可能準確和多樣化。
Bagging
Bagging 是 bootstrap aggregation 的縮寫。一種減小估計方差的方法是將多個估計值一起平均。例如,我們可以在不同的資料子集上訓練 M 個不同的樹(隨機選擇)並計算整合結果:
Bagging 使用 bootstrap 抽樣來獲取訓練基礎學習器的資料子集。Bagging 使用投票分類和均值迴歸來聚合得到基礎學習者的輸出。
我們可以在 Iris 資料集上研究 bagging 方法的分類效果。為了對比預測效果,我們選用兩個基準估計器:決策樹和 k-NN 分類器。圖 1 顯示了基準估計器和 bagging 整合演算法在 Iris 資料集上的學習決策邊界。
準確率:0.63(+/- 0.02)[決策樹]
準確率:0.70(+/- 0.02)[K-NN]
準確率:0.64(+/- 0.01)[bagging 樹]
準確率:0.59(+/- 0.07)[bagging K-NN]
決策樹的決策邊界與軸並行,而 K-NN 演算法在 k=1 時決策邊界與資料點緊密貼合。Bagging 整合了 10 個基礎估計器進行訓練,其中以 0.8 的機率抽樣訓練資料和以 0.8 的機率抽樣特徵。
與 k-NN bagging 整合相比,決策樹 bagging 整合實現了更高的準確率。K-NN 對訓練樣本的擾動較不敏感,因此被稱為穩定學習器。
整合穩定學習器不利於提高預測效果,因為整合方法不能有助於提高泛化效能。
最右側的圖還顯示了測試集的準確率如何隨著整合的大小而提高。根據交叉驗證的結果,我們可以看到準確率隨著估計器的數量而增加,一直到約 10 個基礎估計器時達到最大值,然後保持不變。因此對於 Iris 資料集,新增超過 10 個的基本估計器僅僅增加了計算複雜度而不增加準確率。
我們還可以看到 bagging 樹整合的學習曲線。注意訓練資料的平均誤差為 0.3,測試資料為 U 形誤差曲線。訓練誤差和測試誤差之間的最小差距出現在訓練集大小的 80%左右的位置。
常用的整合演算法類是隨機森林。
在隨機森林中,整合中的每棵樹都是由從訓練集中抽取的樣本(即 bootstrap 樣本)構建的。另外,與使用所有特徵不同,這裡隨機選擇特徵子集,從而進一步達到對樹的隨機化目的。
因此,隨機森林產生的偏差略有增加,但是由於對相關性較小的樹計算平均值,估計方差減小了,導致模型的整體效果更好。
在非常隨機化樹(extremely randomized trees)演算法中,進一步增加隨機性:分割閾值是隨機的。與尋找最具有區分度的閾值不同,每個備選特徵的閾值是隨機選擇的,這些隨機生成的閾值中的最佳值將作為分割規則。這通常能夠減少模型的方差,但代價是偏差的略微增加。
Boosting
Boosting 是指能夠將弱學習器轉化為強學習器的一類演算法族。Boosting 的主要原理是適應一系列弱學習器模型,這些模型只是稍微優於隨機猜測,比如小決策樹——資料加權模型。更多的權重賦值早期訓練錯誤分類的例子。
然後透過結合加權多數投票(分類)或加權求和(迴歸)以產生最終預測。Boosting 與 bagging 等方法的主要區別是基礎學習器透過加權的資料進行順序訓練。
下面的演算法闡述了最廣泛使用的 boosting 演算法形式,稱為 AdaBoost,是 adaptive boosting 的縮寫。
我們看到第一個基礎分類器 y1(x) 使用全部相等的權重進行訓練。在隨後的 boosting 訓練中,增加錯誤分類的資料點的係數權重,同時減少正確分類的資料點的係數權重。
數值 epsilon 表示每個基礎分類器的加權誤差率。因此,係數權重 alpha 對更準確的分類器賦值更大的權重。
AdaBoost 演算法如上圖所示。每個基礎學習器由深度為 1 的決策樹組成,從而基於特徵閾值對資料進行分類,該特徵閾值將空間分割成由與一個軸平行的線性決策表面分開的兩個區域。該圖還顯示了測試集的準確率隨集合大小的增加而改善,同時顯示了訓練資料和測試資料的學習曲線。
梯度 boosting 樹(Gradient Tree Boosting)是 boosting 使用任意可微分損失函式的推廣。它可以用於迴歸和分類問題。梯度 Boosting 以順序的方式構建模型。
在每一步,給定當前的模型 Fm-1(x),決策樹 hm(x) 透過最小化損失函式 L 更新模型:
迴歸和分類演算法在使用的損失函式的型別上有所不同。
Stacking
Stacking 是一種整合學習技術,透過元分類器或元迴歸聚合多個分類或迴歸模型。基礎層次模型(level model)基於完整的訓練集進行訓練,然後元模型基於基礎層次模型的輸出進行訓練。
基礎層次通常由不同的學習演算法組成,因此 stacking 整合通常是異構的。下面的演算法概括了 stacking 演算法的邏輯:
下面是幾種演算法的準確率,表示在上圖右邊的圖形中:
準確率:0.91(+/- 0.01)[K-NN]
準確率:0.91(+/- 0.06)[隨機森林]
準確率:0.92(+/- 0.03)[樸素貝葉斯]
準確率:0.95(+/- 0.03)[Stacking 分類器]
stacking 整合如上圖所示。它由 k-NN、隨機森林和樸素貝葉斯基礎分類器組成,它的預測結果由作為元分類器的 Logistic 迴歸組合。我們可以看到 stacking 分類器實現的混合決策邊界。該圖還顯示,stacking 能夠實現比單個分類器更高的準確率,並且從學習曲線看出,其沒有顯示過擬合的跡象。
在 Kaggle 資料科學競賽中,像 stacking 這樣的技術常常贏得比賽。例如,贏得奧托(Otto)集團產品分類挑戰賽的第一名所使用的技術是整合了 30 多個模型的 stacking,它的輸出又作為三個元分類器的特徵:XGBoost、神經網路和 Adaboost。有關詳細資訊,請參閱以下連結:https://www.kaggle.com/c/otto-group-product-classification-challenge/discussion/14335。
程式碼
生成文中所有圖片的程式碼詳見 ipython notebook:https://github.com/vsmolyakov/experiments_with_python/blob/master/chp01/ensemble_methods.ipynb。
結論
除了本文研究的方法之外,深度學習也常常透過訓練多樣化和準確的分類器運用整合學習方法。其中,可以透過改變架構、超引數設定和訓練技術來實現多樣性。
整合學習非常成功,該演算法不僅在挑戰性的資料集上頻頻打破效能方面的記錄,而且是 Kaggle 資料科學競賽的獲獎者常用的方法之一。