Rilevamento spam | Applicazioni PNL

Contenuti

Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati

Este artículo tiene como objetivo comparar cuatro algoritmos diferentes de apprendimento profondo y aprendizaje automático para construir un detector de spam y evaluar su rendimiento. Il set di dati che abbiamo utilizzato proveniva da un campione casuale di soggetti e corpi di e-mail che contenevano sia spam che e-mail dannose in numerose proporzioni, che trasformiamo in slogan. Il rilevamento dello spam è uno dei progetti di deep learning più efficaci, ma spesso è anche un progetto in cui le persone perdono la fiducia nella ricerca del modello più semplice per scopi di precisione. In questo articolo, rileveremo lo spam nella posta utilizzando quattro diverse tecniche e le confronteremo per ottenere il modello più accurato.

0mbfbpcpujd-53v3h-5715053

Fonte

PERCHÉ RILEVARE SPAM?

Un'e-mail è diventata uno dei più importanti tipi di comunicazione. Sopra 2014, si stima che ci sia 4,1 1 miliardo di account di posta elettronica in tutto il mondo, e intorno 196 1 miliardo di email vengono inviate giorno dopo giorno in tutto il mondo. Lo spam è una delle principali minacce presentate agli utenti di posta elettronica. Tutti i flussi di posta elettronica che erano spam in 2013 sono i 69,6%. Perciò, un'efficace tecnologia di filtraggio dello spam è un contributo significativo alla sostenibilità del cyberspazio e della nostra società. Poiché l'importanza dell'e-mail non è inferiore a quella del tuo conto bancario contenente 1Cr., Anche proteggerlo da spam o frodi è obbligatorio.

Preparazione dei dati

Per preparare i dati, seguiamo i passaggi seguenti:

1. Scarica e-mail di spam e ham tramite Google da asporto come file box.

2. Leggi i file mbox negli elenchi usando il pacchetto 'mailbox'. Ogni elemento dell'elenco conteneva un'e-mail individuale. Nella prima iterazione, includiamo 1000 E-mail radioamatoriali e 400 email di spam (testiamo proporzioni diverse dopo la prima iterazione).

3. Decomprimere ogni email e concatenarne l'oggetto e il corpo. Abbiamo deciso di includere anche l'oggetto dell'e-mail nella nostra analisi perché è anche un ottimo indicatore del fatto che un'e-mail sia spam o ham..

4. Elenchi convertiti in frame di dati, frame di dati di spam e ham uniti, e mescolato il frame di dati risultante.

5. Dividi il frame di dati in frame di dati di test e streaming. I dati del test erano i 33% dal set di dati originale.

6. Dividi il testo della posta in slogan e applica la trasformazione TF-IDF utilizzando CountVectorizer seguito dal trasformatore TF-IDF.

7. Se entrenaron cuatro modelos usando los datos de addestramento:

  • Bayes ingenuo
  • Alberi decisionali
  • Supporta la macchina vettoriale (SVM)
  • foresta casuale

8. Utilizzo dei modelli addestrati, etichetta e-mail prevista per il set di dati di prova. Sono state calcolate quattro metriche per misurare le prestazioni dei modelli come Precisione, Precisione, Recupero, Punteggio F, AUC.

CODICE

1.Importa le librerie

#importa tutte le librerie necessarie
importare la casella di posta
%matplotlib in linea
importa matplotlib.pyplot come plt
importa csv
da textblob import TextBlob
importare panda
importare sklearn
#import cPickle
importa numpy come np
da sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
da sklearn.naive_bayes import MultinomialNB
da sklearn.svm import SVC, LinearSVC
da sklearn.metrics import classificazione_report, f1_score, precision_score, confusione_matrice
da sklearn.pipeline import Pipeline
da sklearn.grid_search import GridSearchCV
da sklearn.cross_validation import StratifiedKFold, cross_val_score, train_test_split
da sklearn.tree import DecisionTreeClassifier
da sklearn.learning_curve import learning_curve
#import librerie di metriche
da sklearn.metrics import confusion_matrix
da sklearn.metrics import precision_score
da sklearn.metrics import recall_score
da sklearn.metrics import f1_score
da sklearn.metrics import roc_auc_score

2.Funzione per ottenere il testo dell'e-mail dal corpo dell'e-mail

def getmailtext(Messaggio): #ottenere il testo normale "corpo dell'email"
    corpo = Nessuno
    #controlla se il messaggio di posta elettronica di mbox ha più parti
    if message.is_multipart():
        per parte in message.walk():
            if part.is_multipart():
                per la sottoparte in part.walk():
                    if subpart.get_content_type() == 'testo/semplice':
                        body = subpart.get_payload(decodifica=Vero)
            elif part.get_content_type() == 'testo/semplice':
                body = part.get_payload(decodifica=Vero)
    #se il messaggio ha solo una parte
    elif message.get_content_type() == 'testo/semplice':
        body = message.get_payload(decodifica=Vero)
    #restituisce il testo della posta che concatena sia l'oggetto che il corpo della posta
    mailtext=str(Messaggio['soggetto'])+" "+str(corpo)
    messaggio di ritorno

