1. 推荐系统中的样本选择基础
在推荐系统的模型训练过程中,正负样本的选取直接决定了模型学习的方向和效果。就像厨师做菜前要精选食材一样,样本选择是推荐算法"烹饪"过程中的第一道工序。我在多个电商推荐项目中发现,同样的算法架构,仅调整样本策略就能带来10%-30%的CTR提升。
正样本通常指用户明确表达喜好的行为,如点击、购买、收藏等;负样本则代表用户不感兴趣的内容。但实际操作中远非这么简单——用户看到未点击的商品就一定是不喜欢吗?可能只是没注意到而已。这里就涉及到样本权重和置信度的问题。
2. 正样本的精细化运营策略
2.1 行为类型的分级处理
不同行为应该赋予不同权重:
- 购买/付费 > 收藏 > 加购 > 点击 > 浏览 我在某跨境电商项目中采用以下分级方案:
behavior_weights = { 'purchase': 1.0, 'add_to_cart': 0.8, 'favorite': 0.7, 'click': 0.5, 'view': 0.3 }2.2 时间衰减因子
用户三个月前买的手机和昨天浏览的手机壳,哪个更能反映当前兴趣?我们引入指数衰减公式:
weight = base_weight * exp(-λ * Δt)其中λ建议取0.02-0.05(天为单位),具体需要通过AB测试确定。
2.3 情境增强策略
同样的行为在不同场景下意义不同:
- 搜索后点击 vs 推荐流点击
- 工作日午间浏览 vs 周末晚间浏览 建议对场景特征进行单独编码,作为模型输入的一部分。
3. 负样本的艺术:从简单到复杂
3.1 基础负样本
最直接的负样本就是曝光未点击(impression-no-click),但要注意:
重要提示:新商品由于曝光量少,直接用未点击作为负样本会导致"冷启动歧视"
3.2 全局负采样
从全量商品中随机抽取作为负样本,这种方法:
- 优点:简单易实现
- 缺点:可能包含用户根本不会看到的商品 建议比例不超过负样本总量的20%
3.3 困难负样本挖掘
这是提升模型区分度的关键,常用方法:
- 同品类曝光未点击商品
- 相似用户不喜欢商品
- 模型预测分数中等的商品
- 对抗网络生成的困难样本
在某视频推荐项目中,我们采用如下混合策略:
def get_neg_samples(user): base_negs = get_impression_negs(user) # 曝光未点击 hard_negs = get_hard_negs(user) # 困难样本 rand_negs = get_random_negs() # 全局负采样 return base_negs * 0.6 + hard_negs * 0.3 + rand_negs * 0.14. 样本平衡与加权策略
4.1 动态样本比例
正负样本比例不是固定的1:3或1:5那么简单。我们发现:
- 早期训练阶段:1:3有助于快速收敛
- 精细调优阶段:1:1提升排序精度
- 在线学习时:实时根据最新数据分布调整
4.2 类别感知采样
对于多品类平台,要防止热门品类主导样本分布。我们的做法:
- 统计各品类正样本数量
- 计算采样概率 = 1 / sqrt(品类样本量)
- 对样本进行类别平衡采样
4.3 重要性加权
结合用户价值和行为强度进行加权:
sample_weight = user_value * behavior_weight * time_decay其中user_value可以根据用户LTV或活跃度计算。
5. 实战中的陷阱与解决方案
5.1 冷启动样本偏差
新商品/新用户样本不足时:
- 对新商品:使用内容相似商品的样本
- 对新用户:采用地域/设备相似的样本
- 添加专门的冷启动标识特征
5.2 位置偏差处理
用户更可能点击靠前位置的内容,这不是因为喜欢。解决方案:
- 在特征中加入位置信息
- 训练时随机打乱展示顺序
- 使用反事实学习消除偏差
5.3 样本穿越问题
严格保证样本时间先后顺序:
- 训练集时间 < 验证集时间 < 测试集时间
- 在线学习时使用时间窗口隔离
在某金融产品推荐项目中,我们建立了严格的数据流水线:
raw_logs → time_partition → feature_engineering → sample_generation → model_training每个环节都进行时间戳校验。
6. 评估与迭代
6.1 离线评估指标
除了常规的AUC/GAUC,建议增加:
- 困难样本准确率
- 长尾品类覆盖率
- 用户分群效果差异
6.2 在线AB测试策略
样本策略改动需要谨慎验证:
- 先小流量(1-5%)观察核心指标
- 重点关注用户体验指标(如停留时长)
- 监控不同用户群体的效果差异
6.3 持续优化闭环
建立样本质量监控看板,跟踪:
- 样本分布变化趋势
- 特征覆盖度
- 线上线下一致性
我在实际项目中总结出一个有效的工作流: 周一分析样本数据 → 周三调整采样策略 → 周五上线实验 → 下周一看结果。这种快速迭代的方式能在2-3周内显著提升模型效果。