• トップ
  • ブログ一覧
  • 【機械学習】単純なアルゴリズムで迷惑メールを分類してみた
  • 【機械学習】単純なアルゴリズムで迷惑メールを分類してみた

    メディアチームメディアチーム
    2020.12.29

    IT技術

    【機械学習】単純なアルゴリズムで迷惑メールを分類してみた

    迷惑メールを分類してみた

    今回は、「単純なアルゴリズムで迷惑メールを分類する」というテーマで、紹介していきます。

    具体的には、

    1. ナイーブベイズ
    2. ロジスティック回帰
    3. パーセプトロン

    を使って、それぞれでどのぐらいの精度が出るのかを、調査してみたいと思います。

    わかりやすくまとめていきますので、ぜひチャレンジしてみてくださいね!

    ナイーブベイズ

    このナイーブベイズについて説明するには、「ベイズの定理」について知る必要があります。

    「ベイズの定理」とは、以下で表される、条件付き確率に関する式です。

    P(BA)=P(AB)P(B)P(A)P(B|A)=\frac{P(A|B)P(B)}{P(A)}

    P(B)P(B) 」は、事象 A が起きるかどうかに関わらず、事象 B が起こる確率です。

    P(BA)P(B|A) 」は、事象 A が起きた場合に、事象 B が起きる確率です。

    基本的には、事象 A が実際に起こったことやデータ、事象 B が求めたい情報や分類したいものになります。

    たとえば、ある土地では、雨が降る確率が「 P(rain)=0.1P(rain)=0.1」になりますね!

    ナイーブベイズとは

    「ナイーブベイズアルゴリズム」とは、ベイズの定理を元に与えられたデータから、最も確からしいものはどれかを検証するアルゴリズムです。

    わかりやすく、文書の分類で考えてみましょう。

    与えられた文書を、「経済・スポーツ・芸能」などのカテゴリに分けるとします。

    これら各カテゴリの文書に、あらかじめ、出現する単語の頻度を学習させておくのです。

    たとえば経済カテゴリなら、「金融・日経平均・ビジネス」などの単語が、出現しやすくなります。

    スポーツカテゴリなら、「野球・応援・監督」などの単語が、文書に出現しやすくなりますね。

    与えられた文書に出現する単語を解析し、このデータを元に、どのカテゴリの文書に最もふさわしいかを出力していくわけです。

    ナイーブベイズアルゴリズムには課題も

    ただし、ナイーブベイズアルゴリズムは、現実世界の問題へは応用しにくいです…。

    というのも、「それぞれのデータは独立である」という、仮定に基づいているため。

    しかし、比較的簡単なアルゴリズムで、計算リソースも少なく済むので、条件を満たすようなデータに対しては十分に使えます。

    迷惑メール分類

    では実際に、迷惑メールの分類を行います。

    今回学習させるデータは、kaggle の「sms-spam-collection-dataset.zip」。

    【 kaggle:学習データ】
    https://www.kaggle.com/uciml/sms-spam-collection-dataset

    以下にコードを載せます。

    1import random
    2import matplotlib.pyplot as plt
    3import numpy as np
    4import pandas as pd
    5from sklearn.model_selection import train_test_split
    6from sklearn.feature_extraction.text import CountVectorizer
    7from sklearn.naive_bayes import BernoulliNB
    8
    9# CSV読み込み・データ整理
    10df = pd.read_csv('/spam.csv', encoding='latin-1')
    11df.drop(['Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4'], axis=1, inplace=True)
    12df.rename(columns={"v1":"label", "v2":"text"}, inplace=True)
    13
    14n = random.randint(0,5567)
    15cut_data = df.loc[n:n+4]
    16
    17df.drop([n,n+1,n+2,n+3,n+4], axis=0, inplace=True)
    18
    19# トレーニング・評価データ分割
    20X = pd.DataFrame(df['text'])
    21Y = pd.DataFrame(df['label'])
    22X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.7, test_size=0.3, random_state=1)
    23
    24# 単語の出現回数取得
    25vec_count = CountVectorizer(min_df=3)
    26vec_count.fit(X_train['text'])
    27
    28# トレーニング・評価データをベクトル化
    29X_train_vec = vec_count.transform(X_train['text'])
    30X_text_vec = vec_count.transform(X_test['text'])
    31
    32# ベルヌーイモデルを利用(2値分類)
    33model = BernoulliNB()
    34model.fit(X_train_vec, Y_train['label'])
    35
    36# 予測テキストデータ作成
    37check_data_text = np.array(cut_data["text"])
    38check_data_label = np.array(cut_data["label"])
    39df_data = pd.DataFrame(check_data_text, columns=['text'])
    40
    41# 予測テキストデータをベクトル化
    42input_vec = vec_count.transform(df_data['text'])
    43
    44# 予測結果の表示
    45print(model.predict(input_vec))
    46print(cut_data['label'])

    まずは与えられたデータで、「スパムメール」と「通常メール」に含まれる、単語の頻度を数えます。

    それを元に、単語のベクトル化を行います。

    単語の出現頻度に関するデータをベクトル化させることで、実際に学習をして、分類器を作成していくのです。

    作成した分類器に、あらかじめ分離しておいた、予測用のデータを渡します。

    結果は、「5/5」で正解となりました。

    パーセプトロン

    「パーセプトロン」とは、現在のディープラーニング分野の大元となるアルゴリズムです。

    このアルゴリズムでは、複数の入力に対し、重みをつけて学習させておいたバイアスを加算します。

    「0」か「1」を出力する、単層ニューラルネットワークです。

    式で表すと、以下のようになります。

    (出力)=b+x1w1+x1w1+x1w1+(出力)=b+x_1w_1+x_1w_1+x_1w_1+……

    それぞれの意味は、次の通り。

    1. b:バイアス
    2. x_n:入力
    3. w_n:x_nにかかる重み

    迷惑メール分類

    では、パーセプトロンを使って、迷惑メールの分類をしていきましょう!

    以下にコードを載せます。

    1# X_train_vecやY_trainはナイーブベイズで整えたデータを再利用
    2
    3from sklearn.linear_model import Perceptron as Pec
    4# パーセプトロン
    5model = Pec(eta0 = 0.1,random_state=1,shuffle=True)
    6model.fit(X_train_vec,Y_train['label'])
    7
    8# 予測結果の表示
    9print(model.predict(input_vec))
    10print(cut_data['label'])

    今回は、ナイーブベイズの時に整えたデータを、そのまま流用しました。

    上で説明した通り、ベクトル化した単語を入力として重みを学習し、分類器を作成します。

    こちらも、「5/5」で正解でした。

    ロジスティック回帰

    ロジスティック回帰は、一般化線形モデルのひとつです。

    基本的には、パーセプトロンと同じモデルを利用します。

    入力に対して、重みをつけバイアスを加えて、出力を決定するのです。

    具体的に、パーセプトロンとの違いは、次のとおり。

    1. パーセプトロン:「確率的勾配降下法」を利用
    2. ロジスティック回帰:「座標降下法」や「準ニュートン法」を利用

    迷惑メール分類

    では、ロジスティック回帰を使って、迷惑メール分類をしていきましょう!

    1# X_train_vecやY_trainはナイーブベイズで整えたデータを再利用
    2from sklearn.linear_model import LogisticRegression as LogR
    3model = LogR(random_state=1)
    4model.fit(X_train_vec,Y_train['label'])
    5
    6# 予測結果の表示
    7print(model.predict(input_vec))
    8print(cut_data['label'])

    データは、上2つと同じものを使っています。

    やってることもほとんど同じで、

    1. 単語をベクトル化
    2. それを学習させて重みを決定
    3. 予測テスト

    という流れです。

    こちらは正解率が「4/5」で、1問だけスパムメールを、通常のメールと間違えていました…。

    さいごに

    今回は、「ナイーブベイズ」「パーセプトロン」「ロジスティック回帰」という3つの単純なアルゴリズムで、迷惑メールの分類(文書分類)を行いました!

    どれも簡単で扱いやすく、理解もしやすいアルゴリズムだったかと思います。

    精度も良かったので、2種類の文書分類程度なら、このぐらい簡単なものを使ってもいいかもしれませんね。

    ぜひ、皆さんもお試しあれ!

    こちらの記事もオススメ!

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background