機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

在人工智慧機器學習中,很容易將“驗證集”與“測試集”,“交叉驗證”混淆。

一、三者的區別

訓練集(trainset),用於模型擬合的資料樣本。

驗證集(developmentset),是模型訓練過程中單獨留出的樣本集,它可以用於調整模型的超引數和用於對模型的能力進行初步評估。

在神經網路中,我們用驗證資料集去尋找最優的網路深度(numberofhiddenlayers),或者決定反向傳播演算法的停止點或者

在神經網路中選擇隱藏層神經元的數量;

在普通的機器學習中常用的交叉驗證(CrossValidation)就是把訓練資料集本身再細分成不同的驗證資料集去訓練模型。

測試集——用來評估模最終模型的泛化能力。但不能作為調參、選擇特徵等演算法相關的選擇的依據。

類別

驗證集

測試集

是否被訓練到

作用

用於調超引數,監控模型是否發生過擬合(以決定是否停止訓練)

為了評估最終模型泛化能力

使用次數

多次使用,以不斷調參

僅僅一次使用

缺陷

模型在一次次重新手動調參並繼續訓練後所逼近的驗證集,可能只代表一部分非訓練集,導致最終訓練好的模型泛化效能不夠

測試集為了具有泛化代表性,往往資料量比較大,測試一輪要很久。測試集的資料不能參與任何模型的選擇中,包括超引數的設定,所以驗證集的資料不能從測試集裡選,往往只取訓練集的其中一小部分作為訓練過程中的驗證集。

一個形象的比喻:

訓練集——————-學生的課本;學生根據課本里的內容來掌握知識。

驗證集——————作業,透過作業可以知道不同學生學習情況、進步的速度快慢,但是作業都來自課本。

測試集——————-考試,考的題是平常都沒有見過,考察學生舉一反三的能力。

傳統上,一般三者切分的比例是:6:2:2,驗證集並不是必須的。

二、為什麼要測試集

a)訓練集直接參與了模型調參的過程,顯然不能用來反映模型真實的能力(防止課本死記硬背的學生擁有最好的成績,即防止過擬合)。

b)驗證集參與了人工調參(超引數)的過程,也不能用來最終評判一個模型(刷題庫的學生不能算是學習好的學生)。

c)所以要透過最終的考試(測試集)來考察一個學(模)生(型)真正的能力(期末考試)。

但是僅憑一次考試就對模型的好壞進行評判顯然是不合理的,所以接下來就要介紹交叉驗證法

三、交叉驗證法(模型選擇)

a)目的

交叉驗證法的作用就是嘗試利用不同的訓練集/驗證集劃分來對模型做多組不同的訓練/驗證,來應對單獨測試結果過於片面以及訓練資料不足的問題。(就像透過多次考試,才通知哪些學生是比較比較牛B的)

交叉驗證的做法就是將資料集粗略地分為比較均等不相交的k份,即

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

然後取其中的一份進行測試,另外的k-1份進行訓練,然後求得error的平均值作為最終的評價,具體演算法流程如下:

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

舉個例子:假設建立一個BP神經網路,對於隱含層的節點數目,我們並沒有很好的方法去確定。此時,一般將節點數設定為某一具體的值,透過訓練集訓練出相應的引數後,再由交叉驗證集去檢測該模型的誤差;

然後再改變節點數,重複上述過程,直到交叉驗證誤差最小。

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

b)交叉驗證演算法的具體步驟如下:

1。隨機將訓練資料等分成k份,S1,S2,…,Sk。

2。對於每一個模型Mi,演算法執行k次,每次選擇一個Sj作為驗證集,而其它作為訓練集來訓練模型Mi,把訓練得到的模型在Sj上進行測試,這樣一來,每次都會得到一個誤差E,最後對k次得到的誤差求平均,就可以得到模型Mi的泛化誤差。

3。演算法選擇具有最小泛化誤差的模型作為最終模型,並且在整個訓練集上再次訓練該模型,從而得到最終的模型。

K折交叉驗證,其主要的目的是為了選擇不同的模型型別(比如一次線性模型、非線性模型、),而不是為了選擇具體模型的具體引數。比如在BP神經網路中,其目的主要為了選擇模型的層數、神經元的啟用函式、每層模型的神經元個數(即所謂的超引數)。每一層網路神經元連線的最終權重是在模型選擇(即K折交叉驗證)之後,由全部的訓練資料重新訓練。

例如tensorflow下面一段程式碼:

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解

機器學習-訓練集、驗證集、測試集以及交驗驗證的理解