基本知识:
-
统计学习方法中的偏差与方差:
方差:同一模型在不同数据集上估计函数的改变量
偏差:选择模型与真实模型不一样造成的误差(比如选用线性实际非线性)
模型光滑度(自由度)越高,偏差小,方差会大;
模型自由度低,比如线性,往往方差小,偏差大。 -
集成的基本思想
将多个模型组合起来,以获得更好地效果。【弱学习器结合\集成——强学习器】
同质:模型相同的组合(并行或者组合)——bagging,boosting
异质:不同种类的学习算法——stacking通常是异质的
1.Bagging
对于高方差模型(比如决策树),使用袋装法可以降低其方差,增强模型的鲁棒性。
bagging是并行的方法
流程:
- 自助法抽样,生成B个不同的抽样训练集。
- 拟合模型,预测值求平均(回归问题),多数投票(分类问题)
袋外误差:
- 无需交叉验证就可以估计。因为自助法而言,平均每个弱学习器能用到 2 3 \frac{2}{3} 32的观测,剩下的袋外观测可以利用起来。
- 对于第i个观测,用所有将其作为OOB(袋外观测)的学习器预测其响应值,平均而言会有 B 3 \frac{B}{3} 3B的响应值作为预测,即可做平均\多数投票作为这个观测的OOB预测值。
- 这样,就可以求出每个观测的OOB预测,由于是训练样本,都知道真实值。因此,可以计算总体的OOB均方误差或者分类误差。
- 当B足够大,OOB误差与留一交叉验证误差是等价的。
自助法(有放回的抽样)通常用于求统计估计量的方差或者置信区间。
----------------记录---------------
- 特征抽样,每个训练的特征不一样,结果不一样。所以用Voting去做。
- 多个模型多数投票。
- 随机森林特征抽样后每棵树特征固定的
- dropout:一种是:训练 10/7 ;一种是:推断 0.7
- bagging — dropout 思想上是一样的。【看源代码】
2. Boosting
提升算法:三个臭皮匠赛过诸葛亮
- 强可学习与弱可学习:在概率近似正确学习框架(PAC)中:对于一个概念(类),如果一个多项式的学习算法能学习它。
正确率高——强可学习、正确率仅比猜测好一点点——弱可学习。 - 在PAC框架下,强可学习与弱可学习是充分必要的。
- 提升算法:弱可学习算法——得到一系列弱分类器——组合构成一个强分类器。
- 提升算法的特点:
①改变训练数据的概率分布(每个观测的权重)
②在不同分布的数据集上训练得到弱分类器 - 需要解决的问题:
①每轮如何改变权重
②如何组合弱分类器 - Bagging v.s Boosting
- Bagging侧重于组合高方差、低偏差的模型,减小方差,得到更好的鲁棒性。【 x ^ = 1 n ∑ x i \hat x = \frac{1}{n}\sum x_i x^=n1∑xi方差会减小】
- Boosting侧重于组合低方差、高偏差的模型。【每个模型都把注意力集中在目前最难拟合的观测数据上,从而降低最终给的偏差】
- 因此对于选用决策树作为基础模型,Bagging需要的是深层决策树,高方差,低偏差。Boosting只需要少许几层的较浅决策树、
- Boosting组合低方差、高偏差的模型的另一原因:不是并行计算,顺序拟合,计算开销不能过大
2.1 AdaBoost
基本步骤【具体见《统计学习方法》】
(1)初始化数据集权重(都一样)
(2)对以下步骤重复M次:
——(a):在有权值分布的数据集上训练一个分类器
G
m
(
x
)
G_m(x)
Gm(x)
——(b):计算分类误差
e
m
e_m
em
——(c):根据
e
m
e_m
em计算
G
m
(
x
)
G_m(x)
Gm(x)的权重系数
α
m
\alpha_m
αm
——(d):根据
α
m
\alpha_m
αm与
G
m
(
x
i
)
G_m(x_i)
Gm(xi)更新观测
x
i
x_i
xi的权重
ω
m
,
i
\omega_{m,i}
ωm,i
(3)得到基本分类器的线性组合
f
(
x
)
f(x)
f(x),并得到最终分类器
G
(
x
)
G(x)
G(x):
·
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
f(x) = \sum_{m=1}^{M} \alpha_mG_m(x)
f(x)=∑m=1MαmGm(x)
·
G
(
x
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
G(x) = sign(\sum_{m=1}^{M} \alpha_mG_m(x))
G(x)=sign(∑m=1MαmGm(x))
理解
-
α
m
=
1
2
l
o
g
1
−
e
m
e
m
\alpha_m = \frac{1}{2}log\frac{1-e_m}{e_m}
αm=21logem1−em:可以看出,临界值
e
m
=
0.5
e_m=0.5
em=0.5。
e
m
e_m
em减小,
α
m
\alpha_m
αm增大。
——分类误差越小的分类器越重要。 -
ω
m
,
i
\omega_{m,i}
ωm,i(公式不打了):在分类错误的样本上权值被放大,在分类正确的样本上权值被减小。
——不改变训练数据,而是改变训练样本的权值分布,从而相同弱分类器却起到不同作用(更重视那些分类错误的样本) - f ( x ) f(x) f(x):注意到虽然是加权表决,但 α m \alpha_m αm的和并不为1。 α m \alpha_m αm仅表示了分类器的重要性。最终分类的结果是由 f ( x ) f(x) f(x)的符号决定。 ∣ f ( x ) ∣ |f(x)| ∣f(x)∣表示分类的确信度。
- 更深入的理解:AdaBoost算法是前向分步加法算法的特例。这时,模型:基本分类器组成的加法模型,损失函数是指数函数。
2.2 提升树
提升法:顺序的训练每个学习器,拟合的不是y是残差。
以决策树为弱学习器为例:
- (1)对每个观测i, r i = y i , f ^ ( x ) = 0 r_i = y_i,\hat f(x) = 0 ri=yi,f^(x)=0
- (2) 重复以下过程M次:
(a)训练数据(X,r),建立一个决策树 T ^ i ( x ) \hat T_i(x) T^i(x)
(b) f ^ i ( x ) = f ^ i − 1 ( x ) + T ^ i ( x ) \hat f_i(x) = \hat f_{i-1}(x)+ \hat T_i(x) f^i(x)=f^i−1(x)+T^i(x)
(c)更新残差 r i = y i − f ^ i ( x i ) r_i = y_i -\hat f_i(x_i) ri=yi−f^i(xi) - (3)最终提升的模型: f ^ ( x ) = ∑ λ T ^ i ( x ) \hat f(x) = \sum \lambda \hat T_i(x) f^(x)=∑λT^i(x)
提升法是一种舒缓的训练模型方法。训练模型的目的就是为了让 f ^ ( x i ) − y i \hat f(x_i) - y_i f^(xi)−yi最小,也就是 r i → 0 r_i → 0 ri→0。只用一个模型是一步到位。而提升法是逐渐去减小残差(拟合当前的残差),最终达到目的。
当然也有超参数,比如重复过程次数的选择,压缩参数 λ \lambda λ的选择,以及弱学习器中的而一些参数等,都会影响到提升的过程。
-
梯度提升法:梯度提升(Gradient Boosting)算法
上述过程中,虽然看起来拟合残差是很自然的,但其背后是因为损失函数为平方误差。如果是一般的损失函数,残差的拟合则是利用损失函数的负梯度在当前模型的值作为提升树算法中残差的近似值,拟合一个回归树。
背后的数学思想见上述链接。 -
XGboost、lightGBM
3. Stacking
Stacking 与 bagging 和 boosting 的差异:
- Stacking 通常考虑的是异质弱学习器(不同的学习算法被组合在一起)
- Stacking 学习用元模型组合基础模型,而bagging 和 boosting 则根据确定性算法组合弱学习器。
简单来说,对于分类问题:
- 找几个不同模型作为弱学习器,比如SVM,逻辑回归,KNN等。然后选择一个元模型,比如MLP。
- 将弱学习器的输出作为元模型的输入,得到最终的预测
注意
- 弱学习器的训练与预测都是在训练集上完成的。所以需要切分数据集。直接的办法是简单划分,最好是用交叉验证。
- K折交叉验证。每次在K-1个划分的数据集上训练这些弱学习器,然后再剩下一个预测。对于每个样本,都有L个预测值。
- 然后对每个观测,将L个预测值作为特征输入进元模型【还没考证确认】,进行拟合(训练数据有标签),训练得到元模型。
4. 参考:
常用的模型集成方法介绍
为什么XGBoost在机器学习竞赛中表现如此卓越?
《统计学习方法》
《统计学习导论》
留个坑
深度学习中模型的集成,融合以及在NLP任务中的应用。
- LSTM + CRF