我在理解K-NN分类在MATLAB中是如何工作方面遇到了问题。 这是问题,我有一个大型数据集(超过1500个主题的65个功能)及其各自的类标签(0或1)。 根据我的解释,我必须将数据划分为训练,测试和验证子集,以对数据进行监督培训,并通过K-NN对其进行分类。 首先,划分3个子组的最佳比例是什么(每个子组大小的1/3?)。
我研究过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 :(得分:2)
对于第一个问题 “划分3个子组的最佳比例是什么”只有经验法则:
培训数据量最重要。越多越好。 因此,尽可能大,并且肯定比测试或验证数据更大。
测试和验证数据具有类似的功能,因此可以方便地为它们分配相同的数量 数据的。但是有足够的数据来识别过度适应是很重要的。所以他们 应该从数据基础上完全随机选择。
因此,50/25/25或60/20/20分区非常常见。但是,如果您的数据总量相对于所选拓扑的权重总数(例如,网络中的权重为10,数据中只有200个),则为70/15/15甚至80/10/10可能是更好的选择。
关于第二个问题 “进行验证测试有什么意义?”:
通常,您在训练数据上训练所选模型,然后通过将训练模型应用于看不见的数据(验证集)来估计“成功”。
如果您现在完全停止提高准确性的努力,那么您确实不需要三个数据分区。但通常情况下,您认为可以通过以下方式提高模型的成功率:改变权重或隐藏层的数量或......现在大循环开始运行多次迭代:
1)改变权重和拓扑,2)训练,3)验证,不满意,转到1)
这个循环的长期影响是,你越来越多地使你的模型适应验证数据,所以结果变得更好不是因为你如此智能地改进你的拓扑结构,而是因为你无意识地学习了验证集的属性以及如何应付他们。
现在,神经网络的最终且唯一有效的准确度是根据真正看不见的数据估算的:测试集。这只做一次,也有助于揭示过度适应。现在不允许你开始第二个更大的循环来禁止任何对测试集的调整!