文章目录[隐藏]
赛题名称:H&M Personalized Fashion Recommendations
赛题任务:为用户提供时尚商品推荐
赛题类型:推荐系统
https://www.kaggle.com/c/h-and-m-personalized-fashion-recommendations/
赛题介绍
H&M在线商店为购物者提供了广泛的产品选择供他们浏览。但是如果选择太多,客户可能无法很快找到他们感兴趣的东西或他们正在寻找的东西,最终他们可能不会购买。
在本次比赛中,参赛选手可以使用历史交易数据、商品元信息和商品图像数据。赛题提交的内容根据 Mean Average Precision @ 12 (MAP@12) 进行评估:
参赛选手需要对所有 customer_id 值进行购买预测,无论这些客户是否存在历史购买记录。对于每个客户,需要预测下一个 7 天内客户将购买的预测商品。
赛题数据
您的任务是预测每个客户在训练数据期之后的 7 天内将购买的 article_ids。赛题数据可以划分为如下几个部分:
- images/- 每个article_id的图片,放置在以 article_id 的前三位数字开头的子文件夹中,但并非所有 article_id 值都有相应的图像。
- articles.csv- 每个可供购买的 article_id 的详细元数据.
- customers.csv- 顾客基础信息
- transactions_train.csv- 交易训练数据,包括每个客户每个日期的购买量,重复的行对应于同一项目的多次购买。
赛题难点
- 赛题包含了多个维度的数据信息,可以从用户协同 & 物品协同 & 内容协同的角度进行召回。
- 赛题中包含article_id的类别信息,因此需要考虑商品类别的搭配。此外还需要考虑价格和季节因素。
- 赛题的中包含了30GB图片数据,136W行交易数据,需要大量的计算资源。
优胜解决方案
第一名:senkin13 & 30CrMnSiA
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324070
我们的解决方案是使用各种检索策略 + 特征工程 + GBDT,看似简单但功能强大。我们生成了近期流行单品,因为时尚变化快,有季节性。我们也尝试添加冷启动单品,但由于缺乏购买交互信息,并没有起作用。
整体思路
模型绝大部分的特征来自用户和商品,我们发现图片信息作用不大,但图片可以对冷启动有效。因为近50%的用户最近3个月没有交易,所以我们为他们创建了很多累积特征,以及上周、上个月、上季活跃用户的特征。
我们使用6周的数据作为训练,1周数据作为验证。这样模型验证集和榜单精度是一致的。我们重点改进LightGBM模型在验证集的精度。验证集精度为0.0430,榜单精度为0.0362。
召回
在比赛前期,我们重点考虑Top100候选项的命中数,尝试各种策略覆盖更多的正样本。
召回方法包括:经常复购的商品、ItemCF召回、相似商品、流行度、图嵌入、LR + 逻辑回归进行召回
排序
大部分排序特征来自召回阶段,并进行了复用。如果我们为每个用户的商品的负样本下采样。
我们最好的单模型是LightGBM,最后我们训练了5个 LightGBM 和 7 个 CatBoost 分类器用于集成。
性能优化
- 我们使用 TreeLite 来加速 lightgbm 推理速度(快 2 倍),catboost-gpu 比 lightgbm-cpu 推理快 30 倍。
- 将所有分类特征转换为标签编码
- 创建特征存储,将中间特征文件保存到字典
- 将所有用户拆分为 28 组,多个服务器进行推理。
第二名:hello world
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324197
整体思路
我一开始尝试过itemCF等召回方式,后来发现效果甚至不如直接选择热门商品。因此我的解决方案是直接为每个用户选择大约600个最受欢迎的产品(会有一些非常简单的策略来参考用户的历史)。
然后训练一个LightGBM模型,根据模型得分为每个用户选出130个候选,然后将用户在历史上购买的所有商品添加为最终候选。
召回
我们使用各种计数来衡量不同组中商品的受欢迎程度:
- 客户属性的不同的组合
- 商品属性的属性不同的组合
- 不同日期下的组合
排序
在排序模型中特征主要分为以下几组:
- 用户基本特征:包括num、price、sales_channel_id。
- 商品基本功能:根据商品的各个属性进行统计,包括次数、价格、年龄、sales_channel_id、FN、Active、club_member_status、fashion_news_frequency、上次购买时间、平均购买间隔。
- 用户商品组合特征:根据商品的各个属性进行统计,包括num、time、sales_channel_id、上次购买时间、平均购买间隔。
- 年龄段产品组合特征:各年龄段下的产品热度。
- 用户产品复购特征:用户是否会复购产品,产品是否会被复购。
- 高阶组合特征:例如,预测用户下次购买产品的时间。
- itemCF feature:通过itemCF计算每个item的相似度,进而计算出用户是否会购买该产品的评分。
我为LGBMRanker 编写了一个 lambdarankmap 目标损失,它比 lambdarank稍微好一点。在整个比赛中,我使用 2-3 个月的交易来训练模型,并在一周数据上进行验证。
第三名:sirius
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324129
我们的思路也是先召回,然后进行排序。在召回阶段加入了多路的召回方法,召回方法包括:
- 流行度
- 历史购买的相似商品
- 不同属性的热门商品
- 最近购买的同款商品
在排序阶段首先进行了下采样,正负样本比为1:30。排序阶段的特征包括:
- 用户和商品静态属性
- 最近 7 天、30 天和所有交易中的 user-item 和 user-item 属性的计数。
- 交易中用户项目和用户项目属性的日期差异;
- 用户和项目之间的相似度:
- BPR 矩阵分解 user2item 相似度
- word2vec item2item 相似度
- 用户购买的商品属性与目标商品属性之间的jaccard相似度
- 历史购买商品的图片相似度
- 商品流行度
- 在过去 7 天、30 天和所有交易中购买的物品/物品属性的计数;
- 时间加权受欢迎程度,其中权重为 1/days of now 减去 purchased date
第四名:Hongwei Zhang
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324094
首先为每个客户使用不同的召回模型生。然后建立一个排序模型。我创建了 5 折,并使用 3 折作为训练数据。我也尝试了更多的训练数据,但并没有增加局部的CV和LB。
召回
- Item2item CF
- 每位顾客最近购买的20件商品
- 上周的热门排名。
- Two Tower MMoE
第五名:HAO
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324098
召回
召回方法包括以下部分:
- U2I:基于用户的协同过滤。
- I2i:基于项目的协同过滤
- word2vec相似度
- 不同客户属性(如年龄段、性别等)的热门商品
总共使用 21 种召回方法来创建候选文章。
第六名:Hard2Rec
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324075
召回
我们使用了几种方法来生成不同的候选对象,以提高正样本(用户和用户项目)的覆盖率。
- u2i:用户最近购买的商品
- i2i:基于项目的协同过滤
- u2tag2i:标签可以是“product_code”、“product_type_no”、“department_no”、“section_no”
- hot:为不同的用户生成hot items
排序
- count: user, item, user-item based,重要的是使用所有的历史数据来生成用户的特征。
- gap: user, item, user-item first/last purchase time to now。对于物品的首次购买时间,它可能代表该物品的“发布时间”。
- items discount:使用max/mean表示商品的普通价格。使用每一行的价格来计算商品的折扣。
- tfidf:将用户历史购买的article/product_code/product_type_no设置成一句话,然后使用tfidf+svd生成feature。
- item_sim:i2i的协同过滤得分,计算候选者与用户历史购买之间的item。