TowardsDataScience 博客中文翻译 2020(九百六十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

想成为“真实世界”的数据科学家?

原文:https://towardsdatascience.com/want-to-be-a-real-world-data-scientist-make-these-changes-to-your-portfolio-projects-e61d1139c018?source=collection_archive---------47-----------------------

对您的投资组合项目进行这些更改。

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

注:

我注意到这个库的所有代码最初都在付费墙后面。不幸的是,我换了公司,失去了所有这些代码。

幸运的是,我重新编写了它——现在它可能更好了(尽管可能与原始代码略有不同)。储存库可以在这里找到。

下面的任何断开的链接应该导致这个回购代替。干杯!

简介

无论你想成为软件工程师、数据科学家、机器学习工程师,还是人工智能工程师;构建一个解决数独的应用程序是一个很好的项目组合。

这是一个如此伟大的项目,以至于 Peter Norvig 在这里写了一篇关于解决这个问题的惊人帖子。然后 Aaron Fredrick 写了另一篇关于如何解决这个问题的好文章。事实上,如果你想要一个不同语言的数独解决方案,你可以从以下每个人那里找到相应语言的解决方案:

  • 保罗·费尔南德斯的 C++
  • 由 Richard Birkby 编写的 C#和 LINQ 版本
  • 贾斯汀·克莱默的 Clojure 版本
  • Andreas Pauley 的 Erlang 版本
  • 伊曼纽尔·德拉博德的哈斯克尔版本
  • 约翰尼斯·布罗德沃尔的 Java 版本
  • 布兰登·艾希的 Javascript 版本
  • Pankaj Kumar 的 Javascript 版本
  • 卢德派极客的红宝石版本
  • 红宝石版作者马丁-路易·布莱特

鉴于这个问题已经被许多不同的人用许多不同的语言解决了很多次,你如何让你的解决方案脱颖而出呢?

让你脱颖而出的一个方法是扩展现有的解决方案。例如,亚伦的解决方案包括建立一个卷积神经网络,以便在解谜之前处理数独图像。这增加了另一层复杂性,它显示了他对深度学习解决方案的舒适性。

另一种脱颖而出的方法是展示你的 软件工程技能 作为你解决方案的一部分。具体来说,雇主寻找的是那些已经了解

  • 测试
  • 林挺
  • 证明文件
  • 记录

除此之外,对于任何新用户来说,编写易于使用和维护的代码也很重要。在这篇文章中,我们将关注测试、林挺文档。

假设我们从 Github 中所示的初始解决方案开始。我们如何着手改变这个解决方案来展示我们的技能?

测试

在你开始写你的解决方案之前,你可能应该写测试。你的脑海中可能会闪现一幅如下图所示的画面,但这并不完全是我想要的…

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

法师最初发现这里

python 中的测试是一种确保您打算编写的代码按照您期望的方式执行并提供您期望的输出的方法。

在这个例子中,编写测试可能意味着知道一个特定的起始难题的解决方案,然后将我们代码的结果与已知的解决方案进行比较。

一个健壮的测试工具包将有一系列不同的例子来测试。下面你可以看到一个简单的例子,其中容器和解决方案是由函数提供的。你可以想象有多个这样的例子,其中你将container定义为起始数独,container_sol是相应的解。

你也可能有一些边缘情况。我想到的三个例子是

  • 如果我有一个空的板子,它有多种可能的解决方案呢?
  • 如果我的起始板违反了有效的解决方案,该怎么办?例如,如果同一行中有两个 1,或者同一列中有两个 2,该怎么办?
  • 如果一块起始板的值大于 9 或小于 1,该怎么办?

您可以在这里找到一个文件,其中包含我的每个测试用例的函数。下面你可以看到我们如何引入SudokuSolver,并将求解器的解(code_sol)与我们的测试解(sol)进行比较。

我们可以为我们的每个测试用例设置如上所示的案例。好消息是,两个“正常”的测试用例——在函数test1sudoku_tests.pytest2中找到——可以用现有代码轻松处理。

不幸的是,边缘案例留给我们的是一个永远不会结束的程序。因此,我们需要编写代码来处理这些边缘情况。这非常简单(尽管有些乏味),因为我们提前编写了测试,并且我们知道每种情况应该如何处理。

下面你可以看到一个函数,它将根据上面提到的三种情况来检查以确保任何提供的数独puzzle都是有效的。

从这个函数来看,如果返回值是False,那么我们的谜题就是有效的。如果返回其中一个字符串,那么我们的谜题由于该字符串指定的原因而无效。

林挺

现在我们所有的测试用例都准备好了,我们将开始编写我们的解决方案。众所周知,第一个解决方案可能会完成任务。也就是说,它解决了问题,但是代码可能没有被很好地文档化,不容易阅读,或者没有使用最佳的编码实践。这样就可以了!

重要的是找到解决问题的节奏,不要对编码最佳实践太过焦虑,否则你根本写不出任何东西!然而,当你有了一个可行的解决方案,你应该回去重构你的代码,提高它的可读性,看看它是否可以被优化。

我通过将现有代码改为 python class开始了我的重构。我编写测试的方式要求是这样的,而且很简单,把现有的函数放在一个class体中,在必要的地方放上一堆self。重构一个类的结果在这里可用

此时,可以从您的终端运行该文件来查看两个示例,使用:

$ python sudoku.py

以上将产生两个起始谜题,以及每个谜题对您的主机的解决方案。

如果这个文件与您的sudoku_tests.py在同一个目录中,您可以运行:

$ python sudoku_tests.py

上面的命令不会产生任何结果,因为您的所有测试现在都应该通过了!

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

Tumblr 上找到的图片

从这里,我们应该可以看到我们的代码是如何遵守 Python 标准的,也就是所谓的 PEP8 。这些不是严格的规则,而是指导方针。

通过运行以下命令,您可以了解您的代码符合这些准则的程度:

$ pylint sudoku.py

你会得到一个问题列表,以及一个分数:Your code has been rated at -0.60/10。而且,问题的清单很长。您可能会直接开始手动修复每个项目,但是有一些库可以帮助您加快这个过程。

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

最初在这里找到的图像

有一个 autoPEP8 库可以用来快速清理代码。要安装,请运行以下命令:

$ pip install —-upgrade autopep8

然后使用新的库运行:

$ autopep8 --in-place --aggressive --aggressive sudoku.py

让我们看看这在多大程度上改进了我们的解决方案。

$ pylint sudoku.py
Your code has been rated at 7.95/10 (previous run: -0.60/10, +8.56)

看起来这是一个显著的进步。虽然仍然有一个相当大的变化列表,主要属于

  • 间隔
  • 未使用的变量
  • 变量命名
  • 文档字符串

虽然使用林挺的输出,每个修复都是不言自明的,但要完成完整的列表可能需要一些时间。同样,这些更多的是作为指导方针,而不是严格的规则,所以这取决于你有多在乎做出特定的改变。

我创建了refactor-branch,它包含了与master相同的代码,但是sudoku.pysudoku_tests.py文件分别针对8.76/109.32/10进行了重构。你可以在这里查看的修改。考虑到这些分别从-0.60/10-46.60/10开始,这已经很不错了。

证明文件

正如你已经从林挺过程中看到的,记录你的工作是非常重要的!针对这种特殊情况的文档意味着提供信息性的README.md;每个脚本的文档;以及每个脚本中每个函数、类和方法的文档字符串。

我们在上一节中使用的pylint可以通过简单地在必要的地方提供空字符串来欺骗。然而,Google Style Python Docstrings提供了一个很好的指南。

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

就写一篇好的自述而言,Akash 的帖子很好地解释了一篇好自述的来龙去脉。对于这个特定的项目,我们不需要所有这些组件,但是这给了你一个好主意,当你创建一个自述文件时应该考虑什么。

一般来说,你的自述文件对于让个人与你的代码互动是非常重要的。如果你想让人们看到你的作品,附上一份好的自述。我经常在项目的最后写我的自述,因为我想变得非常有用并且与代码相关。通常我不知道如何向读者解释一些事情,直到我写完所有的代码!

你可以在下面看到我的模块字符串的例子。请注意,它包括如何运行脚本的示例,以及关于脚本用途的信息。

然后类和方法字符串应该遵循 Google 的协议,这意味着类文档包含ArgsAttributes。方法字符串包含ArgsReturns。如果有你认为对用户有帮助的附加信息,你也可以把它包括进去。

下面是一个例子,您可以用它来创建自己的函数字符串:

我们也可以按照相同的格式向sudoku_tests.py文件添加文档字符串。由于测试并不真正供其他人使用,所以愿意在这个文档上花费更少的时间似乎是合理的,但是您可以在上面链接的存储库中再次看到结果。

在完成文档的最后,我通过运行以下命令重新运行pylint来查看更新的分数:

$ pylint sudoku.py

$ pylint sudoku_tests.py

sudoku.pysudoku_tests.py的最终得分分别为9.66/1010.00/10

最后,让我们把自述文件放在一起!整理自述文件没有完全正确的答案。为了展示数据科学项目,一个好的自述文件的大纲可能与创建一个生产库(这是上面 Akash 的自述文件的作用)有很大不同。对于我的项目,我通常尝试在我的自述文件中包含以下部分,但是还是没有正确的答案:

  • 一个项目的标题
  • 项目的简短描述
  • 项目的动机
  • 一些关于用户如何与你的代码交互或使用你的代码的指示。
  • 对你在项目中使用资源和获得灵感的地方给予肯定。
  • 一个许可证如果对其他人如何使用你的代码有任何限制的话。

你可以在我的库的documentation-branch上看到sudoku.py的完整文档。

这样,您的项目看起来前所未有的专业,您已经准备好与全世界分享它了!

想打入数据科学?开始建造

原文:https://towardsdatascience.com/want-to-break-into-data-science-start-building-db5ed24a7d77?source=collection_archive---------33-----------------------

为什么您应该先构建,后提问

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

📸克里斯托弗·伯恩斯

这篇帖子的灵感来自于一个得到很多人喜爱的 Twitter 帖子

要找到一份数据科学家、机器学习工程师或任何编写软件的工作,需要的不仅仅是数学和编程知识。在现实中,这些角色需要你每天做出数百个决定。

这些可能是重大决策,比如:

  • 我应该如何以及在哪里存储我的数据?
  • 我应该使用哪种算法?
  • 我应该使用哪些框架和库?
  • 我使用什么平台来托管我的模型?

或者微小的决定,比如:

  • 我给这个函数取什么名字?
  • 我应该遵循哪些格式规则?
  • 我如何处理这种边缘情况?

更好地做出这些决定需要练习,而练习的唯一方法就是做事情。这就是为什么我们强烈鼓励sharpes minds的导师和学员专注于构建端到端的 ML 项目。收集和清理数据,训练模型,部署它。在这条管道中隐藏着如此多的不同规模的决策。

构建端到端项目的压力迫使你做出许多选择 类似于你在构建真实产品的工作中所做的选择。事实上,将您的数据科学项目视为产品会有所帮助。与其只是训练一个模型来证明自己可以,不如试着解决一个真实的问题。

没必要把这个类比扯得太远。把建立一个有利可图的企业作为一个业余爱好项目,虽然令人印象深刻,但却是矫枉过正。像对待产品一样对待你的项目的好处是鼓励你从一个问题开始并找到解决方案。你使用的技术栈和你在构建时做出的决定将取决于问题所强加的约束。

从一项技术开始,并试图找到使用它的方法,这在工业界是很少见的。然而,这是许多业余爱好项目的必经之路。如果你唯一的工具是锤子,而那个锤子是深度神经网络,那么每个问题都开始看起来像深度学习钉。但是大多数钉子不需要神经网络——它们需要一把锤子,或者仅仅是一块石头。

公司不会因为知道特定类型的算法而雇佣人(尽管数据科学面试有时会让它看起来是这样)。公司雇人解决问题,为工作挑选最好的工具,做出正确的决定。

构建解决真实用例的东西将会引入你在千篇一律的数据科学项目和 Kaggle 竞赛中看不到的权衡。如果在另一端有一个真实的人在等待结果,你可能需要优化推理时间而不是准确性。如果是高度监管的行业,隐私性和可解释性会更重要。这些是你在工作中必须做出的权衡。

没有经验很难擅长这些决策和取舍。对于许多职业来说,你需要找到一份工作来开始积累经验。但是当涉及到数据科学和机器学习时,有一个奇妙的区别*——*你可以在被雇用之前获得足够的经验。怎么会?由造东西。

当你开始构建时,你将面临的数百个决策的答案一开始并不明显。你会犯错误。但是这些错误正是学习发生的地方。在构建的中途,您可能会意识到您最初选择的框架并不支持您需要的功能。但是下一次当你面临类似的决定时,你会因为亲身经历过这个错误而获得更多信息。

这些类型的错误也是面试的好题材。解释你所面临的挑战和你在建造过程中所学到的东西是展示你解决问题的技巧和学习能力的好方法。“我最初用 X 实现了这个,但结果是 X 不太擅长处理 Y,所以我用 z 做了重构。”这是我想从候选人那里听到的故事——,当然还有更多细节。

然而,在构建端到端的机器学习项目时,存在冷启动问题。作为初学者,很容易陷入决定什么是“最好的”框架或“正确的”数据库的困境。我看到人们经常陷入这种计划陷阱。我也去过那里。

走出陷阱的方法是认识到行动比不行动更好。从你最熟悉的工具开始。他们会让你更快地建立和学习。如果它们是错误的工具,你会从直接的经验中找到原因。如果你完全是新手,就选择一个流行的工具,边学边用。TensorFlow vs. PyTorch,PostgreSQL vs . MySQL*——*如果你不知道其中的取舍,其实也无所谓。选择一个并开始建造。这是你开始学习权衡的唯一途径。

想要建立有效的机器学习模型?

原文:https://towardsdatascience.com/want-to-build-effective-machine-learning-models-aws-recommends-these-steps-to-follow-b11f52cd9a41?source=collection_archive---------50-----------------------

AWS 建议遵循以下步骤

不到一个月前(2020 年 4 月初),AWS 宣布发布关于 AWS ML 最佳实践的官方白皮书。这是一份 78 页长的白皮书,充满了有用的信息,涵盖了机器学习最佳实践的所有方面,从定义问题到分析 ML 模型结果。

在本文中,我将用 15 分钟的时间总结 AWS ML 最佳实践白皮书。如果您没有时间阅读完整的 78 页白皮书,那么这篇文章就是为您准备的。如果你是机器学习的初学者或专业数据科学家,或者正在准备 AWS ML 专业考试,那么这篇文章也适合你。我确保用简单易读且没有行话的语言写这篇文章,这样它可以适合每个人。

声明:我建议阅读白皮书原文,以获得充分的好处。

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

数据有更好的想法。来源: Unsplash

让我们开始看看这篇 ML 最佳实践论文是关于什么的。

官方 AWS ML 最佳实践白皮书分为 3 个主要部分。

  • 定义 ML 堆栈和 ML 工作量阶段
  • 一般设计原则&参考架构
  • 从 ML 的角度来看,架构良好的框架的 5 个支柱

我们将一起浏览上述每个部分并理解它们,现在开始。

定义 ML 堆栈和 ML 工作负载的阶段

ML 栈 可以分为 3 个桶,如下图所示。AWS 希望迎合所有专业水平,并使 ML 民主化。

Bucket 1 AI 服务是像 AWS 翻译、转录、Polly、Rekognition 等预建的服务。用户不需要任何 ML 知识来使用这些服务,简单的 API 调用就能得到答案。

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

机器学习栈

Bucket 2 ML 服务主要是 AWS SageMaker 的所有口味,AWS 的 ML 旗舰,用户需要 ML 知识来使用 SageMaker 的工具标记数据,构建,训练,部署,操作定制 ML 模型。AWS SageMaker 是完全托管的,这意味着用户不需要担心基础设施,因为 AWS 会做繁重的工作。

Bucket 3 ML 框架&面向高级用户的基础设施。AWS 将为他们提供预装了 TensorFlow、PyTorch、MXNet 等主要开源框架的容器和计算基础设施。他们可以从头开始建立自己的模型。

ML 工作负载 是端到端的机器学习过程如下图所示。

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

端到端的机器学习过程。来源: AWS ML 白皮书

AWS 的白皮书详细介绍了流程中每个步骤的最佳实践。前 3 个步骤是关于业务需求、定义 ML 问题和收集数据。

第一步是业务目标识别这基本上是后退一步,问自己为什么要这样做,这里是否需要 ML,应该监控哪些关键绩效指标(KPI)。

然后是 ML 问题框架步骤,定义输入,给出 ML 模型和期望的输出。这一步你要知道是分类还是回归还是聚类问题等等。

数据收集步骤之后,您确认数据可用性并将其收集到数据湖中。我在下图中总结了这些步骤的 AWS 最佳实践。

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

ML 构建流程前 3 步的 AWS 最佳实践

一旦您收集了 ML 模型的数据,就到了数据准备步骤。这一步非常重要,你应该花很多时间,因为

ML 模型的好坏取决于用来训练它们的数据

在这里,您应该利用 AWS SageMaker 等 AWS 服务来标记和准备您的数据,或者利用 AWS GroundTruth 来标记原始数据并生成高质量的训练数据集。您还可以利用 AWS Glue,它是一个完全托管的提取、转换和加载(ETL)服务。如果你需要 Hadoop 或 ApacheSpark 或 HBase 框架,那么你可以使用 AWS EMR。

一旦你的数据准备好了,可视化&分析步骤将帮助你更好地理解和识别你的数据模式。AWS 提供了一套可视化工具,如 AWS SageMaker,您可以在其中托管 Jupyter 笔记本并使用 seaborn 或 matplotlib 或 plotly 等库。AWS Athena 是一个完全托管的服务,可以查询您的 S3 数据湖,AWS Kinesis 数据分析提供实时分析功能。最后,AWS QuickSight 是一个商业智能(BI)工具,为故事板提供安全的共享和协作。

现在到了特征工程步骤**,在该步骤中,您考虑数据集中的每个属性,并决定它与您的模型的相关程度,是否需要转换或提取。在这一步中,您可能会遇到维数灾难,因为您有大量的相关要素,并且想要减少它们。最好使用带有 AWS SageMaker 的 Jupyter notebook 或 SageMaker Processing 中的内置数据处理容器来完成特征工程。**

这 3 个步骤的 AWS 最佳实践总结如下。

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

ML 构建流程后三步的 AWS 最佳实践

ML 构建过程的最后 3 步是有趣的,在这里你将看到你所有努力的结果。

现在你已经有了一个干净的数据集,所以是时候进行模型训练步骤了,在这里你选择适合你的业务问题的最大似然算法。您必须调整您的模型的超参数,以实现低训练误差,并避免过度拟合&欠拟合。常用的超参数的一些例子是学习率、时期数、隐藏层、隐藏单元和激活函数。您将使用 AWS SageMaker 完成所有这些工作,其中您的所有数据都在 S3 数据湖中,并且您可以调用 SageMaker 的 API 进行培训。您还可以利用 AWS SageMaker 调试器来警告您模型训练问题,如梯度值变得过大或过小。根据你的专业水平,你可以使用 AWS 深度学习 AMI 或深度学习容器,并在其上运行开源框架,如 TensorFlow、PyTorch、MXNet、Horovod 和 Keras。

上一步是模型&业务评估**,用于确定模型的性能和准确性是否能让你实现业务目标。您可以使用历史数据或实时数据评估您的模型。在这两种情况下,您的模型将会看到以前在训练中从未看到过的数据。对于评估,您应该利用 AWS SageMaker、AWS 深度学习 AMI 或 AWS EMR。如果你对结果不满意,你可以随时调整和重新训练你的模型。对模型的结果感到满意后,就该在生产中部署它了。**

最后,是进行推理的时候了,您的模型正在部署中,您希望从中获得一个预测。模型部署选项包括 AWS SageMaker,您可以通过 API 调用进行推理,您可以使用非常灵活且可定制的 AWS SageMaker 推理管道。不要忘记使用 SageMaker 模型监视器,该监视器持续监视生产中的 ML 模型的输入数据漂移和模型质量偏差。如果您正在使用 edge 或物联网(IoT)设备,请利用 AWS SageMaker Neo 在 edge 设备上进行编译。您还可以使用 AWS 弹性推理,它允许您将低成本的 GPU 推理加速附加到您正在使用的任何 EC2 或 SageMaker 上。

ML 流程最后 3 个步骤的 AWS 最佳实践总结如下。

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

ML 构建流程最后 3 步的 AWS 最佳实践

一般设计原则和参考架构

在本文的这一部分,AWS 确定了一组通用设计原则,以促进良好的 ML 云设计。让我们看看他们。

  • 通过高质量数据的可用性实现敏捷性
  • 从简单开始,通过实验进化
  • ****将模特培训&评估与模特主持分离
  • 检测数据漂移
  • 自动化培训&评估流程
  • 偏好更高的抽象以加速结果

然后,本文介绍了一些常见的场景,并展示了它们的 AWS 参考架构实现。我将把每个场景分解成业务问题、实现和参考架构。

场景 1:使用 AWS AI 服务构建智能应用

****业务问题零售店希望捕捉和分析客户人口统计数据,以提高客户参与度和体验。

****实现使用多个 AWS AI 服务层,几乎不需要 ML 知识。

****参考架构利用 AWS Rekognition 进行面部分析,向 AWS Athena 发送数据以分析面部属性数据,最后通过 AWS QuickSight 可视化分析数据。请注意,所有这些都是完全托管的 AWS 人工智能服务,具有预先训练的模型。下面显示的参考架构也可以应用于文本或音频分析,但在这些情况下,您应该使用 AWS 转录(音频分析)或 AWS 理解(文本分析)而不是 AWS 识别。

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

参考架构:客户人口统计分析。来源: AWS ML 白皮书

基于相同参考架构构建的是媒体分析用例。假设您想要上传一个媒体文件,并使用多个 AWS AI 服务来进行视频和音频分析。最终目标是一个可搜索的元数据库。AWS 的人员推荐以下参考架构,他们使用 AWS Step 函数来编排媒体分析流程,并使用 AWS ElasticSearch 来使内容可搜索。

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

参考架构:媒体分析。来源: AWS ML 白皮书

场景 2:使用托管 ML 服务构建定制 ML 模型

****业务问题你想在 AWS 上建立自己的模型,因为没有一个 AWS 人工智能服务能满足你的需求。你要控制数据准备&分析、模型训练&评估、模型推断的步骤。

实施 AWS SageMaker 可以端到端地完成所有这些功能,同时完全由 AWS 管理。AWS Lambda 支持事件驱动架构,并将 ML 流程的不同阶段连接在一起。

****参考架构假设亚马逊 S3 充当原始数据、建模数据、增强数据和转换数据的数据湖。AWS 推荐以下参考架构,用于构建您自己的模型以及从摄取到推断的流程。

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

参考架构:使用 SageMaker 构建自己的 ML。来源: AWS ML 白皮书

场景 3:用于数据处理的托管 ETL 服务

****业务问题您正在开展一项有针对性的营销活动,并希望通过电子邮件和短信向消费者发送信息。您需要一个 ML 模型来根据历史消费者购买模式识别正确的客户。

实现 AWS Pinpoint 是一个托管服务,可以通过各种渠道发送目标消息。在 AWS EMR 上利用 Spark 或 Hadoop。

****参考架构使用多种服务的 AWS 推荐流程如下所示。

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

参考架构:使用 AWS Pinpoint 的定向活动。来源: AWS ML 白皮书

场景 4:边缘和多平台上的机器学习

****业务问题在你计算能力有限的边缘考虑物联网和设备。例如,您想在边上建立一个鸟类物种标识。

实现 AWS 物联网 Greengrass 在边缘设备上实现机器学习。AWS 物联网 Greengrass 使用在云中创建、训练和优化的模型,可以轻松地在设备上本地执行 ML 推理。

****参考架构展示了 AWS DeepLens,这是 AWS 的相机,带有预训练的 ML 模型。请记住,AWS 通过 AWS SageMaker Neo 支持英特尔和 Invidia 等多种硬件平台,check 的 AWS 网站提供物联网支持的设备。SageMaker Neo 有编译器和运行时。针对特定硬件进行了优化。

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

参考架构:边缘的鸟类物种识别。来源: AWS ML 白皮书

场景 5:模型部署方法

****业务问题建立模型后,你应该有一个简单的方法来推断模型并得到预测。

****实现使用 AWS SageMaker 端点,这些是 HTTPS 端点,您可以使用它们对您的模型进行 API 调用。

参考架构 AWS 根据您的需求推荐了 4 种部署模型,我总结如下。

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

参考架构:AWS 部署模型。图片来源: AWS ML 白皮书

从 ML 的角度来看,架构良好的框架的 5 个支柱

AWS 通常在云中有 5 个架构良好的框架支柱,本文的这一部分从机器学习的角度来看这 5 个支柱。我将以问答的形式对它们进行总结。

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

ML 架构良好的框架的 5 大支柱

卓越运营支柱

这是运行、监控和洞察系统以交付业务价值并持续改进支持流程和程序的能力。

  • 你是如何让你的团队做好运营和支持机器学习工作负载的准备的?

确保 ML 模型有效集成到生产环境中并满足业务目标的最佳实践包括确保团队之间的交叉协作,以及培训所有负责支持和维护机器学习工作负载的资源达到基本熟练水平。

  • 您如何记录模型创建活动?

为了更清楚地支持和使用模型版本,请记录模型创建过程,尤其是与所做的假设、模型所需的数据预处理/后处理以及将系统或应用程序与模型版本集成相关的过程。SageMaker 笔记本和 SageMaker Studio 提供托管笔记本环境,数据科学家可以在其中记录他们的开发过程和实验。这些笔记本可以与源代码控制系统集成,并成为为每个部署的模型创建的文档的标准部分。

  • 你是如何追踪模特血统的?

SageMaker 实验允许您组织和跟踪 ML 模型的迭代。SageMaker Experiments 自动捕获每个模型的输入参数、配置和输出工件,并将它们存储为实验。这避免了使用手动跟踪或者构建定制的跟踪解决方案来管理为模型开发的每个迭代创建和利用的输入和输出工件的众多版本。

  • 你是如何为你的 ML 工作负载自动化开发和部署管道的?

创建管道的一般准则包括使用编排层(如 AWS CodePipeline ),并结合负责执行管道内各阶段的逻辑。使用 AWS Lambda 创建和执行基于函数的逻辑,因为它的运营开销低,无需管理服务器。

  • 您是如何监控和记录模型托管活动的?

SageMaker 自动监控核心系统指标,还包括为您的托管模型设置自动扩展功能的能力,以根据需求动态调整支持端点的底层计算。SageMaker Model Monitor 能够监控生产中的 ML 模型,并在出现数据质量问题时发出警报。最佳实践包括创建一种机制,使用服务来聚合和分析模型预测端点指标,如 Amazon Elasticsearch,内置对 Kibana 的支持,用于仪表板和可视化。

  • 你怎么知道什么时候用新的或者更新的数据重新训练 ML 模型?

最佳实践是表示模型性能和准确性的已定义指标,确保有一种机制来定期捕获这些指标以进行分析和基于指标阈值发出警报,并评估是否适合重新训练模型。SageMaker Model Monitor 可以在数据分布发生变化时检测模型漂移,并使用 AWS CloudWatch 发布指标。

  • 您如何在模型开发、模型训练和模型托管的迭代之间整合知识?

这包括所有维度的模型评估:业务评估、ML 模型评估和系统评估。通过提供对收集的关键运营指标的集中可见性,团队可以持续审查并对您的运营进行回顾性分析。

安全支柱

这是在提供业务价值的同时保护信息、系统和资产的能力。

  • 你如何控制对自己 ML 工作量的访问?

对 ML 流程各阶段使用的所有资源的访问,包括数据、算法、超参数、经过训练的模型工件和基础设施,必须通过基于最低特权的访问进行严格控制。这可以使用 AWS IAM 轻松完成。

  • 您如何保护和监控对 ML 工作负载中使用的敏感数据的访问?

使用亚马逊 S3 上的 AWS Lake Formation 实现了集中式数据湖。保护和监控亚马逊 S3 上的数据湖是通过使用各种服务和功能的组合来加密传输中的数据和静态数据,并监控访问,包括粒度 AWS IAM 策略、S3 存储桶策略、S3 访问日志、AWS CloudWatch 和 CloudTrail。构建大数据存储解决方案(数据湖)以获得最大的灵活性讨论了如何使用这些不同的功能来构建安全的数据湖。

  • 你是如何保护训练有素的 ML 模特的?

在训练阶段结束时生成的 ML 模型通常保存在亚马逊 S3 中。使用私人 VPC 端点将在您的 VPC 内训练的模型上传到亚马逊 S3。这确保了模型在 AWS 网络内安全地传输到亚马逊 S3。当使用 Amazon SageMaker 训练一个模型时,该服务会加密传输中和静态的模型工件和其他系统工件。SageMaker 托管端点使用 IAM 为保护您的模型和调用提供了额外的安全性。这使您能够控制哪些 IAM 用户、IAM 角色、源 VPC 或 IP 可以对您的模型执行推理。

可靠性支柱

这是系统通过动态获取计算资源来缓解问题,从而从任何类型的服务中断中恢复的能力。

  • 你如何管理你的机器学习模型和预测端点的变化?

创建一种机制,以便能够跟踪对模型所做的更改以及对预测端点所做的更改。如果新型号的性能不如预期,这样可以更快地排除故障并恢复到以前的型号版本。部署新型号时,AWS 推荐标准 A/B 测试策略。使用 AWS 弹性容器注册中心(ECR)来托管所有的容器图像。

  • 如何在您的工作负载中协调 ML 模型的变更?

遵循已定义的变更管理策略来引入变更,并将它们传达给受影响的团队,并实现这些变更的可追溯性。以治理和控制应用程序级变更的相同方式管理新模型版本的部署。ML 模型的变更管理策略必须考虑如何传达和部署变更,以帮助避免服务中断以及模型性能和准确性下降。

  • 您如何扩展端点托管模型进行预测?

您必须包括对端点的监控,以确定触发添加或删除资源来支持当前需求的阈值。一旦收到扩展的触发信号,必须准备好解决方案来扩展支持该端点的后端资源。对端点执行负载测试,以便能够验证它们有效伸缩和可靠提供预测的能力。

  • 如何从一个训练好的 ML 模型的失败或无意丢失中恢复?

意外删除是一个问题,为了保护模型工件不被意外删除,请确保模型工件受到保护,方法是只允许使用工件所需的最低权限,实现额外的机制,如 MFA 以供特权用户删除,并根据您定义的灾难恢复策略的要求存储工件的辅助副本。此外,实现工件版本化策略允许恢复特定的版本化工件。

  • 您如何从模型托管资源的故障或意外丢失中恢复?

最佳实践是确保负责承载模型预测的端点可以完全恢复到业务定义的特定版本或时间点。恢复模型端点的能力要求用于创建该端点的所有组件和配置都包括在受管版本控制策略中,以在任何组件不可用时实现完全恢复。

绩效效率支柱

这集中于计算资源的有效使用以满足需求,以及如何随着需求的变化和技术的发展保持这种效率。

  • 您如何选择最合适的实例类型来训练和托管您的模型?

数据大小、数据类型和算法的选择对哪种配置最有效有明显的影响。当重复训练同一个模型时,强烈建议在一系列实例类型中执行初始测试,以发现高性能和经济高效的配置。建议将 GPU 实例用于大多数深度学习目的,因为在 GPU 上训练新模型比在 CPU 上更快。当您有多个 GPU 实例时,或者如果您使用跨多个 GPU 实例的分布式培训,您可以进行次线性扩展。然而,重要的是要注意,在 GPU 上训练最有效的算法可能不一定需要 GPU 来进行有效的推理。

  • 您如何在保持最佳性能的同时扩展 ML 工作负载?

SageMaker 代表您管理您的生产计算基础架构,以执行运行状况检查、应用安全补丁和进行其他日常维护,所有这些都通过内置的 CloudWatch 监控和日志记录来实现。SageMaker Model Monitor 持续监控生产中的 ML 模型,检测诸如数据漂移等会降低模型性能的偏差,并提醒您采取补救措施。此外,SageMaker 主机使用应用程序自动伸缩功能,自动伸缩到您的应用程序所需的性能。

您可以选择使用亚马逊弹性推理(EI)进行扩展,以增加吞吐量并减少针对深度学习模型的实时推理的延迟。Amazon 弹性推理使您能够将 GPU 支持的推理加速附加到任何 Amazon EC2 实例上。

成本优化支柱

这是建立和运行成本感知系统的能力,以实现业务成果和最小化成本,从而使您的企业最大化其投资回报。

  • 如何优化数据标注成本?

利用 AWS SageMaker Ground Truth,它通过 Amazon Mechanical Turk、第三方供应商或他们自己的员工使用人工标注器来简化数据标注任务。SageMaker Ground Truth 实时从这些人工注释中学习,并应用主动学习来自动标记剩余数据集的大部分,从而减少人工审查的需要。与单独的人工注释相比,这降低了成本。

  • 你如何在 ML 实验中优化成本?

SageMaker notebook 实例提供了一个托管的 Jupyter 环境,可用于探索小样本数据。当您不经常使用笔记本实例时,请停止它们。在可行的情况下,提交你的工作,停止它们,并在你需要它们的时候重启它们。存储是持久的,您可以使用生命周期配置来自动化软件包安装或存储库同步。

查看 AWS 机器学习市场,该市场提供了不断增长的机器学习算法和模型目录。来自 AWS Marketplace 的模型被直接部署到 Amazon SageMaker,并允许您快速构建 ML 应用程序。这为您节省了与模型开发相关的成本和时间。

  • 你如何为 ML 培训选择最划算的资源?

使用 SageMaker Training API 创建一个托管实例集群。在训练集群中使用多个实例可以实现分布式训练,从而缩短训练时间。训练完成时,训练群集中的所有实例都会自动终止。在处理大量训练数据时,Amazon SageMaker 管道模式比 Amazon SageMaker 文件模式提供了更好的读取吞吐量。

  • 如何优化 ML 推理的成本?

首先要考虑延迟、吞吐量和成本。同样,建议您从小规模开始,先横向扩展,然后纵向扩展。利用推理端点的自动缩放。当您的模型不需要实时预测时,请使用批量预测。

最后 ,这是对第一个 AWS ML 良好架构框架的全面总结。我试图用一种易读的格式来总结它,以适应从初学者到高级的所有 ML 专业水平。ML 可能有趣而复杂,但是,遵循这些 AWS 推荐的最佳实践将帮助您构建更好的模型,进一步了解 ML,并成为更好的 ML 专家。我希望你喜欢阅读这篇文章。

想用 python 轻松集成数据?

原文:https://towardsdatascience.com/want-to-easily-integrate-data-with-python-e9d808f88455?source=collection_archive---------51-----------------------

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

克里斯托夫·高尔在 Unsplash 上拍摄的照片

与 data.world 的 5 分钟数据集成

介绍

**想象一下:**你和几个同事正在用 python 开发一个数据科学项目。您没有费心将数据输入或输出与 SQL/python 数据库集成联系起来,因为没有那么多的数据转手。但是,还是有足够的。csv 文件被创建和更新,以至于很难通过电子邮件发送、备份或将其放在驱动器文件夹中。

在过去的几个月里,我个人多次遇到这种情况。我不想经历整个 SQL 集成过程,但是文件传输仍然很繁琐。

我最近发现有一种更简单的方法,没有平台集成经验的人可以在短短 5 分钟内完成设置。解决方法: data.world

data.world 是一个企业数据目录,拥有世界上最大的开放数据社区,个人使用免费。您可以将各种数据、代码和分析上传到数据集或项目中。

设置您的帐户

第一步是创建一个免费帐户。你可以在 data.world/login 使用谷歌、脸书、GitHub 或 Twitter 来做这件事。您将看到这样一个页面:

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

作者图片

点击*“+新建”,然后点击“创建新数据集”。选择一个名称和一些其他设置,然后“创建数据集”*。我把我的命名为“中等文章样本”。您可以现在添加描述和数据,也可以以后再添加。我添加了 Kaggle 的泰坦尼克号比赛的训练数据。

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

作者图片

接下来,转到data.world/integrations(或点击屏幕左下方的*“整合”图标)。在过滤器搜索栏中键入“python ”,或者向下滚动直到看到它。点开它,点击“启用集成”,然后“授权 Python”*。

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

作者图片

现在集成已经完成,您可以点击*“开始”*并按照那里的步骤操作。我也将把它们包含在本文中。

安装软件包

1.使用命令行(或 jupyter 笔记本),从 PyPI 安装 data.world 包。

pip install datadotworld[pandas]

2.使用命令行配置包。你需要你的 data.world API 令牌,在这里找到(点击*“获取令牌】*)。现在您已经准备好使用这个包了!

dw configure

3.在笔记本或脚本中导入包。

import datadotworld as dw

使用软件包

使用 datadotworld 包可以做很多事情,但这里有一些我们正在寻找的基本数据集成的基础。

首先,您可以读取数据集中的所有文件,并获取特定文件作为数据帧(根据文件类型,您可能需要将其作为表或原始数据导入;更多关于那个这里。注意,表名都是小写的,用下划线代替空格。

dataset = dw.load_dataset('ryan-brown/medium-article-sample')
df = ds.dataframes['titanic_training_data']

如果您使用的是 Windows,编码可能会有问题;我创建了一个快速函数,利用了 datadotworld 的。查询函数从数据集中读取特定的表。

def dw_get(dataset_name, table_name):
    results = dw.query(dataset_name, "SELECT * FROM `{}`".format(table_name)) df = results.dataframe
    return dfdf = dw_get('ryan-brown/medium-article-sample', 'titanic_training_data')

无论哪种方式,您现在都可以在笔记本中创建一个数据框架,您可以对其进行清理、处理和分析。假设我决定用 NaN 值填充 drop“ticket”列和所有行来清理数据。我现在有以下数据框架:

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

作者图片

我准备更新数据集上的文件,供我的同事在项目分析中使用。这样做很容易——只需将数据帧作为. csv 文件保存在工作目录中,然后调用 datadotworld api 客户端并上传文件。

df.to_csv('titanic_data_clean.csv',index=False)
client = dw.api_client()client.upload_files('ryan-brown/medium-article-sample', files=['titanic_data_clean.csv'])

请注意,我决定给它一个不同于 titanic_training_data.csv 的名称,这样它将在数据集中显示为一个新文件。但是,如果我决定将其命名为 titanic_training_data.csv,它将替换数据集中旧的 titanic_training_data.csv 文件(同时仍然保留您可能添加的任何标签或描述)。

现在我们已经上传了新数据,让我们来看看数据。世界数据集:

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

作者图片

您可以看到清理后的数据在那里,在右边有一个更新,表明我使用 python 添加了数据。就这么简单。

要授予对等用户访问权限,以便您可以协作处理和上传数据,请单击数据集的*“Contributors”选项卡,然后单击“Invite”*通过电子邮件或用户名邀请他们。

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

作者图片

这只是 datadotworld 包可以做的许多事情的一小部分,这个站点可以作为一个整体使用;你可以在这里写的一篇很棒的文章中查看这个库的更多特性。

你的数据科学项目需要一个成功的条件。

原文:https://towardsdatascience.com/want-to-get-hired-build-a-project-with-a-win-condition-6526d90a247d?source=collection_archive---------57-----------------------

离开一个项目很难,但是你需要知道什么时候去做。

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

温斯顿·丘吉尔,大概是在完成他的第一个数据科学项目之后。来源:https://www.flickr.com/photos/levanrami/45544041992

sharpes minds数据科学导师项目工作最酷的事情之一是,我们有机会看到人们建立了什么项目,以及哪些项目让他们被雇用。

我们反复学到的最重要的一点是,最好的项目根本不是项目:它们是产品。

在这篇文章中,我想解释构建一个产品意味着什么,以及构建产品如何能帮助你在你的项目准备好发布之前弄清楚它必须有多好(并且给雇主留下深刻印象!).

什么是产品?

数据科学产品是一个有用例的项目。理想情况下,这是你自己会用到的东西。

它可以是推荐系统、仪表板或分类器。但是不管它最终是什么,它应该对某人有用——而且你对那个人是谁的想法越具体越好。

专注于有用性和构建产品使得为你的项目定义一个“赢”的条件成为可能:模型性能的水平(准确性、召回率、AUC 分数等)使得你的模型“对实际目的来说足够好”。

获胜条件是大多数数据科学项目中最常见的缺失因素。这真的很糟糕,因为它们是公司需要你能够弄清楚的最重要的事情之一。

作为一名数据科学家,你不会下载数据集,清理它们,并根据某个经理从高层给你的损失函数调整模型。通常情况下,你必须想出这个损失函数,并计算出在你有一个可以出货的产品之前,它必须有多好。

因此,公司——尤其是招聘经理——会在面试中花费大量时间寻找你能够找出成功条件的暗示。如果你的项目不包括一个,你基本上就失去了勾选这个框的最好机会。

以下是如何选择一个。

设置您的获胜条件

您的获胜条件将有两个组成部分:您想要优化的指标,以及一个阈值,超过该阈值,您认为该指标将被优化。

但是只有当你对你的项目有一个清晰的用例时,你才能弄清楚这些事情。

例如,假设您正在构建一个时尚推荐系统,以帮助人们找到匹配的衬衫和裤子。如果您的绩效指标高出 1%,这有什么关系吗?用户能够区分 0.99 AUC 和 0.98 AUC 吗?

大概不会。所以不要让你的获胜条件 0.99 AUC。你花在模型上的时间可以更好地用来做其他事情,比如收集更多的数据,改善你的可视化,或者解决一个完全不同的问题。

但是假设你正在建立一个癌症诊断工具。那 1%可以拯救生命。因此,每个百分点的性能都非常有价值,绝对值得投入大量资金来调整您的模型。

成功的条件并不总是简单的指标。如果你的项目是为网上购物者建立一个时尚推荐系统,那么成品不是一个算法——而是一个应用程序。如果您的项目是构建一个仪表板,使其易于发现某些趋势,那么您的成功条件就是该仪表板的部署。

下面的是一个如何做到这一点的很好的例子,直接来自一个敏锐的学员的项目:这是一个应用程序,让两个对音乐有不同品味的朋友通过考虑他们的偏好来妥协他们想听什么。因为这是一个有趣的、面向消费者的应用程序,应用程序的界面和结构与模型一样重要,所以更平衡的时间投资(和获胜条件)更有意义。此外,对音乐的品味是非常主观的,用户不太可能注意到哪怕是模型损失值的 5%的改善。

向招聘经理解释这些权衡是一种很好的方式,可以表明你的重点在哪里:不是像 Kaggle 一样的柔术模式,而是为真实的人和真实的用例提供真正的价值。

作为一个临别的提示:定义你的成功条件的时间是在你开始你的项目之前,以避免陷入永无止境的优化和调整的漩涡的风险,这将导致你浪费时间去做那些没有真正价值的事情。

没有一个明确的成功条件就着手一个项目是浪费你的时间和公司的钱去解决不需要解决的问题。大多数公司担心这种风险是可以理解的,作为求职者脱颖而出的最佳方式之一是通过展示你可以将业务问题与数据科学问题联系起来,正面解决这一问题。

这一切都始于成功的条件。

你可以在推特上关注我,地址是 @ jeremiecharris

想入门函数式编程?输入 Scala。

原文:https://towardsdatascience.com/want-to-get-started-in-functional-programming-enter-scala-ea71e5cfe5f8?source=collection_archive---------16-----------------------

意见

如果你厌倦了 Java 或 Python,这可能会让你的职业生涯更上一层楼

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

Scala 可能是成为函数式程序员的下一步。妮可·沃尔夫在 Unsplash 上的照片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 如果 你还没有使用 Scala,你不是唯一一个:根据 StackOverflow 的数据,截至去年,不到 4%的程序员在使用这种语言。这使它在最常用的语言中排名第 22,JavaScript 和 HTML 是前两名。

然而,使用 Scala 的程序员似乎从中受益。它不仅在 StackOverflow 最受欢迎的语言中排名第 14 位。这明显高于使用排名 22。

从经济上来说,了解这门语言似乎是有回报的:在全球范围内,只有 Perl 程序员的薪水高于 Scala 程序员,两者的年薪都在 7.6 万美元左右。在美国,Scala 的薪资最高,程序员的年薪预计约为 15 万美元。我觉得没问题!

为什么一些编程语言比其他语言更受欢迎或更有利可图,有不同的原因。在 Scala 的例子中,主要原因是它让程序员很容易学习函数式编程,而不像面向对象编程那样放弃已知和喜爱的范例

函数式编程在过去几年里越来越受欢迎,因为它非常适合处理大数据量、实现机器学习算法等等。由于此类技术的可扩展性非常好,对它们的投资已经为无数行业的公司带来了收入。这就是为什么 Scala 程序员的高薪是合理的。

[## 如何让您的 Python 代码更具功能性

以及为什么这会使您的代码更加健壮、可测试和可维护

towardsdatascience.com](/how-to-make-your-python-code-more-functional-b82dad274707)

统一面向对象和函数式编程

Scala 当然不是市场上唯一的多范例语言。例如,Python 支持面向对象和函数式编程。在 Java 中,函数式编程原则上是可能的,尽管它最初是作为面向对象的编程语言而设计的。

然而,Scala 的特别之处在于它寻求无缝集成面向对象和函数式编程。通常,这两种范式表现为彼此的对立面:在函数式代码中,你只会发现纯函数。在面向对象的代码中,你也会遇到不纯的函数。

在函数式代码中,所有变量都是不可变的,也就是说,它们的值一旦固定就不会再改变。在面向对象的代码中,您可以随时更改变量值。在功能代码中,你不会发现任何副作用;在面向对象的代码中,您可能会不时遇到它们。

这并不意味着没有很多方法可以在主要面向对象的代码中包含更多的函数式编程。在许多语言中,您可以在常规代码中使用从函数式编程中窃取的基本概念。例如,在 Python 中,构建迭代器、生成器和匿名函数相当容易。

但是 Scala 反过来也是这样做的:它使得开发人员可以非常容易地编写主要是函数性的代码,然后可以用面向对象的代码来修补函数性的代码过于繁琐的地方。这是对纯函数式编程的一个很好的妥协,例如,像用户定义的 I/O 这样的东西是不容易实现的。

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

Scala 入门并不像听起来那么难。照片由普里西拉·杜·普里兹Unsplash 上拍摄

Scala 中的快速入门

像许多其他语言一样,有两种方式使用 Scala:使用 IDE 或者命令行。就我个人而言,我是一个命令行爱好者,但最终还是要看个人喜好。

然而,在这两种情况下,你都必须下载并安装 Scala。但是,有时您只想先涉猎一下,而不安装任何东西,或者按照我将在下面几节中介绍的内容进行操作——我鼓励您这样做。好消息是,你可以使用 ScastieScalaFiddle 在浏览器中编写和运行你的代码。

这两个网站都适合像下面这样的小项目,在那里你不会加载很多库。如果你需要加载很重的东西,那么 ScalaFiddle 可能是更好的选择,因为它处理库的效率很高。

不言而喻,至少目前,浏览器代码项目不应该太大。如果你已经喜欢上了 Scala,并且想要构建更大的东西,那么在你的机器上安装 Scala 将是更好的选择。

也就是说,如果你现在没有时间跟进,这完全没问题。到这个故事结束时,你仍然能够理解发生了什么,并对如何用 Scala 编码有一个基本的了解。

[## 函数式编程太棒了

为什么函数式编程正在兴起

towardsdatascience.com](/functional-programming-is-awesome-c94bcd150ae6)

Scala 的“你好,世界!”

转到 ScastieScalaFiddle ,键入:

println("Hello, world!")

然后按“运行”。你会发现就这么简单。

好吧,如果你想在本地机器上运行一个真正的脚本,你需要一些样板代码。但是我们一会儿就会讲到。首先,我们需要了解一些基础知识。

值和变量

您可以使用val前缀来分配不可变变量——在 Scala 中它们被称为值:

val Greeting = "Hello, World!"
println(Greeting)

因为值是不可变的,所以你不能给它们重新赋值。如果你试图这么做,编译器会抛出一个错误。你猜对了:这就是函数式编程!

不过,如果你需要重新分配任务,还有一个选择:使用前缀var,然后就到此为止。

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

Scala 既是面向对象的,也是函数式的。照片由7 档上的拍摄

功能和方法

在 Scala 中,函数的构造非常容易:

val GreetMe = (name: String) => println("Hi, " + name + "!")
GreetMe("Rhea")

这将按预期返回Hi, Rhea!。在=之前的部分定义了函数的名字,然后是它的参数,在=>之后你会发现函数体。

您可以通过省略名称定义来定义匿名函数,这非常符合函数式编程的风格。根本不是函数式的是你可以定义没有参数的函数——在函数式编程中,你总是需要一个参数。

还有一些方法,与函数非常相似:

def GreetMe2(name: String): Unit = {
    val greeting = "Hi, " + name + "!"
    println("Hi, " + name + "!")
}
GreetMe2("Rhea")

它们非常类似于函数,但是它们的语法有点不同。需要指定一个输出类型,就像本例中花括号前面的Unit

在更理论的层面上,函数是方法的推广。这是因为方法总是类的一部分。函数可以是类的一部分,但不是必须的;如果它们碰巧是一个方法的一部分,它们就被称为方法。

类别和对象

类的定义如下(这个我直接从 Scala 的之旅复制过来的):

class Greeter(prefix: String, suffix: String) {
    def greet(name: String): Unit = 
        println(prefix + name + suffix) 
}

然后我可以用下面的方法定义这个类的一个实例:

val GreetMe3 = new Greeter("Hello, ", "!") 
GreetMe.greet("Rhea")

在类中调用方法greet的方式与在 Python 或其他语言中的方式相同。

Scala 中的对象是它们自己定义的实例:

object HowManyGreets {
    private var counter = 0
    def greet(): Int = {
        counter += 1
        counter
    }
}

与类不同,它们不能带任何参数。但是,当你调用它们的方法时,它们会返回一些东西:

val onegreet: Int = HowManyGreets.greet()
println(onegreet)    *// outputs 1*
val twogreets: Int = HowManyGreets.greet()
println(twogreets)    *// outputs 2*

[## 从面向对象编程转换到函数式编程

为什么函数式编程这么难?

medium.com](https://medium.com/@olxc/switching-from-oop-to-functional-programming-4187698d4d3)

把所有的放在一起

有一个特殊的对象,main 方法,它是每个 Scala 程序的入口点。这类似于 Python、Java 或 C 和 C++,在这里你也会遇到 main 方法。

所以我们来写一个可以问候我的 main 方法:

object Main {
  def main(name: String): Unit =
    println("Hello, "+ name + "!")
}
val greettheworld: Unit = Main.main("World")    *// Hello, World!*

完美!如果您在命令行或 IDE 上工作,您可以将这段代码保存为Hello.scala。然后像这样编译并执行它($表示这发生在您的 shell 中):

$ scalac Hello.scala
$ scala Hello

恭喜你!你不仅理解了如何用 Scala 编写你的第一个小程序。您还了解了一些关于构成该程序的概念的背景知识。

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

Scala 非常适合函数式编程。由 DISRUPTIVOUnsplash 上拍摄的照片

Scala 中的函数化:高阶函数和嵌套方法

我们已经在 Scala 中遇到了一些函数式编程的基本概念,例如,不可变变量和匿名函数。函数式编程中经常出现的其他现象是接受或返回其他函数的函数,以及在彼此内部定义的方法。

这些事情在面向对象编程中也是可能的。但是在函数式编程中,它们是自然出现的,而且经常发生。在面向对象编程中,这些现象有些少见。

高阶函数

说你在一遍又一遍的做类似的操作。通常更容易的是定义一个函数来做这些操作共有的所有事情,以及在每个操作中做不同事情的子函数。

例如,假设我们试图在一个列表上执行不同的操作。也许我们想给每个元素加 2,或者我们想把每个元素平方。您可以编写一个函数calcAnything,它可以对一个函数执行任何计算。然后,编写不同的函数来将 2 相加或对元素求平方:

object CalcSomething {private def calcAnything(numberslist: List[Double], calcFunction:     Double => Double): List[Double] =
    numberslist.map(calcFunction)def add2(numberslist: List[Double]): List[Double] =
    calcAnything(numberslist, number => number + 2)def square(numberslist: List[Double]): List[Double] =
    calcAnything(numberslist, number => number * number)}

calcAnything中的map函数负责列表上的操作。我们可以像以前一样调用这些函数:

val newList = List(1.2, 4.5, 3.6)val squared: List[Double] = CalcSomething.square(newList)
println(squared)    *// output: List(1.44, 20.25, 12.96)*val plustwo: List[Double] = CalcSomething.add2(newList)
println(plustwo)    *// output: List(3.2, 6.5, 5.6)*

注意,当plustwo被执行时,操作按照开始时的定义在列表上执行。这是函数式编程的直接结果:像val这样的变量是不可变的。如果您想顺序应用这些操作,您需要使用squared作为add2的参数。

同样,我们可以定义返回其他函数的函数。如果你有兴趣深入了解,Scala 文档中有一个很好的例子。为了简洁起见,我在这里不再进一步阐述。

嵌套方法

像许多其他语言一样,您可以在彼此内部定义函数。一个简单的例子是计算特定数字之前所有整数的和:

def bigSum(x: Int): Int = {
    def sum(x: Int, summator: Int): Int = {
        if (x < 1) summator
        else sum(x - 1, x + summator)
    }  
    sum(x, 0)
}println("Sum of 0 to 8: " + bigSum(8))    *// outputs 36*
println("Sum of 0 to 100: " + bigSum(100))     *// outputs 5050*
println("Sum of 0 to 0: " + bigSum(0))    *// outputs 0*

你可以用高斯和公式来验证这一点:任意整数序列的和达到一个整数 n 就是 S = n⋆(n-1)/2

[## 为什么开发人员会爱上函数式编程

从 Python 到 Haskell,这种趋势不会很快消失

towardsdatascience.com](/why-developers-are-falling-in-love-with-functional-programming-13514df4048e)

在 Scala 中实现面向对象:类、副作用等等

如果你知道 Java、Python、C++或者其他主要的编程语言,你不可能没有听说过面向对象编程。我相信在整篇文章中,你已经认识到了一些概念!

从带有前缀object的 main 方法开始,一直到类和类中的方法,面向对象编程的基本要素都出现在 Scala 中。副作用,即没有明确声明的函数的参数,也很容易实现:例如,可以定义一个没有任何参数的函数——但是从技术上讲,每个函数都需要某种类型的参数,即使它只是self

如果你是一个专门的函数式程序员,你唯一不能回避的面向对象的东西就是 main 方法。但是如果你的舒适区在面向对象的领域,你也会被覆盖。

是什么让 Scala 从其他语言中脱颖而出

当今大多数流行的编程语言都是从面向对象开始的,现在随着需求的增长,集成了越来越多的函数式编程的特性。想一想 PythonJavaPerl 的更多上下文。另一方面,Scala 从第一天起就准备集成两者。

它不是唯一一种以混合编程范式开始的语言。例如,围棋也使用了许多不同的方法。Go 的构成和简单性使得它对于微服务、系统架构和此类问题令人惊叹。

在光谱的另一端是 Rust :作为一门语言,它比 Scala 更难学,比 Go 更难学。像 Scala 和 Go 一样,它混合了范例,但也有一些自己独特的特性。了解所有这些意味着你可以轻松地花两周时间来提高效率。

Rust 用于许多与 Scala 相同的问题,如大数据处理、机器学习、并行编程等。但是,如果你想快速提高工作效率,并且不被沉重的术语淹没(或者你听说过幺半群、arity 或 foldables 吗?),Scala 可能是更好的选择。

如果你不怕数学术语和其他怪癖,那么 Rust 也值得一试。如果你打算长期从事函数式编程,这一点尤其适用。然而,对于函数式编程的初学者,我推荐 Scala。

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

与他人一起学习新的语言尤其令人鼓舞。由布鲁克·卡吉尔Unsplash 拍摄的照片

从哪里了解更多信息

如果这篇文章促使你下载 Scala 并亲自尝试,那么 Scala 的入门页面是你需要去的地方。

Scala 附带了非常优秀的文档。该网站还为你提供了一些不错的在线资源,值得一试。

如果你是一个动手学习者(我知道我是),那么这两个 教程值得一试。要获得更加结构化的方法和大量简洁的示例,请查看 Scala 的之旅。为了更深入的了解,请查看 Scala 书籍。

底线:Scala 对你的职业生涯来说不仅仅是有利可图

如果你在 Scala 中升级游戏,这可能会导致薪水的大幅提升。但这只是事情的一面。

Scala 为您提供了足够多的面向对象编程,让您感觉似曾相识。同时,这也是按照自己的进度了解函数式编程的一个很好的方式。

函数式编程对于大数据、机器学习等任何事情都是极好的。这些领域的需求不会很快停止。

还不确定 Scala 是否是主导函数式编程的语言。我更愿意将 Scala 视为学习一个极其重要的编程范式的基础。

无论您坚持使用 Scala,回到 Python 或 Java 并在代码中添加更多的函数片段,还是转向 Rust 等更复杂的语言,这完全取决于您。即使你不坚持使用 Scala,它也可能是你掌握函数式编程的敲门砖。

想掌握自己的数据?这就是你应该关心元数据的原因

原文:https://towardsdatascience.com/want-to-master-your-data-heres-why-you-should-care-about-metadata-8fcd7754c3b8?source=collection_archive---------33-----------------------

比了解自己更了解自己的数据

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

马太·亨利Unsplash 上拍照

E 不管你是数据科学家、数据工程师还是对数据感兴趣的人,了解你的数据是你不想忽视的一件事。我们通常把数据看成是数字、文本或者图像,但数据不仅仅是这些。

我们应该将数据视为一个独立的实体。数据可以做自我介绍,讲故事,可视化趋势。为了达到这些结果,您必须首先了解您的数据。不仅仅是它是如何形成的或它的起源,而是它将如何随着时间的推移而改变,以及它的可用性。其中一些信息就是我们所说的元数据。

为什么元数据如此重要?为什么我们必须在掌握数据之前掌握元数据?今天,我将向您展示我们如何在数据业务中利用元数据。

元数据到底是什么?

根据维基百科,元数据是“提供其他数据信息的数据”。是**“关于数据的数据”**。这听起来很简单,不是吗?所有数据都包含特定事物的信息。对于元数据,那个特定的东西是另一个数据。

然而,元数据本身的定义也各不相同。它可以是数据集的名称、创建信息或数据点的统计分布。它可以是与数据属性相关的任何内容。也就是说,所有数据都必须拥有元数据。但这并不总是详尽的情况。

没有元数据的数据总是不完整的。

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

元数据的类型。归功于作者。

我们使用数据是希望提取有用的见解,以及数据理解的目的。元数据有助于我们维护数据的完整性,验证事实的来源,或者保持稳定的数据质量。

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

电子邮件元数据的一个例子。归功于作者。

然而,在某些情况下,数据用户忽略了元数据的作用。他们认为它只是标签,它带来的价值是有限的。接下来我们将看到元数据如何与数据的另一个重要方面相关联:数据质量

数据质量

再次,维基百科说:“数据质量是指定性或定量信息片段的状态”一般来说,当“无论数据用户是谁,数据都符合预期的用例”时,就被认为是高质量的。

数据是有价值的信息来源,但是没有人愿意使用一堆垃圾。你越想从数据中提取信息,数据质量就越重要。在大数据的世界里,这也成为一个瓶颈。

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

马库斯·温克勒在 Unsplash 上拍摄的照片

随着数据越来越大,元数据也越来越多。我们不习惯处理大量的元数据。既然它需要一种特殊的处理,我们必须考虑它同时是数据而不是数据。元数据不是独立的信息,而是数据的附件。我们有可能将其扩展为对数据质量的评估。

数据是有价值的信息来源,但是没有人愿意使用一堆垃圾

在培养大数据管道的高数据质量的共同努力中,科技公司对这个新课题给予了很多关注。从检测异常到自动警报系统,我们希望尽可能少地限制错误数据的影响。没有数据理解,或者准确地说,没有元数据,我们无法做到这一点。

[## 利用统计建模大规模监控数据质量

糟糕的数据无法做出好的商业决策。在优步,我们使用汇总和匿名数据来指导…

eng.uber.com](https://eng.uber.com/monitoring-data-quality-at-scale/)

数据质量反映在许多方面,但最常见的是数值的正确性。想象你绘制了一个学期内大学生成绩的直方图。直方图是这些值的统计表示,它描述了您的数据。它变成了元数据。您可能要解释的是分数的分布,然后您可以得出结论,它是否适合您的用例。

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

使用直方图了解您的数据

事先要问很多关于数据值的问题。这些值随着时间的推移是稳定的吗?有没有异常值?如果是,我们应该如何处理这些异常值?通过回答这些问题,我们获得了一些见解,不是信息方面的,而是数据方面的。我们可以创造元数据,有用的元数据。这只是通过元数据断言数据质量的原始步骤。我们将在下一节详细讨论如何利用我们可以生成的元数据。

如何利用元数据

有些人可能会被我们从数据集中提取的各种统计数据所淹没。其他人可能会忽略这些额外的信息,认为它们是无用的。诚然,我们不需要每次处理数据时都绘制直方图,但这很有帮助。为了利用有洞察力的元数据,数据用户必须首先回答三个重要问题:

  • 什么: 你想验证你的数据质量吗?有些数据需要严格的稳定性,而有些数据需要注意是否正确。对于每一种数据,我们将提取的信息作为元数据。统计分布、长期趋势、差异等。这就是我们所说的元数据策略。在处理数据和元数据时,我们的存储和人力资源有限。所以,一定要慎重考虑重点放在哪里。
  • 如何: *我们如何衡量数据质量?*这些操作遵循元数据策略。我们可以选择测量整个数据库,或者一些表,或者一组特定的列。值的总数、字符串的最大/最小长度、缺失数据的比例。我们决定衡量什么取决于我们如何使用这些数据来产生结果。
  • 何时: 数据随时间变化。当我们通过元数据提取洞察力时,我们正在跟踪这些转变。我们什么时候跟踪元数据?每天?每小时吗?每个季度?这取决于多少粒度足以解决数据质量问题。我们根据数据变化的速度来调整我们的衡量标准。例如,每一分钟或每一秒钟都需要跟踪股票市场数据。天气数据每小时都在变化,而航空数据可能需要几个月或几年的时间才能改变。

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

股票市场数据需要每分钟都被跟踪。马库斯·斯皮斯克在 Unsplash 上的照片

元数据有着悠久的历史,但我们最近才发现它对数据管理的贡献,尤其是对数据质量的贡献。元数据本身不能改变数据的结果,但它在我们的原始数据和它的使用之间增加了一个安全和管理层。您甚至可能在不知不觉中使用元数据来发现您的数据。

当数据很小时,数据质量可能无关紧要,但是当处理大量数据时,数据质量就变得至关重要。元数据帮助我们跟踪这种增长,并确保数据按照应有的方式发展。由于未能利用元数据,我们无法理解您的数据。

元数据该怎么处理?

如果您希望掌握您的数据,您应该开始系统地处理元数据。基于我们上面看到的框架,你为自己选择一个合适的数据策略。还没有什么新奇的东西。它始于您希望如何使用您的数据,以及您如何控制其使用质量。 一切始于目标。

ETL 过程中有一个阶段叫做 探索性数据分析 。我觉得更多地了解你们数据的统计方面很有意思。它似乎接近我们希望通过元数据了解的内容。

我总是看到我的数据科学家和/或数据分析师朋友在对他们的原始数据做任何事情之前先从 EDA 开始。所以我认为这肯定是一个重要的步骤,我想知道它是如何与我的元数据框架相联系的。他们有很多共同之处。

首先是目的。EDA 中的“探索性”部分与元数据的发现目标不谋而合。其次是他们如何看待数据的统计方面,以评估其未来的用途。综上所述,EDA 实际上是一个必不可少的步骤,因为它类似于基于元数据的数据质量评估。

您已经有了数据策略和数据评估,现在是您决定如何处理所有这些信息的时候了。在数据质量控制人员看来,数据将如何被使用决定了它是否正当和可信。

***Key takeaways:*** - Build your data strategy based on data usability
- Apply an EDA - Exploratory Data Analysis to evaluate the data
- Decide on whether you have a solid confidence on your data

结论

我已经分享了我对元数据的一些观点。对我来说,它和数据本身一样有价值。那些利用这些价值的人是理解他们的数据的人。误用我们不理解的东西更容易。元数据为我们提供了更清晰的数据视图,此外还有数据质量、完整性和可用性。

我的名字叫 Nam Nguyen,我写的主要是关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。

我的数据科学硕士学位值得吗?

原文:https://towardsdatascience.com/was-my-data-science-masters-degree-worth-it-6b524dd35b33?source=collection_archive---------12-----------------------

一连串的课程,现实生活中的收获,以及这一切是否最终值得

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

罗尼·库尔茨在 Unsplash 上拍摄的照片。

目录

  1. 介绍
  2. 数据科学
  3. 课程
  4. 职业
  5. 摘要
  6. 参考

介绍

我去了南方卫理公会大学(SMU)攻读我的数据科学硕士学位【2】。这个决定是在做了几年分析化学家后做出的。虽然我本科主修生物学,辅修化学和汉语,但我一直专注于研究科学和实验设计。当我发现自己不满足于做一名化学家时,我开始寻找其他的职业,以及如何才能达到相应的职业。我研究了数据分析、软件工程和数据科学。在我目前的工作岗位上,我已经从这三个可能的职业中演绎了相似的概念,但我甚至连一次面试的机会都没有。为了解决我的问题,我不得不最终寻找正规教育。下面,我将讨论数据科学对我来说意味着什么,我在大学里学的课程,以及这些经历是否适用于今天并最终值得。

数据科学

我已经编写了几篇关于数据科学的文章,以及该领域、机器学习和数据分析之间的差异和相似之处,以及对在线学习的影响。除了我将在本文末尾列出的具体文章之外,请随意查看我的个人资料。

根据我的经验,数据科学可以最好地概括为一个领域,在这个领域中,通过使用来自工具和语言的库和包,传统的统计和数学实现了自动化,例如:

Python, R, sklearn (scikit-learn), TensorFlow, Keras, and pandas. 

虽然该领域不断变化,但解决问题、编程、统计和业务理解等共同主题处于数据科学核心的最前沿。对我来说,可能有几个地方我可以获得所有这些技能。我申请了数据科学学位,因为我没有接受过正式的 it 本科教育,我想提升自己,并在竞争激烈的就业市场中具有竞争力。

课程

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

Max Duzij 在Unsplash【3】上的照片。

虽然我会列出 SMU 大学的具体课程,但大多数课程在类似的大学和项目中会有重叠。在我的项目中,不仅有各种各样的课程,还有两个主要的专业:机器学习和商业分析。第一部分侧重于数据科学的编码方面以及所使用的公共库,而第二部分强调项目设计的重要性,以及它将如何为您未来的数据公司带来商业价值。如果你想在同一所或不同的大学找到类似的课程,我还会强调哪些课程是我认为对现实生活最有益和最有用的。

我将首先谈论核心课程,然后将包括选修课。

核心班级:

  • 数据科学的统计基础

这是您首先学习的课程之一,因为为了学习数据科学的有趣和有趣的算法,您需要在初级数据科学和统计学方面有坚实的基础。本课程的关键要点是统计抽样、方差分析(ANOVA)、回归和结果交流,主要工具是 SAS 和 r。

我很惊讶这门课有多棒,我强烈建议在学习任何数据科学之前先学习统计学。例如,当面试官问你如何开发方差分析时,你会认为你只需要专注于编写深度学习算法,这也会让你在面试中变得更受欢迎。

  • 做数据科学

另一门课是在我的课程开始时上的,这门课强调了探索性数据分析(EDA)在任何数据科学项目的第一部分是多么重要。要真正开始使用像随机森林或 K-means 这样的算法,你需要有一个你理解的可用数据集,EDA 可以帮助你有一个强大的数据集,你可以在其上运行模型。

  • 应用统计学:推理与建模

这门课重在统计,也许是学生最纠结的地方。这里的目标不是编程,而是回归、时间序列和商业应用案例。我在这里学到的一件有趣的事情是使用自回归移动平均模型(ARIMA)预测股票市场。

  • 文件组织&数据库管理

虽然之前的课程以统计为目标,同时使用 SAS 和 R 等工具和语言,但本课程涵盖了 SQL、Python 和 GitHub。

设置您的数据科学项目不是从数据集开始,而是从使用 SQL 查询开发数据集开始。

  • 机器学习 I

也许是最有趣的核心课程,这门课程讲述了所有常见的机器学习算法,如支持向量机(SVM)、多项式朴素贝叶斯和逻辑回归。

  • 信息可视化

学会如何将你的复杂结果传达给利益相关者是很重要的,所以学会如何可视化可以在很大程度上帮助解决这个问题。大多数工作你可以使用 Tableau、Google Data Studio 等工具,甚至可以用 Python 编写自己的程序,使用 matplotlib 等流行的库,用 Java 编写代码。

  • 量化世界

本课程总结了您所学的所有基础知识,并总结了如何处理数据、清理数据、执行 EDA 以及对数据集建模。这也是你开始你的顶点项目的地方,在其他大学也可能被称为你的论文。

选修课:

我不会去特别在这些,但他们提到了 SMU 的网站。我认为这里最重要的课程是自然语言处理(NLP)。根据我的经验,一些数据科学家会避开它,但是在你的工作中,你很可能会遇到文本数据,并且必须处理大量的文本数据。这实际上是我最喜欢的数据科学方面,可以帮助分析文档、分类文本和返回情感。以下是我参加的课程中包含的选修课:

  • 云计算
  • 机器学习 2
  • 统计抽样
  • 自然语言处理
  • 商业分析
  • R 时间序列分析
  • 数据和网络

职业

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

照片由克里斯蒂娜@ wocintechchat.comUnsplash【4】上拍摄。

为了回答这个问题,我的数据科学硕士学位值得吗?是的。

这个项目的第一个好处是我可以在工作的时候在线完成。教育可能相当昂贵,所以我非常高兴知道我仍然在学习的同时赚钱。我确实为每堂课做了现场视频交流,并参加了现场活动,这使我在职业生涯中获得了这个学位的下一个好处。参加这个项目的会议,除了和来自知名公司的同学一起工作,我很快建立了我的数据科学家网络。其中一次会议实际上是我们不得不介绍的课程— 顶点。在那里,我和另外两个同学介绍了我们关于如何对假新闻进行分类的话题,这都是因为我的学位和各自的研究。

在我的简历上有这么大的一个项目和出版物是非常有价值的,我可以向其他数据科学家和我采访的人进行交流和描述。因为我在高教育水平下获得了一个纯粹专注于数据科学的学位,所以我能够在 Indeed,HomeAway (Vrbo)以及现在我工作的地方找到工作,这是一家位于德克萨斯州奥斯汀的成功创业公司,名为 ScaleFactor 。如果没有成功完成这个项目,我不知道我会在哪里。它让我成为一名受过教育的专业数据科学家。

摘要

虽然由于各种原因,这条道路可能不是每个人的最佳选择,但我相信对我来说,这是我成为数据科学家的原因。一路上,我学到了很多,建立了令人敬畏的关系,甚至交了更好的朋友。所以是的,这是值得的。我希望这篇文章对你有用,感谢你的阅读!请从我这里找到这些文章,它们包括数据科学、数据分析、机器学习的差异和相似之处,以及下面分别在线学习数据科学的影响和结果[5]、[6]和[7]。

[## 数据科学与数据分析。区别就在这里。

数据科学家和数据分析师的主要区别和相同点是什么?阅读下面的概述…

towardsdatascience.com](/data-science-vs-data-analysis-heres-the-difference-4d3da0a90f4) [## 数据科学 vs 机器学习。区别就在这里。

数据科学家和机器学习工程师的主要区别和相同点是什么?阅读以下内容,了解…

towardsdatascience.com](/data-science-vs-machine-learning-heres-the-difference-530883d6de3a) [## 是的,你可以在网上成为一名数据科学家。以下是方法。

在线学习的专业数据科学家指导您在家开始数据科学生涯

towardsdatascience.com](/yes-you-can-become-a-data-scientist-online-heres-how-dc73c7faae0f)

参考

[1]照片由罗尼·库尔兹Unsplash(2019)拍摄

[2]南方卫理公会大学,在线数据科学硕士,(2020)

[3]Max Duzij 在 Unsplash 上拍摄的照片,(2019)

[4]照片由克里斯蒂娜@ wocintechchat.comUnsplash(2019)上拍摄

[5] M.Przybyla,数据科学家 vs 数据分析师。区别就在这里。(2020 年)

[6] M.Przybyla,数据科学 vs 机器学习。区别就在这里。(2020 年)

[7] M.Przybyla,是的,你可以在网上成为一名数据科学家。以下是方法。(2020 年)

"那是唧唧声吗?"在 PyTorch 上制作鸟类音频检测网络

原文:https://towardsdatascience.com/was-that-a-chirp-making-a-bird-audio-detection-convnet-on-pytorch-88400450bb19?source=collection_archive---------32-----------------------

为什么鸟类声音探测对我们环境的未来如此重要

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

简·梅乌斯在 Unsplash 上拍摄的照片。由我编辑:)

介绍

你听说过自动语音识别,你听说过音乐标记和生成,但你听说过鸟类音频检测吗?

大约一年前,在我高二的时候,我第一次听说这种音频深度学习的用例。事实上,鸟音频检测(讽刺的缩写为 BAD,但我会尽量避免这个缩写😅)是我在深度学习和计算机科学方面做的第一批项目之一的主题。我参与了一个研究项目,在北阿拉斯加郊区使用纯音频探测鸟类的存在。*跃入其中,鸟音探测作为这样一个小众却又引人入胜的应用出现了!*在本文中,我将向您展示如何在 BirdVox-70k 数据集上使用简单的卷积神经网络(CNN)来实现这一点。

好吧,但是为什么鸟类音频检测很重要呢?

多年来,深度学习模型在鸟类音频检测应用中的使用一直在不断发展进步,有些人对此非常感兴趣是有原因的。首先,鸟类的移动速度很快,体型相对较小,已经很难追踪了。此外,不同种类的鸟类有自己独特的发声方式,这使得通过听觉和听觉来探测鸟类比亲眼目睹更为可取。最后,由于鸟类是生态系统的一部分,它们的存在和迁徙模式通常是任何特定地区环境健康的警示信号。

那么,为什么不录下一段音频片段,然后发送给人类,让他们稍后再听呢?然而,让我们现实一点:

手动标记音频既昂贵又繁琐,而且可能无法接近实时。

所以,这就是深度学习和 CNN 发挥作用的地方。如果我们的模型足够精确,我们可以通过在荒野周围设置麦克风来自动记录鸟类迁徙模式和跟踪鸟类物种。有了这些数据,我们可以更深入地了解我们世界的生态系统,并充分了解气候变化对我们环境的影响。

等等,上面那张图中那些很酷的情节是什么?

先说说声音的一切。声音基本上是由通过空气进入我们耳膜的奇特压力波组成的,可以用数字设备记录为信号。事实证明,我们可以将这个信号绘制如下:

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

音频信号/波形的示例图,没什么特别的。或者也许…

然而,这个长线图看起来并不特别吸引人,可以馈入任何深度学习模型,更不用说 CNN 了。事实上,如果我现在告诉你,上面的音频信号代表的是一只鸟的鸣叫,你会相信吗?很可能不是…你反而认为这是我随机创作的情节。 如果你认为鸟鸣声在第 10000 次滴答附近,如果我说鸟鸣声正好在中间,在第 6000 次滴答时呢? 重点是:

如果我们自己都不能对任何特定的信号图代表什么做出任何强有力的假设,我们怎么能指望深度学习模型做到这一点呢?

…我们并没有完全陷入困境。实际上还有另一种方式来表示音频:频谱图。频谱图是通过在一个小的时间窗口中记录频率的存在和各自的强度,沿着 x 轴(由时间单位表示)堆叠,直到频谱图覆盖音频信号的总持续时间而制成的。当时间窗在谱图创建过程中移动时,时间窗自身重叠是常见的,并且通常频率强度(音量或响度)用颜色表示,或者用数字表示,较高/较低值。

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

从上面显示的完全相同的波形伪造的声谱图。x 轴、y 轴和绘图颜色分别代表时间单位、频率(单位为赫兹)和频率强度。现在,你能清楚地分辨出这只鸟是不是在叫,什么时候叫吗?

给定来自上方的信号的频谱图,如果和当鸟鸣叫时,它应该更清楚。具体来说“只是因为”,你可以在 250 ms 标记处看到 6000 Hz 左右的独特活动;那是鸟鸣声。因此, CNN 音频分类器通常将频谱图作为输入,鸟类音频检测模型也不例外。

准备

数据集

为此,我使用了来自 BirdVox 的 BirdVox-70k 数据集,它包含半秒(500 毫秒)的记录/波形,包含或不包含鸟啁啾声。该数据集来自其更大的兄弟,BirdVox-full-night,两者都是在 2015 年秋季在美国纽约伊萨卡记录的。每个波形的标签作为最后一位数字包含在每个文件名中(或者是0或者是1)。尽管 70k 数据集拥有大约 70,000 个数据片段(因此得名),但我将只使用其中的三分之二(更确切地说,大约 50,000 个),因为我的 Paperspace 帐户中的持久存储空间越来越少😦。

数据被捆绑在单独的 HDF5 文件中,这意味着我计划使用的已经减少的 50,000 个样本实际上被分成 4 个不同的. hdf5 文件。为了增加融合,每个波形被存储到一个有自己的“文件名”标签的组中,所有这些被存储到另一个称为“波形”的组中。即使在阅读了 h5py 文档之后,我还没有看到如上所述的这种安排。这些发现已经让我做了两个最糟糕的数据准备噩梦。几乎没有存储空间了,我无法改变已经给我的数据格式。这给我留下了最后一个选择:创建一个非常定制的 PyTorch 数据集类,这样我就可以继续了。

但在我继续之前,让我们听一些简短的音频样本,以及对数据集的一些简单数据分析(警告—降低音量,因为样本可能比预期的更响):

一些鸟积极的音频片段供您欣赏

一些鸟负面的音频片段供您欣赏

事实证明,在将所有文件组合在一起后,bird 阳性音频样本的比例正好是 50%,正如他们在网站中承诺的那样。每个鸟正波形的文件名还包括鸟叫的频率。综合所有这些,以下是我的发现:

我预计许多电话会相当高。 很大一部分样本都是如此,但绝大多数实际上更接近低频(2000–3500Hz)。 挺惊喜的!

数据集和数据加载器类

好了,我们知道有单独的. hdf5 文件要处理成一个“数据集”,每个文件都有一个有点笨拙的数据结构。**这些条件肯定需要一个定制的 PyTorch 数据集类来正确地加载我们的音频数据,以便稍后进行训练。**数据集类主要需要__init____getitem__函数(还有__len__,但这很简单)。以下是我计划每个人要做的事:

**def __init__():**

  • 遍历所有四个文件中每个波形的每个组名&将它所属的文件和 HDF5 组添加到属于该类的列表中。
  • 获取波形的标签(文件/组名的最后一位)并添加到属于该类的另一个列表中。例如,文件名unit03_012712228_00000_0表示没有任何鸟类发声。
  • 准备一个应用于波形的变换函数,将其转换为声谱图(特别是 mel 缩放的声谱图),并允许其他增强技术。

**def __getitem__():**

  • 先前初始化的两个列表的索引
  • 通过列表接收到波形的位置后,打开该波形的 HDF5 文件。所有 HDF5 I/O 将使用 python 库h5py进行处理
  • 将其转换为 PyTorch 张量,并应用任何变换,包括频谱图变换。
  • 将物品返还给呼叫者。

下面,我将这些想法转化为数据集类的代码:

呀,这个太长了!如果太多了,只要相信我上面描述的任何功能都是在这里实现的。但是往好的方面看,基本上这次努力最难的障碍已经被超越了!

我们定义数据集文件的目录,以及文件名本身。我决定使用 4 个文件中的 3 个作为测试数据,最后一个作为验证/测试集来测量模型的性能,为后者留下最小的文件。由于每个文件的所有记录设备都设置得相对靠近(在伊萨卡的同一个城市),我相信绕过随机分割不会引入大量偏差。

用上面列出的三个文件制作一列火车

从最后一个(也是最小的)文件创建验证集

设置好数据集后,就该定义数据加载器了:

批量

定义数据加载器,它将成批返回数据。在意识到使用 PyTorch 和 HDF5 文件时存在一个 bug 之前,我已经尝试过设置多个“num_workers”

模型

模型创建

我为我的模型设置了任何必要的辅助函数,以便稍后进行训练:

定义多个函数,稍后可以使用这些函数来训练继承该类的 PyTorch 模型。

此函数在上述类的 val_step 函数中短暂使用,以确定验证数据加载器上模型的%(百分比)准确性,而不仅仅是验证损失。

并定义用于拟合/训练模型并在验证数据集上测试模型的主要函数:

定义训练/验证循环

最后, 这是我们一直在等待的简单 CNN 模型 :

相对简单,考虑到 ResNets 和其他流行的网络模型都比这个大很多很多!

我利用了多个卷积层,正如我们之前的理论推断建议我们为模型所做的那样,使用一些最大池层,然后是一个非常简单的全连接网络来进行实际分类。令人惊讶的是,这个架构后来表现得相当好,甚至超过了我自己的预期。

利用 GPU

如今,几乎每个人都需要一个 GPU 来训练比普通前馈神经网络更复杂的东西。幸运的是,PyTorch 使我们能够轻松利用可用 GPU 的能力。首先,我们将 cuda 设备定义为关键字device,以便于访问:

我们还确保如果没有 GPU,将使用 CPU 来代替。

这里还有另一个技巧:

这有助于提高你的训练速度(如果你的输入在大小/形状上没有变化的话)

显然,您可以“告诉”PyTorch 在反复训练时优化自己,只要训练输入在大小和形状方面保持不变。它会知道为你的特定硬件(GPU)使用最快的算法。你知道的越多!

然后,我们定义助手函数,将数据加载器、张量和我们的模型移动到我们的 GPU 设备。

各种助手功能,以确保我们总是在使用我们的 GPU。

培养

培训先决条件

使用我们的设备助手函数,我们将所有东西移动到我们的 GPU,如下所示:

我们的数据加载器-> GPU

型号-> GPU

我们还指定了我们的学习率和我们的纪元数量,这花了我很长的时间来为这两者找到一个好的值。

在我的实验中,我发现这些超参数是最有效的。

现在, 起!

好了,我们终于开始训练了!

我们发现模型在任何训练之前的表现:

很明显,我们在准确性上有点幸运,开始时有点有利,但根据几次试验,最终结果将非常相似,如果不是相同的话。

接下来,我们使用我们之前定义的fit函数来训练我们简单的Classifier模型实例:

忽略’ HBox '文物,我知道我不应该使用 tqdm!

在看到准确性略有下降后,我决定再训练一点点,以将模型重定向回正确的方向:

啊,更多的盒子!但是,看那准确性!

总而言之,以下是我们在用于训练的 11 个时期内的训练统计数据:

总的来说,我们的模型训练得很好,从表面上看,我们可能已经找到了模型损失的相对最小值。

等等,一个更复杂的模型或者使用不同的变换怎么样?

相信我,在我简单的Classifier()第一次尝试成功后不久,我也尝试过这两种方法。我决定不包括两者的细节,因为我发现他们的结果实际上比我们已经取得的结果更糟糕*,很奇怪。*

如果你想看看我是如何尝试实现这两者的,请直接来看我贴在这里的笔记本:https://jovian.ml/richardso21/bird-audio-detection

对于额外的声谱图转换,我尝试了随机时移和噪声注入。长话短说,它似乎根本没有提高验证的准确性。此后,我对此进行了推理,因为数据集规范明确指出,所有啁啾都将位于音频记录的中间处,因此随机移动频谱图以实现更好的模型泛化实际上可能会损害其性能。然而,我还没有尝试只有随机噪声注入。**

我还试图训练一个 ResNet50 模型,希望进一步提高验证的准确性。这里是最令人难以置信的部分: 我从未得到过超过 50%准确率的模型当我写这篇文章的时候,我还不确定我到底做错了什么,所以如果其他人可以看看我上面的笔记本并帮助我,我非常乐意接受任何意见或建议!

结论

总的来说,我会说这是一次非常有趣的尝试,值得花些时间去隔离。首先,我不得不重温我去年夏天调查过的东西,这确实有一种怀旧的感觉。更重要的是,我们学习了如何为一个很可能是真实世界的场景实现一个 PyTorch 数据集类,在这个场景中,数据不一定是按照您所期望的那样设置的。最后,大约 84%的最终验证分数对于我在运行中构建的这样一个简单的网络架构来说是相当不错的。

然而,我希望你喜欢这篇文章,就像我喜欢做它一样!一如既往,快乐编码!(这是* 真的 开始成为我在媒体上的流行语……)*

如果你想要这篇文章中所有代码示例的源代码/笔记本,你可以访问https://jovian.ml/richardso21/bird-audio-detection

如何稳定甘训练

原文:https://towardsdatascience.com/wasserstein-distance-gan-began-and-progressively-growing-gan-7e099f38da96?source=collection_archive---------16-----------------------

Wasserstein 距离、边界平衡和渐进生长 GAN

gan 主导图像生成和图像翻译等深度学习任务。

在之前的帖子中,我们已经了解了不成对的图像到图像的转换。然而,在你实现你自己的超级酷的深度 GAN 模型之前,有一些真正重要的概念你必须理解。

在这一部分,我们将看看一些基础性的工作。我们将看到最常见的 GAN 距离函数及其工作原理。然后,我们会把甘斯的训练感知为试图寻找一个两人博弈的均衡。最后,我们将看到渐进式训练的革命性成果,首次实现了逼真的百万像素图像分辨率

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

图片来自作者。希腊某地的日出。如果你的 GAN 模特训练得像日出一样流畅岂不是很好?

我们将探索的研究主要解决模式崩溃和训练不稳定性。一些从未训练过 GAN 的人会很容易地认为我们总是指这两个轴。在现实生活中,为一个新问题训练一个大规模的 GAN 可能是一场噩梦

如果你开始阅读和实施最新的方法,在新问题中训练新手几乎是不可能成功的。其实就像中了彩票一样。

当你离开最常见的数据集(CIFAR、MNIST、CELEBA)时,你已经陷入混乱。

这个评论系列的目标是像我们这样的人,他们超级有野心,但不想花所有的时间阅读该领域的所有参考书目。

通常情况下,您试图在调试时直观地理解学习曲线,以便猜测可能工作得更好的超参数。但是 GAN 训练是如此不稳定,以至于这个过程经常是浪费时间。这个可爱的工作是第一个为甘训练计划提供广泛理论依据的工作之一。有趣的是,他们发现了分布之间所有现存距离的模式。

核心理念

核心思想是有效测量模型分布与真实分布的接近程度。因为选择如何测量距离会直接影响模型的收敛。正如我们现在所知道的,GANs 可以表示来自低维流形的分布(噪声 z)。

直觉上,这个距离越弱,就越容易定义从参数空间(θ-空间)到概率空间的映射,因为已经证明分布更容易收敛。

我们有理由要求这种连续映射。主要是因为可以定义一个连续函数来满足这个连续映射,这个连续映射给出了期望的概率空间或生成的样本。

出于这个原因,这项工作引入了一个新的距离,称为瓦瑟斯坦-甘。它是推土机(EM)距离的近似值,理论上表明它可以逐步优化 GAN 的训练。令人惊讶的是,不需要在训练期间平衡 D 和 G,也不需要网络架构的特定设计。这样,减少了 GANs 中固有的模式崩溃。

理解 Wasserstein 距离

在我们深入讨论拟议损失之前,让我们先来看一些数学计算。正如 wiki 中完美描述的,部分有序集合的子集的上确界 ( sup) 是大于或等于的所有元素中的最小元素。因此,上确界也被称为最小**上界。**我个人把它称为 T 中能找到的所有可能组合的子集的最大值。

现在,让我们在 GAN 术语中引入这个概念。 T 是我们可以从 GD 中得到的所有可能的配对函数近似值 f。S 将是那些函数的子集,我们将约束这些函数以使训练更好(某种正则化)。排序将自然地来自计算的损失函数。基于以上所述,我们最终可以看到 Wasserstein 损失函数,其测量两个分布 Pr 和 Pθ之间的距离。

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

图片由作者提供,最初用 Latex 编写。

这个严格的数学约束被称为 K-Lipschitz 函数以得到子集。但是如果它被广泛证明,你不需要知道更多的数学。但是我们如何引入这种约束呢?

处理这种情况的一种方法是通过训练一个神经网络,使其权重位于一个紧凑空间中,来粗略地近似这个约束。为了达到这一点,最简单的方法就是将砝码固定在一个固定的范围内。

就是这样,重量剪裁如我们所愿!因此,每次梯度更新后,我们将 w 范围削波至[0.01,0.01]。这样,我们显著地加强了 Lipschitz 约束。简单,但我可以向你保证它的工作!

事实上,有了这个距离损失函数,它当然是连续的和可微的,我们现在可以用提出的标准训练 D 直到最优,而其他距离饱和。饱和意味着鉴频器的损耗为零,生成的样本仅在某些情况下有意义。所以现在,饱和(自然导致模式崩溃)得到了缓解,我们可以在所有训练范围内使用更线性风格的梯度进行训练。让我们看一个例子来阐明这一点:

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

图片由 WGAN paper[https://arxiv.org/abs/1701.07875]提供

WGAN 标准在空间的所有部分提供了清晰的梯度。

为了在实践中看到所有以前的数学,我们在 Pytorch 中提供了 WGAN 编码方案。您可以直接修改您的项目以包含此损失标准。通常在真实的代码里看比较好。值得一提的是,为了保存子集并获取上限,这意味着我们必须获取许多对。这就是为什么你会看到我们每隔一段时间就训练一次生成器,以便鉴别器得到更新。这样,我们就有了定义上确界的集合。注意,为了接近上确界,我们也可以在升级 D 之前为 G 做很多步骤。

在后来的工作中,事实证明,即使这个想法是可靠的,重量削减也是一种加强期望约束的可怕方式。使函数成为 K-Lipschitz 的另一种方法是梯度惩罚

关键的想法是一样的:将重量保持在紧凑的空间。然而,他们通过约束评论家的输出相对于其输入的梯度规范来做到这一点。

我们不会讨论这篇文章,但是为了一致性和方便用户实验,我们提供了代码作为普通 wgan 的改进替代方案。

结果和讨论

在我们简短的描述之后,我们现在可以进入一些结果。看到 GAN 在训练中如何学习是很美好的,如下图所示:

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

图片由 WGAN paper[https://arxiv.org/abs/1701.07875]提供

使用 DCGAN 发生器的 Wasserstein 损耗准则。如您所见,损耗快速稳定下降,同时样品质量提高。这项工作被认为是 GANs 理论方面的基础,可以总结为:

TL;速度三角形定位法(dead reckoning)

  • 瓦瑟斯坦准则允许我们训练 D 直到最优。当准则达到最佳值时,它只是向生成器提供一个损耗,我们可以像训练任何其他神经网络一样训练该损耗。
  • 我们不再需要适当地平衡 GD 容量。
  • Wasserstein 损失导致训练 G 的梯度质量更高。
  • 据观察,对于发电机和超参数调谐的架构选择,WGANs 比普通 gan 更加鲁棒

的确,我们确实提高了优化过程的稳定性。然而,没有什么是零成本的。WGAN 训练变得不稳定基于动量的优化器如 Adam,以及高学习率。这是合理的,因为标准损失是高度不稳定的,所以基于动量的优化器似乎表现更差。这就是他们使用 RMSProp 的原因,众所周知 RMSProp 在非平稳问题上表现出色。

最后,理解本文的一个直观方式是与层内激活函数历史上的梯度进行类比。特别是,sigmoid 和 tanh 激活的梯度消失,有利于 ReLUs,因为在整个数值范围内梯度得到了改善。

始于(边界均衡生成对抗网络 2017)

我们经常看到,鉴频器在刚开始训练的时候进步太快。然而,平衡鉴别器和生成器的收敛是一个现有的挑战。

这是第一个能够控制图像多样性和视觉质量之间的平衡的作品。利用简单的模型架构和标准的训练方案,获得高分辨率图像。

为了实现这一点,作者引入了一个技巧来平衡生成器和鉴别器的训练。BEGAN 的核心思想是这种新的强制平衡与描述的 Wasserstein 距离相结合。为此,他们训练了一个基于自动编码器的鉴别器。有趣的是,由于 D 现在是一个 自动编码器,它产生图像 作为输出,而不是标量。在我们继续之前,让我们记住这一点!

正如我们所见,匹配误差分布比直接匹配样本分布更有效。一个关键点是,这项工作旨在优化自动编码器损耗分布之间的 Wasserstein 距离,而不是样本分布之间的 wasser stein 距离。begin 的一个优点是不明确要求鉴别器受 K-Lipschitz 约束。自动编码器通常用 L1 或 L2 范数来训练。

两人博弈均衡的形成

为了用博弈论来表达问题,增加了一个平衡鉴别器和生成器的平衡项。假设我们可以理想地生成不可区分的样本。那么,它们的误差分布应该是相同的,包括它们的期望误差,也就是我们在处理每一批后测量的误差。完美平衡的训练将导致 L(x)和 L(G(z)的期望值相等。然而,从来不是这样!由此开始决定量化平衡定额,定义为:

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

图片由作者提供,最初用 Latex 编写

这个量在网络中被建模为超参数。因此,新的训练方案涉及两个相互竞争的目标:a)自动编码真实图像和 b)辨别

真实来自生成的图像。γ项让我们平衡这两个目标。γ值越低,图像多样性越低,因为鉴别器更侧重于自动编码真实图像。但是,当预期损失变化时,如何控制这个超参数呢?

边界平衡 GAN(开始)

答案很简单:我们只需引入另一个落入[0,1]范围内的变量 kt。这个变量将被设计来控制在训练期间放在 L(G(z))上的焦点。

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

图片由作者提供,最初用 Latex 编写

它初始化为 k0 = 0,λ_k 也被定义为本研究中 k (使用 0.001)的比例增益。这可以被视为闭环反馈控制的一种形式,其中 kt 在每一步都被调整,以保持所选超参数γ的期望平衡。

注意,在早期训练阶段, G 倾向于为 D 生成易于重建的数据。同时,真实的数据分布还没有被准确地获知。基本上就是 L(x) > L(G(z))。与许多 GANs 相反,BEGAN 不需要预训练,可以用 Adam 进行优化。最后,通过使用平衡概念,导出收敛的全局度量。

本质上,可以将收敛过程公式化为寻找 a)最接近的重构 L(x)和 b)控制算法| |γL(x)—L(G(z))| |的最低绝对值。将这两项相加,我们就可以知道网络何时收敛。

模型架构

模型架构非常简单。一个主要的区别是引入了指数线性单位而不是 ReLUs。他们使用带有深度编码器和解码器的自动编码器。超参数化旨在避免典型的 GAN 训练技巧。

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

图片来自 https://arxiv.org/abs/1703.10717 报纸。模型架构

使用 U 形结构,没有跳过连接。下采样被实现为核为 3、步长为 2 的子采样卷积。另一方面,上采样是通过最近邻插值完成的。在编码器和解码器之间,经过处理的数据的张量通过完全连接的层被映射,没有任何非线性。

结果和讨论

在下面的 128x128 插值图像中可以看到一些呈现的视觉效果:

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

图片由 begin[https://arxiv . org/ABS/1703.10717]提供。由 BEGAN 生成的插值 128x128 图像

值得注意的是,观察到**变化随着γ增加,但伪像(噪声)也增加。**可以看出,插值显示出良好的连续性。在第一行,头发过渡和发型被改变。同样值得注意的是,左图中的一些特征消失了(香烟)。第二行和最后一行显示简单的旋转。虽然旋转是平滑的,但是我们可以看到侧面照片没有被完美地捕捉。

最后一点,使用 BEGAN 平衡法,网络收敛到多样的视觉愉悦的图像。这在 128x128 分辨率下仍然适用,只需稍加修改。训练是稳定的、快速的,并且对于小的参数变化是鲁棒的。

但是让我们看看真的高分辨率会发生什么!

渐进 GAN(2017 年为提高质量、稳定性和变化而渐进生长 GAN)

到目前为止,我们所描述的方法可以产生清晰的图像。然而,它们只能以相对较小的分辨率生成图像,并且变化有限。**分辨率低的原因之一是训练不稳定。**如果您已经部署了自己的 GAN 模型,您可能知道由于计算空间的复杂性,大分辨率需要较小的小批量。以这种方式,时间复杂性的问题也增加了,这意味着你需要几天来训练一个 GAN。

增量增长架构

为了解决这些问题,作者从低到高分辨率图像开始,逐步增加生成器和鉴别器

直觉是,随着训练的进行,新添加的层旨在捕捉对应于高分辨率图像的更高频率的细节。

但是是什么让这种方法如此好呢?

答案很简单:模型首先发现大规模(全局)结构,然后发现局部细粒度细节,而不是必须同时学习所有规模**。增量训练自然以此为目标。值得注意的是,在整个训练过程中,所有层都是可训练的,并且网络架构是对称的(镜像)。下面描述了所描述的体系结构的图示:**

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

甘斯纸业[https://arxiv.org/abs/1710.10196]逐步增长的图像

然而,由于不健康的竞争,模式崩溃仍然存在,这增加了 GD 中误差信号的幅度。

在过渡之间引入平滑层

这项工作的关键创新是新增层的平滑过渡稳定训练。但是每次转变之后会发生什么呢?

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

图片由甘斯纸业逐步成长而来,链接:https://arxiv.org/abs/1710.10196

真正发生的是图像分辨率翻倍。因此在 GD 上新增一层。这就是奇迹发生的地方。在过渡期间,在较高分辨率上操作的层被用作剩余的跳跃连接块,其权重(α)从 0 线性增加到 1。一个意味着跳过连接被丢弃。

所描绘的 toRGB 块代表层,该层将一维特征向量投影和整形为 RGB 颜色。它可以被视为总是以正确的形状带来图像的连接层。并行地,来自 RGB 的执行相反的操作,而两者都使用 1 × 1 卷积。真实图像被相应地缩小以匹配当前尺寸。

有趣的是,在转换过程中,作者在真实图像的两种分辨率之间进行插值,以模拟 GANs 式学习。此外,对于渐进式 GAN,大多数迭代都是在较低的分辨率下执行的,从而导致 2 到 6 次训练加速。因此,这是第一个达到百万像素分辨率的作品,即 1024x1024

与遇到协方差偏移的下游任务不同,gan 表现出越来越大的误差信号幅度和竞争问题。为了解决这些问题,他们使用正态分布初始化和每层权重归一化,通过每批动态计算的标量。这被认为是使模型学习尺度不变性。为了进一步限制信号幅度,它们还将逐像素特征向量归一化为生成器中的单位长度。**这防止了特征地图的升级,同时不会显著恶化结果。**附带的视频可能有助于理解设计选择。官方代码发布在 TensorFlow 这里

TL;DR:结果和讨论

结果可总结如下:

1)网络容量的逐渐增加解释了收敛速度的提高**。**直觉上,现有的层学习较低的尺度,因此在过渡之后,引入的层仅负责通过逐渐变小的尺度效果来改进表示。

2)渐进增长的加速随着输出分辨率的增加而增加。这使得第一次能够生成 1024x1024 的清晰图像。

3)即使实现这样的架构真的很难,并且缺少很多培训细节(即何时进行过渡以及为什么),但它仍然是我个人崇拜的不可思议的作品。

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

GANs 渐进生长图像,百万像素分辨率,链接:https://arxiv.org/abs/1710.10196

结论

在这篇文章中,我们遇到了一些至今仍在使用的最先进的训练理念。我们关注这些重要培训方面的原因是为了能够进一步展示更高级的应用程序。如果你想从游戏理论的角度来看甘斯,我们强烈建议你去看达斯卡拉基斯的谈话。最后,对于我们的数学爱好者来说,这里有一篇精彩的文章,它更详细地介绍了向 WGAN 的过渡。

总之,我们已经找到了几种方法来处理模式崩溃、大规模数据集和百万像素分辨率的增量训练。欲了解整个文章系列,请访问艾夏。

参考

[1]阿尔乔夫斯基,m .,钦塔拉,s .,&博图,L. (2017)。瓦瑟斯坦·甘。 arXiv 预印本 arXiv:1701.07875

[2]贝特洛博士、舒姆博士和梅斯博士(2017 年)。开始:边界平衡生成对抗网络。 arXiv 预印本 arXiv:1703.10717

[3]t . Karras,t . Aila,t . Laine,s .,& Lehtinen,J. (2017)。为了提高质量、稳定性和多样性而逐步种植甘蔗。 arXiv 预印本 arXiv:1710.10196

[4]达斯卡拉基斯,c .,a .,西尔格卡尼斯,v .,&曾,H. (2017)。乐观地训练甘斯arXiv 预印本 arXiv:1711.00141

[5]古尔拉贾尼、艾哈迈德、阿尔乔夫斯基、杜穆林和库维尔(2017 年)。改进了瓦瑟斯坦·甘斯的训练。在神经信息处理系统的进展(第 5767–5777 页)。

原载于 2020 年 4 月 21 日 https://theaisummer.com**T21

通过 Seaborn 和 Matplotlib 观看板球比赛

原文:https://towardsdatascience.com/watch-a-cricket-game-through-seaborn-and-matplotlib-7047c82b380?source=collection_archive---------41-----------------------

印度超级联赛 T20 板球比赛数据点的可视化——孟买印度人队对钦奈超级国王队

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

阿克什·亚达夫Unsplash 上的照片

现代板球比赛产生大量统计数据和用户生成的数据。教练和性能分析师利用这些信息为未来的比赛设计策略,并寻找新的人才。在本文中,我使用 Seaborn 和 Matplotlib 库可视化了最近结束的印度超级联赛(IPL) T20 比赛的数据。这个练习的动机是探索和理解各种数据点,并识别可能的机器学习用例的不同特征。

资料组

我使用了来自https://www.espncricinfo.com的公开数据进行 IPL 2020 赛季揭幕战——2020 年 9 月 19 日孟买印度人(MI) vs 钦奈超级国王(CSK) @阿布扎比。

更新:2020 年 12 月——这里使用的数据是我在 Kaggle 发布的综合数据集的一部分。请 参考这里的

为什么?

我是钦奈超级国王队的狂热粉丝,CSK vs 米是 IPL 中的激烈战斗,这两支球队在世界范围内都有大量的粉丝。这是 IPL 的“El Clásico”,IPL 的利物浦 vs 曼联,Dhoni 女士又名“Thala”&“酷队长”是 CSK 的杰拉德。

让我们来玩吧!

条形图、计数图和分布图

首先,让我们用柱状图和计数图来看看两个队的得分。

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

运行 per over-MI vs CSK(图片由作者提供)

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

赛跑的种类——米对 CSK(图片由作者提供)

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

运行分发(图片由作者提供)

前两个图显示了每场比赛的得分,接下来的两个图显示了每支球队得分的得分类型。计数图(跑垒次数)和分布图确实表明两局得分类型相似,只有很小的差异。然而,条形图(每回合得分)描绘了两局之间的重要对比。米在开始的几局力量比赛中表现抢眼,随后是几局下滑,而 CSK 的力量比赛令人不安,并在力量比赛结束时(6 局后)加快了速度,并保持稳定的速度,直到比赛结束。

线形图

下一组线图显示了游戏从开始到结束的过程(从超过 1 到 20)

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

游戏进度——米 vs(线条图——作者图片)

从这些情节中得出的主要结论是,尽管 CSK 的总得分直到比赛结束时都低于米,但随着比赛的进行,他们的得分率比米高得多,而米的得分率却在下降(这要归功于队长 MSD 指挥的 CSK 的精彩保龄球表演)。很明显,CSK 在生死关头加快了他们的得分速度(像往常一样!)并在最后经过 m1(如上面的第二和第三线图所示)

热图

让我们用热图来想象击球手和投球手的表现。

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

击球手 vs 投球手——米 vs(图片由作者提供)

小提琴情节

让我们看看每个击球手对特定保龄球攻击得分的分布。使用小提琴的节奏和旋转

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

击球手跑垒分布(图片由作者提供)

返回条形图

现在让我们看看每个击球手对特定保龄球攻击的总得分。步伐和旋转

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

击球手的跑位与保龄球的类型(图片由作者提供)

更多热图

下面的热图提供了 CSK 保龄球表现的详细直观表示。

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

CSK 保龄球线和长度(作者图片)

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

CSK 保龄球线和长度米击球手(图片由作者)

还有更多热图!

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

CSK 保龄球线和长度与击球(图片由作者提供)

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

保龄球手 vs 击球风格(作者图片)

散点图

散点图有助于了解谁在局的不同部分得分以及他们得分了多少分。正如我们在下面所看到的,MI 击球手在强力击球时得分更多,而 CSK 击球手在临近结束时得分更多。

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

随着比赛的进行,球队得分(图片由作者提供)

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

每局比赛中击球手的分数(图片由作者提供)

上面的散点图显示了安巴蒂·拉尤杜和 F 阿夫·杜·普莱西通过轮换击球来构建他们的局,承担计算好的风险来得分,以跟上游戏进行中所需的跑分率——这是他们建立的伟大合作关系的可视化。

词云

最后,让我们来看看游戏期间 www.espncricinfo.com 记分卡中显示的用户评论的词云表示。它很好地总结了这场比赛,公平地回应了公众的情绪

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

游戏过程中来自用户评论的文字云(图片由作者提供)

接下来呢?

观看 CSK 今年在 COVID 的情况下比赛是一种美妙的体验。甚至很高兴看到 MSD 领导这支伟大的球队,做他最擅长的事情。玩这些数据,帮助我在探索数据可视化和体育分析方面的同时,重温了这场伟大的比赛。可以做进一步的工作来开发数据集和建立机器学习模型,以预测影响游戏甚至游戏结果的各种数据点。更多即将推出…

我的 GitHub 链接到 Jupyter 笔记本

链接到数据集— Kaggle

参考资料:

https://www.espncricinfo.com—数据抓取

[## Matplotlib: Python 绘图— Matplotlib 3.3.2 文档

Matplotlib 是一个全面的库,用于在 Python 中创建静态、动画和交互式可视化…

matplotlib.org](https://matplotlib.org) [## 用户指南和教程— seaborn 0.11.0 文档

编辑描述

seaborn.pydata.org](https://seaborn.pydata.org/tutorial.html)

观看这个人工智能算法在一个在线游戏中击败玩家

原文:https://towardsdatascience.com/watch-this-ai-algorithm-beating-players-in-an-online-game-video-27fde513333e?source=collection_archive---------64-----------------------

艾玩拼图

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

这是代理在与其他玩家在线对战时“看到”的内容。

这是一篇三篇文章的最后一篇,在这篇文章中,我走过了这个 AI 算法的训练。随意退房:第一部第二部第三部

在训练过程中,代理通过与自己对抗,挑战自己的知识来学习如何玩游戏。以下是代理与其他玩家在线对战的结果:

为什么 AI 一直赢不了?

我想通过解释为什么经纪人会输给一些球员来说明最后一点。

简称 Agent,是一种通过深度强化学习训练的 AI 算法。代理能够击败一些球员,但不能击败其他人。看不到敌人何时“把代理人推到边缘”,迫使它不可避免地做出糟糕的举动。此外,有时代理人执行一个荒谬的行动,让对手得到很多分。

在训练过程中,代理通过与自己对抗,挑战自己的知识来学习如何玩游戏。请注意,这将产生一个不同的训练数据,而不是代理人为了训练而与人对弈的情况。总是有可能存在一个策略来对抗代理的策略。从理论上讲,如果代理被迫对训练中没有遇到的状态做出决策,它很可能会做出糟糕的决策。

“我们对强化学习问题的框架迫使我们满足于近似。然而,它也为我们提供了一些获得有用近似值的独特机会。例如,在逼近最优行为时,可能有许多状态,代理面临的概率如此之低,以至于为它们选择次优行动对代理接收的奖励量几乎没有影响。例如,Tesauro 的西洋双陆棋玩家具有非凡的技能,尽管它可能会在棋盘配置上做出非常糟糕的决定,而这种情况在与专家的游戏中从来不会发生。事实上,TD-Gammon 有可能在游戏的大部分状态设置中做出错误的决定。强化学习的在线性质使得有可能以这样的方式逼近最优策略,即以较少的努力用于不经常遇到的状态为代价,将更多的努力用于学习以便为经常遇到的状态做出好的决策。这是强化学习区别于其他近似求解 MDP 的方法的一个关键特性。”

—萨顿&巴尔托,《强化学习导论》,2018 年

简而言之,打败人工智能算法是可能的。也有可能训练出一种比我们现有的算法更接近无敌的算法。

伦理学

从其他玩家的角度来看,与人工智能算法比赛可能是一次令人生畏的经历。作为我的辩护,打败人工智能是可能的,就像我和其他玩家一样。因此,这并不像和我比赛那样令人畏惧,如果 AI 不在的话,他们会和我比赛。此外,游戏是在游戏内货币的赌注上进行的。正因为如此,赌注保持在很小的范围内,每次代理人赢了另一个玩家,赢得的钱会立即退还。

想了解更多信息吗?

这是一篇三篇文章的最后一篇,在这篇文章中,我走过了这个 AI 算法的训练。随意退房:第一部第二部第三部

关于我

我是一名数据科学家,住在旧金山。热衷于使用用户生成的数据。在 Linkedin 上找到我:mer sakar ya

沃森·奥塔伊

原文:https://towardsdatascience.com/watson-autoai-7fb1e82471ea?source=collection_archive---------50-----------------------

autoML 系列的第六部:蓝色巨人给人留下了互动进步的印象

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

图片由皮克斯拜的 Gerd Altmann 提供

惊讶!令人惊喜的是,这是 m autoML 系列的第六次安装。虽然我几年前使用过 IBM 的数据科学云平台,但我之前从未接触过 Watson Studio 或他们的 AutoAI 产品。我不确定我会找到什么,但我对我所看到的很满意。对于那些希望(需要)在训练过程中不断得到进度反馈的人来说,我喜欢所提供的大量信息。精确度不如 DataRobot 或 H2O 无人驾驶人工智能,但基于价格的巨大差异(每年数万美元),这是可以预期的。

为什么选择 IBM Watson Studio AutoAI?

蓝色巨人不仅仅是大型机和 SPSS。我几年前用过 IBM 数据科学云笔记本环境。沃森在 IBM 有一段传奇历史。虽然你没有运行“华生”,但声誉带来了权威。

成本

我可以免费进行这个实验。对于数据科学家个人来说,定价等级非常合理。

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

作者定价截图

设置

试试 IBM Watson Studio

“这些功能是针对 IBM Cloud 上的数据服务的完全托管的 Cloud Pak 初始集的一部分。立即免费提供 Watson Studio 和 Watson Machine Learning 的集成精简版,作为 Cloud Pak for Data as a Service 的一部分。”

上面的链接会带你到 Watson Studio 上的“尝试 AutoAI”按钮。AutoAI 是一个托管云解决方案,因此建立一个新项目的过程非常简单。

进入 Watson Studio 后,您可以添加一个 AutoAI 资产。

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

作者截图

从那里,你可以建立一个新的实验。

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

作者截图

数据

为了保持本系列中各种工具的平等性,我将坚持使用 Kaggle 培训文件。矛盾,我亲爱的华生。使用 TPUs 检测多语言文本中的矛盾和蕴涵。在这个入门竞赛中,我们将句子对(由一个前提和一个假设组成)分为三类——蕴涵、矛盾或中性。

6 列 x 13k+行—斯坦福 NLP 文档

  • 身份证明(identification)
  • 前提
  • 假设
  • 朗 abv
  • 语言
  • 标签

加载数据

再简单不过了。

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

作者截图

训练您的模型

配置和运行实验的界面非常简单。在实验设置下还有一些其他选项,但是我想尽可能简单地运行它。选择你的标签,点击运行实验。

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

作者截图

这就是乐趣所在!有一个互动的可视化,让你看到你在实验过程中的位置。我喜欢这个!您还可以在培训期间查看排行榜。

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

作者训练 gif

评估培训结果

有一个小指标表明实验已经完成。我本以为会有更引人注目的东西,但我很高兴它在合理的时间内完成,22 分钟。

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

作者截图

排行榜提供了关于准确性和其他成功指标的信息,以及模型类型和所做的改进(如功能工程)。我没有看到各种各样的模型尝试,因此培训时间很短。

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

作者截图

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

作者截图

对于 Pipeline 3,我研究了工程特性。你必须研究细节,因为‘new feature _ 2’不是很能说明问题。

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

作者截图

结论

有趣的是,在培训结束后,我看到一个弹出窗口,介绍对多个数据集的特征工程。肯定的,要调查的东西!如果他们能够识别数据集之间的关系,并创建新的功能,那将是惊人的。

总的来说,我很喜欢 Watson AutoAI 体验本身。这个过程运行得很快(22 分钟,而 H2O 无人驾驶人工智能的时间超过 4 小时),但代价是开箱即用的模型多样性和准确性。将需要额外的实验装置。但对于比 DataRobot 和 H2O 无人驾驶人工智能低 7.8 万美元的价格来说,这可能是一个可以接受的权衡。

我鼓励你考虑使用 AutoAI。这个 IBM 产品是一个价格合理的 autoML 工具。

如果您错过了本系列中的一篇文章,这里有链接。

[## AWS Sagemaker Studio 自动驾驶仪准备好迎接黄金时段了吗?

带有一些评论的自动驾驶界面演示

towardsdatascience.com](/is-aws-sagemaker-studio-autopilot-ready-for-prime-time-dcbca718bae7) [## 免费体验 Google autoML 表格

autoML 工具用户体验评论系列之二。

towardsdatascience.com](/experience-google-automl-tables-for-free-d5648ae3d0e5) [## Azure Automated ML 倾听他们的设计师

本 autoML 系列的第 3 部分,微软,绝地大师

towardsdatascience.com](/azure-automated-ml-listens-to-their-designers-7f1c68d19eb4) [## 数据机器人让生活变得简单

汽车系列之四——设计之美

towardsdatascience.com](/datarobot-makes-life-easy-8505637241e5) [## H2O 无人驾驶人工智能

autoML 系列的第五名—可视化和可解释性的第一名

towardsdatascience.com](/h2o-driverless-ai-71414b441425)

Wav2Lip:一个唇同步专家是你在野外进行语音到唇生成所需要的

原文:https://towardsdatascience.com/wav2lip-a-lip-sync-expert-is-all-you-need-for-speech-to-lip-generation-in-the-wild-b1cb48787190?source=collection_archive---------17-----------------------

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

Wav2Lip 模型架构(https://arxiv.org/pdf/2008.10010v1.pdf)

本文提出了 Wav2Lip,它是 SyncNet 模型的一种改进,在视频-音频唇形同步任务方面优于所有先前的与说话人无关的方法。

作者指出,虽然现有方法在呈现训练集中不存在的说话者的视频时通常不能通用化,但 Wav2Lip 能够对各种说话者产生准确的嘴唇运动。

他们继续总结了本文的主要意图:

  1. 识别先前方法不能推广到各种说话者的原因。
  2. 通过结合强大的唇同步鉴别器来解决所述问题。
  3. 提出新的基准来评估对口型任务的方法的性能。

介绍

作者的第一点是关于最近视频和音频内容消费的繁荣。除此之外,越来越需要将音像翻译成多种语言,以促进更多公众的参与。因此,将机器学习应用于诸如不受约束的视频-音频内容的自动口型同步这样的任务有很大的动机。

然而,不幸的是,早期的方法通常不能推广到多种说话人身份,只有在对组成其训练集的潜在说话人的小子集进行评估时才表现良好。

这种方法将不能满足上述实际应用的严格要求,其中合适的模式必须能够精确地同步各种扬声器。

由于在实践中使用这种方法的苛刻要求,人们需要一种可以推广到各种说话者身份的模型。结果,出现了与说话者无关的方法。这些模型在数千个说话者身份上被训练。然而,即使是在以前的出版物中采用的这些方法也不能满足本工作作者的期望。他们承认,先前的与说话者无关的模型虽然能够在单独的静态图像上生成准确的唇同步,但不适用于动态内容。对于诸如电视连续剧和电影的翻译的应用,要求一种方法对于不同的无约束视频中说话者的变化的唇形更具普遍性。

作者指出,人类可以检测到大约 0.05-0.1 秒不同步的视频片段,因此这意味着一个具有细微误差的广泛挑战。

本节最后简要总结了作者的贡献:

  1. 他们提出了 Wav2Lip ,这明显优于以前的方法。
  2. 他们引入了一套新的基准/指标来评估模型在这项任务中的表现。
  3. 他们发布自己的数据集,以评估他们的方法在呈现从野外采样的看不见的视频音频内容时的性能。
  4. Wav2Lip 是第一个与说话者无关的方法,它经常匹配真实同步视频的准确性;根据人类评估,他们的方法在大约 90%的情况下优于现有的方法。
  5. 他们将为配音视频生成同步视频帧的 FID 分数从 12.87 (LipGAN)提高到 11.84 (Wav2Lip + GAN),将平均用户偏好从 2.35% (LipGAN)提高到 60.2% (Wav2Lip + GAN)。

现有文献综述

(我将把这一部分限制在作者提及这些论文的原因上,而省略掉具体关于这些作品的方法的深入信息)

作者承认以前的方法和在现实世界中完全工作的方法的要求之间存在一些差异:

  1. 一些方法需要大量的训练数据。
  2. 该模型在词汇学习范围方面的局限性。
  3. 在具有有限词汇集的数据集上进行训练妨碍了现有方法学习各种音位-视位映射的能力。

他们继续争论为什么当呈现来自野外的看不见的视频内容时,先前的方法通常不能产生准确的唇同步:

  1. 像素级重建损失是对口型同步的弱判断:先前工作中包含的损失函数不足以惩罚不准确的口型同步生成。
  2. 弱唇同步鉴别器:Lip gan 模型架构中的鉴别器在检测不同步视频音频内容时只有 56%的准确率,而 Wav2Lip 的鉴别器在同一测试集上区分同步内容和不同步内容的准确率为 91%。

你只需要一个对口型专家

最后,作者提出了他们的方法,考虑到上述两个问题在以前的工作。

  • 使用预先训练的唇形同步鉴别器,该鉴别器在检测原始的、不受约束的样本中的不同步视频-音频内容方面已经是准确的。
  • 为此任务调整先前存在的 SyncNet 模型。(这个我就不深究了,我只强调一下 Wav2Lip 架构)。

Wav2Lip 模型架构概述

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

Wav2Lip 模型架构(【https://arxiv.org/pdf/2008.10010v1.pdf】T4)

术语

作者使用以下术语来指代他们网络的各个部分,我将在本节后面继续使用这些术语:

  • 随机参考片段:用于识别特定说话人的一段连续帧的随机样本,提供特定于前述说话人的身份的网络上下文。
  • 身份编码器:对基础真相帧和随机参考片段的连接进行编码,为网络提供可视上下文以适当适应任何特定的说话者。
  • 语音编码器:编码音频数据(不言自明)。
  • 人脸解码器:将串接的特征向量解码成一系列重构帧。

方法学

在高级别上,Wav2Lip 输入特定音频片段的 Mel-频谱图表示,以及对应的基本事实帧(下半部分被屏蔽)和随机参考片段的拼接,该随机参考片段的扬声器确认基本事实片段的扬声器。它通过卷积层减少这种输入,以形成音频和帧输入的特征向量。然后,它连接这些特征表示,通过一系列转置卷积层将结果矩阵投影到一段重建帧上。在身份编码器和面部解码器的层之间存在剩余的跳过连接。

Wav2Lip 试图从它们的屏蔽副本中完全重建地面真实帧。我们计算重建帧和地面真实帧之间的 L1 重建损失。然后,重构的帧通过预训练的“专家”唇形同步检测器馈送,而重构的帧和地面真实帧都通过视觉质量鉴别器馈送。视觉质量鉴别器试图区分重构帧和真实帧,以提高帧生成器的视觉生成质量。

损失函数

发电机

生成器旨在最小化重建帧 L g L_g Lg和地面真实帧 L G L_G LG之间的 L1 损耗:

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

其中,𝑵是普遍接受的表示批量的符号。

唇形同步鉴别器

对于唇同步,他们使用二进制交叉熵损失实现余弦相似性,从而计算给定两帧的概率。更具体地,在重新激活的视频和语音嵌入𝑣和𝑠.之间计算损失这会产生一个概率列表,每个样本一个,表示相应样本同步的概率。

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

其中应用的 ReLU 激活可以描述为:

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

完整的专家鉴别器损耗通过取分布 P s y n c P_{sync} Psync的交叉熵来计算,如下所示:

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

视觉质量鉴别器

视觉质量鉴别器被训练成最大化以下损失:

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

其中,发电机损耗 L g e n L_{gen} Lgen的计算公式如下:

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

因此,生成器试图最小化重建损失、同步损失和对抗损失的加权和(回想一下,我们正在处理两个鉴别器):

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

其中 s w s_w sw是表示归因于同步的惩罚的加权值,而 s g s_g sg是对抗性损失。

这两个不相交的鉴别器允许网络实现优越的同步精度和视觉生成质量。

结论和进一步阅读

这就是*“一个唇同步专家是你在野外进行语音到唇生成所需要的一切”*。如果您想阅读更深入的内容,或者关于我在这里没有谈到的一些事情:

  • 提议的度量/评估系统
  • Wav2Lip 和先前模型之间的基准比较
  • 作者使用的详细训练程序和超参数
  • Wav2Lip 的真实世界评估

你可以通过阅读报纸进一步调查:【https://arxiv.org/pdf/2008.10010v1.pdf

模型架构图片归功于的作者“一个唇同步专家是你在野外进行语音到唇生成所需要的一切”。

与 Python 相比,R 的优势何在

原文:https://towardsdatascience.com/ways-r-still-excels-compared-to-python-34835e6071ee?source=collection_archive---------24-----------------------

虽然 Python 和 R 曾经是数据科学的两大主流语言,但前者已经让后者黯然失色了一段时间。然而,R 似乎正在强势回归。

当查看 R 的 TIOBE 指数时,我们可以看到,在 2018 年 1 月达到收视率峰值后,该语言在该点后出现了明显的下降。然而,很明显,自 3 月份以来,收视率一直在回升。

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

资料来源:www.tiobe.com

这是什么原因呢?

其中一个重要原因是新冠肺炎激发了人们对统计学的强烈兴趣。

到目前为止,数据科学领域一直在回避这个领域,而倾向于更“性感”的话题,如自然语言处理、计算机视觉等。

然而,正在进行的疫情重新点燃了围绕统计分析在分析和最终抗击这种病毒中必须发挥的作用的辩论。

鉴于比较不同国家之间的统计数据的性质,人们对对数图表及其在比较不同尺度的数据时的用途特别感兴趣,如下文所示:

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

资料来源:twitter.com

因此,显而易见的是,如果想要快速进行有效的统计分析,就需要一个直观的统计环境来运行这些数字。证据表明 R 在这里仍然占优势。

然而,在我同时使用 Python 和 R 的经历中,以下是我关于后者如何仍然优于前者的经历。

1.在分析时间序列数据时,r 仍然可以胜过 Python

如果你以前做过时间序列分析,你很可能熟悉所谓的 ARIMA(自回归综合移动平均)模型

这是一种可用于根据时间序列的结构进行预测的模型。ARIMA 模型由坐标(p,d,q)组成:

  • p 代表自回归项的数量,即用于预测未来值的过去时间值的观测值的数量。例如,如果 p 的值是 2,那么这意味着序列中的两个先前的时间观察被用于预测未来趋势。
  • d 表示使时间序列稳定所需的差异数(即具有恒定均值、方差和自相关的时间序列)。例如,如果 d = 1,则意味着必须获得级数的一阶差分,才能将其转换为平稳的级数。
  • q 代表我们模型中之前预测误差的移动平均值,或者误差项的滞后值。例如,如果 q 的值为 1,那么这意味着我们在模型中有一个误差项的滞后值。

然而,R 和 Python 都允许基于最佳拟合自动选择这些坐标。这可以使用 R 中的 auto.arima 和 Python 中的金字塔来完成。金字塔中的 auto_arima 函数基于原始的 R 函数,即 R 是第一种能够自动选择 p,d,q 坐标的语言。

在另一篇文章(可从下面的参考资料部分获得)中,我比较了 R 和 Python 使用该函数预测天气数据的能力——R 显示出做出准确预测的能力明显更强,相对于实际情况,百分比误差低于 10%的预测数量超过了 70% 。在 Python 的例子中, 40% 的预测与实际相差在 10%以内。

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

资料来源:RStudio

2.回归分析

说到回归分析,与 Python 相比,R 可以使用更少的代码行来运行分析。

我们举个例子。假设我们正在运行一个回归来预测基于各种因素的股票回报,例如公司股息、收益和债转股。

现在,假设我们希望测试多重共线性,即测试是否有任何独立变量彼此显著相关,从而导致结果偏斜。回归( reg1 )运行如下。

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

现在,我们需要计算方差膨胀因子。计算方法如下:

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

然而,我们不需要在 r 中手动计算。相反,使用 car 库,VIF 函数可以如下调用:

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

VIF 统计数据远低于常用的阈值 510 ,这表明模型中不存在多重共线性

然而,使用 Python 的过程稍微复杂一些。

使用 sklearn 时,我们分别获取每个变量的 VIF。例如,让我们试着找出股息变量的 VIF 值。

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

在上述示例中,必须首先手动计算 R 平方统计量,然后只计算一个变量的 VIF 统计量:

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

我们已经获得了这一变量的 VIF,但还需要采取更多的步骤才能获得。此外,为了找到其他两个变量的 VIF 值,必须对每个变量重复这一过程。

从这个角度来看,在快速生成统计洞察时,R 仍然可以证明更加直观。

3.闪亮的直观统计分析

Python 中的 pyplotseaborn 等库在生成统计图方面已经变得相当流行。

然而,R 快速生成统计洞察的能力,加上闪亮的交互可视化能力,构成了一个强大的组合。

这是一个在 Shiny 中生成的累积二项式概率图的示例,通过它可以操纵左边的滑块(个体概率),以计算某一事件在指定次数的试验中发生的累积概率。

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

资料来源:RStudio

对于那些可能不擅长编写代码,但正在寻找一种有效的方法来操作统计数据和快速生成见解的人来说,这样的工具具有巨大的价值。此外,Shiny 本身就是一个非常直观的 R 包,并不难学!

这个闪亮的网络应用程序可以在下面的 GitHub 库中获得。

要操作该应用程序,只需:

  1. 下载存储库
  2. 点击 shiny web app 文件夹,打开 ui。R服务器。RStudio 中的 R 文件。
  3. 完成后,只需选择“运行应用程序”按钮,上面的应用程序将会显示:

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

资料来源:RStudio

结论

Python 擅长机器学习,在通用编程方面将继续主导 R。从技术上讲,R 不是一种编程语言——它是一种统计环境。

然而,统计学作为一个领域已经存在——因此 r 也是。

免责声明:本文是在“原样”的基础上编写的,没有任何担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

参考

评估回归模型的方法

原文:https://towardsdatascience.com/ways-to-evaluate-regression-models-77a3ff45ba70?source=collection_archive---------0-----------------------

评估模型最简单的方法是考虑 R 平方值。假设我得到 95%的 R 平方,这样够好了吗?通过这个博客,让我们试着了解评估你的回归模型的方法。

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

图片来源:Shravankumar Hiregoudar

评估指标;

  1. 预测的平均值/中值
  2. 预测的标准偏差
  3. 预测范围
  4. 决定系数(R2)
  5. 相对标准偏差/变异系数(RSD)
  6. 相对平方误差
  7. 平均绝对误差
  8. 相对绝对误差(RAE)
  9. 均方误差
  10. 预测均方根误差(RMSE/RMSEP)
  11. 归一化均方根误差(范数 RMSEP)
  12. 相对均方根误差

让我们考虑一个预测片剂中活性药物成分(API)浓度的例子。使用近红外光谱的吸光度单位,我们预测片剂中的 API 水平。片剂中的 API 浓度可以是 0.0、0.1、0.3、0.5、1.0、1.5、2.0、2.5、3.0。我们应用偏最小二乘法(PLS)和支持向量回归机(SVR)来预测 API 水平。

注意:指标可用于比较多个模型或一个模型与不同的模型

预测的平均值/中值

我们可以使用预测值的算术平均值来了解两个模型之间的预测偏差。

例如,API 为 0.5 的预测值的平均值是通过将 API 为 0.5 的预测值的总和除以 API 为 0.5 的样本总数来计算的。

np.mean(predictedArray)

在图 1 中,我们可以理解 PLS 和 SVR 如何执行 wrt 均值。SVR 比 PLS 更好地预测 0.0 API,而 PLS 比 SVR 更好地预测 3.0 API。我们可以根据对 API 级别的兴趣来选择模型。

缺点:均值受离群值影响。当预测值中有异常值时使用中位数

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

图 1 .比较两种模型预测值的平均值

预测的标准偏差

标准差(SD)是一组值的变化量或离差的度量。较低的标准差表示这些值倾向于接近集合的平均值(也称为期望值)。相反,高标准偏差表明这些值分布在更大的范围内。预测值的标准差有助于理解不同模型中值的离差。

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

标准差公式

np.std(predictedArray)

在图 2 中,SVR 中预测值的离差小于 PLS。因此,当我们考虑 SD 度量时,SVR 表现得更好。

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

图 1 .比较两种模型预测值的标准偏差

预测范围

预测的范围是预测值中的最大值和最小值。偶数范围有助于我们理解模型之间的离散度。

决定系数(R2)

r 平方(R2)是一种统计测量方法,表示由回归模型中的一个或多个自变量解释的因变量方差的比例。相关性解释了自变量和因变量之间的关系强度,而 R 平方解释了一个变量的方差在多大程度上解释了第二个变量的方差。因此,如果模型的 R2 是 0.50,那么大约一半的观察到的变化可以用模型的输入来解释。

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

r 平方公式

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

r(相关性)(资料来源:http://www.mathsisfun.com/data/correlation.html

from sklearn.metrics import r2_score
r2_score(Actual, Predicted)

缺点:R2 不考虑过度合身。 了解更多详情

相对标准偏差(RSD) /变异系数(CV)

有一种说法是,苹果不应该与桔子相比较,或者换句话说,不要比较实际上不可比较的两个或一组项目。但是,如果这两个项目或组别以某种方式标准化或放在同一尺度上,缺乏可比性是可以克服的。例如,当比较总体上非常不同的两组的方差时,例如蓝鳍金枪鱼和蓝鲸的大小的方差,变异系数(CV)是选择的方法:CV 简单地表示通过其组均值标准化的每个组的方差

变异系数(CV),也称为相对标准偏差(RSD),是概率分布或频率分布离差的标准化度量。它有助于我们理解两个不同测试中的数据是如何分布的

标准差是单个数据集可变性的最常见度量。但是为什么我们还需要另一个度量,比如变异系数?嗯,比较两个不同数据集的标准差是没有意义的,但是比较变异系数是有意义的。

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

变异系数公式

from scipy.stats import variation
variation(data)

例如,如果我们考虑两个不同的数据;

数据 1:平均值 1 = 120000 : SD1 = 2000

数据 2:均值 2 = 900000 : SD2 = 10000

让我们计算两个数据集的 CV

CV1 = SD1/平均值 1 = 1.6%

CV2 = SD2/均值 2 = 1.1%

我们可以得出结论,数据 1 比数据 2 更分散

相对平方误差

相对平方误差(RSE)是相对于使用简单预测器时的误差而言的。更具体地说,这个简单的预测值只是实际值的平均值。因此,相对平方误差采用总平方误差,并通过除以简单预测值的总平方误差对其进行归一化。可以在误差以不同单位测量的模型之间进行比较。

在数学上,单个模型 i 的相对平方误差 Ei 由以下等式评估:

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

相对平方误差公式

其中 P ( ij )是单个模型 i 对记录 j (来自 n 条记录)的预测值; Tj 是记录 j 的目标值, Tbar 由公式给出:

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

对于完美的拟合,分子等于 0 并且 Ei = 0。因此, Ei 指数的范围从 0 到无穷大,0 对应于理想值。

平均绝对误差

在统计学中,平均绝对误差(MAE)是表达同一现象的成对观察值之间误差的度量。 YX 的例子包括预测与观察、后续时间与初始时间的比较,以及一种测量技术与另一种测量技术的比较。它与原始数据具有相同的单位,并且它只能在以相同单位测量误差的模型之间进行比较。它的震级通常与 RMSE 相似,但略小一些。MAE 的计算公式为:

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

平均绝对误差公式

from sklearn.metrics import mean_absolute_error
mean_absolute_error(actual, predicted)

因此,它是绝对误差的算术平均值,其中 yi 是预测值,是实际值。注意,替代公式可以包括相对频率作为权重因子。平均绝对误差使用与被测数据相同的标度。这被称为依赖于尺度的精度度量,因此不能用于在使用不同尺度的系列之间进行比较。

注意:如你所见,所有的统计数据都是将真实值与估计值进行比较,但方式略有不同。它们都告诉你,你的估计值与真实值“有多远”。有时使用平方根,偶尔使用绝对值——这是因为使用平方根时,极值对结果的影响更大(参见 为什么在标准差中求差的平方而不是取绝对值? math overflow)。

在《梅和 RMSE》中,你只需查看这两个值之间的“平均差异”。因此,您将它们与您的变量规模进行比较(即,1 点的 MSE 是预测值与实际值之间 1 点的差异)。

在 RAE 和相对 RSE 中,您将这些差异除以实际值的变化,因此它们的范围从 0 到 1,如果您将该值乘以 100,您将获得 0-100 范围内的相似性(即百分比)。

∑(MeanofActual—actual)或∑|MeanofActual — actual|的值告诉您实际值与其平均值相差多少——因此您可以知道实际值与其自身相差多少(比较 方差 )。正因为如此,这些度量被命名为“相对的”——它们给出与实际规模相关的结果。

相对绝对误差(RAE)

相对绝对误差(RAE)是一种衡量预测模型性能的方法。不要将 RAE 与相对误差相混淆,相对误差是钟表、尺子或天平等仪器的精度或准确度的一般度量。它表示为一个比率,将平均误差(残差)与平凡或简单模型产生的误差进行比较。一个好的预测模型会产生一个接近于零的比率;一个差的模型(比简单模型更差的模型)会产生一个大于 1 的比率。

它与相对平方误差非常相似,因为它也与简单的预测值相关,而简单的预测值只是实际值的平均值。不过,在这种情况下,误差只是总绝对误差,而不是总平方误差。因此,相对绝对误差采用总绝对误差,并通过除以简单预测器的总绝对误差对其进行归一化。

在数学上,单个模型 i 的相对绝对误差 Ei 由以下等式评估:

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

相对绝对误差(RAE)公式

其中 P ( ij )是单个模型 i 对记录 j (来自 n 条记录)的预测值; Tj 是记录 j 的目标值, Tbar 由公式给出:

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

对于完美的拟合,分子等于 0 并且 Ei = 0。因此, Ei 指数的范围从 0 到无穷大,0 对应于理想值。

均方误差

估计量的均方误差(MSE)或均方偏差(MSD )(用于估计未观察到的量的过程)测量误差平方的平均值,即估计值和实际值之间的平均平方差。MSE 是一个风险函数,对应于平方误差损失的期望值。MSE 几乎总是严格为正(且不为零)的事实是因为随机性或者因为估计器没有考虑可以产生更精确估计的信息。

MSE 评估预测值(即,将任意输入映射到某个随机变量的样本值的函数)或估计值(即,将数据样本映射到从中采样数据的总体参数估计值的数学函数)的质量。根据描述的是预测值还是估计值,MSE 的定义是不同的。

MSE 是对估计量质量的一种度量,它总是非负的,值越接近零越好。

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

均方差(MSE)公式

from sklearn.metrics import mean_squared_error
mean_squared_error(actual, predicted)

我们来分析一下这个等式实际上是什么意思。

  • 在数学中,看起来像怪异 E 的字符被称为求和(希腊文 sigma)。它是一系列数字的总和,从 i=1 到 n。让我们把它想象成一个点的数组,我们遍历所有的点,从第一个(i=1)到最后一个(i=n)。
  • 对于每个点,我们取该点的 y 坐标和 y '-坐标。我们从 y '坐标值中减去 y 坐标值,并计算结果的平方。
  • 第三部分是取所有(y-y’)值之和,除以 n,这将给出平均值。

我们的目标是最小化这个平均值,这将为我们提供通过所有点的最佳直线。了解更多信息

预测均方根误差(RMSE / RMSEP)

在统计建模尤其是回归分析中,测量模型拟合质量的一种常用方法是 RMSE(也称为均方根偏差),由下式给出

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

RMSE 公式

from sklearn.metrics import mean_squared_error
mse = mean_squared_error(actual, predicted)
rmse = sqrt(mse)

其中,yi 是 y 的第 I 个观测值,是给定模型的预测 y 值。如果预测响应非常接近真实响应,RMSE 将会很小。如果预测的和真实的响应相差很大(至少对于某些观测来说), RMSE 将会很大。零值表示与数据完全吻合。由于 RMSE 是在与 y 相同的比例和单位下测量的,因此可以预计 68%的 y 值在 1 RMSE 以内-假设数据呈正态分布。

注:RMSE 关注的是与真实值的偏差,而 S 关注的是与平均值的偏差。

所以计算 MSE 有助于比较基于相同 y 观测值的不同模型。但是如果

  1. 人们想要比较不同响应变量的模型拟合?
  2. 响应变量 y 在某些模型中被修改,例如标准化或 sqrt-或 log-transformed?
  3. 并且将数据分成训练和测试数据集(在修改之后)以及基于测试数据的 RMSE 计算对点 1 有影响吗?第二。?

前两点是比较生态指标性能时的典型问题,而后者,即所谓的验证集方法*,在统计和机器学习中非常常见。克服这些障碍的一个解决方案是计算归一化 RMSE。*

归一化均方根误差(范数 RMSEP)

归一化 RMSE 有助于不同比例的数据集或模型之间的比较。然而,你会在文献中发现各种不同的 RMSE 归一化方法:

您可以通过以下方式进行标准化

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

如果响应变量很少有极值,选择四分位范围是一个好的选择,因为它对异常值不太敏感。

RRMSEP 标准差称为相对均方根误差

1/RRMSEP 也是一个度量。大于 2 的值被认为是好的。

还有一些主要用于化学计量学的术语,如预测的标准误差(SEP)和预测的标准误差与标准偏差之比(RPD)。

我希望这篇博客能帮助你理解评估你的回归模型的不同标准。我使用了多种资源来理解和撰写这篇文章。谢谢你的时间。

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

参考文献:

)(我)(们)(都)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(还)(不)(知)(道)(,)(我)(们)(们)(还)(不)(知)(道)(,)(我)(们)(们)(还)(不)(知)(道)(。

用实现处理分类数据的方法

原文:https://towardsdatascience.com/ways-to-handle-categorical-data-before-train-ml-models-with-implementation-ffc213dc84ec?source=collection_archive---------5-----------------------

使用 Python 实现了流行的技术

在我的上一篇博客中,我解释了类型的缺失值以及处理连续分类缺失值的不同方法和实现。

处理完数据集中的缺失值后,下一步是处理分类数据。在这篇博客中,我将解释处理分类特征/列的不同方法以及使用 python 的实现。

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

图片作者:altum code|Unsplash.com

**简介:**所有的机器学习模型都是某种需要数字进行运算的数学模型。分类数据有可能的值(类别),它可以是文本形式。比如性别:男/女/其他,职级:1/2/3 等。

在处理完数据集的缺失值后,在从事数据科学项目时。下一步工作是在应用任何 ML 模型之前处理数据集中的分类数据。

首先,让我们了解分类数据的类型:

  1. **标称数据:**标称数据称为 标注/命名为 数据。允许改变类别的顺序,顺序的改变不影响它的值。比如性别(男/女/其他)、年龄组(年轻/成年/年老)等。
  2. **序数数据:**离散地表示 ,有序地表示单位 。与名义数据相同,但有顺序/等级。不允许改变类别的顺序。比如排名:第一/第二/第三,学历:(高中/本科/研究生/博士)等。

处理分类特征的方法:

用来解释的数据集是 Titanic ( Kaggle dataset ):

import pandas as pd
import numpy as np
Data = pd.read_csv("train.csv")
Data.isnull().sum()

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

数据类型-对象是数据集中的分类要素。

  1. 制造假人

描述: 为对象/类别类型特征中的每个类别创建虚拟或二进制类型列。如果该类别在每行中可用,则该行的值为 1,否则为 0。使用 pandas get_dummies()函数创建虚拟模型。

实现:

DataDummies = pd.get_dummies(Data)
DataDummies

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

示例:乘客类别创建 3 个新列。

优点:

  • 易于使用和快速的方法来处理分类列值。

劣势:

  • 当数据有许多分类列时,get_dummies 方法没有用。
  • 如果类别列有许多类别,会导致向数据集中添加许多要素。

因此,这种方法仅在数据的分类列较少且类别较少时有用。

2。序数编码

描述: 当分类变量为序数时,最简单的方法是根据秩用某个序数替换每个标签/类别。在我们的数据中,Pclass 是具有值第一、第二、第三的顺序特征,因此每个类别分别由它的等级,即 1、2、3 代替。

实现:

步骤 1:创建一个字典,以关键字作为类别,以值作为等级。

第 2 步:创建一个新列,并用创建的字典映射 ordinal 列。

第三步:删除原来的列。

# 1\. 
PClassDict =   {   'First':1,
                    'Second':2,
                     'Third':3,              
                }# 2\. 
Data['Ordinal_Pclass'] = Data.Pclass.map(PClassDict)# Display result

      Data[['PassengerId', 'Pclass', 'Ordinal_Pclass']].head(10)# 3.Data = Data.drop('Pclass', axis = 1)

优点:

  • 处理数据集中序号要素的最简单方法。

缺点:

  • 不适用于数据集中的名义类型要素。

3。计数/频率编码

描述: 用类别在该列中出现频率/次数替换每个类别。

实现:

第一步。创建字典,以关键字作为类别名称,以类别计数作为值,即该类别在每个分类列中的频率。

第二步。创建一个新列,作为该类别的权重,并映射到相应的字典。

第三步。删除原始列。

# 1.Pclass_Dict = Data['Pclass'].value_counts()
Salutation_Dict = Data['Salutation'].value_counts()
Sex_Dict = Data['Sex'].value_counts()
Embarked_Dict = Data['Embarked'].value_counts()
Cabin_Serial_Dict = Data['Cabin_Serial'].value_counts()
Cabin_Dict = Data['Cabin'].value_counts()# 2.Data['Encoded_Pclass'] = Data['Pclass'].map(Pclass_Dict)
Data['Salutation_Dict'] = Data['Salutation'].map(Salutation_Dict)
Data['Sex_Dict'] = Data['Sex'].map(Sex_Dict)
Data['Embarked_Dict'] = Data['Embarked'].map(Embarked_Dict)
Data['Cabin_Serial_Dict'] = Data['Cabin_Serial'].map(Cabin_Serial_Dict)
Data['Cabin_Dict'] = Data['Cabin'].map(Cabin_Dict)# Display ResultData[['Pclass','Encoded_Pclass','Salutation','Salutation_Dict','Sex'       ,'Sex_Dict','Embarked','Embarked_Dict','Cabin_Serial','Cabin_Serial_Dict','Cabin','Cabin_Dict']].head(10)# 3\. 
Data = Data.drop(['Pclass','Salutation','Sex','Embarked','Cabin_Serial','Cabin'], axis = 1)

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

每个类别及其频率计数。

优点:

  • 向东实施。
  • 不增加任何额外的功能。

缺点:

  • 无法处理相同数量的类别,即向两个类别提供相同的值。

4。目标/导向编码

描述: 此处,列的类别已被替换为其相对于目标列的依赖连接概率排名。

实现: 显示我正在使用的关于幸存目标列的 Cabin 列的实现。相同的步骤适用于数据集中的任何顺序列。

第一步。用客舱名称的第一个字符替换原始客舱值。

第二步。基于目标列值计算每个类别的联合概率。

第三步。创建一个按连接概率升序排列索引的列表。

第四步。创建一个字典,其中键作为类别名,值作为联合概率排名。

第五步。创建一个新列,并使用字典联合概率排名映射客舱值。

第六步。删除原始客舱栏。

*# 1.*Data['Cabin'] = Data['Cabin'].astype(str).str[0]*# 2.*Data.groupby(['Cabin'])['Survived'].mean()*# 3.*Encoded_Lables = Data.groupby(['Cabin'])  ['Survived'].mean().sort_values().index*# 4.*Encoded_Lables_Ranks = { k:i for i, k in enumerate(Encoded_Lables, 0) }# 5.Data['Cabin_Encoded'] = Data['Cabin'].map(Encoded_Lables_Ranks)# 6.Data = Data.drop('Cabin', axis = 1)

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

具有相对于目标列的连接概率等级的客舱值。

优点:

  • 它不会影响数据量,即不会添加任何额外的功能。
  • 帮助机器学习模型更快地学习。

缺点:

  • 通常,均值或联合概率编码导致过拟合。
  • 因此,为了避免过度拟合,大多数时候需要交叉验证或其他方法。

5。平均编码

描述: 与目标/导向编码类似,唯一的区别是这里我们用目标列的平均值替换类别。在这里,我们还实现了与客舱和幸存目标列。

实现:

第一步。计算客舱列中每个类别相对于目标列(幸存)的平均值。

第二步。创建一个新列并替换为平均值,即使用其编码的平均值字典映射客舱列类别。

第三步。丢弃原始座舱立柱

# 1.Encoded_Mean_Dict = Data.groupby(['Cabin'])['Survived'].mean().to_dict()# 2.Data['Cabin_Mean_Encoded'] = Data['Cabin'].map(Encoded_Mean_Dict)# Display resultData[['Cabin','Cabin_Mean_Encoded']].head()# 3.Data = Data.drop('Cabin', axis = 1)

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

客舱类别及其相对于目标列的相应含义。

优点:

  • 捕获标签或类别中的信息,提供更多预测功能。
  • 在自变量和目标变量之间建立单调的关系。

缺点:

  • 可能会导致模型过拟合,为了克服这个问题,大多数时候使用交叉验证。

6。概率比编码

描述: 这里列的类别被替换为相对于目标变量的概率比。在这里,我使用船舱作为一个独立变量,其类别被替换为每个船舱中幸存人员与死亡人员的概率比。

实现:

第一步。用客舱名称的第一个字符替换原始客舱值。

第二步。找出在特定船舱中幸存的人的百分比(%),并存储到新的数据帧中。

第三步。在幸存概率数据框中创建一个新列,列出在特定船舱中死亡的概率。

第四步。在幸存概率数据框中再创建一个新列,即幸存概率与死亡概率之比。

第五步。创建一个带有概率比列的字典。

第六步。在数据中创建新列,并用其编码的概率比字典映射客舱列类别。

第七步。放下原来的座舱立柱。

#1\. Data['Cabin']  = Data['Cabin'].astype(str).str[0]# 2\. Probability_Survived = Data.groupby(['Cabin'])['Survived'].mean()
Probability_Survived = pd.DataFrame(Probability_Survived)# 3.Probability_Survived['Died'] = 1 - Probability_Survived['Survived']# 4.Probability_Survived['Prob_Ratio'] = Probability_Survived['Survived'] / Probability_Survived['Died']# 5.Encode_Prob_Ratio = Probability_Survived['Prob_Ratio'].to_dict()# 6.Data['Encode_Prob_Ratio'] = Data['Cabin'].map(Encode_Prob_Ratio)# Display resultData[['Cabin','Encode_Prob_Ratio']].head(10)# 7.Data = Data.drop('Cabin', axis = 1)

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

客舱类别及其相应的生存概率比。

优点:

  • 不增加任何额外的功能。
  • 捕捉标签或类别中的信息,从而创建更多预测功能。
  • 创建变量和目标之间的单调关系。所以它适用于线性模型。

缺点:

  • 分母为 0 时未定义。
  • 与上述两种方法相同,会导致过度拟合,为了避免和验证,通常会进行交叉验证。

结论:

因此,在这篇博客中,我试图解释在为机器学习准备数据时处理分类变量的最广泛使用的方法。实际代码笔记本可从https://github . com/GDhasade/medium . com _ Contents/blob/master/Handle _ categorial _ data . ipynb获得

欲了解更多信息,请访问http://contrib . sci kit-learn . org/category _ encoders/index . html

参考资料:

  1. Scikit-learn.org(2019)。sk learn . preprocessing . onehotencoder—scikit-learn 0.22 文档。[在线]可从以下网址获得:https://sci kit-learn . org/stable/modules/generated/sk learn . preprocessing . onehotencoder . html
  2. ‌contrib.scikit-learn.org(未标明)。类别编码器——类别编码器 2.2.2 文件。[在线]见:http://contrib . sci kit-learn . org/category _ encoders/index . html
  3. 克里斯·纳伊克(2019)。特征工程-如何对多分类变量进行一次热编码。YouTube 。可在:https://www.youtube.com/watch?v=6WDFfaYtN6s&list = plzotaelrmxvpwyge 2 pxd 3 x 0 bfknr0cjn&ab _ channel = KrishNaik【2020 年 9 月 10 日获取】。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值