1. 程式人生 > >頻繁項在國美商品推薦中的應用

頻繁項在國美商品推薦中的應用

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(14分位數 , 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滑鼠 , 聯想鍵盤 , 微軟鍵盤)   基於物品字典和物品的類別係數生成物品的類別矩陣:

X=(0.20.80.60.40000000000.20.80.60000000000.60.3)

  基於物品字典和物品的頻繁項列表生成物品的相似度矩陣,因為不推薦自己,所以將自己與自己的相似度設定為0,這裡偷個懶,設定為對稱陣,實際並不是: