matlab - 如何在MATLAB中使用KNN对数据进行分类?

标签 matlab machine-learning classification knn supervised-learning

我在理解 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 个子组的最佳比例是多少”,只有经验法则:

  1. 训练数据量是最重要的。越多越好。 因此,使其尽可能大,并且绝对大于测试或验证数据。

  2. 测试数据和验证数据具有相似的功能,因此可以方便地为它们分配相同的数量 数据的。但重要的是要有足够的数据来识别过度适应。所以他们 应从数据基础中完全随机选取。

因此,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/

相关文章:

Matlab:当我放大 plotyy 图时,yTicks 不会自动更新

java - 使用 Jama 数学库的 sigmoid 函数在 sigmoidfunction 中没有输出

python - 为什么 GridSearchCV 模型结果与我手动调整的模型不同?

machine-learning - 使用机器学习让计算机学习微积分

matlab - 使用 hmm 对序列进行分类的基本帮助

machine-learning - KNN算法,测试点成为训练集吗?

matlab - 从 .mexglx 到 .mex

Matlab,如何计算AUC(曲线下面积)?

oop - MATLAB和全局变量的使用?

python - 如何在 Keras 中组合两个具有不同输入大小的 LSTM 层?