Mahout – 快速指南

Mahout – 快速指南


Mahout – 介绍

我们生活在一个信息丰富的时代。信息过载已达到如此高度,以至于有时管理我们的小邮箱变得困难!想象一下,一些流行网站(如 Facebook、Twitter 和 Youtube)每天必须收集和管理的数据量和记录。即使是鲜为人知的网站批量接收大量信息的情况也并不少见。

通常,我们依靠数据挖掘算法来分析大量数据以识别趋势并得出结论。但是,除非计算任务在分布在云上的多台机器上运行,否则没有数据挖掘算法可以有效地处理非常大的数据集并快速提供结果。

我们现在有了新的框架,允许我们将计算任务分解为多个段,并在不同的机器上运行每个段。Mahout就是这样一个数据挖掘框架,它通常与 Hadoop 基础设施在其后台运行,以管理大量数据。

什么是 Apache Mahout?

一个象夫是谁驾驶大象作为它的主人。这个名字来自它与 Apache Hadoop 的密切关联,后者使用大象作为其标志。

Hadoop是 Apache 的一个开源框架,它允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。

Apache Mahout是一个开源项目,主要用于创建可扩展的机器学习算法。它实现了流行的机器学习技术,例如:

  • 推荐
  • 分类
  • 聚类

Apache Mahout 于 2008 年作为 Apache 的 Lucene 的子项目开始。2010 年,Mahout 成为 Apache 的顶级项目。

Mahout的特点

下面列出了 Apache Mahout 的原始特性。

  • Mahout 的算法是在 Hadoop 之上编写的,因此它在分布式环境中运行良好。Mahout 使用 Apache Hadoop 库在云中有效扩展。

  • Mahout 为编码人员提供了一个随时可用的框架,用于在大量数据上执行数据挖掘任务。

  • Mahout 让应用程序能够快速有效地分析大量数据。

  • 包括多个支持 MapReduce 的聚类实现,例如 k-means、模糊 k-means、Canopy、Dirichlet 和 Mean-Shift。

  • 支持分布式朴素贝叶斯和互补朴素贝叶斯分类实现。

  • 带有用于进化编程的分布式适应度函数功能。

  • 包括矩阵和向量库。

Mahout的应用

  • Adobe、Facebook、LinkedIn、Foursquare、Twitter 和 Yahoo 等公司在内部使用 Mahout。

  • Foursquare 可帮助您查找特定区域中可用的地点、食物和娱乐。它使用 Mahout 的推荐引擎。

  • Twitter 使用 Mahout 进行用户兴趣建模。

  • 雅虎!使用 Mahout 进行模式挖掘。

Mahout – 机器学习

Apache Mahout 是一个高度可扩展的机器学习库,使开发人员能够使用优化的算法。Mahout 实现了流行的机器学习技术,例如推荐、分类和聚类。因此,在我们进一步讨论之前,最好先简要介绍一下机器学习。

什么是机器学习?

机器学习是科学的一个分支,它对系统进行编程,使它们能够自动学习并随着经验不断改进。在这里,学习意味着识别和理解输入数据并根据提供的数据做出明智的决策。

根据所有可能的输入来满足所有决策是非常困难的。为了解决这个问题,开发了算法。这些算法根据统计、概率论、逻辑、组合优化、搜索、强化学习和控制理论的原理,从特定数据和过去的经验中构建知识。

开发的算法构成了各种应用的基础,例如:

  • 视觉处理
  • 语言处理
  • 预测(例如,股市趋势)
  • 模式识别
  • 游戏
  • 数据挖掘
  • 专家系统
  • 机器人

机器学习是一个广阔的领域,要涵盖其所有功能已经超出了本教程的范围。有实现机器学习技术几种方法,但是最常用的是监督无监督的学习

监督学习

监督学习处理从可用的训练数据中学习一个函数。监督学习算法分析训练数据并生成推断函数,该函数可用于映射新示例。监督学习的常见例子包括:

  • 将电子邮件归类为垃圾邮件,
  • 根据网页的内容标记网页,以及
  • 语音识别。

有许多监督学习算法,例如神经网络、支持向量机 (SVM) 和朴素贝叶斯分类器。Mahout 实现了朴素贝叶斯分类器。

