2012-07-29 19 views
12

मैं स्मृति समस्याओं में भाग लेने के बिना बड़े सीएसवी डेटा (~ 75 एमबी) पर मॉडल को प्रशिक्षित करने के लिए विज्ञान-सीखने का उपयोग कैसे करूं?विज्ञान और पांडा: फिटिंग बड़े डेटा

मैं प्रोग्रामिंग वातावरण के रूप में आईपीथॉन नोटबुक का उपयोग कर रहा हूं, और पांडा + स्केलर पैकेज को कागल के अंकों पहचानकर्ता ट्यूटोरियल से डेटा का विश्लेषण करने के लिए उपयोग कर रहा हूं।

डेटा webpage, my code के लिए लिंक पर उपलब्ध है, और यहाँ error message है:

KNeighborsClassifier भविष्यवाणी के लिए प्रयोग किया जाता है।

समस्या:

"MemoryError" तब होता है जब बड़े डेटासेट लोड हो रहा है read_csv समारोह का उपयोग कर। अस्थायी रूप से इस समस्या को बाईपास करने के लिए, मुझे कर्नेल को पुनरारंभ करना होगा, जो तब read_csv फ़ंक्शन सफलतापूर्वक फ़ाइल लोड करता है, लेकिन वही त्रुटि तब होती है जब मैं एक ही सेल को फिर से चलाता हूं।

read_csv समारोह फ़ाइल सफलतापूर्वक लोड करता है, dataframe में परिवर्तन करने के बाद, मैं सुविधाओं और लेबल KNeighborsClassifier के फिट() फ़ंक्शन करने के लिए पारित कर सकते हैं। इस बिंदु पर, समान स्मृति त्रुटि होती है। मात्रा में CSV फ़ाइल के माध्यम से

दोहराएं, और उसके अनुसार डेटा फिट है, लेकिन समस्या यह है कि भविष्य कहनेवाला मॉडल डेटा का एक हिस्सा के लिए हर बार ओवरराइट है:

मैं निम्नलिखित की कोशिश की।

आपको क्या लगता है कि मैं मेमोरी समस्याओं में भाग दिए बिना अपने मॉडल को सफलतापूर्वक प्रशिक्षित करने के लिए क्या कर सकता हूं?

+0

आपका कोड + डेटा अपने लैपटॉप पर ठीक चलाता है। इसके लिए लगभग 1.2 जीबी मेमोरी की आवश्यकता है। आपके सिस्टम में कितनी मेमोरी है? – Sicco

+1

यह loadtxt का उपयोग कर काम कर रहा है। स्मृति त्रुटि की घटना के बावजूद, एल्गोरिदम पर केवल ~ 75 एमबी डेटा चलाना 1 जीबी से अधिक RAM लेता है ... मुझे यकीन नहीं है कि मैं अपने कोड में कुछ भी गलत कर रहा हूं। (http://pastie.org/4354911) (आईपीथॉन नोटबुक)। यदि यह केवल इतना एल्गोरिदम है जो इसे लंबे समय से ले रहा है, तो आप मॉडल बनाने के लिए इतने लंबे समय तक एल्गोरिदम पर डेटा के गीगाबाइट कैसे लोड करते हैं? –

+4

आप एक एल्गोरिदम का उपयोग कर सकते हैं जिसे वृद्धिशील रूप से प्रशिक्षित किया जा सकता है, जिससे एक समय में डेटा के केवल (छोटे) भागों को संसाधित किया जा सकता है। Scikit-learn में एक अनुमानक ऐसा करने में सक्षम है अगर यह 'partial_fit' विधि लागू करता है। – Sicco

उत्तर

10

नोट: जब आप पांडा के साथ डेटा लोड यह एक DataFrame वस्तु जहां प्रत्येक स्तंभ सभी पंक्तियों के लिए एक सजातीय डेटाप्रकार है पैदा करेगा लेकिन 2 कॉलम अलग डेटाटाइप्स (जैसे पूर्णांक, दिनांक, तार) कर सकते हैं।

जब आप DataFrame उदाहरण को एक विज्ञान-सीखने के मॉडल में पास करते हैं तो यह पहले dtype np.float32 या np.float64 (मॉडल के कार्यान्वयन के आधार पर) के साथ एक सजातीय 2 डी numpy सरणी आवंटित करेगा। इस बिंदु पर आपके पास स्मृति में आपके डेटासेट की 2 प्रतियां होंगी।

इससे बचने के लिए आप एक सीएसवी पार्सर लिख सकते हैं/पुन: उपयोग कर सकते हैं जो सीधे विज्ञान-सीखने वाले मॉडल द्वारा अपेक्षित आंतरिक प्रारूप/प्रकार में डेटा आवंटित करता है। उदाहरण के लिए आप numpy.loadtxt आज़मा सकते हैं (पैरामीटर के लिए डॉकस्ट्रिंग पर नज़र डालें)।

यदि आप डेटा बहुत दुर्लभ हैं (कई शून्य मान) तो यह एक scipy.sparse डेटास्ट्रक्चर और एक विज्ञान-सीखने मॉडल का उपयोग करना बेहतर होगा जो ऐसे इनपुट प्रारूप से निपट सकता है (डॉकस्ट्रिंग को जानने के लिए जांचें)। हालांकि सीएसवी प्रारूप स्वयं स्पैस डेटा के लिए बहुत उपयुक्त नहीं है और मुझे यकीन नहीं है कि प्रत्यक्ष सीएसवी-टू -scipy.sparse पार्सर मौजूद है।

संपादित करें: संदर्भ के लिए KNearestNeighborsClassifer आवंटित आकार (n_samples_predict, n_samples_train) जो बहुत बेकार है जब केवल (n_samples_predict, n_neighbors) बजाय की जरूरत है के साथ अस्थायी दूरी सरणी।यह समस्या यहां ट्रैक किया जा सकता:

https://github.com/scikit-learn/scikit-learn/issues/325

+0

loadtxt बढ़िया काम कर रहा है! –

+0

scikit-learn मॉडल या तो स्मृति स्मृति अपवाद नहीं कर रहा है। केवल समस्या ही है ... चूंकि डेटा इतना बड़ा है, एल्गोरिदम मॉडल बनाने के लिए बहुत लंबा समय ले रहा है। काश यह बहुत तेज़ बनाने का एक तरीका था ... –

+2

आपको ब्रूटफोर्स मोड (बॉलट्री के बजाए) में 'केनेघर्स क्लासिफायर' का उपयोग करने की कोशिश करनी चाहिए, लेकिन भविष्यवाणी के समय बहुत धीमे हो सकते हैं। वैकल्पिक रूप से आप 'sklearn.linear_model.Perceptron',' sklearn.naive_bayes.MultinomialNB' या 'sklearn.neighbors.NearestCentroidClassifier' जैसे साधारण मॉडल का उपयोग कर सकते हैं। अंत में आप भविष्यवाणी की सटीकता का पहला त्वरित विचार प्राप्त करने के लिए अपने डेटा के एक छोटे से सबसमूह पर एक मॉडल को प्रशिक्षित करने का प्रयास कर सकते हैं और फिर डेटासेट और पुनरावृत्ति के आकार को दोगुना कर सकते हैं। – ogrisel