树系列(一)决策树

  • 核心思想

    这里只讨论决策树用作分类任务的时候的情形,回归任务类似,

    下面阐述的是训练阶段的内容,给定数据集和属性集,每条数据由两部分组成,第一部分是属性集的所有取值组合中的一种可能取值,第二部分是这条数据的标签,算法的核心思想是以数据集为基础,找到一种方法来划分属性集,划分的结果是许多个属性子空间,每个子空间都对应了一棵树中从根节点到叶子节点的一条路径,所有属性子空间对应的路径拼接在一起就组成了一棵完整的树,这棵树中非叶子节点存放的是某一个属性和这个属性所有可能取值中的一个值,简称为参考值,每个叶节点中存放的是原始数据集中的数据子集,所有数据子集并在一起就是原先的数据集,这些数据子集都被划分为同一类,换句话说每个叶子节点代表的就是一类数据,

    开始构造树的时候,需要先构造根节点,在根节点中放入属性集的一个属性和这个属性对应的参考值,把所有大于这个属性上的参考值的数据放到根节点的右子节点中,把剩余数据放入根节点的左子节点中,这样根据这个属性的参考值就把原先的数据集划分为两部分,划分完数据集之后再把这个最优属性从属性集中删除掉,而后再对左右两个子节点中的数据子集重复上述操作,递归构建树,直到达到停止构建树的条件时结束构造,这样每个叶子节点都会对应一类数据,这里需要注意的是一个属性可能在不同的两个节点中出现,因为是递归构建树,某一个最优属性被暂时删除掉后,返回到这个属性对应的节点的叔节点时,这个属性是依然储存在属性集中的,

    停止构造树的条件有很多,比如一个节点中所有数据的类别都相同,则停止构造,这个节点被定义为叶节点,这个节点的类别就是节点内数据子集的类别,如果一个节点中所有数据的所有属性上取值都相同,则停止构造,这个叶节点的类别是所有数据中类别最多的那一类,还有可能树已经达到人工设定的最大树的深度,则停止构造,或者说属性集已经为空,这个时候停止构造树,

    构造完树之后还要检测一下这棵树的正确率如何,把每一条数据在这个树上根据指定节点的属性以及对应的参考值按照上述规则运行一遍,直到落到某一个叶节点为止,则这条数据的预测结果就是这个叶节点对应的类别,这样每一个数据都会有一个决策树的预测结果,再把预测结果和真实结果对比一下,就可以得到这棵树的正确率了,

    至于测试阶段,得到一个未知的与数据集中每一条数据同维度的数据,就可以用这个数据来在这个树上运行一遍,落入的那个叶节点的类别就是这个未知数据的类别,

  • 特征选择

    信息增益法特征选择

    一个离散随机变量的概率分布为

    P ( X = x i ) = p i   i = 1 , 2 , . . , n

    随机变量的熵为

    H ( X ) = i = 1 n p i l o g p i

    熵代表了随机变量的不确定性,熵越大,不确定性越高,

    如果有两个随机变量, ( X , Y ) , 其联合概率分布为

    P ( X = x i , Y = y j ) = p i j i = 1 , 2 , . . , n j = 1 , 2 , . . . , m

    条件熵 H ( Y / X ) 代表在已知X的情况下求Y的不确定性,定义为X给定之后Y的条件概率分布的数学期望,

    H ( Y / X ) = i = 1 n p i H ( Y | X = x i ) ( p i = P ( X = x i ) )

    信息增益代表的是得知特征X而使得训练数据集的信息的不确定度减少的程度,

    g ( D , A ) = H ( D ) H ( D | A )

    信息增益法的核心思想就是在特征集中选择信息增益最大的那个特征,把数据划分开,至于为什么数据划分完之后求出的特征增益一定是大于等于0的,这是因为根据某个特征的某个取值划分数据集之后相当于这个特征的分布已经确定了,因而整个训练集的不确定性就会下降,信息增益自然是大于等于0 的,

    ID3是基于信息增益法构建决策树的,

    具体求解特征A的信息增益的算法如下,


    训练集为D, | D | 代表的是样本容量,有K个类别 C k , k=1,2,…,K, | C k | 为类 C k 的样本个数,特征A有n个不同取值, a 1 , a 2 , . . . , a n , 根据不同取值将D划分为 D 1 , D 2 , . . . , D n , | D i | 表示 D i 的样本个数, D i 中属于 C k 的样本集合为 D i k , 即 D i k = D i C k , | D i k | 代表的是 D i k 的样本数,

    输入:训练集D和特征A,

    输出:特征A对训练数据集的信息增益g(D,A)

    1. 计算D的熵H(D)

    H ( D ) = k = 1 K | C k | | D | l o g 2 | C k | | D |

    这个公式表示的含义是对一个训练集D,通过分类K划分了很多子集,H(D)代表的是这个时候的不确定性,

    1. 计算A对D的条件熵,

    H ( D | A ) = i = 1 n | D i | | D | H ( D i ) = i = 1 n | D i | | D | k = 1 K | D i k | D i l o g 2 | D i k | | D i |

    1. 计算信息增益,

    g ( D , A ) = H ( D ) H ( D | A )


    当确定了A的分布之后,按照A的分布把数据集划分为几个子数据集,每个子数据集的A这个特征上的取值是相同的,这样每个数据集的不确定性的加权平均就组成了划分数据集之后的总的不确定度,

    划分数据集后的不确定度一定不大于原先的不确定度,因为每个子数据集的不确定度一定小于等于原始总数据集的不确定度,因为一个特征确定之后那么不确定度一定会下降的,因而加权求和之后的不确定度一定小于原始的不确定度的,

    信息增益一般比较倾向于选择取值较多的特征,但是也有例外,但是绝大部分情况都会选择取值较多的特征,

    信息增益比法特征选择

    信息增益一般比较偏向于选择取值较多的特征,因而引入了训练集关于特征A的值的熵 H A ( D ) , 而后原始的信息增益g(D,A)就变为了如下的 g R ( D ) , 信息增益比法相当于信息增益法的正则化,

    g R ( D ) = g ( D , A ) ) H A ( D ) , H A ( D ) = i = 1 n | D i | | D | l o g 2 | D i | | D |

    C4.5是基于信息增益比构建决策树的,

    基尼系数法特征选择

    假设有K类,样本点属于第k类的概率为 p k , 则概率分布的基尼系数为

    G i n i ( p ) = k = 1 K p k ( 1 p k ) = 1 k = 1 K p k 2

    对于给定的样本集合D, 基尼系数为

    G i n i ( D ) = 1 k = 1 K ( | C k | | C | ) 2

    C k 为D中属于第k类的样本子集, K是类的个数,样本集合根据A是否等于a 被分割为 D 1 D 2 两部分,而通过A划分数据集后D的基尼系数为

    G i n i ( D , A ) = | D 1 | | D | G i n i ( D 1 ) + | D 2 | | D | G i n i ( D 2 )

    Gini(D,A)表示经过A=a的分割后D的基尼系数,基尼系数同样表明了不稳定性,

    CART的分类树的划分标准就是基尼系数,

  • 剪枝操作

    之前提到决策树可能会过拟合,因为树的构造可能很复杂,那么将树的构造简化的过程为剪枝

    • 预剪枝

      先把数据取出一部分来作为验证集,而后每次分裂节点时都取评判验证集在分裂前后精度,如果分裂节点导致精度提高,则继续分裂,否则减去新生成的节点分裂,具体例子可见<西瓜书80-82页>

    • 后剪枝

      剪枝是通过优化树的损失函数来进行的,这时树已经训练完成,设树T的叶节点数为 | T | , t是T的叶节点,设该叶节点上有 N t 个样本点,其中k类的样本点有 N t k 个, k = 1 , 2 , . . , K , H t ( T ) 为叶节点的熵, α 0 , 则损失函数为

      C α ( T ) = i = 1 | T | N t H t ( T ) + α | T |

      其中

      H t ( T ) = k N t k N t l o g N t k N t

      C ( T ) = t = 1 | T | N t H t ( T ) = t = 1 | T | k = 1 K N t k l o g N t k N t

      C α ( T ) = C ( T ) + α | T |

      其中C(T)表示模型的预测误差,|T|表示模型复杂度,这个可能不好理解,如果把C(T)换一种公式表示就一目了然了, 后面一项如果叶节点所有的元素都分类都相同,那么 N t k N t 为0, 这时候取得最小值,如果分类不同,则一个叶节点内分布越均匀,站在这个叶节点这个角度上来看,这棵决策树的效果就越不好,因为这样这个叶节点的所属类别的可信度就会越低,一个极端的情况就是这个叶节点中每个数据的类别都不一样,那么在给这个叶节点赋一个类别的时候,就随便赋给它一个值就好了,这样可信度肯定是不高的,

      C ( T ) = t = 1 | T | N t H t ( T ) = t = 1 | T | ( k = 1 K N t k l o g N t k N t )

      α 控制两者的关系,这就是一对矛盾体,模型越复杂,损失函数的第一项越小,而第二项越大,反之亦然,


      输入: 算法已经生成的树T, 参数 α

      输出:修剪后的子树 T α

      1. 计算每个节点的熵,

      2. 递归的从树的叶节点往上回缩,这个回缩的过程为舍弃叶节点,令叶节点的父节点作为新的叶节点,把叶节点中的数据子集合并到父节点中,父节点有其对应的分类值 C k ,(至于为什么父节点保存分类值,请参见下文ID3算法第5步的解释) 设回缩前后树分别为 T B T A , 对应的损失函数为 C α ( T B ) C α ( T A ) , 如果有如下公式,则进行剪枝,

        C α ( T A ) C α ( T B )

      3. 返回2, 直到不能继续为止,

  • 决策树实例

    ID3


    输入:训练集D,特征集A,阈值 ϵ ,

    输出:决策树T,

    1. 若D中所有实例属于 C k , 则T为单节点树, 并将 C k 作为该节点的类标记,返回T,

    2. 若A为空,则T为单节点树,将D中实例数最大的类 C k 作为该节点的类标记,返回T,

    3. 计算A的信息增益,选择信息增益最大的特征 A g ,

    4. 如果 A g 的信息增益小于阈值 ϵ , 则置T为单节点树,将D中实例数最多的类 C k 作为节点的类标记,返回T,

    5. 否则对于 A g 的每一个可能值 a i , 将D划分为 D i , D i 中实例数最多的那个类作为标记,构建子节点,右节点及其子节点构成T,返回T,

    6. 对于第i个子节点,以 D i 为训练集,以 A A g 为特征集,递归的调用1-5步,得到子树 T i ,返回 T i ,


    值得注意的是, 上述算法第五步说明ID3算法生成的树不是一个二叉树,因为 A g 的取值可能有很多种,这个很重要,一定要和后续的Cart树区分开,

    C4.5

    算法和ID3类似,只不过把中间计算信息增益替换为信息增益比,

    CART之regression tree

    假设在这里我们已经构造好这棵回归树了,那么一个输入空间被划分为M个单元 R 1 , R 2 , . . . , R M , 每一个单元都有一个固定的输出 c m , 则回归树模型可表示为

    f ( x ) = m = 1 M c m I ( x R m )

    预测误差可以用 x R m ( y i f ( x i ) ) 2 来表示,而每个单元的最优输出为

    c m ^ = a v e ( y i | x i R m )

    到这里就可以看出如何划分空间才是最重要的,采用启发式的方法,先选用第j个变量 x ( j ) ,和它的取值,作为切分变量和切分点, 找到最优的切分点和切分变量,之后重复上述过程,直到满足停止条件,就构成一个回归树,


    输入:训练集D,

    输出: 回归树f(x)

    1. 选择最优切分点j和切分点s ,求解如下公式,遍历变量j, 对固定的切分变量j扫描切分点s, 让如下公式达到最小,注意的是,切分的是x, 计算方差的y,

    m i n j , s [ m i n c 1 x i R 1 ( j , s ) ( y i c 1 ) 2 + m i n c 2 x i R 2 ( j , s ) ( y i c 2 ) 2 ]

    1. 用选定的(j,s)划分区域并决定相应的输出值,

    R 1 ( j , s ) = x | x ( j ) s , R 2 ( j , s ) = x | x ( j ) > s

    c m ^ = 1 N m s i R m ( j , s ) y i , x R m , m = 1 , 2

    1. 重复1和2, 直到结束条件
    2. 把空间划分好,生成决策树,

    f ( x ) = m = 1 M c m ^ I ( x R m )


    CART之classification tree


    输入:训练集D,

    输出:决策树

    1. 计算Gini(D), 对于每一个特征A,对其可能的每个值a, 根据是否等于a把数据分为两部分,计算Gini(D,A),

    2. 在所有可能的A以及切分点a中选择切分后最小的基尼系数对应的最优特征和最优切分点,生成两个子节点,

    3. 递归调用1和2, 直到满足条件

    4. 生成分类树

    CART之剪枝操作

    对于树的某一个节点,以其为单节点树的损失函数如下,

    C α = C ( t ) + α

    当把它看成是以它为根节点的树的损失函数如下,

    C α ( T t ) = C ( T t ) + α | T t |

    这样当 α 很小时, 第一项小于第二项,这是因为在不引入正则化的前提下,单节点的损失函数一定比多节点的损失函数大,而当 α 逐渐增大,总存在一个时刻,使得两项相同,而后反号,当相同时有,

    α = C ( t ) C ( T t ) | T t | 1

    因而需要剪枝,对于初始未剪枝的树 T 0 的每一个内部节点,计算

    g ( t ) = C ( t ) C ( T t ) | T t | 1

    剪去g(t)最小的 T t ,将得到 T 1 ,设最小的g(t)为 α 1 而后重复这个过程,得到子树序列 T 0 , T 1 , . . . , T n ,

    得到子树序列后,经过独立的验证数据集,经过交叉验证后得到最优的子树以及对应的 α ,这就是最优的答案,

    对于cart的剪枝操作,上面计算的 g ( t ) 是一个阈值,即当总体的损失函数的参数 α = g ( t ) 的时候,剪枝前后总体的损失函数是一样的,如果 α 再增大一点,不剪的损失函数就大于减去的,即当 α 大于g(t)该剪,剪了之后整体的损失函数会减小, α 小于g(t)时不该剪,剪了损失函数会增大,

    对于同一个树的节点, α 都是一样的,当其从0逐渐增大时,总有某棵子树该剪,其他子树不该剪的情况,这时 α 超过某个节点的g(t),但是没超过其他节点的g(t)。当 α 不断增大,则树会不断剪枝,因而形成了子树序列,因而通过独立数据集测试这些子树,选出最好的一棵即为最优的树,

  • 处理连续和缺失数据

    • 连续问题

      对于分类问题,可以通过把连续特征离散化来解决连续化问题,即先把连续特征 a 上所有的取值排序为 { a 1 , a 2 , . . . , a n } , 基于划分点 t 可将D划分为 D t , D t + ,而划分点的取值集合为

      T a = { a i + a i + 1 2 | 1 i n 1 }

      这时信息增益为

      G a i n ( D , a ) = m a x t T a G a i n ( D , a , t )

      = m a x t T a E n t ( D ) λ { , + } | D t λ | | D | E n t ( D t λ )

      这样就能够得到对应属性的信息增益了,

    • 缺失问题

      这里简要说明,对于有缺失数据计算信息增益时,只考虑某一特征中没有缺失值的数据的信息增益,之后再把计算出来的信息增益乘以这一特征的不缺失数据数量与总数量的比值作为这一特征的最终信息增益,

      如果已经确定了划分特征,对于在这一特征上缺失的样本以不同的概率划分到子节点中,子节点中样本数量越多概率越大,

  • 选择特征后的有放回性

    首先需要声明的是,如果决定用决策树来解决分类问题,一般特征的取值也是离散的,如果某几个特征是连续的话,需要把连续的特征离散化,而对于回归问题,特征的取值一般是连续的,这点是要注意的,

    对于ID3/C4.5来说,如果选择的特征是二值或者是多值(但取值集合必须有限),那么在其子节点中是不允许再次选择这个特征的,而对于特征是连续的话,那么在父节点选择完这个特征后子节点还是可以选择继续选择这个特征的,

    而对于CART来说,如果选择的特征是二值的,那么在其子节点中是不允许再次选择这个特征的,而对于多值来说,子节点是可以再次选择已经选择过的特征的,而对于连续特征,子节点是可以再次选择已经选择过的特征的,

发布了36 篇原创文章 · 获赞 42 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37688445/article/details/79272233
今日推荐