【发布时间】: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