图解机器学习 | LightGBM模型详解

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: LightGBM是GBDT的进化版本,在效率、内存、准确率方面表现优秀。本文讲解LightGBM的动机、优缺点及优化点、决策树算法及生长策略、类别性特征支持、并行支持与优化等重要知识点。

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/34
本文地址http://www.showmeai.tech/article-detail/195
声明:版权所有,转载请联系平台与作者并注明出处


引言

之前ShowMeAI对强大的boosting模型工具XGBoost做了介绍(详见ShowMeAI文章图解机器学习 | XGBoost模型详解)。本篇我们来学习一下GBDT模型(详见ShowMeAI文章 图解机器学习 | GBDT模型详解)的另一个进化版本:LightGBM。

LightGBM是微软开发的boosting集成模型,和XGBoost一样是对GBDT的优化和高效实现,原理有一些相似之处,但它很多方面比XGBoost有着更为优秀的表现。官方给出的这个工具库模型的优势如下:

  • 更快的训练效率
  • 低内存使用
  • 更高的准确率
  • 支持并行化学习
  • 可处理大规模数据
  • 支持直接使用category特征

下图是一组实验数据,在这份实验中,LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,准确率也略有提升。

1.LightGBM动机

互联网领域的算法应用,通常背后都有海量的大数据。深度学习中一系列神经网络算法,都是以mini-batch的方式喂数据迭代训练的,总训练数据量不受内存限制。

但我们用到的机器学习算法,比如GBDT(参考ShowMeAI文章 GBDT详解)在每一次迭代的时候,都需要遍历整个训练数据多次。

  • 如果把整个训练数据一次性装进内存,会明显限制训练数据的大小。
  • 如果不装进内存,反复地读写训练数据又会消耗非常大的时间。

面对工业级海量的数据,普通的GBDT算法无法满足需求。LightGBM提出的主要原因之一,就是为了解决上述大数据量级下的GBDT训练问题,以便工业实践中能支撑大数据量并保证效率。

2.XGBoost优缺点

我们之前介绍过强大的XGBoost(详见ShowMeAI文章图解机器学习 | XGBoost模型详解),但XGBoost也依旧存在一些缺点,LightGBM针对其中的一部分进行了调整优化。XGB优缺点归纳如下:

1)精确贪心算法

轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。

Gain=12[G2LHL+λ+G2RHR+λ(GL+GR)2HL+HR+λγ]

  • 优点:可以找到精确的划分条件。
  • 缺点:计算量巨大、内存占用巨大、易产生过拟合。

2)Level-wise生长方式

XGBoost采用Level-wise的增长策略:基于层进行生长,直到达到停止条件。这种增长策略方便并行计算每一层的分裂节点,提高了训练速度,但同时也因为节点增益过小增加了很多不必要的分裂,增加了计算量。

  • 优点:可以使用多线程、可以加速精确贪心算法。
  • 缺点:效率低下,可能产生不必要的叶结点。

3)对cache优化不友好

在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

3.LightGBM优化点

上个部分其实也是LightGBM作者们,构建新算法时着重优化的点。概括来说,LightGBM主要有以下特点:

  • 基于Histogram的决策树算法
  • 带深度限制的Leaf-wise的叶子生长策略
  • 直方图做差加速
  • 直接支持类别特征(Categorical Feature)
  • Cache命中率优化
  • 基于直方图的稀疏特征优化
  • 多线程优化

4.决策树算法

1)XGBoost:Pre-sorted算法

XGBoost使用的是Pre-sorted算法,能够更精确的找到数据分隔点。

  • 首先,对所有特征按数值进行预排序。
  • 其次,在每次的样本分割时,用O(#data)的代价找到每个特征的最优分割点。
  • 最后,找到最后的特征以及分割点,将数据分裂成左右两个子节点。

这种pre-sorting算法能够准确找到分裂点,但是在空间和时间上有很大的开销。

  • 由于需要对特征进行预排序并且需要保存排序后的索引值(为了后续快速的计算分裂点),因此内存需要训练数据的两倍。
  • 在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。

2)LightGBM:直方图算法

LightGBM使用的是直方图算法(histogram algorithm),占用的内存更低,数据分割的复杂度更低。直方图算法思想是:

  • 将连续的浮点特征离散成k个离散值,并构造宽度为k的Histogram。
  • 遍历训练数据,统计每个离散值在直方图中的累计统计量。
  • 在进行特征选择时,只需要根据直方图的离散值,遍历寻找最优的分割点。

(1)内存优化

直方图算法可以很大程度降低内存消耗,它不仅不需要额外存储预排序的结果,还可以只保存特征离散化后的值(一般用8位整型存储就足够了)。

如图所示,用8位整型存储,内存消耗可以降低为原来的1/8。

(2)计算量优化

