1.引言
最近,由于一些缘由,本身须要作一个小范围的XGBoost的实现层面的分享,因而干脆就整理了一下相关的资料,串接出了这份report,也算跟这里的问题相关,算是从一个更偏算法实现的角度,提供一份参考资料吧。这份report从建模原理、单机实现、分布式实现这几个角度展开。
在切入到细节以前,特别提一下,对于有过GBDT算法实现经验的同窗(与我有过直接connection的同窗,至少有将四位同窗都有过直接实现GBDT算法的经验)来讲,这份report可能不会有太多新意,这更可能是一个技术细节的梳理,一来用做技术分享的素材,二来也是顺便整理一下本身对这个问题的理解,由于本身实际上并无亲自动手实现过度布式的GBDT算法,因此但愿借这个机会也来梳理一下相关的知识体系。本文基于XGBoost官网代码[12],commit是b3c9e6a0db0a7eb755949ac6b26e3ef805738350。
2.建模原理
我我的的理解,从算法实现的角度,把握一个机器学习算法的关键点有两个,一个是loss function的理解(包括对特征X/标签Y配对的建模,以及基于X/Y配对建模的loss function的设计,前者应用于inference,后者应用于training,而前者又是后者的组成部分),另外一个是对求解过程的把握。这两个点串接在一块儿构成了算法实现的主框架。具体到XGBoost,也不出其外。
XGBoost的loss function能够拆解为两个部分,第一部分是X/Y配对的建模,第二部分是基于X/Y建模的loss function的设计。
2.1. X/Y建模
做为GBDT算法的具体实现,XGBoost表明了Tree Model的一个特例(boosting tree v.s. bagging tree),基本的思想用下图描述起来会更为直观:git
若是从形式化的角度来观察,则能够描述以下:算法
其中F表明一个泛函,表征决策树的函数空间,K表示构成GBDT模型的Tree的个数,T表示一个决策树的叶子结点的数目, w是一个向量。看到上面X/Y的建模方式,也许咱们会有一个疑问:上面的建模方式输出的会是一个浮点标量,这种建模方式,对于Regression Problem拟合得很天然,可是对于classification问题,怎样将浮点标量与离散分类问题联系起来呢?理解这个问题,实际上,能够经过Logistic Regression分类模型来得到启发。咱们知道,LR模型的建模形式,输出的也会是一个浮点数,这个浮点数又是怎样跟离散分类问题(分类面)联系起来的呢?实际上,从广义线性模型[13]的角度,待学习的分类面建模的其实是Logit[3],Logit自己是是由LR预测的浮点数结合建模目标知足Bernoulli分布来表征的,数学形式以下:框架
对上面这个式子作一下数学变换,可以得出下面的形式: 机器学习
这样一来,咱们实际上将模型的浮点预测值与离散分类问题创建起了联系。
相同的建模技巧套用到GBDT里,也就找到了树模型的浮点预测值与离散分类问题的联系: 分布式
考虑到GBDT应用于分类问题的建模更为tricky一些,因此后续关于loss function以及实现的讨论都会基于GBDT在分类问题上的展开,后续再也不赘述。
2.2. Loss Function设计
分类问题的典型Loss建模方式是基于极大似然估计,具体到每一个样本上,实际上就是典型的二项分布几率建模式[1]: 函数