推荐系统
什么是推荐系统
随着互联网的发展,信息不断丰富的同时,也带来了信息过载问题。用户在面对海量信息的时候越来越难以区分。搜索引擎能够帮助用户根据关键词来筛选需要的信息,但是当用户无法明确关键词的时候,选择困难症患者就要发愁了。推荐系统可以通过一定的方式将用户和物品(比如文章、物品、视频、好友信息等)联系起来,从而帮助用户发现他们可能感兴趣的信息。推荐系统需要依赖用户行为数据,并通过应用的个性化页面展示推荐结果,进而提高应用的点击率和转化率。
应用场景
在电商领域,比较典型的是亚马逊的个性化推荐系统,被称为“推荐系统之王”。亚马逊有 20%~30% 的销售额来自于推荐系统。主要形式包括个性化推荐列表、相关推荐列表及打包销售等。
- 个性化推荐列表:将那些和用户喜欢的物品比较相似的物品,或者用户好友喜欢的物品推荐给用户。
- 相关推荐列表:当用户购买一件物品后,将那些购买此物品的用户也经常购买的其他物品,或者浏览过此物品的用户也经常购买的其他物品推荐给用户。
- 打包销售:当用户单击某个物品的购买按钮时,将那些其他用户在购买此物品时,连同购买的其他物品推荐给用户。
其他推荐场景和电商推荐原理类似,包括电影和视频网站:爱奇艺、抖音,个性化音乐网站:网易云音乐、豆瓣FM,社交网络:QQ、微博,基于位置的服务:美团、高德,个性化资讯和广告:百度、今日头条等。
评测
实验方法
实验方法包括:离线实验、用户调查和在线实验。
离线实验
- 通过日志系统获得用户数据并格式化为标准数据集。
- 将数据集切分为训练集和测试集。
- 利用训练集进行模型训练,利用测试集进行预测。
- 通过离线指标评测算法,对测试集的预测结果进行评测。
离线实验不会影响生产系统,不需要用户参与即可实验,速度快,可以测试大量算法,但无法计算商业上关心的指标,和实际情况存在差距。
用户调查
用户调查可以获得用户主管感受,但是招募测试用户代价较大,而且用户在测试环境下的行为和真实环境可能有所不同。
在线实验
可以通过在线 AB 测试来比较多个算法的差异,并获得真实指标,包括商业指标。但 AB 测试周期较长,一般只测试离线实验或用户调查中表现较好的算法。
评测指标
用户满意度
用户满意度主要是以在线问卷调查的形式获得。也可以通过统计购买率,点击率,停留时长和转化率等指标来衡量。
预测准确度
预测准确度是最重要的离线评测指标。可以将包含用户历史行为记录的数据集切分为训练集和测试集,利用训练集建立用户行为预测模型,利用测试集进行预测,计算测试集的预测行为和真实行为的重合度即为预测准确度。
评分预测(预测用户对物品的评分)
评分预测的准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。将测试集中某用户 对某物品 的真实评分记作 ,预测评分记作 ,那么
RMSE的定义为:
MAE的定义为:
假设我们用一个列表records
存放用户评分数据,令records[i] = [u, i, rui, pui]
,其中 rui
为用户 对物品 的真实评分,pui
为用户 对物品 的预测评分,下面代码实现了 RMSE 和 MAE 的计算:
def RMSE(records):
return math.sqrt(sum([(rui - pui) * (rui - pui) for u, i, rui, pui in records])) / float(len(records))
def MAE(records):
return sum([abs(rui - pui) for u, i, rui, pui in records]) / float(len(records))
关于 RMSE 和 MAE 这两个指标的优缺点,Netflix 认为 RMSE 加大了对预测不准确的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么预测结果取整会降低 MAE 的误差。
TopN 推荐(个性化推荐列表)
TopN推荐的预测准确率一般通过 准确率/召回率,即 来衡量。
将用户基于训练集训练得出的推荐列表记作 ,用户在测试集上的真实行为列表记作 ,那么
推荐结果的召回率定义为:
推荐结果的准确率定义为:
下面代码实现了准确率和召回率的计算:
def PrecisionRecall(test_records, N):
hit = 0
n_recall = 0
n_precision = 0
for user, items in test_records.items():
rank = Recommend(user, N) # 调用推荐算法获得长度为N的推荐列表
hit += len(rank & items)
n_recall += len(items)
n_precision += N
return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]
为了全面评测 TopN 推荐的准确率和召回率,一般会选取不同的推荐列表长度 N,计算出一组准确度 / 召回率,然后画出准确率 / 召回率曲线(precision / recall curve)。
用户对物品的评分和喜爱程度不一定成正比,例如某用户对某电影的给了很高的评价,但用户不一定想看这部电影。预测用户是否会看某部电影会比预测用户对某部电影的评分更加重要。通常情况下,TopN 推荐更符合实际应用的需求 。
覆盖率
覆盖率描述一个推荐系统对物品长尾的发掘能力。长尾指什么。覆盖率可以简单的定义为被推荐的物品占总物品的比例。假设用户集合为 ,每个用户的推荐列表为 ,那么覆盖率为:
为了更细致地描述推荐系统发掘长尾的能力,还需要统计推荐列表中不同物品的流行度分布,可以用被推荐次数的分布表示。如果分布比较均衡,说明推荐系统的覆盖率较高。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
第一个是信息熵:
这里 代表物品 的流行度除以所有物品流行度之和。
第二个指标是基尼系数(Gini Index):
这里, 是按照物品流行度 从小到大排序的物品列表中第 个物品。下面代码实现了基于物品流行度分布的基尼系数的计算:
def GiniIndex(p):
j=1
n=len(p)
G=0
for item,weight in sorted(p.items(),key=lambada x:x[1]):
G += (2 * j - n - 1) * weight
return G / float(n - 1)
首先,我们将物品按照热门程度从低到高排列,那么上图中的黑色曲线表示最不热门的 x% 物品的总流行度占系统比例的 y%。这条曲线肯定是在 y=x 曲线之下的,而且和 y=x 曲线相交在 (0,0) 和 (1,1)。令 SA 是 A 的面积, SB 是 B 的面积,那么基尼系数的形象定义就是 SA / (SA + SB),从定义可知,基尼系数属于区间 [0,1]。如果系统的流行度很平均,那么SA就会很小,从而基尼系数很小。如果系统物品流行度分配很不均匀,那么 SA就会很大,从而基尼系数也会很大。
假设 G1 是从初始用户行为中计算出的物品流行度的基尼系数,G2 是从推荐列表中计算出的物品流行度的基尼系数,那么如果 G2 > G1,就说明推荐算法具有马太效应,也就是热门的物品会越来越流行,冷门的物品会越来越不流行。
多样性
多样性描述了推荐列表中物品两两之间的不相似性 。因此,多样性和相似性是相对应的。多样化的推荐列表可以增加用户发现感兴趣物品的概率。假设 为物品 和 之间的相似度,那么用户 的推荐列表 的多样性定义如下:
推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
不同的相似度度量函数 ,可以定义不同的多样性,比如基于内容相似度得出的是内容的多样性、基于协同过滤的相似度得出的是协同过滤的多样性等。推荐列表在考虑多样性的同时,也要考虑用户的主要偏好。
新颖性
新颖的推荐是指给用户推荐他们没有听说过的物品,简单的办法是把推荐列表中用户已经产生过行为的物品过滤掉,但用户是否在其他网站对该物品产生过行为则不得而知。另一个方法是衡量推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。但总的来说,用平均流行度来衡量新颖度还是比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。
惊喜度
如果推荐结果和用户的历史兴趣并不相似,但却让用户觉得很满意,那么这个推荐结果就是有惊喜的。值得注意的是,推荐的新颖性仅仅取决于用户是否听说过这个推荐结果,而不取决于用户是否满意。举个例子,假设给一名周星驰的粉丝推荐了一部叫做《临歧》的电影(星爷早年的作品,很少有人知道),而该用户不知道这部电影,可以说这个推荐具有新颖性,但没惊喜度,因为根据喜欢的演员推荐电影是很常规的操作。但是如果给用户推荐《复仇者联盟4》,并且该用户很喜欢,那么这个推荐是有惊喜的。
目前并没有公认的惊喜度指标定义方式,这里给出一种定性的度量方式。首先定义推荐结果和用户历史偏好物品的相似度,其次定义用户对推荐结果的满意度。如果推荐结果和用户历史偏好物品相似度低并且表示满意,这个推荐结果的惊喜度就是高的。因此,提高惊喜度需要提高用户满意度,同时降低推荐结果和用户历史偏好物品的相似度。
信任度
如果用户信任推荐系统,那么用户和推荐系统的交互会增加。尤其是电商系统,以信任的方式推荐会增加用户的购买意愿。度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推进系统的推荐结果。
提高推荐系统的信任度主要有两种方法。首先需要增加推荐系统透明度,主要通过提供解释来让用户了解推荐机制,并让用户认同推荐机制,从而提高用户对推进系统的信任度。其次是考虑用户的社交网络信息,利用用户好友信息做推荐,并且用好友关系进行推荐解释。因为用户对他们的好友一般都比较信任,因此如果推荐的物品是好友买过的,那么他们对推荐结果就会比较信任。
实时性
很多网站(如新闻、微博等)具有很强的时效性,所以需要将物品在有效时间内推荐给用户。
推荐系统的实时性包括两方面:首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。与用户行为相应的实时性,可以通过推荐列表的变化速率来评测。如果推荐列表在用户有行为后变化不大,说明推荐系统实时性不高。实时性第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。对于新物品的推荐能力,可以通过推荐列表中新物品的比例来衡量。
健壮性
健壮性指标衡量了一个推荐系统抗击作弊的能力。
算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以利用这个算法给数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后再次利用算法在注入噪声后的数据集上生成新的推荐列表。最后,比较前后两个推荐列表的相似度来评测算法的健壮性。如果攻击前后推荐列表变化不大,说明算法比较健壮。
在实际系统中,还可以通过以下方法提高推荐系统健壮性:
- 尽量使用代价比较高的用户行为做参考依据,提高攻击的代价成本。
- 在使用数据前进行攻击检测,从而对数据进行清理。
商业目标
一般来说,最本质的商业目标就是平均一个用户给公司带来的盈利。不过这种指标不是很难计算,只是计算一次需要比较大的代价。因此,很多公司会根据自己的盈利模式设计不同的商业指标。
不同的网站具有不同的商业目标。比如电商的销售额,广告网站的点击数,因此,设计推荐系统时除了满足用户发现内容的需求,也需要考虑加快实现商业目标。
总结
获取评测指标途径如下:
指标 | 离线 | 问卷 | 在线 |
---|---|---|---|
用户满意度 | X | √ | O |
预测准确度 | √ | √ | X |
覆盖率 | √ | √ | √ |
多样性 | O | √ | O |
新颖性 | O | √ | O |
惊喜度 | X | √ | X |
对于离线优化的指标,应该是在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。即最大化预测准确度,使覆盖率>A,多样性>B,新颖性>C,其中A、B、C的取值应该视不同的应用而定。
评测维度
评测系统中还需要考虑评测维度,从而知道一个算法在什么情况下性能最好。这样可以为融合不同推荐算法取得最好的整体性能带来参考。
一般来说,评测维度分为如下3种:
- 用户维度:主要包括用户的人口统计学信息、活跃度以及是否为新用户等。
- 物品维度:包括物品的属性信息、流行度、平均分以及是否为新加入物品等。
- 时间维度:包括季节,是工作日还是周末,是白天还是晚上等。
如果能够在推荐系统评测报告中包含不同纬度下的系统评测指标,就能帮我们全面地了解推荐系统性能,找到推荐算法的优缺点。