Kaggle竞赛总结:OTTO 多目标电商商品推荐

比赛名称:OTTO – Multi-Objective Recommender System

基于真实电子商务会话构建推荐系统

比赛链接:https://www.kaggle.com/competitions/otto-recommender-system

比赛类型:推荐系统、电子商务

比赛介绍

本次比赛的目标是预测电子商务点击、购物车添加和订单。您将根据用户会话中的先前事件构建多目标推荐系统。

您的工作将有助于改善所有相关人员的购物体验。客户将收到更多量身定制的建议,而在线零售商可能会增加销售额。

提交在 Recall@20 上针对每种操作类型进行评估,三个召回值是加权平均的:{'clicks': 0.10, 'carts': 0.30, 'orders': 0.60}

数据描述

本次比赛的目标是预测电子商务点击、购物车添加和订单。您将根据用户会话中的先前事件构建多目标推荐系统。

训练数据包含完整的电子商务会话信息。对于测试数据中的每个会话,您的任务是预测测试会话中最后一个时间戳 ts 之后发生的每个会话类型的帮助值。

  • session - 唯一的会话 ID
  • events - 会话中按时间排序的事件序列
  • aid - 相关事件的文章 ID(产品代码)
  • ts - 事件的 Unix 时间戳
  • type - 事件类型,即产品是否被点击、添加到用户的购物车或在会话期间订购

优胜解决方案

第二名:SOS3

(队员一)senkin13:https://www.kaggle.com/competitions/otto-recommender-system/discussion/382839

整体思路

Kaggle竞赛总结:OTTO 多目标电商商品推荐

召回

该竞赛数据没有user/item信息,并且流行性不起作用,我们努力改进召回方案,我们发现只有重复行为、下一个行为和itemcf是有效的,重复行为、接下来的行为没有什么可做的,最重要的工作是改进itemcf,我们尝试了各种矩阵和itemcf权重,并取得了成效。

尝试的行为矩阵:

  • 手推车订单
  • 单击购物车和订单
  • 点击购物车订单

尝试调整的权重:

  • 类型
  • 共现时间距离
  • 共现顺序
  • 会话操作命令
  • 人气

排序

  • 特征工程

基本上,基于召回策略创建特征,主为重复行为、下一个行为、itemcf的聚合的协同过滤分数、嵌入检索的相似性创建user-item交互。

我为订单/购物车模型使用了198个特征,为点击模型使用了106个特征

类型 描述
聚合 session、aid、session-aid、计数,按当前session聚合的每种行为type
下一个行为 session的最后aid的下一个aid出现次数
时间 session、aid的首次、末次行为时间
基于协同过滤分数 基于session的最后一个aid、最后小时的aids、所有的aids与候选aid的协同过滤分数(最大、总和、加权和等)
基于嵌入向量相似分 基于word2vec(aid2aid)、ProNE(session2aid)的cosine similarity
  • 验证集

我用标签构建了3周的训练数据,最后一周用作验证,然后用固定的轮数重新训练所有训练数据,并用于测试数据的预测,CV与LB非常匹配,我们不需要通过提交来观察LB。

  • 模型

在H&M比赛中,我最好的模型是lightgbm,我在这次比赛中也从lightgbm开始,在最后几天我尝试了catboost ranker,结果让我惊讶,订单模型提升0.0007,购物车模型提升0.002,点击模型提升0.0012。

我最好的单模是catboost ranker,CV 0.59066=0.67100.6+0.44160.3+0.5558*0.1,LB 0.602=0.409+0.137+0.056。

最后,我与lightgbm和catboost混合,混合LB更高0.602,与队友的0.602混合后,LB为0.604

优化

最后几天,我将所有的特征工程代码从panda重写为polar,polar的速度要快得多,尤其是两个大表连接,从pandas.merge到polars.join速度上提升40多倍。

我使用TreeSite加速lightgbm推理速度(快2倍),catboost gpu比lightgbm cpu推理快30倍。

队友补充

(队员二)ONODERA:https://www.kaggle.com/competitions/otto-recommender-system/discussion/382790

提到,队友已经有了出色的功能,但CF功能还有改进的空间。因此,聚焦于CF相关特征,具体如下:

  • 计数
  • 时差
  • 序列差异
  • 加权统计
  • 聚合统计

总共有93个特征。在这之后,我可以使用不同的组合(例如点击订购、购物车订购等)生成几乎4k个特征,我最终只使用了400~500个特征。

模型则是使用XGBoost and CatBoost。

第五名:CWKTJ

https://www.kaggle.com/competitions/otto-recommender-system/discussion/382783

我们的解决方案是两个团队先前解决方案的组合版本。在团队合并之前,我们的训练有效分割、召回方法、特征集和重新排列模型都是不同的。我们不仅简单地集成了我们的独立提交文件,还交换了进一步改进的特征。

集成

