实验题目:基于 Hadoop 的并行贝叶斯分类算法的设计与实现
一、 算法描述
1.1 算法目的
在数据挖掘和机器学习中有很多分类方法,其中朴素贝叶斯分类是最简单有效的方法之
一, 贝叶斯分类是一种基于统计学的分类方法, 它主要利用概率统计知识进行分类, 一般
用于解决 “在给定训练实例集的情况下, 判定新实例的类别”这类问题。
当随着日益膨胀的数据和分类属性的增加,尤其随着信息系统的普及, 各种数据以每年
80%的速度增长, 因此当面临 TB 级甚至更大的数据量时, 传统的单点运行的方法效率会非
常低, 其资源消耗也会使得现阶段的计算机难以承载, 甚至不能提供有时间限制的服务。本
文根据朴素贝叶斯分类算法特点,通过研究 MapReduce 基本框架和朴素贝叶斯算法, 在
Apache 提供 Hadoop 分布式文件系统(HDFS)和 MapRedce 并行计算框架的基础上,研究朴素
贝叶斯的并行化算法实现。通过实验表明这种并行算法具有较高的效率,满足人们处理海量
数据的需求。
1.2 算法功能及所需参数意义
基于 Hadoop 的并行贝叶斯分类算法具有以下功能:
1.该算法可以用于分类,从训练数据记录中自动推导出对测试数据的趋势,从而对测试
数据判定分类。
2.该算法可以实现并行。
所需参数意义:
1. 参数的意义:指明 hdfs 文件系统根目录路径(位置)。
2. 参数的意义:指明配置文件所在路径(位置)。
3.参数的意义:指明训练数据的路径(位置)。
4.参数的意义:指明测试数据的路径(位置)。
5. 参数的意义:指明结果输出的路径(位置)。
二、 程序模块描述
本算法实现共需要 5 个程序模块,各模块的功能及参数如下:
1.NaiveBayesMain.java 主程序入口
程序的驱动类,启动 mapreduce 作业,并完成数据的读入和输出。
2.NaiveBayesConf.java 用于处理配置文件
读 入 配 置 文 件 并 描 述 分 类 内 容 , 得 到 分 类 的 个 数 ( class_num ) 、 分 类 的 名 称
(class_name)、属性的个数(dimen)、属性的名称(proName)。
3.NaiveBayesTrain.java 用于训练过程的 MapReduce 描述
这个阶段的目标是使用训练数据建立一个分类函数。Map 阶段:将训练数据应用这个
map( )函数,这会生成一组输入,由 reduce( )函数处理。这个 map( )函数只是统计这些属
性以及它们与分类类别之间的关联。
Reduce 阶段:建立这个分类器的归约器,完成对值的计数。
4.NaiveBayesTrainData.java 在测试过程之前,读取训练后数据。
负责多个作业之间的数据共享。
5.NaiveBayesTest.java 用于测试(分类)过程的 MapReduce 描述
mapper( )读入训练数据的处理结果;
map( )读入测试数据,进行计算;
reduce( )输出结果。
三、 算法流程图
算法总流程图:
总流程如图 1:
开始
获取配置文件
获得描述分类内容
训练阶段
获取训练文件
对每个类别计算
获取测试文件
对测试数据计算
测试结果
结束
图 1
测试数据
模块之间的调用关系:
首先 NaiveBayesMain 为主程序入口,第一步,调用 NaiveBayesConf 类写下相应的文件
配置信息并描述分类内容;第二步,执行 NaiveBayesTrain 类,读取相应的配置文件信息和
训练数据内容,并将训练结果输出到 HDFS 文件系统之上;第三部,执行 NaiveBayestest 类,
通过 NaiveBayesTrainData 类读取第二步的训练结果数据,结合配置信息内容和测试样本数
据得出分类结果,将分类结果输出到本地文本之上,算法结束。
四、 实验结果与分析
4.1 测试数据
贝叶斯算法的实现包括训练数据和测试数据两基本的阶段, 数据项的统计主要在训练
数据生成模型阶段,而且通常测试数据只是少数, 下面以不同人群是否买电脑为例来具体介
绍朴素贝叶斯训练结算的并行算法。
ID
Age
income
student Credit-rating
Class:
(buys-computer)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<=30
<=30
30-40
>40
>40
>40
30-40
<=30
<=30
>40
<=30
30-40
30-40
High
High
High
Medium
Low
Low
Low
Medium
Low
Medium
Medium
Medium
High
>40
Medium
No
No
No
No
Yes
Yes
Yes
No
Yes
Yes
Yes
No
Yes
No
Fair
Excellent
Fair
Fair
Fair
Excellent
Excellent
Fair
Fair
Fair
Excellent
Excellent
Fair
Excellent
No
No
Yes
Yes
Yes
No
Yes
No
Yes
Yes
Yes
Yes
Yes
No
描述如下:
说明:将 age 中小于 30 的记为 1,30-40 记为 2,大于 40 的是 3。其余的属性同理。
配置文件
配置文件的用途是描述分类内容。 一共 2 行:
第一行,第一个是分类的个数,这里为买和不买两类因此为 2 分为两类,后面跟着 2
个字符串,空格分隔,每个代表分类名 yes no。
第二行,第一个是类中属性的个数 4,后面跟着 4 个<字符串,整数>的分组
第二行的每个分组中的字符串是属性名,整数是该属性最大值空格分隔。
2 yes no
4 age 3 high 6 student 8 credit 10
训练集
每一行描述一个训练向量,每行第一个为类名,后面接 M 个值,空格分隔,代表此向量
各属性值。
no 1 4 7 9
no 1 4 7 10
yes 2 4 7 9
yes 3 5 7 9
yes 3 6 8 9
no 3 6 8 10
yes 2 6 8 10
no 1 5 7 9
yes 1 6 8 9
yes 3 5 8 9
测试集
每一行描述一个训练向量,每行第一个该变量 ID,后面接 M 个值,空格分隔,代表此
向量各属性值。如
1 1
2 2
5
5
8
7
9
9
4.2 实验结果与分析
实验结果
测试数据 1 1 5 8 9(Age <=30;Income= Medium;Student=No;Credit_rating= Fair)
测试结果如图 2:根据第一条数据测试的结果在输出文件如下:
单机运行时间:
图 2
两台机器并行时间:
分析
1. 测试数据 1 1 5 8 9 结果分析:
X=(Age <=30;Income= Medium;Student=No;Credit_rating= Fair)。
每个类的先验概率可以根据训练样本计算:
P(buys-computer =Yes)=9/14。
P(buys-computer =No)=5/14。
单个条件概率:
P(age=”<=30” |buys-computer=”yes”) =2/9 =0.222
P(income=”medium”|buys-computer=”yes”) =4/9 =0.444
P(student=”yes” |buys-computer=”yes”) =6/9 =0.667
P(credit_rating=”fair”|buys-computer=”yes”) =6/9 =0.667
P(age=”<=30” |buys-computer=”no”) =3/5 =0.6
P(income=”medium”|buys-computer=”no”) =2/5 =0.4
P(student=”yes” |buys-computer=”no”) =1/5 =0.2
P(credit_rating=”fair”|buys-computer=”no”) =2/5 =0.4
样本分类结果:
P(X|buys-computer=”yes”)
=0.222*0.444*0.667*0.667=0.044
P(X|buys-computer=”no”)
=0.6*0.4*0.2*0.4=0.019
P(X|buys-computer=”yes”)P(buys-computer=”yes”)
=0.044*0.643=0.028
P(X|buys-computer=”no”)P(buys-computer=”no”)
=0.019*0.357=0.007
结论:买。
2.该算法将分类结果输出到输出到指定的文件夹。经过多次运行和实验得出,加速比为
1.3。
五 结论
在 处 理 的 数 据 量 足 够 小 时 , 单 点 串 行 算 法 的 效 率 要 比 并 行 算 法 更 高 , 这 是 由 于
MapReduce 本身 job 调度以及数据的 Split 和重组等需要耗费一定的时间. 但是随着数据
量的不断增加, 并行算法的优越性也逐渐显现出来, 不仅很大程度提高了效率, 而且能完
成单机算法不能承载的数据量的运算, 为处理海量数据提供参考。
本文通过对朴素贝叶斯算法和 MapReduce 框架进行分析, 详细介绍了 MapReduce 编程
框架下的朴素贝叶斯的并行算法, 并通过实验表明该并行的朴素贝叶斯算法实现简单, 当
面对海量数据时其效率比传统的单机算法高, 是一种解决海量数据分析处理的有效方法。