RS in Action-one
最近看下推荐系统的入门书籍《推荐系统实践》,的这本书应该是国内推荐系统中最受好评的。虽然有电子版,但是对于比较经典的书籍,还是会买纸质版的。
第一章主要介绍的是什么是RS系统、RS系统的分类、RS系统的应用、RS系统的评测指标等
思维导图
什么是推荐系统
如何买花生米
到附近24小时营业的便利店,查看所有的货架,找到花生米
到家附近的沃尔玛超市,按照分类指示牌,找到花生米
打开淘宝,在输入框中输入花生米三个字,付费之后等待送货上门
上面的例子中用户是有明确地需求:买花生米。如果用户周六想看一部电影,面对电影网站上万部的电影,该如何抉择?用户会手足无措,不知道该看哪部电影
在互联网快速发展的时代,人们从信息匮乏的时代步入了一个信息过载的时代,信息量过大从而导致无法确定选择。
如果有一个自动化的工具,分析用户的历史兴趣,从庞大的电影库中找到几部符合用户习惯和口味的电影供其选择,就完美了,不用自己去抉择。
这个工具就是个性化推荐系统,解决信息过载问题
解决信息过载
解决信息过载的两个方法:
分类目录:雅虎
搜索引擎:谷歌
搜索引擎需要用户提供关键词来寻找信息;推荐系统不需要用户提供明确的需求,通过分析用户的历史行为给用户的历史行为建模,从而主动给他们推荐满足他们需求的信息。
物品长尾
主流商品满足绝大部分用户的需求,而长尾商品往往代表了一小部分用户的个性化需求。推荐系统通过发掘用户的行为,找到用户的个性化需求,从而将长尾商品准确地推荐给需要它的用户。
推荐方式
社会化推荐
基于内容的推荐
基于协同过滤的推荐
推荐算法的本质:通过一定的方式将用户和物品联系起来,而不同的推荐系统利用了不同的推荐方式
RS应用
RS组成
前台的展示页面
后台的日志系统
推荐算法系统
RS应用
电子商务
个性化推荐系统之王:<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="5.245ex" height="3.033ex" viewBox="0 -887.4 2258.3 1306.1" role="img" focusable="false" style="vertical-align: -0.972ex;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">亚</text></g></g></g><g fill="bule" stroke="bule" transform="translate(752,0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">马</text></g></g></g><g fill="bule" stroke="bule" transform="translate(1505,0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">逊</text></g></g></g></g></g></g></svg>,下图是亚马逊的个性化推荐列表
推荐结果的标题、缩略图以及其他内容属性
推荐结果的平均分
推荐理由
亚马逊的三种推荐方式:
基于物品的推荐算法:给用户推荐那些和他们之前喜欢的物品相似的物品
基于好友的个性化推荐:Facebook好友
相关推荐列表:打包销售
电影和视频网站
最为成功的公司:
Netflix
,项亮老师也曾在该公司举办的比赛Netflix Prize中获得很好的名次YouTube
视频网站Hulu
个性化音乐网络电台
Pandora:音乐推荐算法,来自一个叫做音乐基因工程的项目
Last.fm:没有专家标注,而是主要利用用户行为计算歌曲的相似度
豆瓣电台
社交网络
最为成功的是Facebook。最为重要的两个数据:
用户之间的网络关系:人与人之间
用户的偏好信息:个体信息
提供的API接口:Instant Personalization
开发EdgeRank算法对用户的每次会话(分享和评论)进行排序
个性化阅读
Google reader
鲜果网
Zite、Flipboard
基于位置的服务
个性化邮件
第一个个性化邮件推荐系统:Tapestry
。通过分析用户阅读邮件的历史行为和习惯来对新邮件进行排序,提高用户的工作效率。采用的是基于协同过滤筛选信息。
个性化广告
个性化广告投放技术分为3种:
上下文广告
搜索广告
个性化展示广告
RS系统评测
RS系统之3个组成
用户
物品提供者
提供推荐系统的网站
RS系统实验方法
主要是有3种方法来评测推荐系统效果的实验方法:
离线实验
用户调查
在线实验
离线实验
重要的组成步骤:
通过日子系统获得用户行为数据,按照一定的格式生成一个标准的数据集
将数据库按照一定的规则分成训练集和测试集
在训练集上训练用户兴趣模型,在测试集上进行预测
通过事先定义的离线指标来评估效果
离线方法的优缺点:
用户调查
离线指标和实际的商业指标之间存在差距。一般的,高预测准确率不等于高用户满意度。
很多离线时没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得。用户调查的过程中需要注意的2点:
控制成本
保证结果的统计意义
在线实验
在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试。AB测试是常用的在线评估算法的实验方法:
通过一定的规则将用户随机分成几组
不同组的用户采用不同的算法
通过统计不同组的评测指标比较不同的算法效果
优点 | 缺点 |
---|---|
公平地获得不同算法实际在线时的性能指标</br>包含商业上的指标 | 周期长,必须进行长期的实验才能获得可靠的结果 |
做AB测试的时候注意切分流量
评测指标
用户满意度
主要是通过问卷调查的方式来获得
预测准确度
最重要的推荐系统离线评测指标
-
评分预测:预测用户对物品评分的行为,主要是通过两个指标
均方根误差
MASE
-
平均绝对误差
MAE
利用Python实现上面的两个指标:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n203" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> # records列表存放用户评分数据,records[i] = [u, i, rui, pui]
rui:用户u对物品i的实际评分,pui:是算法预测出来的评分
import numpy
import math
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)) # (实际分数 - 算法得到的平均分数)的绝对值除以总长度
</pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n216" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> def PrecisionRecall():
hit = 0
n_recall = 0
n_precision = 0
for user, items in test.items():
rank = Recommand(user,N)
hit += len(rank & items)
n_recall += len(items)
n_precision += N
return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]</pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n229" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> def Gini(p):
j = 1
n = len(p)
G = 0
for item, weight in sorted(p.items(), keys = itemgetter(1)):
G += (2 * j - n -1) * weight
return G / float(n - 1)</pre>用户维度:主要包含用户的人口统计学信息、活跃度以及是不是新用户等
物品维度:属性信息、流行度、平均分等
时间维度:季节,是工作日还是周末等
评测维度分为3种:
评测维度
各种指标的获取途径
给定一个数据集和算法,利用它们生成用户的推荐列表
用常用的攻击方法注入噪声数据
利用算法在注入噪声数据的数据集上再次给用户生成推荐列表
比较前后推荐系统的相似度来评测算法的健壮性;如果没有什么变化,说明算法具有很好的健壮性
健壮性(robust,鲁棒性),是衡量一个推荐系统抗击作弊能力的重要指标,主要是利用模拟攻击:
健壮性
实时地更新推荐列表来满足用户新的行为变化
推荐系统要能够将新加入的物品推荐给用户
推荐系统的实时性包含2个方面:
实时性
增加RS系统的透明度transparency
考虑用户的社交信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释
RS的信任度只能是通过问卷调查的方式来获取,提高信任度的两种方法:
信任度
令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但是用户却觉得满意的推荐。
惊喜度serendipity
评测新颖性的最简单方法就是利用推荐结果的平均流行度,因为越不热门的物品,用户越觉得新颖
新颖性
不同的物品相似度度量函数可以定义不同的多样性
推荐系统整体多样性可以定义为所有用户推荐列表多样性的平均值:
多样性描述的是物品两两之间的不相似性。多样性和相似性是对应的。
多样性
如果G2>G1,则说明推荐算法具有马太效应
G1:从初始用户行为中计算出来的物品流行度的基尼系数
G2:从推荐列表中计算出来的物品流行度的基尼系数
关于马太效应:强者更强,弱者更弱。推荐系统的初衷是消除马太效应。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。
信息熵
基尼系数
两个评测指标:
推荐系统能够推荐出来的物品占总物品集合的比例
覆盖率是描述一个推荐系统对物品长尾的发掘能力,定义为:
覆盖率
利用Python实现召回率和准确率:
网站在提供服务时,一般是给用户一个个性化的推荐列表,这种方式叫做
TopN
推荐。推荐结果召回率和准确率的定义:-
TopN推荐
准确率precision
召回率recall