驗證和交叉驗證(Validation & Cross Validation)


之前在《訓練集,驗證集,測試集(以及為什么要使用驗證集?)(Training Set, Validation Set, Test Set)》一文中已經提過對模型進行驗證(評估)的幾種方式。下面來回顧一下什么是模型驗證的正確方式,並詳細說說交叉驗證的方法。

 

驗證(Validation):把數據集隨機分成訓練集,驗證集,測試集(互斥)。用訓練集訓練出模型,然后用驗證集驗證模型,根據情況不斷調整模型,選出其中最好的模型,記錄最好的模型的各項設置,然后據此再用(訓練集+驗證集)數據訓練出一個新模型,作為最終的模型,最后用測試集評估最終的模型。

(注:這是一個完整的模型評估和模型選擇過程。如果僅對單個模型進行評估,只需要前面兩個步驟:用訓練集訓練出模型,然后用驗證集驗證模型。)

 

需要注意的是:有時我們拿到的數據是按類別排序好的,此時我們千萬不能簡單地把前n項作為訓練集,后m項作為驗證集,而是要把數據集重新洗牌,然后再隨機抽取(抽取后不放回)。此外,需要盡量使得訓練集和驗證集的數據分布一致。比如說在分類任務中,訓練集和驗證集應保持相似的類別比例。這需要通過特定的采樣方法來達到這一結果,這種采樣方法稱為分層采樣(Stratified Sampling),簡單來說就是如果訓練集中有60%的正例,那么驗證集中也需要有差不多60%的正例。分層采樣也可以和交叉驗證結合使用。

 

有些資料上把驗證也算作交叉驗證的一種方式,稱為留出法(Holdout Validation),但在我的概念中它不應該算作交叉驗證,因為數據並沒有被交叉使用(既用作訓練,又用作驗證)。但是多次驗證(多次隨機划分訓練集和驗證集)然后取平均值則是一種交叉驗證方法,稱為蒙特卡洛交叉驗證,下面會詳細說。

 


 

下面來說說什么是交叉驗證:

交叉驗證(Cross Validation)也是一種模型驗證技術。簡單來說就是重復使用數據。除去測試集,把剩余數據進行划分,組合成多組不同的訓練集和驗證集,某次在訓練集中出現的樣本下次可能成為驗證集中的樣本,這就是所謂的“交叉”。最后用各次驗證誤差的平均值作為模型最終的驗證誤差。

 

為什么要用交叉驗證?

大家知道,之前我們說的留出法(holdout)需要從數據集中抽出一部分作為驗證集。如果驗證集較大,那么訓練集就會變得很小,如果數據集本身就不大的話,顯然這樣訓練出來的模型就不好。如果驗證集很小,那么此驗證誤差就不能很好地反映出泛化誤差。此外,在不同的划分方式下,訓練出的不同模型的驗證誤差波動也很大(方差大)。到底以哪次驗證誤差為准?誰都不知道。但是如果將這些不同划分方式下訓練出來的模型的驗證過程重復多次得到的平均誤差可能就是對泛化誤差的一個很好的近似。

 

交叉驗證的幾種方法:

1. 留一法(Leave One Out Cross Validation,LOOCV)

假設數據集一共有m個樣本,依次從數據集中選出1個樣本作為驗證集,其余m-1個樣本作為訓練集,這樣進行m次單獨的模型訓練和驗證,最后將m次驗證結果取平均值,作為此模型的驗證誤差。

(注:這里說的數據集都是指已經把測試集划分出去的數據集,下同)

 

留一法的優點是結果近似無偏,這是因為幾乎所有的樣本都用於模型的擬合。缺點是計算量大。假如m=1000,那么就需要訓練1000個模型,計算1000次驗證誤差。因此,當數據集很大時,計算量是巨大的,很耗費時間。除非數據特別少,一般在實際運用中我們不太用留一法。

 

2. K折交叉驗證(K-Fold Cross Validation)

把數據集分成K份,每個子集互不相交且大小相同,依次從K份中選出1份作為驗證集,其余K-1份作為訓練集,這樣進行K次單獨的模型訓練和驗證,最后將K次驗證結果取平均值,作為此模型的驗證誤差。當K=m時,就變為留一法。可見留一法是K折交叉驗證的特例。

 

根據經驗,K一般取10。(在各種真實數據集上進行實驗發現,10折交叉驗證在偏差和方差之間取得了最佳的平衡。)

 

 

3. 多次K折交叉驗證(Repeated K-Fold Cross Validation)

每次用不同的划分方式划分數據集,每次划分完后的其他步驟和K折交叉驗證一樣。例如:10 次 10 折交叉驗證,即每次進行10次模型訓練和驗證,這樣一共做10次,也就是總共做100次模型訓練和驗證,最后將結果平均。這樣做的目的是讓結果更精確一些。(研究發現,重復K折交叉驗證可以提高模型評估的精確度,同時保持較小的偏差。)

 

4. 蒙特卡洛交叉驗證(Monte Carlo Cross Validation)

即將留出法(holdout)進行多次。每次將數據集隨機划分為訓練集和驗證集,這樣進行多次單獨的模型訓練和驗證,最后將這些驗證結果取平均值,作為此模型的驗證誤差。與單次驗證(holdout)相比,這種方法可以更好地衡量模型的性能。與K折交叉驗證相比,這種方法能夠更好地控制模型訓練和驗證的次數,以及訓練集和驗證集的比例。缺點是有些觀測值可能從未被選入驗證子樣本,而有些觀測值可能不止一次被選中。(偏差大,方差小)

 

總結:在數據較少的情況下,使用K折交叉驗證來對模型進行評估是一個不錯的選擇。如果數據特別少,那么可以考慮用留一法。當數據較多時,使用留出法則非常合適。如果我們需要更精確一些的結果,則可以使用蒙特卡洛交叉驗證。

 

此外,需要特別注意的是:如果我們要對數據進行歸一化處理或進行特征選擇,應該在交叉驗證的循環過程中執行這些操作,而不是在划分數據之前就將這些步驟應用到整個數據集。

 


 

上面說的是對單個模型進行的交叉驗證。如果要在多個不同設置的模型中進行選擇,那么步驟和驗證類似:首先將數據集划分為訓練集和測試集,然后用交叉驗證方法划分訓練集(划分為訓練集和驗證集),訓練出不同模型后,按驗證集誤差選出其中最好的模型,記錄最好模型的各項設置,然后據此再用(訓練集+驗證集)數據訓練出一個新模型,作為最終的模型,最后用測試集評估最終的模型。

 

可以看出,在上述模型評估和模型選擇過程中,除了對模型進行評估之外,驗證和交叉驗證還有另外一個作用,就是對超參數進行優化。之前我們所說的根據情況不斷調整模型就是其中一種超參數優化方式,叫做試錯。另外一種超參數優化方式是:列出各種不同超參數設置的算法;使用驗證或交叉驗證方法在訓練數據上訓練出這些不同的模型,然后對這些模型在驗證集上的性能進行評估;之后選擇其中最好的模型對應的超參數設置。這種超參數優化方式稱為網格搜索。當然還有其他的超參數優化方式,請見:超參數優化方法(Hyperparameter Tuning)---試錯(Babysitting),網格搜索(Grid Search),隨機搜索(Random Search),貝葉斯優化(Bayesian Optimization)

 

對於超參數優化,推薦用10折交叉驗證。

 


免責聲明!

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



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