这次终于彻底理解了 LightGBM 原理及代码( 四 )


3.1 直接支持类别特征
实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,通过 one-hot 编码,转化到多维的特征,降低了空间和时间的效率 。但我们知道对于决策树来说并不推荐使用 one-hot 编码,尤其当类别特征中类别个数很多的情况下,会存在以下问题:

  • 会产生样本切分不平衡问题,导致切分增益非常小(即浪费了这个特征) 。使用 one-hot编码,意味着在每一个决策节点上只能使用one vs rest(例如是不是狗,是不是猫等)的切分方式 。例如,动物类别切分后,会产生是否狗,是否猫等一系列特征,这一系列特征上只有少量样本为 ,大量样本为 ,这时候切分样本会产生不平衡,这意味着切分增益也会很小 。较小的那个切分样本集,它占总样本的比例太小,无论增益多大,乘以该比例之后几乎可以忽略;较大的那个拆分样本集,它几乎就是原始的样本集,增益几乎为零 。比较直观的理解就是不平衡的切分和不切分没有区别 。
  • 会影响决策树的学习 。因为就算可以对这个类别特征进行切分,独热编码也会把数据切分到很多零散的小空间上,如下图左边所示 。而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习效果会变差 。但如果使用下图右边的切分方法,数据会被切分到两个比较大的空间,进一步的学习也会更好 。下图右边叶子节点的含义是或者放到左孩子,其余放到右孩子 。

这次终于彻底理解了 LightGBM 原理及代码

文章插图
【这次终于彻底理解了 LightGBM 原理及代码】图:左图为基于 one-hot 编码进行分裂,右图为 LightGBM 基于 many-vs-many 进行分裂
而类别特征的使用在实践中是很常见的 。且为了解决one-hot编码处理类别特征的不足,LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的展开 。LightGBM采用 many-vs-many 的切分方式将类别特征分为两个子集,实现类别特征的最优切分 。
假设某维特征有 个类别,则有 种可能,时间复杂度为 ,LightGBM 基于 Fisher的《On Grouping For Maximum Homogeneity》论文实现了 的时间复杂度 。
算法流程如下图所示,在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点 。从下图可以看到,为类别的均值 。当然,这个方法很容易过拟合,所以LightGBM里面还增加了很多对于这个方法的约束和正则化 。
这次终于彻底理解了 LightGBM 原理及代码

文章插图
图:LightGBM求解类别特征的最优切分算法
在Expo数据集上的实验结果表明,相比展开的方法,使用LightGBM支持的类别特征可以使训练速度加速倍,并且精度一致 。更重要的是,LightGBM是第一个直接支持类别特征的GBDT工具 。
3.2 支持高效并行
 
(1)特征并行特征并行的主要思想是不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点 。XGBoost使用的就是这种特征并行方法 。这种特征并行方法有个很大的缺点:就是对数据进行垂直划分,每台机器所含数据不同,然后使用不同机器找到不同特征的最优分裂点,划分结果需要通过通信告知每台机器,增加了额外的复杂度 。
LightGBM 则不进行数据垂直划分,而是在每台机器上保存全部训练数据,在得到最佳划分方案后可在本地执行划分而减少了不必要的通信 。具体过程如下图所示 。
这次终于彻底理解了 LightGBM 原理及代码

文章插图
图:特征并行
 
(2)数据并行传统的数据并行策略主要为水平划分数据,让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点 。这种数据划分有一个很大的缺点:通讯开销过大 。如果使用点对点通信,一台机器的通讯开销大约为
LightGBM在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量 。具体过程如下图所示 。
这次终于彻底理解了 LightGBM 原理及代码

文章插图
图:数据并行
 
(3)投票并行基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别 。在数据量很大的时候,使用投票并行的方式只合并部分特征的直方图从而达到降低通信量的目的,可以得到非常好的加速效果 。具体过程如下图所示 。


推荐阅读