ナイーブ ベイズ アルゴリズムはシンプルで効率的であり、分類問題を扱う際に最初に検討すべき方法の 1 つです。 このチュートリアルでは、Naive Bayes アルゴリズムの原理と、Python バージョンの段階的な実装を学習します。 更新: ナイーブベイズを使用するためのヒントに関する私のフォローアップ記事をご覧ください: より優れたナイーブベイズ: ナイーブベイズアルゴリズムを最大限に活用するための 12 のヒント ナイーブベイズ分類器、一部の著作権は Matt Buck が保有しています ナイーブベイズについて ナイーブ ベイズ アルゴリズムは、各属性が特定のクラスに属する確率を使用して予測を行う直感的な方法です。この教師あり学習アプローチを使用して、予測モデリングの問題に対して確率モデリングを実行できます。 クラスが与えられた場合、ナイーブ ベイズでは、各属性がこのクラスに属する確率は他のすべての属性から独立していると想定され、確率の計算が簡素化されます。この強力な仮定により、高速かつ効率的な方法が実現します。 属性値が与えられた場合に、それが特定のクラスに属する確率を条件付き確率と呼びます。特定のクラス値に対して、各属性の条件付き確率を掛け合わせると、データ サンプルが特定のクラスに属する確率が得られます。 これは、サンプルが各クラスに属する確率を計算し、最も高い確率を持つクラスを選択することで実行できます。 通常、比率を使用して説明および計算するのが簡単なため、Naive Bayes を説明するためにカテゴリ データを使用します。私たちの目的にとって有用なアルゴリズムは、数値属性をサポートし、各数値属性が正規分布(ベル曲線上に分布)に従うと仮定する必要があります。これはもう 1 つの強力な仮定ですが、それでも堅牢な結果が得られます。 糖尿病の発症を予測する この記事で使用されているテスト問題は、「ピマ・インディアン糖尿病問題」です。 この号には、ピマ・インディアンの患者768人に対する医学的観察の詳細が掲載されており、患者の年齢、妊娠、血液検査の回数など、行われた瞬間的な測定値を記した記録がある。すべての患者は 21 歳以上の女性であり、すべての属性は数値であり、属性の単位は異なります。 各レコードは、測定時点から 5 年以内に患者が糖尿病と診断されたかどうかを示すクラスに属します。はいの場合は 1、そうでない場合は 0 です。 この標準データセットは機械学習の文献で何度も研究されており、予測精度は 70% ~ 76% と良好です。 以下は、使用するデータの概要を示す pima-indians.data.csv ファイルのサンプルです。 注意: ファイルをダウンロードし、.csv 拡張子で保存します (例: pima-indians-diabetes.data.csv)。ファイル内のすべてのプロパティの説明を表示します。
ナイーブベイズアルゴリズムのチュートリアル チュートリアルは次の手順に分かれています。 1. データを処理する: CSV ファイルからデータを読み込み、トレーニング セットとテスト セットに分割します。 2. データの特徴を抽出する: 確率を計算して予測を行えるように、トレーニング データ セットの属性の特徴を抽出します。 3. 単一の予測: データセットの特徴を使用して単一の予測を生成します。 4. 複数の予測: 指定されたテスト データセットと、抽出された特徴を含むトレーニング データセットに基づいて予測を生成します。 5. 評価精度: テストデータセットの予測精度を予測の正確さとして評価します。 6. 結合されたコード: すべてのコードを使用して、Naive Bayes アルゴリズムの完全なスタンドアロン実装を提示します。 1. データ処理 まずデータファイルをロードします。 CSV 形式のデータにはヘッダー行と引用符がありません。 csv モジュールの open 関数を使用してファイルを開き、 reader 関数を使用して行データを読み取ることができます。 また、文字列として読み込まれた属性を、使用できる数値に変換する必要があります。以下は、ピマ族のデータセットをロードするために使用される loadCsv() 関数です。
この関数をテストするには、Pima Indians データセットをロードし、データ サンプルの数を出力します。
テストを実行すると、次の結果が表示されます。
次に、データを Naive Bayes 予測用のトレーニング データセットとモデルの精度を評価するためのテスト データセットに分割します。データセットを、67% を含むトレーニング セットと 33% を含むテスト セットにランダムに分割する必要があります (これは、このデータセットでアルゴリズムをテストする場合の通常の比率です)。 以下は、指定された分割比率でデータセットを 2 つの部分に分割する splitDataset() 関数です。
テスト用に 5 つのサンプルを含むデータ セットを定義できます。まず、トレーニング データ セットとテスト データ セットに分割し、各データ サンプルが最終的にどのデータ セットに分類されるかを確認するために印刷します。
テストを実行すると、次の結果が表示されます。
データ特徴の抽出 Naive Bayes モデルは、トレーニング データセット内のデータの機能を組み込み、このデータ機能を使用して予測を行います。 収集されたトレーニング データの特徴には、各クラスに関する各属性の平均と標準偏差が含まれます。たとえば、クラスが 2 つあり、数値属性が 7 つある場合、属性 (7) とクラス (2) の各組み合わせの平均と標準偏差、つまり 14 個の属性機能が必要になります。 これらの特徴は、特定の属性が各クラスに属する確率を計算および予測するときに使用されます。 データ特徴の取得を次のサブタスクに分割します。
データをカテゴリ別に分ける まず、トレーニング データ セット内のサンプルがカテゴリに分割され、各クラスの統計が計算されます。カテゴリからそのカテゴリに属する例のリストへのマッピングを作成し、データセット全体の例を対応するリストに分類できます。 次の SeparateByClass() 関数はこのタスクを実行できます。
この関数は、サンプル内の最後の属性 (-1) がカテゴリ値であると想定し、カテゴリ値からデータ サンプルのリストへのマッピングを返すことがわかります。 次のようにサンプルデータを使用してこれをテストできます。
テストを実行すると、次の結果が表示されます。
平均を計算する 各クラスの各属性の平均を計算する必要があります。平均はデータの中間点または中心傾向であり、確率を計算するときにガウス分布の中央値として使用されます。 また、各クラス内の各属性の標準偏差を計算する必要があります。標準偏差は、データ分布の偏差を表します。確率を計算するときは、ガウス分布の各属性の予想される分散を特徴付けるために使用します。 標準偏差は分散の平方根です。分散は、各属性値の平均からの偏差の二乗の平均です。 N-1 メソッドを使用することに注意してください。つまり、分散を計算するときに、属性値の数が 1 減少します。
1 から 5 までの 5 つの数字の平均を計算して関数をテストします。
テストを実行すると、次の結果が表示されます。
データセットから特徴を抽出する これでデータセットから特徴を抽出できるようになりました。特定のクラスに対応するサンプルのリストに対して、各属性の平均と標準偏差を計算できます。 zip 関数は、データ サンプルを属性に応じてリストにグループ化し、各属性の平均と標準偏差を計算します。
最初のデータ属性と 2 番目のデータ属性の平均と標準偏差に大きな差があることを示すテスト データを使用して、この summary() 関数をテストできます。
テストを実行すると、次の結果が表示されます。
カテゴリ別に属性特徴を抽出する コードをマージします。まずトレーニング データセットをカテゴリに分割し、次に各属性の概要を計算します。
小さなテスト データセットを使用して、summaryByClass() 関数をテストします。
テストを実行すると、次の結果が表示されます。
予測する これで、トレーニング データから取得した要約を使用して予測を行うことができます。予測を行うには、特定のデータ サンプルについて、各クラスに属する確率を計算し、最も高い確率を持つクラスを予測結果として選択する必要があります。 この部分は次のタスクに分けることができます。
ガウス確率密度関数を計算する トレーニング データからの属性の既知の平均と標準偏差が与えられた場合、ガウス関数を使用して特定の属性値の確率を推定できます。 各属性の属性特性とクラス値が与えられると、特定のクラス値の条件下で特定の属性値の条件付き確率を取得できます。 ガウス確率密度関数については参考文献を参照してください。要約すると、既知の詳細 (属性値、平均、標準偏差) をガウス関数に組み込み、属性値が特定のクラスに属する尤度 (翻訳者注: 可能性) を取得する必要があります。 calculateProbability() 関数では、まず指数部分を計算し、次に方程式の幹を計算します。これにより、2 行にきれいに整理されます。
次のように簡単なデータを使用してテストします。
テストを実行すると、次の結果が表示されます。
クラスに属する確率を計算する 属性が特定のクラスに属する確率を計算できるため、データ サンプル内のすべての属性の確率を組み合わせて、最終的にデータ サンプル全体が特定のクラスに属する確率を取得できます。 確率を組み合わせるには乗算を使用します。以下の calculClassProbilities() 関数では、データ サンプルが与えられると、その属性の確率を乗算することで、それが属する各カテゴリの確率を取得できます。結果は、クラス値から確率へのマッピングです。
calculateClassProbabilities() 関数をテストします。
テストを実行すると、次の結果が表示されます。
単一の予測 データ サンプルが各クラスに属する確率を計算できるようになったので、最大確率値を見つけて、関連するクラスを返すことができます。 次の predict() 関数は上記のタスクを実行できます。
次のようにpredict()関数をテストします。
テストを実行すると、次の結果が得られます。
複数の予測 最後に、テスト データセット内の各データ サンプルに対して予測を行うことで、モデルの精度を評価できます。 getPredictions() 関数はこれを実行し、各テスト サンプルの予測のリストを返します。
getPredictions() 関数を次のようにテストします。
テストを実行すると、次の結果が表示されます。
計算精度 予測値をテストデータセット内のカテゴリ値と比較することで、分類精度として 0% ~ 100% の精度を計算できます。 getAccuracy() 関数はこの精度を計算できます。
次の簡単なコードを使用して、getAccuracy() 関数をテストできます。
テストを実行すると、次の結果が得られます。
コードをマージする 最後に、コードを連結する必要があります。 以下は、Python で Naive Bayes を段階的に実装するための完全なコードです。 例を実行すると、次の出力が得られます。
拡張機能の実装 このセクションでは、実装した Python コードを使用して応用研究を実施するためのチュートリアルの一部として使用できる拡張のアイデアを提供します。 この時点で、Python を使用して、Naive Bayes のガウス バージョンを段階的に完了しました。 アルゴリズムの実装をさらに拡張することができます。 クラスに属する確率を計算します。データ サンプルが各クラスに属する確率を比率として更新します。計算的には、サンプル データが特定のクラスに属する確率を、各クラスに属する確率の合計で割ったものです。たとえば、サンプルがクラス A に属する確率は 0.02、クラス B に属する確率は 0.001 です。この場合、サンプルがクラス A に属する可能性は (0.02/(0.02+0.001))*100 となり、約 95.23% になります。 対数確率:特定の属性値に対して、各クラスの条件付き確率は小さくなります。これらを掛け合わせると結果が小さくなるため、浮動小数点オーバーフロー(値が小さすぎて Python で表現できない)が発生する可能性があります。一般的な修正方法は、それらの確率の対数を組み合わせることです。この改善は研究され、実装することができます。 名詞属性:名詞属性をサポートするためにアルゴリズムの実装を改善します。これも非常によく似ており、各属性について収集する概要情報は、各クラスのクラス値の比率です。詳細については参考資料をご覧ください。 さまざまな密度関数 (ベルヌーイまたは多項式):ガウス ナイーブ ベイズを試しましたが、他の分布を試すこともできます。属性値の分布やクラス値との関係について異なる仮定を行う、多項式、ベルヌーイ、カーネル ナイーブ ベイズなどの異なる分布を実装します。 学習リソースと参考文献 このセクションでは、アルゴリズムの理論や仕組み、コード実装における実際的な問題など、Naive Bayes アルゴリズムについてさらに詳しく学習するためのリソースをいくつか提供します。 質問 糖尿病の問題を予測するためのさらなるリソース
コード このセクションには、一般的な機械学習ライブラリにおける Naive Bayes のオープンソース実装が含まれています。実用化のために独自のバージョンを実装することを検討している場合は、これらを確認してください。
本 応用機械学習に関する本をいくつか用意しておく必要があります。このセクションでは、人気の機械学習書籍から、Naive Bayes に関する章を紹介します。
|
<<: 人工知能の歴史 - チューリングテストからビッグデータまで
>>: 滴滴出行の米国研究責任者:インテリジェント運転は間違いなく未来を変えるだろうが、そのプロセスは単純ではない
AI が企業で大規模に導入されるにつれて、データセンターのワークロードのより大きな割合が AI によ...
Wiredウェブサイトは、FIFAの話題のVAR(ビデオ・アシスタント・レフェリー)の誕生過程を明...
AI スタートアップとして、OpenAI は歴史上最も急速に成長している企業の 1 つになりました。...
トランスフォーマーベースのビジュアルベースモデルは、セグメンテーションや検出などのさまざまな下流タス...
NeurIPS は世界で最も権威のある AI 学術会議の 1 つです。正式名称は Neural In...
自動運転技術の開発は常に議論の的となっています。自動運転の将来に関して、避けて通れない話題が1つあり...
[[342437]]著者は、正確なタイミング タスクと遅延キュー処理機能を備えた、高同時実行シナリ...
同氏は、テスラは人間の介入なしの完全自動運転の実現に近づいていると述べ、完全自動運転の実用性と自動車...
[[430758]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
[[429309]]分散機械学習が登場した理由は非常に単純です。一方では、トレーニングに利用できるデ...
1. 人工知能技術の定義人工知能技術は、複雑な生産労働において機械が人間に取って代わることを可能にす...
スタンフォード大学は3月3日、2021年人工知能指数レポートを発表しました。その中で、AI関連の学習...
関数呼び出しの紹介関数呼び出しとは何ですか? OpenAI Chat API公式ドキュメント: Ch...