推薦系統 TOP K 評價指標

お兄ちゃん~發表於2022-04-24

符號說明

\(top\_k\): 當前使用者預測分最高的k個items,預測分由高到低排序

$pos$: 當前使用者實際點選過的items

\(N\): 測試使用者數量

示例資料

N = 4
| len(top_k & pos) | len(pos) | 預測中(四聲)的item在top_k中的位置(1為預測中,長度為使用者實際點選過的items長度)
| ---- | ---- | ---- |
| 1 | 2 | 1 0
| 2 | 3 | 0 1 1
| 3 | 4 | 1 0 1 1
| 0 | 3 | 0 0 0

一、Hit Rate

網上有2種定義方式,不知道哪個更為正確的,有知道的人能不能麻煩告訴我一下?

第一種

對所有使用者:我們真正喜歡的物品中,你給我們推薦了多少

hit = 0
total = 0
for i in users:
  top_k = 獲取top_k的程式碼
  hit += len(top_k & pos)
  total += len(pos)

hit_rate = hit / total

\(hit\_rate = \frac{1 + 2 + 3 + 0}{2 + 3 + 4 + 5}\)

第二種

被推薦到喜歡物品的使用者佔總使用者的比例

hit = 0
for i in users:
  top_k = 獲取top_k的程式碼
  if top_k中有預測到pos中的item:
    hit += 1
hit_rate = hit / N

\(hit\_rate = \frac{1 + 1 + 1 + 0}{4}\)

二、Recall

對某個使用者:我真正喜歡的物品中,你給我推薦了多少

recall = 0
for i in users:
  top_k = xxx(i)
  recall += len(top_k & pos) / len(pos)  # 使用者i的recall
recall = mean(recall)

\(recall = (\frac{1}{2} + \frac{2}{3} + \frac{3}{4} + \frac{0}{3})\ /\ 4\)

三、NDCG

對某個使用者:實際的折扣累計收益 DCG (Discounted Cumulative Gain) / 理想的DCG
DCG:考慮位置因素,希望使用者喜歡的物品在top_k中排得越前越好
iDCG:歸一化,解決【不同使用者的DCG求和項數不同,不能進行比較】的問題

NDCG = 0
for i in users:
  DCG = 0
  iDCG = 0
  top_k = xxx(i)
  for rank in range(k):
    if top_k[rank] in pos:
      DCG += 1 / log2(rank + 2)
  for i in range(min(k, len(pos))):
    iDCG += 1 / log2(i + 2)
  NDCG_u = DCG / iDCG
  NDCG += NDCG_u
NDCG = mean(NDCG)

相關文章