在这里,我们使用小写字母表示提交版本(a,b,…),它可以是一个重新提交的5倍集合,也可以是两个或多个提交的集合。S1和S2是公共验证数据分割和私有再生验证数据分割。R1和R2是两种不同的召回方法。F1和F2是两个不同的特征集,F'1和F'2是重要的特征子集。XGB和CBT表示xgboost和catboost ranker 。“+”表示分数集合,这意味着我们对多个模型的原始输出进行平均,以重新排列候选。“&”表示索引集合,这意味着我们为前20名候选人分配索引分数,从1.00到0.05,步长为0.05,然后我们使用召回分数的总和对候选item进行重新排序。我们的最终解决方案应该是:

  • c = a * 0.45 & b * 0.575
  • d = d1 * 0.5 + d2 * 0.5
  • e = e1 * 0.5 + e2 * 0.5
  • g = c * 0.5 & d * 0.4 & e * 0.6
  • h = (c * 0.5 & d * 0.5) & f * 0.5
  • i = g * 0.6 & h * 0.5

Kaggle竞赛总结:OTTO 多目标电商商品推荐

召回方法

  • R1

这种召回方法是基于公共jupyer notebook(4个矩阵:点击、购物车、订单和购买)开发的,并由numba优化。

特征集

  • F1

F1包括统计特征和模型训练特征。与大多数团队一样,我们使用交互历史和共同访问分数的总和、最大值、最小值和平均值,基于session、aid和交互的聚合。大多数统计特征的重要性并不显著。

在模型训练特征中,我们使用了来自implicit包的BPR、ALS和LMF,来自gensim包的W2V和SAS。在这里提到的所有算法中,我们都可以得到item的embedding,因此我们使用候选嵌入和session最新平均嵌入的内积作为交互特征。在BPR、ALS和LMF中,我们可以获得会话和项目的嵌入,因此我们另外使用session嵌入和候选嵌入的内积作为交互特征。

特征重要性

我们使用reranker模型中的特征重要性来决定要交换哪些特征。

第六名:NikhilMishra

https://www.kaggle.com/competitions/otto-recommender-system/discussion/382802

候选集生成

我认为有一个强有力的候选集产生方法对我帮助很大,所以我是这样做的。

每个session的候选项个数:我在大部分比赛中产生了80个候选项,然后在最后阶段将其提高到120个,并提高约0.001的分数。我对80个候选项的最大召回率为0.648(在验证集上)。我也在一次实验中尝试了200名候选人,但这对分数没有帮助。

此外,如果我从自己的候选集生成模型中选取前20个候选项,我的LB分数将为0.585。

对于候选集的生成,我使用了类似于covisit矩阵的方法,并基于不同行为组合构建多个covisit矩阵,如

  • 任何操作到任何操作
  • 点击加购
  • 订单加购
  • 订单到订单

为了保持低内存使用率,我只选择了排名前(k*100)的候选项。K是我想要生成的候选项个数。

此外,我还通过第一项的频率对权重进行了归一化。矩阵中的权重通过我们所讨论的两个aid之间访问的item数量进行了归一化。假设我们有5个aids,aid1、aid2、aid3、aid4、aid5。那么(aid1,aid5)的权重将为(5-1)/(aid1的频率)。

此外,(aid5,aid1)的权重将为(aid1,aid5)/2(只是添加一些类似于购买aid5是由购买aid1驱动的,而不是反过来)。对于推断时间,为了决定我应该选择哪一个前k名候选,我使用optuna,将每个covisit矩阵的权重、item最近性的权重、该项目的标准化总体频率等作为参数。

特征生成

基本特征,如item的频率、点击与加购的比率等,访问item的最近时间(如果session中的候选项超过20个,这将非常有用)。

生成的候选项与session中任何已看到的aid的关联。这可以通过使用covisit矩阵权重来创建。深入了解这些特征帮助我大大提高了分数。其想法是,可以用不同的方式创建covisit矩阵,以建立两个item之间的关系,例如:

  • 只计算两个aid之间的平均距离(aids共现次数)。
  • 距离也可以用时间戳差来衡量。
  • 只考虑第一邻居的候选aid(直接候选人)。
  • 只考虑最近周的关系等。

排序模型

我使用了lightgbm,进行5%的负采样,大约400个特征,以及最近两周的数据。一些对我有用的东西或技巧:

  • 使用单个模型(而不是3个单独的模型)训练所有点击、购物车和订单。这在本地很容易被认为得到了大约0.001到0.002更好的分数(数据被分组到session中,而不是分组到session、type)。
  • 在排序时,对点击、购物车和订单使用单独的标签,将标签增益排序为订单(6)->购物车(3)->点击(1),而不是在用户执行操作(点击、购物和订单)时使用1,而在用户未执行操作时使用0(这将分数提高约0.0005)。
  • 使用阶段1候选生成模型的排名作为阶段2模型的特征。如果你认为,第一阶段模型的权重可以达到0.585,所以使用这个排名是我模型的重要特征。

【竞赛报名/项目咨询请加微信:mollywei007】

微信扫一扫,分享到朋友圈

Kaggle竞赛总结:OTTO 多目标电商商品推荐
上一篇

英国Halcyon London International School哈尔西恩伦敦国际学校介绍

你也可能喜欢

  • 暂无相关文章!

关注热点

返回顶部