以下函数( knn_test )具有以下参数: X 表示数据集样本, Y 表示数据集标签,并且 filterindex 对应于列过滤器。如果要过滤数据,则将filterIndex设置为1,以过滤要过滤的任何列。 我想验证两种保留方法。一个具有 crossval 功能,另一个具有 cvpartition 功能。但是,当我调用此方法时, acc1 和 acc2 变量显示不同的值。
我在代码中添加了断点并调试了代码。我检查了CVKNNModels的partition属性,它与Model 2中的de c partition相同。
以下代码可能出了什么问题?
为什么这两个精度变量取不同的值?
如果要使用此功能进行保留分类,应该选择哪种模型?
谢谢。
function [acc1,acc2]=knn_test(X,Y,filterIndex)
columnfilterIndex = find(filterIndex==1);
%Model 1
tra1Data = X(:,[columnfilterIndex]);
tra1Label=Y;
KNNModel1=fitcknn(tra1Data, tra1Label, 'Distance', 'Euclidean', 'NumNeighbors', 3, 'DistanceWeight', 'Equal', 'Standardize', true);
rng('default');
CVKNNModel = crossval(KNNModel1,'holdout',0.3);
loss=kfoldLoss(CVKNNModel);
acc1=1-loss;
%Model 2
rng('default');
c = cvpartition(Y,'HoldOut',0.3);
tra2Data=X(c.training,[columnfilterIndex]);
tra2Label=Y(c.training,:);
test2Data=X(c.test,[columnfilterIndex]);
test2Label=Y(c.test,:);
KNNModel2 = fitcknn(tra2Data,tra2Label,'Distance', 'Euclidean','NumNeighbors',3, 'DistanceWeight', 'Equal','Standardize', true);
pre_test = predict(KNNModel2,test2Data);
correctPredictions = (pre_test == test2Label);
acc2 = sum(correctPredictions)/length(correctPredictions);
%perf=classperf(uint8(test2Label),uint8(pre_test));
%acc2=perf.CorrectRate;