2012-08-31 14 views
5

मैं एक डेटासेट पर नैवे बेयस करने की कोशिश कर रहा हूं जिसमें 6,000,000 से अधिक प्रविष्टियां हैं और प्रत्येक प्रविष्टि 150k फीचर्स है। मैं नीचे दिए गए लिंक से कोड लागू करने के लिए कोशिश की है: Implementing Bag-of-Words Naive-Bayes classifier in NLTKनाइव बेयस (पायथन, विज्ञान) में स्पैर मैट्रिस/ऑनलाइन सीखने का उपयोग

समस्या है (जैसा कि मैं समझता हूँ), कि जब मैं के रूप में यह पैरामीटर है एक dok_matrix साथ ट्रेन की विधि चलाने का प्रयास है, यह नहीं iterkeys पा सकते हैं (मैं लेबल के रूप में OrderedDict साथ पंक्तियों युग्मित कर लेंगे):

Traceback (most recent call last): 
    File "skitest.py", line 96, in <module> 
    classif.train(add_label(matr, labels)) 
    File "/usr/lib/pymodules/python2.6/nltk/classify/scikitlearn.py", line 92, in train 
    for f in fs.iterkeys(): 
    File "/usr/lib/python2.6/dist-packages/scipy/sparse/csr.py", line 88, in __getattr__ 
    return _cs_matrix.__getattr__(self, attr) 
    File "/usr/lib/python2.6/dist-packages/scipy/sparse/base.py", line 429, in __getattr__ 
    raise AttributeError, attr + " not found" 
AttributeError: iterkeys not found 

मेरा प्रश्न है, वहाँ एक रास्ता या तो प्रवेश (ऑनलाइन द्वारा वर्गीकारक प्रविष्टि शिक्षण द्वारा एक विरल मैट्रिक्स का उपयोग कर से बचने के लिए है), या वहाँ एक विरल है मैट्रिक्स प्रारूप मैं इस मामले में dok_matrix की बजाय कुशलतापूर्वक उपयोग कर सकता हूं? या क्या मुझे कुछ याद आ रही है?

किसी के भी समय के लिए धन्यवाद। :)

संपादित करें, 6 सितं,:

मिले iterkeys, तो कम से कम कोड चलाता है। यह अभी भी बहुत धीमी है, क्योंकि इसमें 32k के आकार के डेटासेट के साथ कई घंटे लग गए हैं, और अभी भी समाप्त नहीं हुआ है। यहाँ है कि मैं क्या इस समय मिल गया है:

matr = dok_matrix((6000000, 150000), dtype=float32) 
labels = OrderedDict() 

#collect the data into the matrix 

pipeline = Pipeline([('nb', MultinomialNB())]) 
classif = SklearnClassifier(pipeline) 

add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x]) 
           for x in xrange(lentweets-foldsize)] 

classif.train(add_label(matr[:(lentweets-foldsize),0], labels)) 
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)] 
data = np.array(classif.batch_classify(readrow)) 

समस्या हो सकती है कि प्रत्येक पंक्ति है कि लिया जाता है वेक्टर काफी विरल का उपयोग नहीं है, लेकिन 150k प्रविष्टि में से प्रत्येक के माध्यम से चला जाता है। इस मुद्दे के लिए निरंतरता के रूप में, क्या किसी को पता है कि इस बेवकूफ बेयस को स्पैर मैट्रिस के साथ कैसे उपयोग किया जाए, या उपरोक्त कोड को अनुकूलित करने का कोई और तरीका है?

+0

शायद आप अपनी सुविधाओं को अधिक कुशलता से एन्कोड कर सकते हैं, या उनके आकार को कम कर सकते हैं? – piokuc

+0

सच है, लेकिन जो कुछ भी मुझे डरता है, मुझे अभी भी मैट्रिक्स के आकार को प्रबंधित करने की आवश्यकता होगी। डेटासेट में ट्वीट्स के शब्द होते हैं। – user1638859

+0

कम से कम iterkeys मिला, अब समस्या यह है कि कोड बहुत धीमा है। – user1638859

उत्तर

3

विज्ञान-शिक्षा में document classification example देखें। यह चाल है कि लाइब्रेरी आपके लिए फीचर निष्कर्षण को संभालने दे। एनएलटीके रैपर को छोड़ दें, क्योंकि यह इस तरह के बड़े डेटासेट के लिए नहीं है। (*)

यदि आपके पास टेक्स्ट फाइलों में दस्तावेज़ हैं, तो आप उन टेक्स्ट फ़ाइलों को TfidfVectorizer पर सौंप सकते हैं, जो उनके द्वारा एक स्पैर मैट्रिक्स बनाता है:

from sklearn.feature_extraction.text import TfidfVectorizer 
vect = TfidfVectorizer(input='filename') 
X = vect.fit_transform(list_of_filenames) 

अब आप एक प्रशिक्षण सीएसआर विरल मैट्रिक्स प्रारूप में X निर्धारित किया है, कि तुम, एक अनुभवहीन Bayes वर्गीकारक को खिलाने के लिए यदि आप भी लेबल y (शायद फ़ाइल नाम से ली गई की एक सूची है सकते हैं यदि आप इनकोडिंग उनमें कक्षा):

from sklearn.naive_bayes import MultinomialNB 
nb = MultinomialNB() 
nb.fit(X, y) 

यदि यह पता चला है कि यह काम नहीं करता है क्योंकि दस्तावेज़ों का सेट बहुत बड़ा है (TfidfVectorizer केवल इस संख्या के दस्तावेजों के लिए अनुकूलित किया गया था), out-of-core document classification उदाहरण देखें, जो HashingVectorizer और partial_fit मिनीबैच के लिए API दिखाता है सीख रहा हूँ। काम करने के लिए आपको scikit-0.14 सीखना होगा।

(*) मुझे पता है, क्योंकि मैंने उस रैपर को लिखा था। शेष एनएलटीके की तरह, यह शैक्षणिक उद्देश्यों के लिए है। मैंने विज्ञान-सीखने में प्रदर्शन सुधार पर भी काम किया, और मेरे द्वारा विज्ञापन किए जाने वाले कुछ कोड मेरा स्वयं का है।

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