ベイジアン機械学習: 古典的なモデルとコード実装!

ベイジアン機械学習: 古典的なモデルとコード実装!

[[420350]]

ベイズの定理は確率モデルにおける最も有名な理論の 1 つであり、機械学習でも広く使用されています。ベイズ理論に基づく一般的な機械学習確率モデルには、ナイーブベイズとベイジアンネットワークがあります。この論文では、ベイズ理論の紹介に基づいて、ナイーブベイズ理論とベイズネットワーク理論を詳細に導き、対応するコード実装を示します。ナイーブベイズモデルについては、この論文では NumPy と sklearn の実装方法を示し、ベイズネットワークは pgmpy の助けを借りて実装します。

ベイズ理論入門

トーマス・ベイズが1763年に有名な論文「偶然の問題の解決について」を発表して以来、ベイズの公式を中核とするベイズ理論が発展してきました。ベイズ理論では、あらゆる未知の量はランダム変数とみなすことができ、その未知の量の記述は確率分布によって要約できるとされています。これがベイズ学派の最も基本的な考え方です。この確率分布がフィールドテストやサンプリングの前に決定される場合、それは事前分布と呼ばれることがあります。与えられたデータセットXから計算されたサンプルの尤度関数を組み合わせた後、ベイズの公式を適用して未知の量の事後確率分布を計算できます。古典的なベイズの公式は次のように表現されます。

上記の式の左側は事後分布であり、右側の分母は未知の量に関する情報を除外した周辺分布であるため、ベイズの式の同等の形式は次のように記述できます。

上記の式をまとめると、ベイズの式の本質は事前分布と尤度関数に基づく統計的推論であると言えます。事前分布の選択と事後分布の推論は、ベイズ統計分野における 2 つの中心的な問題です。現在、事前分布の選択には統一された基準がありません。事前分布の違いは事後計算の精度に大きな影響を与え、これはベイズ分野でも注目されている研究テーマの 1 つです。事後分布は、複雑な数学的形式と高次元の数値積分のため、推測が非常に困難でした。その後、コンピューター技術の発展に伴い、コンピューター ソフトウェアに基づく数値手法によってこれらの問題が解決され、ベイズ理論は再び活力を取り戻しました。

機械学習との組み合わせは、ベイズ理論の主な応用方向です。ナイーブベイズ理論はベイズ理論に基づいた確率分類モデルであり、ベイジアンネットワークはベイズ理論を確率グラフに適用した分類モデルです。

ナイーブベイズ

ナイーブベイズの原理と導出

ナイーブベイズは、ベイズの定理と特徴の条件付き独立性の仮定に基づいた分類アルゴリズムです。具体的には、与えられたトレーニング データに対して、ナイーブ ベイズはまず特徴条件付き独立性仮説に基づいて入力と出力の結合確率分布を学習し、次に新しいインスタンスに対してベイズの定理を使用して最大事後確率を計算します。ナイーブベイズは、入力と出力の結合確率分布を直接学習するのではなく、クラスの事前確率とクラスの条件付き確率を学習します。ナイーブベイズの確率計算式を図1に示します。

図1 ナイーブベイズの基本式

ナイーブベイズのナイーブの意味は、特徴の条件付き独立性仮定です。条件付き独立性仮定とは、分類に使われる特徴が、クラスが決定されるという条件の下では条件付きで独立していることを意味します。この仮定により、ナイーブベイズの学習が可能になります。入力特徴ベクトルが X、出力がクラスラベル付きランダム変数 Y、P(X,Y) が X と Y の結合確率分布、T が指定されたトレーニング データ セットであると仮定します。ナイーブベイズは、トレーニングデータセットに基づいて結合確率分布 P(X,Y) を学習します。具体的には、クラス事前確率分布とクラス条件付き確率分布を学習することで実現します。

ナイーブベイズ学習の手順は次のとおりです。まずクラスの事前確率分布を計算します。

ここで、Ck は k 番目のカテゴリを表し、yi は i 番目のサンプルのクラス ラベルを表します。クラスの事前確率分布は、最大尤度推定によって取得できます。

次に、クラスの条件付き確率分布を計算します。

パラメータの数が多すぎるため、P(X=x|Y=Ck)を直接推定することは不可能です。 しかし、ナイーブベイズの最も重要な仮定の 1 つは、条件付き独立仮定です。

条件付き独立性の仮定により、クラスの条件付き確率は最大尤度推定に基づいて計算できます。

クラスの事前確率分布とクラスの条件付き確率分布を計算した後、ベイズの式に基づいてクラスの事後確率を計算できます。

クラス条件計算式に代入すると、次のようになります。

上記の式に基づいて、単純ベイズ分類モデルを学習できます。新しいデータサンプルが与えられた場合、その最大事後確率を計算します。

これらのうち、分母はすべての に対して同じなので、上記の式はさらに次のように簡略化できます。

上記は、単純ベイズ分類モデルの簡単な導出プロセスです。

NumPy に基づく Naive Bayes 実装

このセクションでは、NumPy に基づく単純な単純ベイズ分類器を実装します。ナイーブベイズの条件付き独立性の仮定は単純化されているため、実装のアイデアも比較的単純です。ここでは実装のマインドマップは示しません。上記の導出によれば、鍵となるのは、最大尤度推定法を使用して、クラスの事前確率分布とクラスの条件付き確率分布を計算することです。

コード 1 に示すように、単純ベイズ モデルのトレーニング プロセスを直接定義します。

  1. nb_fit(X, y)を定義します。
  2. クラス = y[y.columns[ 0 ]].unique()
  3. クラスカウント = y[y.列[ 0 ]].値カウント()
  4. クラス_prior = クラス_count/len(y)
  5. 事前 = dict()
  6. X.columns の列の場合:
  7. クラス内のjの場合:
  8. p_x_y = X[(y==j).値][col].値の数()
  9. p_x_y.index内のiの場合:
  10. 事前[(列, i, j)] = p_x_y[i]/クラス数[j]
  11. クラスを返す、class_prior、prior

コード 1 では、データ入力と出力の両方が Pandas データ フレーム形式であるため、最初にラベル カテゴリの数をカウントし、最大尤度推定に基づいてクラスの事前分布を計算します。次に、データの特徴とカテゴリがループされ、クラスの条件付き確率が計算されます。

式(10)はNaive Bayesの核となる式です。次に、式(10)とnb_fit関数によって返されるクラス事前確率とクラス条件付き確率に基づいてNaive Bayesの予測関数を記述する必要があります。 Naive Bayes の予測関数はコード 2 に示されています。

  1. def 予測(X_test):
  2. 解像度 = []
  3. クラス内のcの場合:
  4. p_y = クラス_prior[c]
  5. p_x_y = 1
  6. X_test.items() 内の iについて:
  7. p_x_y *= 事前[タプル(リスト(i)+[c])]
  8. res.append(p_y*p_x_y)
  9. クラスを返す[np.argmax(res)]

Naive Bayes の予測関数はコード 2 で定義されています。テストサンプル X_test を入力として、結果リストを初期化し、現在のクラスの事前確率を取得し、テストサンプル辞書を走査し、最初にクラス条件付き確率の乗算を計算し、次に事前確率とクラス条件付き確率の積を計算します。最後に、式(21.10)に従ってargmaxをとり、最大事後確率が属するカテゴリを取得します。

