kaggle H&M推薦大賽前排方案總結

H&M Personalized Fashion Recommendations 賽後總結簡介

作者:pikachu

知乎:https://zhuanlan.zhihu.com/p/513522302

賽題描述

H&M是我們(men) 熟知的服飾購物平台,他擁有53個(ge) 網上市場和大約4850家商店。賽題提供了2018年9月到2020年9月的用戶購買(mai) 記錄(包括線上線下的購買(mai) 記錄)以及商品及用戶的一些元數據,希望參賽選手預測接下來一周最有可能購買(mai) 的衣物(評價(jia) 指標為(wei) MAP@12)。題目描述中說明了構建優(you) 秀的推薦係統,不僅(jin) 對於(yu) 提高平台營收,還可以減少“退換貨”等造成的物流損失。

EDA中發現,這個(ge) 賽題大致有以下特點,商品側(ce) 的信息較為(wei) 豐(feng) 富,商品的最小粒度article_id, 是除了一些品類、顏色等基本屬性外,還給出了商品的圖像以及描述文本,值得一提的是多個(ge) article_id可能同屬於(yu) 同一個(ge) product_code,例如同一個(ge) 商品有不同的顏色及尺寸。用戶側(ce) 的信息猜測由於(yu) 隱私保護的關(guan) 係,給的相對較少,普遍被關(guan) 注的是年齡(age)及郵編(postal_code),存在大比例的低活用戶以及冷啟動用戶。商品量級大約在十萬(wan) 左右,用戶量級在百萬(wan) 左右。購買(mai) 記錄還提供了成交時間以及當時成交價(jia) 等關(guan) 鍵信息。

問題分析

區別於(yu) 以往比賽,隻針對推薦係統的某個(ge) 環節(如精排)設計賽題,往往給定訓練與(yu) 測試的樣本,這個(ge) 比賽最有趣的部分是需要我們(men) 構建一個(ge) 較為(wei) 完整的推薦係統,也就說需要我們(men) 自己構建訓練與(yu) 測試的樣本。具體(ti) 而言以下問題可能會(hui) 比較令人關(guan) 注的問題。

1. 如何構建一個(ge) pipeline,構建一個(ge) 怎麽(me) 樣的pipeline

2. 如何為(wei) 大量的冷啟動用戶或者低活用戶,以及存在商品新上市的情況

對於(yu) 第一個(ge) 問題,一般而言,為(wei) 解決(jue) 從(cong) 海量候選商品中,選出用戶最後可能購買(mai) 的商品,平衡性能與(yu) 效率,工業(ye) 推薦係統比較常見的思路是先用較為(wei) 簡單的模型高效地召回一些用戶可能購買(mai) 的候選商品,然後使用複雜的模型對候選商品進行排序,具體(ti) 的召回策略與(yu) 排序特征在下文前排方案分享中介紹。這往往是在商品候選集比較大的情況下的這種這種選擇,大多數選手,包括前排的選手,都采用這種思路,當然也有選手嚐試召回-粗排-精排的方案。而另一種思路則是考慮由於(yu) H&M場景下候選的商品較少,可以構建端到端的模型,使用基於(yu) 類似DIN的target attention來去建模候選商品與(yu) 用戶曆史購買(mai) 商品的關(guan) 係,借助較為(wei) 巧妙的矩陣運算,實現高效地端到端的推薦

對於(yu) 第二問題,由於(yu) 用戶側(ce) 的屬性信息較少,常見的策略是將熱門的商品推薦給冷啟動用戶,更加細致地可以根據用戶屬性信息分年齡、地區等推薦熱門商品。對於(yu) 新上市的商品,商品側(ce) 的內(nei) 容理解(包括商品的一些品類、顏色等信息,以及圖文信息)便顯得比較重要。

前排方案總結

top1[3]

第一名方案的思路非常流暢,他們(men) 嚐試了不同的召回策略,排序階段使用了特征工程+GBDT的搭配,看上去非常簡單,但是效果卻很驚豔。

在他們(men) 理解中,衣物的消費有隨潮流變化快、具有明顯的季節性等特點,所以他們(men) 主要通過召回最急流行度(銷量)比較高的商品,另一方麵,他們(men) 也嚐試了召回一批新品,但是排序模型並不能把這些新品排到top12,給出的解釋是這些新品缺乏曆史的交互信息。

