CART剪枝过程

Classification And Regression Tree,CART,分类与回归树,一种二叉决策树。作为一种决策树算法,CART与其他决策树一样,由特征选择、树的生成和剪枝组成。本文介绍CART算法生成决策树 T0 后如何对其进行剪枝(将子树变成叶子节点)。
在这里插入图片描述

剪枝过程分为两步:

  1. T0的底端开始不断剪枝,直到T0的根节点,形成一个子树序列{T0,T1,...,Tn}
  2. 通过交叉验证选择最优的子树作为剪枝后的CART

1. 剪枝,形成子树序列

在剪枝过程中,使用以下损失函数作为是否剪枝的依据:

Cα(T)=C(T)+α|T|

其中T可以是任意子树,C(T)T在训练数据上的误差(根据回归或者分类,可以是均方误差或者基尼指数),|T|T的叶子节点数,α是参数,Ca(T)是参数是αT的整体损失。α可以权衡训练数据的拟合程度与模型复杂度(|T|)。因此,α越大,则更倾向于选择更小的树,随着α的增大,使Cα(T)最小的树逐渐从T0变成最后的单节点的树

对于固定的α,可以验证存在唯一的子树使Cα(T)最小。

具体过程如下:
T0开始,自下而上地考虑每个内部节点t,考虑两种情况:

  • 1)以t为根节点的子树Tt,其损失为:Cα(Tt)=C(Tt)+α|Tt|
  • 2)对t进行剪枝,即将Tt作为叶子节点,其损失为:Cα(t)=C(t)+α;

我们来比较Cα(Tt)Cα(t),看看要不要对t进行剪枝:

  • α较小时,可以容忍模型有较高的复杂度,这个时候主要保证在训练数据上误差很小即可,所以Cα(Tt)<Cα(t),即这个时候不需要剪枝
  • α逐渐增大到某一值时,这个时候需要考虑在训练数据上误差很小且模型有较低的复杂度,所以Cα(Tt)=Cα(t),即这个时候剪不剪枝都可以
  • α继续增大,Cα(Tt)>Cα(t),这个时候剪枝带来的收益大于作为一棵子树Tt所带来的收益,所以要剪枝

从以上过程我们可以看出,对于树中的每个内部节点t,都有一个特定的α阈值g(t),来决定是否需要对其进行剪枝,且该阈值等于g(t)=C(t)C(Tt)|Tt|1(由上述关于Cα(Tt)Cα(t)大小的比较可以得出)。其实 α 可以看作是模型性能和复杂度之间的一个权衡,g(t) 的分子是剪枝后误差的增大量(相当于精度的下降量),分母是剪掉的叶子结点数,相当于在模型复杂度方面的收益,g(t) 是二者的一个比值,即愿意精度降低和复杂度降低之间的一个权衡

因此,在生成T1时,我们可以计算T0的每个内部节点的g(t),选择其中最小的g(t)最为α1 (为啥要选择最小的呢?这个还不是很清楚),对该结点进行剪枝后就可以子树序列中的T1了。接着在T1的基础上持续剪枝,就可以得到最终的子树序列。

在生成子树序列的过程中,我们也可以得到一个α序列0=α<α1<α2<...<αn<+,这个序列对应着一个区间[αi,αi+1),i=0,1,...,n,这与我们得到的子树序列是相对应的,Ti对应着[αi,αi+1)

其实,在生成子树序列的过程中,我们计算Cα(Tt)Cα(t)是为了判断:当模型复杂度有多重要时我们需要对t进行剪枝,也就是剪枝后带来的收益大于作为子树带来的模型效果收益。

2. 交叉验证

使用验证数据集,测试子树序列中每棵子树的损失,选择最小的作为剪枝后的决策树,这个时候也对应了一个αk

Reference

  1. 统计学习方法,李航,第二版
posted @   Milkha  阅读(425)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示