[譯] 通過整合學習提高機器學習結果
- 原文地址:Ensemble Learning to Improve Machine Learning Results
- 原文作者:Vadim Smolyakov
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:Starrier
- 校對者:haiyang-tju, TrWestdoor
整合方法的工作原理:bagging、boosting 和 stacking
整合學習可以通過組合多種模型來提高機器學習的結果。這種方法相對於單個模型,可以為結果帶來更好的效能預測。這也是整合方法在諸多久負盛名的機器學習競賽(如 NetFlix 競賽、KDD 2009 和 Kaggle)中位居第一的原因。
Statsbot 團隊為了讓你瞭解這種方法的優點,邀請了資料科學家 Vadim Smolyakov 來帶你一起深入研究三種基本的整合學習技術。
整合方法是將多個機器學習技術組合成一個預測模型的元演算法,它可以進行 decrease variance (bagging)、bias (boosting) 或者 改進預測 (stacking)。
整合學習可以分成兩組:
- 序列整合方法,是基礎學習物件按順序生成的(例如 AdaBoost)。 序列方法的基本動機是利用基礎學習物件之間的依賴性。通過加權先前錯誤標記的高權重示例,可以提高總體效能。
- 並行整合方法,是基礎學習物件並行生成的(例如 Random Forest)。 並行方法的基本動機是利用基礎學習物件之間的獨立性
大多數整合方法都使用單基學習演算法來生成同類的學習物件,即相同型別的學習物件,從而形成整合。
也有一些使用不同型別的方法,即不同型別的學習物件,會導致異構整合。為了使整合方法比它的任何一個成員更精確,基礎學習物件必須儘可能準確,儘可能多樣化。
Bagging
Bagging 表示自助匯聚(bootstrap aggregation)。降低估計方差的一種方法是將多個估計平均在一起。例如,我們可以在資料的不同子集(隨機選擇和替換)上訓練 M 個不同的樹,並計算整合。
Bagging 使用自助取樣來獲取訓練基礎學習物件的資料子集。為了聚合基礎學習物件的輸出,bagging 使用分類投票
我們可以在鳶尾花資料集分類的背景下研究 bagging 問題。我們可以選擇兩個基礎估計器:一個決策樹和一個 k-NN 分類器。圖一顯示了基礎估計器的學習決策樹邊界以及應用鳶尾花資料集的 bagging 整合。
Accuracy: 0.63 (+/- 0.02) [Decision Tree] Accuracy: 0.70 (+/- 0.02) [K-NN] Accuracy: 0.64 (+/- 0.01) [Bagging Tree] Accuracy: 0.59 (+/- 0.07) [Bagging K-NN]
決策樹顯示了 axes 的平行邊界,當 k=1 時的最近臨界點與資料點非常靠近。Bagging 整合使用 10 種基估計器來進行訓練,訓練資料的子取樣為 0.8,特徵的子取樣為 0.8。
相較於 K-NN bagging 整合,決策樹 bagging 整合具有更高的精確度。K-NN 對訓練樣本的擾動不太敏感,因此被稱為穩定的學習物件。
將穩定的學習物件組合在一起並不都是有利的,因為有時這樣的整合無利於提高泛化效能。
圖中還顯示了在測試時,隨著整合度的提高精確度也會隨之提高。基於交叉驗證的結果,我們可以看到精確度的提升大約會在有 10 個基估計器時趨於穩定。因此,新增超過 10 個基估計器只會增加計算複雜度,而不會提高鳶尾花資料集的準確度。
我們還可以看到 bagging 樹整合的學習曲線。注意,訓練資料的平均誤差是 0.3,測試資料的誤差曲線是 U 型。訓練和測試誤差之間的最小差距發生在訓練集大小的 80% 左右。
一種常用的整合演算法是隨機森林。
在隨機森林中,整合的每一棵樹都是從訓練集中用替換(例如,引導樣本)繪製樣本構建的。此外,不使用所有的特性,而是選擇一個隨機子集的特徵,進一步隨機化樹。
結果,森林的偏差略有增加,但由於相關性較弱的樹木被平均化,從而導致方差減小,因此形成了一個整體上更好的模型。
在一個非常隨機的樹中,演算法的隨機性更進一步:分裂閥值是隨機的。對於每個候選特徵,閾值都是隨機抽取的,而不是尋找最具鑑別性的閾值,並選擇這些隨機生成的閥值中的最佳閥值作為分割規則。這通常會使模型的方差減少得多一點,但代價是偏差增加得多一點。
Boosting
Boosting 是指能夠將弱學習物件轉化為強學習物件的一系列演算法。Boosting 的主要原理是對一系列僅略好於隨機預測的弱學習模型進行擬合,例如小決策樹 —— 對資料進行加權處理。對前幾輪錯誤分類的例子給予更多的重視。
然後,通過加權多數投票(分類)或加權和(迴歸)組合預測,生成最終預測。Boosting 和 committee(如 bagging)的主要區別在於,基礎學習物件是按加權版本的資料順序進行訓練的。
下述演算法描述了使用最廣泛的,稱為 AdaBoost 的 boosting 演算法,它代表著自適應增強。
我們看到,第一個基分類器 y1(x) 是使用相等的加權係數來訓練的,這些係數是相等的。在隨後的增強輪次中,對於被錯誤分類的資料點增加加權係數,對於正確分類的資料點則減小加權係數。
數量 epsilon 表示每個基分類器的加權錯誤率。因此,加權係數 α 賦予更準確的分類器更大的權重。
AdaBoost 演算法如上圖所示。每個基學習器由一棵深度為 1 的決策樹組成,從而根據一個特徵閥值對資料進行分類(分為兩個區域),該區域由一個與其中一個軸平行的線性決策面隔開。該圖還顯示了測試精度如何隨著整合的大小和訓練測試資料的學習曲線的提高而提高。
梯度樹 Boosting 是 bootsting 對任意可微損失函式的推廣。它既可用於迴歸問題,也可用於分類問題。梯度 Boosting 以順序的方式建立模型。
選擇決策樹 hm(x) 在每個階段使用給定當前的 Fm-1(x) 來最小化損失函式 L。
迴歸演算法和分類演算法在所使用的損失函式型別上有所區別。
Stacking
Stacking 是一種通過元分類器或元迴歸器來將多種分類或迴歸模型結合在一起的整合學習技術。基於一套完整的訓練集對該基礎模型進行訓練,然後將該元模型作為特徵所述基礎級模型的輸出進行訓練。
基礎級通常由不同的學習演算法組成,因此 stacking 整合往往是異構的。下面的演算法總結了 stacking。
上圖的右上子圖顯示了以下準確度:
Accuracy: 0.91 (+/- 0.01) [KNN] Accuracy: 0.91 (+/- 0.06) [隨機森林] Accuracy: 0.92 (+/- 0.03) [Naive Bayes] Accuracy: 0.95 (+/- 0.03) [Stacking Classifier]
Stacking 整合如上所示。它由 K-NN、隨機森林和樸素貝葉斯基分類器組成,其預測用 Logistic 迴歸作為元分類器。我們可以看到 stacking 分類器實現了決策邊界的混合。該圖還表明,stacking 比單個分類器具有更高的精度,並且是基於學習曲線,沒有出現過擬合的跡象。
Stacking 是贏取 Kaggle 資料科學競賽的常用技術。例如,Otto 組產品分類挑戰的第一名是由 30 個模型組成的 stacking 整合,它的輸出被作為三種元分類器的特徵:XGBoost、神經網路和 Adaboost。更多細節可以在此檢視。
程式碼
本文生成所有影象的程式碼都可以在,你可以在 ipython notebook 上檢視。
總結
除了本文所研究的方法,在深度學習中使用多樣化訓練和精確的分類器來整合也是非常普遍的方式。多樣化也可以通過變化的架構、設定超引數以及使用不同的訓練技術來實現。
整合方法在具有挑戰性的資料集上非常成功地達到了創紀錄的效能,並在 Kaggle 資料科學競賽中名列前茅。
推薦閱讀
- Zhi-Hua Zhou,“整合方法:基礎與演算法”,CRC Press, 2012
- L. Kuncheva,“組合模式分類器:方法與演算法”,Wiley, 2004
- Kaggle 整合指南
- Scikit 整合學習指南
- S. Rachka, MLxtend library
- Kaggle Winning Ensemble
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。