1. 序章

分類は、教師あり機械学習問題の一種であり、観測値にクラスラベルを割り当てます。 このチュートリアルでは、高速で単純な分類方法である単純ベイズ分類器について学習します。

単純ベイズ分類器は、テキスト分類の問題でうまく機能することが特に知られています。広く採用されているユースケースには、スパムメールのフィルタリングや不正検出などがあります。 スパムフィルタリングのベースラインは、1990年代以降、単純ベイズアルゴリズムに関連付けられています。 別の例として、単純ベイズ分類器を利用して、未知の言語の文が動物について話しているかどうかを推測することができます

まず、この分類器の背後にある理論を調査し、それがどのように機能するかを理解します。 基本を理解した後、分類パフォーマンスを向上させる方法を探ります。

2. 単純ベイズ分類器

単純ベイズ分類器は、離散変数を入力し、各候補クラスの確率スコアを出力します。 予測されるクラスラベルは、確率スコアが最も高いクラスラベルです。

観測された属性に基づいてクラスラベルの確率を決定します。 各機能は独立していると見なされます。 クラスラベルの確率スコアは、ベイズの法則によって計算されます。

   

技術的には、ベイズの定理は条件付き確率を計算します。これは、観測された与えられた確率を表します。 この式では、は、使用可能なクラスのセットからのクラスラベルを表し、属性を持つ観測値を表します。

   

したがって、各観測値について、各クラスラベルの確率を計算します。

   

そうして初めて、確率スコアが最大の予測クラスを決定できます。 計算を簡素化するために、次のトリックを適用します。

  • 各属性は条件付きで独立しているため、個別の属性の条件付き確率を直接乗算できます。

  • 分母部分の確率は一定です。 したがって、異なるクラスのスコアを比較する場合は無視できます。

その結果、簡略化された式の出力を比較して、クラスラベルを決定できます。

   

確率が最大のクラスが予測クラスとして選択されます。つまり、観測はクラスに属すると言います。

クラス確率を計算するために使用する式の有効性は、条件付き独立の仮定に依存します。 2つの機能が同じ情報をエンコードする場合、単純ベイズ分類器はそれらの効果を二重にカウントし、間違った結論に達します。

もう1つの暗黙の仮定は、単純ベイズ分類器に付属しています。 アルゴリズムは機能を異なる方法で処理しません。 したがって、すべての機能が結果に同等の影響を及ぼします。この仮定は、過度に単純化される場合があります。

実際には、トレーニングセットから統計を抽出してモデルをトレーニングします。 計算で各特徴の頻度テーブルと尤度テーブルを利用すると、プロセスが容易になります。

観測から得られた頻度テーブルには、グループ化された可能な特徴値が含まれています。 確率テーブルには、さまざまなクラスの発生数ではなく、確率値が含まれています。 これらのテーブルを使用して、乗算と比較の操作によって観測値のクラスを決定します。

3. 単純ベイズ分類器のパフォーマンスを改善する方法

単純ベイズ分類器モデルのパフォーマンスは、データセットに応じて、ホールドアウト法または交差検定によって計算できます。 適切なメトリックを使用して、モデルのパフォーマンス評価できます。 このセクションでは、単純ベイズ分類器モデルのパフォーマンスを向上させるためのいくつかの方法を紹介します。

Naive Bayesは、非常にシンプルでありながらエレガントな分類アルゴリズムであることを覚えておく必要があります。 いくつかの一般的な方法は、単純ベイズの場合には機能しません。

たとえば、頭に浮かぶ最初の方法の1つは、モデルのハイパーパラメータを調整することです。 ただし、単純ベイズ分類器のパラメーターセットは非常に限られています。 実装によっては、クラスの数が唯一のパラメーターである場合がありますが、実際には、これを制御することはできません。 したがって、ハイパーパラメータの調整は、単純ベイズ分類器の精度を向上させるための有効な方法ではありません。 

すべての機械学習アルゴリズムと同様に、データの前処理や特徴選択などの簡単な手法をデータセットに適用することで、単純ベイズ分類器を強化できます。

データの主要な前処理ステップの1つは、欠落している値の処理です。 ほとんどのモデルでは、欠落データをどのように処理するかが主要な決定事項です。 ただし、単純ベイズ分類器は欠落値の影響を受けません。 アルゴリズムはモデル構築フェーズと予測フェーズの両方で入力フィーチャを個別に処理するため、これらは無視できます。

3.1. 関連する機能を削除する

