TowardsDataScience 博客中文翻译 2020(四百八十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

深度学习如何入门

原文:https://towardsdatascience.com/how-to-get-started-with-deep-learning-1f4e9f9b221e?source=collection_archive---------22-----------------------

分四步走

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

JESHOOTS.COMUnsplash 上拍照

我最近向订阅我的电子邮件列表的人发出了一份调查,询问他们最感兴趣的学习内容。

关于86%的人说深度学习

这让我震惊。我知道深度学习是一个热门话题,但我不知道人们对学习更多有多大兴趣。

所以——我想如果我今天开始,我会写下我将如何开始学习深度学习。

深度学习专业化

不出所料,在我看来,最好的起点是吴恩达的深度学习专业化。

吴恩达在教学方面有着不可思议的天赋,他从基础开始,使用深度学习进行图像和文本处理,做得非常好。该专业的课程有:

  • 神经网络和深度学习
  • 改进深度神经网络
  • 构建机器学习项目
  • 卷积神经网络
  • 序列模型

我最喜欢他的方法是,他帮助你理解如何在进入更高级的架构之前改进和构建你的项目。我发现这种自下而上的方式对于初学者来说非常容易理解。这门课也很好地向你介绍了网络中注意力的概念,这对于最先进的架构来说是一个非常重要的概念。

在我看来,不利的一面是课程是在张量流中进行的。随着 TensorFlow 的改进,这并不是一个很大的缺点,但我更喜欢 PyTorch。我所做的,也是我建议你做的,是在 PyTorch 中做所有的功课。这不仅能让你接触到 TensorFlow 和 PyTorch 代码,还能确保你理解这些概念,因为你不会太依赖任何提供的代码。

面向编码人员的实用深度学习

杰瑞米·霍华德和雷切尔·托马斯做了很多工作,让深度学习变得更加平易近人。

他们采用我称之为自上而下的方法,从非常高的层次开始,并开始填充细节。如果你没有深度学习的经验,我实际上发现这种方法有点令人困惑。这就是为什么我建议你从吴恩达的课程开始。

你可能认为除了吴恩达的课程之外,这门课不值得上,因为它也是一门入门课,但是我发现教学风格和涉及的主题实际上相当不同。虽然你肯定会从安德鲁的课程中得到一些复习的科目,但我认为以不同的方式看待这些科目是非常有价值的。

本课程还将从非常实用的意义上讨论深度学习,重点放在他们在没有谷歌级计算的情况下将深度学习应用于现实世界问题时发现有价值的主题上。

该课程混合使用 PyTorch 和他们自己在 PyTorch 基础上构建的名为 fastai 的库。Fastai 是一个非常高级的库,只需几行代码就可以让您使用最佳实践和最先进的模型。虽然这很好,但我仍然更喜欢直接编写 PyTorch 代码,因为这将增加您对底层发生的事情的理解,并且不会太难。

如果你喜欢这门课程,你也可以考虑参加更高级的课程的第二部分。该课程基本上是带你了解他们是如何构建 fastai 库的,这需要你更深入地钻研代码和基础知识。

完成一篇论文

在这一点上,你应该对深度学习的基础有了真正坚实的掌握。

世界上最好的两位老师以两种不同的方式教你。

我认为人们通常在深度学习中出错的地方是他们没有花足够的时间真正理解基础知识。我甚至没有提到算法背后的数学。我说的是核心概念、构建模块和问题。如果你觉得你没有完全掌握前两门课的概念,那就回去复习。

如果你感觉良好,那就继续写论文吧。

这听起来可能很可怕,但几乎可以肯定没有你想象的那么可怕。事实上,我如此喜欢 PyTorch 的原因之一是,我发现我几乎可以从一篇论文中提取架构,使用 PyTorch 将其输入 Python,并且它可以工作。

我推荐的一份报纸是谷歌网。这篇论文有点老,所以它不会使用任何未知的构建模块,它写得很好,我不相信它在任何课程中都有很深入的涉及。

坐下来,阅读你选择的论文,这样你就能理解它,将其转换成代码,并将其应用于标准数据集,以确保你的实现是可行的。这不仅有助于你理解这篇论文,还能树立你的信心,从而无所畏惧地处理其他论文。

选择你自己的冒险

这个过程的最后一步是继续寻找新的论文并实施它们。深度学习作为一个领域发展如此之快,以至于为了保持在最先进的架构之上,你需要舒适地阅读和实现论文。

利用你在实施第一篇论文时建立的信心,不要害怕花时间坐下来消化论文。在我看来,那是继续学习的最好方法。你会发现,对于最有影响力的论文,其他人会写非常棒的博客文章来帮助你剖析论文。利用这些!

如果没有找到,那就看懂了再写一个!

然后,慢慢地,随着时间的推移,你将继续建立你的基础深度学习知识,直到你发现其他人认为你是专家,并对你的知识深度印象深刻。

因此,虽然这是一个需要时间的过程,但我相信这是一个能够全心全意成功完成的旅程。

这个故事也可以在这里找到。

有兴趣了解有关 Python 数据分析和可视化的更多信息吗?查看我的课程

如何使用 Python 开始使用 Google 文本到语音转换

原文:https://towardsdatascience.com/how-to-get-started-with-google-text-to-speech-using-python-485e43d1d544?source=collection_archive---------9-----------------------

语言模型设计

从零开始的文本到语音转换简介

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

来源:克里斯托弗·高尔在 unsplash 上拍摄的照片

在本文中,我们将介绍文本到语音翻译的基础知识。我将简单介绍一下文本到语音转换,然后我将介绍如何开始安装谷歌文本到语音转换(gTTS)模块。然后,我们将继续理解 gTTS 模块是如何工作的,并编写一个简单的程序来更好地掌握整体概念。我们还将探索更多关于使用这个模块还可以做什么的想法,然后尝试理解许多可以使用 gTTS 完成的真实用例。

**基本要求:**至少具备中等带宽的活跃互联网连接。这是因为我们将使用 Google API 进行文本到语音的翻译。

**注意:**这将是语言建模教程的第一部分。在这个教程系列中,我们将介绍如何使用谷歌文本到语音,光学字符识别,深度学习模型,如序列到序列模型,以及其他很酷的东西。

文本到语音转换简介:

文本到语音(TTS)是将单词转换成有声音频形式的过程。程序、工具或软件从用户处获取输入文本,并使用自然语言处理方法理解所用语言的语言学,并对文本执行逻辑推理。该处理后的文本被传递到下一个块,在该块中对处理后的文本执行数字信号处理。使用许多算法和变换,这个处理过的文本最终被转换成语音格式。这整个过程包括语音合成。下面是一个简单的框图,以了解相同的。

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

作者图片

这似乎是一个相当复杂的过程,但是由于 python 和 gTTS 模块,这个过程可以简化为几行代码。从框图中我们可以了解到,被传递的文本首先借助自然语言处理进行预处理,然后利用数字信号处理转换成语音。

事不宜迟,让我们动手做一些代码。

gTTS 模块的安装:

在本教程的剩余部分,我们将使用 python。如果你还没有安装 python,那么请在这里安装。

gTTS 模块的安装很简单,可以在命令提示符终端中使用以下命令来完成—

安装完成后,我们可以继续编写一个非常简单的程序来理解我们如何使用这个模块将我们输入的文本转换成语音输出。打开 python 文件,给它起一个自己选择的名字,并确保它以。py 格式。让我们看看这个程序—

gTTS (谷歌文本到语音)是一个 Python 库和 CLI 工具,用于与谷歌翻译文本到语音 API 接口。我们将从可用于语音翻译的 gtts 模块中导入 gTTS 库。

文本变量是一个用来存储用户输入的字符串。该文本可以由引号内您选择的任何内容替换。另一种方法是使用 input 语句,让用户在每次运行程序时键入自己想要的输入。这可以通过以下方式完成:

tts 变量用于对用户输入执行谷歌文本到语音翻译。转换后的文本输出以语音的形式存储在 tts 变量中。

tts.save 功能允许我们将转换后的语音保存为允许我们播放声音的格式。我把它保存在一个名为 hi 的文件中,格式为. mp3。wav 格式也可以。

我们已成功完成保存文件。现在有三种方法来运行这个文件。我将回顾完成这项任务的所有 3 种方法—

  1. 从文件夹中直接运行保存的文件:您可以在运行 python 程序的同一位置找到保存的文件,并且可以在那里访问它。
  2. 使用 os 模块:我们可以使用 python 的 OS 模块直接从程序中运行文件。这样做的命令如下。

3.使用 playsound 模块:playsound 模块可以通过一个简单的 pip install playsound 命令来安装,然后我们可以使用下面的命令继续播放文件中的音频。

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

马特·博茨福德在 Unsplash 上拍摄的照片

结论:

gTTS 模块可广泛用于其他语言,如法语、德语、印地语等。,也是。当存在沟通障碍,用户无法向他人传达信息时,这是非常有用的。文本到语音对视力受损的人或有其他残疾的人来说是一个很大的帮助,因为它可以通过帮助文本到语音的翻译来帮助他们。gTTS 模块也有许多可能的想法,它也可以用于其他语言。

有可能会有很多同样出色的项目。我将鼓励观众尝试更多地尝试这个模块。观众可以随意参考我以前做过的一个很酷的项目。在这个系列中,我们将看到如何使用深度学习来实现翻译,以及 gTTS 模块如何在这一过程中发挥作用。

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

马蒂亚斯·瓦格纳Unsplash 上拍摄的照片

我希望你们都喜欢这篇文章,并祝你们有美好的一天!

机器学习如何入门

原文:https://towardsdatascience.com/how-to-get-started-with-machine-learning-95d1159ac16f?source=collection_archive---------59-----------------------

机器学习可能会令人生畏,在线学习可能会令人不知所措,因为那里有大量的材料,大多数人不知道从哪里或如何开始。

在这篇文章中,我提出了一个自学机器学习的计划,这个计划对我认识的许多人都有效,包括我自己。同样重要的是要注意,没有放之四海而皆准的学习路径,因为每个人都是独一无二的,并且有不同的目标,这些目标会随着时间的推移而变化。把这个计划当作一个指导方针或者别人的经验,你可以调整它来适应你。

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

Artem Sapegin 在 Unsplash 上拍摄的照片

学习基础知识

如果你没有机器学习背后的基础数学和统计学,那么现在就建立一个是个好主意。即使你有数学背景,复习一下总是好的。这一步的努力程度由你决定。

开始学习机器学习背后的数学的最好方式之一是阅读一本书的旧时尚方式。在我看来,最好的书之一是哈斯蒂等人写的《统计学习导论》 。好消息是,多亏了南加州大学商学院,你可以免费下载。这是书的链接。当然,你也可以从亚马逊购买。

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

罗马魔术师Unsplash 上拍摄的照片

同一作者的另一本非常好的书是 统计学习的要素 。你可以通过这个链接免费下载这本书,感谢斯坦福大学。还有,你可以从亚马逊买。

如果你不是那种坐着看书的人,那么看视频对你来说是个不错的选择。来自加州理工学院(CalTech)的 Abu-Mostafa 博士有一个很棒的免费在线课程,吸引了 700 多万观众。他的课程 从数据中学习 是 18 节课,分为理论、技术和分析。所有的课都在 YouTube 上,这里是课程的链接。

谈到在线机器学习基础课程,有著名的斯坦福大学在 Coursera 上开设的吴恩达 课程。这是最常见的初学者课程。这是一个很容易学习的课程,有一些小测验,完成后你将获得一个 Coursera 证书,你可以在你的 Linkedin 个人资料上分享。

编程语言选择

虽然您可以使用任何编程语言来编写机器学习代码,但 Python 和 R 是最常用的语言。Python 和 R 里有那么多专门为机器学习打造的库和包。此外,你可以很容易地通过 StackOverflow 这样的网站找到社区支持。机器学习建议坚持用这两种语言。

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

照片由克里斯蒂娜@ wocintechchat.comUnsplash 上拍摄

但是,如果您不了解 Python 或 R,或者您需要复习一下,该怎么办呢?好消息是,有几门在线课程同时教授 Python 和 R,重点是机器学习。你可以参加一个以机器学习为重点的速成班,而不是花几个小时学习 Python 和 R 的语法。

我最喜欢的三门课程是Python A-Z:Python For Data Science with Real 习题Python For Data Science and Machine Learning boot camp,都是基于 Python 语言的。 R 编程 A-Z: R For Data Science with Real 习题,基于 R 语言。这些课程将向您介绍编程语言(Python 或 R ),并带您浏览机器学习所需的主要软件包以及如何使用它们。

动手机器学习课程

到目前为止,您已经学习了机器学习背后的数学知识,并在 Python 或 R 或者两者之间打下了坚实的基础。让我们将所有这些学习付诸行动,是时候参加一个在线课程,在那里你可以亲自编写代码来解决机器学习问题。

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

照片由克里斯里德Unsplash 拍摄

再说一遍,网上有大量的课程,所以做好你的研究,选择一个适合你的。我真正喜欢的课程之一是机器学习 A-Z:数据科学中的动手 Python & R。我喜欢这门课程的原因是,每一部分都分为 3 个部分,首先,讲师解释理论并提出一个要解决的问题,其次,讲师使用 Python 代码解决这个机器学习问题,最后再次使用 R 代码解决相同的机器学习问题。所以不管你是用 Python 还是 R 编程都没关系,因为这门课教你用两者来解决机器学习问题。我喜欢的另一个实践课程是机器学习、数据科学和使用 Python 的深度学习,大量的理论和机器学习实践编码练习。

做一些机器学习项目

在这一步,你在机器学习和 Python 或 r 方面有很强的基础,让你的技能更上一层楼的最好方法就是做一些真实的项目。进入 Kaggle 的竞赛页面,您可以从查看已完成的竞赛开始,并按照随附的笔记本进行操作。无论你对自己的技能是否有信心,我都强烈建议你参加一个积极的竞赛。在我看来,加入任何积极的竞争都是最好的学习方式。

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

KOBU 社Unsplash 上拍摄的照片

如果你是那种想要参加课程并解决一些现实世界机器学习问题的人,那么我推荐机器学习实践锻炼| 8 个现实世界项目。这是一门实践课,我发现它非常有用,可以将你的机器学习技能运用到工作中。

获得证书

现在是时候获得证书并将其放入您的 LinkedIn 个人资料中了。你希望你的同事、招聘人员和潜在雇主了解你的机器学习技能。

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

照片由蒂姆·莫斯霍尔德Unsplash 上拍摄

再说一次,这是我的个人观点,你的研究也是如此。我相信最好的机器学习证书是 AWS 机器学习专业。你必须了解基本的 AWS 云才能开始学习这个证书,这是一个很难获得的证书,需要大量的准备。我前阵子写了一篇文章,讲的是通过 AWS 机器学习认证考试需要了解的 5 个主要概念

你可以获得的另一个有价值的证书是 Udacity 的纳米学位机器学习项目。Udacity 与 AWS 和 Azure 合作,提供面向这些云提供商的机器学习计划。检查 AWS-Udacity 机器学习程序Azure-Udacity 机器学习程序。这些是为期数月的课程,教你机器学习和 AWS 或 Azure 云基础知识。

最后,我在下表中总结了前面描述的学习路径。

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

提议的学习路径

这对我和一些同事很有效,我把它放在这里作为你的参考指南。根据你的目标、需求和可用时间来设计你自己的学习计划是非常重要的。对一个人有用的东西对另一个人可能有用也可能没用,我们都是独一无二的,但是互相学习,看看什么有用,什么没用是很好的。祝你的机器学习之旅好运,这是一个艰难但非常值得的旅程。

如何开始 ML 重现性挑战 2020

原文:https://towardsdatascience.com/how-to-get-started-with-ml-reproducibility-challenge-2020-65008aa07cd7?source=collection_archive---------43-----------------------

本文的合著者:Ananya Harsh Jha 和 Eden Afek

免责声明: 所有作者均为 PyTorch 闪电队成员

了解如何在 PyTorch 闪电研究工具箱的帮助下,帮助缓解深度学习可重复性危机,同时提高您的技能。

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

灵感来自 v1 @ NeurIPS 2018

什么是再现性,为什么要关注再现性

复制实验结果的能力是任何科学领域的核心基础。然而,结果的可重复性一直困扰着整个机器学习领域,在很多情况下,它严重依赖于随机优化,而不能保证收敛。在深度学习中,重复性的关键往往在于最微小的细节,许多作者没有提到最关键的参数或训练程序,这些参数或训练程序使他们获得了最先进的结果。

可重复性不仅对于确定新的研究领域很重要,而且对于使它们更容易解释也很重要,这在我们试图用这种算法代替人类决策时至关重要。标准化提交的再现性并不一定意味着复制发表在主要论文中的精确结果,而是为其他研究人员提供指导,以根据他们自己的任务和计算能力得出论文中提出的相同结论。

再现性挑战

为了缓解这个问题,在 2017 年 ICML 机器学习研讨会的初始再现性之后,Joelle Pineau 博士和她的同事在 2018 年 ICLR 开始了第一个版本的再现性挑战。这项挑战的主要目标是鼓励人们复制 ICLR 2018 年提交的结果,这些论文可以在 OpenReview 上随时获得。随后是 2019 年 ICLR 挑战赛的第二版,以及 2019 年 NeurIPS 的第三版,通过 OpenReview 可以获得被接受的论文。

在论文“改善机器学习研究中的再现性】中,Pineau 等人列出了机器学习中再现性差距的原因:

  • 无法获得相同的培训数据/数据分布不同
  • 模型或培训程序的规格错误或规格不足
  • 缺少运行实验所需的代码或代码错误
  • 用于报告结果的指标不规范
  • 不恰当地使用统计数据来分析结果,例如在没有进行恰当的统计测试的情况下声称具有显著性,或者使用错误的统计测试
  • 选择性报告结果或忽略适应性过度拟合的危险
  • 对结果的过度宣称,超出了提出的证据(即实验数量不足,或者假设和宣称不匹配)

Pineau 博士还发布了再现性清单:

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

2.0 @ neu IPS 2020

该清单的目的是为作者和审稿人提供指南,说明提交给这些会议的结果的预期重现性标准。

ML 再现性挑战 2020

今年, ML 再现性挑战扩大了范围,涵盖了 2020 年横跨机器学习、自然语言处理和计算机视觉的 7 个顶级人工智能会议:NeurIPS、ICML、ICLR、ACL、EMNLP、CVPR 和 ECCV。挑战对每个人开放,你需要做的就是从列表中选择并声明一篇已发表的论文,并尝试复制其核心声明。

目的是评估原始论文中得出的结论是否可重现;对于许多论文来说,完全复制所展示的结果是不可能的,因此本次挑战的重点是遵循论文中描述的过程,并尝试得出相同的结论。

杰西·道奇作为教育工具的再现性挑战

闪电再现性

显然,复制结果的一些障碍取决于研究科学家组织他们的项目的方式,然而对于其他人,你可以使用 PyTorch Lightning 来缩小这种差距。

PyTorch Lightning 的创造者和核心贡献者一直是机器学习和深度学习研究中可复制性的倡导者。事实上,NeurIPS 2019 上的再现性挑战的 v3 正式推荐使用 PyTorch Lightning 提交挑战。

Lightning 的主要理念是将工程与研究分离,从而使代码更具可读性。我们在 Lightning 的团队努力提供一种编写深度学习知识库的标准,让任何人都更容易知道你的代码在做什么,以及研究的有趣部分在哪里。

为了使研究更具可重复性,我们创建了 PyTorch 闪电,这是我们最先进的模型、数据模块和模型组件的工具箱。Bolts 的想法是让你能够在预先构建的组件上开始你的项目,并快速迭代你的研究,而不是担心如何设置项目或试图复制以前发布的结果。

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

作者图片

例如,如果您正致力于改进标准的 ImageGPT,只需对现有的实现进行子类化,并开始您令人敬畏的新研究:

作者图片

1.数据

如果您的工作涉及一些用于研究的标准数据集,请利用可用的 LightningDataModules ,并使用种子值来指定您进行实验的确切分割!

DataModule 封装了 PyTorch 中数据处理涉及的五个步骤:

  1. 下载/令牌化/处理。
  2. 清理并(可能)保存到磁盘。
  3. [Dataset](https://pytorch.org/docs/stable/data.html#torch.utils.data.Dataset)内装载。
  4. 应用变换(旋转、标记化等)。
  5. 包在一个[DataLoader](https://pytorch.org/docs/stable/data.html#torch.utils.data.DataLoader)里面。

这个类可以在任何地方共享和使用:

作者图片

在 Bolts 中,您可以找到以下实现:

2.模型检查点

Lightning 提供自动检查点,因此您可以随时恢复训练。当您使用 PyTorch Lightning 创建和保存模型时,我们会自动保存 Lightning 模块中定义的超参数。该检查点还包括优化器、LR 调度器、回调和其他任何需要的东西,以完美地重建您刚刚运行的实验的结果,从而发布一个新的艺术状态!

作者图片

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

我们的模型检查点不仅仅包含 state_dict!图片作者。

阅读更多关于检查点的信息。

3.预先训练的重量和实验记录

对于 Bolts,我们提供了一组预先训练好的重量以及用于实现某个结果的实验日志。我们提供经过验证的结果,因此您可以为您希望复制的不同论文提供一个经过测试的起点,而不是花费时间试图从一篇论文中复制一个声明。在接下来的几个月里,我们将努力在 Bolts 中添加更多的模型检查点和可复制的结果。

下面,我们展示了 CIFAR-10 上的 SimCLR 预训练实验的结果,这些结果是我们基于原始论文复制的。

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

该表概述了螺栓中存在的模型所实现的结果!图片作者。

这是来自 Bolts 文档的日志的一个例子,在这种情况下,它代表了在自我监督学习模型被预训练之后的微调过程。通过数据模块中的种子分割,任何人都可以复制我们在这里展示的相同结果!

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

作者图片

这些文档还包含我们得出结果所使用的精确超参数。

作者图片

祝你好运!

参加再现性挑战是加深你在深度学习中的知识的一个很好的方式,也是对整个科学界的贡献。我们邀请大家参与并考虑将您的模型贡献给 bolts 以增加可见性,并根据我们强大的测试套件对其进行测试。如果你想提问、反馈或寻找合作者,请查看我们的休闲频道

编码快乐!

如何在两周内开始使用 Spark NLP 第一部分

原文:https://towardsdatascience.com/how-to-get-started-with-sparknlp-in-2-weeks-cb47b2ba994d?source=collection_archive---------29-----------------------

良好的开端是成功的一半……

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

摄影:鲍里斯拉夫·克鲁采夫

如果您想在企业 NLP 中有一个良好的开端,但是对 Spark 毫无头绪,那么这篇文章就是为您准备的。我见过许多同事想要进入这个领域,但是由于 Spark 带来的初始学习开销而灰心丧气。乍一看,这似乎并不明显,因为 Spark 代码与常规的 Python 脚本有些不同。然而,Spark 和 Spark NLP 基础并不难学。如果你理所当然地接受这个断言,我将向你展示基础是多么简单,并将提供一个路线图来为学习关键元素铺平道路,这将满足中级从业者的大多数用例。由于 Spark NLP 管道所带来的无可挑剔的模块化,对于一个普通的学习者来说,记住我的话,两周的时间足以构建基本的模型。卷起袖子,我们开始吧!

为什么 Spark NLP?
供需就是答案:是企业使用最广泛的库!这里有几个原因。如今常见的 NLP 包是由学者设计的,他们更喜欢原型的简易性,而不是运行时性能、可伸缩性、错误处理、目标节约内存消耗和代码重用。虽然一些像“工业级 NLP 库— spaCy”这样的库可能被认为是一个例外(因为它们被设计成完成事情而不是进行研究),但当涉及到处理大量数据时,它们可能达不到企业目标。

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

无法方便地使用为研究和小规模任务设计的工具

这里我们将有 一个不同的策略 。我们将使用基本库来温习“基础知识”,然后直接跳到企业领域,而不是按常规随大流。我们的最终目标是通过建设大陆管道来瞄准利基市场,这是不可能用标准库解决的,尽管它们的容量在他们的联盟中。

如果你还不相信,请阅读这篇关于基准测试和与 spaCy 比较的文章,它会给你五个开始使用 Spark NLP 的好理由。首先,Spark NLP 具有与生俱来的特性可伸缩性它继承了 Spark,Spark 主要用于分布式应用,它被设计成可伸缩性。Spark NLP 从中受益,因为它可以在任何 Spark 集群以及内部和任何云提供商上扩展。此外,Spark NLP 优化的方式使得它的运行速度比传统库的固有设计限制要快个数量级。它提供了注释器的概念,并且包含了比其他 NLP 库更多的内容。它包括句子检测、标记化、词干化、词条化、词性标注、NER、依存解析、文本匹配器、日期匹配器、组块、上下文感知拼写检查、情感检测器、预训练模型,以及根据学术同行评审结果具有非常高准确度的训练模型。Spark NLP 还包括用于命名实体识别的 BERT 嵌入的生产就绪实现。例如,与 spaCy 相比,它在 NER 上犯的错误要少得多,我们在本文的第二部分测试了 spaCy。此外,值得注意的是,Spark NLP 包括提供完整 Python API 的功能,支持 GPU、用户定义的深度学习网络、Spark 和 Hadoop 上的培训。

该库提供了 BERT 嵌入的生产就绪实现,并使用迁移学习进行数据提取。迁移学习是一种高效的提取数据的方法,甚至可以利用少量的数据。因此,没有必要收集大量数据来训练 SOTA 模型。

此外,John Snow labs Slack channel 提供了有益的顶级支持,因为开发人员和新学习者倾向于团结在一起,创建每个人都可以从中受益的资源。你将从开发者那里得到你的问题的答案。我去过那里几次,可以证明他们的反应迅速而准确。此外,任何发现自己陷入困境的人都可以通过堆栈溢出或类似平台快速获得有类似问题的人的帮助。

关于 Spark 的著名“事实”是错误的

  • Spark 是集群计算,所以它不能在本地机器上运行

不对!你可以在你的本地机器上运行 Spark,每个 CPU 核心都会用到核心!这就是 Spark NLP 运行时的样子:

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

Spark NLP 正在运行…我为所有这些 CPU 内核支付了费用,我很高兴看到它们都在运行。

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

虽然可以使用 Joblib 进行多重处理,但这是 spaCy 进程的典型情况。

更重要的是,你可以在 GPU 上运行 Spark。

  • Spark 又是一门需要学习的语言!

好吧,如果你了解 SQL,PySpark 和 Spark NLP 根本不会让人觉得是另一种语言。SQL 和 Regex 本身都是语言,但是学习它们的基础知识并不难,对吗?

  • Spark 是为大数据打造的,所以 Spark NLP 只对大数据有好处。

是的,Spark 内部使用了大量开销,但是 Spark NLP 为较小的数据集引入了一个“轻管道”。

起初,Spark 似乎是另一种具有挑战性的语言。Spark 不是最容易理解的库,但是我们将在 NLP 领域中做的事情已经在 Spark NLP 的基础设施中被巧妙的处理了,该基础设施由一个简单的 API 提供,可以很容易地与它交互。

虽然熊猫是数据科学家工具箱中最锋利的铅笔之一,但它只使用一个 CPU 内核,本质上,它的速度不够快,也不够强大,无法处理更大的数据集。Spark 被设计成使用集群计算来克服这些缺陷,你甚至可以在你的本地机器上运行它,分配任意多的 CPU 核心!遗憾的是,即使在本地机器上运行,pip install Pyspark 也不足以设置好,必须在 PC 和 Mac 上安装一系列的依赖项。对于那些想尽快投入行动的人,我推荐使用 Google Colab。

1)在 Mac 或 Linux 上设置使用 Spark NLP,必须安装 Apache Spark 版本 2.4.3 和更高版本。假设你还没有安装 Apache Spark,我们先从 Java 安装开始。只需进入官网并从*“Java SE 开发套件 8u 191”*,安装 JDK 8 。必要的命令行脚本可以在这里找到。

2)在 PC 上设置 Spark 可能有点棘手。试过很多方法后,我发现这篇文章是唯一有效的。还包括一段清晰简洁的视频。除了提供的文档,这个博客页面也帮助了我。

  1. *除非你必须在本地机器上运行 Spark,否则开始使用 PySpark 最简单的方法就是使用 Google Colab。*由于它本质上是一个运行在谷歌服务器上的 Jupyter 笔记本,所以你不需要在我们的系统中本地安装任何东西。

要在 Colab 中运行 spark,首先,我们需要安装 Colab 环境中的所有依赖项,如 Apache Spark 2.3.2 with Hadoop 2.7、Java 8 和 Findspark,以便在系统中定位 Spark。详情请参见这篇文章

**import** **os***# Install java*
! apt-get install -y openjdk-8-jdk-headless -qq > /dev/null
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["PATH"] = os.environ["JAVA_HOME"] + "/bin:" + os.environ["PATH"]
! java -version*# Install pyspark*
! pip install --ignore-installed -q pyspark==2.4.4*# Install Spark NLP*
! pip install --ignore-installed -q spark-nlp==2.4.5

对于不想在 Colab 上运行笔记本的 PC 用户,我推荐在双引导 Linux 系统上安装 Spark NLP,或者使用 WSL 2 ,然而,这篇基准测试文章反映了 WSL 2 的一些性能损失。更准确地说,我在双启动 Ubuntu 20.04 安装后获得了我最好的 Spark NLP 体验。

第 2 天:Spark 基础知识、RDD 结构和使用 Spark 的 NLP 婴儿步骤

如前所述,Apache Spark 是一个分布式集群计算框架,对于大型数据集来说非常高效,它使用内存计算来进行闪电般的数据处理。对于在磁盘上运行的复杂应用程序,它也被认为比 MapReduce 更高效。

虽然像 pandas 这样的库足以满足大多数日常操作,但由于 容量、多样性和速度,大数据需要集群计算框架,这是大数据的三个定义属性或维度。

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

Spark 的核心是 Spark 核心——整个项目的基础,其余的 Spark 库都是在它的基础上构建的。Spark SQL 允许您使用 SQL 或熟悉的 DataFrame API 查询 Spark 程序中的结构化数据。

MLlib 适合于 Spark 的 API,并在 Python 和 R 库中与 NumPy 互操作。您可以使用任何 Hadoop 数据源,从而轻松插入 Hadoop 工作流。Spark 擅长迭代计算,使 MLlib 能够快速运行——比 MapReduce 快 100 倍。

Spark Mllib 包含构建在 rdd 之上的遗留 API。虽然我发现作为 Python 实践者,Spark Mllib 和 RDD 结构更容易使用,但是从 Spark 2.0 开始,Spark 中基于 RDD 的 API。MLlib 包已进入维护模式。Spark 的主要机器学习 API 现在是 Spark ML 包中基于数据帧的 API。

转换创建新的 rdd 和操作来执行计算。Lambda、Map 和 Filter 是一些基本功能。真实数据集通常是键、值对,类似于 Python 字典,但表示为元组。请观察下面创建二元模型和字数的代码,看看它与 Python 代码有多相似。我强烈推荐这门课程了解更多详情。

import resentences = sc.textFile(“ulyses.txt”) \
 .glom() \
 .map(lambda x: “ “.join(x)) \
 .flatMap(lambda x: x.split(“.”)).map(lambda x: re.sub(‘[^a-zA-Z\s]’,’’,x))bigrams = sentences.map(lambda x:x.split()) \
 .flatMap(lambda x: [((x[i],x[i+1]),1) for i in range(0,len(x)-1) \
 if all([x[i].lower() not in stop_words,x[i+1].lower() not in stop_words])])freq_bigrams = bigrams.reduceByKey(lambda x,y:x+y) \
 .map(lambda x:(x[1],x[0])) \
 .sortByKey(False)In [1]:freq_bigrams.take(10)Out[1]:(1, ('Author', 'James')),
       (1, ('Joyce', 'Release')),
       (1, ('EBook', 'Last')),
       (1, ('Last', 'Updated')),
       (1, ('December', 'Language')),
       (1, ('English', 'Character')),
       (1, ('Character', 'set')),
       (1, ('set', 'encoding')),
       (1, ('UTF', 'START')),
       (1, ('II', 'III'))]
# word count exampletext_file = sc.textFile(“example_text1.txt”)
counts_rdd = text_file.flatMap(lambda line: line.split(“ “)) \
 .map(lambda word: (word, 1)) \
 .reduceByKey(lambda a, b: a + b)# print the word frequencies in descending ordercounts_rdd.map(lambda x: (x[1], x[0])) \
 .sortByKey(ascending=False)\
 .collect()[:10]

输出

Out [3]: [(988, 'the'),
          (693, 'and'),
          (623, 'of'),
          (604, 'to'),
          (513, 'I'),
          (450, 'a'),
          (441, 'my'),
          (387, 'in'),
          (378, 'HAMLET'),
          (356, 'you')]

第 3/4 天:Pyspark 的特征工程/清洁数据

Spark ML 提供构建在数据帧之上的更高级 API,用于构建 ML 管道,标准化机器学习算法的 API,从而更容易将多种算法结合到单个工作流中。这里我们将介绍 Spark ML API 引入的关键概念。

机器学习步骤可以应用到 from Spark SQL,在统一的数据集概念下支持多种数据类型。可以从常规的RDD中隐式或显式地创建一个SchemaRDD

一个[Transformer](https://spark.apache.org/docs/1.2.2/api/scala/index.html#org.apache.spark.ml.Transformer)是一个抽象,包括特性转换器和学习模型,实现一个方法transform(),将一个SchemaRDD转换成另一个【】,通常通过附加一个或多个列。

An [Estimator](https://spark.apache.org/docs/1.2.2/api/scala/index.html#org.apache.spark.ml.Estimator)抽象了学习算法或任何适合或训练数据的算法的概念,实现了接受一个SchemaRDD并产生一个Transformer的方法fit()。比如LogisticRegression这样的学习算法是一个Estimator,调用fit()训练一个LogisticRegressionModel,是一个Transformer

在机器学习中,通常运行一系列算法来处理和学习数据,例如将每个文档文本分割成单词,将单词转换成数字特征向量,以及使用特征向量和标签来训练预测模型。Spark ML 表示像[Pipeline](https://spark.apache.org/docs/1.2.2/api/scala/index.html#org.apache.spark.ml.Pipeline)s这样的工作流,它由一系列按照特定顺序运行的TransformersEstimators组成,分别调用transform()fit()方法,产生一个Transformer(它成为PipelineModel的一部分,或者被拟合为Pipeline),并且在数据集上调用Transformertransform()方法。

一个Pipeline就是一个Estimator。因此,在一个Pipelinefit()方法运行之后,它会产生一个PipelineModel,也就是一个Transformer。一旦在测试数据集上调用了PipelineModeltransform()方法,数据就按顺序通过Pipeline,随着每个阶段的transform()方法更新数据集并将其传递给下一个阶段,数据集也随之更新。

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

PipelineModel帮助确保训练和测试数据经过相同的特征处理步骤。下面是一个管道模型的例子。请注意,数据预处理是在熊猫数据框架上进行的。

#define regex pattern for preprocessing
pat1 = r’@[A-Za-z0–9_]+’
pat2 = r’https?://[^ ]+’
combined_pat = r’|’.join((pat1,pat2))
www_pat = r’[www.[](http://www.[)^ ]+’
negations_dic = {“isn’t”:”is not”, “aren’t”:”are not”, “wasn’t”:”was not”, “weren’t”:”were not”,
 “haven’t”:”have not”,”hasn’t”:”has not”,”hadn’t”:”had not”,”won’t”:”will not”,
 “wouldn’t”:”would not”, “don’t”:”do not”, “doesn’t”:”does not”,”didn’t”:”did not”,
 “can’t”:”can not”,”couldn’t”:”could not”,”shouldn’t”:”should not”,”mightn’t”:”might not”,
 “mustn’t”:”must not”}
neg_pattern = re.compile(r’\b(‘ + ‘|’.join(negations_dic.keys()) + r’)\b’)def pre_processing(column):
   first_process = re.sub(combined_pat, ‘’, column)
   second_process = re.sub(www_pat, ‘’, first_process)
   third_process = second_process.lower()
   fourth_process = neg_pattern.sub(lambda x:\
    negations_dic[x.group()], third_process)
   result = re.sub(r’[^A-Za-z ]’,’’,fourth_process)
   return result.strip()df[‘text’]=df.iloc[:,:].text.apply(lambda x: pre_processing(x))
df=df[~(df[‘text’]==’’)]# shuffle the data
df = df.sample(frac=1).reset_index(drop=True)
# set the random seed and split train and test with 99 to 1 ratio
np.random.seed(777)
msk = np.random.rand(len(df)) < 0.99
train = df[msk].reset_index(drop=True)
test = df[~msk].reset_index(drop=True)
# save both train and test as CSV files
train.to_csv(‘pyspark_train_data.csv’)
test.to_csv(‘pyspark_test_data.csv’)
tokenizer = [Tokenizer(inputCol='text',outputCol='words')]ngrams = [NGram(n=i, inputCol='words', 
outputCol='{}_grams'.format(i)) for i in range(1,4)]cv =[CountVectorizer(vocabSize=5460,inputCol='{}_grams'.format(i),\ 
          outputCol='{}_tf'.format(i)) for i in range(1,4)]idf = [IDF(inputCol='{}_tf'.format(i),\
        outputCol='{}_tfidf'.format(i), minDocFreq=5) \
        for i in range(1,4)]assembler = [VectorAssembler(inputCols=['{}_tfidf'.format(i)\
            for i  in range(1,4)], outputCol='features')]label_stringIdx = [StringIndexer(inputCol='sentiment', \  
                  outputCol='label')]lr = [LogisticRegression()]pipeline = Pipeline(stages=tokenizer+ngrams+cv+idf+assembler+\
           label_stringIdx+lr)model = pipeline.fit(train_set)predictions = model.transform(test_set)

在 PySpark 中,通过 DataFrame API 和 SQL 查询与 SparkSQL 的交互是需要优先学习的科目。为了更好地理解基本操作,必须仔细阅读 Pyspark.sql 模块。以编程方式构造数据帧转换和操作并不太难,而且对数据帧的操作也可以使用 SQL 查询来完成。如果你只有一门课的时间,请花在约翰·霍格的特色工程和 Pyspark 课程上。如果时间允许(第五天),也推荐本课程

第 6/7 天:熟能生巧

学习的最好方法是实践。下周你将需要一套强化技能。尝试深入 Pyspark 模块,因为您将广泛使用它们。要重复*“PySpark 和大数据处理的第一步”*,请遵循这些练习。建议从 KaggleProject Gutenberg 下载一些数据集,并解决预处理问题以及其他问题。请跟随这款来自 Spark NLP 创作者的优秀笔记本。如需更多资源,请查看本笔记本本文章

接下来:第二部分——如何把你的头缠在 Spark NLP 上。在这一部分中,我们将理解“Spark NLP 中的注释器/转换器”,并使用大量笔记本强调“使用 Spark 进行文本预处理”、“预训练模型”和“文本分类器”。此外,我们将使用 spaCy 和 SparkNLP 运行完整的管道,并比较结果。

如何入门 Neo4j 的图形数据科学库

原文:https://towardsdatascience.com/how-to-get-started-with-the-new-graph-data-science-library-of-neo4j-3c8fff6107b?source=collection_archive---------13-----------------------

入门

Neo4j 中图形数据科学管理方式的巨大变化带来了巨大的机遇

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

图片来自 Ecpp,CC BY-SA 4.0【https://creativecommons.org/licenses/by-sa/4.0>】T2,转自维基共享。我没有改变这个形象。

图形分析领域已经存在很长时间了。总的想法是创建一个事物连接到其他事物的数据库。这些事情可能是人们在社交媒体上与其他人联系,或者可能是城市之间的航班或任何其他数量的例子。图形通常用于增强搜索能力,向电子商务网站上的购物者推荐产品,检测欺诈,或者绘制从 A 点到 b 点的最短路线。

长久以来,Neo4j 一直是图形数据库领域的重要参与者。历史上,它使用密码查询语言与数据库进行交互。有很多关于如何分析图表或使用密码的初级读本。相反,这篇文章旨在介绍如何使用新的 Neo4j 图形数据科学库 (GDS)来完成数据科学中的任务,这是对原始 Neo4j 图形算法库(现已废弃)的重大增强。从图算法到 GDS 有一些根本性的转变,但对于那些使用前者的人来说,一旦你掌握了新的使用方式,它将成为第二天性。出于本文的目的,没有必要使用任何一种来开始用数据科学方法解决图形问题。

我们将从你有一个正在运行的 Neo4j 服务器的前提开始。如果你还没有这个,你可以在这里下载开源社区版需要注意的是,为了访问 GDS 图书馆,您需要下载 Neo4j 的 v4 版本。当前版本永远是最好的,并提供了 GDS 的最新功能(他们总是添加伟大的新功能!).

使用。图形数据的 csv 文件

一旦 Neo4j 服务器启动并运行,您将需要一些图形数据来填充它。虽然 Neo4j 中内置了一些示例图,但是介绍一下如何导入您自己的数据可能会有所帮助。

图形数据通常以边列表和节点列表的形式出现,它们通常是独立的文件。Neo4j 使导入这些文件变得容易。csv 格式,我们将讨论一种最容易导入的格式。让我们分别讨论一下这些文件。

**节点列表:**在此。csv 文件我们提供关于节点的信息——它们的标签。可以有许多类型的标签,或者您可以只提供一个通用的节点 ID。这些标签将用作上述node1node2中的标识符。可以有任意数量的标签与节点相关联。好的选择是像唯一标识符、已知的名称(如果已知的话)和节点的一般类型(想想像“这个节点是一个人”或“这个节点是一个地方”,这可以用来给出像“人”或“地方”这样的节点类型)。格式看起来像这样

node1, label1, label2, …

**边缘列表:**在此。csv 文件中,您有关于哪些节点连接到哪些其他节点的信息。它还可以指定关系的类型。所以格式遵循典型的

node1, node2, relationship_type, weight

其中,node1是起始节点,node2是终止节点,relationship_type指定边标签(可选),而weight表示该关系的强度(可选)。

请注意,为每个文件设置一个标题行通常是一个好习惯(尽管不是必需的),这样您就可以跟踪哪些列是什么。一旦你有了这些文件,我们就可以把它们载入 Neo4j。出于本教程的考虑,我们将使用《权力的游戏》(GoT)中的角色图。GoT out 上的图形数据有几个来源,但我特别喜欢 Andrew Beveridge 在 this repo 中维护的那个,因为它简单、有条理且易于使用。

数据被方便地分解成。节点和边的 csv 文件,每个季节一个文件。在本教程中,我将 repo 克隆到我的本地机器上以读取文件,但是您也可以选择从 web 上读取它们。

警告!!!图形分析是一个强大的工具,当我们进入 GoT 时,它将揭示一些严重的破坏者!所以如果你不想让系列剧透,现在就回头吧!

将数据加载到 Neo4j

使用内置的LOAD CSV命令将数据加载到数据库非常简单。因为我们在装货。csv 文件,您将希望确保进入 neo4j.conf 文件并注释掉行dbms.directories.import=import,以便允许我们从您本地机器上的任何地方加载文件。加载方式有很多种。csv 数据到数据库中,我挑了下面我觉得最简单的。

我们将从使用以下命令加载节点列表开始:

WITH "file:///Users/cj2001/gameofthrones/data/got-s1-nodes.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MERGE (c:Character {id:row.Id})
SET c.name = row.Label

(这是加载到第一季文件中的命令,您可以重复这个命令来加载任何您想要的季节。我已经对从s1s8的每个文件执行了这个命令。*注意:*第五季的文件名有轻微的错别字。)

使用上面的命令,我现在有了一系列类型为Character的节点,这些节点具有名为idname的属性。注意,我们已经用标题行中可用的列名对应的IdLabel逐行加载了这个文件。

接下来,我们将使用以下命令加载边列表:

WITH "file:///Users/cj2001/gameofthrones/data/got-s1-edges.csv" AS uri
LOAD CSV WITH HEADERS FROM uri AS row
MATCH (source:Character {id: row.Source})
MATCH (target:Character {id: row.Target})
MERGE (source)-[:SEASON1 {weight: toInteger(row.Weight)}]-(target)

(同样,我们将对每个想要合并的边缘文件重复上述步骤。)

上面的命令创建了边缘类型为:SEASON1的字符之间的关系。我发现给每个季节赋予它自己的边类型是很方便的,这样可以探索不同季节之间图形的变化。边缘本身由源角色和目标角色交互的次数加权。注意,在导入时,Neo4j 认为所有的列都是字符串,但是对于我们将来的计算,我们希望 Neo4j 知道Weight实际上是一个整数,所以我们必须将其重新转换。还要注意我们使用了格式(source)-[edge_type]-(target)。因为在这个关系中没有指示方向的箭头,所以我们创建了一个无向图。如果我们想做其他的事情,这种关系应该看起来像(source)-[edge_type]->(target)

内存中的图形:转移到 GDS 图书馆的大问题和简单的 PageRank 计算

内存图形的创建代表了 Neo4j 的革命性进步。基本上,它允许我们做的是创建不同的图或子图进行分析。我们可以在部分数据库上运行命令,而不是整个数据库。例如,在得到的数据中,我们可能关心对整个图表进行的计算,或者我们可能只想对单个季节进行计算。这种新的哲学方法为数据科学和图形上的机器学习打开了许多大门,我怎么强调都不为过!

我们将从创建整个 8 个赛季的内存图开始。在 GDS 有两种主要的方法可以做到这一点:使用 Cypher 投影或“本地”投影。我将在这里使用前者,因为这是一组非常直接的命令,很容易理解发生了什么。虽然原生投影非常快速和强大,但是超出了本教程的范围。为了用 Cypher 投影创建内存中的图形,我们使用命令

CALL gds.graph.create.cypher(
    'full_graph',
    'MATCH (n) RETURN id(n) AS id',
    'MATCH (n)-[e]-(m) RETURN id(n) AS source, e.weight AS weight, id(m) AS target'
)

图形创建需要三样东西:

  1. 一个图形名称(full_graph)
  2. 一个节点查询(MATCH (n) RETURN id(n) AS id
  3. 一个边缘查询(MATCH (n)-[e]-(m) RETURN id(n) AS source, e.weight AS weight, id(m) AS target

图形名称非常清楚。但是节点和边查询需要一点解释。出于速度原因,Neo4j 处理节点 id,而不是实际的节点信息。通常,这些 id 除了与我们拥有的任何节点或边标签无关的一组整数之外,不会映射到任何东西。但是当你看到id(n)时,这就是 GDS 与这些数据的实际关联。我们在节点查询中获得这些 id,然后在边查询中返回它们。

现在我们有了一个图表,我们可以在上面做一些数学运算。我们可以做的最基本的事情之一是计算图表中每个字符的 PageRank。我们可以用两种不同的方式来查看和使用这些结果。为了理解其中的区别,我们认为大部分 GDS 函数可以调用streamwrite方法。前者将计算结果输出到屏幕上。例如,为了计算这个图表上的 PageRank 并将其输出到屏幕上,我们应该这样做

CALL gds.pageRank.stream('full_graph', {
  maxIterations: 20,
  dampingFactor: 0.85,
  relationshipWeightProperty: 'weight'
})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).id AS id,      gds.util.asNode(nodeId).name as name, score as full_pagerank
ORDER BY full_pagerank DESC

(我只是使用了maxIterationsdampingFactor的默认值。)注意,我们使用的是之前的节点 id,我们通过gds.util.asNode(nodeId)命令将它们从各自的 id 转换成我们识别的属性,比如idname

如果我们在所有 8 个季节的图表上这样做,我们会发现一些不令人惊讶的结果。各季排名最高的五个角色依次是提利昂、琼恩、丹妮莉丝、瑟曦和珊莎。(别担心……艾莉亚是 6 号。)

这个结果并不令人惊讶,也许我们真的想把它作为一个节点属性,用于内存图之外的未来分析。为此,我们想使用write方法,该方法将计算结果作为属性写入节点。为了做到这一点,我们做到了

CALL gds.pageRank.write('full_graph', {
    maxIterations: 20,
    dampingFactor: 0.85,
    relationshipWeightProperty: 'weight',
    writeProperty: 'full_pagerank'})

我们现在可以做一个简单的MATCH (c:Character RETURN c.name ORDER BY c.full_pagerank DESC来看看上面的结果。然而,我们可以看到,在这种情况下,PageRank 被添加为一个名为full_pagerank的节点属性。

这很有趣,但是如果我们了解《GoT》的话,我们会认为 PageRank 会随着每一季角色的增加和减少或者死亡而改变。为了探索这一理论,我将创建两个额外的内存中图表—一个用于第 1 季,一个用于第 8 季。对于第一季,这看起来会像

CALL gds.graph.create.cypher(
    's1_graph',
    'MATCH (n) RETURN id(n) AS id',
    'MATCH (n)-[e:SEASON1]-(m) RETURN id(n) AS source, e.weight AS weight, id(m) AS target'
)

第八季也差不多。您可以使用CALL gds.graph.list()来检查图表。

现在,如果我对第一季进行同样的 PageRank 计算,我会得到奈德、提利昂、凯特琳、琼恩和丹妮莉丝是最具影响力的前五个角色。第八季再重复一遍,我得到前五名分别是提利昂、琼恩、丹妮莉丝、詹姆和珊莎。再说一次,如果你了解这部剧,这些都不会让人感到惊讶。

通过 Louvain 方法的社区检测

GDS 库中包含的一个强大工具是在内存图形上运行 Louvain 聚类的能力。要在所有 8 个季节的完整图表上这样做,并将计算的社区作为属性写入每个节点,我们将运行

CALL gds.louvain.write('full_graph', 
    {relationshipWeightProperty: 'weight', 
     writeProperty: 'full_community_id'
})

(注意,这样做不会得到很好的模块化,但是为 Louvain 调优参数超出了本教程的范围。)如果我想获得提利昂所有 8 个赛季的检测到的社区,我们将首先获得 ID 值(MATCH (c:Character {name: ‘Tyrion’}) RETURN c.name, c.full_community_id ,它给了我社区 143,但你的可能会不同),然后在同一个社区中找到排名最高的人物。就我而言,我会做MATCH (c:Character {full_community_id: 143}) RETURN c.name, c.full_community_id ORDER BY c.full_pagerank DESC,我会得到 8 季中对提利昂生活影响最大的 5 个角色是瑟曦、詹姆、瓦里斯、乔佛里和泰温。不奇怪。我把它作为一个练习留给读者,让他们探索其他角色,或者看看探测到的社区是如何随季节变化的。

最后的想法

Neo4j 从基本的查询转向形式化的图表处理,使数据科学和机器学习成为可能,这给我留下了深刻的印象。这里有很多功能,我在本教程中只触及了皮毛。我希望在未来撰写其他文章,讨论诸如本机投影和 node2vec 和 GraphSAGE 的矢量嵌入所提供的全部可能性之类的事情,在 GDS 库的最新版本中,它们已经从 alpha 版本中移除。

[1] M. Needham 和 A. Hodler,图算法:Apache Spark 和 Neo4j 中的实际例子 (2020),奥赖利媒体。

如何使用 Python 获取股票数据

原文:https://towardsdatascience.com/how-to-get-stock-data-using-python-c0de1df17e75?source=collection_archive---------1-----------------------

用于获取股票价格数据和公司数据的 Python 一行程序

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

莎伦·麦卡琴在 Unsplash 上的照片

我最近对股票数据非常感兴趣;看看我是否能精心挑选出能够在中期带来适度回报的股票。我希望写一整篇关于我想出的策略的文章,但首先,我想分享如何首先获得股票价格数据,这样你就可以为自己进行类似的分析!

事实证明,使用名为 yfinance 的非常方便的 Python 库,这个任务变得非常容易。

为了解决这个问题,假设我们对获得微软(股票代号 MSFT)过去 10 年的股价数据感兴趣。

首先,我们将安装 yfinance 库:

  • 打开 Anaconda 提示符或其他命令提示符,键入:pip install y finance

下面是为微软收集历史股票数据所需的基本代码:

这里的关键论点是:

  • 周期:采集数据的频率;常见选项包括“1d”(每天)、“1mo”(每月)、“1y”(每年)
  • 开始:开始收集数据的日期。例如“2010 年 1 月 1 日”
  • 结束:结束收集数据的日期。例如“2020 年 1 月 25 日”

您的结果应该是一个包含微软每日历史股票价格数据的 Pandas dataframe。关键字段包括:

  • 开盘:当日/月/年初的股票价格
  • 收盘:当日/月/年末的股票价格
  • 高点:当日/月/年股票达到的最高价格
  • 低点:股票当日/月/年的最低价格
  • 交易量:当天/月/年交易了多少股票

您可以使用生成的数据框架创建如下图表:

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

虽然history**是 yfinance 库最常见的函数,但我还想提到一些其他函数。

信息

对许多 tickers 来说,你可以从公司整体上获得有价值的信息,如地理位置、网站、业务摘要等。

日历

您还可以使用 yfinance 库来获取关于公司的即将到来的收益事件。

推荐

最后,您可以使用建议属性来查看分析师是如何对这只股票进行评级的。

仅此而已!希望这能帮助你开始进行自己的股票数据分析。

感谢阅读,下次再见!~

如何使用谷歌新闻订阅获取最新的新冠肺炎新闻

原文:https://towardsdatascience.com/how-to-get-the-latest-covid-19-news-using-google-news-feed-950d9deb18f1?source=collection_archive---------16-----------------------

通过 RSS 源检索实时数据

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

照片由 PexelsLisa Fotios 拍摄

由于目前的在家政策,我在家工作。当我浏览互联网,寻找新冠肺炎相关的新闻文章时,我很好奇一些网站是如何获取最新的新闻或文章的。这些网站可以从各种网站检索新闻或文章。

我在想,太棒了!他们会在各个网站上建立多个爬虫来获取最新消息吗?但是这需要大量的工作。

或者可能存在一些免费检索新闻的 API?然而,我发现这些 API 提供者只跟踪某些网站。

我在想,有没有更简单的方法来获取最新的谷歌新闻?由于谷歌机器人正在抓取大多数网站,这应该是一个好的开始。尽管如此,谷歌在限制机器人方面的效率是出了名的。

经过数小时的研究,我发现有一种方法可以检索最新的谷歌新闻,那就是搜索谷歌 RSS 新闻源。

如果你有兴趣知道如何建立一个网站,将显示最新消息?或者也许你正试图将现场新闻整合到你的网站上?或者您可能只是想知道如何检索新闻?

这篇文章是给你的。

什么是 RSS?

RSS 代表**【丰富的网站摘要】【真正简单的联合】,它是一种提供定期变化的网络内容的格式**。它允许用户在一个单一新闻聚合器中跟踪许多不同的网站。因此,许多与新闻相关的网站、博客和其他在线出版商将他们的内容作为 RSS 提要提供给任何想要的人。

所以,你对什么是 RSS 有了更好的理解,让我们从抓取开始吧!

我们需要搜集的确切网址是什么?

BASE URL: http://news.google.com/news?

以下是我认为对检索英语相关的新冠肺炎新闻有用的参数列表。如果您有兴趣了解更多信息,请随意点击此处获取 google 官方 XML API 文档。

查询术语:

  1. 问:这代表我想要请求的查询词,在本例中,它是新冠肺炎。
  2. hl:你正在使用的用户界面的宿主语言。我更喜欢用 en-US。
  3. sort:这个参数是可选的。我将希望根据日期对新闻进行排序,因此值是日期。
  4. gl:这是原产国与参数值匹配的增强搜索结果。该值是美国,因为这是我的 web 浏览器的默认值。
  5. num:您希望获得的新闻数量。我会选择最大值 100。
  6. 输出:你想要的输出格式。我会选择 RSS。

这是我将向其发送请求的最后一个字符串。

URL: http://news.google.com/news?q=covid-19&hl=en-US&sort=date&gl=US&num=100&output=rss

恭喜,你现在只剩下代码部分了。

编码部分

我使用的编程语言是 Python。在测试代码之前,一定要安装这两个库— bs4feedparser

您会注意到我创建了一个名为 ParseFeed 的类,有两个方法cleanparse。clean 函数将从 HTML 文档中提取所有文本,并用空格字符替换字符\xa0

此外,parse函数将解析 HTML 并打印一些我认为重要的字段。例如,新闻的标题、描述、发布日期和 URL。

下面是在 Jupyter 笔记本上运行上述代码后的输出快照。

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

最终想法

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

吉尔·威灵顿摄于 Pexels

正如你可能注意到的,你可以通过 RSS 以一种更方便的方式检索新闻。如果你有兴趣追踪其他种类的新闻,你可以调整参数来得到你想要的。但是,请注意,有些参数是有限制的。

非常感谢你一直读到最后。如果你有任何你想让我讨论的话题,欢迎在下面评论。

大家待在家里,注意安全!

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

关于作者

低魏宏是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。

他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问这个网站查看他的作品集,也可以联系他获取抓取服务

你可以在 LinkedInMedium 上和他联系。

[## ●伟鸿-中等

在媒体上阅读低纬鸿的作品。数据科学家|网络抓取服务:https://www.thedataknight.com/.每…

medium.com](https://medium.com/@lowweihong)

如何在 Kaggle 上获得前 1%并帮助进行组织病理学癌症检测

原文:https://towardsdatascience.com/how-to-get-top-1-on-kaggle-and-help-with-histopathologic-cancer-detection-af729dc3e6f7?source=collection_archive---------50-----------------------

一个关于我第一次 Kaggle 比赛的故事,以及我在那次比赛中学到的东西。此外,大量的代码、模型权重以及可能对其他研究人员有帮助的想法。

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

肾单位通过维基共享资源

大约一年前,我参加了第一次关于癌症分类的 Kaggle 竞赛。从那以后,我参加了更多的比赛,甚至和我的团队一起发表了一篇关于 CVPR 的论文。但是,我觉得我们在一场比赛结束后失去了大部分知识,所以我想分享一下我的方法以及 发布代码模型权重 (迟到总比不到好吧?).

我希望我的想法(+实现它们的 PyTorch 解决方案)对研究人员、Kaggle 爱好者以及希望在计算机视觉方面做得更好的普通人有所帮助。

**免责声明:**我不是医学专业人士,只是个 ML 工程师。也就是说,对我所有与医疗相关的声明都要持保留态度。然而,我乐于接受批评,所以如果你在我的陈述或一般方法中发现了错误,请随时联系我,我会尽最大努力纠正它。

什么是组织病理学癌症,为什么它很重要

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

neverov 通过 memepedia

简而言之,你需要一个大型的数字病理扫描,裁剪它的碎片(补丁),并试图在这些作物中找到转移组织。在这种特殊情况下,我们有来自淋巴结大扫描的补丁(PatchCamelyon 数据集)。请记住,转移是癌细胞扩散到身体的新部位。通常,它是通过淋巴系统的血流来完成的。

这项工作的重要性非常简单:构建机器学习驱动的系统可能也应该帮助那些无法获得准确诊断的人。也许他们没有好的专家,或者只是想再次检查他们的诊断。

然而,请记住自我治疗并不是一个明智的想法,而且许多 ML 医疗系统都是有缺陷的( 最近的例子 )。

引擎盖下是什么

目标

主要的挑战是解决斑块是否包含转移组织的分类问题。阳性标签表示补片的中心 32×32 像素区域包含至少一个肿瘤组织像素。贴片外部区域的肿瘤组织不影响标记。

所有解决方案都在预测概率和观察目标之间的 ROC 曲线下的面积上进行评估。

电子设计自动化(Electronic Design Automation)

在任何 ML 项目中,首先要做的是探索性数据分析。

Train/Test images: 220025/57458Value counts: 
0    130908
1     89117Image size: (96, 96)

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

确认

毫无疑问,对于构建 ML 模型来说,最重要的事情是验证。有人可能会认为,简单地将数据随机分成 80/20 的比例进行训练和验证,或者以分层的方式进行,或者应用 k 倍验证,都是可以的。但实际上,验证这种模型的最好方法是分组折叠。我们如何建立组,为什么在这种情况下它是最好的验证技术?让我们后退一点。

正如我之前所说,我们处理的补丁是一些更大图像(扫描)的一部分。也就是说,我们不能将扫描的一部分发送给培训,而将剩余部分发送给验证,因为这将导致泄漏。因此,每次扫描都应该是训练或完全验证。这就是我们构造组的原因,这样组与组之间就没有扫描的交集。

为了做到这一点,我们需要将每个补丁与其对应的扫描相匹配。我们这样做是 Kaggle challenge 的一部分,你可以在 GitHub repo 中找到文件 (patch_id_wsi_full.csv) 的完整匹配。

数据准备

关键的一步是调整大小,因为在原始大小上训练产生的结果一般。更糟糕的是,只对中心作物进行训练。文章末尾附有完整的表格和模型比较。

基于对手工训练集的检查,我认为把我的增强集中在翻转和颜色变化上是个好主意。请注意,我没有使用白蛋白,而是使用默认 pytorch 变换。这只是遗产,因为我大约一年前写了这部分代码,不想在转移到 albumentations 时破坏它。

模型和优化细节

模型的主干是 EfficientNet-B3 或 SE_ResNet-50,其头部经过修改,具有自适应平均池化和最大池化的串联+具有密集压差的附加 FC 层(3 层,压差为 0.8)。使用 EfficientNet 和 SE_ResNet 的主要原因是,它们是非常适合这个特定数据集的默认主干。

优化器是没有任何权重衰减的 Adam+ReduceLROnPlateau(因子= 0.5,耐心= 2,度量=验证 AUROC),用于调度,训练分两部分完成:微调头部(2 个时期),然后解冻网络的其余部分,并微调整个事情(15-20 个时期)。两个阶段的学习率都是 0.01,并使用 LR 范围测试进行计算(学习率以指数方式增加,计算训练集的损失):

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

阶段 1 的学习率范围测试

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

阶段 2 的学习率范围测试

请记住,实际上使用莱斯利·史密斯提出的原始想法更好,在那里您线性增加学习率并计算验证集上的损失。这样,你会得到更可靠的结果,但只是需要更长的时间来完成。

训练是使用常规的 BCEWithLogitsLoss 完成的,没有任何类权重(原因很简单,它是有效的)。

附加技巧(增加的东西+不起作用的东西)

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

托弗麦卡洛克通过 flickr

为了获得更好的性能,应用了 TTA。特别是 4-TTA(所有旋转 90 度+原始),用于使用平均平均值进行验证和测试。此外,所有倍的高效网-B3 和 SE_ResNet-50 是混合在一起的一个简单的手段。

如果你想进一步提高最终模型的质量,并且不想被原创的想法所困扰(比如高级的预处理和后处理),你可以很容易地应用 SWA。为了做到这一点,回购支持 SWA(这不消耗内存,因为 EfficientNet-B3 的权重需要大约 60 Mb 的空间,SE_ResNet-50 的权重需要 40 Mb 的空间),这使得平均模型权重变得容易(请记住,SWA 不是平均模型预测,而是平均其权重)。

我试图为最后阶段的训练增加更复杂的损失(像 FocalLoss 和 Lovasz 铰链损失),但改善是微不足道的。还有,我实现了渐进式学习(训练时增加图像大小),但出于某种原因,这并没有帮助。也许,我的实现是有缺陷的,因为这通常是提高模型性能的一种相当安全的方法。

模型比较

请注意,合奏没有 CV 分数。这样做的原因是,基于单倍分数比较单个模型很容易(但你需要冻结种子),但为了比较整体(如混合、堆叠等)。)您需要一个额外的维持集。换句话说,例如,您将所有数据的 20%用于维持,其余的 80%照常分成多个部分。这很简单,也是我没有在这个解决方案中实现它的唯一原因——我没有计算资源从头开始重新训练 10 次折叠。

这也是我不公布加权综合得分的原因:你需要根据验证的坚持来微调权重。

最后的想法

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

Mememaster 通过 memepedia

这个比赛已经结束一年了,所以很明显,很多新的想法已经浮出水面,这应该会提高这个模型的质量。个人可以推荐以下。

如果您的资源不低,只需训练更多具有不同主干(重点是 SE_ResNet、SE_ResNeXt 等模型)和不同预处理(主要是图像大小+添加图像裁剪)的模型,并将它们与更密集的 TTA(添加关于颜色的变换)混合,因为集成对于这个特定的数据集非常有用。但请记住,为了评估整体(并可靠地比较折叠),有必要从折叠中单独分离出一个坚持。

如果你想要比混合神经网络更具原创性的东西,我当然会建议在领域知识方面研究更复杂的数据增强技术(也就是说,与领域专家合作,并征求如何增强图像的想法,以便它们仍然有意义)。此外,很明显,我使用了预先训练的 EfficientNets 和 ResNets,它们是在 ImageNet 上训练的。在类似于这个数据集的一些医疗相关数据集上运行额外的预训练(甚至从头开始训练)应该是一种有利可图的方法。

联系人

如果你对这个解决方案有任何问题,请随时在评论、GitHub 问题或我的电子邮件地址 ivan.panshin@protonmail.com 联系我

如何让 Turi Create 在 Windows 上运行

原文:https://towardsdatascience.com/how-to-get-turi-create-running-on-windows-261b68027bc0?source=collection_archive---------11-----------------------

很有可能,你正在学习一门在线课程,并对所有这些错误信息感到沮丧。这是一个关于如何做到这一点的教程。

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

沙哈达特·拉赫曼在 Unsplash 上拍摄的照片

受众:机器学习初学者,命令行初学者,windows 用户,Python 3,Anaconda

我一直在学习机器学习基础在线课程,但在建立所需的库时已经失败了,这让我彻底疯了。让我们省点挫折吧。这个简短的教程旨在帮助你更容易地完成第一步

为什么我们要用 Turi 创建

Python 中有很多机器学习库,其中大部分都不容易扩展到大型数据集。Turi Create 使我们能够创建各种各样的 ML 模型,而不必安装额外的软件包。它易于使用,包含有用的绘图选项,并且对于您可能想要使用的数据是灵活的。

Turi Create 可以完成许多 ML 任务,大多数不需要额外的库。

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

要求:

  • Python 2.7、3.5、3.6
  • x86_64 架构
  • 至少 4 GB 内存

支持的平台:

  • macOS 10.12 以上
  • Linux(带有 glibc 2.10 以上版本)
  • Windows 10 (WSL)

这就是我的问题开始的地方。就像我经常做的那样,我只看了手册的一半就开始打字…并且面对一条又一条的错误信息。

评论:你将不能简单地在 Windows 10 平台上安装/运行 Turi Create。你必须先为 Linux(WSL)安装一个WwindowsS子系统。

安装 WSL

为了安装任何 WSL,必须启用“用于 Linux 的 Windows 子系统可选功能”。

  • 按照以下命令以管理员安润身份打开 PowerShell:

  • 出现提示时,重新启动计算机

  • 安装您选择的 linux 发行版。在这个例子中,我们使用的是 Ubuntu 16.04

评论:Ubuntu 16.04 不是最新版本,以后还得更新。如果找到最新版本,直接安装,跳过“更新”这一步。

  • 以管理员身份打开命令行,并使用以下代码

结果应该是这样的:

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

现在我们需要使用 PowerShell 安装我们的发行版。运行以下命令,而“app_name”是您的 distro.appx 文件的名称

评论:这个也可以手动完成,不赘述。它基本上是寻找 distro.appx 文件并点击安装

如果你不小心下载了一个过时的版本(像我一样),你会被提示更新(我已经更新了)

您的发行版命令终端会被自动提示,并要求您输入一个新的 Unix 用户名:遵循正则表达式

规则:

  • 以小写字母或下划线开始
  • 后跟小写字母、数字、下划线、破折号
  • regex:I .[a-z _][a-z0–9 _-]*[$]?

评论:我试过各种各样的名字,但都被拒绝了。最后我选择了一个简单的名字,全部小写,没有特殊字母。

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

安装 pip

使用 pip 安装 turicreate。如果你已经安装了 Ubuntu,你可以使用这个教程。确保您使用的是 sudo 权限。

  • 将提示您批准使用额外的磁盘空间—按“Y”
  • 然后会要求您重新启动。我选了。不过这取决于你

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

  • 安装完成后,验证是否安装了 pip3
  • 尽管版本号可能会有所不同,但看起来应该是这样的:

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

  • 一旦安装了 Turi Create,您将得到以下错误(除非您已经安装了 T ensorflow

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

使用 pip 安装 Tensorflow

  • 打开您的 Ubuntu(或首选发行版)控制台,使用以下命令:

差不多就是这样。我还安装了 Sframe 来处理大数据集,但这是个人喜好的问题。该社区已经开始提供直观的教程供进一步使用,并提供鼓舞人心的文章。你现在可以开始玩 Turi Create 和机器学习了。玩得开心!

如何让您的数字化转型顺利进行

原文:https://towardsdatascience.com/how-to-get-your-digital-transformation-unstuck-fabbb395176e?source=collection_archive---------59-----------------------

在您的组织中(再次)实现数字化的八种做法

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

维多利亚博物馆在 Unsplash 拍摄的照片

数字化正处于炒作曲线的顶点,但大多数公司都在艰难前行。

一些公司雇佣了一大批数据科学家,希望奇迹发生。

其他公司雇佣顾问,希望找到一种能让他们在竞争中脱颖而出的策略。

每个人都希望成为下一个 Airbnb、优步、网飞、亚马逊等,但显然这只会是少数快乐的人。

然而,大多数公司将从改善现有业务中受益,例如通过降低成本、提高产量、提高效率、改善质量和提高安全性。

这意味着数字化的重点应该是公司现有的员工和工作流程。

你可以雇佣像数据科学家这样的新人,但是他们通常缺乏领域知识(例如,对工作流程的深入了解)。你可以聘请战略顾问,但他们通常离车间太远。

你应该关注你自己的人,并培养他们为你改变公司。

以我的经验来看,有八种做法可以让你更有机会成功启动数字化转型,它们都以员工为重点。我不是一名商业顾问(也不打算成为一名),我不确定这些对你的情况是否有用。很可能有更多的实践有所帮助。无论如何,我确实认为这八个大大提高了你的机会。

第一个练习取自精益,叫做:

1.拉,不是推

当开始一件新的事情时,你会面临阻力。然而,总有人渴望尝试新事物。你需要识别这些人,你需要给他们你所有的注意力和精力。

在他们工作的领域开始行动,无论是一个地点还是一个流程,都没有关系。给他们你的时间(当他们向你寻求支持或建议时,放下其他事情)。突破障碍,让他们的生活变得轻松,并要求他们升级瓶颈。给他们提供培训机会,让他们向你的高级经理和主管展示他们的工作。

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

拉,不是推。照片由阿斯特丽德Unsplash 上拍摄

有时候,更大的机会出现在阻力最大的领域。不过,不要在那里消耗你的能量,先解决阻力。只把精力花在人们要求支持的领域,因此得名拉,而不是推。人们应该寻求帮助,而不是你把它推给他们。从短期来看,推动可能会奏效,但以我的经验来看,这种效果不会持久。

所以,拉,而不是推。

2.赞助

你需要组织中的高层人士来赞助 digital,否则,人们不会开始行动。这并不意味着计划应该从最高层开始(尽管那会有所帮助),你也可以通过展示自下而上计划的早期结果来影响高层领导。

赞助可以简单到在与员工的交流中提到数字。简单易行,效果很好。其他有帮助的事情包括为计划释放预算,释放人们的时间,通过召集思想领袖和组织对其他公司(通常是其他行业)的参观来促进公司内部的活动。

你可以在没有赞助者的情况下开始,但是这种努力是不可持续的。

所以,给自己找个赞助人吧。

3.小核心

少即是多。如果你想快速行动,最好从一个小团队开始。如果你在超过 10 人的团队中工作过,你就知道我在说什么。团队中的人越多,沟通的开销就越大,这通常无助于加快速度。普莱斯的平方根定律也适用于数字:50%的产出是由参与的人的平方根产生的。如果你的组织中有 100 人从事数字化工作,其中大约 10 人将产生 50%的产出。

要开始数字化,你需要一个小型的全职核心团队(约 5 人),为其他人铺平道路。只为这个群体选择最优秀的人,但也要注意整体构成(即技能互补)。

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

小核心团队。安妮·斯普拉特在 Unsplash 上的照片

你需要寻找具有领域知识、编码经验(不需要全栈软件开发人员)和沟通技巧的人。这些人很难找到,但不要犯退而求其次的错误,你会后悔的,因为东西不会动。

所以,建立一个小的核心团队。

4.工程师变成了数据科学家

数据科学是 20 世纪最性感的工作,这吸引了大量年轻人学习计算机科学。在您的数字化工作中,您肯定需要数据科学家,但不要低估对领域知识的需求。无论你有多聪明,你都无法赶上几年甚至几十年的领域知识。大多数数据科学家确实掌握了最低水平的领域知识,但在某些领域这是非常困难的,例如在工程领域。

我总是和工程师一起工作,大多数工程师在大学时都做过某种形式的编码。当他们开始工作时,对这些技能的需求会减少,因为他们开始在工作中使用商业软件。这是一个遗憾,因为他们带来了领域知识,并拥有编码的技能(但却藏在某个地方)。我发现当你让工程师重新编码时,他们会变得非常高效。他们不具备数据科学家的深入编码技能,但如果你向他们解释(Scikit learn)机器学习主要涉及线性回归,他们会很快明白你在说什么。反过来,我看到聪明的数据科学家完全忽略了他们正在构建的模型背后的物理原理,最终得到了完全无用的结果。

因此,为了转型,从一些数据科学家那里获得帮助,但是更好地专注于让你的工程师重新拾起编码。

5.线上+线下培训

这年头不缺网上培训。你可以在大规模开放在线课程(MOOC)中学习任何数字化的东西。你甚至可以在任何你喜欢的领域获得纳米学位。这当然很好。然而,训练只有在实践中应用才有用。

为了实用,你可以用离线(课堂)培训来补充在线培训,让参与者解决你公司的实际问题。这样你就获得了双赢,人们可以发展自己,解决公司中存在的问题。

课堂训练的主要好处不是你想的那样。在公司里,人们总是被拉向日常工作(紧急的,不重要的),这使得人们很难投入时间学习。如果你让人们只做在线培训,只有最敬业的人才会完成培训。通过“强迫”他们进入教室,他们将更有可能阻碍他们的议程并专注于学习。通过让人们共处一室,他们还将从更广阔的视角了解这些材料如何帮助解决业务问题。这在(个人)在线培训中并不容易。

作为课堂培训的一部分,你可以要求人们组成小组,一起解决业务问题。通过合作,他们学到了更多,他们更有可能坚持下去,他们为公司创造了价值。

所以,不要只局限于线上培训,要辅以线下培训。

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

用线下培训补充线上培训。在 UnsplashNeONBRAND 拍摄的照片

6.投资自助服务

自助服务意味着让业务人员自己开发数字解决方案,而不是 IT 部门。这可以像仪表板一样简单,但也可以是简单的应用程序或自动化工作流。自助服务并不意味着人们必须成为成熟的软件开发人员。关键是让人们创造一个最低可行的产品,他们可以展示给它,这样他们就可以创建一个可持续的解决方案,而不用在设计阶段花费太多时间。值得注意的是,许多数字解决方案从未投入生产,因为开发过程本身解决了问题的根本原因。

数字化最困难的部分通常是获取数据。确保您让人们能够访问您公司的核心数据源。也要给他们工具来处理数据和平台来发布他们的产品。给人们空间来开发他们自己的解决方案,但是当他们陷入困境时支持他们。

所以,投资自助服务吧。

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

自己动手。奥列格·伊万诺夫Unsplash 上拍照

7.永远不要等待下一个/更好/更闪亮的工具/倡议/承诺,永远不要

数字化发展如此之快,以至于当你正在实施某件事情的时候,下一个更好的版本就会出现来取代它。人们很想等待下一个更好、更闪亮的版本,因为它可能会带来更多价值。这是很多公司面临的问题。等待的问题是你永远不会开始。如果你不开始,你就不能解决问题。

随着新的库和框架以创纪录的速度出现,许多数据科学家/开发人员也经历了这种情况。学习一个新的库、框架甚至编程语言都需要投入大量的时间。这段时间你也可以花在开发解决方案上。相当多的数据科学家因为跟不上发展而筋疲力尽。然而,对于一个企业来说,使用哪种框架并不重要,只要它能工作。通过解决问题,你会增加更多的价值,即使解决方案使用的是“旧”技术。在数字化过程中,“老”是相对的。

所以,永远不要等待,永远不要。

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

永远不要等待下一个最好的事情。雷·桑加·库苏马在 Unsplash 上的照片

8.为了速度而变通规则

最后一种做法叫做“为了速度而变通规则”。我并不是说要打破这里的规则,尽管有时这可能是必需的。

变通规则意味着你接受事情不完全按照书上说的去做,但是你知道在有限的时间内这样做不会有太大的伤害。这需要你的员工有些勇气,所以如果你发现这本书没有被遵守,不要责备他们。

在大公司里,不可避免地会有繁文缛节,繁文缛节会拖你的后腿。繁文缛节之所以存在,是因为过去出了问题,而控制措施是为了避免将来出现这种情况。这没什么不好,然而,繁文缛节往往有不良的副作用。

当你开发数字解决方案时,你肯定会遇到繁文缛节。例如,您想用生产数据测试一些东西,但是您需要遵守各种政策,并且需要获得各种部门的批准。嘣,几个星期的延迟。或者,您可以让 IT 部门的朋友进行临时连接,瞧,测试完成了,但只需 5 分钟。确保你保护那些帮助你违反规则的人,他们通常支持组织中级别较低的团队。

所以,变通规则让你继续前进。

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

通融一下。由杰西卡·塔特尔Unsplash 拍摄的照片

摘要

如果你无法在自己的组织中开始使用数字技术,或者当你陷入困境时,考虑我上面描述的八种做法,因为它们将增加你再次摆脱困境或开始前进的机会。它们不是火箭科学,也不是所有的都适用于你的情况。如果你感到停滞不前,至少尝试几次,看看你是否能再次前进。像任何转型一样,保持前进是最重要的。

总之,这是我描述的八个实践:

  1. 拉,不是推
  2. 赞助
  3. 小核心
  4. 工程师变成了数据科学家
  5. 线上+线下培训
  6. 投资自助服务
  7. 永远不要等待下一个/更好的/更闪亮的工具/倡议/承诺,永远不要
  8. 为了速度而变通规则

祝您的数字化转型好运!

观点是我自己的,不是我雇主的观点

如何赋予您的微生物组数据生命?

原文:https://towardsdatascience.com/how-to-give-life-to-your-microbiome-data-using-plotly-r-1892281183cf?source=collection_archive---------15-----------------------

关于如何使用 Plotly 的 R graphing library 进行微生物组数据分析和可视化的教程。

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

从人类占 50%的艺术科学项目中移走微生物。信用:索尼娅·布梅尔。

我是一名微生物生态学家,这意味着我研究微生物如何相互作用及其环境。最近,我跳进了数据科学的世界,这要感谢我从 Mitacs 获得的研究员资格,与数据分析&可视化公司 Plotly 一起工作。Plotly 是关于构建交互式数据科学 web 应用程序的,在这篇文章中,我想分享一些背景知识,介绍如何使用 Plotly 的 R graphing library 通过我的研究中的一些数据实现微生物组数据的交互式可视化。您可以使用提供的代码和链接复制所有图形。你甚至可以自己点击“编辑图表”按钮进入编辑器,对它进行修改或提出改进建议!

在直接进入可视化部分之前,让我先给你一个我们正在处理的数据类型的概述。如果你已经熟悉微生物组数据,你可以跳过下一节。

什么是扩增子或鸟枪数据?

它们本质上是通过 DNA 测序方法获得的数据,这些方法识别关于 DNA 片段或整个基因组的信息。这些序列被组装注释,使用生物信息学工具提取关于给定环境中微生物身份或基因丰度的生物信息。这种分析的输出是所谓的 OTU(操作分类单位)表或基因丰度表。

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

包含样本信息和原始计数的 OTU 表。图片由作者提供。

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

包含与 OTU ID 相关的分类单元信息的分类表。图片由作者提供。

这个表以及关于分类法和元数据的信息可以用于统计分析和可视化。我选择的编程语言是 R,因为已经开发了许多用于微生物组分析的软件包(例如, phyloseqmicrobiomeSeqmicrobiomepicante ),也因为这种语言的统计特性。

先说交互数据可视化(还有一些统计)!

作为评估样品或环境差异的第一个概述,通常查看α多样性。阿尔法多样性描述了特定样本或环境中的多样性(有关阿尔法多样性统计的更多信息,请查看 Amy D. Willis 的论文)。使用具有以下代码的盒状图可以很容易地绘制多样性指数,并通过将鼠标悬停在图上或单击图例以隔离轨迹的方式进行交互式探索(有关特征的说明,请参见右上角的工具)。

# load libraries 
library(dplyr)
library(data.table)
library(plotly)# load file
df <- fread("[https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/alphadf.csv](https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/alphadf.csv)")# create annotations for y axis
y_p1 <- list(
  title = "Shannon")
y_p2 <- list(
  title = "Phylogenetic Diversity")# filter variable and plot first subplot 
p1 <- df %>% filter(variable == "Shannon") %>% 
plot_ly(
x = ~Compartment, 
y = ~value, 
color = ~Treatment,
colors = "Dark2",
type = "box",
legendgroup = ~Treatment,
showlegend = TRUE) %>% 
  subplot(nrows = 1, shareX = TRUE, shareY =TRUE, titleX = FALSE) %>% layout(boxmode = "group", yaxis = y_p1)# filter variable and plot second subplot
p2 <- df%>% filter(variable == "Phylogenetic Diversity") %>% plot_ly(
x = ~Compartment, 
y = ~value, 
color = ~Treatment,                                                                  colors = "Dark2",                                                                type = "box",                                                                  legendgroup = ~Treatment,                                                              showlegend = FALSE) %>%
  subplot(nrows = 1, shareX = TRUE, shareY =TRUE, titleX = FALSE) %>% layout(boxmode = "group", yaxis = y_p2)# combine subplots 
p_box <- subplot(nrows = 1, p1, p2, titleX = TRUE, titleY = TRUE) 
p_box# you can also update details of the graph in [chart studio](https://plotly.com/chart-studio/) (e.g. legend names) by creating a free account and api key and then upload them
Sys.setenv("plotly_username"="put your username here")
Sys.setenv("plotly_api_key"="put your api key here")chart_link = api_create(p, filename = "your file name")
chart_link

显示 16S rRNA 扩增子测序数据的α多样性指数的箱线图。这些只是一些常见的例子,可以选择更多的指数。

条形图的替代方法是所谓的小提琴图,它是箱形图的扩展,增加了一个内核密度图,显示数据的分布形状。小提琴越宽,该范围内的数据点越多;数据点越少越小。下面的代码生成了一个分割的 violin 图,其优点是可以直接比较多个组(这里是植物-土壤区间)。通过对其他分集指数进行过滤,并遵循上述组合图的代码,可以添加额外的子图。

# load libraries 
library(dplyr)
library(data.table)
library(plotly)# load file
df <- fread("[https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/alphadf.csv](https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/alphadf.csv)")# filter variable, assign sides of plot
p_violin <- df %>% filter(variable == "Shannon") %>%
  plot_ly(type = 'violin') 
p_violin <- p_violin %>%
  add_trace(
    x = ~Compartment[alphabac.dfmelt$Treatment == 'Control'],
    y = ~value[alphabac.dfmelt$Treatment == 'Control'],
    legendgroup = 'Control',
    scalegroup = 'Control',
    name = 'Control',
    side = 'negative',
    box = list(
      visible = T),
    meanline = list(
      visible = T),
    color = I("#1B9E77")) 
p_violin <- p_violin %>%
  add_trace(
    x = ~Compartment[alphabac.dfmelt$Treatment == 'Treatment'],
    y = ~value[alphabac.dfmelt$Treatment == 'Treatment'],
    legendgroup = 'Treatment',
    scalegroup = 'Treatment',
    name = 'Treatment',
    side = 'positive',
    box = list(
      visible = T),
    meanline = list(
      visible = T),
    color = I("#D95F02"))p_violin %>%
  layout(
    xaxis = list(
      title = ""),
    yaxis = list(
      title = "Shannon",
      zeroline = F),
    violingap = 0,
    violingroupgap = 0,
    violinmode = 'overlay')

显示 16S rRNA 扩增子测序数据的 Shannon alpha 多样性的分裂小提琴图。

下一步,我们可以探索基于所选的分类等级给出微生物种类信息的分类法。通常,选择门(用于更广泛的概述)和属(用于更深入的概述)的等级。提示:这有助于根据平均丰度从最丰富到最不丰富的分类群对数据进行排序,以便于解释(阅读更多关于为什么排序数据对清晰解释很重要的信息此处)。

# load libraries 
library(dplyr)
library(data.table)
library(plotly)# load data (already normalized)
df <- fread("[https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/psbac.df.csv](https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/psbac.df.csv)")# annotate plots (for more on annotation check out this [link](https://plotly.com/r/text-and-annotations/)) 
a <- list(
  text = sprintf("Bulk"),
  font = list(size = 14),
  xref = "paper",
  yref = "paper",
  yanchor = "bottom",
  xanchor = "center",
  align = "center",
  x = 0.5,
  y = 1,
  showarrow = FALSE)b <- list(
  text = sprintf("Rhizosphere"),
  font = list(size = 14),
  xref = "paper",
  yref = "paper",
  yanchor = "bottom",
  xanchor = "center",
  align = "center",
  x = 0.5,
  y = 1,
  showarrow = FALSE)# order based on decreasing mean abundance and group by Phylum, filter for desired variable (here plant compartment) and pass into plotly function
p1 <- df %>% 
  mutate(Phylum=fct_reorder(Phylum, Abundance, .fun='mean', .desc=T)) %>% 
  group_by(Phylum) %>% 
  filter(Compartment == "Bulk") %>% 
  plot_ly(x = ~Treatment, 
          y = ~Abundance, 
          color = ~Phylum, 
          colors = "Dark2",
          type = "bar", 
          legendgroup = ~Phylum, 
          showlegend = F)  %>%
  layout(barmode = "stack", legend=list(title=list(text='Phylum')), 
         annotations = a, xaxis = list(autorange = "reversed"))# repeat previous step for second variable 
p2 <- df %>% 
  mutate(Phylum=fct_reorder(Phylum, Abundance, .fun='mean', .desc=T)) %>% 
  group_by(Phylum) %>% 
  filter(Compartment == "Rhizosphere") %>% 
  plot_ly(x = ~Treatment, 
          y = ~Abundance, 
          color = ~Phylum, 
          colors = "Dark2",
          type = "bar", 
          legendgroup = ~Phylum, 
          showlegend = T)  %>%
  layout(barmode = "stack", legend=list(title=list(text='Phylum')), 
         annotations = b, xaxis = list(autorange = "reversed"))# plot subplots 
p <- subplot(nrows = 1, p1, p2, titleX = T, titleY = T, shareX = T, shareY = T, margin = 0.05) 
p

16S rRNA 扩增子测序数据的门水平上相对丰度以降序排列的堆积条形图。

我喜欢用气泡图来代替堆积条形图,在堆积条形图中,气泡的大小代表分类群的丰度。我将在这里用鸟枪法宏基因组学数据用下面的代码来说明这一点。

# load libraries 
library(dplyr)
library(data.table)
library(plotly)# read in file (already converted to df using the [psmelt](https://www.rdocumentation.org/packages/phyloseq/versions/1.16.2/topics/psmelt) function of the phyloseq package)
df <- fread("[https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/meta_relative.csv](https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/meta_relative.csv)")
# convert to factor
df$perc_SWHC = as.factor(df$perc_SWHC )# hide tick labels for x axis, set title (you can do this alternatively directly in the layout using lists)ax <- list(
  title = "soil history",
  zeroline = FALSE,
  showline = FALSE,
  showticklabels = FALSE,
  showgrid = FALSE
)# alternatively pass in phyloseq object and use psmelt function, order based on mean abundance, then split based on desired parameter and pass everything into a plotly functionp <- df %>% 
mutate(Phylum=fct_reorder(Phylum, Abundance, .fun='mean', .desc=T)) %>% split(.$soil_type) %>% 
lapply(function(d) {
    plot_ly(d, 
x = ~perc_SWHC, 
y = ~Phylum, 
text = ~Abundance, 
type = 'scatter', 
mode = 'markers',
size = ~Abundance, 
color = ~perc_SWHC, 
colors = "Dark2",
#Choosing the range of the bubbles' sizes:
sizes = c(10, 50),
marker = list(opacity = 1, sizemode = 'diameter')) %>% 
layout(xaxis = ax,
yaxis = list(showgrid = FALSE))}) %>%
  subplot(nrows = 1, shareX = T, shareY =T, titleX = T, titleY = T, margin = 0.01) %>% 
  layout(legend=list(title=list(text='% SWHC')))
# remove unwanted legends from plot 
for (i in seq(3, length(p[["x"]][["data"]]))) {
  p[["x"]][["data"]][[i]][["showlegend"]] <- FALSE
}
p

鸟枪法宏基因组学数据的相对丰度显示了以平均丰度递增顺序排列的最优势门。颜色显示了第二个类别,在这种情况下,土壤持水能力的百分比被用作模拟干旱与非干旱条件的处理。

关于相对丰度的旁注

关于根据数据的相对丰富程度来解释数据的缺点,一直存在争议;这是有充分理由的,因为一个分类单元丰度的每一次增加都会导致其余分类单元丰度的相应减少。正如加州大学圣地亚哥分校奈特小组的詹姆斯·莫顿所说:

“知道生物体 A 和 B 是否以 80%和 20%的比例存在是一回事,但这些数字是来自 1 亿还是 1 亿个细胞对宿主来说有着巨大的差异。”(更多信息请查看唐磊的评论和声明背后的论文)。

这就是说,相对丰度数据应仔细解释,从这些数据中推断准确的分类转变时必须谨慎。

让我们通过观察β多样性来继续典型微生物组分析的下一步。β多样性衡量从一个环境或样本到另一个环境或样本的物种多样性变化。这通常以散点图或 PCoA/NMDS 图(主坐标分析/非公制多维标度)的形式示出,其中样本基于它们的相似性或不相似性被分离,并被排列在低维 2D 或 3D 空间中。不同的指数可用于计算相异矩阵。关于这方面的更多信息,请查看 r . com 中的 distance { phyloseq } pr design dist { vegan }文档。

# load libraries 
library(dplyr)
library(data.table)
library(plotly)# load file (in this case I calculated the matrix based on Bray-Curtis dissimilarity using the ordinate function of the phyloseq package and converted it to a df, then merged the df with the sample metadata)df <- fread("[https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/pca_16S.csv](https://raw.githubusercontent.com/ruthlys/files_plotlyr/master/pca_16S.csv)")# create axis annotation
x <- list(
  title = "Axis 1"
)
y <- list(
  title = "Axis 2"
)# plot 2d plot with color settings and text annotations 
p1 = plot_ly(df, 
                 x= ~Axis.1, 
                 y= ~Axis.2, 
                 color = ~Compartment, 
                 colors = "Dark2", 
                 mode = "markers", 
                 type = "scatter",
                 text  = ~Compartment,
                 alpha = 0.8,
                 marker = list(size = 12)) %>%
  layout(xaxis = x, yaxis = y)
p1# plot 3d plot with color settings and text annotations 
p2 <- plot_ly(
  df, 
  x = ~Axis.1, 
  y = ~Axis.2, 
  z = ~Axis.3, 
  color = ~Compartment, 
  colors = "Dark2", 
  text = ~Treatment, 
  mode = "markers",
  type = "scatter3d")
p2 <- p2 %>% layout(scene = list(xaxis = list(title = 'Axis 1'),
                                   yaxis = list(title = 'Axis 2'),
                                   zaxis = list(title = 'Axis 3')))p2

基于 Bray-Curtis 指数计算相异矩阵后的 16SrRNA 扩增子测序数据的 2D 散点图(NMDS 图)。

基于 Bray-Curtis 指数计算相异矩阵后,16SrRNA 扩增子测序数据的 3D 散点图(NMDS 图)。

暂时就这样了。我希望本教程对你有用,并且对你自己的数据分析和可视化有所帮助。请继续关注更多关于如何使用 Plotly 的 R 图形库、Dash for R 和 Dash Bio 可视化组学数据的教程!

如何在两个月内从 Python 新手成为 Google 认证的 TensorFlow 开发者

原文:https://towardsdatascience.com/how-to-go-from-a-python-newbie-to-a-google-certified-tensorflow-developer-under-two-months-3d1535432284?source=collection_archive---------0-----------------------

在疫情期间感到无聊,我决定挑战自己,学习 Python,并在两个月内获得 Google 认证为 TensorFlow 开发人员。下面是我的故事和我的学习之路。

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

作者照片。

我仍然记得我向大学提交论文的那一天。当我的学士学业接近尾声时,我如释重负地叹了口气。然而,厌倦很快征服了我。无事可做,世界被疫情吞噬,我拼命寻找新的活动来填补我空虚的日子。

在这篇文章中,我将告诉你这种疫情的无聊是如何让我在不到两个月的时间里成为谷歌认证的 TensorFlow 开发者的,尽管我以前从未用 Python 编码过。我提供了一份我用来准备这次考试的相关学习材料的清单。

我张量流’起源故事’

作为一个喜欢学习的人,我的好奇心促使我阅读了大量关于疫情的新闻和文章,当时我偶然发现了一篇关于一组研究人员开发一种新系统的文章,该系统可以在 X 射线图像中区分肺炎和新冠肺炎病毒。

文章提到,他们使用“人工智能”和“神经网络”来制作系统。这立刻激起了我的兴趣——他们如何训练一个可以区分 x 光扫描的系统?这个人工智能甚至没有医学学位,但它有超过 90%的准确率!就这样开始了我深入学习的兔子洞之旅。

长话短说,和一个朋友的简短对话让我对 TensorFlow(和 Keras)大开眼界。又一天的好奇浏览让我读了丹尼尔·伯克的博客,关于他如何获得 TensorFlow 开发者认证的。

我也挑战自己去获得认证,但我担心我没有足够的时间,因为我马上就要被雇用了,而且几乎同时开始我的硕士学位课程。再者,我对 Python 一窍不通。我真的能完成这个壮举吗?

我本科学习的是精算学的应用数学,这意味着我非常熟悉微积分、回归、时间序列和统计学。然而,我的 Python 编程技能很少,因为我知道的唯一编程语言是 R。虽然我发现 R 是一种非常通用的语言,可以满足数据相关工作的需求,但不幸的是,目前语言 R 不支持 TensorFlow 开发人员认证考试。

作为一名自称的数据和人工智能爱好者,获得这项认证将是我旅程中的一个里程碑。好了,我的故事讲完了。再说 TensorFlow。

什么是张量流?为什么要学?

TL;DR 版本:TensorFlow 是一个广泛可用的机器学习软件库。

略低的 TL;DR 版本:TensorFlow 是一个免费的开源框架,使用户能够开发端到端的机器学习和深度学习项目,从预处理到模型训练和部署。它最初是由谷歌大脑团队开发的,供谷歌内部使用,但现在它的使用已经非常广泛。

现在,你为什么要学习 TensorFlow?因为它能做很多事情,而且比你想象的更广泛。很有可能,你在不知情的情况下使用了 TensorFlow 提供的服务。

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

展示 Gmail 智能回复如何工作的 gif 图片。图片来自 Greg Bullock (2017),来自文章“在 Gmail 中使用智能回复节省时间”。https://blog . Google/products/Gmail/save-time-with-smart-reply-in-Gmail/。来源:谷歌

你用过 Gmail 的 Smartreply 吗?它是人工智能驱动的,并根据你电子邮件上写的内容向你建议三种回答。它是使用 TensorFlow 构建的。

你的推特时间表的排序方法?WPS Office 的 OCR(图像转文本识别)?VSCO 的为你的照片预设建议?张量流。

写这篇文章的时候,TensorFlow 只有 4 年的历史,它已经在我们日常使用的许多服务和产品中广泛使用。虽然没有明确写下,但开发图像识别系统以区分常规肺炎和新冠肺炎肺炎的研究人员有可能在他们的系统中使用 TensorFlow。

在未来,随着深度学习和人工智能领域的改善,我们可能会看到越来越多的产品、服务以及科学突破,这些产品、服务和科学突破都是由 TensorFlow 提供支持,以帮助他们进行深度学习。

如果这些领域的从业者熟悉这个平台,他们就会受益,这种思路也是我自己有兴趣成为认证 TensorFlow 开发者的原因。也许,你在阅读这篇文章之前或期间有类似的想法,或者也许你也有自己的理由去研究张量流。尽管如此,请继续阅读下一部分,了解更多关于考试的信息。

什么是 TensorFlow 开发者证书考试?这要花多少钱?

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

TensorFlow 数字徽章。图片摘自文章:“介绍 TensorFlow 开发者证书!“阿丽娜·辛卡斯基。来源:TensorFlow

TensorFlow 开发者证书考试是笔试,必须用 Python 语言完成。在考试中,我们利用 Python 的 TensorFlow 库及其 API。每次考试费用为 100 美元。如果你第一次试用失败,你可以再次支付 100 美元,并在两周后重考。关于考试费用和规则的更多细节可以在手册这里找到。

考试大纲包括四个要点:使用 TensorFlow 建立和训练神经网络,图像分类,自然语言处理,以及时间序列。考试必须在 Pycharm IDE 中进行。

看完手册后,我开始计划我的学习路径,从学习 Python 语言本身开始,然后熟悉 TensorFlow。

我的学习之旅:第一个月

如果你还和我在一起,或者如果你跳过了阅读这篇文章,那么让我简单地提醒你一下。一个无聊的应用数学毕业生,无事可做,没有任何 Python 经验,突然梦想在两个月内成为 TensorFlow 开发人员。以下是我实现这一目标的历程。

在第一个月,我熟悉了 Python 语言。我如何快速地做这件事?我做的第一件事是去 hackerrank ,并立即用大量的 Python 问题进行练习。当我遇到自己无法解决的问题时,我会试着在旅途中上网查找解决方案。如果这也没有帮助,我查看了解决方案,并试图理解我在这个问题中可以掌握的概念。

这就是我两个星期所做的一切,到那时,我能够回答大多数问题,甚至是那些难度更高的问题,而不需要看任何答案。

剩下的两周我做了什么?我看免费的 YouTube Python 教程。你没听错。

好吧,免责声明来了。如果你有机会以一种更结构化的方式学习正式的 Python 课程,请务必这样做。下面我列出的三个视频只是我个人的选择,加速我的 Python 学习之旅。

这些视频之所以被如此低估,仅仅是因为它们是“免费”的,而你完成它们并没有获得任何证书。以下是几个不错的选择:

  • 《Python 初学者教程》用 Mosh 编程。这个视频简明清晰地重述了 Python 的基本概念,从字符串、操作、函数、数据类型(列表、字典、元组)、继承开始,然后通过制作三个初学者友好的项目结束视频。第二个项目与我的道路最相关,因为它是关于机器学习的。

  • 《Python for Data Science 全教程》edu reka!本视频涵盖了 Python 中的必要包,为数据科学打下坚实的基础。在视频的最后,他们简要地谈到了使用 Keras 和 TensorFlow 在 Python 中进行深度学习,所以这让我对即将发生的事情有了一个初步的了解。

  • freeCodeCamp.org《用 Python 分析数据》。在我们制作模型和训练它们之前,一个经常被忽视的阶段是预处理我们的数据。这个视频更多地集中在上述部分,并强调收集数据,加载它们,清理它们,以及使可视化,以得出见解。

虽然在我接下来的研究中,我会注册一个“正式”的 Python 课程,但这三个 YouTube 视频现在已经足够了。只要确保做笔记,写你自己的代码,以及在你观察的时候尝试不同的东西。

我的学习之旅:第二个月

我花了一个月的时间参加深度学习。Coursera 的 AI TensorFlow 开发者专业证书。在本课程中,我们将接受谷歌首席人工智能倡导者劳伦斯·莫罗尼和 deeplearning.ai 创始人吴恩达的辅导

这个专业有四门课程,涵盖了前面提到的考试大纲的四个要点。每门课程包括四周的课程,但我一天学了一周的课程,因为这是我那个月的首要任务。

完成每门课程后,我会休息一天,利用这一天来研究我的练习代码,或者以休闲的方式探索与课程相关的想法。

概括地说,我花五天时间完成每门课程。四天查看课资料,第五天休息复习。因此,我能够在 20 天内完成所有的课程。

每门课程都有自己的编码项目,我真的探索提供的代码。我经常发现自己花了几个小时摆弄神经网络的超参数(当你开始学习它时,你就会知道我在说什么),以便尝试并获得最佳的验证准确性。通过这样做,你会对创建深度神经网络模型的试错过程有一种“直觉”。

有时,课程参考了外部资源,如数据集、文章和未分级的材料。这些并不是通过这门课程的必要条件,但出于好奇,我探索了许多外部资源。由于课程大多是实践性的,我们经常会看到吴恩达制作的视频链接,他在视频中解释了特定主题的更直观和理论化的方法。

替代材料

为了在这次考试中取得成功,你不一定要遵循我的学习路径和我的学习材料。如果你不想每月花 49 美元来学习 coursera 课程,还有其他选择,我会在这里列出来:

  • 用 Scikit-Learn、Keras 和 Tensorflow(第二版)实践机器学习。这本书是我想在未来几个月内完全阅读并完成的东西,因为它的全面性真的有助于我理解关于机器学习和深度学习的关键概念。第 10-16 章包含了与考试大纲相似的材料。
  • 编码 Tensorflow Youtube 播放列表。这是一个免费的 YouTube 播放列表,包含了这次考试的材料,大部分是由劳伦斯·莫罗尼教授的。我更喜欢参加 coursera 认证,因为它有额外的评分测验和项目,但如果你敢于根据 YouTube 播放列表中的材料进一步探索,我认为你会得到很好的帮助。不要忘记在他们的官方网站上查看 Keras 和 TensorFlow 文档。

参加考试

我花四天时间复习功课,在完成所有课程后重读手册。第二个月 25 号,开始考试。

好了,登陆日到了。好的,这是第一个问题的答案——开玩笑的。由于显而易见的原因,我无法了解考试的详细信息,但我整理了一些关于准备和参加考试的要点:

  1. 首要任务—安装所需的 Python IDE。在我的考试迭代中,我们被要求使用 PyCharm 。确保下载正确的版本(参考手册)并禁用/卸载其他第三方插件。快速提示:在开始测试之前,我会先测试我的 PyCharm,运行一些 TensorFlow 模型,看看是否有任何错误需要解决。
  2. 报名参加考试这里。完成付款并上传您的 ID(身份证/护照)。之后,你会收到另一本手册,这本手册只留给那些已经付费并注册参加考试的人。好好复习,确保你在考试开始前准备充分。
  3. 考试是五个小时。明智地管理你的时间。当你的问题模型正在被训练时,你可以开始处理下一个问题。在您的模型被训练和保存后,不要忘记提交和测试您的模型(安装考试插件后,您的 IDE 将有一个“测试和提交模型”按钮)。
  4. 首先集中完成所有问题,然后如果您有时间,您可以回去调整您的模型。记住,有时间限制。只要你的模型得了满分,你就可以走了。
  5. 可以在 Google Colab、AWS 等外部平台上训练模型。在开始考试之前,你应该学习如何从外部平台保存你的模型,然后在 PyCharm 中加载它。您必须以“. h5”格式保存您的模型。

如果你学得很好,并且确信你已经学完了考试大纲中列出的所有东西,你应该会通过考试。我可以告诉你,手册上写的大纲没有误导,你真的可以用那里提供的列表作为你考试准备的基准。

就我个人而言,我在没有专用 GPU 的 AMD 笔记本电脑上进行考试,但我只需要在处理大型数据集的问题时使用一次 Google Colab。在你的设备上训练几个练习模型,你就会知道你的设备是否足够强大。我更关心互联网的速度和稳定性,因为你需要上传这些模型来完成考试。

考试成绩

结束考试后,我马上收到一封邮件,说我已经通过考试了。两周内,我的官方数字证书发送到我的邮箱,我可以把它链接到我的 LinkedIn 个人资料。

有效期只有三年,所以我要在 2023 年再考一次认证考试。到那时,我只能对 TensorFlow 和深度学习领域的进步感到惊讶,希望我参加那个考试的旅程比第一次更顺利。

结论…然后下一步是什么?

这不是结束,事实上对我来说这只是开始。将这次考试作为我的第一个里程碑真的让我超级兴奋,并且是我进入数据科学世界的大门,这很奇怪——因为通常深度学习是有抱负的数据科学家的最佳选择。

我很高兴在我开始精算工作和攻读硕士学位的前几天,我设法完成了这个证书考试并写了这篇文章。通过这两个月,我对数据科学和人工智能的世界产生了新的兴趣。这个领域可能带来的解决现实世界问题的可能性似乎是无穷无尽的。

我要写一个提醒,我相信我的学习之路并不是最好的,还有很大的提升空间。对于那些不受时间限制的人来说,也许放慢速度,同时做项目是更好的学习途径。至于现在,即使我是一名认证的 TensorFlow 开发人员,我还没有在我的 GitHub 帐户上做一个项目。这就是我在这篇文章发表后的目标——通过制作真实的个人项目并把它们放到我的 GitHub 上来进一步提高我的技能。

作为一个充满创新、发现和突破的快速增长的领域,我相信人工智能、数据科学、机器学习和深度学习的世界是一个等待探索的新领域。冒险来到这个世界,你兴奋吗?因为我是。而对我来说,这一切都是从疫情期间的无聊开始的。

如何从贝叶斯定理到贝叶斯推理

原文:https://towardsdatascience.com/how-to-go-from-bayestheorem-to-bayesian-inference-2a75ac64ec07?source=collection_archive---------11-----------------------

当我还是一名统计学新手并试图学习贝叶斯统计时,我经常发现开始时非常混乱,因为大多数在线内容通常以贝叶斯公式开始,然后直接跳到贝叶斯推理的 R/Python 实现,而没有给出多少关于我们如何从贝叶斯定理到概率推理的直觉。因此,我希望这篇文章能够真正填补我们在简单公式和完全不同层次的贝叶斯研究之间的空白,用尽可能少的数学。具体来说,我想谈谈

  • 一个经典贝叶斯公式例子背后的直觉,以及为什么在理解贝叶斯推理中没有用
  • 贝叶斯推理在实践中是如何工作的
  • 概率分布和似然之间有什么区别,这是贝叶斯推理中的两个主要组成部分(因此我们将知道先验和似然之间的区别)
  • 我们如何能够忽略计算的分母和命名的贝叶斯公式在实践中的大部分时间与一个简单的现实生活中的例子在后验模型,以估计股票市场的回报。

一个经典贝叶斯公式示例背后的直觉

我想再次重申,在这里我将专注于直觉而不是数学。

贝叶斯定理通常从癌症检测中的一个例子开始。在这篇文章中,没有例外。高中/本科学习这个公式的时候,总会给你一些事件的概率,计算另一些事件的概率。

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

你经常看到的贝叶斯公式

比如我们会提前知道某人得癌症的概率,像 P(癌症)=0.1 。这意味着如果我们从这个国家随机抽取一个人,10%的人会得癌症。有了新的癌症检测技术,它可以提供更准确的信息,更新我们对一个人是否患有癌症的信念。幸运的是,有了贝叶斯公式,我们可以量化我们在确定一个人是否患有癌症方面有多少把握。

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

以前,如果我们对一个人进行随机抽样,我们只有 10%的把握确定他患有癌症,这是我们的先验信念。借助新的测试技术和数据(可能性),我们将确定性提高到 66%。这是获得贝叶斯定理背后的直觉的一个很好的开端,但有可能你这辈子再也学不到这个了,因为这个公式毫无用处,原因有二。

1。公式的每一部分都有不确定性

首先,先验、似然、分母在现实生活中都是不确定的。我们永远无法确切知道我们的人口中有多少%患有癌症,我们所能做的最好的事情就是做出一个有根据的猜测。

在统计领域,每当我们试图对不确定性建模时,我们称之为概率过程(相对于确定性过程)。我们将用概率分布对事件建模。

因此,对于先验(又名多少人患有癌症),为了量化我们的信念,我们将不对概率本身设定一定的值,而是对产生概率分布的参数设定一定的值

我们使用的概率分布取决于我们试图估计的变量/参数。如果我们要估计某件事情发生的概率(也称为离散变量),我们可以使用二项式或泊松分布。另一方面,如果我们要估计股票收益(也称为连续变量),我们可以使用正态/学生 t 分布。

因此,在现实生活中,我们不会说 P(stock_up)=0.1,在贝叶斯统计中,我们会说“作为一名金融专家,我根据经验猜测,未来 12 个月的股票回报将遵循均值为 30%、方差为 5%的正态分布,我希望用我们后来获得的新数据来更新这一经验(先验)。

然后,你就有了理解贝叶斯推理的良好开端。

2。贝叶斯统计是关于概率函数的乘法,而不是实数

我们确定先验总是被建模为概率分布。概率分布总是有一个概率质量函数(对于离散变量)或概率密度函数(对于连续变量)。在我们的股票回报的例子中,先验分布是一个正态分布,一个已知的均值和方差作为我们的猜测。

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

正态分布的概率密度函数,这将作为我们的先验分布

在现实生活的贝叶斯统计中,我们经常忽略分母(上式中的 P(B )),不是因为它不重要,而是因为它在大多数情况下无法计算。我将跳过为什么计算它如此困难的讨论,但请记住,即使没有分母,我们也有不同的方法来计算/估计后验概率。

这使得我们的“现实生活”贝叶斯统计只有两个组成部分,可能性和先验。

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

似然函数也遵循与先前相似的方式。我们还将假设可能性函数的概率分布。但是,我们不是对参数进行猜测,而是让数据来确定将用于生成似然函数的参数值。生成似然函数后,我们可以将似然函数与先验函数相乘,得到后验函数。

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

正态分布的似然函数

在现实生活中,与教科书中的癌症例子不同,在贝叶斯统计中,我们不是对我们的可能性概率有一个确定的值,而是说“我作为一名数据分析师,从股票市场收集了许多数据,并得出股票回报遵循正态分布的结论。根据我收集的数据,最有可能的是均值为 10,方差为 2。我们将利用这一点来更新我们先前的信念”

为了有一个短暂的停顿和总结,我们可以看到,在实践中,我们将两个概率函数相乘并产生一个后验概率函数,它被证明是一个概率分布,它代表了对我们先验知识的更新信念。在股票市场回报的例子中,这意味着我们对关于股票市场回报的参数(也称为均值和方差)有一个初始的信念(先验)。有了额外的数据,我们收集并量化为可能性,我们进一步更新我们对均值和方差(后验)的信念。

但是当我研究这个问题的时候,上面的解释只是给出了更多的问题而不是答案。似然和概率分布有什么区别?上面显示的公式看起来很复杂,我如何推导后验分布的公式/概率密度函数?这是否意味着我需要成为一名概率专家才能实现哪怕是一个基本的贝叶斯模型?

我向你保证,我们就快到了。让我们继续吧。

概率和可能性之间的差异

让我们退一步,再来谈谈高中数学。当我们开始学习概率的时候,我们会有一个抛硬币的例子。假设我们有一个公平的硬币,我们假设 P(头)=0.5。这意味着伯努利分布,参数p已知为 0.5。

这个例子非常适合我们之前的组件,我们将假设某个值作为我们的参数(在正态分布中,参数是平均值和方差,以防您不将它们联系在一起)。

在高中数学中,我们知道参数,我们试图计算某些数据出现的概率。但是在现实生活中,我们很可能想做相反的事情。通常我们对自己的参数一无所知,会有满手的数据,想要对自己的参数值做出推断(估计)。似然函数正是为此目的而设计的。

让我们再次以抛硬币为例。我们没有事先知道抛硬币是否公平,而是不做任何假设,一直把硬币抛 100 次。结果正好是硬币有头的 50 倍,有尾的 50 倍。然后我们得出结论,通过设置 P(head)=0.5,将最大化这种数据模式出现的概率。

直观的说,而概率设置参数 fix,估计数据的概率,是可变的。在似然度中,我们设置数据修正,并改变参数,直到我们找到最佳参数,该参数提供生成这种数据集的最佳模型。

这就是为什么当我们处理概率和可能性时,它们会在函数中表现出相似的形式。但是用数学术语来说,它们具有完全不同的性质。

稍作停顿和总结,我们可以看到,在实践中,我们有一个固定参数的先验和一个参数完全由(1)我们选择的概率分布和(2)我们拟合到概率分布中的数据决定的可能性。

贝叶斯统计更棒的是,我们可以将一个离散(连续)先验乘以一个连续(离散)似然。我们在 prior 和 likelihood 中选择的概率分布可以是随机的,并根据我们的使用情况进行调整,这要归功于它们都有一个概率密度函数,我们可以用纸张或计算统计来相乘和求解。

说到解数学方程,让我们再来看看股票回报的例子。我们有一个单变量正态先验和一个单变量正态似然,当我们试图将它们的函数相乘时,实际上有一个很好的解,它是一个正态反卡方分布,均值和方差等于

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

【https://en.wikipedia.org/wiki/Conjugate_prior

如果我们访问维基百科,我们可以看到不同概率和可能性的不同可能组合的列表。以及我们如何能够使用不同的概率分布来模拟最终的后验概率。基本上,我们只需要使用 wiki 中显示的后验分布,并插入我们从可能性和先验中获得的参数值,就会生成作为后验分布的更新信念。这种技术被称为共轭先验。这将节省我们在纸上解决数学问题的大量时间。

但是共轭先验只能处理最基本的概率分布模型。如果我们有一个 100 多元的正态分布作为我们的先验呢?在这种情况下,不可能推导出后验概率的数学形式解。

在实践中,我们如何能够忽略贝叶斯公式的分母和分母的计算

事实证明,我们真的不需要在我们的命名符中计算乘法,也不需要计算分母。

因为我们有计算给定数据集(X = x1,x2 … xt)的先验和似然性所需的一切,所以我们可以从数据集(x1)中随机选取一个样本,计算似然性和先验值,并将它们相乘以生成随机样本后验密度。

作为一个提醒,我已经简单地提到了后验概率保证是一个概率分布(成熟的数学,老实说,我并不完全理解,但它是经过验证的),因此当我们说计算后验概率时,我们指的是概率密度的计算,它描述了一个参数(例如股票回报的平均值)在给定数据集的情况下出现的可能性。

如果我们对可能性和先验无限量的时间进行采样,我们生成的后验密度值将形成真实后验概率分布的非常好的近似。

这种抽样技术被称为马尔可夫链蒙特卡罗 ( MCMC )方法。在 MCMC 上有几种实现,包括随机游走 metropolis 和哈密顿蒙特卡罗。类似于深度学习,其中某些激活功能通常优于其他功能。在 MCMC 中,已知无 U 形转弯采样器(从哈密尔顿蒙特卡罗得到)是最好的实现。

因此,MCMC 不会帮助我们解决贝叶斯统计中的所有问题,而只是在我们无法计算后验分布的情况下实现后验分布。为了有一个实际的用例,我们仍然需要确定先验和似然的概率分布,并自己拟合数据。

这实际上是使用贝叶斯统计的一个优势,我们通过显示我们选择的先验和似然概率分布,预先使我们的假设非常清楚,这些假设可以帮助我们更好地理解模型的不确定性。

更好的是,得到的后验分布是一个概率分布,这意味着我们可以尽可能地从字面上理解它,并得出某个事件在未来发生的概率很大的结论,而不是使用一些令人困惑的评估方法,如置信区间。

在 python 中,P ystanPyMC 都旨在为我们运行 MCMC。我们唯一需要提供的是先验和似然函数,以及用于似然估计的先验参数和数据。

股票回报的全面检查

再次假设,我作为一名金融专家,知道在过去几年中,未来 12 个月的整体股市回报总是遵循均值等于 30%、方差等于 5%的正态分布。然而,对于 covid19,这一假设是不可靠的,我的同事是一名数据专家,他不同意我的观点,但温和地承认,我先前的观点对于估计 covid 情况稳定后未来 12 个月的股票回报是有用的。

我的同事花了几天时间收集银行和科技等不同行业的股票回报数据,他也使用正态分布来描述 covid 19 下的股票回报,均值等于 10%,方差也等于 10%。

使用共轭先验或 MCMC(假设我们有一个多元正态分布,它将股票收益进一步细分到每个部门,那么 MCMC 将是必要的),我们能够计算后验概率分布。

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

我们可以看到,在 covid 情况稳定后,平均回报率约为 22–23%。

由于后验也是一种概率分布,我们可以根据给定的概率,对均值和方差的取值范围进行有根据的猜测。然后,你的团队老板可以考虑发生几率不同的情况,并为未来可能出现的负面风险做好准备。

我希望这可以很好地总结贝叶斯统计背后的直觉,以及为了在实践中使用它或详细研究它而需要做的所有准备工作。

如何进行主成分分析

原文:https://towardsdatascience.com/how-to-grok-principal-component-analysis-e7bb4510ed7?source=collection_archive---------44-----------------------

巨大的知识给了我们超能力。

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

国家癌症研究所Unsplash 上拍摄的照片

乔·考克在 1970 年的《疯狗和英国人现场》双张专辑的内折中,将此次巡演的音乐总监利昂·拉塞尔描述为“时空大师”那张照片给我留下了深刻的印象。

操纵数据让我觉得自己是时空大师。处理时序数据和多维数据框是对空间和时间的流畅处理。

降维是对空间和时间的终极操控。

你知道《传道书》中的那句话吗?太阳底下没有新事。机器学习和人工智能确实是天底下的新事物。

这些算法,加上个人电脑、云计算和对海量数据的访问,给了我们巨大的新力量。我们都离超级大国只有一段可以跨越的训练距离。

Grok 是科幻作家罗伯特·A·海因莱因在他 1961 年的小说《异乡客》中创造的一个词。它意味着凭直觉理解某事,并建立融洽关系。

有时障碍似乎势不可挡。在这篇文章中,我想分享我对流水线过程的一个部分的见解:主成分分析(PCA)。

PCA 是机器学习、人工智能和统计分析管道中的关键步骤。

PCA 对你来说是一个具有挑战性的课题。在这里,我描述了我灵光一现的时刻。

这篇文章不是一篇综述性技术文章;这是概念性的。一旦你有了背景知识,技术细节就更有意义了。

这里我用数量金融学作为一个应用来描述 PCA。主成分分析和降维是数量金融学的基础。

主成分分析在许多其他领域和领域中是至关重要的,在这些领域中,您试图使用已知数据来预测结果。希望这个概述对你有帮助。

一些因素解释了一个结果,我们试图找到它们。我们将这些因素建模为电子表格式矩阵中的行。为了操作它们,我们使用线性代数的向量和矩阵的数学。

在 Python 中,我们使用 Pandas 将这些数据集存储为数据帧和序列。我们使用线性代数的矩阵数学来处理熊猫的数据帧。

这些计算机文件的大小会变得很大,处理起来很麻烦。

为了使它们更易于管理,我们减小了尺寸。我们使用 PCA 来分析矩阵中的哪些向量对我们正在建模的结果贡献最大。

我们的目标是从过去的数据预测未来的结果。我们在噪音中寻找信号。我们从过去寻找对未来有预测力的信息。我们希望提取这些信息,并对其预测能力进行排名。

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

Unsplash 上由 Austin Distel 拍摄的照片

在量化金融中,我们要预测股票未来的价格走势。根据我们的因素进行投资。

我们称这些因素为阿尔法因素。

我们通过消除对预测能力贡献不大的因素向量来减少数据集的大小。

每行数据都是多维线性代数空间中的一个向量。有些向量增加了价值,有些向量是多余的或不重要的。我们的目标是降维。

PCA 是我们用来进行降维的工具。我们输入数据集和我们想要保留的预测能力。PCA 算法处理这些数字。它提供了一组按贡献大小排序的最有效的向量。

当我想到它像线性回归时,我第一次明白了 PCA 是如何工作的。线性回归需要两个变量,一个自变量和一个因变量。它会在所有数据点之间绘制一条最接近的直线。这是大量的迭代数字运算,但对计算机来说很容易快速完成。

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

线性回归直线拟合。

PCA 的工作原理类似。它绘制了前两个变量,并在它们之间拟合了一条线。

该 PCA 线与线性回归线具有不同的属性。PCA 不是针对距离进行优化,而是将点投影到直线上,并针对它们之间的距离进行优化。这个距离就是方差。

我们使用散点图来绘制所有点,并直观地估计直线可能如何倾斜。

这条线有一个斜率,就像线性回归一样。

这条新线然后成为新坐标系的 X 轴。然后 PCA 查看下一个变量,并将其绘制成与新计算的 X 轴正交(垂直)。第二次迭代成为新的 Y 轴。它运行相同的优化,并沿 Y 轴投影这些点。

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

散点图的 PCA 直线拟合。

对我来说,那是“啊哈”的一刻。我意识到这是一种旋转,基于通过数据创建一条线,就像线性回归一样。

X 轴和 Y 轴的旋转表示空间的变换坐标系。这个变换表示一组数字,将原始空间的 x 和 y 分量转换到这个变换后的空间。这个转换的空间是为这个特定的数据集优化和定制的。

散点图中的点仍在同一位置。但是我们用来标识它们位置的数字现在需要在新的坐标系中表示。

平移的数字和过程,以及它们所代表的向量,称为特征向量和特征值。

在运行 PCA 之前,需要对数据进行归一化处理。归一化是减去两个变量的平均值,使数据位于原点(0,0)附近。这是特征向量的标准,原点保持不变。

帮助你掌握线性代数和特征向量的一系列精彩视频是 3Blue1Brown。

强烈推荐按顺序看剧集。

PCA 遍历所有的数据向量,并将它们作为多维空间中的额外维度进行绘制。主成分分析给出了排名和有多少向量贡献。然后,您可以在进行因子分析时校准要使用的数量。

L 让我们更详细地探讨一下旋转在概念上代表了什么,以及这对执行 PCA 的数据科学家来说意味着什么。

自动减少数据集列数的方法称为降维。最流行的方法之一是主成分分析或简称 PCA。

数据科学中的 PCA 是流水线中的一个处理步骤。我们希望降低数据集的复杂性,为以后在管道中执行的过程做准备。

PCA 是一种降维技术,可以将高维向量映射到低维空间。

我们希望在保留信息含义的同时降低复杂性。在主成分分析的情况下,信息以方差的形式出现:数据变化的程度。降低复杂性也降低了聚合错误的脆弱性。

一个数据集可以有数百、数千或更多的列和行。每一列或每一行都可以是一个特征。一些特征在它们对目标的预测能力方面比其他特征更相关。

PCA 处理的矩阵也可以是优化约束的一部分。

从包含不相关特征的数据中构建的模型既麻烦又容易出现累积误差。这些模型也容易过度拟合训练数据。与根据最相关的数据训练的模型相比,它们的构造很差。

随着矩阵中元素的增加,矩阵中要计算的数量呈指数增长。

例如,3000 维的矩阵有大约 450 万个元素要计算和跟踪。一个 70 的矩阵大约有 2500 个量要估计。规模差别很大,引入估计误差的机会要少得多。

PCA 是降低数据集、模型和训练复杂性的优化过程。

诀窍是找出数据的哪些特征是相关的,哪些是不相关的。

主成分分析将数据压缩成保留数据核心信息的格式。核心信息是原始数据在其列或行之间的差异。

PCA 是一系列的计算,为我们的数据集提供了一个新的独特的基础。

那么它为什么是独一无二的呢?

PCA 计算新维度,并根据其差异内容对其进行排序。

第一个维度是数据点最分散的维度。数据点在这个维度上的差异最大。

那到底是什么意思?

PCA 在 2D 平面上创建一个新的轴。PCA 计算我们的数据点沿着这个新轴的坐标。它通过将它们以最短的路径投影到新轴来实现这一点。

PCA 以这样的方式选择新的轴,使得新的坐标尽可能地展开。它们有最大方差。坐标扩展最多的线也是最小化每个坐标到新轴的垂直距离的线。

该基础使重建误差最小化。最大化方差和最小化重构误差是密切相关的。

翻译使用勾股定理。

从原点到投影的距离的平方加上从投影到点的距离的平方等于从原点到点的距离的平方。

提取,血统

PCA 提取由数据中的方差表示的模式,并执行维数缩减。PCA 方法的核心是来自线性代数的矩阵分解方法,称为特征分解。

假设我们有一个包含 1000 列的数据集。换句话说,我们的数据集有 1000 个维度。我们需要这么多维度来捕捉数据集的方差吗?大多数时候,我们不会。

我们需要一种快速简单的方法来移除对方差没有贡献的特征。使用 PCA,我们可以在更少数量的转换维度中捕获 1000 个维度的数据的本质。

差异

由列或行表示的 1000 个特征中的每一个都包含一定量的差异。有些值高于平均值,有些值低于平均值。

随着时间的推移保持不变的特性无法提供洞察力或预测能力。

一个特性包含的差异越多,这个特性就越重要。该特征包括更多的“信息”。方差表示特定要素的值在整个数据中如何变化。PCA 根据特征的变化量对特征进行排序。

主成分

现在我们知道了方差,我们需要找到一个能够更有效地解释方差的转换后的特征集。PCA 使用原始的 1000 个特征进行线性组合,将方差提取为新的特征。这些变换后的特征是主成分(PCs)。

主成分与原始特征无关。转换后的特征集或主成分具有第一个 PC 中解释的最显著的变化。第二台 PC 将具有第二高的方差,依此类推。

主成分分析有助于您了解数据中是否有一小部分可以解释大部分的数据观察结果。

例如,第一个 PC 解释了数据中总方差的 60%,第二个特征解释了 25%,接下来的四个特征包含 13%的方差。在这种情况下,98%的方差仅由 6 个主成分定义。

假设接下来的 100 个特征总共解释了总方差的另外 1%。为了增加百分之一的方差而增加 100 个维度是没有意义的。通过取前 6 个主成分,我们将维数从 100 减少到 6。

PCA 按照主成分解释的方差的顺序排列主成分。我们可以选择顶部的成分来解释一个足够值的方差比。您可以选择电平作为 PCA 发生器的输入。

主成分分析能让你深入了解数据集中的差异是如何分布的。PCA 创建了简化的数据集,该数据集在矩阵数学计算中更容易处理以进行优化。PCA 在定量金融中用于建立风险因素模型。

降低维度可以减少可能聚集的误差项的影响。PCA 还通过消除多余的特征来解决过拟合问题。如果您的模型是过度拟合的数据,它将在测试数据上工作良好,但在新数据上表现不佳。PCA 有助于解决这个问题。

结论

PCA 是一种特征提取技术。它是特征工程的一个组成部分。

我们正在寻找更好的模型,具有更强的预测能力,但地图并不是我们的领域。我们正在创造一种失去了一些原始保真度的抽象。诀窍是使 PC 矩阵尽可能简单,但不能更简单。

预测是我们努力渐近接近的一种理想。我们无法达到完美。如果我们努力追求完美,我们就能达到卓越。

Python 内置了 PCA。

Python 的一个很棒的特性,如果你需要更多的东西来证明它是一种强大的数据科学语言,那就是它在 Scikit-learn 中有一个易于使用的 PCA 引擎。Scikit-learn 是一个免费的 Python 软件机器学习库。从 Scikit 导入 PCA 了解并试用它!

PCA 是机器学习中的一个重要工具和组件。我希望这有助于使它更容易成为您的工具包的一部分。

Python 熊猫里如何按时间间隔分组数据?

原文:https://towardsdatascience.com/how-to-group-data-by-different-time-intervals-using-python-pandas-eb7134f9b9b0?source=collection_archive---------1-----------------------

一行程序将时间序列数据组合成不同的时间间隔,例如基于每小时、每周或每月。

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

Unsplash 上由 Aron 视觉拍摄的照片

如果你曾经处理过时间序列数据分析,你肯定会遇到这些问题

  1. 将数据组合成特定的间隔,如基于每天、一周或一个月。
  2. 聚合时间间隔内的数据,例如,如果您正在处理价格数据,那么问题就像一小时或一天内添加的总量。
  3. 基于时间间隔查找数据集中其他要素的模式。

在本文中,您将了解如何使用两个不同的 Pandas API,即 resample()和 Grouper(),通过一行代码解决这些问题。

众所周知,学习一件东西的最好方法是开始应用它。因此,我将使用由世界银行公开数据提供的样本时间序列数据集,并与从 15 个国家收集的众包价格数据相关。有关数据的更多详情,请参考众包价格数据收集试点。在本练习中,我们将使用为阿根廷收集的数据。

📚资源: Google Colab 实现 | Github 仓库 | 数据集📚

数据集详细信息

这些数据是由参与世界银行 2015 年调查的不同参与者收集的。调查的基本想法是收集不同国家不同商品和服务的价格。出于演示目的,我们将只使用数据集中的几列——

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

按作者分类的数据集示例片段。

基于不同的时间间隔组合数据。

Pandas 提供了一个名为 resample() 的 API,可以用来将数据重采样到不同的区间。让我们来看几个例子,看看我们如何使用它—

每小时添加的总量。

假设我们需要知道一个贡献者在一个小时内增加了多少,我们可以简单地使用——

# data re-sampled based on an hour
data.resample('H', on='created_at').price.sum()# output
created_at
2015-12-14 18:00:00     5449.90
2015-12-14 19:00:00       15.98
2015-12-14 20:00:00       66.98
2015-12-14 21:00:00        0.00
2015-12-14 22:00:00        0.00

这是我们正在做的事情—

  1. 首先,我们为日期列(即 created_at)将数据重新采样为一个小时“H”频率。我们可以使用不同的频率,我将在本文中介绍其中几种。查看熊猫时间频率获得完整的频率列表。甚至可以达到纳秒。
  2. 之后,我们从重新采样的数据中选择“价格”。稍后,我们将看到如何在一个命令中聚合多个字段,即总金额、数量和唯一的项目数。
  3. 计算所有价格的总和。这将给出该小时内添加的总量。

默认情况下,时间间隔从一个小时的第 0 分钟开始,如 18:00、19:00 等。我们可以改变它,从一个小时的不同分钟开始,使用偏移量属性,比如—

# Starting at 15 minutes 10 seconds for each hour
data.resample('H', on='created_at', offset='15Min10s').price.sum()# Output
created_at
2015-12-14 17:15:10     5370.00
2015-12-14 18:15:10       79.90
2015-12-14 19:15:10       64.56
2015-12-14 20:15:10       18.40
2015-12-14 21:15:10        0.00

请注意,您需要 Pandas 版本大于 1.10 才能使用上述命令。

每周添加的总量。

在本例中,我们将了解如何基于每周对数据进行重新采样。

# data re-sampled based on an each week, just change the frequency
data.resample('W', on='created_at').price.sum()# output
created_at
2015-12-20    4.305638e+04
2015-12-27    6.733851e+04
2016-01-03    4.443459e+04
2016-01-10    1.822236e+04
2016-01-17    1.908385e+05

默认情况下,一周从周日开始,我们可以将其更改为从不同的日期开始,也就是说,如果我们希望基于从周一开始的一周进行合并,我们可以使用—

# data re-sampled based on an each week, week starting Monday
data.resample('W-MON', on='created_at').price.sum()# output
created_at
2015-12-14    5.532860e+03
2015-12-21    3.850762e+04
2015-12-28    6.686329e+04
2016-01-04    5.392410e+04
2016-01-11    1.260869e+04

每月添加的总量。

这类似于我们在前面的例子中所做的。

# data re-sampled based on each month
data.resample('M', on='created_at').price.sum()# Output
created_at
2015-12-31    1.538769e+05
2016-01-31    4.297143e+05
2016-02-29    9.352684e+05
2016-03-31    7.425185e+06
2016-04-30    1.384351e+07

此处需要注意的一点是,每个月的输出标签基于该月的最后一天,我们可以使用“MS”频率从该月的第一天开始,即不是 2015-12-31,而是 2015-12-01-

# month frequency from start of the month
data.resample('MS', on='created_at').price.sum()created_at
2015-12-01    1.538769e+05
2016-01-01    4.297143e+05
2016-02-01    9.352684e+05
2016-03-01    7.425185e+06
2016-04-01    1.384351e+07

采样数据的多重聚合。

通常我们需要在不同的列上应用不同的聚合,就像在我们的例子中,我们可能需要找到—

  1. 每小时添加的独特项目。
  2. 每小时添加的总量。
  3. 每小时添加的总量。

我们可以通过对重采样的数据使用 agg()在一行中实现这一点。让我们看看我们如何做到这一点—

# aggregating multiple fields for each hour
data.resample('H', on='created_at').agg({'price':'sum', 'quantity':'sum','item_code':'nunique'})

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

基于作者每小时的汇总数据。

基于不同的时间间隔对数据进行分组

在上述示例中,我们对数据进行了重新采样,并对其应用了聚合。如果除了时间间隔之外,我们还想按其他字段对数据进行分组,该怎么办?熊猫提供了一个名为 grouper() 的 API,可以帮助我们做到这一点。

在本节中,我们将了解如何对不同字段的数据进行分组,并在不同的时间间隔内对其进行分析。

每月每种店铺类型的新增金额。

假设我们需要根据每月的商店类型来分析数据,我们可以使用—

# Grouping data based on month and store type
data.groupby([pd.Grouper(key='created_at', freq='M'), 'store_type']).price.sum().head(15)# Output
created_at  store_type                
2015-12-31  other                          34300.00
            public_semi_public_service       833.90
            small_medium_shop               2484.23
            specialized_shop              107086.00
2016-01-31  market                           473.75
            other                         314741.00
            private_service_provider         325.00
            public_semi_public_service       276.79
            small_medium_shop              31042.79
            specialized_shop               29648.44
2016-02-29  market                          1974.04
            other                         527950.00
            private_service_provider        1620.00
            public_semi_public_service      1028.52
            small_medium_shop             224653.83

让我们来理解我是如何做到的—

  1. 首先,我们将 Grouper 对象作为 groupby 语句的一部分进行传递,该语句根据月份(即“M”频率)对数据进行分组。这类似于 resample(),所以我们上面讨论的内容在这里也适用。
  2. 我们将 store_type 添加到 groupby 中,这样每个月我们都可以看到不同的商店类型。
  3. 对于每个组,我们选择价格,计算总和,并选择前 15 行。

每月根据 item_name 添加的总金额。

正如我们在上一个示例中所做的那样,我们也可以对 item_name 做类似的事情。

# Grouping data based on each month and item_name
data.groupby([pd.Grouper(key='created_at', freq='M'), 'item_name']).price.sum()# Output
created_at  item_name                                   
2015-12-31  Bar soap, solid, SB                                33.17
            Beer, domestic brand, single bottle, WKB           29.79
            Black tea, BL                                      12.00
            Black tea, in bags, WKB                            60.99
            Bread, white, sliced, WKB                          85.45
                                                              ...   
2016-08-31  Wheat flour, not self-rising, BL                  150.38
            White sugar, WKB                                  266.47
            Women's haircut, basic hairdresser               7730.00
            Wrist-watch, men's, CITIZEN Eco-Drive BM6060    52205.00
            Yoghurt, plain, WKB                               150.96

每月 store_type 的多重聚合。

我们可以像使用 resample()那样在多个字段上应用聚合。这里唯一不同的是,数据也将按 store_type 分组,而且,我们可以对 groupby 对象进行命名聚合(为每个聚合分配一个名称),这不适用于重新采样。

# grouping data and named aggregation on item_code, quantity, and price
data.groupby([pd.Grouper(key='created_at', freq='M'), 'store_type']).agg(unique_items=('item_code', 'nunique'),
         total_quantity=('quantity','sum'),
         total_amount=('price','sum'))

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

按作者基于不同字段的汇总数据

结论

我希望这篇文章能帮助你节省分析时间序列数据的时间。我建议你查看一下关于重采样()群组() API 的文档,了解你可以用它们做的其他事情。

如果你想了解其他可以帮助你完成数据分析任务的熊猫应用编程接口,请查看文章熊猫:收起新手数据分析师状态,在那里我解释了你可以用熊猫做的不同事情。

如果你在使用熊猫或数据分析时遇到任何问题,请在评论中告诉我,或在 LinkedIn 上 ping 我。我们可以试着一起解决。目前就这些了,下篇文章再见。

干杯!!!注意安全!!!继续学习!!!

如何指导:在 Kubernetes 上建立、管理和监控 Spark

原文:https://towardsdatascience.com/how-to-guide-set-up-manage-monitor-spark-on-kubernetes-with-code-examples-c5364ad3aba2?source=collection_archive---------10-----------------------

带有代码示例

在 2020 Spark + AI 峰会上,我们提出了一个关于在 Kubernetes (K8s) 上运行 Apache Spark 的最佳实践和陷阱的会议。

在本帖中,我们将对该演示进行扩展,并与您讨论:

  1. 什么是 Kubernetes?
  2. 为什么要在 Kubernetes 上运行 Spark?
  3. Kubernetes 上的 Spark 入门
  4. 优化性能和成本
  5. 在 Kubernetes 上监控您的 Spark 应用
  6. Kubernetes 上的 Spark 现已上市(更新:2021 年 3 月

如果你已经熟悉 k8s 以及为什么 Kubernetes 上的 Spark 可能适合你,请随意跳过前几个部分,直接进入帖子的核心部分!

什么是 Kubernetes (k8s)?

Kubernetes (也称为 Kube 或 k8s)是一个开源的容器编排系统,最初由谷歌开发,于 2014 年开源,由云计算原生计算基金会维护。Kubernetes 用于自动化容器化应用的部署、扩展和管理——最常见的是 Docker 容器。

它提供了许多对稳定性、安全性、性能和可扩展性至关重要的功能,例如:

  1. 水平可扩展性
  2. 自动化推出和回滚
  3. 负载平衡
  4. 机密和配置管理
  5. …还有更多

Kubernetes 已经成为传统软件开发领域基础设施管理的标准。但是 Kubernetes 在大数据领域并不那么受欢迎,因为大数据领域经常被像 Hadoop YARN 这样的老技术所困扰。直到 Spark-on-Kubernetes 加入游戏!

为什么要在 Kubernetes 上打火?

当 Apache Spark 2.3 中增加了对 Kubernetes 上原生运行 Spark 的支持时,许多公司决定改用它。这种流行的主要原因包括:

  • 本地集装箱化和码头支持。
  • 能够在彼此完全隔离的情况下运行 Spark 应用程序(例如,在不同的 Spark 版本上),同时享受共享基础架构的成本效益。
  • 将您的整个技术基础设施统一在一个与云无关的工具下(如果您已经将 Kubernetes 用于您的非 Spark 工作负载)。

最重要的是,与 YARN 相比,在 Kubernetes 上运行没有设置损失(如基准测试所示),Spark 3.0 为 Spark-on-Kubernetes 带来了许多额外的改进,如支持动态分配。自Spark 3.1(2021 年 3 月)以来,Kubernetes 上的 Spark 已被正式宣布为正式上市和生产就绪!

阅读我们之前关于在 Kubernetes 上运行 Spark 的利弊的帖子,了解关于这个主题的更多细节以及与主要替代方案的比较。

Kubernetes 上的 Spark 入门

架构:当你提交一个 Spark 应用到 Kubernetes 时会发生什么

您通过直接与 Kubernetes(确切地说是主节点上的 Kubernetes API 服务器)对话来提交 Spark 应用程序,然后 Kubernetes API 服务器将为 Spark 驱动程序安排一个 pod(简单地说,一个容器)。一旦 Spark 驱动程序启动,它将直接与 Kubernetes 通信来请求 Spark 执行器,这也将在 pod 上进行调度(每个执行器一个 pod)。如果启用了动态分配,Spark 执行器的数量会根据负载动态变化,否则它是一个静态数字。

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

Kubernetes 参考架构上的 Apache Spark。图片作者。

如何提交申请:spark-submit 与 spark-operator

这是你需要尽早做的一个高层次的选择。向 Kubernetes 提交 Spark 应用程序有两种方式:

  • 使用 spark 附带的 spark-submit 方法。Spark 应用程序的进一步操作将需要直接与 Kubernetes pod 对象进行交互
  • 使用火花操作器。这个项目是由 GCP 开发的(并且是开源的),但是它在任何地方都可以工作。它需要在集群上运行一个(单个)pod,但会将 Spark 应用程序转变为自定义 Kubernetes 资源,可以像其他 Kubernetes 对象一样对其进行定义、配置和描述。它增加了其他细节,比如支持直接从 Spark 应用程序配置中挂载配置图和卷。

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

Spark 提交与 Kubernetes 运营商应用管理上的 Spark。图片作者。

我们建议使用 spark-operator,因为它更容易使用。

设置清单

根据您当前的基础架构和云提供商(或内部设置),以下步骤会有所不同。但是在高层次上,这里是你完全自己开始使用 Kubernetes 上的 Spark 所需要设置的主要内容:

如您所见,如果您在内部完成这项工作,这需要做大量的工作,并且需要维护大量移动的开源项目。

这就是我们构建托管 Spark 平台(数据机制)的原因,目的是让 Kubernetes 上的 Spark 尽可能地简单易用。我们的平台负责这一设置,并提供额外的集成(如 Jupyter、Airflow、IDEs)以及强大的优化,以使您的 Spark 应用程序更快,并降低您的云成本。

优化性能和成本

尽可能使用固态硬盘或大磁盘,以获得 Spark-on-Kubernetes 的最佳洗牌性能

洗牌是 Spark 中经常出现的昂贵的全对全数据交换步骤。它们会占据你整个 Spark 工作的很大一部分,因此优化 Spark shuffle 性能很重要。我们已经在我们的 YARN vs Kubernetes 性能指标评测文章(阅读“如何在 Kubernetes 上使用 Spark 优化 shuffle”)中讨论了这个主题,所以我们在这里只给出我们的高级技巧:

  • 尽可能使用本地 SSD 磁盘
  • 当它们不可用时,增加磁盘的大小以提高其带宽

优化您的火花舱尺寸,以避免浪费容量

我们来看一个例子。假设:

  • 您的 Kubernetes 节点有 4 个 CPU
  • 您想在每个 Kubernetes 节点上安装一个 Spark executor pod

然后,您将提交配置为Spark . executor . cores = 4的 Spark 应用程序,对吗?不对。你的 Spark app 会卡死,因为 executors 装不下你的节点。您应该考虑下图中描述的开销。

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

来自 Kubernetes 和 Daemonsets 的 Apache Spark 节点的开销。图片作者。

通常,可分配的节点表示 95%的节点容量。为daemonset保留的资源取决于您的设置,但是请注意,daemonset 在日志和指标收集、网络和安全性方面很受欢迎。让我们假设这为您的 Spark 执行器留下了 90%的可用节点容量,即 3.6 个 CPU。

这意味着您可以使用配置Spark . executor . cores = 3*提交 Spark 应用程序。*但是这将仅保留 3 个 CPU,并且会浪费一些容量。

因此,在这种情况下,我们建议采用以下配置:

spark . executor . cores = 4
spark . kubernetes . executor . request . cores = 3600m

这意味着您的 Spark 执行器将请求正好 3.6 个可用的 CPU,Spark 将在这个执行器上并行调度多达 4 个任务。

高级提示:
spark.executor.cores 设置为比spark . kubernetes . executor . request . cores大 2 倍(通常为2 倍或 3 倍)称为超额预订,可以显著提升 CPU 使用率较低的工作负载的性能。

在这个例子中,我们已经向您展示了如何调整 Spark executor pods 的大小,使它们紧密地适合您的节点(每个节点一个 pod)。公司还通常选择使用更大的节点,并在每个节点上安装多个 pod。在这种情况下,您仍然应该关注 Spark CPU 和内存请求,以确保节点上执行器的装箱是高效的。这是由数据机制平台提供的动态优化之一。

支持应用级动态分配和集群级自动扩展

如果您在云中运行,并且希望让您的数据基础架构具有反应能力和成本效益,这是绝对必要的。有两个级别动态缩放:

  • App 级动态分配。这是每个 Spark 应用程序在运行时请求 Spark 执行器(当有未决任务时)和删除它们(当它们空闲时)的能力。从 Spark 3.0 开始,通过设置以下配置,动态分配在 Kubernetes 上可用:
  • spark . dynamic allocation . enabled = true
    spark . dynamic allocation . shuffle tracking . enabled = true
  • 集群级自动伸缩。这意味着当 Kubernetes 集群需要更多的容量来调度 pods 时,它可以向云提供商请求更多的节点,反之亦然,当节点变得不可用时,就将其删除。

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

针对 Apache Spark 的 Kubernetes 集群动态分配和自动缩放。图片作者。

这两项设置将使您的整个数据基础设施在 Spark 应用能够从新资源中受益时动态扩展,并在这些资源未被使用时缩减规模。实际上,当集群中有容量时,启动 Spark pod 只需要几秒钟。如果必须首先从云提供商处获取新节点,您通常需要等待 1-2 分钟(取决于云提供商、地区和实例类型)。

如果您想保证您的应用程序总是在几秒钟内启动,您可以通过在 Kubernetes 集群上安排所谓的“暂停单元”来增加集群的规模。这些是低优先级的吊舱,基本上什么也不做。当 Spark 应用程序需要空间来运行时,Kubernetes 将删除这些优先级较低的 pods,然后重新安排它们(导致集群在后台扩大规模)。

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

应用级动态分配和集群级自动扩展的说明。图片作者。

使用点节点降低云成本

Spot(也称为 preemptible)节点的成本通常比随需应变的机器低 75%左右,换来的是较低的可用性(当您请求 Spot 节点时,不保证您会得到它们)和不可预测的中断(这些节点可能随时消失)。

Spark 工作负载在 spot 节点上工作得非常好,只要您确保只有 Spark 执行器被放置在 spot 上,而 Spark 驱动程序在按需机器上运行。事实上,Spark 可以从失去执行器(一个新的执行器将被放置在一个按需节点上,并重新运行丢失的计算)中恢复,但不能从失去驱动程序中恢复。

要在 Kubernetes 中启用 spot 节点,您应该创建多个节点池(一些是按需节点,一些是 spot 节点),然后使用节点选择器和节点关联将驱动程序放在按需节点上,执行器最好放在 spot 节点上。

在 Kubernetes 上监控您的 Spark 应用

使用 Kubernetes 仪表板监控 pod 资源使用情况

Kubernetes 仪表板是一个开源的基于 web 的通用监控 UI。它将为您提供集群上运行的应用的可见性,以及对其性能进行故障排除的基本指标,如内存使用、CPU 利用率、I/O、磁盘等。

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

Kubernetes 仪表板上的 Pod 资源使用监控。来源: Kubernetes.io

这个项目的主要问题是,将这些指标与实际的 Spark 工作/阶段协调起来很麻烦,而且当 Spark 应用程序结束时,这些指标中的大部分都会丢失。保持这些指标有点挑战性,但也是可能的,例如使用普罗米修斯(从 Spark 3.0 开始内置 servlet)或 InfluxDB

如何访问 Spark 用户界面

Spark UI 是 Spark 内置的重要监控工具。无论应用程序是否是实时的,访问它的方式都是不同的:

  • 当应用程序运行时,Spark UI 由 Spark 驱动程序直接在端口 4040 上提供服务。要访问它,您应该通过运行以下命令port-forward:
    $ ku bectl port-forward4040:4040
    然后您可以在 http://localhost:4040/ 打开 Spark UI
  • 当应用程序完成时,您可以通过运行 Spark 历史服务器并将其配置为从持久存储中读取 Spark 事件日志来重放 Spark UI。你应该首先使用配置spark . event log . dir将这些事件日志写到你选择的存储后端。然后,您应该按照这个文档从一个 Helm 图表安装 Spark 历史服务器,并将其指向您的存储后端。

Spark UI 的主要问题是很难找到您正在寻找的信息,并且它缺乏以前工具的系统指标(CPU、内存、IO 使用)。

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

数据力学用户界面概述。图片作者。

更新:

Kubernetes 上的 Spark 现已正式发布(Spark 3.1 更新)

自 2021 年 3 月和 Apache Spark 3.1 发布以来,Kubernetes 上的 Spark 已被正式宣布为生产就绪和正式可用。

最令人兴奋的功能是 Spark 能够预测执行程序点杀(通过收听云提供商提前发出的终止通知),并将 shuffle 文件和缓存数据从即将死亡的执行程序迁移到将存活的执行程序。该功能被称为【SPARK-20624】更好地处理节点关闭。并且在下面的 GIF 中有图解。

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

优雅的节点退役 Spark 3.1 的一个新特性,使 Apache Spark 对定点清除更加健壮。目前仅在 Kubernetes &独立模式下可用。

第二个主要改进是能够在 Kubernetes(一个网络支持的存储,可以由所有 Spark 应用程序共享,并预先填充数据)中装载共享的 NFS 卷,以及动态提供 PersistentVolumeClaims(而不是静态)的能力,如果您试图在启用动态分配的情况下运行 Spark 应用程序,这尤其有用。

查看我们关于 Spark 3.1 发布的博客文章以深入了解这些改进,并对 Spark 3.1 的新特性进行概述。

结论

我们希望这篇文章能让你对 Spark-on-Kubernetes 以及如何成功使用它有所了解。

如果您想以最简单的方式开始使用 Spark-on-Kubernetes,与我们预约时间,我们的数据力学团队将非常乐意帮助您交付您的用例。如果你想更好地了解我们的平台与 Spark-on-Kubernetes 开源平台相比如何,查看这篇文章

这篇文章的最初版本发表在数据力学博客

机器学习中如何处理循环数据

原文:https://towardsdatascience.com/how-to-handle-cyclical-data-in-machine-learning-3e0336f7f97c?source=collection_archive---------42-----------------------

不要一次性编码日期信息。改为这样做。

今天,我们将探讨数据科学中一个常见但鲜为人知的话题——周期性数据。它是许多数据集的一部分,很容易被发现——日期信息是最常见的形式。有很多方法可以将日期信息编码成机器学习友好的东西,但有些方法比其他方法更好。

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

照片由奥斯汀·尼尔Unsplash 拍摄

以下是我被教导如何处理日期值的方法— 将它们视为分类。不同的月/日/小时可以被视为单独的类别,因此为了对它们进行编码,可以创建一组虚拟变量。例如,在处理月度数据时,我们可以创建 11 个虚拟列(one-hot),它们采用Is_JanuaryIs_February等形式,其中一行中只有一列可以有非零值。

那就不对了。

当然,你可以这样做,机器学习模型不会抱怨,但这并不意味着这是正确的方法。时间数据是循环的,一小时有 60 分钟,一天有 24 小时。当一个小时结束时,下一个小时开始从零开始计时。

它使一个小时的第 1 分钟和第 2 分钟紧密相连,但也使第 59 分钟和第 1 分钟相连,因为只有一分钟的差异,而不是模型假设的 59。

这就是我们想要的行为。下一节将使前面的观点更加清楚。

数据集介绍和加载

我们需要一个带有日期或其他循环属性的数据集——这是显而易见的。快速的 Kaggle 搜索产生了这个小时能耗数据集,我们将使用其中的第一个AEP_hourly.csv文件。它有几兆的大小,所以把它下载到你的机器上。

一旦加载了Pandas,前几行看起来是这样的:

import pandas as pd

df = pd.read_csv('data/AEP_hourly.csv.zip')
df.head()

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

很好——我们有一些日期信息,但它是实际的日期还是字符串?

df.dtypes

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

果然不出所料,所以我们来做个换算。我们还将从日期中提取小时信息,因为这是我们要处理的内容。

df['Datetime'] = pd.to_datetime(df['Datetime'])
df['Hour'] = df['Datetime'].dt.hour

df.head()

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

现在情况好多了。让我们分离出上周的数据(最后 168 条记录),来形象化地说明为什么一次性编码不是一件好事情。

last_week = df.iloc[-168:]
import matplotlib.pyplot as plt

plt.title('Individual hours', size=20)
plt.plot(range(len(last_week)), last_week['Hour'])

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

预期行为。这是一个重复七次(7 天)的循环,在第 23 个小时之后每天都有一个粗略的切断。我认为您可以很容易地推理出为什么这种类型的行为对于周期性数据不是最佳的。

但是我们能做些什么呢?幸运的是,很多。

编码循环数据

在这种情况下,一键编码不是明智之举。我们最终会得到 23 个附加属性(n-1),这很糟糕,原因有二:

  1. 维度的巨大跳跃——从 2 到 24
  2. 属性之间没有连通性-23 小时不知道它后面是 0 小时

那么,我们能做什么呢?

**使用正弦和余弦变换。**以下是我们将使用的公式:

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

或者,在 Python 中:

import numpy as np last_week['Sin_Hour'] = np.sin(2 * np.pi * last_week['Hour'] / max(last_week['Hour'])) last_week['Cos_Hour'] = np.cos(2 * np.pi * last_week['Hour'] / max(last_week['Hour']))

厉害!以下是上周的数据:

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

这些转换使我们能够以更有意义和简洁的方式来表示时间数据。看一下最后两行。正弦值几乎相同,但仍有一点不同。这同样适用于接下来的每一个小时,因为它现在遵循一个波形。

太好了,但是为什么我们需要这两种功能呢?

在我给你答案之前,让我们先用图形来研究一下这些函数。

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

一次看一张图。有一个问题。这些值重复。看看正弦函数,在 x 轴的 24 到 48 之间。如果你要画一条直线,它将与同一天的两个点相交。这不是我们想要的行为。

为了进一步证明这一点,如果我们绘制正弦和余弦柱的散点图,会发生以下情况:

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

没错;我们得到了一个完美的循环。只有用周期来表示周期性数据才有意义,你不同意吗?

你应该知道的就这些。让我们在下一部分总结一下。

在你走之前

这是一篇相对简短且切中要点的文章,但是我仍然希望我能够让您相信一键编码并不是所有问题的解决方案。当然,当分类属性不以任何方式“连接”时,它就像一种魅力,但这是任何周期性数据的首选方法。

有人可能会说我们引入了两个新的维度,这并不理想。我同意,但是 2 比 23 好,23 是一次性编码方法的结果。

感谢阅读。

加入我的私人邮件列表,获取更多有用的见解。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

原载于 2020 年 10 月 12 日【https://betterdatascience.com】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值