前一陣子參加了百度的電影推薦系統創新比賽。http://openresearch.baidu.com/activitycontent.jhtml?channelId=284 。 之前沒有實現過推薦算法,想趁這次機會鍛煉一下。雖然成績並不好,RMSE只有0.6214,沒有擠進前30。
任務描述:從用戶的歷史評分數據:userid,movieid,rating, 即用戶對某個電影的評分,預測用戶將會對一個未評分的電影打多少分。主辦方還提供了用戶的朋友關系,電影的類別等信息,但是這些我都沒用上(原因最后分析),所以就只關心用戶的歷史行為數據。
這是一個評分預測問題。主要有兩種途徑:1 協同過濾 和 2 基於內容的過濾。 其中協同過濾用的最多,我也只實現了它。下面都是協同過濾的算法。
1 User-based collaborative filtering 基於用戶的協同過濾
用戶u和用戶v有各自的評分記錄 rating_list, 基於這個歷史評分記錄,我們可以計算u和v的相似度。相似度的計算公式有很多種,比如余弦相似度、皮爾森相似度等。(具體的公式可以網上搜)。我使用的是自己改進的公式(因為自己覺得比較靠譜):
其中N(u)指u評過分的電影集合。dis就是指兩個評分的絕對值差。因為電影評分都是1~5之間的,比如u評分5,v評分4,那么dis就是1, 2-1=1, 對w_uv有1的正分貢獻。除以Log(1+N(i))的原因:如果電影很流行,比如泰坦尼克號,大家都看,那么對u和v的相似度影響應該小;相反,如果看過電影i的人很少,比如電梯里的惡魔,那么i對u和v用戶的影響就應該更大。
現在有了用戶之間的相似度關系。要預測用戶u對電影i的評分。取出所有對i評過分的用戶。從中取出相似度最高的K個用戶,以他們的打分做加權平均,得到的分數就是對用戶u的預測。所以有些人也把這種算法稱為“基於鄰居”的預測。(knn)
技巧: 做加權平均的時候,權值一般設為相似度w。但是有學者認為權值要經過訓練估計,得到的結果比較好。“Modeling relationships at multiple scales to improve accuracy of large recommender systems”
結果: RMSE = 0.6638
2 Item-based collaborative filtering 基於物品的協同過濾
和user-based思路基本一樣,只不過,剛才是計算用戶之間的相似度,現在換成計算電影間的相似度。有點類似對偶問題。
效果:RMSE=0.6483
點評:據經驗總結,Item-based 的效果比user-based好,而且占內存小。因為電影的數量要比用戶的數量少很多。
把 user-based 和item-based的結果加權: RMSE= 0.6343
3 SVD和pmf
下面就談談最流行的矩陣分解途徑吧。 參考的是兩篇論文"matrix factorization techniques for recommender systems" 和 "Probabilistic matrix factorization"
把用戶-電影 評分看成一個矩陣,rui 表示u對電影i的評分。這個矩陣是很稀疏的,很多元素都缺失。一般來說填充率不到1%。然后假定每個用戶u都有一個D維的向量,表示他對不同風格的電影的偏好,每個電影i也有一個D維的向量表示不同風格的用戶對它的偏好。 於是電影的評分矩陣可以這樣來估計:
p 和q就是D維的向量。用梯度下降法訓練p和q,迭代幾十次就收斂了。但是這樣的SVD很容易就過擬合,所以需要加一些約束。具體的約束請看那兩篇論文,這里只將一種:要優化的目標函數變為:
對它求導,可以發現每次迭代的時候,p和q的更新公式變成:
加入了一些約束之后,就可以避免過擬合。或許有些人不知道什么是過擬合的后果,這里順便也把圖貼上來:
虛線的線,前期RMSE下降的很快,后來又上升了,成V型,就是過擬合的表現了。
還有一種 bayesian probabilistic matrix factorization(http://www.utstat.toronto.edu/~rsalakhu/BPMF.html), 效果很贊,有源碼,可以直接使用。
效果: RMSE= 0.6302
4 后處理
主要針對特殊用戶。 1 是評分很少的用戶,比如評分數只有7個以下的。經統計這些用戶的評分,猜測這些人是精心挑選好電影看的,所以給他們的打分直接設成平均分多一分。
2 是評分一直很穩定的用戶。有兩種情況,一種是電影托,第二是用戶比較隨意,隨意給分的。所以對他們的結果,直接預測為他們歷史的平均值。
5 各種算法的加權平均
最后把幾種算法的結果加權平均起來,RMSE=0.6214。 前netflix冠軍隊是整合了他們的108個模型的結果,對此我只能呵呵了。"the BellKor solution to the Netflix Prize"
最后,因為是我第一次參加推薦系統的實踐,很多經驗都不足,希望能多和大家交流切磋。時間比較玩了,擔心樓管會鎖門,文章可能寫的比較膚淺。持續更新。