模型驗證與模型集成(Ensemble)


作者:吳曉軍

原文:https://zhuanlan.zhihu.com/p/27424282

 模型驗證(Validation)

在Test Data的標簽未知的情況下,我們需要自己構造測試數據來驗證模型的泛化能力,因此把Train Data分割成Train Set和Valid Set兩部分,Train Set用於訓練,Valid Set用於驗證。

  • 簡單分割

 

將Train Data按一定方法分成兩份,比如隨機取其中70%的數據作為Train Set,剩下30%作為Valid Set,每次都固定地用這兩份數據分別訓練模型和驗證模型。這種做法的缺點很明顯,它沒有用到整個訓練數據,所以驗證效果會有偏差。通常只會在訓練數據很多,模型訓練速度較慢的時候使用。

  • 交叉驗證

 

交叉驗證是將整個訓練數據隨機分成K份,訓練K個模型,每次取其中的K-1份作為Train Set,留出1份作為Valid Set,因此也叫做K-fold。至於這個K,你想取多少都可以,但一般選在3~10之間。我們可以用K個模型得分的mean和std,來評判模型得好壞(mean體現模型的能力,std體現模型是否容易過擬合),並且用K-fold的驗證結果通常會比較可靠。

如果數據出現Label不均衡情況,可以使用Stratified K-fold,這樣得到的Train Set和Test Set的Label比例是大致相同。

 

 模型集成(Ensemble)

曾經聽過一句話,”Feature為主,Ensemble為后”。Feature決定了模型效果的上限,而Ensemble就是讓你更接近這個上限。Ensemble講究“好而不同”,不同是指模型的學習到的側重面不一樣。舉個直觀的例子,比如數學考試,A的函數題做的比B好,B的幾何題做的比A好,那么他們合作完成的分數通常比他們各自單獨完成的要高。

常見的Ensemble方法有Bagging、Boosting、Stacking、Blending。

 Bagging

Bagging是將多個模型(基學習器)的預測結果簡單地加權平均或者投票。Bagging的好處在於可以並行地訓練基學習器,其中Random Forest就用到了Bagging的思想。舉個通俗的例子,如下圖

 

老師出了兩道加法題,A同學和B同學答案的加權要比A和B各自回答的要精確。

Bagging通常是沒有一個明確的優化目標的,但是有一種叫Bagging Ensemble Selection的方法,它通過貪婪算法來Bagging多個模型來優化目標值。在這次比賽中,我們也使用了這種方法

 Boosting

Boosting的思想有點像知錯能改,每訓練一個基學習器,是為了彌補上一個基學習器所犯的錯誤。其中著名的算法有AdaBoost,Gradient Boost。Gradient Boost Tree就用到了這種思想。

我在1.2.3節(錯誤分析)中提到Boosting,錯誤分析->抽取特征->訓練模型->錯誤分析,這個過程就跟Boosting很相似

 Stacking

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

 

舉個更直觀的例子,還是那兩道加法題

 

這里A和B可以看作是基學習器,C、D、E都是次學習器。

  • Stage1: A和B各自寫出了答案。
  • Stage2: C和D偷看了A和B的答案,C認為A和B一樣聰明,D認為A比B聰明一點。他們各自結合了A和B的答案后,給出了自己的答案。
  • Stage3: E偷看了C和D的答案,E認為D比C聰明,隨后E也給出自己的答案作為最終答案。

 

在實現Stacking時,要注意的一點是,避免標簽泄漏(Label Leak)。在訓練次學習器時,需要上一層學習器對Train Data的測試結果作為特征。如果我們在Train Data上訓練,然后在Train Data上預測,就會造成Label Leak。為了避免Label Leak,需要對每個學習器使用K-fold,將K個模型對Valid Set的預測結果拼起來,作為下一層學習器的輸入。如下圖:

 

 

由圖可知,我們還需要對Test Data做預測。這里有兩種選擇,可以將K個模型對Test Data的預測結果求平均,也可以用所有的Train Data重新訓練一個新模型來預測Test Data。所以在實現過程中,我們最好把每個學習器對Train Data和對Test Data的測試結果都保存下來,方便訓練和預測。

對於Stacking還要注意一點,固定K-fold可以盡量避免Valid Set過擬合,也就是全局共用一份K-fold,如果是團隊合作,組員之間也是共用一份K-fold。如果想具體了解為什么需要固定K-fold,請看這里


免責聲明!

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



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