决策树

来源:互联网 发布:销售单据打印软件 编辑:程序博客网 时间:2024/06/07 07:22

决策树

信息增益

  ID3,“信息熵”是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为pk(k=1,2,3,|y|),则D的信息熵定义为

Ent(D)=k=1|y|pklog2pk
Ent(D)的值越小,则D的纯度越高。
假定离散属性a有V个可能的取值(a1,a2,...,aV),若使用a来对样本D进行划分,则会产生V个分支节点,其中第v个分支节点包含了D中所有在属性a上取值为av的样本,记为Dv。再考虑到不同分支节点所包含的样本数目也不同,给分支节点赋予权重|Dv|/|D|,即样本数越多的分支节点影响越大,于是可以就算用属性a对样本D进行划分所获得的“信息增益”
Gain(D,a)=Ent(D)k=1|y|Ent(Dv)
  一般而言,信息增益越大,表明用该属性划分获得的纯度提升越大。

增率率

  实际上,信息增益对可取变化值较多的属性有偏好。为了减小这种偏好可能带来的不利影响,C4.5算法使用增益率来代替信息增益。

Gain_ratio(D,a)=Gain(D,a)IV(a)
其中
IV(a)=v=1V|Dv||D|log2|Dv||D|
称为a的“固有值”。(增益率则刚好相反,其对属性变化值少的有偏好)

基尼指数

  CART决策树就是使用该指数来划分属性,是一种著名的分类回归树。数据集D的纯度用基尼指数表示为:

Gini(D)=k=1|y|kkpkpk=1k=1|y|p2k
  
Gini(n)反映了从数据集随机抽取两个样本,其类别标记不一样的概率。因此,Gini(n)越小,表明数据集D的纯度越高,集合中被选择中样本分错的概率就越低。
属性a的基尼指数为
Gini_index(D,a)=v=1V|Dv||D|Gini(Dv)
于是,我们选择划分后基尼指数最小的属性作为最优划分属性。

剪枝处理

  剪枝是决策树算法应对“过拟合”的一种方法,增强模型的泛化能力。剪枝分为预剪枝和后剪枝。预剪枝是在决策树生成过程中进行的,后剪枝是在决策树生成后进行的。均通过判断是否提升泛化能力判断是否需要剪枝。
其中后剪枝的方法通常有3种:

Reduced-Error Pruning(REP,错误率降低剪枝)

  REP方法是一种比较简单的后剪枝方法,在该方法中数据被分为两部分,一个训练产生决策树,另一个用来评估这个决策树在后续数据上的精度,也是用这个来修剪树。步骤如下:
  1:删除以此结点为根的子树
  2:使其成为叶子结点
  3:赋予该结点关联的训练数据的最常见分类
  4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点
  REP由于使用独立的测试集,与原始决策树相比修改后的决策树可能偏向于过度修剪。这是因为一些不会再测试集中出现的很稀少的训练集实例所对应的分枝在剪枝过如果训练集较小,通常不考虑采用REP算法。
  尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。

Pessimistic Error Pruning (PEP,悲观剪枝)

  PEP剪枝算法是在C4.5算法中提出的,把一颗子树(具有多个叶子节点)用一个叶子节点来替代,比起REP剪枝算法,它不需要一个单独的测试数据集。
  PEP算法首先确定这个叶子的经验错误率为(E+0.5)/N,其中E为错误数,N为叶子覆盖的样本书,0.5是一个调整系数。对于一颗拥有L个叶子的子树,子树的错误数和实例数都是叶子的错误数和实例数求和的结果,则子树的错误率为e

e=(E+0.5L)/N
  然后用一个叶子节点代替子树,J为这个代替叶子节点的错判个数,也要加上0.5,即J+0.5。
如果一棵树错误分类的样本值为1,正确分类的样本值为0,该树错误分类的概率为e,e是固有属性,可以通过统计计算。那么这棵树的误判次数服从伯努利分布,可以估计出树的误判次数的均值和标准差:
E(subtree_err_count)=N×e
var(subtree_err_count)=(N×e×(1e))
  把子树替换成叶子节点后,叶子的误判一样服从伯努利分布,其误判的概率e记作(E+0.5)/N,因此叶子节点的误判均值为
E(leaf_err_count)=N×e
  使用训练数据,子树总是比替换为一个叶节点后产生的误差小,但是使用校正后有误差计算方法却并非如此,当子树的误判个数大过对应叶节点的误判个数一个标准差之后,就决定剪枝:
E(subtree_err_count)var(subtree_err_count)>E(leaf_err_count)
这个条件就是剪枝的标准。
这里写图片描述

(个人理解)
这个案例目的是看看T4为根的整个这颗子树是不是可以被剪掉。
树中每个节点有两个数字,左边的代表正确,右边代表错误。比如T4这个节点,说明覆盖了训练集的16条数据,其中9条分类正确,7条分类错误。
我们先来计算替换标准不等式中,关于子树的部分:
子树有3个叶子节点,分别为T7、T8、T9,因此L=3
子树中一共有16条数据(根据刚才算法说明把三个叶子相加),所以N=16
子树一共有7条错误判断,所以E=7
那么根据e的公式e=(7+0.5×3)/ 16 = 8.5 /16 = 0.53
根据二项分布的标准差公式,标准差为(16×0.53×(1-0.53))^0.5 = 1.996
子树的错误数为“所有叶子实际错误数+0.5调整值” = s + 0.5×3 = 8.5
把子树剪枝后,只剩下T4,T4的错误数为7+0.5=7.5
这样, 8.5-1.996 < 7.5, 因此不满足剪枝标准,不能用T4替换整个子树。

