高级算法梳理 Task3 XGB

1. XGB简介

  1. 全称:eXtreme Gradient Boosting(极值梯度提升算法)
  2. 作者:陈天奇(华盛顿大学博士)
  3. 基础:GBDT
  4. 所属:boosting迭代型、树类算法。
  5. 适用:分类、回归等
  6. 优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。

xgboost是由梯度提升树GBDT发展而来。梯度提升树可以有回归树和分类树,两者都是以CART树算法为主流,xgboost背后也是CART树,这意味着xgboost中所有树都是二叉树。XGBoost其实是对GBDT算法的一种改良实现,主要包括了正则化、损失函数、学习策略、并行实现等一些方面。

2. XGB基础

2.1 回归树与决策树

事实上,分类与回归是一个型号的东西,只不过分类的结果是离散值,回归是连续的,本质是一样的,都是特征(feature)到结果/标签(label)之间的映射。

分类树的样本输出(即响应值)是类的形式,如判断蘑菇是有毒还是无毒,周末去看电影还是不去。而回归树的样本输出是数值的形式,比如给某人发放房屋贷款的数额就是具体的数值,可以是0到120万元之间的任意值。那么,这时候你就没法用信息增益、信息增益率、基尼系数来判定树的节点分裂了,你就会采用新的方式,预测误差,常用的有均方误差、对数误差等。而且节点不再是类别,是数值(预测值),确定节点的方法,有的是节点内样本均值,有的是最优化算出来的比如Xgboost。

2.2 集成思想

在学习XGBoost之前,需要先明白集成思想。集成学习方法是指将多个学习模型组合,以获得更好的效果,使组合后的模型具有更强的泛化能力。另外XGBoost是以分类回归树(CART树)进行组合。故在此之前,我们先看下CART树。如下,通过输入用户年龄、性别进行判断用户是否喜欢玩游戏的得分值。由此得到一颗CART树模型。
在这里插入图片描述

于单个的决策树模型容易出现过拟合,并且不能在实际中有效应用。所以出现了集成学习方法。如下图,通过两棵树组合进行玩游戏得分值预测。其中tree1中对小男生的预测分值为2,tree2对小男生的预测分值为0.9。则该小男生的最后得分值为2.9。
在这里插入图片描述
与boosting集成学习对比的是random foreast(随机森林)算法,各个决策树是独立的、每个决策树在样本堆里随机选一批样本,随机选一批特征进行独立训练,各个决策树之间没有啥关系。

3. XGB算法原理

这篇文章是目前看到介绍最好的 :xgboost原理分析以及实践

4. 损失函数

对于回归问题,损失函数是均方差之和;对于分类问题,损失函数是对数损失函数。
在这里插入图片描述

5. 分裂结点算法

如何来寻找一个最优结构的树,加入到我们的模型中?常用的是贪心法,每一次尝试对已经的叶子加入一个分割,对一个具体的分割方案,我们可以获得分割后的增益为:
在这里插入图片描述
如果Gain<0,则此节点不应该split成左右两支。
对于每次扩展,我们还是要枚举所有可能的分割方案,实际应用中,先将 g i g_i gi从小到大排序,然后进行遍历,看每个结点是否需要分裂。
包括贪心算法陈天奇论文中一共提到了三种分裂算法:

5.1 贪心算法(exact greedy algorithm)

在这里插入图片描述
当数据量过大,由于要遍历每个分割点,十分消耗内存,贪心算法就显得不再适用,所以提出了额外一种近似算法能加快运行时间。

5.2 近似算法(approximate algorithm)

近似算法根据特征的分布情况,先提出proposal,然后分割点就从候选proposal中选择,该算法大大的提高了效率。这里有两种proposal的方式,global、local的。global的是在建树之前就做proposal然后之后每次分割都要更新一下proposal,local的方法是在每次分裂之后更新proposal。
在这里插入图片描述

5.3 分布式加权直方图算法 (Weighted Quantile Sketch)

近似算法在特征分布然后做proposal的时候,用到了加权分位直方图。将数据投射在一个小的存储空间内作为整个数据的概要,需要分裂节点时查看数据概要,以此来减少计算分裂节点是的用于储存数据的内存。

6. 正则化

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项中包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。 正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合。

xgboost在目标函数中使用了正则化惩罚项。gama越大,越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大;lambda越大也是越希望获得结构简单的树。

7. 对缺失值处理

XGBoost处理缺失值的方法如下图所示(截取自陈天奇论文),XGBoost把缺失值当做稀疏矩阵来对待,节点分裂时不考虑的缺失值的数值。在训练模型时训练模型时缺失数据会被分到左子树和右子树分别计层损失,选取结果较优的子树。在预测时预测数据中的缺失值,默认分类到右子树。

8. 优缺点