如下圖所示,他們(men) 的召回策略包括:

複購,交互數據中可以發現有很多用戶複購的行為(wei) ,根據用戶曆史購買(mai) 行為(wei) ,召回購買(mai) 數量topN的商品。

itemCF,經典的協同過濾方法,把與(yu) 用戶購買(mai) 過的商品“相似的”商品推薦出來

同款商品不同型號,有些用戶有換貨的行為(wei) ,比如換一個(ge) 大一號的鞋子等。

流行度topN,按銷量推薦topN

Graph embedding召回,使用deepwalk, node2vec, LINE, ProNE來產(chan) 生用戶與(yu) 商品的embedding,然後使用embedding進行向量召回。

logistic regression with categorical information, 訓練一個(ge) 羅輯回歸模型,從(cong) hot-1000中粗排出topN的商品

kaggle H&M 推薦大賽前排方案總結。

top1 framework

如何理解用戶與(yu) 商品的交互信息一般被認為(wei) 是推薦係統中最重要的問題,所以他們(men) 的在特征工程階段做的最主要的特征是用戶與(yu) 商品的交互特征,他們(men) 也提到圖文信息的理解並沒有幫助他們(men) 排序模型的提升,但是在真實的場景中,這些圖文信息對於(yu) 冷啟動的投放有著重要的意義(yi) 。

大約有50%的用戶在過去三個(ge) 月沒有在平台買(mai) 過任何商品,對於(yu) 這些用戶,考慮曆史累積的統計特征(比如曆史上購買(mai) 過某種品類衣服的數量),而對於(yu) 活躍的用戶,則統計其近期(上禮拜,上個(ge) 月,上個(ge) 季度)的消費情況。排序的詳細特征如下:

1. count類特征,例如用戶購買(mai) 過候選商品的數量、次數,用戶某買(mai) 過候選商品品類的特征,統計的時間窗口大小可以是上禮拜,上個(ge) 月,上個(ge) 季度,統計數量時,也有按照時間加權(購買(mai) 時間越久的,權重越小)

2. time類特征,用戶上一次消費的時間與(yu) 當前的時間差,用戶上一次購買(mai) 該商品的時間當前的時間差(如果很短,可以刻畫用戶的退換貨的期望,比如一般來演電商平台都有七天無理由,超過了七天,用戶退換貨的可能就會(hui) 很小)。對應地,商品側(ce) 地時間特征同樣重要,比如商品上次成交的時間到現在的時間差(可以看出商品是否下架),最早交易的時間差(預估上市時間)等。

3. Mean/Max/Min特征,即用戶側(ce) 與(yu) 商品側(ce) 的聚合特征,如用戶曆史購買(mai) 的商品的價(jia) 格的均值、最值(刻畫用戶的消費能力),購買(mai) 某商品的用戶年齡的均值、最值。

4. Difference/Ratio特征,如用戶年齡與(yu) 購買(mai) 候選商品的用戶平均年齡之間的差值,用戶曆史購買(mai) 候選商品所屬品類占所有購買(mai) 商品數量的比例。

5. Similarity,來自召回側(ce) 的特征,例如item2item的協同過濾的分數,item2vec產(chan) 生的cosine similarity,user2item(ProNE)產(chan) 生的similarity。

對於(yu) 排序模型他們(men) 使用了六周的數據來訓練模型,最後一周的數據用來作為(wei) 驗證集,為(wei) 每個(ge) 用戶召回100個(ge) 候選商品,這樣的實驗設置,可以保持交叉驗證與(yu) 線上公榜的成績變動基本穩定, 所以工作的重點就可以放在優(you) 化單個(ge) lightgbm模型。在這裏詳細說明一下整個(ge) 召回以及排序的流程,整個(ge) 流程雖然簡單,但是很多細節卻可圈可點。

為(wei) 了簡化,假設交易數據給定的最後一周為(wei) 第17周,那麽(me) 我們(men) 需要為(wei) 未來的一周(即第18周)進行推薦,第17周則用來作為(wei) 驗證集,11-16周作為(wei) 訓練集。

有如下幾個(ge) 有意思的問題:

1. 怎麽(me) 為(wei) 這11-18周(共8周)的用戶召回產(chan) 生候選集,又怎麽(me) 產(chan) 生特征呢?

> 簡單來說,對於(yu) 第N周,使用N周以前(謹防穿越)的用戶曆史記錄來進行召回,以及構建特征。

2. 實際上,這樣以來所有的召回策略以及特征需要跑8次,那能不能使用第10周及以前的數據一下子為(wei) 11-18周推薦呢? 我覺得可能不太可以,但是效果不會(hui) 很好,原因如下:

> - 特征分布不一致,對於(yu) 第11周而言,特征(包括召回策略)來自前一周,而對於(yu) 第18周而言,特征來自八周前。

> - 不能充分利用用戶的曆史交互數據,這在原本用戶行為(wei) 比較稀疏的場景下是不能接受的。比如說,對於(yu) 第18周而言,就11-17周的用戶曆史交易記錄就白白被忽視了。

3. 在跑的8次中,有六次是為(wei) 訓練集的六周跑的,那隻用第16周作為(wei) 訓練集呢?實際上是可以的,但是效果可能會(hui) 退化,原因如下:

> - 還是數據量比較小,過少數據模型容易過擬合

> - 如果精排模型使用基於(yu) 神經網絡的模型,如石塔西老師所說,類別特征是”一等公民“[4],userid的embedding必然是重要的特征,如果在第16周用戶沒有購買(mai) 過商品,那麽(me) 他的userid的embedding就抓瞎了。當然基於(yu) GBDT的模型,userid作為(wei) 類別特征也會(hui) 有類似的問題,也會(hui) 有類似的問題。

> - 正樣本稀疏,召回率較低(recall100item~18%)

4. 一般電商推薦的排序的場景下,平台會(hui) 曝光給用戶部分商品,這些商品往往是推薦係統上一次迭代產(chan) 生的,往往具有一定合理性,排序訓練的負樣本一般選用曝光未購買(mai) 的商品。但是本賽題隻提供了用戶的交易記錄,即沒有負樣本,另一個(ge) 點是,這些購買(mai) 記錄有一些是線下實體(ti) 店發生的。那麽(me) 排序的負樣本怎麽(me) 來呢

> 使用召回未購買(mai) 的樣本作為(wei) 負樣本作為(wei) 排序的負樣本。一個(ge) 原因是在對測試集進行排序時,我們(men) 拿過來的也是召回過來的樣本,需要從(cong) 其中把正樣本排到前麵來,訓練時把召回未購買(mai) 的商品作為(wei) 負樣本就比較合理了;另一個(ge) 原因這些召回未購買(mai) 的樣本是有一些合理性的,屬於(yu) 比較難的負樣本,這有利於(yu) 幫助排序模型的學習(xi) 。

5. 為(wei) 什麽(me) 不能用隨機負采樣作為(wei) 排序的負樣本呢

> 這個(ge) 問題,其實跟上個(ge) 問題關(guan) 係很大,簡單而言,排序模型排的是召回過來的樣本,使用隨機采樣的樣本作為(wei) 負樣本會(hui) 導致訓練與(yu) 測試時的樣本分布不一致。有一個(ge) 比較相似的經典問題是:訓練召回模型能不能使用曝光未點擊的樣本作為(wei) 負樣本。答案是也不行,原因也類似,召回是從(cong) 全量的商品候選池中選出較為(wei) 合理的候選商品,隻使用曝光未點擊作為(wei) 負樣本也會(hui) 導致訓練與(yu) 測試時的樣本分布不一致。

6. 來自召回側(ce) 的分數特征,為(wei) 什麽(me) 奏效?

> 把召回側(ce) 的分數特征作為(wei) 排序的特征,可以看作把召回專(zhuan) 家的意見告訴排序模型。在精排特征比較相對粗糙的時候,來自召回的意見可以保證排序模型的效果不差於(yu) 召回模型。另一方麵,來自召回側(ce) 的分數本身具有實際意義(yi) ,例如一些雙塔模型給出的user與(yu) item的打分等等,都是重要性很高的特征。當然這些特征也可以放在排序的過程中做,具體(ti) 做法如下個(ge) 問題,在第三名的方法中,也詳細介紹了這一思路,並且據作者描述,其提升很大。

