CART 分类与回归树

CART定义

在上一篇决策树中,我们已经介绍了决策树的原理和ID3,C4.5算法。这一篇专门讲解CART算法。

CART即Classification and Regression Tree,分类与回归树。特点是:只有二叉树。

分类树

CART用作分类树的时候跟ID3,C4.5决策树算法类似,只是特征分裂的准则不一样: CART首先是二叉树,其次分裂评价标准是用基尼指数

基尼指数

基尼指数可以用来描述一个集合D的类别纯度,集合的样本们只属于一类,那该集合的基尼指数为0,集合的样本属于越多类,则基尼指数越大。基尼指数对集合的算法是:

该式子的解读:集合的样本属于K个类,现在随机抽取一个样本,它属于第k个类的概率为。设集合里一共有n个样本,第k个类的样本有m个,则

在特征A取值为a的条件下的集合D的基尼指数为:

上面式子中,为A取a时的样本集合,为其它样本的集合:

可以看到特征A取值之后,影响了集合的密度,形成了两部分的密度,所以需要加权。

分类树特征分裂

我们依然考虑此数据集:

表示年龄段,有工作与否,有自己房子,信贷情况4个特征。表示青年,中年,老年;表示有工作和没工作;表示有房子和没房子;表示信贷非常好,好,一般。

1)假设以“青年”与否为分裂点,即,求基尼指数。

2)假设以“中年”与否为分裂点,即,求基尼指数。

3)假设以“老年”与否为分裂点,即,求基尼指数。

4)假设以“有工作”与否为分裂点,即,求基尼指数(只有两种情况,基尼指数是相等的)。

5)假设以“有房子与否”与否为分裂点,即,求基尼指数。

6)假设以“信贷情况非常好”与否为分裂点,即,求基尼指数。

7)假设以“信贷情况好”与否为分裂点,即,求基尼指数。

8)假设以“信贷情况一般”与否为分裂点,即,求基尼指数。

9)比较以上所有的Gini指数,最小,所以“有房子”与否为最优分裂点

10) 分裂之后的决策图如下:

接下来我们继续寻找分裂点进行分裂

目前数据集合被缩小为:

11)以此时的集合为基础,循环到1)开始,计算除了“有房子”与否以外的特征作为分裂点的基尼指数。

中间计算过程省略,直接给出结果:时最小,所以“有工作”与否为最优分裂点。

继续绘制决策图:

决策完毕。

回归树

回归树结合了线性回归和决策树,本质上是决策树,实现的是分段回归。

对图示的数据点,线性回归为红色,回归树为绿色

下面开始讲解回归树原理

回归树算法原理

首先对于特征进行二叉特征分裂,先尝试所有分裂点,再通过最小损失函数决定哪个分裂点是最佳的,并进行实质分裂。分裂出来两条分支,每个分支为一个子数据集(这就是为什么上图x坐标是分段的),每个子数据集上的样本的结果都等于它们的平均值(这就是为什么上图y坐标每一段都是同一个值)。然后在每一个子数据集重复上面的的分裂,直到停止条件。 停止条件是人为决定的,比如决定只分裂到第3层。

回归树损失函数

其中的损失函数通过最小二乘法获得,即当同一个点分裂为两个子数据集后,每个子数据集的最小二乘误差最小化,也就是两个子数据集的最小二乘误差的和要最小化。数学表达如下:

上式中为两个子集中计算结果值(即平均值),为实际结果值

回归树实例分析

考虑以下数据集,x为特征变量,y为结果

绘图为:

1)只有一个特征变量x,故对它进行分裂。

考虑这9个分裂点 ,之所以不使用1,2,3这种实际特征取值为分裂点,是为了划分子集的清晰。

2) 假设分裂点为,获得两个子集:

计算子集的结果:

计算子集的结果:

计算结果绘制到坐标图中:

计算这次分裂的损失量:

3) 假设分裂点为,获得两个子集:

计算子集的结果:

计算子集的结果:

计算结果绘制到坐标图中:

计算这次分裂的损失量:

4)继续计算分裂点时候的结果,得到所有结果为下表:

比较所有损失,当s=5.5的时候分裂,损失最少,所以从s=5.5进行第一次分裂,分裂之后的坐标图为:

5)至此,数据被分裂为两个子集:

进行1)~4)的分裂过程,得到:

当s=3.5的时候分裂,损失最少,所以从s=3.5进行分裂

进行1)~4)的分裂过程,得到:

当s=7.5的时候分裂,损失最少,所以从s=7.5进行分裂

绘制坐标图

我们看一下此刻的树图:

如果觉得目前的回归精度满足要求(比如规定一个子集里面的样本数低于事先设定的阈值),可以就此时终止,则我们的回归树已经构建了3层了(称深度为3。
不过,为了精度再高一点,我们再构建一层。

6)第三层构建开始,目前4个子集为:

对4个子集分别进行1)~ 4)的循环。省略中间过程,直接给结果:

D11: 选择s=1.5分裂
D12: 选择s=4.5分裂
D21: 选择s=6.5分裂
D22: 选择s=8.5分裂

绘制坐标图:

树图:

构建完毕。

BTW,事实上D11和D21已经过拟合,因为它本身只有两个边界点,从结果上看loss也已经为0了

剪枝算法

预剪枝

在构建树的过程中依照指定的标准而停止构建某个分支,常用的方法有:

1)定义一个深度,当树到达该深度就停止,如上面用到的
2)定义一个阈值,当某个节点子集的样本数小于该阈值,就停止
3)定义一个阈值,计算每次扩张对系统性能的增益,当增益值小于该阈值,就停止

后剪枝

先构建完整的树(允许过拟合),然后剪掉置信度不够的子树,并用子树种最频繁的类别或值代替

剪枝的方法有:

Reduced-Error Pruning(REP,错误率降低剪枝)

Pesimistic-Error Pruning(PEP,悲观错误剪枝)

Cost-Complexity Pruning(CCP,代价复杂度剪枝)

EBP(Error-Based Pruning)(基于错误的剪枝)

参考

https://www.cnblogs.com/starfire86/p/5749334.html