🚀 銀行業自動因果推斷
本項目藉助大語言模型(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 尋找最佳估計器和基礎學習器
- 運行反駁測試以檢查因果結構
- 如果反駁測試未通過,提出修復解決方案(並進行重新運行循環)
📄 許可證
文檔中未提及許可證相關信息。