我在理解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);
非常感谢您的帮助
对于第一个问题 “将3个子组划分的最佳比例是多少”,只有经验法则:
训练数据的数量是最重要的。越多越好。因此,使其尽可能大,并且绝对大于测试或验证数据。
测试和验证数据具有相似的功能,因此为它们分配相同数量的数据非常方便。但重要的是要有足够的数据以识别过度适应。因此,应该从数据基础上完全随机地选择它们。
因此,50/25/25或60/20/20分区非常普遍。但是,如果您的数据总量相对于所选拓扑的权重总数而言较小(例如,网络中的权重为10,数据中的权重为200),则70/15/15甚至80/10/10可能是更好的选择。
关于您的第二个问题 “进行验证测试有什么意义?” :
通常,您在训练数据上训练选定的模型,然后通过将训练后的模型应用于看不见的数据(验证集)来估计“成功”。
如果现在您将完全停止提高准确性的工作,那么您确实不需要数据的三个分区。但是通常,您认为可以通过例如更改权重或隐藏层的数量或...来提高模型的成功率,现在,大循环开始进行许多迭代:
1)更改权重和拓扑,2)训练,3)验证,不满意,转到1)
此循环的长期影响是,您使模型越来越适应验证数据,因此结果会有所改善,这不是因为您如此智能地改善了拓扑结构,而是因为您在不知不觉中学习了验证集的属性以及如何应对他们。
现在,根据真正看不见的数据(测试集)估算出神经网络的最终且唯一有效的准确性。这仅执行一次,并且对于揭示过度适应也很有用。现在不允许您开始第二个甚至更大的循环,以禁止对测试集进行任何修改!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句