一文读懂决策树剪枝

今天看到决策树剪枝的部分,书、博客都参考了一些,发现书上有些省去的地方,而大部分博客写的又晦涩难懂,因此决定写一篇容易理解的关于决策树剪枝的文章。
本文主要依据周志华的《机器学习》和李航的《统计学习方法》。

一、为什么要进行决策树剪枝

决策树生成算法递归地产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象,过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning).。具体地,剪枝从已生成的树上裁掉一 些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
一句话概括:决策树的剪枝是为了提高模型的泛化能力,防止过拟合。

二、《机器学习》中的决策树剪枝

1.预剪枝预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。
简单来讲,预剪枝是在构建决策树的过程中进行的,我们直接看西瓜书上的例子,对于下表所示的数据:
一文读懂决策树剪枝_第1张图片
我们采用信息增益准则来进行划分属性选择,则从表4.2 的训练集将会生成一棵如图4.5 所示的决策树。
一文读懂决策树剪枝_第2张图片
对于表4.2中的训练集D,它的经验熵为:H(D) = 1
各个特征对应的信息增益值为:
g(D, 色泽) = 0.276, g(D, 根蒂) = 0.115, g(D, 敲声) = 0.174,
g(D, 纹理) = 0.174, g(D, 脐部) = 0.276, g(D, 触感) = 0
很明显色泽脐部的信息增益值最大,这两个特征选择哪一个都可以,这里选择脐部来对训练集进行划分,从而产生三个分支,如下图:
一文读懂决策树剪枝_第3张图片
因为我们要预剪枝,所以要判断是否要保留脐部的这个划分,对划分前后的泛化性能进行估计。
在划分之前,所有样例都集中在根结点。若不进行划分,依据多数表决,该结点将被标记为叶结点,其类别标记为训练样例数最多的类别,而表4.2中类别为’好瓜’和’坏瓜’的样例数一样。这里,我们将根节点标记为好瓜(当样例最多的类别不唯一时,可任选其中一项)。
对于验证集的数据,只有{4,5,8}被正确分类,精度为43.9%. 而验证集在划分后的决策树上是:
一文读懂决策树剪枝_第4张图片
很明显,验证集上只有9和13被分类错误,其余五个样例都分类正确。此时精度是5/7 = 71.4% > 43.9%。所以,我们用脐部进行划分。

然后,决策树算法应该对结点②进行划分,基于信息增益准则将挑选出划分属性"色泽"。然而,在使用"色泽"划分后,编号为{5} 的验证集样本分类结果会由正确转为错误(见下图),使得验证集精度下降为57.1% < 71.4%。 于是,预剪枝策略将禁止结点②被划分。

一文读懂决策树剪枝_第5张图片
对结点③,最优划分属性为"根蒂",划分后验证集精度仍为71. 4%. 这个划分不能提升验证集精度,于是,预剪枝策略禁止结点③被划分.

对结点④,其所含训练样例己属于同一类,不再进行划分.

于是,基于预剪枝策略从表4.2 数据所生成的决策树如下图所示,其验证集精度为71. 4%. 这是一棵仅有一层划分的决策树,亦称"决策树桩".
一文读懂决策树剪枝_第6张图片
总结:预剪枝使得决策树的很多分支都没有"展开",这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。.但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于"贪心"本质禁止这些分支展开, 给预剪枝决策树带来了欠拟合的风险。

2.后剪枝:后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点.

我们还是根据例子来看,未剪枝的决策树:
一文读懂决策树剪枝_第7张图片
我们带入验证集的数据,易知该决策树的验证集精度为42.9%.
后剪枝首先考察图4.5 中的结点⑥.若将其领衔的分支剪除,则相当于
把⑤替换为叶结点.替换后的叶结点包含编号为{7, 15} 的训练样本,于是,该叶结点的类别标记为"好瓜",此时决策树的验证集精度提高至57.1%. 于是,后剪枝策略决定剪枝,如图4.7 所示.
一文读懂决策树剪枝_第8张图片
然后考察结点⑤,若将其领衔的子树替换为叶结点,则替换后的叶结点包含编号为{6, 7, 15} 的训练样例,叶结点类别标记为"好瓜". 此时决策树验证集精度仍为57.1%. 于是,可以不进行剪枝.
对结点②,若将其领衔的子树替换为叶结点,则替换后的叶结点包含编号为{1, 2, 3, 14} 的训练样例,叶结点标记为"好瓜"此时决策树的验证集精度提高至71. 4%. 于是,后剪枝策略决定剪枝.
对结点③和①,若将其领衔的子树替换为叶结点,则所得决策树的验证集精度分别为71. 4% 与42.9%, 均未得到提高.于是它们被保留.
最终,基于后剪枝策略从表4.2 数据所生成的决策树如图4.7 所示,其验证集精度为71. 4%.

总结:后剪枝决策树通常比预剪枝决策树保留了更多的分支. 一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树.但后剪枝过程是在生成完全决策树之后进行的,并且要白底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多.

三、《统计学习方法》中的决策树剪枝

统计学习方法中的决策树剪枝通过极小化决策树整体的损失函数来实现。
设树T的叶结点个数为|T|,t是树T的叶结点,该叶结点有Nt个样本点,其中k类的样本点有Ntk个,k = 1,2,…K,Ht(T)为叶结点t上的经验熵,α≥0为参数,则决策树学习的损失函数定义为:
一文读懂决策树剪枝_第9张图片
其中经验熵为:
一文读懂决策树剪枝_第10张图片
将损失函数右端第一项记作:
一文读懂决策树剪枝_第11张图片
这时有:
一文读懂决策树剪枝_第12张图片
C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型的复杂度,参数α≥0控制两者之间的影响。较大的α促使选择较简单的模型(树),较小的α促使选择较复杂的模型(树). α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度.

是不是看到这感觉公式太复杂看不懂?没关系,听我解释一下你应该会明白一些。我们都知道熵代表随机变量的不确定性,熵越大不确定性越大。而损失函数的第一项是所有叶结点的熵:
∑ t = 1 ∣ T ∣ N t H t ( T ) \sum_{t=1}^{|T|} N_tH_t(T) t=1TNtHt(T)
什么意思呢?从信息论的角度讲,这个式子其实就是所有叶结点的不确定性之和,这个和越小(也就是损失函数值越小),被分类到叶结点的样例不确定性越低,模型也就越好。而第二项 α ∣ T ∣ α|T| αT表示的是模型复杂度,因为决策树的叶结点个数是|T|,我们要综合考虑分类准确度和样本复杂度的影响。

具体的决策树剪枝算法如下:
输入:生成算法产生的整个树T,参数α;
输出:修剪后的子树Tα
(1)计算每个结点的经验熵.
(2)递归地从树的叶结点向上回溯,如果:
C α ( T 剪 枝 后 ) ≤ C α ( T 剪 枝 前 ) C_α(T_{剪枝后}) ≤ C_α(T_{剪枝前}) Cα(T)Cα(T)
则进行剪枝,即将父结点变为新的叶结点.
(3)返回(2),直到不能继续为止,得到损失函数最小的子树Tα.

总结:两本书从不同的角度给出了解释。但其实决策树剪枝的本质都是一样的,即提高泛化能力,防止过拟合,同时使生成的决策树模型变得简单。

参考文献
[1]: 周志华 《机器学习》
[2]: 李航 《统计学习方法》

你可能感兴趣的:(机器学习,机器学习)