《推荐系统实践》这本书上市很短,但是反响很大,图书销量也非常好,如果你对推荐系统感兴趣,不防看看哦!一定会有很大的收获的!祝阅读愉快!
--------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
序一
该书总结了当今互联网主要领域、主要公司、各种和推荐有关的产品和服务,包括:
q亚马逊的个性化产品推荐;
qNetflix的视频和DVD推荐;
qPandora的音乐推荐;
qFacebook的好友推荐;
qGoogleReader的个性化阅读;
书的名称虽然是《推荐系统实践》,但作者也阐述了和推荐系统有关的理论基础和评价推荐系统优劣的各种标准与方法,比如覆盖率、满意度、AB测试等。由于这些评估很大程度上取决于对用户行为的分析,因此本书也介绍了用户行为分析方法,并且给出了计算机实现的算法。
本书对有兴趣自己开发推荐系统的读者给出了设计和实现推荐系统的方法与技巧,非常具有指导意义。
本书文笔流畅,可读性较高,是一部值得推荐给IT从业人员的优秀参考书。
——吴军
腾讯副总裁,谷歌资深研究员,《数学之美》和《浪潮之巅》作者
----------------------------------------------------------------------------------------------------------------------------------------------
序二
项亮的书写完了。开始写作这本书时,我的身份是作者,但交稿时,我变成了审稿人。这让我想起了多年前流传的一个“四大傻”的段子:炒房炒成房东,炒股炒成股东,……写书写成审稿人,我看也可以并肩成为一景。
在大家一起讨论的过程中,项亮经常提到另外一本非常流行的书,即《集体智慧编程》。项亮非常希望他写的书能像《集体智慧编程》那样简明实用,帮助那些对推荐技术或数据挖掘原理完全不了解的读者快速实现自己的推荐系统。出于这个目的,本书尽可能地用代码和图表与读者交流,尽可能地用直观的讨论代替数学公式,这对于大多数工程技术人员来说应该是更为喜闻乐见的形式。另一方面,可能是因为数据资源的限制,大多数学术论文都把推荐问题看做评分预测问题,而实际应用中最常见的是TopN推荐,虽然TopN推荐问题可以归纳成评分问题,但并不是每种评分预测算法都能直接用来解决TopN推荐问题。本书大部分篇幅都在讨论TopN推荐问题,这样的安排对实际应用的实现应该帮助会更大一点。最后,本书比较系统地讨论了把推荐技术应用到真实应用场景时最常遇到的问题,希望可以帮助那些有机器学习经验的技术人员快速了解推荐技术。
最近一两年,国内大型互联网公司对个性化服务越来越重视,以个性化技术做支撑的创业公司也在不断涌现,个性化的浪潮方兴未艾,相信本书能帮助更多的技术人员投身于这一技术浪潮。能看到本书的诞生,我深感荣幸,虽然我的贡献,其实只有这篇序。
——陈义
豆瓣资深算法工程师
-------------------------------------------------------------------------------------------------------------------------------------------------序三
我想,这本实践者写给实践者的书,留下的是作者对“思考”和“学习”的辩证足迹。我希望本书的出版能带动更多的朋友一起把足迹走成大路,而大路的前方,是更多成功的互联网应用和完美的技术方法。
——王益
-------------------------------------------------------------------------------------------------------------------------------------
一般认为,推荐系统这个研究领域源于协同过滤算法的提出。这么说来,推荐系统诞生快20年了。这期间,很多学者和公司对推荐系统的发展起到了重要的推动作用,各种各样的推荐算法也层出不穷。本书希望将这20年间诞生的典型方法进行总结。但由于方法太多,这些方法的归类有很多不同的方式。比如,可以按照数据分成协同过滤、内容过滤、社会化过滤,也可以按照算法分成基于邻域的算法、基于图的算法、基于矩阵分解或者概率模型的算法。为了方便读者入门,本书基本采用数据分类的方法,每一章都介绍了一种可以用于推荐系统设计的、新类型的用户数据,然后介绍如何通过各种方法利用该数据,最后在公开数据集上评测这些方法。当然,不是所有数据都有公开的数据集,并且不是所有算法都可以进行离线评测。因此,在遇到没有数据集或无法进行离线评测的问题时,本书引用了一些著名学者的实验结果来说明各种方法的效果。
为了使本书同时适合工程师和在校学生阅读,本书在写作中同时使用了两种介绍方法。一种是利用公式,这样方便有一些理论基础的同学很快明白算法的含义。另一种是利用代码,这样可以方便工程师迅速了解算法的含义。不过因为本人是学生出身,工程经验还不是特别足,所以有些代码写得不是那么完美,还请工程师们海涵。
本书一开始写的时候有3位作者,除了我之外还有豆瓣的陈义和腾讯的王益。他们两位都是这方面的前辈,在写作过程中提出了很多宝贵的意见。但因为二位工作实在太繁忙,所以本书主要由我操刀。但书中的很多论述融合了大家的思想和经验,是我们很多次讨论的结果。因此在这里感谢王益和陈义二位合作者,虽然二位没有动笔,但对这本书做出了很大的贡献。
最后感谢我的父母和妻子,他们在我写作过程中给予了很大照顾,感谢他们的辛勤付出。
-------------------------------------------------------------------------------------------------------------------------------------------
第1章
在研究如何设计推荐系统前,了解什么是好的推荐系统至关重要。只有了解了优秀推荐系统的特征,我们才能在设计推荐系统时根据实际情况进行取舍。本章分3个步骤来回答这个问题:首先,本章将介绍什么是推荐系统、推荐系统的主要任务、推荐系统和分类目录以及搜索引擎的区别等;然后,本章将按照不同领域分门别类地介绍目前业界常见的个性化推荐应用;最后,本章将介绍推荐系统的评测,通过介绍评测指标给出“好”的定义,从而最终解答“什么是好的推荐系统”这个问题。
1.1什么是推荐系统
如果想买一包花生米,你有多少种办法?假设附近有一个24小时便利店,你可以走进店里,看看所有的货架,转一圈找到花生米,然后比较几个牌子的口碑或者价格找到自己喜欢的牌子,掏钱付款。如果家附近有一家沃尔玛,你可以走进店里,按照分类指示牌走到食品所在的楼层,接着按照指示牌找到卖干果的货架,然后在货架上仔细寻找你需要的花生米,找到后付款。如果你很懒,不想出门,可以打开当当或者淘宝,在一个叫做搜索框的东西里输入花生米3个字,然后你会看到一堆花生米,找到喜欢的牌子,付费,然后等待送货上门。上面这几个例子描述了用户在有明确需求的情况下,面对信息过载所采用的措施。在24小时便利店,因为店面很小,用户可以凭自己的经验浏览所有货架找到自己需要的东西。在沃尔玛,商品已经被放在无数的货架上,此时用户就需要借用分类信息找到自己需要的商品。而在淘宝或者当当,由于商品数目巨大,用户只能通过搜索引擎找到自己需要的商品。
但是,如果用户没有明确的需求呢?比如你今天很无聊,想下载一部电影看看。但当你打开某个下载网站,面对100年来发行的数不胜数的电影,你会手足无措,不知道该看哪一部。此时,你遇到了信息过载的问题,需要一个人或者工具来帮助你做筛选,给出一些建议供你选择。如果这时候有个喜欢看电影的朋友在身边,你可能会请他推荐几部电影。不过,总不能时时刻刻都去麻烦“专家”给你推荐,你需要的是一个自动化的工具,它可以分析你的历史兴趣,从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是个性化推荐系统。
推荐系统
图1-1推荐系统的基本任务是联系用户和物品,解决信息过载的问题
要了解推荐系统是如何工作的,可以先回顾一下现实社会中用户面对很多选择时做决定的过程。仍然以看电影为例,一般来说,我们可能用如下方式决定最终看什么电影。
q向朋友咨询。我们也许会打开聊天工具,找几个经常看电影的好朋友,问问他们有没有什么电影可以推荐。甚至,我们可以打开微博,发表一句“我要看电影”,然后等待热心人推荐电影。这种方式在推荐系统中称为社会化推荐(socialrecommendation),即让好友给自己推荐物品。
q我们一般都有喜欢的演员和导演,有些人可能会打开搜索引擎,输入自己喜欢的演员名,然后看看返回结果中还有什么电影是自己没有看过的。比如我非常喜欢周星驰的电影,于是就去豆瓣搜索周星驰,发现他早年的一部电影我还没看过,于是就会看一看。这种方式是寻找和自己之前看过的电影在内容上相似的电影。推荐系统可以将上述过程自动化,通过分析用户曾经看过的电影找到用户喜欢的演员和导演,然后给用户推荐这些演员或者导演的其他电影。这种推荐方式在推荐系统中称为基于内容的推荐(content-basedfiltering)。
从上面3种方法可以看出,推荐算法的本质是通过一定的方式将用户和物品联系起来,而不同的推荐系统利用了不同的方式。图1-2展示了联系用户和物品的常用方式,比如利用好友、用户的历史兴趣记录以及用户的注册信息等。
注册信息
历史兴趣
好友
图1-2推荐系统常用的3种联系用户和物品的方式
通过这一节的讨论,我们可以发现推荐系统就是自动联系用户和物品的一种工具,它能够在信息过载的环境中帮助用户发现令他们感兴趣的信息,也能将信息推送给对它们感兴趣的用户。下一节将通过推荐系统的实际例子让大家加深对推荐系统的了解。
1.2个性化推荐系统的应用
尽管不同的网站使用不同的推荐系统技术,但总地来说,几乎所有的推荐系统应用都是由前台的展示页面、后台的日志系统以及推荐算法系统3部分构成的。因此,本节在介绍不同的个性化推荐系统应用时,都尽量围绕这3个不同的部分进行。
1.2.1电子商务
图1-3是亚马逊的个性化推荐列表,这个界面是个性化推荐系统的标准用户界面,它包含以下几个组成部分。
图1-3亚马逊的个性化推荐列表
q推荐结果的标题、缩略图以及其他内容属性告诉用户给他们推荐的是什么。
q推荐结果的平均分平均分反应了推荐结果的总体质量,也代表了大部分用户对这本书的看法。
q推荐理由亚马逊根据用户的历史行为给用户做推荐,因此如果它给你推荐了一本金庸的小说,大都是因为你曾经在亚马逊上对武侠方面的书给过表示喜欢的反馈。此外,亚马逊对每个推荐结果都给出了一个按钮Fixthisrecommendation(修正这一推荐),单击后可以看到推荐理由。如图1-4所示,亚马逊的推荐结果中有一本关于机器学习的书(IntroductiontoMachineLearning),单击该推荐结果的Fixthisrecommendaion按钮后,会弹出如图1-4所示的页面,该页面给用户提供了5种对这个推荐结果进行反馈的方式,包括AddtoCart(加入到购物车)、AddtoWishList(加入到心愿单)、Ratethisitem(给书打分)、Iownit(我已经有这本书了)和Notinterested(对这本书没兴趣)。同时,在推荐结果的下面还展示了推荐原因,此处是因为我曾经给ProbabilisticGraphicalModels:PrinciplesandTechniques和DataMining:PracticalMachineLearningToolsandTechniques,SecondEdition这两本书打过5分。亚马逊允许用户禁用推荐理由,这主要是出于隐私的考虑。有些用户可能不喜欢他对某些物品的行为被系统用来生成推荐结果,这个时候就可以禁用这些行为。
对推荐结果的反馈方式
图1-4单击Fixthisrecommendation按钮后打开的页面
图1-5基于Facebook好友的个性化推荐列表
图1-8亚马逊的打包销售界面
1.2.2电影和视频网站
在电影和视频网站中,个性化推荐系统也是一种重要的应用。它能够帮助用户在浩瀚的视频库中找到令他们感兴趣的视频。在该领域成功使用推荐系统的一家公司就是Netflix,它和亚马逊是推荐系统领域最具代表性的两家公司。
图1-9是Netflix的电影推荐界面,从中可以看到Netflix的推荐结果展示页面包含了以下几个部分。
q电影的标题和海报。
q用户反馈模块——包括Play(播放)、评分和NotInterested(不感兴趣)3种。
q推荐理由——因为用户曾经喜欢过别的电影。
图1-9Netflix的电影推荐系统用户界面
和YouTube类似,美国另一家著名的视频网站Hulu也有自己的个性化推荐页面。如图1-10所示,Hulu在展示推荐结果时也提供了视频标题、缩略图、视频的平均分、推荐理由和用户反馈模块。
图1-10视频网站Hulu的个性化推荐界面
1.2.3个性化音乐网络电台
个性化推荐的成功应用需要两个条件。第一是存在信息过载,因为如果用户可以很容易地从所有物品中找到喜欢的物品,就不需要个性化推荐了。第二是用户大部分时候没有特别明确的需求,因为用户如果有明确的需求,可以直接通过搜索引擎找到感兴趣的物品。
在这两个条件下,个性化网络电台无疑是最合适的个性化推荐产品。首先,音乐很多,用户不可能听完所有的音乐再决定自己喜欢听什么,而且每年新的歌曲在以很快的速度增加,因此用户无疑面临着信息过载的问题。其次,人们听音乐时,一般都是把音乐作为一种背景乐来听,很少有人必须听某首特定的歌。对于普通用户来说,听什么歌都可以,只要能够符合他们当时的心情就可以了。因此,个性化音乐网络电台是非常符合个性化推荐技术的产品。
目前有很多知名的个性化音乐网络电台。国际上著名的有Pandora(参见图1-11)和Last.fm(参见图1-12),国内的代表则是豆瓣电台(参见图1-13)。这3种应用虽然都是个性化网络电台,但背后的技术却不太一样。
图1-11Pandora个性化网络电台的用户界面
图1-12Last.fm个性化网络电台的用户界面
图1-13豆瓣个性化网络电台的用户界面
Pandora背后的音乐推荐算法主要来自于一个叫做音乐基因工程的项目。这个项目起始于2000年1月6日,它的成员包括音乐家和对音乐有兴趣的工程师。Pandora的算法主要基于内容,其音乐家和研究人员亲自听了上万首来自不同歌手的歌,然后对歌曲的不同特性(比如旋律、节奏、编曲和歌词等)进行标注,这些标注被称为音乐的基因。然后,Pandora会根据专家标注的基因计算歌曲的相似度,并给用户推荐和他之前喜欢的音乐在基因上相似的其他音乐。
Last.fm于2002年在英国成立。Last.fm记录了所有用户的听歌记录以及用户对歌曲的反馈,在这一基础上计算出不同用户在歌曲上的喜好相似度,从而给用户推荐和他有相似听歌爱好的其他用户喜欢的歌曲。同时,Last.fm也建立了一个社交网络,让用户能够和其他用户建立联系,同时也能让用户给好友推荐自己喜欢的歌曲。和Pandora相比,Last.fm没有使用专家标注,而是主要利用用户行为计算歌曲的相似度。
q物品空间大物品数很多,物品空间很大,这主要是相对于书和电影而言。
q消费每首歌的代价很小对于在线音乐来说,音乐都是免费的,不需要付费。
q物品种类丰富音乐种类丰富,有很多的流派。
q物品重用率很高每首歌用户会听很多遍,这和其他物品不同,比如用户不会反复看一个电影,不会反复买一本书。
q用户充满激情用户很有激情,一个用户会听很多首歌。
q次序很重要用户听音乐一般是按照一定的次序一首一首地听。
q很多播放列表资源很多用户都会创建很多个人播放列表。
q不需要用户全神贯注音乐不需要用户全神贯注地听,很多用户将音乐作为背景声音。
上面这些特点决定了音乐是一种非常适合用来推荐的物品。因此,尽管现在很多推荐系统都是作为一个应用存在于网站中,比如亚马逊的商品推荐和Netflix的电影推荐,唯有音乐推荐可以支持独立的个性化推荐网站,比如Pandora、Last.fm和豆瓣网络电台。
1.2.4社交网络
q利用用户的社交网络信息对用户进行个性化的物品推荐;
q信息流的会话推荐;
q给用户推荐好友。
Facebook最宝贵的数据有两个,一个是用户之间的社交网络关系,另一个是用户的偏好信息。因此,Facebook推出了一个推荐API,称为InstantPersonalization。该工具根据用户好友喜欢的信息,给用户推荐他们的好友最喜欢的物品。很多网站都使用了Facebook的API来实现网站的个性化。表1-1中是使用了Facebook的InstantPersonalization的具有代表性的网站。图1-14是著名的电视剧推荐网站Clicker使用InstantPersonalization给用户进行个性化视频推荐的界面。
网站
网站类型
Clicker
个性化电视推荐
RottenTomatoes
Docs.com
协作式文档编辑
Pandora
个性化音乐网络电台
Yelp
Scribd
社会化阅读
图1-14Clicker利用好友的行为给用户推荐电视剧
图1-15用户在Facebook的信息流
除了根据用户的社交网络以及用户行为给用户推荐内容,社交网站还通过个性化推荐服务给用户推荐好友。图1-16显示了著名社交网站的好友推荐界面。
图1-16不同社交网站中好友推荐系统的界面(左上为Facebook,左下为Twitter,右上为LinkedIn,右下为新浪微博)
1.2.5个性化阅读
目前互联网上的个性化阅读工具很多,国际知名的有GoogleReader,国内有鲜果网等。同时,随着移动设备的流行,移动设备上针对个性化阅读的应用也很多,其中具有代表性的有Zite和Flipboard。
图1-17GoogleReader社会化阅读
图1-18Zite个性化阅读界面
1.2.6基于位置的服务
在中关村闲逛时,肚子饿了,打开手机,发现上面给你推荐了几家中关村不错的饭馆,价格、环境、服务、口味都如你所愿,这几乎就是基于位置的个性化推荐系统最理想的场景了。随着移动设备的飞速发展,用户的位置信息已经非常容易获取,而位置是一种很重要的上下文信息,基于位置给用户推荐离他近的且他感兴趣的服务,用户就更有可能去消费。
基于位置的服务往往和社交网络结合在一起。比如Foursquare推出了探索功能,给用户推荐好友在附近的行为(如图1-19所示)。
图1-19Foursquare的探索功能界面
1.2.7个性化邮件
我们每天都会收到大量的邮件,这些邮件有些对我们很重要(比如领导交代任务的邮件),有些比较次要(比如别人邀约周末打球的邮件),还有些是垃圾邮件。垃圾邮件可以通过垃圾邮件过滤器去除,这是一个专门的研究领域,这里就不讨论了。但在正常的邮件中,如果能够找到对用户重要的邮件让用户优先浏览,无疑会大大提高用户的工作效率。
1.3推荐系统评测
什么才是好的推荐系统?这是推荐系统评测需要解决的首要问题。一个完整的推荐系统一般存在3个参与方(如图1-22所示):用户、物品提供者和提供推荐系统的网站。以图书推荐为例,首先,推荐系统需要满足用户的需求,给用户推荐那些令他们感兴趣的图书。其次,推荐系统要让各出版社的书都能够被推荐给对其感兴趣的用户,而不是只推荐几个大型出版社的书。最后,好的推荐系统设计,能够让推荐系统本身收集到高质量的用户反馈,不断完善推荐的质量,增加用户和网站的交互,提高网站的收入。因此在评测一个推荐算法时,需要同时考虑三方的利益,一个好的推荐系统是能够令三方共赢的系统。
图1-22推荐系统的参与者
所以,好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西。同时,推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。这也正是《长尾理论》的作者在书中不遗余力介绍推荐系统的原因。
为了全面评测推荐系统对三方利益的影响,本章将从不同角度出发,提出不同的指标。这些指标包括准确度、覆盖度、新颖度、惊喜度、信任度、透明度等。这些指标中,有些可以离线计算,有些只有在线才能计算,有些只能通过用户问卷获得。下面各节将会依次介绍这些指标的出发点、含义,以及一些指标的计算方法。
1.3.1推荐系统实验方法
在介绍推荐系统的指标之前,首先看一下计算和获得这些指标的主要实验方法。在推荐系统中,主要有3种评测推荐效果的实验方法,即离线实验(offlineexperiment)、用户调查(userstudy)和在线实验(onlineexperiment)。下面将分别介绍这3种实验方法的优缺点。
1.离线实验
离线实验的方法一般由如下几个步骤构成:
(1)通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;
(2)将数据集按照一定的规则分成训练集和测试集;
(3)在训练集上训练用户兴趣模型,在测试集上进行预测;
(4)通过事先定义的离线指标评测算法在测试集上的预测结果。
表1-2离线实验的优缺点
优点
缺点
不需要有对实际系统的控制权
无法计算商业上关心的指标
不需要用户参与实验
离线实验的指标和商业指标存在差距
速度快,可以测试大量算法
2.用户调查
注意,离线实验的指标和实际的商业指标存在差距,比如预测准确率和用户满意度之间就存在很大差别,高预测准确率不等于高用户满意度。因此,如果要准确评测一个算法,需要相对比较真实的环境。最好的方法就是将算法直接上线测试,但在对算法会不会降低用户满意度不太有把握的情况下,上线测试具有较高的风险,所以在上线测试前一般需要做一次称为用户调查的测试。
用户调查需要有一些真实用户,让他们在需要测试的推荐系统上完成一些任务。在他们完成任务时,我们需要观察和记录他们的行为,并让他们回答一些问题。最后,我们需要通过分析他们的行为和答案了解测试系统的性能。
此外,测试用户也不是随便选择的。需要尽量保证测试用户的分布和真实用户的分布相同,比如男女各半,以及年龄、活跃度的分布都和真实用户分布尽量相同。此外,用户调查要尽量保证是双盲实验,不要让实验人员和用户事先知道测试的目标,以免用户的回答和实验人员的测试受主观成分的影响。
用户调查的优缺点也很明显。它的优点是可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。缺点是招募测试用户代价较大,很难组织大规模的测试用户,因此会使测试结果的统计意义不足。此外,在很多时候设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下的行为可能有所不同,因而在测试环境下收集的测试指标可能在真实环境下无法重现。
3.在线实验
在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。
图1-23是一个简单的AB测试系统。用户进入网站后,流量分配系统决定用户是否需要被进行AB测试,如果需要的话,流量分配系统会给用户打上在测试中属于什么分组的标签。然后用户浏览网页,而用户在浏览网页时的行为都会被通过日志系统发回后台的日志数据库。此时,如果用户有测试分组的标签,那么该标签也会被发回后台数据库。在后台,实验人员的工作首先是配置流量分配系统,决定满足什么条件的用户参加什么样的测试。其次,实验人员需要统计日志数据库中的数据,通过评测系统生成不同分组用户的实验报告,并比较和评测实验结果。
图1-23AB测试系统
一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。
q首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。
q然后,需要通过用户调查确定它的用户满意度不低于现有的算法。
q最后,通过在线的AB测试确定它在我们关心的指标上优于现有的算法。
介绍完3种主要的实验方法后,下一节将开始介绍推荐系统常用的实验指标,这些指标大部分都可以通过本节介绍的3种实验方法获得。
1.3.2评测指标
本节将介绍各种推荐系统的评测指标。这些评测指标可用于评价推荐系统各方面的性能。这些指标有些可以定量计算,有些只能定性描述,有些可以通过离线实验计算,有些需要通过用户调查获得,还有些只能在线评测。对于重要的评测指标,后面几章将会详细讨论如何优化它们,本章只给出指标的定义。但对于一些次要的指标,本章在给出定义的同时也会顺便讨论一下应该如何优化。下面几节将详细讨论各个不同的指标。
1.用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
q推荐的论文都是我非常想看的。
q推荐的论文很多我都看过了,确实是符合我兴趣的不错论文。
q不知道为什么会推荐这些论文,它们和我的兴趣丝毫没有关系。
由此可以看出,这个调查问卷不是简单地询问用户对结果是否满意,而是从不同的侧面询问用户对结果的不同感受。比如,如果仅仅问用户是否满意,用户可能心里认为大体满意,但是对某个方面还有点不满,因而可能很难回答这个问题。因此在设计问卷时需要考虑到用户各方面的感受,这样用户才能针对问题给出自己准确的回答。
图1-24Hulu让用户直接对推荐结果进行反馈,以便度量用户满意度
图1-25豆瓣网络电台通过红心和垃圾箱的反馈来度量用户满意度
2.预测准确度
由于离线的推荐算法有不同的研究方向,因此下面将针对不同的研究方向介绍它们的预测准确度指标。
l评分预测
很多提供推荐服务的网站都有一个让用户给物品打分的功能(如图1-26所示)。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
图1-26不同网站收集用户评分的界面
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中的一个用户u和物品i,令rui是用户u对物品i的实际评分,而是推荐算法给出的预测评分,那么RMSE的定义为:
MAE采用绝对值计算预测误差,它的定义为:
假设我们用一个列表records存放用户评分数据,令records[i]=[u,i,rui,pui],其中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分,那么下面的代码分别实现了RMSE和MAE的计算过程。
defRMSE(records):
returnmath.sqrt(\
sum([(rui-pui)*(rui-pui)foru,i,rui,puiinrecords])\
/float(len(records)))
defMAE(records):
returnsum([abs(rui-pui)foru,i,rui,puiinrecords])\
/float(len(records))
lTopN推荐
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
推荐结果的准确率定义为:
下面的Python代码同时计算出了一个推荐算法的准确率和召回率:
defPrecisionRecall(test,N):
hit=0
n_recall=0
n_precision=0
foruser,itemsintest.items():
rank=Recommend(user,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/recallcurve)。
l关于评分预测和TopN推荐的讨论
评分预测一直是推荐系统研究的热点,绝大多数推荐系统的研究都是基于用户评分数据的评分预测。这主要是因为,一方面推荐系统的早期研究组GroupLens的研究主要就是基于电影评分数据MovieLens进行的,其次,Netflix大赛也主要面向评分预测问题。因而,很多研究人员都将研究精力集中在优化评分预测的RMSE上。
3.覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
但是上面的定义过于粗略。覆盖率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:
这里p(i)是物品i的流行度除以所有物品流行度之和。
这里,ij是按照物品流行度p()从小到大排序的物品列表中第j个物品。下面的代码可以用来计算给定物品流行度分布后的基尼系数:
defGiniIndex(p):
j=1
n=len(p)
G=0
foritem,weightinsorted(p.items(),key=itemgetter(1)):
G+=(2*j-n-1)*weight
returnG/float(n-1)
基尼系数的计算原理
令SA是A的面积,SB是B的面积,那么基尼系数的形象定义就是SA/(SA+SB),从定义可知,基尼系数属于区间[0,1]。
如果系统的流行度很平均,那么SA就会很小,从而基尼系数很小。如果系统物品流行度分配很不均匀,那么SA就会很大,从而基尼系数也会很大。
那么,推荐系统是否有马太效应呢?推荐系统的初衷是希望消除马太效应,使得各种物品都能被展示给对它们感兴趣的某一类人群。但是,很多研究表明现在主流的推荐算法(比如协同过滤算法)是具有马太效应的。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。如果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流行度的基尼系数,那么如果G2>G1,就说明推荐算法具有马太效应。
4.多样性
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设定义了物品i和j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
从上面的定义可以看到,不同的物品相似度度量函数s(i,j)可以定义不同的多样性。如果用内容相似度描述物品间的相似度,我们就可以得到内容多样性函数,如果用协同过滤的相似度函数描述物品间的相似度,就可以得到协同过滤的多样性函数。
5.新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。比如在一个视频网站中,新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。但是,有些视频可能是用户在别的网站看过,或者是在电视上看过,因此仅仅过滤掉本网站中用户有过行为的物品还不能完全实现新颖性。
但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。
6.惊喜度
目前并没有什么公认的惊喜度指标定义方式,这里只给出一种定性的度量方式。上面提到,令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但用户却觉得满意的推荐。那么,定义惊喜度需要首先定义推荐结果和用户历史上喜欢的物品的相似度,其次需要定义用户对推荐结果的满意度。前面也曾提到,用户满意度只能通过问卷调查或者在线实验获得,而推荐结果和用户历史上喜欢的物品相似度一般可以用内容相似度定义。也就是说,如果获得了一个用户观看电影的历史,得到这些电影的演员和导演集合A,然后给用户推荐一个不属于集合A的导演和演员创作的电影,而用户表示非常满意,这样就实现了一个惊喜度很高的推荐。因此提高推荐惊喜度需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。
7.信任度
如果你有两个朋友,一个人你很信任,一个人经常满嘴跑火车,那么如果你信任的朋友推荐你去某个地方旅游,你很有可能听从他的推荐,但如果是那位满嘴跑火车的朋友推荐你去同样的地方旅游,你很有可能不去。这两个人可以看做两个推荐系统,尽管他们的推荐结果相同,但用户却可能产生不同的反应,这就是因为用户对他们有不同的信任度。
度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。因为本书后面的章节不太涉及如何提高推荐系统信任度的问题,因此这里简单介绍一下如何提高用户对推荐结果的信任度,以及关于信任度的一些研究现状。
图1-27Epinion的信任系统界面
8.实时性
在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。比如,给用户推荐昨天的新闻显然不如给用户推荐今天的新闻。因此,在这些网站中,推荐系统的实时性就显得至关重要。
实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。关于如何将新加入系统的物品推荐给用户,本书将在后面的章节进行讨论,而对于新物品推荐能力,我们可以利用用户推荐列表中有多大比例的物品是当天新加的来评测。
9.健壮性
算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
在实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。
q设计推荐系统时尽量使用代价比较高的用户行为。比如,如果有用户购买行为和用户浏览行为,那么主要应该使用用户购买行为,因为购买需要付费,所以攻击购买行为的代价远远大于攻击浏览行为。
q在使用数据前,进行攻击检测,从而对数据进行清理。
10.商业目标
11.总结
本节提到了很多指标,其中有些指标可以离线计算,有些只能在线获得。但是,离线指标很多,在线指标也很多,那么如何优化离线指标来提高在线指标是推荐系统研究的重要问题。关于这个问题,目前仍然没有什么定论,只是不同系统的研究人员有不同的感性认识。
表1-3对前面提到的指标进行了总结。
表1-3获取各种评测指标的途径
离线实验
问卷调查
在线实验
用户满意度
×
√
○
预测准确度
覆盖率
多样性
新颖性
惊喜度
对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:
最大化预测准确度
使得覆盖率>A
多样性>B
新颖性>C
其中,A、B、C的取值应该视不同的应用而定。
1.3.3评测维度
上一节介绍了很多评测指标,但是在评测系统中还需要考虑评测维度,比如一个推荐算法,虽然整体性能不好,但可能在某种情况下性能比较好,而增加评测维度的目的就是知道一个算法在什么情况下性能最好。这样可以为融合不同推荐算法取得最好的整体性能带来参考。
一般来说,评测维度分为如下3种。
q用户维度主要包括用户的人口统计学信息、活跃度以及是不是新用户等。
q物品维度包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。
如果能够在推荐系统评测报告中包含不同维度下的系统评测指标,就能帮我们全面地了解推荐系统性能,找到一个看上去比较弱的算法的优势,发现一个看上去比较强的算法的缺点。