Stacking
經典Stacking模型是指將多種分類器組合在一起來取得更好表現的一種集成學習模型。一般情況下,Stacking模型分為兩層。第一層中我們訓練多個不同的模型,然后再以第一層訓練的各個模型的輸出作為輸入來訓練第二層的模型,以得到一個最終的輸出。為了更加詳細的闡述stacking模型的訓練和預測過程,我們用下面的圖作為示例。
?
首先,我們從stacking模型的訓練開始闡述。在上圖中我們可以看到,該模型的第一層有五個分類模型,第二層有一個分類模型。在第一層中,對于不同的分類模型,我們分別將訓練數據分為 5 份,接下來迭代5次。每次迭代時,將 4 份數據作為訓練集對每個分類模型進行訓練,然后剩下一份數據在訓練好的分類模型上進行預測并且保留結果。當5次迭代都完成以后,我們就獲得了一個結果矩陣。該矩陣是一個N*1的矩陣,N是訓練集的樣本數。當5個模型都進行完上述操作后,我們就可以得到一個N*5的結果矩陣。然后將該矩陣導入到第二層的模型6中進行訓練,此時全部模型訓練完畢。接下來是stacking模型的預測過程。
接下來我們開始闡述該模型的預測過程。在第一層中,對于不同分類模型,我們還是使用在訓練時分成的5份訓練數據進行五次迭代。每次迭代時,我們利用訓練后的分類模型對預測集進行預測并保留下來。當5次迭代都完成以后,我們可以得到一個M*5的矩陣,M是預測集的樣本數。 我們將這個矩陣按列取平均,縮減成M*1的矩陣。當5個模型都進行完上述操作后,我們就可以得到一個M*5的結果矩陣。然后將該矩陣導入到第二層中訓練好的模型6進行預測,就可以得到最終的預測結果。
在介紹完經典stacking模型的訓練及預測過程后,接下來闡述我們自己的stacking模型構建和改進。
?
在預測過程中,流程和訓練過程相似,只是改成了用預測集在訓練好的分類模型上進行預測。我們注意到,在Stacking模型中,由于在第一層的預測過程也需要使用第一層時的數據劃分,所以一般Stacking模型的運行順序是:
1.?第一層訓練
2.?第一層預測
3.?第二層訓練
4.?第二層預測
至此,我們改進后的stacking模型介紹完畢。
下面談一下自己使用過程中的感受吧。
1.?在sklearn中也是有集成模型的。但是他只有boosting和bagging的集成模型代碼。可能還是因為stacking模型的靈活性太高了。
2.?我們在第一層的模型選擇上,主要是考慮到了速度問題,所以選取的都是一些線性分類器和速度比較快的線性核svm等。第二層我們使用的是rbf核SVM。但是在第二層的特征數由于加入了詞向量特征而變大后,第二層的訓練預測時間變得很長。所以SVM好,但是使用需謹慎。
3.?對于xgboost模型,我們在和svm比較后,發(fā)現比不過svm分類器。同時xgboost的調參也是一個蠻長的貪心過程。所以我們沒有使用xgboost。但是在答辯中,前幾名的大神在集成模型上幾乎都用到了xgboost。這也說明xgboost的效果還是非常好的。
4.?stacking模型理論上可以擴大到無數層。但是在答辯過程中,發(fā)現大家都是只使用了兩層,同時我們也實驗了搭出三層的stacking,效果也不如兩層的。
5.?在一開始的時候,我們只在第一層中放入了四個分類器,但是受到了一些博客的影響,我們開始嘗試加入更多的分類器。第一種是不同類型的分類器,但是更多的是同類型,但是不同參數下的分類器。我們發(fā)現,分類器越多時,最終效果更好。但是隨著分類器的增多,效果提升的越來越少。
?
總結