當前位置:
首頁 > 知識 > 常用的模型集成方法介紹:bagging、boosting、stacking

常用的模型集成方法介紹:bagging、boosting、stacking

選自towardsdatascience

者:Joseph Rocca、BaptisteRocca

機器之心編譯

與:Geek AI、shooting

「團結就是力量」。這句老話很好地表達了機器學習領域中強大「集成方法」的基本思想。總的來說,許多機器學習競賽(包括 Kaggle)中最優秀的解決方案所採用的集成方法都建立在一個這樣的假設上:將多個模型組合在一起通常可以產生更強大的模型。

本文介紹了集成學習的各種概念,並給出了一些必要的關鍵信息,以便讀者能很好地理解和使用相關方法,並且能夠在有需要的時候設計出合適的解決方案。

本文將討論一些眾所周知的概念,如自助法、自助聚合(bagging)、隨機森林、提升法(boosting)、堆疊法(stacking)以及許多其它的基礎集成學習模型。

為了使所有這些方法之間的聯繫儘可能清晰,我們將嘗試在一個更廣闊和邏輯性更強的框架中呈現它們,希望這樣會便於讀者理解和記憶。

何為集成方法?

集成學習是一種機器學習範式。在集成學習中,我們會訓練多個模型(通常稱為「弱學習器」)解決相同的問題,並將它們結合起來以獲得更好的結果。最重要的假設是:當弱模型被正確組合時,我們可以得到更精確和/或更魯棒的模型。

在集成學習理論中,我們將弱學習器(或基礎模型)稱為「模型」,這些模型可用作設計更複雜模型的構件。在大多數情況下,這些基本模型本身的性能並不是非常好,這要麼是因為它們具有較高的偏置(例如,低自由度模型),要麼是因為他們的方差太大導致魯棒性不強(例如,高自由度模型)。

集成方法的思想是通過將這些弱學習器的偏置和/或方差結合起來,從而創建一個「強學習器」(或「集成模型」),從而獲得更好的性能。

組合弱學習器

為了建立一個集成學習方法,我們首先要選擇待聚合的基礎模型。在大多數情況下(包括在眾所周知的 bagging 和 boosting 方法中),我們會使用單一的基礎學習演算法,這樣一來我們就有了以不同方式訓練的同質弱學習器。

這樣得到的集成模型被稱為「同質的」。然而,也有一些方法使用不同種類的基礎學習演算法:將一些異質的弱學習器組合成「異質集成模型」。

很重要的一點是:我們對弱學習器的選擇應該和我們聚合這些模型的方式相一致。如果我們選擇具有低偏置高方差的基礎模型,我們應該使用一種傾向於減小方差的聚合方法;而如果我們選擇具有低方差高偏置的基礎模型,我們應該使用一種傾向於減小偏置的聚合方法。

這就引出了如何組合這些模型的問題。我們可以用三種主要的旨在組合弱學習器的「元演算法」:

bagging,該方法通常考慮的是同質弱學習器,相互獨立地並行學習這些弱學習器,並按照某種確定性的平均過程將它們組合起來。

boosting,該方法通常考慮的也是同質弱學習器。它以一種高度自適應的方法順序地學習這些弱學習器(每個基礎模型都依賴於前面的模型),並按照某種確定性的策略將它們組合起來。

stacking,該方法通常考慮的是異質弱學習器,並行地學習它們,並通過訓練一個「元模型」將它們組合起來,根據不同弱模型的預測結果輸出一個最終的預測結果。

非常粗略地說,我們可以說 bagging 的重點在於獲得一個方差比其組成部分更小的集成模型,而 boosting 和 stacking 則將主要生成偏置比其組成部分更低的強模型(即使方差也可以被減小)。

在接下來的章節中,我們將具體介紹 bagging 和 boosting 方法(它們比 stacking 方法使用更廣泛,並且讓我們可以討論一些集成學習的關鍵概念),然後簡要概述 stacking 方法。

我們可以將弱學習器結合起來以得到性能更好的模型。組合基礎模型的方法應該與這些模型的類型相適應。

關於 Bagging

在「並行化的方法」中,我們單獨擬合不同的學習器,因此可以同時訓練它們。最著名的方法是「bagging」(代表「自助聚合」),它的目標是生成比單個模型更魯棒的集成模型。

自助法

這種統計技術先隨機抽取出作為替代的 B 個觀測值,然後根據一個規模為 N 的初始數據集生成大小為 B 的樣本(稱為自助樣本)。

自助抽樣過程示意圖。

在某些假設條件下,這些樣本具有非常好的統計特性:在一級近似中,它們可以被視為是直接從真實的底層(並且往往是未知的)數據分布中抽取出來的,並且彼此之間相互獨立。因此,它們被認為是真實數據分布的代表性和獨立樣本(幾乎是獨立同分布的樣本)。