最後に、データ サンプルを使用して作成した Naive Bayes コードをテストします。コード 3 に示すように、バイナリ分類サンプル データを手動で作成し、nb_fit を使用してトレーニングします。

  1. ### データセットを作成してトレーニングする
  2. # 特集X1
  3. x1 = [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 ]
  4. # 特集X2
  5. x2 = [ 'S''M''M''S''M''M '' L' 、 ' L' 、 ' M' 、 'M' 、 'L''M''M''L' ]
  6. # タグリスト
  7. y = [- 1 ,- 1 , 1 ,- 1 ,- 1 ,- 1 ,- 1 , 1 , 1 , 1 , 1 , 1 , 1 , - 1 ]
  8. # パンダデータフレームを作成する
  9. df = pd.DataFrame({ 'x1' :x1, 'x2' :x2, 'y' :y})
  10. # トレーニングの入力と出力を取得する
  11. x, y = df[[ 'x1' , 'x2' ]], df[[ 'y' ]]
  12. # ナイーブベイズモデルのトレーニング
  13. クラス、class_prior、prior_condition_prob = nb_fit(X, y)
  14. print(クラス、クラスの事前情報、事前条件確率)

図2 コード21-3の出力のスクリーンショット

コード 3 では、リストに基づいて Pandas データ フレーム形式のデータセットを構築し、トレーニング入力と出力を取得して、それらを Naive Bayes トレーニング関数に渡します。出力結果を図 21.2 に示します。データラベルには1/-1のバイナリ分類データセットが含まれており、クラスの事前確率分布は{1:0.6、-1:0.4}であり、各カテゴリの条件付き確率が図に示されていることがわかります。

最後に、テスト サンプルを作成し、以下に示すように nb_predict 関数に基づいてクラス予測を行います。

  1. ### ナイーブベイズモデル予測
  2. X_test = { 'x1' : 2'x2' : 'S' }
  3. print( 'テストデータの予測カテゴリは次のとおりです:' , nb_predict(X_test))

出力:

  1. テストデータの予測カテゴリは次のとおりです: - 1

最後に、モデルはテストサンプルを負のクラスとして予測します。

sklearn に基づく Naive Bayes 実装

sklearn は、Naive Bayes アルゴリズムの実装方法も提供します。sklearn は、さまざまな尤度関数分布に対する Naive Bayes アルゴリズムの実装方法を提供します。たとえば、ガウス単純ベイズ、ベルヌーイ単純ベイズ、多項式単純ベイズなどです。ガウス ナイーブ ベイズを例に挙げてみましょう。ガウス ナイーブ ベイズは、尤度関数が正規分布していると仮定するナイーブ ベイズ モデルです。ガウスナイーブベイズの尤度関数を以下に示します。

sklearn の Gaussian Naive Bayes の呼び出しインターフェースは sklearn.naive_bayes.GaussianNB です。アイリスデータセットを例にとると、コード 4 に示すように呼び出し例が示されます。

  1. ### sklearn ガウスナイーブベイズの例
  2. # 関連ライブラリをインポートする
  3. sklearn.datasetsからload_irisをインポートする
  4. sklearn.model_selection から train_test_splitをインポートします
  5. sklearn.naive_bayes から GaussianNBをインポートします
  6. sklearn.metricsからaccuracy_scoreをインポートする
  7. # データセットをインポート
  8. X, y = load_iris(return_X_y=True)
  9. # データセット分割
  10. X_train、X_test、y_train、y_test =
  11. train_test_split(X, y, テストサイズ= 0.5 、ランダム状態= 0 )
  12. # ガウスナイーブベイズインスタンスを作成する
  13. gnb = ガウスNB()
  14. # モデルを当てはめて予測する
  15. y_pred = gnb.fit(X_train, y_train).predict(X_test)
  16. print( "アイリスデータテストにおけるGaussianNBの精度:" , acceleration_score(y_test, y_pred))

出力:

  1. 虹彩データテストにおけるGaussianNBの精度: 0.94666666666666667

コード 4 では、まず sklearn に Naive Bayes 関連モジュールをインポートし、iris データセットをインポートして、それをトレーニングとテストに分割します。 次に、ガウス ナイーブ ベイズ モデル インスタンスが作成され、トレーニング セットに基づいて適合され、テスト セットで予測され、最終的な精度は 0.947 になります。

ベイジアンネットワーク

ベイジアンネットワークの原理と導出

ナイーブベイズの最大の特徴は、特徴量の条件付き独立性の仮定ですが、実際には、条件付き独立性の仮定は通常厳しすぎて、実際に保持するのが困難です。特徴間の相関関係は単純ベイズのパフォーマンスを制限するため、このセクションでは、条件付き独立性の仮定を緩和するベイズアルゴリズム、つまりベイジアン ネットワークを引き続き紹介します。

例から始めましょう。アバターの信憑性、ファンの数、動的更新の頻度に基づいて、Weibo アカウントが実際のアカウントであるかどうかを判断する必要があるとします。各フィーチャ属性間の関係を図 3 に示します。

図3 Weiboアカウントの属性関係

図3は有向非巡回グラフ(DAG)です。各ノードは特徴またはランダム変数を表し、特徴間の関係は矢印で表されます。たとえば、動的な更新頻度、ファンの数、アバターの信憑性はWeiboアカウントの信憑性に影響を与え、アバターの信憑性はファンの数に一定の影響を与えます。ただし、特徴間の関係性だけではベイズ分析には不十分です。さらに、ベイジアン ネットワークの各ノードには対応する確率テーブルがあります。アカウントが本物であるかどうか、アバターが本物であるかどうかの確率表が次のようになっていると仮定します。

図4 ベイジアンネットワーク確率表

FIG4 は、アバターとアカウントが本物かどうかを示す確率表です。最初の確率表は、アカウントが本物かどうかを示します。このノードには親ノードがないため、アカウントが本物かどうかの確率を示す事前確率で直接表すことができます。 2 番目の確率表は、アバターの信頼性に対するアカウントの信頼性の条件付き確率を示しています。たとえば、アバターが本物のアバターであ​​るという条件下では、アカウントが本物である確率は 0.88 です。 DAG と確率表を使用すると、ベイズの公式を使用して定量的な因果推論を行うことができます。 Weibo アカウントが偽のプロフィール写真を使用していることがわかっていると仮定すると、そのアカウントが偽アカウントである確率は次のように推測できます。

ベイズの公式を使用すると、偽のプロフィール写真の場合、そのアカウントが偽アカウントである確率は 0.345 であることがわかります。

上記の例を通して、ベイジアンネットワークの使い方を直感的に感じることができます。ベイジアン ネットワークは通常、有向非巡回グラフと各ノードに対応する確率テーブルで構成されます。 DAG はノードと有向エッジで構成されます。ノードは特徴属性またはランダム変数を表し、有向エッジは変数間の依存関係を表します。ベイジアン ネットワークの重要な特性は、ノードの親ノードの確率分布が決定されると、そのノードはすべての間接的な親ノードから条件付きで独立していることです。この特性により、変数間の結合確率分布を簡単に計算できます。

一般に、多変量非独立ランダム変数の結合確率分布は次のように計算されます。

ノードの条件付き独立性プロパティを使用すると、上記の式は次のように簡略化できます。

DAG で表されるノード関係と確率表が決定されると、関連する事前確率分布と条件付き確率分布を決定できます。その後、ベイズの公式に基づいて、ベイジアン ネットワークを使用して推論を行うことができます。

pgmpy によるベイジアン ネットワークの実装

このセクションでは、ベイジアン ネットワークを構築し、pgmpy に基づいてモデリング トレーニングを実行します。 pgmpy は Python ベースの確率的グラフィカル モデル パッケージであり、主にベイジアン ネットワークやマルコフ モンテ カルロなどの一般的な確率的グラフィカル モデルの実装と推論方法が含まれています。

学生が取得した推薦状の品質の例を使用して、ベイジアン ネットワークを構築します。関連する特徴間の DAG と確率表を図 5 に示します。

図5 推薦状の質のDAGと確率表

