返回列表

7th Place Solution

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

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

第7名方案

作者: Jack (Japan), toshi_k
比赛排名: 第7名

首先,感谢主办方举办了这场超级激动人心的比赛!同时也感谢大家在比赛中分享了许多重要的见解。这些讨论对我们取得这样的成绩非常有帮助。

1. 概述

我们的团队由两名成员组成:Jack 和 toshi_k。虽然我们都是竞赛特级大师,但我们各有专长。在组队之前,我们的方法截然不同。两种方法的集成弥补了彼此的弱点,并助推我们的团队获得了金牌。

我们的解决方案由 LightGBM 部分、GNN(图神经网络)部分和集成部分组成。Jack 负责 LightGBM 部分,他训练了我们团队中最好的单模型。toshi_k 负责 GNN 部分和集成,他利用现代深度学习训练了独特的模型。通过集成,这为团队分数贡献了 +0.003。

LightGBM 部分的详情在第 2 节中描述。GNN 部分在第 3 节中描述。集成方法和结果在第 4 节中描述。

Overview

2. LightGBM 部分 (作者:Jack)

2.1 候选生成

在深入细节之前,我必须说明这里描述的方法是我自己的,但在优化 Recall@20 时,它与验证集上的 Chris 的公共 Notebook 性能差异很小。因此,目前尚不清楚它有多大优势。

基本思想是基于共现矩阵近似一种后验概率(我们称之为候选分数),并从中选择得分最高的作为候选。这些候选对于所有三种动作类型都是通用的。

会话的最后 10 个 aid 和动作类型用于计算候选分数。即,分数可以如下计算:

$$Score(aid) = P(aid | (aid_1, type_1), (aid_2, type_2), …, (aid_{10}, type_{10}))$$

在这里,我们强制假设每个动作是独立和条件独立的,类似于朴素贝叶斯的概念:

$$\\begin{eqnarray}\nScore(aid)\n&=& P(aid) \\cdot \\frac{P((aid_1, type_1), …, (aid_{10}, type_{10}) | aid)}{P((aid_1, type_1), …, (aid_{10}, type_{10}))} \\\\\\\\\n&\\approx& P(aid) \\cdot \\prod_{i=1}^{10} \\frac{P((aid_i, type_i) | aid)}{P(aid_i, type_i)} \\\\\\\\\n&=& P(aid) \\cdot \\prod_{i=1}^{10} \\frac{P((aid_i, type_i), aid)}{P(aid_i, type_i) P(aid)}\n\\end{eqnarray}$$

乘积内的项是联合概率与单个概率乘积的比率,代表 P(aid) 因观察到 (aid_i, type_i) 而增强的程度。在这种数据下假设上述独立性几乎是不可能的,因此该值可能超过 1,不再是概率。然而,我期望它在优先排序候选方面能工作得相当好。

上述方程中的每一项都是通过计算每个 aid 的频率和 aid 对的共现频率并除以会话总数获得的。在计算共现矩阵时,仅计算 24 小时内的交互,并且在同一会话中不进行多次计数。计算周期是包括测试数据在内的整个周期(在推理阶段),并且两个方向的共现都要计算。

共现矩阵并不保存所有 aid 对,只保存每个 aid 有许多共现的那些。对于不在共现矩阵中的 aid 对,上述公式右侧的联合概率比率设为 1,以便它们不影响分数计算。

在实际计算中,取对数并进一步加权最近的动作,如下所示:

$$Score(aid) = \\log(P(aid)) + \\sum_{i=1}^{10} \\frac{11-i}{10} \\cdot \\log \\left( \\frac{P((aid_i, type_i), aid)}{P(aid_i, type_i) P(aid)} \\right)$$

还结合了许多其他启发式方法,例如添加伪计数和按动作类型调整,但它们太复杂了,这里就不提了。

从候选分数最高的开始,取前 200 个作为训练数据,前 300 个作为测试数据的推理,然后添加已经访问过的 aid 作为最终候选。

这样获得的前 200 个候选在验证集上的召回率如下:

  • clicks: 0.697
  • carts: 0.559
同比赛其他方案