LightGBM

1. 简介

1.1 定义

1.2 特点

  • 速度惊人
  • 支持分布式
  • 代码清晰易懂
  • 占用内存小
  • LightGBM主打的高效并行训练让其性能超越现有其他boosting工具
  • 在Higgs数据集上的试验表明,LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6。

higgs数据集:这是一个分类问题,用于区分产生希格斯玻色子的信号过程和不产生希格斯玻色子的信号过程。
数据链接:https://archive.ics.uci.edu/ml/datasets/HIGGS

2. 原理

  • lightGBM 主要基于以下方面优化,提升整体特特性:
  1. 基于Histogram(直方图)的决策树算法
  2. Lightgbm 的Histogram(直方图)做差加速
  3. 带深度限制的Leaf-wise的叶子生长策略
  4. 直接支持类别特征
  5. 直接支持高效并行

2.1 基于Histogram(直方图)的决策树算法

1. 基本思想

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

Eg:
[0, 0.1) --> 0;
[0.1,0.3) --> 1;

在这里插入图片描述

2. 特点

2.1 优点
  • 最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8
    在这里插入图片描述
  • 计算上的代价也大幅降低,预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常
    数),时间复杂度从O(#data#feature)优化到O(k#features)
2.2 缺点
  • 由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。
  • 但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。
  • 原因:
    • 决策树本来就是弱模型,分割点是不是精确并不是太重要;
    • 较粗的分割点也有正则化的效果,可以有效地防止过拟合;
    • 即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

2.2 Lightgbm 的Histogram(直方图)做差加速

  • 一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到
  • 通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶
  • 利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍
    在这里插入图片描述

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

1. 简介

  • Level-wise遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。
  • 但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

在这里插入图片描述

2. 特点

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

2.4 直接支持类别特征

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

Expo数据集介绍:数据:http://stat-computing.org/dataexpo/2009/the-data.html包含1987年10月至2008年4月美国境内所有商业航班的航班到达和离开的详细信息。这是一个庞大的数据集:
总共有近1.2亿条记录。主要用于预测航班是否准时。
数据链接:http://stat-computing.org/dataexpo/2009/

2.5 直接支持高效并行

  • LightGBM还具有支持高效并行的优点。LightGBM原生支持并行学习,目前支持特征并行和数据并行的两种。
    • 特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
    • 数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。
  • LightGBM针对这两种并行方法都做了优化: 在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;
    在这里插入图片描述
  • 数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步
    减少了一半的通信量。
    在这里插入图片描述
  • 基于投票的数据并行(Voting Parallelization)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时
    候,使用投票并行可以得到非常好的加速效果。
    在这里插入图片描述
Light GBM(Light Gradient Boosting Machine)是一个基于决策树的梯度提升框架,具有高效、快速、内存占用低等优点,特别适用于大规模数据集的建模任务。以下是使用 Light GBM 的基本指南: ### 安装 Light GBM Light GBM 支持多种语言接口,包括 Python、R 和命令行接口。以 Python 为例,可以通过 pip 安装: ```bash pip install lightgbm ``` 如果需要使用 GPU 加速,可以通过额外的编译步骤启用 GPU 支持。 ### 数据准备 Light GBM 可以处理多种格式的数据,包括 NumPy 数组、Pandas DataFrame 和 LibSVM 格式文件。通常使用 `lightgbm.Dataset` 来加载数据: ```python import lightgbm as lgb import numpy as np # 示例数据 X_train = np.random.rand(100, 10) y_train = np.random.randint(0, 2, size=100) # 加载数据集 train_data = lgb.Dataset(X_train, label=y_train) ``` ### 参数设置 Light GBM 的参数设置非常灵活,主要包括任务类型、提升类型、树的结构等参数。以下是一个典型的参数配置: ```python params = { 'objective': 'binary', # 任务类型,例如二分类 'boosting_type': 'gbdt', # 提升类型 'num_leaves': 31, # 叶子节点数量 'learning_rate': 0.05, # 学习率 'feature_fraction': 0.9, # 每次迭代中随机选择的特征比例 'bagging_fraction': 0.8, # 数据抽样比例 'bagging_freq': 5, # 每 k 次迭代进行一次 bagging 'verbose': 0 # 日志详细程度 } ``` ### 训练模型 使用 `lightgbm.train` 方法进行模型训练: ```python # 训练模型 model = lgb.train(params, train_data, num_boost_round=100) ``` ### 预测与评估 训练完成后,可以使用模型进行预测,并通过评估指标(如准确率、AUC 等)来衡量模型性能: ```python # 预测 X_test = np.random.rand(50, 10) y_pred = model.predict(X_test) # 将概率转换为类别预测 y_class = [1 if p >= 0.5 else 0 for p in y_pred] ``` ### 交叉验证 Light GBM 提供了内置的交叉验证功能,可用于选择最佳的迭代次数和评估模型性能: ```python # 交叉验证 cv_results = lgb.cv(params, train_data, num_boost_round=100, nfold=5) best_num_boost_round = len(cv_results['binary-mean']) ``` ### 特征重要性 Light GBM 可以轻松地可视化特征重要性,帮助理解模型的决策过程: ```python # 可视化特征重要性 lgb.plot_importance(model) ``` ### 总结 Light GBM 是一个功能强大且高效的梯度提升框架,适用于各种机器学习任务。通过上述步骤,可以快速上手并构建高性能的模型。在实际应用中,建议根据具体任务调整参数,以获得最佳的模型性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值