ელექტრონული ფოსტა არის სასიცოცხლო მნიშვნელობის ინსტრუმენტი დღევანდელ მსოფლიოში კომუნიკაციისთვის; თუმცა, სპამი ელფოსტა გამოჩნდა, როგორც მთავარი გამოწვევა. უცნობი წყაროებიდან ეს არასასურველი შეტყობინებები ხშირად ავსებს შემოსულებს, არღვევს კომუნიკაციას და პროდუქტიულობას. ეს ნაშრომი იკვლევს მანქანური სწავლების სხვადასხვა ტექნიკის გამოყენებას ელ.ფოსტის კლასიფიკაციისთვის, როგორც „სპამი“ ან „ჰამ“ (არა-სპამი).
კლასიფიკაციის მოდელები, როგორიცაა 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 არის ტექსტის ანალიზის მიდგომა, რომელიც ასახელებს დოკუმენტში თითოეულ ნ-გრამს მისი ტერმინის სიხშირე-შებრუნებული დოკუმენტის სიხშირის მიხედვით. ვადის სიხშირე უბრალოდ არის მოცემული ტერმინის სიხშირე დოკუმენტში (ამ შემთხვევაში, ელ.წერილი). საპირისპირო დოკუმენტის სიხშირე ჩვეულებრივ გამოითვლება შემდეგნაირად:
ჟურნალი ((დოკუმენტების საერთო რაოდენობა/დოკუმენტების რაოდენობა ვადით)
ეს ემსახურება მნიშვნელოვანი ტერმინების უფრო მაღალ შეფასებას, ვიდრე ძალიან ხშირი და, შესაბამისად, ნაკლებად მნიშვნელოვანი ტერმინები.
ეს იძლევა სულ 1130 ტერმინს სასწავლო მონაცემთა ბაზაში.
მნიშვნელოვანია აღინიშნოს, რომ 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 მოდელზე. საერთო სიზუსტე საკმაოდ მაღალია, მაგრამ სპეციფიკა აჩვენებს, რომ ჯერ კიდევ არის გარკვეული გაუმჯობესების ადგილი. ამ მოდელის მომხმარებელი აღმოაჩენს, რომ რამდენიმე ჰემი იწინასწარმეტყველა როგორც სპამი.
კოდი ლოგისტიკური რეგრესიის მოდელისთვის -
#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"]
შემდეგი მოდელი, რომელიც სცადა, იყო Naïve Bayes მოდელი. ამ მოდელისთვის ჯვარედინი ვალიდაცია ხუთჯერადი მიდგომით ოპტიმალური ჰიპერპარამეტრების მოსაძებნად გაკეთდა. ეს იწვევს შემდეგ პარამეტრებს Naive-Bayes-ისთვის -
ეს მოდელი ასევე კარგ შედეგს აღწევს როგორც სპეციფიკურობაზე, ასევე მგრძნობელობაზე.
კოდი 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 ბიბლიოთეკის კარტის გამოყენებით ოპტიმალური ჰიპერპარამეტრების დასადგენად. ეს ჰიპერპარამეტრები ნაჩვენებია ქვემოთ -
ამ მოდელის შედეგები, როდესაც გამოიყენება ტესტის მონაცემთა ბაზაზე, ნაჩვენებია ქვემოთ -
კოდი 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 აღმოჩნდა საუკეთესო შესრულების თვალსაზრისით. ლოგისტიკური რეგრესია და ნაივ ბეიზის მოდელები ასევე აჩვენებენ პერსპექტიულ შედეგებს.