XGBoost

目录

1. XGBoost原理

1.1 提升方法(Boosting)

1.2 提升决策树 (BDT,Boosting Decision Tree)

1.3 梯度提升决策树 (GBDT,Gradient Boosting Decision Tree)

1.4 极限梯度提升(XGBoost,eXtreme Gradient Boosting)


附一篇很赞的博客:https://www.pianshen.com/article/30521719325/

XGBoost_第1张图片

\begin{aligned} XGBoost &= eXtreme + GBDT \\ &=eXtreme + (Gradient + BDT) \\ &= eXtreme + Gradient + (Boosting + DecisionTree) \\ &Boosting \rightarrow BDT \rightarrow GBDT \rightarrow XGBoost \end{aligned}

BDT(集成决策树):在决策树的基础上用boosting方法集成

GBDT(梯度提升决策树):在BDT的基础上使用一阶梯度进行残差拟合

XGB:GBDT做一系列优化改进

1. XGBoost原理

1.1 提升方法(Boosting)

提升方法使用加法模型和前向分步算法

加法模型

 f(x) = \sum_{m=1}^M\beta_m b(x;\gamma _m) \ \ \ \ \ \ \ \ \ \ (1.1)

其中,b(x;\gamma _m)为基函数,\gamma_m为基函数的参数,\beta_m为基函数的系数。

在给定训练数据\{(x_i, y_i)\}_{i=1}^N及损失函数L(y,f(x))的条件下,学习加法模型f(x)成为经验风险极小化问题:

 min_{\beta_m,\gamma_m} \sum_{i=1}^N L(y_i, \sum_{m=1}^M \beta_m b(x_i;\gamma_m)) \ \ \ \ \ \ \ \ \ \ \ \ \ (1.2)

前向分步算法求解这⼀优化问题的思路:因为学习的是加法模型,可以从前向后,每⼀步只学习⼀个基函数及其系数,逐步

逼近优化⽬标函数式( 1.2 ),则可以简化优化复杂度。具体地,每步只需优化如下损失函数:
min_{\beta,\gamma} \sum_{i=1}^N L(y_i, \beta b(x_i;\gamma)) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1.3)
算法 1.1 前向分步算法
输⼊:训练数据集T = \{(x_1, y_1), (x_2, y_2), \cdots , (x_N, y_N)\}; 损失函数L(y, f(x));基函数集合 \{b(x;\gamma )\}
输出:加法模型f(x)
1)初始化f_0(x)=0
2 )对m=1, 2, \cdots, M
a )极⼩化损失函数
(\beta_m, \gamma_m) = argmin_{\beta, \gamma} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + \beta b(x_i;\gamma)) \ \ \ \ \ \ \ \ \ \ \ \ (1.4)
得到参数 \beta_m, \gamma_m
(b) 更新
f_m(x) = f_{m-1}(x) + \eta_m b(x;\gamma_m) \ \ \ \ \ \ \ \ \ \ \ \ \ (1.5)
3 )得到加法模型
f(x) = f_M(x) = \sum_{m=1}^M \beta_m b(x;\gamma_m) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (1.6)
前向分步算法将同时求解从 = 1 所有参数 \beta_m, \gamma_m 的优化问题简化为逐次求解各个 \beta_m, \gamma_m 的优化问题

1.2 提升决策树 (BDTBoosting Decision Tree

将Boosting中的基模型约束为决策树,将\beta_m约束为1,即为BDT。
以决策树为基函数的提升⽅法为提升决策树。
提升决策树模型可以表示为决策树的加法模型:

f_M = \sum_{m=1}^M T(x; \Theta_m) \ \ \ \ \ \ \ \ \ \ \ \ (2.1)

其中,T(x; \Theta_m)表示决策树;\Theta_m为决策树的参数;M为树的个数。

提升决策树采⽤前向分步算法。⾸先确定初始提升决策树 f_0(x)=0,第m步的模型是

f_m(x) = f_{m-1}(x) + T(x; \Theta_m)

其中,f_{m-1}(x)为当前模型,通过经验风险极小化确定下一颗决策树的参数\Theta_m

\hat{\Theta}_m = argmin_{\Theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i; \Theta_m)) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2.3)

已知训练数据集T = \{(x_1, y_1), (x_2, y_2), \cdots , (x_N, y_N)\}x_i \in \chi \subseteq \mathbb{R}^n\chi为输⼊空间,y_i \in \gamma \subseteq \mathbb{R}\gamma为输出空间。

如果将输⼊空间 \chi划分为J个互不相交的区域R_1, R_2, \cdots, R_J ,并且在每个区域上确定输出的常量c_j ,那么决策树可表示为

T(x; \Theta) = \sum_{j=1}^J c_j I(x \in R_j) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2.4)

其中,参数 \Theta = \{(R_1, c_1 ) ,(R_2, c_2 ), \cdots, (R_J, c_J ) \}表示决策树的区域划分和各区域上的常量值。J 是决策树的复杂度即叶⼦
结点个数。

提升决策树使⽤以下前向分步算法:

XGBoost_第2张图片

在前向分步算法的第m步,给定当前模型f_{m-1}(x),需要求解

\hat{\Theta}_m = argmin_{\Theta_m} \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i; \Theta_m))

得到\hat{\Theta}_m,即第m棵树的参数。

当采⽤平⽅误差损失函数时,

L(y, f(x)) = (y - f(x))^2

其损失变为

\begin{aligned} L(y, f_{m-1}(x) + T(x; \Theta_m)) &= [y - f_{m-1}(x) - T(x; \Theta_m)]^2 \\ &= [r - T(x; \Theta_m)]^2 \end{aligned}

其中,

r = y - f_{m-1}(x) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (2.5)

是当前模型拟合数据的残差(residual)。对回归问题的提升决策树,只需要简单地拟合当前模型的残差。
算法 2.1 回归问题的提升决策树算法
输⼊:训练数据集 T = \{(x_1, y_1), (x_2, y_2), \cdots , (x_N, y_N)\}
输出:提升决策树f_M(x)
1 )初始化f_0(x) = 0
2 )对m = 1, 2, \cdots , M
a )按照式( 2.5 )计算残差

r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, \cdots, N

b) 拟合残差 学习⼀个回归树,得到T(x; \Theta_m)
c )更新f_m(x) = f_{m-1}(x) + T(x;\Theta_m)
3 )得到回归提升决策树

f_M(x) = \sum_{m=1}^M T(x; \Theta_m)

1.3 梯度提升决策树 (GBDTGradient Boosting Decision Tree

GBDT VS BDT: BDT学习的是当前模型拟合数据的残差;GBDT学习的是损失函数关于梯度的负值。

梯度提升算法使⽤损失函数的负梯度在当前模型的值

\left.\begin{matrix} -[\frac{\partial L(y, f(x_i))}{\partial f(x_i)}] \end{matrix}\right| _{f(x)=f_{m-1}(x)} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (3.1)

作为回归问题提升决策树算法中残差的近似值,拟合⼀个回归树。

算法3.1 梯度提升算法

输⼊:训练数据集T = \{(x_1, y_1), (x_2, y_2), \cdots , (x_N, y_N)\} ; 损失函数L(y, f(x))
输出:梯度提升决策树\hat{f}(x)
1 )初始化

f_0(x) = argmin_c \sum_{i=1}^N L(y_i, c)

(2)对m = 1, 2, \cdots, M

a)对i = 1, 2, \cdots, N ,计算

r_{mi} = \left.\begin{matrix} -[\frac{\partial L(y, f(x_i))}{\partial f(x_i)}] \end{matrix}\right| _{f(x)=f_{m-1}(x)}

b)对 拟合⼀个回归树,得到第 棵树的叶结点区域R_{mj}, j=1, 2, \cdots, J

c )对j = 1, 2, \cdots, J ,计算

c_{mj} = argmin_c \sum_{x_i \in R_{mj}} L(y_i, f_{m-1}(x_i) + c)

d )更新f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})
3 )得到回归梯度提升决策树
\hat{f}(x) = f_M(x) = \sum_{m=1}^M \sum_{j=1}^J c_{mj}I (x \in R_{mj})

1.4 极限梯度提升(XGBoosteXtreme Gradient Boosting

GBDT VS XGB

  • GBDT仅使用了一阶梯度拟合,XGB用到了二阶梯度拟合,自然阶数越高,拟合的精度越高。
  • GBDT是经验风险最小化,容易过拟合,XGB引入了正则化项
训练数据集D = \{ (x_i, y_j ) \},其中x_i \in \mathbb{R}^m, y_i\in\mathbb{R}, |D|=n
决策树模型
f(x) = w_{q(x) }\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.1)   
其中q: \mathbb{R}^m \rightarrow \{1, \cdots, T\}, 是由输⼊x向叶⼦结点编号的映射, w \in \mathbb{R}^T是叶⼦结点向量, T为决策树叶⼦节点数。
提升决策树模型预测输出
\hat{y}_i = \phi(x_i) = \sum_{k=1}^K f_k(x_i) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.2)
其中, f_k(x)为第k棵决策树。
正则化⽬标函数,我们期待当前的树的叶子结点不要太多\gamma T;我们还期待每颗叶子结点的输出值不要太大\frac{1}{2}\lambda || w || ^2,这个是从稳定性考虑的?
\pounds (\phi) = \sum_i l(\hat{y}_i, y_i) + \sum_{k} \Omega(f_k) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.3)
其中,\Omega(f) = \gamma T + \frac{1}{2} \lambda || w||^2 = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2
轮⽬标函数
\pounds^t = \sum_{i=1}^n l(y_i, \hat{y}_i^{t-1} + f_t(x_i)) + \Omega(f_t) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.4)
t轮⽬标函数\pounds ^{t}\hat{y}^{(t-1)}处的⼆阶泰勒展开
\begin{aligned} \pounds ^{(t)} &\simeq \sum_{i=1}^n [l(y_i, \hat{y}^{(t -1)}) + \partial _{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t -1)})f_t(x_i) + \frac{1}{2} \partial^2 _{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t -1)})f_t^2(x_i) ] + \Omega(f_t) \\ &= \sum_{i=1}^n [l(y_i, \hat{y}^{(t -1)}) + g_if_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)] + \Omega(f_t) \end{aligned} \ \ \ \ \ \ \ \ \ \ \ \ \ (4.5)
其中, g_i =\partial _{\hat{y}^{(t-1)}} l (y_i, \hat{y}^{(t-1)}), h_i = \partial^2 _{\hat{y}^{(t-1)}} l (y_i, \hat{y}^{(t-1)})
第t轮⽬标函数\pounds ^{(t)} 的⼆阶泰勒展开,并移除关于f_t(x_i) 常数项
\begin{aligned} \hat{\pounds}^{(t)} &=\sum_{i=1}^n [g_if_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)] + \Omega(f_t) \\ &=\sum_{i=1}^n [g_if_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w^2_j \end{aligned} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.6)
我们可以看到两个累加项,但是前一个是对整个数据集的累加(遍历数据集),后一个是对叶子的累加(遍历叶节点),暂时没法统一。但是我们想想,所有的数据集中的数据必然应该落到叶子上,所以对数据集的遍历可以转换为对叶子结点的遍历,遍历完一个叶子结点里面的数据,我们再遍历下一个叶子节点。即我们遍历叶子结点再遍历叶子结点所有的数据。公式表达如下:
 
定义叶结点 j上的样本的下标集合I_j =\ {i| q(x_j) = j\} ,则⽬标函数可表示为按叶结点累加的形式
\hat{\pounds}^{(t)} = \sum_{j=1}^T [(\sum_{i\in I_j}g_i)w_j + \frac{1}{2}(\sum_{i\in I_j}h_i + \lambda)w_j^2 ] + \gamma T \ \ \ \ \ \ \ \ \ \ \ \ \ (4.7)
由于
w^*_j = argmin_{w_j} \hat{\pounds}^{(t)}
可令
\frac{\partial \hat{\pounds ^{(t)}}}{\partial w_j} = 0
得到每个叶结点 的最优分数为
w_j^* = -\frac{\sum_{i \in I_j}g_i}{\sum_{i \in I_j}h_i + \lambda} \ \ \ \ \ \ \ \ \ \ (4.8)
代⼊每个叶结点 的最优分数,得到最优化⽬标函数值
\hat{\pounds}^{(t)} (q) = -\frac{1}{2} \sum_{j=1}^T\frac{(\sum_{i\in I_j }g_i)^2}{\sum_{i \in I_j}h_i + \lambda} + \gamma T \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (4.9)
假设I_LI_R分别为分裂后左右结点的实例集,令I = I_L \cup I_R,则分裂后损失减少量由下式得出
\pounds_{split} = \frac{1}{2}[\frac{\sum_{i \in I_L g_i}^2}{\sum_{i \in I_L}h_i + \lambda} + \frac{\sum_{i \in I_R g_i}^2}{\sum_{i \in I_R }h_i + \lambda} - \frac{\sum_{i \in I g_i}^2}{\sum_{i \in I}h_i + \lambda} - \gamma ] \ \ \ \ \ \ \ \ (4.10)
⽤以评估待分裂结点。
算法 4.1 分裂查找的精确贪婪算法
输⼊:当前结点实例集I ; 特征维度d
输出:根据最⼤分值分裂
1 gain \leftarrow 0
2 G \leftarrow \sum_{i \in I}g_i, H \leftarrow \sum_{i \in I} h_i 
3 for k=1 to d do
3.1 G_L \leftarrow 0, H_L \leftarrow 0 
3.2 for j in sorted( I, by x_{jk} ) do
3.2.1) G_L \leftarrow G_L+g_i, H_L \leftarrow H_L + h_j 
3.2.2) G_R \leftarrow G - G_L H_L \leftarrow H - H_L
(3.2.3)score \leftarrow max(score, \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{G^2}{H + \lambda} )
3.3 end
4 end

你可能感兴趣的:(机器学习,机器学习,决策树,XGBoost)