城市园艺师小林想证明一款叫“绿灵”的营养针真的有效。可问题是:同一盆绿萝,打了针就不可能回到没打针的状态;没打针的那盆,也永远看不到打过针的自己。我们最多只能看到两个平行世界中的一个,却要推断两个世界的差距——这就是个体处理效应(ITE)估计的原点。更麻烦的是,小林店里的花不是随机分组:阳光好的窗台花更容易被店员顺手打针,而阳光本身就让花更高。于是“打了针的一组更高”这句话里,掺着光照、浇水习惯、店员偏好等大量杂质。这篇文章用“绿萝营养针”的故事贯穿始终,讲清 ITE 是什么、偏差从哪里来、怎样用反事实推理、uplift 建模、倾向性评分和双重机器学习一步步把脏水过滤干净。

岗位关联

对 AI 从业者而言,理解 ITE 的偏差来源并用倾向评分、DML 等方法校正,是在因果推断与 uplift 建模项目中交付“可信干预决策”的核心能力,也是从预测工程师迈向决策智能工程师的关键一跳。

目录
  1. 可视化演示
  2. ITE基本概念
  3. 偏差来源总览
  4. 混淆变量
  5. 选择偏差
  6. 反事实推理
  7. Uplift建模
  8. 倾向性评分
  9. 双重机器学习
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

通过潜在结果对比、混淆变量DAG图和倾向性评分匹配,直观展示ITE估计中的偏差来源与校正方法。

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

个体处理效应ITE 同一个体接受处理(Y1)与不接受处理(Y0)的结果之差 τ = Y(1) - Y(0) 是因果效应的核心度量 τi = Yi(1) - Yi(0) 反事实推理:只能观察到一个结果,另一个需推断

ITE基本概念

小林挑了一盆编号 08 的绿萝放在工作台上。他想问的问题非常具体:“如果给 08 号打一针绿灵,30 天后的叶子长度,到底比不打针时高多少?”这不是问“所有绿萝平均高多少”,而是问“这一盆”的专属答案。在因果推断里,这种针对单个个体的干预效果,就叫个体处理效应(Individual Treatment Effect,ITE)。

要精确定义它,统计学家发明了“潜在结果框架”:把每一盆花想象成同时活在两个平行世界。世界 A 里它打了针,长得高高的,记录为 \(Y(1)\);世界 B 里它没打针,长得矮一点,记录为 \(Y(0)\)。这两个世界只差在“是否打针”,其他条件一模一样。ITE 就是这两个世界里同一盆花的高度差。

小林似乎明白了:ATE 像一个班级的平均分,ITE 却是每个学生的单科增分。但麻烦立刻来了——他不可能让同一种绿萝既打了针又没打针,时间只有一条线,两个世界只能选一个。这正是整篇文章要面对的难题:数据天生残缺,因果需要推理。

ITEi=Yi(1)−Yi(0),ATE=E[Yi(1)−Yi(0)]ITE_i = Y_i(1) - Y_i(0), \qquad ATE = \mathbb{E}\big[Y_i(1) - Y_i(0)\big]
这一公式说明:ITE 是“同一棵植株”在两个平行世界的命运差;ATE 则是把这种个体差在全群体上取平均。
  1. \(Y_i(1)\)第 i 盆花打针后的高度——这是“打了绿灵”世界里小林的08号绿萝会达到的叶子长度。
    Yi(1)=干预组的潜在结果Y_i(1) = \text{干预组的潜在结果}
  2. \(Y_i(0)\)第 i 盆花不打针的高度——这是“没打绿灵”世界里同一盆花的高度,是永远看不到的反事实另一半。
    Yi(0)=对照组的潜在结果Y_i(0) = \text{对照组的潜在结果}
  3. \(ITE_i\)个体因果效应——把两个平行世界相减,得到只属于这一盆花的净效果,正值代表打了更值。
    ITEi=Yi(1)−Yi(0)ITE_i = Y_i(1) - Y_i(0)
  4. \(\mathbb{E}[\cdot]\)全部植株取平均——把 100 盆花的 ITE 逐个算出来再求均值,得到群体层面的平均处理效应 ATE。
    ATE=1n∑i=1n(Yi(1)−Yi(0))ATE = \frac{1}{n}\sum_{i=1}^n \big(Y_i(1) - Y_i(0)\big)

偏差来源总览

小林忍不住做了个粗糙比较:打了针的 20 盆花平均比没打针的 20 盆高出 5 厘米。他兴冲冲要把“绿灵有效”贴到店门口,却听到店员嘀咕:“打针的那批花全摆在南窗台,本来就晒太阳多,当然长得高。”小林愣住了——观测到的 5 厘米差异,真能算成营养针的功劳吗?

