4.1 基本流程
顾名思义,决策树就是基于树的结构来进行决策的。如图4.1所示,从树的根结点,到叶子结点(也就是判别结果),其中一般会经过若干个中间结点,每个中间结点对应一个属性测试,例如图中的色泽属性,根蒂属性,敲声属性。其中根结点是包含样本全集的,每经过一个中间结点,则会根据中间结点属性测试的结果划分到子结点中。
二分类情况的决策树:
决策树的构造是一个递归的过程,有三种情形会导致递归返回:
(1) 当前结点包含的样本全属于同一类别,这时直接将该节点标记为叶节点,并设为相应的类别;
(2) 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分; 这时将该节点标记为叶节点,并将其类别设为该节点所含样本最多的类别;
(3) 当前结点包含的样本集合为空,不能划分; 这时也将该节点标记为叶节点,并将其类别设为父节点中所含样本最多的类别。
算法的基本流程如下图所示:
4.2 划分选择
由此看出决策树学习的关键在于第8行,即如何选择划分属性,不同的划分属性得出不同的分支结构,从而影响整颗决策树的性能。属性划分的目标是让各个划分出来的子节点尽可能地“纯”,即属于同一类别。因此下面便是介绍量化纯度的具体方法。
4.2.1 信息增益
著名的ID3算法使用信息增益为准则来选择划分属性,“信息熵”(information entropy)是度量样本结合纯度的常用指标,假定当前样本集合D中第k类样本所占比例为pk,则样本集合D的信息熵定义为:
信息熵:具体参考这两篇文章:
什么是信息(定性)
信息为什么还有单位,熵为什么用 log 来计算?
假定通过属性划分样本集D,产生了V个分支节点,v表示其中第v个分支节点,易知:分支节点包含的样本数越多,表示该分支节点的影响力越大。故可以计算出划分后相比原始数据集D获得的“信息增益”(information gain):
信息增益越大,表示使用该属性划分样本集D的效果越好,因此ID3算法在递归过程中,每次选择最大信息增益的属性作为当前的划分属性。
信息增益含义:
熵:表示随机变量的不确定性。
条件熵:在一个条件下,随机变量的不确定性。
信息增益:熵 - 条件熵
在一个条件下,信息不确定性减少的程度!
通俗地讲,X(明天下雨)是一个随机变量,X的熵可以算出来, Y(明天阴天)也是随机变量,在阴天情况下下雨的信息熵我们如果也知道的话(此处需要知道其联合概率分布或是通过数据估计)即是条件熵。
两者相减就是信息增益!原来明天下雨例如信息熵是2,条件熵是0.01(因为如果是阴天就下雨的概率很大,信息就少了),这样相减后为1.99,在获得阴天这个信息后,下雨信息不确定性减少了1.99!是很多的!所以信息增益大!也就是说,阴天这个信息对下雨来说是很重要的!
所以在特征选择的时候常常用信息增益,如果IG(信息增益大)的话那么这个特征对于分类来说很关键!!!决策树就是这样来找特征的!
具体实现过程(先计算根节点的信息熵,然后依次计算各个属性的信息增益,选择最大的那个属性当成下一个分支的节点):
4.2.2 增益率
简单使用信息增益作为准则有一个较大的问题,就是它更偏好取值较多的属性。例如,当相貌这个属性有帅和不帅两个取值,而身家这个属性有贫穷,小康,中产,富裕四个取值,那么信息增益会更偏好身家这个属性。因此引出了增益率来解决。
著名的C4.5算法使用了“增益率”(gain ratio)来选择划分属性,避免这个问题带来的困扰。
首先使用ID3算法计算出信息增益高于平均水平的候选属性,接着C4.5计算这些候选属性的增益率,增益率定义为:
需注意的是,信息增益除以固有值后获得的增益率反而是偏爱取值数目较少的属性的,所以一个合理利用增益率来对属性划分的启发式规则:先从候选划分属性中选出信息增益高于平均水平的属性,再从中选择增益率最高的。
4.2.3 基尼指数
常用的CART决策树使用基尼值作为纯度的衡量标准。
基尼值:
从上式可以看出,基尼值反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,基尼值越小,则数据集D的纯度越高。
4.3 剪枝处理
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。为了尽可能正确分类训练样本,会不断的进行结点划分,有时会造成决策树分支过多,这时就可能因为训练过程学得太好了,将训练集自身的一些特点当作普遍化特征进行学习而会导致“过拟合”。因此,可通过主动去掉一些分支来降低过拟合的风险。
目前决策树剪枝的基本策略有以下两种:
- 预剪枝(prepruning):指在节点划分之前就预先判断,如果在该节点上继续划分无法带来泛化能力的增强,那么就停止划分而将其作为叶子节点。
- 后剪枝(post-pruning):指先生成一颗完整的决策树之后自底向上检查非叶子节点,如果将其改为叶子节点能使泛化性能提高,那么就将其替换为叶子节点。
如何判断决策树泛化性能是否提升?使用到2.2节介绍的性能评估方法。本节假定采用留出法。于是西瓜数据可以分成如下图所示:
假定我们采用4.2.1节的信息增益准则来进行划分属性选择,则从表4.2训练集将会生成一棵如图4.5所示的决策树。
4.3.1 预剪枝
预剪枝的定义就是在决策树生成的过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分,并将当前结点标记为叶子结点。
我们通过对比划分前后的验证集的准确率来进行泛化性能的评估。如果经过划分后,验证集的准确率提高了,则认为当前结点的划分对于泛化性能的提升是有意义的,否则不计划分。
通过预剪枝,不仅可以降低过拟合的风险,同时因为限制了无意义的结点划分,在训练和测试的计算成本上也有所优化。
由此我们可以认识到预剪枝是判断当前结点对于泛化性能的影响,并没有考虑当前结点的后续结点是否有机会能够提升泛化性能,这是一种“贪心”的本质。这个策略带来的问题就是有可能会丢失那些在后续确实能提高泛化性能的结点,因此预剪枝带来欠拟合的风险。
4.3.2 后剪枝
后剪枝是发生于决策树生成完成以后,从由底至上考虑每个非叶节点,若将该结点替换为叶节点能够给决策树带来泛化性能的提升的话,则将该结点替换为叶节点。
因为后剪枝是在一棵完整的决策树的基础上从底至上考虑每个非叶节点,相对于预剪枝来说欠拟合风险很小,不过训练时间开销是比较大的。
4.4 连续值与缺失值处理
4.4.1 连续值处理
到目前为止我们讨论的都是离散属性,但是现实任务中我们不可避免的会遇到连续属性,此时我们应该如何处理呢?
C4.5算法(即信息增益)给出的方案是用二分法来对连续属性进行处理。假设样本集为D,其中有一连续属性a,假设a在D上有n个不同的取值,我们将其由小到大排序 {a1,a2,⋯,an} 。我们设定一个划分点 t 将D分为两个子集D−t,D+t,前者包含属性a上小于等于 t 的样本,后者包含大于 t 的样本。显然这里 t 在两个相邻a值之间取任意值不会影响划分结果,那么 t 值就有n−1个候选项。通常我们可将划分点设为各个区间的中位点,即:
此区间为:
那么我们就可以像离散值一样考察这些划分点,例如当使用信息增益时:
此处理方法大概意思如下(具体例子参见课本):
我们需要做的是将训练样本中该属性的所有取值进行排序,并对这排好序的取值队列进行分区划分,每一个分区即为该属性的一个离散点取值。
不失一般性,我们就取二分法(即分为两个分区,可以根据需要分为N个)来进行描述。以身高划分为例,训练集中身高数据取值(cm)排序如下:
{160,163,168,170,171,174,177,179,180,183}
因为是二分法,我们只需要找到一个划分点即可。每个划分点可放在两个取值之间,也可放在一个取值之上,这里我们取两个取值之间的中位数。那么上边例子中可选的划分点为:
{161.5,165.5,169,170.5,172.5,175.5,178,179.5,181.5}
根据不同的划分,我们可以分别计算一下信息增益的大小,然后选出一个最好的划分来。
需要注意的是,连续属性被用来在某个节点做划分之后,仍然可以在后续节点被用到,这和离散属性不同。
即你将身高划分为“小于175”和“大于等于175”两部分,对于“小于175”的子结点,你仍然可以继续划分为“小于160”和“大于160”两部分。
4.4.2 缺失值处理
现实任务中往往会遇到缺失值的问题,例如样本的某些值较为敏感或者涉及到隐私,又或者因为种种原因丢失了,此时如果简单地放弃不完整的样本,显然是对数据的很大浪费。
属性缺失时,我们需要处理两个问题:
第一,如何在属性值缺失的情况下进行属性划分选择
不将缺失值的样本代入选择判断的公式计算(信息增益、增益率、基尼指数)之中,只在计算完后乘以一个有值的样本比例即可。
比如训练集有10个样本,在属性 a 上,有两个样本缺失值,那么计算该属性划分的信息增益时,我们可以忽略这两个缺失值的样本来计算信息增益,然后在计算结果上乘以8/10即可。
第二,若一个样本在划分属性上的值为空,它应该被分在哪个子结点中
若样本 x 在划分属性 a 上取值未知,则将 x 划入所有子结点,但是对划入不同子结点中的 x 赋予不同的权值(不同子结点上的不同权值一般体现为该子结点所包含的数据占父结点数据集合的比例)。
C4.5算法给出了如下的解决方案。
对于给定的数据集D和属性a,令D~ 为D中在属性a上没有缺失值的样本子集。那么对于问题一,我们可以仅根据D~ 来判断属性a的优劣。我们令D~ v表示D~ 中在属性a取值为av的样本子集,而D~ k表示D~中属于第k类的样本子集。我们给每个样本赋予一个权重Wx(权重初始为1)。接着我们定义这样几个概念:
其中ρ表示无损样本的比例,p~ k表示无缺失值样本中第k类样本所占比例,r~v表示无缺失值样本在属性a中取值av的样本所占比例。 基于此,我们可以将信息增益的计算式推广到:
那么对于第二个问题,如果样本x在属性a上的取值未知,那么则将x同时划入所有子节点,且调整样本在不同属性值av的子节点下的权值为:
即以不同权重划分到所有分支节点中。
书本有详细举例,此处不展开,最后生成的决策树如下:
此节公式部分扩展解析[解析]
4.5 多变量决策树
到现在为止我们讨论属性划分时都只考虑了单一属性,即每次节点的划分只涉及一个属性;在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似,此时的决策树会相当复杂,由于要进行大量的属性测试,预测时间开销会很大。
想象一下,若我们把样本的每个属性都视为坐标空间中的一个坐标轴,则由d个属性描述的样本就对应了d维空间中的一个数据点。对样本的分类就意味着在这个坐标空间中寻找不同类样本之间的分类边界。 而我们前面提到的决策树在d维空间中形成的分类边界有一个特点:轴平行,即它的分类边界由若干个与坐标轴平行的分段组成的。
如图4.11所示,这个样本集的属性只包括两个连续属性(密度,含糖率)。
如图4.12所示,此时的决策树会相当复杂,由于要进行大量的属性测试,预测时间开销会很大。
若能使用斜的划分边界,如图4.12中红色线段所示,则决策树模型将大为简化。
“多变量决策树”就是能实现这样的“斜划分”甚至更复杂划分的决策树。
以实现斜划分的多变量决策树为例,此时非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶结点是一个形如:
wi为属性ai的权重,wi和t可在所含样本集和属性集学得。
与之前不同,多变量决策树不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器(参考第三章)。例如西瓜数据3.0,我们可学得图4.13这样的多变量决策树,其分类边界如图4.14所示。
学习过程中参考了资料如下:
1、机器学习 - 周志华
2、百度百科
3、https://blog.youkuaiyun.com/u011826404/article/details/75577216
4、https://datawhalechina.github.io/pumpkin-book/#/
5、http://lunarnai.cn/2018/06/17/watermelon-chap-4/
6、https://www.jianshu.com/p/d80fbec52f09