すでに述べたように、相関性の高い機能はモデルで2回カウントされます。 ダブルカウントは、これらの機能の重要性を過大評価することにつながります。 そのため、単純ベイズ分類器のパフォーマンスが低下します。

相関する特徴を排除し、独立した特徴の仮定に従う必要があります。それらを検出して排除するために、相関行列を使用して特徴のペアを比較できます。

または、確率に基づいて特徴選択を実行することもできます。 さまざまな機能の組み合わせた確率を調査し、出力変数に対するそれらの予測力を理解しようとすることができます。

Pythonでは、Seabornライブラリを使用して、相関ヒートマップとクラスターマップをプロットできます。 データがデータフレームdfにあると仮定します。

import seaborn as sns

# calculate the correlations
correlations = df.corr()

# plot the heatmap 
sns.heatmap(correlations, xticklabels=correlations.columns, yticklabels=correlations.columns, annot=True)

# plot the clustermap 
sns.clustermap(correlations, xticklabels=correlations.columns, yticklabels=correlations.columns, annot=True)

ヒートマップは、特徴相関行列を視覚化するために使用する一般的なツールです。 clustermapは、相関関係を階層的にクラスター化されたヒートマップとして表示します。 したがって、クラスターマップを読み取って相関する機能を削除する方が簡単です。

3.2. ログ確率を使用する

非常に小さい数を乗算すると、さらに小さい数になります。 これらの非常に小さい数を正確に保存して比較することは困難です。 確率値を扱うときにこれらの問題に直面します。

非常に小さい数での作業を回避するために、確率値の対数を取ることにより、対数確率空間内で作業できます。

log関数は、確率値を[0、1]の範囲から(-、0]の範囲にマップします。 したがって、対数確率値は負になります。 実際の確率値が小さいほど、対数関数によって大きな負の値にマップされます。

乗算演算は対数空間での加算になることを覚えておく必要があります。 したがって、方程式全体の対数を取ると、次のようになります。

   

このマッピングアプローチが機能するのは、ナイーブベイズで分類するには、特定の確率ではなく、どのクラスが最大の確率を持っているかを知る必要があるためです。 対数をとっても、クラスラベルの確率スコアの順序は変わりません。 したがって、どのクラスが最も確率が高いかを判断できます。

3.3. ゼロ観測問題を排除する

トレーニングデータの度数分布がテストセットと異なる場合、単純ベイズ分類器のパフォーマンスは低下します。 分類子は、トレーニングセットに表示されていない値の影響を特に受けます。

モデルがトレーニングセットに存在しないカテゴリ機能に遭遇した場合、確率0がその新しいカテゴリに割り当てられます。 0に他の機能の確率を掛けると0になるため、これは非常に危険です。 

ログ確率を使用する場合でも、ゼロ観測問題が存在します。 、およびとの合計は、他の機能からのすべての有効な情報をキャンセルするためです。

これらのケースをチェックし、テストデータセットにゼロ頻度の問題がある場合はアクションを実行する必要があります。 最もよく知られているアプローチは、ラプラススムージングを使用することです。 この手法では、クラスの確率を計算するときに、分子と分母の両方にパラメーターを追加します。

たとえば、クラスの確率を計算するときに、平滑化パラメーター(1)を追加できます。

   

平滑化パラメーターは、確率値がゼロになることはないことを保証します。 平滑化手法を適用すると、そのようなゼロ頻度の発生に非常に小さな確率推定が割り当てられるため、単純ベイズ分類器を正規化します。 

3.4. 連続変数を処理する

カテゴリの特徴の確率値を計算する方法について説明しました。 しかし、 ある値に等しい出現回数を数えることは、実数では機能しません。 

実数をカテゴリとして表す簡単な方法は離散化です。間隔をカテゴリラベルにマッピングします。 このように、さまざまな範囲を表すラベルがあります。 次に、これらのラベルをカテゴリとして使用し、それに応じて確率を計算します。

一部のナイーブベイズの実装では、連続変数のガウス分布を想定しています。 したがって、単純ベイズ分類器は、観測値の平均と標準偏差から導出されたzテーブルからの確率を使用します。 この場合、数値変数の分布を確認し、それに応じて処理することをお勧めします。

連続特徴が正規分布に従わない場合は、カーネル密度推定などのノンパラメトリック手法を使用して、確率密度関数のより現実的な推定を行うことができます。 正規分布に限定する必要はありません。 代わりに、機能を適切に表現する必要があります。

3.5. テキストデータの処理

テキストデータセットには特別な前処理手順が必要です。ストップワードの削除、小文字への切り替えによる単語の正規化、ステミングまたはレンマ化の適用が一般的な手法です。

単語の埋め込みを作成すると、どの単語が一緒に使用されているか、同じコンテキストで発生しているかを理解するのに役立ちます。 word2vec または別の埋め込みアルゴリズムを利用すると、ベクトルを使用した単語の表現が向上します。

単語とドキュメントの処理に関するベストプラクティスに従うことで、機械学習モデルのパフォーマンスを向上させることができます。

3.6. モデルを再トレーニングする

一部の複雑な機械学習アルゴリズムでは、モデルを最初からトレーニングするのに非常に長い時間がかかります。 その結果、オンライントレーニングなど、モデルを更新するためのいくつかの代替方法が提案されています。 モデルの再トレーニングには、多くの場合、多くのリソースが必要です。

ただし、新しいデータが蓄積されると、モデルを再トレーニングする必要がある場合があります。

  • より大きなデータセットでトレーニングすると、モデルの一般化が向上します
  • 動的な環境でのデータの変化の傾向
  • 敵対的な環境で新しいパターンが形成される可能性があります

ほとんどのアルゴリズムとは異なり、ナイーブベイズモデルを再トレーニングするのは非常に高速です。 アルゴリズムは計算効率が高いです。次元の呪いの影響を受けることなく、高次元データを簡単に処理できます。 カーディナリティの高いカテゴリ機能も、計算の複雑さを増すことはありません。 その結果、単純ベイズ分類器は、代替の分類方法よりも高速に実行されます。

新しいデータが利用可能になったときにモデルを簡単に再構築できます。このようにして、データセットのシフトまたはドリフトを検出できます。 その結果、時間の経過とともにモデルのパフォーマンスが低下しないことを保証します。

3.7. 確率計算を並列化する

単純ベイズ分類モデルを構築する場合、並列化された計算を使用することでパフォーマンスを向上させることができます。

各属性の確率は、独立性を前提としているため、独立して計算できます。 そのため、各機能の確率を個別に計算します。 作業を分割すると、計算が高速化され、大規模なデータセットをより簡単に処理できるようになります。

3.8. 小さなデータセットでの使用

単純ベイズ分類器は、入力特徴間の関係の存在を否定します。 したがって、入力フィーチャと出力クラスラベルの間の関係のみをモデル化します。 仮説関数は、他のより複雑なアルゴリズムと比較して単純です。 その結果、トレーニングフェーズで必要なデータが少なくなります。

さらに、限られたデータで過剰適合する可能性が低くなります。モデルは機能間の相互作用を省略しているため、高分散モデルを作成することにはほど遠いです。 逆に、それは高いバイアスに苦しんでいます。

3.9. アンサンブルメソッド 

アンサンブル学習はパフォーマンスを向上させることが証明されました。 バギング、ブースティング、スタッキングの一般的なアンサンブル方法は、複数のモデルの結果を組み合わせて別の結果を生成します。 結果をアンサンブルする主なポイントは、分散を減らすことです。

ただし、単純ベイズ分類器の分散が小さいことはすでにわかっています。 したがって、他の分類子と混合しても効果はありません。 分類子の精度を上げるためにアンサンブルメソッドを試す必要はありません。

3.10. 生成モデルとしての使用法

生成モデルには、新しいデータインスタンスを生成する機能があります。 たとえば、生成的敵対的ネットワーク(GAN)は、合成データセットの生成に役立つことが証明されています。 データセットが与えられると、元の分布に従って新しいデータポイントが生成されます。

ナイーブベイズも生成モデルです。 データ分布の特性に基づいてクラスを学習します。 このモデルを使用して、同じ確率分布に従って新しい架空のデータセットを作成できます。

4. 結論

この記事では、非常に堅牢で実装が簡単な機械学習アルゴリズムである単純ベイズ分類器について調査しました。

私たちはそれを機能させる確率論的基礎から始めました。 次に、実際にアルゴリズムをトレーニングして使用する方法を詳しく調べました。 最後に、分類のパフォーマンスを向上させる方法を調査しました。

要約すると、分類器のパフォーマンスを改善するためのいくつかの一般的な方法は、単純ベイズ分類器では機能しないことがわかりました。 確率論的アプローチにはさまざまな課題があり、特別な処理が必要です。 それでも、この記事で説明した方法を適用して、考えられるパフォーマンスの問題を克服することができます。