2012-01-20 2 views
5

После получения моей testlabel и trainlabel, я реализовал SVM на libsvm, и я получил точность 97.4359%. (С = 1 и г = 0,00375)Точность LibSVM уменьшается

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

После того, как я найти лучший с и г,

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 

с = 8 и г = 0,125

Я реализовать модель снова:

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

Я получаю точность 82.0513%

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

+0

Я не знаком с Matlab API LibSVM, но вы уверены, что 'резюме = svmtrain (TrainLabel, TrainVec, CMD);' даст вам точность? –

+0

Это то, что они давали в LIBSVM FAQ: http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html в разделе Как я могу использовать интерфейс MATLAB для выбора параметров? – lakesh

ответ

4

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

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

Здесь очень ясно документ, который описывает общую проблему (но в аналогичном контексте выбора функции): 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 
+0

Как вы добавляете дополнительную проверку перекрестной проверки? – lakesh

+0

@lakesh См. Редактирование. Удачи! –

+0

только для уточнения: не LIBSVM это делает? все, что нужно ввести, это «-v n», где n - число сгибов. – lakesh

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 
+0

Что случилось с моим кодом? он выполняет итерацию, чтобы найти лучшие c и gamma ... – lakesh

+0

Это то, что они давали в LIBSVM FAQ: csie.ntu.edu.tw/~cjlin/libsvm/faq.html в разделе Как я могу использовать интерфейс MATLAB для выбора параметров? – lakesh

+0

Я уже делаю проверку креста в своем коде. – lakesh