訓練集,驗證集,測試集(以及為什么要使用驗證集?)(Training Set, Validation Set, Test Set)


對於訓練集,驗證集,測試集的概念,很多人都搞不清楚。網上的文章也是魚龍混雜,因此,現在來把這方面的知識梳理一遍。讓我們先來看一下模型驗證(評估)的幾種方式。

 

在機器學習中,當我們把模型訓練出來以后,該怎么對模型進行驗證呢?(也就是說怎樣知道訓練出來的模型好不好?)有以下幾種驗證方式:

 

第一種方式:把數據集全部作為訓練集,然后用訓練集訓練模型,用訓練集驗證模型(如果有多個模型需要進行選擇,那么最后選出訓練誤差最小的那個模型作為最好的模型)

這種方式顯然不可行,因此訓練集數據已經在模型擬合時使用過了,再使用相同的數據對模型進行驗證,其結果必然是過於樂觀的。如果我們對多個模型進行評估和選擇,那么我們可以發現,模型越復雜,其訓練誤差也就越小,當某個模型的訓練誤差看似很完美時,其實這個模型可能已經嚴重地過擬合了。這在《過擬合和欠擬合(Over fitting & Under fitting)》一文中已經提過。(我們把這種由訓練誤差選出來模型稱為gm-hat

 

第二種方式:把數據集隨機分為訓練集和測試集,然后用訓練集訓練模型,用測試集驗證模型(如果有多個模型需要進行選擇,那么最后選出測試誤差最小的那個模型作為最好的模型)

什么樣的模型是好的?顯然泛化誤差最小的模型最好,但是我們沒有這樣的測試集能夠測出模型的泛化誤差。因此,我們把一部分數據作為測試集,用它的誤差來模擬泛化誤差。

 

把數據分出一部分作為測試集意味着訓練集比原來小了。由學習曲線可知,使用較少的數據訓練出來的模型,其測試誤差會比較大。因此,對於多個模型的評估和選擇,合理的做法是:用訓練集訓練出各個模型后,用測試集選出其中最好的模型(我們把此模型稱為gm*-),記錄最好模型的各項設置(比如說使用哪個算法,迭代次數是幾次,學習速率是多少,特征轉換的方式是什么,正則化方式是哪種,正則化系數是多少等等),然后用整個數據集再訓練出一個新模型,作為最終的模型(我們把此模型稱為gm*),這樣得出的模型效果會更好,其測試誤差會更接近於泛化誤差。

 

下圖展示了隨着測試集的增大,各個模型 -- gm*-(紅線),gm*(藍線),gm-hat(黑實線)的期望泛化誤差和理想泛化誤差(黑虛線)的變化趨勢:

 

可以看到,gm*(藍線)的表現最好,最接近於理想的泛化誤差(黑虛線)。而隨着測試集越來越大, gm*-(紅線)的表現先是和gm*(藍線)比較接近,然后越來越不如gm*(藍線),最后甚至都不如gm-hat(黑實線)。這是因為測試集越大,用於訓練的數據就越少,此時訓練出的模型的效果肯定也就不好了。因此,在選擇測試集的大小時,其實有個兩難境地:如果要使gm*(藍線)的期望泛化誤差接近於理想泛化誤差,就需要讓測試集比較大才好,因為這樣有足夠多的數據模擬未知情況,但是這樣一來,gm*(藍線)和gm*-(紅線)的期望泛化誤差之間的差距就比較大;而要想讓gm*(藍線)和gm*-(紅線)的期望泛化誤差接近,就需要測試集比較小才好,因為這樣有足夠多的數據訓練模型,但是此時gm*(藍線)的期望泛化誤差和理想泛化誤差之間的差距較大。一般來說,人們通常將測試集的大小設置為所有數據的20%~30%。

 

很多資料都是這樣把數據分為訓練集(70%-80%)和測試集(20%-30%)。這樣做的前提是:把模型各個可能的設置分別列出來,訓練出各個不同的模型,然后用測試集選出最好的模型,接下來用全部數據按照最好模型的各項設置重新訓練出一個最終的模型。這樣做有兩個問題。第一,模型的超參數通常很多,我們不太有可能把所有可能的設置全部羅列出來,超參數通常需要根據實際情況進行調整。如果模型的測試成績不理想,那么我們需要返回,重新訓練模型。雖然測試集不用於模型的訓練,但是我們如果基於測試誤差來不斷調整模型,這樣會把測試集的信息帶入到模型中去。顯然,這樣是不可行的,因為測試集必須是我們從未見過的數據,否則得出的結果就會過於樂觀,也就會導致過擬合的發生。第二,得出的最終的模型,其泛化誤差是多少?我們還是無法評估。因為我們又把全部數據重新訓練出了這個最終的模型,因此也就沒有從未見過的數據來測試這個最終的模型了。

 

第三種方式:把數據集隨機分為訓練集,驗證集和測試集,然后用訓練集訓練模型,用驗證集驗證模型,根據情況不斷調整模型,選擇出其中最好的模型,再用訓練集和驗證集數據訓練出一個最終的模型,最后用測試集評估最終的模型

這其實已經是模型評估和模型選擇的整套流程了。在第二種方式中,我們已經把數據集分為了訓練集和測試集,現在我們需要再分出一個測試集,用於最終模型的評估。因為已經有一個測試集了,因此我們把其中一個用於模型選擇的測試集改名叫驗證集,以防止混淆。(有些資料上是先把數據集分為訓練集和測試集,然后再把訓練集分為訓練集和驗證集)

 

前幾個步驟和第二種方式類似:首先用訓練集訓練出模型,然后用驗證集驗證模型(注意:這是一個中間過程,此時最好的模型還未選定),根據情況不斷調整模型,選出其中最好的模型(驗證誤差用於指導我們選擇哪個模型),記錄最好的模型的各項設置,然后據此再用(訓練集+驗證集)數據訓練出一個新模型,作為最終的模型,最后用測試集評估最終的模型。

 

由於驗證集數據的信息會被帶入到模型中去,因此,驗證誤差通常比測試誤差要小。同時需要記住的是:測試誤差是我們得到的最終結果,即便我們對測試得分不滿意,也不應該再返回重新調整模型,因為這樣會把測試集的信息帶入到模型中去。

 

第四種方式:交叉驗證 --- 具體請見《驗證和交叉驗證(Validation & Cross Validation)》

 

第五種方式:自助法 --- 具體請見《自助法(Bootstraping)》

 

總結一下:

訓練集(Training Set):用於訓練模型。

驗證集(Validation Set):用於調整和選擇模型。

測試集(Test Set):用於評估最終的模型。

 

當我們拿到數據之后,一般來說,我們把數據分成這樣的三份:訓練集(60%),驗證集(20%),測試集(20%)。用訓練集訓練出模型,然后用驗證集驗證模型,根據情況不斷調整模型,選出其中最好的模型,記錄最好的模型的各項選擇,然后據此再用(訓練集+驗證集)數據訓練出一個新模型,作為最終的模型,最后用測試集評估最終的模型。

 


免責聲明!

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



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