程序员Python3机器学习大数据,机器学习,人工智能

Python3机器学习实践:集成学习之XGBoost

2018-12-10  本文已影响13人  AiFany
3.png
image

一、XGBoost目标函数

首先认清一点,它是GBDT的升级版,由陈天奇发明,在效率、方法方面都进行了优化。

不管对于回归问题还是分类问题,好的机器学习方法的目的就是降低目标函数(也可称为损失函数)的值,目标函数包括2个部分:一是模型的损失函数,二是模型的复杂度。也就是目标函数具有下面的形式:

image

上面公式中,前者表示模型的损失函数的值,降低它是为了降低偏差,也就是使得预测的数据和真实的数据更为接近;后者表示这个模型的复杂度,是为了降低方差,增强模型的泛化能力。

对于XGBoost框架而言,以弱模型选择决策树(因为在XGBoost框架中,弱模型可以有多种选择,而在GBDT中,弱模型就是决策树)为例,来说明XGBoost,其目标函数为:

image

其中H(T_j)表示树T_j的叶子节点的个数,w是叶子节点的输出数值。

image

二、XGBoost目标函数求解

现在说一下XGBoost是如何求解上述目标函数的最小值的。可以看出,上面的目标函数的参数其实也是一个函数(其实树可看作一个函数),因此要求解需要换个思路。也就是Boosing,利用弱模型的加法形式转换上面的目标函数。此外,在这里利用贪心算法,也就是当前一代的损失函数比上一代的低就可以,不是从整体考虑。转换后的第t代的目标函数为:

image

根据二阶泰勒展开公式,可得到上述目标函数的近似值:

image

从上面的式子可以看出XGBoost和GBDT的差异,GBDT只是利用了一阶导数,而XGBoost利用了一阶导数和二阶导数。还有就是GBDT并没有涉及到模型的复杂度。这个式子求和中的第一项是个常数项,公式的最后一项也是常数项,将它们去掉,变为下式:

image

从上面式子可知,目标函数只是与损失函数的一阶、二阶导数有关系,因此XGBoost支持自定义的损失函数。

下面再结合树的复杂度,首先回顾下复杂度的函数:

image

其中H(T_j)表示树T_j的叶子节点的个数,w_r是叶子节点r的输出数值。

image

其中q(i)表示样本i所属的叶子节点q的样本集合。w(q(i))表示叶子节点q的输出值。I_r表示叶子节点r的样本集合。w_r表示叶子节点r的输出值。上面的函数是一个没有交叉项的多元二次函数。下面将每个叶子节点包括的样本的gi, hi的和各自定义为一个变量。

image

因为上面是一个二次函数,当树固定时,就可以获得上面式子的最小值。对w求导设置为0即可。下面给出最优的w值以及相应的最小的目标函数的值:

image

再回顾下,目标函数分了2部分,前一部分通过二阶泰勒公式的转换,只是和前一次形成的树有关系了。后一部分,也就是怎么构建当前的这个树呢。上面的式子其实可看作一个树的评分公式。树从一开始只是有一个叶子节点(也就是根节点),按照上面的式子计算分数,然后这个节点开始分裂,分裂后再按照上面的公式计算分数,如此下去,遍历所有的可能性,选择上述值最小的那个。暴力可行,但是还有更好的方法。

下面给出分裂一个当前的叶子节点,这个目标函数的变化值Change,通过变化值的正负变化,就可以判断这个叶子节点该不该分裂:如果下面的值小于0,则说明需要分裂。

image

举个例子说明,假如现在要以特征为年龄,年龄值为10作为分割点,则有

image

下面给出如何得到最优分割点(也就是上图中的年龄、10):

遍历所有的特征,将每个特征的值从小到大顺序排列,然后从左到右遍历一次即可得到这个特征中哪个分割点的Change最小,然后在所有特征中选择Change最小的那个作为最终的分割点。

image

三、XGBoost相比GBDT的改进

image

四、XGBoost实例

image

实例代码XGBoost,扫描下方二维码或者微信公众号直接搜索”Python范儿“,关注微信公众号pythonfan, 获取更多实例和代码。

pythonfan.jpg
上一篇 下一篇

猜你喜欢

热点阅读