用数学语言拆开这个问题。观测差异是处理组平均结果减去对照组平均结果:\(\bar{Y}_{T=1}-\bar{Y}_{T=0}\)。表面看它似乎是 ITE 的平均,但两组本来就不一样,所以这个差值里面混杂着“组间基线差异”。把期望拆开,观测差异可以分解为“处理组内部的平均因果效应”加上“选择偏差”两段。

小林这才明白,观测差异是“功劳”和“出身”的混合体。选择偏差的背后站着两个捣蛋鬼:混淆变量和样本自选择。接下来两节,就分别会审问这两个家伙。

E[Y∣T=1]−E[Y∣T=0]=E[Y(1)−Y(0)∣T=1]⏟ATT+E[Y(0)∣T=1]−E[Y(0)∣T=0]⏟Selection Bias\mathbb{E}[Y\mid T=1] - \mathbb{E}[Y\mid T=0]=\underbrace{\mathbb{E}\big[Y(1)-Y(0)\mid T=1\big]}_{ATT}+\underbrace{\mathbb{E}\big[Y(0)\mid T=1\big] - \mathbb{E}\big[Y(0)\mid T=0\big]}_{\text{Selection Bias}}
观测差异不是因果差异,它等于“处理组人群真实疗效”加上“两组如果都不打针时天然存在的差距”。
  1. \(\mathbb{E}[Y\mid T=1]\)打针组的平均高度——店里的观测数据,直接计算可得。
    E[Y∣T=1]=处理组观测均值\mathbb{E}[Y\mid T=1] = \text{处理组观测均值}
  2. \(\mathbb{E}[Y\mid T=0]\)不打针组的平均高度——同样直接观测得到,两组一减就是小林看到的 5 厘米。
    E[Y∣T=0]=对照组观测均值\mathbb{E}[Y\mid T=0] = \text{对照组观测均值}
  3. \(ATT\)处理组个体的平均因果效应——只针对“真的打了针”这批花,它们打针与不打针的差值平均,这是干净的因果部分。
    ATT=E[Y(1)−Y(0)∣T=1]ATT = \mathbb{E}\big[Y(1)-Y(0)\mid T=1\big]
  4. 选择偏差两组如果都不打针,本来就会有的高度差距——南窗台的阳光让打针组底子更好,于是这一项为正,污染了观测差异。
    Bias=E[Y(0)∣T=1]−E[Y(0)∣T=0]\text{Bias} = \mathbb{E}\big[Y(0)\mid T=1\big] - \mathbb{E}\big[Y(0)\mid T=0\big]

混淆变量

店里的真实场景中,阳光照射量是一个悄悄使坏的变量:它同时影响“店员会不会给这盆花打针”(阳光好的花显眼,店员更愿意伺候)和“花长得多高”(阳光本身就是养分)。这种既推着干预走、又拉着结果跑的变量,就是混淆变量。如果把 T 和 Y 的相关全算成因果,那就像把太阳的功劳记到了营养针头上。

如何识别这种后门路径?在有向因果图中,混淆变量 X 同时指向处理 T 和结果 Y,形成一条“后门路径”。Pearl 的后门准则告诉我们:只要把 X 分层控制住,再在各层内比较打针与不打针,就能阻断这条后门,还原出真实的因果效应。直觉上就是小林把花分成“南窗台组”“北窗台组”等细类,在光照相同的前提下再比营养针的增量。

控制混淆听上去很简单:分组对比不就行了?但现实中的 X 有成百上千个维度,手工分层很快失控。更隐蔽的问题在于,如果小林只挑“长得好看的花”来打针,单独的分层又解决不了系统性偏向——这就要引出选择偏差这一孪生兄弟。

P(y∣do(T=t))=∑xP(y∣T=t,X=x) P(x)P\big(y\mid do(T=t)\big) = \sum_x P(y\mid T=t, X=x)\,P(x)
这个公式的意思是:想知道“人为把针打下”的效果,只需按混淆变量 X 分层,算每层里打针与不打针的结果差,再按总体中 X 的占比加权汇总。
  1. \(do(T=t)\)强制施加处理——小林不由分说给某盆花打针,切断所有反过来影响“是否打针”的路径,这种操作让因果关系浮出水面。
    do(T=t)=平行世界的强制干预do(T=t) = \text{平行世界的强制干预}
  2. \(P(y\mid T=t, X=x)\)层内的条件概率——在光照水平为 x 的花盆堆里,统计打针(或没打针)后长到高度 y 的概率。
    P(y∣T=t,X=x)=层内结果分布P(y\mid T=t, X=x) = \text{层内结果分布}
  3. 累加求和 \(\sum_x\)按 X 混合权重汇总——把南窗台、北窗台、背阴处这些层的因果效果,按它们在店里真实占比加权相加。
    ∑xP(x)⋅P(y∣T=t,X=x)\sum_x P(x) \cdot P(y\mid T=t, X=x)
  4. 整体等式左边是“如果全店都打针”的虚拟世界结果,右边是由可观测层内数据拼出来的估计,二者相等就说明 X 完全解释了组间偏差。
    P(y∣do(T=t))=EX[P(y∣T=t,X)]P(y\mid do(T=t)) = \mathbb{E}_X\big[P(y\mid T=t, X)\big]

选择偏差

小林后来发现,店员打针有个怪习惯:专挑已经长得精神的花下手,蔫了吧唧的绿萝反而被冷落。这意味着“打不打针”不是随机抛硬币,而是花自身的状态悄悄做了选择——这就是选择偏差。它让处理组和对照组先天不在同一起跑线,即使没有混淆变量,直接相减也会冤枉或吹捧营养针。

选择偏差的数学本质十分直白:我们缺少一个关键的反事实数据。处理组的花如果没打针会是什么样?没人看见过。这缺失的 \(Y(0)\) 如果与实际的对照组 \(Y(0)\) 均值不同,就产生了偏差。换句话说,选择偏差就是“处理组的潜在未处理结果”与“对照组的实际未处理结果”之间的差距。

要消除选择偏差,最朴素的想法是“给两边的花重新配平”:长得好的花在两组里比例相当。这个灵感直接指向两个著名工具——倾向性评分(给每盆花算被打针的概率)和双重机器学习(用算法把混合因素剥离干净)。但在动手校正之前,还得先理解把缺失数据补回来的思想基础:反事实推理。

Biassel=E[Y(0)∣T=1]−E[Y(0)∣T=0]\text{Bias}_{\text{sel}} = \mathbb{E}\big[Y(0)\mid T=1\big] - \mathbb{E}\big[Y(0)\mid T=0\big]
如果两组的花在“不打针时”本来就会长一样高,偏差为零;但只要打针不是随机分配,这差值就几乎不可能为零。
  1. \(\mathbb{E}[Y(0)\mid T=1]\)打针组虚拟的不打针高度——店里的打针组花全部实际打了针,它们的 \(Y(0)\) 属于永远缺失的反事实,只能靠假设或模型估计。
    E[Y(0)∣T=1]=缺失的反事实组均值\mathbb{E}\big[Y(0)\mid T=1\big] = \text{缺失的反事实组均值}
  2. \(\mathbb{E}[Y(0)\mid T=0]\)对照组真实的不打针高度——这批花确实没打针,观测得到,是“不打针世界”的真实样本。
    Biassel=组间基线差\text{Bias}_{\text{sel}} = \text{组间基线差}

反事实推理

“反事实”四个字听起来像科幻,其实小林的日常天天在做:他盯着没打针的 09 号绿萝,心里嘀咕“如果当初给它打一针,现在该多高”。这个想象出的高度就是反事实结果。因果推断的全部艺术,都在于如何把这永远缺一半的数据补得让人信服。

补回反事实的关键假设叫“可忽略性”(无混淆性、条件交换性)。它说:只要把所有混淆变量 X 都观测到,并且在 X 相同的条件下,打不打针就近似于随机决定。这时,对照组里 X 相同的花的高度,就能当作处理组花的反事实替身。

这个假设既是桥梁也是软肋:如果遗漏了某个隐形的混淆变量(比如盆栽土壤里藏着营养差异),条件独立立刻崩塌,反事实推理就变成空中楼阁。正因如此,业界发展出更贴近业务目标的建模思路——不去纠结每个反事实点有多准,而是直接估计“打针带来的增量”在哪些个体上最明显,这就是 Uplift 建模。

(Y(0),Y(1))⊥ ⁣ ⁣ ⁣⊥T∣X\big(Y(0), Y(1)\big) \perp\!\!\!\perp T \mid X
这句话读作“给定 X 之后,潜在结果与处理方式相互独立”。把复杂话说白:只要两组在光照、土壤、浇水等所有维度上可比,对照组的表现就能代表处理组“如果没打针”的表现。
  1. \((Y(0), Y(1))\)一盆花的两种人生——潜在结果对,同时包含打针与不打针两个虚拟状态,存在于同一个体的假设集合里。
    (Y(0),Y(1))=双世界结果(Y(0), Y(1)) = \text{双世界结果}
  2. \(\perp\!\!\!\perp\)条件独立符号——左边潜在结果与右边处理方式之间没有残留关联,像两股被 X 捋顺的麻绳互不缠绕。
    ⊥ ⁣ ⁣ ⁣⊥=给定X后互不影响\perp\!\!\!\perp = \text{给定X后互不影响}
  3. \(T\)处理指示变量——1 代表打了针,0 代表没打针。
    T∈{0,1}T \in \{0, 1\}
  4. \(\mid X\)以混淆变量为条件——在每一组相同 X 的薄层内部做比较,层内花是“可交换的”,组间差异就是因果。
    X=光照、浇水、土壤等协变量X = \text{光照、浇水、土壤等协变量}

Uplift建模

小林从“绿色植物平均能不能长高”这个群体问题,绕回了开店的终极痛点:货架上的每一盆花都不一样,给哪盆打针最划算?小林的直觉是对的——平均疗效 5 厘米掩盖了一个事实:有的花打了针蹿高 10 厘米,有的花打了反而黄叶。Uplift 建模的目标,正是预测每个个体在干预下的“增量收益”。

Uplift 模型的核心量是条件平均处理效应(CATE):把协变量 X(光照、品种、土壤)代入,输出该个体的期望增益。它与 ATE 的区别很微妙:ATE 是全体平均的一刀切,CATE 是按个体特征给定的差异化疗效。有了它,小林就能给每盆花贴标签:高增益的“红牌优先打”,低增益的“省下营养针”。

计算 CATE 的朴素做法是分开训练两个模型:一个预测打针后的高度,一个预测不打针的高度,相减即得。但这方法在小样本里误差会叠加。实际工程中更常用的是一类“元学习器”(Meta-Learner),如 T-Learner、S-Learner、X-Learner,把反事实的缺失数据通过插补巧妙地填平。不过还有更严谨的一步要补上——给两组花重新配平基线,这正是倾向性评分的用武之地。

τ(x)=E[Y(1)−Y(0)∣X=x]\tau(x) = \mathbb{E}\big[Y(1) - Y(0) \mid X = x\big]
这个公式定义一个“个性化疗效函数”:它把所有特征为 x 的花聚成一群人,这群人打针与不打针的平均高度差就是 \(\tau(x)\)。
  1. \(\tau(x)\)条件平均处理效应函数——以特征 \(x\) 为输入的增益函数,是 Uplift 模型的预测目标。
    τ(x)=CATE\tau(x) = \text{CATE}
  2. \(\mathbb{E}[Y(1)-Y(0)\mid X=x]\)特征层内的效应平均——把所有光照、品种相同的花归为一层,层内两种结果的差值平均。
    打针,若  τ(x)>c\text{打针,若}\;\tau(x) > c

倾向性评分

店员偏爱给精神的花打针,导致两组花的“出身”不一样。小林苦思冥想:能不能给每盆花算一个“天生就容易被店员打针”的分数?分数相同的两盆花,一个打了针一个没打针,互相就能当对方的平行世界替身。这个分数就是倾向性评分。

倾向性评分定义为在给定协变量 X 时个体接受处理的条件概率:\(e(x)=P(T=1\mid X=x)\)。它通常用逻辑回归或梯度提升树来估计。有了它,最经典的校正手段是逆概率加权(IPW):打针组每盆花的权重取 \(1/e(x)\),不打针组每盆花权重取 \(1/(1-e(x))\),相当于把“阳光好的花容易被打针”这个倾向给抵消掉,重构一个人造的随机实验。

倾向性评分是反事实推理的实用化:它用一个数字浓缩了所有协变量的维度,让匹配、加权、分层都变得可行。但它的软肋也明显——假如阳光的影响很复杂、不是逻辑回归能描述的,e(x) 估计不准,加权结果就会再次带偏。要处理更高维、更非线性的混淆结构,需要借助现代机器学习的更高级武器:双重机器学习。

