集成学习
- xgboost原理
xgboost是陈天奇在2014年初提出的,是基于GBDT改进的梯度提升(GB)算法,XGBoost算法中的基学习器可以是线性分类器,也可以是CART。该算法通过增加基分类器,减少拟合残差,直到残差减少到足够小或预设阈值,则终止迭代,XGBoost算法和GDBT算法相比,通过对损失函数的负梯度使用二阶泰勒展开式,增加了误差减小的速度,在保留一阶损失函数信息基础上,增加了损失函数的二阶信息,使得误差拟合速度加快,并通过增加正则项,对模型复杂度进行惩罚,以避免模型的过拟合问题,使得模型在追求更高精确度和避免模型过度复杂之间得到良好平衡,XGBoost算法的目标函数由损失函数和正则项两部分组成。
XGBoost算法使用稀疏感知算法解决数据稀疏问题,通过对目标函数增加正则项避免模型的过拟合问题,通过使用二阶泰勒展开快速拟合残差提高模型的精确度,通过贪心算法和分布式加权直方图算法的运用提高模型的运行效率。
- xgboost的目标函数和正则项表达式
1)目标函数
假设有样本
N
N
N个,样本指标
M
M
M个,则样本集合
D
=
(
x
i
,
y
i
)
(
D
∈
R
M
,
y
i
∈
R
)
D={(x_i,y_i)}{(D\in R^M,y_i \in R)}
D=(xi,yi)(D∈RM,yi∈R),若集成学习过程共有
t
t
t棵决策树,以
f
t
f_t
ft表示第
t
t
t棵决策树,
f
t
(
x
i
)
f_t(x_i)
ft(xi)表示第
t
t
t棵树的决策结果,
T
T
T表示决策树叶子节点个数,
x
i
x_i
xi与决策树的预测结果之间的决策规则以
q
q
q表示,相应叶子节点的权重以
ω
\omega
ω表示,并使用
L
2
L2
L2范式对其进行正则化,XGBoost算法目标函数为:
L
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
∑
k
=
1
t
Ω
(
f
k
)
L^{(t)}=\sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\sum_{k=1}^t\Omega(f_k)
L(t)=∑i=1nl(yi,y^i(t−1)+ft(xi))+∑k=1tΩ(fk)
其中:
Ω
(
f
)
=
γ
T
+
1
2
λ
∥
ω
∥
2
\Omega(f)=\gamma T+\frac{1}{2}\lambda \Vert\omega\Vert^2
Ω(f)=γT+21λ∥ω∥2
γ \gamma γ和 λ \lambda λ分别为叶子节点数及其相应叶子节点权重的正则化系数,目标函数的优化方向是越小越好,所以两个正则化系数越大,表示惩罚程度越强。后一个基学习器是在前面基学习器的基础上建立的,在对第 t t t轮的损失函数进行计算时,对于前 t − 1 t-1 t−1轮的正则项之和 ∑ k = 1 t − 1 Ω ( f k ) \sum_{k=1}^{t-1}\Omega(f_k) ∑k=1t−1Ω(fk)是已知的,可使用常数表示,并对目标函数进一步求解如下:
L
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
∑
k
=
1
t
Ω
(
f
k
)
L^{(t)}=\sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\sum_{k=1}^t\Omega(f_k)
L(t)=∑i=1nl(yi,y^i(t−1)+ft(xi))+∑k=1tΩ(fk)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
f
(
t
)
+
c
o
n
s
t
a
n
t
t
=\sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\Omega f(t)+constant\ t
=∑i=1nl(yi,y^i(t−1)+ft(xi))+Ωf(t)+constant t
使用 g i g_i gi和 h i h_i hi分别表示损失函数的一阶导数和二阶导数:
g
i
=
∂
l
(
y
i
,
y
^
i
t
−
1
)
∂
y
^
i
t
−
1
g_i=\frac{\partial l(y_i,\hat y_i^{t-1})}{\partial \hat y_i^{t-1}}
gi=∂y^it−1∂l(yi,y^it−1)
h
i
=
∂
2
l
(
y
i
,
y
^
i
t
−
1
)
∂
(
y
^
i
t
−
1
)
2
h_i=\frac{\partial^2 l(y_i,\hat y_i^{t-1})}{\partial {(\hat y_i^{t-1})}^2}
hi=∂(y^it−1)2∂2l(yi,y^it−1)
将目标函数在 y ^ i t − 1 \hat y_i^{t-1} y^it−1处进行二阶泰勒公式展开,并将 g i g_i gi和 h i h_i hi代入:
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
f
(
t
)
+
c
o
n
s
t
a
n
t
t
\sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+f_t(x_i))+\Omega f(t)+constant\ t
∑i=1nl(yi,y^i(t−1)+ft(xi))+Ωf(t)+constant t
≈
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
)
+
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
+
Ω
f
(
t
)
+
c
o
n
s
t
a
n
t
t
\approx \sum_{i=1}^nl(y_i,\hat y_i^{(t-1)})+g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)+\Omega f(t)+constant\ t
≈∑i=1nl(yi,y^i(t−1))+gift(xi)+21hift2(xi)+Ωf(t)+constant t
≈
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
Ω
f
(
t
)
\approx\sum_{i=1}^n[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega f(t)
≈∑i=1n[gift(xi)+21hift2(xi)]+Ωf(t)
在目标函数优化过程中无法对常数项进行优化,故将公式中的常数项去掉以对公式进行简化,使用 w i w_i wi表示叶子节点的权重,以 I j I_j Ij作为叶子结点 J J J的实例集合,其中 I j = i ∣ q ( x i ) = j I_j={i|q(x_i)=j} Ij=i∣q(xi)=j,并将正则展开:
L
(
t
)
=
∑
i
=
1
n
[
g
i
f
t
(
x
i
)
+
1
2
h
i
f
t
2
(
x
i
)
]
+
γ
T
+
1
2
λ
∑
j
=
1
T
ω
j
2
L^{(t)}=\sum_{i=1}^n[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\gamma T+\frac{1}{2}\lambda \sum_{j=1}^T\omega_j^2
L(t)=∑i=1n[gift(xi)+21hift2(xi)]+γT+21λ∑j=1Tωj2
=
∑
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=1T[(∑i∈Ijgi)wj+21(∑i∈Ijhi+λ)wj2]+γT
当决策树的决策规则 q ( x ) q(x) q(x)确定的情况下,即可获得叶子节点 j j j的最优权重 w j ∗ w_j^* wj∗,并将目标函数进一步化简如下:
w
j
∗
=
∑
i
∈
I
j
g
i
∑
i
∈
I
j
h
i
+
λ
w_j^*=\frac{\sum_{i\in I_j}g_i}{\sum_{i\in I_j}h_i+\lambda}
wj∗=∑i∈Ijhi+λ∑i∈Ijgi
L
(
t
)
(
q
)
=
−
1
2
∑
j
=
1
T
(
∑
i
∈
I
j
g
i
)
2
∑
i
∈
I
j
h
i
+
λ
+
γ
T
L^{(t)}(q)=-\frac{1}{2}\sum_{j=1}^T\frac{(\sum_{i\in I_j}g_i)^2}{\sum_{i\in I_j}h_i+\lambda} +\gamma T
L(t)(q)=−21∑j=1T∑i∈Ijhi+λ(∑i∈Ijgi)2+γT
2)正则表达式
Ω
(
f
)
=
γ
T
+
1
2
λ
∥
ω
∥
2
\Omega(f)=\gamma T+\frac{1}{2}\lambda \Vert\omega\Vert^2
Ω(f)=γT+21λ∥ω∥2
- xgboost的优缺点
优点:
1)精度更高,XGBoost对损失函数进行了二阶泰勒展开,XGBoost引入二阶导一方面是增加精度,另一方面是能够自定义损失函数,二阶泰勒展开可以近似大量损失函数
2)灵活性更强,XGBoost算法中的基学习器可以是线性分类器,也可以是CART。
3)XGBoost在目标函数中加入了正则项,用于控制模型的复杂度,正则项降低模型的方差,使学习出来的模型更加简单,有助于防止过拟合。
4)对于特征的值有缺失的样本,XGBoost采用的稀疏感知算法可以自动学习出它的分裂方向。
缺点:
1)在节点分裂过程中仍需要遍历数据集
2)预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。
- xgboost怎么防止过拟合
XGBoost在目标函数中加入了正则项,用于控制模型的复杂度,正则项降低模型的方差,使学习出来的模型更加简单,有助于防止过拟合。
- xgboost特征并行化怎么做的
XGBoost的并行不是每棵树并行训练,每棵树训练前需要等前面的树训练完成才能开始训练。
XGBoost的并行是指特征维度的并行:在训练之前,每个特征按特征值对样本进行预排序,并存储为块结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个块结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个块并行计算。
- GBDT的原理
GBDT由提升算法和决策树算法组成,该算法在2001年由Friedman提出,全称为梯度提升决策树,其基学习器为决策树,可以应用于回归计算也可以应用于分类计算,GBDT在集成算法中是提升算法的代表算法。GBDT算法通过对每一步的损失函数的负梯度进行拟合,以作为下一个基学习器学习中的残差的近似值,并根据上一个基学习器对残差的拟合,寻找下一步使得损失函数达到最小的进行叶子划分的趋于,依次进行,将每个弱学习器的学习结果加权得到最后集成学习的结果。
假设共含有
N
N
N个样本,共建立基学习器
m
m
m个,即
m
m
m棵决策树,根据决策树深度确定的相应叶子节点数记为
J
J
J个叶子节点,首先对初始进行决策的基学习器给定一个常数
c
c
c进行预测,
y
i
y_i
yi表示第
i
i
i个样本的特征向量。
1)对第一个基学习器进行初始化,以
f
0
(
x
)
f_0(x)
f0(x)表示依据使得损失函数最小的原则得出的目标函数,每一个预测值应用于下一个基学习的残差近似过程
f
0
(
x
)
=
a
r
g
m
i
n
c
∑
i
=
1
N
L
(
y
i
,
c
)
f_0(x)=arg\ min_c\sum_{i=1}^{N}L(y_i,c)
f0(x)=arg minc∑i=1NL(yi,c)
2)在建立第
m
m
m棵决策树时
2.1)使用第
m
−
1
m-1
m−1棵树的损失函数计算负梯度,并拟合第
m
m
m个决策树的样本残差
r
i
,
m
=
−
∂
L
(
y
i
,
f
m
−
1
(
x
i
)
)
f
m
−
1
(
x
i
)
)
r_{i,m}=-\frac{\partial L(y_i,f_{m-1}(x_i))}{f_{m-1}(x_i))}
ri,m=−fm−1(xi))∂L(yi,fm−1(xi))
2.2)根据第
m
−
1
m-1
m−1棵决策树的拟合结果建立第
m
m
m棵决策树,假设第
m
m
m棵决策树含有
J
J
J个叶子节点,得到第
m
m
m棵数的叶子节点划分区域
R
j
m
R_{jm}
Rjm。
2.3)对叶子区域计算最佳拟合值
γ
j
m
=
a
r
g
m
i
n
γ
∑
x
j
∈
R
j
m
L
(
y
i
,
f
m
−
1
(
x
i
)
+
γ
)
\gamma_{jm}=arg\ min_\gamma\sum_{x_j\in R_{jm}}L(y_i,f_{m-1}(x_i)+\gamma)
γjm=arg minγ∑xj∈RjmL(yi,fm−1(xi)+γ)
2.4)根据第
m
m
m个决策树的拟合结果,更新得到第
m
m
m棵决策树。
f
m
(
x
)
=
f
m
−
1
(
x
)
+
∑
j
=
1
(
J
)
I
(
x
∈
R
j
m
)
f_m(x)=f_{m-1}(x)+\sum_{j=1}^(J)I(x\in R_{jm})
fm(x)=fm−1(x)+∑j=1(J)I(x∈Rjm)
3)加权计算
m
m
m棵决策树的预测结果,得到最终学习器。
f
(
x
)
=
f
M
(
x
)
=
f
0
(
x
)
+
∑
m
=
1
M
∑
j
=
1
J
I
(
x
∈
R
j
m
)
f(x)=f_M(x)=f_0(x)+\sum_{m=1}^{M}\sum_{j=1}^{J}I(x\in R_{jm})
f(x)=fM(x)=f0(x)+∑m=1M∑j=1JI(x∈Rjm)
- GBDT常用的调参参数
框架参数:
n_estimators:弱学习器的最大个数
learning_rate:每个弱学习器都有一个权重参数,默认是0.1
subsample:子采样比例,用于拟合个体基学习器的样本比例
loss:损失函数的选择
弱学习器参数:
max_features:划分时考虑的特征数量
max_depth:每棵子树的深度,默认为3
min_samples_split:子树继续划分的条件
min_samples_leaf:叶子节点最少的样本数
min_weight_fraction_leaf:限制了叶子节点所有样本权重和的最小值
max_leaf_nodes:最大叶子节点数量
min_impurity_split:最小基尼不纯度
- GBDT的使用场景
GBDT适用于回归问题(线性和非线性);
GBDT也可用于二分类问题和多分类问题。
- GBDT的优缺点
优点:
1)可灵活处理各种类型的数据,包括连续型和离散型
2)使用一些健壮的损失函数
3)很好的利用弱分类器进行级联
4)充分考虑每个分类器的权重
缺点:
由于弱学习器之间存在依赖关系,难以并行训练数据。
- 随机森林的原理
随机森林在以决策树作为基学习器构建bagging集成的基础上,进一步在决策树的训练过程中加入了随机属性的选择。
具体来说,传统决策树在选择划分属性时是在当前结点的所有候选属性(假定有
d
d
d个)中选择一个最优属性;而在随机森林中,对基决策树的每个结点,先从该结点的侯选属性集合中随机选择一个包含
k
k
k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。抽取的属性数
k
k
k的选择比较重要,一般推荐
K
=
l
o
g
2
d
K=log_2d
K=log2d。由此,随机森林的基学习器的“多样性”不仅来自样本的扰动,还来自属性的扰动,使得最终集成的泛化能力进一步增强。
- 随机森林的优缺点
优点:
1)在当前的很多数据集上,相对其他的算法有着很大的优势,表现良好
2)能够处理高维度的数据,并且不用做特征选择
3)在训练完后,它能够给出哪些特征比较重要
4)在创建随机森林的时候,对generalization error使用的是无偏估计,模型泛化能力强
5)训练速度快,容易做成并行化方法
6)在训练过程中,能够检测到特征之间的互相影响
7)实现比较简单
8)对于不平衡的数据集来说,它可以平衡误差
9)如果有很大一部分的特征遗失,仍可以维持准确度
缺点:
1)随机森林已经被证明在某些噪音较大的分类或者回归问题上会拟合
2)对于不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的
- 随机森林里面的决策树分别长什么样,怎么剪枝
随机森林将单个决策树的输出整合起来生成最后的输出结果。
剪枝的意义是防止决策树生成过于庞大的子叶,避免实验预测结果过拟合,在实际生产中效果很差。
- bagging原理
给定包含
m
m
m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过
m
m
m次随机采样操作,可得到含
m
m
m个样本的采样集,初始训练集中约有63.2%的样本出现在采样集中,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。
- boosting原理
boosting是一族可将弱学习器提升为强学习器的算法,这族算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到事先指定的值 T T T,最终将这 T T T个基学习器进行加权结合。
- bagging和boosting的区别
1)样本选择:
bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化,而权重是根据上一轮的分类结果进行调整。
2)样例权重:
bagging:使用均匀取样,每个样例的权重相等
boosting:根据错误率不断调整样例的权值,错误率越大权重越大。
3)预测函数:
bagging:所有预测函数的权重相等。
boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
bagging:各个预测函数可以并行生成
boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
- XGBOOST和GDBT的联系与区别
1)GBDT是机器学习算法,XGBoost是该算法的工程实现。
2)正则项:在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力
3)导数信息:GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代价函数进行二阶泰勒展开,同时使用一阶和二阶导数
4)基学习器:传统的GBDT采用CART作为基学习器,XGBoost支持多种类型的基分类器,比如线性分类器
5)子采样:传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样。
6)缺失值处理:传统GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略
7)并行化:传统GBDT没有进行并行化设计,注意不是树维度的并行,而是特征维度的并行。XGBoost预先将每个特征按特征值排序,然后存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。
-
AdaBoost和GBDT的联系与区别
-
随机森林和 GBDT 的联系与区别
-
XGBOOST和lightgbm的区别和适用场景
参考文献:
https://zhuanlan.zhihu.com/p/65389367
https://blog.youkuaiyun.com/pearl8899/article/details/105461173
https://zhuanlan.zhihu.com/p/57965634
https://blog.youkuaiyun.com/keepreder/article/details/47273297
https://blog.youkuaiyun.com/Datawhale/article/details/103725122
https://cloud.tencent.com/developer/article/1387682