2012-01-20 16 views
5

मेरी testlabel और trainlabel प्राप्त करने के बाद, मैंने libsvm पर SVM लागू किया और मुझे 97.435 9% की सटीकता मिली। (ग = 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

मैं 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

संपादित:

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

मेरे कोड में क्या गलत है? यह सबसे अच्छा सी और गामा खोजने के लिए पुनरावृत्त करता है ... – lakesh

+0

यह उन्होंने LIBSVM FAQ में दिया था: csie.ntu.edu.tw/~cjlin/libsvm/faq.html पैरामीटर चयन के लिए मैं MATLAB इंटरफ़ेस का उपयोग कैसे कर सकता हूं? – lakesh

+0

मैं पहले से ही अपने कोड में क्रॉस सत्यापन चीज कर रहा हूं .. – lakesh

संबंधित मुद्दे