想象你是一家药监局的评审员,面前摆着某种“专注力口服液”的试验数据:试点班级喝了口服液,平均成绩比对照班高 8 分。可你细看发现,试点班恰好买了更贵的辅导书、家长陪伴时间也更长——这 8 分的差距,究竟是口服液的功劳,还是辅导书与家庭陪伴的“障眼法”?在真实世界中,“吃药的人”和“不吃药的人”往往从一开始就不像,这正是因果推理要面对的第一道坎。 要破解这道坎,最理想的做法是让同一个班级“既喝口服液又不喝口服液”,在两个平行世界里比较结果。现实当然做不到,于是统计学家想出一个迂回策略:请一组专家模型根据体质特征预测每个人“本该恢复多少”,再拿实际结果与预测值对比,剩下的差距才是药物的净贡献。可这里又藏着一个陷阱:如果专家是在同一批病人身上“既当运动员又当裁判”,它会背下病人的名字而不是学会真正的规律,评估结果自然虚高。 解决之道,就是本篇文章的主角——交叉拟合(Cross-Fitting):把病人分成 K 组,轮流让 K−1 组训练专家模型、1 组当“评委”评估效果,轮番上岗,真正做到“旁观者清”。这个思路与 Double ML(双机器学习) 组合在一起,就构成了当前因果机器学习中最稳健的估计框架之一:用机器学习做“干净预测”,用交叉拟合做“公正评审”,在复杂数据中稳定地还原真实因果效应。

岗位关联

对 AI 从业者而言,掌握交叉拟合意味着你能在广告投放、政策评估、可解释 AI 等场景中,从“相关关系”走向“因果关系”,用一套可量化的框架回答“这件事到底有没有用”——这是算法工程师向资深分析师、研究科学家进阶的核心能力。

目录
  1. 可视化演示
  2. 因果推理基础
  3. 交叉拟合原理
  4. 核心框架
  5. 算法变体
  6. 性能与优化
  7. 实战应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

围绕交叉拟合展开深入探讨,从基本概念出发逐步深入到高级应用。内容涵盖因果推理与可解释AI、因果机器学习中的交叉... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

交叉拟合的核:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

因果推理基础

你是一家药监局的评审员,面前摆着两种“专注力口服液”的试验数据:试点班级喝了口服液,平均成绩比对照班级高 8 分。可你细看发现,试点班级买了更贵的辅导书、家长陪伴时间也更长。这 8 分的差距到底是口服液带来的,还是“辅导书 + 陪伴”造成的?在真实世界里,处理组与对照组往往“本就不像”,这正是因果推理要面对的第一个难题。

要回答这个问题,最理想的做法是做一个思想实验:让同一个班级既喝口服液,又喝白开水,在同一时间轴上比较两种结局。统计学家把“本可发生却未发生”的结局称为 反事实(Counterfactual)。现实中我们永远只能观测到其中一个分支,因此需要用观测数据构造出对另一分支的合理估计。

记 $Y_i(1)$ 为个体 $i$ 接受处理后的潜在结局,$Y_i(0)$ 为未接受处理的潜在结局。两者之差是这个个体专属的因果效应;对总体所有个体取平均,就得到最常用的因果目标——平均处理效应(Average Treatment Effect, ATE)。

一旦意识到“每个人心里都有两个平行世界”,你就明白:所有因果机器学习,本质上都是在用自己的统计结构,补全那个未被观测的世界。交叉拟合与 Double ML,正是补全它的两件利器。

ATE=E[Y(1)−Y(0)]\displaystyle \text{ATE} = \mathbb{E}[Y(1) - Y(0)]
这个公式的意思是:先问“如果每个人都吃药会怎样”,再问“如果每个人都不吃药会怎样”,两个幻想世界平均结果的差,就是药效的净贡献。
  1. 潜在结果$Y(1)$ 表示同一个人在接受处理后的结果,$Y(0)$ 表示未接受处理的结果,二者构成一对“平行世界”。
    Y(1),Y(0)Y(1), \quad Y(0)
  2. 个体差值$Y(1) - Y(0)$ 是同一个体的因果效应,它天然消除了个体体质差异。
    Y(1)−Y(0)Y(1) - Y(0)
  3. 总体期望$\mathbb{E}[\cdot]$ 表示对全体个体取平均,得到平均处理效应 ATE。
    E[Y(1)−Y(0)]\mathbb{E}[Y(1) - Y(0)]

交叉拟合原理

为了评估药效,你请来几位专家建立“体质预测模型”。但如果专家事先背熟了某一组病人的姓名和既往病史,评估时就会“凭记忆作答”,分数虚高。机器学习把这种现象称为 过拟合 与 信息泄漏——模型在训练时见过的人,再拿来当考题,成绩当然好看。

于是你决定改变规则:把病人随机分成 K 组,每一轮让 K−1 组参与建模,剩下 1 组充当“考官”;然后轮换,确保每组成员都当过考官、也都当过研究员。这就是 交叉拟合(Cross-Fitting)。它与我们熟悉的 K 折交叉验证(Cross-Validation)形似,却各司其职:交叉验证是为了挑选模型超参数,交叉拟合是为了让后续的因果估计不受“背答案”影响。

K 折交叉拟合的评估误差可写成:

交叉拟合的本质是“临时组建评审团”:让评估模型永远面对没见过的主样本,从而消除乐观偏差。这就像药监局绝不请“本药研发团队成员”来当评审——因为利益相关者的打分天然不可信。

CV=1K∑k=1K1∣Ik∣∑i∈Ik(Yi−f^(−k)(Xi))2\displaystyle \text{CV} = \frac{1}{K}\sum_{k=1}^{K} \frac{1}{|I_k|}\sum_{i \in I_k}\left(Y_i - \hat{f}^{(-k)}(X_i)\right)^2
它把全部数据切成 K 份,轮流拿 1 份当考卷、其余 K−1 份当教材,最后把 K 次“考试分数”平均,得到一个不掺水的真实表现。
  1. 折与验证集$I_k$ 是第 $k$ 折的样本集合,$|I_k|$ 表示这折样本的数量。
    Ik,∣Ik∣I_k, \quad |I_k|
  2. 补集训练$\hat{f}^{(-k)}$ 表示“不使用第 $k$ 折数据”训练出的模型,它从未见过 $I_k$ 中的任何样本。
    f^(−k)(⋅)\hat{f}^{(-k)}(\cdot)
  3. 单折误差$\frac{1}{|I_k|}\sum_{i \in I_k}\left(Y_i - \hat{f}^{(-k)}(X_i)\right)^2$ 是第 $k$ 折的均方误差,即本折“考卷”的平均失分。
    1∣Ik∣∑i∈Ik(Yi−f^(−k)(Xi))2\frac{1}{|I_k|}\sum_{i \in I_k}\left(Y_i - \hat{f}^{(-k)}(X_i)\right)^2
  4. 平均综合$\frac{1}{K}\sum_{k=1}^{K}$ 把 K 轮考试分数取平均,得到交叉拟合误差。
    1K∑k=1K\frac{1}{K}\sum_{k=1}^{K}

核心框架

交叉拟合解决了“谁来当评委”的问题,Double ML 则规定了“评审流程怎么走”。整个流程由两位“乐手”协作完成:第一位负责剥离协变量(体质特征)的干扰,对结果 $Y$ 建模得 $\hat{g}(X)$,对处理变量 $D$ 建模得 $\hat{m}(X)$;第二位在剥离后的残差上做回归,捕捉真正的因果信号。

具体来说,第一阶段用交叉拟合的方式训练两个辅助模型:一个用协变量 $X$ 预测结果 $Y$,得到 $\hat{g}(X)$;另一个用 $X$ 预测是否接受处理 $D$,得到 $\hat{m}(X)$。第二阶段把“实际结果 − 预测结果”与“实际处理 − 预测处理”放在一起回归,得到处理效应 $\hat{\theta}$:

这里的精巧之处叫 Neyman 正交性(Neyman Orthogonality):得分函数对第一阶段的估计误差不敏感。用大白话说,即使辅助模型 $\hat{g}$ 和 $\hat{m}$ 有些小毛病,只要交叉拟合保证了它们在主样本上的独立性,第二阶段的 $\hat{\theta}$ 依然“稳如磐石”。两位乐手各司其职、互相掩护,这就是"Double ML"名字的由来。