3. Leggi il file di posta indesiderata m-box

mbox = casella di posta.mbox('Spam.mbox')

mlist_spam = []
#crea un elenco che contiene il testo della posta per ogni messaggio di posta elettronica di spam
per messaggio in mbox:
    mlist_spam.append(getmailtext(Messaggio))
    #rottura
#leggi file email mbox ham
mbox_ham = casella di posta.mbox('ham.mbox')

mlist_ham = []
conteggio=0
#crea un elenco che contiene il testo della posta per ogni messaggio di posta elettronica amatoriale
per messaggio in mbox_ham:
    
    mlist_ham.append(getmailtext(Messaggio))
    se conta>601:
        rottura
    conteggio+=1

4. Crea due set di dati dalle e-mail di spam / prosciutto che contengono informazioni come il testo dell'e-mail, l'etichetta postale e la lunghezza della spedizione.

#creare 2 frame di dati per le e-mail di spam ham che contengono le seguenti informazioni-
#Testo della posta, lunghezza della posta, la posta è etichetta prosciutto/spam
importa panda come pd
spam_df = pd.DataFrame(mlist_spam, colonne=["Messaggio"])
spam_df["etichetta"] = "spam"

spam_df['lunghezza'] = spam_df['Messaggio'].carta geografica(testo lambda: len(testo))
Stampa(spam_df.head())

ham_df = pd.DataFrame(mlist_ham, colonne=["Messaggio"])
ham_df["etichetta"] = "prosciutto"

ham_df['lunghezza'] = prosciutto_df['Messaggio'].carta geografica(testo lambda: len(testo))
Stampa(ham_df.head())

51188screenshot2086-8741508

5.Funzione per applicare le trasformazioni BOW e TF-IDF

