paint-brush
Ham vs Spam: როგორ ამოვიცნოთ და კლასიფიციროთ სპამი ელ.ფოსტამიერ@ramakadapala
ახალი ისტორია

Ham vs Spam: როგორ ამოვიცნოთ და კლასიფიციროთ სპამი ელ.ფოსტა

მიერ Rama7m2025/03/08
Read on Terminal Reader

Ძალიან გრძელი; Წაკითხვა

ამ პროექტში გამოყენებული იქნა მანქანური სწავლების ზოგიერთი ინსტრუმენტი იმის დასანახად, თუ როგორ მოქმედებენ ისინი ჰემისა და სპამის ელ.ფოსტის კლასიფიკატორებად. წარმოდგენილია გამოთვლების აღწერა და მათი შესრულების შედარება.
featured image - Ham vs Spam: როგორ ამოვიცნოთ და კლასიფიციროთ სპამი ელ.ფოსტა
Rama HackerNoon profile picture

აბსტრაქტი

ელექტრონული ფოსტა არის სასიცოცხლო მნიშვნელობის ინსტრუმენტი დღევანდელ მსოფლიოში კომუნიკაციისთვის; თუმცა, სპამი ელფოსტა გამოჩნდა, როგორც მთავარი გამოწვევა. უცნობი წყაროებიდან ეს არასასურველი შეტყობინებები ხშირად ავსებს შემოსულებს, არღვევს კომუნიკაციას და პროდუქტიულობას. ეს ნაშრომი იკვლევს მანქანური სწავლების სხვადასხვა ტექნიკის გამოყენებას ელ.ფოსტის კლასიფიკაციისთვის, როგორც „სპამი“ ან „ჰამ“ (არა-სპამი).


კლასიფიკაციის მოდელები, როგორიცაა K-უახლოესი მეზობლები (KNN), ლოგისტიკური რეგრესია, დამხმარე ვექტორული მანქანები (SVM) და გულუბრყვილო ბეიები შეფასებულია, მათი ეფექტურობის შედარება ელ.ფოსტის კლასიფიკაციაში. თითოეული მოდელის შესრულება ფასდება ისეთი მეტრიკების საფუძველზე, როგორიცაა სიზუსტე, სიზუსტე, გახსენება და F1 ქულა, რათა დადგინდეს რომელი მიდგომაა ყველაზე შესაფერისი ამ ამოცანისთვის.

შესავალი

2023 წელს ყოველდღიურად იგზავნება 347,3 მილიარდი ელ.წერილი, საიდანაც სპამი ელ.ფოსტის ტრაფიკის 45%-ს შეადგენს. ელ.ფოსტის ეს სპამი ყოველწლიურად ბიზნესს 20,5 მილიარდ დოლარს უჯდება. ამის გათვალისწინებით, ყოველთვის იქნება საჭიროება იმის უზრუნველსაყოფად, რომ სპამი სწორად არის კლასიფიცირებული და არ ერევა ელ.ფოსტის ლეგიტიმურ ტრაფიკში. ეს არის სასარგებლო გზა მანქანური სწავლის პოტენციალისა და გამოყენების გასაგებად.


სპამის აღმოჩენის შემთხვევაში, ელ.ფოსტის ნაცნობ ადამიან მომხმარებელს შეუძლია ადვილად განსაზღვროს სპამი მის დათვალიერებისთანავე. შედეგად, მე მჯერა, რომ ეს ნამუშევარი ადასტურებს, რომ სპამის იდენტიფიცირება სასარგებლო აპლიკაციაა მანქანათმცოდნეობის კლასიფიკატორისთვის. ელ.ფოსტის სპამად ან ლომად კლასიფიკაციისთვის საჭიროა წინასწარი დამუშავების მრავალი ეტაპი - მონაცემების მომზადება ხაზოვანი კლასიფიკატორისთვის მისაღებისთვის, შემდეგ ტოკენიზაცია და თითოეული ხაზის დაყენება TF-IDF (ტერმინის სიხშირე - საპირისპირო დოკუმენტის სიხშირე) ცხრილში.