θ^=∑i∈I(Di−m^(Xi))(Yi−g^(Xi))∑i∈I(Di−m^(Xi))2\displaystyle \hat{\theta} = \frac{\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)\left(Y_i - \hat{g}(X_i)\right)}{\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)^2}
这个公式像在说:先扣除“体质决定的那部分恢复”,再看“吃药这个动作本身带来了多少额外变化”。残差化让协变量的影响被清走,剩下的关联才贴近因果。
  1. 结果残差$Y_i - \hat{g}(X_i)$ 是实际结果减去“按体质本该有的结果”,相当于剥离了 $X$ 对 $Y$ 的影响。
    Yi−g^(Xi)Y_i - \hat{g}(X_i)
  2. 处理残差$D_i - \hat{m}(X_i)$ 是实际处理减去“按体质本会接受处理的概率”,剥离了 $X$ 对 $D$ 的影响。
    Di−m^(Xi)D_i - \hat{m}(X_i)
  3. 分子协方差$\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)\left(Y_i - \hat{g}(X_i)\right)$ 度量了“剥干净之后,处理与结果还剩多少同向变化”。
    ∑i∈I(Di−m^(Xi))(Yi−g^(Xi))\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)\left(Y_i - \hat{g}(X_i)\right)
  4. 分母方差$\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)^2$ 是处理残差的方差,用来做归一化,把“变化量”换算成“效应大小”。
    ∑i∈I(Di−m^(Xi))2\sum_{i\in I}\left(D_i - \hat{m}(X_i)\right)^2
  5. 估计量整体相除得到 $\hat{\theta}$,即在交叉拟合保护下对平均处理效应的稳健估计。
    θ^\hat{\theta}

算法变体

同一套评审制度,可以搭配不同的裁决规则。DML1 的做法是:每一折都用主样本独立算出一个 $\hat{\theta}^{(k)}$,最后取算术平均;DML2 则是把所有折的残差拼成一个大样本,再统一回归。前者像“多个评委打分后取平均”,后者像“把评分表汇总后一次性统计”。

DML1 的聚合公式如下:

除了聚合方式,模型结构也有不同选择。部分线性回归(PLR) 假设处理效应是常数、线性进入模型:$Y = \theta D + g(X) + U$。它是最常用、最好解释的设定,相当于“药效对每个人一样”。部分线性工具变量(PLIV) 则引入一个工具变量 $Z$(比如药品的随机分配批次),专门应对“还有没观测到的混淆变量”——就像法院引入独立证人,给评审增加一道保险。

选哪种变体,取决于业务假设:效应是否恒定、是否存在可信的工具变量。评委制度不变,但裁决标准因案而异——这正是方法论套件的魅力。

θ^DML1=1K∑k=1Kθ^(k)\displaystyle \hat{\theta}_{\text{DML1}} = \frac{1}{K}\sum_{k=1}^{K} \hat{\theta}^{(k)}
每一折都产出一个独立的“药效读数”,K 个读数取平均,就得到一个更稳的最终结论。
  1. 每折估计$\hat{\theta}^{(k)}$ 是第 $k$ 折主样本上计算出的处理效应估计。
    θ^(k)\hat{\theta}^{(k)}
  2. 求平均$\frac{1}{K}\sum_{k=1}^{K}$ 对 K 折结果做算术平均,减少单折随机波动。
    1K∑k=1Kθ^(k)\frac{1}{K}\sum_{k=1}^{K} \hat{\theta}^{(k)}
  3. 聚合估计量$\hat{\theta}_{\text{DML1}}$ 是最终汇报给决策者的因果效应。
    θ^DML1\hat{\theta}_{\text{DML1}}

性能与优化

评审制度不仅要公正,还要高效。交叉拟合最迷人的理论性质,是它让 Double ML 的估计误差以 $\sqrt{n}$ 的速率收敛到零:

这一性质带来极高的 样本效率:即使没有海量数据,DML 也能给出可靠的因果结论,对中小规模业务数据尤其友好。作为对比,朴素的两阶段回归往往因为过拟合而下沉为 $n^{-1/4}$ 甚至更慢的速率,仿佛评审团里混进了“背答案”的委员。

