一、特征选择
二、决策树生成
三、决策树剪枝
决策树如果将全部特征都用上,可能会有过拟合的风险,因为如果没有任何限制,在生成的阶段,它将会穷尽所有的特征,直到停止条件。这时叶子节点的数目最多,而叶子节点越多则越容易发生过拟合缺少泛化能力。因此需要对决策树剪枝,剪枝策略主要有预剪枝(pre-pruning)和后剪枝(post-pruning)。
预剪枝
- 预剪枝就是指:在决策树的生长过程中限制其规模,使其较早的停止生长。停止的方法分通用的停止和更严格的停止。
- 通用的停止其实就是迭代过程中的两种return方式
(1)如果所有样本均属同一类,终止递归。
(2)如果样本的所有的特征值都相同,终止递归。 - 更严格的停止主要有:
(1)如果树的高度超过一定的限制(数太高了)
(2)如果分支节点包含的样本数量小于指定的阈值(节点样本数太少了)
(3)如果样本的类分布是独立于可用特征的(使用卡方检验)(emm。。。啥啊?)
(4)如果扩展当前节点没有改善信息增益,即信息增益小于指定的阈值(信息增益太小了) - 周志华老师的"机器学习"一书中采用对每个节点划分前用验证集进行估计,通过比较划分前后的验证集精度来判断是否剪枝。若当前节点的划分不能带来决策树泛化能力的提升,则停止划分并标记当前节点为叶子也点。下图是"周志华机器学习"中的西瓜示例,描述了该方法预剪枝过程
下图则是未剪枝的决策树
- 优缺点:预剪枝使得决策树的很多分支没有“展开”,降低了过拟合的风险,还能够减少决策树的训练时间以及预测事件开销。但是,有些分支可能当前划分不能提升模型的泛化性能甚至导致泛化性能暂时下降,但在其基础上的后续划分可能显著提高模型的性能。预剪枝的这种禁止分支展开,同样也给决策树带来了欠拟合的风险。
后剪枝
- 与预剪枝不同,后剪枝首先通过完全展开以构造完整的决策树,允许过拟合,然后采取一定的策略来进行剪枝,可以理解为“先斩后奏”
《机器学习》:后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来泛化性能提升,则将该子树替换为叶结点。
- 常用后剪枝策略主要有
(1)降低错误剪枝 REP、(2)悲观错误剪枝 PEP、(3)基于错误剪枝 EBP、(4)代价-复杂度剪枝 CCP、(5)最小错误剪枝 MEP。他们的对比如下图所示
- 李航老师的《统计学习方法》中,介绍的后剪枝方法属于CCP,也就是代价-复杂度剪枝方法。就像其他的模型最小化风险结构函数一样,在原有的经验损失函数(经验熵)基础上加入了正则项,正则参数是树的叶子节点个数,新的损失函数定义为: C α ( T ) = C ( T ) + α ⋅ ∣ T ∣ C_\alpha(T)=C(T)+\alpha \cdot |T| Cα(T)=C(T)+α⋅∣T∣ C ( T ) \bm{C(T)} C(T)表示模型对训练数据的预测误差(即模型对训练数据的拟合程度)=(每个叶子节点中样本个数*信息增益或者gini系数)再累加。 ∣ T ∣ \bm{|T|} ∣T∣表示模型复杂度,是叶子节点的个数(将当前计算的节点视为根节点,如果本身就是叶子节点则Tleaf=1,若这个节点下面还有三个叶子节点则Tleaf=3)。 α ≥ 0 \bm{\alpha≥0} α≥0控制两者之间的影响,是自己设定的一个系数,因为我们希望整个式子的结果(损失值)比较小,所以如果α设置的比较大则意味着我们希望叶子节点个数会比较少,促使选择较简单的模型树,但是对训练集的拟合程度就更低,所以说损失函数表示了“决策树复杂度”与“对训练集的拟合度”之间的平衡。我们的目标是,当 α \alpha α确定时,选择使得损失函数最小的子树。
剪枝过程:对于决策树中的非叶子节点,分别考察他作为叶子结点时的损失值、作为根节点时的损失值,如果进行了分裂损失值反而更大,则进行剪枝。(通过一个衡量标准来判定,每一个节点分裂后的效果好不好,如果不好就不分裂了) - 周志华老师的《机器学习》中的剪枝方法属于REP,也就是降低错误剪枝。它是最简单粗暴的一种后剪枝方法,其目的减少误差样本的数量。下图是书中西瓜示例的后剪枝过程,通过对比验证集前后的误差精度来判断是否剪枝
预剪枝与后剪枝对比
- 预剪枝:预剪枝提前使很多分支都没有展开,降低了过拟合的风险,但是这个分支下的后续划分可能是非常有用的。从这点考虑,预剪枝是基于”贪心“的本质来禁止分支以及后续的展开,在降低过拟合的同时也有欠拟合的风险。
- 后剪枝:相比预剪枝,后剪枝的优点是:1)后剪枝决策树通常比预剪枝决策树保留了更多的分支;2)后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。后剪枝的缺点是:1)决策树训练时间开销比未剪枝决策树和预剪枝决策树都要大的多。
四、CART的后剪枝
- 分类与回归树(classification and regression tree,CART)模型由Breiman等人于1984年提出,即可用于分类也可用于回归。CART假设决策树是二叉树,内部节点的特征取值分“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。
- 决策树的生成就是递归构建二叉树的过程,对回归树用平方误差最小化准则,对分类树用Gini系数最小化准则,进行特征选择。CART剪枝算法由两步组成:1)从原始决策树生成一系列可能得到的剪枝树(因为不同的 α \alpha α会剪去不同的枝)。2)在独立的验证集上检验剪枝后的预测能力,选择泛化预测能力最好的树作为最终的CART树。更加详细的生成与剪枝参考《统计学习方法》
- 其他内容都好理解,这里主要介绍一下CART的后剪枝思想。
- 假设我选定了决策树的任意一个节点t,并将节点t作为根节点。那么这个时候我想知道节点t下的分支是否需要剪枝,怎么办呢?很容易想到,我们可以对比一下剪枝以后的损失函数和剪枝以前的损失函数的大小,如果剪枝后的损失函数更小,那么我们就执行剪枝。用公式来抽象描述一下: t 为 叶 子 节 点 时 的 损 失 函 数 : C α ( t ) = C ( t ) + α ⋅ ∣ t ∣ = C ( t ) + α t为叶子节点时的损失函数:C_\alpha(t)=C(t)+\alpha \cdot |t|=C(t)+\alpha t为