2012-05-02 12 views
13

Sto confrontando due classificatori di Naive Bayes: uno from NLTK e uno from scikit-learn. Ho a che fare con un problema di classificazione multi-classe (3 classi: positivo (1), negativo (-1) e neutro (0)).scikits learn and nltk: prestazioni del classificatore Naive Bayes molto diverse

Senza eseguire alcuna selezione di funzionalità (ovvero utilizzando tutte le funzioni disponibili) e utilizzando un set di dati di formazione di 70.000 istanze (con etichetta con etichetta, con una distribuzione di istanza del 17% positiva, 4% negativa e 78% neutra), Formulo due classificatori, il primo è nltk.NaiveBayesClassifier e il secondo è sklearn.naive_bayes.MultinomialNB (con fit_prior=True).

Dopo l'allenamento, ho valutato i classificatori sulla mia prova set di 30.000 casi e ottengo i seguenti risultati:

**NLTK's NaiveBayes** 
accuracy: 0.568740 
class: 1 
    precision: 0.331229 
    recall: 0.331565 
    F-Measure: 0.331355 
class: -1 
    precision: 0.079253 
    recall: 0.446331 
    F-Measure: 0.134596 
class: 0 
    precision: 0.849842 
    recall: 0.628126 
    F-Measure: 0.722347 


**Scikit's MultinomialNB (with fit_prior=True)** 
accuracy: 0.834670 
class: 1 
    precision: 0.400247 
    recall: 0.125359 
    F-Measure: 0.190917 
class: -1 
    precision: 0.330836 
    recall: 0.012441 
    F-Measure: 0.023939 
class: 0 
    precision: 0.852997 
    recall: 0.973406 
    F-Measure: 0.909191 

**Scikit's MultinomialNB (with fit_prior=False)** 
accuracy: 0.834680 
class: 1 
    precision: 0.400380 
    recall: 0.125361 
    F-Measure: 0.190934 
class: -1 
    precision: 0.330836 
    recall: 0.012441 
    F-Measure: 0.023939 
class: 0 
    precision: 0.852998 
    recall: 0.973418 
    F-Measure: 0.909197 

ho notato che mentre classificatore di Scikit ha una migliore precisione complessiva e precisione, il suo richiamo molto è basso rispetto a quello NLTK, almeno con i miei dati. Tenendo conto che potrebbero essere (quasi) gli stessi classificatori, non è strano?

+0

Quali sono le funzionalità? Hai provato anche un 'BernoulliNB'? Questo dovrebbe essere più vicino al NaTto Bayes della NLTK. –

+0

Grazie per la risposta. Le funzionalità sono parole con valore 1 se esistono nel documento (booleano). I risultati per scikits BernoulliNB sono molto vicino a MultinomialNB: 'precisione: 0,834,68 mila classe: 1 \t precisione: 0,400,38 mila \t richiamo: 0,125,361 mila \t F-Measure: 0,190,934 mila classe: -1 \t precisione: 0,330,836 mila \t richiamo: 0.012441 \t F-Measure: 0,023,939 mila classe: 0 \t precisione: 0,852,998 mila \t richiamo: 0,973,418 mila \t F-Measure: 0.909197' –

+4

l'unica cosa che posso vedere nella documentat A quanto pare, il classificatore NB NLTK non sembra lisciare. Non mi aspetto che ciò causi una grande differenza, però ... –

risposta

3

Il comportamento predefinito per la classe pesa lo stesso in entrambe le librerie? La differenza di precisione per la classe rari (-1) sembra che potrebbe essere la causa ...

+0

Naive Bayes in NLTK prende la probabilità dell'etichetta precedente, e (penso che) Scikits fa lo stesso quando si usa il file con fit_prior = Vero parametro ... –

+2

La mia (possibilmente falsa) comprensione è che fit_prior = True userà il peso effettivo della classe in modo che, ad esempio, assegnando tutti gli esempi negativi (4% del campione) alla classe neutra si ottenga solo un errore di accuratezza del -4% (che è quello che sembra fare). Prova a eseguirlo con fit_prior = False. –

+0

Grazie. Ho provato a eseguirlo con fit_prior = False e sorprendentemente dà quasi gli stessi risultati (ho aggiornato il post principale) –

2

naive Bayes classificatore solito significa un classfier Bayesiano sopra caratteristiche binari che si presume siano indipendenti. Questo è ciò che gli attrezzi NLTK's Naive Bayes classifier. Il classificatore scikit corrispondente è il classificatore BernoulliNB.

La restrizione alle funzionalità con valori booleani non è effettivamente necessaria, è solo la più semplice da implementare. Un classificatore naive Bayes può essere definito per (assunte) funzioni indipendenti da qualsiasi distribuzione parametrica.

MultinomialNB è per dati con caratteristiche di input con valori interi che si presume siano distribuite multinomialmente.

Sckit ha anche GaussianNB quello per le funzionalità a valore continuo che si presumono distribuite equamente Gaussiane.