要让这套框架发挥最佳性能,实践中需要注意几点 超参调优:折数 K 通常取 3 到 5,太少则评委不够多元,太多则每折样本太薄;辅助模型的复杂度要匹配样本量,高维稀疏数据上应加上 Lasso 或弹性网正则化;处理效应若随人群变化,还可以引入异质性模型做分层评估。优化的目标不是“拟合得最准”,而是“因果估计最稳”。

θ^−θ0=Op ⁣(n−1/2)\displaystyle \hat{\theta} - \theta_0 = O_p\!\left(n^{-1/2}\right)
样本量每扩大 4 倍,估计误差大约缩小一半——这是参数估计的“最优速度”,和直接用简单平均估期望一样快。
  1. 估计误差$\hat{\theta} - \theta_0$ 是估计值与真实因果效应之间的差距。
    θ^−θ0\hat{\theta} - \theta_0
  2. 概率收敛$O_p(\cdot)$ 表示依概率有界,即误差随样本增大在统计意义上趋向 0。
    Op(n−1/2)O_p\left(n^{-1/2}\right)
  3. 速率含义$n^{-1/2}$ 即“根号 n 分之一”,达到参数估计的最优收敛速率。
    n−1/2n^{-1/2}

实战应用

从药监局走出来,这套方法论已经在互联网与公共政策中落地生根。当我们需要回答“某个动作是否真的带来了改变”时,交叉拟合与 Double ML 就是最可靠的测量仪。

第一个典型场景是营销评估。某电商平台想验证“发放 50 元优惠券能否带来增量购买”。直接对比领券与未领券用户的 GMV 会有偏差,因为领券用户本来就更有购买意愿。用 DML 建模:第一阶段用用户历史行为预测 GMV 和领券概率,第二阶段在残差上估计优惠券的净效应,进而计算投放回报:

第二个场景是政策评估。某城市调整了最低工资标准,想判断它对就业率的影响。不同城区、不同行业的劳动者构成差异巨大,直接比较政策前后会出现系统性偏差。用 DML 在区域特征上做残差化,可以得到政策对就业率的因果效应,为后续调整提供量化依据。

第三个场景是可解释分析。传统机器学习给出的是“预测”,DML 可以把某个特征(如“配送时长”)当作处理变量,估计它对“用户复购”的因果贡献。这为特征归因、AB 实验复盘提供了比 SHAP 相关贡献更进一步的因果视角——真正回答了“如果把配送时长缩短 10 分钟,复购率会提升多少”。

ROI=θ^×N×SˉCtotal\displaystyle \text{ROI} = \frac{\hat{\theta} \times N \times \bar{S}}{C_{\text{total}}}
把每位用户的因果增量,乘以用户规模与客单价,再除以总投放成本,就得到广告投放的真实回报率。
  1. 因果增量$\hat{\theta}$ 是每位用户由优惠券带来的 GMV 增量。
    θ^\hat{\theta}
  2. 规模放大$N \times \bar{S}$ 是受影响的用户数乘以平均客单价,把个体效应放大为收入增量。
    N×SˉN \times \bar{S}
  3. 成本对比$C_{\text{total}}$ 为总投放成本(含券面金额与渠道费用)。
    CtotalC_{\text{total}}
  4. 回报率ROI 为增量收入与成本的比值,超过 1 说明投放值得继续。
    θ^×N×SˉCtotal\frac{\hat{\theta} \times N \times \bar{S}}{C_{\text{total}}}

AI 应用场景

广告投放的增量收益评估

阶段:因果推断与模型评估

解决的问题:传统渠道归因把“看了广告就下单”都算作广告功劳,忽略了高意向用户本就会购买。DML 通过残差化剥离用户历史行为、偏好等混淆变量,在交叉拟合的保护下估计“广告带来的增量订单”,让每一分投放预算都花得明白。

具体案例:某跨境电商对 50 万用户投放新品优惠券,使用 DML 建模用户历史购买频次、浏览深度、客单价等 23 个特征,估计出优惠券的增量购买效应约为 0.38 单/人,ROI 为 2.7,高于传统最后点击归因估算的 1.4。市场团队据此把预算向高响应人群倾斜,整体 ROI 提升 41%。

公共政策的因果效应评估

阶段:政策评估与决策支持

