# 数据挖掘十大经典算法--CART: 分类与回归树
> 来源:http://blog.csdn.net/u011067360/article/details/24871801
**一、决策树的类型 **
在数据挖掘中,决策树主要有两种类型:
分类树 的输出是样本的类标。
回归树 的输出是一个实数 (例如房子的价格,病人呆在医院的时间等)。
术语分类和回归树 (CART) 包含了上述两种决策树, 最先由Breiman 等提出.分类树和回归树有些共同点和不同点—例如处理在何处分裂的问题。
分类回归树(CART,Classification And Regression Tree)也属于一种决策树,之前我们介绍了基于ID3和C4.5算法的决策树。这里只介绍CART是怎样用于分类的。
分类回归树是一棵二叉树,且每个非叶子节点都有两个孩子,所以对于第一棵子树其叶子节点数比非叶子节点数多1。
CART与ID3区别:
CART中用于选择变量的不纯性度量是Gini指数;
如果目标变量是标称的,并且是具有两个以上的类别,则CART可能考虑将目标类别合并成两个超类别(双化);
如果目标变量是连续的,则CART算法找出一组基于树的回归方程来预测目标变量。
**二、构建决策树**
构建决策树时通常采用自上而下的方法,在每一步选择一个最好的属性来分裂。 "最好" 的定义是使得子节点中的训练集尽量的纯。不同的算法使用不同的指标来定义"最好"。本部分介绍一中最常见的指标。
有4中不同的不纯度量可以用来发现CART模型的划分,取决于目标变量的类型,对于分类的目标变量,可以选择GINI,双化或有序双化;
对于连续的目标变量,可以使用最小二乘偏差(LSD)或最小绝对偏差(LAD)。
下面我们只讲GINI指数。
GINI指数:
1、是一种不等性度量;
2、通常用来度量收入不平衡,可以用来度量任何不均匀分布;
3、是介于0~1之间的数,0-完全相等,1-完全不相等;
4、总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)
CART分析步骤
1、从根节点t=1开始,从所有可能候选S集合中搜索使不纯性降低最大的划分S*,然后,使用划分S*将节点1(t=1)划分成两个节点t=2和t=3;
2、在t=2和t=3上分别重复划分搜索过程。
基尼不纯度指标
在CART算法中, 基尼不纯度表示一个随机选中的样本在子集中被分错的可能性。基尼不纯度为这个样本被选中的概率乘以它被分错的概率。当一个节点中所有样本都是一个类时,基尼不纯度为零。
假设y的可能取值为{1, 2, ..., m},令fi是样本被赋予i的概率,则基尼指数可以通过如下计算:
![](https://box.kancloud.cn/2016-02-11_56bc530709f2a.jpg)
例如:
![](https://box.kancloud.cn/2016-02-11_56bc530717a6c.jpg)
上例是属性有8个,每个属性又有多少离散的值可取。在决策树的每一个节点上我们可以按任一个属性的任一个值进行划分。比如最开始我们按:
1)表面覆盖为毛发和非毛发
2)表面覆盖为鳞片和非鳞片
3)体温为恒温和非恒温
等等产生当前节点的左右两个孩子。下面我们按GINI指数划分有:
### GINI指数
总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。比如体温为恒温时包含哺乳类5个、鸟类2个,则:
![](https://box.kancloud.cn/2016-02-11_56bc53072c490.gif)
体温为非恒温时包含爬行类3个、鱼类3个、两栖类2个,则
![](https://box.kancloud.cn/2016-02-11_56bc5307378f8.gif)
所以如果按照“体温为恒温和非恒温”进行划分的话,我们得到GINI的增益(类比信息增益):
![](https://box.kancloud.cn/2016-02-11_56bc530742f74.gif)
最好的划分就是使得GINI_Gain最小的划分。
终止条件
一个节点产生左右孩子后,递归地对左右孩子进行划分即可产生分类回归树。这里的终止条件是什么?什么时候节点就可以停止分裂了?直观的情况,当节点包含的数据记录都属于同一个类别时就可以终止分裂了。这只是一个特例,更一般的情况我们计算χ2值来判断分类条件和类别的相关程度,当χ2很小时说明分类条件和类别是独立的,即按照该分类条件进行分类是没有道理的,此时节点停止分裂。注意这里的“分类条件”是指按照GINI_Gain最小原则得到的“分类条件”。
假如在构造分类回归树的第一步我们得到的“分类条件”是:体温为恒温和非恒温。此时:
![](https://box.kancloud.cn/2016-02-11_56bc530758df8.jpg)
**三、剪枝**
决策树为什么(WHY)要剪枝?原因是避免决策树过拟合(Overfitting)样本。前面的算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan教授试验,在数据集中,过拟合的决策树的错误率比经过简化的决策树的错误率要高。
怎么剪枝
现在问题就在于,如何(HOW)在原生的过拟合决策树的基础上,生成简化版的决策树?可以通过剪枝的方法来简化过拟合的决策树。
剪枝可以分为两种:预剪枝(Pre-Pruning)和后剪枝(Post-Pruning),下面我们来详细学习下这两种方法:
PrePrune:预剪枝,及早的停止树增长,方法可以参考见上面树停止增长的方法。
PostPrune:后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
其实剪枝的准则是如何确定决策树的规模,可以参考的剪枝思路有以下几个:
1:使用训练集合(Training Set)和验证集合(Validation Set),来评估剪枝方法在修剪结点上的效用
2:使用所有的训练集合进行训练,但是用统计测试来估计修剪特定结点是否会改善训练集合外的数据的评估性能,如使用Chi-Square(Quinlan,1986)测试来进一步扩展结点是否能改善整个分类数据的性能,还是仅仅改善了当前训练集合数据上的性能。
3:使用明确的标准来衡量训练样例和决策树的复杂度,当编码长度最小时,停止树增长,如MDL(Minimum Description Length)准则。
1、Reduced-Error Pruning(REP,错误率降低剪枝)
该剪枝方法考虑将书上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:
1:删除以此结点为根的子树
2:使其成为叶子结点
3:赋予该结点关联的训练数据的最常见分类
4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点
因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)
REP是最简单的后剪枝方法之一,不过在数据量比较少的情况下,REP方法趋于过拟合而较少使用。这是因为训练数据集合中的特性在剪枝过程中被忽略,所以在验证数据集合比训练数据集合小的多时,要注意这个问题。
尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。
2、Pessimistic Error Pruning(PEP,悲观剪枝)
先计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项式分布,并计算它的标准差。对于给定的置信区间,采用下界估计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略能够非常接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法尽管不是统计有效的,但是在实践中有效。
PEP为了提高对测试集合的预测可靠性,PEP对误差估计增加了连续性校正(Continuity Correction)。PEP方法认为,如果:
![](https://box.kancloud.cn/2016-02-11_56bc5307676f0.jpg)成立,则Tt应该被剪枝,
上式中:
![](https://box.kancloud.cn/2016-02-11_56bc5307768a9.jpg)
其中,e(t)为结点t出的误差;i为覆盖Tt的叶子结点;Nt为子树Tt的叶子树;n(t)为在结点t处的训练集合数量。PEP采用自顶向下的方式,如果某个非叶子结点符合上面的不等式,就裁剪掉该叶子结点。该算法被认为是当前决策树后剪枝算法中经度比较高的算法之一,但是饿存在有缺陷。首先,PEP算法是唯一使用Top-Down剪枝策略,这种策略会导致与先剪枝出现同样的问题,将该结点的某子节点不需要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。
虽然PEP方法存在一些局限性,但是在实际应用中表现出了较高的精度,。两外PEP方法不需要分离训练集合和验证机和,对于数据量比较少的情况比较有利。再者其剪枝策略比其它方法相比效率更高,速度更快。因为在剪枝过程中,树中的每颗子树最多需要访问一次,在最坏的情况下,它的计算时间复杂度也只和非剪枝树的非叶子节点数目成线性关系。
Cost-Complexity Pruning(CCP、代价复杂度)
CCP方法包含两个步骤:
1:从原始决策树T0开始生成一个子树序列{T0、T1、T2、...、Tn},其中Ti+1是从Ti总产生,Tn为根节点
2:从子树序列中,根据树的真实误差估计选择最佳决策树。
对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。
![](https://box.kancloud.cn/2016-02-11_56bc53078416c.gif)
![](https://box.kancloud.cn/2016-02-11_56bc530792a2c.gif)是子树中包含的叶子节点个数;
![](https://box.kancloud.cn/2016-02-11_56bc53079fdc9.gif)是节点t的误差代价,如果该节点被剪枝;
![](https://box.kancloud.cn/2016-02-11_56bc5307ac5ca.gif)
r(t)是节点t的误差率;
p(t)是节点t上的数据占所有数据的比例。
![](https://box.kancloud.cn/2016-02-11_56bc5307bacfc.gif)是子树T<sub>t</sub>的误差代价,如果该节点不被剪枝。它等于子树T<sub>t</sub>上所有叶子节点的误差代价之和。
比如有个非叶子节点t4如图所示:
比如有个非叶子节点t4如图所示:
![](https://box.kancloud.cn/2016-02-11_56bc5307c91fa.png)
已知所有的数据总共有60条,则节点t4的节点误差代价为:
![](https://box.kancloud.cn/2016-02-11_56bc5307daa2d.gif)
子树误差代价为:
![](https://box.kancloud.cn/2016-02-11_56bc5307e8a2d.gif)
以t4为根节点的子树上叶子节点有3个,最终:
![](https://box.kancloud.cn/2016-02-11_56bc5308026c0.gif)
找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取![](https://box.kancloud.cn/2016-02-11_56bc530792a2c.gif)最大的进行剪枝。
剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键。