TowardsDataScience 博客中文翻译 2019(四百六十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

tensor flow on edge——用树莓派打造“智能”安全摄像头

原文:https://towardsdatascience.com/tensorflow-on-edge-or-building-a-smart-security-camera-with-a-raspberry-pi-5bb2fc039b0f?source=collection_archive---------9-----------------------

构建一个“智能”、Raspberry Pi 支持的边缘计算摄像头设置,运行 Tensorflow 对象检测模型来检测入侵者

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

我的户外相机被光线、风、汽车或除了人以外的任何东西触发的时间太长了。过于谨慎的安全摄像头可能是一个特征,但也是一个令人讨厌的特征。

我需要一个解决这个问题的方法,但不要太过火。简单,优雅,但有效的东西。

乡亲们,来见见我亲切地称之为“ ”的稻草人——Cam。一个 Raspberry Pi 供电的摄像头,它通过 Tensorflow 对象检测来检测人们,并在他们踏上我的门廊的第二秒钟用格外响亮刺耳的音乐(或警告声)来迎接他们。

通过 Tensorflow、Raspberry Pi、摄像头、扬声器和 Wifi 进行实时物体检测,确保夜晚宁静。有点吧。

我们在做什么?

更严重的是,使用实时视频流和机器学习进行对象检测是一个实际的真实世界用例。虽然大多数用例可能令人毛骨悚然,但我确实在检测物体或人方面找到了一些价值*,最初发表于 2019 年 12 月 9 日*https://chollinger.com*。*在私人安全摄像头上。

如果家中的安全摄像头网络能够检测到真实、潜在的威胁——人类和松鼠——并做出相应的反应(例如,通过发送警报),这将极大地提高这些设备的实用性,这些设备主要依赖于运动检测或连续视频记录——这两者要么非常容易出错,要么最多是被动反应(向你展示事后发生的事情)。

关于安全摄像头的话题

然而,大多数消费级视频监控系统非常糟糕、简单明了。它们要么需要昂贵的硬连线,要么依赖于每 10 分钟设置一次的 janky 红外和运动检测,因为汽车会驶过房屋,依赖于第三方公司的 grace 和软件更新,通常是订阅模式,通常无法通过 API 访问。

我的未命名的户外相机设置通常由风中飘扬的旧荣耀引发,而不是由人引发。

解决方案

这是我们要做的:

我们将使用带有摄像头模块Raspberry Pi 4 来检测视频。这可以持续运行,不需要依靠运动传感器来启动。

为了检测物体,我们将使用谷歌的张量流物体检测 API 。这个库使我们能够使用开箱即用的对象检测(稍后将详细介绍),而不需要手动训练和调整模型,也不需要云部署

为了与摄像机对话,我们将依赖于 OpenCV。

现在,给你一个问题:我的旧 RasPi 运行的是 32 位版本的 Raspbian。Tensorflow 与 32 位操作系统不兼容(当然,可能会有替代方案)。此外,虽然新的覆盆子是一个强大的小机器,但它远不能与现代计算机相比——特别是在 3 和更早的版本上。

为了减轻这种情况,我们将通过 Pi 上的网络将视频流式传输到一台更强大的机器上——一台家庭服务器、NAS、计算机、一台旧笔记本电脑——并在那里处理信息。

这是一个叫做边缘计算的概念。根据这个概念,我们本质上使用功能较弱、较小的机器来实现低延迟通信,方法是在物理上靠近边缘节点的机器上执行繁重的工作,在本例中,运行 Tensorflow 对象检测。通过这样做,我们避免了互联网上的往返,以及不得不为 AWS 或 GCP 上的云计算付费。

为了实现这一点,我们将使用 VidGear ,具体来说是 NetGear API ,这是一个为通过网络传输视频而设计的 API,使用 ZeroMQ。只是要警惕一个 bug,要求你使用开发分支。

一旦我们检测到流中有人,我们就可以使用 ZeroMQ 向树莓发送信号,播放一些非常大声、令人讨厌的音频来吓跑人们。

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

设置开发环境

虽然可能不是最有趣的部分,但首先,我们需要一个开发环境。为此,我在 Linux 上使用了 Python 3.7 的 Jupyter 笔记本。

我们将基于以下教程开展工作:https://github . com/tensor flow/models/blob/master/research/object _ detection/object _ detection _ tutorial . ipynb

旁注:由于我使用的是 Tensorflow 2.0 测试版,我不得不将 tf.gfile 的 API 修改为~/中的 tf.io.gfile。local/lib/python 3.7/site-packages/object _ detection/utils/label _ map _ util . py

克隆笔记本,按照说明设置虚拟环境,并安装所有依赖项。

局部测试张量流

一旦完成,我们很可能想要用测试数据循环本地视频,而不必实际连接现场摄像机。

这里我们真正需要做的是改变“while True”循环,以绑定到 OpenCV 会话。VideoCapture 方便地接受整数(对于网络摄像头)或视频文件的路径。

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

Some parts of the image were manually blurred for privacy — also, those are invited visitors 😊

一旦运行笔记本,您应该会看到检测模型的覆盖图。太好了,模型起作用了,我们可以稍后进行微调。

网络,网络!

如前所述,我们不会依赖我们的 Rasberry Pi 来运行检测—因此我们将建立一些网络通信。我本来想自己写这篇文章(我目前正在学习围棋,所以这将是一个很好的用例),但是如果有一个库,为什么还要这么麻烦呢?[1]

你需要什么:

下面是一篇关于我如何设置 Pi 的示例文章:

接下来,我们将不得不考虑 VidGear 的开发分支,因为在撰写本文时,主服务器上还没有某个 bugfix。

现在,我们可以在本地测试流式视频:

您应该会看到视频回放。您会注意到多处理库的一些用途——我们使用它来确保 while 循环在定义的超时后终止,以用于开发目的。

[1]玩笑暂且不提:SQLite 的创始人 Richard Hipp 在 Changelog 播客上的 采访中给出了很多很好的理由来解释为什么这可能是个坏主意——但是为了简单起见,我们将坚持使用库

把 2 和 2 放在一起

接下来,让我们将它部署到两台独立的机器上——只要执行 Tensorflow 的服务器运行 64 位版本的 Linux(Linux 内核),我们就可以开始了。在家里,我有一个本地的 gitlab 和 jenkins 实例为我做这件事。但是实际上,任何部署选项都是可行的——scp 可以成为您的朋友。

我们需要通过指定 IP 地址和端口对代码做一些小的调整:

client = NetGear(address = '192.168.1.xxx, port = '5454', protocol = 'tcp', pattern = 0, receive_mode = True, logging = True) server = NetGear(address='192.168.1.xxx, port='5454', protocol='tcp',pattern=0, receive_mode=False, logging=True)

现在,我们可以在服务器上启动 sender.py,在客户机上启动 receiver.py,这样我们就可以开始了:网络视频。整洁!

积分张量流

张量流的集成在这一点上是微不足道的:因为我们已经建立了如何做以下事情:

  • 使用 OpenCV 循环播放本地视频
  • 使用 Tensorflow 对象检测在本地视频上运行实际模型
  • 将视频从一台机器传输到另一台机器

最后一步可以简单地通过导入我们的 tensorflow_detector 模块来实现,将接收到的图像转换为一个 numpy 数组(因为这是 API 所期望的),并调用“run _ inference _ for _ single _ image(2)”。很简单!

对着摄像机说话

现在,我们可以调整我们的服务器代码,实际使用 Tensorflow 来检测来自不同机器的图像。但是我们不想要固定的图像——我们需要一个实时流。

幸运的是,这非常简单,因为我们已经在 Pi 的设置过程中启用了相机模块:将相机的带状电缆连接到 Pi,启动它,然后运行:

raspistill -o ~/image.jpg

这个应该拍张照。

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

为了用 Python 做同样的事情,OpenCV 的 API 同样简单:在 PI 端,通过将视频文件的来源改为摄像机的 ID(0,因为我们只有一个), OpenCV 将获取摄像机流并将其发送到我们的服务器。

一旦我们运行这个,我们应该会看到这样的内容:

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

触发摄像头上的音频

现在,我们能够将视频从树莓上传到服务器,并检测到一个人。现在缺少的环节是使用 GStreamer 的 playsound 库来播放音频。其他替代方法是使用 ossubprocess 调用或pygame——可以设置一个配置选项来改变这种行为。

(您可以使用“alsamixer”在 Pi 上设置音量)。

为此,我们将再次使用 ZMQ ,在 Pi 上启动一个监听器线程,等待来自服务器的输入,设置预定义的枚举值。一旦客户端收到这些信息,它就会触发一个音频信号并播放声音。

所有这些都阻塞了各自的线程,也就是说,只要音频播放,听众就不会关心新消息,服务器也无法发送新消息。

为了避免重复同样的信息,我们可以使用一个简单的 sempahore 结构。

测试一切

现在一切都正常了,有趣的部分来了:设置它。

首先,让我们把摄像机放在某个地方:

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

并启动服务器和客户端,看看当我们走进房间时会发生什么!

正如你所看到的,它需要一秒钟才能检测到我——部分原因是摄像机角度、我们选择的模型以及一些网络延迟。在现实生活中,一个人需要走进门,这不是一个问题。

“警告,你是…”的信息来自那个小喇叭!

后续步骤

虽然这已经工作得相当好了——它可以传输视频,检测人,并发送信号发送音频——但这里肯定还有工作要做。

然而,为了这个项目的目的,我们忽略了几件事:我们正在使用的模型仅仅是一个预先训练的模型,它既没有针对我们的特定用例进行调整,也不一定为我们正在使用的机器提供最佳平衡。

此外,代码中的一些内容可能需要一些改进——网络延迟还不错,但可能需要一些工作,音频被连续快速触发,并且使用我们当前的 ZeroMQ 模式,我们只能支持一个客户端。

虽然使用纸板盒几乎是完美的定义,但定制的 3D 打印覆盆子盒和稍好的冷却可能是一个好主意。

结论

无论如何,我对这个小项目很满意,因为它说明了构建自己的安全摄像头、将其连接到网络、运行对象检测并触发外部因素(在本例中为音频,但也可能是电话通知或其他东西)是多么简单,而无需使用任何公共云产品,从而节省住宅互联网的延迟和成本。

所有的开发都是在 PopOS 的领导下完成的!2019 System76 Gazelle 笔记本电脑上的 19.04 内核 5.5.1,12 个英特尔 i7–9750h v cores @ 2.6 GHz 和 16GB RAM以及 Raspian 10 上的 Raspberry Pi 4 4GB。

完整源代码可在GitHub上获得。

原载于 2019 年 12 月 9 日https://chollinger.comT22。

张量流——核心概念

原文:https://towardsdatascience.com/tensorflow-the-core-concepts-1776ea1732fa?source=collection_archive---------8-----------------------

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

[source: https://tensorflow.org]

和大多数机器学习库一样,TensorFlow 是“重概念轻代码”的。这种语法不难学。但是理解它的概念非常重要。

什么是张量?

根据维基百科,“张量是一种几何对象,它以多线性方式将几何向量、标量和其他张量映射到结果张量。因此,通常已经在基础物理和工程应用中使用的向量和标量本身被认为是最简单的张量。此外,来自提供几何向量的向量空间的对偶空间的向量也被包括为张量。在这种情况下,几何学主要是为了强调坐标系选择的独立性

别担心,没那么复杂。当处理一个有多个变量的问题时,将它们以向量或矩阵的形式集中在一起通常是很方便的,这样就更容易对它们进行线性运算。大多数机器学习都是基于这样的矩阵运算——将一组输入值一起处理,得到一组输出值。

例如,在贷款审批问题中,我们考虑该主题的几个参数(过去贷款的金额、归还贷款的时间等。)并用适当的权重将它们相加,得到一个称为信用评级的输出数字。这是使用简单的矩阵乘法实现的。

这种矩阵乘法只给出一种情况的结果。当我们想要用一百万个这样的案例的数据来训练一个神经网络时,我们不能一个接一个地把它们相乘。这就是张量的用途。张量是一种数据结构,表示矩阵或向量或标量的集合,允许我们同时对所有数据样本执行操作。这给了我们很大的性能提升。

张量不需要有数值。它可以是一个输入值,一个常数,一个变量,或者只是对一些其他张量的数学运算的引用。

张量可能是 3D(矩阵的集合)或 2D(向量的集合)或 1D(数的集合),甚至是 0D(单个数)。维度的数量并不构成张量——重要的是对多个实体同时操作的概念。

军阶

张量的维数叫做张量的秩。因此,我们有几个可能的等级。

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

常数张量

最简单的张量是一个常数。我们可以用显式值或使用为常用值定义的方法来定义。

注意,这并没有将常数值赋给张量。它只创建需要时可以评估的张量。

可变张量

常数允许我们创建可用于计算的预定义值。但是没有变量的计算是不完整的。训练一个神经网络需要能够代表要在该过程中学习的权重的变量。这些变量可以使用 tf.Variable 类生成。

每一个都产生一个可变张量。但是第三个和其他的略有不同。前两个张量可以训练。但是,第三个只是创建了不可改变的变量张量——就像常量一样。

做那样的事情有什么用?为什么不直接定义一个常数呢?对于 10x10 的张量,创建一个常数张量更有意义。但是当处理巨大的数据时,人们应该更喜欢变量。这是因为变量得到了更有效的管理。

占位符

常数张量和变量张量与任何编程语言中的常数和变量在直觉上是相似的。这不需要花时间去理解。占位符定义了将在代码运行前获得值的张量。从这个意义上说,占位符可以比作输入参数。

这将生成一个张量 x——保证在代码实际运行之前提供它的值。

懒惰执行

按照设计,TensorFlow 是基于延迟执行的(尽管我们可以强制急切执行)。这意味着,它实际上不处理可用的数据,直到它不得不这样做。它只是收集我们输入的所有信息。只有当我们最终要求它处理时,它才会处理。

这种懒惰(讽刺地)极大地提高了处理速度。要理解如何,我们需要理解 TensorFlow 的节点和图形。

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

Typical Dense Neural Network

这是神经网络的教科书观点。正如我们看到的,我们有几个输入 X1-Xn。这些构成了网络的第一层。第二层(隐藏层)是这些层与权重矩阵的点积,后面是 sigmoid 或 relu 之类的激活函数。

第三层只是一个值,它是作为其权重矩阵与第二层的输出的点积而获得的。

结节

对于 TensorFlow,这些单独的实体中的每一个都是一个节点。第一层有 n+1 个节点(n 个输入和 1 个常数)。第二层有 k+1 个节点,第三层有 1 个节点。这些节点中的每一个都由一个张量表示。

图表

我们可以看到一些节点有一个恒定值(如偏差 1)。其中一些具有可变值,如权重矩阵——我们从随机初始化开始,并在整个过程中对其进行调整。我们有一些节点,其值只是基于其他节点上的一些计算—这些是依赖节点—我们无法获得它们的值,直到我们有了先前节点的值。

在这个网络中,我们在中间层有 k 个节点,在最后一层有 1 个依赖于其他节点的节点,我们有 k+1 个依赖节点和 k 个需要调整的变量。

汇编

当我们创建单独的张量时,我们只是创建单独的节点并分配定义关系——这些关系还没有实现。定义完成后,我们启动 compile()方法,该方法标识连接节点的图。

这是整个过程中的重要一步。如果我们有循环依赖或任何其他可能破坏图表的原因,错误就在这一点上被识别出来。

会议

张量流计算总是在“会话”中执行。会话本质上是一个具有自己状态的环境。会话不是一个线程,但是如果我们有两个独立的计算需要一起运行——彼此不影响,我们可以使用会话。

这里,A 和 C 将在会话 1 下运行,并将看到一个环境,B 和 D 将在会话 2 中运行,并将看到另一个环境。

一旦我们定义了节点并编译了图形,我们最终可以运行命令来获取图形中特定节点的值。当我们这样做时,TensorFlow 会回头检查该请求节点所需的所有节点。只有那些节点会以适当的顺序进行评估。因此,图中的节点仅在需要时才被评估;只有在需要的时候。

这对处理速度影响很大,是 TensorFlow 的一大优势。

简单代码示例

为了理解 TensorFlow,理解常量、变量、占位符和会话的核心概念非常重要。现在让我们设计一个例子,它可以一次显示所有这些概念。

当然,我们从导入 TensorFlow 模块开始

现在,让我们定义几个张量。这里,t1 和 t2 是常数,t3 是占位符,t4 是变量。

这里,我们将 t1 定义为大小为 4x5 的常数张量,所有值都设置为 1。t2 是大小为 5x4 的常数张量,具有随机值。

t3 是一个维数为 0 的占位符,是一个浮点数 32。

与此同时,我们定义了一个 4x4 形状的变量 t4。初始值设定项被设置为 ones_initializer。这意味着,每当我们初始化变量时,它的值将被设置为 1。请注意,这只会在我们初始化变量时发生,而不是现在。

接下来,我们可以定义张量表达式

这段代码取 t1 和 t2 的点积,乘以标量 t3,然后加到 t4。其结果然后被分配给 t4。因此,每次执行该表达式时,t4 的值都会改变。注意 t3 是一个占位符,所以当我们想要处理这个表达式时,我们必须提供 t3 的值。

同样,这段代码只定义了表达式。它不会立即执行。

一切就绪后,我们现在可以开始会话,并开始与张量一起工作

在这里,我们实际上运行代码。我们从启动会话开始。我们必须初始化变量。到目前为止,t4 只是被声明,没有初始化。在这里,我们实际上初始化它。执行初始化代码。在这种情况下,恰好是“tf.ones_initializer”。因此,t4 从一个 4x4 张量开始,所有值都设置为 1。

接下来,我们运行表达式和 feed_dict。记住,表达式有一个占位符 t3。除非我们给它一个 t3 的值,否则它不会求值。这个值是通过 feed_dict 传递的。每次运行都会更新 t4,并为其分配一个新值。

上面的代码生成以下输出:

请注意,t4 在初始化之前没有值,只有当表达式在有效会话中运行时,它的值才会改变。可以对表达式求值三次,以断言输出与我们预期的一样。

张量流——软件工程的范围

原文:https://towardsdatascience.com/tensorflow-the-scope-of-software-engineering-ad7306560bb?source=collection_archive---------20-----------------------

如何像软件工程师一样构建你的张量流图

现在,您已经完成了对模型的训练,是时候了解一下它学到了什么。你决定哪个张量应该是有趣的,并在你的代码中去寻找它——找出它的名字。然后你突然想到——你忘了给它起个名字。您还忘记了用一个命名的作用域来包装逻辑代码块。这意味着你很难找到张量的参考。它适用于 python 脚本和 TensorBoard:

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

你能看到那个消失在张量海中的小红圈吗?找到它很难…

真令人失望!如果它看起来更像这样会好得多:

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

这还差不多!构成一个逻辑单元的每组张量都包含在一个命名的作用域内。

为什么图形不能以类似于你的代码的方式自动构建?我的意思是,大多数情况下,你没有使用单一函数来构建模型,是吗?您的代码库包含多个函数——每个函数都构成一个逻辑单元,它理应拥有自己的命名范围!

假设你有一个张量x,它是由函数f定义的,这个函数又被g调用。这意味着当你写代码的时候,你的头脑中有这样的逻辑结构:g->-f->-x。如果这个模型能够以张量名为g/f/x的方式自动构建,那不是很好吗?

仔细想想,这很容易做到。您所要做的就是检查所有的函数并添加一行代码:

def f():
    with tensorflow.name_scope(‘f’):
        # define tensors

那么这种方法有什么问题呢?

  1. 函数名f出现了两次——在函数声明中和作为tensorflow.name_scope的参数。也许下周你会把函数的名字改成更有意义的,比如说foo。不幸的是,您可能会忘记更新作用域的名称!
  2. 你必须对f的整个主体应用缩进。虽然没那么糟糕,但就我个人而言,我不喜欢高缩进级别。假设f包含一个 for 循环,该循环包含一个 if 语句,该语句包含另一个 for 循环。由于调用了tensorflow.name_scope,我们已经达到了缩进级别 4!

我们可以使用简单的元编程来绕过这些缺点——Python 的 decorators 来拯救我们!

import re def name_scope(f):
    def func(*args, **kwargs):
        name = f.__name__[re.search(r’[^_]’, f.__name__).start():]
        with tensorflow.name_scope(name):
            return f(*args, **kwargs)
    return func @name_scope
def foo():
    # define tensors

它是如何工作的?@是一个语法糖。它相当于以下内容:

def foo():
    # define tensors foo = name_scope(foo)

name_scope获取一个函数作为参数(f)并返回一个新函数(func)。func创建一个命名作用域,然后调用f

结果呢?由f定义的所有张量都将在一个命名的作用域内创建。作用域的名称将是原始函数的名称(“foo”)—多亏了f.__name__

一个小问题是,虽然函数名可能以“_”开头,但 tensorflow 作用域名不能。这就是我们必须使用re的原因。

为什么这么重要?

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

与实际使模型变得更好的研究挑战相比,编写干净的张量流代码的挑战可以忽略不计。

因此,很容易被诱惑去专注于你工作的研究方面。然而,从长远来看,重要的是不要忽视代码的可维护性和可读性,包括图形的可维护性和可读性。

装饰器方法使我的工作变得简单了一些,我希望您也能从中受益。你还有其他的建议想分享吗?在评论里掉一行!

最初由我发表于engineering.taboola.com

tensor flow vs py torch vs Keras for NLP—exx act

原文:https://towardsdatascience.com/tensorflow-vs-pytorch-vs-keras-for-nlp-exxact-8e51dd13c3f5?source=collection_archive---------9-----------------------

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

在开始 TensorFlow 与 PyTorch 和 Keras 的功能比较之前,让我们先了解一下它们之间的一些非竞争性的软差异。

非竞争事实:

下面我们将介绍 TensorFlow、PyTorch 和 Keras 之间的一些差异。这些不同之处并不是出于相互比较的目的,而是为了引入本文讨论的主题。

张量流

  • 由谷歌创建
  • 2017 年 2 月 1.0 版本

PyTorch

  • 由脸书创造
  • 2018 年 10 月 1.0 版本
  • 基于 Torch,另一个基于 Lua 的深度学习框架

克拉斯

  • 简化深度学习框架复杂性的高级 API
  • 运行在其他深度学习 API 之上——tensor flow、Theano 和 CNTK
  • 它本身不是一个图书馆

TensorFlow 与 PyTorch 和 Keras 的竞争差异:

现在,让我们来看看他们三人更具竞争力的事实。我们特别希望对侧重于自然语言处理的框架进行比较分析。

1.两者中可用的 rnn 类型

当寻找 NLP 问题的深度学习解决方案时,递归神经网络(RNNs)是开发人员最受欢迎的架构。因此,从这个角度比较框架是有意义的。

所有正在考虑的框架都有模块,允许我们创建简单 RNNs** 以及它们更进化的变体——门控循环单元( GRU )和长短期记忆( LSTM )网络。**

PyTorch:

PyTorch 为构建这种循环网络提供了两个级别的类:

  • 多层类— nn。新泽西州 RNN。GRU·安迪。LSTM
    这些类的对象能够表示深度双向递归神经网络。
  • 细胞水平类— nn。新罕布什尔州 RNNCell。格鲁塞尔和 nn。这些类的 LSTMCell
    对象只能代表一个单元格(同样,一个简单的 RNN 或 LSTM 或 GRU 单元格),可以处理一个时间步长的输入数据。

因此,当我们不想在神经网络中进行太多定制时,多层类就像是细胞级类的一个很好的包装器。

此外,在多层类中将双向参数设置为就可以实现 RNN 双向了!

查看我们的文章使用 PyTorch 框架开始使用 NLP——深入了解这些类的更多细节。

张量流:

TensorFlow 为我们提供了一个 tf.nn.rnn_cell 模块来帮助我们满足标准的 rnn 需求。

tf.nn.rnn_cell模块中一些最重要的类如下:

  • 单元级类,用于定义 RNN 的单个单元,即— BasicRNNCellGRUCell和 LSTMCell
  • ****MultiRNNCell 类用于堆叠各种单元格以创建深度 rnn
  • DropoutWrapper 类,用于实现退出正则化

查看我们的文章使用 TensorFlow 和 Keras 框架开始使用 NLP,深入了解这个模块的更多细节。

Keras:

Keras 是 Keras 库中提供的重现层。这些层包括:

  • SimpleRNN —全连接的 RNN,输出将反馈到输入
  • GRU —门控循环单元层
  • LSTM——长短期记忆层

查看我们的文章— 使用 TensorFlow 和 Keras 框架开始使用 NLP—深入了解这些类的更多细节。

因此,TensorFlow、PyTorch 和 Keras 三者都具有内置功能,允许我们创建流行的 RNN 架构。区别在于他们的界面。

Keras 有一个简单的接口和一个定义良好的参数列表,使得上面的类很容易实现。作为 TensorFlow 之上的高级 API,我们可以说 Keras 让 TensorFlow 变得简单。虽然 PyTorch 提供了与 TensorFlow 类似的灵活性,但它的界面要干净得多。

既然我们谈到了这个主题,让我们更深入地进行一项基于每个框架易用性的比较研究。

2.易于使用 TensorFlow vs PyTorch vs Keras

TensorFlow 经常因其不全面的 API 而受到指责。PyTorch 使用起来更加友好和简单。总的来说,PyTorch 框架与 Python 语言集成得更紧密,大多数时候感觉更原生。当你在 TensorFlow 中写作时,有时你会觉得你的模型在一堵砖墙后面,有几个小孔可以沟通。这就是为什么,克雷斯。
让我们根据它们的易用性,再讨论几个比较这三者的因素:

静态计算图与动态计算图:

这个因素在 NLP 中尤其重要。TensorFlow 使用静态图形进行计算,而 PyTorch 使用动态计算图形。

这意味着在 Tensorflow 中,在模型运行之前,您静态地定义计算图。与外界的所有通信都是通过 tf 进行的。会话对象和 tf。占位符是在运行时将被外部数据替换的张量。

在 PyTorch 中,事情更加命令化和动态化:您可以随时定义、更改和执行节点,没有特殊的会话接口或占位符。

在 RNNs 中,对于静态图形,输入序列长度将保持不变。这意味着,如果你为英语句子开发一个情感分析模型,你必须将句子长度固定到某个最大值,并用零填充所有较小的序列。不太方便吧?

调试:

由于 PyTorch 中的计算图是在运行时定义的,所以您可以使用我们最喜欢的 Python 调试工具,如 pdb、ipdb、PyCharm 调试器或旧的可信打印语句。【TensorFlow 却不是这样。您可以选择使用一个名为 tfdbg 的特殊工具,它允许在运行时计算张量流表达式,并浏览会话范围内的所有张量和操作。当然,你不能用它来调试任何 python 代码,所以有必要单独使用 pdb。

Tensorflow 比 PyTorch 更成熟。与 PyTorch 和 Keras 加起来相比,它有一个更大的社区。它的用户群增长速度比 PyTorch 和 Keras 都快。

所以这意味着-

  • 一个更大的 StackOverFlow 社区来帮助您解决问题
  • 更多的在线学习材料——博客、视频、课程等。
  • 更快地采用最新的深度学习技术

NLP 的未来:

虽然递归神经网络已经成为 NLP 任务的“首选”架构有一段时间了,但它可能不会永远这样。我们已经有了一个更新的基于注意力机制的变形金刚模型,在研究人员中很受欢迎。

它已经被誉为新的 NLP 标准,取代了递归神经网络。一些评论者认为, Transformer 将成为 2019 年的主导 NLP 深度学习架构。

查看我们全面的 3 部分教程,开始学习变形金刚。

Tensorflow 似乎在这场竞赛中遥遥领先:

  • 首先,基于注意力的架构是谷歌自己引入的。
  • 第二,只有 TensorFlow 有针对 Transformer 架构的稳定版本

这并不是说 PyTorch 远远落后,在 Huggingface 的https://github.com/huggingface/pytorch-transformers有许多预先训练好的变形金刚模型。

所以,这就是比较的全部。但是在分手之前,让我告诉你一些可能会在一年内使整个谈话过时的事情!

张量流 2.0

谷歌最近发布了 Tensorflow 2.0 ,这是一个游戏规则改变者!

方法如下:

  • 展望未来, Keras 将成为 TensorFlow 的高级 API,它经过扩展,因此您可以直接从 tf.keras 使用 TensorFlow 的所有高级功能。因此,TensorFlow 在各种规模和所有硬件下都非常简单。
  • 在 TensorFlow 2.0 中,急切执行现在是默认的。即使在 eager 上下文中,您也可以利用图形,这使得您的调试和原型制作变得容易,而 TensorFlow 运行时则在幕后处理性能和可伸缩性。
  • TensorBoard 与 Keras 整合,现在是… one -liner!

所以,我想这减轻了人们对张量流的所有抱怨。这意味着 TensorFlow 将巩固其作为所有深度学习任务的首选框架的地位,甚至比现在更好!

原载于 2019 年 8 月 6 日https://blog.exxactcorp.com**

特斯拉 5 级:自动驾驶

原文:https://towardsdatascience.com/tesla-level-5-autopilot-669f6ac6ee63?source=collection_archive---------17-----------------------

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

Future of Self Driving. Tesla, 2019, https://www.tesla.com/autopilot.

最近,埃隆·马斯克公开表示,到 2020 年,它将拥有 5 级自主能力。他进一步表示,所有特斯拉汽车都将能够充当机器人出租车,并将能够为车主创造高达 3 万美元的收入。马斯克声称,到 2020 年,特斯拉将拥有广泛的自动驾驶汽车网络。他声称,特斯拉可以在没有包括 Waymo 和 Cruise Automation 在内的所有主要竞争对手都采用的技术的情况下实现这一切。这包括激光雷达传感器(激光雷达)和超详细三维测绘。相反,特斯拉计划依靠其摄像头和传感器阵列收集足够的信息,让汽车自动驾驶。让特斯拉与众不同的是其新的全自动驾驶芯片的能力。

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

过去几年,特斯拉一直在与英伟达(NVIDIA)合作开发其汽车中的芯片。然而,最近特斯拉创造了一种新的芯片,它被称为全自动驾驶芯片。这块有 60 亿个晶体管的硅片应该比之前的 NVIDIA 芯片快 21 倍。此外,新芯片由三星制造。FSD 芯片每秒能够进行超过 36 万亿次运算,并将花费特斯拉最初支付费用的 80%。所有这一切只导致大约 25%的功率增加。此外,出于过度保护的目的,每个全自动驱动计算机板都具有冗余的额外芯片、电源和处理器。

特斯拉生产世界上最安全的车辆,它对自动驾驶技术的态度一直是积极的。在一个与人类相关的事故太常见的世界里,自动驾驶汽车上路将有助于减少每年的事故数量。像 Waymo、优步 ATG、Lyft Level 5 等公司都在致力于制造完全自动驾驶的车辆,但没有一家公司声称到 2020 年拥有 5 级自动驾驶。特斯拉最近的声明迫使其他公司重新评估他们的计划和他们正在使用的技术,以及它们是否真的有必要。然而,这个雄心勃勃的时间表被视为过于乐观和不可思议,特别是由于埃隆马斯克过去的说法。

自动驾驶技术是我们社会的必需品,因为它将减少每年与驾驶相关的死亡人数。这些公司中的一家能够越快地让他们的车辆达到第 5 级自主,就能拯救越多的生命。目前,在生产第 5 级自动驾驶汽车的竞赛中,似乎有两家领先者是 Waymo 和特斯拉。特斯拉相对于 Waymo 的优势在于,特斯拉制造整个车辆,而 Waymo 则设计为与其他车辆合作。

请随时在 mank2@illinois.edu联系我,或者在 https://www.linkedin.com/in/aman-kishore/的 LinkedIn 上联系我

[来源](https://www.cnet.com/roadshow/news/teslas-autonomy-investor-day-recap/ https://www.tesla.com/autopilot https://www.theverge.com/2019/4/22/18510828/tesla-elon-musk-autonomy-day-investor-comments-self-driving-cars-predictions https://www.forbes.com/sites/lanceeliot/2019/04/22/musk-unveils-audacious-vision-for-tesla-self-driving-tech-but-level-5-target-looks-unlikely/#164ed3204c78 https://www.theverge.com/2019/4/22/18511594/tesla-new-self-driving-chip-is-here-and-this-is-your-best-look-yet)

原载于 2019 年 6 月 5 日 https://medium.com

特斯拉的大规模深度学习:使用数十亿英里训练神经网络

原文:https://towardsdatascience.com/teslas-deep-learning-at-scale-7eed85b235d3?source=collection_archive---------2-----------------------

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

Photo by Chuttersnap.

特斯拉能做到而 Waymo 做不到的事情

训练数据是决定深度神经网络性能的基本因素之一。(另外两个是网络架构和优化算法。)作为一般原则,更多的训练数据导致更好的性能。这就是为什么我相信特斯拉,而不是 Waymo,拥有世界上最有前途的自动驾驶汽车计划。

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

Visualization of Tesla’s fleet. Image courtesy of Tesla.

大约有 50 万辆配备了特斯拉声称的完全自动驾驶硬件的车队在路上行驶,特斯拉的车队每天行驶的里程数大约为 1500 万英里,相当于 Waymo 车队成立以来行驶的里程数。每天 1500 万英里推算起来就是每年 54 亿英里,比 Waymo 预计的一年后的总里程数多 200 倍。特斯拉的车队也在以每周约 5000 辆的速度增长。

数据在三个关键领域发挥着重要作用:

  • 计算机视觉
  • 预言;预测;预告
  • 路径规划/驾驶策略

计算机视觉

一个重要的计算机视觉任务是目标检测。有些物体,比如马,只是很少出现在路上。每当特斯拉遇到神经网络认为可能是马的东西(或者可能只是一个未识别的物体阻挡了一段道路),相机就会拍摄快照,稍后会通过 wifi 上传。它有助于让车辆每年行驶数十亿英里,因为你可以找到许多稀有物品的例子。显而易见,随着时间的推移,特斯拉在识别稀有物体方面将比 Waymo 车辆更好。

对于常见的物体,Waymo 和特斯拉的瓶颈很可能是付钱给人来手动标记图像。很容易捕捉到比你付钱给人们去贴标签更多的图像。但对于稀有物体来说,Waymo 的瓶颈可能是首先收集图像,而特斯拉的瓶颈可能只是标记和开发软件,以便在正确的时间触发快照。这是一个更好的位置。

特斯拉的人工智能总监 Andrej Karpathy 在这个剪辑中解释了特斯拉如何获取图像来训练物体检测(摘自他在自治日的演讲):

预言;预测;预告

预测是提前几秒钟预测汽车、行人和骑自行车者的运动和行动的能力。安东尼·莱万多夫斯基(Anthony Levandowski)多年来一直是 Waymo 的顶级工程师之一,最近写道“没有人实现‘完全自主’的原因是因为今天的软件还不足以预测未来。”莱万多夫斯基声称自动驾驶汽车的主要失败是错误地预测附近汽车和行人的行为。

特斯拉大约 500,000 辆汽车的车队是一个极好的资源。每当特斯拉对汽车或行人做出不正确的预测时,特斯拉都可以保存数据快照,以便稍后上传并添加到特斯拉的训练集中。特斯拉可能能够上传由其计算机视觉神经网络产生的场景的抽象表示(其中物体被可视化为彩色编码的长方体形状,像素级信息被丢弃),而不是上传视频。这将从根本上降低上传这些数据的带宽和存储需求。

尽管用于训练对象检测的图像需要人类标记,但预测神经网络可以仅从事件的时间序列中学习过去和未来之间的相关性。什么行为先于什么行为是任何记录(视频或摘要)中固有的。安德烈·卡帕西在下面的视频中解释了这个过程:

由于不需要人类来标记数据,特斯拉可以根据它可以收集的尽可能多的有用数据来训练它的神经网络。这意味着其训练数据集的大小将与其总里程数相关。与物体检测一样,与 Waymo 相比的优势不仅仅是有更多的数据来预测常见行为,而是能够收集在罕见情况下看到的罕见行为的数据,以便预测这些行为。

路径规划/驾驶策略

路径规划和驾驶政策指的是汽车采取的行动:在限速车道上保持居中、变道、超车、在绿灯时左转、绕过一辆停着的汽车、停下来等。似乎很难指定一套规则来涵盖汽车在任何情况下可能需要采取的所有行动。解决这一棘手难题的一种方法是让神经网络模仿人类的行为。这被称为模仿学习(有时也被称为学徒学习,或从示范中学习)。

训练过程类似于神经网络如何通过绘制过去和未来之间的相关性来学习预测其他道路使用者的行为。在模仿学习中,神经网络通过绘制它所看到的(通过计算机视觉神经网络)和人类驾驶员采取的行动之间的相关性,来学习预测人类驾驶员会做什么。

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

Still frame from Tesla’s autonomous driving demo. Courtesy of Tesla.

模仿学习最近取得了可以说是迄今为止最大的成功:AlphaStar。DeepMind 使用数百万人玩的星际争霸游戏数据库中的例子来训练神经网络像人类一样玩游戏。该网络了解了游戏状态和人类玩家行为之间的相关性,从而学会了预测人类在面对游戏状态时会做什么。仅通过这种训练,AlphaStar 就达到了 DeepMind 估计将使其在星际争霸的竞争排名中大致处于中间的能力水平。(后来,AlphaStar 使用强化学习进行了增强,这使它能够提升到专业水平的能力。自动驾驶汽车可能会也可能不会有类似的增强——这是另一个话题。)

特斯拉正在将模仿学习应用于驾驶任务,例如如何处理高速公路三叶草的陡峭曲线,或者如何在十字路口左转。听起来特斯拉计划随着时间的推移将模仿学习扩展到更多的任务,比如如何以及何时在高速公路上变道。卡帕西在这个片段中描述了特斯拉如何使用模仿学习:

与预测一样,上传汽车周围场景的抽象表示可能就足够了,而不是上传视频。这意味着更低的带宽和存储需求。

与预测一样,一旦数据上传,就不需要人为标记。由于神经网络正在预测人类驾驶员在给定世界状态的情况下会做什么,所以它需要的只是世界状态和驾驶员的行动。本质上,模仿学习是预测特斯拉司机的行为,而不是预测特斯拉周围其他道路使用者的行为。与 AlphaStar 一样,所有需要的信息都包含在所发生事情的回放中。

基于 Karpathy 关于预测超车的评论,当特斯拉未能正确预测前方车辆是否会切入特斯拉的车道时,它可以触发汽车保存重播。同样,当参与路径规划或驾驶政策的神经网络未能正确预测特斯拉驾驶员的行动时,特斯拉可能会捕捉到重播数据。埃隆·马斯克(Elon Musk)过去曾提到过这一功能(或类似的功能),尽管尚不清楚它目前是否在特斯拉汽车上运行。

相反,当特斯拉处于自动驾驶或即将到来的城市半自动驾驶模式时,人类司机就会接管。这可能是一个丰富的例子,其中系统做了一些错误的事情,然后人类驾驶员立即演示如何正确地做。

其他捕捉有趣回放的方法包括:突然刹车或转向,自动紧急刹车,撞车或碰撞警告,以及机器学习中更复杂的技术,称为异常检测和新奇检测。(这些相同的条件也可以用于触发用于预测的重放捕获或用于对象检测的相机快照。)如果特斯拉已经知道它想要捕捉什么,比如十字路口的左转,它就可以设置一个触发器,每当视觉神经网络看到交通灯并激活左转信号时,或者方向盘左转时,就捕捉回放。

结论

由于拥有大约 50 万辆汽车,特斯拉在三个关键领域比 Waymo(和其他竞争对手)更具优势:

  • 计算机视觉
  • 预言;预测;预告
  • 路径规划/驾驶策略

对收集正确数据的担忧,付钱给人们去贴标签,或者为带宽和存储付费,都不能排除这些优势。通过设计好的触发器,使用不需要人为标记的数据,以及使用抽象的表示(重放)而不是原始视频,可以解决这些问题。

商业分析师、记者和普通公众的大多数观点似乎是,Waymo 在自动驾驶方面遥遥领先,而特斯拉并没有接近。当你看神经网络的第一原理时,这种观点是没有意义的。

更重要的是,AlphaStar 是针对复杂任务的大规模模仿学习的概念证明。如果你怀疑特斯拉的方法是正确的,或者路径规划/驾驶政策是一个容易处理的问题,你必须解释为什么模仿学习对星际争霸有效,但对驾驶无效。

我预测,除非 Waymo 采取激进措施扩大其车队规模,否则在未来 1-3 年内,Waymo 遥遥领先、特斯拉远远落后的观点将被广泛抛弃。人们一直过于关注演示,这些演示没有告诉我们系统的健壮性、深度受限的脱离度指标,以及谷歌/Waymo 对顶级机器学习工程师和研究人员的访问。他们对训练数据的关注太少,特别是对于罕见的物体和行为,Waymo 没有足够的数据来做好机器学习,或者根本没有。

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

Tesla’s driving simulation. Image courtesy of Tesla.

模拟并不是 Waymo 的优势,因为特斯拉(像所有自动驾驶汽车公司一样)也使用模拟。更重要的是,模拟不能产生罕见的对象和罕见的行为,因为模拟的创建者不能预测或不知道如何准确地建模。

纯粹的强化学习对 AlphaStar 不起作用,因为星际争霸的行动空间太大,随机探索无法找到好的策略。所以,DeepMind 不得不用模仿学习来引导。这显示了一个假设的弱点,即与 AlphaGo Zero 一样,纯模拟体验将解决任何问题。特别是当涉及到像驾驶这样的问题时,预测人类的行为是一个关键的组成部分。预测人类行为需要真实世界的经验信息。

自动驾驶汽车领域的观察人士可能低估了特斯拉吸引顶级机器学习人才的能力。一项对科技工作者的调查发现,特斯拉是湾区第二受欢迎的公司,仅次于谷歌。它还发现特斯拉是全球第四大最受欢迎的公司,比排名第二的谷歌落后两个等级。(Shopify 在全球排名第三,SpaceX 排名第一。)还值得注意的是,机器学习的基本进展通常由学术界、OpenAI 以及谷歌、脸书和 DeepMind 的企业实验室公开分享。特斯拉能做的和 Waymo 能做的差别可能没那么大。

这两家公司最大的区别在于数据。随着特斯拉的车队增长到 100 万辆,其每月里程数将约为 10 亿英里,比 Waymo 每月约 100 万英里的里程数多 1000 倍。这 1000 倍的差异对特斯拉来说意味着对罕见物体的卓越检测,对罕见行为的卓越预测,以及对罕见情况的卓越路径规划/驾驶政策。自动驾驶的挑战更多的是处理包含罕见边缘情况的 0.001%的里程,而不是 99.999%的里程。所以,按理说,能从这 0.001%的里程中收集到大量训练样本的公司,会比不能的公司做得更好。

SAS 中的统计显著性检验

原文:https://towardsdatascience.com/test-of-statistical-significance-in-sas-7c2372b19438?source=collection_archive---------12-----------------------

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

许多材料可用于统计显著性检验。这个博客为你提供了为什么、什么、何时以及如何使用统计测试的简短想法?。此外,这篇博文试图快速修订这些统计测试的用法。p 值和假设没有在这个博客中讨论,你可以在这里查看。

为什么我们需要很多统计测试?

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

例如,我们想测量球的重量。我们有四种测量设备可供选择,如天平、温度计、尺子和容量瓶。我们选择哪一个?显然,我们选择身体平衡。不是吗?假设我们想测量球的温度。然后我们选择温度计。对于体积,我们选择容量瓶。

现在,您可以看到,随着我们要测量的变量发生变化,器件也会发生变化。同样的,为什么我们有这么多的统计测试?我们有不同类型的变量和分析。随着分析类型的改变,统计检验也随之改变。

让我们再举一个例子,假设老师想比较班上男生和女生的身高。

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

于是老师产生了无效的替代假设。这里,

零假设(H0) →男孩和女孩的身高相似,身高之间的任何差异都是偶然的。

**(H1)**→男孩的身高高于女孩的身高,所以观察到的身高差异是真实的。

如何验证这个假设?为此,统计显著性检验发挥了作用。

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

什么是统计显著性检验?

这些测试有助于研究人员或分析师确认假设。换句话说,这些测试有助于假设是否正确?

有很多统计测试。但是,我们将在这个博客中看到两种类型。

统计显著性检验分为两种类型。

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

下一个问题,什么时候用?

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

选择统计测试

参数和非参数都有不同类型的测试(不同类型的参数测试将在下面介绍),但是分析师或研究者如何根据研究设计、变量类型和分布选择正确的测试呢?

下面的图表总结了在选择正确的测试之前需要回答的问题。参考:明尼苏达大学。这里可以查

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

什么是参数测试?

如果关于总体的信息通过其参数完全已知,则使用该方法,然后统计检验被称为参数检验。

参数测试的类型

1) t 检验

一个样本的 t 检验

t 检验比较不同组的两个平均值之间的差异,以确定该差异是否具有统计显著性

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

让我们以 hbs2 数据集为例。该数据集包含来自高中生样本的 200 个观察值。它有性别,社会经济地位,种族背景,学科分数,如阅读,写作,数学,社会研究。

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

在这里,我想测试一下写作平均分是否与 50 分有显著差异。

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

这里,p 值小于 0.05。因此,这个学生样本的变量 write 的平均值是 52.77,这与测试值 50 有显著的统计学差异。我们可以得出结论,这组学生在写作测试中的平均分明显高于 50 分。

两个样本的 t 检验

当两个独立的随机样本来自方差未知或相同的正态总体时使用。它分为两种类型

  1. 独立双样本 T 检验:

当您想要比较两个独立组的正态分布区间因变量的平均值时,可以使用独立样本 t 检验。换句话说,t 检验是为了比较两组之间相同变量的平均值。

在这里,我们想测试男性和女性的写作意义是否相同。(女性是具有 0 和 1 的变量(0 ->男性,1 ->女性)。该变量是进行独立组 t 检验所必需的,由语句指定。

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

在我们的数据集中,我们比较了女学生组和男学生组的平均写作分数(在上面的代码中作为一个类提到,女性是一个变量(0 ->男性,1 ->女性)。这给出了两个可能不同的 t 统计量和两个不同的 p 值。p 值的解释与其他 t 检验相同。

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

从上面的方差等式中,p 值为 0.0187,小于 0.05,我们得出方差显著不同的结论。上述结果表明,男性和女性的平均写作成绩之间存在统计学上的显著差异(t = -3.73,p = .0003)。换句话说,从统计数据来看,女性的写作平均分(54.991)明显高于男性(50.121)。

2。配对双样本 t 检验

当您有两个相关的观察值(即,每个受试者有两个观察值)并且您想要查看这两个正态分布区间变量的平均值是否彼此不同时,可以使用该方法。

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

检查写作和阅读

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

p 值大于 0.05。上述结果表明,阅读的平均水平与写作的平均水平在统计上没有显著差异。

2) Z 检验

z 检验是一种应用正态分布的统计检验,主要用于处理频率大于或等于 30 的大样本问题。当总体标准差已知时使用。如果样本量小于 30,则 t 检验适用。

在 SAS proc 中,t-test 会考虑样本大小并相应地给出结果。SAS 中没有 z 测试的独立代码。

3)方差分析(ANOVA)

它是一组统计模型的集合,用于分析组均值或方差之间的差异。

单因素方差分析

当您有一个分类自变量(有两个或多个分类)和一个正态分布区间因变量,并且您希望测试因变量按自变量水平分解的均值差异时,可以使用单向方差分析(ANOVA)。

在 SAS 中使用 PROC ANOVA 完成

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

这里,我们将测试三种程序类型( prog )的的含义是否不同。Prog 是一个类别变量。

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

因变量(写作)的平均值在不同的课程类型中有显著差异。然而,我们不知道这种差异是只存在于两个级别之间,还是存在于所有三个级别之间。我们还可以看到,学术项目(prog 2 水平->学术项目)的学生平均写作成绩最高,而职业项目的学生最低。(计划 1 的水平->职业)

双向方差分析

双向方差分析是一种有一个数字结果变量和两个分类解释变量的研究设计。

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

这里写为因变量,女性和社会经济地位(ses)为自变量。我们想检查女性和社会经济地位之间的书写差异。

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

这些结果表明,总体模型具有统计学意义(F = 8.39,p = 0.0001)。变量女性ses 具有统计学意义(分别为 F = 14.55,p = 0.0002 和 F = 5.31,p = 0.0057)。

4)皮尔逊相关系数®

当您想要查看两个(或多个)正态分布区间变量之间的线性关系时,相关性非常有用。

我们可以在数据集中运行两个连续变量读和写之间的关联

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

我们可以看到的相关性为 0.59678。通过对相关性求平方,然后乘以 100,我们可以找出共有可变性的百分比。让我们将 0.59678 四舍五入为 0.6,其平方为 0.36,乘以 100 为 36%。因此读股约有 36%的可变性与写股相同。

我将在下一篇文章中解释非参数测试。

请继续学习,并关注更多内容!

参考:

  1. https://stats.idre.ucla.edu/sas/

测试时间增加(TTA)以及如何使用 Keras 进行测试

原文:https://towardsdatascience.com/test-time-augmentation-tta-and-how-to-perform-it-with-keras-4ac19b67fb4d?source=collection_archive---------13-----------------------

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

这里有很多方法可以通过改变我们训练神经网络的方式来改善它的结果。特别是,数据扩充是一种常见的做法,用于虚拟增加训练数据集的大小,也用作一种正则化技术,使模型对输入数据的微小变化更加稳健。

数据扩充是对输入数据随机应用一些操作(旋转、缩放、移动、翻转等)的过程。通过这种方式,模型永远不会显示两次完全相同的示例,并且必须学习他必须识别的类的更多一般特征。

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

Example of Data Augmentation on the CIFAR10 dataset

然而,也有一些方法可以通过改变我们测试它的方式来改善模型的结果,这就是测试时间增加 (TTA)发挥作用的地方…

什么是测试时间增加?

类似于数据扩充对训练集所做的,测试时间扩充的目的是对测试图像执行随机修改。因此,我们将多次显示增强图像,而不是只向训练模型显示一次常规的“干净”图像。然后,我们将平均每个相应图像的预测,并把它作为我们的最终猜测。

但是所有这些都将通过一个例子变得更加清晰。让我们以一个在 CIFAR10 上训练的神经网络为例,它呈现了以下测试图像:

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

The test image (a boat)

下面是模型的预测,表示为给定图像属于可能类别的置信度(最高分数对应于预测的标签):

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

这是这张图片的真实标签:

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

我们可以看到,模型在输出一个错误的答案,因为他最有信心图像属于第二类(对应汽车),但正确答案是第九类(对应船)。

如果我们增加测试时间,会发生什么?我们将呈现同一图像的 5 个稍微修改的版本,并要求网络预测它们中每一个的类别。

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

Modified version of the test image

以下是相应的预测:

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

Prediction 1

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

Prediction 2

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

Prediction 3

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

Prediction 4

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

Prediction 5

如您所见,只有预测 1 和预测 4 是正确的,并具有合理的可信度。2 只在很小的范围内是正确的,而 3 和 5 是不正确的。如果我们取这 5 个结果的平均值,会发生什么?

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

Average of the 5 predictions

现在我们可以看到,均值给出了正确的答案,具有合理的置信度。因此,我们现在有了一个正确的答案,而不是有一个错误的答案,就像原始测试图像的情况一样。

这种方法有效的原因是,通过对随机修改的图像平均我们的预测,我们也平均了误差。在单个向量中,误差可能很大,导致错误的答案,但是平均起来,只有正确的答案会突出。

测试时间增加对于模型非常不确定的测试图像特别有用。即使这 5 张图片看起来与你非常相似,但从模型的预测来看,它们是非常不同的。

如何搭配 Keras 使用?

测试时间增加可以很容易地与 Keras 一起使用,尽管在文档中没有明确提到。

第一步是创建一个真正简单的卷积神经网络,我们将在 CIFAR10 上对其进行训练以进行演示:

然后,我们可以通过使用 ImageDataGenerator: 来定义我们想要在训练图像上执行的增强

我们现在可以为几个时期训练网络:

验证图像上模型的最终精度为:

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

为了增加测试时间,我们可以重用用于训练的同一数据生成器,并将其应用于验证图像。

然后,我们可以向模型显示 10 次(例如)随机修改的图像,获得每次的预测,并取平均值:

现在我们得到的精度是:

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

最终精度提高了超过 3% ,没有对模型做任何改动!

更多的数据扩充并不总是更好

虽然数据扩充是获得更好结果的非常有效的技术,但是必须明智地使用它。如果使用不当,它会损害模型的准确性。我会告诉你为什么会这样:

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

Bad data augmentation on MNIST

你能猜出每张图片中的数字吗?

给你个提示,图中没有 6…

你想做什么样的增强取决于你拥有的数据!在 MNIST 的例子中,你当然不希望进行随机翻转或太大的旋转,因为它们会完全改变图像的内容,6 可以翻转成 9,反之亦然,这使得你的模型很难学会区分这些类别。

然而,在像 CIFAR10 这样的数据库中,你完全想做水平翻转,因为它们不会改变图像,向右看或向左看的马仍然是马。但是在这里,垂直翻转也没有意义,因为您不太可能希望您的模型识别出一艘颠倒的船。

在某些情况下,如卫星成像或作物栽培图像,颠倒的图像不会改变它们的含义,您可以使用大旋转和垂直翻转作为数据扩充。

总之,只要你明智地使用,数据扩充既可以用于在训练时提升你的模型的结果,也可以用于测试时。

不要犹豫,试试 ImageDataGenerator 参数,看看它如何影响您的结果!

我希望这篇文章对新的深度学习实践者来说是清晰和有用的,并且它让你对什么是测试时间增加有了很好的了解!如果有不清楚的地方,请随时给我反馈或问我问题。

代码可从以下网址获得:

[## 纳坦胡本斯/TTA-喀拉斯

在 GitHub 上创建一个帐户,为纳坦胡本斯/TTA-喀拉斯的发展做出贡献。

github.com](https://github.com/nathanhubens/TTA-Keras)

使用偏度和峰度检验正态性

原文:https://towardsdatascience.com/testing-for-normality-using-skewness-and-kurtosis-afd61be860?source=collection_archive---------1-----------------------

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

PDF of the Normal distribution (Source: Wikimedia Commons under CC0)

…以及使用综合 K 平方Jarque–Bera 正态性测试的分步指南

我们将讨论以下 4 个主题:

  1. 什么是常态,为什么要关心常态?
  2. 什么是偏度峰度以及如何使用它们来测试正态性?
  3. 如何使用两种非常常用的正态性检验,即基于偏度和峰度的综合 K 平方检验Jarque–Bera 检验
  4. 如何将这些测试应用于真实世界的数据集,以决定OrdinaryLeastSquares 回归是否是该数据集的合适模型。

快速提示

要直接进入显示如何测试正态性的 Python 代码,向下滚动到名为 Example 的部分。

文章中使用的数据集可以从这个链接下载。

什么是常态?

正态性意味着你的数据遵循正态分布。具体来说,中的每一个值 y_i 都是某个正态分布随机变量 N( _iσ_i) 的“实现”,如下:

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

A normally distributed response variable Y (Image by Author*)*

线性回归背景下的正态性

在建立线性回归模型时,假设 Y 依赖于回归变量的矩阵这使得 Y*【X .上有条件正常如果**X =【X _ 1,x_2,…,X _ n】*联合

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

In linear regression, Y is conditionally normally distributed on the rmatrix of regressors X

为什么要测试常态?

一些统计技术和模型假设基础数据是正态分布的。

我将给出以下三种常态抬头的情况:

  • 如上图所示,在OdLS 方( OLS )回归中, Y有条件的正常对回归变量X:Y是正常的,如果X =【x_1,X _ 1 但是,即使 Y 不是正态分布,你的 OLS 模型也不会发生任何不好的事情。******
  • 经典线性回归模型的一个不太严格的要求是,回归的残差''应该是期望值为零的正态分布*,即 e(【ϵ)= 0。* 如果残差ϵ为正态分布,则无法使用 t 分布可靠地计算模型预测的置信区间,尤其是对于小样本量(n ≤ 20)。****

请记住,即使误差不是正态分布的,只要 E(ϵ)=0 满足 OLSR 的所有其他要求,OLS 估计量仍然是模型的蓝色估计量,即线性估计量。

  • 最后,某些拟合优度技术,如用于回归分析的 F 检验假设竞争回归模型的残差都是正态分布的。如果残差不是正态分布,f 检验不能可靠地用于比较两个竞争回归模型的拟合优度。

如何判断我的数据是否(不是)正态分布?

有几个统计测试可以用来测试你的数据偏离正态的程度,以及偏离是否有统计学意义

在本文中,我们将查看基于矩的度量,即偏度峰度,以及基于这些度量的显著性统计测试,即综合 KJarque — Bera

什么是“偏斜度”以及如何使用?

偏斜度允许您测试分布的总体形状与正态分布形状的偏离程度。

下图说明了偏态分布。

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

Positive and negative skewness (Source: Wikimedia Commons under CC BY-SA 3.0)

基于矩的偏斜度定义如下:

偏斜度被定义为概率分布的随机变量的第三个标准化中心矩。

人口的偏度公式如下所示:

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

Formula for population skewness (Image by Author)**

偏度有以下性质:

  • 偏度是一个基于 的度量(具体来说是三阶矩),因为它使用的是一个随机变量的三次方的期望值。****
  • 偏斜度是一个中心矩,因为随机变量的值是通过从平均值中减去它而被集中的
  • 偏斜度是一个标准化的矩,因为它的值是通过除以标准差的(的幂)而标准化的**。******
  • 因为是三阶矩,围绕平均值完全对称的概率分布将具有零偏斜度。这是因为,对于每个大于平均值的 y_i ,将有一个相应的 y_i 比平均值小相同的量。由于分布围绕平均值对称,两个 y_i 值将具有相同的概率。所以成对的 (y_i- ) 将相互抵消,总偏斜度为零。
  • 正态分布的偏斜度为零。
  • 虽然对称分布将具有零偏斜度,但是具有零偏斜度的分布不一定是对称的。
  • 基于特定比率的分布 —最著名的柯西分布具有未定义的偏斜度,因为它们具有未定义的均值。

实际上,我们可以通过计算样本的偏度来估计总体的偏度。对于样本,我们假设随机变量是均匀分布的,因此样本中每个 y_i 的概率是 1/n,第三个,中心的样本矩变成所有(y_i —y_bar)的简单求和的 1/n 倍。

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

Formula for sample skewness (Image by Author)**

偏斜度对概率分布的参数非常敏感。

下图说明了事件率参数λ的不同值的 泊松分布P 概率 M ass F 函数的偏斜度:

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

Skewness of the Poisson(λ) distribution for various event rates (λ) (Image by Author)**

****对于大事件率,泊松 PMF 的偏斜度为什么会降低?对于较大的λ值,泊松分布的 PMF 接近正态分布的 PMF,均值和方差= λ。即泊松(λ) → N(λ,λ),为λ → ∞。因此,上图中所见绝非巧合。

当λ → ∞,泊松分布的偏斜度趋于正态分布的偏斜度,即 0。

还有其他偏斜度的度量,例如:

  • 模式偏斜度
  • 中位数的偏斜度
  • 根据四分位值计算的偏斜度
  • …还有一些其他的。

什么是峰度,如何使用它?

峰度是一种度量标准,用来衡量分布的尾部与正态分布的尾部相比有多不同。偏度侧重于整体形状,峰度侧重于尾部形状。

峰度定义如下:

峰度是概率分布的随机变量的第四个标准化中心矩。

峰度的公式如下:

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

Formula for population Kurtosis (Image by Author)**

峰度有以下性质:

  • 就像偏度一样,峰度是基于矩的度量它是一个中心的标准化矩
  • 因为是第四矩,峰度总是正的
  • 峰度对尾部偏离正态性很敏感。由于 4 次幂,上式中集中值 (y_i- ) 的较小值被大大削弱。换句话说,位于分布中心附近的 Y 值不被强调。相反, (y_i- ) 的较大值,即位于分布的两个尾部的值,由 4 次方大大强调。这个性质使得峰度在很大程度上不知道位于分布中心的值,并且使得峰度对位于分布尾部的值敏感。
  • 正态分布的峰度为 3.0 。在测量偏离正态性时,峰度有时表示为过度峰度,即峰度减去 3.0 后的余额。****

对于一个样本,过度峰度是通过将第四中心样本矩除以样本标准差的四次方,然后减去 3.0 来估计的,如下所示:**

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

Formula for sample excess Kurtosis (Image by Author)**

这里有一张来自维基共享的优秀图片,展示了各种分布的过度峰度。我在图像的左上方叠加了一个放大版的尾巴:

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

Excess Kurtosis of various distributions (Source: Wikimedia Commons under CC0)

基于偏度和峰度的正态性检验

虽然偏度和峰度量化了偏离正态性的量,人们可能想知道这种偏离在统计上是否显著。下面两个测试让我们做到了这一点:

  • 综合 K 平方检验
  • Jarque–Bera 测试

在这两个测试中,我们从以下假设开始:

  • 零假设( H_0):数据正态分布。****
  • 交替假设 (H_1):数据不是正态分布,换句话说,由检验统计量测量的偏离正态性在统计上是显著的。****

综合 K 平方正态性检验

综合检验将偏斜度和峰度的随机变量组合成一个单一的检验统计量,如下所示:

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

Formula for the Omnibus K-squared test statistic (Image by Author)**

检验统计量的概率分布: 在上述公式中,函数 Z1()Z2() 意在使随机变量 g1g2 近似正态分布。这又使得它们的平方和近似为卡方(2) 分布从而使得综合 K 平方的统计量近似为卡方(2) 分布** 假设零假设为真,即数据是正态分布的。****

jar que–Bera 正态性检验

该测试的测试统计如下:

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

Formula for the Jarque-Bera test statistic (Image by Author)**

检验统计量的概率分布: 检验统计量是各自近似正态分布的随机变量 g1g2 的缩放平方和,从而使得 JB 检验统计量近似为卡方(2)分布,假设原假设为真。

例子

我们将使用来自美国劳工统计局的以下数据集来说明正态性检验的应用:

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

Source: Wages and salaries (series id: CXU900000LB1203M). U.S. Bureau of Labor Statistics (Image by Author)**

以下是数据集的前几行:

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

(Image by Author*)*

你可以从这个链接下载数据。

让我们用下面的 OLS 回归模型来拟合这个数据集:

工资=β_ 0+β_ 1年份**+ϵ***

其中:

是因变量 是回归变量
β_0
是回归的截距, β_ 1是回归系数,

我们将使用 Python 库 pandasstatsmodels 来读取数据,并为这些数据构建和训练我们的 OLS 模型。

让我们从导入所需的包开始:

****import** pandas **as** pd**import** statsmodels.formula.api **as** smf**import** statsmodels.stats.api as sms**from** statsmodels.compat **import** lzip**import** matplotlib.pyplot **as** plt**from** statsmodels.graphics.tsaplots **import** plot_acf**

将数据读入熊猫数据框:

**df = pd.read_csv(**'wages_and_salaries_1984_2019_us_bls_CXU900000LB1203M.csv'**, header=0)**

剧情工资对比年份😗***

**fig = plt.figure()plt.xlabel('Year')plt.ylabel('Wages and Salaries (USD)')fig.suptitle('Wages and Salaries before taxes. All US workers')wages, = plt.plot(df['Year'], df['Wages'], 'go-', label='Wages and Salaries')plt.legend(handles=[wages])plt.show()**

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

Source: Wages and salaries (series id: CXU900000LB1203M). U.S. Bureau of Labor Statistics (Image by Author)**

patsy 语法创建回归表达式。在下面的表达式中,我们告诉 statsmodels工资是响应变量,而是回归变量。statsmodels 会自动将截距添加到回归方程中。****

**expr = 'Wages ~ Year'**

通过传递模型表达式来配置 OLS 回归模型,并在数据集上训练模型,所有这些都在一个步骤中完成:

**olsr_results = smf.ols(expr, df).fit()**

打印模型摘要:

**print(olsr_results.summary())**

在下面的输出中,我指出了我们的 OLS 模型对数据适用性的吉兆和凶兆区域:

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

Summary of OLS regression model (Image by Author)**

解释结果

以下是从结果中需要注意的一些事情:

  • 残差是正偏斜的,偏斜度为 0.268,并且它们还具有 2.312 的过度正峰度,即较厚的尾部。
  • 综合测试和 JB 测试都产生了测试统计值(分别为 1.219 和 1.109),它们位于卡方(2) PDF 的 H_0 接受区内(见下图)。因此我们将接受假设 h0,即残差是正态分布的。

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

Acceptance and rejection zones for the Null hypothesis in the Chi-squared(2) PDF for two-tailed α=0.05 (Image by Author)**

  • 您还可以获得偏度值、过度峰度值以及综合测试和 JB 测试的测试统计值,如下所示:
**name = ['Omnibus K-squared test', 'Chi-squared(2) p-value']#Pass the residual errors of the regression into the test
test = sms.**omni_normtest**(olsr_results.resid)lzip(name, test)#Prints out the following:
> [('**Omnibus K-squared test**', 1.2194658631806088), ('**Chi-squared(2) p-value**', 0.5434960003061313)]name = ['Jarque-Bera test', 'Chi-squared(2) p-value', 'Skewness', 'Kurtosis']test = sms.**jarque_bera**(olsr_results.resid)lzip(name, test)#Prints out the following:
[('**Jarque-Bera test**', 1.109353094606092), ('**Chi-squared(2) p-value**', 0.5742579764509973), ('**Skewness**', 0.26780140709870015), ('**Kurtosis**', 2.3116476989966737)]**
  • 由于残差似乎呈正态分布,我们也可以相信模型报告的两个模型参数的 95%置信水平。
  • 我们也可以相信 f 检验的 p 值。它非常小,表明这两个模型参数也共同显著。**
  • 最后,模型报告的 R 平方相当高,表明模型与数据拟合得很好。

****现在是坏的部分:Durbin-Watson 测试和残差的条件数都表明残差是自相关的,特别是在滞后 1 时。

我们可以通过残差的 ACF 图轻松确认这一点:

**plot_acf(olsr_results.resid, title='ACF of residual errors')plt.show()**

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

ACF plot of residual errors (Image by Author)**

这给我们提出了一个问题:经典线性回归模型的一个基本要求是残差不应该是自相关的。在这种情况下,他们肯定是如此。这意味着 OLS 估计器可能低估了训练数据中的方差,这又意味着它的预测将偏离很大一部分。

简单地说,OLS 估计器不再是模型的 T2 蓝色估计器。真扫兴。

残差的自相关指出了一种可能性,即我们的模型被错误地选择或错误地配置。特别是,**

  • 我们可能遗漏了一些关键的解释变量,导致一些信号以自相关的形式泄漏到残差中,或者,
  • 对这个数据集来说,选择 OLS 模型本身可能是完全错误的。我们可能需要寻找替代模型。

在这种情况下,您的选择是接受所选模型的次优性,并解决上述两个次优性的原因。

摘要

  • 一些统计程序假设基础数据遵循正态分布。
  • 偏度峰度是两个基于矩的度量,将帮助您快速计算偏离正态的程度。****
  • 除了使用偏度峰度、之外,您还应该使用综合 K 平方Jarque-Bera 测试来确定偏离正态的数量是否具有统计显著性。
  • 在某些情况下,如果数据(或残差)不是正态分布的,您的模型将是次优的。

感谢阅读!如果你喜欢这篇文章,请关注我的Sachin Date获取关于时间序列分析和预测的技巧、方法和编程建议。

测试胶水 Pyspark 作业

原文:https://towardsdatascience.com/testing-glue-pyspark-jobs-4b544d62106e?source=collection_archive---------10-----------------------

设置你的环境,这样你的 Glue PySpark 作业就可以读取和写入一个模仿的 S3 桶,这要感谢 moto 服务器

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

Photo by Scott Sanker on Unsplash

挑战

胶合作业的典型用例是:

  • 你阅读来自 S3 的数据;
  • 你对这些数据进行一些转换;
  • 你把转换后的数据传回 S3。

当编写 PySpark 作业时,用 Python 编写代码和测试,并使用 PySpark 库在 Spark 集群上执行代码。但是我如何让 Python 和 Spark 用同一个被嘲笑的 S3 桶进行通信呢?

在本文中,我将向您展示如何设置一个模拟的 S3 桶,您可以从 python 进程以及 Spark 集群访问它。

测试环境

创建粘合作业的先决条件

我们用的是 Glue 1.0 ,也就是 Python 3.6.8,Spark/PySpark 2.4.3,Hadoop 2.8.5。
确定;

  • 你已经安装了python 3 . 6 . 8
  • 你已经安装了 JavaJDK 8
  • 您已经安装了用于 hadoop 2.7 的 spark 2.4.3。

注意 : Glue 使用 Hadoop 2.8.5,但是为了简单起见,我们使用 Hadoop 2.7,因为它是 Spark 2.4.3 附带的。

Python 依赖性

pipenv --python 3.6
pipenv install moto[server]
pipenv install boto3
pipenv install pyspark==2.4.3

PySpark 代码使用了一个模仿的 S3 桶

如果您遵循了上述步骤,您应该能够成功运行以下脚本:

import os
import signal
import subprocessimport boto3
from pyspark.sql import DataFrame
from pyspark.sql import SparkSession **# start moto server, by default it runs on localhost on port 5000.** process = subprocess.Popen(
    "moto_server s3", stdout=subprocess.PIPE,
    shell=True, preexec_fn=os.setsid
)**# create an s3 connection that points to the moto server.** s3_conn = boto3.resource(
    "s3", endpoint_url="http://127.0.0.1:5000"
)
**# create an S3 bucket.** s3_conn.create_bucket(Bucket="bucket")**# configure pyspark to use hadoop-aws module.
# notice that we reference the hadoop version we installed.**
os.environ[
    "PYSPARK_SUBMIT_ARGS"
] = '--packages "org.apache.hadoop:hadoop-aws:2.7.3" pyspark-shell'**# get the spark session object and hadoop configuration.** spark = SparkSession.builder.getOrCreate()
hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()**# mock the aws credentials to access s3.** hadoop_conf.set("fs.s3a.access.key", "dummy-value")
hadoop_conf.set("fs.s3a.secret.key", "dummy-value")
**# we point s3a to our moto server.** hadoop_conf.set("fs.s3a.endpoint", "http://127.0.0.1:5000")
**# we need to configure hadoop to use s3a.** hadoop_conf.set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")**# create a pyspark dataframe.** values = [("k1", 1), ("k2", 2)]
columns = ["key", "value"]
df = spark.createDataFrame(values, columns)**# write the dataframe as csv to s3.** df.write.csv("s3://bucket/source.csv")**# read the dataset from s3** df = spark.read.csv("s3://bucket/source.csv")**# assert df is a DataFrame** assert isinstance(df, DataFrame)**# shut down the moto server.** os.killpg(os.getpgid(process.pid), signal.SIGTERM)print("yeeey, the test ran without errors.")

