测试mahout贝叶斯分类器

一、环境介绍
CentOS 6.5
hadoop:1.2.1
mahout:0.6
eclipse运行在win7上,hadoop和mahout运行在vm中CentOS的hadoop三节点集群上。

二、材料准备
原始材料为一个sport文件夹,该文件夹下面包括basketball等体育分类,在分类文件夹下面是许多个txt文件文章。材料的下载地址为:https://github.com/PengJi/dataguru/tree/master/datafile

三、中文分词
1、将材料上传至HDFS

hadoop fs -put ./sport/ /exp/data/sport

上传后的结果如下:

[grid@master ~]$ hadoop fs -ls /exp/data/sport
Found 10 items
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:20 /exp/data/sport/badminton
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/basketball
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/billiards
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:20 /exp/data/sport/f1
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/football
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:22 /exp/data/sport/golf
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/pingpong
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/swim
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:20 /exp/data/sport/tennis
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:21 /exp/data/sport/volleyball

2、分词
利用庖丁分词程序时,需要配置词典的分词目录,具体配置见:http://zengzhaoshuai.iteye.com/blog/986314。这里我直接配置的windows的PAODING_DIC_HOME 环境变量。
分词的主程序如下:

package mr_text;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import mr_text.inputformat.MyInputFormat;

public class TokenizeDriver {

	public static void main(String[] args) throws Exception {
		
		// set configuration
		Configuration conf = new Configuration();
		conf.setLong("mapreduce.input.fileinputformat.split.maxsize", 4000000);    //max size of Split
		
		Job job = new Job(conf,"Tokenizer");
		job.setJarByClass(TokenizeDriver.class);

	    // specify input format
		job.setInputFormatClass(MyInputFormat.class);
		
        //  specify mapper
		job.setMapperClass(TokenizeMapper.class);
		
		// specify output types
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		// specify input and output DIRECTORIES 
		String inputString = "hdfs://192.168.142.128:9000/exp/data/sport/";
		String outputString = "hdfs://192.168.142.128:9000/exp/result/sport";
		Path inPath = new Path(inputString);
		Path outPath = new Path(outputString);
		try {                                            //  input path
			FileSystem fs = inPath.getFileSystem(conf);
			FileStatus[] stats = fs.listStatus(inPath);
			for(int i=0; i<stats.length; i++)
				FileInputFormat.addInputPath(job, stats[i].getPath());
		} catch (IOException e1) {
			e1.printStackTrace();
			return;
		}			
        FileOutputFormat.setOutputPath(job,outPath);     //  output path

		// delete output directory
		try{
			FileSystem hdfs = outPath.getFileSystem(conf);
			if(hdfs.exists(outPath))//如果目录存在,则删除目录
				hdfs.delete(outPath);
			hdfs.close();
		} catch (Exception e){
			e.printStackTrace();
			return ;
		}
		
		//  run the job
		System.exit(job.waitForCompletion(true) ? 0 : 1);
		
	}

}

完整的程序见github:https://github.com/PengJi/dataguru/tree/master/Participle

注:程序中用到一些配套的jar,也都上传到了:https://github.com/PengJi/dataguru/tree/master/jar

四、pig处理,对分词后的结果按4:1的比例分为训练集和测试集

1、分词后的部分结果为:

[grid@master ~]$ hadoop fs -ls /exp/result/sport
Found 2 items
-rw-r--r--   3 thinkpad supergroup          0 2014-05-08 16:30 /exp/result/sport/_SUCCESS
-rw-r--r--   3 thinkpad supergroup   22410867 2014-05-08 16:30 /exp/result/sport/part-r-00000
[grid@master ~]$ hadoop fs -cat /exp/result/sport/part-r-00000 | head
badminton       图文 尤伯 伯杯 中国 泰国 挺进 决赛 王仪 仪涵 机敏 回球 月 日 中国 中国队 选手 王仪 仪涵 比赛 中回 回球 她最 最终 战胜 泰国 队 选手 手拉 差诺 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 总比 比分 战胜 泰国 队 晋级 决赛 新华 新华社 记者 孟永 永民 民摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 中国 泰国 挺进 决赛 王仪 仪涵 比赛 中 发球 月 日 中国 中国队 选手 王仪 仪涵 比赛 中 发球 她最 最终 战胜 泰国 队 选手 手拉 差诺 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 总比 比分 战胜 泰国 队 晋级 决赛 新华 新华社 记者 孟永 永民 民摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 中国 泰国 挺进 决赛 王仪 仪涵 兴奋 庆祝 月 日 中国 中国队 选手 王仪 仪涵 比赛 中 庆祝 得分 她最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 总比 比分 战胜 泰国 队 晋级 决赛 新华 新华社 记者 孟永 永民 民摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 怒吼 庆祝 月 日 中国 中国队 选手 王仪 仪涵 比赛 中 庆祝 得分 她最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 身体 舒展 月 日 中国 中国队 选手 王仪 仪涵 比赛 中最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 握拳 庆祝 月 日 中国 中国队 选手 王仪 仪涵 比赛 中 庆祝 得分 她最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 汤杯 印尼 胜 英格兰 陶菲 菲克 艰难 救球 体育 羽毛 羽毛球 汤姆 汤姆斯杯 印度 印度尼西 西亚 胜 英格兰 月 日 印度 印度尼西 西亚 队 队员 陶菲 菲克 比赛 中 他最 最终 战胜 英格兰 队 队员 巴克 特 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年 汤姆 汤姆斯杯 羽毛 羽毛球 球赛 小组 赛中 印度 印度尼西 西亚 队 战胜 英格兰 队 新华 新华社 记者 孟永 永民 民摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 涵将 将球 回过 月 日 中国 中国队 选手 王仪 仪涵 比赛 中 庆祝 得分 她最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 奋力 救球 月 日 中国 中国队 选手 王仪 仪涵 比赛 中最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯 
badminton       图文 尤伯 伯杯 决赛 半决赛 中国 泰国 王仪 仪涵 舒展 挥拍 月 日 中国 中国队 选手 王仪 仪涵 比赛 中最 最终 战胜 泰国 队 选手 手拉 差诺 为中 中国 中国队 拿下 下首 分 当日 武汉 体育 中心 中心体 体育 体育馆 举行 年尤 尤伯 伯杯 羽毛 羽毛球 球赛 决赛 半决赛 中 中国 中国队 迎战 泰国 队 新华 新华社 记者 程敏 敏摄 关注 新浪 体育 了解 更多 体坛 资讯

2、把分词后的结果放到pig的主目录下面

#查看pig的主目录
pig
grunt> pwd
hdfs://master:9000/user/grid
#把分词后的结果文件放到pig的主目录下
hadoop fs -cp /exp/result/sport/part-r-00000 /user/grid/sportout
[grid@master ~]$ hadoop fs -ls /user/grid/sportout
Found 4 items
-rw-r--r--   3 grid supergroup   22410867 2014-05-08 16:44 /user/grid/sportout/part-r-00000

3、pig把结果集分为训练街和测试集

processed = load 'sportout/part-r-00000' as (category:chararray, doc:chararray);
test = sample processed 0.2;

jnt = join processed by (category, doc) left outer, test by (category, doc);
filt_test = filter jnt by test::category is null;
train = foreach filt_test generate processed::category as category, processed::doc as doc;

store test into 'sportout/test';
store train into 'sportout/train';

train_ct= foreach(group train by category) generate group, COUNT(train.category);
dump train_ct;
[grid@master ~]$ hadoop fs -ls /user/grid/sportout
Found 4 items
-rw-r--r--   3 grid supergroup   22410867 2014-05-08 16:44 /user/grid/sportout/part-r-00000
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:49 /user/grid/sportout/test
drwxr-xr-x   - grid supergroup          0 2014-05-08 18:01 /user/grid/sportout/test-output
drwxr-xr-x   - grid supergroup          0 2014-05-08 16:50 /user/grid/sportout/train

结果截图:

2pig

分类前的准备工作都做完了!

五、生成bayes分类器

mahout trainclassifier -i hdfs://master:9000/user/grid/sportout/train -o hdfs://master:9000/user/grid/sportout/model-bayes -type bayes -ng 1 -source hdfs

注:这里的目录都加入了hdfs,是为了防止保证输入目录和输出目录的正确,根据实际情况改变。

六、生成cbayes分类器

mahout trainclassifier -i hdfs://master:9000/user/grid/sportout/train -o hdfs://master:9000/user/grid/sportout/model-cbayes -type cbayes -ng 1 -source hdfs

补充:参数说明:

para1

七、测试bayes分类器

mahout testclassifier -d hdfs://master:9000/user/grid/sportout/test -m sportout/model-bayes -type bayes -ng 1 -source hdfs -method mapreduce

测试结果:

