はじめに
テキスト分類によく使われるアルゴリズムである、ナイーブベイズを簡単にまとめてみました。ナイーブベイズ は文章の分類やスパムメール判定など、自然言語の分類でよく利用されます。
概要
ナイーブベイズは確率に基づいて予測を行うアルゴリズムの一つです。データがあるラベルである確率を計算し、確率が最大になるラベルに分類する方法です。
今回は、ナイーブベイズを用いて、架空のニュース記事タイトルを「映画」と「宇宙」という2つのカテゴリに分類してみましょう。
- 学習データ
学習データ | カテゴリ |
---|---|
あの名作映画が蘇る | 映画 |
ド派手アクション映画が封切り | 映画 |
蘇った名作に世界が感動 | 映画 |
砂嵐が火星を襲う | 宇宙 |
火星探索ついに再会 | 宇宙 |
VRでみる火星の砂嵐に感動 | 宇宙 |
- 検証データ
検証データ | カテゴリ |
---|---|
復活した名作アクションに感動 | ? |
学習データをもとに、未知データのカテゴリが映画である確率と宇宙である確率を計算する方法を考えていきます。
まず、検証データの「感動」という単語に着目してみます。「感動」という単語が出現する確率を素ぞれのカテゴリで見ると以下の表のようになります。
カテゴリ | 「感動」という単語が出現する条件付き確立 |
---|---|
映画 | 2/3 |
宇宙 | 1/3 |
表の条件付き確立を見ると、「感動」という単語が現れる確率は、宇宙よりも映画の方が高いことがわかります。
ナイーブベイズでは、文章中の出現確率だけでなく、単語ごとの条件付き確立も用いて、文章内の単語の情報を使い求める確率の精度を上げています。
アルゴリズム
前処理
前処理では、文章をBag of Wardsに変換し、特徴量からなるベクトルとラベルの組みにします。まず、与えられた学習データの文章について名詞のみを抜き出します。学習データから名詞のみを抜き出した結果を下の表に示します。
学習データ | カテゴリ |
---|---|
"名作","映画" | 映画 |
"派手","アクション","映画" | 映画 |
"名作","世界","感動" | 映画 |
"砂嵐","火星" | 宇宙 |
"火星","探索","再会" | 宇宙 |
"VR","火星","砂嵐","感動" | 宇宙 |
次に、学習データとカテゴリをデータとして扱いやすいように、学習データは、全体の単語集合から学習データに単語が含まれている時に1とし、学習データに含まれていない時に0とします。また、カテゴリは映画を1、宇宙を0とします。
上記を以下の表に示します。
学習データ | 名作 | 映画 | 派手 | アクション | 世界 | 感動 | 砂嵐 | 火星 | 探査 | 再会 | VR | カテゴリ |
---|---|---|---|---|---|---|---|---|---|---|---|---|
あの名作が蘇る | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
ド派手アクション映画が封切り | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
蘇った名作に世界が感動 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
砂嵐が火星を襲う | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
火星探査ついに再会 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
VRで見る火星の砂嵐に感動 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
同様に、検証データの文章の方もBag of Wardsで表現していきます。ここで、検証データには「復活」という単語が含まれています。本来であれば、学習データのBag of Wardsにも復活を含ませ、ラベルを0とするのですが、今回は簡単のため無視します。
検証データ | 名作 | 映画 | 派手 | アクション | 世界 | 感動 | 砂嵐 | 火星 | 探査 | 再会 | VR | カテゴリ |
---|---|---|---|---|---|---|---|---|---|---|---|---|
復活した名作アクションに感動 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | ? |
確率の計算
ここからが本番です。ナイーブベイズでは、学習データを用いて、それぞれのラベルごとに単語が現れる確立を学習していきます。分類時にはラベルごとに確立を求め、確率が高い方を分類結果とします。(これは、ラベルの数が増えても変わりません。)
ナイーブベイズ では、それぞれのラベルが出現する確率と、各ラベルでのそれぞれの単語が出現する条件付き確立を求めます。
※本来であればスムージングと言って、確立が0となるものを0.01を割り振ると言った処理を行いますが、この説明は簡単のため省かせていただきます。
この二つの確立を掛け合わせ比較することで分類を行います。また、ナイーブベイズは、それぞれの単語が独立であるという単純な仮定をおきます。
Pythonで実行
これまでの処理を、実際にコードで見てみましょう。
今回は、scikit-learnを使用します。
from sklearn.naive_bayes import MultinomailNB
X_train = [[1,1,0,0,0,0,0,0,0,0,0],
[0,1,1,1,0,0,0,0,0,0,0],
[1,0,0,0,1,1,0,0,0,0,0],
[0,0,0,0,0,0,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0],
[0,0,0,0,0,1,0,1,1,0,1]]
y_train = [1,1,1,0,0,0]
model = MultinomialNB()
#モデルの学習
model.fit(X_train, y_train)
#モデルの評価
model.predict([[1,0,0,1,0,1,0,0,0,0,0]])
実行結果を以下に示します。
array([1])
上記の実行結果のように、「映画」と判定されています。
最後に
今回は、コードの説明というよりは、ナイーブベイズを簡単に理解することを目的としました。
サンプルコードからわかるように、とても簡単なので、皆さん是非試してみてください。