一、Light GBM
Light GBM是和xgboost类似的一种集成算法。xgboost算法的一个瓶颈是针对每个特征,它都需要对每一个可能的分裂点扫描全部的样本来计算基尼系数,这样大大增加了计算量,降低了算法效率。为了解决这种在大样本高纬度数据的环境下耗时的问题,Light GBM算法使用直方图方法在牺牲一定精度的条件下,换取计算速度的提升和内存的消耗;主要使用如下两种方法:一是GOSS(Gradient-based One-Side Sampling, 基于梯度的单边采样),不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度;二是EFB(Exclusive Feature Bundling, 互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,是寻找最佳切分点的消耗减少。这样大大的降低的处理样本的时间复杂度,但在精度上,通过大量的实验证明,在某些数据集上使用Lightgbm并不损失精度,甚至有时还会提升精度。
二、直方图算法(Histogram-based Alogrithm)
直方图优化算法需要在训练前预先把特征值转化为bin,也就是对每个特征的取值做个分段函数,将所有样本在该特征上的取值划分到某一段(bin)中,最终把特征取值从连续值转化成了离散值。
文章图片
第一个 for 循环表示的是对当前模型下所有的叶子节点进行遍历。
第二个 for 循环就开始遍历所有的特征了。对于每个特征,创建一个直方图并存储了两类信息,分别是每个bin中样本的梯度之和( H [ f . b i n s [ i ] ] . g H[f.bins[i]].g H[f.bins[i]].g),还有就是每个bin中样本数量( H [ f . b i n s [ i ] ] . n H[f.bins[i]].n H[f.bins[i]].n)
第三个 for 循环遍历所有样本,累积上述的两类统计值到样本所属的bin中。即直方图的每个 bin 中包含了一定的样本,在此计算每个 bin 中的样本的梯度之和并对 bin 中的样本记数。
最后一个for循环,遍历所有bin,分别以当前bin作为分割点,累加其左边的bin至当前bin的梯度和( S L S_L SL?)以及样本数量( n L n_L nL?),并与父节点上的总梯度和( S p S_p Sp?)以及总样本数量( n p n_p np?)相减,得到右边所有bin的梯度和( S R S_R SR?)以及样本数量( n R n_R nR?),带入公式,计算出增益,在遍历过程中取最大的增益,以此时的特征和bin的特征值作为分裂节点的特征和分裂特征取值。
优点:
- 减少内存消耗:直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,相较于预排序算法,内存消耗大大降低。
- 提升运算效率:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算按照bin来换分的信息增益,运算效率大大提升。
- 预排序算法能够忽略零值特征,减少训练代价;而直方图算法不能对稀疏进行优化,只是计算累加值(累加梯度和样本数)。但是,LightGBM对稀疏进行了优化:只用非零特征构建直方图。
- 直方图算法不能找到很精确的分割点,训练误差没有预排序算法好。但是, 由于决策树是弱模型, 分割点不太精确并没有太大影响;同时,较粗的分割点也有正则化的效果,可以有效地防止过拟合;因此,即使单棵树的训练误差比精确分割的算法稍大,但在整体下并没有太大的影响。
GOSS(Gradient-based one-side sampling)(基于梯度的单边采样)方法的主要思想就是,梯度大的样本点在信息增益的计算上扮演着主要的作用,也就是说这些梯度大的样本点会贡献更多的信息增益,因此为了保持信息增益评估的精度,当我们对样本进行下采样的时候保留这些梯度大的样本点,而对于梯度小的样本点按比例进行随机采样即可,相当于随机排除了一些小梯度样本,使用剩余较大梯度样本进行评估信息增益。
伪代码如下:
文章图片
算法解释:
输入: I I I-训练数据, d d d-迭代次数, a a a-大梯度采样比例, b b b-小梯度采样比例, l o s s loss loss-损失函数, L L L-弱学习器(一般为决策树)
- 根据样本梯度进行排序;
- 根据排序结果,抽取top a*100%的样本作为大梯度样本采样数据;
- 从剩下的样本中,选取b*100%作为小梯度样本采样数据;
- 合并两个采样样本;
- 将小梯度样本乘上一个权重系数 1 ? a b \frac{1-a}{b} b1?a?;
- 使用上述的采样的样本,学习一个新的弱学习器;
- 不断重复上述过程,直至达到相应迭代次数或模型收敛。
四、EFB
EFB(Exclusive Feature Bundling)(互斥特征捆绑)。高维数据通常是稀疏的,许多特征之间是互斥的,即它们不会同时拥有非零值;EFB就是把互斥的特征进行bundle,通过算法对同一个bundle里面的特征做相同的直方图算法,从而减少了计算量。GOSS从数据量上减少了数据,提升了计算效率,EFB则是从特征维度上减少了计算量。
伪代码如下:
文章图片
算法解释:
输入: F F F-特征, K K K-最大冲突数量,即特征之间允许存在少数的样本点并不是互斥的最大数量, G G G-构造的图
- 构造一个边带有权重的图,其权值对应于特征之间的总冲突;
- 通过特征在图中的度来降序排序特征;
- 检查有序列表中的每个特征,并将其分配给具有小冲突的现有bundle,或创建新bundle。
- 然后采用merge exclusive features,使用直方图方法将特征merge起来,原理:由于基于直方图的算法存储的是离散的bins而不是连续的特征值,我们可以通过让互斥特征驻留在不同的bins中来构造feature bundle。这可以通过增加特征原始值的偏移量来实现。比如,假设我们有两个特征,特征A的取值范围是[0,10),而特征B的取值范围是[0,20),我们可以给特征B增加偏移量10,使得特征B的取值范围为[10, 30),最后合并特征A和B,形成新的特征,取值范围为[0,30)来取代特征A和特征B。
五、Level-wise和Leaf-wise
大部分决策树的学习算法通过 level-wise 策略生长树,即每次分裂同一层的所有叶子,对所有叶子进行无差别分裂,但是一些叶子节点分裂后带来的增益可能非常小,对结果影响不大,进行无差别分裂的话就浪费了资源。
所以,LightGBM 通过 leaf-wise 策略来生长树。每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。但是,这样的分裂方式会很容易陷入较大的深度,造成过拟合。 因此,必须通过 max_depth 来限制树的深度来避免过拟合。
文章图片
六、分类变量(categorical feature)
对于类别型的变量,我们通常将类别特征转化为one-hot编码,如xgboost。 但是,这种处理方式会较大的耗用内存,并且对于一个类别数量较大的类别特征,会引起树的不平衡,需要很大的深度才能来达到较好的准确率。
【机器学习|集成算法之Light GBM】LightGBM的优化方法是对分类特征进行二分处理,这样就会有 2 k ? 1 ? 1 2^{k-1}-1 2k?1?1个分裂点。然后根据分类特征与目标变量的相关性对类别进行重排序,即根据累加值(sum_gradient/sum_hessian)重新对(类别特征的)直方图进行排序,然后在排好序的直方图中寻找最好的分割点。
推荐阅读
- paddle|动手从头实现LSTM
- 人工智能|干货!人体姿态估计与运动预测
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- 分析COMP122 The Caesar Cipher
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- 读书笔记|《白话大数据和机器学习》学习笔记1
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例