こんにちは、@yshr10icです。
ProbSpaceで開催された、スパムメール判別コンペに参加しました。
きちんと最後までコンペをやり切るというのは今回が初めてでした。
結果としては、Public 16位、Private 18位の銅メダルでした。
18位ということで大したことはないかもしれませんが、せっかくの機会ですのでコンペを振り返ってみたいと思います。
コンペの概要
本コンペでは、電子メールのテキストデータから、スパム・非スパムを判別する分類モデルを作成し、そのモデルの精度(今回はF値)を争います。
訓練データ、テストデータには、それぞれ8,878件、24,838件のデータが含まれており、訓練データとテストデータでスパム・非スパムの割合が異なっていることが特徴的でした(訓練データのスパム・非スパムの割合は8707 : 171、テストデータは7838 : 17000)。こちらに関しては、異常検知としてモデル構築されるようデータ設計しているため、このような割合に意図的にしているということでした。
解法
前処理
今回は大きく2つのデータセットを作りました。1つ目のデータセット作成のために前処理でやったことは以下のとおりです。
- 重複削除
- 大文字を小文字に変える
- 短縮形を元に戻す
- 注釈の削除
- URLの削除
- ステミング
- TF-IDFによるベクトル化
次に2つ目のデータセット作成のために前処理では、1つ目のデータセット作成でやった前処理に加えて以下のことをやりました。
- 文章の長さ
- 単語数
- ユニークな単語数
不均衡データ対策
訓練データにおいてスパムの割合が非スパムに比べて非常に多かったため、不均衡データの対策が必要でした。こちらに関しては、色々と調べた結果アンダーサンプリング+バギングが良さそうということで、こちらを採用しました。
モデル
1つ目のデータセットを利用したモデルは以下のとおりです。
- LightGBM
- MultinomialNB
- RandomForestClassifier
- ExtraTreesClassifier
- SVC
上記のモデルをTF-IDFのmin_dfを変えた2パターンそれぞれで学習させました。
2つ目のデータセットを利用したモデルは以下のとおりです。
- LightGBM
2つ目のデータセットでは、LightGBM以外のモデルは極端に性能が悪かったため、候補から外しました。
最終的には上記で作成した11モデルの加重平均を取るようにしました。
試せなかったこと、試せばよかったこと
今回始めての自然言語処理のコンペということで、前処理など何をすれば良いのか全然分からない状態でした。
テストデータの中でスパムが17,000件と分かっていたので、その情報を活用すればよかったと思います。
また、前処理や特徴量生成に関して、基本的なことしかできなかったので、もっと自然言語処理について勉強しなければいけないなと思いました。
まとめ
あまり自分の実力ではありませんが、銅メダルを取れたことで、コンペに参加するモチベーションを上げることができました。今後も色んなコンペに参加していきたいと思います!
次は銀メダル以上を取れるように頑張りたいと思います!