机器学习----Xgboost与GBDT

GBDT

1、首先理解一下Gradient boosting(GB)

机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm(x)的效果生成的,关系如下:

1 m M F m + 1 ( x ) = F m ( x ) + h ( x )

GB算法的思想很简单,关键是怎么生成 h ( x ) ?

              如果目标函数是回归问题的均方误差,很容易想到最理想的h(x)应该是能够完全拟合 y F m ( x ) ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题 1 2 ( y F ( x ) ) 2 残差和负梯度也是相同的。 L ( y , f ) 中的f,不要理解为传统意义上的函数,而是一个函数向量 f ( x 1 ) , , f ( x n ) ,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为“伪残差”。

GB算法的步骤:

              1.初始化模型为常数值:
    

F 0 ( x ) = arg min γ i = 1 n L ( y i , γ ) .

              2.迭代生成M个基学习器
                            1.计算伪残差
      
r i m = [ L ( y i , F ( x i ) ) F ( x i ) ] F ( x ) = F m 1 ( x ) for  i = 1 , , n .

                            2.基于 { ( x i , r i m ) } i = 1 n 生成基学习器 h m ( x )
                            3.计算最优的 γ m
      
γ m = a r g m i n γ i = 1 n L ( y i , F m 1 ( x i ) + γ h m ( x i ) ) .

                            4.更新模型
      
F m ( x ) = F m 1 ( x ) + γ m h m ( x ) .

2、GBDT

                GB算法中最典型的基学习器是决策树,尤其是CART,正如名字的含义,GBDT是GB和DT的结合。要注意的是这里的决策树是回归树,GBDT中的决策树是个弱模型,深度较小一般不会超过5,叶子节点的数量也不会超过10,对于生成的每棵决策树乘上比较小的缩减系数(学习率<0.1),有些GBDT的实现加入了随机抽样(subsample 0.5<=f <=0.8)提高模型的泛化能力。通过交叉验证的方法选择最优的参数。因此GBDT实际的核心问题变成怎么基于 { ( x i , r i m ) } i = 1 n 使用CART回归树生成 h m ( x )

                CART分类树在很多书籍和资料中介绍比较多,但是再次强调GDBT中使用的是回归树。作为对比,先说分类树,我们知道CART是二叉树,CART分类树在每次分枝时,是穷举每一个feature的每一个阈值,根据GINI系数找到使不纯性降低最大的的feature以及其阀值,然后按照feature<=阈值,和feature>阈值分成的两个分枝,每个分支包含符合分支条件的样本。用同样方法继续分枝直到该分支下的所有样本都属于统一类别,或达到预设的终止条件,若最终叶子节点中的类别不唯一,则以多数人的类别作为该叶子节点的性别。回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是GINI系数,而是最小化均方差--即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和 除以 N。这很好理解,被预测出错的人数越多,错的越离谱,均方差就越大,通过最小化均方差能够找到最靠谱的分枝依据。分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

Xgboost

1、理解

•回归树(也称为分类和回归树):
与决策树相同的决策规则
每个叶子值包含一个分数
这里写图片描述

•使用非常广泛,寻找GBM,随机森林……
•几乎一半的数据挖掘竞争都是通过使用一些来赢得的树集合方法的变体
•不变缩放输入,因此您不需要小心功能正常化。
•了解功能之间的高阶交互。
•可以扩展,并在工业中使用

•模型:假设我们有K树
想一想:回归树是一个将属性映射到分数的函数
● 参数
● 包括每棵树的结构,以及叶子中的分数或者只是使用函数作为参数
● 相反学习权重,我们正在学习函数(树)

•回归树集合定义了如何制作
预测分数,它可以用于
分类,回归,排名……
公式为:

y i ^ = j w j x x j

•这一切都取决于您如何定义目标函数!
•到目前为止我们已经了解到:
使用平方损失:
l ( y i , y ^ i ) = ( y i y ^ i ) 2

会导致普通梯度增强机器
使用物流损失:
l ( y i , y ^ i ) = y i l n ( 1 + e y i ^ + ( 1 y i ) l n ( 1 + e y i ^ )

如何最优函数,即下面这个式子最小:

F ( x ) = a r g m i n E x , y [ L ( y , F ( x ) ) ]

集成算法的表示:
y ^ = k = 1 K f k ( x i ) , f k F

这里写图片描述
我们通过叶子中的分数向量和叶子索引来定义树,将实例映射到叶子的映射函数

f t ( x ) = w q ( x ) , w R T , q : R d 1 , 2 , 3 , 4... T

                    这里写图片描述
将复杂性定义为(这不是唯一可能的定义)

Ω ( f t ) = γ T + 1 2 λ j = 1 T w j 2

γ是叶子的个数,后面用的是L2平方正则。
这里写图片描述

2、算法

这里写图片描述

  xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。

xgboost与gdbt除了上述三点的不同,xgboost在实现时还做了许多优化:

              在寻找最佳分割点时,考虑传统的枚举每个特征的所有可能分割点的贪心法效率太低,xgboost实现了一种近似的算法。大致的思想是根据百分位法列举几个可能成为分割点的候选者,然后从候选者中根据上面求分割点的公式计算找出最佳的分割点。

              xgboost考虑了训练数据为稀疏值的情况,可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率,paper提到50倍

              特征列排序后以块的形式存储在内存中,在迭代中可以重复使用;虽然boosting算法迭代必须串行,但是在处理每个特征列时可以做到并行

              按照特征列方式存储能优化寻找最佳的分割点,但是当以行计算梯度数据时会导致内存的不连续访问,严重时会导致cache miss,降低算法效率。paper中提到,可先将数据收集到线程内部的buffer,然后再计算,提高算法的效率。

              xgboost 还考虑了当数据量比较大,内存不够时怎么有效的使用磁盘,主要是结合多线程、数据压缩、分片的方法,尽可能的提高算法的效率。

猜你喜欢

转载自blog.csdn.net/Sakura55/article/details/81036622