7.1、推薦系統概述
如何在學習爆炸的時代找到自己需要的信息?搜索引擎(Google,Bing,百度等等)成爲大家快速找到目標信息的最好途徑。在用戶對自己需求相對明確的時候,用搜索引擎很方便的通過關鍵字搜索很快的找到自己需要的信息。但搜索引擎並不能完全滿足用戶對信息發現的需求,那是因爲在很多情況下,用戶其實並不明確自己的需要,或者他們的需求很難用簡單的關鍵字來表述。又或者他們需要更加符合他們個人口味和喜好的結果,因此出現了推薦系統,與搜索引擎對應,大家也習慣稱它爲推薦引擎。
隨着推薦引擎的出現,用戶獲取信息的方式從簡單的目標明確的數據的搜索轉換到更高級更符合人們使用習慣的信息發現。
推薦引擎的原理圖如下
圖7.1.1 推薦引擎工作原理
7.2、推薦系統類型
推薦系統主要可以分爲:協同過濾型和基於內容的推薦系統,本文主要討論協同過濾型推薦系統的各個相關模塊,並且是基於開源框架Mahout實現的。基於內容的推薦不在本文討論範圍。
7.3、推薦系統的組成
推薦系統可以分爲三個模塊:算法測試模塊;推薦線上運行時模塊;推薦系統線下訓練模塊,下面分別介紹。
7.4、基於協同過濾的推薦
7.4.1 什麼是協同過濾
協同過濾是利用集體智慧的一個典型方法。要理解什麼是協同過濾 (Collaborative
Filtering, 簡稱
CF),首先想一個簡單的問題,如果你現在想查找專業知識,但你不知道如何查找,你會怎麼做?大部分的人會問問周圍的朋友,看看他們是用什麼方法解決你想解決的專業問題的,而我們一般更傾向於從口味比較類似的朋友那裏得到推薦。這就是協同過濾的核心思想。
協同過濾一般是在海量的用戶中發掘出一小部分和你品位比較類似的,在協同過濾中,這些用戶成爲鄰居,然後根據他們喜歡的其他東西組織成一個排序的目錄作爲推薦給你。當然其中有一個核心的問題:
如何確定一個用戶是不是和你有相似的品位?
如何將鄰居們的喜好組織成一個排序的目錄?
協同過濾相對於集體智慧而言,它從一定程度上保留了個體的特徵,就是你的品位偏好,所以它更多可以作爲個性化推薦的算法思想。
7.4.2 協同過濾的核心
要實現協同過濾,需要以下幾個步驟
- 收集用戶偏好
- 找到相似的用戶或物品
- 計算推薦
協同過濾分爲兩種:基於用戶的協同過濾(user-based);基於項目的協同過濾(item-based)
7.4.3 協同過濾算法
4.3.1 基於用戶的協同過濾推薦
圖4.3.1 User-based推薦
假設每個用戶的購買記錄格式爲
表4.3.1.1 用戶的購買記錄
商品id 用戶id | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 |
---|---|---|---|---|---|---|---|---|
u1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |
u2 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
u3 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
u4 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
u5 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
以上表中的數據,說明User-based推薦算法的實現過程,表中每一行數據代表了一個用戶曾經購買過的商品記錄,1代表購買過,0代表沒購買過。
1)爲每個用戶尋找相似的其它用戶,
2)查找只有u1的相似用戶中購買過的商品,而u1沒有購買過的商品,例如u2中的i6-i8,u1就沒購買過;同理u3的i6-i8,u1也沒購買過,u4中i6,i7是u1沒購買過的,u5中的i6是u1沒購買過的。
3)引入這樣的假設“人以類聚,物以羣分”。既然是相似用戶,所以就有相似的興趣或者購買習慣。那麼就可以將u2-u5購買過而u1沒購買過的商品推薦給u1。在2)中已經找出了u1沒購買過的商品爲i6-i8。對於這三個商品可以推薦給u1了。注意:購物網站的商品可是有千萬種,如果商品過多的話,是不是全部要推薦給用戶哪?當然不是,而是要選取最“靠譜”的商品推薦給用戶,這裏的“靠譜”就是要對商品進行排序了。
4)對推薦結果進行排序,i6-i8的得分計算方式分別爲:
4.3.2 基於項目的協同過濾推薦算法
圖4.3.2.1 Item-based推薦
在上一節中介紹了User-based算法,其是通過尋找相似的用戶達到推薦的目的。如果想找到與某一商品相類似的其它商品又該如何實現?Item-based算法可以實現這一目的,將表4.3.2.1轉置變爲表4.3.2.1,如果要計算與i1相似的其它商品,顯然也只用計算i1與i2-i8的相似性,然後按照與i1的相似程度排序即可。
表4.3.2.1 用戶的購買記錄
用戶id 商品id | u1 | u2 | u3 | u4 | u5 |
---|---|---|---|---|---|
i1 | 1 | 1 | 1 | 1 | 1 |
i2 | 1 | 1 | 1 | 1 | 0 |
i3 | 1 | 1 | 1 | 0 | 0 |
i4 | 1 | 1 | 0 | 0 | 0 |
i5 | 1 | 0 | 0 | 0 | 0 |
i6 | |||||
i7 | |||||
i8 |
7.5 推薦算法評價
推薦引擎作爲一個工具—一個回答問題的工具。對於用戶來說,什麼樣的推薦纔是最好的?在探求答案之前最好還是探究下問題(什麼樣的推薦引擎最好)。到底什麼樣的推薦引擎纔是最好的。用戶如何知曉推薦引擎如何才能產生滿足需要的答案?本章的餘下部分將介紹如何評價推薦引擎,因爲,在實現一個特殊的推薦系統時其評價標準相當重要。
最好的推薦引擎可能需要有一種“通靈”能力,在某種程度上,它可以在用戶的行爲發生之前,就對用戶的某些偏好做出預測,預測某些用戶對某一項目(item)的偏好。推薦系統可以預測將來你對所有項目的實際偏好。這樣的推薦系統纔可能是一種好的推薦系統。
事實上,大多數的推薦引擎實際上也就是對所有項目(item)的評分進行預測。所以評價推薦引擎的性能指標就是要評估其對項目的預測精度如何,即如果預測值和實際值之間的誤差越小,則推薦系統的準確性越好。
7.5.1 訓練數據和得分
雖然這些確切的評分偏好並不存在。也沒有人知道(包括你自己)未來你對一個新的項目(item)評分是多少。所以,在推薦引擎中,用一部分真實的數據作爲測試數據,來測試預測值和真實值之間的誤差。在真實的測試數據中,需要去掉一部分已經被評分的項目偏好數據。然後將去除特定評分項的數據輸入推薦系統,讓推薦系統預測缺失項目的評分,這樣就可以用預測值和真實值進行對比,就可以知道推薦系統的精度了。
按照以上的敘述,測試推薦引擎的性能就很簡單了。比如,可以很方便的計算預測值和真實值之間的平均誤差。平均誤差越低越好,因爲那意味着估計值更靠近真實值。如果誤差爲0.0,那說明估計值的結果是相當完美的—估計值和真實值之間沒有誤差。
有時候也使用均方根誤差作爲誤差評價標準:即預測值和真實值差的平方和取平均值後再開方。依然是,這個值越小越好。表7.5.1.1展示了相關結果。
表7.5.1.1 預測值和真實值間的平均誤差和均方根誤差
表7.5.1.1展示了一系列真實值和預測值之間的差異,從中可以看到如何計算平均誤差和均方根誤差的。均方誤差計算方法對偏離程度大的項目(此處item2偏離度較大)有更大的懲罰(即誤差越大,相比較而言均方誤差的值比平均誤差的值要大),在某些時候這種懲罰是符合實際需要的。For
example, an estimate that’s off by two whole stars is probably more than twice
as bad as one off by just one
star。因爲均方誤差計算方法更直觀,物理意義上也更好理解,所以後續的例子中將使用平均誤差作爲誤差測量方法。
7.5.2 準確率和召回率
對用戶偏好的估計並不僅僅是推薦系統要做的唯一的事,還有其它一些方面用來衡量推薦系統的好壞。一般來說推薦系統只要能夠向用戶推薦出一系列按照相關性從大到小順序排列的結果就可以了,並不需要向用戶顯示預測的偏好是多少。事實上,大多數情況下推薦結果列表的順序如何並無太大的關係,關鍵是結果列表中要有對用戶有用的項目。
更一般的觀點,可以將經典的信息檢索度量方法:準確度和召回率,用來衡量推薦系統。這兩個指標的典型應用時搜索引擎,搜索引擎返回與查詢串相關的一系列可能的結果。
搜索引擎不應該返回與查詢不相關的結果,但是其需要儘可能多的返回與查詢相關的結果。精度是在搜索結果中與查詢相關的結果與整個搜索結果的比例。精度等於10表明有在搜索結果中有10條結果與查詢相關。召回率指的是查詢結果中與查詢相關的結果與整體相關結果的比例。圖2.3展示了這兩者的示意圖。
圖2.3 搜索引擎中準確率和召回率的關係
推薦系統的準確率指的是推薦結果中符合要求的結果與整個結果列表數量的比值,召回率指的是推薦結果中符合要求的結果(good
recommendations)與整體符合要求的結果的比例。下節將介紹什麼是符合要求的結果(good recommendations)。