返回列表

20th Place Solution

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

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

致谢

首先,我要感谢组织者和那些分享知识的人。特别感谢 @cdeotte@radek1 发布了如此多的代码和讨论。我从你们那里学到了很多。

考虑到关于可能存在的作弊者的争议,我将在一切尘埃落定后发布完整代码,目前只分享这个方案中的思路。(尽管 Will 说分享代码不应该被保留

方案摘要

Solution Summary

我的代码在这里:https://github.com/kiccho1101/kaggle-otto2

交叉验证策略

CV Strategy

  • 我使用了 Radek 的 CV 策略。
  • 虽然 CV 数据很适合本地实验,但运行实验花费了相当长的时间,所以我通过随机抽样只使用了 1/20 的会话。结果,运行一个实验的平均时间变成了大约 10~30 分钟,这使我可以快速运行许多实验。
  • 即使我对数据进行了抽样,CV-LB 分数的相关性也非常稳定。
  • 每个阶段使用的数据如下表所示:
步骤 CV LB
候选生成 TrainData + ValidDataA TrainData + ValidDataA + ValidDataB + TestDataA
用户特征创建 ValidDataA TestDataA
物品特征创建 TrainData + ValidDataA TrainData + ValidDataA + ValidDataB + TestDataA
用户-物品特征创建 ValidDataA TestDataA
重排序 ValidDataA TestDataA

第一阶段 - 候选生成

word2vec

  • 使用 aid 序列训练 word2vec 模型。
  • 通过 word2vec 嵌入检索 top-k aids(使用 faiss-gpu 加速)。

CoVis (共访矩阵)

  • 我使用了 Chris 的共访矩阵来生成候选。

Item MF (物品矩阵分解)

class ItemMFModel(nn.Module):
    def __init__(self, n_aid: int, n_factors: int):
        super().__init__()
        self.criterion = BPRLoss()
        self.n_factors = n_factors
        self.n_aid = n_aid
        self.aid_embeddings = nn.Embedding(self.n_aid, self.n_factors)

        initrange = 1.0 / self.n_factors
        nn.init.uniform_(self.aid_embeddings.weight.data, -initrange, initrange)

    def forward(self, aid_x, aid_y):
        aid_x = self.aid_embeddings(aid_x)
        aid_y = self.aid_embeddings(aid_y)
        return (aid_x * aid_y).sum(dim=1)

    def calc_loss(self