TowardsDataScience 博客中文翻译 2021(一百三十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

全卷积网络中的反向传播

原文:https://towardsdatascience.com/backpropagation-in-fully-convolutional-networks-fcns-1a13b75fb56a?source=collection_archive---------6-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UnsplashNeONBRAND 拍摄的照片

反向传播是神经网络训练中最重要的阶段之一。作为一个目标,它决定了神经网络的知识被理解为对未来冲动做出正确反应的能力。术语“知识”和“适当地”必须考虑两个方面:(I)第一方面由经验给出,或者更好地说,由网络学习从数据集的样本中提取的信息(特征)给出(ii)第二方面由误差计算或也称为*损失给出。*在监督学习中,每个样本都标有类别(分类)、一个或多个值(回归)或两者都有。设 y_actual 为主管分配给样本的标签, y_pred 为网络预测,反向传播阶段将确保两者之间的距离(误差)是可接受的。误差和特征都有与之相关的权重,当在反向传播过程中被修改时,就构成了网络的学习知识。

在离开之前,我想再补充几点。反向传播有两个阶段。第一个是计算梯度,或者更好地说,损失函数对每个网络权重的导数。第二是它们的更新( delta 规则)。最后一个可以用各种优化算法来执行,例如 Momentum、Adam 等。在本文中,我将只关注第一个阶段,而将第二个阶段的深化留给后续阶段。此外,我没有发现太多的证据证明反向传播适用于卷积网络,每一个计算和解释都是个人研究的结果。如果有错误或误解,我很乐意讨论。谢谢你和良好的阅读。

符号

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.核和卷积

我们可能会问的一个问题是,为什么使用卷积神经网络而不是 MLPs 来分析图像?让我们举一些例子。图像是以矩阵形式排列的一系列数值(像素亮度)。为了使用 MLPs,我们应该将矩阵转换成向量,并将其呈现给网络的输入层。在这方面,我们考虑大小为(224,224,3)的图像 X,其中 224 表示高度和宽度,而 3 是色标红、绿、蓝中的深度。通过变换,我们得到一个大小为(150,528,1)的向量,如图 4 所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:输入图像 x 的多层感知器(MLPs)的表示。(图片来源链接,经作者许可编辑)

这种方法主要有两个错误。首先是图像是空间有序的数据。更清楚地说,像素排列形成矩阵的顺序为特征提取提供了很大的帮助。所以这是我们不能丢失的信息。第二是使用 MLPs 的参数数量非常高。以我们的例子为例,仅输入层就有 150,528 个神经元。考虑到第二层中的 100,000 个神经元,我们的网络仅在第一层和第二层之间就有 150,528×100,000 = 15,052,800,000 个参数,让我们设想考虑整个网络。(注意:参数数量增加越多,训练需要的时间就越多,找到最优的就越困难,模型在记忆方面的权重就越大 )

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:维度(4,4,1)的图像 X 和维度(2,2)的核 W 之间的卷积,步长 S = [1,1]。输出特征图由 Z 表示,并且具有维度(2,2)(来源:我的图像)

内核的引入解决了这些问题。内核 W 是通常尺寸为 2×2、3×3 或 5×5 的正方形矩阵,其沿着图像 X 的宽度 M 和高度 N 行进一定的步幅 S,在内核和重叠区域的值 w ( 权重)之间执行加权求和。这种操作称为卷积,考虑了像素的空间顺序,并允许与图像的像素共享权重**,减少了参数的数量。卷积的一个例子如图 5 所示。输出 Z 是一个特征图或者更确切地说是一个新图像,其中 X 的特定特征被强调。假设内核 W 突出显示边缘,卷积运算产生如下特征图:**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:强调 X 图像边缘的卷积运算。因子 1/16 被引入以减少特征图中的噪声。(图片来源链接,经作者允许编辑)

可以看出,在图 5 和图 6 中,Z 不具有与起始图像相同的尺寸。这个效果叫做跨步下采样。假设尺寸是 X: (Mx,Nx)W:(Mw,Nw)和步距 S,特征图 Z: (Mz,Nz)的尺寸计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(1)

2.前馈

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7:具有两个卷积层的卷积神经网络的表示(来源:Image by me)

让我们考虑一个具有两个卷积层的网络,这两个卷积层都具有大小为 2x2 的核 W 和沿高度和宽度的步长 1,并且在输出层中有两个神经元。作为激活函数,我们不特别选择一个,一般用 g 表示。网络的输入是大小为 4x4x1 的灰度图像(单通道)图 7

让我们检查一下正向阶段。在开始最后一个音符之前。为了构建计算图,对于特征图的每个像素,记住在卷积操作期间使用了哪些像素是很重要的。我们需要的是将保存在集合 p 中的位置**

  • 卷积输入 X 和第 1 层

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片来源:图片由我提供)

  • 卷积输出第 1 层和第 2 层

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片来源:图片由我提供)

  • 全连接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片来源:图片由我提供)

3.计算图形

我们在计算图(图 8)中对在正向阶段获得的信息进行分组。这是我们的卷积神经网络的表示,其中每个节点对应一个向前的步骤。具体来说,我们可以看到每个卷积节点 z 将索引为 p 的节点作为输入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8:图 7 中网络的计算图表示(来源:图片由我提供)

4.B ackpropagation

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(2)

让我们考虑 l 作为损失函数,计算图形允许你容易地定义梯度向量∇wL.这将被增量规则用来更新网络权重。公式(2)表示图 7 中网络的梯度向量。它包括三个分量,也是向量,关于第 3 层的权重以及分别关于第 2 层和第 1 层的核。下面,我用链规则来分析它们每一个偏导数演算。

  • ∂L /∂W^(3)微积分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(3)

公式(3)是权重 W 层 3 的梯度向量。必须求解单个依赖关系[附录 1.1]才能计算其元素。作为示例,对重量 w1 层 3 的损失导数的计算如公式(4)所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(4)

用 F ( 完全用表示)向量公式(3)的每个元素 n 的最后一层神经元的数量,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(5)

  • /∂w^(2l)微积分**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(6)

