推荐系统TOP K评价指标如何优化?
- 内容介绍
- 文章标签
- 相关推荐
本文共计563个文字,预计阅读时间需要3分钟。
目录+符号说明+示例数据+一、Hit Rate+二、Recall+三、NDCG+符号说明+(top_k):当前用户预测分最高的k个items+:+:当前用户实际点击过的items+(N):测试用户数量+示例数据
目录- 符号说明
- 示例数据
- 一、Hit Rate
- 二、Recall
- 三、NDCG
\(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序
$pos$: 当前用户实际点击过的items
\(N\): 测试用户数量
示例数据N = 4
网上有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:归一化,解决的问题
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)
参考链接-两种不同的hit rate定义方式
[www.cnblogs.com/leimu/p/13564214.html]()
[blog.csdn.net/yanguang1470/article/details/123036806]()
本文共计563个文字,预计阅读时间需要3分钟。
目录+符号说明+示例数据+一、Hit Rate+二、Recall+三、NDCG+符号说明+(top_k):当前用户预测分最高的k个items+:+:当前用户实际点击过的items+(N):测试用户数量+示例数据
目录- 符号说明
- 示例数据
- 一、Hit Rate
- 二、Recall
- 三、NDCG
\(top\_k\): 当前用户预测分最高的k个items,预测分由高到低排序
$pos$: 当前用户实际点击过的items
\(N\): 测试用户数量
示例数据N = 4
网上有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:归一化,解决的问题
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)
参考链接-两种不同的hit rate定义方式
[www.cnblogs.com/leimu/p/13564214.html]()
[blog.csdn.net/yanguang1470/article/details/123036806]()

