推薦系統設計


當一個做推薦系統的部門開始重視【數據清理,數據標柱,效果評測,數據統計,數據分析】這些所謂的臟活累活,這樣的推薦系統才會有救。

推薦系統特征

首先需要明確的就是推薦系統的目標,一般來說不外乎以下幾個:

  • 用戶滿意性:首當其沖的,推薦系統主要就是為了滿足用戶的需求,因此准確率是評判一個推薦系統好壞的最關鍵指標。

  • 多樣性:雖然推薦系統最主要還是滿足用戶的興趣,但是也要兼顧內容的多樣性,對於權重不同的興趣都要做到兼顧。

  • 新穎性:用戶看到的內容是那些他們之前沒有聽說過的物品。簡單的做法就是在推薦列表去掉用戶之前有過行為的那些內容。

  • 驚喜度:和新穎性類似,但新穎性只是用戶沒看到過的但是確實是和他行為是相關的,而驚喜度是用戶既沒有看過和他之前的行為也不相關,但用戶看到后的確是喜歡的。

  • 實時性:推薦系統要根據用戶的上下文來實時更新推薦內容,用戶的興趣也是隨着時間而改變的,需要實時更新。 

  • 推薦透明度:對於用戶看到的最終結果,要讓用戶知道推薦此內容的原因。比如,“買過這本書的人同時也買過”、”你購買過的xx和此商品類似”。 

  • 覆蓋率:挖掘長尾內容也是推薦系統很重要的目標。因此,推薦的內容覆蓋到的內容越多越好。

推薦方式

基於這些目標,推薦系統包括四種推薦方式:

  • 熱門推薦:就是熱門排行榜的概念。這種推薦方式不僅僅在IT系統,在平常的生活中也是處處存在的。這應該是效果最好的一種推薦方式,畢竟熱門推薦的物品都是位於曝光量比較高的位置的。 

  • 人工推薦:人工干預的推薦內容。相比於依賴熱門和算法來進行推薦。一些熱點時事如世界杯、nba總決賽等就需要人工加入推薦列表。另一方面,熱點新聞帶來的推薦效果也是很高的。 

  • 相關推薦:相關推薦有點類似於關聯規則的個性化推薦,就是在你閱讀一個內容的時候,會提示你閱讀與此相關的內容。

  • 個性化推薦:基於用戶的歷史行為做出的內容推薦。 

其中,前三者是和機器學習沒有任何關系的,但卻是推薦效果最好的三種方式。一般說來,這部分內容應該占到總的推薦內容的80%左右,另外20%則是個性化推薦。

個性化推薦系統

個性化推薦是機器學習應用的一個典型場景。在本質上和搜索引擎是一樣的,同樣是為了解決信息過載的問題。搜索引擎某種意義上也是一個個性化推薦系統,但是其輸入特征是可以從搜索關鍵字直接可以得到的,而一般的推薦系統,輸入特征則是需要機器學習才能得到

個性化推薦系統一般由日志系統推薦算法內容展示UI三部分組成。

  • 日志系統:這是推薦系統的輸入源,是一個推薦系統所有信息的源頭。

  • 推薦算法:這是推薦系統的核心,根據輸入數據得出最終的推薦結果的具體過程就在這里。 

  • 內容展示UI:對於推薦結果如何展示,也是一個值得權衡的地方。以更好地滿足推薦系統的目標,並能更好的收集用戶的行為信息等。

其中,個性化推薦中最為核心的推薦算法,目前比較流行的有以下幾種:

  • 基於內容的推薦:根據內容本身的屬性(特征向量)所作的推薦。 

  • 基於關聯規則的推薦:“啤酒與尿布”的方式,是一種動態的推薦,能夠實時對用戶的行為作出推薦。是基於物品之間的特征關聯性所做的推薦,在某種情況下會退化為物品協同過濾推薦。 

  • 協同過濾推薦:與基於關聯規則的推薦相比是一種靜態方式的推薦,是根據用戶已有的歷史行為作分析的基礎上做的推薦。可分為物品協同過濾用戶協同過濾基於模型的協同過濾。其中,基於模型的協同又可以分為以下幾種類型:基於距離的協同過濾;基於矩陣分解的協同過濾,即Latent Factor Model(SVD);基於圖模型協同,即Graph,也叫社會網絡圖模型。

基於內容的推薦

