Classificazione dell'email in R


8

Sto lavorando a un progetto in R in cui ho circa 1200 e-mail da un'azienda, la maggior parte delle quali sono classificate come classe1 o classe2, che sono i tipi di richieste. Circa 1000 e-mail sono classificate come classe1e 200 sono classificati come classe2Il mio obiettivo è quello di utilizzare l'apprendimento supervisionato per creare un modello che classificherà le nuove e-mail.

Ma, dopo un sacco di pre-elaborazione (analisi, rimozione di password, ecc.) E prova algoritmi tipici (SVM, alberi decisionali, ecc.) Su una matrice di termini del documento, la mia matrice di confusione conteneva molti falsi positivi e falsi negativi, ma solo alcuni falsi negativi con SVM.

Mi chiedo come potrei migliorare i miei risultati? Devo utilizzare il sovracampionamento o la rappresentazione di funzioni in due grammi? Immagino che il problema sia che gli argomenti delle due categorie sono molto vicini.


Potete fornire qualche informazione in più? Che tipo di SVM stai usando — come in, quale funzione del kernel e come hai ottimizzato i parametri? Puoi darci qualche informazione in più sui metodi di pre-elaborazione che hai usato? Inoltre, ho notato che hai detto che c'erano principalmente due classi ... come gestisci le altre classi?
Kyle.

"due categorie sono molto vicine" - puoi nominarle (o simili)?
lukeA

Potresti fornire le etichette delle classi effettive e un testo illustrativo per ogni classe? La scienza è i dettagli ...
Brandon Loudermilk,

Risposte:


2

(Tutte le e-mail sono o in francese o in inglese)

Metodi di pre-elaborazione:

  • Unisci "Riepilogo" e "Contenuto" che sono il capo dell'e-mail e del contenuto
  • Rimuovi tutti gli indirizzi email
  • Rimuovi tutto "Da: qualcuno a: qualcuno ... soggetto: qualcosa"
  • Rimuovi tutte le immagini incluse nell'email
  • Ordina l'email in base alla loro classe
  • Sostituisci tutto l'accento francese con nessun accento come é -> e; ê -> e ...
  • Metti il ​​testo in basso
  • rimuovere la punteggiatura
  • rimuovere i numeri
  • spogliare lo spazio bianco
  • rimuovi un nome da un elenco e alcune parole specifiche
  • rimuovere le parole di arresto in francese e inglese
  • documento di staminali in francese e inglese
  • Rimuovi termine

-> Quindi Document matrix term, con TF-IDF

Le due classi provengono da un supporto tecnico, due categorie "complesso" e "facile", "complesso" sono argomenti riguardanti la finanza (in teoria), "semplice" problema con il software (in teoria) ma in pratica hanno molte parole in comune. E le altre classi che non le prendo in considerazione, per ora mi concentro sulle due

In realtà il tipo di algoritmo di classificazione che ho usato non è così rilevante perché ho provato con 5 algo e nessuno ha dato buoni risultati

Esempio (matrice di confusione) Albero decisionale:

  Decision tree:           

pred:

335 | 10
59 | 12

SVM:

331 | 1
83 | 1

Knn (n=10):

330 | 2

83 | 1

Naive Bayes:

1 | 83

12 | 320


Potresti avere buone ragioni per questo, ma perché rimuovi campi come allegati e mittente? Questo potrebbe contenere informazioni. Ho scoperto in una configurazione un po 'simile che alcune persone sono più inclini a creare documenti di un certo tipo.
S van Balen,

La matrice di confusione per NB è corretta? (Suppongo che in alto a sinistra sia la classe 1 effettiva e la previsione)
S van Balen,

0

Dato che hai a che fare solo con 2 classi, puoi creare una commonality.cloud()da entrambe le classi (uso questa funzione su R, non conosco altre lingue).

Mostrerà le parole che sono in comune in class1e class2. Queste parole potrebbero non aiutare l'algoritmo a distinguere le classi in modo da poterle rimuovere e fare alcuni test.


0

Potresti provare un classificatore bayesiano invece di SVM o Decision Trees. Il tuo problema è una generalizzazione del problema del filtro antispam, ovvero classificare le email in "Spam" (classe 1) o "Non spam" (classe 2). La maggior parte dei filtri antispam utilizza la classificazione bayesiana anziché il metodo di apprendimento supervisionato più comune.


0

Potresti studiare le caratteristiche: ho notato che hai rimosso i numeri. Potrebbe essere che l'hai fatto perché non è probabile che si scontrino, ma puoi anche risolverlo introducendo classi di parole (@ numero @ o @ big_number @, ecc.).

Puoi provare a usare le classi di parole anche su altri gruppi di parole. Se funziona, potrebbe indicare che il tuo set soffre di scarsità (che non mi sorprenderebbe). È possibile utilizzare un selettore di funzioni a tale scopo, ad esempio classificando le dimensioni in base al guadagno delle informazioni.

Modi più avanzati per combattere la scarsità includono: l'algoritmo di Rocchio o word2vec.

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.