《推荐系统实战》阅读笔记
第一章 好的推荐系统
1.1 什么是推荐系统
信息过载:
已经有的解决方案:分类目录和搜索引擎。分别对应雅虎和谷歌。
和搜索引擎一样,推荐系统也是一种帮助用户快速发现有用信息的工具。
和搜索引擎不同的是,推荐系统不需要用户提供明确的需求,而是通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。因此,从某种意义上说,推荐系统和搜索引擎对于用户来说是两个互补的工具。
因此,从某种意义上说,推荐系统和搜索引擎对于用户来说是两个互补的工具的个性化需求,推荐系统通过发掘用户的行为,找到用户的个性化需求,从而将长尾商品准确地推荐给需要它的用户,帮助用户发现那些他们感兴趣但很难发现的商品。
推荐方式:
1、社会化推荐:向朋友咨询。
2、基于内容的推荐:比如通过自己喜欢的演员和导演。
3、基于协同过滤的推荐:找到和自己历史兴趣相似的一群用户。看看他们最近在看什么电影。
1.2 个性化推荐系统的应用
而个性化推荐系统在这些网站中的主要作用是通过分析大量用户行为日志,给不同用户提供不同的个性化页面展示,来提高网站的点击率和转化率。
几乎所有的推荐系统应用都是由前台的展示页面、后台的日志系统以及推荐算法系统3部分构成的。
1.2.3 个性化音乐网络电台
个性化推荐的成功的两个条件:
**第一个:**存在信息过载。
**第二个:**用户没有明确的需求。
1.2.4 社交网络
社交网络中的个性化推荐技术主要应用在3个方面:
1、利用用户的社交网络信息对用户进行个性化的物品推荐;
2、信息流的会话推荐;
3、给用户推荐好友。
1.2.6 基于位置的服务
随着移动设备的飞速发展,用户的位置信息已经非常容易获取,而位置是一种很重要的上下文信息,基于位置给用户推荐离他近的且他感兴趣的服务,用户就更有可能去消费。
1.2.7 个性化邮件
1.2.8 个性化广告
如何将广告投放给它的潜在客户群。个性化广告投放目前已经成为了一门独立的学科——计算广告学——但该学科和推荐系统在很多基础理论和方法上是相通的,比如它们的目的都是联系用户和物品,只是在个性化广告中,物品就是广告。
目前的个性化广告技术有一下三种:
上下文广告 通过分析用户正在浏览的网页内容,投放和网页内容相关的广告。代表系
统是谷歌的Adsense。
搜索广告 通过分析用户在当前会话中的搜索记录,判断用户的搜索目的,投放和用户
目的相关的广告。
个性化展示广告 我们经常在很多网站看到大量展示广告(就是那些大的横幅图片)。
1.3 推荐系统评测
一个完整的推荐系统一般存在3个参与方:用户、物品提供者和提供推荐系统的网站
预测准确度是推荐系统领域的重要指标(没有之一)。这个指标的好处是,它可以比较容易地通过离线方式计算出来,从而方便研究人员快速评价和选择不同的推荐算法。
所以,好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西
**其他的一些指标:**准确度、覆盖度、新颖度、惊喜度、信任度、透明度
这些指标中,有些可以离线计算,有些只有在线才能计算,有些只能通过用户问卷获得。
1.3.1 推荐系统实验方法
- 离线实验:
离线实验的方法一般由如下几个步骤构成:
(1) 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
(2) 将数据集按照一定的规则分成训练集和测试集;
(3) 在训练集上训练用户兴趣模型,在测试集上进行预测;
(4) 通过事先定义的离线指标评测算法在测试集上的预测结果。
推荐系统的离线实验都是在数据集上完成的,也就是说它不需要一个实际的系统来供它实验,而只要有一个从实际系统日志中提取的数据集即可。这种实验方法的好处是不需要真实用户参与,可以直接快速地计算出来,从而方便、快速地测试大量不同的算法。
它的主要缺点是无法获得很多商业上关注的指标,如点击率、转化率等
-
用户调查
离线实验的指标和实际的商业指标存在差距,比如预测准确率和用户满意度之间 就存在很大差别,高预测准确率不等于高用户满意度。因此,如果要准确评测一个算法,需要相对比较真实的环境。最好的方法就是将算法直接上线测试。但在对算法会不会降低用户满意度不太有把握的情况下,上线测试具有较高的风险,所以在上线测试前一般需要做一次称为用户调查的测试。
用户调查需要有一些真实用户,让他们在需要测试的推荐系统上完成一些任务。在他们完成任务时,我们需要观察和记录他们的行为,并让他们回答一些问题。最后,我们需要通过分析他们的行为和答案了解测试系统的性能。
测试用户也不是随便选择的。需要尽量保证测试用户的分布和真实用户的分布相同,比如男女各半,以及年龄、活跃度的分布都和真实用户分布尽量相同。
用户调查的优缺点也很明显。它的优点是可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。缺点是招募测试用户代价较大,很难组织大规模的测试用户,因此会使测试结果的统计意义不足。此外,在很多时候设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下的行为可能有所不同,因而在测试环境下收集的测试指标可能在真实环境下无法重现。
-
在线实验
在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。
AB测试:
AB测试是一种很常用的在线评测算法的实验方法。它通过一定的规则将用户随机分成几组,并对不同组的用户采用不同的算法,然后通过统计不同组用户的各种不同的评测指标比较不同算法,比如可以统计不同组用户的点击率,通过点击率比较不同算法的性能。对AB测试感兴趣的读者可以浏览一下网站http://www.abtests.com/
一个大型网站的架构分前端和后端,从前端展示给用户的界面到最后端的算法,中间往往经过了很多层,这些层往往由不同的团队控制,而且都有可能做AB测试。
推荐系统的最终上线,需要完成上面所说的3个实验。
首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
最后,通过在线的AB测试确定它在我们关心的指标上优于现有的算法。
1.3.2 评价指标
评价指标:用于评测推荐系统的最重要指标。用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
- 用户满意度
我们可以利用购买率度量用户的满意度,更一般的情况下,我们可以用点击率、用户停留时间和转化率等指标度量用户的满意度。
- 预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。
在计算此指标时候更加关注用户的历史行为记录。
将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
■评分预测
预测用户对物品评分的行为称为评分预测。
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
RMSE的定义如下:
其中,
r
u
i
是
用
户
u
对
物
品
i
的
实
际
评
分
,
而
r
^
u
i
是
推
荐
算
法
给
出
的
预
测
评
分
。
r_{ui} 是用户u对物品i的实际评分,而\hat{r}_{ui}是推荐算法给出的预测评分。
rui是用户u对物品i的实际评分,而r^ui是推荐算法给出的预测评分。
MAE采用绝对值计算预测误差,它的定义为:
用列表records存放用户评分数据。令records[i] = [u, i, rui, pui],其中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分。下面是计算RMSE和MAE的计算过程。
def RMSE(records):
return math.sqrt(sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records])/float(len(records)))
其中
(rui-pui)*(rui-pui) for u,i,rui,pui in records
表示在列表records中依次选取其中的数据,并且计算结果。
def MAE(records):
return sum([abs(rui-pui) for u,i,rui,pui in records])/float(len(records))
优缺点:
RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因此对对系统的评测更加苛刻。
■TopN推荐
所谓TopN推荐,也就是给用户一个个性化的推荐列表。
TopN推荐的预测准确率一般通过**准确率(precision)/召回率(recall)**度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
推荐结果的准确率定义为:
计算机准确率和召回率的代码:
def PrecisionRecall(test, N):
hit = 0
n_recall = 0 # 存放召回率
n_precision = 0 # 存放准确率
for user, items in test.items(): # 测试集合中的每一条(每一条数据包含用户名和行为)
rank = Recommend(user, N) # 通过推荐模型获取一个排序
hit += len(rank & items) # rank&items表示取rank和item的交集
n_recall += len(items)
n_precision += N
return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]
更多地,有时候为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召回率曲线(precision/recall curve)(也就是PRC曲线)。
因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。因此,本书主要也是讨论TopN推荐。
-
覆盖率
描述一个推荐系统对物品长尾的发掘能力。有许多种不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
其中,分子表示正在U集合中的用户对应的被推荐出来的武平的几个并集。
从上面的定义中可以看出来。热门排行榜的推荐覆盖率是很低的,它只会推荐那些热门的物品,这些物品在总物品中占的比例很小。
**注意:**一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。
如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。
若分布比较平,那么说明推荐系统的覆盖率较高。而如果这个分布比较陡峭,那么说明推进系统的覆盖率较低。
有两个指标可以用来定义覆盖率。第一个是信息熵:
H
=
−
∑
i
=
1
n
p
(
i
)
l
o
g
p
(
i
)
H = -\sum_{i=1}^{n}p(i)logp(i)
H=−i=1∑np(i)logp(i)
其 中 p ( i ) 是 物 品 i 的 流 行 度 除 以 所 有 物 品 流 行 度 之 和 。 其中p(i)是物品i的流行度除以所有物品流行度之和。 其中p(i)是物品i的流行度除以所有物品流行度之和。
第二个指标是基尼系数(Gini Index):
G
=
1
n
−
1
∑
j
=
1
n
(
2
j
−
n
−
1
)
p
(
i
j
)
G = \frac{1}{n-1}\sum_{j = 1}^{n}(2j-n-1)p(i_j)
G=n−11j=1∑n(2j−n−1)p(ij)
其 中 , i j 是 按 照 武 平 流 行 度 p ( ) 从 小 到 大 排 序 的 物 品 列 表 中 第 j 个 物 品 其中,i_j是按照武平流行度p()从小到大排序的物品列表中第j个物品 其中,ij是按照武平流行度p()从小到大排序的物品列表中第j个物品
下面的代码计算给定物品流行度分布后的基尼系数:
def GiniIndex(p):
j = 1
n = len(p)
G = 0
for item, weight in sorted(p.items(), key=itemgetter(1)):
G += (2 * j - n - 1) * weight
return G / float(n - 1)
马太效应:指热门的东西越热门,冷门的东西越来月冷门。事实证明,现在很多的推荐系统算法都存在马太效应。比如:协同过滤就是。可以使用基尼系数来评测推荐系统是否具有马太效应。如果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流行度的基尼系数,那么如果G2 > G1,就说明推荐算法具有马太效应。(也就是越推荐,流行的东西反而越来越流行)。
推荐列表需要能够覆盖用户不同的兴趣领域,也即推荐结果需要多样性。推荐列表应该多样,覆盖永魂绝大多数的兴趣点,那么就会增加用户找到感兴趣物品的概率。
假
设
s
(
i
,
j
)
定
义
了
物
品
i
和
j
之
间
的
相
似
度
,
那
么
用
户
u
的
推
荐
列
表
R
(
u
)
的
多
样
性
定
义
如
下
:
假设s(i,j)定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
假设s(i,j)定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
推荐系统的整体多样性可以定义为用户推荐列表多样性的平均值:
-
新颖性
如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。
通过牺牲精度来提高多样性和新颖性是很容易的,而困难的是如何在不牺牲精度的情况下提高多样性和新颖性。关心这两个指标的读者可以关注一下这个研讨会最终发表的论文。【ACM的推荐系统会议在2011年有一个专门的研讨会讨论推荐的多样性和新颖性】
-
惊喜度
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
前面也曾提到,用户满意度只能通过问卷调查或者在线实验获得,而推荐结果和用
户历史上喜欢的物品相似度一般可以用内容相似度定义。
如果获得了一个用户观看电影的历史,得到这些电影的演员和导演集合A,然后给用户推荐一个不属于集合A的导演和演员创作的电影,而用户表示非常满意,这样就实现了一个惊喜度很高的推荐。因此提高推荐惊喜度需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。
-
信任度
度量推荐系统的信任度只能通过问卷调查的方式。首先需要增加推荐系统的透明度(transparency),而增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。另外一种是利用好友之间的关系。
-
实时性
比如,给用户推荐昨天的新闻显然不如给用户推荐今天的新闻。很多推荐系统都会在离线状态每天计算一次用户推荐列表,然后于在线期间将推荐列表展示给用户。这种设计显然是无法满足实时性的。
实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。
-
健壮性
任何一个能带来利益的算法系统都会被人攻击,这方面最典型的例子就是搜索引擎。
算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
另外在设计推荐系统尽量使用用户行为代价比较大的,比如选择购买行为。因为别人想攻击的话,必须购买才行,这样系统鲁棒性就增加了。
-
商业目标
因此,设计推荐系统时需要考虑最终的商业目标,而网站使用推荐系统的目的除了满足用户发现内容的需求,也需要利用推荐系统加快实现商业上的指标。
-
总结
本文提及的有的指标能够离线获取,有的能够在线获取。
用一个数学公式表达,离线实验的优化目标是:
最大化预测准确度
使得 覆盖率 > A
多样性 > B
新颖性 > C