cart算法_机器学习笔记——分类回归树CART与剪枝

cart算法_机器学习笔记——分类回归树CART与剪枝_第1张图片

ID3与C4.5两种决策树都是用于解决分类问题的,而CART算法则不止能分类,还能将决策树用于解决回归问题。即输出值可以为连续变量。CART算法本质上输出的是给定输入集合

的条件下,输出随机变量
的条件概率分布。在CART中,每个结点都只有两个子结点,其对于特征的判断是基于
,而非该特征到底有多少个取值。举例而言,如果一个大学生资料数据作为输入,其中有“年龄”这一特征,ID3/C4.5决策树可能会在这里产生年龄等于{18,19,20,21,22}等多个不同分支;而CART的逻辑则可能以“是否大于20岁?”作为分类依据。由此一来,递归地对所有特征进行二分,最终将整个输入空间划分为多个子空间,并求取每个子空间输出值的概率分布。

1. CART回归树的生成

显然,不论是用于回归还是分类,在CART算法中最重要的是如何选择二分特征值的点。首先来看回归树的情况。前文中已经说过,最终生成的回归树的每一条“枝干”或者路径都代表了对输入空间的一种划分。假定最终共将整个输入空间划分成了

个单元
,并且在其中的每个单元上都有一个固定的输出值
。举例来说,假设一个预测一个人每周锻练几次的回归树,其中的一个划分为“性别男-年龄小于20-是学生-BMI值小于20”,这个划分可能就对应了输出值“6”。因此,回归树的假设函数可以表示为:

这里的

称为指示函数,意思是如果自变量值为真,则输出值1;反之输出0。求和+指示函数可以理解为具有从多个类别中“选择”一个的作用。

为了优化决策树的性能,在每一个划分空间中都可以用最小平方误差

的方法求取对于该空间上实际输出值
误差最小的最优输出值。不难看出,最优预测值就是该空间上所有输入实例的条件下对应输出值的期望:

既然已经有了求取最优输出值的方法,接下来就要考虑最重要的问题:如何划分特征了。我们的目的是从属性集中的所有属性中选取一个最优属性以及其切分点,那就可以遍历所有的属性,假设某一属性

,在它的所有取值中选取了一个切分点s。此时输入数据被划分为两个空间:

此时,对这两个空间分别求空间中输出值的均值

使得空间中所有样本的输出值
的平方误差最小。而令两个子空间上平方误差之和的值最小的
就是最优的属性以及最优划分点。不断递归调用这一算法,就可以生成CART回归树了。算法简述如下:
  1. 对于输入空间
    ,遍历属性集中的每个特征,并在特征上扫描切分点
    。通过求解
    确定使该式达到最小值的一对
  2. 用这一对
    划分输入空间,并将相应的输出值设为输出均值
  3. 继续对两个子空间递归调用上述算法,直至满足停止条件。

生成CART回归树的停止条件有多种选择方式,可以是结点中样本数少于某阈值,或者是结点上的最小平方误差小于某阈值,或者是没有特征可以再分。

2. CART分类树的生成

CART分类树既然和回归树同属一个算法,其思路自然相差不多。事实上,回归树采用最小二乘法进行最优属性选择,而分类树则使用基尼指数。除此之外二者的生成方式并无太大区别。

首先给出基尼系数的定义如下:

假设在分类问题中输出空间共有

个类别,样本点属于其中第
类的概率为
,则概率分布的基尼系数定义为:

对于二分类问题,不难计算如果取正类概率为

,则概率分布的基尼系数为:

对于给定的样本集合,一般用

,即所有样本中属于第
类样本所占比例代替

基尼系数值所表示的其实也是样本空间的不确定性。如果一个样本空间的基尼系数很大,说明空间中样本可以取的类别非常多,即空间中样本分布杂乱。而如果空间中所有样本都属于同一类,则不难计算基尼系数可以取到最小值0。

如果样本空间

根据其中的某个属性
是否可以取可能值
进行分类,即会分出两个子空间。此时根据定义,
的基尼系数即为两个子空间基尼系数的加权求和。该基尼系数越小,就说明特征
分割成了纯度越高的两个子空间,即分类能力更优。

概括CART分类树的生成算法如下:

  1. 对于输入空间
    ,遍历属性集中的每一个特征
    ,对其可能取的所有值测试样本点是否取该值,从而将
    分为两个子空间。计算
    的基尼系数。
  2. 选取使基尼系数最小的特征
    和切分用值
    作为最优特征和最优切分点。并依据此生成两个子空间。
  3. 对每个子空间递归调用上述算法直至满足停止条件。

3. CART剪枝算法

CART的剪枝比较类似于之前讲到过的后剪枝。首先在生成完整的决策树之后,获取该决策树的所有子树序列。对于任意的一个子树都可以用如下方式计算其代价函数:

式中的

就是目标子树,
是对训练数据的预测误差(平方误差或者基尼系数),
为子树的叶结点个数,
则是正则项系数,与之前所讲其他决策树代价函数计算中的意义相同,其目的都是为了控制模型的复杂程度。利用代价函数进行剪枝的具体过程如下:

首先对完整的生成树

进行剪枝,对其中任意一个内部结点
都有:

为根节点的子树(不剪枝)的代价函数为

为单节点的树(剪枝后)的代价函数为

较小时,代价函数比较看重结点上对训练数据的预测误差,由于如果以
作为单节点,则其中样本肯定较为驳杂,预测误差一定偏大,故有

随着

不断增大,在某一点一定有

将上面两数直接带入就可以解出此时

的值为
。因为两种情况代价函数值相等,而
结点要少,复杂度更低,泛化能力就一定更优秀。此时对
进行剪枝。

由上,我们可以对完全生成树

的每一个中间结点都计算出这个
值,选取该值最小的结点进行剪枝,得到一个子树
,并将该
值设为
。对该子树递归的使用上述步骤,直至剪枝至只剩根结点。此时,就有了子树序列
以及参数序列

此时,利用独立的一个验证用数据集,对序列中的所有子树进行测试,计算其平方误差或者基尼系数。取误差最小的子树为最优决策树,对应的参数值也就是最优参数值。至此CART的剪枝完成。

你可能感兴趣的:(cart算法,二分类最优阈值确定,最小生成树算法matlab)