机器学习爬大树之决策树(ID3,C4.5)

     自己自学机器学习的相关知识,过了一遍西瓜书后准备再刷一遍,后来在看别人打比赛的代码时多次用到XGBoost,lightGBM,遂痛下决心认真学习机器学习关于树的知识,自己学习的初步流程图为:

决策树(ID3,C4.5)---->CART----->Boost Tree---->Gradient Boosting Decision Tree(GBDT)----->XGBoost------>lightGBM

     后面还会补上,Bagging,RF(Random Forest),那么机器学习中关于树的知识算是入门了!

一 决策树 (ID3算法基础)

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

下图是一个决策树的示例(注意我们仅用了两个feature就对数据集中的5个记录实现了准确的分类):

上图问题我们采用Headache特征作为根节点划分,那么当然我们也可以采用其他特征如:cough,temperatu等特征划分,所以我们要解决的问题是依据什么特征对数据集进行划分最为合理 

信息熵:

         熵:源于物理学中度量一个热力学系统的无序程度。而在信息学中,熵是对不确定的度量(即混乱程度的度量),1948年,香农引入了信息熵的概念 

  信息熵:为离散随机事件出现的概率。一个系统越有序,信息熵就越低;反之,一系统越是混乱,它的信息熵就越高。所以信息熵可以被认为是系统有序化的度量。

                假设当前样本集合D中第k类样本所占的比例为p_k(k=1,2,3,...,N),则D的信息熵定义为:

                                                 Ent(D) = -\sum _{y=1}^Np_klog_2p_k

计算信息熵时约定:若p=0,则plog_2p = 0,显然当N=1时Ent(D) = 0最小;当N\to\infty,Ent(D) = log_2\mid N\mid,因为信息熵是衡量一系统不确定(本人喜欢用混乱这个词)程度,显然Ent(D)越大,这当前集合D的混乱程度越高

具体计算来看下面的一个简单的例子,以二分类为例(C1表示第一类,C2表示第二类):

现在我们需要一个定量来找到最佳的划分点 

信息增益(information gain) :

             假设离散特征A如上面的例子中的Headache)有V个可能的属性取值\left \{ a^1,a^2,...,a^V\right \},(如特征headache的severe,no,mild),若使用离散特征A来对样本集合D进行划分,则会产生V个分支结点,其中第v个分支结点包含了集合D中所用在特征A中属性为a^v的样本,记为D^v,而\left | D^v \right |即属性为a^v的样本个数,我们可以根据信息熵公式算出D^v的信息熵Ent(D^v),再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重\left | D^v \right |/\left | D \right |,即样本数越多的分支结点的影响越大,于是便可计算出用特征A对样本集D进行划分所获得的“信息增益(information gain)”:

                                    Gain(D,A) = Ent(D) - \sum _{v=1}^V\frac{\left | D^v \right |}{\left | D \right |}Ent(D^v)

现在我们用上面的例子依次计算下分别取特征(headache,Cough,Temperature,Sore)的信息增益就一目了然:

首先要先计算Ent(D)显然,这是一个二分类问题,我们要根据特征来诊断病人是Flu,还是Cold两类,所以公式中的N=2,当前样本D中的样本个数为\left | D \right | = 5;

分类为Flu的样本个数为\left | D^{flu}\right | = 3 (即病人编号为p1,p3,p5),则p_{Flu} = \left | D^{Flu} \right | / \left | D \right | = 3 / 5=0.6

分类为cold的样本个数为\left | D^{cold} \right | = 2(即病人编号为p2,p4);则p_{cold} = \left | D^{cold} \right | / \left | D} \right | = 2 / 5 = 0.4

   Ent(D) = -\sum _{y=1}^Np_klog_2p_k = -(0.6*log_20.6 + 0.4*log_20.4) = 0.97 

