Classificazione del testo: combinazione di diversi tipi di funzionalità


19

Il problema che sto affrontando sta classificando brevi testi in più classi. Il mio approccio attuale è quello di utilizzare le frequenze dei termini ponderate tf-idf e apprendere un semplice classificatore lineare (regressione logistica). Funziona abbastanza bene (circa il 90% di macro F-1 sul set di test, quasi il 100% sul set di allenamento). Un grosso problema sono le parole invisibili / n-grammi.

Sto cercando di migliorare il classificatore aggiungendo altre funzionalità, ad esempio un vettore di dimensioni fisse calcolato usando somiglianze distributive (come calcolato da word2vec) o altre caratteristiche categoriche degli esempi. La mia idea era quella di aggiungere solo le funzionalità alle funzioni di input sparse dal sacco di parole. Tuttavia, ciò comporta prestazioni peggiori sul set di test e di allenamento. Le funzioni aggiuntive forniscono da sole circa l'80% di F-1 sul set di test, quindi non sono spazzatura. Anche il ridimensionamento delle funzionalità non ha aiutato. Il mio pensiero attuale è che questo tipo di caratteristiche non si mescolano bene con le caratteristiche (sparse) delle parole.

Quindi la domanda è: supponendo che le funzionalità aggiuntive forniscano informazioni aggiuntive, qual è il modo migliore per incorporarle? Potrebbe addestrare classificatori separati e combinarli in una sorta di lavoro d'insieme (questo avrebbe probabilmente lo svantaggio di non poter catturare l'interazione tra le caratteristiche dei diversi classificatori)? Ci sono altri modelli più complessi che dovrei considerare?


3
Alcuni aggiornamenti: sono stato in grado di ottenere risultati accettabili normalizzando l2 i vettori densi aggiuntivi. Ho erroneamente supposto che lo sklearn StandardScaler lo facesse. Sto ancora cercando metodi più complessi, che mi permettano di modellare le dipendenze delle etichette o incorporare la fiducia dei sotto-classificatori.
Elmille,

Stavo facendo lo stesso esperimento di base l'anno scorso e ho riscontrato esattamente lo stesso problema che hai. Il tuo vettore word2vec dopo il processo di normalizzazione l2 può battere BOW? Non ho eseguito la normalizzazione di l2, ma anche dopo aver testato molti metodi di post-elaborazione, il vettore semantico è ancora 2-4 percento assoluto dietro le caratteristiche di BOW tf / idf, mi chiedo che quella direzione sia un deadend. Il mio obiettivo originale è quello di combinare un vettore densamente semantico con il tradizionale BOW e vedere se può migliorare le prestazioni di classificazione / modellazione degli argomenti. A proposito: su quale set di dati hai lavorato, il mio è 20newsgroup.

Stavo lavorando con un set di dati per il concorso CIKM 2014. Per me, le rappresentazioni vettoriali non sono mai state in grado di battere BOW con pesi tf-idf. Il mio piano era di usarli oltre a migliorare la qualità. Nella mia esperienza (per la classificazione del testo) una forma di tf-idf + un modello lineare con n-grammi è un approccio estremamente forte. Attualmente sto sperimentando reti neurali convoluzionali e persino con questi modelli (più o meno) complessi che si avvicinano a difficoltà.
Elmille,

Per Mod: mi dispiace che non ho 50 reputazione, quindi non posso scrivere nell'area dei commenti. Ciao Elmille: Sì, è quello che provo in tutti i test. Tuttavia, trovi quella parola vec + aiuto BOW? Nella mia esperienza, quando concateno la parola vec con BOW tf-idf (nel mio caso questo vec è in realtà un vettore complessivo nell'intero articolo, non è parola-vec ma molto simile), le prestazioni diventano ancora più basse. Inizialmente penso che dovrebbe essere BOW + vec> BOW> vec. Dal momento che contengono informazioni di assistenza reciproca. Il risultato effettivo è BOW> vec> BOW + vec. Quindi

Risposte:


13

Se ho capito bene, hai essenzialmente due forme di funzionalità per i tuoi modelli. (1) Dati di testo che hai rappresentato come un insieme sparuto di parole e (2) caratteristiche più tradizionali e dense. In tal caso, esistono 3 approcci comuni:

  1. Esegui la riduzione della dimensionalità (come LSA via TruncatedSVD) sui tuoi dati sparsi per renderli densi e combinare le funzionalità in un'unica matrice densa per addestrare i tuoi modelli.
  2. Aggiungi le tue poche funzioni dense alla tua matrice sparsa usando qualcosa come scipy hstackin una singola matrice sparsa per addestrare i tuoi modelli.
  3. Crea un modello usando solo i tuoi dati di testo sparsi e quindi combina le sue previsioni (probabilità se si tratta di classificazione) come una funzione densa con le altre tue funzioni dense per creare un modello (cioè: assemblaggio tramite stacking). Se segui questa strada, ricordati di utilizzare solo le previsioni CV come funzioni per addestrare il tuo modello, altrimenti probabilmente ti addizionerai abbastanza male (puoi fare una classe abbastanza per farlo tutto in uno solo Pipelinese lo desideri).

