## chapter 4 决策树
4.1 基本流程
决策树是常见的机器学习方法,我们希望从给定的训练数据集中学得一个模型用以对新示例进行分类,这个把样本分类的任务,可看做对“当前样本属于正类吗?” 这个问题的决策或判定过程。
决策树是基于树结构来进行决策的:
决策过程中的最终结论对应了希望的判定结果,例如“是”或“不是”好瓜,决策过程中提出的每个判定问题都是对每个属性的测试,例如“色泽=?”“根蒂=?”,每个测试的结果或是导出最终结论,或是导出进一步的判定问题,且其考虑范围是在上次决策结果的限定范围之内。
一颗决策树包含一个根节点,若干个内部节点和若干个叶节点,叶节点对应于决策结果,其它每个节点对应于一个属性测试;每个节点的样本集合根据属性测试的结果被划分到子节点中,根节点包含样本全集(也就是说,从根节点到叶节点的过程就是对样本全集的分类过程)。从根节点到每个叶节点的路径对应了一个判定测试序列。决策树是为了产生泛化能力强的模型,流程遵循分而治之的思路。
4.2 划分选择
随着划分过程的不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的纯度越来越高。
4.2.1 信息增益(ID3决策树)
信息熵是度量样本集合纯度最常用的指标,假定样本集合D中第k类样本所占的比例为pk,则D的信息熵定义为:
信息熵越小,则样本的纯度越高。
用属性a对样本集D进行划分所得的信息增益:
一般而言,信息增益越大,意味着使用属性a来进行划分所得的“纯度提升”越大,因此,可用信息增益来进行决策树的划分属性选择(选择信息增益最大的属性来作为划分属性)
e.g:西瓜数据集2.0
step1:根据分类比例(正例占8/17,反例占9/17)计算根节点的信息熵。
step2:计算当前属性集合中每个属性的信息增益,如以“色泽”对D进行划分,则可得到三个子集,分别为{青绿,乌黑,浅白},在每个子集,根据子集中样本的正反例比例,得到这三个子集(分支节点)的信息熵:
于是得到“色泽”的信息增益:
类似的,可以得到其他属性的信息增益:
step3:对{清晰,模糊,稍糊}三种样例,分别计算其它属性的信息增益(以清晰为例):
三种属性均取得最大信息增益,任选其一即可。最终结果(这里,因为纹理模糊的只有一个瓜,因此直接判断为坏瓜,不用继续分支,其它节点也是同理,直至分至该属性组合完全是由同类样本组合构成的结点时,不再继续分支):
4.2.2 增益率(C4.5决策树)
实际上,信息增益对可取值数目较多的属性所得的结果会高,C4.5决策树使用增益率来减弱这一影响,增益率定义为:
式中:
称为属性a的“固有值”,a的可能取值数目越多,则IV(a)通常越大。
但增益率准则对可取值数目较小的属性有所偏好,所以C4.5不是直接选择增益率最大的作为划分属性,而是使用了启发式:先从候选划分属性中选择信息增益大于平均值的属性,再从这些属性中选择增益率最高的。
4.2.3 基尼指数(CART决策树)
数据集的纯度可用基尼值来度量:
基尼指数反映了从数据集D中随机选取两个样本,其类别标记不一致的概率,基尼指数越小,则数据集D的纯度越高。
属性a的基尼指数定义为:
在属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即:
4.3 剪枝处理
剪枝是决策树学习算法对付过拟合的主要手段,决策树学习中,为了尽可能正确分类样本,节点划分过程将不断重复,有时会造成决策树分支过多,以至于把训练集自身的一些特点当做所有数据都具有的一般性质而导致过拟合。通过主动去掉一些分支,可以降低过拟合的风险。
基本策略:1、预剪枝 2、后剪枝
4.3.1 预剪枝
基于信息增益准则,选取属性的脐部对训练集进行划分,并产生三个分支,对于是否应该进行这个划分,就要由预剪枝在判断划分前后的泛化性能决定。
判定方法:分别测试划分前和划分后,通过测试集得出的泛化能力。
(如脐部,若不划分,则该根节点变为叶节点,类别标记为训练样例最多的类别,假设将这个叶节点标记为好瓜(因为训练集中好瓜坏瓜的数目相同,因此选好瓜坏瓜都行),则通过测试集判断其精度为42.9%(3/7),再将42.9%与划分后的精度71.4%进行对比(5/7),发现泛化能力变强,因此脐部可以继续划分)
下面对三个节点分别使用相同的方法计算验证集精度,判断划分前后的大小,以此决定是否进行划分。最终被剪枝为上图的决策树。这样可以减少过拟合的风险,并显著减少决策树的训练时间开销和测试时间开销。
有些分支的当前划分虽然不能提升泛化性能,或者导致泛化性能下降,但在其基础上进行的后续划分却有可能导致性能显著提高,这可能会导致欠拟合。
4.3.2 后剪枝
先从训练集生成一颗完整决策树,即:
先考察结点6,把6结点的分支剪除,即将6结点作为叶节点,此时验证集精度提高为57.1%,于是剪除这三个分支。变为:
后剪枝后,验证集精度变为71.4%,后剪枝比预剪枝保留了更多的分支,欠拟合风险更小,泛化性能优于预剪枝,但需要生成完全决策树,训练开销较大。
4.4连续与缺失值
4.4.1 连续值处理
现实学习任务中常会遇到连续属性,有必要讨论如何在决策树学习中使用连续属性。
连续属性可取值数目无限,因此不能根据连续属性的可取值对结点进行划分(如按照色泽分为青绿等结点),因此,应采用连续属性离散化,最简单的离散化方法是二分法,也是C4.5采用的策略。
给定样本D和连续属性a,假定a在D上出现了n个不同的取值,将其从小到大排序,即为{a1,a2,…,an},基于划分点t可将D分为子集Dt-和Dt+,对于相邻的属性取值ai和ai+1来说,t在区间[ai,ai+1)中取任意值,所产生的划分结果相同,因此,对连续属性a,我们可考察包含n-1个元素的候选划分点集合:
分别选择每个划分点,计算各自的信息增益,找到最适合信息增益最高的点作为划分点进行样本划分(就是说按这个划分点将这个属性分为两类所得到的“纯度提升”最大,随后将这个最大的信息增益和其他属性比较,得到属性中信息增益最大的属性作为分支结点)
e.g.西瓜3.0,加入了密度和含糖率
对属性“密度”,按大小排列,计算得到16个候选划分点,按每个划分点计算密度的信息增益,得到最高信息增益为0.349对应于划分点0.126。再与其他属性的信息增益进行比较,得出纹理最高,下面按照递归的方法得到整个决策树:
4.4.2 缺失值的处理
有些样本的某些属性会缺失,如果简单舍弃,是对样本资源的极大浪费。
问题一:如何在属性值缺失的情况下进行划分属性选择(信息增益咋算)
问题二:选定了划分属性,在属性值缺失的情况下,如何进行样本划分
问题一:令D’为D中在属性a上没有缺失属性的样本子集,假定属性a有V个可取值,令Dv’表示D’中在属性a上取值为av的样本子集,Dk’表示表示D’中属于第k类的样本子集,为每个样本赋予权重(开始阶段,根节点中每个样本的权重初始化为1),并定义:
ρ表示无缺失值样本所占比例,pk表示无缺失值样本中第k类所占比例,rv表示无缺失值样本中在属性a上取值av所占的比例。
因此,可将信息增益的公式推广为:
问题二:若样本x在划分属性a上的取值已知,则将x划入与属性值对应的子结点,且样本权值在子结点中保持为wx,若样本x在划分属性a上的取值未知,则将x同时划入所有子结点,且样本权值在与属性值av对应的子结点中调整为rv*wx(按照属性已知的样本在各属性的比例)。即让一个样本以不同的概率划分到不同的子结点中去。
e.g 西瓜数据集2.0α
根节点时,17个样例权值均为1,以色泽为例,14个样本构成D’,D’的信息熵为:
计算三种属性取值的信息熵:
属性“色泽”的信息增益为:
再乘以已知属性样本占总样本的比例ρ,得到最终信息增益:
类似的,求出其他属性在D上的信息增益:
色泽具有最高的信息增益,被用于对根节点进行划分,有对应属性的样本,进入对应的分支,且权重不变;对应属性缺失的样本,同时进入三个分支,并乘以有对应属性的样本在各分支的比例(7/15,5/15,3/15),接下来依据递归处理。
4.5 多变量决策树
d个属性描述的样本对应了d维空间的一个数据点,对样本分类意味着在空间坐标中寻找不同样本的分类边界,决策树所形成的分类边界具有一个特点:轴平行,它的分类边界由若干个与坐标轴平行的分段组成:
但真实分类边界较复杂时,必须使用很多段划分才能获得较好的近似:
此时需要进行大量属性测试,时间开销很大。
“多变量决策树”使用斜的分类边界(斜的,不是曲线),大大简化决策树模型,在此类决策树中,非叶节点不再是对某一个属性进行测试,而是对属性的线性组合进行测试,每个非叶节点都是形如
的线性分类器,wi和t可在该结点所含的样本集和属性集上习得。在多变量决策树的学习过程中,不是为每个非叶节点寻找一个最优划分属性,而是试图建立一个合适的线性分类器: