CART决策树基本原理

0 阅读2分钟

分类与回归树(classification and regression tree, CART)模型由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。

以下将用于分类与回归的树统称为决策树。CART是在给定输入随机变量XX条件下输出随机变量YY的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”​,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。

CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
  2. 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

CART生成

决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。

分类树

分类树用基尼不纯度和基尼指数选择最优特征,同时决定该特征的最优二值切分点。

基尼不纯度

分类问题中,假设有KK个类,样本点属于第kk类的概率为pkp_k,则概率分布的基尼不纯度(Gini impurity)定义为

G(p)=k=1Kpk(1pk)=1k=1Kpk2\begin{equation} G(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2 \end{equation}

对于二类分类问题,若样本点属于第1个类的概率是pp,则概率分布的基尼不纯度为

G(p)=2p(1p)\begin{equation} G(p)=2p(1-p) \end{equation}

对于给定的样本集合DD,其基尼不纯度为

G(D)=1k=1K(CkD)2\begin{equation} G(D)=1-\sum_{k=1}^K\left(\frac{|C_k|}{|D|}\right)^2 \end{equation}

这里,CkC_kDD中属于第kk类的样本子集,KK是类的个数。基尼不纯度G(D)G(D)表示集合DD的不确定性。

基尼增益

如果样本集合DD根据特征AA是否取某一可能值aa被分割成D1D_1D2D_2两部分,即

D1={(x,y)DA(x)=a}D2={(x,y)DA(x)a}\begin{equation} \begin{aligned} D_1=\{(x,y)\in D|A(x)=a\}\\ D_2=\{(x,y)\in D|A(x)\not=a\} \end{aligned} \end{equation}

基尼不纯度G(D1)G(D_1)G(D2)G(D_2)分别根据子集合D1D_1D2D_2里的样本情况进行计算。集合D,D1,D2D,D_1,D_2中的样本数量分别用D,D1,D2|D|,|D_1|,|D_2|表示,则根据属性AA的值aa进行划分时,所获得的基尼增益(Gini gain)的计算公式如下:

GG(A=a)=G(D)D1DG(D1)D2DG(D2)\begin{equation} GG(A=a)=G(D)-\frac{|D_1|}{|D|}G(D_1)-\frac{|D_2|}{|D|}G(D_2) \end{equation}

基尼指数

在针对节点进行属性和分割点的选择时,面对的是同一个数据集合DD,这个集合可能是最初的完整数据集合,也可能是经过分割后形成的子集合。但无论哪种情况,G(D)G(D)都是相同的,因此可以对基尼增益的计算公式进行变换,得到基尼指数(Gini index)​,它的计算公式如下:

GI(D)=D1DG(D1)+D2DG(D2)\begin{equation} GI(D)=\frac{|D_1|}{D}G(D_1)+\frac{|D_2|}{D}G(D_2) \end{equation}

基尼指数GI(D,A)GI(D,A)表示经A=aA=a分割后集合DD的不确定性,反映了从数据集DD中随机抽取两个样本,其类别标记不一致的概率。基尼指数值越小,样本集合的不确定性也就越小,做出的分割就越好,这一点与熵相似。

下图显示二类分类问题中基尼指数GI(D)GI(D)​、熵(单位比特)之半H(p)2\frac{H(p)}{2}和分类误差率的关系。横坐标表示概率pp,纵坐标表示损失。可以看出基尼指数和熵之半的曲线很接近,都可以近似地代表分类误差率。

基尼指数、熵之半、分类误差率.png

CART分类树生成算法

输入:训练数据集DD,停止计算的条件。

输出:CART分类树。

根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉分类树:

  1. 设结点的训练数据集为DD,计算现有特征对该数据集的基尼指数。此时,对每一个特征AA,对其可能取的每个值aa,根据样本点对A=aA=a的测试为“是”或“否”将DD分割成D1D_1D2D_2两部分,利用式(6)计算A=aA=a时的基尼指数。
  2. 在所有可能的特征AA以及它们所有可能的切分点aa中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
  3. 对两个子结点递归地调用步骤1和2​,直至满足停止条件。
  4. 生成CART决策树。

算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类)​,或者没有更多特征。

回归树

假设XXYY分别为输入和输出变量,并且YY是连续变量,给定训练数据集D={(xi,yi)}i=1ND=\{(x_i,y_i)\}_{i=1}^N考虑如何生成回归树。

一棵回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为MM个单元Rm,m=1,2,,MR_m,m=1,2,\cdots,M,并且在每个单元RmR_m上有一个固定的输出值cmc_m,于是回归树模型可表示为

f(x)=m=1McmI(xRm)\begin{equation} f(x)=\sum_{m=1}^Mc_mI(x\in R_m) \end{equation}

当输入空间的划分确定时,可以用平方误差

1nm=1MxiRm(yif(xi))2\frac{1}{n}\sum_{m=1}^M\sum_{x_i\in R_m}(y_i-f(x_i))^2

来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。

问题是怎样对输入空间进行划分。这里采用启发式的方法,选择第jj个变量x(j)x^{(j)}和它取的值ss,作为切分变量(splitting variable)切分点(splitting point)​,并定义两个区域:

R1(j,s)={xx(j)s}R2(j,s)={xx(j)>s}\begin{equation} \begin{aligned} R_1(j,s)=\{x|x^{(j)}\le s\}\\ R_2(j,s)=\{x|x^{(j)}>s\} \end{aligned} \end{equation}

然后寻找最优切分变量jj和最优切分点ss。具体地,求解

minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]\begin{equation} \min_{j,s}\left[\min_{c_1}\sum_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min_{c_2}\sum_{x_i\in R_2(j,s)}(y_i-c_2)^2\right] \end{equation}

对固定输入变量jj可以找到最优切分点ss

易知,单元RmR_m上的cmc_m的最优值c^m\hat{c}_mRmR_m上的所有输入实例xix_i对应的输出yiy_i的均值,即

c^m=ave(yixiRm(j,s))=1NmxiRm(j,s)yi,xRm,m=1,2\begin{equation} \hat{c}_m=ave(y_i|x_i\in R_m(j,s))=\frac{1}{N_m}\sum_{x_i\in R_m(j,s)}y_i,x\in R_m,m=1,2 \end{equation}

遍历所有输入变量,找到最优的切分变量jj,构成一个对(j,s)(j,s)​。依此将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止。这样就生成一棵回归树。这样的回归树通常称为最小二乘回归树(least squares regression tree)​,现将算法叙述如下。

最小二乘回归树生成算法

输入:训练数据集DD

输出:回归树f(x)f(x)​。

在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:

  1. 选择最优切分变量jj与切分点ss,求解式(8)。遍历变量jj,对固定的切分变量jj扫描切分点ss,选择使式(8)达到最小值的对(j,s)(j,s)​。
  2. 用选定的对(j,s)(j,s)划分区域并决定式(7)和式(9)中的R1,R2,c1,c2R_1,R_2,c_1,c_2
  3. 继续对两个子区域调用步骤(1)和(2)​,直至满足停止条件。
  4. 将输入空间划分为MM个区域Rm,m=1,2,,MR_m,m=1,2,\cdots,M,生成决策树,即式(6)。

CART剪枝

CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单)​,从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先从生成算法产生的决策树T0T_0底端开始不断剪枝,直到T0T_0的根结点,形成一个子树序列{Ti}i=0n\{T_i\}_{i=0}^n;然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。

在剪枝过程中,计算子树的损失函数:

Cα(T)=C(T)+αT\begin{equation} C_\alpha(T)=C(T)+\alpha|T| \end{equation}

其中,TT为任意子树,C(T)C(T)为对训练数据的预测误差(如基尼指数)​,T|T|为子树的叶结点个数,α0\alpha\ge 0为参数,Cα(T)C_\alpha(T)为参数是α\alpha时的子树T的整体损失。参数α\alpha权衡训练数据的拟合程度与模型的复杂度。

