第8.14节 GradientBoost原理与实现
各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。
本期推送内容目录如下,如果本期内容对你有所帮助,欢迎点赞、转发支持掌柜!
8.14 GradientBoost原理与实现 8.14.1 算法思想 8.14.2 算法原理 8.14.3 梯度提升回归 8.14.4 梯度提升分类 8.14.5 使用示例 8.15.6从零实现梯度提升回归 8.15.7 从零实现梯度提升分类 8.15.8 小结 引用
8.14 GradientBoost原理与实现
在前面两节内容中,笔者分别详细介绍了AdaBoost算法和基于AdaBoost改进的SAMME算法的基本原理和实现过程。在接下来的这节内容中,笔者将会介绍另外一种基于Boost策略的算法模型梯度提升(Gradient Boosting, GB)算法。从名字可以看出梯度提升算法有两个关键的地方:梯度和提升。提升表明整个集成模型依旧是串行地进行,且后一个模型是用来对前一个模型的输出结果进行修正;梯度则表明后一个模型在对前一个模型的结果进行修正时是以梯度下降为策略进行优化。
8.14.1 算法思想
Gradient Boosting是Friedman等人[1]于2001年所提出的一种基于梯度下降策略来对模型进行优化的算法,其核心思想是先通过设定一个目标函数,然后再通过梯度下降算法来对预测结果进行优化。梯度提升算法的整体结构类似于之前介绍的线性回归和逻辑回归的求解流程只但是在具体细节部分有着不同的处理方式。
在AdaBoost算法中,通过赋予每个样本一个权重值,并且在上一个模型中误差越大的样本(分类问题中即被错分的样本)在下一个模型中将会被给予更高的权重,然后对于每个基模型来说其都有不同的策略来降低高权重样本的误差,以此来提高整个集成模型的预测精度,即在AdaBoost算法中它是通过赋予样本权重来提升模型的精度。对于梯度提升算法来说,它则是通过梯度来提升整个模型的预测精度。
如式(8.136)所示,便是梯度下降算法的核心公式
其中表示待更新的参数对象,表示关于参数的目标函数,表示学习率。更多关于梯度下降算法的详细介绍可以参见第2.5节内容。
通过式(8.136)可知,对于参数来说,我们可以根据其梯度的方向来一步一步迭代计算得到(接近)其最优解。现在假定某个模型的预测输出为,预测值与真实值之间的损失误差为,那么为了提高模型的预测结果,我们同样可以采用梯度下降算法来对预测结果进行迭代更新,即
而式(8.137)便是梯度提升算法的核心思想。
从式(8.137)可以看出,在梯度提升算法中最重要的便是求得目标函数关于模型的梯度,而这通常会通过训练一系列额外的模型来对梯度进行预测,具体可见后续代码实现部分。
8.14.2 算法原理
在介绍完梯度提升算法的思想后我们再来看它背后的具体原理。假如现在笔者需要训练一个回归模型,数据样本对应的标签值为,第次提升后模型的预测输出为,预测值与真实值之间的损失为,则对于梯度提升算法来说可通过如下步骤求得模型:
第一步:初始化学习率以及并根据数据集训练得到模型,
第二步:计算得到损失函数关于的梯度,并根据如下公式对模型进行更新
第三步:判断是否成立,成立则结束迭代,否则,并进入第二步。
以上便是梯度提升算法整个流程的核心步骤,下面分别来看它在回归和分类模型中的详细计算示例。
8.14.3 梯度提升回归
例如现在某数据集一共5个样本,,模型的预测输出为,,且采用均方误差作为损失函数,即
由式(8.139)可知,损失函数关于的梯度为
假定模型的预测结果为,则采用梯度提升算法进行第1次提升后的结果为
同理可得,第2、3次提升后的结果对应的预测结果分别为
上述计算过程代码见BooKCode/Chapter08/C23_example_gradient_boost_reg.py
文件。
8.14.4 梯度提升分类
在介绍完梯度提升中的回归计算示例后相信大家对梯度提升算法已经有了一定的认识。不过在分类场景中,应该如何利用梯度下降来对模型的预测结果进行优化提升呢?一个可行的办法便是对每个类别下的预测概率进行梯度提升。
例如现在某三分类数据集一共5个样本,标签分别为,模型的预测输出为,,且采用多项式误差(Multinomial Deviance)作为损失函数,即对于任意一个样本来说其在的次提升后对应的损失为
其中,表示指示函数;表示样本对应的真实标签,是一个标量;表示样本在第次提升后预测结果的概率分布;表示样本在第次提升后在类别中的预测概率值,即。
注:也可采用其它损失函数,这里为了和sklearn进行对比所以选择了和它一样的损失函数。
由式(8.143)可知,损失函数关于样本在第个类别下的预测概率的梯度为
假定随机初始化模型的结果为
则此种情况下,根据式(8.143)可知整体损失值为
根据式(8.144)可知所有样本在第0个类别下的梯度为
进一步,根据式(8.138)可得,对于所有样本来说第0个类别下更新后的预测概率为
同理,可以计算得到所有样本在第1次提升后的预测概率为
此时,根据式(8.149)可得,在第1次提升后的预测标签为[2,1,2,0,0]
,且损失值为0.816。
可以发现,在第一次提升结束后就已经得到了正确的预测结果。不过继续迭代下去会得到更高的预测概率和更低的损失值,后两次提升结束后的损失值分别为0.6112和0.4732,各位读者可以手动计算验证一下。
上述计算过程代码见Book/Chapter08/C24_example_gradient_boost_cla.py
文件。
为你认可的知识付费,欢迎订阅本专栏阅读更多优质内容!
8.14.5 使用示例
在明白梯度提升算法的基本思想和原理后我们再来看如何在sklearn中使用它。首先,需要知道的是梯度提升算法本质上也只是一种模型的训练策略,因此对于弱学习器的选择是任意。