τ^IPW=1n∑i=1n[TiYie(Xi)−(1−Ti)Yi1−e(Xi)]\hat{\tau}_{IPW}=\frac{1}{n}\sum_{i=1}^n\left[\frac{T_i Y_i}{e(X_i)}-\frac{(1-T_i)Y_i}{1-e(X_i)}\right]
这个公式对每盆花做“加权表演”:打针的花用其被打针概率的倒数放大,没打针的花用其没被打针概率的倒数放大,最后相减就得到校正后的平均因果效应。
  1. \(T_i Y_i / e(X_i)\)打针组的加权结果——把打针的第 i 盆花的实际高度 \(Y_i\) 除以它“本来就会被打针”的概率。如果这盆花被店员打针的倾向只有 0.2,那它的权重就是 5,代表它要代表 5 个潜在对手。
    TiYie(Xi)=处理组逆概率加权\frac{T_i Y_i}{e(X_i)} = \text{处理组逆概率加权}
  2. \((1-T_i)Y_i/(1-e(X_i))\)不打针组的加权结果——同理,给不打针但“本该被打针”的稀有样本更大权重。
    (1−Ti)Yi1−e(Xi)=对照组逆概率加权\frac{(1-T_i)Y_i}{1-e(X_i)} = \text{对照组逆概率加权}
  3. \(\frac{1}{n}\sum_{i=1}^n\)全样本平均——两端加权结果在全体样本上平均,得到校正后的 ATE 估计值。
    τ^IPW=平均处理效应估计\hat{\tau}_{IPW} = \text{平均处理效应估计}

双重机器学习

小林发现,光照对绿萝高度的影响并非直线:盛夏的暴晒反而会灼伤叶片,花盆大小还会与阳光产生交互。逻辑回归算出的倾向分对不上真实数据。这时统计学家 Chernozhukov 等人递来了一整套“双重机器学习”(Double Machine Learning, DML)方案:让机器学习负责拟合复杂的混淆结构,让因果参数估计全程享受“正交化”保护。

DML 的思路像给数据做两次大扫除。第一扫,用机器学习模型 \(m(X)\) 预测结果变量 Y(花的高度),得到“结果残差” \(Y-m(X)\);第二扫,用机器学习模型 \(e(X)\) 预测处理变量 T(打不打针),得到“处理残差” \(T-e(X)\)。两个残差把协变量 X 能预测的成分全部剥离,剩下的部分几乎不含混淆信息。最后一步,让两个残差对残差做简单回归,斜率就是稳健的因果效应。

DML 还有一道重要工序叫交叉拟合:把数据切 K 折,轮流用其中 K-1 折训练 m 和 e,再在剩余一折上计算残差,循环多次。这样避免了机器学习模型过拟合自己那份数据后“带偏”因果估计。至此,小林终于有了完整武器库:用反事实补缺、用 Uplift 识别个体、用倾向评分重平衡、用 DML 彻底正交化,把那 5 厘米观测差异里的水分拧得干干净净。

θ^=∑i=1n(Ti−e^(Xi))(Yi−m^(Xi))∑i=1n(Ti−e^(Xi))2\hat\theta=\frac{\sum_{i=1}^n \big(T_i-\hat e(X_i)\big)\big(Y_i-\hat m(X_i)\big)}{\sum_{i=1}^n \big(T_i-\hat e(X_i)\big)^2}
这个公式像“对残差做最小二乘”:分子是处理残差与结果残差的协方差,分母是处理残差的方差,二者相除得到去除混淆后的因果斜率。
  1. \(T_i-\hat e(X_i)\)处理残差——第 i 盆花实际是否打针,减去模型预测的它“该被打针”的概率,剩余的是超出预测的突发干预,近似随机的扰动。
    处理残差=Ti−e^(Xi)\text{处理残差} = T_i - \hat e(X_i)
  2. \(Y_i-\hat m(X_i)\)结果残差——实际高度减去模型基于光照土壤预测的高度,剩下的部分就是模型解释不了的“意外生长”。
    结果残差=Yi−m^(Xi)\text{结果残差} = Y_i - \hat m(X_i)
  3. \(\sum (T-\hat e)(Y-\hat m)\)残差协方差——两类“意外”是否同步出现?如果突发打针的盆也恰好突发长高,说明营养针真有增量。
    Covariance=∑(Ti−e^i)(Yi−m^i)\text{Covariance} = \sum (T_i-\hat e_i)(Y_i-\hat m_i)
  4. 分母 \(\sum (T-\hat e)^2\)处理残差方差——作为归一化分母,保证估计出的斜率可解释为因果效应而非受处理尺度影响。
    Variance=∑(Ti−e^i)2\text{Variance} = \sum (T_i-\hat e_i)^2

AI 应用场景

电商优惠券的精准投放

阶段:Uplift 建模与增量估计

解决的问题:市场部每次大促都给全量用户发 8 折券,统计发现发券用户比不发券用户多买 20%。但金牌会员本来就会买,这 20% 里躺着巨大的混淆偏差和选择偏差。AI 用反事实推理建立 Uplift 模型,估计每个用户的“增量购买”\(\tau(x)\),只给真正会被券打动的用户发券。

