决策树(decision tree)是一种基本的分类与回归方法。本章主要讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。这些决策树学习的思想主要来源于由Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法。
本章首先介绍决策树的基本概念,然后通过ID3和C4.5介绍特征的选择、决策树的生成以及决策树的修剪,最后介绍CART算法。
本章内容比较多,不过理解了的话很容易融会贯通
模型
决策树定义: 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。
学习策略
决策树学习本质上是从训练数据集中归纳出一组分类规则,与训练数据集不相矛盾的决策树可能有多个也可能一个都没有,我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。
决策树学习的损失函数通常是正则化的极大似然估计函数
决策树对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,容易发生过拟合,所以需要对决策树进行剪枝
决策树学习算法包括:
- 特征选择
- 决策树生成
- 决策树剪枝
决策树的生成对应模型的局部选择,剪枝对应全局选择,所以分别考虑局部最优和全局最优
特征选择
特征选择在于选取对训练数据具有分类能力的特征,通常选用的准则是信息增益和信息增益比
如果一个特征具有更好的分类能力,或者说按照这一特征讲训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那么就更应该选择这个特征。
信息增益
先给出熵与条件熵的定义,在信息论与概率统计中,熵是表示随机变量不确定的变量,设X是一个取有限个值的离散随机变量,其概率分布为:
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
.
.
.
,
n
\begin{aligned} P(X=x_i) = p_i, i=1,2,...,n \end{aligned}
P(X=xi)=pi,i=1,2,...,n
则随机变量X的熵被定义为:
H
(
X
)
=
−
∑
i
=
1
n
p
i
l
o
g
p
i
\begin{aligned} H(X) = -\sum_{i=1}^np_ilogp_i \end{aligned}
H(X)=−i=1∑npilogpi
若
p
i
=
0
p_i=0
pi=0 ,则定义
0
l
o
g
0
=
0
0log0=0
0log0=0,由定义可知,熵与X的取值无关,所以也可以记作
H
(
p
)
H(p)
H(p):
H
(
p
)
=
−
∑
i
=
1
n
p
i
l
o
g
p
i
\begin{aligned} H(p) = -\sum_{i=1}^np_ilogp_i \end{aligned}
H(p)=−i=1∑npilogpi
条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X) 表示在已知随机变量X的条件下,随机变量Y的不确定性。随机变量X给定的条件下随机变量Y的条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X) ,定义为:X给定条件下,Y的条件概率分布 的 熵,对X的数学期望:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
\begin{aligned} H(Y|X) = \sum_{i=1}^np_iH(Y|X = x_i) \end{aligned}
H(Y∣X)=i=1∑npiH(Y∣X=xi)
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度
信息增益定义:特征
A
A
A 对训练数据集D的信息增益
g
(
D
,
A
)
g(D,A)
g(D,A) 定义为集合
D
D
D 的经验熵
H
(
D
)
H(D)
H(D)与特征
A
A
A在给定条件下
D
D
D的经验条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A) 之差:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
\begin{aligned} g(D,A) = H(D) - H(D|A) \end{aligned}
g(D,A)=H(D)−H(D∣A)
一般地,熵 H ( Y ) H(Y) H(Y)与条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X) 之差称为互信息。局册数学习中的信息增益等价于训练数据集中类与特征的互信息。
以信息增益作为划分训练数据集的特征,存在偏向选择取值较多的特征的问题,使用信息增益比可以对这一问题进行校正。
信息增益比定义:特征A对训练数据集D的信息增益比
g
R
(
D
,
A
)
g_R(D,A)
gR(D,A)定义为其信息增益
g
(
D
,
A
)
g(D,A)
g(D,A) 与训练集D关于特征A的熵
H
A
(
D
)
H_A(D)
HA(D) 之比,即:
g
R
(
D
,
A
)
=
g
(
D
,
A
)
H
A
(
D
)
\begin{aligned} g_R(D,A) = \frac{g(D,A)}{H_A(D)} \end{aligned}
gR(D,A)=HA(D)g(D,A)
其中
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
\large H_A(D) = -\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}
HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,
n
n
n 是特征
A
A
A 取值的个数
算法
ID3算法
输入:训练数据集
D
D
D,特征集
A
A
A 阈值
ε
\varepsilon
ε
输出:决策树
T
T
T
(1)若
D
D
D 中所有实例属于同一类
C
k
C_k
Ck,则T为单结点树,并将类
C
k
C_k
Ck作为改结点的类标记,返回
T
T
T
(2)若
A
A
A为空集,则
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T
(3)否则,选择信息增益最大的特征
A
g
A_g
Ag
(4)如果
A
g
A_g
Ag的信息增益小于阈值
ε
\varepsilon
ε ,则置
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T
(5)否则,对
A
g
A_g
Ag的每一可能取值
a
i
a_i
ai,依
A
g
=
a
i
A_g=a_i
Ag=ai将D分割为若干非空子集
D
i
D_i
Di,将
D
i
D_i
Di中实例数最大的类作为标记,构建子节点,由子节点构成树
T
T
T,返回
T
T
T
(6)对第
i
i
i个子节点,以
D
i
D_i
Di为训练集,以
A
−
{
A
g
}
A-\{A_g\}
A−{Ag}为特征集,递归地调用(1)~(4),得到子树
T
i
T_i
Ti,返回
T
i
T_i
Ti
C4.5算法
输入:训练数据集
D
D
D,特征集
A
A
A 阈值
ε
\varepsilon
ε
输出:决策树
T
T
T
(1)若
D
D
D 中所有实例属于同一类
C
k
C_k
Ck,则T为单结点树,并将类
C
k
C_k
Ck作为改结点的类标记,返回
T
T
T
(2)若
A
A
A为空集,则
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T
(3)否则,选择信息增益比最大的特征
A
g
A_g
Ag
(4)如果
A
g
A_g
Ag的信息增益比小于阈值
ε
\varepsilon
ε ,则置
T
T
T为单结点树,并将
D
D
D中实例数最大的类
C
k
C_k
Ck作为该结点的类标记,返回
T
T
T
(5)否则,对
A
g
A_g
Ag的每一可能取值
a
i
a_i
ai,依
A
g
=
a
i
A_g=a_i
Ag=ai将D分割为若干非空子集
D
i
D_i
Di,将
D
i
D_i
Di中实例数最大的类作为标记,构建子节点,由子节点构成树
T
T
T,返回
T
T
T
(6)对第
i
i
i个子节点,以
D
i
D_i
Di为训练集,以
A
−
{
A
g
}
A-\{A_g\}
A−{Ag}为特征集,递归地调用(1)~(4),得到子树
T
i
T_i
Ti,返回
T
i
T_i
Ti
ID3和C4.5的唯一区别就是一个使用信息增益另一个使用信息增益比
决策树的剪枝算法
决策时容易过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,就有了剪枝,简化分类树模型
决策树剪枝往往通过极小化决策树整体的损失函数来实现,设树
T
T
T 的节点个数为
∣
T
∣
|T|
∣T∣,
t
t
t 是树
T
T
T 的叶结点,该叶结点上有
N
t
N_t
Nt 个样本点,其中
k
k
k 类的样本有
N
t
k
N_{tk}
Ntk 个,
k
=
1
,
2
,
.
.
.
,
K
k=1,2,...,K
k=1,2,...,K,
H
t
(
T
)
H_t(T)
Ht(T) 为叶结点
t
t
t上的经验熵,
α
≥
0
\alpha\ge0
α≥0,则决策树学习的损失函数可以定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
\begin{aligned} C_\alpha(T) = \sum_{t=1}^{|T|}N_tH_t(T) + \alpha|T| \end{aligned}
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中经验熵为:
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
l
o
g
N
t
k
N
t
\begin{aligned} H_t(T) = -\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t} \end{aligned}
Ht(T)=−k∑NtNtklogNtNtk
在损失函数中,记作:
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
l
o
g
N
t
k
N
t
\begin{aligned} C(T) = \sum_{t=1}^{|T|}N_tH_t(T) = -\sum_{t=1}^{|T|}\sum_{k=1}^KN_{tk}log\frac{N_{tk}}{N_t} \end{aligned}
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
这时有:
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
\begin{aligned} C_\alpha(T) = C(T) + \alpha|T| \end{aligned}
Cα(T)=C(T)+α∣T∣
C
(
T
)
C(T)
C(T) 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,
∣
T
∣
|T|
∣T∣表示模型复杂度,参数
α
≥
0
\alpha \ge 0
α≥0,控制两者之间的影响。
α
\alpha
α 越大表示选择越简单的模型,
α
=
0
\alpha=0
α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
树的剪枝算法
输入:生成算法产生的整个树
T
T
T ,参数
α
\alpha
α
输出:修剪后的子树
T
α
T_\alpha
Tα
(1)计算每个结点的经验熵
(2)递归地从树的叶结点向上回缩
(3)设一组叶结点回缩到其父结点之前与之后的整体树分别为
T
B
T_B
TB与
T
A
T_A
TA,其对应的损失函数值分别是
C
a
(
T
B
)
Ca(T_B)
Ca(TB)与
C
a
(
T
A
)
Ca(T_A)
Ca(TA),如果:
C
a
(
T
A
)
≤
C
a
(
T
B
)
\begin{aligned} Ca(T_A) \le Ca(T_B) \end{aligned}
Ca(TA)≤Ca(TB)
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直到不能继续为止,得到损失函数最小的子树
T
α
T_\alpha
Tα
CART算法
CART算法由以下两步组成:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准
对回归树用平方误差最小化准则
对分类树用基尼指数最小化准则
回归树的生成
给定数据集
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
M
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
)
\begin{aligned} f(x)=\sum_{m=1}^Mc_mI(x\in R_m) \end{aligned}
f(x)=m=1∑McmI(x∈Rm)
当输入空间的划分确定时,可以用平方误差
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\large \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
)
\begin{aligned} \hat{c}_m = ave(y_i|x_i \in R_m) \end{aligned}
c^m=ave(yi∣xi∈Rm)
问题是怎样对输入空间进行划分,这里采用启发式的方法,选择第
j
j
j 个变量
x
(
j
)
x^{(j)}
x(j) 和它取的值
s
s
s ,作为切分变量和切分点,并定义两个区域:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
≤
s
}
和
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
≥
s
}
\begin{aligned} R_1(j,s)=\{x|x^{(j)} \le s\} 和 R_2(j,s)=\{x|x^{(j)} \ge s\} \end{aligned}
R1(j,s)={x∣x(j)≤s}和R2(j,s)={x∣x(j)≥s}
然后寻找最优切分变量
j
j
j 和最优切分点
s
s
s ,具体地,求解:
min
j
,
s
[
min
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
\begin{aligned} \mathop{\min}\limits_{j,s}\left[ \mathop{\min}\limits_{c_1} \sum_{x_i \in R_1(j,s)}(y_i - c_1)^2 + \mathop{\min}\limits_{c_2}\sum_{x_i \in R_2(j,s)}(y_i - c_2)^2 \right] \end{aligned}
j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
对固定输入变量
j
j
j 可以找到最优切分点
s
s
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
)
)
\begin{aligned} \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)) \end{aligned}
c^1=ave(yi∣xi∈R1(j,s))和c^2=ave(yi∣xi∈R2(j,s))
遍历所有输入变量,找到最优的切分变量
j
j
j ,构成一个对
(
j
,
s
)
(j,s)
(j,s) 。依此将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,知道满足条件为止。这也昂就生成一棵回归树。这样的回归树通常称为最小二乘回归树
最小二乘回归树生成算法:
输入:训练数据集D
输出:回归树fx
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量j与切分点s,求解:
min
j
,
s
[
min
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
\begin{aligned} \mathop{\min}\limits_{j,s}\left[ \mathop{\min}\limits_{c_1} \sum_{x_i \in R_1(j,s)}(y_i - c_1)^2 + \mathop{\min}\limits_{c_2}\sum_{x_i \in R_2(j,s)}(y_i - c_2)^2 \right] \end{aligned}
j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
遍历变量j,对固定的切分变量j扫描切分点s,选择使得上式达到最小值的js
(2)用选定的对js划分区域并决定相应的输出值:
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
\begin{aligned} & R_1(j,s)=\{x|x^{(j)} \le s\} 和 R_2(j,s)=\{x|x^{(j)} \ge s\} \\ & \hat{c}_m = \frac{1}{N_m} \sum_{x_i \in R_m(j,s)}y_i \\ & x \in R_m, m=1,2 & \end{aligned}
R1(j,s)={x∣x(j)≤s}和R2(j,s)={x∣x(j)≥s}c^m=Nm1xi∈Rm(j,s)∑yix∈Rm,m=1,2
(3)继续对两个子区域调用步骤(1)(2),直到满足停止条件
(4)将输入空间划分为
M
M
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
)
\begin{aligned} f(x)=\sum_{m=1}^Mc_mI(x\in R_m) \end{aligned}
f(x)=m=1∑McmI(x∈Rm)
分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点
基尼指数定义:
分类问题中,假设有
K
K
K 个类,样本点属于第
k
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
\begin{aligned} Gini(p)=\sum_{k=1}^Kp_k(1-p_k) = 1 - \sum_{k=1}^Kp_k^2 \end{aligned}
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,若样本点属于第1个类的概率是p,则概率分布的基尼指数为:
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
\begin{aligned} Gini(p)=2p(1-p) \end{aligned}
Gini(p)=2p(1−p)
对于给定的样本集合D,其基尼指数为:
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
\begin{aligned} Gini(D)= 1 - \sum_{k=1}^K(\frac{|C_k|}{|D|})^2 \end{aligned}
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
这里
C
k
C_k
Ck 是
D
D
D 中属于第
k
k
k 类的样本子集,
K
K
K 是类的个数
基尼指数 G i n i ( D ) Gini(D) Gini(D) 表示集合 D 的不确定性,跟熵类似
CART生成算法:
输入:训练数据集
D
D
D ,停止计算的条件;
输出:
C
A
R
T
CART
CART 决策树。
(1)设结点的训练数据集为
D
D
D ,计算现有特征对该数据集的基尼指数。此时,对每一个特征
A
A
A ,对其可能取的每个值
a
a
a ,根据样本点对
A
=
a
A=a
A=a 的测试为“是”或“否”将
D
D
D 分割成
D
1
D_1
D1和
D
2
D_2
D2 两部分,计算
A
=
a
A=a
A=a 时的基尼指数。
(2)在所有可能的特征
A
A
A 以及它们所有可能的切分点
a
a
a 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件。
(4)生成
C
A
R
T
CART
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
∣
\begin{aligned} C_\alpha(T) = C(T) + \alpha|T| \end{aligned}
Cα(T)=C(T)+α∣T∣
其中,
T
T
T 为任意子树,
C
(
T
)
C(T)
C(T) 为对训练数据的预测误差(如基尼指数),
∣
T
∣
|T|
∣T∣ 为子树的叶结点个数,
a
≥
0
a≥0
a≥0为参数,
C
a
(
T
)
C_a(T)
Ca(T)为参数是a时的子树T的整体损失。参数
a
a
a 权衡训练数据的拟合程度与模型的复杂度。
对固定的 a a a ,一定存在使损失函数 C a ( T ) C_a(T) Ca(T) 最小的子树,将其表示为 T a T_a Ta。 T a T_a Ta在损失函数 C a ( T ) C_a(T) Ca(T) 最小的意义下是最优的。容易验证这样的最优子树是唯一的。当 a a a 大的时候,最优子树 T a T_a Ta 偏小;当 a a a 小的时候,最优子树 T a T_a Ta 偏大。极端情况,当 a = 0 a=0 a=0 时,整体树是最优的。当 a → ∞ a \rightarrow \infty a→∞ 时,根结点组成的单结点树是最优的。
具体地,从整体树
T
0
T_0
T0 开始剪枝,对
T
0
T_0
T0 的任意内部节点
t
t
t,以
t
t
t 为单结点树的损失函数是:
C
α
(
t
)
=
C
(
t
)
+
α
\begin{aligned} C_\alpha(t) = C(t) + \alpha \end{aligned}
Cα(t)=C(t)+α
以t为根结点的子树
T
t
T_t
Tt 的损失函数是:
C
α
(
T
T
)
=
C
(
T
t
)
+
α
∣
T
t
∣
\begin{aligned} C_\alpha(T_T) = C(T_t) + \alpha|T_t| \end{aligned}
Cα(TT)=C(Tt)+α∣Tt∣
当
α
=
0
\alpha = 0
α=0以及充分小时,有不等式:
C
α
(
T
t
)
<
C
α
(
t
)
\begin{aligned} C_\alpha(T_t) < C_\alpha(t) \end{aligned}
Cα(Tt)<Cα(t)
当
α
\alpha
α增大时,在某一
α
\alpha
α有:
C
α
(
T
t
)
=
C
α
(
t
)
\begin{aligned} C_\alpha(T_t) = C_\alpha(t) \end{aligned}
Cα(Tt)=Cα(t)
当 α \alpha α再增大时,不等式反向,只要 α = C ( t ) − C ( T t ) ∣ T t ∣ − 1 \large \alpha = \frac{C(t)-C(T_t)}{|T_t|-1} α=∣Tt∣−1C(t)−C(Tt), T t T_t Tt与 t t t有相同的损失函数只,而 t t t 的节点少,因此 t t t 比 T t T_t Tt更可取,对 T t T_t Tt 进行剪枝
为此,对T0中每一内部结点t,计算
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\begin{aligned} g(t)= \frac{C(t)-C(T_t)}{|T_t|-1} \end{aligned}
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) 设为
a
1
a_1
a1 。
T
1
T_1
T1 为区间
[
a
1
,
a
2
)
[a1,a2)
[a1,a2)的最优子树。如此剪枝下去,直至得到根结点。在这一过程中,不断地增加
a
a
a 的值,产生新的区间。
在剪枝得到的子树序列 T 0 , T 1 , … , T n T_0,T_1,…,T_n T0,T1,…,Tn中通过交叉验证选取最优子树 T a T_a Ta
具体地,利用独立的验证数据集,测试子树序列 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都对应于一个参数 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an 。所以,当最优子树 T k T_k Tk 确定时,对应的 a k a_k ak也确定了,即得到最优决策树 T a T_a Ta。
CART剪枝算法
输入:CART算法生成的决策树
T
0
T_0
T0;
输出:最优决策树
T
a
T_a
Ta。
(1)设
k
=
0
,
T
=
T
0
k=0, T = T0
k=0,T=T0
(2)设
α
=
∞
\alpha = \infty
α=∞
(3)自下而上地对各内部结点t计算
C
(
T
t
)
,
∣
T
t
∣
C(T_t),|T_t|
C(Tt),∣Tt∣以及:
g
(
t
)
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
α
=
min
(
α
,
g
(
t
)
)
\begin{aligned} &g(t)= \frac{C(t)-C(T_t)}{|T_t|-1} \\ & \alpha = \mathop{\min}(\alpha,g(t)) \end{aligned}
g(t)=∣Tt∣−1C(t)−C(Tt)α=min(α,g(t))
这里,
T
t
T_t
Tt 表示以
t
t
t 为根结点的子树,
C
(
T
t
)
C(T_t)
C(Tt)是对训练数据的预测误差,
∣
T
t
∣
|T_t|
∣Tt∣ 是
T
t
T_t
Tt 的叶结点个数。
(4)自上而下地访问内部结点
t
t
t ,如果有
g
(
t
)
=
a
g(t)=a
g(t)=a ,进行剪枝,并对叶结点t以多数表决法决定其类,得到树
T
T
T。
(5)设
k
=
k
+
1
,
a
k
=
a
,
T
k
=
T
k=k+1,a_k=a,T_k=T
k=k+1,ak=a,Tk=T。
(6)如果
T
T
T 不是由根结点单独构成的树,则回到步骤(4)。
(7)采用交叉验证法在子树序列
T
0
,
T
1
,
…
,
T
n
T_0,T_1,…,T_n
T0,T1,…,Tn中选取最优子树
T
a
T_a
Ta 。