算法梳理—-006XGBoost

目录
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=1iIpi2 那么在特征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)=DD1Gini(D1)+DD2Gini(D2)节点越不纯,GINI值越大,样本集合的不确定性也会越大的。以二分类为例,如果节点的所有数据只有一个类别,则 G i n i = 1 − ∑ i ∈ I p i 2 = 0 Gini=1-\sum_{i \in I}{p_i}^2=0 Gini=1iIpi2=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=1iIpi2=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}} σ=iI(xiμ)2 =iIxi2nμ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=iIpiGinii而对于回归树 G a i n = ∑ i ∈ I σ i Gain=\sum_{i\in I}{\sigma}_i Gain=iIσ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)={xx(j)s} R 2 ( j , s ) = { x ∣ x ( j ) > s } R_2(j,s)=\{{x | x^{(j)}}> s\} R2(j,s)={xx(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[c1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)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=1nl(yi,yi^)+k=1KΩ(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^(t1)+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=1nl(yi,yi^(t1)+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=1n[l(yi,yi^(t1)+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=1n[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=1THj+λ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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值