TowardsDataScience 博客中文翻译 2019(二百五十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何让数据科学家开心

原文:https://towardsdatascience.com/how-to-make-and-keep-a-data-scientist-happy-4f4253581966?source=collection_archive---------15-----------------------

为了与您的数据科学家建立牢固的长期关系,并让他们在您的公司中保持愉快,需要关注 5 个方面

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

Photo by Luca Upper on Unsplash

虽然我们知道对数据科学家的需求很大,但似乎许多在该领域工作的人并不完全满意,并且每周花几个小时寻找不同的机会。虽然它没有关注数据科学市场,但最近的一项研究表明,千禧一代对公司的参与度较低,跳槽的倾向较高。总而言之,企业努力争取数据科学家,但往往难以让他们满意。

数据科学家想要什么,需要什么才能留在某个地方?

这是不是一种现象,没有一个地方会好得太久?我不认为数据科学家要求特别高,但这个角色涉及雇主和领导者在招聘和建立工作方式时需要考虑的必要性和挑战。

作为一名数据科学家,我确定了工作中对我的满意度和幸福感至关重要的 5 个部分。我把它们收集成 5c,这样更容易记忆。我相信它们适用于所有参与数据项目的数据专家,即数据科学家,但在某种程度上也适用于数据工程师、机器学习工程师&其他开发人员

5 C

  • 清楚
  • 沟通
  • 挑战
  • 创造力
  • 庆祝

免责声明:显然,所有数据科学家或个人总体上都是不同的,他们会更重视某一方面。这些方面只是从我自己的经历和我可能从其他数据科学家那里听到的经历中总结出来的。尽管如此,我真的相信这些 5c 对于为数据科学家创造一个良好的成长环境至关重要。

清楚

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

Photo by Markus Spiske on Unsplash

不要把不是数据科学的东西称为数据科学

我看到了太多的机会把数据科学/机器学习的旗帜竖起来引起关注,希望能让无数热情极高的申请者申请一个机器学习部分完全是海市蜃楼的职位。尽管这种方法在短期内会吸引很多人,但从长远来看,它会让公司付出巨大的代价,因为他们开始失去他们投入时间、培训和资源的受骗员工。尽管机器学习在工作机会中可能是一个非常性感的术语,但它只是数据世界的一个微小方面,大多数有经验的数据科学家都知道这一点。虽然这些术语可能看起来不那么光彩,但只要定义明确,数据分析、BI、数据质量或 Python 开发职位都没有错。

保持你的任务清晰或者寻求帮助来使它们清晰

在为一个项目建立一个问题陈述时,我总是喜欢有太多的细节和要求,而不是不够。在一开始不知道别人需要什么的情况下,你怎么能满足他们呢?我显然认为我知道利益相关者可以使用什么,以及什么对业务有意义,但是我对利益相关者面临的需求或要求感到惊讶。有一个清晰的画面帮助我交付正确的产品,并最小化要做的返工量,从而最小化要经历的挫折量。此外,如果对需要什么样的需求有疑问,利益相关者应该尽早与数据科学团队开始讨论,以便他们一起建立准确的问题陈述或任务。

沟通

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

Photo by Icons8 Team on Unsplash

在团队中,简单的沟通应该是最重要的

当我们想到它的时候,编程、数据科学、人工智能、人工智能、沟通技巧并不经常作为基本技能出现在脑海中。如前所述,项目从目标定义、期望和需求开始。缺乏透明度或糟糕的沟通可能是团队问题的核心,并且会以超乎你想象的速度发展问题。别误会,说多了不代表沟通清楚。我知道,我是极度活跃的法国南方人。我可以说 15 分钟,但什么也没说。尽管如此,我还是重视那些我可以自由表达对帮助或建议的需求的团队,而不是花 3 个小时失去理智,同时诅咒我的 Python 代码。

诚实和透明是稳固关系的关键

我想了很多关于将清晰和交流结合在一起的问题,因为它们有很多共同点。诚实和透明是良好沟通和清晰表达所需要的一些有价值的方面。然而,我非常关心我工作的沟通方面,因此它需要有自己的 c。无论如何,诚实和透明的领导可以对团队及其绩效产生奇妙的影响。根据《福布斯》一篇关于透明领导者的文章,透明能让关系更快成熟,因为开放能潜在地避免会加剧不必要紧张的误解

在您的团队中寻找数据翻译人员

我注意到,在大多数情况下,团队中的一些人比其他人更欣赏这份工作的沟通方面。我不知道我是否比其他人更适合,但我绝对喜欢演讲、讨论、聊天或建立关系网。认识到数据科学家的这种技能可以让团队或其领导者选择合适的人,当他们需要帮助时,他们会乐意与其他部门的利益相关者或团队领导讨论组织会议的任务。

挑战

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

Photo by Juan Jose on Unsplash

为成长和学习机会提供挑战

我非常重视挑战和复杂的项目。尽管它们会给我的生活带来一些压力,但它们让我快速成长,无论是作为开发人员还是数据科学家。此外,这样的挑战也让我走出自己的舒适区,拓展它的边界。复杂的项目可能是公司的一个弱点,因为它们需要大量的工作时间和奉献精神,经常会遇到意想不到的挑战,并且可能在数据和系统方面有多种依赖关系。然而,复杂性也可能允许公司进入一个新的、不同的和创新的领域,带着他们的团队一起前进。

只有那些敢于冒险走得太远的人,才有可能发现自己能走多远。—t·s·艾略特

庆祝

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

赞美团队中的差异和多样性

除了庆祝性别、年龄和种族差异,我真的认为不是每个数据科学家都应该在同一个地方有优势。除了最好的程序员,我还喜欢和最好的统计学家、最好的老师、最好的演示者和最好的“网络员”一起工作。认识到不同数据科学家、专家和工程师的不同品质,可以让你培养和利用团队中已经存在的品质,而不是只关注最薄弱的地方进行改进。

鼓励团队工作、团队聚会和团队活动。

根据我自己的经验,当人们真正欣赏彼此的陪伴(或者至少感觉到一点点联系)时,一个团队会运作得更好。他们可能会毫不犹豫地向对方寻求帮助,并且更容易在交流中保持诚实和透明。如果我领导一个数据科学团队,我肯定会鼓励午休,或者更好的是,我会强制整个团队都午休。我过去常常不吃午饭。我现在知道,只有当我在不适合我的环境中工作时,我才会这样做。如今,我的午休时间已经成了某种神圣的休息时间,如果有人试图在我的午休时间安排会议,我会很生气(除非他们提供免费午餐和一个非常好的理由)。).我只是很高兴能休息一下,享受我的食物,和车队聊聊天,即使是在繁忙的时候。

创造力

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

Photo by Iker Urteaga on Unsplash

“创造力”听起来就像这个我在编程和技术领域很少听到的罕见的古怪的词。我们经常听到创新、技术技能、分析技能,但创造力仍然是一种艺术形象,色彩、抽象的想法和音符,只属于音乐厅和美术馆。然而,我相信创造力在机器学习中无处不在,并且是所发现的最佳模型的核心。

为创造力留出空间

研究表明,工作自主对员工的满意度和幸福感有积极的影响。在我看来,自主也是创造力的先决条件,我非常感激被给予解决问题或回答问题的自主权。通过人工智能、数据可视化、数据处理、特征工程甚至数据清理,一个问题陈述往往有不止一个可能的解决方案,而最佳答案可能并不总是最明显的。构建一个在创新、可靠、高效、轻便和可解释之间取得平衡的机器学习解决方案通常需要大量的创造力。

“创造力包括打破既定模式,以不同的方式看待事物。”-爱德华·德·波诺,横向思维技术的发明者

实施 5c

围绕数据科学的世界仍然复杂多变,不可能简单地涵盖其所有方面,尽管我希望触及我在这 5 个方面经历的基本要求。此外,在一个企业或组织中应用所有的 5c 显然比简单地决定这样做要复杂得多。尽管如此,通过在任何数据科学项目、团队或管理的每个决策中牢记这 5 个要素,可以朝着正确的方向迈出一小步。

感谢您的阅读!

如果您想阅读更多关于改善数据科学家工作环境或如何面对数据翻译、数据科学、人工智能和领导力挑战的文章,请关注我的 中型 推特 获取通知。

如果你想阅读更多我的故事:

[## 程序员的正念

编程时 3 个简单的练习

towardsdatascience.com](/mindfulness-for-programmers-da6f92147b8f) [## 你能成为榜样吗?

STEM 领域的女性需要更多的榜样。但是如果他们已经在外面了呢?

medium.com](https://medium.com/swlh/can-you-be-a-role-model-68e52c9f759a)

如何让电脑做梦

原文:https://towardsdatascience.com/how-to-make-computers-dream-3b4b10e4463a?source=collection_archive---------26-----------------------

生成模型的软介绍

“当一个人理解了原因,所有消失的图像可以很容易地通过原因的印象在大脑中重新找到。
这才是真正的记忆艺术……”
勒内·笛卡尔,私人思考。

闭上眼睛(当你试图说服人们阅读你的文章时,这是一个糟糕的开场白),想象一张脸。

现在想象一只猫。一只狗,房子,汽车,水槽,一瓶啤酒,桌子,树。

这一切都在你的头脑中,很容易在你的内眼、内耳和内心世界中想象出来。但是你有没有想过,当你想象一个前所未见、前所未闻的东西时,会发生什么?

我们都有能力想出不存在的新奇事物。在电车上看到一则广告后,我们塑造了对未来的愿景,并突然体验到自己在遥远的土地上。

当我们晚上睡觉时,闭上眼睛,远离世界上所有的模糊事物和所有的感官输入,我们会梦见一个新的世界,里面住着和我们在现实生活中熟悉的人极其相似的人。

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

Salvador Dali: Dream Caused by the Flight of a Bumblebee around a Pomegranate a Second Before Awakening (fair use).

我们能从中学到什么

神经科学家和人工智能研究人员都意识到,我们如此强大的想象能力是我们智力的一个重要方面。因此,在构建类人智能时,对它进行建模可能是对我们工具箱的重要扩展。

但是我们能教机器如何做梦吗?这难道不是人类独有的东西,与计算机的精确和机械决定论如此不同吗?

答案是肯定的。看看这些快乐的人们:

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

George, Barbara, Aditya and Mikey, as imagined by a computer (via StyleGAN).

你可以看着他们,感受他们的生活。他们在哪里长大?他们上的是哪所高中?他们的性格是怎样的?他们是相当严肃的人,还是厚颜无耻的微笑的痕迹?

他们是你想象中的那种人。也许他们会出现在你的梦里。

问题是他们四个都不存在。它们完全是我五分钟前让我的电脑生成的虚构。 那是一台电脑想象出来的,就像你想象出来的一样。

这怎么可能?

不同程度的随机性

让我们后退几步。

图片由成千上万的像素组成,其中每个像素包含单独的颜色信息(例如,用 RGB 编码)。如果您随机生成一张图片(每个像素都是独立于所有其他像素生成的),它看起来像这样:

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

A truly random picture. If you see a face in this, you should consider seeing a doctor.

如果你每秒钟都以这种方式生成一张图片,直到一张脸出现,你不会在几十亿年后更接近你的目标,当太阳在你脸上爆炸时,你仍然会生成图片。

大部分随机图片都不是人脸的图片,人脸的随机图片非常不随机。

潜在结构

每张脸后面都有一个潜在的结构。在这种潜在结构的范围内,有一定程度的灵活性,但它受到的约束要比不受约束多得多。

人类非常擅长理解潜在结构。我们不会根据像素来考虑人脸:我们会考虑嘴巴、鼻子和耳朵等特征,以及眉毛之间的距离(或没有距离),我们会在脑海中建立一个抽象的面孔表示(更多信息请见我的文章思维的几何学),这使我们可以很容易地想象一张脸,无论是在脑海中还是通过绘制。

总的来说,在世界中寻找潜在结构不仅对在世界中导航和交流非常重要,因此对我们的生存也非常重要,而且从某种意义上说,寻找潜在结构是所有科学实践的基石,可以说,也是智力的基石(正如我在关于为什么智力可能比我们想象的更简单的文章中所详述的)。

当我们从外部世界收集数据时,数据是由我们通常看不到的过程产生的。建立一个世界模型意味着寻找这些产生我们观察到的数据的隐藏过程。

物理定律,无论是牛顿定律还是薛定谔方程,都是这些潜在原理的浓缩、抽象的表现。就像牛顿的例子一样,意识到一个 落下的苹果遵循与行星 轨道相同的规律意味着理解这个世界比它看起来有序得多,随机得少。

生成模型

“我不能创造的东西,我不明白。”
理查德·费曼

生成模型的目标是学习一些输入数据 x 背后的潜在结构的有效表示(例如在我们的声音文件的大量人脸图片上进行训练),理解控制其分布的规律,并使用它来生成共享输入数据 x 的关键特征的新输出x’

您的输入数据不是真正随机的这一事实意味着 x 后面有一个结构,这意味着有某些 非平凡(平凡只是随机点)概率分布负责生成数据 。但是这些概率分布对于高维输入通常是极其复杂的,并且通常很难解析出来。

这就是深度学习的救援之处,它已经一次又一次地被证明在捕捉数据中各种复杂的非线性相关性方面非常成功,并允许我们很好地利用它们。

生成模型可以采取许多形状和形式,但我认为 变型自动编码器 是一个非常有启发性的例子,所以我们现在将仔细看看它们是如何工作的。

潜在变量

一个变分自动编码器通常使用 两个深度神经网络构建。

第一深度神经网络 学习 输入数据 x 的潜在(通常是低维)表示。

这种潜在结构编码在 关于一些潜在变量的概率分布 中,我们用 z 来表示那么的主要任务就是在给定我们的数据的情况下,找到所谓的潜在变量的后验,在 概率论 的语言中写成 p(z|x) 。相应地,这个步骤被称为 编码器

请注意,这有点类似于 辨别神经网络 在监督分类任务中所做的事情:它被训练成在与标签相关的数据中找到结构,例如,允许它区分猫和狗的图片。

只是在生成模型的情况下,我们在寻找数据本身的概率分布,对于自动编码器,我们将其编码在潜在变量中。

对于技术上更感兴趣的人来说:实现这一点的一种方法是通过在潜在变量上引入一类近似先验分布(例如高斯分布的组合)并训练网络找到这些分布的参数(例如 表示协方差 ),它们尽可能接近真实先验(由测量)

一旦模型已经学习了潜在变量 z 上的 概率分布 ,它可以通过从 p(z|x) 采样并执行第一个网络的反向任务来使用这一知识生成新数据x’,这意味着寻找由 p(x’|z) 给出的以潜在变量为条件的数据的后验概率。

换句话说:给定我们之前通过使用第一个网络了解到的潜在变量 p(z|x) 的分布,新数据会是什么样子?

这个步骤然后被称为 解码器生成模型

我们可以通过同样训练一个 神经网络 将随机变量 z 映射到新数据x’上来构建它。****

总结一下 变型自动编码器 正在做的事情:

  1. 从输入数据中学习后验 x→z:p(z | x)
  2. 从模型生成新数据 z→x ':p(x ’ | z)

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

The variational autoencoder. Credit to Chervinskii [CC BY-SA 4.0]

亥姆霍兹机器会梦到电羊吗?

“电器也有它们的寿命。这些生命是微不足道的。”菲利普·K·蒂克,机器人会梦见电动绵羊吗

这里缺少一个关键因素:我们如何训练生成模型?

这可能相当棘手。训练它们通常比训练有鉴别能力的模型要困难得多。因为在你自己创作之前,你真的真的需要理解一些东西:认识一首贝多芬的交响曲比你自己创作一首容易得多。

为了训练模型,我们需要一些损失函数来进行训练,并需要一个算法来实现它,同时需要训练多个网络。

最早的生成模型之一叫做 亥姆霍兹机器, 由达扬、辛顿、尼尔 于 1995 年开发。

亥姆霍兹机器可以使用所谓的唤醒-睡眠算法进行训练。

在唤醒阶段 ,网络从世界中查看数据 x,并试图推断潜在状态的后验 p(z|x)

在睡眠阶段 ,网络基于其内部的世界模型,从 p(x’|z) 中生成(“梦境”)新数据,并试图使其梦境与现实趋同。

在这两个步骤中,机器被训练以最小化模型的自由能(也称为“惊奇”)。通过逐步减少惊奇(然后可以通过梯度下降等方法合并),生成的数据和真实数据变得越来越相似。

不同的生成模型

现代深度学习中使用了几种类型的生成模型,它们建立在亥姆霍兹机器上,但克服了它们的一些问题(例如唤醒-睡眠算法效率低下/不收敛)。

在上面介绍的 变分自动编码器 中,目的是尽可能好地重构输入数据。这对于实际应用非常有用,例如数据去噪或重建数据的丢失部分。它是通过最小化所谓的 ELBO(证据下限)来训练的。

另一个强大的方法是由通用对抗网络 (GAN)给出的,它被用来生成你之前看到的人脸。

在 GANs 中,在 生成模型 之上引入了一个 鉴别器网络 ,然后对其进行训练以区分其输入是真实数据 x 还是生成数据 x’。不使用编码器网络,但随机采样 z,并训练生成模型,以使鉴别器网络尽可能难以辨别输出数据是真是假。

请注意,生成模型背后的思想非常抽象,因此非常灵活。你可以在各种数据(不仅仅是图片)上训练它们,比如在时间序列数据上的递归神经网络(RNNs),例如 fMRI 数据或来自大脑的尖峰脉冲串。在推断出数据背后的潜在结构之后,可以对训练的模型进行分析,以提高对大脑中潜在过程的理解(例如与精神疾病有关的动力系统属性等)。).

生成模型与认知

生成模型所能实现的已经令人印象深刻,但它们也能让我们更进一步了解我们的大脑是如何工作的。他们不仅被动地对世界进行分类,还主动捕捉其中的基本结构,并将其整合到模型本身中。就像我们都生活在我们大脑创造的自己的内心世界一样,生成模型创造了他们自己微小的内心世界。

正如贝叶斯大脑假说的支持者所说,这是我们认知器官的一个关键特征。我们的大脑不断建立潜在的内部表征,以某种方式反映现实世界的概率分布,但也简化它们并专注于最重要的事情(因为这个世界太复杂了,你的大脑无法完全模拟)。

在精神生成模型中,一旦你能创造出你知道它是如何运作的东西。因此,制造能够做梦和想象的机器可能会让我们在理解我们如何做梦和想象自己方面走得更远。

如何让 GDPR 和 ONA 合作?

原文:https://towardsdatascience.com/how-to-make-gdpr-and-ona-work-together-4268ae90b112?source=collection_archive---------22-----------------------

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

unsplash.com

GDPR 和 ONA 相辅相成——如何运用 ONA 的见解,取决于组织的文化。

在网上搜索 ONA(组织网络分析),你会得到各种各样的定义,包括那些带有卷曲的数学符号和图论。然而,简而言之,ONA 是关于组织中谁与谁沟通。

虽然 ONA 被认为是最近的流行语之一,但它至少可以追溯到 80 年代。1985 年,乔治·巴尼特和他的同事写了一篇文章,论述了 ONA 在组织层级中的不同层次。下面的摘要提供了更多的线索。

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

显然,在这个时候和以后,ONA 的隐私方面很少或没有关注。然而,随着《欧盟一般数据保护条例》(GDPR)的颁布,情况发生了缓慢的变化,然后变得更快了。由于已经有很多关于 GDPR 本身的文章和讨论,我们将不再深入探讨更多的细节。

ONA 在你的组织里!

ONA 是一个帮助组织在人员分析方面向更好的世界转型的工具。对当今 VUCA 世界的发展和采用感兴趣的组织都在。尽管如此,终端用户往往不愿意,表达了隐私问题。有一点是清楚的,每一种技术都可以用于好的或坏的方面,ONA 也不例外。

