学习笔记-XGBOOST

作者: Pluto_wl | 来源:发表于2020-03-24 11:30 被阅读0次

XGBOOST是GBDT模型的升级版,同样也用到了adboosting的思想

一 预备知识

  1. XGBOOST是前向加法模型,那么有公式:
    \hat{y}^0_i=0 \tag {1.1}
    f_n(x)表示第n棵树的模型,那么就有
    \hat{y}^1_0=\hat{y}^0_i + f_1(x_i) \tag{1.2}
    所以第k次生成的模型为
    \hat{y}^k_i = f_0(x_i) + f_1(x_i) + ...+ f_k(x_i)=\hat{y}^{k-1}_i+f_k(x_i) \tag{1.3}

  2. 目标函数的定义
    设有N个样本,K棵树,f_k(x_i)表示第k棵树, \Omega(f_k(x))表示第k棵树的复杂程度,XGBOOST的损失函数定义为如下:
    obj=\sum^N_{i=1}l(y_i, \hat{y}_i)+\sum^K_{k=1} \Omega(f_k(x)) \tag{1.4}
    可以将上述目标函数拆分为两部分:

  • 第一部分是\sum^N_{i=1}l(y_i, \hat{y}_i),这是普通的损失函数,l可以是 均方差,也可以是其他的损失函数。
  • 第二部分是\sum^K_{k=1} \Omega(f_k(x)),表示训练第K+1棵的时候,前K棵树的复杂程度,需要将所有树的复杂度相加的原因是XGBOOST是前向加法模型,第K个模型的结果是前K棵树相加而得到的。
    如何表示树的复杂度呢?其叶节点的个数、树的深度、和叶结点的值都可以表示复杂度。叶结点可以表示复杂度的原因是叶结点的值越小,需要的树越多,比如目标时是3,当每棵树叶结点的值是1的时候,需要三棵树;当一个树的值为2,一个树的结点为1时,那么就只需要两棵树。
  1. 训练第K棵树时
    式子1.4为 obj=\sum^N_{i=1}l(y_i, \hat{y}^{K}_i)+\sum^K_{k=1} \Omega(f_k(x))
    根据前向加法模型展开式1.4
    obj= \sum^N_{i=1}l(y_i, \hat{y}^{K-1}_{i-1}+f_K(x_i)) + \sum^{K-1}_{k=1}\Omega(f_k(x)) + \Omega(f_K(x)) \tag{1.5}
    因为\sum^{K-1}_{k=1}\Omega(f_k(x))是前K-1棵树的复杂度,所以此部分的复杂度是已知的,将式1.5改写为下列式子:
    obj= \sum^N_{i=1}l(y_i, \hat{y}^{K-1}_{i-1}+f_K(x_i)) + \Omega(f_K(x)) \tag{1.6}
    我们的目标是最小化损失函数:
    obj= \sum^N_{i=1}l(y_i, \hat{y}^{K-1}_{i-1}+f_K(x_i)) + \Omega(f_K(x)) \tag{1.7}

二 使用泰勒级数近似目标函数

  1. 先来回忆下泰勒公式
    f(x+ \bigtriangleup x)\simeq f(x) + {f}'(x) \bigtriangleup x +\frac{1}{2}{f}''(x) \bigtriangleup x^2 \tag{2.1}
  2. 将式1.7中的\hat{y}^{K-1}_i当作式2.1的x,f_K(x_i)当作式2.1的\bigtriangleup x,代入到式1.7中得:
    obj = \sum^N_{i=1} l(y_i, \hat y_i^{K-1}) + {l(y_i, \hat{y}^{K-1}_i)}'f_K(x_i) + {l}''(y,\hat y _i^{K-1})f^2_K(x_i) +\Omega(f_K(x)) \tag{2.2}
  3. 我们发现上式中只要f_K(x_i)是未知项,l(y_i, \hat y_i^{K-1}){l(y_i, \hat{y}^{K-1}_i)}'{l(y_i, \hat{y}^{K-1}_i)}''都是已知项,令g_i={l(y_i, \hat{y}^{K-1}_i)}', h_i={l(y_i, \hat{y}^{K-1}_i)}'',将{l(y_i, \hat{y}^{K-1}_i)}忽略,可将式2.2改为:
    obj = \sum^N_{i=1} g_if_K(x_i) + h_if^2_K(x_i) +\Omega(f_K(x)) \tag{2.3}
    此处需要注意下,f_K(x)就是我们得参数

三 引入新的符号

为了方便之后的计算和表示,我们先引入一些符号

  • 定义q_i(x)表示样本x属于哪一个叶结点
  • 定义W_{q_i(x)}为样本x所属结点上的值
  • 定义|I_i|_1表示第i个结点上共有多少个样本

下图中表示有样本D=\{ (x_1,y_1), (x_2,y_2),(x_3,y_3),(x_4,y_4), (x_5,y_5)\},样本x_1和样本x_3决策分类值是15,样本x_4的值是12,样本x_2和样本x_5的值是20。将结点从左到右排列,记为序号1,2,3所以根据上述定义,我们可以得到

q(x_1)=1,q(x_2)=3,q(x_3)=1,q(x_4)=2,q(x_1)=3

W_{q_i(x)}表示样本x的预测值,那么f_K(x)=W_{q_i(x)},所以有下列等式
f_K(x_1)=W_{q_{(x_1)}}=W_1=15,f_K(x_2)=W_{q_{(x_2)}}=W_3=20, f_K(x_3)=W_{q_{(x_3)}}=W_1=15,f_K(x_4)=W_{q_{(x_4)}}=W_2=12, f_K(x_5)=W_{q_{(x_5)}}=W_3=15,

我们得知第一个结点上有两个样本,所以|I_1|=2,第二个结点上有一个样本,|I_2|=1,结点3上有两个样本,所以|I_3|=2

来自于网络

四 树的复杂度

上面说过了,树的复杂度可能由深度、叶结点的个数、叶结点的值决定。我们现在来看看XGBOOST中的复杂度\Omega(f_k(x))是如何定义的:
\Omega(f_k(x))=\sigma T+\frac{1}{2}\lambda \sum^T_{t=1}W^2_t \tag{4.1}
T表示有多少个叶节点,W_t表示第t个结点上的值
\sigma\lambda都是超参数,需要有人工设置

根据三和四,我们可以将式1.7改写为如下形式:
obj =\sum^N_{i=1} [g_i W_{q_i(x)} +h_i W^2_{q(x_i)} ] + \sigma T + \frac{1}{2} \lambda W^2_{q(x_i)} \tag{5.1}

obj=\sum^T_{t=1}[(\sum_{j\in I_t }g_j)W_{q_{x_i}} + \frac{1}{2} (\sum_{j\in I_t}h_j)W^2_{q_{x_i}}] + \sigma T + \frac{1}{2} \lambda W^2_{q(x_i)}\tag{5.2}
在第二部分的3小部分,我们可以知道g_ih_i是已知的,所以 \sum_{j\in I_t }g_j(\sum_{j\in I_t}h_j)都是常数,使用G_t表示\sum_{j\in I_t }g_j,使用H_t表示(\sum_{j\in I_t}h_j),可以下式
obj = \sum^T_{t=1}[G_tW_{q_{x_i}} + \frac{1}{2}H_tW^2_{q_{x_i}}] + \sigma T + \frac{1}{2} \lambda W^2_{q(x_i)} \tag{5.3}
obj = \sum^T_{t=1}[G_tW_{q_{x_i}} + \frac{1}{2} (H_t +\lambda) W^2_{q(x_i)}]+ \sigma T\tag{5.4}
上述式子可以看做以W_{q_{x_i}}的二次函数,当W_{q_{x_i}}=- \frac{G_t}{H_t+\lambda}时,obj取得最值。将- \frac{G_t}{H_t+\lambda}代入式5.4得obj得极值
obj= -\sum^T_{t=1} \frac{G^2_t}{H_t+\lambda}+\sigma T \tag{5.5}

优缺点

  • 优点
  1. 正则化:XGBoost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的 L2 模的平方和。从 Bias-variancetradeoff 角度来讲,正则项降低了模型的 variance,使学习出来的模型更加简单,防止过拟合,这也是 XGBoost 优于传统 GBDT 的一个特性。
  2. 并行处理:我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost 在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个 block 结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  3. 对于特征的值有缺失的样本,XGBoost 可以自动学习出它的分裂方向。
  • 缺点
  1. 算法参数过多
  2. 只适合处理结构化数据
  3. 不适合处理超高维特征数据

参考文献

  1. http://ihoge.cn/2018/boosting.html

相关文章

  • xgboost和lda学习

    XGBoost 源码阅读笔记 ( 1 ) :代码逻辑结构 XGBoost 源码阅读笔记(2):树构造之 Exact...

  • 11 集成学习 - XGBoost案例 - 波士顿房价进行预测

    08 集成学习 - XGBoost概述09 集成学习 - XGBoost公式推导10 集成学习 - XGBoost...

  • 学习笔记-XGBOOST

    XGBOOST是GBDT模型的升级版,同样也用到了adboosting的思想 一 预备知识 XGBOOST是前向加...

  • GBDT进化->XGBoost & LightGBM简记

    很全面的阐释XGBoost: 集成学习之Boosting —— XGBoost 大体来看,XGBoost 在原理方...

  • xgboost学习笔记 + GBDT

    从泰勒公式说起 泰勒公式损失函数存在二阶导数的时候,可以提供参数下降的方向梯度下降法的泰勒展开理解.png 为什么...

  • 071 XGBoost

    背景 谈到大杀器XGBoost,我们从集成学习开始讨论,逐步演化到XGBoost 集成学习 bagging减小方差...

  • 一文道尽XGBOOST的前世今生

    XGBOOST 简介 XGBOOST:简单来说是集成了很多个基学习器(如Cart决策树)的模型。它是集成学习的串行...

  • Python集成学习算法

    Python集成学习算法---XgBoost 转载原文在讲XGBoost之前,先讲一下GBDT,以及与Adaboo...

  • day01-集成决策树模型

    1、xgboost原理1.1 xgboost原始论文1.2 xgboost原始ppt介绍1.3 xgboost基础...

  • XGBoost的参数

    XGBoost参数 XGBoost的参数可以分为三种类型: 通用参数、booster参数以及学习目标参数Gener...

网友评论

    本文标题:学习笔记-XGBOOST

    本文链接:https://www.haomeiwen.com/subject/hplkdhtx.html