Rating Prediction——評分預測小結

注:
1. 數據集合來源自 MovieLens
2. 末尾附上源代碼

一、Introduction


現在,各大網絡購物平臺的購物都會有評分機制,商家要給用戶推薦其滿意的商品,就需要了解用戶的行爲,基於用戶行爲進行分析,從而預測並給用戶推薦適合的商品,提高商品轉化率。用戶行爲多種多樣,本實驗是基於用戶評分的行爲,來預測用戶未來的評分,一次作爲給用戶推薦的因素之一。


二、Methodology


將已有的數據分割爲兩部分,一部分作爲用戶過去的行爲集(即訓練集),另一部分作爲用戶評分預測集(即測試集),通過用戶的行爲集來預測其對其他未評分商品的評分。然後將預測的評分集與測試集比較進行誤差計算。
步驟:

  1. 讀取數據文件,生成用戶評分矩陣(行標爲用戶id,列標爲電影id,元素值爲評分).
  2. 對評分矩陣進行分割,生成訓練集和測試集並存入兩個矩陣當中。
  3. 對訓練集使用LFM算法,得到隱含因子模型矩陣。
  4. 通過step 3的隱含因子模型矩陣生成一個預測矩陣。
  5. 將預測矩陣集與測試集進行比較 ,得到誤差數據。

三、Trading Algorithm


隱含語義模型(LFM):

  • 隱含語義技術簡介
    假設用戶A的興趣涉及偵探小說、科普圖書以及一些計算機技術書,而用戶B的興趣比較集中在數學和機器學習方面。那麼,如何給A和B推薦圖書呢?
    除了UserCF和ItemCF,還有一種方法:對用戶的興趣和書進行分類。對於某個用戶,首先得到他的興趣分類,然後從分類中挑選他可能喜歡的物品。
    總結一下,這個基於興趣分類的方法大概需要解決3個問題:
    (1) 如何給物品進行分類?
    (2) 如何確定用戶對哪些類的物品感興趣,以及感興趣的程度?
    (3) 對於一個給定的類,選擇哪些屬於這個類的物品推薦給用戶,以及如何確定這些物品在一個類中的權重?
    在推薦系統領域,提的最多的就是潛語義模型和矩陣分解模型。其實,這兩個名詞說的是一回事,就是如何通過降維的方法將評分矩陣補全。
    用戶的評分行爲可以表示爲一個評分矩陣 ,其中 就是用戶u對物品i的評分。但是,用戶不會對所有物品評分,所以這個矩陣裏很多元素都是空的,這些空元素稱爲缺失值。因此,評分預測從某種意義上說就是填空,如果一個用戶對一個物品沒有評過分,那麼推薦系統就要預測這個用戶是否會對這個物品評分以及會評幾分。

  • LFM算法及其改進(此處不做具體介紹)
    LFM算法有很多種形式:
    (1) 傳統的SVD分解
    (2) Simon Funk的SVD分解(對SVD的改進)
    (3) 加入偏置頂後的LFM算法
    (4) 考慮領域影響的LFM

  • 加入偏置頂後的LFM算法
    LFM預測公式:
    這裏寫圖片描述

    這個預測公式通過隱類將用戶和物品聯繫在了一起,但是,實際情況下,一個評分系統有些固有屬性和用戶物品無關,而用戶也有些屬性和物品無關,物品也有些屬性和用戶無關。因此,我們使用Netflix Prize中提出的另一種LFM,其預測公式如下:

    這裏寫圖片描述

    這個模型稱爲BiasSVD,預測公式中引入的3項作用如下:

    • 這裏寫圖片描述訓練集中所有記錄的評分的全局平均數。在不同網站中,因爲網站定位和銷售的物品不同,網站的整體評分分佈也會顯示出一些差異。比如,有些網站中的用戶就是喜歡打高分,而另一些網站的用戶就是喜歡打低分。而全局平均數可以表示網站本身對用戶評分的影響。
    • 這裏寫圖片描述用戶偏置項。這一項表示了用戶的評分習慣中和物品沒有關係的那種因素。比如有些用戶就是比較苛刻,對什麼東西都要求很高,那麼他的評分就會偏低,而有些用戶比較寬容,那麼他的評分就會偏高。
    • 這裏寫圖片描述物品偏置項。這一項表示了物品接受的評分中和用戶沒有什麼關係的因素,比如有些物品本身質量就很高,因此獲得的評分相對比較高,而有些物品本身質量很差,因此獲得的評分都會比較低。
      這樣,加入偏置項的LFM模型損失函數爲:
      這裏寫圖片描述
      增加的3個參數中,只有 和 (一般在開始時初始化爲全0的向量)是要通過機器學習訓練出來的,同樣,根據隨機梯度下降法,可以得到如下遞推公式:
      這裏寫圖片描述
      這裏寫圖片描述
      這裏寫圖片描述
      這裏寫圖片描述
  • LFM算法損失函數:

for(int i=0;i<100&&loss>0.01;i++){
   for(int j=0;j<m;j++){
      for(int k=0;k<n;k++){ 
         if(matrixR[j][k]>0){
            float h = 0.0;
            for(int l=0;l<f;l++ ){  
               h += matrixP[l][j]*matrixQ[l][k];  
            }  
            float eui = matrixR[j][k]-coverage-B_u[j]-B_i[k]-h;
            // float  eui = matrixR[j][k]-h;
            for(int h=0;h<f;h++){  
               B_u[j]+= alpha * (eui  - lambda *B_u[j] ) ;
               B_i[k]+= alpha * (eui  - lambda *B_i[k]) ;
               matrixP[h][j] += alpha * (eui * matrixQ[h][k] - lambda * matrixP[h][j])  ; //  P[user][f] += alpha * (eui * Q[f][item] - lambda * P[user][f])  
               matrixQ[h][k] += alpha * (eui * matrixP[h][j] - lambda * matrixQ[h][k]) ;    // Q[f][item] += alpha * (eui * P[user][f] - lambda * Q[f][item])   
             }   
          }  
       }         
    }
    alpha*=0.9;
}

四、Result


  • 評分的預測結果:(此處是部分截圖)

    這裏寫圖片描述
    參數解釋:
    U_id: 用戶id
    M_id: 電影Id
    T_grade : 測試評分
    P_grade: 預測評分

  • 誤差數據分析:(以下是對整個預測集合的誤差分析結果)

    這裏寫圖片描述


五、Conclusion


  • 通過結果數據可以看出,大部分數據的預測值與測試值的偏差在0.7左右。少數偏差較大的數據會達到1~2分。
    從結果來看,
    數據總體的相對誤差爲:26.39%;
    均方差(RMSE):0.74 分
    就結果來說,存在的誤差還是比較大的。

  • 對結果的影響因素有很多,歸結了以下幾點:

    • 第一, MovieLens的Rating數據集中有100萬條評分。但是,用戶有6000個,電影有4000部,也就是說評分矩陣的大小是2400萬,比例是1:24,因此實驗所用的訓練集矩陣就相當稀疏。所以造成誤差較大;
    • 第二, 對數據沒有進行篩選處理,有一些用戶只對一兩部電影進行了評價,有些電影值被一兩個用戶評價,這樣一來,計算該用戶或改電影的隱含因子的可靠性就不會很高;
    • 第三, 訓練集和測試集的分割也會影響預測的精確度。
      第四, LFM算法中的幾個影響因子參數的數值也會影響預測的精確度。

總的來說,實驗基本完成,在數據稀疏的情況下,評分預測結果與測試值相差符合度還算較好。

點此處下載源代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章