具体案例:某美妆电商用历史订单数据训练 X-Learner,特征包括近 90 天消费频次、浏览品类、价格敏感度。模型发现高活跃用户 \(\tau(x)\) 接近零,沉睡用户却高达 25%。策略调整后,券成本下降 38%,大盘 GMV 反而上升 6%。这正对应小林的故事——不是所有花都该打针。

医疗场景的个性化用药决策

阶段:倾向性评分匹配与偏差校正

解决的问题:医生开的药不是随机处方——重症患者更容易用新药,轻症用老药,直接比较两组康复率会严重低估新药疗效。倾向性评分把每一位病人的病情、年龄、并发症压缩成一个“被开新药的概率”,再对概率相同的病人做匹配,构造虚拟的随机对照试验。

具体案例:某医院评估一款降压新药,纳入 5000 名高血压患者记录。逻辑回归计算倾向分后做 1:1 最近邻匹配,匹配后的两组患者基线完全可比。校正前观测差异显示新药疗效仅提高 3%,匹配后真实疗效跃升至 11%,帮助心内科重新制定用药阶梯策略。

外卖平台的补贴预算分配

阶段:双重机器学习估计异构效应

解决的问题:运营团队想知道给哪些用户发“周末减免”补贴能拉动新订单。天气、商圈热度、用户活跃度等协变量维度高且非线性,单纯的倾向评分线性模型难以充分校正。DML 用梯度提升树拟合 m(X) 和 e(X),残差化后估计每个细分人群的补贴增益。

具体案例:外卖平台对 20 万用户做 DML 分析,发现晚间学校和写字楼场景的补贴增益为正,而住宅区深夜订单无论是否补贴都会自然增长。据此把补贴预算从全量发放调整为场景定向,夜间订单边际增量提升 17%,显著节约补贴支出。

Python 演示

python28 行
import numpy as npfrom sklearn.linear_model import LogisticRegression np.random.seed(2024)n = 6000X1 = np.random.normal(0, 1, n)  # 光照强度:混淆变量 # 光照影响“是否打针”的倾向,产生选择偏差p_t = 1 / (1 + np.exp(-(0.5 + X1)))T = np.random.binomial(1, p_t) # 潜在结果:不打针高度受光照影响;打针后额外增长,且增益随X1变化Y0 = 10 + X1 * 3 + np.random.normal(0, 1, n)ite = 2 + X1Y1 = Y0 + iteY = np.where(T == 1, Y1, Y0) # 朴素估计:直接用观测均值差naive = Y[T == 1].mean() - Y[T == 0].mean()true_ite = ite.mean() # 倾向评分 + IPW加权e = LogisticRegression().fit(X1.reshape(-1, 1), T).predict_proba(X1.reshape(-1, 1))[:, 1]ipw = (np.sum(T * Y / e) - np.sum((1 - T) * Y / (1 - e))) / n print(f"朴素观测差异: {naive:.3f}")print(f"真实平均ITE:  {true_ite:.3f}")print(f"IPW校正估计:  {ipw:.3f}")
目的:一键验证“观测均值差不等于因果效应”并展示 IPW 加权如何把偏差拉回真实值。
  1. p_t = 1 / (1 + np.exp(-(0.5 + X1)))光照越强,花越可能被打针,制造出选择偏差。
  2. Y0 = 10 + X1 * 3 + ...光照本身就让花更高,这是混淆变量的“幕后作用”。
  3. ite = 2 + X1真正的个体处理效应随光照变化,不是常数,呼应 ITE 的异质性。
  4. Y = np.where(T == 1, Y1, Y0)每盆花只暴露在一个世界,缺失的另一半是反事实。
  5. naive = Y[T == 1].mean() - Y[T == 0].mean()天真的观测差异,会把阳光的功劳记到营养针头上。
  6. LogisticRegression().fit(...).predict_proba(...)拟合倾向评分 \(e(x)\),即“这盆花被打针的概率”。
  7. ipw = (np.sum(T * Y / e) - np.sum((1 - T) * Y / (1 - e))) / n用逆概率加权让两组在光照分布上重新平衡,得到干净估计。

常见误区

误区我只要算一下打针组的平均高度减去不打针组的平均高度,得到 5 厘米,这就是营养针的个体处理效应。大家不都这么比较吗?

正解这个 5 厘米是“观测差异”,里面混着太阳的功劳、店员偏好的影响、两组底子不同带来的选择偏差。真要估计 ITE,必须结合反事实框架,至少用倾向性评分或 DML 做校正,否则就像把运动员的汗水都记在教练头上的功劳簿。

