1. 程式人生 > >Stacked Regression的詳細步驟和使用註意事項

Stacked Regression的詳細步驟和使用註意事項

分類 cnblogs 解決 如何 資料 agg sting 作者 log

聲明:這篇博文是我基於一篇網絡文章翻譯的,並結合了自己應用中的一些心得,如果有侵權,請聯系本人刪除。

最近做推薦的時候,開始接觸到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 Motivation
假設四個人扔187個飛鏢。其中150個飛鏢觀察是誰扔的,扔到了哪裏(訓練數據)。剩下的作為測試數據,知道飛鏢的位置。我們的學習任務是根據飛鏢的位置,猜測是誰扔的。 技術分享

K-近鄰(基礎模型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
  1. L2-正則化L2-損失支撐向量機分類(對偶問題)
  2. L2-正則化L2-損失支撐向量機分類(原始問題)
  3. L2-正則化L1-損失支撐向量機分類(對偶問題)
  4. support vector classification by Crammer and Singer
  5. L1-正則化L2-損失支撐向量機分類
Cost 正則化常數的倒數。 參數組合的網格我們將嘗試笛卡爾乘積,也就是用5個svm的類型(types)和Cost值取(0.01,0.1, 1, 10, 100, 1000, 2000).也就是: 技術分享

同樣地,用交叉驗證和網格搜索方法,我們找到了最好的超參數是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的具體步驟是:
  1. 將訓練數據分為5份,叫做test fold
技術分享
  1. 定義一個數據集叫做train_meta,和訓練數據集有相同的原始Id和fold id,加上兩個空的列M1和M2.同樣地,生成一個測試集叫做test_meta,和測試集合有相同的原始Id,加上兩列,M1和M2.
技術分享

技術分享

  1. 對於每一個交叉驗證集
    {Fold1, Fold2, ..., Fold5}     3.1 將另外的4個CV集合合並用作訓練CV集合; 技術分享

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。 技術分享

  1. 用所有的訓練數據訓練Base模型,並對測試數據進行預測。將這些預測值保存在test_meta中。
技術分享

  1. 訓練一個新的模型,S(也就是stacking 模型),用M1和M2當作特征,當然,也可以原來數據中的其他特征也用上。
S:Logistic Regression
  1. 用stacked model S對test_meta做預測。
技術分享 這裏我們用了Base模型的預測值作為stacked模型的特征,因此stacked模型能夠知道每一個Base模型在哪些樣本上表現得好,哪些樣本上表現不好。此外,還有一點要註意,train_meta中每一個樣本的預測值都不依賴自身產生(否則就會過擬合,理論上,這裏用留一法的效果會最好。) 對於test_meta的stacked特征,我們有另外一種生成方式。用交叉驗證得到的5個Base模型分別對test_meta數據打分,最後5個得分平均得到最後的M1和M2,這樣做的好處是節省時間,因為我們不需要用所有的訓練數據訓練Base模型,但是這樣做的弊端是基礎模型在測試數據上預測的準確度要差一些。 Stacked模型的超參數調整 我們應該如何調整stacked模型的超參數呢?對於base模型,我們能夠用交叉驗證+網格搜索確定超參數。對於stacked模型,如果我們也用相同的數據切分方法進行超參數的調整,就會有問題。當然,換成別的數據切分方法也同樣有問題。那麽是什麽問題呢? 假設我們用之前的數據劃分,用{fold2, fold3, fold4, fold5}訓練staked模型S,然後在fold1上評估效果,那麽問題就來了,fold2,fold3,fold4,fold5的stacked特征都是fold1參與產生的。我們用fold1參與生成特征又在fold1上驗證,就產生了過擬合。最終可能導致stacked模型的超參數,在測試集上的效果可能很不好。 實際應用中,這個問題其實無法避免,但是我們應該知道這個問題的存在。 Stacking Model的模型選擇和特征選擇 我們如何知道用什麽模型作為stacker,除了stacked特征,應該選擇哪些原始特征用到stacked模型的訓練中呢?在作者的眼中,stacked模型和stacked特征的選擇都更像是藝術而不是科學。 Stacking實踐 原作者通常會在Kaggle機器學習競賽中用到stacking方法。在實際的Business中,stacking方法要增加許多復雜性來換取一點點性能提升。不過還好,stacking方法通常能夠獲得比單獨的模型更好的性能,而且不用考慮模型的選擇。就是計算量大了點兒。

Stacked Regression的詳細步驟和使用註意事項