分类与回归树模型(classification and regression tree,CART)由特征选择、树的生成及剪枝组成,可用于分类或回归。以下将用于分类或回归的树称为决策树。
CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支式取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝:用于验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
1. CART生成
决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
- 回归树的生成
假设X与Y分别为输入和输出变量,并且Y是连续变量,给定训练数据集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
N
,
y
N
)
}
D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}
D={(x1,y1),(x2,y2),...,(xN,yN)}
考虑如何生成回归树。
一个回归树对应着输入空间(特征空间)的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为M个单元
R
1
,
R
2
,
.
.
.
,
R
M
R_1,R_2,...,R_M
R1,R2,...,RM,并且在每个单元
R
m
R_m
Rm上有一个固定的输出值
c
m
c_m
cm,于是回归树模型可表示为
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x)=\sum_{m=1}^Mc_mI(x\in R_m)
f(x)=m=1∑McmI(x∈Rm)
当输入空间的划分确定时,可以用平方误差
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\sum_{x_i\in R_m}(y_i-f(x_i))^2
∑xi∈Rm(yi−f(xi))2来表示回归树对于训练数据的预测误差。用平方误差最小的准则求解每个单元上的最优输出值。易知,单元
R
m
R_m
Rm上的
c
m
c_m
cm的最优值
c
^
m
\hat c_m
c^m是
R
m
R_m
Rm上的所有输入实例
x
i
x_i
xi对应的输出
y
i
y_i
yi的均值,即
c
^
m
=
a
v
e
(
y
i
∣
x
i
∈
R
m
)
\hat c_m=ave(y_i|x_i\in R_m)
c^m=ave(yi∣xi∈Rm)
问题是怎么对输入空间进行划分。这里采用启发式的方法,选择第j个变量
x
(
j
)
x^{(j)}
x(j)和它取的值s,作为切分变量(splitting variable)和切分点(splitting point),并定义两个区域:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
≤
s
}
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_1(j,s)=\{x|x^{(j)}\leq s\} \\ R_2(j,s)=\{x|x^{(j)}>s\}
R1(j,s)={x∣x(j)≤s}R2(j,s)={x∣x(j)>s}
然后寻找最优切分变量j和最优切分点s。具体地,求解
m
i
n
j
,
s
[
m
i
n
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
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]
minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]
对固定输入变量j可以找到最优切分点s。
c
^
1
=
a
v
e
(
y
i
∣
x
i
∈
R
1
(
j
,
s
)
)
c
^
2
=
a
v
e
(
y
i
∣
x
i
∈
R
2
(
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))
c^1=ave(yi∣xi∈R1(j,s))c^2=ave(yi∣xi∈R2(j,s))
遍历所有输入变量,找到最优的切分变量j,构成一个对
(
j
,
s
)
(j,s)
(j,s)。依次将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,直到满足停止条件为止,这样就生成了一颗回归树。这样的回归树通常称为最小二乘回归树(least square regression tree)。
算法:最小二乘回归树生成算法
输入:训练数据集D
输出:回归树 f ( x ) f(x) f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树;
(1)选择最优切分变量j与切分点s,求解
m
i
n
j
,
s
[
m
i
n
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
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]
minj,s[minc1xi∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)∑(yi−c2)2]
遍历变量j,对固定的切分变量j扫描切分点s,选择上式达到最小值的对
(
j
,
s
)
(j,s)
(j,s)。
(2)用选定的对
(
j
,
s
)
(j,s)
(j,s)划分区域并决定相对应的输出值:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
≤
s
}
,
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
c
^
m
=
1
N
m
∑
x
i
∈
R
m
(
j
,
s
)
y
i
,
x
∈
R
m
,
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
R1(j,s)={x∣x(j)≤s},R2(j,s)={x∣x(j)>s}c^m=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。
(4)将输入空间划分为M个区域
R
1
,
R
2
,
.
.
.
,
R
M
R_1,R_2,...,R_M
R1,R2,...,RM,生成决策树:
f
(
x
)
=
∑
m
=
1
M
c
^
m
I
(
x
∈
R
m
)
f(x)=\sum_{m=1}^M\hat c_mI(x\in R_m)
f(x)=m=1∑Mc^mI(x∈Rm)
- 分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼指数:分类问题中,假设有K个类,样本点属于第k类的概率为
p
k
p_k
pk,则概率分布的基尼指数定义为
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p)=\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二类分类问题,若样本点属于第1个类的概率是p,则概率分布的基尼指数为
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p)=2p(1-p)
Gini(p)=2p(1−p)
对于给定的样本集合D,其基尼指数为
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D)=1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
这里,
C
k
C_k
Ck是D中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值a被分割成
D
1
D_1
D1和
D
2
D_2
D2两部分,即
D
1
=
{
(
x
,
y
)
∈
D
∣
A
(
x
)
=
a
}
,
D
2
=
D
−
D
1
D_1=\{(x,y)\in D|A(x)=a\},\quad D_2=D-D_1
D1={(x,y)∈D∣A(x)=a},D2=D−D1
则在特征A的条件下,集合D的基尼指数定义为
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
(1)
Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) \tag{1}
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)(1)
基尼指数
G
i
n
i
(
D
)
Gini(D)
Gini(D)表示集合D的不确定性,基尼指数
G
i
n
i
(
D
,
A
)
Gini(D,A)
Gini(D,A)表示经
A
=
a
A=a
A=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
下图显示二类分类问题总基尼指数
G
i
n
i
(
p
)
Gini(p)
Gini(p)、熵(单位比特)之半
1
2
H
(
p
)
\frac{1}{2}H(p)
21H(p)和分类误差率的关系。横坐标表示概率p,纵坐标表示损失。可以看出基尼指数和熵之半的曲线很接近,都可以近似第代表分类误差率。
算法:CART生成算法
输入:训练数据集D,停止计算的条件;
输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树;
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割成 D 1 D_1 D1和 D 2 D_2 D2两部分,利用式(1)计算A=a时的基尼指数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件
(4)生成CART决策树
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
例:根据下表所给训练数据集,应用CART算法生成决策树。
解:首先计算各特征的基尼指数,选择最优特征及其最优切分点。分别以 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征,并以1,2,3表示年龄的值为青年、中年和老年,以1,2表示有工作和有自己的房子的值为是和否,以1,2,3表示信贷情况的值为非常好、好和一般。
求特征
A
1
A_1
A1的基尼指数:
G
i
n
i
(
D
,
A
1
=
1
)
=
5
15
(
2
×
2
5
(
1
−
2
5
)
)
+
10
15
(
2
×
7
10
×
(
1
−
7
10
)
)
=
0.44
G
i
n
i
(
D
,
A
1
=
2
)
=
0.48
G
i
n
i
(
D
,
A
1
=
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)=155(2×52(1−52))+1510(2×107×(1−107))=0.44Gini(D,A1=2)=0.48Gini(D,A1=3)=0.44
由于
G
i
n
i
(
D
,
A
1
=
1
)
Gini(D,A_1=1)
Gini(D,A1=1)和
G
i
n
i
(
D
,
A
1
=
3
)
Gini(D,A_1=3)
Gini(D,A1=3)相等,且最小,所以
A
1
=
1
A_1=1
A1=1和
A
1
=
3
A_1=3
A1=3都可以选作
A
1
A_1
A1的最优切分点。
求特征
A
2
A_2
A2和
A
3
A_3
A3的基尼指数:
G
i
n
i
(
D
,
A
2
=
1
)
=
0.32
G
i
n
i
(
D
,
A
3
=
1
)
=
0.27
Gini(D,A_2=1)=0.32 \\ Gini(D,A_3=1)=0.27
Gini(D,A2=1)=0.32Gini(D,A3=1)=0.27
由于
A
2
A_2
A2和
A
3
A_3
A3只有一个切分点,所以它们就是最优切分点。
求特征
A
4
A_4
A4基尼指数:
G
i
n
i
(
D
,
A
4
=
1
)
=
0.36
G
i
n
i
(
D
,
A
4
=
2
)
=
0.47
G
i
n
i
(
D
,
A
4
=
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=1)=0.36Gini(D,A4=2)=0.47Gini(D,A4=3)=0.32
由于
G
i
n
i
(
D
,
A
4
=
3
)
Gini(D,A_4=3)
Gini(D,A4=3)最小,所以
A
4
=
3
A_4=3
A4=3为
A
4
A_4
A4的最优切分点。
在 A 1 , A 2 , A 3 , A 4 A_1,A_2,A_3,A_4 A1,A2,A3,A4几个特征中, G i n i ( D , A 3 = 1 ) = 0.27 Gini(D,A_3=1)=0.27 Gini(D,A3=1)=0.27最小,所以选择特征 A 3 A_3 A3为最优特征, A 3 = 1 A_3=1 A3=1为其最优切分点。于是根结点生成两个子结点,一个是叶结点。对另一个结点继续使用以上方法 A 1 , A 2 , A 4 A_1,A_2,A_4 A1,A2,A4中选择最优特征及其最优切分点,结果是 A 2 = 1 A_2=1 A2=1。依次计算得知,所得结点都是叶结点。
对于本问题,按照CART算法所生成的决策树与按照ID3算法所生成的决策树完全一致。
2. CART剪枝
CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先从生成算法产生的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根结点,形成一个子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
-
剪枝,形成一个子树序列
在剪枝过程中,计算子树的损失函数
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+\alpha|T| Cα(T)=C(T)+α∣T∣
其中,T为任意子树, C ( T ) C(T) C(T)为对训练数据的预测误差(如基尼指数), ∣ T ∣ |T| ∣T∣为子树的叶结合个数, α ≥ 0 \alpha\geq 0 α≥0为参数, C α ( T ) C_{\alpha}(T) Cα(T)为参数是 α \alpha α时的子树T的整体损失。参数 α \alpha α权衡训练数据的拟合程度与模型的复杂度。对固定的 α \alpha α,一定存在使损失函数 C α ( T ) C_{\alpha}(T) Cα(T)最小的子树,将其表示为 T α T_{\alpha} Tα. T α T_{\alpha} Tα在损失函数 C α ( T ) C_\alpha(T) Cα(T)最小的意义下是最优的。容易验证这样的最优子树是唯一的。当 α \alpha α大的时候,最优子树 T α T_{\alpha} Tα偏小;当 α \alpha α小的时候,最优子树 T α T_\alpha Tα偏大。极端情况,当 a = 0 a=0 a=0时,整体树是最优的。当 α → ∞ \alpha \to \infty α→∞时,根结点组成的单结点树是最优的。当 α → ∞ \alpha\to \infty α→∞时,根结点组成的单结点树是最优的。
Breiman等人证明:可以用递归的方法对树进行剪枝。将 α \alpha α从小增大, 0 = α 0 < α 1 < ⋅ ⋅ ⋅ < α n < + ∞ 0=\alpha_0<\alpha_1<···<\alpha_n<+\infty 0=α0<α1<⋅⋅⋅<αn<+∞,产生一系列的区间 [ a i , a + i + 1 ) , i = 0 , 1 , ⋅ ⋅ ⋅ , n ; [a_i,a+{i+1}),i=0,1,···,n; [ai,a+i+1),i=0,1,⋅⋅⋅,n;剪枝得到的子树序列对应着区间 α ∈ [ a i , a i + 1 ) , i = 0 , 1 , ⋅ ⋅ ⋅ , n \alpha\in [a_i,a_{i+1}),i=0,1,···,n α∈[ai,ai+1),i=0,1,⋅⋅⋅,n的最优子树序列 { T 0 , T 1 , . . . , T n } \{T_0,T_1,...,T_n\} {T0,T1,...,Tn},序列中的子树是嵌套的。
具体地,从整体树 T 0 T_0 T0开始剪枝。对 T 0 T_0 T0的任意内部结点t,以t为单结点树的损失函数是
C α ( t ) = C ( t ) + α C_{\alpha}(t)=C(t)+\alpha Cα(t)=C(t)+α
以t为根结点的子树 T i T_i Ti的损失函数是
C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}(T_t)=C(T_t)+\alpha|T_t| Cα(Tt)=C(Tt)+α∣Tt∣
当 α = 0 \alpha=0 α=0及 α \alpha α充分小时,有不等式
C α ( T t ) < C α ( t ) (1) C_{\alpha}(T_t)<C_{\alpha}(t) \tag{1} Cα(Tt)<Cα(t)(1)
当 α \alpha α增大时,在某一 α \alpha α有
C α ( T t ) = C α ( t ) C_{\alpha}(T_t)=C_\alpha(t) Cα(Tt)=Cα(t)
当 α \alpha α再增大时,不等式 ( 1 ) (1) (1)反向。只要 a = C ( t ) − C ( T i ) ∣ T t ∣ − 1 a=\frac{C(t)-C(T_i)}{|T_t|-1} a=∣Tt∣−1C(t)−C(Ti), T t T_t Tt与t有相同的损失函数值,而t的结点少,因此t比 T t T_t Tt更可取,对 T t T_t Tt进行剪枝。为此,对 T 0 T_0 T0中每一内部结点t,计算
g ( t ) = C ( t ) − C ( T t ) ∣ T t ∣ − 1 g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} g(t)=∣Tt∣−1C(t)−C(Tt)
它表示剪枝后整体损失函数减少的程度。在 T 0 T_0 T0中剪去 g ( t ) g(t) g(t)最小的 T t T_t Tt,将得到的子树作为 T 1 T_1 T1,同时将最小的 g ( t ) g(t) g(t)设为 α 1 \alpha_1 α1, T 1 T_1 T1为区间 [ α 1 , α 2 ) [\alpha_1,\alpha_2) [α1,α2)的最优子树。如此剪枝下来,直至得到根结点。在这一过程中,不断地增加 α \alpha α的值,产生新的区间。
-
在剪枝得到的子树序列 T 0 , T 1 , ⋅ ⋅ ⋅ , T n T_0,T_1,···,T_n T0,T1,⋅⋅⋅,Tn中通过交叉验证选取最优子树 T α T_\alpha Tα
利用独立的验证数据集,测试子树序列 T 0 , T 1 , ⋅ ⋅ ⋅ , T n T_0,T_1,···,T_n T0,T1,⋅⋅⋅,Tn中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每颗子树 T 1 , T 2 , ⋅ ⋅ ⋅ , T n T_1,T_2,···,T_n T1,T2,⋅⋅⋅,Tn都对应于一个参数 α 1 , α 2 , ⋅ ⋅ ⋅ , α n \alpha_1,\alpha_2,···,\alpha_n α1,α2,⋅⋅⋅,αn。所以,当最优子树 T k T_k Tk确定时,对应的 a k a_k ak也确定了,即得到最优决策树 T α T_\alpha Tα.
算法:剪枝算法
输入: C A R T CART CART算法生成的决策树 T 0 T_0 T0;
输出:最优决策树 T α T_\alpha Tα.
(1)设 k = 0 , T = T 0 k=0,T=T_0 k=0,T=T0
(2)设 a = + ∞ a=+\infty a=+∞
(3)自下而上地对各内部结点t计算
C
(
T
t
)
C(T_t)
C(Tt),
∣
T
t
∣
|T_t|
∣Tt∣以及
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
a
=
m
i
n
(
a
,
g
(
t
)
)
g(t)=\frac{C(t)-C(T_t)}{|T_t|-1} \\ a = min(a,g(t))
g(t)=∣Tt∣−1C(t)−C(Tt)a=min(a,g(t))
这里,
T
t
T_t
Tt表示以t为根结点的子树,
C
(
T
t
)
C(T_t)
C(Tt)是对训练数据的预测误差,
∣
T
t
∣
|T_t|
∣Tt∣是
T
t
T_t
Tt的叶结点个数。
(4)自上而下地访问内部结点t,如果有 g ( t ) = α g(t)=\alpha g(t)=α,进行剪枝,并对叶结点t以多数表决发决定其类,得到树T。
(5)设 k = k + 1 , α k = α , T = T k=k+1,\space \alpha_k=\alpha, \space T=T k=k+1, αk=α, T=T
(6)如果T不是由根结点单独构成的树,则回到步骤(4)。
(7)采用交叉验证法在子树序列 T 0 , T 1 , ⋅ ⋅ ⋅ , T n T_0,T_1,···,T_n T0,T1,⋅⋅⋅,Tn中选取最优子树$