EconMLパッケージの紹介 (meta-learners編)

はじめに

近年計量経済学機械学習の融合分野の研究が盛り上がりを見せています. 例えば, KDD2018やNeurIPS2018で関連のTutorialが開催されるなどしています. その流れの一つとしてMicrosoft ResearchがEconMLというパッケージを公開していて非常に有用だと思ったので簡単に紹介します.

目次

  • Conditional Average Treatment Effects Estimation
  • EconMLとは
  • Meta-Learners
  • 用法と簡易実験
  • さいごに
  • 参考

Conditional Average Treatment Effects Estimation

ある特徴量で条件付けた際の介入の因果効果の期待値を Conditional Average Treatment Effects Estimation (CATE)と呼び, 次のように表されます.


\begin{aligned}
\tau(X) = \mathbb{E} \left[ Y^{(1)} - Y^{(0)} \, | \, X \right]
\end{aligned}

ここで,  Y^{(1)}, Y^{(0)} はpotential outcomesです. 怪しい方は, 自分が以前書いた記事等をご参照いただけたらと思います.

CATEを推定することができれば, 嬉しいことがたくさんあります. 例えば, 因果効果がプラスであるような特徴量を持つ人だけに広告を打つことで商品の購入確率を最大化したり, 投薬計画を最適化することで生存率を改善できるかもしれません.

似たような目的を持つ分野にUplift Modelingと呼ばれるものがあります(参考1, 参考2)が, Uplift ModelingはA/Bテスト (RCT)によって収集された学習データがあることを前提とします. しかし多くの場合, A/Bテストを走らせて学習データを集めるようなことはコストの面から望ましくなく, 容易に実適用可能な技術とは言えないでしょう.

今回紹介するEconMLパッケージはより安価に手に入るobservational data (過去の介入方策が観測されている特徴量に依存しているようなデータ)から CATEを推定するための手法が豊富に実装されており, 低コストに個別化された介入施策を導くための非常に有用なツールになりうると思います.

EconMLとは

このパッケージについてはTwitterでも共有させていただきました.

github repositoryはこちら, documentはこちら にあります. documentにはCATE推定手法の概要も掲載されており, 分野を概観するのにも役立つでしょう. 今後blogでも何回か扱っていけたらと思っています.

Meta-Learners

今回はEconMLに収録されているCATE推定方法の中でも最もシンプルなMeta-Learnearsモジュールを使ってみます. このモジュールは, 既存の機械学習アルゴリズムを内部で用いるMeta的なCATEの推定方法を提供します. 収録されているMeta-Learnersは5つです. 以下簡単に説明を付しますが, documentを読んだ方が早い可能性があります. また, 機械学習アルゴリズム M Y Xに回帰することで構築された予測器を M \left( Y \sim X \right)と記します.

T-Learner

Potential Outcomes ( Y^{(1)}, Y^{(0)})をそれぞれ個別にモデリングします.


\begin{aligned}
\hat{\tau}(x) & = \hat{\mu}_1 (x) - \hat{\mu}_0(x)
\end{aligned}

ここで,  \hat{\mu_0} = M_1 \left( Y^{(0)} \sim X^{(0)} \right),  \hat{\mu}_1 = M_2 \left( Y^{(1)} \sim X^{(1)} \right) です. また,  X^{(0)}, X^{(1)}はそれぞれ,  X T=0, T=1で条件付けた時の分布と一致する確率変数とし, 傾向スコアを e(X) = \mathbb{P} \left( T = 1 \, | \, X \right)としました.

S-Learner

特徴量に介入有無を表す変数 Tを含めます.


\begin{aligned}
\hat{\tau}(x) & = \hat{\mu} (x, 1) - \hat{\mu}(x, 0)
\end{aligned}

ここで,  \hat{\mu} = M \left( Y^{obs} \sim \left( X, T \right) \right)です.

X-Learner

X-Learnerは少し複雑な手順を踏みます. [Kunzel+ 2017]で提案されているようです (まだ, ちゃんと読んでません).


\begin{aligned}
\hat{D}^{(0)} & = \hat{ \mu }_1 (X^{(0)}) - Y^{(0)}, \quad \hat{D}^{(1)} = Y^{(1)} - \hat{ \mu }_0 (X^{(1)}) \\ 
\hat{\tau}_0 & = M_3 \left( \hat{D}^{(0)} \sim X^{(0)} \right) \\
\hat{\tau}_1 & = M_4 \left(  \hat{D}^{(1)}  \sim X^{(1)}  \right) \\
\hat{\tau}(x) & = e(x) \hat{\tau}_0 (x) + (1 - e(x)) \hat{\tau}_1(x)
\end{aligned}

