参考文章:
Gradient Boosting梯度提升-GBDT与XGBoost解析及应用
理解XGBoost
集成算法梳理——XGBoost
回顾前面的梯度提升算法,知道梯度提升使用前序模型的预测值 f m − 1 ( x i ) f_{m-1}(x_i) fm−1(xi)和标签值 y i y_i yi之间的残差 D m ^ = { ( x i , r i m ) i = 1 , 2 … n } \hat{D_m}=\{(x_i, r_{im})i=1,2…n\} Dm^={ (xi,rim)i=1,2…n},对弱学习器 h m h_m hm进行不断强化和训练,从而得到更强的学习器 f m = f m − 1 + h m f_m = f_{m-1} + h_m fm=fm−1+hm,本质是利用负梯度拟合思想,使 l o s s loss loss损失函数沿着 f m − 1 f_{m-1} fm−1的负梯度方向前进来最小化损失函数,这里的梯度,就是 l o s s loss loss损失函数关于自变量 f m − 1 f_{m-1} fm−1的一阶导数。
而xgboosting,就是利用 l o s s loss loss关于 f m − 1 f_{m-1} fm−1的二阶导数信息来指导弱学习器 h m h_m hm的训练,提升训练速度。
首先看损失函数,用泰勒二项公式展开得到:
∑ i = 1 n l ( y i , f m − 1 ( x i ) + h m ) ≈ ∑ i = 1 n [ l ( y i , f m − 1 ( x i ) ) + g i ⋅ h m ( x i ) + 1 2 h i ⋅ h m ( x i ) 2 ] g i = ∂ l ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) h i = ∂ l 2 ( y i , f m − 1 ( x i ) ) ∂ f m − 1 ( x i ) 2 \begin{aligned} & \sum^n_{i=1} l(y_i, \ f_{m-1}(x_i)+h_m) \\ \quad & \approx \sum^n_{i=1}[l(y_i, \ f_{m-1}(x_i)) + g_i \cdot h_m(x_i) + \frac{1}{2}h_i \cdot h_m(x_i)^2] \end{aligned} ~\\ g_i = \frac{\partial \ l(y_i,\ f_{m-1}(x_i))}{\partial \ f_{m-1}(x_i) } \qquad h_i = \frac{\partial \ l^2(y_i,\ f_{m-1}(x_i))}{\partial \ f_{m-1}(x_i)^2} i=1∑nl(yi, fm−1(xi)+hm)≈i=1∑n[l(yi, fm−1(xi))+gi⋅hm(xi)+21hi⋅hm(xi)2] gi=∂ fm−1(xi)∂ l(yi, fm−1(xi))hi=∂ fm−1(xi)2∂ l2(yi, fm−1(xi))
对于 i = 1 , 2 … n i=1,2…n i=1,2…n,由牛顿法(即点 x x x在其导数为零处取得极值)可以得到:
∂ l ( y i , f m − 1 ( x i ) + h m ( x i ) ) ∂ h m ( x i ) ≈ g i + h i ⋅ h m ( x i ) g i + h i ⋅ h m ( x i ) = 0 h m ( x i ) = − g i h i \frac{\partial \ l(y_i,\ f_{m-1}(x_i)+h_m(x_i))}{\partial \ h_m(x_i)}\ \approx \ g_i + h_i \cdot h_m(x_i) \\ ~\\ g_i+h_i \cdot h_m(x_i) = 0 \\ ~\\ h_m(x_i) = - \frac{g_i}{h_i} ∂ hm(xi)∂ l(yi, fm−1(xi)+hm(xi)) ≈ gi+hi⋅hm(xi) gi+hi⋅hm(xi)=0 hm(xi)=−higi
这样,令 ∂ l o s s ∂ h m ( x i ) = 0 \dfrac{\partial \ loss}{\partial \ h_m(x_i)} = 0 ∂ hm(xi)∂ loss=0,得到 h m ( x i ) h_m(x_i) hm(xi)(即上式),就可以让损失函数在其二阶近似上取得最小值。但xgboosting不只是这样,它还引入了正则项对弱学习器 h m ( x ) h_m(x) hm(x)进行过拟合的惩罚。
Ω ( h m ) = γ T + 1 2 λ ∥ ω ∥ 2 \Omega(h_m) = \gamma T + \frac{1}{2} \lambda \| \omega \|^2 Ω(hm)=γT+21λ∥ω∥2
主要有两种算法;
输入数据 I I I:,当前节点的训练样本集,训练样本数为 n n n
输入数据 d d d:,特征向量维数
初始化分裂质量: s c o r e ← 0 score ← 0 score←0
计算所有样本的一阶导数,二阶导数之和: G ← ∑ i ∈ I g i , H ← ∑ i ∈ I h i G←∑i∈I_{gi} ,H ←∑i∈I_{hi} G←∑i∈Igi,H←∑i∈Ihi
循环,对 k = 1 , . . . , d k=1,...,d k=1,...,d
对所有训练样本按照第 k k k个特征升序排序
初始化左子集所有训练样本的一阶导数,二阶导数之和: G l ← 0 , H l = 0 G_l ←0,H_l =0 Gl←0,Hl=0
循环,对 j = 1 , . . . , n j=1,...,n j=1,...,n,以第 j j j个样本的第 k k k个特征分量 x j k x_{jk} xjk作为分裂阈值
计算左子集所有样本的一阶导数和二阶导数之和,在之前的基础上加上本次
被从右
边分到左边的样本的一阶导数和二阶导数值即可: G L ← G l + g i , H l ← H l + h j G_L ←G_l +gi,H_l ←H_l +h_j GL←Gl+gi,Hl←Hl+hj
计算右子集所有样本的一阶导数和二阶导数之和,可以根据总和,左子集的和快速
计算: G R ← G − G l , H R ← H − H l G_R ←G-G_l,H_R ←H-H_l GR←G−Gl,HR←H−Hl
计算分裂分数的最大值:
s c o r e ← m a x ⟮ s c o r e , G l 2 H l + λ + G R 2 H R + λ + G 2 H + λ ⟯ score \gets max \ \lgroup score,\ \dfrac{G^2_l}{H_l+\lambda\ } + \dfrac{G^2_R}{H_R + \lambda \ }+\dfrac{G^2}{H+\lambda} \rgroup score←max ⟮score, Hl+λ Gl2+HR+λ GR2+H+λG2⟯
结束循环
正则项为;
Ω ( h m ) = γ T + 1 2 λ ∥ w ∥ 2 \Omega(h_m) = \gamma T + \frac{1}{2} \lambda \| w \|^2 Ω(hm)=γT+21λ∥w∥2
其中, γ \gamma γ和 λ \lambda λ是人为设定的系数, w w w为弱学习器(这里是决策树)所有叶子节点构成的向量, T T T为叶子节点的总数,正则项由叶子节点数,叶子节点值向量的模平方两项构成,第一项体现了决策树结构的复杂程度,第二项体现了决策树预测值的复杂程度。
XGBoost实现时还使用了权重收缩与列采样技术,以抵抗过拟合。权重收缩的做法是在每训练出一棵决策树之后将其权重进行缩放,乘上系数 η \eta η。权重收缩降低了之前的决策树的影响,为将来要生成的决策树留下了更多的空间。列采样的做法与随机森林相同,每次寻找最佳分裂时只考虑一部分随机抽取的特征分量。
xgboost处理缺失值的方法和其他树模型不同。xgboost把缺失值当做稀疏矩阵来对待,本身在节点分裂时不考虑缺失值的数值,但确定分裂的特征后,缺失值数据处理策略是落在哪个子结点得分高,就放到哪里。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。
见参考文章3
分类问题,回归问题都可以
参数 | 类型 | 默认值 | 作用 |
---|---|---|---|
loss | devience exponential |
devience | 损失函数 |
learning_rate | float | 0.1 | 学习率,每个学习器的权重 |
n_estimators | int | 100 | 输的个数 |
criterion | str | friendman_mse | 分裂算法 |
max_depth | int or None | None | 树的最大深度 |
n_iter_no_change | int or None | None | 早停轮数 |
tol | float | 1e-4 | 早停阀值 |
validation_fraction | float | 0.1 | 早停验证比例 |
min_samples_split | int or float | 2 | 分裂时最小样本数 |
min_samples_leaf | int or float | 1 | 叶节点最小样本数 |
min_weight_fraction_leaf | float | 0 | 叶节点最小样本权重总值 |
max_features | int float atr None | ‘auto’ | 最大特征数 |
max_leaf_nodes | int or None | None | 最大叶节点数 |
min_impurity_decrease | float | 0. | 切分点不纯度最小减少程度,若节点不纯度小于该值,则被剔除 |
random_state | int or None | None | 随机种子 |