决策树(四)| 分类与回归树模型(CART算法)| 《统计学习方法》学习笔记(二十)

分类与回归树模型(classification and regression tree,CART)由特征选择、树的生成及剪枝组成,可用于分类或回归。以下将用于分类或回归的树称为决策树。

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

CART算法

(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;

(2)决策树剪枝:用于验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

1. CART生成

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

  1. 回归树的生成

假设X与Y分别为输入和输出变量,并且Y是连续变量,给定训练数据集
D={(x1,y1),(x2,y2),...,(xN,yN)} D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}
考虑如何生成回归树。

一个回归树对应着输入空间(特征空间)的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为M个单元R1,R2,...,RMR_1,R_2,...,R_M,并且在每个单元RmR_m上有一个固定的输出值cmc_m,于是回归树模型可表示为
f(x)=m=1McmI(xRm) f(x)=\sum_{m=1}^Mc_mI(x\in R_m)
当输入空间的划分确定时,可以用平方误差xiRm(yif(xi))2\sum_{x_i\in R_m}(y_i-f(x_i))^2来表示回归树对于训练数据的预测误差。用平方误差最小的准则求解每个单元上的最优输出值。易知,单元RmR_m上的cmc_m的最优值c^m\hat c_mRmR_m上的所有输入实例xix_i对应的输出yiy_i的均值,即
c^m=ave(yixiRm) \hat c_m=ave(y_i|x_i\in R_m)
问题是怎么对输入空间进行划分。这里采用启发式的方法,选择第j个变量x(j)x^{(j)}和它取的值s,作为切分变量(splitting variable)和切分点(splitting point),并定义两个区域:
R1(j,s)={xx(j)s}R2(j,s)={xx(j)>s} R_1(j,s)=\{x|x^{(j)}\leq s\} \\ R_2(j,s)=\{x|x^{(j)}>s\}
然后寻找最优切分变量j和最优切分点s。具体地,求解
minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2] min_{j,s}[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]
对固定输入变量j可以找到最优切分点s。
c^1=ave(yixiR1(j,s))c^2=ave(yixiR2(j,s)) \hat c_1=ave(y_i|x_i\in R_1(j,s)) \\ \hat c_2=ave(y_i|x_i\in R_2(j,s))
遍历所有输入变量,找到最优的切分变量j,构成一个对(j,s)(j,s)。依次将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止,这样就生成了一颗回归树。这样的回归树通常称为最小二乘回归树(least square regression tree)。

算法:最小二乘回归树生成算法

输入:训练数据集D

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

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

(1)选择最优切分变量j与切分点s,求解
minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2] min_{j,s}[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]
遍历变量j,对固定的切分变量j扫描切分点s,选择上式达到最小值的对(j,s)(j,s)

(2)用选定的对(j,s)(j,s)划分区域并决定相对应的输出值:
R1(j,s)={xx(j)s},R2(j,s)={xx(j)>s}c^m=1NmxiRm(j,s)yi,xRm,m=1,2 R_1(j,s)=\{x|x^{(j)}\leq s\},\quad R_2(j,s)=\{x|x^{(j)}>s\} \\ \hat c_m=\frac{1}{N_m}\sum_{x_i \in R_m(j,s)}y_i,\quad x\in R_m, \quad m=1,2
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。

(4)将输入空间划分为M个区域R1,R2,...,RMR_1,R_2,...,R_M,生成决策树:
f(x)=m=1Mc^mI(xRm) f(x)=\sum_{m=1}^M\hat c_mI(x\in R_m)

  1. 分类树的生成

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

基尼指数:分类问题中,假设有K个类,样本点属于第k类的概率为pkp_k,则概率分布的基尼指数定义为
Gini(p)=k=1Kpk(1pk)=1k=1Kpk2 Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
对于二类分类问题,若样本点属于第1个类的概率是p,则概率分布的基尼指数为
Gini(p)=2p(1p) Gini(p)=2p(1-p)
对于给定的样本集合D,其基尼指数为
Gini(D)=1k=1K(CkD)2 Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
这里,CkC_k是D中属于第k类的样本子集,K是类的个数。

如果样本集合D根据特征A是否取某一可能值a被分割成D1D_1D2D_2两部分,即
D1={(x,y)DA(x)=a},D2=DD1 D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1
则在特征A的条件下,集合D的基尼指数定义为
Gini(D,A)=D1DGini(D1)+D2DGini(D2)(1) Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \tag{1}
基尼指数Gini(D)Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)Gini(D,A)表示经A=aA=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。

下图显示二类分类问题总基尼指数Gini(p)Gini(p)、熵(单位比特)之半12H(p)\frac{1}{2}H(p)和分类误差率的关系。横坐标表示概率p,纵坐标表示损失。可以看出基尼指数和熵之半的曲线很接近,都可以近似第代表分类误差率。
决策树(四)| 分类与回归树模型(CART算法)| 《统计学习方法》学习笔记(二十)
算法:CART生成算法

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

输出:CART决策树。

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

(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割成D1D_1D2D_2两部分,利用式(1)计算A=a时的基尼指数。

(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。

(3)对两个子结点递归地调用(1),(2),直至满足停止条件

(4)生成CART决策树

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

:根据下表所给训练数据集,应用CART算法生成决策树。

决策树(四)| 分类与回归树模型(CART算法)| 《统计学习方法》学习笔记(二十)

:首先计算各特征的基尼指数,选择最优特征及其最优切分点。分别以A1,A2,A3,A4A_1,A_2,A_3,A_4表示年龄、有工作、有自己的房子和信贷情况4个特征,并以1,2,3表示年龄的值为青年、中年和老年,以1,2表示有工作和有自己的房子的值为是和否,以1,2,3表示信贷情况的值为非常好、好和一般。

求特征A1A_1的基尼指数:
Gini(D,A1=1)=515(2×25(125))+1015(2×710×(1710))=0.44Gini(D,A1=2)=0.48Gini(D,A1=3)=0.44 Gini(D,A_1=1)=\frac{5}{15}(2\times\frac{2}{5}(1-\frac{2}{5}))+\frac{10}{15}(2\times \frac{7}{10}\times (1-\frac{7}{10}))=0.44 \\ Gini(D,A_1=2)=0.48 \\ Gini(D,A_1=3)=0.44
由于Gini(D,A1=1)Gini(D,A_1=1)Gini(D,A1=3)Gini(D,A_1=3)相等,且最小,所以A1=1A_1=1A1=3A_1=3都可以选作A1A_1的最优切分点。

求特征A2A_2A3A_3的基尼指数:
Gini(D,A2=1)=0.32Gini(D,A3=1)=0.27 Gini(D,A_2=1)=0.32 \\ Gini(D,A_3=1)=0.27
由于A2A_2A3A_3只有一个切分点,所以它们就是最优切分点。

求特征A4A_4基尼指数:
Gini(D,A4=1)=0.36Gini(D,A4=2)=0.47Gini(D,A4=3)=0.32 Gini(D,A_4=1)=0.36 \\ Gini(D,A_4=2)=0.47 \\ Gini(D,A_4=3)=0.32
由于Gini(D,A4=3)Gini(D,A_4=3)最小,所以A4=3A_4=3A4A_4的最优切分点。

A1,A2,A3,A4A_1,A_2,A_3,A_4几个特征中,Gini(D,A3=1)=0.27Gini(D,A_3=1)=0.27最小,所以选择特征A3A_3为最优特征,A3=1A_3=1为其最优切分点。于是根结点生成两个子结点,一个是叶结点。对另一个结点继续使用以上方法A1,A2,A4A_1,A_2,A_4中选择最优特征及其最优切分点,结果是A2=1A_2=1。依次计算得知,所得结点都是叶结点。

对于本问题,按照CART算法所生成的决策树与按照ID3算法所生成的决策树完全一致。

2. CART剪枝

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

  1. 剪枝,形成一个子树序列

    在剪枝过程中,计算子树的损失函数
    Cα(T)=C(T)+αT C_{\alpha}(T)=C(T)+\alpha|T|
    其中,T为任意子树,C(T)C(T)为对训练数据的预测误差(如基尼指数),T|T|为子树的叶结合个数,α0\alpha\geq 0为参数,Cα(T)C_{\alpha}(T)为参数是α\alpha时的子树T的整体损失。参数α\alpha权衡训练数据的拟合程度与模型的复杂度。

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

    Breiman等人证明:可以用递归的方法对树进行剪枝。将α\alpha从小增大,0=α0<α1<<αn<+0=\alpha_0<\alpha_1<···<\alpha_n<+\infty,产生一系列的区间[ai,a+i+1),i=0,1,,n;[a_i,a+{i+1}),i=0,1,···,n;剪枝得到的子树序列对应着区间α[ai,ai+1),i=0,1,,n\alpha\in [a_i,a_{i+1}),i=0,1,···,n的最优子树序列{T0,T1,...,Tn}\{T_0,T_1,...,T_n\},序列中的子树是嵌套的。

    具体地,从整体树T0T_0开始剪枝。对T0T_0的任意内部结点t,以t为单结点树的损失函数是
    Cα(t)=C(t)+α C_{\alpha}(t)=C(t)+\alpha
    以t为根结点的子树TiT_i的损失函数是
    Cα(Tt)=C(Tt)+αTt C_{\alpha}(T_t)=C(T_t)+\alpha|T_t|
    α=0\alpha=0α\alpha充分小时,有不等式
    Cα(Tt)<Cα(t)(1) C_{\alpha}(T_t)<C_{\alpha}(t) \tag{1}
    α\alpha增大时,在某一α\alpha
    Cα(Tt)=Cα(t) C_{\alpha}(T_t)=C_\alpha(t)
    α\alpha再增大时,不等式(1)(1)反向。只要a=C(t)C(Ti)Tt1a=\frac{C(t)-C(T_i)}{|T_t|-1}TtT_t与t有相同的损失函数值,而t的结点少,因此t比TtT_t更可取,对TtT_t进行剪枝。

    为此,对T0T_0中每一内部结点t,计算
    g(t)=C(t)C(Tt)Tt1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}
    它表示剪枝后整体损失函数减少的程度。在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的值,产生新的区间。

  2. 在剪枝得到的子树序列T0,T1,,TnT_0,T_1,···,T_n中通过交叉验证选取最优子树TαT_\alpha

    利用独立的验证数据集,测试子树序列T0,T1,,TnT_0,T_1,···,T_n中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每颗子树T1,T2,,TnT_1,T_2,···,T_n都对应于一个参数α1,α2,,αn\alpha_1,\alpha_2,···,\alpha_n。所以,当最优子树TkT_k确定时,对应的aka_k也确定了,即得到最优决策树TαT_\alpha.

算法:剪枝算法

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

输出:最优决策树TαT_\alpha.

(1)设k=0,T=T0k=0,T=T_0

(2)设a=+a=+\infty

(3)自下而上地对各内部结点t计算C(Tt)C(T_t)Tt|T_t|以及
g(t)=C(t)C(Tt)Tt1a=min(a,g(t)) g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} \\ a = min(a,g(t))
这里,TtT_t表示以t为根结点的子树,C(Tt)C(T_t)是对训练数据的预测误差,Tt|T_t|TtT_t的叶结点个数。

(4)自上而下地访问内部结点t,如果有g(t)=αg(t)=\alpha,进行剪枝,并对叶结点t以多数表决发决定其类,得到树T。

(5)设k=k+1, αk=α, T=Tk=k+1,\space \alpha_k=\alpha, \space T=T

(6)如果T不是由根结点单独构成的树,则回到步骤(4)。

(7)采用交叉验证法在子树序列T0,T1,,TnT_0,T_1,···,T_n中选取最优子树$