添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
无邪的黄瓜  ·  MFC的CDialogBar和Rollup ...·  3 月前    · 
帅气的企鹅  ·  如何处理non-resolvable ...·  1 年前    · 
【Python-因果推断】如何在 Mac 上快速安装 econML?

【Python-因果推断】如何在 Mac 上快速安装 econML?

先小结关键步骤:

  • Win 10 可以在 Anacoda 中成功安装 econML,但是由于 shap 等子包以及Python的版本冲突等问题,导致过程非常复杂(本人已忘记如何重复)。
  • 曾经在 Mac+Anaconda 中反复尝试,还是失败。最后在 RStudio RMarkdown 的使用中无意创建了 r-reticulate 环境(尝试跑任意 Python 代码的时候会自动创建),然后在该环境中用 pip 成功完成了 econML 包的安装
  • 目前在 Mac/Win10+Jupyter Notebook已经可以顺利使用 econML(但 RStudio/JupyterLab 还不可以)。

Python 因果推断包很多,比较常见的包括 Uber 的 CausalML 和微软的 econML。其中 econML对 Susan Athey 的 grf 因果森林支持更好,更值得推荐。

但是,这个包实在是太难安装成功了。本人在 Win 10的电脑上面折腾了很久才装成功,换到 Mac 之后,已经完全失去了折腾的动力。以至于我宁愿换回 R(grf 斯坦福的官方团队就用的R),也不想再反反复复折腾。

直到最近,在 R Markdown 中跑 Python的时候,顺手创建了一个叫 “r-reticulate”的环境。

在配置这个环境的时候,顺手试了试:

pip install econml

结果安装过程意外丝滑。

然后当然立马就跑官方案例了(orf建模):

import econml
from econml.orf import DMLOrthoForest
from econml.orf import DMLOrthoForest
from econml.sklearn_extensions.linear_model import WeightedLasso
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
econml.__version__
'0.12.0'
np.random.seed(123)
X = np.random.uniform(-1, 1, size=(4000, 1))
W = np.random.normal(size=(4000, 50))
support = np.random.choice(50, 4, replace=False)
T = np.dot(W[:, support], np.random.normal(size=4)) + np.random.normal(size=4000)
Y = np.exp(2*X[:, 0]) * T + np.dot(W[:, support], np.random.normal(size=4)) + .5
est = DMLOrthoForest(n_trees=100,
                     max_depth=5,
                     model_Y=WeightedLasso(alpha=0.01),
                     model_T=WeightedLasso(alpha=0.01))
est.fit(Y, T, X=X, W=W)
X_test = np.linspace(-1, 1, 30).reshape(-1, 1)
treatment_effects = est.effect(X_test)
plt.plot(X_test[:, 0], treatment_effects, label='ORF estimate')
plt.plot(X_test[:, 0], np.exp(2*X_test[:, 0]), 'b--', label='True effect')
plt.legend()

最后的结果如下:

下面这个是 grf 的案例:

import numpy as np
from econml.grf import RegressionForest
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
np.set_printoptions(suppress=True)