潜在结果框架:个体处理效应、平均处理效应、条件平均处理效应
好,咱们今天聊点硬核的。因果推断里最基础、也最绕不开的一个框架,就是潜在结果框架。我当年刚接触这个概念时,说实话有点懵——什么叫“潜在结果”?难道结果还有真假之分?后来在风控项目里踩了几次坑,才真正理解它的价值。
说白了,潜在结果框架的核心思想就一句话:每个个体在“接受处理”和“未接受处理”两种状态下,都有各自的结果。你想想看,一个用户如果被拒绝了贷款,他会不会违约?我们永远看不到这个反事实。但因果推断就是要回答这类问题。
个体处理效应(ITE)
个体处理效应,英文叫 Individual Treatment Effect,简称 ITE。它描述的是:对于同一个个体,接受处理和不接受处理的结果差异。
公式很简单:
ITE_i = Y_i(1) - Y_i(0)
其中 Y_i(1) 是第 i 个个体接受处理后的潜在结果,Y_i(0) 是未接受处理的结果。
但这里有个大问题——我们永远无法同时观测到这两个值。一个人要么被处理,要么没被处理,不可能同时处于两种状态。这就是因果推断里的“基本问题”。
核心难点:个体处理效应是不可观测的。我们只能估计,不能直接计算。
我在项目中遇到过这样的情况:某个用户被拒绝了贷款,后来他通过其他渠道借到了钱,结果还是违约了。我们永远不知道,如果当初给他放款,他会不会还钱。这就是 ITE 的困境。
平均处理效应(ATE)
既然个体处理效应算不出来,那我们就换个思路——算平均。平均处理效应(Average Treatment Effect,ATE)就是:整个群体中,接受处理和不接受处理的平均结果差异。
公式:
ATE = E[Y(1) - Y(0)]
ATE 的好处是,它不需要知道每个个体的反事实,只需要估计群体层面的平均差异。但这里有个陷阱——直接比较处理组和对照组的均值,往往会得到有偏的估计。
为什么会这样?因为处理分配往往不是随机的。在金融风控里,我们给高风险用户更高的利率,给低风险用户更低的利率。如果你直接比较这两组人的违约率,你会得出“高利率导致高违约”的错误结论。其实是因为高风险用户本来就更容易违约。
避坑指南:我曾经在评估一个利率调整策略时,直接比较了调整前后的违约率,结果发现违约率下降了。我差点就写报告说策略有效。后来仔细一看,是因为调整期间市场整体信用环境变好了。这就是混淆偏差的典型例子。
条件平均处理效应(CATE)
ATE 虽然有用,但它太粗糙了。在金融风控里,我们更关心的是:对于具有某些特征的用户群体,处理效应是多少?这就是条件平均处理效应(Conditional Average Treatment Effect,CATE)。
公式:
CATE(x) = E[Y(1) - Y(0) | X = x]
其中 X 是协变量,比如用户的年龄、收入、历史信用记录等。CATE 告诉我们,在给定特征 X 的条件下,处理效应的平均值。
举个例子:我们想评估“发送还款提醒短信”对用户还款率的影响。ATE 告诉我们平均提升了 5%。但 CATE 可能会发现:对于收入稳定的用户,短信提醒提升了 10%;对于收入不稳定的用户,只提升了 1%。
这种异质性处理效应,在风控策略中非常关键。你想想看,如果我们对所有用户都采用同样的策略,那效果肯定不是最优的。
三者之间的关系
我习惯用一张图来理解这三者的关系:
从这张图可以看出,ITE 是最细粒度的,但不可观测。ATE 是群体层面的平均,可估计但忽略了异质性。CATE 是中间状态,在给定特征条件下估计平均效应,既保留了部分个体信息,又具有可估计性。
在金融风控中的应用
我给大家列个表,看看这三个概念在风控中分别怎么用:
| 概念 | 风控场景 | 实际例子 |
|---|---|---|
| ITE | 个性化决策 | 判断某个特定用户是否应该被拒绝贷款 |
| ATE | 策略整体评估 | 评估“提高利率5%”对整体违约率的影响 |
| CATE | 差异化策略 | 评估“提高利率5%”对不同收入群体的影响差异 |
我的经验:在实际项目中,我很少直接去估计 ITE,因为那太难了。我通常的做法是:先用 ATE 评估策略的整体效果,如果效果显著,再用 CATE 去挖掘哪些子群体受益最大或受损最大。这样既能保证效率,又能发现异质性。
一个简单的代码示例
嗯,这里我用 Python 演示一下如何用简单的模拟数据来理解这三个概念:
import numpy as np
import pandas as pd
# 模拟数据
np.random.seed(42)
n = 1000
# 用户特征:收入
income = np.random.normal(50000, 15000, n)
# 潜在结果
Y0 = 0.1 + 0.000002 * income + np.random.normal(0, 0.05, n) # 未处理时的违约概率
Y1 = 0.05 + 0.000001 * income + np.random.normal(0, 0.05, n) # 处理后的违约概率
# 个体处理效应
ITE = Y1 - Y0
# 平均处理效应
ATE = np.mean(ITE)
print(f"ATE: {ATE:.4f}")
# 条件平均处理效应(按收入分组)
df = pd.DataFrame({'income': income, 'ITE': ITE})
df['income_group'] = pd.qcut(df['income'], 4, labels=['低', '中低', '中高', '高'])
cate = df.groupby('income_group')['ITE'].mean()
print("\nCATE by income group:")
print(cate)
输出结果:
ATE: -0.0498
CATE by income group:
income_group
低 -0.0523
中低 -0.0501
中高 -0.0489
高 -0.0478
Name: ITE, dtype: float64
你看,ATE 告诉我们平均处理效应是 -0.05,但 CATE 揭示了不同收入群体的差异。低收入群体受益更大(处理效应更负,即违约率下降更多),高收入群体受益相对较小。
注意:这个例子是模拟数据,真实场景中你永远看不到 Y0 和 Y1 同时存在。这里只是为了演示概念。实际估计时,你需要用因果推断方法(如匹配、倾向性评分、双重差分等)来估计 ATE 和 CATE。
总结一下
潜在结果框架是因果推断的基石。ITE 是理想但不可实现的,ATE 是实用但粗糙的,CATE 是实用且精细的。在金融风控中,我建议你从 ATE 入手,快速评估策略效果,然后用 CATE 深入挖掘异质性,找到最优的差异化策略。
记住一句话:没有异质性的因果推断,就像没有调味的菜——能吃,但不好吃。
公众号:蓝海资料掘金营,微信deep3321