第4章 分类:基本概念、决策树与模型评估
分类任务就是确定对象属于哪个预定义的目标类。分类问题是一个普遍存在的问题,有许多不同的应用。例如:根据电子邮件的标题和内容检查出垃圾邮件,根据核磁共振扫描的结果区分肿瘤是恶性的还是良性的,根据星系的形状对它们进行分析。
本章介绍分类的基本概念,讨论诸如模型的过分拟合等关键问题,并提供评估和比较分类技术性能的方法。尽管本章主要关注一种称作决策树归纳的技术,但是本章讨论的大部分内容也适用于其他的分类技术。
4.1 预备知识
分类任务的输入数据是记录的集合。每条记录也称为实例或样例,用元组(x,y)表示,其中x是属性的集合,而y是一个特殊的属性,指出样例的类标号(也称为分类属性或目标属性)。下表列出一个样本数据集,用来将脊椎动物分成以下几类:哺乳类、鸟类、鱼类、爬行类和两栖类。属性集致命脊椎动物的性质,如提问、表皮覆盖、反之后代的方式、飞行的能力和在水中生存的能力等。尽管下表中的属性主要是离散的,但是属性集也可以包含连续特征。另一方面,类标号却必须是离散属性,这正是区别分类与回归(regression)的关键特征。回归是一种预测建模任务,其中目标属性y是连续的。
定义4.1 分类(classification) 分类任务就是通过学习得到一个目标函数(target function),把每个属性集x映射到一个预先定义的类标号y。
目标函数也称为分类模型(classification model)。分类模型可以用于以下目的。
描述性建模 分类模型可以作为解释性的工具,用于区分不同类中的对象。例如对于生物学家或者其他人,一个描述性模型有助于概括上表中的数据,并说明哪些特征决定一种脊椎动物是哺乳类、爬行类、鸟类、鱼类或两栖类。
预测性建模 分类模型还可以用于预测未知记录的类标号。如下图所示,分类模型可以看做一个黑箱,当给定未知记录的属性集上的值时,它自动地赋予未知样本类标号。例如,假设有一种叫做毒蜥的生物,其特征如下:
可以根据使用4-1中的数据集建立的分类模型来确定该生物所属的类。
分类技术非常适合预测或描述二元或标称类型的数据集。对于序数分类(例如把人类分成高收入、中等收入或低收入组),分类技术不太有效。因为分类技术部考虑隐含在目标类中的序关系。其他形式的联系,如子类与超类的关系也被忽略。本章余下的部分只考虑二元的或标称类型的类标号。
4.2 解决分类问题的一般方法
分类技术是一种根据输入数据集简历分类模型的系统方法。分类法的例子包括决策树分类法、基于规则的分类法、神经网络、支持向量机和朴素贝叶斯分类法。这些技术都使用一种学习算法(learning algorithm)确定分类模型,该模型能够很好地拟合输入数据中类标号和属性之间的联系。学习算法得到的模型不仅要很好地拟合输入数据,还要能够正确地预测未知样本的类标号。因此,训练算法的主要目标就是建立具有很好的泛化能力模型,即建立能够准确地预测未知样本类标号的模型。
下图展示解决分类问题的一般方法。首先,需要一个训练集(training set),它由类标号已知的记录组成,使用训练集简历分类模型,该模型随后将运用于检验集(test set),检验集由类标号未知的记录组成。
分类模型的性能根据模型正确和错误预测的检验记录进行评估,这些计数存放在称作混淆矩阵(confusion matrix)的表格中。表4-2描述二元分类问题的混淆矩阵。表中每个表项fij表示实际类标号为i但被预测为类j的记录数。例如,f01代表原本属于类0单被误分类为1的记录数。按照混淆矩阵中的表项,被分类模型正确预测的样本总数是(f11+f00),而被错误预测的样本总数是(f10+f01)。
虽然混淆矩阵通过衡量分类模型性能的信息,但是用一个数据汇总这些信息更便于比较不同模型的性能。为实现这一目的,可以使用性能度量(performance metric),如准确率(accuracy),其定义如下:
同样,分类模型的性能可以用错误率(error rate)来表示,其定义如下:
大多数分类算法都在寻求这样一些模型,当把他们应用于检验集时具有最高的准确率,或者等价地,具有最低的错误率。在4.5节再次讨论模型的评估问题。
4.3 决策树归纳
本节介绍决策树(decision tree)分类法,这是一种简单但却广泛使用的分类技术。
4.3.1 决策树的工作原理
为解决决策树分类的工作原理,考虑上一节中介绍的脊椎动物分类问题的简化版本。这里我们不把脊椎动物分为五个不同的物种,而只考虑两个类别:哺乳类动物和非哺乳类动物。
假设科学家发现一个新的物种,怎么判断它是哺乳动物还是非哺乳动物呢?一种方法是针对物种的特征提出一系列问题,第一个问题可能是,该物种是冷血动物还是恒温动物。如果它是冷血的,则该物种肯定不是哺乳动物;否则它或者是鸟类,或者是某种哺乳动物。如果它是恒温的,需要接着问:该物种是由雌性产崽进行繁殖的吗?如果是,则它肯定为哺乳动物,否则它有可能是非哺乳动物。
通过一处一系列精心构思的关于检验记录属性的问题,可以解决分类问题。每当一个问题得到答案,后续的问题将随之而来,知道我们得到记录的类标号。这一些列的问题和这些问题的可能回答可以组织成决策树的形式,决策树是一种由节点和有向边组成的层次结构。图4-4显示哺乳类动物分类问题的决策树,树中包含三种节点。
根结点(root node),它没有入变,但有零条或多条出边。
内部结点(internal node),恰有一条入边和两条或多条出边。
叶结点(leaf node),恰有一条入边,但没有出边。
在决策树中,每个叶结点都赋予一个类标号。非终结点(包括根节点和内部结点)包含属性测试条件,用以区分不同特性的记录。例如,在下图中,在根节点处,使用提问这个属性把冷血脊椎动物和恒温脊椎动物区别开来。因为所有的冷血脊椎动物都是非哺乳动物,所以用一个类称号为非哺乳动物的叶节点作为根节点的右子女。如果脊椎动物的提问是恒温的,则接下来用胎生这个属性来区分哺乳动物与其他恒温动物(主要是鸟类)。
一旦构造了决策树,对检验记录进行分类就相当容易了。从树的根节点开始,将测试条件用于检验记录,根据测试结果选择适当的分支。沿着该分支或者到达另一个内部结点,使用新的测试条件,或者到达一个叶节点。到达叶节点之后,叶节点的类称号就被赋值给该检验记录。例如,下图显示应用决策树预测火烈鸟的类标号所经过的路径,路径终止于类称号为非哺乳动物的叶节点。
4.3.2 如何建立决策树
原则上讲,对于给定的属性集,可以构造的决策树的数目达指数级。尽管某些决策树比其他决策树更准确,但是由于搜索空间是指数规模的,找出最佳决策树在计算上是不可行的。尽管如此,人们还是开发了一些有效的算法,能够在合理的时间内构造出具有一定准确率的次最优决策树。这些算法通常都采用贪心策略,在选择划分数据的属性时,采取一系列局部最优决策来构造决策树。Hunt算法是一种这样的算法。Hunt算法是许多决策树算法的基础,包括ID3、C4.5和CART。本节讨论Hunt算法并解释它的一些设计问题。
1. Hunt算法
在Hunt算法中,通过将训练记录相继划分成较纯的子集,以递归方式建立决策树。设Dt是与节点t相关的训练记录集,而y={y1,y2,...,yc}是类标号,Hunt算法的递归定义如下:
(1)如果Dt中所有记录都属于用一个类yt,则t是叶节点,用yt标记。
(2)如果Dt中包含属于多个类的记录,则选择一个属性测试条件(attribute test condition),将记录划分成较小的子集。对于测试条件的每个输出,创建一个子女节点,并根据测试结果将Dt中的记录分布到子女节点中。然后对于每个子女节点,递归地调用该算法。
为了解释该算法如何执行,考虑如下问题:预测贷款申请者是会按时归还贷款,还是会拖欠贷款。对于这个问题,训练数据集可以通过考察以前贷款者的贷款记录来构造。下图所示的例子中,每条记录都包含贷款者的个人信息,以及贷款者是否拖欠贷款的类标号。
该分类问题的初始决策树只有一个节点,类标号为“拖欠贷款者=否”,意味着大多数贷款者都按时归还贷款。然而,该树需要进一步细化,因为根节点包含两个类的记录。根据“有房者”测试条件,这些记录被划分为较小的子集,如图(b)所示。选取属性测试条件的理由稍后讨论,目前,我们假定此处这样选择是划分数据的最优标准。接下来,对根节点的每个子女递归地调用Hunt算法。从上图给出的训练数据集可以看出,有房的贷款者都能按时偿还了贷款,因此,根节点的左子女为叶节点,标记为“拖欠贷款者=否”。对于右子女,我们需要继续递归地调用Hunt算法,知道所有的记录都属于同一类为止。每次递归调用所形成的决策树显示在图(c)图(d)中。
如果属性值的每种组合都在训练数据集中出现,并且每种组合都具有唯一的类标号,则Hunt算法是有效的。但是对于大多数实际情况,这些假设太苛刻了。因此,需要附加的条件来处理以下的情况。
(1)算法的第二步锁创建的子女节点可能为空,即不存在与这些结点相关联的记录。如果没有一个训练记录包含与这样的节点相关联的属性值组合,这种情形就可能发生。这时,该节点称为叶节点,类标号为其父节点上训练记录中的多数类。
(2)在第二步,如果与Dt相关联的所有记录都具有相同的属性值,则不可能进一步划分这些记录。在这种情况下,该结点为叶结点,其标号与该结点相关联的训练记录中的多数类。
2. 决策树归纳的设计问题
决策树归纳的学习算法必须解决下面的两个问题:
(1)如何分裂训练记录? 树增长过程的每个递归步都必须选择一个属性测试条件,将记录划分成较小的子集。为了实现这个步骤,算法必须提供为不同类型的的属性指定测试条件的方法,并且提供评估每种测试条件的客观度量。
(2)如何停止分裂过程? 需要有结束条件,以终止决策树的生长过程。一个可能的策略是分列二结点,直到所有的记录都属于同一个类,或者所有的记录都具有相同的属性值。尽管两个结束条件对于结束决策树归纳算法都是允许的,但是还可以使用其他的标准提前终止树的生长过程。提前终止的优点将在4.4.5节讨论。
4.3.3 表示属性测试条件的方法
决策树归纳算法必须为不同类型的属性提供表示属性测试条件和其对应输出的方法。
二元属性 二元属性的测试条件产生两个可能的输出,如下图所示:
标称属性 由于标称属性有多个属性值,它的测试条件可以用两种方法表示,对于多路划分,其输出数取决于该属性值的个数。例如,如果属性婚姻状况有三个不同的属性值---单身、已婚、离异,则它的测试条件就会产生一个三路划分。另一方面,某些决策树算法(如CART)只产生二元化分,它们考虑创建k个属性值的二元化分的所有2^(k-1)-1种方法。图(b)显示了把婚姻状况的属性值划分为两个子集的三种不同的分组方法。
序数属性 序数属性也可以产生二元或多路划分,只要不违背序数属性值的有序性,就可以对属性值进行分组。下图显示了按照属性衬衣尺码划分训练记录的不同的方法。图(a)和图(b)中的分组保持了属性值间的序关系,而图(c)所示的分组则违反了这一性质,因为它把小号和大号分为一组,把中号和加大号放在另一组。
连续属性 对于连续属性来说,测试条件可以是具有二元输出的比较册书(A输出的范围查询。下图显示了这些方法的差别。对于二元划分,决策树算法必须考虑所有可能的划分点v,并从中选择产生最佳划分的点。对于多路划分,算法必须考虑所有可能的连续值区间。可以采用2.3.6节介绍的离散化的策略,离散化之后,每个离散化区间赋予一个新的序数值,只要保持有序性,相邻的值还可以聚集成较宽的区间。
4.3.4 选择最佳划分的度量
有很多度量可以用来确定划分记录的最佳方法,这些度量用划分谦和划分后记录的类分布定义。
设p(i|t)表示给定结点t中属于类i的记录所占的比例,有时,我们省略结点t,直接Pi表示该比例。在两类问题中,任意结点的类分布都可以记录(p0,p1),其中p1=1-p0。例如,考虑下图中的测试条件,划分前的类分布时(0.5,0.5),因为来自每个类的记录数相等。如果使用性别属性来划分数据,则子女结点的类分布分别为(0.4,0.4)和(0.4,0.6),虽然划分后两个类的分布不再平衡,但是子女结点仍然包含两个类的记录;按照第二个属性车型进行划分,将得到纯度更高的划分。
选择最佳划分的度量通常是根据划分后子女结点不纯性的程度。不纯的程度越低,类分布就越倾斜。例如,类分布为(0,1)的结点具有零不纯性,而均衡分布(0.5,0.5)的结点具有最高的不纯性。不纯性度量的例子包括:
其中c是类的个数,并且在计算熵时,Olog20=0。
下图显示了二分类问题不纯性度量值的比较,p表示属于其中一个类的记录所占的比例。从图中可以看出,三种方法都在类分布均衡时(即当p=0.5时)达到最大值,而当所有记录都属于同一个类时(p等于1或0)达到最小值。下面我们给出三种不纯性度量方法的计算实例。
从上面的例子及上图可以看出,不同的不纯性度量是一致的。根据计算,结点N1具有最低的不纯性度量值,接下来依次是N2,N3,虽然结果是一致的,但是作为测试条件的属性选择仍然因不纯性度量的选择而异。
为了确定测试条件的效果,我们需要比较父结点(划分前)的不纯程度和子女结点(划分后)的不纯程度,它们的差越大,测试条件的效果就越好,增益是一种可以用来确定划分效果的标准:
其中,I(.)是给定结点的不纯性度量,N是父结点上的记录总数,k是属性值的个数N(v=vj)是与子女结点vj相关联的记录个数。决策树归纳算法通常选择最大化增益的测试条件,因为对所有的测试条件来说,I(parent)是一个不变的值,所以最大化增益等价于最小化子女结点的不纯性度量的加权平均值。最后,当选择熵(entropy)作为上述公式的不纯性度量时,熵的差就是所谓信息增益(information gain)。
1. 二元属性的划分
考虑4-14中的图表,假设有两种方法将数据划分成较小的子集。划分前,Gini指标等于0.5,因为属于两个类的记录的个数相等。如果选择属性A划分数据,节点N1的Gini指标等于0.486,而N2的Gini指标等于0.480,派生结点的Gini指标的加权平均为(7/12)*0.4898+(5/12)*0.480=0.486。类似的,我们可以计算属性B的Gini指标甲醛平均值是0.371。因为属性B具有更小的Gini指标,它比属性A更可取。
2. 标称属性的划分
正如前面提到的,标称属性可以产生二元划分或多路划分。如图4-15所示。二元划分的Gini指标与计算与二元属性类型。对于车型属性第一种二元分组,{运动,豪华}的Gini指标是0.4922,而{家用}的Gini指标是0.3750。该分组的Gini指标加权平均是:
16/20*0.4922 + 4/20*0.3750=0.468
类似的,对第二种二元分组{运动}和{家用,豪华},Gini指标加权平均是0.167。第二种分组的Gini指标值相对较低,因为其对应的子集的纯度高的多。
对于多路划分,需要计算每个属性值Gini指标。Gini({家用{)=0.375,Gini({运动})=0,Gini({豪华})=0.219,多路划分的总Gini指标等于:
4/20*0.375 + 8/20*0 + 8/20*0.219 = 0.163
多路划分的Gini指标比两个二元划分都小,这一结果并不奇怪,因为二元划分实际上合并了多路划分的某些输出,自然降低了子集的纯度。
3. 连续属性的划分
考虑图4-16所示的例子,其中测试条件“年收入≤v”用来划分拖欠贷款分类问题的训练数据,用穷举法确定v的值,将N各记录中所有的属性值都作为候选划分点。对每个候选v,都要扫描一次数据集,统计年收入大于和小于v的记录数,然后计算每个候选的Gini的指标,并从中选择具有最小值的候选划分点。这种方法的计算代价是昂贵的,因为对每个候选划分点计算Gini指标需要O(N)次操作,由于有N个候选,总的计算复杂度为O(N^2)。为了降低计算复杂度,按照年收入将训练记录排序,所需要的时间为O(NlogN),从两个相邻的排过序的属性值中选择中间值作为候选划分点,得到候选划分点55,56,72等。无论如何,与穷举方法不同,在计算候选划分点的Gini指标时,不需要考察所有N个记录。
对第一个候选v=55,没有年收入小于55K的记录,所以年收入<55k的派生结点的Gini指标是0;另一方面,年收入大于或等于55K的样本记录数目分别为3(类Yes)和7(类No),这样,该结点的Gini指标是0.420.该候选划分的总Gini指标等于0*0+1*0.420=0.420。
..........
4. 增益率
熵和Gini指标等不纯性度量去向有利于具有大量不同值的属性。图4-12显示了三种可供选择的测试条件。第一个测试条件性别与第二个测试条件车型相比,容易看出车型视乎提供了更好的划分数据的方法,因为它产生更纯的派生结点。而然,如果将这两个条件与顾客ID相比,后者看起来产生更纯的划分,但顾客ID却不是一个有预测性的属性,因为每个样本在该属性上的值都是唯一的。即使在不太极端情形下,也不会希望产生大量输出的测试条件,因为与每个划分相关联的记录太少,以致不能做出可靠的预测。
解决该问题的策略有两种。第一种策略是限制测试条件只能是二元划分,CART这样的决策树算法采用的就是这种策略;另一种策略是修改评估划分的标准,把属性测试条件产生的输出数也考虑进去。例如,决策树算法C4.5采用称作增益率(gain ratio)的划分标准来评估划分。增益率定义如下:
其中,划分信息,而k是划分的总数。例如,如果每个属性值具有相同的记录数,则
,而信息划分等于Log2K。这说明如果某个属性产生了大量的划分,它的划分信息将会很大,从而降低了增益率。
4.3.5 决策树归纳算法
算法4.1给出了称作TreeGrowth的决策树归纳算法的框架。该算法的输入是训练记录集E合属性集F。算法递归地选择最优的属性来划分数据(步骤7),并扩展树的叶结点(步骤11和步骤12),知道满足结束条件(步骤1)。算法的细节如下:
(1)函数createdNode()为决策树建立新结点。决策树的节点或者是一个测试条件,记作mode.test_cond,或者是一个类标号,记作node.label。
(2)函数find_best_split()确定应当选择哪个属性作为划分训练记录的测试条件。如前所述,测试条件的选择取决于使用哪种不纯性度量来评估划分,一些广泛使用的度量包括熵、Gini指标和X2统计量。
(3)函数Classify()为叶结点确定类标号。对于每个叶结点t,令P(i|t)表示该节点上属于类i的训练记录所占的比例,在大多数情况下,都将叶结点指派到具有多数记录的类:
leaf.label=argmax p(i|t)
其中,操作argmax返回最大化p(i|t)的参数值i。p(i|t)除了提供确定叶结点类标号所需要的信息之外,还可以用来估计分配到叶结点t的记录属于类i的概率。5.7节讨论如何使用这种概率估计,在不同的代价函数下,确定决策树的性能。
(4)函数stopping_cond()通过检查是否所有的记录都属于同一个类,或者都具有相同额属性值,决定是否终止决策树的增长。终止递归函数的另一种方法是,检查记录数是否小于某个最小阈值。
建立决策树之后,可以进行树剪枝(tree-pruning),以减小决策树的规模。决策树过大容易受所谓过分拟合(overfitting)现象的影响。通过修建初始决策树的分支,剪枝有助于提高决策树的泛化能力。过分拟合和树剪枝问题将在4.4更详细的讨论。
4.3.6 例子,Web机器人检测
web使用挖掘就是利用数据挖掘的技术,从web访问日志中提取有用的模式。这些模式能够提示站点访问者的一些有趣特性:例如,一个人频繁地访问某个web站点,并打开介绍同一产品的网页,如果商家提供一些打折或者免费运输的优惠,这个人很可能会购买这种商品。
在web使用挖掘中,重要的是要区分用户访问和web机器人(web robot)访问。web机器人(又称为web爬虫)是一个软件程序,它可以自动跟踪嵌入网页中的超链接,定位和获取Internet上的信息。这些程序安装在搜索引擎的入口,收集索引网页必须的文档。在应用web挖掘技术分析人类的浏览习惯之前,必须过滤掉web机器人的访问。
本节介绍如何使用决策树分类法来区分正常的用户访问和由web机器人产生的访问。输入数据取自web服务器日志,它的一个样本显式在图4-17a中,每行对应于web客户(用户或web机器人)的一个页面访问请求。web日志记录的字段包括客户端的IP地址、请求的时间戳、请求访问的文档的网址、文档的大小、客户的身份(通过用户代理字段获得)。web会话是客户在一次网站访问期间发出的请求序列,每个web会话都可以用有向图来建模,其中节点对应于网页,而有向边对应于连接网页的超链,图4-17b显示web服务器日志中第一次web绘画的图形表示。
为了对web会话进行分类,需要构造描述每次会话特性的特征。图4-17c显示了web机器人检测任务使用的一些特征。显著的特征有遍历的深度和宽度。深度确定请求页面的最大距离,其中距离用自网站入口点的超链数量度量。例如,假设主页http://www.cs.umn.edu/~kumar的深度为0,则http://www.cs.umn.edu/~kumar/MINDS/MINDS_papers.htm的深度为2。根据图4-17b中的web图,第一次会话的深度等于2。宽度属性度量web图的宽度。例如,图4-17b中显示的web会话的宽度等于2。
用于分类的数据集包含2916个记录,web机器人(类1)和正常用户(类2)会话的个数相等,10%的数据用于训练,而90%的数据用于检验。生成的决策树模型显示在图4-18中,该决策树在训练集上的错误率为3.8%,在检验集上的错误率为5.3%。
该模型表明可以从以下4个方面区分出web机器人和正常用户。
(1)web机器人的访问倾向于宽而浅,而正常用户访问比较集中(窄而深)。
(2)与正常的用户不同,web机器人很少访问与web文档相关的图片页。
(3)web机器人的会话的长度趋于较长,包含了大量请求页面。
(4)web机器人更可能对相同的文档发出重复的请求,因为正常用户访问的网页常常会被浏览器保存。
4.3.7 决策树归纳的特点
下面是对决策树归纳算法重要特点的总结。
(1)决策树归纳是一种构建分类模型的非参数方法。换句话说,它不要求任何先验假设,不假定类和其他属性服从一定的概率分布。
(2)找到最佳的决策树是NP完全问题。许多决策树算法都采取启发式的方法指导对假设空间的搜索。例如,4.3.5节中介绍的算法就采用了一种贪心的、自顶向下的递归划分策略建立决策树。
(3)已开发的构建决策树技术不需要昂贵的计算代价,即使训练集非常大,也可以快速建立模型。此外,决策树一旦建立,位置样本分类非常快,最坏情况下的时间复杂度是O(w),其中w是树的最大深度。
(4)决策树相对容易解释,特别是小型的决策树,在很多简单的数据集上,决策树的准确率也可以与其他分类算法相媲美。
(5)决策树是学习离散值函数的典型代表。然而,它不能很好地推广到某些特定的布尔问题。一个著名的例子是奇偶函数,当奇数(偶数)个布尔属性为真时其值为0(1)。对这样的函数准确建模需要一颗具有2d个结点的满决策树,其中d是布尔属性的个数。
(6)决策树算法对于噪声的干扰具有相当好的鲁棒性,采用避免过分拟合的方法之后尤其如此。避免过分拟合的方法将在4.4节介绍。
(7)冗余属性不会对决策树的准确率造成不利的影响。一个属性如果在数据中它与另一个属性是强相关的,那么它是冗余的。在两个冗余的属性中,如果已经选择其中一个作为用于划分的属性,则另一个将被忽略。然而,如果数据集中含有很多不相关的属性(即对分类任务没有用的属性),则某些不相关属性可能在树的构造过程中偶然被选中,导致决策树过大庞大。通过在预处理阶段删除不相关属性,特征选择技术能够版主提高决策树的准确率。将在4.4.3节考察不相关属性过多的问题。
(8)由于大多数的决策树算法都采用自顶向下的递归划分方法,因此沿着树向下,记录会越来越少。在叶结点,记录可能太少,对于叶结点代表的类,不能做出具有统计意义的判决,这就是所谓的数据碎片(data fragmentation)问题。解决该问题的一种可行的方法是,当样本小于某个特定阈值时停止分裂。
(9)子树可能在决策树中重复多次,如图4-19所示,这使得决策树过于复杂,并且可能更难解释。当决策树的每个内部结点都依赖单个属性测试条件时,就会出现这种情形。由于大多数的决策树算法都采用分治划分策略,因此在属性空间的不同部分可以使用相同的测试条件,从而导致子树重复问题。
(10)迄今为止,本章介绍的测试条件每次都只涉及一个属性。这样,可以将决策树的生长过程看成划分属性空间为不相交的区域的过程,直到每个区域都只包含同一类的记录(见图4-20)。两个不同类的相邻区域之间的边界称作决策边界(decision boundary)。由于测试条件只涉及单个属性,因此决策边界是直线,即平行于“坐标轴”,这就限制了决策树对连续属性之间复杂关系建模的表达能力。图4-21显示了一个数据集,使用一次只涉及一个属性的测试条件的决策树算法很难有效地对它进行分类。
斜决策树(oblique decision tree)可以克服以上的局限,因为它允许测试条件涉及多个属性。图4-21中的数据集可以很容易地用斜决策树表示,该斜决策树只有一个结点,其测试条件为:
x+y<1
尽管这种技术具有更强的表达能力,并且能够产生更紧凑的决策树,但是为给定的结点找出最佳测试条件的计算可能是相当复杂的。
构造归纳(constructive induction)提供另一种将数据划分成齐次非矩形区域的方法(见2.3.5节),该方法创建符合属性,代表已有属性的算术或逻辑组合。新属性提供了更好的类区分能力,并在决策树归纳之前就增广到数据集中。与斜决策树不同,构造归纳不需要昂贵的花费,因为在构造决策树之前,它只需要一次性地确定属性的所有相关组合。相比之下,在扩展每个内部结点时,斜决策树都需要动态地确定正确的属性组合。然而,构造归纳会产生冗余的属性,因为新创建的属性是已有属性的组合。
(11)研究表明不纯性度量方法的选择对决策树算法的性能的影响很小,这是因为许多度量方法相互之间都是一致的,如图4-13所示,实际上,树剪枝对最终决策树的影响比不纯性度量选择的影响更大。
4.4 模型的过分拟合
分类模型的误差大致分为两种:训练误差(training error)和泛化误差(generalization error)。训练误差也称再代入误差(resubstitution error)或表现误差(apparent error),是在训练记录上误分类样本比例,而泛化误差是模型在未知记录上的期望误差。
回顾4.2节,一个好的分类模型不仅要能够很好地拟合训练数据,而且对未知样本也要能准确地分类。换句话说,一个好的分类模型必须具有低训练误差和低泛化误差。这一点非常重要,因为对训练数据拟合度过高的模型,其泛化误差可能比具有较高训练误差的模型高。这种情况就是所谓的模型过分拟合。
二维数据过分拟合的例子 关于过分拟合问题的具体例子,考虑图4-22所示的二维数据集。数据集中的数据点属于两个类,分别标记为类“0”和类“+”,类“0”的数据点由三个高斯分布混合产生,而类“+”的数据点用一个均匀分布产生。数据集中,总共有1200个数据点是属于类“0”,1800个属于类“+”,其中30%的点用于训练,剩下的70%用于检验。对训练集使用以Gini指标作为不纯性度量的决策树分类。为了研究过分拟合的影响,对初始的、完全生长的决策树进行了不同程度的剪枝。图4-23显示了决策树的训练误差和检验误差。
注意,当决策树很小时,训练和检验误差都很大,这种情况称作模型拟合不足(model underfitting)。出现拟合不足的原因是模型尚未学习到数据的真实结构,因此,模型在训练集合检验集上的性能都很差。随着决策树中结点数的增加,模型的训练误差和检验误差都会随之降低。然而,一旦树的规模变得太大,即使训练误差还在继续降低,但是检验误差开始增大,这种现象称为模型过分拟合(model overfitting)。
为了理解过分拟合现象,注意模型的训练误差随模型的复杂度增加而降低。例如,可以扩展树的叶结点,直到它完全拟合训练误差为0,但是检验误差可能很大,因为该树可能包含这样的结点,它们偶然地拟合训练数据中某些噪声。这些结点降低了决策树的性能,因为它们不能很好的泛化到检验样本。图4-24是两颗具有不同结点数的决策树,结点树少的决策树具有较高的训练误差,但是与更复杂的树相比,它具有较低的检验误差。
过分拟合与拟合不足是两种与模型复杂度有关的异常现象。本节余下的部分将继续讨论造成模型过分拟合的一些潜在因素。
4.4.1 噪声导致的过分拟合
考虑表4-3和表4-4中哺乳动物的分类问题的训练数据集合和检验数据集合。十个训练记录中有两个被错误地标记:蝙蝠和鲸被错误地标记为非哺乳类动物,而不是哺乳动物。
完全拟合训练数据的决策树实现在图4-25a中。虽然该树的训练误差为0,但它在检验数据上的误差高达30%。人和海豚都被误分类为非哺乳类动物,因为它们在属性体温、胎生、4条腿上的属性值与训练数据中被错误标记的样本属性值相同。另一方面,针鼹是个例外,其检验记录中的类标号与训练集中相似的记录的类标号相反。例外导致的错误是不可避免的,它设定了分类器可以达到的最小错误率。
相反,图4-25b中决策树M2具有较低的检验误差(10%),尽管它的训练误差较高(20%)。很明显,决策树M1过分拟合了训练数据,因为存在一个更简单、但在检验数据集上具有更低检验误差的模型。模型M1中的属性测试条件4条脚具有欺骗性,因为它拟合了无标记的训练记录,导致了对检验集中记录的五分类。
4.4.2 缺乏代表性样本导致的过分拟合
根据少量训练记录做出分类决策的模型也容易受过分拟合的影响。由于训练数据缺乏具有代表性的样本,在没有多少训练记录的情况下,学习算法仍然继续细化模型就会产生这样的模型。下面举例说明。
考虑表4-5中的五个训练记录,表中所有的记录都是正确标记的,对应的决策树在图4-26中。尽管它的训练误差为0,但是它的检验误差却高达30%。
人、大象和海豚都被误分类,因为决策树把很温但不冬眠的脊柱动物划分为非哺乳动物。决策树做出这样的分类决策是因为只有一个训练记录具有这样的特征。这个例子清楚地表明,当决策树的叶结点没有足够的代表性样本时,很可能做出错误的预测。
4.4.3 过分拟合与多重比较过程
模型的过分拟合可能出现在使用所谓的多重比较过程(multiple comparison procedure)的学习算法中。为了理解多重比较过程,考虑预测未来10个交易日股市是升还是降的任务。如果股票分析家简单地随机猜测,则对任意交易日预测正确的概率是0.5,然而,10次猜测至少正确预测8次的概率是。
这看起来不大可能。
假设我们想从50个股票分析家中选择一个投资顾问,策略是选择在未来的10个交易日做出最多正确预测的分析家。该策略的缺点是,即使所有的分析家都用随机猜测做出预测,至少有一个分析家做出8次正确预测的概率是:
这相当高,尽管每个分析家做出8次正确预测的概率很低。但是把他们放在一起,找到一个能够做出准确的预测。
......
4.4.4 泛化误差估计
虽然过分拟合的主要原因一直是个争议的话题,大家还是普遍同意模型的复杂度对模型的过分拟合有影响。如图4-23所示。问题是,如何确定正确的模型复杂度?理想的复杂度是能产生最低泛化误差的模型的复杂度。然而,在简历模型的过程中,学习算法只能访问训练数据集(见图4-3),对检验数据集,它一无所知,因此也不知道所建立的决策树在未知记录上的性能。我们所能做的就是估计决策树的泛化误差。本节提供一些估计泛化误差的方法。
1. 使用再代入估计
再代入估计方法假设训练数据集可以很好地代表整体数据,因而,可以使用训练误差(又称再代入误差)提供对泛化误差的乐观估计。在这样的前提下,决策树归纳算法简单地选择产生最低训练误差的模型作为最终的模型。然而,训练误差通常是泛化误差的一种很差的估计。
例4.1 考虑图4-27中的二叉决策树,假设两棵决策树都由相同的训练数据产生,并且都根据每个叶结点多数类做出分类决策。注意,左边的树TL复杂一些,它扩展了右边决策树TR的某些叶结点。左决策树的训练误差是e(TL)=4/24=0.167,而右决策树的训练误差是e(TR)=6/24=0.25。根据再代入估计,左决策树要优于右决策树。
2. 结合模型复杂度
如前所述,模型越是复杂,出现过分拟合的几率就越高。因此,我们更喜欢采用较为简单的模型。这种策略与应用众所周知的奥卡姆剃刀(Occam's razor)或节俭原则(principle of parsimony)一致。
定义4.2 奥卡姆剃刀:给定两个具有相同泛化误差的模型,较简单的模型比较复杂的模型更可取。
奥卡姆剃刀是很直观的原则,因为复杂模型中的附加成分很大程度上是完全对偶然的拟合。用爱因斯坦的话来说,“所有事情都应该尽可能的简单,但不是简化。”下面我们介绍两种把模型复杂度与分类模型评估结合在一起的方法。
悲观误差评估 第一种方法明确地把使用训练误差与模型复杂度罚项的和计算泛化误差。结果泛化误差可以看做模型的悲观误差估计(pessimistic error estimate)。例如,设n(t)是结点t分类的训练数据记录,e(t)是被误分类的记录数。决策树T的悲观误差估计eg(T)可以用下式计算:
其中,k是决策树的叶结点数,e(T)决策树的总训练误差,Nt是训练记录数,Ω(ti)是每个结点ti对应的罚项。
例4.2 考虑图4-27中的二叉决策树,如果罚项等于0.5,左边的决策树的悲观误差估计为:
右边的决策树的悲观误差估计为:
这样,左边的决策树比右边的决策树具有更好的悲观误差估计。对二叉树来说,0.5的罚项意味着只要至少能够改善一个训练记录的分类,结点就应当扩展。因为扩展一个结点等价于总误差增加0.5,代价比犯一个训练错误小。
如果对于所有的结点t,Ω(t)=1,左边的决策树的北瓜误差估计为eg(TL)=11/24=0.458,右边的决策树的悲观误差估计为eg(TR)=10/24=0.417。因此,右边的决策树比左边的决策树具有更好的悲观错误率。这样,除非能够减少一个以上训练记录的误分类,否则结点不应当扩展。
最小描述长度原则 另一种结合模型复杂度的方法是基于称作最小描述长度(minimum description lenght,MDL)原则的信息论方法。为了解释说明该原则,考虑图4-28中的例子。在该例子中,A和B都是已知属性x值的给定记录集。另外,A知道每个记录的确切类标号,而B却不知道这些信息。B可以通过要求A顺序传送类标号而获得每个记录的分类。一条消息需要θ(n)比特的信息,其中n是记录的总数。
另一种可能是,A决定建立一个分类模型,概括x和y之间的关系。在传送给B前,模型用压缩形式编码。如果模型的准确率是100%,那么传输的代价就等于模型编码的代价。否则,A还必须传输哪些记录被模型错误分类信息。传输的总代价是:
其中,等式右边的第一项是模型编码的开销,而第二项是五分类记录编码的开销。根据MDL原则,我们寻找最小化开销函数的模型。
3. 估计统计上节
......
4. 使用确认集
在该方法中,不是用训练集泛化误差,而是把原始的训练数据集分为两个较小的子集,一个子集用于训练,而另一个称作确认集,用于估计泛化误差。典型的做法是,保留2/3的训练数据集来建立模型,剩余的1/3用作误差估计。
该方法常常用于通过参数控制获得具有不同复杂度模型的分类技术。通过调整学习算法中的参数(如决策树中剪枝的程度),知道学习算法产生的模型在确认集上达到最低的错误率。可以估计最佳模型的复杂度。虽然该方法为评估模型在未知样本上的性能提供了较好的办法,但用于训练的记录也减少了。
4.4.5 处理决策树归纳中的过分拟合
在前面章节中,我们介绍了一些估计分类模型泛化误差的方法。对于泛化误差可靠的估计能让学习算法搜索到准确的模型,而不会对训练数据集过分拟合。本节介绍两种在决策树归纳上避免过分拟合的策略。
先剪枝(提前终止规则) 在这种方法中,树增长算法在产生完全拟合整个训练数据集的完全增长的决策树之前就停止决策树的生长。为了做到这一点,需要采用更具有限制性的结束条件,例如,当观察到的不纯性度量的增益(或估计的泛化误差的改进)低于某个确定的阈值时就停止扩展叶结点。这种方法的优点在于避免产生过分拟合训练数据的过于复杂的子树。然而,很难为提前终止选择正确的阈值。阈值太高将导致拟合不足的模型,而阈值太低就不能充分地解决过分拟合的问题。此外,即便使用已有的属性测试条件得不到显著的增益,接下来的划分也可能产生较好的子树。
后剪枝 在该方法中,初始决策树按照最大规模生长,然后进行剪枝的步骤。按照自底向上的方式修建完全增长的决策树。修剪有两种做法:(1)用新的叶结点替换子树,该叶结点的类标号由树下记录中的多数类确定;或者(2)用子树中最长使用的分支代替子树。当模型不能再改进时终止剪枝步骤。与先剪枝相比,后剪枝技术倾向于产生更好的结果,因为不像先剪枝,后剪枝是根据完全增长的决策树做出的剪枝决策。先剪枝则可能过早终止决策树的生长。然后,对于后剪枝,当子树被剪掉后,生长完全决策树的额外的计算就被浪费了。
图4-29展示了4.3.6节web机器人检测的简化后的决策树模型。注意跟在depth=1的子树已经用涉及属性ImagePages的一个分支替换,这种方法又称子树提升(subtree raising);depth>1且MultiAgent=0的子树被类标号为0的叶结点替换,这种方法称作子树替换(subtree replacement);depth>1且MultiAgent=1的子树完整保留。
4.5 评估分类器的性能
4.4.4节中介绍了集中在训练过程中估计模型泛化误差的方法。估计误差有助于学习算法进行模型选择(model selection),即找到一个具有合适复杂度、不易发生过拟合的模型。模型一旦建立,就可以应用到检验数据集上,预测未知记录的来标号。
测试模型在检验集上的性能是有用的,因为这样的测量给出模型泛化误差的无偏估计。在检验集上计算出的准确率或错误率可以用来比较不同分类器在相同领域上的性能。然而,为了做到这一点,检验记录的类标号必须是已知的。本节回顾一些常用的评估分类器性能的方法。
4.5.1 保持方法
在保持(Holdout)方法中,将被标记的原始数据划分成两个不相交的集合,分别称为训练集合检验集。在训练数据集上归纳分类模型,在检验集上评估模型的性能。训练集和检验集的划分比例通常根据分析家的判断(例如,50-50,或者2/3作为训练集,1/3作为检验集)。分类器的准确率根据模型在检验集上的准确率估计。
保持方法有一些众所周知的局限性。第一,用于训练的被标记样本较少,因为要保留一部分记录用于检验。因此,建立的模型不如使用所有被标记样本建立的模型好。第二,模型可能高度依赖于训练集和检验集的构成。一方面,训练集越小,模型的方差越大。另一方面,如果训练集太大,根据用较小的检验集估计的准确率又不太可靠。这样的估计具有很宽的置信区间。最后,训练集合检验集不再是相互独立的。因为训练集和检验集来源于同一个数据集,在一个子集中超出比例的类在另一个子集就低于比例,反之亦然。
4.5.2 随机二次抽样
可以多次重复保持方法来改进对分类器性能的估计,这种方法称作随机二次抽样。设acci是第i次迭代的模型的准确率,总准确率是。随机二次抽样也会遇到一些与保持方法同样的问题,因为在训练阶段也没有利用尽可能多的数据。并且,由于它没有控制每个记录用于训练和检验的次数,因此,有些用于训练的记录使用的频率可能比其他记录高很多。
4.5.3 交叉验证
替代随机二次抽样的一种方法时交叉验证(cross-validation)。在该方法中,每个记录用于训练的次数相同吗,并且恰好检验一次。为了解释该方法,假设把数据分为相同大小的两个子集,首先,我们选择一个子集作为训练集,而另一个做检验集,然后交换两个集合的角色,原先做训练集的现在做检验集,反之亦然,这种方法较二折交叉验证。总误差通过对两次运行的误差求和得到。在这个例子中,每个样本各做一次训练样本和检验样本。k折交叉验证是对该方法的推广,把数据分为大小相同的k分,在每次运行,选择其中一份做检验集,而其余的全部作为训练集,该过程重复k次,使得每份数据都用于检验恰好一次。同样,总误差是所有k次运行的误差纸之和。k折价差验证方法的一种特殊情况使令k=N,其中N是数据集的大小,在这种所谓留一(leave-one-out)方法中,每个检验集只有一个记录。该方法的优点是使用尽可能多的训练记录,此外,检验集之间是互斥的,并且有效地覆盖了整个数据集;该方法的缺点是整个过程重复N次,计算上开销很大,此外,因为每个检验集只有一个记录,性能估计度量的方法偏高。
4.5.4 自助法
迄今为止,我们介绍的方法都是假定训练记录采用不放回抽样,因此,训练集和检验集都不包含重复记录。在自助(boostrap)方法中,训练记录采用有放回抽样,即已经选座训练的记录将放回原来的记录集中,使得它等概率地被重新抽取。如果原始数据有N个记录,可以证明,平均来说,大小为N的自助样本大约包含原始数据中63.2%的记录。这是因为一个记录被自助抽样抽取的概率是1-(1-1/N)N,当N充分大时,该概率逐渐逼近1-e-1=0.632。没有抽中的记录就称为检验集的一部分,将训练集简历的模型应用到检验集上,得到自助样本准确率的一个估计εt。抽样过程重复b次,产生b个自助样本。
按照如何计算分类器的总准确率,有几种不同的自助抽样法。常用的方法之一是.632自助(.632 boostrap),它通过组合每个自助样本的准确率εt和由包含所有标记样本的训练集计算的准确率(accs)计算总准确率(accboot):