1. 程式人生 > >《推薦系統實戰》第一章 好的推薦系統

《推薦系統實戰》第一章 好的推薦系統

1.1 什麼是推薦系統

個性化推薦系統:一個自動化的工具,它可以分析你的歷史興趣,從龐大的資訊中找到符合你興趣的物品供你選擇。

充分研究使用者的興趣正是個性化推薦系統主要解決的問題。推薦系統通過發掘使用者的行為,找到使用者的個性化需求,從而將長尾商品準確地推薦給需要它的使用者,幫助使用者發現那些他們感興趣但很難發現的商品。

幾種方式:
(1)社會化推薦
讓好友給自己推薦物品
(2)基於內容的推薦
通過分析使用者曾經看過的電影找到使用者喜歡的演員和導演,然後給使用者推薦這些演員或者導演的其他電影
(3)基於系統過濾的推薦
如果能找到和自己歷史興趣相似的一群使用者,看看他們最近在看什麼電影,那麼結果可能比寬泛的熱門排行榜更能符合自己的興趣。

推薦演算法的本質是通過一定的方式將使用者和物品聯絡起來,而不同的推薦系統利用了不同的方式。

1.2 個性化推薦系統的應用

個性化推薦系統在這些網站中的主要作用是通過分析大量使用者行為日誌,給不同使用者提供不同的個性化頁面展示,來提高網站的點選率和轉化率。廣泛利用推薦系統的領域包括電子商務、電影和視訊、音樂、社交網路、閱讀、基於位置的服務、個性化郵件和廣告等。

1.3 推薦系統評測

準確的預測並不代表好的推薦。好的推薦系統不僅僅能夠準確預測使用者的行為,而且能夠擴充套件使用者的視野,幫助使用者發現那些他們可能會感興趣,但卻不那麼容易發現的東西。同時,推薦系統還要能夠幫助商家將那些被埋沒在長尾中的好商品介紹給可能會對它們感興趣的使用者。

常用指標:準確度、覆蓋度、新穎度、驚喜度、信任度、透明度等。

1.3.1 推薦系統實驗方法

主要有3種評測推薦效果的實驗方法,即離線實驗(offline experiment)、使用者調查(user study)和線上實驗(online experiment)。

(1)離線實驗

優點:
不需要有對實際系統的控制權 
不需要使用者參與實驗 
速度快,可以測試大量演算法
缺點:
無法計算商業上關心的指標
離線實驗的指標和商業指標存在差距

(2)使用者調查

使用者調查需要有一些真實使用者,讓他們在需要測試的推薦系統上完成一些任務。在他們完成任務時,我們需要觀察和記錄他們的行為,並讓他們回答一些問題。最後,我們需要通過分析他們的行為和答案瞭解測試系統的效能。
測試使用者也不是隨便選擇的。需要儘量保證測試使用者的分佈和真實使用者的分佈相同。使用者調查要儘量保證是雙盲實驗,不要讓實驗人員和使用者事先知道測試的目標,以免使用者的回答和實驗人員的測試受主觀成分的影響。
優點:
是可以獲得很多體現使用者主觀感受的指標,相對線上實驗風險很低,出現錯誤後很容易彌補。
缺點:
是招募測試使用者代價較大,很難組織大規模的測試使用者,因此會使測試結果的統計意義不足。此外,在很多時候設計雙盲實驗非常困難,而且使用者在測試環境下的行為和真實環境下的行為可能有所不同,因而在測試環境下收集的測試指標可能在真實環境下無法重現。

(3)線上實驗

AB測試是一種很常用的線上評測演算法的實驗方法。它通過一定的規則將使用者隨機分成幾組,並對不同組的使用者採用不同的演算法,然後通過統計不同組使用者的各種不同的評測指標比較不同演算法
優點:
可以公平獲得不同演算法實際線上時的效能指標,包括商業上關注的指標。
缺點:
週期比較長,必須進行長期的實驗才能得到可靠的結果。

一個新的推薦演算法最終上線,需要完成上面所說的3個實驗。
首先,需要通過離線實驗證明它在很多離線指標上優於現有的演算法。
然後,需要通過使用者調查確定它的使用者滿意度不低於現有的演算法。
最後,通過線上的AB測試確定它在我們關心的指標上優於現有的演算法。

