487. H&M Personalized Fashion Recommendations | h-and-m-personalized-fashion-recommendations
恭喜获得第一名的赢家以及所有的参赛者。感谢竞赛组织者举办这场有趣的比赛。这是我队友 @paweljankiewicz 和我的解决方案。
我在召回产品候选集方面做得不是很好。起初,我尝试了 itemCF 等召回方法,但后来发现效果甚至不如直接选择热门产品。因此,我的解决方案是直接为每个用户选择约 600 个最热门的产品(会有一些非常简单的策略参考用户的历史记录)。然后训练一个 lgb 模型,根据模型分数为每个用户选择 130 个候选者,然后将用户在历史中购买的所有产品添加为最终候选。
之后,训练另一个 lgb 模型以获得最终结果。与召回阶段的 lgb 模型相比,特征会更加复杂,特征主要分为以下几组:
单模型在排行榜上的分数是 0.0355,加入 @paweljankiewicz 的候选者后可以提升到 0.0362,集成分数为 0.0368。
我主要遵循了帖子中的建议。我很高兴我的直觉是正确的。总体而言,在与 wht1996 合并之前,我专注于生成多样化的召回策略。解决方案中最有趣的部分不是逻辑,而是我用 Rust 编写了特征工程部分,并创建了一个用于并行特征提取的迷你框架。我认为这样我可以处理更复杂的规则,而且速度仍然很快。
我使用了各种各样的计数器来衡量不同组中项目的流行度:
我还使用了:
特征:
最后,我为每个客户准备了 1000 个候选者,这实在太多了。我很难突破 0.0340,但在 wht1996 的帮助下,我设法将单模型提升到了 0.0348。
我设法为 LGBMRanker 编写了一个 lambdarankmap 目标函数(主要是通过复制 XGBoost 的代码),它比 lambdarank(使用 NDCG 目标)稍好一些。在整个竞赛过程中,我使用 2-3 个月的交易数据进行训练,并使用最后一周进行验证。
深度学习模型——我尝试了几种 recbole 模型,但效果并不好。
竞赛的很大一部分是关于预测不同 postal_code 的产品可用性。我认为这在某种程度上是伪装成推荐系统竞赛。对于未来的竞赛,我建议: