获得我的testlabel和trainlabel之后,我在libsvm上实现了SVM,我得到了97.4359%的准确率。 (c = 1且g = 0.00375)
model = svmtrain(TrainLabel, TrainVec, '-c 1 -g 0.00375');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);
找到最好的c和g后,
bestcv = 0;
for log2c = -1:3,
for log2g = -4:1,
cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
cv = svmtrain(TrainLabel,TrainVec, cmd);
if (cv >= bestcv),
bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
end
fprintf('%g %g %g (best c=%g, g=%g, rate=%g)\n', log2c, log2g, cv, bestc, bestg, bestcv);
end
end
c = 8且g = 0.125
我再次实施该模型:
model = svmtrain(TrainLabel, TrainVec, '-c 8 -g 0.125');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);
我的准确率为82.0513%
如何降低准确度?不应该增加?或者我犯了什么错误?
答案 0 :(得分:4)
您在参数调整期间获得的准确度有偏差,因为您预测的是您正在训练的相同数据。这通常适用于参数调整。
但是,如果您希望这些准确度能够准确估计最终测试集上的真正泛化错误,那么您必须添加额外的交叉验证包或其他重新采样方案。
这是一篇非常明确的文章,概述了一般性问题(但在特征选择的类似背景下):http://www.pnas.org/content/99/10/6562.abstract
修改强>:
我通常会添加交叉验证,如:
n = 95 % total number of observations
nfold = 10 % desired number of folds
% Set up CV folds
inds = repmat(1:nfold, 1, mod(nfold, n))
inds = inds(randperm(n))
% Loop over folds
for i = 1:nfold
datapart = data(inds ~= i, :)
% do some stuff
% save results
end
% combine results
答案 1 :(得分:1)
要进行交叉验证,您应该分割训练数据。在这里,您可以测试训练数据,以找到最佳参数集。这不是一个好的措施。您应该使用以下伪代码:
for param = set of parameter to test
[trainTrain,trainVal] = randomly split (trainSet); %%% you can repeat that several times and take the mean accuracy
model = svmtrain(trainTrain, param);
acc = svmpredict(trainVal, model);
if accuracy is the best
bestPAram = param
end
end