我真的很难理解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中的其他类型的分类模型,例如:判别分析。感谢任何和所有的输入,提前谢谢!
答案 0 :(得分:1)
如果您问crossval
方法' kfold'选项与自己进行k-fold训练并结合结果相同,那么它原则上是相同的。我可能在代码中遗漏了一些有点不同的东西。例如,我不知道MATLAB函数是否取错误率的平均值,或者通过k倍数的样本大小的任何微小差异来加权。但我相信这两种方法基本相同。