一、问题定义
问题:Naive Bayes算法(朴素贝叶斯算法)实质上是贝叶斯定理 + 条件独立假设。贝叶斯定理就是我们数理统计课上学的定理, P(A|B) = P(B|A) P(A) / P(B);而条件独立假设指的是:解决分类问题时,会选取很多数据特征,为了降低计算复杂度,那么假设数据各个维度的特征相互独立。而算法的计算过程也可以用一句话概括:把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”的概率。朴素贝叶斯的主要优点有:1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。2)对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
输入输出:实验时主要使用了UCI数据集上的‘股票涨跌’、‘质量评估’、‘健康评估’三个数据集,并将每个数据集中的有用数据列取出放在文件中使用。
所用方法:使用Java语言实现了Naive Bayes算法,找到了三个合适的UCI数据集,并对数据集进行了处理,放入文件中读入程序;实验时采用5-fold的方法划分训练集和测试集,在训练的模型不使用测试集的情况下对数据进行训练,模型训练好之后在测试集上计算整体准确度。最后使用sklearn软件的对应算法在相同数据集上的实验结果与本次实验的实验结果进行对比,验证算法的准确性。
二、算法描述
Naive Bayes算法原理
朴素贝叶斯方法,是指
朴素:特征条件独立,贝叶斯:基于贝叶斯定理。根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是p(y|x)=p(x|y)p(y)p(x),在这里,x是一个特征向量,将设x维度为M。因为朴素的假设,即特征条件独立,根据全概率公式展开,此公式可以表达为p(y=ck|x)=Mi=1p(xi|y=ck)p(y=ck)∑kp(y=ck)∏Mi=1P(xi|y=ck),这里,只要分别估计出,特征xi在每一类的条件概率就可以了。类别y的先验概率可以通过训练集算出,同样通过训练集上的统计,可以得出对应每一类上的,条件独立的特征对应的条件概率向量。
算法思想:训练集TrainingSet={(x1,y1),(x2,y2),...,(xN,yN)} 包含N条训练数据,其中 xi=(x(1)i,x(2)i,...,x(M)i)T是M维向量,yi∈{c1,c2,...cK}属于K类中的一类。首先,我们来计算公式中的p(y=ck),p(y=ck)=∑Ni=1I(yi=ck)N。。。。(3)。其中I(x)为指示函数,若括号内成立,则计1,否则为0。接下来计算分子中的条件概率,设M维特征的第j维有L个取值,则某维特征的某个取值ajl,在给定某分类ck下的条件概率为: p(xj=ajl|y=ck)=∑Ni=1I(xji=ajl,yi=ck)∑Ni=1I(yi=ck)。。。(4)经过上述步骤,我们就得到了模型的基本概率,也就完成了学习的任务。对于分类来说就是通过学到的概率,给定未分类新实例X,就可以通过上述概率进行计算,得到该实例属于各类的后验概率p(y=ck|X),因为对所有的类来说,公式(2)中分母的值都相同,所以只计算分子部分即可,具体步骤如下:
1.计算该实例属于y=ck类的概率
p(y=ck|X)=p(y=ck)∏j=1np(X(j)=x(j)|y=ck)。。。(5)
2.确定该实例所属的分类y
y=argmaxckp(y=ck|X)。。。。(6)
于是我们得到了新实例的分类结果。
由以上的基础,应用朴素贝叶斯分类,就变成了这样的问题:初始化步,构建可以表征句子的特征向量(词汇表)。并根据这个特征向量,把训练集表征出来。从训练集中分离部分数据作为测试集。学习步,计算类的先验概率和特征向量对应每一类的条件概率向量分类步, 计算测试集中待分类句子在每一类的分类后验概率,取最大值作为其分类,并与给定标签比较,得到误分类率。
三、算法实现细节
1.按照所输入的路径获取数据源,因为不需要对数据集合进行增删改,因此选用查询更加低耗的Linkedlist。
2. 根据Naive Bayes算法的要求,按照已下规则组装LinkedList数据作为测试数据集合
3. 根据Naive Bayes算法的要求,按照已下规则组装LinkedList数据作为训练数据集合。
4.将训练数据集合通过数组的方式拆分为属性列集合tag:标签集合,attribute1:属性列1集合,属性列2集合,属性列3集合,属性列4集合。
5.按照轮次开始运算,首先得到T跟F的总数和总概率,再计算单独每一个属性列的T跟F的概率并返回MAP集合,通过Map集合的特性key:value键值对的方式得到每一个属性列
6. 5-fold交叉验证,将数据集等分为5份,每次都轮流选择其中的1份数据作为测试数据,其余的4份数据作为训练数据,共5次,然后将训练数据进行划分为5份,将属性列用getTandF以键值对的方式进行单独的求取T率和F率,从而可以计算得平均训练时间和平均测试时间。然后放入算法中分别进行训练与预测,得出每次预测的准确度。
四、实验结果及分析
Naive Bayes算法实现之后,使用了UCI数据集上的‘股票涨跌’、‘质量评估’、‘健康评估’三个数据集,将数据集中可用到的属性提取出来,并转化成相应的格式的数据集,可在程序中进行读取;再使用5-fold的方法,将数据集划分为训练集与测试集,计算每次的准确度并求取平均值,将最后的数据作为结果。
4.1 数据处理
股票涨跌数据集中,抽取其中的日期(date),象征(symbol),开盘时的数值(open),收盘时的数值(close)作为属性列,最终涨或者跌(Rising or falling)作为目标列,若为Rising则为T,若为falling则为F。
健康评估数据集中,抽取其中的编号(number),生病时间(Length of time),程度(degree),健康评判(Health evaluation)作为属性列,最终是否健康(Healthy or unhealthy)作为目标列,若为Healthy则为T,若为Unhealthy则为F。
质量评估数据集中,抽取其中的属性(attribute),数量(quantity),大小(size),质量(mass)作为属性列,最终质量是否合格(Qualified or unqualified)作为目标列,若为Qualified则为T,若为unqualified则为F。
4.2 实验结果及分析
质量评估数据集的5-fold预测结果:
次数 | 1 | 2 | 3 | 4 | 5 | 平均 |
正确率 | 57.2687% | 75.4386% | 89.4737% | 93.4211% | 88.9868% | 80.9177% |
训练用时(ms) | 19 | 19 | 28 | 48 | 73 | 37.4 |
健康数据集的5-fold预测结果:
次数 | 1 | 2 | 3 | 4 | 5 | 平均 |
正确率 | 0.0% | 75.7576% | 87.8788% | 81.8181% | 66.6667% | 62.4243% |
训练用时(ms) | 10ms | 8 | 7 | 11 | 13 | 9.8 |
股票涨跌数据集的5-fold预测结果:
次数 | 1 | 2 | 3 | 4 | 5 | 平均 |
正确率 | 1.3697% | 35.1351% | 41.0959% | 36.4865% | 31.5068% | 29.1188% |
训练用时(ms) | 101 | 117 | 102 | 105 | 102 | 105.4 |