决策树—ID3、C4.5、CART

目录

一、决策树模型与学习

1、决策树模型

2、决策树学习    

二、特征选择

1、信息增益

2、信息增益率

三、决策树的生成

1、ID3算法

2、C4.5算法

3、CART算法

四、决策树停止分裂的条件

五、连续值和损失值处理


决策树(decision tree)是一种基本的分类与回归方法。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程,可以认为是if-then规则的集合, 也可以认为是定义在特征空间与类空间上的条件概率分布。主要优点是 模型具有可读性,分类速度快学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类

决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。

一、决策树模型与学习

1、决策树模型

定义: 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由节点(node)和有向边(directed edge)组成。节点有两种类型:内部节点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。

用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归的对实例进行测试并分类,直至达到叶节点。最后将实例分到叶结点的类中。
如图是一个决策树示意图,图中圆和方框分别表示内部结点和叶结点:

                                                              

2、决策树学习    

决策树学习本质上是从训练数据集中归纳出一组分类规则。与训练数据集不相矛盾的决策树(即能对训练数据进行正确分类的决策树)可能有多个,也可能一个也没有。我们需要一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。
决策树学习的损失函数通常是 正则化的极大似然函数 。
决策树学习的目标是 以损失函数为目标函数的最小化 。

决策树学习的算法通常是一个 递归的选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类过程。开始,构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这个特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶结点,并将这些子集分到所对应的叶结点中去;如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。如此递归的进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶结点上,即有了明确的类。这就生成一颗决策树。
以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据可能过拟合。需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。具体的就是去掉过于细分的叶结点,使其退回到父结点,甚至更高的结点,然后将其改为新的叶结点。
若特征较多,在决策树学习开始的时候,对 特征进行选择,只留下对训练数据有足够分类能力的特征。
决策树的生成只考虑局部最优
决策树的剪枝只考虑全局最优

二、特征选择

特征选择在于选取对训练数据具有分类能力的特征,可以提高决策树学习的效率。通常特征选择的准则是信息增益或信息增益率
特征选择的划分依据:这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就应该选择这个特征。(将数据集划分为纯度更高,不确定性更小的子集的过程。)

如果属性是连续型,可以确定一个值作为分裂点splitPoint,按照大于splitPoint和小于等于splitPoint生成两个分支。

决策树量化纯度:

决策树的构建是基于样本概率和纯度进行构建操作的,判断数据集“纯”的指标有三个:Gini指数、熵、错误率。三个公式的值越小,说明越“纯”,实践证明这三个公式效果相似,一般采用熵。

决策树算法的停止条件:

决策树的构建过程是一个递归过程,所以必须给定停止条件,否则过程将不会停止,一般的停止条件有两种:

    1. 当每个子节点只有一种类型的时候停止。
    1. 当前节点中记录数小于某个阈值,同时迭代次数达到给定值时,停止构建,此时使用max(p(i))作为节点的对应类型。
      方式一可能会使树的节点过多,产生过拟合等问题。一般采用第二种方法。

1、信息增益

(1)信息熵:

在信息论和概率统计中,熵(entropy) 是表示随机变量不确定性的度量(纯度)。是用来衡量一个随机变量出现的期望值。如果信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。 假设随机变量X的可能取值有x1,x2...,xn,对于每一个可能的取值xi,其概率 P(X=xi) = pi , ( i = 1,2, ... , n)
因此随机变量X的熵:

                                                            H(x) = -\sum_{i=1}^{n}p_ilog_2p_i
由定义可知,熵只依赖于X的分布,而与X的取值无关
对于样本集合D来说,随机变量X是样本的类别,即,假设样本有k个类别,每个类别的概率是\frac{|C_k|}{|D|},其中|Ck|表示类别k的样本个数,|D|表示样本总数,则对于样本集合D来说熵(经验熵)为:

                                                        H(D) = -\sum_{k=1}^{K} \frac{|C_k|}{|D|}log_2 \frac{|C_k|}{|D|}

(2)条件熵

假设有随机变量(X,Y),其联合概率分布为:P(X=xi,Y=yj)=pij,i=1,2,⋯,n;j=1,2,⋯,m
则条件熵(H(Y∣X))表示在已知随机变量X的条件下随机变量Y的不确定性,其定义为X在给定条件下Y的条件概率分布的熵对X的数学期望:
entropy(D,A) = \sum_{i=1}^k \frac {D_{A_i}}{D} log_2D_{A_i}
当嫡和条件嫡中的概率由数据估计(特别是极大似然估计)得到时,所对应的嫡与条件嫡分别称为经验熵( empirical entropy)和经验条件嫡(empirical conditional entropy )。

