LightGBM算法(转载)

原文:https://blog.csdn.net/niaolianjiulin/article/details/76584785 python

前者的含义是轻量级,GBM:梯度上升机。算法

相较于xgboost:数组

  • 更快的训练效率多线程

  • 低内存使用学习

  • 更高的准确率优化

  • 支持并行化学习.net

  • 可处理大规模数据

xgboost的缺点:线程

每轮迭代时,都须要遍历整个训练数据屡次。若是把整个训练数据装进内存则会限制训练数据的大小;若是不装进内存,反复地读写训练数据又会消耗很是大的时间。blog

预排序方法(pre-sorted):首先,空间消耗大。这样的算法须要保存数据的特征值,还保存了特征排序的结果(例如排序后的索引,为了后续快速的计算分割点),这里须要消耗训练数据两倍的内存。其次时间上也有较大的开销,在遍历每个分割点的时候,都须要进行分裂增益的计算,消耗的代价大。排序

对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,而且不一样的特征访问的顺序不同,没法对cache进行优化。同时,在每一层长树的时候,须要随机访问一个行索引到叶子索引的数组,而且不一样特征访问的顺序也不同,也会形成较大的cache miss。

LightGBM特色:

  • 基于Histogram的决策树算法

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

  • 直方图作差加速

  • 直接支持类别特征(Categorical Feature)

  • Cache命中率优化

  • 基于直方图的稀疏特征优化

  • 多线程优化

Histogram算法

直方图算法的基本思想:先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。遍历数据时,根据离散化后的值做为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了须要的统计量,而后根据直方图的离散值,遍历寻找最优的分割点。

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

Level-wise过一次数据能够同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效算法,由于它不加区分的对待同一层的叶子,带来了不少不必的开销,由于实际上不少叶子的分裂增益较低,不必进行搜索和分裂。

Leaf-wise则是一种更为高效的策略:每次从当前全部叶子中,找到分裂增益最大的一个叶子,而后分裂,如此循环。所以同Level-wise相比,在分裂次数相同的状况下,Leaf-wise能够下降更多的偏差,获得更好的精度。

Leaf-wise的缺点:可能会长出比较深的决策树,产生过拟合。所以LightGBM在Leaf-wise之上增长了一个最大深度限制,在保证高效率的同时防止过拟合。

主要参数:

(1)num_leaves

LightGBM使用的是leaf-wise的算法,所以在调节树的复杂程度时,使用的是num_leaves而不是max_depth。

大体换算关系:num_leaves = 2^(max_depth)

(2)样本分布非平衡数据集:能够param[‘is_unbalance’]=’true’

(3)Bagging参数:bagging_fraction+bagging_freq(必须同时设置)、feature_fraction

(4)min_data_in_leaf、min_sum_hessian_in_leaf

model_lgb = lgb.LGBMRegressor(
        boosting_type='dart',n_estimators=15000,num_leaves=100,max_depth=12)
#                          n_estimators=39000,
#                          reg_lambda=0.01,
#                          max_depth=16,
#                          min_child_weight=0.001,
#                          reg_alpha=0.01,
#                          colsample_bytree=0.85,
#                          min_child_samples=24,
#                          max_bin = 500,
#                          num_leaves = 45)
相关文章
相关标签/搜索