无监督学习

无监督学习可以理解未标记的数据,而无需任何预定义的训练数据集。无监督学习是分析可用数据和寻找模式和趋势的极其强大的工具。它最常用于将相似的输入聚类到逻辑组中。无监督学习的常见方法包括:

  • k均值
  • 自组织地图,和
  • 层次聚类

推荐

推荐是一种流行的技术,它根据用户信息(如以前的购买、点击和评分)提供密切推荐。

  • 亚马逊使用此技术显示您可能感兴趣的推荐商品列表,并从您过去的操作中提取信息。有一些推荐引擎在 Amazon 背后工作,以捕获用户行为并根据您之前的操作推荐选定的项目。

  • Facebook 使用推荐技术来识别和推荐“你可能认识的人名单”。

推荐

分类

分类,也称为分类,是一种机器学习技术,它使用已知数据来确定应如何将新数据分类到一组现有类别中。分类是监督学习的一种形式。

  • 邮件服务提供商,例如 Yahoo! Gmail 使用此技术来决定是否应将新邮件归类为垃圾邮件。分类算法通过分析用户将某些邮件标记为垃圾邮件的习惯来训练自己。基于此,分类器决定未来的邮件应该存放在您的收件箱中还是垃圾邮件文件夹中。

  • iTunes 应用程序使用分类来准备播放列表。

分类

聚类

聚类用于根据共同特征形成相似数据的组或集群。聚类是无监督学习的一种形式。

  • 搜索引擎,例如 Google 和 Yahoo! 使用聚类技术对具有相似特征的数据进行分组。

  • 新闻组使用聚类技术根据相关主题对各种文章进行分组。

聚类引擎对输入的数据进行完整的遍历,并根据数据的特点,决定将其分组在哪个集群下。看看下面的例子。

聚类

我们的教程库包含各种主题的主题。当我们在 TutorialsPoint 收到新教程时,它会由集群引擎处理,该引擎根据其内容决定应该将其分组到哪里。

Mahout – 环境

本章教你如何设置mahout。Java和Hadoop是mahout的先决条件。下面给出了下载和安装 Java、Hadoop 和 Mahout 的步骤。

预安装设置

在将 Hadoop 安装到 Linux 环境之前,我们需要使用ssh(Secure Shell)设置 Linux 按照下面提到的步骤设置 Linux 环境。

创建用户

建议为 Hadoop 创建一个单独的用户,以将 Hadoop 文件系统与 Unix 文件系统隔离。按照以下步骤创建用户:

  • 使用命令“su”打开root。

  • 使用命令“useradd username”从 root 帐户创建一个用户
  • 现在您可以使用命令“su username”打开一个现有的用户帐户

  • 打开 Linux 终端并键入以下命令以创建用户。

$ su
password:
# useradd hadoop
# passwd hadoop
New passwd:
Retype new passwd

SSH 设置和密钥生成

SSH 设置需要在集群上执行不同的操作,例如启动、停止和分布式守护进程 shell 操作。为了对Hadoop的不同用户进行身份验证,需要为一个Hadoop用户提供公钥/私钥对,并与不同的用户共享。

以下命令用于使用SSH生成键值对,将id_rsa.pub中的公钥复制到authorized_keys,分别为authorized_keys文件提供owner、读写权限。

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

验证 ssh

ssh localhost

安装 Java

Java 是 Hadoop 和 HBase 的主要先决条件。首先,您应该使用“java -version”验证系统中是否存在 Java。Java version 命令的语法如下所示。

$ java -version

它应该产生以下输出。

java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)

如果您的系统中没有安装 Java,请按照下面给出的步骤安装 Java。

第1步

通过访问以下链接下载 java (JDK <最新版本> – X64.tar.gz):
Oracle

然后将jdk-7u71-linux-x64.tar.gz 下载到您的系统上。

第2步

通常,您可以在下载文件夹中找到下载的 Java 文件。验证它并使用以下命令提取jdk-7u71-linux-x64.gz文件。

$ cd Downloads/
$ ls
jdk-7u71-linux-x64.gz
$ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz

第 3 步

要使所有用户都可以使用 Java,您需要将其移动到“/usr/local/”位置。打开root,输入以下命令。

