文章目錄[隱藏]
賽題名稱:H&M Personalized Fashion Recommendations
賽題任務:為(wei) 用戶提供時尚商品推薦
賽題類型:推薦係統
https://www.kaggle.com/c/h-and-m-personalized-fashion-recommendations/
賽題介紹
H&M在線商店為(wei) 購物者提供了廣泛的產(chan) 品選擇供他們(men) 瀏覽。但是如果選擇太多,客戶可能無法很快找到他們(men) 感興(xing) 趣的東(dong) 西或他們(men) 正在尋找的東(dong) 西,最終他們(men) 可能不會(hui) 購買(mai) 。
在本次比賽中,參賽選手可以使用曆史交易數據、商品元信息和商品圖像數據。賽題提交的內(nei) 容根據 Mean Average Precision @ 12 (MAP@12) 進行評估:
參賽選手需要對所有 customer_id 值進行購買(mai) 預測,無論這些客戶是否存在曆史購買(mai) 記錄。對於(yu) 每個(ge) 客戶,需要預測下一個(ge) 7 天內(nei) 客戶將購買(mai) 的預測商品。
賽題數據
您的任務是預測每個(ge) 客戶在訓練數據期之後的 7 天內(nei) 將購買(mai) 的 article_ids。賽題數據可以劃分為(wei) 如下幾個(ge) 部分:
- 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
我們(men) 的解決(jue) 方案是使用各種檢索策略 + 特征工程 + GBDT,看似簡單但功能強大。我們(men) 生成了近期流行單品,因為(wei) 時尚變化快,有季節性。我們(men) 也嚐試添加冷啟動單品,但由於(yu) 缺乏購買(mai) 交互信息,並沒有起作用。
整體思路
模型絕大部分的特征來自用戶和商品,我們(men) 發現圖片信息作用不大,但圖片可以對冷啟動有效。因為(wei) 近50%的用戶最近3個(ge) 月沒有交易,所以我們(men) 為(wei) 他們(men) 創建了很多累積特征,以及上周、上個(ge) 月、上季活躍用戶的特征。
我們(men) 使用6周的數據作為(wei) 訓練,1周數據作為(wei) 驗證。這樣模型驗證集和榜單精度是一致的。我們(men) 重點改進LightGBM模型在驗證集的精度。驗證集精度為(wei) 0.0430,榜單精度為(wei) 0.0362。
召回
在比賽前期,我們(men) 重點考慮Top100候選項的命中數,嚐試各種策略覆蓋更多的正樣本。
召回方法包括:經常複購的商品、ItemCF召回、相似商品、流行度、圖嵌入、LR + 邏輯回歸進行召回
排序
大部分排序特征來自召回階段,並進行了複用。如果我們(men) 為(wei) 每個(ge) 用戶的商品的負樣本下采樣。
我們(men) 最好的單模型是LightGBM,最後我們(men) 訓練了5個(ge) LightGBM 和 7 個(ge) CatBoost 分類器用於(yu) 集成。
性能優化
- 我們使用 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等召回方式,後來發現效果甚至不如直接選擇熱門商品。因此我的解決(jue) 方案是直接為(wei) 每個(ge) 用戶選擇大約600個(ge) 最受歡迎的產(chan) 品(會(hui) 有一些非常簡單的策略來參考用戶的曆史)。
然後訓練一個(ge) LightGBM模型,根據模型得分為(wei) 每個(ge) 用戶選出130個(ge) 候選,然後將用戶在曆史上購買(mai) 的所有商品添加為(wei) 最終候選。
召回
我們(men) 使用各種計數來衡量不同組中商品的受歡迎程度:
- 客戶屬性的不同的組合
- 商品屬性的屬性不同的組合
- 不同日期下的組合
排序
在排序模型中特征主要分為(wei) 以下幾組:
- 用戶基本特征:包括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的相似度,進而計算出用戶是否會購買該產品的評分。
我為(wei) LGBMRanker 編寫(xie) 了一個(ge) lambdarankmap 目標損失,它比 lambdarank稍微好一點。在整個(ge) 比賽中,我使用 2-3 個(ge) 月的交易來訓練模型,並在一周數據上進行驗證。
第三名:sirius
https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324129
我們(men) 的思路也是先召回,然後進行排序。在召回階段加入了多路的召回方法,召回方法包括:
- 流行度
- 曆史購買的相似商品
- 不同屬性的熱門商品
- 最近購買的同款商品
在排序階段首先進行了下采樣,正負樣本比為(wei) 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
首先為(wei) 每個(ge) 客戶使用不同的召回模型生。然後建立一個(ge) 排序模型。我創建了 5 折,並使用 3 折作為(wei) 訓練數據。我也嚐試了更多的訓練數據,但並沒有增加局部的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
召回
我們(men) 使用了幾種方法來生成不同的候選對象,以提高正樣本(用戶和用戶項目)的覆蓋率。
- 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。
評論已經被關(guan) 閉。