交叉驗證 (Cross validation)
有時亦稱循環(huán)估計, 是用來驗證分類器的性能的一種統(tǒng)計分析方法。它用于分析機器學習算法的泛化能力(generalization). 其基本思想是將原始數(shù)據(jù)(data set)進行分組,一部分作為訓練集(training set),一部分作為測試集 (testing set)。首先利用訓練集對分類器進行訓練,再利用測試集來測試得到的模型(model),以此來作為評價分類性能的指標。
交叉驗證一般要盡量滿足:
1)訓練集的比例要足夠多,一般大于一半
2)訓練集和測試集要均勻抽樣
常見的交叉驗證類型:
1.Double Cross Validation (記為2-CV)
做法是將數(shù)據(jù)集分成兩個相等大小的子集,進行兩回合的分類器訓練。在第一回合中,一個子集作為training set,另一個便作為testing set;在第二回合中,則將training set與testing set對換后,再次訓練分類器,而其中我們比較關心的是兩次testing sets的辨識率。不過在實務上2-CV并不常用,主要原因是training set樣本數(shù)太少,通常不足以代表母體樣本的分布,導致testing階段辨識率容易出現(xiàn)明顯落差。此外,2-CV中分子集的變異度大,往往無法達到“實驗過程必須可以被復制”的要求。
2.K-folder cross-validation
將原始數(shù)據(jù)分成K個子集(一般是均分),將每個子集數(shù)據(jù)分別做一次測試集 (testing test),其余的K-1組子集數(shù)據(jù)作為訓練集(trainning test),這樣會得到K個模型,用這K個模型最終的驗證集的分類準確率的平均數(shù)作為此K-CV下分類器的性能指標。K一般大于等于2,實際操作時一般從3開始取。交叉驗證重復k次,每次選擇一個子集作為測試集,并將k次的平均交叉驗證識別正確率作為結果。
優(yōu)點:所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10-folder通常被使用。
3. K * 2 folder cross-validation
是k-folder cross-validation的一個變體,對每一個folder,都平均分成兩個集合s0,s1,我們先在集合s0訓練用s1測試,然后用s1訓練s0測試。
優(yōu)點是:測試和訓練集都足夠大,每一個個樣本都被作為訓練集和測試集。一般使用k=10
4. least-one-out cross-validation(LOOCV)
留一法。假設dataset中有N個樣本,那LOOCV也就是N-CV,即每個樣本單獨作為一次測試集,剩余N-1個樣本則做為訓練集所以LOO-CV會得到N個模型,用這N個模型最終的驗證集的分類準確率的平均數(shù)作為此下LOO-CV分類器的性能指標。相比于前面的K-CV,LOO-CV有兩個明顯的優(yōu)點.
優(yōu)點:1)每一回合中幾乎所有的樣本皆用于訓練model,因此最接近原始樣本的分布,估測所得的generalization error比較可靠。
2)實驗過程中沒有隨機因素會影響實驗數(shù)據(jù),確保實驗過程是可以被復制的。
缺點:
計算成本高,為需要建立的models數(shù)量與總樣本數(shù)量相同,當總樣本數(shù)量相當多時,LOOCV在實作上便有困難,除非每次訓練model的速度很快,或是可以用平行化計算減少計算所需的時間。
十折交叉驗證:10-fold cross validation
常用的測試方法。將數(shù)據(jù)集分成十分,輪流將其中9份作為訓練數(shù)據(jù),1份作為測試數(shù)據(jù),進行試驗。每次試驗都會得出相應的正確率(或差錯率)。10次的結果的正確率(或差錯率)的平均值作為對算法精度的估計,一般還需要進行多次10折交叉驗證(例如10次10折交叉驗證),再求其均值,作為對算法準確性的估計。
之所以選擇將數(shù)據(jù)集分為10份,是因為通過利用大量數(shù)據(jù)集、使用不同學習技術進行的大量試驗,表明10折是獲得最好誤差估計的恰當選擇,而且也有一些理論根據(jù)可以證明這一點。但這并非最終診斷,爭議仍然存在。而且似乎5折或者20折與10折所得出的結果也相差無幾。
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 辨識率之平均值。
K-floder-CV matlab實現(xiàn)
在matlab中,可以利用:indices=crossvalind('Kfold',x,k);來實現(xiàn)隨機分包的操作,其中x為一個N維列向量(N為數(shù)據(jù)集A的元素個數(shù),與x具體內(nèi)容無關,只需要能夠表示數(shù)據(jù)集的規(guī)模),k為要分成的包的總個數(shù),輸出的結果indices是一個N維列向量,每個元素對應的值為該單元所屬的包的編號(即該列向量中元素是1~k的整隨機數(shù)),利用這個向量即可通過循環(huán)控制來對數(shù)據(jù)集進行劃分。
例:[M,N]=size(data);
//數(shù)據(jù)集為一個M*N的矩陣,其中每一行代表一個樣本
indices=crossvalind('Kfold',data(1:M,N),10);
//進行隨機分包 for k=1:10//交叉驗證k=10,10個包輪流作為測試集
test = (indices == k);
//獲得test集元素在數(shù)據(jù)集中對應的單元編號
train = ~test;
//train集元素的編號為非test元素的編號
train_data=data(train,:);
//從數(shù)據(jù)集中劃分出train樣本的數(shù)據(jù)
train_target=target(:,train);
//獲得樣本集的測試目標,在本例中是實際分類情況
test_data=data(test,:);
//test樣本集
test_target=target(:,test);[HammingLoss(1,k),RankingLoss(1,k),OneError(1,k),Coverage(1,k),Average_Precision(1,k),Outputs,Pre_Labels.MLKNN]=MLKNN_algorithm(train_data,train_target,test_data,test_target);
//要驗證的算法 end
//上述結果為輸出算法MLKNN的幾個驗證指標及最后一輪驗證的輸出和結果矩陣,每個指標都是一個k元素的行向量