Domanda

Sto utilizzando un classificatore Naive Bayes per classificare diverse migliaia di documenti in 30 categorie diverse.Ho implementato un classificatore Naive Bayes e, con alcune selezioni di funzionalità (principalmente filtraggio di parole inutili), ho ottenuto una precisione del test di circa il 30%, con una precisione di addestramento del 45%.Questo è significativamente migliore del casuale, ma voglio che sia migliore.

Ho provato a implementare AdaBoost con NB, ma non sembra dare risultati sensibilmente migliori (la letteratura sembra divisa su questo, alcuni articoli dicono che AdaBoost con NB non dà risultati migliori, altri sì).Conosci altre estensioni di NB che potrebbero fornire una migliore precisione?

È stato utile?

Soluzione

Nella mia esperienza, i classificatori Naive Bayes adeguatamente addestrati sono in genere sorprendentemente accurati (e molto veloci da addestrare, notevolmente più veloci di qualsiasi costruttore di classificatori che abbia mai usato).

quindi, quando vuoi migliorare la previsione del classificatore, puoi cercare in diversi posti:

  • ottimizza il tuo classificatore (regolando i parametri sintonizzabili del classificatore);

  • applicare una sorta di tecnica di combinazione del classificatore (ad es. ensembling, potenziamento, insaccamento);o puoi

  • guarda a i dati Nutriti al classificatore: aggiungi più dati, migliora l'analisi di base o perfeziona le funzionalità selezionate dai dati.

senza classificatori bayesiani ingenui, l'ottimizzazione dei parametri è limitata;Ti consiglio di concentrarti sui tuoi dati, ovvero sulla qualità della pre-elaborazione e sulla selezione delle funzionalità.

IO.Analisi dei dati (pre-elaborazione)

presumo che i tuoi dati grezzi siano qualcosa come una stringa di testo grezzo per ciascun punto dati, che mediante una serie di passaggi di elaborazione trasformi ogni stringa in un vettore strutturato (array 1D) per ciascun punto dati in modo tale che ogni offset corrisponda a una caratteristica ( solitamente una parola) e il valore in quell'offset corrisponde alla frequenza.

  • derivante:manualmente o utilizzando una libreria di stemming?i popolari open source sono Porter, Lancaster e Snowball.Quindi, ad esempio, se hai i termini programmatore, programma, progrebbe, programmato In un determinato punto dati, uno stemmer li ridurrà a un singolo stelo (probabilmente programma) Quindi il tuo termine vettoriale per quel punto dati avrà un valore di 4 per il programma di funzionalità, che è probabilmente quello che desideri.

  • ricerca di sinonimi:stessa idea della radice: piegare parole correlate in una singola parola;Quindi un sinonimo di ricerca può identificare lo sviluppatore, il programmatore, il programmatore e l'ingegnere del software e lanciarli in un unico termine

  • parole neutre:le parole con frequenze simili tra le classi producono caratteristiche scadenti


II.Selezione delle funzionalità

consideriamo un caso d’uso prototipo per gli NBC:filtraggio dello spam;puoi vedere rapidamente come fallisce e altrettanto rapidamente puoi vedere come migliorarlo.Ad esempio, i filtri antispam superiori alla media hanno caratteristiche sfumate come:frequenza delle parole tutte maiuscole, frequenza delle parole nel titolo e presenza di punti esclamativi nel titolo.Inoltre, le caratteristiche migliori spesso non sono singole parole ma, ad esempio, coppie di parole o gruppi di parole più grandi.

III.Ottimizzazioni specifiche del classificatore

Invece di 30 classi usa a schema “uno contro molti”.--in altre parole, inizi con un classificatore a due classi (Classe A e "tutto il resto"), quindi i risultati nella classe "tutto il resto" vengono restituiti all'algoritmo per la classificazione in Classe B e "tutto il resto", ecc. .

Il metodo Fisher (probabilmente il modo più comune per ottimizzare un classificatore Naive Bayes.) A me Penso a Fisher come normalizzante (più correttamente, standardizzazione) le probabilità di input Una NBC utilizza le probabilità delle caratteristiche per costruire una probabilità dell'"intero documento".Il metodo Fisher calcola la probabilità di una categoria per ogni caratteristica del documento quindi combina queste probabilità di caratteristiche e confronta tale probabilità combinata con la probabilità di un insieme casuale di caratteristiche.

Altri suggerimenti

Io suggerirei di usare un SGDClassifier come nel questo e sintonizzare in termini di forza regolarizzazione.

Cerchiamo anche di regolare la formula in TFIDF stai usando sintonizzando i parametri di TFIFVectorizer .

  • Io di solito vedere che per problemi di classificazione di testo SVM o logistiche Regressioin , quando addestrato uno-contro-supera tutte NB. Come si può vedere nel questo simpatico articolo di Stanford persone per documenti più lunghi SVM Sorpassa NB. Il codice per la carta che utilizza una combinazione di SVM e NB ( NBSVM ) è qui .

  • In secondo luogo, sintonizzare la vostra formula TFIDF (ad esempio sublineare tf, smooth_idf).

  • Normalizzare i campioni con L2 o normalizzazione l1 (impostazione predefinita in Tfidfvectorization) perché compensa per le diverse lunghezze dei documenti.

  • percettrone multistrato , di solito ottiene risultati migliori rispetto NB o SVM causa della non linearità introdotto che è inerente a molti problemi di classificazione di testi. Ho implementato uno altamente parallelo utilizzando Theano / Lasagne che è facile da usare e scaricabile qui .

  • Prova a affinare la L1 / L2 / elasticnet regolarizzazione . Si fa una grande differenza nella SGDClassifier / SVM / regressione logistica.

  • tenta di utilizzare n-grammi , che è configurabile in tfidfvectorizer.

  • Se i documenti hanno una struttura (per esempio avere titoli ) considerare l'utilizzo di caratteristiche differenti per le diverse parti. Per esempio add title_word1 al documento se word1 accade nel titolo del documento.

  • Si consiglia di utilizzare il lunghezza del documento come caratteristica (ad esempio numero di parole o caratteri).

  • Si consideri utilizzando meta informazioni sul documento (per esempio momento della creazione, il nome dell'autore, l'URL del documento, ecc.).

  • Recentemente Facebook FastText Codice di classificazione che svolge molto bene attraverso molte attività, assicuratevi di provarlo.

Uso della correzione Laplaciano con AdaBoost.

In AdaBoost, prima un peso viene assegnato a ogni tupla di dati nel set di dati di addestramento. I pesi intial vengono impostati utilizzando il metodo init_weights, che inizializza ciascun peso di essere 1/d, dove d è la dimensione del set di dati di addestramento.

Poi, un metodo generate_classifiers viene chiamato, che corre k volte, creando istanze k del classificatore Naïve Bayes. Questi classificatori vengono ponderati, ei dati di test viene eseguito su ciascun classificatore. La somma dei "voti" ponderate dei classificatori costituisce la classifica finale.

mantenendo la dimensione piccola n anche fare NB per dare elevata risultato precisione. e al centro, come la dimensione n aumentare la precisione degrado,

Seleziona le caratteristiche che hanno meno correlazione tra loro. E provare a utilizzare diverse combinazioni di funzioni alla volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top