热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lightgbm过去版本安装包_集成学习算法LightGBM

LightGBM在Kaggle,KDD等各类数据竞赛中,无论是分类问题还是回归问题亦或是排序问题,以GBDT(分类回归决策树
7948cb5d2783cf63bcd0f81ebd627c26.png

LightGBM

在Kaggle,KDD等各类数据竞赛中,无论是分类问题还是回归问题亦或是排序问题,以GBDT(分类回归决策树)为基础的梯度提升树,如XGBoost、LightGBM、Thunder Boost等均占有无撼动的主导地位。尤其是在数据维度(属性)较少时,特征工程加XGBoost的pipeline几乎已经成为了各类比赛的冠军方案。不得不说先验知识再加上“分而治之”的方法在特征维数较低且易于表示时仍然具有“解释性好”、精度高、速度快等深度神经网络无法媲美的优点(深度神经网络真正取得突破的是在图像和语音这类特征抽象,表征困难其过去进步较小的领域,而NLP中深度网取得的进步仍然有限,这一方要归咎于数据量的不足,但还有一点是语言的学习从小开始,其已经拥有大量的人工知识)。

Introduction

首先简单的回顾GBDT的思想(更加详细的介绍可以参看我的这篇笔记)

PoderLee:集成学习中的XGBoost​zhuanlan.zhihu.com
256dea21b04570fcbe8e985fc52d2b48.png

对于决策树的构建主要分为两类方法,即深度优先(损失更小,与广度优先相比,在leaf数目相同时树根深,因此容易造成过拟合,但是构建过程更加灵活且容易在大规模数据集上使用)和广度优先(树的构建更加平衡,但是精度较差),决策树通过“分而治之”的思想将样本进行分类。在决策树构建的过程中最困难且最耗时的就是结点的分裂,这里不同的分裂策略即对应了不同版本的决策树,如根据信息增益构建ID3,根据信息增益率构建C4.5,根据Gini index构建CART等,split策略的不同也将带来decision tree的不同偏好。然而单一的决策树其性能有限,且容易造成过拟合,而通过剪枝或限制树深等手段虽然能在一定程度上缓解overfitting,但是其精度也将受到损失。因此,研究人员便以决策树为基学习器,通过集成的思想来提升模型的性能,梯度提升决策树就是典型代表,此外包括AdaBoost、Random Forest等均被广泛采用。

da4cd1d54ea9d9111809898e9ac69615.png
图1. 深度优先 VS 广度优先

GBDT通过迭代生成每一棵树,每次迭代中通过拟合前一棵树的残差使得精度不断提高,而树的构建则是使损失函数的负梯度方向为指导原则。然而在每次计算最佳split point时算法需要遍历所有数据计算split criterion,这严重制约了算法的速度,因此我们有必要对此改进。

Algorithm

无论是XGB还是LGB均以GBDT为基础,而GBDT构建的最大困难即使分裂点的选择,而原始的做法需要算法遍历每一属性的所有数据点计算寻找最优解,该操作的复杂度为

,因此当数据量较大且特征较多时,其成本将难以接受。同时我们也观察到,算法时间成本与分裂次数正相关而分裂过程中的微小改变不会引起结果的巨大变化,因此基于直方图的分裂方法则是将特征值划分为块,以bin为最小单位进行分裂而不直接对每个特征值进行计算。此操作直接将算法的复杂度减小为
,同时内存空间也显著减少,然而对于bin数量的选择将带来速度与精度的trade-off。此外,bin的划分方式也多种多样,最简单的则是等间隔划分,然而对于分布不平衡的数据这将带来很大问题。故XGBoost对于bin的划分则采用gradient statistics的策略,使其更加平衡。另外,在split过程中经常会出现数据稀疏的问题,XGB和LGB则均是首先忽略所有0元素,然后将缺失数据分配至分割的任意一边,以减少损失加快训练速度。
d1dbd736e93e9170fe562f41dbaceb69.png
图2. split

相较于XGBoost,LightBoost最大的改进啊包括以下两点:

  • Subsampling the data: Gradient-based One-Side Sampling(GOSS)
  • Exclusive Feature Bundling(EFB)

(1)GOSS

对于所有的数据样本,其在树的训练过程中贡献度大小不一,拥有较小提度提升的样本意味着其已被拟合的足够好,因此贡献程度较小,而我们真正需要关注的是那先梯度较大的样本。因此最简单的想法是在计算分裂时对数据进行采样,忽略那些梯度较小的数据。然而该操作将带来改变数据分布的风险,而使得习得的模型将有所偏好。因此为缓和或避免这一风险,LGB同时也在梯度较小的样本中进行随机采样,同时在计算其对损失的contribution时,赋予更大的权重。故GOSS本质上是一种对任意分布依照重要度进行采样的技术。

f401f212566c3a3eadf11cad78b7696c.png
图3. Gradient-based One-Side Sampling

从上图可以看出,对于梯度较小的数据我们从中随机采样,比利为“

”,同时为其赋予权值
。而对于梯度较大的数据我们则选择loss提升最大的前“
”个样本。

(2)EFB

此外,原始高维数据一般较为稀疏,即其中存在大量相互依存或相互排斥的特征(多个特征不能同时取非0值,one-hot编码),这就启示我们可以将多个特征进行合并(“bundled”)处理而不损失任何信息(类似PCA)。然而在所有的特征中找到最有效的bundle方式是NP难问题,因此作者将其转化为图着色的问题,则使用了一种近似的贪心算法,即允许特征间存在一定的重叠(个特征并非完全独立),如下:

6bf18afb02b24d26ea8f7d3ead70437e.png
图4. EFB

如上图所示,我们以每个feature作为图节点,将各feature间的总冲突(反映特征间的互斥程度)作为边,构建图。特征的合并问题即转化寻找最小bundles的问题(允许一定的重叠)。而当bundles确定后,每一个bundle其各个特征的取值范围都会有所差别,所以在进行特征融合时为使各个特征取值不发生重叠(即保证各特征的差异性),我们对其进行偏置处理,重新分配各特征的取值范围以保证各特征间取值互不相同,然后进行合并。

ed446333e9994d967de8bc65dfe350d3.png
EFB Example

从上图可以明显看出feature1与feature2明显互斥,因此我们对其进行EFB操作,可以看到feature1的取值范围为[1,4](0为nan),为确保合并后各原始特征不发生重叠,因此我们将feature2加上4(feature1的最大值,bundle size)的偏置,然后进行合并。该操作使得合并后的feature bundle仍能完成保留feature1和feature2的特征差异,即feature_bundle的5,6代表表feature2,1-4代表feature2。

综上,通过对梯度提升较小样本进行随机采样操作和合并相关属性操作,LightGBM在保证精度的前提下获得了一定的加速。

Conclusion

当前在深度网络这种连接主义“红得发紫”的时代,以决策树为代表的符号主义其主要采用“分而治之”的思想,即通过选择不同的属性指标,并将其以某种方式组合,从而实现样本的分类。其中树的构建采用一种深度优先的算法,在树构建的过程中一般希望通过尽可能少的指标组合来竟可能的区分样本,即希望决策树的分支结点包含的样本尽可能属于同一类别,结点的“纯度”越来越高。为了量化纯度的和纯度提升的大小,这里定义信息熵、信息增益和基尼系数来直观反映。其中,ID3决策树学习算法是以信息增益为准则来划分属性,而信息增益可能会对取值数目较多的属性有所偏好,这将有可能导致模型过拟合,即模型的泛华能力受到影响,为缓解这种影响,故又定义了信息增益率,然而信息增益率通常会对取值数目较少的属性有所偏好,因此一般算法首先从候选的划分属性中找出信息增益高于平均水平的属性,然后在从中选择增益率最高的属性。著名的C4.5决策树即采用“增益率”来选择最有划分属性。此外,相较于信息增益和信息增益率,基尼系数是另一种属性划分方法,我们可以使用Gini index构建二叉树,如著名的GBDT、XGBoost、LightGBM等。此外在树的构建过程为防止过拟合一般可以采用前剪枝和后剪枝处理。


然而,单棵树的拟合能力毕竟有限,为提高模型的分类能力则一般采用集成策略。集成分为同质学习( 个体学习器类型相同)和异质学习(个体学习器类型不同),而针对集成方法的不同其又可以分为串行集成Boosting,即个体学习器间存在强依赖的关系,后一个学习器的生成需依赖前一个学习器的结果;并行集成Bagging,即个体学习器间不存在依赖关系,可以同时训练多个学习器,适合分布式并行计算。并行集成相较于串行集成其最大的优点就是速度快,但是其精度将会有所损失。


在Boosting算法簇中,其主要代表包括AdaBoost、GBDT、XGBoost及其改进等。其工作机制大致为:①从初始训练集中训练出一个基学习器;②根据基学习器的性能表现调整样本分布,使得分类错误的样本在后续的训练中得到更多的关注;③基于调整后的样本调整训练下一个基学习器:④重复步骤①、②直至基学习器达到指定数目;⑤对基学习器预测结果进行加权融合,输出。如AdaBoost则是首先初始化样本权值分布,训练初始基学习器,并根据学习器分类结果赋予其权值,同时调整样本分布权值。然后根据样本分布不断训练基学习器,并不断调样本分布权值。最后,根据多个基学习器的权值将各个分类器的结果加权输出。而GBDT则是以CART为分类器的Boosting算法,其本质上也是一个加法模型。XGBoost与GBDT相比,其主要区别在于:①误差函数考虑二阶泰勒展开,因此收敛更快;②损失函数中引入正则化项,对树的复杂程度进行惩罚,以避免过拟合的发生。此外由于XGBoost在每次结点的分裂时均需要遍历所有数据,这样即造成了时间成本和空间成本较高的缺陷,于是在此基础上则有发展出了更快的梯度提升方法,LightGBM。LightGBM与XGBoost相比最大的改进在于其引入了GOSS和EFB操作,即对梯度提升较小的样本进行随机采样同时对相关特征进行融合,其在保证精度的前提下减少了算法的计算时间和存储空间。


相较于Boosting,Bagging则是典型的并行集成方法,其主要思想是通过拔靴法(有放回采样)随机抽取多个样本集同时训练多个分类器,进行集成。Bagging算法效率较高,其时间复杂度与训练基学习器同阶。此外Bagging还能很好的适用于回归和多分类等问题,其中随机森林算法被广泛使用。随机森林主要思想是在样本随机选择的同时,多棵决策树的构建过程中每棵决策树的属性的选择也随机,然后根据选择属性构建最优决策树进行集成。这样基学习器的多样性不仅来自于样本的扰动,同时还来自属性的扰动,也就是说,随机森林的随机性主要体现在两个方面:(1)样本的随机选择(2) 属性的随机选择。因此随机森林最终集成的泛华性能和个体学习器的差异进一步加大。此外,由于随机森林每棵树的训练都是独立的,其并不依赖前一棵树的分类结果,因此随机森林天生就适应并行,故其训练效率和模型的泛化误差往往均优于Boosting,然而该模型的精度较低(一般情况下低于Boosting几个百分点)。


总而言之,集成学习的思想已被各类学习器借鉴吸收,此外在工程实践中其也得到了广泛的使用。

Reference

[1] keitakurita. LightGBM and XGBoost Explained



推荐阅读
  • ZooKeeper集群脑裂问题及其解决方案
    本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 机器学习核心概念与技术
    本文系统梳理了机器学习的关键知识点,涵盖模型评估、正则化、线性模型、支持向量机、决策树及集成学习等内容,并深入探讨了各算法的原理和应用场景。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 序列化与反序列化是数据处理中的重要技术,特别是在网络通信和数据存储中。它们允许将复杂的数据结构转换为可传输或存储的格式,再从这些格式恢复原始数据。本文探讨了序列化与反序列化的基本概念,以及它们在不同协议模型中的角色。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 利用Java与Tesseract-OCR实现数字识别
    本文深入探讨了如何利用Java语言结合Tesseract-OCR技术来实现图像中的数字识别功能,旨在为开发者提供详细的指导和实践案例。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有