スパムメール判別

スパムメールフィルターの開発にチャレンジ!

賞金: 100,000 参加ユーザー数: 262 4年弱前に終了

10th Place Solution(by Oregin)

はじめに

本コンペを運営してくださいました、Probspace の運営の皆様、一緒にコンペに取り組んでいらっしゃった皆様、挫けそうになったときにTwitter上でお声がけくださった皆様に心より感謝申し上げます。

今回は、初めて本格的に自然言語処理に挑戦したコンペとなりました。
簡単ですが、解法を掲載させていただきます。

図解を交えた解法は以下のリンクにも公開しておりますので、ご参照ください。
【10位解法】ProbSpace開催「スパムメール判別」コンペの振り返り
https://oregin-ai.hatenablog.com/entry/2020/12/21/201116

前処理

前処理については、以下の通りで実施いたしました。

【共通処理】 この処理は、cha_kabuさんのベースモデルを参考にしました。
https://prob.space/competitions/spam_mail/discussions/cha_kabu-Postd207047dddb824a851d4

  • ストップワードの削除
  • HTMLの分解
  • URLの削除
  • [ ]で囲まれた文の削除

【不均衡データ対策】

  • アンダーサンプリング

今回のデータは、スパムメールの数に対して、非スパムメールが非常に少ないとても偏った不均衡データだったため、適切に学習できるようスパムメールと非スパムメールのデータ数を均衡化する必要がありました。

均衡化には、RandomUnderSamplerを使用しました。

【ベクトル化】

  • CountVectorizer

出現する単語をカウントすることで、単語の出現数を特徴量にする手法です。出現した単語を純粋にカウントします。

  • TfidfVectorizer

TF-IDF(索引語頻度逆文書頻度)という手法で特徴量を作成します。
TF(単語の出現頻度)とIDF(単語のレア度)を掛けたものになります。
TFは、【文書内の該当する単語の出現回数】÷【文書内の全単語の出現回数】となります。
IDFは、【全ての文書数】÷【該当する単語を含む文書数】のLogを取ったもので表されて、値が大きければ大きいほどレアな単語であることになります。
このTFとIDFをかけ合わせた値を単語の特徴量とします。  

モデル構築

今回のモデル構築は、最初、LightGBM、XGboost、RandomForestとMLPRegressorの単体のモデルを大量に作成して、LBの成績が良かったモデルを1層目とする2階層のStackingモデルとしました。

その後、2層目も複数作成して、最終的には、1層目、2層目の出力の加重平均を試行錯誤しました。

BERTなどの自然言語処理の学習済みモデルは、今回は、勉強不足のため、採用できませんでした。

終盤は、自然言語処理とは関係なく、アンサンブルの試行錯誤になってしまったので、次回の機会に向けて、自然言語処理も学んでいきたいと思いました。

感想

今回のコンペは、初めて、本格的に、自然言語処理に挑戦したコンペとなりました。本格的にとはいったものの、自然言語処理らしいことは、テキストデータのクレンジングと、ベクトル化のみしかできませんでした。

実際は系列データの学習など、もっと深いところまで取り組まないと、太刀打ちできないと思いますが、今回は2値分類ということで、なんとかこれまでの手法も活用してそれなりのスコアを残すことができました。

今回はコンペなので、これで良かったのですが、実業務に活かしていくことを考えると、もっと勉強しないとならないと考えています。

引き続き精進していきたいと思います。

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。