投稿

制約ベース手法との違い と  関数型因果モデル(FCM)

イメージ
次のコード例では、 データ生成時に依存関係を強めに設定しているので、因果関係が検出されやすいようにしています。 bn.structure_learning.fit で direct-lingam を使って構造学習を行います。 学習結果の隣接行列から、エッジが (from, to) の形で存在するか(値が 0 以外の場合)をチェックしてエッジリストを作成します。 各ノードに対して、その親ノードからの影響(回帰係数)を OLS 回帰で推定し、エッジごとのスコアとして出力します。 以下のコードをご確認ください。 python import numpy as np import pandas as pd import bnlearn as bn import statsmodels.api as sm   # ① データ生成(依存関係を強化) np.random.seed(42) n_samples = 300 temperature = np.random.uniform(20, 40, n_samples) ice_cream_sales = 5 * temperature + np.random.normal(0, 1, n_samples) swimming_accidents = 2 * temperature + np.random.normal(0, 1, n_samples)   data = pd.DataFrame({     'Temperature': temperature,     'IceCreamSales': ice_cream_sales,     'SwimmingAccidents': swimming_accidents })   # ② bnlearn による構造学習( direct-lingam を利用) model = bn.structure_learning.fit(data, methodtype='direct-lingam') # model['adjmat'] ...

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...

LiNGAMを活用して因果関係を明確に視覚化する非常に実践的な例

イメージ
今回は NetworkX を使って DAG を描画する方法をご紹介します。以下のコードは、 NetworkX を直接利用して因果関係をグラフとして描画する例です。 import numpy as np import pandas as pd import networkx as nx import matplotlib.pyplot as plt   # データ生成 np.random.seed(42) n_samples = 300 temperature = np.random.uniform(20, 40, n_samples) ice_cream_sales = temperature + np.random.normal(0, 2, n_samples) swimming_accidents = temperature + np.random.normal(0, 1, n_samples) data = pd.DataFrame({     'Temperature': temperature,     'IceCreamSales': ice_cream_sales,     'SwimmingAccidents': swimming_accidents })   # DAG のエッジを直接指定 edges = [     ("Temperature", "IceCreamSales"),     ("Temperature", "SwimmingAccidents") ]   # NetworkX グラフの作成 G = nx.DiGraph() G.add_edges_from(edges)   # グラフの描画 plt.figure(figsize=(8, 6)) pos = nx.spring_layout(G, seed=42)  # ノードの位置を決定 nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=2000, font_size=10, font_weight=...

因果探索の検討事項

因果探索の検討事項 ①     「アイスクリーム売上と水泳事故件数の生成データでは、気温がアイスクリーム売上と水泳事故件数の両方に影響を与えている」とのことでせっていしましたが、常識的な背景での因果構造を抜きにして、生成データのみから DAG のエッジ方向性を正確に把握決定することはできるか? ②     それから、自然界や社会的な観察データのみで 常識的な背景での因果構造を全く抜きにして 正しいエッジの方向を知ることはできるか?   1. 生成データのみから DAG のエッジ方向性を正確に決定できるか? データ生成の構造において、「気温( Temperature )」が「アイスクリーム売上( IceCreamSales )」と「水泳事故件数( SwimmingAccidents )」の両方に影響を与えているという状況を想定します。この場合、背景的因果構造を知らずに、生成データのみから DAG (有向非巡回グラフ)のエッジの方向性を正確に決定できるかどうか?   可能である理由 因果探索アルゴリズム(例えば、 PC アルゴリズムや GES など)を用いれば、データに含まれる変数間の条件付き独立性( Conditional Independence )を検出し、それをもとに DAG のエッジの方向性を推定できます。具体的には、以下のようなプロセスで方向性が決定されます。 データから、 IceCreamSales と SwimmingAccidents が Temperature を条件付けたときに独立である ( IceCreamSales ⊥ SwimmingAccidents | Temperature ) ことを検出できます。 この条件付き独立性から、 Temperature が両方の変数の共通の原因であると推測され、以下のような DAG が推定されます。 Temperature → IceCreamSales Temperature → SwimmingAccidents したがって、生成データのみからでも、 DAG のエッジの方向性をある程度正確に決定することは可能です。 ...

因果探索の課題

イメージ
因果探索の課題 それでは前々回からPythonライブラリで描いた①②③の DAG を比較してみましょう。 DirectLiNGAM による DAG に比べ、 ①の causal-learn を用いた因果探索では、 DAG のエッジの矢印の向きが双方であり不自然です。 ②の LiNGAM を用いた因果探索では矢印の向きが逆になっています。観察データを基にした因果探索でエッジの向きが不自然になったり、期待された因果関係が十分に反映されないことは、因果探索においてよくある課題です。 考えられる原因 1.        データの性質 データ生成時に共通の原因が明確に表現されていない場合、アルゴリズムが誤った関係性を推定することがあります。例として、ノイズの影響やサンプル数不足による誤差が挙げられます。 2.        アルゴリズムの仮定 o     causal-learn の場合では、 PC アルゴリズムは条件付き独立性に基づいて因果構造を推定しますが、関係性が複雑すぎる場合やデータが完全に非ガウス分布ではない場合、矢印の向きが誤る可能性があります。 o     LiNGAM の場合では、 非ガウス性分布の仮定が適応されない場合、因果関係の推定が正確でないことがあります。   数値計算での関係類推 矢印の向きをより自然にするためには以下の方法が考えられます。 1.        直接的なスコア計算 o     統計的手法を使って因果関係の強さを評価し、エッジの向きを補正します。 o     たとえば、各変数間の回帰係数や相関係数を計算し、その大きさから原因と結果の関係性を類推できます。 python import numpy as np import pandas as pd from sklearn.linear_model import LinearRegression   # 温度...