2013-07-04 11 views
5

Szukam prostego przykładu na to, jak uruchomić wielodomowy naiwny klasyfikator Bayesa. Natknąłem się na ten przykład z StackOverflow:Klasyfikacja wielonomowego naiwnego klasyfikatora Bayesa z pythonem Przykład

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()) 

Otrzymałem ostrzeżenie po uruchomieniu tego przykładu.

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 

więc moje pytania są ..

  1. ktoś może mi powiedzieć co to oznacza komunikat o błędzie?
  2. Wprowadziłem kilka zmian w oryginalnym kodzie, ale dlaczego macierz zamieszania jest o wiele wyższa niż w oryginalnym wątku?
  3. Jak mogę sprawdzić dokładność tego klasyfikatora?

Odpowiedz

2

Oryginalny kod trenuje pierwsze 100 przykładów pozytywnych i negatywnych, a następnie klasyfikuje pozostałe. Usunąłeś granicę i używałeś każdego przykładu zarówno w fazie treningu, jak i klasyfikacji, innymi słowy masz zduplikowane funkcje. Aby to naprawić, podziel zestaw danych na dwa zestawy, trenuj i testuj.

Matryca zamieszania jest wyższa (lub inna), ponieważ trenujesz na różnych danych.

Matryca zamieszanie jest miarą dokładności i pokazuje liczbę fałszywych alarmów itd. Czytaj więcej tutaj: http://en.wikipedia.org/wiki/Confusion_matrix

+0

proszę [zaakceptować odpowiedź] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235) jeśli był pomocny – Spaceghost

1

użyłem oryginalnego kodu tylko pierwszych 100 wpisów dla zbioru uczącego i jeszcze tego ostrzeżenia . Moje wyjście było:

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 
Powiązane problemy