这个包包含几种计算条件平均治疗效果的方法
项目描述
EconML:用于基于 ML 的异构治疗效果估计的 Python 包
EconML是一个 Python 包,用于通过机器学习从观察数据中估计异构治疗效果。该软件包是微软研究院ALICE 项目的一部分,旨在将最先进的机器学习技术与计量经济学相结合,为复杂的因果推理问题带来自动化。EconML 的承诺:
- 在计量经济学和机器学习的交叉点实施文献中的最新技术
- 保持对效应异质性建模的灵活性(通过随机森林、增强、套索和神经网络等技术),同时保留学习模型的因果解释并通常提供有效的置信区间
- 使用统一的 API
- 基于标准 Python 包构建机器学习和数据分析
机器学习的最大承诺之一是在多个领域实现决策自动化。许多数据驱动的个性化决策场景的核心是对异质治疗效果的估计:干预对具有特定特征集的样本的感兴趣结果的因果影响是什么?简而言之,该工具包旨在测量某些治疗变量T对结果变量的因果影响Y,控制一组特征X, W以及该影响如何随X. 所实施的方法甚至适用于观察(非实验或历史)数据集。为了使估计结果具有因果解释,一些方法假设没有未观察到的混杂因素(即没有未包括在其中的未观察到的变量X, W同时对T和对治疗有影响,但对结果没有直接影响)。大多数方法提供置信区间和推理结果。YZZTY
有关包的详细信息,请参阅https://econml.azurewebsites.net/上的文档。
有关因果推理和异质治疗效果的用例和背景材料的信息,请参阅我们的网页https://www.microsoft.com/en-us/research/project/econml/
消息
2022 年 6 月 17 日:发布 v0.13.1,请参阅此处的发布说明
以前的版本
2022 年 1 月 31 日:发布 v0.13.0,请参阅此处的发布说明
2021 年 8 月 13 日:发布 v0.12.0,请参阅此处的发布说明
August 5, 2021: Release v0.12.0b6, see release notes here
August 3, 2021: Release v0.12.0b5, see release notes here
July 9, 2021: Release v0.12.0b4, see release notes here
June 25, 2021: Release v0.12.0b3, see release notes here
June 18, 2021: Release v0.12.0b2, see release notes here
June 7, 2021: Release v0.12.0b1, see release notes here
May 18, 2021: Release v0.11.1, see release notes here
May 8, 2021: Release v0.11.0, see release notes here
March 22, 2021: Release v0.10.0, see release notes here
March 11, 2021: Release v0.9.2, see release notes here
March 3, 2021: Release v0.9.1, see release notes here
February 20, 2021: Release v0.9.0, see release notes here
January 20, 2021: Release v0.9.0b1, see release notes here
November 20, 2020: Release v0.8.1, see release notes here
November 18, 2020: Release v0.8.0, see release notes here
September 4, 2020: Release v0.8.0b1, see release notes here
March 6, 2020: Release v0.7.0, see release notes here
February 18, 2020: Release v0.7.0b1, see release notes here
2020 年 1 月 10 日:发布 v0.6.1,请在此处查看发布说明
2019 年 12 月 6 日:发布 v0.6,请参阅此处的发布说明
2019 年 11 月 21 日:发布 v0.5,请参阅此处的发布说明。
2019 年 6 月 3 日:发布 v0.4,请参阅此处的发布说明。
2019 年 5 月 3 日:发布 v0.3,请参阅此处的发布说明。
2019 年 4 月 10 日:发布 v0.2,请参阅此处的发布说明。
2019 年 3 月 6 日:发布 v0.1,欢迎试用并提供反馈。
入门
安装
从PyPI安装最新版本:
pip install econml
要从源代码安装,请参阅下面的面向开发人员部分。
使用示例
估计方法
双机学习(又名 RLearner)(点击展开)
- 线性最后阶段
from econml.dml import LinearDML
from sklearn.linear_model import LassoCV
from econml.inference import BootstrapInference
est = LinearDML(model_y=LassoCV(), model_t=LassoCV())
### Estimate with OLS confidence intervals
est.fit(Y, T, X=X, W=W) # W -> high-dimensional confounders, X -> features
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # OLS confidence intervals
### Estimate with bootstrap confidence intervals
est.fit(Y, T, X=X, W=W, inference='bootstrap') # with default bootstrap parameters
est.fit(Y, T, X=X, W=W, inference=BootstrapInference(n_bootstrap_samples=100)) # or customized
lb, ub = est.effect_interval(X_test, alpha=0.05) # Bootstrap confidence intervals
- Sparse linear final stage
from econml.dml import SparseLinearDML
from sklearn.linear_model import LassoCV
est = SparseLinearDML(model_y=LassoCV(), model_t=LassoCV())
est.fit(Y, T, X=X, W=W) # X -> high dimensional features
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # Confidence intervals via debiased lasso
- Generic Machine Learning last stage
from econml.dml import NonParamDML
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
est = NonParamDML(model_y=RandomForestRegressor(),
model_t=RandomForestClassifier(),
model_final=RandomForestRegressor(),
discrete_treatment=True)
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
动态双机学习(点击展开)
from econml.dynamic.dml import DynamicDML
# Use defaults
est = DynamicDML()
# Or specify hyperparameters
est = DynamicDML(model_y=LassoCV(cv=3),
model_t=LassoCV(cv=3),
cv=3)
est.fit(Y, T, X=X, W=None, groups=groups, inference="auto")
# Effects
treatment_effects = est.effect(X_test)
# Confidence intervals
lb, ub = est.effect_interval(X_test, alpha=0.05)
因果森林(点击展开)
from econml.dml import CausalForestDML
from sklearn.linear_model import LassoCV
# Use defaults
est = CausalForestDML()
# Or specify hyperparameters
est = CausalForestDML(criterion='het', n_estimators=500,
min_samples_leaf=10,
max_depth=10, max_samples=0.5,
discrete_treatment=False,
model_t=LassoCV(), model_y=LassoCV())
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
# Confidence intervals via Bootstrap-of-Little-Bags for forests
lb, ub = est.effect_interval(X_test, alpha=0.05)
正交随机森林(点击展开)
from econml.orf import DMLOrthoForest, DROrthoForest
from econml.sklearn_extensions.linear_model import WeightedLasso, WeightedLassoCV
# Use defaults
est = DMLOrthoForest()
est = DROrthoForest()
# Or specify hyperparameters
est = DMLOrthoForest(n_trees=500, min_leaf_size=10,
max_depth=10, subsample_ratio=0.7,
lambda_reg=0.01,
discrete_treatment=False,
model_T=WeightedLasso(alpha=0.01), model_Y=WeightedLasso(alpha=0.01),
model_T_final=WeightedLassoCV(cv=3), model_Y_final=WeightedLassoCV(cv=3))
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
# Confidence intervals via Bootstrap-of-Little-Bags for forests
lb, ub = est.effect_interval(X_test, alpha=0.05)
元学习者(点击展开)
- XLearner
from econml.metalearners import XLearner
from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor
est = XLearner(models=GradientBoostingRegressor(),
propensity_model=GradientBoostingClassifier(),
cate_models=GradientBoostingRegressor())
est.fit(Y, T, X=np.hstack([X, W]))
treatment_effects = est.effect(np.hstack([X_test, W_test]))
# Fit with bootstrap confidence interval construction enabled
est.fit(Y, T, X=np.hstack([X, W]), inference='bootstrap')
treatment_effects = est.effect(np.hstack([X_test, W_test]))
lb, ub = est.effect_interval(np.hstack([X_test, W_test]), alpha=0.05) # Bootstrap CIs
- SLearner
from econml.metalearners import SLearner
from sklearn.ensemble import GradientBoostingRegressor
est = SLearner(overall_model=GradientBoostingRegressor())
est.fit(Y, T, X=np.hstack([X, W]))
treatment_effects = est.effect(np.hstack([X_test, W_test]))
- TLearner
from econml.metalearners import TLearner
from sklearn.ensemble import GradientBoostingRegressor
est = TLearner(models=GradientBoostingRegressor())
est.fit(Y, T, X=np.hstack([X, W]))
treatment_effects = est.effect(np.hstack([X_test, W_test]))
双重鲁棒学习者(点击展开)
- 线性最后阶段
from econml.dr import LinearDRLearner
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
est = LinearDRLearner(model_propensity=GradientBoostingClassifier(),
model_regression=GradientBoostingRegressor())
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05)
- Sparse linear final stage
from econml.dr import SparseLinearDRLearner
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
est = SparseLinearDRLearner(model_propensity=GradientBoostingClassifier(),
model_regression=GradientBoostingRegressor())
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05)
- Nonparametric final stage
from econml.dr import ForestDRLearner
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
est = ForestDRLearner(model_propensity=GradientBoostingClassifier(),
model_regression=GradientBoostingRegressor())
est.fit(Y, T, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05)
使用工具变量的双重机器学习(点击展开)
- Orthogonal instrumental variable learner
from econml.iv.dml import OrthoIV
est = OrthoIV(projection=False,
discrete_treatment=True,
discrete_instrument=True)
est.fit(Y, T, Z=Z, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # OLS confidence intervals
- Nonparametric double machine learning with instrumental variable
from econml.iv.dml import NonParamDMLIV
est = NonParamDMLIV(projection=False,
discrete_treatment=True,
discrete_instrument=True)
est.fit(Y, T, Z=Z, X=X, W=W) # no analytical confidence interval available
treatment_effects = est.effect(X_test)
使用工具变量的双重鲁棒机器学习(点击展开)
- 线性最后阶段
from econml.iv.dr import LinearDRIV
est = LinearDRIV(discrete_instrument=True, discrete_treatment=True)
est.fit(Y, T, Z=Z, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # OLS confidence intervals
- Sparse linear final stage
from econml.iv.dr import SparseLinearDRIV
est = SparseLinearDRIV(discrete_instrument=True, discrete_treatment=True)
est.fit(Y, T, Z=Z, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # Debiased lasso confidence intervals
- Nonparametric final stage
from econml.iv.dr import ForestDRIV
est = ForestDRIV(discrete_instrument=True, discrete_treatment=True)
est.fit(Y, T, Z=Z, X=X, W=W)
treatment_effects = est.effect(X_test)
# Confidence intervals via Bootstrap-of-Little-Bags for forests
lb, ub = est.effect_interval(X_test, alpha=0.05)
- Linear intent-to-treat (discrete instrument, discrete treatment)
from econml.iv.dr import LinearIntentToTreatDRIV
from sklearn.ensemble import GradientBoostingRegressor, GradientBoostingClassifier
est = LinearIntentToTreatDRIV(model_y_xw=GradientBoostingRegressor(),
model_t_xwz=GradientBoostingClassifier(),
flexible_model_effect=GradientBoostingRegressor())
est.fit(Y, T, Z=Z, X=X, W=W)
treatment_effects = est.effect(X_test)
lb, ub = est.effect_interval(X_test, alpha=0.05) # OLS confidence intervals
深度工具变量(点击展开)
import keras
from econml.iv.nnet import DeepIV
treatment_model = keras.Sequential([keras.layers.Dense(128, activation='relu', input_shape=(2,)),
keras.layers.Dropout(0.17),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dropout(0.17),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dropout(0.17)])
response_model = keras.Sequential([keras.layers.Dense(128, activation='relu', input_shape=(2,)),
keras.layers.Dropout(0.17),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dropout(0.17),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dropout(0.17),
keras.layers.Dense(1)])
est = DeepIV(n_components=10, # Number of gaussians in the mixture density networks)
m=lambda z, x: treatment_model(keras.layers.concatenate([z, x])), # Treatment model
h=lambda t, x: response_model(keras.layers.concatenate([t, x])), # Response model
n_samples=1 # Number of samples used to estimate the response
)
est.fit(Y, T, X=X, Z=Z) # Z -> instrumental variables
treatment_effects = est.effect(X_test)
有关更多详细信息,请参阅参考资料部分。
可解释性
CATE 模型的树解释器(点击展开)
from econml.cate_interpreter import SingleTreeCateInterpreter
intrp = SingleTreeCateInterpreter(include_model_uncertainty=True, max_depth=2, min_samples_leaf=10)
# We interpret the CATE model's behavior based on the features used for heterogeneity
intrp.interpret(est, X)
# Plot the tree
plt.figure(figsize=(25, 5))
intrp.plot(feature_names=['A', 'B', 'C', 'D'], fontsize=12)
plt.show()
CATE 模型的策略解释器(点击展开)
from econml.cate_interpreter import SingleTreePolicyInterpreter
# We find a tree-based treatment policy based on the CATE model
intrp = SingleTreePolicyInterpreter(risk_level=0.05, max_depth=2, min_samples_leaf=1,min_impurity_decrease=.001)
intrp.interpret(est, X, sample_treatment_costs=0.2)
# Plot the tree
plt.figure(figsize=(25, 5))
intrp.plot(feature_names=['A', 'B', 'C', 'D'], fontsize=12)
plt.show()
CATE 模型的 SHAP 值(点击展开)
从econml.dml导入shap
导入CausalForestDML est = CausalForestDML () est 。适合(Y ,T ,X = X ,W = W )shap_values = est 。shap_values ( X )形状。summary_plot ( shap_values [ 'Y0' ][ 'T0' ])