$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit

第四步

要设置PATHJAVA_HOME变量,请将以下命令添加到~/.bashrc 文件中

export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH= $PATH:$JAVA_HOME/bin

现在,如上所述从终端验证java -version命令。

下载 Hadoop

安装Java后,首先需要安装Hadoop。使用“Hadoop version”命令验证Hadoop的存在,如下所示。

hadoop version

它应该产生以下输出:

Hadoop 2.6.0
Compiled by jenkins on 2014-11-13T21:10Z
Compiled with protoc 2.5.0
From source with checksum 18e43357c8f927c0695f1e9522859d6a
This command was run using /home/hadoop/hadoop/share/hadoop/common/hadoopcommon-2.6.0.jar

如果您的系统无法找到 Hadoop,请下载 Hadoop 并将其安装在您的系统上。按照下面给出的命令执行此操作。

使用以下命令从 apache 软件基础下载并解压 hadoop-2.6.0。

$ su
password:
# cd /usr/local
# wget http://mirrors.advancedhosters.com/apache/hadoop/common/hadoop-
2.6.0/hadoop-2.6.0-src.tar.gz
# tar xzf hadoop-2.6.0-src.tar.gz
# mv hadoop-2.6.0/* hadoop/
# exit

安装 Hadoop

以任何所需的模式安装 Hadoop。在这里,我们以伪分布式模式演示 HBase 功能,因此以伪分布式模式安装 Hadoop。

按照下面给出的步骤在您的系统上安装Hadoop 2.4.1

第 1 步:设置 Hadoop

您可以通过将以下命令附加到~/.bashrc文件来设置 Hadoop 环境变量

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME

export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME

现在,将所有更改应用到当前运行的系统中。

$ source ~/.bashrc

第 2 步:Hadoop 配置

您可以在“$HADOOP_HOME/etc/hadoop”位置找到所有 Hadoop 配置文件。需要根据您的 Hadoop 基础架构对这些配置文件进行更改。

$ cd $HADOOP_HOME/etc/hadoop

为了使用 Java 开发 Hadoop 程序,您需要通过将JAVA_HOME替换为 Java 在您系统中的位置来重置hadoop-env.sh文件中的 Java 环境变量

export JAVA_HOME=/usr/local/jdk1.7.0_71

下面给出了您必须编辑以配置 Hadoop 的文件列表。

核心站点.xml

芯-的site.xml文件包含的信息,如用于Hadoop的实例的端口号,分配给文件系统,存储器限制用于存储数据的存储器,和读/写缓冲器的大小。

打开 core-site.xml 并在 <configuration>、</configuration> 标记之间添加以下属性:

<configuration>
   <property>
      <name>fs.default.name</name>
      <value>hdfs://localhost:9000</value>
   </property>
</configuration>

hdfs-site.xm

HDFS-的site.xml文件中包含的信息,如复制数据的价值,名称节点的路径,你的本地文件系统的数据节点的路径。它意味着您要存储 Hadoop 基础架构的地方。

让我们假设以下数据:

dfs.replication (data replication value) = 1

(In the below given path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode

(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode

打开此文件并在此文件的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
	
   <property>
      <name>dfs.name.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
   </property>
	
   <property>
      <name>dfs.data.dir</name>
      <value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
   </property>
</configuration>

注意:在上述文件中,所有属性值都是用户定义的。您可以根据您的 Hadoop 基础架构进行更改。

mapred-site.xml

该文件用于将 yarn 配置到 Hadoop 中。打开 mapred-site.xml 文件并在此文件的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
</configuration>

mapred-site.xml

该文件用于指定我们使用的 MapReduce 框架。默认情况下,Hadoop 包含一个 mapred-site.xml 模板。首先,需要使用以下命令将文件从mapred-site.xml.template复制mapred-site.xml文件。

$ cp mapred-site.xml.template mapred-site.xml

打开mapred-site.xml文件并在此文件的 <configuration>、</configuration> 标记之间添加以下属性。

<configuration>
   <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
   </property>
</configuration>

验证 Hadoop 安装

以下步骤用于验证 Hadoop 安装。

步骤 1:名称节点设置

使用命令“hdfs namenode -format”设置namenode,如下所示:

$ cd ~
$ hdfs namenode -format

预期结果如下:

10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain
1 images with txid >= 0
10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/

第 2 步:验证 Hadoop dfs

以下命令用于启动dfs。此命令启动您的 Hadoop 文件系统。

$ start-dfs.sh

预期输出如下:

10/24/14 21:37:56
Starting namenodes on [localhost]
localhost: starting namenode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-namenode-localhost.out
localhost: starting datanode, logging to /home/hadoop/hadoop-
2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]

第 3 步:验证纱线脚本

以下命令用于启动 yarn 脚本。执行此命令将启动您的纱线恶魔。

$ start-yarn.sh

预期输出如下:

starting yarn daemons
starting resource manager, logging to /home/hadoop/hadoop-2.4.1/logs/yarn-
hadoop-resourcemanager-localhost.out
localhost: starting node manager, logging to /home/hadoop/hadoop-
2.4.1/logs/yarn-hadoop-nodemanager-localhost.out

第 4 步:在浏览器上访问 Hadoop

访问 hadoop 的默认端口号是 50070。使用以下 URL 在浏览器上获取 Hadoop 服务。

http://localhost:50070/

访问 Hadoop

步骤 5:验证集群的所有应用程序

访问集群所有应用的默认端口号是8088。使用以下网址访问该服务。

http://localhost:8088/

集群应用

下载 Mahout

Mahout 可在网站Mahout 中找到从网站提供的链接下载 Mahout。这是网站的截图。

下载 Mahout

第1步

使用以下命令从链接
http://mirror.nexcess.net/apache/mahout/
下载 Apache mahout

[Hadoop@localhost ~]$ wget
http://mirror.nexcess.net/apache/mahout/0.9/mahout-distribution-0.9.tar.gz

然后mahout-distribution-0.9.tar.gz将下载到您的系统中。

第2步

浏览存储mahout-distribution-0.9.tar.gz的文件夹并解压缩下载的 jar 文件,如下所示。

[Hadoop@localhost ~]$ tar zxvf mahout-distribution-0.9.tar.gz

Maven 存储库

下面给出的是使用 Eclipse 构建 Apache Mahout 的 pom.xml。

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-core</artifactId>
   <version>0.9</version>
</dependency>

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-math</artifactId>
   <version>${mahout.version}</version>
</dependency>

<dependency>
   <groupId>org.apache.mahout</groupId>
   <artifactId>mahout-integration</artifactId>
   <version>${mahout.version}</version>
</dependency>

Mahout – 推荐

本章介绍了称为推荐的流行机器学习技术其机制以及如何编写实现 Mahout 推荐的应用程序。

推荐

有没有想过亚马逊是如何列出推荐商品的清单来吸引您注意您可能感兴趣的特定产品的!

假设您想从亚马逊购买“Mahout in Action”一书:

Mahout 在行动

除了选定的产品外,亚马逊还会显示相关推荐项目列表,如下所示。

项目

此类推荐列表是在推荐引擎的帮助下生成的Mahout 提供了几种类型的推荐引擎,例如:

  • 基于用户的推荐,
  • 基于项目的推荐,以及
  • 其他几种算法。

Mahout 推荐引擎

Mahout 有一个非分布式、非基于 Hadoop 的推荐引擎。您应该传递具有用户对项目首选项的文本文档。该引擎的输出将是特定用户对其他项目的估计偏好。

例子

考虑一个销售消费品(如手机、小工具及其配件)的网站。如果我们想在这样的站点中实现 Mahout 的功能,那么我们可以构建一个推荐引擎。该引擎分析用户过去的购买数据,并在此基础上推荐新产品。

Mahout 提供的构建推荐引擎的组件如下:

  • 数据模型
  • 用户相似度
  • 物品相似度
  • 用户邻居
  • 推荐人

从数据存储中,准备好数据模型并将其作为输入传递给推荐引擎。推荐引擎为特定用户生成推荐。下面给出了推荐引擎的架构。

推荐引擎架构

推荐引擎

使用 Mahout 构建推荐器

以下是开发简单推荐系统的步骤:

步骤 1:创建 DataModel 对象

PearsonCorrelationSimilarity的构造函数需要一个数据模型对象,该对象包含一个包含产品的用户、项目和首选项详细信息的文件。这是示例数据模型文件:

1,00,1.0
1,01,2.0
1,02,5.0
1,03,5.0
1,04,5.0

2,00,1.0
2,01,2.0
2,05,5.0
2,06,4.5
2,02,5.0

3,01,2.5
3,02,5.0
3,03,4.0
3,04,3.0

4,00,5.0
4,01,5.0
4,02,5.0
4,03,0.0

所述的DataModel对象需要文件对象,其中包含输入文件的路径。创建DataModel对象,如下所示。

DataModel datamodel = new FileDataModel(new File("input file"));

步骤 2:创建 UserSimilarity 对象

使用PearsonCorrelationSimilarity创建UserSimilarity对象,如下所示:

UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);

