EconML: A Python Package for ML-Based Heterogeneous Treatment Effects Estimation
EconML是一个通过机器学习方法从观察数据中估计heterogeneous treatment effects的Python包。该软件包是微软研究院ALICE项目的一部分,目的是将最新的机器学习方法与计量经济学结合,从而实现复杂因果推断问题的自动化。EconML希望做到以下几点:
机器学习最大的promise之一是在许多领域实现决策的自动化。许多数据驱动的决策场景的核心问题是对heterogeneous treatment effects的估计,也即:对于具有特定特征集的样本,干预对输出结果的causal effect是什么?简言之,这个Python工具包旨在测量某些干预变量T对结果变量Y的causal effect,控制一组特征X和W,来衡量causal effect如何随X的变化而变化。这个包里实现的方法适用于观察的数据集(非实验或历史)。为了使估计结果具有因果解释,一些算法假设数据中没有未观察到的混杂因子(即同时对T和Y产生影响的因子均被包含在X,W中),而其他一些算法则假设可以使用工具变量Z(即观测变量Z对干预T有影响,但对结果变量Y没有直接影响)。并且包中的大多数算法都可以提供置信区间和推断结果。
EconML包的详细文档见:Welcome to econml’s documentation。
causal inference和heterogeneous treatment effects的使用背景和具体的case见文档。具体的例子有:ABtest的例子,客户细分,软件公司的多元投资归因
GITHUB :https://github.com/py-why/EconML
doc::econml.dml.CausalForestDML — econml 0.14.1 documentation
est = CausalForestDML(discrete_treatment=False)
# 拟合模型
est.fit(y, T, X=X)
# 最终模型结果
est.summary() # 如果dlm最终模型是线性模型,那这里显示线性模型的回归系数,此时是一个二次项模型,还有截距项
est.coef_# The coefficients in the linear model of the constant marginal treatment effect. 最终模型是线性的话,就是线性回归系数
est.intercept_ # 线性模型的截距项
# 使用的模型:最终模型 / T~X模型 / Y~X模型
est.model_cate,est.models_t,est.models_y
# 模型计算过程中,前面步骤的残差
res_dict = ['y_res', 'T_res', 'X', 'W']
{res_dict[n]:i for n,i in enumerate(est.residuals_)} # y_res, T_res, X, W,需要cache_values=True
from lightgbm import LGBMRegressor
from econml.dml import DML, CausalForestDML
######第一步,训练uplift模型########
dmlmodel = CausalForestDML(
criterion='mse',
n_estimators=240,
max_depth=4,
min_samples_leaf=2000,
min_samples_split=2000,
n_jobs=-1,
model_y=LGBMRegressor(n_estimators=250, ##
max_depth=5,
num_leaves=31,
learning_rate=0.01,
subsample=0.7,
min_child_samples=2000,
reg_alpha=0.01,
reg_lambda=0.01,
importance_type='gain'),
#model_t=RandomPropensityScoreModel(t),此处可以自定义,但是如果不添加,那么用默认的数据
, verbose=0
, discrete_treatment=False
, honest=True
, min_var_fraction_leaf=0.1
, min_var_leaf_on_val=True
)
dmlmodel.fit(Y=y, T=t, X=x)
#预测部分,在treatment=1时候的结果
pred1=dmlmodel.effect(X=X_test,T0=0,T1=1)
pred2=dmlmodel.effect(X=X_test,T0=0,T1=2)
model_path = 'model.pkl'
with open(model_path, 'wb') as f:
pickle.dump(dmlmodel, f)
######第二步,训练y0基础模型###########
base_model=LGBMClassifier(n_estimators=400,
max_depth=4,
num_leaves=16,
learning_rate=0.2,
subsample=0.3,
min_child_samples=5000,
reg_alpha=0.01,
reg_lambda=0.01,
importance_type='gain',
class_weight=None)
base_model.fit(X_train, y_train, eval_set=(X_test, y_test),
eval_names=None,
eval_sample_weight=None,
eval_class_weight=None,
eval_init_score=None,
eval_metric='auc',
early_stopping_rounds=100,
)
base_prob = base_model.predict_proba(X_test)
在EconML的LinearDML
模型中,有不同的属性用于表示不同的模型部分,如treatment_model_
表示干预模型,outcome_model_
表示结果模型,final_model_
表示最终模型等。
在LinearDML
模型中,cate_model
表示常数边际CATE模型,它是在拟合模型后通过fit
方法获得的。你可以使用cate_model
属性来对已经拟合好的常数边际CATE模型进行预测操作,计算不同干预值下的CATE。