【XGBoost、LightGBM、CatBoost】

XGBoost

  • 为什么会有XGBoost?
    Boosting方法需要不断迭代来生成模型,每次迭代都有新树出现,如果数据集比较复杂,那么计算量会很大,XGBoost就是为了解决这个问题而出现的。陈天奇用C++实现,多线程方式实现回归树并行构建,再改进一下算法,提升训练速度和预测精度。

XGBoost和GBDT的区别

  • 基分类器:GBDT用CART作为基分类器,而XGB支持线性分类器,还自带正则化项
  • 二阶泰勒展开:GBDT优化时只用了一阶导数信息,而XGB对Loss function进行二阶泰勒展开,且xgb支持自定义损失函数,只要可以求二阶导就行
  • 方差权衡:XGBoost在目标函数中加入正则项,用来控制模型复杂度,正则项包括树的叶子节点个数T、每个叶子节点上输出分数的L2模的平方和.
    (在计算划分增益时,如果gain < gamma, 不划分,gain> gamma,划分,这相当于决策树的预剪枝。 gamma是叶节点个数的参数)
  • 列抽样:借鉴随机森林,可以减低过拟合,减少计算,也支持在划分节点时,只考虑部分属性
  • 缺失值处理:xgb可以自动学习出缺失值的分裂方向(尝试所有分裂方向,选gain最大的)
  • 并行运算:这个并行化是特征粒度上的并行化;决策树最耗时的一步是确定最佳分割点时对特征值的排序,将排序后的特征值放在block中,以后划分特征的时候,只需要遍历一次即可。进行分裂时,需要计算每个特征的增益,这些增益计算也可以开多线程进行
  • 可并行的近似直方图算法:贪心算法在选择最佳划分方式时需要遍历所有的划分点子集,在数据非常大时,这会非常低效,xgboost提出了近似直方图计算,根据数据的二阶导信息进行排序,提出一些候选划分点子集。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。
  • shrinkage缩减 ϵ ϵ ϵ相当于学习速率,xgb完成一次迭代后,会将叶子节点的权重乘上该稀疏, y ( t ) = y ( t − 1 ) + ϵ f t ( x i ) y^{(t)}=y^{(t-1)}+ϵf_t(x_i) y(t)=y(t1)+ϵft(xi),主要是为了削弱每棵树的影响,让后面有更大学习空间

XGBOOST步骤

一、从监督学习角度出发
提升树本身是监督学习算法,重要组成部件包括:模型、参数、目标函数和优化算法,其中目标函数包括误差函数正则化项

二、回归树和树的集成模型
xgb是由GBDT而来,GBDT由Boosting Tree而来,Boosting Tree的基本组成部分是回归树。

  • 回归树的特点是:根据输入属性来分配到各个叶子节点,每个叶子节点都有一个实数分数
  • 树的集成(ensemble):把多个回归树的预测结果加起来,得到更好的预测结果。我们认为树集成模型中,参数对应了树的结构和每个叶子结点上的预测分数

三、目标函数推导过程
我们要学习树集成模型的参数,所以定义一个合理的目标函数,尝试优化它

  1. 树集成模型可以写成:
    在这里插入图片描述
    f是函数空间F里的函数,F对应所有回归树的集合

  2. 目标函数遵循监督学习的规则,写成:
    在这123述
    前面是训练损失,例如平方损失,后面是每棵树的复杂度之和。
    参数可以认为是在一个函数空间里面,无法使用传统的SGD方法学习模型,所以采用additive training,即每次迭代生成一颗新的回归树,从而使得预测值不断逼近真实值,每次都保留原来的模型,再加入新的函数进去。
    在这里插入图片描述

  3. 根据上图式子,改写目标函数,问题转变成如何选取每一轮中加入的f(x),答案是选取的f(x)必须使目标函数尽量最大地降低
    在这里插入图片描述
    如果是使用平方误差作为损失函数,那么目标函数就是:在这里插入图片描述
    如果不是,也可以通过二阶泰勒展开,近似来定义一个近似的目标函数,泰勒展开的一般表达式:
    在这里插入图片描述
    首先要近似我们原来的目标,一阶导数定义为g,二阶导数定义为h:
    在这里插入图片描述
    最后得到:
    在这里插入图片描述

  4. 训练误差部分讨论完,开始关注树的复杂度. 首先把树拆分成结构部分q叶子权重部分w,q对应叶子的索引号,w对应每个带有索引号的叶子的分数,T为叶子个数
    在这里插入图片描述
    由此得到,树的复杂度包括:
    (1)一棵树的节点个数
    (2)每个叶子节点上面输出分数的L2范数平方
    在这里插入图片描述

  5. 最关键的步骤:目标函数最小化

I I I被定义为每个叶子上面样本集合 I j = { i ∣ q ( x i ) = j } I_j = \{i | q(x_i) = j\} Ij={iq(xi)=j},q(xi)要表达的是:每个样本值xi 都能通过函数q(xi)映射到树上的某个叶子节点,这个定义把下面两个累加统一在一起
目标函数经过上面的变化,可以改写成:
在这里插入图片描述
此时目标函数里出现了两种累加:(此点来自七月在线,我还没理解~)

  • 一种是 - > n(样本数)
  • 一种是 -> T(叶子节点数)

这一个目标包含了T个相互独立的单变量二次函数,意味着单个叶子的权重计算与其他叶子的权重无关,我们可以方便计算第j个叶子的权重和目标函数。

定义简单的表示,并改写目标函数,假设我们知道了树结构q,就可以求解出最好的w,以及最好的w对应的目标函数最大增益
在这里插入图片描述
在这里插入图片描述
通过对 w j w_j wj求导等于0,可以得到
在这里插入图片描述

额外解释:目标函数与回归树的结构q函数的关系怎么看?

目标函数中的 G j 和 H j G_j和H_j GjHj的取值由第 j j j个树叶上数据样本决定的,第 j j j个树上具有的数据样本是由树结构q函数决定的。只要目标函数计算出来,那么回归树生成问题转化成找到一个最优的树结构q,使得它有最小的目标函数。目标函数最多减少多少,就是树的结构分数,类似于树的打分函数

找到最优树结构的方法—枚举树的结果—贪心法

利用打分函数,通过不断枚举不同树的结构,可以找到最优的树,但是这个操作不太行,情况太多了,计算复杂,所以要做点优化,xgboost用了贪心法;

贪 心 法 : 先 按 照 某 个 特 征 里 的 值 进 行 排 序 , 然 后 线 性 扫 描 该 特 征 进 而 确 定 最 好 的 分 割 点 , 最 后 对 所 有 特 征 进 行 分 割 后 , 我 们 选 择 所 谓 的 增 益 G a i n 最 高 的 那 个 特 征 , 增 益 可 由 如 下 公 式 计 算 得 到 : \color{blue}贪心法:先按照某个特征里的值进行排序,然后线性扫描该特征进而确定最好的分割点, 最后对所有特征进行分割后,我们选择所谓的增益Gain最高的那个特征,增益可由如下公式计算得到: 线Gain

在这里插入图片描述
这个Gain的计算可以从信息增益或基尼系数中启发出来,就是用分裂后的值减去分列前的值,从而得到增益。有时候分裂不一定好,所以加了个阈值,增益要大于阈值才能分裂。 γ \gamma γ是正则项里叶子节点数T的系数,所以xgboost在优化目标函数的同时相当于做了预剪枝。 λ \lambda λ是L2模平方的稀疏,对叶子节点分数做了平滑,起到防止过拟合的作用.

LightGBM

原理与xgb类似,采用损失函数的负梯度作为当前决策树的残差近似值,去拟合新的决策树. LightGBM相对于xgb,有相近的准确率,且是xgb训练速度的20倍,所以就是优化了速度。

上文已经介绍了xgb的优点,接下来说下缺点。

