共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
问题定义:小龙虾推荐的特殊性
小龙虾作为一种季节性明显的非标品,在构建推荐系统时面临几个独特挑战:

- 季节性波动 :消费高峰集中在 5 - 9 月,模型需要快速适应销量陡增和特征变化
- 非标品特征提取 :规格(如 4 - 6 钱 / 只)、产地(潜江 vs 盱眙)、烹饪方式(麻辣 / 蒜蓉)等离散特征需要特殊编码
- 强地域偏好 :用户对辣度接受度和虾源新鲜度的敏感度存在明显地域差异
技术选型对比
针对小龙虾场景,我们对比了三种主流方案:
-
基于内容的推荐 (CB)
优点:可解释性强,冷启动效果好
缺点:难以捕捉 ” 小龙虾 + 啤酒 ” 这类组合偏好 -
协同过滤 (CF)
优点:能发现 ” 喜欢蒜蓉虾的用户也爱十三香 ” 的隐含关系
缺点:需要至少 30% 的用户有过历史行为 -
深度学习 (DNN)
优点:可融合图像特征(如虾膏饱满度)
缺点:训练成本是 CF 的 5 倍以上
最终方案 :采用 CF+CB 的混合模型,用 FFM 处理离散特征,计算成本控制在单次预测 <50ms
核心实现
物品特征矩阵构建
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# 原始数据示例
raw_data = [{'id': 1001, 'weight_g': 25, 'origin': '潜江', 'cooking': '麻辣', 'price': 88},
{'id': 1002, 'weight_g': 30, 'origin': '盱眙', 'cooking': '蒜蓉', 'price': 108}
]
# 特征分箱与编码
df = pd.DataFrame(raw_data)
df['weight_bin'] = pd.cut(df['weight_g'], bins=[0, 20, 25, 30]) # 重量分箱
encoder = OneHotEncoder()
categ_features = encoder.fit_transform(df[['origin', 'cooking', 'weight_bin']])
时间加权协同过滤
from surprise import SVD, Dataset
from surprise.model_selection import train_test_split
# 加载用户评分数据(包含时间戳)data = Dataset.load_builtin('ml-100k')
trainset, testset = train_test_split(data, test_size=0.2)
# 时间衰减函数:近 3 个月的行为权重为 1,之后每月衰减 30%
algo = SVD(weight_func=lambda t: 1 if t > 90 else 0.7**(t//30))
algo.fit(trainset)
生产环境考量
特征漂移监控方案
-
监控指标 :每日计算 KL 散度对比特征分布变化
from scipy.stats import entropy def kl_divergence(p, q): return entropy(p, q) if len(p)==len(q) else float('inf') -
报警阈值 :当周维度 KL 值 >0.15 时触发特征重新编码
服务降级策略
- 一级降级 :Redis 故障时切换本地 LRU 缓存(保存最近 1 小时 Top1000 商品)
- 二级降级 :模型超时后返回地域热门榜单
避坑指南
- 敏感特征处理 :
- 错误做法:直接使用 GPS 坐标作为特征
-
正确方案:聚类到商圈级别(如北京三里屯)后 One-Hot 编码
-
冷启动解决方案 :
- 新用户:60% 热门商品 + 40% 基于注册时选择的偏好标签(如 ” 喜欢麻辣 ”)
- 新商品:用图像分类模型提取视觉特征(虾壳颜色、膏体饱满度)
扩展思考
尝试将小龙虾与啤酒、烧烤等搭配品构建商品关系图,用 GNN 实现跨品类推荐:
- 构建异构图:用户 - 小龙虾 - 啤酒三类节点
- 使用 PinSAGE 算法学习节点嵌入
- 线上服务时用 Faiss 加速最近邻检索
代码示例:
import torch
from torch_geometric.data import HeteroData
# 构建异构图
data = HeteroData()
data['user'].x = ... # 用户特征
data['crayfish'].x = ... # 小龙虾特征
data['beer'].x = ... # 啤酒特征
data['user', 'buys', 'crayfish'].edge_index = ... # 购买关系
实践心得
在美团外卖的实际应用中,这套方案使小龙虾品类的 GMV 提升了 23%。关键收获是:
1. 重量规格分箱比直接使用克数效果更好
2. 夏季需要将模型更新频率从月调为周级别
3. 用户对配送时间的敏感度是普通餐饮的 2 倍,需要作为强特征处理
下一步计划尝试用强化学习优化推荐时机,比如识别用户通常在周五下班后点小龙虾的行为模式。
正文完
