基于树的方法
主要介绍基于树的回归和分类方法,这些方法主要根据分层(stratifying)、分割(segmenting) 的方式将预测变量空间划分成一系列简单区域。由于划分预测变量空间的分裂规则可以被概括为一棵树,所以这类方法被称为决策树方法。
基于树的方法简便而便于解释,但预测精度通常低于指导的学习方法。
将大量的树集成后会极大地提升预测准确性,虽然与此同时会损失一些解释性。
决策树基本原理
回归树
每个树叶上的数字表示落在这个树叶处观测值的平均响应值。
树将数据分层或分割为了三个预测变量空间: R 1 = { X ∣ Y e a r s < 4.5 } , R 2 = { X ∣ Y e a r s ≥ 4.5 , H i t < 117.5 } , R 3 = { X ∣ Y e a r s ≥ 4.5 , H i t ≥ 117.5 } R_1=\{X|Years<4.5\},R_2=\{X|Years\geq4.5,Hit<117.5\},R_3=\{X|Years\geq4.5,Hit\geq117.5\} R1={X∣Years<4.5},R2={X∣Years≥4.5,Hit<117.5},R3={X∣Years≥4.5,Hit≥117.5}
区域 R 1 , R 2 , R 3 R_1,R_2,R_3 R1,R2,R3 称为树的终端结点(terminal nodes)或树叶。决策树通常是从上到下绘制的,树叶位于树的底部。沿树将预测变量空间分开的点称为内部结点。树内部各个结点的连接部分称为分支(branch)。
回归树是对变量之间真实关系的一种过度简化,但相对于其他形式的回归模型,它的优势在于解释起来更简便,且能很好地用图形来表示。
建立回归树的过程
- 将预测变量空间(即 X 1 , X 2 , ⋯ , X p X_1,X_2,\cdots,X_p X1,X2,⋯,Xp 的可能取值构成的集合)分割成 J J J 个互不重叠的区域 R 1 , R 2 , ⋯ , R J R_1,R_2,\cdots,R_J R1,R2,⋯,RJ。
- 对落入区域 R j R_j Rj 的每个观测值作同样的预测,预测值等于 R j R_j Rj 上训练集的响应值的简单算数平均。
举例:若在第一步得到两个区域 R 1 , R 2 R_1,R_2 R1,R2, R 1 R_1 R1 上训练集的平均响应值为10, R 2 R_2 R2 上训练集的平均响应值为20。那么,给定观测值 X = x X=x X=x,若 x ∈ R 1 x\in R_1 x∈R1,给出的预测值为10,若 x ∈ R 2 x\in R_2 x∈R2,给出的预测值为20。
理论上,区域形状是任意的,但出于模型简化和增强可解释性的考虑,这里将预测变量空间划分成高维矩形,或称盒子(boxes)。划分区域的目标是找到使模型的残差平方和RSS最小的矩形区域
R
1
,
R
2
,
⋯
,
R
J
R_1,R_2,\cdots,R_J
R1,R2,⋯,RJ。RSS的定义为:
R
S
S
=
∑
j
=
1
J
∑
i
∈
R
j
(
y
i
−
y
^
R
j
)
2
RSS=\sum_{j=1}^J\sum_{i\in R_j}(y_i-\hat y_{R_j})^2
RSS=j=1∑Ji∈Rj∑(yi−y^Rj)2
其中
y
^
R
j
\hat y_{R_j}
y^Rj 是第
j
j
j 个矩形区域中训练集的平均响应值。
一般采用一种自上而下(top-down)、贪婪(greedy)方法:递归二叉分裂( recursive binary splitting)。“自上而下”指的是它从树顶端开始依次分裂预测变量空间,每个分裂点都产生两个新的分支。“贪婪”意指在建立树的每一步中,最优分裂确定仅限于某一步进程,而不是针对全局去选择那些能够在未来进程中构建更好的树的分裂点。
执行递归二叉分裂时,先选择预测变量
X
j
X_j
Xj 和分割点
s
s
s,将预测变量空间分为两个区域
{
X
∣
X
j
<
s
}
,
{
X
∣
X
j
≥
s
}
\{X|X_j<s\},\{X|X_j\geq s\}
{X∣Xj<s},{X∣Xj≥s},使RSS尽可能地减小。即,对
j
j
j 和
s
s
s,定义一对半平面:
R
1
(
j
,
s
)
=
{
X
∣
X
j
<
s
}
,
R
2
(
j
,
s
)
=
{
X
∣
X
j
≥
s
}
R_1(j,s)=\{X|X_j<s\},R_2(j,s)=\{X|X_j\geq s\}
R1(j,s)={X∣Xj<s},R2(j,s)={X∣Xj≥s}
寻找
j
j
j 和
s
s
s,使下式取得最小值:
∑
i
:
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
y
^
R
1
)
2
+
∑
i
:
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
y
^
R
2
)
2
\sum_{i:x_i\in R_1(j,s)}(y_i-\hat y_{R_1})^2+\sum_{i:x_i\in R_2(j,s)}(y_i-\hat y_{R_2})^2
i:xi∈R1(j,s)∑(yi−y^R1)2+i:xi∈R2(j,s)∑(yi−y^R2)2
y
^
R
1
\hat y_{R_1}
y^R1 是
R
1
(
j
,
s
)
R_1(j,s)
R1(j,s) 中训练集的平均响应值,
y
^
R
2
\hat y_{R_2}
y^R2 是
R
2
(
j
,
s
)
R_2(j,s)
R2(j,s) 中训练集的平均响应值。
重复上述步骤,寻找继续分割数据集的最优预测变量和最优分割点,使随之产生的区域中的RSS达到最小。此时被分割的不再是整个预测变量空间,而是之前确定的两个区域之一,如此一来得到3个区域。接着进一步分割3个区域之一以最小化RSS······这一过程不断持续,直到符合某个停止准则:例如,当所有区域包含的观测值个数都不大于5时,分裂停止。
区域 R 1 , R 2 , ⋯ , R J R_1,R_2,\cdots,R_J R1,R2,⋯,RJ 产生后,就可以确定某一给定测试数据所属的区域,并用这一区域的训练集平均响应值对其进行预测。
树的剪枝
有些时候运用上述方法会造成数据的过拟合,导致在测试集上效果不佳。
一棵分裂点更少、规模更小(区域 R 1 , R 2 , ⋯ , R J R_1,R_2,\cdots,R_J R1,R2,⋯,RJ 的个数更少)的树会有更小的方差和更好的可解释性(以增加微小偏差为代价)。
一种可能的解决方法是:仅当分裂使RSS减小量超过某阈值时,才分裂树结点。这种策略能生成较小的树,但可能产生过于短视的问题,一些起初看起来不值得的分裂却可能之后产生非常好的分裂——也就是说在下一步中,RSS大幅减小。
更好的策略是生成一棵很大的树 T 0 T_0 T0,然后通过剪枝(prune) 得到子树(subtree)。
代价复杂性剪枝(Cost complexity pruning)——也称最弱联系剪枝(weakest link pruning) 可以完成这一任务。考虑以非负调整参数
α
\alpha
α 标记的一系列子树,每一个
α
\alpha
α 的取值对应一棵子树
T
⊂
T
0
T\subset T_0
T⊂T0。当
α
\alpha
α 一定时,其对应的子树使下式最小:
∑
m
=
1
∣
T
∣
∑
i
:
x
i
∈
R
m
(
y
i
−
y
^
R
m
)
2
+
α
∣
T
∣
\sum_{m=1}^{|T|}\sum_{i:x_i\in R_m}(y_i-\hat y_{R_m})^2+\alpha|T|
m=1∑∣T∣i:xi∈Rm∑(yi−y^Rm)2+α∣T∣
这里
∣
T
∣
|T|
∣T∣ 表示树
T
T
T 的终端结点数,
R
m
R_m
Rm 是第
m
m
m 个终端结点对应的矩形,
y
^
R
m
\hat y_{R_m}
y^Rm 是与
R
m
R_m
Rm 对应的预测值——也就是
R
m
R_m
Rm 中训练集的平均值。调整系数
α
\alpha
α 在子树的复杂性和与训练数据的契合度之间控制权衡。当
α
=
0
\alpha=0
α=0 时,子树
T
T
T 等于原树
T
0
T_0
T0。当
α
\alpha
α 增大时,终端结点数多的树将为它的复杂付出代价,所得的子树将会变得更小。
可用交叉验证或验证集确定 α \alpha α,然后在整个数据集中找到与之对应的子树。
建立回归树:
利用递归二叉分裂在训练集中生成一棵大树,只有当终端结点包含的观测值个数低于某个最小值时才停止。
对大树进行代价复杂性剪枝,得到一系列最优子树,子树是 α \alpha α 的函数。
利用 K K K 折交叉验证选择 α \alpha α。具体做法是将训练集分为 K K K 折。对所有的 k = 1 , ⋯ , K k=1,\cdots,K k=1,⋯,K,有:
- 对训练集上所有不属于第 k k k 折的数据重读步骤1、2,得到与 α \alpha α 一一对应的子树。
- 求出上述子树在第 k k k 折上的均方预测误差。
上述操作结束后,每个 α \alpha α 会有相应的 K K K 个均方测试误差,对这 K K K 个值求平均,选出使平均误差最小的 α \alpha α。
找出选定的 α \alpha α 值在步骤2中对应的子树即可。
分类树
分类树被用于预测定性变量而非定量变量。对于分类树来说,给定观测值被预测为它所属区域内的训练集中最常出现的类(most commonly occurring class)。
分类树同样采用递归二叉分裂,但在分类树中,RSS无法作为确定二叉分裂点的准则。一个很自然的替代指标是分类错误率(classification error rate)。分类错误率的定义:此区域的训练集中非最常见类所占的比例:
E
=
1
−
max
k
(
p
^
m
k
)
E=1-\max_k(\hat p_{mk})
E=1−kmax(p^mk)
p
^
m
k
\hat p_{mk}
p^mk 代表第
m
m
m 个区域训练集中第
k
k
k 类所占比例。
基尼系数(Gini index):
G
=
∑
k
=
1
K
p
^
m
k
(
1
−
p
^
m
k
)
G=\sum_{k=1}^K\hat p_{mk}(1-\hat p_{mk})
G=k=1∑Kp^mk(1−p^mk)
它衡量的是
K
K
K 个类别的总方差。如果所有
p
^
m
k
\hat p_{mk}
p^mk 的取值都接近0或1,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标——如果它较小,就意味着某个结点包含的观测值几乎都来自同一类别。
互熵(cross-entropy):
D
=
−
∑
k
=
1
K
p
^
m
k
log
p
^
m
k
D=-\sum_{k=1}^K\hat p_{mk}\log\hat p_{mk}
D=−k=1∑Kp^mklogp^mk
由
0
≤
p
^
m
k
≤
1
0\leq\hat p_{mk}\leq1
0≤p^mk≤1,可知
0
≤
−
p
^
m
k
log
p
^
m
k
0\leq-\hat p_{mk}\log\hat p_{mk}
0≤−p^mklogp^mk。事实上,基尼系数和互熵在数值上是相当接近的。
树与线性模型的比较
如果预测变量和响应变量间的关系能很好地用线性模型拟合,那么线性回归通常有不错的预测效果,拟合效果将优于不能揭示这种线性结构的回归树。反之,若预测变量和响应变量的关系呈现出复杂的高度非线性,那么树方法比传统方法略胜一筹。
可以通过交叉验证或验证集估计树方法和传统方法的测试误差。
树的优缺点
优点:
- 决策树解释性强,在解释性方面甚至比线性回归更方便。
- 决策树更接近人的决策模式。
- 树可以用图形表示,非专业人士也可轻松解释。
- 树可以直接处理定性的预测变量而不需创建哑变量。
缺点:树的预测准确性一般无法达到其他回归和分类方法的水平。
装袋法、随机森林和提升法
装袋法
装袋法可以减小统计学习方法的方差。
给定 n n n 个独立观测值 Z 1 , ⋯ , Z n Z_1,\cdots,Z_n Z1,⋯,Zn,每个观测值的方差都是 σ 2 \sigma^2 σ2,它们的平均值 Z ˉ \bar Z Zˉ 的方差为 σ 2 / n \sigma^2/n σ2/n。对一组观测值求平均可以减小方差。
方法:从总体中抽取多个训练集,对每个训练集分别建立预测模型,再对由此得到的多个预测值求平均。可用
B
B
B 个独立的训练集计算出
f
^
1
(
x
)
,
f
^
2
(
x
)
,
⋯
,
f
^
B
(
x
)
\hat f^1(x),\hat f^2(x),\cdots,\hat f^B(x)
f^1(x),f^2(x),⋯,f^B(x),对它们求平均,可以得到如下低方差统计学习模型:
f
^
a
v
g
(
x
)
=
1
B
∑
b
=
1
B
f
^
b
(
x
)
\hat f_{avg}(x)=\frac{1}{B}\sum_{b=1}^B\hat f^b(x)
f^avg(x)=B1b=1∑Bf^b(x)
一般情况下难以取得多个训练集,我们使用自助法替代:从某个单一的训练集中重复抽样,生成
B
B
B 个不同的自助抽样训练集,接着用第
b
b
b 个自助抽样训练集拟合模型并求得预测值
f
^
∗
b
(
x
)
\hat f^{*b}(x)
f^∗b(x),最后对所有预测值求平均得:
f
^
b
a
g
(
x
)
=
1
B
∑
b
=
1
B
f
^
∗
b
(
x
)
\hat f_{bag}(x)=\frac{1}{B}\sum_{b=1}^B\hat f^{*b}(x)
f^bag(x)=B1b=1∑Bf^∗b(x)
对回归树:只需用
B
B
B 个自助抽样训练集建立起
B
B
B 棵回归树,再计算相应预测值的平均即可。
对分类树:对于给定的测试值,记录 B B B 棵树各自给出的预测类别,然后采用多数投票(majority vote):将 B B B 个预测中出现频率最高的类作为总体预测。
袋外误差估计
可以证明,平均每棵树能利用约三分之二的观测值。对一棵特定的树来说,剩余三分之一没有使用的观测值被称为此树的袋外(out-of-bag,OOB) 观测值。可以用所有将第 i i i 个观测值作为OOB的树来预测第 i i i 个观测值的响应值。这样便会生成约 B / 3 B/3 B/3 个对第 i i i 个观测值的预测。我们可以对这些预测响应值求平均或执行多数投票,以得到第 i i i 个观测值的一个OOB预测。用这种方法可以求出每个观测值的OOB预测,根据这些就可以计算总体的OOB均方误差或分类误差。由此得到的OOB误差是对装袋法模型测试误差的有效估计。
变量重要性的度量
在装袋回归树建模过程中,可以记录下任一给定预测变量引发的分裂而减小的RSS的总量,对每个减小总量在所有 B B B 棵树上取平均,结果值越大则说明预测变量越重要。
在装袋分类树建模过程中,可以对某一给定预测变量在一棵树上因分裂而使基尼系数的减少量加总,再取所有 B B B 棵树的平均。
随机森林
随机森林通过对树作去相关处理,实现了对装袋法树的改进。在随机森林中需对自主抽样训练集建立一系列决策树,不过在建立这些决策树时,每考虑树上的一个分裂点,都要从全部的 p p p 个预测变量中选出一个包含 m m m 个预测变量的随机样本作为候选变量,这个分裂点所用的预测变量只能从这 m m m 个变量中选择。在每个分裂点处都重新进行抽样,选出 m m m 个预测变量,通常 m ≈ p m\approx\sqrt{p} m≈p。也就是,每个分裂点所考虑的预测变量的个数约等于预测变量总数的平方根。
随机森林强迫每个分裂点仅考虑预测变量的一个子集。相当于对树去相关,这样得到的树的平均值有更小的方差,因而树的可信度也更高。
当许多预测变量相关时,取较小的 m m m 值建立随机森林通常很有效。
提升法
提升法采用与装袋法相似的方式,只是这里的树都是顺序(sequentially) 生成的:每棵树的构建都需要用到之间生成的树中的信息。
提升算法:
-
对训练集中的所有的 i i i,令 f ^ ( x ) = 0 , r i , y i \hat f(x)=0,r_i,y_i f^(x)=0,ri,yi。
-
对 b = 1 , 2 , ⋯ , B b=1,2,\cdots,B b=1,2,⋯,B 重复以下过程:
-
对训练数据 ( X , r ) (X,r) (X,r) 建立一棵有 d d d 个分裂点( d + 1 d+1 d+1 个终端结点)的树 f ^ b \hat f^b f^b。
-
将压缩后的新树加入模型以更新 f ^ \hat f f^:
f ^ ( x ) ← f ^ ( x ) + λ f ^ b ( x ) \hat f(x)\leftarrow\hat f(x)+\lambda\hat f^b(x) f^(x)←f^(x)+λf^b(x) -
更新残差:
r i ← r i − λ f ^ b ( x i ) r_i\leftarrow r_i-\lambda\hat f^b(x_i) ri←ri−λf^b(xi)
-
-
输出经过提升的模型:
f ^ ( x ) = ∑ b = 1 B λ f ^ b ( x ) \hat f(x)=\sum_{b=1}^B\lambda\hat f^b(x) f^(x)=b=1∑Bλf^b(x)
背后的理论依据:提升方法与生成一棵大规模的决策树不同,生成大树意味着对数据的严格契合和可能的过拟合,而提升法则是一种舒缓的训练模型的方法。我们用现有模型的残差生成决策树,也就是将现有的残差而不是结果 Y Y Y 作为响应值。然后再把这棵新生成的树加到相应函数以更新残差。算法中的参数 d d d 控制着树的规模,通过对 d d d 的调整,所有树都可以变得更小,只有少数终端结点。通过对残差生成小型的树,在 f ^ \hat f f^ 效果不佳的地方缓慢地对它进行改进。压缩参数 λ \lambda λ 允许更多不同结构的树改变残差,它的存在让学习过程进一步变慢。
提升方法有三个调整参数:
- 树的总数 B B B。如果 B B B 值过大,提升法可能出现过拟合,不过即使如此,其发展也很缓慢。我们用交叉验证选择 B B B。
- 取极小正值的压缩参数 λ \lambda λ。它控制着提升法的学习速度。 λ \lambda λ 通常取0.01或0.001。若 λ \lambda λ 值很小,则需要很大的 B B B 才能获得良好的预测效果。
- 每棵树的分裂点数 d d d。它控制着整个模型的复杂性。用 d = 1 d=1 d=1 构建模型通常能得到上佳效果,此时每棵树都是一个树桩,仅由一个分裂点构成。更多情况下, d d d 表示交互深度,它控制着提升模型的交互顺序,因为 d d d 个分裂点最多包含 d d d 个变量。