机器学习西瓜书&南瓜书——决策树模型
本文主要结合南瓜书对西瓜书决策树模型进行一个解读,帮助大家更好的理解西瓜书
决策树模型是机器学习领域最常见的模型之一,甚至有人说决策树模型上机器学习领域的水平上升了一个台阶。决策树的基本思想是根据样本的一些特征来构造一个树,树的每个分支节点都是一个分支属性,每个分支节点都会针对当前节点的属性把样本一分为二,有这个属性或者说在这个属性上表现为yes的数据被分为一个集合,没有这个属性或者在这个属性上表现为no的数据呗分为一个集合。一个完整的决策过程包含若干个子决策,最终得到判定结果。以“找出好瓜”这个任务为例,假设西瓜有“色泽“,”根蒂“,”敲击声“这三个属性,假设先判定“色泽”这个属性,色泽为青色的是好瓜,其余的都不是好瓜,这样根据“色泽”这个属性就可以划分两个集合,接下来就在分别根据“根蒂”和“敲击声”这两个属性划分,以此类推,最后的到一个好瓜的特征,然后就可以用这棵树进行预测了。
决策树每一步都是在缩小集合的范围,每一步都是在上一步的基础上进行细分的,其考虑范围是在上次决策结果范围之内的。一棵决策树包含一个根结点,若干个分支节点和叶节点,根结点包含所有样本数据,每个分支节点对应一个属性测试,叶子节点对应决策结果。西瓜书中也给出了决策树训练的具体流程:
流程解释:
首先TreeGenerate是一个递归执行的函数,每次进入函数都会先生成一个新的分支节node,然后接下来的操作都是在确定选择哪个属性(或属性值取多少)来最为决策点。
第一种情况:对应代码第2行,如果当前节点的样本集合中所有样本都是同一类的(在执行分类前就是同一类的了),那么直接把这个node标记为叶子节点,类别为C类。
第二种情况:属性集合A为空或D在A上的取值相同,对应代码第5行。这句话要分成两部分来看,这两部分又分别对应两种小的情况。“属性集合A为空”:当样本细分到当前节点node时属性已经分完了,但是样本还没完全分开,还拿西瓜举例子,A={“色泽”,“根蒂”,“敲声”},现在已经根据这个三个属性进行分类的,但是分出的样本子集还是有正有负(即样本没完全分开),这时递归不得不中止,因为已经没有属性可让你再分了;“D在A上的取值相同”:A中的属性还没用完,但是后面不管再取A中的哪个属性,样本在这些属性上的表现都是一样的,这样不管怎么分都是没有意义的,所以递归可以停止了。对于这两种情况,node也需要标记为叶子节点,它的类型就是D中样本数最多的样本的类型。
第三种情况:如果根据属性a划分后数据集为空集,说明样本数据中根本没有样本有这个属性,不能再分,所以把node叶子节点为了能训练出包含决策a的决策树,我们使用先验概率,把父节点中样本量多的数据的类型当作这个节点的类型。
第四种情况:如果不符合上面三种情况,说明集合D到这一步还是可以再往下分的,或者说他再往下分也是有意义的,所以这种情况的关键就是要找到A中最优的划分属性a*,使得根据a划分出的数据使模型的分类性能更好。下面介绍的关键就是如何找到这个a*
ID3决策树
ID3决策树算法是以信息论为基础,以信息熵为指标来选出最优的a的。选择a的目的就是不断划分数据集日,让数据子集的“混乱程度”越来越小,也就是让子集越分越是同一类型的数据。信息论中的“信息熵”这个概念可以衡量信息的“混乱程度”。
y是样本的总类型数。信息熵可以衡量一个集合的“纯度”但是如何根据这个选出最优的a呢?最简单直接的办法就是从A中挨个试每个a,使用每个小a都对当前集合分一下,假设分出v个子集合,然后计算出这v个子集合信息熵的和跟分类前的信息熵做减法,计算出中间的“增益gain”(也是就是变化量),比较使用各个a分类后“增益”的大小,选出“增益”最大的作为当前节点最优的a,即a。
这里再解释下为什么要选“增益”最大的,按照西瓜书的说法“增益越大说明按照a划分所获的纯度的提升越大”,“增益“越大说明信息熵减少的就越多,举一个例子:假设一个节点node一共有A={a1,a2}两个属性,划分前总的信息熵为10,使用a1划分后子集信息熵的和为5,使用a2划分后子集信息熵的和为8,说明a1划分后样本的混乱程度更小,样本更纯,因此a1的划分效果更好。
西瓜书给出“信息增益”的计算公式:
大家注意,在公式的后半部分西瓜书给Ent加了一个权重,这个权重是根据子集样本大小动态变化的,目的就是让样本多的集合影响更多一些,样本小的集合影响更小一些。这个很容易理解,因为样本量大就更具有客观性,应该给予更大的占比,并且小样本集合天然的就比大样本集合的混乱程度要小,所有小样本的结果不太具有参考意义,给他一个小权重。
下面是西瓜书给出的构造ID3决策树的实际例子:
C4.5决策树
其实使用ID3决策树已经可以对离散的数据进行分类了,但是他有一些弊端,就是他会对可选数值较多的属性有所偏好,因为一个属性他可选的数值越多他划分出的子集也就越多,划分出的子集合越多每个集合中的数据也就越“纯”。这是符合ID3决策树的生成逻辑的,但是这样会导致模型的泛化性急剧下降,就像书中所说的“按照编号进行划分,每个编号都可以划分成一个子集并且这个集合中只有他自己一个元素“这样集合的信息熵确实是下降了,但是在新样本上模型是不具有预测能力的。于是Quinlan提出了用增益率选出a*的方法。
增益率:
在Gain的基础上除去IV后就会平衡多取值属性的影响程度,让他不那么“强势”。这其实是一个标准化(normalization)的过程,统一了单位。
C4.5确实解决了ID3的问题,但是他又引入一个新问题,就是增益率会对样本可取值数目较少的属性有所偏好,纯纯是解决了一个bug又引入一个新bug。因此c4.5在使用时不会直接根据增益率选择最优属性,而是先选出信息增益高出平均值的属性然后再从这几个属性中使用增益率排序得出最优属性。
CART(基尼指数)决策树
后续
随着技术不断的发展,决策树的种类层出不穷,但是他们和核心目标都是选出让子集更“纯”的属性a。研究表明,只要决策树能实现让子集更“纯”,不管使用什么方法选出a,模型的性能差别都不大,与怎么选出a相比更重要的是“剪枝”处理。剪枝顾名思义就是减去决策树的一些分支节点,这一操作可以大大提高模型的泛化能力,实验表明有些决策树在进行剪枝处理后性能提升高达25%。后续文章会讲解剪枝操作。