XGBoost的缺点
  • 需要pre-sorted,会消耗很多内存空间(2datafeatures)
  • 数据分割点上,对不同特征使用pre-sorted,而不同特征中的值得顺序又不相同,分裂时要对每个特征单独做依次分割,遍历次数为data*features
  • 处理粒度太细,计算多
  • 由于pre-sorted处理数据,在寻找特征分裂点时(level-wise),会产生大量的cache随机访问

LightGBM优点

那么lightgbm肯定就是针对xgboost的缺点进行优化啦~

  1. 不用pre-sorted,用直方图算法代替,其中包含一些tricks,如histogram做差,使用带深度限制的leaf-wise的叶子生长策略来提高cache命中率
  2. 通过对数据采样来提高训练速度,lgb用GOSS算法(基于梯度的one-side采样)
  3. 采用EFB(互斥的特征捆绑)来预处理稀疏数据
直方图算法
  1. 把连续的浮点特征值离散化成k个正数,构造一个宽为k的直方图
  2. 遍历数据,根据离散化后的值作为索引,在直方图中积累统计量
  3. 根据直方图离散值,遍历寻找最优的分割点

优点:

  • 只用对统计量计算信息增益,比pre-sorted每次都遍历所有值的计算,要小很多
  • 内存空间需要相对较小,只需保存离散值,占用内存大小为datafeatures1Byte
  • 求子节点相应的feature histogram时,只需构造一个子节点的feature histogram,另外一个子节点的feature histogram用父节点的histogram减去刚构造出来的子节点的histogram便可,时间复杂度就压缩到O(k),k为histogram的桶数。这是一个很巧妙的做差法。
Gradient-based One-Side Sampling(GOSS)梯度单边采样

思想保留较大梯度实例同时对较小梯度随机采样的方式减少计算量,从而达到提升效率的目的

我们认为梯度小说明训练误差小,对改善结果精度没有太大帮助,那就这些梯度值小的训练样本进行采样。

步骤

  1. 选取前a%个较大梯度的值作为大梯度值的训练样本
  2. 从剩余的1 - a%个较小梯度的值中,我们随机选取其中的b%个作为小梯度值的训练样本
  3. 对于较小梯度的样本,也就是b% * (1 - 1%) * #samples,我们在计算信息增益时将其放大(1 - a) / b倍

总的来说就是a% * #samples + b% * (1 - a%) * #samples个样本作为训练样本。 而这样的构造是为了尽可能保持与总的数据分布一致,并且保证小梯度值的样本得到训练。

EBF(Exclusive Feature Bunding)独立特征合并

为了解决数据稀疏的问题,其实是一种降维技术,可以提升计算效率。通过捆绑互斥的特征,互斥(一个特征值为零,另一个不为零)就可以不丢失信息;如果不完全互斥,要计算冲突比率,如果较小,也可以捆绑在一起。

要做好这个事,关注两个问题:
1.如何确定哪些特征融合且效果好?
2.如何将特征合并到一起?
解决方法就不说了,暂时不理解~

步骤:

  • 将特征按照非零值的个数进行排序
  • 计算不同特征之间的冲突比率
  • 遍历每个特征并尝试合并特征,使冲突比率最小化

Leaf-wise决策树生长策略

Level-wise就是不加区分的对待同一层的叶子,实际上很多叶子的分裂增益很低,带来不必要的开销,但是因为Level-wise可以防止过拟合,所以决策树算法经常用它。

Lightgbm认为Leaf-wise可以带来更好的精度,产生更好精度的节点做分裂,为了控制过拟合,使用max_depth来控制它的最大高度,并且lgb做数据合并时,histogram和GOSS等起到天然正则化作用,所以用Leaf-wise挺好的

Catboost【categoriacal boosting】

三个优点:

  • 特殊方式处理类别特征,计算类别特征出现频率,加上超参数,生成新的数值特征,不需要我们手动处理类别特征
  • 组合类别特征,利用特征之间的练习,极大丰富了特征维度
  • 基模型采用对称树,
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值