似乎沒區別,但你混淆過驗證集和測試集嗎?
很多機器學習入門者對測試集和驗證集的概念有所混淆,甚至很多機器學習開發工程師常常都會混淆這兩個概念。因為當我們采用驗證集的時候,測試集好像和驗證集實際上并沒有多大區別,所以本文從學界定義到實踐中的具體影響探討驗證集和測試集間的區別。
驗證數據集(validation dataset)是模型訓練過程中留出的樣本集,它可以用于調整模型的超參數和評估模型的能力。但測試數據集(test dataset)不同,雖然同是模型訓練過程中留出的樣本集,但它是用于評估最終模型的性能,幫助對比多個最終模型并做出選擇。在開發機器學習系統時,我們對驗證數據集及其與測試數據集的區別存在諸多混淆。本文將介紹訓練數據集(train dataset)、測試數據集和驗證數據集的確切定義,以及如何在機器學習項目中使用這三種數據集。
通過閱讀本文,我們將了解:
- 機器學習領域的專家對訓練數據集、測試數據集和驗證數據集的定義。
- 驗證數據集和測試數據集在實踐中的區別。
- 使用哪些過程能充分利用驗證數據集和測試數據集進行模型評估。
專家對驗證數據集的定義
本節,我們將了解部分***教科書和參考文獻如何定義訓練數據集、測試數據集和驗證數據集及其區別。
通常情況下,「驗證數據集」指模型訓練過程中留出的樣本集,可與「測試數據集」這個術語互換。在訓練數據集上對模型能力進行評估得到的結果存在偏差。因此,用留出的樣本對模型能力進行評估得出的結果偏差更小。我們通常稱之為使用訓練集測試集劃分方法(train-test split approach)進行算法評估。
假如我們想評估在一系列觀察值上使用特定的數據學習方法后所產生的測試誤差,那么驗證集方法非常適合該任務。它包括將這些觀察值任意切分成兩部分:訓練集和驗證集(又稱留出集,hold-out set)。模型在訓練集上進行擬合,然后使用擬合后的模型對驗證集中保留的數據樣本進行預測。并定量地計算模型驗證誤差,通常我們使用 MSE 對錯誤率進行評估,評估生成的驗證集錯誤率即測試錯誤率。
——Gareth James, et al., Page 176, An Introduction to Statistical Learning: with Applications in R, 2013. |
在 Kuhn 和 Johnson 的著作《應用預測建模》(Applied Predictive Modeling)一書中,我們可以看到作者認為「驗證數據集」和「測試數據集」這兩個詞語可以互換。他們在實例中明確指出,必須在留出的數據集上進行最終模型評估,無論評估目的是訓練模型還是調整模型參數。
理想情況下,模型評估應該在未用于模型構建或微調的樣本上進行,這樣才能對模型效率進行無偏評估。因此如果我們有大量數據可用,則可以留出一部分樣本集用于最終模型的評估。訓練數據集指構建模型時使用的樣本集,而測試數據集或驗證數據集用于評估模型性能。
——Max Kuhn and Kjell Johnson, Page 67, Applied Predictive Modeling, 2013 |
傳統情況下,對最終模型進行性能評估的數據叫作「測試集」。Russell 和 Norvig 在 AI 教科書《人工智能:一種現代方法》中再次強調了保持測試集完全獨立的重要性。他們認為,以任何形式使用測試集中的信息都是一種「窺探」(peeking),因此他們建議封存測試集,直到模型調整全部完成再作為***的評估。
模型窺探預留數據集是使用測試集選擇并評估假設函數的后果。若要避免窺視,必須將測試集單獨留出,直到模型學習過程完全結束,才能最終對模型假設進行獨立的評估。(如果你對評估結果不滿意,想返回尋找更好的模型假設,那么你必須獲取并封存一組全新的測試集。) —Stuart Russell and Peter Norvig, page 709, Artificial Intelligence: A Modern Approach, 2009 (3rd edition) |
重要的是,Russel 和 Norvig 認為用于模型擬合的訓練數據集可以進一步劃分成訓練集和驗證集。驗證集是訓練數據集的子集,用于對模型能力進行初步評估。
如果測試集被封存后,你仍想在未知數據上進行模型性能評估,來選擇性能好的模型假設,那么你需要將可用數據(不包含測試集)分為訓練集和驗證集。 —Stuart Russell and Peter Norvig, page 709,Artificial Intelligence: A Modern Approach, 2009 (3rd edition) |
該領域的其他教科書級的著作也佐證了此定義。Ripley 的著作《模式識別與神經網絡》(Pattern Recognition and Neural Networks)中的術語表就是一個經典實例。具體來說,訓練集、驗證集和測試集的定義如下:
訓練集:用來學習的樣本集,用于分類器參數的擬合。
驗證集:用來調整分類器超參數的樣本集,如在神經網絡中選擇隱藏層神經元的數量。 測試集:僅用于對已經訓練好的分類器進行性能評估的樣本集。 —Brian Ripley, page 354, Pattern Recognition and Neural Networks, 1996 |
這些是數據集推薦的定義和用法。重申 Ripley 的術語定義之后,讓我們來繼續討論「測試集」和「驗證集」在機器學習建模過程中的常見混淆。
機器學習相關文獻通常顛倒「驗證集」和「測試集」的意思。這是人工智能研究中最明顯的術語混淆。關鍵在于,神經網絡的文獻對測試集的標準定義認為測試集不應用于選擇兩個或多個網絡較好的那個,因此測試集上的誤差才是泛化誤差的無偏評估(假設測試集和實際總體服從同一分布)。
—Subject: What are the population, sample, training set, design set, validation set, and test set? |
訓練數據集、驗證數據集和測試數據集的定義
為了強調上文中專家的研究結果,本節為這三個術語提供明確的定義。
- 訓練數據集:用于模型擬合的數據樣本。
- 驗證數據集:用于調整模型的超參數,為擬合后的模型提供無偏評估。如果模型配置中已包括在驗證集上的調整,則該評估偏差會更大。
- 測試數據集:為擬合后的最終模型提供無偏評估。
我們可以通過下列偽代碼具體來看它們的定義:
- # split data
- data = ...
- train, validation, test = split(data)
- # tune model hyperparameters
- parameters = ...
- for params in parameters:
- model = fit(train)
- skill = evaluate(model, validation)
- # evaluate final model for comparison with other models
- model = fit(train)
- skill = evaluate(model, test)
以下是額外需要理解的內容:
- 驗證數據集可能在其他形式的模型預準備中發揮作用,如特征選擇。
- 最終模型可以在訓練數據集和驗證數據集上進行擬合。
只有驗證數據集遠遠不夠
在未知數據上對模型性能進行評估還有其他方式。一個常見的實例是使用 K-折交叉驗證(k-fold cross-validation)來調整模型超參數,而不是使用單獨的驗證數據集。Kuhn 和 Johnson 在「Data Splitting Recommendations」一章中指出使用單獨的「測試集」(或驗證集)的局限性。
如前所述,k 折交叉驗證是一種足以取代單獨、獨立測試集的技術:
- 測試集是對模型的單次評估,無法完全展現評估結果的不確定性。
- 將大的測試集劃分成測試集和驗證集會增加模型性能評估的偏差。
- 分割的測試集樣本規模太小。
- 模型可能需要每一個可能存在的數據點來確定模型值。
- 不同測試集生成的結果不同,這造成測試集具備極大的不確定性。
- 重采樣方法可對模型在未來樣本上的性能進行更合理的預測。
Max Kuhn 和 Kjell Johnson 等人還推薦了適用于小規模樣本的 10-折交叉驗證,其偏差低、性能評估變化小;他們還推薦適用于模型性能比較的自助法(bootstrap method),該方法性能評估變化小。對于規模稍大的樣本集,他們同樣推薦 10-折交叉驗證方法。
驗證數據集和測試數據集會淡化
很可能你再也不會在應用機器學習中看到訓練數據集、驗證數據集和測試數據集。
當實踐者選擇在訓練數據集中使用 k-折交叉驗證方法調整模型超參數時,「驗證集」的概念就已經淡化了。
我們可以通過以下為代碼具體來看:
- # split data
- data = ...
- train, test = split(data)
- # tune model hyperparameters
- parameters = ...
- k = ...
- for params in parameters:
- skills = list()
- for i in k:
- fold_train, fold_val = cv_split(i, k, train)
- model = fit(fold_train, params)
- skill_estimate = evaluate(model, fold_val)
- skills.append(skill_estimate)
- skill = summarize(skills)
- # evaluate final model for comparison with other models
- model = fit(train)
- skill = evaluate(model, test)
結語
在本教程中,你會了解「驗證數據集」和「測試數據集」中的很多謬誤,以及在評估機器學習模型的能力時如何正確地區分這些術語。
具體來說:
- 過去的專家學者已經對模型評估中「訓練數據集」、「驗證數據集」和「測試數據集」給出了明確定義。
- 「驗證數據集」主要用于調整超參數和數據準備時對模型進行評估,而「測試數據集」主要用于對比多個最終模型時的評估。
- 如果采用 k-折交叉驗證等重采樣方法,尤其當重采樣方法已經被嵌套在模型驗證中時,「驗證數據集」和「測試數據集」的概念可能會淡化。
原文:http://machinelearningmastery.com/difference-test-validation-datasets/
【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】