一.主要目的
虽然大多数Kaggle竞赛获胜者使用各种模型的叠加/聚合,但一个特定的模式是大多数聚合部分是梯度提升(GBM)算法的一些变体。以最近一次卡格尔比赛的获胜者为例:迈克尔·贾勒的解决方案是安全驾驶预测中的表征学习。他的解决方案是六种模式的混合。1个light GBM(GBM的变体)和5个神经网络。虽然他的成功归功于他对结构化数据的新的半监督学习,梯度提升模型也发挥了作用。
虽然GBM被广泛使用,但许多从业者仍然将其视为一个复杂的黑盒算法,只使用预先构建的库运行模型。本文的目的是简化所谓的复杂算法,帮助读者直观地理解算法。我将解释梯度提升算法的基本版本,并在最后分享其不同变体的链接。我从fast.ai库(fastai/courses/ml1/第3课-RF _ foundations.ipynb)获得了基本的决策树代码,最重要的是,我建立了自己的简单版本的基本梯度提升模型。
合奏、装袋和助推简述
当我们试图使用任何机器学习技术来预测目标变量时,实际值和预测值之间的主要差异是噪声、方差和偏差。整合有助于减少这些因素。
集合只是一组聚集在一起(例如,所有预测的平均值)进行最终预测的预测器。我们使用积分的原因是,许多不同的预测者试图比任何单一的预测者更好地预测同一个目标变量。集成技术进一步分为打包和提升。
打包是一种简单的集成技术。我们建立了许多独立的预测变量/模型/学习者,并使用一些模型平均技术来组合它们。(例如加权平均数、多数票或正常平均数)。
我们通常对每个模型使用随机二次抽样/自举数据,所以所有模型之间几乎没有区别。每个观测值在所有模型中都有相同的概率。因为这种技术需要许多不相关的学习者来制作最终模型,所以通过减少方差来减少错误。Bagging集成的一个例子是随机森林模型。
Boosting是一种集成技术,其中变量不是独立的,而是按顺序的。
这种技术使用了后预测变量从前预测变量的误差中学习的逻辑。因此,观测值出现在后续模型中的概率是不同的,误差最大的出现频率最高。预测变量可以从一系列模型中选择,如决策树、回归量、分类器等。因为新的预测变量是从以前的预测变量所犯的错误中学习出来的,所以接近实际预测所需的时间/次数更少。但一定要慎重选择停机判据,否则可能导致训练数据的过拟合。梯度提升是Boosting算法的一个例子。
图1。整合
图2。装袋和助推。
参考:https://quant dare . com/什么是打包和提升之间的区别/
二、梯度提升算法
在维基百科的定义中,梯度提升是一种用于回归和分类问题的机器学习技术,它以一组弱预测模型(通常是决策树)的形式生成预测模型。
任何监督学习算法的目标都是定义一个损失函数并使其最小化。我们来看看梯度提升算法的数学运算。假设我们将均方根误差定义为:
我们希望我们的预测将最小化我们的损失函数(MSE)。通过使用梯度下降和基于学习率更新我们的预测,我们可以找到最小均方误差。
所以我们基本上是更新预测,让我们的残差之和接近于0(或最小值),预测值足够接近实际值。
第三,梯度改善背后的直觉
梯度提升背后的逻辑很简单(不用数学符号也能直观理解)。希望看过这篇文章的人都熟悉简单线性回归模型。
线性回归的一个基本假设是残差之和为0,即残差应该随机分布在0左右。
图3。抽样随机正态分布的残差均值接近于0
现在,这些残差被认为是我们的预测模型所犯的错误。虽然基于树的模型(以决策树作为我们梯度提升的基本模型)并不是基于这个假设,但是如果我们从逻辑上(而不是统计上)考虑这个假设,那么我们可能会证明,如果我们可以看到一些残差在0左右的模式,我们可以用这个模式来拟合模型。
所以梯度提升算法的直觉是反复使用残差模型来加强预测能力弱的模型,使其变得更好。一旦到了残差没有模型可以建模的阶段,就可以停止对残差建模(否则可能会导致过拟合)。从算术上来说,我们正在最小化我们的损失函数,以最小化测试损失。
总结一下,
我们首先使用一个简单的模型来建模数据,并分析错误的数据。
这些误差很难用简单的模型来表示数据点。
然后,对于未来的模型,我们特别注意那些困难的数据,使它们正确。
最后,我们通过给每个预测变量赋予一些权重来组合所有的预测变量。
关于同样的逻辑,更技术性的参考是写在《概率正确:自然在复杂世界中学习和繁荣的算法》一书中的。“想法是多次使用弱学习方法获得连续的假设,而每一个调整的例子都是之前发现困难和错误分类的。但是,请注意,这一点并不明显。
第四,拟合梯度提升模型的步骤
让我们想想下面散点图中显示的模拟数据,其中1个输入(x)和1个输出(y)变量。
图4。模拟数据(x:输入,y:输出)
上面显示的图表数据是使用以下python代码生成的:
1.对数据进行简单的线性回归或决策树(我在代码中选择了决策树)[将x作为输入,将y作为输出]
2.计算误差残差。实际目标值减去预测目标值[E1 = y _ predicted D1-y]
3.将误差残差的新模型作为具有相同输入变量的目标变量[称为e1_predicted]
4.将预测残差加到以前的预测中[y _ predicted 2 = y _ predicted 1+E1 _ predicted]
5.在残差上拟合另一个模型。也就是说,[E2 = y-y _ predicted D2]并重复步骤2至5,直到开始过拟合或残差之和变得恒定。通过持续检查验证数据的准确性,可以控制过度拟合。
为了帮助理解基本概念,下面是一个从零开始完成简单梯度提升模型的链接。[链接:梯度推广从零开始]
共享代码是非优化梯度提升的常见实现。库中的大部分梯度提升模型都得到了很好的优化,并且有很多超参数。
不及物动词工作梯度提升树的可视化
蓝点(左)是输入(x)和输出(y)的关系。红线(左)显示决策树预测的值。绿点(右)显示第I次迭代的剩余误差和输入(x)次迭代的序列。
图5。梯度提升预测的可视化(前4次迭代)
图6。梯度提升预测的可视化(第18次至第20次迭代)
我们观察到第20次迭代后,残差随机分布在0左右(我不是说随机正态分布),我们的预测非常接近真实值。(迭代在sklearn实现中称为n _ estimators)。这将是停止或开始过度拟合模型的一个好点。
让我们看看我们的模型在第50次迭代中是什么样子的。
我们可以看到,即使在第50次迭代后,残差对x的曲线看起来与我们在第20次迭代中看到的相似。然而,模型变得越来越复杂,预测过多的训练数据并试图学习每个训练数据。因此,最好在第20次迭代时停止。
绘制上述所有数据的Python代码片段:
#预测后绘图xa = NP . array(x . x)# x的列名为x order = NP . arg sort(xa)xs = NP . array(xa)[order]ys = NP . array(predf)[order]# epreds = NP . array(epred[:,None])[order] f,(ax1,ax2) = plt .子图(1,2,sharey=True,figsize = (13,2.5)) ax1 .绘图(x,y,' o') ax1
1.《boosting 干货|从零开始学习Gradient Boosting算法》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《boosting 干货|从零开始学习Gradient Boosting算法》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1255843.html