有些员工认为 ONA 的见解会对个人或职业造成伤害。这些员工直言不讳,讨论他们的隐私如何处于危险之中。然后,这些声音被工人委员会放大——都是以隐私的名义。然而,ONA 洞察使员工能够在他们自己的组织中产生影响,并实现个人发展。如何运用 ONA 的见解取决于公司文化或人力资源实践。这并不比耳语咖啡更糟糕——谈论对同事的专业和个人评价。事实上,对自己公司文化的恐惧是一些员工不愿意去 ONA 的核心原因。

这并不是说 ONA 不应该解决隐私问题,恰恰相反,企业和产品经理有责任在考虑隐私的情况下开发产品,用 GDPR 的话说,这叫做“设计和默认的数据保护”。

GDPR 要求用户明确同意开发 ONA 洞察。虽然 ONA 洞察可以通过未加入的员工比例来计算,但为了实现可接受和可靠的 ONA 洞察,需要足够数量的员工给予用户同意。因此,在开始实施和征求同意之前,提高贵组织对 ONA 的认识至关重要。

从根本上解决数据隐私问题绝非易事!

GDPR 的主要变化是,设计和默认的数据保护现在是一项法律要求。 ICO 指出:

“GDPR 要求您采取适当的技术和组织措施,以实施数据保护原则和保障个人权利。”

这种方法从基础设施一直到 UI。拥有如此广泛的实施焦点,这使得组织很难实施,尤其是在现有产品和服务的基础上构建。

幸运的是,GDPR 以匿名化的形式提供了高水平的解决方案,更重要的是假名化。 IAPP 将假名化定义为:

“从直接标识符中分离数据,以便在没有单独保存的附加信息的情况下,不可能链接到身份”

对于有隐私意识的产品实现,这意味着个人身份信息(PII)数据必须通过设计分离。显然,下一个问题是:PII 意味着什么?这个问题正在被定义——其中一个概念在这里被描述为 PII 2.0。然而,组织应该尽最大努力解决 PII 和隐私的话题 topic 教不明确的借口在法庭上对你的组织没有帮助。有各种各样的方法来解决 PII 和假名化问题,然而最好的方法是(尽可能地)结合安全性、加密和混淆。根据定义,PII 混杂因素是最难解决的,这篇研究论文显示了推断 PII 是多么容易。

关于假名化(假设您的组织已经尽可能好地解决了 PII 问题),假名化数据的最安全方法是使用散列值、数据加密和应用所谓的深度防御方法。

如何对用于 ONA 产品的数据使用假名?

首先,需要实现深度安全或防御概念。纵深防御是:

美国国家安全局(NSA)构想的一种分层策略,作为信息和电子安全的综合方法。

在我们的案例中,这意味着 PII 的数据必须通过多层安全控制进行隔离,这使得 PII 的信息很难获取。这是通过实施不同的 VLANs、加密、散列、硬件分离、认证等来实现的。

一旦确定了 PII 油田并制定了深度安全措施,就可以采用以下技术步骤:

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

这些步骤可确保您的组织在设计和默认情况下尽最大努力解决数据保护问题,这是 GDPR 的法律要求。

作为概述,下图显示了上述内容的一个更广泛、更简化的版本:

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

与汇总统计数据和团队相关指标相关的 ONA 特性工作方式类似。隐私和 PII 问题更宽松,可以使用匿名。

结论

提供 ONA 相关的服务是可能的,也是可行的,这些服务是 GDPR 意识到的,并遵循最佳隐私惯例。最终用户的期望不匹配主要与对 ONA 的误解、内部文化、假设以及与数据隐私相关的负面情绪有关。组织中的文化成就或抑制了 ONA 的洞察力,而不是相反。后 ONA 阶段以及组织如何利用 ONA 洞察(和其他决策信息)必须是员工关心的问题。ONA 给员工提供了推动他们自己的兴趣和文化的方法,而不是抱着最好的希望,在喝咖啡休息或异地决策会议期间等待发生什么。

关于 ONA 在国际电影节的更多信息,请参见我们的系列文章

圆周率怎么做

原文:https://towardsdatascience.com/how-to-make-pi-part-1-d0b41a03111f?source=collection_archive---------11-----------------------

在今年的圆周率日,艾玛·相户爱·Iwao计算出圆周率为 31 万亿位,使之前 22 万亿位的记录相形见绌。从六年级开始,我就知道圆周率是 3.14 和一些变化。但是我开始想我们是怎么知道的?我们如何制作圆周率

计算 pi 的位数有很多种方法——可以用随机抽样、几何、微积分等。但是我们为什么要在乎呢?如果你给我 pi 的前 39 位,我可以告诉你一个氢原子内已知宇宙的宽度(具体方法见 Numberphile 的视频)。我们真的需要 31 万亿吗?

嗯,不,可能不会。但这并不意味着这没有价值!为了生成这些近似值,我们使用了数学、计算机科学和计算机工程中的许多重要工具。我们需要处理关于浮点运算的准确性的问题,估计和误差界限的问题,以及关于优化的问题。所有这些都是有价值的,即使其他 30,999,999,999,961 个数字没有价值。

蒙特卡洛方法

我们将从蒙特卡罗方法开始。这些方法依靠随机抽样来生成数字结果。出于我们的目的,我们将对 X-Y 平面中的点进行采样。我们来看看下图。有一个半径为 1 的圆内接在正方形上。这个正方形的边长正好是圆的直径,也就是 2。

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

A circle with radius 1 and center (1, 1) inscribed in a square with side length 2

现在,假设你和我在玩一个游戏。我们随机选取一个 0 ≤ x ≤ 20 ≤ y ≤ 2 的点 (x,y) 。如果点在圆圈里,你就赢一美元。否则,我赢一美元。橙色是你赢的地方,蓝色是我赢的地方。你赢得一美元的几率有多大?它是橙色圆圈的面积与总面积的比率。圆的面积是A = pir = pi1 = pi总面积是正方形的面积 *A = s = 2 = 4。*所以,赔率是( pi / 4) ≈ 78.5%。胜算大!

所以,如果我们取一堆点,看看落在圆内的点的百分比,我们可以估计出 pi (这里是为什么)。这种随机抽样正是我们的蒙特卡罗方法。下面的代码采样一千万、一亿和十亿个点来计算圆周率。

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

An implementation of the Monte Carlo method using Python. Source code here.

结果如下。

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

Monte Carlo method results

那还不算太糟!在我的电脑上,十亿次迭代大约需要半个小时。它给出了对π的估计,只差 0 . 00007*。但是我们远没有产生 31 万亿位的圆周率。幸运的是,我们有很多其他方法可以尝试。*

微积分方法

我们知道半径为 1 的圆的面积是A = pi**(1)= pi。太好了!让我们计算半径为 1 的圆的面积。但是我们到底如何计算面积呢?我们可以用积分来解决这个问题。看一下下图。它是以 (0,0) 为圆心,半径为 1 的圆的右上部分。这个圆的方程式是 *x + y = 1。*然而,我们只关心 x 轴上方的部分,因此我们可以将公式重新排列为下方的公式。

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

The top right of a circle with radius 1 and center at (0, 0)

由于整个圆的面积是 pi ,那么上面的面积就是 pi / 4 。我们可以从 0 到 1 积分,结果将是 pi / 4 。但是,再一次,整合一个函数到底意味着什么?积分源于波恩哈德·黎曼(1826 年)提出的黎曼和。黎曼求和允许我们通过对曲线下的矩形求和来近似积分,如下所示。我们使用的矩形越多,近似值就越好。

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

Riemann Sums (Images from Khan Academy)

下面的代码使用黎曼和的方法来近似我们的圆下面的面积。这个近似值等于 *(pi / 4)。*更多关于黎曼和的内容,请看这里

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

Implementation of the Riemann Sum Method with Python. Source code here.

结果如下。

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

这无疑是对我们以前方法的改进!在相同的迭代次数下,我们为自己多买了几个正确的数字。但是我们可以做得更好。

无穷级数方法

这个无穷和的想法似乎是可行的,所以我们将继续沿着这条路走下去。从三角学我们知道tan(π/4)= 1。我们现在可以使用反正切函数 arctan(x) 来计算 arctan(1) = pi / 4 。幸运的是,我们有一个简单易行的公式来计算 arctan(x) 。这种方法也被称为格雷戈里-莱布尼茨系列或马达瓦-格雷戈里系列,以戈特弗里德·莱布尼茨(1646)、詹姆斯·格雷戈里(1638)和桑加玛格拉玛的马达瓦(1340)命名。

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

Summation Formula for arctan(x)

我们可以设置 x = 1 ,让下面的代码运行。

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

Implementation of the arctan(x) method with Python. Source code here.

结果是朝着正确的方向迈出了一步!对于十亿次迭代,我们得到的数字比积分法多一位。

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

Results of arctan(x) method

我们可以继续这种方法,做一些改进,并得到明显更好的结果。一个改进来自约翰·麦金(1706),他发展了下面的公式。Machin 对这个公式的推导超出了本文的范围,但是可以在这里找到。

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

Machin’s formula for estimating pi

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

Implementation of Machin’s Formula with Python. Source code here.

结果如下。确保记下迭代的次数。经过 10 次迭代,我们的估计和上面一样好。我们在第 1 部分中的蒙特卡罗方法花了 10 亿次迭代去做 Machin 公式在第 3 部分所做的事情。

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

Results of estimation using Machin’s Formula

但是,正如你可能猜到的,我们仍然可以做得更好。

一种改进的无穷级数方法

我们看到的最后一个无穷级数来自杰出的数学家斯里尼瓦瑟·拉马努金(1887)。Ramanujan 写了两个计算 pi 的公式。Chudnovsky 兄弟,Gregory (1952)和 David (1947)也改进了 Ramanujan 的初始公式。

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

Ramanujan’s and Chudnovsky Brothers’ formulae for estimating pi

下面的代码是 Chudonovksy 公式的一个实现。

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

Implementation of Chudnovsky formula with Python. Source code here.

一次迭代后,该公式将 pi 精确到第 14 位数字。随着每一次连续的迭代,该公式会生成 14 个以上的正确数字 pi 。经过三次迭代后,我们就可以计算出一个氢原子内宇宙的宽度了。

这个公式是每一个现代圆周率计算记录的基础。常见的实现使用的是 y-cruncher ,这是一个设计用来高效计算 pi 的软件。

结束语

我们已经研究了 4 种不同的策略来生成pi——随机模拟、积分、三角函数和无穷级数。估计问题现在看起来可能微不足道,但那只是因为我们可以在现代笔记本电脑上运行十亿次迭代。在历史上的大部分时间里,找到准确的估计值需要巧妙的公式,而这些公式在计算上并不昂贵。现在只需要 Python 一个半小时。

这些只是制作圆周率的几种方法。如果你想做派,皮尔斯伯里有一篇很棒的文章在这里

如何理解混乱的表格数据

原文:https://towardsdatascience.com/how-to-make-sense-of-messy-tabular-data-d59264bb2d58?source=collection_archive---------20-----------------------

Python 的滤镜和。拆分函数是您对抗格式不良的数据集的盟友

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

您是否曾经不得不打开一个格式错误的数据集?那种有人拼凑并打印出来的数据集,没有想到也许, 也许, ,有人可能想以后自己打开这些数据并进行处理?

浪费时间,多长出几根白头发,这是一种奇妙的方式,不是吗?

幸运的是,Python 提供了大量的工具,可以让您的生活变得更加轻松。您可以使用这些可用的工具,以一种易于使用的方式重新格式化数据集,无论它一开始是否格式化良好。

这个问题有什么例子?

在这个例子中,我们来谈谈保存在。txt 格式。不在。csv 或其他对保存数据集有意义的格式。作为一个文本文件,中间留有足够的空间,使值排成一行,并显示为表格。

以图 1 中的数据为例。这是我专门为了演示这个概念而编造的样本数据。如果物理环境对你很重要,假装它是显示水-水热交换器性能的数据。器件的热端和冷端都有流量,器件两侧都有入口和出口温度测量值。

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

Figure 1: Scientific Data Presented as a Text File

你知道是什么让这个数据集令人讨厌吗?这是一个文本文件。数据集之间没有逗号分隔,因此不能将其视为 CSV。不,它也不是制表符分隔的(尽管从图中看不出来)。将值输入到表中,然后添加足够的空格以确保所有内容都对齐。

作为数据科学家,我们希望加载这些数据,并尽快处理它们,但是数据集的格式存在延迟。我们如何快速简便地将它转换成可用的格式?借助 Python 的滤镜的力量。拆分功能!

我如何使用过滤器和?拆分以使其成为可管理的数据集?

T 读入 Python 的 ext 文件对象有T3。()功能可用。这是一个非常有用的函数,正如它所说的那样。每当指定的分隔符到达时,它就拆分一个文本块。如果希望文件在有逗号的时候被分割,可以调用*。split(‘,’)*(不过我还是建议把它们打开。csv 文件代替)。如果您想在看到代码字时拆分文件,您可以输入该代码字作为分隔符。如果您有一个使用未指定数量的空格进行格式化的文本文件,您也可以对其进行格式化。这就是我们需要对图 1 所示的示例数据做的事情。

为了解决这个难题,我们首先需要在有空间的时候分割数据。这将产生一个包含所有数据点的列表,保持数据点的完整性。这个。split 函数需要按顺序应用于表中的每一行,以便将数据保持在所需的格式。假设数据文件是打开的,并且存储在一个名为 Contents 的变量中,我们可以使用下面的代码:

for i in range(1, len(Contents)):
    Row = Contents[i].split(' ')

每当上面的代码找到一个空格时,它将拆分每一行的数据。这是一个很好的步骤,提供了一个包含所有最终数据的列表。不幸的是,由于每个分隔符中有任意数量的空格,脚本有时会在列表中返回空值。