优点:
(1)xgBoosting支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题);
(2)xgBoosting对代价函数做了二阶Talor展开,引入了一阶导数和二阶导数;
(3)当样本存在缺失值是,xgBoosting能自动学习分裂方向;
(4)xgBoosting借鉴RF的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算;
(5)xgBoosting的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合;
(6)xgBoosting在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间;
(7)xgBoosting工具支持并行,但并不是tree粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,xgBoosting在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行;
(8)可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂;

缺点:
(1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;
(2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大(3)如果遇到损失函数二阶不可导的时候,xgboost就无法发挥作用了.

(4)XGBoost在每轮迭代时,都需要遍历整个训练数据多次。若把整个训练数据装进内存则会消耗大量内存,但是不装进内存,反复地读写训练数据又会消耗大量通信时间。

(5)预排序方法导致空间、时间消耗大。因为该算法需要保存数据的特征值,还保存了特征排序的结果需要消耗训练数据两倍的内存,在遍历每一个分割点的时候,都需要进行分裂增益的计算,花费时间多。

(6)对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。

9. 应用场景

XGboost能够在一系列的问题上取得良好的效果,这些问题包括存销预测、物理事件分类、网页文本分类、顾客行为预测、点击率预测、动机探测、产品分类。多领域依赖数据分析和特征工程在这些结果中扮演重要的角色。XGBoost在所有场景中提供可扩展的功能,XGBoost可扩展性保证了相比其他系统更快速,XGBoost算法优势具体体现在:处理稀疏数据的新颖的树的学习算法、近似学习的分布式加权直方图。XGBoost能够基于外存的计算,保障了大数据的计算,使用少量的节点资源可处理大量的数据。

10. XGboost参数解析

XGBoost 参数

在运行XGBoost程序之前,必须设置三种类型的参数:通用类型参数(general parameters)、booster参数和学习任务参数(task parameters)。
  一般类型参数general parameters –参数决定在提升的过程中用哪种booster,常见的booster有树模型和线性模型。
  Booster参数-该参数的设置依赖于我们选择哪一种booster模型。
  学习任务参数task parameters-参数的设置决定着哪一种学习场景,例如,回归任务会使用不同的参数来控制着排序任务。
  命令行参数-一般和xgboost的CL版本相关。

Booster参数:
  1. eta[默认是0.3] 和GBM中的learning rate参数类似。通过减少每一步的权重,可以提高模型的鲁棒性。典型值0.01-0.2
  2. min_child_weight[默认是1] 决定最小叶子节点样本权重和。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。这个参数需要用cv来调整
  3. max_depth [默认是6] 树的最大深度,这个值也是用来避免过拟合的3-10
  4. max_leaf_nodes 树上最大的节点或叶子的数量,可以代替max_depth的作用,应为如果生成的是二叉树,一个深度为n的树最多生成2n个叶子,如果定义了这个参数max_depth会被忽略
  5. gamma[默认是0] 在节点分裂时,只有在分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。这个参数值越大,算法越保守。
  6. max_delta_step[默认是0] 这参数限制每颗树权重改变的最大步长。如果是0意味着没有约束。如果是正值那么这个算法会更保守,通常不需要设置。
  7. subsample[默认是1] 这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合。典型值:0.5-1
  8. colsample_bytree[默认是1] 用来控制每颗树随机采样的列数的占比每一列是一个特征0.5-1
  9. colsample_bylevel[默认是1] 用来控制的每一级的每一次分裂,对列数的采样的占比。
  10. lambda[默认是1] 权重的L2正则化项
  11. alpha[默认是1] 权重的L1正则化项
  12. scale_pos_weight[默认是1] 各类样本十分不平衡时,把这个参数设置为一个正数,可以使算法更快收敛。

通用参数:
  1. booster[默认是gbtree]
  选择每次迭代的模型,有两种选择:gbtree基于树的模型、gbliner线性模型
  2. silent[默认是0]
  当这个参数值为1的时候,静默模式开启,不会输出任何信息。一般这个参数保持默认的0,这样可以帮我们更好的理解模型。
  3. nthread[默认值为最大可能的线程数]
  这个参数用来进行多线程控制,应当输入系统的核数,如果你希望使用cpu全部的核,就不要输入这个参数,算法会自动检测。

学习目标参数:
  1. objective[默认是reg:linear]
  这个参数定义需要被最小化的损失函数。最常用的值有:binary:logistic二分类的逻辑回归,返回预测的概率非类别。multi:softmax使用softmax的多分类器,返回预测的类别。在这种情况下,你还要多设置一个参数:num_class类别数目。
  2. eval_metric[默认值取决于objective参数的取之]
  对于有效数据的度量方法。对于回归问题,默认值是rmse,对于分类问题,默认是error。典型值有:rmse均方根误差;mae平均绝对误差;logloss负对数似然函数值;error二分类错误率;merror多分类错误率;mlogloss多分类损失函数;auc曲线下面积。
  3. seed[默认是0]
随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数。

11. 参考资料

XGBoost原理介绍------个人理解版
通俗、有逻辑的说下Xgboost的原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值