基于决策树的分类算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 分类的概念及分类器的评判
分类是数据挖掘中的一个重要课题。分类的目的是学会一个分类函数或分类模型(也常常称作分类器),该模型能把数据库中的数据项映射到给定类别中的某一个。分类可用于提取描述重要数据类的模型或预测未来的数据趋势。
分类可描述如下:输入数据,或称训练集(training set)是一条条记录组成的。每一条记录包含若干条属性(attribute),组成一个特征向量。训练集的每条记录还有一个特定的类标签(类标签)与之对应。该类标签是系统的输入,通常是以往的一些经验数据。一个具体样本的形式可为样本向量:(v1,v2,…,…vn:c)。在这里vi表示字段值,c表示类别。
分类的目的是:分析输入数据,通过在训练集中的数据表现出来的特性,为每一个类找到一种准确的描述或者模型。这种描述常常用谓词表示。由此生成的类描述用来对未来的测试数据进行分类。尽管这些未来的测试数据的类标签是未知的,我们仍可以由此预测这些新数据所属的类。注意是预测,而不能肯定。我们也可以由此对数据中的每一个类有更好的理解。也就是说:我们获得了对这个类的知识。
对分类器的好坏有三种评价或比较尺度:
预测准确度:预测准确度是用得最多的一种比较尺度,特别是对于预测型分类任务,目前公认的方法是10番分层交叉验证法。
计算复杂度:计算复杂度依赖于具体的实现细节和硬件环境,在数据挖掘中,由于操作对象是巨量的数据库,因此空间和时间的复杂度问题将是非常重要的一个环节。
模型描述的简洁度:对于描述型的分类任务,模型描述越简洁越受欢迎;例如,采用规则表示的分类器构造法就更有用。
分类技术有很多,如决策树、贝叶斯网络、神经网络、遗传算法、关联规则等。本文重点是详细讨论决策树中相关算法。
2 基于决策树的数据分类算法及其性能
2.1 ID3和C4.5算法
决策树技术是用于分类和预测的主要技术,决策树学习是以实例为基础的归纳学习算法。它着眼于从一组无次序、无规则的事例中推理除决策树表示形式的分类规则。它采用自顶向下的递归方式,在决策树的内部节点进行属性值的比较并根据不同属性判断从该节点向下的分支,然后进行剪枝,最后在决策树的叶节点得到结论。所以从根到叶节点就对应着一条合取
规则,整棵树就对应着一组析取表达式规则。基于决策树的分类有很多实现算法。ID3和C4.5是较早提出并普遍使用的决策树算法。
Quinlan提出的著名的ID3学习算法是较早的经典算法。它通过选择窗口来形成决策树,
是利用信息论中的互信息寻找训练集具有最大信息量的属性字段,建立决策树的一个节点,再根据该属性字段的不同取值建立树的分支;在每个分支子集中重复建立树的下层节点和分
支过程。C4.5算法和ID3算法相似,它是对ID3算法的一种改进,它是根据信息增益(Information Gain)值选择作为分裂结点的属性及标准,按照此标准将训练集分成若干个
子集。这两中种方法的优点是描述简单,分类速度快,分类较准确特别适合大规模的数据处理。但这两种算法是借用信息论中的互信息或信息增益作为单一属性能力的度量,试图减少树的平均深度,忽略了叶子数目的研究,其启发式函数并不是最优的,存在的主要问题还有:
(1)抗噪性差,训练例子中正例和反例较难控制。(2)在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。(3)这两种算法只适合于能够驻留于内存的数据集使用,当训练集大得无法在内存容纳时程序无法运行。
2.2 SLIQ算法
SLIQ算法对C4.5决策树分类算法的实现方法进行了改进。
一般决策树中,使用信息量作为评价节点分裂质量的参数,SLIQ算法中使用gini指标代替信息量,gini指标比信息量性能更好,且计算方便,对数据集包含n个类的数据集S,gini(S)定义为:
gini(S) = 1 - ∑pj*pj
pj是S中第j类数据的频率gini越小,Information Gain越大。
区别于一般的决策树SLIQ采用二分查找树结构对每个节点都需要先计算最佳分裂方案,然后执行分裂。
对于数值型连续字段分裂的形式A<=v。所以,可以先对数值型字段排序,假设排序后的结果为v1,v2,…,…vn,因为分裂只会发生在两个节点之间,所以有n-1种可能性。通常取中点(vi + vi+1)/2作为分裂点,从小到大依次取不同的split point,取Information Gain 指标最大(gini最小)的一个就是分裂点,因为每个节点都需要排序,所以这项操作的代价极大。
对于离散型字段(categorical attribute),设S(A)为A的所有可能的值,分裂测试将要取遍S的所有子集S'。寻找当分裂成S'和S-S'两块时的gini指标,取到gini最小的时候,就是最佳分裂方法。显然,这是一个对集合S的所有子集进行遍历的过程共需要计算2|S| 次,
代价也是很大的。
SLIQ算法对此采用了预排序的技术,以便能够消除在决策树的每个结点对数据集进行排序的需要。所谓预排序,就是针对每个属性的取值,把所有的记录按照从小到大的顺序进行排序。
在C4.5中,树的构造是按照深度优先策略完成的,需要对每个属性列表在每个结点处都进行一遍扫描,费时很多。SLIQ采用广度优先策略构造决策树,即在决策树的每一层只需对每个属性列表扫描一次,就可以为当前决策树中每个叶子结点找到最优分裂标准。
SLIQ的剪枝算法MDL属于迟滞剪枝(post-prunning)算法,通常的迟滞剪枝的数据源采用一个Training Set的一个子集或者与Training Set独立的数据集进行操作。
SLIQ算法具体实现
输入与输出:输入与输出采用下面的方案输入数据包括训练集配置信息(决策树大小) 输出数据包括用线性方式表示的二分决策树
算法的控制:算法的控制结构是一个队列,这个队列存放当前的所有叶子节点。这是为了控制广度优先搜索的结束。当队列空时,说明所有的叶子都已经被处理过,这时建树算法结束。
(1)数据准备
系统输入是训练集,训练集是样本向量(v1,v2,…,…vn :c)组成的集合,每个属性对应训练集的一列,训练集进入以后,分成一个一个的属性表: