第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
-