通過用戶歷史感興趣的信息,抽象信息內容共性(特征向量),根據內容共性推薦其他信息。

如何給一用戶推薦租房信息,簡要步驟如下

  • 找到用戶A最近一個月內瀏覽過的租房信息集合

  • 找到租房集合的具化內容(價格,平方,地理位置等)

  • 抽象具化內容的共性內容 -- (2000每月,50平方,下城區)

  • 由這些共性內容作為推薦條件查找其他租房信息,並實施推薦

如果查詢的結果集過小,可以縮小條件(降低抽象具化內容的共性內容的標准)召回,例如可以將查詢條件縮小為(2000每月,50平方,無限制)或(2000每月,無限制,無限制)。

協同過濾

通過找到興趣相投,或者有共同經驗的群體,來向用戶推薦感興趣的信息。

如何通過協同過濾對用戶A進行電影推薦?簡要步驟如下

  • 找到用戶A(user_id_1)的興趣愛好

  • 找到與用戶A(user_id_1)具有相同電影興趣愛好的用戶群體集合Set<user_id>

  • 找到該群體喜歡的電影集合Set<movie_id>

  • 將這些電影Set<Movie_id>推薦給用戶A(user_id_1)

相似性推薦

“協同過濾(Collaborative Filtering)”和“基於內容的推薦(Content-based Recommendation)”,都必須分析用戶的歷史行為數據。如果系統沒有用戶的歷史行為數據積累,如何實施推薦呢?對於新用戶A,沒有ta的歷史行為數據,在ta點擊了item-X的場景下,可以將與item-X最相似的item集合推薦給新用戶A。問題可以轉化為如何用一種通用的方法,表達item之間的相似性?

譬如租房有價格,地理位置,設施配套,大小,周邊交通等屬性,假設這里是5個屬性,可以把它看做一個五維空間中的點。

點擊了《戈雅公寓10幢304室》假設為點N {價格:5000,地理位置:浦沿,大小:50m2,設置配套:空調洗衣機衣櫃,周邊交通:地鐵}

給每個屬性設置權重,價格相同加5分,地理位置相近加3分,大小匹配加1分等。

求與點N距離最近的10個點,點《戈雅公寓10幢305室》的distance = f1(價格) + f2(地理位置) + … +f5(大小)=5 + 3 + … + 1=9

相似性推薦,原理大致如上,要說明的是:

  • 由於沒有用戶歷史行為積累,不是個性化推薦,所以所有用戶的推薦結果都是相同的

  • 一般來說,距離公式確實是線性的

  • 一般來說,每個維度的權重不一樣

  • 這個線性公式,以及維度的權重,都可以通過機器學習訓練出來

關聯規則

關聯規則是數據挖掘中的概念,通過分析數據,找到數據之間的關聯。電商中經常用來分析購買物品之間的相關性,例如,“購買尿布的用戶,有大概率購買啤酒”,這就是一個關聯規則。關聯規則推薦的目標,是希望達到“將尿布放入購物車之后,再推薦啤酒”“直接推薦啤酒”獲取有更好的售賣效果

關聯規則A->B推薦,目標是,在“用戶將A放入購物車時,推薦B”比“單獨推薦B”獲取更好的效果

  • A->B的支持度,是用戶同時購買A和B概率

  • A->B的置信度,是用戶購買A的同時,有多大概率購買B

  • A->B的提升度,是“用戶購買A的同時,有多大概率購買B”與“直接購買B的概率”的比值

    • 這個值大於1時,說明A->B有正向效果
    • 這個值等於1時,說明A和B是獨立事件
    • 這個值小於1時,說明A->B有負向效果

支持度(support)

s(A)=3/5,s(B)=3/5,s(c)=1,s(D)=2/5,s(AB)=2/5,s(AC)=3/5。s(AB)等於同時購買A和B的數量除以總訂單量。

支持度評估商品包含在訂單中的“概率”,一個訂單,有多大概率包含這個商品。一般會先對支持度高的商品實施推薦,如果先實優化支持度低的商品,即使推薦效果翻倍,總體訂單提升效果也會很有限。

置信度(confidence):c(A->B) = s(AB)/s(A)= (2/5)/(3/5) = 2/3

  • 分子:s(AB)是同時購買AB的比例

  • 分母:s(A)是只購買A的比例

二者相除,得到“購買了A,有多大概率購買B”,置信度的本質是條件概率

