2012-02-15 8 views
32

में उपयोग करने योग्य सबसे तेज़ एसवीएम कार्यान्वयन मैं पाइथन में कुछ पूर्वानुमान मॉडल तैयार कर रहा हूं और विज्ञान के सीखने के एसवीएम कार्यान्वयन का उपयोग कर रहा हूं। यह वास्तव में महान, उपयोग करने में आसान, और अपेक्षाकृत तेज़ रहा है।पायथन

दुर्भाग्यवश, मैं अपने रनटाइम से बाध्य होना शुरू कर रहा हूं। मैं 650 फीचर्स के साथ लगभग 4-5000 के पूर्ण डेटासेट पर आरबीएफ एसवीएम चलाता हूं। प्रत्येक रन में लगभग एक मिनट लगते हैं। लेकिन 5 गुना क्रॉस सत्यापन + ग्रिड सर्च (ठीक खोज के लिए मोटे का उपयोग करके) के साथ, यह मेरे काम के लिए थोड़ा सा असफल हो रहा है। तो आम तौर पर, क्या लोगों को पाइथन में उपयोग किए जा सकने वाले सबसे तेज़ एसवीएम कार्यान्वयन के मामले में कोई सिफारिशें हैं? वह, या मेरे मॉडलिंग को गति देने के किसी भी तरीके?

मैंने LIBSVM के GPU कार्यान्वयन के बारे में सुना है, ऐसा लगता है कि यह काम कर सकता है। मुझे पाइथन में उपयोग करने योग्य किसी अन्य जीपीयू एसवीएम कार्यान्वयन के बारे में पता नहीं है, लेकिन यह निश्चित रूप से दूसरों के लिए खुला होगा। साथ ही, GPU का उपयोग करके रनटाइम में काफी वृद्धि होती है?

मैंने यह भी सुना है कि विज्ञान में रैखिक एसवीएम + फीचर मैप का उपयोग करके आरबीएफ एसवीएम को अनुमानित करने के तरीके हैं। यह सुनिश्चित नहीं है कि लोग इस दृष्टिकोण के बारे में क्या सोचते हैं। फिर, इस दृष्टिकोण का उपयोग करने वाले किसी भी व्यक्ति, क्या यह रनटाइम में एक महत्वपूर्ण वृद्धि है?

कार्यक्रम की गति बढ़ाने के लिए सभी विचारों का स्वागत है।

उत्तर

26

मुझे पता है कि सबसे स्केलेबल कर्नेल एसवीएम कार्यान्वयन LaSVM है। यदि आप Cython, ctypes या cffi जानते हैं तो यह पाइथन में लपेटने योग्य है। वैकल्पिक रूप से आप इसे कमांड लाइन से उपयोग कर सकते हैं। NumPy या सीएसआर प्रारूप से डेटा को कनवर्ट करने के लिए sklearn.datasets में यूटिलिटीज का उपयोग कर सकते हैं, जो एसएसएमएलआईटी स्वरूपित फाइलों में लाएएसवीएम प्रशिक्षण/परीक्षण सेट के रूप में उपयोग कर सकते हैं।

+0

धन्यवाद ओग्रीसेल। मैं इसे देख लूंगा। निश्चित रूप से दिलचस्प लग रहा है। Sklearn एसवीएम प्रकाश प्रारूप में निर्यात कर सकते हैं? यह निश्चित रूप से उपयोगी होगा। आपके पूर्व उत्तर के जवाब में, दुर्भाग्यवश, मैं टाइम्सरीज़ से निपट रहा हूं, इसलिए यादृच्छिक नमूनाकरण + ट्रेन/टेस्ट में थूकना थोड़ा और जटिल हो जाता है। यकीन नहीं है कि मेरे मॉडल को प्रशिक्षित करने के लिए subsampling सब सीधा होगा। धन्यवाद! – tomas

+0

क्षमा करें त्वरित जोड़ों ogrisel, क्या आप जानते हैं कि sklearn में उपयोगिता समारोह एसवीएम प्रकाश प्रारूप में निर्यात कर सकते हैं? – tomas

