第5章 朴素贝叶斯分类算法 5.1基 本 概 念 5.1.1主观概率 贝叶斯方法是一种研究不确定性的推理方法,不确定性常用贝叶斯概率表示,它是一种主观概率。通常的经典概率代表事件的物理特性,是不随人意识变化的客观存在,而贝叶斯概率则是人的认识,是个人主观的估计,随个人的主观认识的变化而变化。投掷硬币可能出现的正反面两种情形,经典概率代表硬币正面朝上的概率,这是一个客观存在; 而贝叶斯概率则指个人相信硬币会正面朝上的程度。同样的例子还有,一个企业家认为“一项新产品在未来市场上销售”的概率是0.8,这里的0.8是根据他多年的经验和当时的一些市场信息综合而成的个人观点。一个投资者认为“购买某种股票能获得高收益”的概率是0.6,这里的0.6是投资者根据自己多年股票生意经验和当时股票行情综合而成的个人信念。 贝叶斯概率是主观的,对它的估计取决于先验知识的正确和后验知识的丰富和准确,因此贝叶斯概率常常可能随个人掌握信息的不同而发生变化。对即将进行的羽毛球单打比赛结果进行预测,不同人对胜负的主观预测不同,如果对两人的情况和各种现场的分析一无所知,就会认为两者的胜负比例为1∶1; 如果知道其中一人是奥运会羽毛球单打冠军,而另一人只是某省队新队员,则可能给出的预测是奥运会冠军和省队队员的胜负比例为3∶1; 如果进一步知道奥运冠军刚好在前一场比赛中受过伤,则对他们胜负比例的主观预测可能会下调为2∶1。所有的预测推断都是主观的,基于后验知识的一种判断,取决于对各种信息的掌握。 经典概率方法强调客观存在,它认为不确定性是客观存在的。在同样的羽毛球单打比赛预测中,从经典概率的角度看,如果认为胜负比例为1∶1,则意味着在相同条件下,如果两人进行100场比赛,其中一人可能会取得50场的胜利,同时 输掉另外50场。主观概率不像经典概率那样强调多次的重复,因此在许多不可能出现重复事件的场合能得到很好的应用。上面提到的企业家对未来产品的预测,投资者对股票是否能取得高收益的预测以及羽毛球比赛胜负的预测中,都不可能进行重复 的试验,因此,利用主观概率,按照个人对事件的相信程度而对事件做出推断是一种很合理而易于解释的方法。 5.1.2贝叶斯定理 1. 基础知识 (1) 已知事件A发生的条件下,事件B发生的概率,称为事件B在事件A发生下的条件概率,记为P(B|A),其中P(A)称为先验概率,P(B|A)称为后验概率,计算条件概率的公式如下。 P(B|A)=P(A∩B)P(A)(51) 条件概率公式通过变形得到如下乘法公式。 P(A∩B)=P(B|A)P(A)(52) (2) 设A、B为两个随机事件,如果有P(AB)=P(A)P(B)成立,则称事件A和B相互独立。此时有P(A|B)=P(A),P(AB)=P(A)P(B)成立。 设A1,A2,…,An为n个随机事件,如果对其中任意m(2≤m≤n)个事件Ak1,Ak2,…,Akm,都有 P(Ak1,Ak2,…,Akm)=P(Ak1)P(Ak2)…P(Akm) (53) 成立,则称事件A1,A2,…,An相互独立。 (3) 设B1,B2,…,Bn为互不相容事件,P(Bi)>0,i=1,2,…,n,且∪ni=1Bi=Ω为基本空间,对任意的事件A∪ni=1Bi,计算事件A发生的概率的公式为 P(A)=∑ni=1P(Bi)P(A|Bi)(54) 设B1,B2,…,Bn为互不相容事件,P(Bi)>0,i=1,2,…,n,P(A)>0,则在事件A发生的条件下,事件Bi发生的概率为 P(Bi|A)=P(BiA)P(A)=P(Bi)P(A|Bi)∑ni=1P(Bi)P(A|Bi)(55) 称该公式为贝叶斯公式。 2. 贝叶斯决策准则 假设Ω=C1,C2,…,Cm是有m个不同类别的集合,特征向量X是d维向量,P(X|Ci)是特征向量X在类别Ci状态下的条件概率,P(Ci)为类别Ci的先验概率。根据前面所述的贝叶斯公式,后验概率P(Ci|X)的计算公式为 P(Ci|X)=P(X|Ci)P(X)P(Ci)(56) 其中P(X)=∑mj=1P(X|Cj)P(Cj)。 贝叶斯决策准则为: 如果对于任意i≠j,都有P(Ci|X)>P(Cj|X)成立,则样本模式X被判定为类别Ci。 3. 极大后验假设 根据贝叶斯公式可得到一种计算后验概率的方法: 在一定假设的条件下,根据先验概率和样本数据得到的概率,可以得到后验概率。 令P(c)是假设c的先验概率,它表示c是正确假设的概率,P(X)表示的是训练样本X的先验概率,P(X|c)表示在假设c正确的条件下样本X发生或出现的概率,根据贝叶斯公式可以得到后验概率的计算公式为 P(c|X)=P(X|c)P(c)P(X)(57) 设C为类别集合也就是待选假设集合,在给定未知类别标号样本X时,通过计算找到可能性最大的假设c∈C,具有最大可能性的假设或类别被称为极大后验假设(Maximum a Posteriori),记作cmap: cmap=arg maxc∈CP(c|X)=arg maxc∈CP(X|c)P(c)P(X)(58) 由于P(X)与假设c无关,上式可变为: cmap=arg maxc∈CP(X|c)P(c)(59) 当没有给定类别概率的情形下,可做一个简单假定: 假设C中每个假设都有相等的先验概率,也就是对于任意的ci,cj∈C(i≠j),有P(ci)=P(cj),再做进一步简化,只需计算P(X|c)找到使之达到最大的假设。P(X|c)被称为极大似然假设( Maximum Likelihood),记为cml: cml=arg maxc∈CP(X|c)(510) 5.1.3朴素贝叶斯分类模型 在贝叶斯分类器的诸多算法中,朴素贝叶斯分类模型是最早出现的,它的算法逻辑简单,构造的朴素贝叶斯分类模型结构也比较简单,运算速度比同类算法快很多,分类所需的时间也比较短,并且大多数情况下分类精度也比较高,因而在实际中得到了广泛的应用。该分类器有一个朴素的假定: 以属性的类条件独立性假设为前提,即在给定类别状态条件下,属性之间是相互独立的。朴素贝叶斯分类器的结构示意图如图51所示。 图51朴素贝叶斯分类器的结构示意图 假设样本空间有m个类别{C1,C2,…,Cm},数据集有n个属性A1,A2,…,An,给定一个未知类别的样本X=(x1,x2,…,xn),其中xi表示第i个属性的取值,即xi∈Ai,则可用贝叶斯公式计算样本X=(x1,x2,…,xn)属于类别Ck(1≤k≤m)的概率。根据贝叶斯公式,P(Ck|X)=P(Ck)P(X|Ck)P(X) ∝P(Ck)P(X|Ck),即要得到P(Ck|X)的值,关键要计算P(X|Ck)和P(Ck)。令C(X)为X所属的类别标签,由贝叶斯分类准则,如果对于任意i≠j,都有P(Ci|X)>P(Cj|X)成立,则把未知类别的样本X指派给类别Ci,贝叶斯分类器的计算模型如下。 C(X)=arg maxP(Ci)P(X|Ci)(511) 由朴素贝叶斯分类器的属性独立性假设,假设各属性xi(i=1,2,…,n)间相互条件独立,则 P(X|Ci)=∏nk=1P(xk|Ci)(512) 于是式(511)被修改为 C(X)= arg maxiP(Ci)∏nk=1P(xk|Ci)(513) P(Ci)为先验概率,可通过P(Ci)=di/d计算得到,其中di是属于类别Ci的训练样本的个数,d是训练样本的总数。若属性Ak是离散的,则概率可由P(xk|Ci)=dik/di计算得到,其中dik是训练样本集合中属于类Ci并且属性Ak取值为xk的样本个数,di是属于类Ci的训练样本的个数。朴素贝叶斯分类的工作过程如下。 (1) 用一个n维特征向量X=(x1,x2,…,xn)来表示数据样本,描述样本X对n个属性A1,A2,…,An的度量。 (2) 假定样本空间有m个类别状态C1,C2,…,Cm,对于给定的一个未知类别标号的数据样本X,分类算法将X判定为具有最高后验概率的类别,也就是说,朴素贝叶斯分类算法将未知类别的样本X分配给类别Ci,当且仅当对于任意的j,有P(Ci|X)>P(Cj|X)成立,1≤j≤m,j≠i,使P(Ci|X)取得最大值的类别Ci被称为最大后验假定。 (3) 由于P(X)不依赖于类别状态,对于所有类别都是常数,则根据贝叶斯定理,最大化P(Ci|X)只需要最大化P(X|Ci)P(Ci)即可。如果类的先验概率未知,则通常假设这些类别的概率是相等的,即P(C1)=P(C2)=…=P(Cm),所以只需要最大化P(X|Ci)即可,否则就要最大化P(X|Ci)P(Ci)。其中可用Si/S对P(Ci)进行估计计算,Si是给定类别Ci中训练样本的个数,S是训练样本(实例空间)的总数。 (4) 当实例空间中训练样本的属性较多时,计算P(X|Ci)可能会比较费时,开销较大,此时可以做条件独立性的假定: 在给定样本类别标号的条件下,假定属性值是相互条件独立的,属性之间不存在任何依赖关系,则下面等式成立 P(X|Ci)=∏nk=1P(xk|Ci) 其中概率P(x1|Ci),P(x2|Ci),…,P(xn|Ci)的计算可由样本空间中的训练样本进行估计。实际问题中根据样本属性Ak的离散或连续性质,考虑下面两种情形。 如果属性Ak是连续的,则一般假定它服从正态分布,从而来计算类条件概率。 如果属性Ak是离散的,则P(xk|Ci)=Sik/Si,其中Sik是在实例空间中类别为Ci的样本中属性Ak上取值为xk的训练样本个数,而Si是属于类别Ci的训练样本个数。 (5) 对于未知类别的样本X,对每个类别Ci分别计算P(X|Ci)P(Ci)。样本X被认为属于类别Ci,当且仅当P(X|Ci)P(Ci)>P(X|Cj)P(Cj),1≤j≤m,j≠i,也就是说样本X被指派到使P(X|Ci)P(Ci)取得最大值的类别Ci。 朴素贝叶斯分类模型的算法描述如下。 (1) 对训练样本数据集和测试样本数据集进行离散化处理和缺失值处理。 (2) 扫描训练样本数据集,分别统计训练集中类别为Ci的样本个数di和属于类别Ci的样本中属性Ak上取值为xk的实例样本个数dik,构成统计表。 (3) 计算先验概率P(Ci)=di/d和条件概率P(Ak=xk|Ci)=dik/di,构成概率表。 (4) 构建分类模型C(X)=arg maxiP(Ci)P(X|Ci)。 (5) 扫描待分类的样本数据集,调用已得到的统计表、概率表以及构建好的分类准则,得出分类结果。 5.1.4朴素贝叶斯分类器实例分析 【例5.1】应用朴素贝叶斯分类器来解决这样一个分类问题: 根据天气状况来判断某天是否适合于打网球。给定表51所示的14个训练实例,其中每一天由属性Outlook、Temperature、Humidity和Wind表征,类属性为Play Tennis。 表5114个训练实例 DayOutlookTemperatureHumidityWindPlay Tennis 1sunnyhothighweakno 2sunnyhothighstrongno 3overcasthothighweakyes 4rainmildhighweakyes 5raincoolnormalweakyes 6raincoolnormalstrongno 7overcastcoolnormalstrongyes 8sunnymildhighweakno 9sunnycoolnormalweakyes 10rainmildnormalweakyes 11sunnymildnormalstrongyes 12overcastmildhighstrongyes 13overcasthotnormalweakyes 14rainmildhighstrongno 图52朴素贝叶斯分类器的结构 现在有一个测试实例x: <Outlook=sunny, Temperature=cool, Humidity=high, Wind=strong>,问这一天是否适合于打网球。显然,本题的任务就是要预测此新实例的类属性Play Tennis取值(yes或no), 为此,需要构建如图52所示的朴素贝叶斯网络分类器。 图中的类结点C表示类属性Play Tennis, 其他4个结点A1、A2、A3、A4分别代表4个属性Outlook、Temperature、Humidity和Wind,类结点C是所有属性结点的父亲结点,属性结点和属性结点之间没有任何依赖关系。根据公式,有 V(x)=arg maxc∈yes,noP(c)P(sunny|c)P(cool|c)P(high|c)P(strong|c) 为了计算V(x),需要从如表51所示的14个训练实例中估计出概率。 P(yes),P(sunny|yes),P(cool|yes),P(high|yes),P(strong|yes),P(no), P(sunny|no),P(cool|no),P(high|no),P(strong|no)。 具体的计算如下。 P(yes)=9/14 P(sunny|yes)=2/9 P(cool|yes)=3/9 P(high|yes)=3/9 P(strong|yes)=3/9 P(no)=5/14 P(sunny|no)=3/5 P(cool|no)=1/5 P(high|no)=4/5 P(strong|no)=3/5 所以,有 P(yes)P(sunny|yes)P(cool|yes)P(high|yes)P(strong|yes)=0.005291 P(no)P(sunny|no)P(cool|no)P(high|no)P(strong|no)=0.0205704 可见,朴素贝叶斯分类器将此实例分类为no。 【例5.2】应用朴素贝叶斯分类器来解决这样一个分类问题: 给出一个商场顾客数据库(训练样本集合),判断某一顾客是否会买计算机。给定表52所示的14个训练实例,其中每个实例由属性age、income、student、credit rating表征,样本集合的类别属性为buy computer,该属性有两个不同取值,即yes,no,因此就有两个不同的类别(m=2)。设C1对应yes类别,C2对应no类别。 表5214个训练实例 ageincomestudentcredit ratingbuy computer ≤30highnofairno ≤30highnoexcellentno 30~40highnofairyes >40mediumnofairyes >40lowyesfairyes >40lowyesexcellentno 31~40lowyesexcellentyes ≤30mediumnofairno ≤30lowyesfairyes >40mediumyesfairyes ≤30mediumyesexcellentyes 31~40mediumnoexcellentyes 31~40highyesfairyes >40mediumnoexcellentno 现在有一个测试实例x: (age <=30,Income = medium,Student = yes,Credit rating= fair),问这一顾客是否会买计算机,本题的任务是要判断给定的测试实例是属于C1还是C2,根据公式,有: V(x)=arg maxc∈yes,noP(c)P(age≤30|c)P(medium|c)P(yes|c)P(fair|c) 为计算V(x),先计算每个类的先验概率P(Ci): P(Ci): P(buy computer='yes')=9/14=0.643 P(buy computer='no')=5/14=0.357 为计算P(X|Ci),i=1,2,计算下面的条件概率。 P(age='≤30'|buy computer='yes')=2/9=0.222 P(age='≤30'|buy computer='no')=3/5=0.6 P(income='medium'|buy computer='yes')=4/9=0.444 P(income='medium'|buy computer='no')=2/5=0.4 P(student='yes'|buy computer='yes')=6/9=0.667 P(student='yes'|buy computer='no')=1/5=0.2 P(credit rating='fair'|buy computer='yes')=6/9=0.667 P(credit rating='fair'|buy computer='no')=2/5=0.4 X=(age≤30,income=medium,student=yes,credit rating=fair) P(X|Ci):P(X|buy computer='yes')=0.222×0.444×0.667×0.667=0.044 P(X|buy computer='no')=0.6×0.4×0.2×0.4=0.019 P(X|Ci)P(Ci):P(X|buy computer='yes')·P(buy computer='yes')=0.028 P(X|buy computer='no')·P(buy computer='no')=0.007 因此,对于样本X,朴素贝叶斯分类预测结果为buy computer='yes'。 5.2朴素贝叶斯算法的特点及应用 5.2.1朴素贝叶斯算法的特点 朴素贝叶斯分类算法有诸多优点: 逻辑简单、易于实现、分类过程中算法的时间空间开销比较小; 算法比较稳定、分类性能对于具有不同数据特点的数据集合来说,其差别不大,即具有比较好的健壮性等优点。 在实际情况中,尽管难以满足朴素贝叶斯模型的属性类条件独立性假定,但它分类预测 在大多数情况下仍比较精确。原因有如下几个: 要估计的参数比较少,从而加强了估计的稳定性; 虽然概率估计是有偏 差的,但人们大多关心的不是它的绝对值,而是它的排列次序,因此有偏差的概率估计在某些情况下可能并不要紧; 现实中很多时候已经对数据进行了预处理,例如对变量进行了筛选,可能已经去掉了高度相关的量等。除了分类性能很好外,贝叶斯分类模型还具有形式简单、可扩展性强和可理解性好等优点。 朴素贝叶斯分类器的缺点是属性间类条件独立的这个假定,而很多实际问题中这个独立性假设并不成立,如果在属性间存在相关性的实际问题中忽视这一点,会导致分类效果下降。 朴素贝叶斯分类模型虽然在某些不满足独立性假设的情况下其分类效果比较好,但是大量研究表明可以通过各种改进方法来提高朴素贝叶斯分类器的性能。朴素贝叶斯分类器的改进方法主要有两类: 一类是弱化属性的类条件独立性假设,在朴素贝叶斯分类器的基础上构建属性间的相关性,如构建相关性度量公式,增加属性间可能存在的依赖关系; 另一类是构建新的样本属性集,期望在新的属性集中,属性间存在较好的类条件独立关系。 5.2.2朴素贝叶斯算法的应用场景 朴素贝叶斯算法应用很广泛,下面举两个实例说明其应用情况。 1. 贝叶斯方法在中医证候和症状描述中的应用 中医证候和症状描述错综复杂,如何较好地对病患所属证候进行鉴别诊断,一直是临床医疗工作者的首要目标,把数据挖掘技术的朴素贝叶斯分类方法应用到中医证候的诊断识别中,是一个较好的尝试。在使用朴素贝叶斯分类方法对中医证候进行分类识别并用遗传算法改进时,经历了以下过程: 首先合理抽象鉴别诊断过程并建立数学模型; 其次,提出了使用数据挖掘技术中的朴素贝叶斯分类方法对模型求解; 第三,考虑到特征数量较大,运用了遗传算法进行特征优化; 最后,使用医学上常用的ROC曲线评价方法对改进前后的分类识别的效率进行分析比较。 2. 贝叶斯方法在玉米叶部病害图像识别中的应用 在图像分割和特征提取的基础上,利用朴素贝叶斯分类器的统计学习方法,可以实现玉米叶部病斑的分类识别。相关文献表明,贝叶斯分类器具有网络结构简单、易于扩展等特点,对玉米叶部病害的分类识别效果较好,也为其他作物病害图像识别的研究提供了借鉴。 5.3朴素贝叶斯源代码结果分析 朴素贝叶斯源代码包括JavaBean.java和TestBayes.java两个文件,相关程序和实验数据可从github中下载。 1. JavaBean.java package bayes; public class JavaBean { int age; String income; String student; String credit_rating; String buys_computer; public JavaBean(int age, String income, String student, String credit_rating, String buys_computer) { this.age = age; this.income = income; this.student = student; this.credit_rating = credit_rating; this.buys_computer = buys_computer; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getIncome() { return income; } public void setIncome(String income) { this.income = income; } public String getStudent() { return student; } public void setStudent(String student) { this.student = student; } public String getCredit_rating() { return credit_rating; } public void setCredit_rating(String credit_rating) { this.credit_rating = credit_rating; } public String getBuys_computer() { return buys_computer; } public void setBuys_computer(String buys_computer) { this.buys_computer = buys_computer; } @Override public String toString() { return "JavaBean [age=" + age + ", income=" + income + ", student=" + student + ", credit_rating=" + credit_rating + ", buys_computer=" + buys_computer + "]"; } } 2. TestBayes.java package bayes; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; public class TestBayes { //朴素贝叶斯算法 算法的思想 public static ArrayList<JavaBean> list = new ArrayList<JavaBean>(); static int data_length = 0; public static void main(String[] args) { //1.读取数据,放入list容器中 File file = new File("C:\\Users\\wang4\\Desktop\\beiyes.txt"); txt2String(file); //数据测试样本 testData(25, "Medium", "Yes", "Fair"); } //读取样本数据 public static void txt2String(File file) { try { BufferedReader br = new BufferedReader(new FileReader(file)); // 构造一个BufferedReader类来读取文件 String s = null; while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行 data_length++; splitt(s); } br.close(); } catch (Exception e) { e.printStackTrace(); } } //存入ArrayList中 public static void splitt(String str) { String strr = str.trim(); String[] abc = strr.split("[\\p{Space}]+"); int age = Integer.parseInt(abc[0]); JavaBean bean = new JavaBean(age, abc[1], abc[2], abc[3], abc[4]); list.add(bean); } //训练样本,测试 public static void testData(int age, String a, String b, String c) { //训练样本 int number_yes = 0; int number_no = 0; //age情况个数 int num_age_yes = 0; int num_age_no = 0; //income int num_income_yes = 0; int num_income_no = 0; //student int num_student_yes = 0; int num_student_no = 0; //credit int num_credit_yes = 0; int num_credit_no = 0; //遍历list 获得数据 for (int i = 0; i < list.size(); i++) { JavaBean bb = list.get(i); if (bb.getBuys_computer().equals("Yes")) { //Yes number_yes++; if (bb.getIncome().equals(a)) {//income num_income_yes++; } if (bb.getStudent().equals(b)) {//student num_student_yes++; } if (bb.getCredit_rating().equals(c)) {//credit num_credit_yes++; } if (bb.getAge() == age) {//age num_age_yes++; } } else {//No number_no++; if (bb.getIncome().equals(a)) {//income num_income_no++; } if (bb.getStudent().equals(b)) {//student num_stdent_no++; } if (bb.getCredit_rating().equals(c)) {//credit num_credit_no++; } if (bb.getAge() == age) {//age num_age_no++; } } } System.out.println("购买的历史个数:" + number_yes); System.out.println("不买的历史个数:" + number_no); System.out.println("购买+age:" + num_age_yes); System.out.println("不买+age:" + num_age_no); System.out.println("购买+income:" + num_income_yes); System.out.println("不买+income:" + num_income_no); System.out.println("购买+student:" + num_student_yes); System.out.println("不买+student:" + num_student_no); System.out.println("购买+credit:" + num_credit_yes); System.out.println("不买+credit:" + num_credit_no); //概率判断 double buy_yes = number_yes * 1.0 / data_length; //买的概率 double buy_no = number_no * 1.0 / data_length; //不买的概率 System.out.println("训练数据中买的概率:" + buy_yes); System.out.println("训练数据中不买的概率:" + buy_no); //未知用户的判断 double nb_buy_yes = (1.0 * num_age_yes / number_yes) * (1.0 * num_income_yes / number_yes) * (1.0 * num_student_yes / number_yes) * (1.0 * num_credit_yes / number_yes) * buy_yes; double nb_buy_no = (1.0 * num_age_no / number_no) * (1.0 * num_income_no / number_no) * (1.0 * num_student_no / number_no) * (1.0 * num_credit_no / number_no) * buy_no; System.out.println("新用户买的概率:" + nb_buy_yes); System.out.println("新用户不买的概率:" + nb_buy_no); if (nb_buy_yes > nb_buy_no) { System.out.println("新用户买的概率大"); } else { System.out.println("新用户不买的概率大"); } } } 程序运行界面如图53所示。 图53朴素贝叶斯程序运行界面 上面的运行结果说明了我们应用朴素贝叶斯分类器来解决这样一个分类问题: 25岁的student根据工资水平的购买情况; 如图53所示: 年龄为25岁、收入中等的情况下,购买的历史个数为9,不买的历史个数为5,购买的学生数为6,不买的学生数是1,信誉度分别是购买的为6,不买的为2,统计出了综合训练数据中买的概率和不买的概率; 也预测了一下新用户买的概率和不买的概率,并比较得出: 新用户买的概率大。 5.4基于阿里云数加平台的朴素贝叶斯实例 朴素贝叶斯分类是一种应用基于独立假设的贝叶斯定理的简单概率分类算法,它通过计算某一条数据假设为各个标签时的概率,选择其中概率最大的作为该条数据的标签。该算法具有简单、高效、分类效果稳定的优点; 不足之处是: 为了简化分类模型,而假定分类数据各个属性间是相互独立的,因此当各个属性之间的关联性不高时,朴素贝叶斯算法是一个很好的选择。总体操作思路与逻辑回归分类算法一样,这里选择网上的某一组数据,其训练数据与测试数据图如图54和图55所示,其中,y为标签列,f0~f7为非标签列。 图54训练数据图 图55测试数据图 用训练数据使用贝叶斯分类算法进行训练,然后对测试数据进行测试,可以得到其分类的准确率等信息,操作流程图如图56所示,左边为训练数据,右边为测试数据,通过训练数据训练过后的朴素贝叶斯分类器,用来预测测试数据的标签,然后与测试数据的原标签进行对比。多分类评估与混淆矩阵类似,可以得到准确率及相关参数。 图56朴素贝叶斯算法流程图 朴素贝叶斯算法的字段设置如图57所示,其中特征列选择的是训练数据中的f0~f7列,排除列用于反选特征列,不可与特征列并存,强制转换列的默认解析规则为: string、boolean、datetime类型的列解析为离散类型; double、bigint类型的列解析为连续类型; 若有将bigint解析为categorical的情况,通过参数forceCategorical指定。 图57朴素贝叶斯字段设置图 预测组件的实验结果如图58所示,可以看到只有倒数第二条预测的标签有误,其他均正确。 图58预测组件的实验结果 多分类评估组件的实验结果如图59所示,可以得到准确率及其他参数。 图59实验结果图 5.5小结 贝叶斯方法是一种研究不确定性的推理方法,不确定性常用贝叶斯概率表示,它是一种主观概率。朴素贝叶斯分类算法有诸多优点: 逻辑简单、易于实现、分类过程中算法的时间空间开销比较小; 算法比较稳定; 分类性能对于具有不同数据特点的数据集合来说,其差别不大,即具有比较好的健壮性等优点。 思考题 1. 简述朴素贝叶斯分类的工作过程。 2. 表53是购买汽车的顾客分类训练样本集。假设顾客的属性集家庭经济状况、信用级别和月收入之间条件独立,则对于某顾客(测试样本),已知其属性集X=<一般,优秀,12>,利用朴素贝叶斯分类器计算这位顾客购买汽车的概率。 表53购买汽车的顾客训练样本集 序号家庭经济状况信 用 级 别月收入/千元购 买 汽 车 1一般优秀10是2好优秀12是3一般优秀6是4一般良好8.5否5一般良好9否6一般优秀7.5是7好一般22是8一般一般9.5否9一般良好7是10好良好12.5是