公式(6)是矩阵 W 层 2 的梯度向量。为了计算它的元素,有必要首先求解由于层 3 的梯度而引起的单个相关性,然后求解每个神经元 f. 的多个相关性【附录 1.2】参见图 8, 我们可以看到:( I)由于卷积的共享权重特性,第 2 层中的每个权重 w 存在于不同的和 zi ^(2 中;( ii)每个神经元 f 连接到第 2 层中的每个激活输出,用于完全连接(,因为它是完全连接的层*)。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9:计算每个第 3 层 zf 节点的下游梯度(来源:图片由 me 提供)

作为例子,我们考虑关于层 2 中的权重 w1 的梯度计算。为了便于讨论,对于第 2 层的每个激活节点,我们计算通过对各个第 3 层节点 zf下游梯度*【附录 2】求和而获得的上游梯度。图 9 示出了下游的计算,然后对每一对求和,以形成公式(10)中每个激活的正式上游。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(10)

此时,层 2 中相对于 w1 的损耗梯度将由公式(11)给出,其中每个 ∂L /∂ai 上游梯度乘以各自 aizi 节点的导数。此后,在上述步骤(I)中,对每个贡献进行求和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(11)

从我们已经看到的和概括的开始,对于层 2 中的每个节点 ai ,上游梯度将由公式(12)给出。后者是公式(5 ),其中我们导出激活 ai 而不是导出权重 wzf 层 3,然后将贡献相加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(12)

相反,对于向量公式(6)的每个元素 n ,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(13)

为了完整性,结合公式(12)和(13)我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • ∂/∂w^(1微积分**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(14)

公式(14)是矩阵 W 层 1 的梯度向量。与前面的情况相比,对于偏导数的计算,有必要根据完全连接和卷积层来求解多个相关性的不同步骤。查看图 8,可以看到(I)w^(1 的每个权重存在于层 1 的不同 zj 加权和中(共享权重)。

作为一个例子,我们考虑权重 w1 层 1 的梯度的计算。同样,对于第 1 层中的每个激活节点 aj ,我们计算公式(15)中形式化的上游梯度*。为了计算它,我们使用我们已经有的信息。特别是,一旦我们获得 ∂L /∂zi ^(2 】,公式(10)中的上游梯度将允许我们计算单个下游图 10*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10:计算每个节点 zi 层 2 的下游梯度(来源:me 提供的图像)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(15)

在这一点上,到 w1 层 1 的损耗梯度将由公式(16)给出,其中在公式(15)中形式化的 ∂L /∂aj 上游梯度中的每一个乘以各自激活节点 ajzj 的导数。此后,对上述点(I)的每个贡献进行求和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(16)

从我们所看到的和概括的开始,对于第 1 层中的每个节点 aj ,上游梯度将由公式(13)给出,其中,代替将第 2 层的 zi 导出到权重 w ,我们将其导出到第 1 层的 aj :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(17)

相反,对于向量公式(14)的每个元素 n,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(18)

为了完整性,结合公式(12)、(17)和(18),我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.结论

在本文中,我们探讨了反向传播阶段,重点分析了图 7 中虚拟网络的计算图。一般来说,要计算第 l 个卷积层的梯度向量,有必要:

  • 为了计算来自层 l 的每个激活输出的上游梯度
  • 对层 l 中 z 相对于 w 的导数的贡献求和(由于共享权重)

现代网络要复杂得多。不同之处可能在于每个要素贴图块的通道数量(将多个要素贴图一个接一个地想象为立方体,每个都是一个通道),从而增加了内核 W 的深度,或者我们可以为每个层使用多个内核,或者我们可以使用批量归一化层,然后在此处应用反向传播,或者为每个层使用一个偏差项,并考虑该项的反向传播。所以本文中的例子是一个简单的,但有希望解释反向传播的例子。

附录

在图 11 / 12 / 13 中,以节点 z 为例进行了分析,同样的考虑也适用于任何其他功能。

  1. 链式法则

链式法则是计算复合函数导数的求导法则[1]。

1.1 单一依赖

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(19)

a(t)t 中的可微函数 z(a(t))a 中的可微函数。 z 相对于 t 的导数由公式(19)描述。分析用于计算导数的计算图,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11:复合函数 z(a(t))的导数的表示

1.2 多重依赖

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公式(20)

a1(t)a2(t) 为 t 中的可微函数 z(a1(t),a2(t))a1a2 中的可微函数。 zt 的导数由公式(20)描述。分析用于计算导数的计算图,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12:复合函数 z(a1(t),a2(t))的导数的表示

2.渐变【2】

*设 *a1(。)*和 a2(。) be 两个函数和 *z(a1(。),a2(。))a1a2 中的一个可微函数。我们定义:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 13:单个节点上不同渐变形状的表示

  • ***上游梯度:*节点 z 反向传播时接收的梯度
  • ***局部梯度:*相对于节点 z 的输入计算的梯度
  • ***下游梯度:*上游梯度和局部梯度之间的乘积(链式法则)

参考

[1] 链式法则—维基百科

[2] 第五讲斯坦福在线 pg。54

更多资源

  1. jefkine kafuna,卷积神经网络中的反向传播

神经网络中的反向传播

原文:https://towardsdatascience.com/backpropagation-in-neural-networks-6561e1268da8?source=collection_archive---------5-----------------------

从零开始的神经网络,包括数学和 python 代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 JJ 英Unsplash

介绍

你曾经使用过神经网络,并想知道它背后的数学是如何工作的吗?在这篇博文中,我们将从头开始推导前向和后向传播,从中编写一个神经网络 python 代码,并学习线性代数和多元微积分的一些概念。

我将从解释一些线性代数基础开始。如果你对这个足够精通,你可以跳过下一部分。

向量和矩阵

简单的数字(标量)用小写字母书写。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

向量用粗体字母表示,默认情况下它们是列向量。

行向量的名称也用粗体表示,但是用大写字母 T 表示转置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

autor 提供的图像

矩阵用粗体大写字母表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

autor 提供的图像

当转置一个矩阵时,我们交换行和列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

矩阵或向量的维数是:

(行数、列数)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

点积⋅

当两个向量或矩阵乘以点积时,左边向量或矩阵的列数必须与右边向量或矩阵的行数相匹配。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

结果的维数可以计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

该乘法中的“内部”维度必须匹配,并在输出维度中消失。

元素态乘积(Hadamard 乘积)

当使用元素乘积将两个向量或矩阵相乘时,它们必须具有相同的维数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

矩阵计算

我们还需要向量和矩阵的微积分。我们使用雅可比矩阵的概念。雅可比就是一个向量或导数矩阵。

标量值函数相对于矢量 𝑥 的导数定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们用输出向量 𝑓 定义一个函数对单个变量 x 的导数,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

具有输出向量和输入变量向量的函数的导数定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

向量链规则

矢量链规则看起来非常类似于标量链规则。在这个例子中,向量 𝑓 是向量 𝑔 的函数,向量 𝑔 本身是向量 𝑥 的函数。所以𝑓(𝑔(𝑥))相对于 𝑥 的导数计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

单输入向量神经元

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

𝑥 :是进入神经元的输入样本。在上图中,它有 3 个特征。例如,这可以是一个人的身高(1.75 米)、体重(80 公斤)和年龄(30 岁)。注意,我们一次只输入一个样本(在我们的例子中是一个人)到神经元中。

𝑎:被称为激活,它是神经元的输出。它是神经元根据一个输入样本做出的预测。我们可以选择我们的神经元应该预测什么。在我们人类的例子中,一个有用的预测可能是身体质量指数。

𝑤 :神经元的权重。它对向量 𝑥 的每个输入特征有单独的权重。

𝑏: 神经元的偏差。一个神经元只有一种偏向。

𝑦:是网络输出的真实值或目标值。我们希望𝑎尽可能靠近𝑦。因此,我们在训练阶段改变权重 𝑤 和偏差𝑏。

𝐿:被称为损失。𝑎离𝑦越近,损失越小,因此越好。因此,我们想尽量减少损失。最小化神经网络中损失的最常见方法是梯度下降。在这篇博文中,我将使用“均方误差”损失。

梯度下降

在训练期间 w 以下列方式更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

其中 w 是新更新的权重向量,𝜆是学习率。𝜆是一个超参数,可以自由选择。通常在 0.05 左右。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

∇𝐿( w 是损失相对于权重的梯度。它只是损失𝐿的导数相对于权重的转置。一般来说,函数对某些变量的梯度总是相应导数的转置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

𝑏是新的更新的偏见。∇𝐿(𝑏)是损耗相对于权重的梯度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在这种情况下,梯度是导数的转置并不重要,因为它是一个单一的数,转置一个单一的数不会改变它。

计算渐变

应用向量链规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

重量的导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

𝑥 不依赖于 w ,因此它被视为常数,导数必须仅针对w

关于偏差的导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

梯度下降

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

代码

作者代码

测试我们神经元的代码:

作者代码

然后,我们用虚拟数据集测试我们的数据,看看它是否有效。每个样本有 3 个特征。如果第一个特征是 1,则期望的输出是 1。其他两个特征对结果并不重要。因此,我们希望第一个权重变为 1,而其他权重和偏差将变为 0。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示训练过程中权重、偏差和损失变化的图表(图片由作者提供)

我们对训练过的网络在训练中从未见过的样本进行测试,以了解它对未见过的数据的推广情况。

Test: 
predicted y: 0.9992918862001037, true y: 1

测试样本的输出显示,我们非常接近真实值。

能够同时对多个样本进行训练

前进传球

每个数据点的大小为 3:

我们有数据点𝑥1,𝑥2,…

圆点表示我们可以输入神经元的数据点(𝑚)的数量是可变的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

为了获得输入矩阵,我们垂直堆叠输入向量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们必须按如下方式调整损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

其中𝑚是我们使用的数据点数。

**𝑎,**激活向量然后以如下方式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

偶数道次

应用向量链规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

计算导数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

关于重量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

关于偏差:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

梯度下降

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

密码

作者代码

随机梯度下降

随机梯度下降意味着,我们同时对所有训练样本进行训练。

我们可以看到权重、偏差和损失的相同演变,就像在具有单一输入的神经元中一样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以在下面看到,预测的输出非常接近真实的 y:

Test: 
predicted y: 0.9999991060923578, true y: 1

小批量梯度下降

小批量梯度下降意味着,我们同时在训练集的子集上训练神经元。

我们必须编写一个函数来生成随机批次。

作者代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

predicted y: 0.9956078874633946, true y: 1

添加激活功能

激活函数是非线性函数。

3 个非常重要的激活函数及其导数:

tanh:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

西蒙德:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

整流线性单位:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

前进传球

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片

向后传球

应用向量链规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

计算导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

np.diag 函数从一个向量构造一个矩阵,其中矩阵的对角线等于该向量,并且它是非对角线的。

关于重量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

关于偏差:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

密码

激活功能:

作者代码

神经元:

作者代码

迷你批次梯度下降

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

值、权重和偏差收敛到不同于先前的情况。

prediceted y: 0.9394357707018176, true y: 1

深度神经网络

向前传球

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

括号中的上标表示该层。

第 1 层(=输入层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

第二层(=输出层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

向后传球

第一层(=输入层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

第二层(=输出层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

计算第 2 层的导数是一个问题,因为我们必须对矩阵求向量的偏导数,对矩阵求矩阵的偏导数。这将导致张量,这将使它变得不必要的复杂。

我们不使用向量链规则,而是直接计算损失对权重和偏差的最终导数。为此,我们:

  1. 用索引符号重写向前传递。在这个符号中,我们可以看到损失的最终导数的每个元素相对于权重和偏差的样子。
  2. 计算导数。
  3. 为了编写高效的代码,请返回到矢量化形式。

第一层(=输入层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

第二层(=输出层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

损失:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

向后传球

第二层(=输出层):

为了推导索引符号中的公式,我们可以查看计算图。例如,为了推导第 2 层权重的公式,我们构建了一个计算图,其中所有相互依赖的变量都是相连的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们用索引符号重写了相同的计算图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们现在想知道损失对每个重量的导数。对于每个权重,我们必须对该权重出现的所有分支求和。作为层 2 的重量 1 的例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

损失相对于所有重量的导数为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化形式写回:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

注意,通过观察等式的左侧,我们可以看到我们的矢量化形式最终必须具有的维数。这有助于我们以正确的方式构造点积,并给我们必须转置的信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化形式写回:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

第一层(=输入层):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化形式写回:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

重新划分偏差:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化形式写回:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

为了使求和更清楚:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

“轴= 1”意味着我们对各列求和。

通式

为了推广我们上面导出的公式,我们将输入损耗的概念引入到层中的神经元中。输入错误 𝛿 (𝐿)进入最后一层𝐿是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

对于我们网络的所有其他层 l:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

𝑓表示非线性激活函数。这可以是例如乙状结肠或 relu。𝑓′表示𝑓.的导数

关于重量的导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

关于偏差的导数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

以矢量化的形式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最终代码

此代码可用于创建和训练任意深度神经网络。传递给 init 方法的列表“层”可以更改,这将更改网络。列表的长度等于层数。这些数字等于每层中神经元的数量。第一个必须等于特征的数量。

作者代码

测试我们的代码:

作者代码

我们再次查看输出层的权重和偏差的演变以及训练期间损失的演变。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

predited y: 0.9514167066315814, true y: 1

结论

如果你还和我在一起,我祝贺你,虽然这是一个旅程。如果第一次没有成功,也不要绝望。我花了一个多月才想明白这一切。

今天你已经学会了如何在任意深度神经网络中导出权重梯度。你现在也应该能够将这些知识应用到其他问题上,比如线性回归、递归神经网络和强化学习等等。

但是要知道,现在有非常好的自动签名框架,它能够为你数值计算梯度。尽管如此,我仍然认为,手工推导这些公式有助于我们对神经网络如何运行以及出现的一些问题(如香草 RNN 中的消失和爆炸梯度)的总体理解。

相关著作

https://medium.com/@Vincent.Mueller/einstein-index-notation-d62d48795378

想联系支持我?

LinkedIn
https://www.linkedin.com/in/vincent-m%C3%BCller-6b3542214/
脸书
https://www.facebook.com/profile.php?id=100072095823739
Twitter
https://twitter.com/Vincent02770108
Medium
https://medium.com/@Vincent.Mueller
成为 Medium 会员并支持我(你的部分会费直接归我)
https://medium.com/@Vincent.Mueller/membership

反向传播:简单的证明

原文:https://towardsdatascience.com/backpropagation-the-natural-proof-946c5abf63b1?source=collection_archive---------7-----------------------

是时候真正理解算法是如何工作的了。

人工神经网络与其他机器学习算法的区别在于它们如何有效地处理大数据,以及它们如何对你的数据集假设很少。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内核诡计[1]

您的神经网络不关心您的分类数据是否不能通过核进行线性分离,或者您的回归数据所遵循的趋势是否是过山车。只要你的数据集是从一个有限空间( x )到另一个有限空间( y )的连续映射,那么你就可以根据你的架构以任何精度近似这个映射。这是因为它们是通用近似器,正如 通用近似理论 所证明的。关键是,当神经网络在 40 年代首次出现时,没有快速的方法来利用神经网络的这一方面。直到 1970 年,反向传播——一种神经网络的快速训练算法以其现代形式发表。

在这个故事中,我们将花大部分时间从数学角度理解这种算法是如何工作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个全局最小值的例子[2]

在我们深入研究它的证明之前。我想确定你知道两件事。首先,假设给定一个多变量函数***【x,y】(例如上图所示的曲面)那么最小化 f(x,y) 就是找到f*/∂x和**∂f/∂yt22】如果我们的多变量函数是数百万个变量(权重和偏差)中的某个成本函数,这同样适用。如果我们希望将其最小化,那么只需找到该函数相对于每个参数的偏导数,然后使用梯度下降迭代更新其参数,以最小化损失。
第二个我想让你注意的是链条法则。考虑 f(x)x 为某变量中的函数 w 然后去找**∂
f
/∂
w
我们写
**∂
f
/∂w*=(f*/∂x×*(x ₃)* 与每个xᵢw中的一个函数通过为每个写它然后添加:
**∂
f*/∂w*=(f +(f*/∂x₂)×*(x₂/∂w)+(f*/∂x₃)×*(x********

****现在我们的目标很明确,给我们一个数据集,一个任意的神经网络,一个成本函数 J ,我们需要找到 J 关于神经网络中每个参数(权重/偏差)的导数,反向传播允许我们这样做,一次一个观察值。这意味着如果我们的损失函数是

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

均方误差: yᵢ 为观测值y(xᵢ)为由于馈网用【xᵢ】 d 是数据集的长度。

为了找到它对某个权重或偏差的导数,我们可以找到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于每个单独的训练示例 (xᵢ、yᵢ) 然后将它们全部相加并除以 d 。就像我们在和中引入导数一样。向前看,上面的公式就是我们在写 J 时所暗指的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艺术的例证[3]

现在,在我们开始证明之前剩下的是决定一个符号**。**

对于权重,设 w ᴸₘₙ 为从 (L-1) ₜₕ 层的 mₜₕ 神经元到 L ₜₕ 层的 nₜₕ 神经元的权重。例如,从输入层的第三个神经元到隐藏层的第二个神经元的权重将是 w ⁰₃₂ 我们稍后会回头看,让第一个隐藏层的权重为 L = 0 ,但现在请耐心听我说。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

神经网络示例[4]

除了权重,我们还有神经元特有的激活和偏差。我们将通过 a ᴸₘ 来表示 mₜₕ 神经元在 L ₜₕ 层的激活,对于偏差我们将做 b ᴸₘ

注意,如果我们调用激活函数 h ,那么我们可以写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这准确地捕捉到了任意神经元内部发生的情况。激活后的线性组合。现在,如果我们称线性组合为 z 可能会对我们有好处,所以下面是真的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们要开始证明了吗?好吧,既然我们要实现这个(也许,在的另一个故事中),如果我们也讨论一下如何用向量/矩阵符号来写我们到目前为止所介绍的内容,那将会很有帮助。

对于神经网络中不是输入层的每一层,我们可以定义如下:

Wᴸ :包含从 (L-1)ₜₕ 层到**层权重的权重矩阵。如果 (L-1)ₜₕ 层具有 M 个神经元,而 Lₜₕ 层具有 N 个神经元,则这具有维度 **MN* 。正如你所想象的,元素**wᴸ[m,n】就是我们之前定义的 w ᴸₘₙ**

bᴸ : 任何层的偏置向量都会有其每个神经元的偏置, bᴸ[m] = bᴸₘ

aᴸ : 任何层的激活向量将具有其每个神经元的激活, aᴸ[m] = a ᴸₘ

zᴸ : 任何层的预激活向量将具有其每个神经元的线性组合, zᴸ[m] = zᴸₘ

使用这个新的符号,如果我们让函数 h 被应用于向量元素,那么我们可以写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意, h 应用于向量 z 中的每个元素。

请记住,由于我们的符号, W 中的每一列都代表 Lₜₕ 层中特定神经元的权重。这一事实以及矩阵乘法的工作原理应该能让你理解上面的公式。

还要注意,对于 L = 0 (第一个隐藏层),当且仅当我们用 x 代替激活时,上述关系成立。我们没有给输入层 L = 0 的唯一原因是,这将使 Wᴸbᴸ 等。对于 L = 0 未定义。我们不妨让最后一层有 L = H ,这样我们就可以很容易地在证明中突出它。这也使得 H 成为我们网络中的隐藏层数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正在进行的证明的说明。[5]

让我们从找到 ∂J/∂ w ᴸₘₙ 开始我们可以利用这样一个事实,即t5】zᴸₙwᴸₘₙ中的一个函数,通过使用链式法则,如下所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过将 z ᴸₙ 代入其定义,并考虑到 b ᴸₙ 不是 w ᴸₘₙ 中的函数,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,因为在求和中唯一能经受住微分的权重是 i = m,我们可以写为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们证明的大部分时间里,我们会试图找到红色的术语;因此,给它一个名字是值得的。姑且称之为δᴸₙ吧。注意,每个神经元都有自己的 δᴸₙ 。对于整个图层,我们可以像写 bᴸ的aᴸ的和 zᴸ的一样写矢量 δᴸ的****

所以我们在索引符号中的结果变成了

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在向量符号中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这直接来源于外积的定义和我们的指数符号结果。

现在让我们利用类似的事实来找到∂J/∂bᴸₙ,即 zᴸₙ是 bᴸₙ的一个函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

zᴸₙ 代入其定义,并考虑到总和不是 bᴸₙ 中的函数,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者用向量符号表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以证明的结论可以归结为找到 delta。还记得我们的成本函数是什么样的吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*****【y(x)】*其实只是最后一层的激活,所以我们可以这样写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为 J*【aᴴ中明确是一个函数,这应该会诱使你利用链式法则并涉及去寻找*【δᴴₙ**。****

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样,我们就隐含地假设*【aᴴₙ】*只是该层中【zᴴₙ】的一个函数,这对于你遇到的大多数成本函数来说是正确的,但对于 soft-max 来说不是,因为任何 aₙ 都是该层中所有 zₙ 的函数。在这种情况下,我们需要用链式法则的多变量版本来考虑它们。但是我们下次再做吧。

这两个术语都很容易找到。第一次

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为这适用于最后一层中的任何神经元,所以我们可以将向量形式写为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在是第二学期,我们有

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在矢量形式中,它只是简单的h’(zᴴ)****其中*h’将按元素应用于矢量 z *

在索引符号中结合这两者产生

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为它在索引符号中的样子,如果我们用ⵙ来表示两个向量的元素乘积,那么我们可以通过写来实现向量符号中的公式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是,当我们为网络中的任何神经元寻找δ**(δᴸₙ)时,这只能说明最后一层。**

因为我们知道最后一层的δ,所以使用它来找出其它层的δ的一种方法是找出当前层 L 的δ与下一层的δ的关系。让我们试试看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们需要求和,因为下一层中的每一个 zₘ 都是zₙ**(h(zₙ)的函数,对吗?).
对于下一个术语,将 z 代入其定义,考虑到
a
只是 zᴸₙ 中的一个函数,当 i = n 时,我们可以写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**现在回想一下****aᴸₙ=h(zᴸₙ)我们可以写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过代入δᴸₙ,在索引符号中我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,我们在 sum 中所做的相当于权重矩阵中对应于神经元的行与整个 delta 向量(列)之间的点积。如果我们将权重矩阵乘以增量向量,这正是幕后发生的情况,除了因为它发生在 W 中的所有行,所以我们得到一个考虑所有神经元数量的向量。因为对于每个我们简单地乘以 h( z ᴸₙ) 我们可以再次利用ⵙ作为元素式乘积,并写出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

深呼吸。证明到此结束。

为了编译我们用索引符号导出的所有方程,我们可以写

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用向量符号表示(一层一层)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

证明只帮助我们得出方程;算法就是雇佣他们的东西。 一次考虑一个例子,如下所示:

1-aᴸz 找层 0H 通过把一个例子馈入网络。(用前两个方程。)这就是所谓的“向前传球”。

2- 分别用 δᴴδᴸ 的公式计算 H0 层的 δᴸ 。(用第三个等式。)

3- 同时计算层 H0∂J/∂Wᴸ∂J/∂bᴸ 因为一旦我们有了 δᴸ 我们就可以找到这两个。(用最后两个等式。)这就是所谓的“倒传”。

4- 重复更多示例,直到网络的权重和偏差可以通过梯度下降进行更新(取决于您的批量):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设 d 是数据集的长度。

正如你可能已经注意到的,步骤 2 和 3 是这个算法的名字;为了找到参数,我们必须反向传播。在下一个故事中,我们可能会考虑用 Python 来实现。

如果你喜欢阅读,并希望看到更多这样的故事,那么请考虑给帖子一些掌声,并跟我来。下次见,再见。

参考文献:

[1]“文件:内核 Machine.Png—维基共享”。Commons.Wikimedia.Org,2011,https://commons.wikimedia.org/wiki/File:Kernel_Machine.png.

[2] Pixabay,2015,https://pix abay . com/de/vectors/抛物面-mathematik-schale-fl % C3 % a4che-696804/。于 2021 年 9 月 21 日访问。

[3]“文件:English.Png 多边网络——维基共享”。Commons.Wikimedia.Org,2010 年https://commons . wikimedia . org/wiki/File:MultiLayerNeuralNetworkBigger _ English . png .

[4]布特,威廉。“档案:美国旧金山旧金山现代艺术博物馆(Unsplash Rkjf2bmrljc)。Jpg —维基共享”。Commons.Wikimedia.Org,2017,https://commons . wikimedia . org/wiki/File:San _ Francisco _ Museum _ of _ Modern _ Art,San_Francisco, United States _(Unsplash _ rkjf 2 bmrljc). jpg .

[5]“在白板上写字的女人”。 Pexels ,2021,https://www . Pexels . com/photo/woman-writing-on-a-white board-3862130/。于 2021 年 9 月 21 日访问。

学习资源:

尼尔森迈克尔。神经网络和深度学习。2019,CHP。1,2.

将数据库备份到 Google 云存储

原文:https://towardsdatascience.com/backup-database-to-google-cloud-storage-5348a916f791?source=collection_archive---------19-----------------------

设置定期数据库备份到 Google 云存储的流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kelvin AngUnsplash 上拍摄的照片

我有几个托管在数字海洋服务器上的小网站。他们每个人都有一个 MySQL 数据库,我想定期设置上传完整的数据库导出到数字海洋之外的一些独立位置,以便更平静地睡觉。由于我的生活围绕着谷歌云,我对存储的偏好很明显。目标是使用 crontab 定期运行 bash 脚本来执行 MySQL 数据库导出和 gsutil 命令来将文件复制到云存储桶。要配置整个过程,需要几个步骤,我将在本文中进行描述。我与谷歌云项目的互动,我使用网络用户界面,虽然所有步骤都可以通过命令行界面完成。

1.为备份创建一个云存储桶

第一步是创建一个云存储桶,用于存储备份文件。在 Cloud Console 中,我们转到云存储部分,然后单击按钮 Create bucket。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有几件事需要设置。由于这是一个备份桶,我将存储类设置为 Nearline (而不是 Standard ),因为这是为不太频繁的访问而设计的,而且有点便宜(数据访问也要收费)。我还设置了一个保留策略,只保留最近 3 个月的对象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.创建服务帐户

因为这个操作是在服务器上完成的(在 Google Cloud 之外),所以我将使用一个服务帐户来认证和访问 Google Cloud 项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一步是下载密钥文件。在服务帐户列表中,单击您创建的帐户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

切换到“密钥”选项卡,然后点击“添加密钥”,然后“创建新密钥”,文件将自动下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您的互联网浏览器将下载该文件。

最后一步是将这个文件复制到服务器,我使用的是 scp 命令:

scp service_account.json <myusername>@<SERVER>

3.设置服务帐户对存储桶的访问权限

由于脚本会将数据库导出文件上传到存储桶,因此我需要为备份存储桶的服务帐户设置正确的权限,目前该服务帐户不需要其他访问/角色。

要设置云存储桶的访问权限,请在云存储桶列表中,单击相关的桶名称。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后切换到权限选项卡,点击添加按钮,添加对服务账户的访问权限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在“新成员”字段中,我添加了服务帐户的完整电子邮件地址“my-backup-Account @ iam . gserviceaccount . com”

最小的角色是存储对象管理员(在云存储部分下)。注意:存储对象创建器是不够的,因为当使用 gsutil 命令时,它也对桶使用“列表”操作(出于某种原因)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用保存按钮保存设置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将服务帐户添加到存储桶后,它会列在“成员”列表中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在此过程中,仅授予此存储桶的访问权限,服务帐户将无法访问其他云存储存储桶。

3.在服务器上下载和安装 Google Cloud SDK

安装 Google Cloud SDK 有几种方法。一种方法是直接将其作为操作系统包安装。我使用的方法包括从源文件安装。

谷歌云 SDK 的安装就是基于这些步骤【https://cloud.google.com/sdk/docs/install#linux 。为简洁起见:

curl -O [https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-337.0.0-linux-x86_64.tar.gz](https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-337.0.0-linux-x86_64.tar.gz)

tar -zxvf google-cloud-sdk-337.0.0-linux-x86_64.tar.gz

./google-cloud-sdk/install.sh

根据您如何配置其他东西,我需要做这个额外的步骤:

作为我的服务器上的默认版本,Python 2.7 已设置,Google Cloud SDK 对此有问题,所以我使用 pyenv 来支持多个 Python 版本。为了将 Google Cloud SDK 指向我想要的 Python 版本,我将 bash_profile 中的环境变量 CLOUDSDK_PYTHON 设置为指向 pyenv 的 Python3 解释器。

export CLOUDSDK_PYTHON=/home/ubuntu/.pyenv/shims/python3

4.使用服务帐户对 Cloud SDK 进行身份验证。

为了使用我创建并下载的服务帐户对 gcloud 进行身份验证,我使用了以下命令

gcloud auth activate-service-account my-backup-account@iam.gserviceaccount.com --key-file=/<PATH TO KEY>/service_account.json

如果一切正常,它将打印以下消息:

Activated service account credentials for: [my-backup-account@iam.gserviceaccount.com]

现在我们可以使用像 gcloudgsutil 这样的云 SDK 工具与 Google Cloud 项目进行沟通。

5.Bash 脚本

脚本 backup.sh 包括将数据库转储到一个临时文件夹,然后从该文件夹上传到云存储桶:

#!/bin/bash

DUMP_FOLDER="/tmp"
GCS_BUCKET="my-safe-backups"

DT=$(date "+%Y%m%d")

function backup() {
  database=$1
  filename="${database}_${DT}.sql"
  output_file="${DUMP_FOLDER}/${filename}"
  echo $output_file
  mysqldump "$database" >"$output_file"
  if test -f "$output_file"; then
    gsutil cp "$output_file" "gs://${GCS_BUCKET}/${database}/${filename}"
    echo "${database} dump uploaded"
    rm "${output_file}"
  else
    echo "No dump file ${output_file}"
  fi
}

backup mydb_1
backup mydb_2

DUMP_FOLDER 是将导出数据库的本地路径,GCS_BUCKET 是在第一步中创建的云存储存储桶的名称。

因为我有多个数据库,所以我为每个数据库创建一个备份,调用 backup 函数,将数据库名作为输入参数。

6.设置 cron

我已经将备份脚本设置为每周执行一次。

10 0 * * 1 /home/ubuntu/bin/backup.sh

结论

由于大多数数据库都有自己的导出命令,因此也可以很容易地进行编辑以用于备份。

糟糕的数据可视化以及如何修复它们

原文:https://towardsdatascience.com/bad-data-visualizations-and-how-to-fix-them-432444213c01?source=collection_archive---------25-----------------------

使用数据可视化原理来修复误导和无信息的图表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Firmbee.comUnsplash 上拍照

构建数据可视化:数据科学周期中的一个阶段,在此阶段,您在理解和清理数据集之后,可以展示您的发现。我相信你一定想知道以图形方式显示数据的最佳方式是什么,以及你所做的不同选择,无论是颜色、标题、标签还是单位,会如何影响观众对你的结果的感知。那么,视觉化是好是坏呢?

直观地说,一个好的可视化应该清晰准确地传达关于其内容的信息。虽然这看起来似乎是一个足够简单的任务,但使用大量工具来构建图表,很容易陷入制作不必要的复杂图表的困境,这些图表要么难以理解,要么可以在更简洁的图表中得到更好的简化。因此,在考虑向观众传达数据时,设计和内容似乎都是最重要的。

让我们考虑一个不满足好的可视化标准的可视化的例子。首先,让我们从导入 Plotly 开始,这是我们获取内置数据集的首选包,并打开 carshare 数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

乍一看,似乎有一个纬度和经度列,其中也包含单词“质心”,所以我可能认为它们代表某种多边形的中心。该数据还有一个名为 peak_hour 的列,这似乎是高峰汽车份额可用性的 24 小时格式的小时,还有一个 car_hours 列,这不是立即可以理解的。在 Plotly 文档中,我们被告知这与蒙特利尔一个月内的汽车可用性有关,因此这可能是一个月内每个高峰小时汽车数量的平均值。现在,我们想进一步探索数据,但在此之前,让我们先看看数据是否需要清理。

小时数据有没有 0 到 23 以外的奇怪数值?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不,不是的。car_hours 栏呢?它是否有低于 0 等不可能的值?

我们得到的是一个空的系列。因此,看起来数据状态良好,我们可以继续对其进行可视化处理。

示例 1:直方图

该数据集中的一个关键变量是 car_hours,我们假设它表示某个位置高峰时段的汽车共享车辆数。由于这是一个数字变量,我们可以使用直方图来可视化它,为了显示您在构建图表时做出的选择有多重要,让我们设置一个非常低的 bin 计数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这个直方图中我们能注意到什么?首先,它是向左倾斜的:在 1000 年和 2000 年似乎有更多的峰值汽车数量,而不是大于 2000 年。也有极少数地点的高峰车流量超过 3000 辆。我们如何知道这是否是有益的,或者我们的箱子应该有多大?我们现在的图表是否违反了我们任何好的图表设计原则?可以说,是的:如果我们考虑到我们正在比较不同车辆计数的频率这一事实,一个非常小的箱大小并不能帮助我们推断这些计数在高峰时间是如何分布的。

幸运的是,我们可以使用斯特奇规则,这是一个很好的确定 bin 大小的经验法则: **K = 1 + 3。322 logN,**其中 K 是容器大小,N 是我们拥有的观察值或数值的数量。在这种情况下,对于 N = 249(如在 249 个峰值汽车计数观察中),K = 8.9 或大约 9。那么,让我们来看看实际情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在直方图更加精确了,我们可以看到数据中更具体的趋势。例如,看起来最常见的值是每个区域 500 到 1000 辆车(高峰时段),直方图是左偏的,但现在更清楚不同的计数如何细分为箱。

那么,我们能进一步改进这个图表吗?嗯,使用像 Plotly 这样的 Python 可视化包,我们可以控制图表的许多属性,比如颜色、标签和标题。当前的标签是否为查看者提供了足够的信息来清楚地理解图表所显示的内容?可能不会,因为我们已经确定 car_hours 标签有点模糊。因此,让我们修复它们,并添加一个描述性标题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.覆盖直方图

接下来,让我们想象一下 car_hours 在白天和晚上的分布情况。在这个图表中,我将从早上 5 点到晚上 8 点定义为白天,晚上 8 点到凌晨 4 点定义为晚上。下面是进行过滤和显示直方图的代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我在这里故意犯了一个错误。你能说出这是什么吗?这是为重叠直方图选择的颜色:红色和绿色。红色和绿色色盲是最常见的色盲类型,您在设计图表时必须记住,它们需要让您的所有观众都可以访问,这通常意味着要考虑可视化组件的设计,而不仅仅是它所呈现的内容。还有一个方法:在图例中添加正确的标签和合适的标题。所以让我们解决所有这些问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们注意到什么有趣的趋势了吗?首先,这两个直方图似乎在它们覆盖的 x 值上有相似的分布。其次,两个直方图的大量数据似乎都集中在 500 到 1500 的范围内,这有点令人惊讶,因为我们会认为与白天相比,晚上的汽车共享服务可用性会更低。

3.互动和额外元素

要为图表添加额外的功能,您有许多选项可供选择。一个例子是为你的数据添加工具提示,当你将鼠标悬停在某个点上时,工具提示会显示该点的值。这在检查异常值时很有用,例如上面直方图中 3000 个区间,因为它们提供了对这些数据点的额外洞察。当您创建直方图时,Plotly 会自动创建这些工具提示,并帮助您的图表获得全面的信息。

那你怎么知道什么时候添加额外的元素,比如工具提示呢?您是否冒着使可视化过于复杂的风险,或者元素本身对于赋予图形意义是不可或缺的?对于最后一个例子,让我们来看看来自 Plotly 内置数据集的亚洲国家预期寿命数据的 3D 图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上是结果。它看起来确实非常吸引人,比以前的视觉化效果更现代。但是,问题是:这个第三维度给数据增加了任何信息吗?这个图表可以被分成两个更容易理解的 2D 吗?我想是的。在我看来,如果我们只看每一对,就更容易看出年和预期寿命或年和人口之间的关系。虽然我们注意到这些年来预期寿命有明显的上升趋势,但很难准确确定国家之间的差异或人口增长如何影响预期寿命。总的来说,我认为这个图表很难解释,所以你应该把它分成两三个线图。

既然我们已经看到了一些如何提高我们的可视化的例子,那么主要的收获是什么呢?首先,考虑图表的设计:它的颜色和标签,同时记住,你要让你的图表尽可能简单直接,便于观众理解。接下来,你可能要抵制诱惑,不要选择看起来更复杂的图表,而要选择更简单、更容易显示变量之间关系的图表。

感谢你的阅读,我希望你喜欢这个故事!

令人困惑的真阳性和真阴性概念

原文:https://towardsdatascience.com/baffling-concept-of-true-positive-and-true-negative-bffbc340f107?source=collection_archive---------7-----------------------

了解 TP/TN 和 FP/FN

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Michael Dziedzic 在 Unsplash 上拍摄的照片

在机器学习和统计学中,我们经常使用术语“真正”和“真负”,但人们仍然会感到困惑,因此他们的矩阵被称为混淆矩阵。现在的问题是什么是真和假,什么是正和负。我们可以读定义,可以更迷惑。所以,用简单的话来说,我们会明白的。

什么是积极和消极?

正面和负面无非就是两类,比如幸存/未幸存,癌症/未癌症,信用卡诈骗/未诈骗,垃圾邮件/未垃圾邮件等。它不仅在两个发生/没有发生之间,而且还可以分为猫/狗、雄性/雌性。因此,我们认为一类是积极的,另一类是消极的。这是任意的,或者取决于研究的目的,你认为一个是积极的,另一个是消极的。这里面没有好的(积极的)或坏的(消极的)方面。

什么是真假?

当有来自某个群体的样本数据时,我们使用建模来预测它的类别/标签。“真”表示模型能够识别其类的记录,而“假”表示模型不能识别的记录。

混乱矩阵

混淆矩阵是表示分类问题预测结果汇总的表格。我们可以在下面看到一个混淆矩阵。预测值和实际值的位置改变了假阴性(FN)和假阳性(FP)的位置,但是真阳性(TP)和真阴性(TN)保持在矩阵中彼此对角放置的相同位置。但正因为如此,情况变得扑朔迷离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

简单的例子来更好地理解这个概念。在这个例子中,有两类水果。我们有 9 个苹果和 10 个草莓,但是模型只正确识别了 6 个苹果(真阳性)和 8 个草莓(真阴性),此外,模型预测 2 个草莓是苹果(假阳性),3 个苹果(假阴性)是草莓。在另一个例子中,怀孕/未怀孕是两个类。有 8 名妇女怀孕,8 名妇女未怀孕,该模型正确地将 6 名怀孕(真阳性)和 5 名未怀孕(真阴性)的妇女分类,但将 3 名未怀孕(假阳性)的妇女分类为怀孕,将 2 名怀孕(假阴性)的妇女分类为未怀孕。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

通过下面的 GIF,你可以更清楚地理解这个概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

绩效评估措施

从混淆矩阵中,我们还可以计算模型的准确率、精确召回率和 F1 值。这些度量有助于理解模型的性能。从公式中,我们可以计算这些措施,并计算我们可以使用混淆矩阵。公式在下面的矩阵中给出。这里 NPV 是负的预测值。如上所述,随着实际值和预测值的位置改变,度量的位置也改变。

用更简单的术语定义:

*准确性:*准确性是模型正确分类的记录占记录总数的比率。例如,如果有 10 个红色球和 10 个紫色球,其中 8 个红色球和 7 个紫色球你识别正确,那么你的准确度是 8+7/20=0.75,因此,准确度是 75%。

Precision: Precision 是模型正确识别的阳性记录与全部阳性记录的比率。例如,如果有 10 个红色球和 10 个紫色球,人们必须识别哪些是红色球,并且出于任何原因,您将 8 个红色球和 2 个紫色球识别为“红色球”,那么您的精度是 8/10,即 80%。

*敏感性:*检测正确识别真阳性的能力(患有疾病的人和模型如此识别)。

*特异性:*检测正确识别真阴性的能力(没有患病的人和模型如此识别)。

*F1 得分:*F1 得分是精度和召回率/灵敏度的加权平均值,最佳得分为 1,最差得分为 0。公式如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

Python 代码

我们可以构建这些混淆矩阵,甚至使用 Python 轻松计算这些度量。所用数据取自 UCI 库存“https://archive . ics . UCI . edu/ml/datasets/Heart+failure+clinical+records”。代码如下:

Sklearn.metrics 提供了不同的选项来制作混淆矩阵,首先只是为了显示数字,一个选项是混淆矩阵,它给出的矩阵如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

而且,为了绘制混淆矩阵,sklearn.metrics 有两个选项,即 ConfusionMatrixDisplay 和 plot_confusion_matrix。通常使用 plot_confusion_matrix,因为只有在选项 normalize 为“真”时,才可以获得归一化混淆矩阵图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们也可以使用 python Seaborn 的热图来制作如下的混淆矩阵,“不能”选项保持 false 会删除矩阵中的数字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

下面是获得准确度、召回率、F1 得分、精确度、roc auc 得分(根据预测得分计算受试者操作特征曲线下面积(ROC AUC))的代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

虽然有一些简单的选择来创建混淆矩阵和计算评估措施,但我们最好理解这些概念和公式,以便我们能够理解和解释这些分析。

感谢阅读!

参考资料:

https://sci kit-learn . org/stable/modules/classes . html # module-sk learn . metrics

利用 Bag 数据库进行 bag 文件管理

原文:https://towardsdatascience.com/bag-file-management-using-bag-database-44d774d54df3?source=collection_archive---------31-----------------------

一个来自 swri 机器人的开源项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由尼古拉斯·佩罗尔Unsplash 拍摄

如今,自动驾驶汽车越来越普遍。像特斯拉这样的大公司正在让无人驾驶汽车成为现实。为了收集数据以便 auto car 可以在现实世界中学习和适应,我们需要处理大量的包文件。

是 ROS 中用于存储 ROS 消息数据的文件格式。包——如此命名是因为它们。包扩展——在 ROS 中有着重要的作用,并且已经编写了各种工具来允许您存储、处理、分析和可视化它们。

示例 ROS 包文件可以从http://real sense-HW-public . S3 . amazonaws . com/RS-tests/test data/stairs . bag中获得。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

箱包数据库管理

最简单的开始方式是从 docker-compose 触发箱包数据库,无需认证。在您的目录中创建 docker-compose.yml 文件:

**注意:**在 docker-compose 之前,您需要创建/var/local/bags 和/var/lib/docker/volumes/bag-database _[scripts,indexes,postgres]。

运行后

docker-compose up

我们将看到 bag-database 正在端口 8080 上运行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以观看录像

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者直接看地图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

希望有帮助。

开心编码~

参考

https://github.com/swri-robotics/bag-database

包装决策树——解释清楚

原文:https://towardsdatascience.com/bagging-decision-trees-clearly-explained-57d4d19ed2d3?source=collection_archive---------10-----------------------

整体技术-装袋

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由皮查拜派克斯拍摄

决策树

决策树是监督机器学习算法,用于分类和回归任务。

在本文中,我介绍了以下概念。

  • 如何建立决策树?用什么标准来分割决策树?
  • 如何克服决策树中的过度拟合?
  • 什么是装袋?包装决策树是如何工作的?

决策树是一种树状模型,可用于预测目标变量的类别/值。决策树有效地处理非线性数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

假设我们有难以线性分类的数据点,决策树提供了一种简单的方法来确定决策边界。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

它通过递归分割整个区域来实现。让我们看看分裂是如何进行的。

节点类型

  1. 根节点—决策树中最顶端的节点称为根节点。
  2. 内部节点—进一步分裂的子节点称为内部节点。
  3. 叶节点—不会进一步拆分的节点称为叶节点

如何在决策树中进行拆分?

在决策树中,在每个节点,基于特征进行分割。如果特征是连续变量,则在某个阈值上形成分裂条件。【比如年龄> 50】。如果特征是分类变量,则对所有值进行分割。【例如。性别=男性】。
选择杂质减少更多的分流。

用于计算最佳分割的标准是

  1. 分类误差
  2. 基尼指数

分类误差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何计算分类误差?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据拆分条件,节点 N1 被拆分为 N2 和 N3[图片由作者提供]

步骤 1:计算节点 N1 处的分类误差【分割前】

P[类 0]= 3/8
P[类 1]=5/8

1- max[p©]=1-[3/8,5/8]= 1–5/8 = 3/8

classification error before split =3/8

步骤 2:计算节点 N2 的分类误差

P[0 级]= 1/4
P[1 级]=3/4

1- max[p©]=1-[1/4,3/4]= 1–3/4 = 1/4

第三步。在节点 N3 计算分类误差

P[0 级] = 2/4
P[1 级]= 2/4

1- max[p©]=1-[2/4,2/4]= 1–2/4 = 2/8

第四步。子节点的平均分类误差。

节点 n2 中数据点的比例= 4/8
【8 个数据点中有 4 个在节点 N2】

节点 n3 中数据点的比例= 4/8
【8 个数据点中有 4 个在节点 n3】

加权分类误差= 4/8 * 1/4 + 4/8 * 2/4 = 3/8

classification error after split =3/8

5。分类错误变更:

分割前的分类误差= 3/8
分割后的分类误差= 3/8

分类误差变化= 3/8–3/8 = 0

Classification error for the above split is 0

分割是基于每个特征进行的。对于每个特征,计算分类误差的变化,选择产生最大分类误差变化的特征进行分割。

但有时,分类误差变化将为零。[在上面的例子中,分类误差变化为零]。所以,这不是首选。基尼指数和熵优于分类误差。

熵用于度量决策树中节点的同质性。如果节点是同质的,熵是 0。熵指的是杂质。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

熵公式

熵的范围从 0 到 1【针对 2 类问题】

  1. 如果节点是同质的,并且所有数据点都属于类 0 p[class=1]=0。熵将为 0。[纯节点-无杂质]
  2. 如果节点是同质的,并且所有数据点都属于类 1,p[class=1]=1。熵将为 0。[纯节点]
  3. 如果节点包含相同数量的属于类 0 和类 1 的数据点,则 p[c=1]=0.5。熵将是 1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

信息增益

熵(杂质)的减少被称为信息增益。如果特定拆分的信息增益更大,则首先执行该拆分条件。

Information gain= Entropy before split — Entropy after split

为上述决策树计算熵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算分裂前后的熵[图片由作者提供]

计算信息增益。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分割是基于所有特征完成的。对于每个特征,计算信息增益,并选择给出更多信息增益[杂质减少更多]的特征用于第一次分离。

基尼指数

基尼指数是衡量杂质的另一个标准。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基尼指数下降

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基尼系数的范围从 0 到 0.5。
熵的范围从 0 到 1。

决策树中的问题

决策树往往会过度拟合。它将继续增长,直到所有的叶节点都是纯的。所有叶节点都是同质的[属于一个类]。这将产生一个精确符合训练数据的树。所以,它不会很好地概括,也不会在测试数据中表现良好。

如何克服决策树中的过拟合?

为了防止过度拟合,应该有一些停止标准。

避免过度拟合的两种方法。

  1. 截断或预修剪→有许多超参数来截断树。这是一种自上而下的方法。
  2. 让树完全长大,然后修剪。这是一种自下而上的方法。

预剪枝→决策树停止准则—决策超参数

  1. 最大深度 →树被允许生长到提到的最大深度。
  2. min_samples_split →拆分决策节点所需的最小样本数。[决策节点是具有进一步拆分的节点]。如果决策节点的样本数少于 min_samples_split 中提到的样本数,则不会进一步分割。
  3. min_samples_leaf →一个叶节点所需的最小样本数。
  4. max_features →进行分割时要考虑的特征数量。

通过调整这些参数,它可以防止树过度拟合。

后期修剪→减少错误修剪

这是一种自下而上的方法。一棵树完全长大后,再修剪。

训练数据分为训练集和验证集。迭代地修剪节点,并在确认集和训练集中检查修剪树的性能。如果验证集中被修剪的树的准确度大于训练集的平均值,则该节点被修剪。修剪意味着删除以该节点为根的子树。

为什么要用装袋?

决策树是高方差模型。这意味着训练数据的微小变化,将导致完全不同的模型。决策树通常会过拟合。为了克服这种情况,可以使用集成技术——bagging。

什么是装袋?

Bagging 表示自举聚合。 Bagging 是指利用样本子集建立不同的模型,然后聚合不同模型的预测值以减少方差。

装袋如何减少差异?

假设我们有一组’ n’ 的独立观测值,比如说 Z1,Z2…Zn 。个体观察的方差为 σ2

所有数据点的平均值将为( Z1+Z2+…)。+Zn)/n 类似地,该平均值的方差将是 σ2/n.

因此,如果我们增加数据点的数量,均值的方差就会减小。这就是装袋决策树背后的概念。

同样,如果我们在给定的数据集上训练多个决策树,然后聚合预测。方差将会减小。

引导样本

装袋分两步

  1. 拔靴带
  2. 聚合

拔靴带

我们已经知道,如果我们对一组观察值进行平均,方差将会减少。但是我们只有一个训练集,我们必须建立多个决策树。

引导有助于从训练数据中创建多个子集。然后,我们可以在自举样本上构建多个树。

Bootstrapping 将从训练集中随机选择重复的数据点,并创建多个子集-替换采样。

如果在训练集中有**‘n’**个数据点,

在 bootstrap 样本中选择特定数据点的概率= 1/n

bootstrap 样本中特定数据点未被选择的概率=
1-1/n

所以,自举样本中每个点未被选中的概率=
(1–1/n)^n

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

引导样本中未选择的数据点的百分比-按作者分类的图像

这种方法也被称为 0.632 自举。表示 bootstrap 样本中每个数据点被选中的概率=63.2%。

每个引导样本将包含原始训练数据的 63.25% 。剩余的数据点将是重复的。
每个引导样本将不包含 36.8% 的训练数据。这用作从该样本构建的模型的测试数据。

汇总输出

现在,我们有了不同的引导样本,并为每个引导样本构建了’ B’ 决策树。下一步是汇总输出。

套袋分类树

对于测试集中的每个数据点,通过’ B’ 树来预测输出类。基于多数表决机制,计算最终类。

另一种方法是从“B”树中获得类的概率,并且根据概率的平均值对最终的类进行分类。

装袋回归树

对于回归→对于测试集中的每个数据点,从“B”回归树的所有预测的平均值计算目标值。

Bagging 是引导聚集

通过从训练数据集创建引导样本,然后在引导样本上构建树,然后聚合所有树的输出并预测输出,来完成决策树的打包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

bagging[图片由作者提供]

如何计算装袋误差?

我们知道,在每个 bootstrap 样本中,大约有三分之一的数据点被遗漏(36.8%)。来自训练集的大约只有三分之二的原始数据点被包括在引导样本中(63.2%)

因此,对于基于自举样本构建的每棵树,误差是根据该特定自举样本的未使用样本计算的。测量所有误差的平均值。这就是所谓的出 BagError。

如何计算特征重要性?

通过使用基尼指数/熵来计算特征重要性。

在为每个引导样本构建树时,基于信息增益在节点中进行分裂。我们将查看所有树中该特征的信息增益。然后在所有树中平均该特征的信息增益。

袋装决策树的优势

  1. 模型的方差减小。
  2. 可以同时训练多个树。

包装决策树的问题。

如果一个特征是最强的预测值,并且它对目标变量均值有更大的影响,则基于不同引导样本构建的所有树将首先基于该最强的预测值进行分割。因此,在不同引导样本上训练的所有树将是相关的。所以,它不会减少模型的方差。

为了克服这种情况,使用了随机森林。同样在随机森林中,我们将训练多棵树。但是数据点和特征都是随机选择的。通过这样做,树不相关,这将改善方差。

结论

决策树使用像基尼指数/熵这样的分裂标准来分裂节点。决策树往往会过度拟合。为了克服过度拟合,使用预修剪或后修剪方法。装袋决策树也被用来防止过度拟合。

我希望这篇文章对你有所帮助。感谢阅读!

进一步阅读:

https://betterprogramming.pub/understanding-decision-trees-in-machine-learning-86d750e0a38f

如果你喜欢看我的更多教程,就关注我的 LinkedInTwitter

点击这里成为中等会员:https://indhumathychelliah.medium.com/membership

烘焙扫描和细胞扫描

原文:https://towardsdatascience.com/bakeryscan-and-cyto-aiscan-52475b3cb779?source=collection_archive---------18-----------------------

人工智能识别面包的意外结果

最近有人问我这个问题:“你为什么决定学数据科学?”我首先想到的是一些事件,比如在我以前的安全工作的停工期自学 Python,编写 Python 脚本来输入并在飞行地图上显示公司旅行者的数据,或者只是我在报告我的工作大楼里哪些门最常使用时获得了多少乐趣。然而,我越想越意识到,这些都是促使我决定学习数据科学的因素,而不是主要原因。主要原因来自一个故事,自从我第一次听到这个故事,它就一直萦绕着我。

大脑有限公司

2007 年,日本科技公司 Brain Co. Ltd .向大公司出售软件取得了一定的成功。例如, TEX-SIM 是他们开发的用于设计纺织品图像的用户界面工具。他们还帮助开发了在个人电脑上显示汉字的软件,甚至制作了设计桥梁的软件。当地一家面包店找到了这些才华横溢的软件工程师,他们希望解决一个问题,Brain 公司对此一无所知,但他们对这个问题的解决方案将会定义他们,并将产生比他们计划的更大的影响。

日本的糕点问题

T2 的面包店以拥有种类繁多的新鲜出炉的糕点而自豪。一些面包店每天早上会制作数百种不同种类的糕点给 T4。在面包店进行的分析研究发现,售出的糕点总量与售出的不同种类的糕点总量直接相关。一家提供 100 种糕点的面包店的销售额是提供 30 种糕点的两倍。该研究还发现,顾客更喜欢没有包装的糕点,并且喜欢放在敞开的篮子里,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由水貂在 Unsplash 上混合而成

当面包店根据分析研究实施这些变革时,一个新的、不可预见的问题出现了。因为糕点根本不需要包装,所以没有办法在上面贴上条形码。顾客会把糕点交给收银员,收银员必须识别糕点,并正确记住它的价格。其中一些面包店有数百种不同价格的独特糕点,所以这开始给收银员带来明显的压力。培训新员工意味着教他们如何正确识别所有糕点并记住它们的价格。面包店老板开始注意到培训新店员需要几周的时间,即使训练有素的店员也要花相当多的时间才能正确识别顾客的物品。因此,当地一家面包店找到 Brain Co .询问他们是否有更好的解决方案。

贝克斯坎和大脑试验公司。

大脑公司面临着一个难以置信的任务。该团队无法获得神经网络所需的大量数据,因此他们必须想出另一种解决方案。除了这个难题之外,2008 年的金融危机发生在项目开始一年之后。Brain Co .发现他们所有的其他商业机会都已经枯竭,公司的生存突然取决于这个项目的成功。大脑公司的团队将他们的一切投入到这个项目中,这个项目将成为 BakeryScan AI。《纽约客》的詹姆斯·萨默斯描述了该团队如何开发解决方案:

计算机视觉领域的最新技术包括将一系列算法拼凑在一起,每一种算法负责一项特定的任务。假设你想建立一个行人识别系统。你首先要有一个算法来调整你图像的亮度和颜色,这样你就不会被某人的红色衬衫所困扰。接下来,你可以添加识别感兴趣区域的算法,也许是通过注意人行横道的斑马图案。只有这样,你才能开始分析图像“特征”——梯度和对比度的模式,可以帮助你挑出某人肩膀的独特曲线,或躯干和腿形成的“A”。在每一个阶段,你都可以从数十种甚至数百种算法中进行选择,并选择组合它们的方式。

使用这种“算法管道”导致了许多问题,这些问题都记录在团队的开发文档中。问题很多——例如,他们发现房间的照明会显著影响面包店扫描的准确性。他们发现,当两个糕点靠得很近时,面包店会有麻烦,必须开发一种方法来辨别这种情况何时发生。当糕点被撕开或损坏时,也会发生同样的情况。有时他们会遇到一些问题,比如一个甜甜圈投在甜甜圈孔上的阴影会阻止面包店正确识别商品。他们以首席执行官 Hisashi Kambe 所描述的“疯狂”的专注持续解决这些问题。有一次,该团队在两年的时间里开发了 10 个原型。最后,在 2013 年:

Brain 公司 5 年的努力得到了回报。他们开发了一种人工智能,可以以令人难以置信的准确度识别 50 多种不同的糕点。BakeryScan 通过摄像头识别糕点,然后向店员显示其名称和价格,只需几秒钟。BakeryScan 大受欢迎,每台售价 20,000 美元,现已在日本 400 多家商店使用。

贝克斯坎的遗产

这个故事本身是鼓舞人心的;一个软件开发团队,他们的生计岌岌可危,他们将所有的一切投入到一个看似不可能的任务中,并取得了成功。然而,故事并没有到此结束。

2017 年,一名在京都路易·巴斯德医学研究中心工作的医生看到了一则面包店的广告。经过一番思考,他有了一个非常有趣的认识。他认为被人工智能扫描的面包店食品与他一直在研究的癌细胞有着惊人的相似性。因此,他决定联系 Brain Co .看看他们是否有兴趣进行测试,看看 BakeryScan 是否能够在显微镜下检测癌细胞。

细胞扫描

贝克斯坎能够在显微镜下以 98%的准确率识别出癌细胞**。起初,它一次只能观察一个细胞。经过一些修改和测试,人工智能能够在显微镜下观察整个细胞切片,并突出显示哪些细胞是癌变的,准确率再次达到 98%的**。在治疗癌症时,癌症发现得越早,存活率就会大大提高。使用人工智能极大地提高了实验室技术人员整理样本和检测癌细胞存在的速度。Brain Co .给改造后的 BakerScan 起了一个新名字:“Cyto-AiSCAN”,目前正在日本神户和京都的两家大医院接受医生的使用和培训。****

当我听到这个故事时,我立即想到他们一定已经显著改变了贝克斯坎检测癌细胞的操作方式。《纽约客》的记者詹姆斯·萨默斯也有同样的想法。他向 Brain Co .的首席执行官 Hisashi Kambe 提出了同样的问题。

我问 Kambe 它是如何工作的——它使用深度学习吗?“原路,”他说。然后,带着灿烂的笑容,“和面包一样。”

不,和面包一样。

一个人创造的东西的影响

我经常想,在 2008 年开发 BakeryScan 的团队是否曾想过他们的人工智能会发展成这样。尽管我很怀疑是否有人能预见到这个结果。一名医生意识到糕点在显微镜下看起来几乎像癌细胞,于是心血来潮联系了该公司!这一事件导致这个人工智能从识别糕点到协助医生拯救生命。我想回到 2008 年,Brain Co .团队在开发 BakeryScan 时经历了一些非常令人沮丧的日子。我希望在那些日子里,有人能回到过去,让他们看看他们的小 AI 会变成什么样子。

这是我最喜欢的故事之一,因为它不仅仅是一个故事。这是一个艰难、胜利和奉献的故事。谁能想到面包扫描仪能拯救无数生命?我几乎可以保证他们没有。他们对这个项目的奉献和热情把他们带到了一个目的地,在他们到达之前,他们甚至不知道这个目的地的存在。

这个故事是我想学习数据科学的主要原因。也许它不会是用深度学习训练一个人工智能,或者创建一个神经网络,但我确实希望我能有幸创造一些有影响力的东西;一些超出我预期的东西。一些让我感到自豪和充满激情的事情。数据科学领域是我最擅长做类似事情的地方。我希望 Brain Co .团队为自己感到骄傲,知道即使他们的小 AI 不会被永远使用,他们创造的影响也会在未来很长一段时间内被记住。

参考

"设计用来区分糕点类型的人工智能识别癌细胞的准确率达到 99% . "Express Digest ,Express Digest . com/ai-designed-to-discriminate-types-of-pastes-identified-cancer-cells-with-99-accuracy/。

"人工智能糕点扫描仪正在与癌症作斗争."正在与癌症作斗争的人工智能糕点扫描仪——CES 2022,2018 年 5 月 20 日,www . CES . tech/Articles/2021/May/The-AI-Pastry-Scanner-That-Is-Now-Fighting-Cancer . aspx .

“bakery scan-瞬间识别所有糕点!-." YouTube ,YouTube,2020 年 12 月 24 日,www.youtube.com/watch?v=vTwxKXokVB8.

詹姆斯·萨默斯。“学会抗癌的糕点人工智能”《纽约客》,2021 年 3 月 18 日,www . New Yorker . com/tech/annals-of-technology/The-pastry-ai-that-learn-to-fight-cancer。

平衡行为:不平衡数据的分类

原文:https://towardsdatascience.com/balancing-act-classification-with-imbalanced-data-cea06df39781?source=collection_archive---------13-----------------------

帮助您的数据找到平衡点,以确保创建质量分类模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Niklas Ohlrogge 在 Unsplash 上拍摄的照片

瑜伽、放松、感恩日记:所有这些都可能帮助你找到平静与和谐。但是你的数据集也需要你的帮助来达到一个理想的平衡——而且,就像人类的自我保健一样,如果我们不花时间去寻找平衡,事情可能会出错。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 via GIPHY

了解您的训练数据在您想要预测的类中的分布并做出相应的调整是创建质量分类模型的关键步骤。当您试图预测一些不经常发生的事情时,例如很少发生的欺诈性交易或不寻常的设备故障,不平衡的数据集尤其容易发生。然而,不管您的特定领域是什么,您总是想要评估目标类的分布。

深吸一口气,让我们来探索如何和为什么与不平衡的数据集进行斗争。这里我们将关注二元分类,这里有两种可能的目标变量结果。我们将在 Alteryx Designer、Alteryx 机器学习和 Python 中使用一些工具来简化这个过程。

用 EDA 解放你的思想

这可能已经是您数据分析例行程序的一部分,但是彻底的探索性数据分析(EDA)对于成功的模型构建是至关重要的。特别是,为了我们的目的,你要密切注意你的结果变量的分布。无论您是尝试构建二元分类模型(只有两个类)还是多类分类模型(有两个以上的选项),如果您的数据非常均匀地分布在各个类中,那么前进的道路是最简单的。

当然,事情很少会如此顺利。让我们以来自 Kaggle 的信用卡欺诈检测数据集为例来看看。我为这个演示创建了一个较小版本的数据集,有 57,355 行,每行代表一个事务。不过,我保留了欺诈/非欺诈交易之间的不平衡,其中只有 492 笔交易被标记为欺诈。

在 Alteryx Designer 中,使用基本数据分析工具频率表工具以及其他选项,很容易快速了解变量的分布。后者生成如下图所示的直方图,使数据集中的不平衡非常明显。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“类别”字段中 0 和 1 标签的直方图,其中 1 代表相对较少的欺诈交易。图片作者。

失去平衡

如果你反复随机选择这个数据集中的一行,然后问我这是不是一次欺诈交易,如果我只是一遍又一遍地说“不是”,我就很有可能是对的。类似地,如果你简单地根据这些不平衡的数据训练一个模型,并且只看你的模型的准确性,看起来你有一个令人惊讶的模型。您可以在本文中阅读更多关于为分类模型选择正确指标的信息;现在,请记住,对于不平衡的数据来说,准确性本身确实会产生误导。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像通过 GIPHY

举个简单的例子,让我们把我的迷你数据集分成 70%用于训练,30%用于验证。我可以天真地构建一个随机的森林模型,不调整目标类之间的平衡。(您可以通过打开 Alteryx 社区上原始帖子的附带的 Alteryx 包来跟进。)一开始我可能会印象深刻:哇,模型只错分了 40149 个观测值中的 70 个!但是让我们仔细看看:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

不幸的是,正如你所看到的,这个模型在预测非欺诈交易方面做得很好——但是,对不起,是信用卡账户持有人;它在检测欺诈的实际工作中表现不佳。是时候做些调整以获得更好的结果了!

关于抽样的思考

谢天谢地,我们有一些平衡数据集的方法来避免这种情况。让我们探索一些选项,从最简单到最复杂排列(但是仍然非常容易管理!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片经由 GIPHY

Alteryx 机器学习

如果你是第一批使用 Alteryx 机器学习的用户之一,你会很幸运——尤其是当你正在与不平衡的数据进行斗争的时候。Alteryx 机器学习将自动检查类标签的分布(例如,0/1、真/假等。)在您的数据集中。然后,它会根据数据集的大小应用适当的过采样或欠采样,以适应它发现的任何不平衡。例如,它可以应用过采样技术 SMOTE,我们稍后会讨论这一点。

在最初的“Auto Insight”数据探索阶段,Alteryx 机器学习生成了一个易于下载的图,如下图所示,显示了目标变量的类标签分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Alteryx 机器学习的目标变量标签分布柱状图。图片作者。

在这种情况下,如下图右侧所示,Alteryx 机器学习决定从我的不平衡数据集中的多数类(非欺诈性交易)中进行欠采样,然后构建一系列模型,以查看哪个表现最好。(Alteryx 机器学习速度如此之快,以至于我可以使用完整的数据集来代替样本。)

在这里,我选择了平衡精度作为评估模型的度量,随机森林分类器在比较中脱颖而出。当对维持数据进行评估时,该模型在过程的下一步中表现更好,平衡精度为 91%。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

Alteryx 智能套件

使用 Designer 中的智能套件,您有几个选项。首先,您可以使用 AutoML 工具来自动构建和评估模型,这些模型优先考虑您选择的度量标准。在该工具的高级参数选项中,您可以选择一个更适合不平衡数据集的指标,或者尝试多个选项以查看它们的比较情况。例如,您可以告诉工具在评估各种模型时优先考虑平衡的准确性或日志损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用两种不同的适合不平衡数据的目标函数选项设置 AutoML。图片作者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自两个自动生成模型的结果。图片作者。

在这里,辅助建模也是一个选项,但是您需要仔细查看模型排行榜,以了解各种指标的情况。同样,准确度不是唯一要考虑的指标,所以一定要检查每个型号的平衡准确度和 F1 分数,并确保您对您选择的型号在各个班级的表现感到满意。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些数据的辅助建模分类模型的结果。图片作者。

过采样现场工具

过采样现场工具包含在 Designer 中,非常容易使用,尽管它的名字有点混乱;它真正欠采样你的多数类,而不是过采样你的少数类。只需将它放入您的工作流中,告诉它您希望它调整哪个变量,该变量的“正”类是什么(例如,在本例中,“1”表示“欺诈性的”),以及您希望数据集中的类比例是多少。本质上,这个工具将随机删除足够多的“负面”案例,以达到这些比例。

但是,根据数据集的大小和正类的相对出现频率,最终可能会留下非常少的记录,因此,您没有多少信息来构建模型。例如,如果您有 1000 条记录,其中只有 100 条表示正类,并且您要求工具为您实现 50/50 的平衡,那么您最终将只有 200 条记录来构建您的模型。对于您的特定建模需求来说,这可能不太理想。

简单过采样

另一种平衡方法是根据目标变量的值对训练数据进行分层,然后从较小的“少数”类中随机抽样替换。目标是在训练数据集中过多地呈现这些观察结果。然而,这种“幼稚”的采样方法会产生重复的数据,并可能导致您的模型从这些数据点学到太多东西,从而可能导致过度拟合。

幸运的是,聪明的机器学习研究人员已经开发出更复杂的方法来实现平衡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像通过 GIPHY

介绍 SMOTE

另一种平衡数据的方法是 SMOTE,代表合成少数过采样技术。SMOTE 是一种广泛使用的处理类不平衡的技术。基本上,这种方法会为您弥补一些数据,但这是一种好的方式。“合成”部分是指生成与少数类中的数据相似的额外数据的过程,这些额外数据可以添加到数据集中以平衡这些类。

SMOTE 的工作方式是选择一个表示少数类的观测值,查找其最近邻点(您可以指定数量),并使用所选观测值和邻点之间的关系来生成少数类的新示例。

SMOTE 家族宏

应用 SMOTE 的一种方法是使用 SMOTE 家族宏,它是由 Alteryx 社区成员@ Timothy创建的,包含在本文所附的 Alteryx 包中。这个基于 R 的宏使用了 smotefamily 包,其中包含了各种实现基于 SMOTE 技术的方法。

例如,在所附的工作流中,通过 SMOTE 系列宏传递数据并使用常规 SMOTE 选项,实现了更好的平衡:39,791 个非欺诈性交易和 39,738 个“欺诈性”交易。后者中,只有 492 个在我的原始数据中,而其余的都是合成的。

接下来,让我们重新看看我之前尝试的随机森林模型,但是现在使用的是后 SMOTE 数据集。我的模型现在可以从更多的例子中了解欺诈交易(即使其中大多数是合成的),因此,它可以更好地对数据进行分类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 SMOTE 系列宏处理的数据构建的模型的性能。图片作者。

后 SMOTE 模型并不完美,但它只对 27 个交易进行了错误分类,并且它的准确性在两个类别中大致相同,而不是在一个类别中比另一个类别中犯更多的错误。

除了宏中提供的配置选项之外,请记住,您还可以打开宏并根据自己的需要修改它的代码。本文提供了在 Designer 中使用 R 的一些细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像通过 GIPHY

Python 中的 SMOTE

最后,如果您最喜欢 Python 解决方案,您可以使用不平衡学习库来实现各种采样方法,这些方法可以解决您的数据不平衡,包括 SMOTE。在工作流中使用这种方法只需要 Python 工具中的几行代码,正如您在附带的演示中所看到的。然而,这种方法提供了大量的定制选项。

您将需要安装该软件包,因为它不包含在设计器中;这意味着您需要以管理员身份运行 Designer。这一步完成后,您只需将数据集分为预测变量和目标变量,使用 SMOTE 或您从库的选项中选择的方法进行重新采样,然后重新组装数据集。然后,您可以从 Python 工具中写出更加平衡的、部分合成的数据,以便在工作流中以您喜欢的方式进一步使用。

我正是这样做的,然后再次使用森林模型工具来构建一个随机的森林模型。结果看起来很像基于上述 SMOTE 系列宏数据构建的模型的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 SMOTE 处理数据建立的模型的性能,通过 Python 工具中的不平衡学习实现。图片作者。

这里,总体准确性更好,并且模型的错误在两个类之间平均分布,而不是在原始数据中较少表示的“少数”类上表现不佳。

让我们将所有三个模型——简单模型和两个 SMOTE 'd 模型——都放入模型比较工具中,以便进行整体观察:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型比较工具对三种模型性能的报告。图片作者。

从上表的比较报告中可以看出,所有三种型号的总体准确率都超过了 99%。然而,建立在不平衡数据上的朴素模型对欺诈交易的性能较低。这两个建立在更平衡数据基础上的模型表现都稍好。如果我们使用 Kaggle 上提供的完整数据集,有近 300,000 个事务,我们可能会获得更好的性能。此外,如果像检测欺诈这样的潜在成本很高的事情,即使是很小的性能改进也可能在财务上非常有意义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像通过 GIPHY

找到完美的平衡

现在,您拥有了新的工具,可以在数据和生活中找到平衡!好吧,至少在数据上是这样,尽管更好的模型可能也会给你带来快乐。请务必查看下面推荐的阅读链接,了解解决这一重要问题的更多信息和选项。

推荐阅读

原载于 Alteryx 社区数据科学博客

平衡就是不平衡

原文:https://towardsdatascience.com/balancing-is-unbalancing-5f517936f626?source=collection_archive---------33-----------------------

入门,机器学习

不平衡分类背后的理论

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿马尔·埃拉米尔Unsplash 上拍摄的照片

不平衡分类是一个监督的最大似然问题,其中类别分布非常不均匀(例如,5%正的和 95%负的),并且通常,对具有少数类别标签的数据的决策是重要的,是正确的。在这种情况下,训练更具挑战性,因为使用普通方法,模型越来越偏向于估计具有多数标签的类(多数类),而大多数时候,我们关心的是正确估计少数类。开发了不同的技术来克服这一挑战,例如重采样或加权;都试图以某种方式创建一个平衡的数据集,然后使用共同的方法。虽然这些技术在应用中是有益的,但它们对我来说都是启发性的,我无法找到该问题的精确数学定义。所以我决定思考到底会发生什么,这份文件是我对不平衡数据挑战的理解。

判别模型是如何工作的?

监督概率机器学习的主要关注点是使用条件似然最大化来估计具有参数分布的*p(y | x)*q(y | x,θ) ,这可以通过采用交叉熵损失函数(又名 log-loss)来完成。此外,最小化交叉熵损失函数等价于最小化真实条件分布和估计条件分布之间的 KL 散度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个等式中, H(Y|X) 是常数,所以为了最小化期望的 KL 散度,我们应该最小化第二项,它等于对数损失。为了最小化对数损失,首先,我们需要来自 p(x,y) 的样本来估计期望值,然后,我们可以解决一个优化问题,找到 q(y|x,θ) 作为对 p(y|x)的估计。

但是如果我们只有来自 p’(x,y) = p(x|y) p’(y) 的样本而不是 p(x,y) 其中 p’(y) 是不同于 p(y) 的经验边际分布呢?我们可以将对数损失改写如下,并使用样本重量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它表明,要学习 p(y|x) 我们需要将样本权重设置为p(y)/p’(y),如果经验边际分布与真实边际分布相同,则等于 1。因此,如果 p(y+)=5% ,但是数据集是平衡的并且 p’(y+)=50 %,我们需要将样本权重设置为 0.1 。这与我们对不平衡数据集所做的正好相反,在不平衡数据集上,我们认为平衡后权重相等。因此,主要问题是使用不平衡数据集的真实边际分布有什么问题?困难就在这里,平衡是解决问题的方法。

不平衡数据有什么特别之处?

当我开始思考这个问题时,首先我记得偏向多数类并以此预测所有样本,因此我认为这个问题可能是由于优化问题的难度和陷入局部最优。事实上,对于不平衡的数据集,边缘分布和条件分布在很大程度上几乎是相同的,这与平衡数据集不同。所以通过设置 q(y|x)=p(y) 并用 p(y) 预测 p(y|x) ,交叉熵等于 H(Y) 这么小。因此,我认为用多数类预测可能是参数空间中的强局部最优。但后来我想起,损失函数是凸的逻辑回归,所以它应该训练没有任何问题。在下面的例子中,在没有使用任何平衡技术的情况下,逻辑回归在不平衡数据上工作得很好,我们可以用 σ(wᵀx) 很好地估计 p(y+|x) :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。在不平衡数据集(5%-95%)上进行 logistic 回归的结果确实不错。

经过这次模拟,我提醒说,在我的经验中,不存在少数类概率接近 1 的特征空间区域(如上图),通常多数类几乎处处可见,只是概率不同。作为另一个例子,考虑下图,让我们看看逻辑回归是如何工作的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。在另一个不平衡数据集(5%-95%)上的 logistic 回归结果确实很差。

你可以观察到,logistic 回归模型没有学好,我们无法用 σ(wᵀx).估计 p(y|x) 通过这些观察,我们可以提出一个重要的问题:**为了使我们能够用 σ(wᵀx) 来估计 p(y|x) ,应该满足的关于数据的潜在假设是什么?**答案可在【1】中找到:类后验分布 p(y|x) 可写成 σ(wᵀT(x)当且仅当类条件分布( p(x|y+) 和 p(x|y-))来自同一个具有充分统计量的指数族 T(x)。例如,一个常见的情况是当类条件分布都是正态分布,我们想要区分它们;在这种情况下,充分统计量是【x,x】,这导致二次判别式。如果我们想要一个线性判别式,正态分布的协方差矩阵应该是相同的,这导致二次项的消除(参见【2】的 4.84)。因此,假设我们有一个给我们带来具有相同协方差矩阵的正态类条件分布的特征提取器, σ(wᵀx)p(y|x)的一个好的估计量。

现在,让我们假设输入(或从输入中提取的特征,例如通过使用神经网络(参见[3]))具有正态类条件分布,并且我们正在处理一个不平衡数据集,其中多数类几乎在任何地方都具有高概率,甚至在少数类的区域中也是如此(与图 2 完全一样)。).在这种情况下,类别条件句的协方差矩阵不可能相同,并且固有地,多数类别的规模更大。此外,我们不能通过转换到核空间来克服这个问题,因为无论转换是什么,多数阶级都出现在少数阶级的区域中,此外还有其他一些少数阶级不存在的区域。因此,线性函数的逻辑 sigmoid 不是后验分布的良好估计。

平衡有什么帮助?

假设我们在选择逻辑回归模型时非常激进,尽管它是不平衡数据后验分布的弱学习器,但我们想使用它。在这种情况下,平衡使我们能够构建一个核空间,在其中我们对类条件分布具有相同的尺度,并且使逻辑回归成为一个合理的候选。这样一来,平衡就是一种躲闪:与其估计 p(y|x) (由于*p(y)**的不均匀性,这是不可能的),不如先在平衡设置下估计 p’(y|x) ,然后重构 *p(y|x)。因此,当我们平衡数据集时,我们破坏了真正的边际分布,更准确地说,我们破坏了它的本性。

假设我们已经正确预测了p’(y | x),在通过将 p(y) 变为p’(y)进行重采样并构建平衡数据集之后,其中p’(y+)p’(y-)都是 0.5。现在是重建 p(y|x) 的时候了,这可以通过下面的方法来完成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中我们在第二个方程中使用了 p’(x|y)=p(x|y) (因为我们刚刚改变了 yp(x|y) 的边际分布与 p’(x|y) 相同)。因此,具有p’(y | x)导致具有 p(y|x) 的缩放版本,这足以做出决策。

现在让我来讨论另外两个有趣的直觉,在第一个直觉中,我关注了少数群体的重要性,在第二个直觉中,我提出了我们如何用助推来模拟这个问题。

扩展交叉熵

考虑图 2,如果数据集是不平衡的,则逻辑斯蒂模型不能很好地预测后验分布,并且存在许多坏的局部最优,其中,只有少数高估了少数类的后验分布,而大多数低估了它。相反,通常,少数类的重要性更高,我们宁愿高估它的概率而不是低估它。通过增加来自少数类的样本的权重,我们将损失函数改变为以下形式并扩展交叉熵:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 ECE 是扩展的交叉熵,α表示 0 和 1 之间的样本权重,对于少数类较大,对于多数类较小(例如α₊=0.8 和α₋=0.2,其和为 1)。以下两个数字比较了α₊=0.5 和α₊=0.8.的 ECE 很明显,在图 4 中,我们对 p(y+|x) 低估的惩罚远远大于对其高估的惩罚。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图三。α₊=0.5 欧洲经委会(无余额)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4。α₊=0.8.欧洲经委会高估比低估受到的惩罚要少。

同样将 ECE 相对于 q 的导数设置为零,我们可以发现 ECE 的极小值为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即等于 p(y+|x) 如果α₊=0.5.这个等式也给了我们一种从 q(y|x) 重建 p(y|x) 的方法,其中 q 是在平衡数据集上估计的。

平衡和增压

逻辑回归是不平衡数据的弱分类器,但是正如我们所知,将一些弱分类器组合起来可以得到一个强分类器。Boosting 是通过在每一步增加误分类样本的权重来顺序集成弱学习者的方法之一。平衡数据集就像考虑一个两阶段 AdaBoost,其中第一个弱分类器只学习多数类,第二个在 50–50 平衡数据集上训练,然后它被用作主分类器。

笔记

  1. 阿林达姆·班纳吉。逻辑模型分析:指数家庭联系和在线绩效。2007 年 SIAM 数据挖掘国际会议论文集。
  2. 克里斯托弗·m·毕晓普模式识别和机器学习*。斯普林格,2006 年。*
  3. 考虑到深度分类器使用逻辑 sigmoid 或 softmax 函数来估计提取特征空间上的 p(y|x) ,这种讨论的重要性更加明显。事实上,深度模型首先将数据转换到输出层之前的层中的特征空间,然后使用与逻辑回归相同的方法来估计后验分布。因此,如果有任何重要的假设,深度模型应该能够建立一个拥有这些假设的特征空间。

平衡您的数据…

原文:https://towardsdatascience.com/balancing-your-data-bd97123a7aaf?source=collection_archive---------46-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

罗伯特·阿纳奇在 Unsplash 上的照片

‘如果你被问题的大小压垮了,把它分成小块……’

机器学习中的类不平衡是一个重要的问题,也是处理数据集时最受关注的问题之一。具有类不平衡的数据集往往更具欺骗性,如果处理不当,其结果可能会导致错误的决策。

最近,我碰巧在一个具有显著的类不平衡的数据集中工作。由于我不是数据生成技术的狂热爱好者,并且由于不平衡严重,dint 希望使用分层 K-fold 之类的技术,所以我使用了一种比传统技术好不了多少的技术来帮助模型学习数据。也许我使用这个技术有点晚了,但我想我会在这里分享它,以便它对某人来说是新的和有用的。

import pandas as pdtrain=pd.read_csv('/Desktop/Files/train_data.csv')
print(train['Top-up Month'].value_counts())No Top-up Service    106677
 > 48 Months           8366
36-48 Months           3656
24-30 Months           3492
30-36 Months           3062
18-24 Months           2368
12-18 Months           1034
Name: Top-up Month, dtype: int64

以上是来自训练数据的因变量的值计数。从上面可以清楚地看出,在“无充值服务”类别和其他类别之间存在严重的类别不平衡。

方法…

因此,我在这里采用的方法是将多数类数据分成大小为“n”的小折叠。每个数据块(文件夹)将具有与多数类相关“k”个数据点。所有其他次要类别的数据点被组合在一起(“m”)

def chunks(df,folds):

    df_no_topup=df.loc[df['Top-up Month']==0]
    df_topup=df.loc[df['Top-up Month']==1]

    recs_no_topup=int(df.loc[df['Top-up Month']==0].shape[0]/folds)

    start_no_topup=0
    stop_no_topup=recs_no_topup
    list_df=[]

    for fold in range(0,folds):
        fold_n=df_no_topup.iloc[start_no_topup:stop_no_topup,:]
        start_no_topup=stop_no_topup
        stop_no_topup=start_no_topup+recs_no_topup
        df=pd.concat([fold_n,df_topup],axis=0)
        list_df.append(df)
    return list_df

上面的代码片段将主类数据分成多个文件夹,每个文件夹包含相同数量的数据点。然后,多数类数据的第一个 fold(在上面的代码中称为 fold_n)与次要类(df_topup)的所有数据连接在一起。这发生在一个循环中,并且该循环将继续,直到等于折叠“n”的大小。可以看出,每次,多数类数据的新块都与次要类的相同(完整)数据连接,从而允许模型在训练阶段训练相等比例的数据。

Major class initially - 106677
Fold size(n) - 5
Major class data(k) per fold=106677/5 - 21335
Minor class(all minor classes combined) - 21978
Total data per fold(major+minor) - 43313

下面的代码片段可以验证这一点。

list_data=chunks(df_train_main,5)
list_data_shape=[df.shape for df in list_data]
print(list_data_shape)[(43313, 6), (43313, 6), (43313, 6), (43313, 6), (43313, 6)]

现在可以看到,一个具有严重类别不平衡问题的大数据集已被分成 5 个类别不平衡程度较轻的小数据集(因为一些次要类别与主要类别相比仍然不平衡)

然而,以下是我从上述方法中认识到的两个问题:

  • 添加到每个文件夹的多数类数据的分布。由于我们只是将整个主要类别数据划分为多个折叠(n ),每个折叠大小相等(k ),因此任何折叠中主要类别数据的分布可能不是训练数据中主要类别总体数据的样本表示。
  • 在需要解决的所有问题中,类别(12-18 个月)和主要类别(“无充值服务”)之间仍然存在不平衡。但是在二进制类的情况下,这种方法效果更好。

然后将这些折叠的数据传递给一个模型,以使用更少的不平衡数据来训练该模型。这是一种通用方法,除了结构化数据之外,它甚至可以应用于图像等非结构化数据。我个人在一次 Kaggle 比赛中使用了同样的方法进行图像分类,并获得了更高的准确率。

尝试一下,并告诉我们您对该方法的宝贵想法……

Bamboolib:你见过的最有用的 Python 库之一

原文:https://towardsdatascience.com/bamboolib-one-of-the-most-useful-python-libraries-you-have-ever-seen-6ce331685bb7?source=collection_archive---------3-----------------------

大蟒

这是我对这个很酷的 Python 库的看法,以及为什么你应该试一试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由来自 Pexels安德里亚·皮亚卡迪奥拍摄

我喜欢写关于 Python 库的文章。如果你读过我的博客,你可能知道我写过关于多个图书馆的文章。在写之前,我测试了一些 Python 库,检查了它们最显著的特性,如果我喜欢,我会写一些关于它们的内容。通常,我会尝试在同一个博客中包含几个库,以使它更具知识性。然而,偶尔,我发现那些非常酷的图书馆应该拥有自己的博客。Bamboolib 就是这样!

Bamboolib 是那种让你思考的库:我以前怎么不知道呢?是的,这听起来有点戏剧性,但是相信我,你会惊讶的。Bamboolib 可以为需要一段时间才能编写的东西构建代码,比如复杂的 group by 子句。让我们直接开始吧,因为我很高兴向你们展示它是如何工作的。

bamboo lib——适合初学者和专业人士

Bamboolib 自称可以让任何人不用成为程序员或搜索语法就可以用 Python 进行数据分析。根据我的测试,这是真的!它要求零编码技能。然而,我认为它对于时间紧迫的人或者不想为简单的任务键入长代码的人来说是非常方便的。我也可以看到学习 Python 的人如何利用它。例如,如果你想学习如何用 Python 做一些事情,你可以使用 Bamboolib,检查它生成的代码,并从中学习。

不管是哪种方式,我们来探讨一下你如何使用它,你可以决定它是否对你有帮助。我们开始吧!

装置

安装 Bamboolib 很简单。我在这个博客中写过不同的安装方法,展示了如何在安装 Bamboolib 之前创建一个环境。如果你没有心情创建一个新的环境,你可以在你的终端中输入pip install — upgrade bamboolib — user ,它会工作得很好。现在你可以通过输入import bamboolib as bam将它导入到 Jupyter 笔记本中,我们就可以开始了。

现在,我们需要一个数据集。我将使用所有视频游戏销售数据集,因为它看起来很有趣,但你可以使用任何你喜欢的东西。一旦你下载了你的数据集,让我们导入它,这时我们就可以开始使用 Bamboolib 了。

第一步

还记得我说过 Bamboolib 不需要编码吗?我是认真的。要将数据集导入到您的 Jupyter 笔记本中,请键入bam,它将向您显示一个用户界面,您可以通过三次点击来导入数据集。

Type bam > Read CSV file > Navigate to your file > Choose the file name > Open CSV file

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

注意 Bamboolib 导入了 Pandas 并为您创建了代码。是的,在整个项目中都会这样。

数据准备

将字符串更改为日期时间

您加载了数据,并意识到日期列是一个字符串。然后,单击列类型(列名旁边的小字母),选择新的数据类型和格式,如果需要,选择一个新名称,然后单击执行。

你是否看到单元格中也添加了更多的代码?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

另外,user_review列似乎是一个对象。让我们通过创建一个整数来解决这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

还记得我说过列名旁边的小字母是列数据类型吗?如果你看一下user_review 列名旁边的字母,你会看到一个f,而不是整数中的i,尽管我把数据类型改成了整数。这是因为 Bamboolib 将数据类型理解为 float,所以它没有抛出错误,而是为您修复了错误。

用不同的数据类型和名称创建新列

如果您不需要更改列的数据类型和名称,而是需要一个具有不同数据类型和名称的新列,该怎么办呢?只需单击列数据类型,选择新的格式和名称,然后单击执行。您将立即看到数据集中的新列。

在下图中,我选择了meta_score列,将数据类型改为 float,选择了一个新名称,新列就创建好了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

删除列

如果您意识到不需要列,只需在搜索转换框中搜索 drop,选择 drop,选择要删除的列,然后单击执行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

重命名列

现在您需要重命名一个列,这再简单不过了。只需搜索 rename,选择要重命名的列,写下新的列名,然后单击 execute。您可以选择任意多的列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

拆分字符串

假设您需要将包含人名的列拆分为两列,一列包含名字,另一列包含姓氏。你可以很容易做到这一点。出于演示的目的,我将游戏名称拆分,这实际上没有意义,但您可以看到它是如何工作的。

只需在搜索转换框中键入 split,选择要拆分的列、分隔符和最大列数。嘣!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

因为这只是一个演示,所以让我们删除额外的列。搜索删除,选择要删除的列,然后在执行中单击。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

选择列

然后,我们可以选择只显示几列。在这里,我将选择游戏名称、平台和分数。只需在搜索转换中键入 select,选择您想要选择的列并执行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

在这些步骤的最后,Bamboolib 创建了以下代码,即使某人没有安装 Bamboolib,也可以使用这些代码。很酷,对吧?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

数据转换

过滤数据

如果您想要过滤您的数据集或使用过滤的信息创建一个新的数据集,您可以在搜索转换中搜索过滤器,选择您想要过滤的内容,决定您是否想要创建一个新的数据集,然后单击执行。就这么简单!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

合并数据

如果需要合并两个数据集,只需搜索 merge,选择要合并的两个数据集、连接类型,选择要用于合并数据集的键列,然后单击“执行”。您可以创建一个新的数据集或只编辑当前的数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

提取日期时间属性

如果您想从日期列中提取一个字符串,比如星期几和月份,您知道代码吗,或者您必须搜索它吗?嗯,有了 Bamboolib,两者都不需要。只需搜索 extract datatime 属性,选择 date 列,然后选择要提取的内容。

有多种选择供你选择。我必须承认,我不知道如何做到这一点,甚至不知道用熊猫做这件事是否可能…我只是学到了一些新东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

分组依据

使用分组是你可以对熊猫做的最有价值的事情之一。然而,它有时会变得非常复杂。幸运的是,Bamboolib 可以让分组变得非常直观和简单。搜索“分组依据”在“搜索转换”框中,选择要分组的列,然后选择要查看的计算。

在这个例子中,我希望看到每个平台的游戏的计数和平均分数。这样做,我才知道 PlayStation 4 在所有平台中平均得分最低。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

数据可视化

Bamboolib 是创建快速数据可视化的伟大工具。例如,要创建直方图,单击 create plot,选择图形类型、x 轴,就差不多了。你刚刚用四次点击创建了一个漂亮的图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

或者您可以创建一个箱形图。过程非常相似。很好很容易!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有许多其他类型的图表可供探索,但 all games 数据集并不是创建图表的最佳选择。不过,您可以用其他数据集来测试这个特性。有很多值得探索的地方。

数据探索

Bamboolib 让数据探索变得超级简单。只需点击一下,您就可以从您的数据集中获得见解。为此,单击 Explore DataFrame,它将返回诸如平均值、中值、四分位数、标准偏差、观察值数量、缺失值、正面和负面观察值数量等信息。它还创建图表,以便您可以了解数据分布。

如果数据集中有 DateTime 数据类型,它还可以创建图表来显示数据在一段时间内的变化情况。因此,您不必浪费时间创建单独的图表来理解数据集,而是可以使用此功能来深入了解数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者 GIF

最后的想法

唷!我现在对给予这个图书馆应有的关注感到满意。是的,我知道这不是第一个关于 Bamboolib 的博客,但是我想谈谈我的看法。还有很多要探索的。Bamboolib 有很大的潜力来改变我们分析数据和学习的方式。我使用熊猫已经有几年了,我学到了一些我们可以使用 Bamboolib 做的新东西。感谢阅读,下一篇博客再见。

你可能也会喜欢…

5 个你不知道但应该知道的 Python 库 4 个你应该知道的很酷的 Python 库4 个你现在就应该尝试的神奇的 Python 库

银行客户流失的潮汐模型——第一部分模型开发

原文:https://towardsdatascience.com/bank-customer-churn-with-tidymodels-part-1-model-development-cdec4eeb131c?source=collection_archive---------21-----------------------

利用潮汐模型探索不平衡分类

假设您是一家大型跨国银行的数据科学家,首席客户官找到您,希望开发一种预测客户流失的方法。您开发了一个包含 10,000 个客户的快照数据集,客户的类别不平衡度为 1:4,这有利于客户不离开来训练这样的二元分类模型。为了帮助模型开发,您决定研究各种可能有助于解决类别不平衡的采样技术。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jorge Fernández Salas 在 Unsplash 上拍摄的照片

这个由多个部分组成的系列将涵盖开发和解释模型过程中的以下主题,重点是将模型输出转化为业务成果,并与高级风险承担者进行沟通。

最终目标是创建一个模型,使银行能够锁定可能被归类为客户流失的当前客户,并应用一些干预措施来防止客户流失。干预是有代价的,所以我们将寻求平衡假阴性率和假阳性率。我们将在第 2 部分用可能是包开发一个成本函数和阈值分析。

第 3 部分将通过使用 DALEX/DALEXtra XAI 套餐,重点了解客户流失更为突出的可变空间,并使我们能够在本地和全球层面了解导致客户流失的主要因素。

在第 4 部分中,我们将采用不同的方法,将生存分析方法应用于该数据集,因为它经过了适当的审查,并利用最近在 tidymodels 中发布的生存分析功能,突出了事件发生时间(任期)和结果。

加载包

library(tidymodels)
library(themis) **#Recipe functions to deal with class imbalances**
library(tidyposterior) **#Bayesian Resampling Comparisons**
library(baguette) **#Bagging Model Specifications**
library(corrr) **#Correlation Plots**
library(readr) **#Read .csv Files**
library(magrittr) **#Pipe Operators**
library(stringr) **#String Manipulation**
library(forcats) **#Handling Factors**
library(skimr) **#Quick Statistical EDA**
library(patchwork) **#Create ggplot Patchworks**
library(GGally) **#Pair Plots**options(yardstick.event_first = FALSE) **#Evaluate second factor level as factor of interest for yardstick metrics**

加载数据

数据取自https://www.kaggle.com/shivan118/churn-modeling-dataset(LicenseCC0:Public Domain)并加载如下。

train <- read_csv("Churn_Modelling.csv") %>% 
  select(-c(Surname, RowNumber, CustomerId))

探索性数据分析

我喜欢 skimr 包快速提供所有数据集变量的摘要。

skim(train)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 Skim 输出(图片由作者提供)

我们的目标变量 Exited 在两种可能的结果之间具有大约 4:1 的比率,其中 Exited = 1 表示客户流失。为了形象化这一点,我们采用下面的自定义函数。

viz_by_dtype <- function (x,y) {
  title <- str_replace_all(y,"_"," ") %>% 
           str_to_title()
  if ("factor" %in% class(x)) {
    ggplot(train, aes(x, fill = x)) +
      geom_bar() +
      theme_minimal() +
      theme(legend.position = "none",
            axis.text.x = element_text(angle = 45, hjust = 1),
            axis.text = element_text(size = 8)) +
      scale_fill_viridis_d()+
      labs(title = title, y = "", x = "")
  }
  else if ("numeric" %in% class(x)) {
    ggplot(train, aes(x)) +
      geom_histogram()  +
      theme_minimal() +
      theme(legend.position = "none") +
      scale_fill_viridis_d() +
      labs(title = title, y = "", x = "")
  } 
  else if ("integer" %in% class(x)) {
    ggplot(train, aes(x)) +
      geom_histogram() +
      theme_minimal() +
      theme(legend.position = "none") +
      scale_fill_viridis_d()+
      labs(title = title, y = "", x = "")
  }
  else if ("character" %in% class(x)) {
    ggplot(train, aes(x, fill = x)) +
      geom_bar() +
      theme_minimal() +
      scale_fill_viridis_d() +
      theme(legend.position = "none",
            axis.text.x = element_text(angle = 45, hjust = 1),
            axis.text = element_text(size = 8)) +
      labs(title = title, y  ="", x= "")
  }
}
variable_list <- colnames(train) %>% as.list()
variable_plot <- map2(train, variable_list, viz_by_dtype) %>%
  wrap_plots(               
    ncol = 3,
    heights = 150,
    widths = 150)
ggsave("eda.png", dpi = 600)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

viz_by_dtype 函数的输出(图片由作者提供)

从上面我们可以更好地理解连续变量的分布和离散变量的计数。

  • 信用评分大致呈正态分布
  • 地理分布在三个国家,以法国为主
  • 性别几乎是均等的
  • 年龄近似右偏正态分布
  • 任期没有明显的分布,大多数客户的任期在 2-9 年之间
  • 余额通常分配给大量余额为零的客户
  • 大多数客户要么有 1 种,要么有 2 种产品
  • 有信用卡表明 70%的客户有信用卡
  • 活跃会员显示 51.5%的客户是活跃用户
  • 估计工资没有明显的分布

二元数值分析

现在我们将使用 GGally::ggpairs()来了解数字变量之间是否有任何关系

ggpairs(train %>% 
          select(-c(HasCrCard,IsActiveMember,NumOfProducts, Gender, Geography)) %>% 
          drop_na() %>% 
          mutate(Exited = if_else(Exited == 1, "Y","N")), ggplot2::aes(color = Exited, alpha = 0.3)) + 
  scale_fill_viridis_d(end = 0.8, aesthetics = c("color", "fill")) + 
  theme_minimal() +
  labs(title = "Numeric Bivariate Analysis of Customer Churn Data")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按目标排列的数值对图(按作者排列的图片)

上面唯一值得注意的是,有过搅动的客户向右移动,这表明年纪大的客户离开的可能性更大。

分类变量分析

下一步是确定分类变量和目标之间是否有任何关系。

下文描述了汇总数据框架的创建,该数据框架计算每个分类变量和目标变量的平均值和 95%置信区间。

train %>% 
  mutate(Exited = if_else(Exited == 1, "Y", "N"),
         HasCrCard = if_else(HasCrCard == 1, "Y", "N"),
         IsActiveMember = if_else(IsActiveMember == 1, "Y", "N"),
         NumOfProducts = as.character(NumOfProducts)) %>% 
  select(Exited,where(is.character)) %>% 
  drop_na() %>% 
  mutate(Exited = if_else(Exited == "Y",1,0)) %>% 
  pivot_longer(2:6, names_to = "Variables", values_to = "Values") %>% 
  group_by(Variables, Values) %>% 
    summarise(mean = mean(Exited),
              conf_int = 1.96*sd(Exited)/sqrt(n())) %>% 
  ggplot(aes(x=Values, y=mean, color=Values)) +
    geom_point() +
    geom_errorbar(aes(ymin = mean - conf_int, ymax = mean + conf_int), width = 0.1) +
    theme_minimal() +
    theme(legend.position = "none",
        axis.title.x = element_blank(),
        axis.title.y = element_blank()) +
   scale_color_viridis_d(aesthetics = c("color", "fill"), end = 0.8) +
   facet_wrap(~Variables, scales = 'free') +
   labs(title = 'Categorical Variable Analysis', subtitle = 'With 95% Confidence Intervals')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95%置信区间的分类变量分析(图片由作者提供)

值得注意的是,我们看到性别、非活跃会员、产品数量和地理位置显示出明显不同的流失倾向。相反,客户是否有信用卡对客户流失的可能性没有显著影响。考虑到阶级的不平衡,这一点应该有所保留。

模型开发

数据分割—r 样本

使用 rsample::initial_split(),我们指定了一个 3:1 的训练数据拆分。

set.seed(246)
cust_split <- initial_split(train, prop = 0.75, strata = Exited)

型号规格— Parnsip &长方形

我们将使用 parsnip 和 baguette 包(针对 bag_trees)将模型规范的范围限制为那些基于树的模型,这些模型的复杂性在不断增加。每个模型指定其各自的超参数设置为 tune(),用于下一步筛选。

dt_cust <- 
decision_tree(cost_complexity = tune(), tree_depth = tune(), min_n = tune()) %>% 
  set_engine("rpart") %>% 
  set_mode("classification")rf_cust <- 
rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")xgboost_cust <- 
boost_tree(mtry = tune(), trees = tune(), min_n = tune(), tree_depth = tune(), learn_rate = tune(), loss_reduction = tune(), sample_size = tune())  %>% 
  set_engine("xgboost") %>% 
  set_mode("classification")bagged_cust <- 
bag_tree(cost_complexity = tune(), tree_depth = tune(), min_n = tune()) %>% 
  set_engine("rpart") %>% 
  set_mode("classification")

特征工程—配方

接下来,我们将使用 recipes 包指定特征工程步骤。我们将利用这一阶段开发 10 个配方,每个配方都有不同的采样技术来处理类别不平衡。 themis 包提供了方便不同取样技术的配方步骤。

  • SMOTE——合成少数过采样技术
  • ROSE——随机过采样技术
  • 边界合成少数过采样技术
  • 向上采样-将重复的少数类数据添加到与多数类的指定比率中
  • ADASYN——自适应合成过采样
  • TOMEK-删除多数类中的 TOMEK 链接
  • NEARMISS 通过欠采样移除多数类实例
  • 无采样—无采样程序
  • 平滑缩减采样-生成合成少数实例并移除多数实例
  • ROSE-下采样-过采样少数实例,下采样多数实例
recipe_template <-
    recipe(Exited ~., data = training(cust_split)) %>% 
    step_integer(HasCrCard, IsActiveMember, zero_based = T) %>% 
    step_integer(NumOfProducts) %>% 
    step_mutate(**SalaryBalanceRatio = EstimatedSalary/Balance,
              CreditScoreAgeRatio = CreditScore/Age,
              TenureAgeRatio = Tenure/Age,
              SalaryBalanceRatio = if_else(is.infinite(SalaryBalanceRatio),0,SalaryBalanceRatio)**) %>% 
    step_scale(all_numeric_predictors(), -c(HasCrCard, Age, IsActiveMember, NumOfProducts)) %>% 
    step_dummy(all_nominal_predictors()) %>% 
    **step_samplingmethod**(Exited) **#Change or Add Sampling Steps Here as Necessary**

上面我们已经设计了附加功能,采用不同连续变量的商。

相关图— corrr

我们可视化整个训练数据集的相关图,使用没有应用采样技术的配方。

cust_train <- recipe_8 %>% prep() %>% bake(new_data = NULL)
cust_test <- recipe_8 %>% prep() %>% bake(testing(cust_split))cust_train %>% 
  bind_rows(cust_test) %>% 
  mutate(Exited = as.numeric(Exited)) %>% 
  correlate() %>%
  rplot(print_cor = T, .order = "alphabet") +
    scale_color_gradient2(low = 'orange', high = 'light blue') + 
    theme(axis.text.x = element_text(angle = 90)) +
    labs(title = "Correlation Plot for Trained Dataset")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练数据集的相关图(图片由作者提供)

在上面,年龄和我们生成的衍生比率之间的负相关并不令人惊讶。Exited 与年龄正相关,与 credit score 比率稍负相关,与 SalaryBalanceRatio 比率稍正相关。

工作流图—工作流集

使用 workflowsets 软件包,我们可以在 parsnip 和 recipes 组合之间生成 40 个工作流程的列表,并为每个工作流程筛选 20 个超参数组合。我们使用 rsample::vfold_cv()创建一个 5 重交叉验证对象,使用 strata kwarg to Exited,这样每个折叠都具有目标变量水平的一致比率。

recipe_list <- 
list(SMOTE = recipe_1, ROSE = recipe_2, BSMOTE = recipe_3, UPSAMPLE = recipe_4, ADASYN = recipe_5, TOMEK=recipe_6, NEARMISS = recipe_7, NOSAMPLING = recipe_8, SMOTEDOWNSAMPLE= recipe_9, ROSEDOWNSAMPLE = recipe_10)model_list <- 
list(Decision_Tree = dt_cust, Boosted_Trees = xgboost_cust, Random_Forest = rf_cust, Bagged_Trees = bagged_cust)wf_set <- 
workflow_set(preproc = recipe_list, models = model_list, cross = T)set.seed(246)
train_resamples <- 
vfold_cv(training(cust_split), v = 5, strata = Exited)class_metric <- metric_set(accuracy, f_meas, j_index, kap, precision, sensitivity, specificity, roc_auc, mcc, pr_auc)doParallel::registerDoParallel(cores = 12)
wf_sample_exp <- 
  wf_set %>% 
  workflow_map(resamples = train_resamples, 
               verbose = TRUE, 
               metrics = class_metric, 
               seed = 246)

我们使用 parsnip::metric_set()函数创建一组定制的评估指标。这些自定义指标与 wf_set 对象一起传递给 workflow_map,以筛选所有 40 个工作流并输出每个工作流的所有指标计算。现在可以分析产生的 workflow_set 对象 wf_sample_exp,并将其用于模型比较。

这在计算上相当费力,所以我建议启动所有可用的内核来缓解这一问题。

collect_metrics(wf_sample_exp) %>% 
  separate(wflow_id, into = c("Recipe", "Model_Type"), sep = "_", remove = F, extra = "merge") %>% 
  group_by(.metric) %>% 
  select(-.config) %>% 
  distinct() %>%
  group_by(.metric, wflow_id) %>% 
  filter(mean == max(mean)) %>% 
  group_by(.metric) %>% 
  mutate(Workflow_Rank =  row_number(-mean),
         .metric = str_to_upper(.metric)) %>% 
  arrange(Workflow_Rank) %>% 
  ggplot(aes(x=Workflow_Rank, y = mean, color = Model_Type)) +
    geom_point(aes(shape = Recipe)) +
    scale_shape_manual(values = 1:n_distinct(recipe_list)) +
    geom_errorbar(aes(ymin = mean-std_err, ymax = mean+std_err)) +
    theme_minimal() +
    scale_color_viridis_d() +
    labs(title = "Performance Comparison of Workflows", x = "Workflow Rank", y="Error Metric", color = "Model Types", shape = "Recipes") +
    facet_wrap(~.metric,scales = 'free_y',ncol = 4)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过各种分类指标比较所有工作流。(图片由作者提供)

以上内容的目的是展示一个分类指标的示例,人们可能会看到一个不平衡的数据集。我们想要一个能充分区分不同类别的模型,但考虑到我们的特殊问题,我们需要尽量减少假阴性(客户流失,但预测会不同)。第 2 部分讨论了一个成本函数,以找到干预成本和阶级分化之间的平衡。

鉴于类别不平衡,ROC AUC 和准确性不是合适的指标。 我们考虑精确召回的 AUC、KAP、J 指数、Mathews 相关系数和特异性。考虑到这一点,UPSAMPLE_Boosted_Trees 是一个强有力的候选,在所有这些指标上都有良好的结果。

贝叶斯模型比较—tidy poster

关注 J 指数,我们可以使用 tidyposterior 比较重采样后验分布。tidyposterior::perf_mod()采用包含 workflow_map 结果的 wf_sample_exp 对象,完成重采样的贝叶斯比较,并生成感兴趣的度量平均值的后验分布。注意:workflow_set 对象必须计算目标度量,否则将不起作用。

jindex_model_eval <- 
  perf_mod(wf_sample_exp, metric = "j_index", iter = 5000)
jindex_model_eval %>% 
  tidy() %>% 
  mutate(model = fct_inorder(model)) %>% 
  separate(model, into = c("Recipe", "Model_Type"), sep = "_", remove = F, extra = "merge") %>% 
  ggplot(aes(x=posterior, fill = Model_Type)) +
    geom_density(aes(alpha = 0.7)) +
    theme_minimal() +
    scale_fill_viridis_d(end = 0.8) +
    facet_wrap(~Recipe, nrow = 10) +
    labs(title = "Comparison of Posterior Distributions of Model Recipe Combinations", 
       x = expression(paste("Posterior for Mean J Index")), 
       y = "")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

工作流程的比较和取样程序对 J 指数的影响。(图片由作者提供)

上面有很多内容需要解释,但简而言之,它展示了处理类不平衡的采样过程的影响以及对 J 指数的影响。这可以针对任何度量来完成,并且我认为这是探索不同的上采样和下采样过程的影响的有用练习。我们注意到,与袋装采油树方法一样,助推采油树通常表现良好,这都取决于取样程序。

结束语

我们已经展示了一个具有 4:1 不平衡数据集的二元分类器的模型开发过程。我们性能最好的工作流以 XGBoost 模型为特色,该模型带有一个上采样过程来平衡类的比率。在第 2 部分中,我们将拟合模型,并使用 probably 包完成决策阈值分析,并开发两个场景——要么改变决策阈值以最小化流失和干预的成本,要么实现更好的阶级区分。第 2 部分将重点关注将模型输出转化为业务涉众,并使他们能够围绕客户流失的成本和风险做出明智的决策。

谢谢你的阅读,请留意后面的部分。我希望你能像我喜欢写作一样喜欢阅读这篇文章。如果你不是媒介会员,使用下面我的推荐链接,定期从我和其他优秀的媒介作者那里获得新出版物的更新。

https://mmgillin.medium.com/membership

考虑可再生能源出力不确定性的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定性的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定性的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济性。文中可能涉及不确定性建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效性。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定性并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文中提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定性处理方法与需求响应机制的设计逻辑,同时可参考文档中列出的其他资源进行扩展学习与交叉验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值