今回のコンペティションでは、スパムメール判別に挑戦いただきます。
電子メールのテキストデータより、スパム・非スパムを判別する分類モデルを作成してください。
スパムメールの存在は、個人・企業の生産性低下、サーバー圧迫の一要因であり、犯罪につながる可能性があることからも解決すべき社会問題の一つです。
スパムメール対策ソフトとして、様々な製品がありますが、
自然言語処理を用いたフィルタリングの仕組みの理解・共有という目的で本コンペを設計しました。
スパム判別においては検知率の高さ・誤検知率の低さ双方が重要であるため、
今回はF値を評価指標としたコンペティションに挑戦いただきます。
1位:100,000円
データをダウンロードするにはログインまたはユーザー登録して下さい
コンペに使用するデータは2つに分けられます。
訓練データ、テストデータには、それぞれ8,878件、24,838件のデータが含まれます。
また今回のコンペにおいては、訓練・テストデータセットの非スパム・スパム割合を意図的に変更しております。
訓練データについては、非スパム : スパム = 8707 : 171として、異常検知としてモデル構築されるようデータ設計しております。
一方テストデータについては、判別性能評価を目的とし、今回用意できた残るデータを用い、非スパム : スパム = 7838 : 17000としております。
データセットのカラムは以下の通りになっています。
column name | description |
---|---|
id | ユニークなid |
contents | メールのタイトルと本文 |
y | (0:非スパム, 1:スパム) |
出典:下記をもとに改変し利用
V. Metsis, I. Androutsopoulos and G. Paliouras, "Spam Filtering with Naive Bayes - Which Naive Bayes?". Proceedings of the 3rd Conference on Email and Anti-Spam (CEAS 2006), Mountain View, CA, USA, 2006.
目標はテストデータセットのメールデータにもとづき、スパムメールを判別することです。yを0もしくは1で予測してくだい。
$precision = \frac{TP}{TP + FP}$
$recall = \frac{TP}{TP + FN}$
$F1 = \frac{2 * precision * recall}{precision + recall}$
ここでTP(True Positive), FP(False Positive), FN(False Negative)とします。
回答用のsubmission.csvを用意する(エントリーとヘッダー行を含む) 。
提出されたファイルに余分な行や列(idとy以外)が含まれていた場合はエラーとなります。
提出ファイルは以下の列のみを必ず含んでください:
id,y
1, 0
2, 1
3, 0
4, 0
本コンペでは、開催期間終了後 賞金対象者のコードを公開し、ユーザーの皆様にチーティング有無をレビューしていただき順位確定させる、オープンレビュー方式のコンペティションを行います。
コード公開後1週間:
レビュアー(ユーザー)より、チーティングの疑いに関するコメントがある場合は、ご回答をお願いいたします。
※チーティングとは無関係のコメント(ノウハウに関する質疑 等)についてもご回答いただけると幸いですが、順位確定の判断材料とは致しません。
レビュアーからの質疑と、回答状況をふまえて、最終的に運営側で順位確定を判断します。
開始日 2020/10/26 12:00 JST
終了日 2020/12/20 24:00 JST
エントリー締め切り なし
※コンペ期間中であっても、不正が疑われる場合は、運営より確認のためメール連絡させていただくことがございます。一週間以内にご回答いただけない場合も、不正と判断させていただきます。
原則外部データ使用は禁止としておりますが、正解データの入手につながらない場合は、下記承認プロセスにより使用できることといたします
注)ただし、コンペ終了まで7日をきってからの申請は禁止とします
公平性の担保、チーティング等の不正防止のため、予告なくルールの追加・変更を行う場合がございます。
ご不便をおかけすることもあるかと思いますが、サービス向上のためご了承ください。
コンペティションへの参加に際しては、ProbSpace利用規約(以下、「利用規約」といいます。)に加え、本ProbSpace参加規約(以下「本規約」といいます。)に同意いただく必要があります。利用規約にて定義された用語は、本規約においても同様の意味で用いられるものとします。
第1条(適用)
第2条(定義)
本規約において次の各用語の定義は、それぞれ以下に定めるとおりとします。
第3条(権利の帰属)
第4条(入賞者の義務)
第5条(禁止事項)
第6条(本コンペの変更、中断、終了等)
第7条(損害賠償)
第8条(本規約の変更)
当社は、必要と判断した場合には、参加者に対して事前に通知する(本コンペにかかる当社ウェブサイト上での告知その他当社が適当と認める方法を含みます。)ことにより、いつでも本規約を変更することができるものとします。なお、変更内容の通知後、参加者が当社の定める期間内に本コンペへの参加を取り消す手続をとらなかった場合には、当該参加者は変更後の規約に同意したものとみなされます。当社は、本規約の変更により参加者に生じたすべての損害について一切の責任を負いません。
第9条(その他)
本契約の準拠法は日本法とし、本契約に起因し又は関連する一切の紛争については、当社の本店所在地を管轄する裁判所を第一審の専属的合意管轄裁判所とします。
(制定)2020年6月22日
はい。
最も精度の高い学習モデルを作成した優勝者には、賞金10万円を贈呈します。
順位確定までのプロセスについては、ルール「Open Review Competition」を参照ください。
可能です。チームページから作成いただけます。
こちらから作成いただけます。
コンペティション参加にはアカウント登録が必要となりますのでご注意ください。
Seed を固定することが推奨です。
ただし、Seed を固定しなくても提出用コードとしては認めています。
このチュートリアルでは、スパムメールデータに対して
を行います。
import pandas as pd
import numpy as np
import sklearn
!python3 --version
print("Pandas", pd.__version__)
print("Numpy", np.__version__)
print("Scikit learn", sklearn.__version__)
import matplotlib
print("Matplotlib", matplotlib.__version__)
Python 3.7.7
Pandas 1.0.4
Numpy 1.18.5
Scikit learn 0.23.1
Matplotlib 3.2.1
まずはデータを読み込んで見ましょう。csvデータの読み込みは複数のやり方がありえますが、pandas
のread_csv
関数はその中でも機能が豊富で、扱いやすいためこれを使います。
これを使うと、csvデータを読み込み、pandas.DataFrame
にして返してくれます。
#データの読み込みと前処理
import pandas as pd
train_data = pd.read_csv("../compe_data/train_data.csv", index_col='id')
print(train_data.shape)
(8878, 2)
また、DataFrame
には.head()
というメソッドが定義されており、これを呼び出すとDataFrame
の先頭の数行を確認できます。
train_data[train_data['y'] == 0].head()
id | contents | y |
---|---|---|
1 | Subject: re : fw : willis phillips\r\ni just s... | 0 |
2 | Subject: re : factor loadings for primary curv... | 0 |
3 | Subject: re : meridian phone for kate symes\r\... | 0 |
4 | Subject: re : october wellhead\r\nvance ,\r\nd... | 0 |
5 | Subject: california 6 / 13\r\nexecutive summar... | 0 |
train_data[train_data['y'] == 1].head()
id | contents | y |
---|---|---|
67 | Subject: information is key to sto - ck succes... | 1 |
95 | Subject: aggressive investors should be watchi... | 1 |
152 | Subject: portraits for commission from photos\... | 1 |
172 | Subject: microsoft autoroute 2005 dvd uk - $ 1... | 1 |
173 | Subject: failure notice\r\nhi . this is the qm... | 1 |
訓練データにおけるスパムメールと非スパムメールの分布がどうなっているのか見てみましょう。
np.sum(train_data['y'] == 0), np.sum(train_data['y'] == 1)
(8707, 171)
ほとんどのデータが非スパムであり、スパムメールは全体の2%程度しか含まれていないことがわかりました。
モデルに投入する目的変数(y),説明変数(X)を作成します
X = train_data['contents']
y = train_data['y']
いよいよ予測モデルの作成に入ります。model.fit('説明変数','目的変数')
と記述することでモデルの学習が可能となります。目的変数を説明変数の組み合わせで説明可能な回帰モデルを作成できます。
#scikit-learnライブラリをimport
import sklearn
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
# 回帰モデルのインスタンス化
tfidf = TfidfVectorizer()
tfidf.fit(X)
vec_X = tfidf.transform(X)
model = LogisticRegression()
#予測モデルの作成
result = model.fit(vec_X, y)
confusion_matrix
メソッドとf1_score
メソッドを用いてモデルの評価を行うことができます。
from sklearn.metrics import confusion_matrix, f1_score
print(confusion_matrix(y, model.predict(vec_X)))
[[8707 0]
[ 166 5]]
また、コンペの評価指標となるF値についても出力が可能です。
今回は、sklearn.metrics
に含まれるf1-score
メソッドを使用します。
F値は0に近いほど評価が悪く、1に近いほど評価が良いことを表します。
モデルを元にした予測値は、model.predict('説明変数')
で表します。
print(f1_score(y, model.predict(vec_X)))
0.056818181818181816
今回作成したモデルのF値は0.056程度でした。スパムをほとんど検出できず、非スパムと認識しているのが原因のようです。
最後に、作成したモデルを使用してテストデータを用いてスパムメールの判定をします。
テストデータの説明変数については予め、上記でモデルに学習させたデータの説明変数と同様の前処理をする必要があります。
path_test = "../compe_data/test_data.csv"
test_data = pd.read_csv(path_test, index_col='id')
test_data.head()
contents | |
---|---|
id | |
1 | Subject: re : weather and energy price data\r\... |
2 | Subject: organizational study\r\ngpg and eott ... |
3 | Subject: re [ 7 ] : talk about our meds\r\nske... |
4 | Subject: report about your cable service\r\nhi... |
5 | Subject: start date : 1 / 26 / 02 ; hourahead ... |
vec_X = tfidf.transform(test_data['contents'])
先ほど使用したmodel.predict('説明変数')
の'説明変数'にテストデータの値を代入することで、テストデータの予測値を算出することができます。
下記のようにして、提出用のsubmission.csv
を出力することが可能です。
#テスト結果の出力
test_predicted = model.predict(vec_X)
submit_df = pd.DataFrame({'y': test_predicted})
submit_df.index.name = 'id'
submit_df.index += 1
submit_df.to_csv('submission.csv')
コンペティションへの参加に際しては、ProbSpace利用規約(以下、「利用規約」といいます。)に加え、本ProbSpace参加規約(以下「本規約」といいます。)に同意いただく必要があります。利用規約にて定義された用語は、本規約においても同様の意味で用いられるものとします。
第1条(適用)
第2条(定義)
本規約において次の各用語の定義は、それぞれ以下に定めるとおりとします。
第3条(権利の帰属)
第4条(入賞者の義務)
第5条(禁止事項)
第6条(本コンペの変更、中断、終了等)
第7条(損害賠償)
第8条(本規約の変更)
当社は、必要と判断した場合には、参加者に対して事前に通知する(本コンペにかかる当社ウェブサイト上での告知その他当社が適当と認める方法を含みます。)ことにより、いつでも本規約を変更することができるものとします。なお、変更内容の通知後、参加者が当社の定める期間内に本コンペへの参加を取り消す手続をとらなかった場合には、当該参加者は変更後の規約に同意したものとみなされます。当社は、本規約の変更により参加者に生じたすべての損害について一切の責任を負いません。
第9条(その他)
本契約の準拠法は日本法とし、本契約に起因し又は関連する一切の紛争については、当社の本店所在地を管轄する裁判所を第一審の専属的合意管轄裁判所とします。
(制定)2020年6月22日