信息增益:

定义: 特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:
          g(D,A)=H(D)-H(D|A)
划分前样本集合D的熵是一定的 ,entroy(前),使用某个特征A划分数据集D,计算划分后的数据子集的熵 entroy(后):
        信息增益 = entroy(前) - entroy(后)

信息增益(information gain)表示由于特征A使得对数据集D的分类的不确定性减少的程度。
根据信息增益准则的特征选择方法是:对训练数据集D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。

缺点: 信息增益偏向取值较多的特征

原因: 当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益更大,因此信息增益比较 偏向取值较多的特征。

信息增益计算:

2、信息增益率

                                                          信息增益率 = 惩罚参数 * 信息增益

书中公式:

                                                                g_R(D,A) = \frac{g(D,A)}{H_A(D)}

注意: 其中的HA(D),对于样本集合D,将当前特征A作为随机变量(取值是特征A的各个特征值),求得的经验熵。
之前是把集合类别作为随机变量,现在把某个特征作为随机变量,按照此特征的特征取值对集合D进行划分,计算熵H_A(D):

                                                                  H_A(D) = -\sum_{i=1}^{n} \frac{|D_i|}{|D|}log_2 \frac{|D_i|}{|D|}
信息增益比本质: 是在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。
惩罚参数: 数据集D以特征A作为随机变量的熵的倒数,即:将特征A取值相同的样本划分到同一个子集中(之前所说数据集的熵是依据类别进行划分的)。

缺点: 信息增益比偏向取值较少的特征

原因: 当特征取值较少时HA(D)的值较小,因此其倒数较大,因而信息增益比较大。因而偏向取值较少的特征

使用信息增益比: 基于以上缺点,并不是直接选择信息增益率最大的特征,而是现在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。

三、决策树的生成

1、ID3算法

ID3算法的核心是在决策树各个节点上应用 信息增益 准则选择特征,递归的构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归的调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。ID3相当于用极大似然法进行概率模型的选择。

ID3算法的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有4种取值,那么数据将被切分成4份。一旦按照某特征切分后,该特征在之后的算法执行过程中将不会再起作用;另一种方法是二元切分法,即每次把数据集切分成两份。如果数据的某特征值等于切分所要求的值,那么这些数据将进入左子树,反之则进入右子树。

除了切分过于迅速外,ID3算法还存在另一个问题,它不能直接出来连续型特征。只有事先将连续型特征转为离散型,才能在ID3中使用。 但这种转换过程会破坏连续型变量的内在性质。而使用 二元切分法 则易于对树构建过程中进行调整以处理连续型特征。具体的处理方法是: 如果特征值大于给定值就走左子树,否则走右子树。另外二元切分法也节省了树的构建时间。 同时,ID3算法对于缺失值的情况没有考虑。

ID3算法举例:

                                      

1、选择最优划分属性

ID3采用信息增益作为选择最优的分裂属性的方法,选择熵作为衡量节点纯度的标准,根据以上公式对上述的例子的根节点进行分裂,分别计算每一个属性的信息增益,选择信息增益最大的属性进行分裂。

(1)、计算根节点的信息熵

本例中正例(好瓜)占 8/17,反例占 9/17 ,根结点的信息熵为:

                                                             Ent(D) = -\sum_{k=1}^{2}p_klog_2p_k = -( \frac{8}{17}log_2\frac{8}{17}+\frac{9}{17}log_2\frac{9}{17})

(2)、计算各个特征的信息增益,选取最大的

计算当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益

色泽有3个可能的取值:{青绿,乌黑,浅白}

D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6

D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6

D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5

计算出用“色泽”划分之后所获得的3个分支结点的信息熵为:

                                                   Ent(D^1) = -( \frac{3}{6}log_2\frac{3}{6}+\frac{3}{6}log_2\frac{3}{6}) = 1.000;

                                                  Ent(D^2) = -( \frac{4}{6}log_2\frac{4}{6}+\frac{2}{6}log_2\frac{2}{6}) = 1.918;

                                                  Ent(D^3) = -( \frac{1}{5}log_2\frac{1}{5}+\frac{4}{5}log_2\frac{4}{5}) = 0.722;

由此可得“色泽”的信息增益为:

                                                 Gain(D,d) = Ent(D) - \sum_{v=1}^{3} \frac{|D^v|}{D}Ent(D^v)

                                                                      =0.998-( \frac{6}{17} \times 1.000 + \frac{6}{17} \times 0.918 + \frac{5}{17} \times 0.722) = 0.109

