lightgbm 保存模型 过大_gradient boost, xgboost 和 lightgbm 三讲

最近忙着秋招,所以很少有时间再续写新的内容,虽然一直想把自己的机器学习心得更多的写下来,但是奈何作者还要每天疯狂刷leetcode准备面试。 另外希望大家给以评论和点赞,让我感觉有一些互动和一些探讨。

说到以上三种boost算法,我们就必须要说一个叫做提升算法的东西,它是以上三种算法的基础中的基础也是重点中的重点。

提升算法

所以什么是提升算法呢? 直观的理解便是梯度下降(不知道梯度下降的请去参观我的梯度下降文章),

假设我们有一样本,

,当
通过一决策树(学习器)dt预测出一个
后,我们然后建立一个loss function去进行梯度下降,对你没看错,即使是决策树依然可以进行一种特别的梯度下降,这里多种loss function都可以被使用比如
或者
。在这里我们以
作为例子进行讲解。

被制作出来以后,我们想使这个loss达到最小怎么办呢? 最直接的办法就是梯度下降(神经网络的时代梯度下降就是王者)。 但是和逻辑回归和线性回归不同的是,这里我们是没有w参数的,所以我们就直接对
进行梯度下降,梯度为
,那么参数更新为
。在这里,
就是我们所谓的残差,因此,其实就是在
的基础上,进行残差叠加。当然,因为这里我们采用了square mean所以残差是
,其实真实残差便是
。此外一般除了square mean以外,我们还有用
,其导数为
,所以残差为
。然后我们再对样本进行拓展,假设有n个样本,那么
, 同理新的梯度就是

然后我们再看看下面的图片理解一下

c958c6d164a74a1978cd7631050337c9.png

每一次更新以后的值将会再进入一个dt模型进行预测,所以,我们根据这种特性,建立了一种使用真残差的方法,这就是gradient boost。基本的思路就是,先用一个决策树dt,用x值预测出

,然后根据
去得到一个真残差
, 再用一个决策树dt,用
的值去预测出
,然后根据
去得到一个真残差
,以此类推知道最后的
小于某一个阈值。这里看似简单,但是请大家按照提升算法的思想去理解整个推理过程。

对于gradientboost的预测最后只需要

142dfcd9d64828bae792c1e2eb103476.png

632e6acc87bdee405d5f3dd610b5f548.png

以上就是gradientboost的基本思路,下面我们要说的就是强大的xgboost,其实xgboost的思路有了gradientboost做为蓝本就很好理解了。

xgboost

说到xgboost,这里就先吹一下作者陈天齐,不得不说,天齐大神这一方法,居然在老外遍地走的机器学习领域开创了先河,且一直维持到了现在还屹立不倒,真的可谓是,华人之光。

二阶导的应用

我们可以看出,以上的gradientboost其实是对

求一阶导数,那么有人就提出了可不可以用二阶导数求解呢? 事实告诉我们,可以,大学大家都知道有一个叫泰勒展开的东西吧,没错,我们使用泰勒展开就可以求二阶导数。

根据泰勒展开

我们假设

,
可以理解为第t-1颗决策树的预测值,
(未知量)可以理解为需要下降的步长,为t颗位置决策树的值。
代表了正则项, 这里
表示决策树叶子个数,
表示决策树叶子节点的预测值的平方。

7ce78e166ebcdcc276fe0d55ef62d501.png

这里要解释一下,在以上公式中

然后根据

去求出
,

f2f3bcea924ba4474aebb5a05e92774e.png

本来为样本
在决策树t上的值,但是我们可以将其转化为
在叶子节点j中的值。

08e02ccebfb2873462bd7f04094a4185.png

被求出来以后,带入
,然后以
作为决策树的分裂标准去建立决策树,也就是

至此,xgboost讲解完毕,总结一下就是,xgboost一般来说是要两颗树以上,第一棵树,先生成一个

,然后从第二颗数开始,做
的xgboost过程。

今天先讲到这里,明天将为大家补上lightgbm!!!

Lightbgm

lightgbm主要是对于一些回归问题(不懂回归的请补一下回归树的课程)的加速处理其速度可以达到xgboost的5倍左右,且相同精度。

GOSS(Gradient-based One Side Sampling )

lightgbm的第一个加速算法叫GOSS, 其原理是adboost的原理,对于梯度少的样本就抛弃它(证明学的很好),梯度大的样本就进行前向。其具体步骤为,

  1. 根据梯度的绝对值将样本进行降序排序
  2. 选择前 ×100%的样本,这些样本称为A
  3. 剩下的数据(1− )×100% 的数据中,随机抽取 ×100%的数据,这些样本称为B
  4. 在计算增益的时候,放大样本B中的梯度(1− )/ 倍

