用于在MATLAB中测试模型精度的K折交叉验证

时间:2014-09-07 01:11:03

标签: classification cross-validation matlab model

我真的很难理解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中的其他类型的分类模型,例如:判别分析。感谢任何和所有的输入,提前谢谢!

1 个答案:

答案 0 :(得分:1)

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