Come sviluppare un classificatore Naive Bayes da zero in Python

Tweet Share Share

Ultimo aggiornamento il 10 gennaio 2020

La classificazione è un problema di modellazione predittiva che comporta l’assegnazione di un’etichetta a un dato campione di dati di input.

Il problema della modellazione predittiva di classificazione può essere inquadrato come calcolo della probabilità condizionale di un’etichetta di classe dato un campione di dati., Il teorema di Bayes fornisce un modo di principio per calcolare questa probabilità condizionale, anche se in pratica richiede un numero enorme di campioni (set di dati di dimensioni molto grandi) ed è computazionalmente costoso.

Invece, il calcolo del Teorema di Bayes può essere semplificato facendo alcune ipotesi, come ad esempio ogni variabile di input è indipendente da tutte le altre variabili di input. Sebbene un’ipotesi drammatica e irrealistica, questo ha l’effetto di rendere trattabili i calcoli della probabilità condizionata e si traduce in un modello di classificazione efficace denominato Naive Bayes.,

In questo tutorial, scoprirai l’algoritmo Naive Bayes per la modellazione predittiva di classificazione.

Dopo aver completato questo tutorial, saprai:

  • Come inquadrare la modellazione predittiva di classificazione come un modello di probabilità condizionale.
  • Come utilizzare il teorema di Bayes per risolvere il modello di probabilità condizionale di classificazione.
  • Come implementare il teorema di Bayes semplificato per la classificazione, chiamato algoritmo Naive Bayes.,

Avvia il tuo progetto con il mio nuovo libro Probability for Machine Learning, inclusi tutorial passo-passo e i file di codice sorgente Python per tutti gli esempi.

Iniziamo.

  • Aggiornato ottobre / 2019: Risolto problema minore incoerenza in notazione matematica.
  • Aggiornamento Jan / 2020: Aggiornato per le modifiche in scikit-learn v0.22 API.

Come sviluppare un classificatore Naive Bayes da zero in Python
Foto di Ryan Dickey, alcuni diritti riservati.,

Tutorial Panoramica

Questo tutorial è diviso in cinque parti, che sono:

  1. Probabilità Condizionale Modello di Classificazione
  2. Semplificata o Naive Bayes
  3. Come Calcolare il Preventivo e le Probabilità condizionate
  4. Lavorato Esempio di Naive Bayes
  5. 5 Suggerimenti Quando si Utilizza Naive Bayes

Probabilità Condizionale Modello di Classificazione

In macchina di apprendimento, spesso siamo interessati a una modellazione predittiva di un problema di cui vogliamo prevedere una etichetta di classe per una data di osservazione., Ad esempio, classificando le specie di piante in base alle misurazioni del fiore.

Problemi di questo tipo sono indicati come problemi di modellazione predittiva di classificazione, al contrario di problemi di regressione che comportano la previsione di un valore numerico. L’osservazione o l’input al modello è indicato come X e l’etichetta di classe o l’output del modello è indicato come y.

Insieme, X e y rappresentano le osservazioni raccolte dal dominio, cioè una tabella o matrice (colonne e righe o caratteristiche e campioni) di dati di allenamento utilizzati per adattarsi a un modello., Il modello deve imparare come mappare esempi specifici alle etichette di classe o y = f (X) che hanno ridotto al minimo l’errore di errata classificazione.

Un approccio per risolvere questo problema è sviluppare un modello probabilistico. Da una prospettiva probabilistica, siamo interessati a stimare la probabilità condizionale dell’etichetta di classe, data l’osservazione.

Ad esempio, un problema di classificazione può avere etichette di classe k y1, y2, variables, yk e n variabili di input, X1, X2,…, Xn., Siamo in grado di calcolare la probabilità condizionata di un etichetta di classe con una determinata istanza o di un insieme di valori di input per ogni colonna x1, x2, …, xn, come segue:

  • P(yi | x1, x2, …, xn)

La probabilità condizionale può quindi essere calcolato per ogni classe etichetta del problema e l’etichetta con la più alta probabilità può essere restituito come il più probabile classificazione.

La probabilità condizionale può essere calcolata utilizzando la probabilità congiunta, anche se sarebbe intrattabile. Il teorema di Bayes fornisce un modo di principio per calcolare la probabilità condizionale.,

La forma semplice del calcolo per il teorema di Bayes è la seguente:

  • P(A|B) = P(B|A) * P(A) / P(B)

Dove la probabilità che siamo interessati a calcolare P(A|B) è chiamata probabilità posteriore e la probabilità marginale dell’evento P(A) è chiamata precedente.,

Possiamo telaio classificazione condizionale classificazione problema con il Teorema di Bayes, come segue:

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn | yi) * P(yi) / P(x1, x2, …, xn)

La prima P(yi) è facile stimare da un set di dati, ma la probabilità condizionale di osservazione in base alla classe P(x1, x2, …, xn | yi) non è fattibile a meno che il numero di esempi è straordinariamente grande, ad esempio, abbastanza grande per una valutazione efficace la distribuzione di probabilità per tutte le diverse possibili combinazioni di valori.,

Come tale, l’applicazione diretta del Teorema di Bayes diventa anche intrattabile, specialmente quando aumenta il numero di variabili o caratteristiche (n).

Vuoi imparare la probabilità per l’apprendimento automatico

Prendi il mio corso accelerato gratuito di 7 giorni (con codice di esempio).

Fare clic per iscriversi e anche ottenere una versione PDF Ebook gratuito del corso.,

Scarica il tuo Mini-corso GRATUITO

Simplified or Naive Bayes

La soluzione per utilizzare il teorema di Bayes per un modello di classificazione delle probabilità condizionali è semplificare il calcolo.

Il teorema di Bayes presuppone che ogni variabile di input dipenda da tutte le altre variabili. Questa è una causa di complessità nel calcolo. Possiamo rimuovere questa ipotesi e considerare ogni variabile di input come indipendente l’una dall’altra.,

Questo cambia il modello da un modello di probabilità condizionale dipendente a un modello di probabilità condizionale indipendente e semplifica notevolmente il calcolo.

In primo luogo, il denominatore viene rimosso dal calcolo P(x1, x2, …, xn) in quanto è una costante utilizzata nel calcolo della probabilità condizionale di ogni classe per una determinata istanza e ha l’effetto di normalizzare il risultato.,

  • P(yi | x1, x2, …, xn) = P(x1, x2, …, xn/yi) * P(yi)

Successivamente, la probabilità condizionale di tutte le variabili data l’etichetta di classe viene modificata in probabilità condizionali separate di ogni valore variabile data l’etichetta di classe. Queste variabili condizionali indipendenti vengono quindi moltiplicate insieme. Ad esempio:

  • P(yi|x1, x2, …, xn) = P(x1|yi) * P(x2|yi) * … P(xn/yi) * P(yi)

Questo calcolo può essere eseguito per ciascuna delle etichette di classe e l’etichetta con la maggiore probabilità può essere selezionata come classificazione per l’istanza data., Questa regola di decisione è indicato come il massimo a posteriori, o MAPPA, regola di decisione.

Questa semplificazione del teorema di Bayes è comune e ampiamente utilizzata per problemi di modellazione predittiva di classificazione ed è generalmente indicata come Naive Bayes.

La parola “ingenuo” è francese e tipicamente ha una diaeresi (umlaut) sopra la “i”, che è comunemente lasciata fuori per semplicità, e “Bayes” è in maiuscolo come è chiamato per il reverendo Thomas Bayes.,

Come calcolare le probabilità precedenti e condizionali

Ora che sappiamo cos’è Naive Bayes, possiamo dare un’occhiata più da vicino a come calcolare gli elementi dell’equazione.

Il calcolo del P precedente (yi) è semplice. Può essere stimato dividendo la frequenza delle osservazioni nel set di dati di formazione che hanno l’etichetta di classe per il numero totale di esempi (righe) nel set di dati di formazione., Ad esempio:

  • P(yi) = esempi con yi / esempi totali

La probabilità condizionale per un valore di caratteristica data l’etichetta della classe può anche essere stimata dai dati. In particolare, quegli esempi di dati che appartengono a una determinata classe e una distribuzione di dati per variabile. Ciò significa che se ci sono classi K e n variabili, che k * n diverse distribuzioni di probabilità devono essere creati e mantenuti.

È necessario un approccio diverso a seconda del tipo di dati di ciascuna funzionalità., In particolare, i dati vengono utilizzati per stimare i parametri di una delle tre distribuzioni di probabilità standard.

