返回列表

6th place solution

487. H&M Personalized Fashion Recommendations | h-and-m-personalized-fashion-recommendations

开始: 2022-02-07 结束: 2022-05-09 商品推荐 数据算法赛
第6名解决方案

第6名解决方案

作者: Ethan (Grandmaster) | 比赛: H&M Personalized Fashion Recommendations | 排名: 6th

首先,感谢竞赛主办方举办了这场有趣的比赛,也感谢我优秀的队友们 (@Giba, @qysx, @hyd)。其次,感谢 Kaggle 社区,我从那些优秀的 Kernel 和讨论中学到了很多。

在本次比赛中,我们需要根据用户的历史购买行为向其推荐产品。为了解决这个问题,我们的方案分为两部分:召回 和 排序。生成候选集的良好策略和特征工程对于取得好名次都至关重要。

召回

我们使用了多种方法来生成不同的候选集,以提高正样本的覆盖率(包括用户和用户-商品对)。

  1. u2i: 用户最近购买的商品。
  2. i2i: 基于商品的协同过滤。
  3. u2tag2i: 标签可以是 "product_code"、"product_type_no"、"department_no"、"section_no"。
  4. hot: 针对不同年龄段 用户生成的热门商品。

特征

最重要的特征如下:

  1. count: 基于用户、商品、用户-商品对的计数。利用所有历史数据生成用户特征非常重要。
  2. gap: 用户、商品、用户-商品对首次/最后一次购买时间距今的时间间隔。对于商品的首次购买时间,它可能代表该商品的“发布时间”。我们可以以“用户”为键计算“发布时间”的统计量,这有助于了解用户对新旧商品的偏好。
  3. 商品折扣: 使用最大值/平均值代表商品的常见价格。使用每一行的价格计算商品的折扣。从而我们可以得到用户对打折商品的偏好以及商品最近打折的天数。
  4. tfidf: 将用户历史购买的 article/product_code/product_type_no 设为一个句子,然后使用 tfidf+svd 生成特征。
  5. item_sim: i2i 的协同过滤得分,计算候选商品与用户历史购买商品之间的相似度。
  6. 为 lightgbm 设置 categorical_features(如 "department_no", "product_type_no" 等)可以将 cv 分数提高约 0.0005~0.0008。

模型

我们使用最后 9 周的数据进行训练(最后一周用于验证)。我们最好的单模型是 CatBoost,CV 分数为 0.0403,LB 分数为 0.0341。我们使用了多个模型进行集成(CV: 0.0412, LB: 0.0348)。我们使用了 Giba 之前分享的 Kernel 来处理混合时的不同候选列表。

模型 目标函数 每用户平均候选数 CV MAP@12
catboost binary 120 0.0403
lightgbm binary 120 0.0395
catboost binary 220 0.0402
lightgbm binary 220 0.0396
lightgbm lambdarank 220 0.0400
lightgbm lambdarank 1000 0.0381

我们最佳 CV 的结果在 PB(Public Board)上也是最好的。在 Kaggle 上相信本地 CV 真的非常重要。

Giba 的解决方案

根据过去 2 周的销售热度设定约 1 万个 article_id 候选列表。构建一个包含 customer_id x 10k article_id 所有组合的二分类数据集。分批构建该海量数据集并使用 cudf 加速整个过程。从第 90 周到第 104 周创建二分类训练集。在第 90-103 周训练模型,在第 104 周验证。为了训练模型,为每个 customer_id 随机选择 200、300 或 500 个负样本。混合使用 LightGBM lambdarank、LightGBM xendcg、XGBoost lambdarank 和 CatBoost ranker 训练的模型

同比赛其他方案