2012-01-20 13 views
5

Po uzyskaniu mojej testlabel i trainlabel zaimplementowałem SVM na libsvm i uzyskałem dokładność 97,4359%. (C = 1, a g = 0,00375)Dokładność LibSVM maleje

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

Po tym, jak znaleźć C i 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

zaimplementować model jeszcze:

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

uzyskać dokładność 82.0513%

Jak można zmniejszyć dokładność? czy nie powinno to wzrosnąć? Czy robię jakiś błąd?

+0

Nie jestem zaznajomiony z LibSVM za Matlab API, ale są na pewno 'cv = svmtrain (TrainLabel, TrainVec, cmd);' daje dokładność? –

+0

to było to, co dali w LIBSVM FAQ: http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html pod Jak mogę użyć interfejsu MATLAB do wyboru parametrów? – lakesh

Odpowiedz

4

Dokładności uzyskane podczas dostrajania parametrów są przesunięte w górę, ponieważ przewidywałeś te same dane, które trenowałeś. Często jest to w porządku w przypadku dostrajania parametrów.

Jednakże, jeśli chcesz, aby dokładności te były dokładnymi szacunkami prawdziwego błędu generalizacji w twoim ostatecznym zestawie testowym, musisz dodać dodatkowy zawijas sprawdzania poprawności krzyżowej lub inny schemat resamplingu.

Tutaj jest bardzo jasny papier nakreśla ogólny problem (ale w podobnym kontekście selekcji cech): http://www.pnas.org/content/99/10/6562.abstract

EDIT:

I zazwyczaj dodać krzyżowej walidacji jak:

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

jak dodać dodatkowy oblewanie sprawdzania krzyżowego? – lakesh

+0

@lakesh Zobacz edytuj. Powodzenia! –

+0

tylko w celu wyjaśnienia: Czy LIBSVM nie robi tego? wszystko, co musisz wpisać, to "-v n", gdzie n oznacza liczbę zgięć. – lakesh

1

Aby wykonać walidację krzyżową, należy podzielić dane treningowe. Tutaj możesz sprawdzić dane treningowe, aby znaleźć najlepszy zestaw parametrów. To nie jest dobra miara. Należy użyć następującego kodu pseudo:

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

co jest nie tak z moim kodem? iteruje, aby znaleźć najlepsze c i gamma ... – lakesh

+0

to było to, co dali w LIBSVM FAQ: csie.ntu.edu.tw/~cjlin/libsvm/faq.html pod Jak mogę użyć interfejsu MATLAB do wyboru parametrów? – lakesh

+0

Już robię rzecz sprawdzania poprawności w moim kodzie. – lakesh