1. 程式人生 > >模型融合Stacking詳解/Stacking與Blending的區別

模型融合Stacking詳解/Stacking與Blending的區別

stacking的過程有一張圖非常經典,如下:

雖然他很直觀,但是沒有語言描述確實很難搞懂。

上半部分是用一個基礎模型進行5折交叉驗證,如:用XGBoost作為基礎模型Model1,5折交叉驗證就是先拿出四折作為training data,另外一折作為testing data。注意:在stacking中此部分資料會用到整個traing set。如:假設我們整個training set包含10000行資料,testing set包含2500行資料,那麼每一次交叉驗證其實就是對training set進行劃分,在每一次的交叉驗證中training data將會是8000行,testing data是2000行。

每一次的交叉驗證包含兩個過程,1. 基於training data訓練模型;2. 基於training data訓練生成的模型對testing data進行預測。在整個第一次的交叉驗證完成之後我們將會得到關於當前testing data的預測值,這將會是一個一維2000行的資料,記為a1。注意!在這部分操作完成後,我們還要對資料集原來的整個testing set進行預測,這個過程會生成2500個預測值,這部分預測值將會作為下一層模型testing data的一部分,記為b1。因為我們進行的是5折交叉驗證,所以以上提及的過程將會進行五次,最終會生成針對testing set資料預測的5列2000行的資料a1,a2,a3,a4,a5,對testing set的預測會是5列2500行資料b1,b2,b3,b4,b5。

在完成對Model1的整個步驟之後,我們可以發現a1,a2,a3,a4,a5其實就是對原來整個training set的預測值,將他們拼湊起來,會形成一個10000行一列的矩陣,記為A1。而對於b1,b2,b3,b4,b5這部分資料,我們將各部分相加取平均值,得到一個2500行一列的矩陣,記為B1。

以上就是stacking中一個模型的完整流程,stacking中同一層通常包含多個模型,假設還有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,對於這四個模型,我們可以重複以上的步驟,在整個流程結束之後,我們可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩陣。

在此之後,我們把A1,A2,A3,A4,A5並列合併得到一個10000行五列的矩陣作為training data,B1,B2,B3,B4,B5並列合併得到一個2500行五列的矩陣作為testing data。讓下一層的模型,基於他們進一步訓練。

以上即為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會比較穩健