一直想把XGBoost和LightGBM的原理及应用梳理完分享给大家,但是内容有点多,也有些存疑的点在慢慢厘清,这篇文章也是断断续续在整理。
今天终于梳理完Lightgbm原理啦,希望对大家有帮助。
对XGBoost原理、参数详解、实战感兴趣可翻看历史文章:XGBoost三部曲:XGBoost原理、XGBoost三部曲:XGBoost参数详解、XGBoost三部曲:XGBoost实战。
LigthGBM是微软开发的一款高性能梯度提升框架,是一种集成学习算法,属于Boosting类型,通过叠加多个决策树的预测结果得出最终的预测结果。
这个算法基于GBDT,对树模型基础知识不了解的小伙伴可以翻看之前的文章:Python中调用sklearn决策树、一文弄懂随机森林的原理和应用、一文弄懂GBDT原理和应用。
本文目录
- 名词解释
- 为什么需要LightGBM
- 核心引擎:损失函数求解与叶子节点生成
3.1 LightGBM算法原理理解简单案例
3.2 LightGBM算法原理公式推导 4. 核心创新原理
4.1 基于直方图的决策树算法
4.2 单边梯度采样
4.3 互斥特征捆绑 5. 其他优化技术
5.1 叶子生长策略
5.2 直接支持类别特征 6. 性能对比
适用场景
一、名词解释
集成学习 :通过构建并结合多个机器学习模型来改善模型的性能。通过训练多个模型,并将它们的预测结果进行某种方式的结合,通常可以得到比单一模型更好的预测结果。
Bagging :是Bootstrap Aggregating的缩写,是一种通过结合多个模型的预测结果来减少模型方差的方法。在Bagging中,每个模型都是在原始数据集的随机子集上进行训练的,这些随机子集是通过有放回的抽样得到的。然后,所有模型的预测结果通过投票(对于分类问题)或平均(对于回归问题)的方式进行结合,典型的代表是随机森林。
Boosting :基本思想是三个臭皮匠赛过诸葛亮。算法思路是采用串行的方式训练基分类器,每一层在训练时,给前一层基分类器分错的样本更高的权重,最后把各层分类器的结果层层加权叠加得到最终的结果。
GBDT :是Gradient Boosting Decision Tree的缩写,是一种基于决策树的集成学习算法,也是一种迭代式的boosting算法。基本原理是迭代地训练决策树,每次训练都基于之前训练结果来进行优化。训练过程基于梯度下降的思想,使用了加法模型和函数优化方法。
XGBoost :是eXtreme Gradient Boosting的缩写,是一个优化的分布式梯度增强库,是梯度提升算法的一种高效实现。它的核心在于将许多弱分类器(通常是决策树)组合成一个强大的分类器。每一个新的弱分类器都致力于纠正之前所有弱分类器的错误,通过不断迭代,逐步提升模型的准确性。
LightGBM :是Light Gradient Boosting Machine是微软开发的一款高性能梯度提升框架,核心是 “梯度提升树(GBDT)” 的一种高效实现,其模型结构是加法模型 ,即最终预测结果由多棵决策树的输出累加得到。
二、为什么需要LightGBM
传统的GBDT(Gradient Boosting Decision Tree)算法虽然有效,但在处理大规模数据时面临两个挑战:
1.计算效率低:需要遍历所有数据点计算分裂点。
2.内存消耗大:需要保存整个数据集的特征值和梯度信息。
LightGBM通过三大技术创新解决了这些问题。
三、核心引擎:损失函数求解与叶子节点生成
要理解LightGBM如何学习,关键在于弄明白两个问题:
①如何衡量一颗树的好坏?—>通过损失函数。
②如何生成一颗好的树?—>通过优化损失函数来分裂叶子节点。
接下来对LightGBM的算法原理进行详细拆解。
1 LightGBM算法原理理解简单案例
为了大家能直观地感受LightGBM的算法流程,先看一个简单的例子。
我们应用LightGBM算法预测客户的年龄,假设客户的真实年龄为40岁,通过训练弱学习器1(决策树1),得到客户的预测年龄为30岁,此时预测年龄和真实年龄差值为10岁(残差)。接着训练弱学习器2来拟合残差10岁,依次类推,直到残差值小于给定的阈值。
LightGBM算法的核心是对残差进行预测,上图预测年龄的最终结果是:30+5+3+1=40岁。
这种思想有点类似我们考试对错题的梳理。首先做一张卷子,然后对卷子进行评估,把错题挑出来,对做错的题重点突破,再对错题进行一轮测试,然后把再次做错的题挑出来,进行重点突破,再对错题进行测试,以此类推,最终的得分是所有轮次得分的和。
2 LightGBM算法原理公式推导
上面从感性的角度对LightGBM原理进行了介绍,本节从理性的角度出发,对LightGBM算法原理进行数学推导。
为了大家更轻松地理解后续公式推导,可以先翻看GBDT的算法原理推导文章:一文弄懂GBDT原理和应用。
接着进入本文的核心,LightGBM原理推导。
首先介绍LightGBM算法的目标函数,再逐步拆解如何求目标函数的最小值。
2.1 目标函数
LightGBM和GBDT一样通过串行训练多棵决策树来生成集成模型,通过不断地进行特征分裂来生长一颗新树,去拟合上次预测的残差。
我们的目标是训练足够多的树让残差越小,即让树群的预测值尽量接近真实值,并且有足够大的泛化能力。
LightGBM的目标函数在GBDT的基础上引入了正则项,可以表示为:
即目标函数分为两部分:加号前面表示损失函数(控制训练误差,即预测值和真实值的差值),加号后面表示正则项(控制模型复杂度)。
一般来说,损失函数让模型尽可能地去拟合训练数据,使得模型有较少的偏差。而正则项鼓励更加简单的模型,让有限的数据拟合出来的结果随机性比较小,不容易过拟合,使得最后模型的预测更加稳定。
即满足了我们的目标,预测值尽量接近真实值,并且有足够大的泛化能力。
2.2 损失函数
目标函数的第一部分即损失函数:
其中i表示第i个样本,yi表示第i个样本的真实值,逗号后面的y表示第i个样本的预测值。
整体表示n个样本的预测误差和,我们的目标是希望整体预测误差越小越好。
之前提到,LightGBM每一次迭代,是在前一轮迭代的基础上,通过新增一颗树去拟合上次预测的残差。
故前t颗树的预测值,可以拆分成前t-1颗树的预测值加上第t颗树的预测值。
即
把上面的式子进行二阶泰勒展开:
把第t颗树的预测值当成Δx,损失函数可展开成:
令
则损失函数可进一步写成:
由于第t颗回归树是根据前面t-1颗回归树的残差训练得到的,即在第t轮训练时t-1颗树对应的预测值
是已知值,即
是已知值,在对目前函数求最小值时可以去掉。
即目标函数可以写成:
2.3 正则项
目标函数的第二部分即正则项:
它定义的是树的复杂度。
为了理解这个公式,我们先定义一颗树。
1.每个样本通过对特征进行划分后,最终会落到一个叶子节点上。
2.q(x)对应的数值,表示样本x在该数值对应的叶子结点上。上图中一共有3个叶子结点,q(x)=3,表示样本x落在第3个叶子结点上。
3.wq(x)对应该节点的打分,或者叫该样本的模型预测值。如w2=0.1,表示落在第2个叶子结点的样本模型预测值为0.1。
4.一颗树中叶子节点的个数称为T。
有了上述定义后,我们来看下第t颗树正则项的定义。
其中γ表示结点切分的难度,也可以理解成控制叶子结点个数的约束项,防止树在生长过程中过拟合。
λ表示L2正则化系数,约束单颗树的模型预测值不会在所有树中占比过高,也能防止模型过拟合。
假设我们训练了t颗树,则模型正则项可以写成前t-1颗树正则项的和加上第t颗树正则项。
故目标函数的第二部分正则项可以写成:
由于在训练第t颗树时,前t-1颗树已经训练完成,所以前t-1颗树的叶子结点个数,以及每个叶子结点对应的wq(x)都是已知值。
故在第t轮训练中,前t-1颗树的正则项是常值,在求最值时可以去掉。
故目标函数可由:
进一步写成:
把预测值替换成wq(x)的形式,并代入正则项公式,可得:
把对样本求和,改写成对叶子结点求和,可得:
其中j从1到T,表示叶子结点的个数,Ij为叶子结点中样本下标的集合,即Ij={i|q(xi)=j},即每个样本xi都能通过函数q(xi)映射到树的某个叶子结点。
上式合并同类项可得:
令
其中Gj表示叶子结点j所包含样本的一阶偏导数累加和,Hj表示叶子结点j所包含样本的二阶偏导数累加和,都是是常量。
可得:
上式中Gj、Hj、λ、γ、T都是常数,wj是变量,求最值时,可以当成一元二次方程进行求解。
Hj二阶可导,故函数是凸函数,故Hj大于0,同时λ大于0,故一元二次方程中a大于0,函数开口向上。
目标函数在
处取得最小值,即为最优解。
把最优解代入目标函数,可得:
2.4 打分函数的计算
当我们确定了一颗树的结构时,就可以根据刚刚推导出来的目标函数公式求得目标函数值。
且目标函数值越小,说明树的结构越好。
2.5 如何确定树结构
前面已经详细介绍了LightGBM算法原理以及打分函数的计算。明白只要知道树的结构,就能得到该结构下的最好分数。
那如何确定树的结构呢?答案是贪心地寻找最佳分裂点。
-
分裂前 ,所有样本在一个节点中,假设其损失分数为Score_before。
-
尝试某个特征和分裂点 ,将样本划分到左、右两个子节点。计算分裂后的损失分数Score_after。
-
分裂带来的增益(Gain)就是损失分数的减少量:Gain = Score_before - (Score_left + Score_right)
LightGBM的分裂决策 :它会遍历所有可能的分裂点(在直方图上遍历桶),选择 增益Gain最大 的那个分裂点。
只有当最大增益大于0(即分裂确实能降低损失)时,才会进行分裂。参数γ
在这里起到了预剪枝的作用。
四、核心创新原理
LightGBM相较于XGBoost算法,核心创新包括:直方图、单边梯度采样、互斥特征捆绑。接下来一一介绍。
1 基于直方图的决策树算法
将连续的浮点特征离散成k个整数,并构造宽度为k的Histogram,然后遍历训练数据,统计每个离散值在直方图中的累计统计值。
在进行特征选择时,只要根据直方图的离散值,遍历寻找最优的分割点。
这样做的优点是:
- 降低内存使用:只需存储离散化后的值。
- 减少计算量:从O(#data × #features)降到O(k × #features)。
- 增加缓存命中率:顺序访问离散化值。
需要注意的是:使用bin替代原始数据相当于增加了正则化。
①使用bin意味者更多细节特征被丢弃,相似的数据可能被划分到了相同的桶里。
②bin数量选择决定了正则化的程度,bin越少惩罚越重,欠拟合风险越高。
③直方图除了保存划分阈值和当前bin内样本数外,还保存了当前bin内所有样本的一阶梯度。
④阈值的选择是按照直方图从小到大遍历,使用了上面的一阶梯度和,目的是得到划分loss最大的特征及阈值。
2 单边梯度采样
Goss(Gradient-based One-Side Sampling)算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。
算法流程:
①Goss首先将要进行分裂的特征的所有取值按照绝对值大小降序排序(XGBoost一样也进行了排序,但是LightGBM不用保存排序后的结果),选取绝对值最大的a%*100%个数据。
②然后在剩下的较小梯度数据中选择b*100%个数据。
③接着将这b*100%个数据乘以一个常数(1-a)/b,这样算法就会更关注训练不足的样本,而不会过多改变原数据集的分布。
④最后使用这(a+b)*100%个数据来计算信息增益。
总的来说,保留梯度较大的样本,随机采样梯度较小的样本,在计算信息增益时对采样数据引入常数乘子进行补偿,这样既保持了数据分布的准确性,又大幅减少了计算量。
3 互斥特征捆绑
高维特征的数据往往是稀疏的(特征互斥不会同时取非零值),这种稀疏性启发我们设计一种无损的方法(图着色)来减少特征的维度。
算法步骤如下:
①将特征按照非零值的个数进行排序。
②计算不同特征之间的冲突比例。
③遍历每个特征并尝试合并特征,使冲突比率最小化。
④将特征直方图合并为捆绑特征的直方图。
这样特征数量从N减少到M,显著降低计算复杂度。
五、其他优化技术
LightGBM还调整了叶子生长策略,并直接支持类别特征,具体介绍如下:
1 叶子生长策略
与传统GBDT的水平生长方式不同,LightGBM采用如下叶子生长策略:
-
每次从当前所有叶子中,选择分裂增益最大的叶子进行分裂。
-
在分裂次数相同的情况下,能获得更好的精度。
-
可能导致过拟合,可通过max_depth参数控制。
2 直接支持类别特征
无需one-hot编码,LightGBM采用了many vs many的切分方法,实现了类别特征的最优切分。
算法流程:
①在枚举分割点之前,先把直方图按每个类别的label均值进行排序。
②按照排序的结果依次枚举最优分割点。
六、性能对比
与XGBoost相比,LightGBM具有明显优势:
-
训练速度提升2-10倍。
-
内存消耗降低30-50%。
-
准确率相当甚至更高。
-
支持并行和GPU学习。
七、适用场景
LightGBM特别适用于:
- 大规模数据集(百万级以上样本)。
- 高维特征数据(千级以上特征)。
- 需要快速训练的实时应用场景。
- 计算资源有限的环境。
LightGBM不仅通过直方图算法、单边梯度采样和互斥特征捆绑三大核心技术实现了效率的飞跃。
其背后坚实的数学基础— 基于泰勒展开的损失函数求解和基于增益的叶子节点分裂策略, 构成了其强大性能的核心引擎。
这使其成为处理大规模数据时兼顾精度与速度的首选梯度提升框架。
后续我们将深入讲解LightGBM的参数和实战应用,敬请期待!
对风控建模感兴趣的小伙伴欢迎加群讨论。
【进群】 分群讨论学习Python、玩转Python、风控建模【29.9元进】、人工智能、数据分析相关问题,还提供招聘内推信息、优秀文章、学习视频、公众号文章答疑,也可交流工作中遇到的难题。如需添加微信号19967879837,加时备注想进的群,比如风控建模。
参考文献
https://zhuanlan.zhihu.com/p/1903224259901358108
https://blog.csdn.net/qq_70350287/article/details/150075547
https://blog.csdn.net/qq_32623363/article/details/113478904
https://xfyun.csdn.net/68c37a299fb7310a2c2a75ee.html?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7Eactivity-6-134108203-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7Eactivity-6-134108203-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=12
https://wenku.csdn.net/column/7ceotsdfb0?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-c_download-2%7Edefault%7EOPENSEARCH%7EPosition-19-1pzrgpqy4d-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-c_download-2%7Edefault%7EOPENSEARCH%7EPosition-19-1pzrgpqy4d-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=19
https://mcp.csdn.net/68006fbda5baf817cf491f5a.html?spm=1001.2101.3001.6650.16&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7Eactivity-16-83659932-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7Eactivity-16-83659932-blog-150075547.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=22
往期回顾:
一文囊括风控模型搭建(原理+Python实现),持续更新。。。
限时免费加群
19967879837
添加 微信号、手机号