1. 程式人生 > >訓練集、驗證集、測試集的區別與應用

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

0. 前言

最近一直在看論文、跑模型和做工程,很久沒有來發部落格了。但是在日常的學習和交流中,我感覺大家更加會關注當今最新的模型,最先進的演算法,但是對於一些非常基礎的內容的理解還不夠透徹,我也是想借此機會梳理清楚一些內容。
今天想講的是資料集的劃分,即訓練集,驗證集和測試集分別是啥,又有啥用處,其區別是什麼。目前網上講述的大多相同,不同的講解又太過簡略,而且側重點多半是講述在不同方法上,而對於其確切內容沒有一個詳細的描述。我這裡主要結合平時的實際工作,梳理一些常用的概念。

1.為什麼要劃分資料集為訓練集,驗證集和測試集?

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

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

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

2.訓練集、驗證集與測試集

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

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

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

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

3.如何劃分訓練集、驗證集和測試集。

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

  1. 前人給出訓練集、驗證集和測試集
    對於這種情況,那麼只能跟隨前人的資料劃分進行,一般的比賽也是如此。一定不要使用測試集來調整效能(測試集已知的情況下),儘管存在使用這種方法來提升模型的效能的行為,但是我們並不推薦這麼做。最正常的做法應當是使用訓練集來學習,並使用驗證集來調整超引數。當在驗證集上取得最優的模型時,此時就可以使用此模型的超引數來重新訓練(訓練集+驗證集),並用測試集評估最終的效能。
    我們首先說明加入驗證集重新訓練和不加有啥區別,從理論上講,一方面學習的樣本增多,應當是會提升模型效能的,第二,其在驗證集上取得最優的模型與驗證集的分佈的契合度是最高的,因此最終的模型會更接近驗證集的分佈。
    其次再說明驗證集和測試集上的效能差異。事實上,在驗證集上取得最優的模型,未必在測試集上取得最優。其原因就是訓練的模型是否對於該問題有著較好的泛化能力,即沒有對驗證集產生過擬合現象。正因為有這種情況的發生,才會有人使用測試集的最優值作為最終的結果(而不管驗證集的好壞)。

  2. 前人沒有明確給出資料集的劃分
    這時候可以採取第一種劃分方法,對於樣本數較小的資料集,同樣可以採取交叉驗證的方法。
    交叉驗證的方法的使用場景有很多,我們這裡是針對不同的模型的效能好壞進行評估。
    使用交叉驗證,可以獲得更為客觀的效能差異。當使用第一種方法時,我們更建議使用P值來做顯著性檢驗,從而保證效能差異的客觀性。而使用第二種方法,即交叉驗證時,我們選取其效能表現的均值作為最終的結果,更能體現該模型的泛化能力。

    • 存在驗證集
      這裡五倍交叉驗證是用於進行調參,此時不接觸測試集。
      資料集首先劃分出訓練集與測試集(可以是4:1或者9:1)。
      其次,在訓練集中,再劃分出驗證集(通常也是4:1或者9:1)
      然後對於訓練集和驗證集進行5折交叉驗證,選取出最優的超引數,然後把訓練集和驗證集一起訓練出最終的模型。
    • 不存在驗證集
      該情況通常是對比不同的模型,如自己的模型和別人的模型的效能好壞。
      只需要把資料集劃分為訓練集和測試集即可,然後選取5次試驗的平均值作為最終的效能評價。

4.小結

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