用通俗易懂的方式讲解:lightGBM 算法及案例(Python 代码)

2023-11-08

1 介绍lightGBM之前

1.1 lightGBM演进过程

image-20191202130509524

1.2 AdaBoost算法

AdaBoost是一种提升树的方法,和三个臭皮匠,赛过诸葛亮的道理一样。

AdaBoost两个问题:

(1) 如何改变训练数据的权重或概率分布
提高前一轮被弱分类器错误分类的样本的权重,降低前一轮被分对的权重
(2) 如何将弱分类器组合成一个强分类器,亦即,每个分类器,前面的权重如何设置
采取”多数表决”的方法.加大分类错误率小的弱分类器的权重,使其作用较大,而减小分类错误率大的弱分类器的权重,使其在表决中起较小的作用。

1.3 GBDT算法以及优缺点

GBDT和AdaBosst很类似,但是又有所不同。

  • GBDT和其它Boosting算法一样,通过将表现一般的几个模型(通常是深度固定的决策树)组合在一起来集成一个表现较好的模型。

  • AdaBoost是通过提升错分数据点的权重来定位模型的不足, Gradient Boosting通过负梯度来识别问题,通过计算负梯度来改进模型,即通过反复地选择一个指向负梯度方向的函数,该算法可被看做在函数空间里对目标函数进行优化。

因此可以说 。

GradientBoosting=GradientDescent+BoostingGradientBoosting=GradientDescent+BoostingGradientBoosting=GradientDescent+Boosting

缺点:

GBDT ->预排序方法(pre-sorted)

  • (1) 空间消耗大
    • 这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里需要消耗训练数据两倍的内存
  • (2) 时间上也有较大的开销。
    • 在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。
  • (3) 对内存(cache)优化不友好。
    • 在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。
    • 同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

1.4 启发

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

而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。

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

尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

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

2 什么是 lightGBM

lightGBM是2017年1月,微软在GItHub上开源的一个新的梯度提升框架。在开源之后,就被别人冠以“速度惊人”、“支持分布式”、“代码清晰易懂”、“占用内存小”等属性。

LightGBM主打的高效并行训练让其性能超越现有其他boosting工具。在Higgs数据集上的试验表明,LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6。

3 lightGBM 原理

lightGBM 主要基于以下方面优化,提升整体特特性:

  1. 基于Histogram(直方图)的决策树算法
  2. Lightgbm 的Histogram(直方图)做差加速
  3. 带深度限制的Leaf-wise的叶子生长策略
  4. 直接支持类别特征
  5. 直接支持高效并行

具体解释见下

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

直方图算法的基本思想是

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

Eg:

[0, 0.1) --> 0;

[0.1,0.3) --> 1;

image-20191129114925562

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

image-20191129115042904

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

当然,Histogram算法并不是完美的。由于特征被离散化后,**找到的并不是很精确的分割点,所以会对结果产生影响。**但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。

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

一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。

通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。

利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

image-20191129115130409

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

Level-wise便利一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。

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

image-20191129114209679

Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。

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

image-20191129114318484

3.4 直接支持类别特征

实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的0/1特征,降低了空间和时间的效率。

而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。并在决策树算法上增加了类别特征的决策规则。

在Expo数据集上的实验,相比0/1展开的方法,训练速度可以加速8倍,并且精度一致。目前来看,LightGBM是第一个直接支持类别特征的GBDT工具。

3.5 直接支持高效并行

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

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

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

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

image-20191129115433096

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

    image-20191129115550512

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

    image-20191129115637083

4 小结

  • lightGBM 演进过程

    image-20191202130509524

  • lightGBM优势

    • 基于Histogram(直方图)的决策树算法
    • Lightgbm 的Histogram(直方图)做差加速
    • 带深度限制的Leaf-wise的叶子生长策略
    • 直接支持类别特征
    • 直接支持高效并行

5 LightGBM案例:客户违约预测模型

银行等金融机构经常会根据客户的个人资料、财产等情况,来预测借款客户是否会违约,以便进行贷前审核、贷中管理、贷后违约处理等工作。金融处理的就是风险,需要在风险和收益之间寻求一个平衡点,现代金融在某种程度上是一个风险定价的过程。通过海量数据对客户进行风险评估并进行合适的借款利率定价,这便是一个典型的风险定价过程,又称为大数据风控。

5.1 模型搭建

LightGBM算法既能做分类分析,又能做回归分析,对应的模型分别为LightGBM分类模型(LGBMClassifier)和LightGBM回归模型(LGBMRegressor)。

