我在理解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);
非常感谢您的所有帮助
我不知道太多关于K-NN在MATLAB方面,但我认为在这个环节第一个答案解释了为什么你有三个子集:http://stats.stackexchange.com/questions/9357/why - 只 - 三分区培训验证测试。 总结(如果你不想读它),测试是最初适合模型,验证,调整,然后从中挑选最适合的,并且测试是获得真实世界的性能规格。 – Zhouster
我认为我能够做到这一点,但如果有人可以检查我的代码,那就太棒了。我不知道是否有更好的方法比较真正的test_label和预测的标签。 –
您的编辑看起来不错,但我没有使用您的matlab版本,而且我的版本非常不同,所以我无法可靠地确认。抱歉。您应该使用一些具有明显特征类关系的实际数据来测试您的程序,而不是随机数据和类。 –