Python(sklearn)によるナイーブベイズ分類器の実装を解説していく

スポンサーリンク

ナイーブベイズ分類器は、ベイズの定理に基づく確率的分類器です。

機械学習における分類問題とは,データが与えられたときに最適な仮説を選択することを意味します.

新しいデータポイントが与えられると、この新しいデータインスタンスがどのクラスラベルに属するかを分類しようとします。

過去のデータに関する事前知識は、新しいデータ点を分類するのに役立つ。

スポンサーリンク

ナイーブベイズの定理

#Loading the Dataset
from sklearn.datasets import load_breast_cancer
 
data_loaded = load_breast_cancer()
X = data_loaded.data
y = data_loaded.target

ベイズの定理は、事象Bが発生した場合に、事象Aが発生する確率を求めるものです。

曇りだとしたら、雨が降る確率は?雨が降る確率を仮説と呼び、曇りを表す事象を証拠と呼ぶことができる。

  • P(A|B) – これを事後確率と呼びます。
  • P(B|A) – A が与えられたときの B の条件付き確率です。
  • P(A) – 事象 A の事前確率と呼ばれる。
  • P(B) – 仮説に関係なく、事象Bが発生する確率です。

ベイズの定理についてある程度理解できたところで、ナイーブベイズがどのように機能するかを見てみましょう。

ナイーブベイズ分類法はどのように機能するのか?

ナイーブベイズ分類器がどのように動作するかを示すために、あるEメールがスパムかどうかを分類する問題を考えてみましょう。

全部で12通のメールがあるとします。

そのうち8通はSPAMでなく、残りの4通はSPAMであるとします。

  • SPAMでないメールの数 – 8通
  • スパムメールの数 – 4
  • 総メール数 – 12
  • したがって、P(NOT-SPAM) = 8/12 = 0.666 , P(SPAM) = 4/12 = 0.333 となる。

コーパス全体が、4つの単語[Friend, Offer, Money, Wonderful]のみで構成されているとします。

次のヒストグラムは、各カテゴリーの各単語の単語数を表している。

#Splitting the dataset into training and testing variables
from sklearn.model_selection import train_test_split
 
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2,random_state=20)
 
#keeping 80% as training data and 20% as testing data.

ここで、各単語の条件付き確率を計算します。

以下の式は、メールがNOT-SPAMであると仮定して、Friendという単語が出現する確率を計算します。

from sklearn.naive_bayes import GaussianNB
 
#Calling the Class
naive_bayes = GaussianNB()
 
#Fitting the data to the classifier
naive_bayes.fit(X_train , y_train)
 
#Predict on test data
y_predicted = naive_bayes.predict(X_test)

テキストコーパス全体に対する確率を計算します。

#Import metrics class from sklearn
from sklearn import metrics
 
metrics.accuracy_score(y_predicted , y_test)

これで事前確率と条件付き確率がすべて揃ったので、ベイズの定理を適用することができる。

例えば、ある電子メールを受け取ったとします。

“Offer Money “というメールを受け取ったとします。

事前に計算した確率に基づいて、それをSPAMかNOT-SPAMに分類する必要がある。

Bayes Theorem
Bayes Theorem

OfferとMoneyという単語を含むメールがSPAMである確率はNOT-SPAMである確率より大きい。

(0.0532 > 0.00424)です。

したがって、我々の分類器はこのメールをSPAMと分類することになります。

まとめると、ベイズの定理で示される事後確率を計算しただけです。

もし、他のカテゴリーに存在しない変数に遭遇した場合、その変数のワードカウントは0になり、予測をすることができません。

この問題は、「頻度ゼロ問題」とも呼ばれる。

これを避けるために、平滑化手法、すなわちラプラス推定を利用します。

平滑化手法は、条件付き確率に影響を与えません。

ナイーブベイズ分類器の種類

  • 多項式 – 離散的なカウントに対して使用される。上記の例で説明したものは、多項式タイプのナイーブベイズの例です。
  • ガウシアン – このタイプのナイーブベイズ分類器は、データが正規分布に従うと仮定します。
  • ベルヌーイ – このタイプの分類器は、特徴ベクトルが2値である場合に有効です。

Pythonでナイーブベイズを実装する

乳癌のWisconsinデータセットを利用します。

このデータセットについては、こちらで詳しく説明されています。

Scikit Learnでは、ナイーブベイズアルゴリズムを実装するために、GaussianNBクラスが用意されています。

Word Counts In Mail
Word Counts In our Example

このデータセットには30個の特徴があり、それを使って予測を行う必要があります。

データセットには .data メソッドでアクセスすることができます。

データセットには特徴量と対象変数がある。

Calculating Conditional Probabilities
Calculating Conditional Probabilities

Gaussian Naive Bayes Classをインポートして、学習データをフィッティングします。

Conditional Probabilities Of Each Words
Conditional Probabilities of Each Words

GaussianNBクラスの.fit` メソッドは、入力引数として特徴量データ (X_train) と目的変数 (y_train) を必要とします。

では、我々のモデルがどの程度の精度であったかを精度メトリクスを使って調べてみましょう。

Probability Score Calculation
Probability Score Calculation

精度 = 0.956140350877193

約95.61%の精度が得られました。

このコードで自由に実験してください。

アルゴリズムを適用する前に、データに対して様々な変換を行うことができます。

まとめ

この記事では、ナイーブベイズ分類器について、いくつかの直感的な情報を得ることができました。

また、sklearnを使ってNaive Bayesを実装する方法についても紹介しました。

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