bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAG(Directed Acyclic Graph:有向非巡回グラフ)を構築して可視化
このコード例では、bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAG(Directed Acyclic Graph:有向非巡回グラフ)を構築して可視化しています。
#!pip
install bnlearn networkx matplotlib pandas numpy --upgrade
import
numpy as np
import
pandas as pd
import
bnlearn as bn
import
networkx as nx
import
matplotlib.pyplot as plt
# ベイジアンネットワーク構造を定義
edges
= [
('Temperature', 'IceCreamSales'),
('Temperature', 'SwimmingAccidents')
]
#
DAGを生成
DAG
= bn.make_DAG(edges)
#
DAGをNetworkXグラフに変換
nx_graph
= nx.DiGraph(DAG['adjmat'].values)
nx_graph
= nx.relabel_nodes(nx_graph, {i: node for i, node in
enumerate(DAG['adjmat'].columns)})
# グラフの描画
plt.figure(figsize=(8,
6))
pos
= nx.spring_layout(nx_graph, seed=42)
nx.draw(nx_graph,
pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10,
font_weight='bold', arrowsize=20)
plt.title("Causal
DAG using bnlearn")
plt.show()
出力結果
[bnlearn]>
Auto generate placeholders for the CPTs.
[bnlearn]
>CPT for IceCreamSales :
+-----------------------+-------------------+-------------------+
| Temperature | Temperature(0) | Temperature(1) |
+-----------------------+-------------------+-------------------+
| IceCreamSales (0) | 0.5
| 0.5 |
+-----------------------+-------------------+-------------------+
| IceCreamSales (1) | 0.5
|
0.5 |
+-----------------------+-------------------+-------------------+
[bnlearn] >CPT for SwimmingAccidents:
+-----------------------+-------------------+-------------------+
| Temperature | Temperature(0) | Temperature(1) |
+-----------------------+-------------------+-------------------+
| SwimmingAccidents(0)
| 0.5 | 0.5 |
+-----------------------+-------------------+-------------------+
| SwimmingAccidents(1) | 0.5 | 0.5 |
+-----------------------+-------------------+-------------------+
[bnlearn] >CPT for Temperature:
+----------------+------+
| Temperature(0) | 0.5 |
+----------------+------+
| Temperature(1) | 0.5 |
+----------------+------+
[bnlearn]
>bayes DAG created.
[bnlearn]
>[Conditional Probability Table (CPT)] >[Update Probabilities] >[Node
IceCreamSales ]
[bnlearn]
>[Conditional Probability Table (CPT)] >[Update Probabilities]
>[Node SwimmingAccidents]
[bnlearn]
>[Conditional Probability Table (CPT)] >[Update Probabilities] >[Node
Temperature]
[bnlearn]
>[Conditional Probability Table (CPT)] >[Check Probabilities] >[Node
IceCreamSales ] >OK
[bnlearn]
>[Conditional Probability Table (CPT)] >[Check Probabilities]
>[Node SwimmingAccidents] >OK
[bnlearn]
>[Conditional Probability Table (CPT)] >[Check Probabilities] >[Node
Temperature] >OK
このコードでは、bnlearnライブラリを使用して、ベイジアンネットワーク(Bayesian Network)の構造を定義し、DAG(Directed Acyclic Graph:有向非巡回グラフ)を構築して可視化しています。それぞれのステップを詳細に解説します。
1. ベイジアンネットワーク構造の定義
python
edges
= [
('Temperature', 'IceCreamSales'),
('Temperature', 'SwimmingAccidents')
]
- エッジ定義: 「Temperature」を共通原因とし、「IceCreamSales」と「SwimmingAccidents」の両方に影響を与える構造を手動で指定しています。
- これにより、ベイジアンネットワークの因果関係が明確に設定されます。
2. DAGの生成
python
DAG
= bn.make_DAG(edges)
- DAG生成: bnlearnのmake_DAG関数を使用して、エッジ構造に基づいたDAGを作成します。
- Conditional Probability Table (CPT):
- 各ノード(変数)に対するCPTが自動生成されます。
- 出力されたCPTには、「Temperature」の各状態に対する「IceCreamSales」や「SwimmingAccidents」の確率が示されています(0.5: 0.5の均等分布)。
3. DAGのNetworkXへの変換
python
nx_graph
= nx.DiGraph(DAG['adjmat'].values)
nx_graph
= nx.relabel_nodes(nx_graph, {i: node for i, node in
enumerate(DAG['adjmat'].columns)})
- ベイジアンネットワークの隣接行列をNetworkXグラフに変換します。
- DAG['adjmat']はDAGの隣接行列を返します。
- 隣接行列を用いてグラフを構築し、変数名でノードをラベル付けします。
4. グラフの可視化
python
plt.figure(figsize=(8,
6))
pos
= nx.spring_layout(nx_graph, seed=42)
nx.draw(nx_graph,
pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10,
font_weight='bold', arrowsize=20)
plt.title("Causal
DAG using bnlearn")
plt.show()
- NetworkXを利用してDAGを描画。
- ノード: 「Temperature」、「IceCreamSales」、「SwimmingAccidents」が表示されています。
- エッジ: 矢印の方向が因果関係の向きを表しています(例: Temperature →
IceCreamSales)。
- グラフの構造はコードで指定した因果関係を正しく反映しています。
5. 出力結果の解釈
bnlearnの出力:
- CPT(Conditional Probability Table):
- 各ノード(変数)の状態に応じて生成される確率分布を示しています。
- 例えば、「Temperature」の状態がTemperature(0)またはTemperature(1)の場合、IceCreamSalesとSwimmingAccidentsの状態が均等(0.5: 0.5)になるように設定されています。
重要なポイント:
- 自動生成のCPT:
- 簡易的な設定であるため、実際のデータに基づいてCPTを手動で更新する必要があります。
- 現在は均等分布の仮定ですが、実際のデータを用いることでより現実的なモデルを構築できます。
- DAGの構造:
- ベイジアンネットワークとして「Temperature」が共通原因となる構造を明確に表示。
- グラフのノードとエッジは因果関係を視覚的に理解するために最適化されています。
このモデルの強み
- 簡易な構造定義: 手動で因果構造を設定しつつ、自動でベイジアンネットワークモデルを構築。
- グラフ可視化: DAGが分かりやすく描画され、因果関係が直観的に理解可能。
このコードは、簡易な因果モデル構築から可視化までを行う良い例です。さらにCPTを現実のデータで詳細に設定することで、モデルの精度が向上します。