Scikit-learnでガウシアンナイーブベイズを実装!GaussianNBの基本とコード例

Python

はじめに:この記事でわかること

この記事では、機械学習の分類アルゴリズムの一つである「ガウシアンナイーブベイズ(Gaussian Naive Bayes)」の基本を解説します。

Pythonの定番ライブラリであるScikit-learnを使い、実際にGaussianNBクラスで分類モデルを構築する手順を、具体的なコード付きでステップ・バイ・ステップで紹介します。

この記事を読み終える頃には、ガウシアンナイーブベイズがどのようなアルゴリズムで、どのように実装できるのかを理解し、ご自身のデータで試せるようになります。

Gaussian Naive Bayes(ガウシアンナイーブベイズ)とは?

ガウシアンナイーブベイズは、ベイズの定理を応用したシンプルかつ高速な分類アルゴリズムです。特に、データの特徴量が連続的な値(例:身長、温度、センサーの値など)である場合に用いられます。

ナイーブベイズ分類器の基本

ナイーブベイズ分類器は、あるデータがどのクラスに属するかを確率的に判断するアルゴリズムです。その計算の根幹には「ベイズの定理」が使われています。

このアルゴリズムが「ナイーブ(Naive, 単純)」と呼ばれるのには理由があります。それは、**「すべての特徴量は互いに独立している」**という、非常に大胆な仮定を置いているからです。

現実のデータでは特徴量同士が関連していることも多いですが、この仮定のおかげで計算が非常にシンプルになり、高速に動作するというメリットが生まれます。

「ガウシアン」が意味するもの

「ガウシアン」とは、統計学でおなじみの**正規分布(ガウス分布)**のことを指します。

ガウシアンナイーブベイズは、扱うデータの特徴量がこの正規分布に従っていると仮定します。これにより、身長や体重、センサーの測定値といった連続的な値をうまく扱うことができるのです。

Scikit-learnを使ったGaussianNBの実装手順

ここからは、実際にScikit-learnを使ってGaussianNBを実装する手順を見ていきましょう。今回は、機械学習の練習でよく使われるiris(アヤメ)データセットを使用します。

1. 必要なライブラリのインポート

まず、GaussianNBモデルやデータセット、評価用の関数など、必要なものをまとめてインポートします。

# scikit-learnから必要なモジュールをインポート
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
from sklearn.metrics import accuracy_score

# このバージョンで動作確認しています
# scikit-learn: 1.x

2. データの準備

次に、モデルの学習に使うデータを準備します。scikit-learnに組み込まれているirisデータセットをロードして、特徴量Xと目的変数yに分けます。

# irisデータセットをロード
iris = datasets.load_iris()
X = iris.data
y = iris.target

3. 学習データとテストデータへの分割

モデルの性能を正しく評価するため、データを「学習用」と「テスト用」に分割します。これは、モデルが未知のデータに対しても正しく分類できるか(汎化性能)を確認するために非常に重要なステップです。

train_test_split関数を使えば、簡単にデータを分割できます。

Python

# データを学習用とテスト用に分割 (テストデータの割合を30%に設定)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
Code language: PHP (php)

4. モデルの初期化と学習

いよいよモデルの登場です。GaussianNBクラスのインスタンスを作成し、fitメソッドに学習用のデータを渡すだけで、学習が完了します。

# GaussianNBモデルのインスタンスを作成
gnb = GaussianNB()

# 学習用データを使ってモデルを学習させる
gnb.fit(X_train, y_train)

5. 予測の実行

学習が完了したモデルを使って、テストデータがどのクラスに分類されるかを予測します。予測にはpredictメソッドを使います。

# テストデータを使って予測を実行
y_pred = gnb.predict(X_test)

6. モデルの評価

最後に、モデルの予測(y_pred)が実際の答え(y_test)とどれくらい一致しているかを評価します。ここでは、正解率(Accuracy)を計算してみましょう。

# 正解率を計算して表示
accuracy = accuracy_score(y_test, y_pred)
print(f'モデルの正解率: {accuracy:.4f}')
# 出力例: モデルの正解率: 0.9778

非常に高い正解率でアヤメの種類を分類できていることがわかります。

実装コードの全体像

これまでの手順を一つにまとめた、コピー&ペーストで動作するコード全体を以下に示します。

# 1. 必要なライブラリのインポート
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn import datasets
from sklearn.metrics import accuracy_score

# 2. データの準備
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 3. 学習データとテストデータへの分割
# random_stateを固定することで、毎回同じように分割される
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 4. モデルの初期化と学習
# モデルのインスタンスを作成
gnb = GaussianNB()
# モデルを学習させる
gnb.fit(X_train, y_train)

# 5. 予測の実行
y_pred = gnb.predict(X_test)

# 6. モデルの評価
accuracy = accuracy_score(y_test, y_pred)

# 結果の表示
print(f'予測されたクラス: {y_pred}')
print(f'実際のクラス:   {y_test}')
print(f'モデルの正解率: {accuracy:.4f}')

GaussianNBのメリットとデメリット

GaussianNBはシンプルで強力ですが、万能ではありません。その長所と短所を理解して、適切な場面で使いましょう。

メリット:どんな時に使うべきか

  • 計算が非常に高速:アルゴリズムが単純なため、大規模なデータセットに対しても高速に学習・予測ができます。
  • 少ないデータでも機能しやすい:複雑なモデルに比べて、少ない学習データでも安定した性能を発揮する傾向があります。
  • 実装がシンプルScikit-learnを使えば数行のコードで実装でき、ハイパーパラメータの調整もほとんど不要です。

デメリット:注意すべき点

  • 特徴量の独立性の仮定:現実のデータでは特徴量同士が強く相関している場合も多く、この仮定がモデルの精度を低下させる原因になることがあります。
  • 複雑な関係性を捉えられない:特徴量間の複雑な相互作用をモデルに反映することはできません。

まとめ

今回は、Scikit-learnGaussianNBを使って、ガウシアンナイーブベイズ分類器を実装する方法を解説しました。

  • GaussianNBは、連続値データを扱うシンプルで高速な分類アルゴリズム
  • 各特徴量が互いに独立で、正規分布に従うと仮定している
  • Scikit-learnを使えば、データの準備から学習、予測、評価までを簡単に行える

ナイーブベイズはそのシンプルさから、テキスト分類(スパムメール判定など)や、最初のベースラインモデルとして非常に有用です。ぜひ、この機会に使い方をマスターして、あなたのデータ分析に役立ててみてください。

コメント

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