1

我在理解K-NN分類是如何在MATLAB中工作時遇到問題。' 這裏有個問題,我有一個大型數據集(超過1500個主題的65個特徵)及其相應類的標籤(0或1)。 根據我已經解釋的內容,我必須將數據分成訓練,測試和驗證子集,以對數據執行監督式訓練,並通過K-NN進行分類。 首先,劃分3個小組的最佳比例是多少(每個數據集大小的1/3)?如何使用KNN對MATLAB中的數據進行分類?

我已經看過ClassificationKNN/fitcknn函數,以及crossval函數(理想地分割數據),但我真的不知道如何使用它們。

綜上所述,我想 - 將數據分成3組 - 「訓練」 KNN(我知道這不是一個需要訓練的方法,但等同於培訓)與訓練子集 - 分類的測試子集並得到它的分類錯誤/性能 - 進行驗證測試有什麼意義?

我希望你能幫幫我,謝謝你提前

編輯:我想我是能夠做到這一點,但是,如果這是不是要求太多了,你可以看到,如果我錯過了什麼?這是我的代碼,一個隨機的情況下:

nfeats=60;ninds=1000; 
trainRatio=0.8;valRatio=.1;testRatio=.1; 
kmax=100; %for instance... 
data=randi(100,nfeats,ninds); 
class=randi(2,1,ninds); 
[trainInd,valInd,testInd] = dividerand(1000,trainRatio,valRatio,testRatio); 
train=data(:,trainInd); 
test=data(:,testInd); 
val=data(:,valInd); 
train_class=class(:,trainInd); 
test_class=class(:,testInd); 
val_class=class(:,valInd); 
precisionmax=0; 
koptimal=0; 
for know=1:kmax 
     %is it the same thing use knnclassify or fitcknn+predict?? 
     predicted_class = knnclassify(val', train', train_class',know); 
     mdl = fitcknn(train',train_class','NumNeighbors',know) ; 
     label = predict(mdl,val'); 
     consistency=sum(label==val_class')/length(val_class); 
     if consistency>precisionmax 
      precisionmax=consistency; 
      koptimal=know; 
     end 
    end 
mdl_final = fitcknn(train',train_class','NumNeighbors',know) ; 
label_final = predict(mdl,test'); 
consistency_final=sum(label==test_class')/length(test_class); 

非常感謝您的所有幫助

+0

我不知道太多關於K-NN在MATLAB方面,但我認爲在這個環節第一個答案解釋了爲什麼你有三個子集:http://stats.stackexchange.com/questions/9357/why - 只 - 三分區培訓驗證測試。 總結(如果你不想讀它),測試是最初適合模型,驗證,調整,然後從中挑選最適合的,並且測試是獲得真實世界的性能規格。 – Zhouster

+0

我認爲我能夠做到這一點,但如果有人可以檢查我的代碼,那就太棒了。我不知道是否有更好的方法比較真正的test_label和預測的標籤。 –

+0

您的編輯看起來不錯,但我沒有使用您的matlab版本,而且我的版本非常不同,所以我無法可靠地確認。抱歉。您應該使用一些具有明顯特徵類關係的實際數據來測試您的程序,而不是隨機數據和類。 –

回答

2

爲了您1日問題「什麼是分3個亞組的最佳比例」有隻有經驗法則:

  1. 訓練數據量是最重要的。越多越好。 因此,使其儘可能大並且絕對大於測試或驗證數據。

  2. 測試和驗證數據具有類似的功能,因此可以方便地爲它們分配相同數量的數據 。但有足夠的數據能夠識別過度適應是非常重要的。因此,他們應該從數據基礎中完全隨機挑選出來。

因此,50/25/25或60/20/20分區是相當普遍的。但是,如果您的總數據量相對於您選擇的拓撲結構的權重總數很小(例如,網絡中有10個權重,數據中只有200個權重),那麼70/15/15甚至80/10/10可能是更好的選擇。

關於你的第二個問題「驗證測試有什麼意義?

通常情況下,您將對訓練數據選擇模型進行訓練,然後通過將訓練模型應用於看不見的數據(驗證集)來評估「成功」。

如果您現在完全停止提高準確性的努力,您確實不需要對數據進行三個分區。但通常情況下,您覺得您可以通過例如改變權重或隱藏層的數量或...現在一個大循環開始與多次迭代運行:

1)變化的權重和拓撲結構,2)列車,3)驗證,不滿意,轉到1)

這個循環的長期效果,越來越多地將模型與驗證數據相匹配,所以結果變得更好,並不是因爲您智能地改進了拓撲,而是因爲您無意識地瞭解了驗證集的屬性以及如何處理它們。現在

,你的神經網絡的最終和唯一有效的精度估計上確實看不到數據:測試集。這隻做一次,對揭示過度適應也很有用。您現在不允許再啓動第二個更大的循環來禁止任何適應測試集!

+0

我喜歡你的答案,但我有一個問題:爲什麼你的體重相對於權重的總數培養更多的,如果你的數據量是巨大的?我想如果你的體重數量更高,那麼你會想要使用更多的訓練數據,以便更好地適應。我只是不明白爲什麼反過來也是如此。 – Zhouster

+0

謝謝,Zhouster。你是對的,我糾正了這段經文。 –

+0

我明白了,它的目的和理論如何劃分和使用子羣,但是如何用KNN來完成呢? 我沒有得到如何使用KNN函數,更不用說如何根據驗證結果來操縱它的權重/拓撲。你能幫助我嗎? 無論哪種方式,感謝您的回答 –

相關問題