2015-07-09 7 views
7

मैं पाइथन से नया रूप से नया हूं और मुझे डेटा सेट के साथ एक छोटी सी समस्या है। डेटा सेट में 400,000 पंक्तियां और 300 चर हैं। मुझे 3000+ विभिन्न वस्तुओं के साथ एक स्पष्ट चर के लिए डमी चर प्राप्त करना होगा। अंत में मैं 3300 चर या सुविधाओं के साथ डेटा सेट के साथ समाप्त करना चाहता हूं ताकि मैं RandomForest मॉडल को प्रशिक्षित कर सकूं।get_dummies python स्मृति त्रुटि

यहाँ मैं क्या करने की कोशिश की है:

df = pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1) 

जब मैं कि मैं हमेशा एक स्मृति त्रुटि मिलेगी है। क्या मेरे पास चर की संख्या की सीमा है?

यदि मैं केवल पहली 1000 पंक्तियों (जिसमें 374 विभिन्न श्रेणियां मिलीं) के साथ ऐसा करता है तो यह सिर्फ फिन काम करता है।

क्या किसी के पास मेरी समस्या का समाधान है?

मैं जिस मशीन का उपयोग कर रहा हूं वह 8 जीबी राम के साथ इंटेल I7 है।

धन्यवाद

+0

32-बिट या 64-बिट पायथन? सीमा पायथन कार्यान्वयन के ढेर आकार है, जो वर्चुअल मेमोरी का क्षेत्र है, रैम नहीं। विभिन्न ऑपरेटिंग सिस्टम पर विभिन्न संस्करणों और विभिन्न कार्यान्वयनों में सभी की अलग-अलग सीमाएं होती हैं।जाहिर है आप एक मारा है। क्या आपको उस डेटा को वर्चुअल मेमोरी में एक ही समय में स्टोर करना होगा? – cdarke

+0

मैं 64-बिट पायथन का उपयोग कर रहा हूं। इसका समाधान क्या होगा? कि मैं डेटा सेट को कई हिस्सों में विभाजित करता हूं और उस अलग-अलग हिस्सों पर अपना ऑपरेशन करता हूं? – Duesentrieb

+0

ठीक है, मैं यह सुझाव देने जा रहा था कि यदि आप 32-बिट पर थे। उस स्थिति में आपको अपने डिज़ाइन पर फिर से जाना होगा। – cdarke

उत्तर

18

अद्यतन: संस्करण 0.19.0 के साथ शुरू, get_dummies एक 8 बिट पूर्णांक के बजाय 64 बिट नाव है, जो कई मामलों में इस समस्या को ठीक कर देंगे देता है। देखें: get_dummies -- pandas 0.19.0

यहां प्रयास करने की कुछ संभावनाएं हैं। दोनों डेटाफ्रेम की मेमोरी पदचिह्न को काफी हद तक कम कर देंगे लेकिन आप बाद में स्मृति समस्याओं में भी भाग सकते हैं। भविष्यवाणी करना मुश्किल है, आपको बस कोशिश करनी होगी।

(ध्यान दें कि मैं नीचे info() के उत्पादन को सरल बनाने रहा हूँ)

df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) }) 

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null float64 
itemID__2 100 non-null float64 
itemID__3 100 non-null float64 

memory usage: 3.5 KB 

यहाँ हमारे आधारभूत है। प्रत्येक डमी कॉलम 800 बाइट्स लेता है क्योंकि नमूना डेटा में 100 पंक्तियां होती हैं और get_dummies फ्लोट 64 (8 बाइट्स) के लिए डिफ़ॉल्ट रूप से दिखाई देती है। ऐसा लगता है कि डमी को स्टोर करने के लिए एक अनावश्यक रूप से अक्षम तरीका है क्योंकि आप इसे करने के लिए थोड़ा सा उपयोग कर सकते हैं, लेकिन इसके लिए कुछ कारण हो सकता है जिसके बारे में मुझे पता नहीं है।

तो, पहला प्रयास, प्रत्येक डमी स्तंभ बस (एक एक बाइट पूर्णांक के लिए बदल इस get_dummies के लिए तो यह astype(np.int8) के साथ एक रूपांतरण के रूप में किया जा सकता है एक विकल्प हो करने के लिए प्रतीत नहीं होता।

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)], 
           axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null int8 
itemID__2 100 non-null int8 
itemID__3 100 non-null int8 

memory usage: 1.5 KB 

अब तक 1/8 स्मृति के रूप में पहले

वैकल्पिक रूप से लेता है।, आप get_dummies की sparse विकल्प का उपयोग कर सकते हैं।

pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)], 
           axis=1).info() 

itemID  100 non-null int32 
itemID__1 100 non-null float64 
itemID__2 100 non-null float64 
itemID__3 100 non-null float64 

memory usage: 2.0 KB 

काफी तुलनात्मक बचत। info() आउटपुट कुछ हद तक बचत हो रहा है जिस तरह से बचत हो रही है, लेकिन आप कुल बचत को देखने के लिए स्मृति उपयोग के मूल्य को देख सकते हैं।

यह कहना मुश्किल है कि इनमें से कौन सा अभ्यास में बेहतर काम करेगा (यदि कोई भी व्यावहारिक समाधान है), तो आपको बस उन्हें प्रत्येक प्रयास करने की आवश्यकता होगी। सिद्धांत रूप में आप दोनों दृष्टिकोणों को भी जोड़ सकते हैं, लेकिन मैं तब तक कोशिश नहीं करता जब तक कि यह प्रत्येक दृष्टिकोण को अपने आप पर काम न करे।

+0

बहुत बहुत धन्यवाद। मैंने डेटा प्रकार को पूर्णांक में बदल दिया और यह काम करता है! – Duesentrieb