要解决这个问题,我们可以使用 Python 的 滤镜 函数。要使用过滤器,我们只需向它提供我们想要使用的过滤器,以及我们想要应用它的数据集。当调用 filter 函数时,您可以创建任何您想要的过滤器,这使得它非常灵活和有用。如果我们想从列表中删除所有空值,我们可以利用可用的 filter 命令 None 选项。这消除了所有的空白空间,不需要我们额外的努力。最后,我们需要将过滤后的结果输入到一个列表中(否则 Python 的过滤器不会返回实际数据。然后,代码显示为:

for i in range(1, len(Contents)):
    Row = list(filter(None, Contents[i].split(' ')) 

这个过程的结果是什么?

这个过程的结果是,每个数据点之间的所有空白空间现在都被移除,并且有意义的数据点现在作为列表可用。你可以随意使用这份数据清单。如果您准备好直接对这一行数据进行数据分析,您可以这样做。

然而,我通常不喜欢走那条路。我喜欢尽可能频繁地保存中间结果,以防以后我想返回到该文件并将其用于其他目的。为此,您需要在处理数据框时按顺序将每一行数据添加到数据框中,并使用有意义的名称保存数据框。在自动存储来自分析数据集的结果中描述了这样做的技术。

为了更好地讲故事,如何制作令人惊叹的 3D 情节?

原文:https://towardsdatascience.com/how-to-make-stunning-3d-plots-for-better-storytelling-5c93aec80503?source=collection_archive---------15-----------------------

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

在我们开始之前,这不是 2D 与 3D 图之间的战斗,也不是声称 3D 图优于 2D,因为它有一个额外的维度。事实上,我是那些试图避免给一个情节添加太多以至于情节失去其本身情节的人之一。但是有些情况下,你知道你可以通过使用 3D 情节更好地讲故事。这篇文章是为了帮助你在这些情况下!

查看 78%的 DataCamp 折扣

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

以正确的方式为正确的目的构建的 3D 图总是令人惊叹。在本文中,我们将看到如何使用ggplot2rayshader用 R 制作令人惊叹的 3D 图。虽然ggplot2可能为数据科学领域的任何人所熟悉,但rayshader可能并不熟悉。那么,让我们先来简单介绍一下rayshader

来自[rayshader](https://github.com/tylermorganwall/rayshader):的包装说明

rayshader 是一个开源包,用于在 R 中生成 2D 和 3D 数据可视化。 rayshader 使用基本 R 矩阵中的高程数据以及光线跟踪、球形纹理映射、叠加和环境遮挡的组合来生成美丽的地形 2D 和 3D 地图。除了地图, rayshader 还允许用户将 ggplot2 对象转换成漂亮的 3D 数据可视化。

所需的库/包:

最新版本的[rayshader](https://github.com/tylermorganwall/rayshader)可从 github 上获得,可以使用devtoolsremotes安装。

devtools::install_github("tylermorganwall/rayshader")

并且,确保你已经获得了最新版本的ggplot2。如果你是一个爱潮流的人,那就买最新的吧。

install.packages('tidyverse')

数据

为了保持这篇文章的最低要求,我们将使用ggplot2库中的一个内置数据集faithfuld

> glimpse(faithfuld)
Observations: 5,625
Variables: 3
$ eruptions <dbl> 1.600000, 1.647297, 1.694595, 1.741…
$ waiting   <dbl> 43, 43, 43, 43, 43, 43, 43, 43, 43,…
$ density   <dbl> 0.003216159, 0.003835375, 0.0044355…

如你所见,faithfuld有 3 个连续变量,我们将用它们来绘图。

2D 图

我们的 3D 绘图之旅从普通的 2D ggplot2 绘图开始。我们将使用 geom_raster 在waitingeruptions之间构建一个密度图,以查看数据情况。

faithful_dd <- ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  ggtitle("3D Plotting in R from 2D_ggplot_graphics") +
  labs(caption = "Package: rayshader") +
  theme(axis.text = element_text(size = 12),
        title = element_text(size = 12,face="bold"),
        panel.border= element_rect(size=2,color="black",fill=NA)) faithful_dd

正如你在上面的代码中看到的,随着情节的展开,我们对情节的外观做了一些美学上的改进

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

嗯,这很好,但这是我喜欢以 3D 形式显示一座小山的地块之一,事实上,是两座小山。因此,让我们推进到一个三维绘图。

从 2D 情节到 3D 情节的旅程——一条线!

从 2D 情节到 3D 情节的旅程,只是来自包rayshader的一行额外的代码。函数plot_gg() 采用一组参数来定义 3D 绘图的外观。

plot_gg(faithful_dd, multicore = TRUE, width = 8, height = 8, scale = 300, 
          zoom = 0.6, phi = 60,
          background = "#afceff",shadowcolor = "#3a4f70")

faithful_dd是我们在上一步中生成的 ggplot2 对象。因为大多数参数都是不言自明的,比如在渲染时激活计算机的所有内核。像zoomphi这样的参数用于设置 3D 摄像机视图应该在哪里。

让我们来看看生成的图:

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

看起来是不是很美?这些不仅仅是惊人的,而且是有目的的。想象一下,你要解释梯度下降或一些优化算法,像这样更直观和自我解释,以获得一个心理模型。

还有一件事!

这个故事不仅仅以一个 3D 情节结束,但开发人员(泰勒·摩根-沃尔)非常友好地给了我们另一个功能render_movie(),它放置了一个相机,并围绕我们刚刚建立的 3D 情节旋转,给了我们一个令人惊叹的 3D 情节视频。render_movie()内部使用av包制作视频。

render_movie("faithful_3d.mp4", frames = 480)

摘要

感谢泰勒,现在我们可以从 2D ggplots 制作出令人惊叹的 3D 绘图——只需使用一个额外的函数plot_gg()最终甚至可以制作 360 度的 3D 绘图视频。在 R here 和 rayshader 文档中了解更多关于数据可视化的信息。这里使用的代码和 sessionInfo 可在这里获得。

如何确保你的“好主意”奏效

原文:https://towardsdatascience.com/how-to-make-sure-your-good-idea-works-200352b04729?source=collection_archive---------39-----------------------

我们如何保持“数据科学”中的“科学”?

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

Photo by Gregory Jacquet on Unsplash

这是很常见的事情。我们的高层领导参加完一个会议——上帝保佑,一个“异地战略会议”——回来后,满脑子都是改善组织的好主意和方向。等等…不要翻白眼,这些绝对可以增加价值,设定重要的视觉!

然而,以我的经验来看,这些新想法与公司以前的做法相比,有时是激进的。“不用担心。”我们想,“我们就做个试点研究吧!”

在你的一生中,你见过多少“飞行员”除了看他们是否真的可以建造,以及人们对他们有“积极的感觉”之外,从来没有被真正评估过?我们对此有一个术语,它是概念验证…而不是试验

当我谈到评估时,我真正想让你想到的是测量新过程、项目或计划的输入、输出和结果的严格组合,以便与预先建立的基线和期望进行比较。度量可以是定量的,也可以是定性的(通常最好的评估是两者都是)。

将评估与 KPI 和绩效衡量区分开来的是规划评估的基础工作。理想情况下甚至在试点实施之前。

数据科学评估

我不是在谈论评估你的模型的准确性或潜在偏差,尽管这些都很重要。我想讨论一些我现在在行业中没有看到的东西:我们如何评估我们的数据科学项目的结果。

我们在数据科学中可能不会经常看到这种情况,因为它在组织的许多其他领域并不常见。

通常我们更关注“好主意”和“好主意”的实现,而不是关注我们如何测试这个主意的实际结果。我说的也不是产出,而是结果。如果你不知道这两者的区别,那么请继续阅读。

好吧,那我们怎么做?

第一步是非常清楚计划的预期目标和结果。你希望实现什么?这不仅仅是点击量、页面访问量或正确的面部识别匹配。结果就是为什么这些事情很重要…增加销售额,更高的回复率,更多的用户注册。

对结果有一个好的感觉,以及你如何相信你会实现它们,让你理解你的程序理论。程序理论是你的输入、输出和结果之间的因果联系。

它还确定了在评估过程中应该考虑的潜在子群和偶发事件,例如预期对计划有不同行为或反应的特定子群,这些子群需要以不同的方式进行评估和比较。当你决定如何度量它们时,它还会让你反思并测试你对程序理论步骤和因果关系的理解。

例如,让我们来看一个试点项目,它自动将你的新媒体故事的链接发送到带有多个标签的 twitter。在这个例子中,你寻求的结果是你的媒介故事的额外阅读和阅读时间。然而,该计划的目标(我希望)是创造一个更有见识的读者群。

试点项目的产出实际上可能是文章浏览量的增加,你的故事链接的推荐量的增加,以及关于你的故事的 twitter 流量的增加。输入内容显然是你的故事,以及自动发布和散列标签。

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

理解了你的程序变化理论,你就可以开始识别可能有不同反应的子群。你有没有那些只关注 Twitter 的读者,他们的反应与那些关注你或以不同方式看到你的文章的读者不同?

如何设计一个好的评估:

  • 收集主题的背景信息——包括对因果理论和其他实验的研究。
  • 评估可用数据源的相关性和质量。你能获得有效和准确的数据,并允许你回答程序理论所确定的问题吗?
  • 如果对上述问题的回答是否定的,那么必须有一个用于评估的原始数据获取计划。这个应该作为你项目设计的一部分来完成,但也可以在事后完成。
  • 必须根据评估的目标和试图回答的问题来选择评估标准。
  • 如果由于种种限制,不能对整个群体进行研究,那么选择一个观察样本是很重要的。注意此阶段外部有效性的风险。
  • 这有点“元”,但是对数据收集和分析进行试点测试,以确保在纸上看起来可行的东西可以在野外进行。当新的数据收集很昂贵时,这一点很重要。

两种主要类型的评价:形成性和终结性

现在著名的比喻是厨师做汤。形成性评价是她一边准备汤一边品尝,终结性评价来自客人吃完汤之后。

这里的主要观点是,形成性评估关注于实施,因此评估的目标是评估项目对需求和政策的遵守情况,并测试它们实施的有效性。形成性评价侧重于评价输入和输出。

总结性评估关注的是结果以及你在哪里实现了项目的目标。这通常需要更长的时间,并且更加难以识别和收集必要的数据。内部有效性及其面临的风险在此阶段应予以密切关注。

评估的目的——形成性

"该计划正在按计划实施吗?"这里用作评估结果的基线是计划的预期或所需的特性。这些通常可以在法律、法规、政策和程序指南、合同或其他说明中找到。

这些还包括可行性或管理问题,这些问题在早期阶段(通常)识别挑战、问题或顾虑,可以解决这些问题以更好地使计划按预期实现。

明确地说,你可以进行形成性评价而不进行终结性评价,但是如果不首先进行形成性评价,你就不能进行有效的终结性评价。

这是因为你需要知道该计划是按计划实施的,以便测试它是否产生了预期的结果。在我们的例子中,如果程序没有准确地添加想要的散列标签,那么你真的不知道你的项目是否能够增加读者群,或者最终它是否能够增加你的读者的知识。

如果是这种情况,评估可以侧重于未能按照要求实施的原因,如是否缺乏资源、知识/能力、参与者目标错误或未能设定适当的基准。

可以解决目标人群与实际人群的早期迹象,包括调查为什么这些可能不同。可以根据项目需求对挑战和障碍进行识别、分类和变更。

评估的目的—总结性的

“项目是否产生了预期的结果和目标?”,或者更常见的是,“为什么计划没有达到预期的结果?”问题是通过总结性评价来看的吗?

重复我们之前讨论的内容,在这个阶段要认识到你的数据来源和收集方法。通常,你现有的数据不足以衡量这些目标。太多的组织在这一阶段失败了,相反,他们决定只度量什么是可用的,因此从来没有真正了解他们的项目是否成功。

在我们的例子中,媒介为我们提供了一些关于结果的信息,但不是全部。当我们想出如何衡量我们的目标时,我们必须有创造性。也许我们会要求我们的读者做一个跟踪调查或小测验来衡量通过我们的文章获得的知识。

评估设计的最后一个关注点——你的受众

还有一个要记住的重要因素,当你的团队需要设计和实施科学合理的评估时,你也需要考虑你的观众的需求和期望的目标。

在大多数情况下,这主要是您的组织的领导。确保你的评估设计符合他们对项目目标和成功的理解。获得他们的共同理解和认同对于进行有效的评估至关重要,对于根据形成性评估和总结性评估的结果做出任何必要的修正也是如此。

如何做到这一点的一些提示:

(1) 平衡及时性&相关性 —确保评估彻底并能够评估结果/目标,但又足够及时以保持利益相关方参与并允许他们做出必要的更改来纠正实施中的问题。

弥合这一差距有助于关键员工理解变化或行动如何影响计划的实施,而不会因为反馈滞后而过度纠正。

(2) 关于事物如何运作的假设 —这是一个困难的认知问题,需要所有利益相关者解决,包括评估者。如果人们认为他们已经完全理解了一些东西,他们就很难接受甚至理解与他们的信念不符的信息。

意识到这一点并找出对策是很重要的。例如,让项目人员和领导参与确定项目理论可以帮助突出这些假设,但让他们基于反事实创造替代理论可以使他们在数据需要时以不同的方式解释事情。

(3) 防御惯例和情绪反应——是帮助我们保护我们坚定信念的行动,例如设计允许单方面控制的情境或反驳不一致的信息。这些防御行为之所以会发生,是因为我们做出了跳跃性的推理,让我们能够过滤掉与我们的信念相冲突的不一致的信息。

我们从事基于假设的行为,在这种行为中,我们与他人的交流是基于将我们的信念投射到他们身上,这阻碍了我们真正理解他们在说什么的能力。意识到这些潜在的陷阱在评估中是有用的,理解信息和对立观点的不适是一面旗帜,应该提醒我们质疑自己的假设和信念。

最后,这听起来很难。但是,让你的数据科学团队成员了解所涉及的方法问题,可以确保你的团队真正实现他们设定的目标。不进行这些评估的代价总是大于不进行评估的代价。

如何充分利用您的第一次数据科学训练营

原文:https://towardsdatascience.com/how-to-make-the-most-of-your-first-data-science-bootcamp-8c12653a7a48?source=collection_archive---------11-----------------------

一切都归结于准备、时间管理和对唯一重要目标的不懈关注——为工作做好准备。

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

数据科学训练营继续吸引着稳定的职业生涯中期的专业人士和学生,尽管正在就此类课程的质量和实用性进行辩论

自从 5 月底在 General Assembly 完成为期 12 周的数据科学课程后,许多朋友和前同事问我这样的训练营是否值得参加。

坦率地说,直接回答这个问题是不可能的,因为有太多的个人因素在起作用。

你的年龄、经济状况、家庭状况和职业道路都在这个决定中起着关键作用。试图建立一个支持或反对参加训练营的普遍案例是徒劳的。

例如,如果你像我一样 45 岁左右,训练营是唯一可行的选择。大学或理工学院的冗长课程是不现实的,因为当你毕业时,你已经接近或超过 50 岁了。

如果你还在考虑是否报名,我唯一的建议是研究训练营的导师,而不是担心选择哪所学校。一个好的教练会让变得与众不同。如果组织者软弱或不感兴趣,一所外表华丽的学校就没有多大意义。

对于那些已经报名或决定加入数据科学营地的人,这里是我关于如何充分利用它的实地笔记。

#1:提前准备

在训练营中,你可能犯的第一个也是最致命的错误就是认为你可以把严肃的学习留到课程开始的时候。你不能,因为训练营的重点是课程,而不是学生。

坦白地说,大多数训练营的主题数量之多令人疯狂,只有几天时间专注于核心领域,如统计学、熊猫和可视化图书馆。如果你落后了,教练不能也不会放慢速度。如果你已经在前几周落后了功课,你很可能永远也赶不上了。

那么应该提前做多少准备呢?这取决于你的教育和工作背景,以及你对自己的诚实程度。

首先,我建议你在留出课前准备的时间时,考虑几个月,而不是几周。

我花了大约 5 个月的时间准备我的课程,期间我参加了 Codecademy 和 Data Quest 的在线课程,并在导师的指导下学习。五个月的时间听起来可能有点多余,但是如果你像我一样没有编码背景,那么坦白地说,五个月的时间并不足以从头开始讨论关键主题。

当我在 2019 年 3 月开始上课时,我已经完成了一个简单的、自我分配的关于新加坡天气模式的分类项目。但即使在那时,每天都要努力跟上课堂的紧张节奏。如果我没有花几个月的时间自己复习基础知识,这将是一场彻底的灾难。

部分问题源于这样一个事实,即大多数学生期待传统的课堂体验,并且不熟悉训练营的运作方式。所以当课程以每小时 100 英里的速度向前推进时,每个人都震惊了。

根据我所看到的,训练营根本不适合教你基础知识。相反,它们被设计来加速你在自己的时间里已经在做的事情。

从这个角度来看,做好充分准备并不是像我们在新加坡所说的“怕输”。相反,它是关于确保你在你的学习旅程中得到最大可能的推动。

#2:抑制你的(过度)热情

信不信由你,你会遇到一些同学,他们认为在已经塞得满满的课程之外钻研深度学习是个好主意。如果你是个天才,那就想尽一切办法去做吧。但是如果你像我一样是一个经常学习的人,不要屈服于“害怕错过”,或者他们所说的 FOMO

原因虽然显而易见,但对于过于热情的学生来说并不总是显而易见的——学好基础知识已经够难了。

数据科学本质上是多学科的。你可能擅长编码或统计,但你不太可能同样擅长解决业务问题、为普通读者可视化数据或向不安的观众清楚地展示你的工作。

专注于拓展训练营试图传授的技能范围,而不是渴望那些没有传授的技能。这就是课程结束后你剩下的时间要做的事情。

对抗 FOMO 浪潮的最有效的现实检验之一是定期阅读入门级数据科学职位的招聘信息。一两周之后,你会注意到,与深度学习相关的所有东西在网上的热度,与雇主(至少是新加坡的雇主)在入门级员工中寻找的东西——SQL、数据清理、可视化技能和基本的机器学习知识——之间存在明显的脱节。

当然,拥有一些关于深度学习发展的对话级知识是很好的。但是不要贪多嚼不烂,除非你打算 12 周不睡觉。

#3:时间管理

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

Time, like traffic in some parts of the world, is relative.

上面这幅半开玩笑的插图是为了取笑行人如何处理越南混乱的交通。但这也是对训练营开始后一些学生扭曲的时间观念的准确描述。

训练营的时间会比你想象的要快,12 周左右的时间并不能转化为学习自然语言处理等沉重话题的大量时间。你还必须完成几项主要作业,包括课程结束时的一个展示项目。

然而,有些人会陷入自以为还有时间的陷阱,而事实上他们没有。

对于展示项目来说,时间的缺乏成为一个特别大的问题,它需要比通常留出的两周时间更多的时间来研究、计划和执行。如果你最初的想法失败了,留给 B 计划的时间也很少。

在训练营开始时,你的导师会尽职尽责地告诉全班同学,他们应该为他们的最终项目提出一两个想法,并开始研究如何获得项目所需的数据。

除了认真对待这些建议并付诸行动,我想不出更好的方法让你在训练营期间生活得更轻松。

我从一开始就知道我想为我的展示项目做什么。许多繁重的工作,如 T2 的清理、清理和格式化成千上万的推文,被分散到训练营的前几周。当项目主题——关于 Twitter 上国家支持的虚假信息运动——被批准时,我已经准备好了数据和项目大纲。

在训练营期间将你的项目管理技能付诸实践。这都是关于管理潜在失败的风险,给自己足够的缓冲来应对意外事件——如果你在第 10 周开始你的最终项目,你就不会有这些了。

#4 工作就绪

在我参加的训练营,没有考试,也没有毕业时要公布的最终成绩。相反,学校的重点是帮助学生在毕业三个月后找到一份工作——这很适合我们大多数人。

但是你会惊讶地发现,一旦每天枯燥的讲座/实践/项目开始了,就很容易忘记这个至关重要的最终目标。

当你的求职进入高潮,你正在回顾你的项目(在整个课程中你可能会被分配到其中的 3 到 4 个),看看你可以向潜在的雇主展示什么作为你的技能和知识的例子时,这一点变得非常突出。

您可能会对第二轮在 Github repo 中发现的内容感到震惊。在绞尽脑汁、辛辛苦苦地完成一个家庭或工资价格预测项目后,很自然地会想把笔记本扔到 Github 上,然后继续前进。

这的确是一种宣泄,但也是有代价的。

作为一个在数据科学行业没有正式工作经验的人,这些不同的项目工作是你在求职面试中可以展示你的就业能力的少数几件事情之一(除了你的其他书面资格)。

虽然期末(或顶点)项目被宣传为你能力的主要展示品,但对于那些希望看到你更多作品的要求更高的雇主来说,这可能还不够。

我的建议是:认真对待较小的项目,把它们当作你可以在未来的工作面试中使用或重新包装成“工作样本”的东西。这可能涉及到构建一个简单的 web 应用程序,该应用程序利用了您已经构建的机器学习模型。或者你可以通过 Tableau 这样的平台巩固和提高你的数据可视化成果。

毫无疑问,当你在与大量的课程材料作斗争的时候,很难去想那么远。但长期回报是值得的。我当然希望我从一开始就这样对待我的项目工作。

至少,确保你的 repos 和 Github 账户组织有序,每件作品都有清晰的描述。

如果你告诉自己,在训练营结束后,你会清理混乱的回购或重构代码,你可以相当肯定这永远不会发生。从一开始就做好这件事,你就可以省去一大堆的悲伤。

我对训练营的经历有疑虑吗?毫无疑问。但那是以后的事了。

就像他们说的,与其生气地回头看,不如向前看。如果您有具体的疑问,请随时通过以下渠道联系:

领英:https://www.linkedin.com/in/chuachinhon/

推特: @chinhon

如何让您的数据科学演示精彩难忘

原文:https://towardsdatascience.com/how-to-make-your-data-science-presentation-great-and-memorable-8fdb07978a7e?source=collection_archive---------14-----------------------

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

Photo by Taylor Grote on Unsplash

还记得上一次启发你的数据科学演讲吗?你认为给人留下深刻印象的那个。吸引你注意的仅仅是数学术语还是最先进的精确度?

肯定不是。有效的演示技巧在将想法传达给更广泛的受众方面发挥着重要作用。对于任何研究人员来说,掌握令人难忘的演讲技巧都是至关重要的。

出色的演讲有助于你为你的研究和你自己建立一个品牌,这将极大地指导你的学术或职业前景。

T 他的文章会引导你了解一些关键点,这些关键点会让数据科学研究演示更加有效。我首先讨论五个一般性的想法,然后深入一个要点,那就是你演讲的故事情节。

  1. 结构好。一个好的演示文稿会一步一步地带领观众踏上旅程。在你前进的每一步,你的想法都应该向听众展示一个清晰的最终目标。一个常见的结构总是从介绍你自己和你的研究问题开始。重要的是一开始就设定一个清晰的场景,这样你就可以从那里开始你的故事。故事情节,事实上是一个好的演示文稿最重要的特征,将在后面的文章中详细讨论。
  2. 专业幻灯片。幻灯片强化了你的故事。你不能低估高质量幻灯片对观众的影响。在这里,重要的是要记住,你的听众在听你演讲的时候会倾向于阅读你幻灯片上的所有内容。所以明智地选择你想要的幻灯片。否则,它会分散你的听众的注意力,最终使他们迷惑。幻灯片上的大量文本通常不是一个好主意。事实证明,有效的图形能够抓住注意力,帮助清晰理解。尽可能保持你的幻灯片整洁。
  3. 技术贡献。任何研究的最终目标都是你对一个行业或知识的贡献。所以你要强调你在工作中所能做出的技术贡献。同样,这是你故事情节的重要部分,在这篇文章中会进一步讨论。
  4. **清晰有趣的传递。**不管你的材料有多好,你的表达方式将决定你的演讲是否会让人难忘。清楚和正确地使用语言与良好的发音和相位一样重要。确保每个人都能听到你,不要忘记微笑。
  5. **自信的演讲者。**有些人可能会认为自信取决于每个人的性格,但有些因素可以帮助你在演讲时提高自信水平。在这里,演讲前的充分准备是最重要的。确保你在上台前至少练习几次演讲。相信我,这不会浪费时间,而且会比你想象的更能增强你的自信!

基调的故事情节

现在,让我们来关注准备和提交研究报告时最重要的一点,故事情节。这决定了在整个演讲过程中你会有多少只耳朵。

以下是您希望按顺序构建的关键领域。当然,根据你的喜好,有些主题是可以互换的,但是如果你正在寻找一个指导你准备演讲的大纲,这是一个有效的大纲。

  1. **设定场景。**这应该是首要目标。你在研究中要解决的问题是什么?为什么它是及时的、相关的和有趣的?为什么重要?让这个场景非常清晰,你就抓住了观众的注意力。它应该成为你想要传达的东西的基础。以及你努力的目的。当听众能理解你的背景时,就很难忽视你。
  2. **专注于你的假设/解决方案。**设定完成后,你可以让听众专注于你针对问题的假设/解决方案。这是至关重要的,因为现在他们马上就能看到你的提议,他们渴望知道更多。这样,你就可以引导他们进入揭示你的方法和程序的下一步。
  3. 方法/方法/完成的工作。现在,你解释一下你为实现上一步中的目标所做的工作。一定要简洁。没有人喜欢数学公式或深奥的技术细节。在这一步,也不要急于炫耀你的数学或编码技能。简单地呈现你在更高层次上采取的步骤。如果有人有兴趣深入挖掘技术细节,他们将在稍后跟进。流程图和图表在这一步非常有效。文字段落是一个错误。
  4. 上下文/相关工作。现在有些人可能会争辩说,这一点应该放在方法论之前。在某些情况下,这可能是真的。但我的论点是,在演讲开始时,听众的注意力持续时间会很长。这就是你必须让你的工作成为焦点的地方。如果你在这方面做得很好,无论如何,当你进入这一步时,你会拥有观众。因为他们急切地想知道你做了什么,所以一开始介绍相关的工作可能会让他们厌烦而不切入正题。然而,背景很重要,你必须让你的方法从现有的技术和想法中脱颖而出。
  5. 做出的贡献和取得的成果。突出你的影响力。展示你的应用成果和结果。指出你对该领域的知识和理解所做的贡献。这就是你在你提出的解决方案中加强自己立场的地方。
  6. **展望/未决问题/未来工作。**最后,记下你努力展示的更广阔的舞台。现在要思考的一点是,你提到过你的研究的局限性吗?我的意见是肯定的。这是传达你弱点的地方,这会给你的工作留下积极的印象。此外,用你的特殊方法提出未来工作的问题,并强调潜在的影响。

我希望这篇文章能为那些希望提高自己表达技巧的人提供指导,尤其是在数据科学这个高度技术性的领域。就我个人而言,这是我花了大量时间来提高自己的东西,因为我坚信有效的演示对你的研究的影响。如果运用得当,这些技能将有助于你提升自己作为研究员或数据科学家的职业生涯。

我也想听听你对此的看法。在 Twitter 上联系我或者在下面评论。

感谢阅读。

如何让你的数字战略获得回报?(提示:数据科学)

原文:https://towardsdatascience.com/how-to-make-your-digital-strategy-payoff-e6891ae82766?source=collection_archive---------32-----------------------

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

Source: Pixabay

数字广告支出正在超过传统广告支出(电视、印刷、户外)。大多数品牌已经将重点转移到通过各种数字平台直接瞄准客户,以获得更大的销售份额。

数字活动有助于在更个性化的层面上锁定客户。有效的数字战略包括关注高质量的内容和锁定正确的受众。但是,确定正确战略的关键因素是了解哪些媒体和活动最有效,并为未来制定正确的渠道组合。营销人员应该遵循一种综合的方法来深入挖掘最有效的媒体和活动。

打开集合方法的包装

让我们打开系综方法。

  • 首先了解营销组合(自上而下的方法)。传统与数字营销推动了多少销售?。找出在各种营销投入上花费的每一美元的投资回报。

每个营销人员都希望所花的钱有很高的投资回报率,他们的想法是不要把钱留在桌面上。

  • 然后了解每项营销活动中哪些活动最有效。例如,如果正在显示 3 个 YouTube 广告,分析哪一个广告的转化最有效。这将有助于理解哪个广告以最有效的方式传达信息。对创意、文案持续时间和类型的深入分析有助于确定最有效的广告,并有助于制定成功的传播策略。
  • 在了解营销效果的同时,营销人员通常只了解营销投入对其业务指标(销售额、市场份额等)的直接影响。这导致了对营销投入的不当归因。纠正措施应该是了解营销投入对销售的间接和直接影响。例如,观看电视广告后购买产品的人可能会先观看 YouTube 广告。因此,销售必须归功于电视和数字(YouTube)接触点。直接和间接分析有助于将正确的销售额归因于这些营销投入。
  • 接下来,通过使用归因建模方法了解客户转化路径。这将提供客户层面的具体见解(自下而上的方法),并揭示客户转化过程中的细微差别。
  • 营销组合和归因模型中收集见解,获得有效活动的整体情况以及每项活动的预算。

整体方法将通过对线下和线上接触点的深入分析提供 360 度的洞察力,并有助于制定有效的数字战略。

与阿里马实验室 取得联系,了解如何通过集成技术获得正确的数字战略。

如何用 Optuna 让你的模型牛逼

原文:https://towardsdatascience.com/how-to-make-your-model-awesome-with-optuna-b56d490368af?source=collection_archive---------7-----------------------

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

Odysseus and the Sirens source

轻松高效地优化模型的超参数

超参数优化是训练机器学习模型的关键步骤之一。由于要优化的参数很多,训练时间长,并且要多次折叠以限制信息泄漏,这可能是一项繁琐的工作。处理这个问题有几种方法:网格搜索、随机搜索和贝叶斯方法。 Optuna 是后一种的实现。

Will Koehrsen 写了一篇关于使用贝叶斯代理模型进行超参数优化的优秀文章。我也解释不清楚了:)你可以在这里找到。在第二篇文章中,Will 将介绍如何用 Python 中的hyperpt包实现该方法。

关于 Optuna

这个软件包过去是,现在仍然是,由日本人工智能公司 Preferred Networks 开发的。在很多方面,Optuna 与 Hyperopt 相似。所以你为什么要烦恼呢?有几个原因:

  • 可以指定优化过程应该持续多长时间
  • 与 Pandas 数据框架集成
  • 该算法使用剪枝来尽早丢弃低质量的试验
  • 这是一个相对较新的项目,开发人员还在继续工作
  • 它比远视更容易使用(至少对我来说)

示例演练

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

Jason and the Argonauts source

数据

我使用了来自 Scikit-Learn 的 20 个新闻组数据集来准备实验。您可以在下面找到数据导入:

模型

这是一个自然语言处理问题,模型的管道包含一个特征提取步骤和一个分类器。管道的代码如下所示:

优化研究

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

The School of Athens by Raphael source

创建的研究优化了矢量化步骤和模型超参数。可以从 5 个发行版中选择:

  • 统一-浮点值
  • 对数均匀-浮点值
  • 离散统一-有间隔的浮点值
  • 整数-整数值
  • 分类-列表中的分类值

语法如下所示:

然后,这些值被传递到参数字典,并在以后设置为优化模型。这些值可以在字典中给出,但是这会使代码行变得很长,很难阅读。

定义函数的最后一步实际上是定义目标。它应该只返回一个值。强烈建议根据交叉验证(如有可能,分层)对模型进行评分,并给出较高的折叠数(绝对最小值为 8)。

请记住,截至 2019 年 2 月 24 日,只可能最小化函数值。最大化目标还没有实现,所以如果你想找到最高值,只需在它前面加一个减号。

我还添加了一行代码,将研究结果转储到 pickle 文件中。它允许你保持进度,即使这个过程由于某种原因被中断(因为你的决定或者你的机器的决定)。您可以在下面找到目标代码:

要创建研究的实例,您可以创建一个新实例,也可以从 pickle 文件中加载它以继续之前的实验。第二步是进行研究。您可以在以秒为单位的试验次数 (n_trials)或**(T5)(超时)中指定研究持续的时间。后者的最后一次试验在暂停前开始,整个研究持续的时间比指定的时间长一点。您可以在下面找到代码和默认输出。**

请注意,目前显示的是最佳超参数。

您可以分别使用 best_valuebest_params 属性访问最佳指标的值和最佳参数字典。您可以使用 trials 属性访问试用版,但是 Optuna creators 准备了更好的东西。使用 trials_dataframe()方法创建一个包含试验详情的熊猫数据框架。

研究结束后,您可以为模型设置最佳参数,并在完整数据集上对其进行训练。

为了可视化正在进行的过程,您可以从另一个 Python 线程(即 Jupyter Notebook)访问 pickle 文件。

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

Ongoing study’s progress. Image by author

您可以在这个 GitHub 资源库中找到示例笔记本和可视化笔记本。

修剪技术

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

A man pruning olives source

Optuna 的创造者表示,该软件包在速度和质量方面优于 Hyperopt。以下是他们在项目网页上写的内容:

修剪功能会在训练的早期阶段自动停止没有希望的试验(也称为自动提前停止)。Optuna 提供了在迭代训练算法中简洁地实现剪枝机制的接口。

[…]

例如,与现有的优化框架相比,我们的基准实验展示了修剪特性的优势。

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

https://optuna.org/assets/img/Pruning_of_unpromising_trials.png

我不得不说,就修剪机制而言,我有一些复杂的感觉。我坚信,在超参数优化方面,多重交叉验证技术是必不可少的。在 Optuna 的开发人员在每次试验中提供的剪枝示例中,对验证集进行了采样。在我看来,它增加了度量的方差,因此使得优化不那么可靠。如果验证集是常量,它将导致代理的模型过度拟合到验证集。当然,如果数据集很大,以防止方差/过拟合问题发生,这可能不是一个问题。

在我看来,最好的选择是以某种方式将交叉验证和修剪结合起来。也许在 k 次折叠(k 小于折叠总数)后验证试验是个好主意?

摘要

对于我来说, Optuna 成为首选优化框架。它易于使用,可以设置研究的超时,休息后继续研究,并轻松访问数据。该项目仍在开发中,我期待着新的功能。我认为首选网络团队过去和现在都做得很好!谢谢大家!

资源:

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

Odyssey source

非常欢迎您对这篇文章的反馈!请让我知道你的想法!

如何自制深度学习加速器芯片!

原文:https://towardsdatascience.com/how-to-make-your-own-deep-learning-accelerator-chip-1ff69b78ece4?source=collection_archive---------1-----------------------

目前,全球有超过 100 家公司正在构建面向深度学习应用的 ASICs(专用集成电路)或 SOC(片上系统)。这里有一长串的公司。除了谷歌(TPU)、脸书、亚马逊(推理)、特斯拉等这些创业大公司都在开发定制的 ASIC,用于深度学习训练和推理。这些可以分为两种类型—

  1. 训练和推理——这些 ASIC 设计用于处理深度神经网络的训练和执行推理。训练像 Resnet-50 这样的大型神经网络是一项涉及梯度下降和反向传播的更加计算密集型的任务。与训练相比,推理非常简单,需要较少的计算。今天最流行的深度学习的 NVidia GPU 既可以做训练,也可以做推理。其他一些例子还有 Graphcore IPU谷歌 TPU V3脑波强化器等。OpenAI 有很棒的分析显示最近训练大型网络所需的计算增加。
  2. 推论——这些 ASIC 被设计为运行 DNN(深度神经网络),这些网络已经在 GPU 或其他 ASIC 上进行过训练,然后经过训练的网络被修改(量化、修剪等)以在不同的 ASIC 上运行(如谷歌珊瑚边缘 TPU、英伟达杰特森纳米)。大多数人都说深度学习推理的市场比训练大得多。如 TensorFlow Lite 团队所示,即使是基于 ARM Cortex 的非常小的微控制器(MCU)——M0、M3、M4 等也可以进行推理。

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

AI Landscape by Shan Tang : Source

制造任何芯片(ASIC、SOC 等)都是一个昂贵、困难和漫长的过程,通常由 10 到 1000 人的团队完成,具体取决于芯片的大小和复杂程度。这里我只提供一个针对深度学习 推理 加速器的简要概述。如果你已经设计了芯片,你会发现这太简单了。如果你仍然感兴趣,请继续阅读!如果你喜欢它,分享和👏。

现有 ASIC 的架构

让我们首先来看看目前正在开发的一些加速器的高层架构。

Habana GoyaHabana labs是一家初创公司,正在开发用于训练的独立芯片——高迪和推理——Goya。

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

Habana Goya High-Level Architecture: Source

GEMM 引擎——通用矩阵和乘法引擎。矩阵乘法是所有 DNN 中的核心运算——卷积可以表示为矩阵乘法,全连接层是直接的矩阵乘法。

TPC——张量处理核心——这是一个实际执行乘法或乘加(MAC)运算的模块。

本地内存和共享内存—这些都是某种形式的高速缓存,通常使用 SRAM (静态随机存取存储器)和寄存器文件(也是一种静态易失性存储器,只是密度比 SRAM 小)。

Eyeriss——来自麻省理工学院的 eye riss 团队一直在研究深度学习推理加速器,并发表了几篇关于他们的两个芯片的论文,即 Eyeriss V1 和 V2 。你可以在这里找到好的教程

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

Eyeriss V2 top-level architecture: Source

英伟达深度学习加速器(NVDLA)

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

NVDLA : Source

数据流架构 —数据流架构至少从 20 世纪 70 年代就开始研究了。 Wave Computing 想出了数据流处理单元 (DPU)来加速 DNN 的训练。 Hailo 也使用了某种形式的数据流架构

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

Hailo — Embedded Vision Summit — Source

Gyrfalcon —他们已经发布了一些针对低功耗边缘人工智能应用的芯片,如 Lightspeeur 2801S

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

Matrix Processing Engine (MPE) — Source

谷歌 TPU 也有脉动数据流引擎。

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

Matrix Multiplier on TPU — Source

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

TPU Floor plan — Source

统一缓冲区—这基本上是本地内存/缓存,可能使用 SRAM 实现。

DRAM —这些是访问外部 DRAM 的接口,使用其中两个接口,您可以访问两倍的数据。

关键模块

基于上面的一些例子,我们可以说下面是制造深度学习推理加速器所需的关键组件。此外,我们将只关注 8 位推理引擎,该引擎已被证明对许多应用足够好。

矩阵乘法单元——它有不同的名称,如 TPC(张量处理核心)、PE 等。GEMM 参与了 DNN 的核心计算,要了解更多关于 GEMM 阅读这篇伟大的帖子

SRAM —这是用于存储权重或中间输出/激活的本地存储器。

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

Data movement Energy Vs Compute — Source — Efficient Processing of Deep Neural Networks: A Tutorial and Survey

为了减少能量消耗,存储器应该尽可能靠近处理单元,并且应该尽可能少地被访问。

互连/结构—这是连接所有不同处理单元和内存的逻辑,以便一个层或模块的输出可以传输到下一个模块。也称为片上网络(NoC)。

接口(DDR、PCIE) —需要这些模块来连接外部内存(DRAM)和外部处理器。

控制器——这可以是 RISC-V 或 ARM 处理器或定制逻辑,用于控制所有其他模块和外部处理器并与之通信。

架构和指令集

如果我们观察所有架构,我们会发现内存总是尽可能靠近计算。原因是移动数据比计算消耗更多的能量。让我们来看看 AlexNet 架构所涉及的计算和内存,它在 2012 年打破了 ImageNet 记录——

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

AlexNet Layers and Parameter — Source

AlexNet 由 5 个构成层和 3 个全连接层组成。AlexNet 的参数/权重总数约为 6200 万。假设在权重量化之后,每个权重被存储为 8 位值,因此如果我们想要将所有权重保存在片内存储器中,则至少需要 62 MB 的 SRAM 或 62*8 兆位= 4.96 亿 SRAM 单元。如果我们使用 6T(六晶体管)SRAM 单元,仅存储器就需要 496M * 6 ~ 2.9 亿个晶体管。因此,在决定架构时,我们必须记住在不增加片外重量(这会增加功耗)的情况下,我们可以支持哪些 DNN 架构。由于这个原因,许多创业公司展示了使用更新的架构,如 MobileNetV2 ,它使用更少的参数和更少的计算,例如,ImageNet 上前 5 名准确率为 92.5%的 MobileNetV2 的一个检查点只有 6.06M 个参数,在单个图像推断期间执行 582M 次 MAC(乘和累加)操作。

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

Accuracy Vs Model Size — Source

权重修剪是另一种可以用来减少模型大小(从而减少内存占用)的技术。参见模型压缩的结果。

MobileNetV2 使用不同于传统卷积的深度方向可分离卷积,因此加速器架构必须足够灵活,以便如果研究人员提出不同的操作,它们仍然可以根据加速器上可用的指令集来表示。

我们可以为我们简单的加速器想出一套非常简单的指令,就像—

  1. 加载数据—获取源地址和目标地址
  2. MAC(乘加)—假设数据已经在本地寄存器中。
  3. 存储结果—存储中间结果
  4. 填充—添加零

硬件加速器编译器

编译器将使用 PyTorch 或 Tensorflow 用 python 编写的高级代码转换为特定芯片的指令集。下面是开发/使用这些定制 ASIC 的一些框架。这个过程可能非常困难和复杂,因为不同的 ASIC 支持不同的指令集,如果编译器没有生成优化的代码,那么您可能没有充分利用 ASIC 的功能。

脸书 Glow —哈瓦那实验室利用 Glow 框架为他们的 ASIC 开发了后端。

TVM —这是一个开源的深度学习编译器堆栈,由华盛顿大学的研究人员发起。TVM 框架还包括多功能张量加速器 (VTA),这是一个可编程的独立加速器。亚马逊 Sagemaker Neo 使用 TVM 编译深度学习模型,部署在不同的硬件上。

TensorFlow MLIRMLIR是 Google 为 tensor flow 提供的编译器基础设施,最近已经成为 LLVM 项目的部分。

英特尔 ngraph —这是由 Nervana 开发的,用于 nerv ana/英特尔深度学习加速器。

EDA 工具和高级综合

Chisel 是一种硬件构造/描述语言,最初由伯克利的研究人员开发。它实际上是用 Scala 编写的,用于许多基于 RISC-V 的处理器的设计。

综合、时序和布局——RTL 综合是将 Verilog/VHDL 等语言编写的高级代码转换成逻辑门的过程。时序工具使用逻辑门和布线的布局前和布局后延迟信息来确保设计正确。在时序设计中,一切都与时钟沿有关,因此时序非常重要。布局工具从合成的网表生成布局。 Synopsys (设计编译器,黄金时间)和 Cadence 工具最常用于这些步骤。

高级综合(HLS)——HLS 是指用 C/C++等高级语言描述硬件,然后转换成 VHDL/Verilog 等 RTL(寄存器传输级)语言的过程。甚至还有一个 python 包http://www.myhdl.org/——将 python 代码转换成 Verilog 或 VHDL。 Cadence 拥有支持 C/C++等的商业工具,这些工具对定制设计非常有帮助。Google 使用 Mentor Graphics Catapult HLS 工具开发了 WebM 解压 IP

可用 IP

现在,我们已经确定了所需的关键模块,让我们看看我们使用什么现有的 IP(免费或付费)。

Nvidia 深度学习加速器(NVDLA) — NVDLA 是 Nvidia 发布的免费开放架构,用于深度学习推理加速器的设计。源代码、驱动程序、文档等可在 GitHub 上获得。

SRAM——不同类型的 SRAM IP——单端口、双端口、低功耗、高速等,可从 Synopsys 和其他公司获得。通常,它们提供 SRAM 编译器,用于根据芯片要求生成特定的 SRAM 模块。

寄存器文件—该 IP 也可从 Synopsys 和各种类型的逻辑标准单元获得。

互连/结构/NoC——这个 IP 的一个选项是 Arteris ,他们有针对深度学习加速器的 FlexNoC AI 包

处理器——各种 RISC-V 处理器内核可以免费获得。甚至 ARM 也免费或以非常低的前期成本向初创公司提供许可ARM Ethosnpu 是专门为神经网络设计的——Ethos N37、N57、N77。

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

AMR Ethos NPU — Source

Cadence Tensilica DNA 100—根据我们的目标应用/行业,Cadence 提供的 IP 可配置为 0.5 至 100 的 TMAC 操作。

有很多其他可用的知识产权,所以我的建议是在设计自己的知识产权之前,从像 ARMCeva恩智浦等公司寻找已经测试过的知识产权。

设计流程

有很多关于 ASIC 设计流程、数字设计过程等的资源(书籍、讲座等),所以我就不多讲了。

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

ASIC Flow from Wikipedia — Source

代工厂和工艺技术

芯片的制造是在大型晶圆厂(制造厂或代工厂)完成的,目前,很少有公司像英特尔、三星、德州仪器、恩智浦等拥有自己的晶圆厂。甚至像高通、AMD 等大公司也使用外部代工厂,所有这样的公司都被称为无晶圆厂。以下是一些最大的半导体代工厂

TSMC(台积电) — TSMC 是世界上最大的代工厂,为高通、苹果等公司制造芯片。对于小型创业公司来说,在 TSMC 进行生产可能具有挑战性,因为他们的大部分生产能力都被大公司利用了。

UMC(联合微电子公司)——UMC 也与包括小型创业公司在内的大量客户合作。目前,UMC 可用的最小工艺是 14 纳米。

还有其他几家代工厂,如全球代工厂三星代工厂

流程选择

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

Cross-section of two transistors in a CMOS gate, in an N-well CMOS process

IC 制造工艺是通过晶体管的尺寸和金属连接的宽度来衡量的。长期以来,工艺尺寸一直在下降(摩尔定律),这就是现代 IC 每年包含越来越多的晶体管(这曾经是由摩尔定律决定的)。目前,最先进的工艺节点是 7 纳米,使用 7 纳米工艺的产品仅在 2019 年推出。所以目前大部分产品都是使用 14 纳米/16 纳米工艺制作的芯片。工艺越先进,成本就越高,因此大多数小型创业公司最初会使用稍微老一点的工艺来保持低成本。许多开发深度学习加速器的创业公司都在使用28 纳米处理器,在某些情况下,甚至是 40 纳米工艺。泄漏是现代工艺中的一个大问题,如果芯片设计不当,可能会导致巨大的功耗。

简单成本估算

晶圆成本取决于工艺节点和各种其他因素,如加工步骤的数量(使用的层数)。成本从相对较老的工艺的几千美元到最新的工艺节点的几千美元不等,这很大程度上取决于一个人要购买多少晶片等等。

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

CMOS Wafer — Source

大多数代工厂生产 300 毫米(约 12 英寸)直径的晶圆用于数字工艺。让我们简单计算一下 12 英寸晶片的芯片成本

总面积~ π * r (r =晶圆半径)~ 70,650 mm

晶圆总成本约 1000 美元(仅用作示例)

芯片面积约 10mm×10mm ~ 100mm(TPU V1 芯片尺寸约 331 mmSRAM 单元面积约 32nm ~ 0.18um

每个晶片的芯片数约为 70,650 / 100 ~ 706(由于边缘缺陷等原因,实际上更少)

实际上好的模具有 95%的成品率 ~ 0.95 * 706 ~ 670

单个模具成本约 1000 元/670 元~ 1.5 元

包装和测试也会增加最终成本。

这是一个巨大的领域,这篇文章只是触及了其中一些话题的表面。还有很多其他的东西要涵盖,比如用于深度学习的FPGA,布局,测试,成品率,低功耗设计等等。如果人们喜欢这篇文章,我可能会再写一篇。

我热衷于构建生产机器学习系统来解决具有挑战性的现实世界问题。我正在积极寻找 ML/AI 工程师职位,你可以在这里联系我

链接

斯坦福 CS 271 —机器学习的硬件加速器

麻省理工学院的教程

橡皮泥空间

** [## MLIR:一种新的中间表示和编译框架

发布者:TensorFlow MLIR 团队

medium.com](https://medium.com/tensorflow/mlir-a-new-intermediate-representation-and-compiler-framework-beba999ed18d) [## Google Coral Edge TPU 主板与 NVIDIA Jetson Nano 开发主板—硬件比较

NVidia 和 Google 最近都发布了针对 EdgeAI 的开发板,并且以低廉的价格吸引了…

towardsdatascience.com](/google-coral-edge-tpu-board-vs-nvidia-jetson-nano-dev-board-hardware-comparison-31660a8bda88)**

如何让你的熊猫循环快 71803 倍

原文:https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06?source=collection_archive---------0-----------------------

循环通过熊猫数据帧可能会非常慢——我将向您展示一些非常快速的选项

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

如果用 Python 和 Pandas 做数据分析,用不了多久,第一次就想用循环了。然而,即使对于小的数据帧,使用标准循环也是非常耗时的,您很快就会意识到对于较大的数据帧,这可能需要很长时间。当我第一次等了半个多小时来执行代码时,我寻找了一些替代方法,我想与大家分享一下。

标准循环

数据帧是熊猫——有行和列的对象。如果你使用循环,你将遍历整个对象。Python 不能利用任何内置函数,而且速度非常慢。在我们的例子中,我们得到了一个 65 列 1140 行的数据帧。它包含 2016 - 2019 赛季的足球结果。我们希望创建一个新列来指示某个特定的球队是否打了平局。我们可以这样开始:

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

由于我们的数据框架中有英超联赛的每一场比赛,我们必须检查感兴趣的球队(阿森纳)是否参加了比赛,如果适用,他们是主队还是客场队。如您所见,这个循环非常慢,执行时间为 20.7 秒。让我们看看如何才能更有效率。

熊猫的内置函数:iterrows() —快 321 倍

在第一个例子中,我们循环了整个数据帧。iterrows()为每一行返回一个序列,因此它将一个数据帧作为一对索引进行迭代,将感兴趣的列作为序列进行迭代。这使得它比标准循环更快:

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

代码运行需要 68 毫秒,比标准循环快 321 倍。然而,许多人建议不要使用它,因为仍然有更快的选择,而且iterrows()不能跨行保存 dtypes。这意味着如果你在你的数据帧上使用iterrows(),数据类型会被改变,这会导致很多问题。要保留数据类型,您也可以使用itertuples()。这里就不赘述了,因为要注重效率。您可以在这里找到官方文档:

[## 熊猫。data frame . ITER tuples-pandas 0 . 25 . 1 文档

如果列名是无效的 Python 标识符、重复或以…开头,它们将被重命名为位置名

pandas.pydata.org](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html)

apply()方法—速度快 811 倍

apply本身并不快,但与数据帧结合使用时有优势。这取决于apply表达式的内容。如果能在 Cython 空间执行,apply要快很多(这里就是这种情况)。

我们可以将applyLambda函数一起使用。我们要做的就是指定轴。在这种情况下,我们必须使用axis=1,因为我们想要执行列操作:

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

这段代码甚至比以前的方法更快,用了 27 毫秒才完成。

熊猫矢量化—速度提高 9280 倍

现在我们可以谈一个新的话题了。我们利用矢量化的优势来创建真正快速的代码。重点是避免 Python 级的循环,就像[1]前面的例子一样,并使用优化的 C 代码,这样可以更有效地使用内存。我们只需要稍微修改一下函数:

现在我们可以创建以熊猫系列作为输入的新列:

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

在这种情况下,我们甚至不需要循环。我们要做的就是调整函数的内容。现在,我们可以直接将 Pandas 系列传递给我们的函数,这将大大提高速度。

Numpy 矢量化—速度提高 71.803 倍

在前面的例子中,我们将熊猫系列传递给了我们的函数。通过添加。值我们接收一个 Numpy 数组:

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

Numpy 数组如此之快是因为我们得到了引用局部性的好处[2]。我们的代码运行耗时 0,305 毫秒,比开始时使用的标准循环快 71803 倍。

结论

如果你使用 Python,Pandas 和 Numpy 进行数据分析,你的代码总会有一些改进的空间。我们比较了五种不同的方法,根据一些计算在我们的数据框架中添加一个新的列。我们注意到了速度上的巨大差异:

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

如果你能从这篇文章中得到两条规则,我会很高兴:

  1. 如果您确定需要使用循环,您应该始终选择 apply 方法。
  2. 否则,矢量化总是更好,因为它更快。

来源:

[1]https://stack overflow . com/questions/52673285/performance-of-pandas-apply-vs-NP-vectorize-to-create-new-column-from-existing-c
【2】https://en.wikipedia.org/wiki/Locality_of_reference

如果您喜欢中级数据科学,并且尚未注册,请随时使用我的推荐链接加入该社区。

如何用 Python 管理 Google Drive 中的文件

原文:https://towardsdatascience.com/how-to-manage-files-in-google-drive-with-python-d26471d91ecd?source=collection_archive---------3-----------------------

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

Photo on unsplash

作为一名数据分析师,大多数时候我需要与我的产品经理/利益相关者分享我提取的数据,Google Drive 始终是我的首选。这里的一个主要问题是我必须每周甚至每天都做,这很无聊。我们所有人都讨厌重复的任务,包括我。

幸运的是,谷歌为其大部分服务提供了 API。我们将使用 Google Drive APIPyDrive 来管理我们在 Google Drive 中的文件。

使用 Google Drive API

在开始编码之前,您应该准备好 Google Drive API 访问。我写了一篇关于如何通过客户端 ID 获得你的 Google 服务访问的文章。你应该可以得到包含密钥的 JSON 文件来访问你的 Google Drive。

PyDrive 入门

安装 PyDrive

我们将使用 python 包管理器来安装 PyDrive

pip install pydrive

正在连接到 Google Drive

PyDrive 只用 2 行代码就使认证变得非常容易。

你必须JSON 文件重命名为“client _ secrets . JSON”,并将它与你的脚本放在同一个目录下。

将启动浏览器并要求您进行身份验证。选择您想要访问的 google 帐户并授权应用程序。

drive = GoogleDrive(gauth)创建一个 Google Drive 对象来处理文件。您将使用该对象来列出和创建文件。

在 Google Drive 中列出和上传文件

第 1 行到第 4 行将显示 Google Drive 中的文件/文件夹列表。它还会给你这些文件/文件夹的详细信息。我们获取您想要上传文件的文件夹的文件 ID 。在这种情况下,To Share是我上传文件的文件夹。

文件 ID 很重要,因为 Google Drive 使用文件 ID 来指定位置,而不是使用文件路径。

drive.CreateFile()接受元数据 ( dict )。)作为输入来初始化一个 GoogleDriveFile。我用"mimeType" : "text/csv""id" : fileID初始化了一个文件。这个id将指定文件上传到哪里。在这种情况下,文件将被上传到文件夹To Share

file1.SetContentFile("small_file.csv")将打开指定的文件名并将文件的内容设置为 GoogleDriveFile 对象。此时,文件仍未上传。您将需要file1.Upload()来完成上传过程。

访问文件夹中的文件

如果你想上传文件到一个文件夹里的文件夹里呢?是的,你还需要文件 ID !你可以使用ListFile来获取文件,但是这次把root改为file ID

file_list = drive.ListFile({'q': "'<folder ID>' in parents and trashed=false"}).GetList()

现在我们可以进入文件夹To Share中的文件夹picture

除了上传文件到 Google Drive,我们还可以删除它们。首先,用指定的文件 ID 创建一个 GoogleDriveFile。使用Trash()将文件移至垃圾箱。您也可以使用Delete()永久删除文件。

现在你已经学会了如何用 Python 管理你的 Google Drive 文件。希望这篇文章对你有用。如果我犯了任何错误或打字错误,请给我留言。

可以在我的 Github 中查看完整的脚本。干杯!

如果你喜欢读这篇文章,你可能也会喜欢这些:

[## 如何用熊猫用 Python 重写 SQL 查询

在 Python 中再现相同的 SQL 查询结果

towardsdatascience.com](/how-to-rewrite-your-sql-queries-in-python-with-pandas-8d5b01ab8e31) [## 如何掌握 Python 命令行参数

使用命令行参数创建自己的 Python 脚本的简单指南

towardsdatascience.com](/how-to-master-python-command-line-arguments-5d5ad4bcf985)

你可以在 Medium 上找到我其他作品的链接,关注我 这里 。感谢阅读!

如何管理数据科学中的冒名顶替综合症

原文:https://towardsdatascience.com/how-to-manage-impostor-syndrome-in-data-science-ad814809f068?source=collection_archive---------4-----------------------

如果他们发现你一无所知怎么办?

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

冒名顶替综合症是数据科学实验室里的大象。每个人都有,没人觉得别人有,也没人说。

我很惊讶更多的人不公开讨论。我在一家数据科学导师创业公司工作,在那里我可能会花 20%的时间帮助数据科学家克服冒名顶替综合症以及随之而来的自我怀疑。我看到它阻碍了更多有抱负的数据科学家和机器学习工程师,多得数不清。

我从数百次关于冒名顶替综合征的谈话中学到了很多,从我所见,克服它的最好方法就是理解它。这就是这篇文章的内容。

症状和原因

关于冒名顶替综合症最奇怪的事情是,它与技术技能呈正相关*:我与之交谈过的最有能力的数据科学家和 ML 工程师往往是最自我批评的。*

起初,我发现这令人困惑:为什么最博学的数据科学家最自我怀疑?

然后,我想起了一个叫做邓宁-克鲁格效应的东西。DKE 是一个被充分研究过的现象,在这个现象中,在一项任务中表现糟糕的人过度高估了他们在这项任务中的能力水平。

例如,如果你给人们一个物理测试,你让他们预测他们做得如何(他们的“原始分数”),以及他们对自己的预测有多少信心(“项目信心”),你会发现表现最差的人往往认为他们做得很好,非常感谢:

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

Adapted from Williams, Dunning and Kruger’s paper: “The Hobgoblin of Consistency: Algorithmic Judgment Strategies Underlie Inflated Self-Assessments of Performance”

冒名顶替综合征与邓宁-克鲁格效应相反。就像不称职的人往往会高估自己的表现一样,称职的人往往会低估自己的表现。

在某种程度上,这是有道理的。如果你对一项任务一无所知,你可能不知道它有多难。想想那些花了 30%的 NBA 总决赛时间对着电视屏幕大喊他们如何能比职业篮球队的专业人员做得更好的扶手椅教练吧。

另一方面,一旦你对一个问题有了坚实的理解,你就更熟悉解决这个问题需要克服的挑战。也能看出自己理解上的漏洞在哪里。

这让我想到了数据科学。

是的,在数据科学领域更糟

每天都有新算法、新库和新工作流被发明出来。所以你理解中的漏洞数量永远不会是零。事实上,由于我们每天创造的知识比任何人可能学到的都要多,你理解中的漏洞将会永远增长。你对数据科学的了解越多,你就越有可能意识到这一点。

因为在数据科学中没有办法避免无知,你必须管理它。这里有一个好消息:没有一家公司因为他们不知道或不会做什么而雇佣数据科学家或 ML 工程师。公司雇佣员工是因为他们能做什么。

这是克服冒名顶替综合症的关键。

如何看待冒名顶替综合症

如果你觉得自己像个骗子,因为你不了解数据科学的一切,那么从改变你对数据科学家的看法开始:这与知识无关,而是与有用性有关。

如果你能从数据中获得准确的见解,或者做出足够好的模型用于实际目的,那么你就是有用的。你不是骗子。你是个增值者。大多数数据科学家从未接触过神经网络,大多数不做任何聚类,大多数不日常使用 KNNs。不知道如何做这些事情并不妨碍它们有用。

底线是,如果你能真正做好一件事*,不知道所有事情也没关系。如果可以的话,那么你应该定义你的身份是一个关于那个东西的数据科学家。例如,“我是一名专门使用基于树的模型进行回归的数据科学家”,而不是“我是一名数据科学家”。你总是可以通过现实地看待你期望自己扮演的角色来定义自己走出冒名顶替综合症的方法。*

如果你是一个骗子呢?

这不会是一个流行的说法,但是…

也许你冒名顶替。这并不是说你不属于数据科学,只是说你可能还没有准备好工作。擅长数据科学很难,而且门槛每年都在提高。

自我诊断“冒名顶替综合症”的危险在于,这是一个非常诱人的诊断:告诉自己患有“冒名顶替综合症”,会让你想象自己已经具备了成功所需的所有技能,而你的不足感是没有道理的。有时候确实如此。但是有时候,我们头脑中的“我感到非常无知”警报响起是有原因的。

因此,如果你认为自己患有冒名顶替综合症——而不是正确诊断自己的无知——一个好的第一步是问知道自己在做什么的人。这就是导师和信息面试的价值所在:通过 LinkedIn 联系安排一次咖啡聊天,或者去参加一个当地聚会。

当你这样做的时候,永远记住那个关键的指导原则——你知道什么并不重要;重要的是你能做什么。

如果你想聊天,请随时在 Twitter 上与我联系。我是@jeremie charris

如何管理机器学习和数据科学项目

原文:https://towardsdatascience.com/how-to-manage-machine-learning-and-data-science-projects-eecacfc8a7f1?source=collection_archive---------11-----------------------

机器学习(ML)和数据科学(DS)项目很难管理。因为项目本质上类似于研究,所以很难预测它们需要多长时间才能完成。他们通常从一个想法开始,然后当提出的技术不起作用或对数据的假设被证明是错误的时,转向一个新的方向。

建模本身也是一个漫长的过程(与大多数软件工程和分析工作相比),对于数据科学家来说,进入一个兔子洞,在一个项目上花上几个月的时间,却没有一个明确的进展概念,这种情况并不罕见。与标准软件工程实践的另一个区别是,模型开发通常由一个人完成。这种串行性质并不适合传统的协作 SE 工作流,比如看板和 Scrum。

我花了相当多的时间研究现有的工作流程(主要是在吉拉)来管理 DS 和 ML 项目,但是没有运气。那里的大部分信息都是针对软件工程的,并且集中在敏捷方法上。我也和该领域的同事和朋友交谈过,但我找不到任何为机器学习和数据科学量身定制的东西。我注意到有些人试图使他们的工作流程适应标准的工程实践,或者,在其他情况下,根本不尝试管理那些项目。后者尤其成问题,因为它可能导致项目耗时太长,范围太大,并且更有可能失败。

由于我找不到好的解决方案,我决定建立自己的定制工作流来管理机器学习和数据科学项目。这个系统可以在吉拉实施,让我很容易地监测和报告项目的状态。这也有助于我限制它们的范围,避免构建时间过长的过于复杂的模型。我们的科学家被提供了一个结构,帮助他们思考应该如何建立模型,这增加了他们在项目中取得成功的变化。我使用这个系统已经有几年了,我和我的团队对它非常满意。

机器学习项目有明确定义的阶段

无论您是使用深度学习构建复杂的计算机视觉算法,还是使用 LightGBM 构建学习到排序模型,甚至是简单的线性回归,构建 ML 模型的过程都有明确定义的阶段。下面是我们如何将模型构建过程分成连续的阶段,从最初的研究一直到 A/B 测试结果的分析。请注意,每个阶段都有一个可交付成果(或里程碑),它也是与团队或涉众同步的接触点。

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

1)研究

这是项目的初始阶段。它包括与利益相关者交谈以了解项目的目标和期望,与业务分析师交谈以了解哪些数据可用以及从哪里获取数据,创建一些初始查询并调查数据,以便对问题有更好的直观理解。

也是在这个阶段,科学家将阅读文献并决定解决问题的方法。这包括阅读科学论文和与同龄人集思广益。有时候,决定方法还需要了解现有的包,并使用 Jupyter 笔记本构建一些简单的原型。

交付成果:此阶段的输出是项目执行的详细计划,包括后续阶段的分解(即,数据探索、建模、产品化和结果分析)以及相关的估计工作量水平(以周数表示)。还必须具体说明要使用的方法和数据。

该计划将与利益相关方分享以获得反馈。

2)数据探索

这是使用熊猫和木星笔记本(有时是 Tableau)探索数据的传统阶段,以便获得对数据的洞察。典型的分析包括计算数据中的行数、创建不同要素聚合的直方图、一段时间内的趋势图以及多个分布图。科学家们还将构建查询,这将是他们模型 ETL 的核心。

**交付成果:**一份详细的数据探索报告,作为一个木星笔记本,带有图表和评论,提供对数据的见解。该报告将与小组的其他成员和项目干系人共享。

3)建模

