Kaggle機器學習之模型集成(stacking)


Stacking是用新的模型(次學習器)去學習怎么組合那些基學習器,它的思想源自於Stacked Generalization這篇論文。如果把Bagging看作是多個基分類器的線性組合,那么Stacking就是多個基分類器的非線性組合。Stacking可以很靈活,它可以將學習器一層一層地堆砌起來。

 

根據上圖分析一下stacking具體步驟:

  1)TrainingData進行5-fold分割,正好生成5個model,每個model預測訓練數據的1/5部分,最后合起來正好是一個完整的訓練集Predictions,行數與TrainingData一致。

  2)TestData數據,model1-model5每次都對TestData進行預測,形成5份完整的Predict(綠色部分),最后對這個5個Predict取平均值,得到測試集Predictions。

  3)上面的1)與2)步驟只是用了一種算法,如果用三種算法,就是三份“訓練集Predictions與測試集Predictions”,可以認為就是形成了三列新的特征,訓練集Predictions與測試集Predictions各三列。

  4)3列訓練集Predictions+TrainingData的y值,就形成了新的訓練樣本數據;測試集Predictions的三列就是新的測試數據。

  5)利用meta model(模型上的模型),其實就是再找一種算法對上述新數據進行建模預測,預測出來的數據就是提交的最終數據

 

備注:本例中第3)步中只說了三種算法形成三份訓練集Predictions作為第二層的特征,其實三種特征有點少,容易overfitting,盡量多用一些算法,每種算法也可以根據hyperopt的搜索參數對應不同的模型,這樣就會有很多模型產生,也就是會形成多份“訓練集Predictions”以及多份“測試集Predictions”,這樣在第5)建立的模型及預測的結果相對會好一些。

 

kaggle選手stacking舉例:

 

如果你沒有idea了的話,就模型融合吧!模型融合是能夠快速提高比賽成績的捷徑,現在的比賽幾乎沒有人不用到這個技巧,通常獲勝者會對很多很多模型進行融合,並且會選擇不同的模型融合的方式。這里有一篇非常好的模型融合解析博文,相信每個看過它的人都會對模型融合有一個清楚的了解

 

本次比賽中我使用了兩種模型融合方式,一種是Averaging,一種是Stacking。

 

先來說說Stacking,因為這場比賽一名貢獻比較大的選手分享了一個叫StackNet的庫,作為新手我就直接用了。首先我用我的xgboost cv集交叉預測出結果作為feature的一部分放到train data中,再對test data進行預測的結果作為feature的一部分放到test data中,再在第二層上選擇了Logistic Classifer,GradientBoostingClassifer,AdaBoostClassifer,NNSoft-maxClassfier,RandomForestClassifer等進行交叉預測,第三層選取了一個randomForest作為最后的結果訓練和預測。Stacking主要增多了模型的diversity,使我的成績上升了至少0.003的量級。

 

然后是Averaging,之前提到過Stacking需要交叉預測,我就選取了10組隨機種子分別對訓練集進行10-kfold交叉預測取平均,以及每個flod訓練預測的時候我都對我的xgboost選取5個隨機種子取平均。也就是說,在第一層Stacking的CV集交叉預測時我總共訓練了500個模型進行平均。分數的提升大約在0.002左右。

 

直到比賽結束看了排名靠前的選手的模型融合后,才發現自己對於模型融合只是做了一點微小的工作,提升空間還非常大。詳情可以看FE部分分享的solution鏈接。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM