Mahout 分类算法
实验简介
本次课程学习了Mahout 的 Bayes 分类算法。
一、实验环境说明
1. 环境登录
无需密码自动登录,系统用户名 shiyanlou
2. 环境介绍
本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:
- XfceTerminal: Linux 命令行终端,打开后会进入 Bash 环境,可以使用 Linux 命令;
- Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的 HTML/JS 页面即可;
- GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器。
- Eclipse:Eclipse 是著名的跨平台的自由集成开发环境(IDE)。主要用来 Java 语言开发,但是目前亦有人通过插件使其作为 C++ 和 Python 等语言的开发工具。
3. 环境使用
使用 GVim 编辑器输入实验所需的代码,然后使用 XfceTerminal 命令行环境进行编译运行,查看运行结果,运行后可以截图并分享自己的实验成果,实验楼提供的截图是后台截图,无法作弊,可以真实有效证明您已经完成了实验。
实验记录页面可以在“我的课程”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
二、分类算法
为了让大家明白什么是聚类算法,这里我们同样引用一个例子。
假设在一个几岁的小孩面前摆放了一些水果,并告诉他 红色的圆的是苹果,而橘黄色的圆的是橘子。然后把这些水果拿开,再重新拿一个红色的圆的苹果问他是不是苹果。小孩回答是,这就是一个简单的分类算法过程。
在这个过程中,主要涉及两个阶段,第一是建立模型阶段,即告诉小孩哪种特征的是苹果这一个过程;第二就是使用模型的阶段,即询问小孩新的水果是不是苹果,小孩回答是,这一过程。
三、Bayes 分类算法
Bayes(贝叶斯) 分类算法是 Mahout 中的一种分类算法。Bayes 分类算法是一种基于统计的分类算法,用来预测某个样本属于某个分类的概率有多大。Bayes 分类算法是基于 Bayes 定理的分类算法。
Bayes 分类算法有很多变种。本次实验主要介绍 朴素 Bayes 分类算法。所为朴素,就是假设各个属性之间是相互独立的,它的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率哪个最大,就认为此待分类项属于哪个类别。
当针对大数据的应用时,Bayes 分类算法具有方法简单、准确率高和速度快的优势。但事实上,Bayes 分类算法也有它的缺点,就是 Bayes 定理假设一个属性值对给定类的影响独立于其他属性的值,而这个假设在实际情况中几乎是不成立的。因此其分类准确率可能会下降。朴素 Bayes 分类算法是一种监督学习算法,使用朴素Bayes 分类算法对文本进行分类,主要有两种模型:多项式模型(Multinomial Model)和伯努利模型(Bernoulli Model)。Mahout 中的朴素 Bayes 分类算法使用的是多项式模型,如果有兴趣深入研究,你可以前往 这里 查看具体的论文(英文稿)。
下面照例举个例子,来阐述 Bayes 分类算法。给定一组分类号的文本训练数据,如下图所示:
给定一个新的文档样本:“中国,中国,中国,东京,日本”,对该样本进行分类。该文本属性向量可以表示为 d=(中国,中国,中国,东京,日本),类别集合 Y={是,否}. 类别 “是”
下共有8个单词,“否”
类别下共有3个单词。训练样本单词总数为 8+3=11. 因此 P(是)=8/11,P(否)=3/11.
类条件概率计算如下:
- P(中国|是)=(5+1)/(8+6)=6/14=3/7
- P(日本|是)=P(东京|是)=(0+1)/(8+6)=1/14
- P(中国|否)=(1+1)/(3+6)=2/9
- P(日本|否)=P(东京|否)=(1+1)/(3+6)=2/9
其中:
- 分母中的8,表示
“是”
类别下训练样本的单词总数;- 6 表示训练样本有 “中国,北京,上海,澳门东京,日本” 共6个单词;
- 3 表示
“否”
类别下共有3个单词。
有了以上的类条件概率计算结果,就可以开始计算后验概率了:
- P(是|d)=(3/7)3×1/14×1/14×1/14×8/11=108/184877=0.00058417
- P(否|d)=(2/9)3×2/9×2/9×3/11=32/216513=0.00014780
最后我们就可以得出结论:这个文档属于类别 中国
,这就是 Mahout 中实现的 Bayes 分类算法的主要思想。
四、Bayes 分类算法应用实例
本次实验,依然通过一组具体的实例来给大家演示。
(1)在 /usr/local/hadoop-1.2.1
下新建一个测试目录,下载测试数据 20news-bydate.tar.gz 并解压(这个测试数据包含多个新闻组文档,这些文档内又分为了多个新闻组):
$ sudo mkdir bayes
$ cd bayes
$ sudo wget http://labfile.oss.aliyuncs.com/20news-bydate.tar.gz
$ sudo tar zxvf 20news-bydate.tar.gz
解压之后,它已经为我们划分好了训练集(Train)和测试集(Test)。我们只需要转换数据格式。
(2)使用 mahout seqdirectory 命令将目录下的所有样本文件转换成 <Text, Text>
格式的 SequenceFile. Mahout 会自动执行 Hadoop Map-Reduce 来进行处理,输出结果放到 20news-seq 目录中:
$ source /etc/profile
$ mahout seqdirectory -i 20news-bydate-train -o 20news-bydate-train-seq
$ mahout seqdirectory -i 20news-bydate-test -o 20news-bydate-test-seq
图示:正在执行 Map-Reduce 作业
(3)再使用 mahout seq2sparse 命令将生成的 SequenceFile 文件转换成 <Text, VectorWritable>
格式的向量文件,同样会执行 Hadoop Map-Reduce 来进行处理,输出结果放到 20news-vectors 目录中(命令较为复杂,执行前请确认是否输入正确):
$ mahout seq2sparse -i 20news-bydate-train-seq -o 20news-bydate-train-vectors -lnorm -nv -wt tfidf
$ mahout seq2sparse -i 20news-bydate-test-seq -o 20news-bydate-test-vectors -lnorm -nv -wt tfidf
图示:向量化执行完毕后部分输出内容
(4)数据格式转换完成后,我们就可以开始训练数据集了。
$ mahout trainnb -i 20news-bydate-train-vectors/tfidf-vectors -el -o model -li labelindex -ow
图示:训练完成后部分输出内容
(5)训练完成后,开始测试:
$ mahout testnb -i 20news-bydate-test-vectors/tfidf-vectors -m model -l labelindex -ow -o test-relust -c
图示:上面两张图为测试结果信息
(6)这里解释一下上面那个混合矩阵输出信息的意思:
上述 a
到 t
分别是代表了有20个类别,你可以在 train 或者 test 文件夹下看到这20个类别。列中的数据表示每个类别中被分配到的字节个数,classified 表示应该被分配到的总数。例如:
它表示 alt.atheis 本来是属于 a,有475篇文档被划为了a类,这个是正确的数据;其它的则依次表示划到 b~t 类中的数目。我们可以看到其准确率为 475/480=0.9895833··· , 可见其准确率是很高的。
同样,从 Summary 和 Statistics 统计信息,我们也可以看到结果的准确率和可靠性都是很高的。
作业
大家不妨在伪分布模式下的 Hadoop 和 Mahout 中, 再尝试运行 Bayes 分类算法实例。
Mahout 分类算法的更多相关文章
- mahout分类
分类看起来比聚类和推荐麻烦多了 分类算法与聚类和推荐算法的不同:必须是有明确结果的,必须是有监督的,主要用于预测和检测 Mahout的优势 mahout的分类算法对资源的要求不会快于训练数据和测试数据 ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
- Mahout推荐算法API详解
转载自:http://blog.fens.me/mahout-recommendation-api/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, ...
- Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- [分类算法] :SVM支持向量机
Support vector machines 支持向量机,简称SVM 分类算法的目的是学会一个分类函数或者分类模型(分类器),能够把数据库中的数据项映射给定类别中的某一个,从而可以预测未知类别. S ...
- K近邻分类算法实现 in Python
K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...
- mahout分类学习和遇到的问题总结
这段时间学习Mahout有喜有悲.在这里首先感谢樊哲老师的指导.以下列出关于这次Mahout分类的学习和遇到的问题,还请大家多多提出建议:(全部文件操作都使用是在hdfs上边进行的). (本人用的环境 ...
- Mahout推荐算法基础
转载自(http://www.geek521.com/?p=1423) Mahout推荐算法分为以下几大类 GenericUserBasedRecommender 算法: 1.基于用户的相似度 2.相 ...
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification) 0.写在前面的话 我个人一直很喜欢算法一类的东西,在我看来算法是人类智慧的精华,其中蕴含着无与伦比 ...
随机推荐
- 分享一个Unity3D小作品,源码地址已公布在文章开头!
Update:回复量有点大,楼主工作期间可能无暇向童鞋们发送源码,为了不让童鞋们久等,现公布源码地址. 链接: http://pan.baidu.com/s/1sjpYW4d 密码: zhp9 请注 ...
- ASP.NET Web API 2中的属性路由(Attribute Routing)
如何启用属性路由并描述属性路由的各种选项? Why Attribute Routing? Web API的第一个版本使用基于约定的路由.在这种类型的路由中,您可以定义一个或多个路由模板,这些模板基本上 ...
- Asp.Net WebApi核心对象解析
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- 160712、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 查看linux目录剩余空间大小
df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem S ...
- grep、egrep命令用法
何谓正则表达式 正则表达式,又称正规表示法.常规表示法(Regular Expression,在代码中常简写为regex.regexp或RE),是一类字符所书写的模式,其中许多字符不表示其字面意义,而 ...
- JS去遍历Table的所有单元格中的内容
用JS去遍历Table的所有单元格中的内容,可以用如下JS代码实现 function GetInfoFromTable(tableid) { var tableInfo = ""; ...
- python系列十七:Python3 标准库概览
#!/usr/bin/python #-*-coding:gbk-*- #Python3 标准库概览'''操作系统接口os模块提供了不少与操作系统相关联的函数.建议使用 "import os ...
- selenium入门基础知识
内容转载自:http://blog.csdn.net/huangbowen521/article/details/7816538 1.selenium介绍: Selenium是一个浏览器自动化操作框架 ...
- 初识Locust---认识
性 能测试工具: 基于Python的性能测试工具-locust 现在性能测试方面有很多测试工具,比如我们熟悉的loadrunner.jmeter.ab等,用过的也就是这几种,如果是学过这些工具的可能对 ...