文章目录
该篇笔记主要思路借鉴《统计学习方法》
前言
决策树是一种基本的分类与回归方法,《统计学习方法》中主要讨论的是用于分类的决策树,《The Element of Statistical Learning》中对树结构方法的讨论较为全面,但是对应的门槛也较高。如果要全面掌握树结构方法,可在《统计学习方法》看完基本概念之后再去看ESL。
决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的修剪。虽然有点类似于特征工程,而特征工程现在已有神经网络等方法可以代为处理,但是决策树涉及的许多数学概念和优化思想是永不过时的。
决策树模型与学习
决策树模型
众所周知决策树模型是一种树形结构,其节点有两种类型:内部节点(包括根节点)和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。
算法希望达成的效果是,如果有一个训练得当的决策树,从根节点开始,对实例某一特征进行测试,然后根据测试结果将其分配到子节点,然后依据子节点对应的特征再对该实例进行测试,如此递归测试和分配,最后到达叶节点。这样实例就完成了分类,最终分到了叶节点所代表的类中。
这里要注意的是,每一个实例都被一条路径所覆盖,而且只被一条路径或一条规则所覆盖。这里的覆盖就是实例的特征满足路径是的特征要求。
决策树与条件概率分布
决策树还有一种理解视角,就是给定特征条件下类的条件概率分布。这一条件概率分布定义在特征空间的一个划分上,将特征空间划分为互不相交的单元或区域。决策树的内部节点就对应了每次划分时候的那条线,而决策树的叶节点就对应了划分完毕后的单元,具体如图所示:
这是一个二分类的情况,上图a代表特征空间的划分,上图b代表特征空间划分确定时给定条件下(固定范围内)的条件概率值。二分类问题中,当某个单元c的条件概率满足
P
(
Y
=
+
1
∣
X
=
c
)
>
0.5
P(Y=+1 | X=c)>0.5
P(Y=+1∣X=c)>0.5的时候,则认为这个单元属于正类,落在这个单元的实例都被视为正例。
决策树学习
假设给定训练数据集:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
D=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}
D={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,
x
i
=
(
x
i
(
1
)
,
x
i
(
2
)
,
⋯
,
x
i
(
n
)
)
T
x_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}}
xi=(xi(1),xi(2),⋯,xi(n))T为输入实例(每一维上就是一个特征,也叫特征向量),n为特征个数,y有K种取值,i有N个,N就是数据集样本个数。决策树学习目标是根据给定训练集构建决策树模型,使其能正确分类训练样本。
如何寻找这样的决策树模型,需要的是一个与训练数据矛盾较小(偏差低)的决策树,同时也有很好的泛化能力(方差也低)。由此就想到找到一个函数来综合考虑这两者,这样的函数就叫损失函数。决策树学习的损失函数一般是正则化的极大似然函数。学习策略是以损失函数为目标函数的最小化。
损失函数确定之后,学习问题就变成在损失函数意义下现在最优决策树的问题(决出所有里面最优的一个是NP完全问题),可通过启发式方法近似求解。
决策树的学习包含特征选择,决策树生成与决策树的剪枝过程。
- 特征选择:如果特征很多,可以在学习开始时对特征进行选择,只留下对训练数据有足够分类能力的特征。
- 决策树生成:递归地选择最优特征对训练数据进行分割,最优特征选择标准后文具体讲述。递归到什么时候终止?这个终止条件抽象的说就是所有训练数据子集被基本正确分类。
- 决策树剪枝:依托训练数据生成的决策树为了防止过拟合,需要对已生成的树自下而上进行剪枝,让树变得简单从而有更好的泛化能力。
接下来将逐个讨论决策树学习的各个步骤。
特征选择
如果利用一个特征进行分类的结果与随机分类的结果没啥区别,那么这个特征没有分类能力,扔掉也无所谓。
上面说了不好的特征,那么好特征是什么样的呢?如果一个特征具有更好的分类能力,或者说,按这个特征将数据分割成子集,让各个子集在当前条件下有最好的分类,那就更应该选这个特征。通常特征选择的准则是信息增益或者信息增益比。
信息增益
如果随机变量X取值为
x
i
x_i
xi的概率为
p
i
p_i
pi,那么随机变量X的熵则定义为:
H
(
p
)
=
−
∑
i
=
1
n
p
i
log
p
i
H(p)=-\sum_{i=1}^{n} p_{i} \log p_{i}
H(p)=−i=1∑npilogpi
这也叫做信息熵,可见信息熵与X的取值无关,只和X的分布有关。熵越大,随机变量的不确定性就越大。从定义可验证
0
⩽
H
(
p
)
⩽
log
n
0 \leqslant H(p) \leqslant \log n
0⩽H(p)⩽logn
而条件熵表示在已知随机变量X的条件下随机变量Y的不确定性。定义为条件分布的熵对X的数学期望:
H
(
Y
∣
X
)
=
∑
i
=
1
n
p
i
H
(
Y
∣
X
=
x
i
)
H(Y | X)=\sum_{i=1}^{n} p_{i} H\left(Y | X=x_{i}\right)
H(Y∣X)=i=1∑npiH(Y∣X=xi)
这里
p
i
=
P
(
X
=
x
i
)
p_i=P(X=x_i)
pi=P(X=xi)。
当熵和条件熵中的概率是由数据估计(特别是极大似然估计)得到时,所对应的熵和条件熵就称为经验熵和经验条件熵。如果有0概率,那么令
0
l
o
g
0
=
0
0log0=0
0log0=0。
已知上面所有的基本概念,信息增益的定义就可以理解了。信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。统计学习方法中对其定义如下:
一般上面式子的结果(熵和条件熵之差)也称为互信息,决策树学习里面的信息增益就等价于训练数据集中类与特征的互信息(这句话只是插播一下互信息概念)。
上式中,经验熵H(D)表示对数据集D进行分类的不确定性。经验条件熵H(D|A)表示特征A已经得知确定之后,对数据集D进行分类的不确定性。他们的差就是信息增益,反映了A的作用,即其使得不确定性减少的程度。自然,信息增益大的特征具有更强的分类能力。那么就根据这样的准则选择特征,计算每个特征的信息增益,然后选信息增益最大的特征。算法归纳如下,其中
C
k
C_k
Ck表示属于类k的样本个数,
D
i
D_i
Di表示根据特征A的取值对数据集进行划分后的子集中的第i个子集(A有多少取值数据集就有多少子集),
D
i
k
D_{ik}
Dik表示第i个子集中属于类k的样本的集合:
计算数据集D的经验熵
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
log
2
∣
C
k
∣
∣
D
∣
H(D)=-\sum_{k=1}^{K} \frac{\left|C_{k}\right|}{|D|} \log _{2} \frac{\left|C_{k}\right|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
计算特征A对数据集D的经验条件熵(求出特征取某个值下的子集的熵之和,再对特征所有可能的取值求个期望,即得到条件熵)
H
(
D
∣
A
)
=
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
∑
k
=
1
K
∣
D
i
k
∣
∣
D
i
∣
log
2
∣
D
i
k
∣
∣
D
i
∣
H(D | A)=\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} H\left(D_{i}\right)=-\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} \sum_{k=1}^{K} \frac{\left|D_{i k}\right|}{\left|D_{i}\right|} \log _{2} \frac{\left|D_{i k}\right|}{\left|D_{i}\right|}
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
计算信息增益
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D, A)=H(D)-H(D | A)
g(D,A)=H(D)−H(D∣A)
Attention:特征的取值仅仅是对数据集的一种划分方式,该划分方式下的每个单元的熵的期望就是条件熵
信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。为什么呢?试想一个极端情况,如果数据集大小为N,有这么一个特征,有N个取值,刚好一个取值对应一个样本,这样每个取值情况下的熵就是0,该特征给定时的条件熵就是0,信息增益就取到了最大值。
但是这样的特征很容易过拟合。使用信息增益比可以对这一问题进行修正。在原本信息增益的基础上除以特征A本身的混乱程度,如果根据特征取值分的类别很多,混乱程度就会越大。这是特征选择的另一准则,《统计学习方法》中对其定义如下:
决策树的生成
ID3算法用信息增益作为特征选择的依据
C4.5用信息增益比作为特征选择的依据。
决策树的剪枝
所有过拟合的算法都有一个共性,就是学习时过多考虑如何提高对训练数据的正确分类,通过提升算法的复杂度来更好的分类训练数据,但是算法复杂度越高,其泛化能力就差了。决策树生成算法也是一样,递归产生决策树直到不能继续为止,这样的树往往过于复杂,为防止过拟合,就需要对其进行简化。
将已生成的树进行简化的过程就称为剪枝。顾名思义,就是从已生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树T的叶节点个数为|T|,t是树T的叶节点,该叶节点上有
N
t
N_t
Nt个样本点,其中属于k类的样本点有
N
t
k
N_{tk}
Ntk个,
H
t
(
T
)
H_t(T)
Ht(T)为叶节点t上的经验熵,那么决策树学习的损失函数可定义为:
C
α
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)+\alpha|T|
Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中经验熵为
H
t
(
T
)
=
−
∑
k
N
t
k
N
t
log
N
t
k
N
t
H_{t}(T)=-\sum_{k} \frac{N_{t k}}{N_{t}} \log \frac{N_{t k}}{N_{t}}
Ht(T)=−k∑NtNtklogNtNtk
所以,损失函数等式右边第一项又可以写为
C
(
T
)
=
∑
t
=
1
∣
T
∣
N
t
H
t
(
T
)
=
−
∑
t
=
1
∣
T
∣
∑
k
=
1
K
N
t
k
log
N
t
k
N
t
C(T)=\sum_{t=1}^{|T|} N_{t} H_{t}(T)=-\sum_{t=1}^{|T|} \sum_{k=1}^{K} N_{t k} \log \frac{N_{t k}}{N_{t}}
C(T)=t=1∑∣T∣NtHt(T)=−t=1∑∣T∣k=1∑KNtklogNtNtk
由此,有
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
其实决策树学习的损失函数本质上就是统计了各个叶节点上样本的混乱程度,然后为控制叶节点个数又加上了正则项进行约束。C(T)表示模型对训练数据的预测误差,|T|表示模型复杂度,参数
α
⩾
0
\alpha \geqslant 0
α⩾0控制两者之间的影响,较大的
α
\alpha
α促使选择较简单的模型,较小的
α
\alpha
α促使选择较复杂的模型,
α
=
0
\alpha = 0
α=0意味着不考虑模型复杂度了,只考虑拟合程度。
那么剪枝就是当
α
\alpha
α确定时,选择损失函数最小的模型。而上式中损失函数最小化其实等价于正则化的极大似然估计。如果一组叶节点回缩到其父节点之前的损失函数值大于之后的损失函数值,那对这组叶节点进行剪枝。
CART算法
分类与回归树(classification and regression tree)模型是应用广泛的决策树学习方法。CART同样由特征选择、树的生成以及树的剪枝组成。它既可以用于分类也可以用于回归,本质上是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习算法。
CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支为“是”,右分支为“否”。这样的决策树就等价于递归地二分每个特征,将输入空间划分为有限个单元,并在这些单元上确定预测的概率分布,就是给定输入下输出的条件概率分布。
CART生成
CART的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择。
生成回归树
给定训练数据集如下:
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
N
,
y
N
)
}
D=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}
D={(x1,y1),(x2,y2),⋯,(xN,yN)}
一颗回归树对应着输入空间(特征空间)的一个划分,以及在划分的单元上的输出值。先明确输出值,如果每个单元
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}^{M} c_{m} I\left(x \in R_{m}\right)
f(x)=m=1∑McmI(x∈Rm)
表达式中I的意思是当x属于
R
m
R_m
Rm时取值1,其他取值0。所以其实属于某个具体类的时候模型的输出就是固定值
c
m
c_m
cm。当输入空间划分确定时,即可用平方误差
∑
x
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\sum_{x_{i} \in R_{m}}\left(y_{i}-f\left(x_{i}\right)\right)^{2}
xi∈Rm∑(yi−f(xi))2
来表示回归树对训练数据的预测误差。然后使其最小化,解得每个单元上的最优输出值(个人认为最优预测值更妥当,理解为预测算法应该给出的值是均值,应该把均值当标签)。易知,这个最优输出值是
R
m
R_m
Rm上的所有输入实例
x
i
x_i
xi对应的输出
y
i
y_i
yi的均值(为什么是均值请参考个人的这篇笔记):
c
^
m
=
ave
(
y
i
∣
x
i
∈
R
m
)
\hat{c}_{m}=\operatorname{ave}\left(y_{i} | x_{i} \in R_{m}\right)
c^m=ave(yi∣xi∈Rm)
所以输入空间划分确定时,后面计算最优值也确定了。于是明确好,整个算法中唯一的变量,就是对输入空间的划分方式,划分方式决定了最后的平方误差的大小。那么如何对输入空间进行划分呢?这里采用启发式的方法,选择第j个变量(特征)
x
(
j
)
x^{(j)}
x(j)和它的取值s,作为切分变量和切分点,定义两个区域:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
⩽
s
}
and
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_{1}(j, s)=\left\{x | x^{(j)} \leqslant s\right\} \quad \text { and } \quad R_{2}(j, s)=\left\{x | x^{(j)}>s\right\}
R1(j,s)={x∣x(j)⩽s} and R2(j,s)={x∣x(j)>s}
然后寻找最优切分变量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
]
\min _{j, s}\left[\min _{c_{1}} \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}\right]
j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2⎦⎤
对于固定输入变量j可以找到最优切分点s,从而得到:
c
^
1
=
ave
(
y
i
∣
x
i
∈
R
1
(
j
,
s
)
)
and
c
^
2
=
ave
(
y
i
∣
x
i
∈
R
2
(
j
,
s
)
)
\hat{c}_{1}=\operatorname{ave}\left(y_{i} | x_{i} \in R_{1}(j, s)\right) \quad \text { and } \quad \hat{c}_{2}=\operatorname{ave}\left(y_{i} | x_{i} \in R_{2}(j, s)\right)
c^1=ave(yi∣xi∈R1(j,s)) and c^2=ave(yi∣xi∈R2(j,s))
遍历所有输入变量,找到最优切分的变量j。用j变量的s取值进行划分,这样就完成了对输入空间第一次划分两个区域的过程,也是第一次的最优划分。接着对每个区域重复上面的划分过程,直到满足停止条件为止。这样就生成了一棵回归树,这样的回归树通常称为最小二乘回归树。
总结
回归树的特征选择的评价指标是各单元内样本输出值的均值和各样本输出值的真实值之间的平方误差。个人理解这个平方误差其实就是方差,因为如果模型划分确定,所有该单元内的样本输出值就不会改变了,都是均值。那误差其实就是各样本输出值和输出均值之间的差异,也就是方差了。
生成分类树
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼指数
分类问题中,假设有K个类,样本点属于第k类的概率为
p
k
p_k
pk,则概率分布的基尼指数定义为
Gini
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
\operatorname{Gini}(p)=\sum_{k=1}^{K} p_{k}\left(1-p_{k}\right)=1-\sum_{k=1}^{K} p_{k}^{2}
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,如果样本点属于第一个类的概率为p,则概率分布的基尼指数为
Gini
(
p
)
=
2
p
(
1
−
p
)
\operatorname{Gini}(p)=2p(1-p)
Gini(p)=2p(1−p)
对于给定的样本集合D,其基尼指数为
Gini
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
\operatorname{Gini}(D)=1-\sum_{k=1}^{K}\left(\frac{\left|C_{k}\right|}{|D|}\right)^{2}
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
这里
C
k
C_k
Ck是D中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值a被分割成D1和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的基尼指数定义为
Gini
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
Gini
(
D
1
)
+
∣
D
2
∣
∣
D
∣
Gini
(
D
2
)
\operatorname{Gini}(D, A)=\frac{\left|D_{1}\right|}{|D|} \operatorname{Gini}\left(D_{1}\right)+\frac{\left|D_{2}\right|}{|D|} \operatorname{Gini}\left(D_{2}\right)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
基尼指数
G
i
n
i
(
D
)
Gini(D)
Gini(D)表示了集合D的不确定性,基尼指数
G
i
n
i
(
D
,
A
)
Gini(D, A)
Gini(D,A)表示经特征A=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也越大,这和熵相似。几个评价指标之间的关系如下图所示:
上图的纵坐标表示损失。
生成算法
确定了评价指标为基尼指数之后,生成算法的过程就和前文所述的过程大同小异了。
根据训练数据集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树:
- 计算现有特征对训练数据集D的基尼指数。这里计算复杂度较高,需要将每一个特征A可能取到的每个值a纳入考量,将其作为划分线将数据集一分为二,计算此时的基尼指数和。
- 对比其他A=a的情况得到最合适的那个A=a,也就是得到最优特征和最优切分点。再依据这两者生成两个子节点,将训练数据集依据特征分配到两个子节点中去。
- 对两个子节点递归调用上面两个步骤,直至满足停止条件
- 最后生成CART决策树
算法停止计算的条件是节点中的样本个数小于预定阈值,或样本集基尼指数小于预定阈值(就是样本被划分到各个单元里面基本都属于同一类了),或没有更多特征。
CART剪枝
整个CART剪枝算法的过程由两步组成:
- 首先从生成算法产生的决策树的底端开始不断剪枝,直到这棵树的根节点,在不断剪枝的过程中形成一个子树的序列 { T 0 , T 1 , … , T n } \{T_0,T_1,\dots, T_n\} {T0,T1,…,Tn}。
- 然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从而选出最优的那个子树。
剪枝过程中,产生的各个子树的损失函数为
C
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
C_{\alpha}(T)=C(T)+\alpha|T|
Cα(T)=C(T)+α∣T∣
这个公式前文就有详细说明了,在此不再赘述。考虑当
α
=
0
\alpha=0
α=0时,整体树是最优的。当
α
→
∞
\alpha \rightarrow \infty
α→∞时,根节点组成的单节点树是最优的。
这里就引出了一个思想,也得到了Breiman等人的证明:可以用递归的方法对树进行剪枝。将
α
\alpha
α通过如下方式从小增大:
0
=
α
0
<
α
1
<
⋯
<
α
n
<
+
∞
0=\alpha_0<\alpha_{1}<\cdots<\alpha_{n}<+\infty
0=α0<α1<⋯<αn<+∞
产生一系列的区间
[
α
i
,
α
i
+
1
)
[\alpha_i, \alpha_{i+1})
[αi,αi+1),剪枝得到的子树就对应着这一个个的区间,共n个区间。n的最优子树序列
{
T
0
,
T
1
,
…
,
T
n
}
\{T_0,T_1,\dots, T_n\}
{T0,T1,…,Tn},序列中的子树是嵌套的。
从整体树
T
0
T_0
T0开始剪枝。对其任意内部节点t,以t为单节点树的损失函数是
C
α
(
t
)
=
C
(
t
)
+
α
C_{\alpha}(t)=C(t)+\alpha
Cα(t)=C(t)+α
以t为根节点的子树
T
t
T_t
Tt的损失函数是
C
α
(
T
t
)
=
C
(
T
t
)
+
α
∣
T
t
∣
C_{\alpha}\left(T_{t}\right)=C\left(T_{t}\right)+\alpha\left|T_{t}\right|
Cα(Tt)=C(Tt)+α∣Tt∣
当
α
=
0
\alpha=0
α=0或者
α
\alpha
α充分小的时候,有不等式
C
α
(
T
t
)
<
C
α
(
t
)
C_\alpha(T_t)<C_\alpha(t)
Cα(Tt)<Cα(t)
当
α
\alpha
α增大时,存在某一
α
\alpha
α,使得
C
α
(
T
t
)
=
C
α
(
t
)
C_\alpha(T_t)=C_\alpha(t)
Cα(Tt)=Cα(t)
当
α
\alpha
α再增大时,不等式反向。注意上面的等式,把等式两端的损失函数代入可求解得到
α
\alpha
α:
α
=
C
(
t
)
−
C
(
T
t
)
∣
T
t
∣
−
1
\alpha = \frac{C(t)-C(T_t)}{|T_t|-1}
α=∣Tt∣−1C(t)−C(Tt)
这里以t为根节点的子树和以t为单节点的树有相同的损失函数值,后者节点少,所以后者更可取,对前者进行剪枝。
为此,对
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)最小的子树
T
t
T_t
Tt,将得到的子树作为
T
1
T_1
T1,同时将最小的g(t)设为
α
1
\alpha_1
α1。
T
1
T_1
T1为区间
[
α
1
,
α
2
)
[\alpha_1, \alpha_2)
[α1,α2)的最优子树。
如此剪枝下去,直到得到根节点。在这一过程中,不断增加 α \alpha α的值,产生新的区间。
总结下来就是,原本以这个节点为根节点的子树挺好的,结果
α
\alpha
α加着加着,变得这个节点是单节点的情况和它一样好了,那就要用单节点替代原来的子树了,这样就剪枝了。对每个内部节点,其
α
\alpha
α临界值都不一样(就是g(t)),那么
α
\alpha
α取值落在哪个区间中,在这个区间中就有一个对应的最优的子树。那我们就在计算每个可能的子树的过程中,就顺便计算得到了当前子树是对应哪个
α
\alpha
α区间上的最优子树。而全局来看,通过交叉验证法得到的最优子树只有一个,那其对应的
α
\alpha
α值也只有一个,那就确定了树和参数
α
\alpha
α。《统计学习方法》中对CART剪枝算法的描述入下: