推薦系統實踐 0x03 評測指標

評測指標

評測指標可以評測推薦系統各個方面的性能,有些是可以定量計算的,而有些只能定性描述。有些可以通過離線實驗計算,有些需要通過用戶調查獲得,還有些只能在線評測。接下來我們將對各個評測指標進行介紹。

用戶滿意度

用戶滿意度無法進行離線計算,只能通過用戶調查以及在線實驗獲得。如果是在線實驗當中,可以通過用戶購買推薦商品的購買率對用戶滿意度進行度量。或者使用“滿意”、“不滿意”的按鈕進行反饋。一般情況下,我們可以通過點擊率、用戶停留時間和轉化率等指標度量用戶的滿意度。

預測準確度

預測準確度度量一個推薦系統或者推薦算法預測用戶行爲的能力。這個指標是最重要的推薦系統離線評測指標。預測準確度通過在訓練集上建立用戶的行爲和興趣模型預測用戶在測試集上的行爲,並計算預測行爲和測試集上實際行爲的重合度作爲預測準確度。預測準確度有各種不同的研究方向,也就有不同的預測準確度指標。

評分預測

預測該用戶在將來看到一個他沒有評過分的物品時,會給這個物品評多少分。 評分預測的預測準確度一般通過均方根誤差(RMSE)和平均絕對誤差(MAE)計算。測試集中物品\(u\)和用戶\(i\),以及用戶\(i\)對物品\(u\)的評分爲\(r_{ui}\),預測的評分爲\(\hat{r}_{ui}\)。那麼均方根誤差RMSE計算爲

\[RMSE=\frac{\sqrt{\sum_{u,i\in T}(r_{ui}-\hat{r}_{ui})^2}}{|T|} \]

平均絕對誤差(MAE)公式爲

\[MAE=\frac{\sum_{u,i\in T}|r_{ui}-\hat{r}_{ui}|}{|T|} \]

我們用records來記錄用戶、物品、真實評分和預測評分,用比較簡單的代碼來表示RMSE爲

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

用代碼表示MAE爲

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

值得一提的是,關於RMSE和MAE這兩個指標的優缺點, Netflix認爲RMSE加大了對預測不準的用戶物品評分的懲罰(平方項的懲罰),因而對系統的評測更加苛刻。研究表明,如果評分系統是基於整數建立的(即用戶給的評分都是整數),那麼對預測結果取整會降低MAE的誤差。

TopN推薦

網站在提供推薦服務時,一般是給用戶一個個性化的推薦列表,這種推薦叫做TopN推薦。TopN推薦的預測準確率一般通過準確率(precision)或者召回率(recall)度量。
令R(u)是根據用戶在訓練集上的行爲給用戶作出的推薦列表,而T(u)是用戶在測試集上的行爲列表。

召回率和精準率的代碼爲:

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)]

覆蓋率

覆蓋率(coverage)描述一個推薦系統對物品長尾的發掘能力。覆蓋率有不同的定義方法,最簡單的定義爲推薦系統能夠推薦出來的物品佔總物品集合的比例。覆蓋率是一個內容提供商會關心的指標。一個好的推薦系統不僅需要有比較高的用戶滿意度,也要有較高的覆蓋率。需要統計推薦列表中不同物品出現次數的分佈。如果所有的物品都出現在推薦列表中,且出現的次數差不多,那麼推薦系統發掘長尾的能力就很好。

在信息論和經濟學中有兩個著名的指標可以用來定義覆蓋率。 這裏\(p(i)\)是物品\(i\)的流行度除以所有物品流行度之和。可以簡單認爲是物品\(i\)出現的概率或者頻率。

物品的流行度指對物品產生過行爲的用戶總數。這裏作者竟然放到了後面一章進行解釋。

第一個是信息熵:

\[H=-\sum_{i=1}^{n}p(i)\log p(i) \]

第二個就是基尼指數:

\[G=\frac{1}{n-1}\sum_{j=1}^{n}(2j-n-1)p(i_j) \]

用代碼來寫就是