应用直方图算法,计算代价也大幅降低,预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)直接优化到 O(k#features)。

(3)注意点

直方图算法的理解和注意点如下:

  • 使用分桶bin替代原始数据相当于增加了正则化。
  • 使用分桶bin意味着很多数据的细节特征丢失,相似的数据如果划分到相同的桶中,数据之间的差异就无法捕获了。
  • 分桶bin数量决定了正则化的程度,bin越少惩罚越严重,欠拟合风险越高。
  • 因为预先设定了bin的范围,构建直方图时不需要对数据进行排序。
  • 直方图保存「划分阈值」、「当前bin内样本数」、「当前bin内所有样本的一阶梯度和」。
  • 阈值的选取是按照直方图从小到大遍历,使用了上面的一阶梯度和,目的是得到划分之后△loss最大的特征及阈值。

(4)直方图算法优缺点

  • Histogram算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在实际的数据集上表明,离散化的分裂点对最终的精度影响并不大,甚至会好一些。原因在于decision tree本身就是一个弱学习器,采用Histogram算法会起到正则化的效果,有效地防止模型的过拟合。
  • 时间上的开销由原来的O(#data#features)降到O(k#features)。由于离散化,#bin远小于#data,因此时间上有很大的提升。

Histogram算法还可以进一步加速。一个叶子节点的Histogram可以直接由父节点的Histogram和兄弟节点的Histogram做差得到。一般情况下,构造Histogram需要遍历该叶子上的所有数据,通过该方法,只需要遍历Histogram的k个捅。速度提升了一倍。

5.决策树生长策略

1)树生长策略调整

直方图算法之上,LightGBM进行进一步的优化。它没有使用大多数GBDT工具使用的按层生长(Level-wise)的决策树生长策略,而使用了带有深度限制的按叶子生长(Leaf-wise)算法。

(pm,fm,vm)=argmin(p,f,v)L(Tm1(X).split(p,f,v),Y)

Tm(X)=Tm1(X).split(pm,fm,vm)

2)XGBoost:Level-wise

XGBoost采用的是Level-wise(按层生长)策略生长的,能够同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合。

但不加区分的对待同一层的叶子,带来了很多没必要的开销。因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

3)LightGBM:Leaf-wise

LightGBM采用Leaf-wise(按叶子生长)生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环。

同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

6.直方图差加速

LightGBM另一个优化是Histogram(直方图)做差加速。整个构建过程中可以观察到:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。

一般来说构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用上述特征,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

7.类别型特征支持

大多数机器学习工具都无法直接支持类别型特征,我们会先将其编码再做后续建模,如果使用one-hot这种编码方式还会降低空间和时间效率。

LightGBM优化了对类别型特征的支持,可以直接输入类别特征,不需要额外的编码或one-hot 0/1展开。并在决策树算法上增加了类别型特征的决策规则。

1)树模型与one-hot编码

one-hot编码是处理类别特征的一个通用方法,然而在树模型中,这可能并不一定是一个好的方法,尤其当类别特征中类别个数很多的情况下,主要的问题是:

问题1:可能无法在这个类别特征上进行切分

使用one-hot编码的话,意味着在每一个决策节点上只能使用one vs rest(例如是不是男性,是不是一线城市等)的切分方式。当类别值很多时,每个类别上的数据可能会比较少,这时候切分会产生不平衡,这意味着切分增益也会很小。

问题2:影响决策树的学习

就算可以在这个类别特征进行切分,也会把数据切分到很多零碎的小空间上,如下左图所示。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习会变差。但如果使用下右图的分裂方式,数据会被切分到两个比较大的空间,进一步的学习也会更好。

圈中的数值表示该结点内的数据。右图中叶子节点 X=A || X=C 的含义是 X=A 或者 X=C 放到左孩子,其余放到右孩子。

2)LightGBM类别型特征处理方式

LightGBM采用了Many vs Many的切分方式解决one-hot编码带来的问题,实现了类别特征的最优切分。用LightGBM可以直接输入类别特征,并产生上右图的效果。
在1个k维的类别特征中寻找最优切分,朴素的枚举算法的复杂度是 O(2k),而LightGBM采用了如 On Grouping For Maximum Homogeneity的方法实现了 O(klogk) 的算法。

算法流程如图所示:

  • ①在枚举分割点之前,先把直方图按每个类别的均值进行排序。
  • ②接着按照均值的结果依次枚举最优分割点。

从下图可以看到,Sum(y)/Count(y)为类别的均值。当然,这个方法很容易过拟合,所以在LightGBM中加入了很多对这个方法的约束和正则化。

求解类别型特征的最优切分的具体流程如下:

① 离散特征建立直方图的过程

统计该特征下每一种离散值出现的次数,并从高到低排序,并过滤掉出现次数较少的特征值。然后为每一个特征值,建立一个bin容器,对于在bin容器内出现次数较少的特征值直接过滤掉,不建立bin容器。

