Stacked Regression的詳細步驟和使用註意事項
聲明:這篇博文是我基於一篇網絡文章翻譯的,並結合了自己應用中的一些心得,如果有侵權,請聯系本人刪除。
最近做推薦的時候,開始接觸到Stacking方法,在周誌華老師的西瓜書中,Stacking方法是在Bagging,Bosting方法後的模型集成方法,和投票法,簡單平均法,加權平均法等方法在同一個討論框架中。在網上查資料,也有學者認為Stacking方法是和Bagging,Bosting方法在同一個討論框架中,我個人更加贊成周誌華老師的論斷,因為Stacking必須在模型差異較大,最好是不同模型,各有側重的情況下,可能能夠得到更好的集成效果,而Bagging和Bosting通常都是用的同一類模型,只是在訓練樣本上有所不同。
關於Stacking的學習資料有很多,下面羅列我找到的一些資料:
1. 首先要看的是Breiman的stacked regression,這是Stacking方法的提出論文;
2. Alexander K. Seewald等對stacked regression進行了改進,《How to Make Stacking Better and Faster While Also Taking Care of an Unknown Weakness》;
3. 如果對weka比較熟悉,Weka中實現了Stacking和StackingC,但是Weka默認的metaClassifier是ZeroR,不修改的話肯定試不出效果,要改成Linear Regression模型,而且要用Ridge regression選項,將Ridge的參數保持默認的值(1.0e-8)就可以了。
下面是我根據一篇博文翻譯而來,這篇文章對Stacking方法的具體實現進行了詳細闡述,還有代碼實現,感謝原作者提供的很好的學習資料,原文地址:
http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/
Introduction Stacking(又叫做meta ensembling) 是利用多個模型的輸出集成起來產生新模型的一種模型集成技術。由於集成後模型的平滑特性,通常集成後的模型能夠在性能上優於任何一個用於集成的Base模型。並且集成的模型側重表現好的模型,不信任(discredit)表現不好的模型。因此,stacking方法對於差別很大的基礎模型,集成的有效性更佳。作者在這裏提供一個簡單的例子,演示stacking在具體實現時的方法。這篇文章的代碼和數據可以參考網址: https://github.com/ben519/MLPB MotivationK-近鄰(基礎模型1)
首先我們用K-近鄰模型嘗試解決這個分類問題。為了選出最好的K值,我們用了5-折交叉驗證和網格搜索方法檢驗K=(1,2,。。。。30).偽代碼如下: 1.將訓練數據等分為5份。這些就是測試數據集(test folds). 2.For K=1,2,...,10 1) 對每一個測試集(test fold) a. 合並另外四個fold生成訓練集合; b.用當前的K值,在當前的訓練集合上訓練一個K-近鄰模型; c.對測試集進行預測,並評估預測結果的正確率。 2)計算上述5個不同測試集合的平均正確率。 3.將交叉驗證得到的最好平均正確率的K值保存起來。 在我們的數據集上發現K=1能夠獲得最好的交叉驗證準確率(平均正確率67%)。用K=1,我們在所有的訓練數據上訓練一個模型然後對測試數據進行預測。 最終我們得到了分類準確率70%的結果。 支撐向量機(基礎模型2) 現在我們嘗試用支撐向量機來解決預測問題。此外,我們加入了一維新的特征——DistFromCenter——用於衡量點到飛盤中心的距離,從而幫助數據能夠線性可分。 用R語言的LiblinearR包,我們有兩個超參數需要調試: type- L2-正則化L2-損失支撐向量機分類(對偶問題)
- L2-正則化L2-損失支撐向量機分類(原始問題)
- L2-正則化L1-損失支撐向量機分類(對偶問題)
- support vector classification by Crammer and Singer
- L1-正則化L2-損失支撐向量機分類
同樣地,用交叉驗證和網格搜索方法,我們找到了最好的超參數是type=4以及cost=100.又一次,我們用這些參數在所有訓練數據上訓練模型,並在
測試數據上做測試。交叉驗證的準確率為61%,測試數據集上78%的準確率。 模型疊加(Meta Ensembling, 元集成) 讓我們來看一下每個模型對問題給出的分類邊界,這個分類問題中一共有四個類別:Bob, Sue, Mark和Kate。正如我們所料,SVM將Bob和Sue之間的投擲點分得不錯,但是把Kate和Mark之間的投擲點分得很差。當然考察KNN能夠得到類似的結論,KNN將Kate和Mark分得很好,但是將Bob和Sue的投擲點分得很差。也就是說,模型疊加有可能取得更好的效果。這裏的啟示:我們做Stacking之前也應該評估一下模型之間的差異性,如果是差異很大的模型(不同的模型各有所長),Stacking就能夠取得很大的效果。 否則,效果提升可能就會很小。 (具體做法是畫一個圖:橫軸是列表的位置,從1......n,表示樣本根據得分排序後,列表總共的序。縱軸是docID,且只畫label大於0的樣本。一個用火柴棍,一個用點。 如果兩個模型的結果上,棍的頂點和點重合的很多,就說明模型的差異不大,A模型排得好的,B模型也排得好,只是整體性能有差異,那麽就選最好的模型就可以了。 如果不是,那麽Stacking就值得做。) 以上述分類問題為例,Stacking的具體步驟是:
- 將訓練數據分為5份,叫做test fold
- 定義一個數據集叫做train_meta,和訓練數據集有相同的原始Id和fold id,加上兩個空的列M1和M2.同樣地,生成一個測試集叫做test_meta,和測試集合有相同的原始Id,加上兩列,M1和M2.
- 對於每一個交叉驗證集
3.2 對於每一個Base模型
M1: K近鄰模型(K=1) M2:SVM(type=4, cost=1000) 3.2.1 用training fold訓練Base模型,並對test fold進行預測。將這些預測值保存在train_meta中用作stacking model的feature。
- 用所有的訓練數據訓練Base模型,並對測試數據進行預測。將這些預測值保存在test_meta中。
- 訓練一個新的模型,S(也就是stacking 模型),用M1和M2當作特征,當然,也可以原來數據中的其他特征也用上。
- 用stacked model S對test_meta做預測。
Stacked Regression的詳細步驟和使用註意事項