决策树分类器

决策树分类器的基本流程

我们通过学习并构造分类器 。这里给出一个相当经典且流行的分类器——决策树分类器。
为什么这样评价这个分类器呢?因为构造这个分类器不需要任何领域的知识,也不需要任何的参数设置。因此它特别适合于探测式的知识发现。此外,这个分类器还可以处理高维数据,而且采用的是类似于树这种形式,也特别直观和便于理解。因此,决策树是许多商业规则归纳系统的基础。

关于决策树的发展,早期是从ID3到C4.5再到CART。这里选择ID3进行讲解。

其实,算法的思想很简单。就是以自顶向下递归的分治方式构造。

1:首先画一个单节点,接着进行学习。如果D(训练集)中的数据一上来直接就是统一的一类,那么就不需要再搞其他的了。直接把那个单节点变成叶子结点,并用类标记它就OK了。如果不是的话,就进行下一步。

2:接下来就进行第二步了。因为D中的数据不是统一的一类,所以按照决策树的思想,就要进行分支分类了。那么在这里,问题来了!!!大家注意,这一步应该算是最重要也是最繁复的一大步了,下面我会很仔细的说说。
我们说要进行分类,那么问题来了。我们首先按哪个顺序进行分类呢?
举个例子,训练集里面的一个元组的属性(除标号),有年龄(age),收入(income),职业(occupation),那么我是先按age分呢?还是按income分呢?还是occupation分呢?
大家千万不要以为随便按那个分就是了!
实际上,这里是很有讲究的。具体怎么分,哪个先哪个后要通过计算才能得出。
具体来说是这样的。attribute_list是候选的属性集合,而进行数据划分的依据是根据属性选择度量依次选择当前最合适的属性选择作为分裂属性。
在这里,大家注意两个关键词:属性选择度量当前最合适
属性选择度量是一种选择分裂准则,它决定这个数据怎么分。说白了就是一个指标;而最合适就是说白了就是比较这几个属性的当前指标值,哪个好就选哪个。
所以,这里实际上就变成了一道计算题:计算属性的选择度量。
属性的选择度量一般分为三个类型:Gain(信息增益)、Gainratio(增益率)、Giniindex(基尼指数)。这里的计算暂且先忽略,我们放到后面讲。总之大家搞清楚这三种指标之后,就知道该选择哪个属性优先了。

