目录
1、XGB
2、cart树
3、XGBoosting原理
4、分裂算法
5、缺失值处理
6、优缺点
7、参数
一、XGB
XGBoost是boosting算法中的一种。Boosting算法的思想是将许多弱分类器集成在一起形成一个强分类器。因为XGBoost是一种提升树模型,所以它是将许多树模型集成在一起,形成一个很强的分类器。而所用到的树模型则是CART回归树模型。
二、cart树
ps(第一期在决策树部分有进行过梳理,这里只简单叙述一下)
1)决策树
CART采用GINI值衡量节点纯度;如果是回归树,采用样本方差衡量节点纯度。节点越不纯,节点分类或者预测的效果就会越差。GINI值的计算公式:
G
i
n
i
=
1
−
∑
i
∈
I
p
i
2
Gini=1-\sum_{i \in I}{p_i}^2
Gini=1−i∈I∑pi2 那么在特征A的条件下,集合D的基尼指数为
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)节点越不纯,GINI值越大,样本集合的不确定性也会越大的。以二分类为例,如果节点的所有数据只有一个类别,则
G
i
n
i
=
1
−
∑
i
∈
I
p
i
2
=
0
Gini=1-\sum_{i \in I}{p_i}^2=0
Gini=1−∑i∈Ipi2=0,如果两类数量相同,则
G
i
n
i
=
1
−
∑
i
∈
I
p
i
2
=
1
2
Gini=1-\sum_{i \in I}{p_i}^2=\frac{1}{2}
Gini=1−∑i∈Ipi2=21回归方差计算:
σ
=
∑
i
∈
I
(
x
i
−
μ
)
2
=
∑
i
∈
I
x
i
2
−
n
μ
2
\sigma=\sqrt{\sum_{ i \in I}{(x_i-\mu)^2}}=\sqrt{\sum_{ i \in I}{{x_i}^2-n{\mu}^2}}
σ=i∈I∑(xi−μ)2=i∈I∑xi2−nμ2方差越大,表示该节点的数据越分散,预测的效果就越差。如果一个节点的所有数据都相同,那么方差就为0,此时可以很肯定得认为该节点的输出值;如果节点的数据相差很大,那么输出的值有很大的可能与实际值相差较大。 因此,无论是分类树还是回归树,CART都要选择使子节点的GINI值或者回归方差最小的属性作为分裂的方案。即最小化(分类树):
G
a
i
n
=
∑
i
∈
I
p
i
⋅
G
i
n
i
i
Gain=\sum_{i\in I}{p_i}\cdot Gini_i
Gain=i∈I∑pi⋅Ginii而对于回归树
G
a
i
n
=
∑
i
∈
I
σ
i
Gain=\sum_{i\in I}{\sigma}_i
Gain=i∈I∑σi
2)回归树
对于输入空间进行划分时,选择第j个变量
x
(
j
)
x^{(j)}
x(j)和它的值s,作为切分变量(splitting variable)和切分点(splitting point),并定义两个区域:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
⩽
s
}
R_1(j,s)=\{{x | x^{(j)}}\leqslant s\}
R1(j,s)={x∣x(j)⩽s}和
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_2(j,s)=\{{x | x^{(j)}}> s\}
R2(j,s)={x∣x(j)>s}然后寻找最优切分变量j和最优切分点s:
m
i
n
j
,
s
[
m
i
n
c
1
∑
x
i
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
\mathop{min}\limits_{j,s}[\mathop{min}\limits_{c_1}\sum_{{x_i}\in R_1(j,s)}{({y_i}-{c_1})^2}+\mathop{min}\limits_{c_2}\sum_{{x_i}\in R_2(j,s)}{({y_i}-{c_2})^2}]
j,smin[c1minxi∈R1(j,s)∑(yi−c1)2+c2minxi∈R2(j,s)∑(yi−c2)2]
三、XGBoost原理
在XGB中我们会把目标函数定义成损失函数加上 正则化的形式然后在泰勒二阶展开:
O
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
i
^
)
+
∑
k
=
1
K
Ω
(
f
k
)
Obj=\sum_{i=1}^{n}{l(y_i,\hat{y_i})}+\sum_{k=1}^K {\Omega (f_k)}
Obj=i=1∑nl(yi,yi^)+k=1∑KΩ(fk)
新生成的树会对上次的预测残差进行拟合:
y
i
^
(
t
)
=
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
\hat{y_i}^{(t)}=\hat{y_i}^{(t-1)}+f_t(x_i)
yi^(t)=yi^(t−1)+ft(xi)
那么目标函数形式变为:
ι
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
i
^
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
{\iota}^{(t)}=\sum_{i=1}^n{l(y_i,\hat{y_i}^{(t-1)}+f_t(x_i))+\Omega (f_t)}
ι(t)=i=1∑nl(yi,yi^(t−1)+ft(xi))+Ω(ft)
然后在二阶
f
t
=
0
f_t=0
ft=0处展开:
ι
(
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
)
{\iota}^{(t)} \thickapprox \sum_{i=1}^n{[l(y_i,\hat{y_i}^{(t-1)}+g_if_t(X_i)+\frac{1}{2} h_i {f_t}^2(X_i)]+\Omega (f_t)}
ι(t)≈i=1∑n[l(yi,yi^(t−1)+gift(Xi)+21hift2(Xi)]+Ω(ft)
g
i
g_i
gi为一阶导
h
i
h_i
hi为二阶导,在整个式子中预测分数与残差是确定部分不会对结果产生影响,我们可以不考虑这一部分的结果,进而把目标函数的简化为:
ι
~
(
t
)
≈
∑
i
=
1
n
[
g
i
f
t
(
X
i
)
+
1
2
h
i
f
t
2
(
X
i
)
]
+
Ω
(
f
t
)
~ \tilde{\iota}^{(t)} \thickapprox \sum_{i=1}^n{[g_if_t(X_i)+\frac{1}{2} h_i {f_t}^2(X_i)]+\Omega (f_t)}
ι~(t)≈i=1∑n[gift(Xi)+21hift2(Xi)]+Ω(ft)
每个样本都最终会落到一个叶子结点中,所以我们可以将所以同一个叶子结点的样本重组起来,过程如下图
们可以将目标函数改写成关于叶子结点分数w的一个一元二次函数,求解最优的w和目标函数值就变得很简单了,直接使用顶点公式即可。因此,最优的w和目标函数公式为:
w
j
∗
=
−
G
j
H
i
+
λ
w_j^*=-\frac{G_j}{H_i+\lambda}
wj∗=−Hi+λ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
四、分裂算法
ps转载XGBoost: A Scalable Tree Boosting System的论文翻译https://blog.csdn.net/qdbszsj/article/details/79615712
1)exact greedy algorithm 贪心算法就是暴力地遍历所有可能的分割点,xgb也支持这种做法:
当数据量过大,传统算法就不好用了,因为要遍历每个分割点,甚至内存都放不下。
2)近似算法能加快运行时间:
这个算法根据特征的分布情况,然后做个proposal,然后这一列的分割点就从这几个proposed candidate points里选,能大大提高效率。这里有两种proposal的方式,一种是global的,一种是local的,global的是在建树之前就做proposal然后之后每次分割都要更新一下proposal,local的方法是在每次split之后更新proposal。通常发现local的方法需要更少的candidate,而global的方法在有足够的candidate的时候效果跟local差不多。
3)
五、缺失值处理
在机器学习中缺失值是经常会出现的一个问题,面对一堆数据首先需要发现缺失值,常见的做法一般会有那么集中,在这里只简述一下,删除有缺失值的特征、统计量填充——(连续值一般用中位数离散数据一般用众数)、或者不处理()
大家可能都有一个疑惑,为什么对很多人说XGB或者LGB对缺失值不敏感呢,当用缺失值的训练XGB时,算法不会报错,其实这个不能叫不敏感,而是算法本身自己有一套缺失值处理算法,比如XGB,它会把含有缺失值的数据分别分到左右两个子节点,然后计算着两种情况的损失,最后,选取较好的划分结果和对应的损失。在分割的时候,这个系统还能感知稀疏值,我们给每个树的结点都加了一个默认方向,当一个值是缺失值时,我们就把他分类到默认方向,每个分支有两个选择,具体应该选哪个?这里提出一个算法,枚举向左和向右的情况,哪个gain大选哪个:
六、优缺点
xgBoosting在传统Boosting的基础上,利用cpu的多线程,引入正则化项,加入剪纸,控制了模型的复杂度。
与GBDT相比,xgBoosting有以下进步:
1)GBDT以传统CART作为基分类器,而xgBoosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);
2)GBDT在优化时只用到一阶导数,xgBoosting对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;
3)当样本存在缺失值是,xgBoosting能自动学习分裂方向;
4)xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
5)xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
6)xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
7)xgBoosting工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;
8)可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;
然而,与LightGBM相比,又表现出了明显的不足:
1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;
2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合.
https://blog.csdn.net/xwd18280820053/article/details/68927422
七、sklearn参数
常规参数
booster
gbtree 树模型做为基分类器(默认)
gbliner 线性模型做为基分类器
silent
silent=0时,不输出中间过程(默认)
silent=1时,输出中间过程
nthread
nthread=-1时,使用全部CPU进行并行运算(默认)
nthread=1时,使用1个CPU进行运算。
scale_pos_weight
正样本的权重,在二分类任务中,当正负样本比例失衡时,设置正样本的权重,模型效果更好。例如,当正负样本比例为1:10时,scale_pos_weight=10。
模型参数
n_estimatores
含义:总共迭代的次数,即决策树的个数
调参:
early_stopping_rounds
含义:在验证集上,当连续n次迭代,分数没有提高后,提前终止训练。
调参:防止overfitting。
max_depth
含义:树的深度,默认值为6,典型值3-10。
调参:值越大,越容易过拟合;值越小,越容易欠拟合。
min_child_weight
含义:默认值为1,。
调参:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。
subsample
含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
colsample_bytree
含义:训练每棵树时,使用的特征占全部特征的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
学习任务参数
learning_rate
含义:学习率,控制每次迭代更新权重时的步长,默认0.3。
调参:值越小,训练越慢。
典型值为0.01-0.2。
objective 目标函数
回归任务
reg:linear (默认)
reg:logistic
二分类
binary:logistic 概率
binary:logitraw 类别
多分类
multi:softmax num_class=n 返回类别
multi:softprob num_class=n 返回概率
rank:pairwise
eval_metric
回归任务(默认rmse)
rmse–均方根误差
mae–平均绝对误差
分类任务(默认error)
auc–roc曲线下面积
error–错误率(二分类)
merror–错误率(多分类)
logloss–负对数似然函数(二分类)
mlogloss–负对数似然函数(多分类)
gamma
惩罚项系数,指定节点分裂所需的最小损失函数下降值。
调参:
alpha
L1正则化系数,默认为1
lambda
L2正则化系数,默认为1
http://www.cnblogs.com/wanglei5205/p/8579244.html