एसवीएम का उपयोग स्किट सीखता है और अंतहीन चलाता है और निष्पादन को कभी पूरा नहीं करता है


76

मैं 595605 पंक्तियों और 5 कॉलम (फीचर्स) और टेस्ट डेटासेट वाले 397070 पंक्तियों वाले परीक्षण डेटासेट पर scikit learn (अजगर) का उपयोग करके SVR चलाने की कोशिश कर रहा हूं। डेटा को पूर्व-संसाधित और नियमित किया गया है।

मैं परीक्षण के उदाहरणों को सफलतापूर्वक चलाने में सक्षम हूं, लेकिन अपने डेटासेट का उपयोग करने और इसे एक घंटे से अधिक समय तक चलने देने पर, मैं अभी भी प्रोग्राम का कोई आउटपुट या समाप्ति नहीं देख सका। मैंने एक अलग आईडीई और यहां तक ​​कि टर्मिनल से उपयोग करके निष्पादित करने की कोशिश की है, लेकिन यह मुद्दा नहीं लगता है। मैंने 1 से 1e3 तक 'C' पैरामीटर मान को बदलने का भी प्रयास किया है।

मैं scikit का उपयोग कर सभी svm कार्यान्वयन के साथ इसी तरह के मुद्दों का सामना कर रहा हूँ।

क्या मैं इसे पूरा करने के लिए पर्याप्त इंतजार नहीं कर रहा हूं? इस निष्पादन में कितना समय लगना चाहिए?

मेरे अनुभव से इसे कुछ मिनटों की आवश्यकता नहीं होनी चाहिए।

यहां मेरा सिस्टम कॉन्फ़िगरेशन है: उबंटू 14.04, 8 जीबी रैम, बहुत सारी मुफ्त मेमोरी, 4 जी जीन i7 प्रोसेसर


क्या आप कोड प्रदान कर सकते हैं? इसके अलावा, क्या यह प्रशिक्षण या परीक्षण में इतना समय लगता है? कैसे छोटे प्रशिक्षण / परीक्षण डेटासेट के बारे में?
12

मैं सिर्फ एक सीएसवी फ़ाइल से पंडों के डेटाफ्रेम में डेटा पढ़ रहा हूं और इसे स्किकिट लर्न फ़ंक्शन में भेज रहा हूं। बस इतना ही! कोड प्रदान करना वास्तव में यहाँ मदद नहीं करेगा
तेजस्वी

6
स्केलेर के एसवीएम कार्यान्वयन का अर्थ है कम से कम 3 चरण: 1) एसवीआर ऑब्जेक्ट बनाना, 2) एक मॉडल फिटिंग, 3) अनुमानित मूल्य। पहला चरण उपयोग में कर्नेल का वर्णन करता है, जो आंतरिक प्रक्रियाओं को बेहतर ढंग से समझने में मदद करता है। दूसरे और तीसरे चरण बहुत अलग हैं, और हमें कम से कम यह जानने की जरूरत है कि उनमें से कौन सा समय लगता है। यदि यह प्रशिक्षण है, तो यह ठीक हो सकता है, क्योंकि सीखना कभी-कभी धीमा होता है। यदि यह परीक्षण कर रहा है, तो संभवतः एक बग है, क्योंकि एसवीएम में परीक्षण वास्तव में तेज है। इसके अलावा, यह CSV रीडिंग हो सकती है जो उस लंबे और एसवीएम को बिल्कुल भी नहीं लेती है। तो ये सभी विवरण महत्वपूर्ण हो सकते हैं।
13

मैं svm के माध्यम से एक ही समस्या का सामना कर रहा हूं, लेकिन क्या कोई मुझे बता सकता है कि सामान्य होने के बाद कितना समय लगेगा?
कश्यप किचलू

जवाबों:


69

कर्मीकृत SVMs को डेटासेट में प्रत्येक बिंदु के बीच एक दूरी के कार्य की गणना की आवश्यकता होती है, जो कि की हावी लागत है । दूरियों का संग्रहण स्मृति पर बोझ है, इसलिए वे मक्खी पर पुन: विराजित होते हैं। शुक्र है, केवल निर्णय सीमा के निकटतम बिंदुओं की सबसे अधिक आवश्यकता होती है। अक्सर गणना की गई दूरी एक कैश में संग्रहीत होती हैं। यदि कैश रहा है, तो रनिंग टाइम ।O ( n सुविधाएँ × n 3 अवलोकन )O(nfeatures×nobservations2)O(nfeatures×nobservations3)

आप इस कैश को SVR के रूप में इनवाइट करके बढ़ा सकते हैं

model = SVR(cache_size=7000)

सामान्य तौर पर, यह काम नहीं कर रहा है। पर अभी भी सब कुछ खत्म नहीं हुआ। आप डेटा को कम कर सकते हैं और सत्यापन सेट के रूप में बाकी का उपयोग कर सकते हैं, या आप एक अलग मॉडल चुन सकते हैं। 200,000 अवलोकन सीमा से ऊपर, रैखिक शिक्षार्थियों को चुनना बुद्धिमान है।

कर्नेल एसवीएम कर्नेल मैट्रिक्स को अनुमानित करके और रैखिक एसवीएम को खिलाने के द्वारा अनुमानित किया जा सकता है। यह आपको रैखिक समय में सटीकता और प्रदर्शन के बीच व्यापार करने की अनुमति देता है।

इसे प्राप्त करने का एक लोकप्रिय साधन अपने कर्नेल फ़ंक्शन के आधार के रूप में किमी / kmeans ++ द्वारा पाए गए 100 या तो क्लस्टर केंद्रों का उपयोग करना है। नई व्युत्पन्न सुविधाओं को फिर एक रैखिक मॉडल में खिलाया जाता है। यह अभ्यास में बहुत अच्छी तरह से काम करता है। सोफिया-एमएल और वोवपाल वैबिट जैसे उपकरण Google, याहू और माइक्रोसॉफ्ट ऐसा करते हैं। इनपुट / आउटपुट सरल रैखिक शिक्षार्थियों के लिए हावी लागत बन जाता है।

डेटा की बहुतायत में, गैर-समरूप मॉडल अधिकांश समस्याओं के लिए लगभग समान हैं। पाठ, चित्र, समय श्रृंखला, ऑडियो जैसे संरचित इनपुट के अपवाद।

आगे की पढाई


16

एसवीएम द्विघात क्रम के अनुकूलन की समस्या का समाधान करता है।

मेरे पास जोड़ने के लिए कुछ भी नहीं है जो यहां नहीं कहा गया है। मैं एसवीसी के बारे में केवल एक लिंक पोस्ट करना चाहता हूं जो स्पष्ट करता है कि क्या चल रहा है:

कार्यान्वयन libsvm पर आधारित है। फिट समय की जटिलता नमूनों की संख्या के साथ द्विघात से अधिक है जो 10000 नमूनों में से कुछ के साथ डेटासेट को स्केल करना कठिन बनाता है।

यदि आप गुठली का उपयोग नहीं करना चाहते हैं, और एक रैखिक एसवीएम पर्याप्त है, तो रैखिक एसवीआर है जो बहुत तेज़ है क्योंकि यह एक अनुकूलन दृष्टिकोण अला लीनियर रेजग्रेसन का उपयोग करता है। हालाँकि, यदि आप ऐसा पहले से नहीं कर रहे हैं, तो आपको अपना डेटा सामान्य करना होगा, क्योंकि यह अवरोधन गुणांक के नियमितीकरण पर लागू होता है, जो कि शायद आप नहीं चाहते हैं। इसका मतलब है कि यदि आपका डेटा औसत शून्य से दूर है, तो वह इसे संतोषजनक ढंग से हल नहीं कर पाएगा।

ऑप्टिमाइज़ेशन समस्या को हल करने के लिए आप स्टोचैस्टिक ग्रेडिएंट डिसेंट का उपयोग कर सकते हैं। Sklearn सुविधाओं SGDRegressor । आपको loss='epsilon_insensitive'रैखिक SVM के समान परिणाम प्राप्त करने के लिए उपयोग करना होगा। दस्तावेज देखें। मैं केवल एक अंतिम उपाय के रूप में ढाल वंश का उपयोग करूंगा, क्योंकि इसका मतलब है कि स्थानीय मीनिमा में फंसने से बचने के लिए हाइपरपरमेटर्स का बहुत अधिक उपयोग करना। LinearSVRयदि आप कर सकते हैं का उपयोग करें ।


मेरे पास कई लाइनों वाला डेटासेट था। SVC ने मेरे बारे में 150K डेटा की पंक्तियों के लिए बहुत लंबा रास्ता तय करना शुरू कर दिया। मैंने LinearSVR के साथ आपके सुझाव का उपयोग किया और एक लाख पंक्तियों में केवल कुछ मिनट लगते हैं। PS ने यह भी पाया कि LogisticRegression classifier, LinearSVR (मेरे मामले में) के समान परिणाम देता है और और भी तेज है।
jeffery_the_wind

8

क्या आपने अपने पूर्व-प्रसंस्करण चरण में स्केलिंग को शामिल किया था? मेरे एसवीएम को चलाते समय मेरे पास यह मुद्दा था। मेरा डेटासेट 20 सुविधाओं (कॉल) के साथ ~ 780,000 नमूने (पंक्ति) है। मेरा प्रशिक्षण सेट ~ 235k नमूने हैं। यह पता चला है कि मैं अपना डेटा स्केल करना भूल गया हूँ! यदि यह स्थिति है, तो अपने कोड में इस बिट को जोड़ने का प्रयास करें:

पैमाने डेटा [-1,1]; एसवीएम की गति बढ़ाएँ:

sklearn.preprocessing आयात से MinMaxScaler
स्केलिंग = MinMaxScaler (feature_range = (- 1,1)) फिट (X_train)
X_train = scaling.transform (X_train)
X_test = scaling.transform (X_test)


2
क्या कोई समझा सकता है कि यह एसवीएम फिट क्यों है?
लेपियर

1
क्या कोई कारण है कि आपने किसी अन्य के बजाय मिनमैक्सस्लेकर उठाया? उदाहरण के लिए StandardScaler?
रासपी

@ आइपरियर: अनिवार्य रूप से आप प्रत्येक विकल्प के लिए संभावित सीमा स्थान को इस तरह से कम कर रहे हैं जिससे आपके मशीन के लिए प्रयास का स्तर बहुत कम हो जाए।
आइक

7

इस तरह के एक विशाल डेटासेट के साथ मुझे लगता है कि आप एक तंत्रिका नेटवर्क, गहन शिक्षा, यादृच्छिक वन (वे आश्चर्यजनक रूप से अच्छे हैं), आदि का उपयोग करके बेहतर होंगे।

जैसा कि पहले के उत्तरों में उल्लेख किया गया है, लिया गया समय प्रशिक्षण नमूनों की संख्या की तीसरी शक्ति के समानुपाती है। यहां तक ​​कि भविष्यवाणी का समय परीक्षण वैक्टर की संख्या के संदर्भ में बहुपद है।

यदि आपको वास्तव में SVM का उपयोग करना चाहिए तो मैं GPU डेटा का उपयोग करने या प्रशिक्षण डेटासेट आकार को कम करने की सलाह दूंगा। यह देखने के लिए पहले डेटा के नमूने (शायद 10,000 पंक्तियों) के साथ प्रयास करें कि क्या यह डेटा प्रारूप या वितरण के साथ कोई समस्या नहीं है।

जैसा कि अन्य उत्तरों में बताया गया है, रैखिक गुठली तेज़ होती है।


3

मुझे हाल ही में इसी तरह की समस्या का सामना करना पड़ा, क्योंकि मैं अपने डेटासेट में उन पैमानों को भूल गया था, जिनका इस्तेमाल पहले मॉडल की तरह पहना जाता था। डेटा को स्केल करने में विफलता शेल्बी मैटलॉक द्वारा बताए गए संभावित अपराधी हो सकते हैं। आप स्केलेर में उपलब्ध विभिन्न स्केलर की कोशिश कर सकते हैं, जैसे कि रोबस्टस्कलर :

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

X अब रूपांतरित / परिमार्जित है और आपके इच्छित मॉडल को खिलाया जाने के लिए तैयार है।


2

यह समझ में आता है। IIUC, सपोर्ट वेक्टर ऑपरेशन के निष्पादन की गति नमूनों की संख्या से बंधी है, न कि आयामीता से। दूसरे शब्दों में, यह सीपीयू समय द्वारा कैप किया गया है न कि रैम। मुझे यकीन नहीं है कि यह कितना समय लेना चाहिए, लेकिन मुझे पता लगाने के लिए कुछ बेंचमार्क चल रहे हैं।


1

इसे रात भर या 24 घंटे तक चलाने के लिए छोड़ दें। आपका CPU उपयोग क्या है? यदि कोई भी कोर 100% पर नहीं चल रहा है तो आपको समस्या है। शायद स्मृति के साथ। क्या आपने चेक किया है कि आपका डेटासेट 8GB में फिट बैठता है या नहीं? क्या आपने SGDClassifier की कोशिश की है? यह वहां सबसे तेज में से एक है। पहले इसे एक घंटे में पूरा करने की उम्मीद करते हुए वर्थ ने कोशिश की।


SGDClassifierगुठली का समर्थन नहीं करता है। यदि ओपी रैखिक एसवीएम चाहता है, तो मैं पहले प्रयास करने की सलाह दूंगा LinearSVR। यह बहुत तेजी से होता है SVRक्योंकि यह एक रैखिक प्रतिगमन पुस्तकालय का उपयोग करके समस्या को हल करता है, और वैश्विक न्यूनतम गारंटी दी जाती है (ढाल वंश के विपरीत)।
रिकार्डो क्रूज़

आपकी टिप्पणी की सराहना करते हैं। क्या आप विस्तार से बता सकते हैं कि कर्नेल समर्थन एक मुद्दा क्यों है?
डिएगो

से प्रलेखन , The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.यही बात के लिए SGDRegressorSGDRegressorउपयोग करने के बराबर है SVR(kernel='linear')। यदि ऐसा है तो ओपी चाहता है, यह बहुत अच्छा है। मैं इस धारणा के तहत था कि वह कर्नेल के साथ एसवीएम का उपयोग करना चाहता था। अगर ऐसा नहीं है, तो मैं सलाह दूंगा कि वह पहले प्रयास करे LinearSVR
रिकार्डो क्रूज़

1

[-1,1] पर डेटा को सामान्य करने का प्रयास करें। मुझे एक समान समस्या का सामना करना पड़ा और सामान्यीकरण पर सबकुछ ठीक हो गया। आप आसानी से उपयोग करके डेटा को सामान्य कर सकते हैं:

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)


@ अर्ची यह सवाल का जवाब है, सवाल का नहीं।
टाइमलैटहार्ट

1

मैंने इस मुद्दे का सामना किया है और cache_sizeजैसा कि अन्य लोग सुझाव दे रहे हैं वह बिल्कुल भी मदद नहीं करता है। आप इस पोस्ट को देख सकते हैं और यह एक मुख्य योगदानकर्ता के रूप में सुझाया गया है कि आपको कोड को मैन्युअल रूप से बदलना चाहिए।

जैसा कि आप जानते हैं, SVCऔर SVRअनुकूलन समस्याएं हैं और वे तब रुकते हैं जब त्रुटि मार्जिन इतना कम होता है जहां आगे का अनुकूलन निरर्थक होता है। तो इन में एक और पैरामीटर है max_iter, जहां आप यह निर्धारित कर सकते हैं कि इसे कितने पुनरावृत्तियों करना चाहिए।

मैंने sklearnअजगर में और e1071आर में उपयोग किया है और आर बहुत तेजी से परिणाम को सेट किए बिना प्राप्त कर रहा है max_iterऔर sklearn2-4 गुना अधिक समय लेता है। एक ही रास्ता है कि मैं अजगर के लिए गणना समय नीचे ला सकता था का उपयोग कर रहा था max_iter। यह आपके मॉडल, सुविधाओं की संख्या, गुठली और हाइपरपरमेटर्स की जटिलता के सापेक्ष है, लेकिन छोटे डेटासेट के लिए मैंने लगभग 4000 डेटापॉइंट का उपयोग किया max_iterथा 10000और परिणाम बिल्कुल अलग नहीं थे और यह स्वीकार्य था।


0

मेरे पास एक डेटासेट के साथ एक समान मुद्दा था जिसमें केवल 115 तत्व और केवल एक एकल सुविधा (अंतर्राष्ट्रीय एयरलाइन डेटा) शामिल है। इसका समाधान डेटा को स्केल करना था। अब तक के उत्तरों में मुझे जो याद आया वह एक पाइपलाइन का उपयोग था:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

आप modelएक सामान्य वर्गीकरण / प्रतिगमन मॉडल की तरह प्रशिक्षित कर सकते हैं और उसी तरह इसका मूल्यांकन कर सकते हैं। कुछ भी नहीं बदलता है, केवल मॉडल की परिभाषा।


क्या है Pipeline? आप इसे आयात नहीं कर रहे हैं।
ब्रैम वानरो

0

आपको अपना डेटा स्केल करना होगा। स्केलिंग आपके डेटा बिंदुओं को -1 से 1 सीमा तक सामान्य कर देगा, जो तेजी से अभिसरण में मदद करेगा।

निम्नलिखित कोड का उपयोग करके देखें:

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

डेटा विज्ञान एसई में आपका स्वागत है! क्या आप बता सकते हैं कि आपका सुझाव ओपी को कैसे मदद करेगा? आप जो सुझाव दे रहे हैं वह एक सरणी का स्केलिंग है। यह स्पष्ट नहीं है कि कैसे scikit सीखने में SVR एल्गोरिथ्म को प्रभावित कर सकता है या नहीं।
स्टीरियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.