3、出决策树学习的基本算法,大致相当于ID3算法。基本的ID3算法通过自顶向下构造决策树来进行学习。构造过程是从“哪一个属性将在树的根结点被测试?”这个问题开始的。为了回答这个问题,使用统计测试来确定每一个实例属性单独分类训练样例的能力。分类能力最好的属性被选作树的根结点的测试。然后为根结点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也就是,样例的该属性值对应的分支)之下。然后重复整个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。这形成了对合格决策树的贪婪搜索(greedysearch),也就是算法从不回溯重新考虑以前的选择。下表描述了该算法的一个简化版本
4、专门用来学习布尔值函数(即概念学习)。表1-1专用于学习布尔函数的ID3算法概要ID3是一种自顶向下增长树的贪婪算法,在每个结点选取能最好地分类样例的属性。继续这个过程直到这棵树能完美分类训练样例,或所有的属性都使用过了。ID3(Examples,Target_attribute,Attributes)Examples即训练样例集。Target_attribute是这棵树要预测的目标属性。Attributes是除目标属性外供学习到的决策树测试的属性列表。返回能正确分类给定Examples的决策树。l创建树的Root结点l如果Examples都为正,那么返回label=+的单结点
5、树Rootl如果Examples都为反,那么返回label=-的单结点树Rootl如果Attributes为空,那么返回单结点树Root,label=Examples中最普遍的Target_attribute值l否则lAAttributes中分类Examples能力最好*的属性lRoot的决策属性Al对于A的每个可能值vil在Root下加一个新的分支对应测试A=vil令为Examples中满足A属性值为vi的子集l如果为空l在这个新分支下加一个叶子结点,结点的label=Examples中最普遍的Target_attribute值l否则在这个新分支下加一个子树ID3
6、(,Target_attribute,Attributes-A)l结束l返回Root*根据公式的定义,具有最高信息增益(informationgain)的属性是最好的属性。1.2序列覆盖算法序列覆盖算法它的学习规则集的策略为:学习一个规则,移去它覆盖的数据,再重复这一过程。这样的算法被称为序列覆盖(sequentialcovering)算法。想象我们已有了一个子程序learn-one-rule,它的输入为一组正例和反例,然后输出单个规则,它能够覆盖许多正例,并且覆盖很少的反例。我们要求这一输出的规则有较高的精确度,但不必有较高的覆盖度。较高的精确度说明它所做出的预测应为正确的。可
7、接受较低的覆盖度,表示它不必对每个训练样例都作出预测。有了这样一个学习单个规则的learn-one-rule子程序,要学习规则集,一个明显的方法是在所有可用训练样例上执行learn-one-rule,再移去由其学到的规则覆盖的正例,再在剩余的训练样例上执行它以学习第二个规则。该过程可重复若干次,直到最后学习到析取规则集,它们共同覆盖正例,覆盖程度达到所希望的比例。算法被称为序列覆盖算法是因为它按次序学习到一组规则,它们共同覆盖了全部正例。最终的规则集可被排序,这样分类新实例时可先应用精度最高的规则。序列覆盖算法的一个原型在表1-2中陈述。序列覆盖算法是广泛使用的学习析取规则集算法的其中之
8、一。它将学习析取规则集的问题化简为一系列更简单的问题,每个子问题只需学到单个合取规则。由于它执行的是一种贪婪搜索,形成序列化的规则且没有回溯,所以它不能保证找到能覆盖样例的最小的或最佳的规则。如何设计learn-one-rule程序以达到序列覆盖算法的要求?我们需要一个算法能够形成有较高精度的规则,但不必覆盖所有的正例。在本节中展示了各种算法,并描述了它们在学术研究上已探索的主要差别。本节只考虑命题规则。后面的节中将把这些算法扩展到一阶Horn子句。表1-2学习析取的规则集的序列覆盖算法。learn-one-rule必须返回单个的能覆盖某些Examples的规则。performa
9、nce是用户提供的子程序,以评估规则的质量。当算法再也不能学习到一个性能超过给定阈值Threshold的规则时,该算法终止。Sequential-covering(Target_attribute,Attributes,Examples,Threshold)nLearned_rulesnRulelearn-one-rule(Target_attribute,Attributes,Examples)n当performance(Rule,Examples)>Threshold,做:nLearned_rulesLearned_rules+RulenExampl
10、esExamples-被Rule正确分类的样例nRulelearn-one-rule(Target_attribute,Attributes,Examples)nLearned_rules按照在Examples上的performance排序的Learned_rulesn返回Learned_rules1.3一般到特殊柱状搜索实现learn-one-rule的一个有效途径是将假设空间搜索过程设计为与ID3算法中相似的方式,但在每一步只沿着最有希望的分支向下。如图1-3所示的搜索树,搜索开始于最一般的规则前件(即能匹配所有实例的空测试),然后贪婪地加入那些在训练样例上性能改进最大
11、的属性测试。一旦该测试被加入,该过程重复,贪婪地加入第二个属性测试,依此类推。如ID3那样,该过程通过贪婪地增加新的属性测试来获得假设,直到该假设的性能到达一可接受的程度。与ID3不同的是,此learn-one-rule的实现在每一步沿着单个分支即产生最佳性能的属性-值对,而不是用增长子树的办法覆盖所选属性的所有可能值。这种实现learn-one-rule的途径执行的是对可能存在的规则的一般到特殊搜索,以得到一个有较高精度但不一定完全覆盖数据的规则。如在决策树学习中那样,有许多方法可以定义选择“最佳”分支的度量标准。与在ID3中类似,我们可定义最佳分支为它覆盖的样例有最低的熵()。
12、图1-3Learn-one-rule从一般到特殊过程中的规则前件搜索在每一步,最佳规则的前件被以各种可能方式特化。规则后件是由满足前件的样例所决定的。该图显示的是宽度为1的柱状搜索。上面推荐的一般到特殊搜索是一种不带回溯的贪婪深度优先搜索。如其他贪婪搜索一样,它所带来的危险是每一步可能作出了次优的选择。为减小这种风险,可将此算法扩展为一种柱状搜索(beamsearch),即每一步算法保留k个最佳候选的列表,在每一搜索步对这k个最佳候选生成分支(特化),并且结果集再被削减至k个最可能成员。柱状搜索跟踪当前最高分值假设的最有希望的替代者,以使每一步中它们的所有后继都被考虑到。该一般
13、到特殊柱状搜索用于CN2程序,它由Clark&Niblett(1989)提出。该算法在表1-3中描述。表1-3learn-one-rule的一种实现是一般到特殊柱状搜索。当前假设的边缘表示为变量Candidate_hypotheses。该算法与Clark&Niblett(1989)描述的CN2程序相类似。Learn-one-rule(Target_attribute,Attributes,Examples,k)返回一个覆盖若干样例的规则。实施一般到特殊贪婪柱状搜索以得到最佳规则,由performance度量来引导。n初始化Best_hypothesi
15、不一致的或非极大特殊化的假设2.更新Best_hypothesisn对New_candidate_hypotheses中所有h做以下操作:n如果(performance(h,Examples,Target_attribute)>performance(Best_hypothesis,Examples,Target_attribute)则Best_hypothesish3.更新Candidate_hypothesesnCandidate_hypothesesNew_candidate_hypotheses中k个最佳成员,按照performance度量n返回一个如下形式
16、的规则:“如果Best_hypothesis,则prediction”其中prediction为在与Best_hypothesis匹配的Examples中最频繁的Target_attribute值performance(h,Examples,Target_attribute)nh_examples与h匹配的Examples子集n返回-Entropy(h_examples),其中Entropy是关于Target_attribute的熵下面是对表1-3中的learn-one-rule算法的一些说明。首先,注意在算法主循环中考虑的每个假设是属性-值约束的合取。每个合取假设对应于待学习规
17、则的候选前件集合,它由其覆盖的样例的熵来评估。搜索过程不断特化候选假设,直到到达一个极大特殊假设,它包含所有可用的属性。由该算法输出的规则为搜索过程中遇到的性能最佳(performance最大)的规则不一定是搜索最终产生的假设。规则的后件输出只在算法的最后一步产生,在其前件(表示为变量Best_hypothesis)确定之后,算法构造出的规则后件用于预测在规则前件所能覆盖的样例中最常见的目标属性值。最后,还应注意尽管使用了柱状搜索以减小风险,贪婪搜索仍可能产生次优的规则。然而,即使这样,序列覆盖算法仍能学到一组规则,它们共同覆盖训练样例,因为它对剩余的未覆盖样例重复调用了learn-one-
18、rule。下面讨论一下上述规则学习算法设计中的关键思想。首先,序列覆盖算法每次学习一个规则,移去覆盖的样例然后在剩余样例上重复这一过程。相反,如ID3那样的决策树算法使用单个搜索过程来搜索可接受决策树,每步并行学习整个析取项的集合。因此,我们也可将ID3这样的算法称为并行覆盖算法,对应于CN2这样的序列覆盖算法。哪一种算法比较好?答案关键在于搜索中最基本步骤之间的差别。ID3在每一搜索步中根据它对数据产生的划分选择不同的属性。相反,CN2选择的是不同的属性-值对,方法是通过比较它们覆盖的数据子集。要看出这种差别的意义所在,需要比较两种算法为学习到相同的规则集合所作出的不同选择的次数。为
20、然而若数据较缺乏,对于不同规则前件的决策“共享”则更有效。另一考虑在于特定的任务中是否希望不同的规则测试相同的属性。在并行覆盖决策树学习算法中会出现这样的情况。在序列覆盖算法中则不存在。不同方法的第二个相异之处在于learn-one-rule搜索的方向。在上面描述的算法中,搜索是从一般到特殊的。其他已讨论的算法是从特殊到一般的。在此情况下,从一般到特殊搜索的一个优点在于只有一个极大一般假设可作为搜索起始点,而在多数假设空间中有很多特殊假设(如对每个实例有一假设)。因为有许多极大特殊假设,就不能确知选择哪一个作为搜索的开始点。执行从特殊到一般搜索的一个称为Golem(Muggleton&a
21、mp;Feng1990)的程序解决此问题的方法是随机选择多个正例,以此为初始来进行搜索。在多个随机选择中的最佳假设作为最后结果。第三个要考虑的是learn-one-rule是为一个生成再测试(generatethentest)搜索,范围为所有合法的假设,如我们推荐的实现中那样;还是一个样例驱动(example-driven)搜索,以使训练样例个体约束假设的生成。样例驱动搜索算法包括Find-S、候选消除、AQ算法,以及本章后面要讨论的Cigol算法。在这些算法中,对假设的生成或修正是由单独的训练样例驱动的,而且结果是一个已修正的假设,使对此单个样例的性能得到改善。这不同于表1-
22、3中learn-one-rule算法的生成再测试搜索,其中后续的假设的生成只基于假设表示的语法。在这些候选假设生成之后再分析训练数据,然后基于这些假设在全部样例上的性能来进行选择。生成再测试的一个重要优点是搜索中每一步的选择都基于在许多样例上的假设性能,因此噪声数据的影响被最小化。相反,样例驱动算法基于单个的样例改进假设,它更容易被一些噪声训练样例影响,因此对训练数据中差错的鲁棒性较差。第四个要考虑的是是否需要对规则进行后修剪以及怎样修剪。如在决策树学习中一样,learn-one-rule也有可能形成在训练数据上性能很好,但在以后的数据中很差的规则。解决的办法也是在得到每个规则后进行后修
23、剪。确切地讲,可以移去某些前件,只要这导致不同于训练样例的用于修剪的一个样例集合上的性能提高。1.4学习一阶规则前面讨论的算法针对学习命题规则集(即无变量的规则)。本节中将考虑带有变量的规则,确切地讲为一阶Horn子句。之所以考虑这样的规则,是因为它们比命题规则更有表征能力。对于一阶段规则的归纳学习通常被称为归纳逻辑编程(InductiveLogicProgramming,简写ILP),因为这一过程可看作从样例中自动推论出Prolog程序。Prolog是一个通用的、图灵等价的编程语言,其中程序被表示为一组Horn子句。一阶Horn子句为说明一阶表示比命题(无变量)表示的优越之处
24、,考虑一个学习任务,目标概念很简单,为Daughter(x,y),定义在所有的人x和y上。Danghter(x,y)的值在x是y的女儿时为真,否则为假。假定每个人被描述为属性Name,Mother,Father,Male和Female。因此每个训练样例将包含以这些属性进行的描述的两个人,以及目标属性Daughter的值。例如,下面为一个正例,其中Sharon为Bob的女儿。 25、er2=Victor,Male2=True,Female2=False,Daughter1,2=True>其中每个属性名上的下标是为了区分这两个人。现在,如果搜集许多这样的目标概念Daughter1,2的训练样例,并将它们提供给一个命题规则学习器,如CN2和C4.5,结果将为一组非常特殊的规则如:IF(Father1=Bob)(Name2=Bob)(Female1=True)THENDaughter1,2=True虽然这个规则是正确的,但它过于特殊了,因此它对今后的分类几乎毫无用处。问题在于,命题表示方法不能够描述属性值之间实质关系。与此不同,使用一阶表示的程序将学到下面的一 26、般规则:IFFather(y,x)Female(y)THENDaughter(x,y)其中x和y为变量,它们可指代任意人。一阶Horn子句还可指定前件中的变量不出现在后件中的规则。例如对GrandDaughter的规则为:IFFather(y,z)Mother(z,y)Female(y)THENGrandDaughter(x,y)注意该规则中的变量z,它指代y的父亲,在规则后件中没有出现。当一个变量只在前件中出现时,假定它是被存在量化(existentiallyquantified)的,即只要存在该变量的一个约束能满足对应的文字,那么规则前件就满足。还可能在规则的后 27、件和前件中使用相同的谓词,描述递归的规则。如在本章开头的两个规则提供了概念Ancestor(x,y)的递归定义。以下将描述的ILP学习方法已可以学习几种简单的递归函数,包括如上面的Ancestor函数以及其他一些函数,如对列表中元素进行排序;从列表中移去一特定元素;拼接两个列表。1.5规则后修剪实践中,一种用来发现高精度假设的非常成功的方法为“规则后修剪(rulepost-pruning)”。这种修剪方法的一个变体被用在C4.5中(Quinlan1993),C4.5是从原始的ID3算法的派生出来的。规则后修剪包括下面的步骤:1.从训练集合推导出决策树,增长决策树直到尽可能好地拟 28、合训练数据,允许过度拟合发生。2.将决策树转化为等价的规则集合,方法是为从根结点到叶子结点的每一条路径创建一条规则。3.通过删除任何能导致估计精度提高的前件(preconditions)来修剪(泛化)每一条规则。4.按照修剪过的规则的估计精度对它们进行排序;并按这样的顺序应用这些规则来分类后来的实例。如同前面提出的,估计规则精度的一种方法是使用与训练集和不相交的验证集合。另一种被C4.5使用的方法是基于训练集合本身评估性能,但使用一种保守估计(pessimisticestimate)来弥补训练数据有利于当前规则的估计偏置。更准确地讲,C4.5通过以下方法计算保守估计,先计算规则在它应 29、用的训练样例上的精度,然后假定此估计精度为二项分布,并计算它的标准差(standarddeviation)。对于一个给定的置信区间,采用下界估计作为规则性能的度量(例如,对于一个95%的置信区间,规则精度被保守估计为:在训练集合上的观察精度减去1.96乘估计的标准差)。这样做的效果是,对于大的数据集,保守预测非常接近观察精度(也就是标准差非常小),然而随着数据集合的减小,它开始离观察精度越来越远。虽然这种启发式方法不是统计有效(statisticallyvalid)的,但是已经发现它在实践中是有用的。为什么修剪之前要把决策树转化成规则集呢?这样做主要有三个好处:1转化为规则集可以区分决策结 30、点使用的不同上下文。因为贯穿决策结点的每条不同路径产生一条不同的规则,所以对于不同路径,关于一个属性测试的修剪决策可以不同。相反,如果直接修剪树本身,只有两个选择,要么完全删除决策结点,要么保留它的本来状态。2转化为规则集消除了根结点附近的属性测试和叶结点附近的属性测试的区别。于是避免了零乱的记录问题,比如若是根结点被修剪了但保留它下面的部分子树时如何重新组织这棵树。3转化为规则提高了可读性。对于人来说规则总是更容易理解的。1.6学习一阶规则集:FOIL有许多算法已被提出用于学习一阶规则或Horn子句。下面将介绍FOIL程序(Quinlan1990),它使用的方法非常类似于前面介绍的序列 31、覆盖和learn-one-rule算法。实际上,FOIL是这些较早的算法在一阶表示上的自然扩展。形式化地讲,由FOIL学习的假设为一阶规则集,其中的规则类似于Horn子句,但有两个不同:首先由FOIL学习的规则比一般的Horn子句更受限,因为文字不允许包含函数符号(这减小了假设空间搜索的复杂度)。其次,FOIL规则比Horn子句更有表征力,因为规则体中的文字也可为负文字。FOIL已被应用于多种问题领域。例如,它已用于学习快速排序算法Quicksort的递归定义,以及学习从合法棋盘状态中区分出非法状态。FOIL算法在表1-6中列出。注意外层循环对应于前面描述的序列覆盖算法。它每 32、次学习一个新规则,然后将此规则覆盖的正例移去,然后学习下一规则。算法的内层循环是前面的learn-one-rule的另一种形式,它已被扩展以适合处理一阶规则。还要注意FOIL和前面算法的一些微小的不同。确切地讲,FOIL只搜寻那些预测目标文字何时为True的规则,而前面的算法既搜寻预测何时为True的规则,也搜寻预测何时为False的规则。FOIL还应用了一个简单的爬山搜索,而不是柱状搜索(即它执行的搜索等价于宽度为1的柱状搜索)表1-6基本的FOIL算法其中给出了生成候选文字Candidate-literal的方法和FOIL增益Foil_Gain的定义。该基本算法可稍做修改以更好地处理有噪声数据,如文中所描述的。FOIL(Target_predicate,Predicates,Examples)nPosExamples中Ta