决策树
在上一篇博客中,介绍了常见的决策树算法ID3,C4.5,CART选择特征的方式,这篇博客我们介绍决策树的构建过程。
决策树的构建
通过上一篇博客的介绍,我们知道了当数据的特征维度很高的时候,如何正确安排特征的使用顺序;这篇博客,具体来描述决策树的构建过程。如下图所示:
决策树将第一个使用的特征作为根节点,该特征的取值为根节点生成若干分支;之后的过程就是“分而治之”的过程,自根至叶的递归过程,每个中间结点都是一个特征,叶子结点是分类的结果。
其中,有上图所示的三种停止条件,满足其一,即可结束递归。下面分别对这三种停止条件进行一个说明:
- 当前结点包含的样本全属于同一类别,无需划分:这句话是说,如果对于某一结点下包含的所有数据样本来说,均属于同一类别,那么无需继续划分,该结点即为叶子结点。仍然以西瓜书中的例子说明,比如首先按照“触感”进行划分之后,“触感”为硬滑分类下,有三个样本1、{青绿,蜷缩,浊响},2、{青绿,硬挺,沉闷},3、{乌黑,蜷缩,清脆},这三个样本均为好瓜,那么这个时候无需再进行划分,“触感”为硬滑的结点就是叶子结点。
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分:这句话是说,在划分过程中,以ID3算法为例,每条由根节点到叶子结点的分支,是不同的特征依次使用得到的结果,每使用一个特征,对于该条分支来说,就从属性集中删去这一特征,如果当前属性集为空,表示不能再进行划分,该结点为叶子结点;另外一种情况是说,如果该结点的所有样本在所有属性值上取值相同,此时也无法进行划分,同样将该结点标记为叶子结点,此时该叶子结点的类别是该叶子结点包含的数据中最多的类别。举例说明:如果在某个结点,有三条样本数据1、{青绿,蜷缩,浊响},2、{青绿,蜷缩,浊响},3、{青绿,蜷缩,浊响},其中1,2为好瓜,3为坏瓜。因为三条样本数据在所有属性的取值相同,所以无法进行划分,此时取样本数据中类别占比最大的类别作为该叶子结点的类别,所以该叶子结点为好瓜。
- 当前结点包含的样本集合为空,不能划分:这句话是说,如果针对某一属性按照其属性的取值进行划分之后,某个结点包含的样本集合为空,这个时候,将该属性取值对应的结点作为叶子结点。例如:“色泽”这一属性,我们已知的取值范围是{青绿,浅白,乌黑},但是在训练数据中,我们没有乌黑色泽的样本,因此,对于乌黑这一分支产生的结点,我们直接将其作为叶子结点,且该叶子结点的类别为:数据集中类别占比最大的类别。
具体的流程可以概括如下:
示例
这里,我们以西瓜书中的例子,进行决策树构建的一个展示:
这是我们的训练集,其信息熵为0.998.
我们接下来,计算每个特征的信息增益:
“纹理”这一特征的信息增益最大,因此将其作为根节点,进行划分。之后针对每个划分之后的结点,使用除“纹理”这一特征之外的特征递归进行决策。不断选择信息增益最大的特征进行划分。其中,“纹理”为模糊的结点,其所有样本数据属于同一类别,满足上面所说的停止条件1,因此直接将该结点作为叶子结点,且该结点的类别为“坏瓜”。
剪枝方法
上面决策树的构建过程,我们知道可以根据训练集中的数据样本构造出一个完整的决策树,但是为了尽可能正确的划分训练样本,有可能会使得决策树中分支过多,造成训练集上的过拟合,从而导致该决策树在测试集上泛化性较差。因此,剪枝的方法被提出,剪枝就是通过主动去掉一些分支来降低过拟合的风险。
剪枝主要有两种方式:
预剪枝(pre-pruning):提前终止某些分支的生长
后剪枝(post-pruning):生成一棵完全“树”,再“回头”去剪枝。
在判断是否对当前分支进行剪枝的时候,使用验证集中的数据,如果该分支使得在验证集中的分类准确性上升,则保留该分支,否则剪枝。
示例
预剪枝:
仍然以《西瓜书》中的例子进行说明:
我们将数据划分为训练集和验证集,根据训练集构建决策树,根据验证集判断是否进行剪枝。
我们使用信息增益来进行属性的选择,在训练集中计算得到“脐部”这一属性的信息增益最大,所以将“脐部”作为根节点进行划分,
得到如上的决策树,然后计算剪枝前后的优劣。
如果剪枝,即不使用“脐部”这一分支,直接将训练集中样本数据最多的类别作为叶子结点,比如“好瓜”,那么在验证集中的准确率为
如果不剪枝,在训练集中的准确率为
可以看到不剪枝,会得到更高的准确率,所以保留“脐部”这一分支。
之后,使用同样的判别方式,进行是否预剪枝的判断。比如对于结点2,我们使用信息增益计算出,接下来要根据“色泽”则这一属性产生分支。
如果在节点2处,根据“色泽”这一属性进行划分,会得到如下结果:
此时,根据上图的决策树,在验证集中,会将{4,8,9,13}分类为好瓜,将{5,11,12}分类为坏瓜。所以可以看出正确分类了{4,8,11,12},所以在验证集上面的准确率为4/7=0.571. 因为生成这一分支之后,导致在验证集上面的准确性降低,0.571<0.714,所以对其进行剪枝,不在2节点处生成新的分支。
3结点处同样的方式进行判断,4节点处已经满足停止递归的条件,作为叶子结点不能再继续划分。所以如果使用预剪枝的方式,生成的最终的决策树为:
后剪枝:
后剪枝的方法是首先生成一个完整的决策树,之后从最底部的中间结点开始,进行是否后剪枝的判断。
预剪枝和后剪枝对比:
(1)预剪枝在生成决策树的过程中,就进行了剪枝的判断,因此训练时间开销降低,测试时间也因为分支减少而降低;
后剪枝是首先生成一个完整的决策树,然后再进行剪枝,所以训练时间开销增加,测试时间因为分支减少而降低。
(2)预剪枝和后剪枝都可以减少过拟合的风险,但是因为预剪枝是基于“贪心”的,有可能虽然当前划分不能提升泛华性能,但是 基于该划分的后续划分却有可能导致性能提升,因此预剪枝决策树有可能带来欠拟合的风险。而后剪枝基本不会带来欠拟合的风险。
(3)泛化性能,后剪枝通常优于预剪枝。
缺失值的处理
这里简单介绍,如果训练集中的数据或者测试集中的数据,某些样本的特征出现缺失值,如何进行处理?
首先是训练集:
如果是训练集中少量样本出现特征缺失的情况,可以直接将这部分少量样本删除;如果特征缺失的样本数量很大,直接删除的方式会损失大量有用的信息,导致训练出来的模型性能下降。这里参考《西瓜书》和这篇博客,对决策树中属性值有缺失的样本的处理方式进行总结。主要涉及两点:
1、在属性值存在缺失的情况下,如何计算该属性的信息增益,即如何选择划分属性?
2、给定划分属性之后,如果某一样本在该属性上的值是缺失的,那么应该如何对这个样本进行划分?
1、在属性值存在缺失的情况下,如何计算该属性的信息增益,即如何选择划分属性?
在计算属性的信息增益的时候,如果训练集中某些样本的属性值缺失,我们的解决方案是根据该属性值上没有缺失的样本计算信息增益(或者信息增益率,基尼系数等指标)。不过在计算这些指标的过程中,我们需要额外计算一个权重,这个权重考虑到缺失样本的影响。这个权重就是:p(该属性值无缺失的样本数量/全部的样本数量)。
然后,我们计算这个属性的信息增益如下:,其中
表示该属性值无缺失的样本集合。
详细的计算过程参加https://blog.csdn.net/u012328159/article/details/79413610。
2、给定划分属性之后,如果某一样本在该属性上的值是缺失的,那么应该如何对这个样本进行划分?
如果样本在划分属性上的值是缺失的,解决方案就是,把该样本划分到每一个叶子结点,只不过需要调整该样本的权重。具体过程举例如下:
经过第一步的计算,在样本属性存在缺失值的训练集上面,计算得到“纹理”这一属性的信息增益最大,因此选择其作为根节点,对训练集中的样本进行划分,得到上图所示的情况。因为样本8和样本10在“纹理”这一属性上的值是缺失的,因此如上所述样本8和样本10会进入到每一分支,但是其权重会进行调整。
样本8和样本10在每一分支的权重,计算的时候是由:每个叶子结点该属性值未缺失的样本数量 / 该属性值未缺失的样本总数量 得到。
这样,我们为该属性值缺失的样本赋予了一个权重,在之后继续根据其他属性进行划分的时候,计算其他属性的信息增益时候,样本8和样本10按照其赋予的权重进行计算(属性值未缺失的样本,其权重为1)。
比如我们计算“纹理”为稍糊这一分支的其他属性的信息增益:
以“色泽”这一属性为例,计算过程如下:
详细的计算过程参加https://blog.csdn.net/u012328159/article/details/79413610。
测试集:
如果是测试集中的数据存在属性缺失,Quinlan在论文《unknown attribute values in introduction》中总结了一些解决方案如下:
其中,C4.5中采用的方法是:测试样本在该属性值上有缺失值,那么就同时探查(计算)所有分支,然后算每个类别的概率,取概率最大的类别赋值给该样本。下面结合具体例子对这一方法进行说明:
数据集如下:
构造出来的决策树如下:
参考资料
1、https://blog.csdn.net/u012328159/article/details/79285214
2、https://blog.csdn.net/u012328159/article/details/79413610