解决的问题:政策实施往往伴随大量地区特征差异,简单前后对比无法区分政策效应与经济趋势。DML 对地区特征建模残差,用交叉拟合保证估计的无偏性,让政策制定者看到“去掉背景趋势后,政策本身带来多少改变”。

具体案例:某省研究“最低工资上调 15% 对中小企业就业率的影响”。研究团队以 280 个区县的面板数据为样本,用 DML 控制产业结构、平均工资、城镇化率等混淆变量,估计出政策对就业率的平均效应约为 −1.2%,且置信区间收窄,为后续分行业调整提供了依据。

可解释 AI 的特征因果归因

阶段:模型解释与归因分析

解决的问题:SHAP 等解释工具回答“特征如何参与预测”,却不能回答“干预特征会带来什么变化”。DML 把某个关键特征当作处理变量,估计它对目标的因果效应,为模型解释提供了“如果怎么做,结果会怎样”的 actionable 洞见。

具体案例:某外卖平台希望理解“配送时长”对“用户复购”的影响。平台用 DML 控制天气、距离、商家出餐速度等混淆因素,发现配送时长每缩短 10 分钟,复购概率平均提升 2.3 个百分点。该结论直接支撑了运力调度的优先级决策。

Python 演示

python58 行
import numpy as npfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import KFold  class DoubleMLCrossFit:    """带交叉拟合的 Double ML 估计器"""     def __init__(self, n_folds=5, model_y=None, model_d=None):        self.n_folds = n_folds        self.model_y = model_y if model_y is not None else RandomForestRegressor(            n_estimators=100, random_state=42)        self.model_d = model_d if model_d is not None else RandomForestRegressor(            n_estimators=100, random_state=42)        self.theta_hat_ = None        self.resid_y_ = None        self.resid_d_ = None     def fit(self, X, D, Y):        n = len(Y)        self.resid_y_ = np.zeros(n)        self.resid_d_ = np.zeros(n)        kf = KFold(n_splits=self.n_folds, shuffle=True, random_state=42)        for train_idx, test_idx in kf.split(X):            self.model_y.fit(X[train_idx], Y[train_idx])            g_hat = self.model_y.predict(X[test_idx])            self.model_d.fit(X[train_idx], D[train_idx])            m_hat = self.model_d.predict(X[test_idx])            self.resid_y_[test_idx] = Y[test_idx] - g_hat            self.resid_d_[test_idx] = D[test_idx] - m_hat        theta = np.sum(self.resid_d_ * self.resid_y_) / np.sum(self.resid_d_ ** 2)        self.theta_hat_ = theta        return self     def summary(self):        n = len(self.resid_y_)        sigma2 = np.mean(self.resid_y_ ** 2 * self.resid_d_ ** 2)        se = np.sqrt(sigma2 / n) / np.mean(self.resid_d_ ** 2)        return {"theta_hat": self.theta_hat_, "std_err": se, "n": n}  def simulate_data(n=1000, seed=1):    rng = np.random.RandomState(seed)    X = rng.normal(size=(n, 3))    D = (0.5 * X[:, 0] + rng.normal(size=n) > 0).astype(float)    Y = 1.2 * D + 0.8 * X[:, 0] + 0.3 * X[:, 1] + rng.normal(size=n)    return X, D, Y  if __name__ == "__main__":    X, D, Y = simulate_data()    dml = DoubleMLCrossFit(n_folds=4)    dml.fit(X, D, Y)    est = dml.summary()    print("DML estimate of treatment effect:", round(est["theta_hat"], 4))    print("95% CI: [%.4f, %.4f]" % (        est["theta_hat"] - 1.96 * est["std_err"],        est["theta_hat"] + 1.96 * est["std_err"]))
目的:在合成数据上实现带交叉拟合的 Double ML,估计处理变量 D 对结果 Y 的因果效应,并给出 95% 置信区间。真实效应设定为 1.2,估计结果应在 1.2 附近。
  1. for train_idx, test_idx in kf.split(X):每一轮把数据划分为训练集与验证集,让模型在补集上训练。
  2. self.model_y.fit(X[train_idx], Y[train_idx])第一阶段:拟合“用 X 预测 Y”的结果模型 $\hat{g}$。
  3. self.resid_y_[test_idx] = Y[test_idx] - g_hat在验证集上构造结果残差,用没见过该样本的模型来预测,防止泄漏。
  4. theta = np.sum(self.resid_d_ * self.resid_y_) / np.sum(self.resid_d_ ** 2)第二阶段:对两条残差做回归,得到因果效应估计。
  5. se = np.sqrt(sigma2 / n) / np.mean(self.resid_d_ ** 2)计算标准误,用于构造置信区间。
  6. D = (0.5 * X[:, 0] + rng.normal(size=n) > 0).astype(float)模拟中处理变量受混淆变量 X0 影响,制造“本就不像”的处理组与对照组。

