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


k-折交叉驗證(k-fold crossValidation):
在機器學習中,將數據集A分為訓練集(training set)B和測試集(test set)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);//進行隨機分包
    for k=1:10//交叉驗證k=10,10個包輪流作為測試集
        test = (indices == k); //獲得test集元素在數據集中對應的單元編號
        train = ~test;//train集元素的編號為非test元素的編號
        train_data=data(train,:);//從數據集中划分出train樣本的數據
         train_target=target(:,train);//獲得樣本集的測試目標,在本例中是train樣本的實際分類情況
        test_data=data(test,:);//test樣本集
        test_target=target(:,test);//test的實際分類情況

        ...........

      end

****************************************************************************************************

crossvalind函數

關於crossvalind函數 盛經緯 jevonsheng@163.com 

crossvalind是cross-valindation的縮寫,意即交叉檢驗。 常用的形式有: 

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

②[Train, Test] = crossvalind('HoldOut',N, P) ③[Train, Test] = crossvalind('LeaveMOut',N, M) 

④[Train, Test] = crossvalind('Resubstitution',N, [P,Q])  

①indices =crossvalind('Kfold', N, K): 

該命令返回一個對於N個觀察樣本的K個fold(意為折,有“層”之類的含義,感覺還是英文意思更形象)的標記(indices)。該標記中含有相 同(或者近似相同)比例的1—K的值,將樣本分為K個相斥的子集。在K-fold交叉檢驗中,K-1個fold用來訓練,剩下的一個用來測試。此過程循環 K次,每次選取不同的fold作為測試集。K的缺省值為5。 使用程序: 

[m n]=size(data); %data為樣本集合。每一行為一個觀察樣本 

indices = crossvalind('Kfold',m,10); %產生10個fold,即indices里有等比例的1-10 

for i=1:10 

test=(indices==i); %邏輯判斷,每次循環選取一個fold作為測試集 train=~test; %取test的補集作為訓練集,即剩下的9個fold 

data_train=data(trian,:); %以上得到的數都為邏輯值,用與樣本集的選 取 label_train=label(train,:); %label為樣本類別標簽,同樣選取相應的訓練 集 data_test=data(test,:); %同理選取測試集的樣本和標簽 label_test=label(test,:); end 

 

②[Train, Test] = crossvalind('HoldOut',N, P): 

該命令返回一個邏輯值的標記向量,從N個觀察樣本中隨機選取(或近似於)P*N個樣本作為測試集。故P應為0-1,缺省值為0.5。 使用程序: 

groups=ismenber(label,1); %label為樣本類別標簽,生成一個邏輯矩陣groups,1用來邏輯判斷篩選 

[train, test] = crossvalind('holdOut',groups); %將groups分類,默認比例1:1,即P=0.5 

 

③[Train, Test] = crossvalind('LeaveMOut',N, M): 

該命令返回一個邏輯值的標記向量,從N個觀察樣本中隨機選取M個樣本作為測試集。M的缺省值為1。值得注意的是,LeaveMOut在循環中使用不能保證產生的是互補集合,即每次循環的隨機選取是獨立的。如果要用互補的話還是使用Kfold命令。 使用程序: 

[m,n]=size(data); 

[train,test]=crossvalind('LeaveMOut',m,10) 

svmStruct = svmtrain(data(train,:),groups(train));  classes = svmclassify(svmStruct,data(test,:));  cp=classperf(groups); cr=cp.CorrectRate  

④[Train, Test] = crossvalind('Resubstitution',N, [P,Q]): 

本函數為②的一個特殊情況。當我不想把P*N剩下的部分全部作為訓練集的時候使用該函數,用Q指定一個比例,選取Q*N作為訓練集。兩個集合的選取以最小化交集為原則。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM