機器學習_學習筆記系列(44):堆疊分類(Stacking Classifier)

OK到目前為止我們差不多已經把Ensemble Learning中重要的演算法,Averaging、Voting、Bagging、Boosting介紹完了,而最後我們就要來講比較特別的 — Stacking。

Stacking

Stacking的概念其實我們之前有稍微提過一點。其是先將數據丟到各個不一樣的Base Learner,然後我們再Train一個Meta Learner,學習如何把這些不同的Base Learner合併起來。

而提出Stacking概念的為David H. Wolpert,其所發的論文[1]為

Stacked Generalization

另外關於David H. Wolpert這裡一定要特別講一下他的學術貢獻,他本身是物理背景,但是在數學界和電腦科學界有很多著名的發表,其中這個相信大家一定有聽過,就是賽局理論中的:「No Free Lunch Theorem」,不過這裡我們就不著墨太多。

而對於Stacking的演算法,由於Stacked Generalization這篇寫的不是那麼直觀,文字定義的部分寫的比較嚴謹,所以這裡我們引用另一本書[2]裡面的演算法:

這裡我們設我們的訓練資料D有m筆,輸入資料為x,輸出資料為y,我們在Step 1的時候。我們會用我們的資料集D訓練出T個Base Learner,而這裡Base Learner可以是SVM、Logistic Regression、Random Forest等等都可以。

之後到了Step 2,我們會用我們訓練出的T個Base Learner各自產生自己在訓練資料的預測值h(x),所以在這裡我們會生成一組一樣有m筆的新資料集,輸入資料為x’,總共有T個特徵,輸出資料為y。

最後我們會用這個新資料集再訓練一個Meta Learner 來學習怎麼更好的結合各個Base Learner,而最終即可得到我們的Strong Learner H(x)。

Stacking Classifier

接下來就是實際以Python來實現我們的演算法,這裡我們選用的Classifier有Perceptron、Kernel Logistic Regression、Support Vector Machine、Random Forest、Extra Tree、ABDT。

對於6個Base Learner的效能:

接著我們以SVM作為Meta Learner訓練出Stacking Classifier

我們可以很明顯的看到,不管在訓練集還是測試集錯誤率,都表現得相當不錯,但缺點就是要先訓練那麼多Classifier,最後還要訓練一個meta learner非常耗時,不過如果今天我們講究的是錯誤率上,Stacking Classifier會是一個非常好的選擇。

Python Sample Code:

Github:

Reference:

[1] Wolpert, David H. “Stacked generalization.” Neural networks 5.2 (1992): 241–259.

[2] Tang, J., S. Alelyani, and H. Liu. “Data Classification: Algorithms and Applications.” Data Mining and Knowledge Discovery Series, CRC Press (2015): pp. 498–500.

--

--

劉智皓 (Chih-Hao Liu)

熱愛AI Model/Research、5G 3GPP/ETSI/O-RAN Spec、Linux Programming,是一個什麼都想學的工作狂。喜歡popping、旅遊和吃壽司~ 🤗