def features_transform(posta):
    #prendi la borsa delle parole per il testo della posta
    bow_transformer = ContaVectorizer(analizzatore=split_into_lemmas).in forma(mail_treno)
    #Stampa(len(bow_transformer.vocabolario_))
    message_bow = bow_transformer.transform(posta)
    #stampa il valore di scarsità
    Stampa('forma matrice sparsa:', messaggi_arco.forma)
    Stampa('numero di diversi da zero':', message_bow.nnz) 
    Stampa("sparsità": %.2F%%' % (100.0 * message_bow.nnz / (messaggi_arco.forma[0] * messaggi_arco.forma[1])))
    #applicare la trasformata TF-IDF all'output di BOW
    tfidf_transformer = TfidfTransformer().in forma(messaggi_arco)
    message_tfidf = tfidf_transformer.transform(messaggi_arco)
    #Stampa(message_tfidf.shape)
    #restituisce il risultato delle trasformazioni
    return message_tfidf

6. Funzione per stampare le metriche di performance del modello associato

#funzione che accetta y valore di test e y valore previsto e stampa le metriche delle prestazioni del modello associate
def model_assessment(y_test,classe_predetta):
    Stampa('matrice di confusione')
    Stampa(confusione_matrice(y_test,classe_predetta))
    Stampa('precisione')
    Stampa(precision_score(y_test,classe_predetta))
    Stampa('precisione')
    Stampa(precision_score(y_test,classe_predetta,pos_label="spam"))
    Stampa('richiamare')
    Stampa(punteggio_richiamo(y_test,classe_predetta,pos_label="spam"))
    Stampa('F-Score')
    Stampa(f1_score(y_test,classe_predetta,pos_label="spam"))
    Stampa('AUC')
    Stampa(roc_auc_score(np.dove(y_test == 'spam',1,0),np.dove(forecast_class=='spam',1,0)))
    plt.matshow(confusione_matrice(y_test, classe_predetta), cmap=plt.cm.binary, interpolazione='più vicino')
    plt.titolo('matrice di confusione')
    plt.colorbar()
    plt.ylabel('etichetta prevista')
    plt.xlabel('etichetta prevista')

Iniziamo l'analisi comparativa di quattro diversi modelli per ottenere l'algoritmo più performante.

1.Modello Naive Bayes

Bayes ingenuo con un approccio a sacco di parole usando TF-IDFNaive Bayes è l'algoritmo di ordinamento più semplice (veloce da formare, utilizzato regolarmente per il rilevamento dello spam). è un metodo popolare (linea di base) per la categorizzazione del testo, la questione di giudicare i documenti come appartenenti a una categoria o all'opposto (come spammare il legittimo, sport o politica, eccetera.) con frequenze di parola dovute alle caratteristiche.

Estrazione di feature utilizzando BOW:

Frequenza del termine TF-IDF: la frequenza inversa del documento utilizza tutti i token all'interno del set di dati come vocabolario. La frequenza del termine e il numero di documenti durante i quali viene prodotto il token sono responsabili della determinazione della frequenza inversa del documento.. Ciò che questo assicura è che, se un token si verifica frequentemente durante un documento, quel token avrà un alto TF ma se quel token si verifica frequentemente nella maggior parte dei documenti, quindi ridurre l'IDF. Entrambe queste matrici TF e IDF per un documento selezionato vengono moltiplicate e normalizzate per rendere il TF-IDF di un documento.

CODICE

#creare e adattare il modello NB
modelloNB = MultinomialeNB()
modelloNB.fit(train_features,y_train)
#trasformare le funzionalità di test per testare le prestazioni del modello
test_features=features_transform(mail_test)
#NB previsioni
forecast_class_NB=modelNB.predict(test_features)
#valutare NB
modello_valutazione(y_test,forecast_class_NB)

16480screenshot2087-7277460

2.Modello di albero decisionale

Gli alberi decisionali sono utilizzati per la classificazione e la regressione. La teoría podría ser una misura para definir este grado de desorganización durante un sistema llamado Entropía. Il fattore di entropia varia da campione a campione. L'entropia è zero per il campione omogeneo, e per il campione di uguali dividendi, l'entropia è 1. Elige la división que tiene una entropía mínima en comparación con el nodo principal y otras divisiones. Più piccola è l'entropia, maggiore.

CODICE

#creare e adattare il modello dell'albero
model_tree=DecisionTreeClassifier()
model_tree.fit(train_features,y_train)
#esegui il modello su test e stampa metriche
forecast_class_tree=model_tree.predict(test_features)
modello_valutazione(y_test,albero_classe_predetto)

83477screenshot2088-2034374

3. Supporta la macchina vettoriale

Entrambe le sfide di classificazione e regressione funzionano perfettamente per questo popolare algoritmo di apprendimento automatico supervisionato. (SVM). tuttavia, è usato principalmente nei problemi di classificazione. Quando lavoriamo con questo algoritmo, nello spazio n-dimensionale, stiamo andando a tracciare ogni elemento di dati in una certa misura, in modo che il valore di ciascuna caratteristica sia il valore di una coordinata selezionata. Support Vector Machine potrebbe anche essere un confine che segrega meglio il 2 Lezioni (iperpiano / linea).

CODICE

#creare e adattare il modello SVM
model_svm=SVC()
model_svm.in forma(train_features,y_train)
#esegui il modello su test e stampa metriche
forecast_class_svm=model_svm.prevedere(test_features)
modello_valutazione(y_test,forecast_class_svm)

52963screenshot2089-8103316

96288screenshot2090-3298403

4. foresta casuale

La foresta casuale è come un algoritmo bootstrap con un modello ad albero di chiamate (CARRELLO). L'ultima parola di previsione potrebbe essere una funzione di ogni previsione. Questa previsione finale può essere semplicemente la media di tutte le previsioni. La foresta casuale fornisce previsioni significativamente più accurate se posizionata accanto a semplici modelli CART / CHAID o regressione in molti scenari. Questi casi hanno generalmente un gran numero di variabili predittive e un'enorme dimensione del campione.. Ciò è spesso dovuto al fatto che cattura la varianza di diverse variabili di input in un tempo uniforme e consente a un gran numero di osservazioni di partecipare alla previsione..

CODICE

a partire dal sklearn.set importare Classificatore foresta casuale
#creare e adattare il modello
model_rf=Classificatore foresta casuale(n_estimatori=20,criterio='entropia')
model_rf.in forma(train_features,y_train)
#esegui il modello su test e stampa metriche
forecast_class_rf=model_rf.prevedere(test_features)
modello_valutazione(y_test,forecast_class_rf)

44820screenshot2091-6419508

CONFRONTO:-

Vedendo l'uscita del 4 Modelli, puoi facilmente confrontare e trovare la sua precisione. Secondo la spiegazione sopra, l'ordine di precisione decrescente è rappresentato come:

PRECISIONE DEL MODELLO

FORESTA CASUALE 0.77846

NAIVE BAYS 0,75076

MODELLO DI ALBERO DECISIONALE 0.65538

SUPPORTO MACCHINA VETTORIALE 0.62153

RISULTATI

I risultati sono molto chiari sul fatto che Random Forest è il metodo più accurato per rilevare le e-mail di spam.. La ragione per lo stesso è la sua ampia capacità di deviazione per trovare la caratteristica migliore usando la sua casualità. Il modello che non può essere utilizzato per tale rilevamento dello spam è SVM. La ragione per lo stesso è la sua piccola espansione. SVM potrebbe non essere in grado di gestire grandi quantità di dati.

CONCLUSIONE

Questo articolo ti aiuterà a implementare un progetto di rilevamento dello spam con l'aiuto del deep learning. Questo si basa in gran parte su un'analisi comparativa di quattro diversi modelli. Resta sintonizzato su Analytics Vidya per i prossimi articoli. Puoi usarlo come riferimento. Sentiti libero di inserire i tuoi contributi nella chat qui sotto. Puoi anche inviarmi un ping su LinkedIn all'indirizzo https://www.linkedin.com/in/shivani-sharma-aba6141b6/

Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.