因果推論はAIシステムが、イベント間の真の因果関係をよりよく理解する助けになります。中国製のLLMが最近、話題(注1)になっていたので、データサイエンス分野で中国の因果推論に関する取り組みとツールについて評価します。
因果推論や因果探索のツールとして、Huaweiが提供しているgCastleと、因果探索・因果推論ツール、ylearnを使います。gCastleはPyTorchで実装された因果探索パッケージです。因果関係に関連した代表的なアルゴリズムが実装されて、検証ツールが提供されています。HuaweiのgCastleのは、次回に解説し、本稿では、ylearnについて評価します。
YLearnの特徴
ylearn1は、因果探索・因果推論のAPIをまとめたパッケージです。因果推論のパイプラインという概念を用いて、因果探索から因果関係のモデル化、因果推論、評価までを一貫して行えるAPIを提供しています。
- Counterfactual推論のためのAPI
- DAGの把握
- DML(Double/Debiased Machine Learning)2を含む推論ツール
- Policy Interpreter - 最適化のためのソリューション
- CATE(Conditional ATE)を計算するのにDML(Double Machine Learning)を使います。推論アルゴリズムには、他に一般化ランダムフォレスト、決定木、深層ニューラルネットワークなどが利用できます。
因果探索によってSCM(構造因果モデル),DAG(有向非周期グラフ)の構造から因果関係を把握し、DAGをモデルに因果推論を進め、機械学習でパラメータを推定し、モデルの評価を実施します。
探索→モデル→推定→ポリシーのパイプラインを構成するAPI Whyを提供します。
推論パイプラインのコンポーネントは以下に示します。
YLearnの推論パイプライン
- 探索:観測データから因果関係を探索します。
- モデル:CausalGraphの様式で因果関係を説明し、他の関連操作をCausalModelで識別します。
- 推定:様々な技術で因果を推定します。DMLを含みます。
- ポリシー:最適なポリシーを選択します。
- インタープリター:因果の影響とポリシーを説明します。
図1 YLearnの因果推論パイプライン

パイプラインはトレーニングデータから始めます。因果探索を使って、データから因果の構造を明らかにします。
- CausalGraph DAGのネットワーク構造を保持します。
- CausalGraphはCausalModelに送られ、因果の影響は識別され、統計的な推定に送られます。
- 因果の影響と他の変数の間のモデルの関係をトレーニングデータで訓練します。(トレーニングデータの中の因果の影響)
- 因果の影響を予測するために、訓練済みの推定モデルを使います。推定した因果の影響を変換します。
- CausalGraph
xx = {'X':['W'], 'W':[], 'Y':['W']}
cg = CausalGraph(causation=xx)
cgは因果関係をコード化します。
2. 因果の識別
P(Y| do(X=x))
=> identify method
cm = CausalModel(causal_graph=g)
cm.identify(treatment={'x'}, outcome={'Y'}, identify_method=('backdoor','simple'))
3. 因果の影響の推定
機械学習と因果推論の交わりに焦点を当てており、機械学習モデル、共通のアプローチに従います。つまり以下のリストに示す形式です。
与えられたデータセットに、任意の推定モデルを適用します。
- Pandasデータフレームにtreatment, outcome.adjustment,covariateのデータセットの様式をセットする
- fit()メソッドを使ってモデルを学習する。
- estimate()メソッドでテストデータの因果の影響を推定する。
APIはwhyで提供されます。
from ylearn import why
why はylearnの全てのAPIの関数をカプセル化しています。以下、使用例です。
from sklearn.datasets import fetch_california_housing
from ylearn import Why
housing = fetch_california_housing(as_frame=True)
data = housing.frame
outcome = housing.target_names[0]
data[outcome] = housing.target
why = Why()
why.fit(data, outcome, treatment=['AveBedrms', 'AveRooms'])
print(why.causal_effect())
mean min max std
AveBedrms -0.006393 -1.264421 11.482253 0.132226
AveRooms -0.068143 -1.728602 0.748265 0.054556
本APIはCounterfactual推論のためのAPIも提供しています。
APIで提供されるwhatif()はcounterfactual 推論を実行するソリューションを提供します。
概要
コンセプトや仕様は良くできています。ツールとして更新されておらず、AppleSilicon Mac用に、多くの推論メソッドがコンパイルされていません。ARMでなくx86用のオブジェクトがosxのパッケージに含まれています。そのため、モデルのクラスに含まれる推定メソッドや描画が機能しません。
Why APIの一部を使ってcounterfactual推論はできますが、現行バージョンでは、Double MLなどが動作しないため、ツールの重要なコンセプトである推論のパイプラインは機能しません。
LinuxやWindowsバージョンで機能の動作は未確認です。他のバージョンでは全機能が使用することができるかもしれません。ylearnのosx版がARMを対象としたバージョンに更新されるかどうかは不明です。
Apple Silicon Macに対応したDAGの描画や因果探索ツール、pcalg, igraph, Doubel ML等、他のツール、メタパッケージが提供されているので、Apple Siliconユーザーは他の選択肢があります。
こちらで動作確認したインストールパッケージのセットアップと動作環境を以下にまとめておきます。
YLearnのセットアップ( Apple Silicon Mac)
インストールにはいくつかの手続きが必要です。
pipやconda を使って通常の手続きでインストールするとエラーが発生します。そのため、ここでは以下の手順でローカルファイルからcondaを使ってインストールします。
1. YLearnインストール
パッケージをローカルフォルダにダウンロードし、ローカルフォルダからインストールします。
2. 動作環境の構築
最新のバージョンでは、実行時にエラーが発生します。numpyやnetworkxのバージョンを落とす必要があります。そのため、最新の(base)環境とは別にpython3.11の仮想環境を作り、その上で旧バージョンのnumpyとnetworkxをインストールします。
YLearnインストール
【1.】パッケージのダウンロード
anaconda.orgのサイトで、ylearnを検索します。
https://anaconda.org
パッケージが表示されたら、該当ライブラリを選択します。
図2 anaconda.orgサイトの検索結果