1.3.2 評測指標

(1)使用者滿意度

使用者滿意度時評測推薦系統的最重要指標。無法離線計算,只能通過使用者調查或者線上實驗獲得。
可利用購買率度量使用者的滿意度。也可以用點選率,使用者停留時間或轉化率等指標度量使用者的滿意度。

(2)預測準確度

預測準確度度量一個推薦系統或者推薦演算法預測使用者行為的能力。這個指標是最重要的推薦系統離線評測指標。可通過離線實驗計算。

a、評分預測

預測使用者對物品評分的行為稱為評分預測。
評分預測的預測準確度一般通過均方根誤差(RMSE)和平均絕對誤差(MAE)計算。

RMSE的定義為:

MAE的定義為:


RMSE加大了對預測不準的使用者物品評分的懲罰(平方項的懲罰),因而對系統的評測更加苛刻。

假設我們用一個列表records存放使用者評分資料,令records[i] = [u,i,rui,pui],其中rui是使用者u對物品i的實際評分,pui是演算法預測出來的使用者u對物品i的評分,那麼下面的程式碼分別實現了RMSE和MAE的計算過程。

def RMSE(records):
    return math.sqrt(sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records]) / float(len(records)))

def MAE(records):
    return sum([abs(rui-pui) for u,i,rui,pui in records]) / float(len(records))

b、topN推薦

TopN推薦的預測準確度一般通過準確率(precision)/召回率(recall)度量。
令R(u)是根據使用者在訓練集上的行為給使用者作出的推薦列表,而T(u)是使用者在測試集上的行為列表。那麼,推薦結果的召回率定義為:

推薦結果的準確率定義為:

下面的Python程式碼同時計算出了一個推薦演算法的準確率和召回率:

def PrecisionRecall(test, N):
    hit = 0
    n_recall = 0
    n_precision = 0
    for user, items in test.items():
        rank = Recommend(user, N)
        hit += len(rank & items)
        n_recall += len(items)
        n_precision += N
    return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]

(3)覆蓋率

覆蓋率(coverage)描述一個推薦系統對物品長尾的發掘能力。

如果所有的物品都出現在推薦列表中,且出現的次數差不多,那麼推薦系統發掘長尾的能力就很好。因此,可以通過研究物品在推薦列表中出現次數的分佈描述推薦系統挖掘長尾的能力。如果這個分佈比較平,那麼說明推薦系統的覆蓋率較高,而如果這個分佈較陡峭,說明推薦系統的覆蓋率較低。

在資訊理論和經濟學中有兩個著名的指標可以用來表徵覆蓋率:資訊熵, 基尼係數

資訊熵:

這裡p(i)是物品i的流行度除以所有物品流行度之和。

基尼係數:

這裡,ij是按照物品流行度p()從小到大排序的物品列表中第j個物品。


社會學領域有一個著名的馬太效應,即所謂強者更強,弱者更弱的效應。如果一個系統會增大熱門物品和非熱門物品的流行度差距,讓熱門的物品更加熱門,不熱門的物品更加不熱門,那麼這個系統就有馬太效應。

推薦系統的初衷是希望消除馬太效應,使得各種物品都能被展示給對它們感興趣的某一類人群。但是,很多研究表明現在主流的推薦演算法(比如協同過濾演算法)是具有馬太效應的。評測推薦系統是否具有馬太效應的簡單辦法就是使用基尼係數。如果G1是從初始使用者行為中計算出的物品流行度的基尼係數,G2是從推薦列表中計算出的物品流行度的基尼係數,那麼如果G2 > G1,就說明推薦演算法具有馬太效應。

(4)多樣性

多樣性描述了推薦列表中物品兩兩之間的不相似性。

假設s(i, j)[0,1]定義了物品i和j之間的相似度,那麼使用者u的推薦列表R(u)的多樣性定義如下:

而推薦系統的整體多樣性可以定義為所有使用者推薦列表多樣性的平均值:

(5)新穎性

