頻繁項在國美商品推薦中的應用
1. 問題描述
商品推薦存在的特殊性:
- 生存週期短。使用者要購買一個東西,是臨時產生的,和之前的行為關係不是很緊密、且此購買行為可能很快消失.(如:使用者要購買一個筆記本,則短時間內瀏覽等行為會圍繞筆記本,但是長週期內不會相關,就比如買筆記本和曾經買過衣服等等的沒有關係。對於部分物品如果短時間不能產生購買行為,以後可能也不會產生了。)
- 目標性強、卻對要購買的東西不瞭解。(如:要購買一個筆記本,則會去查詢筆記本,但是又不知道該買什麼型號的。而直觀來看,一般都喜歡購買筆記本中熱度較高,好評較多的。)
- 購買的物品中存在相關性。(如:要購買筆記本,則會訪問筆記本,而從所有的瀏覽資訊可知,瀏覽筆記本的人會同時去看滑鼠,所以推薦滑鼠會提高購買率)
總結一下目標就是,當用戶查看了物品A,要及時挑選出物品A類別和物品A類別相關類別中熱度高的、評價好的。如:使用者看了筆記本,則挑選出筆記本類別中熱度高的,和滑鼠類別中熱度高的,展示給使用者。(這裡沒有考慮使用者的興趣方向,就比如歷史上此使用者對數碼感興趣,則傾向於推薦數碼商品。此部分推薦項由離線演算法給出,此部分不做討論)
要解決上面的三個問題,所以需要。1.實時推薦策略。2.生成物品的類別排序係數。3.生成物品間相關性。
2. 基本資料分析
2.1 基礎資料
物品數量為150萬,類別1總共有49個,類別2總共有305個,類別3總共有2446個。 類別1資料:
類別2資料:
類別3資料:
2.2 訂單資料
下圖為每天的訂單資料。
下圖為最近一個月每個訂單含有不同物品數量: 這裡認為訂單內同時出現的項具備相似度,稱其為頻繁項。由訂單資料可知,38萬訂單中有6萬個訂單可能給出頻繁項。
2.3 訪問資料
這裡認為使用者在一次會話中,訪問的物品為一個事務,此事務內的物品為頻繁項。統計維度同訂單資料,不在列舉。
3. 問題建模
問題建模以訂單資料為例。訪問資料同理,區別是在一次會話中,訪問的物品為一個事務。訂單為在一個訂單中為一個事務。
3.1 類別排序係數生成
以物品類別為主軸,基於訪問量、銷售量、點贊量、正向評價數量、是否自營、上線時間、優惠幅度等等屬性生成物品在類別下的排序係數。(下圖為搜尋筆記本,給出的全站筆記本的一個排序,基於此排序係數的排序,排序係數由離線演算法給出,本篇文章不討論)
3.2 物品間相關性生成
當用戶看了筆記本以後,可以認為其想要購買筆記本,同時想購買筆記本類別相關的類別的物品,比如滑鼠類、鍵盤類、耳機類,而三級類別大約有3000多個,要一個個建立聯絡,人工工作量大,且相關係數不好確定。 此時可以使用頻繁項演算法(fpgrowth)來挖掘物品間的相關係數。詳細的演算法步驟可參考(https://blog.csdn.net/sun361113244/article/details/81284663)。 首先給出一個項集和相關演算法引數的例子,如下圖:
定義 訂單資料中:一個訂單中出現的一組物品為一個項集,如上圖中的 [bread , milk] 行為資料中:使用者一次會話中訪問的一組物品為一個項集 支援度:資料集中包含該項集記錄所佔的比例,上例中{beer}的支援度=3/5,{diaper,beer}的支援度=3/5。 置信度:針對像頻繁集數量>=2的情況,例如{diaper,beer},那麼置信度=支援度({diaper,beer})/支援度({diaper})。這意味著買beer的人一定會買diaper。
一般的電商資料的實際情況是,物品數量極大,以國美為例,大於有150萬的物品量,此時如果設定一個很大的支援度,比如0.1,假設總訂單量為100萬,則要求此物品在訂單中出現的次數超過10萬,從資料分析來看,基本沒幾個能滿足條件。如果設定一個很小的支援度,則會產生大量的頻繁項,導致演算法在指定時間內執行不完,而且產生的頻繁項沒有實際意義,還會產生頻繁風暴(此問題以後討論)。就比如設定支援度為0.0000001,則出現超過1次就為頻繁項。(如一個使用者訂單中出現了mac 和magic mouse ,而其它訂單中並未出現此組合,則演算法發現,置信度為100%,而直觀理解並不合理)。 支援度的設定目標為排除偶然因素對置信度的影響。這裡要保證頻繁項至少要出現10次,如果訪問量比較大的話(如以類別為頻繁項)則設定為四分之一分位數。由上分析可知:
支援度 = max(分位數 , 10) / 訂單數量
此時將置信度設定為0.1 。使用fpgrowth演算法對訂單物品進行挖掘,得到物品間相似度列表,如下圖(這裡只列舉部分,實際數量為2000多個,其中標紅的為買 榮耀Play的人,有96%的可能購買小米移動電源,則如果一個使用者訪問了 榮耀play,則向其推薦小米移動電源的購買的概率為96%):
僅僅使用物品存在一個缺陷,就比如買了榮耀play的人會傾向於購買小米外接電源,購買iphone的人同樣會傾向於購買另外品牌的外接電源,因為類別內物品太多,導致使用者行為在某一物品上比較分散,使真實的頻繁項挖掘不出來。因此這裡再對每個類進行頻繁類挖掘,對訂單資料分別對類別1、2、3分別執行fpgrowth演算法。得到頻繁項事務。
類別3頻繁項(總共755項): 其中標紅的說明,購買牙刷的人,有28%的概率購買牙膏。
類別2頻繁項(總共460項):
類別1頻繁項(總共109項): 這裡採用高級別優先的原則,對低級別資料進行懲罰,對類別3取平方,類別2取3次方,類別1取四次方(假如使用者在看了mac 後傾向於購買magic mouse,而如果以低級別為準,比如類別3,則會推薦滑鼠,採用物品則會推薦magic mouse,類別2,則會推薦數碼產品)
4.實現方式
輸入資料: 1. 推薦物品列表,組成物品字典.(取各個類別中的部分物品組成啟用推薦列表,離線演算法產生) 2. 所有類別3 的Id組成類別3字典。(基礎資料) 3. 所有類別2 的Id組成類別2字典。(基礎資料) 4. 所有類別1 的Id組成類別1字典。(基礎資料) 5. 使用者行為向量。(實時統計,存入快取記憶體,實時更新,設定生存時間,比如1小時) 6. 物品相似度矩陣。(離線演算法產生) 7. 類別3相似度矩陣。(離線演算法產生) 8. 類別2相似度矩陣。(離線演算法產生) 9. 類別1相似度矩陣。(離線演算法產生) 10. 物品的排序係數。(離線演算法產生)
輸出資料: 1. 物品的排序向量。(實時計算)
4.1 舉例說明其實現方式
假設推薦物品列表為
index | id | 排序係數 |
---|---|---|
0 | mac | 0.2 |
1 | 聯想筆記本 | 0.8 |
2 | dell筆記本 | 0.6 |
3 | 惠普筆記本 | 0.4 |
4 | mac滑鼠 | 0.2 |
5 | 聯想滑鼠 | 0.8 |
6 | dell滑鼠 | 0.6 |
7 | 聯想鍵盤 | 0.6 |
8 | 微軟鍵盤 | 0.3 |
類別3列表為:
index | id |
---|---|
0 | 筆記本 |
1 | 滑鼠 |
2 | 鍵盤 |
物品頻繁事務列表為
antecedent | consequent | confidence |
---|---|---|
mac | mac滑鼠 | 0.6 |
mac | dell滑鼠 | 0.2 |
惠普筆記本 | 聯想滑鼠 | 0.4 |
mac | 聯想筆記本 | 0.4 |
類別3頻繁事務列表為
antecedent | consequent | confidence |
---|---|---|
筆記本 | 滑鼠 | 0.5 |
筆記本 | 鍵盤 | 0.4 |
滑鼠 | 鍵盤 | 0.6 |
從上可以得出,物品字典為:(mac , 聯想筆記本 , dell筆記本 , 惠普筆記本 , mac滑鼠 , 聯想滑鼠 , dell滑鼠 , 聯想鍵盤 , 微軟鍵盤) 基於物品字典和物品的類別係數生成物品的類別矩陣:
基於物品字典和物品的頻繁項列表生成物品的相似度矩陣,因為不推薦自己,所以將自己與自己的相似度設定為0,這裡偷個懶,設定為對稱陣,實際並不是: