ナイーブベイズ( Naive Bayes)とは?確率に基づいて分類する手法!!

スポンサーリンク
ナイーブベイズ( Naive Bayes)とは基礎知識
この記事を読んで分かること
  • ナイーブベイズ( Naive Bayes)とは何か
  • 確率に基づいて予測を行う計算方法
  • pythonでのナイーブベイズの実装

ナイーブベイズ( Naive Bayes)とは?

ナイーブベイズ確率に基づいて予測を行うモデルで、ベイズの定理の考え方をもとにしたアルゴリズムとなっています。

ナイーブベイズは分類に問題にも利用することができます。

スパムメールのフィルタなど、自然言語の分類問題に利用されることが多くなっています。

 

例として、野球とサッカーの新聞記事の見出しを分類する例を以下に示します。

 
項番学習データ

カテゴリ

文章1順調な調整 紅白戦で3回1安打無失点野球
文章28回無失点の好投でトップタイの3勝目野球
文章3シート打撃で一発!攻守で高いレベル見せる野球
文章4「人生で最も美しいゴール」自賛弾でVへ前進サッカー
文章5前半だけで4失点…ディフェンス崩壊で大量リード許すサッカー
文章6ハットトリック達成、攻守切り替え素早くカウンターさえるサッカー
 
検証データ

カテゴリ

5回1安打無失点 完封リレーで接戦を制し白星スタート野球

学習データ6件から検証データのカテゴリを推定する方法は、

学習データには野球のデータが3件、サッカーのデータ3件があり、単純に考えると検証データのカテゴリが「野球」である確率は50%(3/6)です。

この方法だと、検証データの内容によらずカテゴリに分類される確率は変わらないので、ナイーブベイズでは文章中に含まれる単語をもとにカテゴリの推定をします。

検証データに含まれる「失点」という単語に着目すると、野球のデータの中に「失点」という単語が含まれる確率は66%(2/3)で、サッカーのデータの中に「失点」という単語が含まれる確率は33%(1/3)です。

項番学習データ

カテゴリ

文章1順調な調整 紅白戦で3回1安打無失点野球
文章28回無失点の好投でトップタイの3勝目野球
文章3シート打撃で一発!攻守で高いレベル見せる野球
文章4「人生で最も美しいゴール」自賛弾でVへ前進サッカー
文章5前半だけで4失点…ディフェンス崩壊で大量リード許すサッカー
文章6ハットトリック達成、攻守切り替え素早くカウンターさえるサッカー

「失点」という単語だけでナイーブベイズを使った場合、検証データの分類は野球であると判断されます。

ロボくん
ロボくん

「失点」という単語が使われていたら、野球カテゴリの確率が66%だから野球に分類されるよ。

上記の例では「失点」という単語のみで判断していましたが、実際は様々な単語を使って推定します。

ナイーブベイズでは文章の出現割合と文章に使われている単語ごとの出現確率を用いて分類の精度を上げています。

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

ナイーブベイズで自然言語の分類を行う場合は3ステップの処理が必要となります。

  1. データ形式をBoW(Bag of Words)に変換する
  2. 単語ごとの出現確率を計算する
  3. 検証データを分類する

データ形式をBoW(Bag of Words)に変換する

BoW(Bag of Words)とは文章中の単語の出現回数を数えて整理したものです。

学習データをBoWの一覧表(一部省略)のイメージを作ってみます。

単語文章1文章2文章3文章4文章5文章6
順調100000
調整100000
紅白戦100000
110000
安打100000
失点110010
好投010000
トップタイ010000
打撃001000
一発001000
攻守001001
ゴール000100
前進000100
前半000010
ディフェンス000010
カウンター000001

この例の場合、文章1(順調な調整 紅白戦で3回1安打無失点)をBoWの形で変換すると、[1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0]となります。

この形式にすることで自然言語をプログラムで解析できるようになりました。

単語ごとの出現確率を計算する

ナイーブベイズの確率計算ではまず、単語ごとの出現確率を求めます。

単語野球の確率
(文章1,2,3)
サッカーの確率
(文章4,5,6)
順調1/30.01
調整1/30.01
紅白戦1/30.01
2/30.01
安打1/30.01
失点2/31/3
好投1/30.01
トップタイ1/30.01
打撃1/30.01
一発1/30.01
攻守1/31/3
ゴール0.011/3
前進0.011/3
前半0.011/3
ディフェンス0.011/3
カウンター0.011/3

テストデータに出てこなかった単語でも、スムージングという処理をして確率は0.01のような小さな値を入れておきます。

スムージングは、学習データ数が少なくて0になってしまった可能性を考慮して、単語が出現しなかった箇所にも低確率を割り振ります。

検証データを分類する

出現確率が求められたら、分類したい文章(検証用データ)に出現している単語から結果を判断します。

ナイーブベイズを使った確率は、

  $$確率 = カテゴリの出現確率 × 各単語ごとの条件付き確率の積$$

で算出されます。

単語野球の確率
(文章1,2,3)
サッカーの確率
(文章4,5,6)
検証データのBoW
順調1/30.010
調整1/30.010
紅白戦1/30.010
2/30.011
安打1/30.011
失点2/31/31
好投1/30.010
トップタイ1/30.010
打撃1/30.010
一発1/30.010
攻守1/31/30
ゴール0.011/30
前進0.011/30
前半0.011/30
ディフェンス0.011/30
カウンター0.011/30

検証データで試しに計算してみましょう。

野球に分類される時の確率を求める例です。

  $$野球カテゴリの出現確率 = \frac{野球カテゴリのデータ数}{学習データ数(野球カテゴリ)} = \frac{3}{6} $$

 

  $$単語(順調)の条件付き確率 = 1 – \frac{1}{3} = \frac{2}{3} $$

※検証データに含まれていないので、「順調」という単語がない時に野球カテゴリになる確率を求めています。

  $$単語(回)の条件付き確率 = \frac{2}{3} $$

  $$単語(ゴール)の条件付き確率 = 1-0.99 $$

上記のように各確率を求めて、全ての積を計算すれば野球カテゴリに分類される確率を求めることができます。

  $$確率(野球) =  \frac{3}{6} × \frac{2}{3} × \frac{2}{3} × ・・・ × 0.99 $$

 

ここで求めた確率(野球)と確率(サッカー)を比べ、高い確率の方に分類されます。

ロボくん
ロボくん

ナイーブベイズはシンプルなアルゴリズムだから、高速で計算できて大規模なデータにも有効な手法だよ。

ナイーブベイズをpythonで実装

ナイーブベイズを用いて学習した例をpythonで実装してみました。
機械学習のライブラリであるsklearnを用い、カーネル関数はデフォルトのRBF(Radial Basis Function)を使用します。

必要ライブラリのインポート

from sklearn.naive_bayes import MultinomialNB

データの生成

#データ生成
X_train = [[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]]
y_train = [1, 1, 1, 0, 0, 0]#1:野球、0:サッカー

サポートベクターマシンのモデルで学習する

#ナイーブベイズで分類する
model = MultinomialNB()
model.fit(X_train, y_train)#学習
model.predict([[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])#推定結果

結果はarray([1])となり、野球カテゴリに分類されました。

まとめ

ナイーブベイズとは何かをまとめると以下の3つの特徴を持つモデルです。

  • 確率に基づいて予測を行うモデル
  • 自然言語の分類問題に用いられるモデル
  • 高速で処理でき、大規模なデータにも有効

コメント

タイトルとURLをコピーしました