以下の画面が表示されます。
図3 YLearnパッケージ

ここで、4つ並んでいるConda, Files Labels, Badgesのタブメニューのボタンの中で、Filesボタンを選択します。
ファイルのリストが表示されます。
図4 Ylearn パッケージファイル

該当するホストのファイルを選択します。Mac用はosxなので以下の名称にファイルを選択します。
osx-64/ylearn-0.2.0-py311h349b758_0.conda
ファイル名をクリックすると、ブラウザがダウンロードを許可するか聞いてくるので、許可するを選択して下さい。
ダウンロードが開始されます。
ダウンロードしたファイルは、.condaという拡張子のファイルで圧縮してあります。これには、インストールに必要な全てのファイルが含まれています。
【2. 】インストール
ダウンロードしたファイルを(base)環境のpkgsディレクトリに移動します。
anacondaでpython環境を構築した場合、/opt/anaconda3/の下か、ユーザが指定したディレクトリの配下にbase環境が設定されています。
ダウンロードしたファイルからpkgsディレクトリの下にダウンロードしたファイルを移動して下さい。
mv /Users/xxx/Downloads/ylearn-0.2.0-py311h349b758_0.conda /opt/anaconda3/pkgs/.
condaを使ってインストールします。
conda install /opt/anaconda3/pkgs/ylearn-0.2.0-py311h349b758_0.conda
ファイルが以下のディレクトリに展開されます。
/opt/anaconda3/pkgs/ylearn-0.2.0-py311h349b758_0/lib/python3.11/site-packages
ライブラリが以下のパスにインストールされます。
/opt/anaconda3/lib/python3.11/site-packages
pythonがインポートして、ソースコードが参照するのは、このディレクトリ内に展開されているylearnディレクトリの下にあるファイルです。
(base)環境から使えるようにするには、ここにパスを通す必要がありますが、ここではパスの設定を行いません。yleanがnumpyやnetworkxの旧バージョンの仕様のAPIやデータ型を使っているため、ylearn用に仮想環境を構築します。
仮想環境の構築
パッケージマネージャcondaの機能を使って、python 3.11の環境を作ります。以下のコマンドを実行します。
【python3.11環境の作成と起動】
conda create -n python311 python=3.11
conda activate python311
作った環境をactivateするとプロンプトが(base)から(python311)に切り替わります。
(python311) xxxxMacBook-Air:site$
仮想環境を解除する場合は、以下のコマンドを使用します。
conda deactivate
これで元の(base)環境に戻ります。
(base) xxxxMacBook-Air:site$
【Jupyter Notebook用にipykernelカーネルのインストール】
python3.11の仮想環境を起動して、その環境にjupyter用のカーネルをインストールします。Jupyter Notebookの新規ファイルメニューから(python311)のカーネルが選択できるようになります。
pip install ipykernel
(python311) HostnameMacBook-Air:site-packages username$ pip install ipykernel
Collecting ipykernel
Downloading ipykernel-6.29.5-py3-none-any.whl.metadata (6.3 kB)
Collecting appnope (from ipykernel)
Downloading appnope-0.1.4-py2.py3-none-any.whl.m ......
......
【仮想環境のカーネルをjupyterに追加】
python -m ipykernel install --user --name=python311
仮想環境がjupyterに追加されているか確認。
jupyter kernelspec list
これによりjupyter notebookのメニューからpythonの仮想環境を実行環境として選択できるようになります。
下の図5は、jupyter notebookの実行環境を選択するポップアップメニューです。jupyter notebookの右上にあるpython311
表示されている部分をマウスでクリックしたときに表示されます。
図5 jupyter notebook 実行環境選択メニュー