def GiniIndex(p):
    j=1
    n = len(p)
    G = 0
    for item, weight in sorted(p.items(), key=itemgetter(1)):
        G += (2 * j - n - 1) * weight
    return G / float(n - 1)

基尼係數用來刻畫系統對物品的流行度是否平均,如果物品的流行度很平均,那麼基尼係數就會越小,如果物品流行度相差很大,那麼基尼係數就會很大。基尼係數也是用來刻畫馬太效應的指標,即所謂強者更強,弱者更弱的效應。熱門的物品會更加熱門,冷門的物品也會就會更加冷門。

如果推薦算法的計算出來的物品流行度的基尼係數要大於原本用戶行爲中物品流行度的基尼係數,那麼也就是說推薦算法具有馬太效應。

多樣性

爲了滿足用戶廣泛的興趣,推薦列表需要能夠覆蓋用戶不同的興 趣領域,即推薦結果需要具有多樣性。如果我們使用\(s(i,j)\)來代表物品\(i\)和物品\(j\)的相似度。那麼用戶\(u\)的推薦列表多樣性定義爲

\[Diversity=1-\frac{\sum_{i,j\in R(u), i \ne j}{s(i,j)}}{\frac{1}{2}|R(u)||R(u)-1|} \]

這裏稍微說一下我對這個公式的理解,分數線上方是兩兩物品的相似性的總和,分數線下方是從所有物品中任意取兩個的組合數,再用1減去這個相似性的公式就得到了多樣性的公式。

再對所有用戶的推薦列表多樣性取平均就是推薦系統的多樣性。不同的物品相似度度量函數\(s(i,j)\)可以定義不同的多樣性。

新穎性

新穎的推薦不應該給用戶推薦那些他們已經看過、打過分或者瀏覽過的視頻。評測新穎度的最簡單方法是利用推薦結果的平均流行度,因爲越不熱門的物品越可能讓用戶覺得新穎。因此,如果推薦結果中物品的平均熱門程度較低,那麼推薦結果就可能有比較高的新穎性。

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

驚喜度

驚喜度是什麼,又和新穎度有什麼區別呢。新穎度通常存在用戶已知的某些物品和結果,與歷史興趣相關聯,如果推薦結果和用戶的歷史興趣不相似,但卻讓用戶覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於用戶是否聽說過這個推薦結果。是一種定性的度量。提高推薦驚喜度需要提高推薦結果的用戶滿意度,同時降低推薦結果和用戶歷史興趣的相似度。目前驚喜度獲得了學術界的部分討論,但是仍然不夠成熟,這裏也就不展開細說。

信任度

如果用戶信任推薦系統,那就會增加用戶和推薦系統的交互。在實際的業務場景當中,同樣的推薦結果,以讓用戶信任的方式推薦給用戶就更能讓用戶產生購買慾, 而以類似廣告形式的方法推薦給用戶就可能很難讓用戶產生購買的意願。想要提高用戶對系統的信任度,首先要提高系統的透明度,也就是提供一些推薦解釋、利用好友的一些行爲信息再解釋等等。

實時性

有些物品,如微博、新聞等具有很強的時效性,需要在物品還具有時效 性時就將它們推薦給用戶。實時性的表現有兩個方面:

  1. 推薦系統需要實時地更新推薦列表來滿足用戶新的行爲變化。如在購買新的硬件之後能夠立即推薦相應的配件信息。
  2. 能夠將新加入系統的物品推薦給用戶。體現了推薦系統處理物品的冷啓動能力。

健壯性

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

除了選擇健壯性高的推薦算法外,還有

  • 設計推薦系統時儘量使用代價比較高的用戶行爲
  • 在使用數據前,進行攻擊檢測,從而對數據進行清理

總結

離線實驗 調查問卷 在線實驗
用戶滿意度 x o
預測準確度 x
覆蓋率
多樣性 o o
新穎性 o o
驚喜度 x x

測評維度

  • 用戶維度
    主要包括用戶的人口統計學信息、活躍度以及是不是新用戶等。
  • 物品維度
    包括物品的屬性信息、流行度、平均分以及是不是新加入的物品等。
  • 時間維度
    包括季節,是工作日還是週末,是白天還是晚上等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章