之前比赛和实习用了很多LightGBM(lgb)模型,该模型比XGBoost(xgb)快不少,而且精度也不差。因此,理解清楚lgb模型为何速度快的原理是必要的,对此做个总结,巩固一下基础~

首先,可以想到的是我们用lgb模型都是处理结构化数据,而且基本是二维结构化数据,可以理解为类似数据库的库表形式。二维指的就是样本维度 + 特征维度。因此,lgb速度优化的两大算法就是从如何减少这两个维度开始的。

即,通过基于梯度的单边采样算法(GOSS)来减少样本维度,通过互斥特征捆绑算法(EFB)来减少特征维度。其实,lgb还有一个重大速度优化是直方图算法(histogram),不过现在xgb也引入了直方图算法,本文暂不介绍该算法,有兴趣的读者自行学习。

可阅读原文进一步加深理解:LightGBM

1. 基于梯度的单边采样(GOSS)

Gradient-based One-Side Sampling,基于梯度的单边采样。单从名字上大概就能猜出该算法主要用来干啥,三个关键词:梯度、单边、采样。简单来说,就是根据样本梯度来对梯度小的这边样本进行采样,而对梯度大的这边样本保留。

比如,我有训练数据1000w,设置梯度大的样本的保留10%,而梯度小的样本保留20%。算法上就是先按样本梯度对样本降序排序,保留梯度处于前10%的样本(100w),再从剩下的900w梯度较小样本随机挑选200w(1000w*20%)样本。这样的话样本量就从1000w减小到了300w,加快训练速度。

