クラスの再編成

この章では単純ベイズ法の学習のいろいろな実装を比較するのに便利になるように, 単純ベイズ:入門編NaiveBayes1 クラスを再編成します. NaiveBayes1 クラスには,コンストラクタの他には,学習を行う fit() メソッドと,予測を行う predict() メソッドがありました. predict() メソッドはどの実装でも共通にする予定ですが,学習メソッドのいろいろな実装をこれから試します. そこで,予測メソッドなど共通部分含む抽象クラスを新たに作成し,各クラスで異なる学習メソッドは,その抽象クラスを継承した下位クラスに実装することにします.

二値単純ベイズの抽象クラス

二値単純ベイズの共通部分を含む抽象クラス BaseBinaryNaiveBayes を作成します. 抽象クラスを作るための abc モジュールを利用して,次のようにクラスを定義しておきます 1

from abc import ABCMeta, abstractmethod

class BaseBinaryNaiveBayes(object, metaclass=ABCMeta):
"""
Abstract Class for Naive Bayes whose classes and features are binary.
"""

この抽象クラスでは実装しない fit() メソッドは,抽象メソッドとして次のように定義しておきます. このように定義しておくと,この抽象クラスの下位クラスで fit() メソッドが定義されていないときには例外が発生するので,定義し忘れたことが分かるようになります.

@abstractmethod
def fit(self, X, y):
    """
    Abstract method for fitting model
    """
    pass

最後に,今後の単純ベイズの実装で共通して使うコンストラクタと predict() メソッドを,今までの NaiveBayes1 からコピーしておきます. 以上で,二値単純ベイズの抽象クラスは完成です.

注釈

1

抽象クラスの定義の記述は Python2 では異なっています. Python3 と 2 の両方で動作するようにするには six などのモジュールが必要になります.

新しい NaiveBayes1 クラス

新しい NaiveBayes1 クラスを,上記の BaseBinaryNaiveBayes の下位クラスとして次のように定義します.

class NaiveBayes1(BaseBinaryNaiveBayes):
    """
    Naive Bayes class (1)
    """

次に,このクラスのコンストラクタを作成します. ここでは単に上位クラスのコンストラクタを呼び出すように定義しておきます.

def __init__(self):
    super(NaiveBayes1, self).__init__()

最後にこのクラスに固有の fit() メソッドを,以前の NaiveBayes1 クラスからコピーしておきます. 以上で, NaiveBayes1 クラスの再編成が完了しました.

実行

新しい NaiveBayes1 クラスの実行可能な状態のファイルは,以下より取得できます.

新 NaiveBayes1 クラス:nbayes1b.py

実行ファイルも, NaiveBayes1 クラスを読み込むファイルを変えるだけです.

新 NaiveBayes1 実行スクリプト:run_nbayes1b.py

データファイル vote_filled.tsv を作業ディレクトリに置いて実行すると,以前の run_nbayes1.py と同じ結果が得られます.