boost my LB score

from 0.02855 to 0.03262,

In addition, if I only increase the recall num and don't adding the recall features, the CV score is very very poor.

[5]7. Similarity特征如果具體(ti) 是如何做的

可以分基於(yu) 模型的方法以及基於(yu) 協同過濾的方法兩(liang) 方麵介紹

1. 基於(yu) 模型的方法,一般通過一些方法(MF,graph embedding類的方法)得到user與(yu) item的表征embedding,然後在召回時使用dot product為(wei) 候選商品打分。第三名的方法[6]中同樣提到這個(ge) 方法:

大致思路是當為(wei) target week的(user,item)打分時,使用target week之前的交互數據訓練一個(ge) BPR matrix factorization model 然後,計算target week的(user,item)的分數,據第三名的作者描述,在這個(ge) 特征的加持下,提升明顯(0.0336->0.03510).

This BPR model is trained with all the transactions before the target week (I've trained one BPR for each week) using

implicit

. The auc of BPR similarity is ~0.720, while the auc of the whole ranking model is ~0.806 and the best auc of other single feature is ~0.680. At last, this single similarity feature boost my LB score

from 0.03363 to 0.03510,

2. 基於(yu) 協同過濾的方法,以itemCF為(wei) 例,給一個(ge) (user,item)的pair打分時,考慮用戶購買(mai) 過的商品序列,計算序列中每一item與(yu) 候選item之間的相似度,然後按照權重進行聚合。計算兩(liang) 個(ge) item之間相似度的方法可以是:

item之間tag(品類,顏色等)的相似度(jaccard)

item之間圖文的相似度(使用Bert、mobilesNet提出title、圖片的embedding,然後計算embedding的cosine similarity)

購買(mai) 過兩(liang) 個(ge) item的用戶序列之間的相似度(jaccard)

來自item2vec等network embedding方法產(chan) 生的embedding的相似度。

...

其他方案裏的一些亮點或技巧

MMOE來增強排序模型對冷啟動用戶或者低活用戶的推薦效果[7],使用用戶的活躍信息來gate不同的expert

使用FIL對lightgbm進行推理加速,據說可以快10x

catboost-gpu比lightgbm快30x,但是效果貌似往往差於(yu) lightgbm

構建feature store,防止重複創建特征耗費時間

inference時,可以分批處理,緩解內(nei) 存壓力

reduce_mem_usage 以及對類別特征進行label encoder

反思與(yu) 感悟

該賽題確實是一個(ge) 很棒的比賽,在比賽中收獲了不僅(jin) 知識上的積累,更重要的是,鍛煉了自己對某個(ge) 業(ye) 務場景的思考。當然,其實也有一些反思:

1. 參賽隊伍的方法或有或無的在預測用戶是否“退換貨”,這其實並不是我們(men) 想要的結果。用戶購買(mai) 了一件不滿意的商品,所以需要退換,在大多數方案中,這些不滿意的商品被作為(wei) “正樣本”來訓練模型,這其實是不合理,在真實的推薦場景中,這應該是hard negative example, 是精排模型需要重點學習(xi) 的樣本。

2. 沒有給一批曝光未購買(mai) 的商品,作為(wei) hard negative example,這其實限製了排序性能的進一步提升。

參考

^DIN https://arxiv.org/abs/1706.06978

^e2e_nn https://www.kaggle.com/code/aerdem4/h-m-pure-pytorch-baseline

^top1 https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324070

^五環之歌 https://zhuanlan.zhihu.com/p/336643635

^top3 solution https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324129

^top3 https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324129

^mmoe https://www.kaggle.com/competitions/h-and-m-personalized-fashion-recommendations/discussion/324094

【競賽報名/項目谘詢+微信:mollywei007】

上一篇

2022年上交/南大發布強基初試通知 全國統一時間進行線上測試

下一篇

芬蘭研究生留學費用明細和兼職途徑介紹

你也可能喜歡

  • 暫無相關文章!

評論已經被關(guan) 閉。

插入圖片
返回頂部