树增强在机器学习算法中广泛应用。陈天奇提出了XGBoost,它是一种分布式机器学习系统,该系统能够纵向扩展树增强算法。XGBoost主要优势在于快速的并行构建树,并且同时具有容错性。XGBoost在单节点可以处理上千万的样本,通过分布式计算可以处理超过十亿级别的样本。
XGBoost的主要贡献在于
提出了一种基于块数据的方式来加速树的构建,同时利用内存和外部存储;
提出了一种树搜索的分布式近似算法;
构建了一种通用的、可靠的、具有容错性的分布式通信协议
下面简单介绍下树增强算法。给定一个样本集
其中样本数为n,特征数为m。集成树模型即为
其中K是树的棵树,
是回归树所构成的空间。
这里的q表示如何将某个样本映射到某个叶子节点的结构,w表示叶子节点的权重向量。简而言之,q是决定分类路径的,w能够决定最终的评分。在XGBoost中,集成树的目标函数的形式如下
这里的目标函数带有二阶约束。l是可微凸函数,
可以用来衡量模型的复杂度,并且可以防止过拟合。
XGBoost的训练方式是加法式的,每次迭代之后就会在目标函数中新加入一棵树。对于给定的树结构q,下面的打分函数可以用来衡量其效果,
这里的
和
分别是梯度和二阶梯度。打分计算示例如下
打分越小,就说明分支策略越好。
基于树的学习算法中关键在于寻求最优分割,这就需要针对所有特征枚举所有可能的分割。下面的算法伪代码给出了如何在单机上并行寻找最优分割,关键思想在于需要根据特征对样本进行排序,然后将梯度直方图加入到打分函数中。
基于树的学习算法中最耗时的就是对数据进行排序,这个过程的复杂度为 O(n log n)。陈天奇为了降低排序的复杂度,提出将数据重构到内存单元中,这里的内存单元称为块。每个块中的数据都存成CSC格式(Compressed Column Storage),每一列都是通过特征的取值来排序。这样操作的好处在于训练之前只需计算一次,之后的迭代中可以重复利用。将所有数据放入一个块中之后,可以通过线性扫描预排序的数据来寻找最优的分割。
如此一来,可以将构建树的复杂度降到 O(n)。
一个节点不能存储所有数据时,也可以将数据存在多个块中。此时需要在每个块中给出潜在的比较好的分割,然后基于这些潜在的分割和直方图来给出最终分割。当潜在分割 数目比较少时,基于多个块可以比较高效的得到直方图累加。这种情况下,找到比较好的潜在分割比较重要,可以利用近似分位数搜寻算法来给出潜在分割。此时分位数搜寻和直方图构建都可以达到线性时间复杂度,这种操作也比较容易并行得到特征的直方图。
XGBoost中比较关键的技术还有一个就是梯度的缓存。计算累加直方图时会由于丢失缓存而变得比较慢,为了解决这个问题,XGBoost在每个线程分配了内部缓冲,该缓冲可以存贮梯度,然后以小批的形式来计算直方图。数据量比较大时,这种缓存技术可以有效的缩短运行时间。
XGBoost还可以使用外存,数据量很大时,可以将数据存放在磁盘中,每次只取一部分数据。这样操作可以应对数据量大于单机的内存的情形,也可以较好的应对内存资源较少的情形。
在分布式算法中,计算分布式分位数预估以及直方图聚合时需要一种通信协议。XGBoost中采用的同步协议是Allreduce。这种协议在其他机器学习算法如线性模型中已经得以应用。Allreduce的主要优势在于从单机转换到分布式很直接。Allreduce能够在程序本身中自然的保持程序状态,这种特性在复杂机器学习算法中非常重要,因为机器学习算法的每次迭代中会设计多轮约简,并且在复杂机器学习算法中精确的检查点很难捕捉到中间阶段的程序状态。很多现有Allreduce在迭代之间不具容错性,陈天奇提出了一种容错Allreduce协议来解决这个问题。
该协议简而言之即为,对于出错的节点,调用检查点获取正常节点的状态来恢复该节点。然后再恢复Allreduce的结果。
下面是实验结果,主要跟python的sklearn以及R的gbm进行了对比。
随机森林能够给出特征的重要性,并且比较容易并行实现,但是在噪声较大时,随机森林容易过拟合。
GBDT 能够达到比较高的准确率,但是其中的各个决策树之间的关系是串联的,比较难以并行实现。
XGBoost中能够对列进行抽样,这样可以在一定程度上防止过拟合,也可以降低计算复杂度,此外,XGBoost能够比较好的处理缺失值。XGBoost基于预排序的策略可以比较准确地确定分支策略。但是,XGBoost的时间消耗和空间消耗都比较大。
LightGBM训练速度很快,非常高效,所需内存也少,准确率较高,能够分布式处理大数据。
CatBoost能够比较好的处理含有类别型特征的数据。
XGBoost源码简析
XGBoost支持的目标函数类型有线性回归、逻辑回归(概率回归、二值分类、分类评分)
泊松回归
生存分析
伽马回归
Tweedie回归
学习模块
预测
更新某一步迭代
增强某一步迭代
评价某一步迭代
计算打分
计算权重
添加分割
剪枝策略
参考资料
https://github.com/dmlc/rabit
http://labs.criteo.com/downloads/download-terabyte-click-logs/
https://github.com/dmlc/xgboost
https://github.com/dmlc/xgboost/blob/master/src/tree/split_evaluator.cc
https://github.com/dmlc/xgboost/blob/master/src/objective/regression_obj.cc
https://github.com/dmlc/xgboost/blob/master/src/tree/updater_prune.cc
https://www.msra.cn/zh-cn/news/features/lightgbm-20170105
XGBoost: Reliable Large-scale Tree Boosting System
http://learningsys.org/papers/LearningSys_2015_paper_32.pdf
您可能感兴趣
领取专属 10元无门槛券
私享最新 技术干货