设想你是一个果园主,买了一款新型有机肥,想知道它到底能让苹果增产多少。你记录了每棵树的树龄、土壤酸碱性、光照时长,也记下了它是否施肥、最终产量。但如果只简单比较“施了肥的树”与“没施肥的树”的平均产量,你会被误导——因为当初你心里偏爱那些长势好的树,下意识地给它们多施肥。这个“选择过程”就像现实世界里“病情重的患者才用药”“高消费用户才发券”一样,让数据天生带着偏见。因果森林(Causal Forest)就是一支“懂对比实验的农艺师团队”:它把成千上万棵树的特征作为坐标,不断把果园切成“效果相似”的小地块,在每个小地块内部比较“施肥的一边”和“不施肥的一边”的产量差,最终画出一张精细的“肥料效果地图”。你不仅能知道平均增产多少,还能知道哪片地该多施、哪片地该少施。本文从概览、原理、算法、性能、优化到应用,带你完整认识这位“园艺统计学家”。
学会因果森林,你将从“预测事情会怎样”迈向“如果我干预,事情会怎样”——这正是营销、医疗、政策领域真正值钱的问题能力。
目录
可视化演示
展示因果树诚实分裂机制、CATE估计与置信区间及变量重要性排序,支持模式切换与播放控制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
因果树诚实分裂 结构样本选分裂点,估计样本算叶节点CATE,避免过拟合 honest split: S=S_struct ∪ S_est 诚实估计降低单树方差
因果森林概览:果园里的“对比实验专家团”
果园主有一片地形复杂的果园:有些树长在向阳坡,有些在背阴处,有些树龄老,有些刚挂果。他请来两支队伍。第一支是“产量预测队”——他们拍拍胸脯说:我能预测每棵树明年结几个苹果。第二支是“对比实验专家团”——他们却说:我不关心绝对的产量数字,我只关心一个更关键的问题——“如果同一棵树没施肥,产量会差多少?”这支专家团,就是因果森林的化身。
普通随机森林模型学习的是“土壤、光照、树龄 → 产量”的映射,属于第一支队伍。而因果森林要估计的是“施肥这个动作”带来的净变化,统计学上叫处理效应(Treatment Effect)。处理效应就像平行世界的对照:同一棵树,在“施肥”和“不施肥”两个平行世界里各有一个产量,分别是潜在结果 Y(1) 和 Y(0),它们的差就是因果效应。可惜我们永远只能观察到一个世界,所以只能转向估计条件平均处理效应(CATE)——即在特征相同的一群人里,施肥相对不施肥的平均增产。
1. 潜在结果 Y(1) 与 Y(0):假设同一棵树两个平行世界的产量——一个世界施了肥,另一个没有。现实中只能看到其中一个。
2. 条件 X = x:只比较“特征一模一样”的树群,比如树龄相同、土壤酸碱度相同、光照时长相同。
3. 期望 E[·]:对特征相同但个体千差万别的树群取平均,消除随机噪声。
4. 整体含义:在特征为 x 的人群内部,施肥相对于不施肥的“平均增产幅度”。它天然是异质的:不同 x 对应不同 τ(x)。
回到果园的例子:专家团不需要告诉你“这棵树明年结 40 斤”——他们只告诉你“这片向阳坡、5 年树龄的树,施肥平均多收 6 斤”;而那片背阴的老树,施肥可能只多收 1 斤。这种“地跟地不一样,肥效也不一样”的性质,就叫异质性(Heterogeneity)。因果森林存在的全部意义,就是把这幅异质性地图一格格地画出来。
核心原理:按“效果差异”而非“产量高低”划分地块
专家团拿到果园数据后,第一步是划分地块。普通农艺师划分地块的方法是“产量高的划一块,产量低的划一块”——这对应普通决策树按输出均值分裂。但专家团的做法截然不同:他们把地块边界反复移动,每移动一次,就分别算左右两块的“施肥增产效果”(CATE),然后追求一个目标——让左右两块的 CATE 差异最大化。换句话说,他们要找的是“效果分界线”:左边施肥效果好,右边施肥效果差,这样的边界才有价值,否则划了等于白划。
在因果森林中,这个目标被写成分裂准则。对于某个候选分裂把数据切成左右两块 L 和 R,定义增益:
1. n_L 与 n_R:分裂后左右两个“地块小区”各自的样本数量。
2. 均衡项 n_L n_R / n²:当两侧样本量接近时取值最大,防止把数据切成“一大堆 vs 三五个”这种不可靠的分裂。
3. τ̂_L 与 τ̂_R:左右两区各自的 CATE 估计值,即“左区平均增产”与“右区平均增产”。
4. 平方差 (τ̂_L - τ̂_R)²:两侧效果差距越大,说明这个边界对异质性的捕捉越强。
5. 整体增益:因果树遍历所有特征和所有候选切分点,挑选使 Δ̂ 最大的分裂作为当前节点的划分。
用果园的话说:专家团并不关心左地块产量是否比右地块高,他们只关心“左边的肥料效果和右边的肥料效果是否明显不同”。越不同,这条边界就越是“效果地图”上的一级阶梯。这正是因果森林与普通回归随机森林最本质的分野。
关键算法:诚实树、倾向得分与双稳健估计
专家团里有一个不成文的规矩:划分地块的人,不能同时负责评估产量。设想若同一个农艺师既决定“哪里该切”,又负责报告“切完后增产多少”,他会不自觉地在脑子里“复习”过数据,报出偏乐观的数字。因果森林沿用了这一智慧,称之为诚实树(Honest Tree):用于选择和分裂树的子样本,与用于估计叶子 CATE 的子样本完全分开。这样每个叶子节点的效应估计就像“抽盲盒”一样干净,不会被选择过程污染,从而获得无偏估计。
果园数据还有一个隐患:当初施肥并不是随机的——你偏爱好地段的树,医生偏爱重症患者,平台偏爱高消费用户。这种选择偏差会让“施肥组”和“对照组”本身就不一样。专家团的解法是引入倾向得分(Propensity Score):先算出每棵树“被选去施肥的概率” e(X),再在比较产量时按概率倒过来加权——就像在果园里调查时,给那些“不容易被施到肥但确实施肥了”的树更高的说话权重。用倾向得分加权估计 CATE 的公式如下:
1. D_i ∈ {0,1}:第 i 棵树是否真的施了肥——1 表示施肥组,0 表示对照组。
2. 倾向得分 e(X_i):“特征为 X_i 的树会被选中施肥的概率”,由逻辑回归等模型从数据中估计。
3. 处理项 D_i Y_i / e(X_i):施肥组每个样本的产量除以其倾向得分,相当于把一个样本“放大”成多个,填补反事实的缺失。
4. 对照项 (1 - D_i)Y_i / (1 - e(X_i)):对照组按“未被选中的概率”的倒数加权,构造出“如果不施肥会怎样”的世界。
5. 取平均:两组加权产量之差取平均,就得到消除选择偏差后的平均处理效应。
现代因果森林更进一步,把“回归预测”和“倾向得分加权”结合起来,形成双稳健估计(Doubly Robust):只要回归模型和倾向得分模型有一个是对的,估计就是一致的。这就好比出门带了两把伞,一把坏了还有另一把,确保专家团在复杂果园里不被天气坑到。
性能特性:专家团的结论靠谱吗?
果园主看完专家团的地图,问到:“你说这片地增产 5.2 斤,这个数字靠谱吗?”专家团的底气来自一个统计学事实:当数据量足够大时,因果森林的 CATE 估计会近似服从正态分布——这叫渐近正态性。就像把一枚硬币抛很多次,正面比例会稳定在某个值附近且呈钟形分布。有了这个性质,专家团就能给出一个置信区间:
1. 点估计 τ̂(x):因果森林输出的 CATE 估计值,即专家团的核心结论。
2. 正态分位数 z_{1-α/2}:α 通常取 0.05,此时 z 约等于 1.96,对应 95% 置信水平。
3. 标准误 √Var̂:由森林中树与树之间的估计差异算出,衡量结论的波动性——树与树越“众说纷纭”,标准误越大。
4. 加减区间:点估计 ± 误差范围,即“真实效果大概率落在这个区间里”。
除了置信区间,因果森林还能输出变量重要性——指出“树龄”和“土壤肥力”哪个才是导致肥效差异的主要因素。此外,因为多棵树集成平均,它的稳健性也很强:对异常值不敏感,能自动拟合复杂的非线性关系,不容易被个别“怪树”带偏。这正是果园主敢把施肥预算交给它的原因。
优化策略:调教你的“农艺师天团”
专家团虽然专业,也需要调教。第一个旋钮是叶子最小样本数(min_node_size):如果允许叶子节点只有两棵树,估计的 CATE 就像用两个苹果的平均产量代表整片果园,方差爆炸;调大这个值,每片叶子里的样本更多,结论更稳,但地图的分辨率会变粗。第二个旋钮是候选特征数(mtry):每次分裂只随机抽一部分特征参与竞争,增加树的多样性。第三个旋钮是树的数量(n_estimators):树太少,森林的方差压不下来;树太多,边际收益递减,计算变慢。
高维场景是又一个挑战。如果果园有 200 个特征,很多都是无关噪声,树的分裂会被干扰。实用做法是先用倾向得分把“施肥概率”压成一个数,让它参与分裂或作为权重;或者用正交化先把 Y 和 D 分别对 X 回归取残差,再在残差上做因果森林——这相当于先把土壤、光照等因素“洗掉”,只留下与施肥相关的纯差异,称为残差化去偏。更高级的双稳健估计能同时校正倾向得分和结果回归的偏差:
1. 预测均值 μ̂₁(X) 与 μ̂₀(X):分别用回归模型预测“施了肥的等效产量”和“没施肥的等效产量”。
2. 残差 Y_i - μ̂(X_i):从真实产量中减去可预测的部分,只留下模型解释不了的“意外”。
3. 倾向得分加权残差:把残差按 1/e 或 1/(1-e) 加权,消除“谁更容易被选中施肥”的选择偏差。
4. 回归基线项:加上 μ̂₁ - μ̂₀,即使倾向得分完全失效,回归模型仍提供有效的效应估计。
5. 整体求平均:所有样本取均值,得到兼具稳健性和低方差的 CATE 估计。
回顾果园场景:调参就像给专家团配装备——人太多要控制小组规模,地形太复杂要挑重点特征观察,数据有偏见要先“洗数据再下结论”。优秀的实践者不是拿默认参数一跑了之,而是把果园的脾性摸清楚后再精准配置。
实践应用:从果园到商场、医院与政策室
专家团出师了。第一个客户是连锁超市的市场部。他们想知道:给哪些顾客发 8 折优惠券,才能真正拉来增量订单?过去的方法用响应模型给“最可能购买的人”发券,但这些人本来就爱买,不发券也会买,优惠券白白浪费。因果森林把“是否发券”当作处理变量,估计每个顾客的 CATE——即“因优惠券而增加的购买概率”。市场部只对 CATE 超过阈值的顾客投放:
1. 估计增量 τ̂(x):因果森林输出的“这个特征人群因干预而多出的购买概率”。
2. 阈值 c:发一张券的成本折算成的“最低值得的增量”,比如增量购买概率必须超过 5%。
3. 指示函数 1[·]:条件成立输出 1(发券),否则输出 0(不发),形成清晰的策略边界。
第二个客户是医院:同一款降压药对哪些患者收益最大、对哪些患者可能无效甚至有害?用电子病历数据跑因果森林,控制医生用药倾向后,识别出“当前用药率低但受益大”的人群。第三个客户是政府:就业培训项目对不同年龄、不同技能水平的失业者,再就业提升效果差异很大,因果森林帮他们把有限的培训名额分给受益最大的人。
用一句话总结:因果森林把“森林”的灵活拟合能力与“实验对照”的严谨逻辑合二为一,让我们从“谁会买”走向“谁会被我们打动才买”,从“病人会好”走向“这种药对这个病人真的有效”。
AI 应用场景
优惠券精准投放的增量用户识别
阶段:因果推断与决策优化
解决的问题:传统响应模型预测“购买概率高”的用户,但这些人即使不发券也会买,优惠券沦为利润损耗。因果森林估计的是“因发券而增加的购买行为”这一增量效果,直接回答“谁是会被优惠券打动的人”。
具体案例:某电商平台针对 100 万用户做随机发券实验(20% 用户收到 8 折券),收集年龄、品类偏好、上周浏览时长等特征。因果森林估计每个用户的 CATE 后,只对增量概率大于 5% 的 15% 用户发券。相比“给高购买概率用户发券”,活动 ROI 提升了约 2.3 倍。
个性化医疗中的获益患者筛选
阶段:临床决策支持
解决的问题:临床试验给出的是“人群平均有效率”,但医生面对的是具体患者。因果森林用观察性电子病历估计不同特征患者的异质性处理效应,并给出置信区间,避免对无效甚至有害人群继续用药。
具体案例:某医院分析 5000 例高血压患者的病历,发现医生更倾向于给重症患者开新药(存在选择偏差)。用倾向得分加权后,因果森林识别出“60 岁以上、合并糖尿病”的患者群体降压实测受益最大(收缩压多降 8mmHg),而“年轻初发”患者获益不显著,据此调整用药指南。
公共政策评估中的资源定向分配
阶段:政策效果评估
解决的问题:政府培训项目预算有限,不同失业者的收益差异很大。传统评估只报告“平均就业提升 12%”,无法回答名额该给谁。
具体案例:某市就业中心用历史登记数据建立因果森林,发现“25 岁以下、高中以下学历”的失业者接受培训后就业率提升最高(+18%),而“45 岁以上高学历”人群几乎无提升(+1%)。于是将 70% 的培训名额向前者倾斜,整体财政投入的就业拉动效率提升近一倍。
Python 演示
# -*- coding: utf-8 -*-"""简化版因果森林:用递归分裂估计异质性处理效应(CATE)"""import numpy as np class CausalTreeNode: """单棵因果树的节点""" def __init__(self, depth=0, max_depth=3, min_leaf=6): self.depth = depth self.max_depth = max_depth self.min_leaf = min_leaf self.left = None self.right = None self.feature = None self.threshold = None self.estimate = None # 当前节点的CATE估计 def fit(self, X, y, w): tau = np.mean(y[w == 1]) - np.mean(y[w == 0]) self.estimate = tau n = len(y) if self.depth >= self.max_depth or n < self.min_leaf * 2: return best_f, best_t, best_gain = None, None, 0.0 for f in range(X.shape[1]): for t in np.unique(X[:, f]): mask = X[:, f] <= t if mask.sum() < self.min_leaf or (~mask).sum() < self.min_leaf: continue lt, lc = mask & (w == 1), mask & (w == 0) rt, rc = (~mask) & (w == 1), (~mask) & (w == 0) if lt.sum() < 1 or lc.sum() < 1 or rt.sum() < 1 or rc.sum() < 1: continue tau_l = np.mean(y[lt]) - np.mean(y[lc]) tau_r = np.mean(y[rt]) - np.mean(y[rc]) nl, nr = mask.sum(), (~mask).sum() gain = (nl * nr / n ** 2) * (tau_l - tau_r) ** 2 if gain > best_gain: best_f, best_t, best_gain = f, t, gain if best_f is None or best_gain < 1e-8: return self.feature, self.threshold = best_f, best_t mask = X[:, best_f] <= best_t self.left = CausalTreeNode(self.depth + 1, self.max_depth, self.min_leaf) self.right = CausalTreeNode(self.depth + 1, self.max_depth, self.min_leaf) self.left.fit(X[mask], y[mask], w[mask]) self.right.fit(X[~mask], y[~mask], w[~mask]) def predict(self, X): if self.feature is None: return np.full(len(X), self.estimate) mask = X[:, self.feature] <= self.threshold out = np.zeros(len(X)) out[mask] = self.left.predict(X[mask]) out[~mask] = self.right.predict(X[~mask]) return out class CausalForest: """因果森林:多棵因果树的集成平均""" def __init__(self, n_estimators=20, max_depth=3, min_leaf=6, subsample=0.7): self.n_estimators = n_estimators self.max_depth = max_depth self.min_leaf = min_leaf self.subsample = subsample self.trees = [] def fit(self, X, y, w): rng = np.random.RandomState(42) n = len(X) self.trees = [] for _ in range(self.n_estimators): idx = rng.choice(n, int(n * self.subsample), replace=True) tree = CausalTreeNode(0, self.max_depth, self.min_leaf) tree.fit(X[idx], y[idx], w[idx]) self.trees.append(tree) def predict(self, X): return np.mean([t.predict(X) for t in self.trees], axis=0) if __name__ == "__main__": from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error rng = np.random.RandomState(7) n = 600 X = rng.rand(n, 3) # 特征:树龄、土壤肥力、光照 # 倾向得分:土壤肥力越高的树越容易被选去施肥(选择偏差) logit = X[:, 1] * 3 - 1 e = 1 / (1 + np.exp(-logit)) w = (rng.rand(n) < e).astype(int) # 真实CATE:年轻树(+0.8)和高光照(+0.5)下肥料效果更强 tau_true = 0.5 + 0.8 * (1 - X[:, 0]) + 0.5 * X[:, 2] y = 2 + 0.6 * X[:, 1] + w * tau_true + 0.3 * rng.randn(n) X_tr, X_te, y_tr, y_te, w_tr, w_te = train_test_split( X, y, w, test_size=0.3, random_state=1) cf = CausalForest(n_estimators=30, max_depth=4, min_leaf=15) cf.fit(X_tr, y_tr, w_tr) tau_hat = cf.predict(X_te) tau_true_te = 0.5 + 0.8 * (1 - X_te[:, 0]) + 0.5 * X_te[:, 2] print("RMSE: %.4f" % mean_squared_error(tau_true_te, tau_hat, squared=False)) print("预测CATE均值: %.3f 真值均值: %.3f" % (tau_hat.mean(), tau_true_te.mean()))
tau = np.mean(y[w == 1]) - np.mean(y[w == 0])当前节点的 CATE 估计:施肥组均值减对照组均值,这是整棵树的“原子结论”gain = (nl * nr / n ** 2) * (tau_l - tau_r) ** 2分裂增益公式:左右 CATE 差异越大、两侧越均衡,增益越高if lt.sum() < 1 or lc.sum() < 1 or ...分裂合法性检查:每侧必须同时存在处理和对照样本,否则 CATE 无从算起tree.fit(X[idx], y[idx], w[idx])每棵树在自助采样(bootstrap)数据上训练,形成“多元民主”np.mean([t.predict(X) for t in self.trees], axis=0)森林预测取所有树的平均,显著降低单棵树的方差logit = X[:, 1] * 3 - 1构造真实的倾向得分:土壤肥力越高的树越容易被选中施肥,制造选择偏差tau_true = 0.5 + 0.8 * (1 - X[:, 0]) + 0.5 * X[:, 2]生成异质性真实 CATE:年轻树和高光照树的肥料效果更强
常见误区
误区“既然都叫森林,参数结构也差不多,把随机森林的损失函数换成 CATE 不就成了因果森林吗?”
正解两者目标完全不同。随机森林预测的是“产量会是多少”(条件期望 E[Y|X]),因果森林估计的是“施肥带来的产量差”(E[Y(1)-Y(0)|X])。后者需要处理选择偏差、构造反事实,核心是“对比实验思维”而非“预测思维”。就像果园里的“产量预测队”和“对比实验专家团”,虽然都观察同一片果园,问的问题完全不同。
为何常见:两者在代码结构上高度相似(都是树的集成、基于特征分裂),小白看到 API 类似就想当然地认为只需换标签就能得到因果结论。
误区“因果森林处理的是因果问题,我的数据是 A/B 测试来的,所以不用管倾向得分,直接跑就行。”
正解随机实验确实消除了选择偏差,但小规模随机实验仍可能因运气导致组间特征不平衡;且森林的每个叶子节点可能只覆盖少量样本,特征分布未必均衡。更现实的是,大量可用数据是观察性的(病历、登录日志、采购记录),选择偏差无处不在。倾向得分和正交化即使在随机实验数据上做,也能提高有限样本下的估计精度,相当于给结论再加一层保险。
为何常见:教科书总是先讲随机实验(RCT)是因果推断金标准,让人误以为“只要实验随机了,后续分析怎么折腾都行”。
误区“森林嘛,树越多越稳,我把 n_estimators 调到 10000,叶子随便切,效果肯定最好。”
正解因果森林的方差主要来自叶节点内的估计噪声。如果 min_node_size 太小,每个叶子只有几棵树,CATE 就是拿几棵树的产量差硬算,方差极大;树再多,每棵树都在“拍脑袋”。正确做法是先保证叶子有足够样本(比如 ≥ 20),再增加树的数量。置信区间往往比点估计更能暴露这个问题——区间宽得离谱,说明叶子太小了。
为何常见:普通随机森林中“树越多越稳”是常识,但因果森林的每个叶子都在做“组间比较”,对样本量的敏感度远高于普通预测任务。
误区“因果森林是机器学习模型,自动化能力强,我把 500 个特征全部喂进去,它自己会找出重要的。”
正解在高维无关特征淹没下,树的分裂会被噪声干扰,倾向得分模型也更容易过拟合。实践中应先用领域知识筛选协变量,或用变量重要性、交叉验证做特征选择。正交化(先对 X 回归取残差)也可以大幅压缩无关特征的影响。果园专家团不会拿着 500 个仪器去测量每一片叶子,而是先判断哪些指标真正影响肥效。
为何常见:端到端深度学习的习惯让很多人迷信“特征越多越好”,忽略了因果任务对偏差-方差平衡更敏感。
误区“模型说这个用户 CATE = 0.6,那这个用户一定会因为发券多买 0.6 单。”
正解CATE 是“特征相同的一群人”的平均效应,不是某个具体个体的确定因果效应。个体层面的潜在结果 Y(1)-Y(0) 在观测数据中天然缺失,无法精确估计。0.6 的含义是“与这个用户特征相同的人群,发券平均带来 0.6 单增量”,个体可能远高于或远低于此。决策时应基于群体的风险-收益权衡。
为何常见:营销和医疗场景都希望得到“针对我一个人的结论”,但统计识别力决定了我们只能做到“同质人群分组”,这是因果推断的客观边界。
面试题
Q1. 因果森林主要用于估计什么?
- A.特征的重要性排序
- B.条件平均处理效应 CATE← 正确答案
- C.叶节点的分类标签
- D.数据的聚类结构
答案:B。因果森林的核心输出是 CATE,即“特征相同人群的处理效应平均值”。它不服务于特征排序、分类标签或聚类,那些是普通机器学习任务。就像果园专家团的结论是“增产多少”,而不是“苹果甜不甜”。
Q2. “诚实树”的核心思想是什么?
- A.分裂时禁止剪枝操作
- B.分裂与估计用不同样本← 正确答案
- C.树的深度固定不变
- D.只用一个特征做分裂
答案:B。诚实树要求“用来决定如何分裂”的样本与“用来估计叶子 CATE”的样本相互独立,避免又当运动员又当裁判员的过拟合。这就像专家团里划分地块的人和评估产量的人不能是同一位农艺师。
Q3. 倾向得分在因果森林中的作用是?
- A.提升模型的预测精度
- B.均衡处理组和对照组分布← 正确答案
- C.对特征进行降维处理
- D.替代损失函数的计算
答案:B。倾向得分是“个体被选入处理组的概率”,用于逆概率加权,使处理组和对照组在可观测特征上可比,消除选择偏差。它不直接提升预测精度,也不是降维工具。
Q4. 因果森林与随机森林的本质区别是?
- A.集成树的数量更多
- B.以效应异质性为目标← 正确答案
- C.无需固定监督信号
- D.只处理回归问题
答案:B。因果森林的分裂准则是最大化左右两侧 CATE 的差异(异质性),而随机森林分裂准则是最小化预测误差。前者回答“效果在哪不同”,后者回答“结果是什么”。
Q5. 观察性研究中,为何不能直接比较处理组和对照组的 Y 均值?
- A.因为数据量过于庞大
- B.存在选择偏差与混淆← 正确答案
- C.因为 Y 不是数值类型
- D.样本类别天然不平衡
答案:B。观察性数据中“谁被处理”往往受特征影响(重症才用药、好树才施肥),直接比较均值会把“特征差异”误当成“处理效应”,这就是混淆。倾向得分或正交化是修正手段。
Q6. 因果森林估计 CATE 置信区间时,下列哪项影响最大?
- A.与颜色的配置直接相关
- B.叶样本量与树间方差← 正确答案
- C.与画布尺寸直接相关
- D.与特征数量完全无关
答案:B。置信区间宽度主要取决于每个叶节点内的有效样本量(样本越少越宽)和树与树之间的方差(树之间差异越大越宽)。颜色、画布属于可视化细节;特征数量有影响但不是“完全无关”。
Q7. 因果森林输出的结果是什么?
- A.每个样本的预测标签
- B.每个样本的 CATE 估计← 正确答案
- C.一组可读的决策规则
- D.一棵最优的决策树
答案:B。因果森林对每个样本输出一个 CATE 估计值:“具备这些特征的人/树,干预带来的平均增量是多少”。它不是分类器,也不输出单一最优树,而是整个森林的集成结论。
Q8. 以下哪些方法常用于因果森林的偏差校正?
- A.倾向得分加权法← 正确答案
- B.正交化残差化法← 正确答案
- C.双重稳健估计法← 正确答案
- D.提高模型学习率
答案:ABC。倾向得分加权(IPW)、正交化残差化(先用 X 回归取残差)、双重稳健(回归+加权双保险)都是从数据层面消除混淆偏差的经典手段。学习率是梯度提升类模型的超参数,与偏差校正无直接关系。
Q9. 因果森林适合哪些应用场景?
- A.精准营销用户分组← 正确答案
- B.个性化医疗决策← 正确答案
- C.政策效应异质性← 正确答案
- D.图像分类与识别
答案:ABC。因果森林需要明确的“处理变量(是否发券、是否用药、是否培训)”和“结果变量(购买、痊愈、就业)”,天生适合营销、医疗、政策的异质性效应估计。纯图像分类是模式识别问题,无需反事实推断。
Q10. 关于 CATE,以下说法正确的是?
- A.它是条件平均处理效应← 正确答案
- B.精确到每个个体的效果
- C.无需控制任何混淆变量
- D.等价于全人群平均效应
答案:A。CATE 全称 Conditional Average Treatment Effect,是“特征条件相同人群”的平均处理效应,不是个体精确效果(那是反事实,观测不到)。估计时必须控制混淆变量,且它会随人群变化而非等于全局 ATE。