天天看點

推薦系統實踐---第二章:利用使用者行為資料

下面簡單介紹書中提到的問題以及有哪些解決辦法,友善大家對正本書有個整體的把握,同時我也會上傳這本書的高清PDF版,本來想不用積分下載下傳,但是系統最少2個,要是哪位沒有積分,可以私信我。下載下傳連結如下:

http://download.csdn.net/download/wtt561111/10163609

其他章節内容

推薦系統實踐---第一章:好的推薦系統

推薦系統實踐---第二章:利用使用者行為資料

推薦系統實踐---第三章:推薦系統冷啟動問題

推薦系統實踐---第四章:利用使用者标簽資料

推薦系統實踐---第五章:利用上下文資訊

推薦系統實踐---第六章:利用社交網絡資料

推薦系統實踐--第七章:推薦系統執行個體 第八章:評分預測問題

為了給使用者進行物品推薦,首先必須得了解使用者的興趣愛好,一般使用者會在注冊時給自己打标簽。但是利用使用者注冊資訊為使用者進行推薦是不合理的:現有的自然語言處理技術不能很好的對使用者的自我描述進行準确的了解;使用者的興趣會發生變化,但是卻不會動态的更新自我描述;使用者自己也知道怎麼用語言去表達自己的興趣愛好,或者不知道自己的愛好;是以我們要根據使用者的曆史行為對使用者進行模組化。

2.1    使用者行為資料介紹

這裡的使用者行為是指:某個使用者對某個商品進行了某種操作,不關注使用者或者商品的内容資訊(使用者性别,商品類别等)。

使用者行為一般分為兩種:顯性回報行為和隐性回報行為。顯性回報行為是指可以反映使用者對商品是否喜愛的行為,比如使用者對電影的評分;隐性回報行為就是不能反映使用者對該商品是否喜好的行為,比如使用者在某個時間觀看了某個視訊。

行為資料的具體内容。由于使用者行為有很多中,無法用一個具體的方式完全的表示,但是大多數使用者行為可以從下列幾種角度去考慮:

User id:       産生行為的使用者的唯一辨別。

Item id:      産生行為的對象的唯一辨別。

Behavior type:   行為的種類(購買,浏覽等)。

Context:     産生行為的上下文,主要是指時間和地點。

Behavior weight:行為的權重。(如果是觀看視訊,可以用觀看時長表示,如果是打分行為,可以用具體的分數表示)

Behavior content:行為的内容。(如果是評論行為,可以用評論的文本;如果是打标簽行為,就是标簽本身)

2.2 使用者行為分析

在利用使用者行為資料前,需要先對使用者行為資料做些統計分析,了解資料的一般規律,這樣可以對整個推薦系統的算法設計提供先驗知識。這裡主要考慮的是使用者活躍度和商品流行度。使用者的擷取度是指:曆史資料中,使用者産生過行為的商品的數量。商品的流行度是指:曆史資料中,商品被使用者産生的動作的數量。

網際網路中的大部分資料都服從長尾分布。F(x)=a*x^k

通過對多個資料集的實驗表明:使用者活躍度和商品流行度都服從長尾分布。橫坐标x表示次數,縱坐标f(x)表示使用者數量或者商品數量。

使用者活躍度與商品流行度之間的關系。基于MovieLens資料設計實驗:橫坐标X表示使用者活躍度,縱坐标f(x)表示具有活躍度x的所有使用者動作過的商品的平均流行度。發現曲線呈明顯下降的趨勢,這表示使用者越活躍,越傾向于浏覽冷門的物品。這符合我們的一般觀點:新使用者傾向于浏覽熱門的物品,因為他們對網站還不熟悉,隻能點選首頁的熱門物品,而老使用者會逐漸開始浏覽冷門的物品。

2.3    常用算法,實驗設計以及算法評測

單獨使用使用者行為資料進行推薦的算法一般被稱為協同過濾算法。主要包括:基于領域的方法,隐語義模型,基于圖的随機遊走算法。其中最重要的方法是基于領域的方法。該方法主要包括兩個算法:基于使用者的協同過濾算法和基于物品的協同過濾算法。

