局部加权朴素贝叶斯算法及其Weka程序分析1局部加权朴素贝叶斯算法及其Weka程序分析1张伟(北京交通大学计算机与信息技术学院,北京,100044)摘要:局部加权朴素贝叶斯是一种改进朴素贝叶斯算法独立性假设缺陷的算法.通过实验证明加权朴素贝叶斯算法具有很好的效果,比朴素贝叶斯和K最近邻方法的效果都要好。关键字:局部加权,朴素贝叶斯在机器学习中直接使用贝叶斯定理是不现实的,因为训练集不足以获得全概率分布的准确估计。朴素贝叶斯分类算法是一种优秀的分类算法,但由于其必须满足属性独立性假设,使得该算法具有了一定的局限性。局部加权朴素贝叶斯算法为了从该算法的弱点独立性假设入手,对朴素贝叶斯算法进行改进,提出了一种基于K近邻法的局部加权朴素贝叶斯分类算法。实验表明该算法提高了分类的可靠性与准确率。1局部加权朴学习局部加权学习(locallyweightedlearning,简称LWL),既可用于回归问题(如局部加权线性回归),又可用于分类问题(如局部加权朴素贝叶斯)。局部加权分类是一种比较新的方式,在一些实验中表现出更高的准确率。分类过程需要对训练实例根据它们离测试实例的距离进行加权。在传统的加权学习算法中通常使用欧几里德距离来度量实例间的距离。局部加权学习是方法是懒惰学习(lazylearning)和基于记忆学习(memory-basedlearning)的一种形式,它需要存储数据集,当需要对一个新实例进行处理,通过距离函数计算训练实例和测试实例的距离以确定和测试实例相关的训练实例的加权集合构,然后用该集合构造一个新的模型来处理新实例。1本文是多年来经过无数次修正的版本,其中融入了许多学生的建议.而且也是时时更新的.特别地,本文仅供学生学习使用,并不适合于发表在任何公开媒体上,也不允许任何学生将之存放到互联网上.另外,与一般学术论文不同,本文许多地方采用第1人称进行讲述.局部加权朴素贝叶斯算法及其Weka程序分析21.1局部加权朴素贝叶斯原则上,贝叶斯定理保证了对一个给定属性值向量的新实例的类标的最优预测。不幸的是,直接将贝叶斯定理用于机器学习是不现实的,因为不可避免训练数据不足以获得全概率分布的精确估计。为了使推理可行必须先满足一些独立性假设。朴素贝叶斯方法把独立性假设发挥到了极致,假定属性对于给定的类标值是统计上独立的。虽然这个假设在实际中并不成立,朴素贝叶斯在许多分类问题上表现的非常好。此外,朴素贝叶斯计算效率—训练在实例个数和属性个数上都是线性的且易于执行。机器学习相关文章开始关注朴素贝叶斯学习算法归功于Clark和Niblett的有关CN2规则学习的文章。在这篇文章中他们在实验评估中使用了一个简单的贝叶斯分类器(朴素贝叶斯)作为对比,朴素贝叶斯分类器比其他更成熟的学习算法表现更好。虽然已经对朴素贝叶斯在一些违反属性独立假设的情况下具有良好表现进行了解释,但一个基本事实没有改变,那就是当独立性假设不成立时,概率估计精度和效果都会下降。很多用于提高朴素贝叶斯效果的方法被提出,其中许多方法在保持原算法的简单性和计算高效性的同时降低算法的“朴素性”。Zheng和Webb在这个领域的工作进行了很好的总结。最有效的方法包括:贝叶斯网络的限制子类、结合了属性选择的朴素贝叶斯或者将朴素贝叶斯模型结合到其他分类器(例如决策树)。事实证明局部加权的朴素贝叶斯算法具有很好的效果,比朴素贝叶斯和K最近邻方法的效果都要好。我们用来加权朴素贝叶斯的方法是从一项源于用来对非线性回归模型进行估计的技术中借鉴而来,线性回归模型适合基于加权函数的数据,这个加权函数用来处理要进行预测的实例。由于加权函数随着每个需要处理的实例改变,所以由此产生的估计是非线性的。本文我们研究了用于分类的局部加权学习,局部加权学习在机器学习中没有得到很多关注。Loader(1999)和Hastie(2001)从统计学角度研究了所谓的“局部可能性”方法,包括局部加权线性逻辑回归和局部加权密度估计。朴素贝叶斯是用密度估计进行分类的例子。和逻辑回归相比它具有优势:在属性个数上是线性的,这是这种方法在具有多属性的学习问题上具有更高的计算有效性。我们使用朴素贝叶斯的方式和在局部加权线性回归中使用线性回归的方式一样:一个局部朴素贝叶斯模型适合于用来预测类属性实例(我们称这个实例为测试实例)的领域中的数据集的子集。此领域中的训练实例是加权的,距离测试实例越远的例子具有的权重越小。然后一个分类器可以从朴素贝叶斯模型获得,朴素贝叶斯模型将测试实例的属性值作为输入。用来训练每个局部加权朴素贝叶斯模型的数据集的子集由最近邻算法决定。用户指定的参数k控制使用多少个实例。这通过使用具有紧支撑的加权函数和为k最近邻的距离设定宽度(或带宽)来实现。局部加权朴素贝叶斯算法及其Weka程序分析31.2属性处理令di表示测试实例到第i个最近邻点xi的欧几里德距离。我们假设所有属性在计算距离前都被标准化为0到1之间的数值,名称型属性都进行二值化处理。令f为一个加权函数对所有的y1有f(y)=0。接下来我们设每个实例xi的权重i为/iikfdd这意味着实例xk的权重为0,所有距离测试实例很远的实例的权重都为0,和测试实例相同的实例权重为1。所有具有以上性质的单调递减函数都可以作为加权函数。在我们的实验中使用的如下线性加权函数flinear,对于y[0,1],有1linearfyy即,我们令权重随距离线性递减。更高的k值导致模型对数据中的波动变化很小,而较小的k值使得模型和数据保持一致。过小的k值可能导致模型和数据中的噪声匹配。我们的实验表明这种方法对于k值的选择在不是特别小的情况下是不敏感的。有一点需要说明。为了避免零频率的出现,我们在实现朴素贝叶斯的过程中使用Laplace估计对名称型属性的条件概率进行估计,这与加权方案进行交互。我们的经验发现适当的划分权重可以使得用来生成朴素贝叶斯模型的实例的总权重逼近k。假定有r个训练实例xi满足didk。那么重新调整的权重计算公式如下0iinqqr其中n是训练实例的总个数。朴素贝叶斯计算具有属性值a1,a2,a3,…,am测试实例的类属性cl的后验概率的公式如下:11211||,,...,|mljjllmomqqjjqpcpacpcaaapcpac其中o是类属性的总数。等式右边的单个个体的概率根据加权后的数据进行估计,类属性cl的先验概率为001niililniiIccpco其中ci是序号为i的训练实例的类属性值,当x=y时指标函数I(x=y)为1,其他为0。假设属性j是名称型的,aj(属性在测试实例中对应的值)的条件概率计算公式如下:001|nijijilijlnjijijiIaaIccpacnIaa局部加权朴素贝叶斯算法及其Weka程序分析4其中nj属性j取值的个数,aij是属性j在实例i中的值。如果数据中包含数值属性,我们用Fayyad和Irani的基于MDL准则的离散化方案,将结果视作名称型属性,也可以做一个名称型假设,基于加权数据集对均值和方差进行估计。我们将给出两种方法的实证结果。2加权朴素贝叶斯的实现分析我们将详细分析Weka-3-6-13平台下,LWL.java源代码之中的所有成员变量与方法。2.1成员变量在Weka-3-6-13平台下的LWL.java类共定义了13个成员变量,现逐一介绍所有成员变量如下:(1)序列化serialVersionUID简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。(2)训练实例集合m_Train用于分类的训练实例的集合。(3)邻接点数目m_kNN用来对核的带宽进行选择的邻接点数目。(4)加权核方法m_WeightKernel目前选择使用的加权核方法。(5)布尔型变量m_UseAllK用来决定是否对每个实例设置邻接点数目m_kNN。(6)抽象类对象m_NNSearch用来设置使用的最近邻搜索算法。(7)五个静态最终变量LINEAR、EPANECHNIKOV、TRICUBE、INVERSE、GAUSS、CONSTANT分别代表了五种不同可用的核权重方法。这五个静态最终变量代表了可使用核加权方法。(6)分类器m_ZeroR以防当不能从数据集中建立分类器时有ZeroR模型可用。ZeroR指建立和使用0-r分类器类。可预测均值(数值型类)或模型(名称型类)。局部加权朴素贝叶斯算法及其Weka程序分析52.2辅助性的方法在Weka-3-6-13平台下的LWL.java类共定义了25个方法,首先简单介绍这25个方法,然后对其中的7个方法我们做重点介绍。现逐一介绍所有方法如下:(1)类的说明信息globalInfo()这个方法就是返回描述这个类的一串字符.主要是对相应分类模型的说明。在浏览器(explorer)或Weka实验环境(experimenter)下,通过这串字符来显示这个类的功能。这个方法的实现机制依赖于Weka.core之下的TechnicalInformation类与TechnicalInformationHandler接口。这个方法主要用于:01:/**02:*Returnsastringdescribingclassifier.03:*@returnadescriptionsuitablefor04:*displayingintheexplorer/experimentergui05:*/(2)列出参考文献所有著录项getTechnicalInformation()这个方法用于01:/**02:*ReturnsaninstanceofaTechnicalInformationobject,containing03:*detailedinformationaboutthetechnicalbackgroundofthisclass,04:*e.g.,paperreferenceorbookthisclassisbasedon.05:*06:*@returnthetechnicalinformationaboutthisclass07:*/(3)构造器LWL()用来实例化一个决策树树桩分类器对象。(4)列出描述默认分类器的字符串defaultClassifierString()这个方法用于返回用于描述默认分类器的字符串。01:/**02:*Stringdescribingdefaultclassifier.03:*04:*@returnthedefaultclassifierclassname05:*/(5)返回枚举对象enumerateMeasures()这个方法用于返回其他测试名字的枚举对象01:/**02:*Returnsanenumerationoftheadditionalmeasurenames03:*producedbytheneighboursearchalgorithm.04:*@returnanenumerationofthemeasurenames局部加权朴素贝叶斯算法及其Weka程序分析605:*/(6)返回命名的测试的值getMeasure(StringadditionalMeasureName)01:/**02:*Returnsthevalueofthenamedmeasurefromthe03:*neighboursearchalgorithm.04:*@paramadditionalMeasureNamethenameofthemeasuretoqueryfor05:*itsvalue06:*@returnthevalueofthenamedmeasure07:*