xgboost导读及论文理解

X-gboost(Extreme-Gradient Boosting)

优化的分布式梯度提升算法,end-to-end 不需要特征抽取。输入原始数据,就能输出目标结果。

整篇论文技术实现分两个部分

核心点


1. 算法推导 (paper篇幅30%)



判别式:


判别公式

 :  booster Forest

:  森林中树的数量,受到max_estimator的约束

: 森林中的每颗树

显而易见,xgboost是非线性(Tree)的加法模型



损失函数(加入omega的):


目标/损失函数

:   

如果是回归问题则可能是:  

                                                                           

                                                                             

 而分类问题则应该是交叉熵, 此处:

二分类问题:

多分类问题:对数损失函数softmax版 -\sum_{c=1}^m {y_{ic}}log(1-\hat{y_i} ) \Rightarrow objective =

这里review一下,对于多分类及二分类,交叉熵及soft公式,二分类均是多分类的特例

:




叠加式的训练或迭代版的目标函数:

请注意,当前所有的函数的观测角度都是当前子树\Rightarrow 且面对上述公式,我们依然没有好的直接求解最优化的方式



泰勒展开形式损失函数:

论文作者通过taylor 二阶展开的方式来近似求解上述问题,其中g_i为损失函数的一阶导,h_i为损失函数的二阶导数




将当前子树复杂度代入损失函数中:



1. 假设:第t轮的树形状假设已经确认了(因为我们目前求解的是叶子结点的值w) 原文是 “For a fixed structure q(x)”

5. 此时w_j, w_j^2 前的系数 其实都是常数 所以公式4就是个一元二次方程 所以 w_j = -(b/2a) 时是最优的值 即 公式5



遗留问题:如何确认第t轮树的形状,换言之,如何做树的分裂

贪心算法寻最优树结构:


最优的定义:依然是信息增益,通俗来讲,就是这次分裂后的信息不纯度- 分裂前的信息不纯度 要高多少,打个分


最优公式

此时对于分类问题而言,信息增益是gini或者信息熵,对于回归问题而言则是方差标准差或其他


分裂寻优的优化解决方案:

大致做的事情就是:将样本对应的二阶导h_i作为划分依据,将同范围占比的特征值划分到同一范围内

h_i相当于是一个加权系数weight,二阶导差异越大的地方,样本分布越稀疏。其加权的意义在于,把候选节点选取的机会更多地让于二阶导更大的地方


weighted quantile sketch



缺失值处理

原文描述:Default direction, 按我的理解应该是:每轮迭代,每颗树对待一个特征缺失的方向处理应该是一致的,但是不同特征的缺失方向是随机的;不同的迭代子树,策略也是随机的



剪枝策略:

XGBoost 采用的是后剪枝的策略,建每棵树的时候会一直分裂到指定的(max_depth),然后递归地从底向上进行剪枝,对之前每个分裂进行考察,如果该分裂之后的Gain⩽0,就会舍弃,相当于先分裂再去计算





xgboost的并行化的工程优化 (paper篇幅的70%)




在建树的过程中,最耗时是找最优的切分点,而这个过程中,最耗时的部分是将数据排序。为了减少排序的时间,Xgboost采用Block结构存储数据(Data in each block is stored in the compressed column (CSC) format, with each column sorted by the corresponding feature value) 

对于approximate算法来说,Xgboost使用了多个Block,存在多个机器上或者磁盘中。每个Block对应原来数据的子集。不同的Block可以在不同的机器上计算。该方法对Local策略尤其有效,因为Local策略每次分支都重新生成候选切分点。




使用Block结构的一个缺点是取梯度的时候,是通过索引来获取的,而这些梯度的获取顺序是按照特征的大小顺序的。这将导致非连续的内存访问,可能使得CPU cache缓存命中率低,从而影响算法效率


获取梯度时的困难

在非近似的贪心算法中, 使用缓存预取(cache-aware prefetching)。具体来说,对每个线程分配一个连续的buffer,读取梯度信息并存入Buffer中(这样就实现了非连续到连续的转化),然后再统计梯度信息

在近似 算法中,对Block的大小进行了合理的设置。定义Block的大小为Block中最多的样本数。设置合适的大小是很重要的,设置过大则容易导致命中率低,过小则容易导致并行化效率不高。经过实验,发现2^16比较好




当数据量太大不能全部放入主内存的时候,为了使得out-of-core计算称为可能,将数据划分为多个Block并存放在磁盘上。计算的时候,使用独立的线程预先将Block放入主内存,因此可以在计算的同时读取磁盘。但是由于磁盘IO速度太慢,通常更不上计算的速度。因此,需要提升磁盘IO的销量。Xgboost采用了2个策略:

Block压缩(Block Compression):将Block按列压缩(LZ4压缩算法?),读取的时候用另外的线程解压。对于行索引,只保存第一个索引值,然后只保存该数据与第一个索引值之差(offset),一共用16个bits来保存

offset,因此,一个block一般有2的16次方个样本。

Block拆分(Block Sharding):将数据划分到不同磁盘上,为每个磁盘分配一个预取(pre-fetcher)线程,并将数据提取到内存缓冲区中。然后,训练线程交替地从每个缓冲区读取数据。这有助于在多个磁盘可用时增加磁盘读取的吞吐量。



论文引用

[1]  R. Bekkerman. The present and the future of the kdd cup competition: an outsider’s perspective. (xgboost应用)

[2]  R. Bekkerman, M. Bilenko, and J. Langford. Scaling Up Machine Learning: Parallel and Distributed Approaches. Cambridge University Press, New York, NY, USA, 2011.(并行分布式设计)

[3]  J. Bennett and S. Lanning. The netflix prize. In Proceedings of the KDD Cup Workshop 2007, pages 3–6, New York, Aug. 2007.(xgboost应用)

[4]  L. Breiman. Random forests. Maching Learning, 45(1):5–32, Oct. 2001.(Breiman随机森林论文)

[5]  C. Burges. From ranknet to lambdarank to lambdamart: An overview. Learning, 11:23–581, 2010.

[6]  O. Chapelle and Y. Chang. Yahoo! Learning to Rank Challenge Overview. Journal of Machine Learning Research - W & CP, 14:1–24, 2011.(xgboost应用)

[7]  T. Chen, H. Li, Q. Yang, and Y. Yu. General functional matrix factorization using gradient boosting. In Proceeding

of 30th International Conference on Machine Learning(通过梯度提升的方法来实现general的矩阵分解)

(ICML’13), volume 1, pages 436–444, 2013.

[8] T. Chen, S. Singh, B. Taskar, and C. Guestrin. Efficient

second-order gradient boosting for conditional random fields. In Proceeding of 18th Artificial Intelligence and Statistics Conference (AISTATS’15), volume 1, 2015.(二阶导boost实现的条件随机场)

[9] R.-E. Fan, K.-W. Chang, C.-J. Hsieh, X.-R. Wang, and C.-J. Lin. LIBLINEAR: A library for large linear classification. Journal of Machine Learning Research, 9:1871–1874, 2008.(xgboost应用)

[10] J. Friedman. Greedy function approximation: a gradient boosting machine. Annals of Statistics, 29(5):1189–1232, 2001.(gbm的贪心算法实现)

[11] J. Friedman. Stochastic gradient boosting. Computational Statistics & Data Analysis, 38(4):367–378, 2002.

(随机梯度下降)

[12] J. Friedman, T. Hastie, and R. Tibshirani. Additive logistic regression: a statistical view of boosting. Annals of Statistics, 28(2):337–407, 2000.(叠加式的逻辑回归方式)

[13] J. H. Friedman and B. E. Popescu. Importance sampled learning ensembles, 2003.(采样学习)

[14] M. Greenwald and S. Khanna. Space-efficient online computation of quantile summaries. In Proceedings of the 2001 ACM SIGMOD International Conference on Management of Data, pages 58–66, 2001.

[15] X. He, J. Pan, O. Jin, T. Xu, B. Liu, T. Xu, Y. Shi,

A. Atallah, R. Herbrich, S. Bowers, and J. Q. n. Candela. Practical lessons from predicting clicks on ads at facebook. In 

Proceedings of the Eighth International Workshop on Data Mining for Online Advertising, ADKDD’14, 2014.(xgboost应用)

[16] P. Li. Robust Logitboost and adaptive base class (ABC) Logitboost. In Proceedings of the Twenty-Sixth Conference Annual Conference on Uncertainty in Artificial Intelligence (UAI’10), pages 302–311, 2010.(logitboost)

[17] P. Li, Q. Wu, and C. J. Burges. Mcrank: Learning to rank using multiple classification and gradient boosting. In Advances in Neural Information Processing Systems 20, pages 897–904. 2008.(多分类应用)

[18] X. Meng, J. Bradley, B. Yavuz, E. Sparks,

S. Venkataraman, D. Liu, J. Freeman, D. Tsai, M. Amde, S. Owen, D. Xin, R. Xin, M. J. Franklin, R. Zadeh,

M. Zaharia, and A. Talwalkar. MLlib: Machine learning in apache spark. 

Journal of Machine Learning Research, 17(34):1–7, 2016.(分布式机器学习设计)

[19] B. Panda, J. S. Herbach, S. Basu, and R. J. Bayardo. Planet: Massively parallel learning of tree ensembles with mapreduce. Proceeding of VLDB Endowment, 2(2):1426–1437, Aug. 2009.(分布式机器学习设计)

[20] F. Pedregosa, G. Varoquaux, A. Gramfort, V. Michel,

B. Thirion, O. Grisel, M. Blondel, P. Prettenhofer,

R. Weiss, V. Dubourg, J. Vanderplas, A. Passos,

D. Cournapeau, M. Brucher, M. Perrot, and E. Duchesnay. Scikit-learn: Machine learning in Python. 

Journal of Machine Learning Research, 12:2825–2830, 2011.(sklearn)

[21] G. Ridgeway. Generalized Boosted Models: A guide to the gbm package.

[22] S. Tyree, K. Weinberger, K. Agrawal, and J. Paykin. Parallel boosted regression trees for web search ranking. In Proceedings of the 20th international conference on World wide web, pages 387–396. ACM, 2011.

[23] J. Ye, J.-H. Chow, J. Chen, and Z. Zheng. Stochastic gradient boosted distributed decision trees. In Proceedings of the 18th ACM Conference on Information and Knowledge Management, CIKM ’09.

[24] Q. Zhang and W. Wang. A fast algorithm for approximate quantiles in high speed data streams. In Proceedings of the 19th International Conference on Scientific and Statistical Database Management, 2007.(数据处理加速计算)

[25] T. Zhang and R. Johnson. Learning nonlinear functions using regularized greedy forest. IEEE Transactions on Pattern Analysis and Machine Intelligence, 36(5), 2014.

你可能感兴趣的:(xgboost导读及论文理解)