推荐系统--开坑

主要介绍推荐系统分析框架、应用场景以及评测方法等。

之前做了个项目 App Recommender System,以为对推荐系统也了解了不少,结果在面试的时候第一次被问到时才发现之前做的并没能没有考虑到商业场景,委实太过于小打小闹。所谓知耻而后勇,就开了这个坑,打算系统学习下 Recommender System 这门课。

以一本通俗入门的书《推荐系统实践》by 项亮开始,以 University of Minnesota 的专项系列课程 Master Recommender Systems 为辅,来学习这个 topic。这一系列笔记仅供学习使用,文字/理念/图片均有可能来自以上两个来源。

概念

需要区分的是 信息检索(Information Retrieval)信息过滤(Information Filtering) 两个概念。

信息检索 针对的是 static content base + dynamic information need,通常使用的方法是 tfidf。信息过滤 则相反,针对的是 static information need + dynamic content base,主要的方法是对用户需求建模。推荐系统其实就是信息过滤的应用。搜索引擎需要用户主动提供准确的关键词来寻找信息,而推荐系统不需要这种明确需求,直接通过用户的历史行为给用户的兴趣建模,从而主动给用户推荐能满足用户兴趣和需求的信息,提高网站的点击率和转化率。

另外,推荐系统可以帮助发现物品的“长尾”。事实上,主流商品代表大多数用户的需求,而长尾商品则代表着小部分用户的个性化需求,后者才是更为重要的。以电商为例,如果只推荐主流产品,那么会产生大量长尾商品的库存积压,用户也不会感到惊喜或者满意。

推荐系统的三个主要组成部分:

  • 前台展示页面
  • 后台日志系统
  • 推荐算法

推荐系统的三个参与方:

  • 用户
  • 物品提供者
  • 提供推荐系统的网站

推荐系统分析框架 Analytical Framework of Recommend System

看一下推荐系统分析框架的 8 要素。

  • domain(推荐领域)
    如已经购买过的东西
  • purpose(推荐目的)
    如让用户再次购买;add-on sales
  • context(推荐背景)
    推荐活动发生的一些情况和限制。如随意浏览或者是为了购买某件商品而浏览
  • whose opinions(推荐者)
    如用户的购买记录;其它购物者
  • personalization level(个性化或定制化层次)
    1. Non-personalized recommend,像微博里列出的最热门的新闻、事件。它并不关注你是否对此感兴趣。
    2. 基于统计的有目标群体的推荐 Demographic,就好像买尿布的外国奶爸们顺手买的酒。
    3. 只针对你当前活动而作出的推荐 Ephemeral,标准格式“喜欢这个X的人们也喜欢……”。
    4. 分析长期记录得到的推荐 Consistent,如根据你的以往的消费记录,给你推荐一些物品。
  • privacy and trustworthiness(隐私性和可信度)
    1. 隐私性。这是不是我们希望网站拥有的数据
    2. 可信度。考虑会不会有内在的偏见,会不会有恶意的、非真实的操作等。
  • interface(接口)
    考虑输入输出。
    1. 输入分为 Explicit(Rating, Review, Vote, etc.)和 Implicit (Click, Purchase, Follow, etc.)
    2. 输出分为预测和推荐两种,预测是得到一个特定的评分结果,推荐是得到一堆推荐的事物。
  • algorithms(推荐算法)
    如 profitable products;product association

推荐系统的应用

电子商务

代表: 亚马逊。Amazon 被 RWW 称为“推荐系统之王”,主要的应用有个性化商品推荐列表和相关商品的推荐列表。

个性化推荐列表: 主要采用基于物品的推荐算法(item-based method),给用户推荐和他们之前喜欢的物品相似的物品。另外还有一种是基于好友的个性化推荐,按照用户在 Facebook 的好友关系,给用户推荐他们的好友在亚马逊上喜欢的物品。感觉后者可能会带来更为严重的隐私争议,不过当然你可以选择禁用。

相关推荐列表: 亚马逊有两种相关商品列表,一种是包含购买了这个商品的用户也经常购买的其它商品,另一种是包含浏览过这个商品的用户经常购买的其它商品。相关推荐列表最重要的应用是打包销售,可能商品之间是互补的,当你下订单的时候,亚马逊会问你是否要同时购买这些商品,同时,会给出打包的折扣。

亚马逊有 20%-30% 的销售来自于推荐系统。

电影和视频网站

代表: Netflix,YouTube,也都是基于物品的推荐算法。YouTube曾经做个一个实验,比较了个性化推荐的点击率和热门视频列表的点击率,实验结果表明个性化推荐的点击率是热门视频点击率的两倍。

个性化音乐网络电台

代表: Pandora,Last.fm,豆瓣。Pandora 的算法主要基于内容,其音乐家和研究人员亲自听了上万首来自不同歌手的歌,然后对歌曲的不同特性(比如旋律、节 奏、编曲和歌词等)进行标注,这些标注被称为音乐的基因。然后,Pandora会根据专家标注的基因计算歌曲的相似度,并给用户推荐和他之前喜欢的音乐在基因上相似的其他音乐。Last.fm 并没有使用专家标注,而是利用用户行为计算歌曲的相似度。给用户推荐和他有相似听歌爱好的其他用户喜欢的歌曲。

音乐作为推荐物品的特点:

  • 物品空间大
  • 消费每首歌的代价很小
  • 物品种类丰富
    音乐种类丰富,有很多的流派。
  • 听一首歌耗时很少
  • 物品重用率很高
  • 用户充满激情
    用户很有激情,一个用户会听很多首歌。
  • 上下文相关
    用户的口味很受当时上下文的影响,这里的上下文主要包括用户当时的心情(比如沮丧的时候喜欢听励志的歌曲)和所处情境(比如睡觉前喜欢听轻音乐)。
  • 次序很重要
    用户听音乐一般是按照一定的次序一首一首地听。
  • 很多播放列表资源
    很多用户都会创建很多个人播放列表。
  • 不需要用户全神贯注
  • 高度社会化
    用户听音乐的行为具有很强的社会化特性,比如我们会和好友分享自己喜欢的音乐。

上面这些特点决定了音乐是一种非常适合用来推荐的物品。因此,尽管现在很多推荐系统都是作为一个应用存在于网站中,比如亚马逊的商品推荐和Netflix的电影推荐,唯有音乐推荐可以支持独立的个性化推荐网站,比如Pandora、Last.fm和豆瓣网络电台。

社交网络

代表: Facebook,Twitter
主要应用在:

  • 利用用户的社交网络信息对用户进行个性化的物品推荐
  • 信息流的会话推荐
  • 给用户推荐好友

Facebook 有个推荐 API,Instant Personalization,根据用户好友喜欢的信息,给用户推荐他们的好友最喜欢的物品。很多网站都用了这个 API 来实现网站的个性化,如 Yelp。

个性化阅读

代表: Google Reader,鲜果网,Zite,Flipboard。

基于位置的服务

代表: Foursquare
往往和社交网络结合在一起。基于位置给用户推荐他近的且感兴趣的服务,用户就更有可能去消费。

个性化邮件

代表: Tapestry, Google

谷歌于2010年推出了优先级收件箱功能。通过分析用户对邮件的历史行为,找到用户感兴趣的邮件,展示在一个专门的收件箱里。用户每天可以先浏览这个邮箱里的邮件,再浏览其他邮件。Google 的研究表明,该产品可以帮助用户节约 6% 的时间。

个性化广告

代表: Facebook

广告定向投放目前已经成为了一门独立学科 – 计算广告学。个性化广告投放技术主要分为 3 种:

  • 上下文广告 通过分析用户正在浏览的网页内容,投放和网页内容相关的广告。代表系统是谷歌的Adsense。
  • 搜索广告 通过分析用户在当前会话中的搜索记录,判断用户的搜索目的,投放和用户目的相关的广告。
  • 个性化展示广告 我们经常在很多网站看到大量展示广告(就是那些大的横幅图片),它们是根据用户的兴趣,对不同用户投放不同的展示广告。雅虎是这方面研究的代表。

推荐系统评测

一个完整的推荐系统一般存在 3 个参与方:用户、物品提供者和提供推荐系统的网站。

因此在评测一个推荐算法时,需要同时考虑三方的利益,一个好的推荐系统是能够令三方共赢的系统。以图书推荐为例,好的推荐系统需要:

  • 需要满足用户的需求,给用户推荐那些令他们感兴趣的图书。
  • 要让各出版社的书都能够被推荐给对其感兴趣的用户,而不是只推荐几个大型出版社的书。
  • 能够让推荐系统本身收集到高质量的用户反馈,不断完善推荐的质量,增加用户和网站的交互,提高网站的收入。

推荐系统实验方法

离线实验(offline experiment)

步骤:
(1) 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
(2) 将数据集按照一定的规则分成训练集和测试集;
(3) 在训练集上训练用户兴趣模型,在测试集上进行预测;
(4) 通过事先定义的离线指标评测算法在测试集上的预测结果。

优点:

  • 不需要对实际系统的控制权
  • 不需要真是用户参与
  • 速度快,能快速测试大量不同的算法

缺点:

  • 无法获得更多商业上关注的指标,如点击率、转化率等。
  • 离线实验的指标和商业指标存在差距。高预测率不等于高用户满意度。

用户调查(user study)

像是一个过渡,离线实验的指标和实际的商业指标存在差距,算法直接上线测试又具有较高的风险,所以在上线测试前一般需要做一次用户调查。

用户调查需要有一些真实用户,让他们在需要测试的推荐系统上完成一些任务。在他们完成任务时,我们需要观察和记录他们的行为,并让他们回答一些问题。最后,我们需要通过分析他们的行为和答案了解测试系统的性能。

优点:

  • 获得很多体现用户主观感受的指标
  • 相对在线实验风险低,出错后容易弥补

缺点:

  • 招募测试用户代价较大
  • 很难组织大规模的测试用户,因此会使测试结果的统计意义不足
  • 设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下的行为可能有所不同

在线实验(online experiment)

也就是传说中的 AB 测试。AB 测试是一种常用的在线评测算法的实验方法,通过一定的规则将用户随机分成几组,并对不同组的用户采取不同的算法,然后通过统计不同组用户的各种不同评测指标比较不同算法,比如统计不同组用户的点击率,通过点击率比较不同算法的性能。详见 AB test

优点:

  • 可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标

缺点:

  • 周期长,必须进行长期的实验才能得到可靠的结果

简单的AB测试系统。

  • 用户进入网站后,流量分配系统决定用户是否需要被进行AB测试,如果需要的话,流量分配系统会给用户打上在测试中属于什么分组的标签。
  • 用户浏览网页,而用户在浏览网页时的行为都会被通过日志系统发回后台的日志数据库。此时,如果用户有测试分组的标签,那么该标签也会被发回后台数据库。
  • 在后台,实验人员的工作首先是配置流量分配系统,决定满足什么条件的用户参加什么样的测试。其次,实验人员需要统计日志数据库中的数据,通过评测系统生成不同分组用户的实验报告,并比较和评测实验结果。
AB%E6%B5%8B%E8%AF%95%E7%B3%BB%E7%BB%9F.jpg

一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。

  1. 首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
  2. 然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
  3. 最后,通过在线的 AB 测试确定它在我们关心的指标上优于现有的算法。

评测指标

用户满意度

只能通过用户调查或者在线实验获得。

用户调查

GroupLens 曾经做过一个论文推荐系统的调查问卷,该问卷的调查问题是请问下面哪句话最能描述你看到推荐结果后的感受

  • 推荐的论文都是我非常想看的。
  • 推荐的论文很多我都看过了,确实是符合我兴趣的不错论文。
  • 推荐的论文和我的研究兴趣是相关的,但我并不喜欢。
  • 不知道为什么会推荐这些论文,它们和我的兴趣丝毫没有关系。

在线实验

主要通过一些对用户行为的统计得到。如利用购买率、点击率、用户停留时间和转化率等指标度量用户的满意度。

预测准确度

最重要的离线评测指标。在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
precisionRecall.jpg

评分预测

很多提供推荐服务的网站都有一个让用户给物品打分的功能(如知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个所示)。那么,如果他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中的一个用户 u 和物品 i,令 $r_{ui}$ 是用户 u 对 u 物品 i 的实际评分,而 $\hat r_{ui}$ 是推荐算法给出的预测评分,那么 RMSE 为
RMSE.jpg

MAE 采用绝对值计算预测误差:
MAE.jpg

代码也非常简单

1
2
3
4
5
6
def RMSE(records):
return math.sqrt(sum[(rui=pui)**2 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))

Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。

TopN 推荐

TopN 推荐其实更符合实际需求。以电影为例,评分预测预测的其实是用户看了电影后会给什么样的评分,而电影推荐的目的是找到用户最可能感兴趣的电影,这两者当然不是一个概念。也许有一部历史片/文艺片非常好,用户看了会给非常高的分数,但是用户看的可能性非常小,可能用户就喜欢爱情片/脑残片呢。

覆盖率

覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为 U, 推荐系统给每个用户推荐一个长度为 N 的物品列表 R(u),那么推荐系统的覆盖率就是
coverage.jpg

覆盖率是一个内容提供商会关心的指标。以图书推荐为例,出版社可能会很关心他们的书有没有被推荐给用户。覆盖率为100%的推荐系统可以将每个物品都推荐给至少一个用户。此外,从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。

考虑研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力,可以用信息熵或者基尼系数。
信息熵:

$H=-\sum_{i=1}^np(i) \ logp(i)$

(p(i) 是物品 i 的流行度除以所有物品流行度之和。)

是基尼系数(Gini Index):

$G={1 \over n-1}\sum_{j=1}^n(2j-n-1)p(i_j)$

($i_j$ 是按照物品流行度p()从小到大排序的物品列表中第j个物品。)

下面的代码可以用来计算给定物品流行度分布后的基尼系数。

1
2
3
4
5
6
7
8
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) 的多样性定义如下:
diversity.jpg
diversity2.jpg

新颖性

新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。比如在一个视频网站中,新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。

评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。

惊喜度

惊喜度(serendipity)是最近这几年推荐系统领域最热门的话题。如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。

目前并没有什么公认的惊喜度指标定义方式,这里只给出一种定性的度量方式。上面提到,令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但用户却觉得满意的推荐。那么,定义惊喜度需要首先定义推荐结果和用户历史上喜欢的物品的相似度,其次需要定义用户对推荐结果的满意度。

信任度

如果你有两个朋友,一个人你很信任,一个人经常满嘴跑火车,那么如果你信任的朋友推荐 你去某个地方旅游,你很有可能听从他的推荐,但如果是那位满嘴跑火车的朋友推荐你去同样的 地方旅游,你很有可能不去。这两个人可以看做两个推荐系统,尽管他们的推荐结果相同,但用户却可能产生不同的反应,这就是因为用户对他们有不同的信任度。

度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。

提高推荐系统的信任度主要有两种方法。

  1. 增加推荐系统的透明度(transparency)
    增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。
  2. 考虑用户的社交网络信息
    利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。因为用户对他们的好友一般都比较信任,因此如果推荐的商品是好友购买过的,那么他们对推荐结果就会相对比较信任。

实时性

在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。

推荐系统的实时性包括两个方面。

  1. 推荐系统需要实时地更新推荐列表来满足用户新的行为变化。比如,当一个用户购买了iPhone,如果推荐系统能够立即给他推荐相关配件,那么肯定比第二天再给用户推荐相关配件更有价值。很多推荐系统都会在离线状态每天计算一次用户推荐列表,然后于在线期间将推荐列表展示给用户。这种设计显然是无法满足实时性的。与用户行 为相应的实时性,可以通过推荐列表的变化速率来评测。如果推荐列表在用户有行为后变化不大,或者没有变化,说明推荐系统的实时性不高。
  2. 推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。对于新物品推荐能力,我们可以利用用户推荐列表中有多大比例的物品是当天新加 的来评测。

健壮性

健壮性(即robust,鲁棒性)指标衡量了一个推荐系统抗击作弊的能力。

算法健壮性的评测主要利用模拟攻击。

  • 给定一个数据集和一个算法,用这个算法给这个数据集中的用户生成推荐列表。
  • 用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。
  • 通过比较攻击前后推荐列表的相似度评测算法的健壮性。
    如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。

在实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。

  • 设计推荐系统时尽量使用代价比较高的用户行为。比如,如果有用户购买行为和用户浏览行为,那么主要应该使用用户购买行为,因为购买需要付费,所以攻击购买行为的代价远远大于攻击浏览行为。
  • 在使用数据前,进行攻击检测,从而对数据进行清理。
ways.jpg

小结

离线实验的优化 目标 是:
最大化预测准确度 使得 覆盖率 > A,多样性 > B, 新颖性 > C,其中,A、B、C的取值应该视不同的应用而定。

这些指标本身就是相互矛盾的,还有一种统一的方法可能是 AUC(area under curve):

comb.jpg

评测维度

一般来说,评测维度分为如下3种。

  • 用户维度
    主要包括用户的人口统计学信息、活跃度以及是不是新用户等。
  • 物品维度
    包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。
  • 时间维度
    包括季节,是工作日还是周末,是白天还是晚上等。
徐阿衡 wechat
欢迎关注:徐阿衡的微信公众号
客官,打个赏呗~