类似的,我们可以计算出其他属性的信息增益,选取信息增益最大的进行划分,依次类推,最终得到决策树:

                                                            

ID3算法的缺点:

(1)不能对连续数据进行处理,只能通过连续数据离散化进行处理;

(2)采用信息增益进行数据分裂容易偏向取值较多的特征,准确性不如信息增益率;

(3)缺失值不好处理。

(4)没有采用剪枝,决策树的结构可能过于复杂,出现过拟合。

2、C4.5算法

C4.5算法用信息增益率选择特征,在树的构造过程中会进行剪枝操作优化,能够自动完成对连续属性的离散化处理;C4.5算法在选择分割属性的时候选择信息增益率最大的属性。

上一节中我们讲到ID3算法有4点不足,C4.5算法改进了这四个问题:

对于第一个问题,不能处理连续型属性,C4.5的思路是将连续的特征离散化,比如,m个样本的连续特征A有m个,从小到大排列为a1,a2,a3......am,则C4.5取相邻两样本值的平均值,一共取得m-1个划分点,其中第i个划分点T_i表示T_i = \frac{a_i + a_{i+1}}{2},对于这m-1个划分点,分别计算以该点作为二元分类点的信息增益,以信息增益最大的点作为该连续特征的二元离散分类点,比如取得信息增益最大的点为a_t,则小于a_t的值为类别1,大于a_t的值为类别2,这样我们就做到了连续特征的离散化(计算m-1个划分点,当m取值很大时,计算量会很大,改进的方法是可以通过去除前后两个类标签相同的切割垫以简化计算的复杂度,例如:连续属性a_i和a_j(j-i>>1)之间的所有样本的标签相同,即都为1或2,那么可以只计算a_{i-1}a_ia_{j-1}a_j之间划分点的信息增益)。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

对于第二个问题,信息增益容易偏向取值较多的特征的问题,C4.5采用信息增益率的方法,它是信息增益和特征熵的比值,特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益偏向取值较多的特征的问题。

                 

优缺点:

优点:产生的规则易于理解;准确率较高;实现简单;
缺点: 对数据进行多次顺序扫描和排序,效率较低;只适合小规模数据集,需要将数据放到内存中。

3、CART算法

分类与回归树(classification and regression tree, CART)既可以用于回归也可以用于分类。使用二元切分法来处理连续型数值。

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

使用基尼系数作为数据纯度的量化指标构建决策树。CART算法使用Gini增长率作为分割属性选择的标准,选择Gini增长率最大的作为当前数据集的分割属性。

CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
  2. 决策树剪枝:用验证数据集最已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

3.1、CART生成

  CART 树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则 ,进行特征选择,生成二叉树。

如何选择分裂的属性:

分裂的目的是为了能够让数据变纯,使决策树输出的结果更接近真实值。那么CART是如何评价节点的纯度呢?如果是分类树,CART采用GINI值衡量节点纯度;如果是回归树,采用样本方差衡量节点纯度。节点越不纯,节点分类或者预测的效果就越差。

(1)回归树的生成

回归方差计算公式:
                                                 \sigma = \sqrt{\sum (x_i-\mu)^2} = \sqrt {\sum x_i^2 - n\mu^2}
方差越大,表示该节点的数据越分散,预测的效果就越差。如果一个节点的所有数据都相同,那么方差就为0,此时可以很肯定得认为该节点的输出值;如果节点的数据相差很大,那么输出的值有很大的可能与实际值相差较大。

因此,无论是分类树还是回归树,CART都要选择使子节点的GINI值或者回归方差最小的属性作为分裂的方案。即最小化(分类树)。

(2)分类树的生成

分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。

举例分析基尼指数是如何一并选择特征向量和寻找最佳切分点的:

节点的分裂分为两种情况,连续型的数据和离散型的数据。

CART对连续型属性的处理与C4.5差不多,通过最小化分裂后的GINI值或者样本方差寻找最优分割点,将节点一分为二,详见C4.5.

对于离散型属性,理论上有多少个离散值就应该分裂成多少个节点。但CART是一棵二叉树,每一次分裂只会产生两个节点,方法是:将其中一个离散值独立作为一个节点,其他的离散值生成另外一个节点即可。这种分裂方案有多少个离散值就有多少种划分方法,举一个简单的例子:如果某离散属性有三个离散值x,y,z,则属性的分裂方法有:[{x},{y,z}]、[{y},{x,z}]、[{z},{x,y}],分别计算每种划分方法的基尼值或者样本方差确定最优的方法。

以属性“职业”为例,一共有三个离散值,“学生”、“老师”、“上班族”。该属性有三种划分的方案,分别为{“学生”}、{“老师”、“上班族”},{“老师”}、{“学生”、“上班族”},{“上班族”}、{“学生”、“老师”},分别计算三种划分方案的子节点GINI值或者样本方差,选择最优的划分方法,如下图所示:

第一种划分方法:{“学生”}、{“老师”、“上班族”}

预测是否已婚(分类):

                                                 Gain = \sum p_i Gini_i

                                                           = \frac{3}{7} \times [1 - ((\frac{2}{3}) ^ 2 + (\frac{1}{3}) ^ 2)] + \frac{4}{7} \times [1 - ((\frac{3}{4}) ^ 2 + (\frac{1}{4}) ^ 2)] = 0.4

预测年龄(回归):

                                              Gain = \sum \sigma_i

                                                        = \sqrt {12^2 + 18^2 + 21^2 - 3 \times 17^2} + \sqrt {26^2+47^2 + 36^2 + 29^2 - 4 \times 32.5^2} = 34.71

第二种划分方法:{“老师”}、{“学生”、“上班族”}

预测是否已婚(分类):

                                               Gain = \sum p_i Gini_i

                                                           = \frac{2}{7} \times [1 - ((\frac{1}{2}) ^ 2 + (\frac{1}{2}) ^ 2)] + \frac{5}{7} \times [1 - ((\frac{3}{5}) ^ 2 + (\frac{2}{5}) ^ 2)] = 0.49

预测年龄(回归):

                                             Gain = \sum \sigma_i                                                                                                                     

                                                         = \sqrt {26^2 + 29^2 - 2 \times 27.5^2} + \sqrt {12^2+18^2 + 47^2 + 36^2+21^2 - 5 \times 26.8^2}

                                                          =  16.36

第三种划分方法:{“上班族”}、{“学生”、“老师”}

 预测是否已婚(分类):

                                                 Gain = \sum p_i Gini_i

                                                           = \frac{2}{7} \times [1 - 1] + \frac{5}{7} \times [1 - ((\frac{3}{5}) ^ 2 + (\frac{2}{5}) ^ 2)] = 0.34

预测年龄(回归):

                                               Gain = \sum \sigma_i                                                                                                                     

                                                         = \sqrt {47^2 + 36^2 - 2 \times 41.5^2} + \sqrt {12^2+18^2 + 26^2 + 29^2+21^2 - 5 \times 21.2^2}

                                                          = 21.14

综上,如果想预测是否已婚,则选择{“上班族”}、{“学生”、“老师”}的划分方法,如果想预测年龄,则选择{“老师”}、{“学生”、“上班族”}的划分方法。

四、决策树停止分裂的条件

决策树不可能不限制地生长,总有停止分裂的时候,最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂,但这种情况下树过于复杂,而且预测的经度不高。一般情况下为了降低决策树复杂度和提高预测的经度,会适当提前终止节点的分裂。

  以下是决策树节点停止分裂的一般性条件:

(1)最小节点数

当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。

(2)熵或者基尼值小于阀值。

 由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。

(3)决策树的深度达到指定的条件

节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。

(4)所有特征已经使用完毕,不能继续进行分裂。

 被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。

五、连续值和损失值处理

1、连续值

对于连续型数据,ID3原本是没有处理能力的,只有通过离散化将连续性数据转化成离散型数据再进行处理。这里采用简单的等距离数据划分的方法。该方法先对数据进行排序,然后将连续型数据划分为多个区间,并使每一个区间的数据量基本相同,再以划分的区间进行分类。

C4.5算法处理连续值的方法如上所述。

2、缺失值

现实中常会遇到不完整的样本,即某些属性值缺失。有时若简单采取剔除,则会造成大量的信息浪费,因此在属性值缺失的情况下需要解决两个问题:(1)如何选择划分属性。(2)给定划分属性,若某样本在该属性上缺失值,如何划分到具体的分支上。假定为样本集中的每一个样本都赋予一个权重,根节点中的权重初始化为1,则定义:

对于(1):通过在样本集D中选取在属性α上没有缺失值的样本子集,计算在该样本子集上的信息增益,最终的信息增益等于该样本子集划分后信息增益乘以样本子集占样本集的比重。即:

对于(2):若该样本子集在属性α上的值缺失,则将该样本以不同的权重(即每个分支所含样本比例)划入到所有分支节点中。该样本在分支节点中的权重变为:

                                    

ID3、C4.5、CART详细代码        

猜你喜欢

转载自blog.csdn.net/choven_meng/article/details/82878018