这是这个项目的核心。在这里,科学家将开始使用我们的内部框架构建他们的模型。这包括构建 ETL、执行特性工程和训练模型。它还包括构建基线模型和提供最终解决方案的广泛评估。

**可交付成果:**本阶段的产出是:

  1. 模型原型
  2. Jupyter 笔记本中的一份报告,对模型进行了广泛的评估

最终报告将与小组和项目利益相关者共享。

4)产品化

这个阶段是关于实现最终版本的代码。一些常见的任务包括向所有函数添加注释,并确保代码的格式符合 Python 标准和该组织的标准。代码中包含报告指标,如提取的行数、输出中的行数、根据几个指标的预测误差,以及适用时的功能重要性。最后,代码由一名数据科学家和一名工程师审查。

有时候产品化的过程会导致与平台工程师的来回互动。对于运行时性能至关重要的实时模型来说,这一点尤为重要。也有可能是代码的内存需求太大,导致生产流水线出现问题。工程师可能会推后,要求减少内存占用来训练模型。

**可交付成果:**这个阶段的输出是提交给主分支的代码,准备由平台工程团队进行部署。

5) A/B 测试

大多数型号将经历 A/B 测试阶段。在这里,科学家和利益相关者决定测试的细节:它将运行多长时间,流量的百分比是多少,控制是什么,如何解释结果等。当测试运行时,团队成员将主要关注其他项目,但是他们需要监控测试。