T-Learnerの時と同様に,  \hat{\mu_0} = M_1 \left( Y^{(0)} \sim X^{(0)} \right),  \hat{\mu}_1 = M_2 \left( Y^{(1)} \sim X^{(1)} \right) です.

DA-Learner (Domain Adaptation Learner)

DA-Learnerは, X-Learnerにおける \hat{\mu_0}, \hat{\mu}_1の学習に共変量シフトを用いた手法です. 具体的には,


\begin{aligned}
\hat{\mu_0} & = M_1 \left( Y^{(0)} \sim X^{(0)}, weights = \frac{e \left(X^{(0)} \right)}{1 - e \left(  X^{(0)} \right) }  \right) \\
\hat{\mu}_1 & = M_2 \left( Y^{(1)} \sim X^{(1)} , weights = \frac{1 - e \left(X^{(1)} \right)}{e \left(  X^{(1)} \right) }  \right) \\
\hat{D}^{(0)} & = \hat{ \mu }_1 (X^{(0)}) - Y^{(0)}, \quad \hat{D}^{(1)} = Y^{(1)} - \hat{ \mu }_0 (X^{(1)}) \\ \\
\hat{\tau} & = M_3 \left( \left( \hat{D}^{(0)}, \hat{D}^{(1)} \right) \sim \left( \hat{X}^{(0)}, \hat{X}^{(1)} \right) \right)
\end{aligned}

 \hat{\mu_0}, \hat{\mu}_1の学習の際に傾向スコアに依存する重みを考慮に入れた損失を用いています. この重みは, importance weightと呼ばれることもあるやつです.

DR-Learner (Doubly Robust Learner)

DR-Learnerは, Doubly Robustを用いてCATEを代替するようなsurrogate outcomeを作り, それを Xに回帰する方法です.  Y_{i,t}^{DR}を次のように定義します.


\begin{aligned}
Y_{i,t}^{DR} & = \hat{E} \left[ Y \,  | \, T = t, x_i  \right] - \mathbb{I} \{ T_i = t \} \cdot \frac{ Y_i^{obs} - \hat{E} \left[ Y \,  | \, T = t, x_i  \right] }{e (x) } \\
 \hat{\tau} & = M \left( \left(  Y_{*, 1}^{DR} - Y_{*,0}^{DR} \right) \sim \left( \hat{X}^{(0)}, \hat{X}^{(1)} \right) \right)
\end{aligned}

hatが付いている部分は, 自分たちでモデリングする必要があります.

用法と簡易実験

EconMLパッケージは, scikit-learnと同じようなインターフェースで実装されており, とても扱いやすいです. 例えば,

# T-learnerを初期化.
controls_model = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=15)
treated_model = GradientBoostingRegressor(n_estimators=100, max_depth=6, min_samples_leaf=15)
T_learner = TLearner(controls_model, treated_model)
# 学習 (fit methodの引数に介入有無を表す変数Tがあるのがsklearnとの違い)
T_learner.fit(y_train, t_train, X_train)
# CATEを推定.
cate_pred = T_learner.effect(X_test)

EconMLに収録されている5つのMeta-Learnersの予測性能を, [Powers+ 2017]で用いられている8つの人工データセットを用いて評価してみます. ただし今回はこのパッケージを触ってみたという意味合いが強いので, ハイパーパラメータチューニングはしておらず, 正確な性能評価ではないのでご注意ください. 非常に簡単に使えるので, 実際に触ってみるのが良いと思います.

結果は次の通りです. 人工データを使ったため, 真のCATEに対するRMSEで評価しました. 学習データ, テストデータは数はともに1,000で, 同様の実験を15回繰り返し箱ひげ図をplotしました.

f:id:usaito:20190407205402p:plain

f:id:usaito:20190407210453p:plain

X-Learnerが良さそうな雰囲気が漂っているので, 論文 ([Kunzel+ 2017])を調査してみる必要がありそうです. また, 今回はoutcomeのモデリングにはGradient Boosting Regressorを, 傾向スコアのモデリングにはRandom Forest Regressorを用いました. scenarioごとにこれらのモデリング方法を変えた方が良いと思われるので, 実際はちゃんとチューニングしましょう.

さいごに

EconMLパッケージを簡単に触ってみました. まだ, 実装されている手法やアルゴリズムが提案された論文を読みきれていないのでちゃんと追っていこうと思います. 今回はMeta-Learnersを扱いましたが, 今後より複雑なアルゴリズムを理解しながら触っていくつもりです.

参考