推薦系統之--- 推薦系統實例


前面幾章介紹了各種各樣的數據和基於這些數據的推薦算法。在實際系統中,前面幾章提到的數據大都存在,因此如何設計一個真實的推薦系統處理不同的數據,根據不同的數據設計算法,並將這些算法融合到一個系統當中是本章討論的主要問題。本章將首先介紹推薦系統的外圍架構,然后介紹推薦系統的架構,並對架構中每個模塊的設計進行深入討論。

 

1、外圍框架

一般來說,每個網站都會有一個UI系統,UI系統負責給用戶展示網頁並和用戶交互。

網站會通過日志系統將用戶在UI上的各種各樣的行為記錄到用戶行為日志中。日志可能存儲在內存緩存里,也可能存儲在數據庫中,也可能存儲在文件系統中。

而推薦系統通過分析用戶的行為日志,給用戶生成推薦列表,最終展示到網站的界面上。

 

從上面的結構可以看到,推薦系統要發揮強大的作用,除了推薦系統本身,主要還依賴於兩個條件——界面展示和用戶行為數據。

 通過一定方式展示物品,主要包括物品的標題、縮略圖和介紹等。
 很多推薦界面都提供了推薦理由,理由可以增加用戶對推薦結果的信任度。
 推薦界面還需要提供一些按鈕讓用戶對推薦結果進行反饋,這樣才能讓推薦算法不斷改善用戶的個性化推薦體驗。
在設計推薦界面時,我們可以綜合考慮其他網站的設計並結合自己網站的特點。

數據收集和存儲

個性化推薦算法依賴於用戶行為數據,而在任何一個網站中都存在着各種各樣的用戶行為數據。那么如何存取這些數據就是推薦系統需要解決的首要問題。表7-1展示了一個假想的電子商務網站上的典型用戶行為數據。如表所示,從產生行為的用戶角度看,有些行為是只有注冊用戶才能產生的,而有些行為是所有用戶都可以產生的。從規模上看,瀏覽網頁、搜索記錄的規模都很大,因為這種行為所有用戶都能產生,而且平均每個用戶都會產生很多這些行為。

購買、收藏行為規模中等,因為只有注冊用戶才能產生這種行為,但購買行為又是電商網站的主要行為,所以它們相對於評論來說規模更大,但相對於網頁瀏覽行為來說規模要小得多,最后剩下的行為是注冊用戶里的一小部分人才有的,所以規模不會很大。從實時存取的角度上看,購買、收藏、評論、評分、分享等行為都是需要實時存取的,因為只要用戶有了這些行為,界面上就需要體現出來,比如用戶購買了商品后,用戶的個人購買列表中就應立即顯示用戶購買的商品。而有些行為,比如瀏覽網頁的行為和搜索行為並不需要實時存取。

 

推薦系統架構

根據上面的抽象,可以設計一種基於特征的推薦系統架構。如圖7-3所示,當用戶到來之后,推薦系統需要為用戶生成特征,然后對每個特征找到和特征相關的物品,從而最終生成用戶的推薦列表。

因而,推薦系統的核心任務就被拆解成兩部分,一個是如何為給定用戶生成特征,另一個是如何根據特征找到物品。

 

用戶的特征種類非常多,主要包括如下幾類。
 人口統計學特征 包括用戶的年齡、性別、國籍和民族等用戶在注冊時提供的信息。

 用戶的行為特征 包括用戶瀏覽過什么物品、收藏過什么物品、給什么物品打過什么樣的分數等用戶行為相關的特征。同時,用戶行為從時間上也可以分為用戶近期的行為和長期的行為。

 用戶的話題特征 可以根據用戶的歷史行為利用話題模型(topic model)將電視劇和電影聚合成不同的話題,並且計算出每個用戶對什么話題感興趣。比如用戶如果看了《葉問》、《新龍門客棧》和《醉拳》,那么可以認為用戶對“香港武俠電影”這個話題感興趣。

推薦系統的推薦任務也有很多種,如下所示。
 將最新加入的物品推薦給用戶。
 將商業上需要宣傳的物品推薦給用戶。
 給用戶推薦不同種類的物品,比如亞馬遜會推薦圖書、音像、電子產品和服裝等。

 給用戶混合推薦,有時需要將圖書和音像制品放到一個推薦列表中展示給用戶。
 對於不同的產品推薦不同新穎度的物品。比如在首頁給用戶展示比較熱門的推薦結果,在推薦系統頁面給用戶展示長尾中的物品。
 考慮到用戶訪問推薦系統的上下文,比如當你在豆瓣音樂找到“李宗盛”時,右側會有一個鏈接告訴你可以在豆瓣電台收聽“李宗盛”。單擊了這個鏈接后,豆瓣電台給你推薦的音樂就考慮了“李宗盛”這個上下文。

