【python库学习】lightgbm集成学习库学习

一、前言

随着GBDT的广泛应用与大数据集的日益增加,对算法的效率要求不断提高;因此基于GBDT上出现了不少改进算法,其中XGBoost是改进成功的代表.然在高维特征跟大型数据集场景下,改进算法仍无法满足需求.因此又出现了针对该问题的改进算法light GBM,其特别之处在于提出了一个基于梯度的单边采样降低了训练集大小,提出了一个互斥特征绑定,降低了特征维度,从而在精度差异不大的情况下.提升了模型的效率.

1、基于梯度的单边采样

根据信息增益的定义,梯度越大的样本,对增益贡献越大;根据该点,我们根据某阈值(或头部百分比)保留梯度大的样本,随机丢弃梯度小的样本;该方法经证明所得精度要好于统一随机采样方法.
该方法具体流程如下:

  • 训练数据集I,迭代次数d,大梯度样本比例为a,小梯度样本比例为b
  • 首先使用当前已训练好的模型对数据进行预测,并计算其损失值,及其梯度,其中样本权重均为1
  • 按样本梯度进行排序,按大小梯度比例对样本进行采样,其中大梯度样本数为 a ∗ l e n ( I ) a*len(I) alen(I),直接取a对应的排序top(m)样本数;小梯度样本数为 b ∗ l e n ( I ) b*len(I) blen(I),从取完大梯度样本后剩下的样本中进行随机采样.
  • 对小梯度样本权重赋值为 1 − a b \frac{1-a}{b} b1a,在于降低样本分布变化的同时关注当下新样本集=小梯度样本+大梯度样本
  • 在新样本集,新样本权重与新梯度下计算损失值,得到新模型
  • 重复2~5,得到多个新模型(若为决策树,即多颗决策树)

2、互斥特征绑定

对于高维特征来说,通常里面有很多稀疏特征,这部分特征有可能存在不同时为非零的情况.互斥特征绑定法就是通过识别出这部分互斥特征,并将其合并为一个特征;这样直方图构建算法的时间复杂度将从O(#data✖️#feature)降为O(#data✖️#bundle).

1)、互斥特征识别

采用构图(build graph)的思想,将特征作为节点,不互斥的特征之间进行连边,然后从图中找出所有的互斥特征集合。其实学过数据结构里的图算法就了解过,这个问题基本就是图着色问题。但是图着色问题是一个NP-hard问题,不可能在多项式时间里找到最优解。
因此EFB采用了一种近似的贪心策略解决办法。它允许特征之间存在少数的样本点并不互斥(比如某些对应的样本点之间并不同时为非0),并设置一个最大冲突阈值 K。我们选择合适的阈值K,可以在准确率和训练效率上获得很好的平衡。
其流程如下:
(1)将特征作为图的顶点,对于不互斥的特征进行相连(存在同时不为0的样本),特征同时不为0的样本个数作为边的权重;
(2)根据顶点的度(与该顶点相关联的边的数目)对特征进行降序排序,度越大表明特征与其他特征的冲突越大(越不太可能与其他特征进行捆绑);
(3)设置最大冲突阈值K,外层循环先对每一个上述排序好的特征,遍历已有的特征捆绑簇,如果发现该特征加入到该特征簇中的冲突数不会超过最大阈值K,则将该特征加入到该簇中。否则新建一个特征簇,将该特征加入到新建的簇中。
时间的复杂度为O(n^2) ,n为特征的数量,计算耗时主要在建图上,两两特征计算互斥程度的时间较长(2层for循环)。对于百万级别的特征数量来说,该复杂度仍过大。为了提高效率,可以不再建图,直接对特征按非零值个数排序,将特征非零值个数类比为节点的度(即冲突程度)。排序策略改为该方式,后面的for循环一样。

2)、互斥特征融合

EFB采用的是加入一个偏移常量(offset)来解决。
举个例子,我们绑定两个特征A和B,A取值范围为[0, 10),B取值范围为[0, 20)。则我们可以加入一个偏移常量10,即将B的取值范围变为[10,30),然后合并后的特征范围就是[0, 30),并且能很好的分离出原始特征.
在实际执行中,由于lgbm采用了直方图算法,对特征进行了分桶,因此只需将偏移常量offset对每个特征桶的数量累加,然后放入偏移常数数组(binRanges)中即可实现特征的合并.

3、其它特性

1)、基于直方图算法

具体步骤如下:

  • 初始化直方图:首先将特征按照指定的离散化方式进行分割,例如等宽分割或等频分割。然后根据分割的结果,构建一个特征直方图,其中每个区间表示一个离散化的取值范围。
  • 计算直方图梯度:对于每个特征,计算该特征在训练集上的梯度统计量,例如样本数量、梯度和等。这些统计量将用于计算直方图的增益。

通过直方图算法,LGBM可以快速而准确地处理大规模的特征,并生成更好的拟合效果。同时,直方图算法将连续特征转化为离散特征,减少了特征的维度,提高了模型的训练和预测效率。

2)、leaf-wise 构建树的策略

  • Leaf wise(叶节点优先):在 leaf wise构建树的方法中,树是从顶部向下按照最小化损失的原则递归地分割数据,直到每个叶节点都只包含一个样本或满足停止条件。这种方法通常能够更好地拟合数据噪声,因为通过构建更深的树,模型可以更好地捕捉到训练数据的细节。
  • Level wise(层级优先):在 level wise构建树的方法中,树是按照层级逐渐构建的。在每个层级,树会将数据分割为多个子节点,直到达到预定义的最大深度。这种方法通常速度更快,因为每个层级的节点都可以并行构建,但是可能会在更高层级损失一些数据的特征。

