第26名方案
第26名方案
作者: Sumire, ruik
比赛: H&M Personalized Fashion Recommendations
首先,感谢 Kaggle 团队、H&M 员工和所有的参赛者。
这是一个非常有趣且设计精良的比赛(虽然有一点小波折),我很兴奋能参与其中。
很荣幸我们的团队(@ruik 和我)在 Private Leaderboard 上获得了最高排名,但我们也感觉到了通往金牌的“墙壁”。
我们会继续努力,直到成为 Master。
无论如何,让我分享一下我们的解决方案。如果您能对我们的方法提出评论或建议,我会非常高兴。
流程(Pipeline)
与其他人没有太大区别,非常简单。
- 从每位客户过去 N(=96) 周的历史交易中生成基础候选集。此时不包含历史交易中未出现的商品交易,因此该方法基于“他们会复购什么?”
- 添加候选集
- 创建特征
- 使用 LGBMRanker 进行拟合/预测
- 后处理
如何添加候选集
- 使用 word2vec 作为 item2vec 计算商品嵌入向量,然后选择 N(=48) 个嵌入向量与预测向量(作为“下一次购买”)具有高相似度的候选商品。
- 添加与每位客户最近 N(=3) 笔交易中的“配对”具有相同产品代码的候选商品。(感谢 Mr.Giba 的 notebook)
请注意,这些方法仅适用于拥有足够历史交易的客户。
创建特征
与获胜者相比差别不大。
- 商品特征
- 过去 N 周的销量(不仅针对商品本身,还包括商品所属的属性,如“department_name”)+ 按年龄细分的销量
- 购买的最高/最低/中位价格(使用全局中位数进行平滑)
- 在线购买率
- 距离所有客户上次购买的天数
- 距离商品首次销售的天数
- 客户特征
- 年龄:分箱并调整(如果年龄 < 20 则为 10,如果年龄 >= 60 则为 60)
- "club_member_status"(俱乐部成员状态)、"fashion_news_frequency"(时尚新闻频率)
- 属性:根据购买商品的 index_code 估算(例如,如果客户通常购买“Ladieswear”,则她被估算为“Lady”)
- 购买的最高/最低/中位价格(使用全局中位数进行平滑)
- 距离客户上次购买的天数
- 客户 x 商品特征
- 每个商品/客户组合距离上次购买的天数
- 历史交易中出现的每个商品/客户对的数量
- 每个年龄/属性的商品购买率(交易)
- 商品价格(最高/最低/中位数)与客户价格(最高/最低/中位数)的比率(例如,如果商品最低价与客户最高价的比率超过 1,我们可以估计“他没有预算购买该商品。”)
使用 LGBMRanker 进行拟合/预测
我们将客户分为 3 折,比例为 30/35/35%(实际上,起初是为了快速进行实验)。
接下来,我们对每一折客户训练 LGBMRanker 并进行预测。然后对预测结果应用加权平均(0.3/0.35/0.35)。
训练/验证周期只有 1 组,验证集是最后 1 周,训练集是验证前的最后 3 周。
在使用 Optuna 进行参数调整后,我们在预测测试集时使用最后 3 周的数据重新训练模型。
后处理
我们对在过去 N(=96) 周内没有或少于 12 个候选(交易)的客户的预测应用后处理。
- 对于在过去 N(=96) 周内没有候选的客户,我们预测为上周销量前 12 的商品(+0.0002)
- 对于有 K(<12) 个候选的客户,我们预测为各年龄组上周销量前 12-K 的商品(+0.0001)
这些方法提高了约 0.0003 的分数。(虽然微小,但是重要的改进)
什么没有奏效