一、特征选择
二、决策树生成
三、决策树剪枝
决策树如果将全部特征都用上,可能会有过拟合的风险,因为如果没有任何限制,在生成的阶段,它将会穷尽所有的特征,直到停止条件。这时叶子节点的数目最多,而叶子节点越多则越容易发生过拟合缺少泛化能力。因此需要对决策树剪枝,剪枝策略主要有预剪枝(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为叶子节点时的损失函数:Cα(t)=C(t)+α⋅∣t∣=C(t)+α t 为 根 节 点 时 的 损 失 函 数 : C α ( T t ) = C ( T t ) + α ⋅ ∣ T t ∣ t为根节点时的损失函数:C_\alpha(T_t)=C(T_t)+\alpha \cdot |T_t| t为根节点时的损失函数:Cα(Tt)=C(Tt)+α⋅∣Tt∣ 当 C α ( T t ) ≥ C α ( t ) 时 , 即 α ≥ C ( t ) − C ( T t ) ∣ T t ∣ − 1 = g ( t ) 时 , 进 行 剪 枝 当C_\alpha(T_t)≥C_\alpha(t)时,即\alpha≥\frac{C(t)-C(T_t)}{|T_t|-1}=g(t)时,进行剪枝 当Cα(Tt)≥Cα(t)时,即α≥∣Tt∣−1C(t)−C(Tt)=g(t)时,进行剪枝所以,当 α \alpha α的值确定后,当前节点是否要进行剪枝就确定了。
- 一个决策树有n个节点,那么就会有相应的 n 个 g ( t ) n个g(t) n个g(t), α \alpha α的取值范围则是0到正无穷。我们对这 n 个 g ( t ) n个g(t) n个g(t)从小到大排序为 g ( t 1 ) 、 g ( t 2 ) ⋯ g ( t n ) g(t_1)、g(t_2) \cdots g(t_n) g(t1)、g(t2)⋯g(tn),那么当 α ∈ [ g ( t 1 ) , g ( t 2 ) ) \alpha∈\left[ g(t_1),g(t_2) \right) α∈[g(t1),g(t2))时会剪去一个节点(就是那个 g ( t ) g(t) g(t)值最小的节点),当 α ∈ [ g ( t 2 ) , g ( t 3 ) ) \alpha∈\left[ g(t_2),g(t_3) \right) α∈[g(t2),g(t3))时剪去的节点会是两个( g ( t ) g(t) g(t)值最小的两个节点),这说明 g ( t ) g(t) g(t)越小的节点越容易被剪枝。
- 于是我们将 g ( t 1 ) g(t_1) g(t1)值对应的那个节点剪去,得到一个剪枝树 T 1 T_1 T1,该树对应的 α = g ( t 1 ) \alpha=g(t_1) α=g(t1)。接下来,对于树 T 1 T_1 T1执行上述步骤,即求得所有 g ( t ) g(t) g(t)然后剪去最小的枝,得到剪枝树 T 2 T_2 T2以及 α = g ( t 2 ) \alpha=g(t_2) α=g(t2),以此类推最终得到一个剪枝树集合{ T 0 , T 1 ⋯ T n {T_0, T_1 \cdots T_n} T0,T1⋯Tn},到这里就完成了第一步
- 得到剪枝树序列以后,我们可以使用独立的验证数据集,测试各子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。并且,每颗子树都对应着一个 α \alpha α,所以最优子树确定了, α \alpha α也就确定了。
五、决策树的优缺点
- 决策树算法的优点
1)简单直观,生成的决策树很直观。
2)基本不需要预处理,不需要提前归一化,处理缺失值。
3)使用决策树预测的代价是O(log2m)O(log2m)。 m为样本数。
4)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
5)可以处理多维度输出的分类问题。
6)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
7)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
8) 对于异常点的容错能力好,健壮性高。 - 决策树算法的缺点
1)决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习之类的方法解决。
3)寻找最优的决策树是一个NP难的问题,我们一般是通过启发式方法,容易陷入局部最优。可以通过集成学习之类的方法来改善。
4)有些比较复杂的关系,决策树很难学习,比如异或。这个就没有办法了,一般这种关系可以换神经网络分类方法来解决。
5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征。这个可以通过调节样本权重来改善。
6)决策树在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的,这个可通过多变量决策树(multi-variate decision tree)进行改善。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策,算法的代表是OC1。
1732

被折叠的 条评论
为什么被折叠?