总结来说,leaf wise 方法更适合于数据集具有较少噪声和较高复杂度的情况,它会构建更深的树结构。而 level wise 方法适用于规模较大的数据集,因为它是按照层级构建,可以并行分割数据。

3)、类别特征支持

针对类别特征,对该类别特征按如下方式处理后,划分为2个子集;若有k个类别特征,则一共有2^(k-1)-1种划分方式.
在这里插入图片描述

  • 统计该特征上各取值的样本数,根据样本数从大到小排序,去除样本占比小于1%的类别值(因此在实际操作中对于特别稀疏的特征最好先进行尾部取值合并,否则会被算法自动抹除);
  • 把直方图按照每个类别对应的label均值进行排序;
  • 然后按照排序的结果依次枚举最优分割点;

以这个顺序将特征分成左右两子树,得到many-vs-many的结果。而且LGBM还可以设置参数max_cat_threshold,其意为一个组中最多可存在多少个不同的特征值。
使用LightGBM支持的类别特征可以使训练速度加速倍,并且精度一致.

4)、并行优化

  • 特征并行:XGBoost采用数据垂直划分,应用不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点.LightGBM 则不进行数据垂直划分,而是在每台机器上保存全部训练数据,在得到最佳划分方案后可在本地执行划分,减少了不必要的通信。
  • 数据并行:传统的数据并行策略主要为水平划分数据,让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。这种数据划分有一个很大的缺点:通讯开销过大。如果使用点对点通信,一台机器的通讯开销大约为 O(N),其中N是机器的数量;如果使用集成的通信,则通讯开销为 O(1)。每台机器只需要将本地直方图传输给一个集成节点。
    本算法在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。具体过程如下图所示。
    在这里插入图片描述
    还有基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行的方式只合并部分特征的直方图从而达到降低通信量的目的,可以得到非常好的加速效果。
    在这里插入图片描述

二、lightgbm库

lightgbm文档地址

1、常见参数

只列举了一些核心参数,具体调参时建议根据后续调参数经验,或参数搜索

序号名称含义使用说明
1objective目标函数默认regression,还支持回归常见loss,二分类与多分类常见loss,以及排序loss
2boosting方式默认gbdt,还可选rf随机森林, dart一种将深度神经网络社区的 dropout 技术应用于梯度提升树的方法
3data_sample_strategy数据采样策略默认与bagging方式一致,‘goss‘指单边采样
4num_iterations迭代次数模型数默认100,注意在多分类中,是类别数乘以迭代次数
5learning_rate缩放系数默认0.1,越小,意味着希望迭代更多次数去逼近目标,因此常与迭代次数联合设置
6num_leaves叶节点数默认31,控制每棵树的最大叶节点数
7num_threads线程数默认0,为保证最佳训练速度,建议设置与实际cpu核数一致
8device_type设备类型默认cpu
9seed随机种子默认为None,用于数据随机,特征随机采样下的随机种子
10deterministic确定性设置默认false,仅用于cpu,在库不一致,不同随机种子等情况下,其预测结果会不同

2、调参经验

在参数设置中,要先确立自己的目标,常见目标有以下3点,很多时候目标间是冲突的,因此设置参数需要在多方目标中进行平衡.

1)、提高精度

  • 使用更大的分箱数(搜寻划分点更细致)
  • 使用更小缩放系数搭配更大的迭代次数
  • 使用更大的叶节点数(搭建更复杂的树)
  • 使用更大的训练数据集
  • 尝试使用boosting中的dart(一种将深度神经网络社区的 dropout 技术应用于梯度提升树的方法 )

2)、预防过拟合

  • 使用更小的分箱数
  • 使用更小的叶节点数
  • 设置叶节点最小划分样本数与叶节点最小hessian和(如设置叶节点最小划分样本数为5,则小于5个样本数的节点不会继续划分)
  • 数据采样使用bagging时,设置(采样比例)bagging_fraction 和(采样频率)bagging_freq
  • 通过设置特征比例,来控制特征下采样情况(采样比例小,各树使用特征差异增加,从而增加树间的差异性)
  • 使用更大的训练数据集
  • 尝试添加正则(如 L1,L2,划分最小增益限制)
  • 限制最大深度(避免过深的树生成)
  • 设置extra_trees=True (启用极限随机树,在【python库学习】sklearn集成学习ensemble模块学习有描述)
  • 设置path_smooth大于零,作用是在决策树训练过程中限制路径深度,使用时注意path_smooth > 0 时 min_data_in_leaf要大于等于2;path_smooth越大,限制越强.

3)、加快运行速度

这是lightgbm的优势,因此可以设置的方法较多

  • 加大资源:设置num_threads线程数实现
  • 构建浅的树:可以通过降低深度,降低叶节点数,提高叶节点最小划分样本数,提升最小划分增益,提升叶节点最小hessian和
  • 构建较少的树:降低迭代次数,提高缩放系数learning_rate
  • 提前停止:设置early_stopping_round参数,如为1,表明在验证集上第一次没有提升精度即停止
  • 考虑更少划分点:可以通过数据集特征预过滤(比如设置了最小叶节点样本数为10个,而某个特征就两个取值,其中一个取值才5个样本,则该特征无需进行划分,可以过滤掉),减少分箱数, 提高单箱最小样本数,降低特征抽样比例, 降低max_cat_threshold类别型特征的阈值(更大阈值会有更多判别组别与划分点)
  • 使用save_binary 进行数据结构存储(一旦开启,可以将训练集与验证集存储为模型理解的方式,后续分箱等工作无需重新加载数据)
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值