所有你需要知道的关于梯度增强算法−第2部分。分类

以实例说明了算法、数学、和代码

图片作者

本文第1部分,我们学会了梯度提高回归算法的细节。当我们重新v在那篇文章时,该算法足够灵活,能够处理任何损失函数只要是可微的。这意味着如果我们只是更换损失函数用于回归,特别是均方损失,损失函数,处理分类问题,我们可以进行分类不改变算法本身。虽然基本算法是一样的,仍然有一些差异,我们想知道。在这篇文章中,我们将深入的所有细节的分类算法。

算法用一个例子

梯度提高整体方法的变体之一,你创建多个弱模型(它们通常是决策树),并将其组合在一起,获得更好的性能。在本节中,我们正在建设一个梯度提高分类模型使用非常简单的示例数据直观地了解它是如何工作的。

下图显示了示例数据。二进制类y(0,1)和两个功能x₁x₂

样本的分类问题由作者(图片)

我们的目标是建立一个梯度增加模型,将这两个类。第一步是使统一的预测概率类1(我们叫它p所有数据点)。最合理的统一的预测可能的值的比例1级的意思y

这是一个3 d表示的数据和初始预测。这时,预测只是一个平面的统一的价值p =意味着(y)y轴。

预测飞机由作者(图片)

在我们的数据中,的意思y是0.56。大于0.5,所有与这个初始预测分为1级。你们有些人可能会觉得这个统一的值预测没有意义,但别担心。我们将改善我们的预测,因为我们添加更多的弱模型。

改善我们的预测质量,我们可能需要关注残差(即预测误差)从我们最初的预测,我们想要尽量减少。残差被定义为rᵢ= yᵢ−p(代表了每个数据点的指数)。在下图中,残差的棕色线显示为每个数据点的垂直的直线预测飞机。

残差由作者(图片)

这些残差最小化,我们正在建立一个回归树模型x₁x₂它的特性和剩余工资r作为它的目标。如果我们能够建立一个树,发现之间的一些模式xr从最初的预测,我们可以减少残差p利用这些发现模式。

为了简化演示,我们正在建设非常简单的树,只有每个人都有一个分裂和两个终端节点叫做“树桩”。请注意,梯度增加树木通常有一个更深的树木等8 - 32的终端节点。

这里我们创建第一个树预测残差有两个不同的值r = {0.1, -0.6}

创建树由作者(图片)

你现在可能觉得我们想要添加这些预测值我们最初的预测p如果你已经读过减少其残差文章讨论回归算法,但事情与分类略有不同。(我们叫它的值γγ)我们增加初始预测在以下公式计算:

Σxᵢ∈Rⱼ意味着我们是聚合中的值σΣ在所有的样品xᵢ年代,属于终端节点Rⱼj代表每个终端节点的索引。您可能注意到,分数的分子是终端节点的剩余工资的总和j。我们将经历给我们这个公式的计算在下一节中,我们使用它来计算γ现在。下面是计算的值γ₁γ₂

γ不是简单的增加了我们的初始预测p相反,我们转换p成log-odds(我们将称之为log-odds转换值F (x)),然后添加γ到它。对于那些不熟悉log-odds,定义如下。你可能看到过以前逻辑回归

log-odds

一个调整的预测更新γ按比例缩小的学习速率ν范围在0和1之间,之前添加到log-odds-converted预测F (x)。这有助于模型不overfit训练数据。

在这个例子中,我们使用一个相对大的学习速率ν= 0.9使优化过程更容易理解,但它通常应该是更小的值,如0.1。

用变量的实际值的右边上面的方程,我们得到更新后的预测F₁(x)

如果我们把log-oddsF (x)回的预测概率p (x)(我们将讨论如何将在下一节中),它看起来像一个stair-like下面的对象。

更新预测飞机由作者(图片)

紫色的飞机是初始预测p₀更新为红色和黄色的飞机p₁

现在,更新后的残差r是这样的:

