libsvm

2012-01-28 16 views
15

के साथ क्रॉस सत्यापन के बाद पुनः प्रयास करना मुझे पता है कि अच्छे पैरामीटर का चयन करने के लिए क्रॉस सत्यापन का उपयोग किया जाता है। उन्हें खोजने के बाद, मुझे -v विकल्प के बिना पूरे डेटा को पुनः प्रशिक्षित करने की आवश्यकता है।libsvm

लेकिन मुझे जिस समस्या का सामना करना पड़ता है वह यह है कि मैं -v विकल्प के साथ ट्रेन करने के बाद, मुझे क्रॉस-सत्यापन सटीकता (उदाहरण 85%) मिलती है। कोई मॉडल नहीं है और मैं सी और गामा के मूल्यों को नहीं देख सकता। उस मामले में मैं कैसे बचूं?

बीटीडब्ल्यू मैं 10 गुना क्रॉस सत्यापन लागू करता हूं। जैसे

optimization finished, #iter = 138 
nu = 0.612233 
obj = -90.291046, rho = -0.367013 
nSV = 165, nBSV = 128 
Total nSV = 165 
Cross Validation Accuracy = 98.1273% 

इस पर कुछ मदद चाहिए ..

सबसे अच्छा सी और गामा पाने के लिए, मैं इस कोड है कि LIBSVM पूछे जाने वाले प्रश्न

