1. 初识Mahout
本章涵盖以下内容:
读者可能从本书的标题中猜测到,本书是一本讲解如何将mahout应用于业界的工具书。他有三个特性:
一是Mahout是Apache开源的机器学习库。它实现的算法都被归入机器学习或者集体智慧的范畴,但是在这里Mahout主要注重协同过滤/推荐引擎、聚类和分类。
再者,Mahout是可伸缩的。Mahout致力于实现海量数据,单机无法处理情况下的机器学习工具。在目前阶段,这种可伸缩性由java实现,有些部分基于Apache Hadoop这个分布式计算框架实现。
最后,Mahout是java库。它不支持用户接口,预装好的服务器。以及安装等功能。它是一个利于开发者使用的工具框架。
1.1 Mahout的历史
你可能想知道怎么读“Mahout” – 这是一个常用的英式,它与“trout”押韵。这是一个北印度语的单词,指的是驱使大象的人,为了解释这个词,下面介绍一段关于它的历史。
Mahout项 目开始于2008年,作为Apache Lucene的子项目,Apache Lucene项目是大家熟知的开源搜索引擎。Lucene提供了搜索、文本挖掘和信息检索的高级实现。在计算机科学领域,这些概念和机器学习技术近似,像 聚类、分类。所以,Lucene贡献者的一部分机器学习相关工作被剥离进入子项目。不久后,Mahout吸收进“Taste”开源协同过滤的项目。
自2010.4月起,Mahout成为Apache的顶级项目。
Mahout的大量工作不只是传统的实现这些算法,也实现将这些算法,让它们工作在hadoop之上。Hadoop的吉祥物是一头大象,这也解释了Mahout的工程名字。
图1. Mahout以及相关项目
Mahout孵化了相当多的技术和算法,很多都是在开发和实验阶段。在工程的早期阶段,有3个核心主题:协同过滤/推荐引擎、聚类和分类。这并不是Mahout中所有内容,但却是最显著、成熟的主题(在本书写作时),因此,这是本书的范围。
如果你读了以上内容,说明你已经对这3个系列的技术有潜在的兴趣。但是为以防万一,请继续阅读下面的内容。
Tips:
如果你在找一本机器学习的教材,那本书就不适合了。本书没有尝试去全面解释各种算法和展现技术的理论基础和来源。阅读本书可以,但不保证,能够对机器学习技术,类似矩阵、向量等相关概念的熟悉。
如果你正在开发现代智能应用,那本书很适合。这本书提供了一种实践非理论的处理方式,有完整的实例、解决方法指南。这本书在展示Mahout如何展示解决这些问题的时候,证明了一些被有经验的开发者收集的独特见解。
如果你是一个人工智能、机器学习以及相关领域的研究者,也适合用本书。你最大的挑战就是将一个新算法代码实现,Mahout提供了一个丰富的框架,模式集合以及测试、部署大规模新算法的现成模块。这本书是一张快车票,让你的机器学习算法运行在复杂的分布式计算框架上。
如果你正在领导一个产品团队或者初创公司想利用机器学习创造竞争优势,这本书也适合你。通过真实世界的例子,这本书可以启发你很多技术可能有多种实 现方式的想法。它可以帮助你充满斗志的技术团队成员直接跳到很划算的实现能处理大量数据的应用,而在放在以前必须组织大量的技术资源才可以实现。
1.2 Mahout 机器学习主题
虽然理论上Mahout可以实现所有的机器学习技术,但是在生产环境中我们主要还是用在三个角色上面:协同过滤/推荐引擎、聚类和分类。
推荐引擎是目前我们使用的机器学习技术中最容易识别的。你可能已经见过相关的服务或网页,基于历史行为推荐书、电影、文档。他们尝试推论出用户偏好,并标记出用户不知晓的、感兴趣的item:
对于Amazon和示例其他网站,通过这种聪明的交叉销售,推荐系统确实有具体的经济价值,同一家公司的报告指出推荐产品给用户能够带来8-12%的销售增长。
http://www.practicalecommerce.com/articles/1942-10-Questions-on-Product-Recommendations
1.2.2
1.2.2聚类
聚类的使用略少,但是不输其他的用途。顾名思义,聚类技术尝试去将大量的拥有相同相似度的事物聚集到不同的类中。聚类是在海量或者难于理解的数据集里发现层次和顺序,展现兴趣模式,或使得数据集容易被理解。
1.2.3 分类
分类技术用于决定一个事物是不是属于一种类型、类目,或者该事物是不是含有某些属性。同样地,分类无处不在,尽管更多的时候隐于幕后。
这些系统通过评估item的很多实例来学习,以推导出分类规则。这个平常的想法可以找到很多应用:
分类有助于判断一个新进入事物是否匹配先前发现的模式, 也常用于分类行为或者模式。分类也可用来检测可疑的网络活动或欺诈。也可用于根据用户发信息判定表示失望或者满意。
1.5 扩展性
当有海量、高质量的数据输入时,这些技术都能够达到最佳效果。在一些情况下,这些技术不仅要将海量数据作为输入,而且需要很快计算出结果。很快,这些因素使得可扩展性成为一个很大的问题。
依据一些粗略估计,Picasa在3年前可能已经拥有5亿张照片。这意味着每天需要分析数百万图片。分析一张图片并不是一个大问题,尽管需要重复数百万次。但是,学习阶段需要亿万图片都提供相关信息 — 上了规模的计算,使用单机是不行的。
http://blogoscoped.com/archive/2007-03-12-n67.html
依据一个类似的分析,Google News大约每天有350万新文章。尽管数量并不是很大,考虑到这些文章必须和目前其他文章同时聚类,为了及时响应计算时间需要在几分钟内。
Netflix为Netflix大奖发布的子集中包含1亿的打分。这只是适合竞赛的数据,据推测,Netflix实际上拥有的和必须用于创建推荐系统的整个数据远远大于这个这个量级。
http://archive.ics.uci.edu/ml/machine-learning-databases/netflix/
这些技术非常有必要应用于输入数据量很大的情形–因为很大,所有不适用于单机处理,甚至高配置的机器也不可以。所以,任何人实现这些技术都不能回避 可扩展性问题。这就是为什么Mahout将可扩展性作为最高优先级,也是为何本书关注可扩展性问题,别人所没有涉猎的一种方式,用于有效处理海量数据。
复杂的机器学习技术,上规模的应用,直到目前为止,只是一些大的、先进的技术公司在考虑。但是,今天计算能力已经比之前廉价,借助像Hadoop这 样的开源框架更方便。Mahout尝试通过使用hadoop提供优质、开源实现,能够在这个规模上解决问题,解决这类困惑,并且将其送到所有技术组织的手 中。
1.5.1 MapReduce and Hadoop
Mahout的一些部分使用了Apache hadoop工程,hadoop是一个开源的、基于java的MapReduce(http://labs.google.com/papers/mapreduce.html ) 实现。MapReduce是一种分布式计算框架,在Google内部使用。它是一种编程模式,开始听起来感觉很奇怪,或者太简单了以至于很强大。 MapReduce编程模式适用于输入是key-value键值对集合的问题。“map”函数将这些键值对转换为中间键值对。“Reduce”函数通过某 种方式将同一个中间键的值合并到一起并产出结果。实际上,很多问题可以设计成MapReduce问题,或者他们的一个系列。并且这种模式非常易于并行化实 现:所有的处理过程都是独立的,所以可以划分到不同机器上去。这里不再详细叙述MapReduce,hadoop提供的教程(http://hadoop.apache.org/common/docs/current/mapred_tutorial.html )。
Hadoop实现了MapReduce模式,这是一个不小的壮举,甚至让MapReduce像听起来那么简单。它管理输入数据、中间键值对、输 出数据的存储。这些数据可能是海量的,需要在多台计算机上运行,而不只是存储在某一台机器的本地。它管理不同机器之间的划分、数据传输。它负责检测、恢复 单个机器失败的情况。理解了有很多工作在幕后进行能够帮助你准备使用Hadoop的相对复杂性。不只是将它作为类库添加到你的工程中,它包含很多模块,每 一个模块都有若干类库和独立的服务器进程,可能运行在几台机器上。基于Hadoop的操作处理不简单,但投入在可扩展的、分布式实现可以让你在之后有很大 的收获:因为你的数据可能成倍的增长,这种可扩展的性质对你的应用来说是一种面向未来的方式。
稍后,本书将试着剪掉一些复杂性让你很快熟悉hadoop,基于这一点,你可以探索操作完整聚类的重点和细节,调整整个框架。因为这个需要大量 计算能力的复杂框架变的越来越流行,所以一点都不奇怪,云计算已经开始提供hadoop相关的支持。例如Amazon提供的Elastic MapReduce(http://aws.amazon.com/elasticmapreduce/ )是一种管理Hadoop集群、提供计算能力、提供友好的接口的服务,可基于hadoop操作、监控大规模复杂任务。
1.6 安装Mahout
你需要安装很多工具,在你能“可以在家里玩”我们后面章节提供的一些示例代码之前。我们假设你已经熟悉Java开发。
Mahout以及和它相关的框架都是基于Java的,因此是平台无关的,你可以在任何一台安装了JVM的机器上使用他。有时候,我们需要给出许 多不同平台的示例和介绍,特别地,命令行模式在windows脚本和FreeBSD tcsh脚本有一些不同。我们使用命令行和与bash一起的句法,是一种类Unix平台的脚本。这是默认的在大部分Linux、 Mac OS X, 一些Unix变种和Cygwin(一种windows上的类Unix环境)。期望使用windows脚本的用户很可能不方便。尽管如此,本书下面的介绍列 表对你来说应该可以很容易的理解。
1.6.1 Java和IDE
你如果之前做过任何Java开发的工作,你的个人电脑上已经装上Java了。注意Mahout需要使用Java6。如果有所疑虑,打开一个终端并键入java -version。如果报告不是以“1.6”开头,你仍需要安装Java6。
windows和Linux用户能在 http://java.sun.com 找 到Java 6 JVM。苹果公司为Mac OS X 10.5 和 10.6提供Java 6 JVM。如果发现Java 6没有被应用,在“/Applications/Utilities”打开“java perferences”。在这里可以选择Java 6作为默认选项。
大部分人能发现在IDE的帮助下,非常好编辑、编译和运行这些示例;所以强烈推荐你使用IDE。Eclipse(http://www.eclipse.org)是非常常用、免费的一款Java IDE,安装配置Eclipse不在本书的讲解范围内,你可以花点时间去熟悉它。NetBeans (http://netbeans.org/) 也是一款常用开源IDE。 IntelliJ IDEA (http://www.jetbrains.com/idea/index.html)是一款强大的、流行的IDE,它有一个免费的社区版本。
例如,IDEA能从现有的Mavan模型中直接创建一个新工程;在创建新工程的时候,通过指定Mahout源代码的根目录,它将用一种友好的组 织方式自动配置、展示整个工程。例如,丢掉整本书的源代码 core/src/…,然后在IDE里面运行,只需要一次点击,依赖和编译的细节都会自动搞定。这证明了使用IDE比人工编译、运行容易很多。
1.6.2 安装Maven
和其他Apache工程一样,Mahout的构建、发布系统基于Maven(http://maven.apache.org)。Maven是一种命令行模式的管理代码,打包发布,生成文档,发布正式版本的工具。尽管它和Ant工具有一些相同之处,但是不同。Ant是一种灵活的、低级别的脚本语言,Maven是一种高级别的工具,其目标倾向于发布管理。
因为Mahout使用maven,你应该先安装maven。Mac OS X用户会发现maven是默认安装,如果没有,安装苹果开发工具包。在命令行键入mvn –version。如果你能看到版本号,这个版本号最低2.2,那么可以继续进行。否则,你需要安装mavn的本地拷贝。
linux用户可以使用系统带有的包管理系统可以非常快的获取最近的maven版本。另外,标准方式是下载二进制版本,将其解压到/usr /local/maven,然后编辑bash配置文件~/.bashrc,添加一行export PATH=/usr/local/maven/bin:$PATH。保证maven命令行一直有效。
如果你使用IDE,像Eclipse或者IntelliJ,他们已经集成了Maven。参考文档它的文档去了解如何将Maven整合。这将在IDE中使用Mahout变得简单一些,因为IDE可以根据那个Maven配置文件(pim.xml)配置、导入工程。
1.6.3 安装Mahout
Mahout仍在开发过程中,这本书写的时候Mahout是0.4版本。可以在这里下载发布版本和其他介绍http://lucene.apache.org/mahout/releases.html 源文件可以解压到你电脑的任何地方。
因为Mahout的更新很频繁,有规律的进行漏洞修复、功能改进,在实际使用过程中,使用最新发布版本的软件(或者使用svn上的最近的未发布 代码)可能对你的帮助更大,详见http://lucene.apache.org/mahout/developer- resources.html)。未来的发行版本应该向后兼容本书的示例。
一旦你从svn或者发布的归档文件中获取了源代码,在IDE中创建一个Mahout的新工程。这个对不同IDE是过程不同的,需根据如何完成创建的文档细节区别对待。使用IDE的Maven整合用工程根目录下的pom.xml导入Maven工程是很简单的。
一旦配置完成,你可以很容易的创建一个新的源代码文件夹来管理下面章节提到的样例代码。随着工程的配置完成,你应该可以透明的编译和运行代码,不需要再做其他工作。
1.6.4 安装hadoop
本书后面的一些行为,你需要在本机安装hadoop。你不需要一个集群去运行hadoop。配置hadoop不是很麻烦、繁琐。不重复这个过 程,我们直接指导你在hadoop官网行获取hadoop 0.20.2版本的副本,http://hadoop.apache.org/common/releases.html,然后使用“伪分布式”方式安装 hadoop,详见http://hadoop.apache.org/common/docs/current/quickstart.html。
1.7 总结
Mahout是一个年轻的、开源的、可扩展的,Apache的机器学习库,本书是一本使用Mahout中的机器学习算法解决现实问题的使用指 南。尤其是,你可以很快的探索推荐引擎、聚类、分类。如果你是一个机器学习领域的研究者,正在寻找一个实用指导、又或者你是这个领域的开发者,想从其他从 业者处快速学习实用方法,本书是非常适合你的。
这些技术不仅仅是路论:我们已经注意到很多知名的推荐引擎、聚类、分类的样例在现实世界中已经在应用:电子商务、邮件、视频、图片,更涉及大规模的机器学习算法。这些技术已经用来解决现实问题,甚至为企业产生了价值 — 这些现在在Mahout中都是可以触及的。
我们已经注意到很多时候这些技术时常伴随着海量的数据 — 可扩展性是这个领域特别需要持续关注的。我们首先来看一下MapReduce和hadoop,以及他们如何为Mahout提供可扩展支持。
因为这是一本动手实践的、实用书籍,我们马上开始使用Mahout。此刻,你应该已经安装好了Mahout需要的工具并且马上开始行动。因为这本书以实用为主,所以将这些开幕词收起来去见识一下Mahout的代码吧。继续读下去。