訓練集 驗證集 測試集的區別與應用

2021-08-30 11:17:03 字數 2268 閱讀 8851

最近一直在看**、跑模型和做工程,很久沒有來發部落格了。但是在日常的學習和交流中,我感覺大家更加會關注當今最新的模型,最先進的演算法,但是對於一些非常基礎的內容的理解還不夠透徹,我也是想藉此機會梳理清楚一些內容。

今天想講的是資料集的劃分,即訓練集,驗證集和測試集分別是啥,又有啥用處,其區別是什麼。目前網上講述的大多相同,不同的講解又太過簡略,而且側重點多半是講述在不同方法上,而對於其確切內容沒有乙個詳細的描述。我這裡主要結合平時的實際工作,梳理一些常用的概念。

做科研,就要提出問題,找到解決方法,並證明其有效性。這裡的工作有3個部分,乙個是提出問題,乙個是找到解決方法,另乙個是證明有效性。每乙個部分都可以作為科研的物件,研究的越靠前,則越偏向科學,越靠後,則越偏向技術,因此叫做科學與技術。

在我們人工智慧領域,證明乙個模型的有效性,就是對於某一問題,有一些資料,而我們提出的模型可以(部分)解決這個問題,那如何來證明呢?這和我們平時的考試也是一樣的,證明我們掌握了某類知識,就是去參加考試。

好,那麼如何設計考試,讓這個考試可以較為客觀的考察出每個人的能力呢(注意,不是讓每個人都得最高分)?回想我們的高中階段,有一些教材,讓我們平時學習其基本知識(訓練集),有一些模擬考試,讓我們知道我們到底掌握的怎麼樣,然後再改進我們的學習(驗證集),最後的高考決定我們的去向(測試集)。這樣的模擬,是不是就很清楚了。

訓練集:教材(例題),其特點是數量多,容易獲得,是我們(模型)掌握知識的最根本的途徑。訓練集在我們模型的過程中起的作用就是更新模型的引數,用以獲得更好的效能,其行為表現就是讓我們以為模型掌握了相關的知識(規律)。

驗證集:模擬考試,其特點是相對客觀的自我衡量的一種方式。畢竟你見過的例題你都會了這是理所當然的事情,但是要求你能夠舉一反三,遇到同型別的題目也應該會。另外,當你習題做錯的時候,你還可以重新去回顧已學習的知識,是不是掌握的方式或者理解發生了偏差。驗證集就是為了調整我們模型的超引數(神經元的數量、迭代的次數、序列長度等等),這些超引數在某一次的學習迭代中是沒有辦法改變的。

測試集:高考,其特點是一考定終身,而且不給你改的機會,想想多少人在高考的過程中悔恨,但是也沒啥用,除非復讀,否則這個成績就是無法改變的。而且,最重要的一點,首先,高考和模擬考與教材的考察內容應當是一致的(考試大綱),其次,你會發現無論平時做了多少題目,也許有些題目有幾分相似,但是在高考試卷上不會出現100%一樣的題目,多數題目都是從未見過的(數學最為甚)。而且致命的是,你不會得到答案反饋,即使後面會提供參***(比如在報紙上),但是你只會得到你的評分,無論這個評分與你的預估分有無差異。這就像是平時的資料比賽,測試集你是不會得到的,都是上傳模型後,評測系統會給你乙個最終得分。這才是最正統的做法。

但是,但是,事實上很少會提供這麼嚴格的環境,通常的科研都是自己的資料,自己的方法,自己的模型,自己的評測,那麼我們應該掌握科學的評測方法才能夠更加客觀的反映我們的模型的效能。

這個問題其實非常基礎,也非常明確,在scikit-learn裡提供了各種各樣的劃分方法。無論是單一的訓練集、驗證集和測試集,還是進行交叉驗證,你都會找到呼叫的方法,因此我們這裡主要介紹兩種常見的方法。

前人給出訓練集、驗證集和測試集

對於這種情況,那麼只能跟隨前人的資料劃分進行,一般的比賽也是如此。一定不要使用測試集來調整效能(測試集已知的情況下),儘管存在使用這種方法來提公升模型的效能的行為,但是我們並不推薦這麼做。最正常的做法應當是使用訓練集來學習,並使用驗證集來調整超引數。當在驗證集上取得最優的模型時,此時就可以使用此模型的超引數來重新訓練(訓練集+驗證集),並用測試集評估最終的效能。

我們首先說明加入驗證集重新訓練和不加有啥區別,從理論上講,一方面學習的樣本增多,應當是會提公升模型效能的,第二,其在驗證集上取得最優的模型與驗證集的分布的契合度是最高的,因此最終的模型會更接近驗證集的分布。

其次再說明驗證集和測試集上的效能差異。事實上,在驗證集上取得最優的模型,未必在測試集上取得最優。其原因就是訓練的模型是否對於該問題有著較好的泛化能力,即沒有對驗證集產生過擬合現象。正因為有這種情況的發生,才會有人使用測試集的最優值作為最終的結果(而不管驗證集的好壞)。

前人沒有明確給出資料集的劃分

這時候可以採取第一種劃分方法,對於樣本數較小的資料集,同樣可以採取交叉驗證的方法。

交叉驗證的方法的使用場景有很多,我們這裡是針對不同的模型的效能好壞進行評估。

使用交叉驗證,可以獲得更為客觀的效能差異。當使用第一種方法時,我們更建議使用p值來做顯著性檢驗,從而保證效能差異的客觀性。而使用第二種方法,即交叉驗證時,我們選取其效能表現的均值作為最終的結果,更能體現該模型的泛化能力。

通過以上介紹,我們應該對訓練集、驗證集與測試集有了乙個比較深刻的認識了。接下來進行我們的實驗吧!

訓練集 驗證集 測試集的區別

深度學習模型的引數分為普通引數和超引數 普通引數 在模型訓練的過程中可以被梯度下降所更新的,也就是訓練集所更新的引數。超引數 比如網路層數 網路節點數 迭代次數 學習率等等,這些引數不在梯度下降的更新範圍內。超引數的設定一般是人工根據驗證集來調。訓練集的作用就是通過梯度下降來調整模型的內部普通引數。...

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

當我們訓練好乙個模型時,我們不只希望這個模型只在訓練集上表現的好,更重要的是希望這個模型後續能表現的好,這時候就需要測試集,用於評估這個模型的泛化能力。通常情況下,我們將資料以8 2的比例分割訓練集和測試集。在演算法模型中,我們還要使用正則化技術,避免過擬合。其中乙個做法就是使用100個不同超引數訓...

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

初學者對於訓練集 train set 測試集 test set 驗證集 validation set 這三個概念和應用非常容易搞混,這裡我結合各種博文和書籍上的講解進行總結 參與訓練,模型從訓練集中學習經驗,從而不斷減小訓練誤差。這個最容易理解,一般沒什麼疑惑。不參與訓練,用於在訓練過程中檢驗模型的...