Nel caso di variabili categoriali, come conteggi o etichette, è possibile utilizzare una distribuzione multinomiale. Se le variabili sono binarie, come yes / no o true / false, è possibile utilizzare una distribuzione binomiale. Se una variabile è numerica, come una misura, spesso viene utilizzata una distribuzione gaussiana.

  • Binario: distribuzione binomiale.
  • Categoriale: Distribuzione multinomiale.
  • Numerico: distribuzione gaussiana.,

Queste tre distribuzioni sono così comuni che l’implementazione Naive Bayes prende spesso il nome dalla distribuzione. Ad esempio:

  • Bayes Naive binomiale: Bayes Naive che utilizza una distribuzione binomiale.
  • Multinomial Naive Bayes: Naive Bayes che utilizza una distribuzione multinomiale.
  • Gaussian Naive Bayes: Naive Bayes che utilizza una distribuzione gaussiana.

Un set di dati con tipi di dati misti per le variabili di input può richiedere la selezione di diversi tipi di distribuzioni di dati per ogni variabile.,

L’utilizzo di una delle tre distribuzioni comuni non è obbligatorio; ad esempio, se una variabile a valore reale è nota per avere una distribuzione specifica diversa, come esponenziale, allora quella distribuzione specifica può essere utilizzata al suo posto. Se una variabile a valore reale non ha una distribuzione ben definita, come bimodale o multimodale, allora uno stimatore della densità del kernel può essere usato per stimare la distribuzione di probabilità.

L’algoritmo Naive Bayes si è dimostrato efficace e quindi è popolare per le attività di classificazione del testo., Le parole in un documento possono essere codificate come vettori di input binari (word present), count (word occurrence) o frequency (tf/idf) e distribuzioni di probabilità binarie, multinomiali o gaussiane utilizzate rispettivamente.

Esempio di Naive Bayes

In questa sezione, renderemo concreto il calcolo di Naive Bayes con un piccolo esempio su un set di dati di apprendimento automatico.

Possiamo generare un piccolo problema di classificazione binario (classe 2) utilizzando la funzione make_blobs() dall’API scikit-learn.,

L’esempio seguente genera 100 esempi con due variabili di input numerici, ciascuna assegnata a una delle due classi.

L’esecuzione dell’esempio genera il set di dati e ne riassume le dimensioni, confermando che il set di dati è stato generato come previsto.

L’argomento “random_state” è impostato su 1, assicurando che lo stesso campione casuale di osservazioni venga generato ogni volta che viene eseguito il codice.

Vengono stampati anche gli elementi di input e output dei primi cinque esempi, mostrando che in effetti, le due variabili di input sono numeriche e le etichette di classe sono 0 o 1 per ogni esempio.,

Modelleremo le variabili di input numerico usando una distribuzione di probabilità gaussiana.

Questo può essere ottenuto utilizzando la norma SciPy API. In primo luogo, la distribuzione può essere costruita specificando i parametri della distribuzione, ad esempio la media e la deviazione standard, quindi la funzione di densità di probabilità può essere campionata per valori specifici utilizzando la norma.funzione pdf ().

Possiamo stimare i parametri della distribuzione dal set di dati usando le funzioni mean() e std() NumPy.,

La funzione fit_distribution() di seguito prende un campione di dati per una variabile e si adatta a una distribuzione di dati.

Ricordiamo che siamo interessati alla probabilità condizionale di ogni variabile di input. Ciò significa che abbiamo bisogno di una distribuzione per ciascuna delle variabili di input, e un insieme di distribuzioni per ciascuna delle etichette di classe, o quattro distribuzioni in totale.

In primo luogo, dobbiamo dividere i dati in gruppi di campioni per ciascuna delle etichette di classe.,

1
2
3
4
5

# ordina i dati in classi
Xy0 = X
Xy1 = X
print(Xy0.,forma, Xy1.shape)

Possiamo quindi utilizzare questi gruppi per calcolare le probabilità precedenti per un campione di dati appartenente a ciascun gruppo.

Questo sarà esattamente il 50% dato che abbiamo creato lo stesso numero di esempi in ciascuna delle due classi; tuttavia, calcoleremo questi priori per completezza.,

1
2
3
4
5

…,
# calcolare priori
priory0 = len(Xy0) / len(X)
priory1 = len(Xy1) / len(X)
stampa(priory0, priory1)

Infine, possiamo chiamare il fit_distribution() funzione che abbiamo definito per preparare una distribuzione di probabilità per ogni variabile, per ogni classe di etichetta.

