一、因果推断与风控概述:什么是因果推断?为什么风控需要因果?从相关到因果的思维转变

1.1 先讲个真实的故事

几年前,我接手了一个信贷模型优化项目。

模型上线后,AUC 从 0.72 提升到了 0.78,看起来不错。但奇怪的是,逾期率反而上升了 5%

排查后发现,模型学到了一个强特征:「用户是否在凌晨 3 点登录 APP」。这个特征跟逾期高度相关——凌晨活跃的用户,逾期率确实高。

但问题是:凌晨登录,真的是导致逾期的原因吗?

不是。那些用户只是夜班工作者,收入稳定,还款意愿并不差。模型把「相关」当成了「因果」,结果误杀了大量好客户。

嗯,这就是典型的「相关 ≠ 因果」陷阱。

核心观点:风控模型如果只学「相关」,很容易被数据中的虚假信号带偏。因果推断,就是帮你找到真正的「因」。

1.2 什么是因果推断?

说白了,因果推断就是回答「如果……会怎样」的问题。

  • 如果我给这个用户提额 20%,他逾期吗?
  • 如果我拒绝这笔贷款,用户去借高利贷吗?
  • 如果我发送催收短信,用户提前还款吗?

这些问题,传统机器学习回答不了。因为机器学习只看到「发生了什么」,而因果推断要回答的是「如果发生别的情况,会怎样」。

我个人的理解是:因果推断 = 数据 + 假设 + 反事实推理

举个例子:

  • 相关:打伞的人越多,下雨的概率越大。
  • 因果:打伞不会导致下雨,下雨才是打伞的原因。

在风控里,这个区别太重要了。你想想看,如果模型把「打伞」当成「下雨」的原因,那晴天里看到有人打伞,模型就会预测要下雨——这不就乱套了吗?

1.3 为什么风控需要因果?

我总结了三个最直接的原因:

  1. 干预决策的需要
    风控的本质是做决策:批不批?提不提额?催不催收?
    每个决策都是一个「干预」。因果推断能告诉你干预的效果。
  2. 避免辛普森悖论
    我在项目中遇到过:整体上看,某个特征跟逾期正相关,但分到每个子群体里,却是负相关。
    如果不做因果分析,你根本发现不了这种「反转」。
  3. 模型的可解释性
    监管越来越严,你不能只说「模型说拒就拒」。你得解释:为什么这个用户会被拒?是哪个因素导致的?
    因果推断天然提供这种解释能力。

避坑指南:我曾经以为,只要特征足够多、模型足够复杂,就能自动学到因果关系。后来发现,这是天真的想法。没有因果假设,再深的神经网络也只是在拟合「相关」。

1.4 从相关到因果的思维转变

这个转变,说起来简单,做起来难。我把它拆成三个层次:

层次 传统思维(相关) 因果思维
第一层 看到 A 和 B 一起出现 问:A 是否导致 B?
第二层 用 A 预测 B 问:改变 A,B 会变吗?
第三层 追求预测精度 追求干预效果

举个例子:

  • 相关思维:「用户点击了广告 → 用户申请了贷款 → 用户逾期了。所以点击广告的用户风险高。」
  • 因果思维:「用户点击广告,可能是因为他本来就缺钱。缺钱才是逾期的原因,点击广告只是结果。所以,屏蔽广告并不能降低逾期率。」

你看,同样的数据,不同的思维,得出的结论完全不同。

1.5 因果推断的核心框架

下面这张图,是我自己总结的因果推断在风控中的落地框架:

因果推断在风控中的落地框架 数据层 用户行为 | 交易记录 | 征信数据 因果推断层 DAG | 反事实 | 工具变量 决策层 批贷 | 定价 | 催收 相关分析(传统) A 和 B 一起出现 用 A 预测 B 容易产生虚假信号 因果分析(升级) A 是否导致 B? 改变 A,B 会变吗? 找到真正的「因」 决策优化(目标) 干预效果评估 个性化策略 提升 ROI,降低风险 核心转变:从「看到什么」到「如果改变会怎样」 思维转变

1.6 一个简单的代码示例

为了让你更直观地理解「相关 vs 因果」,我写个简单的 Python 模拟:

import numpy as np
import pandas as pd

# 模拟数据:10000个用户
np.random.seed(42)
n = 10000

# 真实因果结构:
# 收入 → 逾期(负相关)
# 收入 → 凌晨登录(负相关)
# 所以:凌晨登录和逾期正相关,但这是虚假相关

income = np.random.normal(5000, 1500, n)  # 收入
overdue_prob = 1 / (1 + np.exp(-(income - 5000) / 1000))  # 逾期概率,收入越高逾期越低
overdue = np.random.binomial(1, overdue_prob)

late_night_login_prob = 1 / (1 + np.exp(-(5000 - income) / 800))  # 收入越低越容易凌晨登录
late_night_login = np.random.binomial(1, late_night_login_prob)

# 计算相关性
corr_login_overdue = np.corrcoef(late_night_login, overdue)[0, 1]
corr_income_overdue = np.corrcoef(income, overdue)[0, 1]

print(f"凌晨登录与逾期的相关系数: {corr_login_overdue:.3f}")
print(f"收入与逾期的相关系数: {corr_income_overdue:.3f}")
# 输出:
# 凌晨登录与逾期的相关系数: 0.152
# 收入与逾期的相关系数: -0.487

看到了吗?凌晨登录和逾期正相关(0.152),但收入才是真正的因(-0.487)。

如果你只看相关,就会误以为「凌晨登录导致逾期」。但因果分析告诉你:是低收入同时导致了凌晨登录和逾期

注意:这个例子虽然简单,但真实业务中类似的陷阱比比皆是。我见过太多团队,因为没做因果分析,把「相关」当「因果」,结果策略上线后效果远低于预期。

1.7 小结

这一章,我们聊了:

  • 因果推断是什么——回答「如果……会怎样」
  • 风控为什么需要因果——干预决策、避免悖论、可解释性
  • 从相关到因果的思维转变——三个层次,一个框架

我个人觉得,因果推断最大的价值不是给你一个「更好的模型」,而是给你一个更清醒的头脑。让你在做决策时,能问出那个关键问题:

「这个关系,是真的因果,还是只是相关?」

下一章,我们会深入因果推断的数学基础——DAG(有向无环图)和 do-算子。到时候我会用实际案例,带你一步步构建因果图。


公众号:蓝海资料掘金营,微信deep3321