Translator|朱宪忠审稿人|SunShujuanIntroduction在很多情况下,我们不仅对估计因果效应感兴趣,而且对这种效应是否因用户而异感兴趣。我们可能有兴趣了解一种药物是否对不同年龄的人有不同的副作用。或者,我们可能有兴趣了解广告活动在某些地理区域是否特别有效。这些知识至关重要,因为它使我们能够实施有针对性的治疗。如果一种药物对儿童有严重的副作用,我们可能希望将其使用限制在成人身上。或者,如果一个活动只在英语国家有效,那么它就不值得在其他地方展示。在本文中,我们探索了一些可以使用机器学习算法来揭示治疗效果异质性的方法。该案例研究假设我们是一家有兴趣了解新保险功能可以在多大程度上增加用户收入的公司。特别是,我们知道不同年龄段的用户有不同的消费态度,我们怀疑保险功能的影响也可能因用户年龄而异。此信息可能很重要,例如,对于广告定位或折扣设计等应用程序。如果我们发现保险功能增加了特定用户群的收入,我们可能希望将广告定位到该群或为他们提供个性化折扣。为了了解保险功能对收入的影响,进行了AB测试。在这个测试中,我们随机给测试样本中10%的用户访问保险功能。这个功能很贵,我们没钱免费提供给更多的用户。因此,我们希望10%的治愈概率就足够了。我们选择使用src.dgp库提供的数据生成过程dgp_premium()函数来生成实验中需要的模拟数据。此外,我们还从src.utils库中导入了一些必要的绘图函数和库。fromsrc.utilsimport*fromsrc.dgpimportdgp_premiumdgp=dgp_premium()df=dgp.generate_data(seed=5)df.head()在数据快照实验中,我们收集了300个用户的数据,观察他们产生的收入,以及他们是否获得Medicare功能。此外,我们还记录了这些用户的年龄。为了解随机化是否有效,我们使用美国Uber的causalml包中的create_table_one函数生成一个协变量平衡表,其中包含实验组和对照组的可观察特征的平均值。顾名思义,这应该始终是您在因果推理分析中呈现的第一个表。fromcausalml.matchimportcreate_table_onecreate_table_one(df,'premium',['age','revenue'])从上表可以看出,大部分用户出现在控制组,只有31个用户出现在实验组.不同组的平均年龄具有可比性(标准化平均差,SMD<0.1),保险功能似乎平均为每个用户增加了2.59美元的收入。那么,保险功能的效果是否因用户年龄而异?一个简单的方法是在保险功能和年龄的完全交互作用下对收入进行回归。linear_model=smf.ols('revenue~premium*age',data=df).fit()linear_model.summary().tables[1]线性回归结果从上面的分析结果来看,交互系数接近于零而不是重要的。年龄差异似乎对保险费没有影响。但事实上,这是真的吗?因为交互系数只捕获线性关系。如果关系是非线性的呢?我们可以通过直接绘制原始数据来检查。我们按年龄拆分收入,并将数据拆分为投保用户和非投保用户。sns.scatterplot(data=df,x='age',y='revenue',hue='premium',s=40);originalimage从原始数据来看,30到50岁人群的收入通常高于High,保险费对35到45岁人群的影响尤为严重。我们可以按年龄、接受治疗和不接受治疗来可视化估计收入值。defplot_TE(df,true_te=False):sns.scatterplot(data=df,x='age',y='revenue',hue='premium',s=40,legend=True)sns.lineplot(df['age'],df['mu0_hat'],label='$\mu_0$')sns.lineplot(df['age'],df['mu1_hat'],label='$\mu_1$')iftrue_te:plt.fill_between(df['age'],df['y0'],df['y0']+df['y1'],color='grey',alpha=0.2,label="TrueTE")plt.title('Distributionofrevenuebyageandpremiumstatus')plt.legend(title='Treated')我们首先用(μ??)计算预测收入;请注意,我们没有使用保险功能(μ??)。然后,将它们与原始数据一起绘制。df['mu0_hat']=linear_model.predict(df.assign(premium=0))df['mu1_hat']=linear_model.predict(df.assign(premium=1))plot_TE(df)与原始数据呈线性估计结果从上图中我们可以观察到,橙色线高于蓝色线,这表明保费对收入有积极影响。然而,这两条线基本上是平行的,表明实验效果没有异质性。我们可以更精确吗?有没有一种方法可以在不假设使用函数形式的情况下以灵活的方式估计这种治疗异质性?答案是肯定的!我们可以使用机器学习方法灵活地估计异构治疗效果。具体来说,我们将详细分析以下三类Popular方法:nS-learnernT-learnernX-learnerinitialsetup我们假设有这样一组受试者i=1,...,n,我们要观察元组(X?,D?,Y?)。其中:实验任务D?∈{0,1}(premium)responseY?∈?(income)featurevectorX?∈??(age)我们感兴趣的是估计平均实验效果。其中Y????表示个体i在实验状态d中的潜在结果。我们还做出以下假设:假设1:未经证实(或可忽略,或可观察对象的选择)未经证实的假设是,以可观察特征X为条件,实验任务D与随机分配一样好。我们实际上假设的是,没有任何我们观察不到的情况会影响用户是否获得保险功能和收入功能。一个强有力的假设是,我们观察到的个性化特征越多,他们就越有可能得到满足。假设2:稳定单位处理成本(SUTVA)SUTVA假设潜在结果不依赖于实验状态。在我们的案例中,我们排除了另一个用户获得保险功能可能会影响我的保险的收入影响这一事实。违反上述SUTVA假设的最常见情况之一是存在网络效应:例如,我的一个朋友通过社交网络增加了我的医疗费用。S-Learner方案最简单的元算法是单一学习器或S-learner。为了构建S-learner估计器,我们将模型μ拟合到所有观察值。S-learner响应函数估计器是从处理和未处理的预测值之间的差异得出的,分别为d=1和d=0。S-learner估计器defS_learner(dgp,model,y,D,X):temp=dgp.generate_data(true_te=True).sort_values(X)mu=model.fit(temp[X+[D]],temp[y])temp['mu0_hat']=mu.predict(temp[X+[D]].assign(premium=0))temp['mu1_hat']=mu.predict(temp[X+[D]].assign(premium=1))plot_TE(temp,true_te=True)让我们使用sklearn包中的DecisionTreeRegressor函数,并使用决策树回归模型构建s-learner。限于篇幅,这里不再赘述决策树的信息;只是说决策树是一种非参数估计器,它使用训练数据将状态空间(在我们的例子中是保费和年龄)分成块,并将结果(在我们的例子中是收入)预测为每个块中的平均值.fromsklearn.treeimportDecisionTreeRegressormodel=DecisionTreeRegressor(min_impurity_decrease=0.001)S_learner(dgp,model,y="revenue",D="premium",X=["age"])预估效果与真实实验效果对比上图中给出了这部分代码的结果数据和响应函数μ?(x,1)和μ?(x,0)绘制在这里。另外,我用灰色绘制了真实响应函数之间的区域:真实实验效果。从图中我们可以看出,S-learner足够灵活,可以理解实验组和对照组之间的水平差异(我们有两条单独的线)。此外,它能够很好地捕获控制组的响应函数μ?(x,1),但不能很好地捕获实验组的控制函数μ?(x,1)。S-learner的问题在于它学习的是单一模型,所以我们不得不寄希望于该模型会在实验D中揭示异质性,但事实可能并非如此。此外,如果模型由于X的高维度而被高度正则化,则可能无法恢复任何实验效果。例如,对于决策树,我们可能不会根据实验变量D进行拆分。T-learnerprotocol为了构建双学习器或T-learner估计器,我们拟合了两种不同的模型,一种用于实验单元,另一种用于控制单元。T-learner响应函数,其中估计量由两个模型的预测值之间的差异给出。T-learner估计器defT_learner(df,model,y,D,X):temp=dgp.generate_data(true_te=True).sort_values(X)mu0=model.fit(temp.loc[temp[D]==0,X],temp.loc[temp[D]==0,y])temp['mu0_hat']=mu0.predict(temp[X])mu1=model.fit(temp.loc[temp[D]==1,X],temp.loc[temp[D]==1,y])temp['mu1_hat']=mu1.predict(temp[X])plot_TE(temp,true_te=True)我们和之前一样使用决策树回归模型。但是这一次,我们为实验组和控制组安装了两个独立的决策树。T_learner(dgp,model,y="revenue",D="premium",X=["age"])真实和估计实验效果对比示意图我们可以看到,T-learner比S-learner,因为它适合两种不同的模型。而且对照组的响应函数μ????(x)还是很准确的;同时,实验组的响应函数μ??1?(x)也比之前更加灵活。现在的问题是,对于每一个预测问题,我们只使用了一小部分数据,而S-learner使用了所有的数据。通过拟合两个单独的模型,我们丢失了一些信息。此外,通过使用两个不同的模型,我们可以在没有异质性的地方获得异质性。例如,对于决策树,即使数据生成过程相同,我们也可能会根据不同的样本获得不同的拆分。X-learner方案交叉学习器或X-learner估计器是T-learner估计器的扩展。构建方法如下:1.对于T-learner,分别用实验单元和控制单元计算μ??1?(x)和μ??0)(x)的模型。2.计算增量delta函数,如下:增量delta函数计算方法3.由X预测Δ,通过实验单元和控制单元计算τ??1?(x)。4.估计倾向得分,即实验概率倾向得分。5.计算实验效果。X-learner估计为了更好地理解X-learner的工作原理,我们可以像以前一样直观地绘制响应函数。但是,此方法并不直接依赖于响应函数。那么,我们还能恢复伪响应函数吗?被允许。首先,我们可以将实验效果改写为:X-learnerestimatesdecompositionexpansion。因此,X-learner估计的伪响应函数可以写成如下形式:),由倾向得分ê(x)加权(即估计的实验概率)。这是什么意思?这意味着如果对于某些观察我们可以清楚地将实验组和对照组分开,那么控制响应函数μ?????将获得大部分权重。相反,如果两组不可区分,则实际结果Y????将获得大部分权重。为了说明该方法,我将使用Kneighbors回归函数通过从最近的观测值近似Y????来构造伪响应函数。我将使用Logistic回归中的LogisticRegressionCV函数来估计倾向得分。从sklearn.neighborsimportKNeighborsRegressorfromsklearn.linear_modelimportLogisticRegressionCVdefX_learner(df,model,y,D,X):temp=dgp.generate_data(true_te=True).sort_values(X)#mumu0=model.fit(temp.loc)[temp[D]==0,X],temp.loc[temp[D]==0,y])temp['mu0_hat_']=mu0.predict(temp[X])mu1=model.fit(temp.loc[temp[D]==1,X],temp.loc[temp[D]==1,y])temp['mu1_hat_']=mu1.predict(temp[X])#Yy0=KNeighborsRegressor(n_neighbors=1).fit(temp.loc[temp[D]==0,X],temp.loc[temp[D]==0,y])temp['y0_hat']=y0.predict(temp[X])y1=KNeighborsRegressor(n_neighbors=1).fit(temp.loc[temp[D]==1,X],temp.loc[temp[D]==1,y])temp['y1_hat']=y1.predict(temp[X])#计算权e=LogisticRegressionCV().fit(y=temp[D],X=temp[X]).predict_proba(temp[X])[:,1]temp['mu0_hat']=e*temp['y0_hat']+(1-e)*temp['mu0_hat_']temp['mu1_hat']=(1-e)*temp['y1_hat']+e*temp['mu1_hat_']#画图plot_TE(temp,true_te=True)X_learner(df,model,y="revenue",D="premium",X=["age"])真实和估计实验结果示意图从这张图我们可以清楚的看到,X-learner的主要优势在于它能够根据上下文灵活地调整响应函数。在状态空间数据量较大的区域(对照组),主要使用估计响应函数。此外,状态空间中有一个区域显示少量数据(实验组),这是使用观察本身的结果。总结在本文中,我们研究了Künzel、Sekhon、Bickel、Yu2019年论文中介绍的不同估计器,它们利用灵活的机器学习算法来估计异构实验效果。三个估计器的复杂性各不相同。其中,S-learner适合单个估计量,包括实验指标作为协变量。T-learner为实验组和控制组拟合了两个独立的估计量。最后,X-learner是T-learner的扩展,它可以根据实验组和对照组可用的数据量实现不同程度的灵活性。异质治疗效果的估计对于治疗靶向至关重要,这在企业应用程序中尤其重要。事实上,这篇论文的引用次数迅速增加,受到了很多关注。在众多其他论文中,值得一提的是Nie和Wager(2021)的R-learner程序以及Athey和Wager(2018)的因果树和森林。以后我可能会写更多关于这些程序的文章;请继续关注我的博客。?参考文献[1]S.Künzel、J.Sekhon、P.Bickel、B.Yu,Metalearnersforestimatingheterogeneoustreatmenteffectsusingmachinelearning(2019),PNAS。[2]X.Nie,S.Wager,异质治疗效果的准预言估计(2021),Biometrika。[3]S.Athey、S.Wager,使用随机森林估计和推断异质处理效果(2018年),美国统计协会杂志。译者介绍朱宪忠,社区编辑,专家博主,讲师,潍坊某高校计算机教师,自由编程资深人士。早期专注于各种微软技术(编译成三本与ASP.NETAJX和Cocos2d-X相关的技术书籍)。/ESP32/RaspberryPi等物联网开发技术和Scala+Hadoop+Spark+Flink等大数据开发技术。原标题:UnderstandingMetaLearners,作者:MatteoCourthoud