c(C->B) = s(BC)/s(C)= (3/5)/(1) = 3/5  購買了C,有多大概率購買B

c(B->C) = s(BC)/s(B)= (3/5)/(3/5) = 1   購買了B,有多大概率購買C

c(B->C)=1,即:如果用戶購買商品B,100%會買C,那是不是意味着,如果用戶將商品B放入購物車,就可以向用戶推薦商品C呢?

結合關聯規則的目標,雖然c(B->C)=1購買商品B,100%會買C,但s(C)=1直接推薦C,用戶也100%會買C。購買B與購買C是獨立事件,用戶買不買C和用戶買不買B沒有直接關系。這里的關聯規則推薦,並沒有比直接推薦獲取更好的效果。用什么指標來評估關聯規則推薦的效果呢?提升度!

提升度(lift):l(A->B) =c(A->B)/s(B)

  • 分子:c(A->B),購買A時,有多大概率同時購買B

  • 分母:s(B),有多大概率直接購買B

A->B關聯規則推薦c(A->B),與s(B)直接推薦B,的比值,可以用來評估推薦效果:

  • 大於1,說明有效,在購買A時推薦B,比直接推薦B,效果更好

  • 等於1,說明無關,購買A與購買B,是獨立事件

  • 小於1,說明負相關,購買A時推薦B,效果還不如直接推薦B

個性化推薦典型流程

可知,一個推薦系統主要有以下模塊組成

  • 用戶行為日志:此部分主要是用戶行為日志的存儲,屬於數據統計的一部分, 存儲在hive中。 

  • 數據ETL-1:將用戶日志轉換為推薦算法所需要的數據格式。對原始的用戶行為等數據進行清洗、加工,如字段、屬性、格式化等,作為下一步推薦算法的輸入。

  • 推薦算法:是個性化推薦最主要的部分,包括通過用戶行為計算相關內容以及推薦結果等。 

  • 數據ETL-2: 將推薦算法得到的結果進一步加工為存儲模塊的輸入數據。對推薦算法產生的結果進行清洗、格式化等,作為下一步存儲模塊的輸入。

  • 用戶畫像存儲:存儲用戶的偏好以及行為數據,如對內容關鍵字的偏好、點擊過哪些內容等。

  • 推薦結果存儲:存儲各種推薦算法產生的推薦結果,可以分為兩部分:{用戶 : itemList}推薦結果,為用戶推薦的內容列表;{item : itemList}推薦結果,與item相關的內容列表。

  • 服務調用模塊:整合推薦結構,對外提供提供推薦的調用接口。

用戶行為日志接入

在線業務系統的日志接入數據高速公路,再由數據高速公路迅速運轉到離線數據處理平台和在線流計算平台;離線數據處理平台周期性地以批處理方式加工過去一段時間的數據,得到人群標簽和其他模型參數,存放在高速緩存中,供在線業務系統使用,與此同時,在線流計算平台實時對線上的日志數據做處理,對離線計算出的數據進行補充、修正等;在線業務系統綜合離線特征和在線特征使用一定的邏輯得到輸出供業務使用,產生的日志流入數據高速公路。

推薦算法

對於個性化推薦系統來說,推薦算法應該是其最核心的部分。目前有很多流行的算法,比如:

  • 基於內容和用戶畫像的推薦:此種算法,http://www.rowkey.me/blog/2016/04/07/up-recommend/。

  • 基於矩陣分解的推薦: 基於SVD/ALS算法對用戶進行內容推薦。相比起SVD,ALS更加適合解決稀疏矩陣的問題。Spark mlib中已經集成了對als算法的實現,需要做的就是在etl-1中把數據轉換為als需要的數據格式以及調整als算法的各種參數。有一篇文章比較具體地描述了如何使用spark來做基於ALS的推薦:http://colobu.com/2015/11/30/movie-recommendation-for-douban-users-by-spark-mllib/。

  • 用戶&物品協同過濾推薦:包括UserBased CF和ItemBased CF。對於這兩者,需要根據業務的不同來選擇不同的算法。當用戶非常多的時候,考慮到維護用戶矩陣的成本,一般是不推薦選擇用戶協同過濾的,而對於候選item很多的時候,則不推薦使用物品協同過濾。

推薦算法的輸出結果一般是一個用戶對應一個item列表或者是一個item對應一個item列表。此部分主要考慮的是算法的時間復雜度,不管是哪一種算法,一旦用戶或者內容數據上了百萬級別,都需要通過分布式計算如MapReduce、Spark等來進行解決。

