1. 程式人生 > >驗證集與測試集的區別

驗證集與測試集的區別

在對機器學習演算法進行學習和實踐的時候,我們經常會遇到“驗證集”和“測試集”,通常的機器學習書籍都會告訴我們,驗證集和測試集不相交,驗證集和訓練集不相交,測試集和訓練集不相交。也就是驗證集與測試集似乎是同一級的東西,那麼我們自然而然會有一個困惑為什麼還要分測試集和驗證集呢?
其實問題的答案是:訓練集用於訓練模型引數,測試集用於估計模型對樣本的泛化誤差,驗證集用於“訓練”模型的超引數。

什麼是模型的引數
我們知道一個機器學習模型通常包括兩個部分的引數:模型引數和超引數。其中超引數是用於控制模型行為的引數,這些引數不是通過模型本身學習而來的。例如多項式迴歸模型裡面,多項式的次數,學習速率是超引數。這些超引數不能由模型本身訓練得到是因為模型會傾向於把超引數訓練的過大或者過小,從而極易導致過擬合。例如多項式迴歸模型裡面,如果讓模型本身去訓練多項式的次數,那麼模型會選擇高次多項式,因為這樣做誤差可以取到特別小,極端情況下,N個點的多項式迴歸會選擇次數N。

然而這些超引數,也會有不同的選擇,例如學習速率可以選擇0.1,0.01,1,10···那麼我們怎麼知道超引數的某個值會比另外一個好呢?一個很自然的想法是我們可以選擇不同的超引數的值,然後跑在同一個訓練集上再看最後的結果。但是這樣會有一個類似的問題:如果使用訓練集來選擇超引數,那麼超引數總是會往增加模型容量的方向發展。舉個多項式的例子:如果訓練集裡面有100個點,然後我們讓多項式的次數依次為1,10,20,100。然後讓模型跑這個訓練集,等訓練集誤差收斂後,我們再看在這個相同訓練集,選擇那個引數會取得最小的訓練誤差。。。顯然選擇次數100會是取得最小的訓練誤差···然而這顯然會過擬合。那又怎麼辦呢?方法很簡單,只要從這100個訓練樣本中取出一部分樣本,讓模型訓練的過程看不到這些樣本。然後再計算模型在這一部分樣本中的表現,即可選擇出合適的超引數。這種方式下得到的超引數最起碼會比前一種方法更合理,更不會過擬合。而這一小部分樣本,就是驗證集啦