საბაზისო მოდელად შეირჩა KNN K=3-ით. ლოგისტიკური რეგრესია L1 რეგულაზაციით, Naïve Bayes მოდელი და SVM მოდელები ასევე შემოწმდა საუკეთესო მოდელის არჩევამდე. ამ პროექტის მიზნებისთვის გამოყენებულია Kaggle-ის მონაცემთა ნაკრები, რომელსაც აქვს 2551 „ham“ ელფოსტის ფაილი და 501 სპამის ელფოსტის ფაილი და მოდელირება განხორციელდა R პროგრამირების ენის გამოყენებით.

ლორის სიტყვების ახლოდანსპამის სიტყვების ახლოდან მეთოდოლოგია მოჰყვა

ქვემოთ მოცემული დიაგრამა დაგეხმარებათ გაიგოთ შემდეგი ნაბიჯების ნაკადი -

პროექტის ეტაპების ამსახველი ფიგურა

წინასწარი დამუშავების ეტაპები

იმის გათვალისწინებით, რომ დიდი მოცულობის ტექსტური მონაცემები გამოიყენება, საჭირო იყო მონაცემების წინასწარი დამუშავება, რათა გაესუფთავებინათ ისინი და მიეღოთ ის ფორმატში, რომელიც შეიძლება გამოყენებულ იქნას კლასიფიკაციის მოდელებისთვის. ქვემოთ აგიხსნით ნაბიჯ-ნაბიჯ პროცესს, რომელიც მოჰყვა მონაცემთა წინასწარი დამუშავების ნაწილს –

  • ტექსტის მონაცემები მისაღები უნდა იყოს წრფივი კლასიფიკატორისთვის. ეს ნიშნავს, რომ მონაცემთა ნაკრები უნდა გარდაიქმნას ტექსტის ფუნქციის ამოღების მეთოდების გამოყენებით ციფრულ მახასიათებლებში.

  • პირველ რიგში, ტექსტის თითოეული სტრიქონი ტოკენიზებულია და ფუძედება შემდეგ ფორმაზე. ფუძემდებლობის პროცესი ამოკლებს სიტყვებს დაბოლოებული დაბოლოებების ამოღებით. მაგალითად, მუშები ხდება მუშა ქვემოთ მოცემულ მაგალითში.

    სიტყვები და მათი წარმოშობის სიტყვები

  • შემდეგი, ტოკენიზებული მონაცემები გარდაიქმნება TF-IDF ცხრილად (ტერმინი სიხშირე - დოკუმენტის ინვერსიული სიხშირე). TF-IDF არის ტექსტის ანალიზის მიდგომა, რომელიც ასახელებს დოკუმენტში თითოეულ ნ-გრამს მისი ტერმინის სიხშირე-შებრუნებული დოკუმენტის სიხშირის მიხედვით. ვადის სიხშირე უბრალოდ არის მოცემული ტერმინის სიხშირე დოკუმენტში (ამ შემთხვევაში, ელ.წერილი). საპირისპირო დოკუმენტის სიხშირე ჩვეულებრივ გამოითვლება შემდეგნაირად:

    ჟურნალი ((დოკუმენტების საერთო რაოდენობა/დოკუმენტების რაოდენობა ვადით)


ეს ემსახურება მნიშვნელოვანი ტერმინების უფრო მაღალ შეფასებას, ვიდრე ძალიან ხშირი და, შესაბამისად, ნაკლებად მნიშვნელოვანი ტერმინები.

  • შემდეგი, ვადები მცირდება მხოლოდ იმ ტერმინების არჩევით, რომლებიც წარმოდგენილია დოკუმენტების მინიმუმ 2 პროცენტში, მაგრამ არაუმეტეს 95 პროცენტისა. ეს პროცესი ხელს უშლის ზედმეტად მორგებას იმის უზრუნველსაყოფად, რომ ამოღებულ იქნა პირობები, რომლებიც ძალიან უნიკალურია ან ძალიან გავრცელებულია სავარჯიშო კომპლექტში.


  • ეს იძლევა სულ 1130 ტერმინს სასწავლო მონაცემთა ბაზაში.


მნიშვნელოვანია აღინიშნოს, რომ 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. K- უახლოესი მეზობლები (KNN) - საბაზისო მოდელი

მოდელი აღწევს გონივრულ სპეციფიკას, მაგრამ უკიდურესად დაბალ მგრძნობელობას, რაც ნიშნავს, რომ ბევრი ლორი არასწორად არის ნაწინასწარმეტყველები, როგორც სპამი. გაითვალისწინეთ, რომ თითოეულ ქვემოთ მოცემულ შედეგში დადებითი კლასია "ლორი". ეს მართლაც ყველაზე ცუდი შედეგია მომხმარებლისთვის, რადგან ისინი გამოტოვებენ ბევრ რეალურ წერილს, რომლებიც კლასიფიცირებულია როგორც სპამი.


დაბნეულობის მატრიცა KNN-ისთვის K=3-ით
კოდი 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
  • epsilon = 0.1


ეს მოდელი იძლევა შემდეგ შედეგებს ტესტის მონაცემთა ბაზაზე, რაც უკვე მნიშვნელოვანი გაუმჯობესებაა KNN მოდელზე. საერთო სიზუსტე საკმაოდ მაღალია, მაგრამ სპეციფიკა აჩვენებს, რომ ჯერ კიდევ არის გარკვეული გაუმჯობესების ადგილი. ამ მოდელის მომხმარებელი აღმოაჩენს, რომ რამდენიმე ჰემი იწინასწარმეტყველა როგორც სპამი.
დაბნეულობის მატრიცა ლოგისტიკური რეგრესიისთვის კოდი ლოგისტიკური რეგრესიის მოდელისთვის -

 #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. გულუბრყვილო ბეიეს მოდელი

შემდეგი მოდელი, რომელიც სცადა, იყო Naïve Bayes მოდელი. ამ მოდელისთვის ჯვარედინი ვალიდაცია ხუთჯერადი მიდგომით ოპტიმალური ჰიპერპარამეტრების მოსაძებნად გაკეთდა. ეს იწვევს შემდეგ პარამეტრებს Naive-Bayes-ისთვის -


  • ლაპლასი = 0
  • userkernel = FALSE
  • მორგება = 1


ეს მოდელი ასევე კარგ შედეგს აღწევს როგორც სპეციფიკურობაზე, ასევე მგრძნობელობაზე.

დაბნეულობის მატრიცა ნაივ ბეიზის მოდელისთვის კოდი 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 ჯვარედინი დადასტურება ხაზოვანი ბირთვით. დამხმარე ვექტორული მანქანები ცდილობენ ოპტიმალურად იპოვონ მაქსიმალურად გამყოფი ჰიპერპლანი, რათა გამოეყოთ მონაცემები ორ კლასს შორის.


აქ, 5-ჯერადი CV შესრულებულია R ბიბლიოთეკის კარტის გამოყენებით ოპტიმალური ჰიპერპარამეტრების დასადგენად. ეს ჰიპერპარამეტრები ნაჩვენებია ქვემოთ -

  • ღირებულება = 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

ნახ: AUC მნიშვნელობები 4 მოდელისთვის

ზემოაღნიშნული მეტრიკებიდან შეიძლება დავასკვნათ, რომ SVM 5-ჯერადი ჯვარედინი დადასტურებით საუკეთესოდ ასრულებს ელ.

დასკვნა

სპამის გაფილტვრა ყოველთვის იქნება უწყვეტი ევოლუციის სფერო, რადგან სპამერები მუდმივად პოულობენ ახალ და ინოვაციურ მეთოდებს სპამის გაგზავნისთვის. არც ერთი სპამის საწინააღმდეგო გადაწყვეტა არ შეიძლება იყოს სწორი. ამ პროექტში გამოყენებული იქნა მანქანური სწავლების ზოგიერთი ინსტრუმენტი იმის დასანახად, თუ როგორ მოქმედებენ ისინი ჰემისა და სპამის ელ.ფოსტის კლასიფიკატორებად. წარმოდგენილია გამოთვლების აღწერა და მათი შესრულების შედარება.


ოთხი მანქანათმცოდნეობის მოდელიდან, რომლებიც გამოცდილია, 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

დაკიდეთ ტეგები

ეს სტატია იყო წარმოდგენილი...