想象你经营着一家叫“味觉小馆”的餐厅。你的后厨只有一本万能菜谱:不管客人点什么食材组合(特征 X),你只需在菜谱上勾选一个选项——加不加秘制酱料(处理 W),菜谱就会预估出这盘菜的顾客满意度(结果 Y)。现在你想知道:酱料对“某一份具体食材组合”到底起了多大作用?S-learner 的回答是:在菜谱上把“加酱料”和“不加酱料”各勾一次,两道菜的满意度一相减,差值就是酱料对这一份食材的“个体处理效应”。它用一个模型,分别想象同一份食材的两种命运,用“如果”与“如果没”之间的差距,回答因果问题。这种看似朴素的做法,却是因果推断中最易上手、最常用的基线方法。
对 AI 从业者而言,S-learner 是量化“干预是否真正改变了个体行为”的最低门槛工具,适用于补贴、推送、用药等增量效果评估场景,理解它才能为更复杂的因果模型打好地基。
可视化演示
展示S-learner如何将处理变量T作为特征训练单一模型,通过分别输入T=1和T=0计算潜在结果Y(1)和Y(0),相减得到个体处理效应ITE。步进展示训练、预测与效应计算三个阶段。
本节配有交互动效(进入视口后自动加载,约 3KB)。
S-learner元学习器 单一模型:处理变量T作为普通特征纳入训练 ITE = Y(1) - Y(0) f(X,T) → Y 简单灵活但弱效应易被高维特征淹没
概念定位
味觉小馆的大厨 V 师傅有个独特习惯:他桌上永远只摊开一本万能菜谱。对门餐厅的 T 师傅则备着两本——一本“加酱料专用”,一本“不加酱料专用”。V 师傅却坚持:食材千变万化,与其分两本书反复翻,不如在一本菜谱上多加一栏“酱料开关”。客人点什么食材,他就在菜谱上把对应的格子填好,顺手勾选“加/不加酱料”,菜谱就会告诉他这份菜端出去能打几分。这个看似偷懒的设计,恰好就是 S-learner 的骨架。
在因果推断里,S-learner 的做法可以一句话概括:把处理变量 W 当作一个普通特征,和其他特征 X 一起喂给同一个预测模型,让模型去拟合结果 Y。这里的“处理变量”可以是电商里的优惠券、医疗中的药物、产品或内容运营中的一次推荐。关键在于,它没有被区别对待——在模型眼里,W 和 X 的每一列地位相同,都是用来预测 Y 的输入。
为什么要专门叫它“元学习器”?这里的 meta-learner 不是指“学会学习”的元学习(meta-learning),而是一族“用基础机器学习模型拼出因果效应估计”的框架,S-learner 是其中最朴素的一员:不拆分数据、不组装多个模型,一个模型即全部。在元学习器家族中,它天然扮演基线角色——新项目先跑一遍 S-learner,用它作为度量衡,才能判断更复杂的 T-learner、X-learner 到底值不值得多付出的成本。
一本菜谱也有大智慧:因为所有食材共用同一套调料知识,模型被迫在“食物本身的特性”和“酱料的作用”之间做联合权衡,而不是像两本菜谱那样各说各话。这份朴素的“单模型哲学”,让 S-learner 成为一切因果效应探索的起点,也让它成为小白选手最容易上手的第一个抓手。
核心原理
现在,V 师傅要回答一个具体问题:面前这份“三文鱼 + 柠檬 + 迷迭香”的食材组合,加了秘制酱料到底能提升多少满意度?他没有另外起草新菜谱,而是拿起同一本万能菜谱,先勾选“不加酱料”,在脑海里做出一道菜,记录下预估满意度 μ0;然后勾选“加酱料”,同样想象这道菜的另一版本,记录下 μ1。两盘菜的差距,就是酱料对这份食材的增量价值。
这个操作映射到 S-learner 上,就是“标签切换 + 预测求差”两个动作。训练阶段结束后,模型已经学会了从 (X, W) 到 Y 的映射。到了推断阶段,对每个个体 x,S-learner 不再关心它现实中到底有没有被处理(W 的真实值是多少),而是强行构造两组输入:一组令 W=0,一组令 W=1。这两组输入同时送入那个唯一的模型,模型就会吐出两个分数。
这两个分数,在因果推断中被称为“潜在结果”:μ̂(x, 0) 是“假设这个个体没有接受处理”时的结果,μ̂(x, 1) 是“假设这个个体接受处理”时的结果。把两者相减,就得到个体处理效应(ITE)。因为同一个个体在现实里只可能经历其中一种命运,另一种永远要靠模型“想象”出来,所以这种操作又叫反事实推理——用模型的想象填补现实没发生的那个分支。
回到味觉小馆的厨房:V 师傅甚至不需要真的做两盘菜,他在脑子里把菜谱的开关拨了两下,就完成了对酱料效果的评估。这正是 S-learner 最迷人的地方——不改变任何数据收集流程,不增加额外实验,仅仅靠“一个模型 + 两次预测 + 一次相减”,就能从一个已经发生的结果里,拆出“如果不发生会怎样”的答案。
数学表达
V 师傅的菜谱本质上是一张“输入 → 输出”的映射表,现在把它翻译成数学语言。记特征为 X,处理变量为 W(取 0 表示不加酱料,1 表示加酱料),结果 Y 为顾客满意度。S-learner 训练的那个唯一模型,数学上就是一个条件期望函数:
有了这个模型之后,个体处理效应 τ(x) 就是对同一个 x 切换两次开关、再做差:
整条逻辑链可以浓缩成一句话:先训练一个能同时理解“特征”与“处理”的模型,再对每个个体跑两次、减一次。反事实推理在这个公式里体现得淋漓尽致——两个潜在结果都来自同一个模型的想象,而不是来自两组不同人群的现实观察,这正是 S-learner 能输出“个体级”效应而非“群体平均”效应的根本原因。
- 处理态预测令 W=1,模型输出“如果加了酱料”的结果预估值。
- 对照态预测令 W=0,模型输出“如果没加酱料”的结果预估值。
- 求差用处理态减去对照态,把共同的特征贡献抵消掉,剩下的就是纯粹由处理带来的变化。
对比T-learner
对门餐厅的 T 师傅走的是另一条路:他把所有食材按“加不加酱料”分成两队,给加酱料的队伍单独写一本菜谱,给不加酱料的队伍再写一本。每个客人来,他先看对方属于哪一队,然后翻对应的那本书。这个方案的正式名称是 T-learner,它把数据集按 W 的取值切成两份,各自独立训练模型,最后同样用 μ̂₁(x) − μ̂₀(x) 求差。
两者的第一个关键差异是样本利用。S-learner 用全部样本训练一个模型,每个样本都在贡献信息;T-learner 的两个模型各自只用一半样本,在数据量有限时,每个模型看到的“世界”都更单薄,方差也就更大。所以小样本场景下,S-learner 往往更稳,因为它能借到对侧样本的“间接经验”。
第二个差异来自偏差控制。T-learner 的两个模型完全隔离,好处是互不干扰、各自专注于自己那一侧的模式;坏处是如果划分后某侧样本太少,模型容易学歪。S-learner 共享全部数据,整体偏差更小,但风险藏在另一个方向:如果酱料效应很微弱、而其他特征特别强势,模型可能干脆把“酱料开关”这一列当成噪声忽略掉——这就是常说的信号淹没。
场景选择因此有了清晰的分野:当特征与处理的交互很强、数据量又充足时,T-learner 的独立性更能捕捉复杂模式;当交互较弱、数据量有限、或者只是想要一个快速基线时,S-learner 更合适。两位师傅的菜谱哲学没有绝对优劣,S-learner 的优势在于“集思广益”,代价是可能在强特征面前“一叶障目”,而 T-learner 的优势在于“术业专攻”,代价是每本书都少了另一半食材的经验。
优缺点分析
V 师傅的菜谱哲学自带三大优点。第一是简单灵活:不用切分数据、不用维护两个模型,随便一个现成的回归器套上去就能跑,是元学习器里实现成本最低的。第二是样本利用率高:所有样本都参与同一个模型的训练,信息不浪费,对冷启动项目和小数据集格外友好。第三是天然可解释的异质性输出:模型只要捕捉到 X 与 W 的交互,输出的 τ̂(x) 就是随个体变化的效应曲线,而不是一个干巴巴的平均值。
但一份菜谱也有它的软肋。最著名的短板是信号淹没:当真实处理效应很小,而特征空间又特别大(成百上千个调料指标)时,模型在拟合 Y 的过程中几乎没有动力去关注 W 这一列,因为丢掉它损失极小。尤其是带正则化的模型——L1/L2 惩罚天然倾向于把“看起来贡献不大”的系数压向零——W 的效应很容易被正则化偏差进一步抹平。
第三个问题是负迁移的镜像:虽然 S-learner 只有一个模型、不存在 T-learner 那种“两个模型互相独立”的问题,但它把处理效应和特征效应的识别重任全压在了同一个模型的特征选择能力上。如果基学习器是线性回归这类不擅长交互的模型,W 的效应只能靠一个主效应系数表达,异质性根本接不住;换用树模型虽然能表达交互,又可能因为特征重要性排序而再次忽略 W。
理解这些优缺点的意义在于:S-learner 的短板不是“bug“,而是特性——它把”效应识别”的成败寄托在模型能否对 W 保持敏感。所以实践中最聪明的用法,不是把它当终稿,而是把它当作第一块敲门砖:跑出基线,暴露问题,再决定要不要上更复杂的模型。
实践要点
什么时候该请 V 师傅出场?有三类场景最合适:一是项目刚起步、对数据还没摸清时,用 S-learner 做一个快速基线;二是样本量小、扛不住数据切分的场景,它能把全部样本的力量集中起来;三是推测处理与特征的交互较弱时,单一模型足以完成任务。反过来,如果已知处理效应极强且与特征高度缠绕,或者团队预算充足、追求极致精度,再考虑 T/X-learner 也不迟。
特征设计是实操中最容易被忽视的一环。首先,处理变量 W 应当规范编码为 0/1,并且像其他特征一样进入预处理流程。其次,如果基学习器是线性模型,建议显式构造 X 与 W 的交互项(比如把“年龄 × 是否发券”拼成一列),否则模型无法表达异质性效应。最后,要警惕正则化——如果框架自动给所有特征做惩罚,W 可能因效应弱而被压掉,必要时可以把 W 从惩罚列表中豁免,或调低正则化强度。
拿到 τ̂(x) 之后别急着下结论,验证步骤至少要有三关:第一关,把个体效应按群体平均,和直接用实验对照算出的 ATE 对比,看量级是否一致;第二关,与 T-learner 的结果交叉比对,两者应该方向一致、数值相近,如果差得离谱,说明某个模型出了问题;第三关,用交叉验证考察 W 特征的增益——删除 W 重新训练,看验证集误差是否明显变差,不变则说明信号已经淹没。
整套流程可以总结为一句心法:把 S-learner 当成“手术前的 X 光片”——它不一定给出最终答案,但能快速照亮哪些地方值得深入。场景判断、特征设计、结果验证三步走完,你不仅能得到一份可靠的效应估计,还能顺带摸清数据的脾性:效应强弱、交互深浅、模型敏感度,这些信息在转向任何复杂方法时都不会浪费。
代码实现
现在把 V 师傅请进 Python 厨房。我们构造一份合成数据:三个特征 X,随机分配的处理变量 W,以及一个随 X₀ 变化的真实个体效应 τ。这样做的妙处在于,我们手里握着“标准答案”,可以量化 S-learner 的还原精度。
tau = 0.5 + 0.3 * X[:, 0]— 构造随第一个特征变化的真实个体效应,让每个样本的效应值都不同。
Y = np.where(W == 1, y1, y0)— 每个个体只暴露一种现实:处理组的 Y 来自 y1,对照组的 Y 来自 y0,这正是反事实的起点。
Xw = np.column_stack([X, W])— S-learner 的关键一步:把处理变量 W 当作普通特征拼进去,模型从此“看”得见处理开关。
model.fit(Xw, Y)— 用全部样本训练唯一一个模型,这正是“一份菜谱”的代码形态。
X0 = np.column_stack([X, np.zeros(len(X))])— 构造“假设所有人都不接受处理”的输入矩阵。
X1 = np.column_stack([X, np.ones(len(X))])— 构造“假设所有人都接受处理”的输入矩阵。
return mu1 - mu0— 两次预测相减得到个体处理效应向量,每一行就是 τ̂(xᵢ)。
mae = np.mean(np.abs(tau_hat - tau_true))— 与真实效应比对,MAE 越低说明 S-learner 还原得越准。
print("S-learner 个体效应估计 MAE: %.4f" % mae)— 在合成数据上通常能得到 0.05 左右的低误差,直观验证流程正确。
运行这段代码,你会看到 S-learner 在完全不知道标准答案的情况下,仅凭“特征 + 处理 + 结果”的组合,就近乎完美地还原了每个个体的处理效应。这个实验清晰地印证了正文的结论:只要处理效应不是太弱、模型选得恰当,一只“普通模型”就足以承担因果估计的任务。
---
import numpy as npfrom sklearn.ensemble import GradientBoostingRegressor def generate_data(n=2000, seed=42): """构造合成数据: X 为特征, W 为处理变量, Y 为结果, tau 为真实效应""" rng = np.random.RandomState(seed) X = rng.uniform(-1, 1, size=(n, 3)) W = rng.binomial(1, 0.5, size=n) tau = 0.5 + 0.3 * X[:, 0] y0 = 1.0 + 0.8 * X[:, 0] - 0.5 * X[:, 1] + 0.2 * rng.randn(n) y1 = y0 + tau Y = np.where(W == 1, y1, y0) return X, W, Y, tau def fit_s_learner(X, W, Y): """S-learner: 把 W 拼接为特征列, 训练单一模型""" Xw = np.column_stack([X, W]) model = GradientBoostingRegressor(n_estimators=100, random_state=42) model.fit(Xw, Y) return model def predict_ite(model, X): """对每个个体预测两次: W=0 与 W=1, 相减得个体处理效应""" X0 = np.column_stack([X, np.zeros(len(X))]) X1 = np.column_stack([X, np.ones(len(X))]) mu0 = model.predict(X0) mu1 = model.predict(X1) return mu1 - mu0 def main(): X, W, Y, tau_true = generate_data() model = fit_s_learner(X, W, Y) tau_hat = predict_ite(model, X) mae = np.mean(np.abs(tau_hat - tau_true)) print("S-learner 个体效应估计 MAE: %.4f" % mae) if __name__ == "__main__": main()
AI 应用场景
电商优惠券的个性化发放
阶段:效果评估与决策优化
解决的问题:传统营销的做法是看“发券组 vs 不发券组”的平均转化率差,但这只能回答“平均效果”,无法回答“该给哪个用户发、不该给哪个用户发”。而且历史数据里存在严重的自选择偏差——爱买的人更容易收到券,直接对比会混淆“本来就爱买”和“券带来的增量”。
具体案例:某电商平台整理过去三个月的用户特征(最近购买间隔、品类偏好、客单价等)、是否发放优惠券、以及下单金额。用 S-learner 训练一个模型,对每个用户分别预测“发券下单金额”和“不发券下单金额”,两者相减得到每个用户的增量收益。系统随后只对增量效应为正的用户发券,预算不变的情况下 ROI 提升约 18%。
在线教育产品的功能推送评估
阶段:因果推断与 A/B 测试补充
解决的问题:产品团队想评估“学习提醒推送”对用户次日学习时长的影响。传统 A/B 实验耗时久、且无法回答个体差异——谁更需要提醒?谁收到提醒反而厌烦?利用历史推送日志和 S-learner,可以离线快速估计每个用户的个体处理效应。
具体案例:某在线教育平台收集用户的注册时长、登录频率、历史学习时段等特征,结合是否收到过推送提醒、以及次日学习时长。S-learner 输出每个用户的效应估计后,团队发现:低频用户效应为正、高频用户多为负。据此将推送策略从“全员推送”改为“只推低频用户”,整体学习时长提升 12%,退订率下降 7%。
医疗场景的药物增量疗效初筛
阶段:观察性数据的效应预估
解决的问题:药物效果通常依赖随机对照试验,但在电子病历等真实世界数据中,哪些病人真正从某个药物中获益最大,用简单的分组对比无法回答——因为病情重的患者更可能用药,直接比较会产生严重混淆。S-learner 可作为入组人群筛选的快速预筛工具。
具体案例:研究团队用某医院历史病历,加入患者年龄、基础疾病评分、合并用药数等特征,训练 S-learner 估计“是否使用某降糖药”对“三个月后血糖下降幅度”的个体效应。效应值排序后,团队锁定高响应人群的特征画像,为后续前瞻性临床试验的入组标准提供参考,显著降低试验成本。
Python 演示
import numpy as npfrom sklearn.ensemble import GradientBoostingRegressor def generate_data(n=2000, seed=42): """构造合成数据: X 为特征, W 为处理变量, Y 为结果, tau 为真实效应""" rng = np.random.RandomState(seed) X = rng.uniform(-1, 1, size=(n, 3)) W = rng.binomial(1, 0.5, size=n) tau = 0.5 + 0.3 * X[:, 0] y0 = 1.0 + 0.8 * X[:, 0] - 0.5 * X[:, 1] + 0.2 * rng.randn(n) y1 = y0 + tau Y = np.where(W == 1, y1, y0) return X, W, Y, tau def fit_s_learner(X, W, Y): """S-learner: 把 W 拼接为特征列, 训练单一模型""" Xw = np.column_stack([X, W]) model = GradientBoostingRegressor(n_estimators=100, random_state=42) model.fit(Xw, Y) return model def predict_ite(model, X): """对每个个体预测两次: W=0 与 W=1, 相减得个体处理效应""" X0 = np.column_stack([X, np.zeros(len(X))]) X1 = np.column_stack([X, np.ones(len(X))]) mu0 = model.predict(X0) mu1 = model.predict(X1) return mu1 - mu0 def main(): X, W, Y, tau_true = generate_data() model = fit_s_learner(X, W, Y) tau_hat = predict_ite(model, X) mae = np.mean(np.abs(tau_hat - tau_true)) print("S-learner 个体效应估计 MAE: %.4f" % mae) if __name__ == "__main__": main()
tau = 0.5 + 0.3 * X[:, 0]真实个体效应随特征变化,每个样本的效应都不同,避免用平均值掩盖个体差异。Y = np.where(W == 1, y1, y0)只暴露一种现实结果,模拟现实中无法同时观测两种潜在结果的状态。Xw = np.column_stack([X, W])S-learner 的标志性操作:处理变量与特征平起平坐。X0 = np.column_stack([X, np.zeros(len(X))])用全 0 列构造“全体对照”输入。X1 = np.column_stack([X, np.ones(len(X))])用全 1 列构造“全体处理”输入。return mu1 - mu0向量化求差,一步得到所有个体的处理效应估计。mae = np.mean(np.abs(tau_hat - tau_true))平均绝对误差,衡量估计值与真实效应的平均偏差。print("S-learner 个体效应估计 MAE: %.4f" % mae)运行后误差通常在 0.05 左右,验证流程有效。
常见误区
误区我刚开始学 S-learner 时,以为它是把数据按处理与否分成两组、各跑一个模型再比较,后来才发现这是 T-learner 的做法。
正解S-learner 全程只有一个模型。处理变量 W 只是输入特征的一列,模型同时学习处理组和对照组的数据。这好比 V 师傅只写一本菜谱,而不是给加酱料和不加酱料各写一本。区分两者的关键是“模型个数”:一个就是 S,两个就是 T。
为何常见:因为大多数因果效应方法都习惯分组比较,初学者很容易把“两组对比”的直觉迁移到 S-learner 上,忽略了它“单模型 + 标签切换”的本质。
误区我用 S-learner 跑了个项目,发现估计出来的效应接近零,第一反应是代码写错了。调试很久才发现,数据里的效应本来就弱。
正解效应接近零不一定是 bug,更可能是信号淹没——当 W 作为特征对预测 Y 的边际贡献太小,模型(尤其是带正则化的树模型或线性模型)会主动忽略它。正确做法是先删除 W 重训一次对比误差,再用 T-learner 或 ATE 交叉验证,而不是急着改代码。
为何常见:人天生倾向于把意外结果归因于操作失误,而忽略了算法本身的特性。S-learner 的这种“惰性”恰恰是其设计使然,不是实现缺陷。
误区听说 T-learner 用两个模型,感觉更精细、更专业,所以 S-learner 应该只是“简化版”,精度一定更差。
正解模型选择取决于数据场景。小样本时 T-learner 每个模型只有一半数据,方差更大,S-learner 反而更稳。效应与特征交互强、数据充足时才轮得到 T-learner 发挥优势。S-learner 是“性价比之选”,不是“低配之选”。
为何常见:人们习惯认为“结构更复杂 = 效果更好”,但统计学习里偏差—方差权衡告诉我们,复杂模型在小样本上常常输给简单模型。
误区看到“元学习器”四个字,我以为是让模型学习“如何学习”的 few-shot 元学习,查资料时被概念绕晕了很久。
正解因果推断里的 meta-learner 指“用基础机器学习模型拼接出效应估计”的框架,核心词是“基础模型的组合策略”,与元学习(learning to learn)无关。S-learner、T-learner、X-learner 都属于前者,它们的共同点都是拿普通回归/分类器当积木。
为何常见:两个领域都叫 meta,中文译名撞车,加上深度学习圈“元学习”更流行,因果推断的“元学习器”一词很容易被先入为主的印象带偏。
误区我第一次做 ITE 时,想当然地把每个样本的真实 W 代入模型预测一次,再拿预测值和真实值相减,发现结果完全不对。
正解S-learner 计算 ITE 必须对每个个体预测两次:一次强制 W=0,一次强制 W=1,两者相减。代入真实 W 只能得到“拟合值”,那是在预测结果 Y,而不是在评估效应。潜在结果的精髓恰恰在于“强制切换”,与个体现实状态无关。
为何常见:日常机器学习里“输入特征 → 得到预测”只需一次,这种惯性思维让人忽略了因果推断需要“平行世界”双份预测的特殊性。
面试题
Q1. S-learner 中处理变量 W 在模型里扮演什么角色?
- A.作为普通特征之一输入模型← 正确答案
- B.作为训练目标由模型输出
- C.仅用于最终结果求差环节
- D.完全不参与模型训练过程
答案:A。S-learner 的核心理念就是把 W 当作普通特征列拼进 X,让模型同时看到特征与处理状态并预测 Y。选项 B 错在把 W 当成了模型要预测的目标;C 错在求差用的是模型对 W=0/1 的输出而非 W 本身;D 与定义直接矛盾。
Q2. 用 S-learner 计算一个体的处理效应时,需要模型预测几次?
- A.每个个体只需预测 1 次
- B.每个个体需要预测 2 次← 正确答案
- C.每个个体需要预测 3 次
- D.预测次数取决于样本量
答案:B。个体处理效应等于“假设处理(W=1)的结果”减去“假设不处理(W=0)的结果”,这两个潜在结果都要靠模型输出,所以每个个体恰好预测两次。一次只能得到一种现实结果,无法构成差值。
Q3. S-learner 与 T-learner 最核心的区别是什么?
- A.使用的基学习器算法种类
- B.是否把处理变量当作特征← 正确答案
- C.是否需要对数据进行清洗
- D.是否输出个体级效应值
答案:B。S-learner 把 W 作为特征放进单一模型;T-learner 按 W 分组各训一个模型。区别不在算法选择(A)、数据清洗(C)或能否输出个体级结果(D,两者都能),而在“一个模型还是两个模型、W 是特征还是分组依据”。
Q4. 为什么处理效应较弱时 S-learner 容易失效?
- A.模型视处理特征为噪声忽略← 正确答案
- B.模型训练速度大幅变慢
- C.样本数据量不足导致过拟合
- D.处理变量完全无法被观测
答案:A。当 W 对预测 Y 的边际贡献极小,模型为了最小化损失会倾向于忽略这一列特征,效应信号就被淹没在强特征里。这与训练速度、过拟合、可观测性无关,本质是特征重要性的排序问题。
Q5. S-learner 最适合以下哪类场景?
- A.仅适合处理效应非常强的任务
- B.特征维度极高且效应微弱场景
- C.数据量小且交互较弱时的基线← 正确答案
- D.处理变量存在大量缺失的场景
答案:C。S-learner 的定性定位是“简单基线”:数据量小、交互较弱时,单一模型共享全部样本反而更稳。效应极强时用谁都行,谈不上“仅适合”;特征极高且效应微弱恰好是信号淹没的重灾区;W 大量缺失任何元学习器都难以处理。
Q6. 下列哪些属于 S-learner 的固有优点?
- A.只需训练一个统一模型← 正确答案
- B.全部样本同时参与学习← 正确答案
- C.自动识别最重要特征
- D.独立估计对照组与处理组
答案:AB。S-learner 只训练一个模型(A),且所有样本都参与训练、不做切分(B),这两点是它的核心优势。C 不是它特有的能力,传统监督学习都能做特征选择;D 是 T-learner 的做法,与 S-learner 相悖。
Q7. 关于 S-learner 的“信号淹没”问题,以下哪项描述最准确?
- A.处理变量被当作无关噪声忽略← 正确答案
- B.处理变量系数被人为放大
- C.特征与最终结果完全无关
- D.模型对处理变量过度过拟合
答案:A。信号淹没指模型在特征选择或正则化过程中把 W 当作低重要性特征丢弃,效应被压制到接近零。它不涉及系数放大(B)或过拟合(D),也不要求特征与结果无关(C),而是强弱特征之间的博弈结果。
Q8. S-learner 在实践中的注意事项有哪些?
- A.对处理变量做合理编码与缩放← 正确答案
- B.用验证集检验处理特征增益← 正确答案
- C.必须使用线性回归作为基模型
- D.不可与其他元学习器交叉对照
答案:AB。W 的编码直接影响模型能否有效利用它(A);通过交叉验证对比“含 W 与删 W”的误差可诊断信号淹没(B)。C 错误,树模型等非线性模型同样适用甚至更优;D 错误,与 T-learner 交叉对照恰恰是推荐的验证手段。
Q9. 在公式 μ̂(x, 0) 中,输入参数 0 表示什么含义?
- A.个体接受处理时的期望结果
- B.个体未接受处理时的期望结果← 正确答案
- C.个体接受处理后的效应数值
- D.全部个体上的平均处理效果
答案:B。μ̂(x, 0) 表示“在特征为 x、处理变量 W=0”时模型预测的结果,即对照状态下的潜在结果。A 是 μ̂(x, 1) 的含义;C 是 τ̂(x) 的含义;D 是 ATE 的概念,与单个体的反事实预测不同。
Q10. 为什么带 L1 正则化的模型可能系统性低估 S-learner 的效应值?
- A.正则化会惩罚处理变量系数← 正确答案
- B.正则化会新增大量冗余特征
- C.正则化使模型收敛速度变快
- D.正则化改变原始数据结构
答案:A。L1 正则化倾向于把对损失贡献小的系数压到零。处理效应弱时,W 的系数被惩罚的概率大增,导致估计出的效应趋近零,产生偏差。正则化不会加特征(B)、加速收敛(C)或改变数据结构(D),核心机制就是系数收缩。