推薦算法的基本流程如下圖所示:

用戶畫像存儲

存儲用戶的偏好以及行為數據等信息。對於偏好,采用標簽量化來表示,是一種隨着時間衰減的值。對於用戶畫像,是批量寫入、實時讀取,所以存儲要着重考慮讀的性能。可以選擇使用Redis集群作為技術方案,能夠最大滿足讀的性能,缺點是Redis的成本昂貴且不支持auto index。也可使用Hbase作為存儲,使用ElasricSearch構建二級索引,以應對根據多種維度聚集用戶的需求(比如過濾某一個標簽下的所有用戶)。

推薦結果存儲

對各種推薦算法計算出的推薦結果的存儲。存儲空間要求大,格式復雜。對於存儲的容量和讀寫性能要求都比較高。可以選擇使用Redis集群作為此部分的存儲方案。

服務調用

整合用戶畫像和推薦結果兩部分數據,向外提供推薦調用的接口。主要是數據庫IO調用開銷。

  • 根據用戶id,獲取推薦的item列表。

  • 根據item,獲取相關聯的item列表。

  • 根據用戶id, 獲取用戶畫像。

該模塊需要采取一定的策略聚合多種推薦算法的推薦結果,直接面向業務。策略由於會隨着面向的業務不同而不同,需要可配置化。同時也提供對外暴露用戶畫像的接口,使得業務方可以使用用戶畫像做針對性的處理。可以采用RPC機制對外暴露服務接口。

關注問題

實時性問題

由於計算用戶、item矩陣或者進行矩陣分解是需要離線進行且比較耗時,因此協同的推薦算法是很難達到實時性的。實時部分的推薦主要依靠基於用戶畫像的推薦來進行。最終的推薦列表是根據一定的策略對這兩部分進行聚合的結果。

時效性內容問題

時效性內容指的是那些與時間強相關的內容,比如新聞、時事等。如果一條10天前xx球員獲得冠軍的新聞現在被推薦了出來,可想用戶肯定是莫名其妙或者是很失望的。因此,對於時效性內容,需要與普通的待推薦的內容區分開,做單獨的推薦或者不走個性化推薦。

冷啟動問題 

不管使用何種推薦算法,都會面臨冷啟動問題:當用戶是新用戶,如何給用戶推薦item呢?當內容是新內容,如何推薦給用戶?

  • 對於新用戶,可以采取的一種策略就是采用熱門推薦或者人工推薦,把絕大多人關心的內容推薦出來。

  • 對於內容,可以將內容分為新內容池和待推薦內容池。新內容產生時,首先進入新內容池。每次推薦的時候,先從新內容池做候選推薦,並給此內容的傳播度+1,直到其傳播度大於一個閾值的時候,將其移至待推薦內容池。這樣既可以解決新內容的冷啟動問題也在一定程度上可以保證新內容的曝光量。 

多樣性問題 

在基於用戶畫像的推薦算法中,取出用戶的多個標簽,然后根據相關度從不同的標簽中取不同數量的內容,這樣既兼顧了用戶的多種興趣也能夠在一定程度上解決多樣性的問題。

如:用戶具有tag:A B C D,相關度為wA wB wC wD,Total推薦為總共需要推薦的條數,那么

RecommendList(u) = A[Total推薦 * wA] + B[Total推薦 * wB] + C[Total推薦 * wC] + D[Total推薦 * wD]

內容質量 

不管是熱門推薦、人工推薦還是取某一標簽下的內容列表都牽扯到的一個問題就是:如何給內容排序?

當用戶對內容的喜好不一樣,可以按照興趣度來排序;但當無法區分興趣度的時候(比如:用戶是新用戶;內容都是新內容;用戶對於某一標簽下的內容興趣度一樣),可以使用內容質量來做排序。click/pv是一種評判內容質量的方式。此外,使用卷積神經網絡相關算法也可以構建內容質量模型。

驚喜問題

推薦系統的驚喜目標一直是一個難題,被稱作EE(Exploit & Explore)問題,bandit算法是解決這個問題的一個派系,就是估計置信區間的做法,然后按照置信區間的上界來進行推薦,以UCB、LinUCB為代表的。簡單點說就是先不考慮你喜不喜歡就把質量高的內容推薦給你,后面根據用戶的行為反饋對推薦內容作調整。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM