XGBoost

任务要求:对二分类数据集 \(\mathcal{D}=\{(x_i,y_i)\}_{i=1}^n\)训练模型,前 \(t-1\) 树已训练完成,此时在第 \(t\) 轮我们要学习一棵新树 \(f_t\),来改进当前预测值\(\hat y_i^{(t-1)}\),目标是最小化训练集上的正则化损失 \(Obj^{(t)}\)\(f_t(x_i)\) 输出为第 \(i\) 个样本所在的叶子节点的输出

\[\boxed{Obj^{(t)} = \sum_{i=1}^n L(y_i, \hat y_i^{(t-1)}+f_t(x_i)) + \Omega(f_t)} \]

其中:

  • \(Obj^{(t)}\):训练第 \(t\) 棵树的目标函数
  • \(i\):第 \(i\) 个样本
  • \(n\):样本数量
  • \(L(y_i,\hat y_i^{(t-1)}+f_t(x_i))\):损失函数,\(\hat y_i^{(t-1)}+f_t(x_i)\) 为输入值
    • \(y_i\):第 \(i\) 个样本真实值
    • \(\hat y_i\):第 \(i\) 个样本预测值。
  • \(\Omega(f_t)\):第 \(t\) 棵树(模型)的复杂度。正则化项,进行复杂度约束
    • \(f_t\):第 \(t\) 棵树
    • \(f_t(x_i)\)\(t\) 轮新增树对样本的直接输出(叶权值),并不是拟合的残差

正则化项

\[\boxed{\Omega(f_t)=\gamma T+\frac12\lambda\sum_{j=1}^T\omega_j^2} \]

  • \(T\):叶子节点数。叶子节点越多,代表模型越复杂
  • \(\gamma\):树的复杂度控制系数,超参数
  • \(\omega_j\):第 \(j\) 个叶子节点的叶权值。叶权值:叶子节点样本输出值的优化值,并非平均值,叶权值越大,对树的影响越大,复杂度越高。
  • \(\lambda\):叶权重正则化参数,超参数

泰勒展开

泰勒公式:\(f(x)=\sum_{n=0}^\infty \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n\),其中:

  • \(x_0\):泰勒展开点
  • \(f^{(n)}(x_0)\):泰勒展开点的 \(n\) 阶导

