樣本集、驗證集(開發集)、測試集。
Ripley, B.D(1996)在他的經典專著Pattern Recognition and Neural Networks中給出了這三個詞的定義。
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.
訓練集:學習樣本數據集,通過匹配一些參數來建立一個分類器。建立一種分類的方式,主要是用來訓練模型的。
驗證集:對學習出來的模型,微調分類器的參數,如在神經網絡中選擇隱藏單元數。驗證集還用來確定網絡結構或者控制模型復雜程度的參數。
測試集:主要用於測試訓練好的模型的分類能力(識別率等)
在有監督(supervise learning)機器學習中,數據集常被分成2~3個部分:
訓練集(train set):用來估計模型;
驗證集(validation set):確定網絡結構或者控制模型復雜程度的參數;
測試集(test set):檢驗最終選擇最優的模型的性能如何。
一個典型的划分是訓練集占總樣本的50%,而其它各占25%,三部分都是從樣本中隨機抽取。樣本少的時候,上面的划分就不合適了。常用的是留少部分做測試集。然后對其余N個樣本采用K折交叉驗證法。就是將樣本打亂,然后均勻分成K份,輪流選擇其中K-1份訓練,剩余的一份做驗證,計算預測誤差平方和,最后把K次的預測誤差平方和再做平均作為選擇最優模型結構的依據。特別的K取N,就是留一法(leave one out)。
training set是用來訓練模型或確定模型參數的,如ANN中權值等; validation set是用來做模型選擇(model selection),即做模型的最終優化及確定的,如ANN的結構;而 test set則純粹是為了測試已經訓練好的模型的推廣能力。當然,test set這並不能保證模型的正確性,他只是說相似的數據用此模型會得出相似的結果。但實際應用中,一般只將數據集分成兩類,即training set 和test set。
1.傳統的機器學習領域中,由於收集到的數據量往往不多,比較小,所以需要將收集到的數據分為三類:訓練集、驗證集、測試集。也有人分為兩類,就是不需要測試集。
比例根據經驗不同而不同,這里給出一個例子,如果是三類,可能是訓練集:驗證集:測試集=6:2:2;如果是兩類,可能是訓練集:驗證集=7:3。因為數據量不多,所以驗證集和測試集需要占的數據比例比較多。
2.在大數據時代的機器學習或者深度學習領域中,如果還是按照傳統的數據划分方式不是十分合理,因為測試集和驗證集用於評估模型和選擇模型,所需要的數據量和傳統的數據量差不多,但是由於收集到的數據遠遠大於傳統機器學習時代的數據量,所以占的比例也就要縮小。比如我們擁有1000000,這么多的數據,訓練集:驗證集:測試集=98:1:1。如果是兩類,也就是相同的道理。
小數據時代: 70%(訓練集)/30%(測試集)或者60%(訓練集)/20%(驗證集)/20%(測試集)
大數據時代: 驗證集和測試集的比例要逐漸減小,比如: 980000/10000/10000
驗證集和測試集的作用
深度學習需要大量的數據,我們可能會采用網上爬取的方式獲得訓練集,容易出現訓練集和驗證集、測試集分布不一致的情況,由於驗證集的目的就是為了驗證不同的算法,選取效果好的。所以確保驗證集和測試集的數據來自同一分布可以加快訓練速度,模型在測試集上也會獲得較好的效果。
測試集的目的是對最終選定的神經網絡系統做出無偏評估。(測試集可以不要)
沒有測試集時,驗證集也會被稱為測試集,但是人們是把這里的測試集當成簡單交叉驗證集使用。
搭建訓練驗證集和測試集能夠加速神經網絡的集成,也可以更有效地衡量算法的偏差和方差。從而幫助我們更高效地選擇合適的方法來優化算法。
訓練集誤差 | 1% | 15% | 15% | 0.5% |
---|---|---|---|---|
驗證集誤差 | 11% | 16% | 30% | 1% |
High variance | high bias | high bias & high variance | low bias & low variance |
上述表格基於假設:最優誤差(基礎誤差)≈0%,訓練集和驗證集數據來自相同分布。
訓練集和測試集
機器學習模型需要訓練去更新模型中的各個參數,因此需要提供訓練集(Training Set)作為訓練樣本,假設此訓練集由數據生成分布PdataPdata生成。同時為了描述這個模型的泛化能力,需要一個同樣由PdataPdata生成的測試集(Test Set)進行測試,得出其泛化誤差。可以得知,訓練集和測試集是獨立同分布的,在訓練階段,模型觀測不到測試集。
檢驗集
超參數
在討論檢驗集之前,有必要先提到超參數(hyperparameter)這個概念。超參數不能或者難以通過機器學習算法學習得出,一般由專家經過經驗或者實驗選定,如廣義線性回歸中的多項式次數,控制權值衰減的λλ等。容易想象到,不同的超參數選定控制了模型的容量和泛化能力,決定了模型的性能,事實上,超參數的調試(Tuning of the hyperparameter)是機器學習中很關鍵的一部分。
這里我們假想一個場景:
我們有多個待選的權值衰減因子λλ,分別是λ1,⋯,λnλ1,⋯,λn,這些λλ的不同選擇代表了一個模型的不同超參數狀態,其中有一個可能性能比較優的超參數,為了得到這個較為優的超參數,我們需要在多個[訓練集,測試集]元組上訓練測試,尋找最小的泛化誤差,直到找到合適的超參數為止。
由於監督數據的獲取困難,一般來說沒有那么多數據用來划分這個元組,因此一般的做法是:
將數據集按一定比例划分為訓練集(大類)和測試集(Test set),其中測試集只在最后的測試泛化誤差的時候才能被模型觀察到,而在訓練集(大類)中又將其按一定比例划分為訓練集(Training Set)和檢驗集(validation set),其中訓練集用於模型訓練,檢驗集用於尋找最佳的超參數。一般模型會在訓練集上訓練多次,在檢驗集上檢驗多次,直到得到滿意的檢驗誤差,然后才能交給測試集得出泛化誤差。
交叉檢驗(Cross Validation)
在實際應用中,因為數據集的數量限制,常常采用交叉檢驗作為檢驗手段1,其中k折交叉檢驗(k-folds cross validation)最為常用,其中k=10k=10最為常見。其方法十分簡單,就是將訓練集(大類)均分為KK份,然后分別取出其中的第ii個作為檢驗集,其余的i−1i−1作為訓練集訓練,然后再檢驗集上檢驗。進行了KK次該操作之后,采用平均值作為最終的交叉驗證誤差(CV Error),用於選擇模型。
其中LiLi是第ii檢驗集的平均誤差
以上主要介紹了訓練集,檢驗集,測試集之間的關系,以及引進檢驗集的目的:就是為了多次比較,得出較好的超參數,進行模型選擇。
開發集和測試集的概念
繼續分析我們之前提到的貓咪圖片的案例:現在你負責運營着一個移動端 app,用戶會向這個 app 上傳許多不同內容的圖片。而你希望這個 app 能夠從圖片中自動地找到有貓的圖片。
你的團隊已經在不同的網站下載了含有貓的圖片(正樣本,又譯作正例),以及不含有貓的圖片(負樣本,又譯作反例),從而得到了一個巨型的數據集。他們將數據集按照 70% / 30% 的比例划分為訓練集(training set)和測試集(test set),並且使用這些數據構建出了一個在訓練集和測試集上均表現良好的貓咪檢測器。
可當你將這個分類器(classifier)部署到移動應用中時,卻發現它的性能相當之差!
究竟是什么原因導致的呢?
你會發現,從網站上下載作為訓練集的圖片與用戶上傳的圖片有較大的區別——用戶上傳的圖片大部分是用手機拍攝的,此類型的圖片往往分辨率較低,且模糊不清,采光也不夠理想。由於用來進行訓練和測試的數據集圖片均取自網站,這就導致了算法沒能夠很好地泛化(generalize)到我們所關心的手機圖片的實際分布(actual distribution)情況上。
在大數據時代來臨前,機器學習中的普遍做法是使用 70% / 30% 的比例來隨機划分出訓練集和測試集。這種做法的確可行,但在越來越多的實際應用中,訓練數據集的分布(例如上述案例中的網站圖片)與人們最終所關心的分布情況(例如上述案例中的手機圖片)往往不同,此時執意要采取這樣的划分則是一個壞主意。
我們通常認為:
-
訓練集(training set)用於運行你的學習算法。
-
開發集(development set)用於調整參數,選擇特征,以及對學習算法作出其它決定。有時也稱為留出交叉驗證集(hold-out cross validation set)。
-
測試集(test set)用於評估算法的性能,但不會據此決定使用什么學習算法或參數。
在定義了開發集(development set)和測試集(test set)后,你的團隊將可以嘗試許多的想法,比如調整學習算法的參數來探索出哪些參數的效果最好。開發集和測試集能夠幫助你的團隊快速檢測算法性能。
換而言之,開發集和測試集的使命就是引導你的團隊對機器學習系統做出最重要的改變。
所以你應當這樣處理:
合理地設置開發集和測試集,使之近似模擬可能的實際數據情況,並處理得到一個好的結果。
也就是說你的測試集不應該僅是簡單地將可用的數據划分出 30%,尤其是將來獲取的數據(移動端圖片)在性質上可能會與訓練集(網站圖片)不同時。
如果你尚未推出移動端 app,那么可能還沒有任何的用戶,因此也無法獲取一些准確的反饋數據來作為后續行動的依據。但你仍然能夠嘗試去模擬這種情況,例如邀請你的朋友用手機拍下照片並發送給你。當你的 app 上線后,就能夠使用實際的用戶數據對開發集和測試集進行更新。
如果你實在沒有途徑獲取近似將來實際情況的數據,也可以從使用已有的網站圖片開始進行嘗試。但你應該意識到其中的風險,它將導致系統不能夠很好地泛化(generalize)。
這就要求你主觀地進行判斷,應該投入多少來確定一個理想的開發集和測試集,但請不要假定你的訓練集分布和測試集分布是一致的。盡可能地選出能夠反映你對最終性能期望的測試樣本,而不是使用那些在訓練階段已有的數據,這將避免不必要的麻煩。