得到我的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%

精度如何降低?不应该增加吗?还是我有任何错误?

最佳答案

在参数调整过程中获得的精度会向上偏移,因为您预测的是与训练中相同的数据。这通常对于参数调整很合适。

但是,如果您希望这些精度是最终测试集上真实泛化误差的准确估计,则必须添加交叉验证或其他重采样方案的附加包装。

这是一篇非常清晰的论文,概述了一般性问题(但在功能选择的相似上下文中):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

关于matlab - LibSVM的准确性降低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8945229/

10-12 21:16