第八章 决策树算法

来源:互联网 发布:爱福窝设计软件 编辑:程序博客网 时间:2024/05/20 09:07

1、什么是决策树?

        决策树是一种类似于流程图的树结构。其中,每个内部结点(非树叶结点)表示在一个属性上的测试,每个分枝代表该测试的一个输出,而每个树叶结点存放一个类标号。树的最顶层结点是节点。内部结点用矩形表示,而叶结点用椭圆表示。决策树可以是二叉的,也可以是非二叉的(根据不同的决策树算法而定)。一棵典型的决策树如下图:


2、如何使用决策树分类?

       给定一个类标号未知的元组X,在该决策树上测试该元组的属性值。跟踪一条由根到叶结点的路径,该叶结点就存放着该元组的类预测。

3、为什么决策树分类器如此流行?

     (1)决策树分类器的构造不需要任何领域知识或参数设置,因此适合于探测式知识发现。

     (2)决策树可以处理高维数据。

     (3)获取的知识用树的形式表示是直观的,并且容易被人理解。

     (4)决策树归纳的学习和分类步骤是简单和快速的。

     (5)一般而言,决策树分类器具有很好的准确率。

4、决策树算法

        属性选择度量:是一种选择分裂准则,把给定类标记的训练元组的数据分区D“最好地”划分成单独类的启发式方法。理想情况下,D划分后的每个小分区都是纯的(即落在一个给定分区的所有元组都属于相同的类)。“最好的”分类准则是最接近这种情况的划分。

        根据分裂属性选择度量的不同,决策树的常见算法有ID3(度量:信息增益)、C4.5(度量:增益率)、CART(度量:基尼指数)。当然,决策树算法之间的差别也包括用于剪枝的机制等。

        它们都采用贪心(即非回溯)的方法,其中决策树以自顶向下递归的分治法构造。大多数决策树算法都沿用这种自顶向下方法,从训练元组集和它们相关联的类标号开始构造决策树。随着树的构建,训练集递归地划分成较小的子集。这些子集分布在第一个决策点的所有分支上。如果某个分支下的数据属于同一类型,则当前已经正确地划分数据分类,无需进一步对数据集进行分割。如果数据子集内的数据不属于同一类型,则需要重复划分数据子集的过程。如何划分数据子集的算法和划分原始数据集的方法相同,直到所有具有相同类型的数据均在一个数据子集内。

        基本决策树算法概括在下图中:


图  由训练元组归纳决策树的基本算法

       递归的终止条件是:程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。

4.1  ID3算法(信息增益

        ID3算法(Iterative Dichotomiser3   迭代的二分器3代)是一位机器学习研究人员J.Ross Quinlan开发的决策树算法。

        ID3算法的核心思想:以信息增益作为属性选择度量(该度量基于香农在研究消息的值或“信息内容”的信息论方面的先驱工作),选择分裂后信息增益最大的属性进行分裂。该算法采用自顶向下的贪婪搜索遍历可能的决策树空间。

        思想

       (1)自顶向下的贪婪搜索遍历可能的决策树空间构造决策树

       (2)从“哪一个属性将在树的根节点被测试”开始;

       (3)使用统计测试来确定每一个实例属性单独分类训练样例的能力,分类能力最好的属性作为树的根结点测试。

       (4)然后为根结点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支(也就是说,样例的该属性值对应的分支)之下。

       (5)重复这个过程,用每个分支结点关联的训练样例来选取在该点被测试的最佳属性。

          信息增益:原来的信息需求(仅基于类比例)与新的信息需求(对属性A划分后)之间的差。

                            

                 Gain(A)告诉我们通过属性A上的划分我们得到了多少。选择具有最高增益Gain(A)的属性A作为分裂属性。这等价于在“能做最佳分类”的属性A上划分,使得完成 元组分类还需要的信息最小(即最小化InfoA(D))

          对D中的元组分类所需的期望信息由下式给出:

                           

          其中,pi是D中任意元组属于类Ci的非零概率,Info(D)又称为D的

          离散属性A(具有v个不同的观测值)对D进行属性划分后所需要的期望信息:    

                               

           需要的期望信息越小,分区的纯度越高。

           例子

顾客数据库标记类的训练元组


                首先,计算对D中元组分类所需要的期望信息:

                                 

               下一步,需要计算每个属性的期望信息需求(先计算属性age)。

                                

                                

                类似地,可以计算Gain(income)=0.029位   Gain(student)=0.151位   Gain(credit_rating)=0.048位。

                由于age在属性中具有最高的信息增益,所以它被选作分裂属性。并且每个属性值生长出一个分枝,然后元组据此划分。

                其中,落在分区age=“middle_age”的元组都属于相同的类。由于它们都属于类“yes”,所以要在该分枝的端点创建一个树叶,并用“yes”标记。 算法返回的最终决策树   如下图:


                     这个决策树只是一个属性分裂后的决策树,还需在每个分枝上递归地进行属性分裂(比如,在youth这个分枝上的剩下元组中,可以对student属性进行分裂,因为这样分类后信息增益最大,student是no(yes),class是no(yes))。

 

        上面我们说的分裂属性都是离散值的,如果是连续值的我们怎么计算它们的信息增益呢?

        假设属性A是连续值的,而不是离散值的(例如,假定有属性age的原始值,而不是该属性的离散化版本。)对于这种情况,必须确定A的“最佳”分裂点,其中分裂点是A上的阈值。

        首先,将A的值按递增序排序。典型地,每对相邻值的中点被看作可能的分裂点。这样,给定A的v个值,则需要计算v-1个可能的划分。对于A的每个可能的分裂点,计算Info(D),其中分区的个数为2,A具有最小期望信息需求的点选作A的分裂点。D1是满足A<=split_poin的元组集合,而D2是满足A>split_poin的元组集合。这样的话,就转换成离散属性的计算了。

        在此,顺便介绍一下,根据属性分裂准则划分元组的三种可能性:

 


4.2  C4.5算法(增益率

        ID3的缺点:信息增益度量偏向具有许多输出的测试。换句话说,它倾向于选择具有大量值的属性。例如,考虑充当唯一标识符的属性,如product_ID。在product_ID的划分将导致大量分区(与值一样多),每个只包含一个元组。由于每个分区都是纯的,所以基于该划分对数据集D分类所需要的信息为Infoproduct_ID(D)=0。因此,通过对该属性的划分得到的信息增益最大。显然,这种划分对分类没有用。C4.5的出现就是为了克服这种偏倚。

        C4.5:也是Quinlan提出来的,它是对ID3算法的改进,这些改进包括处理数值属性、缺失值、噪声数据和由决策树产生规则的方法。

        C4.5采用增益率作为属性选择度量,增益率定义为:

                                             

 

                 选择具有最大增益率的属性作为分裂属性。然而需要注意的是,随着划分信息趋向于0,该比率变得不稳定。为了避免这种情况,增加一个约束:选取的测试的信息增益必须较大,至少与考察的所有测试的平均增益一样大。比如我们可以先计算每个属性的增益,然后仅对那些增益高过平均值的属性应用增益率测试。

         其中,分裂信息度量被定义为(分裂信息用来衡量属性分裂数据的广度和均匀):

                                             

         例子

         事务数据库中属性income的增益率的计算:

                                             

                                              

4.3  CART算法(基尼指数

        CART分类和回归树(ClassificationAnd Regression Tree)算法由Breiman等人于1984年提出的。它是以二叉树的形式给出,易于理解、使用和解释。如果目标变量是离散的,则该树为分类树(classification tree),而对于连续数值目标变量,则该树称为回归树(regression tree)。

        Gini指数:是一种不等性度量,由意大利统计学家Corrado Gini提出,并于1912年发表在他的文章“Variabilita e mutabilita”中。它通常用来度量收入不平衡,但是它可以用来度量任何不均匀分布。Gini指数是一个0—1之间的数。其中0对应于完全相等(其中每个人都具有相同的收入),而1对应于完全不相等(其中一个人具有所有收入,而其他人收入都为零)。

         基尼指数度量数据分区或训练元组集D的不纯度,定义为:

                                            

其中pi是D中元组属于Ci类的概率,对m个类计算和。

         基尼指数考虑每个属性的二元划分。

      (1)首先考虑A是离散值属性的情况,其中A具有v个不同值出现在D中。如果A具有v个可能的值,则存在2v个可能的子集。例如,如果income具有3个可能的值{low,medium,high},则可能的子集具有8个。不考虑幂集({ low,medium,high})和空集({ }),因为从概念上讲,它不代表任何分裂。因此,基于A的二元划分,存在2v -2中形成数据集D的两个分区的可能方法。

当考虑二元划分裂时,计算每个结果分区的不纯度的加权和。例如,如果A的二元划分将D划分成D1和D2,则给定该划分,D的基尼指数

                                               

选择该属性产生最小基尼指数的子集作为它的分裂子集。

      (2)对于连续值属性,其策略类似于上面介绍的信息增益所使用的策略。

                对于离散或连续值属性A的二元划分导致的不纯度降低

                                                

                最大化不纯度降低(或等价地,具有最小基尼指数)的属性选为分裂属性。该属性和它的分裂子集(对于离散值的分裂属性)或分裂点(对于连续值的分裂属性)一起         形成分裂准则。

        例子

        继续使用“顾客数据库”进行介绍。

      (1计算D的不纯度:

                                              

      (2为了找出D中元组的分裂准则,需要计算每个属性的基尼指数。从属性income开始,并考虑每个可能的分裂子集。考虑子集{low,medium},基于该划分计算出的基尼指数为:

                                             

        类似地,其余子集划分的基尼指数值是:0.458(子集{low,high}和{medium})和0.450(子集{medium,high}和{low})。因此,属性income的最好划分在{low,medium}(或{high}) 上,因为它最小化基尼指数。

       评估属性age,得到{youth,senior}(或{middle_aged})为age的最好划分,具有基尼指数0.357;

       属性studentcredit_rating都是二元的,分别具有基尼指数值0.367和0.429。

      (3属性age和分裂子集{youth,senior}产生最小的基尼指数。二元划分“age属于{youth,senior}?”导致D中元组的不纯度降低最大,并返回作为分裂准则。从它生长出两个分枝,并且相应地划分元组。

5、决策树算法之间的比较

       信息增益偏向于多值属性。尽管增益率调整了这种偏倚,但是它倾向于产生不平衡的划分,其中一个分区比其他分区小得多。基尼指数偏向于多值属性,并且当类的数量很大时会有困难。它还倾向于导致相等大小的分区和纯度。尽管是有偏的,但是这些度量在实践中产生相当好的结果。

6、树剪枝

        决策树为什么要剪枝?

        原因是避免决策树过拟合(Overfitting)样本。前面的算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。

        “如何进行剪枝?”有两种常用的剪枝方法:先剪枝和后剪枝

        先剪枝:通过提前停止树的构建(例如,通过决定在给定的节点不再分裂或划分训练元组的子集)而对树“剪枝”。一旦停止,结点就成为树叶。该树叶可以持有子集元组中最频繁的类,或这些元组的概率分布。

        在构造树时,可以使用诸如统计显著性、信息增益、基尼指数等度量来评估划分的优劣。如果划分一个结点的元组导致低于预定义阈值的划分,则给定子集的进一步划分将停止。然而,选取一个适当的阈值是困难的。高阈值可能导致过分简化的树,而低阈值可能使得树的简化太少。

         例子:限定树的最大生长高度为3

                                                                   

        后剪枝:它由“完全生长”的树剪去子树。通过删除节点的分枝并用树叶替换它而剪掉给定结点上的子树。该树叶的类标号用子树中最频繁的类标记。

        例子:

                                                                     

        决策树算法用的是什么剪枝?

        CART使用的是:代价复杂度(后剪枝方法的一种实例)剪枝算法。

       该方法把树的复杂度看作树中树叶结点的个数和树的错误率的函数(其中,错误率是树误分类的元组所占的百分比)。它从树的底部开始。对于每个内部结点N,计算N的子树的代价复杂度和该子树剪枝后N的子树(即用一个树叶节点替换)的代价复杂度,比较这两个值。如果剪去结点N的子树导致较小的代价复杂度,则剪掉该子树;否则,保留该子树。

        C4.5使用的是:悲观剪枝。它类似于代价复杂度方法,因为它也使用错误率评估,对子树剪枝做出决定。

        剪枝后还可能存在什么困扰?

        另外,对于组合方法,先剪枝和后剪枝可以交叉使用。后剪枝所需要的计算比先剪枝多,但是通常产生更可靠的树。

       尽管剪枝后的树一般比未剪枝的树更紧凑,但是他们仍然可能很大、很复杂。决策树可能受到重复复制的困扰,使得他们很难解释。

       沿着一条给定的分枝反复测试一个属性时就会出现重复。复制是树中存在重复的子树。这些情况影响了决策树的准确率和可解释性。

       解决办法:(1)使用多元划分(基于组合属性的划分)(2)使用不同形式的知识表示(如规则),而不是决策树。





        更多关于剪枝的内容(特别是代价复杂度剪枝和悲观剪枝),可以参考文献:

        决策树分类及剪枝算法研究_张宇(哈尔滨理工大学)

        决策树学习及其剪枝算法研究_王黎明(武汉理工大学)

 

7、可伸缩性与决策树归纳(后期续写

 

1 0
原创粉丝点击