2013-07-04 82 views
5

Sto cercando un semplice esempio su come eseguire un classificatore multinomiale di Naive Bayes. Mi sono imbattuto in questo esempio da StackOverflow:Classificazione di un classificatore multinomial Naive Bayes con Python Esempio

Implementing Bag-of-Words Naive-Bayes classifier in NLTK

import numpy as np 
from nltk.probability import FreqDist 
from nltk.classify import SklearnClassifier 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.feature_selection import SelectKBest, chi2 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline 

pipeline = Pipeline([('tfidf', TfidfTransformer()), 
        ('chi2', SelectKBest(chi2, k=1000)), 
        ('nb', MultinomialNB())]) 
classif = SklearnClassifier(pipeline) 

from nltk.corpus import movie_reviews 
pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('pos')] 
neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('neg')] 
add_label = lambda lst, lab: [(x, lab) for x in lst] 
#Original code from thread: 
#classif.train(add_label(pos[:100], 'pos') + add_label(neg[:100], 'neg')) 
classif.train(add_label(pos, 'pos') + add_label(neg, 'neg'))#Made changes here 

#Original code from thread:  
#l_pos = np.array(classif.batch_classify(pos[100:])) 
#l_neg = np.array(classif.batch_classify(neg[100:])) 
l_pos = np.array(classif.batch_classify(pos))#Made changes here 
l_neg = np.array(classif.batch_classify(neg))#Made changes here 
print "Confusion matrix:\n%d\t%d\n%d\t%d" % (
      (l_pos == 'pos').sum(), (l_pos == 'neg').sum(), 
      (l_neg == 'pos').sum(), (l_neg == 'neg').sum()) 

ho ricevuto un messaggio di avviso dopo l'esecuzione di questo esempio.

C:\Python27\lib\site-packages\scikit_learn-0.13.1-py2.7-win32.egg\sklearn\feature_selection\univariate_selection.py:327: 
UserWarning: Duplicate scores. Result may depend on feature ordering.There are probably duplicate features, 
or you used a classification score for a regression task. 
warn("Duplicate scores. Result may depend on feature ordering." 

Confusion matrix: 
876 124 
63 937 

Quindi, le mie domande sono ..

  1. Qualcuno può dirmi che cosa significa questo messaggio di errore?
  2. Ho apportato alcune modifiche al codice originale ma perché la matrice di confusione risulta molto più alta di quella nel thread originale?
  3. Come posso verificare la precisione di questo di questo classificatore?

risposta

2

Il codice originale si allena sui primi 100 esempi di positivo e negativo e quindi classifica il resto. Hai rimosso il confine e utilizzato ogni esempio sia nella fase di addestramento che di classificazione, in altre parole, hai le funzionalità duplicate. Per risolvere questo problema, dividere il set di dati in due set, addestrare e testare.

La matrice di confusione è superiore (o diversa) perché ci si sta allenando su dati diversi.

La matrice di confusione è una misura di precisione e mostra il numero di falsi positivi, ecc Per saperne di più qui: http://en.wikipedia.org/wiki/Confusion_matrix

+0

Si prega di [accettare una risposta] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235) se è stato utile – Spaceghost

1

ho usato il codice originale con solo le prime 100 voci per il training set e aveva ancora quell'avvertimento . La mia uscita era:

In [6]: %run testclassifier.py 
C:\Users\..\AppData\Local\Enthought\Canopy\User\lib\site-packages\sklearn\feature_selection\univariate_selecti 
on.py:319: UserWarning: Duplicate scores. Result may depend on feature ordering.There are probably duplicate features, o 
r you used a classification score for a regression task. 
    warn("Duplicate scores. Result may depend on feature ordering." 
Confusion matrix: 
427  473 
132  768 
Problemi correlati