目录
一. 算法原理
在数据建模中,当我们有数个连续值特征时,Boosting分类器是最常用的非线性分类器方法将成百上千个准确率较低的模型组合起来,成为一个准确率较高的模型,这个模型会不断的迭代,每次迭代就会产生一颗新的树,然而当数据集比较大比较复杂的时候,我们可能需要几千次的迭代这样造成巨大的计算瓶颈,xgboost正是为了解决这个瓶颈问题而提出的,单机它采用多线程来加速树的构建过程。在学习xgboost之前必须要熟悉gbdt,gbdt就是boosting方法和cart回归树,通过拟合上一个模型的残差进行学习。
Xgboost相比于GBDT来说,更加有效应用了数值优化,最重要是使损失函数(预测值和真实值的误差)变得更复杂。目标函数依然是所有树的预测值相加等于预测值。
损失函数如下,引入了一阶导数,二阶导数。:
好的模型需要具备两个基本要素:一是要有好的精度(即好的拟合程度),二是模型要尽可能的简单(复杂的模型容易出现过拟合,并且更加不稳定)因此,我们构建的目标函数右边第一项是模型的误差项,第二项是正则化项(也就是模型复杂度的惩罚项)
每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差
目标函数如上图,最后一行画圈部分实际上就是预测值和真实值之间的残差
先对训练误差进行展开:
xgboost则对代价函数进行了二阶泰勒展开,同时用到了残差平方和的一阶和二阶导数
再研究目标函数中的正则项:
在这种新的定义下,我们可以把目标函数进行上述改写,其中I被定义为每个叶子上面样本集合Ij = {i|q(xi)=j},g是一阶导数,h是二阶导数。
树的复杂度可以用树的分支数目来衡量,树的分支我们可以用叶子结点的数量来表示
那么树的复杂度式子:右边第一项是叶子结点的数量T,第二项是树的叶子结点权重w的l2正则化,正则化是为了防止叶子结点过多
此时,每一次迭代,相当于在原有模型中增加一棵树,目标函数中,我们用wq(x)表示一棵树,包括了树的结构以及叶子结点的权重,w表示权重(反映预测的概率),q表示样本所在的索引号(反映树的结构)
将最终得到的目标函数对参数w求导,并令导数为0,并将w*带回目标函数,可知目标函数值由红色方框部分决定:
、