Step3:创建 UserNeighborhood 对象

该对象计算用户的“邻居”,如给定用户。有两种类型的街区:

  • NearestNUserNeighborhood – 此类计算由距给定用户最近的n 个用户组成的邻域“最近”由给定的 UserSimilarity 定义。

  • ThresholdUserNeighborhood – 此类计算由与给定用户的相似度达到或超过某个阈值的所有用户组成的邻域。相似性由给定的 UserSimilarity 定义。

这里我们使用ThresholdUserNeighborhood并将偏好限制设置为 3.0。

UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);

Step4:创建推荐对象

创建UserbasedRecomender对象。将上面创建的所有对象传递给其构造函数,如下所示。

UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

Step5:向用户推荐商品

使用Recommender接口的推荐()方法向用户推荐产品此方法需要两个参数。第一个代表我们需要向其发送推荐的用户的用户 ID,第二个代表要发送的推荐数量。这是Recommender ()方法的用法

List<RecommendedItem> recommendations = recommender.recommend(2, 3);

for (RecommendedItem recommendation : recommendations) {
   System.out.println(recommendation);
 }

示例程序

下面给出了一个设置推荐的示例程序。为用户 ID 为 2 的用户准备建议。

import java.io.File;
import java.util.List;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class Recommender {
   public static void main(String args[]){
      try{
         //Creating data model
         DataModel datamodel = new FileDataModel(new File("data")); //data
      
         //Creating UserSimilarity object.
         UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);
      
         //Creating UserNeighbourHHood object.
         UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(3.0, usersimilarity, datamodel);
      
         //Create UserRecomender
         UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);
        
         List<RecommendedItem> recommendations = recommender.recommend(2, 3);
			
         for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
         }
      
      }catch(Exception e){}
      
   }
  }

使用以下命令编译程序:

javac Recommender.java
java Recommender

它应该产生以下输出:

RecommendedItem [item:3, value:4.5]
RecommendedItem [item:4, value:4.0]

Mahout – 聚类

聚类是根据项目之间的相似性将给定集合的元素或项目组织成组的过程。例如,与在线新闻发布相关的应用程序使用聚类对他们的新闻文章进行分组。

聚类的应用

  • 聚类广泛用于许多应用,例如市场研究、模式识别、数据分析和图像处理。

  • 聚类可以帮助营销人员在他们的客户基础上发现不同的群体。他们可以根据购买模式来描述他们的客户群。

  • 在生物学领域,它可用于推导植物和动物分类法,对具有相似功能的基因进行分类并深入了解种群固有的结构。

  • 聚类有助于识别地球观测数据库中类似土地利用的区域。

  • 聚类还有助于对网络上的文档进行分类以进行信息发现。

  • 聚类用于异常检测应用,例如信用卡欺诈检测。

  • 作为一种数据挖掘功能,聚类分析作为一种工具来深入了解数据的分布以观察每个聚类的特征。

使用 Mahout,我们可以对一组给定的数据进行聚类。所需步骤如下:

  • 算法您需要选择合适的聚类算法来对聚类的元素进行分组。

  • 相似性和不相似性您需要制定规则来验证新遇到的元素与组中的元素之间的相似性。

  • 停止条件需要停止条件来定义不需要聚类的点。

聚类过程