Legando tutto questo insieme, il modello probabilistico completo del set di dati è elencato di seguito.,

L’esecuzione dell’esempio divide prima il set di dati in due gruppi per le due etichette di classe e conferma che la dimensione di ciascun gruppo è pari e i priori sono del 50%.

Le distribuzioni di probabilità vengono quindi preparate per ogni variabile per ogni etichetta di classe e vengono riportati i parametri di media e deviazione standard di ciascuna distribuzione, confermando che le distribuzioni differiscono.

Successivamente, possiamo usare il modello probabilistico preparato per fare una previsione.,

La probabilità condizionale indipendente per ogni etichetta di classe può essere calcolata utilizzando il precedente per la classe (50%) e la probabilità condizionale del valore per ogni variabile.

La funzione probability() di seguito esegue questo calcolo per un esempio di input (array di due valori) data la distribuzione di probabilità precedente e condizionale per ogni variabile. Il valore restituito è un punteggio piuttosto che una probabilità in quanto la quantità non è normalizzata, una semplificazione spesso eseguita quando si implementa naive bayes.,

Possiamo usare questa funzione per calcolare la probabilità per un esempio appartenente a ciascuna classe.

In primo luogo, possiamo selezionare un esempio da classificare; in questo caso, il primo esempio nel set di dati.,

1
2
3

…,
# classificare un esempio
Xsample, ysample = X, y

Successivamente, possiamo calcolare il punteggio dell’esempio appartenente alla prima classe, quindi alla seconda classe, quindi riportare i risultati.

La classe con il punteggio più grande sarà la classificazione risultante.

Legando questo insieme, l’esempio completo di adattamento del modello Naive Bayes e usarlo per fare una previsione è elencato di seguito.,

L’esecuzione dell’esempio prepara prima le probabilità precedenti e condizionali come prima, quindi le utilizza per fare una previsione per un esempio.

Il punteggio dell’esempio appartenente a y=0 è circa 0.3 (ricorda che questa è una probabilità non normalizzata), mentre il punteggio dell’esempio appartenente a y=1 è 0.0. Pertanto, classificheremmo l’esempio come appartenente a y=0.

In questo caso, il risultato vero o effettivo è noto, y=0, che corrisponde alla previsione del nostro ingenuo modello di Bayes.,

1
2
3

P(y=0 | ) = 0.348
P(y=1 | ) = 0.,000
Truth: y = 0

In pratica, è una buona idea utilizzare implementazioni ottimizzate dell’algoritmo Naive Bayes. La libreria scikit-learn fornisce tre implementazioni, una per ciascuna delle tre principali distribuzioni di probabilità; ad esempio, BernoulliNB, MultinomialNB e GaussianNB per le variabili di input distribuiti binomiali, multinomiali e gaussiane rispettivamente.

Per utilizzare un modello scikit-learn Naive Bayes, prima viene definito il modello, quindi è adatto al set di dati di allenamento., Una volta in forma, le probabilità possono essere previste tramite la funzione predict_proba() e le etichette di classe possono essere previste direttamente tramite la funzione predict ().

L’esempio completo di montaggio di un modello Gaussian Naive Bayes (GaussianNB) allo stesso set di dati di test è elencato di seguito.

L’esecuzione dell’esempio si adatta al modello sul set di dati di allenamento, quindi effettua previsioni per lo stesso primo esempio utilizzato nell’esempio precedente.

In questo caso, la probabilità dell’esempio appartenente a y=0 è 1.0 o una certezza. La probabilità di y = 1 è un valore molto piccolo vicino a 0.0.,

Infine, l’etichetta della classe viene prevista direttamente, di nuovo corrispondente alla verità di base per l’esempio.,iv>

1
2
3

Previsto Probabilità: ]
Predetto Classe:
la Verità: y=0

5 Suggerimenti Quando si Utilizza Naive Bayes

in Questa sezione sono elencati alcuni consigli pratici quando si lavora con i modelli Naive Bayes.,

Usa un KDE per distribuzioni complesse

Se la distribuzione di probabilità per una variabile è complessa o sconosciuta, può essere una buona idea usare uno stimatore di densità del kernel o KDE per approssimare la distribuzione direttamente dai campioni di dati.

Un buon esempio potrebbe essere il Gaussian KDE.

Prestazioni ridotte con l’aumento della dipendenza variabile

