1. 电商推荐系统的基础架构与数据流程
电商推荐系统本质上是一个数据驱动的决策引擎,它通过分析用户历史行为、商品属性以及上下文环境,预测用户可能感兴趣的商品。典型的推荐系统架构包含数据层、特征层、模型层和展示层四个核心模块,而数据清洗和特征工程正是支撑整个系统的基础环节。
在实际电商环境中,原始数据往往存在各种问题:用户行为日志可能包含爬虫流量,商品类目体系可能不一致,用户画像字段可能存在缺失。我曾参与过一个日活百万级的跨境电商平台推荐系统重构,最初直接使用原始数据训练模型,CTR(点击通过率)只有1.2%。经过系统的数据清洗和特征优化后,效果提升到3.7%,这充分说明了数据质量的重要性。
关键经验:数据清洗不是一次性工作,需要建立持续监控机制。我们团队每周会分析特征分布变化,当数值型特征的KS检验p值<0.05时,就会触发数据质量告警。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 电商数据清洗实战:从原始日志到可用数据
2.1 用户行为日志清洗
电商平台的用户行为数据通常包括点击、加购、下单、支付等事件,这些数据以JSON格式存储在日志服务器。使用Python处理时,我推荐采用pandas的json_normalize方法进行扁平化处理:
python复制import pandas as pd
from pandas import json_normalize
raw_logs = [...] # 从日志服务器获取的原始数据
df = json_normalize(raw_logs,
meta=['user_id', 'timestamp'],
record_path=['behavior_list'])
常见的数据问题及处理方法:
-
无效会话识别:会话时长<3秒的点击很可能是误触或爬虫行为。我们通过计算session内事件时间差来过滤:
python复制df['time_diff'] = df.groupby('session_id')['timestamp'].diff() valid_sessions = df.groupby('session_id').filter(lambda x: x['time_diff'].sum() > 3) -
异常值处理:商品浏览时长超过1小时的数据需要截断。实践中发现这类数据往往是用户离开页面未关闭标签页导致:
python复制df['view_duration'] = df['view_duration'].clip(upper=3600)
2.2 商品数据标准化
不同供应商提供的商品数据往往格式不一。以商品颜色为例,可能有"红色"、"Red"、"#FF0000"等多种表示方式。我们构建了一个商品属性标准化流程:
- 类目体系映射:使用预定义的类目树进行匹配
- 关键属性归一化:对颜色、尺寸等字段建立枚举值词典
- SPU-SKU关系校验:确保子商品继承父商品的正确属性
python复制# 颜色标准化示例
color_mapping = {
'红色': 'red',
'Red': 'red',
'红色系': 'red',
'Rouge': 'red'
}
df['color_std'] = df['raw_color'].map(color_mapping).fillna('other')
3. 电商推荐系统的特征工程体系
3.1 用户特征构建
有效的用户特征应该捕捉长期兴趣和短期意图。我们采用时间衰减加权法计算用户偏好:
python复制import numpy as np
def time_decay_weight(t, half_life=30):
"""时间衰减函数,半衰期默认30天"""
return np.exp(-np.log(2) * t / half_life)
# 计算加权后的品类偏好
df['weight'] = time_decay_weight(current_date - df['behavior_date'])
user_pref = df.groupby(['user_id', 'category'])['weight'].sum().unstack()
3.2 商品特征设计
商品特征需要同时考虑静态属性和动态表现:
- 静态特征:类目、价格段、品牌、材质等
- 动态特征:7日CTR、转化率、库存周转率等
对于新品冷启动问题,我们设计了替代特征:
python复制# 新品相似度特征
from sklearn.metrics.pairwise import cosine_similarity
new_item_vec = [0.8, 0.2, 0.5] # 新品属性向量
existing_items = [[0.7, 0.3, 0.6], [0.9, 0.1, 0.4]]
similarity = cosine_similarity([new_item_vec], existing_items)
3.3 交叉特征与序列特征
高阶特征能显著提升模型效果。我们常用的交叉方法包括:
- 用户-商品交叉:用户历史购买均价 vs 当前商品价格
- 上下文交叉:用户当前浏览品类与商品品类的匹配度
- 行为序列特征:使用RNN编码用户最近20次行为
python复制# 使用[Transformer](https://taotoken.net?utm_source=general)编码行为序列的示例
from transformers import BertModel, Bert[Tokenizer](https://taotoken.net?utm_source=general)
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
# 将用户行为序列转换为token
inputs = tokenizer(behavior_sequence, return_tensors="pt", padding=True)
outputs = model(**inputs)
sequence_embedding = outputs.last_hidden_state.mean(dim=1)
4. 特征存储与更新策略
4.1 实时特征管道设计
现代电商推荐系统需要同时支持批量更新和实时更新。我们的特征存储架构包含:
- 离线特征仓库:Hive表,每日全量更新
- 近线特征服务:Redis,每小时增量更新
- 在线特征缓存:内存哈希表,秒级更新
python复制# 实时特征更新示例
import redis
r = redis.Redis(host='localhost', port=6379)
def update_realtime_feature(user_id, item_id, event_type):
key = f"rt:{user_id}:{item_id}"
with r.pipeline() as pipe:
pipe.hincrby(key, event_type, 1)
pipe.expire(key, 3600*24) # 24小时TTL
pipe.execute()
4.2 特征版本控制
为防止特征漂移导致模型性能下降,我们采用如下策略:
- 特征快照:每天备份全量特征
- 版本元数据:记录每个特征的统计量(均值、方差等)
- 灰度发布:新特征先应用于5%流量
python复制# 特征版本校验脚本
def check_feature_drift(current_features, baseline_features):
drift_report = {}
for col in current_features.columns:
ks_stat = ks_2samp(current_features[col], baseline_features[col])
drift_report[col] = {
'p_value': ks_stat.pvalue,
'is_drifted': ks_stat.pvalue < 0.01
}
return drift_report
5. 效果评估与迭代优化
5.1 AB测试框架搭建
我们设计了分层分流实验框架:
- 流量分桶:基于用户ID哈希分桶
- 指标监控:CTR、转化率、GMV
- 显著性检验:使用双重稳健估计量
python复制# AB测试结果分析
import statsmodels.api as sm
def analyze_ab_test(control_metrics, treatment_metrics):
model = sm.GLM(treatment_metrics,
sm.add_constant(control_metrics),
family=sm.families.Binomial())
results = model.fit()
return results.summary()
5.2 特征重要性分析
通过SHAP值理解特征贡献:
python复制import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
# 可视化单个预测的解释
shap.force_plot(explainer.expected_value, shap_values[0,:], X_test.iloc[0,:])
在最近一次迭代中,我们发现用户最近浏览品类的加权热度(特征重要性0.12)比用户性别(0.03)重要3倍,于是调整了特征工程的重点方向。
6. 工程化实践中的经验总结
-
数据质量监控:我们开发了数据质量看板,监控以下指标:
- 空值率变化趋势
- 数值特征分布变化
- 类别特征基数增长
-
特征计算优化:对于耗时较长的特征,我们采用:
- 预计算:凌晨批量计算全天特征
- 近似计算:使用HyperLogLog统计UV
- 采样计算:对长尾用户使用采样
-
冷启动处理:对于新用户和新商品,我们构建了迁移学习方案:
- 用户冷启动:基于设备、IP等上下文特征
- 商品冷启动:使用商品标题的BERT嵌入向量
python复制# 冷启动特征拼接示例
def get_cold_start_features(user_data, item_data):
user_ctx = extract_context_features(user_data)
item_bert = get_bert_embedding(item_data['title'])
return np.concatenate([user_ctx, item_bert])
在具体实施时,我们发现凌晨4点的特征计算任务经常超时。通过分析发现是Redis大key导致的,解决方案是对特征进行分片存储,将单个用户的特征分散到多个hash key中,这个问题让我深刻理解了分布式存储设计的重要性。
