Classification And Regression Tree,CART,分类与回归树,一种二叉决策树。作为一种决策树算法,CART与其他决策树一样,由特征选择、树的生成和剪枝组成。本文介绍CART算法生成决策树
T
0
T_0
T0 后如何对其进行剪枝(将子树变成叶子节点)。
剪枝过程分为两步:
- 从 T 0 T_0 T0的底端开始不断剪枝,直到 T 0 T_0 T0的根节点,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{ T_0, T_1, ..., T_n \} {T0,T1,...,Tn}
- 通过交叉验证选择最优的子树作为剪枝后的CART
1. 剪枝,形成子树序列
在剪枝过程中,使用以下损失函数作为是否剪枝的依据:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T) = C(T) + \alpha |T|
Cα(T)=C(T)+α∣T∣
其中
T
T
T可以是任意子树,
C
(
T
)
C(T)
C(T)是
T
T
T在训练数据上的误差(根据回归或者分类,可以是均方误差或者基尼指数),
∣
T
∣
|T|
∣T∣是
T
T
T的叶子节点数,
α
\alpha
α是参数,
C
a
(
T
)
C_a(T)
Ca(T)是参数是
α
\alpha
α时
T
T
T的整体损失。
α
\alpha
α可以权衡训练数据的拟合程度与模型复杂度(
∣
T
∣
|T|
∣T∣)。因此,
α
\alpha
α越大,则更倾向于选择更小的树,随着
α
\alpha
α的增大,使
C
α
(
T
)
C_{\alpha}(T)
Cα(T)最小的树逐渐从
T
0
T_0
T0变成最后的单节点的树。
对于固定的 α \alpha α,可以验证存在唯一的子树使 C α ( T ) C_\alpha(T) Cα(T)最小。
具体过程如下:
从
T
0
T_0
T0开始,自下而上地考虑每个内部节点
t
t
t,考虑两种情况:
- 1)以 t t t为根节点的子树 T t T_t Tt,其损失为: C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_\alpha(T_t) = C(T_t) + \alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣;
- 2)对 t t t进行剪枝,即将 T t T_t Tt作为叶子节点,其损失为: C α ( t ) = C ( t ) + α C_\alpha(t) = C(t) + \alpha Cα(t)=C(t)+α;
我们来比较 C α ( T t ) , C α ( t ) C_\alpha(T_t),C_\alpha(t) Cα(Tt),Cα(t),看看要不要对 t t t进行剪枝:
- 当 α \alpha α较小时,可以容忍模型有较高的复杂度,这个时候主要保证在训练数据上误差很小即可,所以 C α ( T t ) < C α ( t ) C_\alpha(T_t) < C_\alpha(t) Cα(Tt)<Cα(t),即这个时候不需要剪枝;
- 当 α \alpha α逐渐增大到某一值时,这个时候需要考虑在训练数据上误差很小且模型有较低的复杂度,所以 C α ( T t ) = C α ( t ) C_\alpha(T_t) = C_\alpha(t) Cα(Tt)=Cα(t),即这个时候剪不剪枝都可以;
- 当 α \alpha α继续增大, C α ( T t ) > C α ( t ) C_\alpha(T_t) > C_\alpha(t) Cα(Tt)>Cα(t),这个时候剪枝带来的收益大于作为一棵子树 T t T_t Tt所带来的收益,所以要剪枝;
从以上过程我们可以看出,对于树中的每个内部节点 t t t,都有一个特定的 α \alpha α阈值 g ( t ) g(t) g(t),来决定是否需要对其进行剪枝,且该阈值等于 g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t) = \frac{C(t) - C(T_t)}{|T_t| - 1} g(t)=∣Tt∣−1C(t)−C(Tt)(由上述关于 C α ( T t ) , C α ( t ) C_\alpha(T_t),C_\alpha(t) Cα(Tt),Cα(t)大小的比较可以得出)。
因此,在生成 T 1 T_1 T1时,我们可以计算 T 0 T_0 T0的每个内部节点的 g ( t ) g(t) g(t),选择其中最小的 g ( t ) g(t) g(t)最为 α 1 \alpha_1 α1,对该结点进行剪枝后就可以子树序列中的 T 1 T_1 T1了。接着在 T 1 T_1 T1的基础上持续剪枝,就可以得到最终的子树序列。
在生成子树序列的过程中,我们也可以得到一个 α \alpha α序列 0 = α < α 1 < α 2 < . . . < α n < + ∞ 0=\alpha < \alpha_1 < \alpha_2 < ... < \alpha_n < +\infty 0=α<α1<α2<...<αn<+∞,这个序列对应着一个区间 [ α i , α i + 1 ) , i = 0 , 1 , . . . , n [\alpha_i, \alpha_{i+1}),\quad i=0, 1, ..., n [αi,αi+1),i=0,1,...,n,这与我们得到的子树序列是相对应的, T i T_i Ti对应着 [ α i , α i + 1 ) [\alpha_i, \alpha_{i+1}) [αi,αi+1)。
其实,在生成子树序列的过程中,我们计算 C α ( T t ) , C α ( t ) C_\alpha(T_t),C_\alpha(t) Cα(Tt),Cα(t)是为了判断:当模型复杂度有多重要时我们需要对 t t t进行剪枝,也就是剪枝后带来的收益大于作为子树带来的模型效果收益。
2. 交叉验证
使用验证数据集,测试子树序列中每棵子树的损失,选择最小的作为剪枝后的决策树,这个时候也对应了一个 α k \alpha_k αk。
Reference
- 统计学习方法,李航,第二版