causalMLによる因果探索コード例
!pip install causalml
import pandas as pd
import numpy as np
from causalml.inference.meta
import BaseTRegressor
from sklearn.ensemble import
RandomForestRegressor
# サンプルデータ生成
np.random.seed(42)
n_samples = 500
# データフレーム作成
data = pd.DataFrame({
"Treatment": np.random.choice([0, 1], size=n_samples), # 介入変数
"Outcome": np.random.normal(size=n_samples),
# 結果変数 (連続値)
"Confounder_A": np.random.normal(size=n_samples),
# 交絡因子1
"Confounder_B": np.random.normal(size=n_samples),
# 交絡因子2
})
# 因果推定モデルの構築
confounders =
["Confounder_A", "Confounder_B"]
model =
BaseTRegressor(learner=RandomForestRegressor()) # Regressionモデルに変更
# モデルの学習
X = data[confounders]
y = data["Outcome"]
w =
data["Treatment"]
model.fit(X=X, treatment=w,
y=y)
# 因果効果の推定
te = model.predict(X=X)
print(f"Estimated
treatment effect: {te.mean():.4f}")
import networkx as nx
import matplotlib.pyplot as
plt
# DAG描画用の関数
def draw_dag(labels, edges):
"""
DAGを描画する関数。
labels: ノードのラベル (例: ["X1", "X2", "X3", "X4"])
edges: 辺のリスト (例: [("X1", "X2"), ("X1",
"X3"), ("X2", "X4")])
"""
# 有向グラフを作成
G =
nx.DiGraph()
G.add_nodes_from(labels)
G.add_edges_from(edges)
# グラフの描画
plt.figure(figsize=(8, 6))
pos =
nx.spring_layout(G)
nx.draw(G, pos,
with_labels=True, node_color="lightblue", node_size=2000,
font_size=10, font_color="black")
plt.title("Causal DAG")
plt.show()
# ノードとエッジを指定
labels = ["X1",
"X2", "X3", "X4"]
edges = [("X1",
"X2"), ("X1", "X3"), ("X2",
"X4"), ("X3", "X4")]
# DAG描画関数を呼び出す
draw_dag(labels, edges)
出力結果
Requirement already
satisfied: causalml in /usr/local/lib/python3.11/dist-packages (0.15.4)
省略
Requirement already
satisfied: six>=1.5 in /usr/local/lib/python3.11/dist-packages (from
python-dateutil>=2.8.2->pandas>=0.24.1->causalml) (1.17.0)
Estimated treatment effect:
-0.0668
背景
このコードは、観測データに基づいて介入(Treatment)が結果(Outcome)に与える因果効果を推定するものです。因果推定のコンセプトにおいて、介入変数と結果変数の間の直接的な関係を確認しつつ、交絡因子(Confounder)が影響を与える可能性を考慮する必要があります。
使用されているcausalmlライブラリは、因果推定を行うための機能を提供し、特に介入効果の計算や視覚化をサポートします。回帰タスクを扱う場合、BaseTRegressorを使用して連続変数(結果)の因果効果を推定しています。
設定条件
1. データ生成
o 介入変数(Treatment) ランダムに0(介入なし)または1(介入あり)を設定。
o 結果変数(Outcome)正規分布に従う連続値のデータを生成。
o 交絡因子(Confounder_A,
Confounder_B)交絡因子として正規分布に従うランダムな値を生成し、介入と結果の両方に影響を与える可能性があります。
この部分では、500件のサンプルが生成されています。
2.
因果推定モデル:
o 回帰タスクに適したBaseTRegressorを使用。
o 学習器としてRandomForestRegressor(非線形回帰モデル)を選択。
目的
このコードの目的は以下の通りです:
1.
介入効果の推定:
o 交絡因子の影響を調整しながら、介入(Treatment)の結果(Outcome)への直接的な効果を評価。
o 平均治療効果(ATE:
Average Treatment Effect)を計算する。
2.
モデルの柔軟性:
o 結果変数が連続値である場合、BaseTRegressorに基づいて回帰モデルを適用。
o 非線形な因果関係をキャプチャするため、ランダムフォレスト回帰を選択。
3.
実データへの応用:
o シミュレートされたデータを基に因果推定モデルの機能を理解し、実際のデータセットに応用可能な手法を学ぶ。
まとめ
このコードは、因果推定の基礎を学ぶ上で非常に有用であり、交絡因子を考慮した介入効果の推定方法を示しています。
※追加したDAG描写コードの説明
コードのポイント
1.
networkxでDAGを構築:
o nx.DiGraph() を使ってDAG(有向グラフ)を作成します。
o ノード(変数)とエッジ(因果リンク)を追加してグラフを定義。
2.
エッジリストで因果構造を指定:
o 各因果リンクはタプル(例:
("X1", "X2"))として定義され、方向性を持っています。
3.
matplotlibで視覚化:
o グラフのレイアウトを設定し、ラベルやノードの色、大きさを指定して見やすく描画します。
これで因果関係を視覚的に確認することができます。