为何常见:A/B 测试的思维惯性太强,大家默认“对照组均值就是反事实”,完全忽略观测数据里没有随机化保驾护航。

误区既然要消除混淆,就把所有能测量的变量一股脑都放进回归模型,控制得越全越干净,遗漏任何一个都可能造成偏差。

正解控制变量需要理论约束。如果把中介变量(受处理影响的变量)、对撞变量(同时受处理和结果影响的变量)也放进模型,反而会打开新的偏差路径;这是经典的过度控制偏差。正确做法是像后门准则要求的那样,只控制“同时影响处理和结果、且不被处理反向影响的块(混淆因子)”这一层。

为何常见:机器学习里“特征越多,模型越强”的习惯被照搬到因果推断上,没意识到回归系数的因果解释和预测完全不同。

误区模型算出来平均处理效应是 3 厘米,我就认为每一盆花打了针都能长 3 厘米,谁都可以放心打营养针。

正解ATE 是群体平均值,个体之间的效应差异(异质性)可能非常大。Uplift 建模的全部意义就在于把 \(\tau(x)\) 按个体特征区分开——有的人适合打针,有的人打了反而亏钱。忽略异质性直接套平均值,是“用平均数掩盖个体命运”的典型统计罪过。

为何常见:习惯了回归系数代表“平均影响”的表征,忘记在业务决策里最终干预的客体是单个用户或单株植物。

误区我已经算出了每个用户的倾向分,下一步就把倾向分作为协变量放进最终回归模型里,这样总该消除选择偏差了吧?

正解倾向分放进回归模型不是严格错误,但远不如“加权、匹配、分层”来得直接且稳健。倾向分的指定用途是构造平衡:IPW 加权让两组协变量分布对齐,匹配让两组样本一一配对。把它当普通特征塞进回归,模型的线性假设可能破坏平衡效果,正确做法是先做倾向分层或 IPW,再做因果比较。

为何常见:倾向评分听上去像一个“纠偏特征”,大家本能地当成普通协变量使用,没有理解它本质上是平衡工具而非预测特征。

误区我训练了一个 Uplift 模型,在测试集上 AUC 达到 0.85,说明预测打针增益很准,可以直接上线抢流量了。

正解Uplift 模型预测的是反事实差,测试集上只有一组结果真实存在,另一组是推测的。模型很容易利用特征里与处理分配相关的信息“偷看”答案,导致评估虚高。业界用“分区均值法”或"AUUC"等因果评估指标,并对多个模型做交叉验证,才能减少过拟合到观测混杂上的假象。

为何常见:常规监督学习的 AUC/准确率习惯被无缝迁移到因果任务上,不了解“反事实缺失”导致评估标准和预测任务不同。

面试题

Q1. 在潜在结果框架中,个体处理效应 ITE 的定义是:

单选题 · easy

  • A.打针组平均高度减去未打针组平均高度
  • B.同一植株打针后高度与不打针反事实高度的差← 正确答案
  • C.所有植株打针后高度的算术平均值
  • D.未打针植株高度的方差与均值之比

答案:B。ITE 是在同一单位上做差分,即 \(Y(1)-Y(0)\)。A 是观测层面的组间均值差,属于 ATE 的朴素估计而非个体定义;C 只描述处理组结果;D 是统计量而非因果量。

Q2. 观测数据上,打针组与不打针组平均高度的差异被视为 ITE 估计时,通常面临的最大风险是:

单选题 · easy

  • A.两组内部的光照和习惯差异带来混淆与选择偏差← 正确答案
  • B.样本量必然不足导致标准差增大的技术问题
  • C.数据集中没有时间戳支持的复杂字段信息
  • D.植物的平均高度容易受到季节波动的显著影响

答案:A。观测研究的核心风险是两组不可比——光照这一混淆变量既影响是否打针又影响高度,店员偏好又制造自选择偏差。样本量、时间戳、季节问题都可能存在,但不是“最大、最本质”的因果威胁。

Q3. 关于 ATE 与 ITE 的关系,以下说法正确的有:

多选题 · mid

  • A.ATE 是全体个体 ITE 的算术平均← 正确答案
  • B.ATE 等于单个样本的 ITE 加上固定偏差
  • C.ITE 揭示处理效应在不同个体上的异质性← 正确答案
  • D.个体效应全部相同时 ATE 等于任意个体的 ITE← 正确答案

