【算法梳理Task3】XGB算法梳理

目录

1.XGB

2.CART树

3.损失函数

4.分裂结点算法

5.正则化

6.算法(怎么学习)

7.对缺失值处理

8.优缺点

9.应用场景

10.sklearn参数


1.XGB

XGBoost(eXtreme Gradient Boosting)是一种tree boosting的可扩展机器学习系统。这个系统可以作为开源的软件包使用。

XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携。 它在Gradient Boosting框架下实现机器学习算法。 XGBoost提供了并行树提升(也称为GBDT,GBM),可以快速准确地解决许多数据科学问题。 相同的代码在主要的分布式环境(Hadoop,SGE,MPI)上运行,并且可以解决超过数十亿个样例的问题。

2.CART树

分类与回归树(Classification and Regression Trees, CART)是由四人帮Leo Breiman, Jerome Friedman, Richard Olshen与Charles Stone于1984年提出,既可用于分类也可用于回归。不同于C4.5,CART本质是对特征空间进行二元划分(即CART生成的决策树是一棵二叉树),并能够对标量属性(nominal attribute)与连续属性(continuous attribute)进行分裂。

CART算法流程:

  1. 若满足停止分裂条件(样本个数小于预定阈值,或Gini指数小于预定阈值(样本基本属于同一类,或没有特征可供分裂),则停止分裂;
  2. 否则,选择最小Gini指数进行分裂;
  3. 递归执行1-2步骤,直至停止分裂。

3.损失函数

学习策略或者学习目标。

如下:

第一项为训练误差,第二项为正则化项,用来刻画模型的复杂程度。具体形式将在(5.正则化)中介绍。

XGBoost度损失函数进行了二阶泰勒展开:

【算法梳理Task3】XGB算法梳理_第1张图片

从损失函数中我们能够看出,我们希望得到一个预测性好的简单模型。预测性好的模型偏差较小,简单模型方差较小。

4.分裂结点算法

对于每一个叶子节点,尝试进行分裂,分裂前后目标函数的差值为:

第一项为左子节点的得分,第二项为右子节点的得分,第三项为增加一个额外节点复杂度的损失。

采用贪心算法寻找最优分裂点:对每个特征,对它的可能取值进行排序,并通过线性扫描从中找到该特征的最优分裂点,之后找到所有特征中的最优分裂点。

论文中的方法:

1)贪心算法

【算法梳理Task3】XGB算法梳理_第2张图片

2)近似算法:针对数据太大,不能直接进行计算

【算法梳理Task3】XGB算法梳理_第3张图片

通过特征的分布,按照分布式加权直方图算法确定一组候选分裂点,通过遍历所有的候选分裂点来找到最佳分裂点。 
在寻找split point的时候,不会枚举所有的特征值,而会对特征值进行聚合统计,然后形成若干个bucket(桶),只将bucket边界上的特征值作为split point的候选,从而获得性能提升。

5.正则化

定义了一种模型复杂度(不唯一):

T表示叶子节点的数量,第二项表示叶子节点得分的L2范数。

这里出现了γ和λ,这是xgboost自己定义的,在使用xgboost时,可以设定它们的值,显然,γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。

6.算法(怎么学习)

  • 1)目标函数为:(学习的目标是找到模型空间中目标函数最小的模型)

  • 2)怎么学?—>Additive Training (Boosting)。一次只添加一棵树

【算法梳理Task3】XGB算法梳理_第4张图片

  • 3)添加哪一棵树?—>优化目标函数之后可以得到新添加树满足的条件

左边第二项是我们需要新添加的树。

所以新添加的树应该是的红圈中的部分最小。

  • 4)对于上述增量形式的目标函数

当考虑平方损失时,可以得到:

考虑更一般的情况,将目标函数第一项泰勒展开,略去高次得到如下形式:

去除常数项之后我们的找新的目标函数

  • 5)依据正则化的定义,将正则化项代入得:

【算法梳理Task3】XGB算法梳理_第5张图片

假设树的结构是定的,可以得到叶子节点的最优得分以及对应的目标函数的值:

但是树的可能的结构有无穷多个,不能进行枚举。

  • 6)怎么生成一棵树?(贪心算法)

(1)单节点树

(2)节点分裂算法(见4.分裂节点算法)

(3)怎样找到最优分裂?

         对每个特征,对它的可能取值进行排序,并通过线性扫描从中找到该特征的最优分裂点,之后找到所有特征中的最优分裂点。

  • 7)总体流程

(1)每轮添加一颗新树

(2)在每一轮中:

         计算:

        贪心算法生成一棵树:

       将新生成的树添加到模型中:

7.对缺失值处理

XGB训练数据的时候,它使用没有缺失的数据去进行节点分支。然后我们将特征上缺失的数据尝试放左右节点上,看缺失值应当分到那个分支节点上。我们把缺失值分配到的分支称为默认分支。这能大大提升算法的效率。

【算法梳理Task3】XGB算法梳理_第6张图片       

8.优缺点

与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/u013363120/article/details/80195471

9.应用场景

可以用于分类和回归问题。在数据挖掘等相关竞赛以及实际工程中都有应用。

10.sklearn参数

  • objective [ default=reg:linear ]

      定义学习任务及相应的学习目标,可选的目标函数如下:

      “reg:linear” –线性回归。

      “reg:logistic” –逻辑回归。

      “binary:logistic” –二分类的逻辑回归问题,输出为概率。

      “binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。

      “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。 在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)

      “multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)

      “multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。

  • ’eval_metric’ 评估指标:对于回归问题,默认值是rmse,对于分类问题,默认值是error。 

      “rmse”: 均方根误差

      “logloss”: 负对数似然函数值

      “error”: 二分类错误率(阈值为0.5) 

      “merror”: 多分类错误率 

      “mlogloss”: 多分类logloss损失函数 

      “auc”: ROC曲线下面积 

       "mae":平均绝对误差

  • lambda [default=0] 

      L2 正则的惩罚系数

  • alpha [default=0] 

      L1 正则的惩罚系数

  • lambda_bias 

      在偏置上的L2正则。缺省值为0

  • eta [default=0.3] 

      为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3 。取值范围为:[0,1]

  • max_depth [default=6] 

      数的最大深度。缺省值为6 ,取值范围为:[1,∞]

  • min_child_weight [default=1] 

      孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative 。取值范围为: [0,∞]

  • tree_method[default=’auto’]

      可选 {‘auto’, ‘exact’, ‘approx’} 贪心算法(小数据集)/近似算法(大数据集) 

参考:https://www.cnblogs.com/harvey888/p/7203256.html

你可能感兴趣的:(【算法梳理Task3】XGB算法梳理)