bestcv = 0; 
for log2c = -6:10, 
    for log2g = -6:3, 
    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('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, bestcv); 
    end 
end 

एक और सवाल में उपलब्ध है का उपयोग करें: है -v विकल्प का उपयोग करने के बाद क्रॉस-सत्यापन सटीकता, जब हम बिना विकल्प के ट्रेन करते हैं और भविष्यवाणी करने के लिए उस मॉडल का उपयोग करते हैं तो हमें मिलता है? क्या दो सटीकता समान हैं?

एक और सवाल: क्रॉस-सत्यापन मूल रूप से ओवरफिटिंग से बचकर मॉडल की शुद्धता में सुधार करता है। इसलिए, इसे सुधारने से पहले इसे एक मॉडल में रखना आवश्यक है। क्या मैं सही हू? इसके अलावा, अगर मेरे पास एक अलग मॉडल है, तो क्रॉस-सत्यापन सटीकता अलग होगी? क्या मैं सही हू?

एक और सवाल: क्रॉस-सत्यापन सटीकता में, सी और गामा का मूल्य क्या है?

ग्राफ इस enter image description here

की तरह कुछ तो सी के मूल्यों 2 और गामा = .००,७८,१२५ हो रहा है। लेकिन जब मैं नए पैरामीटर के साथ मॉडल को पुनः प्रशिक्षित करता हूं। मान 99.63% के समान नहीं है। क्या कोई कारण हो सकता है? अग्रिम धन्यवाद ...

उत्तर

29

यहाँ -v विकल्प वास्तव में मतलब है, एक तरह से overfitting समस्या (से बचने के लिए बजाय प्रशिक्षण के लिए पूरे डेटा का उपयोग कर के रूप में प्रयोग की जाने वाली N-1 पर एक एन गुना पार सत्यापन प्रशिक्षण प्रदर्शन शेष गुना पर गुना और परीक्षण, एक बार में, फिर औसत सटीकता की रिपोर्ट करें)। इस प्रकार यह केवल वास्तविक एसवीएम मॉडल की बजाय स्केलर संख्या के रूप में क्रॉस-सत्यापन सटीकता (मान लेता है कि आपके पास वर्गीकरण समस्या है, अन्यथा प्रतिक्रिया के लिए माध्य-स्क्वायर त्रुटि है) मानती है।

आप मॉडल चयन करना चाहते हैं, तो आप एक ग्रिड खोज पार सत्यापन (grid.py सहायक अजगर स्क्रिप्ट के समान) का उपयोग कर लागू करने के लिए, C और gamma का सबसे अच्छा मूल्यों को खोजने के लिए है।

इसे कार्यान्वित करना मुश्किल नहीं होना चाहिए: मेसग्रिड का उपयोग करके मूल्यों का ग्रिड बनाएं, कुल मिलाकर सभी जोड़े (C,gamma) एक एसवीएम मॉडल को 5 गुना क्रॉस-सत्यापन के साथ प्रशिक्षण दें, और सर्वोत्तम सीवी-सटीकता वाले मानों का चयन करें। ..

उदाहरण:

%# read some training data 
[labels,data] = libsvmread('./heart_scale'); 

%# grid of parameters 
folds = 5; 
[C,gamma] = meshgrid(-5:2:15, -15:2:3); 

%# grid search, and cross-validation 
cv_acc = zeros(numel(C),1); 
for i=1:numel(C) 
    cv_acc(i) = svmtrain(labels, data, ... 
        sprintf('-c %f -g %f -v %d', 2^C(i), 2^gamma(i), folds)); 
end 

%# pair (C,gamma) with best accuracy 
[~,idx] = max(cv_acc); 

%# contour plot of paramter selection 
contour(C, gamma, reshape(cv_acc,size(C))), colorbar 
hold on 
plot(C(idx), gamma(idx), 'rx') 
text(C(idx), gamma(idx), sprintf('Acc = %.2f %%',cv_acc(idx)), ... 
    'HorizontalAlign','left', 'VerticalAlign','top') 
hold off 
xlabel('log_2(C)'), ylabel('log_2(\gamma)'), title('Cross-Validation Accuracy') 

%# now you can train you model using best_C and best_gamma 
best_C = 2^C(idx); 
best_gamma = 2^gamma(idx); 
%# ... 

contour_plot

+0

मैंने प्रश्न संपादित किया है ... – lakesh

+0

भयानक कोड, धन्यवाद ... एक और qn: वह बिंदु जहां सटीकता मान सर्वश्रेष्ठ सी और गामा का स्थान है। क्या मैं सही हू? – lakesh

+2

@lakesh: सही, बस याद रखें कि ग्राफ को लॉग 2 स्केल के साथ खींचा गया है (इसलिए यहां सबसे अच्छे मान 'सी = 2^9' और गामा =' 2^-11' हैं) – Amro

1

आप अपने पूरे डाटासेट का उपयोग करते हैं तो उस डेटासेट पर प्रशिक्षित, अपने मानकों को निर्धारित करने के लिए, आप अपने डेटा overfit जा रहे हैं।आदर्श रूप में, आप डेटासेट को विभाजित करेंगे, एक भाग (पैरामीटर के साथ) पर पैरामीटर खोज करें, फिर सीवी के साथ ट्रेन और परीक्षण के लिए दूसरे भाग का उपयोग करें। यदि आप दोनों के लिए संपूर्ण डेटासेट का उपयोग करते हैं तो क्या आपको बेहतर परिणाम मिलेंगे? बेशक, लेकिन आपका मॉडल अच्छी तरह से सामान्यीकृत नहीं होने की संभावना है। यदि आप अपने मॉडल के सही प्रदर्शन को निर्धारित करना चाहते हैं, तो आपको अलग-अलग पैरामीटर चयन करने की आवश्यकता है।

+0

, पैरामीटर चयन से आपका क्या मतलब है ? क्या आप एक निश्चित हिस्से पर पैरामीटर निर्धारित करने का मतलब है। – lakesh

+1

अस्पष्ट होने के लिए मैं क्षमा चाहता हूं। पैरामीटर चयन यह निर्धारित करने का कार्य है कि कौन से पैरामीटर आपके डेटासेट के लिए सबसे अच्छा काम करते हैं (वास्तव में डेटासेट के पूरे डोमेन और भविष्य के डेटा के लिए सबसे अच्छा काम करता है जिसे आप वर्गीकृत करने में सक्षम होना चाहते हैं।) मेरा आखिरी बयान सिर्फ यही था कि मैंने जो कहा उपर्युक्त पैरामीटर चयन अलग-अलग पैरामीटर को समझने के लिए डेटासेट के एक अलग हिस्से का उपयोग करने का मतलब है, फिर जब आप अप्रयुक्त हिस्से पर ट्रेन करते हैं तो उन पैरामीटर का उपयोग करें। – karenu

+0

एक क्यूएन: क्या मैं ग्रिड खोज करने के लिए पूरे डेटा सेट को 10% में विभाजित करता हूं और उस पैरामीटर के साथ मॉडल को 70% पर प्रशिक्षित करता हूं और शेष 20% पर इसका परीक्षण करता हूं? क्या आपको लगता है कि यह एक अच्छा विचार है? – lakesh

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