不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其余boosting工具的LightGBM,在三天以内GitHub上被star了1000次,fork了200次。知乎上有近千人关注“如何看待微软开源的LightGBM?”问题,被评价为“速度惊人”,“很是有启发”,“支持分布式”,“代码清晰易懂”,“占用内存小”等。git
LightGBM (Light Gradient Boosting Machine)(请点击https://github.com/Microsoft/LightGBM)是一个实现GBDT算法的框架,支持高效率的并行训练。github
LightGBM在Higgs数据集上LightGBM比XGBoost快将近10倍,内存占用率大约为XGBoost的1/6,而且准确率也有提高。GBDT在每一次迭代的时候,都须要遍历整个训练数据屡次。若是把整个训练数据装进内存则会限制训练数据的大小;若是不装进内存,反复地读写训练数据又会消耗很是大的时间。尤为面对工业级海量的数据,普通的GBDT算法是不能知足其需求的。面试
LightGBM提出的主要缘由就是为了解决GBDT在海量数据遇到的问题,让GBDT能够更好更快地用于工业实践。算法
直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数(其实又是分桶的思想,而这些桶称为bin,好比[0,0.1)→0, [0.1,0.3)→1),同时构造一个宽度为k的直方图。多线程
在遍历数据的时候,根据离散化后的值做为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了须要的统计量,而后根据直方图的离散值,遍历寻找最优的分割点。框架
使用直方图算法有不少优势。首先,最明显就是内存消耗的下降,直方图算法不只不须要额外存储预排序的结果,并且能够只保存特征离散化后的值,而这个值通常用8位整型存储就足够了,内存消耗能够下降为原来的1/8。而后在计算上的代价也大幅下降,预排序算法每遍历一个特征值就须要计算一次分裂的增益,而直方图算法只须要计算k次(k能够认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。机器学习
在XGBoost中,树是按层生长的,称为Level-wise tree growth,同一层的全部节点都作分裂,最后剪枝,以下图所示:分布式
Level-wise过一次数据能够同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,由于它不加区分的对待同一层的叶子,带来了不少不必的开销,由于实际上不少叶子的分裂增益较低,不必进行搜索和分裂。工具
在Histogram算法之上,LightGBM进行进一步的优化。首先它抛弃了大多数GBDT工具使用的按层生长 (level-wise)
的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise)算法。性能
Leaf-wise则是一种更为高效的策略,每次从当前全部叶子中,找到分裂增益最大的一个叶子,而后分裂,如此循环。所以同Level-wise相比,在分裂次数相同的状况下,Leaf-wise能够下降更多的偏差,获得更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。所以LightGBM在Leaf-wise之上增长了一个最大深度的限制,在保证高效率的同时防止过拟合。
LightGBM另外一个优化是Histogram(直方图)作差加速。一个容易观察到的现象:一个叶子的直方图能够由它的父亲节点的直方图与它兄弟的直方图作差获得。一般构造直方图,须要遍历该叶子上的全部数据,但直方图作差仅需遍历直方图的k个桶。
利用这个方法,LightGBM能够在构造一个叶子的直方图后,能够用很是微小的代价获得它兄弟叶子的直方图,在速度上能够提高一倍。
实际上大多数机器学习工具都没法直接支持类别特征,通常须要把类别特征,转化到多维的0/1特征,下降了空间和时间的效率。而类别特征的使用是在实践中很经常使用的。基于这个考虑,LightGBM优化了对类别特征的支持,能够直接输入类别特征,不须要额外的0/1展开。并在决策树算法上增长了类别特征的决策规则。在Expo数据集上的实验,相比0/1展开的方法,训练速度能够加速8倍,而且精度一致。据咱们所知,LightGBM是第一个直接支持类别特征的GBDT工具。
LightGBM (Light Gradient Boosting Machine)(请点击https://github.com/Microsoft/LightGBM)是一个实现GBDT算法的框架,支持高效率的并行训练,而且具备如下优势:
为了演示LightGBM在Python中的用法,本代码以sklearn包中自带的鸢尾花数据集为例,用lightgbm算法实现鸢尾花种类的分类任务。
GitHub:点击进入
做者:@mantchs