機械学習でできる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_vecやY_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_vecやY_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