决策树算法

一   决策树的一般表示

  1. 数据为m个样本,d个属性(特征)
  2. 递归构建
  3. 叶子结点表示 结果分类
  4. 根结点 表示全部样本
  5. 从样本空间D中选择一个最优属性a*,然后依照属性a*将样本空间D划分为不同样本子集D1,D2 等
  6. 然后对子集Di找到 一个最优属性,进行下一次划分
  7. 直到子集为空,属性为空,或者子集中样本取值相同(分类相同)
  8. 代码line2,当子集为中样本取值相同,如取值为类别C  递归结束,此取值为样本分类C
  9. 代码line5,当属性为空,样本无法进一步挑选最优属性,以分类最多的为最终分类
  10. 代码line5,当样本在属性集中取值相同,即取值均匀分布,无法找到最优属性,以分类最多的为最终分类
  11. 代码line12,当样本子集为空,取父结点分类最多的类别,将父结点的样本分布当做此结点的先验分布

决策树算法

二 信息增益法

 

ID3决策树算法使用信息增益作为准则划分属性

 

决策树算法

 

 

决策树算法

  1. Ent(D)当前样本集信息熵
  2. Gain(D,a)当前样本集在属性a下的信息增益
  3. |Dv|为样本集D中属性a对应第v个取值,所占的样本个数,|D|为样本集总个数
  4. 默认认为属性a将整个样本D划分,即无缺省值

 算法的过程为:

    1)初始化信息增益的阈值ϵϵ

    2)判断样本是否为同一类输出DiDi,如果是则返回单节点树T。标记类别为DiDi

    3) 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。

    4)计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征AgAg

    5) 如果AgAg的信息增益小于阈值ϵϵ,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。

    6)否则,按特征AgAg的不同取值AgiAgi将对应的样本输出D分成不同的类别DiDi。每个类别产生一个子节点。对应特征值为AgiAgi。返回增加了节点的数T。

    7)对于所有的子节点,令D=Di,A=A−{Ag}D=Di,A=A−{Ag}递归调用2-6步,得到子树TiTi并返回。

ID3算法值得改进的地方。  

    a)ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。

    b)ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?

    c) ID3算法对于缺失值的情况没有做考虑

    d) 没有考虑过拟合的问题

 

三 增益率

 

信息增益对属性值较多的属性具有偏好,例如增加一个id编号作为属性,1000个样本对应1000个id,每个ip只有唯一的一个样本。明显无法达到泛化目的,且毫无意义。

决策树算法

 

C4.5决策树算法:先从候选属性中找出信息增益高于平均水平的属性,然后选择增益率最高的

对ID3的优化:

对于连续特征   C4.5的思路是将连续的特征离散化。比如m个样本的连续特征A有m个,从小到大排列为a1,a2,...,ama1,a2,...,am,则C4.5取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点Ti表示Ti表示为:Ti=ai+ai+12Ti=ai+ai+12。对于这m-1个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为atat,则小于atat的值为类别1,大于atat的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

缺失值问题   主要需要解决的是两个问题,一是在样本某些特征缺失的情况下选择划分的属性,二是选定了划分属性,对于在该属性上缺失特征的样本的处理 

对于第一个子问题,对于某一个有缺失特征值的特征A。C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值A的数据D1,另一部分是没有特征A的数据D2. 然后对于没有缺失特征A的数据集D1来和对应的A特征的各个特征值一起计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征A缺失的样本加权后所占加权总样本的比例。

对于第二个子问题,可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。比如缺失特征A的样本a之前权重为1,特征A有3个特征值A1,A2,A3。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则a同时划分入A1,A2,A3。对应权重调节为2/9,3/9, 4/9。

缺点:

模型是用较为复杂的熵来度量

使用了相对较为复杂的多叉树

只能处理分类不能处理回归等

  1. 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
  2. C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
  3. C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
  4. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

 

决策树算法

 

四 基尼指数

决策树算法

 

决策树算法

CART决策树算法使用此法,只用构建二叉树,计算只有2次项

决策树算法

CART分类树算法对于连续特征和离散特征处理的改进

对于CART分类树连续值的处理问题,其思想和C4.5是相同的,都是将连续的特征离散化。唯一的区别在于在选择划分点时的度量方式不同,C4.5使用的是信息增益比,则CART分类树使用的是基尼系数。

  1. 将连续特征 以某个基点划分重两部分,构建2叉树
  2. 此特征在一次划分后可继续参与划分
  3. 离散特征同样

    具体的思路如下,比如m个样本的连续特征A有m个,从小到大排列为a1,a2,...,ama1,a2,...,am,则CART算法取相邻两样本值的平均数,一共取得m-1个划分点,其中第i个划分点Ti表示Ti表示为:Ti=ai+ai+12Ti=ai+ai+12。对于这m-1个点,分别计算以该点作为二元分类点时的基尼系数。选择基尼系数最小的点作为该连续特征的二元离散分类点。比如取到的基尼系数最小的点为atat,则小于atat的值为类别1,大于atat的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与ID3或者C4.5处理离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

    对于CART分类树离散值的处理问题,采用的思路是不停的二分离散特征。

    回忆下ID3或者C4.5,如果某个特征A被选取建立决策树节点,如果它有A1,A2,A3三种类别,我们会在决策树上一下建立一个三叉的节点。这样导致决策树是多叉树。但是CART分类树使用的方法不同,他采用的是不停的二分,还是这个例子,CART分类树会考虑把A分成{A1}和{A2,A3}{A1}和{A2,A3}, {A2}和{A1,A3}{A2}和{A1,A3}, {A3}和{A1,A2}{A3}和{A1,A2}三种情况,找到基尼系数最小的组合,比如{A2}和{A1,A3}{A2}和{A1,A3},然后建立二叉树节点,一个节点是A2对应的样本,另一个节点是{A1,A3}对应的节点。同时,由于这次没有把特征A的取值完全分开,后面我们还有机会在子节点继续选择到特征A来划分A1和A3。这和ID3或者C4.5不同,在ID3或者C4.5的一棵子树中,离散特征只会参与一次节点的建立。

算法一般步骤:

算法输入是训练集D,基尼系数的阈值,样本个数阈值。

    输出是决策树T。

    我们的算法从根节点开始,用训练集递归的建立CART树。

    1) 对于当前节点的数据集为D,如果样本个数小于阈值或者没有特征,则返回决策子树,当前节点停止递归。

    2) 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。

    3) 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数,对于离散值和连续值的处理方法和基尼系数的计算见第二节。缺失值的处理方法和C4.5算法里描述的相同。

    4) 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,做节点的数据集D为D1,右节点的数据集D为D2.

    5) 对左右的子节点递归的调用1-4步,生成决策树。

 

五 优缺点:

首先我们看看决策树算法的优点:

    1)简单直观,生成的决策树很直观。

    2)基本不需要预处理,不需要提前归一化,处理缺失值。

    3)使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数。

    4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。

    5)可以处理多维度输出的分类问题。

    6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释

    7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。

    8) 对于异常点的容错能力好,健壮性高。

    我们再看看决策树算法的缺点:

    1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。

    2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。

    3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。

    4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。

    5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。

 

参考:

1 《机器学习》  周志华

2  https://www.cnblogs.com/pinard/p/6053344.html

3  http://www.cnblogs.com/pinard/p/6050306.html