LightGBM(Light Gradient Boosting Machine)是微软的开源分布式高性能Gradient Boosting框架,使用决策树的学习算法,下面介绍以下这个框架的优化。

1、速度、内存方面的优化

许多提升工具使用基于预排序的算法(近似直方图算法)(例如XGBoost中的默认算法)来进行决策树学习。这是一个比较简单的解决方案,但不容易优化。LightGBM使用基于直方图的算法,它将连续特征值存储到离散区间。这可以加快训练速度并减少了内存使用量。

1.1 直方图算法的优点

降低计算分裂增益的成本
基于预排序的算法具有时间复杂性 O(训练样本的个数),计算直方图具有时间复杂度O(训练样本的个数),但这仅当在执行总结操作时发生;
构建完直方图后,基于直方图的算法具有时间复杂度O(某个特征不同值的个数),因为某个特征不同值的个数远小于训练样本的个数;
使用直方图的相减进一步加速
在计算某个叶子节点的直方图时,通过它的父节点和它的相邻节点的直方图相减,得到;
根据上条可知,每次分裂仅需要为一个叶子节点构建直方图,另一个叶子节点的可以通过直方图的减法获得,成本较低;
减少内存的使用
用离散箱替换连续值。如果某个特征不同值的个数很小,可以使用小数据类型,例如uint8_t来存储训练数据,无需存储用于预排序特征值的其他信息
降低并行学习的通信成本

2、针对稀疏特征优化

对于稀疏的特征只需要O(2 * 非零值的样本个数)的时间复杂度来构造直方图

3、优化树的生长策略来提高准确率

3.1 最好的叶子节点优先分裂(Leaf_wise)的决策树生成策

大多数决策树学习算法生成树的策略是以同样的深度生成树(Level_wise),生成树的示例见下图:

而LightGBM以Leaf_wise的方式生成。它将选择具有最大增益损失的叶子节点来分裂。当两种方式生成的树具有相等的叶子节点时,Leaf_wise策略生成的树会比Level_wise的拟合度更高。
对于样本较少的情况,Leaf_wise方式可能会导致过度拟合,因此LightGBM中利用参数max_depth来限制树的深度。Leaf_wise方式生成的树示例如下:

3.2 特征的最优分割点

通常使用独热编码来转换分类特征,但这种方法对于决策树的学习并不是有益的。特别是对于不同值较多的特征,独热编码后构建的树往往是不平衡的,并且需要非常大的深度才能获得较好的准确率。
事实上,最佳解决方案是通过将类别划分为2个子集。如果特征具有K个不同的值,就是在2^(k-1) - 1种情况里找到最优的分割点。对于回归树而言,有一种解决方案可以保证在O(k * log(k))的时间复杂度内找到最优分割点。
找到特征的最优分割点的基本思想是根据训练目标的相关性对类别进行重排序。 更具体的说,根据累加值(sum_gradient / sum_hessian)重新对(类别特征的)直方图进行排序,然后在排好序的直方图中寻找最优的分割点。

4、网络通信的优化

在LightGBM的并行学习中,它只需要使用一些聚合通信算法,如“All reduce”,“All gather”和“Reduce scatter”。LightGBM实现了最先进的state-of-art算法。这些聚合通信算法可以提供比点对点通信更好的性能。

5、并行学习中的优化

LightGBM提供以下并行学习算法的优化:特征并行、数据并行、投票并行。

5.1 特征并行

传统算法中的特征并行,主要是体现在找到最好的分割点,其步骤为:

1.垂直分区数据(不同的线程具有不同的数据集);
2.在本地数据集上找到最佳分割点,包括特征,阈值;
3.再进行各个划分的通信整合并得到最佳划分;
4.以最佳划分方法对数据进行划分,并将数据划分结果传递给其他线程;
5.其他线程对接受到的数据进一步划分;

传统特征并行的缺点:

计算成本较大,传统特征并行没有实现得到"split"(时间复杂度为“O(训练样本的个数)")的加速。当数据量很大的时候,难以加速;
需要对划分的结果进行通信整合,其额外的时间复杂度约为 “O(训练样本的个数/8)”(一个数据一个字节)

LightGBM中的并行特征

由于特征并行在训练样本的个数大的时候不能很好地加速,LightGBM做了以下优化:不是垂直分割数据,而是每个线程都拥有完整的全部数据。因此,LightGBM不需要为分割数据结果进行通信,因为每个线程都知道如何划分数据。并且训练样本的个数不会变大,因此这种方案是合理的。

LightGBM中实现特征并行的过程:

1、每个线程在本地数据集上找到最佳分割点,包括特征,阈值;
2、本地进行各个划分的通信整合并得到最佳划分;
3、执行最佳划分;

然而,该并行算法在数据量很大时仍然存在计算上的局限。因此,建议在数据量很大时使用数据并行。

5.2 数据并行

传统算法数据并行旨在并行化整个决策学习。数据并行的过程是:

1、水平划分数据;
2、线程以本地数据构建本地直方图;
3、将本地直方图整合成全局直方图;
4、在全局直方图中寻找最佳划分,然后执行此划分;

传统数据并行的缺点:通信成本高。如果使用点对点通信算法,则一台机器的通信成本约为O(#machine * #feature * #bin)。如果使用聚合通信算法(例如“All Reduce”),通信成本约为O(2 * #feature * #bin)。

LightGBM中的数据并行

LightGBM中通过下面方法来降低数据并行的通信成本:

1、不同于“整合所有本地直方图以形成全局直方图”的方式,LightGBM 使用分散规约(Reduce scatter)的方式对不同线程的不同特征(不重叠的)进行整合。 然后线程从本地整合直方图中寻找最佳划分并同步到全局的最佳划分中;
2、LightGBM通过直方图的减法加速训练。 基于此,我们可以进行单叶子节点的直方图通讯,并且在相邻直方图上作减法;

通过上述方法,LightGBM 将数据并行中的通讯开销减少到O(0.5 * #feature * #bin)。

5.3 投票并行

投票并行进一步降低了数据并行中的通信成本,使其减少至常数级别。它使用两阶段投票来降低特征直方图的通信成本。

### 7、支持的应用和度量 #### 7.1 应用

回归,目标函数是L2损失
二进制分类,目标函数是logloss(对数损失)
多分类
交叉熵,目标函数是logloss,支持非二进制标签的训练
lambdarank,目标函数为基于NDCG的lambdarank

7.2 度量

L1 loss:绝对值损失
L2 loss:MSE,平方损失
Log loss:对数损失
分类错误率
AUC(Area Under Curve):ROC曲线下的面积
NDCG(Normalized Discounted Cumulative Gain):归一化折损累积增益
MAP(Mean Average Precision):平均精度均值
多类别对数损失
多类别分类错误率
Fair损失
Huber损失
Possion:泊松回归
Quantile:分位数回归
MAPE(Mean Absolute Percent Error):平均绝对百分比误差
kullback_leibler:Kullback-Leibler divergence
gamma:negative log-likelihood for Gamma regression
tweedie:negative log-likelihood for Tweedie regression
更多阅读原文

7.3 其他

限制树的最大深度max_depth
DART:Dropouts meet Multiple Additive Regression Trees
L1 / L2正则化
套袋
随即选择列(特征)子集
Continued train with input GBDT model
Continued train with the input score file
Weighted training
Validation metric output during training
交叉验证
Multi metrics
提前停止(训练和预测)
Prediction for leaf index

高级算法梳理之LightGBM相关推荐

  1. 高级算法梳理-XGB

    XGB算法梳理 1.算法原理 XGBoost(eXtreme Gradient Boosting)算法是Gradient Boosting算法的高效实现版本,因其在应用实践中表现出优良的效果和效率,因 ...

  2. 面试高级算法梳理笔记

    作者:尤汐_Jennica 链接: https://www.nowcoder.com/discuss/21253 来源:牛客网 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系 ...

  3. 高级算法梳理(三)XGB算法

    算法原理 XGBoost(eXtreme Gradient Boosting)是工业界逐渐风靡的基于GradientBoosting算法的一个优化的版本,可以给预测模型带来能力的提升.其算法思想就是不 ...

  4. Datawhale | 高级算法梳理第六期 Task3【XGB算法梳理】3天

    1. Introduction 在这篇文章中,我将介绍XGBoost(eXtreme Gradient Boosting),一种tree boosting的可扩展机器学习系统.这个系统可以作为开源的软 ...

  5. 高级算法梳理(一)随机森林算法梳理

    目录 1. 集成学习概念 2. 个体学习器概念 3. boosting和bagging 4. 结合策略(平均法,投票法,学习法) 5. 随机森林思想 6. 随机森林的推广 6.1 extra tree ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法24:LightGBM

    Python机器学习算法实现 Author:louwill Machine Learning Lab 第17讲我们谈到了竞赛大杀器XGBoost,本篇我们来看一种比XGBoost还要犀利的Boosti ...

  7. 【高级算法】禁忌搜索算法解决3SAT问题(C++实现)

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46440389 最近梳理,翻出了当年高级算法课程做的题目,禁忌搜索算法解决3SAT问 ...

  8. Spring高级技术梳理

    Spring高级技术梳理 序言 正文 SpringData部分 Spring全家桶之SpringData--预科阶段 Spring全家桶之SpringData--Spring 整合Hibernate与 ...

  9. Datawhale组队学习:初级算法梳理课程任务

    背景 Datawhale 是国内很有名的一个开源学习组织.这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起,营造出一种互促高效的学习环境,一起为开源学习付出努力. Datawhale ...

最新文章

  1. 面试官:你能说说MyBatis拦截器原理吗?
  2. Win64 驱动内核编程-21.DKOM隐藏和保护进程
  3. 设计模式之反射与配置文件
  4. 弹性碰撞后速度方向_找准模型,快速求解碰撞类问题
  5. 洛谷 - P7771 【模板】欧拉路径(Hierholzer算法)
  6. Python入门(03) -- 字典
  7. zookeeper 单机配置
  8. C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
  9. Spring Boot 启动类真的是XXApplication?
  10. 运筹学基础及其matlab,运筹学基础及其MATLAB应用
  11. java中statistic_Java Statistic類代碼示例
  12. 基于Tofu的热红外、多波段目标识别跟踪系统
  13. OM | 浅谈收益管理与动态定价
  14. python生成word目录_Python 文件与目录操作方法总结
  15. 打开Shapefile文件的正确方式
  16. 转载:关于NERO7刻录软件的使用
  17. java实现简单数独游戏
  18. Arcgis ModelBuilder给插值工具设置范围和颜色
  19. 计算机科学导论(1):绪论
  20. COG封装工艺的介绍

热门文章

  1. 黑马程序员前端实战项目---PC端品优购(下)
  2. 如何培养青少年的阅读习惯?父母应该从三个方面培养青少年的好兴趣
  3. 建模新手使用Maya的xGen功能后,角色毛发顺滑堪比使用海飞丝!
  4. 为什么Python是数据可视化编程的最佳选择?
  5. md5加密以及可逆的加密解密算法
  6. 接口测试用例设计方法方式和流程一文到底
  7. incr、incrby、decr、decrby命令的作用和用法
  8. 从网络访问此计算机guest密码,Windows XP网络共享访问总是弹出输入Guest密码对话框的解决...
  9. 【图解】连狗子都能看懂的Python基础总结(二)什么是库、包、模块?
  10. 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。