如果要在一個系統中把上面提到的各種特征和任務都統籌考慮,那么系統將會非常復雜,而且很難通過配置文件方便地配置不同特征和任務的權重。因此,推薦系統需要由多個推薦引擎組成,每個推薦引擎負責一類特征和一種任務,而推薦系統的任務只是將推薦引擎的結果按照一定權重或者優先級合並、排序然后返回。

 

兩個好處:
 可以方便地增加/刪除引擎,控制不同引擎對推薦結果的影響。對於絕大多數需求,只需要通過不同的引擎組合實現。
 可以實現推薦引擎級別的用戶反饋。每一個推薦引擎其實代表了一種推薦策略,而不同的用戶可能喜歡不同的推薦策略。有些用戶可能喜歡利用他的年齡性別作出的推薦,有些用戶可能比較喜歡看到新加入的和他興趣相關的視頻,有些用戶喜歡比較新穎的推薦,有些用戶喜歡專注於一個鄰域的推薦,有些用戶喜歡多樣的推薦。我們可以將每一種策略都設計成一個推薦引擎,然后通過分析用戶對推薦結果的反饋了解用戶比較喜歡哪些引擎推薦出來的結果,從而對不同的用戶給出不同的引擎組合權重。
將推薦系統拆分成不同推薦引擎后,如何設計一個推薦引擎變成了推薦系統設計的核心部分。

 

3、推薦引擎的架構

推薦引擎架構主要包括3部分。
 該部分負責從數據庫或者緩存中拿到用戶行為數據,通過分析不同行為,生成當前用戶的特征向量。不過如果是使用非行為特征,就不需要使用行為提取和分析模塊了。該模塊的輸出是用戶特征向量。
 該部分負責將用戶的特征向量通過特征-物品相關矩陣轉化為初始推薦物品列表。
 該部分負責對初始的推薦列表進行過濾、排名等處理,從而生成最終的推薦結果。

 

1)生成用戶特征向量

一般來說,用戶的特征包括兩種,一種是用戶的注冊信息中可以提取出來的,主要包括用戶的人口統計學特征。除了這種特征,另一種特征主要是從用戶的行為中計算出來的,本節着重討論如何生成特征。
一個特征向量由特征以及特征的權重組成,在利用用戶行為計算特征向量時需要考慮以下因素:

 用戶行為的種類 在一個網站中,用戶可以對物品產生很多不同種類的行為。用戶可以瀏覽物品、單擊物品的鏈接、收藏物品、給物品打分、購買物品、評論物品、給物品打上不同的標簽、和好友分享物品、搜索不同的關鍵詞等。這些行為都會對物品特征的權重產生影響,但不同行為的影響不同,大多時候很難確定什么行為更加重要,一般的標准就是用戶付出代價越大的行為權重越高。比如,購買物品需要用戶掏錢,所以用戶一定會三思而后行,因此購買行為最為重要。相反,瀏覽物品的網頁代價很小,所以這種行為對反映用戶的真實興趣的影響很小。
 用戶行為產生的時間 一般來說,用戶近期的行為比較重要,而用戶很久之前的行為相對比較次要。因此,如果用戶最近購買過某一個物品,那么這個物品對應的特征將會具有比較高的權重。

 用戶行為的次數 有時用戶對一個物品會產生很多次行為。比如用戶會聽一首歌很多次,看一部電視劇的很多集等。因此用戶對同一個物品的同一種行為發生的次數也反映了用戶對物品的興趣,行為次數多的物品對應的特征權重越高。

 物品的熱門程度 如果用戶對一個很熱門的物品產生了行為,往往不能代表用戶的個性,因為用戶可能是在跟風,可能對該物品並沒有太大興趣,特別是在用戶對一個熱門物品產生了偶爾幾次不重要的行為(比如瀏覽行為)時,就更說明用戶對這個物品可能沒有什么興趣,可能只是因為這個物品的鏈接到處都是,很容易點到而已。反之,如果用戶對一個不熱門的物品產生了行為,就說明了用戶的個性需求。因此,推薦引擎在生成用戶特征時會加重不熱門物品對應的特征的權重。

 

2)特征—物品相關推薦

在得到用戶的特征向量后,我們可以根據離線的相關表得到初始的物品推薦列表。離線相關表可以存儲在MySQL中,其存儲格式如表7-2所示。

從上面的架構圖可以看到,特征—物品相關推薦模塊還可以接受一個候選物品集合。候選物品集合的目的是保證推薦結果只包含候選物品集合中的物品。

3)  過濾模塊

在得到初步的推薦列表后,還不能把這個列表展現給用戶,首先需要按照產品需求對結果進行過濾,過濾掉那些不符合要求的物品。

