一、前言
訓練集、驗證集和測試集這三個名詞在機器學習領域極其常見,但很多人並不是特別清楚,尤其是后兩個經常被人混用。
在有監督(supervise)的機器學習中,數據集常被分成2~3個,即:訓練集(train set),驗證集(validation set),測試集(test set)。
二、訓練集、驗證集、測試集
如果給定的樣本數據充足,我們通常使用均勻隨機抽樣的方式將數據集划分成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次准確率的均值。留下准確率最高的模型,即該模型的超參數是什么樣的最終模型的超參數就是這個樣的。
好像Keras就是用的交叉驗證或者固定超參數(知乎鏈接)
參考鏈接:
1、https://blog.csdn.net/cczx139/article/details/80266101
2、https://blog.csdn.net/jmh1996/article/details/79838917?tdsourcetag=s_pctim_aiomsg