1. 首先要理解Boost和Gradient Boost。 前者是在算法开始时候,,为每一个样本赋上一个相等的权重值,也就是说,最开始的时候,大家都是一样重要的。在每一次训练中得到的模型,会使得数据点的估计有所差异,所以在每一步结束后,我们需要对权重值进行处理,而处理的方式就是通过增加错分类点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的基分类器(basic learner),最后将它们组合起来,可以对它们进行加权(错误率越大的基分类器权重值越小,错误率越小的基分类器权重值越大)、或者让它们进行投票等得到一个最终的模型。
Gradient Boost与传统的Boost有着很大的区别,它的每一次计算都是为了减少上一次的残差(residual),而为了减少这些残差,可以在残差减少的梯度(Gradient)方向上建立一个新模型。所以说,在Gradient Boost中,每个新模型的建立是为了使得先前模型残差往梯度方向减少,与传统的Boost算法对正确、错误的样本进行加权有着极大的区别。 它主要的思想是,每一次建立模型是在之前建立模型损失函数的梯度下降方向。损失函数(loss function)描述的是模型的不靠谱程度,损失函数越大,则说明模型越容易出错(其实这里有一个方差、偏差均衡的问题,但是这里假设损失函数越大,模型越容易出错)。如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度(Gradient)的方向上下降。
2. 要理解Gradient Boost有以下几个步骤,
首先,我们需要有训练集,损失函数和迭代次数。损失函数事实上是可以任意的,如果是平方损失函数,则对其求导就是残差。损失函数是可以任意的。如使用指数损失函数,则可以对错分样本放大来boost。
其次,初始化第一颗树后,我们需要计算损失函数在现有模型上的梯度方向,这个向量就是算法下面的,这个向量怎么计算呢,对于平方损失函数来说,其求导就是残差值,对其他损失函数,也可以根据求导函数求的
然后,根据这个梯度向量,以及 之前的样本点,组成一个训练集 ,根据这个训练集,训练一个较弱的分类器,这个分类器可以是tree,于是就成了GBRT,也可以是其他分类器,记做
再然后,我们需要知道在第m次迭代后这个新的基分类器在整个模型中的权重,为了找到最佳权重,将新的基分类器加入到原来的整个模型组合中,记做,为了获得h前的权重参数,利用 line search的方法,将其放入损失函数中,寻找最优的
最后,更新总体模型,至此一个循环结束
算法流程如下:
需要注意几点:
a. 每次迭代获得的base learner,可以是树也可以是其他分类器。 这个分类器前的权重,可以是针对一整颗树的,也可以针对那颗树的每个叶子节点的,如果是针对叶子节点的,则可以写成:,其中J是叶子节点个数
b. 叶子节点的数目限制了base learner的大小,一般建议每颗树的叶子节点在4-8 个内
c. 为了避免 过拟合的问题,通常会设置一个收敛参数 Shrinkage,这个参数在每次基分类器加入到整体模型时候起作用,简单的说,就是
d. 当GBRT用来解决分类问题的时候,其中的梯度向量事实上转变成了概率梯度向量,即各分类的概率梯度方向,算法可以更新如下,通常损失函数可以定义为负的log似然
3. GBRT的优缺点和参数
优点: 非线性变换比较多,表达能力强,而且不需要做复杂的特征工程和特征变换,防止过拟合
缺点:迭代树有时序性,并行化比较困难且效果不佳
参数主要有:
1. 树个数 (迭代次数 M)
2. 树深度
3. 缩放因子
4. 损失函数 (通常是平方损失函数)
5. 数据采样比
6. 特征采样比