论文解读:LightGBM——A Highly Efficient Gradient Boosting Decision Tree

本文主要是介绍论文解读:LightGBM——A Highly Efficient Gradient Boosting Decision Tree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 摘要
  • 1. Introduction
  • 2. Preliminary
    • 2.1 GBDT and Its Complexity Analysis
    • 2.2 Related Work
  • 3. Gradient-based One-Side Sampling(单边梯度采样)
  • 4. Exclusive Feature Bundling
  • 5. 结论
  • 6. 参考算法

在这里插入图片描述

摘要

GBDT是个非常流行的机器学习算法,有几个非常有效的应用实现,例如XGBoost合pGBRT。尽管这些应用算法应用来了很多工程优化技术,但是当特征维度特别大,数据量特别多时,这些算法还是不够高效。一个主要原因是:对于每一个特征,他们需要遍历所有数据去估计所有分裂点的信息增益,这会非常耗时。为了解决这个问题,我们提出了两种技术:GOSS(单边梯度采样)和EFB(互斥特征绑定)。对于GOSS,我们留下梯度较大的数据样本,而对梯度较小的样本进行随机采样,并加上权重补偿损失。论文也证明梯度较大的样本对计算信息增益上贡献较大。GOSS可以在较小的数据样本上获得对信息增益比较精确的估计。对于EFB,论文将互斥的特征绑定在一起(他们很少同时接受非零值)。我们证明找到最优绑定是一个NP-hard问题,所以我们找到了一个贪心算法,它可以完成非常好的近似.

1. Introduction

为了解决GBDT面临的挑战,一些研究曾经根据样本的权重来采样数据,但是在GBDT种没有样本权重。所以本文提出两种新技术:

GOSS:注意到,关于数据的梯度对信息增益的影响,于是对保留梯度较大的数据样本,并对梯度较小的样本进行随机采样。为了补偿丢到小梯度样本带来的损失,我们为小梯度样本增加了一个补偿常量

EFB:通常在真实的应用中,尽管数据的维度特别高,但是他们都很稀疏,因此我们设计了一个算法将互斥特征绑定在了一起。关于最优绑定问题,它是一个NP-hard问题,我们设计了一种近似算法将NP-hard问题转化成了图上色的问题(顶点代表特征,为两个不互斥(conflics)的特征添加边)

2. Preliminary

2.1 GBDT and Its Complexity Analysis

在GBDT算法中,时间复杂度最高的部分是寻找最佳的分裂点。最流行的算法就是预排序(pre-ordered):就是枚举,显然这是非常低效的。还有一种算法是直方图算法(histogram-based algorithm):它将连续型浮点特征分为离散的桶(bins),然后用这些桶去构建直方图,累计统计量。本文将在直方图算法的基础上进行优化

2.2 Related Work

XGBoost既支持pre-ordered算法,也支持直方图算法。

使用pre-ordered算法的GBDT模型可以通过忽略值为0的特征来减少训练损失。然而使用直方图算法的GBDT并没有有效的对于稀疏数据的优化解决办法(这就是EFB算法引出的原因)。原因是直方图算法需要检索到桶中的所有特征,不论特征值是否是0或者非0。

3. Gradient-based One-Side Sampling(单边梯度采样)

使用方差增益指标来评估是否为好的分裂,使用单边梯度采样简化方差增益的计算。

公式推导:https://www.zhihu.com/question/386159856

在这里插入图片描述

4. Exclusive Feature Bundling

通过谨慎的构建一个特征扫描算法(feature scanning algorithm),我们可以从特征包中构建与单个特征相同的特征直方图,这样就可以把算法的时间复杂度在这里插入图片描述

这里有两个问题需要解决:

(1) 哪些特征应该绑在一起
找出最优的 bundle 组合数是一个 NP-hard 问题,LightGBM第一步将原问题转化为”图着色”问题,"图着色"问题也是一个NP-hard问题。所以第二步论文设计了一个贪心算法来用"图着色"问题解决互斥特征的绑定。另外,一些特征之间并不是100%的互斥,即有少量样本中不互斥,所以算法允许这些样本之间存在较小的冲突(conflicts)
在这里插入图片描述
通过上述讨论,论文设计了一个Greedy Bundling算法:
① 构建一个图,顶点表示特征,边表示特征之间的冲突
② 依据特征冲突的程度排序(降序)
③ 检查排序列表中的每个特征,考虑冲突阈值γ后将其特征放入一个已经存在的或者新建一个bundle
这个算法在特征数量不是特别多的时候时间复杂度可以被接受,为了更进一步提升效率,我们不构建图:通过特征非零值的数量进行排序(对应②),因为
如果一个特征它的零值比较多的话那么它更容易和其他特征产生冲突

(2) 如何去构建bundle
该过程主要是关键在于原始特征值可以从bundle中区分出来,即绑定几个特征在同一个bundle里需要保证绑定前的原始特征的值在bundle中能够被识别,考虑到直方图算法将连续的值保存为离散的bin,我们可以使得不同特征的值分到bundle中的不同bin中,这可以通过在特征值中加一个偏置常量来解决,比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间[0,10),B特征的原始取值为区间[0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为[10,30),这样就可以放心的融合特征A和B了,因为在树模型中对于每一个特征都会计算分裂节点的,也就是通过将他们的取值范围限定在不同的bin中,在分裂时可以将不同特征很好的分裂到树的不同分支中去

5. 结论

LightGBM不论在时间复杂度还是内存消耗上都优于XGBoost

6. 参考算法

在这里插入图片描述
在这里插入图片描述

这篇关于论文解读:LightGBM——A Highly Efficient Gradient Boosting Decision Tree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517872

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringCloud负载均衡spring-cloud-starter-loadbalancer解读

《SpringCloud负载均衡spring-cloud-starter-loadbalancer解读》:本文主要介绍SpringCloud负载均衡spring-cloud-starter-loa... 目录简述主要特点使用负载均衡算法1. 轮询负载均衡策略(Round Robin)2. 随机负载均衡策略(

解读spring.factories文件配置详情

《解读spring.factories文件配置详情》:本文主要介绍解读spring.factories文件配置详情,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录使用场景作用内部原理机制SPI机制Spring Factories 实现原理用法及配置spring.f

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题

《解读为什么@Autowired在属性上被警告,在setter方法上不被警告问题》在Spring开发中,@Autowired注解常用于实现依赖注入,它可以应用于类的属性、构造器或setter方法上,然... 目录1. 为什么 @Autowired 在属性上被警告?1.1 隐式依赖注入1.2 IDE 的警告:

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

解读Pandas和Polars的区别及说明

《解读Pandas和Polars的区别及说明》Pandas和Polars是Python中用于数据处理的两个库,Pandas适用于中小规模数据的快速原型开发和复杂数据操作,而Polars则专注于高效数据... 目录Pandas vs Polars 对比表使用场景对比Pandas 的使用场景Polars 的使用