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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

附加 CSV 文件

原文:https://towardsdatascience.com/appending-csv-files-d31a08153e0c?source=collection_archive---------28-----------------------

使用 Power BI、R、Power Shell 或 CMD 完成此操作

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

丹尼斯·强森在 Unsplash 拍摄的照片

你曾经不得不合并多个 CSV 文件吗?我相信这是每个数据分析师或数据科学家在某个时候必须完成的任务,而且确实是一项奇怪的任务。他们当初为什么要分开?连接到源不是更好吗?有时候最好的解决方案并不总是可行的。

如果你发现自己在打开 Excel、复制文件和处理 10 个不同的工作簿,那么这篇文章就是为你准备的。我将向您展示附加文件的不同方式。你不仅可以节省时间,还可以避免犯错误。相信我,在我发现权力 BI 和 r 之前,我曾经这样做过。

如果你不必这样做,并且对 Power BI 和 R 非常熟悉,那么我相信你会发现一些有命令行和 Power Shell 的有趣脚本。

让我们开始吧。

我这里有 6 个图像文件,每个文件有 29 列。

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

图片来自作者

这些都位于一个文件夹中。我试图得到的最终结果是一个更大的文件,将所有 6 个合并成一个。这里的数字无关紧要,可以是 6,也可以是 100。流程还是一样的:)

我们为什么要合并这些?原因各不相同。有时使用大表进行简单分析会更容易。有时可能是因为数据类型问题,文件无法加载。在任何情况下,都有不同的工具来附加这些文件。

Power BI — Power 查询文件夹组合

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

作者图片

有了 Power BI,您只需进入 Power BI,使用“连接到文件夹”即可连接所有内容。

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

给你 Power Query 中的所有文件供你组合和加载。

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

作者图片

有时 Power BI 可能会发现数据错误,无法加载这些文件。这里有一篇文章讲述了一些错误以及如何修复它们。

由于列错误,Power BI 将无法加载所有这些文件。有时一个单元格可能有字母,但 Power BI 将该列归类为数字。这将导致错误。

作为一个快速提示,在加载文件时删除“更改类型”步骤。它造成的错误似乎多于它的用处。如果我去掉这一步,您可以看到 Power BI 能够加载所有内容。

PRO :不需要代码,只需要点击。简单的导航和 GUI。允许您使用表格函数和自定义函数通过表格和函数进行其他类型的分析。

缺点:速度慢,可能无法工作,如果有数据类型错误,需要排除故障。如果您有大量的文件,并且在等待之后发现一个类型错误,您会感到沮丧。

R- VROOM 联合收割机

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

作者图片

在这里,我可以使用包调用 VROOM,获取文件夹中的所有文件名,并将其全部合并。

在 R Studio 中键入

library(vroom)setwd("Your folder directory")Files = dir_ls(glob = "*.csv")Files_Combined = vroom(Files)

这里的脚本说要设置你的工作目录,使用 dir_ls ,过滤任何以“.”结尾的内容。csv "并将其保存到一个变量调用文件中。然后 vroom() 读取“文件”并赋给结束变量调用 Files_Combined。

这里——它对我不太适用,因为其中一个文件有 150 列。

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

作者图片

要纠正这一点,您可以使用地图。如果您不熟悉 R,map 会对所提供的变量应用一个函数。在这种情况下,它是文件—包含我们想要加载的 CSV 文件的名称。这里的函数是 vroom() ,这是加载函数。

library(vroom)setwd("Your folder directory")Files = dir_ls(glob = "*csv")Files_Combined = map(Files, ~vroom(.x))

这里所有的文件都将被加载,但是是列表格式的。然后,您可以通过子设置选择您想要的文件。您可以使用 Files_Combined[1:3]或使用名称 Files _ Combined[" your _ file _ name "]来引用实际文件本身。

:非常快!也真的很喜欢它的声音:)能够在 5 秒钟内加载列表格式的所有文件。

CON :假设您有相同数量的列标题。在运行 vroom 之前,我必须做一些调整,看看哪个文件有额外的列。如果数据框中的一列为数字,另一列为字符,则无法绑定行。

PowerShell —获取内容|添加内容

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

作者图片

下面是将这些文件合并成一个 CSV 文档的脚本。你可以在启动菜单中输入“PowerShell ISE ”, PowerShell 就会被加载。

会出现一个蓝屏——别担心这不是死亡蓝屏。😃

你可以在这里输入。

cd "Your folder directory"Get-ChildItem -Filter *csv | Get-Content | Add-Content "Combined.csv"

Get-child item将列出该文件夹中的所有文件。如果你愿意,你甚至可以使用 -Recurse ,它会列出相关子文件夹中的所有文件。 Get-Content 取每个 csv 的内容,Add-Content将内容添加到一个名为" combined.csv "的新文件中。

俏皮:)

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

作者图片

***亲:*可靠。不会引发类型错误。它只是做你让它做的事。

反对意见:很好,没问题。很高兴看到它没有抛出任何错误!可能是一件好事也可能是一件坏事,额外的列没有被追加到新文件中。

命令行—复制和粘贴

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

作者图片

这个是我最喜欢的。只需在启动菜单中输入 CMD,就会出现一个黑屏。别担心,这只是命令提示符。

*cd "your folder directory"copy *csv combined.csv*

这一行简单的代码会将您创建的文件夹中的所有 CSV 文件复制到一个名为“combined.csv”的新文件中。

这里说的是复制所有以“csv”结尾的内容,并将它们放入一个名为“combined.csv”的文档中。

最棒的是,你可以在组合之前添加 grep 来过滤你想要的值。

*grep "your_item" *csv >> item.csv*

在这里,您从该文件夹中的所有 CSV 文件中“grep”您的项目,并将其导出到一个名为“item.csv”的新文件中

我确实喜欢这个:)

想象一下,你必须在 200 个文件中搜索一个项目,比如说一个账号?有 CMD 的 grep 是你的朋友。

***亲:*非常快,没有问题。3 秒内复制了所有内容。

***缺点:*如果你不知道你在读什么,那就有点神秘了。

结论

TL:DR??—我不是在评判。

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

作者图片

有不同的工具可用于附加 CSV。

最头痛的事情,至少对我来说,是处理类型问题。PowerShell 和 CMD 都可以跳过所有这些,为您提供一个分析表。

如果你只是想添加文件,做一些过滤和处理一个合并的文档,使用 PowerShell 或 CMD。之后,您可以使用 Power BI 或 R 进行分析,而不用担心数据格式问题。我还没有尝试过 CSVKIT,但当我这样做时,我一定会让你知道。

曾经有人问我:“你为什么要费心写作?反正你一篇文章挣不到 5 美元”。这是个很好的问题。事实是,我从别人那里学到了很多。我认为分享知识很重要。没有人能在没有他人帮助的情况下取得今天的成就。我们都相互依赖,不管是直接的还是间接的。

谢谢!祝您的数据之旅安全顺利:)

苹果的 M1 Pro 和 M1 Max 超过谷歌 Colab 高达 54%

原文:https://towardsdatascience.com/apples-m1-pro-and-m1-max-outperform-google-colab-by-up-to-54-cbf13c8b6357?source=collection_archive---------1-----------------------

2021 苹果 M1 Pro 和 M1 Max 机器学习速度测试对比

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

标志性的绿色充电灯又回来了。作者照片。

我使用的主键盘连接在 MacBook Pro 上。我在 MacBook Pro 上打这个。

作为一个技术呆子,当苹果发布了几款升级了硬件的新 MacBook Pro:M1 Pro、M1 Max 芯片和重新设计等等,我决定,我最好测试一下。

对于上下文,我制作关于机器学习的视频,编写机器学习代码,教授机器学习。

这就是本文的重点。

将苹果的 M1、M1 Pro 和 M1 Max 芯片与其他几款芯片进行对比。

怎么会?

四项测试:

  1. Final Cut Pro 导出 —各种 MacBook Pro 导出 4 小时长的 TensorFlow 教学视频(我制作编码教育视频)和 10 分钟长的故事视频(使用 H.264 和 ProRes 编码)的速度有多快?
  2. CreateML 图像分类机器学习模型创建 —各种 MacBook Pro 用 CreateML 把一万张图像变成一个图像分类模型能有多快?
  3. CIFAR10 TinyVGG 图像分类与 tensor flow(via**tensorflow-macos**)——多亏了tensorflow-metal,你现在可以利用你的 MacBook 的内部 GPU 来加速机器学习模型训练。这个和小一点的模型配起来怎么样?
  4. Food101 EfficientNetB0 用 **tensorflow-macos**进行特征提取——我很少从零开始训练机器学习模型。那么,新的 M1 Pro 和 M1 Max 芯片如何利用 TensorFlow 代码进行迁移学习呢?

本文严格关注性能。对于设计、输入、输出、电池寿命,还有很多其他资源。

硬件规格

我目前使用基于英特尔的 16 英寸 MacBook Pro 作为我的主机(几乎总是插着电源),2020 年的 13 英寸 M1 MacBook Pro 作为随身携带的选项。

为了训练更大的机器学习模型,我使用谷歌 Colab、谷歌云 GPU 或 SSH(通过互联网连接)连接到一台配备泰坦 RTX GPU 的专用深度学习 PC。

对于 TensorFlow 代码测试,我包括了与 Google Colab 和泰坦 RTX GPU 的比较。

这里的规格主要是基于英特尔的 MacBook Pro、M1、M1 Pro 和 M1 Max。

测试中 Mac 机型的不同硬件规格。

在每项测试中,所有的 MacBook Pro 都运行 macOS Monterey 12.0.1,并接通了电源。

实验 1: Final Cut Pro 导出(小视频和大视频)

我制作 YouTube 视频和教授机器学习的教育视频。

所以我用的机器必须能快速渲染和导出。这是我购买 2019 年 16 英寸 MacBook Pro 规格的主要原因之一,这样我就可以毫无延迟地编辑视频。

此外,M1 专业和 M1 最大芯片是针对专业人士。他们中的许多人编辑视频的质量比我高得多(目前)。

对于每个视频,我都将其导出为 H.264 编码(更高的压缩率,更多的 GPU 密集型)和 ProRes 编码(更低的压缩率,更少的 CPU 和 GPU 密集型)。

这是因为苹果公司声明,新的 M1 芯片有专门的 ProRes 引擎。

大型视频

实验详情:

有趣的是,当使用 H.264 编码时,新的 M1s (Pro 和 Max)占用的时间是基本 M1 的两倍,是基于英特尔的 Mac 的近四倍。

还应该注意的是,在使用 H.264 编码时,M1 Pro(约 89%空闲)和 M1 Max(约 68%空闲)上都有大量硬件处于空闲状态。

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

在导出到 H.264 编码时,M1 Pro 和 M1 Max 上的大量硬件被闲置。我不确定这是什么原因造成的。但这确实解释了为什么与其他 MAC 相比,它们的出口时间如此之长。

可能需要更新软件才能充分利用新芯片的全部功能?

不过,对于 ProRes 编码来说,情况就不同了。

ProRes 编码是较新的 M1 芯片真正闪光的地方。

与 H.264 编码相比,在 M1 Pro 和 M1 Max 上导出到 ProRes 时,会占用大量 CPU 资源。或许这是来自专用的 ProRes 内核?

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

导出到 ProRes 编码时,在 M1 Max 和 M1 Pro 上可以看到大量的 CPU 使用。**注:**所有屏幕记录均与结果跟踪分开进行。

然而,尽管 ProRes 编码导出比 H.264 快得多,但文件大小的差异使它对许多人来说几乎不可用。

将大视频导出到 H.264 时,文件大小为 7GB,导出到 ProRes 时,文件大小为 167GB。

我不知道你的网速,但这种视频需要三四天才能上传给我。

小视频

较小的视频产生了非常接近的结果。

实验详情:

所有的出口时间都非常相似。

但同样,当导出到 H.264 编码时,M1 Pro 和 M1 Max 芯片上有大量硬件闲置。

当使用 ProRes 编码时,M1 Pro 和 M1 Max 再次大放异彩。检查活动监视器显示了大量的 CPU 使用率,M1 Pro 的使用率为 350-450%,M1 Max 的使用率为 300-500%。

实验 2: CreateML 图像分类

CreateML 是苹果公司制作的机器学习 app,自带 Xcode(苹果公司制作 iOS 和 macOS 应用的软件)。

它提供了一种将数据转化为机器学习模型的简单方法。

我之所以尝试它,是因为我和我哥哥一直在用它制作 Nutrify (一款拍摄食物照片并了解食物的应用程序)上的原型模型。

它不仅适用于我们的用例,还能生成针对苹果设备优化的训练模型。

实验详情:

  • **数据:**所有 Food101 类的随机 10%子集(~7.5k 训练图像,~2.5k 测试图像)
  • 训练: 25 个历元,所有数据扩充设置开启
  • 模型: CreateML powered 模型(苹果没有告诉你用的是什么架构)

再一次,M1 Pro 和 M1 Max 之间没有太大的区别。尽管它们都比其他芯片表现出色。

在培训期间,检查 M1 专业版和 M1 最大版的活动监视器显示,在进程名称“MLRecipeExcecutionService”下有大量的 CPU 使用。

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

在 CreateML 应用程序中训练模型的过程中,CPU 使用率飙升至 500%以上。GPU 根本用不上多少。也许这是 16 核神经引擎在起作用?截图摄于 M1 专业版。

值得注意的是,在训练或特征提取期间,GPU 根本没有得到多少使用。

这让我相信 CreateML 使用 16 核神经引擎来加速训练。然而,这并没有得到 100%的证实,因为活动监视器并没有透露神经引擎何时启动。

现在 CreateML 也没有透露使用什么样的模型。从性能来看,我猜它至少会使用预训练的 ResNet50 型号或 EfficientNetB2 以上或类似型号。

实验三:带 TensorFlow 代码的 CIFAR10 TinyVGG 模型

CreateML 工作起来很棒,但有时你会想要制作自己的机器学习模型。

为此,您可能最终会使用 TensorFlow 这样的框架。

我教 TensorFlow 几乎每天都要编码。所以我很期待看到新机器在这里的表现。

对于所有自定义 TensorFlow 测试,所有机器都使用相同的数据集和相同的环境设置运行相同的代码。

唯一的区别是谷歌 Colab 和英伟达巨头 RTX 与每台 MAC 电脑之间的区别。

每台 Mac 都运行了[tensorflow-macos](https://developer.apple.com/metal/tensorflow-plugin/)(Mac 的 TensorFlow)和 [tensorflow-metal](https://developer.apple.com/metal/tensorflow-plugin/) 的组合,用于 GPU 加速。而 Google Colab 和 Nvidia TITAN RTX 使用的是标准 TensorFlow。

你可以在 GitHub 上看到所有实验和 TensorFlow 在 Mac 上设置的代码。

**注意:**我目前不知道有任何 PyTorch 等同于tensorflow-metal来加速 Mac GPUs 上的 PyTorch 代码。目前,PyTorch 只能在 Mac CPU 上运行。

首次 TensorFlow 实验详情:

  • **数据:**来自 TensorFlow 数据集的 cifar 10(32x 32 幅图像,10 个类别,50,000 次训练,10,000 次测试)
  • 型号: TinyVGG(来自 CNN Explainer 网站)
  • 训练: 10 个时期,批量 32
  • 代码: 在 GitHub 上看到

*对于 TensorFlow 实验,我使用谷歌 Colab 的免费版本,这是谷歌提供的一个非常棒的产品,可以使用连接到 GPU 的 Jupyter 笔记本,只需很少的设置。免费版本曾经提供更快的图形处理器(英伟达 P100,T4),然而,自从我获得其中一个已经有一段时间了。你可以通过 Colab Pro 获得更快的 GPU,但在我居住的地方(澳大利亚)还没有。

泰坦 RTX 胜过其他机器是有道理的。这是一个专门为机器学习和数据科学而构建的 GPU。

就每个时期的时间而言,所有 MAC 的性能或多或少在相同的范围内。M1 马克斯和平原 M1 机器运行代码在类似的时间。

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

使用较小的数据集(CIFAR10,32x32 图像大小)和使用 TensorFlow 代码制作的模型架构(TinyVGG)测试的不同设备的比较。

检查每台 M1 MAC 电脑的活动监视器发现,在培训期间使用了大量的 GPU。这要归功于苹果的[tensorflow-metal](https://developer.apple.com/metal/tensorflow-plugin/) PluggableDevice ,一个利用苹果金属 GPU 框架加速 TensorFlow 的软件包。

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

多亏了tensorflow-metal,在所有的 MAC 上,训练期间活动监视器中显示了大量的 GPU 使用情况。截图来自 M1 专业版。

实验 4:使用 TensorFlow 代码进行 Food101 EfficientNetB0 特征提取

最后的机器学习实验规模更大了。使用比实验 3 更多更大的图像。

当训练机器学习模型时,获得奇妙结果的最好方法之一是使用迁移学习。

迁移学习利用一个模型在类似数据集上学习到的权重(模式),并允许您将它们用于自己的数据集。

对于实验 4,我在 Food101 数据集上使用了 EfficientNetB0 模型的迁移学习。

实验详情:

  • 数据: Food101 来自 TensorFlow 数据集(224x224 幅图像,101 个类别,~75k 训练,~25k 测试)
  • 型号: EfficientNetB0 在 ImageNet 上预训练,顶层被替换(特征提取)
  • 训练: 5 个时期,批量 32
  • 代码: 在 GitHub 上看到

*在 16 英寸 MacBook Pro 上运行的代码使用了 SGD 优化器,而不是 Adam 优化器,因为在基于英特尔的 Mac 上运行的 *tensorflow-macos* 有一个未解决的问题,我找不到修复方法。

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

事实证明,对于更大规模的模型和数据集,更新的 M1 Pro 和 M1 Max 芯片比谷歌 Colab 的免费产品(K80 GPU)更快。M1 Max 甚至与泰坦 RTX 相差不远。

对我来说,最突出的是 M1 Pro 和 M1 Max 在放大到更大的实验时的性能。

实验 3 在所有 MAC 上看到了类似的结果,但当数据量增加时(图像大小和图像数量),M1 Pro 和 M1 Max 远远领先于其他 MAC。

M1 Pro 和 M1 Max 甚至超过了配备专用 Nvidia GPU 的谷歌 Colab(M1 Pro 快约 1.5 倍,M1 Max 快约 2 倍)。

这意味着你可以在本地机器上进行机器学习实验,比用在线的 Colab 笔记本更快。给你在本地跑步的所有好处。不过,Google Colab 确实给了你通过链接分享笔记本的神奇能力。

当然,泰坦 RTX 表现最好,但 M1 Max 也不甘落后,这对于便携式设备来说是非常令人印象深刻的。

活动监视器显示所有设备都使用了大量 GPU。

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

多亏了tensorflow-metal,所有 MAC 的 GPU 使用率在培训期间都很高。不过,看到神经引擎在这里发挥作用会很酷。CreateML 上的训练非常快。我想知道这是否可以用于定制代码。截图来自 M1 麦克斯。

应该买哪个?

在过去的一年里,我每天都在使用一台 13 英寸的 M1 MacBook Pro。我将它用于小规模的机器学习实验、视频编辑和谷歌 Colab 浏览器。

然而,我现在正在考虑用 M1 Pro 升级到 14 英寸的 MacBook Pro,并在需要时在泰坦 RTX 或云上升级之前在本地做一切事情(不再有谷歌 Colab)。

从测试来看,很明显 13 英寸的 M1 MacBook Pro(尽管这里没有测试,M1 MacBook Air 的性能应该仍然接近 M1 MacBook Pro 的结果)仍然是一款不可思议的笔记本电脑。

虽然如果你有预算,M1 专业版会给你一个明显的性能提升。

至于 M1 Max,我的测试很难证明它和 M1 Pro 之间 1100 美元的价格差距。对我来说,我宁愿把钱花在额外的本地存储、RAM 或专用 GPU 上。

简而言之,这些是我的建议:

  • 13 英寸的 M1 MacBook Pro/MacBook Air——对于初学机器学习和数据科学的人来说,这仍然是一款非常棒的笔记本电脑。
  • 14 英寸 M1 专业版 MacBook Pro —来自 M1 的显著性能提升,如果你喜欢新设计或有预算,这是值得的。
  • 14 英寸 M1 Max MacBook Pro——M1 Pro 的显著性能提升只有在大规模模型训练中,许多其他性能基准达到了与 M1 Pro 相同的水平。如果您发现自己经常编辑多个 4K 视频流,这可能是一个选项。

结论

我想看看苹果的专用芯片在什么地方,什么时候被使用。

例如,当神经引擎开始发挥作用时,看起来会很酷。比如在使用 CreateML 时(所有 M1 机器都在这里快速通过训练,就像没有明天一样)。

或者更好的是,如何编写代码来利用神经引擎本身?

去年,我说16 英寸 MacBook Pro 配 M2 怎么样,苹果送了一台 M1 Max。或许 M2 仍在以 Mac mini 或新款 iMac 的形式出现。

如果有什么是明确的,专用于某些目的的芯片似乎是趋势。性能优势不言自明。

资源

苹果的 neural hash——它是如何工作的,以及它可能如何受到损害

原文:https://towardsdatascience.com/apples-neuralhash-how-it-works-and-ways-to-break-it-577d1edc9838?source=collection_archive---------5-----------------------

人工智能校准和安全

技术指南、其漏洞和可能的缓解措施

苹果公司最近宣布了各种措施来打击儿童性虐待材料的传播(CSAM)。

接下来,iOS 和 iPadOS 将使用加密技术的新应用来帮助限制 CSAM 病毒在网上的传播,同时为用户隐私进行设计。CSAM 检测将帮助苹果公司向执法部门提供关于 iCloud 照片中 CSAM 收藏的有价值的信息。
—苹果声明宣布这些措施

其中包括使用一种被称为 NeuralHash 的新技术扫描 CSAM 的 iCloud 照片。

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

作者图片,灵感来自苹果关于 CSAM 探测的技术总结。这里列出的散列并不是真正的 CSAM 散列。这不包括细节,如致盲步骤。有关详细的图表,请参考技术总结。

苹果在扫描我的照片?!?

“扫描”可能是一个错误的词。实际上,苹果打算在不看你照片的情况下检查 CSAM。

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

照片由 Immo WegmannUnsplash 上拍摄

考虑一下指纹的概念——每个人都有其独特之处。它识别一个人,但它本身并不能告诉你这个人的任何信息。在计算机科学中,一个散列函数帮助我们计算一个散列,它的作用就像一个文件的指纹。散列对于文件来说(有点)是唯一的,但是它本身并不能告诉我们关于文件内容的任何事情。

如果两个文件产生相同的散列,它们很可能是同一个文件。就像如果两组指纹匹配,它们很可能来自同一个人。

苹果打算存储一个与已知 CSAM 相对应的哈希数据库。然后,通过散列你所有的 iCloud 照片,并将你的散列与 CSAM 散列数据库进行比较,苹果可以在不看你的 iCloud 照片的情况下识别匹配。

但是说起来容易做起来难。传统的哈希函数(MD5、SHA256 等。)对文件中的变化非常敏感。例如,这两个图像具有完全不同的 MD5 散列,尽管它们看起来相同(右边的一个在宽度上短了 2 个像素)。

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

(原 Doge meme ,MD5:53 facff 91 EC 83 f 60 a 88235 ab 628590 bb |()作者裁剪的图片,MD5:da 25273 f 33 C4 EC 95 f 71984075079 BD 16

对变化超级敏感通常是哈希函数的一个有用特性,因为这使得判断文件是否被篡改变得非常容易。

但是如果我们用它来探测 CSAM,这就成了一个巨大的限制。想象一下,如果上面左边的图像是被禁止的图像。苹果可能会存储 MD5 哈希 53f…0bb 。但是仅仅通过稍微裁剪图像,我们仍然得到看起来相同的图像(在右边),但是具有完全不同的 MD5 散列值 da2…d16 ,这将会逃避检测。

更普遍的情况是,即使苹果有一个已知 CSAM 的数据库,CSAM 经销商也可以旋转、裁剪或调整图像大小来逃避检测。苹果将不得不存储无限数量的散列,以考虑旋转、裁剪或调整图像大小的无限方式。想象一下,当人们减肥、理发或剪指甲时,他们的指纹会发生变化吗?

为了进行检测,即使图像被轻微修改,哈希也必须相同。介绍… 神经哈希

好吧,跟我说说这个神经哈希

NeuralHash 是一种哈希算法,对输入图像的微小变化不敏感。

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

(原 Doge meme ,neural hash:11 d9 b 097 AC 960 BD 2c 6c 131 fa |()作者裁剪的图片,neural hash:11 d9 b 097 AC 960 BD 2c 6c 131 fa

对于之前由于不明显的作物而具有非常不同的 MD5 散列的同一对图像,我们得到相同的神经散列。
(本文中所有的 NeuralHashes 都是用这个浏览器内演示计算出来的。)

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

(原 Doge meme ,neural hash:11 d9 b 097 AC 960 BD 2c 6c 131 fa |()图片由作者翻转,neural hash:20 D8 f 097 AC 960 ad 2c 7c 231 Fe

即使在图像被翻转的情况下,神经哈希的重要部分仍然相同:
左神经哈希:11d9b097 AC 960bd2c6c131fa
右神经哈希:20d8f097 AC 960

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

(原 Doge meme ,neural hash:11 d9 b 097 AC 960 BD 2c 6c 131 fa |()图片由作者编辑,neural hash:11 d9 B0 b7a 8120 BD 286 C1 B1 Fe

下面是另一个例子,我们将一些单词叠加到图像上,但得到的 NeuralHash 仍然是相似的:
左 neural hash:11d9b09
7ac960bd 2c6 C131fa
右 neural hash:11d9b0b
7a812

在不深入细节的情况下,NeuralHash 算法使用卷积神经网络(CNN)来计算哈希。在训练过程中,CNN 会看到成对的图像。正对由彼此简单变换(旋转、裁剪、调整大小)的图像组成,例如上面的图像对。负像对包含完全不同的图像。CNN 被训练成将正对映射到相同的散列,将负对映射到不同的散列。这样,它学会忽略应用于图像的小变换。

而你说可以破?

大多数人工智能和人工智能的研究人员和学生可能听说过对抗性攻击,其中神经网络通过向图像添加噪声来欺骗。

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

作者展示对抗性攻击如何欺骗人工智能模型的图片,其灵感来自图 1 中的典型熊猫示例,解释并利用了Goodfellow 等人的对抗性示例,2014 。

例如,神经网络最初可能会将我们的 Doge 图像标记为“dingo”。但是我们可以在同一张照片上添加少量的噪声,现在神经网络将这张照片标记为“暹罗猫”。

这些攻击在人工智能社区中已经广为人知好几年了,研究人员之间一直在开发对抗性攻击和防御。

在 NeuralHash 算法中,同样的攻击可以很容易地应用于 CNN。8 月中旬,Reddit 用户 AsuharietYgvar 发布了关于如何导出苹果 NeuralHash 模型副本的 指令几个 脚本 出现演示成功的攻击仅仅几个小时后。

对 NeuralHash 模型的对抗性攻击有两种形式。第一种类型的攻击——让我们称之为“不同的图像,相同的哈希”——将噪声添加到源图像,以便得到的神经哈希与目标图像相同。

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

一个哈希碰撞对的例子,由作者从 Doge ( )和 Grumpy Cat ( )模因中生成。两张图像都有相同的 neural hash 11 d9b 097 AC 960 BD 2c 6c 131 fa,在给暴躁猫图像添加噪声之后。

在上面的例子中,噪声被添加到 Grump 猫图像中,因此结果具有与 Doge 图像完全相同的 NeuralHash。这也被称为哈希冲突——从不同的图像中计算出相同的哈希。这是有问题的,因为这意味着有人可以在无害的图像中添加噪声,使它们对应于 CSAM 神经哈希,然后伪装成常规图像,在随机网站上分发它们。这些伪造的 CSAM 图像会在苹果的服务器上引起假警报,导致人们被错误地标记。同样的攻击也可以用来将 CSAM 伪装成普通的图像。

另一种攻击——让我们称之为“相同的图像,不同的哈希”——增加了一点点噪声,但极大地改变了神经哈希。

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

(原 Doge meme ,neural hash:11 d9 b 097 AC 960 BD 2c 6c 131 fa |()图片由作者生成,neural hash:F8 D1 b 897 a 45 E0 BF 2 f 7 E1 b 0 Fe

在这个例子中,即使两幅图像看起来很相似(我们在右边添加了一些浅黄绿色斑点的噪声),但神经哈希却完全不同。该噪音是特制的,用于攻击为 NeuralHash 供电的底层 CNN。与之前的例子相比,我们在图像中添加了一些单词,但是神经哈希仍然基本相似。

通过这种攻击,CSAM 的经销商可以通过在他们的图像中添加一点点噪声并极大地改变结果的神经哈希值来逃避检测。如上所示,这可能是少量的噪声,不会显著降低图像质量。

不要给我带来问题,给我带来解决方案

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

照片由里里Unsplash 上拍摄

避免这些攻击的一个方法是永远不要在用户设备上存储 CNN。没有 CNN 的权重,这些攻击将更加困难。然而,这也意味着苹果在他们的服务器上运行哈希算法,这反过来意味着我们所有的 iCloud 照片都将被共享。

或者,苹果可以在许多 CNN 型号上运行 NeuralHash,而不是只有一个型号。使用许多模型增加了产生这些攻击的难度,因为攻击必须同时欺骗所有的模型。然而,这增加了必须在设备上完成的计算,这对于用户来说可能是不期望的。

另一个可能的解决方案是在哈希之前对图像进行一些预处理,例如将它改为黑白,增加对比度或生成多个随机裁剪和旋转。这是有帮助的,因为攻击有时是脆弱的,并且可能被充分的预处理所否定。

NeuralHash 算法是一项新技术,其漏洞的程度可能还没有被完全探索。虽然我对苹果抗击 CSAM 的意图感到振奋,但我会鼓励研究人员继续研究该系统的潜在弱点,以期加以改进。希望这是对 NeuralHash 技术的一个很好的概述!尝试运行算法这里

苹果新的 M1 Pro 和 M1 Max MacBooks

原文:https://towardsdatascience.com/apples-new-m1-pro-and-m1-max-macbooks-940e104ad6e1?source=collection_archive---------6-----------------------

使用它们进行机器学习时,要做好学习的准备

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

Ales NesetrilUnsplash 上拍摄的照片

规格确实令人生畏:多达 32 个 GPU 核心和多达 16 个 CPU 核心。再加上 64 GB 的 RAM,您就可以轻松应对任何工作负载了。还有,别忘了设计。嗯,看来苹果又来了。

但是,他们真的这样做了吗?让我们再深入一点。就在一年前,M1 芯片亮相,这是苹果公司的第一个定制的片上系统(SoC)。那时候最多可以装 16GB 的主存。并且,在 MacBook Pro 中,这个芯片有 8 个 CPU 和 8 个 GPU 核心。与最新的模型相比,这听起来很小,不是吗?

答案是:看情况。我经常在工作中使用 M1 的 MacBook Pro,我发现唯一的限制是小内存。如果让我再选这台机器,32g 甚至 64 GB 都有选项,我肯定会选。

但是,即使有这些令人印象深刻的规格,我们也不要忘记我们必须为道路提供动力。对我们来说,这主要意味着进行机器学习任务,如训练网络或探索数据集。这就是麻烦的开始。

是的,M1 芯片既快又节能。但是通常情况下,从 pip 安装 python 包是很麻烦的。安装 TensorFlow 是而不是运行那么简单

当我尝试这样做时,我花了三天时间让系统启动并运行。尽管苹果提供了一个专用的 TensorFlow 版本,但要让它运行起来还是很有挑战性。

令人欣慰的是,当他们宣布支持 TensorFlow 的 PluggableDevice 机制时,这一点得到了改善,该机制旨在改善对不同加速器 (GPU、TPU、定制 SOC 等)的支持。随着该版本的发布,事情变得更加顺利——至少在让框架运行方面。

一年后,当我试图从 pip 本地安装包时,仍然经常遇到麻烦。是的,使用 Anaconda 使事情变得更容易。但是,一旦您准备部署您的脚本,您可能希望冻结需求并在远程环境中使用相同的设置。然后,您必须处理两个需求文件:一个来自 Anaconda,另一个来自 pip。

那么,在所有这些感叹之后,有什么解决办法呢?**第一个也是最简单的解决方案:**使用 Linux 机器,配备久经考验的 AMD 或 Intel CPU,并与专用 GPU 配对。

**第二种解决方法:**拥抱学习。是的,我花了三天时间让 TensorFlow 开始工作。是的,我绕了很长的路去安装想要的包。但是,由于我被 M1 芯片卡住了,我没有其他选择,只能经历这一切。

我学到了很多东西。我自己钻研编译包。我开始使用蟒蛇。我深入研究了皮普。我在 GitHub 上滚动了几个小时,了解到写简洁问题的重要性。

所以,我会推荐 M1 的机器学习芯片吗?可以,但是你要做好学习的准备。不像即插即用那么简单。但这也不是火箭科学。

编辑:自从我写了这篇文章,我有机会测试新的 MacBooks,包括“小”的 14 英寸和“大”的 16 英寸。引起我注意的是,大版本比 14 英寸和去年的 13 英寸厚得多。它也更重(官方规格说明)。鉴于此,我更喜欢我的 13 英寸版本,因为它的便携性和重量。

如果可以的话,我建议你在花两千或更多钱之前,先去当地的商店体验一下。这样,你会更好地注意到我指的是什么。

申请和简历技巧让你在数据世界找到理想的工作

原文:https://towardsdatascience.com/application-and-resume-tricks-to-land-your-dream-job-in-the-data-world-c2a1e481651f?source=collection_archive---------26-----------------------

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

斯科特·格雷厄姆Unsplash 上拍照

我是如何采访方、独角兽以及顶级咨询公司的

我知道招聘有多么困难和令人生畏,尤其是在像数据科学这样竞争激烈的领域。回到 2018 年,我正试图从金融世界向数据世界转型;尽管我毕业于一所以量化严谨著称的学校,并在一家顶级资产管理公司担任定量分析师,但我申请的任何一家公司都没有给我回音。

GIF 由 GIPHY

我知道,只要公司愿意给我面试机会,让我展示自己,我就有资格胜任这些工作,但我们都知道,获得面试邀请是整个过程中最难的部分。事实上,申请人跟踪系统(ATS)的拒绝率,在人类看你的简历之前,是惊人的 75%https://blogs.wsj.com/experts/2016/05/24/how-job-seekers-can-get-around-flaws-in-hiring-software/。当时我怎么也想不到,仅仅两年后,在另一轮招聘中,我就获得了方的四家公司中的三家、硅谷的无数独角兽和顶级数据科学咨询公司的面试邀请。

我参与过招聘过程的两个方面(我在过去的多个职位中帮助过招聘),我希望我能帮助阐明如何在数据世界中驾驭招聘过程。本文是系列文章中的第一篇,将集中在这个过程中至关重要的第一步——申请和简历;我将在以后的文章中深入探讨面试准备和其他步骤,敬请关注。

GIF by GIPHY

首先,让我们谈谈在线申请和网络(以及为什么你应该在线申请)

我在 Medium 上读过无数关于“你不应该再在网上申请工作”的文章,这些文章告诉我们“网络是绕过臭名昭著的 ATS 的方法”;因此,我接下来要说的可能不是最受欢迎的观点,但如果你像我一样是一个内向的人,非常害怕强迫社交,这可能会让你的一天变得更好:你绝对应该在线提交申请,很多很多。原因如下:

人脉总是有帮助的,但是 ROI(投资回报)取决于情况:我并不反对人脉。事实上,如果你的目标是更好地了解公司、文化或收集任何其他信息,社交网络是你最好的选择(对于像我这样的内向者来说,这可能是次要的)。但是如果你的目标是得到招聘者的推荐或介绍,这样你就可以“在 ATS 中导航”,你可能会失望。根据我的经验,你通过人际关系网成功获得推荐的机会会因你交往的人对你的了解程度而有很大不同。或者更准确地说,他/她有多愿意/能够担保你的能力。

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

作者图片

稍微了解一下转诊流程,稍微换位思考一下,就不难理解这背后的原因了。在大公司,每天都有巨大的内部推荐量涌入;因此,他们由一个标准化的系统处理,推荐人必须回答诸如“你为什么推荐这个人”或“你以前和这个人共事过吗?”。在小公司,内部推荐会直接传达给招聘人员,不可避免地,招聘人员会问推荐人类似的问题。

当系统处理推荐时,您会遇到与 ATS 相同的问题;招聘人员只会看排名靠前的推荐人。如果让你来设计排名模型,你会把哪一个排在最前面?上面写着“是的,我和这个人一起工作过”以及一份详细的资格清单?或者上面写着“不,我以前没有和这个人共事过”以及对过去经历的一般性描述。当推荐人被直接推荐给招聘人员时,你希望你的推荐人如何陈述“我推荐这个人是因为他们在 LinkedIn 上给我发了冷消息,而我对他们一无所知”的情况?

诚然,大部分工作都是由内部推荐的人来完成的;事实上,他们中的一些人甚至在发布到网上之前就被填满了。所以,如果你有一个前同事或前同学在你感兴趣的公司工作,你一定会得到推荐。否则,我宁愿用 ATS 碰碰运气。

这是扩大和增加漏斗顶部的最简单方法。如果你思考招聘流程的漏斗(如下所示),有两个变量你可以改变以获得更多的聘用;转换率和漏斗顶部的数量。转换率可以通过改进简历或面试技巧来提高,而提高申请数量的最快方法是通过在线申请。和体积问题;即使有一份出色的简历和强大的关系网,你也永远不会有 100%的转化率(另外,你理想的情况是想要多个工作机会;但是我们将在后面的文章中涉及到这一点)。不要因为你正在向推荐人努力而放慢你的招聘进程:这两者并不相互排斥。如果你最终从一个关系密切的人那里得到了热情的推荐,那么直接申请一家公司并不会对你的机会产生负面影响。

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

作者图片

公司系统里有你的简历总是好的。没有多少人知道这一点,但在网上发布工作之前,许多招聘人员会先在公司的数据库中搜索过去的求职者。我不止一次收到电子邮件并与招聘人员交谈,大意是“我在我们的数据库中找到了你一年前的简历,我认为你可能非常适合我们的 XXX 职位”,而我:

GIF 由 GIPHY

所以,如果你决定进行在线申请,你需要做些什么来从所有其他在线申请人中脱颖而出呢?改进你的简历可能是最安全的赌注。我不是说检查拼写或语法错误(尽管这也很重要),但更重要的是,你需要注意你使用的单词。让我来给你解释一下为什么不管一家公司是否在使用 ATS,在简历中使用正确的(关键的)单词是获得最佳结果的关键。

如果你逃不出 ATS,就打吧。

知己知彼知己知彼;百战不殆——孙子

说到底,ATS 是基于模型的,可能不是超级复杂的模型。既然你是一个有抱负的数据科学家,问问你自己,如果让你构建一个 ATS,你会如何构建?

在高层次上,我会抓取简历的内容,将结果与职位描述进行匹配,分配一个匹配分数,并设置一个截止值。

我和我新造的 ATS (GIF 来自 GIPHY

我敢肯定这比那要复杂得多,但你已经明白了要点。所以“打败”它真的没那么难。

  1. ***仔细阅读职位描述:*我假设此时,你已经决定了 在数据世界 追求哪个角色。但是公司有时会互换职位名称,所以阅读职位描述不仅能帮助你完成我将要提到的下一步,还能提供一个现实检查,看看你将要申请的工作是否真的是你想象的那样。
  2. 为你的简历量身定做:我的意思是真正地玩“单词匹配”游戏。如果工作描述提到 SQL,确保“SQL”出现在你简历的某个地方。如果这个模型不那么笨,它甚至可以挑选出与目标单词在同一个“簇”中的单词;如果工作描述中写着“贝叶斯统计知识”,而你的课程中有“统计学”、“数学”或“概率”,这肯定会加强你的案例。
  3. 我不会坐在这里假装,如果我只是把我的简历修改一千遍,而没有加上麦肯锡,我也能取得同样的成功。你当然想贴近真实,做到有阶级;但是在你的简历上尽可能多写一些品牌名称。在我的简历上有麦肯锡之前,我在学校赢得的由 Citadel 赞助的 datathon 在 LinkedIn 上引起了很多招聘人员的注意。如果你参加过由著名公司赞助的 Kaggle 竞赛或 Udacity 纳米学位,不要害羞,在描述中包括公司名称。

一个额外的小提示,如果你在申请一两天后收到普通拒绝,你几乎肯定会被 ATS 踢出局;人类工作没那么快。

让你的简历更容易被人浏览。

人类只是有情感的复杂机器,对吧?所以适用于 ATS 的规则也适用于阅读你简历的人。优秀的招聘人员肯定知道他们招聘的领域,知道如何发现该领域的人才,但这并不意味着他们知道这份工作的每一个细节。更不用说他们每天有成千上万份简历要处理,所以如果你没有“信号”词,他们肯定不会花大量时间试图理解你为一个项目做了什么。如果他们找的是“AB 测试经验”,如果你的简历上只有“进行了营销实验,并分析了结果的统计意义”,那你真是得寸进尺。

如果你认为你已经做了你能做的一切,并且相信你已经掌握了所有需要的技能,但是仍然没有回音,有两种可能:

  1. 你没有合适的经历(至少在招聘人员的书上是这样的)。尽管我从事的金融项目与现在非常相似,但科技招聘人员并不明显。我并不惊讶。毕竟,对于以前没有从事过金融工作的人来说,无论我在简历中多少次提到“R”和“SQL”,都很难揣摩“定量分析师”与“数据科学家”做着类似的工作。如果你怀疑是这种情况,那就把目光放在奖品上,但要绕道走。知道咨询公司招聘的人背景更加多样化,我“绕道”成为了一名数据科学顾问,后来证明这是我职业生涯中迄今为止做出的最佳决定(我将写另一篇文章,讲述为什么我认为数据科学咨询是数据职业生涯的一个很好的起点)。在我的简历上写“数据科学顾问”打开了许多几年前关闭的大门。
  2. 只是运气不好。说真的,招聘就像生活中的其他事情一样,运气也是一个因素。在这种情况下,你能做的就是坚持不懈,不断提高自己的技能。我曾经申请过硅谷最大的公司之一(你可能会认为他们已经想好了招聘流程),但被拒绝了,几周后,一位招聘人员找到了我,申请的是完全相同的职位,而我:

GIF 由 GIPHY

用 Python 库实现自然语言处理算法在 IT 监控中的应用

原文:https://towardsdatascience.com/application-of-algorithms-for-natural-language-processing-in-it-monitoring-with-python-libraries-57eddc45c4ac?source=collection_archive---------30-----------------------

当应用于监控 IT 基础设施和业务流程的系统时,NLP 算法可用于解决文本分类问题和创建各种对话系统。本文将简要描述在 Monq 平台的 AIOps 微服务中使用的 NLP 方法。

1.介绍

纯粹从理论上讲,所有自然语言处理(NLP)算法的最终目标都是创造能够理解人类语言的人工智能(AI),此外,在“实现意义”(文本分析)和“做出有意义的陈述”(文本合成)的意义上“理解”。虽然这个目标仍然非常遥远——为了识别一种活的语言,有必要给 AI 智能体所有关于他周围世界的大量知识,以及与它交互的能力,即创建一个“真正会思考”的智能体。所以就目前而言,实际上,自然语言处理可以被认为是从文本数据中提取一些有用信息的各种算法方法。

有相当广泛的实际任务需要自然语言处理:

  • 外语文本的机器翻译,
  • 文本的自动注释(摘要),
  • 按类别(垃圾邮件/非垃圾邮件、新闻分类、情感分析等)对文本进行分类。),
  • 对话系统(聊天机器人、问答系统),
  • 识别命名实体(找到人、公司、地点等的正确名称。正文中)。

当应用于监控 IT 基础设施和业务流程的系统时,NLP 算法可用于解决文本分类问题和创建各种对话系统。本文将简要描述用于混合 IT 监控的 Monq 平台的 AIOps 微服务中使用的自然语言处理方法,特别是用于分析流入系统的事件和日志。

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

图片作者。

2.将文本转换为数字矢量表示

数学算法与数字一起工作,因此,为了使用数学仪器处理和分析文本数据,您必须首先将单词和句子转换为数字向量,并且最好保留语义关系和词序,即:

  • 数字向量应该反映文本的内容和结构,
  • 意义相似的单词和句子应该具有相似的矢量表示值。

目前,有两种主要的方法用于将文本,更准确地说是一组文本(或者,在 NLP 术语中,文档的语料库)转换成向量表示:

  • 主题建模——用于在文档语料库中寻找隐藏(潜在)主题的几种类型的统计模型:潜在语义分析(PLSA),潜在狄利克雷放置(LDA),
  • 基于分布假设的单词上下文表示的各种模型:神经网络模型 Word2Vec、GloVe、Doc2Vec、fastText 和其他一些模型。

在这些算法结束时获得的向量表示使得比较文本、搜索它们之间的相似文本、对文本进行分类和聚类等变得容易。

大约 10-15 年前,只有专家才能参与自然语言处理项目,因为这需要数学、机器学习和语言学领域的专业知识。现在,开发者可以使用许多现成的工具和库来解决 NLP 问题。特别是,在 Python 语言中,用于训练各种模型的相当广泛的 NLP 能力由两个模块的组合提供: nltkgensim—Monq 平台的 NLP 功能基于它们(但不仅仅是它们)。

3.用于模型训练的文本数据预处理

预处理文本数据是构建各种 NLP 模型过程中的一个重要步骤——在这里,GIGO(“垃圾输入,垃圾输出”)的原则比其他任何地方都更正确。文本预处理的主要阶段包括标记化方法、规范化方法(词干化或词条化)和停用词的去除。通常,这还包括提取通常共现的短语(在 NLP 术语中——n-grams 或搭配)和编译令牌字典的方法,但我们将它们区分为单独的阶段。

记号化是将文本分割成文本单元,记号,可以是单个单词或短语,也可以是整个句子。在这种情况下,文档是属于一个语义单元(例如,句子、段落或段落)的标记的集合,而语料库是文档的一般集合。在标记化的过程中,文本是:

  • 分解成句子,
  • 去掉标点符号,
  • 转换成小写,
  • 分成记号(最常见的是单词,但有时是音节或字母组合)。

规范化是将单词还原为其标准的形态形式,为此,要么使用词干化,将单词还原为词干形式(“argu”、“fishing”、“fish”),要么使用词汇化,将单词解析为其规范的词典形式(“is”、“be”、“written”、“write”)。对于俄语来说,词汇化更可取,通常,您必须使用两种不同的算法对单词进行词汇化——分别用于俄语(在 Python 中,您可以使用 pymorphy2 模块来实现这一点)和英语。

从文本块中移除停用词是从文本中清除不提供任何有用信息的词。这些通常包括常用词、代词和功能词类(介词、冠词、连词)。在 Python 中,nltk 模块本身有不同语言的停用词列表,在一个特殊的停用词模块中提供了更大的停用词集合——为了完整起见,可以组合不同的停用词列表。名字和父名也经常被添加到停用词列表中。

下面是一个相对完整的 Python 代码示例,用于预处理一组俄语和英语文本(输出是标记化文档的列表):

import re
from nltk.tokenize.punkt import PunktSentenceTokenizer
sentTokenizer = PunktSentenceTokenizer()
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r’\w+’)from nltk.stem.wordnet import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
import pymorphy2
morph = pymorphy2.MorphAnalyzer()import langid
from nltk.corpus import stopwords
from stop_words import get_stop_wordslangid.set_languages([‘en’,’ru’])
stopWordsEn=set().union(get_stop_words(‘en’), stopwords.words(‘english’))
stopWordsRu=set().union(get_stop_words(‘ru’), stopwords.words(‘russian’))
stopWords=list(set().union(stopWordsEn, stopWordsRu))
stopWords.sort()textCollection=[‘The main stages of text preprocessing include tokenization methods, normalization methods, and removal of stop words.', 'Text tokenization is the splitting of text into text units. During the tokenization process, the text is first divided into sentences.’, ‘Tokenization in Python is the most primary step in any natural language processing program. ‘, ‘We have imported re library and used “\w+” for picking up words from the expression.’]textCollTokens = []
for text in textCollection: ## loop over the collection of texts
 sentList = [sent for sent in sentTokenizer.tokenize(text)]
 tokens = [word for sent in sentList for word in tokenizer.tokenize(sent.lower())]
 lemmedTokens=[]
 for token in tokens:
 if langid.classify(token)[0]==’en’:
 lemmedTokens.append(lemmatizer.lemmatize(token))
 elif langid.classify(token)[0]==’ru’:
 lemmedTokens.append(morph.parse(token)[0].normal_form)
 goodTokens = [token for token in lemmedTokens if not token in stopWords]
 textCollTokens.append(goodTokens)

4.n 元文法的提取和记号字典的编译

提取文本语料库中的稳定短语(n-gram 或搭配,例如,“纽约”、“中央银行”等)。)并且在 NLP 模型中将它们用作单个标记是提高这种模型质量的相当标准的方式。基于给定集合中单词共现的各种统计的计算,有几种算法用于确定文本集合中的搭配。但我们不会深入分析这些算法的利弊,而只是简单地使用 gensim 模块提供的提取二元模型和三元模型的方法:

from gensim.models.phrases import Phrases, Phraserbigrams = Phrases(textCollTokens, min_count=1, threshold=5) ## finding bigrams in the collection
trigrams = Phrases(bigrams[textCollTokens], min_count=2, threshold=5) ## finding trigrams
bigramPhraser = Phraser(bigrams) ## setting up parser for bigrams
trigramPhraser = Phraser(trigrams) ## parser for trigrams
docCollTexts=[]
for doc in textCollTokens:
 docCollTexts.append(trigramPhraser[bigramPhraser[doc]])

文本数据预处理的最后阶段是为给定的文本集合编译一个标记字典(考虑所有找到的 n 元语法)。通常,为了进入字典,令牌必须满足一些额外的标准——过滤令牌以减少“噪音”和“背景”——在我们的例子中(下面是代码示例):

  • 令牌必须在整个集合中出现至少一定次数(参数 no_below ),
  • 该标记不应该比在来自集合的一半文本中更频繁地被发现(参数 no_above )。
from gensim import corporatextCollDictionary = corpora.Dictionary(docCollTexts)
textCollDictionary.filter_extremes(no_below=1, no_above=0.5, keep_n=None)

因此,经过预处理后,文本集合被转换成一个标记化(包括 n 元语法)的文档列表,此外,我们还有一个给定文本主体的标记字典,以及“训练有素”的二元和三元语法分析器。最后三个对象必须保存在磁盘上以备后用,因为它们是正在构建的 NLP 模型的重要组成部分(为了方便起见,令牌字典也保存为文本文件):

bigramPhraser.save(‘bigramPhraser.pkl’)
trigramPhraser.save(‘trigramPhraser.pkl’)
textCollDictionary.save(‘textCollDictionary.pkl’)
textCollDictionary.save_as_text(‘textCollDictionary.txt’)

5.基于潜在狄利克雷分配的主题建模

如上所述,将文本集合转换成向量表示的方法之一是主题建模。在我们的平台中,我们为此使用了潜在的狄利克雷分配方法(LDA)。我们不会详细描述 LDA 内部的文本处理机制(带描述的原始文章此处),但我们将尝试概述该方法的基本原理:

  • 集合中的每个文档都由一组潜在的(隐藏的)主题描述,
  • 主题是具有特定权重或概率(给定字典的单词集上的多项式概率分布)的单词集,
  • 文档是由潜在主题集生成的随机独立单词样本(单词包),
  • 建立描述在特定文档和整个集合中出现的单词频率的矩阵,
  • 使用吉布斯采样——一种根据某种联合分布(特别是狄利克雷分布)生成一组变量的随机样本的算法,确定这样的词到主题和主题到文档的矩阵,其最“正确”地再现给定的文本语料库,
  • 作为集合中每个文档的输出,LDA 算法定义一个主题向量,其值是相应文本中每个潜在主题的相对权重。

下图说明了该方法的本质,相对而言,该图可以在对俄罗斯童话文本语料库运行 LDA 方法之后获得。在输出端,LDA 算法将“渔夫和鱼的故事”与主题向量 T = (0.35,0.5,0.15)进行匹配,其中 0.35 是主题 1 的权重,0.5 是主题 2 的权重,0.15 是主题 3 的权重。应该注意,LDA 方法不以任何方式解释主题,也不为每个主题提供任何通用名称——主题只是由索引编号的单词集合。有时,给定主题中具有最大权重的一个或多个单词被视为主题的简单“有意义”标识符。

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

图片作者。

使用 gensim 模块,用 Python 训练 LDA 模型非常容易:

from gensim import models
import numpy as np

text corpus =[textcolldictionary . doc 2 bow(doc)for doc in docCollTexts]

nTopics=4ldamodel=models.ldamodel.LdaModel(textCorpus, id2word=textCollDictionary, num_topics=nTopics, passes=10)
ldamodel.save(‘ldaModel’)textTopicsMtx=np.zeros(shape=(len(textCorpus),nTopics),dtype=float)
for k in range(len(textCorpus)): ## make the matrix of docs to topic vectors
 for tpcId,tpcProb in ldamodel.get_document_topics(textCorpus[k]):
 textTopicsMtx[k,tpcId]=tpcProb

在这个例子中,我们训练了一个 LDA 模型,将其保存到磁盘,并且还创建了语料库中所有文档的主题向量矩阵(文本集合的主题表示矩阵),该矩阵可以在将来用于解决文本的分类和聚类的具体问题。对于我们的简单示例,主题矩阵看起来是这样的:

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

图片作者。

Python 中有几个模块可以可视化主题本身及其组成。以下是使用 wordcloud 和 matplotlib 模块可视化 LDA 结果的代码示例:

import matplotlib.pyplot as plt
from wordcloud import WordCloudcloud = WordCloud(background_color=’white’, width=2500, height=1800, max_words=5, colormap=’tab10',prefer_horizontal=1.0)
topics = ldamodel.show_topics(num_topics=nTopics, num_words=5, formatted=False)fig, ax = plt.subplots(1, 4, figsize=(8, 3), sharex=True, sharey=True)
for i, ax in enumerate(ax.flatten()):
 fig.add_subplot(ax)topicWords = dict(topics[i][1])
 cloud.generate_from_frequencies(topicWords, max_font_size=300)
 plt.gca().imshow(cloud)
 plt.gca().set_title(‘Topic ‘ + str(i), fontdict=dict(size=16))
 plt.gca().axis(‘off’)
plt.subplots_adjust(wspace=0, hspace=0)
plt.axis(‘off’)
plt.show()

结果,对于我们的示例,我们得到了下面的图片:

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

图片作者。

因为在给定的例子中,文本集合只是一组独立的句子,所以主题分析实际上为每个句子(文档)挑选出一个独立的主题,尽管它将英语中的句子归属于一个主题。

原则上,LDA 算法没有很多调整参数。主要参数是潜在主题的数量,它必须预先确定,并且为该参数选择最佳值是一项非常重要的任务。在我们的实践中,我们受以下简单规则的指导:我们获取在给定文本语料库上构建的标记字典的大小,并将其除以 10 到 20 之间的数(单个主题中的平均字数)——所得值作为 LDA 算法的输入给出。

6.Word2Vec 和 Doc2Vec 模型中单词的上下文表示

LDA 过程结束时文本集合的主题向量矩阵构成了文本语料库的全向量表示的第一部分,第二部分由语义向量或上下文表示形成。

语义向量的概念是基于分布假设:一个词的意义不是它由什么声音和字母组成,而是它最常出现在什么词中,即一个词的意义不是存储在它内部的某个地方,而是集中在其可能的上下文中。基本上,一个词的语义向量显示了它出现在其他词旁边的频率。

语义向量的最简单版本是一个单词在一个上下文中使用频率的矩阵,即彼此之间的距离不超过 n 个单词(通常使用 n=10 ),例如,如果您拿一期《读者文摘》杂志,并计算不同的单词对在特定大小的相同上下文窗口中出现的频率,您会得到一个表格,其中一部分可能如下所示:

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

图片作者。

此表中的每一行数字都是第一列中单词的语义向量(上下文表示),在《读者文摘》杂志的文本语料库中定义。

如果我们在整个语言的文本语料库(例如,这个 one )上执行这样的过程,那么这种方法的两个显著缺点立即变得明显:

  • 该表太大了,因为它的大小是由成千上万的字典的大小决定的,
  • 该表将主要由零填充。

自上世纪 60 年代以来,已经提出了各种技术来降低词的共现矩阵的维数(奇异值分解、主成分分析、各种类型的过滤),但是没有观察到显著的突破。突破发生在 2013 年,当时谷歌的一组研究人员提出使用神经网络架构 Word2Vec 来获得语义向量。还是那句话,我们不会详细描述 Word2Vec 神经网络是如何工作的(原文可以取此处,以更通俗易懂的形式此处),但我们会局限于主要方面:

  • 神经网络在大量的文档集合上被训练,以预测哪些单词最有可能被发现彼此相邻(并且神经网络绝不是深度的——只有两层),
  • 两种学习模式,CBOW(连续单词包,更快)和 skip-gram(对较少使用的单词更准确),
  • 输出向量的维数是几百(典型地, n=300 ),
  • 在训练了从输入层到神经元隐藏层的权重矩阵之后,自动给出所有单词的期望语义向量。

Word2Vec 方法的进一步发展是 Doc2Vec 神经网络架构,它为整个句子和段落定义语义向量。基本上,附加的抽象标记被任意地插入到每个文档的标记序列的开始,并且被用于神经网络的训练。训练完成后,这个抽象记号对应的语义向量包含了整个文档的广义含义。尽管这个过程看起来像是“用耳朵玩的把戏”,但实际上,来自 Doc2Vec 的语义向量改善了 NLP 模型的特性(当然,并不总是如此)。

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

我们再次使用 gensim 模块中 Doc2Vec 算法的实现:

从 gensim.models 导入 Doc2Vec

d2vSize=5
d2vCorpus= [models.doc2vec.TaggedDocument(text,[k]) for k,text in enumerate(docCollTexts)]
d2vModel=Doc2Vec(vector_size=d2vSize, min_count=1, epochs=10, dm=1)
d2vModel.build_vocab(d2vCorpus)
d2vModel.train(d2vCorpus, total_examples=d2vModel.corpus_count, epochs=d2vModel.epochs)
d2vModel.save(‘doc2vecModel’)textD2vMtx=np.zeros(shape=(len(textCorpus), d2vSize),dtype=float)
for docId in range(len(d2vCorpus)):
 doc2vector=d2vModel.infer_vector(d2vCorpus[docId].words)
 textD2vMtx[docId,:]=doc2vector

在这里,我们训练一个 Doc2Vec 模型,将其保存到磁盘,然后,使用训练好的模型,创建所有文档的语义向量矩阵。在我们的简单示例中,这个矩阵是这样的:

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

图片作者。

查看该矩阵,很难解释其内容,尤其是与主题矩阵相比,主题矩阵中的所有内容或多或少都很清楚。但是解释的复杂性是神经网络模型的特征,主要是它们应该改进结果。

结合作为 LDA 和 Doc2Vec 算法的工作结果而计算的矩阵,我们获得了文档集合的全向量表示的矩阵(在我们的简单示例中,矩阵大小为 4x9 )。此时,可以认为将文本数据转换成数字向量的任务已经完成,并且得到的矩阵可以进一步用于构建文本分类和聚类的 NLP 模型。

7.摘要

在本文中,我们分析了使用几个 Python 库处理文本数据并将它们转换成数字向量的例子。在下一篇文章中,我们将描述一个使用 LDA 和 Doc2Vec 方法解决混合 IT 监控平台 Monq 中主事件自动聚类问题的具体例子。

低密度聚乙烯综合生命周期评估和供应链分析的应用

原文:https://towardsdatascience.com/application-of-an-integrated-life-cycle-assessment-and-supply-chain-analytics-on-ldpe-6aba41555921?source=collection_archive---------40-----------------------

行业笔记

作者:Debanjana Chakraborty @ Chakraborty _ Debanjana,Suparno Bhatta @iamsuparno 和 Poovammal E 博士,印度钦奈 603203

S 可持续产品是指以最优成本获得的清洁绿色产品。在市场主导的时代,快速的商业发展集中于廉价商品的快速生产。这造成了自然资源过度消耗的激增,代价高昂,从而产生了有害的污染物。意识到后果后,各国开始采取措施消除市场对气候和自然环境的负面影响。

开发一种能够专注于在环境质量和全球市场产品供应链之间建立平衡的模式,已经成为一件至关重要的事情(Bhatta 等人,2021 年)。这可以通过开发一个融合了供应链管理分析和生命周期评估(LCA)的模型来实现。

生命周期评估(IS014040 和 ISO4044)是指测试和评估产品的环境和生态质量的方法。整个过程包括原材料提取阶段、制造和加工阶段、运输阶段以及最终的处置和再利用阶段。

供应链管理(SCM)要求组织数据、人员、事件、组织和资源(Bhatta et al .,2021)。它们强调改善货物流动的功能、计划、组织和控制。整个过程包括仓储、供应商、分销商、市场、制造商和零售商物流。

现有模型的缺点:

在生命周期评估和供应链管理的单个模型中,人们注意到在信息技术、数据生成和管理方面存在严重不足。(达文波特等人,2001;Hazen 等人,2014 年)。他们未能产生一个准确的结果去测试身体。这是因为缺乏对关键决策领域的了解,而这些领域是了解产品类型、质量和在任何特定行业使用时的可持续性所必需的(Fornasiero 等人,2017 年)。独立模型缺乏逻辑和技术流程来确定利润率、消费和排放模式(Brondi & Carpanzano,2011 年)。先前模型中使用的数据集大多是聚合的,而不管它们是否特定于位置。(Nuasaen 等人,2014;Park & Seo,2006;Moriguchi 和 Terazono,2000 年)。

目标:

已经进行了许多研究来开发 LCA 和 SCM 的单个模型,但是很少关注将这两个方面结合起来,以提供从原产地到消费的高质量订单履行。这些技术的结合将建立一种操作效率,从而提高模型的生产率。该整合模型将通过关注生产支出的增长和减少,帮助企业跟踪其供求关系。同时,它还将强调减少有害的环境排放和对自然资源的过度消耗。我们之前提出了一个架构(Bhatta 等人,2021 年),将在这项研究中实施,以检查模型的效率。

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

一次性塑料

整个测试将在主要消耗天然气和石油以及排放有害温室气体的产品(一次性塑料)上进行。该模型应强调数据维度的完整性、一致性、准确性和及时性、相关性、价值性、数量性、可访问性和声誉性(王,1996;王等,1995;王,1998)。

履行

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

LCA 和 SCM 集成模型的体系结构图

该模型是一个集成开发,首先确定满足客户需求所必需的原材料。然后在 Google Colab 中使用 Python 执行 LCA 和 SCM 分析。在生命周期评价阶段,对每种原材料的环境质量进行测试,以获得加工、制造和运输阶段消耗的能量。这让我们了解了制造阶段可用的不可再生资源的稀缺程度,以及使用这些资源时所消耗的能源量。它还让我们了解了因生产一次性塑料而产生的温室气体和非温室气体排放量。同时还对产品的供求数据进行分析。这可以通过进入计划阶段来获得,在计划阶段,可以获得制造和销售一次性塑料的净支出和总支出。损益是根据净支出、总支出、运营成本和额外的第三方成本预测的。数据集准备就绪后,使用 Scikit learn 执行数据挖掘。

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

UML 图

首先,我们导入数据集,并将其安装在与 Google Colab 相同的驱动器上。

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

将数据集装载到 google collab

然后在 python 中设置访问数据集的路径。

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

添加数据集的路径

然后,我们导入 NumPy 库来转换 CSV 格式的数据,并以表格格式分析数据。

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

导入 NumPy 库以将数据集转换为数据数组

使用特征提取获得所有需要的输入,并设置预测的目标值。

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

设置输入和输出的数据值

训练和测试数据被分成 70:30 以获得最佳结果。

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

训练和测试数据集

然后我们在导入 Scikit learn 后进行 Huber、Ridge 和线性回归。

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

用于导入 Huber(左)、岭(中)和线性(右)回归的代码段

检查模型分数以获得挖掘技术的准确性。

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

Huber(左)、岭(中)和线性回归(右)的模型得分

对于图形可视化,将从目标结果获得的实际值和预测值与平滑线图进行比较。LCA 和 SCM 阶段都是使用回归技术进行的。

数据集收集

理解该模型的可行性是至关重要的。分钟数据集具有现成的数据集,可用于在集成的 LCA-SCM 模型上进行测试,因此为此测试过程创建了一个新的数据集。

每个 LCA 和 SCM 部分的收集方法是不同的。一次性塑料的生产由低密度聚乙烯完成。使用这种塑料的数据是因为它们目前在全球市场上需求量最大。低密度聚乙烯在我们生活的各个方面都有广泛的用途。他们也是造成全球变暖的温室气体的最大排放者。我们从第一个报告期获得了提交给英国政府的六个月(2015 年 10 月-2016 年 4 月)一次性载体的数据集。该数据( Lca-SCM 塑料数据库-完整数据库,未注明)包括制造塑料的净支出、销售塑料的总支出、政府征收的增值税。

我们将 SCM 数据与自行创建的 LCA 数据集相结合。使用“一次性塑料的数量”和一个单位生产或排放的数值来计算数值,该数值基于 2011 年 8 月关于九种塑料树脂和四种聚氨酯前体从摇篮到大门生命周期清单的技术报告(Feraldi 等人,2013 年)。生命周期评价的数据集侧重于“从摇篮到大门”阶段。该数据包括加工过程中使用的不可再生资源和消耗的能源的价值。它还包括在一次性塑料的制造、加工和运输阶段排放到大气中的各种温室和非温室污染物。

要获取数据集,请将此出版物的作者发邮件给

回归技术

我们使用线性回归,因为它有助于预测公司的净利润/亏损,这取决于制造用原材料的销售情况。当我们使用一个因变量和一个自变量进行预测分析时,它会给出准确的结果。因为这有利于预测效果,也有利于确定预测者的强度。我们还尝试使用更多的回归技术来检查哪一个更适合我们。使用 Huber 回归,因为它对异常值是稳健的。与标准的最小二乘法相比,它使用了一种特殊的损失函数。对于损失的小残差,似乎通常拥有最小量的平方惩罚,但是对于大残差,它的惩罚更小,并且它线性地而不是二次地激增。因此,它适用于含有大量异常值的数据集。

然后利用岭回归分析多重共线性严重的多重相关数据。当多重共线性出现时,最小二乘法估计值是无偏的,但它们的方差很大,这意味着它将远离真值。它通过给回归估计增加一定程度的偏差来减少质量误差。

结果和讨论

我们希望设计一个模型,可以预测产品的环境质量和可持续成本之间的趋势。在这个结果中,我们试图找出一次性塑料制造过程中的能源消耗率、销售系数和有害污染物排放量。在这项研究中,采用了线性、Huber 和岭回归技术进行比较研究,以了解在这种情况下哪种方法在准确性方面效果最好。在比较研究中,实际值和真实值通过图表计算得出。实际曲线代表基于独立变量的曲线的当前状态。预测曲线表示与当前值相比,曲线可能如何变化的未来预测。

在所有三种回归技术中,模型得分几乎在0.9995–1.0之间。这显示了三种技术的精确度。所有三种回归技术为我们提供了几乎相似的结果,只有微小的偏差。然而,在三个 Huber 回归中,几乎所有代码的模型得分为 1.0,显示出最高的准确性。在这里,我们将只显示 Huber 回归的图形和数据头。

销售和推断:

我们试图找出英国公司每年用低密度聚乙烯制造一次性塑料的总支出。在数据集中,我们获得了净支出、总支出和增值税的值。

根据计算:总收入=净收入+增值税(总收入> >净收入)

**总收入:**公司生产一次性塑料的平均支出。

**净收益:**制造商制造塑料的平均支出。

**增值税:**政府对一次性塑料征收的税

存在增值税时使用线性回归进行销售预测的示例代码

存在增值税时使用 Huber 回归进行销售预测的示例代码

下图说明:

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

含增值税和不含增值税的一次性塑料的销售增长

  1. 在我们的图表中,我们注意到预测总值略低于实际总值。制造塑料的未来开支将会减少。这意味着英国公司将开始减少这些塑料的使用和生产,从而遵守英国公司签署的反塑料协议。公司还没有减少一次性塑料的使用。一次性塑料未来产量的大幅下降将有助于在很大程度上减少销售。公司还没有减少一次性塑料的使用。
  2. 上述四张图中的实际总支出和预测总支出保持不变。这表明政府实施的机制还没有发挥作用。未来各公司的塑料年供应量和销售量将继续增长。

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

不含增值税的销售额前 7 名的负责人(左),含增值税的销售额前 7 名的负责人(右)

3.比较上图中的两个数据集,以了解预测总支出的微小变化。数据头中预测总量的微小变化肉眼几乎无法分辨。有增值税的数据集显示塑料的预测支出较少,而没有增值税的数据集显示一次性塑料的未来销售和消费呈线性增长。从而显示政府在控制一次性塑料生产中的作用。英国政府实施的严格机制将迫使这些公司自动减少塑料的生产和消费。

能源和资源消耗:

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

低密度聚乙烯的化学结构

一次性塑料由低密度聚乙烯制成。它们由原油或天然气加工而成。在塑料制造过程中,需要大量不可再生资源来提取原材料,将这些原材料加工成低密度聚乙烯,然后从工厂运输到公司。加工、运输和材料阶段的能源消耗有助于我们了解公司每年消耗的不可再生资源的数量。

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

过程运输和材料阶段

材料阶段:

下图说明:(添加数字)

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

Huber 回归中的实际(左)材料资源与所有不可再生能源以及预测(右)材料资源与所有不可再生能源

  1. 上述数字显示了对日益枯竭的自然资源的过度消耗。大量的天然气被加工和消耗以制备低密度聚乙烯。石油在能源消耗总量中位居第二。剩余资源(煤、核能等)消耗的能量非常少。
  2. 在这两个图表中,所有资源的能源消耗继续急剧增加。这描绘了公司过度消耗不可再生资源的有害习惯。

流程阶段

下图说明:

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

Huber 回归中的实际工艺资源与所有不可再生能源(左)和预测工艺资源与所有不可再生能源(右)

3.在上图中,我们可以看到天然气消耗最大的能量来制备低密度聚乙烯。与物质相类似,石油排在总能耗的第二位。其他气体的曲线几乎已经融合在图表中,因为它们消耗的能量非常少,肉眼几乎看不见。

4.加工阶段的消耗曲线类似于材料阶段。这告诉我们公司如何继续过度消耗资源

运输阶段:

下图说明了:

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

Huber 回归中的实际运输资源与所有不可再生能源(左)和预测运输资源与所有不可再生能源(右)

5.天然气和石油再次占据运输阶段能源消耗的前两位。然而,石油和天然气的能耗曲线存在巨大差异。这表明与石油相比,天然气的消耗量要大得多。加工和制造阶段的情况并非如此。

合并资源:

下面给出的数据标题图代表了不可再生资源消耗的能源与工艺、运输和材料资源的实际值和预测值之间的比较。

使用岭回归进行流程、运输和材料预测的示例代码,以了解过度消耗的自然资源

下图说明了:

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

组合流程、运输和材料阶段的前 9 个值的标题

6.在塑料制造过程中(加工阶段),不可再生资源的能源消耗最大。原材料运输(运输阶段)排在第二位,提取原材料制造塑料排在第三位

7.英国的公司显示出生产更多塑料的未来趋势。这是显而易见的,因为预测过程值大于实际过程值。减少产量的唯一方法是提高每种产品的税率。这将减少需求,从而减少石油和天然气的过度使用。

8.实际运输量和预测运输量的趋势相反。这与过程阶段相反。这表明未来交通运输阶段的能源消耗率将会下降。

9.与生产和运输阶段的值相比,材料阶段的预测值和实际值的能耗几乎可以忽略不计。

能源消耗越大,自然资源的损耗就越大。因此,影响了地球的生态因素。它还增加了导致全球变暖的二氧化碳和甲烷的排放率。

温室气体和非温室气体排放推断:

以前我们已经注意到不可再生资源是如何被过度消耗来制造一次性塑料的。下图和图 15 中的饼图分析了该阶段排放的温室气体和非温室气体。

温室气体:

下图分析了提取、制造和运输一次性塑料时预计会排放的温室气体量。

利用 Huber 回归分析温室污染率

温室气体:二氧化碳、甲烷、一氧化二氮、溴甲烷、氯甲烷、三氯乙烷、氯仿、四氯化碳、CFC13、HCFC 22。

下图说明:

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

各阶段预计的温室气体排放量(单位:1000 千克)

  1. 二氧化碳(78.67%)和甲烷(20.88%)是产生最多的污染物,其次是其他污染物。这是因为石油和天然气资源被过度消耗以制造一次性塑料。在运输阶段,大量的煤以及石油和天然气也被用作燃料。它们是截留甲烷气体的主要来源。当这些资源被过度消耗时,致命的甲烷和二氧化碳被释放到空气中。在运输阶段,大量的煤以及石油和天然气也被用作燃料。这会释放有害的污染物。这两种污染物都吸收热量,并且不允许它们从地球表面逸出。从而使空气变得非常热,增加了气候临界点的危险。这将对地球的气候产生毁灭性的影响。
  2. 甲烷是一种更致命的温室污染物,因为它在大气中停留的时间比二氧化碳更长。在所有三个阶段中曲线的急剧上升会导致许多健康问题,如视力问题、记忆力丧失、恶心、呕吐、面部潮红和头痛。
  3. 其余的污染物加在一起只占总污染的 0.44 %。因此,控制甲烷和二氧化碳的比例,地球的温度就会得到控制。

下面是一个类似的饼状图,用来比较加工、运输和材料阶段排放的非温室气体水平。这些气体不是全球变暖的罪魁祸首,但它们是导致致命健康问题的空气污染的罪魁祸首。

非温室气体:颗粒物(PM 未指明,2.5,10)、挥发性有机化合物(VOC)、非化石二氧化碳、氮氧化物、一氧化碳和二氧化硫。所有三个阶段都显示出相同的趋势。

使用线性回归技术的非温室气体排放率

下图说明:

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

预测的各阶段非温室气体排放量(单位:1000 千克)

  1. 在该过程中产生大约 43.5%的二氧化硫。这是一个令人担忧的问题,因为如此高的百分比破坏了生态系统,也是文物建筑恶化的原因。它们还会导致人类呼吸急促和胸闷。
  2. 氮氧化物占非温室气体排放总量的 27%。它们破坏植被,影响动物和人类。这种污染物会引起眼睛刺激、肺部问题和呼吸问题。它们与大量排放的二氧化硫结合产生酸雨。酸雨与建筑物和雕像发生化学反应,溶解化学物质,从而使它们变得脆弱。
  3. 与其他污染物相比,一氧化碳和挥发性有机化合物的产生率为 12%,但当一氧化碳含量超过 40%时,这些污染物就会对人类和动物的生命产生致命影响。
  4. 与其他污染物相比,微粒物质(未指明,10 和 2.5)的排放量非常小。这些主要是微米和纳米微粒,是室内污染的主要来源。它们对人类健康有重大影响。这些是极小颗粒和液滴的复杂混合物。这些污染物在本质上是致命的,当大量排放时甚至会导致死亡。

二氧化碳化石排放几乎可以忽略不计。然而,与其他污染物相比,它们的致命性较低,如果在高浓度下产生,会导致昏迷或死亡。

结论

所有三种回归技术都经过了准确性测试。给出最佳精度的模型是 Huber,其次是线性,然后是岭型。这是因为它对数据集中出现的异常值或数据异常不太敏感。但是,在此过程中,某些净值、总值和增值税值不可用,因此默认情况下假定它们为 0。长期以来,完整数据的可获得性一直是一个问题,这项研究也反映了这一点。由于公司的保密原因,这些数据中的大部分被隐藏或未被探索。在大多数图表中,所有的曲线都不清晰可见。这是因为我们的数据集包含大范围的值,当累积在一起时,我们很难通过肉眼看到结果中的微小差异。此过程中使用的数据独立于任何特定位置,因此如果考虑任何特定区域,结果可能会有所不同。使用回归技术的整个过程提供了非常高效的结果。读者也可以尝试聚类或分类技术来获得可持续的结果。

参考资料:

*Bhatta,s .,Chakraborty,d .,& Poovammal,E. (2021)。使用整合的 LCA-SCM 模型得出可持续产品的最佳成本。 9 (2),1193–1199 年。【https://doi.org/10.17762/itii.v9i2.472 *

c .布朗迪和 e .卡潘萨诺(2011 年)。基于 LCA 的生产系统模拟的模块化框架。《CIRP 制造科技杂志》4 (3),305–312 页。https://doi.org/10.1016/j.cirpj.2011.06.006

达文波特,T. H .,哈里斯,J. G .,德龙,D. W .,,雅各布森,A. L. (2001)。从数据到知识再到结果。加州管理评论43 (2),117。http://search.ebscohost.com/login.aspx?direct=true&db = buh&AN = 4372997&site = ehost-live

费阿尔迪、凯许曼、哈夫和拉豪格(2013 年)。美国废轮胎处理方案的比较生命周期分析;

材料回收和轮胎衍生燃料燃烧。国际生命周期评价杂志18 (3),613–625。https://doi.org/10.1007/s11367-012-0514-8

*Fornasiero、c . Brondi 和 d . Collatina(2017 年)。提出一个整合的 LCA-SCM 模型来评估定制策略的可持续性。国际计算机集成制造杂志00 (00),1–14。【https://doi.org/10.1080/0951192X.2016.1268716 *

Hazen,B. T .,Boone,C. A .,Ezell,J. D .,& Jones-Farmer,L. A. (2014 年)。供应链管理中数据科学、预测分析和大数据的数据质量:问题介绍及研究和应用建议。国际生产经济学杂志154 ,72–80。https://doi.org/10.1016/j.ijpe.2014.04.018

lca-scm 塑料数据库-全数据库。(未注明)。

Moriguchi,y .,& Terazono,A. (2000 年)。大气排放空间差异影响评估的简化模式。国际生命周期评价杂志5 (5),281–286。https://doi.org/10.1007/BF02977580

Nuasaen,s .,Opaprakasit,p .,& Tangboriboonrat,P. (2014 年)。壳聚糖功能化的中空乳胶粒子用于去除室内空气中的甲醛。碳水化合物聚合物101 (1),179–187。https://doi.org/10.1016/j.carbpol.2013.09.059

Park,J. H .,,Seo,K. K. (2006 年)。一种基于知识的近似生命周期评估系统,用于评估协同设计环境中产品设计备选方案的环境影响。高等工程信息学20 (2),147–154。https://doi.org/10.1016/j.aei.2005.09.003

王瑞英(1996)。数据质量对数据消费者意味着什么。管理信息系统杂志12 (4),5–34。https://doi.org/10.1080/07421222.1996.11518099

*王瑞英(1998)。全面数据质量管理的产品视角。ACM 的通信41 (2)、58–65。【https://doi.org/10.1145/269012.269022 *

*王瑞英、斯托里、冯维国、费斯、陈平(1995)。数据质量研究的分析框架。 IEEE 知识与数据工程汇刊7 (4),623–640。【https://doi.org/10.1109/69.404034 *

特征选择技术在回归问题中的应用

原文:https://towardsdatascience.com/application-of-feature-selection-techniques-in-a-regression-problem-4278e2efd503?source=collection_archive---------18-----------------------

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

维多利亚诺·伊斯基耶多在 Unsplash 上的照片

Python 中的要素选择和优化示例

在与您的数据管理员多次通话,通过各种渠道和数据丰富平台获取最有用的数据后,您作为一名数据科学家完成了数据收集。现在你有一个庞大的数据集可以浏览。为了优化计算时间、性能和可解释性之间的权衡,您只需要包括与您的机器学习模型最相关的列。此时,功能选择开始发挥作用。

为什么我们需要特征选择?

主要原因是在将数据提供给模型之前减少数据集中的字段数量。为什么需要这样做?需要降低模型的复杂性,这可能会导致过度拟合。我们的数据应该符合信号,而不是不相关的预测者产生的噪音。复杂性的降低也增加了我们模型的可解释性,这在与其他利益相关者交流结果时是必不可少的。最后,它减少了内存和计算需求,这是针对生产中的模型进行优化的一个方面。

最常见的特征选择方法

过滤方法仅包括与目标变量相关性分数高的模型最相关的特征。这是非常简单和计算友好的,因为使用一个相关措施,一个分数计算所有的预测。具有最高分数的特征被过滤以在模型中使用。一个警告是,在线性模型中总是存在共线性的风险。过滤方法只检查与目标变量的相关性,这就是为什么预测值之间的任何相关性都需要在预处理的后期处理。

包装器方法在每次迭代中用特性子集训练模型,并检查它们对性能的影响。然后利用不同的子集训练另一个模型。在每一步中,来自先前模型的学习被考虑来挑选产生更好结果的不同子集。迭代继续进行,直到选择出最佳特征。这种方法计算量很大,因为在每次迭代中,都用新的特征子集来训练新的模型。

嵌入式方法利用在建模过程中支持特征选择的算法。这种方法减少了预处理时间,因为训练和特征选择是一起完成的。最好的例子可以是 Lasso 和岭回归或者决策树。

下面我将为过滤器包装器嵌入方法应用一些例子。前三个将是皮尔逊相关、单变量特征选择和方差阈值来表示过滤方法,然后是包装方法的递归特征消除,最后是嵌入方法的 Lasso。

方法 1:皮尔逊相关法

皮尔逊相关系数是介于-1 和+1 之间的一种度量。如果系数越来越接近一端,那么相关性就越高。最好的可视化方法是利用sns.heatmap()。在下图的情况下,单元格越亮,特征之间的相关性越高。

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

为了找到模型中最有用的列,可以从相关矩阵中筛选出目标变量。由于我对相关性的大小比对其方向更感兴趣,所以我检查了矩阵的绝对值。

# creating dataframe including the correlations with SalePrice
df_corr = abs(df_train.corr()).sort_values(by='SalePrice', ascending=False)[['SalePrice']]# threshold of 0.4 is selected to filter the features
df_corr[df_corr['SalePrice']>0.4]

挑选与目标变量最相关的列很容易,但是我们需要解决任何线性模型中的共线性问题。为了解决这个问题,我建立了一个共线性检测器:

def colinear_detector(df, target_col):
  """
  aim: detect any colinearity
  inputs: all the columns
  output: colinear pairs
  """
  # dropping the target columns
  df_x = df.drop(columns=target_col) # initiating an empty dictionary 
  colinear_dict = {}

  # sorting the most correlated column for each column
  for column in  df_x.columns.tolist():
    df_corre = abs(df_x.corr()).sort_values(by=column, ascending=False)[[column]]

    # if score is higher than 0.8, add them to a new list
    # every predictor's correlation with itself is 1 so drop the first
    colinear_cols = df_corre[df_corre[column]>0.8].index.tolist()[1:]
    # add a list of correlated columns for each column
    colinear_dict[column]= colinear_cols

  # return the correlation dictionary
  return colinear_dict

输出将是一个字典,其中键是具有共线性的列,值是相应键的所有共线性列的列表。

方法 2:单变量特征选择

单变量特征选择计算特征和目标变量之间的相互作用,并对每个特征分别进行计算。对于每个特征,计算 p 值,表明该特征是否对目标变量有显著影响。由于我们正在处理一个回归问题,我将利用 sklearn 的f_regression。在幕后,它分别训练每个特征的简单线性回归模型来预测目标变量。每个模型的 F 值解释了该特征预测目标变量变化的程度。在f_regression的例子中,一个简单的线性回归模型的 F 值变成了它被训练的特征的 F 值。该分数随后用于确定该特征相对于其他特征与目标变量的相关性。

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

与目标变量高度相关的特征

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

与目标变量相关性差的特征

下面,我挑选了 25 个得分最高的列来包含在我的模型中。

from sklearn.feature_selection import f_regression
# assigning f and p values to 2 separate arrays
f_val, p_val = f_regression(X_train,y_train)

# creating a dictionary from the arrays
feature_dict={'features':X_train.columns.tolist(),
              'f_score':f_val.tolist()}

# creating a sorted dataframe from the dictionary
feature_df = pd.DataFrame(feature_dict).sort_values(by='f_scores', ascending=False).reset_index(drop=True)

# printing 25 features with the highest scores
feature_df.iloc[:25,:]['columns'].tolist()

方法 3:方差阈值

在训练数据集中,仅采用一个值的要素对模型的整体性能没有贡献。不管有没有,性能都是一样的,因为该特性的方差为零。换句话说,如果方差很低,该特征就不能提供关于目标变量的有意义的见解。这就是为什么它不会增加模型的预测能力。由于一个特征的方差很好地表明了它的预测能力,VarianceThreshold函数消除了低于给定方差的所有特征。

下面是一个箱线图,显示了 6 个不同特征的中心趋势。与前五个特征相比,最后一个特征的方差为零,因为 99%的值都是 0。换句话说,它对目标变量几乎没有预测能力,因为它的值从不改变。这就是为什么将它添加到我们的模型中不会提高性能。

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

下面我更喜欢使用阈值水平 0.25,因为默认值不会删除我的训练数据中的任何列。请注意,一旦数据被标准化,这个过程是有用的,这样所有的差异都在一个相似的范围内。

from sklearn.feature_selection import VarianceThresholdvar_selector=VarianceThreshold(threshold=0.25)
df_var = var_selector.fit_transform(X_train)

方法 4:递归特征消除

递归特征消除方法试图找到包含在模型中的最优特征子集。在这种方法中,形成特征的子集,并且在每次迭代中,丢弃表现最差的特征。因此,在达到最佳子集之前,子集在每一步中都变得越来越少。

为了利用递归特征消除,我从 sklearn 中选择了RFECV函数。在 RFE 函数中启动并加载一个模型,其中step=5意味着每一步将消除 5 个特征,而cv=3用于 3 重交叉验证。

from sklearn import linear_model
from sklearn.feature_selection import RFECV

# initiating a linear model
model = linear_model.LinearRegression()

# feeding the model to RFECV
rfe = RFECV(estimator=model, step=5, cv=3)

# fitting to the trained rfe model
rfe_fit = rfe.fit(X_train,y_train)

# zipping the column names and their rankings according to RFECV
rfe_dict = dict(zip(np.array(X_train.columns),rfe_fit.ranking_))

# picking the features ranked 1st in the above dictionary
selected = {}
for key, value in rfe_dict.items():
  if value==1:
    selected[key]=value
print(list(selected.keys()))

方法 5:套索回归

虽然 Lasso 是一种正则化技术,但它也可用于特征选择,因为它强制不相关特征的系数变为零。如果正则化的强度通过增加α而增加,则成本函数优先考虑最小化系数,而不是最小化误差平方和,这将迫使系数更快地达到零。

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

套索回归的目标函数

在应用正则化之前对数据进行归一化是非常重要的,因为否则要素及其系数将不会以类似的方式受到正则化项的影响。下面,我在建模前使用了StandardScaler

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectFromModel
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV# creating a pipeline to scale and model
pipeline = Pipeline([('sc',StandardScaler()),('model',Lasso())])# gridsearch over the pipeline to find the best alpha for lasso
# scoring is picked as mean squared error
lassocv = GridSearchCV(pipeline,
                      {'model__alpha':np.arange(0.1,10,0.2)},
                      cv = 5, scoring="neg_root_mean_squared_error"
                      )# fitting to the model
lassocv.fit(X_train,y_train)

# dataframe of variables, coefficients and absolute coefficients 
coefs = pd.DataFrame({'variable':X.columns,                            'coef':lassocv.best_estimator_.named_steps['model'].coef_,                            'abs_coef':np.abs(lassocv.best_estimator_.named_steps['model'].coef_)})

# sorting based on the absolute of the coefficients
coefs.sort_values('abs_coef', inplace=True, ascending=False)

结论

以上,我试图总结最常见的特征选择技术;过滤器包装器嵌入方法及其在一个回归问题中的应用。重要的是要记住,上述方法中的一种并不比另一种优越,因为每个应用程序的用例及优先级都不同。关键的一点是,在大多数情况下,我们不需要引入模型过度拟合的复杂程度。我们需要选择对目标变量具有最高预测能力的特征。

感谢阅读到最后,你可以在这里找到我的笔记本。如有任何问题或意见,请联系

[1] Tracers,什么是数据浓缩?,追踪者博客

[2] Sklearn 文档, sklearn.feature_selection。RFECV

[3] J. Brownlee,递归特征消除(RFE)用于 Python 中的特征选择,机器学习掌握

GPT-3 在问答中的应用

原文:https://towardsdatascience.com/application-of-gpt-3-in-q-a-769239a01f6d?source=collection_archive---------4-----------------------

人工智能时代的技术支持

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

杰利·范·李斯特在 Unsplash 上拍摄的照片

计算机程序将句子翻译成内部表示的能力,从而可以对用户提出的问题产生有效的答案,这种能力被称为自然语言的机器理解。 OpenAI 的预训练生成变压器 3 (GPT-3)就是这样一个自回归语言模型,它将自然语言处理(NLP)的能力革命性地提升到了一个新的水平。

本文探讨了如何有效地使用 GPT-3 来更好地理解用户的问题,并以良好的准确性将它们连接到庞大内容库中的相关部分,如用户指南和技术文档。

GPT-3 概述

GPT-3 已经被训练了 1750 亿个参数,比任何以前的非稀疏语言模型多 10 倍。它可以生成质量如此之高的书面文本,以至于经常很难与人写的文本区分开来。GPT-3 与其他语言模型(如 BERT)的区别在于,对于所有任务,GPT-3 都是在没有任何梯度更新或微调的情况下应用的,任务和少量演示完全通过与模型的文本交互来指定。GPT-3 在许多自然语言处理数据集上取得了很好的性能,包括翻译和问答[1]。GPT-3 的加权预训练数据集的 60%来自由 4100 亿字节对编码的令牌组成的通用爬行的过滤版本。其他来源是来自 WebText2 的 190 亿个标记,占加权总数的 22%,来自 Books1 的 120 亿个标记占 8%,来自 Books2 的 550 亿个标记占 8%,来自 Wikipedia 的 30 亿个标记占 3%。GPT-3 接受了数千亿单词的训练,能够用 CSS、SQL、Python 等语言编码。由于 GPT-3 的训练数据包罗万象,它不需要为不同的语言任务进行进一步的训练[2]。目前,OpenAI 已经发布了基于 invite only 的 GPT-3 APIbeta 版

GPT 3 号建筑

GPT-3 的架构由两个主要部分组成,编码器和解码器。编码器将句子中的前一个单词作为输入,并将其转换为向量表示,然后通过注意过程来生成下一个单词预测。解码器将前一个单词及其矢量表示作为输入,并输出给定这些输入的可能单词的概率分布。GPT-3 API 提供了一个通用的“文本输入,文本输出”接口,几乎可以用于任何语言任务。另一方面,大多数其他语言 API 都是为单一目的设计的,比如情感分类或命名实体识别。要使用该 API,只需向它提供一个文本提示(基于文本的输入或指令),它将返回一个文本补全,尝试适应您提供的上下文或模式。它可以通过写一个你想让它做什么的总结或者几个例子来编程。它的性能很大程度上取决于任务的复杂性。如果你有一个更具体的例子,你可能会期待一个更可靠的答案。随着 GPT-3 训练数据在 2019 年 10 月截止,API 可能不了解当前事件。

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

礼遇:OpenAI

GPT-3 核心组件

GPT-3 API 包含三个核心组件:提示、完成和令牌。“提示”是给 API 的输入文本。“完成”是 API 根据提示生成的文本。例如,如果您给 API 提示“Python 是 a”,它将返回“Python 是一种很棒的编程语言,因为它非常简单易学。”很有可能。默认情况下,API 是随机的,这意味着每次您调用它时,您可能会得到稍微不同的完成,即使提示保持不变。“令牌”可以被认为是单词的片段。API 在处理文本之前将其转换成标记。文本提示和 API 生成完成的标记组合必须少于 2048 个标记,即大约 1500 个单词。

**GPT-3 API 提供了不同的语言模型/引擎,它们在功能上有所不同。突出的典型有:达芬奇、居里、巴贝奇、阿达。**达芬奇被认为是最有能力的模特,阿达是最快的。OpenAI 建议使用 davinci 进行用例实验,并尝试其他生产模型,因为它们具有成本效益。达芬奇主要用于创意和分析输出。由于 davinci 的功能增加,它需要更多的计算资源。因此,它的每次 API 调用成本更高,并且不如其他引擎快。居里速度很快,擅长语言翻译、分类和总结。巴贝奇擅长语义搜索分类。Ada 是解析文本和简单分类的首选。

回答 API 端点

Answers 是一个专用的问答端点,适用于需要基于文档源、用户指南和技术文档生成高精度文本的应用程序。给定一个问题、一组文档和一些示例,API 基于这组文档中的信息生成问题的答案。您可以输入多达 200 个文件的列表,也可以预先上传不超过 1GB 的文件。通过 OpenAI 支持的 Python 绑定,您可以通过任何语言的 HTTP 请求与 API 进行交互。API 使用 API 密钥进行身份验证。

**Answers 端点对一组文档进行语义搜索。**如果您提交一个查询,例如一个自然语言问题或一个句子,返回的文档将根据它们与查询的语义相关程度进行评分和分级。“文档”可以是一组段落或几页。例如,如果您提供一个文档列表[“苹果是红色的”、“胡萝卜是橙色的”、“玫瑰是粉红色的”]并查询“哪一种是水果”,您将为每个文档获得不同的相似性得分。相似性得分越高,文档与查询在语义上就越相似。在这个例子中,“苹果是红色的”将与查询最相似。可以使用“Documents”参数将文档作为 API 请求的一部分进行传递。您可以使用“文件”参数来上传文件。文档作为文件预先上传,离线处理和索引一次。当使用保存的文件时,利用两步搜索过程来找到回答问题的最佳上下文。第一步使用传统的关键字搜索将所提供文件中的文档缩小到最多“max_rerank”(参数)个文档。然后,通过语义搜索分数对所选文档进行重新排序。

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

礼遇:OpenAI

下面是一个通过提供文档列表来获取答案的 Python 代码片段示例:

import os
import openai
openai.api_key =os.getenv("OPENAI_API_KEY")
doc_list= ["When you deploy Oracle Analytics Cloud, you complete some initial setup steps, and then Oracle takes care of most service management, patching, backup and restore, and other maintenance tasks. You determine the size of your service when you set up the service and you can increase or decrease capacity if your requirements change. Oracle Analytics Cloud offers two sizing options, you can specify the number of Oracle Compute Units (OCPUs) you want to deploy or how many people you expect to use the service."]
response = openai.Answer.create(
 search_model="davinci",
 model="curie",
 question="**What are the sizing options offered by Oracle Analytics Cloud?**",
 documents=doc_list,
examples_context="Larry Page and Sergey Brin.",
examples=[["Who founded Google?"]],
 max_tokens=30,
 stop=["\n", "<|endoftext|>"],
)
 print(response)

回应是:

{
  "answers": [
    "**You can specify the number of Oracle Compute Units (OCPUs) you want to deploy or how many people you expect to use the service.**"
  ],
  "completion": "cmpl-2xHoUMBCfmt0MyYvLso3n4PFtpEFM",
  "model": "curie:2020-05-03",
  "object": "answer",
  "search_model": "davinci",
  "selected_documents": [
    {
      "document": 0,
      "text": "When you deploy Oracle Analytics Cloud, you complete some initial setup steps, and then Oracle takes care of most service management, patching, backup and restore, and other maintenance tasks. You determine the size of your service when you set up the service and you can increase or decrease capacity if your requirements change. Oracle Analytics Cloud offers two sizing options, you can specify the number of Oracle Compute Units (OCPUs) you want to deploy or how many people you expect to use the service. "
    } ] }

用例

客户/技术支持 —支持主管可以使用此功能快速提供服务请求的相关答案。

开发者文档 —开发者没有耐心在技术指南的链接列表中寻找答案。该功能可以解析文档,并为他们的查询提供准确的答案,而不是指向相关页面。

上下文相关的帮助 —在软件中提供上下文相关的帮助是很常见的。但大多数时候用户会有次要问题,现在为此提供聊天机器人很常见。然而,聊天机器人提供的答案有限。因此,Answers API 可以有效地用来准确地回答用户的问题,而不是提供相关技术文档的链接。

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

示例答案应用程序

结论

著名的计算机科学家 Geoffrey Hinton 说过,“你所需要的是大量的数据和关于正确答案的大量信息,你将能够训练一个大的神经网络来做你想做的事情。”这正是 OpenAI 的 GPT-3 能够做到的。通过清楚地理解上下文来给用户提供正确的答案,将建立有益的用户体验。无需微调,GPT-3 可以高精度地执行搜索和回答问题的任务。这将彻底改变技术/客户支持领域。

参考

[1]语言模型是很少出手的学习者,OpenAI,https://arxiv.org/pdf/2005.14165.pdf

[2]https://en.wikipedia.org/wiki/GPT-3

冯·米塞斯的随机性公理在由数字序列描述的非平稳系统动力学预测中的应用

原文:https://towardsdatascience.com/application-of-the-von-mises-axiom-of-randomness-on-the-forecasts-concerning-the-dynamics-of-a-9693ce3d763e?source=collection_archive---------34-----------------------

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

TTPixabay 上的照片

使用冯·米塞斯的随机性公理作为一种关于预测非平稳系统发展的分析方法。

摘要:在本文中,我们将使用一个数字序列来描述一个非平稳系统的动力学,其中项的值在系统的自由度的数量内变化。这个数字序列允许我们使用冯·米塞斯的随机性公理作为一种分析方法,这种分析方法涉及从非平稳系统的演化预测中获得的结果。这个公理的含义如下:当我们理解一个数字序列的模式时,我们获得的结果是对下一个序列号的预测,它不能随机再现。在实践中,如果结果是通过随机算法或通过实现系统中存在的模式的认知算法获得的,则该公理定义了能够理解的统计方法。这种方法对于分析非平稳系统特别有用,非平稳系统的特点是产生非独立的结果,因此没有统计意义。非平稳系统最重要的例子是金融市场,因此,这种方法的主要应用是分析交易策略。

简介

为了应用冯·米塞斯的随机性公理作为一种分析方法,必须面对的第一个问题是能够用一个数字序列来描述一个系统的演化。为了这个目的,我们使用一个序列,其中项的值可以在系统的自由度的数量内变化。然后我们还引入了一个由一系列递增整数表示的时序级数。有了这两个序列,我们可以描述一个描述我们正在研究的系统演化的动力学。这样,我们可以应用冯·米塞斯的随机性公理,它定义了随机序列的统计特征。公理如下:“一个序列被定义为随机的本质要求在于,完全不存在任何可以被成功应用来改善关于下一个数的预测的规则”

这个公理告诉我们,当我们理解一个数字序列的模式时,我们可以获得结果,作为对下一个序列号的预测,它不能随机再现。知道我们的数字序列的值代表系统的动态,我们已经找到了一种方法来评估结果。因此,如果随机获得相同或更好结果的概率非常小(即,随着策略使用次数的增加而趋于零),这意味着预测方法使用系统中存在的规则。因此,我们可以使用发展的方法,以预测系统的演变;这种方法是研究非平稳系统的基础。事实上,如果我们处于非平稳状态,结果可能是非独立的,其结果是统计值的减少。为了用简单的方式解释这样一个复杂的话题,我创造了一个悖论[1],两个玩家在一个游戏中互相挑战,其中通过改变游戏规则,有可能从静止状态进入非静止状态。其后果是,开始时的数据是独立的,然后一旦发生变化,它们就变得相互依赖,因此对统计目的没有用处。

因此,在这些条件下获得的大量数据在统计学上对理解产生数据的方法是否是随机的没有用处。在这种情况下,预测算法的性能不再是可靠的数据;因此,我们需要找到一个新的统计指标,以评估结果。事实上,在金融领域经常发生这样的情况,一种策略尽管通过执行大量操作获得了出色的结果,但突然停止工作,产生了巨大的损失,以这种方式证明这是一种完全随机的策略。关于金融市场的非平稳性有很多研究;关于这个话题的一些文章有[2]、[3]、[4]、[5]。

通过数字序列描述非平稳系统的动态

我们首先考虑一个以两个自由度为特征的非平稳系统。我们做出这个选择有两个原因:第一,为了简化处理,第二,在有两个自由度的系统中,有金融市场,它代表了我们将要展示的方法的主要应用。

然后,我们将这个系统与一系列在 1 和 2 之间变化的值联系起来。在实践中,当在这个系统上,确定性过程的作用方向发生变化时,我们得到的结果是,继承的值相对于前一项发生变化。当我们谈到“确定性过程”时,我们指的是作用于系统的确定性和非随机力。我们还引入了这样的简化,即确定性过程作为一个恒定的力,在两个自由度的方向上强度没有变化;这允许我们用一个单独的数字序列来描述系统的动态特性。

最后,我们向系统添加一个时间度量;我们可以通过使用一系列递增的整数来做到这一点,这样,我的序列中的每个值都明确地对应于我的时间序列中的一个值。

得到的结果如下:我们有两个序列,一个描述作用在系统上的力的方向 F ,另一个描述时间的进程 T :

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

分析这两个序列,我们可以注意到作用在系统上的力(确定性过程)改变方向三次,第一次在时间 T = 8 ,第二次在时间T = 13**,第三次在时间 T = 20 。图 1 显示了由两个序列描述的动力学;图表中还包括了时间进程。**

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

图 1:由两个序列描述的系统动力学。

应用冯·米塞斯的随机性公理作为一种关于预测算法所得结果的分析方法

在这一点上,我们将应用冯米塞斯的随机性公理来评估预测算法所获得的结果。根据本文引言中报告和分析的公理,如果我们已经开发了一种非随机方法来实现系统中存在的模式,我们将能够预测继任期限相对于前一个期限的变化。

这个陈述是至关重要的,因为我们说只有关于系统变化的预测才是有用的,以便理解所使用的方法是否是随机的。事实上,如果我们在时间 8 和 12 对连续的两个项目进行两次预测,打赌连续的值是 2,我们获得两次成功。这两个结果是相互独立的吗?这个问题是基本的,因为只有当他们是独立的,才是有用的统计目的,以评估预测方法。

为了回答这个问题,我们必须使用我们报告的复合概率公式:

P(E1∩E2)= P(E1 | E2)P(E2)= P(E2 | E1)P(E1)(1)

两个事件 (E1,E2) 发生的概率,等于 E1 发生P(E1) 的概率,乘以给定 E1 发生 P(E2 | E1) 的条件概率 E2

看到公式(1)我们明白,条件概率 P (E2 | E1) 的正确计算取决于事件是否独立。事实上,在独立事件的情况下 P(E2 | E1) = P(E2) ,相反在事件完全相互依赖的情况下 P (E2 | E1) = 1 或 0。在我们的例子中,概率 P(E1) = 1/8 。事实上,以随机方式打赌在前 8 个时间位置内序列的值等于 2 的获胜概率是 1/8,因为在前 7 个位置中序列的值为 1,只有在第 8 个位置中序列的值为 2。在实践中,我们可以看到这个值,就像从一个装有八个弹珠的袋子中随机抽取一个值为 2 的弹珠的概率,其中七个值为 1,一个值为 2。因此, P (E1) 表示使用随机策略获得相同结果的概率。这样,我们就能从一系列有关系统动力学的数据中推导出一个概率。

现在我们试着计算 P (E2) 的值;研究从第九个位置到第十二个位置的时间间隔,我们看到系统保持不变。因此,在此时间间隔内,随机下注值 2 并获胜的概率等于 1。这是因为所有的位置都有值 2,所以随机策略以 100%的概率获得相同的结果。在这种情况下,我们可以将第二次下注视为完全依赖于第一次下注。这意味着,从统计学的角度来看,我们可以将这两次下注视为单次下注。

现在,让我们尝试将第二个赌注从第十二个位置转移到第二十个位置,在这种情况下,我们将有 P(E2) = 5/7 。事实上,在从第九个位置到第二十个位置的时间间隔中,有七个值等于 1,五个值等于 2。由于第二次预测中的这一变化,复合概率将等于:

P(E1∩E2)= P(E1)P(E2 | E1)= P(E1)P(E2)= 1/8∙5/7 = 0.089

在这种情况下,这两个事件是相互独立的,因此它们对于统计目的是有用的,以便理解所使用的方法是否可以预测系统的演化。

从这两个例子中,我们可以推导出以下结论:当我们想要研究一个确定性过程时,每当它决定系统中的一个变化时,我们就有可能对系统的演化执行一个预测,其采用随机策略的成功概率被证明是微小的 1。这涉及到复合概率的降低,根据冯·米塞斯的随机性公理,复合概率的含义是表明作用于系统的确定性过程的存在。

在实践中,每当确定性过程改变系统状态时,我们可以通过预测来检测它。因此,为了以低误差检测确定性过程,有必要在系统中产生统计上显著数量的变化。对此我们的预测方法进行了大量的独立预测。因此,每一次预测都必须关注系统的单一变化。

这种方法对于预测可能不独立的非平稳系统至关重要。因此,计算复合概率是非常重要的,复合概率是以随机方式获得相同结果的概率。我们还记得,在复合概率(1)中,有条件概率的计算,如果事件是相互依赖或相互独立的,则考虑条件概率。其实这个方法的目标是抛弃所有非独立预测,其贡献是让我高估了算法的预测技巧。这种错误评估的后果可能会导致我们(例如在金融领域)承担过度的风险。

结论

对结果的分析,涉及一个非平稳系统的发展,代表了应用数学中尚未解决的最重要的问题之一。在这篇文章中,我建议使用冯米塞斯的随机性公理作为评估在这些条件下获得的数据的方法。如前所述,这个公理定义了一个统计特征,当我们有意识地操作时,这个统计特征假定了一个明确定义的行为。在实践中,由非随机预测算法生成的结果不能随机再现,该算法实现了关于所考虑系统的知识。因此,随着策略使用次数的增加,获得相同或更好结果的概率随机趋于零。这样,我们就把注意力从非平稳条件下可能由非独立预测产生的结果值转移到与其非随机行为相关的统计特征上。

为了应用这种方法,我们定义了一个简单的数学模型,它的任务是通过一个数字序列来描述一个系统的动力学。使用这个数学模型,我们已经展示了如何从预测算法获得的一系列结果中计算复合概率。然后,通过分析一些例子,我们得出了一些重要的考虑因素。

特别是,我们已经看到,当系统发生变化时,我们有可能做出成功概率小于 1 的预测。这样做的结果是复合概率的减少,根据冯米塞斯的随机性公理,复合概率的意义是表明系统中模式的存在。

因此,如果我们想以较低的误差检测它,我们必须对系统的每一个单独的变化作出统计上显著数量的独立预测。这样,预测算法证明能够预测未来的系统演变。因此,这一特征成为评估在非稳定系统(如金融市场)上运行的策略的风险的基础。事实上,正确的风险评估必须始终考虑算法对系统未来发展的预测技巧。

在下一篇文章中,我们将在一个非平稳系统的动态中引入一个纯粹的随机成分。这样,确定性过程将被用概率密度函数描述的随机过程所取代。为了在金融领域应用这种方法,这一步是必不可少的。

参考文献

[1] Berdondini Andrea,《职业交易者的悖论》,(2018 年 11 月 20 日)。可在 https://ssrn.com/abstract=3287968SSRN买到。

[2]j . Barkley Rosser Jr .‘重新考虑遍历性和基本不确定性’。载于:《后凯恩斯经济学杂志》第 38 期(2015 年第 3 期),第 331–354 页。doi:10.1080/01603477.2015 . 1070271(1)。

[3]苏厄尔先生。“有效市场假说的历史”。伦敦大学学院计算机科学系技术报告,2011 年 1 月。

[4] O .彼得斯,m .盖尔曼。“使用动力学评估赌博”,《混沌:非线性科学跨学科期刊》,2016 年;26 (2): 023103

[5] Berdondini,Andrea,“来自经济物理学的方法论描述作为财务战略的验证技术”,(2017 年 5 月 1 日)。可在 https://ssrn.com/abstract=3184781SSRN买到。

ROC 曲线不同部分的应用

原文:https://towardsdatascience.com/applications-of-different-parts-of-an-roc-curve-b534b1aafb68?source=collection_archive---------6-----------------------

理解 ROC 曲线不同部分的重要性,探索 ML 应用的 AUC 变量

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

作者图片

介绍

受试者工作特性( ROC )曲线是诊断二元分类器能力的最常用图形工具之一,独立于固有的分类算法。几十年来,ROC 分析已经用于许多领域,包括医学、放射学、生物统计学、自然灾害预测、气象学、模型性能评估和其他领域,并且越来越多地用于机器学习和数据挖掘研究[1]。如果你是一名数据科学家,你可能每天都在使用它。

ROC 曲线是通过绘制真阳性率(TPR)对假阳性率(FPR ),基于不同模型分数设置下的二元结果而创建的。理想的分类器将在非常低的 FPR 下给出非常高的 TPR 值(即,它将正确地识别阳性而不会错误地标记阴性)。但是,理想的模型很少存在,因此,尝试不同模型和机器学习实验的目标是确定一个最佳模型,该模型将给出最佳的成本(FPR)/收益(TPR)权衡。ROC 分析有助于实现这一目标。

ROC 曲线下的总面积(AUC)

通常,(并且在“几乎所有”情况下),我们使用 ROC 曲线下的总面积( AUC )作为评估标准来找到最佳分类器。AUC 也是大多数 Kaggle 比赛中使用的评估标准。这是因为 AUC 是一个单一的数字,它提供了各种阈值设置下整体模型性能的平均信息。关于 AUC 的一个有趣的性质是,它独立于类别分布,即无论类别分布是 10%/90%还是 50%/50%,基于 AUC 的模型的排名将是相同的。(注意我提到的“有趣”,并不总是好的属性。有用性取决于手头的问题。在某些情况下,这个属性可能不好,数据科学家转而使用精确-召回曲线下的面积。但是让我们把这个放在一边)。AUC 在大多数情况下是信息性的和有用的,但是有许多现实世界的问题,在这些问题中,它未能提供对模型能力的正确关注,而在投入生产之前需要理解该模型的能力。在许多实际应用中(下面讨论的例子),ROC 曲线的主要部分几乎没有用,但 AUC 总结了整个曲线,给予所有区域同等的重要性,包括不相关的区域。

应对上述 AUC 挑战的常用解决方案是确定一个 FPR(或 TPR)截止点,并找到在该截止点最大化 TPR(或最小化 FPR)的模型。但是在任一轴上固定截止值需要业务方面的具体要求,并且在输出值上具有更高的方差。这不是一个理想的解决方案,它忽略了 ROC 曲线的大部分操作范围。也很难查看各种指标的网格来比较模型,例如 TPR @ 1% FPR、2%FPR、10% FPR、20% FPR 等。

简而言之,我们认为完全 AUC 在某些情况下存在问题,查看固定的截断点集并不是这些问题的理想解决方案。建议的解决方案介于两者之间,即,我们不使用所有可能的 FPR/TPR 值,而是在一组重要的点上进行聚合。这可以通过 ROC 曲线下的部分面积来实现。

在剩下的帖子中,让我们来了解一下文献中发现的部分面积度量的不同变体,如何计算每个变体以及何时使用它们。但首先,让我们从一些 AUC 未能强调部分面积指标需求的例子开始。

完全 AUC 问题示例

  1. 当类别分布高度不平衡时(例如 0.1%/99.9%,用例:欺诈检测、癌症检测等。),不同的分类器即使被正确排序也会在 AUC 值上表现出非常小的差异,使得模型比较变得困难。例如,您可能正在比较像 0 这样的数字。AUC 中 9967 vs. 0.9961 并且认为对比的两个模型相当相似。实际上,这两个模型在用于实际决策时可能会有显著的差异。
  2. 如果只有 1 个肯定和 999 个否定,即使是一个像样的模型也能够通过错误分类一小部分否定(FPR,假设 20%)来捕捉 100%的肯定(即 1)。在这种情况下,比较高 FPR 范围(例如> 20%)的面积是没有用的,因为**所有模型在高 FPR 区域都达到了 100%的 TPR。**但是 AUC 仍然使用高 FPR 无用区域。在这种情况下,理想情况下,我们希望找到一种模型,它可以通过错误分类非常低%的否定来识别很大%的肯定。
  3. 在临床实践中,具有高 FPR 的诊断测试导致显著的经济费用,因为很大比例的非患病候选人将耗尽医学治疗的稀缺资源。此外,在诊断致命疾病时,未能正确识别严重患病受试者(低 TPR)将导致严重的伦理后果。因此, FPR 和 TPR 需要同时分别维持在低和高水平;以便从 AUC 中排除不经济和不道德的区域。[2]
  4. 在使用乳房 x 光片检测良性与恶性癌症时,识别恶性癌症比对良性疾病进行不必要的活检更重要。即高 TPR ≥ 0.9 是感兴趣区域。完整的 AUC 可能不会显示不同模型之间的显著差异,即使它们在感兴趣的区域有所不同。
  5. AUC 警告的另一个经典例子是两个分类器的比较,这两个分类器具有彼此交叉的非常不同的 ROC 曲线。一个具有高 TPR,另一个具有高真阴性率(TNR),但两者具有相同的 AUC。在这种情况下,AUC 无法选择更好的分类器。[6]

**边注:**顺便说一句,这里有一个有趣的琐事,以及 ROC 曲线中“”这个词的由来。ROC 在二战期间首次被用于分析雷达信号,更具体地说,被美国陆军用于从他们的雷达信号中探测日本飞机。通过观察屏幕,雷达接收机操作员必须手动决定屏幕上的一个光点是代表敌机还是某种噪音。他们做出这些区分的能力被称为受试者操作特征。

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

ROC 曲线(图片作者

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

ROC 曲线的不同部分(图片作者

左边的 ROC 曲线表示被训练来分类二元结果的样本分类器的性能。该分类器的 AUC 是 0.969。

注:AUC 范围从 0 到 1,在 0.5 之间对称。即 AUC 为 0.5 是最差的分类器。AUC 在 0 和 0.5 之间的分类器预测与被评估的类别相反的类别。

现在,我们将了解如何使用同一 ROC 曲线的不同区域(如左侧突出显示的区域)来计算不同的部分指标。

ROC 曲线下部分面积的变量

局部区域度量并不新鲜。我最后引用的一些论文发表于 80 年代。我写这篇文章的目的是重温它们,并引起您对处理实际生产问题时可能遇到的常见场景的注意,尤其是在数据科学竞赛的世界之外。

1。暂停

定义:低于某一 FPR 的 ROC 曲线下归一化面积。[4]

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

pAUCcn @ <10% FPR. Green area divided by red area. (A/B) (图片由作者提供)

**优点:**关注 ROC 曲线最左边部分对高 TPR 的需求;对高度不平衡的数据最重要的区域。

缺点: pAUCn 缺乏 AUC 在 0.5 左右所享有的对称性。pAUCn 没有固定的下限,因为下限随着所选择的 FPR 阈值而变化。

2.矿泉

**定义:**主对角线以上 ROC 曲线下标准化部分面积。[7]

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

sPA @ <10% FPR. 0.5 * (1 + A/(A+B))(图片由作者提供)

**优点:**关注 ROC 曲线最左边部分对高 TPR 的需求。对于随机分类器,其被缩放以给出 0.5 的值,即,给出固定的下限,而不考虑 FPR 截止。 缺点: sPA 也缺乏对称性,0.5 以下没有意义。其下限不为 0。

3.个人事故保险(Personal Accident Insurance 的缩写)

**定义:**局部面积指数。特定 TPR 以上 ROC 曲线下的面积。换句话说,TPR 临界值和 1 之间的所有 FPRs 值的 TPR 平均值。[3]

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

PAI @ >70% TPR。绿色区域除以红色区域。(A/B) (图片由作者提供)

**优点:**关注高 TPR 需求,不考虑 FPR。在一些临床实践中,如早期癌症检测,如果高 FPR 意味着更好的捕获率,是否可以容忍。

**缺点:**下限不是固定的,并且随着 TPR 截止值而变化。相对于其他部分面积度量,缺少大约 0:0.5 和 0.5:1 的对称性。

4.tpAUCn

**定义:**ROC 曲线下低于一定 FPR、高于一定 TPR 的双向部分区域。[2]

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

tpAUCn @ <10% FPR & > 70% TPR。绿色区域除以红色区域。(A/B) (图片由作者提供)

**优点:**允许同时控制 TPR 和 FPR。许多用例需要高 TPR 和低 FPR。例如使用昂贵测试仪器的致命疾病的诊断。

**反对意见:**用户应该了解 TPR 和 FPR 临界值。

5.pAUCcn

**定义:**ROC 曲线下一致的部分面积。ROC 曲线下垂直部分面积(pAUCn)和 ROC 曲线下水平部分面积(pAUCxn)之和的一半。[5]

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

pAUCcn @ >10% FPR & <20% FPR. Green area divided by red area (图片由作者提供)

**优点:**比例与 sPA 相似,给随机分类器 0.5 分。与其他局部面积测量不同,这种方法认为 AUC 与平均 TPR、平均 FPR 和 c 统计有类似的关系。

**缺点:**其下界不为 0。

【后作者注:关于 pAUCcn 利弊的知识需要根据 ROC 曲线下一致部分面积作者的最新论文进行更新。基于新的归一化方法,cons 是无效的,并且具有类似于 AUC 的对称性。我将很快做出必要的改变。】

6.HAUC

**定义:**Half-AUC,AUC 分两半测量,当 TPR > TNR 或 TPR < TNR 时。当已知需要高灵敏度(TPR)还是高特异性(TNR)时,用于比较分类器。两半之和等于完全 AUC。[6]

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

HAUCsp: A+0.5C,HAUCse:B+0.5c . HAUCsp+HAUCse = AUC(图片由作者提供)*

**优点:**不需要就 FPR 或 TPR 停产做出决定。临界值是从 ROC 曲线中 FPR = 1 - TPR 的点自动得出的。唯一需要决定的是你需要高 TPR 还是高 TNR。范围从 0 到 0.5,0.25 随机。

**缺点:**当截止点已知且不同于 FPR = 1 - TPR 时,没有用。

比较研究

我用一个合成数据的比较研究来说明部分 AUC 的有用性。可能还有其他几个例子我没有在这篇文章中演示(长话短说)。这些例子包括:A)具有高 AUC 但在低 FPRs 下表现不同的两个分类器的比较,B)具有相同 AUC 但在高 TPRs 下表现不同的分类器,C)具有相同 AUC 但灵敏度或特异性水平不同的交叉 ROC 曲线,以及更多…

两个分类器具有相似的高 AUC,但在低 FPR 时性能不同

在下面的例子中,我使用 sklearn 的 make_classification 方法准备了一个合成数据集。为了强调标签分布高度不平衡的数据场景,我将标签比率保持为 99%/1%。然后我训练了两个分类器,一个用 LogisticRegression (LR)训练,另一个用 CatBoostClassifier (CB)训练。

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

线性和对数标度的 ROC 曲线。对数标度强调低 FPR 时的差异。(图片作者

我们看到 LR 和 CB 的 AUC 非常接近(99.78%对 99.96%)。事实上,线性标度 ROC 曲线看起来非常相似。有人可能会认为 CB 的排名很好,但并不比 LR 好多少。但是在对数标度上看到相同的曲线(右侧)强调了在低 FPRs 下的差异(<1%). Let’s see what would a partial area give.

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

Emphasis on partial area under curve below certain FPR. FPR at log scale. (图片由作者提供)

在 1% FPR 的截止值处的 pAUCn 显示了 LR 和 CB 之间的相当大的性能差异(89.9%对 97.9%),表明 CB 做得更好。

这种情况的一个例子(除了前面提到的癌症检测)是训练一个分类器,用于从在线认证中检测账户泄露。设想一个模型,该模型检测登录是来自攻击者(受损的)还是来自原始帐户持有人。考虑到在线活动的巨大规模,实际上只有极小比例的登录会受到影响(例如万分之一)。您可以使用该模型将高风险登录放入人工调查队列中。由于很大的不平衡,在 FPR 低至 1%的情况下,您将调查 100 个良好的登录,以努力找到 1 个折衷方案。由于调查中产生的费用,您的业务需求可能会限制您只调查所有登录中的 X%,从业务角度来看,将 X% FPR 以上的区域视为无用。

包含创建图和计算部分指标的代码的笔记本

https://github.com/groverpr/Machine-Learning/blob/master/notebooks/11_Applications_of_different_parts_of_an_ROC_curve.ipynb

结论

AUC 通常被用作一个汇总指标,根据 TPR 和 FPR 在不同阈值下的准确性,指示二元检验的总体表现。更简单地说,它是所有可能的 FPR 上的平均 TPR 和所有可能的 TPR 上的平均 FPR(本质上是对称的)。AUC 在大多数情况下是信息性的和有用的,但是存在许多真实世界的问题,其中 ROC 曲线的许多部分是不感兴趣的,并且 AUC 未能聚焦于重要的区域。有时,您感兴趣的区域低于某个 FPR,有时高于某个 TPR,或者其他时候同时受 FPR 和 TPR 的限制。有时特异性(TNR,1-FPR)比敏感性(TPR)更重要,有时反之亦然。在所有这些情况下,部分 AUC 测量做了正确的事情,集中在 ROC 曲线的重要区域。这篇文章提供了一些文献中的局部面积测量,帮助我们将它们可视化,并总结了它们的优缺点。

复习学分: 什卡·古普塔

参考文献

我上面提到的度量标准基本上是从过去写的几篇关于部分 AUC 的论文中挑选出来的。

  1. 维基百科:https://en . Wikipedia . org/wiki/Receiver _ operating _ character istic
  2. 杨 H,陆 K,吕 X,胡 f .双向偏 AUC 及其性质。
  3. 姜 Y,梅斯策,西川 RM。高灵敏度诊断试验用的接收机工作特性局部面积指数。
  4. 沃尔特·SD。汇总 ROC 曲线下的部分面积。
  5. Carrington 等人。机器学习算法评估中不平衡数据的新的协调部分 AUC 和部分 c 统计。
  6. 布拉德利美联社。用于评价敏感或特异分类器的半 AUC。
  7. 马等利用 ROC 曲线下部分面积评价诊断性能。

时频表示在语音处理中的一些应用

原文:https://towardsdatascience.com/applications-of-time-frequency-representations-in-speech-processing-cfa28ec1f251?source=collection_archive---------21-----------------------

从计算机视觉到 Mel 声谱图的音频处理

频谱图无疑是用于分析的音频信号的最合适的表示。它不仅符合我们通过频率分解对声音的理解,还允许我们使用二维分析架构。鉴于过去十年计算机视觉的巨大进步,将声音表现为图像的可能性打开了许多选择。本文将分析计算机视觉技术应用于音频处理的相似性和局限性。重点放在语音识别和语音合成上。

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

“我们是否正在走向一个人工智能能够在各方面超越我们的未来?那么答案是肯定的。”埃隆·马斯克——谱图由作者生成。

计算机视觉是当前机器学习中最热门的研究领域之一。然而,音频处理已经能够在视觉分析中突破性的深度学习技术的浪潮中冲浪。事实上,音频信号可以很容易地表示为二维数据。这种形式被证明更适合信息提取。顾名思义,时频表示通过时间和频率的离散化来显示音频信号。因此,大多数操纵图像的神经网络结构可以用于音频处理。就像人类大脑如何激发神经网络一样,Mel-Spectrogram 旨在显示我们如何听到信号。这种特定的时间-频率表示考虑了我们听觉的非线性尺度。本文重点介绍 Mel-Spectrogram 和深度学习技术在改善语音处理方面的一些应用。我们将看到如何生成特定文本的类似人类的语音,以及计算机如何理解我们正在说的话。这样的任务使用像序列对序列(听、听和拼)、连接主义时间分类和因果卷积这样的体系结构。最后,我们将讨论计算机视觉和机器听觉之间相似性的局限性。

如何可视化声音

声音信号或波形是由气压的变化产生的。麦克风和扬声器通过振动膜与声波接触。我们很快就明白声音是一维数据。在其最自然的形式中,音频信号被表示为随时间变化的强度。然而,这并不能很好地表达信号中包含的信息。事实上,频率是构成声音的关键特征。信息片段被编码在频率和振幅随时间的演变中。时间-频率(TF)表示是对声音进行分析其嵌入数据的适当表示。最常见的 TF 表示是光谱图。声谱图由像素组成,这些像素描述了与特定时间步长的频率范围相关的振幅。时间位置在 x 轴上,而频率仓在 y 轴上。像素越亮,相关频率的能量越高。频谱图不仅是可视化音频信号的好方法,而且易于计算。多年来,已经开发和优化了多种技术,傅立叶变换是最常见的。

由于声谱图的二维性质,计算机视觉技术可以应用于音频处理。有许多应用:音频分类、音频分离和分段、音乐流派分类和标记、音乐生成、音乐转录、语音识别、语音合成和语音识别。此类应用不胜枚举,但在本文中,我们将重点讨论后两种应用。一种特定类型的声谱图,或者更具体地说是一种标度,特别适合于语音处理。人类听到频率的方式被称为音高。人类的听觉频谱并不平坦。我们不能线性地感知频率。低频比高频更容易辨别。Mal 标度考虑了我们听觉的对数反应。该标度基于经验公式,使得声谱图 y 轴上的距离与我们在不同声音中感知的距离频率相匹配。此外,人类对声音振幅的感知也不是线性的。我们再一次听到响度的对数。分贝标度考虑了这一特性。Mel 谱图通过将 y 轴变形为 MEL 标度和分贝标度作为像素强度值来实现这两种表示。

语音识别

经典方法

语音识别无疑是公众最熟知的机器学习技术之一。语音助手正在成为所有平台的主流:扬声器(亚马逊 Echo)、游戏机(Kinect)、手机和智能手表(Siri、谷歌助手)等。虽然语音识别已经研究了几十年,但由于深度学习的兴起,它只是在最近才变得足够准确,可以用于现实世界的应用。

首先,让我们看看建立语音识别系统的经典方法。这种方法基于检测声谱图中的音素和它们的组合来形成基于模型的句子。如图 1 所示,三个模型组成了语音识别管道,以将语音特征***【X】***匹配到句子 Y :

  • 语言模型定义了给定单词序列在句子中出现的概率。这种模式是基于对特定语言的语法和习惯用法的研究。n 元模型非常适合有限的语音输入数据。
  • 发音模型为给定的句子生成一系列音素。这个步骤通常使用语言学专家定义的查找表来执行。
  • 声学模型最终定义了给定音素的发音。它产生与从录音中提取的语音特征 X 相比较的数据。光谱图通常用作特征集。声学模型被构建为高斯混合模型。

给定这样的模型,通过推断从分析的记录中提取的特征来执行识别。给定数据 X ,系统通过最大化其概率找到句子 Y

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

图一。经典语音识别管道[1]

多年来,该模型的组件一直使用深度学习进行优化。神经网络的使用大大提高了模型的整体准确性。典型的完全优化的流水线使用神经语言模型、神经网络发音模型和混合 RNN-HMM(递归神经网络-隐马尔可夫模型)声学模型。甚至使用 CNN(卷积神经网络)增强了特征提取。

然而,每个学习模型都被独立地训练来执行组件应该做的特定任务。管道成员的模型误差可能无法很好地协同工作——这一过程中的复合误差限制了性能。此外,人性化设计的特征管道直观且易于训练。尽管如此,它可能不是为任务优化的,这导致了性能限制和对更高计算资源的需求。这些原因推动了端到端模型的发展。整个识别过程被训练成一个单一的大组件。我们现在来看两个最流行的:连接主义时态分类和序列对序列。

联结主义时间分类

如果你曾经说过‘嘿,谷歌’,这个模型肯定已经分析了你的声音。Connectionist 时态分类(CTC)模型[2,3,4]目前在 Google 和百度的多个产品中使用。

同样,目标是从输入的声谱图 X 中推导出句子 Y 。但是现在,每个输出记号 {Y(t),t ∈[1,L]} 代表一个字母,每个输入记号 {X(t),t t ∈[1,T]} 是声谱图的一个子部分。请注意,输入光谱图标记可以重叠并具有任意大小。唯一的要求是T>L;输入标记必须比句子字符多。然而,由于两个主要原因,不能将输入与输出令牌直接匹配。首先,正如我们之前看到的,声音与字母无关,而是与音素相关。并且可以为不同的字母组合产生给定的音素。因此,语境对于识别产生给定音素的字母是至关重要的。其次,我们的输入记号的时间分辨率不一定与说话者给定字母(或音素)的发音持续时间相匹配。在多个连续的输出标记中会(并且应该——为了避免遗漏)推断出相同的字符。图 2 所示的 CTC 结构解决了这两个问题。

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

图二。连接主义时态分类结构[1]

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

图 3。CTC 模型对“他的朋友”发音的结果[1]

频谱图被输入双向递归神经网络。每个时间步长都考虑了它的时间邻居,这允许考虑发音上下文。预测的每一帧由最可能字符的分布函数描述, Y(t) = { s(k,t),k ∈字符图} 其中 s(k,t) 是在时间步长 t 出现字符 k 的对数概率。字符映射表可以由字母、数字、标点符号、空白字符甚至完整的单词组成。现在,我们可以通过选择 picks 字符来计算每个字符在一段时间内形成句子的概率——参见图 3。

CTC 结构经常与语法和拼写错误的单词作斗争。在 CTC 培训中集成一个简单的语言模型极大地改进了该模型[2]。

序列对序列

序列到序列(Seq2Seq)模型在语言处理中用于改变对象的表示域。这种表示可以是用于语音翻译的特定语言或者用于图像字幕的图像和文本。在我们的例子中,我们希望以文本形式表达一段语音记录。Seq2Seq 型号由两个主要组件组成,一个编码器和一个解码器。给定我们的应用领域,让我们分别称之为听者和拼写者。

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

图 4。LAS 模型结构[5]

listen 操作通常使用双向长短期记忆(BLSTM) RNN 来压缩来自语音频谱图的信息。卷积层也被证明在提高精度方面非常有效[7]。这一步对于优化信息的表现和消除音频中的噪声至关重要。听众提取的特征向量 h 通常比音频记录的初始持续时间小八倍。这种降低的分辨率对于加速学习和(最重要的)推理过程至关重要。注意,给定网络的循环结构,时间顺序保持不变。

然而,特征向量对于拼写者提取句子来说太长了。它不知道在哪里找到相关信息来推断与特定时间步长相关联的字符。需要注意机制来将分析集中在输入的适当时间窗口上。这个操作被添加到我们的解码器中。该模型现在被描述为一个听、听、拼(LAS)神经网络[5,6]。解码器通过聚焦于最可能感兴趣的区域,一次一个字符,顺序地运行特征表示 h 。注意,这种注意力机制很好地解决了在 CTC 中重复字符检测的问题。

使用基于注意力的 LSTM 传感器来计算注意和拼写操作。来自 y(i) 输出的字符的概率分布是解码器状态 s(i) 和注意上下文 c(i) 的函数。此外,当前状态 s(i) 还依赖于先前状态 s(i-1) ,先前最可能的字符 y(i-1) ,以及先前上下文 c(i-1) 。这种错综复杂的关系清楚地显示在图 4 中。

语音识别方法比较

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

图 5。[12]中比较的模型的各种测试集的 WERs (%)

图 5 显示了多个语音识别系统的单词错误率(WERs)。特别是,CTC-grapheme 模型是基于第三部分所示的第一种架构,Att。[1,2]-图层 dec。使用 LAS 技术。相关论文[12]中提供了实施细节和培训流程。

WER 是音频语音识别领域中使用的常用评估度量。它使用 Levenshtein 距离比较模型输出和地面真实情况。可以简化为 WER = (S+I+D) / N 其中 S 为替换数, D 为删除数, I 为插入数, N 为地真中的字数。性能最好的模型是使用两个解码器(或拼写器)层的 LAS。然而,考虑到额外的计算成本,使用单个拼写器的模型的准确性改进是微小的。乍一看,似乎基于 CTC 的模型甚至不可用。然而,这里给出的实现不包括语言模型。这是可以理解,因为所有模型都将受益于这种附加组件。但是正如我们前面看到的,CTC 模型的主要问题是它们的语法不正确。输出仍然是可理解的,但是从与参考文本的原始比较来看,表现很差。Graves 等人[2]通过将三元模型语言模型添加到基于 CTC 的模型中,达到了 6.7%的 WER。请注意,这种准确性很难与图 5 中的结果相比,因为它们不共享相同的训练过程。

语音合成

现在我们知道了虚拟助手是如何理解我们所说的话的,让我们看看它是如何回复的。语音合成或文本到语音(TTS)传统上使用两种主要策略构建:拼接和参数化。拼接方法将大量数据库中声音拼接在一起,生成新的可听语音。参数方法(HMM)使用由语言专家定义的表示复杂语言-听觉特征的模型。然而,这两种方法都不灵活,听起来像机器人。类似于语音识别领域,TTS 已经被神经网络增强。

最先进的深度学习方法已经显示出很好的效果。一些模型生成的语音可能会被误认为是真人的话。目前主要有两个 TTS 框架:百度研究院的 DeepVoice3 和 Google 的 Tacotron2。两种模型都使用 MEL 谱图作为管道中的中间表示。从输入文本生成声谱图,然后从元表示合成音频波。谱图生成过程总体上使用前面在语音识别部分看到的相同的 seq-2-seq 技术。此外,两个系统都使用音频合成器 WaveNet [9,10]。我们现在将关注 WaveNet 及其与应用于图像处理的深度学习技术的相似性。

波网结构

WaveNet 是给定 MEL 谱图的原始音频波形的生成神经网络。有人可能会说,一个简单的傅里叶逆变换可以更有效地完成类似的任务。不幸的是,从文本生成的频谱图目前还不足以产生听起来真实的语音。鉴于输入的 2D 性质,计算机视觉领域的深度学习技术是执行手头任务的一大灵感。自动回归模型、自动编码器和生成对抗网络(GANs)是执行图像生成的流行模型。WaveNet 实际上是基于 PixelCNN 架构,一种自动回归模型。

WaveNet 成功的关键是因果卷积(CCs)。这是一种适用于 2D 时间数据(如光谱图)的卷积。它确保模型保持输入的时间顺序。与经典卷积相反,在给定时间步长 t 发出的预测概率 p(x(t+1) | x(1),…,x(t)) 不依赖于下一个输入令牌,如图 6 所示。此外,CCs 不存在复发连接。因此,他们通常比其他 RNN 模型训练得更快。

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

图 6。因果卷积层堆栈的可视化[9]

然而,CCs 模型需要许多层来增加输入序列的感知场。例如,图 6 所示模型的接收场只有 5。在具有高时间分辨率的声谱图上,单个音素可以跨越数百或数千个时间步长。网络扩张解决了这个问题。这使得输入数据有很大的跳跃,所以我们有一个更好的全局视图。这个概念通过视觉类比很容易理解。这类似于扩大视野以看到整个景观,而不仅仅是照片上的一棵树。如图 6 所示,每增加一层,视野就扩大一倍。这种方法可以在不增加网络中数据分辨率的情况下产生巨大的感受野,从而保持计算效率。

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

图 7。膨胀因果卷积层堆栈的可视化[9]

WaveNet 训练和加速

然而,训练和推理过程的计算量非常大。它通常需要 10 到 30 个小时的个人语音训练数据。该模型必须为每秒的连续音频镜头产生 16 到 24,000 个样本。不幸的是,由于 CCs 架构是顺序生成的,因此要求逐个生成样本。这是对计算能力的巨大浪费,因为今天的显卡依赖于大量的并行计算。波形必须一次产生,利用并行计算单元来加速计算。WaveNet 的最新变体[10]从白噪声开始,并随着时间的推移对其进行改变,以将其变形为输出语音波形。变形过程在整个输入数据上是并行的。这种网络的训练需要另一个预训练模型。第二个模型,老师,是一个经典的序列波网。并行网络试图模仿教师网络的工作,同时更加高效。这可以通过在训练期间将教师放在学生前面(见图 8)来实现,这样反向传播算法就可以调整学生的参数。这种训练方法叫做概率密度蒸馏

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

图 8。波网概率密度蒸馏综述[10]

这种方法相对类似于 GANs 的训练:一个学生模型试图愚弄老师,而老师试图更好地区分假输入和真输入。然而,在这里,学生试图模仿而不是愚弄老师。注意,只有推理过程被加速,因为训练方法需要初始的完全训练的顺序模型。但是计算效率的提高对于推理来说是巨大的。波形生成比它的前身快一千多倍。实时生成现在在大多数硬件平台上都是绝对可行的,甚至是智能手机或者像 Google Nest 这样的家庭助手。

波网性能

评估生成模型是困难的。事实上,在给定输入的情况下,不可能将模型的输出与预期结果进行比较。根据定义,生成模型创造了新的、看不见的东西。WaveNet 也不例外。平均意见得分(MOS)是语音合成的有效验证度量。MOS 是一个描述声音样本如何作为自然人类语音传递的数字。它是通过人工评级服务获得经验值。Tacotron 2 [11]使用 WaveNet 从 seq2seq 模型生成的声谱图中合成音频,产生了很好的结果。这款机型的 MOS 为4.526±0.066,真正的专业录音达到4.582±0.053。此外,谷歌还进行了一项用户研究,让人们听 Tacotron 2 样本和专业语音解说员,并猜测哪一个更自然。你可以自己试试这个测试,在论文链接的以下网页上听听合成的样本[11]:【https://google.github.io/tacotron/publications/tacotron2】。图 9 显示了研究结果。

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

图 9。合成与地面真相:100 个项目的 800 个评级[11]

大多数时候,人们无法区分合成的和基础的真相样本。记录了一个微小但具有统计学意义的真实镜头趋势。这主要是因为专有名词和生僻词汇的发音错误。

计算机视觉应用于音频处理的局限性

现在,我们已经讨论了几种能够极大改善音频处理的深层架构。这些架构中的大多数最初是为了解决计算机视觉问题而开发的。然而,声音的时间-频率表示允许将声音视为 2D 数据,类似于图像。更具体地说,卷积层非常有用。然而,一些谱图特征可能对这种技术的进步产生实质性的限制。

首先,声音是透明的。视觉对象和声音事件不会类似地累积。声谱图中的黑暗区域显示没有声音,而它只是对应于图像中的黑暗物体或阴影。除了反射或透明表面,图像中的像素通常属于单个实体。相反,离散的声音事件叠加在一起成为一个独特的整体。不能假定给定时间步长的频率仓属于具有相关像素幅度的单个声音。它可以由任何数量的累积声音产生,甚至是复杂的相互作用,如相位抵消。在图片中容易分离对象的地方,分离重叠的声音并不方便。

第二,声谱图的轴与平面图像的轴不具有相同的含义。图像的轴描述了物体的投影位置。平移或旋转不会改变图片中主体的性质,只会改变它的位置。这就是 CNN 如此强大的原因。卷积层允许将对象的性质与其在图像中的位置分离开来。如果一只狗在图片的左上角或右下角,它仍然是一只狗。然而,声谱图沿 y 轴的平移会改变声音的频率。由于两个轴的不同含义,声谱图的旋转没有任何物理解释。正如我们在因果卷积的研究中所看到的,谱图的时间方面对模型的结构进行了一些修改。

第三,声音的频谱特性是非局部的。图像的相邻像素属于相同的对象或形成边界。然而,声音却不是这样。虽然声音的基频是局部的,但它的音色却不是。声音的音色是由 y 轴上的所有谐波组成的。这些谐波频率在声谱图中不是局部接近的,而是形成相同的声音,并且根据共享关系一起移动。

结论

现在,您应该对神经网络上下文中的时频表示的优势有了更好的理解。我们在这里描述的几个架构仅仅提供了可能的应用的一瞥。然而,CTC 和 seq2seq 架构封装了经典计算机视觉模型如何适应音频处理,关键区别在于频谱图的时间性质。此外,这些方法是通向更高级应用的垫脚石,如声音克隆。

毫无疑问,计算机视觉对于大多数二维数据的分析是一个巨大的启发。它对音频处理产生了重大影响,因为它允许端到端管道,而无需创建全新的架构。然而,光谱图的年代性质是图像和音频之间的一个严重障碍。虽然基于卷积的网络显著提高了精度,但这种层不适合光谱图。如 IV 所示,新技术带来了根本性的不同。计算机视觉应用于音频处理的局限性。语音相关的 2D 卷积为基础的技术公认达到他们的桃性能。剩下的误差百分比肯定是由于光谱图的不寻常的特性造成的。

感谢阅读。在 LinkedIn 上与我联系,继续讨论!

参考

[1] Chris Manning 和 Richard Socher,第 12 讲:语音处理的端到端模型 (2017),斯坦福大学

[2]格雷夫斯、亚历克斯和纳夫迪普·贾伊特利。用递归神经网络实现端到端语音识别 (2014),ICML。第 14 卷。

[3] H. Sak,A. Senior,K. Rao,O. Irsoy,A. Graves,F. Beaufays 和 J. Schalkwyk,(2015),IEEE 声学、语音和信号处理国际会议(ICASSP)

[4] Amodei,Dario,等人,深度语音 2:英语和普通话的端到端语音识别 (2015),arXiv 预印本 arXiv:1512.02595

[5]陈伟霆和纳夫迪普·贾伊特利和阔克诉勒和奥里奥尔·维尼亚尔斯案,"听、听、拼 (2015),arXiv:1508.01211

[6] Chung-Cheng Chiu 和 Tara N. Sainath 和 Yonghui Wu 和 Rohit Prabhavalkar 和 Patrick Nguyen 和和 Anjuli Kannan 和 Ron J. Weiss 和 Kanishka Rao 和 Ekaterina Gonina 和 Navdeep Jaitly 和和 Jan Chorowski 和 Michiel Bacchiani,采用序列到序列模型的最新语音识别技术 (2018),arXiv:1712.01769

[7] N. Jaitly,D. Sussillo,Q. Le,O. Vinyals,I. Sutskever 和 S. Bengio,一种神经传感器 (2016),arXiv 预印本 arXiv:1511.04868

[8]魏平和彭和安德鲁吉比安斯基和 o .阿里克和阿贾伊坎南和纳朗和乔纳森雷曼和约翰米勒,深度语音 3:利用卷积序列学习缩放文本到语音 (2018),arXiv: 1710.07654

[9]亚伦·范·登·奥尔德和桑德·迪耶曼和黑加·曾和卡伦·西蒙扬和奥里奥尔·维尼亚尔斯和亚历克斯·格雷夫斯和纳尔·卡尔奇布伦纳和安德鲁·老和科拉伊·卡武克库奥卢, WaveNet:原始音频的生成模型 (2016),arXiv: 1609.03499

[10]Aaron van den Oord and Yazhe Li and Igor Babuschkin and and Oriol viny als and Koray Kavukcuoglu and George van den dries sche and Edward Lockhart and Luis c . Cobo and Florian stim Berg and Norman and Grewe and Seb Noury and Sander die Elman and Erich Elsen and Nal Kalchbrenner and Heiga Zen and Alex Graves and Helen King and Tom Walters and Dan Belov and,平行波网:快速高保真语音合成(2010 年)

[11]和庞若明和 Ron J. Weiss 和 Mike Schuster 和 Navdeep Jaitly 和 Zongheng Yang 和和和 Skerry-Ryan 和 Rif A. Saurous 和 Yannis Agiomyrgiannakis 和 Wu Yonghui,通过调节 WaveNet 对 Mel 谱图预测进行自然 TTS 合成 (2018),arXiv: 1712.05884

[12] Rohit Prabhavalkar 和 Kanishka Rao 和 Tara Sainath 和李博和叶小开·约翰逊和纳夫迪普·贾伊特利,语音识别的序列间模型比较 n (2017),Interspeech 2017,ISCA

PyMC3 应用贝叶斯推理第 1 部分

原文:https://towardsdatascience.com/applied-bayesian-inference-pt-1-322b25093f62?source=collection_archive---------14-----------------------

实践教程

条件世界导论

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

毛伊岛上空的银河。作者图片

这个故事是为那些已经稍微熟悉统计学和 Python,并希望将他们的技能提升到一个新水平的人而写的。我将从哲学开始,然后尝试直接用 Python 实现概念,为您构建一个更具可操作性的指南。我已经无数次读到过这个世界,但直到我实际应用它之前,我对自己的能力没有信心,所以我恳求你找到一个你感兴趣的数据集,然后一头扎进去!

有帮助的先决条件:熟悉统计学直到假设检验,初级到中级 Python 技能。

在这个故事中,我将介绍贝叶斯思维、概率编程介绍,以及一个用 PyMC3 & ArviZ 掷硬币的例子。

思维贝叶斯

当我们听到“统计”这个词时,我们通常会更多地考虑长期运行的频率。我们的脑海中会立即浮现出这样的例子:硬币正面朝上的概率,在六面骰子上掷出 3 的概率,闪电击中的概率。举个例子:如果你想知道一枚硬币正面朝上的概率,那么你可以想象一个世界,你把一枚硬币抛了无数次,然后看看在令人难以置信的大量抛硬币或试验中,它有多少次正面朝上。这个经典的思想流派被称为频率主义者,其中概率被认为是经过多次试验后某一事件相对频率的极限。有些情况下,“长期频率”思维没有太多的逻辑意义,比如:考试得 A 的概率和*选举结果的概率。*频率主义者通过调用替代现实来解决这些问题,并说在所有这些现实中,发生的频率决定了可能性。本质上,频率主义者将参数(测试统计试图估计的)视为确定性的,或非随机的变量。

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

当 n 趋近于无穷大时,真实概率就接近于。作者图片

与这一学派相反的是贝叶斯,其中概率表达了对一个事件的相信程度。因为这篇文章的大部分内容将在贝叶斯世界中进行,所以让我举例来介绍这种思维方式。

这个例子来自行为心理学家丹尼尔·卡内曼和阿莫斯·特沃斯基,在思考快与慢 (Kahneman,2011)中得到推广:

“史蒂夫非常害羞和孤僻,总是乐于助人,但对人或现实世界不感兴趣。温顺整洁的灵魂。他需要秩序和结构,热爱细节。”

史蒂夫更有可能成为图书管理员还是农民?

他们发现绝大多数人选择图书管理员(90%)而不是农民(10%)。不管答案如何,丹尼尔&阿莫斯发现,人们甚至不考虑世界上图书馆员与农民的比例来做出决定,这是不合理的。即使是关于图书馆员和农民的比例,这也不是关于人们实际上知道真实的答案,而是关于思考去估计它。正如来自 3Blue1Brown 的 Grant Sanderson 如此雄辩地指出的那样,这一点可以用图形更好地说明:

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

作者图片

让我们说,在我们的估计中,我们认为图书管理员约占农民总数的 1/21。我们的目标是根据描述找出史蒂夫成为图书管理员的可能性。假设我们发现证据表明,在 10 名图书管理员和 200 名农民中,有 4 名图书管理员和 20 名农民符合这个描述。

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

作者图片

因此,考虑到我们的信念、证据和目标,我们可以宣称概率为:

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

作者图片

现在让我们说,在对这个话题做了更多的阅读之后,我们发现图书馆员与农民的比例并没有那么低。那么,在这种情况下,我们所要做的就是更新我们先前的信念(实质上是加宽细长的蓝色条)并重新计算。这是贝叶斯哲学的真正精髓;没有“对”或“错”的概念,因为你在用你先前的知识和新的证据不断更新你对世界的理解。

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

作者图片

本质上,贝叶斯主义者将参数(最有可能解释数据的分布)视为随机变量。下面是我们的例子如何映射到贝叶斯世界中的术语:

  • 先验:P(H) = 1/21。在看到证据之前我们所知道的参数值。
  • 证据(又名边际可能性)😛(E) = 24。证据 E 不考虑事件的可能性有多大。
  • 可能性:P(E|H) = 4/10 = 2/5。给定假设证据有多大可能?
  • 后验:P(H|E) = 4/24 = 1/6。给定证据,假设的可能性有多大。

综上所述,我们得到:

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

作者图片

当我们把它简化时,我们得到:

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

贝叶斯定理。作者图片

顺便说一下,由于在贝叶斯世界中获得洞见的“主观”本质,它可能会被混淆,并很容易被简化为仅仅是观点。这可能是一个懒惰的概括,因为所有的统计(频率主义者和贝叶斯)都需要假设,无论在哪里做出假设,从数据到见解,你都有一个相对主观的工艺。

这说明了数据的真正价值,因为当我们收集无限量的数据(或证据)时,比如说当 N 接近无穷大时,贝叶斯结果往往与频率主义者的结果一致。因此可以推断,统计推断对于大的 N. 来说或多或少是客观的。问题是我们通常没有无限的资源(时间、能量、数据、计算等)。),所以我们不得不在现有证据较少的世界里工作。在频率主义者的世界里,这将产生具有更大方差和更大置信区间的结果。贝叶斯分析在这里可以大放异彩,因为你保留了不确定性,突出了小数据集上统计推断的不稳定性。请注意,这并不意味着贝叶斯在小数据集上比 Frequentist“更准确”。两者都需要假设才能获得洞察力,数据集越小,需要做出的假设就越多/越广泛。

概率规划

请记住,我们的目标是计算后验概率,理想情况下是基于大量数据(以有效的方式)。由于过去的斗争和计算时代的发展,我们已经开发了概率编程语言(PPL),即 PyMC3。PPL 旨在帮助在模型创建和推理之间划清界限,同时也使设计和调试更加容易。这个框架允许各种数值方法作为通用推理机来应用,以自动化整个过程的推理部分。使用相对较少的代码行,就可以以有效和合理的方式创建复杂的概率模型。为了可视化 PyMC3 结果,我们将使用 ArviZ 库,正如您将看到的,它是为了补充 PyMC3 而惊人地构建的。

让我们来看看一些最著名的推理引擎。许多这方面的知识在 用 Python 进行贝叶斯分析(马丁 2016) 中得到了令人难以置信的解释,所以我将从那里汲取灵感:

非马尔可夫方法:

  • 网格计算
  • 二次逼近
  • 变分法

马尔可夫方法:

  • 大都会黑斯廷斯
  • 哈密尔顿蒙特卡罗/无掉头采样器

由于被称为 MCMC ( 蒙特卡罗马尔可夫链)模型的马尔可夫方法是当今最流行的方法之一,所以我在这里只集中讨论这些方法。我发现学习这些方法的理论的最好方法是通过做和倒退,所以让我们先从一个简单的,人为的抛硬币的例子开始。

import pandas as pd
import numpy as np
import pymc3 as pm
import arviz as az
from arviz.plots.plot_utils import xarray_var_iter
import scipy.stats as stats
import matplotlib.pyplot as plt
%matplotlib inlinenp.random.seed = 0#the number of samples
N=15#establishing prior and getting observed data
theta_real = .5
observed_data=stats.bernoulli.rvs(p=theta_real, size=N)#the number of heads
k=observed_data.sum()print(observed_data)
print(f"There are {k} heads")[1 0 1 1 1 1 1 0 0 0 0 1 0 1 1]
There are 9 heads

上面的代码只运行 15 次概率(theta_real)为 0.5 的硬币投掷。在大多数真实的用例中,这需要估计。现在我们有了数据,让我们来构建模型:

#fit the observed data 
with pm.Model() as coin_flip:
    theta=pm.Beta('theta', alpha=1, beta=1)
    y=pm.Bernoulli('y', theta, observed=observed_data)

pm.model_to_graphviz(coin_flip)

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

作者图片

为了在这里阐述思维过程,这本书 黑客的贝叶斯方法:概率编程和贝叶斯推理 (Davidson-Pilon,2015) 提供了一个惊人的心理模型指南。当你构建贝叶斯模型时,你应该问自己的第一个问题是“这些数据是如何产生的?”

**1。**我们首先思考,“描述这个抛硬币数据的最佳随机变量是什么?”二项式随机变量是一个很好的候选变量,因为它可以很好地表示具有 n 次独立试验的二元决策过程。这是代码块中的第三行,代表我们的可能性。单个成功/失败实验也称为伯努利试验或伯努利实验,一系列结果称为伯努利过程;对于单次试验,即 n = 1,二项分布是伯努利分布。

**2。**接下来,我们想,“好吧,假设掷硬币是二项分布的,我需要什么来得到二项分布?”嗯,二项分布有一个参数θ(θ)

**3。**我们知道 θ 吗?是的,但是让我们假设我们没有。在大多数真实情况下,我们不会,我们需要估计它,但对于我们的例子,我们知道它是 0.5。但是我们可以引入一个天真的先验,好像我们不知道 *θ。*这是代码块中的第二行,代表我们的先验。

**4。**什么是 θ 的好分布?Beta 是好的,因为它模拟了有限范围的事物,比如 0 到 1。贝塔分布有两个决定其形状的参数,阿尔法(α)和贝塔(β)。

5。我们知道α和β可能是什么吗?不。在这一点上,我们可以继续并给这些参数分配一个分布,但一旦我们达到一个设定的无知水平,最好停止(记住我们只进行了 15 次试验作为证据);尽管我们对 θ 有一个先验的信念(“当我们接近无穷大时,它可能会趋向于 0.5”),但我们对α和β并没有什么强有力的信念。所以最好就此停止建模。

6。那么,α和β的合适值是多少呢?贝塔分布的形状因这些值而异,但首先我们将α和β指定为 1。这等同于从[0,1]开始的均匀分布。这是一个弱信息先验,因为它基本上假设没有先验知识,知道公平抛硬币头的概率是多少。本质上,该参数可以是 0 到 1 之间的任何值。

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

贝塔分布的概率密度函数,公共域

这种思维方式“这个数据是怎么产生的?”非常关键。本质上,我们对世界上的某个过程有一些假设,并希望对该过程建模,因此我们希望选择适当的分布组合来创建模型。如果我们假设公平抛硬币的概率代表贝塔分布,并且我们希望我们的模型描述它,那么由于共轭性,选择我们的先验分布为贝塔分布和可能性为二项式分布是一个重要的选择。如果后验分布与先验概率分布在同一概率分布族中,则先验和后验被称为共轭分布、**,先验被称为似然函数的共轭先验。本质上,如果我们使用贝塔分布作为先验,使用二项式分布作为似然,我们将得到贝塔分布作为后验。

共轭性确保了后验概率的数学易处理性,这一点很重要,因为贝叶斯统计中的一个常见问题是我们无法解析地解决后验概率。幸运的是,无论我们是否选择共轭先验,现代计算方法都使我们能够解决贝叶斯问题,但重要的是要认识到制作适当模型的价值。

现在让我们按下推理引擎按钮,看看我们得到了什么:

with coin_flip:
 step = pm.Metropolis()
 trace = pm.sample(10000, step=step, return_inferencedata=True)

默认情况下,PyMC3 将运行 Metropolis 推理引擎(Metropolis-Hastings),但是我们也可以显式地声明它。我们选择要运行的样本数量,现在让我们看看我们的模型学习数据的程度。

var_names = ["theta"]
lines = list(xarray_var_iter(trace.posterior[var_names].mean(dim=("chain", "draw"))))
az.plot_trace(trace, lines=lines);

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

作者图片

正如我们所看到的,后验概率的平均值接近 0.5,但确实有点偏。考虑到这只是 15 次试验,我们可以想象如果我们进行更多的试验,模型会自然地找到它的方向!对于左边的图,我们寻找的是一个相对平滑的核密度估计(KDE)图。没有那么顺利,可能是多种原因造成的(推理机的选择,数据中的观察次数,样本数等。).对于右边的图,我们要找的是没有明显的模式。我们希望右边的图类似于白噪声,没有明显的“分歧”被描述;本质上,我们想要各种蒙特卡罗马尔可夫链的良好混合。

在我们进一步分析后验分布之前,让我们看看是否能得到一个更好的 KDE 图。

with coin_flip:
 step = pm.NUTS()
 trace = pm.sample(10000, step=step, return_inferencedata=True)var_names = ["theta"]
lines = list(xarray_var_iter(trace.posterior[var_names].mean(dim=("chain", "draw"))))
az.plot_trace(trace, lines=lines);

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

作者图片

这样看起来好多了!但是为什么呢?我们的第一个模型和这个模型的区别在于推理机。我们首先使用了默认的 Metropolis-Hastings 推理引擎,现在我们尝试了哈密尔顿蒙特卡罗/无 U 形转弯采样器。这相当精彩地解释了它们的区别(概念上和数学上的),我将尝试在这里总结它们的区别:

Metropolis-Hastings 使我们能够从任何概率为 p(x) 的分布中获取样本,只要我们能够计算出至少一个与其成比例的值。这在概念上类似于试图从船上测量湖底的形状,方法是随机使用一根长棍来测量与一点的距离,然后在更深的方向上反复移动,并且只在这些方向上移动。正如你所想象的,经过大量的迭代,你会对湖底的形状有一个非常精确的描述,这在贝叶斯世界中也是相似的(湖底是后验分布)。

汉密尔顿蒙特卡罗/NUTS 源于这样一种认识,即获取大量样本可能会非常昂贵(时间和计算)。这种方法基本上与 Metropolis-Hastings 相同,只是我们没有建议随机移动我们的船,而是做了一些更聪明的事情;我们沿着湖底的曲线移动小船。为了决定下一步去哪里,我们让一个球在湖底滚动,从我们现在的位置开始。我们扔一个球,让它滚动一小会儿,然后我们把船移到球所在的地方。现在,我们使用 Metropolis 标准来接受或拒绝这一步,就像我们在 Metropolis-Hastings 方法中看到的那样。熟悉用 Adam 优化的梯度下降的人可能会发现这种方法类似。

像所有事情一样,使用更聪明的哈密尔顿方法有一个权衡。HMC 的每一步都比大都会-黑斯廷斯的每一步计算起来更昂贵,但是 HMC 接受这一步的概率比大都会高得多。我强烈建议阅读之前链接的页面,深入了解这个概念,但现在让我们继续前进。

我们还可以打印出一个数据框架,显示我们的后验分布建模的关键指标:

az.summary(trace)

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

作者图片

默认情况下,我们可以获得相当多的信息:平均值、标准差、最高密度区间(HDI)等等。返回的数量之一是蒙特卡洛标准误差(MCSE)平均值和标准偏差。这是对采样方法引入的误差的估计。它被定义为链的标准偏差除以它们的有效样本量。该估计考虑到样本并非真正相互独立。后验分布的另一个快速质量检查是 r_hat 度量。经验法则是,您希望该值接近 1.0,因为这表示链中的收敛。通常,高于 1.05 的值是一个关注点,1.0 和 1.5 之间的值值得研究。

这里有趣的是,即使进行了 15 次试验,我们的估计仍然得到接近 0.5 的平均值,但肯定比我们想要的要高。看到 r_hat 告诉我们,我们的模型在构造中也不一定会遇到错误,所以我们的许多估计结果都是因为我们的数据很少。

为了解释高密度间隔,让我们直观地看一下:

az.plot_posterior(trace, kind='kde', ref_val=0.5);

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

作者图片

在贝叶斯推理中,与频率主义推理不同,我们得到值的整个分布。每次 ArviZ 计算和报告 HPD 时,默认情况下,它将使用 94%的值。在频率主义者的世界里,我们有 p 值和置信区间。在贝叶斯世界中,这被称为可信区间。这里我们可以解释为,有 94%的概率,硬币抛头的信念在 0.45 到 53 之间。这里的好处是,我们用频率主义者世界中相对混乱的术语和解释来换取贝叶斯世界中明智的估计。不利的一面是,我们失去了一个更明确的行动来换取一系列的信念。例如,在这种情况下,硬币可能会稍微偏向正面,因为大部分区间都在 0.5 以上,但也可能是 0.38。频繁主义者的世界可能会给我们提供一个更明确的答案,但一如既往:你一直在做出假设以获得洞察力。

最后,我们可以运行后验预测检验(PPC)来验证我们的模型。这里的想法是,我们比较观察数据和预测数据,找出这两组数据之间的差异。主要目标是检查自动一致性。这是通过使用来自后部的每次绘制的参数从模型生成数据来完成的。理想情况下,生成的数据和观察到的数据应该或多或少相似。即使我们把所有的建模都做对了,他们也可能会看走眼。对原因的调查可能会导致我们模型的重大改进,这是我们以前可能没有想到的。

with coin_flip:
 ppc = pm.sample_posterior_predictive(trace, var_names=[“theta”, “y”])ppc['y'].shape(20000, 15)az.plot_ppc(az.from_pymc3(posterior_predictive=ppc, model=coin_flip));

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

作者图片

fig, ax = plt.subplots(figsize=(10, 5))
ax.hist([y.mean() for y in ppc['y']], bins=19, alpha=0.5)
ax.axvline(observed_data.mean())
ax.axvline(0.5, c='r')
ax.set(title='Posterior Predictive Check', xlabel='Observed Data', ylabel='Frequency');

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

作者图片

看起来我们的贝叶斯模型能够很好地学习我们观察到的数据分布!这一点尤其值得注意,因为我们只进行了 15 项试验,坦白地说,这是相当疯狂的。像任何数据项目一样,高性能模型不仅仅是好的度量数字。我们对掷硬币的了解告诉我们,0.6 对于公平的掷硬币来说没有多大意义。

所以现在,以真正的贝叶斯方式,让我们收集更多的证据,更新我们的先验,看看会发生什么。

根据新证据更新信念

假设我们进行 1000 次相同的掷硬币试验:

#the number of samples
N_updated=1000#establishing prior and getting observed data
theta_real = .5
observed_data_updated=stats.bernoulli.rvs(p=theta_real, size=N_updated)#the number of heads
k_updated=observed_data_updated.sum()print(observed_data_updated)
print(f”There are {k_updated} heads”)[0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1]
There are 511 heads

在我们构建模型时,我们也可以更新之前的 Beta 分布,使其看起来更像一个能更好地反映掷硬币的形状。

#fit the observed data 
with pm.Model() as coin_flip_updated:
 theta=pm.Beta(‘theta’, alpha=2, beta=2)
 y=pm.Bernoulli(‘y’, theta, observed=observed_data_updated)

pm.model_to_graphviz(coin_flip_updated)

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

作者图片

with coin_flip_updated:
 step = pm.NUTS()
 trace_updated = pm.sample(10000, step=step, return_inferencedata=True)var_names = ["theta"]
lines = list(xarray_var_iter(trace_updated.posterior[var_names].mean(dim=("chain", "draw"))))
az.plot_trace(trace_updated, lines=lines);

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

作者图片

az.summary(trace_updated)

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

作者图片

az.plot_posterior(trace_updated, kind=’kde’, ref_val=0.5);

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

作者图片

with coin_flip_updated:
 ppc_updated = pm.sample_posterior_predictive(trace_updated, var_names=[‘theta’, ‘y’])az.plot_ppc(az.from_pymc3(posterior_predictive=ppc_updated, model=coin_flip_updated));

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

作者图片

fig, ax = plt.subplots(figsize=(10, 5))
ax.hist([y.mean() for y in ppc_updated[‘y’]], bins=19, alpha=0.5)
ax.axvline(observed_data_updated.mean())
ax.axvline(0.5, c='r')
ax.set(title=’Posterior Predictive Check’, xlabel=’Observed Data’, ylabel=’Frequency’);

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

作者图片

这里令人惊讶的是,我们的贝叶斯模型能够超越我们的证据(其平均值约为 0.51),并确定公平抛硬币的真实平均概率:0.5。只要收集新的证据,更新我们先前的信念,重塑我们的数据,我们就能够对掷硬币现象做出更好的估计!

数学上已经证明,如果我们想扩展逻辑以包括不确定性,我们必须使用概率和概率论。正如我们所看到的,贝叶斯定理只是概率规则的逻辑结果。因此,另一种思考贝叶斯统计的方式是在处理不确定性时作为逻辑的延伸。

这个世界还有许多令人着迷的深度,在第 2 部分中,我计划将这些应用到真实世界的数据集中!看这里:用 Python pt 应用贝叶斯推理。2

参考文献

[1]奥斯瓦尔多·马丁,用 Python 进行贝叶斯分析

[2]卡梅隆·戴维森-皮隆,黑客的概率编程和贝叶斯方法

【3】卡西·科济尔科夫,统计学:你是贝叶斯主义者还是频率主义者?

应用贝叶斯推理与 PyMC3 和 Bambi 第 3 部分

原文:https://towardsdatascience.com/applied-bayesian-inference-with-pymc3-and-bambi-pt-3-d4bfb3211509?source=collection_archive---------8-----------------------

预测 Spotify 前 200 首歌曲的流

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

银翼杀手 2020。作者图片

介绍

这是我的应用贝叶斯推理系列的最后一部分。在第 1 部分中,我介绍了条件世界和概率编程:

在第 2 部分中,我展示了如何通过对 Nike 和 Adidas 的鞋子建模来将模型扩展到“真实”数据。这篇文章展示了如何运行更有效的 A/B 测试和组比较:

在本部分的第 3 部分,我将通过在 PyMC3 中引入线性回归,然后将其进一步引入层次模型、广义线性模型和样本外预测,来展示贝叶斯建模为何如此不可思议。

这个故事将看看 Spotify 的数据,即 2020 年至 2021 年的前 200 首歌曲。可以在这里找到数据集:https://www . ka ggle . com/sashankpillai/Spotify-top-200-charts-2020 2021。我们将尝试基于每首歌曲的相关特征(可跳舞性、艺术家追随者等)为每首歌曲的流的后验建模。)

探索性数据分析和清理

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

作者图片

Dtypes 是一个很好的起点:

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

作者图片

这肯定需要一些清理。此外,因为它们是对象,所以很可能需要清理一些奇怪的文本才能变成数字。在这之间,我认为最大的变化是体裁栏。每首歌曲似乎符合 1 个以上的流派,这些流派以列表的形式表示。对于我们的用例,我们希望对这些列进行一次热编码。这可以很容易地用 sklearn 的 MultiLabelBinarizer 来完成。

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

作者图片

那应该好多了!现在我们想把列按类型分成 1 列。修复 dtype 和 2。从一个地方开始过滤。从那里,我们可以绘制流分布图,看看我们的目标是什么。

对于回归,集中或标准化你的价值是常见的做法,这里也不例外。事实上,对于 MCMC 模型来说,标准化您的值可能特别重要,因为否则采样器将很难收敛。标准化对我们来说还有另一个优势,那就是能够使用弱信息先验,因为截距总是为零,斜率大约为-1 和 1。它还允许我们用 Z 分数来表示,确定离平均值有多少标准偏差值。

0

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

作者图片

我们现在只处理这些数字字段;稍后的实现可以很容易地扩展到包含我们之前编码的分类列(genre)。

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

作者图片

这是我们在许多场景中看到的常见分布形状。这是有很多人处于“较低”值的结果,并且随着你在尾部越靠右,人数呈指数下降。有趣的是,我们发现它甚至对前 200 首歌曲都如此强大,但这将是我们在建模后要记住的一个重要部分。

首先,我们可以画出标准化的水流记录图:

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

作者图片

仍然不是最好的,但是好多了。我们显然有一些离群值,它们在去年经历了一些大规模的病毒式传播。

简单回归

最好的学习方法是实践,当事情很复杂时,最好从尽可能简单的开始,然后慢慢扩大规模。这里最简单的例子是线性回归,让我们看看我们想要将流建模为艺术家追随者的函数。也许我们有一些预感,艺术家的追随者对溪流有一些影响。

首先理解人际关系是一个好习惯;艺术家的追随者如何与排名前 200 的流相关联?

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

作者图片

几乎没有相关性,这似乎是有意义的,因为这些歌曲已经非常受欢迎——甚至可能出现反向相关性(当一首新歌进入前 200 名时,该艺术家的粉丝显著增加)。不仅在建模之前,而且在从结果中得出结论的时候,理解这些类型的见解都非常重要。现在每个人都应该明白这种相关性了!=因果关系,但相关性可能流向哪个方向?为什么呢?这些可以给你惊人的洞察力,让你知道如何修复模型中的问题,或者你想要管理什么样的数据来改进你的模型。

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

作者图片

这里有趣的是,我们为 beta(x 的权重,艺术家的追随者)和偏差创建一个先验,然后创建一个线性函数(alpha + betax)来建模可能性。请记住,我们试图将后验概率建模为先验的函数,但当我们这样做时,我们能够基于观察值的不确定性量化值的分布。我们希望将 mu 包装在一个确定性函数中,因为我们不希望它每次都不一样;它应该总是遵循 alpha + betax 的结果,但 alpha 和 beta 具有随机先验,允许模型扫描它们的一系列选项。

此外,我们还可以创建一些确定性的指标来非常简单地测量我们的输出。因为我们在处理回归,所以我们也可以在模型构建本身中计算 r2 值。这创造了一个非常简单的方法来确定拟合线与数据的吻合程度。

现在我们可以对数据进行采样。NUTS(不掉头采样器)是大多数用例的绝佳选择。虽然它的每一步都比 Metropolis 慢,但它能够轻松穿越对角线空间。此外,它通常需要少得多的步骤来获得对后验概率的合理近似。

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

作者图片

我们在轨迹中没有看到明显的差异,标准化/居中显著地帮助我们的模型为每首歌找到合适的分布。让我们看看我们的 r2,并绘制结果。

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

作者图片

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

作者图片

因此,我们的模型表现很好,但我们得到了相当低的相关性,这在看到这个散点图时应该很明显。一开始真的没有太多的相关性,这一点似乎越来越明显。不过,我们可以做很多事情来改进这个模型。首先,让我们使用 StudentT 分布作为我们的可能性,看看我们是否可以使它对异常值更稳健,同时也预测样本外。

稳健的线性回归和样本外预测

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

作者图片

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

作者图片

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

作者图片

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

作者图片

我们在拟合数据的直线方面得到了显著的改进—~0.16!从技术上讲,由于我们对数据进行了标准化,斜率和皮尔逊相关系数具有相同的值,但这是一种非常有趣的将它融入建模的方式。仍然不是流的最佳预测器,但我们可以看到这条线不太可能被数据集中的潜在异常值选中。虽然这对我们没什么好处,但我们也可以轻松地更新我们的数据,并在测试数据集上使用该模型预测后验概率。

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

作者图片

Mean Squared Error: 0.6710557105827462

令人惊讶的是,不仅可以很容易地找到一个测试点(每个后验分布的平均值),而且还可以找到一个值的分布来估计误差!我们现在可以利用这些技能来构建这个简单的模型,并在此基础上继续构建。

进入贝叶斯建模界面——Bambi。

多重、分层和广义线性模型

像以前一样,如果我们要加入更多的变量,我们应该首先可视化关系,并确保特征之间以及特征/预测变量之间的最小相关性。我们可以用我最喜欢的可视化工具散点图矩阵有效地做到这一点。

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

作者图片

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

作者图片

似乎“能量”和“响度”比我们想象的更相关。当试图对这些变量之间的关系建模时,这可能会导致许多问题,因此我们可以删除一个变量。

注意最后一行是 Log_Streams 值,所以我们不需要评估它与流的相关性,因为我们还没有建模。

多元线性回归

使用 Bambi,我们可以轻松地写出我们的公式,并像这样创建模型:

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

作者图片

我将跳过 traceplots 和 forestplots 来分析这里的数据,但请确保使用它们来确保您的模型正确地收敛到每个要素!跟踪图是直观显示 MCMC 模型输出的极好方法。

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

作者图片

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

作者图片

Mean Squared Error: 0.5720862510645325

请注意,我们在后验预测中对两条链进行采样,以模拟测试预测,因此我们采用了两个列方式的平均值,一个是两条链的平均值,另两个是每个预测的后验分布平均值(测试值)。

随着我们添加特定歌曲的更多特征(可跳性、效价、能量等等),MSE 明显更好。通过评估拟合模型摘要中的平均值,有趣的是,追随者似乎对增加 Log_Streams 的其他值有最强的影响。Danceability 和 Speechiness 等功能似乎对 Log_Streams 有负面影响,但重要的是对这些功能持保留态度,因为我不完全确定 Spotify 是如何记录这些信息的(更不用说有人可能是如何操纵它以在 Kaggle 中获得这些信息的)。

此时你可能已经意识到的一个重要问题是,艺人的歌曲变奏曲呢?我们目前正在为每首歌单独建模(非池化),但我们也可以为每个艺术家的歌曲建模(池化)。每一个问题是,你必须为它放弃一些东西。如果没有,你就失去了看到艺术家之间细微差别的能力;有了 pooled,你就失去了每首歌分发的粒度。那么我们能做什么呢?分级部分统筹来救援!

分层部分池

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

作者图片

这看起来复杂得多,但实际上非常简单。到目前为止,我们所学的贝叶斯推理的整个概念是,你能够烘焙先前的知识,并建立一个后验分布模型,该模型适合于随着新知识的形成而更新。到目前为止,我们只对直接先验进行了建模(例如,基于正态概率的 mu 和 sigma 先验),但是如果我们的数据具有层次性质,会怎么样呢?如果我们可以对每个艺术家的歌曲元数据的分布进行建模,这不是很好吗?简而言之,我们可以,而且很容易。这是一个层次模型,它包括你在你的先验知识上增加超先验知识;在这种情况下,我们添加了按艺术家对歌曲元数据特征的分组,并添加了超优先级以及我们的可能性。

在代码块中,我们可以通过向每个特性添加“(1|…)”来表示我们想要一个层次模型,然后简单地向值添加适当的优先级。语法可以分解如下:

  • 常见的预测因素是你的主要影响。例如,可跳舞性。
  • 群体预测因子可以通过三种不同的方式来识别:1 .(Danceability|Artist)表示我们希望允许每个艺术家拥有自己的可跳舞斜率和截距,2。(1|Artist)表示我们想要 Artist 的不同截距,而不是斜率,以及 3。(0+Danceability|Artist)表示我们只想要特定于每个艺术家的斜率,而不包括特定于艺术家的截距。

显然,我们拥有的知识越少,我们想要实现的先验就越广,就像以前一样。无论如何,这个模型表现如何?

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

作者图片

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

作者图片

不幸的是,Bambi 目前还没有功能(版本 0.6.3)来进行样本外预测,当你涉及到分类分组时,我们的模型似乎也可以学习分布。做部分池的好处是,我们不仅可以看到这方面的后验分布,还可以衡量每个艺术家的歌曲属性分布的影响。下面是一些受欢迎程度的例子:

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

作者图片

尽管分层建模非常吸引人,但很明显我们不能完全有效地对观察到的分布建模。这是因为它的非高斯形状。我们试图用线性模型来模拟它,这些模型假设了一个常态水平,而在现实中,我们只是看不到。此外,我们的流永远不会低于 0,所以我们的 Log_Streams 永远不会低于 0(最小的流计数可能是 1 和离散的)。我们如何对此建模?

广义线性模型

广义线性模型在 Bambi 中非常容易实现,它们是我们问题的解决方案。我们的河流不是自然分布的,因此我们应该考虑如何有效地模拟它们的真实性质。一个好的开始是我在第 1 部分中概述的指南——我们如何相信这些数据是收集的?流是一种计数方法;它们反映了一首歌曲在 Spotify 上播放的离散次数。对我们来说幸运的是,有一种流行的 GLM 类型完全符合这一点:泊松。下面是我们如何用 Bambi 实现它以及结果(注意我们现在是如何直接建模流的)。

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

作者图片

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

作者图片

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

作者图片

重要声明:在撰写本文时,我使用了已经标准化的 Streams 字段,该字段不适合建模为泊松分布,因为这会将离散计数数据转换为低于 0 的连续数据(大喊到 Susia 以捕捉这一点)。在我能够解决这个问题之前,请确保知道要建模的预期字段是流的原始计数。

Mean Squared Error: 0.2989611604295006

多么惊人的进步啊!但是为什么 MSE 变得如此之好呢?实际上,我敢打赌我们可以更低,但是怎么做呢?这个问题的答案就是贝叶斯机器学习的精髓。

该模型表现明显更好的原因是因为我们仔细考虑了数据及其代表的内容。我们思考了它的细微差别以及它是如何被收集的。在一个问题上投入无止境的建模技术可以提高你的度量,但是模型不会真正歌唱,直到你做了战略设计的艰苦工作。贝叶斯 ML 让我们能够非常灵活地做到这一点,并且通过稳健和精确的先验变得更加强大,这是我们做/改进的另一件事。允许你的前科有一个大致的学习空间可以创造一个真正的信息模型,能够快速收敛和有效学习。

模型比较

为了更好地总结这一点,让我们进行模型比较,以更清楚地了解每个模型的表现。

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

作者图片

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

作者图片

默认情况下,AriZ 使用留一个交叉验证。另一种选择是广泛适用的信息标准(WAIC)。由于结果是对数标度的,因此具有最高值的模型给出了更好的样本外预测拟合,这就是我们前面看到的广义线性模型。

结论

这结束了我的应用贝叶斯推理的 3 部分系列,我们已经能够在这段时间做了很多。老实说,我开始这个系列时对这个领域知之甚少,我知道我想深入了解它,所以我认为最好的方法是利用我在阅读中找到的所有知识。除了记录我的旅程,还有什么更好的方法让其他人学习呢?

我希望这个系列不仅帮助你学习这门手艺并亲自投入其中,还让你看到了机器学习的美好世界。学习贝叶斯方法给你一个更好的理解,一个强大的统计学基础可以带你走这么远。从对你的世界的不确定性建模,做出预测,以及根据新的证据更新你的知识。

这个系列的结束标志着我在这个领域设计我的品牌的正式开始。应用内容不仅可以帮助你入门,还可以帮助你理解概念,丰富你的世界。请关注更多与机器学习的艺术和科学相关的内容。

参考文献

[1]奥斯瓦尔多·马丁,用 Python 进行贝叶斯分析

[2] PyMC3,pymc 3 中的 GLM:样本外预测

[3] PyMC3,(广义)线性和分层线性模型在 PyMC3

[4] PyMC3, GLM:泊松回归

[5] PyMC3,分层部分统筹

[6] PyMC3,多级建模贝叶斯方法入门

[7] Bambi, Wald 和 Gamma 回归(澳大利亚保险索赔 2004-2005)

[8] Bambi,多层回归

[9] Bambi,与 Bambi 和 ArviZ 的逻辑回归和模型比较

[9] Bambi,具有二项式家族的分层逻辑回归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值