目录
Double/Debiased Machine Learning
Double/Debiased Machine Learning
Double/Debiased ML 或 R-learner 可以看作是 FrischWaugh-Lovell 定理的改进版。其思路非常简单--在构建结果和治疗残差时使用 ML 模型 结果和干预残差:
,
预估,预估
由于 ML 模型具有超强的灵活性,因此在估计 Y 和 T 残差时,它们更适合捕捉交互作用和非线性因素,同时仍能保持 FWL 式的正交化。这意味着您不必对协变量 X 和干预结果 Y 之间的关系,以及协变量和治疗之间的关系做出任何参数假设,就能得到正确的治疗效果。只要没有未观察到的混杂因素,就可以通过下面的正交化程序恢复 ATE:
1. 使用灵活的 ML 回归模型 μy 估计带有特征 X 的结果 Y。
2. 使用灵活的 ML 回归模型 μt 估计带有特征 X 的干预 T。
3. 获得残差 和 。
4. 将干预结果的残差与处理方法的残差进行回归 ,其中 τ 是因果参数 ATE,您可以用 OLS 等方法对其进行估计。
ML 的强大之处在于灵活性。ML 功能强大,可以捕捉干扰关系中复杂的函数形式。但这种灵活性也带来了麻烦,因为这意味着你现在必须考虑到过拟合的可能性。切尔诺茹科夫等人的论文对过度拟合如何造成麻烦做了更深入、更严谨的解释,我强烈建议你去看看。但在这里,我将继续以直觉为基础进行解释。
要了解这个问题,假设你的 μy 模型正在过度拟合。其结果是,残差 Y 会比它应该得到的要小。这也意味着 μy 所捕捉的不仅仅是 X 和 Y 之间的关系,其中还有一部分是 T 和 Y 之间的关系,如果 μy 捕捉到了其中的一部分,那么残差回归将偏向于零。换句话说,μy 是在捕捉因果关系,而不是将其留给最终的残差回归。
现在,要想了解过度拟合 μt 的问题,请注意它对 T 方差的解释将超过其应有的解释。因此,干预残差的方差将小于其应有的方差。如果干预的方差较小,最终估计值的方差就会很大。这就好比几乎每个人的干预都是一样的,或者说违反了实在性假设。如果每个人的干预水平几乎相同,就很难估计在不同的干预下会发生什么。
这就是使用 ML 模型时会遇到的问题。但如何才能解决这些问题呢?答案就在于交叉预测和折外残差。您可以将数据划分为 K 个折叠,在其中的 K-1 个折叠中估计模型,并在被忽略的折叠中获得残差,而不是在用于拟合模型的相同数据中获得残差。重复同样的过程 K 次,得到整个数据集的残差。采用这种方法,即使模型确实过拟合,也不会人为地将残差推向零。
这在理论上看起来很复杂,但实际上很容易编码。你可以使用 sklearn 中的 cross_val_predict 函数从任何机器学习模型中获取折外预测。下面就是如何通过几行代码获得这些残差:
from sklearn.model_selection import cross_val_predict
X = ["month", "weekday", "is_holiday", "competitors_price"]
T = "discounts"
y = "sales"
debias_m = LGBMRegressor()
denoise_m = LGBMRegressor()
t_res = train[T] - cross_val_predict(debias_m,train[X],train[T],cv=5)
y_res = train[y] - cross_val_predict(denoise_m,train[X],train[y],cv=5)
如果你只关心 ATE,你可以简单地将干预结果的残差与处理方法的残差进行回归(只是不要相信那些标准误差,因为它们没有考虑估计残差时的方差):
import statsmodels.api as sm
sm.OLS(y_res, t_res).fit().summary().tables[1]
但在本章中,我们的重点是 CATE。那么,究竟如何使用 Double-ML 获得 CATE 呢?