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函数,更不用说如何根据验证结果来操纵它的权重/拓扑。你能帮助我吗? 无论哪种方式,感谢您的回答 –

相关问题