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

xgb1.png

一、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最小的那个作为最终的分割点。

  • 陈天奇提出的Weighted Quantile Sketch方法

  • 近似直方图算法

image

三、XGBoost相比GBDT的改进

  • GBDT在优化时只用到一阶导数信息,XGBoost同时用到了一阶和二阶导数,还支持自定义损失函数,前提损失函数可一阶和二阶求导;

  • 加入了正则项,用于控制模型的复杂度,防止过拟合;

  • 借鉴了随机森林的做法,支持列抽样(随机选择特征),不仅能降低过拟合,还能减少计算;

  • 寻找最佳分割点时,实现了一种近似法,还考虑了稀疏数据集、缺失值的处理,大大提升算法的效率;

  • 支持并行;

  • 近似直方图算法,用于高效地生成候选的分割点;

  • 在算法实现时做了很多优化,大大提升了算法的效率,内存空间不够时,利用了分块、预取、压缩、多线程协作的思想。

image

四、XGBoost实例

  • 北京Pm2.5回归

    参数选择图image

    预测数据集结果对比

image

  • 成年人收入分类

    参数选择图

    image

    预测数据集结果展示image

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

猜你喜欢

转载自blog.csdn.net/qq_32882309/article/details/85596996