一般來說,過濾模塊會過濾掉以下物品。
 用戶已經產生過行為物品 因為推薦系統的目的是幫助用戶發現物品,因此沒必要給用戶推薦他已經知道的物品,這樣可以保證推薦結果的新穎性。
 候選物品以外的物品 候選物品集合一般有兩個來源,一個是產品需求。比如在首頁可能要求將新加入的物品推薦給用戶,因此需要在過濾模塊中過濾掉不滿足這一條件的物品。

另一個來源是用戶自己的選擇,比如用戶選擇了某一個價格區間,只希望看到這個價格區間內的物品,那么過濾模塊需要過濾掉不滿足用戶需求的物品。
 某些質量很差的物品 為了提高用戶的體驗,推薦系統需要給用戶推薦質量好的物品,那么對於一些絕大多數用戶評論都很差的物品,推薦系統需要過濾掉。這種過濾一般以用戶的歷史評分為依據,比如過濾掉平均分在2分以下的物品。

 

4) 排名模塊

經過過濾后的推薦結果直接展示給用戶一般也沒有問題,但如果對它們進行一些排名,則可以更好地提升用戶滿意度,一般排名模塊需要包括很多不同的子模塊,下面將對不同的模塊分別加以介紹。
1. 新穎性排名

新穎性排名模塊的目的是給用戶盡量推薦他們不知道的、長尾中的物品。

對熱門物品進行降低權重可以提高推薦的新穎度.

2. 多樣性
多樣性也是推薦系統的重要指標之一。增加多樣性可以讓推薦結果覆蓋盡可能多的用戶興趣。

第一種提高多樣性的方法是將推薦結果按照某種物品的內容屬性分成幾類,然后在每個類中都選擇該類中排名最高的物品組合成最終的推薦列表。比如,如果是電影,可以按照電影的類別(愛情片、動作片、科幻片等)對推薦結果中的電影分類,然后每種類別都選出幾部電影組成最終的推薦結果。

因此,第二種提高推薦結果多樣性的方法是控制不同推薦結果的推薦理由出現的次數。本章提出的推薦系統對於每個推薦出來的物品都有一個推薦理由,這個推薦理由一般是產生推薦結果的重要特征。那么,要提高推薦結果的多樣性,就需要讓推薦結果盡量來自不同的特征,具有不同的推薦理由,而不是所有的推薦結果都對應一個理由。


下面的代碼根據推薦理由增加推薦結果的多樣性,這里輸入的recommendations是按照權重從大到小排序的,程序中每次拿出一個推薦結果,如果這個結果已經被用過了,就會對推薦結果的權重除以2降權(這里具體除以幾可以在實際應用中自己調整),最終將推薦結果重新按照權重從大到小排序。

3. 時間多樣性
時間多樣性主要是為了保證用戶不要每天來推薦系統都看到同樣的推薦結果。

 記錄用戶每次登陸推薦系統看到的推薦結果。
 將這些結果發回日志系統。這種數據不需要實時存儲,只要能保證小於一天的延時就足夠了。
 在用戶登錄時拿到用戶昨天及之前看過的推薦結果列表,從當前推薦結果中將用戶已經看到的推薦結果降權。

4. 用戶反饋
排名模塊最重要的部分就是用戶反饋模塊。用戶反饋模塊主要通過分析用戶之前和推薦結果的交互日志,預測用戶會對什么樣的推薦結果比較感興趣。

如果推薦系統的目標是提高用戶對推薦結果的點擊率,那么可以利用點擊模型(click model)預測用戶是否會點擊推薦結果。點擊模型在很多領域得到了廣泛應用,比如搜索結果的點擊預測、搜索廣告的點擊預測、上下文廣告的點擊預測。點擊預測的主要問題是預測用戶看到某個推薦結果時是否會點擊。那么要進行點擊率預測,首先需要提取特征。在推薦系統的點擊率預測中可以用如下特征預測用戶u會不會點擊物品i:
 用戶u相關的特征,比如年齡、性別、活躍程度、之前有沒有點擊行為;
 物品i相關的特征,比如流行度,平均分,內容屬性;
 物品i在推薦列表中的位置。用戶的點擊和用戶界面的設計有很高的相關性,因此物品i在推薦列表中的位置對預測用戶是否點擊很重要;
 用戶之前是否點擊過和推薦物品i具有同樣推薦解釋的其他推薦結果;
 用戶之前是否點擊過和推薦物品i來自同樣推薦引擎的其他推薦結果。
點擊模型需要離線計算好,在線將模型加載到內存中。為了提高在線預測的效率,一般只可以使用線性模型。

本章提出的推薦系統架構基本上是從基於物品的推薦算法衍生出來的,因此本章的架構並不適合用來解決社會化推薦問題。


免責聲明!

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



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