我在理解 MATLAB 中 K-NN 分类的工作原理时遇到问题。´ 问题是,我有一个大型数据集(超过 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)
这个循环的长期影响是,您越来越多地使模型适应验证数据,因此结果变得更好,不是因为您如此明智地改进了拓扑,而是因为您无意识地学习了验证集的属性以及如何来应对他们。
现在,神经网络的最终且唯一有效的准确性是根据真正看不见的数据(测试集)来估计的。这只需要执行一次,并且对于揭示过度适应也很有用。现在不允许您启动第二个更大的循环以禁止对测试集的任何适应!
关于matlab - 如何在MATLAB中使用KNN对数据进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24681540/