卷积与互相关
这篇文章将概述卷积和互相关的区别。这篇文章是网上唯一包含卷积和互相关的一步一步的例子的资源(据我所知,相信我,我做了很多搜索)。这篇文章还精确地讨论了指数,事实证明,如果你想通过例子证明卷积和互相关是如何相关的,那么正确使用指数是至关重要的。我花了很大一部分时间来准备这篇文章,为索引而紧张得要命,但现在它们都很漂亮,而且组织有序,供你欣赏。
首先,关于这个话题的一点动机…
动机
要理解 CNN 中的反向传播就要理解卷积和互相关的区别,要理解解卷积(一种 CNN 可视化技术),要理解解卷积和显著图(更可视化),要理解引导反向传播(更可视化),要理解 Grad-CAM (更可视化)因此,尽管“卷积与互相关”可能一开始看起来跑题了,但这篇文章实际上仍然是 CNN 热图系列的一部分。
关于 CNN 的回顾,请参见卷积神经网络介绍。
既然你的积极性很高,让我们开始吧!
高层总结
互相关和卷积都是应用于图像的操作。互相关意味着在图像上滑动一个核(过滤器)。卷积意味着在图像上滑动翻转的内核。机器学习库中的大多数卷积神经网络实际上是使用互相关来实现的,但它在实践中不会改变结果,因为如果使用卷积来代替,则在翻转的方向上会学习到相同的权重值。
跟踪指数
为了使卷积和互相关的例子和方程清晰,我们需要跟踪我们的图像索引、核索引和输出索引。
首先,这里有一个常用来解释卷积的图,其中内核(黄色)滑过图像(绿色)产生输出(粉红色):
当我们对图像进行索引时,我们称哪个像素为[0,0]?我们可以选择左上角,或者中心,或者其他任意的像素。类似的,我们在内核或者输出中怎么称呼[0,0]?
对于图像、内核和输出,我们将中心元素称为[0,0]。这个决定对于让公式很好地工作是很重要的。
盘旋
卷积设置:符号&方程
网上有很多关于卷积的方程,都有不同的符号和索引。例如:
在本文的剩余部分,我们将使用下面的符号,其中图像被称为 x ,内核被称为 h ,输出被称为 y :
这是宋浩安在他们关于 2D 卷积的有用帖子中使用的符号。
星号用于表示卷积运算。因此, x [m,n] h [m,n】意味着我们将图像 x 与内核 h 进行卷积,以找到输出 y 中位置[m,n]处的值。总和超过 I 和 j,它们是图像像素的索引。
这里有一个内核(过滤器)的绘图,其中我们看到内核的中心是[0,0],正如我们之前决定的。 m (红色)水平索引成列, n (绿色)垂直索引成行内核:
内核元素的索引显示在左边,红色和绿色。实际的内核数值表示为变量 a、b、c、d、e、f、g、h 和 I,如右图所示。(内核中的这些数值是 CNN 在训练过程中学习到的。)
最后,这里是 7 乘 7 的图像 x ,索引从-3 到 3:
这是图像 x 的右下角,放大是因为这是我们在示例中要关注的图像部分:
对于这幅图像,我写出了每个像素的索引。这些不是像素值,它们只是每个像素的[i,j]坐标。您可以想象这个图像有任意的像素值,因为在我们的例子中不需要图像像素值。
卷积例子(数学)
回想一下卷积公式:
这似乎表明,为了获得输出 y 中索引[m,n]处的值,我们需要查看图像中的所有像素。毕竟,I 和 j 是图像的索引,和的值从负无穷大到正无穷大。
然而,实际上,我们不需要所有的像素,因为对于特定的输出索引 m 和 n,选择特定的像素索引 I 和 j 将导致访问不存在的内核元素。因此,我们将只查看图像的像素,对于这些像素,等式h【m-I,n-j】的核心部分仍然有效。为了说明这个效果,在下面的例子中,我包括了像素索引 i = 3 和 j = 3;您可以看到,对于所选的输出元素 y [m=1,n=1],选择 i = 3 或 j = 3 会导致尝试访问不存在的内核元素(例如内核元素(1,2));参考前面的内核图片,你会看到它的索引从-1 到+1。因此,我们没有明确说明输出图的每个部分需要哪个图像索引 I 和 j;它隐含在公式中,基于 I 和 j 的选择将导致可接受的内核访问。
(注意,不是从“负无穷大到正无穷大”求和,这有点奇怪,因为没有图片具有无穷大的大小,我们可以改为写“-k 到+k”,但这具有暗示固定的 k×k 输入图像大小的缺点。)
事不宜迟,下面是卷积产生输出条目 y [m=1,n=1]的工作示例:
这里发生了什么事?
首先,我们试图在输出图 y 中找到单个位置的值,由索引 m = 1, n = 1 指定;我们想找到 y [1,1]。为了简单起见,我没有显示像素值 I 和 j(从-3 到+3)的每一个可能的组合,因为那样会变得非常混乱,并且我没有显示的所有组合都是“无效的”(也就是说,它们需要不存在的内核索引。)
图像中央有一条蓝线。在蓝线的左侧,我们将 m、n、I 和 j 的值以系统的方式直接代入卷积方程。在蓝线的右边,我们已经“求解”了左边的表达式,从而得到了与特定像素 x [#,#]相乘的 h [#,#]的最终索引。
卷积示例(绘图)
上面的等式可能看起来像一大堆晦涩难懂的东西,但是如果我们把它们组织成一张图片,我们会突然明白为什么它们很酷。在下面的图片中,我显示了图像的右下角 x 并明确写出了相关的像素索引。然后,我将内核 h 与相关位置的图像对齐,并使用卷积方程的结果来填充内核索引 h [#,#],以便右边的 h [#,#]与右边的 x [#,#]对齐。最后,我已经参考了原始的内核图片(在本文的前面)来计算哪些内核数值(a、b、c 等等)对应于哪些内核索引…瞧!!!我们已经表明卷积“翻转内核”:
所以,如果你曾经读过任何关于“实卷积如何使用翻转核”的东西,现在你明白为什么了,在数学上。
与卷积相比的互相关
当你想到“卷积”时,你可能会想到互相关,因为互相关意味着在图像上滑动内核而不翻转内核。以下是互相关和卷积的并列等式,您可以比较它们:
正如你所看到的,在表达式h【m-I,n-j】或h【m+I,n+j】中,关键的区别是加号与减号。这一差异最终决定了(a)内核是否翻转,( b)为输出贴图的每个元素处理哪些像素。
在上图中,我们可以看到以下内容:
- 为了获得 y [m=1,n=1]处互相关的输出值,我们需要查看绿色中的像素(因为这些是内核索引有意义的唯一像素。)
- 然而,为了获得卷积在y【m = 1,n=1】的输出值,我们需要查看一组不同的像素,用红色包围起来(因为这些是现在内核索引有意义的唯一像素。)
- 事实证明,如果我们想使用同一幅输入图像来完成一个工作示例,那么同一幅输入图像对应于不同的卷积和互相关输出图。这是因为卷积从右下角开始,从下向上/从右向左进行,而互相关从左上角开始,从上向下/从左向右进行。因此,我们关注的图像部分(红色方框部分)对应于卷积输出 y[1,1],但对应于互相关输出 y[-1,-1]。
作为对该问题的进一步总结,以下两个图显示了输入图像的哪一部分用于创建输出图的不同部分,用于互相关与卷积:
交叉相关
互相关示例(数学)
最后,在这样的背景下,这是我们关注的图像“红色区域”的工作示例。在互相关中,这个补丁用于找到在 y [m= -1,n= -1]的输出:
互相关示例(图纸)
同样,我们可以使用上面的数学来填充一张图片,向我们展示在图像和内核级别上发生了什么。我们可以看到,通过将适当的内核索引与输入图像索引对齐,我们最终得到“面向原始方向”的内核,即在互相关中,内核是而不是翻转的。
总结
卷积和互相关都涉及在图像上滑动核来创建输出。
- 在卷积中,内核是翻转的
- 在互相关中,内核不翻转
- 卷积的大部分动画和解释其实都是在呈现互相关性,“卷积神经网络”的大部分实现其实都是利用了互相关性。在机器学习环境中,这不会改变模型的性能,因为 CNN 权重只是被学习翻转了。
要在示例中很好地使用公式,您需要:
- (1)适当选择指标。图像的中心元素、内核和输出都是[0,0]
- (2)注意,图像的固定碎片对应于卷积与互相关中输出图的不同索引。这是因为在卷积中,内核自下而上/从右向左遍历图像,而在互相关中,内核自上而下/从左向右遍历图像。
理解卷积和互相关之间的区别将有助于理解反向传播在 CNN 中是如何工作的,这是未来帖子的主题。
参考
- 卷积与互相关,来自 Udacity“计算摄影”的视频(还有,第 10 课的所有内容,一个包含示例、动画和公式的视频系列)
- 深度学习全书第九章(总结公式)
- 曾 793 Akbas 第 3 周 CNN 和 RNNs (汇总公式)
- 宋浩安的 2D 卷积示例(带索引的示例)
- 宋浩安的卷积(带索引的例子)
关于特色图片
图片来源:佩吉培根在半空后空翻。记住…实卷积翻转内核。
原载于 2019 年 7 月 26 日http://glassboxmedicine.com。
用于图像降噪的卷积自动编码器
在“自动编码器异常检测变得简单中,我提到自动编码器已经广泛应用于降维和图像降噪。从那时起,许多读者问我是否可以使用自动编码器来降低图像噪声。这就是这篇文章的动机。
在神经网络世界中,对图像数据建模需要一种特殊的方法。用于对图像数据建模的最著名的神经网络是**卷积神经网络(CNN,或 ConvNet)。**可以更好的保留一幅图像像素之间的连通信息。CNN 中各层的特殊设计使其成为处理图像数据的更好选择。
CNN 设计可用于图(1)所示的图像识别/分类,或用于图(2)所示的图像降噪或着色。在图(1)中,我们通过将许多图像样本作为输入并将标签作为输出来训练 CNN 模型。然后我们用这个训练好的 CNN 模型对一个新的图像进行识别,看它是“狗”,还是“猫”等等。CNN 也可以用作图像降噪或着色的自动编码器。
当 CNN 用于图像降噪或着色时,它应用于自动编码器框架中,即,CNN 用于自动编码器的编码和解码部分。图(2)显示了一个 CNN 自动编码器。每个输入图像样本是具有噪声的图像,并且每个输出图像样本是没有噪声的对应图像。我们可以将训练好的模型应用于有噪声的图像,然后输出清晰的图像。同样,它可以用于训练图像着色的模型。图(2)是一个使用 CNN 自动编码器为图像着色的例子。
Figure (2)
在这篇文章中,让我先简单介绍一下图像数据,因为并非所有读者都熟悉图像数据领域(如果您已经熟悉了,请随意跳过这一部分)。然后,我描述了一个简单的标准神经网络的图像数据。这将允许我演示为什么卷积自动编码器是处理图像数据的首选方法。最重要的是,我将演示卷积自动编码器如何减少图像中的噪声。我在这篇文章中使用了 Keras 模块和 MNIST 数据。笔记本可以通过 Github 链接获得。 Keras 是一个高级神经网络 API,用 Python 编写,能够在 TensorFlow 之上运行。这篇文章是我之前的文章“什么是图像识别”的延伸。“我鼓励你去看一看。
我认为提及三大数据类别是有帮助的。这三个数据类别是(1)多元数据(与串行数据相反),(2)串行数据(包括文本和语音流数据),以及(3)图像数据。深度学习有三种基本变化来解决每个数据类别: (1)标准前馈神经网络,(2) RNN/LSTM,以及(3)卷积神经网络(CNN)。对于正在寻找每种类型教程的读者,建议查看《用回归友好的方式解释深度学习》的(1),当前文章《RNN/LSTM/GRU 股价预测技术指南》的(2),以及《用 PyTorch 进行深度学习不是折磨》,《什么是图像识别?、使用自动编码器的异常检测变得容易、用于图像降噪的卷积自动编码器(3)。您可以将摘要文章“ Dataman 学习之路——培养您的技能,推动您的职业发展”加入书签。
理解图像数据
如图(A)所示,图像由“像素”组成。在黑白图像中,每个像素由一个从 0 到 255 的数字表示。今天大多数图像使用 24 位或更高的颜色。RGB 彩色图像意味着像素中的颜色是红色、绿色和蓝色的组合,每种颜色的范围从 0 到 255。RGB 颜色系统从红色、绿色和蓝色的组合中构建所有颜色,如该 RGB 颜色生成器所示。所以一个像素包含一组三个值 RGB(102,255,102)指颜色 #66ff66。
Figure (A)
800 像素宽、600 像素高的图像具有 800 x 600 = 480,000 像素= 0.48 兆像素(“兆像素”是 100 万像素)。分辨率为 1024×768 的图像是具有 1,024 列和 768 行的网格,因此包含 1,024 × 768 = 0.78 兆像素。
[## 通过我的推荐链接加入 Medium-Chris Kuo/data man 博士
阅读 Chris Kuo/data man 博士的每一个故事。你的会员费直接支持郭怡广/戴塔曼博士和其他…
dataman-ai.medium.com](https://dataman-ai.medium.com/membership)
MNIST
MNIST 数据库(改进的国家标准和技术研究所数据库)是一个手写数字的大型数据库,通常用于训练各种图像处理系统。Keras 中的训练数据集有 60,000 条记录,测试数据集有 10,000 条记录。每条记录有 28 x 28 个像素。
他们长什么样?让我们用matplotlib
和它的图像函数imshow()
来显示前十条记录。
堆叠用于训练的图像数据
为了适合用于模型训练的神经网络框架,我们可以将所有 28 x 28 = 784 个值堆叠在一列中。第一条记录的堆叠列如下所示:(使用x_train[1].reshape(1,784)
):
Figure (B): Part of the values
然后我们可以用标准的神经网络来训练模型,如图(B)所示。784 个值中的每一个都是输入层中的一个节点。但是等等,我们叠加数据的时候不是损失了很多信息吗?是的。*图像中的空间和时间关系已被丢弃。这是很大的信息损失。*让我们看看卷积自动编码器如何保留空间和时间信息。
Figure (B)
为什么卷积自动编码器适用于图像数据?
当分割和堆叠数据时,我们看到大量信息丢失。卷积自动编码器不是堆叠数据,而是保持输入图像数据的空间信息不变,并在所谓的卷积层中温和地提取信息。图(D)展示了平面 2D 图像被提取到一个厚正方形(Conv1),然后继续变成一个长立方体(Conv2)和另一个更长的立方体(Conv3)。此过程旨在保留数据中的空间关系。这是自动编码器中的编码过程。在中间,有一个全连接的自动编码器,其隐藏层仅由 10 个神经元组成。接下来是解码过程,使立方变平,然后变成 2D 平面图像。编码器和解码器在图(D)中是对称的。它们不需要对称,但是大多数从业者只是采用了这个规则,如“使用自动编码器的异常检测变得容易”中所解释的。
Figure (D)
卷积自动编码器如何工作?
上面的数据提取看起来很神奇。这是怎么回事?它包括以下三层:卷积层、reLu 层和池层。
Figure (E): The Feature Maps
- 卷积层
卷积步骤创建了许多称为特征地图或特征的小块,如图(E)中的绿色、红色或深蓝色方块。这些方块保留了输入图像中像素之间的关系。让每个特征扫描原始图像,如图(F)所示。这个产生分数的过程叫做过滤。
Figure (F): The Filtering Process
在扫描原始图像后,每个特征产生一个如图(G)所示的具有高分和低分的过滤的图像。如果完全匹配,则该方块得分高。如果匹配度低或不匹配,则得分低或为零。例如,红色方块在原始图像中找到了四个与该特征完全匹配的区域,因此这四个区域的得分很高。
Figure (G)
更多的过滤器意味着模型可以提取更多的特征。然而,更多的功能意味着更长的训练时间。因此建议您使用最少数量的过滤器来提取特征。
1.1 填充
特征如何确定匹配?一个超参数是填充,它提供了两个选项:(I)用零填充原始图像以适合该特征,或者(ii)丢弃原始图像中不适合的部分并保留有效部分。
1.2 步
卷积层包括另一个参数:步幅。它是在输入矩阵上移动的像素数。当跨距为 1 时,滤镜一次移动一个像素。我们将在 Keras 代码中看到它作为一个超参数。
2。重新执行步骤
校正线性单元(ReLU)是与典型神经网络中的步骤相同的步骤。它会将任何负值修正为零,以保证数学运算正确进行。
3。最大池层
池会缩小图像大小。在图(H)中,一个被称为池大小的 2×2 窗口扫描通过每个过滤的图像,并将该 2×2 窗口的最大值分配给新图像中的 1×1 正方形。如图(H)所示,第一个 2 x 2 窗口中的最大值是高分(用红色表示),因此高分被分配给 1 x 1 正方形。
Figure (H): Max Pooling
除了取最大值,其他不太常用的汇集方法包括平均汇集(取平均值)或总和汇集(总和)。
Figure (J)
合并后,会产生一个新的较小的过滤图像堆栈。现在,我们分割较小的过滤图像,并将它们堆叠成一个列表,如图(J)所示。
Keras 中的型号
以上三层是卷积神经网络的构造块。Keras 提供以下两种功能:
Conv2D(filters, kernel_size, activation = 'reLu', strides=1)
:kernel_size
是 2D 卷积窗的高度和宽度。因为我们在图(E)中使用了一个 2 乘 2 的正方形,所以在我们的例子中,kernel_size 将是(2,2)。stride
是在输入矩阵上移动的像素数。我们的步幅是 1,因为我们一次移动一个像素的过滤器。MaxPooling2D(pool_size=(2,2))
:在图(H)中,我们使用 2 乘 2 的窗口来表示池的大小。所以我们将在下面的代码中使用(2,2)。
您可以在卷积自动编码器中构建许多卷积层。在图(E)中,编码部分有三层,分别标记为 Conv1、Conv2 和 Conv3。所以我们会相应地建造。
- 下面的代码
input_img = Input(shape=(28,28,1)
声明输入的 2D 图像是 28 乘 28。 - 然后构建三层 Conv1、Conv2 和 Conv3。
- 注意,Conv1 位于 Conv2 内部,Conv2 位于 Conv3 内部。
padding
指定当滤波器不适合输入图像时该做什么。padding='valid'
表示当滤镜不适合时,丢弃图像的部分;padding='same'
用零填充图片以适合图片。
然后继续添加解码过程。所以下面的decoding
部分有所有的编码和解码。
Keras API 需要声明模型和优化方法:
Model(inputs= input_img,outputs= decoded)
:给定输入数据input_img
,模型将包括计算输出decoded
所需的所有层。compile(optimizer='adadelta',loss='binary_crossentropy')
:优化器像梯度下降一样执行优化。最常见的是随机梯度下降(SGD)、适应梯度(Adagrad)和 Adadelta(Adagrad 的扩展)。详见 Keras 优化器文档。损失函数可在 Keras 损失文件中找到。
下面我使用 x_train 作为输入和输出来训练这个模型。batch_size
是样本数,epoch
是迭代次数。我指定shuffle=True
要求在每个时期之前混洗训练数据。
我们可以打印出前十幅原始图像和对这十幅图像的预测。
如何构建图像降噪卷积自动编码器?
图像降噪的思想是用噪声数据作为输入,它们各自的清晰数据作为输出来训练模型。这是与上述模型的唯一区别。让我们首先给数据添加噪声。
前十幅有噪声的图像如下所示:
然后,我们用有噪声的数据作为输入,干净的数据作为输出来训练模型。
最后,我们打印出前十个噪声图像以及相应的去噪声图像。
笔记本可以通过这个 Github 链接获得。
有没有我可以使用的预先训练好的 CNN 代码?
是的。如果你有兴趣学习代码, Keras 有几个预先训练好的 CNN,包括 Xception 、 VGG16 、 VGG19 、 ResNet50 、 InceptionV3 、 InceptionResNetV2 、 MobileNet 、 DenseNet 、值得一提的是这个大型图像数据库 ImageNet ,你可以贡献或下载用于研究目的。
[## 通过我的推荐链接加入 Medium-Chris Kuo/data man 博士
阅读 Chris Kuo/data man 博士的每一个故事。你的会员费直接支持郭怡广/戴塔曼博士和其他…
dataman-ai.medium.com](https://dataman-ai.medium.com/membership)
卷积神经网络:逐步指南
“人工智能、深度学习、机器学习——不管你在做什么,如果你不懂,就去学吧。因为否则,你会在三年内变成恐龙”*——*马克·库班,连续创业者
您好,欢迎, 野心家 !
如果你正在阅读这篇文章,并且对这个话题感兴趣,我假设你熟悉深度学习和机器学习的基本概念。
如果没有,也不用担心!该教程旨在从头到尾让你开始学习深度学习技能——从感知机到深度学习。
在本教程中,我们将触及神经网络、模型和算法的各个方面,一些用例、要使用的库,当然还有深度学习的范围。除此之外,还将讨论深度学习的其他重要概念。
第一步:先决条件
任何一个汤姆、迪克和哈里都不可能只是听说深度学习的奇迹,培养兴趣并开始一个教程。必须有一个好的学习方法,这就是为什么我们为你们奠定了基础工作。以下几点强调了在开始学习之前你需要做的事情:
- R/Python 知识: 这是深度学习最常用和首选的两种语言。其中一个主要原因是两者都有足够的支持/社区。在你进入机器学习的世界之前,在你方便的时候选择其中的一个。毋庸置疑,Python 是领先领域;不过这里可以看到对比。
- 对线性代数、微积分和概率的基本理解: 每堂课都有数量惊人的在线视频和课程,其中许多是免费的。我们并不建议你磨练技巧,只是为了更好地理解教程而复习一下。你可以试着从斯坦福的 CS231n 开始。
- 神经网络和深度学习的初级诀窍: 正如我前面所说,网上有很多免费和付费的资源。无论如何,在线视频总是有帮助的。如果你想通读这个概念,我们建议你跟随神经网络和深度学习,这是绝对免费的。(此外,请注意深度学习初学者的 25 个必知术语&概念
- 设置要求: 由于深度学习非常依赖计算概念,我们需要更快的机器在那个级别运行。所以,你现在需要的是:
- GPU (4+ GB,最好是 Nvidia)——它是当今深度学习应用的核心
- CPU(例如英特尔酷睿 i3 或更高版本也可以)
- 4 GB RAM 或取决于数据集
注意:(如果你想了解更多关于硬件的要求,可以去看看这个硬件指南,最重要的是,不要在这一步安装深度学习库。你将在本教程中被进一步告知。)
第二步:概念和技术方面的介绍
*如何能一头扎进深度学习?*本质上,这一切都始于神经网络,深度学习不过是那些网络的逻辑实现,从数据中提取有用的信息。从技术角度来说,它是一种对非结构化输入数据(如包括图像、声音、视频和文本在内的媒体)进行分类的谨慎方法。
首先,你需要决定哪种学习媒介最适合你的研究和学习深度学习。它可以是博客、书籍、视频或在线课程。我们列出了来源,让你从最简单的概念开始,这将帮助你逐渐掌握这个主题。
博客方法
书本方法
视频方法
——深度学习简体
在线课程方法
亲爱的学习者,接受这样一个事实,即转变为深度学习专家需要大量的时间、许多额外的资源,以及在构建和测试模型方面的专门练习。然而,我们确实相信,利用上面列出的资源可以让你进入深度学习。
第三步: 选择你的冒险
在你掌握了基础知识之后,有趣的部分来了――深度学习最先进技术的实践经验。该领域提供了许多令人兴奋的应用和机会。深度学习的技术将根据你的兴趣和目的而变化,见下文:
计算机视觉/模式识别: 两者差别不大,因为模式识别也是计算机视觉的一部分,很多时候。然而,从广义上讲,计算机视觉仅包括分析图像,并用于对象检测、分割、基于视觉的学习等。而模式识别不限于图像。它是关于任何可以拥有一种模式的事物的分类。
若要了解,请访问此处:
对于视频和用例:
语音和音频识别: 有没有说过“Ok Google”?我敢肯定,你做到了。它包括一个语音识别系统,可以帮助你在谷歌上找到你要找的东西。
从技术上讲,它由一种神经网络组成,这种网络涉及输入序列,以在网络图中创建循环,称为递归神经网络(RNNs)。它们被称为“递归的”,因为它们对序列的每个元素执行相同的任务,并且执行诸如机器翻译或语音识别之类的任务。
若要了解,请访问此处:
了解 LSTM 网络(一种广泛使用的 RNN 变种)
对于视频:
自然语言处理或 NLP: NPL 是一种计算机通过以智能和有用的方式模拟人类语言来阅读、分析和响应的方法。如今,技术广泛应用于多个行业领域,如广告、客户服务、保险等。实现人机交互过程的自动化。
NPL 层将用户请求或查询转换成信息,并从其数据库中搜索适当的响应。NLP 的一个高级例子是语言翻译――从一种人类语言到另一种语言。例如,英语到德语。
若要了解,请访问此处:
对于视频:
强化学习或 RL: 想象一个机器人被训练从它以前的行为中学习,并在需要时执行新的任务,那不是很好吗,而且是自动的!事实上,这是真的。
强化学习为计算机代理引入了类似的概念;无论在特定任务中是成功还是失败,代理人都会收到对某个对象的行为的奖励和惩罚。它获得关于它的知识,作为控制其行为的深度学习模型的一部分。
若要了解,请访问此处:
强化学习初学者指南(Java 版)
对于视频:
第四步:选择正确的框架
我们在步骤 3 中讨论了深度学习技术的许多应用和用法。对于某些任务,传统的机器学习算法可能就足够了。但是,如果你正在处理大量的图像、视频、文本或语音,深度学习是你的福音和一切。然而,在深度学习中,对于许多人来说,哪个框架将是正确的选择。
记住,没有正确的框架,只有合适的框架。以下是您的选择标准应该主要依据的内容:
- 预训练模型的可用性
- 开源
- 支持的操作系统和平台
- 许可模式
- 模型定义和调整的简易性
- 调试工具的可用性
- 易于扩展(例如,能够编写新的算法)
- 与研究型大学或学术界有联系
- 支持深度学习算法家族和模型
为了帮助您选择一个,让我带您简单浏览一下深度学习框架:
**(a)****tensor flow:**背靠 Google,TensorFlow 是基于数据流图表示的数值计算通用深度学习库。
-试试它的入门教程
-要安装 TensorFlow,请访问此处
-参考其文档
-看看它的白皮书
(b) Theano: 数学表达式编译器 Theano 是一种积极开发的架构,它有效地定义、优化和评估具有多维数组的数学表达式。
-试用一个入门教程
-要安装 Theano,请访问此处
-将文件放在手边
© Caffe: 虽然 Theano 和 TensorFlow 可以成为你的“通用”深度学习库,但 Caffe 是通过牢记表达式、速度和模块化来制作的。该框架由计算机视觉小组开发,能够实现简单灵活的深度学习来组织计算。对其更新,咖啡 2 也可用。
-要安装 Caffe,请访问此处获取 Caffe 和 Caffe2
-熟悉介绍性教程演示
-在这里你可以找到它的文档
(d) **微软认知工具包:**微软认知工具包——以前称为 CNTK——是一个统一的深度学习工具包,可以跨多个 GPU 和服务器轻松实现和组合流行的模型类型,如 CNN、RNN、LTSM 等。
-要安装微软认知工具包,请访问此处
-如需教程,请点击此处的
- 模型库各种用例的代码样本、配方和教程的集合。
请注意,上面列出的体系结构并不是当今使用的唯一流行的库。我们列举了一些主要特征:
-用 Python 写的;一个极简和高度模块化的神经网络库
-能够在 Theano 或 TensorFlow 上运行
-支持快速实验。
-科学计算框架
-为机器学习算法提供广泛支持
-基于 Lua 编程语言
- Python 支持的,灵活直观的神经网络库
-根据运行定义的原则设计
-允许您在运行时修改网络
要了解更多基于标准的选择和对其他框架的详细审查,请访问页面- 如何选择深度学习框架(我们建议您将该链接加入书签,因为它会经常更新)。
第五步:探索深度学习
深度学习是一个复杂而突出的人工智能领域,真正的奇迹正在这里发生。引导深度学习领域的三个关键点是:
- 大量训练数据的可用性
- 强大的计算基础设施
- 学术界的进展
然而,要开创深度学习,你需要做的很简单:
- 从第 2 步到第 4 步重复,每次都有不同的经历
- 继续测试你的深度学习技能(例如 Kaggle
- 加入深度学习社区并提问(例如 Google Group 、 DL Subreddit )
- 关注最近的研究/研究人员(例如被引用最多的深度学习论文)
尾注
今天,几年前和我们一样也是学习者的研究人员,正在努力挑战技术领域的不可能性。一开始,你可能会发现学习概念有困难,但是,坚韧是关键。
你可能会发现自己对深度学习算法感到困惑,并认为为什么它没有像你预期的那样工作,或者为什么我会得到这个错误 ABC?…相信我,这很正常。如果需要,先尝试一个您认为可以在一小组数据上工作的示例算法。
在这个学习领域,尝试一切对你有意义的事情。当你获得新技能的时候,试着用你的头脑创造一些不同的东西。还记得电影《蜘蛛侠》中的对白吗——“能力越大,责任越大。”深度学习的趋势正在不停地上升。要在深度学习名人堂留下印记,宇宙向你敞开。出来展示你的才华吧,因为还有很多东西没有被发掘。
最后,我请求你们支持(鼓掌)这篇文章并分享它,这样我们就不会留下任何有抱负的人才,也不会错过任何即将到来的发明机会!!爱你们所有人…
卷积神经网络用于乳腺癌分类
深度学习用于解决女性中最常诊断的癌症
Photo by Tamara Bellis on Unsplash
被困在付费墙后面?点击这里阅读完整故事与我的朋友链接!
乳腺癌是全世界女性和男性中第二常见的癌症。2012 年,它占所有新癌症病例的 12%,占所有女性癌症的 25%。
当乳房中的细胞开始不受控制地生长时,乳腺癌就开始了。这些细胞通常会形成一个肿瘤,通常可以在 x 射线上看到或摸到一个肿块。如果细胞可以生长(侵入)周围组织或扩散(转移)到身体的远处区域,则肿瘤是恶性的(癌症)。
挑战
建立一种算法,通过查看活检图像自动识别患者是否患有乳腺癌。算法必须非常精确,因为人命关天。
数据
数据集可以从这里下载。这是一个二元分类问题。我把数据分开,如图所示-
dataset train
benign
b1.jpg
b2.jpg
//
malignant
m1.jpg
m2.jpg
// validation
benign
b1.jpg
b2.jpg
//
malignant
m1.jpg
m2.jpg
//...
训练文件夹在每个类别中有 1000 个图像,而验证文件夹在每个类别中有 250 个图像。
Benign sample
Malignant sample
CNN 架构
让我们一步一步来分析卷积神经网络中的每一层。
投入
形状为[宽度、高度、通道]的像素值矩阵。假设我们的输入是[32x32x3]。
卷积
该图层的目的是接收要素地图。通常,我们从低数量的滤波器开始进行低级特征检测。我们越深入 CNN,我们使用越多的过滤器来检测高级特征。特征检测是基于用给定尺寸的过滤器“扫描”输入,并应用矩阵计算来导出特征图。
Convolution Operation
联营
这一层的目标是提供空间变化,这简单地意味着系统将能够识别一个对象,即使它的外观以某种方式变化。Pooling layer 将沿空间维度(宽度、高度)执行缩减采样操作,从而产生输出,例如 pooling_size=(2,2)的[16x16x12]。
Pooling Operation
完全连接
在完全连接的层中,我们展平最后一个卷积层的输出,并将当前层的每个节点与下一层的其他节点连接起来。完全连接层中的神经元与前一层中的所有激活都有完全连接,正如在常规神经网络中看到的那样,并以类似的方式工作。
CNN Overview
图像分类
完整的图像分类管道可以形式化如下:
- 我们的输入是一个由 N 幅图像组成的训练数据集,每幅图像都被标记为两个不同类别中的一个。
- 然后,我们使用这个训练集来训练一个分类器,以学习每个类的样子。
- 最后,我们通过要求分类器预测一组它以前从未见过的新图像的标签来评估分类器的质量。然后,我们将这些图像的真实标签与分类器预测的标签进行比较。
代码在哪里?
事不宜迟,让我们从代码开始吧。github 上的完整项目可以在这里找到。
让我们从加载所有的库和依赖项开始。
接下来,我将图片加载到各自的文件夹中。
之后,我创建了一个由 0 组成的 numpy 数组来标记良性图像,同样也创建了一个由 1 组成的 numpy 数组来标记恶性图像。我还重组了数据集,并将标签转换成分类格式。
然后,我将数据集分成两组——分别包含 80%和 20%图像的训练集和测试集。让我们看一些良性和恶性图像的样本。
Benign vs malignant samples
我使用的批量值是 16。批量大小是深度学习中要调整的最重要的超参数之一。我更喜欢使用较大的批量来训练我的模型,因为它允许 GPU 并行性的计算加速。然而,众所周知,批量太大会导致泛化能力差。在一个极端情况下,使用等于整个数据集的批次保证了收敛到目标函数的全局最优。然而,这是以较慢地收敛到最优值为代价的。另一方面,使用较小的批量已被证明具有更快的收敛到良好的结果。这可以通过以下事实直观地解释,即较小的批量允许模型在必须看到所有数据之前就开始学习。使用较小批量的缺点是模型不能保证收敛到全局最优。因此,通常建议从小批量开始,获得更快的训练动态的好处,并通过训练稳步增加批量。
我也做了一些数据扩充。数据扩充的做法是增加训练集规模的有效方法。增加训练示例允许网络在训练期间看到更多样化但仍有代表性的数据点。
然后,我创建了一个数据生成器,以自动方式从我们的文件夹中获取数据并导入 Keras。为此,Keras 提供了方便的 python 生成器函数。
下一步是构建模型。这可以通过以下 3 个步骤来描述:
- 我使用 DenseNet201 作为预训练的重量,它已经在 Imagenet 比赛中训练过。学习率被选择为 0.0001。
- 在此基础上,我使用了一个 globalaveragepooling 层,然后是 50%的辍学,以减少过度拟合。
- 我使用了批量标准化和一个具有 2 个神经元的密集层,用于 2 个输出类别,即良性和恶性,使用 softmax 作为激活函数。
- 我用 Adam 作为优化器,用二元交叉熵作为损失函数。
让我们看看输出的形状和每一层所涉及的参数。
Model summary
在定型模型之前,定义一个或多个回调是有用的。相当方便的一个,有:ModelCheckpoint 和 ReduceLROnPlateau。
- ModelCheckpoint :当训练需要大量时间来达到一个好的结果时,通常需要多次迭代。在这种情况下,最好仅在改善度量的时期结束时保存最佳执行模型的副本。
- ReduceLROnPlateau :当指标停止改善时,降低学习率。一旦学习停滞,模型通常会受益于将学习速度降低 2-10 倍。这种回调监控一个数量,如果在“耐心”次数内没有看到改进,则学习率降低。
ReduceLROnPlateau.
我训练了 20 个纪元的模型。
性能指标
评估模型性能的最常见指标是精确度。然而,当只有 2%的数据集属于一个类别(恶性)而 98%属于其他类别(良性)时,错误分类分数实际上没有意义。你可以有 98%的准确率,但仍然没有发现任何恶性病例,这可能是一个可怕的分类器。
Loss vs epoch
Accuracy vs epoch
精确度、召回率和 F1 分数
为了更好地了解错误分类,我们经常使用以下指标来更好地了解真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)。
精度是正确预测的正观测值与总预测正观测值的比率。
召回是正确预测的正面观察值与实际类中所有观察值的比率。
F1-Score 是准确率和召回率的加权平均值。
F1 分数越高,模型越好。对于所有三个指标,0 是最差的,而 1 是最好的。
混淆矩阵
在分析误分类时,混淆矩阵是一个非常重要的度量。矩阵的每一行代表预测类中的实例,而每一列代表实际类中的实例。对角线代表已被正确分类的类别。这很有帮助,因为我们不仅知道哪些类被错误分类,还知道它们被错误分类为什么。
Confusion matrix
ROC 曲线
45 度线是随机线,其中曲线下面积或 AUC 是 0.5。曲线离这条线越远,AUC 越高,模型越好。一个模型能得到的最高 AUC 是 1,其中曲线形成一个直角三角形。ROC 曲线也可以帮助调试模型。例如,如果曲线的左下角更接近随机线,则暗示模型在 Y=0 处分类错误。然而,如果右上角是随机的,则意味着误差发生在 Y=1 处。
ROC-AUC curve
结果
Final results
结论
虽然这个项目还远未完成,但在如此多样的现实世界问题中看到深度学习的成功是令人瞩目的。在这篇博客中,我展示了如何使用卷积神经网络和迁移学习从一组显微图像中对良性和恶性乳腺癌进行分类。
参考资料/进一步阅读
迁移学习的一站式指南
towardsdatascience.com](/transfer-learning-for-image-classification-in-keras-5585d3ddf54e) [## 在 Keras 中使用卷积神经网络(CNN)预测浸润性导管癌
使用卷积神经网络将组织病理学切片分类为恶性或良性
towardsdatascience.com](/predicting-invasive-ductal-carcinoma-using-convolutional-neural-network-cnn-in-keras-debb429de9a6) [## 乳腺癌组织病理学图像分类使用卷积神经网络与小…
尽管从组织病理学图像中成功检测恶性肿瘤在很大程度上取决于长期的…
journals.plos.org](https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0214587) [## 基于深度学习的少数据图像分类
深度学习确实可以用更少的数据实现
becominghuman.ai](https://becominghuman.ai/deep-learning-for-image-classification-with-less-data-90e5df0a7b8e)
在你走之前
相应的源代码可以在这里找到。
使用卷积神经网络的良性与恶性分类器数据集可以从这里下载。pip 安装…
github.com](https://github.com/abhinavsagar/Breast-cancer-classification)
联系人
如果你想了解我最新的文章和项目,请关注我的媒体。以下是我的一些联系人详细信息:
快乐阅读,快乐学习,快乐编码!
基于 PyTorch 实现的图像分类深度学习
http://terencebroad.com/nnvis.html
对人工智能算法的探究
介绍
本文将以图像分类为例来解释卷积神经网络(CNN)。它使用 Python 上的 PyTorch 框架提供了 CNN 算法的简单实现。网上有很多免费的课程。个人建议斯坦福的安德烈·卡帕西(@卡帕西)的课程。你会学到很多,这是一个循序渐进的过程。此外,它还提供了许多实现 CNN 架构的实用策略。
斯坦福 CS231n 课程材料和笔记:视觉识别的卷积神经网络。
cs231n.github.io](http://cs231n.github.io/convolutional-networks/)
什么是卷积神经网络?
在深入研究卷积神经网络之前,有必要了解一下它们的概念。CNN 属于监督算法的范畴。该算法从训练数据中学习,例如,输入中的一组图像和输出中的它们的相关标签。
它包括向卷积神经网络提供训练集 x 的图像及其相关联的标签(目标)y,以便学习网络的功能 y=f(x)。在学习了网络函数的参数(即权重和偏差)之后,我们用看不见的图像来测试网络,以便预测它们的标签。卷积神经网络(CNN 或 ConvNet)的架构
我们在本文中使用的 CNN 架构是在本文中提出的。
Illustration of the image classification using CNN architecture
使用 PyTorch 库在 Python 中实现 CNN(如上图所示)
网络实现为一个名为 CNN 的类。它包含两个主要方法。第一种方法(init)定义网络的层组件。在第二种方法( forward )中,我们连接网络,并按照所需的顺序放置每个组件(如图所示)。
下面的 python 代码很简单。使用 Torch 的神经网络模块来定义网络。请注意,我们已经选择了网络的超参数,如填充§、步幅(S)和内核大小(F)。还有每层的过滤器数量,…
输入图像有四个维度,(批量大小、数量通道、高度、宽度)。该算法输出具有 10 个值的数组,对应于图像的预测标签的分数(或能量值)。因此,最大分数是为测试图像保留的预测标签(或类别)。
在下面的要点中,我们将解释算法每一层的作用:
- Conv 层:这是算法的主层。它包括提取输入图像中的关键特征(锐边、平滑度、圆形等)。这是通过用一个或多个滤波器对输入图像进行一组二维卷积来实现的。注意,卷积是针对输入图像的每个通道同时执行的,例如,彩色图像具有 C=3 个通道,RGB:红色、绿色和蓝色。出于实用目的,滤波器设置为奇数大小 CxFxF,例如 3x3x3、3x5x5。这个操作的输出是一个标量值,一个人工神经元。http://cs231n.github.io/convolutional-networks/#conv 的中给出了卷积层的说明性动画。
Source: http://cs231n.github.io/convolutional-networks/#conv
此外,Conv 层被重复应用以提取表征输入图像的精细特征。Conv 层的输出被称为特征图(或激活图),其中每个空间位置(或像素)代表一个人工神经元。
- ReLU(整流器线性单元):将负值硬阈值化为零,正值不变,即 ReLU(x)=max(0,x)。该图层保留了要素地图的动态范围。
- Maxpooling layer :对特征图进行空间下采样,只保留最相关的信息。有关此操作的直观说明,请参见下图。从实用的角度来看,大小为 2x2、步幅为 2 的池在大多数应用程序中都能产生良好的效果。话虽如此,其他类型的池存在,例如,平均池,中位数池,总和池,…
CNN 的 Python 实现怎么样?
对于本文,我使用神经网络框架 PyTorch 来实现上面详述的 CNN 架构。
完整的代码可以在我的 GitHub 资源库中找到:
该存储库包含用于 MNIST 数据集影像分类的笔记本…
github.com](https://github.com/amineHY/Image-classification-of-MNIST/blob/master/pytorch_mnist_deep_cnn.ipynb)
希望代码非常容易理解,因为它以直观的方式提到了我们前面讨论的所有层。
Implementation of the convolutional neural network depicted in the picture above in PyTorch
请注意,方法输入中提到的所有数字都是参数。它们定义了 CNN 的架构:内核大小、步幅、填充、每个 Conv 层的输入/输出。下面的代码定义了一个名为 CNN 的类,我们在其中按顺序定义了 CNN 架构。
上述代码的输出总结了网络架构:
CNN(
(layer1): Sequential(
(0): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(3): Dropout(p=0.30)
)
(layer2): Sequential(
(0): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(3): Dropout(p=0.30)
)
(layer3): Sequential(
(0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=2, stride=2, padding=1, dilation=1, ceil_mode=False)
(3): Dropout(p=0.30)
)
(fc1): Linear(in_features=2048, out_features=625, bias=True)
(layer4): Sequential(
(0): Linear(in_features=2048, out_features=625, bias=True)
(1): ReLU()
(2): Dropout(p=0.30)
)
(fc2): Linear(in_features=625, out_features=10, bias=True)
)
MNIST 数据集:导入训练集和测试集
为了获得 MNIST 图像,我们使用了一种 torchvision 库的方法。只需复制粘贴这段代码来下载数据。基本上,加载了两个数据集。训练数据集用作计算网络参数的基础事实。测试图像
训练 CNN
这是监督算法的一个重要阶段。通过向算法提供许多图像示例及其相关标签,我们教会算法寻找每一类的模式。这是通过计算滤波器的参数(权重和偏差)来完成的。
网络的训练由向前和向后两个主要步骤组成:
- 在正向传递期间,我们通过训练集的图像来馈送网络,并计算直到网络末端的特征图,然后我们计算损失函数来测量解(预测标签)离地面真实标签有多远/多近。
- 后向过程执行损失函数梯度的计算,并更新滤波器的参数。
我们还需要定义一个损失函数,例如交叉熵损失函数,以及一个优化算法,例如梯度下降、SGD、Adam (自适应矩估计 ) …
Source: https://arxiv.org/pdf/1412.6980.pdf
- 训练深度学习算法要记住什么:
—初始化参数(权重:w,偏差:b)
—迭代优化损失以学习参数(w,b)
—计算损失函数及其梯度
—使用优化算法更新参数(例如,Adam)
—使用学习的参数来预测给定输入图像的标签
使用 PyTorch 在 Python 中训练 CNN 的 Python 实现
训练监控:绘制损失函数和精确度
绘制这些图有助于监控和理解算法的收敛性。由于优化算法(Adam)的目标是最小化损失函数,所以损失图在训练期间减小,这正是我们想要的。在右侧,该图显示了训练期间分类准确度的演变。我们对算法训练得越多,分类精度就越好。注意精度在大约 90%和 100 %之间波动。超参数的更好调整将提供精确的分类。
显示分类结果
由于 CNN 的训练,该算法现在能够理解这些图像的内容。
结论
本文试图简要解释卷积神经网络,而不深入数学发展。每一步都提供了一个插图,并附有直观的解释,以及 MNIST 数据集图像分类的应用。最后,给出了一个使用 PyTorch 库的 python 实现,以提供一个具体的应用实例。希望你会发现它有趣且易于阅读。
下一步怎么办?
- 请在评论区告诉我你的想法,或者直接在 LinkedIn 上给我发消息。
- 阅读我在 medium 上的另一篇文章:你在部署之前优化过你的深度学习模型吗?
如何用 Python (TensorFlow Eager API)训练卷积神经网络
Keep an eye out for Deep Learning. Source: Pixabay.
卷积神经网络是过去十年深度学习经常成为头条新闻的一部分。今天我们将使用 TensorFlow 的 eager API 训练一个图像分类器来告诉我们一幅图像中包含的是一只狗还是一只猫。
由于人工神经网络在许多领域具有前所未有的能力,它最近已经颠覆了几个行业。然而,不同的深度学习架构在每个方面都很出色:
- 图像分类(卷积神经网络)。
- 图像、音频和文本生成(GANs、RNNs)。
- 时间序列预测(RNNs,LSTM)。
- 推荐系统。
- 巨大的等等(例如,回归)。
今天我们将关注列表中的第一项,尽管每一项都值得单独写一篇文章*。*
什么是卷积神经网络?
在多层感知器(MLP)中,香草神经网络,每层的神经元连接到下一层的所有神经元。我们称这种类型的层为完全连接的层。
A MLP. Source: astroml
卷积神经网络是不同的:它们有卷积层。
在完全连接的层上,每个神经元的输出将是前一层的线性变换,由非线性激活函数组成(例如, ReLu 或 Sigmoid )。
相反,卷积层中每个神经元的输出只是前一层神经元的一个(通常很小)子集的函数。
Source: Brilliant
卷积层上的输出将是对前一层神经元的子集应用卷积的结果,然后是激活函数。
什么是卷积?
给定一个输入矩阵 A (通常是前一层的值)和一个被称为内核或滤波器 K 的权重矩阵(通常小得多),卷积运算将输出一个新的矩阵 B 。
by @RaghavPrabhu
如果 K 是一个 CxC 矩阵,那么 B 中的第一个元素将是以下结果:
- 取 A 的第一个 CxC 子矩阵。
- 将每个元素乘以其在 K 中的相应权重。
- 添加所有产品。
这最后两个步骤相当于展平 A 的子矩阵和 K ,并计算结果向量的点积。
然后我们向右滑动 K 以获得下一个元素,依此类推,对每一行重复这个过程。
Convolution visualization by @RaghavPrabhu
根据我们的需要,我们只能从以第 Cth 行和列为中心的内核开始,以避免“越界”,或者假设“A 之外”的所有元素都有某个默认值(通常为 0)——这将定义 B 的大小是小于 A 还是相同。
如你所见,如果 A 是一个 NxM 矩阵,那么现在 B 中每个神经元的值将不取决于 NM* 权重,而只取决于其中的 CC* (少得多)。这使得卷积层比全连接层轻得多,有助于卷积模型学习得更快。
当然,我们最终会在每一层上使用许多内核(得到一堆矩阵作为每一层的输出)。然而,这仍然需要比我们的老 MLP 少得多的重量。
为什么会这样?
为什么我们可以忽略每个神经元如何影响大多数其他神经元?嗯,这整个系统成立的前提是每个神经元都受到其“邻居”的强烈影响。然而,远处的神经元对它只有很小的影响。
这个假设在图像中直观上是真实的——如果我们想到输入层,每个神经元将是一个像素或一个像素的 RGB 值。这也是为什么这种方法对图像分类如此有效的部分原因。
例如,如果我拍摄一张照片中有蓝天的区域,很可能附近的区域也会使用相似的色调来显示天空。
像素的相邻像素通常具有相似的 RGB 值。如果他们没有,那么这可能意味着我们在一个图形或物体的边缘。
如果你用笔和纸(或计算器)做一些卷积,你会意识到如果在某种边缘上,某些内核会增加输入的强度。在其他边缘,他们可以减少它。
作为一个例子,让我们考虑下面的内核 V 和 H :
V 过滤垂直边缘(上面的颜色与下面的颜色非常不同),而 H 过滤水平边缘。注意一个是另一个的转置版本。
卷积示例
这是一窝小猫未经过滤的照片:
如果我们分别应用水平和垂直边缘滤镜,会发生以下情况:
我们可以看到一些特征变得更加明显,而另一些逐渐消失。有趣的是,每个过滤器展示了不同的功能。
这就是卷积神经网络如何学习识别图像中的特征。让它适合自己的内核权重比任何手动方法都要容易得多。想象一下,试图用手弄清楚你应该如何表达像素之间的关系… !
为了真正掌握每个卷积对一张图片的影响,我强烈建议你在这个网站上玩一玩。它对我的帮助比任何书籍或教程都大。去吧,把它收藏起来。很好玩。
好了,你已经学了一些理论。现在让我们进入实际部分。
如何在 TensorFlow 中训练一个卷积神经网络?
TensorFlow 是 Python 最流行的深度学习框架。我也听说过 PyTorch 的优点,虽然我从来没有机会尝试。
我已经写了一篇关于如何用 TensorFlow 的 Eager API 训练神经网络的教程,重点是自动编码器。
今天会有所不同:我们将尝试三种不同的架构,看看哪一种做得更好。像往常一样,所有的代码都可以在 GitHub 上获得,所以你可以自己尝试或者跟着做。当然,我还会展示 Python 代码片段。
数据集
我们将训练一个神经网络来预测一幅图像是包含一只狗还是一只猫。为此,我们将使用 Kaggle 的猫狗数据集。它包含 12500 张猫和 12500 张狗的图片,分辨率各不相同。
用 NumPy 加载和预处理我们的图像数据
神经网络接收特征向量或矩阵作为输入,通常具有固定维度。我们如何从我们的照片中产生这种感觉?
幸运的是,Python 的图像库为我们提供了一种将图像作为 NumPy 数组加载的简单方法。RGB 值的高 x 宽矩阵。
我们已经在这篇文章中这样做了,所以我将重用这段代码。
然而,我们仍然必须解决固定维度部分:我们为输入层选择哪些维度?这很重要,因为我们必须将每张图片调整到所选的分辨率。我们不想扭曲太多的长宽比,以免给网络带来太多的噪音。
下面是我们如何看到数据集中最常见的形状。
为此,我对前 1000 张图片进行了采样,尽管当我查看 5000 张图片时,结果并没有改变。最常见的形状是 375×500,尽管我决定将它除以 4 作为我们网络的输入。
这就是我们的图像加载代码现在的样子。
最后,您可以用这个代码片段加载数据。我选择使用 4096 张图片作为训练集的样本,1024 张图片作为验证集的样本。然而,这只是因为我的电脑不能处理更多的内存大小。
如果你在家尝试,可以随意增加这些数字到最大值(比如训练用的 10K 和验证用的 2500 )!
训练我们的神经网络
首先,作为一种基线,让我们看看一个普通的 MLP 在这项任务中表现如何。如果卷积神经网络如此具有革命性,我预计这个实验的结果会是可怕的。
这是一个单隐层全连接神经网络。
本文的所有训练都是使用 AdamOptimizer 完成的,因为它是最快的。我只调整了每个模型的学习率(这里是 1e-5)。
这个模型我训练了 10 个纪元,基本收敛到随机猜测。我确保打乱了训练数据,因为我是按顺序加载的,这可能会使模型产生偏差。
我使用 MSE 作为损失函数,因为它通常更直观地解释。如果你的 MSE 在二进制分类中是 0.5,你就等于总是预测 0 。然而,具有更多层或不同损失函数的 MLP并没有表现得更好。
训练卷积神经网络
单个卷积层能有多大好处?让我们给我们的模型加一个看看。
对于这个网络,我决定添加一个单一的卷积层(24 个内核),然后是 2 个完全连接的层。
Max Pooling 所做的只是将每四个神经元减少到一个,四个之间的值最高。
仅仅过了 5 个时代,它已经比以前的网络表现得更好了。验证 MSE 为 0.36,这已经比随机猜测好得多了。但是请注意,我不得不使用一个小得多的学习率。此外,即使它在更少的纪元中学习,每个纪元花费更长的时间。该型号也重了很多(200 多 MB)。
我决定也开始测量预测和验证标签之间的皮尔逊相关性。这款车型得分 15.2%。
两个卷积层的神经网络
因为那个模型做得更好,我决定尝试一个更大的。我添加了另一个卷积层,并使两者都大了很多(每个 48 个内核)。这意味着模型可以从图像中学习更复杂的特征。然而,这也不出所料地意味着我的内存几乎爆炸。同样,训练花费了更长的时间(15 个周期半小时)。
结果非常好。预测和标签之间的皮尔逊相关系数达到 0.21,验证 MSE 低至 0.33。
让我们来测量网络的准确性。因为 1 是猫,0 是狗,我可以说“如果模型预测的值高于某个阈值 t ,那么预测猫。否则预测狗在尝试了 10 个简单的阈值后,这个网络的最大准确度达到了 61% 。
更大的卷积神经网络
显然,增加模型的大小可以让它学习得更好,所以我试着把两个卷积层都做得更大,每个都有 128 个滤波器。我没有改动模型的其他部分,也没有改变学习率。
这个模型最后达到了 30%的关联度!它最好的准确率是 67% ,这意味着它有三分之二的时间是正确的。我认为一个更大的模型可能更符合数据。然而,这个已经花了 7 分钟了,我不想离开下一个训练一上午。
通常,在模型的尺寸和时间限制之间需要做出的权衡。大小限制了网络能够多好地适应数据(一个小模型会不适应**),然而我不会等 3 个小时让我的模型学习。**
如果你有一个商业截止日期,同样的担心也适用。
结论
我们已经看到,在图像分类任务中,卷积神经网络比传统架构明显更好(T21)。我们还尝试了不同的指标来衡量模型性能(相关性、准确性)。
我们了解了模型的尺寸(防止欠拟合)和它的收敛速度之间的权衡。
最后,我们使用 TensorFlow 的 eager API 来轻松训练一个深度神经网络,并使用 numpy 进行(尽管很简单)图像预处理。
在以后的文章中,我相信我们可以用不同的池层、过滤器大小、步长和不同的预处理进行更多的实验。
你觉得这篇文章有用吗?你会更喜欢学习其他的东西吗?还有什么不清楚的吗?请在评论中告诉我!
在Twitter*Medium或dev . to上找我如果有什么问题,或者想联系我什么的。如果你想从事机器学习事业,下面是我的 推荐阅读清单 。*
原载于 2019 年 6 月 12 日http://www . data stuff . tech*。*
卷积神经网络
研究人员在研究图像处理算法时提出了 CNN 或卷积神经网络的概念。传统的全连接网络有点像一个黑匣子,它接收所有的输入,并将每个值传递给一个密集的网络,然后再传递给一个热输出。这似乎适用于少量输入。
但是,当我们处理 1024x768 像素的图像时,我们的输入是 3x1024x768 = 2359296 个数字(每个像素的 RGB 值)。消耗 2359296 个数字的输入向量的密集多层神经网络在第一层本身中每个神经元将具有至少 2359296 个权重——第一层的每个神经元 2MB 的权重。那太疯狂了!对于处理器和内存来说。在 20 世纪 90 年代和 21 世纪初,这几乎是不可能的。
这使得研究人员想知道是否有更好的方法来完成这项工作。任何图像处理(识别或操作)的首要任务通常是检测边缘和纹理。接下来是识别和处理真实对象。如果我们同意这一点,显然要注意的是,检测纹理和边缘真的不依赖于整个图像。人们需要查看给定像素周围的像素来识别边缘或纹理。
此外,用于识别边缘或纹理的算法(不管它是什么)在整个图像中应该是相同的。我们不能对图像的中心或任何角落或侧面使用不同的算法。检测边缘或纹理的概念必须是相同的。我们不需要为图像的每个像素学习一组新的参数。
这种理解导致了卷积神经网络的出现。网络的第一层由扫描图像的小块神经元组成——一次处理几个像素。通常这些是 9 或 16 或 25 像素的正方形。
CNN 非常有效地减少了计算。小“过滤器/内核”沿着图像滑动,一次处理小块。整个图像所需的处理是非常相似的,因此这非常有效。如果你对这个主题的详细研究感兴趣,可以看看马修·d·泽勒和罗布·弗格斯的论文
虽然它是为图像处理而引入的,但多年来,CNN 已经在许多其他领域得到了应用。
一个例子
现在我们对 CNN 的基本概念有了一个概念,让我们感受一下数字是如何工作的。正如我们所见,边缘检测是任何图像处理问题的首要任务。让我们看看如何使用 CNN 来解决边缘检测问题。
左侧是 16×16 单色图像的位图。矩阵中的每个值代表相应像素的亮度。正如我们所看到的,这是一个简单的灰色图像,中间有一个方形块。当我们试图用 3×3 滤波器(在中间)卷积它时,我们得到了一个 14×14 的矩阵(在右边)。
我们选择的滤镜会高亮显示图像中的边缘。我们可以在右边的矩阵中看到,与原始图像中的边缘相对应的值很高(正或负)。这是一个简单的边缘检测滤波器。研究人员已经确定了许多不同的过滤器,可以识别和突出显示图像的不同方面。在典型的 CNN 模型开发中,我们让网络自己学习和发现这些过滤器。
重要概念
看了美国有线电视新闻网的顶级节目后,让我们向前迈进一步。在我们进一步使用有线电视新闻网之前,这里有一些我们应该知道的重要概念。
填料
卷积滤波器的一个明显问题是,每一步都通过减少矩阵大小(缩小输出)来减少“信息”。本质上,如果原始矩阵是 N x N,而滤波器是 F x F,则得到的矩阵将是(N-F+1)x(N-F+1)。这是因为边缘上的像素比图像中间的像素使用得少。
如果我们在图像的所有边上按(F-1)/2 像素填充,N x N 的大小将被保留。
因此,我们有两种类型的卷积,有效卷积和相同卷积。有效本质上意味着没有填充。因此,每次卷积都会缩小尺寸。相同卷积使用填充,以保留矩阵的大小。
在计算机视觉中,F 通常是奇数。所以这个很管用。奇数 F 有助于保持图像的对称性,也允许中心像素,这有助于在各种算法中应用统一的偏置。因此,3x3、5x5、7x7 滤清器非常常见。我们还提供 1x1 滤波器。
交错卷积
我们上面讨论的卷积是连续的,因为它连续地扫描像素。我们也可以通过在图像中移动卷积滤波器时跳过 s 个像素来实现这一点。
因此,如果我们有 n x n 个图像和 f x f 个滤波器,并使用步长 s 和填充 p 进行卷积,则输出大小为:((n + 2p -f)/s + 1) x ((n + 2p -f)/s + 1)
当然,如果这不是一个整数,我们就必须向下或向上推。
卷积 v/s 互相关
互相关本质上是矩阵在自下而上的对角线上的卷积。翻转将关联性添加到操作中。但是在图像处理中,我们不会翻转它。
RGB 图像上的卷积
现在我们有一个 n x n x 3 图像,我们用 f x f x 3 滤波器对它进行卷积。因此,我们有一个高度,宽度和数量的渠道,在任何图像及其过滤器。在任何时候,图像中的通道数都与过滤器中的通道数相同。该卷积的输出具有(n-f+1)的宽度和高度以及 1 个通道。
多个过滤器
用三通道滤波器卷积的三通道图像给我们一个单通道输出。但是我们并不仅限于一个过滤器。我们可以有多个过滤器,每个过滤器都会产生一个新的输出层。因此,输入中的通道数应与每个滤波器中的通道数相同。并且滤波器的数量与输出中的通道数量相同。
因此,我们从 3 通道图像开始,以输出中的多个通道结束。这些输出通道中的每一个都代表由相应的滤波器拾取的图像的某个特定方面。因此,它也被称为一个功能,而不是一个渠道。在真实的深度网络中,我们还添加了一个偏差和一个非线性激活函数,如 RelU。
池层
池化本质上是将多个值组合成一个值。我们可以有平均池、最大池、最小池等。因此,具有 fxf 池的 nxn 输入将生成(n/f)x(n/f)输出。它没有需要学习的参数。
Max Pooling
CNN 架构
典型的中小型 CNN 模型遵循一些基本原则。
A Typical CNN Architecture (Source Wikimedia)
- 交替卷积和池层
- 逐渐减小帧尺寸并增加帧数量,
- 接近末端的平坦且完全连接的层
- 对所有隐藏层重新激活,然后对最后一层进行软最大化
CNN 架构中的一个突出概念是交替层将信息内容一个接一个地变为稀疏和密集。这有助于分离信息的各个部分。你可以把这想象成某人在玩一个棉花球。如果我们一次又一次地推拉这些线,我们自然会将各个线分开。类似地,CNN 可以分离图像中的单个成分。
随着我们转向大型和超大型网络,事情变得越来越复杂。研究人员为我们提供了更多可以在这里使用的具体架构。ImageNet 、 GoogleNet 和 VGGNet 就是其中的几个。
履行
通常实施 CNN 模型数据分析和清理,然后选择我们可以开始使用的网络模型。我们根据网络数量的布局、层的大小以及它们的连接性来提供架构,然后我们允许网络自己学习其余部分。然后,我们可以调整超参数来生成一个足以满足我们目的的模型。
让我们看一个卷积网络如何工作的简单例子。在之前的博客中,我们看了一下用完全连接的神经网络构建 MNIST 模型。如果您想详细了解如何使用 TensorFlow 和 Keras 构建深度模型,可以查看一下。现在让我们看看用卷积网络做同样的工作。
导入模块
我们从导入所需的模块开始。
获取数据
下一步是获取数据。出于学术目的,我们使用 Keras 模块中内置的数据集——MNIST 数据集。在现实生活中,这需要更多的处理。现在,让我们继续进行。
因此,我们加载了训练和测试数据。我们对数据进行整形,使其更适合卷积网络。本质上,我们将其改造成一个 4D 数组,该数组有 60000(记录数)个大小为 28x28x1 的条目(每个图像的大小为 28x28)。这使得在 Keras 中构建卷积层变得很容易。
如果我们想要一个密集的神经网络,我们会将数据重塑为 60000 x784——每个训练图像的 1D 记录。但是 CNN 的不一样。记住卷积的概念是 2D——所以没有必要将其展平成一维数组。
我们还将标签改为分类的独热数组,而不是数字分类。最后,我们归一化图像数据,以确保我们减少了消失梯度的可能性。
建立模型
Keras 库为我们提供了现成的 API 来构建我们想要的模型。我们从创建顺序模型的实例开始。然后,我们将各个层添加到模型中。第一层是处理 28×28 的输入图像的卷积层。我们将内核大小定义为 3,并创建 32 个这样的内核,以创建 32 帧的输出,大小为 26x 26(28–3+1 = 26)
其次是 2x2 的最大池层。这将尺寸从 26x26 减小到 13x13。我们使用最大池,因为我们知道问题的本质是基于边,我们知道边在卷积中显示为高值。
随后是另一个内核大小为 3×3 的卷积层,生成 24 个输出帧。每帧尺寸为 22x22。它后面又是一个卷积层。最后,我们展平这些数据,并将其提供给一个密集层,该层具有对应于 10 个所需值的输出。
训练模型
最后,我们用现有的数据训练模型。五个时期足以获得相当精确的模型。
摘要
上面的模型只有 932 + 924 = 504 个值需要学习。这太神奇了。一个完全连接的网络在第一层中每个神经元需要 784 个权重!因此,我们大大节省了处理能力,同时降低了过度拟合的风险。请注意,在此过程中,我们使用了我们对问题的了解。我们使用我们所知道的,然后训练模型去发现其余的。使用全连接或随机稀疏网络的黑盒方法永远不会以这样的成本获得这样的精度。
通过使用我们所知道的,我们把机器限制在已知的范围内。从头开始训练网络可能会开辟未知的途径。然而,最好是留给学术研究人员。如果我们想创造一些今天可以使用的东西,一个人应该很好地融合知识和发现。卷积神经网络帮助我们实现了这一点。
下次通勤时,你的手机会成为副驾驶吗?小型设备上的障碍物和车道检测。
副驾驶:车道和障碍物检测,在驾驶过程中提供主动协助。让智能手机的算法既可靠又灵活
Fig 1 Collision and lane change autonomous warning
尼尔转过身来,把石碑指给他的女儿看。一家三口开车去海边度周末。“我明白了,你要我写什么回信?”坐在后座的女儿皮娅问道。"你能读出他写的内容吗?"尼尔反问道。他们的掀背车以大约每小时 40 英里的速度行驶。尼尔瞥了一眼后视镜看着皮娅。由于一时疏忽,他没有注意到前面 5 秒钟处的 SUV 紧急刹车。
他安装在挡风玻璃上的手机有一个来自前置摄像头的应用程序记录。它实时监控车辆。就在 Neel 看着镜子的时候,3 秒钟的阈值被打破了,手机发出一声警告哔哔声,就在 Pia 喊“爸爸小心”的时候。
当这家人打开行李进入酒店时,他们庆幸的是,除了侧镜外,其他人都安然无恙。
全球每年道路事故死亡人数总计约 150 万,刚好相当于毛里求斯的人口。其中 90%发生在低收入和中等收入国家,这些国家拥有的汽车数量不到世界总量的一半。不到 0.1%的车辆配备了高级驾驶辅助系统(ADAS)车道检测和碰撞警告。它们在发展中国家几乎不存在。
新兴经济体的智能手机拥有率中值约为四轮车的 10 倍。虽然我们已经有半自动车辆在世界各地行驶。这篇文章检验了我们离使用移动计算平台作为 ADAS 副驾驶还有多远。
探测车道
如果我们必须教会计算机理解道路场景,第一步是车道检测。从汽车到斑马线,我们检测到的所有其他东西都存在于我们行驶的车道环境中。我们关心的是我们车道上前方车辆的保险杠距离。
我们可以利用车道的一些特征。车道线是平行的;它们是白色或黄色的。在很大程度上,它们在整个道路上是连续的,有一个标准的宽度。对于安装在挡风玻璃上的摄像机,它们通常在图像帧周围均匀分布。从一帧到另一帧,识别的曲线将是连续的。
安装在挡风玻璃上的摄像机拍摄场景的正面。在前视图中,随着我们向地平线上移动,明显的车道宽度减小。这对于计算距离来说不是很好。正是由于这个原因,我们将卫星送入低地球轨道,拍摄鸟瞰图像,进行地形计算。作为第一步,我们需要将 dash-cam 前视图转换为俯视图。
如果我们看下面的图片,车道线似乎在地平线上相交。这就是所谓的消失点。在俯视图中,消失点或地平线附近的点比它们在前视图中相距更远。我们必须将前视图中源图像的一组点映射到顶视图中的一组图像。我们可以手动选择四个这样的点(使用路面作为指导),我们知道这些点在俯视图中会形成一个矩形,但在前视图中会显示为菱形。这一步可以使用消失点作为参考自动完成,因为我们知道菱形的所有斜边都会相交于其上。自动化对于改变摄像机位置不是很稳定(每个 dashcam 素材都有不同的位置),可能需要对过程进行一些调整
Fig -2 Obtaining Images from gray-scale images
如果我们观察图像内部表面的边缘(见上图 2❶-❹),它们似乎形成了一条线,在消失点相交。我们将 canny 滤波器应用于灰度图像,以获得代表边缘的点云。Canny 计算每个像素的亮度梯度。然后它使用阈值来过滤掉一些噪音。如果我们用灰度图像的中值作为基准,这些阈值看起来是最好的。现在,在图像的上半部分可能会有标志,这可能会增加我们后续步骤的噪声,因此我们添加了一个菱形遮罩来过滤感兴趣的区域,如❹.所示
边缘点包含嵌入在噪声中的多条线。在这些明显的线条中有一些是空白的。这些明显的线的斜率有噪声。我们需要一种稳健的方法将边缘点转化为直线。霍夫变换用于识别图像中的线条和形状,在给定一组点的情况下,使用投票算法和约束条件来决定候选线条。我已经对这些控件的图像尺寸进行了基准测试,这似乎为不同帧尺寸的线条提供了合理的预测。
有时,驾驶车辆(自我车辆)的发动机罩,甚至部分仪表板可能会进入前视图。在任何处理之前,我们应该在第一阶段就把它们剔除掉。
透视变换
我们现在已经从边缘点获得了线(见下面的图 3)。使所有这些直线的垂直距离之和最小的点就是我们的消失点。我们使用数学构造来缓解它。我们随后使用这个消失点创建一组源点(红色多边形❷的角)来映射到目的点(俯视图❸).的角)我发现将顶视图尺寸设置为 360 X 360px 似乎足够好了,即使目标图像是 720 px 高。
Fig 3 Creating a birds-eye view
我们也可以将源点的顶部边缘移向消失点。这将增加车道线曲线所基于的路面。然而,随着我们越来越接近消失点,噪声增加,因为更大的图像空间(俯视图)被挤压到前视图中更小的像素区域中。你可以在顶视图中找到两个黑色的三角形尾巴,因为我们已经在前视图图像下面取了最后一个源点。这使我们可以在俯视图中使用完整的车道区域(直到自我车辆),因为它是使用透视变换从正面图像中展开的。因此,它会留下一个黑色的三角形伪影。
从透视图像中创建遮罩
透视图像(3 通道 RGB)还不可用。我们必须将它转换为一个掩码(掩码矩阵),从中我们可以提取车道信息。这是整个过程中最棘手的一步。你必须在不同的光照条件下驾驶过汽车:黎明、中午、夜晚、阴暗处、高速公路上的森林里等等。这些变化中的一些是逐渐的,而作为建筑物/天桥阴影的一些是非常突然的。虽然我们可以在 RGB 颜色空间(255,255,255)中隔离白色通道,但黄色有点棘手。迁移到 HL S(色调、亮度、饱和度)色彩空间更容易管理,我们将使用 HLS 转换的图像作为提取蒙版的起点。
Fig 4 Using Thresholds to create a mask
我们从为白色和黄色蒙版设置一个低/高阈值开始。如果一切都是静态照明和背景,这就足够好了。然而,随着背景和照明条件的变化,我们必须每隔几秒钟更新一次阈值。最敏感的因素是较低的亮度界限(HLS 中的 l ),选择一个不正确的数字(ⓐ——ⓓ,见上面的图 4 ),其他一切都将付诸东流。在我们应用阈值之前,最好有一个标准化步骤。我们可以通过计算该区域上的平均亮度(l ),并使用该平均值来调节我们用于计算掩模的阈值,来使用紧接在车辆❷前面的路面。查看下面的 gif 图,当汽车通过天桥时,该步骤如何恢复阈值。
Fig 5 Recovering from a shadow
检测车道起点和宽度
我们现在有了从顶视图获得的遮罩。我们必须开始从中提取车道信息。作为第一步,我们需要确定左右车道的起点。在屏蔽矩阵(列的总和)的直方图上的峰值给了我们这样的结果。有时车道可能会向左/向右弯曲,因此使用汽车附近的较低 portion❷(见下图 6)来计算直方图更为谨慎。
Fig 6 Detecting the lane start
在大多数道路上,车道的标准宽度为 3.5 到 3.75 米。我们可以使用此信息将顶视图图像中的像素坐标系映射到图像所代表的真实世界坐标系。使用这个比率,俯视图中的所有位置都可以转换成现实世界中的位置。因此,我们可以报告车辆的速度、发生碰撞的时间以及道路在某一点的曲率半径。
清扫窗户
在上一步中,我们已经确定了车道起点。在这一步中,我们必须提取包含车道线的像素。同样,我们使用下面描述的滑动窗口机制。第一步是进行一次水平扫描,获得由左右矩形包围的像素。随后,我们确定这些像素的中点,以确定下一步窗口的水平位置。(参见下面的图 7)我们不断重复这些步骤来提取下一行的像素,直到我们覆盖了整个图像。
我们必须设置窗口高度和宽度参数。高度由我们想要滑过框架的窗口数量决定。一般来说,窗口数量越多,曲线拟合得越好,窗口宽度也越大。设置太高,我们最终会浪费计算资源。通常,我发现每帧 25-35 个窗口是最佳的。将窗宽增加到很高将开始拾取来自人行道或路边植物的噪音。
Fig 7 Finding lane hotspots using window sweeping
这一步有些复杂。在一个窗口内,有时可能选择的像素太少,而在其他情况下可能选择的像素太多(回想一下,我们必须使用宽窗口来扫过)我们如何确定下一个窗口的 x 位置。在每一种情况下,我们都必须拒绝窗口中的信息,因为它是不可用的,并输入下一个窗口 x 位置的估计值。有三个选项可供选择:如果相邻行已被填满,我们可以将其位置偏移车道宽度并继续。否则,如果足够数量的行已经被预填充,我们可以使用一般曲线来估计下一个位置。如果不成功,我们可以使用前一帧中获得的位置继续。如果万不得已,我们可以继续纵向发展。
有时,在一行的高亮像素之间可能会有一个间隙。如果我们忍受它,车道会因噪音而弯曲。最好拒绝这样的帧,并使用来自前一帧的信息来纠正它。每当我们拒绝整个帧时,谨慎的做法是重新校准我们用来创建掩码的阈值。在这个阶段的最后,我们有一组左右像素。
最佳拟合车道中心
我们已经获得了左侧和右侧车道坐标,现在我们必须对这些坐标拟合一条曲线。如果不是因为系统拾取的噪声,这应该很简单。如果我们从底部的几个窗口中取所有点,并让优化器为下一个点或曲线产生一个估计值,它可能最终会给阳光照射的点一个很高的权重,并产生一个不规则的曲线。缓和这种情况的一种方法是在每个窗口中使用(点的)质心,并使用质心来估计曲线(见下图 8)。我发现这对于噪声更鲁棒。
Fig 8 Determining the best fit lane
值得注意的是,左车道线和右车道线都可以估计两条独立的曲线。然而,使用中线估计在两个方面更好。首先,它汇集了两条车道的信息,即使其中一条车道线缺失或错误,这也有助于产生估计值。第二,车道线是平行的,将它们视为两个独立的实体会丢失这些信息。
切换车道和计算偏移
开车时,我们会变换车道,因此系统必须监控我们在车道上的位置,并在需要时触发车道变换。让我们弄清楚。对于每个车道,我们已经确定了车道的起始位置。它的中点给了我们车道的中心。俯视图中摄像机的中心给出了车辆中心的位置。我们可以通过使用之前计算的比率,将其从像素坐标系转换为真实世界的偏移。如果这个偏移量大于车道宽度的一半,我们就准备在下一帧中切换车道(见下面的图 9)。
fig 9 Changing Lanes
对于转换车道,我们将所有东西偏移一个车道宽度。我们保留车道线的旧坐标,为两条车道所共有,并重置另一条车道。在大多数情况下,它顺利发生。(参见下面的图 10)。
Fig 10-Switching from the right to the left lane | NH60 India
我们可以使用多项式系数来确定汽车当前位置的真实世界曲率半径(见下图 11)。这可以是对给出性感曲线的虚假帧的另一种检查,因为计算的半径不会在帧与帧之间突然改变。
Fig 11 radius of curvature
检测车辆
有许多方法用于物体检测。 YOLO 在平衡准确性和计算成本方面相当高效。然而,即使是 YOLO 也无法在移动处理环境中从实时视频流中挤出边界框。对象追踪器精确而快速,可以用有限的计算资源做实时流。我们可以让 YOLO 每隔一段时间制作一张目标地图并让一个目标追踪器大部分时间跟随它。除了从一个坐标系切换到另一个坐标系之外,这很容易实现。
Fig 12 Locating cars
在从追踪器到 YOLO 的切换过程中,我们应该能够在当前帧中定位先前识别的车辆(见上面的图 12)。YOLO 生产粘合盒。因此,我们必须创建一种方法来识别刚刚进入视野的新汽车,并将边界框分配给前一帧中识别的汽车 ID。我们使用 IOU 度量来分配具有现有 id 的头寸。
最后一步是计算车辆参数:位置速度、碰撞时间。如果我们将下边缘的中点作为车辆的位置参考(不完美,因为我们可能会斜着看车辆,但这是一个很好的估计),我们可以计算所有的参数。将坐标转换到俯视图中,我们可以获得真实世界中车辆离摄像机有多远。帧与帧之间距离的变化给出了速度的估计。如果车辆在车道上,汽车正在行驶(由简单的代数不等式确定),我们可以根据观察到的速度确定前车相对于本车减速时发生碰撞的时间(见下图 13)。
Fig 13 Front view and top view
我们基于到边界框的距离进行所有的测量。在大多数情况下,它准确地反映了真实的地面距离。然而,只要作为消失点测量的地平线上的点在帧之间保持一致,这就起作用。然而,我们在坑洼路面、斜坡上行驶,等等。所有这些都会扰乱消失点。这将导致车辆看起来比实际更远或更近。如果我们把系统设置成只有当我们行驶超过 20 KMPH 时才触发,我们就可以避免这些陷阱。我们设计的用例是巡航速度,所以这是可以接受的。
由 YOLO 和追踪器编码的边界框会增加噪声。有时盒子与车辆的轮廓太紧,而在其他盒子上与车辆轮廓更宽松。我们可以通过使用移动平均来估计位置,并使用稍大的周期来估计速度,从而减弱一些噪声。然而,不利的一面是,它降低了系统的一些响应能力。
物体检测的最后一个障碍是道路分隔物对其他车辆的阻碍。测量到车辆的距离时,假设边界框的下边缘与道路平面相交。这在大多数情况下是正确的,但是如果道路中间有一个分隔线或者一辆车挡住了视线,它会裁剪掉最终的边界框。车辆将出现在道路的更远处。这种判断错误会经常发生。然而,这不是一个交易破坏者。为了避免碰撞,我们主要关注与自我车辆在同一车道上的摄像机附近的车辆。我们可以忽略一些反向穿越马路的车辆,忍受一些计算上的失误。
够快吗?能快一点吗?
这在没有 GPU 的台式机或笔记本电脑上实时运行。处理速度对以下参数敏感:触发 YOLO 的时间、输入视频的帧速率和视频的像素分辨率。减少这些参数中的任何一个都会提高处理速度。我发现 Yolo 每 2 秒触发一次,以 360 像素、10 帧/秒的速度工作,比笔记本电脑上的实时帧速率要好。
在移动设备能够实时运行该算法之前,这仍然需要调整。好在还有弥补的余地。对象检测 YOLO 占用了每帧的大部分处理时间。它使用 VGG 网络构建的主体,可以替代较小的移动架构。这将在一些准确性和更快的处理之间进行权衡。我们也可以调整在一个自定义头只做车辆+行人+交通灯检测,而不是 80 类。
一些代码可以重构,以便在对象检测和车道检测之间共享。追求的方向之一是直接使用俯视图(缩放到 446 X 446)进行对象检测和跟踪。这有助于我们跳过在不同坐标系之间多次重新缩放的部分。
最后,如果我们抛开 dash-cam 记录器用例,专注于检测、报警和日志记录(可能立即有听觉音调,并在驱动器后有表格摘要),我们可以去掉用于产生增强视频的部分代码。这将使我们的速度提高一个数量级,允许移动设备处理实时信息。
这会导致什么?
汽车行业的监管环境正在发生变化。较低的排放标准加上较高的安全评估要求增加了合规成本。在监管不利的情况下,投资在便携式设备上运行的 ADAS 平台将间接有助于安全性,并以制造商极低的前期和运营成本改善整体客户体验。
运输经济的未来将建立在微观交易的基础上,而微观交易本身就需要区分谨慎和疏忽
汽车行业的终端用户角色也在重新定位。车主、司机和通勤者传统上是同一个人。在未来,这些角色将由不同的个人来执行。这是有道理的,因为每辆停放的车辆都是闲置资产。运输经济的未来将建立在微观交易的基础上,而微观交易本身就需要区分谨慎者和疏忽者。这就是主动辅助算法可以发挥作用的地方。从驾驶时的轻推行为开始,到根据驾驶分数历史确定保险费。
汽车工业的最终产品正在发生变化。这种变化需要新的技能和关系。电动汽车的部件数量比传统的汽油发动机少一个数量级。该行业可能会对其供应商群进行横向整合。在这种动态中,承担了开拓成本的先行者很可能在以后获得有利的标准和网络。ADAS 为传统玩家提供了一个机会,让他们在这一转变过程中押下较小但渐进的赌注。
最后,ADAS 的现有参与者,从创新者市场转向早期采用者的障碍之一是意识。创建一个半功能的智能手机应用程序是他们可以尝试的技巧之一。
并非所有当前的智能手机都支持主动辅助算法所需的处理能力。然而,在新兴经济体,每年有三分之一的智能手机被替换。这难道不是一个为基于移动设备的驾驶助手造势的有力案例吗?
其他链接:
- Colab 笔记本【在 youtube 视频上运行该过程,替换新视频的链接,调整设置】
- 包含全部代码的 Github 存储库
车辆位置+碰撞时间叠加在顶视图附文…
github.com](https://github.com/visualbuffer/copilot)
汽车行业一直在以惊人的速度适应变化。你一直在管理这些变化吗?我很想听听你对未来的看法。同样,如果您正在构建这些解决方案,我很想听听您的故事。请在我的 LinkedIn 上留言。
Python 中的共指消解
使用 NeuralCoref 将基于神经网络的共指消解集成到您的 NLP 管道中
在人类语言中,内水平意识在理解(解码)技能、写作(编码)技能和一般语言意识中起关键作用。内指包括语篇中的回指、下指和自我参照。
指代是指一个词为了其意思而回指文本中的其他概念。
*David went to the concert. He said it was an amazing experience.***He** refers to *David*.
**It** refers to the concert.
指代发生在一个词指代文本后面的想法时。
*Every time I visit her, my grandma bakes me cookies.***Her** refers to my grandma.
共指消解是 NLP (自然语言处理)相当于信息检索系统、会话代理和亚马逊的 Alexa 等虚拟助理中使用的内视感知。它的任务是将文本中涉及相同底层实体的提及进行聚类。
例如:
“我”、“我的”、“她”属于同一类,而“乔”、*“他”*属于同一类。
解析引用的算法通常寻找与引用表达式兼容的最近的前面提及。代替使用基于规则的依赖解析树,神经网络也可以被训练,其考虑单词嵌入和提及之间的距离作为特征。
neural refe是一个集成在 SpaCy 的 NLP 管道中的开源 python 包。您可以使用 pip 安装 NeuralCoref:
pip install neuralcoref
或来自虚拟环境中具有依赖关系的源:
SpaCy 和 NeuralCoref 可用于创建生产就绪的 NLP 应用程序,只需稍加微调。例如,让我们解析历史上的 美国诉尼克松 案,以检索引用美国前总统理查德·尼克松的事实:
**输出:
事实计数:108
- 在指控白宫某些工作人员和总统的政治支持者违反联邦法规的起诉书后,特别检察官在美联储的领导下提出了一项动议。
- 继续。17©要求在审判前出示与总统和其他人之间准确确定的谈话和会议相关的某些磁带和文件的传票。
- 总统以行政特权为由,提出动议撤销传票。
该脚本使用 Urllib 抓取网页,并使用 Beautiful Soup 解析 HTML。我们将文本加载到我们选择的空间模型中;您可以从终端下载预先训练的空间模型,如下所示:
*python -m spacy download en_core_web_lg*
SpaCy 管道分配单词向量、上下文特定的标记向量、词性标记、依存解析和命名实体。通过扩展空间的注释管道,您可以解析共同引用。
您可以使用doc._.coref_clusters
属性检索所有相关提及聚类的列表,并使用doc._.coref_resolved
属性用每个聚类中的主要提及替换相关提及。
SpaCy 有一个内置的无监督句子标记器,可以将文本分成一系列句子。对于你感兴趣的主题(如总统),使用小写的词条化句子进行近似字符串搜索。
Reddit 首页评分与评论的相关性
我不是 Reddit 的大用户,但当我在那里时,我通常只在几个子网站上闲逛(r/dataisbeautiful,r/geography,r/philadelphia,r/emo 和其他几个网站)。除了广受欢迎的数据 viz subreddit,这些数据都不会产生你在 reddit 首页看到的分数。
我说这些只是为了指出我没有挖掘出 Reddit 文化的所有细微差别。然而有一天,在仔细阅读了互联网的首页后,我确实有一个问题——一个热门帖子的分数和围绕它的对话量之间有关联吗?
It looks like r/worldnews really struck up some conversations!
首先,获取数据。我看了一下 Reddit 主页的 api,但没有看到在给定的日期和时间内拉顶部帖子的方法。所以我求助于 Wayback 机器的 API,它可以使用特定的日期和时间作为端点,并将返回最近的网页截图的 url。
The front page is pretty well archived it appears.
我非常自信地认为我可以为 2018 年收集大量数据,于是我跳到 R 并生成了一个完整的 URL 列表来调用 API。
library(lubridate)
dateRange <- gsub(“-”,””,seq(ymd(‘20180101’),ymd(‘20181231’), by = ‘1 day’, truncated=2))
base_url <- "[https://archive.org/wayback/available?url=reddit.com](https://archive.org/wayback/available?url=reddit.com)"#create list of api urls
url_list <- c()
for (date in dateRange) {
full_url <- paste(base_url, "×tamp=",date, "120000", sep="")
url_list <- c(url_list, full_url)
}
现在我们可以调用 Wayback 机器来获取网页截图列表。
#create list of archive links
archive_list <- c()
archive_times <- c()for (url in url_list) {
#get raw result from api call
raw.result <- GET(url = url)
raw.result$status_code
#get raw content from results
this.raw.content <- rawToChar(raw.result$content)
#put content into list
this.content <- fromJSON(this.raw.content)
#extract archive url from list and add to archive_list
archive_times <- c(archive_times, this.content$archived_snapshots$closest$timestamp)
archive_list <- c(archive_list, this.content$archived_snapshots$closest$url)
}
这给了我们一个 365 个 URL 的列表,从每天中午开始捕获。现在开始真正的网络抓取。可能有更快的方法,但是我用一个老式的来循环,并使用 rvest 包来抓取该页面 25 个帖子中每个帖子的分数、评论数和 r/subreddit。
在将 r/subreddit 值添加到 datalist 变量之前,我通过检查来确保 r/subreddit 值的长度大于 0(即任何帖子实际上都被提取了),从而包含了一些简单的错误处理。
循环完成后,我使用 rbind 填充数据帧并过滤掉任何有问题的数据。
#create empty list
datalist = list()#loop through archive urls
for (i in 1:length(archive_list)) {
#get all the html from the webpage
webpage <- read_html(archive_list[i])
#filter all the .things
things <- webpage %>%
html_node("#siteTable") %>%
html_nodes(".thing")
#get votes
score <- things %>%
html_node(".score") %>%
html_text()
#get number of comments
comments <- things %>%
html_node(".comments") %>%
html_text()
#remove " comments" and convert to number
comments <- as.numeric(gsub(" comments","", comments))
# get post subreddit
subreddit <- things %>%
html_node(".subreddit") %>%
html_text()
#get date of page
date <- gsub("[http://web.archive.org/web/|/https://www.reddit.com/](http://web.archive.org/web/|/https://www.reddit.com/)", "", archive_list[i])if (length(subreddit) > 0) {
print(paste(unique(date),length(subreddit),sep=" "))
#create temp df
temp <- data.frame(date = date, score = score, comments = comments, subreddit = subreddit)
#add it to the list
datalist[[i]] <- temp
}
}#make a df from the datalist
main_data = do.call(rbind, datalist)
#remove incomplete posts
reddit_posts <- main_data %>%
filter(score != "•",
!is.na(score),
!is.na(comments)
) %>%
mutate(score = as.numeric(sub("k", "e3", score, fixed = TRUE)),
subreddit = gsub(".*r/","r/",subreddit))
擦伤怎么样了?不算太坏。该网站在一年的 75%的时间里成功地发布了每日帖子。我没有对此进行彻底的调查,因为我有足够的数据来处理,但我认为 Wayback 机器在 Reddit 网站重新设计方面存在一些问题。
现在我们有了一个新生成的数据集,但是为了产生我想要的可视化效果,它需要一些争论。
- 找出将最多帖子发送到首页的八个子编辑
- 将来自非顶级订阅者的帖子的 subreddit 值更改为“其他”
- 对子编辑因子级别进行重新分类,使其以降序排列,末尾是“其他”。
#get top 8 subreddits
top_subs <- reddit_posts %>%
group_by(subreddit) %>%
summarise(count=n()) %>%
top_n(8, count) %>%
ungroup()#create vector of top_subs
top_subs <- as.character(top_subs$subreddit)#make notin operator
'%!in%' <- function(x,y)!('%in%'(x,y))reddit_posts_reduc <- reddit_posts %>%
mutate(subreddit = case_when(
subreddit %!in% top_subs ~ 'other',
TRUE ~ as.character(.$subreddit)
))#get list of factors in descending order
factor_order <- reddit_posts_reduc %>%
group_by(subreddit) %>%
summarise(count=n()) %>%
arrange(desc(count)) %>%
select(subreddit)#overwrite with list
factor_order <- as.vector(factor_order$subreddit)
#remove "other" from first position
factor_order <- factor_order[-1]
#create new factor level list
factor_order2 <- factor_order
#update new factor list with ordering info
for (i in 1:length(factor_order)) {
factor_order2[[i]] <- paste("#",i," ",factor_order[[i]], sep = "")
}
#append other to both factor lists
factor_order <- append(factor_order, "other")
factor_order2 <- append(factor_order2, "other")#update dataframe levels with update factor levels
reddit_posts_reduc$subreddit_f <- mapvalues(reddit_posts_reduc$subreddit, from = factor_order, to = factor_order2)
levels(reddit_posts_reduc$subreddit_f)
现在,是时候策划了。我把评论的数量标在 x 轴上,分数标在 y 轴上。我使用轴限制来说明异常值,最终结果是一个按子网格分组并标有相关系数的小多次波图。
#plot data
reddit_posts_reduc %>%
ggplot(aes(
x=score,
y=comments,
color=subreddit_f)
) +
geom_point(size=3, alpha=0.4) +
facet_wrap(~subreddit_f, ncol = 3) +
geom_smooth(se=F) +
theme_fivethirtyeight() +
theme(axis.title=element_text()) +
# labs(title = "Correlation between score and comments on front page",
# subtitle = "Posts from the front page of Reddit in 2018 plotted to show correlation between score and the number of comments. Posts are grouped by the eight subreddits that sent the most posts to the front page with all other posts grouped in other.",
# caption = "Data from Reddit via Archive.org\nChart by @jared_whalen"
# ) +
theme(legend.position="none") +
stat_cor(method = "pearson", label.x = 110000, label.y = 9000) +
scale_y_continuous(label=unit_format(unit = "K", scale = 1e-3, sep=""),
limits=c(0,10000)) +
scale_x_continuous(label=unit_format(unit = "K", scale = 1e-3, sep=""),
limits=c(0,150000)) +
xlab("Score") +
ylab("Number of comments"**)**
我从这个项目中得到的东西
- 如何使用 Wayback 机器的 API 来抓取存档的页面
- 更好地理解重新指定因子级别,以便在打印时自定义排序
这里是整个源代码的要点。
关联与因果——酒精如何影响预期寿命
我们应该多喝酒来长寿吗?
相关性并不意味着因果关系!
作为初级统计学家和数据科学家,我们反复听到这句话。但那实际上是什么意思呢?这个小分析借助于 R 和简单回归揭示了这个话题,聚焦于酒精如何影响健康。
狄俄尼索斯的困境
关于酒精对健康的影响以及它如何改变人的寿命,已经有很多研究了。只要在谷歌上输入*“酒精预期寿命研究”*,我们就会得到大约 11,000,000 个结果。有些人可能声称适度饮酒实际上对我们的健康有益,而大多数研究表明,即使每天一杯酒也会降低预期寿命。
这项分析研究了不同国家的饮酒量和平均预期寿命之间的关联模式,解释了可能的相关性,并提供了为什么这些相关性可能存在的见解。
我最初的假设是,预期寿命更高的国家也消费更多的酒精。起初这听起来可能有争议,但这可能是由于其他因素,如更高的生活质量,只有它的副产品是获得酒精饮料。
配料
这项任务使用了 3 个数据集:
- Drinks.csv :各个国家 15 岁及以上人口每年人均饮酒量(啤酒、葡萄酒和烈酒)
- life expectation . CSV:各个国家的预期寿命和其他健康因素
- countries of world . xlsx:各个国家的地理和社会经济数据。
混合饮料
数据包含了 193 个国家的啤酒、葡萄酒和烈酒。这些数字存储为字符,因此我们可以将它们转换为数字数据类型。
缺失值在数据集中显示为问号,我们将用 NA 值替换这些符号。
我们需要一种有意义的方式来汇总这些服务:根据众所周知的刻板印象,法国人可能会消费更多的葡萄酒,而德国人可能会喝更多的啤酒。然而,我们需要一种方法在相似的范围内比较这些国家。
我编写了一个函数,使用以下公式计算每个国家纯酒精的总升数:
总 _ 升_纯 _ 酒精 = 啤酒 _ 份数∫(12∫0.0295∫0.05)+葡萄酒 _ 份数∫(5∫0.0295∫
我们最终得到了下表:
Table 1: Drinks dataset
生活中的期望
life_exp
数据包含各种健康指标(出生时的预期寿命、60 岁时的预期寿命和健康预期寿命),显示了从 1990 年到 2013 年按性别分列的综合数据。
我关注的是 2012 年男女出生时的预期寿命,并加入了按国家分列的drinks
数据。
在预期寿命和饮酒量之间进行一个简单的相关性测试,我们可以看到一个 0.521 的结果。
这标志着适度的高相关性,表明酒精消费量高的国家也有更高的预期寿命。我们将进一步调查这一现象。
我们是世界
countries
的数据比其他两个稍微混乱一些。它被存储为一个*。xlsx* 文件。在导入过程中,我们跳过了第 1 页上的前 3 行不重要的内容。(现在)第一行包含标题,它的一部分也留在了第二行。
Table 2: Countries dataset
我将第一行和第二行合并成一个标题,清除了列名(空格、点等)。)并将必要的列转换为数字类型。最后,我将地理和社会经济数据与之前的数据集合并。
相关性和因果关系
让我们快速看一下不同的因素是如何与预期寿命相关联的:
Figure 1: Correlations of numeric features
如前所述,饮酒量(混合饮酒和分开饮酒)与预期寿命呈相对正相关。婴儿死亡率和死亡率当然是负相关的(人死得越多/越快,平均水平就越低)。
Figure 2: Highest positive and negative correlations
手机数量、文化水平和人均 GDP 也与寿命延长高度相关。这导致了我一开始的假设:教育程度更高、更富裕、技术装备更好的国家有更高的预期寿命。这些情况为公民提供了酒精饮料,他们比没有达到这一水平的贫穷国家消费更多的酒精饮料。
我们可以看到每个区域的相关性来证明这一说法:
Figure 3: Alcohol on Life Expectancy
这个假设似乎确实是对的。更发达的地区如欧洲、美洲和西太平洋(澳新等。)根据loess
回归似乎有正相关。另一方面,由于经济/文化/宗教原因,像非洲和地中海东部这样的欠发达地区倾向于消费较少的酒精,他们的预期寿命不受饮酒量的影响。**
如果我们看看人均国内生产总值对预期寿命的对数回归,它显示了最清晰的画面:
Figure 4: GDP on Life Expectancy
摘要
我们首先可以看到饮酒与预期寿命的关系,以及为什么立即下结论是危险的。经过进一步的调查,我们发现,发达国家的人均寿命最高,他们也倾向于消费更多的酒精,但这并不一定意味着另一个。这就是为什么从相关性中暗示因果关系是非常危险的!
Source: https://xkcd.com/552/
编后记
这个项目是作为匈牙利中欧大学掌握数据科学过程课程的要求而完成的。R 代码和数据集可以在 GitHub 上我的ceu _ life-expectation存储库中找到。
相关性并不意味着因果关系
肺癌会导致吸烟吗?
Photo by Sajjad Zabihi on Unsplash
正如我们今天所知,吸烟会导致肺癌。然而,这一事实在 20 世纪 50 年代并不完全清楚,当时首次研究表明吸烟和肺癌之间的相关性。其中一位怀疑论者是统计学家 R.A. Fisher,他推断因果关系可能正好相反:
“那么,有没有可能,肺癌——也就是说,必须存在的癌前状态,并且已知在那些将表现出肺癌的人中存在多年——是吸烟的原因之一?我认为不能排除。”
需要说明的是,费舍尔不仅是一名统计学家,还是一名烟瘾很大的人,所以他的观点很可能有失偏颇。然而,他有一个观点:相关性本身不足以确定因果关系。还有什么可以解释相关性?
香烟导致肺癌
通常,如果两个变量 A 和 B 相关,至少有四种可能的解释:
- a 导致 B
- b 导致 A
- a 和 B 都是由第三个变量 c 引起的。
- 机会(相关性是虚假的)。
那么香烟和肺癌之间的因果联系是如何建立的呢?在 50 年代和 60 年代,大量的研究证实了这种相关性。此外,研究还表明,重度吸烟者比轻度吸烟者患更多的癌症,烟斗吸烟者患更多的唇癌,而吸烟者患更多的肺癌。所有证据加在一起,使这个案子变得清楚了。1964 年,美国卫生局局长路德·特里正式宣布了这种因果关系:
“考虑到来自许多来源的持续的和越来越多的证据,委员会的判断是,吸烟在很大程度上导致了某些特定疾病的死亡率和总体死亡率。”
特里总结说,吸烟对健康有害。
source: xkcd
由第三个变量引起的相关性
有时,两个变量之间出现相关性仅仅是因为它们都是由第三个未观察到的变量引起的。教科书上的一个例子是纽约市冰淇淋销售量和谋杀率之间的相关性。显然,这种相关性是由第三个变量引起的:季节。夏天是冰淇淋和犯罪的黄金时间。
其他时候,由第三个变量引起的相关性可能不太明显。考虑雌激素水平和心脏病之间的联系:在 90 年代,研究表明女性的雌激素水平与心脏病风险呈负相关。这是一个重要的问题,因为心脏病是 65 岁以上妇女死亡的主要原因。那么,为什么不默认推荐激素替代疗法用于绝经后低雌激素女性呢?事实上,这是千年之交前的普遍看法。
然后,女性健康倡议报告了一项涉及 16 万多名女性的长期对照研究的结果,反驳了普遍的看法:激素替代疗法没有降低心脏病风险,在某些情况下甚至会适得其反。在这种情况下,第三个变量,绝经,影响心脏病的发病率和雌激素水平,导致观察到的相关性被误认为是因果关系。
另一个显著的例子是疫苗和自闭症之间的明显联系,这引发了持续至今的反疫苗运动。1998 年,医学杂志 The Lancet 发表了 Andrew Wakefield 博士的研究,声称发现了自闭症和 MMR(麻疹、腮腺炎、风疹)疫苗之间的联系。那篇论文有很多问题,最重要的是样本量很小——显然是人工挑选的——只有 12 个孩子。与第三个变量的相关性也可能是一个问题:自闭症症状的发展和第一次接种疫苗都发生在幼儿期,因此预计存在时间相关性。
由于其他研究人员指出了这项研究的缺陷,韦克菲尔德的论文很快被《华尔街日报》撤回。后来,韦克菲尔德不仅被指控为糟糕的科学,还被指控为蓄意欺诈。
虚假相关
你知道 1999 年至 2009 年间,每年掉进游泳池淹死的人数和尼古拉斯·凯奇的电影数量是相关的吗?
他的电影是不是烂到让观众想在自己的池子里自杀?不,这是一个虚假关联的例子,一个幸运的巧合。泰勒·维根在他的网站上有很多这样的例子。
当研究人员测试大量可能的联系时,伪相关性是一个严重的问题。在《不可思议的统计数据》中,我提到了瑞典 1992 年的一项研究,该研究将住在高压电线附近与儿童白血病联系起来:研究人员在 25 年的时间里调查了住在高压电线 300 米范围内的所有人,并在 800 多种不同疾病中寻找具有统计意义的发病率增长。当然,通过一次查看这么多不同的可能性,很有可能会偶然发现至少一次统计上显著的相关性。这就是所谓的看别处效应。
结论:小心相关性
相关性本身并不意味着因果关系。有时这两个相关变量是第三个未被观察到的变量的结果,例如雌激素水平和心脏病风险之间的联系。有时,这种相关性可能是虚假的,例如电力线和儿童白血病之间的联系。
建立因果关系比寻找相关性需要更多的工作,因为这是一个更强有力的陈述。这就是推断的问题:因果关系只能推断,永远无法确切知道。
参考
- 乔丹·艾伦伯格,如何不犯错:数学思维的力量
- 饶&安德拉德,MMR 疫苗与自闭症
在我的个人资料页面上找到更多我的故事,例如:
圣经代码、投资基金、彩票和“看别处”效应的诅咒
towardsdatascience.com](/the-statistics-of-the-improbable-cec9a754e0ff) [## 不要根据结果来判断决定
马后炮如何影响我们的判断
medium.com](https://medium.com/swlh/dont-judge-decisions-by-their-outcomes-6f37bec6fd44)
相关性不是因果关系
从医疗保健到商业管理,为什么这些概念的混淆具有深远的影响
介绍
在相关数据中,一对变量是相关的,因为一个变量可能会随着另一个变量的变化而变化。这种关系可能会让我们认为一个事物的变化会导致另一个事物的变化。本文通过解释相关性、因果关系以及经常将二者混为一谈的偏见,澄清了这种错误的想法。
人类的大脑简化了输入的信息,所以我们可以理解它。我们的大脑经常基于轻微的关系或偏见对事物做出假设。但是这个思考过程并不是万无一失的。一个例子是当我们把相关性误认为因果关系时。偏见会使我们得出这样的结论:如果一件事和另一件事同时以同样的方式发生变化,那么这两件事必然会引起另一件事。本文通过探索这些主题和人类大脑的偏向性,澄清了相关性等于因果关系的误解。
关于相关性和因果关系
相关性是两个变量之间的关系或联系,其中一个变量发生变化,另一个变量也可能发生变化。但是一个变量的变化不会引起另一个变量的变化。这是一种关联,但不是因果关系。你从孩子到成人的成长就是一个例子。当你的身高增加时,你的体重也会增加。长高并没有让你变宽。相反,成熟到成年导致这两个变量增加——这就是因果关系。
商业中的因果关系
假设我们想给我们的一些客户提供促销或折扣。我们的营销部门想要最大化 delta,换句话说,促销带来的销售增长。所以我们需要决定哪些客户会给我们在促销或折扣上的投资带来最好的回报。我们想只向你的前 10%的客户提供吗?还是垫底的 10%?
你可能会认为推动更多销售的用户对你的商业成功更有责任。然而,这种假设可能是错误的。向哪些客户提供促销的最佳选择可能完全不同。在缺乏有效的实验或分析的情况下,你对这些问题没有准确的答案。
认知偏差
有许多形式的认知偏差或不合理的思维模式经常导致错误的结论和经济决策。这些类型的认知偏见是人们在商业和营销中假设错误原因的一些原因:
- **确认偏差。**人都想对。他们经常不能承认或接受他们在某些事情上是错的,即使这种态度会导致最终的伤害和损失。
- 因果关系的错觉。过于看重自己的个人信念、过度自信和其他未经证实的信息来源,往往会产生一种伤亡的错觉。一个经济例子是最近的美国房地产泡沫。数百万人相信,以远高于其实际价值的价格购买房屋将继续带来投资回报,因为这种情况发生在过去。
- **金钱。**你想销售你的产品。如果赚钱的欲望蒙蔽了你的逻辑,你在营销和其他业务上的花费可能会超过你的投资回报。
- **主要营销含义。**营销统计和数据往往复杂且令人困惑。当不存在因果关系时,很容易看出变化的销售数字和企业中许多其他变量之间的关系。
实验
知道某物有价值需要实验。实验有助于你理解你是否做出了正确的选择。但是这是有代价的。如果你因为不给工作组带来价值的特性而拖了他们的后腿,你会赔钱。但是你会学到这个特性的重要性。
实验的价值在于完成这两件事:
- 在不同的选择中做出决定。
- 量化最佳选择的价值。
实验变量
一个科学有效的实验需要三种类型的变量:受控变量、独立变量和从属变量:
- 受控制的变量保持不变,因此可以在静态环境中测量彼此相关的其他变量。
- 实验的独立变量是唯一可以改变的变量。
- 因变量是自变量发生变化时观察到的结果。
任何不受控制的变量或中介变量都会影响实验的准确性。因此,为了正确评估实验结果,需要对它们进行识别和剔除。不可控变量的差异也会影响自变量和因变量之间的关系。
不受控制的变量增加了无关因素对实验结果的影响。相关性可能是假定的,假设可能是在不存在的地方形成的。精确的分析变得困难或不可能。从不受控制的变量中得出的结论的例子显示在儿童音乐课和随后的手机癌症例子中。
我们的大脑如何欺骗我们
很容易观察到相关数据的连续变化,并假设一个因素导致另一个因素。这是因为我们的大脑天生就有因果关系认知偏差。我们需要理解大量的输入数据,所以我们的大脑简化了这些数据。这个过程被称为启发式,它通常是有用和准确的。但并不总是如此。试探法出错的一个例子是,每当你相信相关性意味着因果关系。
虚假相关
这是一种数学关系,其中两个或两个以上的事件或变量相关联,但不是因果关系,这是由于巧合或某个第三个看不见的因素的存在
儿童和音乐课
在对人类大脑发展进行研究后,研究人员得出结论,参加音乐课的 4 至 6 岁儿童在与记忆和注意力相关的领域表现出大脑发展加快的证据。根据这项研究,我们有偏见的大脑可能会很快将这些点联系起来,并得出结论,音乐课可以促进大脑发育。但是还有其他变量需要考虑。孩子们上音乐课这一事实是财富的标志。所以他们可能接触到了其他已知能促进大脑发育的资源,比如良好的营养。
这个例子的要点是,研究人员不能仅从这么多数据中假设音乐课会影响大脑发育。是的,这显然有关联,但没有因果关系的实际证据。我们需要更多的数据来得到真正的因果解释。
癌症和手机
如果你研究一张显示癌症病例和手机数量的图表,你会注意到这两个数字在过去的 20 年里都上升了。如果你的大脑以因果关系认知偏见处理这些信息,你可能会认为手机导致癌症。但这太荒谬了。除了两个数据点都在增加之外,没有其他证据。在过去的 20 年里,很多其他的东西也增加了,它们不能全导致癌症或由手机使用引起。
可解释性
为了找到因果关系,我们需要可解释性。在人工智能和大数据分析的时代,这个话题变得越来越重要。人工智能提供基于数据的建议。有时候,人类看不到那些建议的任何理由,除了是一个 AI 做出的。换句话说,它们缺乏可解释性。
医学中的可解释性
FDA 不会批准缺乏解释力的癌症治疗。想一想这种情况。基于人工智能对你的基因组、你的癌症 DNA、数百万其他病例和更多数据的分析,即使你无法解释计算机的神经网络是如何提出确切的治疗方法的,你想要对你的癌症进行最好的治疗吗?或者你更愿意有一个你能解释原因的次优治疗?
医学可解释性可能是本世纪最大的话题之一。
单向对双向
相关性是双向的。我们可以说移动电话的使用与癌症风险的增加相关,癌症病例与移动电话的数量相关。基本上,你可以交换相关性。在因果关系中,我们可以说一项新的营销活动导致了销售额的增加。但是说销售的增加(在活动运行之后)导致了营销活动没有任何意义。
根据定义,任何因果陈述都是一种方式。这是一个很大的线索,关于你处理的是相关性还是因果性。
巨大的困境
在《教育对收入的因果影响》一书中,大卫·卡德说,更好的教育与更高的收入相关。但是他说的最重要的事情是,如果我们不能做一个实验,用我们所有的
变量不变,我们不能从相关性中推断因果关系。我们总能把可解释性带到桌面上。但是在现实生活中,有足够大的问题,基于可解释性的原因很难被证明。从科学的观点来看,它们只能被称为理论。
在缺乏实验证据的情况下,很难知道教育程度较高的工人所观察到的较高收入是由他们的高等教育造成的,还是收入能力较强的个人选择了接受更多的学校教育。
—大卫·卡德,教育对收入的因果影响
高收入会导致高等教育吗?高等教育会带来更高的收入潜力吗?我们不知道。但是,我们可以进行预测。我们可以利用这种相关性,根据一个人的教育程度来预测他的收入潜力。我们还可以根据他的收入预测他的教育程度。
好的预测是基于相关性的
考虑到本文的上下文,这听起来像是一个矛盾。相关性是指分析静态历史数据集,并考虑观察结果和结果之间可能存在的相关性。然而,预测不会改变一个系统。这就是决策。为了做出软件开发决策,我们需要理解如果您采取行动或不采取行动,它会对系统的发展产生什么影响。决策需要对行动的影响有一个粗略的了解。
什么是预测?
我们不会通过发展更好的随意理解来做出更好的预测。相反,我们需要知道我们用来做预测的技术的精确限制,以及每种方法能为我们做什么。
参考
Lovestats (2019)。“动画片。”LoveStats 博客。从 lovestats.wordpress.com 取回。
卡片,D…(1999)."教育对收入的因果影响。"劳动经济学手册,第 3 卷。
销售线索得分预测和成本效益分析
现实场景中分析的真正优势
内容
-成本收益分析
-期望值
-领先得分概率
-分类
-混淆矩阵
-准确率、召回率和 F-1 得分
问题陈述和解决方案
一家名为 X 教育的公司销售在线课程。任何时候有人访问他们的网站,他们要么注册课程,要么不注册。那些在看到课程信息后仍未注册的人被称为潜在客户。
现在,为了将这些潜在客户吸引回他们的课程,公司尝试了不同的策略,如电子邮件营销或特殊折扣等。问题是,举例来说,如果公司有 50 个潜在客户,并向所有 100 个客户发送电子邮件,可能只有 10 或 15 个客户会注册。因此,公司损失了金钱和精力,这需要我们稍后进行成本效益分析。
解决方案是使用预测模型来确定每个潜在客户参加课程的概率,以便公司只给那些高潜力的潜在客户折扣或发送电子邮件。
要查看完整的分析,请查看这个笔记本。它遵循一种分类方法,在这种方法中,模型使用称为 conversion(0,1)的目标变量进行训练,其中 0 表示客户不会返回,1 表示客户会返回。
随机森林和单热编码
一种热门编码是将分类变量转换为数值的方法,以便机器学习模型可以解释它。随机森林是一种集成方法,它通过选择变量子集作为预测因子来迭代工作,并试图减少模型的方差。在本书统计学习介绍中阅读更多关于随机森林的内容。
销售线索得分概率
通过应用机器学习模型,我计算出了每个潜在客户成为他们客户的概率,如下图所示。这些只是所有值的子集,我们可以按照概率从高到低的顺序排列。
混淆矩阵(准确性是一个神话)
上面我们看到了概率方面的结果,下面是二进制信息方面的结果,简单地说是或不是。
Accuracy = 80%
虽然准确率为 80%,但我们应该理解,这是以 0.5 的概率作为分类的阈值。换句话说,任何概率大于 0.5 的人都被认为没有流失,否则为流失。这是一个坏主意,因为可能 0.1 是正确的阈值,或者 0.2 或 0.3 才能获得最佳结果。
精确度、召回率、F-1 评分和 AUC 曲线
Precision :它说明了我们的模型中有多少正面预测值是真正正确的。(真正)除以(真正+真负)
回忆:也叫真阳性率,表示在所有阳性人群中,有多少人被正确预测。
(真阳性)除以(真阳性+假阴性)
**假阳性率:**所有阴性中,有多少是实际预测为阴性。
AUC 曲线(真阳性率和假阳性率之间的权衡)
简单地说,AUC 曲线解决了定义正确的基于阈值的分类的问题。它将阈值从 0.0%更改为 100.0%,而不是保持在 0.5%,并绘制了一个图表,使我们能够确定最佳可能结果。
这看起来可能很复杂,但关键是 0.58 左右的红线表示对结果进行分类的最佳阈值是 0.58。这意味着如果小于 0.58,则为 0 类,如果大于 0.58,则为 1 类,以产生可能的最佳精度。
预期值
根据业务用例,混淆矩阵的每个单元(真阳性、真阴性、假阳性和假阴性)可能对结果有不同的影响。例如,错误地将某人分类为患有癌症,而他后来发现他没有(假阳性)患有癌症,这可能会使他付出金钱和压力的代价,然而,错误地将某人分类为没有癌症,而他后来意识到他患有癌症(假阴性)将会使他付出生命的代价,后者显然更重要。因此,我们可以制定一种方法,其中混淆矩阵的每个单元格包含其概率,并且我们基于我们业务的历史价值将每个单元格乘以某个值“v”。请参见下面每个单元格的概率:
Probability for each cell
注意:我们还可以基于期望值定义分类器的决策边界。
成本效益分析
现在回到我们业务问题的初始阶段,让我们假设 X Education 的销售团队决定向所有被归类为潜在买家的潜在客户发送电子邮件通知。并且不会向被分类为非购买者的类别发送电子邮件。
发送每封电子邮件的成本:5 美元*(假设)*
如果客户购买,利润:100 美元*(假设)*
**真实肯定:**说客户会流失,我们没有发送电子邮件。
**真否定:**说客户不会流失我们发邮件,客户会购买。
**误报:**说客户会流失,但他没有,所以没有发送电子邮件,也没有产生利益。
**假阴性:**说客户不会流失,但他确实会流失,所以我们发出了电子邮件,但他没有购买。
真正:(0 成本,0 收益)= 0
真负:(5 成本,100 收益)= 100–5 = 95
假正:(0 成本,0 收益)= 0
假负:(5 成本,0 收益)= 0–5 =-5
Cost-Benefit Matrix
预期利润=概率矩阵和成本效益矩阵的乘积
对这些值求和后,我们得到:
结论
如果 X Education 使用我的模型对新客户进行分类,并向那些被分类为潜在买家的人发送电子邮件,它可以产生 70485 美元的总体预期利润。
注意:为了进一步分析,我们可以使用概率先验,以防我们有高度不平衡的类分布
成本函数:机器学习的基础
这一关键概念决定了您将模型与数据相匹配的能力
将数据集拟合到模型是机器学习和数据科学的基础。通过这种方式,我们能够创造预测工具,帮助人们做出重要决策。
这通常是通过最小化模型生成的预测与模型训练、验证和测试阶段的实际数据之间的差异来实现的。
为此,我们必须能够识别模型预测和数据实际值之间的差异。为了使模型符合数据并创建有价值的预测工具,我们必须能够使用最小化函数快速计算出差异。
这是成本函数的目标。
什么是成本函数?
在数据科学中,成本函数计算模型预测和数据集之间的差异。
根据维基百科的定义,成本函数是“将一个事件或一个或多个变量的值映射到一个实数上的函数,该实数直观地表示与该事件相关的一些“成本”。从更实际的角度来说,它是一个函数,用来计算一个你将要最小化或最大化的参数。
在数据科学中,这通常意味着识别模型预测和训练数据集之间的差异。通过这种方式,您可以量化模型预测中的误差,并使用优化方法来最小化该误差。
在名称成本函数中,“函数”指的是计算一个值的函数,而“成本”指的是该函数正在计算的惩罚。
注意,成本函数的概念是非常灵活的,它可以被定制来匹配一种情况。而是写一个等式,抓住你真正关心的东西。
成本函数是如何使用的?
使用成本函数的一个例子是一个人模拟一栋建筑的能源性能。(S)他希望最小化能量消耗,并相应地写一个成本函数。但是最小的能源消耗将是一个从不加热或冷却空间的建筑!显然不能接受。
(S)他可以在成本函数中添加一项,该项也对居住者不舒服的小时数的结果进行惩罚。那么优化的结果将是使用最少能量的设计,同时仍然保持空间中的舒适性。这个成本函数可能看起来像这样:
成本=能源消耗+ 1,000,000 *不舒适时间
以这种方式,一个小时对居住者的预测不适相当于一百万单位的能量消耗。现在,系统的结果将是找到加热和冷却空间的最节能的方式,而不仅仅是避免加热/冷却空间以节约能源。
模型拟合中的代价函数有哪些例子?
您可以根据需要设计成本函数,以研究应用程序中最重要的内容。
这是一个非常具体的行业例子。一些更通用的数据科学示例包括:
- 计算模型预测和数据点之间的误差总和,如了解线性回归的基本原理中所述。
- 计算模型预测和数据点之间的误差平方和,如了解多元回归中所述。
- 平均绝对误差 (MAE),它表示预测值和数据点之间的平均差异
- 均方根误差 (RMSE),计算整个数据集的平均平方误差的平方根。
请记住,您可以根据需要设计您的成本函数,以研究在您的应用中什么是最重要的。这很重要,因为所有的成本函数都有不同的优点和缺点。
回想一下建筑能源模拟的例子,一个仅检查能源消耗的成本函数与一个仅查看不舒适时段的成本函数会产生不同的影响。没有能耗项的建筑没有压力来确保建筑的节能。一个没有不舒服的小时术语的建筑没有压力来确保建筑保持居住者的舒适。
将两者结合成一个单一的成本函数迫使模型关注两者。
我如何平衡一个多项成本函数?
由于该模型能够检查两者,因此确保在成本函数中对每一项给予适当的考虑就变得很重要。这是通过给每一项增加加权因子或乘数来实现的,它告诉成本函数你有多关心每一项。
在建筑能耗模拟示例中,能耗的权重系数为 1,不舒适时段的权重系数为 1,000,000。这基本上迫使模型确保不存在 0 小时的不适。
但是如果几个小时的不适可以节省能量呢?然后,您可以更改您的权重因子,以使模型结果在关注能耗和不舒适时间之间达到不同的平衡。
加权因子告诉成本函数你有多关心每一项。
一个更直接的数据科学例子是将 MAE 和 RMSE 结合在一个成本函数中,该函数用于将模型拟合到数据集。平均而言,MAE 的作用是使模型尽可能接近整个数据集。“平均”在这里是一个重要的术语。这可能导致模型在大多数点上非常接近,而在少数点上非常不准确。RMSE 产生了相反的影响。由于它使用误差平方的平均值,它迫使模型在每一点都有小误差。它避免了带有极少数极不准确点的模型,但可以牺牲平均模型精度来强制实现该目标。
为了平衡这两种方法的优点和缺点,一个模型拟合成本函数可以结合 MBE 和 RMSE。然后,您需要对成本函数中的两项应用加权因子,以根据您的应用需求平衡这两项。
包装它
为了创建有用的预测工具,我们必须能够创建紧密符合数据集的数学模型。为了创建紧密符合数据集的模型,我们必须能够量化我们的模型预测与实际数据的差异。
这就是成本函数的作用所在。成本函数是计算与情况相关的“成本”的公式。在模型拟合的情况下,成本函数通常计算模型中的误差。
成本函数是灵活的,并且可以包括多个项。这使您能够将不同的重要因素合并到一个成本函数中。一个例子是查看建筑物的能耗。结合能源消耗和不舒适时间的术语创建了一个成本函数,迫使模型最小化能源消耗,同时还确保人们保持舒适。在模型拟合中,成本函数可能想要结合平均绝对误差(MAE)和均方根误差(RMSE)。
多项成本函数需要一种方法来平衡这两项,根据你对其中一项的重视程度。加权因子是应用于每一项的乘数,相应地增加/减少该项的值。可以根据需要对每一项进行添加和调整,以确定成本函数和最小化结果中的期望平衡。
哥斯达黎加家庭贫困水平预测
基于机器学习的 R 中综合数据分析和预测
作者: Chaithanya Pramodh Kasula 和 Aishwarya Varala
A map of Costa Rica
**导言:**本报告详细介绍了回答与哥斯达黎加家庭贫困水平相关的几个研究问题的过程。它由数据源、通过可视化进行的探索性数据分析、模型开发、微调、解决数据不平衡问题的方法、性能指标和结果可视化组成。
背景:在一个州或一个地方,政府或银行为他们的社会福利项目确定需要帮助的家庭是很重要的。据观察,生活在经济落后地区的人没有必要的知识或不能提供必要的文件,如收入/支出记录,以证明他们有资格获得援助。
在拉丁美洲,一种被称为代理收入测试的流行方法被用来做这个决定。各机构查看一个家庭的可观察属性,如天花板材料、家庭房间数量、家庭人数等,以确定该家庭是否有资格获得援助。然而,准确性仍然是一个问题。因此,美洲开发银行向 Kaggle 社区提供了一套数据,以提出新的方法,有效地将他们引向需要社会福利援助的家庭。
**数据来源:**项目使用的数据集提取自 Kaggle。数据源的网址为:https://www . ka ggle . com/c/Costa-Rican-household-poverty-prediction/overview
**数据描述:**数据文件夹由 train.csv 和 test.csv 组成,分别为 9557 行和 23856 行。但是,test.csv 不包含确定贫困水平的“目标”列。因此,train.csv 单独用作大小为 3.08 MB 的数据集。列数为 143。每个记录都与一个人相关联。143 列的描述可以在上面提到的数据源的 URL 中找到。下面提供了一些列的描述。
目标:表示贫困等级 1 =极端贫困,2 =中度贫困,3 =弱势家庭,4 =非弱势家庭
Idhogar:每个家庭的唯一标识符。属于一个家庭的人由这一栏来标识。
v2a1:每户每月支付的租金。
房间:房子里房间的数量。escolari:受教育年限等。
相关研究问题:
R1: 我们能否构建一个模型来确定哥斯达黎加不同家庭的贫困水平?
R2: 我们能否确定决定一个家庭贫困程度的最重要因素/栏目/预测因素?
R3: 受教育程度、性别、户主、人数、家庭房间数、依赖程度、技术(手机、电脑、电视、平板电脑)与一个家庭的贫困程度有关系吗?
**变量的数据类型:**数据集中的变量有四种数据类型:
- 布尔型:整数布尔型(0 或 1),字符布尔型(是或否)。paredblolad、noelec 等栏目。
- 浮点数据类型。例如,贫困、过度拥挤等。
- 整数数据类型。比如年龄,房租,房间,tamviv 等。
- 字母数字。比如 Id,idhogar。
**数据探索阶层分布:**贫困水平分布(阶层分布)非常不平衡,如图 2 所示。属于类别“四”的行数占数据集的 65.72%,但属于类别“一”的行数仅占 0.074%。在图 3 所示的家庭级数据集中观察到了同样的不均匀分布。要详细了解家庭级数据集,请阅读“家庭数据集”一节。
monthly_rent_payment 列 NaN 值个数:【monthly _ rent _ payment】列有 6860 行包含 NaN 值。’ own _ and _ fully _ paid _ house ‘、’ own _ paying _ in _ partitions ‘、’ rented ‘、’ unsaky ‘和’ other _ assigned _ lowed '列包含表示 0(假)或 1(真)的二进制值。从图 4 可以推断,拥有房子的有 5911 人,拥有房子但分期付款的有 961 人。这个事实在数据预处理过程中非常有用。
Fig. 2
Fig. 3
**数据预处理:**为了便于参考、理解和交流,将原来的列名重新命名为英文缩写。可以在“changed_column_names.csv”中找到它们。此后,将通过重命名的列引用数据。
**缺失值处理和特征工程:**从研究问题 R1、R2、R3 可以解释分析的单位是户。然而,数据集中的每条记录都描述了家庭中一个人的属性。属于同一个家庭的人可以通过“household_identifier”列分组,因为他们每个人都有相同的标识符值。“Household _ identifer”值对每个家庭都是唯一的。此外,“目标”等级(贫困水平)的相同值被分配给一个家庭中的所有人。
在数据集中的多个列中发现缺失值。根据**“数据探索”**部分对“每月租金付款”栏中出现的 NaN 值的解释,假设所有拥有房屋的人都不支付租金。只剩下 7 个人了。因为它们的计数太少,所以所有在‘monthly _ rent _ payment’列中具有 NaN 值的行都被替换为零。
列“number _ of _ tablets _ household _ owns”也包含 NaN 值。“拥有平板电脑”一栏表明一个家庭是否拥有平板电脑。如果家庭没有平板电脑,则“平板电脑数量 _ 家庭拥有数”列中的值将被替换为零。对于每个家庭,计算“上学年数”和“在校年数”栏的平均值,并分配给户主。“依赖关系”列中的字符布尔值(是或否)已分别替换为 1 或 0。对“edjefe”和“edjefa”列执行了相同的操作。
Fig. 4
Fig. 5 — Correlation plot between highly correlated features
从数据集中删除重复的列。例如,有两列具有相同的名称“age_squared ”,它们彼此重复。只是,保留了其中一个。此外,还有许多列是现有列的平方值,如 oversmooth _ squared、dependency_squared 等。所有这些列都已从数据集中删除,因为它们没有为模型提供额外的信息。此外,类别变量“目标”由数字格式为 1、2、3 和 4 的贫困水平组成。它们分别被替换为单词 1、2、3 和 4。各栏(if _ 继子 _or_doughter、if _ 儿子 _or_doughter_in_law、if _ 孙子 _or_doughter、if _ 父亲 _ or _ 岳母 _law、if _ 哥哥 _ or _ 姐姐、if _ 哥哥 _ or _ 姐姐 _in_law、if_other_family_member、if _ 配偶 _or_partner、if _ 儿子 _or_doughter、if _ 母亲 _ or _ 父亲)不重要,不属于回答研究问题的范围,因此已被删除。“DP lyr”(Wickham 等人,2017 年)和“stringr”(Wickham,2019 年)软件包用于数据预处理。“gg plot”(Wickham,2016 年)和 Tableau (Tableau Software,2019 年)软件包用于数据可视化。“corrplot”软件包(魏等,2017)用于绘制相关矩阵。
**使用相关性来减少特征:**已经为预处理阶段之后剩余的 119 列构建了相关性矩阵。如此巨大的情节的可视化是笨拙的。因此,相关值大于 0.98 的高度相关的特征已经从矩阵中提取出来并被单独绘制。由于软件不能绘图,不能合并过长的列名,所以在图 5 中用数字表示。图中的数字 1 到 14 对应于“家庭大小”、“家庭大小”、“家庭中个人总数”、“家庭中个人总数”、“厕所连接下水道或污水池”、“家庭户主”、“区域布朗卡”、“鳏夫”、“无主要能源来源、用于烹饪、无厨房”、“主要材料、外墙上的天然纤维”、“电力、合作用”等栏构建相关图的目的是从数据集中移除高度相关的列,因为它们不提供任何附加值。从图 5 可以看出,“家庭规模”、“家庭规模”、“家庭中个人总数”、“家庭中个人总数”彼此高度相关。因此,这些列中只有一列包含在数据集中。
**住户数据集:**户主被视为每个住户的代表。因此,只有“if_household_head”列等于 1 的行才成为该数据集的一部分。在数据预处理期间,与单个人相关联的诸如“上学年数”的特征已经被适当地处理以反映家庭。该数据集共有 2973 行,此后将被称为家庭数据集。
**使用随机森林建模:**为了回答第一个研究问题,使用家庭数据集来训练随机森林。对于给定的实例,其贫困水平/目标是未知的,训练的模型将预测该行的类别。随机森林是一种集成学习技术,它通过从数据集中抽取样本(引导抽样)来构建不同长度的树。不属于结构一部分的剩余数据通常称为袋外(OOB)数据集。然后,构建的模型使用 OOB 数据集作为测试集,并自行评估其性能。假设这些行是相互独立的(就像我们的例子一样),那么在使用随机森林时就不需要单独执行交叉验证。这是在 OOB 数据的帮助下在内部隐式完成的。每个构造的决策树的 OOB 误差可以被平均以表示模型的总误差率。随机森林也能很好地概括并避免过度适应,这是决策树中观察到的主要问题之一。“caret”软件包(Kuhn 等人,2019 年)中一个名为“random forest”(Liaw 等人,2002 年)的软件包用于训练和测试数据。
**将数据集拆分为训练集和测试集:**由于类别不平衡问题,以 75:25 的比例随机拆分数据集用于训练集和测试集不会提取与测试集中的少数类别相关联的大量行。因此,所获得的性能指标并不十分可靠。因此,来自每个类的 75%的数据成为训练集的一部分,来自每个类的 25%的数据成为测试集的一部分。因此,来自每个类的 75%和 25%的数据分别构成了训练集和测试集。训练集和测试集中的结果行数分别为 2230 和 744。
**训练:**对于第一次迭代,112 列(预处理后剩下的列)用于训练。“id”和“household_identifier”列等字母数字特征已从训练集中删除。用于训练分类器的超参数是:“ntree=500”和“mtry=10”。测试了各种“mtry”值,但等于 10 的“mtry”会产生更好的性能。为了减少用于训练的列数,从已训练的模型中提取 MeanDecreaseinGini 值。基尼系数的平均下降值与特征的重要性直接相关。某一特征的基尼值的平均降幅越大,它在预测目标变量方面的重要性就越大。图 6 显示了 15 个最重要的特征。在接下来的迭代中,只有这 15 个特征用于训练。这通过将功能的数量从 112 个减少到 15 个来降低培训成本。
Fig. 6 — Top fifteen important features from the random forest model
Fig. 7 — OOB estimate and Confusion Matrix without Sampling
OOB 误差估计如图 7 所示。可以注意到,“四”的分类误差非常小。然而,“一”、“二”和“三”的分类误差很高。该模型在类 4 上训练得很好,因为类 4 的记录数量相对较高,因此误差较低。但是,由于与“一”、“二”和“三”类相关联的记录数量较少,模型没有被很好地训练,因此误差较大。
**采样:**为了调整数据集中类别的分布,采用了两种流行的技术,即欠采样和过采样。对一个类进行欠采样涉及只获取与多数类相关联的一小部分记录。为了说明,仅从类别“四”中提取一些记录,并使其成为数据集的一部分。属于其他少数民族阶层的记录不变。欠采样导致数据丢失。过采样包括合成/复制属于少数类的记录。
**欠采样:**对‘四’班进行了随机欠采样。35%属于“第四类”的记录是随机选择的,并且是数据集的一部分。因此,属于“四级”的记录数量从 1954 年减少到 684 个。没有对属于其他类的记录进行采样。在欠采样之后,图 8 和图 9 分别示出了训练集和测试集的类别分布。图 10 详细描述了欠采样数据集的 OOB 误差估计。可以观察到,当与图 7 相比时,类别“一”、“二”和“三”的 OOB 误差估计没有显著降低。“四”的等级误差增加了。由于所有类别的可用记录数量较少,因此该模型在任何类别上都表现不佳。因此,在记录数量较少的情况下对数据集进行欠采样是一种糟糕的方法,因为这会导致欠拟合。
Fig. 8
Fig. 9
Fig. 10 — OOB estimate and Confusion Matrix during Under-sampling
Fig 11 — OOB estimate and Confusion Matrix during Oversampling
**过采样:**对‘一’、‘二’和‘三’类进行了随机过采样。与提到的类别相关联的记录已经被适当地复制,以最小化类别分布的差异。过采样后,图 12 和图 13 分别表示训练集和测试集中的类别分布。该模型已经被重新训练,并且 OOB 误差估计表示在图 11 中。
Fig. 12
Fig. 13
可以注意到,总的 OOB 误差估计和相应的分类误差有显著的降低。因此,过采样少数类的记录促进了更好的模型训练和开发。图 14 和图 15 表示在欠采样和过采样期间,随着树的数量的增加,不同类别的训练错误率的变化。红色、绿色、蓝色和紫色分别代表“四级”、“一级”、“二级”和“三级”。黑线代表总的 OOB 误差率。在过采样期间,所有类的错误率随着树的数量的增加而降低。
**测试:**测试集中的记录总数为 488 条。它包含从每个类别中提取的 25%的记录。“目标”、“id”和“家庭标识符”列已从测试集中删除。结果数据被发送到训练好的随机森林分类器以获得结果。对于测试集中的每个记录,分类器利用通过训练获得的知识来预测该记录的类别。预测的标签将根据它们在“目标”类中的原始值进行评估,这些值决定了模型的性能。
**性能度量:**准确性是评估分类模型的主要度量之一。其定义如下:
Fig. 14
Fig. 15
然而,在分类问题中,不能仅使用准确度来评估分类器。可以通过混淆矩阵对所获得的结果进行更仔细的检查。混淆矩阵是不同类别的预测值和实际值的组合。可以从中推导出重要的度量标准,如精确度(特异性)和灵敏度(召回率)。敏感性也称为真阳性率。特异性也被称为真阴性率。现有类别的准确性、敏感性和特异性的值越高,模型就越好。
caret (Kuhn 等人,2019 年)软件包中的函数“混淆矩阵”用于通过提供实际值和预测值作为输入来获得混淆矩阵。图 16 和图 17 表示对于相应技术的混淆矩阵和分类器的性能。但是,必须调整总体中表示的度量,因为这些度量是针对提取的样本,而不是针对整个总体。因此,必须对获得的度量进行调整,以使它们反映实际总体。
对于一个样本,如果 C1、C2、C3 和 C4 分别表示“一”、“二”、“三”和“四”类的分类度量,那么,其整个/原始总体的加权度量值表示为:
其中 N1、N2、N3、N4 代表原始/实际人口规模,S1、S2、S3、S4 代表样本人口规模。因此,在欠采样数据上训练的分类器的加权准确率、加权特异性和加权灵敏度分别为 53.41%、78.65%和 18.01%。在过采样数据集上训练的分类器的加权准确率、加权特异性和加权召回率分别为 84.39%、93.24%和 84.44%。
**评估 R3 提及的特征与贫困水平之间的关系:**为了评估受教育程度、性别、户主、人数、家庭房间数、依赖性和技术(手机、电脑、电视、平板电脑)与贫困水平之间的关系,仅使用以下提及的特征训练模型。然后,使用经过训练的模型来预测测试集中的记录。新分类器的性能度量越接近旧分类器的性能度量(用前 15 个重要特征训练的模型),所提到的特征和“目标”(贫困水平)之间的关系越强。
Fig. 16
Fig. 17
通过过采样类“一”、“二”和“三”来训练新模型,但是仅使用特征“edjefa”、“edjefe”、“受教育年数”、“男性户主平方”、“依赖性”、“过度拥挤”、“meaneduc”、“受教育年数”、“家庭中女性总数”、“家庭中人员总数”、“移动电话数量”、“家庭中男性总数”、“如果家庭中有笔记本电脑或台式电脑”。图 18 详细描述了在测试集上获得的再训练模型的性能度量。
Fig. 18
Fig. 19
原始人群的总校正加权准确性、加权敏感性和加权特异性分别为 81.11%、0.8115 (81.15%)和 0.9059 (90.59%)。结果表明,这些特征表现出与“目标”类的强烈关联。它们的排序后的 MeanDecreaseGini 值如图 19 所示。在所选择的特征中,“上学年数”是最重要的特征,而“如果家庭有笔记本电脑或台式电脑”是最不重要的特征。
**聚类:**聚类技术便于根据相似性度量对记录进行分组。K-Means 是一种著名的聚类技术,它使用距离度量(通常是欧几里德距离)来对数据点进行聚类。质心是 K 均值聚类中最具代表性的点。“cluster”(rousse euw 等人,2019 年)、“facto extra”(Kassambara 等人,2017 年)和“purrr”(Henry 等人,2019 年)分别用于 K 均值算法、聚类可视化和肘图(图 20)。在“评估 R3 提及的特征与贫困水平部分之间的关系中使用的特征仅用于聚类,因为它们与 R3 提及的因素相关。K-Means 算法仅应用于上述特征。这里,分析的单位是一个人。输入聚类数被提供为 8,因为它看起来是肘图中膝盖上的弯曲(图 20)。用于随机森林的预处理数据也用于 K-Means。“目标”列从数据集中删除。
Fig. 20 — Elbow Plot
Fig. 21 — Visualization of K-Means Clusters
图 21 显示了 8 个集群的可视化。X 轴和 Y 轴表示由具有最高方差的两个主成分表示的记录的缩减维度。仅通过可视化的“factoextra”包使用 PCA 进行降维。在 K-Means 中,每个记录被分配到其最近的质心,该质心由一个聚类数表示。图中的每种颜色代表一个聚类。
比较一个记录和它的簇号,以便进一步分析。目的是发现 K-Means 是否具有将具有相似贫困水平的记录聚类在一起的能力。桌子。1 代表个人贫困水平在所产生的组群中的分布。可以推断,K-均值聚类在确定贫困水平方面并不有效,因为所得聚类与原始贫困水平之间没有关联。原因可以归结为不平等的类分布和数据的非线性。在最小化类内平方和的同时,该算法给予大类比小类更多的权重。因此,没有观察到明显的组。贫困水平分布在各个组群。为了检查输入聚类数的重要性,提供不同的值作为输入,并相应地生成 K 均值聚类。然而,集群数量的增加并没有导致有效集群的形成。作为实验,从训练的随机森林模型获得的前 15 个特征(都是连续变量)被用来代替 R3 的特征,以生成 K-均值聚类。这也没有显著改善结果。
Table 1 — Distribution of individual poverty levels in the clusters (when input number of clusters = 8)
**调研问题答案:
R1 答案:**有。构建了随机森林分类器,以通过良好的性能指标成功确定哥斯达黎加家庭的贫困水平。随着更多数据的可用性,模型的性能可以得到改善。
**R2 回答:**是的。决定一个家庭贫困程度的 15 个最重要的栏目,按其重要性递减的顺序是:“上学年数”、“平均教育程度”、“年龄年数”、“抚养程度”、“过度拥挤”、“房子里所有房间的数量”、“移动电话的数量”、" edjefe “、“受教育年数、男性户主平方数”、“子女数、0 岁至 19 岁、家庭中的子女数”、“月租金支付额”、” edjefa "、“家庭中女性总数”、“卧室数”
**R3 的回答:**是的。问题 R3 中提到的与实体相关的特征与家庭贫困水平之间有着密切的关系。
R4 答案: K-Means 聚类技术在将具有相同贫困水平的记录聚类在一起时表现不佳。因此,在缺少“目标”列的情况下,并且利用 R3 中的给定特征,K-Means 聚类算法不能帮助为个人/个体分配类别标签。
参考文献: 哈德利·威克姆、罗曼·弗朗索瓦、莱昂内尔·亨利、基里尔·穆勒(2019)。dplyr:数据操作的语法。r 包版本 0.8.3。https://CRAN.R-project.org/package=dplyr
哈德利·威克姆(2019)。stringr:通用字符串操作的简单、一致的包装器。r 包版本 1.4.0。https://CRAN.R-project.org/package=stringr
H.韦翰。ggplot2:用于数据分析的优雅图形。2016 年纽约斯普林格出版社。Tableau 软件(2019)。从 https://www.tableau.com/取回
Taiyun Wei 和 Viliam Simko (2017 年)。r 包“corrplot”:相关矩阵的可视化(版本 0。84).可从 https://github.com/taiyun/corrplot获得
A.Liaw 和 M. Wiener (2002)。randomForest 分类和回归。r 新闻 2(3),18 - 22。
马克斯·库恩。供稿来自杰德·温、史蒂夫·韦斯顿、安德烈·威廉姆斯、克里斯·基弗、艾伦·恩格尔哈特、托尼·库珀、扎卡里·迈尔、布伦顿·肯克尔、R 核心团队、迈克尔·贝尼斯特、雷纳德·莱斯卡博、安德鲁·齐姆、卢卡·斯库卡、唐远、坎·坎丹和泰勒·亨特。(2019.分类和回归训练。r 包版本 6.0-84。https://CRAN.R-project.org/package=caret
Maechler,m .,Rousseeuw,p .,Struyf,a .,Hubert,m .,Hornik,K.(2019)。聚类:聚类分析基础和扩展。r 包版本 2.1.0。
Alboukadel Kassambara 和 Fabian Mundt (2017 年)。factoextra:提取并可视化多元数据分析的结果。r 包版本 1.0.5。https://CRAN.R-project.org/package=factoextra
莱昂内尔·亨利和哈德利·韦翰(2019)。函数式编程工具。r 包版本 0.3.2。【https://CRAN.R-project.org/package=purrr
Tableau 软件(2019)。从 https://www.tableau.com/取回
聊天机器人能让政府工作变得更容易吗?
在三周的时间里,我参与了哥伦比亚特区政府的一个研究项目。前两个星期用于用户研究和综合,最后一个星期围绕着设计我们研究中发现的一个问题的解决方案。我有一个简短的总结研究,导致我的设计如下。如果你对这个项目研究部分的更多细节感兴趣,你可以在这里阅读我的案例研究。
研究概述
第一周,我们在首席技术官办公室和地区总务部门对地区机构员工进行了 14 次 30-60 分钟的采访。接下来的一周,我们综合了我们所听到的。以下方法用于合成:
- 关联映射到小组痛点、机会和进展顺利的事情
- 热图查找主题
- 人物角色、场景和客户旅程
这些主题导致了对三个机构的建议:DC 人力资源、地区总务以及合同和采购办公室(OCP)。在项目的最后一周,我们的团队分头关注不同的难点,并着手设计可能的解决方案。我关注的是我们发现的 OCP 最大的痛点。
规定
问题: **OCP 难以提供一致的信息来指导其他机构的员工完成签约和采购流程。**我决定进一步挖掘这个问题,看看是否有机会通过构建某种对话式用户界面(CUI)或平台工具来改善这种情况,这种工具可以为机构员工提供有意义的影响,并且可以在不到一周的时间内进行原型开发和测试。
在我们采访中给出的故事和例子中,我发现了受访者提出的机会,一点点自动化可以带来很大的不同。
有一种东西叫做商品代码,我认为这些需要更清楚一点。因为…根据您选择的商品代码,它应该会自动发送给特定的人进行审批。
—地区机构雇员
这是一个很好的机会来帮助改善 OCP 的问题,提供一致的信息:一个 CUI 可以为机构雇员提供一个一致的信息来源的商品代码,并确保他们选择正确。
那么,你可能会问什么是商品代码? **事情没有听起来那么复杂。**基本上,它只是一个数字代码,确保对进出口商品或服务支付正确的税款。商品编码有一个国际标准,称为商品名称及编码协调制度(HS 编码),长度为 6 位数字,随着不同国家数字的增加,这一编码可以变得更加具体。对于美国进口的商品和服务,企业使用协调关税代码(HTS 代码),这只是一个 6 位的 HS 代码,后面跟着另外 4 位。
NIGP Code Search Results
区政府使用一个名为国家政府采购商品代码协会的七位数系统,缩写为 NIGP 代码。这些代码之所以重要,是因为当使用不正确的商品代码时,会产生许多负面影响。这可能会导致延误、货物错运,并可能导致罚款,甚至在某些情况下被指控欺诈。OCP 在他们的网站上有一个数据库搜索功能,但是正如一位受访者指出的,这些功能经常会被选错。很容易看出错误是如何产生的。快速搜索“椅子”,可以筛选出 171 个结果!
目标: 构建一个健壮的聊天机器人,它可以为代理机构的雇员提供正确的商品代码,并将带有该代码的采购订单发送给正确的人进行审批。
设计
我的第一步是勾画出用户获取正确代码所需的基本流程。
First Pass for User Flow
我开始用一个僵尸社会原型测试用户流,在那里我发现我需要更多的选项以防用户找不到他们需要的东西。例如,如果他们的搜索没有结果,他们可能想联系一个真实的人寻求帮助。我还发现,在这一点上,OCP 使用 NIGP 代码,而不是 HTS。接下来,我回去在白板上优化我的用户流。
Second Pass for User Flow
在第二次通过用户流之后,我在基于 Facebook Messenger 的聊天机器人工具 Chatfuel 中构建了一个交互式原型。我对这个交互式原型进行了用户测试,确保没有死角或令人困惑的副本。最后,我向客户演示了我的聊天机器人。
Interactive Chatbot Prototype
外卖食品
当谈到解决服务设计问题时,聊天机器人可能不是我们首先想到的,但它们可以是一个很好的起点,来定义用户需要做什么才能达到他们的目标。在设计限制方面,聊天机器人简化了可能性,并让我们思考一个结构化的双向对话到底能完成多少工作。
加密货币会引发向绿色能源的新转变吗?
走向数据科学
比特币、以太和其他另类交易正在世界各地激增,现在已经成为我们日常生活的一部分。迄今为止,加密货币很可能引发一场有利于可再生能源的变革。
加密货币能源范式的必要变革。
medium.com](https://medium.com/@smbilodeau/to-be-green-or-not-to-be-that-is-the-crypto-question-536f302f4498)
区块链模式变得越来越负责任,并完全依赖于分散系统的潜力。一些专家会更正式:区块链可以在替代能源的分配中发挥重要作用,就像在公共服务的发展中一样。区块链和/或加密货币与清洁技术的结合提供了很好的选择,包括人工智能、可再生能源和混合能源存储,特别是利用数据中心运营产生的废能回收和热量转换来提供能源。
但是其他人却不这么想。的确,比特币网络存在能耗问题。尽管每年要处理大约 1 亿笔金融交易,但它消耗了大量的能量。相比之下,传统金融业每年处理 5000 亿笔交易。如果我们考虑数据中心使用的能源量,比特币每笔交易消耗的能源比世界上所有银行消耗的总和还要多。
所以,这还是一个没有解决的问题。你怎么想?
我们就此交换吧!
Source: Smart Phases, Blockchain to boost Power Generation with Renewable, Energy Storage and Artificial Intelligence.
这篇文章是一系列关于区块链、人工智能和能量储存的文章的延伸,作者是荷兰的夏羽·比洛多。工程博士,对外经济合作中心。创始人&首席技术官、Smart Phases ( Novacab )、加拿大工程师协会会员以及能源中心和媒体的专家撰稿人。