基于使用者的協同過濾算法:為使用者推薦   與其興趣相似的其他使用者      喜歡的物品。

基于物品的協同過濾算法:為使用者推薦   與其之前喜歡的物品    相似的物品。

實驗方法:主要是離線實驗。

實驗資料:GroupLens提供的MovieLens資料集。

實驗設計:将資料按照均勻分布随機分成M份,M-1份用來作為訓練集訓練模型,最後一份作為測試集測試模型。為了防止模型的過拟合,需要進行M次實驗。将M次在測試集上的結果的平均值作為最後的實驗結果。

評價名額:準确率,召回率,覆寫率,新穎度。這裡用推薦清單中是以物品的平均流行度來表示新穎度。

2.4    基于領域的算法

2.4.1 基于使用者的協同過濾算法

基于使用者的協同過濾算法在1992年誕生(和我一樣。。。),是推薦系統中最古老的算法。先介紹該算法最基本的算法,再逐漸介紹算法的改進。

基礎算法: 推薦算法的目的是為使用者u推薦N個商品。為達到這麼目的,需要分為3步走,第一步是找到與目标使用者u興趣相似的使用者集合V,第二步是找到V中使用者喜歡的,但是u沒聽過的商品集合J,第三步是計算目标使用者u對J中商品j的分數Pu(u,j),按照分數排序為使用者推薦前N個商品。

使用者之間的相似度W(u,v):      主要通過兩個使用者動作過的物品的重合度來衡量。如果兩個使用者購買的商品基本都一樣,說明兩個使用者很相似。使用者u動作過的商品集合N(u)與使用者v動作過的商品集合N(v)的相似度可以用傑卡德相似系數(Jaccard)或者餘弦相似度(cos)。分子都一樣,是集合的交集。前者的分母是集合的并集,後者的分母是長度的乘積開方。

相似度的改進:最原始的計算方法認為每個商品都是平等的,是以分子就是商品的數量。其實每個商品的流行度不一樣,如果兩個使用者經常同時購買流行度較低的商品,更加能說明兩個人比較相似。這裡分子改為: 1/( log( 1+N(j) )).N(j)表示兩人同時購買的商品j的流行度。

時間效率的改進:在計算所有使用者間的相似度時,每計算兩個使用者間的距離,都需要周遊整個資料集。假設資料集的長度為L,使用者數量為M,那麼時間複雜度是O(M*M*L)。将統計結果放入字典C[u][v]中。改進思想:建立物品到使用者的倒排表,對于每個物品,儲存對該物品産生動作的所有使用者。這樣隻需要對資料進行一次周遊,就可以得到詞典dict_item_user[u]。然後對該詞典進行M*M次周遊就可以得到所有使用者的動作過的商品的交集C[u][v]。

目标使用者u對商品j的分數:Wuv*Rvj累加。V表示與使用者u興趣最接近的前K個使用者,Wuv表示使用者間的相似度,Rvj表示使用者V對商品j的打分。如果沒有打分,按照1計算。

2.4.2 基于物品的協同過濾算法

上面介紹的基于使用者的CF算法有個2個很重要的缺點:随着網站的使用者數目越來越大,計算使用者間的相似度矩陣也越來越困難;推薦結果很難對使用者進行解釋。于是亞馬遜提出了基于物品的CF算法。

基于物品的協同過濾是目前業界應用最多的算法。先介紹最基本的算法,再逐漸介紹算法的改進。

基礎算法:為目标使用者u推薦N個商品。第一步計算物品間的相似度。第二步找出使用者u曆史喜歡的商品集合I,根據前一步得到的相似度矩陣,獲得與每個商品i最相似的商品K個商品集合J(如果不重合,有I*J個商品)。第三步通過計算u對集合J中商品j的分數,根據分數推薦前N個商品給使用者u。

商品間的相似度W(i,j):  如果兩個商品經常被同一個使用者購買,說明兩個商品很相似。分子為同時購買商品i和商品j的使用者的數量,分母為購買i的使用者數量*購買j的使用者數量 開方。

