四、决策树的剪枝
上一篇文章说了,由于决策树生成算法过多地考虑如何提高对训练数据的正确分类,从而构建过于复杂的决策树,这样产生的决策树往往对训练数据的分类很准确,却对未知的测试数据的分类没有那么准确,即出现过拟合现象。
我们需要对已生成的决策树进行简化,这个简化的过程我们称之为剪枝(pruning)。
具体就是剪掉一些不重要的子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
说白了,剪枝的目的就是得到最优的决策树模型。这个模型不仅对训练训练数据有很好的分类,对预测数据也能很好地预测。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss funtion)或代价函数(cost funtion)来实现。
下面我们来叙述一下一个常用的简单决策树学习的剪枝算法。
(先假设模型的相关变量)
设树
其中经验熵为
我们为了式子看起来简单好看,将损失函数的第一项记作:
这样,损失函数就可以表示为:
如果你看到了这里,说明你是不怕难的人,但是可能对上面的表达式还是一知半解,无法真正理解。没关系,我在这里将我整个理解过程分享出来,尽力帮助你的理解。
首先我们要知道那些假设变量的含义:
比如对于下面这棵树
叶结点个数:
叶结点:t (用变量t来代指叶结点,我们可知,
叶结点对应的采样点个数:
每个叶结点对应的子空间中,属于k类的样本点个数:
叶结点t的经验熵:
上述就是我自己的理解。
我们回到模型
剪枝,就是
与上一篇《决策树的生成》相比,决策树的生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型的复杂度。
决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
下面介绍剪枝算法:
输入:生成算法产生的整个树T,参数
输出:修剪后的子树
(1) 计算每个结点的经验熵。
(2) 递归地从树的叶结点向上回缩。
设一组叶结点回缩到其父结点之前与之后的整体树分别为
则进行剪枝,即将父结点变为新的叶结点。
(3) 返回(2) ,直至不能继续为止,得到损失函数最小的子树
注意:决策树的剪枝算法可以由一种动态规划的算法实现。(这方面内容。。。嗯。。先留着吧)。
小小心得:刚开始的时候脑袋是大的,看着十分头痛。多次想着要不明天再看吧,但是人要成长,总是需要去做困难的事才行。硬着头皮,一字一句,发现还是很容易理解的,都是纸老虎而已。