基本信息
- 原书名:Apache Mahout Cookbook

【插图】

编辑推荐
内容全面而深入,既展示Mahout的强大功能,又全方位讲解利用Mahout进行大数据分类、聚类和预测分析的各种技术细节、方法和最佳实践
实战性强,包含丰富案例,涉及Mahout开发环境、序列文件使用方式、整合Mahout和外部资源、实现朴素贝叶斯分类器、股市预测、顶棚聚类、频谱预测、K-均值聚类等
内容简介
计算机书籍
《Mahout实践指南》是软件开发专家数十年行业经验的结晶,深入浅出地论述如何使用Mahout进行数据分类、聚类和预测,涉及Mahout开发环境、序列文件使用方式、整合Mahout和外部资源、实现朴素贝叶斯分类器、股市预测、顶棚聚类、频谱预测、K-均值聚类等。《Mahout实践指南》是面向编程的,不涉及深奥的理论,简单、易学,可以帮助读者快速掌握Mahout的基本用法,实用性强。
全书共分10章。第1章介绍如何在单台机器上创建完整的Mahout开发环境。第2章重点介绍序列文件的使用方式。第3章详细介绍如何使用命令行工具和代码从RDBMS中读写数据。第4章详细讨论朴素贝叶斯分类器和互补朴素贝叶斯分类器的使用方法。第5章介绍如何使用logistic回归和随机森林预测股市。第6章描述Mahout框架中最常用的算法,包括大数据的聚类分析和分类。第7章描述频谱聚类的使用方式。第8章描述使用K-均值(包括序列方式和MapReduce方式)对主题中的文本文档进行分类。第9章介绍频繁模式挖掘算法的使用方式。第10章描述使用遗传算法解决旅行商问题和提取规则。
作译者
目录
译者序
前言
关于评阅者
致谢
第1章 Mahout入门 / 1
秘笈1 安装Java和Hadoop / 1
秘笈2 设置Maven和NetBeans开发环境 / 6
秘笈3 编写一个基本的推荐系统 / 9
第2章 使用序列文件——什么时候和为什么 / 19
秘笈4 从命令行创建序列文件 / 20
秘笈5 编写代码创建序列文件 / 23
秘笈6 编码实现读取序列文件 / 28
第3章 将Mahout和外部资源整合 / 33
秘笈7 导入外部资源到HDFS / 34
秘笈8 将数据从HDFS导入到RDBMS / 43
秘笈9 创建一个Sqoop作业来处理RDBMS / 45
秘笈10 使用Sqoop API导入数据 / 47
第4章 实现朴素贝叶斯分类器 / 49
秘笈11 使用Mahout文本分类器演示基本的使用样例 / 50
译者序
并行计算当前的热门方向是GPU计算,将传统上同时运行在多台机器上的任务交给单台机器上的图形处理器处理,这使得并行计算的费用大大降低。Shane Cook撰写的《CUDA并行程序设计:GPU编程指南》是这方面的经典参考书。GPU的技巧已经大规模地应用到机器学习领域以改进传统的算法,两个有代表性的GPU机器学习库是Theano和GPUMLib。
分布式方面最有代表性的工作是Apache Hadoop。它支持在大型集群中运行应用程序。最为重要的是,该架构是Java语言编写的开源软件框架,它实现了Google的Map/Reduce框架,可供商业或科研免费使用。Mahout库就是在这样的背景下产生的。它建立在Hadoop的基础上,主要用于处理大规模的机器学习问题,其中核心算法有聚类、分类、协同过滤。同样,该库是开源免费的,且支持商业级别的机器学习方面的应用。
针对从事机器学习应用方面的开发人员以及机器学习理论研究方面的科研人员使用Mahout,本书提供了非常有价值的参考。作者在将Mahout用于商业领域方面经验丰富,本书旨在降低Mahout初学者的入门门槛。本书特点如下:
通过分析大量的实例,展示了如何更好地使用Mahout算法,主要有分类算法、聚类算法以及遗传算法。
由浅入深讲解实例,帮助读者逐步掌握Mahout的应用方法。
图文并茂,让读者及时了解每一步操作之后的效果,帮助读者更好地检验学习进度。
写作方式独特,通过编码的方式帮助读者了解代码的目标及含义,避开代码背后复杂的机理。
避开烦琐的数学表述,通过具体而形象的描述,让读者直观了解机器学习技术。
值得一提的是,Mahout主要用在Linux平台上,但是对于使用Windows系统的大部分读者来说,这并不是一个障碍。本书通过详尽的描述,让不熟悉Linux的读者也可以学到Linux的基本使用技巧。实际上,本书中所有的代码都是在Windows系统下编写的,作者通过在Windows上安装Virtual Box软件来使用Linux平台,这种方式为那些Windows系统下的开发者使用Mahout库提供了一个良好的建议。
为了方便读者正确、迅速地理解本书,译者对本书的一些错误进行了修正,并在某些表述不太清楚的地方添加了注释,希望对读者理解本书内容有所帮助。然而,不得不承认,尽管译者从事的研究方向是机器学习,但由于水平有限,本书难免存在错误。欢迎读者及时向出版社指出,便于再版时予以更正。
特别感谢机械工业出版社编辑为本书出版所付出的辛勤劳动。
最后,感谢夫人靖莹以及耿光刚博士在文字校稿方面给予的支持和帮助。
靳小波
前言
为了帮助你了解究竟发生了什么,我们不得不提到在2012通过Qmee做的一项研究:在60秒里展示互联网上经常发生的事情。结果参考http://blog.qmee.com/qmee-online-in-60-seconds/,它告诉我们在过去的每一秒里Twitter收到278 000条推文(tweet),Facebook收到41 000条post,YouTube已上传了时长达72小时的视频。这些算是很大的网站了,但是即使是具有国家或国际背景的网站,因收集网站的日志而拥有上百万的记录也是很平常的。
为管理如此海量的信息,需要编写新框架来实现不同机器之间的计算任务共享。Hadoop是Apache编写的算法解决方案,它可以将计算任务分配到不同的硬件架构上运行。
当你需要分析上亿条数据记录时,在大多数情况下,你的目的是通过信息提取来发现数据之间的新关系。传统上,数据挖掘算法就是为这个目的发展起来的。然而,当处理非常大的数据集时,无法在一个合理的时间里实现数据挖掘任务。Mahout是一个数据挖掘框架,可以和Hadoop一起应用数据挖掘算法处理大规模数据集上的数据挖掘任务,它使用了封装在Hadoop里面的MapReduce例程。所以,Mahout通过Hadoop架构的这个底层接口为编程人员进行数据挖掘任务提供了一个易用的框架。
本书将通过一些实例向你展示怎么使用Mahout进行数据挖掘,以及数据挖掘的不同方法。最关键的是,使用一种简洁通俗的方法向你展示使用Mahout对数据进行分类、聚类和预测的方式。本书是面向编程的,所以我们并不想在步骤中过多地引入其理论背景,但是我们会给有能力的读者一些参考文献以进行更深一步研究。当写这本书时,我们面临的主要挑战是:
根据我的经验,Mahout有着非常高的学习曲线,主要原因是算法使用了MapReduce方法,该方法不同于序列方法。
数据挖掘算法本身就不太容易理解,它们在某些情况下需要一些特殊的技能,而开发人员不一定具备这样的技能。
于是我们尽力使用一种面向源码的方式让读者能抓住每一段代码的含义和目的,但是又不需要深入理解其背后的实现机制。
这种方法的效果由你来判断,而且我们希望你在阅读的时候能够发现一些乐趣,就像我们在写作的时候获得的一样。
本书的组织
第1章描述如何在单台机器上创建一个完整的开发环境。通过编写一个推荐算法使得数据挖掘操作的所有代码片段均以Hadoop的方式呈现(包括引入的JAR库等),这非常清晰地展现在没有任何背景的读者面前。
第2章介绍序列文件。当使用Hadoop和Mahout时,序列文件是个比较关键的概念。在多数情况下,Mahout并不直接操作要使用的数据集,所以在没有编码算法之前,我们需要描述如何对待这些特别的文件。
第3章详细介绍使用命令行工具和代码从RDBMS中读写数据。
第4章详细介绍如何使用朴素贝叶斯分类器分类文本文档。全面地描述如何将文档单词转化为包括单词出现次数的向量,并展示如何使用Java编写朴素贝叶斯分类器和互补朴素贝叶斯分类器。
第5章主要涉及两个算法:logistic回归和随机森林(Random Forests)。它们展示了通过分析某些普通数据就可能预测其未来值。
第6章描述Mahout框架中最常用的算法,其中包括大数据的聚类分析和分类任务。在这一章,通过一些实例介绍使用顶棚聚类围绕聚类中心聚合数据向量。
第7章继续介绍Mahout中的聚类分析算法。该章描述了频谱聚类的使用方式,它在对图形式的链接信息进行分类时是非常有效的。
第8章描述了使用K-均值聚类(包括序列方式和MapReduce方式)对主题中的文本文档进行分类。我们将通过命令行方式和Java编码的方式解释如何使用该算法。
第9章介绍一个比较老的,称为频繁模式挖掘(Frequent Pattern Mining)的算法。该算法通过过去顾客的购买情况来预测哪些东西应该放在一块出售。Latent Dirichlet算法将用于文本分类。
第10章描述了如何在Mahout中使用遗传算法解决旅行商(Travelling Salesman)问题和提取规则。我们将会看到如何使用Mahout的不同版本来使用这些算法。
书摘
Mahout是一个机器学习Java类库的集合,用于完成各种各样的任务,如分类、评价性的聚类和模式挖掘等。
当前存在很多比较好的框架,它们对用户友好并且配置了更多的算法来完成这些任务。比如,R社区比从前更加庞大,而在Java世界里,可用的RapidMiner和Weka库已经存在了好多年。
为什么我们要用Mahout来代替前面提到的那些框架呢?真正原因在于前面提到的那些框架并不是为大规模数据集设计的。当我们提到大规模数据集中所谓的数据集时,无论是哪种形式,它的记录都是上亿级别的。
事实上Mahout的威力在于这些算法可以用于Hadoop环境。Hadoop是一个允许算法并行运行在多个机器上(称为节点)的一般框架,它使用了分布式计算的框架。
Hadoop背后的核心理念不是使用单个的主节点来处理大数据的计算和存储任务,而是使用分治法将整个任务分成很多子任务。当所有的单个任务完成后(即每个任务完成计算并生成一个输出),Hadoop将负责管理和重组所有的单个子集。在这种情况下,即使每个阶段并不是很强大,通过将繁重的计算任务分给许多单个计算节点机器来得到最后的结果仍然是可行的。这一理念和第一个分布式计算的例子(SETI@Home和Great Internet Mersenne Prime Search(GIMPS))非常接近,不同的是,我们实现的是分布式的机器学习算法。在本书中,我们将在各种各样实例的基础上以一种更好的方式来涵盖细节问题。
秘笈1安装Java和Hadoop
本章的第一部分主要介绍在单台机器上设置工作环境,帮助读者以一种最容易和最快速的方式来编程。
就像之前说的那样,我们关注引导编程人员在开发机器上快速测试他们的Mahout。我们不会过多地说明在一个产品式的Hadoop聚类上如何配置代码,因为那已经超出了本书的范围,需要更为详细和复杂的方法和配置。
我们仅仅需要让读者知道所有的工作都使用单个节点聚类,所以即使在不同的方法中,我们描述算法运行在多个聚类机器上所需要的参数时也是如此,在本书例子中,内部计算经常被迫使用单个聚类。对于如何配置Hadoop聚类,请读者参考另一本书《Hadoop Operations and Cluster Management Cookbook》(Packt出版,Shumin Guo著)。
使用cygwin环境,在Windows系统上也可以测试Hadoop和Mahout代码,但是我们并没有包含这些内容,请读者参考Apache的相关wiki:http://hadoop.apache.org。
考虑到Hadoop可以运行在云环境中,以测试为目的,有能力的读者可以使用Amazon EC2来设置单节点的Hadoop聚类。相关的配置资料可以在Amazon EC2 wiki上找到。
当我们写本书的时候,微软发布了一个能运行在Azure Cloud上的Hadoop实现,但是我们没有测试它。你可以在网络上找到相关资料。
从Cloudera网站下载Hadoop(一个完全的安装版Hadoop系统的64位Virtual Box)也是可行的。
不得不说,从头开始配置一个极小的系统将极大地帮助你理解Hadoop和Mahout是如何交互的。
有时,虽然不配置Hadoop,Mahout也可以用来测试代码。然而,事实上,因为只有利用Hadoop的性能和可扩展性Mahout才能发挥优势,我们将很少介绍这种方法。
因此,我们将Hadoop和Mahout安装到Ubuntu系统的32位机器上。为了创建快速的可复制的开发环境,我们将使用虚拟机方式。
我们更喜欢使用VirtualBox机器模拟器(开源软件)。如果对VirtualBox不熟悉,请参考书籍《VirtualBox 3.1: Beginner抯 Guide》(Packt出版)。
在本书中,因为我们使用了Windows 7专业版上的VirtualBox虚拟机并想从客户机上获得一个快速的应答,我们决定使用Ubuntu桌面版(10.04, 32位)。考虑到主要使用基于Debian的命令,因此在基于Debian的分布上复制Ubuntu是可行的。
Hadoop和Mahout不应该在根用户下运行,所以我们创建了一个叫hadoop-mahout的用户来安装和做每件事情。