英文是Gradient Boosting Decision Tree (GBDT)。是一种迭代的决策树算法,由多棵决策树组成,将所有树的结论累加起来做最终答案。值得注意的是,GBDT中的树都是回归树,不是分类树。GBDT主要用于回归问题(包括线性和非线性),但也可以用于分类问题。
我们在已经搞清楚决策树(DT)部分的前提下,可以简单看看梯度迭代(GB)。GB核心的思想就是每一棵树都在学习之前所有树结论和的残差。
训练集数据 D = { ( x i , y i ) } i = 1 N D = \{(x_i,y_i)\}_{i=1}^N D={(xi,yi)}i=1N。损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))。我们令树的数量为 M M M,用 m m m表示当前树的序号。
初始化 f 0 ( x ) = a r g m i n γ ∑ i = 1 N L ( y i , γ ) f_0(x) = argmin_\gamma \sum_{i=1}^N L(y_i, \gamma) f0(x)=argminγ∑i=1NL(yi,γ)
对于 m = 1 ∼ M m = 1 \sim M m=1∼M:
a) 对于每一个观测 i = 1 ∼ N i = 1 \sim N i=1∼N计算伪残差(pseudo-residuals)
r i m = − [ ∂ L ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) ] r_{im} = -[\frac{\partial L(y_i, f_{m-1}(x_i))}{\partial f_{m-1}(x_i)}] \\\\ rim=−[∂fm−1(xi)∂L(yi,fm−1(xi))]
b) 对数据集 { ( x i , r i m ) i = 1 N } \{(x_i, r_{im})_{i=1}^N\} {(xi,rim)i=1N}拟合一棵回归树 h m ( x ) h_m(x) hm(x)来学习残差。
c) 对于一维优化问题,计算
γ m = a r g m i n γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + γ h m ( x i ) ) \gamma_{m} = argmin_\gamma \sum_{i=1}^N L(y_i, f_{m-1}(x_i) + \gamma h_m(x_i)) γm=argminγi=1∑NL(yi,fm−1(xi)+γhm(xi))
d) 更新当前树的函数
f m ( x ) = f m − 1 ( x ) + γ m h m ( x ) f_m(x) = f_{m-1}(x) + \gamma_{m} h_m(x) fm(x)=fm−1(x)+γmhm(x)
解释如下:
1、初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树,即 γ \gamma γ是一个常数值。使用常数值的原因是常数是拟合数据集最差的模型(直接假设 x x x和 y y y直接没有关系),模型可以通过不断迭代找到更好的模型。
2、
(a)计算损失函数的负梯度在当前模型的值,将它作为残差的估计
(b)估计回归树叶节点区域,以拟合残差的近似值
(c)利用线性搜索估计叶节点区域的值,使损失函数极小化
(d)更新回归树
3、得到输出的最终模型 f ( x ) f(x) f(x)。
近年来多被用于搜索排序。
优点
缺点
英文是eXtreme Gradient Boosting (XGBoost)。针对传统GBDT算法做了很多细节改进,包括损失函数、正则化、切分点查找算法优化、稀疏感知算法、并行化算法设计等等。
训练集数据 D = ( x i , y i ) i = 1 N D = {(x_i,y_i)}_{i=1}^N D=(xi,yi)i=1N。损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))。我们令树的数量为 M M M,用 m m m表示当前树的序号。
限定条件为,
f ( x ) = ∑ j = 1 M h j ( x ) f ( x ) m = ∑ j = 1 m h j ( x ) f(x) = \sum_{j=1}^M h_j(x) \\\\ f(x)_m = \sum_{j=1}^m h_j(x) \\\\ f(x)=j=1∑Mhj(x)f(x)m=j=1∑mhj(x)
J = ∑ i = 1 N L ( y i , f ( x i ) ) + ∑ m = 1 M Ω ( f m ) J = \sum_{i=1}^N L(y_i, f(x_i)) + \sum_{m=1}^M \Omega(f_m) J=∑i=1NL(yi,f(xi))+∑m=1MΩ(fm)。
前一部分就是普通的损失函数,一般是MSE或者Logistic Loss。后一部分是惩罚函数,用于控制树的复杂度,帮助抑制过拟合。
我们浅析其计算过程。
y ^ i ( 0 ) = 0 y ^ i ( 1 ) = f 1 ( x i ) = y ^ i ( 0 ) + f 1 ( x i ) y ^ i ( 0 ) = f 1 ( x i ) + f 2 ( x i ) = y ^ i ( 1 ) + f 2 ( x i ) . . . y ^ i ( t ) = ∑ k = 1 m f k ( x i ) = y ^ i ( m − 1 ) + f m ( x i ) \hat y_i^{(0)} = 0 \\\\ \hat y_i^{(1)} = f_1(x_i) = \hat y_i^{(0)} + f_1(x_i) \\\\ \hat y_i^{(0)} = f_1(x_i) + f_2(x_i) = \hat y_i^{(1)} + f_2(x_i) \\\\ ...\\\\ \hat y_i^{(t)} = \sum_{k=1}^m f_k(x_i) = \hat y_i^{(m-1)} + f_m(x_i) \\\\ y^i(0)=0y^i(1)=f1(xi)=y^i(0)+f1(xi)y^i(0)=f1(xi)+f2(xi)=y^i(1)+f2(xi)...y^i(t)=k=1∑mfk(xi)=y^i(m−1)+fm(xi)
由于这是个树模型,传统SGD不太适用。所以我们使用增量训练(additive training)。我们需要对目标函数进行泰勒展开,这要求损失函数至少二阶可导。这里不详细介绍。
根据经验,介绍模型中最需要调整的参数。
常规参数General Parameters
booster: 默认是gbtree;也可以Dart模式,类似Dropout的思想
树参数Tree Parameters
max_depth:树的深度,最重要的参数,过深的话容易过拟合。
eta: 学习率learning_rate,0.01~0.2
gamma:在树的叶子节点上进行进一步分区所需的最小损失减少。利用CV进行微调
min_child_weight: 每一支需要的观测实例的最小权重(hessian),利用CV进行微调
学习任务参数Learning Task Parameters
eval_metric:评判标准,根据数据的不同进行设置
优点
缺点