目录
一、概念
- 集成方式主要有3种:boosting和bagging 和 stacking
- 集成学习:将多个弱学习器结合起来组成一个强学习器
- 个体学习器一般选择:决策树,神经网络(集成时可以是同类,也可以是不同类)
- 什么时候集成效果好于单个学习器?
“好而不同”,每个都不是特别差,且有一定的多样性
证明:假设错误率相互独立,整体学习器的错误率为(个体学习器的错误率为 ε):
P ( H ( x ) ≠ f ( x ) ) P(H(x)\ne f(x)) P(H(x)̸=f(x))
= ∑ k = 0 ⌊ T / 2 ⌋ ( k T ) ( 1 − ϵ ) k ϵ T − k =\sum_{k=0}^{\lfloor T/2\rfloor}(_k^T)(1-\epsilon)^k\epsilon^{T-k} =k=0∑⌊T/2⌋(kT)(1−ϵ)kϵT−k
≤ e x p ( − 1 2 T ( 1 − 2 ϵ ) 2 ) \le exp(-\frac{1}{2}T(1-2\epsilon)^2) ≤exp(−21T(1−2ϵ)2)
学习器数目 T 逐渐增大,整个学习器的错误率将指数级下降,甚至最终趋向于零
二、boosting和bagging 区别
以随机森林和adaboost为例:
- 个体学习器间依赖关系上:
Bagging,随机森林:个体之间不存在强依赖关系,各个预测函数可并行生成。
Boosting:个体学习器间存在强依赖,必须串行生成。后一个模型参数需要前一轮的结果. - 样本选择上:
Bagging:训练集是随机有放回选取的,各轮训练集之间是独立的.
Boosting:训练集不变,只是样例的权重发生变化.权值是根据上一轮的分类结果进行调整. - 样例权重:
Bagging:均匀取样,每个样例权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大. - 预测函数:
Bagging:所有预测函数的权重相等.
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重
三、随机森林
(代表集成学习技术水平的方法)(并联,投票)
- 样本产生:随机有放回抽样(第一个随机)
- 属性选择:基学习器是决策树,训练决策树时引入随机属性选择(第二个随机)(选划分属性时,先从属性集中随机选择一个包含k(推荐 l o g 2 d log_2d log2d)个属性的子集,然后再从子集中选使Gini值最小的分割点作为最优属性用于划分)
- 效率常优于Bagging,不易过拟合;噪音比较大时会过拟合
四、boosting(串联)
- 根据初始训练数据训练出第一个基学习器;
根据基学习器的表现调整样本,更多关注之前学习器做错的样本,训练下一个基学习器;
重复T 次,将 T 个学习器加权结合。 - 优点:表达能力强,不需要做复杂的特征工程和特征变换
- 缺点:串联,不好并行化,计算复杂度高,同时不太适合高维
五、GBDT
- GB中单个学习器为决策树(回归树:虽然它常用于预测,而不是分类)
- GBDT有两种,一种是残差学习,一种是负梯度代替残差,为啥用负梯度近似残差?
GBDT每次迭代是对之前模型损失函数的梯度下降方向(即伪残差)进行学习,计算出使下一步损失函数取值最小的伪残差,从而得出下一步模型,残差只是在loss用最小二乘时的一个特例,对 ( x − y ) 2 (x-y)^2 (x−y)2求梯度刚好就是 2 ( x − y ) 2(x-y) 2(x−y),换成其他loss就不对了,所以,残差学习只是一个特例,负梯度才是通用的
六、adaboost
- =指数损失(
e
−
f
(
x
)
H
(
x
)
e^{-f(x)H(x)}
e−f(x)H(x))+boosting(加法模型)+的前向分步算法
(指数损失达到最小时分类错误率也将最小化) - 预测模型是基学习器的加权平均值: H ( x ) = ∑ t = 1 T α t h t ( x ) H(x)=\sum_{t=1}^T\alpha_th_t(x) H(x)=∑t=1Tαtht(x)
- 每一次迭代的弱学习器怎么学?
改变训练数据的权值(概率分布):提高被错误分类的样本权值,降低正确的 D m = D m − 1 1 − e m e m D_m=D_{m-1}\frac{1-e_m}{e_m} Dm=Dm−1em1−em( e m e_m em被误分类样本的权值之和)
选取让误差率最低的阈值来设计基本分类器 - 弱分类器权值怎么确定?
加大分类误差率小的弱分类器权值,减小大的 α 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 , e m e,e_m e,em为误差率) - 优点:不会很容易出现过拟合现象
七、 GBDT vs. adaboost 区别
- 名字不同是因为损失函数不同,也就是定位模型不足的方法不同
GBDT是通过梯度定位的,而adaboost是通过提高被错误分类的样本权值来定位的 - AdaBoost对异常点(outlier)比较敏感,而GBDT通过引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性。
八、xgboost
参考:推导
1、 (最小化)目标函数=损失函数(可自定义,只需满足二次可微)+ 正则化项(与叶子节点的数量和值有关)
- 目标函数:
I
j
I_j
Ij为所有被划分到叶子节点j的训练样本的集合
o b j ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 obj^{(t)}\approx \sum_{i=1}^n[g_iw_{q(x_i)}+\frac{1}{2}h_iw_{q(x_i)}^2]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 obj(t)≈i=1∑n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1∑Twj2
= ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T =\sum_{j=1}^T[(\sum_{i\in I_j}g_i)w_j+\frac{1}{2}(\sum_{i\in I_j}h_i+\lambda)w_j^2]+\gamma T =j=1∑T[(i∈Ij∑gi)wj+21(i∈Ij∑hi+λ)wj2]+γT
= ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T =\sum_{j=1}^T[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T =j=1∑T[Gjwj+21(Hj+λ)wj2]+γT
- 损失函数:除了一阶导还用二阶导,对每一次的损失函数做二阶泰勒展开,展开之后删去常数项,会发现目标函数与损失函数的形式无关,所以可以自定义,只需满足二次可微
( g i g_i gi是损失函数一阶导, h i h_i hi是二阶, f t ( x i ) f_t(x_i) ft(xi)第t棵树第i个叶子节点的值)
∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \sum_{i=1}^n[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_t) i=1∑n[gift(xi)+21hift2(xi)]+Ω(ft) - 正则化作用:
- 训练数据可能有误,未必涵盖了所有种类的样本
- 控制模型复杂度,对参数施加一定的控制,防止参数走向极端,防止过拟合
-
γ
\gamma
γ:人为加入的阈值,使xgboost在优化目标函数的同时做了预剪枝
λ \lambda λ:L2的系数,相当于对leaf score做了平滑,防止过拟合
Ω ( f ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f)=\gamma T+\frac{1}{2}\lambda \sum_{j=1}^Tw_j^2 Ω(f)=γT+21λj=1∑Twj2
2、模型:一堆CART树
y
i
^
=
∑
k
=
1
K
f
k
(
x
i
)
,
f
k
∈
F
\hat{y_i}=\sum_{k=1}^Kf_k(x_i),f_k\in \mathcal{F}
yi^=k=1∑Kfk(xi),fk∈F
(为什么用CART树而不是普通的决策树:CART树的叶子节点对应的值是一个实际的分数,而非一个确定的类别,有利于实现高效的优化算法)
3、如何找树的结构:挨层判断切分点。对每个确定切分点,衡量切分好坏的标准如下:
G
a
i
n
=
1
2
[
G
L
2
H
L
+
λ
+
G
R
2
H
R
+
λ
−
(
G
L
+
G
R
)
2
H
L
+
H
R
+
λ
]
−
γ
Gain=\frac{1}{2}[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}]- \gamma
Gain=21[HL+λGL2+HR+λGR2−HL+HR+λ(GL+GR)2]−γ
这个
G
a
i
n
Gain
Gain实际上就是单节点的
o
b
j
∗
obj^*
obj∗减去切分后的两个节点的树
o
b
j
∗
obj^*
obj∗,如果
G
a
i
n
>
0
Gain>0
Gain>0且越大,表示切分后
o
b
j
∗
obj^*
obj∗越小于单节点的
o
b
j
∗
obj^*
obj∗,越值得切分;左半部分<
γ
\gamma
γ,
G
a
i
n
<
0
Gain<0
Gain<0,obj变大。
γ
\gamma
γ越大,对切分后
o
b
j
obj
obj下降幅度要求越严,
γ
\gamma
γ限制了树的复杂度
4、求参:分步优化目标函数,在第t步时,添加一棵最优的CART树(最优:在现有的t-1棵树的基础上,使目标函数最小的那棵CART树)
5、各个叶子节点的最佳值以及此时目标函数的值
w
j
∗
=
−
G
j
H
j
+
λ
w_j^*=-\frac{G_j}{H_j+\lambda}
wj∗=−Hj+λGj
o b j ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T obj^*=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T obj∗=−21j=1∑THj+λGj2+γT
6、结果:将每棵树的预测值加到一起作为最终的预测值
7、停止:
- 当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,像预剪枝、
- 当树达到最大深度时
- 当样本权重和小于设定阈值时则停止建树,大意就是一个叶子节点样本太少了
- 树的最大数量
九、GBDT vs. xgboost
- GBDT 中通过对损失函数求一阶导计算出伪残差来进行学习,xgboost 不仅使用到了一阶导,还使用了二阶导
- xgboost在目标函数中显示的加上了正则化项,从Bias-variance角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合
- Xgboost 是 GB的高效实现,它的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)(通过特征的线性组合分类)
- CART 回归树中寻找最佳分割点是根据Gini系数,越小越好,xgboost 寻找分割点的标准是最大化Gain
- Xgboost利用了特征的稀疏性,划分结点时,不统计该特征为缺失的样本,只遍历非缺失的样本,也可以为缺失值或者指定值指定分支的默认方向
- Xgboost计算速度快,因为可以并行化
十、stacking
先用初始训练数据学习出若干个基学习器,再将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。