xgboost 算法总结

xgboost有一篇博客写的很清楚,但是现在网址已经失效了,之前转载过,可以搜索XGBoost 与 Boosted Tree。

现在参照这篇,自己对它进行一个总结。

xgboost是GBDT的后继算法,也是采用boost算法的cart 树集合。

一、基学习器:分类和回归树(CART) 

cart树既可以 进行分类,也可以进行回归,但是两种情况下,采用的切分变量选择方式不同。

CART在进行回归的时候,选择最优切分变量和切分点采用的是如下的标准

其中,c和c2满足下式,即为该段变量取值的均值

CART采用暴力的遍历方式来确定最优切分变量和切分点,具体算法如下:

CART分类树的算法类似,由于分类无法计算均值,CART分类树采用的是计算基尼指数,通过遍历所有特征和他们的可能切分点,选择基尼指数最小的特征及切分点作为最优特征和最优切分点,并重复调用,直到生成CART分类树。

二、Tree Ensemble

如果单棵树的过于简单无法有效地预测,因此一个更加强力的模型叫做tree ensemble,也就是分类树的集成算法。如果采用boost集成,也就是加法集成,可以写成如下

其中每个f是一个在函数空间里面的函数,而对应了所有regression tree的集合。

目标函数如下:

前半部分是误差函数,后半部分是正则化项。

 三、模型学习 additive training 

因为现在我们的参数可以认为是在一个函数空间里面,我们不能采用传统的如SGD之类的算法来学习我们的模型,因此我们会采用一种叫做additive training的方式。。每一次保留原来的模型不变,加入一个新的函数ff到我们的模型中。

现在还剩下一个问题,我们如何选择每一轮加入什么f呢?答案是非常直接的,选取一个f来使得我们的目标函数尽量最大地降低

这个公式可能有些过于抽象,我们可以考虑当ll是平方误差的情况。这个时候我们的目标可以被写成下面这样的二次函数

 更加一般的,对于不是平方误差的情况,我们会采用如下的泰勒展开近似来定义一个近似的目标函数,方便我们进行这一步的计算

当我们把常数项移除之后,我们会发现如下一个比较统一的目标函数。这一个目标函数有一个非常明显的特点,它只依赖于每个数据点的在误差函数上的一阶导数和二阶导数

四、树的复杂度 

到目前为止我们讨论了目标函数中训练误差的部分。接下来我们讨论如何定义树的复杂度。我们先对于f的定义做一下细化,把树拆分成结构部分q和叶子权重部分w。下图是一个具体的例子。结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么

当我们给定了如上定义之后,我们可以定义一棵树的复杂度如下。这个复杂度包含了一棵树里面节点的个数,以及每个树叶子节点上面输出分数的L2模平方。当然这不是唯一的一种定义方式,不过这一定义方式学习出的树效果一般都比较不错。

五、关键步骤 

这是xgboost最巧妙处理的部分,在这种新的定义下,我们可以把目标函数进行如下改写,其中被定义为每个叶子上面样本集合

 这样目标函数可以如下变化,使用步骤四中的方式来表示误差函数和复杂度,如下

这一个目标包含了T个相互独立的单变量二次函数。我们可以定义

这是一个关于的二次函数,可以知道最值如下:

六、打分函数计算举例

猜你喜欢

转载自www.cnblogs.com/bnuvincent/p/11223200.html