答案:ACD。ATE 定义为 \(\mathbb{E}[ITE]\),所有个体效应相同时它确实等于任意 ITE,A、D 正确。ITE 能体现异质性,C 正确。B 是错误的表述——ATE 是平均,不是个体 ITE 加某个固定偏差。

Q4. 混淆变量最准确的定义是:

单选题 · mid

  • A.同时影响处理分配和结果变量的变量← 正确答案
  • B.只影响结果但与处理分配无关的变量
  • C.只影响处理分配但与结果无关的变量
  • D.存在于缺失数据中的测量系统误差

答案:A。混淆变量的本质是“双向影响”:它像店里光照一样,既改变店员打针的决策,又直接决定花的高度。B 只是预测特征,C 是工具变量的雏形,D 是测量误差,均不符合混淆定义。

Q5. 要满足“无混淆性/可忽略性”假设,通常需要:

多选题 · mid

  • A.给定协变量 X 后,处理与潜在结果相互独立← 正确答案
  • B.倾向评分在处理组与对照组间有足够重叠← 正确答案
  • C.所有重要混淆变量都被观测并准确测量← 正确答案
  • D.处理组与对照组的样本量必须完全相等

答案:ABC。可忽略性要求 \(Y(0),Y(1)\perp T\mid X\),重叠条件保证匹配和加权可行,混淆变量被观测是实现条件独立的物质前提。样本量相等是实验设计的便利条件,并非可忽略性本身的要求。

Q6. 以下哪种业务场景最容易导致选择偏差:

单选题 · mid

  • A.在随机对照试验中只分析高依从性的受试者
  • B.用用户自报偏好决定谁接收优惠券的观测数据← 正确答案
  • C.处理组与对照组在消费能力分布上完全相同
  • D.同时获得两个潜在结果分支的真实观测值

答案:B。用户自报偏好影响“是否发券”的处理分配,属于典型的自选择效应,与店员挑长势好的花打针如出一辙。A 是依从性问题并非自选择;C 恰恰是理想的可比状态;D 是因果推断里不可能出现的完美数据。

Q7. IPW 加权估计中,权重设计的核心作用是:

单选题 · hard

  • A.让处理组与对照组在协变量 X 的分布上重新平衡← 正确答案
  • B.删掉所有结果缺失样本以减少估计噪声
  • C.把个体 ITE 等比缩小为群体层面的 ATE
  • D.降低样本量以简化复杂模型的训练成本

答案:A。IPW 用 \(1/e(X)\) 和 \(1/(1-e(X))\) 给两组加权,目的是把原本不平衡的 X 分布重新拉齐,模拟随机实验。B 与加权无关,C 的尺度变换没有意义,D 更是反向操作。

Q8. 双重机器学习(DML)相比普通线性回归校正更稳健的原因包括:

多选题 · hard

  • A.用机器学习灵活拟合非线性、高维的混淆结构← 正确答案
  • B.通过交叉拟合降低第一阶段模型的过拟合偏差← 正确答案
  • C.要求结果变量必须服从正态分布才能有效估计
  • D.对处理与结果分别残差化后做低维正交回归← 正确答案

答案:ABD。DML 的残余化让机器学习从 Y 和 T 中剥离 X 的可预测成分,且交叉拟合避免模型用自己的预测污染估计。C 是错误的——DML 并不假设结果正态,它是半参数方法。

Q9. Uplift 模型的预测目标用因果语言描述最准确的是:

单选题 · mid

  • A.每个个体接受处理与不接受处理的增量效果差← 正确答案
  • B.全体观测样本结果变量在总体上的方差波动
  • C.处理组个体结果分布的回归拟合精确程度
  • D.模型在测试集上分类准确率的综合评分

答案:A。Uplift 建模估计的是 \(\tau(x)=\mathbb{E}[Y(1)-Y(0)\mid X=x]\),即每个个体的条件平均处理效应。BC 分别是统计量和监督学习指标,D 则混淆了预测准确率与因果增益评估。

Q10. 当倾向评分估计值接近 0 或 1 时,常见的稳健化处理措施包括:

多选题 · hard

  • A.对极端倾向分做截断处理后重新计算权重← 正确答案
  • B.用双重鲁棒估计代替单纯 IPW 降低敏感性← 正确答案
  • C.只保留共同支持区间内的样本来做分析← 正确答案
  • D.把极端倾向样本的结果复制多份以放大权重

答案:ABC。极端倾向分会导致权重近乎无穷,截断、共同支持区间筛选、双重鲁棒估计都是标准缓解方案。D 是错误行为——复制样本只会放大极端权重而非稳定估计,而且会伪增样本量。