今日心情:焦虑焦虑还是焦虑。
内容参考自: An Introduction to Statistical Learning-Second Edition
对 【机器学习】Bootstrap详解进行补充。
实例
假设我们想在两种金融资产上投资一些钱,这两种资产的回报分别记为X和Y(X、Y都是随机实数)。
设
α
\alpha
α部分的钱投资进X,
1
−
α
1-\alpha
1−α部分的钱投资进Y。现在我们需要找到一种投资组合,也就是找到一个
α
\alpha
α值,使得风险最小,也就是:
a
r
g
m
i
n
α
V
a
r
(
α
X
+
(
1
−
α
)
Y
)
\underset\alpha{argmin}\ Var(\alpha X+(1-\alpha )Y)
αargmin Var(αX+(1−α)Y)
几十年前马尔可维茨已经在其投资组合理论里给出了解答。当
σ
X
2
\sigma_X^2
σX2,
σ
Y
2
\sigma_Y^2
σY2,
σ
X
Y
\sigma_{XY}
σXY已知时,最优
α
\alpha
α的表达式如下:
α
=
σ
Y
2
−
σ
X
Y
σ
X
2
+
σ
Y
2
−
2
σ
X
Y
\alpha = \frac {\sigma_Y^2-\sigma_{XY}}{\sigma_X^2+\sigma_Y^2-2\sigma_{XY}}
α=σX2+σY2−2σXYσY2−σXY
在现实世界中,
σ
X
2
\sigma_X^2
σX2,
σ
Y
2
\sigma_Y^2
σY2,
σ
X
Y
\sigma_{XY}
σXY一般都是未知的。我们可以通过以往数据来估计这些值。
在Figure 1.中,设
σ
X
2
=
1
\sigma_X^2=1
σX2=1,
σ
Y
2
=
1.25
\sigma_Y^2=1.25
σY2=1.25,
σ
X
Y
=
0.5
\sigma_{XY}=0.5
σXY=0.5,模拟生成了一组数据,则这组数据的真实
α
\alpha
α值为0.6。
F
i
g
u
r
e
1.
Figure\ 1.
Figure 1.每张子图显示了100个模拟点(X, Y)。从左到右,上到下,分别计算
σ
X
2
\sigma_X^2
σX2,
σ
Y
2
\sigma_Y^2
σY2,
σ
X
Y
\sigma_{XY}
σXY,然后是
α
\alpha
α。他们的
α
\alpha
α估计值分别为0.576,0.532,0.657和0.651。
为了评估 α \alpha α的估计准确度,我们可以重复这个模拟+估计的步骤1000次来计算 α \alpha α的标准偏差(Standard Deviation/Standard Error)。每一次可以得到一个估计值 α ^ r \hat \alpha_r α^r, r = 1 , 2 , . . . , 1000 r=1,2,...,1000 r=1,2,...,1000。Figure2.的左直方图展示了 α ^ r \hat \alpha_r α^r模拟结果的分布情况,真实值用紫色竖线表示。
F
i
g
u
r
e
2.
Figure\ 2.
Figure 2.
接下来计算
a
l
p
h
a
alpha
alpha的均值:
α
‾
=
1
1000
∑
r
=
1
1000
α
^
r
=
0.5996
\overline{\alpha} = \frac{1}{1000}\sum_{r=1}^{1000} \hat \alpha_r=0.5996
α=10001r=1∑1000α^r=0.5996
可以看到
α
‾
\overline{\alpha}
α非常接近真实值0.6。其标准偏差
S
E
(
α
^
r
)
SE(\hat \alpha_r)
SE(α^r)为:
1
1000
−
1
∑
r
=
1
1000
(
α
^
r
−
α
‾
)
2
=
0.083
\sqrt{\frac{1}{1000-1}\sum_{r=1}^{1000}(\hat \alpha_r- \overline{\alpha})^2}=0.083
1000−11r=1∑1000(α^r−α)2=0.083
这让我们对
α
\alpha
α的估计准确度有了一个概念。粗略来讲,从总体样本中随机取样,我们期望
α
^
\hat \alpha
α^与真实值
α
\alpha
α的平均差距大约为0.08。然而,在实践中,上述估计方法并不能使用。因为对于真实的数据,我们不能从原来的总体样本中模拟生成新的样本。
Boostrap
然而,bootstrap方法允许我们使用计算机来模拟获得新样本集的过程,这样我们就可以估计 α ^ \hat \alpha α^的可变性而不产生额外的观测值。我们不是从总体中反复获得独立的数据集,而是通过从原始数据集中有放回的,反复抽样观测值得到不同的数据集。
每个采样得到的数据集拥有原数据集一样的大小,其中某些样本可能会出现多次也有可能没有出现过。其整个流程的示例如Figure 3.所示,对一个简单的数据集Z进行boostrap,其中Z仅包含n=3个观测值。我们随机选择n个观测样本来生成一个boostrap数据集,
Z
∗
1
Z^{*1}
Z∗1。这个采样过程是有放回的,也就是说同一个观测值有可能在一个数据集中重复出现多次。在这个例子中,
Z
∗
1
Z^{*1}
Z∗1包含了观测值3两次,观测值1一次,观测值2零次。我们可以用
Z
∗
1
Z^{*1}
Z∗1计算一个新的
α
\alpha
α估计,记作
α
∗
1
\alpha^{*1}
α∗1。这个步骤将重复B次,产生B个不同的boostrap数据集
Z
∗
1
,
Z
∗
2
,
.
.
.
,
Z
∗
B
Z^{*1},Z^{*2},...,Z^{*B}
Z∗1,Z∗2,...,Z∗B和B个相应的
α
\alpha
α值
α
∗
1
,
α
∗
2
,
.
.
,
α
∗
B
\alpha^{*1},\alpha^{*2},..,\alpha^{*B}
α∗1,α∗2,..,α∗B。
F
i
g
u
r
e
3.
Figure 3.
Figure3.
于是我们可以计算boostrap估计的
α
^
r
\hat \alpha_r
α^r标准误差:
S
E
B
(
α
^
)
=
1
B
−
1
∑
r
=
1
B
(
α
^
∗
r
−
1
B
∑
r
′
=
1
B
α
^
∗
r
′
)
2
SE_B(\hat \alpha)=\sqrt{\frac{1}{B-1}\sum_{r=1}^{B}(\hat \alpha^{*r}- \frac{1}{B}\sum_{r'=1}^{B}\hat \alpha^{*r'})^2}
SEB(α^)=B−11r=1∑B(α^∗r−B1r′=1∑Bα^∗r′)2
Figure 2.的右直方图展示了1000次boostrap之后
α
\alpha
α的预测值,每次计算使用不同的boostrap数据集。我们可以看到右直方图和模拟1000次生成的左直方图十分相似,他们的boxplot也有着相似的分布,这表明了boostrap可以有效估计
α
^
\hat \alpha
α^的可变性。不仅是
α
\alpha
α的标准差,如果我们想要估计
α
\alpha
α的中位数、分位数等统计量,也是可以通过Boostrap方法做到。Figure 4.对比了两种方法的步骤。
F
i
g
u
r
e
4.
Figure\ 4.
Figure 4.
Bootstrap 置信区间(Confidence Interval)
Boostrap主要用于计算某个估计的标准误差,同时也可以用于计算某个总体参数的置信区间的近似值。
假设我们需要找到
α
\alpha
α的95%置信区间。
P
(
L
≤
α
≤
U
)
=
0.95
P(L\leq \alpha \leq U)=0.95
P(L≤α≤U)=0.95
令B=1000,即boostrap采样1000次,得到
Z
∗
1
,
Z
∗
2
,
.
.
.
,
Z
∗
1000
Z^{*1},Z^{*2},...,Z^{*1000}
Z∗1,Z∗2,...,Z∗1000和
α
∗
1
,
α
∗
2
,
.
.
,
α
∗
1000
\alpha^{*1},\alpha^{*2},..,\alpha^{*1000}
α∗1,α∗2,..,α∗1000。
- Bootstrap Percentile confidence interval:
[ L , U ] = [ α ∗ 25 , α ∗ 975 ] [L,U]=[\alpha^{*25},\alpha^{*975}] [L,U]=[α∗25,α∗975] - Bootstrap Standard Error based confidence interval:
[ L , U ] = α ‾ ± z 0.0025 ∗ S E ∗ 1000 [L,U]=\overline \alpha\pm z_{0.0025} * \frac{SE^*}{1000} [L,U]=α±z0.0025∗1000SE∗
思考:boostrap可以估计预测误差吗?
在K折交叉验证中,每个fold中的验证集都不相同,也就是说互相之间没有重叠的样本,这是K折效果出色的重要原因。
但在boostrap中,每个boostrap数据集都与原始数据有很大的重叠。原始数据集大约 2 3 \frac{2}{3} 32的样本会出现在每个boostrap数据集中(具体证明略),这会使boostrap方法严重低估预测误差。
应用:boostrap+线性回归
考虑以下线性回归模型:
Y
i
=
β
0
+
β
1
X
i
+
ε
i
,
i
=
1
,
.
.
,
n
Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i,\ i=1,..,n
Yi=β0+β1Xi+εi, i=1,..,n
如何计算
β
0
\beta_0
β0、
β
1
\beta_1
β1的标准误差(S.E.)和95%置信区间(C.I.)?
可以用三种不同的boostrap方法:
- Empirical Bootstrap
- Residual Bootstrap
- Wild Bootstrap
Empirical Bootstrap
从数据集 ( X 1 , Y 1 ) , . . . , ( X n , Y n ) (X_1,Y_1),...,(X_n,Y_n) (X1,Y1),...,(Xn,Yn)中反复抽样,得到B个boostrap数据集:
Boostrap Sample 1: ( X 1 ∗ 1 , Y 1 ∗ 1 ) , . . . , ( X n ∗ 1 , Y n ∗ 1 ) (X_1^{*1},Y_1^{*1}),...,(X_n^{*1},Y_n^{*1}) (X1∗1,Y1∗1),...,(Xn∗1,Yn∗1)
Boostrap Sample 2:
(
X
1
∗
2
,
Y
1
∗
2
)
,
.
.
.
,
(
X
n
∗
2
,
Y
n
∗
2
)
(X_1^{*2},Y_1^{*2}),...,(X_n^{*2},Y_n^{*2})
(X1∗2,Y1∗2),...,(Xn∗2,Yn∗2)
…
Boostrap Sample B:
(
X
1
∗
B
,
Y
1
∗
B
)
,
.
.
.
,
(
X
n
∗
B
,
Y
n
∗
B
)
(X_1^{*B},Y_1^{*B}),...,(X_n^{*B},Y_n^{*B})
(X1∗B,Y1∗B),...,(Xn∗B,Yn∗B)
对于每个Boostrap Sample,拟合一个线性回归模型,然后得到:
(
β
^
0
∗
1
,
β
^
1
∗
1
)
.
.
.
(
β
^
0
∗
B
,
β
^
1
∗
B
)
(\hat \beta_0^{*1}, \hat \beta_1^{*1})...(\hat \beta_0^{*B}, \hat \beta_1^{*B})
(β^0∗1,β^1∗1)...(β^0∗B,β^1∗B)
然后估计S.E.和C.I.。
Residual Bootstrap
线性回归的残差(Residual)可以表示为:
e
^
i
=
Y
i
−
Y
^
i
=
Y
i
−
β
^
0
−
β
^
1
X
i
\hat e_i = Y_i - \hat Y_i = Y_i - \hat \beta_0 - \hat \beta_1X_i
e^i=Yi−Y^i=Yi−β^0−β^1Xi
当
β
^
0
→
β
0
\hat \beta_0 \rightarrow \beta_0
β^0→β0,
β
^
1
→
β
1
\hat \beta_1 \rightarrow \beta_1
β^1→β1时,我们可以将
e
^
i
\hat e_i
e^i视作对
ε
i
\varepsilon_i
εi的模拟,因为
ε
i
=
Y
i
−
β
0
−
β
1
X
i
\varepsilon_i= Y_i - \beta_0- \beta_1X_i
εi=Yi−β0−β1Xi。
boostrap残差,得到B个boostrap残差数据集:
Boostrap Residual 1:
e
^
1
∗
1
,
.
.
.
,
e
^
n
∗
1
\hat e_1^{*1},...,\hat e_n^{*1}
e^1∗1,...,e^n∗1
Boostrap Residual 2:
e
^
1
∗
2
,
.
.
.
,
e
^
n
∗
2
\hat e_1^{*2},...,\hat e_n^{*2}
e^1∗2,...,e^n∗2
…
Boostrap Residual B:
e
^
1
∗
B
,
.
.
.
,
e
^
n
∗
B
\hat e_1^{*B},...,\hat e_n^{*B}
e^1∗B,...,e^n∗B
然后生成新的boostrap样本:
X
i
∗
b
=
X
i
,
Y
i
∗
b
=
β
^
0
+
β
^
1
X
i
+
e
^
i
∗
b
X_i^{*b} = X_i,\ Y_i^{*b}=\hat\beta_0 + \hat\beta_1 X_i + \hat e_i^{*b}
Xi∗b=Xi, Yi∗b=β^0+β^1Xi+e^i∗b
根据boostrap样本这些拟合回归模型,然后再估计S.E.和C.I.。
Wild Bootstrap
思想与Residual Bootstrap类似。此处略。
Bagging 和随机森林(Random Forest)
装袋法(Bagging)又称自助法聚集(bootstrap aggregation),思想是生成B个不同的boostrap训练集,然后平均每个训练集的预测值。
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)
随机森林在bagged树的基础上进行了改进,不同之处在于:每一次用boostrap建立的样本集之后并不用全部特征去建立决策树,而是同样对特征也进行抽样。
那么为什么不用所有的特征呢?对于bagged树来说,每次都用所有特征,如果存在一些强特征,就会导致每棵树的分裂方式都类似,这样不同树之间的预测变量就高度相关。这样即使最后对所有树的输出求平均,方差能减少的程度也有限。所以对特征也进行抽样可以更有效减少方差。
随机森林的构建步骤
对于每个bootstrap数据集,用下面的循环生成一颗决策树:
- 从p个特征中随机选取m个特征(一般 m ≈ p m\approx\sqrt{p} m≈p)
- 在m个特征中选择最佳的分裂结点
- 分裂结点