參考 交叉驗證 交叉驗證 (Cross Validation)劉建平html
1、訓練集 vs. 測試集機器學習
在模式識別(pattern recognition)與機器學習(machine learning)的相關研究中,常常會將數據集(dataset)分爲訓練集(training set)跟測試集(testing set)這兩個子集,前者用以創建模型(model),後者則用來評估該模型對未知樣本進行預測時的精確度,正規的說法是泛化能力(generalization ability)。怎麼將完整的數據集分爲訓練集跟測試集,必須遵照以下要點:性能
一、只有訓練集才能夠用在模型的訓練過程當中,測試集則必須在模型完成以後才被用來評估模型優劣的依據。
二、訓練集中樣本數量必須夠多,通常至少大於總樣本數的 50%。
三、兩組子集必須從完整集合中均勻取樣。學習
其中最後一點特別重要,均勻取樣的目的是但願減小訓練集 / 測試集與完整集合之間的誤差(bias),但卻也不易作到。通常的做法是隨機取樣,當樣本數量足夠時,即可達到均勻取樣的效果,然而隨機也正是此做法的盲點,也是常常是能夠在數據上作手腳的地方。舉例來講,當辨識率不理想時,便從新取樣一組訓練集 / 測試集,直到測試集的識別率滿意爲止,但嚴格來講這樣便算是做弊了。測試
2、交叉驗證(Cross Validation)優化
交叉驗證是在機器學習創建模型和驗證模型參數時經常使用的辦法。交叉驗證,顧名思義,就是重複的使用數據,把獲得的樣本數據進行切分,組合爲不一樣的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型預測的好壞。在此基礎上能夠獲得多組不一樣的訓練集和測試集,某次訓練集中的某樣本在下次可能成爲測試集中的樣本,即所謂 「交叉」。 .net
那麼何時才須要交叉驗證呢?交叉驗證用在數據不是很充足的時候。好比在我平常項目裏面,對於普通適中問題,若是數據樣本量小於一萬條,咱們就會採用交叉驗證來訓練優化選擇模型。若是樣本大於一萬條的話,咱們通常隨機的把數據分紅三份,一份爲訓練集(Training Set),一份爲驗證集(Validation Set),最後一份爲測試集(Test Set)。用訓練集來訓練模型,用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。把最終獲得的模型再用於測試集,最終決定使用哪一個模型以及對應參數。設計
一、Hold-Out Methodhtm
將原始數據隨機分爲兩組,一組作爲訓練集,一組作爲驗證集,利用訓練集訓練分類器,而後利用驗證集驗證模型,記錄最後的分類準確率爲此分類器的性能指標。此種方法的好處的處理簡單,只需隨機把原始數據分爲兩組便可,其實嚴格意義來講 Hold-Out Method 並不能算是 CV,由於這種方法沒有達到交叉的思想,因爲是隨機的將原始數據分組,因此最後驗證集分類準確率的高低與原始數據的分組有很大的關係,因此這種方法獲得的結果其實並不具備說服性。blog
二、Double Cross Validation(2-fold Cross Validation,記爲 2-CV)
作法是將數據集分紅兩個相等大小的子集,進行兩回合的分類器訓練。在第一回閤中,一個子集做爲 training set,另外一個便做爲 testing set;在第二回閤中,則將 training set 與 testing set 對換後,再次訓練分類器,而其中咱們比較關心的是兩次 testing sets 的辨識率。不過在實務上 2-CV 並不經常使用,主要緣由是 training set 樣本數太少,一般不足以表明母體樣本的分佈,致使 testing 階段辨識率容易出現明顯落差。此外,2-CV 中分子集的變異度大,每每沒法達到 「實驗過程必須能夠被複制」 的要求。
三、K-fold Cross Validation(K - 折交叉驗證,記爲 K-CV)
將原始數據分紅 K 組(通常是均分),將每一個子集數據分別作一次驗證集,其他的 K-1 組子集數據做爲訓練集,這樣會獲得 K 個模型,用這 K 個模型最終的驗證集的分類準確率的平均數做爲此 K-CV 下分類器的性能指標。K 通常大於等於 2,實際操做時通常從 3 開始取,只有在原始數據集合數據量小的時候纔會嘗試取 2。K-CV 能夠有效的避免過學習以及欠學習狀態的發生,最後獲得的結果也比較具備說服性。
四、Leave-One-Out Cross Validation(記爲 LOO-CV)
若是設原始數據有 N 個樣本,那麼 LOO-CV 就是 N-CV,即每一個樣本單獨做爲驗證集,其他的 N-1 個樣本做爲訓練集,因此 LOO-CV 會獲得 N 個模型,用這 N 個模型最終的驗證集的分類準確率的平均數做爲此下 LOO-CV 分類器的性能指標。相比於前面的 K-CV,LOO-CV 有兩個明顯的優勢:
(1)每一回閤中幾乎全部的樣本皆用於訓練模型,所以最接近原始樣本的分佈,這樣評估所得的結果比較可靠。
(2)實驗過程當中沒有隨機因素會影響實驗數據,確保實驗過程是能夠被複制的。
但 LOO-CV 的缺點則是計算成本高,由於須要創建的模型數量與原始數據樣本數量相同,當原始數據樣本數量至關多時,LOO-CV 在實做上便有困難幾乎就是不顯示,除非每次訓練分類器獲得模型的速度很快,或是能夠用並行化計算減小計算所需的時間。
3、使用 Cross-Validation 時常犯的錯誤
因爲實驗室許多研究都有用到 evolutionary algorithms(EA)與 classifiers,所使用的 fitness function 中一般都有用到 classifier 的辨識率,然而把 cross-validation 用錯的案例還很多。前面說過,只有 training data 才能夠用於 model 的建構,因此只有 training data 的辨識率才能夠用在 fitness function 中。而 EA 是訓練過程用來調整 model 最佳參數的方法,因此只有在 EA 結束演化後,model 參數已經固定了,這時候纔可使用 test data。那 EA 跟 cross-validation 要如何搭配呢?Cross-validation 的本質是用來估測 (estimate) 某個 classification method 對一組 dataset 的 generalization error,不是用來設計 classifier 的方法,因此 cross-validation 不能用在 EA 的 fitness function 中,由於與 fitness function 有關的樣本都屬於 training set,那試問哪些樣本纔是 test set 呢?若是某個 fitness function 中用了 cross-validation 的 training 或 test 辨識率,那麼這樣的實驗方法已經不能稱爲 cross-validation 了。
EA 與 k-CV 正確的搭配方法,是將 dataset 分紅 k 等份的 subsets 後,每次取 1 份 subset 做爲 test set,其他 k-1 份做爲 training set,而且將該組 training set 套用到 EA 的 fitness function 計算中 (至於該 training set 如何進一步利用則沒有限制)。所以,正確的 k-CV 會進行共 k 次的 EA 演化,創建 k 個 classifiers。而 k-CV 的 test 辨識率,則是 k 組 test sets 對應到 EA 訓練所得的 k 個 classifiers 辨識率之平均值。