Causal Discovery
因果発見では、データから因果関係のグラフを復元します。PCアルゴリズムとその後継手法の仕組み、前提条件、実行可能な例を紹介します。
因果発見とは、データからどの変数がどの変数の原因なのかを推定し、有向グラフを作成するタスクです。XからYへの矢印は、XがYに直接影響することを表します。標準的な機械学習は、予測モデリングに十分な関連性を学習します。因果発見では、機械の設定変更や交通信号のスケジュール変更などの介入後にも、そうした関連性が成り立つかを問います。出力されるのは候補となる因果構造の集合で、いくつかのエッジは向きが定まらないままの場合があります。その後、ドメインの専門家や実験によって候補を絞り込みます。
因果構造を学習可能にする条件#
因果グラフは通常、有向非巡回グラフ(DAG)であり、ベイジアンネットワークと同じ構造を因果的に読み取ります。つまり、各矢印は直接的な効果を表します。発見アルゴリズムは、3つの標準的な仮定に依存します。因果マルコフ条件では、ある変数の直接原因がわかれば、その変数の効果ではないすべての変数から独立します。忠実性は、データ内のすべての独立性がグラフ構造に由来し、効果が偶然相殺された結果ではないことを意味します。因果十分性は、測定されていない変数が、測定された2つの変数の原因になっていないことを意味します。
3つの仮定がすべて成り立っていても、観測データからエッジの向きを常に特定できるとは限りません。連鎖 X → Y → Z、逆向きの連鎖 X ← Y ← Z、分岐 X ← Y → Z は、いずれも同じ独立性パターンを示します。つまり、Yが分かるとXとZは独立になります。そのため、観測データをいくら集めても、これらを区別できません。一方、コライダー X → Y ← Z は異なります。XとZはそれぞれ単独では独立ですが、Yが分かると依存関係になります。この特徴によって両方の矢印の向きを特定できます。
そのため、アルゴリズムはマルコフ同値類を返します。これは、一部の有向エッジは向きが確定している一方、無向エッジはどちらの向きにもなり得る部分有向グラフです。同じ特徴は、データセットバイアスの古典的な原因も説明します。コライダーをフィルタリングまたは調整すると、全体の母集団には存在しない、その原因間の依存関係が生まれます。
発見アルゴリズム#
ほとんどの手法は3つの系統に分類できます。Peter SpirtesとClark Glymourが1991年に発表したPCなどの制約ベースのアルゴリズムは、完全に接続された無向グラフから始め、条件付き独立性が検定された変数間のエッジを削除し、コライダーの向きを決定します。FCIは、隠れた交絡因子がある状況にもこの方法を拡張します。貪欲同値探索(GES)などのスコアベースのアルゴリズムは、ベイズ情報量規準などで最良のスコアを得るグラフを探索します。NOTEARSは非巡回性を滑らかな制約として再定式化し、勾配降下法による連続最適化で探索できるようにします。LiNGAMなどの関数ベースの手法は、非ガウスノイズを伴う線形関係を仮定することで、わずか2つの変数間でもすべてのエッジの向きを特定できるようにします。
因果発見ライブラリでは、時間順序、物理的制約、専門家の知識も背景ルールとして指定できます。これにより、特定のエッジを禁止または必須にでき、探索範囲を狭めるとともに、データだけでは決められないエッジの向きを特定できます。オープンソースのcausal-learnライブラリは、3つの系統すべてを実装しています。この例では既知のコライダーからデータを生成し、PCを使って復元します。
import numpy as np
from causallearn.search.ConstraintBased.PC import pc
rng = np.random.default_rng(0)
n = 5000
# 正解:雨とスタジアムイベントの両方が渋滞の原因です
rain = rng.normal(size=n)
event = rng.normal(size=n)
congestion = rain + event + rng.normal(scale=0.5, size=n)
# PCは条件付き独立性を検定し、データだけからグラフを復元します
data = np.column_stack([rain, event, congestion])
result = pc(data, alpha=0.05, node_names=["rain", "event", "congestion"], show_progress=False)
print(result.G)出力には、rain --> congestionとevent --> congestionという2つの有向エッジが表示されます。雨とイベントは独立していますが、渋滞がわかると依存するため、PCは両方の向きを決定します。真の構造が雨から渋滞、さらに遅延へと続く連鎖だった場合、エッジは無向で返されます。
因果発見の活用例#
生物学では、初期の重要な成果が得られました。2005年、Karen Sachsらは単一細胞の測定データから11個のタンパク質とリン脂質のタンパク質シグナル伝達ネットワークを学習し、既知の接続の大半を復元しました。著者らは追跡実験で、新たに予測されたつながりを確認しました。気候科学では、Jakob Rungeが開発しTigramiteパッケージに実装したPCMCIなどの時系列手法が、ラグと自己相関を扱いながら気候変数間の因果関係を見つけます。時系列分析に適した手法です。PyWhyエコシステムは因果発見ツールとDoWhyを組み合わせ、グラフを確定した後に効果の大きさを推定する次の段階を支援します。
コンピュータービジョンから変数を得ることもできます。Ultralytics YOLO26による物体カウントでは、交通映像で線や領域を通過する車両と歩行者を数えます。時間間隔ごとに記録したカウントを、天候、イベントスケジュール、信号のタイミングと結合してから、因果発見アルゴリズムを実行できます。
因果発見と関連用語の違い#
- 因果表現学習: ピクセルなどの生入力から因果変数自体と、それらの間のグラフを学習します。因果発見では、すでに測定された変数を出発点とします。
- 説明可能なAI(XAI): どの入力がモデルの予測を導いたかを説明しますが、入力を変更すれば現実世界の結果も変わるとは主張しません。
- 特徴量エンジニアリング: ターゲットと相関しているだけの変数も含め、予測を改善する入力を選択・構築します。因果グラフは、変化させるとターゲットを動かす変数を特定します。