常见误区

误区交叉拟合不就是 K 折交叉验证吗?我用 train_test_split 做交叉验证已经很久了,既然都能防止过拟合,为什么要单独发明一个词?

正解两者目标不同。交叉验证是为了选超参数、比较模型,关心的是“预测误差”;交叉拟合是为了给后续因果估计提供“从未见过主样本”的辅助模型,关心的是“估计量无偏”。交叉拟合不调参,它把每一折的残差拼起来直接做第二阶段回归。打个比方:交叉验证是“模拟考试挑辅导书”,交叉拟合是“换一批考官监考期末考试”。

为何常见:两者都长着“K 折轮换”的模样,初学者看到相似的操作流程,就容易忽略目标差异。

误区机器学习不都是“数据越多越好”吗?我把全部数据喂给模型训练,再在全部数据上评估,结果不也更稳定吗?

正解如果辅助模型在评估样本上训练过,它会把针对样本的“背答案”记忆当作规律,导致残差偏小、因果估计产生正则化偏差。交叉拟合的核心价值就是切断这条泄漏链路:每个样本的残差,都来自一个从未见过它的模型。就像让选手自己给自己打分,分数必然虚高。

为何常见:“用更多数据更准”的直觉在普通预测任务里成立,但因果估计的目标是“干净残差”,不是“最小训练误差”。

误区既然要控制混淆变量,那就把能拿到的特征全部丢进 X,特征越多控制得越干净,反正随机森林能处理高维。

正解过度调整同样有害。如果某个变量是处理 D 导致的结果(中介变量),把它放进 X 会“吸收”掉一部分真实的处理效应,估计值被压低。正确的做法是只控制“同时影响 D 和 Y 的混淆变量”,且要借助领域知识判断变量间的因果结构。

为何常见:机器学习习惯了“特征越多越好”,但因果推断里的变量选择遵循的是因果图逻辑,而非预测力逻辑。

误区用了交叉拟合之后,DML 的预测精度应该也会提升不少,毕竟它更稳健了。

正解交叉拟合改善的是因果估计的偏差与置信区间覆盖,不是辅助模型的 R²。辅助模型可能依旧预测得不完美,但只要 Neyman 正交性成立,它的误差不会向 $\hat{\theta}$ 泄漏。换句话说,交叉拟合让你“结论更可信”,但不保证“中间模型更聪明”。

为何常见:人们把“估计更稳健”直观等同于“模型更好”,忽略了因果估计与预测是两种评价体系。

面试题

Q1. 反事实 $Y(1) - Y(0)$ 中,$Y(0)$ 表示什么?

单选题 · easy

  • A.个体未接受处理的结果← 正确答案
  • B.个体接受处理的结果
  • C.全体样本的平均结果
  • D.处理组的平均结果

答案:A。$Y(0)$ 是“如果这个人没有接受处理,会观测到的结果”,与 $Y(1)$ 构成一对平行世界。B 描述的是 $Y(1)$,C 和 D 是总体层面的汇总统计,不是个体潜在结果。

Q2. 下列哪项最适合形容“混淆变量”?

单选题 · easy

  • A.同时影响处理和结果的变量← 正确答案
  • B.只影响结果的随机噪声
  • C.由处理变量造成的后果
  • D.与处理结果完全无关的变量

答案:A。混淆变量既影响是否接受处理,又影响最终结果,造成“相关不等于因果”。B 是噪声,C 是中介变量,D 既不影响处理也不影响结果,都不构成混淆。

Q3. 交叉拟合中为什么不能在同一数据上训练并评估模型?

