决策树面试知识点最全总结(三)

决策树面试知识点最全总结(三)决策树的剪枝

一 为什么需要减枝:
无论是在ID3还是C4.5决策树的生成算法中,都是递归的生成决策树,直到不能继续下去为止。这样产生的决策树存在一些问题:过拟合即对训练数据的分类很准确,对未知的测试数据的分类却没有那么准确。

过拟合的原因:在于学习时过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。

解决办法:考虑决策树的复杂度(复杂度如何表示|T| :叶子结点的个数),对已经生产的决策树进行简化(后剪枝)

二 决策树剪枝:

在决策树学习中将已生成的树进行简化的过程称为剪枝,具体的,剪枝从已生成的树上裁掉一些子树和叶节点,并将其根节点或父节点作为新的叶节点,从而简化模型。

三 决策树的剪枝如何实现:

决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。接下来重点介绍下决策树的损失函数。
假设决策树T的叶子结点个数为|T|,t是树T的叶子结点,该叶结点有 N t 个样本点,其中K类的样本点有 N t k 个,k=1,2…K, H t ( T ) 为叶子结点上的经验熵,α 大于等于0 为参数,则决策树的损失函数可以定义为: C α ( T ) = t = 1 | T | N t H t ( T ) + α | T | (式1)
其中经验熵 H t ( T ) = k N t k N t l o g N t k N t (式2)
李航的统计学习方法中如是说:式1 中的 t = 1 | T | N t H t ( T ) 表示模型对训练数据的预测误差,即模型与训练数据的拟合度,|T|表示模型复杂度,参数α控制两者之间的影响。
如何理解决策树的这个损失函数的定义?(参考陶大神和张大神https://www.zhihu.com/question/34075616
首先我们把决策树的这个损失函数与一般通用的损失函数对比一下看看:
这里写图片描述
右面的表达式是通用的损失函数的数学表述。先看这里写图片描述
这个表示的是真实的分类与学习算法估计的分类之间的均方差,用来刻画不考虑任何过拟合的情况下,只要求测试样本的契合程度达到最高,即使得测试样本尽量的跟学习算法得出的分类一致,优化的目标是该函数越小越好。

反过来看 H t ( T ) = k N t k N t l o g N t k N t t = 1 | T | N t H t ( T )
其中 H t ( T ) 是这个叶子结点的熵,熵是啥?熵代表的是随机变量的不确定性,说白了在决策树这块,这个叶子结点的熵代表的分类的不确定性。
大家可以思考一下,一颗决策树的性能好坏怎么区分呢?是不是应该针对每一个测试样本,分类的确定性越强,性能越好?
这个分类的确定性越强(说白了就是叶子结点的熵越小,这下明白了吧)

至于后面的α|T|主要是用来控制决策树的复杂度,减少过拟合(过拟合是不能消灭的,只能改善*)

至此决策树的损失函数理解到这块就差不多了,决策树的剪枝具体如下实现,下面介绍

四:决策树剪枝

决策树剪枝的基本策略有:预剪枝 和 后剪枝
预剪枝:是指在决策树的生成过程中,对每个结点在划分前后进行估计,若当前结点的划分不能带来决策树泛化性能的提升,则停止划分并将当前结点标记为叶结点。

后剪枝:先从训练集生成一颗完整的决策树,然后自底向上的对非叶子结点考察,若将该结点对应的子树替换成叶子结点能决策树泛化性能的提升,则将该子树替换成叶结点。

如何判断决策树泛化性能是否提升呢?这就要用到我们上述的决策树的损失函数了。
预剪枝要对划分前后的泛化性能进行比较来决定是不是继续划分,
从预剪枝的定义可以看出,预剪枝操作可以使决策树的很多分支都没有展开。

**优点:不仅降低了过拟合的风险,还显著的减少了决策树训练时间的开销和测试时间的开销

缺点: 有些分支的当前划分不会提升泛化性能、甚至可能导致返回性能的暂时降低,但在其基础上进行的后序划分却又可能导致性能的显著提高。**
产生这种问题的原因是,预剪枝基于“贪心”本质禁止这些分支展开给预剪枝决策树带来了欠拟合的风险。

后剪枝:是先从训练集生成一颗完整的决策树,然后从底而上进行修剪。
优点:
相对于预剪枝来说:后剪枝通常比预剪枝决策树保留了更多的分支。一般情况下后剪枝决策树的欠拟合风险较小,泛化性能往往优于预剪枝决策树。

缺点:
因为是在完全生成决策树的以后,再从低到上的对树中的所有非叶子结点进行逐一考察,因此其训练时间开销比未剪枝和预剪枝决策树大很多。

猜你喜欢

转载自blog.csdn.net/qq_16608563/article/details/82736865