数据集的划分--训练集、验证集和测试集
前言
????????在機器學習中,經常提到訓練集和測試集,驗證集似有似無。感覺挺好奇的,就仔細查找了文獻。以下談談訓練集、驗證集和測試集。
1.為什么要劃分數據集為訓練集、驗證集和測試集?
????????做科研,就要提出問題,找到解決方法,并證明其有效性。這里的工作有3個部分,一個是提出問題,一個是找到解決方法,另一個是證明有效性。每一個部分都可以作為科研的對象,研究的越靠前,則越偏向科學,越靠后,則越偏向技術,因此叫做科學與技術。
????????在人工智能領域,證明一個模型的有效性,就是對于某一問題,有一些數據,而我們提出的模型可以(部分)解決這個問題,那如何來證明呢?這和我們平時的考試也是一樣的,證明我們掌握了某類知識,就是去參加考試。
????????好,那么如何設計考試,讓這個考試可以較為客觀的考察出每個人的能力呢(注意,不是讓每個人都得最高分)?回想我們的高中階段,有一些教材,讓我們平時學習其基本知識(訓練集),有一些模擬考試,讓我們知道我們到底掌握的怎么樣,然后再改進我們的學習(驗證集),最后的高考決定我們的去向(測試集)。這樣的類比,是不是就很清楚了。
2.訓練集、驗證集和測試集
訓練集:顧名思義指的是用于訓練的樣本集合,主要用來訓練神經網絡中的參數。
驗證集:從字面意思理解即為用于驗證模型性能的樣本集合.不同神經網絡在訓練集上訓練結束后,通過驗證集來比較判斷各個模型的性能.這里的不同模型主要是指對應不同超參數的神經網絡,也可以指完全不同結構的神經網絡。
測試集:對于訓練完成的神經網絡,測試集用于客觀的評價神經網絡的性能。
3.如何劃分訓練集、驗證集和測試集
????????這個問題其實非常基礎,也非常明確,在Scikit-learn里提供了各種各樣的劃分方法。無論是單一的訓練集、驗證集和測試集,還是進行交叉驗證,你都會找到調用的方法,因此我們這里主要介紹兩種常見的方法。
前人給出訓練集、驗證集和測試集
對于這種情況,那么只能跟隨前人的數據劃分進行,一般的比賽也是如此。一定不要使用測試集來調整性能(測試集已知的情況下),盡管存在使用這種方法來提升模型的性能的行為,但是我們并不推薦這么做。最正常的做法應當是使用訓練集來學習,并使用驗證集來調整超參數。當在驗證集上取得最優的模型時,此時就可以使用此模型的超參數來重新訓練(訓練集+驗證集),并用測試集評估最終的性能。
我們首先說明加入驗證集重新訓練和不加有啥區別,從理論上講,一方面學習的樣本增多,應當是會提升模型性能的,第二,其在驗證集上取得最優的模型與驗證集的分布的契合度是最高的,因此最終的模型會更接近驗證集的分布。
其次再說明驗證集和測試集上的性能差異。事實上,在驗證集上取得最優的模型,未必在測試集上取得最優。其原因就是訓練的模型是否對于該問題有著較好的泛化能力,即沒有對驗證集產生過擬合現象。正因為有這種情況的發生,才會有人使用測試集的最優值作為最終的結果(而不管驗證集的好壞)。
前人沒有明確給出數據集的劃分
這時候可以采取第一種劃分方法,對于樣本數較小的數據集,同樣可以采取交叉驗證的方法。
交叉驗證的方法的使用場景有很多,我們這里是針對不同的模型的性能好壞進行評估。
使用交叉驗證,可以獲得更為客觀的性能差異。當使用第一種方法時,我們更建議使用P值來做顯著性檢驗,從而保證性能差異的客觀性。而使用第二種方法,即交叉驗證時,我們選取其性能表現的均值作為最終的結果,更能體現該模型的泛化能力。
???????????????????????????????? 1.存在驗證集
????????????????????????????????這里五倍交叉驗證是用于進行調參,此時不接觸測試集。
????????????????????????????????數據集首先劃分出訓練集與測試集(可以是4:1或者9:1)。
????????????????????????????????其次,在訓練集中,再劃分出驗證集(通常也是4:1或者9:1)
????????????????????????????????然后對于訓練集和驗證集進行5折交叉驗證,選取出最優的超參數,然后把訓練集和驗證集一起訓練出最終的模型。
????????????????????????????????2.不存在驗證集
????????????????????????????????該情況通常是對比不同的模型,如自己的模型和別人的模型的性能好壞。
????????????????????????????????只需要把數據集劃分為訓練集和測試集即可,然后選取5次試驗的平均值作為最終的性能評價。
4.驗證集和測試集的區別
????????那么,訓練集、校驗集和測試集之間又有什么區別呢?一般而言,訓練集與后兩者之間較易分辨,校驗集和測試集之間的概念較易混淆.個人是從下面的角度來理解的:
-
神經網絡在網絡結構確定的情況下,有兩部分影響模型最終的性能,一是普通參數(比如權重w和偏置b),另一個是超參數(例如學習率,網絡層數).普通參數我們在訓練集上進行訓練,超參數我們一般人工指定(比較不同超參數的模型在校驗集上的性能).那為什么我們不像普通參數一樣在訓練集上訓練超參數呢?(花書給出了解答)一是:超參數一般難以優化(無法像普通參數一樣通過梯度下降的方式進行優化).二是:超參數很多時候不適合在訓練集上進行訓練,例如,如果在訓練集上訓練能控制模型容量的超參數,這些超參數總會被訓練成使得模型容量最大的參數(因為模型容量越大,訓練誤差越小),所以訓練集上訓練超參數的結果就是模型絕對過擬合.
-
正因為超參數無法在訓練集上進行訓練,因此我們單獨設立了一個驗證集,用于選擇(人工訓練)最優的超參數.因為驗證集是用于選擇超參數的,因此校驗集和訓練集是獨立不重疊的.
-
測試集是用于在完成神經網絡訓練過程后,為了客觀評價模型在其未見過(未曾影響普通參數和超參數選擇)的數據上的性能,因此測試與驗證集和訓練集之間也是獨立不重疊的,而且測試集不能提出對參數或者超參數的修改意見,只能作為評價網絡性能的一個指標.
為了方便清楚直觀的了解,上一個表格:
5.綜述
????????至此,我們可以將神經網絡完整的訓練過程歸結為一下兩個步驟:
????????1.訓練普通參數.在訓練集(給定超參數)上利用學習算法,訓練普通參數,使得模型在訓練集上的誤差降低到可接受的程度(一般接近人類的水平).
????????2.'訓練’超參數.在驗證集上驗證網絡的generalization error(泛化能力),并根據模型性能對超參數進行調整.
????????重復1和2兩個步驟,直至網絡在驗證集上取得較低的generalization error.此時完整的訓練過程結束.在完成參數和超參數的訓練后,在測試集上測試網絡的性能.
6.附言
說到底:
-
驗證集是一定需要的;
-
如果驗證集具有足夠泛化代表性,是不需要再整出什么測試集的;
-
整個測試集往往就是為了在驗證集只是非訓練集一個小子集的情況下,好奇一下那個靠訓練集(訓練)和驗證集(調參)多次接力訓練出來的模型是不是具有了泛化性能,因而加試一下圖個確定。
總結
以上是生活随笔為你收集整理的数据集的划分--训练集、验证集和测试集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab格拉布斯准则程序,基于格拉布
- 下一篇: 基于贝叶斯网络模型的自适应测评