Per definizione, Naive Bayes presuppone che le variabili di input siano indipendenti l’una dall’altra.

Questo funziona bene la maggior parte del tempo, anche quando alcune o la maggior parte delle variabili sono in realtà dipendenti., Tuttavia, le prestazioni dell’algoritmo si degradano più le variabili di input dipendono.

Evita il Underflow numerico con Log

Il calcolo della probabilità condizionale indipendente per un esempio per un’etichetta di classe comporta la moltiplicazione di molte probabilità insieme, una per la classe e una per ogni variabile di input. Come tale, la moltiplicazione di molti piccoli numeri insieme può diventare numericamente instabile, soprattutto quando il numero di variabili di input aumenta.,

Per superare questo problema, è comune cambiare il calcolo dal prodotto delle probabilità alla somma delle probabilità di log. Per esempio:

  • P(yi | x1, x2, …, xn) = log(P(x1|y1)) + log(P(x2|y1)) + … log(P(xn|y1)) + log(P(yi))

Calcolare il logaritmo naturale di probabilità ha l’effetto di creare maggiore (in negativo) numeri e aggiungere i numeri insieme significa che maggiore probabilità sarà più vicino a zero. I valori risultanti possono ancora essere confrontati e massimizzati per dare l’etichetta di classe più probabile.,

Questo è spesso chiamato il log-trick quando si moltiplicano le probabilità.

Aggiorna le distribuzioni di probabilità

Quando nuovi dati diventano disponibili, può essere relativamente semplice utilizzare questi nuovi dati con i vecchi dati per aggiornare le stime dei parametri per la distribuzione di probabilità di ciascuna variabile.

Ciò consente al modello di utilizzare facilmente nuovi dati o le distribuzioni di dati che cambiano nel tempo.

Usa come modello Generativo

Le distribuzioni di probabilità riassumeranno la probabilità condizionale di ogni valore variabile di input per ogni etichetta di classe.,

Queste distribuzioni di probabilità possono essere utili più in generale oltre l’uso in un modello di classificazione.

Ad esempio, le distribuzioni di probabilità preparate possono essere campionate in modo casuale per creare nuove istanze di dati plausibili. L’ipotesi di indipendenza condizionale assunta può significare che gli esempi sono più o meno plausibili in base a quanta effettiva interdipendenza esiste tra le variabili di input nel set di dati.

Ulteriori letture

Questa sezione fornisce più risorse sull’argomento se stai cercando di approfondire.,

Tutorial

  • Naive Bayes Tutorial per l’Apprendimento automatico
  • Naive Bayes per l’Apprendimento automatico
  • Meglio Naive Bayes: 12 Consigli Per Ottenere Il massimo Dal Naive Bayes

Libri

  • Macchina di Apprendimento, 1997.
  • Machine Learning: una prospettiva probabilistica, 2012.
  • Riconoscimento di pattern e apprendimento automatico, 2006.
  • Data Mining: strumenti pratici di apprendimento automatico e tecniche, 4a edizione, 2016.

API

Articoli

  • Teorema di Bayes, Wikipedia.
  • Classificatore Naive Bayes, Wikipedia.,
  • Stima massima a posteriori, Wikipedia.

Sommario

In questo tutorial, hai scoperto l’algoritmo Naive Bayes per la modellazione predittiva di classificazione.

In particolare, hai imparato:

  • Come inquadrare la modellazione predittiva di classificazione come un modello di probabilità condizionale.
  • Come utilizzare il teorema di Bayes per risolvere il modello di probabilità condizionale di classificazione.
  • Come implementare il teorema di Bayes semplificato per la classificazione chiamato algoritmo Naive Bayes.

Hai qualche domanda?,
Fai le tue domande nei commenti qui sotto e farò del mio meglio per rispondere.

Ottieni un handle sulla probabilità per l’apprendimento automatico!

Sviluppa la tua comprensione della probabilità

…con poche righe di codice python

Scopri come nel mio nuovo Ebook:
Probabilità per l’apprendimento automatico

Fornisce tutorial di autoapprendimento e progetti end-to-end su:
Teorema di Bayes, Ottimizzazione bayesiana, distribuzioni, Massima verosimiglianza, Cross-Entropia, modelli di calibrazione
e molto altro ancora…,

Infine Sfrutta l’incertezza nei tuoi progetti

Salta gli accademici. Solo risultati.Scopri cosa c’è dentro

Tweet Condividi Condividi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *