一座偏远山村的老村长想发“有机肥补贴”,但预算只够覆盖一半农户。问题来了:补给谁最划算?答案不在“全村平均增产多少”,而在“具体哪户增产最多”。因果森林就是村长请来的一支“评估团”——几十位经验丰富的老农,各自走访农户、分组讨论,最终给出每一户的“受益预测”。而“调参”,就是调整这支评估团的配置:请多少位老农、每人重点看几个线索、至少凑齐几户才下结论、走访与拍板的职责如何分离。配置得当,评估精准;配置失当,钱花了却发错人家。本文就用这个山村故事,从零讲透因果森林调参的原理与实操。
掌握因果森林调参,是 AI 工程师从“预测世界”走向“决策世界”的关键一课:学会它,你就能用可解释、可验证的方式回答“干预对谁最有效”,在营销、医疗、政策等场景真正交付业务价值。
可视化演示
展示超参数空间热力图、参数效应曲线及贝叶斯优化调参流程,揭示因果森林CATE估计的调优机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
超参数空间搜索 honesty.fraction与min.node.size二维网格的性能热力图 argmin MSE(θ) 贝叶斯优化高效探索高维超参数空间
因果森林概念
村长召集评估团的第一个问题不是“全村平均每亩增产几斤”,而是“具体哪几户增产最多”。同一袋有机肥,施在坡地贫田上可能让收成翻倍,施在沃土良田上却几乎无感。这种“不同农户反应不同”的现象,在统计上叫异质性处理效应。评估团要回答的,正是每一户“拿到补贴”相比“没拿到补贴”的收成之差。
但这里有个天生的难题:反事实。现实中每一户只存在一种结局——要么拿了补贴,要么没拿,我们永远无法同时观测到两个平行世界。因果森林的做法是“找相似的人补全缺失的画面”:把农户按特征(地力、坡度、水源)分组,在特征相同的子群里,拿补贴户的平均收成减去未拿补贴户的平均收成,就近似还原出“如果”的答案。这个逐组估计的量,就是条件平均处理效应(CATE)。
因果森林并不是一棵树,而是成百上千棵“因果树”的集成。每棵树都基于不同的随机子样本和特征子集生长,各自给出对每户的 CATE 估计,最后取平均。它与普通随机森林最大的区别在于“生长目标”:普通森林追求把产量 Y 预测准,因果森林追求把“处理带来的差异”切得更分明。目标不同,调参的手感自然也不同。
评估团想要知道的从来不是“全村平均”,而是“同一户在有补贴与无补贴两个平行宇宙里的收成差”。因果森林调参的每一步,都是在帮这支评估团把这个差值看得更准。
- 目标量 τ(x)表示“特征为 x 的那一类农户的处理效应估计值”,是整个因果森林最终要输出的核心。
- 潜在结果 Y(1)同一户在“拿到补贴”这个平行世界里的收成,现实中可能观测不到。
- 潜在结果 Y(0)同一户在“没拿补贴”平行世界里的收成,与 Y(1) 只能二选一被观测。
- 条件期望 E[·|X=x]在给定协变量 X 等于 x 的农户子群里取平均,用“相似的人”补全反事实。
- 相减对比两个平行世界期望之差,就是该子群的个体化处理效应。
森林生长机制
评估团的老农们怎么干活?他们先挑一个线索(比如“坡度是否大于 30°”),把农户劈成两堆,看看哪堆受益更多;如果差异足够明显,再把每堆继续细分。这样一个线索一个线索地切下去,农户被划分成若干“同质小组”,每个小组给出一个受益预测。这个过程就是单棵因果树的生长。
关键在“怎么选切分线索”。如果照搬普通回归树“让产量预测误差最小”的准则,老农很容易被个别极端农户带偏,切出一些看似精细实则随机的分组。因果森林采用的准则是:选一个让左右两组的处理效应差异最大、且两边样本量都足够的分裂。左右两组受益差得越远,说明这条线索越能揭示“谁更受益”。
但这里还藏着一个防骗机制——诚实树(honest tree)。评估团内部规定:一半老农只负责“走访采集数据”(选切分点),另一半老农只负责“依据数据拍板”(估计组内效应),两批人互不共享结论依据。学术上叫“分裂样本与估计样本分离”,它能防止切分点被同一份数据的噪声反复利用,避免过拟合。同时,森林还给每棵树随机分配“视角”(mtry 特征子集)和“走访名单”(bootstrap 抽样),让树与树之间足够不同,集成时才不会“众口一词”。
走访与拍板的职责分离,是诚实树防偏倚的基石;而分裂增益公式,是老农们判断“哪一刀切得值”的尺子。这两者共同决定了单棵树的生长方式,也决定了后续所有调参工作的对象。
- 候选切分 s某条把地块一分为二的界线,例如“坡度≤30°”。
- 左右样本量 n_L、n_R切分后左右两组各自的农户户数,是判断分组是否可靠的基础。
- 权重因子 n_L·n_R/n²两组样本量越接近,权重越大,避免切出“一丁点小抽屉”式的不可靠分组。
- 效应差 τ̂L − τ̂R左右两组各自用“估计子样本”算出的平均受益差,体现这条线索的区分度。
- 平方放大差值越大、样本越均衡,增益越高,就越值得优先切这一刀。
核心调参参数
现在村长要正式给评估团“配班子”了。配置一共四个旋钮:请多少位老农、每人重点看几个线索、至少凑齐几户才下结论、走访与拍板的职责如何分配比例。这四个旋钮,对应因果森林最核心的四个参数。
第一个旋钮是树的数量num.trees。老农越多,个别老农的偏激判断越容易被平均掉,但收益快速递减:从 10 位加到 100 位效果明显,从 500 位加到 1000 位基本无感。第二个旋钮是mtry,即每棵树在每次分裂时随机考察的特征个数。它像“视角宽度”:看得太少,单棵树太弱;看得太多,所有树都盯着同一批线索,集成就失去了“兼听则明”的意义。第三个旋钮是min.node.size,即一个小组至少要有多少户才允许下结论。门槛太低,组内样本太少,受益估计抖得厉害;门槛太高,分组太粗,把“坡地和沃土”混在一起,异质性被抹平。
第四个旋钮是诚实比例honesty.fraction(记为 f):数据中多大比例专门用来“选切分点”,剩余 1−f 用来“算效应”。f 越大,切分越稳健,但用来做估计的样本越少,效应估计的方差会被放大。这四个旋钮相互牵制,调参就是在这四者之间寻找默契——这正是因果森林调参与普通随机森林调参最不一样的地方。
四个旋钮没有一个是“越大越好”或“越小越好”:树量要够但不必贪多,视角要宽但不能趋同,门槛要高但不能太粗,诚实要足但要付得起方差代价。调参的本质,就是给这支评估团找到一组互相成全的配置。
- 诚实比例 f诚实机制里用于“选切分点”的样本比例,即 honesty.fraction 参数。
- 估计样本比例 1−f剩下用于“计算每组效应 τ̂”的样本占比。
- 全量估计方差 Var(τ̂_full)假设所有样本都用于效应估计时的方差水平。
- 分母放大倍数估计样本越少,方差按 1/(1−f) 倍放大,这是付出“诚实”必须交的学费。
调参寻优策略
配置有好几套候选,怎么知道哪套评估团更靠谱?村长定了一个统一的“验收评分”:R-loss。这个评分不关心老农们能不能把产量背得滚瓜烂熟,只关心一件事——他们对“每户受益多少”的估计,能不能还原真实数据里的因果结构。
R-loss 的计算需要一个“参照系”:先拟合两个辅助模型,一个预测“不干预时的基线收成” μ̂(X),一个预测“农户实际拿到补贴的概率” ê(X)(倾向分数)。然后把“实际收成减去基线收成”与“中心化后的干预乘以效应估计”做对比,残差越小,说明效应估计越能解释数据中由干预带来的那部分变化。这正是它与普通 MSE 的本质区别:普通 MSE 奖励“把 Y 猜得准”,R-loss 只奖励“把干预的效果估得准”。
有了评分标准,寻优就好办了。最朴素的是网格搜索:把 mtry、min.node.size 等参数各取几个候选值,两两组合逐一评估;参数多时改用随机搜索,在参数空间中随机撒点,性价比更高。更重要的是配合交叉验证——把数据切几折,轮流用一部分调参、一部分验收,防止“把训练集背下来”的假高分。在实际的 GRF(广义随机森林)框架中,还可以直接设置 tune.parameters,让算法用交叉验证自动挑选 mtry、min.node.size 与 sample.fraction,把调参从“手工配班子”升级为“自动招聘”。
村长的验收评分从来不是“谁把产量背得熟”,而是“谁把受益估得准”。有了 R-loss 这把尺子,网格搜索、随机搜索和交叉验证才有了统一的度量标准,自动调参也才有了“自动优化”的目标函数。
- 取平均 1/n·Σ对全部农户样本计算平均损失,体现整体拟合质量。
- 结果残差 Y_i − μ̂(X_i)去掉“与干预无关的基线收成”影响,只留无法用基线解释的部分。
- 中心化干预 W_i − ê(X_i)剔除已由倾向分数解释的分配规律,只保留“意外干预”带来的信息。
- 效应加权 θ(X_i)用效应估计 θ 乘以中心化干预,重建干预本应造成的收成变化。
- 平方求均值重建误差越小,说明 θ 越贴合真实的因果结构,评分越高。
性能权衡取舍
配置评估团时,村长很快就发现一个规律:粗而稳,细而险。让老农们只看大方向(min.node.size 大),估计稳定但可能漏掉少数受益极大的农户;让他们盯到每一户(min.node.size 小),细节丰富但个别极端数据就能让结论上蹿下跳。这就是统计里最经典的偏差-方差权衡,也是因果森林调参的主旋律。
偏差是“系统性看偏”,比如把坡地和沃土混为一谈,导致整体高估或低估;方差是“随机抖动”,换一批抽样农户,结论就忽高忽低。总误差恰好等于偏差的平方加上方差。调参的每个旋钮其实都在拨动这两项:min.node.size 调小,偏差下降但方差上升;mtry 调大,单棵树变强(偏差降)但树间相关性上升(方差升);num.trees 增大只压方差、不碰偏差;而诚实机制用一部分方差代价换来了偏差的系统性下降——因为“拍板者”不再被“选切分点时的噪声”误导。
理解这层权衡,就不会再问“哪个参数是银弹”。更进一步的启示是样本效率:诚实机制把估计样本砍掉一半,本质上是用数据换可靠性。如果样本量本身很小,过度调小 min.node.size 或调大 f 都会让方差爆炸;反之样本充足时,可以放心把门槛调低、把细节挖深。调参不是找“最优单点”,而是根据数据规模与业务风险,在偏差与方差之间选一个可接受的位置。
评估团配置永远在“粗而稳”和“细而险”之间拉扯,没有免费的午餐。真正的高手看参数,看到的是偏差与方差在背后的此消彼长,而不是某个数值本身。
- 左侧 MSE在某一类农户 x 上,效应估计与真实效应的期望平方误差。
- 偏差平方项系统性高估或低估的幅度,例如分裂太粗把异质性抹平。
- 方差项换一批抽样数据后,估计结论抖动的幅度。
- 等式分解总误差等于偏差平方加方差,调参就是在这两项之间寻找平衡点。
实践诊断优化
配置定好了,评估团正式上岗,但村长还要安排“外勤复查”——模型必须经过诊断与工程化检验才能交付。第一项复查是校准图:把农户按预测的受益大小分成若干组,再分别用数据估计每组的真实受益(通常用 AIPW 分数),画成“预测值 vs 真实值”的散点。如果点都落在 45° 对角线附近,说明评估团“嘴下不虚”;如果系统性偏离,说明存在未发现的偏差,需要回头调参数。
第二项复查是变量重要性。把森林里所有用到某个特征(如“坡度”)的分裂增益加起来,就得到该特征的贡献分。它既能帮业务方理解“到底是什么决定了受益差异”,也能反过来校验数据:如果“坡度”排第一而业务常识认为“水源”最关键,就要检查数据质量或调参方向。第三项复查是固定随机种子。因果森林带 bootstrap 抽样和随机特征选择,不固定种子,每次跑出来的参数排序都可能微调,评审和复现都会很被动;固定种子才能让“最优配置”可稳定复现、可追溯。
最后是数据适配建议:因果森林对样本量有一定要求,样本不足时要适当调大 min.node.size、降低树的深度;特征过多时先做筛选或降维,避免 mtry 采样淹没关键信号;处理二分类结局或删失数据时,还需换用相应的专用变体。调参不是一次性动作,而是“调参—诊断—再调参”的闭环,直到校准图合格、重要性合理、结果可复现,模型才真正具备交付资格。
诊断是调参的“验收关”:校准图确认没有系统看偏,变量重要性确认抓对了关键线索,固定种子确认结论经得起复现。评估团配置再好,也要过了这关才能正式“发补贴”。
- 分裂集合 S_j森林中所有选用了第 j 个特征(如“坡度”)的切分点集合。
- 单次增益 Δ(s)每一条切分线带来的效应差异增益,切得越值,增益越大。
- 累计求和把该特征在所有树里贡献的增益加起来,得到它的重要性分数。
AI 应用场景
精准派券与个性化营销
阶段:模型调参与上线评估
解决的问题:传统营销靠经验圈选人群,全量打折浪费预算;用因果森林估计每个用户的 CATE,才能知道优惠券对谁真正有效,避免把钱发给“不打折也会买”的用户。调参阶段用 R-loss 作目标,配合交叉验证选 mtry 和 min.node.size,防止在用户分群上过拟合。
具体案例:某电商对 10 万用户做 A/B 派券实验,用因果森林估计各用户的购买增量,按预测受益前 20% 的用户定向发券,活动 ROI 提升约 35%,且校准图显示预测与真实增量高度一致。
个性化医疗方案推荐
阶段:模型调参与临床验证
解决的问题:同一种药对不同患者的疗效差异极大,传统指南式用药忽略个体异质性;因果森林可定位“获益最大”的患者亚组。医疗场景尤其依赖诚实机制防过拟合,min.node.size 需设得较大以保证每组有足够的疗效估计样本,再用校准图确认估计可靠后才能进入决策支持。
具体案例:某医院评估降压药的个体化疗效,用因果森林按年龄、合并症等特征估计 CATE,发现老年合并肾病组获益显著高于其他组,据此调整用药优先级建议。
政策补贴对象筛选
阶段:模型稳定性与可解释交付
解决的问题:按收入线“一刀切”的补贴政策既不精准也不公平;因果森林按“受益增量”而非“贫富程度”选择补贴对象。政务场景要求结论可解释、可复现,因此调参后必须固定种子,并输出变量重要性说明“为什么这些人更值得补贴”。
具体案例:某县农业补贴项目用调好参的因果森林输出每户受益预测,变量重要性显示“坡地比例”最关键,据此撰写补贴对象遴选报告,并通过校准图向评审证明模型无系统性偏差。
Python 演示
import numpy as np def tau_hat(y, w): y, w = np.asarray(y), np.asarray(w) if y[w == 1].size == 0 or y[w == 0].size == 0: return 0.0 return float(y[w == 1].mean() - y[w == 0].mean()) def build(H, Xs, ys, ws, Xe, ye, we, depth): node = {"left": None, "right": None, "effect": tau_hat(ye, we), "split": -1} if depth >= H["max_depth"] or len(ys) < 2 * H["min_node"]: return node if len(Xe) < 2 * H["min_node"]: return node m, d = Xs.shape best_score, best = -np.inf, None for j in range(d): xs_s = np.sort(Xs[:, j]) for i in range(H["min_node"], m - H["min_node"] + 1): if xs_s[i - 1] >= xs_s[i]: continue th = (xs_s[i - 1] + xs_s[i]) / 2 mask = Xe[:, j] <= th if mask.sum() < H["min_node"]: continue if len(mask) - mask.sum() < H["min_node"]: continue dtau = tau_hat(ye[mask], we[mask]) - tau_hat(ye[~mask], we[~mask]) score = mask.sum() * (len(mask) - mask.sum()) * dtau * dtau if score > best_score: best_score, best = score, (j, th) if best is None: return node j, th = best ms = Xs[:, j] <= th me = Xe[:, j] <= th node["split"], node["th"] = j, th node["left"] = build(H, Xs[ms], ys[ms], ws[ms], Xe[me], ye[me], we[me], depth + 1) node["right"] = build(H, Xs[~ms], ys[~ms], ws[~ms], Xe[~me], ye[~me], we[~me], depth + 1) return node class HonestTree: def __init__(self, min_node=10, max_depth=3, seed=0): self.min_node = min_node self.max_depth = max_depth self.seed = seed def fit(self, X, y, w): rng = np.random.default_rng(self.seed) order = rng.permutation(len(y)) half = len(order) // 2 o1, o2 = order[:half], order[half:] H = {"min_node": self.min_node, "max_depth": self.max_depth} self.root = build(H, X[o1], y[o1], w[o1], X[o2], y[o2], w[o2], 0) return self def predict(self, X): out = np.zeros(len(X)) for i in range(len(X)): node = self.root while node["split"] != -1: if X[i, node["split"]] <= node["th"]: node = node["left"] else: node = node["right"] out[i] = node["effect"] return out def forest_predict(X, y, w, min_node, max_depth, n_trees=20, seed=1): preds = np.zeros(len(y)) for t in range(n_trees): tree = HonestTree(min_node, max_depth, seed + t) tree.fit(X, y, w) preds += tree.predict(X) return preds / n_trees def r_loss(y, w, tau, m=0.5): resid = (y - np.mean(y)) - (w - m) * tau return float(np.mean(resid ** 2)) if __name__ == "__main__": rng = np.random.default_rng(0) n = 300 X = rng.uniform(0, 1, (n, 3)) w = rng.integers(0, 2, n) y = 1.0 + 0.5 * X[:, 0] + w * (0.7 + 1.5 * X[:, 1]) + rng.normal(0, 0.4, n) for min_node, max_depth in [(5, 2), (10, 3), (20, 4)]: tau = forest_predict(X, y, w, min_node, max_depth) print("min_node=%d max_depth=%d R_loss=%.4f" % (min_node, max_depth, r_loss(y, w, tau)))
order = rng.permutation(len(y))先把样本随机打乱,为“分裂子样本与估计子样本分离”做准备。o1, o2 = order[:half], order[half:]前一半只负责选切分点(走访),后一半只负责估计效应(拍板),这就是诚实树。mask = Xe[:, j] <= th在估计子样本上判断每个农户是否落在切分线左侧,切分质量要用“拍板者”的数据来打分。score = mask.sum() * (len(mask) - mask.sum()) * dtau * dtau这就是分裂增益公式:样本越均衡、两侧效应差越大,得分越高。while node["split"] != -1:沿着树的分裂条件一路下钻,直到叶子节点拿到该组的效应估计。resid = (y - np.mean(y)) - (w - m) * tau简化版 R-loss:减去基线收成与倾向分数后,看效应估计能否解释剩余差异。
常见误区
误区因果森林嘛,树越多越“森林”,我把 num.trees 调到 5000,模型肯定更准,反正就是多跑一会儿的事。
正解树的数量只负责降低“抽样抖动”(bootstrap 引起的方差),收益快速递减:从 200 棵加到 500 棵几乎无差别,却白白增加数倍算力。真正决定拟合质量的是 mtry、min.node.size 和 honesty 这些“一刀一刀怎么切”的参数。比喻:评估团再多,如果每个老农都只盯着同一个线索,结论也不会更全面。
为何常见:“森林”这个词天然让人以为树多就是林深、就是好,而且调 num.trees 是最没有门槛的操作,最容易给人“我在调参”的错觉。
误区节点切得越细,分组越精细,估计就越精准,所以 min.node.size 能设多小就设多小。
正解节点太小会导致每组里处理组/对照组样本过少,效应估计抖动剧烈;而且诚实机制要求分裂子样本和估计子样本都至少有 2×min.node.size 的样本量,门槛太低会让树根本长不出来。min.node.size 的本质是“下结论最少要问几户人家”,太小等于听一两家之言就拍板。
为何常见:直觉上“细分 = 精确”,忽略了统计上样本量不足带来的方差爆炸,这是初学者最容易踩的坑。
误区随机森林我熟,调参不就是让预测误差 MSE 最小吗?因果森林照搬就行。
正解因果森林的优化目标是 R-loss——衡量“处理效应还原度”,而不是预测 Y 的准确率。一个把产量预测得很准的模型,完全可能对“每户受益多少”估计得很差;反之亦然。调参目标错了,后面的搜索再努力也是南辕北辙。比喻:评判评估团好坏的标准是“谁家受益大说得准不准”,而不是“谁把全村产量背得熟”。
为何常见:多数人的机器学习启蒙来自预测任务,习惯性地把“预测准”当作一切模型的目标,忽略了因果任务特有的“反事实”视角。
误区honesty 把样本分成两半太浪费了,关掉它训练效果明显更好,评估分数也更高。
正解诚实机制(分裂样本与估计样本分离)是因果森林防止“切分点被同一份数据的噪声反复利用”的核心保障。关闭后训练分数看似更高,实则是对过拟合的自我欺骗,R-loss 会被严重低估。诚实的代价是样本效率下降(方差约放大 1/(1−f) 倍),但换来的是可校准、可信赖的效应估计,这在决策场景远比“账面分数”重要。
为何常见:关闭诚实机制后,同一样本既选切分点又做估计,“自我验证”当然好看,这种虚假的优越感很容易让人误判。
误区调参就是跑一遍搜索,拿到最优参数组合就结束,校准图和变量重要性都是形式主义。
正解最优参数也可能只是在交叉验证里“碰巧幸运”,必须配合诊断确认:校准图检查是否存在系统性高估/低估,变量重要性校验是否抓到了业务上关键的特征,固定种子保证结论可复现。否则,参数最优也可能只是一个无法解释、无法复现的假象,交付时一推就倒。
为何常见:只看损失函数数值是最省事的验收方式,而诊断需要额外工作量,容易被追求“分数好看”的心态跳过。
面试题
Q1. 因果森林估计的核心目标量是什么?
- A.预测结果 Y 的整体平均值
- B.个体处理效应 CATE 估计← 正确答案
- C.协变量之间的相关系数
- D.测试集上的分类准确率
答案:B。因果森林要回答的是“每一类农户分别受益多少”,即条件平均处理效应 CATE = E[Y(1)−Y(0)|X=x]。A 是平均处理效应而非个体化估计;C、D 与因果效应无关。比喻:评估团要算的是“每户受益差”,不是全村平均产量。
Q2. “诚实树”机制的核心做法是什么?
- A.全部样本既选切分点又做估计
- B.分裂样本与估计样本相互分离← 正确答案
- C.每棵树只使用单个特征分裂
- D.不允许设定最小节点大小
答案:B。诚实树把数据分成两半:一半只负责选切分点(走访),另一半只负责估计效应(拍板),防止同一份数据既当运动员又当裁判。C、D 与诚实机制无关;A 恰恰是诚实树要避免的做法。
Q3. 增大 num.trees 主要带来什么效果?
- A.系统性偏差显著持续下降
- B.抽样抖动方差逐渐下降← 正确答案
- C.计算开销和内存自动减少
- D.最小节点大小自动增大
答案:B。树的数量只负责平滑 bootstrap 抽样带来的方差,收益快速递减。系统性偏差主要由 mtry、min.node.size 等“切分方式”类参数决定,所以 A 错误;C、D 与树量无关。比喻:老农再多,如果视角都一样,也不会更全面。
Q4. mtry 设置过小会导致什么后果?
- A.树间相关性过强,集成近单树
- B.每棵树视角过窄,单树效果偏弱← 正确答案
- C.最小节点大小被强制调大
- D.诚实样本比例自动降为零
答案:B。mtry 是每棵树每次分裂时随机考察的特征数。过小意味着每棵树只能看到一两个线索,单棵树太弱;反之 mtry 过大才会导致树间相关性上升(A)。C、D 与 mtry 无直接关系。
Q5. min.node.size 设置过大时的主要风险是什么?
- A.节点分裂过细,方差急剧变大
- B.分裂太粗,异质性被抹平欠拟合← 正确答案
- C.训练时间显著变长达数倍
- D.处理效应估计值整体变大
答案:B。min.node.size 是“下结论最少要问几户”。设得太大,分组太粗,把坡地和沃土混在一起,真实的受益差异被平均掉,导致欠拟合。A 是设得过小的风险;C、D 与门槛大小的常规影响不符。
Q6. 因果森林调参时推荐的优化目标是什么?
- A.最小化训练集上的普通 MSE
- B.最小化 R-loss 或验证损失← 正确答案
- C.最大化森林里的树的数量
- D.最大化特征变量的个数
答案:B。因果森林的目标是还原处理效应,R-loss 通过剔除基线收成与倾向分数后衡量效应拟合质量,配合交叉验证选择参数。普通 MSE 是预测导向,不适用于因果任务。比喻:验收标准是“受益估得准”,不是“产量背得熟”。
Q7. honesty.fraction f 增大时,模型会付出什么代价?
- A.用于估计的样本减少,方差放大← 正确答案
- B.计算时间线性减少到零
- C.所有树的深度自动加深
- D.倾向分数估计完全失效
答案:A。f 是用于选切分点的样本比例,f 越大,真正用于估计效应的样本只剩 1−f,方差约放大为 1/(1−f) 倍。这是诚实机制的“学费”。B、C、D 均与 f 的统计学含义无关。
Q8. 关于 R-loss 公式描述正确的是哪项?
- A.直接用预测 Y 的平方误差打分
- B.用中心化干预加权效应拟合残差← 正确答案
- C.只需数据本身,无需辅助模型
- D.只适用于分类任务场景
答案:B。R(θ) = (1/n)Σ(Y−μ̂−(W−ê)θ)²,其中 μ̂ 是基线结果模型、ê 是倾向分数,都需要辅助模型估计(C 错);它度量的是效应 θ 对“剔除基线后的残差”的解释力,而非预测 Y 的误差(A 错);它适用于连续或二分类结局,不限分类任务(D 错)。
Q9. 在 GRF 框架中调参,以下说法正确的有哪些?
- A.tune.parameters 可自动调核心参数← 正确答案
- B.调参目标是让 R-loss 尽量小← 正确答案
- C.增加 num.trees 可线性降低偏差
- D.mtry 越大树间相关性通常越强← 正确答案
答案:ABD。GRF 的 tune.parameters 支持用交叉验证自动选择 mtry、min.node.size 等参数(A 对);调参的优化目标是 R-loss(B 对);num.trees 主要降低方差而非线性降低偏差(C 错);mtry 越大,每棵树考察的特征重叠越多,树间相关性越强(D 对)。
Q10. 调参后合理的诊断手段包括哪些?
- A.绘制校准图检查系统偏差← 正确答案
- B.查看变量重要性是否合理← 正确答案
- C.只盯着训练集损失变小
- D.固定随机种子复现结果← 正确答案
答案:ABD。校准图检查预测受益与真实受益是否一致,变量重要性帮助判断是否抓住关键特征,固定种子保证结果可复现,三者都是交付前的必要诊断。只盯着训练损失变小无法发现过拟合,属于典型的自欺欺人。