这里以分类模型为例简单演示。

5.1.1 读取数据

在这里插入图片描述

先读取1000条客户信息及违约表现数据。

特征变量有收入、年龄、性别、历史授信额度、历史违约次数;

目标变量为是否违约,若违约则标记为1,否则标记为0。

5.1.2 提取特征变量和目标变量、划分训练集和测试集
X = df.drop(columns='是否违约')
y = df['是否违约']

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123)
5.1.3 模型训练和搭建

在这里插入图片描述

5.2 模型预测及评估

模型搭建完毕后,通过如下代码对测试集数据进行预测。

在这里插入图片描述

通过如下代码汇总预测值和实际值,以便进行对比。

在这里插入图片描述

通过如下代码可以查看模型整体的预测准确度。

在这里插入图片描述

LGBMClassifier在本质上预测的并不是准确的0或1的分类,而是预测样本属于某一分类的概率,可以用predict_proba()函数查看预测属于各个分类的概率,代码如下。

在这里插入图片描述

通过如下代码可以绘制ROC曲线来评估模型的预测效果。

在这里插入图片描述

通过如下代码计算模型的AUC值。

在这里插入图片描述

通过如下代码对特征名称和特征重要性进行汇总,以便筛选出客户违约预测中最重要的特征变量。

在这里插入图片描述

可以看到,“收入”的特征重要性最高,“历史授信额度”的特征重要性为第二高,“性别”的特征重要性最低。“历史违约次数”的特征重要性不是很高,这与经验认知不符,可能的原因是本案例的数据较少,而实际应用中当数据量较大时,该特征还是有较高的特征重要性的。

另外需要注意的一点是,之前学过的机器学习模型的特征重要性为小数,而LightGBM模型的特征重要性均为整数。

5.3 模型参数调优

使用GridSearch网格搜索进行参数调优,代码如下。

from sklearn.model_selection import GridSearchCV
parameters = {'num_leaves':[10,15,31],'n_estimators':[10,20,30],'learning_rate':[0.05,0.1,0.2]}
model = LGBMClassifier()
grid_search = GridSearchCV(model,parameters,scoring='roc_auc',cv=5)
grid_search.fit(X_train,y_train)
grid_search.best_params_

# 输出
# {'learning_rate': 0.1, 'n_estimators': 20, 'num_leaves': 10}

也就是说,针对本案例的数据,弱学习器的权重缩减系数设置为0.1,最大迭代次数设置为20,决策树的最大叶子节点数设置为10时,模型的预测效果最佳。

知识拓展

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用通俗易懂的方式讲解:lightGBM 算法及案例(Python 代码) 的相关文章

随机推荐

  • 中间件Redis简介

    Redis概述 什么是redis Redis是一种支持key value等多种数据结构的高速缓存数据库 用C语言编写 可以用于缓存 事件发布和订阅 高速队列等场景 提供字符串 哈希 列表 队列 集合直接存存取 基于内存 可以持久化 为什么要
  • DeFi撑爆以太坊基础设施,近1亿美元BTC已进入以太坊生态

    编译 隔夜的粥 以太坊和DeFi在过去几个月里经历了爆炸性的增长 这已经不是什么秘密了 在过去2 3周里 它们已达到了一个全新的水平 各种应用的使用量增长如此之快 以至于给以太坊主要基础设施提供商TheGraph带来了巨大压力 导致其支持的
  • C中字符串操作

    字符串可以看作一个数组 它的每个元素是字符型的 例如字符串 Hello world n 图示如下 H e l l o w o r l d n 0 15个字符 注意每个字符串末尾都有一个字符 0 做结束符 这里的 0是ASCII码的八进制表示
  • 初识运营,明晰运营的学习路径

    关于运营的思考 问题1 运营是什么 运营到底是做什么工作的 如题 到底什么是运营 为什么我们所接触到的很多运营都不太一样 有的运营就是每天追寻互联网热点 加班加点的写文案 有的运营每天就是在不同的群里和成千上万的人唠嗑 有的运营活跃在不同的
  • html获取text输入框中的值

    1 在head中引用jquery 2 定义一个text输入框
  • 指针用作函数参数、指针型函数和函数指针

    指针用作函数参数 以前我们学过的函数参数要么是基本数据类型的变量 要么是类的对象 又或者是数组名 前几讲学到的指针同样可以用作函数参数 指针作函数形参时 我们调用此函数将实参值传递给形参后 实参和形参指针变量将指向相同的内存地址 那么在被调
  • Linux主要命令功能

    1 dmesg 主要用来显示内核信息 使用dmesg可以有效诊断机器硬件故障或者添加硬件出现的问题 另外使用dmesg可以确定你的服务器安装了那些硬件 每次系统重启 系统都会检查所有硬件并将信息记录下来 执行 bin dmesg命令可以查看
  • 第十届蓝桥杯真题-灵能传输

    题目 OJ https www lanqiao cn problems 196 learning 考点 前缀和 贪心 思路 题目意思就是希望通过灵能交换后使得不稳定度最小 假设对a i 进行灵能传输 可以发现前缀和s i 1 和s i 进行
  • Java值传递和引用传递详细说明(详细分析)

    1 形参与实参 我们先来重温一组语法 形参 方法被调用时需要传递进来的参数 如 func int a 中的a 它只有在func被调用期间a才有意义 也就是会被分配内存空间 在方法func执行完成后 a就会被销毁释放空间 也就是不存在了 实参
  • FormData同时传输多个文件和其他数据

    近日有个需求是 在web的对话框中 用户可以输入文本内容和上传附件 附件的数量不限 所有附件总和大小不超过20M 这个实现的方法不止一种 比如之前的后端同事是要求 文件和文本分开传输 文件用一个单独接口上次 上传成功后返回一个id 把这个i
  • 【论文翻译】Iterative Geometry Encoding Volume for Stereo Matching and Multi-View Stereo(CVPR 2023)

    一 论文简述 1 第一作者 Gangwei Xu 2 发表年份 2023 3 发表期刊 CVPR 4 关键词 立体匹配 MVS 几何编码体 GRU 3D卷积 5 探索动机 RAFT的全对相关体缺乏非局部几何知识 难以处理病态区域的局部模糊
  • perp系列之五:perp安装

    perp系列之五 perp安装 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 29 初稿 目录 文章目录 perp系列之五 perp安装 版本说明 目录 概要 描述 激活 升级 例子 概要 vi conf mk make m
  • Vmware虚拟机设置静态IP地址

    一 安装好虚拟后在菜单栏选择编辑 虚拟网络编辑器 打开虚拟网络编辑器对话框 选择Vmnet8 Net网络连接方式 随意设置子网IP 点击NAT设置页面 查看子网掩码和网关 后面修改静态IP会用到 二 检查宿主机VM8 网卡设置 打开网络和共
  • 欧科云链OKLink:2023年6月安全事件盘点

    一 基本信息 2023年6月REKT和RugPull事件约造成约1000万美元损失 相比上月有显著下降 但安全事件发生数量依旧不减 其中被废弃的Atlantis Loans遭受治理攻击 造成的损失超250万美元 对该协议有过授权的用户需及时
  • Faster R-CNN详解

    Faster R CNN代码实现详解参见 faster rcnn源码详解 樱花的浪漫的博客 CSDN博客 faster rcnn源码 Faster rcnn详细注释版源码地址 faster rcnn源码详细注释版 每一步均有详细批注 深度学
  • 目标检测 实践

    文章目录 0 数据标注via 一 添加图片 二 定义标记类型 Attributes 三 标注 四 导出标注文件 1 模型 1 1 数据准备 1 2 模型训练 1 3 模型使用 1 4 改进方向 0 数据标注via via工具的界面如下图所示
  • python3中多项式创建_利用 Python3 ,实现数学科学计算

    SymPy是符号数学的Python库 旨在用一套强大的符号计算体系完成诸如多项式求值 求极限 解方程 求积分 微分方程 级数展开 矩阵运算等等计算问题 虽然Matlab的类似科学计算能力也很强大 但是Python以其语法简单 易上手 异常丰
  • JDBC和数据库连接池

    JDBC 基本介绍 JDBC原理 模拟JDBC public class MysqlJdbcImp implements JdbcInterface Override public Object getConnection System o
  • 解决element ui select下拉框不回显数据问题

    最近在做一个项目 项目的后端是地址 https github com wangyuanjun008 wyj springboot security git 前端地址是 https github com wangyuanjun008 wyj
  • 用通俗易懂的方式讲解:lightGBM 算法及案例(Python 代码)

    文章目录 1 介绍lightGBM之前 1 1 lightGBM演进过程 1 2 AdaBoost算法 1 3 GBDT算法以及优缺点 1 4 启发 2 什么是 lightGBM 3 lightGBM 原理 3 1 基于Histogram