在 MATLAB 中测试模型准确性的 K 折交叉验证

Posted

技术标签:

【中文标题】在 MATLAB 中测试模型准确性的 K 折交叉验证【英文标题】:K-fold cross-validation for testing model accuracy in MATLAB 【发布时间】: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);
    confusionMatrixi = 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% 的准确率 【参考方案1】:

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

【讨论】:

我的主要问题是我的编码方法是否等同于 MATLAB 函数“crossval”和“kfoldLoss”正在执行的操作。换句话说,这两个 matlab 函数背后的方法是否与我的代码版本相同。我还在查看其他一些模型以在 MATLAB 中进行测试,我想确保交叉验证的错误分类错误的计算正确完成。

以上是关于在 MATLAB 中测试模型准确性的 K 折交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么?

交叉验证,K折交叉验证的偏差和方差分析

5倍交叉验证如何理解

K折交叉验证

R语言里怎么做十折交叉验证

Matlab中表格上的K折交叉验证