Tutti e tre gli approcci sono validi e hanno i loro pro e contro. Personalmente, trovo (1) in genere il peggiore perché, relativamente parlando, è estremamente lento. Trovo anche (3) di solito il migliore, essendo sia sufficientemente veloce che risultando in ottime previsioni. Ovviamente puoi anche fare una combinazione di questi se sei disposto a fare un ensemble più ampio.

Per quanto riguarda gli algoritmi che utilizzi, possono sostanzialmente adattarsi a quel framework. La regressione logistica funziona sorprendentemente bene per la maggior parte del tempo, ma altri possono fare di meglio a seconda del problema in questione e di come ottimizzarli. Sono parziale anche dei GBM, ma la linea di fondo è che puoi provare tutti gli algoritmi che desideri e persino fare semplici insiemi ponderati delle loro previsioni porterà quasi sempre a una soluzione globale migliore.


10

I modelli lineari aggiungono semplicemente le loro caratteristiche moltiplicate per i pesi corrispondenti. Se, ad esempio, hai 1000 funzioni sparse, solo 3 o 4 delle quali sono attive in ciascuna istanza (e le altre sono zeri) e 20 funzioni dense che sono tutte diverse da zero, allora è molto probabile che le funzioni dense rendano la maggior parte delle l'impatto mentre le funzionalità sparse aggiungeranno solo un piccolo valore. Puoi verificarlo guardando i pesi delle caratteristiche per alcuni casi e come influenzano la somma risultante.

Un modo per risolverlo è di andare via dal modello additivo. Ecco un paio di modelli candidati.

SVM si basa sulla separazione di iperpiani. Sebbene l'hyperplane sia lo stesso modello lineare, SVM non riassume i suoi parametri, ma cerca invece di dividere lo spazio delle caratteristiche in modo ottimale. Dato il numero di funzionalità, direi che SVM lineare dovrebbe funzionare bene mentre kernel più complicati potrebbero tendere a sovrautilizzare i dati.

Nonostante il suo nome, Naive Bayes è un modello statistico piuttosto potente che ha mostrato buoni risultati per la classificazione del testo. È anche abbastanza flessibile da catturare lo squilibrio in frequenza di caratteristiche sparse e dense, quindi dovresti assolutamente provarlo.

Infine, le foreste casuali possono funzionare come un buon metodo di insieme in questo caso. La randomizzazione garantirà l'utilizzo di diversi tipi di funzionalità (sparse / dense) come nodi decisionali primari in alberi diversi. Gli alberi RF / decisionali sono utili anche per l'ispezione delle caratteristiche stesse, quindi vale comunque la pena notare la loro struttura.

Nota che tutti questi metodi hanno i loro svantaggi che potrebbero trasformarli in un cestino nel tuo caso. Combinare caratteristiche sparse e dense non è un compito ben studiato, quindi facci sapere quale di questi approcci funziona meglio per il tuo caso.


La ringrazio per la risposta! Ho due domande di follow-up :) 1) In che modo SVM (con un kernel lineare) e Naive Bayes si differenziano per il fatto che non riassumono le loro caratteristiche e i pesi corrispondenti (cioè quello che chiami un "modello additivo")? Entrambi creano effettivamente un iperpiano di separazione, quindi il risultato non è sempre una sorta di aggiunta di funzionalità moltiplicata per i pesi corrispondenti? 2) Mi piacerebbe provare foreste casuali, ma sfortunatamente lo spazio delle funzionalità è troppo grande per rappresentarlo in un formato denso (sto usando sklearn). C'è un'implementazione in grado di gestirlo?
Elmille,

1) In regressione lineare che ti interessa punti su iperpiano, in tal modo si sommano caratteristiche ponderate per ottenere il punto previsto. In SVM, invece, stai cercando punti ai lati dell'iperpiano. Fai la classificazione semplicemente controllando da che parte è il tuo esempio, senza sommatoria coinvolta durante la previsione. Naive Bayes può incorporare diversi tipi di modelli (ad es. Binomiale o multinomiale), ma fondamentalmente moltiplichi le probabilità, non le aggiungi.
amico

2) Ho visto alcune ricerche in questo argomento, ma non ho mai incontrato l'implementazione (probabilmente googling fornirà alcuni link qui). Tuttavia, puoi sempre andare in un altro modo: riduci la dimensionalità con, diciamo, PCA e quindi esegui una foresta casuale in base a un set di dati ridotto.
amico
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.