ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

迷惑メールの分類を実装してみた。

機械学習でできる5つのうち、分類の実装にうつる。

分類の代表的な活用シーンとして、迷惑メールの分類が挙げられる。

今回は、以下の3つのアルゴリズムを使って分類してみる。

使用データ

kaggle の「sms-spam-collection-dataset.zip

https://www.kaggle.com/uciml/sms-spam-collection-dataset

やりたいこと

そのメールが迷惑メールかそうでないか、を分類する。

実装内容

import random
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNB

# CSV読み込み・データ整理
df = pd.read_csv('spam.csv', encoding='latin-1')
df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)
df.rename(columns={"v1":"label", "v2":"text"}, inplace=True)

n = random.randint(0,5567)
cut_data = df.loc[n:n+4]

df.drop([n,n+1,n+2,n+3,n+4], axis=0, inplace=True)

# レーニング・評価データ分割
X = pd.DataFrame(df['text'])
Y = pd.DataFrame(df['label'])
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.7, test_size=0.3, random_state=1)

# 単語の出現回数取得
vec_count = CountVectorizer(min_df=3)
vec_count.fit(X_train['text'])

# レーニング・評価データをベクトル化
X_train_vec = vec_count.transform(X_train['text'])
X_text_vec = vec_count.transform(X_test['text'])

# ベルヌーイモデルを利用(2値分類)
model = BernoulliNB()
model.fit(X_train_vec, Y_train['label'])

# 予測テキストデータ作成
check_data_text = np.array(cut_data["text"])
check_data_label = np.array(cut_data["label"])
df_data = pd.DataFrame(check_data_text, columns=['text'])

# 予測テキストデータをベクトル化
input_vec = vec_count.transform(df_data['text'])

# 予測結果の表示
print(model.predict(input_vec))
print(cut_data['label'])
# X_train_vecY_trainはナイーブベイズで整えたデータを再利用

from sklearn.linear_model import Perceptron as Pec
# パーセプトロン
model = Pec(eta0 = 0.1,random_state=1,shuffle=True)
model.fit(X_train_vec,Y_train['label'])

# 予測結果の表示
print(model.predict(input_vec))
print(cut_data['label'])
  • 「ロジスティック回帰」
# X_train_vecY_trainはナイーブベイズで整えたデータを再利用
from sklearn.linear_model import LogisticRegression as LogR
model = LogR(random_state=1)
model.fit(X_train_vec,Y_train['label'])

# 予測結果の表示
print(model.predict(input_vec))
print(cut_data['label'])

得られた結果

ナイーブベイズアルゴリズム

['ham' 'ham' 'ham' 'ham' 'ham'] 994 ham 995 ham 996 ham 997 ham 998 ham

パーセプトロン

['ham' 'ham' 'ham' 'ham' 'ham'] 994 ham 995 ham 996 ham 997 ham 998 ham

ロジスティック回帰

['ham' 'ham' 'ham' 'ham' 'ham'] 994 ham 995 ham 996 ham 997 ham 998 ham

 

結果わかること

  • どのアルゴリズムも、5件とも迷惑メールではないという予測を得られた。

まとめ

今回は、どのアルゴリズムを使っても正しい予測結果を得られたので、どのアルゴリズムが優秀なのかを判定することはできなかった。今回の予測レベルが低かったからなのか、どのアルゴリズムも精度が高いのか、いろいろなケースを実装してみてそれぞれの特性を把握していこうと思う。

今後の課題

  • 迷惑メール以外の分類をやってみる
  • 違うデータを使って迷惑メールの分類をやってみる

参考サイト

https://rightcode.co.jp/blog/information-technology/simple-algorithm-junk-email-classification