LightGBM算法总结

技术

picture.image

向AI转型的程序员都关注了这个号 👇👇👇

机器学习AI算法工程 公众号: datayx

目录

1 LightGBM原理

1.1 GBDT和 LightGBM对比  
1.2 LightGBM 的动机  
1.3 Xgboost 原理  
1.4 LightGBM 优化  
    1.4.1 Histogram 算法  
    1.4.2 带深度限制的 Leaf-wise 的叶子生长策略     
    1.4.3 直方图加速  
    1.4.4 直接支持类别特征  
    1.4.5 LightGBM并行优化  
1.5 其他注意  

2 lightGBM代码

2.1 基础代码  
2.2 模板代码  
    2.2.1 二分类  
    2.2.2 多分类  
2.3 lightGBM 和 xgboost 的代码比较  
    2.3.1 划分训练集测试集  
    2.3.2 设置参数  
    2.3.3 模型训练  
    2.3.4 模型执行时间  
    2.3.5 模型测试  
    2.3.6 分类转换  
    2.3.7 准确率计算  
    2.3.8 roc\_auc\_score计算  

3 lightGBM调参

3.1 参数  
    3.1 控制参数  
    3.2 核心参数  
    3.3 IO参数  
3.2 调参  

4 lightGBM案例

4.1 回归案例  
    4.1.1 代码  
    4.1.2 运行结果  
4.2 [ICC竞赛] 精品旅行服务成单预测  
    4.2.1 业务需求  
    4.2.2 数据表格  
    4.2.3 lightGBM模型  

5 lightGBM的坑

5.1 设置提前停止  
5.2 自动处理类别特征  
5.3 自动处理缺失值   

1 LightGBM原理
1.1 GBDT和 LightGBM对比

GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT 在工业界应用广泛,通常被用于点击率预测,搜索排序等任务。GBDT 也是各种数据挖掘竞赛的致命武器,据统计 Kaggle 上的比赛有一半以上的冠军方案都是基于 GBDT。

LightGBM (Light Gradient Boosting Machine)是一个实现 GBDT 算法的框架,支持高效率的并行训练,并且具有以下优点:

更快的训练速度  
更低的内存消耗  
更好的准确率  
分布式支持,可以快速处理海量数据  

如下图,在 Higgs 数据集上 LightGBM 比 XGBoost 快将近 10 倍,内存占用率大约为 XGBoost 的1/6,并且准确率也有提升。

1.2 LightGBM 的动机

常用的机器学习算法,例如神经网络等算法,都可以以 mini-batch 的方式训练,训练数据的大小不会受到内存限制。

而 GBDT 在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的 GBDT 算法是不能满足其需求的。

LightGBM 提出的主要原因就是为了解决 GBDT 在海量数据遇到的问题,让 GBDT 可以更好更快地用于工业实践。

1.3 Xgboost 原理

目前已有的 GBDT 工具基本都是基于预排序的方法(pre-sorted)的决策树算法(如 xgboost)。这种构建决策树的算法基本思想是:   

首先,对所有特征都按照特征的数值进行预排序。     

其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。     

最后,找到一个特征的分割点后,将数据分裂成左右子节点。     

这样的预排序算法的优点是:能精确地找到分割点。     

缺点也很明显:     

首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存。     

其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。  

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

1.4 LightGBM 优化

LightGBM 优化部分包含以下:

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

下面主要介绍 Histogram 算法、带深度限制的 Leaf-wise 的叶子生长策略和直方图做差加速。
1.4.1 Histogram 算法

直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。

picture.image

使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用 8 位整型存储就足够了,内存消耗可以降低为原来的1/8。

picture.image

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

当然,Histogram 算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。

原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。   

访问AI图谱 技术分享社区

https://loveai.tech


1.4.2 带深度限制的 Leaf-wise 的叶子生长策略   

在 Histogram 算法之上,LightGBM 进行进一步的优化。首先它抛弃了大多数 GBDT 工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

picture.image

Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

picture.image

1.4.3 直方图加速

LightGBM 另一个优化是 Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

picture.image

1.4.4 直接支持类别特征

实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的0/1 特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM 优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1 展开。并在决策树算法上增加了类别特征的决策规则。在 Expo 数据集上的实验,相比0/1 展开的方法,训练速度可以加速 8 倍,并且精度一致。据我们所知,LightGBM 是第一个直接支持类别特征的 GBDT 工具。

LightGBM 的单机版本还有很多其他细节上的优化,比如 cache 访问优化,多线程优化,稀疏特征优化等等。优化汇总如下:

picture.image

1.4.5 LightGBM并行优化

LightGBM 还具有支持高效并行的优点。LightGBM 原生支持并行学习,目前支持特征并行和数据并行的两种。

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

LightGBM 针对这两种并行方法都做了优化:

在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;  
在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。    

picture.image

picture.image

picture.image

1.5 其他注意

当生长相同的叶子时,Leaf-wise 比 level-wise 减少更多的损失。  
高速,高效处理大数据,运行时需要更低的内存,支持 GPU  
不要在少量数据上使用,会过拟合,建议 10,000+ 行记录时使用。  

XGboost ,lightGBM案例代码

关注微信公众号 datayx 然后回复 GBM 即可获取。

5 lightGBM的坑

5.1 设置提前停止

如果在训练过程中启用了提前停止,可以用 bst.best_iteration从最佳迭代中获得预测结果:

ypred = bst.predict(data,num_iteration = bst.best_iteration )

5.2 自动处理类别特征

当使用本地分类特征,LightGBM能提供良好的精确度。不像简单的one-hot编码,lightGBM可以找到分类特征的最优分割。  
用categorical\_feature指定分类特征  
首先需要转换为int类型,并且只支持非负数。转换为连续范围更好。








使用min\_data\_per\_group,cat\_smooth去处理过拟合(当#data比较小,或者#category比较大)  
对于具有高基数的分类特征(#category比较大),最好转换为数字特征。  

5.3 自动处理缺失值

lightGBM通过默认方式处理缺失值,可以通过设置use\_missing = false 来使其无效。  
lightGBM通过默认的方式用NA(NaN)去表示缺失值,可以通过设置zero\_as\_missing = true 将其变为0  
当设置zero\_as\_missing = false(默认)时,在稀疏矩阵里(和lightSVM),没有显示的值视为0  
当设置zero\_as\_missing = true时,NA和0(包括在稀疏矩阵里,没有显示的值)视为缺失。   

https://blog.csdn.net/weixin\_39807102/article/details/81912566


阅读过本文的人还看了以下:

分享《深度学习入门:基于Python的理论与实现》高清中文版PDF+源代码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

搜索公众号添加: datayx

picture.image

长按图片,识别二维码,点关注

访问AI图谱

https://loveai.tech

picture.image

picture.image

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
vivo 容器化平台架构与核心能力建设实践
为了实现规模化降本提效的目标,vivo 确定了基于云原生理念构建容器化生态的目标。在容器化生态发展过程中,平台架构不断演进,并针对业务的痛点和诉求,持续完善容器化能力矩阵。本次演讲将会介绍 vivo 容器化平台及主要子系统的架构设计,并分享重点建设的容器化核心能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论