🚀 银行业自动因果推断
本项目借助大语言模型(LLM)的强大语义理解和推理能力,让用户只需指定“处理”和“结果”变量,即可自动推断变量角色并生成建议的因果图,解决了传统因果推断中变量角色识别依赖专业知识和手动构建的难题,实现了银行业因果推断的自动化,提高了实验效率和结果的透明度与可重复性。
🚀 快速开始
本项目提供了两种不同的代理架构来运行因果推断工作流,你可以根据需求选择运行方式。
运行 LangGraph
cd agent
python app.py
若要使用 LangGraph Studio 进行测试:
langgraph dev
UI 地址为:https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
结合 Claude Desktop 运行 MCP
cd mcp_agent
python client.py
✨ 主要特性
- 自动化变量角色识别:利用大语言模型(LLM),用户只需指定“处理”和“结果”变量,即可自动推断变量角色和建议的因果图。
- 多工具集成:集成了 CausalNex、CausalTune、DoWhy 等工具,实现了从因果关系发现、估计到调优的全流程自动化。
- 可扩展性架构:提供了 LangGraph Agent 和 MCP Agent 两种不同的代理架构,支持同步或异步任务执行,便于扩展和模块化服务部署。
- 结果验证与修正:运行反驳测试来检查因果结构,并在测试不通过时提出修正解决方案。
📦 安装指南
环境要求
- Python 3.10
- Claude Desktop(用于运行 MCP)
安装依赖
pip install requirements.txt
💻 使用示例
基础用法
以下是一个简单的示例,展示了如何使用本项目进行因果推断:
User asks: "Does offering a promotion increase digital product activation ?"
age -> promotion_offer;
age -> activated_ib;
income -> promotion_offer;
income -> activated_ib;
education -> promotion_offer;
education -> activated_ib;
region_code -> promotion_offer;
promotion_offer -> branch_visits;
branch_visits -> activated_ib;
promotion_offer -> customer_engagement;
activated_ib -> customer_engagement;
channel_preference -> activated_ib;
promotion_offer -> activated_ib
{
"confounders": ["age", "income", "education"],
"mediators": ["branch_visits"],
"effect_modifiers": ["channel_preference"],
"colliders": ["customer_engagement"],
"instruments": ["region_code"],
"causal_graph": "...DOT format...",
"dowhy_code": "...Python code..."
}
import dowhy
from dowhy import CausalModel
model = CausalModel(
data=df,
treatment='promotion_offer',
outcome='activated_ib',
common_causes=['age', 'income', 'education'],
instruments=['region_code'],
mediators=['branch_visits']
)
identified_model = model.identify_effect()
estimate = model.estimate_effect(identified_model, method_name='backdoor.propensity_score_matching')
print(estimate)
高级用法
以下是一些高级用法示例,包括模型调优和反驳测试:
estimators = ["S-learner", "T-learner", "X-learner"]
cd = CausalityDataset(data=df, treatment=state['treatment'], outcomes=[state["outcome"]],
common_causes=state['confounders'])
cd.preprocess_dataset()
estimators = ["SLearner", "TLearner"]
ct = CausalTune(
estimator_list=estimators,
metric="energy_distance",
verbose=1,
components_time_budget=10,
outcome_model="auto",
)
ct.fit(data=cd, outcome=cd.outcomes[0])
print(f"Best estimator: {ct.best_estimator}")
print(f"Best score: {ct.best_score}")
refute_results = []
refute_methods = [
"placebo_treatment_refuter",
"random_common_cause",
"data_subset_refuter"
]
for method in refute_methods:
refute = model.refute_estimate(identified_estimand, estimate, method_name=method)
refute_results.append({"method": method, "result": str(refute)})
pass_test = all("fail" not in r["result"].lower() for r in refute_results)
📚 详细文档
示例用例
| 场景 |
处理变量 |
结果变量 |
| 促销活动是否会增加网上银行激活率? |
promotion_offer |
activated_ib |
| 分行访问是否会增加客户参与度? |
branch_visits |
customer_engagement |
| 教育水平是否会影响收入? |
education |
income |
| 渠道偏好是否会影响网上银行使用? |
channel_preference |
activated_ib |
分析变量列表
| 变量 |
描述 |
age |
客户年龄 |
income |
客户收入水平 |
education |
客户教育水平 |
branch_visits |
客户在一段时间内访问实体分行的次数 |
channel_preference |
首选的沟通或服务渠道(如在线、电话、分行内) |
customer_engagement |
反映客户互动、登录、对通信的响应等的综合指标 |
region_code |
地理区域标识符 |
promotion_offer |
二元变量:客户是否收到促销活动 |
activated_ib |
二元结果:客户是否激活网上银行 |
项目结构
auto_causal_inference/
├── agent/ # LangGraph agent source code
│ ├── data/ # Sample data (bank.db)
│ ├── app.py # Main entry point for LangGraph causal agent
│ ├── generate_data.py # Data generation script for causal inference
│ ├── requirements.txt # Dependencies for LangGraph agent
│ └── ... # Other helper modules and notebooks
│
├── mcp_agent/ # MCP agent implementation
│ ├── data/ # Sample data (bank.db)
│ ├── server.py # MCP causal inference server
│ ├── client.py # MCP client to call the causal inference server
│ ├── requirements.txt # Dependencies for MCP agent
│ └── ... # Additional files
│
└── README.md # This documentation file
结果分析
| 角色 |
变量 |
分配此角色的原因 |
| 混杂因素 |
age, income, education |
影响客户收到促销活动的机会和网上银行的使用。 |
| 中介变量 |
branch_visits |
因果路径中的一个步骤:促销 → 访问 → 网上银行激活。 |
| 效应修饰因子 |
channel_preference |
改变促销活动对网上银行激活效果的强度。 |
| 对撞因子 |
customer_engagement |
受促销活动和网上银行使用的影响;不应进行调整。 |
| 工具变量 |
region_code |
在区域层面随机分配促销活动。 |
最佳估计器:backdoor.econml.metalearners.TLearner,得分:483.1930697900207
反驳测试通过:True。
与其他工具/方法的比较
| 标准 |
CausalNex |
DoWhy |
CausalTune |
自动因果推断 |
| 主要目的 |
因果图学习 |
完整因果流程 |
自动估计器调优 |
自动因果问答:发现 → 估计 → 调优 |
| 发现 |
是(NOTEARS、Hill Climb) |
是(PC、NOTEARS、LiNGAM) |
否 |
是(CausalNex + DoWhy 发现) |
| 混杂因素识别 |
否 |
是 |
否 |
是(LLM 分析图以识别混杂因素) |
| 估计 |
有限(贝叶斯网络) |
丰富的估计器 |
是(多种学习器) |
是(DoWhy 估计 ATE) |
| 自动估计器 |
否 |
否 |
是 |
是(CausalTune 自动选择最佳估计器) |
| 反驳测试 |
否 |
是 |
否 |
是(DoWhy 反驳测试) |
| 用户输入需求 |
手动图和方法 |
手动估计器 |
选择估计器 |
只需提出处理 → 结果问题 |
| 自动化水平 |
低到中等 |
中等 |
高 |
非常高 |
| 输入数据 |
观测表格数据 |
观测数据 + 图 |
观测数据 + 模型 |
观测数据 + 数据库元数据 |
| 灵活性 |
高结构学习 |
高推断和反驳 |
高调优 |
非常高,结合多种工具 + LLM |
| 最适合场景 |
构建图的研究人员 |
流程用户 |
机器学习生产调优 |
希望快速获得因果答案的业务用户 |
| 优势 |
良好的因果图学习 |
完整因果工作流 |
自动估计器调优 |
端到端自动化 + LLM 支持 |
| 局限性 |
无内置验证 |
无自动调优 |
无发现/反驳 |
依赖数据质量,反驳失败时需手动检查 |
🔧 技术细节
版本变更说明
v1.1(当前版本):集成了 CausalNex、CausalTune、反驳测试 等,使自动因果推断更加健壮。
v1.0 (链接):依赖 LLM 的强大语义理解和推理能力,实时识别整个因果结构(因果关系、因果变量等)。
工作原理
本项目展示了一个用于银行业用例的自动化因果推断管道,用户只需指定:
应用程序将自动执行以下步骤:
- 在数据库中搜索相关变量
- 使用 CausalNex 查找因果关系
- 识别因果变量
- 使用 DoWhy 执行因果模型
- 使用 CausalTune 寻找最佳估计器和基础学习器
- 运行反驳测试以检查因果结构
- 如果反驳测试未通过,提出修复解决方案(并进行重新运行循环)
📄 许可证
文档中未提及许可证相关信息。