paint-brush
Ham vs Spam: Sådan identificeres og klassificeres spam-e-mailved@ramakadapala
Ny historie

Ham vs Spam: Sådan identificeres og klassificeres spam-e-mail

ved Rama7m2025/03/08
Read on Terminal Reader

For langt; At læse

I dette projekt blev nogle af maskinlæringsværktøjerne brugt til at se, hvordan de klarer sig som klassifikatorer for Ham- og Spam-e-mails. Beskrivelser af beregningerne præsenteres samt en sammenligning af deres præstationer.
featured image - Ham vs Spam: Sådan identificeres og klassificeres spam-e-mail
Rama HackerNoon profile picture

Abstrakt

E-mail er et vigtigt værktøj til kommunikation i dagens verden; spam-e-mails har dog vist sig som en stor udfordring. Disse uopfordrede beskeder fra ukendte kilder fylder ofte indbakker og forstyrrer kommunikation og produktivitet. Denne artikel undersøger brugen af forskellige maskinlæringsteknikker til at klassificere e-mails som enten "spam" eller "skinke" (ikke-spam).


Klassifikationsmodeller såsom K-Nearest Neighbors (KNN), Logistic Regression, Support Vector Machines (SVM) og Naive Bayes evalueres, og sammenligner deres effektivitet i e-mailklassificering. Ydeevnen for hver model evalueres baseret på målinger som nøjagtighed, præcision, genkaldelse og F1-score for at bestemme, hvilken tilgang der er mest egnet til denne opgave.

Indledning

I 2023 er der sendt 347,3 milliarder e-mails hver dag, hvoraf spam-e-mails udgør 45 % af al e-mail-trafik. Disse e-mail-spam koster virksomheder 20,5 milliarder dollars hvert år. I betragtning af dette vil der altid være behov for at sikre, at spam er korrekt klassificeret og ikke forstyrrer lovlig e-mail-trafik. Dette er en nyttig måde at forstå potentialet og anvendelsen af maskinlæring.


I tilfælde af spam-detektering kan en menneskelig bruger, der er fortrolig med e-mail, nemt finde spam næsten umiddelbart efter at have kigget på den. Som et resultat mener jeg, at dette arbejde bekræfter, at identifikation af spam er et nyttigt program til en maskinlæringsklassifikator. For at klassificere en e-mail som spam eller skinke, er der en masse forbehandlingstrin involveret – forberedelse af dataene til at være acceptable for en lineær klassificering, derefter tokenisering og stemming af hver linje for at konvertere til en TF-IDF (Term Frequency – Inverse Document Frequency) tabel.


KNN med K=3 blev valgt som basismodel. Logistisk regression med L1-regularisering, Naive Bayes-modellen og SVM-modeller blev også testet, før man besluttede den bedste model. Til formålet med dette projekt er der brugt et datasæt fra Kaggle, som har 2551 "ham" e-mail-filer og 501 spam-e-mail-filer og modelleringen er foretaget ved hjælp af R programmeringssprog.

Et nærbillede af skinkeordEt nærbillede af spam-ord Metode fulgte

Nedenstående diagram vil hjælpe med at forstå strømmen af de forskellige trin, der følges -

Figur, der viser projektets trin

Forbehandlingstrin