+0

वास्तव में यह दस्तावेज़ से गायब है लेकिन यह वहां है: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/svmlight_format.py#L142 – ogrisel

2

एसवीएम पुस्तकालयों की तुलना में बहुत कुछ करने के बिना, मुझे लगता है कि आप जिस कार्य का वर्णन कर रहे हैं (क्रॉस-सत्यापन) वास्तविक बहु-थ्रेडिंग से लाभ उठा सकता है (यानी कई सीपीयू समानांतर में चल रहे हैं)। यदि आप CPython का उपयोग कर रहे हैं, तो यह GIL के कारण आपकी (संभवतः) -मल्टी-कोर मशीन का लाभ नहीं लेता है।

आप पाइथन के अन्य कार्यान्वयनों को आजमा सकते हैं जिनके पास यह सीमा नहीं है। यदि आप .NET पर जाने के इच्छुक हैं तो PyPy या IronPython देखें।

+0

धन्यवाद bavaza मैं इस पर उसकी समीक्षा करेंगे। मान लीजिए कि मैं अपने मल्टीकोर कंप्यूटर का लाभ उठाता हूं, मेरे कार्यक्रम को तेज करने के लिए कोई अन्य सुझाव? मैं वैसे भी कई धागे में मान्य पार करने के लिए एक रास्ता बाहर जा रहा था। हालांकि, मुझे लगता है कि मुझे अभी भी गति की आवश्यकता है। – tomas

+0

@bavaza, मैं कई वर्षों से एकाधिक कोर में पायथन चला रहा हूं, यह बहुत अच्छी तरह से काम करता है। कृपया मानक सीपीथन के मल्टीप्रोसेसिंग लिब का अनुसंधान करें। –

+0

@ V3ss0n, धन्यवाद। एक अच्छा lib की तरह लग रहा है। चूंकि यह प्रक्रियाओं का उपयोग करता है और धागे नहीं, क्या आप किसी भी संदर्भ-स्विचिंग दंड से परिचित हैं (उदाहरण के लिए जब एक बड़े कार्यकर्ता पूल का उपयोग करते हैं)? – bavaza

22

वैकल्पिक रूप से आप पूर्ण डाटासेट के बजाय 1000 यादृच्छिक नमूने पर ग्रिड खोज चला सकते हैं:

>>> from sklearn.cross_validation import ShuffleSplit 
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0) 
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2) 
>>> gs.fit(X, y) 

यह बहुत संभव है कि 5000 के नमूने के लिए इष्टतम मानकों 1000 नमूनों के लिए इष्टतम मानकों के बहुत करीब होगा। तो यह आपके मोटे ग्रिड खोज शुरू करने का एक अच्छा तरीका है।

n_jobs=-1 व्यक्तिगत सीवी को समानांतर में चलाने के लिए अपने सभी CPUs का उपयोग करना संभव बनाता है। यह mulitprocessing का उपयोग कर रहा है ताकि अजगर जीआईएल कोई मुद्दा नहीं है।

8

सबसे पहले, विज्ञान-सीखने के बेंचमार्क (here) के अनुसार, विज्ञान-सीखना पहले से सबसे तेज़ एसवीएम पैकेज के आसपास सबसे तेज़ है। इसलिए, आप प्रशिक्षण को तेज करने के अन्य तरीकों पर विचार करना चाहेंगे।

जैसा कि बावाजा द्वारा सुझाया गया है, आप प्रशिक्षण प्रक्रिया को बहु-थ्रेड करने का प्रयास कर सकते हैं। यदि आप Scikit-learn's GridSearchCV क्लास का उपयोग कर रहे हैं, तो आप अधिक स्मृति का उपयोग करने के खर्च पर समानांतर में प्रशिक्षण करने के लिए 1 के डिफ़ॉल्ट मान से बड़े होने के लिए n_jobs तर्क आसानी से सेट कर सकते हैं। आप इसके प्रलेखन here पा सकते हैं कैसे वर्ग का उपयोग करने का एक उदाहरण here

