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