xgboost 是一种集成学习方法,通过构建多棵决策树来实现分类和回归任务。
本文记录了xgboost的公式推导和系统实现的一些trick。
具体内容参加原论文《XGBoost: A Scalable Tree Boosting System》
模型描述
对于一棵决策树,给定以下符号表示
∣ T ∣ |T| ∣T∣: 此棵树的叶子节点数
q ( x ) q(\textbf{x}) q(x): x \textbf{x} x将会被映射到的叶子节点, 故 q ( x ) q(x) q(x)的取值范围是 [ 1 , ∣ T ∣ ] [1, |T|] [1,∣T∣]
w j \textbf{w}_j wj: 第j个叶子节点的输出值。
如果将一棵决策树视为一个函数,则可以写成
f ( x ) = w q ( x ) f(\textbf{x}) = w_{q(\textbf{x})} f(x)=wq(x)
由于xgboost是使用多棵决策树,并且每棵树学习的上一棵树的残差,故xgboost的输出公式为
y i ^ = ∑ k = 1 K f k ( x i ) \hat{y_i} = \sum_{k=1}^{K}f_k(\textbf{x}_i) yi^=k=1∑Kfk(xi)
其中第 f k f_k fk表示第k棵决策树,xgboost会在每一次迭代中生成一棵新的决策树。
目标函数
xgboost的目标函数
L = ∑ i l ( y ^ i , y i ) + ∑ k Ω ( f k ) L = \sum_il(\hat{y}_i, y_i) + \sum_k\Omega(f_k) L=i∑l(y^i,yi)+k∑Ω(fk)
Ω ( f ) = γ T + 1 2 λ ∥ w ∥ 2 \Omega(f) = \gamma T + \frac{1}{2}\lambda\|w\|^2 Ω(f)=γT+21λ∥w∥2
- 第一项用来衡量模型的分类的错误率,这里用来描述 y ^ , y \hat{y}, y y^,y之间的距离函数 l l l, 并没有指定,可以使用平方差或者其他的损失函数。
- 第二项用于控制模型的复杂度
梯度提升算法
由于 f f f是一棵树,无法用梯度下降或者牛顿法这种方法进行优化,所以xgboost采用前向分步算法。这种算法是一种贪心算法,具体做法是从前向后,每一步只学习一个基函数及其系数,逐渐优化目标函数,也就是说xgboost每次迭代会产生一个新的决策树,并保持之前的决策树不变。
令 y i ( t ) y^{(t)}_i yi(t) 表示第 i i i 个样本在第 t t t 次迭代时的输出结果,则:
y i ( t ) = y i ( t − 1 ) + f t ( x i ) y_i^{(t)} = y_i^{(t - 1)} + f_t(\textbf{x}_i) yi(t)=yi(t−1)+ft(xi)
则第t次迭代时,目标函数可以写成如下形式:
L ( t ) = ∑ i = 1 n l ( y i , y ^ i ( t − 1 ) + f t ( x ) ) + Ω ( f t ) L^{(t)} = \sum_{i=1}^nl(y_i, \hat y_i^{(t-1)} + f_t(\textbf{x})) + \Omega(f_t) L(t)=i=1∑nl(yi,y^i(t−1)+ft(x))+Ω(ft)
xgboost的优化方法是需要用到泰勒二阶展开,要求损失函数 l l l 具有二阶导数,泰勒公式如下
f ( x − x 0 ) = f ( x 0 ) + ( x − x 0 ) f ′ ( x 0 ) + ( x − x 0 ) 2 2 f ′ ′ ( x 0 ) + . . . + ( x − x 0 ) n n ! f n ( x 0 ) f(x-x_0) = f(x_0) + (x - x_0)f^{\prime}(x_0) + \frac{(x-x_0)^2}{2}f^{\prime\prime}(x_0) + ...+ \frac{(x-x_0)^n}{n!}f^{n}(x_0) f(x−x0)=f(x0)+(x−x0)f′(x0)+2(x−x0)2f′′(x0)+...+n!