paint-brush
Хэм ба Спам: Спам имэйлийг хэрхэн тодорхойлох, ангилах вэby@ramakadapala
Шинэ түүх

Хэм ба Спам: Спам имэйлийг хэрхэн тодорхойлох, ангилах вэ

by Rama7m2025/03/08
Read on Terminal Reader

Хэтэрхий урт; Унших

Энэ төсөлд машин сургалтын зарим хэрэгслийг Хэм болон Спам имэйлийн ангилагчийн үүргийг хэрхэн гүйцэтгэхийг харахын тулд ашигласан. Тооцооллын тайлбар, тэдгээрийн гүйцэтгэлийн харьцуулалтыг үзүүлэв.
featured image - Хэм ба Спам: Спам имэйлийг хэрхэн тодорхойлох, ангилах вэ
Rama HackerNoon profile picture

Хийсвэр

Имэйл бол өнөөгийн ертөнцөд харилцааны чухал хэрэгсэл юм; Гэсэн хэдий ч спам имэйлүүд томоохон сорилт болж байна. Үл мэдэгдэх эх сурвалжаас ирсэн хүсээгүй эдгээр мессежүүд нь ихэвчлэн ирсэн хайрцгийг дүүргэж, харилцаа холбоо, бүтээмжийг саатуулдаг. Энэхүү баримт бичиг нь цахим шууданг "спам" эсвэл "хам" (спам биш) гэж ангилахын тулд янз бүрийн машин сургалтын техникийг ашиглаж байгааг судалж байна.


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-грамм бүрийг давтамж-урвуу баримтын давтамжийн нэр томьёогоор илэрхийлдэг текстийн шинжилгээний арга юм. Нэр томъёоны давтамж гэдэг нь баримт бичиг доторх өгөгдсөн нэр томъёоны давтамж юм (энэ тохиолдолд имэйл). Урвуу баримт бичгийн давтамжийг ерөнхийд нь дараах байдлаар илэрхийлнэ.

    бүртгэл ((Баримт бичгийн нийт тоо/Хугацаатай баримтын тоо)


Энэ нь чухал нэр томьёог маш олон давтамжтай, тиймээс ач холбогдол багатай нэр томъёоноос илүү жинтэй болгоход үйлчилдэг.

  • Дараа нь баримт бичгийн 2-оос доошгүй хувьд орсон боловч 95 хувиас илүүгүй байгаа нэр томъёог сонгох замаар нэр томъёог багасгадаг. Энэ үйл явц нь сургалтын багцад хэт өвөрмөц эсвэл хэт давамгайлсан нэр томъёог арилгах замаар хэт тохирохоос сэргийлдэг.


  • Энэ нь сургалтын өгөгдлийн багцад нийт 1,130 нэр томъёог гаргаж өгдөг.


Туршилтын багцтай TF-IDF-ийг ашиглах стратеги нь зөвхөн сургалтын TF-IDF дээр загварчлах сургалтыг хийж, дараа нь TF-IDF-ийг туршилтын нарийвчлалын бүрэн өгөгдөлтэй дахин тооцоолох явдал гэдгийг анхаарах нь чухал юм. TF-IDF нь тодорхой хугацааны бүх өгөгдлийн багц дахь давтамжаас хамаардаг тул сургалтын явцад туршилтын өгөгдлийг оруулахгүй байх шаардлагатай.


Эцэст нь сургалтын багцад зөвхөн улирлын давтамжаар эхний 1000 нэр томъёог сонгосон.


tf-idf хүснэгт

Урьдчилан боловсруулах үе шатуудын код -

 #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)

Ашигласан загварууд

  1. Хамгийн ойрын хөршүүд (KNN) - үндсэн загвар

Загвар нь боломжийн онцлогтой боловч маш муу мэдрэмжтэй байдаг тул олон шитийг спам гэж худал таамаглаж байна гэсэн үг. Доорх үр дүн бүрийн эерэг анги нь "хам" гэдгийг анхаарна уу. Энэ нь спам гэж ангилагдсан олон бодит имэйлийг орхих нь хэрэглэгчийн хувьд хамгийн муу үр дагавар юм.


K=3-тэй KNN-ийн төөрөгдлийн матриц
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"]
  1. Логистик регресс

KNN загвараас муу үр дүнд хүрсэний дараа логистик регрессийг ашигласан дараагийн загвар болсон.


Энэ хувилбарын зорилгын үүднээс,

Хиам болон спам имэйлийн магадлалын томьёо

Логистик регрессийг дараах гиперпараметрээр ашигласан болно:

  • алдагдал = "L1"
  • зардал = 2
  • эпсилон = 0.1


Энэ загвар нь туршилтын өгөгдлийн багц дээр дараах үр дүнг өгдөг бөгөөд энэ нь 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"]
  1. Гэнэн Бэйсийн загвар

Дараагийн оролдсон загвар нь Naive Bayes загвар байв. Энэ загварын хувьд хамгийн оновчтой гиперпараметрийг олохын тулд хөндлөн баталгаажуулалтыг 5 дахин давтах аргыг ашигласан. Үүний үр дүнд Naive-Bayes-ийн хувьд дараах параметрүүд гарч ирнэ.


  • лаплас = 0
  • userkernel = FALSE
  • тохируулах = 1


Энэ загвар нь өвөрмөц байдал, мэдрэмжийн аль алинд нь сайн үр дүнд хүрдэг.

Naïve 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-г хийдэг. Эдгээр гиперпараметрүүдийг доор үзүүлэв -

  • зардал = 1
  • алдагдал = L2
  • жин = 3


Туршилтын өгөгдлийн багцад ашигласан энэ загварын үр дүнг доор харуулав.

SVM-д зориулсан төөрөгдлийн матриц

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 нь гүйцэтгэлийн хувьд хамгийн шилдэг нь болох нь тогтоогдсон. Логистик регресс ба Гэнэн Бэйсийн загварууд ч ирээдүйтэй үр дүнг харуулж байна.

L O A D I N G
. . . comments & more!

About Author

Rama HackerNoon profile picture
I am a highly accomplished data science and analytics professional with over 11 years of expertise in financial services

TAG ҮҮ

ЭНЭ ӨГҮҮЛЛИЙГ ТОЛГОЙЛУУЛСАН...