(1) 计算特征值为Headache的信息增益Gain(D,A=Headache)

         1:特征headache的属性值分别为severe,no,mild:

            则  \left | D^{severe} \right | = 2                \left | D^{severe} \right | / \left | D \right | = 2 / 5 = 0.4

                  \left | D^{no} \right | = 1                     \left | D^{no} \right | / \left | D \right | = 1 / 5 = 0.2

                  \left | D^{mild} \right | = 2                  \left | D^{mild} \right | / \left | D \right | = 2 / 5 = 0.4

         2:分别计算Ent(D^{severe}),Ent(D^{no}),Ent(D^{mild}):

                i):D^{severe}=\left \{ p1,p5 \right \}两个样本,所以:

               Ent(D^{severe}) = -(2/2 * log_22/2 + 0/2 *log_20/2) = 0

               ii):D^{no}=\left \{ p2 \right \}一个样本,所以:

               Ent(D^{no}) = -(0/1 * log_20/1 + 1/ 1*log_21/1) = 0

              Iii):D^{mild}=\left \{ p3,p4 \right \}两个样本,所以:

               Ent(D^{mild}) = -(1/2 * log_21/2 + 1/2 *log_21/2) = 1.0

       3.计算headache的信息增益(将上面的值依次带入公式)

            

             Gain(D,A=Headache) = 0.97 - (0.4*0 +0.2*0+0.4*1 ) = 0.57

(2) 分别计算特征值为Cough,Temperature,Sore信息增益Gain(D,A=Cough)Gain(D,A=Temperature)

          Gain(D,A=Sore)   

       与上面的求Headache的步骤一样,在这里不在详细写出

        Gain(D,A=Cough) =0.97-(0.4*0+0.4*1+0.2*0)=0.57

        Gain(D,A=Temperature) =0.97-(0.2*0+0.8*1) =0.17

         Gain(D,A=Sore)=0.97-(0.8*0.75+0.2*0) = 0.37

(3)比较每个特征的信息增益,选取最大的特征进行划分(在这里Headache与Cough信息增益相同,我们选取Headache划分),之后再对每一个划分后的子集进行相同的步骤(已用的特征将不再以后的划分中使用),一般情况下叶子节点的生成满足以下步骤:

        i):当前结点包含的样本全属于同一类别,将不再划分并作为叶子结点,其类别标签为样本的类别

       ii):当前属性集为空,或是所有样本在所有属性上取值相同,将不再划分并作为叶子结点,其类别标签为该结点所含样本最多的类别

     iii):当前结点包含的样本集合为空,不能划分并将该结点作为叶子结点,但将其类别设定为其父结点所含样本最多的类别

          (我的理解是:以上例子来说,我们假设先取Headache划分,则severe中的样本 为(p1,p5),然后在子集(p1,p5)中,我们假设用Sore的特征划分这个子集,那么在Sore中属性值为no的样本是没有的,这个时候就用它的父结点的样本最多的类别来做该叶结点(空集)的类别

   实际上,信息增益准则对可取值数目较多的属性有所偏好,为减小这种偏好可能带来的不利影响,下面介绍著名的C4.5算法

       

二 C4.5算法

        C4.5算法采用增益率(Gain ratio)来选择最优划分特征,我们来看看增益率的计算公式:

                                                Gain Ratio(D,A) = \frac{Gain(D,A)}{IV(A)}

        其中:

                                               IV(A) = -\sum_{v=1}^{V}\frac{\left | D^v \right |}{\left | D \right |}log_2\frac{\left | D^v \right |}{\left | D \right |}

称为特征A的固有值(intrinsic value),特征A的可能取值数目越多(即V越大),则IV(A)的值通常会越大,需要注意的是,增益率准则对可取值数目较少的特征有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分特征,而是使用了一个启发式:先从候选划分属性中找出一个信心增益高于平均水平的特征,再从中选择增益率最高的。

                 

 连续与缺失值处理:

一 连续值处理:到目前为止我们都是用离散特征来生成决策树,但现实学习中有很多连续特征,因为连续特征的可取数目不再有限,因此,不能直接根据连续特征的可取值来对结点进行划分,在这里,我们采用的策略是二分法(bi-partition)对连续特征进行处理。

  给定样本集D和连续特征a,假定aD上有n个不同的取值,其中第n个取值记为a^n

         1:将这些值从小到大进行排序,记为\left \{ a^1,a^2,...,a^n \right \};

         2:基于划分点t可将样本集D分为子集D_{t}^{-}{D_{t}^{+}},其中D_{t}^{-}包含那些在特征a上取值不大于t的样本\left |D_{t}^{-} \right |表示其样本个数;而{D_{t}^{+}}则包含那些特征a上取值大于t的样本\left |D_{t}^{-} \right |则表示取值大于t的样本个数;

         3:把区间[a^i,a^{i+1})中位点\frac{a^i+a^{i+1}}{2}作为候选划分点。因此,对连续特征a,我们可考察包含n-1个元素的候选划分点集合

                                              T_a=\left \{ \frac{a^i+a^{i+1}}{2}\mid 1\leq i\leq n-1 \right \}

         4:然后我们可以像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分,则属性a的信息增益公式为:                                  

                                           Gain(D,a)=\underset{t\in T_a}{max} Gain(D,a,t)

                                                               =\underset{t\in T_a}{max}Ent(D)-\sum _{\lambda \in \left \{ -,+ \right \}}\frac{\left | D_{t}^{\lambda } \right |}{\left | D \right |}Ent(D_{t}^{\lambda })

             其中Gain(D,a,t)是样本集D基于划分点t二分后的信息增益,于是,我们就可选择使Gain(D,a,t)最大化的划分点

具体计算参考下面的一个例子即一目了然:假设我们有6个样本,其一个特征x为连续特征,现计算其特征x的信息增益,具体步骤与例子如下:

                          

编号 1 2 3 4 5 6
x 0.5 0.4 0.1 0.6 0.3 0.2
y 0 0 1 0 1 0

               i):对连续特征x从下到大进行排序:

                                          

编号 3 6 5 2 1 4
x 0.1 0.2 0.3 0.4 0.5 0.6
y

1

0 1 0 0 0

               ii):候选划分点t集合

                                            

划分点 0.15 0.25 0.35 0.45 0.55

               iii):计算每个划分点t对应的Gain(D,a,t)

                          先计算出Ent(D) =-(4/6*log_24/6 +2/6*log_22/6)=0.918     

                     1:取划分点t=0.15

                        则D_{t}^{-}=\left \{ 3 \right \}{D_{t}^{+}}=\left \{ 1,2,4,5,6 \right \}

                         \frac{\left | D_t^{-} \right |}{\left | D \right |}=1/6      ;            \frac{\left | D_t^{+} \right |}{\left | D \right |}=5/6

                        Ent(D_{t}^{- })=-(1/1log_21/1+0/1log_20/1)=0

                        Ent(D_{t}^{+ })=-(4/5log_24/5+1/5log_21/5)=0.721

                        Gain(D,a,t)=0.918-(\frac{1}{6}*0+\frac{5}{6}*0.721)=0.317

                     2:取划分点t=0.25

                        则D_{t}^{-}=\left \{ 3,6 \right \}{D_{t}^{+}}=\left \{ 1,2,4,5\right \}

                          \frac{\left | D_t^{-} \right |}{\left | D \right |}=2/6      ;             \frac{\left | D_t^{+} \right |}{\left | D \right |}=4/6

                       Ent(D_{t}^{- })=-(1/2log_21/2+1/2log_21/2)=1.0

                       Ent(D_{t}^{+ })=-(3/4log_23/4+1/4log_21/4)=0.811

                       Gain(D,a,t)=0.918-(\frac{2}{6}*1.0+\frac{4}{6}*0.811)=0.044

                     

                     3:取划分点t=0.35

                        则D_{t}^{-}=\left \{ 3,6,5 \right \}{D_{t}^{+}}=\left \{ 1,2,4\right \}

                          \frac{\left | D_t^{-} \right |}{\left | D \right |}=3/6      ;             \frac{\left | D_t^{+} \right |}{\left | D \right |}=3/6

                       Ent(D_{t}^{- })=-(2/3log_22/3+1/3log_21/3)=0.918

                       Ent(D_{t}^{+ })=-(3/3log_23/3+0/3log_20/3)=0

                       Gain(D,a,t)=0.918-(\frac{3}{6}*0.918+\frac{3}{6}*0)=0.459

                      

                      4:取划分点t=0.45

                         则D_{t}^{-}=\left \{ 3,6,5,2 \right \}{D_{t}^{+}}=\left \{ 1,4\right \}

                          \frac{\left | D_t^{-} \right |}{\left | D \right |}=4/6      ;             \frac{\left | D_t^{+} \right |}{\left | D \right |}=2/6

                       Ent(D_{t}^{- })=-(2/4log_22/4+2/4log_22/4)=1

                       Ent(D_{t}^{+ })=-(2/2log_22/2+0/2log_20/2)=0

                       Gain(D,a,t)=0.918-(\frac{4}{6}*1+\frac{2}{6}*0)=0.251

                      

                     5:取划分点t=0.55

                        则D_{t}^{-}=\left \{ 3,6,5,2,1 \right \}{D_{t}^{+}}=\left \{ 4\right \}

                          \frac{\left | D_t^{-} \right |}{\left | D \right |}=5/6      ;             \frac{\left | D_t^{+} \right |}{\left | D \right |}=1/6

                       Ent(D_{t}^{- })=-(2/5log_22/5+3/5log_23/5)=0.970

                       Ent(D_{t}^{+ })=-(1/1log_21/1+0/1log_20/1)=0

                       Gain(D,a,t)=0.918-(\frac{5}{6}*0.970+\frac{1}{6}*0)=0.109

             iV):比较每个划分点t对应的Gain(D,a,t),取最大的作为划分点:

                  显然    t=0.35Gain(D,a,t)最大,故取其作为该连续特征的划分点。

   须知,与离散特征不同,若当前结点划分特征为连续特征,那么该特征还可作为其后代结点的划分特征!

注意其实连续值得处理有一个最优化的方法,不需要逐个计算每个划分点的Gain(D,a,t),仅考虑位于具有不同类标号的两个相邻记录之间的候选划分点,最佳划分点一定是在这些候选划分点中的一个,例如上面的不同类别划分点有t = \left \{ 0.15,0.25,0.35 \right \}这3个,因此大大简化了计算;这是因为信息增益的目的是找出一个划分点能最好的划分将相同的类别放在一起,将不同的类别分开,所以若一个划分点左边与右边的样本类别相同,但我们将他们分开,显然是不合理的,所以我们仅需考虑位于不同类别标签之间的候选划分点即可!!!

二 缺失值处理:现实任务中常会遇到不完整的样本,即样本某些特征值缺失。如果简单地放弃不完整样本,仅使用无缺失值的样本进行学习,显然是对数据信息极大的浪费,下表是我们以前使用的例子,但一些特征的特征值已经缺失,如果放弃不完整的样本,则仅有一个样本可为我们所用!

                                         

                                      

         所以,我们需要解决两个问题  :

           (1):  如何在特征值缺失的情况下进行划分特征选择;

           (2):  给定划分特征,若样本在该特征上的值缺失,如何对样本进行划分?  

     对缺失值得处理的核心想法是为每个特征都附加一个权重p_{A},每一个样本都附加一个权重w_x  ,在决策树学习开始阶段,根结点中各样本的权重初始化为1

接下来 我们看看如何在特征值缺失的情况下进行划分特征选择。

  (1)特征值缺失的情况下进行划分特征选择

              给定训练集D和特征A,令\widetilde{D}表示D中特征A没有缺失值得样本集合显然我们可以仅根据\widetilde{D}来判断用特征A划分时的信息增益;假设特征AV个可取值\left \{ a^1,a^2,...,a^v \right \},令\widetilde{D}^v表示\widetilde{D}中特征A上取值为a^v样本子集\widetilde{D}_k表示\widetilde{D}中属于第k类(k=1,2,...,N)的 样本子集,现假设我们为每个样本x赋予一个权重w_x直观地看,对特征A来说,定义以下3个占比:

                   \rho =\frac{\sum _{x\in \widetilde{D}}w_x}{\sum_{x\in D}w_x }        (\rho表示无缺失值样本占训练集D的比例,即前面提到的特征的权重p_{A},算信息增益用

                 

                 \widetilde{p_k}=\frac{\sum _{x\in \widetilde{D_k}}w_x}{\sum _{x\in \widetilde{D}}w_x}     (\widetilde{p_k}表示无缺失值样本中第k类样本的权重之和与无缺失值样本的权重之和的比例,算信息熵用

              

               \widetilde{r_v}=\frac{\sum _{x\in \widetilde{D^v}}w_x}{\sum _{x\in \widetilde{D}}w_x}         (\widetilde{r_v}表示无缺失值样本中特征值为a^v的样本权重之和与无缺失值样本的权重之和的比例,算信息增益用

  

基于上述定义,我们可将信息增益的计算式推广为如下公式(注意上面几个参数的用处):

           Gain(D,A)=\rho \times Gain(\widetilde{D},A)

                                =\rho \times\left ( Ent(\widetilde{D})-\sum _{v=1}^{V}\widetilde{r_v}Ent(\widetilde{D}^v) \right ),

       其中:

         Ent(\widetilde{D})=-\sum _{v=1}^{N}\widetilde{p_k}log_2\widetilde{p_k}

              

直接看上面的公式有些晦涩难懂,其实跟前面学的信息增益相差无几,我们就简单的以上面的例子计算一下:我们想算出特征为Headache的信息增益,其他的类似

    训练集D=\left \{ p1,p2,p3,p4,p5 \right \};  \widetilde{D}=\left \{ p1,p2,p3,p4 \right \};  \widetilde{D}_{flu}=\left \{ p1,p3 \right \};   \widetilde{D}_{cold}=\left \{ p2,p4 \right \};  同样N=2;  为每个样本赋予权重w_x=1;

          接下来我们开始一个一个的根据公式算出参数:

            \rho =(1+1+1+1) / (1+1+1+1+1) = 4/5  (不是样本个数比,是权重之和的比值)

           \widetilde{p}_{flu}=(1+1)/(1+1+1+1)) = 1/2

           \widetilde{p}_{cold}=(1+1)/(1+1+1+1)) = 1/2

           \widetilde{r}_{severe}=(1)/(1+1+1+1)=1/4

           \widetilde{r}_{no}=(1)/(1+1+1+1)=1/4

           \widetilde{r}_{mild}=(1+1)/(1+1+1+1)=1/2

           Ent(\widetilde{D})=-(2/4*log_22/4+2/4*log_22/4)=1

           Ent(\widetilde{D}^{severe})=-(1/1*log_21/1+0/1*log_20/1)=0

           Ent(\widetilde{D}^{no})=-(1/1*log_21/1+0/1*log_20/1)=0

           Ent(\widetilde{D}^{mild})=-(1/2*log_21/2+1/2*log_21/2)=1

  万事俱备只欠带公式啦:

         

           Gain(D,A)=\rho \times Gain(\widetilde{D},A)

                                =4/5\times (1-(1/4*0+1/4*0+1/2*1))=0.4

基于以上步骤,用无缺失值得样本集分别计算出各个特征的信息增益,就很好的回答了问题(1)如何在特征值缺失的情况下进行划分特征选择!

(2)特征值缺失的情况下进行划分特征选择

           对问题(2),若样本\boldsymbol{x}在划分特征A上的取值已知,则将\boldsymbol{x}划入与其取值对应的子结点上,且样本权值在子结点中保持为\boldsymbol{w_x}若样本\boldsymbol{x}在划分特征A上取值未知,则将\boldsymbol{x}同时划入所有子结点,且样本权值在与特征值\boldsymbol{a^v}对应的子结点中调整为\boldsymbol{\widetilde{r_v}\cdot w_x};

其实,就是让同一个样本以不同的概率划入到不同的子结点中去,还是通过例子来简单的 讲讲吧!

       假如我们算的Headache的信息增益最大,对其划分有:

         \widetilde{D}_{severe}=\left \{ p1 \right \};        \widetilde{D}_{no}=\left \{ p2 \right \};            \widetilde{D}_{mild}=\left \{ p3,p4 \right \}  ;

         但p5这个样本因为在特征Headache上的值是缺失的,且此时\boldsymbol{w_{p5}}=1,将p5同时划入所有的子结点上

           \widetilde{D}_{severe}=\left \{ p1,p5 \right \}                   其中\boldsymbol{w_{p5}}=1*1=1

           \widetilde{D}_{no}=\left \{ p2,p5 \right \}                     其中\boldsymbol{w_{p5}}=1*1=1   

           \widetilde{D}_{mild}=\left \{ p3,p4,p5 \right \}            其中\boldsymbol{w_{p5}}=1/2*1=1/2

然后在进行下一轮的划分!

这是我的第一篇文章,一方面做为自己的学习笔记;另一方面希望对新学习的小伙伴们提供一些帮助!望共勉,后续文章我也会尽快更新!!有不足之处希望小伙伴们多多指教!!

参考资料:

              李航《统计学习方法》

               周志华《机器学习》

               https://blog.csdn.net/baimafujinji/article/details/51724371

猜你喜欢

转载自blog.csdn.net/weixin_41580067/article/details/84671106
今日推荐