1. 程式人生 > >交叉驗證與訓練集、驗證集、測試集

交叉驗證與訓練集、驗證集、測試集

訓練集、驗證集、測試集

如果給定的樣本資料充足,我們通常使用均勻隨機抽樣的方式將資料集劃分成3個部分——訓練集、驗證集和測試集,這三個集合不能有交集,常見的比例是8:1:1。需要注意的是,通常都會給定訓練集和測試集,而不會給驗證集。這時候驗證集該從哪裡得到呢?一般的做法是,從訓練集中均勻隨機抽樣一部分樣本作為驗證集。

訓練集

訓練集用來訓練模型,即確定模型的權重和偏置這些引數,通常我們稱這些引數為學習引數。

驗證集

而驗證集用於模型的選擇,更具體地來說,驗證集並不參與學習引數的確定,也就是驗證集並沒有參與梯度下降的過程。驗證集只是為了選擇超引數,比如網路層數、網路節點數、迭代次數、學習率這些都叫超引數。比如在k-NN演算法中,k值就是一個超引數。所以可以使用驗證集來求出誤差率最小的k。

測試集

測試集只使用一次,即在訓練完成後評價最終的模型時使用。它既不參與學習引數過程,也不引數超引數選擇過程,而僅僅使用於模型的評價。
值得注意的是,千萬不能在訓練過程中使用測試集,而後再用相同的測試集去測試模型。這樣做其實是一個cheat,使得模型測試時準確率很高。

交叉驗證

之所以出現交叉驗證,主要是因為訓練集較小。無法直接像前面那樣只分出訓練集,驗證集,測試就可以了(簡單交叉驗證)。
需要說明的是,在實際情況下,人們不是很喜歡用交叉驗證,主要是因為它會耗費較多的計算資源。一般直接把訓練集按照50%-90%的比例分成訓練集和驗證集。但這也是根據具體情況來定的:如果超引數數量多,你可能就想用更大的驗證集,而驗證集的數量不夠,那麼最好還是用交叉驗證吧。至於分成幾份比較好,一般都是分成3、5和10份。

交叉驗證的實現

首先我們給出下面的圖
這裡寫圖片描述
圖上面的部分表示我們擁有的資料,而後我們對資料進行了再次分割,主要是對訓練集,假設將訓練集分成5份(該數目被稱為折數,5-fold交叉驗證),每次都用其中4份來訓練模型,粉紅色的那份用來驗證4份訓練出來的模型的準確率,記下準確率。然後在這5份中取另外4份做訓練集,1份做驗證集,再次得到一個模型的準確率。直到所有5份都做過1次驗證集,也即驗證集名額迴圈了一圈,交叉驗證的過程就結束。算得這5次準確率的均值。留下準確率最高的模型,即該模型的超引數是什麼樣的最終模型的超引數就是這個樣的。