電子メールは、今日の世界ではコミュニケーションに欠かせないツールですが、スパムメールが大きな問題として浮上しています。不明なソースから送られてくる迷惑メールは、受信トレイに大量に届き、コミュニケーションや生産性を妨げます。この論文では、さまざまな機械学習技術を使用して電子メールを「スパム」または「ハム」(非スパム) に分類する方法について調査します。
K 近傍法 (KNN)、ロジスティック回帰、サポート ベクター マシン (SVM)、ナイーブ ベイズなどの分類モデルを評価し、電子メール分類における有効性を比較します。各モデルのパフォーマンスは、精度、精度、再現率、F1 スコアなどの指標に基づいて評価され、どのアプローチがこのタスクに最も適しているかが判断されます。
2023 年には、毎日 3,473 億通のメールが送信され、そのうちスパムメールは全メールトラフィックの 45% を占めます。これらのメールスパムは、企業に毎年 205 億ドルの損害を与えています。このことを考えると、スパムが正しく分類され、正当なメールトラフィックを妨害しないことを常に確認する必要があります。これは、機械学習の可能性と応用を理解するのに役立つ方法です。
スパム検出の場合、電子メールに精通している人間のユーザーは、それを見ただけですぐにスパムを簡単に判断できます。結果として、この研究は、スパムの識別が機械学習分類器の有用なアプリケーションであることを裏付けていると思います。電子メールをスパムまたはハムとして分類するには、線形分類器に受け入れられるようにデータを準備し、各行をトークン化してステミングし、TF-IDF (Term Frequency – Inverse Document Frequency) テーブルに変換するなど、多くの前処理手順が必要です。
ベースライン モデルとして、K=3 の KNN が選択されました。L1 正則化によるロジスティック回帰、ナイーブ ベイズ モデル、SVM モデルもテストされ、最適なモデルが決定されました。このプロジェクトでは、2551 個の「ハム」メール ファイルと 501 個のスパム メール ファイルを含む Kaggle のデータセットが使用され、R プログラミング言語を使用してモデリングが行われました。
以下のチャートは、さまざまな手順の流れを理解するのに役立ちます。
前処理手順
大量のテキストデータが使用されているため、データを前処理してクリーンアップし、分類モデルで使用できる形式にする必要がありました。以下では、データの前処理の一環として実行された手順を段階的に説明します。
テキスト データは線形分類器に受け入れられる必要があります。つまり、テキスト特徴抽出方法を使用してデータセットを数値特徴に変換する必要があります。
まず、テキストの各行がトークン化され、次の形式にステミングされます。ステミング プロセスでは、語尾の語尾変化を削除して単語を短縮します。たとえば、以下の例では workers が workers になります。
次に、トークン化されたデータは TF-IDF テーブル (用語頻度 - 逆文書頻度) に変換されます。TF-IDF は、文書内の各 n-gram を用語頻度 - 逆文書頻度の観点から表すテキスト分析のアプローチです。用語頻度は、単に文書 (この場合は電子メール) 内の特定の用語の頻度です。逆文書頻度は、通常次のように表されます。
log ((ドキュメントの総数/用語を含むドキュメントの数)
これにより、頻繁に使用されるあまり重要でない用語よりも、重要な用語の重み付けが高くなります。
これにより、トレーニング データセットには合計 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 モデルよりも大幅に改善された結果です。全体的な精度は非常に高いですが、特異性からはまだ改善の余地があることがわかります。このモデルのユーザーは、いくつかのハムがスパムとして予測されていることに気付くでしょう。
ロジスティック回帰モデルのコード -
#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"]
次に試したモデルは、ナイーブベイズモデルです。このモデルでは、5つのアプローチで最適なハイパーパラメータを見つけるためにクロスバリデーションが行われました。その結果、ナイーブベイズのパラメータは次のようになりました。
このモデルは、特異度と感度の両方で良好な結果を達成します。
ナイーブベイズモデルのコード -
##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 クロス検証です。サポート ベクター マシンは、2 つのクラス間でデータを分離するために、最大限に分離する超平面を最適に見つけようとします。
ここでは、Rライブラリcaretを使用して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スコア | 精度 | 想起 |
---|---|---|---|---|
ケーエヌエヌ | 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 値が計算されました。
モデル | ケーエヌエヌ | ロジスティック回帰 | ナイーブベイズ | SVM |
---|---|---|---|---|
オーストラリア連邦 | .5232 | .882 | .9574 | .9628 |
図: 4つのモデルのAUC値
上記の指標から、5 倍のクロス検証を使用した SVM が、電子メールをハムとスパムとして分類する際にデータセット上で最も優れたパフォーマンスを発揮すると結論付けることができます。
スパマーはスパム メッセージを送信するための新しい革新的な方法を常に見つけているため、スパム フィルタリングは常に進化し続ける分野です。単一のスパム対策ソリューションが正しいとは限りません。このプロジェクトでは、いくつかの機械学習ツールを使用し、ハムとスパムのメールの分類器としてどのように機能するかを確認しました。計算の説明とパフォーマンスの比較を示します。
テストされた 4 つの機械学習モデルのうち、パフォーマンスの点では SVM が最高であることがわかりました。ロジスティック回帰モデルとナイーブベイズモデルも有望な結果を示しています。