如果样本的梯度很小,则该样本的训练误差也很小(gbdt拟合的就是负梯度),表明其是很好训练的,考虑性能的情况下可以对其丢弃。但为什么不全部丢弃而用采样的方法呢?主要还是因为会改变样本的分布情况,伤害模型的准确度。这里尽管会对梯度小的样本进行采样,但是会对采样的样本梯度乘以一个常数因子,将样本分布尽可能拉回来。例如对大梯度样本保留前 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T0LL5RbU-1647587647901)(https://www.zhihu.com/equation?tex=a%2A100%5C%25)] ,对小梯度样本采样 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WsVHHyLV-1647587647902)(https://www.zhihu.com/equation?tex=b%2A100%5C%25)] ,则我们需要将小梯度样本的梯度放大 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sD5wdWFE-1647587647902)(https://www.zhihu.com/equation?tex=%5Cfrac%7B1-a%7D%7Bb%7D)] 。

这里给出原文中GOSS的伪代码,里面清晰的描述了其算法流程。

GOSS算法伪代码

用中文概述一下GOSS流程,对于每一步迭代(for循环里面的):

(1)先根据模型进行预测,得到样本预测值preds;
(2)根据preds计算loss,然后进一步计算得到样本梯度,样本权重w初始赋值都等于1;
(3)根据样本梯度的绝对值,降序排序得到sorted,它是样本的索引数组
(4)大梯度样本数据选取topN= [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djkaY1qz-1647587647904)(https://www.zhihu.com/equation?tex=a%2Alen%28I%29)] 个,得到topSet,也是索引数组
(5)小梯度样本数据,从剩余的样本里随机挑选randN= [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yapR7LXy-1647587647904)(https://www.zhihu.com/equation?tex=b%2Alen%28I%29)] 个,得到randSet
(6)将topSet和randSet进行合并,得到usedSet,大小等于 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGS0JEin-1647587647904)(https://www.zhihu.com/equation?tex=%28a%2Bb%29%5Ctimes+len%28I%29)] ;
(7)将小样本的样本权重乘上权重系数因子 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FETUQzM-1647587647905)(https://www.zhihu.com/equation?tex=%281-a%29%2Fb)] ,得到新的样本权重w;
(8)根据usedSet索引上的样本 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCOtcUJr-1647587647906)(https://www.zhihu.com/equation?tex=I)] , 梯度 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TZxs2Fn-1647587647906)(https://www.zhihu.com/equation?tex=g)] , 权重 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AvEAf3S-1647587647907)(https://www.zhihu.com/equation?tex=w)] ,得到一个新的弱学习器newModel
(9)将新弱学习器newModel,加入总模型(lgb是加法模型)。

实验表明,该做法并没有降低模型性能,反而还有一定提升。究其原因,应该是采样也会增加弱学习器的多样性,从而潜在地提升了模型的泛化能力,稍微有点像深度学习的dropout。

2. 互斥特征捆绑(EFB)

Exclusive Feature Bundling,互斥特征捆绑。前面GOSS可以通过减少样本加速模型训练,而EFB可以通过减少特征个数使数据规模进一步变小。

比如在推荐系统里可能特征非常多,达到几万维甚至更多,但其中很多特征是互斥的,互斥指的是一些特征很少同时出现非0值,类似one-hot特征。lgb的思想就是把这些特征捆绑在一起形成一个新的特征,以减少特征数量,提高训练速度。

接下来,两个问题:lgb如何判定哪些特征应该捆绑在一起?lgb又是如何进行捆绑(合并)的呢?

1)首先介绍如何判定哪些特征应该捆绑在一起?

EFB算法采用**构图(build graph)**的思想,将特征作为节点,不互斥的特征之间进行连边,然后从图中找出所有的捆绑特征集合。其实学过数据结构里的图算法就了解过,这个问题基本就是图着色问题。但是图着色问题是一个NP-hard问题,不可能在多项式时间里找到最优解。

因此EFB采用了一种近似的贪心策略解决办法。它允许特征之间存在少数的样本点并不互斥(比如某些对应的样本点之间并不同时为非0),并设置一个最大冲突阈值 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcANAUfy-1647587647908)(https://www.zhihu.com/equation?tex=K)] 。我们选择合适的 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfL48eWc-1647587647908)(https://www.zhihu.com/equation?tex=K)] 值,可以在准确度和训练效率上获得很好的trade-off(均衡)。

下面给出EFB的特征捆绑的贪心策略流程:

(1)将特征作为图的顶点,对于不互斥的特征进行相连(存在同时不为0的样本),特征同时不为0的样本个数作为边的权重;
(2)根据顶点的度对特征进行降序排序,度越大表明特征与其他特征的冲突越大(越不太可能与其他特征进行捆绑);
(3)设置最大冲突阈值K,外层循环先对每一个上述排序好的特征,遍历已有的特征捆绑簇,如果发现该特征加入到该特征簇中的冲突数不会超过最大阈值K,则将该特征加入到该簇中。否则新建一个特征簇,将该特征加入到新建的簇中。

伪码如下:

贪心捆绑算法流程

上面时间的复杂度为 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPluW3JE-1647587647910)(https://www.zhihu.com/equation?tex=O%28n%5E2%29)] ,n为特征的数量,时间其实主要花费在建图上面,两两特征计算互斥程度的时间较长(2层for循环)。对于百万级别的特征数量来说,该复杂度仍是不可行的。为了提高效率,可以不再构建图,将特征直接按照非零值个数排序,将特征非零值个数类比为节点的度(即冲突程度),因为更多的非零值更容易引起冲突。只是改进了排序策略,不再构建图,下面的for循环是一样的。

2)如何将特征捆绑簇里面的所有特征捆绑(合并)为一个特征?

如何进行合并,最关键的是如何能将原始特征从合并好的特征进行分离出来。EFB采用的是加入一个偏移常量(offset)来解决。

举个例子,我们绑定两个特征A和B,A取值范围为[0, 10),B取值范围为[0, 20)。则我们可以加入一个偏移常量10,即将B的取值范围变为[10,30),然后合并后的特征范围就是[0, 30),并且能很好的分离出原始特征~

下面给出原文的算法伪码:

合并互斥特征流程

因为lgb中直方图算法对特征值进行了分桶(bin)操作,导致合并互斥特征变得更为简单。从上面伪码看到偏移常量offset直接对每个特征桶的数量累加就行,然后放入偏移常数数组(binRanges)中。上述伪码较为简单,在此就不细说了~


以上介绍的就是GOSS和EFB算法的全部东西啦,有帮助可点赞支持一下!

欢迎学习《python金融风控评分卡模型和数据分析(加强版)》
转载:https://zhuanlan.zhihu.com/p/366234433

论文涉及机器学习建模解决方案

详解LightGBM两大降维利器:基于梯度的单边采样(GOSS)和互斥特征捆绑(EFB)相关推荐

  1. 股票期权基本特点是什么?详解股票期权两大特点?

    股票期权在生活中很常见,它能够帮助大家更好的进行理财,股票期权现在如果想了解更多的信息可以进入QR量化投资社区,在这里面可以对股票期权进行咨询了解,一般股票期权它是有特点的.下面来看一下股票期权基本特 ...

  2. java spring原理详解,spring原理详解,两大核心IOC和AOP

    大家好,我是java梦之旅,一个被Bug耽误了才艺的程序员,专注于Java领域的知识分享和技术交流,每天会给大家带来Java学习的干货教程,喜欢我的同学可以关注我,一起学习,一起加油! 1.概念:sp ...

  3. 基于 SurfaceView 详解 android 幸运大转盘,附带实例app

    基于 SurfaceView 详解 android 幸运大转盘,附带实例app 首先说一下,幸运大转盘,以及SurfaceView是在看了也为大神的博客,才有了比较深刻的理解,当然这里附上这位大神的博 ...

  4. AI艺术的背后:详解文本生成图像模型【基于 Diffusion Model】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  5. AI艺术的背后:详解文本生成图像模型【基于GAN】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  6. Spark分区详解!DT大数据梦工厂王家林老师亲自讲解!

    Spark分区详解!DT大数据梦工厂王家林老师亲自讲解! http://www.tudou.com/home/_79823675/playlist?qq-pf-to=pcqq.group 一.分片和分 ...

  7. AI艺术的背后:详解文本生成图像模型【基于 VQ-VAE】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  8. 最详解——寻找两个有序数组的中位数

    参考:[分步详解]两个有序数组中的中位数和Top K问题 题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O ...

  9. Andrej Karpathy | 详解神经网络和反向传播(基于micrograd)

    只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...

  10. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

最新文章

  1. 自学python清单-python学习清单
  2. 说说 XSRF 防范
  3. 一天搞定CSS: overflow--14
  4. C语言stdio.h与stdlib.h的区别
  5. 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?
  6. linux superblock 时间,Linux命令(八)
  7. 天池 在线编程 安排面试城市(贪心)
  8. matlab求负数分数幂问题
  9. mysql asp.net core_基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入...
  10. [Logstash]使用详解
  11. 导出jar包和api文档
  12. Android adb shell执行mv等操作时,提示:Read-only file system的解决办法
  13. Matlab绘图模板
  14. python安装配置教程win10_win10怎么安装python_win10安装python的图文步骤
  15. linux can 总线socket接口测试使用
  16. 北京大学优秀计算机论文,计算机系在ESEC/FSE'20上发表的论文获得ACM SIGSOFT杰出论文奖...
  17. 【短视频运营】账号定位 ( 擅长方向 | 利他性 | 变项方向 | 赛道现状 | 账号成本 | 账号领域垂直 )
  18. NS2中无线仿真场景生成
  19. 批量调整公司代码层会计科目数据-OB_GLACC12
  20. 系统补丁不适用计算机,Windows Server2012 R2 Standard更新系统补丁时提示“此更新不适用于此计算机”...

热门文章

  1. java 既不是内部命令也不是外部命令的解决办法
  2. Webstorm 2021 开启内存显示设置
  3. linux 创建软连接_linux删除原理
  4. 7种方式实现3栏布局
  5. angular1的复选框指令--checklistModel
  6. Using Flume要点
  7. Docker数据持久化与容器迁移
  8. mysql数据库存储过程异常处理
  9. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 问题
  10. 正则表达式--简单记忆一