LightGBM(light gradient boosting machine,轻量梯度提升机)是对XGBoost进行改进的模型版本,其三者之间的演变关系为:GBDT-》XGBoost-》LightGBM,依次对性能进行优化,尽管XGBoost已经很高效了,但是仍然有缺陷,故此时就得到一个更为高效的模型版本LightGBM
由于XGBoost的复杂度是由于对每个特征值进行预排序,遍历所有可能的分裂点计算增益,其排序算法的复杂度=特征数×特征分裂点的数量×样本数。对XGBoost优化主要就从特征数、特征分裂点、样本数三个方面进行优化
其涉及的优化方面涉及算法和策略(机器学习的三要素:模型、策略和算法),以下是LightGBM采样的四个优化方法:
①直方图算法(Histogram-based Split,从特征分裂点的优化)
由于XGBoost通过对每个特征值进行排序,遍历所有可能的分裂点计算增益,其计算复杂度高(特征数×特征分裂点数×样本量),内存消耗较大。其优化的方式是将连续特征离散化转化为直方图的bins,仅需遍历所有的bins而非所有的样本来寻找最优特分裂点。使得其复杂度降低到O(特征数×bins数×样本量),同时还可以通过直方图差加速(父结点直方图剪去子结点直方图得到另外一个子结点的直方图),其速度提升十倍,内存消耗降低到1/10
知识补充:
在机器学习中,bins(即分箱或者区间)指的是将连续型特征(年龄、收入、温度等)的数值范围离散化为多个区间,对每个区间进行整数编号。即划分区间
②单边梯度抽样(Gradient-based One-Side Sampling,从对应样本量的优化)
这个单边梯度抽样是分为对高梯度样本和低梯度样本进行分别抽样,使得在减少30%~50%的数据量时,几乎不损失精度。这种方法避免了传统随机采样过程中可能丢失重要样本信息。
其核心思想分为三个 :
A.保留高梯度样本:选取梯度绝对值最大的前a%样本,
B.随机抽样低梯度样本:从剩余样本中随机抽取b%,并为其梯度乘以(1-a)/b作为补偿分布偏移。一般a和b的默认取值为0.2和0.1
C.仅用抽样数据计算分裂增益值,降低原本使用全部样本进行增益计算的计算复杂度。
其分裂增益计算的数学表达式:
知识补充:
梯度在GBDT中代表样本的预测难度,即梯度的绝对值越大,样本越难拟合
③互斥特征捆绑算法(Exclusive Feature Bunding,从特征数上优化)
在高维特征中,许多特征是互斥的(如“用户性别”和“怀孕次数”不会同时为非零值),对于这种互斥或者冲突最少的特征进行捆绑,将捆绑的特征映射到同一个bin范围(如原特征A的bin范围是0-10,特征B的bin范围为11-20);那么怎么识别这种互斥或者冲突最少的特征呢?可以选择使用贪心算法和图着色算法获取冲突最少特征。那么如何定义冲突最少呢?此时可以定义一个捆绑特征冲突率,当该冲突率低于阈值(max_conflict_rate)时,即可对其特征进行捆绑。
知识补充1:
(如“用户性别”和“怀孕次数”不会同时为非零值)这一内容怎么理解?
对于性别为男性的用户,怀孕次数几乎总是 0(除非特殊场景)。
对于性别为女性的用户,怀孕次数可能为 0、1、2 等。如果在一些场景为>0的样本
结论:在同一行数据中,这两个特征不会同时为非零值(男性怀孕次数为0,女性怀孕次数可能为非零)。因此它们是互斥特征(如果其为男性,那么其怀孕次数自动为0;而怀孕次数不为0,一定是女性,在这种场景下两个特征就可以视为单一特征)。
知识补充2:
捆绑特征选择算法(图着色算法):将所有特征视为图的各个顶点,用一条边连接两个不互相独立的特征,边的权重则表示两个相连接的特征的冲突比率(max_conflict_rate),通过阈值比较判定两点之间是否需要被涂上同一个颜色。但是这样会存在一个问题,特征捆绑后怎么进行取值的问题?比如一个特征A的取值范围是[20,40),另外一个特征B的取值范围为[30,60),此时特征捆绑后不做什么特殊处理后,就会得到取值范围为[20,60],那么我现在有一个值为30的特征值,我该放进A特征中,还是放进B特征中呢?故需要对不互相独立的特征进行一个偏置处理,即比如对特征B的取值范围加上一个10的偏置值,使得B特征的取值范围变成[40,70],此时就可以对里面的特征进行很好的区分了
④leaf-wise生长策略(带有深度限制叶子结点生长,即有max_depth作为叶子结点生长限制条件,为了避免出现XGBoost的过拟合的问题)
XGBoost的Level_wise策略:逐层分裂所有叶子结点,避免过拟合但产生冗余分裂(出现某些增益低的结点无需分裂),故其产生的是一个对称树。
LightGBM的leaf_wise策略:只分裂增益最大的叶子,生成不对称树,并通过设置max_depth来防止过拟合。故其产生的是一个不对称树
综上,LightGBM较XGBoost更适合处理大规模(百万级别以上的样本)、高维特征、实时性高的数据样本;而对于小规模本地上运行的样本、样本需要精细调制的、需要强解释的模型,建议使用XGBoost框架。
幸运的是,LightGBM作为工业级的框架,其已经封装成库,直接可以在pycharm中通过pip install lightgbm的指令进行安装。Lightgbm库提供了分类和回归两大类接口,以及可以绘制模型特征重要性图