2012-01-20 14 views
5

azaldı Test etiketimi ve antrenman etiketini aldıktan sonra, libsvm üzerine SVM uyguladı ve% 97.4359 doğruluk elde ettim. Ben modeli tekrar uygulamakLibSVM'nin doğruluğu

ı iyi c ve g bulduktan sonra
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 ve g = 0,125

(= 0,00375 c = 1 ve g)

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

Ben 82,0513 doğruluğu% olsun

Doğruluğun azaltılması nasıl mümkün olabilir? artmamalıdır? Yoksa herhangi bir hata mı yapıyorum?

+0

Ben LIBSVM en Matlab API ile aşina değilim ama emin misin 'cv = svmtrain (TrainLabel, TrainVec, cmd);' Size doğruluğu verecek? –

+0

LIBSVM SSS'de neler verdiler? Http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html Altında parametre seçimi için MATLAB arayüzünü nasıl kullanabilirim? – lakesh

cevap

4

Parametre ayarlaması sırasında aldığınız doğruluklar, önyargılı olduğunuzdan, aynı eğitim verdiğiniz verileri tahmin ettiğiniz için önyargılıdır. Bu, parametre ayarlaması için genellikle iyidir. Bununla birlikte, eğer bu doğruluk oranlarının son test kümenizdeki doğru genelleme hatasının doğru tahminlerini olmasını istiyorsanız, ek bir çapraz doğrulama veya başka bir yeniden örnekleme planı eklemeniz gerekir. Burada

genel sorunu ortaya koyan çok açık bir kağıttır (ancak özellik seçimi benzer bir bağlamda): http://www.pnas.org/content/99/10/6562.abstract

DÜZENLEME:

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 
:

Genellikle gibi çapraz doğrulama ekleyin

+0

Ek çapraz doğrulama ekini nasıl ekliyorsunuz? – lakesh

+0

@lakesh Bkz. Düzenle. İyi şanslar! –

+0

sadece netleştirmek için: LIBSVM bunu yapmıyor mu? yazmanız gereken her şey "-v n" dir, burada n kat sayısıdır. – lakesh

1

Doğrulamayı geçmek için egzersiz verilerinizi bölmeniz gerekir. Burada en iyi parametre setinizi bulmak için egzersiz verilerini test edin. Bu iyi bir ölçü değil. Aşağıdaki sözde kod kullanmalıdır:

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

Kodumdaki sorun nedir? en iyi c ve gamma'yı bulmak için yinelem ... – lakesh

+0

bu LIBSVM'de ne verdiler? SSS: csie.ntu.edu.tw/~cjlin/libsvm/faq.html Altında parametre seçimi için MATLAB arayüzünü nasıl kullanabilirim? – lakesh

+0

Kodumda çapraz doğrulama işlemini zaten yapıyorum. – lakesh