図5に示すように、試験の難易度と個人の知能は個人のパフォーマンスに影響を与えます。また、個人の才能もSATスコアに影響を与え、個人のパフォーマンスの質は推薦状の質に直接影響します。次に、pgmpy を使用して上記のベイジアン ネットワーク モデルを実装します。

(1)モデルの枠組みを構築し、変数間の関係を特定する。コード5に示すように。

  1. # pgmpy関連モジュールをインポートする
  2. pgmpy.factors.discrete から TabularCPDをインポート
  3. pgmpy.models から BayesianModelをインポートします
  4. 文字モデル = ベイジアンモデル([( 'D' , 'G' ),
  5. 「私」「G」 )、
  6. 'G''L' )、
  7. 'は' )])

(2)各ノードの条件付き確率分布を構築するには、コード6に示すように、関連するパラメータと入力確率表を指定する必要があります。

  1. # 生徒の成績の条件付き確率分布
  2. grade_cpd = 表形式CPD(
  3. 変数 = 'G' 、# ノード名
  4. variable_card= 3 , # ノード値の数
  5. values=[[ 0.3 , 0.05 , 0.9 , 0.5 ], # このノードの確率表
  6. [ 0.4 , 0.25 , 0.08 , 0.3 ],
  7. [ 0.3 , 0.7 , 0.02 , 0.2 ]],
  8. evidence=[ 'I' , 'D' ], # このノードの依存ノード
  9. evidence_card=[ 2 , 2 ] # ノードに依存する値の数
  10. # 試験難易度の条件付き確率分布
  11. 難易度_cpd = 表形式CPD(
  12. 変数= 'D'
  13. 変数カード = 2 ,
  14. 値=[[ 0.6 ], [ 0.4 ]]
  15. # 個人の才能の条件付き確率分布
  16. intel_cpd = 表形式CPD(
  17. 変数= 'I'
  18. 変数カード = 2 ,
  19. 値=[[ 0.7 ], [ 0.3 ]]
  20. # 推薦状の質の条件付き確率分布
  21. letter_cpd = 表形式CPD(
  22. 変数= 'L'
  23. 変数カード = 2 ,
  24. 値=[[ 0.1 , 0.4 , 0.99 ],
  25. [ 0.9 , 0.6 , 0.01 ]],
  26. 証拠=[ 'G' ],
  27. 証拠カード=[ 3 ]
  28. # SAT テストスコアの条件付き確率分布
  29. sat_cpd = 表形式CPD(
  30. 変数= 'S'
  31. 変数カード = 2 ,
  32. 値=[[ 0.95 , 0.2 ],
  33. [ 0.05 , 0.8 ]],
  34. 証拠=[ '私' ],
  35. 証拠カード=[ 2 ]

(3)各ノードをモデルに追加し、ベイジアンネットワークを構築する。コード7に示すように。

  1. # 各ノードをモデルに追加してベイジアンネットワークを構築します
  2. 文字モデル.cpdsを追加します(
  3. グレード_cpd、
  4. 難易度_cpd、
  5. インテル_cpd、
  6. 文字_cpd、
  7. sat_cpd さん
  8. # pgmpyベイズ推論モジュールをインポートする
  9. pgmpy.inference から VariableEliminationをインポートします
  10. # ベイジアンネットワーク推論
  11. letter_infer = 変数除去(letter_model)
  12. # 学生の才能が優れており、試験が難しくない場合は、学生が取得した推薦状の質を推測します
  13. prob_G = letter_infer.query(
  14. 変数=[ 'G' ],
  15. 証拠={ 'I' : 1 , 'D' : 0 })
  16. 印刷(prob_G)

出力は図6に示されています。

図 6 の出力結果から、賢い学生がより簡単な試験に遭遇した場合、一級の成績を取得する確率は 90% にも達することがわかります。

まとめ

ベイズの定理は古典的な確率モデルの 1 つです。ベイズの核となる理論であり、事前情報とデータ観察に基づいて対象変数の事後分布を取得する方法です。ベイズ理論は機械学習の分野でも広く使用されています。最も一般的に使用されるベイズ機械学習モデルには、ナイーブベイズモデルとベイジアンネットワークモデルがあります。

ナイーブベイズモデルは、データから結合確率分布を学習して事後確率分布を計算する生成学習法です。特徴の条件付き独立性の仮定により、ナイーブベイズアルゴリズムの学習と予測のプロセスが大幅に簡素化されるため、ナイーブベイズと名付けられましたが、精度がある程度低下することもあります。

さらに、ナイーブベイズの条件付き独立性の仮定を緩和し、特徴量間に相関関係があると仮定したベイズモデルがベイジアンネットワークモデルです。ベイジアン ネットワークは、有向グラフと確率表を通じてベイジアン確率モデルを構築する確率的無向グラフィカル モデルです。有向グラフで表されるノード関係と確率表が決定されると、関連する事前確率分布と条件付き確率分布を決定できます。その後、ベイズの公式に基づいて、ベイジアンネットワークを確率推論に使用できます。

この記事の参照コードアドレス:

https://github.com/luwill/Machine_Learning_Code_Implementation/tree/master/charpter21_Bayesian_models

<<:  AI 主導の DevOps はどのようにビジネス変革を実現できるのでしょうか?

>>:  インターネットの価値観を修正するガバナンスアルゴリズム

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

スタートアップにハイエンド AI を実装するにはどうすればよいでしょうか?

【51CTO.comオリジナル記事】 [[193891]] 人工知能は、1956 年のダートマス会...

テスラは、Dojo スーパーコンピューターの秘密を盗み、偽のコンピューターを使用して検査を欺いたとして元エンジニアを訴える

テスラは、元エンジニアのアレクサンダー・ヤツコフ氏を提訴した。同氏は、同社内部のスーパーコンピュータ...

ディープラーニング GPU の最も包括的な比較: コスト パフォーマンスの点で最も優れているのはどれですか?

AI に関して言えば、「GPU の混乱」を感じない人はいないでしょう。 Tensor コア、メモリ...

データ構造とアルゴリズムの基本概念

[[361250]]この記事はWeChatの公開アカウント「bigsai」から転載したもので、著者...

...

「素晴らしい成果物!」ハードウェア AI パフォーマンス テスト用の Python ライブラリがリリースされました

現在、人工知能技術は急速に発展しており、非常に注目を集めています。しかし、数多くの方法があるにもかか...

食品配達ドローンは登場するのか?テンセントが美団の増資を完了、無人配達の研究開発に4億ドルを投資

[[411531]]写真/トゥチョン美団は7月13日夜、テンセントのサブスクリプション契約に含まれる...

AIGC教育産業パノラマレポート:AIティーチングアシスタントと家庭教師が現実のものとなり、学習マシンが新たな機会をもたらす

1 年間の急速な反復を経て、業界ではすでに、生成 AI が最初にどの業界に実装されるかについての答え...

AIの世界はデータから知識へと移行しており、独自のデータセットは組織間で共有されるデータへと移行している。

人工知能(AI)革命は半世紀以上前に始まりました。過去 10 年間で、人工知能は学術科学の領域から私...

2018 年の 12 件の主要な AI および機械学習の買収

[51CTO.com クイック翻訳] IDC によると、人工知能 (AI) と認知システムへの世界的...

...

...

GPT-4 の王冠は落ちていません!クロード3アリーナの人間投票結果が発表されました: 3位のみ

クロード 3 のアリーナ ランクがついに登場:わずか 3 日間で 20,000 票が集まり、リストの...

機械学習の改善: ナレッジグラフがデータに深い意味を与える方法

コンピレーション | ブガッティ編集者 | 薛燕澤[51CTO.com クイック翻訳]多くの企業は、...

...