交叉驗證

交叉驗證 (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折所得出的結果也相差無幾。

3-fold 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 辨識率之平均值。

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元素的行向量

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 交叉驗證(Cross-Validation) 交叉驗證也叫做循環(huán)驗證,是用來驗證分類器性能的一種統(tǒng)計分析方法,它也...
    Mancha閱讀 1,511評論 0 0
  • KNN算法 用NumPy庫實現(xiàn)K-nearest neighbors回歸或分類。 鄰近算法,或者說K最近鄰(kNN...
    心智萬花筒閱讀 16,316評論 1 24
  • 1、為什么要進行交叉驗證?目的:為了得到可靠穩(wěn)定的模型 交叉驗證是一種模型選擇方法,其將樣本的一部分用于訓練,另一...
    快樂的小飛熊閱讀 4,670評論 0 4
  • 1、為什么要進行交叉驗證? 目的:為了得到可靠穩(wěn)定的模型 交叉驗證是一種模型選擇方法,其將樣本的一部分用于訓練,另...
    arrnos閱讀 1,269評論 0 1
  • 前言 此片有很多別人的東西,直接搬過來了,都有注釋,里面也有一些自己的理解和需要注意的地方,以此記錄一下,總結如下...
    mrlevo520閱讀 11,386評論 4 21