【问题标题】:K-fold cross-validation for testing model accuracy in MATLAB在 MATLAB 中测试模型准确性的 K 折交叉验证
【发布时间】:2014-11-02 08:08:12
【问题描述】:

我在真正理解 MATLAB 的内置交叉验证函数中发生的事情时遇到了一些麻烦。我的目标是开发一个二元分类模型并使用交叉验证来测试其准确性。我正在比较几个不同的模型,但出于本示例的目的,我将仅使用 k 近邻分类。我正在为交叉验证的两个简化版本提供代码:

% INPUTS:
% data = NxM matrix, where N = observations and M = features
% labels = Nx1 matrix with the true labels of each observation

%% Version 1
model = fitcknn(data,labels,'NumNeighbors',kVal); %kVal is some iteratively-determined value

% Calculate misclassification error
cvmodel = crossval(model,'kfold',10);
cvError = kfoldLoss(cvmodel);

% Generate confusion matrix    
predictedLabels = predict(model,data);
R = confusionmat(predictedLabels,labels);


%% Version 2
indices = crossvalind('kfold',labels,10);
confusionMatrix = cell(1,1);
errorMat = zeros(1,10);
for i = 1:10
    test = (indices==i);
    train = ~test;
    knn = fitcknn(data(train,:),labels(train),'NumNeighbors',kVal);
    y = knn.predict(data(test,:));
    index = cellfun(@strcmp,y,labels(test));
    errorMat(i) = sum(index)/length(y);
    confusionMatrix{i} = confusionmat(labels(test),y);
end

% Calculate misclassification error
cvError = 1-mean(errorMat); 

% Generate confusion matrix
R = cat(3,confusionMatrix{:});
R = sum(R,3);

这两种方法中哪一种是正确的实现方式?或者两者都是等价的?这个问题可以推广到 MATLAB 中其他类型的分类模型,例如判别分析。感谢所有输入,在此先感谢!

【问题讨论】:

  • 在您的第一个版本中,您预测的数据与您训练模型时使用的数据相同。如果我没记错的话,你将永远有 100% 的准确率

标签: classification cross-validation matlab model


【解决方案1】:

如果你问crossval方法的'kfold'选项是否与自己进行k-fold训练并结合结果相同,那么原则上是相同的。我可能在您的代码中遗漏了一些有点不同的东西。例如,我不知道 MATLAB 函数是采用错误率的平均值还是通过 k 倍样本大小的任何细微差异来加权它们。但我相信这两种方法基本相同。

【讨论】:

  • 我的主要问题是我的编码方法是否等同于 MATLAB 函数“crossval”和“kfoldLoss”正在执行的操作。换句话说,这两个 matlab 函数背后的方法是否与我的代码版本相同。我还在查看其他一些模型以在 MATLAB 中进行测试,我想确保交叉验证的错误分类错误的计算正确完成。
猜你喜欢
  • 1970-01-01
  • 2017-06-09
  • 2018-12-17
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多