艺术风格的神经算法:一种现代创作形式
关于使用简单的机器学习算法创作专业外观的艺术品,你需要知道的一切
Machu picchu depicted in the style of starry night.
自从我们这个物种诞生以来,人类就一直通过艺术来传达思想。而且理由很充分;艺术是一种强有力的表现主义形式,是创造力的独特表现。因此,视觉作品及其创作者在社会中受到高度重视。
近年来,计算能力的提高已经允许机器开始模仿人类行为。由于艺术的重要性,毫不奇怪,研究人员已经开始开发算法,努力产生看不见的创造性内容。这既有争议,又令人着迷。在这篇文章中,我将专注于这场创造性革命的技术组成部分,而不是伦理辩论。
艺术风格的神经算法(N.A.A.S .)主要由 Leon A. Gatys 发明,是我迄今为止见过的最有趣、但最容易理解的人工艺术品之一。
Artwork creating using N.A.A.S.
目录:
- 美国国家航空航天局简介。
- 理解卷积神经网络
- 虚拟 G.G .网络
- 内容表示和损失
- 风格表征与缺失
- N.A.A.S 算法
艺术风格的 Gatys 神经算法介绍
N.A.A.S .使用两个图像来创建输出:内容图像和样式图像。正如它们的标签所暗示的,样式图像的样式被编织到内容图像的内容中。这是通过一种巧妙的技术实现的,这种技术允许计算机使用卷积神经网络(conv 网或 CNN)来区分图片的内容和风格。将输出图像(最初是一组随机的像素)与指定的内容和样式进行比较,并逐步调整,直到它在数学上类似于所需的结果。
Content (left) and style (right) combined to create an output image.
Output image
更详细地说,上面提到的风格和内容的比较是使用专门用于该算法的成本函数来完成的。通过改变优化图像的像素信息来最小化该函数。像素值是该技术的参数,这意味着它们的值将被改变以最小化 N.A.A.S .成本函数。如果你不明白什么是参数或损失函数,我强烈建议在继续之前浏览一下我的关于线性回归的文章,以获得对机器学习过程的介绍。
这并不是说你应该理解在引擎盖下发生了什么。重要的是要有基本的东西。
了解卷积神经网络
鉴于卷积神经网络是整个 N.A.A.S .的基础概念,对它们的作用有一个清晰的概念是很重要的。如果你已经知道 CNN,那太好了。继续下一部分。
Conv 网是一种人工神经网络,它利用一些特殊的技术,使它们特别擅长于将图像分解成它们的基本内容。这个过程是分步骤进行的,每一步都是网络中的一个新层。一层简单的像一个文件柜放数据;它组织信息。层 x 由已经经历了 x 数学操作的输入数据的表示组成,在这种情况下是卷积。这些独特的计算集合构成了每个神经网络,并将数据从一层移动到另一层。一层中包含的每一位信息都存储在所谓的神经元中。神经元应该被认为是存储在每个虚拟橱柜中的文件,因为它们包含关于输入图像内容的信息。储存在神经元中的信息被称为激活或输出。激活是标量值。
CNN 就是这样储存信息的。现在让我们直接进入尘垢,看看图像剖析网络内部发生了什么。对于 conv 网,总共有三种用于分解图片的变换:卷积、池化和激活函数。
我们将从最重要的突变开始,卷积。卷积基本上是在图像上移动的一系列滤波器。这些过滤器是矩阵,通常是形成方形棱柱的三维数值集合。这些结构的高度和宽度通常是 3 或 5。滤镜的深度将与图像的通道数相匹配。三个颜色通道(RBG)意味着深度为三。
当滤镜在图像中移动时,滤镜中的每个值都会乘以当前“位于其上”的像素值。这些乘积相加产生一个标量输出,存储在神经元中。一个神经元的持有量对人类来说可能没有多大意义,但这些信息对计算机来说是有价值的。然后,滤波器以用户指定的增量在图像周围移动(增量的大小称为步长)。一旦滤波器已经通过了图像中的每个位置,并且已经创建了充满输出值的整个矩阵,就用另一个滤波器重复该过程。
A simplified example of the relationship between an input image and its features map (above convolved feature in pink). The values of the filter are in small red font and the bounds of the filter itself in yellow. The filter would, in reality, be moved left to right across the image, at many horizontal positions.
过滤器的输出表示图像上的给定区域与过滤器正在搜索的内容相匹配的程度。较大的值意味着区域和所需特征之间的高度相关性。
来自卷积的所述输出被存储在所谓的特征图中。这听起来很复杂,但它只是过滤过程中产生的所有值的矩阵。要注意的关于特征地图的一个重要特性是它们被组织成在空间上与图像相关。这意味着查看图像左上角的滤波器的输出值也将在特征映射矩阵的左上角。
由于滤镜提供标量输出并在图像中移动,单个滤镜最终会产生二维输出。在图像上使用的每一个新的过滤器都会给特征图添加一个通道,使其成为一个三维矩阵。
注意:通道是特征图的二维层,从深度上看是一个横截面。
上面描述的只是一个卷积。大多数神经网络由许多层卷积组成。你怎么问?
这就像在特征图上运行另一组过滤器一样简单,可以创建一个新的特征图。在这种情况下,过滤器将具有与它们正在分析的地图相同的深度。除此之外,该过程与上面描述的过程相同。
滑动、乘法、求和、冲洗和重复。
如果你想知道这些神奇的过滤器是从哪里诞生的,你提出了一个非常有效的问题。每个过滤器中的每个数字称为一个参数。这意味着它是网络通过反向传播随着时间的推移而学习的。如果你不知道什么是 back prop,不要烦恼。只需知道 conv 网的机器学习方面是计算机逐步调整其过滤器,直到它们搜索并表示有意义的信息。
Above are two two-dimensional filters: one to pick up on horizontal lines, the other for vertical lines. Although these exact filters are unlikely to be seen in a real learning environment, they are good for exemplary purposes. Consider why each filter contains the values they do. Recall, multiply each value with a pixel value and sum the products. Higher output == high correlation to desired feature.
这在理论上很好,但让我们来看看这在实践中是如何使用的。
假设我们试图建立一个网络来直观地理解汽车,然后对汽车进行分类。一个 conv 网将被用于构建的理解方面。它将分解图像的信息,这样密集的神经网络可以很容易地将图像分类为“汽车”或“非汽车”。
在训练过程的开始,当我们开始将车辆图像输入年轻网络时,它将使用包含随机值的过滤器。随着时间的推移,网络开始学习,它会开发一套独特的过滤器来识别汽车。在网络的第一层,由于 conv 网的学习方式,过滤器可能会搜索非常基本的结构,如垂直线或水平线。随着时间的推移,通过网络层次结构的进展将意味着所呈现的数据的复杂性的进展。在较高层,网络可能会学习如何看到形状,在最后一层附近,过滤器可能会搜索镜子、窗户或轮胎。
不要忘记,只有第一套过滤器是直接看着输入图像的像素信息。除此之外,过滤器还会查看之前的图层,并分析其中的数据。
注意:神经网络中的一层是一系列神经元,每个神经元保存一个值。当我描述池层或卷积层时,它指的是执行特定任务的网络部分(无论是池、卷积还是其他)。卷积层是接受值并执行卷积以 创建 特征图的层,而不是由特征图的 组成的层 。
在继续之前,我必须强调的最后一件事:到目前为止,从这一部分学到的最重要的东西是,卷积网络的层代表输入图像的 内容 。
这就是卷积的情况。让我们看看卷积网络的其他两个部分,接下来是池层。
一个池层是一个相对简单的概念。其目的是缩小特征地图的尺寸。可以在任何卷积层之前执行汇集过程。使用池有两个原因,第一个原因是减少网络中的计算量,从而提高网络速度。第二个原因,我劝你不要担心(但仍然应该承认),是通过最小化数据的维数来防止过度拟合,从而降低数据分布的复杂性。用人类的话说,这使得网络在更多样化的数据集上表现得更好。
出于本文的目的,将只解释 max pooling 层。还有其他类型的池,但最大池是最常见的。
在给定输入的每个通道上,max pooling 四处移动,查看指定大小(通常为 2x2 正方形)的部分。它取该区域中的最大值,即最活跃的神经元,然后通过丢弃该区域中的所有其他值来改变特征图。它也保持了神经元的空间表现。
这个过程有助于丢弃大量无意义的信息,只保留最有价值的内容。
唉,激活功能。这是几乎每个神经网络的主要部分。它将非线性引入到网络中,使网络能够学习几乎任何可能的分布。
激活函数通过使它们通过期望的函数来改变特征图中的每个值(正如它们的名字所暗示的)。通常的做法是在每个卷积层之后执行激活变更。
卷积神经网络使用校正线性单元(ReLU)或泄漏 ReLU 激活函数表现最佳。
ReLU
ReLU 将每个负值接地为零。这是合乎逻辑的,因为负像素值是没有意义的。
Leaky ReLU can be seen above in pink.
ReLU 变化(泄漏或参数)的目的是在反向传播过程中允许梯度流动。换句话说,泄漏 ReLU 帮助网络更稳定地学习其参数。
这是 conv 网的三个部分!这里有几个简单网络架构的例子:
卷积-> ReLU ->池->卷积-> ReLU ->池
或者
卷积-> ReLU ->卷积-> ReLU ->池->卷积-> ReLU ->卷积-> ReLU ->卷积-> ReLU->池
最后,现在所有的部分都就位了,让我们检查一个适当的网络的可视化。
这是上面分解成几个阶段的图表:
阶段 1:在输入图像上使用 6 个大小为 5×5×1 的过滤器,产生大小为 28×28×6 的特征图(第 1 层)。
注:数据的宽度和高度会发生变化,这是因为图像边缘的一些像素无法卷积,因为过滤器没有编程来解决图像周边出现的像素缺失问题。
阶段 2:执行最大池化,将地图缩小到 14x14x6 的大小(第 2 层)。
阶段 3: 16 个大小为 5x5x6 的滤波器(每个包含 6 个通道)在层 2 上卷积,产生大小为 10x10x16 的特征图(层 3)。
阶段 4:在第 3 层上执行最大池化,将特征地图缩小到 5x5x16 的大小(第 4 层)。
阶段 5:这个网络的最后一部分与神经类型转移无关。在第 4 层之后,特征图被输入到一系列完全连接的层中,这些层对图像进行分类。同样,这与手头的概念无关,但可能会引起一些人的兴趣。
就是这样!你很好地理解了卷积神经网络的含义!让我们继续你来的目的:艺术风格的神经算法。
VGG 16 网
神经风格研究论文推荐使用一个预先训练好的,非常有能力的 CNN,叫做 VGG 16。VGG 16 包括一个分类部分,但只有它的卷积部分用于 N.A.A.S .网络的架构如下:
注意:在列出每一个卷积后,应用 ReLU 激活功能。网络中的所有过滤器都是 3×3 大小。网络中的池大小为 2x2。
卷积块 1:
Conv1_1: 64 个滤波器,每个深度为 3。
Conv1_2: 64 个滤波器,每个深度为 64。
最大池 1
卷积块 2:
Conv2_1: 128 个滤波器,每个深度为 64。
Conv2_2: 128 个滤波器,每个深度为 128。
最大池 2
卷积块 3:
Conv3_1: 256 个滤波器,每个深度为 128。
Conv3_2: 256 个滤波器,每个深度为 256。
Conv3_3: 256 个滤波器,每个深度为 256。
Conv3_4: 256 个滤波器,每个深度为 256。
最大池 3
卷积块 4:
Conv4_1: 512 个滤波器,每个深度为 256。
Conv4_2: 512 个滤波器,每个深度为 512。
Conv4_3: 512 个滤波器,每个深度为 512。
Conv4_4: 512 个滤波器,每个深度为 512。
最大池 4
卷积块 5:
Conv5_1: 512 个滤波器,每个深度为 512。
Conv5_2: 512 个滤波器,每个深度为 512。
Conv5_3: 512 个滤波器,每个深度为 512。
Conv5_4: 512 个滤波器,每个深度为 512。
最大池 5
VGG Network, including FC layers
如您所见,VGG 16 网络的架构相当复杂。这不是一个可以在日常笔记本电脑上训练的网络。相反,先前获得的过滤器重量可以从网上下载。这优化了我们的结果,节省了大量的时间。
内容表示和损失
现在我们进入算法的核心部分!
Gatys 提交的研究论文的第一部分描述了一种将内容图像的内容转移到优化图像的方法。这是通过数学上表示两个图像内容之间的差异并最小化所述表示来实现的。既然已经建立了对 conv 网的理解,成本函数的这一部分就相对直接了。
当我们将一幅图像传入 conv 网络时,它的内容由整个网络中的神经元来表示。注意,我说的是内容,而不是像素值。猫脸照片的内容与所有其他猫脸图像的内容非常相似。尽管猫的颜色或面部结构略有变化,conv 网仍然可以理解它在看一只猫。这是一个重要的细节,因为它允许内容以数字形式保留,尽管图像的样式被改变了。
也就是说,为了表示优化图像的所需内容,我们在将内容图像传递给 VGG 层(具体来说是 conv4_2 层,在执行 ReLU 之后)后,使用该层的值。
至于它的数学原理:
对于熟悉均方误差成本函数的人来说,这看起来应该非常相似。这个表达式说明了以下内容:
关于内容图像 p 和优化图像 x,在 conv 网的层 l 处生成的内容损失是层 l 处 p 和 x 的每个内容表示或激活之间的平均方差
这里,F 表示 conv 网的层 l 处的优化图像的表示。F(i,j)是来自层 l 的 F 的单个神经元。P 和 P(i,j)表示层 l 的内容图像表示及其激活。因此,对于 I 和 j 的每个值对,将激活 F(i,j)和 P(i,j)之间的平方差加到一个运行和中。这个过程完成后,用总和除以求和中的总迭代次数(等于 F 或 P 中的神经元数)。再除以 2。
让我们从逻辑上来思考这个问题。整个风格转换过程的目标是最小化 N.A.A.S .成本函数,内容损失占该函数的一半。为了最小化损失,必须改变优化图像,使得其内容表示 F 类似于内容图像的表示 p。这将把 p 的内容转移到 x 上,保留指定图像的所有重要细节。
就这样,一半的神经类型转移。不算太糟吧?
风格表现与缺失
接下来,我们进入 N.A.A.S .更具创造性的部分:风格表现。所提出的区分风格和内容的方法是使用 gram 矩阵来计算特征之间的相关性。看看这是什么意思,好吗?
为了计算 gram 矩阵,我们采用ℓ层的内容表示,并将数据转换成二维矩阵。矩阵的每一行都是分析图层ℓ-1 的过滤器的完整输出。因为每个滤波器都在寻找特定的特征,所以也可以说矩阵中的每一行都是输入图像上不同位置的给定特征的表示。
现在,这些值已经被适当地构造,可以使用下面的等式来计算矩阵:
Gram matrix computation
该等式明确地说明了 gram 矩阵的元素(I,j)等于来自内容矩阵中两个不同行的元素的乘积之和。
为了对其进行分解,第 I 行的元素 1 乘以第 j 行的元素 1。元素 2 乘以元素 2,依此类推,直到元素 k。最后,将这些乘积求和以产生 gram 矩阵的单个元素。
因此,为了完整地计算 gram 矩阵,需要对矩阵中行的每个组合进行计算。
这是论文中最难住我的部分。简单的矩阵乘法如何表现一幅图像的风格?
请记住,矩阵的每一行都是一个展开的特征地图,包含关于特征存在的空间信息。通过将元素相乘,我们检查这些元素在图像中的位置是否重叠。对图像中的每一个位置和每一对可能的特征进行这种处理。然后进行求和,丢弃所有信息的空间相关性。
而这种元素之间的重叠或关联,不管它们在哪里,正是风格。蓝色圆圈与水平影线重叠的频率是多少?在整个图像中,小点与螺旋线交叉吗?这些特征以错综复杂、不易察觉的方式交织在一起,最终形成了一幅图像的风格。
这就是风格的表现。
现在,MSE 损失再次被使用。
MSE Loss for style
这里,我们迭代优化图像(G)的 gram 矩阵和样式图像(A)的 gram 矩阵。我们对这两个矩阵的所有元素的平方差求和。这里,N 表示层 l 中的特征图的数量,M 表示这 N 个特征图中的元素的数量。然后,对于层 l 的最终风格损失,将该总和缩放 4 倍 N * M
Gatys 的论文指出,在比较多层图像的风格时,可以获得最佳结果。因此,总风格损失为:
Complete style loss
其中 w(l)表示层 l 的损耗权重,E(l)是层 l 的损耗。
Style of starry night, as it is represented by gram matrices using activations in layers 1–5 (1 far left, 5 far right) of VGG.
由于算法的目标是最小化成本函数,优化图像的风格将慢慢地改变以类似于风格图像的风格。这将增加它们的 gram 矩阵的相似性,最终降低成本。
风格!这就是全部了!
艺术风格的神经算法
你看过所有的部分。让我们把它们放在一本宜家说明书中。
首先要做的是指定一个样式图像和一个内容图像。为计算机提供了这些图像的路径。然后创建与内容图像大小相同的随机值张量。这是优化图像。其中的随机值是这个算法的参数。它们将随着时间的推移被计算机改变,成为输出图像。
Content image (left) and style image (right)
Random noise image for optimization
损失函数或优化目标设置为使用 VGG 图层 conv4_2 的制图表达的内容损失加上使用 VGG 图层 conv1_1、conv2_1、conv3_1、conv4_1 和 conv5_1 的制图表达的样式损失。发现由 Gatys 提出的这些层产生最好的结果。
超参数α和β用于调整输出内容和风格之间的平衡。
The complete N.A.A.S. cost function
现在,机器学习魔法开始发挥作用。鉴于你们中的一些人可能并不精通优化算法,并且这个主题不是在一篇短文中就能讲授的,我将保持这一部分的简洁。优化图像通过 VGG 网络反向传播,以获得其相对于成本函数的梯度。使用最小化算法(在这种情况下是 L-BFGS),随机噪声张量的值被改变以降低成本函数的输出。慢慢地,噪声变成了样式和内容图像的融合。
然后使用 Gatys 提出的另一种技术将结果放大到更高的分辨率。这个概念尽管简单,但超出了本文的范围。它也没有风格转换算法本身有趣(在我看来)。
Fruits of the algorithm’s labor
仅此而已。一件不可思议的艺术品由机器学习诞生。这真是一个惊人的过程。
随着更多的神经艺术算法被开发出来,创造过程将会进一步加速和改善。在不久的将来,我将看到由机器创造的独一无二的作品,这让我非常兴奋。
感谢阅读!出发前:
一位新数据科学家对文化、进步和技术的思考
以及学习一项新技能可以。融合(内在、外在)动机
我第一次接触数据科学和机器学习
2018 年春天,加州伯班克又是一个阳光明媚的日子,我走向传奇娱乐公司的办公室,这是一家电影、电视和数字媒体的金融家和制作人,早在 2005 年就开始发行蝙蝠侠前传,这是我第一次在应用分析集团开始梦想中的演出。回到 NYU,我看到了一个关于创始人托马斯·图尔的案例研究,他努力将先进的数据分析纳入决策,以选择哪些电影创意值得花费数百万美元,以及如何以具有成本效益的方式将其推向市场。我从未想过有一天我会成为其中的一员。我知道我将向该公司的生产商和营销人员提供的见解来自波士顿定量分析师、工程师和研究人员的辛勤工作和敏锐思维,但我对计算机编程、高级统计学或产生的有价值数据的绝对范围知之甚少,这些数据可以为一家经常在创造性直觉上承担巨大财务风险的公司打开机会。
我只是很高兴能在那里,并成为制作惊人内容的一部分,但我对我们团队能力的迷恋让我意识到我只接触到了冰山一角。我不得不不断学习。2018 年秋天,我决定参加一个在线课程,看看数据科学是不是我想更认真地追求的东西。确实是。几周前,我离开了传奇公司,此后一直在西雅图熨斗学校的数据科学沉浸式训练营进行全日制学习,从今天起,我在这里给你写信。
动机:内在和外在
接受放弃一份好工作去接受更多教育的风险,给了我超越过去思考未来的自由。哪怕只是短暂的一瞬间,我的支持系统和好运给了我特权,让我抛开支付账单的思维模式,让我更深入地思考是什么在内在和外在激励着我。我希望利用这个平台来交流我对自己的结论的简化版本,以及我对这个世界的思考,在训练营结束后,我将带着一个新的工具箱重新加入这个世界。明确地说,这篇文章是非技术性的、探索性的头脑风暴,是动机、业务、文化和我对数据科学的热情的交汇。
我能够将我目前的主要动机简化为四个主要方面,以下没有特别的顺序。通过一点自我反省,我意识到在我知道数据科学需要什么之前,这些驱动力与我的选择相关,我希望每一个都以一种重要的方式坚持下去。
坦率地说,我热衷于用我的能力来推动艺术事业。我知道我想对人们和世界产生积极的影响。我喜欢旅行,我想继续旅行。我想最终拥有一个家。这些因素背后的为什么可能会导致一场私人的、令人兴奋的、可能是无休止的对话(我很高兴与任何感兴趣的人进行这种对话)。目前,我将坚持尝试理解这些动机如何与更严峻的现实相联系,以及为什么我认为数据科学将提供一个伟大的工具包来实现这些愿望。我的问题总是比答案多,但是当我思考一些与我的人生轨迹直接或间接相关的不同话题时,我邀请你们所有人加入对话。
友敌:创造力和技术
“每个人都生活在两个领域:内在和外在。内在是艺术、文学、道德和宗教中表达的精神目的的领域。外在是我们赖以生存的设备、技术、机制和工具的综合体。”
—马丁·路德·金
我对艺术、创意文化和创意经济的迷恋为我提供了借口,让我可以考虑更多有趣的想法,参观更多有趣的地方,结识更多有趣的人。我相信电影、音乐、绘画、语言和其他形式的个人表达对人类进步的历史有着比看起来更独特的重要性,我很久以前就决定要利用我的能力来扶持我认为伟大的艺术家和思想家。经济学并不总是支持艺术家,但我确实认为技术有潜力使创造性的职业建设民主化。
随着 YouTube、Spotify 和网飞等降低优质创意产品进入门槛并引导向大众受众交付的组织的崛起,以及 Etsy、Patreon 和众筹平台 Kickstarter 和 Indiegogo 等组织最近的努力,一个创意能力和独立资源与财务状况更明确相关的世界正在我们眼前形成。超级设备正在降低规模化生产的成本,获奖的电影正在用智能手机创作(Tangerine(2015)——IMDb)。互联网让寻找愿意为优秀内容付费的观众变得更加容易。区块链有可能淘汰利润分享中介(区块链&媒体——麻省理工斯隆评论)。好莱坞人才机构现在将分析视为了解消费者偏好的核心战略( Parrot Analytics signs CAA )。在这种情况下,越来越多花在消费创意上的钱直接流入了艺术家的口袋,这是显而易见的。
“苦苦挣扎的艺术家”的概念不会在一夜之间被消除,但更多资源较少的人有更大的机会让这个概念停止。对新媒体内容的文化意义有明确或隐含承诺、依赖或简单开放的关键组织将需要数据科学家来帮助指导他们在未来无数职能领域的决策。不管你的想法相似还是不同,让我们继续对话。我很想听听你对科技赋能创意的愿景,以及你对创意经济发展方向的看法。
文化&令人上瘾的科技产业
“我们沉迷于我们的电子邮件、Instagram 赞和脸书订阅;我们沉迷于电视节目和 YouTube 视频;我们每年工作时间更长,平均每天花三个小时使用智能手机。我们中的一半人宁愿遭受骨折,也不愿手机坏掉,千禧一代的孩子花在屏幕前的时间太多了,他们很难与真实、活生生的人互动。”
——亚当·奥尔特的不可抗拒的关于成瘾技术的兴起
财务义务和道德行为是否相互排斥?大型科技公司复杂的、充满法律术语的服务协议条款对于数据隐私来说足够透明吗?技术进步将继续要求自我监管,至少当华盛顿特区的老家伙们(即参议员哈奇)仍在向马克·扎克伯格提问时,他想知道他如何维持用户不为服务付费的商业模式。如果你想知道,他们刊登广告。扎克的回应是对这个话题的深思熟虑的阐述:“参议员,我们做广告。
我们使用的大多数设备和应用程序都是为了最大化我们的参与度,在许多情况下,吸引我们的自由支配支出。思想领袖警告说,我们已经接近危险的领域。作为一名用户,我当然对我警告的行为类型感到内疚。作为一名未来的数据科学家,我相信大数据赋予了追求利润的实体足够的不受监管的权力,以保证关于道德数据收集和利用的诚实对话。对于一个用例显然可以接受而另一个用例显然不可以的行业,很难在沙地上画出一条硬线。作为数据收集者,我们必须自己决定我们的底线在哪里。我很想了解其他以数据为中心的企业家和高管是如何承担这一责任的。与此同时,作为数据科学家和消费者,让我们保持自我意识,继续自我监管。
我们对彼此和自然世界的责任
“我们需要的转变要求我们承认,每个人都是发展的参与者……所有利益攸关方,无论大小,都应该找到发挥作用和做出贡献的地方。”
— 联合国常务副秘书长阿米纳·默罕默德
我总是想用我的技能和环境去帮助别人,尤其是那些存在于更麻烦的现实中的人。我把我的大部分幸福归功于两位慈爱的父母,他们设法离开了英国利物浦附近的一个工业小镇,这个小镇一直出现在英国的垃圾镇系列丛书中,并且显然激起了保罗·西蒙写回家的路。参观完我自己之后,我的父母努力在加州建立新生活的原因就很明显了。我很幸运。伴随着这种幸运而来的是向前回报的愿望,我相信数据科学家的工具包为我提供了一个提升影响力的真正机会。
我经常将联合国的可持续发展目标作为一个指南,让我自己适应世界上最紧迫的需求,以及那些拥有大数据技能的人参与进来的机会。贫困、饥饿、清洁水和基本人权是迫使我与越来越多的使命驱动型机构、非政府组织、以可持续方式推动影响和利润的私营企业以及像 DataKind 这样的数据科学家武装的组织一起为可持续发展目标采取认真行动的问题,这些组织将拥有我现在正在学习的技能的人与正确的项目联系起来。在打造充实的生活和事业时,这不再是我觉得可以推迟的事情。也就是说,让世界变得更好的愿望在博客上发表比付诸行动更容易。我们应该如何优先考虑人类最迫切的需求?我们如何正确衡量影响?权力必须如何激励参与?我很想听到更多的想法,关于你们如何让自己对那些处境更差的人负责,同时保持自己在商业和技术领域的其他目标和参与不受影响。
A visual summary of the United Nations’ Sustainable Development Goals — a quick reference to orient us to the world’s most pressing needs
气候变化:科学与权威
“气候系统变暖的科学证据是明确的。”
— 政府间气候变化专门委员会(联合国)&美国宇航局
科学家们达成了一致,但政策制定者们却不同意。一些坦率的话有助于推动与你的疯狂叔叔和充满政治色彩的朋友进行无益的辩论:全球气温正在上升。海洋正在变暖,酸性变得更强。海平面在上升,冰盖在缩小,冰川在退缩,积雪在融化。极端天气事件正在增加。2018 年底,由组成美国全球变化研究计划的 13 个联邦机构(包括 EPA、NASA、五角大楼和美国国务院等)发布的一份国会授权报告得出结论,人类活动正在导致气候变化,如果没有精心策划的干预,我们将对我们的星球造成不可挽回的损害。似乎有一个无穷无尽的与世界末日相关的气候事实在我们的指尖上流行地分享在社交媒体上,尽管我不是气候科学家,但我相信辩论的时间已经过去了。迅速行动至关重要。数据科学可以有所帮助。我会继续学习。
总的来说,科学是我们用来衡量和理解我们在地球上的位置的最受审查和信任的研究领域。我相信人文学科,虽然我喜欢认为健康的怀疑主义通常是有根据的,但我们还没有发现比科学更令人信服的循证权威来源。也就是说,我们正处于一个脆弱的时刻,甚至科学家也被指责不诚实。脱离科学的政治行动和言论有多危险?科学发现何时成为事实,为什么否认科学变得如此容易?我们如何从这种深刻的制度不信任中走出来?大数据有什么帮助?我的问题比答案多,但我欢迎你在一个尊重的、持续的对话中提出你的想法。
千禧年理想主义、学生债务危机和房屋所有权
我承认,像许多千禧一代一样,我不想把我的激情和价值观与我的工作分开。当然,就像我心目中的英雄一样,我想让这个世界变得更好,并从所有明显的缺陷中拯救出来。不管我对朋友引用老子多少次,我都有很多欲望,其中有些是无可否认的物质欲望。我想自己赚钱,然后把钱花在旅游上,最后,如果运气好的话,花在房地产上。也就是说,我一边喝着一杯 3 美元的咖啡,一边在 MacBook 上写下这些话。我从未应征入伍,也没有目睹过战争。我在一个安全的社区的安全的家里长大。我的父母确保我没有错过一顿饭。我有幸梦想远大,却经常失败。理想主义并不总是能付清账单,但这两者并不相互排斥。我既是雄心勃勃的,又是幸运的,还心怀感激。
尽管我有很多幸运,但和我的同龄人一样,我也背负着一堆荒谬的学生债务。我认识的 30 岁以下的人中,唯一有希望在支付大学教育费用的同时攒钱买房的人是一些朋友,他们牺牲了很多,大学毕业后在华尔街找了份工作,然后多年来每周无眠地工作 80 多个小时。平均来说,在我们的膝盖变坏和头发变白之前,我这个年龄组的人并不期望能合理地拥有自己的房子。旧的美国梦可能已经变成了一种白日梦。
也就是说,我对技术带来的教育民主化持乐观态度。我非常支持在线课程和学位。EdX、训练营式的专业教育(向熨斗学校大声喊出来,T3)以及奖励协作型教育者,他们喜欢优质内容和资源的真正生产者(例如教师工资教师)。希望这些创新能挽回一些希望。学科多样性和包容性必须仍然是社会教育进步的核心。教育是一项人权,我们应该在所有年级庆祝学科和观点的多样性。最重要的是,在追求公共和私营部门的教育相关创新时,必须优先考虑教育工作者和学生,而不是让他们成为牺牲品。
我决定学习数据科学的最后一个原因是最重要的和最不吸引人的。这是一项需要的技能,目前需求大于供给(希望能持续到 7 月份!)有机会成为一家高速发展的公司不可或缺的一员,可能会让我在消除学生债务的道路上更加安心,并让我实现旅行并最终拥有一个家的雄心壮志。对于那些深陷学生债务的人,你有什么解救自己的策略?老师和学生们——教育或教育技术的哪些趋势给了你们希望,如果有的话?对于那些战胜学生债务的人来说,什么策略对你有效?在这个过程中你牺牲了什么?
数据科学:杂食者的美工刀
似乎没有大量的职业可以满足我似乎无穷无尽的兴趣和问题,但我对数据科学技能的追求让我可以果断地犹豫不决。除了技术技能之外,最优秀的数据科学家似乎还有一些不同的性格特征,可以在各种各样的领域开展强大而有趣的项目。
数据科学家必须提出正确的问题。组织需要哪些知识来对其战略道路充满信心,了解他们的客户,优化成本和流程,并找到新的机会?数据科学家必须将深厚的技术技能与领域专业知识和背景相结合,以便从原始数据中提取真正的价值。也就是说,数据科学家似乎可以在许多行业和研究领域变得有价值,那些已经在该领域建立的科学家似乎已经鼓励了一种灵活、对多面手和专家都友好的文化。
数据科学家也要有激情。最好的解决方案只有在有决心的情况下才会到来,我相信当内在动力比咖啡更能激发你每天的外在努力时,生活会更有趣。如果没有强有力的指导和一些完美主义者的品质,数据科学家可能会倾向于停止寻找最佳的前进方式。然而,高效的数据科学家知道什么时候停止分析,什么时候开始部署见解、制定建议、解决问题和激励行动。
数据科学家一定很好奇。解决问题通常有许多独特的方法,优秀的数据科学家必须经常考虑替代方案。我发现问自己是否有比我目前使用的方法更好的方法来获取、清理和合并数据是有益的。它需要过程和创造力才能有效。它要求你锻炼你的分析左脑来完成任务和项目,然后,走出去,闻一闻玫瑰花香,并创造性地思考下一步你可以在哪里有效地运用你的努力。这项工作同样受益于自主、不受干扰的方法,以及富有成效的关键团队对话。以驾驶员-导航员的形式和同事一起编程对生产率有复合效应。它是为好奇和开放的头脑而建造的,因为这个领域本身总是随着新的创新被采用而变化。一名优秀的数据科学家必须了解最新的新闻故事和进展,并跟上时代的步伐。
与无休止的好奇心相关的一个重要认识是,并非所有问题都能用数据解决。决策的某些方面必须依靠人类的直觉。数据应该用于提供决策信息和改进预测,但有些时候它不应该被视为永恒的真理。它容易出错,也有其局限性。它既是一门科学,也是一门艺术。有时模型是陈旧的。有时商业环境会改变。有时,预测会成为偏差、方差或数据社区最不喜欢的变量的牺牲品:“不可约误差”的概念。对预测的信心永远不会达到 100%,没有人能真正知道未来。我们只能通过充分利用已知的东西来改进我们在未知中航行的方式。
徐:未知
比追求新知识更强有力的是认识到总会有很多我们不知道的东西。我正在学习接受这一点,不管是在工作中,还是在生活中,尽管如此,我还是要前进。我不知道我的梦想、我的计划和我的技能是否会一起形成数据科学、快乐、成功和满足感的完美鸡尾酒,但我知道我从来没有后悔过一个经过计算的、教育第一的风险,它让我超出了我的舒适区。我有过的最有冲击力的经历,就是驻扎在这样的环境里。我学得越多,就越意识到,越来越确定,有太多的东西我不知道,还有太多的东西有待发现。也就是说,让我们一起保持好奇。让我们一起不断学习和提高。
感谢阅读,
亚历克斯
请继续关注我的文章,随着我对数据科学的深入研究,我将发表越来越多的技术文章。我鼓励大家喜欢、评论、分享或直接给我发消息,告诉我你们对这里提出的想法的想法,或者对我今后应该研究的有趣主题的建议。
【www.linkedin.com/in/alexshropshire
卡纳达语-MNIST 语:ML 镇的一个新的手写数字数据集
Class-wise mean images of the 10 handwritten digits in the Kannada MNIST dataset
TLDR:
我在传播 2 个数据集:
卡纳达语-MNIST 数据集 : 28X 28 灰度图像:60k 火车| 10k 测试
挖掘 -MNIST: 28X 28 灰度图像:10240(1024 X10){见下图}
Putting the ‘Dig’ in Dig-MNIST
卡纳达-MNIST 数据集旨在替代 MNIST 数据集🙏虽然在卡纳达语中是数字符号。
此外,我正在传播一个由同一种语言(主要由该语言的非母语用户使用)的 10k 个手写数字组成的额外数据集,名为 Dig-MNIST,可用作额外的测试集。
资源列表:
开源代码库👉:https://github.com/vinayprabhu/Kannada_MNIST
卡格尔👉:https://www.kaggle.com/higgstachyon/kannada-mnist
ArXiv👉https://arxiv.org/pdf/1908.01242.pdf
如果你在同行评议的论文中使用卡纳达语-MNIST 语,我们会很感激地将其称为:
维奈·乌代·帕布。"卡纳达语-MNIST:一个新的卡纳达语手写数字数据集."arXiv 预印本 arXiv:1908.01242 (2019)…
Bibtex 条目:
@article{prabhu2019kannada,
title={Kannada-MNIST: A new handwritten digits dataset for the Kannada language},
author={Prabhu, Vinay Uday},
journal={arXiv preprint arXiv:1908.01242},
year={2019}
}
简介:
卡纳达语是印度卡纳塔克邦的官方和行政语言,全世界有近 6000 万人使用。此外,根据《印度宪法》第 344(1)条和第 351 条,卡纳达语是印度 22 种预定语言之一。这种语言是用官方的卡纳达语书写的,这是梵语家族的一种 abugida,可以追溯到卡丹巴语(公元 325-550 年)。
Kannada stone inscriptions: Source: https://karnatakaitihasaacademy.org/karnataka-epigraphy/inscriptions/
不同的字形被用来代表语言中的数字 0-9,这与当今世界上流行的现代印度-阿拉伯数字截然不同。与其他一些古老的数字系统不同,这些数字在卡纳塔克邦的日常事务中被广泛使用,正如在下面的图片中捕捉到的车辆牌照上这些符号的流行所证明的:
A vehicle license plate with Kannada numeral glyphs
MNIST-ized renderings of the variations of the glyphs across the modern Kannada fonts
此图捕捉了以下现代字体中字形变化的 MNIST 化渲染: Kedage、Malige-i、Malige-n、Malige-b、Kedage-n、Malige-t、Kedage-t、Kedage-i、Lohit-Kannada、Sampige 和 Hubballi-Regular 。
数据集管理:
卡纳达语-MNIST 语:
在印度的班加罗尔招募了 65 名志愿者,他们是这门语言的母语使用者,也是数字文字的日常使用者。每个志愿者填写一张包含 32 × 40 网格的 A3 纸。这就产生了一张填好的 A3 纸,每张纸上有 128 个数字,我们假设这些数字足够大,可以捕捉大多数志愿者内部字形的自然变化。使用 Konica Accurio-Press-C6085 扫描仪以每英寸 600 点的分辨率扫描如此收集的所有纸张,产生 65 个 4963 × 3509 png 图像。
Volunteers helping curate the Kannada-MNIST dataset
迪格-MNIST:
招募了 8 名年龄在 20 至 40 岁之间的志愿者来生成 32 × 40 格的卡纳达数字(类似于 2.1),所有人都用黑色墨水 Z-Grip 系列| Zebra Pen 在商业 Mead Cambridge Quad 书写板上书写,8–1/2 " x 11 ",四格,白色,80 张/本。然后,我们使用具有以下设置的 Dell-s 3845 cdn 扫描仪扫描纸张:输出颜色:灰度原稿类型:文本变亮/变暗:变暗+3 尺寸:自动检测用于书写数字的纸张的缩小尺寸(US-letter vis-a-vis A3)导致扫描更小(。tif)图像,所有图像都大约为 1600×2000。
与 MNIST 的比较:
1:平均像素强度分布:
2:形态属性:
Code source: https://github.com/dccastro/Morpho-MNIST
3:主成分分析:
4: UMAP 可视化:
一些分类基准:
我使用了一个标准的 MNIST-CNN 架构来获得一些基本的准确性基准(见下图)
The CNN architecture used for the benchmarks
(a)卡纳达-MNIST 列车上的培训和卡纳达-MNIST 测试上的测试
(b)在卡纳达-MNIST 列车上进行培训,在迪格-MNIST 进行测试
对机器学习社区的公开挑战
我们对机器学习社区提出了以下公开挑战。
- 为了描述灾难性遗忘的本质,一个预先在 MNIST 接受训练的美国有线电视新闻网记者被用卡纳达-MNIST 语重新训练。这是特别有趣的,因为观察到卡纳达语-MNIST 语中 3 和 7 的印刷字形与 MNIST 语中 2 的字形有着不可思议的相似。
- 获得一个使用字体(如[1])生成的纯合成数据训练的模型,并扩充以实现卡纳达-MNIST 和迪格-MNIST 数据集的高精度。
- 跨不同的语言/文字,尤其是印度文字,重复本文中描述的过程。
- 关于迪格-MNIST 数据集,我们看到一些志愿者已经越过了网格的边界,因此一些图像要么只有字形/笔画的部分切片,要么具有可以争论它们可能潜在地属于两个不同类别中的任何一个的外观。关于这些图像,值得看看我们是否可以设计一个分类器,将成比例的 softmax 质量分配给候选类。
- 我们共享原始扫描图像的主要原因是为了促进对自动分割算法的研究,该算法将解析来自网格的单个数字图像,这可能反过来导致数据集升级版本中的图像质量更高。
- 通过在卡纳达-MNIST 数据集上进行训练和在迪格-MNIST 数据集上进行测试,无需借助图像预处理,即可达到 MNIST 级别的精度。
[1] Prabhu、Vinay Uday、Sanghyun Han、Dian Ang Yap、Mihail Douhaniaris、Preethi Seshadri 和 John Whaley。“字体-2-手写:通用数字分类的种子扩充训练框架.” arXiv 预印本 arXiv:1905.08633 (2019)。https://arxiv.org/abs/1905.08633
沙普利价值观的新视角——介绍沙普利和 SHAP
Shapley 值和 SHAP python 库的简明介绍
这个帖子是关于什么的?
这篇文章是关于解释 Shapley 值统计模型的两个系列文章中的第一篇。我能想到你可能想读它的两个主要原因(除了,你知道,为了好玩):
- 了解沙普利价值观和 SHAP python 库。这就是这篇文章的主旨。它所提供的解释远非详尽无遗,也没有包含任何无法从其他在线来源收集到的内容,但它仍然可以作为这个主题的一个很好的快速介绍或额外阅读。
- 在阅读下一篇关于天真的 Shapley 价值观的文章之前,作为介绍或快速复习。下一个帖子是我对机器学习中 Shapley 值这一主题的一个新颖贡献。你可能已经熟悉了 SHAP 和沙普利,只是浏览了一下这篇文章,以确保我们有共同之处,或者你可能是来澄清下一篇文章中的一些困惑。
什么是沙普利价值观?
网上有很多解释这个话题的资料,所以我在这里的解释会很简短。我特别推荐 Christoph Molnar 的可解释机器学习的这一章做更详细的解释。我还发现,盯着数学公式(在下面或在维基百科上)直到我得到它,给了我对这个概念最好的直觉。
Shapley 值是博弈论中的一个概念,描述了如何在玩家之间分配玩家联盟产生的总回报。它的定义非常简单:任何玩家的贡献是在不包含该玩家的所有可能的玩家联盟中,将该玩家加入联盟所导致的预测变化的期望值。看起来是这样的:
我们来看一个例子:假设我们有一个团队需要执行一项任务。团队中的每个人都有 20%的额外成功机会,但是一个团队成员 A 有一个特殊的工具,可以保证 90%的成功机会,只要团队中至少有一个额外的成员。如果我们今天的团队由三个成员组成, A 、 B 和C——他们有 90%的成功机会——那么每个人对这个机会的贡献是多少?
让我们为团队成员 C 计算一下,使用不包含他们的所有可能组合:
应用该公式(Shapley 公式中总和的第一项对于{}和{A,B}是 1/3,对于{A}和{B}是 1/6),我们得到团队成员 C 的 Shapley 值 21.66% 。团队成员 B 自然会有相同的值,而对 A 重复这个过程,我们会得到 46.66% 。沙普利价值观的一个至关重要的特点是,玩家的贡献总是累加到最后的回报:21.66%+21.66%+46.66% = 90%。
机器学习中的 Shapley 值
**如果你将收益转化为预测并将玩家转化为特征,那么这个框架与机器学习的相关性是显而易见的。**但是计算模型特征的 Shapley 值并不完全简单,因为模型中的特征与团队中的工人行为方式不同。具体来说,预测模型通常无法处理其输入特征之一被简单删除的情况,从而测试其输出如何变化。相反,Shapley 值的 ML 实现,特别是 SHAP 方法,将缺失特征解释为值未知的特征,并通过对该特征的可能值进行平均来模拟这种未知状态(本系列的下一篇文章提出了一种不同的方法,并将其与 SHAP 方法进行了比较)。
得出 Shapley 值的主要问题是计算的复杂性 —具体来说,它们需要 2ᴹ(其中 m 是特征的数量)来计算。无论你的 GPU 有多强大,指数级的复杂性几乎总是一个障碍(想想当你的特征是 20x20 图像像素时,这需要多少步骤)。在理论文献中,这个问题最常见的解决方法是采样方法——而不是遍历所有可能的特征联盟,使用它们的子样本来估计 Shapley 值(如果您对此感兴趣,请参见例如 Castro 等人 2009 年、 Castro 等人 2017 年或 Benati 等人 2019 年)。
进入 SHAP python 库
SHAP 图书馆是数据科学家工具箱中最新的强大成员。它提供了三个主要的“解释器”类——tree explainer、DeepExplainer 和 KernelExplainer。前两个分别专门用于计算基于树的模型和神经网络的 Shapley 值,并基于这些模型的架构实现优化。内核解释器是一个“盲”方法,适用于任何模型。我在下面解释这些类,但是对于它们如何工作的更深入的解释,我推荐这一章。
内核解释器
KernelExplainer 计算 Shapley 值的方法可以总结为以下两点:
- 不是遍历所有 2 个 ᴹ 可能的特征排列,而是采样一个小的子集。默认样本数为n 样本= 2M+2048* 。例如,如果我们有 20 个特征,KernelExplainer 将对 2088/2 ⁰或大约 0.2%的可能联盟进行采样。联盟不是完全随机选择的;相反,在 Shapley 公式中具有较高权重的那些将首先被选择(因此,0 或 M-1 个特征的组合,其最能提供关于添加另一个特征的效果的信息,将首先被包括在内)。
- **“缺失特征”是通过将模型在自举样本上的预测与取自数据集中其他条目的这些特征的值进行平均来模拟的。**该“背景”数据集没有默认大小,但算法建议 100 个样本。这意味着,对于每个采样的特征联盟,该算法将生成 100 个预测,每个预测基于自举样本,并对它们进行平均。请注意,KernelExplainer 的结果仅基于不同输入的模型输出,这意味着它将适用于任何类型的函数,而无需对其做任何进一步的假设。
**(1)**的意义在于 Shapley 值基本上是用随机抽样估计的。相应地,增加 nsamples (或背景数据集的大小)会导致运行时间增加(或多或少呈线性)和估计方差减少(这意味着当您多次运行 explainer 时,Shapley 值会彼此更加相似,并与预期值更加相似)。这很容易通过用不同的 nsamples 值运行内核解释器来演示:
Based on the Census Income database included in the SHAP library. There are 12 features in the dataset and so nsamples is effectively capped at 212=4096. Estimation variance and mean run time are computed across 30 iterations of running the SHAP explainer on a K-Nearest-Neighbors classification model.
**(2)**的重要性——通过用替代“背景”数据替换“缺失”特征的值来处理“缺失”特征——更加复杂:
- 首先,也是最简单的,它是 Shapley 值估计的方差的附加来源,因为结果至少在某种程度上取决于背景数据集的选择。
- 第二,它对特征独立性进行了假设:例如,如果特征 x1 , x2 在我们的训练数据中高度相关,则用来自背景数据集中的随机值替换 x1 的值忽略了这种依赖性,并且基于不可能出现在训练集中的{ x1 , x2 }实例生成预测,使得 SHAP 值估计不太可靠。
- 最后,它表示对特征对预测的贡献的解释,不是它们如何影响预测模型本身,而是如果这些特征的值未知,它们如何影响已经训练好的模型的结果。这是另一个提醒你的好机会,这一切都指向下一篇文章,在这篇文章中,我们将探索不同的解释。
树解释器
TreeExplainer 是一个为基于树的模型(Random Forest,XGBoost,LightGBM 等)计算 SHAP 值的类。).与 KernelExplainer 相比:
- 精确:它不是通过随机采样来模拟缺失特征,而是通过简单地忽略依赖于缺失特征的决策路径来利用树形结构。因此,TreeExplainer 的输出是确定性的,不会随背景数据集而变化。
- 高效:所有组合不是在每个可能的特征组合(或其子集)上迭代,而是同时通过树推送,使用更复杂的算法来跟踪每个组合的结果——将所有可能组合的复杂度从 O(TL2 ᴹ ) 降低到多项式 O(TLD ) (其中 M 是特征的数量,t
使用 TreeExplainer 我们收获了什么?首先,我们去除了所有基于采样的估计方差,因为我们不需要使用背景数据集或选择特征联盟的子集。其次,我们的结果不再由于特性之间的依赖性而偏斜,因为这些特性包含在树结构中(尽管在某些情况下,我们可能不得不放弃前面的两个好处)。第三,我们的运行时间是显著地快,在某些情况下使得相当快和慢得不可接受。最后,请注意,这两个解释者对特征贡献的解释与给定训练模型的预测没有区别,而与它们如何影响模型本身没有区别。
等等,DeepExplainer 呢?
DeepExplainer 是一个专门为神经网络模型计算 SHAP 值的类。我在这里不包括它的详细解释,因为我缺乏与其他解释者的实践经验,这使我能够保证我对他们的解释,并且这篇文章主要是下一篇文章的序言,在下一篇文章中,SHAP 解释者将与天真的 Shapley 值方法进行比较,当谈到解释神经网络时,这种比较在很大程度上是不相关的。
作为粗略的概述,对于神经网络模型,DeepExplainer 比 KernelExplainer 要快得多,但同样使用背景数据集和训练模型来估计 SHAP 值,因此可以得出关于计算的 Shapley 值的性质的类似结论-它们根据背景数据的选择而变化(尽管没有很大程度),并且在生成用于估计的引导样本时,它们可能不考虑特征之间的依赖性。
我如何用 SHAP 来解释我的模型?
哦,那真的很简单。只需导入 shap ,然后像这样做(例如为内核解释器):
然后使用 SHAP 图书馆的可视化功能查看结果——可以是单个样本的 SHAP 值,也可以是整个数据集。
明白了!下一步是什么?
所有这些只是为了让我们在沙普利价值观和 SHAP 解释者上保持同步。您可以在这里停下来,继续(或开始)在您自己的工作中使用这个伟大的工具。但是如果你想更深入一点,更好地理解这个主题以及你工具集中的另一个工具,请继续阅读下一篇文章****!。
原载于 2019 年 11 月 28 日https://edden-gerber . github . io。**
Shapley 值的新视角:天真的 Shapley 方法
Image adapted from shap.readthedocs.io
通过探索一个概念性的替代方案来更好地了解 SHAP。
** **编辑,2020 年 1 月:我把这里介绍的方法从不太直观的激进的 Shapley 改名为幼稚的 Shapley 。这在整篇文章中都有所改变,但是代码片段和 git 库可能仍然反映了旧的名称。
你为什么要读这篇文章?
- 了解沙普利值和 SHAP 工具。关于这些主题的大多数其他来源是基于现有主要来源的解释(例如,学术论文和 SHAP 文档)。这篇文章试图通过实证的方法来获得一些理解。
- 了解计算 Shapley 值的另一种方法,在某些(有限的)情况下,这种方法可能比 SHAP 更可取(或者等待下一篇文章,以获得更广泛适用的想法)。
如果你不熟悉 Shaply values 或 SHAP ,或者想简单回顾一下 SHAP 的解释者是如何工作的,看看这篇文章。
赶时间?我强调了关键句子来帮助你快速阅读。
更加冗长的介绍
当我在最近的一次黑客马拉松中使用 SHAP 图书馆来解释一个隔离森林模型的预测时,我对 Shapley 值的兴趣被激发了。我注意到,对于我们的模型,SHAP 计算似乎非常低效,在整个数据集上运行需要太长时间。事实上,时间太长了,以至于我想知道在这种情况下,Shapley 值的“蛮力”指数复杂方法是否是一个更好的选择。这让我编写了一个函数,使用一种对我来说似乎很直观的方法来计算 Shapley 值:不是通过对可能的值进行积分来模拟缺失的特征(如 SHAP 方法),而是可以在训练期间将它们从模型中完全删除。由于文献中缺乏现有的术语,我决定将这些称为朴素沙普利值,在某种意义上,它们仅基于数据集(加上一个模型类),而不是基于训练好的模型。
作为一名神经科学研究生,我学到的一件事是,如果你想理解——并信任——你的分析工具,你需要对它们进行仔细的实证研究,就好像它们是你真正的研究对象一样。阅读现有的文献很重要,亲自获得实践经验也很重要,但我发现真正的洞察力来自于不要认为工具的结果是理所当然的,而是要结合人为的边缘情况或其他方法来测试它。这篇文章的主旨是,通过与朴素的 Shapley 方法进行比较,更好地理解 SHAP 解释者的优势和局限性。
Shapley 函数的代码和本文中使用的例子可以在这里找到。
大纲(不太是 TL;博士)
在这篇文章中,我将尝试展示以下内容:
- 通过为每个 2ᴹ特征子集(其中 M 是特征的数量)重新训练模型,可以为少量特征计算朴素沙普利值。
- **SHAP 图书馆的解释者和朴素的 Shapley 方法对 Shapley 值提供了两种不同的解释。**前者最适合解释给定(已训练)模型的单个预测,后者更适合解释数据集和模型类的特征重要性(例如,用某些参数初始化的随机森林,但不是已训练的随机森林)。
- **在某些(有限的)情况下,朴素沙普利计算可以比 SHAP 方法更快。**当以下所有情况都为真时,这些情况是广义的: a. 少量特征(< ~15), b. 使用不被高效的 SHAP 解释器支持的模型,以及 c. 大量样本(例如,整个数据集)需要 Shapley 值。
在以后的文章中,我希望讨论一个更实用的,多项式复杂的替代方法,用抽样来估计朴素的 Shapley 值。
那么什么是“幼稚”的沙普利价值观呢?
**首先,什么是沙普利值?**如果你有一个团队,每个人都对总收益做出贡献,但他们的贡献不一定是独立的(就像团队经理的贡献取决于也有做出贡献的工人),那么 Shapley 值将每个人对总收益的贡献量化为他们在所有可能的团队中的边际贡献的加权平均值(因此我们的团队经理的贡献可能是 0,没有额外的工人,100,至少有一个工人,等等。并且这是在团队的所有可能排列中的平均值)。用更专业的术语来说,Shapley 值反映了在不包括玩家的所有可能联盟中,将玩家加入联盟所产生的剩余收益的期望值。
在统计模型领域,Shapley 值量化了模型预测中的差异,这种差异是通过在模型中添加每个要素来驱动的。但是,由于此类模型通常无法处理不完整的输入,因此不可能简单地从数据集中移除要素来计算其边际贡献。因此,实现 Shapley 值的概念来解释预测模型是一些解释的问题。具体来说,
- 在预测阶段,对于给定的样本,SHAP 的解释者将“添加一个特征”解释为具有特定的值,而其值是未知的。例如,“年龄=30”对预测个人收入水平的模型输出的边际贡献可以相对于平均预测收入水平来计算,当用其他可能的值替换数据集中的“年龄”时。另一方面,
- 朴素的 Shapley 方法基于另一种直觉,即在训练过程中,衡量某个特性对模型的影响。因此,在我们的示例中,“年龄=30”的贡献是相对于模型最初完全没有年龄特征的情况而言的。
这两种解释都符合 Shapley 值的数学概念,但它们测量的东西略有不同。
计算朴素的 Shapley 值
计算朴素 Shapley 值的函数(此处代码)**采用一个数据集和一个收益函数,计算每个可能的特征组合(或“玩家联盟”)的收益。**然后使用标准的 Shapley 公式计算 Shapley 值:
φi is the Shapley value for feature i, S is a coalition of features, v(S) is the payoff for this coalition, and N is the total number of features. N{i} is all the possible feature coalitions not containing i. The first term within the sum corresponds to the fraction of times S appears within the possible feature permutations; intuitively, this gives the highest weight to the most informative contributions of a feature, i.e. when it is isolated or when it is added to a full set of features.
输出的格式与 SHAP 库解释器的格式相同,因此所有的 SHAP 绘图工具都可以用来可视化它。
收益函数可以是任何接受数据集并返回分数的函数(例如,我们的工人团队为任何团队构成产生的利润)。因此,它是一个通用函数,可用于任何类型的 Shapley 计算,但为了生成简单的 Shapley 值,它将始终是一个为数据集定型特定类型模型的函数,并为每一行返回一个预测。
例如:假设我们想要为 XGBoost 模型计算简单的 Shapley 值。我们将编写一个自定义的支付函数,它初始化一个 xgb 模型,训练它并返回每个样本的预测(或者可能只针对一个验证集)。Shapley 函数会将输入要素的每个可能组合输入到支付函数中,并使用结果输出来计算每个样本和要素的 Shapley 值(您很快就会看到一个活生生的例子)。
该算法的主要缺点是其计算复杂度 —它需要运行 2ᴹ次(其中 M 是特征的数量),每次都要重新训练模型。这种复杂性当然是需要 SHAP 图书馆的主要原因;另一方面,在某些有限的情况下,这可能是比使用 SHAP 内核解释器更快的选择。比较运行时间的问题将在本文的结尾讨论。
这和 SHAP 有什么不同,我们为什么要关心?
**我将 Naive Shapley 方法的结果与 SHAP KernelExplainer 和 TreeExplainer 的结果进行了比较。**我没有与 DeepExplainer 进行比较,因为神经网络模型很少具有使比较相关的少量输入变量。简而言之,朴素沙普利方法在概念上不同于所有的 SHAP 解释者,它代表了特征对模型本身的贡献,而不是对个体预测的贡献。同时,虽然在某些情况下,in 可能比 KernelExplainer 更有效,但它通常较慢(对于数量较少的功能来说不切实际)。再一次,如果你不确定 SHAP 的解释者在做什么,这篇文章可以帮助你。
天真的 Shapley 值与 TreeExplainer
TreeExplainer 是与 Naive Shapley 方法进行比较的一个很好的首选,因为与 KernelExplainer 不同,它们都是确定性的(不依赖于基于采样的估计),并且对特性之间的依赖关系不敏感(至少在 TreeExplainer 的默认实现中)。这使我们能够关注概念差异在处理缺失特征方面的影响,即通过重新训练模型与对特征值进行积分。
我们可以用一个简单的人为例子来证明这种差异的重要性。让我们生成一个 3 特征线性回归模型,其中一个特征 x1 是 y 的强预测器,第二个特征 x2 与之强相关(因此对 y 的预测性稍差),第三个非预测器特征 x3 :
为了获得简单的 Shapley 值,我们需要首先定义支付函数,它简单地训练模型并返回它的预测(为了简单起见,我不包括任何训练-验证分割等。).
现在运行 Shapley 函数本身( reshape_shapley_output 只是重新排列原始输出,因为 compute_shapley_values 返回一个不采用特定支付格式的字典。在 github 上提供了功能输入和输出的说明。
为了获得 SHAP 值,我们将定义 XGB 回归模型,对其进行训练,并使用 TreeExplainer 计算 SHAP 值:
现在让我们看看 SHAP 值和天真的沙普利值是如何相互比较的。我们将使用 SHAP 图书馆的简洁的 summary_plot 可视化工具,该工具绘制每个特征的 Shapley 值的分布:
让我们来分解一下:
- 使用 TreeExplainer,模型已经用所有 3 个特征进行了训练,因此 SHAP 值反映了这样一个事实,即 x1 在训练的模型中具有最高的影响,而 x2 具有小得多的作用,因为它大部分是冗余的。
- 另一方面,使用朴素的 Shapley 方法,x2 对 y 的影响几乎与 x1 的影响一样大,因为在没有 x1 的情况下训练模型时, x2 的信息量几乎与一样多。
- 与此同时,非预测性的 x3 使用朴素的 Shapley 方法被认为具有更高的影响——这仅仅是因为,特别是当我们没有进行训练/验证分割时,在没有更好的预测器的情况下,它会过度拟合数据。
现在让我们尝试一个真实世界的例子。我们将查看 SHAP 图书馆中包含的一个数据集的 Shapley 值——成人普查数据库,该数据库具有 12 个人口统计特征,用于预测个人的收入是否为> 5 万美元(load withshap . datasets . adult())。为了清晰和减少计算运行时间,我们将在我们的模型中只包括 12 个特征中的 6 个(年龄、每周小时数、教育、婚姻状况、资本收益和性别)。我们的模型将是一个 XGBoost 分类器。在这种情况下,TreeExplainer 的 SHAP 值和 Naive Shapley 值如何相互比较?散点图给我们一个快速的第一印象:
结果似乎是高度相关的,这应该已经给了我们一个提示,尽管他们的概念不同,这两种方法在结果上可能不会有太大的差异。现在用总结 _ 情节:
这里的结果看起来也很相似(尽管差异很大,以至于全局特征重要性的顺序有所改变)。但是让我们放大一下性别变量的 Shapley 值分布的差异:
这是怎么回事?
- 天真的 Shapley 结果向我们展示了对所有可能的特征组合进行了平均,添加该变量将对该数据集(你好性别工资差距)的预测产生一致的影响。
- TreeExplainer 的结果向我们展示了在我们的训练模型中,该变量对样本预测的影响较小且不太一致,很可能是因为它用于解释较小的残差方差,因为它传达的大部分信息是由其他更具预测性的特征提供的。
**注意:**实现我们自己的自定义 Shapley 函数的一个好处是,我们可以轻松地获得大量的中间结果,例如,我们计算的每个可能的特征组合在有或没有给定特征的情况下的利润率(其加权平均值是每个样本的 Shapley 值)。只是为了好玩,我从 compute_shapley_values 函数中提取了它,这样我们可以看看最终的 shapley 值是如何从这些单独的支付利润中产生的。这些是性别变量的收益边际分布,相对于它所添加的功能数量绘制:
我们可以看到模型中已经存在的特性越多,这个特性的边际影响就变得越小,越不明显。以 Education_Num 的利润率分布为例,无论有多少其他特征组成模型,它的贡献基本上保持不变,这表明它对模型的贡献很大程度上与它们无关:
那么,我们应该用哪种方法来解释我们的数据和模型中的性别变量的作用呢?我认为最好的表达方式是:
- 朴素的 Shapley 值更好地代表了数据集中特征的全局影响,而
- 给定我们现有的训练模型,SHAP 值可以更好地解释特定的预测。
在继续之前,还有两点需要注意:
实际注意事项:我并不是建议如果您关心数据集中的全局特征影响,就一定要使用朴素的 Shapley 方法,这主要是因为在大多数情况下,这在计算上是很难处理的(尽管在最后几节中可能会出现这种情况)。从我的例子中也可以明显看出,SHAP 解释者的结果通常没有太大的不同,因此不应该用于这个目的。我在这里的主要动机是更好地理解 SHAP 结果及其局限性。
技术提示:如果您熟悉 TreeExplainer,您可能知道,由于在二进制分类的情况下,树节点的权重保存的不是概率,而是对数奇数值(最后一步使用逻辑函数将其转换为概率),TreeExplainer 使用的默认优化方法提供了加起来等于这些未转换值(而不是最终概率)的 SHAP 值。简单地将逻辑函数应用于 SHAP 值本身是行不通的,因为转换值的总和!=总和的转换值。为了生成与概率输出直接对应的 SHAP 值,TreeExplainer 不得不牺牲一些效率,并使用类似于 KernelExplainer 的方法,通过用背景数据集替换来模拟缺失的要素,这自然是一种更慢、更不精确的方法。另一方面,为了用朴素的 Shapley 方法直接解释概率输出,我们需要做的就是选择支付函数的输出作为概率。由于使用朴素的 Shapley 方法,我们总是支付最大的计算成本,我们不妨使用一个支付函数,它给出了我们所希望的 Shapley 值来解释。
天真的 Shapley 值与 KernelExplainer
KernelExplainer 是一种计算 SHAP 值的模型盲方法。简单总结一下,它的工作原理是:
- 仅对可能的特征排列的小子集进行采样。
- 对于每一个这样的排列,通过生成许多自举样本来模拟“缺失的特征”,其中这些特征的值被来自小的“背景数据集”的值所替换,并且平均这些样本的预测。
这意味着与 TreeExplainer 相比,KernelExplainer 是:
- 较慢-需要为数据集中的每个解释实例计算大量预测(因为缺失值是通过对要素的许多可能值进行平均来模拟的)。
- 不确定性 —估计 KernelExplainer 的 SHAP 值,方差由联合抽样方法和背景数据集选择引入。
**当比较 KernelExplainer SHAP 值和天真的 Shapley 值时,这是怎么回事?**让我们使用预测收入为> 50 万美元的相同 6 特征人口普查数据集作为测试案例。这一次,按照 SHAP 图书馆笔记本中的示例,我们将使用 KNN 模型进行预测,并使用 KernelExplainer 提供 Shapley 值,我们可以将其与朴素的 Shapley 值进行比较:
比较结果:
这两种方法产生不同但相关的结果。如果我们对每个样本的 Shapley 值进行排序和分级(从 1 到 6),则顺序平均会相差大约 0.75 级(例如,在大约 75%的样本中,两个相邻特征的顺序被交换)。让我们记住,我们不是在看精确值和它们的噪声估计之间的关系:相反,朴素沙普利值是一个事物的确定性度量,而核 SHAP 值是另一个(相关)事物的估计 。
我认为,这里要强调的最后一点是,尽管这两种方法之间存在差异,但结果总体上仍然非常相似,这告诉我们在许多情况下,这些方法可能可以互换使用,假设差异对我们来说并不重要。
天真的 Shapley 能比 KernelExplainer 快吗?
正如我们已经建立的,天真的 Shapely 方法需要重新训练模型并产生预测 2ᴹ时报。这使得当特性的数量不低时(比如说,超过 15–20)这是不切实际的。但是它能和 SHAP 解释者的少量特性相比吗?
需要指出的一点是优化的 SHAP 解释器总是比简单的 Shapley 方法更快,但是模型盲的 KernelExplainer 在解释大型数据集时会非常慢。为了更好地理解,让我们来看看 KernelExplainer 与简单的 Shapley 方法的运行时间:
粗体条目强调了每种方法的弱点。Naive Shapley 方法当然最容易受到特征数量增加的影响,并且还依赖于模型训练时间,而 KernelExplainer 不受这些因素的影响(尽管其预测随着特征数量的增加而变得更加多变)。KernelExplainer 在运行时间方面的缺点是,虽然它不需要花费时间来重新训练模型,但它会为每个解释的预测单独运行(而 Naive Shapley 会立即为所有预测运行),每次都必须为大约 200K 个样本( nsamples X num)生成预测。背景样本,默认分别为 2048+2M 和 100)。
Naive Shapley 方法可能比 KernelExplainer 执行速度更快的模型的一个很好的例子是隔离森林模型,这是一个流行的异常检测工具,尽管它是一个基于树的模型,但它不受 TreeExplainer 的支持,并且它的训练时间(与预测相比)相对较快。为了证明这一点,我使用来自 Kaggle 的信用卡欺诈检测数据集,一个大约 285K 的样本,30 个用于预测异常信用卡交易的特征数据集。在我们的演示中,让我们使用 100K 个样本,将 30 个特征减少到 15 个。在我的旧笔记本电脑上,我得到了以下大致的运行时间:
-训练模型 : 8 秒
- 对所有 100K 样本进行预测 : 8 秒
- 计算单个预测的 SHAP 值 : 18 秒(不出所料,这大约是计算约 200K 引导样本的预测所需的时间)
基于此,我们可以粗略估计计算整个数据集的 Shapley 值需要多长时间。内核解释器应该只需要 100,000 x 18 秒,或者大约 500 小时。朴素的 Shapley 函数将运行多达 2 ⁵*(15+13)秒,或者大约 150 小时(实际上,更好的估计可能是大约 50 小时,因为在算法的每次迭代中用于训练的自举数据集将具有 1 到 15 个特征,或者平均 7 到 8 个,使得训练通常更快)。这两种方法都很慢(尽管两者都可以从并行化中获益),但是这里重要的不是具体的例子,而是理解每种情况下计算时间的来源。总结一下:
- 如果只需要解释一小部分“重要”的预测,KernelExplainer 应该足够快了。
- 如果你需要解释一百万个预测,而你只有不到 10-15 个特征,简单的 Shapley 方法会快得多。
实际的妥协?用抽样估计朴素 Shapley 值
如果我们的模型仅受 KernelExplainer 支持,并且我们确实需要整个庞大数据集的 Shapley 值,但有太多的特征来计算天真的 Shapley 值,该怎么办?
那么,为什么不尝试使用联合抽样来估计天真的沙普利值呢?使用随机抽样来估计大量玩家的 Shapley 值(如 KernelExplainer 所做的那样)已经在文献中进行了彻底的讨论,并且改进的方法仍在开发中(例如参见 Castro 等人 2009 年、 Castro 等人 2017 年或 Benati 等人 2019 年)。我认为采样可以很好地与朴素的 Shapley 方法结合使用,也就是说,对模型训练的特征组合空间进行采样(因此不需要通过对自举样本求平均来模拟缺失的特征)。
去除算法中的指数分量将大大减少运行时间,并使该方法对于大量特征变得可行(以一些估计方差为代价),而保持重新训练方法仍将确保在计算大型数据集的 Shapley 值时运行时间较短。
在这一点上这只是一个理论上的想法,这个帖子足够长,无需在此展开。我很乐意听取你对这个想法的任何意见(也许你已经在别的地方遇到过了?),也希望在以后的帖子里展开讨论。
原载于 2019 年 12 月 8 日https://edden-gerber . github . io。
看待甘斯的新方法
鉴别器比你想象的更有用
介绍
生成式对抗网络是一种非常有趣的深度神经网络架构,能够生成新数据(通常是图像),这些数据类似于训练期间给出的数据(或者用数学术语来说,匹配相同的分布)。
在发现 gan 及其工作原理后,我立刻被吸引住了。在无人监督的情况下生成逼真的图像有一些特别的,也许是神奇的地方。GAN 研究中真正引起我注意的一个领域是图像到图像的翻译:将一幅图像转换为另一幅图像并保持某种对应的能力(例如将一匹马转换为斑马,或将一个苹果转换为橙子)。像介绍 CycleGAN(一种特殊的架构,使用两个 GAN 相互“帮助”执行图像到图像的翻译)的学术论文向我展示了一个强大而迷人的深度学习应用程序,我立即想尝试并实现自己。
Zebra to Horse translation by CycleGAN
通过这篇特别的文章,我很想深入研究 GANs,并提供一种新的方式来看待他们的目标:这可能对一些人来说是微不足道的,而对其他人来说可能是一个有趣的观点。我还将举例说明这种方法的一个有趣的应用,同时提供实用的技巧来帮助您实现它。我会假设你在深度学习方面有一些基础,并且已经知道生成性对抗网络背后的基本思想。
GANs:简介
让我们考虑一个简单的卷积 GAN 架构(DCGAN)。随机噪声向量是生成器的输入,由不同的顺序卷积层组成,生成最终图像。在训练的开始,这个图像将完全是随机噪声。这个“假”图像然后被送到鉴别器,鉴别器输出一个数字,通常在 0 到 1 之间,代表图像看起来“有多真实”。鉴别器还被馈送真实图像。告诉鉴别器接收到的图像是假的还是真的,允许它随着时间的推移越来越好地完成工作,同时也告诉生成器如何使假图像看起来更真实。
GAN Architecture
暹罗网络
在解释经典 GAN 架构的一些新修改之前,我们需要介绍一个称为暹罗网络的特殊网络。暹罗网络用于一次性学习:虽然在大多数情况下,图像分类器需要在大量的训练样本上进行训练,但一次性学习网络能够仅通过一个样本来理解特定对象的特征。这种网络对于实现面部识别算法非常有用,这种算法需要足够灵活,以便偶尔向可识别的面部添加新面孔。
Siamese Network
该架构相当简单:它由一个编码器组成,该编码器将图像的特征编码成一个长度为 VecLen 的向量。网络的名字,Siamese,来源于“并行”使用编码器的相同权重来计算两幅图像的潜在向量:如果图像属于同一类,那么这两个向量在潜在空间中应该是接近的,否则,如果它们属于不同的类,它们应该是远离的。这个最终结果是由于一个特殊的损失函数而获得的。虽然文献中存在这种网络的多种损耗函数(对比损耗、三重损耗和磁损耗),但这里我们首先考虑对比损耗(Hadsell 等人,06)。
这种损失是特别容易和直观的:在它们属于同一类(Y=0)的情况下,它最小化我们两个向量之间的平方距离 (Dw,考虑欧几里德距离),而如果它们属于不同类(Y=1),则最小化( max(0,Margin-SquaredDistance)) 。这最后一项允许网络在两个向量的平方距离低于裕度(我们任意选择的常数)的情况下将这两个向量推得彼此远离;否则,如果两个矢量足够远,损耗为零。
不太难吧?现在我们终于准备好把一些拼图拼在一起了。
暹罗甘
正如我们之前所述,生成性对抗网络可以被认为是一个生成器和一个鉴别器,它们一起工作,从特定的图像集合或域中生成真实的图像。发生器将随机噪声向量作为输入,并将其“解码”为图像,而鉴别器将图像作为输入,并输出与图像的逼真程度相关的分数。现在让我们尝试使用一个连体网络作为鉴别器。我们现在拥有的是一个解码器-编码器架构,它以一个向量作为输入,以一个向量作为输出。这种结构类似于自动编码器(编码器-解码器),但两个组件互换了。
Siamese GAN Architecture
这个网络怎么可能训练?
在训练识别人脸的暹罗网络的情况下,我们拥有的总类的数量就是我们的算法必须识别的不同人脸的数量。因此,在这种情况下,我们期望网络以这样一种方式组织潜在空间(网络的输出),即编码同一张脸的所有向量靠近在一起,而远离所有其他向量。
然而,在 GANs 的情况下,类的总数是 2:由生成器创建的假图像和真实图像。然后,我们新的鉴别器目标是安排暹罗网络的输出向量,例如真实图像被编码为彼此靠近,同时保持虚假图像远离它们。
另一方面,生成器试图最小化真实和虚假图像向量之间的距离,或者换句话说,希望真实和虚假编码为同一类。这个新的目标再现了与“传统”情况下非常相似的对抗行为,利用了不同种类的对抗损失函数。
既然我们已经理解了这个想法的基础,让我们试着对它进行迭代和改进。
在我们的损失函数中,我们考虑了向量之间的距离。但是距离到底是什么呢?在我们的例子中,我们评估了两个向量之间的距离,这两个向量可以在鉴别器输出的向量空间中一次又一次地移动。考虑到距离的“相对性”,我们可以进行更稳健的测量,计算从空间固定点的距离。暹罗网络的三重损失考虑到了这个问题,它评估了与中性点(锚点)的距离。
Triplet Loss
这里 d 代表平方欧几里德距离, a 是“锚”点(我们将认为它固定在空间中), n 是负点, p 是正点。
在我们的例子中,只需要处理两个类(最终目标是使一个类与另一个类不可区分),我们在训练之前选择空间中的一个固定点,并使用它作为我们的中性点。在我的测试中,我使用了原点(值全为零的向量)。
为了更好地理解我们的潜在空间,以及我们希望如何为我们的目标组织它,让我们把它形象化。请记住,我们是将我们的空间以等于 VecLen 的维数投影到 2D 平面上。
Initial Condition
在训练开始时,我们的图像 B 和 G(z) (由生成器从噪声向量 z 生成的图像)由鉴别器在我们的向量空间中随机编码。
Vector Space during Training
在训练期间,鉴别器将 B 的向量推至更靠近固定点,同时试图将 G(z) 的编码保持在离该点任意距离(边距)处。另一方面,生成器希望 G(z) 向量更接近固定点,结果是更接近 B 向量。
最后,这里是暹罗甘的一些结果。
Random Flower samples
现在,为了真正理解为什么连体 GAN 与传统 GAN 极其相似,我们需要考虑一种边缘情况:如果连体鉴频器输出一维向量(V ecLen =1)会怎样?现在我们有了传统的 GAN 鉴别器输出单个值:如果这个标量接近一个固定的数(我们的 1 维点),假设 1,图像看起来是真实的,而在相反的情况下看起来是假的。这就相当于把分数保持在接近 1 为真,接近 0 为假。因此,损耗现在变成平方误差,典型的 LSGANs(最小平方 gan)。
所以,这没什么新鲜的。不完全是。将图像编码为潜在向量有时会非常有用。先说一个实际的例子。
图像到图像的翻译
最近的一篇论文介绍了 TraVeLGAN ,一种解决不成对图像到图像翻译问题的新方法。与其他方法(例如 CycleGAN)不同,TraVeLGAN 不依赖图像之间的逐像素差异(它不使用任何循环一致性约束),导致图像在完全不同的域之间转换,几乎没有任何共同点。为了实现这一点,传统的发生器-鉴别器架构与独立的连体网络一起使用。
TraVeLGAN Architecture
假设我们必须将域 A 的图像转换为属于域 B 的图像。我们称由生成器翻译的图像为 G(A) 。
然后,连体网络在潜在空间中对图像进行编码,目的是减小图像对的变换向量之间的距离。使用 S(X) 作为来自域 A 的 X 和 A1、A2 两幅图像的矢量编码,网络必须对矢量进行编码,例如:
(S(A1)-S(A2))类似于()S(G(A1)-S(G(A2)))
其中使用了诸如余弦距离的相似性度量。
这样,暹罗网络将信息(以渐变的形式)传递给生成器,告诉它如何在生成的图像中保留原始图像的“内容”。
所有这些都发生在鉴别器告诉生成器如何创建更真实的图像的时候,这些图像类似于来自域 B 的图像。最终结果是一个生成器,它以域 B 的风格生成图像,并保留了域 A 中的一些内容(在两个完全不相关的域的情况下,保持了某种对应关系)。
在这个简短的介绍之后(阅读文件以获取更多信息!),如何将我们的暹罗鉴别器与 TraVeLGAN 方法结合使用?
通过简单地移除特定的连体网络并使已经使用的鉴别器输出向量,我们可以应用先前讨论的损失函数来告诉生成器其生成的图像有多真实,此外,我们能够使用余弦距离来计算潜在空间中图像对的变换向量之间的距离。
Final Architecture with Siamese Discriminator
综上所述,鉴别器将图像编码成矢量,例如:
1.离我们的固定点(原点)的欧几里得距离越小的图像具有更真实的风格
2.编码图像对的变换向量 (A1- A2) , (G(A1)-G(A2)) 彼此之间具有低余弦距离,从而保留了内容
知道向量的角度和幅度是独立的特征,鉴别器能够学习应用这两个约束的向量空间。
在我的测试中,我使用带有跳跃连接的 U-Net 作为生成器,使用传统的全卷积暹罗网络作为鉴别器。此外,我在生成器和鉴别器中都使用了注意力,并对卷积核进行了频谱归一化,以保持训练的稳定性。在训练期间,使用 TTUR(鉴别器和生成器的不同学习速率)。
下面是一些结果,是根据 ImageNet 上的苹果和橘子图片训练出来的:
Apple to Orange Image Translation
这里有一个高清样本(横向到日本印刷(浮世绘)):
Landscape to Ukiyo e
结论
在潜在空间中对图像进行编码非常有用:我们已经表明,使鉴别器输出一个矢量而不是单个值,并相应地改变损失函数,可以导致更灵活的客观景观。像图像到图像转换这样的任务可以仅使用单个生成器和鉴别器来完成,而不需要任何附加的网络,也没有循环一致性限制,循环一致性限制依赖于逐个像素的差异,并且不能处理视觉上非常不同的域。还有很多其他的应用有待探索,比如处理带标签的图像等等。
感谢您宝贵的关注,玩得开心!
给财经新闻贴上情感标签的新方法
30%的财经标题符合特定的模式。
Source: Pexels
在过去的几年里,财经新闻情感分析作为一种商业自然语言处理(NLP)应用已经起飞。
像任何其他类型的情感分析一样,有两种主要的方法:一种,更传统的方法,是使用带有情感标签的单词表(我们也称之为字典)。另一种是使用基于语言模型的情感分类器,这些语言模型是在大型语料库(如亚马逊产品评论或 IMDB 电影评论)上训练的。
对于特定领域的情感分析,后面这些语言模型往往表现不佳。不足为奇:医学文章读起来一点也不像影评。在这方面,迁移学习是一个有趣的成长领域。然而,目前词典仍然是许多特定领域情感分析应用的核心。
在金融领域,那些试图利用开源资源的人可能会以圣母大学的 McDonald- Loughran (M-L)单词表而告终,这些单词表是通过分析 1994 年至 2008 年期间的五万多份收益报告而创建的[1]。这本字典已经被谷歌、富达、Citadel、道琼斯和标准普尔全球等公司使用过。
那还有什么问题呢?
任何抽样标记词表的明显缺陷是,它很小,无法捕捉一种语言的全部丰富性,无论该领域多么具体。然而,更糟糕的是,即使在一个特定的领域内,单词也可以根据子领域的上下文呈现出非常不同的含义。
例如,在金融写作中,从金融报道转移到金融市场分析就足够了,事情开始分崩离析:
所以我们知道使用 M-L 单词表会遗漏重要的信息。(我们会看到再往下一点有多少。)
我们还知道,深度学习语言模型(如微软的 Azure 和艾伦 NLP 的情感标签)提供了有限的额外洞察力,因为它们通常是在完全不同的语料库上训练的(艾伦 NLP 演示是在斯坦福电影评论数据集上训练的)。所以,至少在某种程度上是,微软 Azure 的文本分析工具)。
最后,为每个子领域的应用支付数据标签是不可持续的。
有什么好做的?
好吧,关于特定领域的事情是他们不仅仅有专门的词汇;他们有写作结构惯例。我说的结构是指带有嵌入式语义的句法选择。
这篇文章着眼于谈论金融市场的一种特殊方式。它展示了利用这种结构如何让您以很少的工作获得大量有用的信息。
本文其余部分如下:
1。考察一个特定的金融市场写作惯例,以及它如何有助于情感标签。
2。将这些见解应用到几千个新闻标题的样本中,并探索由此产生的数据。
3。当处理 NLP 问题时,检查这个分析告诉我们关于领域专门知识的什么。
1。编写拯救公约
在金融写作中,人们必须非常小心因果关系。对于单个公司来说,比如说,一份糟糕的收益报告之后,股票绝对会下跌。然而,你很少会想说整个市场都是因为某个事件而移动的,尽管你仍然想暗示那个事件的影响。
所以你用“as”:随着通胀担忧消退,美国股市攀升。
在英语中,as 有多种用法。但在金融标题中,字数很少,“as”几乎只用于一种特定的方式:表示事件 A 发生了,而事件 B 也在发生,并且 B 至少部分是事件 A 发生的原因。
因此,这个词充当了一个枢纽:
扮演这一特殊角色的不仅仅是“As”。为了暗示明显的影响,你用 after 说得含蓄一点,你可以用“在”。
在情感标注方面,这里的关键点是‘as’将句子分成两部分,这两部分拥有相同的情感。
明确地说,这两个事件可能同时发生;这不是物理。但是不会发生,永远不会发生,是为了用‘as’来描述这种共现,因为选择这种铰链结构的隐含语义:负面事件可以和正面事件在同一天发生,但不会,因为正面事件发生了。
因此,如果我们正确地理解了悬挂在“作为”铰链上的一部分的情感,我们也就理解了另一部分的情感。这已经为我们提供了大量描述最近事件的短句的自动情感标签,但它变得更好:
因为介绍性段落通常扩展了新闻故事的主要观点,通过标记悬挂在铰链上的一部分的情感,你已经自动标记了整个段落的情感。
Paragraph tagging by Allen NLP: Negative. By Microsoft Azure: Neutral
动词掌握着关键
由于‘as’和‘amid’的使用方式,主要事件是句子的第一部分;影响事件完成了它的另一半。这种书写约定不适合交换这两个部分:
但金融市场的美妙之处在于,它们只会上升或下降。这意味着你可以通过动词简化情感标签。
这里我们需要稍微谨慎一点。在上面的例子中,攀爬并不是一个绝对积极的发展。当股票上涨时,它是积极的;如果通胀担忧加剧,这将是一个负面消息。
这与框架语义学的概念有关:如果没有人们购买某种东西希望它升值的概念,你就无法理解股市中动词“攀升”的概念。
现在,一般来说,市场上涨是积极的,但也有特定的情况并非如此,例如,债券:当债券收益率上升时,债券价格下降。
为了解决这个问题,我们可以建立一个基于规则的系统,在特定情况下反转标记。因此,默认情况下,我们会将第一部分带有“爬升”的新闻故事标记为正面,除非句子的主语是一个与标记相反的例外。
这是个骗局,但谁在乎呢?考虑到标记可能非常昂贵,即使对于迁移学习,您仍然需要一个特定领域的标记样本数据库,以如此少的额外工作获得一个数据库是一个相当不错的结果。
因此,仅仅通过利用这一写作惯例,我们已经命名了两个显而易见的好处:一,标题的大规模情感标签,二,整个段落的有意义标签,潜在地帮助深度学习方法。让我们用一些真实的数据来探究它们的范围。
2。数据探索
出于这项研究的目的,我收集了去年发表的几千条财经新闻标题的样本。这些讨论金融事件和股票、货币和商品市场的一般市场运动,不包括有关特定公司的新闻。
我根据新闻讨论的地理市场对数据进行了分类。总的来说,人们会期望这些之间有一定程度的差异;毕竟,不同的作家群体应该有略微不同的写作模式。
然而,为了支持写作惯例在起作用的论点,请注意差异并没有那么显著。在整个市场中,大约 30%的标题遵循这种铰链结构,从而提供可提取的信息。
当然,要真正提取所说的信息,需要解析标题的两个部分,特别是——识别铰链左边的动词。为此,我使用了 SpaCy 标准解析器。总的来说,这种方法很有效,因为标题的左右部分都是简单结构的句子。结果,我们最终确定了大约 300 个动词的列表。
它们在样本中的流行程度符合指数分布,所以有限数量的动词被大量使用*,并且有一条长尾巴的动词只被使用一两次。*
注意不是所有的动词都带有感情色彩。有时候,新闻故事本身是中性的。但通常情况下,这是因为动词实际上是动词复合词的一部分,由一个动词和一个上升/下降介词组成:市场上涨上涨,道琼斯指数下跌结束。将情感标记扩展到包括这样的实例并不困难。
最常用的 15 个动词是:
有趣的观察——在列表的下方,我们发现动词“feed”看起来很奇怪。你能猜到它为什么会出现吗?(提示:过往事件的新闻报道)。思考如何批量修复这个解析问题是一个很好的练习。
最后,我们现在可以评估 M-L 字典的缺失程度了。局限于出现在不止一个标题中的表达情感的动词,我们可以看看这些是否出现在字典中,如果出现,它们是否表达相似的情感。
在我们的示例中,有 45 个这样的词汇化动词,它们对应于 80 个不同的动词的原始形式。从好的方面来看,所有带情感标签的动词都在字典里。此外,也没有字典颠倒我们情感标签的例子(当我们把某件事贴上负面标签时,说它是正面的,反之亦然)。
另一方面,大多数动词都没有情感标签。
特别是,当查看我们的前 15 个列表中携带情感的词汇化动词时(回想一下,由于指数分布,这些动词覆盖了大多数标题),只有一个词“增益”被 M-L 字典标记为情感。
它在财务报表的上下文中是有意义的,M-L 标记是基于财务报表的。如上所述,例如,动词‘climb’不是一个绝对肯定的词;在财务报表中,如果制造成本上升,这将是一个负面消息。
所有这些似乎表明,当对以这种铰链结构撰写的财经新闻标题进行情感标注时,依赖 M-L 词典将会错过许多重要信息。鉴于如此多的新闻故事遵循这种结构,这是一个相当大的损失。
3。这告诉我们什么是领域专业知识
*这是一个诱人的信念,如果你能让你的算法足够好,*足够聪明,足够聪明,它将能够破解一个 NLP 任务,而不考虑领域。
谁知道呢?有一天,这可能就是事实。
但是现在,它不是。
因此,上面的讨论在提问时是有用的:领域专长实际上增加了什么价值?
通常,领域专业知识在词汇层面上被认为是有用的。例如,前面我们已经看到了动词“温和”,在市场语境中,人们在试图避免惊吓投资者时将其用作“下跌”的同义词。
更广泛地说,词汇领域专业知识意味着应用外部知识来确定一些术语比其他术语更重要,或者单词具有特定的含义。
这就是说社会语言的一部分,社会语言是一种表明属于特定社会群体的子语言。但是专业词汇(包括行话)只是一个层面,表达思想的模式也是社会的一部分。想想律师吧,他们看起来会说英语,但却是用这些死板、复杂的句子结构来说的。
扎实的领域专业知识允许您识别这些模式,并利用它们来提取信息。
在本文中,我们将这一原则应用于金融市场子领域。因此,我们能够改进现有的情感分析工具,并生成可扩展的自动情感标签。
这是通过使用相当老式的单词列表和粗鄙的标记(一小组动词)的方法来完成的,同时加入了一些规则。然而,它表明这项工作如何能够支持更高级的深度学习技术。
就我个人而言,我觉得仅仅由于书写习惯,我们就能从这个微小的语法单元中获得如此多的语义价值,这很令人高兴。
不是吗?
来源:
1。Loughran,t .和 McDonald,B. (2011) 什么时候是责任而不是责任文本分析、词典和 10-k。金融杂志,66 年,35-65 页。
Jupyter 笔记本共享和协作的新方式
将 Github 与 Kyso 集成,增强您交流数据的方式&分析。
共享和复制数据科学仍然不容易。大多数公司仍然没有一个知识管理的中心。内部数据团队使用 Github 等工具进行项目管理,通常只有数据科学家和工程师才能访问。这意味着他们的工作不与公司的非技术人员分享。他们使用数据科学笔记本这样的技术文档进行数据探索和分析,但是代码的存在、终端输出等。意味着它们不是非技术受众的最佳沟通工具。所有这些都导致了很多锁定的商业价值,因为不是公司中的每个人都从产生的见解中学习。
Kyso 通过我们的 Github 集成和一个优雅的博客平台解决了这个问题,该平台用于呈现数据科学笔记本,使每个人都可以访问以前只有少数人拥有的信息。Kyso 通过将笔记本呈现为网络文章,让技术团队以更易读的格式发布和分享他们的分析。把它想象成你的团队自己的内部媒介,但是对于数据科学——你可以发布 Jupyter & R 笔记本。默认情况下,任何代码都是隐藏的,并且可以切换,以便技术和非技术受众都能理解您的帖子。你也可以使用我们的应用内 Markdown 编辑器从头开始写文章。
我们创建了 Kyso 来优化内部数据团队和其他科学计算从业者的计算到交流工作流,从他们工作的探索阶段到结果的交流。在这篇文章中,我将介绍如何为您的个人和专业项目做到这一点。
工作流程
入门指南
如果你还没有账户,去 Kyso 注册——这是一个免费的个人账户!如果你愿意,你可以注册你的 Github 帐户,它会自动同步到 Kyso。
然后,在您的仪表板上,导航到我们的 Github 页面。
Navigating to your Github repositories on Kyso
批准
如果你在 Github 上注册了 Kyso,你会自动连接上,你会在这个页面上看到你所有的公共库。如果没有,只需点击连接 Github 账号按钮即可。使用右边的下拉菜单,您可以选择授权您所有的 Github 库,或者只授权您的公共库(默认)。鉴于 Github 的 OAuth 授权方式,目前不可能只授权一个库。
Authorising your Github repositories on Kyso
在 Github OAuth 页面上,您可以选择授权您自己的帐户和您可能加入的任何组织。您可以搜索和过滤您的存储库,并通过单击连接到 Kyso 将它们导入到 Kyso。然后,您可以在 Kyso 仪表板上浏览这些帖子。
请记住,虽然 Kyso 上的帖子可能看起来像一个单独的渲染笔记本,但事实上,它是一个完整的 Github 存储库(或 Github 存储库的子目录)的反映,这意味着您可以在 Kyso 上浏览所有附件。如果你的库包含许多不同的文件夹,在 Kyso 上以不同的文章呈现会更好,这也是可能的。
查看我们的文档,看看配置是如何工作的。
结论
现在你知道了!您可以继续在现有的工作流程中操作,使用 Jupyter 笔记本进行数据探索、机器学习等。,将您的提交推送到 Github,这样您的项目的历史就会得到维护。所有提交都将以可读格式自动反映在 Kyso 姐妹帖子上。
关于 Kyso 的 Github 集成如何与您的笔记本配合工作的示例,请查看这个 Github 知识库,了解各种数据分析项目。你会看到很多子目录,我已经在 Kyso 上设置了单独的帖子。查看我们的文档了解我们的配置指南。
最后,去我的简介看看这些帖子是如何漂亮地呈现出来的。Kyso 的 Github 集成也可以用于内部私人知识共享,使用 Kyso 在您的团队中展示和协作您的分析。所有团队成员将能够消费、搜索&并以博客风格对发布的内容进行评论来提供反馈。
Jupyter 笔记本和类似的工具正在成为新的 Excel。为了获得这种现象的全部好处,这些文档中的知识需要在整个组织中有效地交流,这样每个人(我是说每个人)都可以学习&将数据洞察应用到各自的角色中,以推动业务价值。在 Kyso,我们希望帮助您做到这一点。
混淆矩阵的非混淆指南
你在炒作机器学习。你不太懂统计学,但你知道均值是什么。你决定跳过所有先决条件,训练你的第一个机器学习模型。你跟随了 YouTube 上某个印度人的代码视频教程。在花了 10 个小时意识到你错过了 IF 语句的缩进之后,你的模型终于被训练好了。
你已经获得了超过 90%的准确率。生活是美好的。
Photo by Markus Spiske on Unsplash
但我要告诉你,你的模型很可能很烂。这是意料之中的,见鬼,太好了!
玩笑归玩笑,当你是数据科学和机器学习的新手时,模型评估可能会很困难。困惑矩阵是让你困惑的东西,这是意料之中的。你不会相信你能从愚蠢简单的 2x2 矩阵中得到多少东西。
以下是模型训练后获得的混淆矩阵示例:
好吃吗?很糟糕吗?答案是你最喜欢的——看情况 ( 结果很糟糕)。
提取混淆矩阵
这里有一个看起来更普通的混淆矩阵:
是的,我知道你在想什么— 干得好,笨蛋,现在我更糊涂了!但是不要着急,让我们把它分成更小的、更容易理解的部分。
实际值
- 数据集的值(目标变量的值)
预测值
- 模型预测的值
积极的
- 目标变量中的值
- 如果预测疾病,这将是*‘有疾病’*
- 二进制目标变量中的 1
否定的;消极的;负面的;负的
- 目标变量中的值
- 如果预测疾病,这将是*‘没有疾病’*
- 二进制目标变量中的 0
好吧,这很容易理解,但是那些真正的肯定和否定是什么意思呢?
好问题读者。我在想你什么时候会问这个问题。对这些的解释对你来说很容易读懂。但是它们更容易忘记,所以你可能想每隔几天就重读一遍。或者更好的是,把它们写在一张纸上。写下一些东西会更容易坚持。但是我在这里跑题了,我们正在讨论假阳性和真阴性,让我们深入探讨一下。
真阳性(TP)
- 你的模型预测为正,实际为正
- 在二项式变量中是 1
- 你预测病人有疾病,而他已经有了
假阳性
- 你的模型预测为正,而实际为负
- 模型预测的是 1,但在二项式变量中是 0
- 你预测病人会生病,但他并没有
- 第一类错误
假阴性(FN)
- 你的模型预测为负,而实际为正
- 模型预测的是 0,但在二项式变量中是 1
- 你预测病人没有病,但他却得了
- 第二类错误
真阴性(TN)
- 你的模型预测是负的,而实际是负的
- 模型预测 0,二项式变量是 0
- 你预测病人没有病,他也没有
你看,混淆矩阵没有任何令人困惑的地方。当然,你需要记住这些术语,是的,它们听起来很相似,但至少它们不像你可能遇到的其他机器学习概念那样抽象。
与 Scorings 一起生活
在阅读了所有关于积极和消极的东西之后(几次,最好是),你现在对混淆矩阵有了一个基本的想法和直觉,你会发现它并不那么令人困惑——它只是需要适当地“融入”。
但那都是关于混乱矩阵的吗?
我希望你是在开玩笑。我们才进行了一半。也许吧。
接下来,我想讨论可以从混淆矩阵中获得的各种得分。而且有很多。根据维基百科[1],以下是所有这些人的名单:
- 敏感度/召回率/命中率/真阳性率 (TPR)
- 特异性/选择性/真阴性率 (TNR)
- 精度/阳性预测值 (PPV)
- 阴性预测值 (NPV)
- 漏检率/假阴性率 (FNR)
- 脱落/假阳性率 (FPR)
- 错误发现率 (FDR)
- 假漏检率**(为)**
- 威胁分数/关键成功指数 (CSI)
- 精度 (ACC)
- F1 分数
- 马修斯相关系数 (MCC)
- 知情/庄家知情 (BM)
- 标记性 (MK)
By GIPHY
感到困惑?这是意料之中的。我也是。我从未听说过其中的一些术语,但我仍然想把它们放在这里,只是为了证明你可以理解混乱矩阵所提供的一切,而不会发疯。
但是想想你怎么能仅仅从这个看起来很愚蠢的 2x2 矩阵中计算出这么多不同的分数,这真是令人惊讶。我的意思是只有 4 个数字,看在上帝的份上!
对于本文的第二部分,我想深入探讨机器学习领域最常用的评分方法,它们是:
- 准确(性)
- 回忆
- 精确
- F1 分数
没错,我将只讨论 14 个中的 4 个,因为我觉得这些是最重要的,只要对它们有基本的了解,你就完全有能力优化你的模型。你不需要记住公式,那些已经内置到 Python 的Scikit-Learn中了,但是你要知道什么时候选择一个而不是另一个。
在开始之前,让我们来看看您将要处理的混淆矩阵:
简而言之,在给定的矩阵中,我们有:
- 真底片 (TN) — 1943 年
- 误报 (FP) — 32
- 真阳性 (TP) — 181
- 假阴性 (FN) — 344
您可能已经注意到,这与本文开头的混淆矩阵是一样的,只是表现得更好。事不宜迟,让我们开始吧!
准确度分数
- 最直观的理解——正确预测的观察值与总观察值的比率
- 不太适合大多数业务需求
- 计算很简单:所有真实实例除以实例总数
- (TP+TN) / (TP+FP+FN+TN)
Python 中的实现:
**from** **sklearn.metrics** **import** accuracy_scoreprint(accuracy_score(y_true, y_pred))
>>> 0.8496
回忆分数
- 模型在数据集中查找所有相关案例的能力
- 对于我们的例子,这将是模型的能力,找到所有的情况下,病人有疾病
- 计算很简单:用真阳性(TP)除以真阳性(TP)和假阴性(FN)之和
- TP / (TP + FN)
Python 实现:
**from** **sklearn.metrics** **import** recall_scoreprint(recall_score(y_true, y_pred))
>>> 0.3448
精确分数
- 模型仅识别相关数据点的能力
- 对于我们的例子,这将是模型的能力,正确分类的病人没有疾病
- 计算:用真阳性(TP)除以真阳性(TP)和假阳性(FP)之和
- TP / (TP + FP)
Python 中的实现:
**from** **sklearn.metrics** **import** precision_scoreprint(precision_score(y_true, y_pred))
>>> 0.8498
F1 分数
- 精确度和召回率的加权平均值。
- 同时考虑误报和漏报
- 您的误报率(FP)和漏报率(FN)都很低,能够正确识别真正的威胁,并且不会受到误报的干扰
- 该计算需要先前计算的召回率和精确度
- 2(召回*精度)/(召回+精度)*
Python 中的实现:
**from** **sklearn.metrics** **import** f1_scoreprint(f1_score(y_true, y_pred))
>>> 0.4905
这些解释应该给你一个清晰的画面,使用准确性作为评分标准并不总是一个好的选择。在我们关于患者和疾病的例子中,使用回忆会更好,因为你可能想要正确地识别每个患有疾病的患者——试想一下,在癌症检测中有大量的错误分类会有多可怕。
这些材料足够你忙上一段时间了。当这对你来说变得容易时,请参考维基百科文章(文章底部张贴的*)来学习更多的评分。*
临终遗言
我的意图是以一种不混乱的方式分解这个看起来愚蠢简单的矩阵,因为当你第一次遇到它时,它会变得非常混乱。
我当然没有说关于这个话题的所有内容,但是每一个关键的想法和概念都在这里,等着被学习。很容易忘记这些东西,试图在一天之内学会它们只会让这些术语更加混淆。缓慢而稳定的人赢得比赛。
是的,大多数术语的叫法相似,你会被它弄糊涂——这是完全正常的。不时回顾一下你想要的文章中的材料。
By GIPHY
你有什么想法?看了几遍还有什么不明白的吗?欢迎在下面发表评论。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
资源
[1]https://en.wikipedia.org/wiki/Confusion_matrix
数据科学的非技术性阅读清单
无需钻研技术细节就能让你成为更好的数据科学家的书籍
与一些数据科学家可能愿意相信的相反,我们永远无法将世界简化为单纯的数字和算法。归根结底,决策是由人类做出的,而成为一名高效的数据科学家意味着既了解人又了解数据。
考虑以下现实生活中的例子:
当软件公司 OPower 想要让人们使用更少的能源时,他们向客户提供了大量关于他们用电量和成本的统计数据。然而,数据本身不足以让人们改变。此外,OPower 需要利用行为科学,即研究表明,当人们在账单上收到笑脸表情符号时,他们会减少能源消耗,这些表情符号显示了他们与邻居的对比!
把一个简单的干预😃当人们比他们的邻居用的少的时候,他们的电费账单😦当他们可以做得更好时,最终减少了 2-3%的电力消耗,在此过程中节省了数百万美元,并防止了数百万磅二氧化碳的排放🏆!对于数据科学家来说,这可能是一个震惊——你的意思是人们不会对纯数据做出反应!——但这对于 OPower 的首席科学官罗伯特·恰尔迪尼来说并不奇怪,他曾是心理学教授,写过一本关于人类行为的书。要点是,你可以拥有任何你想要的数据,但你仍然需要了解人类如何实现真正的改变。
The most effective visualization isn’t a bar chart, it’s a smiley face.
在我们作为数据科学家的日常工作和正规教育中,很难瞥见人类的工作方式,或者后退一步思考我们工作的社会影响。因此,重要的是不仅要阅读技术文章和教科书,还要扩展到研究人们如何做出选择以及如何利用数据来改善这些选择的著作。
在本文中,我将重点介绍 6 本非技术性的书籍,因为它们不涉及数学和算法,但却是数据科学家的重要读物。这些书对于任何想要实现数据科学目标的人都是必要的:通过数据实现更好的现实世界决策。
这里列出了 6 本书,并附有简要评论和要点:
- 信号和噪音:为什么如此多的预测失败——但有些却没有 内特·西尔弗
- 数学毁灭的武器:大数据如何增加不平等并威胁民主 作者凯茜·奥尼尔
- Brian Christian 和 Tom Griffiths 的《人类决策的计算机科学》和 Jordan Ellenberg 的《如何不犯错:数学思维的力量》
- 思考,快与慢 丹尼尔·卡内曼
- (黑马)*《黑天鹅:可能性极小的冲击》*作者纳西姆·尼古拉斯·塔勒布
要点和评论
- 信号和噪声:为什么这么多预测失败——但有些却没有 作者内特·西尔弗
对未来的预测——在选举、经济、国家政治和技术进步等领域— 经常是错误的,令人捧腹。当这些预测具有真实的现实世界的后果时,它们就不那么幽默了,在这部作品中,西尔弗解释了为什么人们往往不擅长做出预测,并研究了少数几个在不同领域成功打破趋势的人。事实证明,预测未来并不存在一个神奇的规则,只是伟大的预测家们实践的一些基本规则。
任何人都可以从整本书提供的简单建议中受益:
- 像狐狸一样思考(不是刺猬):有很多小点子(狐狸),而不是一个大点子(刺猬)。如果你只有一个想法,你会倾向于寻找确定的证据,忽略任何与你的观点相矛盾的东西(T2 确认偏差)。如果你有很多小想法,你会更关心什么是正确的,而不是什么支持你当前的信念,当证据不再支持它们时,你可以放弃任何想法。这两种不同的思维方式也解释了为什么对自己的预测更有信心的人(比如电视专家)往往更多时候是错的。
- **进行大量预测并获得快速反馈:**我们更擅长对频繁发生的事件进行估计,这主要是因为反馈和改进周期。天气预报每天都出错,这些信息进入模型,使明天的预报变得更好(这也是为什么天气预报在过去几十年里有了很大改进的一个原因)。在我们很少经历的情况下,我们最不擅长做出选择,在这些情况下,使用尽可能多的数据是关键
- 尽可能多的利用不同的来源:每个数据提供者都有自己的偏见,但是通过汇总不同的估计值,你可以找出错误的平均值 Silver 的 FiveThirtyEight 网站很好的说明了这一点。这种群体智慧的方法意味着使用与你的观点不一致的资源,而不是仅仅依靠某个领域的“专家”。
- **永远包含不确定性区间,当证据发生变化时,不要害怕更新你的观点:**人们在预测时犯的最大错误是提供一个数字。虽然一个答案可能是公众想要听到的,但世界从来不是严格的黑或白,而是存在于灰色阴影中,我们有责任在我们的预测中表现出来。表达不确定性可能看起来很懦弱——说希拉里有 70%的胜算意味着无论结果如何,你都是对的——但这比一个简单的是/否更现实。此外,人们认为改变自己的观点是一种弱点,但当事实发生变化时,更新你的信念实际上是一种重要的力量,在数据科学和形成世界观方面。
我们对世界的预测永远不可能完全正确,但这不应该阻止我们依靠经过充分证明的原则来做出更好的预测,从而减少错误。
这一类别的另外两本书是菲利普·泰特洛克的《超级预测》 和《专家政治判断》。
2。 数学毁灭的武器:大数据如何增加不平等并威胁民主 作者凯茜·奥尼尔
数学毁灭武器应该成为攻读统计学、机器学习或数据科学学位的学生以及任何必须做出部署模型决定的人的必读书目。“破坏数学的武器”是任何不透明的算法——不容易解释;影响数百万甚至数十亿人,并有可能造成严重损害,如破坏民主选举或使我们的大批人口被监禁。
核心前提是,这些破坏数学的武器有能力创造传播不平等的反馈循环,因为我们看不到这些算法的内部,我们不知道如何纠正它们。只有在我们回顾并观察到巨大的破坏——如 2016 年大选或 2008 年金融危机(都是由为负面目的服务的算法造成的)——我们对这些模型的盲目信任可能造成的伤害之后。
此外,我们的模型只和输入的数据一样好,当数据有偏差时,模型的预测也会一样好。考虑一个对罪犯判刑的模型,这个模型考虑到了一个人第一次与执法机关打交道的时间。由于不公正的治安策略,如拦截和搜身,即使考虑到其他因素,一个黑人很可能在比白人年轻得多的时候就与警察发生口角。这将导致模型建议延长黑人的刑期,在此期间,这些人将失去经济机会,并被社会排斥。这些人更有可能再次犯罪,导致监禁的恶性循环,这一切都是因为不公正的政策产生的数据,然后被送入黑匣子。
奥尼尔的书于 2016 年初发行,现在比以往任何时候都更需要它。2016 年底,俄罗斯演员利用脸书的算法进行宣传,对美国的民主进程造成了严重破坏。这些行动远非学术活动,而是产生了现实世界的后果,引发了对美国选举合法性的质疑。极右翼广告继续困扰着脸书,这是由一种算法驱动的,这种算法(最有可能的是,我们真的不知道)认为参与是重中之重。
算法只会在我们的日常生活中发挥更大的作用。我们在哪里上学,我们读什么,我们是否被批准贷款,我们是否找到工作,我们买什么都在很大程度上由算法决定,我们无法控制,也无法查询解释。奥尼尔的书似乎对机器学习模型持悲观态度,但我更愿意认为这是一种必要的批评:围绕机器学习有这么多肆无忌惮的热情,我们需要人们愿意退一步问:这些工具真的改善了人们的生活吗?作为一个社会,我们应该如何采用它们?
机器学习算法只是工具,和任何工具一样,它们可以用于好的方面,也可以用于坏的方面。幸运的是,我们仍处于早期阶段,这意味着我们可以塑造模型的使用,以确保它们朝着做出客观决策和为尽可能多的人创造最佳结果的方向努力。我们现在在这方面做出的选择将塑造未来几十年数据科学的未来,最好在充分知情的情况下参与这些辩论。
数据科学可能是一个年轻的领域,但已经对数百万个人的生活产生了巨大的影响,无论是好的还是坏的。作为这个新领域的先驱,我们这些现在工作的人有义务确保我们的算法不会变成数学毁灭的武器。
3。(Tie) 算法赖以生存:人类决策的计算机科学 布莱恩·克里斯蒂安和汤姆·格里菲斯著 如何不出错:数学思维的力量 乔丹·埃伦伯格著
**
在学校教授计算机科学和统计学(以及其他研究领域)时,它们都有一个问题:抽象的内容令人生厌。只有当它们应用于现实世界的问题时,它们才会变得足够有趣,让我们想去理解。这两本书都做了一项令人难以置信的工作,将枯燥的主题转化为娱乐性和知识性的叙事,讲述如何在我们的日常生活中使用算法、统计数据和数学。
例如,在《T21 生活的算法》一书中,作者展示了我们如何使用探索与利用权衡和最优停止的思想来找出我们应该花多长时间寻找配偶(或新员工,晚餐的餐馆等)。).同样,我们可以使用排序算法来最有效地组织我们的物品,以便快速检索您需要的东西。你认为你知道这些想法,你甚至可以用代码写出来,但是你可能从来没有应用它们来优化你的生活。
**如何不犯错的主要思想与艾伦伯格带领我们通过故事展示线性回归、推理、贝叶斯推理和概率等统计概念的使用和误用类似。应用概率定律告诉我们,玩彩票永远是一个失败的命题——除非在极少数情况下,回报实际上是正的(正如麻省理工学院的一群学生发现的)。艾伦伯格并不回避向我们展示方程式,但他将它们应用于现实世界的情况。
艾伦伯格书中的中心引语是,数学思维是“常识通过其他方式的延伸”在许多情况下,主要是在遥远的过去,我们的直觉很好地服务于我们,但是,现在在现代世界,有许多情况下我们最初的反应是完全错误的(见下一本书)。在这种情况下,我们不需要依靠直觉,而是可以使用概率和统计数据,以达到最佳决策。
这两本书的严谨程度恰到好处——混合了几个等式和大量的故事——读起来都很有趣。在这些书中,我发现了大量我在课堂上从未完全掌握的数据科学概念,最终我一次又一次地体验到了“啊哈”时刻的喜悦。数学、统计学和计算机科学只有在能让你的生活变得更好的程度上才有用,这两本书都展示了你从未停下来思考过的这些学科的所有用途。
4。 思考,快与慢 丹尼尔·卡内曼
如果你还没有意识到这一点,那么这里有一个有用的教训:人类是非理性的,我们经常在生活的各个方面做出可怕的决定。然而,我们有理由抱有希望:一旦我们理解了为什么我们没有采取最佳行动,我们就可以开始改变我们的行为以获得更好的结果。这是卡尼曼记录几十年实验发现的杰作的核心前提。
卡尼曼(2002 年诺贝尔经济学奖得主)和他的研究伙伴阿莫斯·特沃斯基(以及理查德·塞勒等其他人)创建了极具影响力的行为经济学领域,该领域将人们视为非理性的决策者*,而不是理性的效用最大化者。这不仅在经济领域,而且在医药、体育、商业实践、节能和退休基金等生活领域,都带来了思维和设计选择的真正转变。我们还可以将许多发现应用于数据科学,例如如何呈现研究结果。*
在这部严谨而又非常令人愉快的作品中,卡尼曼概述了我们不按逻辑行事的所有方式,包括锚定、可用性和替代试探法(经验法则)或我们倾向于规避损失以及成为沉没成本谬误的牺牲品。他还概述了可能是最重要的一点:我们有两种不同的思想体系。
- ***系统 1 快速而直观:*这种模式是进化设计出来的,可以在不考虑证据的情况下快速做出决策。虽然这在我们狩猎采集的过去对我们很有帮助,但在我们信息丰富的世界里,当我们没有时间查看数据时,它经常会给我们带来麻烦。
- ***系统 2 缓慢而理性:*我们需要在有很多选项和不同证据来源需要考虑的情况下使用这种模式。采用系统 2 需要付出努力,但这种努力会得到更好的决策和结果。
使用系统 1 是自然的,我们必须克服数百万年的进化才能使用系统 2。尽管这很难,但在我们这个数据丰富的世界里,我们需要花时间磨练我们的系统 2 思维。当然,我们有时可能会遇到过度思考的问题,但是思考不足——使用系统 1 而不是系统 2——是一个更严重的问题。
这本书对于理解人们如何做决定以及我们作为数据科学家可以做些什么来帮助人们做出更好的选择至关重要。
这本书也有适用于数据科学之外的结论,比如两个自我的概念:体验和记忆。体验自我是我们在一个事件中时时刻刻的感受,但远没有回忆自我重要,回忆自我是我们事后对事件的感知。记忆自我根据峰-端规则对一次经历进行评级,这对于医学、生活满意度和强迫自己做不愉快的任务有着深远的意义。我们记忆事件的时间会比我们经历它们的时间长得多,所以在一次经历中,我们努力最大化记忆自我的未来满足感是至关重要的。
如果你想了解实际的人类心理,而不是传统课堂上呈现的理想化版本,那么这本书是最好的起点。
5。(黑马): 黑天鹅:极不可能的冲击 纳西姆·尼古拉斯·塔勒布
塔勒布在名单上只有一个位置,而且是一个局外人的位置。塔勒布曾是一名量化交易者,他在 2000 年和 2007 年的市场低迷期间赚了很多钱,现在他已经成为一名直言不讳的学者和研究人员,他的作品赢得了全世界的赞誉和批评。首先,塔勒布被一个想法所占据:当代思维方式的失败,尤其是在充满不确定性的时代。在《黑天鹅》中,塔勒布提出了这样一个概念:我们对支配人类活动的随机性视而不见,因此,当事情不如预期时,我们会被摧毁。最初于 2007 年出版的《黑天鹅自从 2008 年和 2016 年的意外事件完全颠覆了传统模式以来,变得更加相关。
当然,基于这个中心前提,立即出现的问题是:按照定义,不可能发生的事件不会经常发生,所以我们不应该担心它们?关键的一点是,虽然每个不可能发生的事件本身不太可能发生,但综合起来看,几乎可以肯定的是,在你的一生中,甚至在一年内,许多意想不到的事件将会发生。任何一年发生经济崩溃的可能性都是微乎其微的,但是这种可能性越来越大,直到世界某个地方每十年发生一次经济衰退的可能性非常小。
我们不仅应该期待改变世界的事件会频繁发生,而且我们不应该听信那些被过去发生的事情所束缚的专家。任何投资股市的人都应该知道,过去的表现不能预测未来的表现,这是我们在数据科学模型(使用过去的数据)中考虑的一个明智的教训。此外,我们的世界不是正态分布,而是厚尾分布,少数极端事件——大衰退——或少数富人——比尔·盖茨——盖过了所有其他人。当极端事件发生时,没有人做好准备,因为它们的规模远远超过以往任何一次。
黑天鹅对数据科学家来说很重要,因为它表明,任何只基于过去表现的模型往往都是错误的,会带来灾难性的后果。所有的机器学习模型都是只用过去的数据建立的,这意味着我们不想太相信它们。模型(包括 Taleb 的)是对现实的有缺陷的近似,我们应该确保我们有适当的系统来处理它们不可避免的失败。
值得注意的是,塔勒布不仅因其新颖的想法而闻名,也因其极度好斗而闻名。他愿意接纳所有来者,并定期批评像史蒂芬·平克这样的学者,或者像内特·西尔弗这样的公众人物。在我们这个严重扭曲的时代,他的想法有助于理解,但他的态度可能有点令人不快。尽管如此,我认为这本书还是值得一读,因为它提供了一个非主流的思想体系。
(这本书是塔勒布五部曲中的第二部,开始展示他的完整哲学。《黑天鹅》讨论了极不可能发生的事件的概念,而到*,抗脆弱:从无序中获益的事物中的第四本书讨论了如何让自己不仅对混乱保持稳健,而且让自己因此变得更好。我认为这只黑天鹅与数据科学最为相关。*
结论
在盯着电脑屏幕看了一整天之后,我想不出比看书更好的方式来结束一天的工作了(纸质书、电子书或有声读物都可以)。数据科学需要不断扩展工具箱中的工具,即使当我们想要放松一下,把注意力从工作上移开,这也不意味着我们不能学习。
这些书都是引人入胜的读物,也教给我们关于数据科学和生活的课程。这里描述的 6 部作品将通过展示人类的实际驱动力,为更多的技术作品提供有益的补充。理解人们在现实中是如何思考的——而不是理想化的模型——对于实现更好的数据驱动型决策来说,与统计学一样重要。
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 联系到我。
利用未来指标进行预测的新方法
时间序列建模和预测在许多实际领域都具有重要意义。因此,在这几年中,在这个课题上进行了许多积极的研究。为了提高时间序列建模和预测的精度和效率,文献中提出了许多重要的模型。预测是一项数据科学任务,是组织内许多活动的核心。例如,像苹果这样的大型组织必须分配稀缺的资源和目标设置,以便相对于基线来衡量绩效。公司的财务规划和分析团队多年来一直使用基于驱动因素的算法模型来预测全球现金流。我们的目标是探索最现代的技术,根据传统方法验证它们,并开发一个比现有业务实践更加稳健、灵活和一致的全球现金预测。理解产生高质量的预测对机器或分析师来说不是一个容易的问题。在创建各种业务预测的实践中,我们观察到两个主要主题:
- 完全自动的预测技术可能是脆弱的,并且它们通常太不灵活而不能结合有用的假设或启发
- 能够做出高质量预测的分析师非常罕见,因为预测是一项需要丰富经验的专业数据科学技能
问题陈述
我们的目标是基于业务驱动因素,使用机器学习技术预测 90 天(13 周)范围内应付账款(AP)和子部分的现金流。
如果预测模型能够准确预测:
- 公司财务部门可以分配必要的预算,并在其他创收垂直领域进行投资
- 如果预测有偏差,那么团队可以进行根本原因分析,根据模型提供的未来指标来检查偏差
- 该模型是一个持续改进的模型,因为它捕捉了假日效应和商业意识形态的转变
我们的应付账款(AP)现金预测解决方案:
数据来自不同的来源,执行数据清理活动以使数据对建模和探索性数据分析(EDA)有用,执行完整性分析以验证来自数据源的数据与银行对账单的实际数据。分析了 58 个独立变量,以观察对 USD_AMT 付款的显著依赖性。其中支付条款是 AP 付款的主要驱动因素
如下所示,支付条款分为三类。
- 滞后 0(在同一个月过账和支付):所有具有 0-30 个起息日的支付条款都属于这一类别
- 滞后 1(过账和支付有一个月的差异):所有有 30-60 个起息日的支付条款都属于这一类别
- 滞后 2(过帐和支付有两个月的差异):所有具有 60–90/以上起息日的支付条款都属于这一类别
下面的图 1 显示了具有统计平均差异的薪酬类别的行为差异。明确需要在全球薪酬条件下对不同的滞后时段分别建模,并在报告中将它们整合在一起。
Figure 1
包含未来指标 : - 包含未来指标为业务增加了巨大的解释力。它还为预测的梯度提供了一个指南,使其朝着未来指标相关的方向移动。术语回归用于统计中的这一因素,如果可以用衡量标准来解释,这是以相关方式流动的受抚养人付款的正当理由。数据科学团队尝试了三个主要的未来指标,它们是可用的 COS(销售成本)、COS 加 Open X(运营支出)和 COS 加 Open Inventory。下图显示了成本作为 AP 支付驱动因素的影响,该驱动因素在统计上证明了滞后 2 的相关系数为 0.602。
Figure 2
我们使用一个可分解的时间序列模型(Harvey & Peters 1990 ),该模型有三个主要组成部分:趋势、季节性和节假日。它们在以下等式中合并:
这里 g(t)是对时间序列值的非周期性变化进行建模的趋势函数,s(t)表示周期性变化(例如,每周和每年的季节性),h(t)表示在一天或多天内可能不规则的时间表上发生的假期的影响。误差项表示模型不适应的任何特殊变化;稍后我们将作出误差项是正态分布的参数假设
C 表示承载能力,k 表示增长率,m 表示偏移参数。
我们依靠傅立叶级数来提供一个灵活的周期效应模型(Harvey & Shephard 1993)。假设 P 是我们期望时间序列具有的规则周期(例如,对于年度数据,P = 365.25 对于周数据,当我们以天为单位调整时间变量时,P = 7)。我们可以用以下公式来近似任意平滑的季节效应
解释 HP predict 和网格包含设置基准 :- Prophet 模型用作基线,这是一种集合方法。集成方法是一组训练数据的方法的核心,它根据训练数据给出最佳模型的输出预测。脸书先知是 HP 预言的基线。两者都使用一般加性模型的集合方法。使 HPpropehcy 更好的功能是具有额外的时间序列交叉验证和网格搜索。
***HP predictive 中的交叉验证和网格搜索:-***HP predictive 中的交叉验证和网格搜索评估不同时间序列数据和参数(如每周、每月、每季度和每年的季节性影响)的模型准确性。它主要在数据上训练算法时对傅立叶级数进行处理,并基于验证集上的最佳 rmse 值对参数管道进行排序。该算法优于行业中的大多数算法,因为它在多种算法上接受训练,并在训练期间选择最佳算法,并通过在验证集(算法从未训练过的数据)上评估它们来从网格搜索中获取参数。最后用网格搜索得到的最佳参数进行预测。
证明解决方案有效
下图 4 显示了 AP 付款的移动窗口预测,包括 COS 加上未结库存和未来指标。
Figure 4
当前状态
该模型目前正在生产中,为 AP 团队提供预测,并帮助惠普财务部门进行预算分配。
参考文献
https://research.fb.com/prophet-forecasting-at-scale/
https://arxiv.org/ftp/arxiv/papers/1302/1302.6613.pdf
“内部”利用 A/B 测试的新想法
一份数据驱动且易于遵循的指南,用于衡量程序变更的内部影响。
最后,辛苦的工作是有回报的时候了:作为一名数据科学家,你帮助业务团队开发了一个先进的数据驱动的决策工具,预计将提高整体工作效率,并为具体的业务问题提供建议。然而,衡量这些巨大影响的最佳方式是什么?
这正是我的实习团队面临的情况,因为我们正在与我们的客户 Hilti 结束为期一年的分析项目。幸运的是,有了 A/B 测试的背景知识,我找到了一种新颖而适用的方法。
什么是 A/B 测试?
A/B 测试是一个常用的过程,用于隔离和测试营销中的因素以及网站内容的影响[1]。例如,为了确定添加“下订单”按钮的有效性,公司可以利用 A/B 测试。不同版本的网站将被随机分配给用户,并根据用户的反馈,如退房率,公司可以微调盈利能力和客户体验。
那么,为什么 A/B 测试非常适合我们项目的测量呢?
首先,我们拥有大量受众,因为喜利得北美所有办事处的销售代表都将使用这一新工具。
第二,我们自然有两个版本的“产品”,即旧版本和新版本的定价工具。过去,喜利得的财务和销售代表依赖 excel 表格来评估报价;现在他们配备了更强大的数据和推荐工具。
喜利得的财务和销售代表过去依赖 excel 表格来评估报价;现在他们配备了更强大的数据工具。
这里稍有不同的是,我们假设该工具将对决策和收入的整体有效性产生积极影响。这也被称为测试的“替代假设”。
熟悉了背景之后,我先带大家看一个设计实验的一般流程。
1。选择主题:我们希望通过什么水平来显示差异?
通常,在一个网站层面,我们必须决定是否要显示不同用户或不同网站访问之间的差异,等等。因为我们想要隔离控制组和测试组单元,这样控制组中的用户不会碰巧发现差异并因此冲淡结果。
在这种情况下,我们考虑在办公室层面进行实验,这样一个办公室的人只能使用一种决策工具,但一个城市的不同办公室可能会收到不同的工具。
2。选择人口
我们需要决定实验的作业水平。在这种情况下,我们关心的是选择哪些城市来进行分析。这可以直接影响显著性结果。鉴于核心市场和非核心市场的销售业绩差异很大,我们将分别基于核心市场和非核心市场来分析结果。
3。持续时间
实验的持续时间受多久能观察到效果的影响。在商业场景中,持续时间非常重要,因为总体市场趋势和季节性会极大地影响结果。
在这种情况下,我们同时测试决策效率和收入增长。对于第一个指标,可以每天快速观察,我们将持续时间选择为 1 天,也可以在不同的工作日重复实验,比较一致性。对于第二个指标,考虑到销售的每周季节性,我们将选择一个更长的持续时间为 1 个月。
4。尺寸
一般来说,对于具有不确定性的变更,我们会限制该变更的暴露程度。我们将确定实验的最小有效规模,这样我们既可以避免意外风险,又可以得到可信的结果。在这种情况下,为了计算出我们需要邀请多少销售代表来进行工具变更,我们需要提前决定测试的功效(1-β)、显著性水平(α)、有效规模和基线指标 [2]。为了简化这一过程,人们将使用已有的工具,如 Evan Miller 的“ A/B 测试计算器”。通常的做法是将检验的功效设置为 80%,显著性水平为 1%或 5%,对应于 90%和 95%的置信区间。由于我们只测试工具的正面效果,我们将选择单面作为参数(当我们考虑平等/不平等问题时,我们将选择双面)。
此外,由于我们对我们的新工具相当有信心(我们已经在研究上花了很多钱),我们将选择整个人口作为样本量。因此,我们通过使用最大的样本量获得了最大的可观察期望效果。
该进行分析了!
但是等等等等!我们需要首先做一个健全性检查,检查那些预计不会改变的指标。如果他们也发生了变化,这是一个消极的迹象,表明测试结果不可信,你可能想检查一下环境的设置,看看是否有巨大的影响因素改变了所有的结果。
在这个具体的例子中,我将选择雇员的工作时间、建筑行业的股票指数、电动工具的平均市场价格作为不变的度量。
如果健全性检查的结果令人满意,我们可以继续进行测试的有效评估。这将包括总体显著性测试和符号测试。
在这种情况下,总体显著性测试是将实验中涉及的所有城市相加的结果,并使用估计的置信区间评估控制/实验组之间的差异。
感谢成熟的在线计算工具,我们只需输入结果就可以得到估计的置信区间[3]。你也可以通过计算混合概率和标准误差来得到这些。
符号测试是关于结果频繁发生的可能性。例如,如果我们在 20 个城市进行了一项实验,并获得了 20 个积极改善结果中的 20 个,这种情况的可能性有多大?我们可以更好地了解我们对自己的发现有多大的信心。
最终,一切都是关于迭代,并根据结果采取行动。希望我们的新决策工具将显著增加花费在折扣决策上的时间,并帮助喜利得产生显著更好的收入!
参考
[1]https://towards data science . com/ab-testing-in-real-life-9b 490 B3 c50 d 1
https://patents.google.com/patent/US7975000
[3]https://split metrics . com/blog/mobile-a-b-testing-statistical-significance/
https://www.evanmiller.org/ab-testing/sample-size.html
https://classroom.udacity.com/courses/ud257
数字事件:广播
本文探讨了 NumPy 科学计算包中使用的广播概念。
我们将通过给出一个简单的定义来介绍广播的概念,并通过一些例子来说明如何利用 NumPy 数组在 Python 中实现广播。我们将提供更详细的解释,以及更深入的定义,广播是什么,它的规则,好处和限制。
广播是 NumPy 中采用的方法,用于对不同维度的数组执行算术运算。加法、乘法、减法等一般算术运算。倾向于在对大小不同的数组执行操作之前广播数组。
为了给上面的定义提供一个推理的上下文,下面的代码描述了一个算术运算在没有广播的情况下是如何工作的示例#1 和示例#2 中示出了相同的算术运算,但是这次使用了广播。
例子# 1——一个没有广播的世界
import numpy as npa = np.array([1,2,3], dtype=float)
b = 5
c = np.empty([3])for idx, i in enumerate(a):
c[idx] = i * bprint(c)
>> [5\. 10\. 15.]
在例#1 中,我们有一个包含三个元素的 NumPy 数组:1、2 和 3;这个数组被赋值给变量“a”。变量“b”被赋给标量 5,而“c”被初始化为一个包含 3 个元素的空数组。“c”的形状是“a”和“b”之间算术运算结果的预定预期形状。
所执行的算术运算是乘法。在这个操作中,标量“b”乘以数组“a”中的每个元素。用更专业的术语来说,我们在变量‘a’和‘b’中保存的值之间执行一个元素式的操作。
为了执行基于元素的操作,我们遍历数组“a ”,并将每个元素与“b”中保存的标量相乘。运算结果放在变量“c”中“a”内元素的相应索引位置。所以“a”中索引 0 的元素(a[0] = 2)和“b”中保存的标量的乘积将被放在“c”中的索引 1 处(c[0] = 1* 5 = 5)。
例子# 2——一个有广播的世界
import numpy as npa = np.array([1,2,3], dtype=float)
b = 5
c = a * bprint(c)
>> [5\. 10\. 15.]
在示例#2 中,我们可以看到我们编写的代码更少,并且我们不需要循环来实现与示例#1 相同的操作结果。这是因为利用广播来执行算术运算。
上图直观地描述了例 2 中发生的情况。数组和标量之间的算术运算是解释广播如何工作的最简单的方法。在示例#2 中,分配给变量“b”的标量值 5 已经“广播”给变量“a”中数组的所有元素。通俗地说,值 5 已经被复制了几次,以匹配数组“a”的形状的维度,从而为操作的执行提供合适的条件。
更有目的和更直观地重新定义广播,我们可以得出如下描述:广播是 python 中使用的一种方法,它为数组操作提供了一个包装器,通过向量化实现了基于循环的操作的优化。
**【包装器】**指的是通过广播进行的操作是通过 python 抽象出来的,因为实际执行是在一种更低级的语言中进行的,即 C.
向量化指的是对几个元素进行操作,而不对操作进行任何修改。该运算可以是示例#2 中所示的乘法算术运算。
前面,我们已经说过,示例#2 中的标量值是“复制的”,以匹配变量“a”中的数组的维度,目的是使两个数据具有相同的维度,从而实现适当的元素式操作。这并不完全正确。
发生的不是复制,而是扩展维度上的迭代器实际上并没有移动,或者说是迭代。为了更简单地描述正在发生的事情,标量“5”或任何数据值,无论是一个数组,只要被扩展以满足另一个数组的维数,就具有一个在广播操作期间不移动的迭代器。这是因为变量“b”中标量 5 的迭代器的步距在 NumPy 内核中被设置为 0 。下图显示了变量“a”和“b”中保存的数据值之间的迭代运算的时序,同时显示了每个时间步的运算结果。
1st Iteration
2nd Iteration
3rd Iteration
现在我们在某种程度上理解了 NumPy 中的广播是如何工作的。为了进一步了解什么是广播以及如何利用广播,我们将探索支持适当广播的规则和条件,以及如何利用广播的实际例子。
播出规则和条件:
要将一组阵列视为“可广播的”,需要满足一组条件。
- 数组的形状相同,或者两个数组的最终尺寸匹配
- 如果一个数组与另一个数组的维数不同,那么维数较小的数组将被扩展 1,直到两个数组的维数相等
- 如果两个数组是可广播的,那么维度大小为 1 的数组的行为方式是使维度较小的数组能够通过复制扩展到第二个数组的长度。
条件#1
# Condition 1: The shape of the arrays are the same or the ending dimensions for both arrays matchx = np.array([3,2,1])
y = np.array([6,5,2])
z = x * yprint(x.shape)
>> (3,)
print(y.shape)
>> (3,)
print(x.shape == y.shape)
>> True
print(z)
>> [18 10 2]
条件二
x = np.random.randn(4,3)
y = np.arange(4).reshape((4,1))
print(x.shape)
>> (4,3)
print(y.shape)
>> (4,1)
z = x * y
print(z)
>>[[-0\. -0\. 0\. ]
[ 2.2984589 0.27385878 -1.17348763]
[-1.96979462 -4.9748125 0.65956746]
[-1.24697399 0.80710713 1.61002339]]
条件#3
x = np.random.randn(5,4)
y = np.random.randn(1,4)# The array 'x' has a length of 5 and the array 'y' has length of 1, by following condition 3, the array 'y' has been stretched 5 times to match the array 'x' during broadcasting.print(len(x))
>> 5
print(len(y))
>> 1
print(x + y)
>>[[-0.99329397 -0.98391026 0.85963453 0.28137122]
[-2.17210589 0.99278479 1.98294275 1.11116366]
[ 0.92228273 -0.39603659 1.99637842 2.31311734]
[-1.29068518 0.22292541 1.56178367 2.07585643]
[ 2.42435639 -0.07977165 0.28020364 1.42663066]]
最后,广播在效率方面提供了一些好处,因为广播中发生的循环是在 C 中发生的,而不是在 Python 中;这意味着指令在 CPU 中执行之前不会被解释,从而提高了效率。此外,正如前面说明广播如何工作的图表所示,我们可以观察到广播提供的内存效率,因为我们没有制作不必要的数据副本。
广播在实践中是有用的,尤其是在数据分析方面。一个例子是,当承担贬低数据的任务时,我们可以利用广播。贬低数据是通过用数据集分组的平均值减去数据集的每个元素,使一组数据集的平均值为零。代码片段提供了这是如何实现的。
# Broadcasting can be used for demeaning data.
# Demeaning is the process of making the mean of a group of data zero by subtracting each element of the data by the mean of the grouped data.arr = np.array([[1,2,3],
[4,5,6],
[7,8,9],
[10,11,12]])
# Take the mean of each column within the array
arr_mean = arr.mean(0)
# Now we use broadcasting to perform element wise subtraction between the array and the mean
demeaned_data = arr - arr_mean
# To prove that array has been demeaned, we should get a mean of zero for each column when computing the meandemeaned_data.mean(0)
>> array([0., 0., 0.])
请随意从下面提供的链接了解更多关于广播的信息。
[## 通用功能(ufunc) - NumPy v1.17 手册
通用函数(或简称为 universal function)是一种以逐个元素的方式操作的函数,支持数组…
docs.scipy.org](https://docs.scipy.org/doc/numpy/reference/ufuncs.html#broadcasting) [## 词汇表-NumPy 1.17 版手册
沿轴为具有多个维度的阵列定义轴。一个二维数组有两个对应的…
docs.scipy.org](https://docs.scipy.org/doc/numpy/glossary.html#term-vectorization) [## NumPy C 代码解释- NumPy v1.13 手册
通用函数是可调用的对象,它接受输入并通过包装基本的一维循环产生输出…
docs.scipy.org](https://docs.scipy.org/doc/numpy-1.13.0/reference/internals.code-explanations.html#broadcasting)
无纸化假期
自动化示例
使用 Python 发送贺卡
Photo by Aaron Burdon on Unsplash
假日是温暖和充满爱的季节,但这也意味着包装纸、贺卡和信封等会产生大量废物。
“美国人在感恩节到新年期间扔掉的垃圾比一年中的其他时间多 25%。额外的废物相当于 2,500 万吨垃圾,或大约每周额外 100 万吨”。— 斯坦福大学
缓解这个问题的一个解决方案是发送电子贺卡,而不是纸质贺卡。这将节省不必要的纸张浪费和金钱。今年,在 Python 的帮助下,我们能够向全球 100 多个家庭成员和朋友发送带有个性化信息的贺卡,并且实现了零纸张浪费。
联系人名单和贺卡
要管理联系人,您可以使用 Excel 或 Google Sheet,无论哪种对您来说更简单。我的只有三个栏目,“电子邮件”、“问候”和“信息”。电子邮件列包含收件人的电子邮件地址。“问候”栏是您希望如何问候他们,最后,“消息”栏可以包含任何个性化的消息,如果您愿意的话。如果没有,就留空白。
Contact List
至于制作圣诞卡,有很多应用程序可以帮助你制作自己的圣诞卡。今年,我用一款名为“InstaMag”的 iPhone 应用程序制作了我们的地图
现在我们有了联系信息和圣诞卡,我们可以将它们加载到 Python 中。确保将文件与代码保存在同一个文件夹中。
import files
步骤 2 设置 SMTP 服务器
我们将使用 SMTP 服务器连接到您的电子邮件服务器。请注意,如果您有 Gmail,您需要将 设置为允许不太安全的应用 打开,这可能会导致安全问题,并使其他人更容易访问您的 Gmail 帐户。有些人建议为 Python 开一个新的 Gmail 账户,只是出于安全考虑,但对我来说,这次我只用了我的 outlook 账户,因为我不会用它做任何重要的事情。另一个选择是在发送电子贺卡时打开设置,然后在发送完毕后再次关闭。
set up server
编写信息并发送电子邮件
有了 Excel 文件中的联系信息,我们可以遍历提供的电子邮件地址行。如果没有提供个性化信息,邮件正文将是“圣诞快乐,新年快乐!”。如果电子表格中有个性化消息,那么它将被放在正文中。一旦我们将正文和圣诞卡附加到邮件中,我们就可以发送电子邮件了。
write message
希望这篇文章对你有用。节日快乐!
holiday.py
资源
机器学习实用初学者指南
本文将试图详细介绍简单神经网络的工作原理。同时也让你看到了让他们尽其所能的内在魔力。我会尽可能地减少数学的使用,让那些没有很强数学背景的人觉得事情不那么复杂。即使你知道基础知识,也要从头开始阅读这篇文章,因为它会让你熟悉我决定在这篇文章中采用的方法。它的每一点最终都和代码一样重要。快乐学习
所以在看到所有关于人工智能的宣传后,你决定自己开始使用人工智能。让自己成为私人助理,成为托尼·斯塔克,这个主意听起来很酷,对吧?是的,相信我,我已经经历过了。虽然这很有趣,但还是要开发一些聊天机器人 api,比如脸书信使一号,上传一堆恶心的科幻台词让你的机器人说,几周后惊奇就结束了。而且这个机器人可能会像你挑选的大多数其他酷项目一样被遗忘。
或者,您可能是为您的项目选择了 scikit-learn 或 tensorflow 等库的酷孩子之一。好吧,入门教程可能已经用完了,你还想要更多…
那我们该怎么办?一旦进入数学领域,大多数教程听起来都很复杂。什么是梯度下降来着?这个 sigmoid 函数是什么?这些拉丁语在我的英语里干什么!?!
因此,对于我们这些几乎不会集成函数的人来说,这里有一个指导来开始学习机器学习的数学:
线性代数:回归之类的概念需要你对线性代数有所了解。你不需要掌握每一个概念,只需要知道发生了什么和为什么。
统计和概率:你一定在任何 ML 视频中每隔几秒钟就听到“预测”这个词,所以概率显然是一个要求。建议你把遇到的所有公式和概念做一个备忘单,以供参考。记住你不是在考试(或者你是?!)所以还好。现在,理解图形是你绘图和处理数据的必要条件,所以练习和概率是一样的。
那我应该回到大学吗??
不完全是,当然这些在你的大学时代一定已经涵盖了,但这并不意味着你必须回到大学。我建议去看看可汗学院、 Udemy ,那里有相当多的资源供我们这样的爱好者使用。而且质量(不是指视频分辨率)简直不可思议。如果你仍然想从真人那里上课,那就由你决定。
有没有不用数学的方法?🙄
好吧,你会在某个时候需要数学,否则很难在这里扩展和成长。所以我强烈建议至少尝试一下线性代数。因为这很简单。你可以和擅长你不知道的事情的人合作,一起工作。
现在把数学放在一边,让我们讨论一些关于“主算法”的理论。
为什么是我们的大脑??
当你看到“神经网络”这个名字时,你会有点“明白了,它是基于神经元网络的。你知道我们称之为灰质的东西。所以,如果神经元让我们变得聪明,帮助我们学习,那么它也会帮助机器,对吗?这就是神经网络背后的整个想法。但是为什么呢?我听到你在问。“人类的算术太差了!这怎么解决任何事情?”
的确,我们不擅长数学,但我们擅长的一件事是学习。
等等,我听到另一个问题。“难道计算机没有足够的内存来存储几乎任何东西吗”。有道理。但这也无助于这项事业。当然,我们可以将互联网上所有可用的信息加载到某个数据中心,然后就可以收工了。但这真的是解决方案吗?我的意思是,这和让机器记住所有东西不是一样的吗?对于任何一个在数学考试中尝试过这种方法的人来说,他们可能会意识到这有多糟糕。
所以在这一点上,我们有一台价值数十亿美元的计算机,它可以给你关于任何事情的信息,同时消耗足够的能量来运行这个星球。所以现在,如果我问它毕达哥拉斯定理的意义,它会一无所知,因为它所知道的定理是这样的…
当然,它可以用公式解决你所有的问题,但是文字问题怎么办?这里有一张来自可汗学院
现在,对于所有的黑客来说,很容易编写一个脚本来解决这个问题。但是另一个概念呢?这真的是机器在做它应该做的工作吗?所以在这一点上,你是分解这个问题的老师,给你的学生(机器)一些数字,让它求解边长。我希望这能澄清为什么记忆不是解决办法,也不是纯粹的算术优势。你也许能够完成最难的计算,但是如果你不能理解这个问题并从中获得你需要的数据,那还有什么用呢?
在理解了采用大脑如何工作的想法背后的动机后,我们选择这条路线的原因就很清楚了,现在在下一节中,让我们尝试比较“人工神经网络”和它们的生物学对应物。
碳对硅/人对机器。
所以,假设你已经理解了为什么我们用大脑来模拟神经网络,我现在将深入解释和比较这两件事,让你更好地理解神经网络是如何工作的,而不需要太多的数学知识。这是神经元的样子…
除非你有神经科学的学位,否则那东西很可能会让你头晕。所以对于我们这些几乎分不清动脉和静脉的人来说,这里有一个更简单的版本…
现在这里有一个神经网络中神经元的比较…
这里是它是如何被简化的,橙色的圆圈是魔法发生的地方,它可以被称为’核’。左手边的黑线是所谓的“树突”。它们基本上是分支,将输入/信息传递给神经元。“轴突末端是右手边附近的黑线,它将输出信号从神经元带到下一个神经元。
总的来说,神经网络(生物网络)看起来像…
很乱,对吧?这是机器学习中使用的神经网络的样子…
现在,与它的灵感相比,人造的看起来不那么令人生畏了,对吗?我们只是把大脑中神经元的所有复杂性分解成一个简单的球杆模型。记住所有这些图片,因为在下一节,我将进入这个东西实际上是如何工作的,同样尽可能少用数学。
神经网络剖析:工作
现在,虽然这个模型有助于进行比较,但为了让我们理解它是如何工作的,我们需要在混合中加入一些数学,毕竟,如果你想弄清楚发生了什么,你需要数学。
好的,这是数学化的版本…
X1 至 Xn 代表输入。(让它们是 0 到 1 之间的数字)
σ指所有输入的总和。
所以σ给我们所有输入与其对应权重的乘积之和。
现在,让我们试着理解这一切,这里有一个例子。如果你正在纹身,疼痛开始会有点缓慢,然后持续加剧。但是你如何衡量痛苦呢?我们将事情与疼痛的程度进行比较,我们会说“比打针还疼”,那是什么感觉?比刺还痛。等等什么?
因此,如果我严格要求你用 1 到 10 的等级来评价它,它会类似于上面的一些东西。现在,你的神经元会收到这些强度为 2 的疼痛信号,它们会通过网络传递这个值,直到它到达你的大脑,因为你的大脑对强度为 2 没有问题,所以你不用做太多。但是一旦它超过了一个阈值(比如说 5),你的大脑就会强迫你把手拿开。这是你对 5 级以上疼痛的反应。
现在,你的整个手臂会从每个疼痛点发出疼痛信号,比如说从“n”个地方发出,每个信号的值是“X”。所以你的神经元会将所有的信号/X 值相加得到你的总疼痛。因此总和为’∑’。现在这个σ作为一个信号被发送到你的大脑,然后它发回关于该做什么的信息,我们称之为输出。
看,现在也没那么难了,是吗?现在你明白了为什么所有的 x 都存在,以及有什么作用。那重量呢?
重量是奇迹发生的地方…
每次输入与相应的权重相乘时,其值都会根据权重值增加或减少。这里有一个例子来解释为什么这很重要…
现在假设你正在学骑自行车。
现在,首先我们从卸下训练轮开始,这是你第一次学习平衡,根据你滚动的路面,对不起,你必须做一些微小的调整以确保你不会摔倒。你可能会发展出一些方法,比如用你的腿来充当配重或手等等。首先,你从随意的动作开始,直到你找到正确的动作。这些调整会让你对以后的道路更加敏锐。权重也是一样,首先权重是随机分配的(有时甚至设置为 1)。稍后,根据输出,使用一些技术优化权重,比如我在开始时提到的梯度下降。
经过所有这些修改,你的算法已经准备好帮助人类对抗癌症或者让地球摆脱癌症(看我在那里做了什么?)
这仅仅是个开始,还有更多的内容要介绍,还有更多的内容要改进,还有更多的内容要替换。所以继续读下去。
接下来,我们将建立自己的神经网络!👏👏👏为自己能走到这一步而感到自豪吧!现在真正有趣的事情开始了。
让我们建立天网:建立你的第一个神经网络
让我们建立天网:建立你的第一个神经网络
在上一节中,我们讨论了神经网络的内部工作方式。现在我们已经了解了数据是如何传递的,让我们试着构建一个简单的神经网络。
我们将使用 Python 进行编码。
在我们开始之前,让我们先来看看你开始编写网络代码所需要的东西,除了我们一直在做的审判日的梦…
现在完成了所有这些,让我们直接进入编码吧!一定要喝一杯…
那么,我们就从进口开始吧…
numpy 是一个库,顾名思义,它是关于数字的。从这里,我们将导入函数,让我们计算指数函数,点积,并创建数组。
random 不是随机导入,random 非常重要,因为它是一个包含生成随机数的函数的库。我们稍后将讨论为什么我们需要随机数……在我们开始设计之前,让我们看一下我们试图构建的网络。
所以我们有 4 个输入和 1 个输出。我们将用矩阵来表示输入和输出。这将会给我们一些像…
这是整个程序的代码,我们将把它分解一下…我建议读一遍,试着理解整个流程。
现在,这看起来令人生畏,但一旦你开始分解它,它就非常简单…首先,让我们看看我们的输入和权重是如何相互作用的。
我们只对 2 个矩阵进行点积运算。
现在没那么难了,是吗?向前到下一个然后…
对于权重值,我们最初为它们设置随机值,而不是每次都写下随机值,我们利用 random (不是随机库,是‘随机库’… tumble weed rolls )库。
我们在这一点上使用激活函数。激活函数将你的输出从一个神经元挤压到一个数值范围。我们使用的是 Sigmoid 函数,它会给出 0 到 1 范围内的输出。这使得处理输出更容易,甚至当你使用多于一层时计算也更容易。
现在我们已经理解了数据的初始化,让我们试着理解一个模型是如何被“训练”的。永远记住,你不能一下子教会你的狗所有的技巧…
你必须给它一些时间,坐下来进行多次会话,除非你的狗一次就能得到它,因为它可能是来自未来的终结者机器人🤔
即使是机器也需要时间和练习才能把事情做好。他们必须接受 n 次训练。所以我们希望我们的算法运行几次,太多也不好。这个你得通过一些实验来弄清楚,这里我们要做 10000 次。
现在,用我们的狗做类比,每次你告诉你的狗如何去捡,你可能都得自己去捡。然后看看狗是怎么做的。然后根据它犯的错误,你试着纠正它。机器也是一样的(至少当你在进行监督学习时)。我们计算误差,这是从公式中获得的:
误差=期望值—实际值
我们在计算误差,就像你知道你的狗没有追着球跑,所以你要让它知道这是它犯的错误。同样,我们知道期望值和实际值之间存在差异,所以我们也必须纠正这些错误。我们通过调整权重来做到这一点。我们遵循另一个简单的公式…
调整=误差输入梯度**
梯度,是一个告诉我们对当前重量值有多确信的数字,它是通过计算您正在使用的激活函数的导数获得的,这里是 Sigmoid 函数。
现在,看看上面的代码…
似乎简单多了,不是吗?这是相同的代码,去检查一下…我已经将它打包成模块,因为将代码转移到生产或用作导入更容易,如何编写代码取决于你…现在,这里有一些你可以尝试的东西:
- 尝试不同的训练长度
- 尝试固定重量而不是随机重量
- 并尝试添加更多数据。
干得好,一路走到了这里!🙌但是它还没有完成,虽然这个例子非常简单,尽管它需要这么多的解释才能理解,但它不会对你有真正的帮助,除非你真的拿起铲子,深入了解它的工作原理。因此,在下一节中,我们将接触一些 Python 和数学知识。我保证会很容易。
神经网络剖析:神经网络的内部运作
在这之前的部分,我们学习了如何建立一个简单的前馈神经网络。我们把一切都表示为一系列矩阵运算。我们的输入数据是矩阵的形式,我们的输出也是矩阵。如果你打算分解它,弄清楚学习实际上是如何发生的,那么来回的矩阵运算可能会让你感到困惑,这可能会令人望而生畏,并让你害怕自己不理解你一直在输入的代码…
所以,让我们把一切都形象化,然后,希望我们能理解这些东西实际上是如何从输入到输出的!戴上你的数学帽子,从现在开始,事情会变得很严重!
让我们从输入矩阵开始。这是一个 4x3 的矩阵,这意味着它有 4 行 3 列…
我们的输出矩阵是一个 4x1 矩阵的形式…
权重矩阵是一个 3×1 矩阵…
现在,在第一步中,当输入数据通过以下代码输入到网络中时:
就矩阵运算而言,它看起来像这样…
我们的输入矩阵和权重矩阵之间的点积产生了下面的结果,我们现在称它为输出矩阵…
现在,到了误差计算这一步,永远记住这一点,
误差=期望值—实际值
上面代码的矩阵运算是…
接下来是突触权重矩阵值的调整…
让我们从“self.sigmoid_derivative(output)”开始,一条一条的来破这个。我们计算上面获得的输出矩阵中每个元素的 sigmoid 导数。
现在我们要把上面得到的矩阵和包含误差值的矩阵相乘……(不要,这是元素乘法!)
接下来是输入矩阵的转置和上面得到的矩阵之间的点积…
对权重矩阵的调整如下…
哇,那里有很多数学😰,眨眼就错过了!
但是,等等,还有一个等式!这有助于你做预测,所以开始吧。当传递新的输入值时,该矩阵在训练迭代后用调整后的权重值进行运算…
这就是全部了。仔细想想,这很简单,不是吗?建议你在建立网络时记下矩阵运算,这不仅能让你了解网络内部的工作原理,也是排除错误的好方法。
现在,当你调整网络中的某些东西时,你已经知道你在做什么了,你可以知道你是否使它在计算上更昂贵或更复杂,而没有好的回报…
所以让我们开始调整,并与我分享你的结果😁!
谢谢你坚持到最后!希望这篇文章能帮助你了解人工智能。请留言让我知道你的想法👇!
【sushritpasupuleti.blogspot.com】最初发表于。****
有效数据预处理的实用对话
3 个基本的数据清理函数,2 个奇怪的字符&一个可怕的数据集
**阿基米德:**请坐伟大的列奥尼达,我能为你做什么?
**列奥尼达:**我需要一个机器学习模型来告诉我在我的公路车上开启超能力的秘密。
冷静点,年轻的巴克,我不是魔术师。
**L:**指向手表但是你可以用这个,不是吗?
**答:**嗯,一块智能手表。
L: 不仅仅是“智能手表”Archemides!这个设备可以让我跟踪心率——在我训练的时候以及一天中的其他时间。
等等,你的意思是告诉我你的手表让你知道你什么时候……活着?
先生,你是一个小丑。
**答:**数据科学家其实。虽然有时候我也分不清。
T21:让我们看看吧。我已经使用这个非常有用的 github 库在本地转储了我所有的 Garmin 会话数据集。
答: 机器学习是个热门话题但是你知道什么比 ML 更热吗?快速获得结果。
我只想做 ML。
**答:**T34 毫升?听着,现实是你可能不需要它来提取你想知道的东西。
告诉我——你的目标是什么?
L: 我要超车,不是被超车!
来吧,列奥尼达,给我一些我能做的事。
L: 好的……在更长的时间内持续产生更高水平的力量。我想知道怎样训练才能最好地做到这一点。
答:太好了。成功的项目始于对目标的思考。不管我们是否需要参考一个 ML 模型,保证数据干净、一致、准确是一个必要的前提【0】。第一步是进行一次简单的数据质量检查**【1】。**
你是怎么做到的?
答:让我们为您的 Garmin 会话数据集快速浏览 3 个基本的清理函数。
**import pandas as pd
import os
import datetime as dt
from datetime import datetime
import matplotlib.pyplot as plt
import gc_download
raw_session = gc_download.load_sessions()[0]
print(raw_session.head())**
我应该在这里看什么?
****答:正是。对于知识发现来说,现在还没什么用。
L:数据清洗预处理 的作用是然后使原始数据集有用?**
答:**没有正式的定义,但是我所说的有用的是两个一般的东西。首先,要习惯数据集【2】的 变异和质量。第二,安装一个 标准数据结构。 满足你的分析要求。分析是一个广义名词。它融合了基于规则的,机器学习,深度学习,你会明白的。
继续,这对我的数据集意味着什么?
很明显,原始数据集包含了太多的信息,所以…
答:分离出你需要的信息。(步骤 1)
*details = raw_session['details']
raw_df = pd.DataFrame(
[r['metrics'] for r in details['activityDetailMetrics']],
columns=[r['key'] for r in details['metricDescriptors']])
print(raw_df.head())
print(raw_df.columns.to_list())*
***答:*从原始数据集中分离出“activityDetailMetrics”和“metricDescriptors”后,我们剩下 5 行 x 7 列有希望的信息。让我们保留’ directTimestamp ‘和’ directHeartRate '。
L: 和‘directAirTemperature’。
***答:*为什么不。
*c_name =['directAirTemperature','directTimestamp','directHeartRate']
c_rename = ['AirTemperature','Timestamp','HeartRate']
data1 = raw_df.copy()
data1 = data1[c_name]
data1 = data1.rename(columns={a:b for a,b in zip(c_name,c_rename)})
print(data1.head())*
我很高兴我们重新命名了那些栏目,但是在这里,回答我一些问题…
那究竟是什么格式?!(步骤 2)
*data2 = data1.copy()
data2['Timestamp'] = [datetime.fromtimestamp(int(i/1000)) for i in data2['Timestamp'].to_list()]
data2.set_index('Timestamp')
data2[['HeartRate','AirTemperature']] = data2[['HeartRate','AirTemperature']].astype('float32')*
答: Unix 时间戳!数据之神以这种格式读取时间。它们以秒或毫秒来标记自 1970 年 1 月 1 日以来的时间长度。
Garmin 以毫秒为单位记录这个时间戳。然后我们将这个时间戳除以 1000,对吗?
***答:*正是。更一般地说,没有必要花太多时间格式化。只要学习算法能够解释输入,并且我们有一个映射,这就足够了。
L: 如何知道自己是否过度格式化?这听起来像是耐心的作用。
***答:*某种程度上来说,是。不是耐心格式化数据集,而是耐心等待代码运行。
L: 什么意思?
答:格式化归结为一个 可读性 vs 代码性能 的权衡。在“心率”和“气温”的情况下,将这些变量的数据类型设置为float 32*【3】会在不影响精度的情况下分配较小的存储量。*
*print(data2.head())*
L: 众所周知,提高性能而不牺牲精度是一张金奖券。但是我们是不是错过了什么?
***答:*那是什么?
L:缺失数据,得到了吗?!(第三步)
我真的很担心你。
我担心你的幽默感,阿基米德。现在告诉我丢失的数据。
答:叹气一般来说,处理缺失属性值的方法属于两种思想流派之一[4]。第一个是 阴错阳差的失踪。 最常见的情况是,在一个较大的属性和值块中对属性进行删除或替换*。*
L: 第二个呢?
答: 故意遗漏 。进入“不在乎”假设。当被认为重要的信息只在某些群体中出现时。通过将数据块重新布线到 属性-值 对来处理。
第二类与此无关。这个装置是用来记录的。任何丢失的数据都是硬件问题。
***答:***gone _ missing()函数将处理丢失的数据。
L: 地址 —你的意思是删除整行条目吗?
答:不,反正不是没有想过。我们现在有一个选择 删除 或者 重建【5】。如果我们遗漏了数据集的一个边缘案例,我们将删除整个条目。
L: 数据集的其余部分呢?
***答:*直接删除包含任何缺失变量的行是一种保守的方法。插值也是一种选择。心率是一个缓慢发展的过程,这意味着对于任何时间戳,都有一个可能的 bpm 值的紧密间隔。
L: 对于单个丢失的时间戳来说,这可能行得通。但是对于连续缺失条目,我宁愿采取保守的方法。30 秒对于心跳加速来说已经足够了。
***答:*让我们这样做,线性插值或删除由一个开关控制。
*data3 = data2.copy()
useInterp = False
if useInterp:
data3 = data3.interpolate(method='linear', limit_direction='forward',limit_area='inside',axis=1)
data3 = data3.dropna()
data3.describe()*
244 次观察,平均 125.5 bpm,最大 151bpm。简洁的总结但是要适可而止。给我看看 mon-…图。给我看看情节。
*def uni_plot(df):
fig, ax1 = plt.subplots()
color1,color2 = 'tab:red','tab:blue' ax1.set_xlabel('Timestamp')
ax1.set_ylabel('Heart Rate (bpm)',color=color1)
ax1.plot(df['HeartRate'].index, df['HeartRate'], color=color1)
ax1.tick_params(axis='y', labelcolor=color1)
ax2 = ax1.twinx()
ax2.set_ylabel('AirTemperature (C)',color=color2)
ax2.plot(df['HeartRate'].index,df['AirTemperature'], color=color2)
ax2.tick_params(axis='y', labelcolor=color2)
fig.tight_layout()
plt.show()uni_plot(data3)*
李:现在我们正式开始工作了。
我们还没完呢。离群值。
L: 为什么会有异常值?该设备正在测量我的心率,为什么这些值会是错误的?
*data3.boxplot(column=['HeartRate'])*
答:**离群值并不总是错。他们强调不同于常规的观点[6]。高于或低于标准的所有点都以圆圈突出显示。让我们看看所有会话的情况。
L: 有哪些剧情给我看?
***答:*粉色——传统箱线图。大多数离群值位于数据集的低端。
L: 最下面的两个地块呢,数据是怎么处理的?
***答:*补救异常值的一个常用方法是设置阈值。平均值标准偏差的倍数。在它之外的所有数据点将被递归地删除。在蓝色图中,阈值是 3 个标准差,绿色图中是 2 个标准差。
L: 使用 3 标准差阈值仍会保留异常值。让我们用 2 个标准差向前看。
稍等一会儿。 并非所有异常值都是非法污染物,也并非所有非法分数都显示为异常值【7】。
T21:我认为圈子不好。你是想告诉我圆圈不是坏事吗?
***答:*圈子并不总是坏的。
'你到底是什么意思?!
A: 我们倒回去一点。箱线图将异常值定义为数据集四分位范围的标准差的倍数。事实上,每个方框下面都有更多的异常值,这表明数据存在偏斜。不一定是不自然的观察。
L: 那为什么截尾到 2 个标准差的时候没有异常值?
***答:*你自己说的——在 2 个标准差处截断。数据集已经失去了原来的形状,因为忽略了太多的点。让我们在下面想象一下。
L: Woah,这么说红点都被装箱了?这么多人?!我不喜欢这样。
***答:*盲目处理离群值可能是危险的。
L: 危险因为在专注于摆脱方框图的圈子时,我们没能思考那些观察结果代表了什么。出现在时段上端的圆圈代表有用的最大心率努力。我们不可能把它们扔掉。
***答:*你怎么看待较低的离群点?
L: 他们是数据集的人工制品。我开始手动记录我的训练,大部分时间我都有热身阶段。
但是我们真的需要包括热身数据吗?看更长的热身将会扭曲你的总结统计。这意味着会议的工作部分将被歪曲。
我无法告诉你热身在哪里结束,工作在哪里开始。让我们去掉任何低于 80bpm 的数据。这也可以捕捉 Garmin 在中途停止可靠跟踪的情况。
猜猜接下来会发生什么?
L: 剧情?
答:剧情
答:我不需要机器学习模型来告诉你你没有坚持训练。你在室内训练的次数也比室外多。
L: 这是希腊,阿基米德。我不想被战车压扁。不,谢谢你。
A: 所以你试着在健身房复制户外训练?
L: 正是。
***答:*事实是你没有改变室内训练的持续时间。尤其是今年。时段持续时间和心率标准差中紧密的粉红色簇代表一致强度努力的阻滞期。
L: 也就是说,相对于 2018 年,2019 年的会议强度平均水平(HRavg)变化更大。
***答:*真。室内会议似乎更激烈,时间更短。
嗯,当你把它画成那样的时候,就很明显了。在自行车世界,我们谈论心率区[8]。我的区域看起来像什么?
***答:*我们没有乳酸门槛数据,但我们可以将数据分成代理区域桶。
一个人越有耐力,就越难振奋人心。目前还不清楚更高的心率是否意味着更好的表现。性能应该由比赛结果和功率数据来衡量。
***答:*如果是那样的话,匆忙进入一个 ML 模型将会是时间下沉。您需要做的是丰富您的数据集,在这种情况下使用功率数据。
L: 不管怎样,需要做的事情很明显——改变室内会议的长度和持续时间。花更多时间在心率较低的区域是没问题的。你可以称之为主动恢复。
甲:我把这个留给你。
机器学习中的一个重要哲学是,人们不应该期望模型做所有困难的工作,即使是一个强大的非线性模型[2]。
***答:*今天,我们已经非常快速地可视化了您的完整 Garmin 会话历史,只给出了您的非结构化原始数据。
L: 对。我们已经通过 做到了 1)删除不必要的数据,2)格式化和重新索引, 和 3)堵塞丢失的值。
是的,这些都是关键的编码任务,但是在这个过程中效率更低的环节是对话*。有效的 数据清理 是关于确保原始记录符合任务特定的——不一定是通用的——指导方针。它有很多定义,但可以肯定的是,它是一个交互过程。*
L: 至关重要的是,它需要在领域专业知识和计算标准之间来回转换。我认识到知识发现不仅仅来自机器学习。
知识发现被定义为从数据中提取明确的、先前未知的和潜在有用的信息。[10]
不幸的是,你还不是轮子上的火箭。
但是我更有能力成为一名教师。我了解到我的室内课程并不像我想象的那样可以复制室外课程。我需要包括会话持续时间的变化,并纳入功率数据作为性能的衡量标准。我对不一致的训练更有责任感。我很惊讶我们这么快就做到了。
答:**我们关注对复杂性的影响。
阿基米德,我喜欢这个原则……现在,回到掠夺村庄和雕刻雕像的话题。
下次见,列奥尼达。
附录
[0]—https://www . kdnugges . com/2018/12/六步-master-machine-learning-data-preparation . html
[1]—https://www . kdnugges . com/2016/10/data-preparation-tips-tricks-tools . html
[2] —预测分析的基础,伍沾德,Stephen Coggeshall,2012 年
[3]——https://docs.scipy.org/doc/numpy/user/basics.types.html
[4] —处理缺失属性值,Jerry W . Grzymala-Busse,wit old J . Grzymala-Busse,2010 年
[5]—https://towards data science . com/how-to-handle-missing-data-8646 b 18 db0d 4
[6]——离群值的力量,Osborne & Overbay,2004 年
[7] —统计数据中的异常值,Barnett & Lewis,1994 年
[8]—https://www . British cycling . org . uk/knowledge/article/izn 2014 08 08-理解-强度-2 -心率-0
[9] —数据清理:知识发现的前奏,Johnathon I Maltic 和 Andrian Marcus,2000 年
[10] —数据挖掘原理,Max Bramer,2007