DataWhale机器学习高级算法梳理Day3-XGBoosting

算法原理

参考文章:
Gradient Boosting梯度提升-GBDT与XGBoost解析及应用
理解XGBoost
集成算法梳理——XGBoost

回顾前面的梯度提升算法,知道梯度提升使用前序模型的预测值 f m − 1 ( x i ) f_{m-1}(x_i) fm1(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,2n},对弱学习器 h m h_m hm进行不断强化和训练,从而得到更强的学习器 f m = f m − 1 + h m f_m = f_{m-1} + h_m fm=fm1+hm,本质是利用负梯度拟合思想,使 l o s s loss loss损失函数沿着 f m − 1 f_{m-1} fm1的负梯度方向前进来最小化损失函数,这里的梯度,就是 l o s s loss loss损失函数关于自变量 f m − 1 f_{m-1} fm1的一阶导数。

而xgboosting,就是利用 l o s s loss loss关于 f m − 1 f_{m-1} fm1二阶导数信息来指导弱学习器 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=1nl(yi, fm1(xi)+hm)i=1n[l(yi, fm1(xi))+gihm(xi)+21hihm(xi)2] gi= fm1(xi) l(yi, fm1(xi))hi= fm1(xi)2 l2(yi, fm1(xi))
对于 i = 1 , 2 … n i=1,2…n i=1,2n,由牛顿法(即点 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, fm1(xi)+hm(xi))  gi+hihm(xi) gi+hihm(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

分裂结点算法

主要有两种算法;

  • Exact Greedy Algorithm
    对于每一维特征, 该算法针对此特征对样本集进行排序, 然后遍历每个样本在该特征上的取值并进行分裂, 计算出 Δ l o s s \Delta loss Δloss以确定最佳分裂特征和分裂点。
    DataWhale机器学习高级算法梳理Day3-XGBoosting_第1张图片
  • Approximate Algorithm
    当样本量太大,特征维数过多时,贪心算法就有很大的局限性,这时Approximate Algorithm从特征 k 中较为均匀地采样分裂点。有数据集 D k = { ( x i k ,   h i ) } , i = 1 , 2 … n D_k = \{(x_{ik},\ h_i) \}, i=1,2…n Dk={ (xik, hi)},i=1,2n,其中 x { x i k } x_{\{x_{ik}\}} x{ xik}为样本 x i x_i xi的第 k k k个特征值, h i h_i hi为样本 x i x_i xi对应的二阶导数值。
    DataWhale机器学习高级算法梳理Day3-XGBoosting_第2张图片
    寻找最佳分裂的算法流程为

输入数据 I I I:,当前节点的训练样本集,训练样本数为 n n n

输入数据 d d d:,特征向量维数

初始化分裂质量: s c o r e ← 0 score ← 0 score0

计算所有样本的一阶导数,二阶导数之和: G ← ∑ i ∈ I g i , H ← ∑ i ∈ I h i G←∑i∈I_{gi} ,H ←∑i∈I_{hi} GiIgi,HiIhi

循环,对 k = 1 , . . . , d k=1,...,d k=1,...,d

对所有训练样本按照第 k k k个特征升序排序

初始化左子集所有训练样本的一阶导数,二阶导数之和: G l ← 0 , H l = 0 G_l ←0,H_l =0 Gl0,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 GLGl+gi,HlHl+hj

计算右子集所有样本的一阶导数和二阶导数之和,可以根据总和,左子集的和快速

计算: G R ← G − G l , H R ← H − H l G_R ←G-G_l,H_R ←H-H_l GRGGl,HRHHl

计算分裂分数的最大值:
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 scoremax 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λw2
其中, γ \gamma γ λ \lambda λ是人为设定的系数, w w w为弱学习器(这里是决策树)所有叶子节点构成的向量, T T T为叶子节点的总数,正则项由叶子节点数,叶子节点值向量的模平方两项构成,第一项体现了决策树结构的复杂程度,第二项体现了决策树预测值的复杂程度。

XGBoost实现时还使用了权重收缩与列采样技术,以抵抗过拟合。权重收缩的做法是在每训练出一棵决策树之后将其权重进行缩放,乘上系数 η \eta η。权重收缩降低了之前的决策树的影响,为将来要生成的决策树留下了更多的空间。列采样的做法与随机森林相同,每次寻找最佳分裂时只考虑一部分随机抽取的特征分量。

对缺失值处理

xgboost处理缺失值的方法和其他树模型不同。xgboost把缺失值当做稀疏矩阵来对待,本身在节点分裂时不考虑缺失值的数值,但确定分裂的特征后,缺失值数据处理策略是落在哪个子结点得分高,就放到哪里。如果训练中没有数据缺失,预测时出现了数据缺失,那么默认被分类到右子树。

优缺点

见参考文章3

应用场景

分类问题,回归问题都可以

sklearn参数

参数 类型 默认值 作用
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 随机种子

你可能感兴趣的:(学习笔记,机器学习,python,XGBoosting,算法)