一、问题背景:相关性的"陷阱"
做良率根因,XGBoost特征重要度说"温度最重要",于是调低温度,良率没变。后来发现:温度高的是老旧设备,老旧设备本身良率低——温度和良率是"共同原因(设备老化)"导致的相关,非因果。
2022年我们被这个伪相关坑了,白调3周参数。
痛点:ML给相关性,工业决策要因果性;伪相关导致错误干预(调了没用的参数)。
二、技术原理:为什么需要因果推断
因果推断用Do-calculus/结构因果模型(SCM)区分相关与因果,通过"干预"(do-operator)计算因果效应。
方法:构建因果图(设备年龄→温度/良率),用后门调整/工具变量剥离混杂,估计"调温度"的真实因果效应。
技术:DoWhy/EconML库。局限:需领域知识建因果图(错图得错因果)。
三、实战案例:某良率因果分析
2023年用DoWhy做良率因果分析:建因果图(设备年龄→温度+良率),后门调整剥离混杂。
结论:温度的因果效应仅-0.3%(伪相关显示-2%),真正因果是"设备年龄"(效应-5%)。优先换老旧设备,良率+4%。
踩坑:初期因果图漏了"产品类型"混杂变量,效应估计偏差,补全后修正。
图1:因果推断揭示温度是伪相关,设备年龄才是真根因
四、完整代码
因果效应估计代码(DoWhy):
import dowhy
from dowhy import CausalModel
# 1. 构建因果图(领域知识)
model = CausalModel(
data=df,
graph="""digraph {
设备年龄 -> 温度; 设备年龄 -> 良率; 温度 -> 良率
}""",
treatment="温度", outcome="良率"
)
# 2. 识别(后门调整)并估计因果效应
estimands = model.identify_effect()
effect = model.estimate_effect(estimands,
method="backdoor.linear_regression")
print(f"温度的因果效应: {effect.value:.2f}%") # 剥离混杂后的真实效应
【为什么这样写】graph用领域知识显式编码因果结构(设备年龄同时影响温度和良率,是混杂变量);identify_effect自动找后门路径;estimate_effect用后门调整"控制设备年龄"后估计温度的纯净因果效应,避免伪相关误导决策。
五、效果对比:分析方法对比
良率根因分析:
指标 | ML相关性 | 因果推断 | 价值 |
根因识别 | 温度(伪) | 设备年龄(真) | 纠偏 |
干预效果 | 无效 | 良率+4% | 有效 |
决策风险 | 高(误调) | 低(精准) | 降 |
可解释 | 特征重要 | 因果图 | 更强 |
因果推断能剥离混杂找到真根因,避免伪相关导致的错误干预。
图2:因果推断排序:设备年龄效应最大,温度几乎无因果
六、实施建议:落地建议
阶段1:领域专家建因果图(关键);
阶段2:用DoWhy估计因果效应;
阶段3:优先干预强因果因素。
七、进阶方向:从因果到决策
当前局限:因果图需人工。下一步因果发现(自动学图)。
行业趋势:因果+ML融合。
我的判断:因果推断是工业AI决策核心。
------------------------------------------------------------
【评论引导】你们做根因分析被相关性坑过吗?评论区聊聊。
【VIP推广】VIP资源《因果推断根因分析代码包》已上传,私信[因果]获取。
【粉丝关注】关注我,分享半导体质量AI实战。