1. 程式人生 > >模式識別之k-折交叉驗證(k-fold crossValidation)

模式識別之k-折交叉驗證(k-fold crossValidation)

(1)英文名叫做10-fold cross-validation,用來測試演算法準確性,是常用的測試方法。

(2)將資料集分成十份,輪流將其中9份作為訓練資料,1份作為測試資料,進行試驗。每次試驗都會得出相應的正確率(或差錯率)。

(3)10次的結果的正確率(或差錯率)的平均值作為對演算法精度的估計,一般還需要進行多次10折交叉驗證(例如10次10折交叉驗證),再求其均值,作為對演算法準確性的估計。

例子:利用十折交叉驗證計算錯誤分類率

(Matlab內建了由Fisher在1936年釋出的關於iris的資料集,鳩尾花的分類,詳見UCI連結;載入該資料集,包括means和species,分別是四維的150個樣本和對應的類別)

load fisheriris
indices = crossvalind('Kfold',species,10); 
cp = classperf(species); 
for i = 1:10
      test = (indices == i); train = ~test;    %分別取第1、2、...、10份為測試集,其餘為訓練集
      class = classify(meas(test,:),meas(train,:),species(train,:));
      classperf(cp,class,test);
end
cp.ErrorRate     %查詢錯誤分類率

 相關函式解釋:

Indices = crossvalind('Kfold', N, K)

1)引數'Kfold'表明為了K折十字交叉驗證,把資料集N隨機分成平均的(或近似評價的)K份,Indices中為每個樣本所屬部分的索引(從1到K)
2)因為是隨機分,因此重複呼叫會產生不同分法。
3)在K折十字交叉驗證中,K-1份被用做訓練,剩下的1份用來測試,這個過程被重複K次。

cp = classperf(truelabels)

1)classperf是評估分類器效能(Evaluate performance of classifie)函式。

2)truelabels中為每個樣本對應的真實類別,建立並初始化一個空的分類器效能物件CP。

3)classperf provides an interface to keep track of the performance during the validation of classifiers. classperf creates and, optionally, updates a classifier performance object, CP, which accumulates the results of the classifier.

class = classify(sample,training,group)

1)classify是判別分析(Discriminant Analysis)函式。

2)若事先已經建立類別,則使用判別分析;若事先沒有建立類別,則使用聚類分析。一般地,若已有給定的若干總體的(即若干類別)的觀測資料,希望構造一個或多個判別函式,能由此函式對新的位置其所屬總體的樣品作出判斷,從而決定其應屬於哪個總體,這就是判別分析問題。

3)判別分析是利用原有的分類資訊,得到判別函式(判別函式關係式,一般是與分類相關的若干個指標的線性關係式),然後利用 該函式去判斷未知樣品屬於哪一類。因此,這是一個學習與預測的過程。常用的判別分析法有距離判別法、費歇爾判別法、貝葉斯判別法等。

4)matlab中語法:class = classify(sample,training,group) ,預設線性判別分析,將sample的每個樣本進行判別,分到trainning指定的類中,返回該類表作為分類結果。還可以用引數type指定判別分析法。

classperf(cp, classout, testidx)

1)根據分類結果,更新分類器效能物件CP。

2)在十折交叉驗證法中,就是重複10次,可累積得到總的錯誤分類率。

10折交叉驗證的例子

第1步,將資料等分到10個桶中。
 

我們會將50名籃球運動員和50名非籃球運動員分到每個桶中。每個桶當中放入了100人的資訊。

第2步,下列步驟重複10次。

(1)每一次迭代中留存其中一個桶。第一次迭代中留存桶1,第二次留存桶2,其餘依此類推。

(2)用其他9個桶的資訊訓練分類器(第一次迭代中利用從桶2到桶10的資訊訓練分類器)。

(3)利用留存的資料來測試分類器並儲存測試結果。在上例中,這些結果可能如下:

35個籃球運動員被正確分類;

29個非籃球運動員被正確分類。

第3步,對上述結果彙總。

通常情況下我們會將結果放到與下表類似的表格中:
 

分成籃球運動員

分成非籃球運動員

實際為籃球運動員

372

128

實際為非籃球運動員

220

280

在所有500名籃球運動員中,有372人被正確分類。可能需要做的一件事是將右下角的數字也加上去,也就是說1000人當中有652(372+280)人被正確分類。因此得到的精確率為65.2%。與2折或3折交叉驗證相比,基於10折交叉驗證得到的結果可能更接近於分類器的真實效能。之所以這樣,是因為每次採用90%而不是2折交叉驗證中僅僅50%的資料來訓練分類器。