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.
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.
Nedenstående diagram vil hjælpe med at forstå strømmen af de forskellige trin, der følges -
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.
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.
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.
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
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.
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"]
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,
Logistisk regression blev anvendt med følgende hyperparametre -
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.
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"]
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 -
Denne model opnår også gode resultater på både specificitet og sensitivitet.
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 -
Resultaterne af denne model, når de anvendes på det udholdte testdatasæt, er vist nedenfor -
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"]
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.
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.