应用Ylearn框架实现因果推断
引言
在数据科学领域,我们经常听到这样一句话:“相关不代表因果”(Correlation does not imply causation)。传统的机器学习方法擅长发现数据中的模式和相关性,但在回答”为什么”以及”如果这样做会怎样”等因果问题时却力不从心。
因果推断(Causal Inference)正是解决这一问题的关键技术。无论是在医疗健康(新药是否有效?)、营销决策(优惠券是否真的提升了销量?)还是政策制定(教育投资能否提高收入?)中,理解变量之间的因果关系都至关重要。
YLearn(“Why Learn”)是阿里巴巴开源的一个端到端因果学习 Python 库,集成了因果图发现、因果效应估计、uplift modeling 等多种功能,大幅降低了因果推断的技术门槛。
本文将系统介绍因果推断的核心概念,并通过丰富的实战案例展示如何使用 YLearn 解决实际业务问题。
1. 因果推断基础理论
1.1 为什么需要因果推断?
问题示例:某电商平台发现,发放优惠券后用户的购买金额增加了。能否得出结论:优惠券提升了销售额?
潜在陷阱:
- 可能是因为原本就要购买的用户更倾向于领取优惠券
- 可能是季节性因素导致销量上升
- 可能存在选择偏差(selection bias)
相关 vs 因果:
| 相关分析 | 因果推断 |
|---|---|
| X 与 Y 同时变化 | X 的改变导致 Y 的改变 |
| 观察性结论 | 反事实推理 |
| 预测未来趋势 | 预测干预效果 |
| 机器学习擅长 | 需要因果推断方法 |
1.2 因果推断的核心概念
1.2.1 反事实框架(Potential Outcomes Framework)
定义:每个个体在不同干预下都有潜在结果。
- :个体 接受干预时的结果
- :个体 不接受干预时的结果
- 个体因果效应:
根本问题:我们只能观察到 (实际发生的结果),无法同时观察 和 。
1.2.2 平均处理效应(ATE)
实际含义:整个群体接受干预相比不接受干预的平均效果。
1.2.3 条件平均处理效应(CATE)
异质性效应:不同特征的个体可能对干预有不同的反应。
示例:
- 年轻用户对优惠券的响应可能比老年用户更强
- 高收入群体可能对小额优惠券不敏感
1.2.4 混淆因子(Confounder)
定义:同时影响干预和结果的变量。
混淆因子 C ↙ ↘干预 T → 结果 Y示例:
- C = 用户活跃度
- T = 是否发放优惠券
- Y = 购买金额
活跃用户更可能领取优惠券,也更可能购买,造成虚假的因果关系。
1.3 因果推断的三大支柱
-
随机对照试验(RCT)
- 金标准,但成本高、周期长、伦理限制
-
因果图(Causal Graph)
- DAG(有向无环图)表示变量间的因果关系
- 用于识别混淆因子和调整策略
-
潜在结果模型
- Rubin Causal Model
- 通过建模反事实结果估计因果效应
2. YLearn 框架概览
2.1 YLearn 的设计哲学
YLearn 遵循 端到端因果学习流程:
数据准备 → 因果图发现 → 因果效应识别 → 因果效应估计 → 策略优化2.2 核心模块
2.2.1 Causal Discovery(因果发现)
从数据中自动学习变量间的因果结构。
支持算法:
- PC 算法(基于条件独立测试)
- GES 算法(基于评分的搜索)
- LiNGAM(线性非高斯无环模型)
2.2.2 Causal Effect Estimation(因果效应估计)
估计干预的因果效应(ATE、CATE等)。
支持方法:
- S-Learner:单模型学习
- T-Learner:双模型学习(treatment + control)
- X-Learner:针对样本不平衡优化
- R-Learner:鲁棒学习器
- DR-Learner:双重鲁棒学习器
- Causal Tree/Forest:因果树/森林
2.2.3 Uplift Modeling(提升建模)
识别对干预响应最强的个体,优化资源分配。
2.2.4 Policy Learning(策略学习)
学习最优干预策略,最大化整体效用。
2.3 安装 YLearn
pip install ylearn依赖库:
- numpy, pandas
- scikit-learn
- networkx(因果图)
- matplotlib, seaborn(可视化)
3. 实战案例一:营销优惠券因果效应分析
3.1 问题背景
某电商平台想评估优惠券对用户购买的真实影响,数据包括:
- Treatment(T):是否发放优惠券
- Outcome(Y):用户消费金额
- Covariates(X):用户特征(年龄、历史消费、活跃度等)
3.2 数据准备
import numpy as npimport pandas as pdfrom ylearn.exp_dataset.exp_data import single_continuous_treatmentfrom ylearn.estimator_model import *import matplotlib.pyplot as pltimport warningswarnings.filterwarnings('ignore')
# 生成模拟数据np.random.seed(2024)n = 5000
# 用户特征age = np.random.randint(18, 65, n)income = np.random.lognormal(10, 1, n)activity = np.random.gamma(2, 2, n)
# 混淆因子:活跃用户更可能收到优惠券propensity = 1 / (1 + np.exp(-(0.01 * age - 0.00005 * income + 0.1 * activity - 5)))treatment = np.random.binomial(1, propensity)
# 结果:真实因果效应 + 混淆效应true_effect = 50 + 10 * (age > 30) - 5 * (income > 30000) # 异质性效应outcome = ( 100 + # 基准消费 0.5 * age + # 年龄效应 0.001 * income + # 收入效应 10 * activity + # 活跃度效应 treatment * true_effect + # 真实因果效应 np.random.normal(0, 20, n) # 噪声)
# 构建DataFramedata = pd.DataFrame({ 'age': age, 'income': income, 'activity': activity, 'treatment': treatment, 'outcome': outcome})
print(data.head())print(f"\n样本量: {len(data)}")print(f"治疗组比例: {treatment.mean():.2%}")3.3 朴素对比的陷阱
# 错误方法:直接比较治疗组和对照组naive_ate = data[data['treatment'] == 1]['outcome'].mean() - \ data[data['treatment'] == 0]['outcome'].mean()
print(f"朴素 ATE 估计: {naive_ate:.2f}")print(f"真实 ATE(平均): {true_effect.mean():.2f}")print(f"估计偏差: {naive_ate - true_effect.mean():.2f}")结果解读:朴素估计往往有显著偏差,因为忽略了混淆因子。
3.4 使用 YLearn 估计 ATE
3.4.1 准备数据格式
from sklearn.model_selection import train_test_split
# 划分训练集和测试集train_data, test_data = train_test_split(data, test_size=0.3, random_state=42)
# 定义变量treatment_col = 'treatment'outcome_col = 'outcome'covariate_cols = ['age', 'income', 'activity']
# 提取特征X_train = train_data[covariate_cols].valuesy_train = train_data[outcome_col].valuesw_train = train_data[treatment_col].values
X_test = test_data[covariate_cols].valuesy_test = test_data[outcome_col].valuesw_test = test_data[treatment_col].values3.4.2 S-Learner 方法
from ylearn.estimator_model.meta_learner import SLearnerfrom sklearn.ensemble import GradientBoostingRegressor
# 创建 S-Learners_learner = SLearner( model=GradientBoostingRegressor(n_estimators=100, random_state=42))
# 训练模型s_learner.fit( data=train_data, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols)
# 估计 ATEs_ate = s_learner.estimate( data=test_data, quantity='ATE')
print(f"S-Learner ATE: {s_ate:.2f}")3.4.3 T-Learner 方法
from ylearn.estimator_model.meta_learner import TLearner
# 创建 T-Learner(分别为治疗组和对照组训练模型)t_learner = TLearner( model=GradientBoostingRegressor(n_estimators=100, random_state=42))
t_learner.fit( data=train_data, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols)
t_ate = t_learner.estimate( data=test_data, quantity='ATE')
print(f"T-Learner ATE: {t_ate:.2f}")3.4.4 X-Learner 方法(推荐)
from ylearn.estimator_model.meta_learner import XLearner
# X-Learner 对样本不平衡更鲁棒x_learner = XLearner( model=GradientBoostingRegressor(n_estimators=100, random_state=42))
x_learner.fit( data=train_data, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols)
x_ate = x_learner.estimate( data=test_data, quantity='ATE')
print(f"X-Learner ATE: {x_ate:.2f}")3.4.5 双重鲁棒估计(DR-Learner)
from ylearn.estimator_model.doubly_robust import DRLearner
dr_learner = DRLearner( model_final=GradientBoostingRegressor(n_estimators=100, random_state=42), model_propensity=GradientBoostingRegressor(n_estimators=50, random_state=42), model_regression=GradientBoostingRegressor(n_estimators=50, random_state=42))
dr_learner.fit( data=train_data, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols)
dr_ate = dr_learner.estimate( data=test_data, quantity='ATE')
print(f"DR-Learner ATE: {dr_ate:.2f}")3.5 估计 CATE(异质性效应)
# 使用 X-Learner 估计每个个体的 CATEcate_estimates = x_learner.estimate( data=test_data, quantity='CATE')
# 可视化 CATE 分布plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)plt.hist(cate_estimates, bins=50, edgecolor='black', alpha=0.7)plt.xlabel('CATE Estimate')plt.ylabel('Frequency')plt.title('Distribution of CATE Estimates')plt.axvline(cate_estimates.mean(), color='red', linestyle='--', label=f'Mean: {cate_estimates.mean():.2f}')plt.legend()
plt.subplot(1, 2, 2)plt.scatter(test_data['age'], cate_estimates, alpha=0.5)plt.xlabel('Age')plt.ylabel('CATE Estimate')plt.title('CATE vs Age')plt.tight_layout()plt.show()3.6 效果评估对比
import pandas as pd
results = pd.DataFrame({ 'Method': ['Naive', 'S-Learner', 'T-Learner', 'X-Learner', 'DR-Learner'], 'ATE Estimate': [naive_ate, s_ate, t_ate, x_ate, dr_ate], 'True ATE': [true_effect.mean()] * 5})
results['Bias'] = results['ATE Estimate'] - results['True ATE']results['Absolute Bias'] = results['Bias'].abs()
print(results)4. 实战案例二:Uplift Modeling 精准营销
4.1 Uplift 建模的核心思想
目标:识别对干预响应最强的个体,优化 ROI。
用户分类:
| 用户类型 | 不干预结果 | 干预结果 | Uplift | 决策 |
|---|---|---|---|---|
| Sure Things | 转化 | 转化 | 0 | 不需要优惠券 |
| Persuadables | 不转化 | 转化 | 正 | 目标群体 |
| Lost Causes | 不转化 | 不转化 | 0 | 无效投入 |
| Sleeping Dogs | 转化 | 不转化 | 负 | 避免打扰 |
4.2 使用 YLearn 实现 Uplift Modeling
from ylearn.estimator_model.meta_learner import SLearnerfrom sklearn.ensemble import RandomForestRegressor
# 训练 Uplift 模型uplift_model = SLearner( model=RandomForestRegressor(n_estimators=200, random_state=42))
uplift_model.fit( data=train_data, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols)
# 预测每个用户的 uplift scoretest_data['uplift_score'] = uplift_model.estimate( data=test_data, quantity='CATE')
# 按 uplift 分数排序test_data_sorted = test_data.sort_values('uplift_score', ascending=False)print(test_data_sorted[['age', 'income', 'activity', 'uplift_score']].head(10))4.3 Uplift Curve 评估
def plot_uplift_curve(data, treatment_col, outcome_col, uplift_score_col, n_bins=20): """绘制 Uplift Curve""" data = data.copy().sort_values(uplift_score_col, ascending=False) data['percentile'] = np.arange(len(data)) / len(data)
bins = np.linspace(0, 1, n_bins + 1) uplift_curve = []
for i in range(len(bins) - 1): subset = data[data['percentile'] <= bins[i+1]]
treated = subset[subset[treatment_col] == 1] control = subset[subset[treatment_col] == 0]
if len(treated) > 0 and len(control) > 0: ate = treated[outcome_col].mean() - control[outcome_col].mean() uplift_curve.append(ate * len(subset)) else: uplift_curve.append(0)
plt.figure(figsize=(10, 6)) plt.plot(bins[1:], uplift_curve, marker='o') plt.xlabel('Population Percentile (Ranked by Uplift Score)') plt.ylabel('Cumulative Uplift') plt.title('Uplift Curve') plt.grid(True, alpha=0.3) plt.show()
plot_uplift_curve(test_data, 'treatment', 'outcome', 'uplift_score')4.4 精准营销策略
# 只对 uplift 分数最高的 30% 用户发放优惠券top_30_pct = test_data_sorted.head(int(len(test_data_sorted) * 0.3))
# 计算 ROIcost_per_coupon = 10 # 优惠券成本avg_uplift_top30 = top_30_pct['uplift_score'].mean()roi_top30 = (avg_uplift_top30 - cost_per_coupon) / cost_per_coupon
print(f"Top 30% 用户的平均 Uplift: {avg_uplift_top30:.2f}")print(f"ROI: {roi_top30:.2%}")
# 对比:如果随机发放给 30% 用户random_30_pct = test_data.sample(frac=0.3, random_state=42)avg_uplift_random = random_30_pct['uplift_score'].mean()roi_random = (avg_uplift_random - cost_per_coupon) / cost_per_coupon
print(f"\n随机 30% 用户的平均 Uplift: {avg_uplift_random:.2f}")print(f"ROI: {roi_random:.2%}")print(f"\nROI 提升: {(roi_top30 - roi_random) / roi_random:.2%}")5. 实战案例三:因果图发现
5.1 因果图的作用
问题:在没有先验知识的情况下,如何从数据中学习变量间的因果关系?
YLearn 支持的因果发现算法:
5.1.1 PC 算法
from ylearn.causal_discovery import CausalDiscovery
# 准备数据(只使用协变量和处理变量)discovery_data = data[['age', 'income', 'activity', 'treatment']].copy()
# 使用 PC 算法发现因果图cd = CausalDiscovery( method='pc', # PC 算法 alpha=0.05 # 独立性检验的显著性水平)
# 拟合数据causal_graph = cd.fit(discovery_data)
# 可视化因果图import networkx as nx
plt.figure(figsize=(10, 8))pos = nx.spring_layout(causal_graph, k=2, iterations=50)nx.draw( causal_graph, pos, with_labels=True, node_color='lightblue', node_size=3000, font_size=12, font_weight='bold', arrows=True, arrowsize=20, edge_color='gray', width=2)plt.title('Discovered Causal Graph (PC Algorithm)')plt.axis('off')plt.tight_layout()plt.show()5.1.2 GES 算法(基于评分)
# GES 算法(Greedy Equivalence Search)cd_ges = CausalDiscovery(method='ges')causal_graph_ges = cd_ges.fit(discovery_data)
# 对比两种算法的结果print("PC Algorithm edges:", list(causal_graph.edges()))print("GES Algorithm edges:", list(causal_graph_ges.edges()))5.2 使用因果图进行调整集识别
from ylearn.causal_discovery.graph import CausalGraph
# 创建因果图对象graph = CausalGraph(causal_graph)
# 识别从 treatment 到 outcome 的调整集adjustment_set = graph.get_adjustment_set( treatment='treatment', outcome='outcome')
print(f"识别的调整集: {adjustment_set}")print("这些变量需要在因果效应估计中作为协变量进行调整")6. 高级技巧与最佳实践
6.1 倾向性得分(Propensity Score)
用途:平衡治疗组和对照组的协变量分布。
from sklearn.linear_model import LogisticRegression
# 估计倾向性得分ps_model = LogisticRegression(random_state=42)ps_model.fit(X_train, w_train)
train_data['ps'] = ps_model.predict_proba(X_train)[:, 1]test_data['ps'] = ps_model.predict_proba(X_test)[:, 1]
# 检查共同支撑(common support)plt.figure(figsize=(10, 5))plt.hist(train_data[train_data['treatment'] == 1]['ps'], bins=30, alpha=0.5, label='Treated')plt.hist(train_data[train_data['treatment'] == 0]['ps'], bins=30, alpha=0.5, label='Control')plt.xlabel('Propensity Score')plt.ylabel('Frequency')plt.title('Propensity Score Distribution')plt.legend()plt.show()6.2 逆概率加权(IPW)
# 使用倾向性得分进行加权train_data['ipw'] = np.where( train_data['treatment'] == 1, 1 / train_data['ps'], 1 / (1 - train_data['ps']))
# 使用 IPW 估计 ATEweighted_outcome_treated = ( train_data[train_data['treatment'] == 1]['outcome'] * train_data[train_data['treatment'] == 1]['ipw']).sum() / train_data[train_data['treatment'] == 1]['ipw'].sum()
weighted_outcome_control = ( train_data[train_data['treatment'] == 0]['outcome'] * train_data[train_data['treatment'] == 0]['ipw']).sum() / train_data[train_data['treatment'] == 0]['ipw'].sum()
ipw_ate = weighted_outcome_treated - weighted_outcome_controlprint(f"IPW ATE: {ipw_ate:.2f}")6.3 敏感性分析
def sensitivity_analysis(data, treatment_col, outcome_col, covariate_cols, n_bootstraps=100): """Bootstrap 敏感性分析""" ate_estimates = []
for i in range(n_bootstraps): # 重采样 bootstrap_sample = data.sample(frac=1.0, replace=True, random_state=i)
# 估计 ATE learner = XLearner( model=GradientBoostingRegressor(n_estimators=50, random_state=i) ) learner.fit( data=bootstrap_sample, outcome=outcome_col, treatment=treatment_col, covariate=covariate_cols ) ate = learner.estimate(data=bootstrap_sample, quantity='ATE') ate_estimates.append(ate)
# 计算置信区间 ci_lower = np.percentile(ate_estimates, 2.5) ci_upper = np.percentile(ate_estimates, 97.5)
print(f"ATE 估计: {np.mean(ate_estimates):.2f}") print(f"95% 置信区间: [{ci_lower:.2f}, {ci_upper:.2f}]")
# 可视化 plt.figure(figsize=(10, 5)) plt.hist(ate_estimates, bins=30, edgecolor='black', alpha=0.7) plt.axvline(np.mean(ate_estimates), color='red', linestyle='--', label='Mean') plt.axvline(ci_lower, color='green', linestyle='--', label='95% CI') plt.axvline(ci_upper, color='green', linestyle='--') plt.xlabel('ATE Estimate') plt.ylabel('Frequency') plt.title('Bootstrap Sensitivity Analysis') plt.legend() plt.show()
return ate_estimates
ate_bootstrap = sensitivity_analysis( train_data, 'treatment', 'outcome', covariate_cols, n_bootstraps=100)7. 真实业务场景应用
7.1 A/B 测试增强
场景:A/B 测试后,想知道哪些用户群体受益最大。
# 模拟 A/B 测试数据ab_test_data = data.copy()ab_test_data['variant'] = np.random.binomial(1, 0.5, len(data)) # 随机分组
# 使用 CATE 分析异质性heterogeneity_model = XLearner( model=GradientBoostingRegressor(n_estimators=100, random_state=42))
heterogeneity_model.fit( data=ab_test_data, outcome='outcome', treatment='variant', covariate=['age', 'income', 'activity'])
ab_test_data['cate'] = heterogeneity_model.estimate( data=ab_test_data, quantity='CATE')
# 识别高价值用户high_value_users = ab_test_data[ab_test_data['cate'] > ab_test_data['cate'].quantile(0.75)]print(f"高响应用户特征:")print(high_value_users[['age', 'income', 'activity']].describe())7.2 医疗决策支持
场景:预测不同患者对治疗方案的响应。
# 模拟医疗数据medical_data = pd.DataFrame({ 'age': np.random.randint(30, 80, 1000), 'bmi': np.random.normal(25, 5, 1000), 'blood_pressure': np.random.normal(120, 15, 1000), 'treatment': np.random.binomial(1, 0.5, 1000)})
# 结果:康复时间(天)medical_data['recovery_days'] = ( 30 - 0.2 * medical_data['age'] + 0.5 * medical_data['bmi'] + 0.1 * medical_data['blood_pressure'] - medical_data['treatment'] * (5 + 0.1 * medical_data['age']) + np.random.normal(0, 5, 1000))
# 估计个性化治疗效果medical_model = XLearner( model=GradientBoostingRegressor(n_estimators=100, random_state=42))
medical_model.fit( data=medical_data, outcome='recovery_days', treatment='treatment', covariate=['age', 'bmi', 'blood_pressure'])
medical_data['treatment_effect'] = medical_model.estimate( data=medical_data, quantity='CATE')
# 个性化治疗建议medical_data['recommend_treatment'] = medical_data['treatment_effect'] < -2 # 康复时间减少超过2天print(medical_data[['age', 'bmi', 'treatment_effect', 'recommend_treatment']].head(20))8. 常见陷阱与解决方案
8.1 选择偏差(Selection Bias)
问题:治疗组和对照组的协变量分布不同。
检测:
from scipy.stats import ks_2samp
for col in covariate_cols: treated = train_data[train_data['treatment'] == 1][col] control = train_data[train_data['treatment'] == 0][col] stat, pval = ks_2samp(treated, control) print(f"{col}: KS statistic = {stat:.4f}, p-value = {pval:.4f}")解决:
- 使用倾向性得分匹配
- 使用 IPW 加权
- 使用双重鲁棒方法
8.2 混淆因子遗漏
问题:未观测到的混淆因子导致估计偏差。
缓解策略:
- 敏感性分析
- 工具变量法(如果有)
- 差分法(Difference-in-Differences)
8.3 模型误设(Model Misspecification)
问题:模型假设不符合数据生成过程。
解决:
- 使用非参数方法(如 Causal Forest)
- 集成多种模型
- 交叉验证选择最优模型
9. 总结与展望
9.1 核心要点回顾
-
因果推断核心概念:
- 反事实框架
- ATE vs CATE
- 混淆因子调整
-
YLearn 关键功能:
- 因果发现:PC、GES 算法
- 因果效应估计:S/T/X/DR-Learner
- Uplift Modeling:精准营销
-
实践流程:
问题定义 → 数据收集 → 因果图构建 →模型选择 → 效应估计 → 敏感性分析 → 决策应用
9.2 YLearn vs 其他因果推断库
| 库 | 优势 | 劣势 |
|---|---|---|
| YLearn | 端到端流程、文档丰富、易用 | 社区相对较小 |
| DoWhy | 理论完备、可视化强 | 学习曲线陡峭 |
| EconML | 经济学方法丰富 | 偏学术化 |
| CausalML | Uber 开源、工业级 | 文档较少 |
9.3 未来方向
- 因果强化学习:结合因果推断和 RL
- 时间序列因果:处理动态因果关系
- 因果表示学习:从原始数据学习因果特征
- 因果公平性:消除算法偏见
参考资源
- YLearn 官方文档:https://github.com/DataCanvasIO/YLearn
- 经典教材:
- Causal Inference: The Mixtape by Scott Cunningham
- The Book of Why by Judea Pearl
- 在线课程:
- Coursera: A Crash Course in Causality
- edX: Causal Inference (MIT)
因果推断是数据科学从”是什么”到”为什么”的关键跃升。掌握 YLearn 等因果推断工具,不仅能提升分析深度,更能为业务决策提供可靠的反事实预测,真正实现数据驱动的科学决策。 123
🧠 文章思维导图
mindmap
引言#
1. 因果推断基础理论#
1.1 为什么需要因果推断?#
1.2 因果推断的核心概念#
1.2.1 反事实框架(Potential Outcomes Framework)#
1.2.2 平均处理效应(ATE)#
1.2.3 条件平均处理效应(CATE)#
1.2.4 混淆因子(Confounder)#
1.3 因果推断的三大支柱#
2. YLearn 框架概览#
2.1 YLearn 的设计哲学#
2.2 核心模块#
2.2.1 Causal Discovery(因果发现)#
2.2.2 Causal Effect Estimation(因果效应估计)#
2.2.3 Uplift Modeling(提升建模)#
2.2.4 Policy Learning(策略学习)#
2.3 安装 YLearn#
3. 实战案例一:营销优惠券因果效应分析#
3.1 问题背景#
3.2 数据准备#
3.3 朴素对比的陷阱#
3.4 使用 YLearn 估计 ATE#
3.4.1 准备数据格式#
3.4.2 S-Learner 方法#
3.4.3 T-Learner 方法#
3.4.4 X-Learner 方法(推荐)#
3.4.5 双重鲁棒估计(DR-Learner)#
3.5 估计 CATE(异质性效应)#
3.6 效果评估对比#
4. 实战案例二:Uplift Modeling 精准营销#
4.1 Uplift 建模的核心思想#
4.2 使用 YLearn 实现 Uplift Modeling#
4.3 Uplift Curve 评估#
4.4 精准营销策略#
5. 实战案例三:因果图发现#
5.1 因果图的作用#
5.1.1 PC 算法#
5.1.2 GES 算法(基于评分)#
5.2 使用因果图进行调整集识别#
6. 高级技巧与最佳实践#
6.1 倾向性得分(Propensity Score)#
6.2 逆概率加权(IPW)#
6.3 敏感性分析#
7. 真实业务场景应用#
7.1 A/B 测试增强#
7.2 医疗决策支持#
8. 常见陷阱与解决方案#
8.1 选择偏差(Selection Bias)#
8.2 混淆因子遗漏#
8.3 模型误设(Model Misspecification)#
9. 总结与展望#
9.1 核心要点回顾#
9.2 YLearn vs 其他因果推断库#
9.3 未来方向#
参考资源#支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
引用本文
@article{2024-6-30-应用ylearn框架实现因果推断,
author = {枫语},
title = {应用Ylearn框架实现因果推断},
journal = {枫语},
year = {2024},
month = {jun},
url = {https://meiluosi.github.io/posts/2024-6-30-%E5%BA%94%E7%94%A8ylearn%E6%A1%86%E6%9E%B6%E5%AE%9E%E7%8E%B0%E5%9B%A0%E6%9E%9C%E6%8E%A8%E6%96%AD/}
}