要对给定的数据进行聚类,您需要 –

  • 启动 Hadoop 服务器。创建在 Hadoop 文件系统中存储文件所需的目录。(为输入文件、序列文件和集群输出创建目录,以防万一)。

  • 将输入文件从 Unix 文件系统复制到 Hadoop 文件系统。

  • 从输入数据准备序列文件。

  • 运行任何可用的聚类算法。

  • 获取聚类数据。

启动 Hadoop

Mahout 与 Hadoop 一起工作,因此请确保 Hadoop 服务器已启动并正在运行。

$ cd HADOOP_HOME/bin
$ start-all.sh

准备输入文件目录

使用以下命令在 Hadoop 文件系统中创建目录以存储输入文件、序列文件和集群数据:

$ hadoop fs -p mkdir /mahout_data
$ hadoop fs -p mkdir /clustered_data
$ hadoop fs -p mkdir /mahout_seq

您可以使用以下 URL – http://localhost:50070/ 中的 hadoop Web 界面验证该目录是否创建

它为您提供如下所示的输出:

输入文件目录

将输入文件复制到 HDFS

现在,将输入数据文件从 Linux 文件系统复制到 Hadoop 文件系统中的 mahout_data 目录,如下所示。假设您的输入文件是 mydata.txt,它位于 /home/Hadoop/data/ 目录中。

$ hadoop fs -put /home/Hadoop/data/mydata.txt /mahout_data/

准备序列文件

Mahout 为您提供了一个实用程序,可将给定的输入文件转换为序列文件格式。此实用程序需要两个参数。

  • 原始数据所在的输入文件目录。
  • 要存储集群数据的输出文件目录。

下面给出了 mahout seqdirectory实用程序的帮助提示

步骤 1:浏览到 Mahout 主目录。您可以获得该实用程序的帮助,如下所示:

[Hadoop@localhost bin]$ ./mahout seqdirectory --help
Job-Specific Options:
--input (-i) input Path to job input directory.
--output (-o) output The directory pathname for output.
--overwrite (-ow) If present, overwrite the output directory

使用该实用程序使用以下语法生成序列文件:

mahout seqdirectory -i <input file path> -o <output directory>

例子

mahout seqdirectory
-i hdfs://localhost:9000/mahout_seq/
-o hdfs://localhost:9000/clustered_data/

聚类算法

Mahout 支持两种主要的聚类算法,即:

  • 冠层聚类
  • K均值聚类

冠层聚类

Canopy 聚类是 Mahout 用于聚类目的的一种简单而快速的技术。对象将被视为普通空间中的点。该技术通常用作其他聚类技术(例如 k 均值聚类)的初始步骤。您可以使用以下语法运行 Canopy 作业:

mahout canopy -i <input vectors directory>
-o <output directory>
-t1 <threshold value 1>
-t2 <threshold value 2>

Canopy 作业需要一个包含序列文件的输入文件目录和一个用于存储聚类数据的输出目录。

例子

mahout canopy -i hdfs://localhost:9000/mahout_seq/mydata.seq
-o hdfs://localhost:9000/clustered_data
-t1 20
-t2 30 

您将获得在给定输出目录中生成的聚类数据。

K均值聚类

K-means聚类是一种重要的聚类算法。k-means 聚类算法中的 k 表示数据要被划分成的簇数。例如,指定给该算法的k值选择为3,该算法将把数据分成3个簇。

每个对象都将表示为空间中的向量。最初,算法会随机选择 k 个点并将其视为中心,将每个离每个中心最近的对象进行聚类。距离测量有多种算法,用户应选择所需的一种。

创建矢量文件

  • 与 Canopy 算法不同,k-means 算法需要矢量文件作为输入,因此您必须创建矢量文件。

  • 为了从序列文件格式生成矢量文件,Mahout 提供了
    seq2parse实用程序。

下面给出了seq2parse实用程序的一些选项使用这些选项创建矢量文件。

$MAHOUT_HOME/bin/mahout seq2sparse
--analyzerName (-a) analyzerName  The class name of the analyzer
--chunkSize (-chunk) chunkSize    The chunkSize in MegaBytes.
--output (-o) output              The directory pathname for o/p
--input (-i) input                Path to job input directory.

创建向量后,继续 k-means 算法。运行 k-means 作业的语法如下:

mahout kmeans -i <input vectors directory>
-c  <input clusters directory>
-o  <output working directory>
-dm <Distance Measure technique>
-x  <maximum number of iterations>
-k  <number of initial clusters>

K-means 聚类作业需要输入向量目录、输出簇目录、距离度量、要执行的最大迭代次数以及表示输入数据要划分的簇数的整数值。

Mahout – 分类

什么是分类?

分类是一种机器学习技术,它使用已知数据来确定应如何将新数据分类到一组现有类别中。例如,

  • iTunes 应用程序使用分类来准备播放列表。

  • 邮件服务提供商,例如 Yahoo! Gmail 使用此技术来决定是否应将新邮件归类为垃圾邮件。分类算法通过分析用户将某些邮件标记为垃圾邮件的习惯来训练自己。基于此,分类器决定未来的邮件应该存放在您的收件箱中还是垃圾邮件文件夹中。

分类的工作原理

在对给定数据集进行分类时,分类器系统执行以下操作:

  • 最初,使用任何学习算法准备一个新的数据模型。
  • 然后对准备好的数据模型进行测试。
  • 此后,该数据模型用于评估新数据并确定其类别。

分类作品

分类的应用

  • 信用卡欺诈检测– 分类机制用于预测信用卡欺诈。使用先前欺诈的历史信息,分类器可以预测未来哪些交易可能会变成欺诈。

  • 垃圾邮件– 根据以前垃圾邮件的特征,分类器确定是否应将新遇到的电子邮件发送到垃圾邮件文件夹。

朴素贝叶斯分类器

Mahout 使用朴素贝叶斯分类器算法。它使用两种实现:

  • 分布式朴素贝叶斯分类
  • 互补朴素贝叶斯分类

朴素贝叶斯是一种构建分类器的简单技术。它不是用于训练此类分类器的单一算法,而是一系列算法。贝叶斯分类器构建模型来对问题实例进行分类。这些分类是使用可用数据进行的。

朴素贝叶斯的一个优点是它只需要少量的训练数据来估计分类所需的参数。

对于某些类型的概率模型,可以在监督学习设置中非常有效地训练朴素贝叶斯分类器。

尽管假设过于简单,朴素贝叶斯分类器在许多复杂的现实世界情况中都表现得很好。

分类程序

实施分类应遵循以下步骤:

  • 生成示例数据
  • 从数据创建序列文件
  • 将序列文件转换为向量
  • 训练向量
  • 测试向量

步骤 1:生成示例数据

生成或下载要分类的数据。例如,您可以从以下链接获取
20 个新闻组示例数据:http :
//people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz

创建用于存储输入数据的目录。下载示例,如下所示。

$ mkdir classification_example
$ cd classification_example
$tar xzvf 20news-bydate.tar.gz
wget http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz 

步骤 2:创建序列文件

使用seqdirectory实用程序从示例创建序列文件生成序列的语法如下:

mahout seqdirectory -i <input file path> -o <output directory>

步骤 3:将序列文件转换为向量

使用seq2parse实用程序从序列文件创建矢量文件seq2parse实用程序的选项
如下:

$MAHOUT_HOME/bin/mahout seq2sparse
--analyzerName (-a) analyzerName  The class name of the analyzer
--chunkSize (-chunk) chunkSize    The chunkSize in MegaBytes.
--output (-o) output              The directory pathname for o/p
--input (-i) input                Path to job input directory. 

第 4 步:训练向量

使用trainnb实用程序训练生成的向量下面给出了使用trainnb实用程序的选项

mahout trainnb
 -i ${PATH_TO_TFIDF_VECTORS}
 -el
 -o ${PATH_TO_MODEL}/model
 -li ${PATH_TO_MODEL}/labelindex
 -ow
 -c

第 5 步:测试向量

使用testnb实用程序测试向量下面给出了使用testnb实用程序的选项

mahout testnb
 -i ${PATH_TO_TFIDF_TEST_VECTORS}
 -m ${PATH_TO_MODEL}/model
 -l ${PATH_TO_MODEL}/labelindex
 -ow
 -o ${PATH_TO_OUTPUT}
 -c
 -seq

觉得文章有用?

点个广告表达一下你的爱意吧 !😁