1. 程式人生 > >tensorflow:訓練集、測試集、驗證集

tensorflow:訓練集、測試集、驗證集

訓練集(train)、驗證集(validation)和測試集(test)的意義

有監督的機器學習中,一般需要將樣本分成獨立的三部分訓練集(train set),驗證集(validation set)和測試集(test set)。其中訓練集用來估計模型,驗證集用來確定網路結構或者控制模型複雜程度的引數,而測試集則檢驗最終選擇最優的模型的效能如何。

訓練集(train)、驗證集(validation)和測試集(test),這三個集合的區分可能會讓人糊塗,特別是,有些讀者搞不清楚驗證集和測試集有什麼區別。

Training set: A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier. 

Validation set: A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network. 

Test set: A set of examples used only to assess the performance [generalization] of a fully specified classifier. 

訓練集:學習樣本資料集,通過匹配一些引數來建立一個分類器。建立一種分類的方式,主要是用來訓練模型的。

驗證集:對學習出來的模型,調整分類器的引數,如在神經網路中選擇隱藏單元數。驗證集還用來確定網路結構或者控制模型複雜程度的引數。

測試集:主要是測試訓練好的模型的分辨能力(識別率等)

I. 劃分

如果我們自己已經有了一個大的標註資料集,想要完成一個有監督模型的測試,那麼通常使用均勻隨機抽樣的方式,將資料集劃分為訓練集、驗證集、測試集,這三個集合不能有交集,常見的比例是8:1:1,當然比例是人為的。從這個角度來看,三個集合都是同分布的。

如果是做比賽,官方只提供了一個標註的資料集(作為訓練集)以及一個沒有標註的測試集,那麼我們做模型的時候,通常會人工從訓練集中劃分一個驗證集出來。這時候我們通常不再劃分一個測試集,可能的原因有兩個:1、比賽方基本都很摳,訓練集的樣本本來就少;2、我們也沒法保證要提交的測試集是否跟訓練集完全同分布,因此再劃分一個跟訓練集同分布的測試集就沒多大意義了。

樣本少的時候,上面的劃分就不合適了。常用的是留少部分做測試集。然後對其餘N個樣本採用K折交叉驗證法。就是將樣本打亂,然後均勻分成K份,輪流選擇其中K-1份訓練,剩餘的一份做驗證,計算預測誤差平方和,最後把K次的預測誤差平方和再做平均作為選擇最優模型結構的依據。特別的K取N,就是留一法(leave one out)。

II. 引數

有了模型後,訓練集就是用來訓練引數的,說準確點,一般是用來梯度下降的。而驗證集基本是在每個epoch完成後,用來測試一下當前模型的準確率。因為驗證集跟訓練集沒有交集,因此這個準確率是可靠的。那麼為啥還需要一個測試集呢?

這就需要區分一下模型的各種引數了。事實上,對於一個模型來說,其引數可以分為普通引數和超引數。在不引入強化學習的前提下,那麼普通引數就是可以被梯度下降所更新的,也就是訓練集所更新的引數。另外,還有超引數的概念,比如網路層數、網路節點數、迭代次數、學習率等等,這些引數不在梯度下降的更新範圍內。儘管現在已經有一些演算法可以用來搜尋模型的超引數,但多數情況下我們還是自己人工根據驗證集來調。

III. 所以

那也就是說,從狹義來講,驗證集沒有參與梯度下降的過程,也就是說是沒有經過訓練的;但從廣義上來看,驗證集卻參與了一個“人工調參”的過程,我們根據驗證集的結果調節了迭代數、調節了學習率等等,使得結果在驗證集上最優。因此,我們也可以認為,驗證集也參與了訓練。

那麼就很明顯了,我們還需要一個完全沒有經過訓練的集合,那就是測試集,我們既不用測試集梯度下降,也不用它來控制超引數,只是在模型最終訓練完成後,用來測試一下最後準確率。