stacking和blending是兩種內建分類器的相似方法
Stacking
一、stacking方法是什麼
stacking是一種分層模型內建架構。以兩層為例,第一層由多個基學習器組成,其輸入為原始訓練集,第二層的模型則是以第一層基學習器的輸出作為特征加入訓練集進行再訓練,進而得到完整的stacking模型。
二、如何構造stacking模型
以兩層stacking模型為例,要得到stacking模型,關鍵在于如何構造第二層的特征(下記為元特征,meta feature),構造元特征的原則是盡可能的避免資訊洩露,是以對原始訓練集常常采用類似于K折交叉驗證的劃分方法。
以5折劃分為例,我們将原始訓練集分為5折,分别記為fold1、fold2、fold3、fold4和fold5。此時我們使用fold2-fold5的資料來訓練基模型1,并對fold1進行預測,該預測值即作為基模型1對fold1生成的元特征;同樣地,使用fold1、fold3-fold5的資料來訓練基模型1,并對fold2進行預測,該預測值即作為基模型1對fold2生成的元特征;以此類推,得到基模型1對整個原始訓練集生成的元特征。同樣地,對其他基模型也采用相同的方法生成元特征,進而構成用于第二層模型(下記為元模型,meta model)訓練的完整元特征集。對于測試集,我們可以在每次基模型訓練好時預測,再将預測值做均值處理;也可以将基模型拟合全部的訓練集之後再對測試集進行預測。
需要注意的是,在生成第二層特征的時候,各個基模型要采用相同的Kfold,這樣得到的元特征的每一折(對應于之前的K折劃分)都将不會洩露進該折資料的目标值資訊 ,進而盡可能的降低過拟合的風險。雖然如此,實際上我們得到的元特征還是存在一定程度上的資訊洩露,比如我們在預測第二折的時候,是利用了第一折的目标值資訊用于訓練基模型的,也就是說第一折的目标值資訊雜糅在對第二折進行預測的基模型裡。但是,實踐中,這種程度的資訊洩露所造成的過拟合程度很小。
以KNN和SVM為例進行Stacking的流程如下:
假設我們有Training data(有label)和Testing data(無label),我們需要建立起模型對Testing data的label進行預測,我們利用兩個基模型KNN和SVM進行stacking,首先我們需要訓練好兩個基模型
一、KNN(Base model 1)
5-fold Cross-Validation + Grid Search确定K的大小
二、SVM(Base model 2)
5-fold Cross-Validation + Grid Search确定參數 type 和 cost
三、Stacking(Meta Ensembling)
- 将training data劃分成5個testing folds
- 為training data和testing中的每一個樣本添加空屬性M1、M2(model 1、2的輸出),記為
和train_meta
test_meta
-
對于每一個test fold:
3.1、将其他4個folds作為一個traing fold,将此training fold作為model 1的輸入,對test fold進行預測,将結果存放進train_meta的M1中,類似model 2 的結果存在M2中
3.2、将整個training data作為base model的輸入,對testing data進行預測,model 1、2的結果分别存在test_meta的M1、M2中
- 将
作為一個新模型S(也就是stacking model)的輸入,對train_meta
進行預測test_meta
三、如何對stacking模型調參
stacking模型調參包括對基模型和元模型進行調參。對于基模型,因為我們在生成元特征的時候要使用相同的K折劃分,是以我們使用交叉驗證+網格搜尋來調參時最好使用與生成元特征相同的Kfold。對于元模型的調參,使用交叉驗證+網格搜尋來調參時,為了降低過拟合的風險,我們最好也使用與元特征生成時同樣的Kfold。
【Tips】:元模型調參使用CV有Data Leakage的風險,使用{fold2, fold3, fold4, fold5}作為S的輸入,預測fold1,但是在{fold2, fold3, fold4, fold5}中的meta features(M1、M2)是基模型對fold1的預測結果。
綜上,stacking方法從一開始就得确定一個Kfold,這個Kfold将伴随對基模型的調參、生成元特征以及對元模型的調參,貫穿整個stacking流程。當然,由于我們生成基模型時未使用全部資料,我們可以使用多個不同的Kfold來生成多個stacking模型然後進行權重,這樣可以進一步提高算法的魯棒性。
另外,基模型的選擇需要考慮的是:基模型之間的相關性要盡量小,同時基模型之間的性能表現不能差距太大。
Blending
Blending與Stacking大緻相同,隻是Blending的主要差別在于訓練集不是通過K-Fold的CV政策來獲得預測值進而生成第二階段模型的特征,而是建立一個Holdout集,例如10%的訓練資料,第二階段的stacker模型就基于第一階段模型對這10%訓練資料的預測值進行拟合。說白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。
Blending的優點在于:
1.比stacking簡單(因為不用進行k次的交叉驗證來獲得stacker feature)
2.避開了一個資訊洩露問題:generlizers和stacker使用了不一樣的資料集
3.在團隊模組化過程中,不需要給隊友分享自己的随機種子
而缺點在于:
1.使用了很少的資料
2.blender可能會過拟合(其實大機率是第一點導緻的)
3.stacking使用多次的CV會比較穩健
References:
https://www.quora.com/What-are-examples-of-blending-and-stacking-in-Machine-Learning
http://blog.kaggle.com/2016/12/27/a-kagglers-guide-to-model-stacking-in-practice/
https://mlwave.com/kaggle-ensembling-guide/
https://blog.csdn.net/xiaoliuzz/article/details/79298841