Точность LibSVM снижается - PullRequest
       10

Точность LibSVM снижается

5 голосов
/ 20 января 2012

Получив тестовую метку и метку поезда, я внедрил SVM на libsvm и получил точность 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

IРеализуйте модель снова:

 model = svmtrain(TrainLabel, TrainVec, '-c 8 -g 0.125');
[predict_label, accuracy, dec_values] = svmpredict(TestLabel, TestVec, model);

Я получаю точность 82,0513%

Как можно снизить точность?не должно ли это увеличиться?Или я ошибаюсь?

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Точность, которую вы получили во время настройки параметров, смещена вверх, потому что вы предсказывали те же данные, которые вы тренировали. Это часто хорошо для настройки параметров.

Однако, если вы хотите, чтобы эти погрешности были точными оценками истинной ошибки обобщения в вашем окончательном наборе тестов, то вам нужно добавить дополнительную обертку перекрестной проверки или другую схему повторной выборки.

Вот очень четкая статья, в которой излагается общая проблема (но в аналогичном контексте выбора возможностей): http://www.pnas.org/content/99/10/6562.abstract

EDIT

Я обычно добавляю перекрестную проверку как:

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 голос
/ 20 января 2012

Чтобы сделать перекрестную проверку, вы должны разделить данные тренировки.Здесь вы проверяете данные тренировки, чтобы найти свой лучший набор параметров.Это не очень хорошая мера.Вы должны использовать следующий псевдокод:

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
...