2012-11-10 11 views
8

जबकि libsvm डेटा स्केलिंग के लिए टूल प्रदान करता है, जिसमें साइकिट-लर्न (जो एसवीसी क्लासिफायरफायर के लिए libSVM पर आधारित होना चाहिए) मुझे अपने डेटा को स्केल करने का कोई तरीका नहीं मिलता है।विज्ञान-स्कैनिंग डेटा में स्केलिंग-एसवीएम

मूल रूप से मैं 4 विशेषताओं का उपयोग करना चाहता हूं, जिनमें से 3 श्रेणी 0 से 1 तक है और अंतिम एक "बड़ा" अत्यधिक परिवर्तनीय संख्या है।

यदि मैं libSVM में चौथी सुविधा शामिल करता हूं (easy.py स्क्रिप्ट का उपयोग करके जो मेरे डेटा को स्वचालित रूप से स्केल करता है) मुझे कुछ बहुत अच्छे परिणाम मिलते हैं (9 6% सटीकता)। यदि मैं Scikit में चौथा चर शामिल करता हूं- सटीकता सीखें ~ 78% पर ड्रॉप करें - लेकिन अगर मैं इसे बाहर कर देता हूं, तो मुझे वही परिणाम मिलते हैं जब मैं उस सुविधा को छोड़कर libSVM में मिलता हूं। इसलिए मुझे पूरा यकीन है कि यह स्केलिंग खोने की समस्या है।

मैं एसवीएम की स्केलिंग प्रक्रिया को प्रोग्रामेटिक रूप से कैसे दोहरा सकता हूं (यानी svm-scale को कॉल किए बिना)?

उत्तर

6

आप sklearn.preprocessing में है कि कार्यक्षमता है:

>>> from sklearn import preprocessing 
>>> X = [[ 1., -1., 2.], 
...  [ 2., 0., 0.], 
...  [ 0., 1., -1.]] 
>>> X_scaled = preprocessing.scale(X) 

>>> X_scaled           
array([[ 0. ..., -1.22..., 1.33...], 
     [ 1.22..., 0. ..., -0.26...], 
     [-1.22..., 1.22..., -1.06...]]) 

डेटा फिर शून्य मतलब और इकाई विचरण करना होगा।

+0

जानना अच्छा है, धन्यवाद। क्या मुझे परीक्षण डेटा को ट्रेन डेटा के साथ एक साथ मानकीकृत करना चाहिए और बाद में उन्हें टुकड़ा करना चाहिए या क्या मुझे केवल टेस्ट डेटा ही करना चाहिए? – luke14free

+3

इसका उल्लेख [प्रलेखन] (http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling) में किया गया है। मुझे लगता है कि आपको इसे अलग से करना चाहिए, अन्यथा प्रशिक्षण डेटा परीक्षण नमूने से प्रभावित होगा। 'स्केलर' कक्षा के साथ आप प्रशिक्षण डेटा के औसत और मानक विचलन की गणना कर सकते हैं और फिर परीक्षण डेटा में समान परिवर्तन लागू कर सकते हैं। – Maehler

+8

आपको इसके लिए 'स्केलर' का उपयोग करना चाहिए, न कि फ्रीस्टैंडिंग फ़ंक्शन 'स्केल'। एक 'स्केलर' को' पाइपलाइन 'में प्लग किया जा सकता है, उदा। 'scaling_svm = पाइपलाइन ([(" स्केलर ", स्केलर()), (" एसवीएम ", एसवीसी (सी = 1000))])। –

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