Da der bruges en stor mængde tekstdata, var der behov for at forbehandle dataene for at rydde op i dem og få dem til et format, der kan bruges af klassifikationsmodeller. Det følgende vil forklare den trinvise proces, der blev fulgt som en del af dataforbehandlingen –

  • Tekstdataene skal være acceptable for en lineær klassifikator. Dette betyder, at datasættet skal transformeres ved hjælp af tekstfunktionsekstraktionsmetoder til numeriske funktioner.

  • Først er hver linje i teksten tokeniseret og stammer fra følgende form. Stemmeprocessen forkorter ord ved at fjerne bøjede endelser. For eksempel bliver arbejdere arbejdere i nedenstående eksempel.

    Ord og deres stammeord

  • Dernæst konverteres de tokeniserede data til en TF-IDF-tabel (Termfrekvens - Omvendt dokumentfrekvens). TF-IDF er en tilgang til tekstanalyse, der angiver hvert n-gram i et dokument i form af dets term frekvens-invers dokumentfrekvens. Termhyppighed er simpelthen hyppigheden af en given term i et dokument (i dette tilfælde en e-mail). Omvendt dokumentfrekvens er generelt angivet som:

    log ((samlet antal dokumenter/antal dokumenter med løbetid)


Dette tjener til at vægte væsentlige vilkår højere end meget hyppige og dermed mindre vigtige vilkår.

  • Dernæst reduceres vilkårene ved kun at vælge de vilkår, der har optrådt i mindst 2 procent af dokumenterne, men ikke mere end 95 procent af dokumenterne. Denne proces forhindrer overtilpasning ved at sikre, at termer, der er for unikke eller for udbredte i træningssættet, fjernes.


  • Dette giver i alt 1.130 termer i træningsdatasættet.


Det er vigtigt at bemærke, at strategien for at udnytte TF-IDF med testsættet vil være kun at udføre modeltræning på træningen TF-IDF, og så efterfølgende at genberegne TF-IDF med de komplette data til testnøjagtighed. Dette er påkrævet, fordi TF-IDF er afhængig af frekvensen i hele datasættet for en bestemt periode, og også for ikke at inkorporere testdata under træning.


Endelig er det kun de 1000 bedste terminer efter samlet terminsfrekvens, der er udvalgt i træningssættet.


tf-idf tabel

Kode til forbehandlingstrinene -

 #tokenize word_tokens <- complete_tbl %>% unnest_tokens(word,content) #stemming word_tokens<-word_tokens %>% mutate(word_stem=SnowballC::wordStem(word)) #remove any words with numbers word_tokens <- word_tokens[-grep('^\\d+$', word_tokens$word_stem),] #remove any words with . word_tokens <- word_tokens[-grep('[.]', word_tokens$word_stem),] #remove any single character words word_tokens <- word_tokens[-grep('.\\b[az]\\b.', word_tokens$word_stem),] #remove tokens which match stop words word_tokens <- word_tokens %>% filter(!word %in% stopWords) word_tokens <- word_tokens %>% filter(!word_stem %in% stopWords) #split into training and test word_tokens_train <- word_tokens %>% filter(document %in% ind) #create tfidf for training and then a complete tfidf for testing tfidf_train<-word_tokens_train %>% count(document,word_stem,sort=TRUE) %>% bind_tf_idf(word_stem,document,n) tfidf_complete<-word_tokens %>% count(document,word_stem,sort=TRUE) %>% bind_tf_idf(word_stem,document,n)

Brugte modeller

  1. K-Nearest Neighbours (KNN) – Baseline-modellen

Modellen opnår rimelig specificitet, men ekstremt dårlig følsomhed, hvilket betyder, at mange skinker er fejlagtigt forudsagt som spam. Bemærk, at i hvert af nedenstående resultater er den positive klasse "skinke". Dette er virkelig det værst mulige resultat for en bruger, idet de ville gå glip af mange rigtige e-mails, der er klassificeret som spam.


Forvekslingsmatrix for KNN med K=3
Kode til KNN model -

 ##train a model library(e1071) library(caret) library(class) library(LiblineaR) ##remove document number since this is indicative of spam or ham wide_feat_train<-subset(wide_feat_train, select=-c(document)) wide_feat_test<-subset(wide_feat_test,select=-c(document)) #Base model is a knn attempt knn_pred<-knn(train=wide_feat_train,test=wide_feat_test,cl=labels_train$label,k=3) knn_results<-confusionMatrix(knn_pred,labels_test$label) knn_results knn_results$byClass["F1"] knn_results$byClass["Precision"] knn_results$byClass["Recall"]
  1. Logistisk regression

Efter at have fået dårlige resultater fra KNN-modellen, var Logistic Regression den næste model, der blev brugt.


Med henblik på dette scenarie,

Oddsformlerne for skinke og spam-e-mail

Logistisk regression blev anvendt med følgende hyperparametre -

  • tab =”L1”
  • pris = 2
  • epsilon = 0,1


Denne model giver følgende resultater på testdatasættet, allerede en væsentlig forbedring i forhold til KNN-modellen. Den samlede nøjagtighed er ret høj, men specificiteten viser, at der stadig er plads til forbedringer. En bruger af denne model vil finde nogle få Hams, der bliver forudsagt som Spams.
Forvirringsmatrix for logistisk regression Kode til logistisk regressionsmodel -

 #Next is a logistic regression usin the below hyperparameters grid_logit <- expand.grid(loss="L1",cost=2,epsilon=0.1) lr <- train(x=wide_feat_train,y=labels_train$label,method="regLogistic",tuneGrid=grid_logit) lr_results<-confusionMatrix(as.factor(predict(lr,wide_feat_test)),labels_test$label) lr_results p_lr = predict(lr,wide_feat_test) prednum_lr<-ifelse(p_lr=="spam",0,1) roc_lr<-roc(labels_test$label,prednum_lr) plot(roc_lr) roc_lr$auc p1_lr<- prediction(as.numeric(p_lr),as.numeric(labels_test$label)) pr_lr <- performance(p1_lr, "prec", "rec") plot(pr_lr) lr_results$byClass["F1"] lr_results$byClass["Precision"] lr_results$byClass["Recall"]
  1. Naiv Bayes-model

Den næste model, der blev prøvet, var Naive Bayes-modellen. For denne model blev der foretaget krydsvalidering for at finde de optimale hyperparametre med en femdobbelt tilgang. Dette resulterer i følgende parametre for Naive-Bayes -


  • laplace = 0
  • usekernel = FALSK
  • juster = 1


Denne model opnår også gode resultater på både specificitet og sensitivitet.

Forvirringsmatrix for naiv Bayes-model Kode til naiv Bayes model -

 ##naive bayes main model nb_cv <- train( x=wide_feat_train, y=labels_train$label, method = "naive_bayes", trControl = train_control, tuneGrid = grid ) nb <- naiveBayes(wide_feat_train,labels_train$label,adjust=1,laplace=0,usekernel=FALSE) nb_results<-confusionMatrix(as.factor(predict(nb,wide_feat_test)),labels_test$label) nb_results p = predict(nb,wide_feat_test) prednum<-ifelse(p=="spam",0,1) roc_nb<-roc(labels_test$label,prednum) plot(roc_nb) roc_nb$auc p1<- prediction(as.numeric(p),as.numeric(labels_test$label)) pr <- performance(p1, "prec", "rec") plot(pr) nb_results$byClass["F1"] nb_results$byClass["Precision"] nb_results$byClass["Recall"]


4. Support Vector Machine (SVM)

Den endelige model er en SVM krydsvalidering med en lineær kerne. Støttevektormaskiner forsøger optimalt at finde det maksimalt adskillende hyperplan for at adskille data mellem to klasser.


Her udføres en 5-dobbelt CV ved hjælp af R-biblioteks- karetten for at identificere de optimale hyperparametre. Disse hyperparametre er vist nedenfor -

  • pris = 1
  • tab = L2
  • vægt = 3


Resultaterne af denne model, når de anvendes på det udholdte testdatasæt, er vist nedenfor -

Forvirringsmatrix for SVM

Kode til SVM -

 #svm train_control <- trainControl( method = "cv", number = 5 ) svm <- train(x=wide_feat_train,y=labels_train$label,method="svmLinearWeights2",trControl=train_control) svm$bestTune svm_results<-confusionMatrix(as.factor(predict(svm,wide_feat_test)),labels_test$label) svm_results p_svm = predict(svm,wide_feat_test) prednum_svm<-ifelse(p_svm=="spam",0,1) roc_svm<-roc(labels_test$label,prednum_svm) plot(roc_svm,colorize=T,lwd=3, main=" ROC curve for SVM model") roc_svm$auc p1_svm<- prediction(as.numeric(p_svm),as.numeric(labels_test$label)) pr <- performance(p1_svm, "prec", "rec") plot(pr) svm_results$byClass["F1"] svm_results$byClass["Precision"] svm_results$byClass["Recall"]

Resultater

Følgende tabel opsummerer de foranstaltninger, der blev overvejet for at vælge den bedste model-

Model

Nøjagtighed

F1 score

Præcision

Minde om

KNN

0,252

0,2293

0,8947

0,1315

Logistisk regression

0,9624

0,9781

0,9591

0,998

Naive Bayes

0,9722

0,9834

0,9882

0,9787

SVM

0,9885

0,9932

0,9886

1

Af ovenstående tabel kan det ses, at SVM klarer sig bedst sammenlignet med de andre modeller.


For yderligere at bekræfte blev ROC-kurver plottet, og AUC-værdierne blev beregnet.

Model

KNN

Logistisk regression

Naive Bayes

SVM

AUC

.5232

.882

.9574

.9628

Fig.: AUC-værdier for de 4 modeller

Ud fra ovenstående målinger kan det konkluderes, at SVM med 5-fold krydsvalidering klarer sig bedst på datasættet med at klassificere e-mails som ham og spam.

Konklusion

Spamfiltrering vil altid være et felt med kontinuerlig udvikling, da spammere konstant finder nye og innovative metoder til at sende spammeddelelser. Ingen enkelt anti-spam-løsning er muligvis korrekt. I dette projekt blev nogle af maskinlæringsværktøjerne brugt til at se, hvordan de klarer sig som klassifikatorer for Ham- og Spam-e-mails. Beskrivelser af beregningerne præsenteres samt en sammenligning af deres præstationer.


Ud af de fire maskinlæringsmodeller, der er blevet testet, blev SVM fundet at være den bedste med hensyn til ydeevne. Logistisk regression og naive Bayes-modeller viser også lovende resultater.