2012-01-20 4 views
5

내 testlabel 및 trainlabel을 얻은 후 libsvm에서 SVM을 구현했으며 정확도는 97.4359 %입니다. 내가 모델을 다시 구현정확도 LibSVM 감소

내가 최고의 C와 g를 찾은 후
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 

C = 8, g = 0.125

(= 0.00375 C = 1 g) :

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

나는 82.0513 %의 정확도를 얻을 수

정확도를 어떻게 낮출 수 있습니까? 그것을 증가 시켜서는 안됩니까? 아니면 내가 실수 한거야?

+0

내가 LibSVM의 매트랩 API에 익숙하지 않은 해요,하지만 당신은 확신'CV = 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

편집 :

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와 감마를 찾기 위해 반복합니다 ... – lakesh

+0

이것은 LIBSVM FAQ에서 제공 한 것입니다 : csie.ntu.edu.tw/~cjlin/libsvm/faq.html 어떻게 매개 변수 선택을 위해 MATLAB 인터페이스를 사용할 수 있습니까? – lakesh

+0

내 코드에서 이미 교차 유효성 검사를하고 있습니다. – lakesh