返回列表

9th Place Solution

532. OTTO – Multi-Objective Recommender System | otto-recommender-system

开始: 2022-11-01 结束: 2023-01-31 商品推荐 数据算法赛
第9名方案

第9名方案

作者:rotto (MASTER) | 比赛排名:第9名

我要感谢 Kaggle 工作人员和 OTTO 团队组织了这场有趣的比赛!

我很庆幸自己能够坚持到最后,尽管在比赛的最后阶段我的分数没有太大提高。

以下是我的解决方案:

候选生成 (Candidate generation)

  • 重访 (re-visit) - 会话历史中的所有项目。
  • 共现矩阵 (co-visitation matrix)
    • any2any, click2click, click2cart, click2order, (click or cart)2order, (cart or order)2order 等等。
    • 我尝试了各种模式来创建共现矩阵。例如:不考虑时间的操作、动作后的立即操作、5或10个动作内、5或10分钟内等等。
  • 创建 click2click (仅考虑下一个项目) 图并应用 ProNE
    • 这个想法源于一个假设:在一个项目被点击后立即被点击的项目彼此相似。
    • 我创建了一个两列的 DataFrame (一个项目和紧随其后被点击的项目) 并通过 ProNE 运行它。ProNE 的维度数为 1000,我增加的维度越多,候选召回就越准确。
    • 通过 ProNE 嵌入检索 top-k aids (使用 cuml.neighbors.NearestNeighbors 和 metric='cosine')。
  • word2vec
    • 使用 aid 序列训练 word2vec 模型 (使用 gensim, size=50 或 100)。
    • 通过 w2v 嵌入检索 top-k aids (使用 cuml.neighbors.NearestNeighbors 和 metric='cosine')。

重排序 (Re-Ranking)

模型

  • LGBMRanker (lambdarank)
  • 我分别为点击、加购和订单创建了三个模型。

交叉验证 (CV)

  • 我使用主办方的旧版本脚本创建了验证集。
  • 训练时我为每个会话创建了 100 个候选。
  • 候选召回率 (candidate recall)
    • click: 0.6622
    • cart: 0.5113
    • order: 0.7059
  • CV 分数
    • click: 0.5601
    • cart: 0.4414
    • order: 0.6664
  • 推理时我为每个会话创建了 300 个候选。
  • Public LB: 0.603, Private LB: 0.603

特征 (Feature)

  • 会话特征 (session features)
    • 按会话统计的类型计数 (type='clicks' or 'carts' or 'orders')
    • 按会话统计的唯一类型数量 (type='clicks' or 'carts' or 'orders')
    • 按会话统计的类型平均值 ('clicks'=1, 'carts'=2, 'orders'=3 并按会话取平均值)
  • 商品特征 (aid features)
    • 所有会话内的类型计数 (type='clicks' or 'carts' or 'orders')
    • 测试会话内的类型计数 (type='clicks' or 'carts' or 'orders')
    • 同一会话内的点击转加购率、加购转下单率、点击转下单率
  • 会话 x 商品特征 (session x aid features)
    • 共现计数、比率、时间加权计数、比率等
    • 相似度 (similarity)
      • 候选项目与会话最后一个项目之间的余弦相似度 (w2v, ProNE)
      • 候选项目与会话倒数第二个项目之间的余弦相似度 (w2v, ProNE)
      • 候选项目与会话所有项目之间的余弦相似度 (w2v, ProNE)
      • click2click Jaccard 指数得分

效果不佳的方法 (What did not work well)

  • 使用 node2vec 创建候选
  • GRU
  • RecVAE
  • SAR
  • BPR
同比赛其他方案