Cost-Complexity Pruning(CCP,代价复杂度剪枝) 与CART决策树

  CART决策树算法中用的就是CCP剪枝方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是输入给定的条件下输出的条件概率分布。

CART分类树

分类树的建立:算法输入是训练集D,基尼系数的阈值,样本个数阈值。输出是决策树T。
  1) 对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。
  2) 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
  3) 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数,
  4) 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.
  5) 对左右的子节点递归的调用1-4步,生成决策树。

CART回归树

回归树与分类树的不同在于一个输出的是连续值,一个是离散值。建树过程是类似的,主要区别有两点:
  1)连续值的处理方法不同:分类树是通过基尼指数来判断划分的优劣情况,回归数的度量目标是对任意的划分点划分成的数据集D1与D2,求出D1与D2各自集合的均方差最小,同时D1和D2的均方差之和最小所对应的特征和特征值划分点。

minA,s[minc1xiD1(A,s)(yic1)2+minc2xiD2(A,s)(yic2)2]

其中,c1为D1数据集的样本输出均值,c2为D2数据集的样本输出均值
  2)决策树建立后做预测的方式不同:CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。

CART树的CCP剪枝

  CART回归树和CART分类树的剪枝策略除了在度量损失的时候一个使用均方差,一个使用基尼系数,算法基本完全一样。
  CART树的剪枝算法可以概括为两步,第一步是从原始决策树生成各种剪枝效果的决策树,第二部是用交叉验证来检验剪枝后的预测能力,选择泛化预测能力最好的剪枝后的数作为最终的CART树。
  该算法为子树Tt定义了代价(cost)和复杂度(complexity),以及一个可由用户设置的衡量代价与复杂度之间关系的参数α,其中,代价指在剪枝过程中因子树Tt被叶节点替代而增加的错分样本,复杂度表示剪枝后子树Tt减少的叶结点数,α则表示剪枝后树的复杂度降低程度与代价间的关系,定义为:

α=C(T)C(Tt)|Tt|1
其中,
|Tt|:子树Tt中的叶节点数;
C(T):结点t的错误代价,计算公式为C(T)=r(T)p(T)r(T)为结点t的错分样本率,p(t)为落入结点t的样本占所有样本的比例;
C(Tt):子树Tt错误代价,计算公式为C(Tt)=C(i)i为子树Tt的叶节点。

CCP剪枝算法分为两个步骤:
  1.对于完全决策树T的每个非叶结点计算α值,循环剪掉具有最小α值的子树,直到剩下根节点。在该步可得到一系列的剪枝树{T0T1T2,...,Tm},其中T0为原有的完全决策树,Tm为根结点,Ti+1为对Ti进行剪枝的结果;
  2.从子树序列中,根据真实的误差估计选择最佳决策树。
>
  对于上述图的计算T4节点的α值(样本总数为60):

C(T)=r(T)p(T)=716×1660=760
C(Tt)=C(i)=ri(T)pi(T)=25560+02260+39960=560
α=C(T)C(Tt)|Tt|1=160

连续值

  一般来说,决策树处理不了具有连续值的特征,因为具有连续值的属性的可取值数目不再有限,因此不能直接用连续属性的取值来进行划分决策树。
二分法对连续值进行处理
  假设属性a是连续属性,将属性a下的值从小到大排序,有{a1,a2,a3,...,an},在aiai+1之间取平均值,作为一个划分结点,一共有n-1个划分结点,因此我们以这些结点把数据集分为两个子集,分别计算在该结点下属性a的信息增益,计算结果有n-1个值,在n-1个值之中选取信息增益最大的值,以这个值的划分点作为把连续属性a变成2个类离散化的节点。

缺失值

  • 在选择分裂属性的时候,训练样本存在缺失值,如何处理?
      计算分裂损失减少值时,忽略特征缺失的样本,最终计算的值乘以比例(实际参与计算的样本数除以总的样本数)

  假如你使用ID3算法,那么选择分类属性时,就要计算所有属性的熵增(信息增益,Gain)。假设10个样本,属性是a,b,c。在计算a属性熵时发现,第10个样本的a属性缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a属性的熵增。然后结果乘0.9(新样本占raw样本的比例),就是a属性最终的熵。

  • 分类属性选择完成,对训练样本分类,发现样本属性缺失怎么办?
      将该样本分配到所有子节点中,权重由1变为具有属性a的样本被划分成的子集样本个数的相对比率,计算错误率的时候,需要考虑到样本权重

  比如该节点是根据a属性划分,但是待分类样本a属性缺失,怎么办呢?假设a属性离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。

  • 训练完成,给测试集样本分类,有缺失值怎么办?
      分类时,如果待分类样本有缺失变量,而决策树决策过程中没有用到这些变量,则决策过程和没有缺失的数据一样;否则,如果决策要用到缺失变量,决策树也可以在当前节点做多数投票来决定(选择样本数最多的特征值方向)。

  如果有单独的缺失分支,使用此分支。把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测。根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理。在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类。待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类。

总结

REP PEP CCP 剪枝方式 自底向上 自顶向下 计算复杂度 O(n) O(n) 误差估计 剪枝集上误差估计 使用连续纠正
原创粉丝点击