将上述代码复制粘贴到一个名为“py spark-mocked-S3 . py”的文件中,并执行:

*pipenv shell
python pyspark-mocked-s3.py*

输出将类似于:

*(glue-test-1) bash-3.2$ python pyspark-mocked-s3.py
* Running on [http://127.0.0.1:5000/](http://127.0.0.1:5000/) (Press CTRL+C to quit)...127.0.0.1 - - [28/Nov/2019 20:54:59] "HEAD /bucket/source.csv/part-00005-0f74bb8c-599f-4511-8bcf-8665c6c77cc3-c000.csv HTTP/1.1" 200 -
127.0.0.1 - - [28/Nov/2019 20:54:59] "GET /bucket/source.csv/part-00005-0f74bb8c-599f-4511-8bcf-8665c6c77cc3-c000.csv HTTP/1.1" 206 -yeeey, the test ran without errors.*

编写测试用例

上面脚本中显示的原则在我的 repotesting-glue-py spark-jobs中以更结构化的方式应用。

在这个 repo 中,你会发现一个 Python 文件, test_glue_job.py 。这个文件是 Glue PySpark 作业的一个测试用例的例子。它结合了上述逻辑和我写的一篇关于测试无服务器服务的文章中概述的原则。查看测试用例,并按照自述文件中的步骤运行测试。为了方便起见,我在下面添加了测试用例。

祝你好运!

https://gist.github.com/vincentclaes/5d78f3890a117c613f23e3539e5e3e5d

【https://stackoverflow.com/a/50242383/1771155
https://gist.github.com/tobilg/e03dbc474ba976b9f235
https://github . com/spulec/moto/issues/1543 # issue comment-429000739

测试无服务器服务

原文:https://towardsdatascience.com/testing-serverless-services-59c688812a0d?source=collection_archive---------4-----------------------

使用 moto 对 AWS lambda 函数进行 python 单元测试。

避免测试对于任何软件项目的成功都是至关重要的。如果您正在开发一个应用程序,您希望编写测试来检查您的应用程序的功能。通过测试,您可以添加新的特性或修复错误,并轻松地部署更改后的代码。没有测试,你将生活在一个充满不安全感和挫败感的世界里。

我们将使用 python 默认测试框架 unittest 和一个名为 moto 的 AWS 服务模拟工具来测试我们的 AWS lambda 的 python 功能。此外,我们将解释如何使用 AAA 模式 (Arrange,Act,Assert)来安排和格式化你的测试代码。

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

Photo by Battlecreek Coffee Roasters on Unsplash

Lambda 处理器逻辑

下面的代码是原始代码的一部分,它是一个名为“无服务器数据管道示例”的项目的一部分,是我之前写的教程的结果。这个处理程序的原始代码可以在我的 Github 上找到。

lambda 处理程序由 s3 事件触发。该事件是一个. eml 文件(电子邮件文件),它是在我们的 s3 bucket 的 unzip/文件夹中创建的。lambda 的配置和触发 lambda 的 s3 事件可以在项目的 serverless.yml 中的这里找到。

该事件以字典的形式作为第一个参数传递给我们的处理函数。我们从事件中获取桶名和 s3 键,它指向我们的电子邮件文件的位置。我们读取电子邮件文件,并将内容提取为 JSON 对象。JSON 对象被转储回 s3。从环境变量中检索目标桶和关键字。环境变量在 serverless.yml 文件中配置这里是

测试 Lambda 处理器逻辑

从为项目中的测试创建一个结构开始。最简单的方法是模仿 tests 文件夹中的应用程序结构。你可以在这里找到一个例子:

.
├── serverless_data_pipeline
│   ├── lambda_function
│   │   ├── extract.py
└── serverless_data_pipeline_tests
    └── lambda_function
        └── test_extract.py

在 test_extract.py 模块中,我们有以下代码:

单元测试

为了测试我们的 lambda 处理程序的逻辑,我们将使用 unittest 。unittest 是 python 标准库的一部分,帮助您创建和运行单元测试。

测试用例

我们首先在 test_extract.py 文件中创建一个名为TestExtract的类。我们的类继承自 unittest.TestCase。通过从 TestCase 继承,您可以访问有助于您的测试的函数。在一个测试用例中,以关键字“test”开头的方法被 unittest 测试运行器视为一个测试。您将在我们的示例中找到一个测试函数:

test_extract_the_contents_of_an_email_successfully(self):

提示:以你的测试函数的名义描述你正在测试的东西,让你自己和他人容易理解你正在测试的东西。

安装()和拆卸()

unittest 提供了一些函数,这些函数可以设置和拆除您的测试环境,而不需要在每次测试之前和之后显式调用它们。在我们的例子中,为了让我们的测试成功运行,我们需要必要的 s3 存储桶和一些环境变量。我们将此逻辑添加到 设置 功能中,并在执行测试之前调用设置功能。

def setUp(self):
    os.environ[TestExtract.ENV_DEST_KEY] = TestExtract.DEST_KEY
    os.environ[TestExtract.ENV_DEST_BUCKET] = TestExtract.DEST_BUCKET

    conn = boto3.resource('s3')
    conn.create_bucket(Bucket=TestExtract.SOURCE_BUCKET)
    conn.create_bucket(Bucket=TestExtract.DEST_BUCKET)

测试运行后,我们要删除 s3 存储桶和环境变量。我们在 拆卸 函数中添加了该逻辑,并且每次测试完成时,都会执行拆卸函数。

def tearDown(self):
    del os.environ[TestExtract.ENVIRON_DEST_KEY]
    del os.environ[TestExtract.ENVIRON_DEST_BUCKET]

    self.remove_bucket(TestExtract.SOURCE_BUCKET)
    self.remove_bucket(TestExtract.DESTINATION_BUCKET)

摩托

我们希望在本地执行我们的功能,而不想与“真实的”AWS 环境交互。最好我们想与一个模拟的 AWS 环境互动。为了创建一个模拟的 AWS 环境,我们将使用 moto 。moto 是一个库,允许您的测试轻松模拟 AWS 服务。我们从 moto 继承了 mock_s3,并将其用作测试类的装饰器:

@mock_s3
class TestExtract(unittest.TestCase):

一旦将 mock_s3 设置为装饰器,通过 boto3 与 s3 的每一次交互都会被模仿。像这样,我们的测试可以离线运行,就像它们与 AWS 服务交互一样。

安排动作断言(AAA)

在测试函数中,我们测试内容是否从。eml 文件,并且内容作为 JSON 对象成功地转储到 s3 上。每个测试函数都是按照 安排、动作、断言(AAA) 原则构造的。

安排你的模拟 AWS 环境

首先,我们 安排 我们的环境以便执行我们的测试。如上所述,一般的设置和拆卸功能可以在设置和拆卸功能中完成。特定于测试的配置可以在测试函数本身中完成。

一旦创建了 s3 存储桶并在 setUp 函数中设置了环境变量,我们就通过读取一个. eml 文件并将该文件上传到 s3 来在我们的测试函数中安排特定于测试的环境。读取和上传发生在函数中

def put_email_to_s3(self, test_email_path, email_name):

执行您想要测试的功能

下一步是 act 通过执行我们想要测试的 lambda 处理函数。

s3_key_extracted_message = extract.handler(event, None)

我们看到我们的处理函数返回了一个 s3 键。在生产中,这个 s3 密钥没有被使用,也没有任何价值。我们返回这个值只是为了验证我们的测试是否如我们所期望的那样运行。

断言我们得到了预期的结果

一旦我们的处理函数运行,我们 断言 预期的结果已经出现。我们通过获取 lambda 处理程序返回的 s3 键并检查被模仿的 s3 桶是否包含预期的 JSON 对象来做到这一点。

我们从 s3 中读取对象,并断言 JSON 对象等于我们期望的对象。不要开始写自己的断言函数,unittest 有一堆高级断言方法,可以在这里找到。我们使用函数

self.assertDictEqual(json.loads(email_as_json), expected_json)

比较字典是否相等。

运行测试

要自己运行上面的示例,从克隆原始项目并安装依赖项开始:

git clone [git@github.com](mailto:git@github.com):vincentclaes/serverless_data_pipeline_example.gitcd serverless_data_pipeline_example
pipenv install
pipenv shell

要执行项目中的所有测试,请运行:

python -m unittest

它将运行测试用例的所有测试功能。测试应该通过,您应该看到输出“OK”。

bash-3.2$  . /Users/vincent/.local/share/virtualenvs/serverless_data_pipeline-27feO5HC/bin/activate
(serverless_data_pipeline) bash-3.2$ python -m unittest serverless_data_pipeline_tests/lambda_function/test_extract.py
email object {'id': 'test_extract_the_contents_of_an_email_successfully.eml', 'from': '[vclaes1986@gmail.com](mailto:vclaes1986@gmail.com)', 'to': '[vincent.v.claes@gmail.com](mailto:vincent.v.claes@gmail.com)', 'cc': '', 'subject': 'Hey how are you doing', 'date': '2019-07-09 13:42:54+02:00', 'body': '\nCash Me Outside How Bout Dah'}
.
----------------------------------------------------------------------
Ran 1 test in 0.185sOK

要运行一个单独的测试用例,您可以运行:

python -m unittest serverless_data_pipeline_tests.lambda_function.test_extract.TestExtract

要运行单个测试函数,您可以运行:

python -m unittest serverless_data_pipeline_tests.lambda_function.test_extract.TestExtract.test_extract_the_contents_of_an_email_successfully

如果您的所有测试都通过了,您就可以放心地将项目部署到 AWS 了。

祝你好运!

测试机器学习(ML)管道

原文:https://towardsdatascience.com/testing-your-machine-learning-ml-pipelines-81f9c436727c?source=collection_archive---------28-----------------------

说到数据产品,很多时候有一种误解,认为这些产品不能通过自动化测试。尽管管道的某些部分由于其实验性和随机性而无法通过传统的测试方法,但大部分管道可以。除此之外,更不可预测的算法可以通过专门的验证过程。

让我们看看传统的测试方法,以及如何将这些方法应用到我们的数据/ML 管道中。

测试金字塔

您的标准简化测试金字塔如下所示:

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

Image by author

这个金字塔是你为应用程序编写的测试类型的代表。我们从大量的单元测试开始,这些单元测试孤立地测试单个功能。然后,我们编写集成测试,检查将我们隔离的组件组合在一起是否如预期的那样工作。最后,我们编写 UI 或验收测试,从用户的角度检查应用程序是否按预期工作。

说到数据产品,金字塔并没有太大的不同。我们的水平差不多。

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

Image by author

请注意,UI 测试仍然会在产品中进行,但是这篇博文关注的是与数据管道最相关的测试。

让我们在一些科幻作家的帮助下,仔细看看在机器学习的背景下,这些都意味着什么。

单元测试

“这是一个测试你对宇宙的想法的系统,看看它们是否符合”艾萨克·阿西莫夫。

数据管道中的大部分代码由数据清理过程组成。每个用来清理数据的函数都有一个明确的目标。比方说,我们为我们的模型选择的特征之一是前一天和当天之间的值的变化。我们的代码可能看起来有点像这样:

def add_difference(asimov_dataset):    
    asimov_dataset['total_naughty_robots_previous_day'] = 
        asimov_dataset['total_naughty_robots'].shift(1)  

    asimov_dataset['change_in_naughty_robots'] = 
        abs(asimov_dataset['total_naughty_robots_previous_day'] - 
            asimov_dataset['total_naughty_robots'])     return asimov_dataset[['total_naughty_robots', 
        'change_in_naughty_robots', 'robot_takeover_type']]

这里我们知道,对于给定的输入,我们期望得到一定的输出,因此,我们可以用下面的代码来测试这一点:

import pandas as pd 
from pandas.testing import assert_frame_equal 
import numpy as np def test_change(): 
    asimov_dataset_input = pd.DataFrame({ 
        'total_naughty_robots': [1, 4, 5, 3], 
        'robot_takeover_type': ['A', 'B', np.nan, 'A'] 
    })     expected = pd.DataFrame({ 
        'total_naughty_robots': [1, 4, 5, 3], 
        'change_in_naughty_robots': [np.nan, 3, 1, 2], 
        'robot_takeover_type': ['A', 'B', np.nan, 'A'] 
    })     result = add_difference(asimov_dataset_input)

    assert_frame_equal(expected, result)

对于每个独立的功能,您应该编写一个单元测试,确保数据转换过程的每个部分对数据都有预期的影响。对于每项功能,你还应该考虑不同的场景(是否有 if 语句?然后所有条件句都要考)。这些将在每次提交时作为持续集成(CI)管道的一部分运行。

除了检查代码是否如预期的那样,单元测试还在调试问题时帮助我们。通过添加一个测试来重现一个新发现的 bug,我们可以确保当我们认为那个 bug 被修复时,它就被修复了,并且我们可以确保这个 bug 不会再次发生。

最后,这些测试不仅检查代码做了预期的事情,还帮助我们记录我们在创建功能时的期望。

集成测试

因为“清澈的眼睛更好,无论它看到什么。”弗兰克·赫伯特

这些测试旨在确定单独开发的模块在组合在一起时是否能按预期工作。就数据管道而言,它们可以检查:

  • 数据清理过程会产生适合模型的数据集
  • 模型训练可以处理提供给它的数据并输出结果(确保代码在将来可以重构)

因此,如果我们采用上面的单元测试函数,并添加以下两个函数:

def remove_nan_size(asimov_dataset): 
    return asimov_dataset.dropna(subset=['robot_takeover_type']) def clean_data(asimov_dataset): 
    asimov_dataset_with_difference = add_difference(asimov_dataset) 
    asimov_dataset_without_na = remove_nan_size(
        asimov_dataset_with_difference)     return asimov_dataset_without_na

然后我们可以用下面的代码测试组合 clean_data 中的函数是否会产生预期的结果:

def test_cleanup(): 
    asimov_dataset_input = pd.DataFrame({ 
        'total_naughty_robots': [1, 4, 5, 3], 
        'robot_takeover_type': ['A', 'B', np.nan, 'A']
    }) 
    expected = pd.DataFrame({ 
        'total_naughty_robots': [1, 4, 3], 
        'change_in_naughty_robots': [np.nan, 3, 2], 
        'robot_takeover_type': ['A', 'B', 'A']    
    }).reset_index(drop=True)     result = clean_data(asimov_dataset_input).reset_index(drop=True)    

    assert_frame_equal(expected, result)

现在让我们说,下一件事,我们做的是饲料上述数据到一个逻辑回归模型。

from sklearn.linear_model import LogisticRegression def get_reression_training_score(asimov_dataset, seed=9787): 
    clean_set = clean_data(asimov_dataset).dropna() 
    input_features = clean_set[['total_naughty_robots',    
        'change_in_naughty_robots']] 
    labels = clean_set['robot_takeover_type'] 

    model = LogisticRegression(random_state=seed).fit(
                input_features, labels) return model.score(input_features, labels) * 100

虽然我们不知道期望值,但是我们可以确保我们总是得到相同的值。对我们来说,测试这种集成以确保:

  • 数据可由模型使用(每个输入都有一个标签,数据的类型由所选的模型类型接受,等等)
  • 我们能够在未来重构我们的代码,而不会破坏端到端的功能。

我们可以通过为随机生成器提供相同的种子来确保结果总是相同的。所有主要的库都允许您设置种子(Tensorflow 有点特殊,因为它要求您通过 numpy 设置种子,所以请记住这一点)。该测试可能如下所示:

from numpy.testing import assert_equal def test_regression_score(): 
    asimov_dataset_input = pd.DataFrame({ 
        'total_naughty_robots': [1, 4, 5, 3, 6, 5], 
        'robot_takeover_type': ['A', 'B', np.nan, 'A', 'D', 'D'] 
    }) 
    result = get_reression_training_score(asimov_dataset_input, 
                 seed=1234) 
    expected = 50.0     assert_equal(result, expected)

这类测试不会像单元测试那样多,但是它们仍然是你的 CI 管道的一部分。您将使用这些来检查组件的端到端功能,并因此测试更多的主要场景。

ML 验证

为什么?"表现出知道错误问题的答案是完全无用的."厄休拉·K·勒·古恩。

既然我们已经测试了我们的代码,我们还需要测试 ML 组件是否解决了我们试图解决的问题。当我们谈论产品开发时,ML 模型的原始结果(无论基于统计方法多么精确)几乎从来都不是期望的最终结果。在被用户或其他应用程序使用之前,这些结果通常与其他业务规则相结合。出于这个原因,我们需要验证模型解决了用户问题,而不仅仅是准确性/f1 分数/其他统计度量足够高。

这对我们有什么帮助?

  • 它确保模型实际上帮助产品解决手头的问题
  • 它确保模型产生的价值对行业有意义
  • 它为所做的决定提供了一个额外的文档层,帮助工程师在过程的后期加入团队。
  • 它以客户、产品经理和工程师同样理解的通用语言提供了产品 ML 组件的可见性。

这种验证应该定期运行(通过 CI 管道或 cron 作业),其结果应该对组织可见。这可确保组织能够看到数据科学组件的进展,并确保及早发现由变更或陈旧数据引起的问题。

结论

毕竟“魔法只是我们还不了解的科学”亚瑟·C·克拉克。

ML 组件可以通过多种方式进行测试,这为我们带来了以下优势:

  • 产生了一种数据驱动的方法来确保代码做了预期的事情
  • 确保我们可以在不破坏产品功能的情况下重构和清理代码
  • 记录功能、决策和以前的错误
  • 提供产品 ML 组件的进度和状态的可见性

所以不要害怕,如果你有技能来写代码,你就有技能来写测试,并获得以上所有的优势🙂

再见,感谢所有的测试!

原载于 2019 年 7 月 18 日【http://intothedepthsofdataengineering.wordpress.com

从“金属乐队”到阿黛尔——R

原文:https://towardsdatascience.com/text-analysis-of-successful-song-lyrics-e41a4ccb26f5?source=collection_archive---------5-----------------------

其他都不重要

“我们没有争议”——这是一句拉丁语。

我们每个人都有自己对音乐的偏好,不同的背景让我们对不同的话题和感受产生共鸣,这可能就是*“在品味问题上,没有争议”的真理。然而,非常成功的艺术家很容易与平庸的艺术家区分开来。成功可以通过售出的唱片数量、在 Spotify 上的播放次数、在世界各地的门票销售一空等来衡量。*

下面的迷因从夸张的角度展示了两位非常成功的音乐人的歌词是如何完全不同的:

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

Figure 1: lyrics depth

本文不想支持碧昂斯或弗雷迪·墨丘利,而是调查在非常成功的音乐作品中使用的词语选择、抒情动机、主题和感情。

歌词对一个艺人的成功有什么影响吗,还是说这一切都是制作价值,朗朗上口,其他什么都不重要?

你为了钱做什么亲爱的

songlyrics.xlsx 数据集包含不同流派和时代的 6 位标志性人物的歌词,使用他们最畅销的专辑。它包括发行年份、艺术家、专辑、流派、售出的唱片数量和产生的收入,以及该专辑中每首歌曲的歌词。分析过程中使用了以下艺术家和专辑:

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

Table 1: Artists and albums

清理我的衣柜

数据集只需要轻微的数据清理:

  • 在一些歌曲中,括号用来表示[独唱]、[合唱]或表演歌曲一部分的艺术家、[德瑞医生]等。这些将被删除。
  • 需要转换成tidytext格式:每行一个 token (word)。
  • 我们必须为无意义的词创建一个自定义的停用词词典,比如詹姆斯·海特菲尔德的*“耶”* s,阿姆的*“哟”* s,迈克尔杰克逊的*“马麻色,马麻萨,马麻库萨”* s
  • 删除数字。

想开始点什么吗

让我们从使用dplyrcount()开始,找出最常用的单词:

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

Figure 2: most used words in the dataset

毫不奇怪,单词 love 是数据集中所有有意义的单词中使用最多的单词。将要想要可能会被认为是停用词。像女孩宝宝这样的词也是和爱情、关系这个话题联系在一起的。

下图显示了三位艺术家如何不同地使用词语:

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

Figure 3: Different word choices

不同流派代表使用的常用词不多。他们使用男孩的比例相对相似,但金属乐队演唱关于被打破自由梦想的方式比阿姆或阿黛尔多。为了量化它们的差异,我们可以使用皮尔森相关性。阿黛尔和金属乐队的得分是 0.03,金属乐队和阿姆的得分是 0.09。

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

这是意料之中的,因为数据集跨越了 31 年(1980-2011),使用了 6 种不同的体裁。人们期望不同类型的音乐会有不同的词汇选择。

我们还可以检查每种体裁的词频有何不同:

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

Figure 4: Word frequencies by Genre

灵魂似乎是关于爱情眼泪,说唱有很多诅咒,金属是关于斗争苦难而雷鬼是关于爱情。听起来很准确。

这就是爱情

为了更深入地了解这些歌曲的成功之处,让我们通过加入一个情感词汇来研究它们是如何处理情感的。

首先,我们可以看到每个流派的平均情绪得分是多少。当金属触及我们的负面情绪时,雷鬼真的能让我们感到快乐吗?

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

Figure 5: average sentiment per Genre

“快乐”类型的结果正如预期的那样,但令人惊讶的是,摇滚比金属有更多的负面情绪,说唱超过了这两者。

为了更深入地挖掘这一现象,让我们看看对这一平均情绪有贡献的最有影响力的词。

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

Figure 6: Words contributing to sentiments per Genre

现在我们看到为什么说唱变成了最负面的,看看过多的脏话。它们可能会被视为停用词,但它们也有意义。我的假设是,如果这首歌包含许多来自 S-F-B 三角的词,它很可能不是关于一个快乐的话题。

还有一些用词不当:《摇滚》中的 shake 是关于跳舞/移动的(抖腿)),是一个比较中性的词。当然,在雷鬼, jam 这个词也不是负面的,一起演奏音乐有更多积极的意义。

独一无二的

我们可以使用 tf-idf 统计数据来量化每个流派的内容。它显示了一个词在一个流派的流派集合中对这个流派有多重要。

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

Figure 7: Highest tf-idf words per Genre

金属是相当直接的:我们看到像痛苦挣扎这样的重要词汇,在其他流派中并不常见。流行和说唱就不那么有代表性了:tf-idf 最高的词都是他的歌名( billiejeanstarting 'somethingthriller 等。),而 Slim Shady 则独特地提到了 Dre 博士和他自己(马歇尔)。雷鬼使用方言俚语,如 jah ,谈论运动出埃及。摇滚是关于地狱喝酒 ing,以及关于摇滚本身的歌唱。

内部斗争

使用潜在的狄利克雷分配,让我们看看这些歌曲的歌词中有哪些不同的主题。

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

Figure 8: Topic modeling using LDA

这些话题中的词汇选择再次暗示了它主要取决于音乐的类型,选择哪些词汇和讨论哪些话题。

第一个话题主要是关于享受生活,和一个女孩恋爱,总体幸福。大多数单词与雷鬼最常用的单词相似。话题 6 是关于分手的,有时间遇见之类的词,大部分来自灵魂歌词。

当音乐停止时

这项分析只关注了 6 位艺术家和他们最畅销的专辑,以得出关于什么是成功的音乐作品的结论。结果肯定对艺术家本身有一些偏见,但我们仍然可以画出他们的词汇用法和主题。

一首歌的成功在很大程度上取决于它属于哪种类型。说唱、摇滚和金属歌曲往往有更多的负面信息,有时亵渎歌词,谈论作者的痛苦和挣扎。流行和灵魂乐歌手倾向于关注爱情和分手,使用更积极的词语,他们是关于关系的。

这种分析可以很容易地用更多的数据来重复,以得出关于音乐产业状况的更普遍的结论,并且包括不太成功的艺术家可以进一步揭示什么是成功的歌曲的主题,哪些词的选择和主题导致更高的销售额和收入。

出埃及记

该分析基于朱莉娅·西尔格和大卫·罗宾逊的作品,重点是他们的书《用 R 进行文本挖掘》。R 代码和数据集可以在 GitHub 上我的 NLP_songlyrics 资源库中找到。

特别感谢Eduardo ario de la Rubia在匈牙利中欧大学为我提供了这篇文章的基础知识。

使用 Azure Web Apps & Doccano 对预算进行文本注释

原文:https://towardsdatascience.com/text-annotation-on-a-budget-with-azure-web-apps-doccano-b29f479c0c54?source=collection_archive---------17-----------------------

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

TLDR: 这篇文章讲述了如何在 Azure Web 应用上部署 Doccano ,以便为自然语言处理任务协同注释文本数据。

这篇文章的所有代码可以在这里找到:

[## aribornstein/Doccano4Azure

在 Azure 上一键部署 doccano。通过创建帐户为 aribornstein/Doccano4Azure 开发做贡献…

github.com](https://github.com/aribornstein/doccano4Azure)

什么是 Doccano?

Doccano 是一个开源工具,为文本分类、序列标记和序列对序列提供注释功能。

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

最近,我一直在对一个数据集进行注释以供共同参考,作为这项任务的一部分,我有时间评估了几个不同的文本注释平台。

大多数免费开源注释工具,如 Brat 和 Anafora,都不遵守现代 UX 原则。Doccano 是我见过的唯一一个具有现代 UX 体验的开源注释工具。虽然存在其他现代文本注释工具,如 ProdigyLightTag 存在,但它们拥有非常昂贵的许可证。

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

Prodigy and Lighthead are expensive with Doccano we can annotate data at fraction of the cost

然而,为了合作,我们需要在某个地方托管网站,以使这个过程更容易。本教程将告诉你如何做。

什么是容器的 Web App

Azure App Service 不仅为你的应用增加了微软 Azure 的强大功能,比如安全性、负载平衡、自动伸缩和自动化管理。您还可以利用它的 DevOps 功能,例如从 Azure DevOps、GitHub、Docker Hub 和其他来源、包管理、暂存环境、自定义域和 SSL 证书进行连续部署。

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

If the webservice is under 1GB and there is not much usage we can run the compute for free on Azure

步骤 1:将 Doccano 部署到 Azure 应用服务

如果您已有 Azure 订阅,只需点击下面的按钮进行自动部署,即可开始为您的数据添加注释。

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

Click the Deploy button above to get started!

否则,你可以在这里获得一个免费的 Azure 帐户,然后点击上面的部署按钮。

[## Azure 免费试用版|微软 Azure

开始您的免费 Microsoft Azure 试用,并获得 200 美元的 Azure 点数,以任何方式使用。运行虚拟机…

azure.microsoft.com](https://azure.microsoft.com/offers/ms-azr-0044p/?WT.mc_id=medium-blog-abornst) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fill in the config with admin details and deploy

步骤 2:导航到您的 Doccano 部署并登录

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

部署后,导航到以下 url,其中{appname}是您在上面选择的 appname。

https://{ appname } . azure websites . net/登录

例如,在我们上面的部署中,登录 url 应该是

https://doccana.azurewebsites.net/登录

这将带您进入 Doccano 登录页面,您可以使用您在部署中配置的 Admin_userAdmin_pass 登录。

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

现在你可以开始注释你自己的数据了,看看来自 Doccano github 的指令。以下步骤是从教程中一字不差地摘录下来的。

步骤 3 创建数据集

在这里,我们接受了一个科幻小说的 NER 注释任务,给你一个关于 doccano 的简短教程。

下面是一个 JSON 文件,包含了许多不同语言的科幻小说描述。我们需要注释一些实体,比如人名、书名、日期等等。

books.json

{"text": "The Hitchhiker's Guide to the Galaxy (sometimes referred to as HG2G, HHGTTGor H2G2) is a comedy science fiction series created by Douglas Adams. Originally a radio comedy broadcast on BBC Radio 4 in 1978, it was later adapted to other formats, including stage shows, novels, comic books, a 1981 TV series, a 1984 video game, and 2005 feature film."}
{"text": "《三体》是中国大陆作家刘慈欣于 2006 年 5 月至 12 月在《科幻世界》杂志上连载的一部长篇科幻小说,出版后成为中国大陆最畅销的科幻长篇小说之一。2008 年,该书的单行本由重庆出版社出版。本书是三体系列(系列原名为:地球往事三部曲)的第一部,该系列的第二部《三体 II:黑暗森林》已经于 2008 年 5 月出版。2010 年 11 月,第三部《三体 III:死神永生》出版发行。 2011 年,“地球往事三部曲”在台湾陆续出版。小说的英文版获得美国科幻奇幻作家协会 2014 年度“星云奖”提名,并荣获 2015 年雨果奖最佳小说奖。"}
{"text": "『銀河英雄伝説』(ぎんがえいゆうでんせつ)は、田中芳樹によるSF 小説。また、これを原作とするアニメ、漫画、コンピュータゲーム、朗読、オーディオブック等の関連作品。略称は『銀英伝』(ぎんえいでん)。原作は累計発行部数が1500 万部を超えるベストセラー小説である。1982 年から2009 年 6 月までに複数の版で刊行され、発行部数を伸ばし続けている。"}

创建一个项目

我们需要为此任务创建一个新项目。使用超级用户帐户登录。

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

要创建您的项目,请确保您在项目列表页面中,然后单击Create Project按钮。对于本教程,我们将项目命名为sequence labeling for books,编写一些描述,选择序列标签项目类型,并选择我们创建的用户。

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

导入数据

创建项目后,我们会看到“导入数据”页面,或者点击导航栏中的Import Data按钮。我们应该会看到以下屏幕:

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

我们选择 JSON 文件books.json来上传。上传数据集文件后,我们会看到Dataset页面(或者点击左边栏的Dataset按钮列表)。此页面显示我们在一个项目中上传的所有文档。

定义标签

点击左边栏的Labels按钮定义我们自己的标签。我们应该会看到标签编辑器页面。在标签编辑器页面中,您可以通过指定标签文本、快捷键、背景颜色和文本颜色来创建标签。

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

至于教程,我们创建了一些与科幻小说相关的实体。

第六步注释

接下来,我们准备注释文本。只需点击导航栏中的Annotate Data按钮,我们就可以开始注释文档了。

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

导出数据

在注释步骤之后,我们可以下载带注释的数据。点击导航栏中的Edit data按钮,然后点击Export Data。您应该会看到下面的屏幕:

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

这里我们选择 JSON 文件,通过点击按钮来下载数据。下面是我们辅导项目的注释结果。

sequence_labeling_for_books.json

{"doc_id": 33, "text": "The Hitchhiker's Guide to the Galaxy (sometimes referred to as HG2G, HHGTTGor H2G2) is a comedy science fiction series created by Douglas Adams. Originally a radio comedy broadcast on BBC Radio 4 in 1978, it was later adapted to other formats, including stage shows, novels, comic books, a 1981 TV series, a 1984 video game, and 2005 feature film.", "entities": [[0, 36, "Title"], [63, 67, "Title"], [69, 75, "Title"], [78, 82, "Title"], [89, 111, "Genre"], [130, 143, "Person"], [158, 180, "Genre"], [184, 193, "Other"], [199, 203, "Date"], [254, 265, "Genre"], [267, 273, "Genre"], [275, 286, "Genre"], [290, 294, "Date"], [295, 304, "Genre"], [308, 312, "Date"], [313, 323, "Genre"], [329, 333, "Date"], [334, 346, "Genre"]], "username": "admin"}
{"doc_id": 34, "text": "《三体》是中国大陆作家刘慈欣于 2006 年 5 月至 12 月在《科幻世界》杂志上连载的一部长篇科幻小说,出版后成为中国大陆最畅销的科幻长篇小说之一。2008 年,该书的单行本由重庆出版社出版。本书是三体系列(系列原名为:地球往事三部曲)的第一部,该系列的第二部《三体 II:黑暗森林》已经于 2008 年 5 月出版。2010 年 11 月,第三部《三体 III:死神永生》出版发行。 2011 年,“地球往事三部曲”在台湾陆续出版。小说的英文版获得美国科幻奇幻作家协会 2014 年度“星云奖”提名,并荣获 2015 年雨果奖最佳小说奖。", "entities": [[1, 3, "Title"], [5, 7, "Location"], [11, 14, "Person"], [15, 22, "Date"], [23, 26, "Date"], [28, 32, "Other"], [43, 45, "Genre"], [53, 55, "Location"], [70, 75, "Date"], [126, 135, "Title"], [139, 146, "Date"], [149, 157, "Date"], [162, 172, "Title"], [179, 184, "Date"], [195, 197, "Location"], [210, 212, "Location"], [227, 230, "Other"], [220, 225, "Date"], [237, 242, "Date"], [242, 245, "Other"]], "username": "admin"}
{"doc_id": 35, "text": "『銀河英雄伝説』(ぎんがえいゆうでんせつ)は、田中芳樹によるSF 小説。また、これを原作とするアニメ、漫画、コンピュータゲーム、朗読、オーディオブック等の関連作品。略称は『銀英伝』(ぎんえいでん)。原作は累計発行部数が1500 万部を超えるベストセラー小説である。1982 年から2009 年 6 月までに複数の版で刊行され、発行部数を伸ばし続けている。", "entities": [[1, 7, "Title"], [23, 27, "Person"], [30, 34, "Genre"], [46, 49, "Genre"], [50, 52, "Genre"], [53, 62, "Genre"], [63, 65, "Genre"], [66, 74, "Genre"], [85, 88, "Title"], [9, 20, "Title"], [90, 96, "Title"], [108, 114, "Other"], [118, 126, "Other"], [130, 135, "Date"], [137, 144, "Date"]], "username": "admin"}

恭喜你!您刚刚掌握了如何在 Azure 上使用 doccano 进行序列标记项目。

如果您有任何问题、评论或希望我讨论的话题,请随时在 Twitter 上关注我。如果您认为我错过了某个里程碑,请告诉我。感谢 Hironsan 的惊人工作!

关于作者

亚伦(阿里)博恩施泰因 是一个狂热的人工智能爱好者,对历史充满热情,致力于新技术和计算医学。作为微软云开发倡导团队的开源工程师,他与以色列高科技社区合作,用改变游戏规则的技术解决现实世界的问题,然后将这些技术记录在案、开源并与世界其他地方共享。

基于文本的图卷积网络——圣经分类

原文:https://towardsdatascience.com/text-based-graph-convolutional-network-for-semi-supervised-bible-book-classification-c71f6f61ff0f?source=collection_archive---------7-----------------------

一种基于半监督图的文本分类和推理方法

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

The most beautiful graph you have ever seen, courtesy of https://www.quora.com/Whats-the-most-beautiful-graph-you-have-ever-seen.

在本文中,我将详细介绍基于文本的图卷积网络(GCN)及其使用 PyTorch 和标准库的实现。基于文本的 GCN 模型是一种有趣而新颖的最新半监督学习概念,最近提出(扩展了之前由 Kipf 等人 *提出的 GCN 思想)。*在非文本数据上),能够在给定相关已知标注文本数据的情况下,非常准确地推断出一些未知文本数据的标注。

在最高级别,它通过将整个语料库嵌入到单个图中来实现,该图以文档(一些已标记,一些未标记)和单词作为节点,每个文档-单词&单词-单词边缘基于它们彼此之间的关系具有一些预定的权重(例如 Tf-idf)。然后,用具有已知标签的文档节点在该图上训练 GCN,然后使用训练的 GCN 模型来推断未标记文档的标签。

我们在这里使用圣经作为语料库实现基于文本的 GCN,选择圣经是因为它是世界上最受欢迎的书之一,并且包含丰富的文本结构。圣经(新教)由 66 本书(创世纪,出埃及记等)和 1189 章组成。这里的半监督任务是训练一个语言模型,该语言模型能够在给定其他章节的已知标签的情况下,对一些未标记章节所属的书籍进行正确分类。(由于我们实际上知道所有章节的确切标签,我们将有意屏蔽大约 10–20%章节的标签,这些标签将在模型推断过程中用作测试集,以测量模型准确性)

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

Structure of the Holy Bible (Protestant)

为了解决这个任务,语言模型需要能够区分与各种书籍相关联的上下文(例如,创世纪更多地谈论亚当和夏娃,而传道书谈论所罗门王的生活)。正如我们将在下面看到的,文本-GCN 模型所获得的良好结果表明,图结构能够相对较好地捕捉这种上下文,其中文档(章节)-单词边缘编码章节内的上下文,而单词-单词边缘编码章节之间的相对上下文。

关于图形神经网络的详细解释,你可以看看这篇伟大的文章https://Neptune . ai/blog/graph-neural-network-and-some-of-gnn-applications

这里使用的圣经文本(BBE 版本)是由https://github.com/scrollmapper/bible_databases提供的。

实现遵循基于文本的图卷积网络的论文(【https://arxiv.org/abs/1809.05679】T2

实现的源代码可以在我的 GitHub 库(【https://github.com/plkmo/Bible_Text_GCN】T4)中找到

如果你想在你自己的语料库上尝试文本 GCN,我已经创建了一个 NLP 工具包的最先进的模型,其中一个实现了文本 GCN,用于简单的文本分类(以及其他任务)。你可以在这里使用它(https://github.com/plkmo/NLP_Toolkit)。

代表语料库

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

Corpus represented as a graph. Red lines represent document-word edges weighted by TF-IDF, black lines represent word-word edges weighted by PMI.

在这篇论文之后,为了让 GCN 能够捕捉到章节的上下文,我们用节点和边构建了一个图,来表示章节和单词之间的关系。节点将由所有 1189 个章节(文档)加上整个词汇表(单词)组成,在它们之间有加权的文档-单词和单词-单词边。它们的重量 A_ij 由下式给出:

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

Edges weights

其中 PMI 是在滑动窗口 #W 上的同现词对之间的逐点互信息,我们将其固定为 10 个词的长度。 #W(i) 是包含单词 i 的语料库中滑动窗口的数量, #W(i,j) 是包含单词 ij 的滑动窗口的数量,#W 是语料库中滑动窗口的总数。TF-IDF 是通常的词频——该词在文档中的逆文档频率。直观上,单词对之间的高正 PMI 意味着它们具有高语义相关性,相反,我们不会在具有负 PMI 的单词之间建立边。总的来说,TF-IDF 加权的文档-词边缘捕获文档内上下文,而 PMI 加权的词-词边缘(可以跨文档)捕获跨文档上下文。

相比之下,对于非基于图的模型,这样的跨文档上下文信息不容易作为输入特征提供,并且模型将不得不基于标签“从零开始”自己学习它们。由于在 GCN 提供了关于文档之间关系的附加信息,这在 NLP 任务中是绝对相关的,因此可以预期 GCN 会表现得更好。

  1. 计算 TF-IDF

df_data[“c”] is a Pandas dataframe containing the chapters text

计算 TF-IDF 相对简单。我们知道数学并理解它是如何工作的,所以我们只需在我们的 1189 文档文本上使用 sklearn 的 tfidf 矢量器模块,并将结果存储在数据帧中。当我们稍后创建图表时,这将用于文档单词权重。

2。计算单词之间的逐点互信息

计算单词间的 PMI 比较棘手。首先,我们需要在一个包含 10 个单词的滑动窗口中找到单词 i,j 之间的共现,该窗口存储为数据帧中的一个方阵,其中行和列代表词汇表。由此,我们可以使用前面的定义计算 PMI。上面显示了计算的注释代码。

3。构建图表

现在我们已经有了所有边的权重,我们准备构建图 G 。我们使用 networkx 模块来构建它。这里,值得指出的是,整个项目中用于数据处理的大部分繁重计算都花在了构建词-词边缘上,因为我们需要迭代大约 6500 个词的词汇表中所有可能的成对词组合。*幸运的是,有一种有效的方法来实现这一点,并且只需要大约 3 分钟就可以运行。*我们计算的代码片段如下所示。

Building the graph of nodes and weighted-edges

图卷积网络

在用于图像相关任务的卷积神经网络中,我们有卷积层或滤波器(具有可学习的权重),它们“越过”一串像素,以生成通过训练学习的特征图。现在,假设这些像素是你的图形节点,我们同样会有一组具有可学习权重的过滤器 W 来“忽略”GCN 中的这些图形节点。

然而,有一个大问题:图形节点并不像像素那样有一个清晰的物理空间和距离的概念(我们不能说一个节点在另一个节点的右边或左边)。因此,为了用我们的过滤器 W 有意义地卷积节点,我们必须首先为每个节点找到最好地捕获图结构的特征表示。对于高级读者,作者通过将每个节点的滤波器权重 W 和特征空间 X 投影到图的傅立叶空间来解决这个问题,这样卷积就变成了节点与特征的逐点乘法。为了深入探究这一推导,Kipf 等人的原始论文。是一个很好的起点。否则,读者可以将就这种直观的解释,并继续下去。

我们将在这里使用两层 GCN(特征被卷积两次),因为根据他们的论文,它给出了最好的结果。双层 GCN 后的卷积输出特征张量由下式给出:

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

在哪里

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

这里, A 是图 G 的邻接矩阵(对角元素为 1 表示节点的自连接)【DG 的度矩阵。w0 和 w1分别是待训练的第一和第二 GCN 层的可学习滤波器权重。最终的输出然后被馈送到 softmax 层,该层具有交叉熵损失函数,用于用对应于 66 本书中的每一本的 66 个不同标签进行分类。

下面给出了 PyTorch 中两层 GCN 架构的实现。

GCN architecture, with Xavier’s initialization of W_0 (self.weight) and W_1(self.weight2) as well as biases.

培训阶段

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

Class label distribution

在总共 1189 个章节中,我们将在训练期间屏蔽其中 111 个章节(约 10 %)的标签。由于 1189 个章节的类别标签分布非常不均匀(见上图),因此我们不会屏蔽其总数小于 4 的章节的任何类别标签,以确保 GCN 可以从所有 66 个唯一类别标签中学习表示。

我们训练 GCN 模型来最小化未屏蔽标签的交叉熵损失。在对 GCN 进行 7000 个纪元的训练之后,我们将使用该模型来推断 111 个被屏蔽章节的图书标签,并分析结果。

结果

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

Loss vs Epoch

从上面的损失与历元图中,我们看到训练进行得很好,并在大约 2000 个历元时开始饱和。

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

Accuracy of training nodes (trained nodes) and inference accuracy of masked nodes (untrained nodes) with epoch.

随着训练的进行,可以看到训练精度以及(屏蔽节点的)推断精度一起增加,直到大约 2000 个时期,推断精度开始饱和在大约 50%。考虑到我们有 66 个类,如果我们假设该模型完全是随机预测的,那么它将具有 1.5 %的基线准确性,因此 50%的推断准确性看起来已经很好了。这告诉我们,在对已标记章节进行适当训练之后,GCN 模型能够在大约 50 %的时间内正确地推断出给定的未标记章节属于哪本书。

分类错误的章节

GCN 模型能够很好地捕捉文档内和文档间的上下文,但是对于分类错误的章节呢?这是否意味着 GCN 模式在这些方面失败了?让我们看看其中的几个来找出答案。

  • 书:马太福音第 27 章:“到了早晨,众祭司长和长老商议,要把耶稣治死。他们就把他捆绑带走,交给官长彼拉多。卖耶稣的犹大见自己将要被杀,就后悔把那三十块钱拿给祭司长和长老说,我把一个义人交在你们手里,是有罪的。但他们说,那与我们何干?这是你的事。他就把银子放在殿里,出去,并且吊死了。祭司长拿着银子说,不可把它放在殿里,因为这是血的价。他们就定意用这银子买窑匠的一块田,作为埋葬外乡人的地方。所以那块田名叫……他从死里复活了。并且后来的错,比先前的更重了。彼拉多对他们说,你们有看守的人。去尽你所能保证它的安全。他们就去了,把他的尸首藏起来,放在石头上,看守的人也和他们在一起。
    预言为:卢克

在这种情况下,马太福音第 27 章被错误地归类为路加福音。从上面,我们看到这一章是关于耶稣被祭司长处死,为我们的罪而死,以及犹大背叛耶稣后的罪。路加福音中也提到了这些事件。(在《马可福音》和《约翰福音》中也是如此)这很可能是为什么这个模型把它归类为《路加福音》的原因,因为它们有着相似的背景。

  • 书:以赛亚书
    第 12 章:“到那日,你必说,耶和华阿,我要称谢你;因为你虽然向我发怒,你的怒气却已转消,我也得了安慰。看哪,神是我的拯救。我要倚靠耶和华,并不惧怕。因为耶和华是我的力量,我的诗歌。他成了我的救星。你必从救恩的泉源欢欢喜喜地喝水。当那日,你们要说,你们要赞美耶和华,尊他的名为大。将他所行的传扬在万民中,称他的名被尊崇。向主歌唱;因为他行了奇事,要在全地传扬。锡安的居民哪,当扬声欢呼,因为在你们中间的以色列圣者,乃为至大。」
    预言为诗篇

在这里,以赛亚书的第 12 章被错误地推断为来自诗篇。从这一段可以清楚地看出,以赛亚书第 12 章的叙述者谈到了赞美上帝,上帝是他的安慰者和拯救的源泉。赞美上帝并向他寻求安慰正是诗篇的整个主题,大卫在他的成功、试炼和苦难中写下了他对上帝的赞美和祈祷!因此,难怪模型会将它归类为诗篇,因为它们共享相似的上下文。

结论

基于文本的图卷积网络确实是一个强大的模型,特别是对于半监督学习,因为它能够强烈地捕捉单词和文档之间以及跨单词和文档的文本上下文,并在已知的情况下推断未知。

GCNs 的应用程序实际上相当健壮且影响深远,本文只是提供了它能做什么的一瞥。一般来说,除了这里提出的任务,GCN 可以在任何时候使用,只要你想结合图形表示和深度学习的力量。为了提供一些有趣的例子供进一步阅读,GCN 已经与【递归神经网络(RNNs) / 【长短期记忆(lst ms)】结合用于动态网络/节点/边缘预测。通过将人体关节建模为图形节点,将人体结构和时间帧之间和内部的关系建模为图形边缘,它还成功应用于人体骨骼的动态姿态估计。

感谢阅读,我希望这篇文章有助于解释其内部工作。

有用的链接

  1. 圣经文本上的文本——https://github.com/plkmo/Bible_Text_GCN 的 GCN 实现——
  2. 文本-通用语料库上的 GCN 实现(在其他自然语言处理任务中)——https://github.com/plkmo/NLP_Toolkit

参考文献

  1. 托马斯·n·基普夫马克斯·韦林带图卷积网络的半监督分类(https://arxiv.org/abs/1609.02907)(2016)
  2. 成胜茂罗原用于文本分类的图卷积网络(https://arxiv.org/abs/1809.05679)(2018)

要了解最新的人工智能/数据科学趋势、论文和新闻,请查看我的@ follow AI _ bot(https://t.me/followai_bot),这是您的个性化人工智能/数据科学电报机器人。

文字可以很美

原文:https://towardsdatascience.com/text-can-be-beautiful-226ea089513a?source=collection_archive---------17-----------------------

可视化如何发现文本数据中隐藏的模式

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

Modern Slavery Act filings: We will be building an interactive visualisation to uncover key trends and insights from a series of text documents. Words at the top right are common across the two industries analysed. Words at the bottom left are uncommon across the industries.

互联网上充斥着关于自然语言处理的文章。其中许多描述了如何建立分类系统,执行主题建模,问题回答。很少有人对文本语料库进行更全面的分析,更少有人展示如何以可视化、交互式和易于理解的格式构建输出。

在现实世界中,找到方法理解数据集中文本如何以及为什么不同通常要有用得多。接受客户评论;虽然根据内容预测评论评级可能有用,但更有价值的是了解为什么客户会对特定产品或服务给出正面或负面的评论。

这可以用来创建更有效的营销,通知未来的产品开发,甚至设计客户支持流程,以适应通过产品审查确定的问题。预测模型能做到所有这些吗?不,它不能。

在本帖中,我们将分析数千家公司的现代奴隶制回报,以了解企业正在做出哪些承诺来防止现代奴隶制,然后我们将使用先进的可视化技术来确定不同行业如何应对内部和供应链中的现代奴隶制风险。

一个重要的题外话:现代奴隶制

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

Shellfish Gathering is just one of many industries with a high inherent risk of Modern Slavery

如果您已经阅读了我以前在 Medium 上的帖子,您可能已经了解了正在使用的底层数据。这与 2015 年以来数千家英国和国际公司提交的现代奴隶制申报表有关。为什么要用这个数据?下面是一个重要的,如果忧郁,离题到现代奴隶制和防止它的措施。

现代奴隶制是一个大问题。据估计,仅在英国,每年就要花费纳税人 43 亿英镑。作为一种犯罪,它对受害者和社会的危害仅次于杀人。

“剥削和奴役世界各地和英国境内的男人、女人和儿童是最令人震惊的罪行之一,也是最有利可图的罪行之一。”

男爵夫人巴特勒-斯洛斯,2004 年前任上诉法院大法官

据估计,英国有 136,000 人(1/500)是现代奴隶制的受害者,自 2013 年以来,这一数字增长了 10 倍。与现代奴隶制有关的罪行令人憎恶。例子包括劳动剥削、性剥削、家庭奴役、摘取器官和犯罪剥削。

受害者被武力、威胁、胁迫、绑架、欺诈和欺骗所控制。

正在采取什么措施来防止它?

《2015 年现代奴隶制法案》旨在打击英国的现代奴隶制。该法案的一部分要求营业额超过 3600 万英镑的公司公布他们在业务和供应链中为防止现代奴隶制所做的工作。截至 2019 年 4 月,有 8700 份声明被标识为已发布

但是公司实际在做什么呢?他们承诺什么?他们正在实施什么流程?不同的行业如何处理这个问题?

用空间确定公司承诺

为了了解公司正在积极做什么和承诺做什么,我们需要创造一种智能的方式来识别每一个现代奴隶制回归中的这种承诺。

典型的回报将包括许多不相关的信息,如公司背景和现代奴隶制法案。幸运的是,使用 SpaCy NLP 库,我们可以使用其强大的匹配功能过滤掉这些内容。

文本匹配的问题是,即使使用正则表达式这样的技术,它也会很快变得很麻烦。问题是在寻找一个简单的模式时,你需要考虑所有不同的短语组合。例如,我们感兴趣的是识别包含如下语句的短语:

"We are committed to..."

然而,下面的短语也会引起我们的兴趣,我们怎样才能在不为每个例子都写代码的情况下将它们包含在我们的分析中呢?

"We promise to"
"We have committed to"
"We will continue to"
"[COMPANY NAME] has committed to"
"[COMPANY NAME] has implemented"

词性匹配

SpaCy 中的匹配引擎允许您使用词性(POS)标签将短语匹配到特定模式,例如,我们可以过滤一系列词性标签,而不是搜索特定的单词:

PRON, VERB, VERB

这种匹配从《现代奴隶回归》的片段中识别出以下短语:

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

Even using a very simple POS filter we can identify phrases which denote commitments made from businesses in their Modern Slavery returns. The match here is highlighted in yellow.

SpaCy 甚至提供了一个在线工具来帮助构建和检查不同规则的结果:

基于 SpaCy 法则的匹配器

创建一套产生良好结果的规则根本不需要很长时间。下面的代码实现了这些规则,并返回已识别结果的整个句子:

def collect_sents(matcher, doc, i, matches):
    match_id, start, end = matches[i]
    span = doc[start:end]  # Matched span
    sent = span.sent  # Sentence containing matched span
    # Append mock entity for match in displaCy style to matched_sents
    # get the match span by ofsetting the start and end of the span with the
    # start and end of the sentence in the doc
    match_ents = [{
        "start": span.start_char - sent.start_char,
        "end": span.end_char - sent.start_char,
        "label": "MATCH",
    }]
    matched_sents.append({"text": sent.text, "ents": match_ents})

matcher = Matcher(nlp.vocab)
#this type of pattern matching requires SpaCy >2.1:pattern = [{'POS': {'IN': ['PROPN', 'PRON']}, 'LOWER': {'NOT_IN': ['they','who','you','it','us']}  },
           {'POS': 'VERB', 'LOWER': {'NOT_IN': ['may','might','could']}  },
           {'POS': {'IN': ['VERB', 'DET']}, 'LOWER': {'NOT_IN': ['a']}}]
matcher.add("commit", collect_sents, pattern)pattern = [{'POS': {'IN': ['PROPN','PRON']}, 'LOWER': {'NOT_IN': ['they','who','you','it','us']}  },
           {'POS': 'VERB', 'LOWER': {'NOT_IN': ['may','might','could']}},
           {'POS': 'ADJ'},
           {'POS': 'ADP'}]
matcher.add("commit", collect_sents, pattern)

不同行业如何应对现代奴隶制?

现在,我们已经从公司提交的报告中筛选出一系列承诺和行动,这能告诉我们不同行业如何应对现代奴隶制?

在这个分析中,我们将使用由 Jason Kessler 开发的神奇的散射文本库。

这使用了一种简单而强大的方法来查找分隔两类文本的关键词和短语。然后,结果可以很容易地输出到交互式可视化。

下面的代码过滤了我们现代奴隶制回归到两个高风险行业:建筑业和零售业。然后,它创建一个文本语料库,用于散点文本可视化:

#select industries to compare:
ind1 = 'Specialty Retail'
ind2 = 'Construction & Engineering'#Filter into a new df with 3 columns one for industry, one for company and the third containing the text
ftr      = (df['Industry'] == ind1) | (df['Industry'] == ind2)
df_corp  = df.loc[ftr]
df_corp  = df_corp[['Industry','Company','clean text']]#Create a scattertext corpus from the df:
corpus = st.CorpusFromPandas( df_corp, 
                              category_col='Industry', 
                              text_col='clean text',
                              nlp=nlp).build()

完成后,我们可以运行下面的来创建一个交互式的散射文本输出:

html = st.produce_scattertext_explorer(corpus,
         category='Construction & Engineering',
         category_name='Construction & Engineering',
         not_category_name=ind1,      
         width_in_pixels=1600)
open("MS-Visualization.html", 'wb').write(html.encode('utf-8'))
HTML(html)

这会产生以下输出:

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

The output from comparing two industries Modern Slavery returns in ScatterText

该图按两个类别(在本例中为零售业和建筑业)绘制了单词分布图。右上角的单词在两个类别中都很常见,左下角的单词在两个类别中都不常见。

左上角和右下角的文字显示了这两个行业在反对现代奴隶制的方法上的主要区别。点击一个单词会显示它在语料库中的使用位置。这有助于找到特定单词和短语在一个行业中出现而在另一个行业中不出现的上下文和原因。完整的输出可以在本文末尾下载。

经过短短几分钟的分析,很容易发现这两个行业在处理现代奴隶制问题的方式上的显著差异(粗体项目代表图表中已经分析过的单词):

施工

  • 建筑业已经有了关于质量管理( ISO 9001)和环境管理体系( ISO 14001)的规定。公司正在利用这些标准制定的流程来帮助应对现代奴隶制风险。
  • 行业意识到分包商构成风险,但目前几乎没有对分包商实施检查或控制。
  • 它更加重视内部员工。由人力资源部门和直线经理负责将流程落实到位以降低风险。

零售

  • 零售业在方法上更多地面向外部;重视在高风险地区对供应商进行的审计 s (印度、中国和土耳其经常被归类为高风险国家)。
  • 在零售业,人们更加关注供应链和直接供应商之外的映射,以了解供应网络的第一层下面是什么。很明显,一些公司在这方面比其他公司取得了更大的进步。

结束语:

能够浏览成千上万的文档并即时了解各行业趋势的价值是巨大的。它可用于:

  • 突出最佳实践;
  • 帮助将创新从一个行业带到其他行业;
  • 找出在防止现代奴隶制方面做得不够的地方。

希望这篇文章有助于展示一些简单但强大的 NLP 和可视化技术可以打开非结构化数据中的洞见。

进一步阅读

下面的 Colab 笔记本包含了这篇文章中使用的所有代码:

[## 谷歌联合实验室

现代奴隶制分析

colab.research.google.com](https://colab.research.google.com/drive/1VIMd9jhpNgB9siYlTSFqjV62mMQQFx4K)

要查看交互式散射文本输出,请参见下面的嵌入内容:

[## MS-ScatterText.html

分散文本输出

drive.google.com](https://drive.google.com/open?id=1nNrw8UGboV3-RvMUWIXuQd16VOEa_pNz)

这是 NLP 关于现代奴隶制回归分析的迷你系列的一部分。要查看相关文章,请参见以下内容:

[## ELMo:上下文语言嵌入

使用 ELMo 的深层语境化语言表示创建语义搜索引擎,以及为什么语境是…

towardsdatascience.com](/elmo-contextual-language-embedding-335de2268604) [## 增压词向量

一个在你的 NLP 项目中提升快速文本和其他单词向量的简单技术

towardsdatascience.com](/supercharging-word-vectors-be80ee5513d) [## 使用无监督的机器学习清理您的数据

清理数据不一定是痛苦的!这篇文章是一个如何使用无监督机器学习的快速例子…

towardsdatascience.com](/clean-your-data-with-unsupervised-machine-learning-8491af733595)

Python 中的文本分类

原文:https://towardsdatascience.com/text-classification-in-python-dd95d264c802?source=collection_archive---------0-----------------------

一个端到端的机器学习项目

学习用 Python 构建文本分类模型

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

本文是我将涵盖开发一个机器学习项目的整个过程的系列文章的第一篇。

在这篇文章中,我们集中在用 Python 训练一个监督学习文本分类模型。

写这些文章背后的动机如下:作为一名学习数据科学家,他已经使用数据科学工具和机器学习模型工作了相当长的时间,我发现互联网、书籍或文献中的许多文章通常都非常关注建模部分。也就是说,给我们一个特定的数据集(如果是监督学习问题,已经分配了标签),尝试几个模型并获得一个性能度量。这个过程到此结束。

但是在现实生活问题中,我认为用正确的超参数找到正确的模型只是任务的开始。当我们部署模型时会发生什么?它将如何应对新数据?这些数据看起来会和训练数据集一样吗?也许,会有一些我们需要的信息(缩放或功能相关的信息)?会有吗?用户会允许并理解与结果相关的不确定性吗?如果我们想成功地将基于机器学习的服务带给我们的最终用户,我们必须问自己这些问题。

出于这个原因,我开发了一个项目,涵盖了创建基于 ML 的服务的整个过程:获取原始数据并解析它,创建功能,训练不同的模型并选择最佳模型,获取新数据以提供给模型,并向最终用户显示有用的见解。

该项目包括创建一个实时 web 应用程序,该应用程序从几家报纸收集数据,并显示新闻文章中讨论的不同主题的摘要。

这是通过能够预测给定新闻文章类别的监督机器学习分类模型、从报纸获取最新新闻的网络搜集方法以及向用户显示所获得结果的交互式网络应用来实现的。

这可以看作是一个文本分类的问题。文本分类是在不同的商业问题中广泛使用的自然语言处理(NLP)应用之一。

这些文章的目标读者是已经对基本的机器学习概念有所了解的人(例如,知道什么是交叉验证以及何时使用它,知道逻辑回归和线性回归之间的区别等等)。但是,我将简要说明项目中涉及的不同概念。

github 回购可以在这里找到。它包括所有的代码和一个完整的报告。我不会在这篇文章中包含代码,因为它太大了,但是我会在需要的地方提供一个链接。

我将这个过程分为三个不同的岗位:

  • 分类模型培训(本岗位)
  • 新闻文章网页抓取(链接
  • 应用创建和部署(链接)

本帖涵盖第一部分:分类模型训练。我们将在以下步骤中介绍它:

  1. 问题定义和解决方法
  2. 输入数据
  3. 初始数据集的创建
  4. 探索性数据分析
  5. 特征工程
  6. 预测模型

1.问题定义和解决方法

正如我们已经说过的,我们正在讨论一个监督学习的问题。这意味着我们需要一个带标签的数据集,这样算法就可以学习数据中的模式和相关性。幸运的是,我们有一个可用的,但在现实生活中,这是一个关键的步骤,因为我们通常必须手动完成任务。因为,如果我们能够自动化标记一些数据点的任务,那么我们为什么需要一个分类模型呢?

2.输入数据

这个项目中使用的数据集是 BBC 新闻原始数据集。可以从这里下载。

它由来自 BBC 新闻网站的 2225 份文件组成,对应于 2004 年至 2005 年五个主题领域的故事。这些领域是:

  • 商业
  • 娱乐
  • 政治
  • 运动
  • 技术

下载文件包含五个文件夹(每个类别一个)。每个文件夹都有一个*。每篇新闻文章的 txt* 文件。这些文件包括原始文本的新闻文章正文。

3.初始数据集的创建

此步骤的目的是获得具有以下结构的数据集:

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

我们用 R 脚本创建了这个数据集,因为包 readtext 简化了这个过程。剧本可以在这里找到。

4.探索性数据分析

通常的做法是进行探索性数据分析,以便从数据中获得一些见解。然而,到目前为止,我们还没有任何定义数据的特性。我们将在下一节中看到如何从文本中创建特征。特性工程),但是,由于这些特性的构造方式,我们不期望从分析它们中得到任何有价值的见解。为此,我们只进行了粗浅的分析。

在开发分类模型时,我们主要关心的一个问题是不同的类是否是平衡的。这意味着数据集包含每个类的大致相等的部分。

例如,如果我们有两个类,并且 95%的观察值属于其中的一个,一个总是输出多数类的哑分类器将有 95%的准确性,尽管它会使少数类的所有预测失败。

有几种处理不平衡数据集的方法。第一种方法是欠采样多数类和过采样少数类,以便获得更平衡的数据集。其他方法可以使用精度之外的其他误差度量,例如精度召回F1 分数。稍后我们将详细讨论这些指标。

查看我们的数据,我们可以得到属于每个类别的观察值的百分比:

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

我们可以看到,类是近似平衡的,所以我们不会执行任何欠采样或过采样方法。然而,我们无论如何都会使用精度和召回率来评估模型性能。

另一个感兴趣的变量可以是新闻文章的长度。我们可以获得跨类别的长度分布:

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

我们可以看到,政治和科技文章往往更长,但并不显著。此外,我们将在下一节中看到,我们用来创建特征的方法会考虑并修正文章的长度。所以这对我们来说没什么大不了的。

EDA 笔记本可以在这里找到。

5.特征工程

特征工程是构建任何智能系统的基本部分。正如吴恩达所说:

“想出新功能既困难又耗时,需要专业知识。‘应用机器学习’基本上是特征工程。”

特征工程是将数据转换为特征以充当机器学习模型的输入的过程,以便高质量的特征有助于提高模型性能。

处理文本数据时,有几种方法可以获取表示数据的特征。我们将介绍一些最常见的方法,然后选择最适合我们需要的方法。

5.1.文本表示

回想一下,为了表示我们的文本,数据集的每一行都将是语料库的单个文档。根据我们选择的特征创建方法,列(特征)会有所不同:

  • 字数统计向量

使用这种方法,每一列都是语料库中的一个术语,每个单元格都代表每个文档中每个术语的频率计数。

  • TF–IDF矢量

TF-IDF 是表示一个术语在文档和整个语料库中的相对重要性的分数。 TF 代表词频IDF 代表逆文档频率:

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

TF-IDF 值与单词在文档中出现的次数成比例增加,并被语料库中包含该单词的文档数量所抵消,这有助于调整某些单词通常更频繁出现的事实**。**

它还考虑了这样一个事实,即通过规范化 TF 术语(表示相对术语频率),一些文档可能比其他文档大。

这两种方法(单词计数向量和 TF-IDF 向量)通常被称为单词袋方法,因为句子中单词的顺序被忽略了。下面的方法更先进,因为它们以某种方式保留了单词的顺序和它们的词汇考虑。

  • 单词嵌入

单词在向量空间中的位置是从文本中学习的,并且是基于当使用单词时该单词周围的单词。单词嵌入可以与应用迁移学习的预训练模型一起使用。

  • 基于文本或基于自然语言处理的特征

我们可以手动创建我们认为在区分类别时可能很重要的任何特征(例如,单词密度、字符数或单词数等)。

我们还可以使用词性模型来使用基于 NLP 的特征,词性模型可以告诉我们,例如,一个单词是名词还是动词,然后使用词性标签的频率分布。

  • 话题模型

潜在狄利克雷分配等方法试图通过词的概率分布来表示每个主题,这就是所谓的主题建模。

我们选择了 TF-IDF 向量来表示我们语料库中的文档。这次选举的动机是以下几点:

  • TF-IDF 是一个简单的模型,它在这个特定的领域产生了巨大的成果,我们将在后面看到。
  • TF-IDF 功能创建是一个快速过程,这将使我们在用户使用 web 应用程序时缩短等待时间。
  • 我们可以调整特征创建过程(见下一段)来避免像过度拟合这样的问题。

使用此方法创建特征时,我们可以选择一些参数:

  • N-gram 范围:我们能够考虑一元,二元,三元…
  • 最大/最小文档频率:在构建词汇表时,我们可以忽略文档频率严格高于/低于给定阈值的术语。
  • 最大特征:我们可以选择语料库中按词频排序的前 N 个特征。

我们选择了以下参数:

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

我们希望二元模型通过考虑文档中经常一起出现的单词来帮助提高我们的模型性能。我们已经选择了一个最小 DF 值等于 10,以排除在超过 10 个文档中不出现的极其罕见的单词,以及一个最大 DF 值等于 100%,以不忽略任何其他单词。之所以选择 300 作为最大特征数,是因为我们希望避免可能的过拟合,过拟合通常是由于与训练观察的数量相比,特征的数量太多而引起的。

正如我们将在接下来的章节中看到的,这些值使我们达到真正高精度的值,所以我们将坚持使用它们。然而,为了训练更好的模型,可以调整这些参数。

有一个重要的考虑需要提及。回想一下 TF-IDF 分数的计算需要存在一个文档语料库来计算逆文档频率项。因此,如果我们想一次预测一篇新闻文章(例如,一旦部署了模型),我们就需要定义这个语料库。

这个语料库是一组训练文档。因此,当从新文章中获取 TF-IDF 特征时,将仅为该新文章创建存在于训练语料库中的特征。

很容易得出这样的结论:当模型被部署时,训练语料与我们将要搜集的消息越相似,我们可能获得的准确性就越高。

5.2.文本清理

在从原始文本创建任何特征之前,我们必须执行一个清理过程,以确保模型中没有引入失真。我们遵循了以下步骤:

  • **特殊字符清理:**特殊字符,如" \n "双引号必须从文本中删除,因为我们不期望它们有任何预测能力。
  • 例如,我们会认为“书”和“书”是同一个单词,具有相同的预测能力。因此,我们把每一个字都写了下来。
  • **标点符号:**字符如“?”, “!”, ";"已被移除。
  • **所有格代词:**此外,我们会期望“Trump”和“Trump 的”具有相同的预测能力。
  • **词干化或词条化:**词干化是将派生单词还原到其词根的过程。引理化是将一个词简化为其引理的过程。这两种方法的主要区别在于,词汇化提供了现有的单词,而词干化提供了可能不是现有单词的词根。我们使用了一个基于 WordNet 的 Lemmatizer。
  • **停用词:**像“what”或“the”这样的词没有任何预测能力,因为它们可能对所有文档都是通用的。因此,它们可能代表可以消除的噪声。我们已经从 nltk 包中下载了一个英语停用词列表,然后将它们从语料库中删除。

在这一点上,有一个重要的考虑事项必须要做。我们应该考虑到可能出现的失真,这些失真不仅出现在训练测试中,还会出现在运行 web 应用程序时收集的新闻文章中。

5.3.标签编码

机器学习模型需要数字特征和标签来提供预测。因此,我们必须创建一个字典来将每个标签映射到一个数字 ID。我们创建了这个映射方案:

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

5.4.列车-测试分离

在预测未知数据时,我们需要设置一个测试集来证明模型的质量。我们选择了一个随机分割,85%的观察值组成训练测试,15%的观察值组成测试集。我们将在训练数据中执行交叉验证的超参数调整过程,拟合最终模型,然后使用完全不可见的数据对其进行评估,以获得偏差尽可能小的评估指标。

完整详细的特征工程代码可在这里找到。

6.预测模型

6.1.超参数调整方法和模型

我们已经测试了几个机器学习模型,以找出哪一个可能更适合数据,并正确地捕捉点及其标签之间的关系。由于我们拥有的数据量不足,我们只使用了经典的机器学习模型,而不是深度学习模型,这可能会导致模型过度拟合,无法对看不见的数据进行很好的概括。

我们尝试了以下模型:

  • 随机森林
  • 支持向量机
  • k 个最近邻居
  • 多项式朴素贝叶斯
  • 多项式逻辑回归
  • 梯度推进

它们中的每一个都有多个超参数需要调整。在为每个模型定义最佳超参数集时,我们遵循了以下方法:

首先,我们已经决定了我们想要为每个模型调整哪些超参数,考虑到那些可能对模型行为有更大影响的超参数,并且考虑到大量的参数将需要大量的计算时间。

然后,我们定义了一个可能值的网格,并使用三重交叉验证(50 次迭代)执行了一个随机搜索。最后,一旦我们获得了具有最佳超参数的模型,我们已经使用以这些值为中心的三重交叉验证执行了网格搜索,以便在超参数空间中彻底搜索最佳性能组合。

我们遵循这种方法,因为通过随机搜索,我们可以覆盖每个超参数的更大范围的值,而不会导致真正高的执行时间。一旦我们缩小了每个设置的范围,我们就知道在哪里集中搜索,并明确指定要尝试的每个设置组合。

选择𝐾 = 3 作为随机搜索中的折叠数和 50 次迭代的原因来自于较短执行时间或测试大量组合之间的权衡。在选择流程中的最佳模型时,我们选择了准确性作为评估标准。

6.2.性能测定

在通过交叉验证对训练数据执行超参数调整过程并将模型拟合到该训练数据之后,我们需要在完全看不见的数据(测试集)上评估其性能。在处理分类问题时,有几个度量标准可用于深入了解模型的执行情况。其中一些是:

  • 准确性:准确性度量测量正确预测与评估的实例总数的比率。
  • Precision: precision 用于度量从一个肯定类中的所有预测模式中正确预测的肯定模式。
  • 回忆:回忆被用来衡量被正确分类的积极模式的比例
  • f1-得分:此指标表示召回率和精确度值之间的调和平均值
  • ROC 曲线下面积(AUC):这是在各种阈值设置下对分类问题的性能测量。ROC 是概率曲线,AUC 代表可分性的程度或度量。它告诉我们一个模型在多大程度上能够区分不同的类。

这些度量被高度扩展并广泛用于二进制分类。然而,当处理多类分类时,它们变得更加复杂,难以计算和解释。此外,在这个特定的应用程序中,我们只希望正确预测文档。假阳性或假阴性的成本对我们来说是一样的。出于这个原因,我们的分类器是更具体还是更敏感对我们来说并不重要,只要它能正确地分类尽可能多的文档。因此,我们研究了比较模型和选择最佳超参数时的精度。在第一种情况下,我们计算了训练集和测试集的准确性,以便检测过度拟合模型。然而,我们还获得了每个模型的混淆矩阵和分类报告(计算所有类的精确度、召回率和 F1 值),因此我们可以进一步解释它们的行为。

6.3.最佳型号选择

下面我们展示了不同模型及其评估指标的摘要:

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

总的来说,我们为每个模型获得了非常好的精度值。我们可以观察到梯度增强、逻辑回归和随机森林模型似乎过拟合,因为它们具有极高的训练集精度,但测试集精度较低,因此我们将丢弃它们。

我们将在剩余的模型中选择 SVM 分类器,因为它具有最高的测试集精度,这实际上接近于训练集精度。SVM 模型的混淆矩阵分类报告如下:

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

6.4.模型解释

在这一点上,我们已经选择了 SVM 作为我们进行预测的首选模型。现在,我们将通过分析错误分类的文章来研究它的行为,以便获得关于模型工作方式的一些见解,并且如果必要的话,思考添加到模型中的新特性。回想一下,虽然超参数调整是一个重要的过程,但开发机器学习项目时最关键的过程是能够从数据中提取良好的特征。

让我们举一个分类错误的文章的例子。它的实际类别是政治,尽管这个模型预测的是科技。

议员发出黑莓威胁

众议院议长迈克尔·马丁裁定,如果议员们在众议院使用黑莓手机,他们将被赶出下议院。

这 200 台掌上电脑可以用作电话、传呼机或发送电子邮件。这些设备在本周获得了新的关注,因为阿拉斯泰尔·坎贝尔用他的手机意外地向《新闻之夜》的一名记者发送了一条充满诅咒的信息。马丁先生透露,一些议员在辩论中一直使用他们的黑莓手机,他还警告议员们不要使用隐藏的耳机。

长期以来,在下议院使用电子设备是不被允许的。手机或寻呼机的声音会招致议长或副议长的强烈指责。议长主持下议院的辩论,负责确保议院的秩序,执行众议院的规则和惯例。他或她总是由同事们选择的议员,一旦被提名,就放弃所有政党的忠诚。

这篇文章谈的是下议院禁止黑莓手机的问题。它既涉及政治又涉及技术,所以这种错误分类是有道理的。

6.5.降维图

降维指的是将具有大量维度的一组数据转换成具有较少维度的数据的过程,以确保其简明地传达相似的信息。

降维技术在机器学习中有许多应用。其中之一是可视化。通过将维度空间减少到包含大部分信息的 2 或 3 维,我们可以绘制我们的数据点,并能够将一些模式识别为人类。

我们使用了两种不同的降维技术:

  • 主成分分析:该技术依赖于获得数据矩阵的特征值和特征向量,并试图提供最少数量的变量,以保持最大的方差。
  • t-SNE:t 分布随机邻居嵌入是一种概率技术,特别适用于高维数据集的可视化。它最小化两个分布之间的差异:测量输入对象的成对相似性的分布和测量嵌入中相应低维点的成对相似性的分布。

让我们画出结果:

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

我们可以看到,使用 t-SNE 技术更容易区分不同的类。虽然我们只使用了降维技术进行绘图,但我们可以使用它们来减少特征的数量,以支持我们的模型。由于通常大量的特征,这种方法在文本分类问题中特别有用。

6.6.预测条件概率

在进入网页抓取过程之前,我们还需要做一个额外的考虑。训练数据集的文章被标记为商业、娱乐、体育、科技和政治。但是我们可以想到不适合任何一个的新闻文章(例如,天气新闻文章)。由于我们已经开发了一个监督学习模型,这类文章会被错误地归类到 5 类中的一类。

此外,由于我们的训练数据集的日期是 2004-2005 年,因此在搜集最新文章时可能会出现许多新概念(例如,技术概念),但这些概念不会出现在训练数据中。同样,我们预计在这些情况下预测能力很差。

许多分类模型不仅提供某个数据点所属的类别。它们还可以提供属于𝐶.类的条件概率

例如,当我们有一篇明确谈论政治的文章时,我们期望属于政治类的条件概率非常高,而其他 4 个条件概率应该非常低。

但是当我们有一篇关于天气的文章时,我们期望所有条件概率向量的值都一样低。

因此,我们可以用这种思路指定一个阈值:如果最高条件概率低于阈值,我们将为文章提供无预测标签。如果更高,我们会分配相应的标签。

经过一个简短的研究,探索不同的文章,可能不属于任何 5 个类别,我们已经固定在 65%的阈值。

有关模型培训流程所有步骤的更多详情,请访问此链接

在这一点上,我们已经训练了一个模型,它将能够对我们输入的新闻文章进行分类。我们离构建我们的应用又近了一步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值