对固定的α\alpha,一定存在使损失函数Cα(T)C_\alpha(T)最小的子树,将其表示为TαT_\alphaTαT_\alpha在损失函数Cα(T)C\alpha(T)最小的意义下是最优的。容易验证这样的最优子树是唯一的。当α\alpha大的时候,最优子树TαT_\alpha偏小;当α\alpha小的时候,最优子树TαT_\alpha偏大。极端情况,当\alpha=0时,整体树是最优的。当α\alpha\rightarrow\infty时,根结点组成的单结点树是最优的。

Breiman等人证明:可以用递归的方法对树进行剪枝。将α\alpha从小增大,0=α0<α1<<αn<+0=\alpha_0<\alpha_1<\cdots<\alpha_n<+\infty,产生一系列的区间[αi,αi+1),i=0,1,,n[\alpha_i,\alpha_i+1),i=0,1,…,n;剪枝得到的子树序列对应着区间α[αi,αi+1),i=0,1,,n\alpha\in[\alpha_i,\alpha_i+1)​,i=0,1,…,n的最优子树序列{Ti}i=0n\{T_i\}_{i=0}^n,序列中的子树是嵌套的。

具体地,从整体树T0T_0开始剪枝。对T0T_0的任意内部结点tt,以tt为单叶子结点树的损失函数是

Cα(t)=C(t)+α\begin{equation} C_\alpha(t)=C(t)+\alpha \end{equation}

tt为根结点的子树TtT_t的损失函数是

Cα(Tt)=C(Tt)+αTt\begin{equation} C_\alpha(T_t)=C(T_t)+\alpha|T_t| \end{equation}

α=0\alpha=0α\alpha充分小时,有不等式

Cα(Tt)<Cα(t)\begin{equation} C_\alpha(T_t)<C_\alpha(t) \end{equation}

α\alpha增大时,在某一α\alpha

Cα(Tt)=Cα(t)\begin{equation} C_\alpha(T_t)=C_\alpha(t) \end{equation}

α\alpha再增大时,不等式(14)反向。只要α=C(t)C(Tt)Tt1,Tt\alpha=\frac{C(t)-C(T_t)}{|T_t|-1},T_ttt有相同的损失函数值,而tt的结点少,因此ttTtT_t更可取,对TtT_t进行剪枝。

为此,对T0T_0中每一内部结点tt,计算

g(t)=C(t)C(Tt)Tt1\begin{equation} g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} \end{equation}

它表示剪枝后整体损失函数减少的程度。在T0T_0中剪去g(t)g(t)最小的TtT_t,将得到的子树作为T1T_1,同时将最小的g(t)g(t)设为α1\alpha_1T1T_1为区间[α1,α2)[\alpha_1,\alpha_2)的最优子树。

如此剪枝下去,直至得到根结点。在这一过程中,不断地增加α\alpha的值,产生新的区间。

CART剪枝算法

输入:CART算法生成的决策树T0T_0

输出:最优决策树TαT_α

  1. k=0,T=T0k=0,T=T_0

  2. α=+\alpha=+\infty

  3. 自上而下地对各内部结点tt计算C(Tt),Tt,g(t)C(T_t),|T_t|,g(t)以及

α=min(α,g(t))\alpha=\min(\alpha,g(t))

这里,TtT_t表示以tt为根结点的子树,C(Tt)C(T_t)是对训练数据的预测误差,Tt|T_t|TtT_t的叶结点个数。

  1. g(t)=αg(t)=\alpha的内部结点tt进行剪枝,并对叶结点tt以多数表决法决定其类,得到树TT

  2. k=k+1,αk=α,Tk=Tk=k+1,\alpha_k=\alpha,T_k=T

  3. 如果TkT_k不是由根结点及两个叶结点构成的树,则回到步骤2;否则令Tk=TnT_k=T_n

交叉验证法

有些文献将交叉验证法写进CCP算法中,成为CCP算法的一部分,这样是说不通的。交叉验证法的原理是将原始训练集拆分为训练集和验证集(注意不是测试集),使用训练集进行训练,验证集进行测试,以防止过拟合。

表现在CCP算法中,应为将原始训练集拆分为训练集和验证集,使用训练集生成决策树并剪枝,再使用验证集根据总误差最小的原则选择最优的决策树。