推荐系统评价指标

参考

推荐算法常用评价指标:NDCG、MAP、MRR、HR、ILS、ROC、AUC、F1等
[LTR] 信息检索评价指标(RP/MAP/DCG/NDCG/RR/ERR)

在线指标

  • 点击率。例如对电商平台,浏览率、购买率等。
  • 相关性标注。对推荐结果进行人工标注,观察推荐内容的相关性。
  • 多样性。

离线指标

  • PR。
  • AUC。横坐标为FPR,假阳性率,即负样本被预测为正的概率。纵坐标为TPR,真阳性率,即正样本被预测为正的概率。阈值取正无穷时,所有样本预测为负,FPR=TPR=0,对应(0,0)点;阈值取负无穷时,所有样本预测为正, FPR=TPR=1, 对应(1,1)点。
  • MAP
  • NDCG

疑问

  • auc的概率解释?https://www.alexejgossmann.com/auc/。auc描述的是正样本排在负样本前面的概率,在上述博客中从auc定义给出了严格证明。
  • auc为什么对正负样本比例不敏感?对给定的模型阈值,x=FP/N,正样本数量变化时,分子分母都不变;负样本数量变化时,分子分母等比例变化,x值保持不变。对y=TP/P,有同样的结论。因此auc曲线不随正负样本比例变化。
  • auc的python计算代码? 详见auc计算公式推导与Python代码实现
  • pr曲线一定过(r=0,p=1)点吗?不是的。阈值取正无穷时, 所有样本预测为负,r=0, p=0/0没有定义。如果阈值取最大预测分,这时又有两种情况。情况1,rank1为正样本,则r=1/正样本总量,在正样本总量很大时r≈0,同时p=1,这时大概率经过(0,1)点。情况2,rank1为负样本,这种情况概率小但也存在,特别是在实际的推荐系统中,排在第一位的可能是广告,这时r=0, p=0。因此pr曲线不一定过(0,1)点,只是大概率过。阈值取负无穷时,所有样本预测为正,r=1, p=正样本占比。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的音乐推荐系统评价指标的Python实现,使用的是Precision、Recall和F1-score这三个指标。假设有两个CSV文件,一个是推荐结果,一个是实际收听结果,每个文件包含用户ID和被推荐/收听的歌曲ID。 ```python import pandas as pd import numpy as np from sklearn.metrics import precision_score, recall_score, f1_score # 读取推荐结果和实际收听结果CSV文件 df_recommend = pd.read_csv('recommend.csv') df_listen = pd.read_csv('listen.csv') # 合并数据,获取用户ID和被推荐/收听的歌曲ID df = pd.merge(df_recommend, df_listen, on=['userID']) # 获取全部歌曲ID all_songs = df_listen['songID'].unique() # 定义列表保存评价指标结果 precision_list = [] recall_list = [] f1_score_list = [] # 循环计算每个用户的指标结果 for user in df['userID'].unique(): # 获取该用户被推荐的歌曲ID和实际收听的歌曲ID recommend_songs = df[df['userID']==user]['recommend_songID'].values listen_songs = df[df['userID']==user]['songID'].values # 创建二进制数组表示该用户是否收听了每首歌曲 listen_array = np.isin(all_songs, listen_songs) # 计算评价指标 precision = precision_score(listen_array, np.isin(all_songs, recommend_songs)) recall = recall_score(listen_array, np.isin(all_songs, recommend_songs)) f1 = f1_score(listen_array, np.isin(all_songs, recommend_songs)) # 将结果保存到列表中 precision_list.append(precision) recall_list.append(recall) f1_score_list.append(f1) # 将评价指标结果保存为CSV文件 pd.DataFrame({'precision': precision_list, 'recall': recall_list, 'f1_score': f1_score_list}).to_csv('evaluation.csv', index=False) # 输出平均评价指标结果 print('Precision:', np.mean(precision_list)) print('Recall:', np.mean(recall_list)) print('F1-score:', np.mean(f1_score_list)) ``` 这个代码应该可以在五分钟内运行完毕。请注意,这个实现非常简单,没有考虑到很多实际情况,比如数据量很大的时候如何处理等等。如果需要更准确、更高效的实现,请考虑使用更复杂的算法和数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxaxtt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值