XGboost能够在一系列的问题上取得良好的效果,这些问题包括存销预测、物理事件分类、网页文本分类、顾客行为预测、点击率预测、动机探测、产品分类。多领域依赖数据分析和特征工程在这些结果中扮演重要的角色。XGboost在所有场景中提供可扩展的功能,XGBoost可扩展性保证了相比其他系统更快速,XGBoost算法优势具体体现在:处理稀疏数据的新颖的树的学习算法、近似学习的分布式加权直方图。XGBoost能够基于外存的计算,保障了大数据的计算,使用少量的节点资源可处理大量的数据。XGBoost的主要贡献:
XGboost的正则化目标
在给出n个实例,m维特征的情况下,
(q将样本实例(Rm)映射到叶子节点,wT为空间,T为叶子的数量)是CART的假设空间,q代表每颗树的结构,映射实例样本到对应的叶子节点,T代表一棵树叶子的数量,w代表叶子节点的分数,wq(x)表示为一颗独立的树对于样本实例的预测值。如图:
一种标准的正则化目标项=differentiableconvexlossfunction+regularization,即损失函数+正则项。
L衡量预测值与真实值的差异,Ω作为模型复杂度的惩罚项,对于树的叶子节点个数和叶子节点权重的正则,防止过拟合,即simpleisperfect,正则化项比RGF模型更加简单。
梯度boosting树
树的集成模型不能在传统的欧几里得空间中找到合适的解,而应该通过迭代求近似解。^yi(t)表示通过t次迭代去近似真实的值,这样可以添加迭代更新项ft,也就是boosting的想法:
gi和hi分别为L的一阶、二阶偏导(梯度),移除常数项:
将样本分解为每个节点上的样本,所以目标函数化简为统一的在叶子节点上的和:
带入目标函数可得最优解:
方程(6)作为衡量树结构质量的指标,这个分数类似于决策树中的纯度,只是这个评价树的指标通过目标函数获得,而不是自定义的.列举所有可能的树的结构是不可能的,应该在初始叶子节点上通过贪心算法迭代添加分支。IL和IR是split(划分)之后左右节点的集合。I=ILUIR,所以lossfunction变为:
左+右-合并的形式通常作为评估划分的评价指标,对照公式(6),应该使上式最大。
收缩(学习速率)和列抽样(借鉴随机深林)
XGBoost除了使用正则项防止过拟合外,还使用了收缩和列抽样。收缩再次添加权重因子η到每一步树boosting的过程中,这个过程和随机优化中的学习速率相似,收缩减少每棵单独树的影响并且为将形成的树预留了空间(提高了模型的效果)。特征(列)抽样(在随机森林中使用)(相对于遍历每个特征,获取所有可能的gain消耗大)找到近似最优的分割点,列抽样防止过拟合,并且可以加速并行化。
基础精确的贪心算法
方程(7)的关键问题是找到合适的分割,精确的贪心算法通过列举所有特征的可能划分找到最优划分解,许多单机Tree算法使用这种方式找到划分点。精确的算法需要排序成连续的特征,之后计算每个可能划分的梯度统计值,如算法1:
近似算法
加权分位法
key-value为第k样本的(样本点的第K维特征,二阶导数),定义排序
表示小于z的点的比例,目标是找到划分点{sk1,sk2,···skl},这样的划分点满足式(9)
当出现特征值缺失时,实例被映射到默认的方向分支,关键是访问非缺失实体对Ik。现在的算法处理不存在的作为缺失值,学到处理缺失的最好方向,算法通过枚举一致性情况同样适用于用户指定的值。现有的树系统仅仅优化稠密的数据或者专注于处理有限的任务,例如:分类编码。XGBoost通过一种统一的方式处理所有的稀疏性情况。当出现稀疏情况的时候,稀疏性计算只有线性的计算复杂度。如图所示,稀疏自适应算法比基本的非稀疏数据算法快大约50倍。
适应于并行学习的列块
每一列通过相应的特征排序,在列中进行线性扫描。在近似算法中,每一块对应于数据的子集,不同的块可以分布在不同的机器上,发现分位点的扫描变成线性复杂度。
自适应缓存的访问
对于近似算法,我们通过选择合适的块大小解决问题,我们定义块的大小为包含在块中最大实例,因为这个反应了梯度数据的存储开销。选择太小的工作块会有线程负载,从而导致低效的并行化。而太大的块导致cache缺失,梯度数据不能很好的匹配CPU的cache。下图比较了块选择:
核外计算的块
块压缩
在加载数据进内存时,块按照列进行压缩,压缩通过独立的线程进行,这是以压缩、解压代价换区磁盘I/O。
块分片
将数据分片在在多个磁盘上,一个预取线程对应一个磁盘。
同时,Valiant和Kearns首次提出了PAC学习模型中弱学习算法和强学习算法的等价性问题,即任意给定仅比随机猜测略好的弱学习算法,是否可以将其提升为强学习算法如果二者等价,那么只需找到一个比随机猜测略好的弱学习算法就可以将其提升为强学习算法,而不必寻找很难获得的强学习算法。
1990年,Schapire最先构造出一种多项式级的算法,对该问题做了肯定的证明,这就是最初的Boosting算法。一年后,Freund提出了一种效率更高的Boosting算法。但是,这两种算法存在共同的实践上的缺陷,那就是都要求事先知道弱学习算法学习正确的下限。
AdaBoost方法的自适应在于:前一个分类器分错的样本会被用来训练下一个分类器。AdaBoost方法对于噪声数据和异常数据很敏感。但在一些问题中,AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。AdaBooast方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。而错误率高于随机分类器的弱分类器也是有用的,因为在最终得到的多个分类器的线性组合中,可以给它们赋予负系数,同样也能提升分类效果。
梯度增强的思想起源于LeoBreiman的观察,它可以被解释为一种适用于成本函数的优化算法。由JeromeH.Friedman开发的显式回归梯度增强算法。
2016年,XGBoost全名叫(eXtremeGradientBoosting)极端梯度提升,经常被用在一些比赛中,其效果显著。由ChenTianqi为主要作者的Distributed(Deep)MachineLearningCommunity(DMLC)开发
尽管xgboost在Kaggle很多问题上都有优越的性能,但是xgboost还是存在一些问题。
1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时。
2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;
xgboost主要作者陈天奇在探访中谈到,“我觉得相对来说它确实到了一个比较成熟的阶段了,可以说该有的东西基本都有了。未来需要完善的功能应该是外存计算,这是最近刚加进去的功能。其实出现这个功能的原因也是很直接的:我当时在20台机器上面跑400G的数据做分布式XGBoost实验,于是每台机器就要分20G的原始数据,这些数据在内存里做一些数据结构的处理,可能就需要60G的内存,这就已经塞不下了。所以又想到了外部存储这个解决方法,加入了这个功能。”
xgboost也可以在调参困难,贪心法耗时,叶子节点分裂增益较低等问题做进一步优化。