14/05/08 17:58:04 INFO bayes.BayesClassifierDriver: =======================================================
Confusion Matrix
-------------------------------------------------------
a       b       c       d       e       f       g       h       i       j       <--Classified as
196     0       0       0       0       2       0       0       0       0        |  198         a     = basketball
0       238     1       0       1       0       0       0       0       0        |  240         b     = billiards
0       0       197     0       0       1       0       0       0       0        |  198         c     = badminton
0       0       0       204     0       0       0       0       0       0        |  204         d     = football
1       1       0       0       201     0       0       0       0       0        |  203         e     = volleyball
0       0       0       0       1       190     0       0       0       0        |  191         f     = swim
0       0       0       1       0       0       218     0       0       0        |  219         g     = pingpong
0       1       0       0       0       0       1       217     1       0        |  220         h     = golf
0       0       0       0       0       0       0       0       213     0        |  213         i     = f1
0       0       1       0       0       0       1       0       0       190      |  192         j     = tennis

八、测试cbayes分类器

mahout testclassifier -d hdfs://master:9000/user/grid/sportout/test -m sportout/model-cbayes -type cbayes -ng 1 -source hdfs -method mapreduce
14/05/08 18:01:34 INFO bayes.BayesClassifierDriver: =======================================================
Confusion Matrix
-------------------------------------------------------
a       b       c       d       e       f       g       h       i       j       <--Classified as
195     0       0       0       1       1       1       0       0       0        |  198         a     = basketball
0       240     0       0       0       0       0       0       0       0        |  240         b     = billiards
0       0       197     0       0       1       0       0       0       0        |  198         c     = badminton
0       0       0       204     0       0       0       0       0       0        |  204         d     = football
0       0       0       0       203     0       0       0       0       0        |  203         e     = volleyball
0       0       0       0       1       190     0       0       0       0        |  191         f     = swim
0       0       0       1       0       0       218     0       0       0        |  219         g     = pingpong
0       0       0       0       0       0       0       220     0       0        |  220         h     = golf
0       0       0       0       0       0       0       0       213     0        |  213         i     = f1
0       0       0       1       0       0       0       0       0       191      |  192         j     = tennis

补充参数说明:

para2

九、比较bayes和cbayes分类器

1、bayes的数据整理如下:

196	0	0	0	0	2	0	0	0	0	198
0	238	1	0	1	0	0	0	0	0	240
0	0	197	0	0	1	0	0	0	0	198
0	0	0	204	0	0	0	0	0	0	204
1	1	0	0	201	0	0	0	0	0	203
0	0	0	0	1	190	0	0	0	0	191
0	0	0	1	0	0	218	0	0	0	219
0	1	0	0	0	0	1	217	1	0	220
0	0	0	0	0	0	0	0	213	0	213
0	0	1	0	0	0	1	0	0	190	192
197	240	199	205	203	193	220	217	214	190	2078
										
						 				
	查全率	查准率								
basketball	98.99%	99.49%								
billiards	99.17%	99.17%								
badminton	99.49%	98.99%								
football	100.00%	99.51%								
volleyball	99.01%	99.01%								
swim	99.48%	98.45%								
pingpong	99.54%	99.09%			 					
golf	98.64%	100.00%								
f1	100.00%	99.53%								
tennis	98.96%	100.00%								
宏平均	99.33%	99.33%								
微平均	99.33%	99.33%								

2、cbayes的数据整理如下:

195	0	0	0	1	1	1	0	0	0	198
0	240	0	0	0	0	0	0	0	0	240
0	0	197	0	0	1	0	0	0	0	198
0	0	0	204	0	0	0	0	0	0	204
0	0	0	0	203	0	0	0	0	0	203
0	0	0	0	1	190	0	0	0	0	191
0	0	0	1	0	0	218	0	0	0	219
0	0	0	0	0	0	0	220	0	0	220
0	0	0	0	0	0	0	0	213	0	213
0	0	0	1	0	0	0	0	0	191	192
195	240	197	206	205	192	219	220	213	191	2078
										
										
										
	查全率	查准率								
basketball	98.48%	100.00%								
billiard	100.00%	100.00%								
badminton	99.49%	100.00%								
football	100.00%	99.03%								
volleyball	100.00%	99.02%								
swim	99.48%	98.96%								
pingpong	99.54%	99.54%								
golf	100.00%	100.00%								
f1	100.00%	100.00%								
tennis	99.48%	100.00%								
宏平均	99.65%	99.66%								
微平均	99.66%	99.66%								

从以上的比较可知cbayes的查全率和查准率整体上比bayes的高

补充关于查准率和查全率
test

test2

注:有些说明出自dataguru课程(http://www.dataguru.cn/