泰勒展开:\(f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+\frac{f'''(x_0)}{3!}(x-x_0)^3+...\)
上式中,我们设:

  • \(x=\hat y_i\)(预测值)
  • \(x_0=\hat y_i^{(t-1)}\)(上一轮预测值)

因此\(L(y_i,\hat y_i)=L(y_i,\hat y_i^{(t-1)})+\frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial\hat y_i^{(t-1)}}(\hat y_i-\hat y_i^{(t-1)})+\frac12\frac{\partial^2 L(y_i,\hat y_i^{t-1})}{\partial(\hat y_i^{(t-1)})^2}(\hat y_i-\hat y_i^{(t-1)})^2+...\),令:

  • \(g_i=\left.\frac{\partial L(y_i,\hat y_i)}{\partial\hat y_i}\right|_{\hat y_i=\hat y_i^{(t-1)}}=\frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial\hat y_i^{(t-1)}}\):泰勒一阶导数(梯度)
  • \(h_i=\left.\frac{\partial^2L(y_i,\hat y_i)}{\partial\hat y_i^2}\right|_{\hat y_i=\hat y_i^{(t-1)}}=\frac{\partial^2 L(y_i,\hat y_i^{(t-1)})}{\partial(\hat y_i^{(t-1)})^2}\):泰勒二阶导数(曲率)
    • 二阶展开:一阶展开只考虑了梯度方向,二阶展开则同时考虑了梯度和曲率,使得优化更精确,收敛更快。不必考虑三阶导数,三阶导数已经对目标函数的影响十分微小,可以忽略
  • 且已知\(\hat y_i=\hat y_i^{t-1}+f_t(x_i)\Rightarrow\hat y_i-\hat y_i^{t-1}=f_t(x_i)\)
  • 二阶近似展开:

\[\boxed{L(y_i,\hat y_i)\approx L(y_i,\hat y_i^{(t-1)})+g_if_t(x_i)+\frac12h_if_t(x_i)^2} \]

  • \(L(y_i,\hat y_i^{(t-1)})\):为由前 \(t-1\) 棵树确定的损失值,对于目标函数 \(Obj^{(t)}\) 是常数,对寻找最优叶权值无作用,因此我们又可看作:$$\boxed{L(y_i,\hat y_i)\approx g_if_t(x_i)+\frac12h_if_t(x_i)^2}$$

式子改写

我们使用叶子节点作为目标函数自变量,使得正则项和损失函数项自变量一致,对式子进行改写。定义样本索引集合 \(I_j=\{i:q(x_i)=j\}\), 将以样本 \(i\) 为单位的 \(f_t(x_i)\) 用以叶子节点 \(j\) 为单位的 \(\omega_j\) 替代 。

  • \(Obj^{(t)}\approx\sum_{i=1}^n[g_if_t(x_i)+\frac12h_if_t(x_i)^2]+\gamma T+\frac12\lambda\sum_{j=1}^T\omega_j^2\)
    \(\approx\sum_{j=1}^T[\sum_{i\in I_j}g_i\omega_j+\frac12\sum_{i\in I_j}h_i\omega_j^2]+\gamma T+\frac12\lambda\sum_{j=1}^T\omega_j^2\)

  • \(G_j\triangleq\sum_{i\in I_j}g_i\)\(H_j\triangleq\sum_{i\in I_j}h_i\)。其中:\(G_j\) 为叶子节点的梯度,\(H_j\) 为叶子节点的曲率。代入:$$\boxed{Obj{(t)}\approx\sum_{j=1}T[G_j\omega_j+\frac12(H_j+\lambda)\omega_j^2]+\gamma T}$$

  • 对每个叶节点因此可对其求导:\(\frac\partial{\partial\omega_j}(G_j\omega_j+\frac12(H_j+\lambda)\omega_j^2)=G_j+(H_j+\lambda)\omega_j=0\)

  • 最优叶权值:$$\boxed{\omega_j^*=-\frac{G_j}{H_j+\lambda}}$$

  • 最优目标函数:

\[\boxed{(Obj^{(t)})^*=-\frac12\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T} \]

分裂增益
我们认为父叶节点贡献:\(Gain_父=-\frac12\frac{G_父^2}{H_父+\lambda}+\gamma\)
若该节点继续分裂,则分为左节点和右节点,子节点贡献:\(Gain_子=-\frac12\frac{G_左^2}{H_左+\lambda}-\frac12\frac{G_右^2}{H_右+\lambda}+2\gamma\)
分裂增益:\(Gain=Gain_父-Gain_子=\frac12(\frac{G_左^2}{H_左+\lambda}+\frac{G_右^2}{H_右+\lambda}-\frac{G_父^2}{H_父+\lambda})-\gamma\)
我们认为 \(Gain>0\) 时接受分裂

学习率更新

  • 计算:\(\omega_j^*=-\frac{G_j}{H_j+\lambda}\)
  • 更新:\(\hat y_i^{(t)}=\hat y_i^{(t−1)}+\eta\omega_{q(x_i)}^*\)

损失函数

  • 回归任务:\(L(y_i,\hat y_i)=\frac12(y_i-\hat y_i)^2\)

    • \(g_i=\frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial\hat y_i^{(t-1)}}=\frac{\partial \frac12(y_i-\hat y_i^{(t-1)})^2}{\partial\hat y_i^{(t-1)}}=-(y_i-\hat y_i^{(t-1)})\)
    • \(h_i=\frac{\partial^2 L(y_i,\hat y_i^{(t-1)})}{\partial(\hat y_i^{(t-1)})^2}=\frac{\partial^2\frac12(y_i-\hat y_i^{(t-1)})^2}{\partial(\hat y_i^{(t-1)})^2}=1\)
  • 二分类任务:\(L(y_i,\hat y_i)=-[y_i\log p_i+(1-y_i)\log(1-p_i)]\)

    • 其中:\(p_i\):第 \(i\) 个样本预测为 1 的概率。逻辑回归中 \(p_i=\sigma(\hat y_i)=\frac1{1+e^{-\hat y_i}}\)
    • \(g_i=\frac{\partial L(y_i,\hat y_i^{(t-1)})}{\partial\hat y_i^{(t-1)}}=\frac{\partial -[y_i\log p_i^{(t-1)}+(1-y_i)\log(1-p_i^{(t-1)})]}{\partial\hat y_i^{(t-1)}}=p_i-y_i\)
    • \(h_i=\frac{\partial^2L(y_i,\hat y_i^{(t-1)})}{\partial(\hat y_i^{(t-1)})^2}=\frac{\partial^2-[y_i\log p_i^{(t-1)}+(1-y_i)\log(1-p_i^{(t-1)})]}{\partial(\hat y_i^{(t-1)})^2}=p_i(1-p_i)\)

完整流程

1. 初始化:$\hat y_i^{(0)}=$ 随机初始值
2. 梯度更新:
   (1). 计算所有样本的 $g_i$ 和 $h_i$
    (2). 构建新树:考虑所有候选分裂,计算每个候选分裂的左右子集的 $G$,$H$ 计算 $Gain$
    (3). 选择最大 $Gain$(若 $Gain\leqslant0$ 或 $T$ 达到限制则停止分裂)
    (4). 重复 (2)-(3) 直到满足树深度、叶数、最小样本数等停止条件
    (5). 计算每个叶节点的 $G_j$,$H_j$,解得到最优叶权重 $\omega_j^*$
    (6). 更新预测 $\hat y_i$
  1. 最终模型:\(\hat y_i=\sum_t\eta f_t(x_i)\)