k-折交叉驗證(k-fold crossValidation)

k-重交叉驗證(k-fold crossValidation):

在機器學習中,將數據集A 分爲訓練集(training set)B和測試集(testset)C,在樣本量不充足的情況下,爲了充分利用數據集對算法效果進行測試,將數據集A隨機分爲k個包,每次將其中一個包作爲測試集,剩下k-1個包作爲訓練集進行訓練。
在matlab中,可以利用:
indices=crossvalind('Kfold',x,k);
來實現隨機分包的操作,其中x爲一個N維列向量(N爲數據集A的元素個數,與x具體內容無關,只需要能夠表示數據集的規模),k爲要分成的包的總個數,輸出的結果indices是一個N維列向量,每個元素對應的值爲該單元所屬的包的編號(即該列向量中元素是1~k的整隨機數),利用這個向量即可通過循環控制來對數據集進行劃分。例:

[M,N]=size(data);//數據集爲一個M*N的矩陣,其中每一行代表一個樣本
indices=crossvalind('Kfold',data(1:M,N),10);//進行隨機分包
fork=1:10//交叉驗證k=10,10個包輪流作爲測試集
test = (indices == k); //獲得test集元素在數據集中對應的單元編號
train = ~test;//train集元素的編號爲非test元素的編號
train_data=data(train,:);//從數據集中劃分出train樣本的數據
train_target=target(:,train);//獲得樣本集的測試目標,在本例中是實際分類情況
test_data=data(test,:);//test樣本集
test_target=target(:,test);



今天用到crossvalind. 這個適用於Cross validation。中文應該叫做交叉驗證。我主要想說說這個函數怎麼用的。舉個簡單的例子;

P_train=[1 2 3 4 5 6 7 8 ]'
P_train =

     1
     2
     3
     4
     5
     6
     7
     8
Indices=crossvalind('Kfold',8,4)
Indices =

     2
     3
     4
     1
     4
     1
     3
     2
看到Incides了嗎,這個是問題的關鍵,他把所有的點分成4類。數字一樣的是一類,Indices=crossvalind('Kfold',8,4)中‘8’代表元素的個數,‘4’代表分成幾類,因爲有四類,每類應該有8/4兩個元素,看indices中,每個相同的數字有兩個元素,這樣就能完成分類了。
正常都是需要循環4次,這裏的‘4’和crossvalind中的參數‘4’是一樣的。比如第一次循環令i=1;
得到indicies中是‘1’的,把其中的相應的設置爲‘1’,其餘的爲零。
val_set_index=(Indices==1)
這個是對於test的(validation)驗證
val_set_index =

     0
     0
     0
     1
     0
     1
     0
     0
 train_set_index=~val_set_index
這個是train的(訓練分類器)
train_set_index =

     1
     1
     1
     0
     1
     0
     1
     1
這兩個結果加在一起是一個全爲1的向量。
若果我想提取其中的test,用下面語句:
>>val_ma=P_train(val_set_index,:);%val_set_index=[0 0 0 1 0 1 0 0]'
>> val_ma
val_ma =

     4
     6
看見沒,得到相應的測試元素



十折交叉驗證

(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次,可累積得到總的錯誤分類率。

發佈了7 篇原創文章 · 獲贊 13 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章