② 计算分裂阈值的过程

  • 先看该特征下划分出的bin容器的个数,如果bin容器的数量小于4,直接使用one vs other方式,逐个扫描每一个bin容器,找出最佳分裂点。
  • 对于bin容器较多的情况,先进行过滤,只让子集合较大的bin容器参加划分阈值计算,对每一个符合条件的bin容器进行公式计算,得到一个值,根据该值对bin容器从小到大进行排序,然后分从左到右、从右到左进行搜索,得到最优分裂阈值。公式如下:

binbin+cat-smooth

这里为什么不是label的均值呢?其实上例中只是为了便于理解,只针对了学习一棵树且是回归问题的情况。这时候一阶导数是Y,二阶导数是1),

  • 没有搜索所有的bin容器,而是设定了一个搜索bin容器数量的上限值,程序中设定是32,即参数max_num_cat。
  • LightGBM中对离散特征实行的是many vs many 策略,这32个bin中最优划分的阈值的左边或者右边所有的bin容器就是一个many集合,而其他的bin容器就是另一个many集合。

③ 对于连续特征,划分阈值只有一个。对于离散值可能会有多个划分阈值,每一个划分阈值对应着一个bin容器编号

当使用离散特征进行分裂时,只要数据样本对应的bin容器编号在这些阈值对应的bin集合之中,这条数据就加入分裂后的左子树,否则加入分裂后的右子树。

8.并行支持与优化

LightGBM原生支持并行学习,目前支持「特征并行」和「数据并行」的两种,LightGBM针对这两种并行方法都做了优化。

  • 特征并行:在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
  • 数据并行:让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。

1)特征并行

LightGBM在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信。

2)数据并行

Lightgbm在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。

基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。

更具体的内容可以看NIPS2016的文章: A Communication-Efficient Parallel Algorithm for Decision Tree。

9.网络通信优化

XGBoost由于采用Pre-sorted算法,直接通信代价比较大;LightGBM采用的histogram算法通信代价小,通过使用集合通信算法,能够实现并行计算的线性加速。

10.参考资料

更多监督学习的算法模型总结可以查看ShowMeAI的文章 AI知识技能速查 | 机器学习-监督学习

ShowMeAI相关文章推荐

ShowMeAI系列教程推荐

showmeai

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
目录
打赏
0
0
2
0
2387
分享
相关文章
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
103 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
云上一键部署 DeepSeek-V3 模型,阿里云 PAI-Model Gallery 最佳实践
本文介绍了如何在阿里云 PAI 平台上一键部署 DeepSeek-V3 模型,通过这一过程,用户能够轻松地利用 DeepSeek-V3 模型进行实时交互和 API 推理,从而加速 AI 应用的开发和部署。
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
276 13
机器学习算法的优化与改进:提升模型性能的策略与方法
FastAPI + ONNX 部署机器学习模型最佳实践
本文介绍了如何结合FastAPI和ONNX实现机器学习模型的高效部署。面对模型兼容性、性能瓶颈、服务稳定性和安全性等挑战,FastAPI与ONNX提供了高性能、易于开发维护、跨框架支持和活跃社区的优势。通过将模型转换为ONNX格式、构建FastAPI应用、进行性能优化及考虑安全性,可以简化部署流程,提升推理性能,确保服务的可靠性与安全性。最后,以手写数字识别模型为例,展示了完整的部署过程,帮助读者更好地理解和应用这些技术。
97 20
多元线性回归:机器学习中的经典模型探讨
多元线性回归是统计学和机器学习中广泛应用的回归分析方法,通过分析多个自变量与因变量之间的关系,帮助理解和预测数据行为。本文深入探讨其理论背景、数学原理、模型构建及实际应用,涵盖房价预测、销售预测和医疗研究等领域。文章还讨论了多重共线性、过拟合等挑战,并展望了未来发展方向,如模型压缩与高效推理、跨模态学习和自监督学习。通过理解这些内容,读者可以更好地运用多元线性回归解决实际问题。
|
1月前
如何看PAI产品下训练(train)模型任务的费用细节
PAI产品下训练(train)模型任务的费用细节
85 6
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
Transformer架构自2017年被Vaswani等人提出以来,凭借其核心的注意力机制,已成为AI领域的重大突破。该机制允许模型根据任务需求灵活聚焦于输入的不同部分,极大地增强了对复杂语言和结构的理解能力。起初主要应用于自然语言处理,Transformer迅速扩展至语音识别、计算机视觉等多领域,展现出强大的跨学科应用潜力。然而,随着模型规模的增长,注意力层的高计算复杂度成为发展瓶颈。为此,本文探讨了在PyTorch生态系统中优化注意力层的各种技术,
152 6
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本

热门文章

最新文章