使用GOSS进行采样,使得训练算法更加的关注没有充分训练(under-trained)的样本,并且只会稍微的改变原有的数据分布。

详情见下图

f8e94821c486fbf8146514267e6c11f8.png

具体的信息增益计算过程如下图

3509eef263803521a28d7a196646d993.png

这样,我们就不用对全部的训练集进行前向而只是对于某一梯度大的部分进行前向。

直方图算法

对于xgboost来说,对于回归问题,其是先对数据排序,然后找出一个最佳切分点使得左右结点的loss达到最少,(此处不再举例,不懂得看回归树)。 但是其有以下几个缺点:

  1. 空间消耗大。需要保存数据的特征值。XGBoost采用Block结构,存储指向样本的索引,需要消耗两倍的内存。
  2. 时间开销大。在寻找最优切分点时,要对每个特征都进行排序,还要对每个特征的每个值都进行了遍历,并计算增益。
  3. 对Cache不友好。使用Block块预排序后,特征对梯度的访问是按照索引来获取的,是一种随机访问,而不同特征访问顺序也不一样,容易照成命中率低的问题。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的Cachemiss。

使用直方图就可以避免以上的问题

那直方图到底什么意思呢?

很简单,就是将排完序的数据进行离散化,说白了,就是有一组数据(1,1.5,2,2.5,3,3.5),那现在我们用几个bin将其区间化(1,2),(3,4),(5,6), 然后我们根据其数据特征进行离散化比如(1,1.5)-> 1, (1.5,2)->2。 然后再根据离散化后的1和2寻找最佳切分点。 同时,将特征根据其所在的bin进行梯度累加。这样,遍历一次数据后,直方图累积了需要的梯度信息,然后可以直接根据直方图,寻找最优的切分点。此外,直方图算法还可以进一步加速:一个叶子节点的直方图可以由它的父亲节点的直方图与其兄弟的直方图做差得到

具体算法如下:

ffcead0350fd315ef925cbd5bee3c363.png

这里可能有人会提问,那到底分几个bin合适呢? 我只能说,让loss最小的数量的bin就是最好的,具体情况具体分析。

直方图总结:

可以看出,直方图算法的优点有:

  • 可以减少内存占用,比如离散为256个Bin时,只需要用8位整形就可以保存一个样本被映射为哪个Bin(这个bin可以说就是转换后的特征),对比预排序的Exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
  • 计算效率也得到提高,预排序的Exact greedy对每个特征都需要遍历一遍数据,并计算增益,复杂度为 (# ×# )。而直方图算法在建立完直方图后,只需要对每个特征遍历直方图即可,复杂度为 (# ×# )。
  • 提高缓存命中率,因为它访问梯度是连续的(直方图)。
  • 此外,在数据并行的时候,直方图算法可以大幅降低通信代价。(数据并行、特征并行在本文后面讲解)

当然也有不够精确的缺点:

当然,Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点 也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

Exclusive Feature Bundling(EFB)

这个算法就比较有意思了,是一种降维算法,因为在特征矩阵中很多值是0,即矩阵为稀疏矩阵,那么我们就尝试将两个特征合并为一个特征,或者几个特征合并为一个特征,怎么办呢?举个例子,假设特征

,因为
中的每个元素并不相互排斥,所以可以进行融合(直接相加),但是
还有
就不行,因为
,所以总结来说只要两个特征对应位置,只有每一行都不互斥才可以进行融合。然后我们尽可能的把互不排斥的特征放在一个bundle里面,其就是着色问题属于NP问题

具体算法如下

e26ec2934ed1508968a984e6458d2f28.png

8397fcc477a88aecf413956af8f308b9.png

对于特征融合来说,其是在bins上的融合,一个经典的例子是,如果

, B向右偏移了10。

67a6df327cf6e5d900da88c4146725db.png

树的生长

在xgboost中,树是按层生长的,但是,lightbgm中,其使用按照节点生长,这样就可以减少内存。

0155cbe613e29fd9e418fbea4e9d1b79.png

c7359bd94861c81893b97d9b5fabf881.png

下面就是一点xgboost和lightbgm的对比:

2b1ed4968898515fcad1baa3f90111fc.png

此外,其实lightbgm中,还有数据并行的操作,其大概意思就是让每个特征并行计算最佳划分点,然后再找出最佳划分特征,有兴趣的可以去官方文档看看,这里不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值