2016-04-16 5 views
-1

Was mache ich falsch mit scikit-learn von nltk, um die Genauigkeit des naiven Bayes Classifier zu überprüfen?Bewertung der Vorhersagegenauigkeit des NB-Modells

...readFile definition not needed 
#divide the data into training and testing sets 
data = readFile('Data_test/') 
training_set = list_nltk[:2000000] 
testing_set = list_nltk[2000000:] 

#applied Bag of words as a way to select and extract feature 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(training_set.split('\n')) 

#apply tfd 
tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts) 
X_train_tf = tf_transformer.transform(X_train_counts) 

#Train the data 
clf = MultinomialNB().fit(X_train_tf, training_set.split('\n')) 

#now test the accuracy of the naive bayes classifier 
test_data_features = count_vect.transform(testing_set) 
X_new_tfidf = tf_transformer.transform(test_data_features) 

predicted = clf.predict(X_new_tfidf) 
print "%.3f" % nltk.classify.accuracy(clf, predicted) 

Das Problem ist, wenn ich die nltk.classify.accuracy drucken, es dauert ewig, und ich bin zu ahnen, ist dies, weil ich etwas falsch gemacht habe, aber da ich keinen Fehler, ich kann, was es nicht herausfinden, ist das falsch.

+0

Sind Sie sicher, dass es die Genauigkeitsmethode aufruft? Was versuchst du vorherzusagen? Versuchen Sie, etwas Druck hinzuzufügen, um zu sehen, wo es aufhört. Die Fit-Methode deines Klassifikators scheint merkwürdig zu sein, sie sollte 'clf.fit (X, Y)' sein, mit X der (vektorisierte) Text und Y die Label deines Trainingssatzes. – dooms

Antwort

1

Verwenden Sie stattdessen die accuracy_score der sklearn metrics.

>>> from sklearn.metrics import accuracy_score 
>>> y_pred = [0, 2, 1, 3] 
>>> y_true = [0, 1, 2, 3] 
>>> accuracy_score(y_true, y_pred) 
0.5 

Ich denke, Sie mischen einige Dinge über Supervised Learning.
Sehen Sie diese answer und versuchen Sie, die top of this page zu verstehen.

Ihre Daten sollten in dieser Form sein (vor der Vektorisierung tun):

X = [["The cat is sleeping"], ..., ["The man is dead"]] 
Y = [1, ..., 0] 
+0

Ich habe es versucht: print accuracy_score (test_data_features.toarray(), vorhergesagt) aber immer noch keine Ergebnisse – user200188

+1

Sie müssen die Liste der richtigen Beschriftungen und die Liste der vorhergesagten Beschriftungen von Ihrem Modell der accuracy_score-Methode zu beurteilen die Leistung Ihres Modells. – dooms

+0

Ok Ich bin mir nicht sicher, ob ich richtig liege, aber könntest du mir meinen oben eingefügten Code ansehen und mich wissen lassen, ob ich etwas falsch mache. Bis jetzt habe ich keinen Fehler und kann nicht herausfinden, was falsch ist. Alles funktioniert gut außer dem Genauigkeitsteil. Ich habe eine Textdatei, die ich in testing_set und training_set unterteilt habe. – user200188

0

Sie einen Fehler zumindest in dieser Linie haben

CLF = MultinomialNB() passen (X_train_tf, training_set.. split ('\ n')

Sie müssen Ihre Trainingsbeschriftungen und vektorisierten Daten darin haben, aber Sie haben die ursprünglichen und vektorisierten Daten.

Es sollte wie folgt aussehen:.

CLF = MultinomialNB() passen (X_train_tf, y_train)

Aber Sie haben nicht einmal die Daten überall in Ihrem Code y_train Label haben, wie weit kann ich sagen, .

+0

danke. Ich habe das später bemerkt und ich versuche das np.array (training_set) zu benutzen, aber es scheint irgendwie eine Herausforderung zu sein, meinen Text zu vektorisieren. Wenn ich das mache, == np.array (list_nltk.split()) Ich bekomme die Zeilen aber keine Spalte z. B. (934567,) Wie vektorisiere ich wirklich meine Textdatei? Ich habe das schon eine Weile versucht. Also, ich denke, ich muss nur fragen, wie man mit scikit lerne die Trainingslabels bekommt? – user200188

+0

Trainingsbezeichnungen müssen Sie in Ihrem ursprünglichen Datensatz haben. Es ist nicht etwas, das du erzeugen kannst (mit Sklearn) – Diego

+0

In diesem Fall wäre mein Trainingsetikett "Shakespeare", während ich versuche, einen Shakespeare-Text zu trainieren. Ein komplettes Beispiel, wie man solchen Text trainiert? Ich kann anscheinend nichts online finden, um zu lernen. – user200188