相似度的改進:如果兩個商品同時被一個活躍度低的使用者購買,能夠更加說明兩個商品相似,是以需要對活躍使用者進行懲罰。分母不變,分子改為 1 / ( log( 1+N(u)) ).  N(u)表示同時購買i和j的使用者的活躍度。

相似度的歸一化:有學者發表了一篇論文,提到如果将ItemCF中的相似度矩陣按照最大值歸一化,可以提高推薦的準确率。Wij=Wij /max(Wij)  分母表示商品i與其他所有商品的相似度的最大值。不是所有商品與其他商品的最大值。不知道在UserCF中,将相似度矩陣歸一化效果會不會有提升?

時間效率的改進:建立從使用者到商品的倒排表dict_user_item[user],存儲每個使用者喜歡的商品集合。

使用者u對商品j的分數:  Wij*Rui的累加。Wij表示使用者喜歡的商品i與待推薦商品j的相似度,Rui表示使用者u對自己喜歡的商品i的打分。如果商品j與使用者喜歡的m個商品都很相似,那麼就是累加m項。

2.4.3 UserCF和ItemCF的比較

那麼我們到底應該選用UserCF還是ItemCF呢?最直接的想法是根據離線實驗,看哪個的效果好就用哪個。但是離線實驗的結果在選取推薦算法時不能起到決定作用。首先應該滿足産品的需求,比如如果需要提供可解釋性,就得選擇ItemCF;其次要看時間代價。如果使用者數量太多,就不能用UserCF;最後,離線的名額與線上的名額(如點選率)不一定成正比。

2.5    隐語義模型

LFM隐語義模型最早在文本挖掘領域被提出,用于找到文本的隐含語義,相關的名詞有LSI/PLSA/LDA和topic model。

通過對使用者和商品自動聚類,實作了不同于CF的基于使用者行為的推薦算法。

使用者u對商品i的興趣: P(u,i)=Puk*Qik 求和。其中k表示隐類的個數,由使用者指定;Puk表示使用者u對隐類k的偏好;Qik表示商品i與隐類k的關系。現在需要解決的就是如何确定這兩個參數。書中通過機器學習的思想,通過疊代的方式得到參數。

機器學習方法求參數:該類方法最本質的思想:首先建構總的損失函數,設定參數初始值和學習步長,在梯度方向進行搜尋,某個參數的梯度方向就是損失函數對該參數求偏導。這裡的資料是隐回報資料,是以需要建構正負樣本。

隐回報資料生成類别标簽:正樣本很好解決,使用者對物品産生動作就設定Rui=1,否則設定為0.但是這樣會導緻負樣本特别多,是以需要對負樣本進行采樣,一般設定比例為1:1。優先選取流行度較低的商品,因為使用者可能不知道該商品才沒買,不是因為知道了不買。

書中介紹的損失函數中,參數向量在實際中具體表示什麼不是很明白,是以不是完全明白該小節?

2.6    基于圖的模型

使用者行為很容易用二分圖表示,是以很多圖的算法都可以用到推薦系統中。

如何用圖表示使用者行為:左邊一列的節點表示使用者,右邊的一列節點表示商品,如果一個使用者購買了一個商品,就把兩個節點相連。給使用者推薦商品,就是使用者節點與商品節點之間的相關性,向使用者推薦相關性最高的商品。

基于圖的推薦算法:相關性較高的一對定點具有三個特征:兩個頂點之間有很多路徑相連;連接配接兩個頂點的路徑的長度都比較短;連接配接兩個定點之間的路徑不會經過初度比較大的頂點。針對這三個特征,研究人員設計了很多算法,比如基于随機遊走的PersonalRank算法。

PersonalRank 算法:假設給使用者u(在圖中用Vu)推薦商品v(在圖中用Vv表示)。從Vu開始在二分圖中進行随機遊走,遊走到任何一個節點,首先按照機率alpha決定是否繼續遊走。如果走,就從目前節點指向的任意一個節點随機選一個節點,作為下次經過的節點;如果不走,就回到Vu節點重新遊走。這樣,經過很多次随機遊走後,每個商品被通路的機率會收斂到一個數字。使用者對每個商品的偏好就是本次遊走結束後Vv節點的機率值。具體的公式和代碼都比較簡單,在書中有介紹。

繼續閱讀