वैकल्पिक रूप से पाया जा सकता है, तो आप शोगुन मशीन लर्निंग पुस्तकालय here

शोगुन पर एक नज़र ले जा सकते हैं बड़े पैमाने पर मशीन सीखने के लिए डिज़ाइन किया गया है कई सामान्य एसवीएम पैकेजों के लिए रैपर के साथ और इसे पायथन के लिए बाइंडिंग के साथ सी/सी ++ में लागू किया जाता है। साइकिट-सीखने के बेंचमार्क के अनुसार, यह गति विज्ञान-सीखने के लिए तुलनीय है। अन्य कार्यों पर (उनके द्वारा प्रदर्शित किए गए किसी भी अन्य के अलावा), यह तेज़ हो सकता है इसलिए प्रयास करने के लायक है।

अंत में, आप आयाम में कमी करने की कोशिश कर सकते हैं उदा। अपने फीचर वैक्टर के आयाम को कम करने के लिए पीसीए या यादृच्छिक पीसीए का उपयोग करना। इससे प्रशिक्षण प्रक्रिया तेज हो जाएगी। संबंधित कक्षाओं के लिए प्रलेखन इन 2 लिंक में पाया जा सकता है: PCA, Randomized PCA। आप साइकिट-सीखने के उदाहरण अनुभाग में उनका उपयोग कैसे करें, इस पर उदाहरण पा सकते हैं।

4

यदि आप केवल आरबीएफ कर्नेल (या उस मामले के लिए कोई अन्य वर्गिक कर्नेल) का उपयोग करने में रुचि रखते हैं, तो मैं MATLAB या Octave पर LIBSVM का उपयोग करने का सुझाव देता हूं। मैं लगभग 6 सेकंड में 7000 अवलोकनों और 500 फीचर्स के मॉडल को प्रशिक्षित करता हूं।

यह चाल है कि LIBSVM प्रदान करता है, और कुछ मैट्रिक्स बीजगणित का उपयोग करने के लिए कुछ मैट्रिक्स बीजगणित का उपयोग करें ताकि डेटा को दो बार डेटा पर लूप करने के बजाय कर्नेल की गणना कर सकें। कर्नेल को LIBSVM के अपने आरबीएफ कर्नेल का उपयोग करके बहुत अधिक विरोध करने के लिए लगभग दो सेकंड लगते हैं। मुझे लगता है कि आप NumPy का उपयोग कर पाइथन में ऐसा करने में सक्षम होंगे, लेकिन मुझे यकीन नहीं है क्योंकि मैंने इसे आजमाया नहीं है।

+4

आम तौर पर बोलते हुए LibSVM एक अच्छा परिपक्व lib है, लेकिन मुझे लगता है कि यह सबसे तेज़ नहीं है और 7000 x 500 परीक्षण करने के लिए बहुत छोटी समस्या है। – mrgloom

1

svm_light आज़माएं!

यह अच्छा पाइथन बाइंडिंग के साथ infamous Thorsten Joachims at Cornell से एक दुष्ट-तेज सी कार्यान्वयन है, और आप इसे pip install pysvmlight के साथ स्थापित कर सकते हैं।

-1

मैं आपके द्वारा इनपुट की जाने वाली सुविधाओं की संख्या को कम करने के लिए random forest का उपयोग करने पर विचार करता हूं।

फीचर आयात उत्पन्न करने के लिए ExtraTreesRegressor और ExtraTreesClassifier के साथ एक विकल्प है। फिर आप इस जानकारी का उपयोग अपने एसवीएम में सुविधाओं का सबसेट इनपुट करने के लिए कर सकते हैं।

0

मैं सुझाव देता हूं कि साइकिट-लर्न Stochastic Gradient Descent कार्यान्वयन को देखें। डिफ़ॉल्ट हिंग नुकसान एक रैखिक एसवीएम है। मैंने इसे तेजी से तेज पाया है।