第三步:OK,我们在第二步计算出了指标,知道了该选择哪个属性进行数据划分。但在这里还没有完 ,我们还需要对根据分裂准则划分元组的情况进行讨论。即我们现在知道了是要划分哪个,但是应该分成什么样子这还需要我们进行考量。划分规则如下:
1.若A是离散值,则对A的每个已知值产生一个分枝;
2.若A是连续的,则产生两个分枝,分别对应于A《=split_point和A>split_point; (这里会涉及到split_point点该如何取值,我们放到后面去讲
3.若A是离散值的且必须产生二叉树,则应进行划分子集判断。

这里写图片描述

一般来说,划分完了之后就是这样:
这里写图片描述
OK,接下来就对D的每个结果分区D1,D2,D3……上的元组,使用同样的算法进行递归直至形成决策树。

那么这里既然提到了递归,那必然要设置终止条件。条件有三
1.当前结点包含的样本全属于同一类别,无需划分。
2.没有剩余属性可以用来进一步划分元组或者所有样本在所有属性上取值相同,则把当前结点标记为叶节点,并将其类别设定为该节点所含样本最多的类别。
3.给定的分枝没有元组,即分区为空,则把当前结点标记为叶节点,但将其类别设定为其父节点所含样本最多的类别。

OK,到这里,我们算法的基本流程就是这样了,下面我们一一来填上面留下的坑。

划分选择

决策树学习的关键是如何选择最优划分属性。一般而言,随着划分过程进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。因此,我们需要一些指标,来指示纯度。
西瓜书P75。这里说的很详细,包括公式解释和示例计算。

前面说了,早期归纳决策树的发展是从ID3到C4.5再到CART的。
这几种算法的主要区别就是关于属性选择度量的区别。
ID3使用的是Gain(信息增益,优先取大)
C4.5使用的是增益率(Gainratio,优先取大)
CART使用的是基尼指数(Giniindex,优先取小)

而选择那种属性度量最好呢,其实效果都还可以,而且差别不大。因为所有的度量都存在着某种偏差。
但是,可以确定的是,决策树归纳的时间复杂度一般是随着树的高度而呈指数增加。因此,我们一般来说,更倾向于产生较浅的树。但事实,我们又发现,深度较浅的树它的宽度又偏大,而宽度大的树呢,划分层次不够,错误率又比较高=。=
所以呢,尽管有一些 比较研究,但是并没有发现有哪一种度量比其他好太多,所以如何选择看自己吧,但还是比较倾向于较浅的,毕竟错误率较大的问题可以通过处理数据进行改善嘛。

剪枝处理

提高决策树分类器的准确率
OK,在上面我们说道,当我们从训练集里面训练出分类器之后,在进行分类预测之前,必须要做的一件事情是对这个分类器进行检验。如果说该分类器的准确率达到了我们的要求(阀值),那么这个分类器才能进行下一步的操作。
因此,准确率这个指标实际上是非常非常重要的,它直接确定了这个分类器合格与否。
那么,我们应该如何去提升分类器的准确率呢?
我们知道,在用训练集训练决策树的时候,训练集里面不可避免的会存在一些噪声和离群点。关于这些数据我们可以在数据预处理阶段进行处理,但是不可能完全处理得干净。所以,当处理效果不到位的时候,在决策树创建时,许多分枝实际上反映的是训练数据中的异常。这种异常肯定不是我们想要的,因此我们必须要对它进行处理。
KDD是一个持续的过程,因此,对于异常数据的处理也是一个持续的过程。因为我们没有办法一次就处理到位,所以我们在后续过程中必须不断地去做这些事情,而且不能完全依赖于前一处理步骤的结果,其实这是一种设计哲学。
那么,我们如何去处理决策树中的异常分枝呢?实际上很简单也很形象,就是用树剪枝的方法。
具体来说又分为两种常用的剪枝方法:预剪枝和后剪枝
预剪枝的设计思想如下:
在决策树的构建时,使用诸如统计显著性,Gainratio,Giniindex来评估划分的优劣。预剪枝是指在决策树生成过程中,对每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶节点,该树叶可以持有子集元组中最频繁的类。
这是可以理解的。因为我们知道,实际上我们构建决策树时,它的发展是在我们掌握之中的。例如我们可以根据属性决策度量来决定它先划分哪个后划分哪个。同理,如果说我明知道这样划分会造成异常分枝,那么我肯定就不这么做了啊。

后剪枝的设计思想如下:
后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换成叶节点能带来整颗决策树泛华性能的提升,则将该子树替换为叶节点。 这个用于替换的树叶通常来说其值是被删除的子树的频繁类。

值得注意的是,在那个数据量不大的时代里,决策树分类器的效果是很棒的。但是随着数据量的不断增大,尽管有剪枝,尽管有新的决策树算法,尽管有可视化的构建工具,但是他们可能仍然很大很复杂很难理解,还会有“重复”和“复制”的问题。这是由它本身的设计思想所决定,这些特点吧,在面对海量数据时,会被急剧的放大,从而影响它的准确率和可解释性。为此,我们需要更有效的分类器。这也促成了规则分类器和组合分类器的诞生和发展。

西瓜书P79给出了详细的示例。看这里的时候,注意:在剪枝后,使用检验集检验决策树泛化性能是否提升的时候,检测集是检验整个决策树的,而不是某一个子节点(子树)。

连续值处理

在上面将划分规则的时候,我们简单的提到了这样一条:

2.若A是连续的,则产生两个分枝,分别对应于A《=split_point和A>split_point;

这里就涉及到split_point点该如何取值
我们知道,由于连续属性的可取值数目不在有限,因此,不能直接根据连续属性的可取值来对节点进行划分。此时,连续属性离散化技术可派上用场。
西瓜书,P83讲得很清楚。其实这个split_point的值也是计算,然后再判别选择出来的。简单的来说,就是先对该连续属性a的所有样本的值进行排序,然后根据公式4.7,得到split_point的候选集合,然后依次把候选集中的值,代入公式4.8,计算出Gain值。我们最后取得就是使Gain值最大化的那个候选点。这个候选点就是我们的split_point。

缺失值处理

西瓜书P85
对于处理缺失值,我们可以有两种解决策略,第一是在数据预处理阶段,通过一些解决手段,比如:忽略它,人工填写它,使用一个全局度量来填充它等等(Jiawei的书,第三版P58页有具体谈到)。
还有一种就是我们直接去使用,但是要尽可能的降低这些缺失值带来的影响。
比如,这里提到的决策树中的处理缺失值问题。
我们知道,决策树在划分的时候,很重要的一个步骤是要去确定划分属性的选择,这涉及到属性划分度量的计算(Ent,Gain,Gainratio,Giniindex)。
我们前面在计算这些的时候,属性值都是完整的,因此只要根据公式来就行了。实际上,你如果去深究这些公式,你会发现,这些公式,毫无以为都会涉及到“比例”这个参数。
比如:


这里写图片描述
这里,p k就是比例。
还有这里:
这里写图片描述
D v/D也是比例。
包括,这里。

这里写图片描述
还有这里

这里写图片描述

都是有涉及到“比例”。其实这很好理解,因为我们对某一个具体的属性计算的时候,它只占训练集的一部分。
因此,我们同样把这种思想应用在处理缺失值上。而且因为是缺失值,所以这种比例参数的应用比完整的数据集应用得还要广泛。
西瓜书P85页,介绍得非常详细。
其实你要是看懂了它给出的例子,你就会发现,它的处理方式和上面说的完整的没有什么本质的区别。同样是计算各个属性的划分选择度量(Gain,Gainratio,Giniindex),然后选择最优的那一个。
有差别的就是在处理时,我们要尽可能的缩小它对整个训练集的影响,这其中的措施包括
1、在不完整的训练集中取一部分完整的训练集;
2、引入比例参数,尽量减少第一步带来的影响。
因此,在这里,我们引入了3个“比例参数”。


这里写图片描述
然后在计算的时候,我们也在公式中也确实用到了这几个“比例参数”。

这里写图片描述

所以,借助这几个参数和这些个推广的公式,我们能够在尽量减小负面影响的情况下,进行决策树分类器的属性划分。

当然了,这所有的一切实际上来说,都是缓解措施。
因此,有一个完整的,规范的,良好的数据集,对于学习算法来说是最好的。
OK,到这里,我们应该知道常用的决策树算法有ID3,C4.5和CART。它们都是采用贪心(即非回溯的)方法,自顶向下递归的分治方法构造
参考文章
数据挖掘(概念与技术)-第三版-Jiawei Han
决策树算法原理(上)
决策树算法原理(下)
机器学习-周志华

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值