更新后的残差由作者(图片)

在下一步中,我们创建一个回归树再次使用相同的x₁x₂的特性和更新后的残差r作为它的目标。这是创建树:

创建树由作者(图片)

我们应用相同的公式来计算γ。计算γ更新后的预测F₂(x)如下。

如果我们把log-oddsF₂(x)回的预测概率p₂(x),它看起来像下面的东西。

更新预测飞机由作者(图片)

我们重复这些步骤,直到停止提高模型预测。下面的数字显示,从0到4迭代优化过程。

通过迭代预测更新由作者(图片)

你可以看到组合预测p (x)(红色和黄色飞机)是接近我们的目标y当我们添加更多的树木组合模型这就是梯度增加工作通过结合多个弱模型预测复杂的目标。

下图总结了算法的整个过程。

算法的流程由作者(图片)

数学

在本节中,我们正在学习更广义的算法通过观察它的数学细节。这是整个算法的数学公式。

来源:改编自维基百科弗里德曼的论文

让我们仔细看看它。

步骤1

第一步是创建一个初始常数的预测价值F₀l损失函数,我们使用的是吗日志丢失(或更一般的调用叉损失)。

日志丢失

yᵢ是我们的分类目标,它要么是0或1。p是1的预测概率类。你可能会看到l取不同的值取决于目标类yᵢ

作为−日志(x)的递减函数x,更好的预测(即增加pyᵢ= 1),我们会有较小的损失。

argmin意味着我们正在寻找价值γ(γ),最大限度地减少ΣL (yγ)。而更直接的假设γ预测的概率是p,我们假设γlog-odds作为它使所有下面的计算更容易。对于那些忘记log-odds定义,我们回顾在前面的小节中,它被定义为日志(优势)=日志(p / (1 - p))

能够解决的argminlog-odds方面的问题,我们将损失函数转换成log-odds的功能。

现在,我们可能需要替换p在上面的方程用log-odds来表示。通过改变log-odds表达式显示之前,p可以用log-odds:

然后,我们用这个值代替p在前面的l方程和简单。

现在我们已经找到了γ(请记住我们假设它是log-odds),最大限度地减少ΣL。我们正在采取的导数ΣLlog-odds。

在上面的方程中,我们包含log-odds取代了分数p为了简化方程。接下来,我们设置∂ΣL /∂日志(优势)等于0和解决它p

在这个二元分类问题,y要么是0或1。的均值y其实是1级的比例。现在,您可能会看到为什么我们使用p =意味着(y)我们最初的预测。

作为γlog-odds代替概率吗p,我们将它转化为log-odds。

步骤2

整个迭代步骤2处理2 - 1至2 - 4次了。表示树的数量我们创建和小代表每棵树的索引。

步骤2 - 1

我们正在计算残差rᵢ通过损失函数的导数对先前的预测F -₁和把它乘以−1。正如你所看到的下标索引,rᵢ计算每一个样品吗。你们中的一些人可能想知道为什么我们称之为rᵢ剩余工资。这个值是负梯度这给了我们方向(+ /−)和损失函数的大小可以最小化。不久你会看到为什么我们称之为剩余工资。顺便说一下,这个技术,你使用一个梯度来最小化损失模型非常类似于gradient血统技术通常用于优化神经网络。(事实上,他们从彼此略有不同。如果你有兴趣,请看看这篇文章详细介绍该主题)。

计算残差吧。F -₁在方程意味着从上一步预测。在这第一次迭代,它是F₀。在前面的步骤中,我们的导数l关于log-odds代替p因为我们的预测Flog-odds。下面我们使用llog-odds表达了我们前面的步骤。

在前面的步骤中,我们也得到了这个方程:

所以,我们可以替换第二个任期rᵢ方程p

现在,您可能会看到为什么我们称r剩余工资。这也为我们提供了有趣的见解,提供我们的负梯度方向和大小的损失最小化实际上是残差。

步骤2 - 2

j代表一个终端节点(即离开)在树上,表示树索引和资本J意味着叶子的总数。

步骤2 - 3

我们正在寻找γⱼ每个终端节点上,最小化损失函数jΣxᵢ∈RⱼL意味着我们是聚合所有的损失xᵢ年代,属于终端节点Rⱼ。让我们的插件的损失函数方程。

解决这个方程γⱼ将是非常困难的。使它更容易解决,我们正在逼近l通过使用二阶泰勒多项式。泰勒多项式是一种近似任何函数的多项式无限/有限数量的条件。虽然我们不考虑它的细节,你可以看看本教程这就解释了这个想法好如果你有兴趣。

这是近似的l使用二阶泰勒多项式:

我们是用这个近似代替l的方程γⱼ,然后找到的价值γⱼ这使得Σ的导数(*)等于零。

我们已经计算∂L /∂F在前面的步骤如下:

我们是用这个代替∂L /∂Fγ方程。

最后,我们得到了简化方程的价值γⱼ我们在前一节中使用。

步骤2 - 4

在最后一步,我们正在更新组合模型的预测Fγⱼ1 (x∈Rⱼ)意味着我们选择的价值γⱼ米如果一个给定的x落在一个终端节点Rⱼ。因为所有的终端节点是独家的,任何给定的单身x只属于一个终端节点和相应γⱼ添加到先前的预测吗F -₁然后它使更新后的预测F

如前一节中所述,ν是学习速率范围在0和1之间的控制程度的预测贡献额外的树γ合并后的预测F。一个较小的学习速率降低额外树预测的影响,但它也减少了模型过度拟合训练数据的机会。

现在我们已经完成整个步骤。为了得到最好的模型性能,我们要重复步骤2次,这意味着增加树木组合模型。在现实中,你可能经常想添加超过100棵树模型得到最好的性能。

如果你读我的文章回归算法的数学计算,你可能感觉比回归分类算法要复杂得多。而argmin和log-loss函数的导数计算复杂,强调数学算法在本节所示是完全相同的。实际上是优雅的梯度提升算法是完全相同的算法适用于任何损失函数只要是可微的。事实上,流行的梯度增加实现等XGBoostLightGBM有各种各样的损失函数,所以你可以选择任何损失函数,满足您的问题(见中可用的各种损失函数吗XGBoostLightGBM)。

代码

在本节中,我们把数学我们回顾了翻译成一个可行的python代码来帮助我们进一步理解算法。我们使用的是DecisionTreeRegressor从scikit-learn构建树帮助我们只关注梯度增强算法本身而不是树的算法。我们是模仿scikit-learn风格实现训练模型适合方法和作出预测预测方法。

请注意,所有的树木都存储在训练self.trees检索列表对象,当我们做出预测predict_proba方法。

接下来,我们检查CustomGradientBoostingClassifier执行一样GradientBoostingClassifier从scikit-learn通过观察log-loss我们的数据。

正如你所看到的在上面的输出中,两种模型log-loss完全相同。

推荐资源

在这篇文章中,我们回顾了梯度提高分类算法的所有细节。如果你也感兴趣的回归算法,请看本文第1部分。

也有一些其他伟大的资源,如果你想要更多细节的算法:

  • StatQuest,梯度增加Part3第4部分
    这些是YouTube视频解释了梯度提高分类算法的视觉系统。
  • 特伦斯帕尔和杰里米·霍华德,如何解释梯度增加
    而本文主要关注梯度提高回归,而不是分类,它很好地解释了每一个细节的算法。
  • 杰罗姆•弗里德曼贪婪的函数近似:梯度增加机器
    这是弗里德曼的原始论文。虽然有点难以理解,它无疑显示了算法的灵活性,他展示了一个通用的算法,可以处理任何类型的问题有一个可微的损失函数。

你也可以看看完整的Python代码在Github谷歌Colab链接或链接。

引用

Baidu
map