1. 程式人生 > >使用整合學習提升機器學習演算法效能

使用整合學習提升機器學習演算法效能

譯者注:這篇文章是對 PythonWeekly 推薦的一篇講整合模型的文章的翻譯,原文為 Ensemble Learning to Improve Machine Learning Results,由 Vadim Smolyakov 於 2017 年 8 月 22 日發表在 Medium 上,Vadim Smolyakov 是一名 MIT 的研究生。水平有限,如有錯誤,歡迎評論區或者郵件或者私信指出。建議閱讀英文原文。

整合學習(Ensemble Learning)通過聯合幾個模型來幫助提高機器學習結果。與單一模型相比,這種方法可以很好地提升模型的預測效能。這也是為什麼整合模型在很多著名機器學習比賽中被優先使用的原因,例如 Netflix 比賽,KDD 2009 和 Kaggle。

整合方法是一種將幾種機器學習技術組合成一個預測模型的元演算法(meta-algorithm),以減小方差(bagging),偏差(boosting),或者改進預測(stacking)。

整合方法可以分為兩類:

  • 序列整合方法(sequential ensemble methods),基學習器(base learner)順序生成。序列方法的基本動機是利用基學習器之間的依賴關係。演算法可以通過提高被分錯樣本的權重來提高效能。
  • 並行整合方法(parallel ensemble methods),基學習器並行生成。並行方法的基本動機是利用基學習器之間的獨立性,因為可以通過平均來顯著降低誤差。

大多數整合方法使用一個基學習演算法來產生多個同質基學習器(homogeneous base learners),即相同型別的學習器,這就是同質整合(homogeneous ensembles)。

也有一些方法使用的是異質學習器(heterogeneous learner),即不同型別的學習器,這就是異質整合(heterogeneous ensembles)。為了使整合方法能夠比任何構成它的單獨的方法更準確,基學習器必須儘可能的準確和多樣。

Bagging

Bagging 表示的是 Bootstrap AGGregatING。降低一個估計的方差的一個方法就是平均多個估計。例如,我們可以在一個數據集的不同子集上(有放回的隨機選取)訓練 M

個不同的樹然後計算結果的平均值:

f(x)=1MΣMm=1fm(x) bagging 使用自助抽樣法(bootstrapping)來為每個基學習器獲得一個數據集的子集。對於如何聚合多個基學習器的結果,bagging 在分類任務中使用投票,而在迴歸任務重使用平均。

我們可以通過在 Iris 資料集上執行分類任務來學習 bagging。我們選擇兩種基學習器:決策樹(decision tree)和 kNN 分類器。下圖顯示了基學習器在 Iris 上學習到的決策邊界和他們 bagging 整合之後學習到的決策邊界。

  • 決策樹準確率:0.63(+/- 0.02)
  • kNN 準確率:0.70(+/- 0.02)
  • bagging 樹準確率:0.64(+/- 0.01)
  • bagging kNN準確率:0.59(+/- 0.07)
bagging
Bagging

決策樹的邊界與軸平行,而 k=1 時的 kNN 演算法與資料點緊密貼合。該整合方法使用了 10 個基學習器,訓練子集由原訓練資料和特徵的 80% 構成。

決策樹整合相對於 kNN 整合達到了較高的準確率。kNN 對訓練樣本的擾動不敏感,因此也被稱為穩定學習器(stable learner)。

穩定學習器的整合不太有利,因為這樣的整合並不會提升泛化效能。

圖一也顯示了整合大小是如何提高測試準確率的。基於交叉驗證的結果,我們可以看到在大約 10 個基學習器前準確率一直在增加,隨後趨於平緩,在 0.7 左右上下波動。因此,再增加超過 10 個基學習器不僅沒有得到準確率的提升,反而增加了計算複雜度。

我們也可以看到 bagging 樹整合的學習曲線。注意到訓練資料的平均誤差為 0.3 和 測試資料的 U 型誤差曲線。訓練和測試誤差差距最小時發生在 Training set size in percent 為 80% 左右。

一種常用的整合演算法是隨機森林。

在隨機森林演算法中,每個樹都是基於從原訓練資料集中有放回抽樣(即自助抽樣法)得到的子集訓練的。另外,也對特徵進行自助抽樣,而不是使用全部特徵。

最終隨機森林的偏差可能會輕微增大,但是由於平均了幾個不相關的樹的結果,降低了方差,導致最終模型的整體效能更好。(譯者注:個人覺得類似於時間序列分析中的移動平均

極限隨機樹(extremely randomized tree)演算法中,隨機性更近了一步:分裂閾值是隨機選取的。與尋找最具有判別性的閾值不同,極限隨機樹為每個候選特徵選取一個閾值,並將這些閾值的最佳值作為最終的分割閾值。這通常會降低方差,偏差會稍微增大。

Boosting

Boosting 指的是能夠將弱學習器轉化為強學習器的一系列演算法。Boosting 的主要原理是給一系列的弱學習器賦予權重,這些弱學習器各自的效能僅僅比隨機猜測高一些,例如小的決策樹。先前被分錯的樣本會被給予更多權重。

在進行分類任務時,使用一個加權投票來決定最終的預測,而在迴歸任務時使用加權和。Boosting 和其他方法例如 bagging 的主要區別是基學習器使用加權版本的資料集來順序生成。

下面的演算法是 AdaBoost(ADAptive BOOSTing),這是目前使用最廣泛的 boosting 演算法:

  1. 初始化樣本權重 wn1/N
  2. for m=1 to M
  3. 通過最小化加權誤差函式 Jm 訓練一個分類器 ym(x),此處 Jm=ΣNn=1w(m)n1[ym(xn)tn]
  4. 計算 ϵm=ΣNn=1w(m)n1[ym(xn)tn]ΣNn=1w(m)n
  5. 計算 αm=log(1ϵmϵm)
  6. 更新樣本權重:wm+1n=wmneαm1[ym(xn)tn]
  7. end for
  8. 使用最終的模型進行預測:YM(x)=sign(Σm=1Mαmym(x))

其中 N 為樣本數,M 為整合大小,即基學習器的數量。我們可以看到第一個基分類器 y1(x) 訓練時所使用的權重均為 1/N。在接下來的 boosting 迴圈中,那些被分錯的樣本的權重會被增大,而那些被分對的樣本的權重會減小。

ϵ 表示基分類器的加權錯誤率。因此,權重係數 α 會給予準確率更高的分類器更大的權重。

AdaBoost

如上圖所示,每一個基學習器由一個深度為 1 的決策樹組成,因此當 n_est=1 時模型只是基於一個特徵閾值將樣本空間分為兩部分。上圖也顯示了整合大小是如何提高測試準確率的以及訓練樣本和測試樣本的學習曲線。

梯度樹提升(Gradient Tree Boosting)是 boosting 在任意可微分損失函式的一種推廣,既可用於迴歸也可用於分類,同樣是順序生成基學習器。

Fm(x)=Fm1(x)+γmhm(x) 每一步基於當前模型 Fm1(x) 來計算損失 L,並最小化 L 來訓練決策樹 hm(x)Fm(x)=Fm1(x)+argminhΣni=1L(yi,Fm1(xi)+h(xi)) 使用該演算法進行迴歸和分類任務時不同在於損失函