1. 从相关性到因果性:推荐系统的认知升级
在传统推荐系统中,我们常常陷入一个统计陷阱:将相关性误认为因果性。举个例子,当观察到"购买了咖啡机的用户也经常购买咖啡豆"时,系统可能会简单地将咖啡机与咖啡豆进行强关联推荐。但这里隐藏着一个关键问题:用户购买咖啡豆是因为看到了咖啡机推荐,还是因为他们本来就计划购买咖啡豆?
这个看似简单的区别,在实际业务中可能造成巨大的决策偏差。我曾在一次A/B测试中发现,某个推荐策略表面上的点击率提升了15%,但经过因果分析后发现,这完全是由季节性因素(当时正值冬季热饮消费高峰)导致的,推荐策略本身的真实效果几乎为零。
1.1 因果推理的核心概念
因果推理要解决的根本问题是反事实思考:如果采取了不同的行动,结果会有什么不同?在推荐系统语境下,这转化为三个核心概念:
- 处理效应(Treatment Effect):推荐某个商品对用户行为产生的真实影响
- 混杂因素(Confounder):同时影响推荐展示和用户行为的变量(如用户活跃度、时间段等)
- 反事实结果(Counterfactual):如果用户没有看到这个推荐,会发生什么?
数学上,我们使用潜在结果框架(Potential Outcome Framework)来表达:
ATE = E[Y₁ - Y₀]
其中Y₁表示用户看到推荐时的结果,Y₀表示未看到时的结果。这个平均处理效应(ATE)才是我们真正关心的因果量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 倾向得分匹配的工程实现
2.1 数据准备与特征工程
在实际项目中,数据准备往往比模型构建更关键。以下是一个增强版的数据准备示例:
python复制import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 模拟更真实的电商数据
np.random.seed(42)
n_samples = 10000
data = pd.DataFrame({
'user_id': range(n_samples),
'treatment': np.random.binomial(1, 0.5, n_samples), # 是否展示推荐
'age': np.random.randint(18, 65, n_samples),
'gender': np.random.binomial(1, 0.4, n_samples),
'history_purchases': np.random.poisson(5, n_samples),
'last_visit_days': np.random.exponential(10, n_samples),
'device_type': np.random.choice(['mobile', 'desktop', 'tablet'], n_samples),
'purchase': np.zeros(n_samples) # 待填充的结果
})
# 模拟真实的购买行为(含混杂因素)
purchase_prob = 1 / (1 + np.exp(-(
0.3 * data['treatment']
+ 0.1 * (data['age'] - 40)/10
- 0.2 * data['last_visit_days']/10
+ 0.4 * (data['history_purchases'] - 5)
)))
data['purchase'] = np.random.binomial(1, purchase_prob)
# 特征标准化
scaler = StandardScaler
