本项目借助大语言模型(LLM)的强大语义理解和推理能力,让用户只需指定“处理”和“结果”变量,即可自动推断变量角色并生成建议的因果图,解决了传统因果推断中变量角色识别依赖专业知识和手动构建的难题,实现了银行业因果推断的自动化,提高了实验效率和结果的透明度与可重复性。
本项目提供了两种不同的代理架构来运行因果推断工作流,你可以根据需求选择运行方式。
cd agent
python app.py
若要使用 LangGraph Studio 进行测试:
langgraph dev
UI 地址为:https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
cd mcp_agent
python client.py
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..."
}
# 计算平均处理效应(ATE)
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"]
# base_learners = ["random_forest", "neural_network"]
cd = CausalityDataset(data=df, treatment=state['treatment'], outcomes=[state["outcome"]],
common_causes=state['confounders'])
cd.preprocess_dataset()
estimators = ["SLearner", "TLearner"]
# base_learners = ["random_forest", "neural_network"]
ct = CausalTune(
estimator_list=estimators,
metric="energy_distance",
verbose=1,
components_time_budget=10, # in seconds trial for each model
outcome_model="auto",
)
# run causaltune
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 的强大语义理解和推理能力,实时识别整个因果结构(因果关系、因果变量等)。本项目展示了一个用于银行业用例的自动化因果推断管道,用户只需指定:
处理 变量结果 变量应用程序将自动执行以下步骤:
文档中未提及许可证相关信息。