6)结果分析

每个科学家都要对自己的模型结果进行详细的分析。在这里,他们将以多种不同的方式分析结果指标,以了解实际情况。特别是,当测试不成功时,我们需要深入研究结果,找出问题所在。

可交付成果:

  1. 在 Jupyter 笔记本上的结果的详细报告。
  2. 关于为什么事情没有按预期进行的假设(如果适用)

最终报告将与小组和项目的利益相关者共享。

与吉拉合作

虽然这个框架在理论上看起来很棒,但现实是上述阶段很少是纯连续的。例如,从数据探索到建模,然后再回到数据探索,这是非常常见的。此外,这个过程不适合现有的吉拉框架,所以你如何在实践中实现它呢?

这其实很简单。我们使用吉拉看板和泳道(每个团队成员一个)以及一些自定义字段和更改。以下准则定义了我们流程的本质:

  • 为每个项目创建一个新的 Epic 票证,并将工作分解为多个任务。
  • 每个任务都标记有一个阶段,这是吉拉的一个自定义字段,用于从上面列出的 6 个阶段中选择一个。(注意,一个阶段可以有多个任务。)
  • 任务不能超过 1 周(5 天)。这迫使团队成员将他们的工作分解成更小的(但仍然相当大的)块,允许以较小的开销进行进度监控。
  • 任何时候都只能有一张票在进行中。这确保了我们总是知道项目处于什么状态。
  • 阶段并不总是连续的,随着新任务的创建,可以在阶段之间来回移动。

