决策树是如何选择特征和分裂点?

《决策树是如何选择特征和分裂点?》

缘起

在解决回归和分类问题的时候,一般会使用 Random Forest、GBDT、XGBoost、LightGBM 等算法,这类算法因为性能好,被业界广泛采用。突然想到树类型的算法都需要明白一个基本问题,树是如何选择特征和分裂点的?其根本要追溯到决策树的种类,每种是如何划分特征和分裂点,以及如何剪枝的。

决策树分为三类:ID3、C4.5、CART。提出时间却是 1984 年提出 CART,1986年提出的 ID3,1993 年提出的 C4.5。在介绍决策树之前需要了解一些信息论的知识,信息、熵、条件熵、信息增益。决策树中的 ID3 和 C4.5 与信息论息息相关。

 

《决策树是如何选择特征和分裂点?》

信息论基础

信息是杂乱无章数据的一种度量方式。在分类问题中,如果待分类的事物可以划分在多个分类中,那么某个分类  的信息定义为:

《决策树是如何选择特征和分裂点?》

其中, 是某个分类的信息; 是选择该分类的概率。

熵是信息的期望,也就是计算所有分类包含信息的期望值:

《决策树是如何选择特征和分裂点?》

其中,H(Y) 表示分类数据集的熵。

条件熵是在特征 X 给定条件下,类别 Y 的条件概率分布的熵对特征 X 的数学期望。

《决策树是如何选择特征和分裂点?》

其中, 表示在特征 X 下的条件熵; 表示特征下  具体特征值的条件熵; 表示 x 和 y 的联合概率分布。

在划分数据集之前之后信息发生的变化叫做信息增益,信息增益是熵的减少或者说是数据无序程度的减少。熵减去条件熵就是信息增益。

《决策树是如何选择特征和分裂点?》

其中, 表示信息增益。

《决策树是如何选择特征和分裂点?》

数据说明

在讲完一些信息论的基础知识的基础上,由于原始论文中公式的表示不是同一个体系,为了更加方便理解这三者,因此下文中三个算法的介绍都以下面数据集为基础。

训练数据集 , 表示训练样本总数,数据共有  个类别,类别  的样本集合分别用  表示,那么 ,如果特征A有n个不同类型的取值分别为 ,特征 A 可以将 D 划分为 n 个子集,, 为  的样本个数,并且 ,子集  属于类别  的样本集合为 , 即为子集  中属于类别  的样本集合:。用  表示  集合样本的个数。

 

《决策树是如何选择特征和分裂点?》

ID3

4.1 算法思路

利用训练数据集 D 与特征 A 来表示信息增益的计算方式,那么需要以下几个步骤:

1)计算训练集合  的熵 :

《决策树是如何选择特征和分裂点?》

当 H(D) 的值越小,说明样本集合 D 的纯度就越高。

2)选择用样本的某一个特征 A 来划分样本集合 D 时,就可以得出特征 A 对样本 D 划分所带来的信息增益。特征 A 把 D 划分为 n 个子集,计算特征 A 对数据集 D 的条件熵 H(D|A):

《决策树是如何选择特征和分裂点?》

3)计算信息增益 IG:

《决策树是如何选择特征和分裂点?》

信息增益越大,说明用特征 A 来划分数据集 D,信息混乱程度越小。我们需要对样本的所有特征计算信息增益情况,选择信息增益大的特征来作为决策树的一个结点,或者可以说那些信息增益大的特征往往离根结点越近。

当一个特征已经作为划分的依据,在下面递归过程就不在参与了。经过根结点下面特征各个取值后样本又可以按照相应特征值进行划分,并且在当前的样本下利用剩下的特征再次计算信息增益来进一步选择划分的结点,ID3 决策树就是这样建立起来的。

4.2 决策树生成过程

大概创建分支 createBranch() 伪代码的意思如下:

检测数据集中的每个子项是否属于同一分类:

  if so return 类标签
  else
   寻找划分数据集的最好特征
   划分数据集
   创建分支节点
      for每个划分的子集
        调用函数createBranch并增加返回结果到分支节点中
   retrun 分支节点

 

也就是说,遍历每一个特征,遍历每一个特征值,如果计算出来信息增益最大,那么该特征就是最佳特征;接下来每个特征和特征值递归调用,构建下面的子树,再次选取特征和特征值,直到划分的子项属于同一类别或者遍历完所有特征,返回出现次数最多的类别。

4.3 示例

选用原始论文中的一个示例:

《决策树是如何选择特征和分裂点?》

假设有两个分类,一个是 N,一个是 P,Outlook 表示天气情况,Temperature 表示气温情况,Humidity 表示湿度,Windy 表示有风,这四个作为特征,每个特征下面的离散值作为特征值。那么数据的熵 :

《决策树是如何选择特征和分裂点?》

在 Outlook 的值 sunny 中 P 出现了 2 次,N 出现了 3 次,因此 ,那么数据集在 sunny 下的熵表示为  同理:在 overcast 下 ;在 rain 下 。那么数据集 D 在 Outlook 特征的条件熵表示为:

 

《决策树是如何选择特征和分裂点?》

 

那么 outlook 的信息增益表示为:

 

《决策树是如何选择特征和分裂点?》

 

同理其他特征的信息增益结果为:

 

《决策树是如何选择特征和分裂点?》

 

可以发现 Outlook 的信息增益最大,优先在这个特征上划分,在递归到其他特征上最终形成的决策树图如下: 

 

《决策树是如何选择特征和分裂点?》

 

《决策树是如何选择特征和分裂点?》

 

C4.5

 

ID3 算法中当一个特征的可取值数目较多时,而对应的特征值下面的的样本很少,这个时候它的信息增益是非常高的。ID3 会认为这个特征很适合划分,但是较多取值的特征来进行划分带来的问题是它的泛化能力比较弱,不能够对新样本进行有效的预测。为了解决这个问题,C4.5 决策树不直接使用信息增益来作为划分样本的主要依据,采用信息增益率来划分样本。

 

特征 A 对训练数据集合D的信息增益比  定义为特征 A 的信息增益 IG(D,A) 与训练数据集 D 关于特征 A 的取值熵  之比,即:

 

《决策树是如何选择特征和分裂点?》

 

如果特征 A 有 n 个取值,则其中数据集 D 关于特征 A 的熵为:

 

《决策树是如何选择特征和分裂点?》

 

上面的过程相当于对特征值多的特征做了一个归一化,校正信息增益容易偏向于取值较多的特征的问题。但是同样增益率对可取值数目较少的特征有所偏好,因此 C4.5 决策树先从候选划分属性中找出信息增益高于平均水平的特征,在从中选择增益率最高的。关于 C4.5 的剪枝问题,在 CART 树中一并介绍。

 

《决策树是如何选择特征和分裂点?》

 

CART树

 

ID3 和 C4.5 需要把连续特征离散化才能在回归数据中使用(ID3 需要人工处理,C4.5 算法自带处理);使用熵来度量信息的混乱程度还是复杂了些;最佳特征取值可以是多个,切分成复杂的多叉树。由于他们存在一些问题,下面还有一种决策树模型,CART 树。虽然 ID3 和 C4.5 存在很多问题,但是我不认为 CART 树是为了解决这些问题的,因为 CART 论文是发表的最早的,这边只是为了介绍他们对比不同。

 

CART(Classification And Regression Trees,分类回归树),采用二元切分的方法,如果数据切分特征值等于切分要求进入左子树,否则进入右子树。CART 树即可以处理分类问题,又可以处理回归问题。分类问题采用基尼系数来选择最优特征和分裂点,回归问题采用平方误差的总值(总方差)来选择最优特征和分裂点。

 

6.1 CART数据集混乱程度衡量

 

6.1.1 CART分类树

 

基尼指数是 1912 年意大利统计与社会学家 Corrado Gini 提出的。基尼系数(Gini index、Gini Coefficient)用来衡量一个国家或地区居民收入差距的指标,值越大表示收入越悬殊。在 CART 分类树中,采用基尼系数衡量数据集的不纯度(混乱程度),基尼系数越小说明数据不纯度低,特征越显著。

 

那么分类数据集 D 的基尼系数可以表示为:

 

《决策树是如何选择特征和分裂点?》

 

在特征A下,将数据划分成两类,一类是 ,一类是 ,那么在特征 A 下的基尼系数为:

 

《决策树是如何选择特征和分裂点?》

 

6.1.2 CART回归树

 

计算回归数据真实目标值中所有数据的均值,每条数据真实目标值减去均值。使用差值的绝对值或者差值的平方来衡量回归数据的混乱程度。若果采用差值的平方来衡量,那么就是平方误差的总值(总方差)。

 

6.2 树的生成过程

 

函数 createTree() 的伪代码大致如下:

 

找到最佳的待切分特征:    
  如果该节点不能再分,将该节点存为叶节点    
  执行二元切分    
  在右子树调用createTree()方法    
  在左子树调用createTree()方法    

那么如何找到最佳的待切分特征和特征值呢?   

每个特征:    
  每个特征值:    
    将数据切分成两份    
    计算切分的误差    
    如果当前误差小于当前最小误差,那么将当前切分设定为最佳切分并更新最小误差    
返回最佳切分的特征和特征值

 

如果是分类树,那么误差指的的基尼系数,如果是回归树,误差值的是总方差。节点不能再分有两种情况:一是切分后的数据真实目标值为同一个,那么此时叶节点就是当前值;二是预剪枝切分后的样本很少或者迭代时总误差下降不满足阈值,此时用切分后的数据真实值的平均值作为叶节点。

 

6.3 树的剪枝

 

树的剪枝分为预剪枝和后剪枝,一般为了寻求模型的最佳效果可以同时使用两种剪枝技术。

预剪枝过程相对简单,在生成树的过程中,如果某个特征和特征值切分的样本小于最小样本数或迭代误差下降值小于设置的最小下降值,就停止切分。预剪枝可以降低过拟合的风险并减少决策树的训练时间,但是也会带来欠拟合的问题。

 

下面重点讲后剪枝,训练集训练一个决策树。在验证集上,对于一颗子树 ,其损失函数为:

 

《决策树是如何选择特征和分裂点?》

 

其中, 为正则化参数, 为验证集的预测误差, 是子树 T 叶节点的数量。

 

如果将 T 的子树减掉,那么损失函数为:

 

《决策树是如何选择特征和分裂点?》

 

如果剪枝后损失函数变小,或者损失函数相等但是叶节点的数量变少,这两种情况都满足剪枝条件,具体后剪枝过程如下:

 

基于已有的树切分验证集数据:
  如果存在任一子集是一棵树,则在该子集递归剪枝过程
  计算将当前两个叶节点合并后的误差
  计算不合并的误差
  如果合并会降低误差的话,就将叶节点合并

 

《决策树是如何选择特征和分裂点?》

 

决策树算法小结

 

《决策树是如何选择特征和分裂点?》

 

在样本量比较小的情况下建议使用 C4.5,大样本的情况下使用 CART。C4.5 需要对数据进行多次排序,处理成本耗时较高;CART 树是一种大样本的统计方法,小样本处理下泛化误差较大。

目前这三种算法都是一棵树中的特征来决定最后的结果,后来发展成一组树来决定最后的结果。如果这些树是并行投票,就是每个树的投票权重相同,形成了 bagging 类的算法,最有代表性的是 Random Forest;如果这些树是串行投票,每个树的投票权重不同,通过拟合残差的方式,形成了 boosting 类的算法,最有代表性的是 GBDT、XGBoost、LightGBM。

 

参考文献

 

[1] Leo Breiman, Jerome H. Friedman, Richard A. Olshen, Charles J. Stone.(1984).
[2] Classification And Regression Trees Quinlan1986_Article_InductionOfDecisionTrees
[3] C4.5: by J. Ross Quinlan. Inc., 1993. Programs for Machine Learning Morgan Kaufmann Publishers
[4]《机器学习实战》
[5] https://www.cnblogs.com/pinard/p/6053344.html
[6] 周志华西瓜书《机器学习》

    原文作者:code_kd
    原文地址: https://blog.csdn.net/update7/article/details/112376632
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