先说好前面部分我引用自以下这篇文章的,我不想写了
https://blog.csdn.net/wjc1182511338/article/details/76793164?locationNum=6&fps=1
CART之剪枝详解
我们这里用的是代价复杂度剪枝算法。
首先我们将一颗充分生长的树称为T0 ,我们希望减少树的大小来防止过拟化,但又担心去掉一些节点后预测的误差会增大,那么如何达到这两个变量之间的平衡则是问题的关键,因此我们用一个变量α来平衡,因此损失函数定义为如下:
T为任意子树,C(T)为预测误差,可以是平方误差也可以是基尼指数,|T|为子树T的叶子节点个数,注意是叶子节点,α 是参数,C(T)衡量训练数据的拟合程度,|T|衡量树的复杂度(即大小),α 权衡拟合程度与树的复杂度。
那么我们如何找到这个合适的α来使拟合程度与复杂度之间达到最好的平衡呢,最好的办法就是,我们将α从0取到正无穷,对于每一个固定的α,我们都可以找到使得Cα(T)最小的最优子树T(α) 。当α 很小的时候,T0是这样的最优子树,当α很大的时候,单独一个根节点是这样的最优的子树。
尽管α 取值无限多,但是T0 的子树是有限个,因此我们可以生成这样一个子树序列
Tn是最后剩下的那个根节点。(这里的子树生成是根据前一个子树Ti,剪掉某一个内部节点,生成Ti+1)然后对这样的子树序列分别用测试集进行交叉验证,找到最优的那个子树作为我们的决策树。
这也是代价复杂度剪枝的核心思想。
基于上面的论述,剪枝可分为两部分,第一部分生成子树序列,第二部分交叉验证。
1. 生成子树序列
我们每次剪枝剪的都是某个内部节点的子节点,也就是将某个内部节点的所有子节点回退到这个内部节点里,并将这个内部节点作为叶子节点。因此在计算整体的损失函数时,这个内部节点以外的值都没变,只有这个内部节点的局部损失函数改变了,因此我们本需要计算全局的损失函数,但现在只需要计算内部节点剪枝前和剪枝后的损失函数。
对任意内部节点t,
剪枝前的状态:有|Tt| 个叶子节点,预测误差是C(Tt)
剪枝后的状态:只有本身一个叶子节点,预测误差是C(t)
以下是我自己的理解部分
第一:这里的剪枝和前面讲的决策树剪枝不同的地方就是,之前就在一个固定的超参数alpha上剪枝,这里不是 ,他不但剪枝,还挑选最优的超参数。
第二:虽然alpha 是无限多的 ,但是树的可能性是固定的,因此更具上面breiman的证明我门知道,在一个固定的区间【a,b】内,无论alpha取什么,最优的树都是那一棵,所以他就从下到上依次计算剪掉每个点之后对应的alpha(为什么从下到上,,,当然是因为动态规划啦)。
第三:为什么从最小的alpha开始,因为我门知道alpha越大,树就越简单,意味着剪掉的越多,而alpha越小,树越复杂剪掉的越少,所以从小的alpha开始意味着是一种从下到上的剪枝啦,这样又可以动态规划啦。
所以最后把所有可能剪掉 的枝的树都集合起来,然后用验证集交叉验证选出最优的就OK了