日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

推荐系统常用评价指标和代码实现

發布時間:2024/7/5 windows 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 推荐系统常用评价指标和代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

評價指標

Recall

  • 名稱: 召回率(真陽性率)

  • 意義:在推薦系統中,我們只關心正確推薦的有多少,也就是用戶真實喜歡的,并不會關心推薦錯的,所以我們用召回率,而不是準確率;

  • 理解這個前提:混淆矩陣
    混淆矩陣: 詳細的可以自己去了解

    Recall = TP / (TP + FN)
    也就是你所有預測為True的里面,到底有多少是真實值!

  • Recall@n指的是推薦的前n個的召回率有多少

代碼實現比較簡單

ROC(AUC)

  • 名稱: Curve曲線, AUC是ROC下面的面積
  • 意義:ROC的效果是看AUC的面積大小決定的; 如果AUC等于1,那么就是預測全部正確
  • 要明白這個,必須知道混淆矩陣。
    ROC的橫坐標是FP,縱坐標是TP,一般而言,TP要大于FP,所以曲線是一個凸函數,而且AUC>0.5
    AUC的面積越大,說明效果更好
def confusion_marix(predict_label, true_label):true_lable = true_labelTP, TN, FP, FN = 0,0,0,0for predict, true in zip(predict_label, true_lable):if predict == true == 1:TP += 1elif predict == true == 0:TN += 1 # 怎么寫? 先寫后面的 N和P,再寫前面預測正確還是錯誤elif predict == 1 and true == 0: # 預測為1,但是真實的是0,所以是錯誤的PFP += 1else: # predict == 0 and true == 1: # 預測為0,但是真實的是1,所以是錯誤的NFN += 1ACC = (TP + TN) / (len(true_lable))TPR = TP / (TP + FN) # 召回率PPV = FP / (TP + FP) # 精準率F1 = 2 / (1 / TPR + 1 / PPV)return ACC, TPR, PPV, F1

NGCG(Normalized Discounted Cummulative Gain)

  • 名稱:歸一化折損累計增益

  • 意義:在搜索和推薦任務中,系統常返回一個item列表。如何衡量這個返回的列表是否優秀呢?可以用于評價基于打分/評分的個性推薦系統。

  • 要理解這個,得從點點了解開始; 相關性是人工打標簽上去的,不要問為什么
    NDCG
    G-CG-DCG-NDCG

  • G = Gain: 表示列表中每一個item的相關性分數

  • CG = Cumulative Gain:表示對K個item的相關性進行累加

  • DCG = Discounted Cumulative Gain:考慮排序順序的因素,使得排名靠前的item增益更高,對排名靠后的item進行log折損。

    如果相關性分數r(i)只有(0,1)兩種取值時,DCG@K有另一種表達。其實就是如果算法返回的排序列表中的item出現在真實交互列表中時,分子加1,否則跳過。

  • NDCG = Normalized Discounted Cumulative Gain:
    DCG能夠對一個用戶的推薦列表進行評價,如果用該指標評價某個推薦算法,需要對所有用戶的推薦列表進行評價,由于用戶真實列表長度不同,不同用戶之間的DCG相比沒有意義。
    所以要對不同用戶的指標進行歸一化,自然的想法就是計算每個用戶真實列表(指的是groudtruth)的DCG分數,用IDCG表示,然后用每個用戶的DCG與IDCG之比作為每個用戶歸一化后的分值,最后對每個用戶取平均得到最終的分值,即NDCG。

#coding=utf-8import numpy as np# 復現求和運算的公式# 有求和運算的,K一般是傳入的list的長度 # 單元素:一般是先處理求和符號右邊的; # 多元素:生成列表; # 然后最后再聚合(np.sum)# 1. 得到一個用戶的DCG評分 # 這種是相關性分數是連續的 def getDCG_list(scores):return np.sum([np.divide(score, np.log2(1+i)) for i, score in enumerate(scores)]) # 這種相關性分數是0和1 def getDCG2_list(scores):return np.sum([np.divide(2 ** score - 1, np.log2(1+i)) for i, score in enumerate(scores, start=1)])# 但是,其實np里面所有的加減乘除都是傳播的,單個元素之間分別操作! 所以不用遍歷 def getDCG(relavance):return np.divide(relavance, np.log2(1 + np.arange(1, len(relavance) + 1)))def getDCG2(scores): # 如果相關性只有0和1用這個return np.divide(2 ** scores - 1, np.log2(1 + np.arange(1, scores.shape[0] + 1)))# 2. DCG / IDCG 所有真實列表的全部 def getNDCG(predict_list, true_list, true_relavance, true_rel_dict):# 結果為1的原因是因為代碼里相關性得分的定義是只要出現在真實列表中就為1,推薦問題里這么設置是比較常見的preict_relavance = np.asarray([true_rel_dict.get(it, 1.0) for it in predict_list], dtype=np.float32) # 獲得precit的分數idcg = getDCG(true_relavance)dcg = getDCG(preict_relavance)# if dcg == 0.0:# return 0.0ndcg = dcg / idcgreturn ndcg predict_list = [3, 2, 1] # 預測結果 true_list = [1, 2, 3] # 真實的結果 true_relavance = [i for i in range(3, 0, -1)] true_rel_dict = {it: r for it, r in zip(true_list, true_relavance)} # 定義相關性字典,方便predict_item查找相應的分數 a = getNDCG(predict_list, true_list, true_relavance, true_rel_dict) print(a)

Hit(Hit Ratio)

  • 名稱:擊中率
  • 意義:在top-K推薦中,HR是一種常用的衡量召回率的指標,而且只是在測試為用戶推薦的items是不是在用戶的真實集合中,并不在乎先后順序!
  • 計算公式為:
# coding=utf-8# HR@K: 表示模型推薦的top-K中有幾個被推薦了 # 可以發現是永遠小于1的,而且應該是增長的! 不用質疑錯沒錯,就是這么定義的 def hit(pred_items, gt_items): # 這里指的是一個用戶的預測! 不在乎排序! 只要推薦了就行hititems = [pred_item for pred_item in pred_items if pred_item in gt_items]hr = len(hititems) / len(gt_items)return hr, hititems# 加入hit@5 pred_items = [3, 4, 2, 100, 1000] gt_items = [1, 2, 3, 4, 5, 6, 7, 8] hr, hititems = hit(pred_items, gt_items) print(hr)

MAP(Mean Average Precision)

  • 所有用戶的平均命中率AP = MAP
  • 意義: 僅僅是準確率(召回率或者是HR)是不行的,還得看你的推薦順序,比如搜索引擎里的推薦TOPK,是不是把命中的的排序到前面,而未命中的排序到了后面(這里只有命中和非命中的順序之分,而沒有區分具體的每個item的順序);
    比如:【命中,命中,未命中,未命中,未命中】和【未命中,未命中,未命中,命中,命中】顯然它們的準確率都是2/5,但是第一個更好。

注意: 預測的items只要在gt中有,那么就是命中了,我們關系的是命中的順序,而不是精確的,物品2在gt中是第一個,那么預測的物品2也必須是第一個。

  • 先看AP,一個用戶的

KKK表示推薦列表的長度;
UUU表示的用戶數量;
mmm用戶實際選擇的物品數;
nnn給用戶推薦的項目數;
P(k)P(k)P(k)指的是截止到第k個,有多少項目命中
如預測的第一個排名命中了,截止到第一個,命中率是1/1;
第二個排名沒有命中,那么就是0;
第三個排名命中了,截止到第三個,有兩個命中,命中率就是2/3
rel(k)rel(k)rel(k)指的是排名第k的項目是不是被用戶實際選擇;是為1,不是為0
所以對于推薦列表【命中,命中,未命中,未命中,未命中】,假設該用戶在測試集中實際選擇了3個項目,則

def AP(pred_items, gt_items):cu_hits = 0 # 累計命中cu_precision = 0 # 累加命中率for i, pred_item in enumerate(pred_items, start=1):if pred_item in gt_items:cu_hits += 1cu_precision += cu_hits / i # 每步一算if cu_hits > 0:return cu_precision / len(gt_items)else:return 0pred_items = [3, 4, 2, 100, 1000] gt_items = [1, 2, 3, 4, 5, 6, 7, 8] AP = AP(pred_items, gt_items) print(AP)

MRR(Mean Reciprocal Rank)

  • 名稱:平均倒數排序
  • 意義: 要查詢的結果值在返回的結果中的排名。)是一個國際上通用的對搜索算法進行評價的機制。(僅僅是排名)
    可以用在序列推薦中
  • 正確檢索結果值在檢索結果中的排名來評估檢索系統的性能

    假如檢索三次的結果如下,需要的結果(cat,torus,virus)分別排在3,2,1的話,排在results的第三個結果就是1/3,排在第二個則是1/2
    (注意分母不是所有的結果的個數,而是排名)
def MRR(pred_items, gt_items):rank = 0for pred_item in pred_items:if pred_item in pred_items:rank = gt_items.index(pred_item) + 1rank += 1/rankreturn rankpred_items = [3, 4, 2, 100, 1000] gt_items = [1, 2, 3, 4, 5, 6, 7, 8] MRR = MRR(pred_items, gt_items) print(MRR)

ILS

  • 意義:ILS 衡量推薦列表多樣性的指標,計算公式

    如果,S(bi,bj)S(b_i, b_j)S(bi?,bj?)計算的是iiijjj兩個物品的相似性,如果推薦列表中的物品越不相似,ILS越小,那么推薦結果的多樣性越好。

coverage

推薦系統能夠推薦出來的物品占總物品集合的比例。
熱門排行榜的推薦覆蓋率是很低的! 因為熱門物品占總體物品是很低的一部分

總結

以上是生活随笔為你收集整理的推荐系统常用评价指标和代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。