CART算法基本原理
分类与回归树(classification and regression tree, CART)模型由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。
以下将用于分类与回归的树统称为决策树。CART是在给定输入随机变量条件下输出随机变量
的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
- 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
- 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
CART生成
决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
分类树
分类树用基尼不纯度和基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼不纯度
分类问题中,假设有个类,样本点属于第
类的概率为
,则概率分布的
基尼不纯度(Gini impurity)定义为
对于二类分类问题,若样本点属于第1个类的概率是,则概率分布的基尼不纯度为
对于给定的样本集合,其基尼不纯度为
这里,是
中属于第
类的样本子集,
是类的个数。基尼不纯度
表示集合
的不确定性。
基尼增益
如果样本集合根据特征
是否取某一可能值
被分割成
和
两部分,即
基尼不纯度和
分别根据子集合
和
里的样本情况进行计算。集合
中的样本数量分别用
表示,则根据属性
的值
进行划分时,所获得的
基尼增益(Gini gain)的计算公式如下:
基尼指数
在针对节点进行属性和分割点的选择时,面对的是同一个数据集合,这个集合可能是最初的完整数据集合,也可能是经过分割后形成的子集合。但无论哪种情况,
都是相同的,因此可以对基尼增益的计算公式进行变换,得到
基尼指数(Gini index),它的计算公式如下:
基尼指数表示经
分割后集合
的不确定性,反映了从数据集
中随机抽取两个样本,其类别标记不一致的概率。基尼指数值越小,样本集合的不确定性也就越小,做出的分割就越好,这一点与熵相似。
下图显示二类分类问题中基尼指数、熵(单位比特)之半
和分类误差率的关系。横坐标表示概率
,纵坐标表示损失。可以看出基尼指数和熵之半的曲线很接近,都可以近似地代表分类误差率。
CART分类树生成算法
输入:训练数据集,停止计算的条件。
输出:CART分类树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉分类树:
- 设结点的训练数据集为
,计算现有特征对该数据集的基尼指数。此时,对每一个特征
,对其可能取的每个值
,根据样本点对
的测试为“是”或“否”将
分割成
和
两部分,利用式(6)计算
时的基尼指数。
- 在所有可能的特征
以及它们所有可能的切分点
中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
- 对两个子结点递归地调用步骤1和2,直至满足停止条件。
- 生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
回归树
假设与
分别为输入和输出变量,并且
是连续变量,给定训练数据集
考虑如何生成回归树。
一棵回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为个单元
,并且在每个单元
上有一个固定的输出值
,于是回归树模型可表示为
当输入空间的划分确定时,可以用平方误差
来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。
问题是怎样对输入空间进行划分。这里采用启发式的方法,选择第个变量
和它取的值
,作为
切分变量(splitting variable)和切分点(splitting point),并定义两个区域:
然后寻找最优切分变量和最优切分点
。具体地,求解
对固定输入变量可以找到最优切分点
。
易知,单元上的
的最优值
是
上的所有输入实例
对应的输出
的均值,即
遍历所有输入变量,找到最优的切分变量,构成一个对
。依此将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止。这样就生成一棵回归树。这样的回归树通常称为
最小二乘回归树(least squares regression tree),现将算法叙述如下。
最小二乘回归树生成算法
输入:训练数据集;
输出:回归树。
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
- 选择最优切分变量
与切分点
,求解式(8)。遍历变量
,对固定的切分变量
扫描切分点
,选择使式(8)达到最小值的对
。
- 用选定的对
划分区域并决定式(7)和式(9)中的
。
- 继续对两个子区域调用步骤(1)和(2),直至满足停止条件。
- 将输入空间划分为
个区域
,生成决策树,即式(6)。
CART剪枝
CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先从生成算法产生的决策树底端开始不断剪枝,直到
的根结点,形成一个子树序列
;然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
在剪枝过程中,计算子树的损失函数:
其中,为任意子树,
为对训练数据的预测误差(如基尼指数),
为子树的叶结点个数,
为参数,
为参数是
时的子树T的整体损失。参数
权衡训练数据的拟合程度与模型的复杂度。
对固定的,一定存在使损失函数
最小的子树,将其表示为
。
在损失函数
最小的意义下是最优的。容易验证这样的最优子树是唯一的。当
大的时候,最优子树
偏小;当
小的时候,最优子树
偏大。极端情况,当\alpha=0时,整体树是最优的。当
时,根结点组成的单结点树是最优的。
Breiman等人证明:可以用递归的方法对树进行剪枝。将从小增大,
,产生一系列的区间
;剪枝得到的子树序列对应着区间
的最优子树序列
,序列中的子树是嵌套的。
具体地,从整体树开始剪枝。对
的任意内部结点
,以
为单叶子结点树的损失函数是
以为根结点的子树
的损失函数是
当及
充分小时,有不等式
当增大时,在某一
有
当再增大时,不等式(14)反向。只要
与
有相同的损失函数值,而
的结点少,因此
比
更可取,对
进行剪枝。
为此,对中每一内部结点
,计算
它表示剪枝后整体损失函数减少的程度。在中剪去
最小的
,将得到的子树作为
,同时将最小的
设为
。
为区间
的最优子树。
如此剪枝下去,直至得到根结点。在这一过程中,不断地增加的值,产生新的区间。
CART剪枝算法
输入:CART算法生成的决策树;
输出:最优决策树。
- 设
。
- 设
。
- 自上而下地对各内部结点
计算
以及
这里,表示以
为根结点的子树,
是对训练数据的预测误差,
是
的叶结点个数。
4. 对
的内部结点
进行剪枝,并对叶结点
以多数表决法决定其类,得到树
。
5. 设
。
6. 如果
不是由根结点及两个叶结点构成的树,则回到步骤(2);否则令
。
交叉验证法
有些文献将交叉验证法写进CCP算法中,成为CCP算法的一部分,这样是说不通的。交叉验证法的原理是将原始训练集拆分为训练集和验证集(注意不是测试集),使用训练集进行训练,验证集进行测试,以防止过拟合。
表现在CCP算法中,应为将原始训练集拆分为训练集和验证集,使用训练集生成决策树并剪枝,再使用验证集根据总误差最小的原则选择最优的决策树。