单选题 · mid

  • A.训练耗时将会成倍增加
  • B.模型会记住样本导致评估虚高← 正确答案
  • C.数据量会被白白浪费掉
  • D.会导致混淆变量再次出现

答案:B。模型在训练样本上会记住个体细节而非规律,用同一批数据评估就像“自己出题自己考”,误差被乐观低估。交叉拟合让评估样本对模型透明,保证残差干净。C 是交叉拟合要解决的反面,D 与本题无关。

Q4. DML 第一阶段残差化的主要目的是什么?

单选题 · mid

  • A.消除混淆变量对因果的干扰← 正确答案
  • B.把目标变量转换成分类变量
  • C.增大样本数量来降低方差
  • D.让处理变量变得可以被观测

答案:A。第一阶段用 X 分别预测 Y 和 D,残差中剥离了 X 的影响,第二阶段看“干净的处理”与“干净的结果”是否共变。B、C、D 描述的都是残差化不做的事。

Q5. 下列关于 Neyman 正交的说法,正确的是?

多选题 · mid

  • A.使估计量对第一阶段偏差不敏感← 正确答案
  • B.允许第一阶段的模型随意使用
  • C.是 Double ML 稳健性的关键← 正确答案
  • D.可以完全消除所有随机抽样误差

答案:AC。Neyman 正交让得分函数对辅助模型的误差一阶不敏感,因此第一阶段模型的“小毛病”不会污染因果估计,这正是 DML 稳健的核心机制。但它不消除抽样误差,B 和 D 夸大其词。

Q6. PLR 与 PLIV 的核心区别是什么?

单选题 · mid

  • A.PLR 不需处理变量而 PLIV 需要
  • B.PLIV 引入工具变量来应对遗漏← 正确答案
  • C.PLR 使用线性模型而 PLIV 不用
  • D.PLIV 比 PLR 要求样本量更小

答案:B。PLR 直接估计处理效应的线性方程,PLIV 额外引入工具变量,用来抵御未观测混淆变量的干扰。两者都需要处理变量,也都可以使用非线性机器学习模型,因此 A、C、D 均不正确。

Q7. 关于 DML1 与 DML2,下列说法正确的是?

多选题 · hard

  • A.DML2 聚合时需要乘以样本占比← 正确答案
  • B.DML1 对多折估计结果取平均← 正确答案
  • C.两者在统计性质上完全相同
  • D.DML2 收敛速度得以略微提升← 正确答案

答案:ABD。DML1 把每折独立算出的 $\hat{\theta}^{(k)}$ 取算术平均;DML2 把所有残差合并后整体回归,理论上需要按样本占比加权且收敛条件更宽松。两者统计性质并不完全相同,C 错误。

Q8. 交叉拟合为什么有助于达到根号 n 收敛?

单选题 · hard

  • A.因为验证集参与了模型训练过程
  • B.因为辅助模型未接触主评估样本← 正确答案
  • C.因为所有数据都用于了两阶段估计
  • D.因为模型复杂度因此自动降低了

答案:B。辅助模型在主评估样本上保持“陌生”,其过拟合偏差不会进入第二阶段估计,从而避免收敛速率退化到 $n^{-1/4}$。A 恰好是反面,C 是交叉验证而非交叉拟合,D 与复杂度无关。

Q9. 以下哪些场景适合用 Double ML 评估?

多选题 · easy

  • A.评估广告投放带来的增量购买← 正确答案
  • B.预测用户未来一周的活跃天数
  • C.评估调薪政策对离职率的影响← 正确答案
  • D.判断商品标题是否包含错别字

答案:AC。Double ML 回答“处理对结果的因果效应”,广告投放和调薪政策都有明确的处理变量与结果变量。B 是纯预测任务,D 是文本分类任务,都不涉及因果推断。

Q10. 交叉拟合与普通交叉验证的本质区别是?

单选题 · mid

  • A.前者保估计后者选模型,目标各异← 正确答案
  • B.前者是深度学习专用后者是通用技术
  • C.前者仅用于时间序列而后者不限制
  • D.前者不使用标签而后者依赖标签训练

答案:A。交叉验证用于模型选择与超参调优,关心预测误差;交叉拟合用于为因果估计提供“围观”辅助模型,关心估计量的无偏性。B、C、D 都在技术适用范围上做了错误限定。