在人工智能機器學習中,很容易將“驗證集”與“測試集”,“交叉驗證”混淆。
一、三者的區別
訓練集(train set) —— 用於模型擬合的數據樣本。
驗證集(development set)—— 是模型訓練過程中單獨留出的樣本集,它可以用於調整模型的超參數和用於對模型的能力進行初步評估。
在神經網絡中, 我們用驗證數據集去尋找最優的網絡深度(number of hidden layers),或者決定反向傳播算法的停止點或者在神經網絡中選擇隱藏層神經元的數量;
在普通的機器學習中常用的交叉驗證(Cross Validation) 就是把訓練數據集本身再細分成不同的驗證數據集去訓練模型。
測試集 (test set)—— 用來評估模最終模型的泛化能力。但不能作爲調參、選擇特徵等算法相關的選擇的依據。
一個形象的比喻:
訓練集-----------學生的課本;學生 根據課本里的內容來掌握知識。
驗證集------------作業,通過作業可以知道 不同學生學習情況、進步的速度快慢。
測試集-----------考試,考的題是平常都沒有見過,考察學生舉一反三的能力。
傳統上,一般三者切分的比例是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折交叉驗證)之後,由全部的訓練數據重新訓練。 目的在模型選擇,而非模型訓練調整參數。
c) K值的選擇
K值的選取是一個偏差與方差的權衡:
K=1時,所有數據用於訓練,容易過擬合;
K=N時,相當於留一法LOOCV (Leave-one-out cross-validation ).;
通常建議K=10, 建議且保證
---------------------
原文鏈接:https://blog.csdn.net/kieven2008/article/details/81582591