导语 不同于深度学习在CV\NLP领域(处理非结构化数据的问题)上的绝对统治力,在结构化数据建模问题中,基于Boosting思想的GBDT树模型仿佛依然是最简单有效的模型。本文将从解决结构化数据问题出发,介绍GBDT树模型以及近年出现的深度模型,探寻是否深度学习已经可以替代GBDT?
本文分为上下两篇,上篇主要介绍一些基本概念和GBDT树模型,下篇则介绍针对结构化数据的深度模型。
什么是结构化数据?
简单来说,结构化数据也被称为表格型数据,即可以用二维表结构来逻辑表达实现的数据。而不方便用数据库二维逻辑表来表现的数据即称为非结构化数据,包括文本、图像、音频、视频等。
不同于深度学习在CV\NLP领域(处理非结构化数据的问题)上的绝对统治力,在结构化数据的问题中,基于Boosting思想的GBDT树模型仿佛依然是最简单有效的模型。
什么是Boosting?
Boosting算法原理
Bagging算法原理
Boosting和Bagging都属于集成学习,集成学习的中心思想可以概括为:三个臭皮匠顶个诸葛亮,即组合多个弱分类器,形成一个强分类器。不同于Bagging中各弱分类器的并行式投票机制,Boosting采用串行的训练方式,各弱分类器之间有依赖。该机制决定了Boosting善于降低偏差,而Bagging善于降低方差。
决策树与这两种思想结合,得到的大家熟知的算法:
- Bagging + 决策树 = 随机森林
- AdaBoost + 决策树 = 提升树
- Gradient Boosting + 决策树 = GBDT
梯度上升决策树(Gradient Boosting Decision Tree, 以下简称GBDT)是Boosting的重要实现,其基本思想是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,将训练好的弱分类器以累加的形式结合到现有模型中。
XGBoost、LightGBM、CatBoost是目前最主流的三个GBDT的实现。下文将介绍三种算法的主要区别,针对比较有意思的点,展开讲讲。
XGBoost
XGBoost是陈天奇等人于2014年开发的一个开源机器学习项目,高效地实现了GBDT算法,并进行了算法和工程上的优化,比较重要的点:
- 为防止过拟合,传统GBDT在决策树构建完后进行剪枝, 而XGBoost在优化阶段就加入了正则项。
- 为防止过拟合,XGBoost采用了与随机森林相似的策略,支持对数据进行采样,包括对样本、特征的采样。
- 传统GBDT没有设计如何处理缺失值,而XGBoost通过学习出缺失值的分裂方向,实现了缺失值的自动处理。
- 传统GBDT的训练过程是串行的,而XGBoost则在训练阶段实现了并行化,主要通过两点实现:1. 特征值预排序,训练前预先排序可复用的特征值 2. 弃用基于贪心枚举生成候选点的方法,采样可并行的近似直方图算法,高效生成候选的分割点。
LightGBM
LightGBM于2016年由微软提出,在面对海量数据,LightGBM表现出更快的速度,更低的内存消耗,其主要优化点如下。
单边梯度抽样算法(Gradient-based One-Side Sampling, GOSS)
GBDT的梯度大小可以反应样本的权重,梯度越小说明模型拟合的越好,GOSS利用这一信息对样本进行抽样,减少了大量梯度小的样本,更关注梯度高的样本,极大的减少了计算量。
值得关注的是,GOSS并非完全丢弃梯度小的样本,而用采样的方法。主要因为前者会改变样本的分布,降低模型的准确度。
GOSS具体做法是:对样本梯度的绝对值进行逆排序,对高梯度的样本保留前a∗100%,对梯度小的样本进行采样 b∗100%,并对这些样本的梯度乘以一个常数因子(1−a)/b ,其中a、b为采样率。将样本分布尽可能拉回来。
直方图算法
LightGBM将连续特征离散化为k个离散特征,同时构造一个宽度为 k 的直方图用于统计信息(含有 k个bin)。LightGBM无需遍历数据,只需要遍历 k 个 bin即可找到最佳分裂点。
很明显,这种做法会带来分割点不精确的问题,那么直方图算法会影响LightGBM的精度吗?作者在不同的数据集上的实验结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。
究其原因:决策树本来就是弱模型,分割点是不是精确并不太重要;较粗的分割点也有正则化的效果,可以防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升的框架下没有太大的影响。
互斥特征捆绑算法(Exclusive Feature Bundling, EFB)
高维度的数据往往是稀疏的,这种稀疏性启发了作者设计一种无损的方法来减少特征的维度。通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),则用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,也可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。LightGBM通过该方法,降低了参与计算的特征维度。
基于最大深度的 Leaf-wise的垂直生长算法
Level-wise基于层进行生长,直到达到停止条件。过一次数据可以同时分裂同一层的叶子,容易进行并行优化,也好控制模型复杂度,不容易过拟合。但其不加区分的对待同一层的叶子,带来了资源浪费,因为很多叶子的分裂增益较低,没必要进行搜索和分裂。
Leaf-wise每次从当前所有叶子节点中,找到分裂增益最大的一个叶子节点,然后分裂,如此循环。同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合,因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
类别特征最优分割
两种编码
机器学习中,处理类别型特征的方法一般是采用one-hot编码,如上图左图所示。作者提出在树模型中这不一定是一种好的方式,原因在于:
1.one-hot编码可能导致样本切分不平衡的问题,其相当于one-vs-many的划分方式,如果类别较多时,这种划分会使分到叶子节点的样本非常少,导致切分产生的增益小。
2.one-hot编码将数据切分到许多个零碎的小空间,而决策树学习时利用的是统计信息,在这些数据量小的空间上,统计信息不准确,学习会变差。
LightGBM采用 many-vs-many 的切分方式将类别特征分为两个子集,实现类别特征的最优切分,如上图右图所示。
LightGBM类别特征切割方法
LightGBM的切分算法如上图所示,在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点。当然这个方法很容易过拟合,所以LightGBM还增加了很多对于这个方法的约束和正则化。
CatBoost
CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,正如其名字那样,CatBoost主要在类别特征的处理上做了很多改进。
基于有序目标变量统计(Ordered Target Statistics)的类别特征处理
机器学习中处理类别型特征的方法一般是进行 one-hot编码。这种做法的缺点很明显:造成特征维度爆炸和特征的稀疏。另外一种思路则是将类别分组成有限个的群体再进行one-hot编码,其中最常用的就是是根据目标变量统计(Target Statistics,以下简称TS)进行分组,用于估算每个类别的目标变量的期望值。
可以通过对TS数值型特征的阈值设置,基于对数损失、基尼系数或者均方差,得到一个对于训练集而言最优的一分为二的类别,即对于不同的损失函数,使用TS数据能获得最优解。
TS中最简单的做法是用类别特征对应的样本的标签平均值来替换。这种方法被称为 Greedy Target-based Statistics , 简称 Greedy TS,用公式来表达就是:
Greedy TS
该方法有一个明显的缺陷:通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候,会出现条件偏移问题。
改进方法则是添加先验分布项,这样可以减少噪声和低频数据对于数据分布的影响。用公式表达就是:
改进下的Greedy TS
其中p是添加的先验项,a通常是大于0的权重系数。对于回归问题,先验项可取数据集label的均值;对于二分类,先验项是正例的先验概率。
这种数值编码方式虽然好,但是会造成训练集中label的泄露,从而导致过拟合。因为对于某个样本来说,其数值编码计算过程中已经把这个样本的 label值纳入了计算过程中。
为了让模型正确地评估某个特征的真实有效性和重要程度,可以拿出一部分数据来计算这个特征编码,用另外一部分数据来训练。但这样会造成可用数据的减少。
Ordered Target Statistics
CatBoost设计了所谓的Ordered Target Statistics 编码,来缓解这个问题:先将样本随机打乱,然后每个样本只使用它排序在它前面的样本来计算其类别特征的数值编码。从而防止了label的泄露,并且能够较为合理地评估这个特征的有效性。
不过这种方式会造成排在前面的样本的类别特征的数值编码估计不是很准,为了减少这个影响,CatBoost会设计多个样本随机排列(默认4个),在每次建树前从中随机取一个排列。
解决预测偏移问题的Ordered Boosting
Boosting算法的本质,决定了其存在过拟合的风险。LightGBM在训练下一颗树的时候,需要计算前面所有树构成的加法模型在所有样本上的损失的一阶梯度和二阶梯度,然后用这些梯度来决定当前树的结构和叶子节点取值。
但是这种方法是有问题的:前面的树都是在这些样本上训练的,现在又在这些样本上估计模型损失的梯度,应该换一些新的样本才更合理。
作者故伎重演,先将样本随机打乱,然后每个样本只使用排序在它前面的样本来训练模型。用该样本在该模型下损失的一阶、二阶梯度构建一棵新树的结构,最终整个模型是使用全体样本进行计算的。
这就是Ordered Boosting的主要思想,其可以有效地减少梯度估计的误差,缓解预测偏移,但是会增加较多的计算量,影响训练速度。
基于贪心策略的特征交叉方法
前面提到,CatBoost的Ordered TS会将类别特征转化成为数值特征。而数值特征是无法进行特征交叉的,为了更好进行类别特征的特征交叉,CatBoost在进行Ordered TS时,自动生成交叉特征。
如果让所有特征直接进行交叉,2阶交叉、3阶交叉......越往上,复杂度呈指数增长,这种做法显然是不实际的。
CatBoost使用一种贪心的策略来进行特征交叉。生成树的第一次分裂,不使用任何交叉特征。在后面的分裂中,CatBoost会使用生成树所用到的全部原始特征和交叉特征跟数据集中的全部类别特征进行交叉,并将新的组合类别型特征动态地转换为数值型特征。
另外,CatBoost还选用了对称二叉树作为弱分类器,以防止过拟合,提高了预测速度,算法自身支持GPU并行化运行等功能等。
总结
三款模型横向对比
上文简单介绍了三款主流GBDT算法的特性,在笔者看来,XGBoost是将GBDT模型大规模落地应用的开山之作;LightGBM则是在保证了性能的前提下,极大提高了海量数据下的模型效率,减少了资源消耗;CatBoost的主要贡献则是更好地解决了树模型中的类别特征编码问题,针对类别特征较多、较高阶的数据时,选用CatBoost往往可获得较好的性能表现。
本文下篇将介绍近年出现的用于解决结构化数据问题的深度模型。
参考文献
[1] Chen T, Guestrin C. Xgboost: A scalable tree boosting system[C]//Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining. 2016: 785-794.
[2] Ke G, Meng Q, Finley T, et al. Lightgbm: A highly efficient gradient boosting decision tree[J]. Advances in neural information processing systems, 2017, 30.
[3] Prokhorenkova L, Gusev G, Vorobev A, et al. CatBoost: unbiased boosting with categorical features[J]. Advances in neural information processing systems, 2018, 31.