新穎的推薦是指給使用者推薦那些他們以前沒有聽說過的物品。最簡單的辦法是把那些使用者之前在網站中對其有過行為的物品從推薦列表中過濾掉。

評測新穎度的最簡單方法是利用推薦結果的平均流行度,因為越不熱門的物品越可能讓使用者覺得新穎。因此,如果推薦結果中物品的平均熱門程度較低,那麼推薦結果就可能有比較高的新穎性。

但是,用推薦結果的平均流行度度量新穎性比較粗略,因為不同使用者不知道的東西是不同的。因此,要準確地統計新穎性需要做使用者調查。

通過犧牲精度來提高多樣性和新穎性是很容易的,而困難的是如何在不犧牲精度的情況下提高多樣性和新穎性。

(6)驚喜度

如果推薦結果和使用者的歷史興趣不相似,但卻讓使用者覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於使用者是否聽說過這個推薦結果。
提高推薦驚喜度需要提高推薦結果的使用者滿意度,同時降低推薦結果和使用者歷史興趣的相似度。

(7)信任度

度量推薦系統的信任度只能通過問卷調查的方式,詢問使用者是否信任推薦系統的推薦結果。

提高推薦系統的信任度主要有兩種方法。

首先需要增加推薦系統的透明度(transparency),而增加推薦系統透明度的主要辦法是提供推薦解釋。只有讓使用者瞭解推薦系統的執行機制,讓使用者認同推薦系統的執行機制,才會提高使用者對推薦系統的信任度。

其次是考慮使用者的社交網路資訊,利用使用者的好友資訊給使用者做推薦,並且用好友進行推薦解釋。這是因為使用者對他們的好友一般都比較信任,因此如果推薦的商品是好友購買過的,那麼他們對推薦結果就會相對比較信任。

(8)實時性

推薦系統的實時性包括兩個方面。

首先,推薦系統需要實時地更新推薦列表來滿足使用者新的行為變化。

實時性的第二個方面是推薦系統需要能夠將新加入系統的物品推薦給使用者。對於新物品推薦能力,我們可以利用使用者推薦列表中有多大比例的物品是當天新加的來評測。

(9)健壯性

健壯性(即robust,魯棒性)指標衡量了一個推薦系統抗擊作弊的能力。
演算法健壯性的評測主要利用模擬攻擊。首先,給定一個數據集和一個演算法,可以用這個演算法給這個資料集中的使用者生成推薦列表。然後,用常用的攻擊方法向資料集中注入噪聲資料,然後利用演算法在注入噪聲後的資料集上再次給使用者生成推薦列表。最後,通過比較攻擊前後推薦列表的相似度評測演算法的健壯性。如果攻擊後的推薦列表相對於攻擊前沒有發生大的變化,就說明演算法比較健壯。

提高系統的健壯性,除了選擇健壯性高的演算法,還有以下方法。

a、設計推薦系統時儘量使用代價比較高的使用者行為。
b、在使用資料前,進行攻擊檢測,從而對資料進行清理。

(10)商業目標

不同的網站具有不同的商業目標。比如電子商務網站的目標可能是銷售額,基於展示廣告盈利的網站其商業目標可能是廣告展示總數,基於點選廣告盈利的網站其商業目標可能是廣告點選總數。因此,設計推薦系統時需要考慮最終的商業目標,而網站使用推薦系統的目的除了滿足使用者發現內容的需求,也需要利用推薦系統加快實現商業上的指標。

(11)總結

對於可以離線優化的指標,我個人的看法是應該在給定覆蓋率、多樣性、新穎性等限制條件下,儘量優化預測準確度。用一個數學公式表達,離線實驗的優化目標是:

最大化預測準確度
使得 覆蓋率 > A
        多樣性 > B
        新穎性 > C
其中,A、B、C的取值應該視不同的應用而定。

1.3.3 評測維度

增加評測維度的目的就是知道一個演算法在什麼情況下效能最好。

評測維度分為如下3種。
 使用者維度 主要包括使用者的人口統計學資訊、活躍度以及是不是新使用者等。
 物品維度 包括物品的屬性資訊、流行度、平均分以及是不是新加入的物品等。
 時間維度 包括季節,是工作日還是週末,是白天還是晚上等。