阿里大数据竞赛的第一季也即将告一段落,之前一直想发篇竞赛心得/攻略,但是看到有人发的博客居然被阿里查封了就不敢了…扯远了,这篇文章主要总结下自己看了项亮的《推荐系统实践》后的学习笔记。作为入门,这么书确实写的不错。
推荐系统的评测指标
为了评估推荐算法的好坏需要各方面的评估指标。
●准确率
准确率就是最终的推荐列表中有多少是推荐对了的。
●召回率
召回率就是推荐对了的占全集的多少。
下图直观地描述了准确率和召回率的含义
![](https://i-blog.csdnimg.cn/blog_migrate/ba258a2cfe267fbb0291ef763ab1df06.jpeg)
●覆盖率
覆盖率表示推荐的物品占了物品全集空间的多大比例。
●新颖度
新颖度是为了推荐长尾区间的物品。用推荐列表中物品的平均流行度度量推荐结果的新颖度。如果推荐出的物品都很热门,说明推荐的新颖度较低,否则说明推荐结果比较新颖。
各个评测指标的代码实现如下:
#train为训练集合,test为验证集合,给每个用户推荐N个物品
#召回率和准确率
def RecallAndPrecision(self,train=None,test=None,K=3,N=10):
train = train or self.train
test = test or self.test
hit = 0
recall = 0
precision = 0
for user in train.keys():
tu = test.get(user,{})
rank = self.Recommend(user,K=K,N=N)
for i,_ in rank.items():
if i in tu:
hit += 1
recall += len(tu)
precision += N
recall = hit / (recall * 1.0)
precision = hit / (precision * 1.0)
return (recall,precision)
#覆盖率
def Coverage(self,train=None,test=None,K=3,N=10):
train = train or self.train
recommend_items = set()
all_items = set()
for user,items in train.items():
for i in items.keys():
all_items.add(i)
rank = self.Recommend(user,K)
for i,_ in rank.items():
recommend_items.add(i)
return len(recommend_items) / (len(all_items) * 1.0)
#新颖度
def Popularity(self,train=None,test=None,K=3,N=10):
train = train or self.train
item_popularity = dict()
#计算物品流行度
for user,items in train.ite