Имэйл бол өнөөгийн ертөнцөд харилцааны чухал хэрэгсэл юм; Гэсэн хэдий ч спам имэйлүүд томоохон сорилт болж байна. Үл мэдэгдэх эх сурвалжаас ирсэн хүсээгүй эдгээр мессежүүд нь ихэвчлэн ирсэн хайрцгийг дүүргэж, харилцаа холбоо, бүтээмжийг саатуулдаг. Энэхүү баримт бичиг нь цахим шууданг "спам" эсвэл "хам" (спам биш) гэж ангилахын тулд янз бүрийн машин сургалтын техникийг ашиглаж байгааг судалж байна.
K-Neighbors (KNN), Logistic Regression, Support Vector Machines (SVM), Naïve Bayes зэрэг ангиллын загваруудыг цахим шуудангийн ангилал дахь үр нөлөөг нь харьцуулан үнэлдэг. Загвар бүрийн гүйцэтгэлийг нарийвчлал, нарийвчлал, санах ой, F1 оноо зэрэг хэмжүүр дээр үндэслэн үнэлж, энэ даалгаварт аль арга нь хамгийн тохиромжтойг тодорхойлдог.
2023 онд өдөр бүр 347.3 тэрбум имэйл илгээгддэг бөгөөд үүнээс спам цахим шуудангийн нийт урсгалын 45%-ийг эзэлдэг. Эдгээр цахим шуудангийн спам нь бизнесүүдэд жил бүр 20.5 тэрбум доллар зарцуулдаг. Үүнийг харгалзан спамыг зөв ангилж, хууль ёсны цахим шуудангийн урсгалд саад учруулахгүй байх шаардлагатай. Энэ нь машин сургалтын боломж, хэрэглээг ойлгоход хэрэгтэй арга юм.
Спам илрүүлэх тохиолдолд цахим шуудантай танилцсан хүн спамыг хараад шууд л амархан тодорхойлж чадна. Үүний үр дүнд энэ ажил нь спамыг тодорхойлох нь машин сургалтын ангилагчдад хэрэгтэй програм гэдгийг баталж байна гэж би итгэж байна. Имэйлийг спам эсвэл хиам гэж ангилахын тулд урьдчилан боловсруулах маш олон үе шат байдаг - өгөгдлийг шугаман ангилагчийн хувьд хүлээн зөвшөөрөгдөхөөр бэлтгэх, дараа нь TF-IDF (Term Frequency - Inverse Document Frequency) хүснэгтэд хөрвүүлэхийн тулд мөр бүрийг тэмдэглэж, stemming хийх.
Суурь загвараар K=3-тай KNN сонгосон. Хамгийн сайн загварыг сонгохын өмнө L1 зохицуулалттай логистик регресс, Naïve Bayes загвар болон SVM загваруудыг туршиж үзсэн. Энэхүү төслийн зорилгоор 2551 “ham” цахим шуудангийн файл, 501 спам имэйл файл бүхий Kaggle-ийн датасетийг ашигласан бөгөөд загварчлалыг R програмчлалын хэлээр хийсэн.
Доорх диаграм нь дараалсан янз бүрийн алхмуудын урсгалыг ойлгоход тусална.
Урьдчилан боловсруулах үе шатууд
Их хэмжээний текст өгөгдөл ашиглагдаж байгаа тул өгөгдлийг урьдчилан боловсруулж, ангиллын загварт ашиглаж болох форматтай болгох шаардлагатай болсон. Мэдээллийн урьдчилсан боловсруулалтын нэг хэсэг болгон дагаж мөрдсөн алхам алхмаар үйл явцыг доор тайлбарлах болно -
Текст өгөгдөл нь шугаман ангилагчийн хувьд хүлээн зөвшөөрөгдөх ёстой. Энэ нь өгөгдлийн багцыг текстийн шинж чанарыг задлах аргыг ашиглан тоон шинж чанар болгон хувиргах ёстой гэсэн үг юм.
Нэгдүгээрт, текстийн мөр бүрийг токенжуулж, дараах хэлбэрт шилжүүлнэ. Үгслэх үйл явц нь үгийн төгсгөлийг арилгах замаар үгсийг богиносгодог. Жишээлбэл, доорх жишээн дээр ажилчид ажилчин болдог.
Дараа нь токенжуулсан өгөгдлийг TF-IDF хүснэгт рүү хөрвүүлнэ (Нэг хугацааны давтамж - Урвуу баримт бичгийн давтамж). TF-IDF нь баримт бичгийн n-грамм бүрийг давтамж-урвуу баримтын давтамжийн нэр томьёогоор илэрхийлдэг текстийн шинжилгээний арга юм. Нэр томъёоны давтамж гэдэг нь баримт бичиг доторх өгөгдсөн нэр томъёоны давтамж юм (энэ тохиолдолд имэйл). Урвуу баримт бичгийн давтамжийг ерөнхийд нь дараах байдлаар илэрхийлнэ.
бүртгэл ((Баримт бичгийн нийт тоо/Хугацаатай баримтын тоо)
Энэ нь чухал нэр томьёог маш олон давтамжтай, тиймээс ач холбогдол багатай нэр томъёоноос илүү жинтэй болгоход үйлчилдэг.
Энэ нь сургалтын өгөгдлийн багцад нийт 1,130 нэр томъёог гаргаж өгдөг.
Туршилтын багцтай TF-IDF-ийг ашиглах стратеги нь зөвхөн сургалтын TF-IDF дээр загварчлах сургалтыг хийж, дараа нь TF-IDF-ийг туршилтын нарийвчлалын бүрэн өгөгдөлтэй дахин тооцоолох явдал гэдгийг анхаарах нь чухал юм. TF-IDF нь тодорхой хугацааны бүх өгөгдлийн багц дахь давтамжаас хамаардаг тул сургалтын явцад туршилтын өгөгдлийг оруулахгүй байх шаардлагатай.
Эцэст нь сургалтын багцад зөвхөн улирлын давтамжаар эхний 1000 нэр томъёог сонгосон.
Урьдчилан боловсруулах үе шатуудын код -
#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)
Ашигласан загварууд
Загвар нь боломжийн онцлогтой боловч маш муу мэдрэмжтэй байдаг тул олон шитийг спам гэж худал таамаглаж байна гэсэн үг. Доорх үр дүн бүрийн эерэг анги нь "хам" гэдгийг анхаарна уу. Энэ нь спам гэж ангилагдсан олон бодит имэйлийг орхих нь хэрэглэгчийн хувьд хамгийн муу үр дагавар юм.
KNN загварын код -
##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"]
KNN загвараас муу үр дүнд хүрсэний дараа логистик регрессийг ашигласан дараагийн загвар болсон.
Энэ хувилбарын зорилгын үүднээс,
Логистик регрессийг дараах гиперпараметрээр ашигласан болно:
Энэ загвар нь туршилтын өгөгдлийн багц дээр дараах үр дүнг өгдөг бөгөөд энэ нь KNN загварт мэдэгдэхүйц сайжирсан юм. Нийт нарийвчлал нь нэлээд өндөр боловч өвөрмөц байдал нь сайжруулах боломж байсаар байгааг харуулж байна. Энэ загварын хэрэглэгч хэд хэдэн Hams-ыг спам гэж таамаглаж байгааг олж мэднэ.
Логистик регрессийн загварын код -
#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"]
Дараагийн оролдсон загвар нь Naive Bayes загвар байв. Энэ загварын хувьд хамгийн оновчтой гиперпараметрийг олохын тулд хөндлөн баталгаажуулалтыг 5 дахин давтах аргыг ашигласан. Үүний үр дүнд Naive-Bayes-ийн хувьд дараах параметрүүд гарч ирнэ.
Энэ загвар нь өвөрмөц байдал, мэдрэмжийн аль алинд нь сайн үр дүнд хүрдэг.
Гэнэн Бэйсийн загварт зориулсан код -
##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. Вектор машиныг дэмжих (SVM)
Эцсийн загвар нь шугаман цөм бүхий SVM хөндлөн баталгаажуулалт юм. Дэмжлэгийн вектор машинууд нь хоёр ангиллын хооронд өгөгдлийг салгахын тулд хамгийн их тусгаарлах гипер хавтгайг олохыг оролддог.
Энд хамгийн оновчтой гиперпараметрүүдийг тодорхойлохын тулд R номын сангийн карет ашиглан 5 дахин CV-г хийдэг. Эдгээр гиперпараметрүүдийг доор үзүүлэв -
Туршилтын өгөгдлийн багцад ашигласан энэ загварын үр дүнг доор харуулав.
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"]
Дараах хүснэгтэд хамгийн сайн загварыг сонгоход авч үзсэн арга хэмжээг нэгтгэн харуулав.
Загвар | Нарийвчлал | F1 оноо | Нарийвчлал | Санах |
---|---|---|---|---|
KNN | 0.252 | 0.2293 | 0.8947 | 0.1315 |
Логистик регресс | 0.9624 | 0.9781 | 0.9591 | 0.998 |
Гэнэн Бэйс | 0.9722 | 0.9834 | 0.9882 | 0.9787 |
SVM | 0.9885 | 0.9932 | 0.9886 | 1 |
Дээрх хүснэгтээс харахад SVM нь бусад загваруудтай харьцуулахад хамгийн сайн гүйцэтгэлтэй байгааг харж болно.
Цаашид баталгаажуулахын тулд ROC муруйг зурж, AUC утгыг тооцоолсон.
Загвар | KNN | Логистик регресс | Гэнэн Бэйс | SVM |
---|---|---|---|---|
AUC | .5232 | .882 | .9574 | .9628 |
Зураг: 4 загварын AUC утгууд
Дээрх хэмжигдэхүүнүүдээс харахад 5 дахин хөндлөн баталгаажуулалт бүхий SVM нь имэйлийг сонирхогчийн болон спам гэж ангилахдаа өгөгдлийн багц дээр хамгийн сайн ажилладаг гэж дүгнэж болно.
Спам илгээгчид спам мессеж илгээх шинэ, шинэлэг аргуудыг байнга хайж байдаг тул спам шүүлтүүр нь үргэлж тасралтгүй хувьсан өөрчлөгдөж байдаг талбар байх болно. Спамын эсрэг ганц шийдэл зөв байж болохгүй. Энэ төсөлд машин сургалтын зарим хэрэгслийг Хэм болон Спам имэйлийн ангилагчийн үүргийг хэрхэн гүйцэтгэхийг харахын тулд ашигласан. Тооцооллын тайлбар, тэдгээрийн гүйцэтгэлийн харьцуулалтыг үзүүлэв.
Туршилтанд хамрагдсан дөрвөн машин сургалтын загвараас SVM нь гүйцэтгэлийн хувьд хамгийн шилдэг нь болох нь тогтоогдсон. Логистик регресс ба Гэнэн Бэйсийн загварууд ч ирээдүйтэй үр дүнг харуулж байна.