2017-10-12 2 views
0

Ich habe eine Reihe von Dokumenten in etwa 350 Klassen gruppiert. Ich versuche ein TF-IDF Multinomial-Modell zu erstellen, um die Klasse eines neuen Dokuments vorherzusagen. Alles scheint gut zu funktionieren, außer dass die Testvorhersage nur einen Wert annimmt (selbst wenn ich den Test an Tausenden von Dokumenten durchführe). Was vermisse ich?MultinomialNB() Vorhersage der gleichen Kategorie für alle Testdokumente

Hier ist der relevante Code:

stop_words = set(stopwords.words('english')) 
tokenizer = RegexpTokenizer(r'\w+') 
stemmer = SnowballStemmer("english") 

count_vect = CountVectorizer() 

tfidf_transformer = TfidfTransformer(norm='l1', use_idf=True, smooth_idf=False, sublinear_tf=False) 

clf = MultinomialNB()  

mycsv = pd.read_csv("C:/DocumentsToClassify.csv", encoding='latin-1') 

Document_text=mycsv.document.str.lower() 
y=mycsv.document_group 

Y=[] 
stemmed_documents = [] 

for i in range(0, 50000 ,2): 
    tokenized_document = tokenizer.tokenize(Document_text[i]) 

    stemmed_document = "" 

    for w in tokenized_document: 
     if w not in stop_words: 
      w = re.sub(r'\d+', '', w) 
      if w is not None: 
       stemmed_document=stemmed_document+" "+stemmer.stem(w) 

    stemmed_documents=np.append(stemmed_documents,stemmed_document) 
    Y=np.append(Y,y[i]) 

Y_correct=[] 
test_documents = [] 
for i in range(1,50000,4): 
    tokenized_document = tokenizer.tokenize(Document_text[i])  
    stemmed_document = "" 
    for w in tokenized_document: 
     if w not in stop_words: 
      w = re.sub(r'\d+', '', w) 
      if w is not None: 
       stemmed_document=stemmed_document+" "+stemmer.stem(w) 

    test_documents=np.append(test_documents,stemmed_document) 
    Y_correct=np.append(Y_correct,y[i]) 

Word_counts = count_vect.fit_transform(stemmed_documents) 
Words_tfidf = tfidf_transformer.fit_transform(Word_counts) 

Word_counts_test = count_vect.transform(test_documents) 
Words_tfidf_test = tfidf_transformer.transform(Word_counts_test) 

# Training 
clf.fit(Words_tfidf, Y) 

# Test 
Ynew=clf.predict(Words_tfidf_test) 

Antwort

0

Nachdem gestern für eine Weile kämpfen mit diesem, dachte ich, eine Lösung aus - Umschalten von MultinomialNB() zu SGDClassifier(). Ich bin mir nicht sicher, warum es nicht mit MultinomialNB() arbeitete, aber SDG funktioniert großartig. Hier ist der relevante - und viel verkürzte - Code (genau folgende http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html)

text_clf = Pipeline([('vect', CountVectorizer()), 
        ('tfidf', TfidfTransformer(norm='l1', use_idf=True, smooth_idf=True, sublinear_tf=False)), 
        ('clf', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, random_state=42)), 
]) 

# Training dataset 
train_data = pd.read_csv("A:/DocumentsWithGroupTrain.csv", encoding='latin-1') 

# Test dataset 
test_data = pd.read_csv("A:/DocumentsWithGroupTest.csv", encoding='latin-1') 

text_clf.fit(train_data.document, train_data.doc_group) 
predicted = text_clf.predict(test_data.document) 
print(np.mean(predicted == test_data.doc_group)) 
Verwandte Themen