对xgboost的一些理解
最近一直在看机器学习比赛的相关内容,发现在比赛排行榜TOP10中,好多都用到了xgboost。于是拿过来研究了一下,下面是个人这段时间的对其的一些理解,水平不足,如在后续学习过程中发现理解不当之处,会及时更正,也恳请各位指正。
一、简介
xgboost也是一种boost提升方法,在这里关于提升方法这部分就先不详细介绍了。xgboost的作者是陈天奇博士。每当谈到xgboost,总是离不开性能也很优异的GBDT算法(Gradient Boosting Decision Tree),继续往基础方面挖掘,就涉及到了提升树(boosting tree)模型,最后就回归到了我们熟知的决策树(Decision Tree)。下面我们开始一窥究竟。
二、提升树模型
提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法,以决策树为基函数的提升方法称为提升树(boosting tree)。不过,这里的决策树都为二叉树,对于分类问题,采用分类二叉树,对于回归问题,则采用回归二叉树。提升树模型可以用决策树的加法模型来表示:
其中, T(x;Θm) 表示决策树,M表示为决策树的个数, Θm 表示为决策树的参数。
由于树的线性组合可以很好的拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此。所以,提升树算法可以采用前向分步算法,算法如下:1.确定初始提升树 f0(x)=0 ;2.第 m 步的模型是
对于回归问题我们一般采用平方误差损失函数,可以很容易的证明:对于回归问题的提升树算法,只需拟合当前模型的残差。这里残差为:
GBDT
提升树模型是一个相当好的算法,但是当损失函数不为平方误差损失函数或者不为指数损失函数时,每一步的优化就会出现困难了。于是,Freidman就提出了梯度提升(gradient boosting)算法,其基本思想就是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中残差的近似值,以此来拟合一个回归树 。负梯度值为:
具体算法为:(此图来源gbdt的 wiki)
在GBDT中,优化方式是采用的利用一阶导数的梯度下降法。在参数空间中, θt=θt−1+θt ,其中 θt−1 是经过t-1次迭代过后的参数。 θt 为第t次迭代的参数增量, θt=−αtgt 。映射到函数空间, Ft(x)=Ft−1(x)+Ft(x) , Ft(x)=−αt(x)g(x) 。
XGBoost
XGBoost与GBDT不同的是,XGBoost在损失函数上增加了正则项以减少过拟合现象,并且利用Taylor展开式,利用一二阶导数信息进行求解。
XGBoost目标函数的定义为:
其中正则项
Ω
具体为:
T
为叶子节点个数,后一项为叶节点分数
将目标函数进行二阶Taylor展开后得:
其中,
我们把
ft
和
Ω(ft)
写成树结构的形式,即:
代入目标函数中,得到
则将目标函数已经写成了按叶节点累加的形式,为了简洁,我们可以写为:
由此看来,如果树结构确定了,我们只需令目标函数的导数为0就可求得极值。此时每个节点最优预测分数为
代入目标函数得:
但是出现的一个问题为:我们不能暴力找到所有的树结构从而找到最小的,所以我们只能运用贪心算法每次尝试分裂一个叶节点,计算分裂前后的增益,选择增益最大的。那么如何选择这个增益函数?我们来观察最优目标函数值,发现右边前一项衡量了每个叶子节点对总体损失的的贡献,我们希望损失越小越好,则标红部分的值越大越好。那么我们可以这样定义增益函数:
选择使Gain最大的feature进行分割。
小结
对于GBDT和XGBoost的基本思路就先这么理一下,也会有理解不深的地方。最重要的还是模型的应用。调参是个大工程,等以后实际应用到的时候再来记录自己的体会吧。