结论

管理 ML 和 DS 项目不一定要复杂。起初,我花了大约 30 个阿敏日来监控这个过程,但是一旦团队习惯了,我的时间就减少到每周 15 分钟!我知道每个项目在任何时间点处于什么状态,一个项目花了多长时间,并且我可以快速识别问题,以便在需要时可以投入进来并帮助我的团队。我的数据科学家有一个清晰的框架来思考如何建立模型,他们在这方面变得更加高效。

我希望你能发现这对我很有用。

如何管理机器学习产品

原文:https://towardsdatascience.com/how-to-manage-machine-learning-products-part-1-386e7011258a?source=collection_archive---------16-----------------------

第一部分:为什么管理机器学习产品这么难?你为什么要在乎?

总结:以下是我希望您记住的关于这一系列文章的内容:

  1. 管理 ML 产品比管理普通软件产品更具挑战性,因为它涉及更多的不确定性,不仅需要技术上的改变,还需要组织上的改变。
  2. ML 最适合做决策或预测。
  3. 清楚地定义问题,确定需求范围,设置度量标准,在决定前进的道路之前,给工程师和科学家足够的空间和灵活性去探索。
  4. 从第一天开始就考虑你的数据策略。
  5. 构建 ML 产品是跨学科的。超越 ML 思考。

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

在我的上一篇文章中,我谈到了机器学习(ML)带来的最大不同: ML 使人们能够从必须给机器编程转向真正的自主(自学)。机器根据它们在数据中识别的模式做出预测并提高洞察力,而无需人类明确告诉它们该做什么。这就是为什么 ML 对于挑战人难以向机器解释的问题特别有用。这也意味着 ML 可以使你的产品更加个性化,更加自动化,更加精确。先进的算法、海量的数据和廉价的硬件正在使 ML 成为 GDP 的主要驱动力。

ML 的采用已经在各个商业领域中快速推进。根据麦肯锡最近的调查,近一半的公司已经在其流程中纳入了一项或多项人工智能能力,另有 30%的公司正在试点人工智能项目。不难看出为什么 ML 比移动技术更有变革性。然而,向移动支付的过渡也可能比向移动支付的过渡困难 10 倍以上。在我们讨论为什么会出现这种情况之前,让我们先回顾一下基础知识。

机器学习基础

AI 和 ML 是什么?

人工智能没有普遍认同的定义,而且定义一直在变。一旦某项任务由机器执行,该任务就不再属于 AI 的范围。ML 是 AI 的子集。CMU 大学教授 Tom M. Mitchell 将机器学习定义为对计算机算法的研究,它允许计算机程序通过经验自动改进。

ML 的类型

机器学习主要有三种类型:

  • 监督学习:最常见、应用最广泛的一种学习方式。这些算法从带标签的数据中学习,即,用模型试图预测的结果标记的训练数据集。简而言之,就是预测结果。
  • 无监督学习:另一方面,无监督学习算法在没有标记数据的情况下学习识别数据中的模式。它可以用于聚类、关联和异常检测问题。还有半监督学习,它本质上是监督学习和非监督学习的混合体。
  • 强化学习:随着时间的推移,算法在获得相应预测的反馈时进行学习。RL 用于机器人或自动驾驶汽车等控制领域。

机器学习产品的类型

根据产品的类型和核心价值的来源,你的团队需要不同的技能,并需要专注于产品的不同部分。

  • 企业对消费者

智能音箱等消费级 ML 产品比企业级产品具有更强的社交成分。因此,用户体验(UX)在设计消费者 ML 产品中起着更重要的作用,ML 往往成为更好的 UX 的促成因素。例如,NLP(自然语言处理)用于改善 Alexa 与其用户之间的交互。另一方面,企业的核心价值,尤其是工业 ML 产品,如预测性维护软件,往往来自其预测的功能性能(如准确性)。这并不是说 UX 对企业 ML 产品不重要。然而,当你只有有限的资源,需要专注于优化产品的某些部分时,这是需要考虑的事情。

  • 您是在打造 ML 产品还是在产品中应用 ML?

如果你的产品的核心价值来自于 ML 模型,那么你很可能正在构建一个 ML 产品。另一方面,如果 ML 只是用来增强你的产品的体验或性能,那么你最有可能把 ML 应用到你的产品中。在这种情况下,重要的是理解模型的输入和输出,而不是技术细节,如架构或 ML 模型是基于 CNN(卷积神经网络)还是 R-CNN。例如,该模型采用用户的人口统计数据来预测他们在平台上的每月支出。许多公司或团队也将利用现有的解决方案,这样他们就不会重新发明轮子。另一方面,构建 ML 产品通常需要项目经理更具技术性,以帮助团队导航关键决策和权衡。

组织结构也各不相同。对于制造人工智能产品的公司或在人工智能上有大量投资的大公司,如脸书和谷歌,雇佣人工智能研究人员/科学家并让他们与人工智能工程师配对是很常见的。另一方面,对于将 ML 应用于其产品的公司或资源受限的较小公司,雇用多学科的 ML 工程师或培训你的软件工程师学习 ML 可能比雇用 ML 研究人员/科学家更好。

  • 构建 ML 产品通常是跨学科的。

即使你正在构建一个 ML 产品,也很少会只涉及 ML。它通常是跨学科的,不仅涉及 ML 模型,还涉及软件工程、后端基础设施、数据分析、UX/UI 设计,有时还涉及硬件。项目经理需要能够管理跨职能团队,并处理团队之间的相互依赖和潜在冲突。ML 从根本上不同于其他学科,我们将在下面的段落中解释更多。如果您正在为物理世界(如机器人或自动驾驶汽车)构建 ML 产品,这将变得更加复杂。项目经理需要知道 ML 可以做什么,不可以做什么,以及我们什么时候应该使用 ML,什么时候不应该使用 ML。

需要理解的其他关键 ML 概念

  • 过度拟合:是一种错误,当模型过于接近一组特定的数据点时就会发生。鲁棒的 ML 模型不仅在“训练数据集”上表现良好,而且在“验证数据集”上也表现良好。但是,在过度拟合的情况下,训练数据的性能会提高,但看不见的(验证)数据的性能会变差。
  • 深度学习(DL) :主要用于图像分类。DL 使用深度神经网络,并将标记的图像作为输入。神经网络的每一层都将把输入转换成稍微抽象和复合的表示。最终,模型学会识别图像中的物体。
  • 自然语言处理(NLP) :机器理解人类语言的计算机科学领域。不一定涉及 ML。NLP 用于聊天机器人、语音助手或预处理数据。

管理 ML 产品的挑战

1.实验是 ML 的关键部分。

仅仅因为 ML 涉及代码和数据并不能使它类似于软件工程。事实上,这两个学科有天壤之别。与软件工程不同,开发机器学习产品需要更多的实验,因此涉及更多的不确定性和可变性。软件工程是编写规则供机器遵循的确定性过程,而机器学习则更具概率性,因为它自动化了编写规则的任务。

例如,如果你想教一台机器识别一只猫。在软件工程中,你可能会想出像“一只猫有四条腿和两只尖耳朵”这样的规则但这和狗有什么不同呢?如果你用深度学习,而不是显式的规则,你会给机器喂一堆猫的照片(贴标签的图像),让机器自己学习。通过这样做,你让机器自己写规则。您和您的团队所做的是定义问题、准备数据、构建一组模型、测试和迭代,直到您有一个交付期望结果的模型。

这就是为什么团队在开发 ML 产品时,一般需要冒更大的风险。对于项目经理来说,帮助设定正确的期望以避免团队之间的潜在冲突是很重要的。例如,软件工程师可能觉得 ML 团队没有给他们足够清晰的需求,没有理解 ML 产品的本质。让工程师与研究人员/科学家密切合作也很重要,这样他们可以相互平衡。更重要的是,最好让端到端系统更快地工作,以确保 ML 团队一直在研究的算法实际上与业务目标一致。

2.开发 ML 是一个高度迭代的过程。

如前所述,ML 非常适合于解决人类无法显式编程的复杂问题。模型需要被训练、测试和调整。在选择一个令人满意的方法之前,科学家经常要测试几种方法。这就是为什么定义里程碑和估计 ML 产品的时间表通常更加困难。由于 ML 产品的性质,对于产品经理来说,清楚地定义需求和度量标准并确保团队根据期望的度量标准频繁地测试模型是至关重要的。

3.除了技术挑战,还有更多结构性挑战。

因为 ML 与软件工程如此不同,它需要一些根本性的组织变革:实验文化,数据分析驱动的思维模式,以及对不确定性更加开放,等等。如果在位者将 ML 视为一个纯粹的技术问题而忽视了相关的组织变革,他们可能会面临“创新者的困境”。对于过去追求高精度的机器人制造商等公司来说,在内部开发 ML 产品尤其具有挑战性。此外,ML 产品需要大数据集进行训练。公司需要建立自己的数据管道和基础设施来支持 ML 产品的扩展。

4.ML 仍然是一个新的领域,它将继续发展。

术语“软件工程”第一次出现在 1965 年,在编程语言开始出现 15 年之后。将近 20 年后,软件工程研究所成立,以管理软件工程过程。今天,我们已经普遍接受了软件工程的最佳实践。另一方面,机器学习在 20 世纪 90 年代才开始作为一个独立的领域蓬勃发展。深度学习是 ML 的一个子集,它在包括图像识别和 NLP 在内的许多问题上创造了新的准确性记录,但直到 2012 年 AlexNet 的崛起才被广泛讨论。与软件工程相比,ML 仍然处于起步阶段,因此缺乏行业标准、度量标准、基础设施和工具。企业仍在探索最佳实践,扼杀应用。

5.ML 产品的可解释性和可解释性问题。

许多 ML 算法缺乏透明度,就像一个黑盒,接受输入(例如图像)并输出预测(例如图像中的对象/人是什么/谁)。这使得产品经理很难解释 ML 模型是如何工作的,也很难得到用户和利益相关者的认可。尤其是在医疗保健等关键领域,问责制和透明度极其重要。在不清楚算法实际如何工作的情况下,确保 ML 工作和客户问题之间的一致性是一项挑战。

面对所有这些挑战,我们应该如何着手管理 ML 产品?对于 ML 产品来说,好的 PM 本能在哪里变坏了?在第二部分,我将更多地谈论我的学习和最佳实践。

连接更深:如果你喜欢读这篇文章,请 在这里订阅我的个人博客!

[## 如何管理机器学习产品——第二部分

最佳实践和我一路走来学到的东西。

towardsdatascience.com](/how-to-manage-machine-learning-products-part-ii-3bdabf91eae4)

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。她写关于 ML、机器人和产品管理的文章。跟着她到这里

本帖已在【www.productschool.com】社区发布。

如何管理机器学习产品——第二部分

原文:https://towardsdatascience.com/how-to-manage-machine-learning-products-part-ii-3bdabf91eae4?source=collection_archive---------12-----------------------

最佳实践和我一路走来学到的东西。

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

在第一部分,我谈到了管理 ML 产品的基础和挑战。开发 ML 产品需要更多的实验和迭代。因此,作为一名项目经理,你需要给工程师和科学家足够的空间和灵活性去探索,然后再决定前进的道路。但是你如何帮助你的团队应对这些不确定性呢?在允许您的团队探索的同时,您如何着手定义业务问题和度量?

[## 如何管理机器学习产品—第 1 部分

为什么管理机器学习产品这么难?为什么你应该关心?

towardsdatascience.com](/how-to-manage-machine-learning-products-part-1-386e7011258a)

1.规划:从明确问题开始。

ML 是一种工具,一种达到目的的手段。如果你正在解决的问题不需要 ML,就不要构建 ML 产品。从识别问题开始,即需求大(业务潜力)且可解决(技术可行性)的客户痛点。你可以做一个市场评估练习来评估业务潜力。那么下一个问题是:我们如何知道 ML 是否可以帮助解决我们的用户问题。有许多 ML 的应用,但核心是,ML 最适合做决策或预测。我们可以将 ML 应用程序分为几种类型。

  • 检测/检查:帮助用户识别缺陷或异常在哪里,例如银行或保险中的欺诈检测或生产线中的缺陷检测。
  • **模式识别:**帮助用户筛选海量数据。示例包括推荐、排名、个性化、分类、预测性维护、聚类以及与人类的交互(例如用于智能扬声器(如 Alexa 或 Google Home)的自然语言处理(NLP))。
  • **高维认知:**帮助用户筛选海量高维感官数据。例子包括人工智能机器人和自动驾驶汽车。

您应该避免在产品中使用机器学习,如果:

  • 你可以用简单的规则解决问题。
  • 您正在构建的解决方案不需要适应新数据。
  • 你无法获得训练 ML 模型所需的数据。
  • 您的产品需要高精度。
  • 你需要完全透明地了解你的产品是如何工作的。

一旦您找到了要解决的正确问题,下一个关键任务就是清楚地定义需求。开发 ML 产品是一个高度迭代的过程。跳过适当的计划,直接研究模型能做什么,这可能很有诱惑力。然而,如果你这样做,你可能会浪费很多时间而没有具体的结果。

2.定义目标函数(结果)和指标。允许更多的空间和灵活性。

对于 ML 产品,人类不编程规则;机器会。它更具实验性,必须与传统的分而治之的软件工程方法区别对待。很多时候,很难预测什么行得通,什么行不通。这就是为什么在决定前进的道路之前,给工程师和科学家更多的空间和时间去探索是很重要的。

作为产品经理,您可以通过以下方式帮助您的团队在如此广泛的探索过程中保持专注:

(1) 定义一个目标函数:你的模型试图预测的预期结果是什么?或者你在尝试识别数据中的模式?有什么“基本事实”可以让你比较你的模型的结果吗?例如,如果您设计一个模型来预测天气,您可以通过将预测与实际天气数据进行比较来验证模型的性能。

(2) 定义绩效指标:你如何衡量你产品的成功或失败?设定验收标准并不总是那么简单。例如,如何衡量翻译模型相对于人类翻译的性能?有时,您需要看到模型的初始结果,然后决定标准。但是重要的是尽早考虑测试标准,并不断地测试模型,直到找到能够交付满意结果的正确模型。

(3) **从头到尾早期频繁的测试模型:**你可以把 ML 模型想象成黑盒。您定义了您希望您的模型生成的输入和输出,而不必了解黑盒中正在发生什么。这就是为什么构建端到端原型并尽可能早地和频繁地测试模型是重要的。从可以帮助您测试关键功能的简单原型开始,然后对其进行迭代。避免不惜一切代价从全面的端到端解决方案开始。

需要注意的一件重要事情是,模型准确性本身通常不是一个好的度量标准。相反,考虑测量精度(真阳性/所有正预测)并召回(正预测/所有真阳性)。正如维基百科解释的那样:精确度是关于有多少被选择的条目是相关的,召回是关于有多少相关的条目被选择。没有适用于所有情况的经验法则。您需要根据您的业务案例来决定取舍。

3 从第一天开始就考虑你的数据策略。

训练 ML 模型通常需要大量高质量的数据。当用大量数据训练时,深度学习的表现优于旧的算法。因此,从第一天开始就概述你的数据获取策略是极其重要的。您可以购买数据,与其他公司合作,从您的客户那里收集数据,内部生成数据,或者雇佣第三方为您生成或标记数据。你需要考虑你的竞争对手是怎么做的,你的客户和监管者是怎么想的,以及每种策略相应的可行性和成本。搞清楚你的数据策略不是数据科学家的责任。这是一个战略性的商业决策,需要产品经理、高管和关键利益相关者来定义。

如果你是一家初创公司,请三思而后行。是否有行业巨头主导大部分数据?例如,你可能不想在购买历史上与亚马逊竞争,或者在位置数据上与谷歌地图竞争。尝试找到一些利基市场,还没有一家公司主导市场。

你能建立一个可防御的和可持续的数据管道吗?遵守用户隐私政策的情况如何?如果您的公司在欧盟范围内运营,请熟悉 GDPR(一般数据保护法规)和其他数据保护法规。例如,根据 GDPR 法案,公司需要确保不仅合法地收集个人数据,而且保护个人数据不被误用或利用。因此,作为项目经理,您需要从产品开发的早期阶段就考虑数据保护措施。

请确保您与您的 ML 团队讨论,以确定您需要哪些数据以及需要多少数据。让法律和运营等其他利益相关方也参与进来。为机器人和自动驾驶汽车等物理世界开发 ML 产品带来了更多挑战。确保您利用模拟并关注研究领域,包括模拟到真实、数据增强、迁移学习和元学习,以寻找降低您对海量数据的需求并加速您的培训过程的方法。

4 超越 ML 思考。

在大多数情况下,你实际上不仅仅是在构建一个 ML 产品。为了使它成为一个完整的产品,您需要一个用户界面、执行模型预测的软件和/或硬件组件。例如,如果你太专注于构建 ML 模型而忽略了用户体验,你就不会有一个成功的产品。你需要一个多功能的团队,不仅包括 ML 工程师和科学家,还包括数据工程师、软件工程师、UX UI 专家和/或硬件工程师。您还需要与后端工程师合作,以确保基础设施能够支持 ML 团队。

尽量减少不同职能或团队之间的相互依赖和冲突。如前所述,ML 的本质使得它与传统的软件编程完全不同。例如,虽然每日站立会议可能有助于保持软件工程团队的生产力,但它可能不是 ML 团队的最佳实践。这就是为什么 ML 可能不仅需要技术上的改变,还需要组织上的改变。作为一个项目经理,你可以帮助其他团队理解为什么和如何构建 ML 产品是不同的,并帮助解决潜在的冲突。你也应该试着将 ML 固有的不确定性传达给你组织中的其他利益相关者。

沟通不仅对内部团队至关重要,对客户也是如此。ML 产品的性能随着时间的推移而提高。很可能一开始顾客不会得到完美的结果。你的用户能接受吗?如何减轻用户的风险并保证可接受的基线性能?如何设计你的产品来优化用户体验?

5.提出投资 ML 的理由。