為了使這種近似成立,必須驗證兩個方面的假設。

首先初始數據集的大小 N 應該足夠大,以捕獲底層分布的大部分複雜性。這樣,從數據集中抽樣就是從真實分布中抽樣的良好近似(代表性)。

其次,與自助樣本的大小 B 相比,數據集的規模 N 應該足夠大,這樣樣本之間就不會有太大的相關性(獨立性)。注意,接下來我可能還會提到自助樣本的這些特性(代表性和獨立性),但讀者應該始終牢記:「這只是一種近似」。

舉例而言,自助樣本通常用於評估統計估計量的方差或置信區間。根據定義,統計估計量是某些觀測值的函數。因此,隨機變數的方差是根據這些觀測值計算得到的。

為了評估這種估計量的方差,我們需要對從感興趣分布中抽取出來的幾個獨立樣本進行估計。在大多數情況下,相較於實際可用的數據量來說,考慮真正獨立的樣本所需要的數據量可能太大了。

然而,我們可以使用自助法生成一些自助樣本,它們可被視為「最具代表性」以及「最具獨立性」(幾乎是獨立同分布的樣本)的樣本。這些自助樣本使我們可以通過估計每個樣本的值,近似得到估計量的方差。

自助法經常被用於評估某些統計估計量的方差或置信區間。

關於 Boosting

在「順序化的方法中」,組合起來的不同弱模型之間不再相互獨立地擬合。其思想是「迭代地」擬合模型,使模型在給定步驟上的訓練依賴於之前的步驟上擬合的模型。「Boosting」是這些方法中最著名的一種,它生成的集成模型通常比組成該模型的弱學習器偏置更小。

提升方法

Boosting 方法和bagging 方法的工作思路是一樣的:我們構建一系列模型,將它們聚合起來得到一個性能更好的強學習器。然而,與重點在於減小方差的 bagging 不同,boosting 著眼於以一種適應性很強的方式順序擬合多個弱學習器:序列中每個模型在擬合的過程中,會更加重視那些序列中之前的模型處理地很糟糕的觀測數據。

直觀地說,每個模型都把注意力集中在目前最難擬合的觀測數據上。這樣一來,在這個過程的最後,我們就獲得了一個具有較低偏置的強學習器(我們會注意到,boosting 也有減小方差的效果)。和 bagging 一樣,Boosting 也可以用於回歸和分類問題。

由於其重點在於減小偏置,用於 boosting 的基礎模型通常是那些低方差高偏置的模型。例如,如果想要使用樹作為基礎模型,我們將主要選擇只有少許幾層的較淺決策樹。

而選擇低方差高偏置模型作為 boosting 弱學習器的另一個重要原因是:這些模型擬合的計算開銷較低(參數化時自由度較低)。

實際上,由於擬合不同模型的計算無法並行處理(與 bagging 不同),順序地擬合若干複雜模型會導致計算開銷變得非常高。

一旦選定了弱學習器,我們仍需要定義它們的擬合方式(在擬合當前模型時,要考慮之前模型的哪些信息?)和聚合方式(如何將當前的模型聚合到之前的模型中?)在接下來的兩小節中,我們將討論這些問題,尤其是介紹兩個重要的 boosting 演算法:自適應提升(adaboost )和梯度提升(gradient boosting)。

簡而言之,這兩種元演算法在順序化的過程中創建和聚合弱學習器的方式存在差異。自適應增強演算法會更新附加給每個訓練數據集中觀測數據的權重,而梯度提升演算法則會更新這些觀測數據的值。這裡產生差異的主要原因是:兩種演算法解決優化問題(尋找最佳模型——弱學習器的加權和)的方式不同。

Boosting 會迭代地擬合一個弱學習器,將其聚合到集成模型中,並「更新」訓練數據集,從而在擬合下一個基礎模型時更好地考慮當前集成模型的優缺點。

自適應 boosting

在自適應 boosting(通常被稱為「adaboost」)中,我們將集成模型定義為 L 個弱學習器的加權和,其中 c_l 是係數而 w_l 是弱學習器

尋找這種最佳集成模型是一個「困難的優化問題」。因此,我們並沒打算一次性地解決該問題(找到給出最佳整體加法模型的所有係數和弱學習器),而是使用了一種更易於處理的「迭代優化過程」(即使它有可能導致我們得到次優解)。

另外,我們將弱學習器逐個添加到當前的集成模型中,在每次迭代中尋找可能的最佳組合(係數、弱學習器)。換句話說,我們循環地將 s_l 定義如下:

其中,c_l 和 w_l 被挑選出來,使得 s_l 是最適合訓練數據的模型,因此這是對 s_(l-1) 的最佳可能改進。我們可以進一步將其表示為:

其中,E(.) 是給定模型的擬合誤差,e(.,.)是損失/誤差函數。因此,我們並沒有在求和過程中對所有 L 個模型進行「全局優化」,而是通過「局部」優化來近似最優解並將弱學習器逐個添加到強模型中。

更特別的是,在考慮二分類問題時,我們可以將 adaboost 演算法重新寫入以下過程:首先,它將更新數據集中觀測數據的權重,訓練一個新的弱學習器,該學習器重點關注當前集成模型誤分類的觀測數據。其次,它會根據一個表示該弱模型性能的更新係數,將弱學習器添加到加權和中:弱學習器的性能越好,它對強學習器的貢獻就越大。

因此,假設我們面對的是一個二分類問題:數據集中有 N 個觀測數據,我們想在給定一組弱模型的情況下使用 adaboost 演算法。在演算法的起始階段(序列中的第一個模型),所有的觀測數據都擁有相同的權重「1/N」。然後,我們將下面的步驟重複 L 次(作用於序列中的 L 個學習器):

用當前觀測數據的權重擬合可能的最佳弱模型

計算更新係數的值,更新係數是弱學習器的某種標量化評估指標,它表示相對集成模型來說,該弱學習器的分量如何

通過添加新的弱學習器與其更新係數的乘積來更新強學習器

計算新觀測數據的權重,該權重表示我們想在下一輪迭代中關注哪些觀測數據(聚和模型預測錯誤的觀測數據的權重增加,而正確預測的觀測數據的權重減小)

重複這些步驟,我們順序地構建出 L 個模型,並將它們聚合成一個簡單的線性組合,然後由表示每個學習器性能的係數加權。注意,初始 adaboost 演算法有一些變體,比如 LogitBoost(分類)或 L2Boost(回歸),它們的差異主要取決於損失函數的選擇。

Adaboost 在每次迭代中更新觀測數據的權重。正確分類的觀測數據的權重相對於錯誤分類的觀測數據的權重有所下降。在最終的集成模型中,性能更好的模型具有更高的權重。

Stacking 概述

Stacking 與 bagging 和 boosting 主要存在兩方面的差異。首先,Stacking 通常考慮的是異質弱學習器(不同的學習演算法被組合在一起),而bagging 和 boosting 主要考慮的是同質弱學習器。其次,stacking 學慣用元模型組合基礎模型,而bagging 和 boosting 則根據確定性演算法組合弱學習器。

堆疊法(Stacking)

正如上文已經提到的,stacking 的概念是學習幾個不同的弱學習器,並通過訓練一個元模型來組合它們,然後基於這些弱模型返回的多個預測結果輸出最終的預測結果。

因此,為了構建 stacking 模型,我們需要定義兩個東西:想要擬合的 L 個學習器以及組合它們的元模型。

例如,對於分類問題來說,我們可以選擇 KNN 分類器、logistic 回歸和SVM 作為弱學習器,並決定學習神經網路作為元模型。然後,神經網路將會把三個弱學習器的輸出作為輸入,並返回基於該輸入的最終預測。

所以,假設我們想要擬合由 L 個弱學習器組成的 stacking 集成模型。我們必須遵循以下步驟:

將訓練數據分為兩組

選擇 L 個弱學習器,用它們擬合第一組數據

使 L 個學習器中的每個學習器對第二組數據中的觀測數據進行預測

在第二組數據上擬合元模型,使用弱學習器做出的預測作為輸入

在前面的步驟中,我們將數據集一分為二,因為對用於訓練弱學習器的數據的預測與元模型的訓練不相關。因此,將數據集分成兩部分的一個明顯缺點是,我們只有一半的數據用於訓練基礎模型,另一半數據用於訓練元模型。

為了克服這種限制,我們可以使用某種「k-折交叉訓練」方法(類似於 k-折交叉驗證中的做法)。這樣所有的觀測數據都可以用來訓練元模型:對於任意的觀測數據,弱學習器的預測都是通過在 k-1 折數據(不包含已考慮的觀測數據)上訓練這些弱學習器的實例來完成的。

換句話說,它會在 k-1 折數據上進行訓練,從而對剩下的一折數據進行預測。迭代地重複這個過程,就可以得到對任何一折觀測數據的預測結果。這樣一來,我們就可以為數據集中的每個觀測數據生成相關的預測,然後使用所有這些預測結果訓練元模型。

Stacking 方法會訓練一個元模型,該模型根據較低層的弱學習器返回的輸出結果生成最後的輸出。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

怎樣生成語言才能更自然,斯坦福提出超越Perplexity的評估新方法
在TensorFlow+Keras環境下使用RoI池化一步步實現注意力機制

TAG:機器之心 |