【ylearnディレクトリのパス】
python311環境ができたので、この環境でylearnが使えるように、作成した仮想環境の下にインストールしたylearnのディレクトリをコピーします。
pythonが実行時に参照しているパスを確認します。コマンドプロンプトからpythonを起動します。
(python311)$python
以下のスクリプトを実行します。
import sys
print(sys.path)
>>> import sys
>>> print(sys.path)
['', '/opt/anaconda3/envs/python311/lib/python311.zip', '/opt/anaconda3/envs/python311/lib/python3.11', '/opt/anaconda3/envs/python311/lib/python3.11/lib-dynload', '/opt/anaconda3/envs/python311/lib/python3.11/site-packages']
>>>
実行時に参照するパスが表示されます。ylearnを動かすには、ここにylearnのパスを追加するか、ylearnのディレクトリを参照先に移動します。
(base)環境でylearnを動かすことはないので、python3.11/site-packages/の下に移動させます。以下のコマンドでは、ディレクトリをsite-packagesの下にコピーしています。
作成した仮想環境の下に、ylearnライブラリ(二つのディレクトylearn、およびylearn-0.2.0.dist-info)をコピーします。
cd /opt/anaconda3/envs/python311/lib/python3.11/site-packages
cp -R /opt/anaconda3/lib/python3.11/site-packages/ylearn .
cp -R /opt/anaconda3/lib/python3.11/site-packages/ylearn-0.2.0.dist-info .
【networkxとnumpyのインストール】
ylearnが内部で使用しているライブラリをインストールします。networkxとnumpyは旧バージョンを指定してインストールする必要があります。以下のバージョンを指定します。
- networkx バージョン2.5
- numpy バージョン 1.23.5
conda install -c conda-forge networkx==2.5
conda install -c conda-forge numpy==1.23.5
【その他の必要なライブラリのインストール】
その他、ylearnの動作に必要なライブラリをインストールします。condaを使ってインストールして下さい。
- matplotlib
- igraph
- pandas
- scikit-learn
- scipy
- pydot
- tqdm
conda install -c conda-forge scikit-learn
conda install -c conda-forge scipy
conda install -c conda-forge matplotlib
conda install -c conda-forge igraph
conda install -c conda-forge pandas
conda install -c conda-forge pydot
conda install -c conda-forge tqdm
python3.11でYLearnを実行する環境が整いました。
次に、Ylearnを用いて分析したケーススタディを見ていきます。
参考
参考資料
- J. Pearl. Causality: models, reasoing, and inference.
- M. Funk, et al. Doubly Robust Estimation of Causal Effects.
- V. Chernozhukov, et al. Double Machine Learning for Treatment and Causal Parameters.
- V. Chernozhukov, et al. Double/debiased machine learning for treatment and structural parameters.
- W. Newey and J. Powell. Instrumental Variable Estimation of Nonparametric Models.