機器學習_學習筆記系列(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.