如何構建穩固的機器學習演算法:Boosting&Bagging

路雪發表於2017-11-25
機器學習和資料科學工作遠不是簡單地把資料交給 Python 庫處理,使用處理後的結果那麼簡單。本文將簡要介紹一些利用 Bootstrapping 提升模型魯棒性的方法。

資料科學家需要真正理解資料和如何處理資料,以實現成功的系統。

一個重要方法就是了解什麼時候模型可以利用 Bootstrapping 方法獲益。這就是整合模型。整合模型的一些示例有 AdaBoost 和隨機梯度提升(Stochastic Gradient Boosting)。

為什麼使用整合模型?

它們可以幫助提高演算法準確率或改善模型的魯棒性嗎?整合學習是經過試驗並效果屬實的方法嗎?Boosting 和 Bagging 是資料科學家和機器學習工程師必須瞭解的話題。特別是當你計劃參加資料科學/機器學習面試的時候。

本質上,整合學習是「整合」的。整合學習使用成百上千個同樣演算法的模型尋找正確的分類。

對整合學習的另一種認知是「盲人摸象」。每個盲人發現大象的一個特徵,認為大象是不同的事物。但是,聚在一起討論後,他們可能會發現大象到底是什麼模樣。

使用 Boosting 和 Bagging 等技術可以提升統計模型的魯棒性,降低方差。

那麼現在問題來了,這些以 B 開頭的單詞(Bootstrapping/Bagging/Boosting)有什麼區別呢?

Bootstrapping

首先讓我們談一下這個非常重要的概念 Bootstrapping。當很多資料科學家直接解釋 Boosting 和 Bagging 時,他們偶爾會記起 Bootstrapping,因為兩者都需要 Boosting 和 Bagging 。

如何構建穩固的機器學習演算法:Boosting&Bagging

圖 1 Bootstrapping

機器學習中,Bootstrap 方法指的是藉助替換的隨機取樣,它是一個重取樣,允許模型或演算法更好地理解存在於其中的偏差、方差和特徵。資料的取樣允許重取樣包含不同的偏向,然後將其作為一個整體進行包含。如圖 1 所示,其中每個樣本群有不同的部分,而且各不相同。接著這會影響到資料集的整體均值、標準差和其他描述性指標。反過來,它可以發展出更多魯棒的模型。

Bootstrapping 同樣適用傾向於過擬合的小資料集。事實上,我們把它推薦給了一家有關注的公司,其資料集遠稱不上「大資料」。Bootstrapping 是這一案例的一個解決方案,因為利用 Bootstrapping 的演算法可以更魯棒,並根據已選的方法論(Boosting 或 Bagging)來處理新資料集。

使用 Bootstrap 的原因是它可以測試解決方案的穩定性。使用多個樣本資料集測試多個模型可以提高魯棒性。或許一個樣本資料集的平均值比其他資料集大,或者標準差不同。這種方式可以識別出過擬合且未使用不同方差資料集進行測試的模型。

Bootstrapping 越來越普遍的原因之一是計算能力的提升。出現比之前更多次數的重排列、重取樣。Bagging 和 Boosting 都使用 Bootstrapping,下面將會具體介紹。

Bagging

Bagging 實際上指 Bootstrap Aggregator。大多數提到使用 Bagging 演算法的論文或文章都會引用 Leo Breiman,他曾經寫過一篇論文《Bagging Predictors》(1996)。

Leo 這麼描述 Bagging:

「Bagging predictor 是一種生成多個預測器版本然後生成聚合預測器的方法。」

Bagging 的作用是降低只在訓練資料上準確率較高的模型的方差——這種情況也叫作過擬合。

過擬合即函式過於擬合資料。通常原因在於實際的公式過於複雜,無法考慮每個資料點和異常值。

如何構建穩固的機器學習演算法:Boosting&Bagging

圖 2. 過擬合

容易過擬合的另一種演算法是決策樹。使用決策樹構建的模型需要非常簡單的啟發式方法。決策樹由一系列特定順序的 if-else 語句組成。因此,如果把一個資料集變更成新的資料集,則新資料集可能在底層特徵中與之前的資料集存在一些偏差或區別。該模型不可能準確。原因在於資料無法非常好地擬合資料(前向宣告)。

Bagging 使用取樣和替換資料的方法在資料中建立自己的方差來規避這個問題,同時測試多個假設(模型)。通過使用多個樣本(很可能由不同屬性的資料組成)來減少噪聲。

直到每個模型提出一個假設。這些模型使用投票法(voting)進行分類,用平均法進行迴歸。這裡「Aggregating」和「Bootstrap Aggregating」將發揮作用。每個假設具備相同的權重。這是 Bagging 和 Boosting 方法的區別之一。

如何構建穩固的機器學習演算法:Boosting&Bagging

圖 3. Bagging

本質上,所有這些模型同時執行,然後對哪個假設最準確進行投票。

這有助於降低方差,即減少過擬合。

Boosting

Boosting 指使用加權平均值使弱的學習器變強的一組演算法。與 Bagging 不同,每個模型單獨執行,最後在不偏向任何模型的前提下聚合輸出結果。Boosting 是一項「團隊工作」。每個模型決定下一個模型要關注的特徵。

Boosting 也需要 Bootstrapping。但是,這裡還有一個區別。與 bagging 不同,boosting 為每個資料樣本加權。這意味著一些樣本執行的頻率比其他樣本高。

如何構建穩固的機器學習演算法:Boosting&Bagging

圖 4. Boosting

當 Boosting 執行在模型中時,它追蹤哪些資料樣本是成功的,哪些不成功。輸出結果分類錯誤最多的資料集會被賦予更高的權重。即這些資料更加複雜,需要更多次迭代才能恰當地訓練模型。

在實際的分類階段中,Boosting 處理模型的方式也存在區別。Boosting 追蹤模型誤差率,因為更好的模型會獲得更好的權重。

這樣,當「投票」(voting)出現時,結果更好的模型更有可能最終主導輸出。

總結

Boosting 和 Bagging 能夠有效降低方差。整合方法通常優於單個模型。這就是那麼多 Kaggle 獲勝者使用整合方法的原因。

但是,它們不適合所有問題,它們各自也有缺陷。Bagging 在模型過擬合時能夠有效降低方差,但 Boosting 可能是二者中較好的選擇。Boosting 更有可能導致效能問題,但它在模型欠擬合時也能有效降低偏差。

這就需要經驗和專業知識了!第一個模型能夠成功執行可能比較容易,但是分析演算法和它選擇的所有特徵非常重要。例如,如果一個決策樹設定了特定的葉,那麼這麼設定的原因是什麼呢?如果你無法用其他資料點或圖支援它,它可能就不該實現。

這不只是在不同的資料集上嘗試 AdaBoost 或隨機森林。我們需要根據演算法的傾向和獲得的支援來決定最終使用的演算法。

相關文章