mahout in Action2.2-给用户推荐图书(3)-评价推荐系统
推荐系统引擎是一个工具,一种回答问题的手段,“对用户来讲什么是最好的推荐?”,在研究回答的前先研究一下这个问题。一个好的推荐的准确含义是什么?如何知道推荐系统是如何生成推荐的?下面的章节将探索推荐系统的评价,在寻找特定推荐系统时,这将是一个有用的工具。
最好的推荐系统是心理学的范畴,有人在你做事情之前知道确切的知道你还没有看过的、或者没有任何现象说明你喜欢的一些item,以及你对这些item的喜欢程度。
大部分的推荐引擎通过给item评价打分来实现。所以,评价推荐引擎的一种方式是评价它的评估偏好值的质量 —评价评估偏好和实际偏好的匹配度。
2.3.1 训练集和打分
“真实偏好”并不充分,没有人会知道你将来是否会喜欢一些新的item。推荐引擎可以通过设置一部分真实数据作为测试数据。这些测试数据偏好在训练集中并不展示偏好值 —要求推荐系统对这些缺少偏好值的数据作出评估,并比较和实际值的差距。
对于推荐系统产生一系列打分是很简单的。例如,计算评估值和实际值之间的平均距离,在这种方法下,分值越低越好。0.0表示非常好的评估 — 评估值和实际值根本没有差距。
均方根(root-mean-square)也是一种方法,也是分值越低越好。
上面的表中展示了实际偏好度和评估偏好度集合的不同值,以及如何将它们转化为打分。均方根能比较重的处罚距离远的,例如item2,这是基于某种考虑在内的。因为平均距离容易理解,接下来的示例将使用它作为评估方法。
2.3.1 运行RecommenderEvaluator
下面是代码示例:
大部分的操作发生在evaluate()这个方法中。内部,RecommenderEvaluator将数据划分为训练集和测试集,创建一个新的训练DataModel和推荐引擎测试,比价评估结果和实际结果。
注意,没有将Recommender传给方法,这是因为在其内部,将基于创建的训练集的DataModel创建一个Recommender。所以调用者必须提供一个RecommenderBuilder对象用于从DataModel创建Recommender。
2.3.3 评估结果
程序打印出了评估结果:一个表明推荐系统表现如何的打分。在这种情况下你能看到很简单的1.0。尽管评价器内部有很多随机方法去选择测试数据,
结果可能是一致的因为RandomUtils.useTestSeed()的使用,每次选取的随机数都一样。这只用于示例、单元测试来保证重复的结果。不 要在真是数据上用它。
AverageAbsoluteDifferenceRecommenderEvaluator
基于AverageAbsoluteDifferenceRecommenderEvaluator实现,得到的这个值是什么含义?1.0意味着,平均意义上,推荐系统评估偏好和实际偏好的的距离是1.0.
1.0早1-5规模上并不大,但是我们的数据太少。如果数据集被随机划分结果可能不一样,因此训练、测试数据集可能每次跑都不一样。
这种技术可以应用于任何Recommender和DataModel。使用均方根打分的实现类RMSRecommenderEvaluator
替代AverageAbsoluteDifferenceRecommenderEvaluator。
evaluate()的null参数是DataModelBuilder的实例,用于控制训练DataModel是如何从训练数据上建立的。正
常情况下默认就好,如果需要,可以使用特别实现的DataModel。DataModelBuilder用于将DataModel注入评价过程中。
参数1.0表示使用整个数据集的比例。这样用于产生一个很快的、可能精度低一些的评价方式。例如,0.1可能意味着用数据集的10%,忽略其他90%。这对于快速检测到Recommender的细微变化是非常有用的。
2.4 评估准确率和召回率
借用更普遍的看法,我们接收经典的信息检索矩阵去评价推荐系统:准确率和召回率。这些是用于搜索引擎的术语,通过query从众多可能结果中返回最好结果集。
一个搜索引擎不应该在靠前的结果中返回不相关的搜索结果,即使他致力于得到尽可能多的相关结果。”准确率”是指在靠前的结果中相关结果所占的比
例,当然这种相关是某种程度上我们定义的相关。”precision at 10″应该是从前10个结果中判断得到的准确率。“召回率”靠前的结果中相关结果占的比例。看图2.3可以有一些直观的概念。
这些术语也可以应用到推荐系统中:准确率是靠前的推荐中好的推荐所占的比例,召回率是指出现在靠前推荐中好的推荐占整个好的推荐的比例。
2.4.1 运行RecommenderIRStatsEvaluator
Mahout提供了非常简单的方式为推荐系统计算结果。
2.5 评价GroupLen数据集
有了这些工具在手,我们不仅可以考虑速度,还要考虑推荐系统的效率。尽管大量数据集的例子还在几章以后,小数据集上评价性能已成为可能。
2.5.1 抽取推荐系统输入
GroupLens (http://grouplens.org/)是一个研究型的项目。提供了很多不同大小的数据集。每个都是用户对电影打分的真实数据。这是几个大的真实可用数据集之一,更多的将会在本书后续探寻。从GroupLens网站上下载“100K
data set”,http://www.grouplens.org/node/73.解压下载文件,在解压后后,有一个叫ua.base的文件。该件tab分割user IDs,
item IDs, ratings(偏好值)和其他信息。
这个文件能使用吗?Tabs, 不是逗号,分隔字段,在每行结尾还有一个额外的字段。答案是肯定的。该文件可以类似FileDataModel的读取。回到前面列表2.3,试着用 ua.base的路径代替小文件路径。重新跑一遍数据。这时,评估可能需要几分钟,因为数据量是100k。
最后,你应该得到一个大约0.9的值。这不算坏,尽管值几乎分布在1-5区间内,听起来还不错。可能特殊的推荐系统对这种类型的数据来讲是不完全的?
2.5.2 其他推荐系统实验
在这个数据集上测试“slope-one” ,一个简单的算法,在后面的章节中会讲到。很容易替换RecommenderBuilder,使用 org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommeder, 像这样:
运行评价方法。你应该发现它很快,得到一个大约是0.748的值。正朝好的方向发展。
这并不能说明slope-one算法总是很快、很好。在给定数据集上,每一个算法都有自己的特性和属性,这些属性很难去检测出来。例
如,slope-one算法运行时能够很快的计算推荐过程,但是它需要在计算前需要花费很大一部分时间构建内部数据结构。基于用户的推荐引擎,能够在其他 数据集上拥有很快的计算速度和更高的准确度,我们将在第四章探索各种算法的优点。
2.6 总结
在这一章我们介绍了推荐引擎的思想。我们创建了一些简单的Mahout Recommender的输入,运行一个简单计算,然后输出结果。
然后,我们花时间介绍了推荐引擎系统的数据结果的质量评价,因为接下来的章节会频繁用到。这一章包含了评价推荐引擎的准确性,像传统的准确性和召回率。最后,我们尝试去评价GroupLens的真实数据集,观察如何将评价结果用于推荐引擎的性能提升上。
在我们继续详细学推荐引擎之前,需要花一些时间去了解另一个Mahout中推荐系统的基本概念:数据表示。接下来一章会着重讲这一点。
mahout in Action2.2-给用户推荐图书(3)-评价推荐系统的更多相关文章
- mahout in Action2.2-给用户推荐图书(1)-直观分析和代码
This chapter covers What recommenders are, within Mahout A first look at a recommender in action ...
- mahout in Action研读(1)-给用户推荐图书
1.mahout in Action2.2第一个例子 Running a first recommender engine 数据: 第一个数字是用户ID 第二个是书的ID,第三个是用户对书的评 ...
- mahout in Action2.2-给用户推荐图书(2)-分析对用户推荐书目的结果
2.2.3 Analyzing the output 在之前的程序运行结果中我们得到的结果输出是: RecommendedItem [item:104, value:4.257081] 程序要求选择一 ...
- 【Machine Learning】Mahout基于协同过滤(CF)的用户推荐
一.Mahout推荐算法简介 Mahout算法框架自带的推荐器有下面这些: l GenericUserBasedRecommender:基于用户的推荐器,用户数量少时速度快: l GenericI ...
- 推荐算法之用户推荐(UserCF)和物品推荐(ItemCF)对比
一.定义 UserCF:推荐那些和他有共同兴趣爱好的用户喜欢的物品 ItemCF:推荐那些和他之前喜欢的物品类似的物品 根据用户推荐重点是反应和用户兴趣相似的小群体的热点,根据物品推荐着重与用户过去的 ...
- 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等
[推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...
- SparkMLlib—协同过滤推荐算法,电影推荐系统,物品喜好推荐
SparkMLlib-协同过滤推荐算法,电影推荐系统,物品喜好推荐 一.协同过滤 1.1 显示vs隐式反馈 1.2 实例介绍 1.2.1 数据说明 评分数据说明(ratings.data) 用户信息( ...
- mahout in Action2.2-聚类介绍-K-means聚类算法
聚类介绍 本章包含 1 实战操作了解聚类 2.了解相似性概念 3 使用mahout执行一个简单的聚类实例 4.用于聚类的各种不同的距离測算方法 作为人类,我们倾向于与志同道合的人合作-"鸟的 ...
- 推荐图书-《SQL Server 2008商业智能完美解决方案》
内容简介 <SQL Server 2008商业智能完美解决方案>介绍如何使用Microsoft SQL Server 2008开发商业智能(BI)解决方案.<SQL Server 2 ...
随机推荐
- python ORM框架:SqlAlchemy
ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程( ...
- CF773E Blog Post Rating
题意:有一篇博客.一共有n个人,心中有他们期望该博客得到的赞数a[i].当某个时刻该博客的获赞数<a[i],则该人会使得赞数+1,当赞数>a[i],该人会使得赞数-1,当赞数=a[i],不 ...
- JVM之类加载过程
# 类的生命周期 1. 加载 loading2. 验证 verification3. 准备 preparation4. 解析 resoluation5. 初始化 initialization6. 使用 ...
- Oracle闪回查询恢复delete删除数据
Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback q ...
- thinkphp 调试模式
ThinkPHP有专门为开发过程而设置的调试模式,开启调试模式后,会牺牲一定的执行效率,但带来的方便和除错功能非常值得. 直线电机哪家好直线电机生产厂家 我们强烈建议ThinkPHP开发人员在开发阶段 ...
- 欧拉定理+质因子分解+矩阵快速幂——cf1182E
好题! /* gi=c^i * fi gi=gi-1 * gi-2 * gi-3 把g1,g2,g3质因数分解 g1=p1^e11 * p2^e12 * p3^e13 ... pk^e1k g2=p1 ...
- java——万年历
package oop; import java.util.Scanner; public class 万年历 { public static void main(String[] args) { / ...
- Docker系列(七):Docker图形化管理和监控
Docker管理工具之官方三剑客 Docker Machine是什么鬼 从前 现在 你需要登录主机,按照主机及操作系统特有的安装以及配置步骤安装Docker,使其 能运行Docker容器. Docke ...
- ssm下使用分页插件PageHelper进行分页
1. 导入maven依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId ...
- <day003>登录+爬取淘宝商品信息+字典用json存储
任务1:利用cookie可以免去登录的烦恼(验证码) ''' 只需要有登录后的cookie,就可以绕过验证码 登录后的cookie可以通过Selenium用第三方(微博)进行登录,不需要进行淘宝的滑动 ...