如果您想投资 ML 特性,请考虑以下几点:

  • 增强用户体验或产品功能:例如,ML 能否用于个性化或定制您的产品,以便您的用户更容易找到最相关的结果?或者可以应用 ML 来增加你的预测或者预言的准确性吗?考虑内部用户和外部用户(客户)的潜在应用。
  • **自动化流程或重复性任务:**贵公司员工或客户需要反复经历的流程有没有可以自动化的?通过自动化重复任务,您可以节省时间、成本和资源,还可能创造更好的用户体验。如果流程太复杂,有没有可能实现部分流程自动化,或者帮助人类更高效地做事?Gmail 的智能撰写就是一个很好的例子:Gmail 现在可以自动完成你的句子,而不是让用户每次都键入相同的单词或句子,如“best communication s”。
  • **开启新的商业机会:**有没有什么新的机会或商业问题是无法解决的,但现在似乎可以用 ML 解决?例如,仓库中的拣货过程是高度人工的,因为对机械臂进行编程来识别和处理数百万件产品是不可行的。但是现在有了 ML,机器人可以在人类最少的监督下学习识别各种各样的物体。这为仓库中的人工智能机器人带来了巨大的机会。

6.好的项目管理本能对 ML 产品来说变坏了。

有时候管理软件产品的最佳实践不一定适用于 ML 产品。以下是我经常提醒自己的几件事:

  • 认识开发 ML 和软件产品之间的区别。没有放之四海而皆准的方法。需要的时候调整你的冲刺过程、计划或组织。
  • 不要在你的 PRD 上详细列出所有的需求,而要专注于定义目标函数和关键绩效标准,让团队去探索和实验。
  • 不要在开发过程的开始就要求你的 ML 团队给出确定性的结果,而是和团队一起尽早地、经常地开发和测试端到端的原型。
  • ML 只是工具之一。不到万不得已不要用 ML。

摘要—我希望您记住这一系列文章的以下内容:

  1. ML 最适合做决策或预测。
  2. 管理 ML 产品比管理普通软件产品更具挑战性,因为它涉及更多的不确定性,不仅需要技术上的改变,还需要组织上的改变。
  3. 清楚地定义问题,确定需求范围,设置度量标准,在决定前进的道路之前,给工程师和科学家足够的空间和灵活性去探索。
  4. 从第一天开始就考虑你的数据策略。
  5. 构建 ML 产品是跨学科的。超越 ML 思考。

深入联系:如果你喜欢阅读这篇文章,请在这里订阅我的个人博客!

Bastiane Huang 是 OSARO 的产品经理,OSARO 是一家总部位于旧金山的初创公司,致力于开发软件定义的机器人。她曾在亚马逊的 Alexa 小组和哈佛商业评论以及该大学的未来工作倡议中工作。 她写的是关于 ML、机器人和产品管理的文章。跟着她到这里

本帖已在www.productschool.com社区发布。

如何使用 DVC、权重和偏见以及 Docker 管理您的机器学习工作流程

原文:https://towardsdatascience.com/how-to-manage-your-machine-learning-workflow-with-dvc-weights-biases-and-docker-5529ea4e59e0?source=collection_archive---------18-----------------------

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

管理机器学习工作流是很难的。除了软件工程中常见的挑战,机器学习工程师还需要考虑实验跟踪、可重复性、模型部署和治理。在本文中,我想展示 3 个强大的工具,通过使跟踪、复制、管理和部署模型变得容易,来简化和扩大组织内的机器学习开发。

对 DVC 使用版本控制

在传统的软件工程中, Git 是版本控制的行业标准。团队成员在他们自己的本地代码上工作,但是总是与中央存储库同步他们的进展和新的开发。这确保了每个人都是最新的和同步的。这是一个很好的方式,让团队的工作互相配合,而不是互相冲突,从而导致更高的产出。

机器学习有点棘手,因为它是研究和软件工程的结合。例如,数据本身很大,因此共享存储可能会很有挑战性。或者在 Jupyter 笔记本中显示更改是很困难的,因为 Git 不允许在图表中显示从提交到提交的更改。

是一个方便的工具,旨在使机器学习模型可以共享和复制。它旨在处理大型文件、数据集、机器学习模型、指标和代码。

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

在任何时候,您可能都需要获取您已经运行/正在运行的实验的完整上下文。DVC 保证所有的文件和度量标准都是一致的,并且在正确的位置重现实验或者作为新迭代的基线。此外,DVC 在 Git 中保存元文件来描述和版本控制你的数据和模型。如果你在一个团队中工作,DVC 可以通过定义有效工作的规则和过程来作为协作的协议。

使用权重和偏差跟踪实验

在传统的软件工程中,当程序失败时,您可以手动检查错误,以了解它失败的原因。对于机器学习模型,通常没有关于模型失败的原因或时间的信号,这使得调试更加困难。因此,跟踪您的模型实验的需求变得至关重要。

权重&偏好是一个非常棒的实验管理平台,因为它有非常好的用户体验。记录您想要记录的任何指标都非常容易。因此,它提供了一种透明的方式来找出你的机器学习模型中的瓶颈,从而实现简单的修复和更好的优化。

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

机器学习的一个难点是,通常有太多的超参数或太多的方法可以修改系统。因此,能够通过一次改变一件事来对比实验是至关重要的。Weights & Biases 的仪表板具有灵活性和可伸缩性,可以为您的模型预测提供大量可视化内容。作为数据科学家,您可以轻松地比较和对比不同的实验,并将它们汇总到物理报告和/或实时监控中。在数据科学团队中,权重和偏差可以成为共享日志,以跟踪哪些模型正在接受培训以及每个团队成员取得的进展。

使用 Docker 部署模型

机器学习开发中的一个巨大挑战是将训练好的模型部署到生产中并具有可扩展性。这是因为生产中的机器学习管道将出于多种目的使用多个模型。

Docker 是一个强大的容器化平台,它将应用程序及其所有依赖项打包到一个容器中。如果你来自软件工程世界,这个技术一定非常熟悉。当您有许多在竖井中工作的服务时,您可以使用 Docker 作为数据提供者将这些服务连接到一个 web 应用程序中。根据负载情况,可以根据设置的规则按需剥离实例。

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

你开发的机器学习模型很有可能具有非统一的环境(Windows vs Unix),不同的库包(TensorFlow vs PyTorch),或者各种资源需求(GPU vs TPU),GPU 容器可以通过将不同的模型放入不同的容器并根据需求分配灵活的资源来处理所有这些挑战。

事实上,您可以使用命令“wandb Docker”轻松地将权重&偏差与 Docker 集成起来——该命令设置一个安装了标准包的 Docker 映像,安装您的代码,并将您放入其中。该命令自动启动 Docker 映像,默认安装了 TensorFlow、PyTorch、Keras 和 Jupyter 这是典型的深度学习工具包。在模型训练过程中,Weights&bias 将保存 Docker 映像状态的永久记录,这样您将始终能够恢复代码运行的确切环境。

在未来的任何时候,您都可以运行" wandb restore/:"以返回到您的代码和 Docker 映像在训练运行期间所处的确切状态。weights&bias 会用原始命令预先填充 bash 历史。

结论

正如本文所证明的,您的整个机器学习工作流可以通过第三方应用程序来管理。使用这些新兴平台中的任何一个都可以让你的项目保持有序,让你作为一名机器学习工程师更有效率。

如何在 20 分钟内掌握 Python 的主要数据分析库

原文:https://towardsdatascience.com/how-to-master-pandas-8514f33f00f6?source=collection_archive---------1-----------------------

熊猫终极指南——第一部分

熊猫基本功能的代码指南。

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

Photo by Sid Balachandran on Unsplash

本文阐述了有抱负的数据科学家和数据分析师经常面临的典型问题和挑战。我们将通过利用 Python 最强大的数据操作和分析库 Pandas 来解决这些问题和应对这些挑战。

在本文中,我们将讨论以下主题:

  1. 设置
  2. 加载数据
  3. 检查/分类/过滤数据
  4. 分析功能

你可以在这里找到完整的 Jupyter 笔记本。但是我强烈建议您亲自完成这些步骤。毕竟,熟能生巧。

先决条件:

一个工作的 Python 环境(我建议 Jupyter 笔记本)。如果你还没有设置这个,不要担心。在上周的文章中,我们讨论了如何设置 Anaconda,并解释了如何打开您的第一个 Jupyter 笔记本。如果你还没有这样做,看看链接的文章。做好一切准备只需不到 10 分钟。

[## 所以你想成为一名数据科学家?

到底是什么阻止了你?下面是如何开始!

towardsdatascience.com](/get-started-with-python-e50dc8c96589)

1.设置

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

Photo by Ivan Zhukevich on Unsplash

在进行任何数据操作之前,我们先获取一些数据。我们将使用 2019 年世界幸福报告中的数据。我将提供一个稍微调整过的原始数据版本,其中也包括各大洲。

这个 GitHub Repo 保存数据和代码。如果不熟悉 GitHub,还可以从这个 链接 **下载一个打包的 zip 文件!**解压文件并将内容(尤其是happiness_with_continent.csv)移动到 Jupyter 笔记本所在的文件夹中(如果还没有,创建一个)。

在新笔记本中运行import pandas as pd(即,将 Pandas 库导入到工作簿中,以访问这些功能。

我喜欢这样调整我的笔记本设置:

from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))

这些命令使笔记本变得更宽,从而利用屏幕上的更多空间(通常笔记本有固定的宽度,这与宽屏很不一样)。

2.加载数据

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

Photo by Markus Spiske on Unsplash

Pandas 将数据存储为序列(一列)或数据帧(一列或多列),后者只是一个或多个序列的组合。

**注意:**每当我们用以下加载函数之一加载数据时,结果将存储在 DataFrame 中。

pd.read_csv

对我来说,加载数据的主要方式是熊猫。它完全符合我对数据的思考方式,那就是大量的表格。

您可以像这样从本地文件加载数据**😗*

data = pd.read_csv('happiness_with_continent.csv')

或者您可以从 web 直接读取数据到数据帧中,如下所示:

data = pd.read_csv('[https://raw.githubusercontent.com/FBosler/you-datascientist/master/happiness_with_continent.csv'](https://raw.githubusercontent.com/FBosler/you-datascientist/master/happiness_with_continent.csv'))

从 Excel 或 Google 工作表

从 Excel 中读取数据非常简单。Google Sheets 有点棘手,因为它要求你首先通过一个认证程序。你可以在这里阅读所有关于从 Excel 和 Google 工作表中提取数据的内容:

[## 用 Python 从各种工作表中提取数据

或者如何学习统一 Google 工作表、Excel 和 CSV 文件——代码指南

towardsdatascience.com](/replacing-sheets-with-python-f1608e58d2ca)

pd.read_clipboard

这个我很少用,但是对于较小的表肯定有效。例如,只需标记并复制(ctrl+c)Google sheets 中的一个表格,然后运行pd.read_clipboard()

**示例:**导航此处(我找到的第一个公共表单)并标记一个区域,如截图所示。

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

After hitting ctrl+c the data will be in your clipboard, you can now use pd.read_clipboard

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

Running pd.read_clipboard on previously copied data with parameter index_col=’name’

基于 read_csv 的函数(和 read_clipboard)的一些值得注意的参数:

  • sep:分栏符(默认为,,也可以是 tab)
  • header:默认为'infer'(即熊猫猜测你的头是什么),可选为整数或整数列表(多级名称)。例如,您可以做header=3,数据帧将从第 4 行开始(因为 Python 是 0 索引的)作为标题。如果您的数据没有标题,请使用header=None
  • names:栏目名称。如果您想使用这个参数来覆盖 Pandas 推断出的任何列名,那么您应该指定header=0(或者您的列名所在的行),如果您不这样做,那么您的名称将作为列名,然后在第一行中显示原始的列名。names参数需要一个列表,例如['your col 1', 'your col 2', ... 'your last col name']
  • index_col:设置加载时的索引(即我们将索引设置为name)。稍后我们将了解更多关于索引的内容)
  • skiprows:跳过前 x 行,当文件开头包含一些元数据,如作者和其他信息时,这很有用
  • skipfooter:跳过最后 x 行,当文件末尾有元数据(例如脚注)时很有用
  • parse_date:这个参数告诉熊猫,它应该把哪些列解释为日期(例如pd.read_csv(happiness_with_continent.csv,parse_dates=['Year']))。默认的解析器开箱即可正常工作。在遇到奇怪的数据格式时,Pandas 可以使用定制的日期解析器(为此,您必须指定解析逻辑)。

还有一堆额外的(很少使用的)参数。您可以通过在单元格中运行pd.read_csv?来阅读这些内容(在命令后添加一个问号将打印帮助文本)。

无论我们如何读取数据,我们都希望将它存储在一个变量中。我们通过将读取结果赋给一个变量来实现,比如data = pd.read_clipboard()data = pd.read_csv('NAME_OF_YOUR_FILE.csv')

其他读取方法:

下面的阅读方法很少出现在我身上,但是在熊猫身上也实现了:

  • 阅读 _ 羽毛
  • read_fwf
  • read_gbq
  • read_hdf
  • read_html
  • read_json
  • read_msgpack
  • 阅读 _ 拼花地板
  • 阅读 _ 泡菜
  • 读取 _sas
  • 读取 _sql
  • 读取 sql 查询
  • 读取 sql 表
  • read_stata
  • 读取 _ 表格

3.检查/分类/过滤数据

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

Photo by Max Böttinger on Unsplash

①检查—第一行、最后一行、随机行

在笔记本中显示数据有三种标准方式,headtailsamplehead显示第一行,tail显示最后一行,sample显示随机选择的行。

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

data.head(x) previews the first x rows of the data

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

data.tail(x) previews the last x rows of the data

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

data.sample(x) previews x randomly selected rows of the data

注意gini of household income reported in Gallop, by wp5-year栏前有圆点。圆点表示存在未显示的列。要更改笔记本设置以显示更多列/行,请运行以下命令:

pd.set_option('display.max_columns', <number of columns you want>)
pd.set_option('display.max_rows', <number of rows you want>)# I typically usepd.set_option('display.max_columns', 50)
pd.set_option('display.max_rows', 8)

但是,请注意,您正在加载的文件通常非常大(1GB 以上),因此出于性能原因,不可能显示所有数据。因此,您应该尝试在更高的层次上熟悉数据,而不要依赖于直观地浏览行。

②检查—形状、列、索引、信息、描述

data.shape返回数据帧的尺寸。在我们的例子中,1704 行,27 列。

**IN:** data.shape**OUT:** (1704, 27)

data.columns返回数据帧中所有列名的列表。

**IN:**
data.columns**OUT:**
Index(['Country name', 'Year', 'Life Ladder', 'Log GDP per capita',
       'Social support', 'Healthy life expectancy at birth',
       'Freedom to make life choices', 'Generosity',
       'Perceptions of corruption', 'Positive affect', 'Negative affect',
       'Confidence in national government', 'Democratic Quality',
       'Delivery Quality', 'Standard deviation of ladder by country-year',
       'Standard deviation/Mean of ladder by country-year',
       'GINI index (World Bank estimate)',
       'GINI index (World Bank estimate), average 2000-16',
       'gini of household income reported in Gallup, by wp5-year',
       'Most people can be trusted, Gallup',
       'Most people can be trusted, WVS round 1981-1984',
       'Most people can be trusted, WVS round 1989-1993',
       'Most people can be trusted, WVS round 1994-1998',
       'Most people can be trusted, WVS round 1999-2004',
       'Most people can be trusted, WVS round 2005-2009',
       'Most people can be trusted, WVS round 2010-2014',
       'Continent'],
      dtype='object')

data.index返回关于索引的信息。我们将在排序和过滤部分更详细地讨论索引。把索引想象成行名/编号。

**IN:** data.index**OUT:** RangeIndex(start=0, stop=1704, step=1)

data.info()返回有关数据帧中非空值观察的类型和数量的信息

**IN:** data.info()**OUT:** <class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 27 columns):
Country name                                                1704 non-null object
Year                                                        1704 non-null datetime64[ns]
Life Ladder                                                 1704 non-null float64
Log GDP per capita                                          1676 non-null float64
Social support                                              1691 non-null float64
Healthy life expectancy at birth                            1676 non-null float64
Freedom to make life choices                                1675 non-null float64
Generosity                                                  1622 non-null float64
Perceptions of corruption                                   1608 non-null float64
Positive affect                                             1685 non-null float64
Negative affect                                             1691 non-null float64
Confidence in national government                           1530 non-null float64
Democratic Quality                                          1558 non-null float64
Delivery Quality                                            1559 non-null float64
Standard deviation of ladder by country-year                1704 non-null float64
Standard deviation/Mean of ladder by country-year           1704 non-null float64
GINI index (World Bank estimate)                            643 non-null float64
GINI index (World Bank estimate), average 2000-16           1502 non-null float64
gini of household income reported in Gallup, by wp5-year    1335 non-null float64
Most people can be trusted, Gallup                          180 non-null float64
Most people can be trusted, WVS round 1981-1984             125 non-null float64
Most people can be trusted, WVS round 1989-1993             220 non-null float64
Most people can be trusted, WVS round 1994-1998             618 non-null float64
Most people can be trusted, WVS round 1999-2004             491 non-null float64
Most people can be trusted, WVS round 2005-2009             630 non-null float64
Most people can be trusted, WVS round 2010-2014             671 non-null float64
Continent                                                   1704 non-null object
dtypes: datetime64[ns](1), float64(24), object(3)
memory usage: 372.8+ KB

data.describe()返回关于数据帧的数字列的一些描述性统计信息(计数、平均值、标准差、最小值、25%、50%、75%、最大值):

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

①排序— data.sort_values()

在没有参数的数据上调用sort_values对我们没有任何好处。事实上,它将引发一个错误,告诉我们它缺少一个名为by的参数。这个错误是有道理的。我们必须告诉熊猫我们想要按哪个(哪些)列排序。

例如,我们可以按年份或年份和国家名称对数据进行排序,如下所示:

data.sort_values(by='Year')
data.sort_values(by=['Year','Country name'])
data.sort_values(by=['Country name','Year'])

**注意:**如果传递多个值,它会按照值的顺序按值排序。

默认情况下,排序将从“最低值”开始。然而,改变这种行为很容易。

data.sort_values(by='Year', ascending=True)data.sort_values(
  by=['Country name','Year'], 
  ascending=[False,True]
)

注意: Ascending 默认为真,即最小值优先,如果你想要最大值优先,你必须指定 ascending=False

②排序— data.sort_index()

除了基于列的排序,还有基于索引的排序。按索引调用排序:data.sort_index()data.sort_index(ascending=False)。第一个是升序,第二个是降序。

①过滤—列

排序固然很好,但我们通常关心的是数据的特定子集。有时您可能只想查看一列或多列。

选择一列: 选择一个特定的列有两种方法。假设我们想要选择Year列。我们可以选择:

  • data['Year'],或者
  • data.Year(不使用这种方法)

两者做同样的事情。

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

The two ways of selecting columns in Pandas

**注意:**你可能会问,为什么完全相同的事情有两种方法?原因是方便。第二种方法稍微快一点,因为只需要两个点和列名。而在第一种方法中,您需要列名、两个上勾号和两个括号。

然而,我强烈建议使用第一种方法,因为它避免了一些小问题,并且与选择多个列相一致。

选择多个列: 假设您想要选择Country nameLife Ladder,那么您应该这样做(小心:双括号):

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

Selecting “Country name” and “Life Ladder” columns and sampling five random rows

注意:要特别注意您要选择的第一列和最后一列前后的双括号!无论何时使用双括号,结果都将是一个 DataFrame(即使只选择一个带有双括号的列)。我怎么强调这一点都不为过,因为我有时仍然会遇到这些错误!如果要选择多列,但只打开一组括号,括号之间的内容将被视为一列。不用说,您的数据不包含意外组合的列。

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

KeyError: If you only open and close one set of brackets.

②过滤—行

能够选择特定的列只是完成了一半。然而,选择行也同样简单。

熊猫中的行通过索引选择。您可以将索引视为行的名称。每当您从一个数据帧中选择行时,都会用一个具有相同索引的序列覆盖该数据帧,该序列只包含TrueFalse值(True表示应该选择该行,False表示不应该选择该行)。然而,大多数时候,这种显式的索引选择是从用户那里抽象出来的。我仍然认为理解行选择过程是如何工作的非常重要。

您可以通过索引选择一行或多行。有两种方法可以做到这一点:

  • [data.iloc](#7d8b)或者
  • [data.loc](#86f2)

iloc: data.iloc允许通过位置(即通过行数)选择行(以及可选的列)

iloc —选择一行:
语法如下data.iloc[row_number (,col_number)],括号中的部分是可选的。

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

data.iloc[10] selects the 10th row

**注意:**格式看起来有点不常规,这是因为当选择一行且仅选择一行时,将返回一个系列

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

data.iloc[10,5] selects the 5th column out of the 10th row

iloc —选择多行: 语法如下data.iloc[start_row:end_row (,start_col:end_col)]所示,括号中的部分是可选的。

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

data.iloc[903:907] selects the 903rd to 907th row

或者,您还可以指定要选择的列。

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

data.iloc[903:907,0:3] selects for the 903rd to 907th row the 0th to 3rd column

loc: data.lociloc相反,允许通过以下方式选择行(和列):

  1. 标签/索引或
  2. 使用布尔/条件查找

为了更好地解释第一点,也为了更好地将其与iloc区分开来,我们将把国家名称转换成数据帧的索引。为此,运行以下命令:

data.set_index('Country name',inplace=True)

set_index命令在数据帧上设置一个新的索引。通过指定inplace=True,我们确保数据帧将被改变。如果我们没有指定 inplace=True,我们将只能看到数据帧在应用操作后的样子,但底层数据不会发生任何变化。

数据帧现在应该如下所示:

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

DataFrame after setting ‘Country name’ as the index

我们可以看到,DataFrame 丢失了它的行号(以前的)索引,并获得了一个新的索引:

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

New Index of the DataFrame

loc —通过一个索引标签选择行: 语法如下data.loc[index_label (,col_label)],括号中的部分是可选的。

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

data.loc[‘United States’] selects all rows with ‘United States’ as the index

loc —通过索引标签和列标签选择行和列:

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

data.loc[‘United States’,’Life Ladder’] selects the column ‘Life Ladder’ for all rows with ‘United States’ as the index

位置——通过多个索引标签选择行:

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

data.loc[[‘United States’,’Germany’]] selects all rows with ‘United States’ or ‘Germany’ as the index

备注:

  • 像前面一样,当选择多个列时,我们必须确保将它们放在双括号中。如果我们忘记这样做,列将被认为是一个长的(不存在的)名称。
  • 我们使用样本(5)来表明在混合中有一些德国。假设我们使用 head(5)来代替,我们将只能在 12 行美国之后看到德国。
  • Loc 按照提供的顺序返回行,而不考虑它们的实际顺序。例如,如果我们首先指定德国,然后指定美国,我们将得到 13 行德国,然后 12 行美国

loc-通过多个索引标签选择行和列: 您还可以为要返回的选定行指定列名。

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

Selecting rows and columns by label name

**注意:**我们将行选择['Germany','United States]和列选择['Year','Life Ladder']分布在两行上。我发现将语句拆分有助于提高可读性。

loc —通过一系列索引标签选择行: 这种选择行的方式可能有点奇怪,因为标签范围('Denmark':'Germany')不像 iloc 使用数字范围(903:907)那样直观。

指定标签范围是基于索引的当前排序,对于未排序的索引将会失败。

但是,假设您的索引已经排序,或者您在选择范围之前已经排序,您可以执行下列操作:

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

Using loc with a range of rows is going to return all rows between (including) Denmark and Germany

loc —布尔/条件查找 布尔或条件查找才是真正的关键所在。正如前面提到的,无论何时选择行,这都是通过用真值和假值的掩码覆盖数据帧来实现的。

在下面的例子中,我们用索引['A','B','A','D']和 0 到 10 之间的一些随机值创建了一个小的数据帧。

然后我们创建一个具有相同索引值[True,False,True,False]overlay

然后,我们使用df.loc[overlay]只选择索引值为真的行。

**IN:**
from numpy.random import randint
index = ['A','B','A','D']## create dummy DataFrame ##
df = pd.DataFrame(
    index = index,
    data = {
    'values':randint(10,size=len(index))
})
print('DataFrame:')
print(df)**OUT:** DataFrame:
   values
A       8
B       2
A       3
D       2**IN:**
## create dummy overlay ##
overlay = pd.Series(
    index=index,
    data=[True,False,True,False]
)
print('\nOverlay:')
print(overlay)**OUT:** Overlay:
A     True
B    False
A     True
D    False
dtype: bool**IN:**
## select only True rows ##
print('\nMasked DataFrame:')
print(df.loc[overlay])**OUT:**
Masked DataFrame:
   values
A       8
A       3

基于一个(或多个)条件,可以使用相同的逻辑来选择行。

我们首先创建一个布尔掩码,如下所示:

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

Filtering based on the value of ‘Life Ladder’ returns Series with True/False values

然后使用该掩码只选择符合指定条件的行,如下所示:

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

Selecting rows based on a condition

选项 1 作为替代方案也产生完全相同的结果。然而,另一种选择更清晰一些。当应用多种条件时,易读性的提高变得更加明显:

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

Chaining various conditions together

**注意:**我们使用了&(按位 and)来过滤行,其中多个条件同时适用。我们可以使用|(按位 or)来过滤符合其中一个条件的列。

loc —带有自定义公式的高级条件查找

也可以使用定制的函数作为条件,并将它们应用于选择列,这非常容易。

在下面的例子中,我们只选择能被三整除的年份和包含单词 America 的大洲。这个案例是人为的,但却说明了一个问题。

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

Row selection based on custom formulas conditions

除了 lambda(匿名)函数,您还可以定义和使用更复杂的函数。您甚至可以(我并不推荐)在自定义函数中进行 API 调用,并使用调用的结果来过滤您的数据帧。

4.分析功能

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

Image by xresch from Pixabay

既然我们已经习惯了从前到后对数据进行过滤和排序,反之亦然,那么让我们转向一些更高级的分析功能。

标准功能:

像 read 函数一样,Pandas 也实现了很多分析函数。

我将强调并解释我最常用的方法。然而,这也是它美丽的一部分,甚至我会不时地发现新的有用的功能。所以千万不要开始阅读和探索!

  • ①最大/最小
  • ②总和
  • ③平均值/中位数/分位数
  • ④ idxmin/idxmax

**注意:所有函数都可以按列应用,也可以按行应用。**在我们的例子中,行方式的应用没有什么意义。然而,通常情况下,您有数据,您想比较不同的列,在这种情况下,行方式的应用程序确实有意义。

每当我们调用上述函数时,都会传递一个默认参数axis=0(对于按列的应用程序)。然而,我们可以覆盖这个参数并传递axis=1(对于行方式的应用)。

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

① max/min 对数据调用max(),将(尽可能)返回每列的最大值。min()恰恰相反。

**IN:**
data.max() **# COLUMNWISE MAXIMUM****OUT:** Year                                                        2018
Life Ladder                                              8.01893
Log GDP per capita                                       11.7703
Social support                                          0.987343
                                                       ...      
Most people can be trusted, WVS round 1999-2004         0.637185
Most people can be trusted, WVS round 2005-2009         0.737305
Most people can be trusted, WVS round 2010-2014         0.661757
Continent                                          South America
Length: 26, dtype: object**IN:** data.max(axis=1) **# ROW-WISE MAXIMUM****OUT:** 
Country name
Afghanistan    2008.0
Afghanistan    2009.0
Afghanistan    2010.0
Afghanistan    2011.0
                ...  
Zimbabwe       2015.0
Zimbabwe       2016.0
Zimbabwe       2017.0
Zimbabwe       2018.0
Length: 1704, dtype: float64

② sum 对数据调用sum(),将(尽可能)返回每一列的总和。

**IN:** data.sum()**OUT:** Year                                                                                         3429014
Life Ladder                                                                                  9264.91
Log GDP per capita                                                                           15456.8
Social support                                                                               1370.67
                                                                         ...                        
Most people can be trusted, WVS round 1999-2004                                              131.623
Most people can be trusted, WVS round 2005-2009                                              166.532
Most people can be trusted, WVS round 2010-2014                                              159.358
Continent                                          AsiaAsiaAsiaAsiaAsiaAsiaAsiaAsiaAsiaAsiaAsiaEu...
Length: 26, dtype: object

注意: Sum 会将字符串连接成一个长字符串,这将为 Continent 列生成 asiasiasiasiasiasiasiasiasiasiasiasiasiasiasiaaiaeu…。

③均值/中值/分位数 对数据调用meanmedianquantile将分别返回均值或中值。

**IN:** data.mean()**OUT:** Year                                               2012.332160
Life Ladder                                           5.437155
Log GDP per capita                                    9.222456
Social support                                        0.810570
                                                      ...     
Most people can be trusted, WVS round 1994-1998       0.249574
Most people can be trusted, WVS round 1999-2004       0.268070
Most people can be trusted, WVS round 2005-2009       0.264336
Most people can be trusted, WVS round 2010-2014       0.237493
Length: 25, dtype: float64**IN:** data.median()**OUT:**
Year                                               2012.000000
Life Ladder                                           5.339557
Log GDP per capita                                    9.406206
Social support                                        0.833098
                                                      ...     
Most people can be trusted, WVS round 1994-1998       0.229924
Most people can be trusted, WVS round 1999-2004       0.232000
Most people can be trusted, WVS round 2005-2009       0.198380
Most people can be trusted, WVS round 2010-2014       0.193531
Length: 25, dtype: float64**IN:** data.quantile(q=.8)**OUT:** Year                                               2016.000000
Life Ladder                                           6.497157
Log GDP per capita                                   10.375623
Social support                                        0.913667
                                                      ...     
Most people can be trusted, WVS round 1994-1998       0.304498
Most people can be trusted, WVS round 1999-2004       0.388611
Most people can be trusted, WVS round 2005-2009       0.415082
Most people can be trusted, WVS round 2010-2014       0.373906
Name: 0.8, Length: 25, dtype: float64

④idx min/idx max
对数据调用idxmaxidxmin将返回找到第一个最小值/最大值的行的索引。然而,只可能在一些普通的列上调用这个函数。

**IN:** data.iloc[:,:-1].idxmax() # We exclude the Continent Column**OUT:** Year                                               Afghanistan
Life Ladder                                            Denmark
Log GDP per capita                                       Qatar
Social support                                     New Zealand
                                                      ...     
Most people can be trusted, WVS round 1994-1998         Norway
Most people can be trusted, WVS round 1999-2004         Sweden
Most people can be trusted, WVS round 2005-2009         Norway
Most people can be trusted, WVS round 2010-2014    Netherlands
Length: 25, dtype: object

这意味着,例如,丹麦的社会支持值最高Life Ladder,卡塔尔最高Log GDP per capitaNew Zealand

idxmin的工作原理与idxmax相同。

**总结:**不要忘记,您可以按列(轴=0)或行(轴=1)应用所有这些函数

应用/自定义功能:

您还可以编写自定义函数,并在行或列上使用它们。有两种自定义函数:

  • 命名函数
  • λ函数

命名函数是用户定义的函数。它们是通过使用保留关键字def来定义的,如下所示:

命名函数:

**FUNCTION:**
def above_1000_below_10(x):
    try:
        pd.to_numeric(x)
    except:
        return 'no number column'

    if x > 1000:
        return 'above_1000'
    elif x < 10:
        return 'below_10'
    else:
        return 'mid'**IN:** data['Year'].apply(above_1000_below_10)**OUT:** Country name
Afghanistan    above_1000
Afghanistan    above_1000
Afghanistan    above_1000
Afghanistan    above_1000
                  ...    
Zimbabwe       above_1000
Zimbabwe       above_1000
Zimbabwe       above_1000
Zimbabwe       above_1000
Name: Year, Length: 1704, dtype: object

这里我们定义了一个名为above_1000_below_10的函数,并将其应用于我们的数据。

该函数首先检查该值是否可转换为数字,如果不可转换,将返回“无数字列”否则,如果值大于 1000,函数返回 above_1000,如果值小于 10,函数返回 below_10,否则返回 mid。

Lambda 函数: 对我来说,Lambda 函数出现的频率比命名函数高得多。本质上,这些都是简短的一次性函数。这个名字听起来很笨拙,但是一旦你掌握了窍门,它们就很方便了。例如,我们可以首先在空间上拆分大陆列,然后获取结果的最后一个词。

**IN:** data['Continent'].apply(lambda x: x.split(' ')[-1])**OUT:** Country name
Afghanistan      Asia
Afghanistan      Asia
Afghanistan      Asia
Afghanistan      Asia
                ...  
Zimbabwe       Africa
Zimbabwe       Africa
Zimbabwe       Africa
Zimbabwe       Africa
Name: Continent, Length: 1704, dtype: object

**注意:**命名函数和 lambda 函数都应用于单独的列,而不是整个数据帧。将函数应用于特定列时,函数逐行执行。当将函数应用于整个数据帧时,函数逐列执行,然后应用于整个列,并且必须以稍微不同的方式编写,如下所示:

**IN:**
def country_before_2015(df):
    if df['Year'] < 2015:
        return df.name
    else:
        return df['Continent']**# Note the axis=1** data.apply(country_before_2015, axis=1)**OUT:** Country name
Afghanistan    Afghanistan
Afghanistan    Afghanistan
Afghanistan    Afghanistan
Afghanistan    Afghanistan
                  ...     
Zimbabwe            Africa
Zimbabwe            Africa
Zimbabwe            Africa
Zimbabwe            Africa
Length: 1704, dtype: object

在这个例子中,我们也是逐行进行的(由axis=1指定)。当该行的年份小于 2015 年或该行的洲时,我们返回该行的名称(恰好是索引)。当您必须进行条件数据清理时,这样的任务确实会出现。

合并列:

有时你想增加、减少或合并两列或多列,这真的再简单不过了。

假设我们想要添加YearLife Ladder(我知道这是人为的,但我们这样做是为了便于讨论)。

**IN:**
data['Year'] + data['Life Ladder']**OUT:** Country name
Afghanistan    2011.723590
Afghanistan    2013.401778
Afghanistan    2014.758381
Afghanistan    2014.831719
                  ...     
Zimbabwe       2018.703191
Zimbabwe       2019.735400
Zimbabwe       2020.638300
Zimbabwe       2021.616480
Length: 1704, dtype: float64

-, *, /一样,你还可以做更多的字符串操作,就像这样:

**IN:** data['Continent'] + '_' + data['Year'].astype(str)**OUT:** Country name
Afghanistan      Asia_2008
Afghanistan      Asia_2009
Afghanistan      Asia_2010
Afghanistan      Asia_2011
                  ...     
Zimbabwe       Africa_2015
Zimbabwe       Africa_2016
Zimbabwe       Africa_2017
Zimbabwe       Africa_2018
Length: 1704, dtype: object

**注意:**在上面的例子中,我们想把两列组合成字符串。为此,我们必须将data['Year']解释为一个字符串。我们通过在列上使用.astype(str)来实现。为了简洁起见,我们不会在本文中深入探讨类型和类型转换,而是在另一篇文章中讨论这些主题。

分组依据

到目前为止,我们应用的所有计算都是针对整个集合、一行或一列的。然而——这正是令人兴奋的地方——我们还可以对数据进行分组,并计算各个组的指标。

假设我们想知道每个国家的最高Life Ladder值。

**IN:** data.groupby(['Country name'])['Life Ladder'].max()**OUT:** Country name
Afghanistan    4.758381
Albania        5.867422
Algeria        6.354898
Angola         5.589001
                 ...   
Vietnam        5.767344
Yemen          4.809259
Zambia         5.260361
Zimbabwe       4.955101
Name: Life Ladder, Length: 165, dtype: float64

假设我们希望每年有最高的Life Ladder的国家。

**IN:** data.groupby(['Year'])['Life Ladder'].idxmax()**OUT:** Year
2005    Denmark
2006    Finland
2007    Denmark
2008    Denmark
         ...   
2015     Norway
2016    Finland
2017    Finland
2018    Finland
Name: Life Ladder, Length: 14, dtype: object

或者多级组,假设我们想要每个洲/年组合中Life Ladder最高的国家。

**IN:**
data.groupby(['Year','Continent'])['Life Ladder'].idxmax()**OUT:** Year  Continent    
2005  Africa                  Egypt
      Asia             Saudi Arabia
      Europe                Denmark
      North America          Canada
                           ...     
2018  Europe                Finland
      North America          Canada
      Oceania           New Zealand
      South America           Chile
Name: Life Ladder, Length: 83, dtype: object

像之前的一样,我们可以使用许多标准函数或自定义函数(命名或未命名),例如,为每组返回一个随机国家:

**IN:**
def get_random_country(group):
    return np.random.choice(group.index.values)# Named function
data.groupby(['Year','Continent']).apply(get_random_country)# Unnamed function
data.groupby(['Year','Continent']).apply(
  lambda group: np.random.choice(group.index.values)
)**OUT:** Year  Continent    
2005  Africa                  Egypt
      Asia                   Jordan
      Europe                 France
      North America          Mexico
                           ...     
2018  Europe           North Cyprus
      North America       Nicaragua
      Oceania             Australia
      South America           Chile
Length: 83, dtype: object

注意: groupby 总是为每组返回一个值。因此,除非您按只包含唯一值的列进行分组,否则结果将是一个较小的(聚合的)数据集。

改变

有时,您不希望每个组只有一个值,而是希望属于该组的每一行都有您为该组计算的值。您可以通过以下方式完成此操作:

**IN:** data.groupby(['Country name'])['Life Ladder'].transform(sum)**OUT:** Country name
Afghanistan    40.760446
Afghanistan    40.760446
Afghanistan    40.760446
Afghanistan    40.760446
                 ...    
Zimbabwe       52.387015
Zimbabwe       52.387015
Zimbabwe       52.387015
Zimbabwe       52.387015
Name: Life Ladder, Length: 1704, dtype: float64

我们得到一个国家所有得分的总和。我们还可以做:

**IN:** data.groupby(['Country name'])['Life Ladder'].transform(np.median)**OUT:** Country name
Afghanistan    3.782938
Afghanistan    3.782938
Afghanistan    3.782938
Afghanistan    3.782938
                 ...   
Zimbabwe       3.826268
Zimbabwe       3.826268
Zimbabwe       3.826268
Zimbabwe       3.826268
Name: Life Ladder, Length: 1704, dtype: float64

得到每个国家的中位数。然后,我们可以像这样计算每一年的值的差异(因为转换保留了索引):

**IN:**
data.groupby(['Country name'])['Life Ladder'].transform(np.median) \
- data['Life Ladder']**OUT:** Country name
Afghanistan    0.059348
Afghanistan   -0.618841
Afghanistan   -0.975443
Afghanistan   -0.048782
                 ...   
Zimbabwe       0.123077
Zimbabwe       0.090868
Zimbabwe       0.187968
Zimbabwe       0.209789
Name: Life Ladder, Length: 1704, dtype: float64

这篇文章应该给你一些思考。最初,我还想包括访问器、类型操作和连接、合并和连接数据帧,但是考虑到文章的长度,我将这些主题移到了本系列的第二部分:

[## 在 20 分钟内了解 Python 主数据分析库的高级功能

熊猫高级功能代码指南。

towardsdatascience.com](/learn-advanced-features-for-pythons-main-data-analysis-library-in-20-minutes-d0eedd90d086)

到时见,继续探索!

哦,如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名灵媒成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的链接注册,我甚至会得到一些🍩。

[## 通过我的推荐链接加入 Medium-Fabian Bosler

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@fabianbosler/membership)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值