TowardsDataScience-博客中文翻译-2021-八十五-

TowardsDataScience 博客中文翻译 2021(八十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据网格体系结构

原文:https://towardsdatascience.com/the-data-mesh-architecture-a68acb8d4bc4?source=collection_archive---------21-----------------------

不仅仅是一个流行词

扎克·沃尔夫在 Unsplash 上的照片

数据架构不仅仅是一种技术架构,也是一种组织结构,因此,它是构建任何数据帝国的关键因素。随着时间的推移,出现了不同类型的架构,其目的总是为了用理想的解决方案来弥补差距:我们从数据仓库开始,它主要专注于创建用于报告的结构化数据集,然后扩展到数据湖,目的是集中访问数据,无论数据在哪里,以何种形式出现,并消除数据湖中存在的棘手问题。大约两年前, Zhamak Dehghani 推出了一种称为数据网格的新架构。

你的数据网是什么

作者图片

我们都知道这是一个充满流行词汇的领域,所以每当有新东西出现时,都需要一段时间(如果有的话)来确定它的确切含义;数据网格也不例外。然而,最简单的解释是,这是一种面向领域的数据结构化,重点是数据产品所有权,数据产品所有权,管理良好的数据使用,以及提供自助式数据基础设施。但是这些关键词到底是什么意思呢?

面向领域:去中心化 所有权架构 。与数据湖中的集中化不同,我们定义域和它们覆盖的边界,然后在这些域的基础上定义产品和所有权。

数据产品:表格、数据库、数据仓库、应用于数据的机器学习算法,可以根据业务需求定义为一个数据产品,强烈强调可重用性的概念。数据产品可以有不同的类型:原始数据、派生数据、算法、决策支持(如仪表板)和自动化决策制定。

数据产品所有者:对产品了如指掌的人或团队,负责添加新功能,并满足其他数据产品所有者的要求或业务需求。

数据治理:并不是什么新东西,而是更注重于全面记录数据产品及其与其他数据产品的关系,以及整个数据生命周期的管理。

自助式数据基础设施:使数据以独立的方式跨区域使用成为可能,可能没有数据所有者的干涉。

一旦定义好一切,前景就是为所有数据和数据产品(包括文档)提供一个单一的参考点,用户可以在那里访问它们,以这种方式加强架构的自助服务方面

我们会采纳的

在这个行业呆得够久的人都知道,任何改变的第一步都是可行性研究,一种涵盖如何缩小现状和潜在目标之间差距的分析。这不是最令人兴奋的活动,但也是一个好主意,可以更好地了解整个公司的情况。在这种情况下,现状的可行性研究涉及当前数据架构,但最重要的是正在使用的技术

第二步是设计未来。适应也意味着塑造理论定义,使它们符合现实,最重要的是你公司的现实。也就是说,一个架构应该被看作是一个指导方针,用最佳实践来填补理论和实践之间的空白,这样的指导方针经常需要被调整和微调以使它们真正有用。虽然组件的定义可以被认为是一个简单的步骤,但技术和工具却不是:从数据编目、治理以及所有可用数据的可见性和可访问性,使用支持数据网格体系结构的技术至关重要。因此,未来设计中的一个关键步骤是选择要使用的正确工具,无论是旧工具还是需要集成的新工具;很大程度上取决于公司内部的现状。

挑战

你公司的规模和年龄,也就是你数据的数量(和质量)决定了第一个复杂因素。虽然一个相当新的公司,使用的平台较少,数据量较少,在实施新的架构时更容易逃脱,但对于一个拥有多年数据的公司来说,情况就完全不同了,多个平台的集成,随着时间的推移缺乏结构以及许多其他方面都可能成为需要克服的巨大障碍。情况越复杂,可行性研究的时间就越长,新架构的设计就越困难,所有这些都会转化为更多的成本。

为了实现数据网格的好处,很有可能在使用的工具方面发生变化。最具挑战性的挑战之一可能是迁移到云世界,这本身会带来一系列的复杂性和返工。引入新技术也可能令人望而生畏,因为目前市场上有许多可能的选择,因此需要仔细考虑。

在实现数据网格体系结构时,另一个可能的挑战是商定一个单一的定义,适用于所有场景的跨领域,以实现数据处理的标准化。

对于这样一个快速变化的领域,有利也有弊的一点是,存在持续的改进动力,这转化为新架构的引入相当频繁。目前,已经有了一个新的时髦词,数据结构,它本身被视为数据网格的一种演变。然而,在跟上最新的方法和采用它所需的成本之间总是有一个权衡;总是奔向最新的解决方案并不总是最明智的决定。有时采用一些最佳实践可能是有利可图的,而其他时候坚持你所拥有的,并坚持认为那是最好的解决方案。重要的是始终意识到弱点,并随着时间的推移努力减少它们。

拥有和需求的数据象限

原文:https://towardsdatascience.com/the-data-quadrants-of-haves-and-needs-df3d997294ec?source=collection_archive---------28-----------------------

为数据分析和构建机器学习模型区分要素优先级的另类方法

想象一下,一个客户向你提出了一个商业问题,你需要用你的技能和专业知识来解决它;有报告、分析和建立机器学习模型。你开始这个项目,看看数据。你看到数据,注意到数据不干净,有数据缺失,有出入。

在开始数据分析之前,您需要处理数据,填充缺失的值(如果可能),并将其转换成可用的格式。问题是“如何

图片由作者提供,灵感来自来源[【https://www.canva.com/】T2

在这篇文章中,我将向你展示我用可用的形式准备数据的步骤,以及为什么我称之为“数据象限”

坐标轴

在我研究这些数据时,有两个基本要求。我把它们称为:

  1. 需要 —分析和构建机器学习模型所需的数据
  2. 拥有 —客户已经提供给您的数据,无论您是否可以使用它们

它们将作为我们的主轴,如下图所示:

象限(作者图片)

不是世界上所有的公司都有最好的数据存储技术;人们会遇到许多缺失的数据。你会发现自己在所有的象限里。

让我们更深入地了解每个象限。

象限

象限 I: 理想场景

象限 I ( 作者图片)

这是每个数据/业务分析师、数据工程师、机器学习工程师和数据科学家的梦想场景,在这里,客户提供的数据是一流的、高质量的、没有缺失值的、干净的。

当我们开始学习数据科学时,我们总是从这个数据干净完整的象限开始。然而,在现实世界中,情况并非如此。

正如我所说,这是一个“理想”的场景。在我们开始分析数据和建立我们的 ML 模型之前,我们必须努力达到这个象限。

象限三:舒适象限

象限三(作者图片)

基于这些数据,你会发现很少(或很多)你既不需要也不需要具备的特性。最好不要使用那些功能。虽然是基于业务问题,但最好还是先和你的客户取得联系,了解更多的特性。

如果客户端确认不使用这组功能,您可以放弃它们。如果客户说他们很重要,那么你最终会进入 象限 2

我们一会儿会谈到象限 2。正如人们所说,“把最好的留到最后”。

象限四:“依赖”象限

象限四(作者图片)

有趣的是,我们注意到几乎没有你拥有的特征,但是你不需要。不使用它们并丢弃它们会更好吗?嗯,不总是这样。

这就是你的领域专业知识可以帮助你的地方。根据业务问题,您可以决定是使用这些功能还是放弃它们。如果您不是领域专家,您可以随时与您的客户交谈,了解这些特性是否重要,以及它们如何影响分析。

*鼓声 *

第二象限:操场

象限 II ( 作者图片)

几乎总是,你会发现自己在象限 II;数据你需要,但你没有。这是一个象限,您会在其中找到大量缺失值的要素。您可能听说过,“在数据准备好进行分析之前,80%的时间都花在了“争论”或“蒙骗”数据上”[1]。

好的一面是你知道数据分析需要哪些特性。具有挑战性的部分是填补这些缺失的价值。用于填充缺失值的方法之一称为数据丰富,这是提高数据质量的常规做法。

我用过几个解决方案/技术,它们是:

  1. 网页抓取
  2. 使用 REST API
  3. 从第三方数据提供商处购买批量数据
  4. 归罪

我不会说这会直接把你带到象限 I ,因为上面提到的上述技术和数据来源并不能保证提取或拥有完整的信息。但是它肯定会让你有更好的数据质量来进行分析和构建 ML 模型。

最终步骤

理解数据和特征、它们的重要性以及它们对目标特征的整体影响肯定需要时间。这种方法不仅节省时间,而且有助于理解和优先考虑您的功能,并计划您和您的团队要采取的后续步骤。

我希望这篇文章对你有用。请在下面的评论区留下您的反馈。

参考资料:

[1]https://blog . coursera . org/why-big-data-science-depends-skilled-data-engineers/#:~:text = In % 20 fact % 2C % 20 some % 20 data % 20 科学家,建立% 20 data % 20 管道% 20 和% 20 仓库。

数据科学名人问答:满足 p 值(又名 p 值)

原文:https://towardsdatascience.com/the-data-science-celebrity-q-a-meet-p-value-aka-p-value-5dc021d078f6?source=collection_archive---------40-----------------------

入门

p 值到底是谁?这是我们这个时代最流行的名人计算——也可能是最被误解的。

图片由杰克·布吕克在 Unsplash 上拍摄

p 值(也称为 p 值)的神秘和影响使它成为我们这个时代最流行的名人计算方法——也可能是最容易被误解的。尽管在成千上万的数据分析中扮演着重要的角色,许多人仍然发现 p 值令人困惑,甚至是误导。

那么 p 值到底是谁呢?我们的采访者与 P. Value 坐下来进行了独家问答,听听它的起源故事,并找出为什么它的成功不仅仅是由于机遇。是的,我们问了一些棘手的问题:你会了解到你所听说的“p-hacking”争议背后的真相。

请继续阅读我们无拘无束的对话!

图片经由GIPHY

告诉我们你的根。P. Value 的人生故事是什么?

你想让我把茶洒了,嗯?有趣。我其实是因为一个关于茶的实验而诞生的。

罗纳德·费雪是我的父亲,但他是一个……嗯,不管怎样,他是一个英国统计学家和遗传学家——他也有一些可怕的想法。与此同时,他在统计学方面做了一些有趣的事情,至今人们仍在使用。比如,也许你听说过费希尔的精确测试?还是最大似然估计?你可以责怪他的虹膜数据集,每个人都用它来试验数据科学的东西。

那是 20 世纪 20 年代初的一天。我父亲的同事穆里尔·布里斯托(Muriel Bristol)是一名研究藻类的博士,他做出了一个大胆的声明。她说她能品尝出倒茶前或倒茶后加入牛奶的茶之间的区别。这有点像的长篇故事,也有不同的版本。甚至有一整本书的书名也来源于这一事件。

总之,很明显,我爸爸和生物化学家威廉·罗奇做了一个实验,看看穆丽尔是否真的能分辨出哪个是哪个。这让他想到了我。

罗纳德·费雪(维基媒体)和穆里尔·布里斯托(罗瑟姆斯泰德研究站/劳斯农业信托基金)

发生了什么事?你是如何帮助他们理解实验结果的?

对于茶叶的情况,他们有一个“零假设”和一个“替代假设”。无效假设是穆里尔不能分辨出倒茶前和倒茶后的奶茶之间的区别。另一个假设是她实际上能够分辨出不同。

你做了一个实验,想弄清楚零假设或替代假设是否能更好地解释正在发生的事情。这些人不得不问他们如何建立一个实验来有效地测试这一点。此外,穆里尔要正确辨别多少杯茶才能让我爸爸和罗奇感觉到替代假说得到了支持?

我就是从那里进来的。基本上是我爸编我来解决这个问题的。我是一个计算,显示你的结果是否与你在零假设下的预期足够不同…这样你就应该考虑替代假设可能是对正在发生的事情更好的解释。

剧透:穆里尔实际上可以品尝到不同之处!她甚至嫁给了威廉·罗奇。

图像通过 GIPHY

好的,但是多谈谈这个“结果足够不同”的事情——那是什么意思?

我所做的是告诉实验者,结果是否足够不同于仅仅是猜测,仅仅是偶然,看看是否会有不同的事情发生——我的意思是,会有对替代假设的支持。

我变得越小,你的结果就越不可能是偶然的。平时人家找我就是 0.05 以下。这意味着,如果假设零假设成立,你得到这些结果的概率是 5%或更低。你可以认为这些结果“出乎意料”或“令人惊讶”

0.05 bar 通常被大多数假设检验目的所接受。但有时人们对我来说可以接受更高或更低的数字。要看具体情况。你知道,有些人更放松,有些人要求更高。

然而,这里有一个重要的细节。p 值等于或低于 0.05,或任何阈值,仅仅意味着在你的自变量和因变量之间存在统计上显著的关系。这只是在你测试的环境中。

例如,如果您构建一个回归模型,您将在模型中的每个独立变量旁边看到 p 值,以及为整个模型计算的 F 统计的 p 值的总体值。p 值太多了!

如果某个特定自变量的 p 值低于 0.05(或您选择的阈值),这就意味着在回归模型中,该变量与结果变量之间存在显著的统计关系。

图片经由 GIPHY

耶!所以你是在告诉我哪些变量更能预测我的结果。

没有抱歉。这是方式比较复杂。

p 的极小值并不意味着一个“显著的”变量必然在预测你的结果变量方面真的很好。小的 p 值并不意味着大的预测能力。它也是一种特定于回归模型配置的计算,包括您已经包括的任何其他变量,以及您在特定分析方法中的特定数据。都非常…具体。所以这个变量并不是在所有情况下都永远重要。

(不幸的是,你分析的这种超特异性意味着你也可能有其他变量确实有预测能力,但是它们的 p 值太大而不显著。诡异却真实!所以领域知识和其他检查数据的方法仍然很重要。)

一个小的 p 值仅仅意味着你有更好的机会拒绝零假设——这可能是那个变量和结果变量之间没有关系。换句话说,这个微小的 p 值只是一个指标,表明这个变量与你的结果变量相关。我知道你喜欢找相关的东西,所以还是不错的。这是理解数据的一步。

以及基于 f 检验的整个回归模型的 p 值?它只是说,你通过设置一组你认为以特定方式连接的特定变量而提出的关系——嗯,如果 p 值如你所愿地低,那么恭喜你!与没有变量的模型相比,你的模型在拟合数据方面做得更好。我知道,你的模型不再像是一个成就了。但是,是的,还是有很好的信息。

最后一个令人震惊的事实是:你可以有一个总体上重要的模型,但没有单独重要的自变量。我知道,对吧?!这只是意味着这些变量的联合交互作用是显著的……但是没有一个变量单独达到这个标准。

在你开始告诉大家你提出的另一个假设是如何完全真实地解释事物之前,我还有一件事要告诉你。微小的 p 值不会“证明”你的替代假设是“真的”。这只是意味着你的零假设不太可能是事实。

图像通过 GIPHY

今天,我们在哪里可以找到你在不同的统计分析中施展你的魔法呢?

我在所有的统计类型中都得到了很棒的角色!你会看到我主演(懂了吗?*)在 t 检验中,当您想要查看两个组对于某个变量是否具有显著不同的均值时。那就是 Alteryx Designer 中手段工具的测试。t 检验也是 A/B 分析的核心,所以我在那里也是一个配角。当你检查变量之间关系的实际差异时,我还展示了一个列联表

当然,我也参与分析相关性,如下图所示。这个输出的下部表格中的数字是我对这些相关性中每一个的值。

作者图片

图像通过 GIPHY

如果你对模特感兴趣,那么,除了我其他迷人的工作之外,我也做模特。我们之前讨论过回归。如果你建立一个回归模型,就像我们说的,我会弹出你的每个自变量,向你展示哪些与你的结果变量有显著的统计关系。同样,统计显著性仅仅意味着通过分析你的变量之间的关系得到的结果是令人惊讶的并且具有潜在的意义,但并不意味着发现具有较低 p 值的变量必然是你的结果变量的更强预测因素。当然,您需要检查 f 检验的 p 值,以了解整个模型的表现。

作者图片

这是一个用红酒数据集预测葡萄酒质量分数的模型。看右边那个 Pr( > |t|) 栏目,追星!***表示酒精和硫酸盐的 p 值小于 0.001,但残留糖的空白点表示其 p 值大于 0.05。因此,在这个特定的模型和这个数据集中,残余糖可能比其他两个变量与葡萄酒质量的相关性更低,因为它没有显示出与葡萄酒质量的结果变量的意外或令人惊讶的联系。然而,在这种特定的数据情况下,硫酸盐和酒精可能与葡萄酒质量有关。

你也可以看到我在比较机器学习模型中扮演配角。想知道一个模特比另一个表现好是否只是偶然?我也可以帮你一把。

基本上,如果你有一个假设,我可以帮你测试它。

图像通过 GIPHY

你最近在一些研究丑闻中被点名——人们可能听说过“ p-hacking ”。这是怎么回事?

是啊,那都不是我的错。我只是一个计算,你知道吗?黑客行为听起来像是犯罪之类的——但这种事情只会发生在数据分析中,即使人们的意图是好的。

有些人如此坚定地要在他们的研究中找到有统计学意义的结果,以至于他们只是不停地挖掘他们的数据,用各种方式运行他们的数字,直到他们得到一些我小于 0.05 的结果。有人称之为数据挖掘或者——我最喜欢的——意义探寻。我喜欢成为探索的目标!

当人们认为仅仅因为他们没有发现任何有统计学意义的东西,他们所有的工作就不值得分享时,这是令人失望的。比如,找不到东西也很重要。

无论如何,最好的做法是在开始分析您的数据之前,决定并陈述您要测试的假设以及您的测试统计将会是什么,比如 t 测试中的 t 统计或列联表的卡方… 。这样,当你的结果不像你希望的那样时,你就不能改变事情了。你必须承诺。给这种分析方法加上一个环。

同样,一段重要的关系,在现实世界中可能不会有什么不同。有一次,有人对我说,“统计意义和实际意义是不一样的。”

那是深刻的。我们都要问,这个世界上真正重要的是什么?我只是想尽我的一份力量来回答这个问题。

图片经由GIPHY

推荐阅读

奖金

想要借助一些非常可爱的小狗对 p 值进行另一种解释吗?看看这段来自谷歌首席决策科学家 Cassie Kozyrkov 的视频。

原帖 Alteryx 社区数据科学博客

数据科学+气候变化课程

原文:https://towardsdatascience.com/the-data-science-climate-change-curriculum-e93b2ba1b969?source=collection_archive---------9-----------------------

为想要了解更多气候相关主题的数据科学家提供一站式资源,从获取和分析气候数据到设计解决方案。

ahin Sezer diner 在 Unsplash 上拍摄的照片

本周,世界领导人、专家和活动家齐聚苏格兰格拉斯哥,参加在 T4 举行的 2021 年联合国气候变化会议。全世界数百万人——从岛国的公民到古老森林的保护者——都在等着看这次活动会产生什么样的行动和决定。

然而,任何气候政策的成功都依赖于超越 COP26 的因素:地方和地区政治、科技进步,以及最重要的坚实可靠的数据。数据科学及其邻近学科一直是气候讨论的核心,无论是让决策者相信当前的紧迫性,反驳恶意行为者传播的虚假信息,还是设计可能帮助我们避免最糟糕情况的解决方案。

如果你在数据科学、机器学习或人工智能领域工作,并希望了解更多关于你的技能如何有助于形成气候对话的信息,或者如果你正在寻找加入这一努力的灵感,但不知道从哪里开始,那么你来对了地方。

利用 TDS 的深度档案,我们收集了 28 篇文章,涵盖了数据科学和气候变化交叉领域的广泛主题、方法和实用解决方案:面向有气候意识的数据专业人员的综合课程(各种各样)。(当我们发布关于这些主题的新贡献时,我们还会在此列表中添加相关帖子。)

你应该如何使用这种资源?这完全取决于你。每天读一篇文章,四周之后,你就会在这个相互关联的主题网络中打下坚实的基础。如果你想的话,在下一天休息的时候把它们全部读完;或者只是浏览并点击与你当前兴趣最相关的内容。我们鼓励您在阅读的帖子上留下评论,并尽可能广泛地分享它们和本课程。

让我们开始吧。

1.寻找、获取和处理气候数据

在我们能够获得洞察力或发现模式之前——更不用说提出解决方案了——我们需要可靠的、可访问的数据。这里有太多可用的资源可以列举,但是这里有一些进入气候数据的有用入口。

2.从气候历史中挖掘重要的见解

环境科学的一个重要方面是建立过去的模式,以便更好地检测和预测变化。以下文章提供了基于历史气候数据的广泛研究。

3。如何用气候数据讲述引人入胜的视觉故事

正如我们之前多次听到的,讲故事是数据科学家的一项关键技能。当处于危急关头的是引导气候危机的紧迫性时,情况就更是如此。下面的文章介绍了创建有效且易于解析的气候数据可视化的不同技术。

4。利用数据科学和机器学习进行气候预测和预报

围绕过去的气候模式建立基线是数据科学家角色的重要组成部分。同样重要的一点是充分利用他们的技能和模型的计算能力来预测未来的结果和潜在的情景。这是围绕气候政策和战略达成共识的重要一步。

5.关于气候变化对社会和经济的影响,数据科学能告诉我们什么?

气候变化不再仅仅是我们未来要担心的问题;它已经影响到世界各地的人们、社区、经济和生态系统。这里有几个帖子评估了它塑造我们生活现实的方式。

6。将数据、机器学习和人工智能整合到气候政策和解决方案中

我们已经看到了数据的力量,它塑造了我们对气候危机的起源和现状的理解,并为解决这一问题的政策对话提供了信息。在我们课程的最后一部分,我们将着眼于数据科学(以及相邻领域)成为广泛解决方案的一部分的有希望的方向。我们还考虑到需要考虑人工智能自身的环境成本。

我们希望你发现你的阅读是有用的,它让你充满活力——甚至可能激发你采取行动。如果你已经用你的数据科学技能解决了任何与气候相关的挑战,我们很乐意听到它:在这里留下评论,或者写你自己的帖子

数据科学内部创业宣言

原文:https://towardsdatascience.com/the-data-science-intrapreneuring-manifesto-3df16fe2fcfe?source=collection_archive---------39-----------------------

如何在一家因循守旧的公司内部成为一名数据科学企业家?

马克·帕尔默,www.techno-sapien.com

快讯:你不会在网飞、谷歌或亚马逊这样的超创新公司工作。但如果你本质上是一名企业家,你能在一家抵制变革的公司里茁壮成长吗?老牌公司的创新和初创公司的创新有什么不同?

吉福德·平肖特在他 1985 年的开创性著作《内部创业》中解决了这些问题。他研究了当时的大公司创新者,比如 AT & T、杜邦和 3M。他发现的原则经受住了时间的考验

如果你现在是一家大公司的数据科学家,那么你就是一名内部创业者——公司内部的创业者。因此,我更新了平肖的原则,为数据科学内部创业者撰写了一份宣言。

1。愿意被解雇也要来工作。超过 50%接受调查的内部创业者 Pinchot 表示,他们会为了自己的使命而拿自己的工作冒险。不,他没有鼓励令人愤慨的行为。他的意思是:要勇敢。

彼得·泰尔的测试是检验你是否有大胆设想的好方法:关于你相信没几个人认同你的说法是真的吗?内部创业者有一种打破常规的世界观,他们会努力捍卫这种世界观。

2.做一个热心的(志愿者)冠军。内部创业既是科学,也是福音。公司可能充满政治、无知和冷漠,所以内部创业者必须打破现状气球。平肖解释道:

“当德州仪器(Texas Instruments)研究了 50 多个成功和不成功的新产品介绍时,一个惊人的事实出现了:每个失败的项目——无一例外——都缺少一个热情的志愿者支持者。缺少的是内部企业家。事实上,我们越关注创新,就越能发现内部创业者。”

志愿者这个词是必不可少的。没有人会要求你成为一名内部企业家;火来自内心。或者,正如休·麦克克劳德解释的那样:告诉人们很容易;合作很难。内部创业者是一个想法的热心拥护者。一步一步来,不放弃,还是在。

休·麦克克劳德 。我经许可编辑了这篇文章。 原文 读作,“叫人上一门课,容易。”我扩大了措辞的范围,表明用数据进行观察很容易,但合作改变想法很难。

3.找只狐狸赞助你。蜘蛛侠是一个隐藏在众目睽睽之下的超级英雄,随时准备出现并拯救世界。内部创业者需要一个企业蜘蛛侠。平肖称他们为赞助商。吉姆·霍尔登狐狸因为他们狡猾、强大,并且在幕后工作。

找赞助人不容易。像狐狸一样,他们并不总是在组织结构图的顶端。但他们有影响力、可信度和权威。他们和你一样热衷于你的想法。正如林·曼努尔·米兰达所说,“赞助商——他们完成工作。”找一个。

4.尽可能在地下工作——公开会触发公司的免疫系统。对许多人来说,数据科学是人工智能的代名词,是自动化的代名词,是消除就业的代名词,这造成了恐惧。恐惧产生了对数据科学等新思想的无形的公司抗体。所以尽可能长时间不被发现。宣传吸引了人们对平肖所说的企业免疫系统的关注。

西奥多·罗斯福在他 1910 年的精彩演讲中称这些人为“批评家”和“傀儡”。(我把男人这个词换成了内部创业者——女人还是男人!):

“重要的不是批评家;不是指出内部企业家如何犯错,或者实干家在哪些地方可以做得更好的傀儡。功劳属于真正在竞技场上的内在企业家,他的脸上沾满了灰尘、汗水和鲜血;勇敢奋斗的人;谁犯错,谁一次次功亏一篑,因为没有不犯错误和缺点的努力;但是谁真正努力去做这些事情呢?谁知道伟大的热情,伟大的奉献;谁把自己花在有价值的事业上;谁最好知道最终高成就的胜利,谁最坏,如果他或她失败了,至少失败了,而大胆,所以他或她的位置永远不会与那些冷漠和胆小的灵魂不知道胜利和失败。”

-西奥多·罗斯福(“人”被“内部企业家”取代)

避免批评者和傀儡,直到需要扩大规模的时候(什么时候?#10).一开始,在后台安静地工作,像蜘蛛侠,像狐狸(#3)。

5.规避旨在阻止你(和你的担保人)执行任务的命令。传统的企业规划需要数月或数年时间;内部创业者一天要做几十个决定(见平肖的内部创业者如何计划,如下)。因此,内部创业者必须规避旨在减缓创新实际运作速度的命令。当你需要帮助时,请找你的担保人。记住,请求原谅比请求允许更容易。

《内部创业者如何规划》,内部创业,吉福德·平肖特,1985 年

6.做任何需要的工作,不管你的工作描述是什么。正如托马斯·爱迪生所说,“没有执行的愿景是幻觉。”

内部创业是肮脏的工作。传统的管理者倾向于授权;内部创业者偏爱行动。数据科学家搜寻数据或在数据丢失时创建数据。他们深刻理解数据。他们对利益相关者进行一对一的访谈。如果你先开火,后瞄准,你就拥有了内部企业家的 DNA。

7.尊重你的赞助商,尊重你的数据。内部创业者出于正当的理由,恭敬地打破规则。当你走得太远时,通过让他们了解情况来尊重你的赞助商——让他们帮助你。那是他们的工作。

8.跟随你对你选择的人的直觉,只和最好的人一起工作,坚持多样性。创业公司成功的部分原因是他们吸引了顶尖人才。现代内部企业家是技术意识的反叛者、牛仔和规则破坏者。他们在大公司里并不常见,但他们就在那里,像狐狸一样。

今天,多样性是必不可少的。正如雷德·霍夫曼所说,你团队的多样性就是它的遗传密码。所以如果你的团队是多元化的,你的选择会更好,更少偏颇。

因此,建立一个多元化的团队,团结起来,去吧。

9.除非你正在参加比赛,否则永远不要在比赛上下赌注。内部创业者都在。但他们在知道自己在跑哪场比赛之前不会全押。

再次考虑“内部创业者如何规划”的图表。请注意,有些目标被完全放弃了。这就像一家初创公司在发展过程中改变他们的商业模式,或者像疫情一样对突然的市场变化做出反应。

内部创业者在比赛之前会花时间定义比赛。然后他们拼命跑。

10.忠于你的目标,但对实现目标的方法要现实。每一个一夜成名都需要多年的努力。具有讽刺意味的是,虽然中层管理者倾向于抵制新想法,但大公司的许多高管却对这些想法过于兴奋,过于迅速。因此,在你进行内部创业时,记住风险投资的各个阶段是有帮助的——它们的融资水平对应于想法的成熟程度:

  • 种子轮是概念阶段。对于内部创业者来说,当你决定跑哪场比赛以及如何跑的时候,呆在地下。
  • 首轮融资是概念验证阶段。在大公司,团队会变得更大。但是不要过度推销你的想法。证明这个概念,不要告诉每个人这件事。培养新产品的早期采用者。
  • B 轮是为了上市。像大多数内部创业想法一样,大多数创业公司需要数年时间才能达到这个阶段。你已经证明了这个概念。你的产品有效。你有一个灯塔客户。这是你在大公司上市的时候。
  • C 轮为刻度。你的创新可以被整个公司采纳。

慢慢来。即使在大公司,新想法也需要数年才能形成规模。

将所有这些放在一起

在他的研究中,吉福德·平肖特发现,如果没有个人或小团体的热情投入,创新几乎不会发生。数据科学是当今创新最重要的催化剂之一,因此这一让数据发挥作用的现代化宣言值得更新、记忆和分享。

尾注

(1)我第一次开始实践内部创业是在 2005 年,2010 年和 2021 年写了相关文章。

(2) 内部创业绝版但值得寻找。你可以在亚马逊上找到用过的副本,或者在 LinkedIn 上联系我,我会分享我制作的总结它的 Powerpoint 幻灯片。

数据科学之旅

原文:https://towardsdatascience.com/the-data-science-journey-1cac66791a?source=collection_archive---------27-----------------------

从新手到构建机器学习模型

照片由海丝特·强Unsplash

开始旅程

所有大胆踏上数据科学旅程的人都来自不同的背景和倾向。有些人倾向于数学,有些人有点编程或人工智能。可能对计算机科学有安慰,对统计学有恐惧,或者反之,或者两者都没有,或者两者都有。产生分歧的原因是数据科学不是必修课。所有追求数据科学的人,尽管背景不同或缺乏背景,都被一条主线团结在一起:致力于学习。

本文探索了数据科学之旅的三个阶段:Python、数据分析和机器学习。这个想法是为准备踏上旅程的学习者提供一个概述。这不是一篇技术文章(没有代码!),而是一篇解释性的文章,强调在你大胆探索未知的过程中你可以期待什么。

第一段:Python

数据科学之旅通常从指南开始,无论是网站、书籍、课程、训练营、大学学位还是项目。最好的指南从 Python 开始,因为 Python 是机器学习的最佳语言,是我们最后一站要重温的数据科学之旅的终点。

代码是数据科学的语言,Python 可以说是学习如何编码的最佳语言,因为它无比清晰和简洁。Python 也是非常面向数学的,这使得它在数学人群中很流行,包括你的。它是所有流行的机器学习库的机器学习之王,包括 TensorFlow,keras,Pytorch 和 sklearn。最重要的是,Python 配备了 pandas,这是由 West McKinney 开发的最先进的数据分析库,可以快速高效地处理大数据。

有些程序,像伯克利编码学院,先教你如何编码,也就是说不假设你有计算机科学、编码或者 Python 的背景。如果你的数据科学指南需要你没有的编码背景,你可以通过 W3schools 等网站和The Python Workshop等在线课程来掌握 Python 基础知识。现在有很多优秀的资源可以开始学习 Python,包括各种各样的电子书和 YouTube 教程。

然而,数据科学家本身并不是专业的程序员。数据科学家的任务是分析数据,并根据这些数据做出预测。他们对编程的使用很大程度上属于专门的数据科学库的领域,就像上面提到的那些,以提取洞察力并生成预测。

Python(如果你坚持的话,也可以是另一种编程语言)对于在旅程中获得动力是必不可少的。刚起步的时候,获得读写功能的舒适,就足够进步了。由于编程将在整个旅程中使用,并且专门的库在等待着,所以一点点的流畅性将大有帮助。

照片由克莱门斯·范·雷在 Unsplash 上拍摄

第二站:数据分析

在掌握了足够的 Python 基础之后,数据科学旅程的第二站就是数据分析。

数据科学侧重于大数据的分析。“大数据”是一个有多种解释的术语。多大才算大?我认为大数据是太多的数据,无法通过视觉进行分析。对于初学者来说,数万行和数十列是相当常见的。在企业和学术层面,数十亿行甚至可能被超越。

如上所述,在计算机上高效处理大数据需要像 pandas 这样的专业库。在读取数据之后,可以使用各种统计方法和图表来分析数据。新生学习一些方法,比如不管数据大小如何,如何生成散点图、回归线和直方图。在数据分析中,目标是使用图表和统计数据将大数据转化为有意义的见解。

在数据科学之旅的这一点上,房间里的大象,统计学,出现了。学习代码来生成有意义的图形是一回事;拥有分析这些图表的统计背景是另一个原因。根据指南的重点和经验,可以在这一点上获得基本的统计分析。深入体验统计学需要大学水平的课程。在第一次旅行中,学习足够的统计数据来揭示和交流要点,同时为以后打下基础通常就足够了。

许多数据科学之旅是短跑,而另一些则是马拉松。一些提供出色的统计处理,如统计学和数据科学中的 MITx MicroMasters 程序,而大多数都是初级的。我认为数据科学不是美化的统计学。从理论角度来看,统计学家是统计专家,而数据科学家是处理大数据的特定编程子集的专家。统计学家经常成为杰出的数据科学家,数据科学家应该学习更多的统计学。

让我说清楚:你知道的统计数字越多越好。如果你没有受过统计方面的训练,那也没关系,你可以一路收集要点。当你开始时,理解中位数和四分位数、均值和标准差、偏斜数据、直方图、散点图和回归线可能就足够了。专注的项目、额外的课程和教科书可以让你走得更远。

第三条腿:机器学习

你可以以数据分析师的身份分析数据,这是一个著名的职业,统计学在其中起着主导作用。然而,有一种区分技能将数据科学家和数据分析师区分开来:机器学习。它也更有价值:根据 PayScale(2021 年 5 月)的数据,数据科学家的平均工资是 96,000 美元,而数据分析师的平均工资是 61,000 美元,相差 35,000 美元。

数据科学之旅的最后一站,机器学习,是一切汇集的地方。Python 代码运行必须进行统计分析的机器学习模型。大公司经常使用机器学习来根据输入数据进行预测。从自动驾驶汽车到个人数字助理,推动我们经济发展的尖端人工智能使用机器学习算法来决定采取什么行动。

那么到底什么是机器学习呢?

洛根·韦弗在 Unsplash 上拍摄的照片

在机器学习之前,为自动驾驶汽车编程需要程序员初始化数千条规则,告诉汽车在特定情况下应该做什么:当发光的红灯进入摄像头时停下来。相比之下,机器学习不是由预先设定的规则编程的,而是由旨在优化和学习过去数据的算法编程的。

进一步延伸类比,你的大脑并没有预先设定好驾驶汽车的程序。相反,你的大脑每次在车上都会收集数据,并使用这些数据来做出未来的决定。我记得多年前看到谷歌的自动驾驶汽车行驶在湾区高速公路上,唯一的目的就是收集数据。机器学习算法,特别是神经网络,允许像你的大脑一样灵活地收集和实现数据。

作为一个已经建立了机器学习模型的人,我要告诉你一个小秘密:建立机器学习模型比显式编程更容易。为什么?机器学习算法为你做了繁重的工作。

关键是要理解如何使用和修改机器学习算法。像跳板这样的项目使这成为一个焦点,教给学生构建机器学习模型的实用路线,这些模型是令人难以置信的高效和强大。虽然学术界实践的建立机器学习模型的数学之旅对于那些从零开始建立模型的必要背景的人来说非常有价值,但没有必要完成你的第一次旅程。大多数专业数据科学家不会从零开始构建模型。他们运行、调整、解释、评估和比较世界上最好的机器学习算法。如果是别人写的,你可以用。

完成旅程

一旦你可以通过机器学习将原始数据转化为有意义的预测,你的第一次数据科学之旅就完成了!

一堂课,一个训练营,甚至一个完整的项目,都不是结束,而是开始。虽然你可以在就业市场一试身手,但更多的课程和项目通常是有保证的。事实上,原创项目可以将你与其他走过相同旅程的人区分开来。最好的指南会在第一时间包含原创项目。

数据科学之旅可能是有益的,也可能是痛苦的,而且速度惊人地快。挫折、恶化的错误和困惑威胁着进步。快乐的时刻、新获得的自豪感以及在强大的支持网络中工作会让你坚持下去。像许多旅程一样,你投入的和你得到的是相称的。导游应该给你指路,但是旅程是你自己承担的。

科里·韦德是伯克利编码学院https://www.berkeleycodingacademy.com/的主管和创始人,他在这里向来自世界各地的青少年教授 Python、数据科学、机器学习和人工智能。他还是《Python 工作坊的主要作者和《用 XGBoost 和 Scikit-learn 进行渐变增强 的作者。**

数据科学管理资源手册

原文:https://towardsdatascience.com/the-data-science-management-resources-handbook-1821f666ebbb?source=collection_archive---------33-----------------------

汇编。

数据科学团队管理—如何做好?随着我们这一年轻职业的成熟和发展,运行数据科学团队(或项目)的方法和最佳实践正在融合。然而,这是一个漫长的过程,当我们都在等待迷雾散去时,新的 DS 经理和团队领导发现自己没有一个坚实的基础。

作为数据科学和机器学习领域的顾问,我陪同新经理组建他们的获胜团队——从招聘到建立项目流程、研究方法和合作框架。作为我工作的一部分,我经常查阅关于数据科学团队管理的不同材料,并挑选与手头团队最相关的材料。

那么,我向你展示我个人的数据科学管理资源汇编:从最入门到非常高级;从概述到“哦,太详细了,我不敢相信这是一本 21 分钟的读物”手册;从针对年轻、灵活的初创公司的课程到更适合全球企业的课程;它们都在这里,我希望你和我的客户一样觉得它们有用。

我的目标是保持这个列表的更新和增长;如果你知道另一个伟大的数据科学管理指南,偶然发现一个优秀的项目流程描述,或者甚至有你自己的手册要添加到一堆中——一定要让我知道。

两年内从 0 到 60(模型):构建出一个有影响力的数据科学功能

一个特定 DS 团队的故事,以及他们是如何成功建立的。写得非常简洁,信息丰富,有些指导方针可能并不适用于每家公司,但绝对值得了解。

领导人工智能团队的经验教训

这一篇主要是介绍性的,介绍了大多数有经验的数据科学家应该熟悉的概念,例如从创建一个良好的业务问题定义开始,根据数据检查项目的可行性等。

它还涉及到一些重要的主题,如组建一个以任务为基础的团队,适用于每个项目的里程碑,以及 ML 监控的重要性。

构建数据科学团队的搭便车指南

对新的数据科学团队的基本构建模块的清晰而中肯的概述。对第一次担任 DS 经理的人来说非常有用——但是有经验的人也可以学到一些技巧。

如何避免人工智能开发过程中的冲突和延迟(第一部分)

主要与公司相关——或者其他大型的、成熟的公司——在这些公司中,项目有许多依赖项和利益相关者。对创业公司来说就没那么多了。

如何避免人工智能开发过程中的冲突和延迟(第二部分)

对于所有与部署和监控相关的工作来说,信息丰富且非常有用。为研究阶段结束后我们应该注意的事情提供了明确的指导方针。

创业公司数据科学项目流程

一个难以置信的完整和全面的指南,为创业公司推荐 DS 项目流程。必读,但请注意:并非所有内容都适用于更大、更成熟的公司。

数据科学?敏捷?周期?我管理高科技行业数据科学项目的方法。

一个团队领导对“敏捷或不敏捷”问题的回答,清楚地概述了 DS 项目周期的不同之处。如果你正在为你的团队考虑敏捷,这是必须的。

数据科学管理的秘方

最后但同样重要的是,Shir Meir Lador 关于 DS 管理的演讲值得您花费宝贵的每一分钟观看。全面披露:作为 Shir 的朋友和以色列女性数据科学社区的共同领导人,我参与了这次聚会。尽管如此,我相信这是一个非常有价值的资源,为新的 DS 经理和老手提供了无价的建议。

最后的话

你找到你要找的东西了吗?如果你能抽出一分钟的时间,让我知道上面列出的哪些资源能帮助我改善它。无论是通过评论区还是通过其他方式,我都非常感谢您的参与。

无论您是一名经验丰富的数据科学经理,还是一名全新的数据科学经理,甚至是一名正在寻找改进团队工作方法的个人贡献者,我希望您已经发现这份数据科学管理材料汇编是对您时间的一种很好的利用。

Noa Weiss 是以色列的一名人工智能机器学习顾问。

数据科学三部曲

原文:https://towardsdatascience.com/the-data-science-trilogy-numpy-pandas-and-matplotlib-basics-42192b89e26?source=collection_archive---------3-----------------------

NumPy,Pandas 和 Matplotlib 基础

img src:https://www . pexels . com/photo/business-charts-commerce-computer-265087/

那么你是 Python 的新手。或者您可能已经熟悉了这些库,但是想快速复习一下。无论情况如何,Python 毫无疑问已经成为当今最流行的编程语言之一,正如下面的堆栈溢出趋势中的图表所示:

Img src:堆栈溢出趋势

在数据科学和机器学习中使用的最流行的 Python 包中,我们找到了 Numpy、PandasMatplotlib。在本文中,我将简要提供一个从零到英雄(双关语,wink wink) )数据科学 Python 入门所需的所有基础知识介绍。我们开始吧!

设置

首先,您需要安装软件包。如果你对 Python 完全陌生,我推荐你阅读本教程,或者任何你认为合适的教程。您可以使用以下pip命令:

pip install numpy -U 
pip install pandas -U 
pip install matplotlib -U 

完成后,我们现在将有以下导入:

这里,我们使用了每个包的通用别名。

Numpy

img src:https://github . com/numpy/numpy/blob/main/branding/logo/primary/numpylogo . SVG

Numpy 是机器学习和数据科学中使用的主要库之一:它用于各种数学计算,以优化的 C 代码为基础编写。

Numpy 数组

数组只是对象的集合。一个 1 级数组是一个列表。2-秩数组是一个矩阵,或者一个列表的列表。一个三级数组是一系列列表的列表,等等。

我们可以用一个常规的 Python 列表作为参数,用np.array()构造函数创建一个 numpy 数组:

np 数组最常见的属性之一是它的shape,它表示数组的秩:

我们得到一个具有相应秩的元组,我们称之为数组的维数。在这种情况下,上面的阵列是一维的,也称为平面阵列。我们还可以用一个列表的列表来获得一个更清晰的类似矩阵的形状:

在这种情况下,这看起来更像是一个行向量。类似地,我们可以如下初始化一个列向量:

我们也可以用同样的方法初始化全矩阵:

当然,这只是一个元组:

重塑数组

我们可以使用np.reshape函数来改变数组的维数,只要它包含相同数量的元素并且维数有意义。例如:将M1矩阵整形为行向量:

平面阵列到矢量

我们可以将平面阵列转换为 2D 阵列(向量),如下所示:

Numpy 数组不是列表

注意,列表和 NumPy 数组之间有一个重要的区别!

我们可以直接看到的一点是印刷风格。我们也有非常不同的行为:

点积

我们可以用np.dot(a1,a2)函数“乘”匹配的相邻维度的数组,其中a1.shape[1]==a2.shape[0]。《出埃及记》两个数组(通常用于机器学习)或 n 维向量的数学点积,由下式给出

(图片由作者使用 LaTeX)

对于循环,它看起来像这样:

更好的方法是:

现在,对于大量数据来说,速度上的差异是显而易见的,如下面的示例所示:

这是因为它利用了并行化

生成随机数组

一种方法是使用np.random.randn()功能:

熊猫

img src:https://pandas.pydata.org/about/citing.html

Pandas 是一个用于数据操作的库。它与 Numpy 高度兼容,尽管它有一些微妙之处。

初始化表格形成 Numpy 数组

您可以将 rank-2 Numpy 数组传递给pd.DataFrame()构造函数来初始化 pandas 数据框对象。

代码输出(图片由作者提供)

重命名列

我们可以使用.columns属性访问表的列名:

我们可以通过指定具有相应名称的列表来一次性重命名所有列:

代码输出(图片由作者提供)

现在我们的数据框有了输入列名。

列选择

我们可以使用df['colname']语法从 pandas 数据帧中选择列。结果是一个 Pandas Series对象,它类似于平面数组,但是集成了许多属性和方法。

有许多内置方法(参见文档,但是作为一个例子,我们可以通过使用describe()方法获得汇总统计数据:

设置多个列的子集

用已定义列的列表对多个列进行子集化会输出一个 pandas dataframe 对象。

代码输出(图片由作者提供)

请注意,这些列不必按照任何特定的顺序排列;这有助于按照我们的意愿重新排列表格:

代码输出(图片由作者提供)

分配列

假设我们想要获得满足特定条件的所有行。我们如何做到这一点?以下面的虚拟数据为例:

代码输出(图片由作者提供)

我们如何将一个额外的列集成到这个数据中?我们可以简单地用df['new_col'] = new_col语法分配一个兼容大小(行数)的数组、列表或序列:

代码输出(图片由作者提供)

现在假设我们想获取满足某个条件的所有记录。这种选择可以使用以下语法来完成:

df[condition]

其中condition是布尔值的 NumPy 数组。感谢 NumPy 广播,将 NumPy 数组/pandas 系列与的一个值进行比较,将产生一个相同类型的数组,其中每个值都与查询进行比较。
例如,将Request列与值no比较得出:

它指示条件为真的所有地方。然后,我们可以使用上面提到的语法,使用这个数组只选择属于True的行:

代码输出(图片由作者提供)

我们可以使用逻辑产生更复杂的查询。例如:取所有消耗指数为负的行的影响分值大于 1,的服务类型为service1:

代码输出(图片由作者提供)

这里,我们可以对提取信息所需的所有三个条件进行编码

代码输出(图片由作者提供)

熊猫申请

按照前面的示例,假设我们希望将某个函数应用于特定列的每个值,并获得一个序列,其中每个元素都是对相应元素应用的函数的输出。对于这些情况,我们可以使用熊猫Series对象的apply()方法。在数据帧中,它将具有以下语法:

df['column'].apply(func)

其中func 可以是返回一个单输出的任何函数。

示例:将每个服务映射到某个 bin,并将结果列分配给 dataframe。

代码输出(图片由作者提供)

熊猫位置

现在假设您想要改变某一列中的某一行,当这些行满足指定的条件时。其语法是

df.loc[condition, 'column'] = new_val

示例:Request的值设置为“否”则Factor的类型为 1:

代码输出(图片由作者提供)

对数据帧进行排序

要按一定的顺序对数据帧进行排序,我们可以使用sort_values()。使用inplace=True参数改变原始数据帧。通过在列表中指定多个列,可以对它们进行排序。

代码输出(图片由作者提供)

我们看到这些值已经相应地更新了。

重置索引

对值进行排序时,索引会发生变化。我们可以重置它,以便再次获得排序的索引:

代码输出(图片由作者提供)

删除列

重置索引时,旧索引作为一列保留。我们可以用drop()方法删除任何列。

代码输出(图片由作者提供)

聚合

Matplotlib 的另一个有用之处是聚合。假设我们想要合计每个EDX组的Impact计数。语法如下:

df.groupby("column").agg_function().reset_index()

agg_function()是一个熊猫函数,如sum()mean()(见本文)。

代码输出(图片由作者提供)

Matplotlib

img src:https://matplotlib.org/stable/gallery/misc/logos2.html

顾名思义,这是 Python 的主要绘图库。许多其他库如seaborn依赖于此。

散点图

散点图是通过指定两个长度相同的数组或列表而得到的 2D 图。例如,我们可以比较消费指数及其影响。

以下是一些常见的 Pyplot 函数:

  • plt.figure():指定参考画布。通过figsize=(a,b)改变绘图画布尺寸。
  • plt.scatter(x,y,color="b", marker=""):生成散点图。marker指定绘制点的形状。

使用熊猫的代码输出(图片由作者提供)

当然,如果有更多的数据,这将更有意义。让我们人工生成这个:

使用熊猫的代码输出(图片由作者提供)

剧情

如果我们想以线性的方式来观察这种关系,有时最好使用plot函数来代替。语法是相似的。

使用熊猫的代码输出(图片由作者提供)

注意: Matplolib plot方法将按照给出的顺序绘制给定点

重叠地块

我们可以通过调用 plot 函数两次来覆盖共享相同 x 轴值的两个图,每次调用 y 轴值:

使用熊猫的代码输出(图片由作者提供)

柱状图

熊猫的一个优点是,它整合了许多常见的 Matlotlib 情节。例如,我们可以用plot()方法绘制一个柱状图。这可以与其他 matplotlib 函数结合使用,如title()xlabel()等。

使用熊猫的代码输出(图片由作者提供)

对于 instnace,我们可以使用df.plot.bar()方法直接从数据帧创建柱状图:

使用 Pandas 和 Matplolib 的代码输出(图片由作者提供)

figsize参数与figure(figsize=())相同,rot表示标签的旋转。当然,你也能猜到这里的xy是干什么用的。

组条形图也可以被覆盖。

使用 Pandas 和 Matplolib 的代码输出(图片由作者提供)

其他示例可在文档中找到。

饼状图

使用相同的数据框架设计,我们可以很容易地绘制如下条形图:

使用 Pandas 和 Matplolib 的代码输出(图片由作者提供)

使用 Pandas 和 Matplolib 的代码输出(图片由作者提供)

启用subplots=True允许为不同的计数列绘制不同的条形图。

奖金:Seaborn!

有时,有些情节天生就更漂亮,或者更容易用高级 Matplotlib 包装库 Searborn 制作。

回归图

对于这个例子,我们将使用 Searborn 提供的 Tips 数据集

由 Seaborn 提供的 tips 数据集预览(图片由作者提供)

代码输出(图片由作者提供)

传递x_bins参数会将连续数据聚集到箱中,并提供额外的线条来指示箱的密度:

代码输出(图片由作者提供)

箱线图

箱线图是一种直观显示数据向量的常见分布统计信息的快速方法,如下图所示:

img src:https://upload . wikimedia . org/Wikipedia/commons/1/1a/box plot _ vs _ pdf . SVG

代码输出(图片由作者提供)

分布图

另一个有趣的事情是使用 displot 来获得一些数据分布的完整图像。

Seaborn 代码输出(图片由作者提供)

Pairplots

Pairplots 允许我们同时看到 out dataframe 列和每个列的分布之间的相关性,以各种方式表示。我们将用 seaborn 的预编码数据来说明这一点。

代码输出(图片由作者提供)

我们可以简单地使用 Seaborn 的pairplot函数来生成下面的图:

Seaborn 代码输出(图片由作者提供)

使用hue参数也允许我们在图中指定组:

Seaborn 代码输出(图片由作者提供)

所有的标签和细节都是自动完成的。您也可以通过使用diag_kind="hist"作为参数来改变对角线分布图的类型。

Seaborn 代码输出(图片由作者提供)

为了绘制内核密度估计值,您还可以指定kind="kde"作为参数。

Seaborn 代码输出(图片由作者提供)

相关图

我们可以通过在 pandas 数据帧上使用corr()方法生成一个相关矩阵来进行快速分析,这将生成一个数值列之间的相关值矩阵。然后,我们可以简单地用annot=True参数将它包在sns.heatmap()函数周围,得到下面的图:

Seaborn 代码输出(图片由作者提供)

线图

线图对于可视化类似时间序列的数据很有用;即从一点组织到另一点。这里有一个取自Seaborn 文档的例子:

首先,我们加载 FMRI 数据集(参见来源)。

Seaborn 数据集显示(图片由作者提供)

接下来,我们使用lineplot函数指定与时间相关的变量timepoint,以及作为“响应”的signal变量。因为这是一个分类变量,我们为每个变量获取多行!此外,我们还将hue指定为区域,即分组。这产生了一个非常好的图表,其中有四个不同的趋势被初步分组:

Seaborn 代码输出(图片由作者提供)

接下来会发生什么?

安:今天的介绍就到这里!当然,没有哪一篇文章会涵盖所有内容,所以这里有几篇其他的好文章,这样你就可以继续你的学习之旅:

来源

跟我来

  1. https://jairparraml.com/
  2. https://blog.jairparraml.com/
  3. https://www.linkedin.com/in/hair-parra-526ba19b/
  4. https://github.com/JairParra
  5. https://medium.com/@hair.parra

https://www.linkedin.com/in/hair-parra-526ba19b/

数据科学智慧金字塔

原文:https://towardsdatascience.com/the-data-science-wisdom-pyramid-8e5d1d85ae82?source=collection_archive---------30-----------------------

如何建立一个数据驱动的公司

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片

要了解数据科学、大数据等新主题,我建议阅读并理解一个名为数据科学金字塔的图形[1][2]。所描述的图表对每位顾问和数据驱动型员工都非常有帮助,并有助于解决各种问题,例如:

  • 一家公司目前在数据相关话题上处于什么位置?
  • 应该解决的大问题是什么?
  • 下一个发展阶段会是什么?
  • 前提条件是什么?…

因此,我想在下面的文章中提供一个易于采用的框架。

智慧金字塔

在看真正的智慧金字塔之前,第一步实际上可以在前面考虑。首先,当然,公司必须建立一个合适的基础设施。换句话说,应该建立一个可扩展但通常更具成本效益的云解决方案。在这里,特别是像 AWS,Google 和 Azure 这样的大公司提供了最好的条件。对于中小型公司来说,这通常是比自己构建一切更合适的方式。

智慧金字塔—作者图片

随后的阶段建立在彼此的基础上,可以被看作是独立的进化步骤。在敏捷的意义上,我们谈论的是主题,在任何情况下,在传统的意义上,我们谈论的是项目——即公司需要解决的更大的任务。

级别 1:数据源

之后,建立稳定的数据管道就提上了日程。在这里,我也推荐使用 Data Prep、talend 或 Alteryx 等知名且扎实的工具。由此产生的 ETL 和 ELT 过程应该在它们上线时被备份和监控——关于这个主题的更多信息可以在这里【3】阅读。你应该永远记住,数据质量是一个非常重要的话题。否则,您可能会缺乏用户和业务部门的信任。

第 2 级:数据仓库和聚集

除了易于实施和可扩展的云服务之外,借助 ELT 等新范例,您可以非常快速地建立数据仓库、湖泊和枢纽。通过 ETL 过程和 OLAP 立方体构建一个传统的本地数据仓库经常会导致项目延期、额外的成本和 IT 经理的头痛。新的技术、方法和云让我们有可能减少设置时间,并提供更加灵活和可扩展的解决方案。此外,应避免影子 IT,并将 Excel 或其他解决方案中的功能转移到数据仓库和 BI 工具中。在为您的数据仓库或湖规划架构时,您还应该坚持最佳实践并遵循例外的层模型。

级别 3:数据探索

数据探索过程追求的目标是搜索和分析数据中隐含的有价值的信息。尤其是在数据量较大(大数据)的情况下,这个问题更加严重。在不丢失任何有趣内容的情况下获得要可视化的数据的概述的挑战正在增加。

照片由 Unsplash 上的 inlytics | LinkedIn 分析工具拍摄

然后,数据分析师和科学家使用 Power Bi、Tableau 和其他系统等工具,以一种易于理解的方式获得新的见解或可视化信息。简而言之,这些问题如今都集中在一起,尤其是大数据带来的挑战。在这种情况下,可视化数据探索是有价值的,因为它极大地促进了对数据的洞察和知识的推导。

第 4 级:机器学习和数据科学

第四步包括先前获得的见解的自动化,如果必要的话,用自学系统丰富它们。今天,许多公司仍然使用初级的人工智能系统,其中一些是他们自己开发的,一些是他们购买的。在未来,这些系统将被优化,被更好的系统取代,或者完全重新思考。这需要良好的项目规划。在人工智能系统中,算法可能是科学上更有趣的部分,但在实践中,它主要是一个将系统集成到 it 基础设施和业务流程中的问题[4]。

第五级:智慧

“我们在知识中失去的智慧在哪里?我们在信息中丢失的知识在哪里?”—托马斯·斯特尔那斯·艾略特

一个完全由数据驱动的公司的商业模式是基于信息的货币化。公司有种不同的方法将数据用于他们的商业案例。除了战略性地使用数据之外,企业还可以利用探索性的方法,如产生新的想法,甚至是进化性的方法,如数据仓库现代化或实施自助式 BI。无论一家公司使用什么方法从他们的数据中获得洞察力,这个过程都是不可避免的,因为只有通过理解和分析数据,企业才能成功地满足客户的需求。

结论

成为一家数据驱动型公司并根据数据做出决策需要五个步骤,这在所谓的智慧金字塔中有所描述。如果尚未建立适当的基础结构,甚至可能需要六个步骤。这些步骤是相互依存的,应该一个接一个地解决,因为每一步都是下一步的先决条件。这个框架曾经帮助并且仍然帮助我分析处于各自阶段的公司,并计划下一步,同时也注意到问题。

资料来源和进一步阅读

[1] John D. Kellner,Brendan Tierney,数据科学 s . 54–58(2018)

[2] Rowley,Jennifer,智慧层级:DIKW 层级的表示,《信息与传播科学学报》第 163–180 页(2007 年)

[3]克里斯蒂安·劳尔,《数据整合——需要考虑的事情》 (2021)

[4] t3n,深度学习与数据科学

每个人都想要但没有人需要的数据可视化仪表板

原文:https://towardsdatascience.com/the-data-visualization-dashboard-everyone-wants-but-no-one-needs-c44c871830d?source=collection_archive---------44-----------------------

以用户为中心的分析设计方法

卢卡斯·布拉塞克在 Unsplash 上的照片

当我提到企业数据分析和可视化时,您首先想到的是什么?对于包括我自己在内的许多人来说,它是仪表板和 BI 工具。像 Power BI 和 Tableau 这样的工具已经成为企业分析和可视化的标准。

无可否认,我和其他人一样有罪。我花了很多时间制作仪表盘,认为客户会喜欢它们,它们会推动重要的商业决策。但萦绕在我脑海深处的问题总是,“客户多久看一次这些仪表板,他们觉得它们有价值吗?”

假设 ABC 公司雇佣我们设计一个分析包来帮助他们的主管了解他们当前的员工。最常用的方法是在标准 BI 工具中创建一个仪表板,并让管理人员访问它。仪表板可能包含描述性分析,如:

  • 当前员工
  • 请求
  • 自然减员/离职

这似乎是一种合理的方法,无疑比无法获得分析要好,但当钟摆摆动得太远时,它可能会失控。我见过一个部门有超过 50 个仪表板,有些是高级的,有些是详细的,有些是重叠的,有些是独特的。令人难以置信的是,怎么会有人跟踪这些信息的存在,更不用说根据这些信息做决定了。

我们需要暂停一下,将我们的重点从以数据为中心的方法转移到以用户为中心的方法。通过了解我们的高管如何思考和决定他们的员工,我们可以更好地设计真正有助于他们决策过程的分析,并消除任何对他们没有帮助的东西。如果不转向以用户为中心的方法,就很难或者不可能知道我们的解决方案是否增加了价值,或者只是另一份永远不会被使用的报告。

向我们的最终用户学习的唯一方法是花时间和他们在一起。利用过去项目、学术论文等的研究很有诱惑力。,但每个公司和个人群体都是不同的,有不同的需求。直接研究是了解我们最终用户独特需求的最佳方式。我们的方法可以变化:最好的方法是跟踪。最低限度的方法是每周召开一次会议。一次会议是不够的,因为它无法让我们了解他们的日常活动、战略、思维过程或提出后续问题。

以下是我在初次交谈中可能会问高管的几个问题。

  • 你能描述一下你在公司的角色吗?
  • 你能告诉我典型的一天吗?
  • 你能描述一下劳动力管理对你意味着什么吗?
  • 您目前如何跟踪您的员工?
  • 您多久谈论一次或必须对您的员工做出决定?
  • 关于劳动力的决定是你自己做出的,还是和你的员工一起做出的,还是两者兼而有之?
  • 劳动力管理有哪些方面比其他方面更重要?
  • 你怎么知道什么时候需要改变?
  • 劳动力管理方面有什么惊喜吗?
  • 您目前使用什么工具。

任何做过研究的人都意识到,在上述问题中,有几个小时是值得讨论的。这就是为什么跟进或定期召开会议至关重要。以上问题有些高级;他们没有深入劳动力管理的细节。为了取得成功,我们需要对我们的最终用户有一个丰富的了解。每次我们与他们会面,我们都会巩固我们的知识,改进我们的方法来满足他们的需求。

所有这些似乎都是不必要的,人们可能会利用现有工具利用现有数据构建一个分析解决方案,但是请想一想,如果我们了解到我们的大多数最终用户在早上第一件事就是阅读他们的电子邮件,或许一封强调我们的研究或潜在问题领域的最关键指标的上午摘要电子邮件将是比仪表板更有效的解决方案。或者可能是一条短信,当某件事情出错或趋向某个特定方向时。通过设计我们的解决方案来适应最终用户的思维和工作方式,而不是强迫他们修改他们的流程来适应我们的解决方案,结果将会更加成功。

仪表板有其用途,但它们不应该是事实上的方法。通过花时间了解我们最终用户的需求和决策过程,我们将设计出更有效的解决方案,使用最合适的方法在正确的时间将信息传递到正确的人手中。

机器学习工程师的日常工作

原文:https://towardsdatascience.com/the-day-to-day-of-a-machine-learning-engineer-378b80bf1f6f?source=collection_archive---------18-----------------------

表现得像你想成为的人

Unsplash 上拍摄的 ThisisEngineering RAEng

表现得像你想成为的那个人!当我们在脑海中审视自己时,我们能做的最好的事情就是把自己想象成未来的自己。我们想成为的人。当我们把我们想要成为的人想象成未来发生的一件事时,我们下意识地把自己和那个人分开。因此,把我们自己想象成未来的人是很重要的,这包括拥抱未来现在的情感、感觉和行动,即使我们还停留在现在。

为了成为你想成为的人,你现在必须像他们一样行动。

我们必须做他们做的工作,做他们会做的决定,感受他们的感受。正是因为这个原因,我热衷于建立我想要的职位上的人们的日常生活。我每天醒来都会问自己——“我未来的自己今天会在做什么?”。同样值得考虑的是我未来的自己不会做什么,这样我就能进入我想成为的人的心态。

我不打算深入探讨如何表现得像你想成为的那个人——这超出了本文的范围。但是,希望上面的例子能让你更好地理解为什么理解机器学习工程师的日常工作很重要——如果这是你想成为的话。

例行程序样本

当然,对于不同的机器学习工程师,根据他们的组织或个人偏好,例程可能会有所不同。我建议的套路只是一个大概的概述。如果你的经历非常不同,请随时留言分享你的日常生活。

上午

通宵运行的模型在早上第一件事就是检查。机器学习模型在一天中可能需要很长时间来训练,这可能导致在等待结果时效率低下。因此,当训练模型时,这通常是在公司服务器或云中连夜完成的(但这可能是有风险的,因为使用云服务器的成本可能会飙升),因此早上的第一个想法是检查一切是否顺利运行。

这可能包括测试算法,以确保它们按预期工作,如果没有,了解什么可能出错了。

之后,您可能想要检查当天所需的任务,这些任务可能包括团队会议、错误修复、开发产品代码库,或者实现您可能想要在将来测试的算法。

下午

早上的任务可能会让你忙到中午。如果没有,你的下一个任务很可能与编程有关。无论是进行分析还是启动 IDE 来编写新的类、修改脚本,或者其他任何情况。

当这个问题在 Quora 上提出时, 埃文·皮特·沃什 回应道

"一天中的其余时间,我通常都在埋头写代码,要么做一个后端 Python 应用程序,为我们的一个产品提供人工智能,要么实现一个我想尝试的新算法。

这似乎是一个共同的主题。早上开始的编程工作通常会占用一天的大部分时间,除非你一整天都有会议或站立会议。如果一个模型在上午被重新培训,那么在下午的后端将会有一个进度检查和评估(如果模型已经完成培训)。这之后通常是代码评审。

傍晚时分

一些组织在一天快结束的时候允许探索的空间。并不是所有的组织都允许这样做,有些组织更喜欢指定这样的一天。其他人更希望机器学习工程师自己采取主动。

学习的形式可以是从博客帖子、阅读研究论文、观看 YouTube 教程、阅读文档等中学习。有了他们学到的新想法,他们可以尝试实施它们,尤其是如果他们认为这会增加业务价值的话。

最后的想法

虽然本指南可能对机器学习工程师的一般人群有用,但值得进行自己的研究,以更好地了解您想要执行的确切角色。例如,如果有一家你知道你想为之工作的公司,开始研究在那里工作的人的日常生活是怎样的。如果可以的话,向在那里工作的人寻求更准确的视角。开始表现出你已经在那里工作的样子。

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的免费每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关著作

** **

罚款迁移的丧钟

原文:https://towardsdatascience.com/the-death-knell-to-fines-migration-8909c1deb2b4?source=collection_archive---------50-----------------------

咖啡数据科学

寻找答案

在 espresso 中,微粒迁移是一个没有太多支持证据的概念,但这个想法仍然存在。主要概念是小于 100um 的非常细小的颗粒在喷射过程中迁移到圆盘的底部。在这个过程中,它们不仅会从圆盘中出来进入咖啡,还会堵塞过滤篮的孔。

我之前已经用粉笔展示了数据,以表明微粒不会迁移很远,我还展示了一些数据,表明咖啡膨胀会阻碍微粒的迁移。在这项工作中,我想看看如何罚款可能堵塞过滤器使用筛选和废咖啡。

理论:细料将首先被完全提取,因此水将在没有大阻力的情况下流过它们。

我的一般理论是,细颗粒比大颗粒提取快,脱气快,因此,水流过它们时没有阻抗。水流过它们的结果是它们不太可能在圆盘中迁移。我第一次看到这个证据是在做实验用的废咖啡渣的时候。不管颗粒分布有多细,水都会流动得很快。

实验设计

为了完全理解这些微粒,我需要分离它们。我是用筛子做的。具体来说,我用了一个 Kruve 筛,有两个筛:400 微米和 200 微米。目标是生产两批咖啡渣:

  1. 400 微米>咖啡渣> 200 微米
  2. 咖啡渣< 200 微米

所有图片由作者提供

对于任何尝试过更细筛的人来说,他们都知道很细筛的困难。咖啡,甚至是用过的咖啡,都是结块的。通常,我用 400 微米和 500 微米的筛子筛选断奏镜头。我可以以 3g/分钟的速度筛选。要去 200um,我只能在 15 分钟内勉强得到 1g,所以我必须随机应变。

即使在用勺子筛选之后,我也不认为我能从大于 400 微米的较大颗粒中分离出所有较细的颗粒,但主要目的是得到小于 400 微米和小于 200 微米的颗粒。这也说明了测量技术中的一些误差,因为当筛分时,两个最小的轴定义了颗粒是否通过筛子。同样清楚的是,我没有把所有小于 200 微米的颗粒从 200 微米到 400 微米的颗粒中分离出来。

我可以在大于 400 微米的粒子分布中看到这一点,其中有许多小于 400 微米甚至 200 微米的粒子。

不管是什么情况,我已经筛选了足够的材料来进行测试。

左:200 微米

200 微米到 400 微米之间

对于这两个镜头,我使用了超过 1 公斤的压力硬夯。地面不太容易压缩。

球拉得比没拉慢一点,冰球漂亮又均匀。

Twitter 和 YouTube ,我在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以在Patreon 上关注我。

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事首页

摄影飞溅页面

使用图像处理测量咖啡研磨颗粒分布

改进浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡滤纸

浓缩咖啡篮及相关主题

意式咖啡观点

透明 Portafilter 实验

杠杆机维修

咖啡评论和想法

咖啡实验

Paper Filters for Espresso

Espresso Baskets and Related Topics

Espresso Opinions

Transparent Portafilter Experiments

Lever Machine Maintenance

Coffee Reviews and Thoughts

Coffee Experiments

深度学习推理加速博客系列—第 2 部分—硬件

原文:https://towardsdatascience.com/the-deep-learning-inference-acceleration-blog-series-part-2-hardware-a4d89042f5eb?source=collection_archive---------36-----------------------

深度神经网络已经成为许多机器学习应用中的常见实践。他们实现类似人类,甚至超人的准确性的能力使他们成为人工智能历史上的一个里程碑。然而,就计算能力而言,达到这样的精度水平是极其昂贵的。现代架构执行数十亿次浮点运算(FLOPs ),这给实际应用带来了巨大挑战。因此,许多优化技术已在硬件层面得到开发,以高性能和高功耗/能效处理这些模型,而不会影响其精度。难怪深度学习加速器市场火了。英特尔最近以 20 亿美元收购了哈瓦那实验室,而 AMD 也准备以 350 亿美元收购 Xilinx

在这篇文章中,我们继续我们的深度学习推理加速系列,并深入研究硬件加速,推理加速堆栈中的第一级(见图 1)。我们回顾了目前用于深度学习推理的几个硬件平台,描述了每个平台,并强调了它们的优缺点。

图 1:推理加速栈(图片由作者提供)

中央处理器

CPU 是计算机的“大脑”,它处理指令以执行一系列要求的操作。我们通常把 CPU 分成四个组成部分:(1)控制单元——指导处理器操作的部件。它告诉其他组件如何响应发送给处理器的指令。(2)算术逻辑单元(ALU) —执行整数算术和按位逻辑运算的组件。(3)地址生成单元(AGU)—CPU 内部计算用于访问主内存的地址的组件。(4)内存管理单元(MMU) —这是指 CPU 用来分配内存的任何内存组件。

当今的 CPU 是重型硬件,包含数十亿个晶体管,设计和制造成本极高。它们包含强大的内核,能够处理大量的操作和内存消耗。这些 CPU 支持任何类型的操作,而不需要编写自定义程序。然而,它们广泛的普遍性也意味着它们包含多余的操作和逻辑验证。此外,他们没有充分利用深度学习中可用的并行机会。

优点 —经济高效、适合通用、强大的内核、高内存容量

缺点— 没有充分利用并行性,吞吐量性能低

图形处理单元

GPU 是一种专门的硬件组件,旨在同时执行许多简单的操作。最初,GPU 旨在加速实时计算机图形的图形渲染,尤其是游戏应用程序。GPU 的一般结构与 CPU 的结构有一些相似之处;它们都属于空间建筑家族。但是,与由几个针对顺序串行处理而优化的 alu 组成的 CPU 相比,GPU 由数千个 alu 组成,能够并行执行大量简单操作。这一惊人的属性使 GPU 成为深度学习执行的理想候选。例如,在计算机视觉应用的情况下,卷积运算的结构(其中在输入图像中的每个片上应用单个滤波器)能够有效地利用 GPU 设备的并行性。

尽管 GPU 目前是深度学习训练的黄金标准,但在进行推理时,情况并不那么清楚。GPU 的能耗使其无法在各种边缘设备上使用。例如,英伟达 GeForce GTX 590 的最大功耗为 365W。这一数量的能量不可能由智能手机、无人机和许多其他边缘设备提供。此外,从主机到设备的传输存在 IO 延迟,因此如果不能充分利用并行化,使用 GPU 就变得多余。

优点 —高吞吐量性能,非常适合现代架构(ConvNets)

缺点 —昂贵、耗能、IO 延迟、内存限制

现场可编程门阵列

FPGA 是另一种类型的专用硬件,设计用于在制造后由用户进行配置。它包含一个可编程逻辑模块阵列和一个可配置互连层次结构,允许模块以不同配置互连。实际上,用户用硬件描述语言(HDL)编写代码,如 Verilog 或 VHDL。这个程序决定了什么样的连接,以及如何使用数字元件实现连接。近年来,FPGAs 开始支持越来越多的乘法和累加运算,使它们能够实现高度并行的电路。但另一方面,在实践中使用它们可能具有挑战性。例如,数据科学家在 GPU 上使用 Python 库(TensorFlow、Pytorch 等)训练他们的模型,并且仅使用 FPGAs 进行推理。事实是,HDL 本质上并不是一种编程语言;它是为定义硬件组件(如寄存器和计数器)而编写的代码。这意味着从 Python 库到 FPGA 代码的转换非常困难,必须由专家来完成。

优点 —芯片、节能、灵活

缺点 —极难使用,并不总是比 CPU/GPU 好

定制 AI 芯片(SoC 和 ASIC)

到目前为止,我们描述了已经被改造以适合深度学习目的的硬件类型。定制人工智能芯片启动了一个快速发展的行业,为人工智能构建定制硬件。目前,全球有 100 多家公司正在开发用于深度学习应用的专用集成电路(ASICs)或片上系统(SOC)。此外,大型科技公司也在开发自己的解决方案,如谷歌的 TPU、亚马逊的推理、英伟达的 NVDLA、英特尔的哈瓦那实验室等。这些定制 AI 芯片的唯一目的是比现有解决方案(即 GPU)更快地执行深度学习操作。因为不同的芯片设计的目的不同,所以有训练用的芯片,也有推理用的芯片。例如,哈瓦那实验室正在开发用于训练的高迪芯片和用于推理的戈雅芯片。

制造一个人工智能芯片(ASIC 或 SoC)不是一件小事。这是一个昂贵、困难和漫长的过程,通常需要几十名工程师。另一方面,从定制人工智能芯片中获得的优势是巨大的,毫无疑问,在未来我们将看到这些芯片的广泛使用。

优点 —显著提升推理性能的潜力

缺点—昂贵且难以开发

我的 DL 推断应该使用哪种硬件?

有许多在线指南描述了如何选择 DL 硬件进行训练,但是很少有关于选择什么硬件进行推断的指南。就硬件而言,推理和训练可能是非常不同的任务。当面对选择哪种硬件进行推理的困境时,您应该问自己以下问题:我的推理性能(延迟/吞吐量)有多重要?我想最大化延迟还是吞吐量?我的平均批量是小还是大?我愿意用多少成本来换取性能?我使用的是哪个网络?

让我们看一个例子来演示我们如何选择推理硬件。假设我们的目标是使用 YOLO v3 执行对象检测,我们需要在四个 AWS 实例之间进行选择:CPU-c5.4xlarge、Nvidia Tesla-K80-p2.xlarge、Nvidia Tesla-T4-g4dn.2xlarge 和 Nvidia Tesla-V100- p3.2xlarge。我们首先评估吞吐量性能。图 2 显示了每个硬件选项实现的吞吐量。我们看到 V100 绝对主导了吞吐量性能,尤其是在使用大批量(本例中有 8 个图像)时。此外,由于 YOLO 模型中的并行化潜力巨大,CPU 在这一指标上不如 GPU。

图 2:四个硬件设备的批量大小与吞吐量的关系。*结果是在 AWS 机器上为 YOLO v3 测量的。

如果我们唯一的优先任务是优化吞吐量,那么我们已经完成了这里的工作,应该为我们的推理引擎选择 V100。然而,在大多数情况下,成本也是一个问题。为了衡量硬件的成本效益,我们用吞吐量性能除以 AWS 实例的价格,如图 3 所示。虽然 V100 实现了最佳的吞吐量性能,但它不是最具成本效益的硬件。在我们的例子中,T4 似乎是最具成本效益的硬件,尤其是如果我们使用小批量。

图 3:推断四个硬件设备的 10 万个样本的批量大小与成本。*结果是在 AWS 机器上为 YOLO v3 测量的。

显然,不同的模型会得到不同的结果。例如,为 CPU 设计的分类模型(如 MobileNet、EfficientNet 等。),CPU 是性价比最高的硬件。在 Deci,只需按一下按钮,我们就可以为您生产这些基准,适用于每种型号,甚至是您的型号。你可以在这里找到更多细节

结论

在深度学习加速系列的第二篇文章中,我们调查了用于加速深度学习推理的不同硬件解决方案。我们首先讨论了各种硬件机器的优缺点,然后解释了如何为您的推断场景选择硬件。毫无疑问,未来几年我们将看到深度学习硬件领域的热潮,特别是在定制人工智能芯片方面。

正如我们在上一篇文章中看到的,算法加速的改进潜力独立于硬件加速的潜力。这就是为什么在 Deci,我们决定走算法路线。我们的解决方案可以在任何硬件上使用,并且是硬件感知的,这意味着它考虑了目标硬件的不同方面。我们邀请您在我们的白皮书中了解更多信息。敬请关注下一篇帖子。

最初发布于 https://deci.ai/resources/#blog

使用 Kabsch 算法对齐两组 3D 点的明确过程

原文:https://towardsdatascience.com/the-definitive-procedure-for-aligning-two-sets-of-3d-points-with-the-kabsch-algorithm-a7ec2126c87e?source=collection_archive---------12-----------------------

对齐空间中的点集。卢西亚诺·阿布利亚塔。

使用 JAVASCRIPT 代码

上周我纠结于通过低级代码对齐两组原子坐标的问题。最终成功后,我写了这篇简短的教程,其中包含了底层的 JavaScript 代码,如果你需要的话,可以帮你减轻痛苦。

Kabsch 算法是一种计算最佳平移和旋转的方法,可使两对点之间的均方根偏差( RMSD )最小化。它在结构生物信息学、分子模拟、分子建模和结构生物学研究中被大量用于叠加分子对。事实上,它被广泛使用,以至于我所知道的所有分子图形程序和库都已经包含了这方面的内置命令,通常具有丰富的特性。

但是对于我们的 moleculARweb 的虚拟建模工具包,我们需要从头开始编写代码,在较低的级别,并且最好没有外部数学库。这意味着我们需要在尽可能最基本的层次上执行所有的数学运算,而不是像在其他环境中那样调用“align()”或“kabsch()”函数。网上搜索有很多解释和代码片段;它们看起来都很简单,但是它们都有缺失的部分,或者步骤过于简单,或者干脆跳过一些步骤。

一旦我们做好了,我认为最好贴一个权威性的教程,你可以在这里找到它和 JavaScript 代码(我们的 web 应用程序需要它)。

用简单的数学术语来描述这个过程

给定 n 个点的 n×3 矩阵 P,其想要在 3D 空间中对准到参考矩阵 Q(相同大小)上:

用简单的方式陈述问题。下面的文本和代码描述了箭头的内容。卢西亚诺·阿布利亚塔。

主要步骤是:

1。将 P 居中于(0,0,0),本质上是“从每个元素中减去整列的平均值”。那很简单。

2。Q 也是一样,保存你减去的三个平均值,因为你在最后会用到它们。

3。根据某种度量计算使 P(以 0 为中心)尽可能接近 Q(也以 0 为中心)的最佳旋转矩阵,然后对 P 进行旋转。在 Kabsch 的方法中,该度量包括最小化 Q 和旋转后的 P 之间的 RMSD

4。将旋转后的 P 偏移到原始 Q 所在的空间区域,只需添加第 2 步中保存的 x、y 和 z 的平均值即可。也容易。

因此,最难的部分是第二步:给定两组点 P 和 Q,每组都以(0,0,0)为中心,如何将 P 旋转到 Q 上以最小化产生的 RMSD?嗯步骤是:

1。把 Q 的转置乘以 p,我们把得到的矩阵叫做 H:

H =乘法(转置(Q),P)

2。计算 H 的奇异值分解,保留第一个和第三个矩阵,在代数库中可用的大部分例程中常称为 U 和 V。重要提示:验证您使用的 SVD 程序是否给出了转置矩阵。大多数程序给你转置的形式,所以我称之为 Vt:

[U,S,Vt]= SVD(H);→我们将使用 U 和 Vt

3。旋转矩阵 R 等于这个 Vt(或 V 的转置,如果 SVF 程序没有给出转置矩阵)乘以 U 矩阵的转置:

var R = multiply(Vt,转置(U));

实际上,为了正确起见,您需要通过一个单位矩阵来缩放 U 的转置,如果 V x Ut 的行列式为负,则该单位矩阵的最后一个 1 被交换为-1:

var R = multiply(Vt,multiply(eyematrixcorrectedifredentintwasnegypt,transpose(U));

但这很少适用于分子,事实上我们的软件中也不需要它。

4。最后,要得到旋转后的 P,你需要将 P 乘以旋转矩阵 R:

var Protated = multiply(P,R);

请记住,在程序开始时,在最后将旋转 P 的所有元素移动到 Q 的平均 x、y 和 z 值。在 moleculARweb 中,Q 通过构造固有地以(0,0,0)为中心,因此旋转的 P 不需要平移。

总结:先平移,然后按描述旋转。卢西亚诺·阿布利亚塔。

JavaScript 代码

有时候代码比解释更容易理解……让我们看看这一切在 JavaScript 中是如何进行的。

假设 P 和 Q 已经以(0,0,0)为中心,计算和应用旋转的 JavaScript 代码非常简单:

var H = multiply(transpose(Q), P);var svdH = SVDJS.SVD(H);var R = multiply(svdH.v, transpose(svdH.u));var Protated = multiply(P, R);

注意,这里使用了两个硬编码的函数:

function multiply(a, b) {
  var aNumRows = a.length,
    aNumCols = a[0].length,
    bNumRows = b.length,
    bNumCols = b[0].length,
    m = new Array(aNumRows); // initialize array of rows
  for (var r = 0; r < aNumRows; ++r) {
    m[r] = new Array(bNumCols); // initialize the current row
    for (var c = 0; c < bNumCols; ++c) {
      m[r][c] = 0; // initialize the current cell
      for (var i = 0; i < aNumCols; ++i) {
        m[r][c] += a[r][i] * b[i][c];
      }
    }
  }
  return m;
}

function transpose(matrix) {
  return matrix[0].map((col, i) => matrix.map((row) => row[i]));
}

还有来自 SVDJS 的 SVD 例程,来源于 svd-js 库中的 HTML,包含:

<script src=”[/lib/svd-js.min.js](https://molecularweb.epfl.ch/lib/svd-js.min.js)”></script>

https://www.npmjs.com/package/svd-js

进一步阅读

  • 解释这一过程的原始参考文献见 Kabsch 1976 年在《晶体学报:

http://scripts.iucr.org/cgi-bin/paper?S0567739476001873

  • 要了解更多关于奇异值分解的知识,奇异值分解是 Kabsch 算法和许多其他计算(如主成分分析)的核心,请参见 Reza Bagheri 的文章:
  • 要了解 moleculARweb 的 VMK 如何使用这些代码(消除扩散并突出内部分子动力学),请打开该页面并查看其源代码,然后访问 main.js 并向下滚动,查找类似于 svd 的单词:

https://molecular web . epfl . ch/modules/virtual-modeling-kit-2/index . html

  • 要了解更多关于 moleculARweb 在浏览器中查看增强现实中的分子的应用程序,请查看:

https://lucianosphere.medium.com/how-to-load-any-molecule-for-display-in-augmented-reality-on-molecularweb-5da0af4b64b2

我是一个自然、科学、技术、编程和 DIY 爱好者。生物技术专家和化学家,在潮湿的实验室和电脑前。我写我广泛兴趣范围内的一切。查看我的 列表 了解更多故事。 成为中等会员 访问其所有故事和 订阅获取我的新故事 通过电子邮件 (我为其获得小额收入的平台的原始附属链接,无需向您支付特殊费用)。https://lucianoabriata.altervista.org/office/donations.html通过各种方式捐赠到这里。 联系我这里的 进行任何种类的询问。

咨询关于小工作 (关于编程、biotech+bio info 项目评估、科学推广+交流、分子数据分析与设计、分子图形学、摄影、私人课程与教程、私人课程、教学与辅导等。)查看我的 服务页面这里

机器学习中处理连续变量的决定性方法

原文:https://towardsdatascience.com/the-definitive-way-to-deal-with-continuous-variables-in-machine-learning-edb5472a2538?source=collection_archive---------5-----------------------

统计方法和工程学的结合是关键。让我们看看 KBinsDiscretizer 为什么以及如何成为 ML 工程师的朋友。

图片由来自 Unsplash.comPawel Czerwinski 拍摄

数据分析可以看作是一个装置(或者说是一个黑匣子;或者一个中文教室,给定一些输入,提供输出。基于规则和基于统计(又名机器学习)的主要区别在于,前者接受训练示例和规则(“算法”)作为输入,给出预测作为输出,而后者期望训练示例和标签作为输入,给出规则作为输出。也就是说,在机器学习中,规则是从输入数据和标签之间的关系中推断出来的,而在经典方法中,规则是预先确定的,通常由人类花费数年时间试图弄清楚它们。这种差异并不像人们想象的那样微妙:例如,在科学中,这些规则通常被编码在程序中,这些程序模拟被研究的物理系统(例如地球的气候粒子之间的相互作用)。另一方面,如果事先不知道这些规则是预先存在的理论框架,另一种选择可能是唯一有意义的选择。值得一提的是,在一些值得注意的案例中,如蛋白质折叠,一种称为 AlphaFold 的机器学习方法被证明至少与更传统的方法一样成功,开启了新的令人兴奋的可能性

关注机器学习方法,一个非常常见的问题是如何处理异构数据。在大多数情况下,最终得到的输入集合要么是分类的标签(例如猫/狗/鱼,雇佣/解雇)并且可能是互斥的,要么是连续的 ( 例如薪水、温度、距离、身高、体重……)。如果你认为这两个群体由于其固有的性质必须以不同的方式对待,请三思或继续阅读。

首先,让我们简单回顾一下分类输入是如何处理的。最直接的方法是给每个类别贴上一个数字(整数)标签,例如dog = 1``cat = 2fish = 3。虽然这个在原则上可能起作用,但在实践中众所周知的是,统计模型(以下简称模型)可能会发现一个虚构的模式,因为例如 fish > dog(因为3 > 1),这不太可能有任何意义。为了避免这样的问题,通常建议使用一键编码。在这种方法中,每个类别由一个包含 N 个元素(其中 N =类别数)的向量表示,除了位于对应于给定类别的索引处的 1 之外,这些元素都是 0 的。在我们的例子中dog = (1,0,0)cat = (0,1,0)fish = (0,0,1)。在这种情况下,您需要将分类特征扩展为 N 二元特征(如果“虚拟变量陷阱”或“多重共线性”可能是所考虑问题中的一个问题,则扩展为 N-1)。然而,这并不是故事的结尾。这些指数将在查找表中使用,这些元素将由模型进一步处理,以匹配训练期间呈现的输出。如果您不熟悉这个概念,查找表是一个 NxM 矩阵,其中行数与类别数 N 相匹配,并且 M 列跨越一个通常称为向量嵌入空间的参数空间。查找表被称为嵌入矩阵。例如,如果矩阵是:

A = [
     [0.1, -0.2, 0.3], 
     [-0.2, 0.3, 0.1],
     [0.7, -0.4, -0.2]
]

那么 cat 的矢量嵌入就是(-0.2, 0.3, 0.1)。简而言之,该过程将稀疏分类转换为密集表示,可以根据数据的性质,通过递归卷积神经网络对其进行进一步的数值处理,例如。至于嵌入矩阵本身,要么是在训练时学习的,要么是通过其他方式在别处计算的(这里说的是 预训练 )。

现在,让我们回到我们最初的连续变量问题。如果你的模型是基于决策树的,那么你可能不需要任何操作就能很好地完成。如果模型是基于神经网络,事情就不那么清楚了。一般来说,神经网络不喜欢非标准化数字数据是常识,因此某种标准化是合适的。具体做什么是一个讨论的问题,通常取决于许多因素。

首先,可以简单地将输入特征缩放(“最小-最大缩放”或“归一化”)到一个固定的范围,通常是(0,1),然后将其向下游发送到模型的其余部分:

标准化公式。图片作者。

这是一种简单的方法,其主要缺点是,如果分布在整个范围内不均匀,它会将所有内容压缩到一个狭窄的范围内。很多时候,手册推荐另一个通常被称为标准化的程序,该程序需要减去分布的平均值并除以标准偏差:

标准化公式。图片作者。

为了使这个过程有意义,数据必须粗略地分布为高斯分布。在下面的例子中,假设的特征 a 可以被成功地规范化或标准化,但是特征 b 更有可能出现问题。

连续分布的两个例子。a)大致为高斯型,而 b)大致为指数型。图片作者。

还有一个方面必须考虑。一些特征可能是非负的,或者被限制在给定值以下,但是在其他情况下是无界的(例如薪金)。其他的可能是双向无界的(例如向左或向右的距离),或者甚至呈现围绕 0 的对称性(如许多三角函数)。此外,训练数据在极端情况下可能没有足够数量的示例,因此缩放参数(平均值、最小值/最大值、标准值)可能不能代表较大的总体。推理时出现的任何异常值都不会被正确处理,可能会导致意外的行为或令人困惑的结果(对于X > XmaxX’>1)。

一个规则来统治他们

我相信有一种强大的方法来标准化数据,这并不新鲜,但由于某种原因,在讨论这个话题时很少提到它。这些是步骤:

  1. 将数据汇集到 N 个箱中,以构建特征的直方图。如果训练数据量允许,通过计算分布的分位数找到最优边界(在这种情况下,仓将被不均匀地隔开);
  2. 用条柱索引替换输入特征,并将其视为分类输入()该值对应于哪个条柱?);
  3. 使用查找表来提取每个箱的密集矢量嵌入;
  4. 通过矢量嵌入下游。

如果您遵循这些简单的规则,那么输入要素是否具有不同的范围(例如工资和离工作地点的距离)、异常值不会导致无效输出并且不同要素之间的相关性在很大程度上得以保留。此外,直方图比数值更稳健还有一个理论上的动机。在现实生活中,连续输入特征是测量的结果,原则上伴随着不确定性,但为了简单起见,这一方面通常被忽略。即使事实并非如此(想想薪水),直觉上,无论如何将投入分成不同的类别可能更有意义(例如低收入对高收入)。还值得一提的是该方法的扩展,其中用函数形式(例如多项式或指数)拟合分布,然后使用拟合函数的分位数代替直方图。最后,通过这种方法,回归任务变成了分类任务:通过量化目标分布,游戏的名称是识别相应的 bin 而不是“精确的”数值。你可能听说过所有的分类问题实际上都是带有离散目标变量的回归问题,这当然是真的。但它的对立面也是如此。

好消息是:在 scikit-learn 库中有一个 KBinsDiscretizer 类,它实现了上面讨论的大部分内容。

使用 TensorFlow 2.x 实现

为了让事情更清楚,我准备了一个基于 TensorFlow 2.x 的量化特征嵌入层的简单实现。要进行全面的测试,请随意使用这款 Google Colab 笔记本

首先,您需要量化输入要素。我强烈建议使用来自scikit-learnKBinsDiscretizer类,但是同样的过程可以通过使用numpy.quantile函数重新创建。

输入要素可能如下所示:

原始输入特征。图片作者。

在对每个特征用 5 个箱进行量化之后,我们得到这样的结果:

量化输入特征。图片作者。

此时,我们需要从 TensorFlow / Keras 创建一个[Embedding](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding)层的扩展。在最初的实现中,嵌入矩阵是由令牌 id 索引的 2D 对象。在我们的例子中,我们需要一个额外的维度索引,这是嵌入所涉及的特征,所以总的来说这是一个 3D 张量。幸运的是,gather_nd函数允许我们使用 2D 张量索引从 3D 张量中选择条目。这听起来很复杂,但实际上并不复杂:它所做的只是选择嵌入在 2D 查找表中的向量,该查找表由(特征 id,令牌 id)索引:

您可以像使用常规嵌入层一样使用该层,例如:

用 100 个时期的每个特征 5 个箱来训练模型产生可接受的结果,在损失中有一些过度拟合的迹象,但是考虑到我们没有进行任何优化,仍然处于合理的水平。最终(稀疏)准确率在 65%左右。

每个特征有 5 个箱的模型的稀疏分类损失。图片作者。

每个特征有 5 个箱的模型的稀疏分类精度。图片作者。

此时,如果您想将预测的 bin 转换为实际数字(在本例中为房价),您可以在 bin 的边界内抛出一个随机数(均匀或高斯),或者只提供平均值(bin 中心)。我们可以说,容器越多,最终预测就越准确,但是您还需要更多的训练示例来拟合更多的参数。

总而言之,特征量化(或离散化)是一种技术,它允许人们以一致的方式操纵连续的和可能无界的输入,并将回归问题转化为分类问题。

关于生成模型的最后一句话:我本人参与了一个项目,开发了一个 GAN 来模拟大型强子对撞机[ JHEP08(2019)110 ]上粒子之间的相互作用,其中一些输入特征跨越几个数量级,一些仅是正的但无界的,其他的是有界的并显示轴对称。当时,我并不知道这种技术。事后看来,特征量化可以省去我们许多思考和麻烦。同样,我怀疑这种方法对自动编码器有用。

Spark 3.0 中确定的数组排序方式

原文:https://towardsdatascience.com/the-definitive-way-to-sort-arrays-in-spark-1224f5529961?source=collection_archive---------11-----------------------

Spark 3.0 中数组排序技术的差异

去年早些时候(2020 年)我有对一个数组排序的需求,我发现有两个函数,名字非常相似,但是功能不同。

分别是 array_sortsort_array。

用哪个?起初,我感到困惑,为什么会有两个功能做同样的事情?

嗯,不同的是array_sort:

**def array_sort(e: Column):***Sorts the input array in* ***ascending*** *order and* ***null*** *elements will be placed at the* ***end*** *of the returned array.*

sort_array:

**def sort_array(e: Column, asc: Boolean)***Sorts the input array for the given column in* ***ascending*** *or* ***descending*** *order elements.* ***Null*** *elements will be placed at the* ***beginning*** *of the returned array in* ***ascending*** *order or at the* ***end*** *of the returned array in* ***descending*** *order.*

看到这一点后,我决定打开一个拉请求来统一仅在array_sort中的这种行为,但是在与提交者讨论后,他们决定添加一种给定比较器函数的数组排序方法,以匹配 Presto 数组函数,这将是一个好主意。

显然,这比最初统一两个功能行为的想法要困难得多,但是在提交者/评审者的帮助下,两者合并了。

历史讲够了,让我们看看新的array_sort在 Spark 3.0 中是如何工作的

它接收一个比较器函数,在这个函数中你将定义用于比较数组元素的逻辑。

那又怎样?

当您想要使用自定义逻辑对数组进行排序,或者比较选择排序中要使用的字段的结构数组时,比较器非常强大。

好吧,但是怎么做?

让我们用一组结构来定义我们的数据帧

case class Person(name: String, age: Int)val df = Seq(Array(
Person(“andrew”, 23), Person(“juan”,28), Person(“peter”, 22))
).toDF

如果我们打印模式并显示内容:

> df.printSchema
root
 |-- value: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- age: integer (nullable = false)> df.show(false)
+---------------------------------------+
|value                                  |
+---------------------------------------+
|[[andrew, 23], [juan, 28], [peter, 22]]|
+---------------------------------------+

现在,让我们使用名称列对数据帧进行排序:

df.withColumn("arr_sorted", 
expr("array_sort(value,(l, r) -> case when l.name > r.name then -1 when l.name < r.name then 1 else 0 end)"))

现在让我们看看内容

+---------------------------------------+
|arr_sorted                             |
+---------------------------------------+
|[[peter, 22], [juan, 28], [andrew, 23]]|
+---------------------------------------+

不错!我们得到了按名称排序的数组!

还有别的方法吗?

是啊!您可以通过在比较器逻辑中注册一个 UDF 来更好地编程。

什么?

好的,假设现在你想按名称长度对数组进行排序,那么你应该这样做:

spark.udf.register("fStringLength", (x: Person, y: Person) => {
  if (x.name.length < y.name.length) -1
  else if (x.name.length == y.name.length) 0
  else 1
})

然后,给 UDF 打电话

df.selectExpr(“array_sort(value, (x, y) -> fStringLength(x, y)) as arr_sorted”).show(false)

这就对了。按名称长度排序的数组

+---------------------------------------+
|arr_sorted                             |
+---------------------------------------+
|[[juan, 28], [peter, 22], [andrew, 23]]|
+---------------------------------------+

希望新的array_sort看完帖子更清楚,绝对是 Spark 3.0 的强大功能

结论

Spark 中有多种方法对数组进行排序,新函数为复杂数组的排序带来了新的可能性。

2021 年 Julia 编程语言面临的令人沮丧的挑战

原文:https://towardsdatascience.com/the-depressing-challenges-facing-the-julia-programming-language-in-2021-34c748968ab7?source=collection_archive---------3-----------------------

Julia 要在 2021 年末取得数据科学优势需要克服的障碍。

(src =https://pixabay.com/images/id-1447233/

介绍

最近,在精彩的编程世界中,Julia 编程语言已经成为一个相当有趣的对象,在我看来,这是有充分理由的。朱莉娅有很多其他语言所没有的可爱之处。然而,没有一种编程语言是没有问题的,而且作为数据科学领域的新手,Julia 需要克服许多不同的挑战,才能真正进入这个行业。

在我们深入研究 Julia 的问题以及这种语言目前存在的某些问题之前,让我们先来了解一下为什么这种语言值得使用和保存。首先,之前已经有人提出,所有的编程语言范例都已经被创建和使用,但是 Julia 证明事实并非如此。在我们深入 Julia 的范式之前,让我们首先简单地提醒自己什么是范式。编程范例只是一个用于类型和方法相互交互的系统。实际上,我有一整篇关于编程范例的文章,更深入一点,差不多有一年了,您可以在这里阅读:

Julia 采用了编程范式的概念,并以通用编程概念多任务分派为中心。多重分派起源于 80 年代的一种叫做 ML 的小型函数式编程语言。虽然语言本身肯定没有在市场上引起巨大的轰动,但是在代码库中构思的一些天才的想法当然已经在各种各样的现代多范例应用程序中得到了充分的考虑。这就把我们带回到了 Julia,它把多分派和参数多态性泛型编程概念带到了一个全新的水平。Julia 驻留在它自己的新范例中,这个范例是用这种语言构想出来的,即多重分派范例。

坦率地说,Julia 开发人员想出的所有使用多重分派的好主意,比如内部和外部构造函数,以及抽象类型层次结构,都值得单独写一篇文章。然而,考虑到所有这些有趣的特性,Julia 是一种非常独特的编程语言。对我来说,主观上,多重分派感觉是一种非常自然和直观的编程方式。使用更像我们正在使用的类型的属性的方法,使用可以根据传递给它们的类型完全改变它们所做的事情的调用,感觉就像是最自然的编程方法。

除了是一种写起来很棒的语言之外,Julia 很快——真的很快。Julia 经常落后于 C 和 Rust 等低级语言,但写起来仍然简单得可笑。这是老掉牙的格言将再次露出其丑陋的头的地方,最好是最后一次…

"走路像 Python,跑步像 c . "

你当然可以理解为什么选择这句格言。Julia 代码看起来与 Python 非常相似,而且非常容易使用。更好的是,代码在大多数情况下运行速度几乎和 C 一样快,但为什么这句格言很奇怪?因为 Julia 驻留在与 Python 完全不同的编程范式中,当然!不管怎样,这句格言仍然有意义,可以给人一个很好的关于朱莉娅的想法。既然我们已经理解了为什么 Julia 在许多方面都是无可争议的,以及这种语言是关于什么的,那么让我们深入研究这种语言今年在努力保持其在多个科学学科中的相关性时所面临的一些问题。

生态系统

毫无疑问,影响 Julia 新用户和整个 Julia 社区的最大因素是 Julia 的生态系统。举例来说,虽然 Julia 确实有能力调用 Python,并且有许多来自该语言和其他语言的不同移植包,但在许多情况下,从 Julia 调用这些语言是很奇怪的。虽然 PyCall 和其他语言的类似编程接口往往编程良好,并且实际上能够很好地处理数据类型,但用 Python 而不是 Julia 运行代码破坏了使用 Julia 的初衷。最终,这些包会比在 Python 中运行得更慢,所以为什么你会以这种方式使用 Julia 是一个非常奇怪的问题。

如果我要说出一些机器学习包的名字,我会推荐某人在 Julia 中使用,老实说,我很难提供可靠的例子。尽管如此,我还是会尽力为数据科学的每个部分提供一些我个人喜欢使用的优秀包。说到机器学习,对于神经网络,我肯定会推荐 Flux 库。Flux 库实际上非常健壮,并且已经开发了一段时间。

另一个你应该研究的伟大的库是车床,我是它的创造者。车床包括一些很好的机器学习模型,可能会派上用场,更多即将推出。然而,随着下一个长期不中断版本的发布,该包的最大焦点是预处理。在 Julia 中,真的没有那么好的预处理工具,编码器,缩放器,甚至训练-测试-分割函数或对象都很难得到。也就是说,车床包括所有这些,以及一个流水线接口。坦率地说,有很多工作要做,尤其是在一致性和文档部门。然而,随着 0.2.0 的发布,这种情况将在几周内得到改变,这将是软件包功能的一个重大进步。除了车床和通量,我会推荐 Knet 和 GLM。这里是我刚才提到的所有包的链接。GLM 是一个广义线性模型库,而 Knet 是一个鲁棒性较差的神经网络框架。

https://github.com/JuliaStats/GLM.jl https://github.com/ChifiSource/Lathe.jl https://github.com/denizyuret/Knet.jl

我也有关于车床和 Flux 的介绍性文章,可以帮助你入门,如果你对 Julia 感兴趣,但不知道从哪里开始,我强烈推荐你。Flux 教程将介绍如何使用 Flux 创建图像分类器,而 Lathe 教程将带您完成预处理、编码和装配随机森林分类器,然后使用 Ubuntu 和 NGINX 构建、序列化甚至部署——这当然是一个简明的教程。

https://medium.com/chifi-media/radical-julia-pipelines-5afccc75a061 [## 激进的朱莉娅·皮普勒斯!

medium.com](https://medium.com/chifi-media/radical-julia-pipelines-5afccc75a061)

在生态系统方面,让我们考虑一下统计数据。Julia 有一个相当强大和成熟的统计生态系统,实际上我认为大多数开发人员都不会觉得有问题。这个生态系统的唯一问题是,它会有一点分割,你可以预期为一个项目添加许多依赖项,这可能需要大量的测试等等。更进一步,这些统计包不一定是针对数据科学的,但是,Lathe 确实有一个较小的统计库,当涉及到数据科学友好的统计时,它有一些很好的功能来处理数据。这些软件包是 StatsBase,Statistics,Distributions,Lathe 等等。问题的一部分是我提到的,包无处不在,经常互相依赖。我认为这实际上很成问题的部分原因是 Julia 确实有一个叫做预编译的东西,其中包和它们各自的依赖项被预先编译——当每个包有 20 个依赖项要预编译时,这会导致语言中一些非常可怕的启动到执行时间。这实际上是 Julia 用户的一大抱怨,尤其是那些语言新手。

我认为问题在于朱莉娅有一个很棒的打字和扩展系统。使用不同的模块来扩展某个模块的能力和类型是很容易的。这通常是在各种各样的包中完成的。就我个人而言,我一直是一个保持低依赖性的人!在 Julia 中,预编译时间有时非常荒谬。

回到生态系统的话题,我认为 Julia 已经很好地覆盖了数据科学的数据可视化部分。牛虻和 VegaLite 等出色的软件包在多维度显示数据方面做了令人惊叹的工作,有时还提供令人惊叹的交互式可视化,Julia 在绘图方面确实有一些出色的选择。当然还有 Plots.jl 包,它带有 GR 和 Matplotlib。然而,我认为尽管这是新手的必备工具,而且容易使用,但也是一个可怕的选择。预编译时间简直是荒谬的。视觉表现也很糟糕,第一个情节的时间也很糟糕。然而,除了这个列表中的其他两个包,我们还有 Plot.ly 进入该领域。由于这是一个数据科学博客和数据科学出版物,我怀疑我是否需要详细介绍 Plot.ly 到底是什么。这是我提到的所有我喜欢的包的链接。

https://github.com/GiovineItalia/Gadfly.jl https://github.com/queryverse/VegaLite.jl https://github.com/JuliaPlots/PlotlyJS.jl

我还有一篇文章比较了 Julia 的可视化选项,不包括 Plot.ly,因为这篇文章发表时它还没有发布:

最后,我们将转向可能是我最不喜欢的实现—数据管理。对于 Julia 中的数据管理,现在有一个典型的选项,data frames . JL。data frames . JL 是一个相当成熟的包,但在 Julia 中处理数据并不是非常成熟。这个包的部分问题是,它像我们接触过的许多其他包一样,与生态系统非常紧密地交织在一起。这意味着即时预编译时间很长,DataFrames.jl 的开发也相当缓慢,因为即使是最大的贡献者也在开发许多其他包,其中一些在 DataFrames.jl 的后端。

不用说,当谈到 DataFrames.jl 的许多依赖项时,DataFrames.jl 没有它们就无法前进。我还认为这个 API 使用起来有点乏味。当然,这是我的主观意见,我仍然喜欢这个包,但肯定有一些方式我想处理我的数据不同于 DataFrames.jl 处理它的方式。考虑到这一点,我实际上正在创建自己的 DataFrames 包 OddFrames.jl。虽然它仍处于早期版本,但我肯定会检查它,因为我最近在发布新版本的车床之前一直在努力,我计划在中包含对 OddFrames 的支持。对于感兴趣的人,这里有 DataFrames.jl 和 OddFrames.jl 的链接。可以把 OddFrames.jl 看作是一个类似熊猫的 API,在某些方面采用了一些 Julian 方法,还加入了一些独特的特性。它混合了典型的函数式编程和面向对象编程,以及一些索引技巧来获得一些非常有趣的结果!

https://github.com/ChifiSource/OddFrames.jl https://github.com/JuliaData/DataFrames.jl

此外,如果您对 DataFrames.jl 感兴趣,我有另一篇文章可以帮助您:

证明文件

Julia 软件的另一个重要问题是文档,有些人可能没有想到。有许多 Julia 包完全没有文档。当然,这使得 Julian 软件与由几个开发人员不断维护的具有高级文档的更成熟的选项相比,非常难以使用。许多在各种领域的语言中普遍使用的 Julian 包,不仅仅是数据科学,只由很少一部分人维护。

也就是说,在自动化文档方面,Julia 确实有一个相当酷的实现。有一个名为 Documenter.jl 的包,它会自动为您创建文档网页,不用说,这太棒了!然而,这也是问题的一部分,因为很容易用 auto-doc 简单地调用 Documenter.jl 而不做任何其他事情——这给包带来了许多问题,因为很难找到您可能实际需要使用的文档。当只使用自动化文档并且没有组织文档网页时,尤其如此。如果你想了解更多关于 Documenter.jl 的知识,你可以看看我在这里写的一篇关于它的文章(是的,我在这里已经建立了一个很有用的目录。):

哇,那是一年前的事了!

这种文档的另一个真正酷的地方是,自动化机器人既能生成它,又能提供页面。也就是说,这确实存在于美妙的朱莉娅·哈勃上。这是朱莉娅非常接近的事情之一,并且有许多非常酷的想法,但它们要么正在工作中,要么还没有完全实现。或者在许多情况下,没有充分利用他们的潜力。我有一整篇文章都在谈论朱莉娅·哈勃,以及它有多棒,我真的很喜欢写作——出于某种原因,我真的很喜欢我为它做的艺术作品。无论如何,你可以在这里查看:

这是为了什么?

我认为朱莉娅需要克服的最后一个困难就是找到自己在市场中的位置,从而获得巨大的成功。Julia Computing 明确表示,他们的目标不是取代 Python,而是与 Python 共存。然而,问题仍然存在,这到底意味着什么?正如我在本文中所表达的和过去测试过的,Julia 作为 Python 的后端并不是一个可行的选择。当我们考虑到 Python 与 C 语言有着密切的关系时,情况就更是如此了,C 语言作为后端语言往往运行得更快——坦率地说,虽然比 Python 和 Julia 更难,但它仍然不是一种很难编写的语言。

这就提出了一个问题,

“朱莉娅到底属于哪里?”

作为编程语言范式的个人爱好者,以及该语言的许多方面,我希望看到它成为我的领域(数据科学)中经常使用的语言。朱莉娅似乎在过去一两年中获得了动力,但似乎也在去年年底达到了顶峰。我们可以从 PYPL 指数中看到,Julia 在不如 Perl 受欢迎后,即将屈服于 Haskell。

https://pypl.github.io/PYPL.html

然而,了解这个行业——这些事情确实有起有落。也就是说,我确实认为这是语言生态系统改善的关键时刻。这种语言只需要更好的包,更好的文档,甚至更熟悉表达式。来到 Julia 这个奇怪的新世界是很痛苦的,不得不使用像

select!(df[!, Not(:B)])

从数据帧中删除一列。我的意思是这是一个非常朱利安的做法,但我认为那些来自世界各地的

df.drop()

可能会觉得这种令人困惑的事情令人不安。我认为朱莉娅在这方面需要有明确的方向感。如果目标是成为数据科学皇冠上的新宝石,那么我们必须建立一个生态系统来支持这样的事情。然而,如果目标是与 Python 一起工作,那么我们需要更健壮的 API 来实现。到目前为止,如果没有为 Julia 的未来开发新软件的目的,这种语言基本上只是一个能够做一些事情的话题。

结论

最后一段可能听起来很刺耳,但我只是担心。我真的很爱茱莉亚,也许你还没注意到。我喜欢它教给我的东西,我喜欢它的独特性和它自己令人敬畏的范式,我发现它具有难以置信的表现力。我喜欢这种感觉:语言永远不会碍事,而且我从来没有用其他语言写过任何东西。甚至当我写 Python 的时候,我发现自己有时会写 Julia,或者希望我现在正在写 Julia,这样我就可以做这个或那个来解决我正在处理的问题。

我从 2017 年开始使用 Julia,这是我在这门语言上大约四年的经验,我必须说——我肯定已经爱上它了。然而,我看不到这种语言或其生态系统的明确方向,这一事实让我真正感到不安。茱莉亚感觉就像是我的宝贝,它真的是我的第三代语言。你知道你如何到处编程,并最终找到一个?我曾经认为语言对我来说是 C++,但在进入 Julia 之后,我真正发现了我热爱的编程语言,Julia 当然就是这样。

如果你从事任何科学学科,或者甚至是通用程序员,我强烈建议给 Julia 一次机会。我相信每个程序员都应该努力从每种编程范式中学习至少一种编程语言。考虑到这一点,虽然 Julia 像许多其他现代编程语言一样,是多范式的,并利用了许多通用编程概念,但我认为它是在类似于 Python 的环境中学习函数式、系统化编程概念的一个很好的选择。非常感谢你看我的文章!请支持 Julia 的生态系统和语言,因为它确实是一个奇妙的——但仍然被低估了!祝您愉快!

事件商店的设计

原文:https://towardsdatascience.com/the-design-of-an-event-store-8c751c47db6f?source=collection_archive---------3-----------------------

理解大数据

超越事件采购之路

最近,“事件驱动架构”、“事件流处理”和“事件源”这两个主题引起了相当大的反响。虽然这些概念并不新鲜,但似乎直到现在,软件工程社区才开始意识到构建自治的、松散耦合的系统的能力和灵活性,这些系统能够智能地对事件做出反应,而不是被告知该做什么。

既然我们的行业已经赶上了事件驱动的潮流,我们中的一些人开始超越我们通常的构建模块——卡夫卡、脉冲星和 NATS 流——来解决长期持久性和智能检索事件的问题。当然,我们谈论的是一个活动商店

近似的定义

当考虑事件商店时,我们应该问自己的第一个问题是:什么是事件商店?

目前,事件存储的规范定义还不存在。对于事件存储应该做什么,每个人都有不同的理解,尽管大多数从业者已经同意,鉴于我们对这种架构范式的持续投资,一个容易查询、长期持久的事件记录存储可能是合适的。

“事件记录库”本身听起来很难令人信服。实际上,像这样简单的事情可以很容易地用数据库或者甚至是 Kafka 本身来完成。(就此而言,还有其他事件流平台。)表面上,从业者不会创造一个术语,除非它有自己的价值。因此,我们将注意力转向“可查询”部分。

我们知道使数据库强大的一点是它的查询能力。有很多方法可以查询事件。回想一下,事件是过去某个时间点发生的一些(大概)有趣行为的不可变记录。因此,首先,我们可能希望按时间范围查询事件记录。接下来,我们可能希望通过某些属性或关系来过滤事件。例如,“查找引用客户 X 和 Y 的事件”。

通过观察一系列离散的、按时间顺序排列的事件,我们可以准确地重建这些事件所适用的实体的状态。至少,我们应该能够重建它的可观测状态。(其中“可观察到的”意味着一个特征,其变化由伴随的事件记录充分描述。重构可观测状态是事件源的本质。如果一个事件商店以某种方式增加了制定事件源的能力,难道不是很方便吗?

想象一个复杂的事件存储库,它不仅保存事件记录,而且知道如何从它们中获得有形的状态。这给查询增加了一个新的维度;我们不仅可能对原始事件感兴趣,还可能对应用这些事件的衍生产品感兴趣——最终的实体状态。假设有一个事件存储,它聚集了金融交易——客户账户的借贷。可以想象,像“查找余额大于 X 的所有客户”这样的查询确实非常引人注目。同样吸引人的可能是诸如“在时间 T 获得客户 X 的状态”的查询。

事件存储交互的心理模型

在上图的基础上,下图展示了与事件存储交互的概念性思维模型,描述了一些常见的用例。

与假设事件存储库交互的心理模型。[图片由作者提供]

上面的模型引入了一个全新的用例——一个之前没有讨论过的用例。到目前为止,查询都采用请求-响应的交互方式,其中查询在有限的时间内完成。但是,我们在这里处理的是事件,事件随时都有可能发生!本着事件驱动架构的精神,我们添加了另一个用例——连续查询。连续查询像常规的有界查询一样开始,返回包含那些在查询提交时匹配查询谓词的事件(和实体)的响应。不同之处在于,连续查询在返回其初始答案集时不会终止,而是提供满足查询谓词的附加答案,直到客户端显式关闭查询。

我们也没有谈到事件如何进入事件存储。在传统的数据库中,可以使用一个INSERT语句来填充记录,使用一个UPDATE语句来修改记录。根据他们的定义,事件是不可改变的——它们准确地描述了过去发生的事情,历史(令我们非常遗憾)是无法改变的。事实上,对于活动商店来说,没有一个类似于UPDATE的声明。当然,实体状态可能会被更新,但是只能作为插入到存储中的事件的直接结果。

事件记录进入事件存储有两种方式:

  1. 推送方法,其中我们显式地将记录保存到事件存储中。这直接相当于一个INSERT语句。
  2. 事件存储可能从事件流中提取记录。这种方法体现了事件驱动架构背后的“反应式”哲学。

卡夫卡——事件商店的候选者?

现在我们对什么是事件存储有了一个大概的了解,下一个逻辑问题可能是:【Kafka 可以用作事件存储吗?

TL;博士:卡夫卡不是事件店;更确切地说,它是构建事件存储的推动者。

对于最琐碎的用例,Kafka 对无限保留的支持,结合每个实体的记录键控、墓碑和主题压缩,可以用来构建一个非常基本的事件存储。此外, KIP-405 目前正在考虑的分层存储功能突然意味着我们可以像老板一样自信地围绕大数据等术语开玩笑。压缩保留了记录消费的传统语义,并允许适度有效的记录重放,以从压缩的主题中重新构建状态快照。这就是事件源排序。但综合考虑所有因素,称 Kafka 为一般情况下的事件存储有点牵强:它没有将离散事件映射到持久实体,也没有提供什么查询方式。例如,如果不处理整个流,我们就无法查找特定的实体。这是为什么呢?

Kafka 是一个事件流平台,围绕精细事件的捕获和这些事件在多样化的消费者生态系统中的有效分发进行了优化。有效形容词是高效;Kafka 以惊人的速度移动数据,并支持大量连接的应用程序,但为了实现这一点,它做出了几项故意的设计妥协。我已经在本文中详细描述了它们,但是它们还是值得一提的。两个最相关的是(1)它的存储子系统的组织和(2)客户和经纪人之间不均衡的劳动分工。

在第一点上,Kafka 以一种简单的、日志结构的方式对事件数据进行排序,使用只附加日志段来实现记录持久性。自然,有一个主键的概念——记录的偏移量。还有一个不太为人所知且很少使用的非唯一二级索引—记录的时间戳 —消费者客户端可以使用它来查找日志中的特定位置。除了时间戳索引之外,Kafka 没有用户可定义的二级索引的概念,这种索引可能有助于对关系数据库或 NoSQL 数据库自由执行的范围和谓词查询。

注: 卡夫卡日志是否真实 append-only 看你问谁了。从生产者的角度来看,日志是仅附加的,因为它不能直接删除或修改现有记录。但是经纪人可以。作为制定保留和压缩策略的一部分,它可以修剪日志,甚至删除单个记录。

关于第二点,Kafka 经纪人将超过公平份额的加工委托给客户——生产者和消费者。这包括在累加器中暂存记录、散列记录键以获得正确的分区索引、对记录进行校验和以及压缩记录批次。相反的情况发生在消费者身上。当数据到达代理时,它处于适合立即持久化的状态,代理只需要很少或不需要额外的处理。正是这种优化使零拷贝(无处理器 I/O)成为可能,并赋予 Kafka 其著名的吞吐量。

上面提到的设计决定意味着 Kafka 本质上是为低级记录流而优化的。Kafka 不仅缺乏成熟的事件存储所需的数据转换和索引功能,而且这些功能也极不可能被引入。(这样做会使第一点变得非常复杂,并与第二点相矛盾,这将与卡夫卡标志性的以表现为中心的品质相矛盾。)此外,在 Kafka 之上,其他框架已经做了一些这样的工作。言外之意:卡夫卡今天不是一个事件商店,将来也不太可能成为。

尽管听起来很可怕,但这不一定是件坏事。Kafka 没有强迫我们进入一个通用的现成事件存储库并相应地扭曲我们的应用程序架构,而是提供了我们需要的所有工具来实现一个根据我们的特定需求定制的事件存储库。从长远来看,这种方法可能会带来更好的结果,但它也不是没有代价的——上市时间是最显著的代价。我见过许多基于 Kafka 构建的定制的事件驱动系统,它们从长远来看非常成功。(我也见过一些其他类型的例子。)

考虑一个活动商店

所以,如果卡夫卡不是,那什么是?我们是否应该挑选一个 GitHub 明星最多的现成“活动商店”包,并让它发挥作用?

注: 根据经验,无论出现什么问题,SAP 或 Oracle 总会向您提供一个令人放心的昂贵解决方案,并附带一份强制性的百万人年支持合同。出于对理性的尊重,我们还是解除这个选项吧。开源,自己开发,两者都有,或者什么都没有。

评估活动商店(现成的解决方案或定制的设计)时,最好从您的业务和技术需求入手,特别要注意非功能性。

  1. 您需要您的可查询投影有多细粒度?粗粒度的投影是否足够,或者是否需要子实体查询?
  2. 数据将如何被消费?您期望同步请求-响应风格的访问模式,还是应该(近乎)实时地将数据推送给其消费者?后者的一个例子是连续查询,它实际上是一个谓词驱动的订阅模型,向客户端交付一系列更新。
  3. 一个实体的最新状态是否足够,还是需要一个完整的突变历史?留任会受到限制吗?如果是,是按年限还是按消耗的存储空间?
  4. 您将查询主键还是其他属性(包括元数据)?这些数据可以进行内容搜索吗?您需要地理空间索引吗?
  5. 针对以上观点,数据是结构化的还是半结构化的?您将支持数据迁移和重新索引吗?(提示:答案几乎总是‘是’,即使一开始看起来可能不是这样。)
  6. 您是否需要具有时间点和日期范围查询的突变的时间序列视图?需要开窗和聚合吗?
  7. 你会使用流连接操作符吗?(来自多个流的更新被合并,很像关系数据库连接。)
  8. 事件是独立的,还是要从多个外部数据源中丰富投影数据?如果这些资源不可用,会发生什么?
  9. 实体会用简单的“补丁”逻辑重新构建,还是需要复杂的地图简化功能来构建投影?
  10. 需要考虑数据的时间价值。实体是否无限期保留?您需要对失效的数据进行垃圾收集吗?
  11. 您需要归档功能还是存储分层?(存储分层是将不经常访问的数据重新定位到较慢的 I/O 设备,以扩展容量,同时限制成本。)
  12. 应该从一开始就考虑数据一致性模型,因为一致性保证是由基本设计决策支持的,这些决策很难(理解为:昂贵)逆转。连续读取应该是单调的吗?读取应该观察前面的写入吗?因果顺序是否足够,或者是否需要更强的顺序保证(例如 FIFO)?您将如何处理一个实体内的并发更新和原子性,以及跨多个实体的粗粒度事件?需要事务隔离和序列化语义吗?
  13. 错误应该被容忍吗?更重要的是,哪些错误应该被容忍,代价是什么?例如,系统应该如何响应网络分区:应该牺牲可用性还是一致性?(如果你还不熟悉 CAP 定理,现在是个好时机。)
  14. 您的组织中是否有具体的信息安全政策来约束数据的获取、处理、存储和向利益相关方展示的方式?断然的“不”很少是答案;即使您的组织缺乏专门的信息安全职能,最终也会有一个负责任的利益相关者充当事实上的数据保管人。
  15. 您是希望有一个相当稳定的负载分布,还是希望系统能够弹性伸缩以适应变化的负载?在这方面,事件驱动的系统往往能力很强,尤其是围绕 CQRS 和事件源模式构建的应用程序,其中产生的预测遵循单个写入者原则。也就是说,以数据为中心的系统总是受到 I/O 的限制,任何数据存储都不能无限扩展。此外,可伸缩性不是免费的,并且通常要与其他非功能性进行权衡;比如一致性。一个可线性化的系统可以利用少得多的优化,并且比一个满足最终一致性的系统受到更多的约束。一个讲技术的高管会多次兜售“无限可伸缩性”议程,而没有对这意味着什么的基本理解;小心以这个坑为家的蛇。
  16. 当您系统(或部分系统)出现故障时,您的恢复时间目标是什么?您希望系统通过冗余来解决故障,并在故障节点停止的地方继续处理吗?或者,您会容忍系统通过重放事件来重建故障前的状态吗?

这不是一个完整的列表,但足以说明问题的广度。无论是现成的解决方案还是定制的解决方案都不可能单独满足您的所有需求,尤其是考虑到上面概述的一些非功能性需求是相互排斥的。例如,一致性总是以可用性为代价,而我们对此无能为力。

通常的嫌疑人

虽然我们对活动商店的要求可能是定制的,但这并不意味着我们的问题不能用现成的解决方案来解决。根据个人需要,一些开源软件包可能符合要求。一个很好的例子是 ksqlDB :一个流处理框架,带有一个持久化和查询层,是为 Kafka 设计的。ksqlDB 允许您从原始事件流构建持久的投影。(ksqlDB 以前叫 KSQL。)您可以使用熟悉的类似 SQL 的语法查询这些投影,就像您通常使用关系数据库一样。它还允许您运行连续的查询,当查询结果到达时,就会推送到客户端。下图概述了 ksqlDB 架构和核心组件。

ksqlDB 架构和核心组件。[图片由作者提供]

关键组件包括:

  • ksqlDB 引擎:执行 SQL 语句和查询。通过编写 SQL 语句来定义应用程序逻辑,引擎在可用的 ksqlDB 服务器上构建并运行应用程序。每个 ksqlDB 服务器实例运行一个 ksqlDB 引擎。在底层,引擎解析您的 SQL 语句并构建相应的 Kafka Streams 拓扑。
  • ksqlDB CLI :为 ksqlDB 引擎提供一个带有命令行界面的控制台。使用 ksqlDB CLI 与 ksqlDB 服务器实例进行交互,并开发您的流应用程序。ksqlDB CLI 旨在为关系数据库(如 MySQL 和 Postgres)的用户所熟悉。
  • REST 接口:支持从任何 REST 客户端与 ksqlDB 引擎进行通信,包括 CLI。合流控制中心附带的 ksqlDB UI 也通过 REST 接口与 ksqlDB 交互。

当您部署 ksqlDB 应用程序时,它运行在相互独立的 ksqlDB 服务器实例上,可以容忍故障,并随着负载而扩展。

正如您所料,ksqlDB 并非没有局限性;其中一些相当值得注意。例如,您不能通过查询外部源来创建丰富事件的规则,也不能查询特定实体的事件历史。它也不支持状态快照(列表中的点# 16)—节点故障可能需要相当长的时间来修复

Kafka Streams 是 Kafka 的事实上的流处理库,与 Java 客户端库一起发布。它嵌入到 Java(或任何基于 JVM 的)应用程序中,负责传统的 map-reduce 风格的事件流处理。它为您提供了一个标准的 DSL,用于描述处理阶段和到您选择的接收器的流输出。碰巧的是,ksqlDB 是使用 Kafka 流构建的。Kafka Streams 在堆栈中的位置比 ksqlDB 低。后者是一个完整的产品,而前者是一个库。Kafka Streams 可以很好地补充 Kafka,以开发一个事件商店。Kafka、Kafka Streams 和 ksqlDB 之间的关系概述如下。

卡夫卡、卡夫卡流和 ksqlDB 的关系。[图片由作者提供]

我们可以继续。Kafka 兼容的流处理平台令人印象深刻,包括 Apache Flink、Spark 和整个 Hadoop 生态系统。它们可能是你工具箱里的好东西,但归根结底,它们只是工具。

设计事件存储的最佳方式是从外部查询需求开始,一直到持久层。从 API 和查询 DSL、聚合层、数据库和索引、事件消费和丰富开始。在你决策过程中的每一点都要持续关注非功能性。例如,如果您需要严格形式的一致性,那么面对网络分区,您可能会被排除在某些支持可用性的 NoSQL 数据库之外。

参考设计

一旦需求达成一致,所有不明确的地方都解决了,我们就需要开始设计我们的事件存储。虽然没有一个“放之四海而皆准”的设计可以让我们轻松采用,但架构师偶尔会求助于参考模型(或参考架构)来帮助引导设计过程的剩余部分。从本质上讲,参考模型是一种元设计,可以用来播种具体的设计。我们首先采用参考模型,丢弃不必要的部分,并根据我们的需要修改剩余部分。

下图描述了事件存储的参考模型。

事件存储的参考体系结构。[图片由作者提供]

坚持

从接收端开始,我们可能希望以“拉”的方式使用现有事件流中的数据,或者我们可能希望将数据“推”到事件存储中。该参考模型使用“推送”风格的持久性 API 对入口路径进行概括,其中记录被显式地插入到事件存储中。这种方法的好处是,它可以通过添加一个入口工作器来轻松适应“拉”模型,该工作器从事件总线(如 Kafka)或消息代理中拉出事件,将记录转换为某种标准化形式,并通过提供的 API 将它们推入事件存储。转型阶段可能相当复杂。例如,入口工作器可以通过从外部系统或数据库解析某些实体来丰富事件。由于是特定于应用程序的,所以不存在“通用”丰富器这样的东西;在除了最琐碎的应用程序之外的所有应用程序中,入口工人几乎肯定是定制的。因此,将入口阶段与事件存储体系结构的其余部分分开是有好处的。

持久性 API 充当各种网关,处理日常的入口问题,例如安全策略实施——身份验证和授权,以及 TLS 终止和请求日志记录。可以想象,您可能希望将自己新奇的事件存储作为服务提供,在这种情况下,持久性 API 可能需要实现某种形式的使用计量。

接下来,我们需要关注我们的持久性需求。这本质上是异步的,这意味着我们可以利用内部事件总线来持久地缓冲进行中的事件记录,直到它们最终在视图中具体化。这也考虑到了背压:API 可以立即响应客户端而不会阻塞,而不管积压事件的数量。

持久记录的异步性值得进一步说明。与传统的数据库记录不同,事件记录是不可变的。它们被附加到连续的日志中。不存在违反某些引用完整性或唯一性约束的问题,重复插入可以通过幂等性轻松处理。唯一需要考虑的潜在错误是插入带有冲突事件键的非重复记录。就这一点而言,我们的持久性 API 可能会提供一个异步钩子来通知客户端错误。方便的是,中间事件总线允许我们将单写原则应用于投影的更新,处理并发问题并通过串行化避免无序写入。

一旦记录在内部总线上,它们的后续处理分为以下独立阶段—

  1. 跨事件存储内部的一个或多个持久性视图,创建或更新事件记录中描述的实体。我们说“一个或多个”是为了说明多模型持久性的前景;参考模型假设实体可能被写入不同的持久性堆栈(例如,键值文档图),这取决于您的检索需求。
  2. 通过查询订阅层过滤事件记录。这说明了任何开放的连续查询,其中查询谓词匹配所讨论的事件记录或实现所述记录的副作用。参考模型并没有具体说明如何在订阅层实现谓词匹配。

询问

我们现在将注意力转向查询 API 。这个 API 充当所有以查询为中心的活动的外观,促进了连续查询和常规查询。像持久性 API 一样,查询 API 也是一个网关。(实际上,您可能会使用一个现成的 API 网关产品来支持这两个 API。)两种查询类型的端点可以选择性地分开;例如,常规查询可能通过 HTTPS 提供,而连续查询可能使用安全 WebSockets (WSS)。可以使用 gRPC 之类的替代协议,并且可以将两种查询类型统一到单个端点中。gRPC 可能是一个很好的选择,因为它本身支持客户端发起的 RPC 样式和服务器发起的通信模式。

回想一下,参考模型允许事件和实体分散在几个视图中。因此,该模型包括一个聚合层,它将几个查询的结果合并成一个单一的、内聚的响应。实现聚合层的起点可能是 GraphQL 或 OData。紧接在聚合层下面的是特定于视图的查询层。查询层抽象了底层的数据持久性和相关的查询技术。

一个重要的注意事项:在这个参考模型中显示的分解纯粹是在逻辑层次上。总的来说,这里显示的组件是封装特定关注点的模块;没有假设这些模块是独立的服务、容器、传统的过程或类/功能/包。

给…拍快照

下一个用例可能看起来有点深奥,但是(根据经验)它在某些应用程序中是有用的。给定一系列最近的事件,查询被引用实体的更新状态是很自然的。但是,如果您正在查询某个实体(比如一个客户)一年前发生的历史事件的时间线,该怎么办呢?您可能想知道这些事件如何影响客户的状态—对于由时间间隔划分的有限事件序列,起始状态是什么,与结束状态相比如何。这个看似简单的查询很难计算。给定一个开始状态和一个相当短的事件序列,获得结束状态通常是微不足道的。然而,起始状态可能与客户的初始状态相差好几年;计算它需要对潜在的大量事件进行强力重放。

快照通过在特定时间点保存实体的“关键帧”快照,并将每个快照标记为用于具体化相应实体的最近事件,来加速事件的重放。为了计算实体在时间 T 的状态,用比 T 旧的最近可用快照 S 播种实体状态,并连续应用在 S 的标记事件和 T 之间发生的所有事件。快照的频率越高,我们就能越快地得出我们的起始状态。

注: “关键帧”比喻借用视频压缩。关键帧是视频流中一系列增量编码过渡帧之间交错的完整图像。尽管在不加区别地使用时不如仅存储增量有效,但关键帧允许在视频流中快速导航。为了最小化它们对视频流大小的影响,关键帧被战略性地放置在高信息熵的点上,在这些点上可以观察到图像的剧烈变化,例如当从一个相机镜头切换到另一个镜头时,在这些点上,delta 编码会产生相当或更差的帧大小。

快照最明显的缺点是需要额外的空间来保存它们。实际上,快照不会是等间距的。根据局部性原则,查询更可能应用于最近的时间——快照越旧,就越不可能用作种子。因此,我们可以对较旧的快照应用更激进的修剪策略,以节省空间。我们还可以利用分层存储和压缩来更便宜、更紧凑地存储快照。快照可以被定时以与捕获的实体中的显著变化相一致,从视频压缩手册中吸取经验。也就是说,一些数据集可能太大,无法不加选择地进行快照;可能需要基于预期的访问模式有选择地拍摄实体的快照,该预期的访问模式可以通过周期性地分析过去的查询而根据经验获得。

快照的另一个好处是,它们可以在事件持久性的关键路径之外异步拍摄。因此,快照不会增加端到端延迟。快照还可以兼作备份策略—如果主数据存储出现故障,可以使用最近的快照进行快速恢复。

“简化和提炼”原则

参考架构可以被视为一个乐于助人的门房——为您完成大部分设计工作。也可能不会。关键是要接受参考模型不是特定问题的具体解决方案;更确切地说,它是一个衍生解决方案的模板——很像一个设计模式,但是被放大到一个宏观尺度。您的问题总是不同的,您的理想解决方案可能与参考模型几乎没有相似之处。关键是只取那些需要的,简化和提炼剩下的,让它为你工作。

例如,您可能会发现单个数据存储适合您的问题。你可能也不需要抓拍。也许在这个阶段支持连续查询还为时过早。没有问题:剥离无关的组件,调整剩下的组件。相反,您可以在您的体系结构中为这些类型的关注留出一些空间,当(并且如果)需要它们的时候,展望充实详细的设计。

结论

你可能会认为这篇文章提出的问题比它回答的问题要多。你也不会完全错了。一个事件存储是一个无定形的野兽,似乎是必要的,但它可能有一个太多的头。如果有一个关键的收获,那就是你几乎总是会构建一个定制的解决方案。这并不意味着重新发明轮子,因为有许多有用的库和框架可以帮助解决一些繁重的工作。为了强调这一点,在有意义的地方建立现有的基础。从你需要的地方开始,选择一个最佳的起点,并根据需要进行调整。从小处着手,准备好做出改变。这是进化架构的精髓:将关键决定推迟到最后负责任的时刻,不要让自己陷入困境——这样的提升最终代价太大。

这篇文章对你有用吗?我很想听听你的反馈,所以不要退缩。如果你对卡夫卡,Kubernetes,微服务,或者事件流感兴趣,或者只是有什么疑问, 在 Twitter 上关注我 。我也是Kafdrop的维护者和 有效卡夫卡 的作者。

魔鬼轮盘:期望值的失败

原文:https://towardsdatascience.com/the-devils-roulette-a-failure-of-expected-value-e0a4bae97302?source=collection_archive---------31-----------------------

随着数据、技术专家和有关统计的通俗读物的传播,越来越多的人熟悉期望值。对于门外汉来说,期望值是“平均值”,是随机过程的结果——统计学文本将其表示为 E[X]。有时这意味着最常见的结果。如果你随机选择一名计算机科学博士候选人,你会认为他们是男性,因为绝大多数计算机科学博士候选人是男性。有时这意味着最小化你的误差的值。如果你在美国随机抽取一个人,你会认为他们在 38 岁左右,这不是因为大多数人都 38 岁了,而是因为这样可以最大限度地减少你错过的平均年龄。

期望值在许多情况下是一个非常有用的概念。它会告诉你会发生什么。如果我们知道要期待什么,那么认为我们应该知道要做什么就不是不合理的。如果你打算冬天去冰岛,你应该预料到天气会很冷,带上外套。如果你去上医学院,你应该预计会积累 20 万美元的债务,也许只是成为一名软件工程师。如果有人给你一个有正预期回报的赌注,你应该接受。

本文的重点将放在最后一条语句上。一个很棒的面试问题肯定会让 quanty 项目的新毕业生感到困惑:你能设计出一个期望值为负但你肯定会赢的赌博游戏吗?有点令人惊讶的是,答案是肯定的,尽管这需要一些超自然的奇怪现象。我只想说,你永远不应该和魔鬼玩轮盘赌。

走狗

先介绍第一个角色。这个小丑是最近刚从某个著名机构获得的博士学位,该机构研究的领域包括政治学。这个傀儡熟悉统计和假设检验,并且坚信他们的力量。他们按照几条简单的格言生活:

1.如果一个事件的期望值是正的,就去做

2.尽可能承担最小的风险,这样你就可以再次玩这个游戏

3.如果有些事情看起来好得不像真的,那它很可能就是真的,所以要小心

似乎是很好的规则。第一,确保你不会像傻瓜买乐透彩票一样玩一场失败的游戏。第二个确保你倾向于捕捉一个事件的期望值,并减少你对方差的暴露。第三是尽职调查。

八月下旬,在密西西比三角洲附近进行了一整天的投票工作后,我们的主角开始前往酒店。如果你从未享受过在密西西比生活的乐趣,那里的八月会很热。民意测验专家想喝一杯。在酒店附近的一个十字路口,他看到了一个他之前没有注意到的酒吧,刚好有他最喜欢的啤酒,所以他进去了。

这家酒吧有点花哨,有一个穿着古怪的酒保、几个顾客和一台视频轮盘机。小丑坐在它旁边,好奇如何被骗的球员。这个游戏基本上和你想象的一样:表盘上有 38 个黑色和红色的数字(奇怪的是没有绿色),赔率只有一点可怕。一个单一的数字赌注(1/38 的机会击中)支付 37 倍,1.00 美元的赌注往往会返回 0.97 美元…不太好。前 12 个(12/38 的命中机会)支付 3 倍,你的 1 美元可以让你收回 0.94 美元…仍然不好。任何熟悉赌场的人都知道,他们通过让每一个赌注都有利于赌场来赚钱,但只是一点点。

奇怪的是,颜色赌注(1/2 的机会击中)也能得到 3 倍的回报。小丑的兴趣被激起了。一美元赌注的期望值是 1.50 美元。它是一个胜利者。该机器由密西西比州精算测试和精确计数协会认证,该协会是博彩业中一个声誉良好的组织。彩注的赌注是 10 美元,其他的是几美分。

一个奇怪的游戏

我们的主角参考他的格言。支出是正数吗?当然,如果游戏公平的话,他今晚可以免费喝酒。风险小到他还能再玩吗?用 200 美元的旅行零用现金,他可以玩 20 次。是不是好得不像真的?是啊!即使有认证,游戏也可能被操纵。

小丑有一个解决办法,他拿出一美元,玩 50 轮赌单个数字记录红色和黑色的结果以及胜利。27 红 23 黑 2 胜。应用一个简单的 T-Test(一个关于想法真实性的统计测试),结果暗示了一个公平的游戏,或者至少是一个没有足够不利于玩家的游戏,使得颜色赌注没有吸引力。助手往机器里放了 200 美元。

他赢了第一局,赢了 30 美元。机器将彩色下注的下注金额更改为$40。再转一次,赢家,赢 120 美元。下注额再次变为$130。当小丑考虑走开时,机器上的支付提高到 4 倍。再转一圈,就亏了。他现在输了$10,游戏将下注额重置为$10,奖金重置为 3 倍。赌注还是很小,期望值还是正的,现在 Doc 卡住了。他再次旋转。

一个 5 轮游戏的例子

恶魔每次都赢

这个游戏一直持续到下注者没钱为止,最终他会一直没钱。请注意,这里的挑战是设计一个游戏,不仅仅是倾向于让魔鬼赢,而是保证它赢。保证意味着你最终会得到一个有绝对把握的结果,而倾向只意味着结果更有可能出现。这个游戏中可以保证的是,下注者最终会输。我们利用这一点,按照奖金的比例增加赌注,试图诱使对手破产。

这里的毁灭可能意味着一些事情。首先,它可以描述一个情况,其中走狗得到了非常不幸,失去了 20 个旋转在一排。这种可能性微乎其微,结果也没什么意思,所以我们会注意到它可能会发生,然后继续前进。其次,它可以描述当你赌得太多而输了的时候会发生什么,即使胜算看起来很大。无论哪种情况,你的钱包都会变得更薄。

一个游戏和缓慢向 0 前进的例子

如果我们更详细地分析这个游戏,我们会看到轮盘旋转本身是一个更大的实际游戏的循环子游戏。子游戏有正的期望值,你将有一半的机会是正确的,并因此获得超过 2 倍的奖金。循环博弈有负的期望值:你最终会输,当你输了,你会失去一切。

另一种解释是:虽然我们的主角有在不确定的世界中导航的经验法则,但他们没有风险管理的基础概念。在这里,一个体面的开始可能是添加第四条格言,即增加风险应该得到更多的回报。在投资方面,我们希望产生 alpha,在商业方面,我们希望得到正的风险调整 NPV。大多数人会选择游戏系列中的第二个赌注:40 美元,3 倍回报。让我们尝试一种策略,当支付乘数与下注额的比率小于 0.1 时,您可以退出。

几个风险意识停止的例子,你仍然会失去一切

不太好。你的对手可以增加支付让你继续玩下去,虽然你的回报更高——在一个上面的示例游戏中,你的钱包攀升到$4000 以上——但你最终还是会失去一切。

知道何时走开

这个游戏的另一种解释如下。魔鬼早早地给了这个走狗一笔额外费用,让他在稍后进行自杀赌注。自杀赌注是如此之大以至于导致破产的赌注。根据我的经验,避免自杀是个好主意。一种方法是不玩。不玩的期望值为 0,这比失去一切要好,但比第一次旋转后离开的策略更糟糕——期望回报为 15 美元。

如果你最终和魔鬼玩轮盘赌,你应该有两个目标。首先是不要破产,如果赌注超过某个低门槛,许多策略会让你走开。然而,花一美元买 1.5 美元的情况并不是每天都有,这就引出了第二个目标:在你能买的时候买你能买的东西。阈值方法不会这样做。相反,我们需要一种策略,用破产风险而不仅仅是损失风险来衡量回报。

几场凯利式的停球

上述运行是使用称为凯利标准的特定停止策略生成的。所有这些交易都以正回报结束,尽管凯利止损并不能保证一定会赢,但它确实会产生正回报。该公式的推导和历史超出了本文的范围,尽管它有很好的文档记录。然而,直觉也在范围之内。如果我们考虑风险、回报和毁灭,我们知道:

1.只有当我们失败时,我们才会毁灭

2.我们只在赢的时候领取奖金

3.随着支出的增加,我们想下更大的赌注

4.当我们的赌注相对于我们的钱包变得过大时,我们就破产了

如果我们把这些陈述变成一个公式,我们会希望根据输的可能性、支出和钱包的大小来限制我们的赌注。随着我们的钱包越来越鼓,支出越来越多,或者赢的可能性越来越大,我们会增加我们愿意下的最大赌注。当我们输钱的时候,回报会减少,或者我们输钱的机会会增加,我们会减少下注或者走开。最后,我们想要一个限制因素,即使支出变得任意大,也允许我们离开。凯利停止这样做是一种最佳的方式。

当然,在现实世界中,我们通常不知道收益,也不知道几率。我们从 MBBs 雇佣定量分析师、数据科学家、专家和深夜巫毒牧师来试图解决这些问题;当然,尽管他们的预测存在不确定性。不过,我们知道的一件事是,我们可以合理地失去什么,并继续前进。虽然概率和支出很重要,但对于任何足够长的游戏来说,与管理破产相比,它们都显得苍白无力。

免责声明:本文表达的观点仅代表作者个人观点,不一定代表任何雇主、组织或其附属机构的观点。

2021 道格拉斯·汉密尔顿

Dice 语言可以帮助您实现精确的概率推理

原文:https://towardsdatascience.com/the-dice-language-may-help-you-achieve-exact-probabilistic-inference-5147e5fbcd0a?source=collection_archive---------33-----------------------

图片来自 Pixabay

因式分解为离散概率程序提供了有效的推理

目标

这篇文章包括我对学术论文的总结和思考,该论文展示了 Dice ,这是一种概率编程语言,旨在解决离散概率模型的精确推理。读完这篇文章后,你应该知道为什么开发 Dice,以及它如何利用离散概率程序结构进行有效的推理。

介绍

概率编程语言(ppl)的数量正在迅速增长。它们被认为是概率建模的宝贵工具,概率建模是包括机器学习在内的一些科学和工程努力的关键成分。

推理是一种强大而普遍的工具,它有助于从概率模型中进行推理。在 PPLs 的上下文中,推理可以广义地认为是基于观察到的输出来计算程序输入的概率分布。虽然已经提出了几种算法来实现推理,但它通常被认为是一个计算困难的问题。在一般的连续情况下,推论是如此的困难,因为它可能涉及到计算繁重的积分。然而,并不是所有的概率模型都包含连续的随机变量…

输入骰子

Dice 是一个专门设计的 PPL,用于在描述离散概率模型的程序上执行精确的推理[1]。离散的概率模型由离散的随机变量组成——它们的域有一个有限的大小。精确推断(与近似推断相反)意味着结果是真实的后验分布。

我们将讨论 Holtzen 等人的附带出版物。艾尔。[1]了解 Dice 如何巧妙地利用离散概率程序中的结构来执行易处理的推理。

先决背景

去读霍尔森等人的书。艾尔。的出版物,我建议读者具备以下概念的必备知识:

  • 概率编程基础
  • 概率推理
  • 二元决策图
  • 编译程序设计
  • 计算复杂性分析

不管你对上述概念的熟悉程度如何(我自己不是专家),这篇文章以一种通俗易懂的方式总结了主要贡献。

摘要

主要思想

Dice 不是一种为一般概率推理提供普遍支持的语言——作者并不这样认为。相反,作者敏锐地发现了一种方法,可以加速仅针对离散概率程序的推理。因此,如果你对连续的情况更感兴趣,你可能想现在停止阅读。我建议任何怀疑论者考虑离散案例中的各种各样的概率建模问题。应用领域的例子包括文本、网络和图形,以及排名和投票[1]。尽管远不是第一个实现离散概率程序推理的人,但作者声称 Dice 是不同的,因为它利用程序结构来执行因式分解推理

这种“因子化推理”是什么?Dice 识别概率程序中的条件独立性,使用它们来构造可重用的组件,显著地减少推理的负担。它以一种受知识汇编推理方法启发的方式这样做。在离散情况下,重要的考虑因素是随机变量的值的可选分配的概率共享几个计算。Dice 的作者认识到,这些重复计算可以通过识别它们并将其表示为二元决策图(BDD)来避免。然后,BDDs 可以用于在线性时间内执行推理。

激励人心的例子

图片作者。

本文使用下面的例子来灌输因式分解推理如何工作的直觉。考虑这样一种情况,你一个接一个地投掷 3 枚有重量的硬币。每一次后续翻转的重量取决于当前翻转的结果(请暂停怀疑)。假设 x,y,z 是随机变量,分别对应第一枚、第二枚和第三枚硬币翻转的结果。我们任意地将“正面结果指定为,将“反面”结果指定为假。概率模型由下面的 Dice 代码片段描述,该代码片段出现在本文附带的博客文章[2]中。

let x = flip 0.1 in
let y = if x then flip 0.2 else flip 0.3 in
let z = if y then flip 0.4 else flip 0.5 in
z

实际上,“翻转 p ”对应于以概率 p 采样的伯努利分布。我不知道创作者为什么不用“ flip ”作为关键词,而不用“ roll ”,考虑到语言的名字,但这是题外话。代码描述了以下情况:硬币 1 被夹住,结果分配给 x. 然后硬币 2 被翻转。如果硬币 1 正面朝上,那么硬币 2 正面朝上的概率为 0.2;另一方面,如果硬币 1 正面朝上,那么硬币 2 正面朝上的概率为 0.3。硬币 2 的翻转结果被分配给y。然后硬币 3 被翻转。如果硬币 2 正面朝上,那么硬币 3 正面朝上的概率为 0.4;否则,硬币 3 将以 0.5 的概率落在人头上。硬币 3 的投掷结果被分配给 z ,这是程序的返回值。

硬币 3 落在头上的概率可以表示为以下乘积之和:

等式 1:未分解的表示 z 为真的概率表达式

在快速浏览这个表达式后,我们意识到它也可以用这个因式分解来表示:

等式 1:z 为真的概率的分解表达式

因式分解的方程比原方程包含更少的运算,因此表达得更简洁。你可以想象枚举每一个可能的程序执行将如何成指数增长。一旦我们考虑域大于 {heads,tails} 的离散随机变量,这个问题会变得更糟!

编译成二元决策图

Dice 根据程序流为概率程序生成 BDD。通过利用因式分解的机会,我们避免了迭代所有可能的翻转结果。事实上,为每个程序员定义的函数都生成了单独的 BDD,以促进模块化。BDD 是加权布尔公式的简洁表示,通过利用概率程序中的条件独立性关系来构建。特定赋值集的权重(例如,翻转 1 返回正面,翻转 2 返回反面,翻转 3 返回正面)是每个变量的所有概率的乘积,对应于上面第一个等式中的一个乘积。

示例 Dice 程序的二元决策图。每个节点对应于一个翻转,并通过其相应的加权模型计数进行注释。如果父变量为真,则边为实线,否则为虚线。这个图应该从上往下看。例如,f3 对应于第一次投掷错误时硬币 2 的投掷。图片作者,改编自[1]图 1b。

概率程序中的条件独立性体现在 BDD 中节点的子树中。在上图中, f₄ 是由 f₂f₃.的外出边共享的子树直觉上这是有道理的,因为 f₄ 是第三次抛硬币,第二次抛硬币的结果是“正面”。也就是说,如果第二次掷硬币的结果是“正面”,那么这次掷硬币有条件地独立于第一次掷硬币的结果。在提前构建 BDD 的过程中,在利用因式分解机会的同时,我们为推理做好了充分的准备。

注意,构建 BDD 在计算上很困难。这是骰子推断最重的计算负担。

通过加权模型计数进行推断

加权模型计数(WMC)是将每个模型的权重相加的过程。BDD 中每个节点的 wmc 可以通过对其子节点的 wmc 求和来计算,并由节点自身的概率分布进行加权。例如,为了计算节点 f₂、的 WMC,我们取节点 f₄f ₅的 wmc 之和,用由 f₂.表示的掷硬币结果的概率进行加权

等式 3:节点 f2 的 WMC

为了对整个程序进行推理,我们计算 BDD 中每个节点的 WMCs,从叶子开始,一直到根。根的 WMC 是推论的结果。计算这个值构成了相对于 BDD 大小的线性复杂度。我们观察到,在节点之间共享子树可以极大地提高这种自底向上遍历的效率。

根据函数抽象的原则,为每个程序员定义的函数计算单独的 BDD,从而实现模块化编译。这种可回收的方法可以极大地限制变量赋值的数量,防止不同的变量被分配给不同的函数调用。

observe ”关键字根据程序员指定的条件固定程序中随机变量的值。继续我们正在运行的例子,考虑下面的程序,其中我们获得了证据表明 y 为假(即 flip 2 导致“tails”)。运行程序将返回一个均匀分布,因为观察到第二次抛硬币是“反面”导致第三次抛硬币是公平的。

let x = flip 0.1 in
let y = if x then flip 0.2 else flip 0.3 in
let z = if y then flip 0.4 else flip 0.5 in
let y_obs = observe !y
z

在骰子里,观测被认为是一等公民。为了考虑观察结果,必须在编译策略中增加一个额外的步骤。作者定义了接受公式,这是一个布尔公式,当程序中的所有观察语句都满足时,该公式为真。然后,后验分布由模型和接受公式的逻辑合取的 WMC 除以接受公式的 WMC 给出。

语言

Dice 程序由零个或多个非递归函数组成,后跟一个主表达式。该论文给出了 Dice 的语法和语义的全面概述和形式化,因此如果您想检查细节,请参考[1]。作者创建了一个网站来配合出版物,其中包括语法的简要描述,以及示例[3]。还有一个窗口允许您编写和运行 Dice 代码。这是你阅读报纸时了解语言的好方法!

该论文还包括一个部分,建立了通过 WMC 将 Dice 的推理方法简化为概率推理。给出并讨论了正式的编译规则。作者展示了他们的规则如何将加权布尔公式编译成 BDD。

实验

为了验证他们的实验,作者考虑了另外两个能够进行精确推理的最先进的 ppl:Psi[4]和 WebPPL [5]。Dice 和 Psi 的编译时间被用于相关研究中的基准推理任务。骰子几乎是单边快于 Psi。针对论文中定义的三个任务(凯撒密码分析、钻石网络和缩放)在一系列问题规模上对 Dice、Psi 和 WebPPL 进行比较的实验。戴斯的表现比其他人好几个数量级。然后,作者比较了每三种语言在多个基准贝叶斯网络上进行推理所需的时间。虽然 Psi 和 WebPPL 对大多数网络来说要花 2 个多小时,但 Dice 总是花不到 3 秒。

作为对 Dice 因式分解推理的最终验证,Dice 与 Ace [6]进行了比较,Ace 是一种最先进的贝叶斯网络求解器。这项任务尤其具有挑战性,因为目标是计算网络中所有变量的边际概率。尽管 Dice 通常比 Ace 需要更长的时间来解决网络问题,但它的表现相当这一事实本身就是一个值得注意的壮举,因为 Ace 不像 Dice 那样支持许多编程结构(它的重点仅限于解决贝叶斯网络)。

我的想法

优点

最重要的是,我非常欣赏作者在 PPL 开发中发现了一个很大程度上未被探索的领域。他们没有专注于近似连续的情况(像他们同时代的几个人一样),而是将他们的注意力限制在离散的概率程序上,这些程序包含了各种各样的现实世界的问题。正如在论文中所讨论的,使用 WMCs 进行概率推理可能不是一个全新的想法,但是它在 PPL 环境中推理的应用是。我可以看到因式分解推理方法成为概率程序员工具箱中的主要工具。

分解推理方法明显加快了各种离散概率模型的推理速度。事实上,作者能够交付一个系统,该系统在针对各种实际问题的编译方面有显著的加速,这是令人难以置信的。

这篇论文本身非常详尽,对作者的观点进行了严格的推导。我还发现这是一种直觉式的组织。数字和表格信息丰富,视觉上吸引人。

限制

在讨论中,作者承认精确的骰子推断通常是 PSPACE-hard——也就是说,它需要多项式量的空间。附录中有一个证明。这意味着它要么和 NP 问题一样难,要么更难。其困难的主要原因是 BDD 的构建。那么,为什么骰子在实验中表现如此出色呢?事实证明,对于特定的程序结构,BDD 的构建效率要高得多,原因有二:

  • 程序结构中存在的条件独立性关系可以分解
  • 通过设计,本地项目结构的某些配置被有效地映射到 BDD

虽然上述情况可能很常见,但它们并没有涵盖各种各样的离散概率程序。使用 Dice 的开发人员可以设计他们的程序,以便利用上面列出的两种试探法。这需要一些关于 Dice 内部工作的知识,这对于编程新手来说是一个障碍。

最后,Dice 的程序表达能力受限于它不能处理递归函数、无界整数和无界迭代。然而,文件的结论表达了在未来消除这些障碍的愿望。

相关著作

在深入研究之前,让我们讨论一下这项工作如何融入与概率编程相关的不断增长的文献中。在他们的论文中,作者提供了相关作品的有组织的和全面的描述,但我们将出于本文的目的进行总结。作者声称,Dice 是第一个使用加权模型计数(稍后将详细介绍)在 PPL 中进行精确推理的尝试。加权模型计数(WMC)是一种基于路径的推理算法,这意味着推理是通过用实际值运行概率程序来进行的。Dice 使用的因式分解推理方法不同于其他采样和变分推理方法,因为它尽可能重用执行路径,而不是单独遍历整个路径。与这项工作类似的是加权模型集成,它本质上是应用于连续模型的 WMC,其中集成沿着程序路径发生【7】。概率逻辑程序的最新成果与戴斯的 WMC 策略非常相似。Bryant [8]和 Darwiche [9]把概率推理比作 WMC。前者使用二元决策图[8],后者使用句子决策图[9]。基于这些方法,Dice 提供了普通编程语言中可用的结构,并在其编译策略中将观察视为一等公民。

我对未来的想法

对于保证离散概率程序的各种场景,嵌入骰子的推理方法具有内在价值。我认为,这个项目明智的下一步可能是将其对离散问题的精确推理包含到一个更通用的 PPL 中,该 PPL 也支持连续情况下的近似推理。

由于 Dice 的效率取决于程序和本地程序结构中存在的条件独立性关系,因此可以开发智能代码完成工具来鼓励开发人员的这种行为。也许这样的工具可以在代码编辑器中为开发人员提供语法建议。

供讨论的问题

如果你想和别人讨论这篇文章,这里有一些建议可以帮助你开始对话:

  • 列举一些离散概率程序的应用领域
  • 建议一个构建 BDD 会很有效的模型。
  • 相反,提出一个模型,它的结构不适合 BDD 的有效构造
  • Dice 缺乏对递归函数、无界整数和无界迭代的支持限制有多大?在这些约束条件下,什么样的问题无法实现?

结论

Dice 是对开发者可用的日益增长的 ppl 主体的杰出贡献。它采用了一种推理方法,可以针对各种问题类型进行有效扩展。附带的文件是彻底的,并附有一个演示网站和开放源代码。我很想知道开发人员是如何接受这种语言的,并期待作者随后的文章。如果你的推理问题涉及离散随机变量,我建议在骰子上“碰碰运气”!

图片由 anncapictures 来自 Pixabay

参考

[1] S. Holtzen,G. Van den Broeck 和 T. Millstein,离散概率程序的缩放精确推理 (2020),Proc .ACM Lang。(OOP SLA)【2】s . Holtzen,离散概率程序的标度精确推理 (2020),PL Perspectives "
【3】s . Holtzen,G. Van den Broeck 和 T. Millstein,dice 概率编程语言 (2020),加州大学洛杉矶分校
【4】t . Gehr,S. Misailovic 和 M. Vechev, Psi:概率程序的精确符号推理(10) 概率编程语言的设计与实现(2014)http://dippl.org
【6】m . cha vira 和 A. Darwiche,关于加权模型计数的概率推理 (2008),j .人工智能
【7】v . Belle,A. Passerini 和 G . Van den Broeck,混合域中加权模型集成的概率推理 (2015),Proc . 关于人工智能的 IJCAI

【8】r . Bryant,基于图的布尔函数操作算法 (1986),IEEE TC C-35
【9】A . Darwiche, SDD:命题知识库的新规范表示 (2011),ij Cai 会议录-国际联合会议

机器学习中分类和回归的区别

原文:https://towardsdatascience.com/the-difference-between-classification-and-regression-in-machine-learning-4ccdb5b18fd3?source=collection_archive---------10-----------------------

函数逼近的 问题

绿色变色龙Unsplash 上拍照

在机器学习生涯的开始,区分回归和分类算法可能是一项挑战。当你已经在这个领域工作了 4 年,很容易忘记学习机器学习的挑战。有太多的术语,这使得你刚开始时很难找到自己的方向。

机器学习的一个重要部分是区分任务是回归问题还是分类问题。这种区别为从业者提供了更清晰的见解,即在处理问题时,什么样的机器学习算法可能最合适,因为一些模型对分类比对回归更有用——反之亦然。

这两个任务的相似之处在于,它们都是 监督学习 的一种形式。

监督学习

回归和分类问题都属于监督学习范畴。每项任务都涉及开发一个从历史数据中学习的模型,使其能够对我们没有答案的新情况做出预测。更正式地说,所有监督学习任务都包括学习一个函数,该函数基于示例输入-输出对将输入映射到输出。

监督学习问题的目标是逼近从输入特征(X)到输出(y)的映射函数(f)——在数学上,这被称为函数逼近 的 问题。

不管我们是试图解决分类问题还是回归问题,每当我们为监督学习问题开发学习算法时,算法的工作就是在给定可用资源的情况下找到最佳映射函数。

区别——分类与回归

尽管总体目标相似(基于输入-输出映射将输入映射到输出),分类和回归问题是不同的。

在分类问题中,我们的学习算法学习将输入映射到输出的函数,其中输出值是离散的类别标签(即,猫或狗、恶性或良性、垃圾邮件或非垃圾邮件等)。流行的分类算法包括:

相反,回归问题关注的是输入到输出的映射,其中输出是一个连续的实数(例如,房子的价格)。流行的回归算法包括:

:在用 L1 或 L2 正则化对抗过度拟合中了解更多关于脊和套索回归的信息

一些算法专门用于回归类型的问题,例如线性回归模型,而一些算法专门用于分类任务,例如逻辑回归。然而,有一些算法,如决策树、随机森林、XGBoost 和神经网络,一旦对它们进行小的修改,它们就可以重叠。

最后的想法

本质上,我们确定一个任务是分类问题还是回归问题的方法是通过输出。回归任务与预测连续值有关,而分类任务与预测离散值有关。此外,我们评估每种类型问题的方式是不同的,例如,均方差对于回归任务是一个有用的度量,但这对于分类来说是行不通的。类似地,精确度对于回归任务来说不是一个有效的度量标准,但是对于分类任务来说是有用的。

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的免费每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关文章

** **

相关性和因果关系的区别

原文:https://towardsdatascience.com/the-difference-between-correlation-and-causation-51d44c102789?source=collection_archive---------13-----------------------

你需要知道的关于偶然推断的一切

粘土银行Unsplash 拍摄的照片

相关性是指两个统计变量之间的关系。这两个变量相互依赖,一起变化。因此,两个变量的正相关意味着 A 的增加也会导致 b 的增加。这种关联是单向的。因此,在相反的情况下也是如此,变量 B 的增加也在相同程度上改变了 A 的斜率。

因果关系另一方面,描述了两个变量之间的因果关系。因此,A 和 B 之间的因果关系意味着 A 的增加也是 B 增加的原因。通过一个简单的例子,这种差异很快就变得清楚了:

一项研究很可能会发现一个人患皮肤癌的风险和他们去室外游泳池的次数之间存在正相关。因此,如果一个人经常去室外游泳池,那么他患皮肤癌的风险也会增加。明显的积极联系。但是去室外游泳池和皮肤癌之间也有因果关系吗?可能不会,因为那将意味着只有去室外游泳池才是增加皮肤癌风险的原因。

更有可能的是,花更多时间在室外游泳池的人也暴露在明显更多的阳光下。如果他们没有采取足够的防晒措施或类似措施,会发生更多的晒伤,这增加了皮肤癌的风险。很明显,去室外游泳池和皮肤癌风险之间没有因果关系。

去室外游泳池和皮肤癌之间有因果关系吗?|来源:作者

tylervigen.com可以发现各种很可能不显示因果关系的奇怪相关性。

例如,在美国缅因州的离婚率和人造黄油的人均消费量之间有很高的关联。这是否也是因果关系值得怀疑。

相关的类型有哪些?

一般来说,可以区分两种类型的上下文:

  1. 线性或非线性:如果变量 A 的变化总是触发变量 b 中常数因子的变化,则相关性是线性的。如果不是这种情况,则称相关性是非线性的。
  2. 正或负:如果变量 A 的增加导致变量 B 的增加,那么就是正相关。另一方面,如果 A 的增加导致 B 的减少,那么相关性为负。

相关类型|来源:作者

相关系数是多少?

相关系数表示两个变量之间的关联有多强。在 tylervigen.com 的例子中,这种相关性非常强,达到 99.26%,这意味着这两个变量接近 1 比 1,即人造黄油消费量增加 10%,离婚率也会增加 10%。相关系数也可以假设为负值。

小于 0 的相关系数描述了反相关,并表示两个变量的行为方式相反。例如,当前年龄和剩余预期寿命之间存在负相关。一个人越老,他或她的剩余寿命就越短。

你如何证明因果关系?

为了可靠地证明因果关系,进行了科学实验。在这些实验中,人或测试对象被分成不同的组(你可以在我们关于采样的文章中读到更多关于这是如何发生的),这样在最好的情况下,参与者的所有特征都是相似或相同的,除了被认为是原因的特征。

对于“皮肤癌室外游泳池案例”,这意味着我们试图形成两组,其中两组参与者具有相似或最好甚至相同的特征,如年龄、性别、身体健康和每周暴露于阳光中的时间。现在,研究一组人(注意:暴露在阳光下的时间必须保持不变)去室外游泳池游泳,与不去室外游泳池的那组人相比,是否会改变皮肤癌风险。如果这种变化超过一定程度,我们就可以说是因果关系。

这是你应该带走的东西

  • 只有在极少数情况下,相关性也意味着因果关系。
  • 相关性意味着两个变量总是一起变化。另一方面,因果关系意味着一个变量的变化是另一个变量变化的原因。
  • 相关系数表示关联的强度。它可以是积极的,也可以是消极的。如果系数为负,则称为反相关。
  • 要证明因果关系,需要复杂的实验。

如果你喜欢我的作品,请在这里订阅https://medium.com/subscribe/@niklas_lang或者查看我的网站* 数据大本营 !还有,medium 允许你每月免费阅读 3 篇 。如果你希望有无限制的 访问我的文章和数以千计的精彩文章,不要犹豫,点击我的推荐链接:【https://medium.com/@niklas_lang/membership】每月花$5***获得会员资格**

* *

数据科学家和 ML 工程师的区别

原文:https://towardsdatascience.com/the-difference-between-data-scientists-and-ml-engineers-f6e797948003?source=collection_archive---------3-----------------------

职责、专业知识和期望薪资

照片由 Unsplash 上的静止不动

数据科学家和机器学习工程师的角色经常混淆。虽然他们当然友好地一起工作,并在专业知识和经验方面有所重叠,但这两个角色的目的完全不同。

从本质上讲,我们正在区分寻求理解其工作背后的科学的科学家和寻求建造他人可以使用的东西的工程师。这两个角色都非常重要,在一些公司,可以互换——例如,某些组织的数据科学家可能会从事机器学习工程师的工作,反之亦然。

为了使区别更清楚,我将把差异分成 3 类;1)职责 2)专业知识 3)期望薪资。

责任

数据科学家遵循数据科学流程,该流程也称为 Blitzstein & Pfister 工作流。Blitzstein 和 Pfister 最初创建了这个框架来教授哈佛 CS 109 课程的学生如何处理数据科学问题。

数据科学流程包括 5 个关键阶段

  • 阶段 1: 了解业务问题
  • 第二阶段:数据收集
  • 第三阶段:数据清理&探索
  • 第四阶段:模型构建
  • 第 5 阶段:交流和可视化见解

数据科学家的大部分工作都是在研究环境中进行的。在这种环境下,数据科学家执行任务来更好地理解数据,以便他们可以构建能够最好地捕捉数据内在模式的模型。一旦他们建立了一个模型,下一步就是评估它是否满足项目的预期结果。如果没有,他们会迭代地重复这个过程,直到模型满足预期的结果,然后再将其交给机器学习工程师。

机器学习工程师负责创建和维护机器学习基础架构,允许他们将数据科学家构建的模型部署到生产环境中。因此,机器学习工程师通常在开发环境中工作,他们关心的是在研究环境中复制由数据科学家构建的机器学习管道。而且,他们在生产环境中工作,在生产环境中,其他软件系统和/或客户端可以访问模型。

本质上,机器学习工程师负责维护 ML 基础设施,使他们能够部署和扩展数据科学家构建的模型。数据科学家是机器学习工程师构建的机器学习基础设施的用户。

专业知识

人们对这两个角色之间的区别感到困惑的原因是,他们的技能有很多重叠的地方。例如,数据科学家和机器学习工程师都应该具备以下知识:

  • 监督和非监督学习
  • 机器学习和预测建模
  • 数学和统计学
  • Python(或 R)

角色之间的主要重叠导致一些组织,尤其是较小的组织和初创公司,将角色合并为一个。因此,一些组织让数据科学家做机器学习工程师的工作,一些组织让机器学习工程师做数据科学家的工作。只会给从业者带来更多的困惑。

但是,每个角色所需的专业知识之间存在一些关键差异。

数据科学家通常是非常优秀的数据故事讲述者。一些人会认为,这一特性使他们比机器学习工程师更具创造力。另一个区别是,数据科学家可能会使用 PowerBI 和 Tableau 这样的工具来分享对业务的见解,他们不一定需要使用机器学习。

弥补伴侣不足的夫妻一般更强大。当你这样想的时候,前面提到的专业知识可能是机器学习工程师的弱点,他应该在计算机科学和软件工程方面有很强的基础。机器学习工程师应该了解数据结构和算法,并理解创建可交付软件的基本组件。

也就是说,对于一个机器学习工程师来说,很好地掌握另一种编程语言(如 Java、C++或 Julia)并不罕见。

https://medium.com/analytics-vidhya/courses-to-learn-data-science-in-2021-a52e64344e5c

薪资期望

很难确定确切的期望工资。这两个职位的薪酬会因各种因素而有所不同,比如你的经验、资历、工作地点和工作领域。

组织也被期望提供不同的福利。无论职位如何,你都有望收到加入公司养老金计划、弹性或远程工作、绩效奖金和私人医疗保险的邀请。

英国(英国)

  • 一个初级数据科学家可以期望在25000—30000的范围内起步(根据经验可能上升到 40000)。【来源 : 前景。一个毕业生入门级机器学习工程师可以期望起薪3.5 万— 4 万。【来源 : 前景
  • Glassdoor 报道,英国一名数据科学家的平均工资为46818 英镑。 前景陈述一个机器学习工程师在英国的平均工资是52000
  • 根据前景领导和首席数据科学家可以赚到 6 万以上的任何东西(在某些情况下超过 10 万)。相比之下,更有经验的机器学习工程师有望获得高达 17 万(特别是如果他们为谷歌或脸书这样的跨国公司工作)来源 : 前景

美利坚合众国

  • 美国一个数据科学家的平均底薪是120089 美元来源** : 确实。相比之下,美国一个机器学习工程师平均底薪是150660 美元来源 : 确实。**

总体而言,公平地说,机器学习工程师的平均薪酬通常高于所有数据科学家。

最后的想法

尽管角色之间有相似之处,但数据科学家和机器学习工程师在职责、专业知识和收入方面有很大不同。从我听过的大多数关于这个话题的采访来看,许多人说从数据科学家到机器学习工程师的转变比从机器学习工程师到数据科学家的转变要困难得多。这是因为数据科学家通常不精通软件工程和计算机科学基础,这是一个很大的学习曲线。

感谢阅读!

如果你喜欢这篇文章,请通过订阅我的免费每周简讯与我联系。不要错过我写的关于人工智能、数据科学和自由职业的帖子。

相关著作

** https://medium.datadriveninvestor.com/what-do-data-scientists-even-do-fb5d3bef30fc https://pub.towardsai.net/data-science-career-path-rankings-b15ba395cb51 **

主键和外键的区别

原文:https://towardsdatascience.com/the-difference-between-primary-and-foreign-keys-accbfb7815d3?source=collection_archive---------36-----------------------

以及在创建关系数据库时如何定义它们

照片由 Samantha LamUnsplash 上拍摄

在学习关系数据库时,理解主键和外键之间的区别是非常必要的。它们定义了数据库中不同表之间的关系,是数据建模中的一个关键概念。

首先,如果你不知道什么是关系数据库,它是一个被设计用来识别各种不同信息之间的关系的数据库。这就是主键和外键如此重要的原因。它们使关系数据库成为关系数据库!

主键

数据库中的每个表都有一个唯一的标识符,可以帮助您将该表及其行与其他表区分开来。主键始终充当唯一标识符。对于相应表中的每一行,它都是唯一的值。它可以简单到为每行生成一个 id 号,或者为商店的每个顾客生成一个社会保险号。

外键

外键有点难以理解。一个表的主键是另一个表的外键。一个表的唯一标识符可能只是另一个表的属性。然而,外键提供了两个表之间的链接,形成了它们之间的关系。

包含外键的表通常称为子表,而包含主键的表通常称为父表。一个数据库可以简单到只有一个父/子表,也可以有数百个父/子表。这完全取决于用例以及您试图存储多少信息。

让我们想象一下。

可视化主键和外键是数据建模的一个重要部分。如果您打算创建一个数据模型,那么您需要知道如何定义主键和外键,以及如何将它们相互映射。如果你需要数据建模的介绍,请查阅数据建模 101:它是什么?

首先,您想要定义您的主数据表。这通常是其他表的来源表。例如,如果您拥有一家商店,该表可能就是您的订单表。您为商店收集的所有信息都将与您收到的订单相关联。想想什么将是你的唯一标识符。

作者图片

这里的唯一标识符或主键是 OrderId。这是一个对每个订单都不同的值。该表中还包括我们将要定义的其他表的主键。您需要考虑保存想要存储的信息所需的不同表。

如果我要为我的商店创建一个数据库,我还想存储每个客户和库存中每个商品的信息。这些都是它们自己的表,有它们自己的主键。

作者图片

Customers 表的主键是 CustomerId,Items 表的主键是 ItemId。如果您看上面,我还在 Orders 表中包含了这些值。因为 CustomerId 和 ItemId 是另外两个表的主键,所以它们将被视为 Customers 表中的外键。

作者图片

请记住,您还可以在每个表中包含不被视为主键或外键的其他属性。对于订单,时间戳仍然是您想要收集的关于每个订单的重要信息,但是它没有将数据库中的任何表链接在一起。

希望这能让您更好地理解关系数据库中主键和外键之间的区别。别忘了看看数据映射 101:是什么?关于创建数据模型的更深入的演练。我介绍了不同类型的数据模型、表之间的关系类型、关于主键和外键的更多信息,以及如何创建数据模型。

代理键和主键的区别

原文:https://towardsdatascience.com/the-difference-between-surrogate-and-primary-keys-222cf31ddb57?source=collection_archive---------12-----------------------

什么时候用各种流行来源的例子

弗洛里安·伯杰在 Unsplash 上拍摄的照片

最近,我一直致力于重建整个数据堆栈,并找出用 dbt 编写模型的最佳方式。我最近学习了关于增量模型以及如何实现它们。这对我来说是一件全新的事情,我期待着在进一步探索后与大家分享。

在阅读关于增量模型的文档时,我了解到我需要在每个表中拥有一个惟一的键。这对于更新和删除数据仓库中的记录至关重要。在安慰了 dbt Slack 通道之后,有人建议我使用dbt_utils.surrogate_key函数为我的表生成一个惟一的键。

这就是导致我产生这个问题的原因…代理键和主键之间有什么区别?我非常熟悉主键和外键,以及它们如何与关系数据库一起工作。以至于我写了一篇关于他们的文章!然而,直到现在我才听说过代理键。

事实证明,代理键与主键非常相似,因为它是表中对象的惟一值。但是,它不是从表中的实际数据派生出来的,而是由对象本身生成的字段。它不像主键那样具有商业价值,而是仅用于数据分析目的。如果你想到代理的这个定义“外部世界中的一个实体”——那么这种差异是有意义的。

代理键通常是数据库中的序列号,如 PostgreSQL serial列、Oracle sequence列或 MySQL auto_increment列。作为 Fivetran 和雪花的用户,我认为_file_line列的组合是一个代理键。

您可以使用表中已经存在的不同列来生成代理键,而不是作为一个字段。如果您将 Fivetran 与雪花一起使用,您可以使用_file_line为您的表创建一个代理键,以便惟一地标识每一行。正如开始提到的,我使用dbt_utils.surrogate_key来做这件事。

下面是一个使用部门 id 和员工 id 生成代理键的例子。

作者图片

它们通常是使用跨两个不同表的字段生成的,正如 dbt 的代理键函数的定义中提到的。

当您的表中没有主键,但需要唯一的标识符时,代理键是理想的解决方案。它们对于性能和检测历史记录中的变化非常有用。我目前正在我的表中实现它们,以确保尽可能平稳地运行增量模型。它们将在插入、更新和删除记录时帮助雪花的合并语句。

希望这能消除您对代理键和主键之间的区别的任何困惑。现在,您可以在您的数据库中成功地实现它们,对两者之间的差异及其用例充满信心。查询愉快!

Python NumPy 的 Where 和 Select 函数的区别

原文:https://towardsdatascience.com/the-difference-between-where-and-select-functions-of-python-numpy-9c81273ed5fb?source=collection_archive---------14-----------------------

实践教程

Vanesa Giaconi 在 Unsplash 上拍摄的照片

Pandas 和 NumPy 是用于数据分析和操作的两个伟大的 Python 库。它们可以说是数据科学生态系统中最受欢迎的库。

两者都提供了一些功能和方法来简化复杂的操作。在本文中,我们将讨论 NumPy 的两个这样的函数:Where 和 Select。

这些函数可用于根据列的值对列进行评估。因此,在过滤数据框或创建新列时,它们会派上用场。

让我们从导入库和创建样本数据框开始。

import numpy as np
import pandas as pddf = pd.DataFrame(
  np.random.randint(30, size=(5,6)),
  columns = list("ABCDEF")
)df.insert(0, "Cat", ["A","A","B","A","B"])df

df(作者图片)

我们使用 randint 函数来填充数据框。它由用 size 参数定义的 5 行和 6 列组成。这些值是 0 到 30 之间的随机整数。

我还想添加一个分类列作为数据框的第一列,所以我使用 insert 函数,而不是传统的创建新列的方法。

insert 函数允许使用列索引指定新列的位置。

是时候实践我们宝贵的功能了。让我们从哪里开始。

where 函数接受一个或一组条件。然后,我们可以为符合和不符合条件的行分配单独的值。

用一个例子更容易理解。

让我们基于以下条件创建一个名为“where”的新列:

  • 如果 Cat 列中的值是 A,而 B 列中的值大于 10,则新列的值为 1。
  • 对于不符合上述条件的行,新列的值为 0。

下面是我们如何完成这项任务。

df["WhereCol"] = np.where((df.Cat == "A") & (df.B > 10), 1, 0)df

df(作者图片)

我们可以增加条件的数量,也可以更改新列中的值。

where 函数能够计算一组条件的值。因此,我们只能在新列中分配两个不同的值:一个用于符合条件的行,另一个用于其他行。

select 函数更进一步。它接受多组条件。然后,我们可以为每组条件分配不同的值。因此,新列可以根据需要包含任意多的不同值。

让我们基于以下条件创建一个名为“SelectNew”的列:

  • 如果 Cat 列中的值是 A,而 B 列中的值大于 10,则新列的值为 1。
  • 如果 Cat 列中的值是 B,而 B 列中的值大于 10,则新列的值为 2。
  • 对于不符合上述条件的行,新列的值为 0。

该任务可以使用选择功能完成,如下所示:

conditions = [
  (df.Cat == "A") & (df.B > 10),
  (df.Cat == "B") & (df.B > 10)
]values = [1, 2]df["SelectCol"] = np.select(conditions, values, default=0)df

df(作者图片)

条件和值作为列表传递给 select 函数。第一个条件与第一个值相关联,第二个条件与第二个值相关联,依此类推。

默认参数用于不符合任何条件的行。

我们也可以在单个列上指定条件。再来做一个例子。

conditions = [
  (df.B % 2 == 0) & (df.B > 20),
  (df.B % 2 == 1) & (df.B > 20),
  (df.B < 10)
]values = ["first","second","third"]df["SelectCol2"] = np.select(conditions, values, default="other")df

df(作者图片)

“SelectNew2”列是基于以下条件创建的:

  • 如果 B 列是大于 20 的偶数,则它是“第一个”。
  • 如果 B 列是大于 20 的奇数,则为“第二列”。
  • 如果 B 列的值小于 10,则为“第三”。
  • 对于其他值,它是“其他”。

结论

where 和 select 函数都允许创建条件列。where 函数产生具有两个不同值的列。一个用于符合指定条件的行,一个用于另一个。

select 函数更加灵活,因为它允许根据需要创建包含任意多不同值的条件列。我们只需要分别指定每个值的条件。

感谢您的阅读。如果您有任何反馈,请告诉我。

Rebase 和 Merge 的区别

原文:https://towardsdatascience.com/the-differences-between-rebase-and-merge-30c91cd18f30?source=collection_archive---------17-----------------------

Git 问题 101

这可能是 git 用户问得最多的问题

玛丽·莱扎瓦Unsplash 上拍摄的照片

我关于我们应该使用合并还是重定基础,这个问题在社区里争论了很久。

有些人会说合并更好,因为它保留了最完整的工作历史。其他人会认为 rebase 更整洁,这使得评论者的生活更容易和更有效率。本文将解释 merge 和 rebase 之间的区别以及使用其中一种的好处。

从根本上说,合并和 rebase 服务于相同的目的,将一个分支(有时是多个分支)的变更集成到另一个分支中。当您希望在打开拉请求之前集成最新的主或开发分支时最常用。虽然目的是一样的,但是合并和 rebase 实现的方式不同。

作者图片

快速思考一下这里的目标。想象你有这样一个分支‘特性’,它是从‘基础’的‘开发’分出来的。从那时起,您已经完成了 C、D、E 的工作,并且开发已经添加了 2 个变更 A、b。现在您想要打开一个拉式请求,将‘您的工作’集成到‘开发分支’。在此之前,您必须将“开发分支”中的更改集成到“您的特性分支”中,这样您的拉取请求中就不会有冲突。

合并

作者图片

Merge 会将 develop 中的更改集成到您的要素分支中,并创建一个新的提交 F。F 是合并 develop 分支的提交,如果有冲突,会对冲突进行排序。这个方法会将 develp 分支(A 和 B)中的更改带到您的 feature 分支中。现在,您的特性分支上的提交是 C、A、D、B、E、f。您的特性分支上又添加了 3 个额外的提交。

重定…的基准

作者图片

另一方面,rebase 移动了整个特性分支,就像它从开发分支的最后一次提交开始分支一样。Rebase 将首先搜索特性分支的基础,并将该基础更改为开发分支上的最新提交,在本例中为 B,然后基于该基础重新应用特性分支上的所有提交,B。Rebase 实际上会创建新的提交,C’、D’、E’。原始提交保持不变。最后,它将特征分支指向的对象从 E 改为 E’。

利弊

这两种方法之间的最大区别是 merge 保留了工作的完整历史,包括时间顺序,而 rebase 使提交变得清晰,并且只与分支上的工作相关。当一个评审者正在评审你的 PR 时,如果你选择合并,她将会看到 A、B、C、D、E、F 提交,如果你选择重定基数,她只会看到 C、D、E。

合并具有更高的可追溯性。你可以找到所有的工作经历,不管是否与这份简历相关。但是这对于评审者来说可能是痛苦的,因为分支由许多不相关的提交组成,并且通常很难识别它们。

Rebase 真的让 PR 变得整洁和相关,没有嘈杂的提交。评审者可以很容易地发现这个 PR 是关于什么的,以及在这个分支中做了什么改变。但是,如果您想跟踪存储库的详尽历史,这可能就没什么帮助了。

Merge 具有更高的可追溯性,而 Rebase 更整洁,更便于审阅。

那么我应该用哪一个呢?

这真的取决于你的组织使用什么样的工作策略。您必须权衡重定基础的简单性的价值和合并的可追溯性的价值。很可能两者都用,在特定的情况下使用特定的方法。

从我个人的经验来看,rebase 更有利,因为它提供了一种更轻松的与团队成员合作的方式。大多数时候,我们真的应该避免在 PR 中包含与我们的工作无关的提交。这很容易导致混乱。

结论

我希望这篇文章已经消除了你对合并和重定基础的疑虑,因此你可以采用最适合你的工作流程的方法。如果你正在寻找一些更实际的例子,的这篇的这篇文章是很好的开始。

接下来,我将分享一些我在工作中发现的最有用的 Git 技巧。敬请期待!

我的 Git 系列故事:

Git 和 GitHub 初学者入门

实际操作 Git 工作流程及代码示例

我发现最有用的 5 个 Git 实践

城市中的人员流动中断能被近乎实时地看到吗?

原文:https://towardsdatascience.com/the-digital-tailwinds-of-pandemics-and-typhoons-cross-border-insights-from-facebook-mobility-data-763c493b5ecc?source=collection_archive---------57-----------------------

变更数据

使用开源脸书数据对流行病和台风的跨境观察

这项工作已经完全使用公开数据完成,并与 Kai Kaiser 合著。所有错误和遗漏都是作者的。

《2020 年》比以往任何时候都更加突出地表明,地理和公共卫生危机的发生率和后果会对人类活动造成大范围的干扰。随着大数据源的出现,有望近乎实时地为应对、恢复和最终抵御这些风险提供信息。利用来自智能手机的位置数据,我们提供了两个太平洋国家(菲律宾和越南)在面临这种挑战时人类移动的跨境比较可视化。

在广宁省的省会城市东海,农村居民为高暴露期开发了浮动避难所。作者图片。

2020 年 11 月 9 日,台风瓦姆科(VAMCO)在太平洋形成了单一的天气锋,促使数十万人撤离,乘客滞留,政府工作暂停,学校关闭,航班停飞。台风“瓦姆科”从菲律宾东部开始,横向横扫越南中部(路径如图 1 所示)。总的来说,在 2020 年,尽管政策制定者正在努力解决封锁、流动限制和其他非药物干预措施等持续存在的问题,以遏制新冠肺炎的蔓延,但太平洋地区仍经历了 10 次台风和 23 次热带风暴。大马尼拉地区经历了几十年来最严重的洪水,来自疫情的经济冲击加上房屋和基础设施的破坏,城市岛屿的食物几天都无法到达。

图一。台风“瓦姆科”穿越菲越的路径(2020 年 11 月)。来源:
喵使用 WikiProject 热带气旋/轨迹创建。背景图片来自 NASA 。来自 NOAA 的跟踪数据。

在疫情的背景下,政策指令(封锁或疏散)、不可抗力事件(摧毁房屋或基础设施)和自我保护行为(选择留在家中)在这个台风季节对人类流动和社会经济活动的“正常”模式造成了冲击。

当人们“就地躲避”(例如在疫情或极端天气期间),或被困在某个地方(例如在山洪暴发或道路网络中断期间),我们预计流动性会下降。如果下令封锁或疏散,我们可能会看到随着人们的重新安置,流动激增。按照指令,例如通常在国家公报上看到的指令,政府和决策者可能会问:哪些领域的响应最慢或最慢?是不是有些地区根本没有反应?。我们预期的区域的移动性受到影响了吗,或者其他区域的移动性也受到影响了吗?什么样的数据源可以帮助我们实时监控人类活动的变化,从灾难的来临到它的消散?

智能手机移动数据:接近实时的人体运动感知

随着智能手机在世界各地变得无处不在,来自 GPS 定位数据的见解为人们在灾难中如何移动提供了前所未有的洞察力。作为新冠肺炎加速的集体人道主义努力的一部分,脸书和谷歌等科技公司越来越多地提供数据集,使我们能够衡量人们在准备应对紧急情况时,移动性的变化是如何在地面上展开的。除了为政策制定者提供近乎实时、高度精细的本地洞察之外,用于收集和生成这些数据的共享方法还能够对跨越边界的移动性变化进行一致和全面的比较。

在时间和空间上,流动性数据的任何与危机相关的应用都将理想地满足政策执行者的两个标准。首先,结果可以以对决策者有用的方式呈现。第二,在任何给定的空间或时间粒度级别上,它们都代表潜在的当地人、地理位置和环境。另一个博客展示了如何使用我们开发的一套开源快速评估方法来评估移动数据的代表性。

在这里,通过关注台风“瓦姆科”(图 1),我们展示了脸书 移动范围地图 数据集(最初用于监测新冠肺炎的移动性影响)的新用例:测量自然灾害造成的冲击。因为这些数据从疫情开始就可以获得,它使我们能够跟踪对当地流动性的影响,即使当其他风险的表现,如自然灾害等加剧时。

越南和菲律宾从第一波到洪水的一致测量

图二。(菲律宾事件 ) (i)超强台风高尼(ii)台风瓦姆科(尤利西斯)(iii)圣诞节(iv)新年前夕(越南事件) (i)第二波封锁(ii)热带风暴林法(iii)热带风暴浪卡(iv)热带风暴索德尔(v)热带气旋莫拉菲(vi)台风瓦姆科(尤利西斯)。

脸书运动范围地图提供了两种跟踪移动性的度量标准:(I)运动的变化(在给定的一天,一个地区的运动范围或半径是多少?)和(ii)“原地不动”(有百分之多少的用户整天呆在一个地方?).在图 2 中,我们跟踪前者,从新冠肺炎的第一波到 2020 年太平洋台风季节和新年。在菲律宾,与基线相比,最初的封锁显示移动性下降了 60%,在整个疫情保持在大约 30%的下降水平——这种封锁被描述为“看不到尽头】。另一方面,在越南,第一波的全国平均降幅仅为 40%,并且仅持续了一个月(4 月至 5 月)。流动性几乎回到了基线(在某些情况下,由于活动的爆发,甚至超过了基线),直到 8 月份在岘港的第二波感染,在那里更多的局部封锁导致流动性小幅下降 20%。

考虑到这种情况,当超强台风“高尼”和台风“瓦姆科”登陆时,菲律宾的流动性已经低于“正常水平”,这两次台风都导致流动性短暂快速下降,反映了通常在圣诞节和新年前夕等低流动性日子出现的低流动性类型。

图 3a。在新冠肺炎疫情和(I)第二波一级防范禁闭期间(ii)热带风暴林发(iii)热带风暴浪卡(iv)热带风暴索德尔(v)热带气旋莫拉菲(vi)台风瓦姆科(尤利西斯)期间,在越南“呆在原地”的用户百分比。

图 3b。在新冠肺炎疫情和(I)超强台风高尼(ii)台风瓦姆科(尤利西斯)(iii)圣诞节(iv)新年前夕期间,菲律宾“呆在原地”(整天呆在一个 Bing 瓷砖里)的用户百分比

在图 3 中,我们评估了在疫情和台风季节“原地不动”的用户百分比。我们在引入封锁的时期(4 月和 5 月)看到长时间的持续峰值,在极端天气事件期间看到短暂的临时峰值。

追踪台风“瓦姆科”从形成到消散的过程

台风“瓦姆科”于 2020 年 11 月 11 日首次在菲律宾卡坦杜内斯登陆——这是本季度最具破坏性的台风。在图 4a 中,我们确定并跟踪了连续受到洪水影响的区域,首先是 Catanduanes,然后是 11 月 12 日的马尼拉市、Pampanga Bulacan、Tarlac 和 Rizal,以及 11 月 13 日的 Tugueragao 市。

图 4a。菲律宾受台风“瓦姆科”影响最严重的地区对比。最暗的红色表示与“正常”相比,移动性下降最大。

台风瓦姆科横过菲律宾后移向越南,并于十一月十五日在越南登陆。图 4b 显示了 VAMCO 如何在全国移动,在两天时间内降低了在河静、顺化、岘港、广平和广义的流动性。在这两幅图中,较深的红色阴影表示流动性下降较大。

图 4b。越南受台风“瓦姆科”影响最严重的地区对比。最暗的红色表示与“正常”相比,移动性下降最大。

开源中的移动范围图:针对复合风险的持续移动性监控

用于上述分析的移动范围图数据可在人道主义数据交换上公开获取,全球可用,并每日更新。这使得决策者几乎可以立即获得数据,具有强大的跨国可比性,并能持续监控地区层面的影响和恢复程度。虽然运动范围图最初是为了测量新冠肺炎疫情之后的流动性变化而发布的,但我们说明了该数据是一个独特的复合指标,它内在地将多次冲击对流动性的影响分层。与其他一些数据集相比,数据集在面对事件时不需要被触发或激活。

这些信息在灾难应对周期的每个阶段对决策者和地方政府都至关重要,从确定紧急情况发生时受影响最严重的地区(预计受影响的地区与实际受影响的不同吗?),以跟踪当地恢复率(哪个城市或城镇恢复最快?),识别长期损害,并最终“重建得更好”。为了扩大这些数据在决策环境中的应用和采用范围,我们与脸书永久数据团队合作,发布了一个基于 Python 的灾难分析教程

参考

[1].W. Maloney 和 T. Taskin,新冠肺炎期间自愿与强制的社会距离和经济活动,VoxEU。

[2] K .凯泽和 T. C .佩肖托,政府如何利用数据对抗疫情及其伴随的信息学术,世界银行博客。

[3].汗和凯泽。移动数据的代表性如何?脸书灾难地图数据的快速验证

[4].M. Khan 和 K. Kaiser,人们在灾难中如何移动?
关于脸书运动范围地图新用例的教程。

承认

这项分析是由世界银行与脸书数据公司合作进行的。特别感谢澳大利亚政府外交贸易部(DFAT)通过越南新冠肺炎社会经济响应、恢复和复原大数据观察站对这项工作的支持,这是澳大利亚世界银行在越南的战略伙伴关系第二阶段的一部分。所有的错误和遗漏都是作者的。

葡萄酒结构形式的发现

原文:https://towardsdatascience.com/the-discovery-of-wines-structural-form-cb92a103b411?source=collection_archive---------27-----------------------

使用智能算法实现数据驱动的可视化

图片由作者提供。

你好。今天,我将介绍如何将 Kemp & Tenembaum 卓越的“形式发现”算法应用于葡萄酒数据集。最终,这提供了一个数据驱动的地图来根据我们的口味选择葡萄酒。如果你像我一样,喜欢数据科学、机器学习、认知和/或葡萄酒爱好者,那么你可能会对这篇文章感兴趣。

免责声明:我绝不是暗示这里采用的方法是最好的。事实上,如果你知道可以改进的方法,我很乐意听听!]

首先,像每个食谱一样,我们将从我们需要的东西的清单开始:

葡萄酒数据集 ( 免费提供 此处 )

Python ( 我用 PyCharm )

肯普&特南鲍姆算法 ( 此处 )

Graphviz (此处https://graphviz.org/download/**:确保下载的版本包含* neato )*

Matlab

本质上,在他们的工作中,Kemp 创造了一种算法,可以找到数据集的最佳结构表示,没有任何关于这个维度的假设和指示。它通过将输入数据组织成 8 种“基本形式”并给每种形式分配一种分数来实现这一壮举,以便找到最符合数据的形式。

这些特定领域的形式是:分区、顺序、环、层次、链、树、网格和圆柱。下面描述的每个原型都是从图论中派生出来的,并且有自己特定的规则来指导数据簇之间的关系。如果这听起来令人困惑,不要烦恼!下面我们将把这些有点抽象的单词和一个实际的例子联系起来(我们不会深入论文的细节,尽管)。

图改编自 PNAS 的“结构形式的发现”,在知识共享下出版。

在论文中,作者提供了几个使用不同数据集的工作示例,但是我觉得尝试在新数据上使用它会很有趣。为了寻找一个合适的数据集,我前往 kaggle ,在那里人们可以找到这种类型的东西。“葡萄酒评论”数据集引起了我的注意,因为它包含了人们可能用来作为算法特征的信息类型,所以葡萄酒不是?**

该数据集包含 260,000 瓶葡萄酒,每瓶葡萄酒的信息包括名称、品种、原产国、价格,更重要的是,还有侍酒师撰写的评论。我认为可以找到一种方法来提取所有这些评论中的重复出现的单词,然后将这些单词作为特征输入到算法中

要做到这一点,人们可以使用部分流程来生成如今似乎无处不在的“文字云”。

这里有一个单词云的例子。你这辈子应该至少看过 一部 一部。图片由 Alberto Frigo 制作,公共领域

想象一下当我搜索“python wordcloud 教程”时的难以置信,第一个结果是一个使用与我选择的数据集完全相同的数据集的指南!初学者的运气最好。

无论如何,我们将使用这种方法提取侍酒师用来描述葡萄酒口味的最常见的词,将这些特征分配给一系列葡萄酒品种,将其输入 Kemp & Tenenbaum 的算法,并看看它如何为我们安排它们。简单。

好的,我们可以从流水线的逐步分解开始。

第 1 至 10 点为基本数据操作和 wordcloud 设置,第 11 至 19 点为算法设置矩阵并输入,第 20 点为结果

1。按照 Python 的习惯,我们通过导入必要的 ( 这样称呼是因为它们实际上包含了做事情的代码)来开始脚本。令人震惊的是,在导入之前,需要安装软件包。你如何做取决于你如何使用 Python。我就简单提一下在 PyCharm 里怎么做。基本上每个包的安装都涉及到终端中编写的单行代码,一般结构为“pip install nameofthepackage”(作为参考,* 此处 可以找到安装各种 builds 的熊猫的说明)。需要的包是 matplotlib 来帮助我们制作图表, numpypandas 来处理操作数据, scipy.io 转换 Python 输出以在 Matlab 中使用,以及 tkinter 允许我们制作一个菜单来从中选择内容。我猜你能搞清楚 wordcloud 有什么用。*

*import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.io as sio
import tkinter as tk
from wordcloud import WordCloud, STOPWORDS*

当我们将包作为 something导入时,这意味着我们可以引用那个something来访问包中的代码,因此它通常是名称本身的缩写。只是为了打字少一点。

2。现在我们可以将数据集*加载到 Python 中。我假设它已经从 kaggle 下载,保存在我们工作的目录中,并命名为 winedata1 和 winedata2,因为出于某种原因,数据集被分成两半。*

df1 = pd.read_csv("winedata1.csv")

就像这样,我们将文件“winedata1.csv”中包含的所有内容都赋给了名为“df1”的变量。这是通过一个 pandas 函数(read_csv)完成的,我们通过调用导入时为 pandas 选择的缩写( pd )来访问它。如果您想知道什么是 csv 文件,请考虑 excel 表格。如果你想知道什么是 excel 表格,可以把数字和单词排列成有行和列的表格。如果你想知道什么是数字、表格、行和列…嗯,嗯..没关系。

无论如何,我们将对数据集的后半部分也这样做:

df2 = pd.read_csv("winedata2.csv")

然后,我们将这两个独立的数据帧结合起来。一个新词)通过使用另一个 pandas 函数来完成,并恢复整个数据集:

dataset = pd.concat([df1, df2])

3。正如我之前提到的,这个数据集包含了世界各地的葡萄酒。如果我们根据葡萄酒的生产国来缩小我们使用的葡萄酒的范围,这可能是最好的,因为某个地方生产的解百纳可能与其他地方生产的解百纳在特征上有所不同。

有比弹出窗口更好的方法吗?你可以滚动窗口,从中选择一个国家。我不这么认为。

在此之前,最好知道数据集中有多少个国家。我们很懒,所以我们让计算机来统计这个(数据集的国家列中特有的字数),并告诉我们(打印)。

*print("There are {} countries producing wine in the whole dataset, please choose one by selecting it from the list"
" and pressing enter".format(len(dataset.country.unique())))*

接下来,我们将使用 tkinter 包(tk)设置弹出窗口

*window = tk.Tk()
window.title(‘Wine producing countries’)
window.geometry(‘100x150’)
tiny_list = tk.Listbox(window)
tiny_list.pack(expand=True, fill="both")
countries = dataset.country.unique()for item in range(len(countries)):
    tiny_list.insert("end", countries[item])

tiny_list.select_set(0)
tiny_list.focus_set()*

我们还需要编写一个小函数,允许我们从弹出窗口中选择一个国家,并在完成后关闭它。

*def exit_gui(event):
    global choice
    choice = tiny_list.curselection()
    window.destroy()*

最后,我们可以运行窗口,让机器知道我们的选择将通过按下回车键发出信号,并让它通知我们所做的选择。

*window.bind("<Return>", exit_gui)
window.mainloop()

print("Wines from", countries[choice], "were chosen.")*

作者图片

在本教程中,我选择了意大利葡萄酒,但是代码应该可以很好地运行大多数选择。然而,如果选择了一个葡萄酒很少的国家,可能会有问题,所以不要向下滚动太多。

4。现在,让我们用我们选择的国家的所有葡萄酒瓶数据制作一个变量。我们称它为葡萄酒,因为我们还能怎么给它命名?这是我们从现在开始要做的。

*wines = dataset[dataset.country == countries[choice]]*

此外,每种酒品种都有多个瓶子,所以打印出这些品种是个好主意。

*print(wines.groupby("variety").describe())*

就意大利葡萄酒而言,品种中有一些“T20”混合“T21”。由于第一个目标是将葡萄酒品种与它们的口味特征相匹配,因此建议直接剔除这些葡萄酒,因为它们的风味会因“混合”而有很大差异,可以归为一个品种。

*wines = wines[wines.variety != "Red Blend"]
wines = wines[wines.variety != "White Blend"]
wines = wines[wines.variety != "Sparkling Blend"]*

去除数据集中少于 20 个条目的品种也是一个好主意,因为没有足够的数据来评估它们的味道。

*wines = wines.groupby("variety").filter(lambda x: len(x) > 20)*

5。在这一部分中,我们关注数据集中的另一个问题:一些品种的名称略有不同,但实际上是相同的。例如,一些葡萄酒被标为“长相思”,而另一些则被标为“长相思”,其实它们指的是同一个品种。这种问题对于大型数据集来说很正常,需要解决。

下面的代码在所有品种的名字中寻找相似之处,并询问用户如果它们部分匹配时想做什么,给出 3 个选项供选择:

[1]将名称相似的两个品种合并(并选择保留哪个名称)。

[2]从数据集中移除两者之一(并选择哪一个)。

[3]无视它们,继续生活。

一旦完成,程序会告诉我们剩余品种的数量。

*varietylist = sorted(wines.variety.unique(), key=len)for first_index in range(len(varietylist)):
    try:  
        for second_index in range(first_index + 1, len(varietylist)):  
            if varietylist[first_index] in varietylist[second_index]:
                first_rep = varietylist[first_index]
                second_rep = varietylist[second_index]
                print('\n detected a repetition between', first_rep, 'and', second_rep)
                choice = input('How would you like to proceed? [1]Rename (merge), [2]Remove, [3]Ignore')
                if int(choice) == 1:
                    subchoice = input(
                        'Would you like to [1]assign ' + first_rep + ' to ' + second_rep + ' or [2]viceversa?')
                    if int(subchoice) == 1:
                        wines.loc[wines['variety'] == first_rep] = second_rep
                    elif int(subchoice) == 2:
                        wines.loc[wines['variety'] == second_rep] = first_rep

                if int(choice) == 2:
                    menu = list([first_rep, second_rep])
                    subchoice = input('Which type would you like to drop?' +
                                      ' [1]' + first_rep + ' has' + ' ' +
                                      str(len(wines.loc[wines['variety'] == first_rep])) + ' entries' +
                                      ' or ' + '[2]' + second_rep + ' has' + ' ' +
                                      str(len(wines.loc[wines['variety'] == second_rep])) + ' entries')

                    wines = wines[wines.variety != menu[int(subchoice) - 1]]
                if int(choice) == 3:
                    continue
    finally:
        continueprint("there are", len(wines.variety.unique()), "varieties of wine left in the data")*

6。好了,是时候我们制作一个*来粗略看看我们正在处理的数据了。为此,我们使用 matplotlib,它将输出如下图所示的图形。*

*plt.figure(figsize=(15, 10))
wines.groupby("variety").size().sort_values(ascending=False).plot.bar()
plt.xticks(rotation=80)
plt.xlabel("Type of Grape")
plt.ylabel("Number of Wines")
plt.show*

一个柱状图让我们快速感受每个葡萄酒品种(横轴)有多少种葡萄酒(纵轴)。图片作者。

7。如果你看一下数据集,你会发现还有很多我没有提到的信息。事实上,它对我们的目的毫无用处,我们将把它从“葡萄酒”数据框架中删除。怎么会?嗯,使用 drop 命令和一个我们认为不再需要的列名列表。

*wines.drop(
    ["country", "winery", "designation", "province", "region_1", "region_2", "price", "points", "taster_name",
     "taster_twitter_handle", "title"], inplace=True, axis=1)*

8。这里 wordcloud 进程开始了,它将寻找给定文本中最常见的单词。首先,所有品酒师对每瓶酒的评论都被合并成一个单一的、非常大的文本(本例中为 700 万字)。由于这些单词中有许多不是美味口味特征,我们制作了一个过滤器来阻止一些(停用词)并避免它们出现在结果中。然后,单词云被生成

*text = " ".join(review for review in wines.description)
print("There are {} words in the combination of all reviews.".format(len(text)))stopwords= set(STOPWORDS)
stopwords.update(["drink", "now", "wine", "flavor", "flavors", "show", "hint", "sangiovese", "expression", "delivers", "of",
             "open", "made", "quality", "end", "layer", "generous", "aromas", "occasion", "nose", "carry", "over", "a",
             "offer", "chardonnay", "offers", "make", "nose", "cabernet sauvignon", "merlot", "through", "with", "now",
             "close", "palate", "texture", "feel", "mouth", "mouthfeel", "year", "boast", "touch", "the", "elegant",
             "well", "one", "pretty", "pinot grigio", "lead", "vintage", "personality", "boasts", "savory", "and", "is",
             "imported", "along", "load", "years", "give", "intensity", "made", "followed", "whiff", "elegant", "has",
             "pair", "note", "aroma", "this", "suggest", "with", "after", "aged", "dominate", "opens", "fragrance",
             "those", "who", "enjoy", "that", "recall", "pair", "time", "come", "around", "completed", "by",
             "but", "find", "delicious", "blast", "still", "nebbiolo", "glass", "already", "opens", "doles", "note",
             "less", "which", "such", "it", "despite", "care", "gone", "framed", "in", "drinks", "packed", "packs",
             "bouquet", "local", "italian", "finish", "aromas", "assertive", "delightful", "evolved",
             "evolves", "italy", "would", "intensity", "genuine", "wonderful", "smelling", "manifested", "bursting",
             "modern", "solid", "qualities", "more", "than", "terms", "here", "ambitious", "version", "unique", "into",
             "southern", "northern", "enough", "really", "very", "plenty", "touch", "particularly", "probably",
             "opulent", "attractive", "should", "be", "drunk", "any", "doesn't", "marked", "excellent", "bloated",
             "steady", "on", "crowd", "packed", "grapes", "rich", "beautiful", "presents", "approachable", "shows",
             "you", "although", "need", "along", "alongside", "accompanied"])wordcloud = WordCloud(stopwords=stopwords, max_words=1000).generate(text)*

这部分有点手动,在某种意义上,我还没有找到一种以令人满意的方式从我们的词云中提取味道特征的自动方法,因为无论你放多少停用词,一些不相关的词仍然会通过。所以,你要么相信我,要么自己看看 wordcloud.words_ 看看侍酒师赋予葡萄酒的最常见/最相关的味道特征是什么(我在各个生产国都这么做了)。无论如何,这是味道特征列表:

*features = list(['description', 'variety', 'sweet', 'black cherry', 'tobacco', 'coffee', 'clove', 'chocolate', 'rose',
                 'cinnamon', 'oak', 'leather', 'peach', 'red berry', 'thick', 'blue flower', 'white flower', 'licorice',
                 'plum', 'vanilla', 'almond', 'wild berry', 'alcohol', 'blackberry', 'cola', 'honey', 'toast', 'prune',
                 'pear', 'spice', 'black pepper', 'white pepper', 'apple', 'creamy', 'soil', 'nectarine', 'truffle',
                 'smooth', 'citrus', 'stone fruit', 'acidity', 'tannin', 'simple', 'floral', 'mint', 'mocha',
                 'red cherry', 'orchard fruit', 'raspberry', 'wood', 'menthol', 'exotic', 'blueberry', 'yellow fruit',
                 'bitter', 'mineral', 'crisp', 'violet', 'herb', 'anise', 'apricot', 'spring flower', 'espresso', 'dry',
                 'forest', 'lemon', 'tangerine', 'nut', 'astringent', 'thyme', 'acacia', 'saline', 'kiwi', 'bodied',
                 'structured', 'dried', 'cantaloupe', 'rosemary', 'earth', 'cocoa', 'sage', 'cigar', 'currant', 'sour',
                 'barrique', 'hazelnut', 'maple syrup', 'mushroom', 'balsamic', 'nutty', 'toasted', 'syrupy', 'cedar',
                 'smoky', 'tropical', 'gentle', 'delicate', 'easy drinking', "strawberry", "orange", "figs", "silky"])*

还不错。在几秒钟内,我们压缩了超过 700 万个单词,精确地得到了 100 个。如果你在开始时注意到了“描述”和“变化”,这是我为数据帧操作做的一个变通方法,很快就会被放弃。

9。如前所述,Data Camp 有一个教程,教你如何从相同的数据集中生成一个 wordcloud,以及如何通过 Python 把它放到一些互联网下载的图片中。然而,你可能会决定查看一下艺术字中的品味功能列表,这样会得到更快更好的结果,就像这样:

更漂亮的文字云。图片作者。

10。我们已经完成了计划的第一部分,即从数据集中提取葡萄酒的风味。现在,我们需要程序将这些味觉特征分配给各种葡萄酒。我们首先在数据框架中制作提取的特征列,然后对于每一瓶葡萄酒,我们检查其侍酒师的评论是否包含任何这些特征,这将为我们提供一个很好的“逻辑”,是/否(1/0),矩阵指示一瓶葡萄酒是否具有某种味道特征。

*wines = wines.reindex(columns=features)

for feats in range(2, len(features)):
    wines[features[feats]] = wines['description'].str.contains(features[feats])*

真快。现在我们可以从数据中删除侍酒师的描述,因为我们已经完成了。讨厌游戏,不讨厌玩家。

*wines.drop('description', inplace=True, axis=1)*

11。最后,我们制作了一个新的数据框架,汇总了所有这些 1 和 0,并根据不同的葡萄酒对数据进行了压缩!这意味着,如果我们的数据集有两瓶 Sangiovese 葡萄酒,并且都有“单宁”作为特征,新矩阵将有一个 Sangiovese 行,在“单宁”列中有 2,而如果只有一瓶有“巧克力”,现在我们将在“巧克力”列中有 1,如果都没有“桃子”,则在该列中有 0,以此类推所有特征和品种。我们称之为品味事件*。*

*tasteoccurrences = wines.groupby("variety").sum()*

12。多亏了这个项目,我了解到品酒师和学者有一个共同的特点:写作时,他们会打开一本辞典,寻找花哨的同义词,以获得复杂性,减少重复。除非他们真的打算让‘咖啡’、‘浓咖啡’和‘摩卡’是不同的口味,我对此表示怀疑。因此,我们需要总结和丢弃所有这些多余的特征。

*tasteoccurrences["coffee"] = tasteoccurrences["coffee"] + tasteoccurrences["espresso"] + tasteoccurrences["mocha"]
tasteoccurrences["mint"] = tasteoccurrences["mint"] + tasteoccurrences["menthol"]
tasteoccurrences["floral"] = tasteoccurrences["floral"] + tasteoccurrences["spring flower"] + tasteoccurrences[
    "white flower"]
tasteoccurrences["citrus"] = tasteoccurrences["citrus"] + tasteoccurrences["lemon"] + tasteoccurrences["tangerine"]
tasteoccurrences["structured"] = tasteoccurrences["structured"] + tasteoccurrences["bodied"]
tasteoccurrences["soil"] = tasteoccurrences['soil'] + tasteoccurrences["earth"]
tasteoccurrences["chocolate"] = tasteoccurrences["chocolate"] + tasteoccurrences["cocoa"]
tasteoccurrences["tobacco"] = tasteoccurrences["tobacco"] + tasteoccurrences["cigar"]
tasteoccurrences["alcohol"] = tasteoccurrences["alcohol"] + tasteoccurrences["barrique"]
tasteoccurrences["nut"] = tasteoccurrences["nut"] + tasteoccurrences["nutty"]
tasteoccurrences["toasted"] = tasteoccurrences["toasted"] + tasteoccurrences["toast"]
tasteoccurrences["syrupy"] = tasteoccurrences["syrupy"] + tasteoccurrences["maple syrup"]
tasteoccurrences["wood"] = tasteoccurrences["wood"] + tasteoccurrences["cedar"]
tasteoccurrences["delicate"] = tasteoccurrences["delicate"] + tasteoccurrences["easy drinking"] +
                               tasteoccurrences["simple"]
tasteoccurrences["smooth"] = tasteoccurrences["smooth"] + tasteoccurrences["silky"]

tasteoccurrences.drop(["espresso", "menthol", "mocha", "spring flower", "tangerine", "lemon", "bodied", "white flower",
                       "earth", "cocoa", "cigar", "barrique", "nutty", "toast", "maple syrup", "cedar", "simple",
                       "silky",
                       "easy drinking"], inplace=True, axis=1)*

13。对于最后的数据操作部分,我们将归一化*总得分。这是通过减去平均值并除以标准偏差来完成的。首先,我们需要用空值替换零,否则会影响平均值。*

*tasteoccurrences.replace({0: np.nan}, inplace=True)*

由于下面的规范化(或标准化),我们的新矩阵(最初命名为* datamatrix )中的值将显示每个葡萄酒品种的特征与平均值的标准差。这被称为 Z 得分,而T21 的大多数统计数据都归结于此。我们可以用它来指导选择每个品种保留哪些特征。*

我在代码中设置了一个非常宽松的半标准差阈值(> = 0.5),以拒绝那些很少与某种变化相关联的特征。作为参考,我们称之为“统计显著性”的是距离平均值 2 个标准差的距离,所以我们在这里是 1/4。

*datamatrix = pd.DataFrame(columns=tasteoccurrences.columns)for grapes in range(len(tasteoccurrences)):
    datamatrix.loc[grapes, :] = (tasteoccurrences.iloc[grapes, :] - tasteoccurrences.iloc[grapes,:].mean()) / tasteoccurrences.iloc[grapes,:].std() >= 0.5*

14。然后,行的名称(即葡萄酒品种)从 tasteoccurrences 转移到 datamatrix,并将其内容指定为整数(又名数字),否则当我们去那里时,Matlab 会不必要地将它们视为字符串*(又名文本),从而使我们感到厌烦(很快)。*

*datamatrix.index = tasteoccurrences.index
datamatrix = datamatrix.astype(int)*

并去掉所有没有被分配到任何葡萄酒品种的风味。

*datamatrix = datamatrix.reindex(columns=datamatrix.columns[datamatrix.sum() != 0])*

15。此外,理想情况下,该算法需要比entities(葡萄酒品种)更多的特性(即,比更多的*)。所以,我们做一个快速循环,去掉一些变量,直到满足这个条件。在这里,我放弃了功能较少的品种,只是另一个任意的选择。*

*while datamatrix.shape[0] > datamatrix.shape[1]:
    lowfeat_wines = datamatrix.sum(axis=1) < (datamatrix.sum(axis=1).mean() - (datamatrix.sum(axis=1).std()))
    datamatrix.drop(datamatrix[lowfeat_wines].index, inplace=True, axis=0)*

16。我们设置矩阵,分别保存行和列的名称,并将其转换到 Matlab。很明显,如果你想运行这个,保存它们的路径需要改变。

*datamatrix = datamatrix.reindex(columns=datamatrix.columns[datamatrix.sum() != 0])names = np.sort(list(datamatrix.index))
mdic = {"names": names}
sio.savemat("wine_names.mat", mdic)

datamatrix.to_csv(r'C:\Users\stempio\PycharmProjects\AdditionalSources\winedatapyt.csv', index=False)*

Matlab 的最后阶段已经准备好了,算法很容易设置。对我来说,最棘手的部分是获得正确的 graphviz 版本并正确安装。

17。通过 Matlab ,我们将我们的 Python 输出文件移动到 Kemp & Tenembaum 的算法数据文件夹所在的目录下。

*kemp_path = 'C:\Users\stempio\Documents\MATLAB\formalgo\data';

movefile('C:\Users\stempio\PycharmProjects\AdditionalSources\winedatapyt.csv' , kemp_path)
movefile('C:\Users\stempio\PycharmProjects\AdditionalSources\wine_names.mat' , kemp_path)*

18。我们传送到那个目录,并对数据执行一些小的操作。算法的饭做好了,这是最后的盐。

马西莫·德安东尼斯为本文精心制作。

*cd(kemp_path)
load('wine_names')

names = cellstr(names);
temp = readtable('winedatapyt.csv');
features = temp.Properties.VariableNames';
data = table2array(temp);save('italian_wines', 'data', 'features', 'names')

cd ..*

我们需要对算法的 masterrun.m 文件做一个小小的编辑,修改第 35 行。

*thisdata = 21*

类似地,我们修改 setps.m ,按照已经存在的格式,在列表的第 1227 行添加数据文件的名称(在本例中为‘Italian _ wines’)。

就像这样,我们可以在命令窗口中键入以下命令来运行该算法:

*masterrun*

它会施展魔法,试图找到理想的结构形式来排列它所接收的数据。最棒的部分是,它实际上向我们展示了它是如何试图解决这个问题的,如果你不觉得这很有趣,我怀疑你是否已经做到了这一步,但不管怎样,还是要向你致敬!

19。一旦完成(可能需要一段时间),我们感兴趣的输出将在变量 modellike 中,特别是在它的第 21 列(上面我们设置的 thisdata 的数量)。我们对得分最高的结构形式感兴趣,所以我们寻找跨行的最大值。然后我们用它的名字画出来。

*[~, idx] = max(modellike(:,21));draw_dot(structure{idx,21}.adj, names{21})*

瞧。我第一次尝试运行它时,它给了我一个环形结构,这是非常显著的,因为涉及味道和风味的图形通常被描述为轮子。它也跟着葡萄酒的颜色走,却没有任何提示!

“意大利葡萄酒圈”,听起来有点不靠谱。作者图片

然而,当我改进代码和添加特性时,算法也改变了它的输出,在最终的脚本中,它输出了一个链。因此,结果会因数据而异,但仍然遵循颜色和味道的倾向。

“意大利葡萄酒连锁店”,这可能是一个酒类商店的名字。图片作者。

20。诚然,Kemp & Tenenbaum 算法的输出看起来不如其理论好,也没有传达太多关于实体(葡萄酒)和特征(风味)的信息。所以我向我的一个好朋友寻求建议来改善它的外观。事不宜迟,下面是最终的表单:

看起来有点像地铁地图,不是吗?请小心葡萄。

根据侍酒师对意大利葡萄酒口味的判断,对数据集中的意大利葡萄酒进行信息丰富、数据驱动的结构化表示。垂直区带包含其中的节点共享的特征,而节点显示连接到它们的所有变体共享的一些特征。当然,这些品种本身有更多独特的特征,但为了使图表更整洁,没有包括这些特征。

TL;我们已经实施了最初的计划:从一个包含 260,000 种葡萄酒的相对较大的数据集中提取味道特征,并将其分配给各个品种,然后我们礼貌地要求一个智能算法以最佳方式排列它们。可以肯定地说,如果你喜欢上图中的某一种葡萄酒,比如说 Nebbiolo,你更可能喜欢 Sangiovese 而不是 Frappato。当然,对于数据集中的瓶子来说尤其如此。

你可以想象在一个更深入的模型上继续工作,在一个瓶子一个瓶子的水平上完成,而不用按品种来折叠葡萄酒。恕我直言,这导致降低了模型的拟合度。

如果你知道任何有这类数据的葡萄酒销售网站,他们可能会有兴趣雇佣一名初级数据科学家(看看你维维诺les grapesTWIL 😊),让我知道。我可能会接受用葡萄酒支付部分费用。

感谢阅读!

迪士尼算法:一个有监督的机器学习程序

原文:https://towardsdatascience.com/the-disneyland-algorithm-a-supervised-machine-learning-program-67c730cd62d5?source=collection_archive---------24-----------------------

我教了一台机器如何选择你在迪斯尼乐园的下一站

图片由作者提供

简介:

迪士尼乐园有 30 种不同的游乐设施,你的一天看起来有无限的可能性。嗯,不完全是无止境的,但是很接近了。准确地说,如果你当天只乘坐 12 次,有 86,493,225 种可能性(30 选 12)。这给迪士尼乐园的常客或对数据科学感兴趣的个人留下了一个有趣的问题:迪士尼乐园理想的一天是什么时候?

工作原理:

为了尝试回答这个问题,我将一个神经网络应用到我的 MATLAB 模拟中,该模拟来自我的上一篇文章通过人口模拟预测迪士尼乐园的等待时间。那篇文章深入探讨了模拟是如何工作的,但本质上,它跟踪了迪士尼乐园周围的不同群体,因为他们做出了乘坐选择,并记录了他们一天的运行分数。更高的分数意味着他们有更好的一天。

为了将神经网络应用于这些数据,我将它设计成只有一层,有一个输出层和一个输入层。输入层由 60 个节点组成,其中 30 个节点代表该组的骑行历史,30 个节点代表该组刚刚骑过的骑行。由 30 个节点组成的输出层将是所有可能的下一次乘坐。这个想法是,给定你已经骑过的和你刚刚骑过的,机器将选择你的下一次骑行。

为了选择训练数据,我希望查看迪士尼乐园模拟日的前 10%分数。这些群体显然做出了导致更美好一天的决定,所以我们想训练神经网络做出同样的决定。对于排名前 10%的每一组,我将从他们的乘车顺序中抽取 5 个样本。在每个示例中,我将选择乘坐作为正确的输出,之前的乘坐以及总的乘坐历史作为输入。这将为神经网络产生大约 2,750 组不同的训练数据(大约 5,500 组的 10%,每组 5 个样本)。下面是如何从模拟数据矩阵中收集每个单独的训练数据的示例。

training_data = zeros(num_groups * 5 * 0.1, 60); % initializes the training matrixcorrect_output = zeros(num_groups * 5 * 0.1, 30); % initializes the output matrixindex2 = 0; % initializes an indexindex3 = 0; % initializes an indexridebefore = 0; % establishes a variableoutput_ride = 0; % establishes a variablerides_before = []; % establishes an arraytop10 = prctile(group_data(:,43),90);for a2 = 1:num_groups % for all groups in parkif group_data(a2,43) >= top10 % if score is in top 10%for a1 = 1:5 % collects 5 samplesindex3 = 0; % resets an indexrides_before = []; % clears the ride history arrayindex2 = index2 + 1; % up one increment for data matrixfor a3 = 1:40 % for up to 40 rides in one dayif ride_history(a2,a3) ~= 0 % counts how many rides the group has been onindex3 = index3 + 1;endendrandom_num3 = randi(index3); % picks a random number from that countoutput_ride = ride_history(a2,random_num3); % finds corresponding ride for that random numberif random_num3 ~= 1 % if it's not the first ride of the dayridebefore = ride_history(a2, random_num3 - 1); % sets this variable to the ride before the next choicefor a4 = 1:(random_num3 - 1)rides_before(length(rides_before) + 1) = ride_history(a2,a4); % sets ride history to all rides before next choiceendelseridebefore = 0; % resets valuerides_before = []; % resets arrayendfor a5 = 1:30 % turns previous ride number into binary string from 1-30if a5 == ridebeforetraining_data(index2,a5) = 1; % all 0's except for previous rideendendfor a6 = 1:length(rides_before) % turns ride history numbers into binary string from 1-30for a7 = 1:30if rides_before(a6) == a7training_data(index2,a7 + 30) = 1; % all 0's except for rides previously riddenendendendfor a8 = 1:30 % turns chosen ride into binary string from 1-30if a8 == output_ridecorrect_output(index2,a8) = 1; % all 0's except for group's chosen rideendendendendend

现在我们有了 60 个输入节点值和相应的 30 个正确的输出值。我们现在可以使用有监督的机器学习算法,我们的学习率设置为 0.05。我将使用 sigmoid 激活函数来保持所有输出值在 0 和 1 之间。下面是我的监督学习算法的代码。

dweights = rand(60,30); % assigns random weights to a 60x30 matrixalpha = 0.05; % learning rate set to 0.05epochs = 5000; % repeats for training datafor ii = 1:epochs % loop for each epochapprox_output = 1./(1 + exp(-1 * training_data * dweights)); % finds approximate outputerror = correct_output - approx_output; % finds errordelta = (approx_output .*(1-approx_output)).* error; % applies activation function (sigmoid)ad = alpha .* delta; % extra step for alpha times deltatrans_training = transpose(training_data); % transposes training data matrixdweights = dweights + (trans_training * ad); % updates weightsendsave('Weights.mat','dweights'); % saves new weights after all epochs

该代码通过权重矩阵强化了良好的决策。权重将开始收敛到某些值,这将有助于机器做出决策。下面是 3 个不同权重随时间收敛到特定值的示例。

图片由作者提供

现在,如果你给算法你刚刚骑过的车,以及你之前所有的车,它会给出接下来的前三个车供你选择。让我们看看理想的迪士尼乐园日是什么样子。

理想的迪士尼乐园日:

从我以前的文章预测迪士尼乐园:让你的迪士尼日更美好的策略中我们知道,越小的团队每天乘坐的次数越多。以下是其他一些可以考虑的建议:

  • 提前到达——在公园开放前到达的团队平均每天乘坐的次数更多。
  • 选择正确的第一次乘坐——太空山、马特宏峰和印第安纳琼斯被选为第一次乘坐时,每天会有更多的人乘坐。
  • 选择距离更近的骑行——在骑行之间走得更少的群体有更好的机会获得更高的分数。

假设你选择太空山作为你一天的第一站。这是离入口最近的大型游乐设施之一,所以如果你提前到达,它总是一个不错的选择。在离开太空山之后,你进入你刚刚乘坐的游乐设施的程序[24],以及你的游乐设施历史[24](太空山在模拟中是游乐设施 24)。算法选择…马特宏峰。这是有道理的。这是下一个最接近的大型游乐设施,而且很有可能,等待的时间不会太长。在马特宏峰之后,你输入[16]作为你刚刚骑过的骑行,输入[24,16]作为你的骑行历史。马特宏峰之后的下一部是……加勒比海盗。这个循环可以在公园里持续一整天,算法不断地给你 3 个最好的游乐设施供你选择。

根据迪士尼乐园游乐设施选择算法,对于每天预期总游乐设施中最好的前 5 个游乐设施,以下是接下来的 11 个游乐设施:

图片由作者提供

该算法在排名靠前的群体中发现了一个普遍模式。如果你马上淘汰了前五名中的两个,你将在公园里度过愉快的一天。此外,该算法还发现,选择离你刚刚骑过的车更近的车会节省你的时间,从而提高你的分数。注意马特宏峰总是跟着太空山,或者加勒比海盗和大雷山总是挨着。

实际上,计划和实现理想的迪斯尼乐园日几乎是不可能的。乘车故障、上厕所和在餐厅长时间等待会让你很难遵循迪士尼乐园的算法。然而,有一些大多数前 10%群体做出的决定,你应该考虑自己做出。

前 10%的乘车选择决策:

下面显示了得分最高的小组做出的乘车选择。

图片由作者提供

排名靠前的几组分别是《大雷山》(4)、《加勒比海盗》(21)、《鬼屋》(10)。所有这些游乐设施都彼此靠近,往往全天等待时间适中,同时仍然提供良好的刺激。

排名前 10%的团体倾向于首先登上印第安纳琼斯、太空山和马特宏峰,然后通过乘坐上述中等等待时间的游乐设施来积累分数。这些是通常在一天内进行多次的乘坐。

从重要的游乐设施开始,以重要的游乐设施结束。骑中等等待时间骑多次在一天当中。在一天中最热的时候乘坐室内游乐设施。所有这些事情都是由模拟中最好的小组完成的。

结论:

迪士尼乐园算法是结束我的迪士尼乐园数据分析 3 部分系列的好方法。将神经网络应用到我的模拟中被证明是一项具有挑战性,但也是值得的任务。它表明,在从我的模拟中获得的成千上万的原始数据点中,有一些重要的模式,你可以在下一次迪士尼之旅中实施。

咖啡的双重性:萃取物和过滤器

原文:https://towardsdatascience.com/the-duality-of-coffee-an-extract-and-a-filter-5a6a83777e5e?source=collection_archive---------33-----------------------

咖啡数据科学

不能喝,但很有趣

之前,我尝试过通过将浓缩咖啡放回圆盘中提取更多的咖啡来给我的浓缩咖啡注入涡轮增压。相反,我发现用过或用过的咖啡渣会过滤咖啡。结果是浓度较低的浓缩咖啡。

我想更好地理解什么东西既可以用来提取浓缩咖啡,又可以用来过滤浓缩咖啡。

所以我设计了一个基于断奏篡改镜头的实验。我一直在拉断奏捣实的镜头几乎有一年了,简单地说就是先捣实一半的咖啡渣,然后分别捣实另一半。我还在中间使用了纸过滤器,这意味着拍摄完成后,冰球的顶部和底部很容易分开。

不连续的篡改:通用流程图

试验设计

将咖啡渣放在用过的咖啡渣上,我们可以测量出有多少咖啡滞留在过滤中。

制作用过的地面

这个实验的关键部分是喝没有什么可提取的咖啡。我拿了一个用过的冰球,用牙签混合,然后再次通过机器。

第二轮提取以取出剩余的所有东西。

然后我拿起那个冰球,在托盘上捣碎,放入烤箱低温烘干。

我不得不用两个橡胶圆盘来得到 18 克用过的咖啡。对于这两个镜头,我提取了近 30%的干燥前。然后,它们在干燥过程中损失了 40%的重量,因此总重量损失了 50%。我不确定它是否有任何影响,因为每个冰球开始是 18 克干的,结果是 9 克废咖啡。

顶好

让我们拍些照片吧!我也拍了意大利香肠,因为我想知道 EY 的影响。这第一枪打得有些艰难,但我没有失去那么多液体。

第一杯,向第二杯、第二杯过渡不良(第三杯未显示)

底部良好

底部变得更好,你可以看到初始液体变暗了。

第一杯,第一杯仍在运行,第二杯(第三杯未显示)

所有未使用的场地

全程拍摄进行得相当顺利。

第一杯,第一杯仍在运行,第二杯(第三杯未显示)

实验数据

数据显示了一些主要问题,如地面在顶部还是在底部。由于溢出,最终的 EY 可能会低于顶部的货物,但对于第一杯来说肯定是准确的。我对两者使用了不同的 VST 篮筐,但我之前已经展示过两个篮筐在性能上没有区别(VST R 代表有脊,RL 代表无脊)。

我绘制了数据并做出了最佳拟合曲线。提取是一个自然对数过程。底部的货物具有更高的提取率,表明正在进行过滤。

我们可以结合这三者的最佳匹配,我估计如果这两个好的部分结合起来,完整的镜头应该是什么样的。事实证明,全杆趋势与底部杆的好。

一个挑战是,因为我每半场只使用 9g,很难控制镜头来决定何时使用另一个杯子。我甚至使用了精密秤,但是从一秒到下一秒的重量变化很难控制。出于这个原因,我宁愿在一台像样的浓缩咖啡机上做这个测试,而不是杠杆式咖啡机。

干燥圆盘

我还测量了干冰球。这只是测量最终萃取,但这样,我们可以看到是否有任何东西留在用过的咖啡中,或者是否有任何萃取物从顶部留在底部。

我让所有两半分别干燥一周。底部的货物用的是顶部的地面,重量为 9.05 磅,所以有 0.56%的差异。他们应该没有保留任何可解物,所以我用这个小百分比来修正其他数据。

然后我们可以看看一些趋势。完整的镜头比我想象的要均匀一半。

我本以为在一个完整的镜头会有一些过滤效果在下半部分,但它似乎没有这样。我还认为,如果下半部分是过滤咖啡,对于上面的好的情况,咖啡渣的下半部分应该在干燥后增加一些重量,但他们没有。

虽然我的许多实验看起来很奇怪,毫无关联,但我觉得它们已经汇聚到对浓缩咖啡内部运作的更深理解。

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事首页

摄影启动页面

一款经济、简单的透明意式浓缩咖啡过滤器

浓缩咖啡过程中粉末不会迁移

浓缩咖啡捣固的收益递减

浓缩咖啡可以涡轮增压吗?

浓缩咖啡浸泡测试

Kompresso 能得到 9 巴压力的浓缩咖啡吗?

浓缩咖啡透明移动式过滤器实验

浓缩咖啡预湿,而非预浸

垂死的雷鲁问题,解释得很清楚

原文:https://towardsdatascience.com/the-dying-relu-problem-clearly-explained-42d0c54e0d24?source=collection_archive---------4-----------------------

思想和理论

通过理解 ReLU 的缺点来保持你的神经网络的活力

照片由索伦·费伊萨Unsplash 上拍摄

内容

(1)什么是 ReLU,它的优点是什么? (2)有什么垂死的热路问题? (3)什么原因导致了将死的热路问题? (4)如何解决将死的热路问题?

激活函数是定义如何将神经节点输入的加权和转换为输出的数学方程,并且它们是人工神经网络(ANN)架构的关键部分。

激活函数将非线性添加到神经网络中,允许网络学习数据中的复杂模式。激活函数的选择对人工神经网络的性能有着重要的影响,最受欢迎的选择之一是RectivedLlinearUnit(ReLU)。

什么是 ReLU,它的优点是什么?

整流线性单元(ReLU)激活函数可描述为:

f(x) = max(0,x)

它的作用是:
(i) 对于负输入值,输出= 0
(ii) 对于正输入值,输出=原始输入值

ReLU 激活功能的图示

ReLU 因为几个关键的优势而广受欢迎:

  • ReLU 比其他常见的激活函数(例如, tanhsigmoid )花费更少的学习时间和更少的计算开销。因为每当其输入为负时,它输出 0,较少的神经元将被激活,导致网络稀疏,从而更高的计算效率
  • tanhsigmoid 相比,ReLU 包含了更简单的数学运算,从而进一步提升了它的计算性能。
  • tanhsigmoid 函数容易出现消失梯度问题,梯度在反向传播中急剧收缩,使得网络不再能够学习。ReLU 通过保留梯度来避免这一点,因为:
    (i) 它的线性部分(在正输入范围内)允许梯度在神经元的活动路径上很好地流动,并保持与节点激活成比例
    (ii) 它是一个无界函数(即,没有最大值)。

垂死的 ReLU 问题是什么?

垂死的 ReLU 问题是指很多 ReLU 神经元只输出 0 值的场景。下面的红色轮廓表示当输入在负范围内时会发生这种情况。

红色轮廓(在负 x 范围内)划分 ReLU 输出 0 的水平段

虽然这一特性赋予了 ReLU 其优势(通过网络稀疏性),但当这些 ReLU 神经元的大部分输入都在负范围内时,这就成了一个问题。最糟糕的情况是整个网络都瘫痪了,这意味着它只是一个常量函数。

当这些神经元中的大多数返回输出 0 时,梯度在反向传播期间无法流动,并且权重没有更新。最终,网络的很大一部分变得不活跃,无法进一步学习。

因为 ReLU 在负输入范围内的斜率也为零,一旦它变成死的(即卡在负范围内,给出输出 0),很可能保持不可恢复。

然而,由于优化器(例如,随机梯度下降)每次都考虑多个输入值,所以垂死 ReLU 问题并不总是发生。只要不是所有的输入将 ReLU 推至负段(即,一些输入在正范围内),神经元就可以保持活动,权重可以得到更新,并且网络可以继续学习。

是什么导致了将死的 ReLU 问题?

垂死的 ReLU 问题通常由以下两个因素驱动:

㈠高学习率

让我们首先看看反向传播中更新步骤的等式:

更新规则的等式(图片由作者提供)

如果我们的学习率( α )设置得太高,我们的新权重很有可能会落在高度负值的范围内,因为我们的旧权重会被减去一个大的数字。这些负权重导致 ReLU 的负输入,从而导致即将发生的 ReLU 问题。

注:回想激活函数的输入是(W*******x)+b .

㈡大的负偏差

简单神经网络的图解(图片由作者提供)

虽然到目前为止我们主要讨论了权重,但是我们不能忘记偏差项也是和权重一起传递到激活函数中的。

偏差是添加到输入和权重乘积中的常量值。考虑到这一点,较大的负偏置项会导致 ReLU 激活输入变为负值。如前所述,这会导致神经元持续输出 0,从而导致死亡的 ReLU 问题。

如何解决垂死的热卢问题?

有几种方法可以解决日益严重的 ReLU 问题:

(I)使用较低的学习率

由于较大的学习率会导致较高的负权重可能性(从而增加死亡的几率),所以在训练过程中降低学习率可能是个好主意。

(二)ReLU 的变更

由于负输入范围内的平坦部分会导致即将到来的 ReLU 问题,自然会考虑调整该平坦部分的 ReLU 变化。

漏重流是解决垂死重流问题的常用有效方法,它通过在负范围内增加一个微小的斜率来实现。这将修改函数,以便在输入小于 0 时生成较小的负输出。

ReLU 和 Leaky ReLU 的图形比较(图片由作者提供)

还有其他变化,如参数 ReLU (PReLU)、指数线性单位(eLU)和高斯误差线性单位(GELU)。它们的细节超出了本文的范围,但是它们都有一个共同的目标,即通过避免零斜率段来防止垂死的 ReLU 问题。

㈢修改初始化程序

初始化神经网络的权重和偏差的常见方式是通过对称概率分布(例如,He 初始化)。然而,这种方法容易因不良的局部极小值而导致死亡 ReLU 问题。

已经证明,使用一个随机不对称初始化可以帮助防止死 ReLU 问题。请务必查看 arXiv 论文中的数学细节。

结论

随着 ReLU 广泛应用于流行的神经网络,如多层感知器和卷积神经网络,本文提出了理论概念,实际意义,和潜在的解决方案的垂死 ReLU 问题。

在你走之前

欢迎您加入我的数据科学学习之旅!关注此媒体页面或查看我的 GitHub 以了解更多精彩的数据科学内容。同时,享受在你的网络中应用 ReLU 的乐趣!

在 M1 MAC 电脑上安装 TensorFlow 2.5 的最简单指南

原文:https://towardsdatascience.com/the-easiest-guide-to-installing-tensorflow-2-5-on-m1-macs-7c8f5129752d?source=collection_archive---------19-----------------------

以及如何在 M1 GPU 上训练神经网络——包括源代码

照片由克雷顿·马尔奎斯特Unsplash 上拍摄

M1 芯片是一项了不起的技术。如果你考虑效率和外形因素,没有什么真正接近。尽管如此,在发布近一年后,安装和管理 Python 包感觉比它应该的要难。

没有哪个库比 TensorFlow 更让开发者头疼了。

TensorFlow 一直是一个噩梦,无法正确安装,尤其是如果你想使用 Mac 的 GPU。大多数在线指南在你开始培训之前似乎都是有效的——然后 Python 内核就死了,你什么也做不了。

今天,您将在 M1 Mac 上安装 TensorFlow 和 TensorFlow Metal。您还将训练一个简单的神经网络,只是为了验证一切工作正常。

我还做了一个视频教程,大家可以随便看看:

你可以在 GitHub 上访问源代码。

张量流先决条件

在考虑 TensorFlow 之前,您需要安装三样东西。那些是家酿Xcode 工具Anaconda

先说家酿。您可以直接从他们的网站复制/粘贴安装命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装需要几分钟时间,完成后您就可以安装 Xcode 工具了。请记住,您不需要 Xcode 本身,只需要命令行工具。您可以使用以下命令安装它们:

xcode-select --install

最后,你需要一条蟒蛇。到目前为止, Miniforge 在 M1 芯片上本地运行,所以这是您将使用的发行版。您将需要下载 ARM64 版本,即下图中标记的版本:

图 1-Miniforge 下载页面(图片由作者提供)

单击该链接将下载 SH 文件,然后您可以通过终端安装该文件:

sh <path_to_Miniforge_file.sh>

安装很简单,所以我不在这里介绍。安装完成后,打开一个新的终端窗口并执行以下命令:

conda -V

这将打印出 Miniforge 版本。这是我的:

图片 2 — Miniforge 版本(图片由作者提供)

只要执行命令不会导致错误,您的版本是否更新并不重要。现在,您可以基于 Python 3.9 创建一个新的虚拟环境。我给我的取名为tensorflow_env:

conda create --name env_tensorflow python=3.9

创建后,使用以下命令激活它:

conda activate env_tensorflow

您应该会在终端窗口中看到类似这样的内容:

图 3 —激活 TensorFlow 环境(图片由作者提供)

现在所有 TensorFlow 必备都安装好了,接下来就可以安装节目的明星了。

安装 TensorFlow 和 TensorFlow Metal

让我马上澄清一些事情——在安装过程中你会得到错误。那完全没问题。有一种方法可以解决 TensorFlow 安装给您带来的任何错误。

从安装苹果的 TensorFlow 依赖项开始:

conda install -c apple tensorflow-deps

现在可以尝试使用以下命令为 macOS 安装 TensorFlow:

pip install tensorflow-macos

Anaconda 的对等版本还不可用,所以您必须坚持使用 pip。安装将需要一段时间并会失败,您会看到更多红色错误信息:

图 4 —试图在 M1 芯片上安装 TensorFlow(图片由作者提供)

好消息是——所有的错误信息都是可以修复的。我们先安装 TensorFlow Metal:

pip install tensorflow-metal

安装将成功,不会出现任何问题:

图 5 —安装 TensorFlow Metal(图片由作者提供)

对之前的错误消息的快速修复是安装 TensorFlow 和 FlatBuffers(先决条件)而不依赖它们。您可以使用以下两个命令来实现这一点:

pip install tensorflow-macos --no-dependencies
pip install flatbuffers --no-dependencies

这次安装将会成功。事实证明,您不需要 TensorFlow 依赖项,因为您已经在几分钟前通过 Apple repo 安装了它们。

要验证安装是否成功,请打开 Python shell,导入 TensorFlow,并打印其版本:

图 6-验证 TensorFlow 已安装(图片由作者提供)

现在,TensorFlow 2.5 已成功安装!本节的最后一步是安装 Jupyter,因为它是本文选择的 IDE。您可以自由使用任何其他 IDE,但是如果您想坚持使用 Jupyter,下面是安装命令:

conda install -c conda-forge jupyter jupyterlab

接下来让我们来验证你是否真的可以训练神经网络。

训练一个简单的神经网络模型

在继续之前,您应该启动 JupyterLab 会话,或者打开任何其他代码编辑器。让我们通过执行以下单元来仔细检查 TensorFlow 是否已安装:

import tensorflow as tf
tf.__version__

它在我的机器上打印出“2.5.0”。接下来,让我们列出 TensorFlow 可以用来训练模型的所有设备。这些包括 CPU 和 GPU,M1 Mac 上的 8 核 GPU 应该足以在相对较小的数据集上训练一些基本的深度学习模型。

命令如下:

tf.config.list_physical_devices()

这是它在我的机器上打印的内容:

图 7——M1 Mac 上的可用设备(图片由作者提供)

CPU 和 GPU 都是可见的。接下来,您将创建一个虚拟数据集。唯一的输入特征是范围从 1 到 100 的 1000 个数字的数组,步长为 0.1。目标变量是输入要素的平方。两者都被转换为浮点张量对象:

import numpy as npX = np.arange(1, 101, step=0.1)
y = [x**2 for x in X]X = tf.cast(tf.constant(X), dtype=tf.float32)
y = tf.cast(tf.constant(y), dtype=tf.float32)

现在可以声明一个神经网络模型了。下面的代码片段创建了一个 2 层神经网络,每层有 64 个神经元。然后使用平均绝对误差(T2)作为损失跟踪指标,亚当(T4)作为优化器,对模型进行编译。最后,该模型被训练 100 个时期:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(1)
])model.compile(
    loss=tf.keras.losses.mean_absolute_error,
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),
    metrics=['mean_absolute_error']
)model.fit(X, y, epochs=100)

培训结束后,您将看到以下内容:

图 8-训练神经网络模型(图片由作者提供)

到目前为止,一切顺利!作为最后一步,您可以使用predict()函数对新数据进行预测:

model.predict([10, 20, 30])

以下是输出结果:

图 9 —根据新数据进行预测(图片由作者提供)

实际值应该是 100、400 和 900,所以这个模型离我们并不远。今天到此为止。接下来让我们总结一下。

离别赠言

今天,您已经在 M1 Mac 上成功安装了 TensorFlow 和 TensorFlow Metal。您还训练了一个简单的神经网络来验证一切正常。

这是一个小小的成就,但是任何 M1 用户都知道 Python 包的安装有多繁琐。以下视频和文章将在 TensorFlow 中介绍回归,如果您想了解更多信息,请继续关注。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

保持联系

原载于 2021 年 9 月 30 日 https://betterdatascience.com**的

最简单的无头 Raspberry Pi 设置

原文:https://towardsdatascience.com/the-easiest-headless-raspberry-pi-setup-68d72076accc?source=collection_archive---------5-----------------------

用智能手机设置无头树莓派的快速入门指南。

(图片由作者提供)

啊,Raspberry Pi——一款小巧、价格适中的 Linux 电脑,深受修补者和程序员的喜爱。我玩树莓派已经有一段时间了,在这篇文章中,我将尽我所能总结我的经验,用我最近发现的一种漂亮的方式让你开始使用无头树莓派。

也许这是你第一次使用 Raspberry Pi,或者你是一个老手,但不管怎样,你可能会收集到一些提示,让你的无头 Raspberry Pi 设置更好的体验。

这种方法最酷的一点是,设置无头树莓派的常见问题以一种优雅的方式得到了解决:当树莓派尚未连接到网络时,如何连接到无头树莓派来配置树莓派的网络访问?

通常,我们必须手动将带有固定 WiFi 凭证的wpa_supplicant.conf文件添加到 microSD 卡的启动驱动器中。

通过这种方法,使用一些很酷的开源蓝牙技术和一个智能手机应用程序,我们可以动态配置我们的无头树莓 Pi 的 WiFi 网络。这里的好处是,这是一个比手动编辑一些文件更好的界面,它可以让你在飞行中切换你的无头 Raspberry Pi 的 WiFi 网络,而不必再次拔出你的 microSD 卡,以防你的 Raspberry Pi 失去与当前 WiFi 网络的连接。

你只需要在树莓派的蓝牙范围内,就可以使用智能手机应用程序配置树莓派的网络。

首先,什么是无头设置,我为什么要做?在传统的 Raspberry Pi 设置中,您需要将显示器、键盘和鼠标插入您的设备——这有点笨重和不方便。

一个无头的设置是没有显示器、键盘和鼠标的 Raspberry Pi。运行无头设置让我们放弃额外的外围设备,直接从任何其他计算机(例如我的笔记本电脑)无线控制 Raspberry Pi。

我认为无头设置的主要优点是方便,但我遇到过很多没有额外外设的情况,无头设置是唯一的选择(有人说是黑客马拉松吗?)

让我们开始吧。我有一个树莓皮 3,但任何树莓皮将与此设置工作。

我们所需要的是下面的设置。

  • 树莓派
  • 4GB 或更大的 microSD 卡
  • Windows、Mac 或 Linux 电脑
  • 将 microSD 卡插入电脑的适配器
  • iPhone 或 Android 设备

适配器地狱。(图片由作者提供)

一旦我们收集了材料,我们就完成了一半。

进入你的 Windows、Mac 或 Linux 电脑,然后 下载最新的 BerryLan 风味 Raspbian 图像 。这是标准的 Raspbian 图像,预装了一个名为 BerryLan 的程序,它将帮助我们将我们的 Raspberry Pi 连接到 WiFi,而不必摆弄配置文件。

BerryLan 是一个开源软件,它使用我们手机上的一个应用程序通过蓝牙与我们的 Raspberry Pi 通信,并为我们更新网络配置文件。

下载完成后,解压到某个地方以备后用。

同样在你的 Windows、Mac 或 Linux 电脑上, 下载 Belena Etcher——我们将使用它将这个图像闪存到 microSD 卡上。下载后,安装并打开它。

将 microSD 卡和适配器安装程序插入计算机。

点击 Flash from file 并选择我们下载的图像。

点击从文件中刷新。(图片作者)

选择我们刚刚下载的树莓派图片。(图片由作者提供)

接下来点击选择目标,找到并勾选您的 microSD 卡。

确保您选择了正确的存储设备!此时移除任何其他外部存储设备可能是明智的,这样我们就不会意外删除任何内容。这将清除您的 microSD 卡。(图片由作者提供)

一旦你点击闪存,Balena Etcher 将开始闪存图像到您的 microSD 卡。

点击闪光!然后等待图像结束闪烁。这应该只需要几分钟。(图片由作者提供)

当我们的 flash 成功时,我们应该会看到这个屏幕。(图片由作者提供)

在我们等待这一切结束的时候,让我们拿出你的 iPhone 或 Android 设备,下载BerryLanApp(App Store/Google Play)。

在我的 iPhone 上下载的 BerryLan 应用程序。(图片由作者提供)

到目前为止,你的图像有望完成闪烁,这样我们就可以拔出 microSD 卡(Balena Etcher 安全地为你弹出)并将其插入到 Raspberry Pi。把你的树莓 Pi 插上电源,让它启动。

此时,Raspberry Pi 无法连接到互联网,因为它还不知道我们的 WiFi 凭据。在这个浆果味的 Raspbian 图像中,当我们的 Raspberry Pi 无法连接到任何 WiFi 源时,它会自动开始监听我们,通过我们的手机蓝牙给它一些 WiFi 凭据。

打开 BerryLan 应用程序,您应该会看到有一个蓝牙设备可以连接。

选择列出的唯一蓝牙设备。(图片由作者提供)

一旦我们点击蓝牙设备,我们将看到一个列表,其中列出了我们的 Raspberry Pi 可以看到的所有 WiFi 源。登录您的 Wifi 网络。

选择您的 Wifi 网络,然后触摸打开接入点,在下一页输入您的 WiFi 网络密码。(图片由作者提供)

Tada!我们的 Raspberry Pi 现在应该连接到我们的 WiFi 网络了。BerryLan 甚至给了我们一个方便的私有 IP 地址,我们可以从 WiFi 网络上的任何设备远程访问我们的 Raspberry Pi。请随意截图此页面—我们可能需要此私有 IP 地址。

成功连接的页面向我们展示了我们树莓派的私有 IP!我无法告诉你有多少次我不得不谷歌如何找到我的树莓皮的私人 IP,而无法登录到树莓皮。(图片由作者提供)

在这个阶段,我们的无头设置完成了!那不是很无痛吗?最后一件事是验证我们可以 SSH 到我们的无头 Raspberry Pi 设置中来实际控制它。SSH 代表安全外壳,让我们远程控制另一台设备。

根据您的计算机使用的平台,打开 Windows PowerShell 或 macOS/Linux 命令行,并键入以下内容:

ssh nymea@nymea

ssh nymea@<PRIVATE_IP_ADDRESS>(如果上述命令不起作用)

你会看到一个关于主机真实性的警告——输入yes

然后会提示您输入 Raspberry Pi 的密码,在这张图片中,默认密码是nymea

您应该会看到这个登录屏幕。你被录取了。去吧,现在就开始那个项目!

(图片由作者提供)

使用passwd命令更改你的默认 Raspberry Pi 密码。

在 Python 中调整通货膨胀数据的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-adjust-your-data-for-inflation-in-python-365490c03969?source=collection_archive---------15-----------------------

萨拉·库菲Unsplash 拍摄的照片

有了 cpi 库,你只用一行代码就可以做到!

通货膨胀——这个词我们几乎每天都能在新闻中听到。我们知道,长话短说,通货膨胀意味着我们的钱随着时间的推移越来越不值钱。但是减少多少以及如何调整通货膨胀的数值呢?在本文中,我将通过展示如何在 Python 中处理通货膨胀来回答这些问题。但是首先…

一点理论

我不会花太多时间来写关于通货膨胀及其后果的经济学理论,因为这是一篇具有不同焦点的更长文章的主题。用一句话来定义通货膨胀——它是一个经济体在一段时间内价格水平的总体上升。这意味着,当总体价格水平上升时,每种货币单位(无论是美元、欧元等。)我们可以购买更少单位的某些商品或服务。这就是之前提到的货币购买力的下降。

我们用通货膨胀率来衡量通货膨胀,通货膨胀率是一般价格指数,最常见的是消费者价格指数(CPI)的年度百分比变化。

我们需要再定义两个术语,以便于分析。第一个是当前美元。它是指从实际登记货币价值的时期开始的价值。或者,它是没有经过通货膨胀调整的值。第二项是实际美元,即经通胀调整后的价值。

利用消费物价指数调整通货膨胀价格的一般公式是:

real_dollars = (current_dollars * cpi_new) / cpi_old

这是理论,让我们进入动手部分!

Python 中的示例

设置

像往常一样,我们导入所需的库。

对于本文,我们将使用cpi库来调整美元值,这比手动下载 CPI 数据并调整值要容易得多。要记住的一件事是,这个图书馆只使用美元。对于其他货币,您必须手动调整数据或找到一个替代库。

导入库时,我们可能会看到以下警告:

StaleDataWarning: CPI data is out of date. To accurately inflate to today’s dollars, you must run `cpi.update()`.

这是不言自明的,我们需要运行以下命令来获取最新的 CPI 数据。

cpi.update()

我们现在准备调整通货膨胀的美元价值。

cpi 的基本操作

cpi库最重要的功能是inflate,我们用它来调整通货膨胀的现值。在下面的代码片段中,我们提供了美元价值以及记录美元价值的年份。

cpi.inflate(100, 2000)# 150.2967

结果意味着,如果某样东西在 2000 年价值 100 美元,由于通货膨胀,它在 2020 年将价值 150 美元。这是因为该函数的默认设置将使用 CPI-U ( 所有城市消费者的消费价格指数)指数将该值调整到最近一整年(在撰写本文时,为 2020 年),这是美国劳工统计局推荐的默认值。你可以在这里阅读更多关于指数的内容。

我们还可以指定要将该值调整到的目标年份。

cpi.inflate(100, 2000, *to*=2010)# 126.6295

我们不限于使用年份。对于逐月调整,我们可以简单地提供datetime.date对象作为参数。

最后,我们还可以使用get方法很容易地获得 CPI 指数的值。

cpi.get(2020)# 258.811

把 cpi 和熊猫结合起来

这已经很方便了,但是,在大多数情况下,我们不会对获取单个值感兴趣,而是调整存储在pandas系列/数据框架中的整个系列的值。

首先,我们需要一些数据。对于这个玩具示例,我们可以使用来自 FRED 数据库的美国家庭收入中位数。仔细检查已经应用于数据的调整类型总是有好处的。我们可以在下图中看到,收入系列是以现值美元表示的。

来源

我们从 FRED 的网站下载数据,并使用pandas将其加载到 Python 中。我们还进行了一些重命名,以保持名称有意义,并创建了一个额外的列,从日期中提取年份—我们将使用它来调整当前的美元值。

作者图片

不幸的是,没有内置的功能来迭代使用pandas数据帧。然而,我们可以使用apply方法轻松地自己完成。

下面我们可以考察当前和实际美元的美国家庭收入中值。我们可以清楚地看到,这些值收敛到同一个值,但并不完全一致。这是因为收入时间序列在 2019 年结束,而我们正在调整到 2020 年。

作者图片

外卖食品

  • 通货膨胀是一个经济体在一段时间内平均价格水平的上升。
  • 现值美元代表的是记录时的价值,而实际美元是根据通货膨胀调整的。
  • 我们可以使用cpi库轻松调整通货膨胀(仅美元)。

你可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。你可以在推特或评论中联系我。

如果你有兴趣学习如何使用 Python 进行量化金融,你可能想看看 Quantra ( 免责声明:一个附属链接),它提供了关于这个主题的各种不同的课程。

如果您喜欢这篇文章,您可能还会对以下内容感兴趣:

</9-useful-pandas-methods-you-probably-have-not-heard-about-28ff6c0bceee>

参考

[1]美国人口普查局,美国家庭收入中值[MEHOINUSA646N],从圣路易斯美联储银行的 FRED 处检索;https://fred.stlouisfed.org/series/MEHOINUSA646N, 2021 年 7 月 12 日。

调试 Kubernetes 工作负载的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-debug-kubernetes-workloads-ff2ff5e3cc75?source=collection_archive---------6-----------------------

对 Kubernetes 上运行的任何应用程序进行调试和故障排除的最快最简单的方法

照片由杰米街Unsplash 上拍摄

调试容器化的工作负载和 Pods 是每个使用 Kubernetes 的开发人员和 DevOps 工程师的日常任务。通常简单的kubectl logskubectl describe pod就足以找到某个问题的罪魁祸首,但是有些问题更难找到。在这种情况下,你可能会尝试使用kubectl exec,但即使这样也可能不够,因为有些容器如发行版甚至不包含你可以 SSH 的 shell。那么,如果以上所有方法都失败了,我们还剩下什么?...

可能会有更好的方法…

有时候,你需要拿一把更大的锤子或者使用更合适的工具来完成手头的任务。在 Kubernetes 上调试工作负载的情况下,合适的工具是kubectl debug,这是不久前(1.18 版)添加的一个新命令,允许您调试正在运行的 pods。它将一种叫做蜉蝣容器的特殊类型的容器注入到有问题的容器中,允许你四处查看并排除故障。这对于简介中描述的情况或任何其他交互式调试更可取或更有效的情况非常有用。所以,kubectl debug看起来是个不错的选择,但是要使用它,我们需要短暂的容器,那么这些容器到底是什么呢?

短暂容器是 Pod 中的一个子资源,类似于普通containers。然而,与常规容器不同,临时容器不是用来构建应用程序的,而是用来检查应用程序的。我们不在创建 Pod 时定义它们,而是使用特殊的 API 将它们注入到正在运行的 Pod 中,以运行故障排除命令并检查 Pod 的环境。除了这些差异,临时容器还缺少一些基本容器的字段,比如portsresources

但是,我们为什么需要它们呢?我们不能只用基本的容器吗?嗯,您不能将容器添加到 Pod,因为它们应该是一次性的(或者换句话说,可以随时删除和重新创建),这使得很难排除需要检查 Pod 的重现错误。这就是为什么 API 中添加了临时容器——它们允许您将容器添加到现有的 pod 中,从而更容易检查正在运行的 pod。

考虑到短暂容器是 Pod 规范的一部分,而 Pod 规范是 Kubernetes 的核心,你(可能)还没有听说过它吗?这些大多是未知特性的原因是因为临时容器处于早期阶段,这意味着它们在默认情况下是不可用的。这个阶段的资源和特性可能会发生很大的变化,或者在 Kubernetes 的未来版本中被完全删除。因此,要使用它们,您必须使用kubelet中的特性门明确启用它们。

配置特征门

我们已经确定我们想要尝试一下kubectl debug,那么我们如何启用短暂容器特性 gate 呢?这取决于您的集群设置。例如,如果您正在使用kubeadm加速创建集群,那么您可以使用下面的集群配置来启用临时容器:

但是在下面的例子中,为了简单和测试的目的,我们将使用KinD(Docker 中的 Kubernetes)cluster,它也允许我们指定我们想要启用的特性门。因此,要创建我们的操场集群:

随着集群的运行,我们应该验证它确实在工作。查看这种配置是否得到应用的最简单的方法是检查 Pod API,它现在应该在通常的容器旁边包括 ephemeralContainers 部分:

这确认了我们拥有它,因此我们可以开始使用kubectl debug。所以,让我们从一个简单的例子开始:

我们首先启动一个名为some-app的 Pod,这样我们就有东西要“调试”。然后,我们对这个 Pod 运行kubectl debug,将busybox指定为临时容器的图像,以及原始容器的目标。此外,我们还包含了-it参数,这样我们可以立即连接到容器并获得一个 shell 会话。

在上面的代码片段中,您还可以看到,如果我们在 Pod 上运行kubectl debug后对其进行描述,那么它的描述将包括临时容器部分,其值是我们之前指定的命令选项。

进程命名空间共享

kubectl debug是一个非常强大的工具,但是有时向 Pod 添加另一个容器可能不足以获得关于在 Pod 的另一个容器中运行的应用程序的相关信息。当被诊断的容器不包括必要的调试工具甚至 shell 时,可能会出现这种情况。在这种情况下,我们可以使用进程共享来允许我们使用注入的临时容器检查 Pod 的原始容器。

但是进程共享的一个问题是它不能应用于现有的 pod,因此我们必须创建一个新的 pod,将spec.shareProcessNamespace设置为true,并在其中注入一个临时容器。这样做会很麻烦,尤其是如果我们必须调试多个 pod/container 或者只是重复执行这个任务。幸运的是,kubectl debug可以使用--share-processes选项为我们做到这一点:

上面的代码片段显示,通过进程共享,我们可以在一个 Pod 中看到另一个容器中的所有内容,包括它的进程和文件,这对于调试来说肯定非常方便。

您可能已经注意到,除了--share-processes之外,我们还包含了--copy-to=new-pod-name,因为——正如前面提到的——我们需要创建一个新的 pod,其名称由这个标志指定。如果我们随后从另一个终端列出正在运行的 pod,我们将看到以下内容:

这是我们在原有应用程序窗格中新增的调试窗格。与原始容器相比,它有两个容器,因为它还包括临时容器。

另外,如果您想在任何时候验证某个 Pod 中是否允许进程共享,那么您可以运行:

好好利用它

现在我们已经启用了特性门,并且知道了命令是如何工作的,让我们试着好好利用它并调试一些应用程序。让我们想象一下下面的场景——我们有一个行为不当的应用程序,我们需要对其容器中的网络相关问题进行故障诊断。该应用程序没有我们可以使用的必要的网络 CLI 工具。为了解决这个问题,我们可以以如下方式使用kubectl debug:

启动 pod 后,我们首先尝试将 shell 会话放入它的容器中,这看起来似乎可行,但是当我们尝试运行一些基本命令时,我们可以看到实际上什么也没有。因此,相反,我们使用包含类似curlpingtelnet等工具的praqma/network-multitool映像将临时容器注入到 pod 中。现在,我们可以执行所有必要的故障排除。

在上面的例子中,对于我们来说,Pod 中有另一个容器就足够了。但是有时,您可能需要直接查看这个令人困扰的容器,却没有办法进入它的外壳。在这种情况下,我们可以像这样利用进程共享:

这里我们再次运行了使用 Distroless 映像的容器。知道我们不能在它的外壳中做任何事情,我们用--share-processes --copy-to=...运行kubectl debug,这创建了一个新的 Pod,它有一个额外的临时容器,可以访问所有的进程。当我们列出正在运行的进程时,我们可以看到我们的应用程序容器的进程具有 PID 8,我们可以用它来探索它的文件和环境。为此,我们必须遍历/proc/<PID>/...目录——在本例中是——/proc/8/root/app/...

另一种常见的情况是,应用程序在容器启动时不断崩溃,这使得调试变得困难,因为没有足够的时间将 shell 会话放入容器并运行一些故障排除命令。在这种情况下,解决方案是创建具有不同入口点/命令的容器,这将阻止应用程序立即崩溃,并允许我们执行调试:

好处:调试集群节点

本文主要关注 Pods 及其容器的调试——但是任何集群管理员都知道——通常需要调试的是节点而不是 Pods。幸运的是,kubectl debug还允许通过创建 Pod 来调试节点,该 Pod 将在指定的节点上运行,节点的根文件系统安装在/root目录中。考虑到我们甚至可以使用chroot来访问主机二进制文件,这实际上充当了进入 node 的 SSH 连接:

在上面的代码片段中,我们首先确定了要调试的节点,然后使用node/...作为参数显式运行kubectl debug,以访问集群的节点。之后,当我们连接到 Pod 时,我们使用chroot /host来逃出chroot监狱,并获得对主机的完全访问权。最后,为了验证我们真的可以看到主机上的一切,我们查看了部分kubeadm.conf,其中我们可以看到我们在文章开始时配置的feature-gates: EphemeralContainers=true

结论

能够快速有效地调试应用程序和服务可以为您节省大量时间,但更重要的是,它可以极大地帮助您解决一些问题,如果不立即解决这些问题,最终可能会花费您很多钱。这就是为什么让像kubectl debug这样的工具为您所用并启用非常重要,即使它们还没有正式发布或默认启用。

如果——不管出于什么原因——启用临时容器不是一个选项,那么尝试实践替代的调试方法可能是一个好主意,例如使用应用程序映像的调试版本,它将包括故障排除工具;或者临时改变 Pod 的容器的命令指令来阻止它崩溃。

也就是说,kubectl debug和短命容器只是许多有用但鲜为人知的 Kubernetes 特性门中的一个,所以请关注后续文章,深入了解 Kubernetes 的其他隐藏特性。

本文原帖martinheinz . dev

https://itnext.io/cloud-native-ci-cd-with-tekton-laying-the-foundation-a377a1b59ac0 https://itnext.io/hardening-docker-and-kubernetes-with-seccomp-a88b1b4e2111

在 AWS EC2 实例中获得 Rstudio 闪亮服务器的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-get-rstudio-shiny-server-in-an-aws-ec2-instance-62ed37cb4aef?source=collection_archive---------32-----------------------

如果你是一名数据科学家,有一个 R shiny 应用程序在本地运行,你想与你组织中的用户共享它,将它托管在用户可以访问的服务器上将是一个不错的选择。

在这里,我们将看看如何在 AWS 中做到这一点。

用 R 加速 EC2 实例最简单的方法是使用 R-studio / Shiny 的 Amazon 机器映像(AMI) 。当我们启动 EC2 实例时,第一步是选择一个 AMI,它是一个包含一组软件配置的模板。路易斯·阿斯莱特正在为 RStudio 服务器维护 AMIs。他在开发和维护这方面做得很好。多亏了他。我们可以根据我们希望从这里https://www.louisaslett.com/RStudio_AMI/启动实例的 AWS 区域来选择 AMI。

我在这里不解释启动实例的步骤,因为你可以在互联网上找到很多教程。一旦 EC2 实例成功启动,导航到该实例的 IP 地址会直接将我们带到 RStudio。您应该会看到下面的屏幕。

您可以使用
登录-用户名:rstudio
-密码:< EC2 实例 ID >

Shiny app Shiny App 可以在/shiny/username 访问,比如默认用户 rstudio,Shiny App 会在/shiny/rstudio

我们可以将我们的 Shinyapp 代码复制到用户主目录中名为ShinyApps的文件夹中。

希望这个快速提示对你有帮助。我发现对于数据科学家来说,这是在 AWS 中启动 RStudio 的最简单的方法,他们不习惯从 Linux 到 SSH 并安装所需的软件。

用熊猫制作漂亮的互动视觉效果的最简单的方法

原文:https://towardsdatascience.com/the-easiest-way-to-make-beautiful-interactive-visualizations-with-pandas-cdf6d5e91757?source=collection_archive---------2-----------------------

Python 中熊猫的一行交互式可视化

照片由杰里·张Unsplash 上拍摄

如果你一直在关注我的数据可视化指南,你可能知道我喜欢用 Python 创建好看且可读的可视化,而不需要太多的技术知识和浪费大量时间。

交互式可视化也不例外,所以我一直在寻找 Python 中友好的库。有许多图书馆在做这项工作,但当涉及到与熊猫一起工作时,事情就变得混乱了。

幸运的是,有一种简单的方法可以直接从 Pandas 创建交互式可视化,我们将在本指南中详细了解它是如何工作的。

**Table of Contents** 1\. [First things first](#064d)
 - [Install the libraries](#f5bb)
 - [Import the libraries](#2c10)
 - [The data](#dba9)
2\. [Line Plot](#4660)
3\. [Bar Plot](#88e5)
4\. [Boxplot](#7abf)
5\. [Histogram](#fc0f)
6\. [Piechart](#470c)
7\. [Scatterplot](#1816)

重要的事情先来

安装库

为了轻松创建交互式可视化,我们需要安装袖扣。这是一个连接 Pandas 和 Plotly 的库,所以我们可以直接从 Pandas 创建可视化(过去你必须学习变通方法才能让它们一起工作,但现在更简单了)

首先,确保您安装了 Pandas,并在终端上运行以下命令:

pip install pandas
pip install plotly

注意,也可以用 conda 来安装 Plotly conda install -c plotly

安装 Plotly 后,运行以下命令来安装袖扣:

pip install cufflinks

导入库

要开始工作,请导入以下库:

import pandas as pd
import cufflinks as cf
from IPython.display import display,HTMLcf.set_config_file(sharing='public',theme='ggplot',offline=True) 

在本例中,我使用的是‘ggplot’主题,但是您可以随意选择任何您想要的主题。运行命令cf.getThemes()来获得所有可用的主题。

为了在接下来的部分中使用 Pandas 进行交互式可视化,我们只需要使用语法dataframe.iplot()

数据

在本指南中,我们将使用人口数据框架。首先,下载 Google DriveGithub 上的 CSV 文件,将文件移动到您的 Python 脚本所在的位置,然后在如下所示的 Pandas dataframe 中读取它。

df_population = pd.read_csv('population_total.csv')

数据框包含了世界上大多数国家/地区历年的人口数据,如下所示:

作者图片

这个数据框架几乎已经可以绘制了,我们只需要删除空值,对其进行整形,然后选择几个国家来测试我们的交互式绘图。下面显示的代码完成了所有这些工作。

# dropping null values
df_population = df_population.dropna()# reshaping the dataframe
df_population = df_population.pivot(index='year', columns='country',
                                    values='population')# selecting 5 countries
df_population = df_population[['United States', 'India', 'China', 
                               'Indonesia', 'Brazil']]

现在,数据框看起来像下面的图片,并准备好绘图。

作者图片

如果你想知道一个数据科学家如何收集真实世界的数据,比如这个“population_total.csv”,看看我做的这个指南。(数据科学项目不会总是有 Kaggle 数据集可用)

现在让我们开始制作交互可视化吧!

线图

让我们做一个线图来比较一下从 1955 年到 2020 年这 5 个国家的人口增长了多少。

如前所述,我们将使用语法df_population.iplot(kind='name_of_plot')来绘制图表,如下所示。

df_population.iplot(kind='**line**',xTitle='Years', yTitle='Population',
                    title='Population (1955-2020)')

作者图片

乍一看,很容易看出印度的人口增长比其他国家快。

条形图

我们可以在按类别分组的条形图上制作一个单独的条形图。让我们看一看。

单条形图

让我们创建一个柱状图,显示到 2020 年每个国家的人口。为此,首先,我们从索引中选择 2020 年,然后用列转置行以获得列中的年份。我们将这个新的数据帧命名为df_population_2020(我们将在绘制饼状图时再次使用这个数据帧)

df_population_2020 = df_population[df_population.index.isin([2020])]
df_population_2020 = df_population_2020.T

现在我们可以用.iplot()绘制这个新的数据帧。在本例中,我将使用color参数将条形颜色设置为浅绿色。

df_population_2020.iplot(kind='**bar**', color='lightgreen',
                         xTitle='Years', yTitle='Population',
                         title='Population in 2020')

作者图片

按“n”个变量分组的条形图

现在让我们看看每个十年开始时人口的演变。

# filter years out
df_population_sample = df_population[df_population.index.isin([1980, 1990, 2000, 2010, 2020])]# plotting
df_population_sample.iplot(kind='**bar**', xTitle='Years',
                           yTitle='Population')

作者图片

很自然,所有这些国家的人口都在逐年增长,但有些国家的增长速度更快。

箱线图

当我们想看到数据的分布时,箱线图是很有用的。箱线图将显示最小值、第一个四分位数(Q1)、中值、第三个四分位数(Q3)和最大值。查看这些值的最简单方法是创建交互式可视化。

让我们看看美国的人口分布。

df_population['United States'].iplot(kind='**box**', color='green', 
                                     yTitle='Population')

作者图片

假设现在我们想得到相同的分布,但所有选定的国家。

df_population.iplot(kind='**box**', xTitle='Countries',
                    yTitle='Population')

作者图片

正如我们所看到的,我们还可以通过单击右侧的图例来筛选出任何国家。

柱状图

直方图表示数字数据的分布。让我们看看美国和印度尼西亚的人口分布。

df_population[['United States', 'Indonesia']].iplot(kind='**hist**',
                                                xTitle='Population')

作者图片

饼图

让我们再来比较一下 2020 年的人口,但现在用的是饼状图。为此,我们将使用在“单个柱状图”部分创建的df_population_2020数据框。

然而,为了制作饼图,我们需要将“国家”作为列而不是索引,所以我们使用.reset_index()来取回列。然后我们将2020转换成一个字符串。

# transforming data
df_population_2020 = df_population_2020.reset_index()
df_population_2020 =df_population_2020.rename(columns={2020:'2020'})# plotting
df_population_2020.iplot(kind='**pie**', labels='country',
                         values='2020',
                         title='Population in 2020 (%)')

作者图片

散点图

虽然人口数据不适合散点图(数据遵循一个共同的模式),我会为了本指南的目的制作这个图。

制作散点图类似于折线图,但是我们必须添加mode 参数。

df_population.iplot(kind='**scatter'**, **mode**='markers')

就是这样!现在你已经准备好制作你自己的与熊猫的美丽的交互式可视化了。如果你想学习 Python 中的其他可视化库,如 Matplotlib 和 Seaborn,还想知道如何制作 wordclouds,查看我制作的这些指南

与 3k 以上的人一起加入我的电子邮件列表,获取我在所有教程中使用的 Python for Data Science 备忘单(免费 PDF)

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑报名成为一名媒体成员。每月 5 美元,让您可以无限制地访问数以千计的 Python 指南和数据科学文章。如果你使用我的链接注册,我会赚一小笔佣金,不需要你额外付费。

https://frank-andrade.medium.com/membership

在世界地图上绘制熊猫数据的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-plot-data-from-pandas-on-a-world-map-1a62962a27f3?source=collection_archive---------1-----------------------

本指南旨在通过最少的文字和最少的代码,向您展示如何使用 Matplotlib 和 Geopandas 库在世界地图上绘制来自 Pandas 对象的数据。

需要安装的 python 库有 pandas、geopandas 和 matplotlib。你可以在 github 上找到这个教程的代码:https://github.com/udiy/blogposts/tree/main/Easy%20map

熊猫对象中的数据需要有位置坐标,这意味着纬度和经度。对于这篇文章,我使用的是关于澳大利亚火灾的数据,可以在这里找到:https://www . ka ggle . com/carlosparadis/fires-from-space-Australia-and-new-zeland

这些数据来自美国宇航局的卫星 MODIS 仪器,他们从太空监测火灾,在本文的结尾找到致谢。在数据中,有一列称为亮度,这是对火的温度(开尔文)的测量。

浏览数据

现在让我们看一些代码。首先,我们将快速浏览一下加载和查看数据:

df = pd.read_csv("fire_archive_M6_96619.csv", 
                 usecols=["latitude", "longitude", "brightness",
                 "acq_date"], parse_dates=["acq_date"])df.head()

上述代码单元的输出

现在让我们将数据绘制在散点图上,y 轴为纬度,x 轴为经度:

df.plot(x="longitude", y="latitude", kind="scatter", c="brightness",
        colormap="YlOrRd")

上述单元的输出

很好。即使不使用地图,我们也能看到澳大利亚的轮廓。我们来添加一张地图。

地质公园

Geopandas 允许您将世界各国的几何图形加载到一个名为 GeoDataFrame 的对象中,该对象与 pandas DataFrame 对象非常相似。看起来是这样的:

countries = gpd.read_file(
               gpd.datasets.get_path("naturalearth_lowres"))countries.head()

上述单元的输出

一旦你有了这个对象,你就可以轻松地绘制一张世界地图,就像你在 pandas 中使用绘图功能一样:

countries.plot(color="lightgrey")

上述单元的输出

由于我们的重点是澳大利亚,我们可以将“国家”对象切片,这样它只显示澳大利亚:

countries[countries["name"] == "Australia"].plot(color="lightgrey")

上述单元的输出

把所有这些放在一起

我们现在将使用 matplotlib 创建一个图形,并同时绘制地图和数据:

# initialize an axis
fig, ax = plt.subplots(figsize=(8,6))# plot map on axis
countries = gpd.read_file(  
     gpd.datasets.get_path("naturalearth_lowres"))countries[countries["name"] == "Australia"].plot(color="lightgrey",
                                                 ax=ax)# parse dates for plot's title
first_month = df["acq_date"].min().strftime("%b %Y")
last_month = df["acq_date"].max().strftime("%b %Y")# plot points
df.plot(x="longitude", y="latitude", kind="scatter", 
        c="brightness", colormap="YlOrRd", 
        title=f"Fires in Australia {first_month} to {last_month}", 
        ax=ax)# add grid
ax.grid(b=True, alpha=0.5)plt.show()

上述单元的输出

额外奖励——额外造型

次要网格

网格线对应于两个轴上的记号。根据缩放级别和我们在地图上的目标,我们可能希望添加间距较小的网格线,为此我们需要添加额外的刻度。出于样式的目的,我更喜欢添加次要刻度,这样您可以用不同的颜色或透明度绘制次要网格。在下面的示例中,有一个间距为 1 度的次要网格:

# get axes limits
x_lo, x_up = ax.get_xlim()
y_lo, y_up = ax.get_ylim()# add minor ticks with a specified sapcing (deg)
deg = 1
ax.set_xticks(np.arange(np.ceil(x_lo), np.ceil(x_up), deg), minor=True)
ax.set_yticks(np.arange(np.ceil(y_lo), np.ceil(y_up), deg), minor=True)
ax.grid(b=True, which="minor", alpha=0.25)fig

上述单元的输出

感谢

我们承认使用了美国宇航局资源管理系统(公司)(https://earthdata.nasa.gov/firms)的消防信息的数据和/或图像,这是美国宇航局地球观测系统数据和信息系统(EOSDIS)的一部分。

MODIS 收集了 6 个 NRT 热点/主动火灾探测 MCD14ML 由 NASA 公司分发上线https://earthdata.nasa.gov/firms。doi:10.5067/FIRMS/MODIS/MCD 14ml

美国宇航局免责声明:https://earth data . NASA . gov/earth-observation-data/near-real-time/citation # ed-lance-免责声明

就这些了,希望你觉得这个教程很有帮助,很享受:)

将股票数据放入 Python 程序的最简单方法:yfinance

原文:https://towardsdatascience.com/the-easiest-way-to-pull-stock-data-into-your-python-program-yfinance-82c304ae35dc?source=collection_archive---------4-----------------------

关于 yfinance 及如何设置的初步探讨。

我最近在用 yfinance 做一个树莓 Pi 股票行情。请继续关注教程。(图片由作者提供)

最近我一直在做一个有趣的股票报价项目,我遇到了一些我以前从未想过的事情:将当前和历史股票市场价格数据拉入我的 Python 程序的最佳方式是什么?

事实证明,对我来说,最好的选择是y Finance——这是一个 Python 库,它给你提供来自雅虎财经的当前和历史股票市场价格数据,等等。最酷的是它完全免费,不需要 API 密匙,并且允许每小时 2000 个请求的相对较高的吞吐量。更酷的是你(是的,就是你!)可以很容易地将股票数据输入到 Python 程序中,就像我下面展示的这几个步骤一样简单。

设置

我使用的是 Python 3.8,但是任何高于 Python 3.4 的版本都应该被支持。您可以在 Linux、Mac 或 Windows 上运行。(如果你使用 Windows,我建议你看看 WSL2,如何开始,以及它能做的一切——如果你使用 WSL2,一定要遵循 Linux 命令)

首先,我们要创建名为env的 Python 虚拟环境,并激活它。

对于 Linux/Mac 终端

python3 -m venv envsource env/bin/activate

针对 Windows PowerShell

python3 -m venv env.\env\Scripts\Activate.ps1

现在我们已经设置并激活了 Python 虚拟环境,让我们将 yfinance 安装到这个虚拟环境中,这样我们就可以使用它了。下一个命令对于任何平台都是一样的。

pip install yfinance

获取当前股票价格数据

现在 yfinance 已经安装好了,我们准备写一些 Python 代码了!

让我们试试 yfinance 的一些最基本,但可能是最常用的功能。

我正在研究股票行情,所以我想知道股票的当前价格。让我们获取一只股票的当前价格和之前的收盘价——在这个 Python 例子中,我们将使用 TSLA。

import yfinance as yfstock_info = yf.Ticker('TSLA').info
# stock_info.keys() for other properties you can exploremarket_price = stock_info['regularMarketPrice']
previous_close_price = stock_info['regularMarketPreviousClose']print('market price ', market_price)
print('previous close price ', previous_close_price)

上面代码的输出。(图片由作者提供)

好的,如果我们在股票市场开放的时间运行这个,价格信息会实时变化和更新。更新速度有多快?价格的变化和雅虎财经更新价格一样快,这对于我的目的来说已经足够快了。对于像高频交易机器人这样的东西来说,它可能不够快,但 Python 可能不是最好的。

获取历史股票价格数据

接下来我们来看一些历史数据。如果我们想要绘制它,我们将不得不安装一些额外的 Python 库来帮助我们——matplotlib 来绘制,pendulum 来为我们做一些简单的时间转换。

pip install matplotlib pendulum

现在让我们看看 TSLA 过去 2 年的股价,每隔 1 个月。您可以看到这些数字非常灵活,可以根据您的使用情况进行更改。

import yfinance as yf
import pendulum
import matplotlib.pyplot as pltprice_history = yf.Ticker('TSLA').history(period='2y', # valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
                                   interval='1wk', # valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
                                   actions=False)time_series = list(price_history['Open'])
dt_list = [pendulum.parse(str(dt)).float_timestamp for dt in list(price_history.index)]plt.style.use('dark_background')plt.plot(dt_list, time_series, linewidth=2)

我们从上面的代码中得到的情节。哇,价格涨了很多。(图片由作者提供)

结论

我希望你能像我一样,发现 yfinance 库的建立和整合非常容易!这里有很多值得探索的地方,更多信息和例子可以在https://pypi.org/project/yfinance/找到。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

将数据从谷歌大查询传输到谷歌大查询的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-transfer-data-from-into-google-bigquery-d421cebdbd68?source=collection_archive---------39-----------------------

来源:un plash

让您的数据为您所用—使用收集的关于您的客户的所有数据,并通过简单易用的方式(OWOX BI BigQuery Reports connector)从中获得重要见解

如果你仍然以灰姑娘的身份工作,在每个月底为报告收集数据,那么你迫切需要一位善良的仙女教母!使用 OWOX 的魔杖——一个迷人的免费插件,可以将您的数据从 Excel 或谷歌工作表传输到谷歌大查询中,只需点击几下鼠标就可以返回。

在 OWOX 中,我们开发了一种极好的方法来自动化数据传输,构建复杂而有用的报告,例如队列分析或 ROPO,并专注于获取新的想法来发展您的业务。全球成千上万的用户已经在使用这种方法。你可能不会担心;这个数据传输车不会变成南瓜!

为什么需要传输数据

他们中谁最漂亮?如果您问营销人员这个问题,90%的情况下,您会听到谷歌分析和 Excel(或谷歌电子表格)。当然,在市场上,总会有一些新的、自动化的东西,并且使用机器学习。然而,这些地球的支柱仍然存在。

对于在小公司工作的许多营销人员来说,有足够的功能。这些平台经过测试,可以不间断地工作,每个人都知道如何使用它们——这是中小型企业的理想选择,尤其是当一个或多个员工在工作中使用这些信息时。

作者的形象礼貌

然而,当您不再拥有一个登录页面,而是一个逐渐壮大的在线商店时,该怎么办?显然,需要分析的数据量也在增长。您不仅需要分析越来越多的广告活动和用户行为,还需要结合所有这些数据。此外,您必须记住,您的客户使用笔记本电脑和移动设备访问您的网站。当用户从笔记本电脑上找到网站上的东西,离开页面,然后在移动设备上看到社交网络上的广告,然后回到商店完成订单时,这是一种常见的做法。要分析这么多数据,需要将其存储在某个地方,最佳选择是基于云的数据仓库。

为什么选择谷歌大查询

在云数据存储市场上可用的众多解决方案中,谷歌的 BigQuery 最适合营销人员。为什么这项服务被认为是最方便的?

首先,全球营销人员在工作中使用谷歌产品:谷歌广告、谷歌分析、YouTube 和其他谷歌服务。当然,大查询存储是该基础设施的一部分,并且与所有其他谷歌服务进行了本地集成。

作者的形象礼貌

其次,该服务易于使用,工作速度快。此外,许多专家知道如何使用这个平台,并且有预先制作的 SQL 查询集可供使用。

借助 GBQ,您可以轻松解决营销人员面临的实时投标管理和细分自动化等紧迫问题。众所周知,营销绩效的成功取决于对市场变化的快速反应、个性化和营销自动化。

将数据转移到 Google BigQuery 的最简单方法

如果您想要创建高级分析,例如,使用离线和在线数据构建 ROPO 报告,您需要找到一种简单方便的方法来上传数据。当然,一切都可以用老方法来做,手动收集数据,浪费了一半的工作时间。但是如果有可能不这样做,为什么要受苦呢?

全球有超过 100,000 名用户使用 OWOX BI-big query Reports 的免费附件。使用 OWOX BI 插件,您可以在 Google BigQuery 中处理数据,并将查询结果自动导入到 Google Sheets 中。

例如,你从移动应用和网站收集数据到 GBQ,然后你从所有营销渠道、电子邮件和 CRM 系统添加数据。之后,在表单中,您可以看到关于个人用户活动的报告,或者构建群组分析或 LTV 计算。

图片由作者提供

另一个用例是多个部门需要的链接文件。例如,营销部门填写预算文档中的计划,财务部门填写事实。然后,这些数据被上传到 GBQ,进行处理,并下载回所需的文件。因此,财务部接收计划,市场部接收事实。

这个免费的附加软件允许你在 Google BigQuery 和 Excel(电子表格)之间建立数据传输,只需两次点击和相反的方向。此外,使用附加组件的优势还包括:

  1. 自动更新报告。您可以指定所需的更新频率。
  2. 创建您自己的查询集合。分析师或开发人员可以用您需要的预定参数保存查询。
  3. 免费附加软件。您只需为处理 BigQuery 存储中的数据付费。
  4. 安全。Add-on 只使用 Google 的官方 API。
  5. 数据控制。您可以控制谁可以访问您的数据。

如果你浏览用户评论,你会得到这些:它方便,它完美无缺,它是救星。这些话不言自明,不是吗?

图片由作者提供

无论您想将数据上传到哪里,您都需要采取三个简单的步骤。

如何使用附件进行数据传输

第一步。 安装插件。你也可以直接从 Google Sheets 菜单下载。

图片由作者提供

根据您想要做的,从下拉菜单中选择添加新报告上传数据到 BigQuery

图片由作者提供

第二步。如果你想从 BigQuery 存储器下载数据,指定项目的名称。如果需要,为您的查询定义动态参数。点击添加&运行。

图片由作者提供

如果您想从 Google Sheets 中将数据上传到数据存储中,您应该在 BigQuery 中指定项目和数据加载方案。点击开始上传

图片由作者提供

第三步。你太棒了,你的数据已经成功传输!

关键要点

你的数据应该为你工作!请记住,高级分析、自动化仪表板和酷部件都是基于数据构建的。没有这第一步,你将无法继续前进,提高你的营销业绩。

要使用所有收集到的关于客户的数据并从中获得重要的见解,请使用简单易行的方法 OWOX BI BigQuery Reports 连接器。

作为分析工程师验证数据的最简单方法

原文:https://towardsdatascience.com/the-easiest-way-to-validate-data-as-an-analytics-engineer-e9d20d777bd4?source=collection_archive---------31-----------------------

如何使用 Excel 比较两个不同来源的数据模型

西格蒙德Unsplash 上拍照

作为一名分析工程师,验证数据模型是我工作的一大部分。随着现代数据堆栈的建立,旧的数据堆栈将被取代。随着旧数据栈的替换,新的数据模型也要根据旧的数据模型进行验证。

这可能很困难,因为数据模型位于两个不同的地方。通常情况下,数据太大,无法将一个数据源接收到另一个数据源中以便于比较。有时你必须回到最基础的地方,这就是为什么我在比较数据集时选择 Excel。

我目前正在使用 Fivetran雪花dbt 构建数据模型。目前,我们的旧数据模型位于 Domo 中。Domo 被认为是商业智能工具,所以数据模型运行缓慢。这使得在雪花和 Domo 中比较输出变得困难。

用例

在验证一个聚合列时,我发现 Domo 和 Snowflake 中的内容有差异。在验证时,我选择一小部分数据进行比较,而不是整个数据集。对于这个实例,我选择了其中start_date列的年份为 2020 并且推荐数不为空的行。

select distinct 
   user_id
from "core"."data_models"."referral_info" 
where number_of_referrals is not null 
   and year(start_date)=2020

在 Domo 中,我用这些相同的过滤器创建了推荐数据模型的子集。我在这里只选择了user_id列,因为我想直接比较在 Snowflake 中推荐的用户列表和在 Domo 中推荐的用户列表。选择多个列只会使比较更加混乱。

通过将数据集限制为具有唯一 id 的一列,我们可以很容易地看到数据中哪里不匹配。一旦我们找到了一个模型中的用户而不是另一个模型中的用户,我们就可以调查为什么会这样。

接下来,我将 Domo 和 Snowflake 中的数据子集导出到 Excel 中。幸运的是,每个数据集只有几千行。如果数据集的行数超过了几千行,那么您会希望对数据集进行更多的过滤。大型数据集导出到 Excel 需要很长时间。

比较数据集

现在,您已经将两个数据集保存到 Excel 文件中,您将希望找到一种方法来轻松地比较记录。将user_ids的一列与user_ids的另一列复制到 Excel 表中。

作者图片

  1. 选择包含两列user_ids的整个数据集
  2. 转到主页选项卡,然后单击“样式”
  3. 在“样式”中,单击“条件格式”
  4. 将鼠标悬停在“突出显示单元格规则”选项上
  5. 点击“重复值”

作者图片

6.在弹出窗口中,选择“副本”,并选择您希望它们高亮显示的颜色

作者图片

7.单击“确定”

现在,您将会看到所有的副本都以您选择的颜色高亮显示。通过这种方式查找重复项,它们不必在同一行。它将在整个数据集中寻找重复项。这就是为什么确保您有一个来自每个数据源的user_ids的独特列表很重要。

作者图片

调查差异

现在,您可以更深入地了解是什么原因导致用户在一个数据模型中有大量推荐,而在另一个数据模型中没有。选择每个数据集中user_id,并比较每个数据模型中的列值。

在这里,我将特别关注具有user_id = 3user_id = 7的用户。

您的number_of_referrals逻辑中使用的列值是否相同?

数据类型是否相同?

当我进一步研究我的差异时,我发现用于连接两个数据集的列之一在一个模型中是时间戳,而在另一个模型中是日期。这导致数据集无法正确连接,从而消除了参考值。

结论

验证数据是分析工程师最棘手的部分之一。它需要对数据模型中使用的数据和逻辑有深刻的理解。导致问题的往往是一些最意想不到的事情,比如数据类型。

确保您花时间来正确验证您的数据模型。数据的完整性取决于您正在实施的实践。坏数据输入意味着坏数据输出。如果你的数据模型给你不正确的结果,而你的公司把他们的整个分析建立在这些数据模型的基础上,那么会有很多地方出错。

花时间去理解你的数据。调查一下。找问题。试着找到他们。你总是想在你的模型投入生产之前找到它们。

在 Python 中对两个字典执行逻辑运算的最简单方法

原文:https://towardsdatascience.com/the-easiest-ways-to-perform-logical-operations-on-two-dictionaries-in-python-88c120fa0c8f?source=collection_archive---------28-----------------------

交、并、差和对称差

来自 Unsplash

在本文中,我们将看一看在 Python 中寻找两个字典的交集、并集、差集和对称差集的最简单的方法,都是在只有键和键值对的级别上。

让我们考虑 2 个字典,它们具有:

  • int类型的值(因此我们也可以使用数学运算),
  • 一些共同的钥匙,
  • 一些共同的键值对,
  • 其他键-值对特定于每个字典。
d1 = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
d2 = {'c':3, 'd':4, 'e':50, 'f':60, 'g':7, 'h':8}

这里的目的是为以下每个逻辑操作创建一个新的字典:

交集(“与”):

  • 两个字典中相同的键值对,
  • 在两个字典中相同的关键字,在一些关键字的值在两个字典中不同的情况下,将一些规则应用于它们相应的值;

Union ("or"):

  • 如果两个字典中的键值不同,一些规则应用于相同的键值;

差异(“非”):

  • 取在一个字典中存在而在另一个字典中不存在的键-值对(即使相同的键可以以不同的值存在于另一个字典中),
  • 只取存在于一个字典中的关键字及其相应的值;

对称差:

  • 只取在任何一个字典中存在而在另一个字典中不存在的键,以及它们相应的值。

交集

为了找到字典条目的交集(即共同的键-值对),我们可以使用下面的代码:

inter = dict(d1.items() & d2.items())
inter**Output:** {'d': 4, 'c': 3}

如果我们有兴趣找到所有共同的键,即使其中一些键的值在我们的字典中是不同的?我们可以决定从一个字典中保留这些键的值,比如说从d1:

inter_d1 = {k:v for k,v in d1.items() if k in d2}
inter_d1**Output:** {'c': 3, 'd': 4, 'e': 5, 'f': 6}

或者来自d2:

inter_d2 = {k:v for k,v in d2.items() if k in d1}
inter_d2**Output:** {'c': 3, 'd': 4, 'e': 50, 'f': 60}

或者,我们可能希望从两个字典中共同获取每个键的两个值,对它们应用一个函数,并将结果用作新字典中该键的值:

inter_max = {k:max(d1[k],d2[k]) for k in d1.keys() if k in d2}
inter_min = {k:min(d1[k],d2[k]) for k in d1.keys() if k in d2}
inter_sum = {k:d1[k]+d2[k] for k in d1.keys() if k in d2}print(inter_max)
print(inter_min)
print(inter_sum)**Output:** {'c': 3, 'd': 4, 'e': 50, 'f': 60}
{'c': 3, 'd': 4, 'e': 5, 'f': 6}
{'c': 6, 'd': 8, 'e': 55, 'f': 66}

当然,我们可以使用任何用户定义的函数来实现这些目的:

def extraction_twice(a,b):
    return (a-b)*2inter_extraction_twice = {k:extraction_twice(d2[k],d1[k]) for k in d1.keys() if k in d2}
inter_extraction_twice**Output:** {'c': 0, 'd': 0, 'e': 90, 'f': 108}

同样,在值为字符串类型的情况下:

d1_new = {1:'my', 2:'our', 3:'your'}
d2_new = {1:'home', 2:'family', 4:'work'}def combine_strings(str1,str2):
    return str1+ ' '+ str2inter_string = {k:combine_strings(d1_new[k],d2_new[k]) for k in d1_new.keys() if k in d2_new}
inter_string**Output:** {1: 'my home', 2: 'our family'}

联盟

合并两个字典的代码类似于我们用来查找字典的键值对交集的代码,只是这里我们应该使用 merge 操作符:

union = dict(d1.items()|d2.items())
union**Output:** {'d': 4, 'c': 3, 'h': 8, 'f': 60, 'a': 1, 'e': 50, 'g': 7, 'b': 2}

边注:在 Python 3.9 中,这段代码简化为d1|d2

这里的问题是键c的值取自d2,而d的值取自d1。为了确定这些值是从哪里获取的,有一个更好的选择——解包操作符**:

union_d1 = {**d2, **d1}
union_d1**Output:** {'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'a': 1, 'b': 2}

此处所有常用键的值均取自d1。要从d2中取出它们,我们必须镜像代码:

union_d2 = {**d1, **d2}
union_d2**Output:** {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 50, 'f': 60, 'g': 7, 'h': 8}

如前所述,我们可能希望从两个字典中为每个这样的键取两个值,对它们应用一个函数(标准的或用户定义的),并将结果用作新字典中该键的值,而不是直接从其中一个字典中获取这些值。这里的方法包括:

  • 创建其中一个字典的副本,
  • 基于要应用的函数和来自另一个字典的值更新该副本,
  • 将更新的副本与另一个字典合并。
d1_copy = d1.copy()
d1_copy.update({k:max(d1[k],d2[k]) for k in d2 if d1.get(k)})
union_max = {**d2, **d1_copy}
union_max**Output:** {'c': 3, 'd': 4, 'e': 50, 'f': 60, 'g': 7, 'h': 8, 'a': 1, 'b': 2}

在这种情况下,我们使用了max()函数。然而,我们可以使用任何其他标准的或用户定义的函数,就像我们之前在寻找交集时所做的那样。

差异

为了隔离某个字典所特有的条目(即使相同的键可能以不同的值出现在另一个字典中),例如d1,我们可以使用下面两段代码中的一段:

dif_d1 = dict(d1.items() - d2.items())
dif_d1**Output:** {'f': 6, 'a': 1, 'e': 5, 'b': 2}

或者:

dif_d1 = {k:v for k,v in d1.items() if k not in d2 or d2[k]!=v}
dif_d1**Output:** {'a': 1, 'b': 2, 'e': 5, 'f': 6}

对于d2,代码必须被镜像:

dif_d2 = dict(d2.items() - d1.items())
dif_d2**Output:** {'h': 8, 'f': 60, 'e': 50, 'g': 7}

或者:

dif_d2 = {k:v for k,v in d2.items() if k not in d1 or d1[k]!=v}
dif_d2**Output:** {'e': 50, 'f': 60, 'g': 7, 'h': 8}

如果我们想将某个字典特有的键与它们相应的值隔离开来,例如d1,我们应该使用下面的字典理解:

dif_d1_keys={k:v for k,v in d1.items() if k not in d2}
dif_d1_keys**Output:** {'a': 1, 'b': 2}

对于d2:

dif_d2_keys={k:v for k,v in d2.items() if k not in d1}
dif_d2_keys**Output:** {'g': 7, 'h': 8}

对称差

最后,为了找到对称差异,即对于字典唯一的关键字及其相应的值,我们需要:

  • 为了根据最后一个公式找出两个字典的差异,
  • 将得到的字典合并成一个。
sym_dif = {**{k:v for k,v in d1.items() if k not in d2}, **{k:v for k,v in d2.items() if k not in d1}}
sym_dif**Output:** {'a': 1, 'b': 2, 'g': 7, 'h': 8}

结论

总结一下,我们考虑了在 Python 中对两个字典执行主要逻辑操作以创建新字典的快速而全面的方法。我们发现我们的两个字典的交集、并集、差集和对称差集都是在只有键和键值对的层次上,有时对键使用不同的函数。当然,这些方法并不是唯一的,您可以提出其他想法,或者在 Python 的未来版本中,将会引入更明确的方法来完成这些任务。然而,建议的代码片段简洁、优雅,而且几乎都是一行程序。

感谢阅读!

如果你喜欢这篇文章,你也可以发现下面这些有趣的:

https://betterprogramming.pub/read-your-horoscope-in-python-91ca561910e1 [## 在 Faker 库中测试生日悖论(Python)

towardsdatascience.com](/testing-birthday-paradox-in-faker-library-python-54907d724414)

美化终端的简单方法

原文:https://towardsdatascience.com/the-easy-way-to-prettify-your-terminal-24da896b031a?source=collection_archive---------11-----------------------

以确保你是有效率的,同时,让眼睛放松。

郭罗兰Unsplash 上的照片

从事数据科学工作需要花费大量时间在终端上摆弄命令。无论是运行脚本、处理版本控制、运行和管理容器——涉及终端的各种工作随处可见。

现在大多数 Linux 和 MacOS 机器的默认设置是 zsh 终端。它通常看起来像这样:

我的旧终端。不太好看,是吧?

没有什么能阻止我们承认它看起来很无聊。现在,把它广泛应用到我们的日常生活中,你就会知道它会有多单调了。

这就是定制的魔力所在。

对于我们这些对神秘的点文件知之甚少的数据科学家来说, zsh 终端可以让我们轻松地用定制的外观(主题化的)和许多强大的功能来构建我们自己的终端。

让我向你展示我如何使用一个开源库和一些我自己的定制来美化我的终端,这一切都是在一个小时内完成的:

我的新终端!看起来很棒,对吧?

我们开始吧👇

安装 ohmyzsh

ohmyzsh 是一个以作为定制 zsh 终端的终极框架而自豪的库。

它有一个很酷的主题,你可以想象的每个开发主题的基本插件的巨大集合,并具有定制它们的灵活性!

总而言之,这几乎是我们终端检查尝试的基础,所以让我们继续把它安装到我们的系统中。

但是首先,请检查你主目录下的**.zshrc**文件。如果它是空的,继续下面的安装,如果不是,请确保先备份文件。ohmyzsh 实际上在安装时覆盖了该文件,因此您之前的所有配置都将丢失。

在我的情况下,我必须做一个备份,因为我想确保我的 miniconda 配置和 Android SDK 路径不会丢失。

好的,安装可以通过一个简单的命令来完成:

*sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"*

在库的 GitHub 页面上也有其他的安装方法,如果你不能这样做的话,一定要去看看。

现在,让我们继续将主题应用到终端的步骤!

新的主题码头

在图书馆的 wiki 页面上,列出了一百多个主题及其对应的截图。去吧,花点时间浏览并选择你喜欢的。

对于这个演示,我选择了 dstufft 主题。

在您最喜欢的文本编辑器中打开您的.zshrc文件,并将这些行粘贴到其中:

*export ZSH="/Users/**username**/.oh-my-zsh"ZSH_THEME="dstufft" # at the end of the file
source $ZSH/oh-my-zsh.sh*

记得替换你的用户名并保存。现在,继续打开一个新的终端选项卡。

现在你就可以使用你的主题终端了!

太好了!你做到了!我告诉过你这很简单,不是吗?😄

现在有趣的部分来了。如果你不喜欢主题中定义的颜色,想用你自己的颜色来定制(像我一样),你也可以这样做。

让我们看看如何!

定制主题颜色

打开终端,输入:

*spectrum_ls*

您将会看到由多行颜色和数字组成的输出,如下所示:

多种颜色可供你使用!

现在从目录中打开主题的源代码→ ~/。oh-my-zsh/themes/dstuftt . zsh-theme

让我们看看我们可以改变的各个部分:

*function prompt_char {  git branch >/dev/null 2>/dev/null && echo '**±**' && return    hg root >/dev/null 2>/dev/null && echo '**Hg**' && return    echo '*****'}* 

这里,注意粗体字。这些是出现在终端上的提示符号。随心所欲地用任何其他符号甚至表情符号来改变它们!

接下来是提示的主要部分——主机名和用户名以及对目录的描述。****

*PROMPT='%{$**fg[magenta]**%}%n%{$reset_color%} at %{$**fg[yellow]**%}%m%{$reset_color%} in %{$**fg_bold[green]**%}%~%{$reset_color%}$(git_prompt_info)$(virtualenv_info)$(prompt_char) '*

您可以更改以粗体突出显示的部分。您可以在这些地方替换之前选择的颜色代码

只要将 \(fg[magenta]** 替换为 **\)FG[COLOUR-CODE] 就可以了。

主题代码的其余部分也是如此。在那里,您可以更改 git 分支信息的显示方式:

*ZSH_THEME_GIT_PROMPT_PREFIX=" on %{$fg[magenta]%}"ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[green]%}!"ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[green]%}?"ZSH_THEME_GIT_PROMPT_CLEAN=""*

完成后,保存文件并打开一个新的终端标签。

现在,您应该可以在提示中看到您的更改。

添加一些“别名”

我做的最后一件事是设置一些别名命令。

这些反映了我在终端中经常使用的命令以及我想简化的命令。这就是全部了。

例如,现在,我可以输入:

*gs*

而不是完整的:

*git status*

来获取我的 git 分支的状态。等等,你明白了。

别名可以像中那样定义。zshrc* 文件也是:*

*alias gs="git status";alias gb="git branch";# and so on...keep all you want to!*

一些离别的话…

这就是我如何定制我的终端的外观和感觉,以及添加一些生产力特性。

从这里去哪里?嗯,我可以推荐您探索 ohmyzh 存储库中更多可用的插件。他们大谈特谈它们的用处,其中一些还提供了许多预置的别名!

如果你想看看我定制的终端的最终代码,我已经将它们存储在这里,还有我所有编程和数据科学文章的代码和资源。⭐️回购,看看周围!

喜欢我的文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。这将帮助我支持我的写作努力:)

我的另外几篇文章你可能会觉得很值得一读:

* [## 将 Docker 与 VSCode 结合使用的好方法

towardsdatascience.com](/the-nice-way-to-use-docker-with-vscode-f475c49aab1b) https://pub.towardsai.net/7-awesome-jupyter-utilities-that-you-should-be-aware-of-f3afdb75c2b *

Eclat 算法

原文:https://towardsdatascience.com/the-eclat-algorithm-8ae3276d2d17?source=collection_archive---------0-----------------------

使用 Python 中的 Eclat 算法进行购物篮分析的频繁项集挖掘

Eclat 算法。玛丽-米歇尔·布沙尔在 Unsplash 上拍摄的照片。

在这篇文章中,你将学到你需要知道的关于 Eclat 算法的一切。Eclat 代表等价类聚类和自底向上格遍历,它是一个用于关联规则挖掘的算法(它也重组了频繁项集挖掘)。

关联规则挖掘和频繁项目集挖掘在它们用于购物篮分析的应用中最容易理解:这里的目标是理解购物者经常一起购买哪些产品。

然后,这些关联规则可以用于例如推荐引擎(在线购物的情况下)或者用于离线购物的商店改进

关联规则挖掘的 ECLAT 算法

ECLAT 算法并不是第一个用于关联规则挖掘的算法。该领域的基础算法是 先验算法 。由于 Apriori 算法是该领域中提出的第一个算法,它在计算效率方面得到了改进(即,他们做出了更快的替代)。

ECLAT vs FP 增长 vs 先验

Apriori 算法有两个更快的替代方案,它们是最先进的:其中一个是 FP Growth ,另一个是 ECLAT 。就执行时间而言,FP 增长和 ECLAT 之间没有明显的赢家:它将取决于不同的数据和算法中的不同设置。

ECLAT 算法的一个用例示例

现在,让我们介绍一个示例用例,让这个主题更加实用。在本文中,我们将采用一个夜店交易的小数据集。对于每笔交易,我们都有一个产品列表。

相同的数据集在早先的文章中用于 Apriori 算法FP 增长算法,因此我们可以使用它们作为基准并验证获得的结果是否相同。

原始数据集如下所示:

ECLAT 算法。事务数据集。

正如你已经看到的,这家夜店的顾客主要购买啤酒、薯片、葡萄酒之类的东西,还有一些其他产品。

ECLAT:速度更快但指标更少

如果你已经熟悉了频繁项集挖掘或者关联规则挖掘的其他算法,有一件小事可能会让你大吃一惊。尽管大多数算法都包含一些关于它们的规则的关键指标,ECLAT 却没有这样做。

例如, ECLAT 并不能给你信心和 升力指标,而这些对于替代车型的解释是必不可少的。另一方面,这允许模型更快:用户可以在速度和拥有更多度量之间做出选择。

ECLAT 算法是如何工作的?

现在让我们通过手动复制算法的步骤来进入 ECLAT 算法。

步骤 1 —列出每个产品的交易 ID (TID)集合

第一步是制作一个列表,其中包含每个产品的交易 id 列表。下表显示了该列表。

ECLAT 算法。为每个产品设置的交易 ID (TID)。

这些事务 ID 列表被称为事务 ID 集,也称为 TID 集。

步骤 2 —使用最小支持度进行过滤

下一步是决定一个叫做最小支持的值。最低支持将用于过滤掉不常出现的产品。

在当前示例中,我们将选择值 7 作为最小支持。正如您在步骤 1 的表格中看到的,有两种产品的 TID 集合包含少于 7 个交易:面粉和黄油。因此,我们将它们过滤掉,得到下表:

ECLAT 算法。过滤掉未达到最低支持的产品。

步骤 3 —计算每个产品对的交易 ID 集

我们现在来看成对的产品。我们将基本上重复与步骤 1 相同的事情,但现在是针对产品对。

ECLAT 算法的有趣之处在于,这一步是使用两个原始集合的交集来完成的。这使得它不同于 Apriori 算法。

ECLAT 算法速度更快,因为识别交易 id 集合的交集扫描每个单个交易是否存在产品对(如 Apriori 所做的)要简单得多。在下图中,您可以看到如何轻松地过滤出葡萄酒和奶酪产品对之间常见的交易 id:

ECLAT 算法。找到事务 id 的交集比扫描整个数据库更容易

对每个产品对进行交集运算时(忽略未单独获得支持的产品),会得出下表:

仍在竞争中的所有产品对的事务 ID 集。

步骤 4-过滤掉没有达到最小支持度的对

和以前一样,我们需要过滤掉没有达到最低支持度 7 的结果。这使得我们只剩下两种产品组合:葡萄酒和奶酪以及啤酒和薯片。

ECLAT 算法。有两个产品对获得支持。

第五步——只要你能在支撑位上方建立新的对子,就继续做下去

从这一点开始,尽可能长时间地重复这些步骤。对于当前示例,如果我们创建三个产品的产品对,您会发现没有任何三个产品的组达到最低支持级别。因此,关联规则将是上一步中获得的规则。

Python 中的 ECLAT 算法

在这个练习中,我们将使用 Python 中的 pyECLAT 包。这是一个非常容易使用的软件包。如果您在笔记本电脑环境中,可以按如下方式安装它:

ECLAT 算法。安装 pyECLAT。

一旦你安装了这个包,你需要一个输入数据的方法。在这种情况下,让我们以列表的形式输入数据。每笔交易都表示为一个产品列表。您可以这样做:

Eclat 算法。输入数据。

pyECLAT 库将数据帧作为输入。您可以简单地将您的事务列表转换成一个数据框架,pyECLAT 包会处理剩下的事情。在生成的数据框中有许多非值并不是问题。

ECLAT 算法。重新组织数据。

这是数据的样子:

ECLAT 算法。重新组织的数据

现在您已经有了数据,您需要指定一些算法参数。首先,您需要指定您感兴趣的最小项目集大小。在这种情况下,我们感兴趣的是产品关联,所以我们想省去单个(1-item)项目集:最小大小需要是 2。

我们还需要将我们的最小支持值转换成百分比,这很容易做到,如下面的代码所示。

最后,pyECLAT 包希望我们指定一个最大大小。我们没有项目集的最大大小(我们也会对大的产品关联感兴趣)。因此,我们取最大交易规模。

ECLAT 算法。准备算法设置。

现在我们已经有了所有必要的输入,我们终于可以开始使用 pyECLAT 包了。这有两个步骤:首先实例化,然后拟合算法。您可以这样做:

ECLAT 算法。执行算法。

fit 方法返回两件事:所谓的关联规则索引和所谓的关联规则支持。正如我之前解释的那样,不会有很多指标。这里唯一有趣的事情是使用下面的代码来查看规则支持:

ECLAT 算法。打印规则。

您将看到有两个确定的规则:葡萄酒和奶酪,以及啤酒和薯片:

ECLAT 算法。最终规则

解释

对此的解读是,在我们夜店的成交里面,有两个产品组合是比较强势的。人们经常一起买酒和奶酪。人们也经常一起买薯片和啤酒。显然,将这些产品放在一起是一个好主意,这样人们可以很容易地同时使用它们。或者,也许店主可以考虑将产品包装成有吸引力的报价,以进一步促进这些产品的销售。

结论

在本文中,您发现 ECLAT 算法是进行关联规则挖掘或频繁项集挖掘的一种快速有效的方法。您已经看到,尽管它更快,但它比其他方法的度量更少,这也是它更快的部分原因。

在 Python 示例中,您已经看到了如何在一家夜店的交易数据示例中使用 pyECLAT 包。您已经看到了两个关联规则是如何被发现的,以及店主可以利用这些知识做些什么。

我希望这篇文章对你有用。感谢您的阅读,请不要犹豫,继续关注更多的数学、统计和数据内容!

快速运输的影响

原文:https://towardsdatascience.com/the-effect-of-fast-shipping-80c2ccebbd13?source=collection_archive---------21-----------------------

理解大数据

哈佛 IACS 顶点工程,2020 年秋季

队员:关毅兴、保罗-艾米尔、乔丹-特利、

顾问:尼克·斯特恩,克里斯·坦纳,纳撒尼尔·伯班克

免责声明:本博客中表达的观点仅代表作者个人观点,不代表哈佛或 Wayfair 的观点。

介绍

Wayfair 是一家销售家具和家居用品的美国电子商务公司。他们的数字平台提供来自 11,000 多家全球供应商的 1,400 万件商品。

快速运输产品是小包裹产品,可以在两个工作日或更短时间内交付给 Wayfair 的部分客户。然而,提供快速运输产品将在 Wayfair 方面产生更多成本。因此,我们有兴趣调查为产品添加快速运输选项是否会增加该产品的利润。特别是,我们希望:

  1. 估计所有产品、每个品类和每个产品的平均销售增长
  2. 衡量销售增长的边际效应:随着快速发货产品比例的增加,销售增长如何变化。
  3. 确定关键产品特性,这些特性将使产品销售对快速发货更加敏感

实验设计和数据收集

对于每个用户,他们被赋予一个s 值,该值是一个介于 25 和 75 之间的整数。这个数字直接对应于用户看到项目的快速发货标志(如果它可用)的概率。当一个用户浏览一个项目,它有快速运输,每个项目有 S%的机会显示快速运输标志。每个用户的 s 值是在该用户看到任何给定商品的快速运输时随机确定的。

我们得到的数据是汇总的。我们有每个(项目、运输标志、s 值)组合的数据,所以我们知道每个项目、每个 s 值的属性,当它被看到有和没有快速运输时。下面给出了两个假项目的例子,以便读者可以理解确切的格式。

举例说明我们拥有的数据的确切格式

对于每个项目,我们有 51(对应于从 25 到 75 的每个 s 值)乘以 2(快速发货标志真/假)行= 102 行。

我们得到的确切属性如下:

  1. wfsku —内部唯一物品标识符
  2. s 值 —分配给查看商品的客户的 s 值
  3. cartshowshipflag —是否看到带有快速发货标志的商品
  4. ****impression nt—实验中该项目的搜索页面浏览量
  5. avgsortrank —在搜索页面上看到的项目的平均排序排名
  6. pdpcnt —产品展示页面点击接收项的次数,即搜索页面点击接收项的次数
  7. numord —包含该商品的订单数量
  8. qtyord —订购的该物品的数量

numord 和 qtyord 的区别如下:如果一个用户订购了三把相同的椅子,那么 numord = 1,qtyord = 3。

我们还被给予关于项目的一般属性,如产品的类别和市场类别名称、评论计数、平均评级、平均订单重量,以及实验前 90 天的数字,对应于印象、产品显示页面点击、订单数量和订购数量。

数据探索和过滤

在我们开始为这个项目挑选和训练模型之前,对收集的数据进行初步分析。在这里,我们强调一些关键问题和发现,以及我们如何解决它们。

扭曲的数据

图 impressioncnt、pdpcnt、numord 和 qty order 的偏斜数据分布。(在某些图中,根据合作伙伴的要求,省略了数字刻度。除非另有说明,所有省略的刻度都是线性的。对于该图,y 轴是对数刻度。)

如图 1 所示,在实验过程中,顾客购买了非常大量的受欢迎的产品,压倒了其余产品的销售。类似的事情也发生在产品印象数、产品展示页面点击数、平均排序排名等方面。当我们在建模中使用这些变量时,为了避免少数几个大值控制模型,有必要采用日志或其他方法进行重新缩放。此外,我们必须确保大量接近于零的值不会淹没其余的值。

线性缩放模式

图 2:当类别 ID 为 12 的 s 值增加时,有无快速发货的销售如何变化。

如图 2 所示,对于许多类别的产品,该类别中快速运输的销售额随着 s 值的增加而线性增加;随着 s 值的增加,没有快速运输的产品的销售线性下降。这是一个实验过程的机械制品。另外,随着 s 值的增加,出货快的产品销量的增加总是大于出货不快的产品销量的减少。

数据过滤

由于数据是高度倾斜的,我们必须过滤掉数据中的噪声和异常值,以避免未定义的或极端的值估计。在这里,我们列出了我们在这个项目中使用的过滤器,并提供了所有这些过滤器的理由:

  1. ****采用和不采用快速发货的最小订单数量和销售数量:避免未定义/极端的销售乘数
  2. *与过去 90 天的销售记录一致**:假设一个产品在实验前的 90 天内卖出了 N90 份(带快运),在实验期间没有快运卖出了 N0 份,带快运卖出了 N1,那么我们强制 N0+N1≥ (1-t) 0.7 41/90 N90,其中 t 是我们可以容忍的最大销售变化率(在本项目中设为 0.5)。这里 41 是这个实验持续的天数,0.7 是被引导到这个实验中的客户的百分比。
  3. ****根据印象或销售额排名前 50%的受欢迎产品:受欢迎的产品获得了最多的客户曝光率,并创造了大部分的产品销售额。因此,我们的利益相关者更关心受欢迎的产品,而这些受欢迎的产品数据不太容易受到噪音的影响。

文献评论

在这里,我们先简要回顾一下我们在这个项目中使用的统计模型、软件包和符号,然后再介绍我们采用的建模方法。

回归模型

为了研究快速发货的影响,我们从订单数量的线性回归开始。然后我们继续进行关于订单数量的泊松回归,因为我们回归的变量总是一个整数。最后,我们使用二项式回归来回归(已完成/成功)订单的数量,给定产品加载到搜索页面的次数,以考虑随着 s 值的增加而增加的暴露量。

异质处理效果 EconML 包

虽然回归确实为我们提供了一种研究快速装运效应的方法,但对这类问题更正式的方法通常是异质处理效应分析和推断。异质治疗效果分析考虑了治疗和各种其他属性之间的相互作用不一定是线性的这一事实,并提供了对相互作用项进行建模的正式机制。本节将提供 EconML 软件包的基本介绍性概述,EconML 是一个强大的 python 库,它使我们能够在各种情况下通过推理分析执行异质效应分析,以及我们将在稍后展示模型以估计异质治疗效应时广泛使用的符号。

设 Y(T)为响应变量,T 为处理指标,X 为异质性指标,从 t0 到 t1 的异质性处理效应表示为τ(t0,t1,x)=E[Y(t1)-Y(t0) | X=x]。

我们假设我们有如下形式的数据:{Yi(ti),ti,,wi}:

  1. Yi(ti) :所选治疗的观察结果→ numord,qtyord
  2. ti :治疗→ cartshowshipflag (1,0)
  3. xi :用于异质性的协变量(即可能与 ti 相互作用的变量)→ S 值
  4. wi: 其他可能影响我们响应变量的参数→通用产品属性,如 90 天、评级、价格等。

我们假设我们的目标量τ(异质治疗效果)具有以下结构:

  1. Y=H(X,W)T + g(X,w,ϵ)
  2. T=f(X,W,η)
  3. τ(t1,t0,x)=EH(X,W) | X=x

这里η和ϵ是相加的噪声因子,h,g,f 是函数。EconML 包中的 BaseCATEstimator 类将通过少量的编码为我们提供治疗效果的置信区间。

基于树的模型

  1. 贝叶斯可加回归树

与树方法相反,参数模型确实有局限性,因为它们不适合许多类型的函数。贝叶斯加性回归树像梯度推进树一样对顺序弱学习器的贡献求和。前者与后者之间的主要区别在于,使用先验分布来正则化树(例如,它控制树的深度,它倾向于从每个叶子内的平均值收缩分布,等等)。).这种内置的惩罚避免了调整任何超参数和正则化。该模型的另一个主要好处是,我们可以从计算的后验分布中获得更丰富的信息。需要一个 MCMC 采样器,用于种植新树和采集样本。

2.诚实的树和因果的森林

这些模型被设计用于因果推断以测量治疗效果。诚实的树被称为“诚实的”,因为它们在数据的一部分被训练,在另一部分被评估。更准确地说,构建这样的树是为了最小化考虑了每个叶子中的方差和叶子之间的协方差的度量,然后它评估每个叶子对数据的剩余部分的处理效果。这些树被设计来平衡准确性,同时没有太多的不确定性。因果林是这些树的集合。像在随机森林中一样,个体诚实树可以用数据和特征的不同子样本来生长,以确保它们的结果之间的某种独立性。对我们的问题使用因果森林的优点是,我们可以首先从非线性中受益,以拟合我们的数据。第二,“诚实”成分将使得能够具有对异常值稳健的模型,并且将在评估治疗效果时限制测量噪声。

基于聚合的方法

估计快速发货的平均效果的一个自然方法是简单地将它计算为有快速发货的总销售额除以没有快速发货的总销售额。

任务 1:销售额的平均提升

如果不过滤掉销量很少或没有销量的产品,我们得到的最终价值是 1.25 倍(即销量增长 25%)。这个数字可能被高估了,因为我们没有考虑到由于快速运输而增加的产品暴露。

图 3:每个类别和每个产品的销售乘数分布

我们还计算了每个类别和每个产品的平均销售乘数,并在图 3 中显示了它们的分布。在这里,当我们将范围从所有项目缩小到特定的类别和产品时,销售数据变得更加嘈杂。因此,我们根据以下标准过滤掉一些数据,以避免未定义或极端的销售乘数值:

1)对于一个类别,如果该类别中有快速发货或没有快速发货的产品的总销售额低于阈值(图 3 中设置为 100),我们将跳过该类别。

2)对于一个产品,如果有快速发货或没有快速发货的产品的总销售额低于一个阈值(图 3 中设置为 40),我们将跳过该产品。

任务 2:S 值的影响

提醒一下,任务 2 的目标是衡量随着快速发货产品比例的变化,销售增长如何变化。我们使用了三种不同的模型来尝试回答这个问题:线性回归、泊松回归和二项式回归。

作为一个简单的基线模型,我们计算了每个 s 值的订单总数和订购商品总数,并回归了 s 值的总和。这在下面的图 4 中可以看到。

图 4:线性回归。

然而,这个模型被认为是幼稚的,因为我们没有考虑印象的数量。在较高的 s 值下,项目会获得较高的曝光度,因为当显示快速运输时,搜索排序算法会有所提高。正因为如此,我们会自然而然地期望在更高的 s 值下有更多的订单,所以这些数字代表了两种不同处理的组合效果:排序提升和运输标志。

我们还使用泊松回归来重复上述模型,因为售出的订单数/数量总是整数类型。我们发现,s 值增加 1 会导致订单数量和订购商品数量都成倍增加约 1.001。这听起来不是很多,但如果我们考虑从 S = 25 移动到 S = 75,这是大约 1.05 的倍数增加。然而,在这个模型中,我们也没有考虑暴露程度,所以我们不能直接使用这个结果来回答任务 2。

为了纳入暴露水平,我们考虑了二项式回归模型。设 Yi 为 S = Si 时的总订单数,Ni 为 S = Si 时的敞口,那么我们可以说 Yi =二项式(Ni,pi),其中 pi 依赖于 Si。我们直觉地认为,在更高的 s 值下,我们会收到更多的订单,这是由于快速运输带来的分拣提升。

然而,我们发现事实并非如此。考虑下面的图 5。

图 5:二项式回归问题

在这些图中,我们对订单总数、产品显示页面点击总数和搜索页面显示总数进行了求和。我们绘制了订单数除以曝光度的图表——左边是产品显示页面点击率,右边是搜索页面浏览量,这给出了导致订单的产品显示页面点击率或浏览量。我们看到,随着 s 值的增加,速率没有增加或减少。我们查看了特定的类别、特定的商品以及 10 个或 10 个以上订单的商品,它们都遵循相似的趋势。

我们能想到的第一个解释是,当提供几个快速运输的项目时,用户可能会经历选择麻痹。如果你正在购买一个沙发,并看到几个快速发货,这可能比你只看到一个快速发货的沙发更难决定。另一种解释是,根据产品是否接受快速装运处理,这两种费率可能表现不同。我们对上面的发现很感兴趣,我们决定更深入地研究不同转换率和快速发货之间的关系,并引出了一种不同的建模方法,我们将在后面的部分中介绍这种方法。

任务 3:对快速装运敏感的产品特性

此任务的主要目标是确定关键产品特征,使产品销售对快速发货更加敏感。

  1. 产品特性分布

解决上述问题的一种方法是首先将所有产品分为三组:

  1. 如果提供快速发货,销售额至少增加 10%的产品组,
  2. 如果提供快速发货,销售额至少下降 10%的产品组,以及
  3. 不在前两组中的产品组(即,对快速发货不太敏感)。

然后,对于每个产品特性,我们将该产品特性在上述三组中的分布可视化。分布的清晰分离意味着这种产品特性可以使产品在质量上对快速发货更加敏感。

图 6:选定产品特征的分布

图 6 显示了三个产品特征分布的清晰分离:评论计数、印象计数(产品加载到页面上的次数)和产品价格。我们可以看到,当一个产品的评论或印象数较少或价格较低时,如果提供快速发货,则该产品的销售额更有可能下降至少 10%。然而,这种方法不能定量地确定一个产品特性的变化如何影响最终的销售乘数,我们将在下一节解决这个问题。

2.治疗效果的基线模型—线性回归

在本节中,我们开发了一个具有线性回归的基线模型,以量化每个定量变量(例如,审查数量、平均评级、权重、实验前 90 天的先前观察结果等)的平均治疗效果变化。

在此模型中,我们对不同 S 值的订购数量进行求和,并为每个回归保留一个变量,以隔离其影响。更准确地说,每个回归模型的预测变量是快速发货二元变量(处理)、要评估的产品特征以及两者之间的相互作用。我们选择订购数量作为我们的输出变量。

图 7:线性回归模型中处理和标准化产品特性之间的相互作用系数。

图 7 显示了处理和每个产品特性之间相互作用项的系数。所有产品特性之前都已标准化。如果产品特性增加一个标准偏差,这个系数可以解释为订购数量的平均增加。我们使用随机高斯变量进行模拟,以了解这些系数的重要性。我们观察到,导致平均治疗效果变化最大的特征是与受欢迎程度相关的特征(90 天订单计数、产品评论计数、90 天产品显示页面点击计数等)。

与数量订单的范围相比,相互作用系数的值较小,这可以通过线性回归对所有产品给予相同权重的事实来解释。因此,由于每个产品的订单分布是偏斜的(大多数产品的销售额较低),该模型不会对少数产品给予很多信任,这些产品可能已经收到了较高的治疗效果差异。为了改善我们的研究,我们应该考虑非线性模型,并可能包括不同变量和治疗效果之间的交叉作用。

3.基于树的模型

在我们定义基于树的模型的处理效果之前,我们需要首先引入一些符号:

- N:体验中 70%的客户生成的订单数量

- N0:没有快速装运处理的订单数量

- N1:快速发货处理的订单数量

- N = N0 + N1

假设快速出货完全没有影响,那么 N0 = 49% N,N1 = 51% N

如果实验在与之前 90 天期间相同的条件下运行,那么 N ≈ 70% *41/90 *N90,其中 N90 是实验前 90 天的订单数。

用这些符号,有两种方法来定义治疗效果:**

  1. N1-N0:订单数量的绝对增长。这是治疗效果最直接的定义,但我们发现这个定义的变量与产品的受欢迎程度(大量订单)高度相关。BART 和因果森林生成的结果与基线模型已经确定的结果相似:关键特征是与产品受欢迎程度相关的特征。
  2. N1/N1-N0/N0:重新调整后的销售增长百分比。然而,这种划分使得以这种方式定义的治疗效果对销量很少的产品的噪声高度敏感,如图 8 所示。我们发现,最终,使用这种治疗效果定义训练的基于树的模型生成的预测只对流行产品有效,并且识别的关键特征也是与产品的流行度相关的特征。

我们用 BART 和 Causal Forest 获得了类似的结果,根据销售额增加的重新标度百分比来估计治疗效果。图 8 显示了因果森林模型的预测处理与实验前 90 天内订单数量的实际销售重标差异的比较。我们观察到治疗效果总是略呈正的,这让我们认为一个负的治疗效果只是噪音。我们能够识别出我们模型的最佳预测值是与产品受欢迎程度相关的预测值,如图 9 所示。这些模型的置信区间远非精确,因为大多数观察点并未落入其相应预测值周围的 95%范围内。因此,我们避免从这些森林模型中得出产品特性对处理效果影响的结论。

图 8:基于树的模型生成的预测。请注意,随着 90 天订单数(产品的受欢迎程度)的增加,治疗效果的方差会减小。

图 9:由基于树的模型识别的关键产品特征。请注意,前 3 个关键特征:产品显示页面点击计数、评论计数和平均排序排名都与产品的受欢迎程度相关。

问题

我们现在总结基于汇总的方法的缺点,然后在下一节中使用基于转换率的方法来解决这些缺点:

首先,如上所述,这种方法没有考虑到这样一个事实,即快速运输提供的分类提升也可以增加产品的曝光率,从而增加最终的销售数字。如果我们只想量化“纯”快速发货的影响,我们必须对快速发货、产品曝光和销售之间的相互作用进行建模。

第二,在计算销售乘数以过滤噪声产品之前,我们使用的过滤阈值有些武断。当我们查看子类别的这些估计值时,其中一些估计值对使用的阈值很敏感。

第三,由于这个实验实现中的一个小缺陷,处理稍微不对称:当我们合计所有 s 值中已经或没有看到该产品快速发货标志的客户数量时,我们将发现大约 51%,而不是 50%的客户显示了快速发货标志。我们必须在销售乘数估算中考虑到这一点。

基于转换率的方法

针对上述问题,经过仔细考虑,我们决定
将快速装运的影响视为以下两种影响的组合:

  1. ****更好的印象到 pdpcnt 的转换率:如果一个产品被加载到一个页面上,由于快速发货的徽章,更有可能被点击到产品展示详情页
  2. ****更好的 pdpcnt 到 numord/qty order 的转换率:如果点击并加载产品显示详情页面,由于提供快速发货,产品更有可能被订购

然后,对于每种产品,我们采取以下步骤来衡量快速发货的效果:

  1. 计算 impressioncnt 到 pdpcnt 的转换率,分别使用和不使用快速发货:x0 和 x1
  2. 计算 pdpcnt 到 numord/qty order 的转换率,分别使用和不使用快速发货:y0 和 y1
  3. 转换率乘数估计值则为 x1y1/(x0y0)

这种方法解决了基于聚集的方法的三个主要问题:
1)它在某种意义上是“印象独立的”:假设一个产品 p 在页面上加载了 t 次。如果没有快速发货,它将被卖出 x0y0t 次;随着快速运输,它将出售 x1y1t 倍。销售乘数估计为 x1y1t/(x0y0t)=x1y1/(x0y0)独立于印象数 t.
2)过滤的必要性大大降低。例如,在这个框架中,我们不再需要担心某个产品在没有快速发货的情况下只卖出了一两笔,而在提供快速发货的情况下却卖出了几十或几百笔。
3)前面提到的 51/49 偏差不再是一个问题,因为它只对产品收到的印象/曝光有影响,这种方法在某种程度上是“印象独立”的。

任务 1:销售额的平均提升

图 10 显示了新的每产品销售乘数分布,定义为从印象到订购数量的转换率。有趣的是,如果在这种框架下提供快速发货,只有大约 30%的产品会收到销售促进效果。对于这些收到销售促进效果的产品,平均销售乘数估计为 1.46 倍(即销售额增长 46%)。如果包括所有产品,平均销售乘数估计值将变为 0.85 倍(即销售额下降 15%)。

图 10:新框架下的每件产品销售乘数分布

为了理解这个数字,我们还研究了如上定义的每个产品的 x0、y0、x1、y1 值,并发现:

  1. 对于仅 40%的产品,如果客户在产品展示页面,并且相关产品提供快速发货,他们更有可能订购购买产品。
  2. 对于仅 20%的产品,如果这些产品被加载到显示给客户的页面上,客户更有可能点击产品显示页面。其余 80%的产品无法有效利用快速运输带来的分拣提升。如果由于排序提升,这些产品在搜索页面上显示给更多的客户,那么点击它们的客户就会减少。

任务 2:S 值的影响

图 11 显示了当 s 值从 25%增加到 75%时,不同转换率的变化情况。这里的转换率是所有产品的平均值。我们决定取所有产品的平均值,因为对于大多数(产品,s 值)对,产品显示页面的点击数和销售量都是 0。因此,该(产品,s 值)对的转换率为 0。

图 11:转换率:(a)从印象到订购数量,(b)从印象到产品展示页面点击,(c)从产品展示页面点击到订购数量

在图 11 中可以观察到几个重要的现象。首先,从印象到订购数量的转换率(没有快速发货)和从产品显示页面点击到订购数量的转换率(没有快速发货)都随着 s 值的增加而降低,如图 11(a)所示。这是有道理的:随着客户发现越来越多的产品提供快速运输,没有“快速运输”肯定会使产品对客户的吸引力下降。

第二,随着 s 值的增加,从印象到产品展示页面点击的转换率在有无快速发货的情况下基本保持不变,如图 11(b)所示,与图 11(c)中的转换率相反。由于我们将快速发货的影响视为从印象到产品显示页面点击以及从产品显示页面点击到订购数量的转换率提高的影响的组合,我们可以推断,在这个项目中,快速发货的影响对从产品显示页面点击到订购数量的转换率的影响比从印象到产品显示页面点击的转换率的影响大得多(几乎可以忽略不计)。

第三,从印象到订购数量的转换率随着 s 值的增加而增加,如图 11(a)所示。如上所述,我们将这一增长主要归因于产品显示页面点击量到快速发货订购量的转化率的提高。最初,我们预计,随着 s 值的增加,从印象到快速发货订购数量的转换率会降低,理由如下:随着 s 值的增加,客户可以获得更多的快速发货选择。因此,快速发货作为加分项在客户决策过程中的权重会降低,这导致任何给定产品从印象到订购数量的转化率降低。然而,根据我们上面的发现,我们意识到,当客户从一系列在线选项中选择时,价格、封面照片、评论率等产品属性通常是比快速发货更重要的因素。因此,我们最初的推理不成立。

任务 3:对快速装运敏感的产品特性

即使在 50%最受欢迎的产品中,从产品显示页面到订单以及从印象到订单的转化率也在 1e-6 到 1 之间。有了这样的可变性,我们决定测量这两个转换率的对数的治疗效果。例如,对从产品显示页面点击(PDP)到订单率的转换率的对数的处理效果是:

其中 N⁰和 n 分别是处理前后(即,快速运输前后)的观察量。

下面的图 12 显示了该变量与 PDP 数量的对数的关系(产品显示页面,在一定程度上反映了产品的受欢迎程度)。除了最受欢迎的产品之外,这一变量的治疗效果的方差并不像我们之前看到的那样随着产品受欢迎程度的变化而变化。这种处理效果的平均值是负的(接近 0.050),因此平均而言,当提供快速运输时,PDP 转换率比没有快速运输时低 9.2%。这种趋势可以通过以下事实来解释:PDP 数量对快速发货比订单数量更敏感,即,在百分比上,PDP 数量随着快速发货比订单数量增加得更多。因此,转换率平均随着快速运输而下降。我们观察到印象到订单的转换率也有类似的模式,平均下降了 32%。

图 12:观察到的对对数 PDP 转换率的处理效果与对数 PDP 的关系(针对前 50%最受欢迎的产品)

然后,我们通过将过滤后的数据集分成训练集和测试集来评估多个模型。我们比较 MSE 得分和 95%置信区间准确性(即,在预测置信区间内的观察点的比率)的准确性。结果如图 13 所示。

这里,基于双稳健学习(DRL)算法的线性 DRL 是一种首先应用任意机器学习模型来拟合治疗和响应,然后使用线性模型从治疗残差预测响应残差的方法。我们用特定治疗 T 估计我们的预测结果 Y 为:

其中 T 是离散处理的一个热编码,p(Xi,Wi)是通过运行分类从(X,W)预测 T 而计算的倾向模型,g(X,W)是回归模型,使得 g(X,W) = E[Y |T,X,W],并且我们可以通过简单地回归 Y(i,1)-Y(i,0)来学习处理θ(X)。对于这项任务,我们重点研究该模型的以下参数:

  1. 模型回归:E[Y |T,X,W]的估计量。通过在(特征、控制、一次性编码处理)连接上回归 Y 来训练。
  2. ϕ(X)(特征):用于在最终 CATE 回归中创建复合特征

总之,我们首先通过在(X,W)上运行 Y 的回归来训练回归模型 g(X,W),并通过运行分类来从(X,W)预测 T 来训练倾向模型 p(Xi,Wi)。然后如上所述构造双稳健随机变量,并在 x 上回归它们。

图 13:模型性能比较

在对线性 DRL 的各种组合进行试验后,我们发现具有weighted lasscov和二次多项式特征的线性 DML 表现最佳,如图 13 所示。

图 14:不同模型的预测与观察到的效果

图 14 显示了不同模型的预测分布与观察到的治疗效果的真实分布的对比。我们可以看到,所有模型的预测都低估了真实的治疗效果,如图表中左移的中心所示。总体而言,与其他模型相比,具有多项式特征的 DRL 学习器具有最宽的分布,但是预测结果仍然以零为中心。图 15 详细显示了线性 DRL 预测与观察到的效应。如果我们研究我们模型的治疗效果系数,如图 16 所示,我们发现根据该框架下的 p 值(必须小于 0.05),没有显著特征高度预测我们的治疗效果。此外,在所有特征中,90 天订单计数,一个与产品受欢迎程度相关的产品属性,似乎仍然是最重要的一个,尽管不是治疗效果的高度预测。

图 15:线性 DRL 预测与观察到的效应

图 16:线性 DRL 系数

然而,当我们继续过滤掉不受欢迎的产品时,我们的 LinearDRL 学习器在置信区间的分布和准确性方面有了显著的改进,如图 17 和图 18 所示。然而,线性模型和系数在很大程度上保持不变。因果福里斯特方法产生类似的结果,尽管它在这个框架下不如线性 DRL 方法执行得好。

图 17:不同模型的预测与观察到的效果,过滤掉不受欢迎的产品

图 18:线性 DRL 的预测与观察到的效果,不受欢迎的产品被过滤掉

结论

我们在这个项目中研究快速装运的影响。我们先从基于汇总的方法开始,然后再讨论基于转换率的方法。使用基于聚合的方法,在不考虑排序提升如何对最终销售做出贡献的情况下,我们发现快速发货可以带来 25%的销售增长,这可能是一个过高的估计,订单数量和销售数量与 s 值的线性增长成比例。通过基于转换率的方法,我们发现,如果我们固定产品的曝光度,快速发货可以为转换率不会因快速发货而下降的产品带来 46%以上的销售额。与从印象到产品展示页面点击的转换率相比,快速发货对从产品展示页面点击到订购数量的转换率的影响要大得多。随着 s 值的增加,从印象到快速发货订购数量的转换率也增加。最后,在这两个框架下,我们发现与产品受欢迎程度相关的产品属性是使产品销售对快速发货更敏感的关键特征。

感谢

我们要感谢 Nathaniel Burbank(Wayfair)、Nick Stern(哈佛)和 Chris Tanner(哈佛)在整个工作过程中给予的支持和指导。

Wayfair 合作

海报链接:https://drive . Google . com/file/d/15Jqb _ gmwF _ gK _ zq 0 lm 0 rezwzzgaj-nHA/view?usp =共享

海报展示短片链接:https://drive . Google . com/file/d/1 LSM x 6 x 2 jezi 3 oucf 2 in 2 _ 0 ifastbgjp 0/view?usp =分享

参考

  1. 巴特:贝叶斯加性回归树。应用统计学年鉴 4(2010):266–298。
  2. 韦杰、s .和 s .阿西。"使用随机森林的异质处理效果的估计和推断."美国统计协会杂志113(2015):1228–1242。
  3. EconML : Python SDK,由新英格兰 MSR 的 ALICE 团队开发
  4. GRF :广义随机森林,一个基于森林的统计估计和推断的插件包。

监测频率对处方阿片类药物过量死亡率的影响

原文:https://towardsdatascience.com/the-effect-of-monitoring-frequency-on-prescription-opioids-overdose-death-rate-ccb4c9c741dd?source=collection_archive---------30-----------------------

药品图片,来自 UnsplashMyriam Zilles

具体和按部就班分析

在这篇博客中,我将描述监测频率如何影响处方阿片类药物过量的死亡率。具体过程包括背景介绍、文献综述、实证模型、数据探索、实证结果、未来检验、结论和政策含义以及引用。

简介

处方阿片类药物通常用于治疗急性疼痛,作为治疗的重要组成部分。然而,阿片类药物的误用和过量近年来在美国已经成为一个日益严重的问题。

每天,大约有 174 人会死于药物过量(Jalal,Hawre,et al 2018)。目前,阿片类药物,包括处方阿片类药物、海洛因和合成阿片类药物,如芬太尼及其化学类似物,是用药过量死亡的主要原因(Jalal,Hawre 等人,2018 年)。

加拿大政府从爱德华王子岛拍摄的阿片类药物过量图像的迹象

在这种情况下,系统动力学模型显示,阿片类药物过量危机预计将会恶化——预计到 2025 年,每年阿片类药物过量死亡人数将达到近 82,000 人(陈,秋实,等,2019)。因此,美国政府决定建立处方药监控计划(PDMPs)来对抗这种严酷的状况。目前,监测强度每增加 1 个点,用药过量死亡就减少 1%(Pardo,Bryce。,et al 2017)。

综上所述,我们可以从不断增长的死亡趋势中得出结论,有大量的患者和药物滥用者无法控制自己对处方阿片类药物的过量使用,因为他们可能无法控制自己,并且缺乏关于过量使用的危害的关键信息。因此,有更好的处方药监测计划(PDMPs)是必要的,以干预这些人的近视行为,降低政策制定者因阿片类药物过量而导致的不必要的高死亡率。

文献综述

在文献综述部分,我将按时间顺序介绍四篇与阿片类药物过量相关的文献,以展示处方药监测计划对处方阿片类药物过量死亡率的影响如何随时间变化。

第一篇文献在州一级量化了处方药监测计划(PDMPs)与药物过量死亡率之间的关系。这表明,虽然 PDMPs 可能是防止非法使用处方物质的重要工具,但其影响并未反映在药物过量死亡率中(Paulozzi,Leonard J .,等人,2011 年)。它们对处方阿片类药物消费的影响似乎很小。PDMP 的管理者需要开发方法来改善他们的数据的使用,以影响处方药过量死亡率的问题(Paulozzi,Leonard J .,et al 2011)。

第二篇文献指出,为了降低逐渐增加的处方阿片类药物过量死亡率,四十九个州(除密苏里州外)创建了处方药监测计划,以帮助监测高风险处方药物(Patrick,Stephen W .,et al 2016)。它还发现,一个州实施一项计划与实施后一年内平均每 10 万人口中减少 1.12 例阿片类药物相关的过量死亡有关(Patrick,Stephen W .,et al 2016)。

第三篇文献使用了来自疾病控制和预防中心(CDC)的流行病学研究在线数据库(WONDER)的更准确和更广泛的数据,对根据处方药滥用政策系统(PDAPS)编制的指数变量回归州年死亡率(Pardo,Bryce。,et al 2017)。从数据来看,文献指出监测强度与用药过量死亡率呈负相关。监测强度每增加 1 点,用药过量死亡率就会降低 1%(Pardo,Bryce。,et al 2017)。

最近的研究探讨了各州是否已经随着时间的推移过渡到 PDMP 模式。它提出,自 1999 年以来,美国各州倾向于过渡到更强大的处方药监测计划类别(Smith,Nathan,et al 2018)。

从上述所有文献综述中,我们应该已经意识到处方药监测计划对处方阿片类药物过量死亡率的影响正在逐渐增强。然而,没有文献将阿片类药物过量死亡率和其他重要影响因素放入一个单一的经验模型中,以表明处方阿片类药物过量死亡率如何受到其他重要因素的影响。

因此,为了进一步研究,我将更深入地调查每 100,000 人中处方阿片类药物过量死亡率与监测频率以及其他因素之间的关系,以认识到控制处方阿片类药物滥用的重要性。我们感兴趣的独立变量是处方阿片类药物监测频率。我将使用州作为我们的分析单位,并在州一级收集数据。

经验模型

线性回归用于估计处方阿片类药物过量死亡与监测频率之间的关系。在本文中,我们将估计以下回归模型:

overdesead = B0+B1 * monitor frequency+B2 *未参保+B3 *收入+B4 *地区+B5 *种族+B6 *教育+B7 *大麻合法化+错误

在上面的模型中,过量死亡变量测量各州每 100,000 人口中的处方阿片类药物过量死亡率。我们感兴趣的独立变量是监控频率,它测量每个州处方药的监控频率。

收入变量包括各州的平均收入和低于联邦贫困线的人口比例。未保险变量衡量没有医疗保险的国家总人口的比例。我们也算地区,东北除外。这场竞赛包括每个州非裔美国黑人的百分比和非西班牙裔白人的百分比。教育衡量每个州高中毕业率的百分比。以及大麻合法化措施,如果该州完全合法化与否。

数据探索

处方阿片类药物过量死亡率数据来自 2014 年美国国家卫生统计中心疾病控制和预防中心(CDC)的凯泽家庭基金会分析。

药品监控程序图片,图片由 NAMSDL

自变量基于 2014-2015 年公开的州级数据。监测频率的数据来源基于处方药监测项目(PMP)数据报告的频率——上图。自变量将监控频率定义为各州处方药更新的频率。有三种类型的频率:每天,三天,每周。

各州的特征包括贫困率(贫困人口的百分比)、年收入中值、该州未投保人口的比例以及种族。2016 年所有的州特征都是从凯泽家族基金会获得的。

教育包括每个州高中毕业生的百分比。数据来自美国人口普查局,2013-2017 年美国社区调查 5 年评估。

大麻合法化措施,如果国家完全合法化或没有。并且数据来源于 2019 年 4 月各州大麻合法化地图。

表 1:来自 Stata 的描述性统计数据

上表 1 显示了各州处方阿片类药物过量死亡率的巨大差异,从北达科他州的每年 27 人到加利福尼亚州的 1449 人,平均为 370.45 人。美国的监控频率各不相同,从 44 个州和圣路易斯县的每日签到到加利福尼亚和夏威夷的每周签到。

实证结果

下表 2 中的回归结果表明,监测频率是决定国家处方阿片类药物过量死亡率的重要因素。更新频率越高,用药过量死亡率越低。当监护仪更新频率增加一天时,状态阿片类药物过量死亡将减少 70.78 (p 值

表 2:来自 Stata 的回归结果

处方阿片类药物过量死亡率的其他重要因素包括贫困、高中毕业生的比例。由于州收入中位数给出了一个相对较小的系数,我们不能用它来得出任何结论。尽管各州的收入中值在统计上并不显著,但较高的贫困率伴随着较低的处方阿片类药物过量死亡率(p <0.001). Since the three regions, insurance, marijuana legalization, whites, and blacks all have relatively high p-value, we are not able to use them to conclude anything.

未来测试

在整个研究中,我们在残差中有多种误差假设,现在我们必须对这些假设进行测试,以进一步巩固我们的结果。这些假设是正态残差、无异方差、无多重共线性和无遗漏变量。拥有正态残差对整个研究很重要,因为它允许有效的假设检验。更具体地说,正态性确保我们的 p 值、t 检验和 f 检验是合理的和正当的。为了检验这种正态性假设,使用偏度-峰度全正态性检验。

表 3:正态性的偏度/峰度检验

通过分析因变量“用药过量死亡率”,我们看到其偏斜度的 p 值低于 0.001,未通过测试。因此,这必须在未来回归运行 ln(过量死亡率)时进行校正。

VIF 测试

下一个测试检查模型中的任何多重共线性,即两个以上的变量之间存在完美的线性关系。这将导致系数和标准误差不稳定和膨胀。

表 4:多重共线性的 VIF 检验

如果一个变量的 VIF 大于 10,它可以被认为是其他独立变量的线性组合,但是,该模型中的所有变量都通过了测试。变量中没有明显的多重共线性。

布鲁赫-帕甘试验

为了检验异方差性,即残差具有不相等的分布,我们将使用 Breusch-Pagan 检验。

表 5: Breusch-Pagan 异方差检验

在这个测试中,p 值实际上低于 0.005。因此,我们可以得出这样的结论:零方差(常方差,也称为同方差)被剔除,残差中可能存在异方差。

拉姆齐试验

最后一个检验,拉姆齐检验,分析拟合值的非线性组合是否有助于解释因变量。如果是这样,这意味着型号可能指定不正确。

表 6:拉姆齐复位测试

幸运的是,p 值大于 0.1。因此,该模型很可能没有一个变量被省略,根据测试是足够的。

为了纠正 Breusch-Pagan 和偏斜度/峰度测试中显示的异方差性和正态性问题,我们将对因变量 ln(过量死亡率)的自然对数进行回归。这种回归还利用稳健的标准误差,进一步对抗残差中的条件异方差。

表 7:自然对数回归

结论和政策影响

实证结果表明,较高的监测频率将降低处方阿片类药物过量死亡率。如前所述,以前的文献表明,监测强度每增加 1 个点,用药过量死亡率就降低 1%(Pardo,Bryce。,et al 2017)。因此,增加监测频率应被视为公共卫生官员和决策者的一个重要目标,作为扭转全国处方阿片类药物过量死亡率上升趋势的潜在手段。这种政策干预可能包括帮助保险公司和处方药监控计划更好地识别和采取行动减少不适当和非法的处方,限制第三方支付者以减少不适当处方的方式报销,阻止从多个医疗保健提供商处获得处方阿片类药物的努力,以及改善临床护理。我们的实证结果也支持这样的观点,即针对贫困线以下家庭的家庭福利政策可能会在降低处方阿片类药物过量死亡率方面产生良好的回报。

这项研究的结果并非没有局限性。首先,各州关于用药过量死亡率的所有数据都是自我报告的,这可能会导致错误和偏倚的结果。第二,不同的州有不同数量的药店,与那些药店数量较少的州相比,这使得人们更容易获得处方阿片类药物。最后,我们没有把每个州的经济预算作为考虑因素。这些较富裕的州可以向当地福利和医疗系统投入更多资金,帮助降低处方阿片类药物过量死亡率。关于残差的进一步问题已在上次回归中进行了讨论和纠正。

引文

陈,秋实,等 2019。"美国处方阿片类药物误用和预计过量死亡的预防."JAMA 网络公开,第 2 卷,第 2 期。

"处方药监测计划(PMP)数据报告的频率—地图."NAMSDL,2019 年全国示范州药品法联盟(NAMSDL),2019 年 1 月 2 日。

Jalal,Hawre 等人 2018。“1979 年至 2016 年美国药物过量流行的动态变化。”《科学》2018 年第 361 卷第 6408 期。

"各州大麻合法性地图。"DISA 全球解决方案,2019 年 4 月 25 日。

帕尔多布莱斯。,等 2017。"更强有力的处方药监测项目能减少处方阿片类药物过量吗?"瘾》第 112 卷第 10 期。

帕特里克,斯蒂芬 w 等 2016。"与阿片类药物相关死亡率降低相关的处方药监测项目的实施."卫生事务,第 35 卷,第 7 号。

Paulozzi,Leonard J .等人,2011 年。"处方药监测项目和药物过量致死率."疼痛医学,第 12 卷,第 5 期。

"处方阿片类药物过量死亡和每 10 万人口死亡率(年龄调整)."亨利·凯泽家族基金会,2019 年 1 月 16 日。

史密斯、内森等人 2018。“处方药监测计划的类型:1999 年至 2016 年计划演变的潜在转变分析。”瘾》第 114 卷第 2 期。

房间里的大象:如何编写 PySpark 单元测试

原文:https://towardsdatascience.com/the-elephant-in-the-room-how-to-write-pyspark-unit-tests-a5073acabc34?source=collection_archive---------3-----------------------

在 Azure DevOps 中自动化 Spark 单元测试的分步教程

照片由纸张纹理上不飞溅

在铺天盖地的信息空间中,存在着选择的悖论。也很难想象实现一个小目标需要付出多大的努力。我们往往会忽略这种努力的好处。

该是我们解决这个问题的时候了。

为您的数据管道编写有效且成熟的测试用例通常被认为是一个雄心勃勃的想法或项目本身。这通常是真的,测试数据管道和测试传统软件带来了不同的挑战。尽管前面的任务相当艰巨,但你必须从某个地方开始。让我们从挑选一块馅饼开始。单元测试 Spark ETL!

在本教程中,我们将做以下工作。

  1. 使用 PySpark 构建一个简单的 ETL。
  2. 使用 python 模块 unittest 实现单元测试。
  3. 在 Azure DevOps 中使用 CI/CD 管道运行自动化测试。

这绝不是编写高级复杂的测试用例来端到端测试数据管道的教程。它只是试图展示您可以相对容易地开始自动化测试,重点是只测试您的转换的功能,而不需要在测试环境中启动集群。

对于本教程,假设您对 Python、PySpark、Azure Devops 库、yaml 管道有基本的了解。

0.设置

如果你想跳到大团圆结局,想要 TL;DR 版本你可以克隆下面的 git 仓库,里面有你需要的一切。

假设我们将在本地 IDE 上开发,然后在 Azure DevOps 管道中的微软托管代理上执行测试,那么准备我们的代码库将是一件好事,因为它将在自动化管道上执行。

克隆或创建您想要在 Azure DevOps 上使用的存储库。按照如下类似的结构准备文件夹和文件。

图 1: PySpark 单元测试存储库结构(图片由作者提供)

由于我们对测试 Spark 代码感兴趣,我们需要安装pyspark python 包,它与启动和关闭本地 Spark 实例所需的 Spark JARs 捆绑在一起。让我们将这个包作为需求添加到我们的test-requirements.txt文件中。如果您的 ETL 依赖于其他 python 包,这里是列出它们的地方。

图 2: Requirements.txt 文件(图片由作者提供)

1.在 PySpark 中构建一个简单的 ETL 函数。

为了编写测试用例,我们首先需要需要测试的功能。在这个例子中,我们将编写一个执行简单转换的函数。

基本上,ETL 作业必须完成以下工作:

  • 从数据源提取数据。
  • 应用转换
  • 加载转换后的数据到目的地。

为了保持简单,我们将只关注测试 ETL 过程的转换阶段。

让我们在 etl.py 文件中创建上面的片段。

数据工程师的面包和黄油!

下图更好地解释了我们希望在此函数中应用的转换。我们想把我们的数据从图 3 转换成图 4。

图 3:输入数据框(作者图片)

图 4:转换后的数据框(图片由作者提供)

一张图胜过千言万语。对不对?

2.实现单元测试

为了编写 ETL 逻辑的单元测试,我们将使用 python 单元测试框架,这是一个名为 unittest 的内置 python 模块。

让我们从在 test_etl.py 文件中导入创建测试用例所需的模块开始。

前两条语句导入了 unittest 模块和需要测试的实际转换函数。构建 Spark 操作需要其他导入语句。

unittest 框架中,通过编写你自己的扩展unittest.TestCase类的测试用例类来创建一个测试用例。您在这个类中定义的方法引用了您想要运行的单个测试。这些方法的名称必须以单词test开头。这个命名约定有助于测试运行人员识别您的测试。让我们从创建测试用例类开始。

与其他测试框架一样, unittest 允许你定义设置和拆卸指令,这些指令是简单的,分别在测试之前和之后执行。这些指令可以分为两个层次,或者使用setUp()方法,或者使用setUpClass()方法。不同之处在于,setUp 方法将针对每个单独的测试执行,而 setUpClass 方法将针对整个测试用例只执行一次。

在我们的例子中,我们需要在运行测试之前建立一个本地 spark 会话。我们使用SparkSession.builder方法来做这件事。我们将它作为一个类方法,因为我们希望只初始化一次 SparkSession ,而不是为每个测试方法初始化,这样可以节省我们一些时间。我们还定义了一个 tearDown 类方法来在所有测试结束时停止 SparkSession

既然设置已经处理好了,我们可以专注于本质细节,编写实际的测试方法本身。unittest 的想法是通过模拟输入和预期输出并断言结果的正确性来测试你的代码的功能。

我们将执行以下操作:

  1. 准备一个模拟源数据的输入数据框。
  2. 准备一个预期的数据帧,这是我们期望的输出。
  3. 将我们的变换应用于输入数据框。
  4. 断言到预期数据帧的转换的输出。

上面概述的步骤可以通过许多不同的方式实现,您可以从存储在存储库中的文件中读取输入和预期数据,或者通过代码生成这些数据框。为了使本教程简单且可重复,我们将通过代码生成数据框。

在代码片段的步骤 4 中,我们执行两种类型的断言,首先比较两个数据帧的模式,以检查转换后的数据是否具有我们期望的模式,我们还比较两个数据帧中的数据,以检查值是否是我们期望的。这些是我们可以在数据帧上做的最常见的断言类型,但是当然,一旦你完成了这项工作,你就可以编写更复杂的验证。

此时,我们的测试用例已经准备好了。如果您想在本地运行它们,您可以通过终端中的命令python -m unittest -v 来运行它们。

3.使用 Azure DevOps 管道自动化测试

我们的测试用例现在已经准备好集成到我们的 CI/CD 管道中。对于本教程,我们将使用 Azure DevOps 管道来实现它,但同样可以在其他工具上实现,如 bitbucket-pipelines 或 Github actions。

让我们将下面这段代码添加到我们存储库中的 azure-pipeline.yml 文件中。

vmImage: ubuntu-latest 指示我们的管道使用 azure 托管的 ubuntu 机器作为执行环境。

sudo apt-get install default-jdk -y 将最新的 java jdk 安装到 ubuntu 机器上。为了在本地实例上运行 Pyspark,我们需要安装 java。

命令pip install -r $(System.DefaultWorkingDirectory)/src/tests/test-requirements.txt pip 安装需求文件中列出的所有包,在这种情况下,它将安装pyspark python 包。

最后,命令cd src && python -m unittest -v 基本上筛选src文件夹,并执行任何扩展了unittest.TestCase类的文件。如果您创建了多个包含测试用例的文件,它们也将被执行。

提交并推动您的更改。一旦一切都设置好了,创建一个 Azure DevOps 管道,并将其挂接到存储库中的 azure-pipeline.yaml 文件。

运行管道,当它执行时,您可以在执行日志中验证结果。

图 Azure DevOps 管道中通过的单元测试示例(图片由作者提供)

为了检查测试是否在预期失败时失败,您还可以调整预期的数据帧。例如,如果您期望一个列的类型是 Integer,但是您应用的转换返回一个 Long 类型,那么您期望您的测试用例能够捕捉到它。在这种情况下,您应该看到一个失败的管道,日志指向断言错误。

图 Azure DevOps 管道中失败的单元测试示例(图片由作者提供)

结论

那都是乡亲们!以这种方式自动化单元测试是非常容易的,一旦你开始工作,前途无量。有时当我们被选择宠坏了,最好试一试,让你内心的现实主义者接管。这里是我的 git repo 的完整源代码的链接: PySpark 单元测试 Repo

期待听到您对构建数据管道自动化测试的想法和经验。建议是最受欢迎的!

参考

  1. 科里·斯查费的 Python 单元测试教程。
  2. Eriks Dombrovskis 测试 PySpark 数据转换
  3. Python 单元测试模块文档

人工智能在人类肺部成像中的新兴角色

原文:https://towardsdatascience.com/the-emerging-role-of-artificial-intelligence-in-human-lung-imaging-e914a8c2f936?source=collection_archive---------25-----------------------

人工智能评估肺叶的新方法

抗击呼吸系统疾病是世界领导人和医疗保健系统的优先事项。包括发达国家在内,每年有数百万人死于呼吸系统疾病,尽管在这一问题上投入了巨大的社会利益。

新的人工智能(AI)技术在医疗保健领域的出现,通过提供辅助诊断和治疗计划的方法,增强了呼吸系统疾病的治疗前景。有了人工智能,呼吸医学的进步可能会以前所未有的速度加快,降低疾病死亡率,改善患者的生活质量。因此,实施新的人工智能工具来帮助临床医生的工作至关重要。

计算机断层摄影(CT)是横断面肺成像的主要形式,允许对肺和周围结构进行快速和高分辨率的评估。人工智能的最新发展支持 CT 图像分析自动化的更大范围。人工智能有望通过产生与人类观察者相当的更快、更便宜、更可靠的结果来改变这一领域。

肺叶分割是胸部图像解释中的一项重要任务,用于定位肺部的病变或其他成像发现。理解患者的肺叶解剖对于与肺和/或气管支气管树相关的疾病的诊断和治疗计划是至关重要的。

分割肺的可视化显示了气管、肺叶、肺段支气管和肺叶支气管[0]。

最近崛起,强大的人工智能方法概述了肺部图像分析新时代的到来。人工智能工具擅长看到和理解重要图像引导的模式,有助于提高呼吸领域的效率——改善诊断和治疗计划,让肺部学家花更多时间与患者在一起。因此,最近已经进行了各种尝试来开发自动分割技术。然而,在疫情之后,医疗保健尤其是放射系统的压力将继续存在,直到这些基于人工智能的方法被采用。

由于不同的呼吸系统疾病以不同的方式影响肺部结构,因此出现了肺叶分割的主要障碍。例如,新冠肺炎肺炎的影像表现与肺气肿非常不同。对于呼吸内科医生来说,准确的肺叶分割是至关重要的,以便适当地制定治疗计划。不准确的肺叶分割会给出关于疾病过程的误导性信息,从而导致错误的治疗决策。此外,大多数预先存在的基于人工智能的模型没有经过训练,无法准确辨别不同疾病在成像上的表现。结果,具有严重病理变化的肺叶的精确描绘仍然是一个未解决的任务。正因为如此,我们在患有各种疾病的患者身上测试了我们的模型,这些疾病包括肺癌、新冠肺炎肺炎、肺萎陷和肺气肿。

与由 Aboagye 教授领导的其他癌症成像中心(帝国理工学院)高级科学家一起,我们开发了一种人工智能驱动的多任务学习模型(MTL ),以解决设计中的这种需求。该模型并行运行各种(主要和辅助)相关任务。它利用了相关细分之间的共性,提高了模型的泛化能力。额外的任务用于分割气管支气管树以获得对感兴趣区域的更好的上下文理解。

虽然这项研究是由使用图像引导工具解决肺部疾病的需求驱动的,但我们也对探索模型同时处理两种肺组织的能力感兴趣,因为它们之间存在相关性。将 MTL 融入到我们的设计中,我们也受到了现实生活活动的鼓舞——开车、运动、骑自行车——在这些活动中,手眼协调经常在实践中一起学习,促进了任务学习。这个想法是想知道如果模型同时分割气道和肺会发生什么。

该项目是从以前的一项研究中发展而来的,该研究报告了即使在只有少量 ct 扫描的数据集上训练时也有特别好的结果。这一事实突出了该模型在处理看不见的数据时的泛化能力。我们通过在肺癌扫描上训练我们的模型并在新冠肺炎肺炎扫描上测试它来扩展这个概念。我们注意到这两种类型的 CT 扫描表现相似,尽管这两种类型的疾病的切片厚度和轴向切片非常不同。

该模型已在不同的 CT 扫描中使用和测试,包括来自 MosMedData 的扫描,其中包括具有新冠肺炎相关发现的患者。我们发现将肺分成独立的肺叶可以显著改善对患者新冠肺炎严重程度的评估。展望未来,我们预计该领域可以进一步探索我们的多组织分割设计,这有助于探测肺部健康状态。因此,我们的方法可能特别有趣,以适应不同的身体生命系统,其中针对其他疾病存在组织或器官的相关性。

这部作品有预印本:在https://arxiv.org/abs/2105.05204

我感谢我的合著者 Mitch Chen、Kristofer Linton-Reid、Joram Posma、Sue Copley 对该项目的重要贡献,该项目由帝国理工学院综合癌症成像中心主任 Eric O. Aboagye 教授领导。

参考文献

[0] Martell,Marc Boubnovski 等人,“开发一种用于计算机断层扫描肺叶分割的多任务学习 V-Net,并应用于患病肺。” arXiv 预印本 arXiv:2105.05204 (2021)。

我们所知的赛车的终点

原文:https://towardsdatascience.com/the-end-of-the-car-as-we-know-it-2b04662a2d82?source=collection_archive---------40-----------------------

无人驾驶汽车将如何改变汽车的概念

韦塞尔·汉普辛克在 Unsplash 上拍摄的照片

对大多数人来说,拥有并驾驶汽车是一个重要的里程碑。许多人幻想驾驶一辆梦想中的汽车,阳光反射在引擎盖上,他们的头发在风中飘动。但在未来的几十年里,这种形象可能会被归入老好莱坞电影,因为它与未来为我们准备的东西非常不同。几年前,人们认为汽车是一种珍贵的财产,但今天,由于自动驾驶汽车的兴起,汽车正在成为一种服务。这些自动驾驶或无人驾驶汽车是在没有人类操作员的情况下,使用传感器、摄像头、雷达和人工智能(AI)的组合在目的地之间行驶的车辆。

为了理解它们是如何工作的,想象你需要一辆车。你只需点击应用程序,召唤出你想要的汽车:

  • 如果你想去上班,但又不赶时间,共享车辆应该足够了。这些收集你所在地区的其他人,并沿途将他们投放到不同的地方。由于人工智能正在优化路线,你可以保证及时到达。
  • 如果你需要赶时间,私家车可能更合适,但是会更贵。这些汽车还可以有一个带桌子的办公室模式,允许用户在他的笔记本电脑上工作,通过宽带互联网连接连接到电源。
  • 当你的客户从国外来访或去约会,你想留下深刻印象,私人豪华汽车将是合适的。这些会开车把你和你的主人从一个地方送到另一个地方,如果需要的话会等着你,并提供你所需要的一切舒适。
  • 如果孩子们需要搭车去上私人课或参加社交活动,该应用程序可以召唤一辆小型车辆。这些汽车将配备车载娱乐设备,如电影和视频游戏机。孩子们可以在整个旅行中玩得很开心。此外,卫星跟踪和视频镜头将让父母了解情况,并保证他们的孩子到达预定的目的地。
  • 跨不同地点移动大型物体也将更加容易。不管它是一张桌子还是整个卧室,你所要做的就是计算货车的尺寸并召唤它。货车很快就会在门后等着。完成后,它被释放,并转移到下一个客户。由于这些货车通常需要停车和卸货的许可,系统将自动与地方议会系统联系并获得所需的许可。此外,如果需要交通管理官员,它也将负责所有必要的安排。

铁木尔·罗马诺夫在 Unsplash 上的照片

当然,这种系统也将与其他交通工具相结合。这些车辆将拥有最新的公共汽车、火车、轮渡和飞机时刻表,以确保乘客及时到达换乘点。如果该人需要进入车辆限制区域,系统将自动确保踏板车或自动电动轮椅到位,以带客户进行下一阶段的旅程。

可能性是无穷的,好处也是无穷的。车辆无人驾驶的事实意味着乘客的绝对隐私得到了保证。因此,他们可以很容易地在通勤期间安排私人会议。车内还会在需要的时候改成会议室。请记住,乘客不需要面向前方(除非他们感到晕车);除了信息面板之外,没有仪表板。因此,就连我们对汽车构成的典型概念也会改变。系统选择的路线总是最优的,由于 AI 不断与控制中心联系,它可以快速抢占沿途的瓶颈(如事故造成的瓶颈),并及时设计出替代路径。这辆车随时可以使用。人们还可以预先设定所需的温度,从而确保车辆可以在烈日或严寒中使用。最后,当汽车到达目的地时,乘客下车离开。花费数小时寻找几英里外的停车场和昂贵的停车场将成为过去。

照片由莎伦·麦卡琴Unsplash 拍摄

此外,拥有一辆汽车的成本节省是天文数字。车主支付的保险(不管他们是否使用车辆)将不再需要,并且考虑到他们不会拥有汽车,也没有磨损。因为汽车从不停车,所以没有停车费,我们甚至没有考虑到找停车位所浪费的时间。

尽管如此,人们仍然对自动驾驶汽车保持警惕。我们听过各种汽车撞死人的报道,也听过无数汽车拯救生命的故事。当你将它们的安全记录与人类驾驶员的安全记录进行比较时,自动驾驶汽车轻而易举地胜出。但毫无疑问,最大的障碍是这种车辆将带来的文化变革。所以让我们逐步引入它们,确保乘客的安全,让人们在迎来自动驾驶汽车革命之前习惯它们。

如果你喜欢这篇文章,并想与我联系,请这样做🐦推特,🔗LinkedIn,📷Instagram 或😊脸书。

https://medium.com/dataseries/from-paris-to-london-in-a-handful-of-minutes-7657d978152

Alexiei Dingli 教授是马耳他大学人工智能教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并成为马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

数据库规范化的敌人——用 SQL 将值分组到单个字符串中

原文:https://towardsdatascience.com/the-enemy-of-database-normalization-grouping-values-into-single-string-with-sql-2294f40bb4d9?source=collection_archive---------11-----------------------

将 SQL 中的数据串联提升到下一个级别

图片由 PxFuel 提供

如果你以前使用过 SQL 查询数据,你会注意到存储在关系数据库中的数据通常根据业务需要遵循潜规则“规范化”。1NF(第一范式)、2NF(第二范式)或 3NF(第三范式)是数据库开发人员或管理员经常听到的术语。创建任何新数据库的最基本规则是,每列每行都应包含一个值,并且数据集中不应有任何重复的行。虽然数据库开发人员更喜欢关系数据库始终遵循一些规范化标准,但数据分析人员可能会通过分组和组合信息来打破这些规则,以便进行更简洁、更有洞察力的分析。

因此,如果您正在通过与 SQL 交互来进行某种形式的即席数据分析以用于报告目的,了解如何以字符串格式将多个信息分组并连接在一个列下有时会对您的需求有所帮助。幸运的是,SQL 提供了几个高级函数,将简单的数据拼接任务提升到了一个新的水平。

根据您使用的 SQL 软件,这些功能特定于允许将数据分组和连接在一起作为单个任务的指定软件。实现相同目的的这些函数如下:GROUP_CONCAT、LISTAGG、ARRAY_AGG 和 STRING_AGG。对于本文,我将重点关注适用于 MySQL 和 SQLite 的 GROUP_CONCAT 函数。函数名本身意味着该函数根据特定属性将信息组合在一起,并将结果组合在一个字符串中。这个高级工具不同于 SQL 中通常的 CONCATENATE 函数,在该函数中,来自多个列的数据以单个字符串格式连接在一起。

图片由 PxFuel 提供

为了展示使用 GROUP_CONCAT 函数的好处,我将使用 MySQL 上的“Chinook”数据集,它代表一个数字媒体商店,其中包含来自 iTunes 的媒体相关数据。感谢 Luis Rocha 和 Brice Lambson 编译了这个适用于各种 SQL 软件工具的综合数据集。

您可以使用下面的 Github 链接找到关于样本数据集的更多细节:https://github.com/lerocha/chinook-database

在我展示几个例子之前,下面的图 1 是这个数据库的模式图,以供参考:

图 Chinook 数据库示意图(图片由 Eason Liaw 提供)

您可能已经注意到,上面的模式图有点复杂,因为在这个数据库中连接了十多个表。下面的例子将涉及到使用上面的大多数表,所以请随意参考上面图 1 中的模式图,以便更容易理解 Chinook 数据库中各种表之间的关系。

问题陈述 1:获取每个顾客购买的音乐流派列表,包括他们的名字和姓氏

您可能想到的最初解决方案是使用带有 DISTINCT 关键字的简单查询来获得如图 2 所示的结果:

图 2:前两个客户购买的所有音乐流派的记录(由 Eason Liaw 创建)

SELECT **DISTINCT** FirstName, LastName, genre.name AS Genre FROM customer
INNER JOIN invoice USING (CustomerId)
INNER JOIN invoiceline USING (InvoiceId)
INNER JOIN track USING (TrackId)
INNER JOIN genre USING (GenreId)

虽然该查询返回为每个客户购买的所有音乐流派,但是从报告的角度来看,使用该查询的一个缺点是,该查询总共生成 440 行,并且为每个客户重复相同的 FirstName 和 LastName 值。对于分析师来说,这个缺点可能很难处理,因为这需要他们一次查看同一客户的多个记录,以了解他们的音乐流派偏好。

对于这个问题语句,更合适的方法是按照下面的查询使用 GROUP_CONCAT 函数来获得图 3 中的输出:

SELECT FirstName, LastName, **GROUP_CONCAT(DISTINCT genre.name ORDER BY CustomerId, InvoiceDate SEPARATOR ‘ | ‘)** AS Genre_List 
FROM customer
INNER JOIN invoice USING (CustomerId)
INNER JOIN invoiceline USING (InvoiceId)
INNER JOIN track USING (TrackId)
INNER JOIN genre USING (GenreId)
GROUP BY FirstName, LastName;

图 3:前五名顾客购买的音乐类型列表(图片由 Eason Liaw 提供)

请注意图 3 提供了比图 2 更简洁的信息,图 2 中的每一行都包含每个客户购买的所有音乐流派。GROUP_CONCAT 函数具有更好地表示分组数据的特性,除了使用默认的逗号分隔符之外,还可以指定如何分隔分组元素。

上面的查询将显示的记录数量从 440 条减少到 59 条,这样每个客户都有一个显示他们所有音乐流派偏好的值。值得强调的是,对于这个查询,每个客户偏好的流派列表是从最早到最晚的发票日期,这是在 GROUP_CONCAT 函数内的 ORDER BY 子句中指定的。

问题陈述 2:获取所有客户每年、每月购买的音乐流派列表。

假设下面的图 4 是这个问题陈述的期望输出:

图 4:2009 年前 5 个月所有客户购买的音乐类型列表(由 Eason Liaw 创建)

使用类似上面问题陈述 1 的 GROUP_CONCAT 函数,下面的查询提供了如图 4 所示的输出:

SELECT YEAR(InvoiceDate) AS Year_Record, MONTH(InvoiceDate) AS Month_Record, **GROUP_CONCAT(DISTINCT genre.name SEPARATOR ' | ')** AS Genre_List FROM invoice
INNER JOIN invoiceline USING (InvoiceId)
INNER JOIN track USING (TrackId)
INNER JOIN genre USING (GenreId)
GROUP BY YEAR(InvoiceDate), MONTH(InvoiceDate);

通过使用简单的日期函数提取 InvoiceDate 变量的年份和月份部分,该查询提供了这个问题陈述的解决方案。注意,对于这个问题语句,在 GROUP_CONCAT 函数中不一定需要 ORDER BY 子句,因为体裁的顺序并不重要。

问题陈述 3(更具挑战性):使用第二个问题陈述,获得所有客户每年和每月购买的音乐流派列表,从最流行到最不流行的音乐流派排序。

我建议你先自己尝试一下这个问题,然后再参考下面我的 SQL 解决方案进行挑战。这是图 5 中这个问题陈述的期望输出:

图 5:2009 年前 6 个月顾客购买的音乐类型列表,按流行度排序(图片由 Eason Liaw 提供)

这个问题语句需要 GROUP_CONCAT 函数和使用子查询的组合来解决。顺便说一下,您可以参考我下面的另一篇文章,了解在大数据上使用子查询的 SQL 性能的更多细节。

https://medium.com/@EasonLiawYiXian/sql-performance-of-window-functions-vs-subqueries-on-big-data-3fa533fc64bf

通常,当你遇到这种涉及多个步骤的问题陈述时,我喜欢把这个问题陈述分成如下几个部分:

  1. 统计在相应年份和月份购买每种音乐类型曲目的客户数量,然后将结果从最受欢迎到最不受欢迎排序
  2. 按照年份和月份对第 1 点的结果进行分组,然后按照客户数量(受欢迎程度)从高到低排序,显示与相应年份和月份相关的所有流派。

为了解决上面的第一点,下面是一个查询,其输出如图 6 所示:

图 6:第一步获得图 5 结果的结果(图片由 Eason Liaw 提供)

SELECT YEAR(InvoiceDate) AS Date_Year, MONTH(InvoiceDate) AS Date_Month, genre.name AS genre_name, **COUNT(*) AS total** FROM invoice
INNER JOIN invoiceline USING (InvoiceId)
INNER JOIN track USING (TrackId)
INNER JOIN genre USING (GenreId)
**GROUP BY YEAR(InvoiceDate), MONTH(InvoiceDate), genre.name**
**ORDER BY Date_Year ASC, Date_Month ASC, total DESC**

通过将上面的查询视为子查询,下面的查询获得了上面图 5 所示的输出。

SELECT Date_Year, Date_Month, **GROUP_CONCAT(DISTINCT genre_name ORDER BY total DESC SEPARATOR ' > ')** AS Genre_Popularity
**FROM(**
SELECT YEAR(InvoiceDate) AS Date_Year, MONTH(InvoiceDate) AS Date_Month, genre.name AS genre_name, COUNT(*) AS total FROM invoice
INNER JOIN invoiceline USING (InvoiceId)
INNER JOIN track USING (TrackId)
INNER JOIN genre USING (GenreId)
GROUP BY YEAR(InvoiceDate), MONTH(InvoiceDate), genre.name
ORDER BY Date_Year ASC, Date_Month ASC, total DESC
**)** **result1**
**GROUP BY Date_Year, Date_Month**

值得一提的是,使用“>”符号定制 GROUP_CONCAT 函数中的分隔符特性,可以看到每年和每月的音乐流派从最流行到最不流行排序。如果不使用 GROUP_CONCAT 函数,您将不得不参考上面总共有 351 行的图 6 来了解每年和每月音乐流派的流行程度,从报告的角度来看,这可能很繁琐。

基于以上所有三个问题陈述,从 SQL 查询中观察到的一个共同特征是,使用 GROUP_CONCAT 函数需要 GROUP BY 子句来实现期望的结果。这两个关键字都有助于执行这种高级的即席数据分析。

既然我已经向您展示了 GROUP_CONCAT 函数如何有助于特定类型的即席数据分析,那么有必要了解为什么在使用 SQL 数据库时不应该滥用 GROUP_CONCAT 函数。虽然使用这种高级串联函数可以更简洁地提供洞察力,但是这些函数不符合数据库开发者和管理员希望遵循的数据库规范化规则。

图片由来自 Pixabay 的 dschap 提供

再次强调这一点,关系数据库的列应该只包含每条记录的一个值。GROUP_CONCAT 函数打破了任何给定关系数据库的这一最基本的规则,这就是为什么在使用关系数据库时,您不常看到多个值组合在一个列下。除非在表视图中经常查询这种格式的组合信息(在以后的文章中会有更多的细节),否则在关系数据库中很少会看到这种情况。

从数据库维护的角度来看,维护同一列下的这种组合信息的一致性可能非常具有挑战性,尤其是在处理大型数据集时。使用相同的 Chinook 数据集,其中多个数据存储在同一列下的一个列是 tracks 表中的 composer 列,如下图 7 所示:

图 7:曲目表中的六个随机行,作曲家栏使用不同的分隔符(图片由 Eason Liaw 提供)

请注意,这里使用了各种分隔符(例如“/”、;)、“&”和“-”),其中表示产生特定轨道的所有作曲者的字符串不一致。使用正则表达式查询特定作曲家创作的曲目并不困难。然而,更新作曲者的字符串带来了某些作曲者姓名出现打字错误的风险,使得关系数据库将不能容易地检测到这样的错误。例如,如果我键入“Toni Belotto”而不是“Toni Bellotto”作为新曲目记录的作曲家,数据库不会将更新操作标记为错误。数据库开发人员认为这种情况很危险,因为无法确定在记录中捕获的相同信息在所有其他行中是否一致。

我更愿意将与曲目的作曲者相关的信息存储在一个单独的表中,将作曲者的字符串拆分成它的元素,以减少在曲目表中存储重复数据的冗余。否则,获取每张专辑的字符串格式的作曲家列表可能会非常困难,因为需要考虑各种类型的分隔符及其组合来标识作曲家的唯一名称。

【pxhere.com 图片由穆罕默德·哈桑拍摄

您可能不想使用 GROUP_CONCAT 函数等高级串联函数的另一种情况是,使用从获得的查询中获得的结果来构建机器学习或深度学习模型。为了将这些参数传递到机器学习或深度学习模型中,串联的信息需要分裂成其元素,以便这些模型工作。例如,处理日期需要分成年、月和日,这样模型才能工作。目前,我不会深入研究机器学习或深度学习模型,但你可能会在未来的文章中听到更多。

因此,最重要的是要理解,虽然我在本文中讨论的这些高级串联函数对于特定的数据报告目的很方便,但是了解使用从查询中获得的结果的目的也是非常重要的。如果查询结果将用于新的数据库部署或构建新的机器学习模型,您可能不喜欢使用这种高级连接方法。如果你以一种适合他们需求的格式来展示你的结果,你的利益相关者将会非常感激。

因此,我鼓励您自己探索更多关于高级串联函数的用例。此外,从数据库开发人员的角度理解数据库规范化规则将使您在从关系数据库中检索用例数据或与数据库开发人员一起工作时更好地了解它。

下次再见,祝 SQL 查询愉快!😃

理解量子计算的入门

原文:https://towardsdatascience.com/the-entry-to-understanding-quantum-computing-517f9d60f0fd?source=collection_archive---------5-----------------------

了解哈达玛转换门

量子机器学习要不要入门?看看 动手量子机器学习用 Python

哈达玛门是量子计算的基本变换门之一。我想说没有它就没有量子电路。这是因为阿达玛门允许量子位远离基态向量|0⟩和|1⟩.

基态的量子位

处于|0⟩或|1⟩基态的量子位,几乎和经典位一样。|0⟩状态下的量子位是 0,而|1⟩状态下的量子位是 1。一直都是。

你甚至可以用这两种状态的量子比特工作,你不会看到任何你用经典比特做不到的事情。例如,让我们考虑异或运算符(⊗)。你可以在经典的真值表中进行推理。

以下量子电路实现了𝑃和𝑄为 1 的异或运算(⊗)。

x 门将两个输入量子位放入|1⟩.状态对于任一处于|1⟩.状态的输入量子位,cnot-gate 将目标量子位从|0⟩翻转到|1⟩如果两个输入量子位都在|1⟩状态,一个不会把目标翻转到|1⟩,另一个会把它翻转回|0⟩.

该电路的测量概率证实了这一点。正如我们看到的,当𝑃和𝑄是 1,那么𝑃⊗𝑄是 0。

Note: The qubits read from right (upper) to left (lower). The output qubit is at the left.

叠加态的量子比特

当我们通过应用哈达玛门将输入的量子位叠加时,事情变得有趣起来。让我们先来看看当我们在单个量子位上应用哈达玛门时会发生什么。

当我们运行这个电路时,我们测量量子位为 0 或 1。各有 50%的概率

而且,我们可以用叠加态的量子位来同时计算各种状态。在下面的电路中,我们没有将输入量子位放入|1⟩态,但是我们对它们应用了哈达玛门。

这个量子电路同时产生所有四种可能的状态。当我们只运行一次电路时,我们会得到四种可能状态中的任何一种。但是,输出量子位总是代表𝑃⊗Q.

哈达玛之门会自动恢复

哈达玛门还有另一个特点。它会恢复原状。

下面的电路描绘了一个|0⟩态的量子位,我们对它应用了两个哈达玛门。

我们看到量子位回到了|0⟩.状态我们总是把它衡量为 0。

|+⟩和|−⟩

如果我们只看一个量子比特的测量概率,我们是在|0⟩态的一个量子比特上应用哈达玛门还是在|1⟩.态的一个量子比特上应用哈达玛门并不重要下面的电路在应用哈达玛门之前将量子位放入|1⟩。

正如我们所看到的,当我们在|0⟩.态的量子位上应用哈达玛门时,结果是一样的

但是这两个州是不同的。

哈达玛门把|0⟩变成了|+⟩,把|1⟩变成了|−⟩.

要了解这些状态之间的差异,我们需要看看量子位的图形表示——布洛赫球。

在布洛赫球中,量子位状态向量和球的两极之间的距离决定了测量量子位为 0 或 1 的概率。对于这两个国家来说,|+⟩和|−⟩都位于赤道上。它们到两极的距离是一样的。

但是有必要区分|+⟩和|−⟩,因为哈达玛门是可逆的。当我们在|0⟩州应用它两次时,我们希望再次得到|0⟩州的结果。但是如果我们在|1⟩州应用它两次,我们希望它再次在|1⟩出现。

这就是哈达玛门的作用。

下面的电路在两次应用哈达玛门之前将量子位放入|1⟩。

结果是|1⟩态的一个量子位,我们总是测量它为 1。

在|+⟩和|−⟩之间转换

|+⟩和|−⟩是两个不同的量子态,哈达玛门告诉我们它们是不同的。

但是我们不仅可以通过哈达玛门到达这些州。我们还可以通过应用 Z-gate 在|+⟩和|−⟩之间切换。

这是量子算法中的一个基本概念。

许多著名的算法,如 Deutsch 的、Bernstein-Vazirani 的和 Simon 的算法,使用 Hadamard 门将量子位放入|+⟩.状态然后他们将一些量子比特从|+⟩翻转到|−⟩(当然是以一种有意义的方式)。最后,他们再次在量子位上应用哈达玛门。因此,我们将一些量子位测量为 0,而将另一些量子位测量为 1——这样我们就有了一个结果。

为什么我们不直接把量子位从 |0⟩ 放到 |1⟩ 以一种有意义的方式呢?

你已经看到答案了。你还记得我们对叠加态的量子位进行异或运算吗?我们能够一次计算出所有可能的状态。这就是量子优势的来源。

结论

哈达玛门在量子计算中至关重要。它将量子位置于叠加态——这是利用量子优势的基础。

此外,哈达玛门生动地说明了量子计算的一些概念。例如,它表明量子门必须是可逆的,并且在量子态中有比测量概率更多的东西。

最后,哈达玛门是最重要的量子算法的基础。这些算法建立在将量子位从|+⟩翻转到|−⟩的能力上,从而产生给定问题的解决方案。

量子机器学习要不要入门?看看 动手量子机器学习用 Python

在这里免费获得前三章。

逻辑回归的起源

原文:https://towardsdatascience.com/the-essence-of-logistic-regression-e9188625cb7d?source=collection_archive---------28-----------------------

用广义线性模型解释逻辑回归的起源

布雷特·乔丹在 Unsplash 上的照片

逻辑回归 是几乎每个数据科学家都在使用的一种无处不在的算法。然而,尽管它已经广为人知并得到了实施,但许多实践者仍然没有完全理解它的起源。在我的上一篇文章中,我讨论了【GLMs】以及它们与机器学习算法的联系。我建议现在的读者浏览一下那篇文章,以便对 GLMs 有一个全面的了解。然而,简而言之,GLMs 为目标变量非正态分布提供了一个理论框架。在本文中,我们将使用 GLMs 推导逻辑回归,以显示它的确切来源。

例题和动机

逻辑回归的目的是在给定一些特征的情况下,为发生的事件或属于某一类别的样本分配一个概率。这类似于一个布尔值输出。****

一个示例问题是确定学生是否通过考试。让我们将通过(成功)指定为 1 ,将失败指定为 0 。现在,让我们假设我们知道他们为考试学习了多长时间,称这个为 X_1 ,以及他们是否通过了之前的考试 X_2 。因此,我们可以把这个问题表述为:

作者在 LaTeX 中生成的方程。

其中 Y 为目标,那个应该取值在 01 之间,β 值是我们需要计算的未知系数来拟合模型。然而,你看到上面等式的问题了吗?无法保证输出会在 0 和 1 之间。花在学习上的时间, X_1 可以取从 0无穷大的值,这样我们就可以得到一个大于 1 的 Y 值。这不好,会让我们的模型变得荒谬。

因此,我们需要找到一种方法,或者更好的一个函数,来满足我们的目标变量的要求。可以使用 GLMs 的数学框架找到该函数。

伯努利和二项式分布

上述问题所需的输出由 伯努利分布 满足。这种分布用两种可能的结果计算某个试验的概率,成功或失败。例如,抛硬币是否会落在人头上。人们通常将成功的概率指定为 p, ,因此 失败的概率为1–p

伯努利分布的概率质量函数为:

作者在 LaTeX 中生成的方程。

其中 x 是成功试验的次数p 是成功试验的概率

伯努利分布是二项分布的特例,其中我们有个多次试验,用 n 表示,因此可以有个以上的成功试验。二项式分布的概率质量函数为:

作者在 LaTeX 中生成的方程。

这与伯努利分布的函数相同,只是我们现在乘以由下式给出的二项式系数:

作者在 LaTeX 中生成的方程。

这些系数计算在试验中有【x】种结果的方式(排列)的数量。这些系数出现在 帕斯卡三角****组合学 等许多自然现象中。

GLMs 和链接功能

GLMs 可用于确定将输入“链接”到所需分配输出的功能。GLM 理论框架要求目标变量分布是指数族的一员,该指数族由以下概率密度函数给出:

作者在 LaTeX 中生成的方程。

其中, θ自然参数,即为与均值挂钩,****φ标度参数,即与方差挂钩。此外, a(φ)b(θ)c(y,φ) 是需要计算的附加函数。

可以通过数学推导得出,指数族的均值、 E(Y)、和方差、 Var(Y)由下式决定:

作者在 LaTeX 中生成的方程。

作者在 LaTeX 中生成的方程。

这些公式只是为了完整性而给出的,对于这个推导来说并不是必需的。同样,这个理论框架在我的上一篇文章中有更详细的解释。

二项分布的链接函数

实际上,二项式分布是指数族的一员,可以用要求的格式写成:

作者在 LaTeX 中生成的方程。

通过将二项式公式的系数与指数族公式的系数进行匹配,我们得出结论:

作者在 LaTeX 中生成的方程。

你认识这个等式吗?上述函数被称为 Logit 函数,是二项式/伯努利分布的圆锥形连接函数。作为参考,上面的 p 值是输出变量 Y 等于1P = P(Y = 1)****的概率**

因此,对于具有二项式/伯努利分布的目标变量,数学推导的关联函数是 Logit 函数**。这就是为什么叫 Logistic 回归!**

回到我们上面设置的学生是否通过考试的问题。我们现在可以使用 Logit 函数修改我们之前的等式:

作者在 LaTeX 中生成的方程。

重新排列:

作者在 LaTeX 中生成的方程。

我们推导出了著名的 Sigmoid 函数 !这个新的等式现在确保了无论我们的输入取什么值,输出总是在 0 和 1 之间!

结论

我希望你喜欢上面的文章,并对逻辑回归的起源有所了解。我省略了相当多的数学细节,因为有些推导已经非常详尽了!因此,请随意进一步探讨这个话题,以获得更好的直觉!

和我联系!

(所有表情符号都是由 OpenMoji 设计的——开源的表情符号和图标项目。执照: CC BY-SA 4.0

R 的 expand.grid()函数的本质

原文:https://towardsdatascience.com/the-essence-of-rs-expand-grid-function-a-love-letter-to-a-function-that-say-it-all-3f0ebba649c?source=collection_archive---------13-----------------------

写给一个函数的情书,它说明了一切

照片由詹姆斯·哈里逊Unsplash 上拍摄

当审查某人的代码时,有什么迹象告诉你这是一段好代码吗?它可以是代码结构、风格、注释文档、制表符或空格,或者任何让你说“这一切都有意义”的东西

对我来说,要给人留下这样的印象,所需要做的就是使用 expand.grid()函数开始编写代码!

expand.grid()函数是什么?

它是 R 的基础系统中的一个功能,意味着当你第一次安装 R 时它就已经存在了,甚至不需要安装任何额外的包。

根据函数的文档,它“从因子变量的所有组合中创建一个数据框”。

这里有一个例子:

expand.grid(height = seq(1, 10, 3), 
               sex = c("Male","Female"))
#>     height    sex
#> 1      1      Male
#> 2      4      Male
#> 3      7      Male
#> 4     10      Male
#> 5      1     Female
#> 6      4     Female
#> 7      7     Female
#> 8     10     Female

还有一个最近的版本,它被改编成了一个 tidyr::expand_grid() 版本,该版本处理了一些烦人的副作用,并且还允许扩展 data.frames. (不要将:base::expand.grid 与"."混淆),vs tidyr::expand_grid()带“_”.

幕后发生了什么?

基本版本:

> expand.grid
function (..., KEEP.OUT.ATTRS = TRUE, stringsAsFactors = TRUE) 
{
    nargs <- length(args <- list(...))
    if (!nargs) 
        return(as.data.frame(list()))
    if (nargs == 1L && is.list(a1 <- args[[1L]])) 
        nargs <- length(args <- a1)
    if (nargs == 0L) 
        return(as.data.frame(list()))
    cargs <- vector("list", nargs)
    iArgs <- seq_len(nargs)
    nmc <- paste0("Var", iArgs)
    nm <- names(args)
    if (is.null(nm)) 
        nm <- nmc
    else if (any(ng0 <- nzchar(nm))) 
        nmc[ng0] <- nm[ng0]
    names(cargs) <- nmc
    rep.fac <- 1L
    d <- lengths(args)
    if (KEEP.OUT.ATTRS) {
        dn <- vector("list", nargs)
        names(dn) <- nmc
    }
    orep <- prod(d)
    if (orep == 0L) {
        for (i in iArgs) cargs[[i]] <- args[[i]][FALSE]
    }
    else {
        for (i in iArgs) {
            x <- args[[i]]
            if (KEEP.OUT.ATTRS) 
                dn[[i]] <- paste0(nmc[i], "=", if (is.numeric(x)) 
                  format(x)
                else x)
            nx <- length(x)
            orep <- orep/nx
            x <- x[rep.int(rep.int(seq_len(nx), rep.int(rep.fac, 
                nx)), orep)]
            if (stringsAsFactors && is.character(x) && !is.factor(x)) 
                x <- factor(x, levels = unique(x))
            cargs[[i]] <- x
            rep.fac <- rep.fac * nx
        }
    }
    if (KEEP.OUT.ATTRS) 
        attr(cargs, "out.attrs") <- list(dim = d, dimnames = dn)
    rn <- .set_row_names(as.integer(prod(d)))
    structure(cargs, class = "data.frame", row.names = rn)
}
<bytecode: 0x000001dee40a0128>
<environment: namespace:base>

tidyr 版本:

> expand_grid
function (..., .name_repair = "check_unique") 
{
    dots <- dots_cols(...)
    ns <- map_int(dots, vec_size)
    n <- prod(ns)
    if (n == 0) {
        out <- map(dots, vec_slice, integer())
    }
    else {
        times <- n/cumprod(ns)
        out <- map2(dots, times, vec_rep_each)
        times <- n/times/ns
        out <- map2(out, times, vec_rep)
    }
    out <- as_tibble(out, .name_repair = .name_repair)
    flatten_nested(out, attr(dots, "named"), .name_repair)
}
<bytecode: 0x000001deeb1c15c8>
<environment: namespace:tidyr>

这有什么大不了的?

人们可以简单地认为这只是两个嵌套的循环。这里真的需要一个指定的函数吗?我的回答:要看用途!如果您在日常编码中不止一次地使用它,那么当然可以。为什么不呢?

在接下来的段落中,我将试图论证为什么它不仅仅是嵌套循环,以及为什么它与统计编程原则和需求产生共鸣。

为什么重要?

作为一名统计学家,这两个关键术语在我的日常工作中至关重要:

假设和实验设计

对我来说,这些是什么如何。 我们回答的解析题是什么?我们要测量/收集什么 T21?我们要怎么做呢?

下面是如何… 我们将在多个组中比较一个指标:病例/对照组,治疗 A 与治疗 B 与治疗 C,等等。通过定义这些组,我们考虑了以下几点:这些组有什么共同点?它们有什么不同?我们期望测量哪种类型的效果?说明了什么?什么是随机的,什么是固定的?最后,我们如何提出一个比偶然更有可能成立的论点?

当我们引入更复杂的实验设计,让我们有一个更好的答案,同时解决可能的混淆,最小化偏差,并在理想情况下,暗示合理的因果关系时,乐趣就开始了。

回到编码…

要为回答一个假设(或商业问题)做出令人信服的论证,你需要列出他们收集的证据,以及考虑的可能解释的范围。类似地,在数据科学和统计编程的背景下,代码应该尽可能早地反映我们测量什么,以及跨哪些组。expand.grid()允许我们列出问题的范围(使用的因子水平及其组合),然后遍历我们的实验/分析中考虑的不同组合。理想情况下,该表应包含可能组合的广泛可行范围,涵盖可能与该措施相关的所有内容。即使太细也不用担心。我们总是可以根据需要向下钻取并消除(折叠、聚集)更多的粒度级别。

表格格式的 Tidyverse 和嵌套对象

对于像我这样的统计学家来说,“整洁”的概念完全有意义。简单说:行是观察值,列是变量(字段/协变量)。

我喜欢 tidyverse 的地方在于,表格中的单元格不一定只有数字字符。相反,它可以是(整个)对象。例如:嵌套表,任何类/对象,列表,列表列表,列表列表列表,…好了,你明白了。

因此,剩下要做的就是从该对象中提取所需的信息,将其填充到所需的实验单元/级别,根据需要进行汇总/总结,并得出结论。用 Tidyverse 的术语来说,这就是巢/不巢。一开始肯定会让人不知所措,但是一旦你习惯了,它(可能)实际上是有意义的。

没有循环了!真的!

所以我们列出了实验因素,并把细胞内的数据打包。那么应该如何遍历所有可能的组合呢?嗯,就像以前的 excel 一样,对第一行(或任何其他感兴趣的因素级别组合)进行操作,然后将其拖到其他行上。使用一些“整洁”的技巧,您可以定义(变异)按行工作的新列,而不是使用嵌套的 for 循环和索引。这里至少有两种方法可以做到:1。DP lyr::row wise()2。 purrr ::map_() 家庭功能。

不服气?再看一下前面出现的 tidyr ::expand_grid()的代码。用 map()不是看起来优雅多了吗?

当范围增加时…

好吧,我知道,生活是会发生的,有时我们不得不在实验中引入额外的因素,然后呢?嗯,有了这个框架,添加另一个因素回到我们最初的 expand.grid()父函数不应该违反范围,即不应该破坏我们已经创建的一切!原始数据现在被拆分成更多的子组,但是我们变化后的新列保持不变!

弊端?

好吧,我对这篇文章有偏见,毕竟这是一封情书,所以请让我知道你不喜欢这种方式的什么。也许是可扩展性?我不知道。

expand.grid()用其他语言怎么说?

每种语言都有自己的文化、方言、社区和用例。您是否找到了一个与上面类似的很好的实现?或许 R 还有向别人学习的提升空间?

真诚地…

现在你知道了如何打动我的秘密,你所要做的就是给我看一些以 grid.expand()开头的代码

变形金刚的本质

原文:https://towardsdatascience.com/the-essence-of-transformers-9fb8e14cc465?source=collection_archive---------27-----------------------

实践教程,深度学习

到底什么是自我关注(层),它是如何基于 CNN 和混合专家

Sereja RisUnsplash 上拍摄的照片

学习序列数据是机器学习中的一个重要问题,它出现在许多应用中,如时间序列分析和自然语言处理。以前,RNN 和 LSTM 是这一领域最受欢迎的模型,而现在,具有自我关注的变压器是 NLP 应用程序的最先进的模型。

在这篇文章中,我将站在变形金刚创造者的角度,重新思考这个问题。首先,我将定义主要的挑战:在固定维度的特征向量中总结一个序列。然后,我来解释一下自我关注的解决方案:加权平均其中加权函数是带 1x1 卷积滤波器的 CNN。我将继续变形金刚的想法:使用自我关注作为神经网络的一层,并保持合理的参数数量。最后,我将说明这个问题与混合专家有什么相似之处。我将试着把重点放在主要的想法上,把细节和实现问题留给你在网上能找到的很多很棒的教程。

问题定义

假设我们已经观察到一系列 n d 维数据(可以是原始输入或提取的特征),我们想要聚集他们的信息并估计输出。例如,考虑一个 RNN,它取一个有 n 个单词 (x₁,…,xₙ) 的句子作为输入,将它们转换到一个隐藏向量空间,得到n**d-维度特征 (h₁,…,hₙ) ,取所有特征 (h) 的平均值,最后估计标签。在这个例子中,聚合(或压缩或汇总)是通过平均来完成的: h = avg(h₁,…,hₙ).问题是除了简单地取平均值,我们还能做什么?

我想到的第一个想法是连接这些特征以不丢失任何信息,建立一个维度向量,并在其上使用一个完全连接的层。但是通过这种方式,我们应该学习 O(nd) 个参数,这些参数对于长序列来说可能太大了。实际上,我们希望参数的数量与 n 无关,这样我们就可以支持任意长度的序列。这个问题的两个经典解决方案是取平均值(h =avg(h₁,…,hₙ),或者使用最新的特性 (h = hₙ) (它是 RNNs 中所有先前特性的总结)这两种方法都产生了 O(d) 个参数,但具有不同的加权函数:后者认为所有特征的权重相等,而前者将所有权重赋予最新的特征。然而,特征的重要性可能因输入而异(例如,句子开头的单词恶心可能足以将其标记为负面)。自我关注是学习一个加权函数的方法,让特征自己决定它们的重要性。

自我关注

现在是构建加权函数的时候了,该函数将一系列特征作为输入,并为平均化设置它们的权重[1]。最简单的解决方案是使用一个固定的线性变换,这只是一个点积,然后将评估的分数归一化为 1:

其中 w 是应该学习的固定线性变换。所以那些真正想成为重要的特性,就要向 w 的方向看齐,打造更大的点积。 w 也可以看作是一个 1x1 卷积滤波器应用在一个 1xn 深度为 d. 的图像上

图一。应用两个 1x1 卷积滤波器(图片由作者提供)。

但是为什么只考虑一个方向(滤波器)和一个简单的线性变换呢?让我们把它做成 k 方向(见图 1。)并添加简单的非线性来学习更复杂的函数:

在这里,我刚刚使用了矩阵符号: Hnxd (每一行都是 hᵢᵀ中的一个) W₁dxk (每一列都是一个方向像 w ),W₂是kx1(最终变换),所以 SA 都是现在我们要用 k(d+1) 参数学习 W₁ 和W₂(查图 2 举例。).

图二。三维空间中 n=6 个特征的例子。W1(具有 2 个方向)将点转移到 2 维子空间,W2(子空间中向量)设置特征权重;H3 和 H4 的权重分别最高和最低。

通过这种方式,我们正在学习关注序列中的某个特定片段。为什么不专注于不同的部分,同时学习 p > 1 加权函数呢?为此,将 W₂kx1 改为 kxp 就足够了,之后,我们得到恩智浦得分矩阵 S恩智浦权重矩阵 A ,以及 dxp 嵌入矩阵 h 。这相当于添加另一个具有 p 滤波器的 1x1 卷积层,从而产生两层 CNN。通过这种方式,我们实际上是在学习选择最重要的特性,并将它们连接在一个嵌入矩阵中(与连接所有不切实际的特性相比)。

因此,自我关注加权函数是利用 CNN 权重共享特性的两层 CNN ,并且个参数是 k(d+p) ,其中 d 是初始维度, k 是第一层中过滤器的数量, p 是关注点的数量。

变形金刚(电影名)

到目前为止,我们已经看到了自我关注的核心思想,即学习具有合理数量参数的参数加权函数。但那只是聚合函数的扩展。然而,也许我们可以把它作为一个独立的特征提取器,因为它接受一个 n 维向量序列,并把它转换成一个 p 维向量序列。然后,如果我们可以使用这个特征提取器作为神经网络的一层呢?也许以后会变得更深?**

我想,它们是[2]的作者在设计变形金刚和创造自我关注层时的想法。他们想去掉 rnn,用一个堆叠的自我关注层代替它们。还有一个重要的挑战需要解决:参数的数量。直观上,我们应该能够集中于较低层中的 p=n (或 O(n) )元素,如果是这样,参数的数量将是 k(d+n) ,这取决于 n

为了克服这个挑战,一个很好的想法被采用:设置 p=n, W₂ 是一个 kxn 矩阵,有许多参数,我们应该以某种方式减少它。所以让我们把它分解到 (HK)ᵀ ,其中 H 是原始的 nxd 矩阵, K 是一个 dxk 矩阵。合并 H 导致参数数量大幅减少,我们只需学习矩阵 Kkd 个元素。移除 tanh 函数,我们可以将公式重写如下:

另一个小扩展:输入维是 d ,在之前的版本中我们也得到一些 d 维的输出向量;让我们也将输入维数从 d 减少到 k (滤波器数量),并通过将嵌入公式改为 h=(HV)ᵀA 得到 k 维t37】输出,其中 Vt43】adxk矩阵:**

那是变形金刚!无论你在[2]中看到的是实现的细节和符号的变化:名称hw₁t48】查询,hkt52】键,以及HVt56】值矩阵。现在的参数数量是 3dk 其中 dk 分别是输入和输出向量的维数,在对一系列 n d -dim 向量应用自关注层之后,我们得到一系列 n k -dim 向量如你所见,参数的数量与 n 无关,我们可以堆叠自我关注层,构建一个深度模型,这就是 transformer。我不打算深究实现细节,并建议感兴趣的读者去看[3]。

*专家混合

MoE 的想法是基于不同专家的意见进行判断:对于任意输入值,收集所有专家的意见,并取其加权平均值,其中权重基于该输入区域的专家专业水平。例如,在回归问题中,在一些区域中,输出可能更多地是输入的线性函数,而在其他一些区域中更多地是二次函数。MoE 关心的是如何同时学习专家本身和加权函数(这里称为门控网络)。

现在假设 h₁,…,hₙ 是不同专家的意见,自我关注是基于特征值设置权重的门控网络。这个想法是相同的,注意力加权网络是基于它们的值来选择特征的重要性级别。此外,它非常类似于混合密度网络,其中使用神经网络预测混合系数(参见[4]中的 5.6 和 14.5.3)。

参考

[1]林,,等.“一个结构化的自注意句嵌入”ICLR。2017.

[2]瓦斯瓦尼、阿希什等人,“你所需要的只是关注。”乳头。2017.

[3] 图文并茂的变形金刚

[4] Bishop,Christopher M. 模式识别和机器学习。斯普林格,2006 年。

A/B 测试样品比率不匹配的基本指南

原文:https://towardsdatascience.com/the-essential-guide-to-sample-ratio-mismatch-for-your-a-b-tests-96a4db81d7a4?source=collection_archive---------6-----------------------

如果你不能相信一个实验的结果,你就不能相信你基于它做出的决定;你会惊讶地发现,你常常不相信实验的结果

缺乏数据完整性是实验中常见的问题。在处理重定向测试、单页应用程序或其他复杂设置时,它们尤其常见。你构建测试有多久并不重要;这些问题就这么发生了。

那么,鉴于这一事实,我们能做些什么呢?首先(也是最重要的),我们需要非常密切地跟踪我们实验的数据完整性。因此,如果出现问题,我们会尽早知道。

任何人都可以执行的一个基本(简单)检查是样本比率不匹配(SRM) 检查。要做到这一点,您不必是分析师或数据科学家。事实上,我在测试中遇到的许多问题都是由产品所有者发现的。

在本文中,我将向您提供什么是 SRM 以及检查 SRM 的各种方法的实用概述。有了这些知识,你就可以把它整合到你自己的实验过程中。

在我们开始之前,我必须强调一点:尽管 SRM 可以捕获许多问题,但它并不能突出显示您的设置中的每个可能的问题。这只是你应该做的最起码的事情。

什么是样本比率不匹配?

假设你有一个 A/B 测试,期望是对半分…

图片作者。流量平均分配

但是假设你实际看到的是这样的…

图片作者。流量分配不均

请注意,样本大小不匹配。这就是我们所说的“样本比率不匹配”,即样本比率与我们的预期不匹配(对半分割)。像这样的偏差会使你的测试无效。

检查 SRM 时的规则

在我们进一步讨论之前,我们需要确定一些要遵循的规则。

这些规则的第一条是用“用户”而不是“访问”来区分 SRM 检查的优先级。那是因为分配给实验的是“用户”。相比之下,“访问”是这些用户进行的“会话”的数量。

如果一个变化鼓励用户更频繁地返回 (或更少),我们实际上可能会预期访问的偏斜。

那么,这是否意味着带有“访问”的 SRM 总是没问题的呢?不一定。我遇到过这样的场景,缺陷导致用户在一个版本中比另一个版本中减少更多的访问。只是有“访问”的 SRM 并不是有“用户”的 SRM 是问题的“确凿证据”。

无论如何,我们的第二个规则是检查样本比率不匹配。那就是:我们需要经常寻找问题。SRM 检查不是一蹴而就的活动。我们需要在测试一启动就检查它们,然后我们应该定期检查。

至少在启动的第一周,新的实验应该像重症监护病人一样对待。

这条规则立即给我们带来了一个需要解决的问题,因为被询问的流量可能非常低。但是有一些方法可以提高我们的确定性。我们将在本文的稍后部分讨论这个问题。首先,让我们看看识别问题的最简单的方法。

检查明显的问题

识别问题的第一个也是最简单的方法是查看测试作业编号。

有些问题是如此的突出;你可以直接发出警报,而不需要做任何计算。例如,如果您在一个组中看到 1000 个用户,而在另一个组中看到 100 个用户,您就知道有问题了。

这似乎是显而易见的事情,但重要的是不要认为检查 SRM 是某种主要活动。只要能够很容易地快速看到这些数字,就能为你节省大量时间。

更重要的是,一旦你养成了定期查看这类数字的习惯,你就能发现不匹配的地方——尤其是大的不匹配。

但是假设更近呢?假设控制组中有 10,000 个用户,变体中有 9,500 个用户。那你会怎么做?

样本比率公式

我们可以运行一个简单的计算来找到样本比率。

首先,获得分配给实验的用户总数…

**total_users_in_test** = users_in_control + users_in_variation

…然后计算出每组用户的百分比。

control = **users_in_control / total_users_in_test**
variation = **users_variation / total_users_in_test**

你不需要同时解决控制和变化。一个就够了。

对于我们的例子,计算:

control = **10,000 / (10,000 + 9,000) =** 0.5263
variation = **9,500 / (10,000 + 9,000) =** 0.4737

因此, 52.63%的用户处于对照组,47.37%的用户处于变异。现在,我们可能期望在实验的早期看到一定量的不匹配,但是上面的情况看起来很可疑。

我们怎样才能提高我们确定性的水平?是时候使用一些统计数据了...

独立性卡方检验

统计学是以有用的方式描述数据的方法。

我们有两个样本:控制组和变化组的流量。知道这些数字之间的差异超出正常概率的可能性是有用的。

我们可以使用卡方独立性检验来做到这一点。这个测试告诉我们,给定两个样本,样本独立的概率

您实际上不需要知道计算 Chi 的公式(尽管我稍后会详细介绍),因为使用 python 非常简单:

observed = [ **170471**, **171662** ]
total_traffic= sum(observed)
expected = [ total_traffic/2, total_traffic/2 ]from scipy.stats import chisquarechi = chisquare(**observed**, f_exp=**expected**)
print(chi)

“观察”变量列出了两个值:控制中的用户数和变化中的用户数。

“expected”变量也是两个值的列表:我们期望每个组有多少用户。我们期望的流量是每个中总流量的一半。这是总流量,除以 2。

我们需要来自 scipy.stats 的“卡方”模块。之后,我们只需输入数字。我们得到的输出是:

Power_divergenceResult(statistic=4.145992932573005, pvalue=0.041733172643879435)

这是一个元组,其中第一项是卡方统计,第二项是 p 值。通常,人们会寻找 0.05 或更小的 p 值来确定独立性(以及,在我们的情况下,SRM 的证据)

0.05 的问题在于它对于我们的目的来说不够严格。使用这个可能会给我们一个错误的问题信号。迈克尔·林顿(optimize ly 团队的一员)在下面的文章中对此进行了详细介绍。

我们需要的是对我们的独立性测试更加严格。低于 0.01 的值应该足够了。在我们的 Python 示例中,我们可以编写一个条件语句,以便于阅读:

if **chi[1]** < 0.01:
    print('Warning. SRM may be present.')
else:
    print('Probably no SRM.')

顺便说一下,chi[1]意味着我们从元组中访问 p 值。我们的完整脚本如下所示。

使用我们的例子,我们没有 SRM 的确凿证据。再补充一点,我喜欢看累积视图。我们的流量越大,两组样本的分割就越接近:

图片作者。abdecisions.com 的屏幕

上面是一个非常典型的样本比率视图。如果在实验运行期间引入了一个缺陷,这些累积视图对于确定 SRM 何时开始发生是有用的。

电子表格视图

我意识到许多阅读这篇文章的人可能不熟悉 python。因此,这里有一个使用电子表格的例子(适用于 Google Sheets 或 Excel):

使用 CHITEST 公式,我们可以传递两组值:观察值和期望值。

图片作者。使用电子表格进行卡方检验

=CHITEST(**observed_cell_range**,**expected_cell_range**)

第一个数字范围是控制和变化的“观察”值。第二个范围是“预期”(总数除以 2)。

公式的输出是 P 值。之后,规则与我们的 python 示例相同:小于 0.01 表示可能的 SRM。

更深入地了解卡方(可选)

对于那些真正想深入研究卡氏检验公式的人来说,这里是:

图片作者。χ统计=观察值与期望值的平方之和除以期望值

卡方统计量是每个观察值的总和减去期望值的平方,再除以期望值。

啊?让我们用一个电子表格来分解它:

图片作者。包含公式值的电子表格

这些列:

  • 观测值:分别为控制交通量和变异交通量。
  • 预期:每个的预期值——即观察到的总数除以 2。
  • 差异:观察值减去预期值
  • 差的平方:自身相乘的差
  • 差平方/预期:差平方除以预期。

每一行都是一个变体组。例如,控制和变更(A/B)。

在这之后,我们准备寻找 Chi 统计,它只是 Diff 的平方/预期(如上面的公式中所示)的总和:

图片作者。差平方和除以期望值

我们如何从中获得 p 值?嗯,我们首先还需要一样东西:那就是自由度,计算方法是:

*Degree of Freedom = (rows − 1) × (columns − 1)*

在我们的例子中,我们的自由度是 1(两行用于测试和控制,两列用于观察和预期)。

然后,我们可以使用 p 值表来定位我们的得分并找到相关的 p 值:

图片作者。p 值表

或者使用电子表格功能:

使用 CHISQ。DIST.RT 来求 p 值

=CHISQ.DIST.RT( chi_statistic, degrees_of_freedom)

这个函数给出了精确的 p 值。我们最终的电子表格如下所示:

图片作者。来自 CHISQ 的 p 值。DIST RT

当然,您可以通过使用前面所示的 CHITEST 函数来规避所有这些问题。

摘要

使用 Chi 检查流量的有效性非常简单。真的没有借口不做。此外,通过做这个简单的检查,你真的可以节省很多时间。

一旦你经常这样做,你就可以通过添加更多的数据验证检查来更进一步。这才是真正的开始。但这是一个重要的开始。

说了这么多,还是要警惕狼来了。这可能会像数据有效性问题本身一样损害您的实验过程。我通常对在实验启动的第一天宣布问题很谨慎,除非有一个突出的问题。

经常这样做,您将成为尽早确定 SRM 问题的专家。

关于我

我是 Iqbal Ali漫画作家 train line 前优化主管, A/B 决策工具的创造者,也是一名自由职业的 CRO 专家和顾问。

我帮助公司开展实验项目,设计、开发、培训和建立实验流程。

如果你想联系,这是我的 LinkedIn 。或者跟随我来到这里。

基本思想重新映射

原文:https://towardsdatascience.com/the-essential-ideavim-remaps-291d4cd3971b?source=collection_archive---------1-----------------------

到达无鼠生产力乐土

照片由 Amine Elhattami 拍摄

我使用 IdeaVim 进行机器学习和通用软件项目已经有一段时间了。在我的旅程中,我编制了一个基本重映射列表,将您的无鼠标开发提升到一个新的水平,而不会牺牲 Jetbrains IDEs 提供的健壮特性。因此,如果你更关注你正在编写的代码,而不是你应该使用哪个航空公司的主题,那么这篇博文就是为你准备的。这也是为了机器学习人群,他们仍然使用 Jupyter 笔记本电脑,并希望加强他们的开发环境游戏,但被 Vim 陡峭的学习曲线所阻碍。

几年前,我使用 Vim/NeoVim 作为我的日常驱动程序,我决定改用 IdeaVim,因为我意识到我把宝贵的时间花在了我的.vimrc上。正如你将在这篇文章中看到的,你仍然需要做一些配置。然而,与在 Vim 上构建“IDE”相比,它主要是设置快捷方式。IdeaVim 并不完美,但它为我提供了我需要的灵活性,尤其是因为我不是 Vim 超级用户。如果你对我为什么转而使用 IdeaVim 感兴趣,请查看这篇文章。

开始之前

如果你是 IdeaVim 的新手,看看我之前的帖子,看看如何设置它,并了解 IdeaVim 快捷方式是如何工作的。此外,我理解记住所有的快捷方式可能会让人不知所措。我刚开始的时候也是这样。我尝试了多种方法来记忆它们,但最有效的是:

  • 让按键绑定成为你自己的。在完善配置的过程中,您最终会从多个来源收集重映射,就像这个一样,有时键绑定对您来说没有意义,或者它可能已经被使用了。所以去改变它吧。
  • 按照相同的方法创建快捷方式。例如,你可以选择使用CTRL和快捷键动作的第一个字母。例如,映射CTRL t来启动终端。偶尔一些动作会以同一个字母开始,这时你可以使用<leader>键或任何类似gd的键来定义。
  • 把你经常忘记的快捷方式列表放在显眼的地方。我在我的显示器上用了一张便利贴,它真的有效!

记住,学习 Vim 风格的键绑定总是很有价值的。因为即使您选择使用另一个 IDE,它也可能有某种 vim 模拟。例如,我使用 PyCharm 和 CLion 进行开发,使用 NeoVim 动态编辑配置文件,我在这三个版本中使用了大致相同的键绑定。所以我只需要记住一套快捷键,这是一大优势。此外,下次当你不得不编辑一个服务器配置,而 vi 是唯一的选择时,你会感谢你自己。

最后,我在这里分享一些屏幕截图因为眼见为实。

基本重映射列表

我已经决定将列表分成几个部分,以提供每个部分的更多细节,如果你只是在寻找特定的重映射。

作为参考,我在帖子底部附上了完整的配置。但是,我建议您复制/粘贴每个部分,并尝试每个重新映射,看看它做了什么。

编辑和重新加载配置

在这篇博文中,你会看到需要添加到.ideavimrc文件中的片段。保存后,需要重新加载以应用更改。下面定义了两个重映射:\e打开文件,\r重新加载文件。此外,set clipboard命令支持从 IdeaVim 使用系统剪贴板,反之亦然。

set clipboard+=unnamed
set clipboard+=ideaputnnoremap \e :e ~/.ideavimrc<CR>
nnoremap \r :action IdeaVim.ReloadVimRc.reload<CR>

请注意,对于我在编码时不使用的重映射,如上图所示。我尝试使用相同的前缀(在本例中是\,因为我不想浪费有用的键绑定。

退出按钮

或者更确切地说是缺少退出按钮。对于那些被老款 MacBook touch bar 诅咒的人来说,这个很方便。因为你几乎总是需要点击<ESC>,所以拥有一个物理按钮的触觉反馈是必须的(至少对我来说)。下面重新映射CTRL c<ESC>

map <C-c> <Esc>

此外,我从系统偏好设置中将CAPSLOCK设置为CTRL键。我发现它非常有用,因为你的手指不需要离开主行。您甚至可以将CAPSLOCK键设置为按一次充当<ESC>,按住则充当CTRL

前导键

如果您不熟悉 Vim,可以将 leader 键看作一个曾经设置过的映射前缀。假设您的配置中有<leader>c,并且您已经将 leader 映射到SPACE,如下所示,那么您的映射是SPACE c

let mapleader=" "

使用 leader 键的好处是,如果你决定SPACE不再实用,只需要在一个地方进行改变。

无分心模式

正如我在之前的一篇文章中提到的,我是 Vim 干净界面的忠实粉丝。然而,我一直被问到为什么有人会隐藏 ide 提供的所有有用的小部件。我的回应是,我喜欢把我的开发界面当成我的办公桌。我尽量把最少的放在最上面,因为每个项目都在不断地吸引我的注意力。此外,可见的小部件可以“欺骗”你使用鼠标而不是使用快捷方式。永远记住:

看不到的不能点。

nnoremap <c-z> :action ToggleDistractionFreeMode<CR>

末端的

在我日常使用的所有命令行工具中,拥有一个终端快捷方式是必须的。

nnoremap <c-t> :action ActivateTerminalToolWindow<CR>
nnoremap <leader>t :action Terminal.OpenInTerminal<CR>

Terminal.OpenInTerminal动作允许您在编辑器中当前文件的父文件夹中直接打开一个新的终端。这对于深度嵌套的文件夹结构非常有用,因为它避免了必须 cd 到正确的文件夹。

窗口导航

在编程时,我非常依赖导航重映射,因为我不断地创建分割,并从一个缓冲区(或选项卡)移动到另一个。

nnoremap <c-\> :action SplitVertically<CR>
nnoremap <c--> :action SplitHorizontally<CR>
nnoremap <c-=> :action Unsplit<CR>
nnoremap <c-m> :action MoveEditorToOppositeTabGroup<CR>sethandler <c-j> a:vim
sethandler <c-k> a:vim
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>knnoremap <TAB> :action PreviousTab<CR>
nnoremap <s-TAB> :action NextTab<CR>nnoremap <Leader>en :action EditSourceInNewWindow<CR>
nnoremap <Leader>n :action NextWindow<CR>nnoremap <Leader>q :action CloseContent<CR>
nnoremap <Leader>qa :action CloseAllEditors<CR>

sethandler命令将 IdeaVim 设置为指定快捷方式的处理程序。这可以通过设置 UI 来完成。然而,我喜欢尽可能把所有东西都放在一个地方。

编辑源代码

如果基本的重映射列表不包括编辑源代码,它将是不相关的。看着我的配置,我可以数出 30 多个我在这里和那里找到的地图。然而,在写这篇文章的时候,我选择了我最常用的。这表明你不需要一个详尽的清单。你只需要保留你使用的那些,所以请随意挑选。

set ideajoin
set idearefactormode=keepvnoremap < <gv
vnoremap > >gvnnoremap [[ :action MethodUp<CR>
nnoremap ]] :action MethodDown<CR>nnoremap zc :action CollapseRegion<CR>
nnoremap zo :action ExpandRegion<CR>
nnoremap <leader>zc :action CollapseAllRegions<CR>
nnoremap <leader>zo :action ExpandAllRegions<CR>nnoremap <leader>c :action CommentByLineComment<CR>nnoremap <leader>r :action Refactorings.QuickListPopupAction<CR>nnoremap <Leader>=  :action ReformatCode<CR>
nnoremap <leader>o :action OptimizeImports<CR>nnoremap <c-r> :action RecentFiles<CR>
nnoremap <leader>l :action RecentLocations<CR>
nnoremap <leader>h  :action LocalHistory.ShowHistory<CR>nnoremap ge :action GotoNextError<CR>
nnoremap gE :action GotoPreviousError<CR>

对于重构,我选择了快速列表,因为我发现这样更容易。但是,您可以使用适当的 ID 来映射每一个特定的重构操作,比如ExtractMethodRenameElementChangeSignature等等。使用:actionlist命令查找完整的动作 ID 列表。

搜索和源代码导航

我喜欢 Jetbrains IDEs 的搜索功能。它只是工作,并有一个接近完美的智能感知。尤其是在处理一个新的大型代码库时,我仍然在学习东西在哪里。

set incsearchnnoremap <c-/> :action FindInPath<CR>
nnoremap <c-a> :action GotoAction<CR>
nnoremap <c-f> :action GotoFile<CR>
nnoremap <leader>u :action FindUsages<CR>nnoremap <leader>s :action GotoRelated<CR>
nnoremap <leader>h :action CallHierarchy<CR>
nnoremap <leader>b :action ShowNavBar<CR>
nnoremap <c-s> :action FileStructurePopup<CR>
nnoremap <c-o> :action GotoSymbol<CR>
nnoremap gc :action GotoClass<CR>
nnoremap gi :action GotoImplementation<CR>
nnoremap gd :action GotToDeclaration<CR>
nnoremap gp :action GotToSuperMethod<CR>
nnoremap gt :action GotoTest<CR>
nnoremap gb :action Back<CR>
nnoremap gf :action Forward<CR>

对于文件内搜索,我喜欢使用 Vim 的默认搜索命令/。因为它提供了我所需要的一切。但是,你总是可以映射Find动作。

工具窗口

在任何 Jetbrains IDEs 中,几乎所有不是编辑器的东西都是工具窗口。所以有一套好的快捷方式来管理它们非常方便。

首先在你的.ideavimrc中,你需要设置从编辑器中触发的快捷键。

nnoremap <c-p> :action JumpToLastWindow<CR>
nnoremap <c-x> :action HideAllWindows<CR>

其次,从 IDE 设置中设置从工具窗口触发的设置:

  • 转到“键盘映射”并找到“其他”,然后是“工具窗口视图模式”并映射“固定停靠”、“浮动”和“窗口”。在我的例子中,我分别使用了ALT dALT fALT w。请注意,这些映射不会干扰您的.ideavimrc中的映射。
  • 仍然在“键盘映射”中,找到“主菜单”,然后是“窗口”,然后是“隐藏活动工具窗口”和映射“隐藏活动工具窗口”。在我的例子中,我使用了ALT h
  • 在“工具”中找到“终端”并取消选中“覆盖 ide 快捷键”

最后一个评论,无论何时你想回到编辑器,只要点击<ESC>。然而,由于 IdeaVim 中的一个错误,你不能使用<ESC>运行控制台返回到编辑器。一个解决方法是从 IDE 设置中为“焦点编辑器”设置第二个快捷方式,而不是<ESC>,在我的例子中,我使用的是F1

运行和调试

我的运行和调试配置非常简单,如下图所示。

nnoremap ,r :action ContextRun<CR>
nnoremap ,c :action RunClass<CR>
nnoremap ,f :action ChooseRunConfiguration<CR>
nnoremap ,t :action ActivateRunToolWindow<CR>
nnoremap ,u :action Rerun<CR>

我选择映射ContextRun而不是Run动作,因为后者运行之前选择的配置,而不是运行光标处的代码。RunClass动作名容易引起误解,但它是用来运行当前文件的。此外,由于在使用上述定义的ActivateRunConfiguration时,您可以通过按住SHIFT来够到ActivateDebugConfiguration。我决定不绘制它。

以上所有命令都适用于运行测试。只需将光标放在您想要运行的测试上,然后点击快捷键。我也喜欢使用RerunFailedTest来做它所说的事情。

nnoremap ,f :action RerunFailedTests<CR>

至于调试,可以重新映射多个动作。但是,我只在基本情况下使用快捷键。对于任何更高级的东西,我现在坚持用鼠标。主要依靠快捷键感觉比较慢或者可能我在键盘上没那么快。还有,如果你看一下 Vimspector 项目(最有前途的调试插件之一),你可以看到他们在 Vim 的界面上增加了按钮。所以我可能不是唯一有这种想法的人。

nnoremap ,b :action ToggleLineBreakpoint<CR>
nnoremap ,d :action ContextDebug<CR>
nnoremap ,n :action ActivateDebugToolWindow<CR>

使用 ide 运行和调试的一个缺点是,如果您使用一些高级设置,如环境变量或解释器选项,您将需要使用鼠标来创建配置。您仍然可以从终端运行您的代码,但是您将失去一些不错的功能,比如测试运行器和调试器。这对我来说不是一个交易破坏者,因为这是一个设置和忘记设置。

完整的配置

""" Editing and Reloading the Config
set clipboard+=unnamed
set clipboard+=ideaput
nnoremap \e :e ~/.ideavimrc<CR>
nnoremap \r :action IdeaVim.ReloadVimRc.reload<CR>""" The Escape button
map <C-c> <Esc>""" The Leader Key
let mapleader=" """" Distraction Free Mode
nnoremap <c-z> :action ToggleDistractionFreeMode<CR>""" Terminal
nnoremap <c-t> :action ActivateTerminalToolWindow<CR>
nnoremap <leader>t :action Terminal.OpenInTerminal<CR>""" Navigation
nnoremap <c-\> :action SplitVertically<CR>
nnoremap <c--> :action SplitHorizontally<CR>
nnoremap <c-=> :action Unsplit<CR>
nnoremap <c-m> :action MoveEditorToOppositeTabGroup<CR>sethandler <c-j> a:vim
sethandler <c-k> a:vim
nnoremap <c-h> <c-w>h
nnoremap <c-l> <c-w>l
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>knnoremap <TAB> :action PreviousTab<CR>
nnoremap <s-TAB> :action NextTab<CR>nnoremap <Leader>en :action EditSourceInNewWindow<CR>
nnoremap <Leader>n :action NextWindow<CR>nnoremap <Leader>q :action CloseContent<CR>
nnoremap <Leader>qa :action CloseAllEditors<CR>""" Editing source code
set ideajoin
set idearefactormode=keepvnoremap < <gv
vnoremap > >gvnnoremap [[ :action MethodUp<CR>
nnoremap ]] :action MethodDown<CR>nnoremap zc :action CollapseRegion<CR>
nnoremap zo :action ExpandRegion<CR>
nnoremap <leader>zc :action CollapseAllRegions<CR>
nnoremap <leader>zo :action ExpandAllRegions<CR>nnoremap <leader>c :action CommentByLineComment<CR>nnoremap <leader>r :action Refactorings.QuickListPopupAction<CR>
nnoremap <Leader>=  :action ReformatCode<CR>
nnoremap <leader>o :action OptimizeImports<CR>nnoremap <c-r> :action RecentFiles<CR>
nnoremap <leader>l :action RecentLocations<CR>
nnoremap <leader>h  :action LocalHistory.ShowHistory<CR>nnoremap ge :action GotoNextError<CR>
nnoremap gE :action GotoPreviousError<CR>nnoremap <leader>s :write<CR>""" Searching and Source Code Navigation
set incsearchnnoremap <c-/> :action FindInPath<CR>
nnoremap <c-a> :action GotoAction<CR>
nnoremap <c-f> :action GotoFile<CR>
nnoremap <leader>u :action FindUsages<CR>nnoremap <leader>s :action GotoRelated<CR>
nnoremap <leader>h :action CallHierarchy<CR>
nnoremap <leader>b :action ShowNavBar<CR>
nnoremap <c-s> :action FileStructurePopup<CR>
nnoremap <c-o> :action GotoSymbol<CR>
nnoremap gc :action GotoClass<CR>
nnoremap gi :action GotoImplementation<CR>
nnoremap gd :action GotToDeclaration<CR>
nnoremap gp :action GotToSuperMethod<CR>
nnoremap gt :action GotoTest<CR>
nnoremap gb :action Back<CR>
nnoremap gf :action Forward<CR>""" Tool windows
nnoremap <c-p> :action JumpToLastWindow<CR>
nnoremap <c-x> :action HideAllWindows<CR>""" Running and Debugging
nnoremap ,r :action ContextRun<CR>
nnoremap ,c :action RunClass<CR>
nnoremap ,f :action ChooseRunConfiguration<CR>
nnoremap ,t :action ActivateRunToolWindow<CR>
nnoremap ,u :action Rerun<CR>nnoremap ,f :action RerunFailedTests<CR>nnoremap ,b :action ToggleLineBreakpoint<CR>
nnoremap ,d :action ContextDebug<CR>
nnoremap ,n :action ActivateDebugToolWindow<CR>

结论

我再次重申,我不是由 Jetbrains 赞助的;然而,这是我分享我的旅程的愿望的一部分,希望它可以帮助别人。

我仍然相信 IdeaVim 并不完美,但直到现在它给我提供了足够的灵活性,我很乐意继续使用它。

最后,我目前依靠一组插件来增强我的配置,并将很快分享它们,所以请务必关注我!

在你走之前

Twitter 上关注我,我经常在那里发关于软件开发和机器学习的微博。

人工智能驱动的劳动力监督的伦理

原文:https://towardsdatascience.com/the-ethics-of-ai-driven-workforce-surveillance-2bfaa57cc4a5?source=collection_archive---------43-----------------------

意见

了解公司如何使用人工智能来监控员工的生产力、健康和行为,这一概念在法律环境中的地位,以及公司应该走多远

Alex Kotliarskyi 在 Unsplash 上的照片

简而言之,任何管理者的价值都可以和他们团队的效率和生产力联系起来。可以说,除了使用复杂的策略之外,许多经理还依靠他们的直觉来评估员工并相应地对待他们。随着疫情迫使大多数企业进行远程工作,这种方法在很大程度上已经不再适用。管理人员越来越难以在没有直接沟通的情况下监控员工的工作效率,这极大地增加了对远程监控解决方案的需求。

然而,高级员工监控的概念已经存在很久了。20 世纪,弗雷德里克·泰勒(Frederick Taylor)提出了科学管理理论,彻底改变了组织对待员工绩效评估和劳动生产率的方式。尽管泰勒的理论在 20 世纪 30 年代已经过时,但其利用数据提高员工绩效的核心思想至今仍在探索之中。随着人工智能服务的民主化,公司现在期待使用人工智能来简化员工监控也就不足为奇了。

本质上,每个员工都在不断产生数据,这些数据可用于分析绩效、福利和行为。虽然一些公司监控员工在不同应用上花费的时间,但其他公司甚至远程查看员工的屏幕,并从网络摄像头捕捉视频。这些想法和技术已经使用了相当一段时间,人工智能最终可以通过实时处理和分析大量数据来实现它们。

例如,工作场所监控软件初创公司 Sapience Analytics 的产品被 100 多家公司使用,它通过监控计算机的使用情况来评估员工的生产力。该公司的客户之一 Barclays 开始使用该程序来匿名检测未被占用的工作站,主要目的是减少办公空间。一段时间后,巴克莱似乎无法抵挡充分利用该软件的诱惑,开始对员工进行去匿名化,并非常详细地衡量他们的生产率。不到一个月,员工就公开批评了新系统,巴克莱银行因违反隐私法面临十亿美元的罚款。

亚马逊使用 ML 供电的摄像头来监控送货车的内部,以检测危险的驾驶行为。嵌入式 ML 算法可以识别司机是否因手机而分心或打哈欠,并可以立即发送音频反馈,告诉司机注意路况。不出所料,只有在司机同意被过度监控的情况下,这样的监控水平才是合法的,这导致了员工的强烈反对。然而,尽管遭到强烈反对,该公司的事故减少了近 50%,分心驾驶减少了 45%。

在过去的十年里,我们的隐私界限变得如此模糊,以至于很难判断公司在哪里真正越界了。虽然亚马逊的大多数客户愿意出售大量个人数据,以换取更好的产品推荐,但他们无法摆脱不断被监视和分析的想法,即使这是为了他们自己的利益。这是可以理解的。

在这一点上,它是关于找到雇主应该收集和可以收集的确切员工数据之间的平衡。鉴于对工作场所监控解决方案的需求迅速增加,适当的法规尚未出台。然而,劳动力监测的方法和理由范围如此之广,以至于建立一个普遍的法律框架相当复杂。目前,根据不同的管辖范围,法律含义有很大的不同。例如,不列颠哥伦比亚省(OIPC)信息和隐私专员办公室认为,为了提高公司 IT 系统的安全性而监控在线活动并不是收集个人信息的正当理由。最重要的是,OIPC 提供了一份详尽的指南,明确概述了适当使用劳动力监控的条件。

然而,OIPC 和几乎任何其他监管机构尚未就使用监控技术评估员工表现时什么是可接受的提供指导。在法规跟上之前,雇主不得不缓慢而谨慎地对待工作场所的监控。告知员工将收集哪些数据以及收集的原因至关重要。更重要的是,员工能够选择退出监控计划,而不用担心失去福利或工作。

同样重要的是运行监控程序,这样员工自己也能从中受益。如果操作正确,并采用适当的游戏化策略,人工智能支持的员工绩效评估可以极大地影响工作满意度和敬业度。

最后,确保这些算法公平地评估性能是至关重要的。虽然似乎有无限的员工数据要收集,但需要一个经验丰富的数据科学团队来理解这些数据。这就是为什么这些计划的成功将与第三方供应商的专业知识密切相关。

虽然有些人可能会对这些迅速渗入我们现实的奥威尔式想法感到恐惧,但企业衡量、控制和影响员工绩效的欲望只会变得更强。虽然人工智能监控的新时代已经到来,但在企业和监管机构找到让这些举措变得公平和道德的方法之前,很可能还要经历几次失败。

数据科学的伦理

原文:https://towardsdatascience.com/the-ethics-of-data-science-55bcba9b4ecb?source=collection_archive---------16-----------------------

大数据:合理使用还是潜在侵犯隐私?

照片由弗兰克Unsplash 上拍摄

当想到数据科学时,您首先会想到的机制之一是大数据。但是,当你更多地考虑数据时,你可能会考虑存储的是什么类型的数据:全名、电子邮件地址、电话号码,甚至是某人的家庭地址。根据数据的具体程度,你甚至可以知道性别、年龄、职业等等。起初,我忽略了这种数据收集,以改善预测分析,甚至有针对性的营销。

我本周对数据科学的趋势搜索提出了数据收集和使用中涉及的道德问题。正如我说过的,有些人认为它被用来提高机器学习做出的智能猜测。然而,其他人认为存储的数据类型可能会侵犯隐私。所以,这是我想从两个角度看整个讨论的地方。首先,我想听听可能存在的潜在担忧。其次,我希望看到数据科学家试图解决这些问题的要点。

因此,在今天的文章中,我们将首先讨论使用或收集数据时的一些隐私问题,然后我们将讨论当您作为数据科学家在您的旅程中收集数据时保护他人隐私的几种方法。

用户同意

首要的隐私问题之一是用户是否同意获取数据。回想一下,第一部分将从用户的角度出发。例如,当你在一个网站上时,你的点击或购买可以被跟踪。或者你正在使用一个流行的应用程序,它利用你的浏览器历史来为你选择应用程序。尤其是在谈论敏感数据时,可能具体到信用卡号,也可能笼统到名字,您会想知道正在跟踪什么。

此外,您甚至可能想知道数据的用途。归根结底,这是你的数据和隐私,所以你会想知道什么信息被拿走了,为什么。

但是一些网站使得这些信息很难找到。如果网站提示您接受或拒绝 cookies,您通常需要单击另一个链接来查看正在跟踪的内容。它可能会让您选择决定哪些 cookies 可以跟踪,但浏览列表可能会花费更多的时间。

用户同意:解决方案

从数据科学家的角度来看,您已经知道您将跟踪什么信息以及获取数据背后的目的。但是你也需要获得用户的同意。对于一个网站,甚至一个应用程序,这可能很容易做到。“条款和条件”页面列出了你在网站/应用上执行的规则,但通过提供“接受 cookies”,用户可以选择是否允许你跟踪数据。有了这些 cookies 或者你的“服务条款”,你应该清楚地说明你到底追踪的是什么或者是什么意图。

用户同意:困境

你正在使用的应用程序或网站写了冗长的“服务条款”,详细说明他们跟踪的所有内容和你同意的内容,并详细说明在你接受这些内容之前 cookies 中跟踪了哪些信息。但是,作为用户,你也懒得看吗?尤其是当内容冗长时,你是否至少浏览了一下他们可能会跟踪的信息,或者你是否节省了自己的时间并接受了?不通读的不止你一个。许多用户没有时间或耐心阅读关于每一项的冗长、详细的报告。

这种安排的困境是,你可以添加所有的信息供用户阅读,但他们可能只是点击“接受 cookies”或“接受服务条款”,而从来没有真正阅读条款。那么,你的用户同意了吗?是的,也许是这样。但是,作为用户,这不是知情同意。

对被盗数据的隐私担忧

当您跟踪大量数据时,必须有一些地方来存储这些数据。通常,这是一个大型数据库。但是如果有人黑了那个数据库会怎么样呢?总会有隐私问题,即使有最好的安全团队,您仍可能有违规行为。

每隔一段时间,一家著名的航空公司会警告其用户,他们的数据库被黑客攻击,信用卡信息可能被盗。作为用户,你不得不担心你的信息被卖给错误的人,或者错误的人找到访问你的数据的方法。

避免数据失窃

作为一名数据科学家或任何从事安全甚至开发工作的人,您的目标应该是尽可能保证数据的安全。但是,事情有时确实会发生,所以尽快恢复并在需要的地方进行损害控制是你的工作。

虽然安全是解决办法,但它并不总是最简单的解决方案。但是,如果你打算获取用户数据,你必须确保像保护自己的数据一样保护它。

公平和算法的伦理

当一台机器在做决策时,你必须给它一些可供学习的数据。然而,在样本集里,不管有多大,你可能会发现自己偏爱某些组。例如,您的测试集可能包含不符合总体的人口统计数据。如果你检查一个街区,你可能会,或者你的机器学习模型可能会对人口做出不真实的假设。这可能会产生有偏见的算法。

我读过的一篇文章中有一个有偏算法的例子。在 Kylie Ying 的《数据科学伦理——什么可能出错以及如何避免出错》中,Staples 试图通过提供更便宜的价格和更好的交易来击败竞争对手。然而,根据他们的算法,这些更好的价格是在更富裕的社区中发现的,这意味着更富裕的社区将比一般的贫困社区获得更低的价格。

但是公平不仅仅是关于算法或者人口。公平也可以指数据的使用方式。道德包括如何使用或出售数据。例如,获取某人的敏感数据并将其出售给不可信方是不道德的。然而,向以销售为目标的公司出售通用的基于兴趣的数据不一定是不道德的。

根据数据集的不同,算法也可能遵循不同的假设。例如,在同一篇文章中,Kylie Ying 谈到她有一个关于算法的有争议作用的视频,该算法的任务是确定量刑和假释。在算法中,有一个反对黑人被告和它是如何有利于白人被告。这显示了算法中的种族差异。

让数据收集世界变得更美好

正如你所看到的,数据科学,即机器学习,更具体地说是数据收集,有一些灰色区域是不道德的。然而,有更多合乎道德的方法来处理它。第一是在收集数据时保持透明。这样,您的用户不仅知道您在收集什么数据,还知道您打算如何使用这些数据。接下来,保护隐私。尽可能保护好数据。就好像这是你的数据而不是用户的一样。在这两者中,你将需要小心地收集。考虑你需要什么数据,至于不要拿太多。考虑数据的上下文,因为它经常改变含义。最后,当然,融入包容性。这样,您的算法将找到尽可能小的偏差,因此您的数据也可以反映总体,而不仅仅是样本。

结论

今天,我们探讨了数据科学中的伦理世界。我们了解了一些不同的问题,包括透明度(知情同意)、安全性、差异(无论是种族还是性别),以及确保您的算法不包含偏见。在研究算法的同时,我们还研究了两个例子,它们是如何基于您的数据集而变得有偏差的。

虽然数据科学,特别是数据收集和机器学习,本质上并非不道德,但在深入研究之前,仍然有几个实践是你应该知道的。我当然觉得我学到了更多关于数据科学的道德规范,以及为什么会有更好的可见性。希望你也学到了一些东西,也希望你觉得这篇文章读起来很有趣。下次见,干杯!

用我的 每周简讯 免费阅读我的所有文章,谢谢!

想阅读介质上的所有文章?成为中等 成员 今天!

查看我最近的一些文章

https://medium.com/codex/quitting-kubernetes-kubeadm-and-switching-to-microk8s-b487e2abd482 https://miketechgame.medium.com/leaving-your-job-for-selfish-reasons-af1060ea51bf https://python.plainenglish.io/video-editing-with-python-73d419ba93ae https://medium.com/codex/kubernetes-vs-docker-swarm-d209e7cd58d7

参考资料:

https://datascienceethics.com/data-science-ethics-in-practice/#:~:text=Data Science Ethics in Practice 1 Protect Privacy.,7 Consider Context. ... 8 Encode Equity. https://www.freecodecamp.org/news/the-ethics-of-data-science/ https://datascience.stanford.edu/research/research-areas/ethics-and-data-science https://www.karmelsoft.com/ethical-challenges-of-big-data/

我们应该使用 Twitter 数据吗?

原文:https://towardsdatascience.com/the-ethics-with-twitter-data-b071af4b6b9b?source=collection_archive---------12-----------------------

而个人数据不是。

我们可以使用社交媒体数据进行研究,这并不意味着我们应该

介绍

这篇文章深入探讨了以下问题:

  • 知情同意——组织在不通知用户的情况下使用 Twitter 数据。
  • 匿名—用户的内容有很高的重新识别风险。
  • 撤销权—用户无法撤销擦除的数据。

Twitter 可以解决这些问题。学术界可以通过增加伦理审查程序来帮助开创先例。学术界可以鼓励将 Twitter 数据视为个人数据。

照片由布雷特·乔丹派克斯拍摄

使用 Twitter 数据

2021 年 3 月,我开始探索 Twitter 作为研究的数据来源。在整个过程中,我发现了作为仇恨犯罪证据的推文,其中包含裸体等内容。大多数演讲者不会热衷于在不知情的观众面前使用这些推文。中途发现有问题或令人震惊的推文的可能性如此之高,以至于我不得不添加一张警告幻灯片。

作为最近的研究方法电子节的一部分,我修改了这个演讲,重点是使用 Twitter 数据的道德问题。我问了与会者各种各样的问题,关于 Twitter 数据在各种场景中的使用。这篇文章将介绍我向与会者提出的问题。此外,我将探究 42 位与会者给出的答案。最后,我提供了我对这些结果的解释,并建议未来的工作。此演讲的完整录音可在此处获得。

这些结果带有严重的偏见。所有与会者都代表了一定水平的学术界。所有学者都熟知数据的道德使用,并了解数据隐私。一组类似的数据从业人员复制了这些结果。

这篇博文中使用的所有数据都可以在英国数据服务 Github 上获得。

使用 Twitter 数据可以吗?

场景 1 —“曼彻斯特大学正在研究仇恨言论与纯素食主义和植物性饮食之间的关系。你关于食物和素食主义的推文被刮了。”

在这种情况下,一名研究人员搜集了你的 Twitter 数据。使用 Twitter 的新学术 API 层,研究人员每月可以收集 1000 万条推文。在我思考之前,先考虑以下问题:

  • Twitter 的数据被学术界以这种方式刮掉可以吗?
  • 如果让您选择,您会同意收集您的数据并用于本次研究吗?
  • 如果曼彻斯特大学联系您感谢、告知或补偿您您的公共数据被用于本研究,您会作何感想?

问题 Twitter 数据可以这样使用吗?

这个场景为研究提供了一个“好”的理由。大多数与会者不会在推特上发布针对纯素食者的仇恨内容。社会鼓励个人在看起来不错的情况下“捐赠”他们的数据。当被问到时,许多人会提供这些数据,即使是私人的。拒绝在这里分享你的数据可能暗示你有所隐瞒。你有什么要隐瞒的吗?如果你做了,你会改变你的答案吗?

我们可以在下面看到,许多用户认为这是对公共数据的一种可接受的使用。有些人不确定,很少有人反对这个想法。

问题 2——给你一个选择,你会同意在场景 1 中使用你的 Twitter 数据吗?

在这里,我向与会者提供我们的研究知情同意的选择。这不是用户目前拥有的选项。在这里,任何不确定道德的人都同意捐赠他们的数据。尽管如此,有些人还是会拒绝这种“捐赠”。如果这是任何其他个人数据来源,我们不会在未经同意的情况下获取这些用户的数据。

问题 3——如果一个学术机构向你表示感谢、提供信息或补偿你在场景 1 中的公开数据,你会有什么感觉?

这里我们观察到一个现象。我们给 Twitter 用户一种错觉,认为他们的内容只是以他们想要的方式被观察到。对于无声刮痧,我们假定知情同意。当我们联系用户通知他们时,他们会感到不舒服。一些用户对其数据的使用了如指掌,但“不希望被联系”。大多数人对这种接触感到困惑。

一位用户称,这将取决于“我是否说过任何有争议的话”。这提出了一个奇妙的观点。在发微博的时候,我们都认为我们在说正确的事情。我们也可能得到社区的大力支持。学术研究或商业产品不是推特的最终目标。在我的演讲中,我强调了一条推特是推特上对素食主义最负面的看法。我怀疑用户想要这样,但他们没有选择。我相信更糟糕的事情正在发生。

随着时间的推移,我们是否如此大胆地说我们将永远站在所有问题的正确一边?

场景 2——一家大型科技公司搜集了 Twitter 上关于你去过的地方、在那里呆了多长时间以及访问频率的数据。他们利用这些数据来描述你,并向你投放有效的基于位置的广告。

在这种情况下,你的数据是被行业为了利润而搜集的。在我思考之前,先考虑以下问题:

  • 推特数据这样用可以吗?
  • 如果让您选择,您会同意将您的数据用于本次研究吗?
  • 如果在场景 2 中,一家企业向你伸出援手,感谢、告知或补偿你的公开数据,你会有什么感觉?

在这里,我希望展示 Twitter 数据的相反用途。这是行业对公共数据的巨大滥用。支持场景 1 的方法也支持场景 2。推文的内容会影响用户的同意。进行刮擦的组织的意图也影响给予的同意。

问题 4——这样使用 Twitter 数据可以吗?

给定一个新的、邪恶的例子,我们再问一次,这是否是一个可以接受的使用公共 Twitter 数据的案例。一些用户坚信这些数据是公开的,因此任何人都可以使用。大多数用户不喜欢使用 Twitter 数据,尽管这是所有主要社交媒体赚钱的方式。

Q5。如果可以选择,你会同意在场景 2 中使用你的 Twitter 数据吗?

同样,我提供了一个我们可以控制数据的假想场景。如果没有“捐赠”我们数据的压力,这就变得类似于盗窃。组织将公开的 Twitter 数据货币化,而不补偿用户。用户不喜欢这样,最终产品寻求操纵用户。一般与会者不会同意使用 Twitter 数据。

我们必须记住,用户是这些社交媒体的产品。这项服务是免费的。我想问的一个后续问题是“你会付费使用 Twitter 吗?”。这些矛盾在关注时会变得不舒服。这是缺乏知情同意的症状吗?

Q6。如果在场景 2 中,一家企业向你伸出援手,感谢、告知或补偿你的公开数据,你会有什么感觉?

与会者讨厌这个问题。大多数用户报告感觉“被激怒”、“生气”、“被监视”以及类似的情况。GDPR 现在在这种情况下保护用户。该行业将收集用户数据来预测股票价格、政治结果等。他们只是默默地做。

道德和责任

这就结束了我们对场景的关注。我现在将深入探讨为什么 Twitter 数据是个人数据,为什么这是令人担忧的,以及我们可以做些什么。

问题 7——当 Twitter 数据被用于学术研究时,我们是否应该告知每个用户他们的数据被收集了?

在涉及个人数据的传统研究中,我们知道要寻求参与者的知情同意。我们还赋予这些用户随时撤销其数据的权利。在 Twitter 的数据中,似乎大量的推文提供了匿名的基线。

不联系这些用户,我们无法提供知情同意。当我们联系用户给出这个选项时,我们让他们不舒服。我们还在观察中偏向我们的研究,只接受来自同意的用户的数据。大多数与会者都知道,在这种情况下,通知 Twitter 用户是违反 GDPR 的。

Q8。用 Twitter 数据进行的研究应该要求伦理审查吗?

所有英国大学都要求伦理审查批准使用个人数据的研究。一些大学表示,Twitter 数据需要进行伦理审查。这是学术界的第一步。在这个问题中,我试图检查与会者对此的反应,不知道过程。

大多数与会者认为,社交媒体数据应该需要进行伦理审查。

Q9。所有大学都要求对个人数据和相关研究进行伦理审查。推文中的文字是个人数据吗?

带着这个问题,我明确表示,个人数据要接受伦理审查。我介绍了一条推文既是公开数据又是受保护的个人数据的悖论。谷歌搜索大多数推文会让你回到实时推文。这意味着文本本身就足以重新识别用户。

与会者认识到了我们对个人数据的定义中这种边缘情况的细微差别。重新鉴定的风险很高,但是数据是公开的。这里的正确答案取决于推文。这还取决于谁在收集数据,以及他们为什么想要这些数据。

谁负责解决这个问题?

Q10。在确保 Twitter 用户及其数据的安全方面,以下每个组织的责任有多大?

对这些论点的一个常见反驳是,父母和学校有责任抚养孩子。数字卫生现在是许多学校课程的一部分。另一个观点是,政府应该干预和管理不道德使用数据的企业。政府可以引入数据保护立法。我想知道我的与会者认为每个小组对 Twitter 数据的安全性有多负责:

  • 双亲
  • 学校
  • 用户
  • 推特
  • 政府
  • 学术机构
  • 工业

每次我进行这项调查时,我都发现大部分责任在于 Twitter 本身。他们是唯一能够追踪他们收集的数据的人。他们最有能力向学术界提供知情同意和被遗忘的权利。

与会者认为家长和学校的责任最小。许多人觉得他们没有责任。Twitter 用户的平均年龄在 25 岁或以上,不太可能是儿童。我们希望这些群体能够为下一代社交媒体用户做好准备。我们无法理解这一代人将在网上面临的风险。

与会者非常强调用户要对自己的数据使用负责。我称之为“你应该更清楚”的论点。我们要求用户了解他们的数据将如何被滥用,但他们并不知道。这看起来很简单。不要发不敏感的东西。我们无法预测下一个不敏感的趋势。那么我们怎么能期待未来的完美呢?用户一般不会看各个平台的条款。Twitter 用来教育用户的方法不起作用。

与会者对政府的责任有各种各样的意见。政府有能力执行和立法来保护推特用户。我们需要的数据保护通常需要几年时间。我们还需要一些未受保护数据的后果,以增加紧迫性。这一切来得太晚了,但必须来。

利用 Twitter 数据的企业可以资助 Twitter 的发展,以更好地利用数据。然而,这里存在利益冲突,企业通常希望以最便宜的价格获得尽可能多的数据。虽然可能会有一些进步的企业质疑这些数据的道德性,但通常情况并非如此。

学术界可以鼓励更好地利用社交媒体数据。一个快速的胜利将是对社交媒体数据进行伦理审查的要求。这开始了在收集的社交媒体数据中保护用户的过程。Twitter 需要更新他们向学术界提供的服务,以解决剩下的问题。学术层显示他们正在考虑学术界,但还需要做更多的工作。我担心 Twitter 认为这是一种社会公益“捐赠”数据,以抵消其他领域的滥用。

Q11。个人应该有被遗忘的权利吗?

学者们知道个人应该有权撤销他们的数据。GDPR 增加了一些权力,让个人有权从数据集中删除他们的公共信息。

当一个组织抓取用户的内容时,Twitter 不会通知用户。这里没有责任,用户没有办法撤销他们的同意。用户可以删除或隐藏他们的帐户,但这并不能追溯保护他们。

Q12。Twitter 是一个好的研究来源吗?

最后,与会者一致认为 Twitter 是一个很好的研究数据来源。这个问题遗漏了一条关于 Twitter 数据偏见的免责声明。每个社交媒体平台在选择使用它的用户中呈现出自己的偏见。Twitter 用户并不代表无法访问互联网的个人。推特用户一般是 25-34 岁的美国男性。如果我们以此为基础制定政策,我们需要澄清这种偏见。我们也可以采取措施,在我们的推文抽样中减少这种偏见。

我们应该在研究中使用 Twitter 数据吗?

我们应该可以使用 Twitter 数据。

一个主要论点是,这些数据已经公开,因此保护是多余的。许多社交媒体平台的目的是让尽可能多的人看到你的内容。这才是重点。说用户不理解这一点可能看起来很可笑。

我们也认为发布危害性内容的用户应该更清楚。如果你不想因为张贴种族主义、性别歧视或同性恋恐惧症的东西而惹上麻烦,就不要张贴。

这个数据集很有价值。任何用户都可以衡量公众对他们自己、一个政党、股价等的看法。为什么因为一个小小的隐私问题而忽略如此强大的数据集呢?

最后,由于这是公共数据,我们不再必须处理 GDPR 或未来的数据立法。

我们不应该使用推特数据。

通过一些干预,我认为我们可以合乎道德地使用这些数据。

社交媒体旨在分享内容。尽管如此,并不是所有的 Twitter 用户都希望他们的内容被所有人看到。同意数据滥用不是默认。请考虑以下情况:

  • 孩子们明白他们的数据将如何被使用吗?
  • 成年人了解他们的数据将如何被使用吗?
  • 是否所有用户都预期机器学习将使他们从数据中获得洞察力?
  • 所有用户都预料到这可能导致定向广告和政治操纵吗?
  • 所有用户都相信我们不会找到更强大的方法来滥用这些数据吗?
  • 所有用户都觉得他们的历史推文不包含过时的观点吗?

在一项学术研究中,根据 GDPR 法案,我们必须征得同意才能使用 Twitter 数据。许多用户希望他们的追随者看到他们的内容。一些用户可能希望这个圈子之外的人看不到他们的内容。这是一个未被充分利用的选项,而且它是可用的。如果我们主动联系用户,告知他们数据的使用情况,许多人会感到不安。推文的背景、组织和抓取的目的都会影响这种不安。

由于最初的 Twitter 内容通常是独一无二的,它也可以识别个人。在任何研究中,我们都努力将参与者重新识别的风险降至最低。这里的理由可能是数据是公开的。有没有可能公开和被观察是不同的意思?

最后,在传统研究中,我们会让所有用户能够随时撤销他们的数据。当数据源是社交媒体时,我们不提供此选项。如果我们有,即使通知用户我们有他们的数据也会让他们不舒服。一个学者一个月可以发 1000 万条推文。每隔几天删除数千个被撤销的数据点并不是一件简单的工作。怎么才能给用户提现的权利?这里谁负责?

结论

至此,曼彻斯特大学发布了“超过 500 篇利用 Twitter 的出版作品”。我们改变这一切是否已经太晚了?

华威大学已经决定需要进行伦理审查。在某些情况下,利用社交媒体的项目需要伦理审查。

“适用于公开数据的豁免并不自动适用于社交媒体数据”

关于 Twitter 数据,我们需要解决以下问题:

  • 知情同意——用户不知道他们的内容被抓取的频率,也不知道这些内容被用于什么目的。试图通知用户导致厌恶。Twitter 有能力解决这个问题。
  • 匿名——任何用户都可以窃取姓名、位置和其他受保护的特征。用户可以通过谷歌搜索该推文的内容来重新识别该推文。我们可以很快提供文本数据的统计披露控制,以保护匿名性。
  • 撤销的权利——由于用户没有被告知,他们不知道他们需要撤销什么。如果他们可以退出,在攫取了数百万用户后,研究人员将如何管理这一点?Twitter 有能力解决这个问题。
  • 伦理审查——大学应该站出来,接受社交媒体数据需要某种形式的保护。对社交媒体数据进行伦理审查是这一过程的第一步。

谢谢,如果您有任何问题,请随时通过Joseph . Allen @ Manchester . AC . uk@JosephAllen1234 联系我。

AI 的进化——在下一次大灭绝中幸存所需的 3 个特征

原文:https://towardsdatascience.com/the-evolution-of-ai-plus-3-traits-needed-to-survive-the-next-mass-extinction-5173f48c6c7a?source=collection_archive---------29-----------------------

意见

如何在 MLOps 时代导航并脱颖而出

图片由 Domino 数据实验室提供

技术的进化,很像我们星球上生命的进化,其特点是稳步前进,偶尔夹杂着大规模灭绝和创新生命的爆发。我们很幸运地经历了一个进化的转折点。数据科学和人工智能领域的创新比比皆是,已经在改变商业和生活的本质。随着技术的繁荣,那些没有获得新时代生存特征的组织将面临真正的风险。

许多高管和分析专家对这一过程将把我们带向何方缺乏远见。他们对我们生活的这个时代的定义,我们称之为 MLOps 时代,是有局限性的。这导致他们固守技术并采用限制他们在新市场竞争能力的流程(进化意义上的特征)。企业人工智能的下一个进化时代会是怎样的?最先到达的人会发现自己处于食物链的顶端。在本帖中,我们提供了 MLOps 的定义,并讨论了顶级分析企业是如何超越我们当前的时代而发展的。我们洞察了下一个时代将会是什么样子,更重要的是,什么样的组织将会生存和发展。

MLOps 时代

随着 2021 年的开始,数据科学、人工智能和人工智能行业目前正处于 MLOps 时代的早期。这是一个建立在过去创新基础上的激动人心的进步。它寻求解决将更多数据科学产品投入生产的最后一英里问题——将 ML 和 AI 投入运营。它承诺模块化和可重用的组件来满足这一目的。它采用了 DevOps 和软件工程(如 CI/CD 方法)的原理,并经过修改以适应数据科学工作的需要。它强调干净的数据管道来支持操作化过程。重要的是,MLOps 时代的每个方面都在经历向云工作负载的过渡。注意这个时代强调的数据科学生命周期的各个阶段是很有帮助的。它们是验证、部署和监控阶段。

数据科学生命周期

图片由 Domino 数据实验室提供

这是 MLOps 时代的普遍观点,但我们还处于这个时代的早期,在过渡到下一个大事件之前还有工作要做。特别是,我们将看到学术界和工业界对完善数据科学生命周期的验证和监控方面的关注。

验证工作目前领先于监测工作。学术界发表了大量关于模型的可解释性、伦理和偏见的研究。业界正在将这些想法转化为当今领先组织使用的工具和流程。还有很多工作要做,等我们离开这个时代,模型验证会成熟很多。

说到模型监控,学术界是后来者。这在一定程度上是因为,至少从学术意义上来说,这是一个已经解决的问题。然而,对于将已知的监控原则应用于生产模型的最佳方式,我们还有许多未解的问题。即使建立了最佳实践,实施也不是微不足道的;为了在 MLOps 意义上有效,它必须完成反馈循环以重新训练或完全重建模型。在模型监控有一个坚实的基础之前,学术界和工业界都有工作要做,但他们将在这个时代结束时到达那里。

MLOps 时代的当前和未来

MLOps 时代的当前焦点

  • 操作化
  • 模块化和可重复使用的组件
  • DevOps 和应用于数据科学的软件工程原理
  • 数据完整性
  • CI/CD(持续集成和持续交付或部署)
  • 功能模型验证
  • 功能模型监控
  • 云工作负载趋势

MLOps 时代的未来焦点

  • 模型验证将扩展到包括可解释性和伦理
  • 模型监测将利用统计学原理,并与研究过程相结合,完成反馈循环

未知的未来

尽管围绕 MLOps 投入了大量精力和讨论,但 MLOps 仍然是生命周期的“生产”部分。MLOps 要求我们找出复杂的 API,并将服务和技术缝合在一起。MLOps 是关于如何做的。这个未来的未命名时代将把 MLOps 时代的一些相同原则应用于“R&D”的一半生命周期。那时,我们将进入一个以规模效益为特征的新时代。

正如一位已经在为未来时代做准备的前瞻性数据科学领导者所说,

“十年前,数据是我们的竞争优势。然后是我们的模特。今天是我们的过程。”

有了 MLOps 时代的工具,下一个时代将是流程时代。这并不意味着技术不会发挥作用。创新将帮助领导者和团队运营数据科学生命周期的剩余部分。我们不是在谈论 auto-ML 或数据科学的简单按钮。这是关于标准化的。实施生命周期的构思、分析和开发阶段意味着提供获取和共享机构分析知识的工具。这意味着提供一种自动跟踪研究并通过点击一个按钮来复制它的方法。它与数据科学组合管理和建立需求层次有很大关系。它将关注数据科学项目管理。它的特点是全面的资产管理,从模型到数据集到图像以及其间的所有东西。它包括跟踪数据产品的商业价值。简而言之,这是关于强调数据科学中的科学——提供结构,以便团队可以像一组协作研究科学家一样运作。

未来时代——是关于过程的时代

  • 数据科学是真正的企业能力
  • 机构知识管理
  • 再现性
  • 在整个生命周期中优化研究团队的工作流程
  • 分析专业人员的协作
  • 利用有限的资源和巨大的人才缺口实现商业价值最大化
  • 记录系统
  • 自上而下的投资组合视图
  • 项目管理

在下一次大灭绝中幸存下来所需的特征

基于对当前时代结束时 MLOps 将会是什么样子以及下一个时代将会带来什么的愿景,我们看到了组织和公司为了在下一个时代生存和发展而必须发展的三个强大特征。有些已经在开发了。

未来时代的特征

  1. 生命周期管理
  2. 知识管理
  3. 证券管理

生命周期管理将是在我们当前的时代,即 MLOps 时代有效适应的组织的最终状态。它利用 MLOps 的原则和工具,作为优化将模型投入生产的过程的手段。它建立了一个组织,将这些原则扩展到整个生命周期中的研究团队。

知识管理依赖于定义良好的数据科学工作记录策略系统。这将通过技术——具体来说是数据科学平台——成为可能,但也需要领导层在不扼杀创造力的同时实现工作标准化。知识管理系统将成为分析突破的灵感火花。它将对数据科学团队创造的价值产生复合效应。

最后,那些采用有效的项目组合管理策略的人,在工具的支持下,将最终实现他们的需求层次,而不是今天数据科学项目工作的自下而上的方法。所有领导,从团队领导到最高管理层,都将了解数据科学项目和研究。追踪商业价值将成为现实。组织的分析引擎将最终开始全速运转。

后续步骤

组织应该拥抱当前的 MLOps 时代,同时为下一个时代奠定基础。拥抱今天的可操作性思维。建造管道。投资合适的人才。同时,开始试验分析研究的标准化。开始思考和测试知识管理原则和工具。了解你的分析组合,它来自哪里,以及如何管理它。现在采取这些步骤将是在未来十年的分析发展中取胜的关键。

企业知识图和 CNS 的演化

原文:https://towardsdatascience.com/the-evolution-of-enterprise-knowledge-graphs-and-the-cns-9c57a0513ecd?source=collection_archive---------39-----------------------

中枢神经系统的三个例子:海绵、章鱼和人脑。企业知识图会像人脑一样进化出专门的结构吗?作者的作品。

这个博客将推测企业知识图(EKG)将如何发展以包含专门的功能和专门的子图。我们将使用原始生命形式中中枢神经系统(CNS)进化的隐喻来提出一些关于建筑权衡分析的关键点。

如果心电图真的要成为组织的集中“大脑”,它们将需要从现在的位置发展到承担新的角色。我们还需要理解依赖组织的集中控制所面临的挑战。

EKG 和中枢神经系统隐喻:海绵、章鱼和人脑

我们将使用生物体中枢神经系统的比喻来讨论心电图是如何演变的。这需要我们观察生物体进化出不同类型神经系统的不同方式,以及这些方式在适应新环境中的重要性。

让我们从海绵开始。它没有真正的中枢神经系统。海绵中使用电化学信号交换信息的神经元没有细胞类型特化。海绵有同质的 T4 细胞,它们利用化学信号进行交流,但它们速度缓慢,并且均匀地分布在海绵的全身。

这种分散设计有一些优点。你可以把一块海绵切成两半,两部分都能存活。简单的设计更容易维护,单点故障更少。

当我们想到“海绵信息架构”时,我们可以想象许多小的部门子图、数据库和电子表格是不相连的。它们都是一个企业中的一个个信息“细胞”孤岛,并不实时沟通。然而,你通常可以通过出售业务部门来重组你的公司,它将继续运作而不会影响到个人团队的表现。

接下来,考虑一下章鱼。虽然章鱼有神经元和一个中央大脑,但超过一半的神经元也分布在章鱼的每个四肢上。章鱼在中央大脑中为运动做总体规划,但它们允许复杂的肢体运动细节在每个肢体本身的神经元中完成。

“octopus 信息架构”对 EKG 有一些集中的作用,但它不在每个业务单元内执行详细的预测性业务规划。从技术上讲,我们称之为半集中式 EKG 架构。EKG 仍然有专门的子图,但是它们需要被设计成将抽象概念发送到部门图,在部门图中完成执行细节。

最后,考虑人类的大脑。我们的大脑具有高度集中的神经系统,无论是大规模的身体运动规划还是精细的运动控制都是在颅骨内进行的。我们的眼睛处理图像并将数据发送到我们的视觉皮层,独立的大脑区域协调我们四肢的预测运动。然而,我们并没有将运动规划委托给我们肢体内的神经元。我们的大脑确实有许多高度专业化的区域来执行不同的功能。

人类大脑显示了低水平的同质细胞类型(神经元),但在大脑的数千个子区域中,连接模式具有高水平的多样性。

我相信不同的组织也会根据他们所处的环境演化出不同风格的心电图。就像不同类型的中枢神经系统进化的方式一样,不同类型的心电图也将以同样的方式进化,以满足不同类型组织的需求。EKG 也将遵循与中枢神经系统进化相似的进化路径。它们会从简单开始,慢慢进化出更加复杂和专业化的结构。我还相信,拥有集中心电图的大型组织将会主宰公司,就像人类主宰地球上的生命一样。

复杂性是有代价的

复杂性总是伴随着一些代价。当今生活世界中的许多植物和动物的例子都保持了它们的简单组织。因为这种简单,他们兴旺发达。像键值存储这样的数据存储是保持数据存储及其接口简单以便更容易横向扩展的很好的例子。不幸的是,这种简单性也阻止了我们有效地对键值存储进行复杂的查询。

非线性进化过程

进化通常不会沿着一条直线进行。它以波的形式出现,由特征的关键排列触发。导致心电图多样性迅速扩大的关键特征是什么?作者的作品。

大多数人都知道寒武纪大爆发的概念。寒武纪大爆发发生在大约 5.41 亿年前,当时海洋生物很原始——很像海绵。在寒武纪大爆发之前,生命形式相对简单,不会随时间快速变化。寒武纪大爆发后,我们既有动物多样性的快速进化和巨大增长。

寒武纪大爆发是一个非线性进化系统的例子。如果我们绘制不同种类动物的数量随时间的变化曲线,它不会是一条直线。那么,大多数进化的系统是否表现得像复杂系统。心电图也将遵循许多复杂系统的规则,并显示由关键事件触发的非线性增长模式,如 GQL 标准和图形硬件的到来。

早期生命形式和中枢神经系统的进化

但是中枢神经系统是如何进化的呢?为什么增长是非线性的?

与等待食物到来的植物不同,一些早期的生命形式更加灵活。他们搬到有食物的地方,后来,他们还需要学会捕捉猎物,远离捕食者。所以为了捕捉猎物或躲避捕食者,它们需要肌肉。

与静止的海绵不同,水母会四处移动。水母动物的全身都分布着神经网络。他们还没有表现出任何中枢神经系统的迹象。中枢神经系统进化的关键步骤是身体计划的头部化。这个过程围绕着一个双边身体计划来组织身体部位。

理想化的双侧身体平面是一个圆柱体,圆形和纵向肌肉围绕着中央肠道排列。感觉器官被放置在靠近肠口的头端。来源:维基共享。

一旦围绕肠道的基本身体结构进化,扩张和收缩的特殊组织就变成了肌肉。感觉器官出现在肠口周围。现在问题来了——我们如何协调感官和肌肉?这种协调应该是分布式的还是集中式的?

水母走的是去中心化路线。他们保持简单的身体结构,将感觉器官放在身体结构的顶端或边缘,他们从未进化出内脏和两侧对称。

但是双边贸易采取了不同的路线。他们采用了一种特定的身体结构,发现中央神经系统可以协调感官和肌肉。

今天,分布式本地标记属性图显然相当于双边身体计划。它拥有我们建设一个可扩展和可持续发展的 EKG 所需的所有关键建筑特征。对于其他图形数据库架构来说,仍然会有合适的环境。但我们现在有了一个架构,它将引发图形数据库中的“寒武纪大爆发”,为未来的心电图提供动力。

最佳实践的演变

一旦基本的身体计划得到发展,就可以在该身体计划的基础上建立一套最佳实践。这里有一个体腔身体计划的例子,它在中央肠道周围有更复杂的结构。来源:维基共享。

多样化的环境加速进化

想象一下,整个地球是一个均匀的浅海。海洋深度没有变化,也没有陆地。如果是这样的话,我们今天就不会看到如此多样的生命形式了。因为地球提供了不均匀的生态景观,我们得到了更多的生命形式的多样性。

心电图的演变也是如此。组织不是同质的。他们为不同行业和不同类型的客户提供各种各样的产品和服务。由于这种多样性,我们应该期望看到心电图在它们的一些结构中多样化。

软件同质性允许硬件优化

这里有一个与多样性观察相反的想法。如果有成千上万个不同的数据库,没有哪个供应商会花十亿美元来为一个架构优化硅硬件。但是分布式本地标记属性图(DNLPGs)的发展已经将焦点集中在一个单一的架构上——使用希望遍历关系的指针。由于几乎所有现代企业知识图都使用 NLPGs,我们开始看到针对这些数据库的硬件优化。

这意味着任何其他不利用 DNLPGs 的数据库在性能上会有 1,000 倍的下降。这意味着进化的力量将迫使这些非 DNLPG 系统关注性能以外的其他领域。如果他们不这样做,适者生存的法则将把他们从数据库市场中淘汰。

是的,这些规则有些矛盾。但是,当我们试图想象心电图将如何演变时,我们需要把它们都记在脑子里。

专门的大脑区域

宇宙中最不可思议的事情之一是大脑如何采用单一结构,即神经元,并使用相同的结构在大脑中建立令人难以置信的各种更复杂的结构。人类大脑有数千个不同的区域,这些区域在超过 5 亿年的进化过程中已经形成了专门化。我们可以期待心电图发展出高度专门化的区域,但仍然使用共同的结构:具有属性的顶点和边。下面是一些可能发展起来的特殊子图:

  1. 地理位置 —地址、城市、州和地区等地点信息。
  2. 访问控制(安全)——将用户与其角色和权限相关联。
  3. 客户知识 —所有客户接触点,包括网络访问、电子邮件、购买、退货和产品评论。
  4. 产品知识 —关于产品、规格、保修、产品分类、类似产品和竞争对手产品的详细知识。
  5. 一般语言知识 —描述单词、词义、同义词、首字母缩写词、缩略语、相关单词和定义的结构。
  6. 业务术语 —特定于您的组织和行业的术语。可能包含您所在领域常用词的专门定义。
  7. 数据转换知识 —原始数据如何转换为关联知识。包括模式匹配、模式映射、数据格式转换和数据质量检查的规则。
  8. 数据线性知识-数据是如何到达 EKG 的?它从何而来,又是如何转化的。数据与特定任务的相关性有多高?
  9. 业务规则知识 e —在 EKG 中,确定性业务规则是如何存储和执行的?人们如何查看和更新规则?一个高层次的规则被改变的下游后果是什么?
  10. 报告知识——报告是如何产生的。数据是从哪里来的?报告多久运行一次,由哪些代理运行?运行报告的成本是多少?谁创建并维护报告?与任何给定报告最相似的报告是什么?
  11. 因果关系知识 —各种商业事件的起因是什么?我们能解释客户体验问题的根本原因吗?可以看到模拟选择以预测未来成本?

大脑和头骨:保护你的 EKG

随着中枢神经系统变得越来越复杂,它们开始成为动物的单点故障。对未受保护的大脑的打击会很快使动物失去知觉,容易受到捕食者的攻击。

如果章鱼的一个肢体失去了部分分散的大脑,它仍然可以存活,甚至长出新的肢体。同样,部门数据集市可能会崩溃,但不会影响您的客户体验。

那么,如何保护我们的客户体验依赖于其全天候可用性的中心资源呢?我们如何在 EKG 周围构建一个“骷髅”,以确保它具有高可用性?使用具有高复制级别的分布式图形数据库是一种解决方案。但是保护您的 EKG 免受粗略查询也很重要。

几年前,我的一个朋友参与了一个项目,该项目使用一个新的开源查询程序来简化数据湖中低级数据的查询。问题是该软件不能限制任何查询的资源,如 CPU 时间、内存或 IO。因此,查询中的一个小错误会导致整个数据湖不可用,直到查询完成或集群中的每个节点都重新启动。不用说,即使在大量投资之后,这个项目还是停止了。细粒度企业级资源控制的核心属性尚未形成。

总之,心电图不仅需要精细的访问控制,还需要内部控制来保护实时服务不受干扰。

结论:让 EKG 爆炸开始吧

我们现在正处于几个强大的力量在不同类型的心电图中产生爆炸的阶段:

  1. 一种标准化的数据模型——标记属性图(LPG)
  2. 一个横向扩展架构 —分布式本机 lpg
  3. 一种标准的查询语言-图形查询语言(GQL)
  4. 硬件针对分布式本地 lpg 的指针跳跃和随机访问模式进行了优化
  5. 支持企业问题的软件(高可用性、安全性等)。)
  6. 集成图形-机器学习软件,自动预测未来事件并提出建议

因此,我预计几年后,我们将会看到像寒武纪大爆发末期的动物类型一样多样的心电图。随着心电图演变出更复杂的功能,我们还将看到更古老、更原始的关系架构的衰落。

请注意,关系数据库和电子表格不会消失。世界上仍然有海绵,因为它们简单的设计有好处。但是海绵并不主宰我们的星球。拥抱心电图多样性和复杂性的组织注定要比那些坚持简单设计的组织控制更多的资源。

面部识别的演变——深度学习转型的案例研究

原文:https://towardsdatascience.com/the-evolution-of-facial-recognition-a-case-study-in-the-transformation-of-deep-learning-73a738fcce67?source=collection_archive---------25-----------------------

来源: Unsplash

人类领域的知识不再有用

机器学习经常被描述为对“创造算法的算法”的研究。在一定程度上,这是正确的——机器学习会找到最佳模型来拟合数据。正是通过这个过程,我们获得了可以对数据进行预测的算法。

然而,这种描述有点不对劲:它抹去了人类特定任务的参与。在现实中,人类在确保机器学习算法与给定数据一起工作方面发挥着重要作用。例如,人类知道 x 算法不适用于共线特征,所以他们执行某种预处理来消除它们。

甚至更进一步,很多机器学习算法都布满了人类的手印。他们都有某种偏见(不是统计意义上的)以某种方式或另一种方式学习。机器学习算法需要精心挑选,以便它们的偏差能够很好地处理给定的数据。

尽管没有免费的午餐定理为“万能学习者”的不可能性提供了理论上的吸引力,但深度学习是朝着这个方向迈出的一大步。如果你愿意,神经网络是“创造机器学习算法的算法”深度学习与机器学习的区别在于其模型的大规模参数化。

因此,深度学习模型不仅比机器学习模型更强大,而且在不同的背景下更具普遍性。一些“模板模型”如 EfficientNet 或 ResNet 可以满足各种各样的图像识别环境,从 X 射线诊断到数字识别。因此,深度学习需要更少的数据预处理。

深度学习隐含着人类的知识没有用。对人类来说,让优化器在损失场景中自由活动并发展自己的学习比人类强加人类约束更好。

面部识别是一个特别有趣的问题,因为似乎与“人类知识无用”的假设相反,人类可以“帮助”深度学习模型。至关重要的是,人脸的结构在所有图像中都是一致的,细微的差异很重要。

人类对人脸了解很多,一个模特从一些人类的支持中受益似乎是唯一合理的。

脸书的面部识别模型 DeepFace 利用人类对数据集和任务的知识开发了一个多步管道。

  1. 在图像/人脸裁剪中检测人脸。这个步骤从图像中去除任意的背景,这样人脸本身就是识别的对象。
  2. 识别面部标志。这在视觉上相当于把一个“网”放在脸上;识别对应于各种面部标志如前额或鼻子中心的几个点。
  3. 临街。使用这些数据点,脸部被“扭曲”,使得人面向前方。也就是说,如果两个不同的人看向不同的方向,他们可能会看起来不同,所以这种校正有助于进一步突出身份的潜在差异。
  4. 将预处理后的人脸传入神经网络。一旦面部被对齐和调整,它就被传递到神经网络中进行分类。

来源:深面纸

尤其是在当前,这条管道的范围之广可能令人惊讶。面部检测、地标识别和正面化的前三个步骤不是微不足道的步骤。此外,还有许多人类假设,例如:

  • 面部检测算法不会模糊重要的特征,如下巴的底部或额头的尖端。
  • 临街化有助于模型。
  • 临街化不会模糊或扭曲重要的特征。

然而,DeepFace 是在深度学习迅速崛起的早期构思的。此前,更多传统的机器学习算法,如线性判别分析和支持向量机被采用。DeepFace 在面部识别方面接近人类的表现,并在计算机准确性方面取得了令人印象深刻的进步。

与以前的算法相比,在特定面部识别数据集上的准确度有了令人印象深刻的提高。来源: DeepFace paper

2015 年,在 DeepFace 发布后不久,谷歌发布了面部识别开发产品 FaceNet。它与 DeepFace 的根本区别在于,一个卷积神经网络用于整个端到端过程,而不是几个。

FaceNet 接受了关于三重缺失的培训。也就是说,网络被输入三幅图像——两幅来自人 A,一幅来自人 b。其目标是使人 A 的两幅图像之间的距离最小化,并使人 A 的图像和人 b 的图像之间的差异最大化

最小化锚和正片之间的距离;最大化锚和底片之间的距离。来源: FaceNet 论文

通过从不同角度收集大量数据并照明,这种三重损失的发展将来自 DeepFace 的误差减少了七倍以上。FaceNet 对姿势、光照甚至年龄都是不变的。此外,除了人脸裁剪之外,FaceNet 不需要任何预处理,也不会从中受益。正如作者所写的,

“我们的端到端培训不仅简化了设置,还表明直接优化与手头任务相关的损失可以提高绩效。”

人类将复杂的任务分成更小的步骤,已经变得不如一个端到端的深度学习模型有效。

我们可以这样理解人脸识别方法的变化。可以认为是“为模型赋能”。

  • 减少对模型本身的约束。将图像识别的任务分解为如何进行面部识别的非常人性化的概念是该模型的一个限制。
  • 阐明模型的目的。也就是说,它不是改变模型本身来满足我们的需求,而是以某种方式引导,使得对数据的理解更加清晰。

这可以被认为是从“人类领导模型”到“模型领导人类”的转变。

同样,这导致应用程序的通用性增加。DeepFace 只能应用于面,因为它依赖于特定于面的管道。另一方面,FaceNet 可以应用于任何识别问题。

然而,FaceNet 是在 2015 年构思的——就深度学习发展而言,相当于过去相当长的时间。然而,自那以后,这种端到端开发和调整目标的趋势,以及模型本身的形状,一直在继续。

例如,最近提出的暹罗网络比较两幅图像,并返回它们是否属于同一类。当每个人的样本非常少时,它在大规模图像识别系统中特别有效。

暹罗网络架构。

在深度学习的未来,我们可以进一步期待“为模型赋能”的努力。人类领域知识继续停止提供帮助,模型将继续在各种环境中增加通用性。

越来越多的,我们看到模型不是任意分离的,而是进一步相互联系的。对预处理和后处理的依赖减少了,取而代之的是更大的信任,即给定任务的正确框架,模型可以比任何人走得更远。

感谢阅读!

如果你喜欢这篇文章,你可能会喜欢相关的文章。

所有数字均由作者创作,除非另有说明。

自然语言处理中标记化的演变——自然语言处理中的字节对编码

原文:https://towardsdatascience.com/the-evolution-of-tokenization-in-nlp-byte-pair-encoding-in-nlp-d7621b9c1186?source=collection_archive---------21-----------------------

不同标记化算法介绍

作者图片

NLP 可能对人工智能的顿悟来说有点晚,但它正在与 Google 这样的组织一起创造奇迹,OpenAI 分别发布了最先进的(SOTA)语言模型,如 BERT 和 GPT-2/3。

GitHub Copilot 和 OpenAI codex 是新闻中非常受欢迎的几个应用程序之一。作为一个对 NLP 了解非常有限的人,我决定将 NLP 作为一个研究领域,接下来的几个博客/视频将是我在剖析 NLP 的一些重要组成部分后分享我所学到的东西。

NLP 系统有三个主要组件来帮助机器理解自然语言:

  1. 标记化
  2. 把...嵌入
  3. 模型架构

像伯特、GPT-2 或 GPT-3 这样的顶级深度学习模型都共享相同的组件,但具有不同的架构,从而将一个模型与另一个模型区分开来。

在这篇时事通讯(以及笔记本)中,我们将重点关注 NLP 管道的第一个组件的基础知识,即令牌化。一个经常被忽视的概念,但它本身就是一个研究领域。我们已经远远超越了传统的 NLTK 标记化过程。

虽然我们有 SOTA 算法用于标记化,但理解进化轨迹并了解我们是如何到达这里的总是一个很好的实践。

所以,这是我们要讲的内容:

  • 什么是标记化?
  • 为什么我们需要一个记号赋予器?
  • 标记化的类型—单词、字符和子单词。
  • 字节对编码算法——这是目前大多数 NLP 模型使用的一个版本。

本教程的下一部分将深入更高级(或增强版的 BPE)的算法:

  • 单字算法
  • 文字件—伯特变压器
  • 例句—端到端令牌化器系统

什么是标记化?

记号化是以称为记号的较小单元来表示原始文本的过程。然后,可以将这些标记与数字进行映射,以进一步提供给 NLP 模型。

下面是一个过于简化的例子,说明了记号赋予器的功能:

作者图片

这里,我们简单地将文本中的每个单词映射到一个数字索引。显然,这是一个非常简单的例子,我们没有考虑语法、标点符号、复合词(如 test、test-ify、test-ing 等)。).

因此,我们需要一个更技术性、更准确的标记化定义。为了考虑到每一个标点符号和相关的单词,我们需要从字符层面开始工作。

标记化有多种应用。其中一个用例来自编译器设计,我们需要解析计算机程序,将原始字符转换成编程语言的关键字。

在深度学习中,记号化是将字符序列转换为记号序列的过程,记号序列需要进一步转换为神经网络可以处理的数值向量序列。

为什么我们需要一个记号赋予器?

对记号赋予器的需求已经从“我们如何让机器阅读”这个问题中凸显出来

作者图片

处理文本数据的一种常见方法是在字典中定义一组规则,然后查找固定的规则字典。但这种方法只能到此为止,我们希望机器从它阅读的文本中学习这些规则。

现在,机器不知道任何语言,也不理解声音或语音。他们需要从零开始学习,以这种方式他们可以阅读任何可能的语言。

很艰巨的任务,对吧?

人类通过把声音和意义联系起来来学习语言,然后我们学习用那种语言读和写。机器做不到这一点,所以它们需要被赋予最基本的文本单元来开始处理它。

这就是标记化发挥作用的地方。将文本分解成更小的单元,称为“记号”。

有不同的方法来标记文本,这就是我们现在要学习的。

令牌化策略—令牌化的简单方法

为了使深度学习模型从文本中学习,我们需要一个两步过程:

作者图片

  1. 令牌化—决定用于生成令牌的算法。
  2. 将记号编码成向量

正如第一步所建议的,我们需要决定如何将文本转换成小的标记。我们大多数人建议的一种简单直接的方法是基于单词的标记,按空格分割文本。

单词标记器的问题

  • 训练数据中丢失单词的风险:使用单词标记,您的模型将无法识别不属于模型训练数据的单词变体。因此,如果您的模型在训练数据中看到了football,但最终文本有football,则模型将无法识别该单词,并将使用<UNK>令牌对其进行处理。类似地,标点符号带来了另一个问题,letlet's将需要单独的标记,这是一个低效的解决方案。这将需要大量的词汇来确保你拥有这个单词的每一个变体。即使您添加了一个 lemmatizer 来解决这个问题,您也在您的处理管道中添加了一个额外的步骤。
  • 处理俚语和缩写- 另一个问题是如今在文本中俚语和缩写的使用,比如“FOMO”、“LOL”、“TL;”博士等。我们对这些单词做了什么?
  • 语言不使用空格分词怎么办:对于汉语这样不使用空格分词的语言,这个分词器会彻底失效。

遇到这些问题后,研究人员研究了另一种方法,即将所有字符标记化。

基于字符的标记化

为了解决与基于单词的标记化相关联的问题,尝试了一种逐个字符的标记化的替代方法。

这确实解决了遗漏单词的问题,因为现在我们正在处理可以使用 ASCII 或 Unicode 编码的字符,它现在可以为任何单词生成嵌入。

每个字符,无论是空格、撇号还是冒号,现在都可以被赋予一个符号来生成一系列向量。

但是这种方法有它自己的缺点。

基于角色的模型的缺点

  • 需要更多的计算:基于字符的模型将把每个字符视为记号,更多的记号意味着需要更多的输入计算来处理每个记号,这反过来需要更多的计算资源。对于一个 5 个单词的长句,您可能需要处理 30 个标记,而不是 5 个基于单词的标记。
  • 缩小 NLP 任务和应用的数量:对于长字符序列,只能使用某种类型的神经网络架构。这限制了我们可以执行的 NLP 任务的类型。对于像实体识别或文本分类这样的应用程序,基于字符的编码可能是一种低效的方法。
  • 学习不正确语义的风险:使用字符可能会产生不正确的单词拼写。此外,没有内在的意义,学习字符就像学习没有意义的语义。

令人着迷的是,对于这样一个看似简单的任务,编写了多个算法来寻找最佳的标记化策略。

在理解了这些标记化方法的优缺点之后,寻找一种提供中间路线的方法是有意义的,即使用有限的词汇来保留语义,这些词汇可以在合并时生成文本中的所有单词。

子词标记化

使用基于字符的模型,我们可能会丢失单词的语义特征,而使用基于单词的标记化,我们需要非常大的词汇量来包含每个单词的所有可能的变化。

因此,我们的目标是开发一种算法,它可以:

  1. 保留令牌的语义特征,即每个令牌的信息。
  2. 标记化,而不需要非常大的词汇量和有限的单词集。

为了解决这个问题,我们可以考虑根据一组前缀和后缀来分解单词。例如,我们可以编写一个基于规则的系统来识别子词,如"##s""##ing""##ify""un##"等。,其中双散列的位置表示前缀和后缀。

因此,像"unhappily"这样的词是使用子词"un##""happ""##ily"来标记的。

该模型只学习几个子词,然后将它们放在一起创建其他词。这解决了创建大词汇量的内存需求和努力的问题。

此算法的问题:

  • 根据定义的规则创建的一些子词可能永远不会出现在您的文本中进行标记,并且可能会占用额外的内存。
  • 此外,对于每种语言,我们需要定义不同的规则集来创建子词。

为了缓解这个问题,在实践中,大多数现代记号赋予器具有识别输入语料库中的重复出现的文本并创建新的子词记号的训练阶段。对于罕见的模式,我们坚持使用基于单词的标记。

在这个过程中,另一个起着至关重要作用的重要因素是用户设置的词汇表的大小。较大的词汇表允许对更多的常用单词进行标记,而较小的词汇表需要创建更多的子词来创建文本中的每个单词,而不使用<UNK>标记。

在这里,为您的应用取得平衡是关键。

字节对编码(BPE)

BPE 最初是一种数据压缩算法,用于通过识别公共字节对来寻找表示数据的最佳方式。现在在 NLP 中使用它来用最少的标记找到文本的最佳表示。

它是这样工作的:

  1. 在每个单词的末尾加一个标识符(</w>)来标识一个单词的结尾,然后计算在文中的词频。
  2. 将单词拆分成字符,然后计算字符频率。
  3. 根据字符标记,对于预定义的迭代次数,计算连续字节对的频率,并合并最频繁出现的字节对。
  4. 继续迭代,直到达到迭代次数限制(由您设置)或者达到令牌限制。

让我们来看一个示例文本的每个步骤(用代码)。为了编写这段代码,我得到了毛蕾在 BPE 的极简博客的帮助。我鼓励你去看看!

以下是我们的示例文本:

第二步:将单词拆分成字符,然后计算字符频率。

作者图片

步骤 3:合并最频繁出现的连续字节对。

作者图片

步骤 4-迭代多次以找到要编码的最佳(就频率而言)对,然后连接它们以找到子字。

在这一点上,最好将我们的代码结构转换成函数。这将要求我们执行以下步骤:

  1. 在每次迭代中找到最频繁出现的字节对。
  2. 合并这些令牌。
  3. 添加新的成对编码后,重新计算字符标记频率。
  4. 继续这样做,直到没有更多对,或者到达 for 循环的末尾。

详细代码,你可以查阅我的 Colab 笔记本

这是这 4 个步骤的精简输出:

作者图片

因此,当我们迭代每个最佳对时,我们合并(连接)该对,您可以看到,当我们重新计算频率时,原始字符标记频率降低,新的成对标记频率在标记字典中弹出。

如果你看看创建的令牌的数量,它首先增加,因为我们创建了新的配对,但是在多次迭代之后,数量开始减少。

这里,我们从 25 个令牌开始,在第 14 次迭代中增加到 31 个令牌,然后在第 50 次迭代中减少到 16 个令牌。很有趣,对吧?

BPE 算法的改进范围

BPE 算法是一种贪婪算法,即它试图在每次迭代中找到最佳对。这种贪婪的方法有一些局限性。

因此,BPE 算法也有优点和缺点。

最终的令牌将根据您运行的迭代次数而变化,这也会导致另一个问题。现在,我们可以对一个文本使用不同的标记,从而实现不同的嵌入。

为了解决这个问题,提出了多种解决方案,但最突出的是一个 unigram 语言模型,该模型添加了子词正则化(一种新的子词分割方法)训练,该训练使用损失函数计算每个子词标记选择最佳选项的概率。在接下来的博客中会有更多的介绍。

他们在 BERTs 或 GPTs 中使用 BPE 吗?

像 BERT 或 GPT-2 这样的模型使用某种版本的 BPE 或 unigram 模型来标记输入文本。

BERT 包含了一个新的算法,叫做 WordPiece,它也类似于 BPE,但是增加了一层可能性计算,以决定合并后的令牌是否会最终通过。

摘要

你在这个博客中学到的(如果有的话)是机器如何通过将文本分解成非常小的单元来开始理解语言。

现在,有许多方法来分解文本,因此比较一种方法与另一种方法变得很重要。

我们从通过空格分割英语文本来理解标记化开始,但并非每种语言都以相同的方式书写(即使用空格来表示分段),因此我们研究了通过字符分割来生成字符标记。

字符的问题是从标记中丢失了语义特征,冒着创建不正确的单词表示或嵌入的风险。

为了两全其美,引入了更有前途的子词标记化,然后我们研究了实现子词标记化的 BPE 算法。

更多关于接下来的步骤和高级分词器,如单词块、句子块,以及下周如何使用 HuggingFace 分词器。

参考文献和注释

我的帖子实际上是以下论文和博客的积累,我鼓励你阅读:

  1. 具有子词单元的稀有词的神经机器翻译 —讨论基于 BPE 压缩算法的不同分割技术的研究论文。
  2. GitHub repo on Subword NMT(神经机器翻译) —上述论文的支持代码。
  3. 毛蕾关于字节对编码的博客——我自己用他博客里的代码实现并理解了 BPE。
  4. 机器如何阅读 Cathal Horan 的博客。

和我联系!

如果你正在寻找数据科学或 ML 领域的起点,请查看我的课程数据科学基础&ML

如果你想看到更多这样的内容,并且你不是订阅者,考虑使用下面的按钮订阅我的时事通讯。

立即订阅

如有任何补充或建议,您可以通过以下方式联系我:

人工智能隐私和数据安全的(不断发展的)世界

原文:https://towardsdatascience.com/the-evolving-world-of-ai-privacy-and-data-security-8e1bf3b5cdd6?source=collection_archive---------33-----------------------

播客

埃利亚诺·马克斯谈定义和保护隐私的挑战

苹果 | 谷歌 | SPOTIFY | 其他

编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。

我们都重视隐私,但我们大多数人都很难定义它。这有一个很好的理由:我们对隐私的看法是由我们使用的技术决定的。随着新技术允许我们用数据交换服务,或者以不同的形式为隐私付费,我们的期望发生了变化,隐私标准也在发展。隐私是一个移动的目标。

理解和执行隐私标准的挑战并不新鲜,但鉴于近年来人工智能的快速发展,这一挑战变得更加重要。仅仅在十年前毫无用处的数据——例如非结构化文本和图像——现在成了宝贵的财富。公司应该有权使用他们最初在价值有限的时候收集的数据吗,现在它不再是了。公司有义务提供最大限度的隐私而不直接向客户收费吗?人工智能中的隐私既是一个技术问题,也是一个哲学问题。为了讨论这个问题,我邀请了 Protegrity 的数据和人工智能执行副总裁 Eliano Marques,这是一家专门为大公司提供隐私和数据保护的公司。埃利亚诺在过去十年里一直从事数据隐私方面的工作。

以下是我在对话中最喜欢的一些观点:

  • 即使是大型的知名公司通常也不知道谁应该对隐私负责——是首席信息官、首席技术官、首席安全官,还是其他人。但是因为他们致力于解决隐私问题——或者至少,被人看到他们在解决这些问题——他们还是设立了隐私倡议。虽然如果组织层面的责任更加清晰,这些举措不太可能发挥最大作用,但不清楚它们是不是一件坏事:它们代表了对隐私的一种有点笨拙但有价值的初始投资,并向消费者和其他公司发出了隐私问题值得解决的信号。
  • 许多人本能地不喜欢定向广告,但还不清楚它们弊大于利。广告最好的版本就是一个通知,告诉你一个产品正是你所需要的。由于我们在使用某项服务时会以这样或那样的方式面对广告,因此,大量不相关的广告会比少量有针对性的帖子更好,这一点并不明显。广告定位可以说是一种平衡功能,允许每个人以大致相同的隐私成本免费获得服务,而另一种选择在某些情况下需要用户为他们的隐私付费。
  • 在过去十年中,数据泄露和隐私攻击发生了很大变化。埃利亚诺解释说,十年前,黑客攻击几乎只针对原始数据。但今天,算法是一个越来越重要的漏洞:恶意行为者可以毒害训练数据,并提取由神经网络等机器学习模型记忆的信息,有效地获得了进入原本可能被认为是安全的数据的后门。
  • 埃利亚诺认为,确保用户隐私得到尊重的关键是让用户意识到,当他们以某种方式与产品互动时,他们会做出特定的隐私权衡。这意味着向用户解释为什么需要某些数据,并允许他们以清晰地映射到他们可以使用的产品功能的方式轻松修改他们的个人隐私设置。这在很大程度上是因为每个人对隐私都有不同的定义,而且没有一个明确的衡量标准或标准来定义隐私原则。

章节:

  • 0:00 介绍
  • 1:40 埃利亚诺的背景
  • 8:25 技术人员缺什么?
  • 17:30 数据隐私意识
  • 23:02 定向广告的价值
  • 27:30 购买自己的隐私
  • 38:15 隐私指标
  • 44:10 隐私问题教育
  • 53:26 总结

在 Julia 中执行统计测试的令人兴奋的新方法

原文:https://towardsdatascience.com/the-exciting-new-way-to-perform-statistical-tests-in-julia-e0dc80fa9a9b?source=collection_archive---------35-----------------------

激动人心的新测试方法在最新版本的车床朱莉娅。

(图片由作者提供)

介绍

Julia 中的统计测试总是比许多语言竞争者更难做。对于很多 Julia 软件来说,这当然是真的,因为它太年轻了,但我认为统计测试尤其受到了这种衰弱的打击。虽然 Julia 有一些可以组合起来以获得统计值的相当分段的基础包,但是这些包也经常由不同的人在不同的时间出于不同的目的而创建。因此,记住这一点,完成简单的工作,如执行 T-test,在生态系统中可能是一场噩梦。

需要澄清的是,这并不是说 T-test 在当前没有 Lathe 的 Julia 生态系统中是不可行的,但是我确实认为这个包有一个很好的测试方法,而且;

统计测试自动化。

如果你感到困惑,并且从未听说过车床,你可以在 GitHub 上查看:

https://github.com/ChifiSource/Lathe.jl

对于这篇文章以及以后类似的文章,我创建了一个名为车床书籍的新存储库。我对这个新的存储库的意图是为那些想使用该软件,但可能不知道如何使用的人创建一个更好的方法,用真实世界的例子来演示它,这些例子在数据方面是可重复的。此存储库中的所有笔记本都将从存储库或外部来源加载文件。这与我的其他笔记本储存库有很大的不同,因为它真的很容易实验。下面是我在这篇文章中使用的笔记本的链接:

https://github.com/emmettgb/Lathe-Books/blob/main/stats/stats_InferentialTesting.ipynb

数据

正如我在介绍中提到的,我希望这些项目的所有数据都可以从远程来源获得。考虑到这一点,我确实发现了一些直接来自世界卫生组织的非常激进的数据,我觉得这些数据对新冠肺炎非常有意思。尽管这次疫情非常糟糕,但我必须承认,利用从这种情况中得出的数据进行工作是非常棒的。在我看来,在 Julia 中从互联网上获取随机文件的最佳方式是使用 wget。当然那不是 Julia,那是 Bash,所以我可以说从互联网时代获得随机文件的最好方法是 wget。然而,在 Julia 中,我们将需要来自 Base 的 run()方法,它将接受一个表达式。

**using** Base: run
run(`wget https://covid19.who.int/WHO-COVID-19-global-table-data.csv`)

这将下载一个新文件, 【世卫组织-新冠肺炎-全球-表格-数据. CSV .】让我们用 CSV.jl 和 DataFrames.jl 读入该文件。有两种方法可以做到这一点,但据我对 DataFrames.jl 的工作所知,真正首选的方法实际上是不使用 sink 参数,这是我过去一直使用的方法。sink 参数会产生许多问题和奇怪的 bug,这些问题和 bug 都可以追溯到使用这种方法。CSV.read()方法也是如此。DataFrames.jl 的做法是将文件放入 DataFrame 构造函数中,如下所示:

**using** CSV 
**using** DataFrames 
df = DataFrame(CSV.File("WHO-COVID-19-global-table-data.csv"))

(图片由作者提供)

如上图所示,该数据框中有十三个要素。人们可能会观察到的另一个现象是,这些数据中存在缺失值。每当我发现缺少值时,我总是做的第一件事就是检查大小。我这样做的原因是比较丢失前后的大小,看看我是否真的需要观察计数。如果你来自 Python 世界,让我们看看它的大小或形状。别担心,我通常不小心输入了形状(df ),然后不得不把它改成大小。无论如何,通常如果丢弃破坏了数据的完整性,那么我们需要寻找一种不同的解决方案,例如丢弃不良特征,或者用统计上不太重要的东西填充那些缺失的值,例如均值或多数类。

size(df)size(dropmissing(copy(df)))

(图片由作者提供)

考虑到如果我从这个数据框中丢弃丢失的值,我只会丢失两个观察值,我认为可以肯定地说,继续处理并丢弃它们可能不是一个坏主意。现在我们可以利用我喜欢的三种不同的技术来探索我们的特性。

这三种技术中的第一种是只显示每一列,这样我们就可以对数据类型有一个概念,就是将 allcols 关键字参数添加到 show()方法中。这将允许我们看到原始显示中省略的列,以及它们各自的数据类型和观察值。

show(df, allcols = true)

这样的输出可能相当复杂,难以阅读。我们查看这些维度的另一种方法是 names(df ),它将给出数据框中所有列的名称。

[println(name) **for** name in names(df)]

(图片由作者提供)

对于分类特性,我们可以利用 Set()转换来获取特性中所有的唯一类。对于连续问题,我们可以使用平均值来观察我们特征的数学平均值。我想测试不同的传输分类,所以我决定将这个特性转换成 Set()类型。

当然,在这组数据中有许多不同的独特观察结果,它们很可能对死亡和病例都有统计学意义。像“社区传播”这样的分类很可能有更多的确诊病例,特别是在过去 7 天内。也就是说,我们可以根据这一想法制定一个假设。

如果传播分类是“社区传播”,那么这很可能与较高的病例数相关。

这似乎是相对显而易见的,但在科学领域,如果定性事实听起来很现实,这并不重要,除非我们对相关性进行定性判断。也就是说,我们不能因为这个假设有意义就去证明它,但是如果它对两个维度的关联没有任何定性意义,我们还是可以接受零假设。

测试

现在我们有了一些数据,我们至少了解了一点,我们可以继续进行测试,以证明我们的假设。这方面的第一步是将我们想要测试的样本与其余的人群分开。在这种情况下,我们的样本将是在“传播分类”维度上属于“社区传播”类别的所有观察结果。在 Julia 中有很多方法可以做到这一点,比如 filter()方法,但是我非常喜欢使用 find all。这两种方法的区别在于,findall 将提取相关值,而 filter 将创建一个条件掩膜(通常为 BitArray 类型),该掩膜将应用于数据框,以移除与过滤条件不匹配的值。下面是我在这个实例中如何使用 findall:

community_trans = df[findall(in(["Community transmission"]), df[!, Symbol("Transmission Classification")]), :]

现在让我们从车床进口我们需要的东西。新的测试方法利用了车床中已经提供的分布基础。我们可以创建一个分布对象,然后通过一个名为 TwoTailed()的函数传递新的分布,以便执行双尾测试。我还打算导入一个 T 分布,以及抽象的车床分布类型,分布。

当然,t 分布是我们将要测试的分布。另一方面,分布类型只是函数采用的一个抽象类型,T 分布是它的一个子类型,这正是我想要通过导入它来演示的:

using Lathe.stats: T_Dist, TwoTailed, Distribution

现在如果我们使用子类型操作符,<:/>

T_Dist <: Distribution
true

我们可以通过简单地提供总人口作为位置参数来创建我们的分布。如果我们想了解更多关于发行版的功能,我们总是可以做到的

?(T_Dist)

(图片由作者提供)

该结构中的 apply()函数将对数据应用概率密度函数或 pdf。cdf()函数当然会对累积密度函数做同样的事情。在 t 分布的例子中,这将是较低的正则化不完全 beta 函数。让我们从最初的 df 中创建一个包含普通人群的新分布:

dist = T_Dist(df[!, Symbol("Deaths - cumulative total")])

现在,我们可以通过调用 TwoTailed()方法并提供我们的分布和示例作为位置参数,再用一行代码进行测试:

TwoTailed(dist, community_trans[!, Symbol("Deaths - cumulative total")])

(图片由作者提供)

Julia 可能对它的科学符号有点讨厌,但很难想象这在统计学上有多大意义。该函数实际上将返回一个布尔类型,而不是一个 P 值。我将更多地讨论为什么结论中会有这一点,但它确实为统计自动化中一些有趣的想法打开了大门。回到 P 值,这个数字大约是. 00000…53,这表示非常高的统计显著性。我们还可以为这个测试方法提供一个额外的关键字参数,它将允许我们调整我们的置信度和 alpha 值。看一下文档,您可能会注意到关键字参数 C 的存在。C 将取一个浮点数 64,这是我们希望测试的置信度百分比。默认情况下,这是 0.95,使得我们的 alpha 值为 0.05,这对于假设检验来说是相当标准的。

结论

我真的很兴奋车床的突破性发布,我们将很快看到。这个新版本的伟大之处在于,软件包的每个部分都经过了显著的改进,加入了一些非常棒的新功能和工具,我认为这些功能和工具肯定会对任何数据科学家有用。我特别兴奋地加入了新的自动化后端,这些后端将允许自动数据处理、统计,当然还有预测建模。总而言之,车床软件包正变得越来越有用,我认为它将很快对机器学习产生重大影响。感谢您的阅读,我希望这篇文章至少是有见地和有趣的!

可解释的助推器

原文:https://towardsdatascience.com/the-explainable-boosting-machine-f24152509ebb?source=collection_archive---------1-----------------------

可解释的人工智能

像梯度推进一样精确,像线性回归一样可解释。

Fabrice VillardUnsplash 上拍摄

可解释性和准确性的权衡

在机器学习社区,我经常听到和读到关于可解释性准确性的概念,以及它们之间如何进行权衡。通常,它是这样描述的:

图片由作者提供。

你可以这样理解:线性回归和决策树是非常简单的模型,一般来说并不精确。神经网络是黑盒模型,也就是说,它们很难解释,但通常表现得相当不错。像随机森林和梯度推进这样的集合模型也不错,但很难解释。

可解释性

但是什么是可解释性呢?对此没有明确的数学定义。一些作者,如[1]和[2]将可解释性定义为人类可以理解和/或预测模型输出的属性。这有点不切实际,但我们仍然可以根据这一点对机器学习模型进行分类。

为什么线性回归 y=ax+b+ɛ 可以解释?因为你可以说类似“增加一个 x 增加一个 a 的结果”。该模型不会给你一个意外的输出。越大的 x ,越大的 y 。较小的 x 较小的 y 。没有输入 x 会让 y 以奇怪的方式摆动。

为什么神经网络不可解释?好吧,试着猜测一个 128 层深度神经网络的输出,不用实际实现,不用纸笔。当然,输出是根据某个大公式得出的,但是即使我告诉你对于 x =1,输出是 y =10,对于 x =3,输出是 y =12,你也猜不出 x =2 的输出。可能是 11,可能是-420。

准确(性)

这是你能接受的——原始数据。对于回归,均方差、平均绝对误差、平均绝对百分比误差,应有尽有。对于分类,F1,精度,召回,当然,还有老国王本人的准确性。

让我们回到图片上来。虽然我同意这一点,但我想强调以下几点:

可解释性和准确性之间没有内在的平衡。有些模型既可解释又准确。

所以,不要让这张图骗了你。可解释的助推机器将帮助我们突破中间向下倾斜的线,到达我们图表右上角的圣杯。

图片由作者提供。

(当然,您也可以创建不准确且难以解释的模型。这是一个你可以自己做的练习。)

阅读本文后,您将能够

  • 理解为什么可解释性很重要,
  • 解释黑箱解释的缺点,如石灰和沙普利值,以及
  • 理解并使用可解释的助推机器学习器

解释的重要性

能够解释模型有几个好处。它可以帮助您改进模型,有时它甚至是业务所必需的,简单明了。

模型改进

照片由alevision.coUnsplash 上拍摄

假设你想建立一个模型来预测房子的价格。有创意吧?其中一个输入特征是房间数量。其他特征包括大小、建造年份和一些衡量社区质量的指标。标准化特征后,您决定使用线性回归。测试集上的 r 很好,您可以部署模型。在稍后的时间点,新的房屋数据进来,你注意到你的模型相当偏离。哪里出了问题?

由于线性回归具有高度的可解释性,您可以直接看到答案:特征“房间数量”的系数是负的,尽管作为一个人,您会期望它是正的。房间越多越好,对吧?但是型号因为某种原因学了相反的

这可能有很多原因。也许你的训练和测试集是有偏见的,如果一个房子有更多的房间,它往往是旧的。如果房子越旧,价格就越便宜。

这是你唯一能够发现的东西,因为你可以看看模型内部是如何工作的。您不仅可以发现它,还可以修复它:您可以将“房间数”的系数设置为零,或者您也可以重新训练该模型并将“房间数”的系数强制为正。这是你可以通过设置关键字positive=True用 scikit-learn 的LinearRegression做的事情。

注意,这将所有的 T2 系数设为正。如果你想完全控制系数,你必须写你自己的线性回归。你可以查看这篇文章来开始。

业务或法规要求

廷杰律师事务所Unsplash 上拍摄的照片

通常,利益相关者希望至少有一些关于事情为什么会发生的直觉,你必须能够向他们解释。虽然即使是最非技术人员也可以同意“我将一堆数字加在一起”(线性回归)或“我沿着一条路径走,并根据一些简单的条件向左或向右走”(决策树),但对于神经网络或集成方法来说,这要困难得多。农民不知道的东西他不吃。这是可以理解的,因为这些利益相关者经常要向其他人报告,而其他人也需要对事情大致如何运作的解释。祝你好运,向你的老板解释梯度推进,这样他或她可以把知识传递给更高的实例,而不会犯任何重大错误。

除此之外,可解释性甚至可能是法律所要求的。如果你为一家银行工作,并且创建了一个决定一个人是否能获得贷款的模型,那么你很有可能被法律要求创建一个可解释的模型,这可能是逻辑回归。

在我们讨论可解释的助推机器之前,让我们先看看一些解释黑盒模型的方法。

黑盒模型的解释

劳拉·乔伊特在 Unsplash 上拍摄的照片

有几种方法试图解释黑盒模型的工作原理。所有这些方法的优点是你可以利用你已经训练好的模型,并在此基础上训练一些解释者。这些解释器使模型更容易理解。

这种解释器的著名例子是局部可解释的模型不可知解释(LIME)【3】和 Shapley 值【4】。让我们快速了解一下这两种方法的缺点。

石灰的缺点

在 LIME 中,你试图一次解释你的模型的一个预测。给定一个样本 x ,为什么标签是 y ?假设您可以在围绕 x. 的封闭区域中用一个可解释的模型来近似您的复杂黑盒模型。这个模型被称为代理模型,通常为此选择线性/逻辑回归或决策树。然而,如果近似不好,你可能没有注意到,解释就会产生误导。

还是一个你要注意的甜库

沙普利值

使用 Shapley 值,可以将每个预测分解为每个特征的单独贡献。例如,如果您的模型输出 50,使用 Shapley 值,您可以说要素 1 贡献了 10,要素 2 贡献了 60,要素 3 贡献了-20。这三个 Shapley 值之和是 10+60–20 = 50,即模型的输出。这很好,但遗憾的是,这些值极难计算。

对于一般的黑盒模型,计算它们的运行时间是特征数量的指数级。如果你有几个特性,比如 10 个,这可能还是可以的。但是,根据你的硬件,20 美元可能已经不可能了。公平地说,如果你的黑盒模型由树组成,有更快的近似值来计算 Shapley 值,但它仍然会很慢。

不过,Python 有一个很棒的 shap 库,它可以计算 Shapley 值,你绝对应该去看看!

不要误解我。黑盒解释比完全没有解释要好得多,所以如果你出于某种原因不得不使用黑盒模型,就使用它们。但是当然,如果你的模型表现良好并且同时是可解释的,那就更好了。现在终于到了继续寻找这种方法的代表的时候了。

可解释的助推器

可解释的助推的基本思想一点也不新鲜。它始于加法模型,早在 1981 年就由杰罗姆·h·弗里德曼和沃纳·斯图兹尔首创。这种类型的模型具有以下形式:

图片由作者提供。

其中 y 是预测值,而 x ₁、…、 xₖ 是输入特征。

一位老友

我声称你们所有人都已经偶然发现了这样一个模型。让我们大声说出来:

线性回归!

线性回归只不过是一种特殊的可加模型。在这里,所有的功能 fᵢ 就是身份,即。f ᵢ( xᵢ ) = xᵢ 。很简单,对吧?但是你也知道,如果违背了的假设,特别是的线性假设,线性回归可能不是精度方面的最佳选择。

我们需要的是更通用的函数,能够捕捉输入和输出变量之间更复杂的相关性。微软的一些人给出了一个如何设计这种功能的有趣例子[5]。更好的是:他们为 Python 甚至围绕这个想法开发了一个舒适的包。

注意,在下文中,我将只描述可解释的增压回归变量。分类也很有效,并不复杂。

解释

你可能会说:

有了这些函数 f,这看起来比线性回归更复杂。这个怎么更容易解读?

为了说明这一点,假设我们已经训练了一个如下所示的附加模型:

图片由作者提供。

您可以将(16,2)插入到模型中,并接收 5+12–16 = 1 作为输出。这是已经分解的 1 的输出——有一个 5 的基线,然后功能 1 提供了一个额外的 12,功能 3 提供了一个额外的-16。

事实上,所有的功能,即使它们很复杂,也只是由简单的加法组成,这使得这个模型很容易解释。

现在让我们看看这个模型是如何工作的。

这个想法

作者以类似梯度推进的方式使用小树。如果你不知道梯度增强是如何工作的,请参考这个很棒的视频。

现在,代替在所有特征上训练每棵小树,可解释的增强回归器的作者提议用一次一个特征训练每棵小树。这将创建一个如下所示的模型:

图片由作者提供。

你可以在这里看到以下内容:

  • 每个 T 都是深度小的树。
  • 对于每一个 k 特征, r 树被训练。所以,你可以在方程中看到 kr* 不同的树。
  • 对于每个特征,其所有树的总和就是前面提到的 f

这意味着函数 f 由小树的和组成。由于树的用途非常广泛,许多复杂的函数都可以非常精确地建模。

请务必观看此视频,了解另一种解释:

好吧,我们已经看到了它是如何工作的,你可以很容易地解释可解释的增压机的输出。但是这些模型有什么好的吗?他们的论文[5]这样写道:

图片摘自[5]。可解释增压机。

我看不错!当然,我也测试了这个算法,它在我的数据集上也很有效。说到测试,让我们看看如何在 Python 中实际使用可解释的 boosting。

在 Python 中使用可解释的增强

微软的解释包使得使用 explainable boosting 变得轻而易举,因为它使用了 scikit-learn API。这里有一个小例子:

from interpret.glassbox import ExplainableBoostingRegressor
from sklearn.datasets import load_boston

X, y = load_boston(return_X_y=True)

ebm = ExplainableBoostingRegressor()
ebm.fit(X, y)

这没什么奇怪的。但是解释包提供了更多的东西。我特别喜欢可视化工具。

from interpret import show

show(ebm.explain_global())

除此之外,show方法甚至可以让您检查函数 f 。这里是针对特性 4(NOX;波士顿住房数据集的氮氧化物浓度

图片由作者提供。

这里可以看到,最高到 0.58 左右,NOX 对房价没有影响。从 0.58 开始,影响变得略微积极,0.62 左右的 NOX 值对房价的积极影响最高。然后,它再次下降,直到对于大于 0.66 的 NOX 值,影响变为负的

结论

在本文中,我们已经看到了可解释性是一个理想的属性。如果我们的模型在默认情况下是不可解释的,我们仍然可以用诸如 LIME 和 Shapley 值这样的方法来帮助自己。这比什么都不做要好,但是这些方法也有它们的缺点。

然后,我们介绍了可解释的 boosting machine,它的精度可与梯度 boosting 算法(如 XGBoost 和 LightGBM)相媲美,但也是可解释的。这表明准确性和可解释性并不相互排斥。

多亏了解释包,在生产中使用可解释的增强并不困难。

微小的改进空间

这是一个很棒的库,目前只有一个主要缺点:它只支持树作为基础学习者。大多数时候这可能就足够了,但是如果你需要单调函数,比如说,你现在是一个人。然而,我认为这应该很容易实现:开发人员只需添加两个功能:

  1. 支持一般基础学习者。然后我们可以使用保序回归来创建单调函数。
  2. 支持不同基础学习者的不同功能。因为对于某些特征,你希望你的函数单调增加,对于其他特征,你不在乎。

你可以在这里查看讨论

参考

[1]t .米勒(2019 年)。人工智能的解释:来自社会科学的见解人工智能267 ,1–38。

[2] Kim,b .,Koyejo,o .,& Khanna,R. (2016 年 12 月)。例子还不够,学会批判!对可解释性的批评。在辊隙中(第 2280–2288 页)。

[3]里贝罗,M. T .,辛格,s .,& Guestrin,C. (2016 年 8 月)。“我为什么要相信你?”解释任何分类器的预测。第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集(第 1135-1144 页)。

[4] Lundberg,s .,,Lee,S. I. (2017)。解释模型预测的统一方法arXiv 预印本 arXiv:1705.07874

[5]诺里,h .,詹金斯,s .,科赫,p .,&卡鲁阿纳,R. (2019)。Interpretml:机器学习可解释性的统一框架。 arXiv 预印本 arXiv:1909.09223

感谢 Patrick Bormann 的有用评论!

我希望你今天学到了新的、有趣的、有用的东西。感谢阅读!

作为最后一点,如果你

  1. 想支持我多写点机器学习和
  2. 无论如何,计划获得一个中等订阅,

为什么不做 通过这个环节 ?这将对我帮助很大!😊

说白了,给你的价格不变,但是大约一半的订阅费直接归我。

非常感谢,如果你考虑支持我的话!

有问题就在LinkedIn上写我!

探索-开发权衡:直觉和策略

原文:https://towardsdatascience.com/the-exploration-exploitation-dilemma-f5622fbe1e82?source=collection_archive---------10-----------------------

思想和理论

理解贪婪、乐观初始化、UCB 和汤普森采样策略

鸣谢:约书亚·沃罗尼耶基皮克斯拜

这篇文章是与巴蒂斯特·罗卡共同撰写的。

介绍

“假设我目前的知识足够可靠,我应该选择看起来是最优的决定吗?或者,我是否应该做出一个目前看来不太理想的决定,假设我的知识可能不准确,而收集新信息可以帮助我改进它?”。简单来说,这就是我们如何总结勘探-开采权衡(也称为勘探-开采困境)。

当面对决策问题时,开发和探索是两种可能的行为,都有利弊。一方面,开发包括做出关于迄今为止观察到的数据的最佳决策。这种安全的方法试图尽可能地避免错误的决策,但也阻止了发现潜在的更好的决策。另一方面,探索包括不采取看似最优的决策,押注于观测数据不足以真正确定最佳选项的事实。这种风险更大的方法有时会导致糟糕的决策,但也有可能发现更好的决策(如果有的话)。

在许多情况下会遇到在开发和勘探之间做出选择的问题,其中观察推动决策,决策导致新的观察。当面对这样一个反馈循环(数据产生决策,决策产生数据)时,我们不得不在任何时候想知道,目前看起来最好的决策是否真的是最优的,或者观察到的数据只是不够有代表性,不足以确定真正的最优决策。目标是在这两种可能的行为之间找到一个平衡的策略。

在本帖中,我们将给出一些与勘探-开采权衡相关的关键概念,并介绍处理该问题的四种最流行的方法: e-greedy 方法、乐观初始化、置信上限和 Thompson 采样。我们将讨论这些方法之间存在的基本差异和相似之处,并在多臂土匪问题的特定背景下查看一些具体的例子。

概述

在第一部分中,我们将更多地讨论勘探-开发权衡,并介绍众所周知的多臂 bandit 框架。在第二部分中,我们将介绍 e-greedy 方法,这是进行一些探索的最天真(但有效)的方法。在第三部分,我们将介绍乐观初始化方法,并看看如何通过仔细选择我们知识的初始状态来达到一定的探索水平。在第四部分,我们将看到如何用置信区间来明确表达我们知识的不确定性,并描述 UCB 策略如何使用这些区间来推动探索。最后,在最后一节中,我们将介绍汤普森抽样,它使用我们当前的知识状态,根据每个行动成为最佳行动的概率来做出探索选择。

探索与开发

一般问题

当数据收集和决策制定之间存在某种反馈回路时,勘探-开采困境是大多数数据驱动决策制定过程中可能遇到的一个非常普遍的问题。换句话说,一旦一个模型不再是旁观者,而是数据收集方式的参与者,探索-开发的困境就出现了。让我们考虑两个例子来说明我们的观点:第一,人脸检测模型的离线训练,第二,预测一些广告的点击率的模型的在线训练。

在面部检测器模型的情况下,在训练之前收集数据。一旦它被训练,模型以某种方式被使用,但是没有新的数据被收集,因此,没有反馈循环需要小心。不需要考虑勘探-开采的权衡:模型在数据收集过程中没有作用,其输出可以这样使用不需要进一步勘探。

无反馈回路设置。之前已经收集了数据,并且执行了一次训练。不需要探索。

相反,在点击预测的情况下,模型不断更新,并且在收集数据的同时进行训练。到目前为止观察到的数据被用于训练模型,该模型被用于选择要显示的最佳广告,新收集的数据(点击或没有点击)可以被用于更新模型,等等。模型是数据收集过程的参与者,需要仔细考虑勘探-开采的权衡。

反馈回路设置。使用该模型时会收集新的数据,因此会更新该数据。为了确保数据的质量(代表性)以及模型的质量,可能需要进行探索。

事实上,如果没有探索,错误地预测广告表现不佳的模型(因为我们没有数据、数据不准确或该广告的数据过时)将不会有任何机会用新的观察来纠正自己,因为该广告将不再显示。考虑到一些探索将使尝试这个广告成为可能,并收集更多证明模型错误的数据并更新它。

一般来说,当没有足够的过去数据来训练可靠的模型时,通常需要这种在线学习过程(【冷启动问题】 ) 或者当数据随时间演变时(非平稳问题)。在这两种情况下,从目前观察到的数据中获得的知识不允许我们绝对确定地确定要采取的最佳决策(在我们的示例中显示的最佳广告)。然后,我们必须在根据我们当前知识的最佳决策(开发)和任何其他可以通过更多信息显示为最佳的决策(探索)之间做出基本选择。

在介绍多武装匪徒的具体例子及其数学框架之前,我们可以提及一些易于理解的探索-开发困境的经典例子:

  • 餐馆选择:去你最喜欢的餐馆(探索)或尝试一个不知名的餐馆(探索)
  • 电影推荐:推荐用户的最佳电影类型(探索)或尝试另一种电影类型(探索)
  • 石油钻探:在最著名的位置钻探(开采)或尝试新的位置(勘探)
  • 临床试验:使用最著名的治疗方法(开发)或尝试一种新的实验方法(探索)

多兵种土匪框架

现在让我们呈现多臂(或 K 臂)bandit 框架,它将作为本文剩余部分的重复示例。K-武装匪徒问题模拟了这样一种情况:一个代理人连续几次面临 K 个相同的可能选择,每次都导致一个随机奖励,其分布是未知的。这个代理的目标是在给定的时间内最大化他得到的总回报。为了实现这个目标,在每一次迭代中,代理必须在获取更多关于 K 个选择中每一个的奖励分布的知识的需求(探索)和基于其当前知识优化奖励的需求(开发)之间进行平衡。

伯努利三臂强盗设定的说明:在每一次迭代中,代理人必须在探索和开发之间保持平衡。

按照设计,这个问题是我们能想到的最直接的探索-开发困境的例子,这就是为什么它被研究了这么长时间,并且仍然是科学界最感兴趣的问题。这些年来,在对这个相当自然的问题的研究中出现了几个重要的定理和算法,其中一些将在本文的下一节中介绍。在深入研究面对多支武装匪徒时可以使用的不同策略的细节之前,让我们定义一些有用的数学符号。

我们将在未来的例子中考虑伯努利 K-武装匪徒问题,这是 K-武装匪徒问题的一个特例,其中 K 奖励分布

是伯努利分布。在这个非常特殊的例子中,当代理人选择行动 I 时,他得到的回报是

整个不确定性在于 p_i 的未知值。我们也表示

分别是迭代 t 时代理人的选择(属于{1,2,…,K}),代理人在迭代 t 时得到的报酬和从迭代 0 到迭代 t 的总报酬

最后,我们可以定义预期后悔和总预期后悔这两个重要的理论概念。迭代 t 时的期望后悔被定义为最佳行动的期望回报与所选行动的期望回报 c_t 之差。总的预期遗憾是不同迭代的预期遗憾的总和。在伯努利 K-武装匪徒问题的特殊情况下

分别是最佳行动的期望回报和所选行动的期望回报 c_t。时间 t 的期望遗憾和总期望遗憾由以下公式给出

实际上,p_i 是未知的,(总)预期后悔是无法计算的。然而,这些度量在评估策略质量的模拟问题(其中 p_i 的值是众所周知的,尽管假设它们不是)中是有趣的:在每次迭代中,低预期遗憾指示选择接近最优,而高预期遗憾指示相反。一个好的策略是这样的,平均来说,它的遗憾迅速减少到零,表明最佳选择被迅速确定和利用。相反,一个糟糕的战略通常会有一个缓慢减少和/或不为零的遗憾,这表明最佳选择是在很长时间后确定的,根本没有确定或没有得到很好的利用。

有效探索策略的平均后悔曲线快速向低值下降(尽可能快地确定最佳可能行动)。

贪婪的

选择在某些情况下被认为是最好的行动,否则随机探索

贪婪的

在介绍贪婪策略之前,让我们从贪婪策略的概念开始。贪婪策略简单来说就是总是做出对当前知识来说最好的决定。换句话说,这种方法是完全的剥削,没有探索。这种行为的主要缺点在于缺乏探索:如果我们的知识不够准确,我们可能会陷入困境,永远选择一个次优决策,而没有任何机会发现更好的选择。

让我们考虑一个伯努利三臂强盗问题来说明这一点

在我们接下来的例子中,3 个强盗的输赢概率。

我们还假设每个 p_i 值的先验知识设置为 0.5(我们在进行任何观察之前为 p_i 假设的值)。表示时间 t 时 p_i 的估计值

(在伯努利设置中,它也对应于预期回报的估计),然后我们可以重写我们的先验知识

遵循一个贪婪的策略,代理人在时间 t=1 选择具有最高期望回报估计的行动。现在,由于所有的估计都相等,代理随机选择一个动作。假设 t=1 时第一个选择的行动是行动 2,观察到的随机回报是 1。有了这个新的观察,我们可以更新与行动 2 相关的估计,同时保持其他两个不变。如果我们考虑更新到目前为止观察到的所有奖励的平均值(假设所有行为的第一个“假”初始奖励为 0.5),它给出

基于这些新的估计(不再相等),代理将在时间 t=2 再次选择行动 2,因为它具有最高的预期回报估计。在这一点上,我们可以得到问题可能是什么的直觉:如果在连续迭代期间,行动 2 的预期回报的估计从未低于 0.5(这很可能发生,因为 p_2 的真实值是 0.7),我们将永远不会尝试行动 3(也不会尝试行动 1,但这不是一个问题),我们将永远错过最佳选择。我们还可以注意到,由于先前的估计值设置为 0.1 而不是 0.5,我们甚至可以观察到动作 1 的相同现象,尽管这是 3 个选项中最差的一个。

使用贪婪策略对我们的三臂伯努利问题进行三种不同模拟的第一次迭代。第一个模拟似乎是一个良好的开端,以确定采取的最佳行动,其他两个可能会因缺乏探索而停留在次优行动。

贪婪的

e-greedy 算法是最幼稚的(然而高效!)在决策过程中引入探索的方法。这个想法就是简单地采取概率为(1-e)的最优行动(开发)或概率为 e 的完全随机行动(探索)。然后,参数 e 平衡开发和探索,低的 e 值指示低程度的探索(e=0 是完全开发/贪婪,而 e=1 是完全探索/随机)。

让我们回到我们的伯努利 3 臂土匪的例子,并考虑 e=0.1(换句话说,我们采用一种策略,其中我们将为 10%的迭代选择一个随机动作)。感谢探索,我们概述的贪婪方法(永远错过最佳选择)的问题不会被观察到,并且我们确保识别出长期的最佳行动。然而,缺点是我们也保证继续探索,因此,潜在的穷人永远的选择。这种探索的成本可以用随机选择行动时的预期后悔来表示,在我们的例子中可以计算如下

因此,过了一段时间,一旦确定了最佳行动,我们会有一个概率为 0.9 的 0 后悔,但我们也会有一个概率为 0.1 的 0.2 后悔。总的来说,这意味着平均遗憾可以减少到 0.02,但不能再低了

到目前为止,我们看到了两种策略。贪婪策略,其长期遗憾与永远错过最佳行动的风险有关,以及贪婪策略,其长期遗憾与永远探索的低效率有关。那么,最佳策略是什么?如何从后悔减少速度和长期后悔值两方面比较它们?事实上,在全球范围内比较两种策略是相当困难的:一种策略在某些情况下可能更好,而另一种策略在其他情况下可能是更好的选择。

然而,对于这种具有已知真实概率的明确定义的问题,一种常见的方法是对不同的策略进行一些模拟,并比较每次迭代的平均后悔图。这些图表给出了遗憾减少速度和长期遗憾的概述,并将在本文的剩余部分使用。然而,应该记住的是一个比较适用于一个给定的特定问题,而策略几乎不可能在总体上进行比较,只能讨论它们的优势和劣势。

e-greedy 策略的平均后悔曲线应用于具有不同ε值的 3 臂 bandit 示例。

腐朽的电子贪婪

在前面的小节中,我们提到了贪婪策略是以一种简单的方式引入探索的好方法,但是永远保持探索是不相关的。理想情况下,一旦我们确信已经确定了最佳方案,我们就会停止勘探。然而,在实践中,这种最佳策略很难实现。模拟这种行为的一个简单的替代方法是使用一个 e-greedy 策略,该策略具有一个衰减值 e,而不是一个固定值。

事实上,正如我们之前看到的,高 e 值在过程的开始是好的,并允许快速找到最佳选项,但意味着长期的平均遗憾,这可能是重要的,取决于问题。另一方面,较低的 e 值需要更多的时间来确定最佳选择,但具有较低的长期平均遗憾。为了尝试获得两个世界的最佳效果,衰减 e-greedy 策略的思想是从给定的 e 值开始,并逐步降低它,假设我们越来越确定哪一个是最佳行动,因此,随着时间的推移,我们需要的探索越来越少。

如果这个想法看起来很有趣,一些限制仍然需要概述。首先,最佳衰变纲图不是那么容易定义的,它高度依赖于我们正在处理的特定问题(e 应该初始化为高还是低?应该减少得快还是慢?).第二,这种方法只与稳态问题相关,因为探索随着时间向 0 减少,不管可以观察到什么数据。

衰减 e-greedy 策略的平均后悔曲线应用于具有不同ε衰减时间表的 3 臂 bandit 示例。

乐观初始化

选择假设预期回报最佳的行动,直到事实证明并非如此

更智能的初始化,更好的探索

我们之前描述的 e-greedy 方法的一个主要缺点在于探索的随机性。事实上,在探索阶段,所有的行动都有相同的概率被选择,不管他们各自过去的回报观察。换句话说,这意味着当选择一个探索性的行动时,已经被证明具有高确定性的低回报的选择不幸地被认为与其他更不确定的可能导致更高回报的选择是一样的。虽然它们通常更复杂,但也存在其他策略,通过将探索集中在仍可能被证明是最佳的最相关的行动上,以更智能的方式解决不确定性。这些策略中的一些以明确的方式处理不确定性,如 UCB 或汤普森采样,而其他一些策略则以更含蓄的方式处理不确定性,如乐观初始化。

在上一节中,我们介绍了关于行动预期回报的先验知识的概念(Bernoulli bandit 的先验 p_i 估计),并提到了这种先验知识的重要性。乐观初始化方法的想法是从我们能想到的最乐观的先验开始进行回报估计,以确保每个动作至少执行最小量的探索。使用这种策略,所有的行动首先被认为是最优的,然后至少需要探索几次才能证明它们不是最优的(在次优行动的情况下)。

让我们用之前的 Bernoulli 3-armed bandit 示例来说明这个方法。在这种情况下,乐观初始化意味着我们开始时将所有行动的预期回报的先验估计值设置为 1,因为这是我们可以观察到的最佳回报(换句话说,所有 p_i 的先验估计值都设置为 1)

在每次迭代中,基于当前的估计选择最佳动作(随机地打破束缚),收集新的观察结果,并且因此更新估计。假设更新非常慢(我们将在下一小节回到学习率的重要性),三个动作的估计值逐渐减小(平均),直到它们达到最高的 p_i 值(在本例中,p_3 = 0.8)。在这一点上,p_3 的估计值应该停止真正降低,并开始围绕 p_3 的真实值波动(波动是由于奖励的随机性质)。然后,动作 3 被越来越频繁地选择,并且一旦其他两个估计已经随着新的更新向它们各自的真实值降低了一点点,动作 3 就迅速成为唯一剩下的选择。

乐观初始化方法的说明。

学习率的影响

正如我们已经看到的,探索算法由两个主要部分组成:探索策略(选择什么动作?)更新策略(如何更新知识?)。在大多数情况下,更新策略对全局流程有重大影响,因此应该仔细定义。在我们的第一个贪婪的例子中,一个动作的更新策略被简单地定义为到目前为止对这个动作观察到的所有奖励的平均值。更新的另一个可能的选择是使用当前预期回报估计值和新观察值之间的加权平均值。在这样的计算中,用 w 表示新观测值的权重,我们可以写出

参数 w 被称为学习率,控制着我们吸收新信息的速度。w 的高值意味着快速更新,但对来自奖励随机性的波动更敏感。w 值低得多是不明智的,但这是以更新缓慢为代价的。然后,必须根据问题的性质进行权衡。

让我们特别看看在处理乐观初始化时学习率的影响。我们看到,这种方法包括从行动预期回报的最大估计值开始,然后逐步更新这些估计值,直到其中一个值停止下降(平均)并高于所有其他值。当定义学习率值时,必须考虑两个相反的目标:快速识别最佳动作和准确识别最佳动作。

学习率的值必须在这两个相反的目标之间平衡选择。学习率的高值将产生快速更新:平均而言,估计值将快速降低,但我们有“超过”真实值的风险,并且由于随机性而“取消”错误动作。学习率的低值将产生缓慢的更新:平均而言,估计值将缓慢降低,但“过冲”风险降低,从而增加了确定最佳行动的概率。

说明学习速度在探索过程中的重要性。

总结这一部分,我们可以概括出如果奖励没有随机性,那么将学习率设置为 1 将是最佳的:对每个动作进行一次尝试就足以知道确切的奖励值,然后永远选择到这一点为止的最佳动作。然而,在大多数情况下,奖励的随机性使得高学习率的使用非常危险:具有高预期奖励和高方差的动作可能在第一次迭代中产生低奖励,并且几乎被“取消资格”,因为它可能没有进一步的机会来证明它可以做得更好。

乐观初始化策略的平均后悔曲线应用于我们的具有不同学习率值的 3 臂 bandit 示例。

置信上限

选择奖励上限估计值最高的行动

不确定性的显式建模

在前面的章节中,我们看到了不需要明确建模或量化知识不确定性的不同探索方法(贪婪、乐观初始化)。人们确实可以观察到,在我们以前所有的班迪特例子中,我们在某一给定时间的知识总是由点估计来模拟的,而点估计决不能反映这个值的不确定性。另一种方法是用置信区间或概率分布对不确定性进行明确建模,并依靠这种包含我们当前知识(平均值)和相关不确定性(分布的方差,置信区间的大小)的建模来推动勘探过程。置信上限(UCB)和汤姆逊抽样(TS)都以不同的方式依赖于这个想法。

UCB 方法的总体思路是用置信上限(在给定的程度上)来替代每个行动的预期回报的“均值”估计。这种行为也被称为“不确定性面前的乐观”:对于每个行动,预期回报的不确定性被表示为一个置信区间,我们选择乐观的“最佳行动”,并假设这些区间的上限为真正的预期回报。这种方法确保了我们将继续探索行动,尽管这些行动没有被证明比其他行动回报更低。

让我们用之前的伯努利 3 臂土匪例子来说明 UCB 方法。在时间 t,假设关于每个行动 I 的预期回报的不确定性(关于真实未知概率 p_i 的不确定性)由贝塔概率分布 P_i 建模。因此,我们可以为每个行动计算 80%的上限(例如),这将代表我们对真实预期回报的乐观猜测。然后,最佳“上限”指示要选择的行动,观察到新的回报,描述所选行动的预期回报的不确定性的概率分布可以更新,我们可以开始新的迭代。

置信上限方法的说明。

有界变量和 Hoeffding 不等式

正如我们所见,UCB 方法依赖于计算每个行动预期回报的置信上限的能力。例如,当行为回报有界时,这样的边界可以从赫夫丁不等式中导出。赫夫丁不等式提供了有界独立随机变量之和偏离其期望值超过一定量的概率的上限,可以表述如下。让我们假设 K 个有界随机变量

到这样的程度

然后,表示

赫夫丁不等式给了我们

让我们在伯努利 3 臂强盗的例子中说明如何利用这个不等式来遵循 UCB 探索策略。对于每一个行为 I,我们已经观察到不同数量的 K_i 奖励可以被表示

由于问题的性质,这些随机变量是独立同分布且有界的

因此,表示观察到的平均值和真正未知的预期回报

赫夫丁不等式告诉我们

对于给定的置信水平,我们可以使用这个不等式来定义每个行动的预期回报的上限,并选择上限最高的行动。

贝叶斯框架

Hoeffding 不等式不适用于无界随机变量。在这种情况下,一种更通用的方法是做出一些假设,用概率分布来模拟我们对预期回报的不确定性,这种概率分布将使用 贝叶斯规则 逐步更新。这样做,我们就可以用任何时候的当前概率分布来计算运行 UCB 算法所需的上界。特别地,对于任何给定的行为,如果我们将 e 表示为该行为的真实预期报酬,r_1,r_2,… r_t 表示为迄今为止观察到的独立报酬,贝叶斯规则将 e 相对于观察值的概率分布表示如下

在哪里

e 的先验分布(关于预期报酬值的先验假设)和

是报酬相对于 e 的似然分布(假设报酬概率分布由 e“参数化”)。

因此,想法是贝叶斯框架可以用来初始化和更新概率分布,而 UCB 策略依靠这些分布来推动探索。在每次迭代中,当前分布(基于先验和目前观察到的回报计算的后验概率)用于计算上限。然后,我们选择具有最高上限的动作,并为此动作观察到新的奖励。最后,使用贝叶斯规则更新与所选动作相关的概率分布,我们可以再次开始该过程。

在这一点上,非常重要的是概述一下我们操纵的概率分布模拟了我们对预期回报的不确定性,而不是回报本身的随机性。我们预计这些分布确实会随着时间的推移而变窄(如果数据是稳定的),尽管事实上真实的报酬分布可能有很大的差异。

具有贝塔分布先验和伯努利观察的贝叶斯更新的图示。

当然,除了简单的理论想法,在贝叶斯更新和上限计算中还有一些实际困难。首先,根据问题和所做的假设,贝叶斯更新可以非常简单(共轭先验/似然,在一组参数上的封闭形式更新)或者几乎难以处理(大部分时间由于分母计算)。在下一节中,我们将简要地提到一些用近似法处理困难情况的方法。第二,一旦掌握了后验分布,计算期望的上限并不总是那么容易。在这种情况下,一种可能的选择是从分布中采样,并使用生成的样本估计上限(采样有时更容易,如果不是唯一可能的选择)。

现在让我们看一个不错的贝叶斯更新案例,以我们的 3 个武装匪徒为例。对于每个 bandit i,我们将用 beta 分布来表示我们对其预期回报(概率 p_i)的先验知识。贝塔分布在区间[0,1]上定义,取决于两个参数,并应被视为当观察到给定数量的成功和失败时,未知成功概率的分布(这两个参数与这些成功和失败的数量相关)。特别地,对于每个 bandit i,β分布密度可以表示为

其中 B 是β函数,α_i 和β_i 是分布的两个参数(实际上,沿着更新,α_{i-1}和β_{i-1}分别是成功和失败的计数)。那么贝塔分布的一个很好的共轭性质告诉我们,如果我们用一个遵循伯努利分布的观测值“更新”这个先验,那么我们得到一个新的贝塔分布,它的参数已经以如下方式被更新

因此,举例来说,我们可以从每个动作的先验 Iβ分布开始,其中α_i = β_i= 1(使用这样的参数,我们得到在[0,1]上的均匀分布)。然后,在每次迭代中,我们将根据 UCB 方法选择一个行动(随机打破平局),观察奖励,并在开始新的迭代之前,根据该奖励最终更新所选行动的 beta 分布参数。

UCB 策略的平均后悔曲线应用于我们的三臂土匪例子,具有不同的上限值。

汤普森取样

根据最佳概率随机选择一个行动

基于概率的探索

我们将在本文中讨论的最后一种探索策略叫做汤普森抽样(TS)。像 UCB 一样,这种方法依赖于我们知识的概率表示来驱动探索过程。然而,使用这些概率分布选择行动的方式是非常不同的:在每次迭代中,UCB 选择具有最高上限的行动,而 TS 根据行动成为最佳的概率随机选择行动。Thompson Sampling 将这种方式定义为一种非常自然和有效的策略,无论是在开发(大多数情况下选择最有可能成为最佳的动作)还是探索(几乎没有机会成为最佳的动作几乎从不被选择,以避免将时间花费在无用的探索上)。

在实践中,根据所有的分布计算每个行动成为最佳的概率是相当困难的。然而,汤普森采样的一个很好的特性在于,我们不需要明确地计算这些概率。相反,基于当前的概率分布,我们可以为每一个行动画出其预期回报的估计,然后选择具有最高估计的行动。很容易看出,这个简单的过程严格来说等同于根据一个行为获得最高预期回报的概率直接对其进行采样。

汤普森抽样方法图解。

让我们再一次以三臂伯努利强盗为例来说明 ts 是如何工作的。同样,对于每个动作 I,我们决定用 beta 分布来模拟未知 p_i 值的不确定性,beta 分布将使用 Bayes 规则通过 Bernoulli 观测值进行迭代更新。然后,在每次迭代中,我们可以从β分布中随机估计 p_i 的值,选择具有最高估计值的动作(在这种伯努利情况下,p_i 等于预期奖励),观察奖励,最后根据奖励更新所选动作的β分布参数。

Thompson 采样策略的平均后悔曲线适用于我们的 3 臂土匪例子(与本文前面提到的其他策略相比)。

最短路径示例

我们的 bandit 示例实际上非常简单,并没有真正概括 Thompson 采样的优势。为了更好地理解这种方法的好处,现在让我们考虑一个更复杂的最短路径问题。在下图中,代理必须多次从节点 1 到节点 11。沿着图的每条边行进所花费的时间是一个随机变量,对于代理来说是未知的。在每次迭代中,代理都希望从 1 到 11 中选择最短路径。要做到这一点,他只能依靠他在之前的迭代中对每个边所做的观察,因此,他面临着一个探索-开发的困境。

最短路径问题图解。代理从 1 到 11 要去好几次。沿着边缘的持续时间是随机变量,其分布对于代理是未知的(并且可以是相关的)。在每次迭代中,代理必须在开发(根据过去的观察选择最佳路径)和探索(尝试另一条路径)之间进行平衡。

如果以前的方法可以用来解决这个问题,它们可能会非常低效。尽管它们很容易理解,贪婪和乐观的初始化策略确实需要一些时间来收敛。此外,问题的性质和选择用来模拟沿边缘行驶时间的分布可能会使每条路径的“UCB”边界计算变得非常具有挑战性,尤其是如果这些随机变量之间存在一些相关性(注意,在这种情况下,我们将计算一个下限,因为我们正在寻找最短路径)。正如我们之前提到的,如果从分布中抽样是估计期望界限的一种选择, Thompson Sampling 提供了一种更直接的方式来利用这种抽样

与 UCB 一样,Thompson 采样要求首先使用先验概率分布对沿每条边的预期行驶时间的不确定性进行建模,该概率分布将根据新的观测值逐步更新(贝叶斯更新,如 UCB)。然后,在每次迭代中,代理根据分布对图上每个边的持续时间估计进行采样,并根据这些绘制的估计(使用专用算法)计算具有最短预期时间的路径。然后,代理沿着这条路径行进,对每个被访问的边的持续时间进行一些新的观察,使用这些观察来更新相关的分布,并开始新的迭代。

汤普森抽样方法应用于我们的最短路径问题的说明。

贝叶斯更新近似

至于 UCB,汤普森抽样过程中最复杂的部分仍然是连续的贝叶斯更新。在许多情况下,后验分布的精确计算是难以处理的,必须使用依赖于某些近似的特定方法。当然,深入探讨这些方法的细节已经远远超出了本文的范围,因为它值得用一整篇文章来讨论,但是让我们简要地提一下一些主要的观点,我们希望这些观点能够激发关于这个主题的进一步阅读。

我们可以首先提到与单个贝叶斯更新相关的潜在困难。正如在以前的文章中所讨论的,通过计算归一化因子(Bayes 公式中的分母),采用积分的形式,这种更新确实很有挑战性。两大类方法经常被用来解决这个问题:抽样方法和近似方法。

  • 马尔可夫链蒙特卡罗(MCMC) 方法的思想是依靠马尔可夫链从我们复杂的后验分布中抽取样本。这种方法非常适合于仅需要样本的 Thompson 采样,并且也可以用于 UCB 的上限估计。
  • 变分推断(VI) 方法的思想是在参数化的分布族中搜索我们复杂后验分布的最佳近似(只知道一个因子)。例如,拉普拉斯方法试图找到感兴趣的分布的最佳高斯近似。

除了在处理单个贝叶斯更新时已经出现的复杂性之外,在探索过程中的连续更新会使计算变得越来越重,即使使用前面提到的方法。事实上,如果找不到中间的封闭形式,我们将需要在每次迭代中考虑所有过去的观测值来进行计算(参见前面关于 p(e | r_1,r_2,…,r_t)的贝叶斯公式),甚至对于近似方法也是如此。

为了控制计算时间,可以要求考虑之前提到的近似方法的增量变量。这种增量版本被设计成以固定的计算时间操作,例如通过迭代地更新以某种方式“总结”过去观察信息的一组参数。

外卖食品

这篇文章的主要观点是:

  • 当没有足够的过去数据来训练一个可靠的模型(冷启动问题)或者当数据随着时间推移而演变(非平稳问题)时,可以使用“在线学习”:然后,通过使用收集的新数据不断更新模型,意味着在数据收集和决策制定之间存在某种反馈循环
  • 这样的设置自然意味着勘探-开发权衡:我们应该相信我们的知识并根据当前模型(开发)做出最佳决策,还是应该挑战我们的知识并在收集更多数据时做出另一个可能更好的决策
  • 探索-开发问题可以使用特定的算法来处理,这些算法通常由两个重要部分组成:探索策略(基于当前知识选择什么动作?)和一个更新策略(如何基于新的观察更新知识?)
  • 更新策略主要取决于所选择的知识表示,从用于准时估计的简单加权平均值到用于概率分布的贝叶斯更新
  • 存在几种探索策略,其中我们发现 e-greedy (选择在某些情况下被认为是最好的动作,否则随机探索)乐观初始化(选择对预期回报假设最好的动作,直到被证明不是这样)置信上限(选择具有最高回报上限估计的动作)和 Thompson 抽样(根据它们成为最佳的概率随机选择一个动作)

当然,我们不能在不提及 强化学习 的情况下结束本文,强化学习通常被视为三种主要机器学习范例之一(有监督和无监督学习),并且通常需要设计良好的探索策略。强化学习实际上考虑了一种设置,在这种设置中,代理可以与环境进行交互(采取行动并获得奖励),并且应该从这些交互中学习如何在进行过程中最佳地表现。然而,尽管强化学习定义了一个遇到探索-利用权衡的典型设置,但不应该总结到这一点。

最后,我们可以最后一次概述在在线学习环境中小心处理决策数据反馈循环的重要性,以及定义一个非常适合的探索策略的重要性。最后,如果可以使用不同的策略,人们应该记住,最终,主要是拥有高质量的数据来训练我们的模型……在数据科学中总是如此。

感谢阅读!

关于这个主题的更多阅读材料:

Baptiste Rocca 写的其他文章:

数据科学中角色的激增

原文:https://towardsdatascience.com/the-explosion-of-roles-in-data-science-5963aa83e1c?source=collection_archive---------15-----------------------

如果您刚进入数据科学领域,这些课程可以为您提供帮助

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

自从我想成为一名数据科学家后不久。我对成为其中一员的可能性如此着迷,以至于我竭尽所能。幸运的是,我有了一个突破,改变了我对待事业的方式。

我意识到我在用我的角色定义自己。以至于我忽略了这个过程的重要性。我忘记了记住你为什么在做你正在做的事情的重要性。我也忘记了享受你正在做的事情的重要性。即使你正在做你不想做的事情。

我意识到这是许多人在开始他们的数据科学职业生涯时经历的事情。他们如此努力地定义自己的身份,以至于在这个过程中常常迷失了自我。

如果你在数据科学领域起步,很容易发现自己迷失在选择应该追求什么角色的过程中。 我们有数据科学家、数据分析师、数据工程师、机器学习工程师、分析工程师、商业智能工程师、数据架构师、数据说书人……你已经明白了,对吧?

对于刚刚进入这个领域的人来说,角色爆炸势不可挡。这篇文章旨在与你分享我在短暂的职业生涯中学到的一些经验。我认为它们可以对最近开始从事数据科学领域的人有所帮助。

TL;博士— 从任何地方开始。记住,你不是一个角色。你是来解决问题的。你应该关注能力而不是角色。最后,不断学习,不断进步。
就这样。再见;)

语境

让我来定义一下在数据科学中角色爆炸的含义。

几年前,许多这样的角色还不存在。那时,你会有一个数据工程师、一个数据分析师和一个数据科学家。就这样。但是,在过去的几年里,情况相对发生了变化。

现在,我们有了更多的角色。我做了一点研究,突然意识到在不到 10 分钟的时间里,我在数据科学中找到了 24 个不同的角色。

我就像…真的吗?24?这是一种时尚还是专业化?我不太确定。但是,如果你开始你的职业生涯,你可能会被这么多的选择弄得有点不知所措。

这正是我意识到发生在一些刚刚开始职业生涯的人身上的事情。他们不知道从哪里开始。他们不知道自己应该追求什么。他们真的不知道这么多角色里有没有适合他们的。

数据科学中的 24 个角色——作者根据[1][2][3][4所做的图解

有点难懂

你知道…几年前我也在那里。我开始了我的软件开发职业生涯。我不确定这是不是我想要的。我只知道我想尝试一下这个叫做数据科学的新东西。但是,我真的不知道从哪里开始。

很想和大家分享一下我的故事。但是,首先我想和你分享一个来自 南方公园 的故事。我认为它成功地说明了我的旅程。

所以,这里就是…

几个男孩去了一个满是侏儒的山洞。在那里,侏儒们正在经营他们的生意。他们收集和处理偷来的内裤。

男孩们有点吃惊,问——“那么,你打算怎么处理你偷的内裤?”对此,一个侏儒回应道:“收集内裤只是第一阶段。”男孩们回答道——“那么……第二阶段是什么?”
【奥卡德沉默】

侏儒对这个问题有点困惑,他问其他人:“嘿,第二阶段是什么?”另一个侏儒回应道:“第一阶段,我们收集内裤。”另一个人又回答道:“是啊,是啊。但是,第二阶段呢?”
另一个侏儒凝视着虚空,说道——“嗯……第三阶段是盈利。懂了吗?”一个男孩回答道:“我不明白”

侏儒试图解释这个计划,他说:“你看…第一阶段,收集内裤。第二阶段,[沉默]。第三阶段,盈利!”

虽然你可能会觉得这个故事有点傻,但我认为在那样的情况下很容易被抓住。当你如此执着于某件事时,你甚至没有意识到你可能会迷失在其中。你可能没有意识到你可能会说的话。

这适用于生活中的任何事情。我认为这也很好地解释了我们通常是如何专注于我们在公司中扮演的角色

对我来说,第一阶段是成为一名数据科学家。第二阶段…嗯,我不是很确定。但是,我很确定第三个是“成功”

我简单的故事——作者根据南方公园一集制作的插图

如果你正在开始你的数据科学职业生涯,这可能会发生在你身上。或者,也许,它已经发生了,而你没有意识到。

不管怎样,这里是我在这个过程中学到的一些经验。

课程

自从我开始从事数据科学以来,我已经经历了不同的角色。我做过数据分析师;一个古怪的数据科学家/机器学习工程师;现在是一名数据工程师/架构师。

我在四年里经历了这三个不同的角色。你可能认为我没有耐心。嗯,我认为这取决于你看问题的角度。

"没有好坏之分,只是思维使然。"威廉·莎士比亚

不管怎样,在经历这个过程的时候,我学到了一些东西。所以,事不宜迟,他们来了。

从任何地方开始

如果你是刚起步,不要太担心选择哪个角色。你不需要在你的余生都在那个角色上努力。

你应该简单地选择更接近你已有知识的角色。试试吧,不喜欢就开始慢慢远离。但是,不要着急,也不要太执着于想要改变它。即使是你不喜欢的东西,也要允许自己去学习。他们将来会有帮助的。

当我们开始的时候,我想我们大多数人都想知道我们喜欢什么,我们想做什么。但是,知道我们不喜欢什么也是一种进步。

你不是你的角色

听起来很简单,你不是你的角色。但是,说起来容易,相信起来难。

记住,任何工作的目的都是为了解决问题。如果你是数据分析师,你就是在解决问题。你在用你的一些分析能力帮助别人。如果你是数据工程师,你也是在解决问题。你在用你的工程能力帮助人们。虽然,你可能更喜欢做数据分析师,而不是数据工程师。

关键是,除非你尝试过,否则你不会知道自己是否喜欢某样东西。所以,每个角色都尝试一点点,然后,当你觉得准备好了,选择一个,专攻它。

再者,不要让自己被一个角色定义所限制。我是一名数据分析师,从事数据工程师的工作。同时,我也是一名数据工程师,从事产品负责人的工作。就这样吧。我们是来解决问题的。

关注能力而不是角色

如果说现在有什么复杂的东西需要定义的话,那就是数据科学中的角色。每个公司都在以自己喜欢的方式定义角色。

我在一些组织中自称是数据分析师,但实际上我是他们的数据工程师。此外,我在一些组织中自称是数据分析师,但他们称我为数据科学家。

不管怎样,这就是为什么关注能力比角色定义更好。知道如何做 ETL 在任何地方都是一样的。如果你称自己为数据工程师、数据分析师或数据科学平台和工具开发人员,那就独立吧。

你应该抓住机会学习新的能力。同样,不要因为这不是你作为数据工程师、数据分析师或其他任何人的职责,就停止学习。

不断学习,不断进步

如果你从来没有听说过,你怎么知道呢?我自己解决这个问题的方法是每天读一篇文章。我已经做了三年了。

不断学习,不断进步。这里没什么好补充的。每天读书,每天练习,对过程要有耐心。

今天,你可能是一名数据分析师。明天你可能会成为数据工程师。谁知道呢。你是来解决问题的。

感谢阅读!

如果你想随时更新我的作品, 请加入我的 简讯 偶尔,我会和我的读者分享一些东西。如果你加入我会很感激的:)

F1 的分数

原文:https://towardsdatascience.com/the-f1-score-bec2bbc38aa6?source=collection_archive---------0-----------------------

你所需要知道的关于机器学习中的 F1 分数。其中有一个在 Python 中应用 F1 分数的示例。

F1 分数。Jonathan Chng 在 Unsplash 上拍摄的照片。

介绍 F1 分数

在这篇文章中,你会发现 F1 的分数。F1 分数是可以在分类模型中使用的机器学习度量。尽管分类模型有许多度量标准,但在本文中,您将发现 F1 分数是如何计算的,以及何时使用它有附加值。

f1 分数是对两个更简单的性能指标的改进。因此,在深入了解 F1 分数的细节之前,让我们先回顾一下 F1 分数背后的那些指标。

准确(性)

准确性是分类模型的一个度量标准,它将正确的预测数作为所做预测总数的百分比来衡量。举个例子,如果你的预测有 90%是正确的,那么你的准确率就是 90%。

准确度公式。作者配图。

只有当您的分类中有相等的类分布时,精确度才是一个有用的度量标准。这意味着,如果您在一个用例中观察到一个类的数据点比另一个类的数据点多,那么准确性就不再是一个有用的度量了。让我们看一个例子来说明这一点:

不平衡数据示例

想象你正在处理一个网站的销售数据。你知道 99%的网站访问者不买东西,只有 1%的访问者买东西。你正在建立一个分类模型来预测哪些网站访问者是买家,哪些只是旁观者。

现在想象一个不太好用的模型。它预测 100%的访问者只是旁观者,0%的访问者是买家。这显然是一个非常错误和无用的模型。

当你的班级不平衡时,准确性不是一个好的衡量标准。

如果我们在这个模型上使用精度公式会发生什么?你的模型只预测了 1%的错误:所有的购买者都被错误地归类为外貌特征。因此,正确预测的百分比是 99%。这里的问题是,99%的准确率听起来是一个很好的结果,而你的模型表现很差。总之:当你的班级不平衡时,准确性不是一个好的衡量标准。

通过重采样解决不平衡数据

解决类不平衡问题的一个方法是在你的样本上工作。使用特定的采样方法,您可以对数据集进行重新采样,使数据不再不平衡。然后,您可以再次使用准确性作为衡量标准。在本文中,您可以了解如何使用欠采样、过采样和 SMOTE 数据扩充等方法。

通过指标解决不平衡的数据

解决类别不平衡问题的另一种方法是使用更好的准确性指标,如 F1 分数,它不仅考虑了你的模型产生的预测错误的数量,还考虑了所产生的错误的类型。

精确度和召回率:F1 分数的基础

精确度和召回率是考虑类别不平衡的两个最常见的度量。他们是也是F1 成绩的基础!在下一部分将精确度和召回率结合到 F1 分数之前,让我们更好地了解一下精确度和召回率。

精确度:F1 分数的第一部分

精确度是 F1 分数的第一部分。它也可以用作单独的机器学习度量。它的公式如下所示:

精确公式。作者配图。

你可以这样解释这个公式。在所有被预测为肯定的事物中,precision 计算正确的百分比:

  • 一个不精确的模型可能会发现很多阳性,但是它的选择方法是有噪音的:它也会错误地检测出很多实际上并不是阳性的阳性。
  • 一个精确的模型是非常“纯粹”的:也许它没有找到所有的肯定,但是模型归类为肯定的那些很可能是正确的。

回忆:F1 分数的第二部分

回忆是 F1 分数的第二个组成部分,尽管回忆也可以用作单独的机器学习指标。召回的公式如下所示:

回忆公式。作者配图。

你可以这样解释这个公式。在所有实际为正的事物中,模型成功找到了多少:

  • 具有高召回率的模型成功地在数据中找到所有阳性病例,即使它们也可能错误地将一些阴性病例识别为阳性病例。
  • 具有低召回率的模型不能在数据中找到所有(或大部分)阳性病例。

精确度与召回率

为了澄清,想一想下面的例子,一家超市出售了有问题的产品,他们需要召回它:他们只对确保他们找到所有有问题的产品感兴趣。如果客户退回一些没有问题的产品,这对他们来说并不重要,所以超市对精确度不感兴趣。

精确召回权衡

理想情况下,我们希望两者兼而有之:一个模型是识别我们所有的阳性病例,同时只识别阳性病例

不幸的是,在现实生活中,我们不得不处理所谓的精确回忆权衡。

精确度-召回率的权衡代表了这样一个事实,即在许多情况下,您可以调整模型以降低召回率为代价来提高精确度,或者另一方面以降低精确度为代价来提高召回率。

F1 分数:精确度和召回率的结合

精确度和召回率是 F1 分数的两个组成部分。F1 分数的目标是将精度和召回指标合并成一个指标。与此同时,F1 的分数被设计为在不平衡数据上工作良好。

F1 得分公式

F1 分数定义为精确度和召回率的调和平均值

简单提醒一下, 调和平均值 是更常见算术平均值的替代指标。在计算平均比率时,它通常很有用。

在 F1 的分数中,我们计算的平均精确度和召回率。它们都是比率,因此使用调和平均值是一个合理的选择。F1 得分公式如下所示:

这使得 F1 分数的公式如下:

F1 得分公式。作者配图。

由于 F1 分数是精确度和召回率的平均值,这意味着F1 分数给予精确度和召回率同等的权重:

  • 如果精确度和召回率都很高,模型将获得高 F1 分数
  • 如果精确度和召回率都低,模型将获得低 F1 分数
  • 如果精度和召回率中的一个较低而另一个较高,模型将获得中等 F1 分数

F1 分数应该取代其他指标吗?

在整篇文章中,您已经看到了许多定义。在开始用 Python 实现 F1 分数之前,让我们总结一下何时使用 F1 分数,以及如何根据其他指标对其进行基准测试。

准确度与精确度和召回率

准确度是最简单的分类标准。它只是衡量机器学习模型做出的正确预测的百分比。您已经看到,在不平衡数据的情况下,准确性是一个糟糕的指标,因为它无法区分特定类型的错误(假阳性和假阴性)。

精度和召回率是在数据不平衡时更适用的性能指标,因为它们允许考虑模型产生的错误类型(误报或漏报)。

F1 分数与精确度和召回率

F1 分数将精确度和召回率结合成了一个单一的指标。在许多情况下,像自动基准测试,或者网格搜索,只有一个性能指标比多个更方便。

你应该使用 F1 的分数吗?

总之,当你有可能这样做的时候,你绝对应该查看你尝试的每个模型的多个指标。每个指标都有优点和缺点,每个都会给你关于你的模型的优点和缺点的具体信息。

真正的选择困难发生在进行自动模型训练时,或者使用网格搜索调整模型时。在这些情况下,您需要指定一个您想要优化的指标

在这种情况下,我的建议是好好看看一个或几个样本模型的多个不同的度量。然后,当您理解您的特定用例的含义时,您可以选择一个指标进行优化或调整。

如果您将您的模型投入生产以供长期使用,您应该定期回来进行模型维护并验证模型是否仍能正常工作。

Python 中的 F1 分数

现在让我们来看一个例子,在这个例子中,我们将了解 F1 分数的附加值。我们将使用一个包含大量网站访问者数据的示例数据集。

本练习的目标是建立一个简单的分类模型,该模型使用四个独立变量来预测游客是否会买东西。我们将看到如何使用不同的指标,我们将看到不同的指标将如何给我们不同的结论。

中使用了相同的数据集,本文提出使用 SMOTE 上采样技术来提高模型性能

我们在这里不使用 SMOTE,因为我们的目标是演示 F1 的分数。然而,如果您对处理不平衡的数据感兴趣,将这两种方法结合起来绝对是值得的。

数据

您可以直接从 GitHub 将数据导入 Python。以下代码允许您直接读取原始文件:

F1 分数。导入数据

您将获得如下所示的数据帧:

F1 分数。数据集。作者配图。

在这个数据集中,我们有以下五个变量:

  • 兴趣这个变量告诉我们游客是否最终购买了我们新的山地运动产品。
  • time_on_page:访问者在页面上花费的时间
  • pages_viewed:访问者浏览过我们网站的页数
  • interest_ski:客户关系数据库中的一个变量,告诉我们游客之前是否购买过任何与滑雪相关的物品。
  • `interest_climb``:客户关系数据库中的一个变量,告诉我们游客之前是否购买过任何与登山相关的物品。

验证类别不平衡

在我们的数据集中,我们只有很小比例的买家。如果您愿意,可以使用以下代码验证这一点:

用条形图验证类别分布

您将获得以下条形图:

F1 分数。验证数据确实不平衡。作者配图。

你可以在这里看到,与其他游客相比,买家非常少。这是为电子商务以及欺诈检测等其他类型的模型构建模型时经常发生的事情。这证实了 F1 的分数可能会派上用场。

列车测试分层

在构建任何模型之前,我们应该创建一个训练/测试分割。如果你不熟悉机器学习中的训练/测试方法,我建议你先看看这篇文章。

然而,当存在严重的类别不平衡时,进行标准的随机训练/测试分割是有风险的。由于阳性案例的数量非常少,您可能最终得到一个具有非常不同的类分布的训练集和测试集。您甚至可能在您的测试集中以接近零的阳性案例结束。

分层抽样是一种避免扰乱样本中类别平衡的抽样方法。它允许您使用与原始数据中完全相同的类平衡来生成训练和测试集。您可以使用以下代码在 scikitlearn 中执行分层训练/测试采样:

F1 分数。训练和测试数据的分层抽样。

如果您愿意,可以使用与前面相同的代码来生成显示类分布的条形图。它将确认总数据中的类别分布与训练集和测试集中的类别分布完全相同。

基线模型

作为基线模型,我们将创建一个非常糟糕的模型,预测没有人购买任何东西。这归结为生成一个全为 0 的预测列表。您可以这样做:

F1 分数。创建一个非常糟糕的基线模型。

虽然我们已经知道这个模型很糟糕,但是我们还是要试着找出这个模型的准确性。您可以按如下方式使用 scikitlearn 的精确度功能:

F1 分数。使用精确度来评估我们的不良基线模型。

我们非常坏的模型准确率高的惊人:95%!如果你从一开始就跟着做,你可能会明白为什么。在测试数据中,我们知道买家很少。该模型预测没有人购买任何东西。因此,它只对购买者(数据集的 5%)是错误的。

这正是我们需要担心召回率和精确度的确切原因。让我们使用下面的代码来计算这个模型的召回率和精确度:

F1 分数。使用精度和召回来评估我们的坏基线模型。

请记住,Precision 将告诉您正确预测的买家占预测买家总数的百分比。在这个非常糟糕的模型中,没有一个人被识别为买家,因此精度为 0!

另一方面,回忆告诉你在所有实际买家中你能找到的买家的百分比。由于你的模型还没有找到一个买家,召回也是 0!

让我们使用下面的代码来看看最终的 F1 分数是多少:

F1 分数。计算我们糟糕基线模型的 F1 分数。

结果并不令人惊讶。由于 F1 分数是精确度和召回率的调和平均值,因此 F1 分数也是 0

这个例子中的模型根本不是一个智能模型。然而,这个例子表明在不平衡数据集上使用准确性作为衡量标准是非常危险的。这个模型实际上根本不是性能型的,性能评估为 0 是唯一公平的评估。在这个例子中,精确度、召回率和 F1 分数都被证明是更好的例子。

更好的模型

由于上一个例子中的模型非常简单,让我们用一个真实的模型重做另一个例子。对于第二个例子,我们将使用逻辑回归模型。让我们使用以下代码构建模型,看看会发生什么:

让我们对预测做一个详细的检验。在二元分类中(如我们示例中的具有两种结果的分类),您可以使用混淆矩阵来区分四种类型的预测:

  • 真阳性(买家正确预测为买家)
  • 误报(非买家被错误地预测为买家)
  • 真实否定(非买家被正确预测为非买家
  • 假阴性(买家被错误地预测为非买家)

您可以在 scikitlearn 中获得混淆矩阵,如下所示:

F1 分数。获得混淆矩阵。

结果如下:

  • 真实底片:280 张
  • 误报:5
  • 假阴性:10
  • 真阳性:5

这个模型评估数据非常详细。当然,将这一点纳入一个单一的性能指标会更容易。准确性是最简单的性能指标,因此让我们看看这个示例的准确性得分是多少:

F1 分数。在更好的模型上计算精度。

有趣的是,逻辑回归的准确率为 95%:与我们非常糟糕的基线模型完全相同!

让我们来看看 Precision 和 Recall 对此有何看法:

F1 分数。在较优模型上计算精度和召回率。

我们最终得到了以下精确度和召回率指标:

  • 精度为:0.5
  • 回忆是:0.33

让我们也使用 scikitlearn 的 f1 分数来检查 F1 分数:

F1 分数。在更好的模型上计算 F1 分数。

得到的 F1 分是 0.4。

哪个模型和度量更好?

因此,精确度告诉我们,逻辑回归与糟糕的基线模型一样好,但是精确度和回忆告诉我们,逻辑回归更好。让我们试着理解为什么:

  • 两个模型的错误总数是一样的。因此精度是相同的。
  • 第二个模型实际上能够找到(至少一些)正面案例(买家),而第一个模型在数据中没有找到一个买家。因此,第二个模型的召回更高(逻辑回归为 0.33,而不是第一个模型的 0)。
  • 第一个模型没有找到任何买家,因此精度自动为零。逻辑回归确实找到了一些买家,所以我们可以计算出一个精确度。精度显示了有多少预测的买家实际上是正确的。这个最后是 50%。
  • F1 分数是我们真正感兴趣的指标。该示例的目标是展示其对于不平衡数据建模的附加价值。第一款车型F1 分数为 0:我们对这个分数很满意,因为这是一款非常糟糕的车型。
  • 第二款的 F1 分为 0.4。这表明,第二个模型虽然远非完美,但至少是第一个模型的重大改进。这是有价值的信息,我们无法使用准确性作为衡量标准来获得,因为两个模型的准确性是相同的。

结论

在本文中,F1 分数被显示为模型性能指标。当处理数据集不平衡的分类模型时,F1 值变得特别有价值。

您已经看到 F1 分数将精确度和召回率结合成一个指标。这使得在网格搜索或自动优化中使用它很容易。

在 Python 示例中,您已经看到了分类模型中不平衡数据集的情况。您已经看到了准确性是如何误导人的,因为它给了一个糟糕的模型一个很高的分数。在上一部分中,您已经看到 F1 分数在评估机器学习模型的性能方面效果更好。

我希望这篇文章对你有用。感谢阅读!

脸书数据科学,产品分析访谈

原文:https://towardsdatascience.com/the-facebook-data-science-product-analytics-interview-852e50ded966?source=collection_archive---------2-----------------------

如何获得加入脸书数据科学团队的邀请

在过去的招聘周期中,我有幸参与了脸书 DS 从最初的电话筛选到录用的面试过程。以下是我的经验和一些建议,我会给那些在不久的将来(或者现在)经历这种漫长经历的人。)

UnsplashMagnet.me 拍照

电话筛选#1:行为筛选

像大多数数据科学/分析师职位一样,第一个电话是招聘人员评估我的相关背景和技能。非常典型的问题,比如:

  • 告诉我一个你最近参与的涉及机器学习的项目
  • 你在[公司]的经历如何让你为这个角色做好准备?

电话屏幕#2:产品感测屏幕

与大多数数据科学/分析师职位不同,第二个电话关注的是我将产品需求转化为数据进行跟踪和解释的能力。在我第一次打电话结束时,我的招聘人员强调这不是数据科学家的典型技能,所以要为这一部分做更多准备。我从这种情绪中得出结论,对你进入下一轮比赛来说,这个电话筛选比行为筛选更重要,行为筛选是在相当短的时间内连续发生的。我得到的问题以及我练习的问题包括:

  • 你如何决定 Messenger 是否应该成为自己的应用程序?
  • 你如何决定发送哪些通知是个好主意?
  • 我们如何增加观看脸书直播视频的人数?

虽然我不能评论脸书实际使用的标准,但下面是我进入下一轮的框架:

定义“北极星”或业务 KPI。这意味着找出回答产品问题的商业价值,然后将可量化的指标与商业价值联系起来。对于脸书来说,这是一个很好的机会,是一些类似于每日活跃用户(DAU),平均帖子/评论/喜欢,发送的好友请求等。

定义客户和他们的具体痛点 —为什么该产品应该/应该首先存在?产品的核心是解决客户问题,搞清楚这个产品是为谁做的,为什么做,会帮助你找到你的产品问题。

了解脸书为什么要制造一个产品对成功至关重要,这张采访照片由 Unsplash 网站 NeONBRAND 拍摄

用一个你可以在实验中测量的指标来定义你的产品问题。这是设计一个实验的冗长说法。你的假设是什么,成功/失败是什么样子的?理想情况下,你可以跟踪你的北极星指标,但只要你能证明你的因变量与你的产品问题相关,你就可以开始了(提示:这是脸书,进行 A/B 测试)

谈论你将如何设置和评估这个实验。面试官问的很多后续问题都围绕这一部分。定义对达到这一点至关重要,但是你如何执行和解释实验可能会让你进入下一轮。谁在你的控制组里?你如何挑选他们?你做这个实验多久了?如何向产品经理解释统计测试?

过了这一点,就是实地采访了。在经典的大型科技时尚中,这些问题很难,值得练习,而且持续了一整天几乎不间断的面试(请某人重新发明科技面试)

面试#1:应用数据问题

现场产品访谈的一个主题是,它们都符合上述框架。这次面试的是一位资深技术人士,他问了更多关于建模和解释的直接问题。您可能会遇到需要复杂模型才能解决的问题:

  • 我们如何减少脸书上的虚假账户数量,并衡量虚假账户对我们用户群的影响?
  • Instagram Explore 页面应该展示什么内容?

将一个复杂的商业问题转化为数据科学对于成功至关重要

再次使用上述定义。这些定义将再次帮助您确保以对业务有影响的方式正面解决问题。将数据科学转化为商业价值是本次访谈的核心

沿途获得面试官的认同。与我的第一次面试不同,这次面试更多的是对我的想法进行反馈。我多次停下我的思路与他们交流,并确保他们同意我的假设

了解你选择的模式的优势和局限性。选择一个你觉得舒服的建模方法来解释如何实现它。我的许多后续问题都围绕着一个模型将如何处理与我的实验相关的某些场景和边缘情况。

面试#2:产品解释

根据我在网上读到的,这个问题几乎总是以这样的形式出现:

  • 你如何评估[脸书产品]的价值?

了解脸书的产品对成功至关重要,照片由 Brett JordanUnsplash 上拍摄

这次面试的是一个产品人,所以要求和提示略有不同

调研&了解脸书的产品。这也是我的招聘人员反复提到的事情,我很高兴我花了一些时间来熟悉他们的产品目前是如何运行的。这个问题需要你理解一个随机脸书特性的商业价值,有很多。我建议在心理上将某些特征归类到体验中(分享想法/感受的脸书 feed,寻找社区的群组,分享体验的 Instagram,等等)。)

准备好捍卫你的决定,否则就转向。这适用于所有的面试,尤其是这次。为了让你重新考虑,面试很可能会稍稍影响你的想法。理解他们是因为需要更多的信息还是因为你走错了路而退缩是一个棘手的情商问题,但在我看来,面试的目的。我喜欢集体讨论 2-3 个可能的解决方案,讨论每个方案的利弊,然后选择最佳方案。然后,在回应任何反对意见时,我可以捍卫我的选择,但与其他选项进行比较,或者意识到提供的额外信息会改变哪个选项是最佳的

说出你的思考过程。我发现我在这次面试中的成功很大程度上来自于说出我的假设和解读面试官的反应。从我的经验来看,作为一个产品人,这个人更善于表达和接受,能够引导你的思路朝着正确的方向发展

面试#3:技术分析

这是您经典的 SQL/Python 编码体验。已经有很多资源关注于了解 Groupbys、Joins 和 Sorting。问题大致如下:

  • 联接这两个表,这样 X 列中的每个值都有一个不同的行
  • 给定一个用户会话数据表,找出每个会话的平均长度

理解基本的数据库查询对于在 Unsplash 上的 Caspar Camille Rubin 采访照片中取得成功至关重要

做练习题。我总是发现准备代码面试的最好方法是编码。无论是做 HackerRank 题,还是带着问题上一门课,养成做 DS 题的习惯!

先说后写。在实施解决方案之前,我总是喜欢用伪代码写出它,以确保捕捉到问题的预期结果。有时候(比如这次面试!)我的逻辑会有一个错误会在伪代码里出来,你可以早点发现。一旦我记下了伪代码,我会和面试官进行一个简短的对话,以确保我提出了正确的问题。说出你的思考过程总是一个好主意!

访谈#4 定量分析

最后面试重点是统计。老实说,这次面试是最难的,因为(1)这是一天中的最后一次,所以我很疲劳,而且(2)这与前几次面试中问的产品问题有很大的不同。我在网上找不到任何问题示例,但我得到的问题类似于:

  • 假设一项医学测试产生 1%的假阳性率,而总体真阳性率为 5%,那么该测试产生真阳性的可能性是多少?

对概率的正确把握是成功的关键,这张采访照片由 Edge2Edge MediaUnsplash 上拍摄

重新认识自己的基本概率定律。尽管做了几年数据科学家,但记住条件概率的定义花了我一秒钟(很尴尬,我知道)。重温这些,并能够在业务层面上详细谈论它们,将有助于你轻松地通过面试。贝叶斯法则总是很有用:

用混淆矩阵重新认识你自己。如果 F1 分数和真阳性率没有立即作为这个问题的讨论点出现在你眼前,那么你可以好好复习一下混淆矩阵术语,并将它们转化为非统计示例。我相信我在这方面的专业知识挽救了我之前在面试中的失误

希望这是有帮助的!我知道没有很多技术代码+例子给我们看,但实际上真的没有涉及大量的技术筛选。另外,这个职位的明确目的是协助脸书的产品团队,所以他们绝对是在筛选产品意识而不是技术能力。

祝你好运!

事实引擎架构

原文:https://towardsdatascience.com/the-factengine-architecture-6d90ac09b8b8?source=collection_archive---------42-----------------------

你已经有了一个知识图表

知识表示层架构。图片作者。

FactEngine 计划(www.factengine.ai)旨在从根本上重新思考数据库的概念,并为您提供工具来使用您已经拥有的技术来构建您的知识图……因为您已经有一个了。

该体系结构是在现有数据库上建立知识表示模型的一种方法,不管该数据库是什么。通过这种方式,您可以保留现有的数据库,并使用表示知识图的模型,就像您已经迁移到一个专门构建的模型一样。这种类型的架构不是 FactEngine 所独有的,本文旨在提供对其实现方式的深入了解。

最近,一些公司试图向你出售专门的知识图表和专门的图表数据库。这很大程度上是因为说服你放弃金钱、时间和精力,投资新技术符合他们的目的。没必要这样。

范式转变

范式转变就是要认识到…

" 并不是你的数据是如何存储的才形成了图形数据库或知识图……而是你对数据库拥有的模型、元模型和查询语言决定了你是否拥有图形数据库或知识图 。"

在之前的一篇文章中,我在中介绍了这个概念“什么是图形数据库?”。在这里,我重新介绍了一个对象-角色模型变形为图形和实体关系模型的可视化:

对象-角色模型变形为属性图模式和实体关系图。图片作者。

本质上,如果您在数据库上应用知识表示/工程甚至推理模型,您感兴趣的不是数据如何存储的功能…而是您可以快速轻松地对数据库做什么。使用知识表示语言,如对象-角色建模,使您能够将数据库理解为基于关系或图的。

性能、可伸缩性等,您可以留给您的数据库供应商。如果可以的话,把热情和政治放在一边…关系/SQL 数据库 SQL Server,例如,声称是最快的数据库,它是一个混合图形和关系数据库。所以,我觉得我们需要批评那些试图说服你需要一个专用的图形数据库来享受快速图形查询的图形数据库供应商。

我不想在这里写一篇关于对象-角色建模(ORM)的论文…我邀请你说服自己 ORM 是一种适合知识表示的语言。我在一篇关于数据科学的早期文章中介绍了一些概念,“为什么要学习对象-角色建模?”

事实上,这篇文章宣扬了这样一种观点,即关联数据是市场上几乎所有数据库的权限,而不仅仅是专用的图形数据库。也就是说,有了正确的数据库架构,您可以享受图形数据库或专用知识图的所有好处…FactEngine 恰好实现了这种架构。

例如,GRAKN 数据库在 Cassandra 数据库[1]上使用知识表示,并且在名称上是一个数据库。同样,FactEngine 在任何兼容的数据库上使用知识表示。范例是现有数据库上的知识表示和一种节省时间的查询语言。

互联数据—您已经拥有了

如果你有一个关系数据库,你的数据已经被连接了…你想要的是一种用简单易用的图形查询语言来查询数据的方法。当您使用对象-角色建模作为数据库上的映射覆盖时…这很简单,因为:

关系数据库上的图形查询语言。图片作者。

不限于关系数据库

“现存数据库架构上的知识表示”不限于关系数据库,您同样可以将该架构应用于图形数据库。基本上,您需要做的就是将自然语言图形查询翻译成 SQL 或图形查询语言。FactEngine 的第一次迭代看到我们使用 ODBC 和 SQL,因为它涵盖了最广泛使用的数据库,以及经过数十年研究和开发的数据库,为您提供了您期望从专业数据库获得的所有东西(ACID 合规性、可伸缩性、数据类型、安全性、分片等)。

那些支持递归查询的关系数据库已经支持您想要执行的经典的“朋友的朋友的朋友”类型的查询,这些查询被错误地认为是适合专用图形数据库的领域。

两全其美

通常,当您购买专用的图形数据库时,您会被该数据库的特性所困扰,包括它的查询语言。这里展示的架构让您拥有两个世界的精华…您可以用图形查询语言和 SQL,或者您的数据库拥有的任何查询语言来查询您的数据库。

不可能那么容易!

这真的很简单…从概念上来说!一旦你进行了范式转换,用一种知识表示语言来可视化你的数据库,比如对你的数据库进行对象-角色建模,你所需要关注的就是你想如何查询数据库。如果可以选择图形查询,我觉得大多数人都会选择它。与 SQL 相比,图形查询很容易编写。

技术在哪里?

事实引擎架构已经成为现实。关系数据库上的直接图形查询是现实的。今年,FactEngine 团队将专注于递归查询和知识工程规则在数据库上的实现。

在这个阶段,我认为分享架构并围绕关系数据库和连接数据建立对话是很重要的。有一个很好的理由让你选择现有的数据库…如果没有必要,为什么要把婴儿和洗澡水一起倒掉,转到一个专用的图形数据库呢?

感谢您的阅读。如果时间允许,我会写更多关于对象角色建模、事实引擎和连接数据查询的内容。

  1. Messina A .等,2017 年 7 月,“BioGrakn:基于知识图的生物医学科学语义数据库”,智能系统与计算进展。

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

亚马逊和谷歌游戏工作室“活跃”数据的失败

原文:https://towardsdatascience.com/the-failure-of-active-data-at-amazon-and-google-s-game-studios-345c7fb13324?source=collection_archive---------46-----------------------

数据不会告诉你是否有人会买你的产品。

亚马逊和谷歌是不公平的数据之王。

他们比任何人都了解我们,并利用这些知识向我们销售产品,用广告打击我们。许多人认为亚马逊是零售巨头,但他们正迅速成为像谷歌一样大的广告机器,2020 年将带来约 100 亿美元的广告收入,预计到 2023 年将翻两番。

最近的网飞纪录片《T2:社会困境》揭示了科技公司为了让我们点击而付出的努力。这句话被滥用了,但值得重复一遍,“我们这一代最聪明的人正在思考如何让人们点击广告。” (Jeff Hammerback,Cloudera 联合创始人)

但是,亚马逊和谷歌在让我们消费和互动方面是多么娴熟,这两家公司都没有能够在互动娱乐方面取得成功。

最近几天,有消息称亚马逊的游戏工作室完全瘫痪,谷歌甚至在发布一款游戏之前就关闭了其 Stadia 游戏工作室

不止一家,而是两家这个星球上最大、最具科技含量的公司都无法成功制作视频游戏。最了解我们的两家公司,它们的整个商业模式都是建立在了解我们的兴趣和行为的基础上的,怎么可能做不出一款任何人都想玩的电子游戏呢?

主动与被动数据的谬误

当你接触到大量的数据时,你会想要分析它。当你比地球上的任何人都能接触到更多的人的数据时,使用这些数据的需求就变得非常迫切。你为什么不呢?对于亚马逊和谷歌来说,是客户数据让你的公司成为世界上最大、最赚钱的公司。

Clayton Christensen 在他的书《与运气竞争:创新和客户选择的故事》中解释了这一现象。Christensen 博士将这种对运营数据的过度强调称为主动数据对被动数据的谬误(与运气竞争,第 181 页,Christensen 等人)。他解释道:

“事实证明,这些数据非常响亮。它冲你大喊,让你关注它,优先考虑它,改进它。很容易跟踪和衡量…从被动数据的非结构化混乱状态迁移到令人放心的具体主动数据感觉很好。”

(与运气竞争,第 184 页,克里斯滕森等人)

Christensen 博士所说的被动数据是直觉、情感和经验的杂乱混杂,构成了客户要做的工作——即客户在特定情况下试图取得的进展。谷歌和亚马逊都是从混乱的想法开始创业的——他们只知道人们需要在生活中完成某些事情。谷歌暗示人们需要在网上轻松找到信息。亚马逊认为,人们可能想通过互联网买书,而不是去书店。两家公司的商业模式都是建立在人们没有好的解决方案的特定问题所产生的创新之上。当这些公司成立时,没有办法成为“数据驱动的”,因为活动数据不存在。他们拥有的唯一数据是定义要完成的工作的被动数据。

今天,这两家公司都太大太复杂,无法基于被动数据(情感和直觉)做出决策——所以他们整体转向主动数据。

亚马逊的数据驱动视频游戏

为了创造他们的超级热门游戏,亚马逊雇佣了一些最优秀的开发人员,包括《传送门》、《孤岛惊魂》和《生化奇兵》等大型特许经营背后的头脑。但是主持这个节目的人,长期以来一直是亚马逊人的迈克·弗拉兹尼,以前从未制作过电子游戏。正如贾森·施里尔和普里亚·阿南德在他们最近的[彭博文章](https://www.bloomberg.com/news/features/2021-01-29/amazon-game-studios-struggles-to-find-a-hit)中透露的,他试图以经营亚马逊其他业务部门的方式制作游戏,查看数据并跟随趋势:

据两位曾与他密切合作的人说,拉兹尼喜欢说任何事情都是可以衡量的。这种哲学在硅谷很常见,但游戏行业的资深人士对此深恶痛绝。“没有一个成功的人是从标准开始的,”帮助设计最初的 Xbox 的谢默斯·布莱克利说。

Frazzini 说,“任何事情都可以被测量”是科技行业中一句非常普遍的格言。在 Adobe 工作了一段时间后,我可以证明,利用数据对于说服你的上级或同事一个想法是好的是绝对重要的。当你可以访问的数据的数量和种类变得如此密集时,挑战就出现了,人们开始在数据中寻找并发现并不存在的模式和主题(这是克里斯滕森博士关于创新数据的理论中的第三个谬误,即符合数据的谬误)。趋势和见解令人欣慰,因为它们提供了真相的假象——但事实上,数据只提供了真相的扭曲表现。当谈到制作视频游戏时,为什么有人玩游戏或为什么游戏受欢迎背后的复杂性是如此复杂,以至于没有数据或趋势可能代表它为什么有效的全部现实。游戏行业的创意人员凭直觉知道,创造一个成功的互动娱乐体验更多的是关于情感和找出什么好玩,而不是数据告诉你什么。然而,这个概念与数据丰富的科技公司是对立的:

公司是由数据驱动的,员工需要写六页纸的文件来批准重大决策。另一方面,在游戏开发中,办公室里经常挂在嘴边的一句话是“寻找乐趣”它指的是改变和润色游戏的小方面,找出什么使体验变得愉快。结果只能用情感来衡量,这就是为什么许多开发者说负责人有制作游戏的经验是至关重要的。

数据在提供相关性方面很棒(这个人看起来像那个人),但它实际上不会告诉你为什么有人购买产品背后的因果力量,或者在这种情况下,为什么有人玩视频游戏背后的“乐趣”。根据这篇文章,Frazzini 的策略完全是关于相关性的——如果我们做一个像这样的游戏,它会赚很多钱:

四名开发者说,当 Frazzini 拿着 VentureBeat 上关于当月赚钱最多的游戏的最新文章,要求他们追逐一种新趋势时,一些会议被转移了方向。该团队最终设计了流行游戏的较小版本,这是一个绝望的策略…

来自 PexelsAndrea Piacquadio 的照片

这种策略虽然有缺陷,但实际上可能在亚马逊的一个电子商务部门奏效。有了世界上所有的数据,Frazzini 可能已经能够构建新的功能,并在飞行中追逐电子商务趋势(就像亚马逊一样)。问题是,他不是在经营一个现有产品的一次性部门,他试图制作全新的视频游戏。也许比任何其他类型的产品,视频游戏更需要你为玩家解决潜在的工作。看起来 Frazzini 从来没有问过那是什么工作:

游戏工作室甚至建立了他们自己的一套独立的原则,尽管信条经常改变,有时还相互矛盾,在那里工作的四个人说。每一个游戏世界都应该容纳尽可能多的玩家,同时又能享受单人游戏的乐趣。他们必须在使命召唤的规模上取得巨大的财务成功,但也必须具有创新性,并且不同于世界上以前见过的任何东西。对于有经验的游戏开发者来说,这些规则看起来像是不发布任何东西的万全之策。

( 亚马逊游戏工作室苦苦寻找热门 ,杰森·施莱尔和普里亚·阿南德)

去年 5 月,当亚马逊的唯一一款游戏《坩埚》在 PC 上发布时,我有机会玩了它——它无疑实现了弗拉津尼的梦想。这款游戏融合了市面上最畅销、最受欢迎的游戏——从《堡垒之夜》、《英雄联盟》、《守望先锋》和其他大型多人游戏中汲取元素。问题是,通过试图成为一切并迎合所有人,这个游戏没有迎合任何人。就在发布一个月后, Crucible 被拉回封闭测试版

何时使用主动数据与被动数据

归根结底,数据分析关乎责任。亚马逊的文化是如此受数据驱动,以至于它的游戏领导层认为自己对数据和趋势负有太多的责任,在这个过程中忽视了它所雇佣的天才开发人员的直觉和被动数据(多年的经验、知识和对游戏乐趣的直觉)。在创新时,不要让数据驱动你的过程——要倾向于你试图解决的问题和你希望特定客户拥有的体验。

一旦你很好地处理了你正在解决的问题,那就是你将活动数据带入流程的时候了。就游戏而言,这要等到有人真正玩并体验了游戏的机制、叙事和循环之后才会发生。在这里,您将定义外部客户利益指标,这些指标会告诉您您在完成客户或潜在客户的工作方面做得如何。例如,如果一个游戏工作室决定制作一个角色扮演游戏,他们可能会测量在任务线的某些区域之间穿行所花费的平均时间。大量的穿越时间可能表明任务可能会使玩家感到疲劳,并阻碍了对故事的享受。

避免引入实际上不能告诉你如何解决客户工作的活跃数据。这些通常是广泛可用且易于访问的指标和 KPI。因为你有它们,你可能会觉得有必要以某种方式使用它们——但只有当它们实际上告诉你一些关于你试图解决的工作的事情时,它们才是必要的。既然我们在谈论视频游戏——让我们用总游戏时间作为例子。游戏工作室直觉上希望人们花更多的时间玩游戏。使用总游戏时间,看起来是一个显而易见的 KPI。但是,如果花费的时间被夸大了,因为在任务线的各点之间旅行需要很长时间——这是在剥夺游戏体验,而不是提高游戏解决工作的能力。相比之下,测量任务线中各点之间的穿越时间——虽然后者可能更难测量,但它将是一个更好的玩家体验指标。

如果你足够成功,达到了利用活跃数据的阶段,问责就可能开始成为一个挑战。人们开始对被动数据过于自信。在这种情况下,告诉他们某些东西不工作的数据指标开始感觉像是对最初让他们达到这一点的过程的攻击。我以前从未帮助制作过视频游戏(如果你的游戏工作室需要一名分析专家,我的 DMs 是开放的……),但我帮助过许多公司制定测量计划和 KPI。我见过领导者过于依赖活跃数据来尝试和构建新产品,而当活跃数据不符合他们的观点时,他们就会打折扣。正确的方法是在创新时依靠被动数据,并利用主动数据来确定创新的效果。与任何事情一样,这两个光谱之间的界限很难看清,但有了要做的工作和主动与被动数据的框架,您将对如何解决具有挑战性的问题有更清晰的看法。

“寻找乐趣”

太多时候,商业领袖把他们认为具体、可靠的数据来源视为水晶球,告诉他们在哪里取得成功——但正如我们已经讨论过的,数据在告诉你如何创新方面很糟糕。另一方面,数据能很好地告诉你,你决定要解决的工作完成得有多好——但你必须先知道这项工作是什么。

谷歌从来没有弄清楚它的视频游戏抱负是什么,而且也没有给他们的团队足够的时间去弄清楚

亚马逊一直在努力适应其高度数据驱动的文化来制作视频游戏——他们还没有完成。在写这篇文章的时候,一封来自亚马逊新 CEO 的信加强了他们对游戏工作的承诺。希望亚马逊游戏工作室的领导层能够从他们的错误中吸取教训,让他们有才华的创作者“找到乐趣”,而不是追逐潮流。

https://camwarrenm.medium.com/】如果你喜欢这篇文章,请阅读更多,并在媒体上给我一个关注:https://camwarrenm.medium.com/

**你也可以在推特上获得更多我的想法:@ camwarrenm

邮件至:cwarren@stitcher.tech

ImageNet 的衰落

原文:https://towardsdatascience.com/the-fall-of-imagenet-5792061e5b8a?source=collection_archive---------21-----------------------

数据隐私和再现性的挑战

(来源:图片由作者和 Shutterstock 提供)

上周,我开始研究一个机器学习的例子,这个例子使用了非常流行的 ImageNet 数据集。这是每个机器学习实践者都知道的经典图像分类问题。这里有一个图像,分类它属于 1000 个类别中的哪一个。

但是这次我注意到了一些奇怪的事情。首先,网站关闭了,当它恢复时,一切都变了。

我并没有多想,直到我意识到下载散列是不同的,并且模型的准确性略有偏差。直到我偶然发现《连线》杂志的这篇文章,一切才开始联系起来。

ImageNet 的维护者修改了数据集中的每一张图片,模糊了人脸。

数据保密

这一决定背后的理由是高尚的。他们想让数据集更具“隐私意识”

今天,大多数最先进的计算机视觉模型都在 ImageNet 上进行了预训练。其中呈现的自然场景和物体为大多数计算机视觉问题提供了一个强大的基础。

该团队发布的研究论文《T2,一项关于 ImageNet 中脸部模糊的研究》告诉了我们原因。共享的日常图像通常包含敏感信息。向公众发布大型数据集显然会带来大量潜在的隐私风险。由于 ImageNet 挑战不是关于识别人,而是关于识别物体,团队决定推进模糊数据集中人的脸。最终,他们修改了 243198 张图片。

(来源:图片来自ImageNet中的人脸混淆研究)

你很难找到一个不同意保护人们隐私的人。匿名数据是数据科学的核心部分,保护从个人身份到健康记录的一切。无数的诉讼都集中在对人们数据的不当管理上,团队让数据容易受到黑客和攻击者的攻击。你不用很努力就能意识到,即使是世界上最大的组织也遭受过泄露未受保护信息的重大攻击。

在机器学习中,我们有机会从安全的核心开始。互联网开始于一个不同的时代,在那个时代,安全和隐私是事后才想到的。互联网的创造者看不到所有会出错的东西,也看不到所有利用互联网设计弱点的方法。但今天,我们可以看到这些问题在一英里之外出现,我们现在可以通过将隐私和安全作为数据科学的核心来解决这些问题。这已经发生了,因为我们已经有了致力于隐私和安全的整个机器学习领域。

但是有一个问题。如果我们希望隐私保护成为机器学习的核心,那么我们必须接受我们的数据会不断变化。把我们引向一个更大的问题。

再现性。

再现性危机

在机器学习中有一个再现性危机,而且它只会变得更大。

《自然》杂志 2016 年再现性调查的主要结果(来源: CMU ML 博客)

再现性是科学方法的基础。为了在化学和量子力学中获得可靠的见解,我们依赖于再现性,机器学习也不例外。神经网络是计算机视觉背后的主要技术,其规模和复杂性都有了巨大的增长,通常需要大型 GPU 集群、大规模数据集和对训练过程的微妙调整,这些往往在出版物中没有报道。即使源代码公布了,复制研究的成本可能会让除了资金最雄厚的机构之外的所有机构都难以企及。如今,一些最大的模型需要花费数千美元甚至数百万美元来训练。OpenAI 的 Dota 基于强化学习的系统每天运行费用超过 25,000 美元,因为它模拟了比赛。

这个问题在机器学习研究中变得如此普遍,以至于 2019 年神经信息处理系统(NeurIPS)大会推出了一个再现性清单,其中包含“一个数据集或模拟环境的可下载版本的链接”。

因此我们陷入了僵局。如果我们不能使用用于训练模型的原始数据集,我们就不能再现它。我们可以在新的数据集上重新训练模型,但我们不能复制或比较以前的研究。

这意味着所有建立在原始 ImageNet 上的模型现在都无法重新创建。

十多年来每个人都参考和依赖的挑战不再能够作为规范的计算机视觉基准,因为数据集已经不一样了。由于没有实现可复制性的途径,ImageNet 作为基准计算机视觉数据集的地位已经下降。

新的希望

这就把我们带到了问题的关键。我们如何保持再现性,同时仍然允许数据包含隐私变化?

我们必须开始将数据视为一等公民。数据集开发阶段不再仅仅是模型开发之前的一个步骤。这是一个持续的过程。数据集的变化是不可避免的。从减少偏倚到提高准确性,对数据集的修改是不可避免的。我们需要接受数据变化,而不是回避它们。

但这是否意味着我们失去了再现性?如果我们一开始就解释清楚就不会了。我们已经习惯了这种对代码的思考方式。我们知道它是动态的。会改变的。许多人将会在这上面合作。变化是意料之中的—新功能、错误修复、性能改进。我们还需要将这种思维扩展到数据上。

但与在软件开发中编写代码不同,机器学习有两个移动的部分,代码和数据,它们产生我们的模型。我已经在完成机器学习循环中广泛地写了这个主题,要点是,我们需要支持在下图所示的每个“两个循环”中实现迭代的过程和工具。

机器学习生命周期中的“两个循环”。在机器学习开发中,我们有两个移动的部分需要结合在一起以产生我们的模型:代码和数据。这两个循环代表了每一个处于不断迭代中的开发生命周期。(来源:完成机器学习循环)

你不仅需要能够迭代,还需要跟踪所有移动的部分以获得可再现性。对数据集的每一次修改和我们代码中的任何新的训练技术都需要被捕获,以重现从它们得到的模型。当我们的数据改变时,我们需要我们的实验过程来更新。2

这就是像厚皮动物这样的工具的用武之地。Pachyderm 是一个数据科学和处理平台,具有内置的版本控制和数据沿袭功能。它的核心是数据版本控制,以支持数据驱动的管道。它起着“生命系统”的作用。管道依靠它们的输入数据来告诉它们何时开始。在我们的情况下,每当数据集被修改时,就会训练一个机器学习模型,从而保持我们的数据安全并保持我们的模型相关。

当新的、模糊的面部图像被提交到版本化的数据存储库时,连接的管道被自动重新运行,以保持整个系统的可再现状态。(来源:图片由作者提供)

如果 ImageNet 在 Pachyderm 中被组织为数据集,隐私感知版本可能会覆盖原始数据集。任何连接的模型训练管道,无论是原始的 AlexNet 代码还是最先进的预训练模型,都将自动在新的数据集上运行,为您提供一个完全可再现的模型来进行任何实验。允许您的数据发生变化并保持再现性。

像 Pachyderm 这样将数据放在第一位并考虑变化的工具对于将数据隐私引入人工智能至关重要。没有它们,我们会发现自己迷失在不断变化的数据和代码的复杂性中。

结论

在日益现代化的世界中,数据隐私对于保护我们的安全至关重要。但是,数据隐私的改善往往是以牺牲可再现性为代价的。ImageNet 最近的变化使无数模型成为孤儿,没有办法重现它们。

我们可以通过采用支持更改的工具,在不影响可再现性的情况下,将隐私更改纳入我们的数据集。Pachyderm 是我管理不断变化的数据的首选工具。它极大地提高了在我的机器学习系统上迭代的可靠性和效率。这些类型的工具对于为人工智能的安全可靠的未来铺平道路至关重要。

我写了一篇关于管理机器学习生命周期的广泛文章,完成机器学习循环,更深入地探讨了这个主题,或者关于我在 NLP 和语音识别方面的一些工作,请参见我的书NLP 和语音的深度学习

困扰人工智能的错误哲学

原文:https://towardsdatascience.com/the-false-philosophy-plaguing-ai-bdcfd4872c45?source=collection_archive---------18-----------------------

埃里克·j·拉森和人工智能的神话

来源:弗兰克·查马基转自 Unsplash

预言人工智能(AI)领域并不陌生。在 1960 年的福特杰出演讲上,经济学家希尔伯特·西蒙宣称,在 20 年内,机器将能够完成人类可以完成的任何任务。1961 年,信息论的创始人克劳德·香农预言科幻风格的机器人将在 15 年内出现。数学家 I.J. Good 构想了一个失控的“智能爆炸”,一个比人类更聪明的机器迭代提高自身智能的过程。古德在 1965 年写道,他预测爆炸将在二十世纪末到来。1993 年,Verner Vinge 创造了这个爆炸的开端“奇点”,并声称它将在 30 年内到来。雷·库兹韦尔后来宣布了一个历史定律, 加速回归定律 ,预测奇点将在 2045 年到来。最近,埃隆·马斯克声称超级智能离我们不到五年,从斯蒂芬·霍金到尼克·博斯特罗姆的学者都警告我们流氓人工智能的危险。

炒作不仅限于少数公众人物。每隔几年就会有人工智能领域研究人员的调查,要求他们预测我们何时会实现人工一般智能(AGI)——机器具有一般用途,至少和人类一样智能。来自这些调查的估计中值给出了在 21 世纪 20 年代的某个时候 AGI 有 10%的可能性,在 2035 年到 2050 年之间 AGI 有二分之一的可能性。该领域的主要研究人员也做出了惊人的预测。OpenAI 的首席执行官写道在未来几十年,计算机“将做几乎所有的事情,包括做出新的科学发现,这将扩展我们的‘一切’概念,”谷歌 Deepmind 的联合创始人“人类水平的人工智能将在 2020 年代中期被超越。”

这些预测是有后果的。一些人称 AGI 的到来是一种生存威胁,他们怀疑我们是否应该停止技术进步以避免灾难。其他人正投入数百万的慈善基金来避免 AI 灾难。例如,机器智能研究所,已经获得了数百万的资助,用于“确保比人类更聪明的人工智能产生积极影响。”

人类水平的人工智能即将到来的论点通常吸引了我们迄今为止在机器学习方面看到的进展,并假设它将不可避免地导致超级智能。换句话说,让现有的模型变得更大,给它们更多的数据,这就是 AGI。其他论点只是引用上述专家调查本身作为证据。例如,托比 for 在他的书《悬崖》中认为,AGI 对人类构成了生存威胁(他认为在未来 100 年内,毁灭人类的可能性为 1/10)。在讨论它将如何被创造时,他首先引用了在人工智能上发表的学术论文的数量和人工智能会议的出席人数(这两者在最近几年都出现了飙升),然后写道

一般来说,专家们并不认为 AGI 是一个不可能实现的梦想,而是认为它在十年内有可能实现,在一个世纪内更有可能实现。因此,让我们以此为起点来评估风险,并考虑如果 AGI 被创造出来会发生什么。(第。142)

是什么让这些研究人员如此自信地认为目前人工智能的方法是正确的?或者在狭窄领域解决问题只是程度上的不同,而不是种类上的不同,与真正的通用智能不同?圣达菲研究所教授 Melanie Mitchell 最近称狭义人工智能——结构化环境中定义明确的任务,如预测肿瘤或下棋——的进展将我们推向 AGI,这是人工智能研究中最重要的谬误。她引用休伯特·德雷福斯的话,指出这类似于声称猴子爬树是登上月球的第一步。没有支持这种谬论的论据,只有对当前趋势的推断。但是 T2 有反对的理由。

机器学习工程师埃里克·j·拉森(Erik J. Larson)反对人工智能的正统观点。在 人工智能的神话 中,拉森加入了抗议人工智能领域正在追求一条无法通向广义智能的道路的一小部分声音。他认为,当前的方法不仅基于对知识创造的根本误解,而且还积极阻止进步——无论是在人工智能还是其他学科。

Larson 指出,当前的机器学习模型是建立在归纳的原则之上的:从特定的观察中推断模式,或者更一般地说,从经验中获取知识。这部分解释了当前对“大数据”的关注——观察越多,模型越好。我们给一个算法输入数以千计带标签的猫的图片,或者让它下数百万盘国际象棋,然后它将输入之间的哪些关系关联起来,从而产生最佳的预测准确度。一些模型比其他模型更快,或者在模式识别方面更复杂,但本质上它们都在做同样的事情:从观察中进行统计概括。

这种归纳方法对于在明确定义的输入上为特定任务构建工具很有用;例如,分析卫星图像、推荐电影和检测癌细胞。但是归纳法不能创造人类思维所体现的通用知识。人类发展出关于世界的一般理论,通常是关于我们没有直接经验的事物。归纳法意味着你只能知道你观察到的东西,而我们许多最好的想法并不是来自经验。事实上,如果他们这样做了,我们就永远无法解决新的问题,或创造新的东西。相反,我们解释恒星、细菌和电场的内部;我们创造计算机,建设城市,改变自然——人类创造力和解释力的壮举,而不仅仅是统计相关性和预测。拉森在讨论哥白尼时写道

只有首先忽略所有的数据或重新构思它,哥白尼才能拒绝地心说模型,并推断出一个激进的太阳系新结构。(请注意,这提出了一个问题:“大数据”会有什么帮助?这些数据都符合错误的模型。)

事实上,大多数科学都包括寻找理论来解释不被观测者所观测到的现象。我们用重力场解释苹果坠落,用大陆漂移解释山脉,用细菌解释疾病传播。与此同时,当前的人工智能系统受到它们所观察到的事物的限制,完全无法对未知事物进行理论化。

由归纳引起的困惑并不是什么新鲜事。大卫·休谟是第一个指出其明显的逻辑缺陷的人:没有有限数量的观察可以证明一个普遍的原则。无论我们见证了多少片绿叶,我们都不能断定所有的叶子都是绿色的。这在那些相信归纳是人类知识基础的人中间引起了轩然大波。例如,Bertrand Russell哀叹道如果休谟的问题不能解决,那么“理智和疯狂之间就没有智力上的区别。”

20 世纪的两位哲学家解决了这个问题,他们注意到人类不是通过归纳来创造知识的:查尔斯·桑德斯·皮尔士和卡尔·波普尔爵士。两人都注意到,我们的知识依赖于猜测和检验,依赖于不合理和不合理的直觉跳跃,依赖于反复试验。人类猜测一般,用观察来反驳我们的猜测。我们创造性地推测世界的各个方面是如何工作的(光速是恒定的,花生酱加青豆味道很好),并用批评和观察来否定那些错误的想法。我们在秋天看到一片棕色的叶子,并断定不是所有的叶子都是绿色的。

大胆的想法、不合理的预期和思辨的思想是我们解释自然的唯一手段:我们唯一的工具,我们抓住自然的唯一工具。我们必须冒险让他们赢得我们的奖品。我们当中那些不愿意让自己的观点面临被反驳的危险的人,是不会参与科学游戏的。

——卡尔·波普尔,科学发现的逻辑

皮尔士把猜测和检查的方法称为“溯因法”(尽管这个术语现在有各种各样的用法)。我们也没有好的绑架理论。要有一个,我们必须更好地理解人类的创造力。换句话说,在我们有可能产生真正的人工智能之前,我们需要一场解释绑架的哲学和科学革命。只要我们继续依赖归纳,人工智能程序将永远是预测机器,无可救药地受限于它们被输入的数据。

拉森将人工智能狭隘的解谜方法的焦点追溯到该领域的创始人艾伦·图灵:

图灵的伟大天才在于清除了理论上的障碍和对设计自主机器可能性的反对,但在这样做的时候,他缩小了智能本身的范围和定义。难怪人工智能开始生产狭隘的解决问题的应用程序,而且直到今天它仍在这样做。

图灵在他职业生涯的早期就认真对待创造力的问题。他称之为“直觉”,并想知道如何将它编入机器程序。然而,渐渐地,图灵开始用死记硬背解决定义明确的问题来识别智力。这正是机器擅长的领域——现在仍然如此。

对归纳的关注不仅阻碍了真正人工智能的发展,也开始影响其他科学领域。拉尔森特别提到了神经科学,认为许多研究人员已经忘记了理论在推进我们的知识中所扮演的角色,并希望通过更准确地绘制大脑地图来真正理解人脑。然而,假设这样的地图被开发出来——然后呢?只有当我们有一个理论要测试时,地图才有用。

把科学探究的焦点缩小到机械问题解决和信息处理的问题上,就是忘记了科学的主要作用是寻找好的解释。我们想知道为什么是,而不是简单地做预测。数据可以证实或证伪我们的理论,但理论重视数据,而不是相反。理论不会神奇地出现在越来越大的数据集中。他们创造性地推测。

人工智能的神话出现在贬低人类的创造力和知识创造能力成为智力时尚的时候。我们不断地被提醒,我们有偏见,不理性,容易被误导,固执,不讲道理。拉森提醒我们人类是特殊的。我们能够凭直觉发展疫苗,能够凭创造性的洞察力改善我们的环境,能够创造能够解释宇宙的深刻解释。而且没有太多的训练数据。

在 AWS 上部署 ML 应用的最快方式,无需最佳实践

原文:https://towardsdatascience.com/the-fastest-way-to-deploy-your-ml-app-on-aws-with-zero-best-practices-df15c09eead7?source=collection_archive---------22-----------------------

在 15 分钟内将一个机器学习 API 发布到互联网上

您一直在开发您的 ML 应用程序,一个现场演示很快就会出现。你想把它推到 Github,添加 Docker,并重构代码,但是你昨天花了一整天在一些你仍然没有真正理解的愚蠢的pickle错误上。现在,在演示之前,您只有 1 个小时的时间,您的 ML 应用程序需要在互联网上可用。你只需要能够通过浏览器访问你的模型 15 秒钟,向一些高管展示。

照片由 Unsplash 上的Braden colum拍摄

本教程是在 AWS 上为您的模型创建公共端点的“零最佳实践”方法。在我看来,这是创建模型端点的最短路径之一,假设您没有任何其他工具设置(SCM、Docker、SageMaker ),并且已经用 Python 编写了一个小应用程序。

你需要:

  1. AWS 控制台
  2. 一个终端
  3. 您的 ML 应用程序

如果你没有 ML 应用程序,只是想跟着做,这里有我今天早上写的。我的应用程序是用 FastAPI 构建的,因为它…很快…但这将适用于任何 Flask/Dash/Django/Streamlit/无论什么应用程序。

创建 EC2 实例

登录控制台,搜索“EC2”并导航到实例页面。

单击“启动实例”。现在,您必须选择一种机器类型。你很着急,就直接点你看到的第一个符合条件的(亚马逊 Linux 2 AMI)。

您决定保留默认设置(保留 t2.micro ),然后单击“查看并启动”。

创建新的密钥对,单击“下载密钥对”,然后启动实例。

打开端口 80

当我们在控制台中时,让我们打开端口 80 来访问 web 流量。导航回实例页面并单击您的实例。

我已经删除了这个

转到“Security”选项卡,在 security groups click 下应该有一个您可以点击的链接,看起来像是sg-randomletters (launch-wizard-3)。在下一页上,滚动到底部,然后转到“编辑入站规则”。

添加一个带有0.0.0.0/0 CIDR 区块的所有交通规则,然后保存。

将文件复制到实例中

现在我们的实例已经准备好了,所以让我们把文件准备好。为了简单起见,我们可以设置两个环境变量。KEY是您之前下载的.pem文件的路径,HOST是您可以在实例页面上查看的公共 IPv4 DNS 名称。

编辑下面的示例以包含您的信息。这些命令假设 macOS/Linux,对于 Windows 检查出 PuTT Y。

export HOST=ec2-35-153-79-254.compute-1.amazonaws.com
export KEY=/PATH/TO/MY/KEY.pem

现在我们可以复制我们的文件了。同样,如果你没有 ML 应用程序,克隆我的一个,并cd到目录中。

git clone [https://github.com/kylegallatin/fast-bad-ml.git](https://github.com/kylegallatin/fast-bad-ml.git)
cd fast-bad-ml

现在复制一切。

chmod 700 $KEY
scp -i $KEY -r $(pwd) ec2-user@$HOST:/home/ec2-user

键入yes,你会看到文件正在被复制。如果你得到消息说你的权限在关键文件上过于开放,只要运行chmod 700 $KEY就可以了。

设置您的实例

现在是时候ssh进入并开始一个会话,这样我们就可以运行我们的应用程序了。

ssh -i $KEY ec2-user@$HOST

运行pwd && ls会显示你在/home/ec2-user中,之前目录的内容已经被复制。现在cd进入该目录并设置 Python(假设您有一个requirements.txt)。

cd fast-bad-ml
sudo yum install python3
sudo python3 -m pip install -r requirements.txt

运行并测试您的应用

现在一切都安装好了,使用主机0.0.0.0在端口 80(默认 web 流量)上启动您的应用程序(绑定到所有地址— 127.0.0.1不起作用)。

下面的命令是我的 FastAPI 应用程序的uvicorn命令,但只要主机/端口相同,您可以替换该部分以适应您的应用程序。

sudo /usr/local/bin/uvicorn app:app --reload --port 80 --host 0.0.0.0 &

&在后台运行该进程,因此当您退出会话时它不会停止,并保持可用。添加nohup以重定向日志供以后阅读。

您现在可以从互联网访问该应用程序。使用与之前相同的公共 IPv4 DNS,并将其复制到浏览器中。我已经配置了/路由来返回一个简单的消息。

如果您已经公开了一个接受查询参数的/predict方法,那么您也可以通过 URL 传递这些参数来获得您的预测。格式为$HOST/$ROUTE/?$PARAM1=X&$PARAM2=Y...

结论

我只想提醒一下,这和生产没有任何关系。即使我们引入了 Docker 和 Kubernetes 的规模,真正的“生产”还需要测试、自动化 CI/CD、监控等等。但为了让你准时参加演示?没有比这更好的了。祝你好运!

获取 BigQuery 表的最快方法

原文:https://towardsdatascience.com/the-fastest-way-to-fetch-bigquery-tables-352e2e26c9e1?source=collection_archive---------6-----------------------

从 BigQuery 获取表的最快方法的基准。还介绍了 bqfetch:一个简单易用的快速抓取工具。

作者图片

作为一名数据工程师,我想尽可能快地从 BigQuery 获取表。我还需要获取这些表格作为熊猫数据帧。因此,我考虑了许多备选方案,我已经使用多个框架对许多实现进行了测试和基准测试,在本文中,我将向您展示我构建的一个工具,该工具允许我以数据帧的形式获取 BQ 表,并获得最佳性能。

以下所有建议都是基于在 Google Compute Engines (GCE)上测试的基准,根据您使用的机器和互联网带宽,可能存在一些更好的实现。

旧方法

使用 GCS 的提取方法和使用 dask 的多重处理

从 BigQuery 获取数据的一个众所周知的方法如下:

  • 使用 GZIP 压缩将表提取到 Google 云存储中。它将创建多个 csv 文件,每个文件包含表中的一些行,使用 GZIP 格式压缩。使用 BigQuery API 时,此操作没有成本。
  • 使用 Dask 框架,使用read_csv(path_to_gcs_bucket)方法获取桶中的所有文件,使用机器上所有可用内核的多处理。这个方法返回一个懒惰的 Dask。因为懒惰而适合内存的数据帧。如果您需要将完整的 df 加载到内存中,那么可以使用compute()方法。

这种方法可以获得合适的结果,但是有两个主要的瓶颈:

  • 我们必须使用 GCS 来将表转换成多个文件,所以我们认为这不是获取数据的最合适的方法,我们应该有一个更简单和更快的方法。此外,表的压缩及其提取到 GCS 需要时间,所以我们肯定要删除这一部分。
  • 使用这种方法,整个表被同时取出,如果不使用 Dask 的compute()方法,我们不能正确使用数据帧,如果使用它,df 必须适合内存。

新方法

通过 BQ 存储 API 使用分块表的新方法

尽管有其局限性, BigQuery 存储 API 具有直接获取表的优势,因此我们不必担心 GCS 部分,这使我们在使用第一种方法时感到恼火。

使用示例解释该方法:

  • 假设我们有一台 16GB 可用内存的机器。为了有效地使用这个内存,我们希望获取最大可用空间的数据,然后处理它,并重复这个过程,直到表被完全获取。所以第一步是把整个表分成大小为<16Gb. However, a DataFrame object is greater than the raw fetched data (basically 1/3 bigger than the fetched data). We can now say that if we fetch ~10.7GB of data we’ll have a DataFrame of size 16GB that will fit into memory. So the idea is to chunk the whole table in N tables of size ~10.7GB. Ex: for a table of size 200GB we’ll create 19 tables of size ~10.7GB.
  • Once we have created all the chunked tables, we just have to fetch them sequentially using the BigQuery Storage API.

But wait, why do we have do divide the main table in chunked tables? Why can’t we just use a filter with an “IN” SQL statement in order to select only some rows at each time? Here is the reason.

The filter bottleneck

The following code uses BigQuery Storage API to fetch a table by applying a row filter (only select some rows that match a certain condition in the table). Thus, only the rows that match the SQL expression given in the TableReadOptions constructor will be fetched. The table is of size 220GB and the estimated size of the rows that match a product_id = 1 or 2 is ~2GB.

Demo of BQ Storage fetching using an “IN” SQL statement

Now when looking at the network usage of the compute engine, we figured out that when fetching this chunk of size 2GB from the table of 220GB, the bandwidth peak is only at 2MB/s 的多个表。

获取整个表时,带宽峰值约为 8MB/s

但在取 22GB 的小表时,网络峰值 130MB/s

提取小块表时,带宽峰值约为 130MB/s

这是由于对 BigQuery 存储读取 API 的限制。更准确地说,这是因为我们使用了一个过滤器(SQL 中的“IN”子句),而 API 将这个过滤器的大小限制为 10MB,因此对于大表来说性能很差。

结论:当表很小(~≤4GB)时,使用这个 API 获取带有行过滤器的表要好得多。

多个表中使用行过滤器提取 75 万行的时间基准:

在不同大小的表中获取 75 万行的时间

这就是为什么我建议绕过这一限制的解决方案是将原始表分成可以更快获取的更小的表。使用这种方法,将表分成更小的表允许您使用相同的时间(在前面的例子中是 20 秒)获取所选的行。

bqfetch 简介

希望我已经用以前的技术创建了一个工具,我正在我的新项目中使用它。

作者图片

我真的鼓励你访问 Github 页面查看文档。

该工具背后的思想与我们之前描述的相同,但有一些特殊之处:

  • 从整个表中,选择一个具有最不同值的index column(我们可以很容易地将一列分成许多大小大致相同的块)。一个好的列可以是 ID 列,也可以是包含每个不同值的大约。相同的行数。
  • 然后执行一个SELECT DISTINCT index_column来获得一个。表中元素个数的估计。
  • 计算整个表的大小(以 GB 为单位),并应用一个公式来计算我们需要使用机器上的可用内存来划分表的块的数量。所有这些复杂的事情都是在后台完成的,你只需要指定一个 index_column 来将这个表按照这个列的块进行划分。
  • 现在我们有了块的数量,算法返回一个块列表,每个块包含 index_column 的多个值。
  • 通过循环这些块,我们只需要获取每个块。在每次读取之后,块被划分为在 BigQuery 中创建的最佳数量的表,这些表位于表使用的同一数据集中。然后,使用 BigQuery 存储 API(有或没有多重处理)获取表。最后,删除以前创建的表。
  • 使用这种技术,内存将得到最佳利用,如果您指定正确的块大小,内存将不会溢出。

演示

  • 首先,我们必须创建一个BigQueryTable对象,它包含存储在 GCP 的 BigQuery 表的路径。
  • 创建一个获取器,在参数中给定 service_account.json 文件的绝对路径,该文件是必需的,以便在 GCP 中执行操作。
  • 给定column名称和chunk size,将整个表分成块。在这种情况下,选择“id”列是完美的,因为该列的每个值都出现了相同的次数:1 次。关于块的大小,如果by_chunk_size =2,那么在机器上获取的每个块的大小都是 2GB。因此,它必须适合内存。您需要节省 1/3 的内存,因为 DataFrame 对象的大小比原始获取的数据大,正如我们前面看到的。
  • 对于每个块,获取它。nb_cores =-1 将使用机器上可用的内核数量。parallel_backend = '台球' | 'joblib' | '多重处理'指定要使用的后端框架。如果by_chunk_size =2,那么返回的数据帧大小将是 2,66 (2+2*(1/3))(这在很大程度上取决于表的模式,所以请在此之前自行测试)。

多重处理

是的,这个工具使用台球、joblib 和多处理后端实现了多处理。您只需设置nb_cores,获取将使用nb_cores进程启动。每个区块将根据进程数量进行划分,每个进程将运行 BQ 存储读取会话,并应用包含每个区块中的值的行过滤器。

然而,我强烈建议您在开始使用之前,先阅读我之前的一篇关于使用多处理的 BigQuery 存储基准的文章。

总之,这里有一个使用 bqfetch 的多处理实现的例子。

结论

经过多次研究和基准测试,我发现使用分块表的 BigQuery 存储 API 实现是(对于我的用例)从 BigQuery 获取表的最有效的方式。我用我展示给你的工具将我的主要项目的获取时间除以 6,我希望它能帮助其他数据工程师的工作。我对 GitHub 上的改进建议或贡献请求非常开放,所以如果你想谈论这些,请不要犹豫与我联系。

用 Python 可视化相关性的最快方法

原文:https://towardsdatascience.com/the-fastest-way-to-visualize-correlation-in-python-ce10ed533346?source=collection_archive---------7-----------------------

入门

关于如何在没有第三方绘图包的情况下可视化与熊猫的相关性的简短教程。

杰瑞米·托马斯Unsplash 上拍照

作为一名数据科学家,我经常使用相关性来计算和可视化特征之间的关系。

我以前都是从导入 matplotlib 和 seaborn 包开始,渲染出好看的剧情。但是,当从一个空的 Jupyter 笔记本开始时,导入这两个包只是为了可视化这种关联,这是很麻烦的。

有没有更好的办法?

我决定做一点研究,因为我经常使用这个命令——在 Python 中一定有更好(更快)的可视化相关性的方法。瞧,还有…

通过阅读这篇简短的教程,你将学会一种更快捷的方法来计算和可视化与熊猫的相关性。

这里有几个你可能会感兴趣的链接:

- [Complete your Python analyses 10x faster with Mito](https://trymito.io/) [Product]- [Free skill tests for Data Scientists & ML Engineers](https://aigents.co/skills) [Test]- [All New Self-Driving Car Engineer Nanodegree](https://imp.i115008.net/c/2402645/1116216/11298)[Course]

你愿意多看一些这样的文章吗?如果是这样,你可以点击上面的任何链接来支持我。其中一些是附属链接,但你不需要购买任何东西。

可视化与熊猫相关的最快方法是什么?

假设我们有下面的数据帧(它只有 4 列随机数):

import numpy as np
import pandas as pddf = pd.DataFrame(np.random.randint(0, 100, size=(15, 4)), columns=list("ABCD"))

带有随机数的熊猫数据框(图片由作者制作)

计算和可视化相关性非常简单(不需要其他第三方软件包):

df.corr().style.background_gradient(cmap="Blues")

与熊猫的关联(图片由作者制作)

不喜欢蓝色?

试试 cmap='Greys '(图片由作者提供)

试试 cmap='YlOrBr ' '(图片由作者提供)

试试 cmap='GnBu '(图片由作者提供)

有不同类型的相关性

Deon BlackUnsplash 上拍照

在我们深入研究其他类型的相关性之前,我必须承认,在实践中,除了皮尔逊相关性,我从未使用过其他任何相关性。不管怎样,很高兴知道其他人确实存在,熊猫支持其中一些开箱即用。

请在评论中告诉我,你是否在实践中使用过除皮尔逊相关之外的任何方法,以及用例是什么。

默认情况下,pandas 计算皮尔逊相关,这是两组数据之间线性相关的度量。

熊猫也支持 :

  • 肯德尔相关性—与 df.corr('kendall ')一起使用
  • Spearman 关联—与 df.corr('spearman ')一起使用

斯皮尔曼相关用于什么?

来自 minitab:

Spearman 相关性通常用于评估涉及顺序变量的关系。例如,您可以使用 Spearman 相关性来评估员工完成测试练习的顺序是否与他们受雇的月数有关。

肯德尔相关用于什么?

从统计数据直接:

Spearman 的秩相关对于检验两个变量之间独立性的零假设是令人满意的,但是当零假设被拒绝时就很难解释了。肯德尔的等级相关性通过反映被比较的变量之间的相关性的强度对此进行了改进。

不出所料,Spearman correlation 产生了与 Pearson 不同的值:

df.corr('spearman').style.background_gradient(cmap="Blues")

具有随机值的数据帧上的皮尔逊相关(左)与斯皮尔曼相关(右)

结论

在不使用其他包的情况下可视化相关性是一个巧妙的技巧,这使得实践数据科学变得更加有趣。

一个这样的命令可能看起来不多,但是在您的工具箱中添加 10 个这样的技巧可以产生很大的不同。

style . background _ gradient应用于关联结果只是冰山一角。这个概念对我已经描述过的很多事情都很有用:

[## 如何给熊猫数据框上色?

towardsdatascience.com](/how-to-color-a-pandas-dataframe-41ee45db04f6)

在你走之前

Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。

康特尼·赫格尔在 Unsplash 上拍摄的照片

Python 中的过滤函数

原文:https://towardsdatascience.com/the-filter-function-in-python-4f3dea9fc8dd?source=collection_archive---------8-----------------------

了解如何使用 Python 中的过滤器函数

约书亚·雷德科普在 Unsplash 上的照片

尽管 Python 是一种面向对象的语言,但它仍然提供了提供函数式编程风格的函数。在上一篇文章中,我们讨论了其中的一个函数, 映射 。在本文中,我们将讨论这些 Python 内置函数中的另一个,即 过滤器 函数。

在本教程中,我们将学习 Python 中的 滤镜 函数是什么以及如何使用。

地图上的文章功能:

使用 for 循环

假设我们想用一个已经有的列表来创建一个列表。但是我们希望我们的新列表只包含满足给定条件的元素。例如,我们有一个数字列表,我们想创建一个只包含偶数的新列表。我们可以使用 for 循环来完成这项任务,如下所示:

我们有一个数字列表, list_of_nums ,包含数字 1、2、3、4、5 和 6。我们想要创建一个新的数字列表, list_of_even_nums ,它只包含来自 list_of_nums 的偶数。所以我们创建了一个函数, is_even ,它接受一个输入,如果输入是偶数,则返回 True,否则返回 False。然后,我们创建了一个 for 循环,该循环遍历 list_of_nums ,并通过将该元素传递给 is_even 函数来检查列表中的每个数字是否都是偶数。如果 is_even 函数返回 True,则该数字被追加到 list_of_even_nums 中。如果 is_even 返回 False,则该数字不会追加到 list_of_even_nums 中。

另一种实现方式是使用内置的 Python 过滤器 函数。

滤波函数

filter函数接受两个参数:一个返回TrueFalse的函数(检查特定条件)和我们想要应用它的 iterable 对象(如本例中的 list)。

过滤器(函数,可迭代)

filter 函数从我们的列表(或者我们传入的任何 iterable)中获取每个元素,并将其传入我们给它的函数。如果将该特定元素作为参数的函数返回True,则过滤函数会将该值添加到过滤对象(然后我们可以创建一个列表,就像我们对由 map 函数返回的 map 对象所做的那样)。如果函数返回False,那么该元素将不会被添加到我们的过滤器对象中。换句话说,我们可以认为过滤函数是基于某种条件过滤我们的列表或序列。

[x,y,z] → filter → [x(如果 f(x)返回 True),y(如果 f(y)返回 True),z(如果 f(z)返回 True)]

如果我们有一个[x,y,z]的列表,那么如果 f(x)返回True,x 将被添加到过滤器对象。如果返回False,则不会添加到过滤对象中。 f 是我们传递给过滤函数的函数。如果 f(y)返回True,它将被添加到 filter 对象中。诸如此类…

同样, filter 函数会返回一个 filter 对象,它是一个迭代器。如果我们想从这个过滤器对象创建一个列表,我们需要将我们的过滤器对象传递给内置的 列表 函数(就像我们对地图对象所做的那样),如下所示:

列表(过滤器(函数,序列))

使用过滤功能

然后我们可以使用 过滤器 功能创建上面的列表如下:

过滤器函数从 list_of_nums 中获取第一个元素,即 1,并将其作为参数传递给 is_even 函数(因为我们将该函数作为第一个参数传递给了过滤器函数)。 is_even 函数然后返回False,由于 1 不是偶数,所以 1 不加到我们的 filter 对象中。然后, filter 函数从 list_of_nums 中获取第二个元素,即 2,并将其作为参数传递给 is_even 函数。 is_even 函数返回True,因为 2 是偶数,因此 2 被添加到我们的过滤对象中。在遍历完 list_of_nums 中的其余元素并且将其余偶数添加到我们的过滤器对象中之后, list 函数将这个过滤器对象*转换为一个列表,并且该列表被分配给变量 list_of_even_nums 。*

使用 lambda 表达式

我们可以通过传入一个 lambda 表达式作为我们的函数来进一步缩短代码:

了解λ函数在这里:

* *

列表理解与映射和过滤

如果我们回想一下,列表理解被用来从其他序列中创建列表,或者通过对元素应用某种操作,或者通过对元素进行过滤,或者两者的某种组合。换句话说,列表综合可以具有与内置的 映射过滤器 功能相同的功能。应用于每个元素的操作类似于 映射 函数,而如果我们在列表理解中添加一个条件来将哪些元素添加到列表中,那就类似于 过滤 函数。此外,添加到列表理解开头的表达式类似于可以在映射和过滤函数中使用的λ表达式。

例子

这是一个列表理解,仅当元素是偶数时,才添加从 0 到 9 的元素的平方:

*[x**2 for x in range(10) if x%2==0]# [0,4,16,36,64]*

我们可以使用 映射过滤 函数,以及 lambda 函数,来完成同样的事情:

*list(map(lambda x:x**2, filter(lambda x:x%2==0, range(10))))# [0,4,16,36,64]*

传递给 map 函数的函数是一个 lambda 表达式,它接受输入 x 并返回它的平方。传递给映射函数的列表是一个过滤列表,包含从 0 到 9 的偶数元素。

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑注册成为一名灵媒会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 注册,我会赚一小笔佣金。

*https://lmatalka90.medium.com/membership *

希望你喜欢这篇关于 Python 中 滤镜 功能的文章。感谢您的阅读!

我第一个数据科学职位的前 90 天

原文:https://towardsdatascience.com/the-first-90-days-in-my-first-data-science-role-most-important-lessons-retrospective-821f6baf746?source=collection_archive---------39-----------------------

最重要的教训回顾

来源: Unsplash

我之前写过我是如何第一次进入数据科学领域的。这是一篇关于接下来会发生什么的后续文章:如何充分利用自己的新角色,并立即投入工作。受我在这个话题上的指导会议中提出的一些问题的启发,我列出了当时对我有帮助的(有时是意想不到的)例子。后知后觉是 20/20。(顺便说一句 2021 年快乐!)

学习业务逻辑是开始投稿的必要条件

当我开始我的第一个数据科学家角色时,我既兴奋又紧张。我没有发现 Python 编码是一个潜在的问题,因为我已经在游戏开发中与它一起工作过,并且通过了涉及 Python 的面试,毕竟…

中等篇:我是如何进入数据科学领域的(part 1)(part 2)

事实是,作为一名数据科学家,要开始提供任何价值,首先,我必须弄清楚如何访问相关数据、导航数据仓库以及连接不同的表来构建相关数据集。

它不像学校或 Kaggle,有一些预建的数据集,或者我的学生网络抓取项目,在那里我控制所有的逻辑。在很大程度上,我们不得不从庞大的数据仓库中构建我们需要的数据。非常感谢数据工程团队首先确保了它的存在。

在最初的几个星期里,当我学习这些东西的时候,我几乎是死气沉沉的,不停地问我的入职伙伴这样的问题:

  • “嘿,安大略省[行业]的表名是什么?”
  • 列[客户 ID]是否与[同一 ID 的另一个名称,但在另一个表中]相同
  • "我要从这个日期栏中减去一天才能得到我需要的实际时间范围吗?"

即使几个月(甚至几年)后,我仍在学习数据背后的新逻辑。例如,知道在哪里可以找到关于数据中断的内部 Wiki 页面,以解释为什么某个表中某个月的记录较少。

作为一名全新的数据科学家,这个过程是我当时没有预料到的。我再次意识到,在现实世界中,数据并不是像《蝴蝶花》或《T2 泰坦尼克号》那样预先制作好的。也不像我学生时代从网上搜集的小规模数据集。

我很感激当时的入职过程,它为我的第一个建模项目找到了一个伙伴,还有非常耐心的同事。就这对团队的意义而言,提供这种背景知识是一项必要的投资,这样新员工就能更快地跟上进度并开始做出贡献。

对过去的我来说,知道“嘿,我会编程”是一件令人大开眼界的事情。我知道统计!”作为一名数据科学家一点也不合适。在随后的角色中,我不得不再次经历学习业务意义的过程,然后才能在数据科学方面提供更多价值。现在,随着我的视角开始转变为提供这种背景知识,我谨记这一切都是值得的。

尝试一些事情,问很多问题

这条规则不仅适用于最初的 90 天,而且适用于一个人的职业生涯——但越早意识到这一点越好。

对我来说,开始为项目做贡献的一个必不可少的行为是提问。我知道因为问了一个“愚蠢”的问题而感到尴尬是什么感觉,但是为了让团队交付成果,简单地将这些想法放在一边会更有成效,因为这对任何人都没有好处。

由于需要学习大量的业务逻辑,团队中没有一个有经验的人会期望一个新员工知道所有的事情。事实上,正如我在上一节提到的,一个有经验的人很可能还在学习。

我使用的一个经验法则是,在询问之前至少要尝试一些事情。人们不喜欢有人没有首先花任何努力去寻找解决方案,但关键是如果你尝试过,但没有找到或回忆起答案,他们会理解的。

问“嘿,安大略[行业]的表名是什么?”当你也可以说“我试着在 Wiki 上查找魁北克的表名,并试着根据命名约定猜测安大略的表名。但它没有出现。”(纯粹的例子:那个角色的数据仓库有 1000 个表,所以通过选择所有的表名,我可能什么也没得到。作为一个新手,我不知道该怎么做。)

这不只是嘴上说说。作为一名新员工,如果我至少试着利用我可以支配的资源,即使是唾手可得的果实,这也有助于我将来练习自己获取信息。这是很有价值的,可以建立独立性。

这里的关键是,作为一名新员工,不要花一整天的时间试图用我头脑中有限的知识去解决一些问题,这些知识可能并不全面。我倾向于把我能花在解决问题上的时间打包,然后再去问。

时间范围各不相同:对于像表名这样的小事,我可能会尝试在数据库中进行快速搜索,对于代码,我可能会多花一点时间来尝试一些堆栈溢出解决方案。

尝试了几种方法也节省了我询问的人的时间:也许他们还会建议我想到的第一个解决方案,因为我已经试过了,所以我已经知道它不起作用。这有助于被邀请的同事集思广益,找出除了最明显的解决方案之外的其他可能的解决方案,更好地利用解决问题的时间。

总的来说,尝试一些事情,问一些问题来解放自己,对于一个有效的开发者来说是很重要的。即使作为一名高级开发人员,在尝试了一些方法之后,我也毫不犹豫地提出“愚蠢”的问题;大多数情况下这并不尴尬,因为从全局来看,询问有助于项目进展得更快。

将算法翻译成简单的英语单词

不要在办公室里走来走去,喃喃自语“我做了 ALS(交替最小二乘法)”。让我解释一下这是什么意思…

作为数据科学家,我们喜欢在工作中谈论利基优化和学术期刊,这很好。事实上,我合作运营的小组(工作之外),Aggregate intelligent,邀请研究人员谈论他们在高度技术层面上的机器学习工作,并拥有 12k+ YouTube 订户。

但即使在这些喜欢书呆子说话的群体中,我也知道,在注意力资源有限的工作场所,让别人关心我的工作的最佳方式是用简单的英语描述这些“酷东西”。

坦率地说,在我作为数据科学家的头 90 天里,我是一个四处走动、喃喃自语算法名称的人。培养我在这里提到的沟通技巧确实需要 90 多天,但我注意到这一点是希望人们可以更早地开始培养这些技巧!

除了算法及其在数学和计算意义上的作用,我还学会了提及它在业务中的实际作用(例如,在网站上推荐一些东西以增加用户参与度)。

否则很容易让自己的项目陷入默默无闻。我见过很多团队做了 POC(概念验证),但最终都被放弃了,这不是因为再多做些努力它们可能就没用了,而是因为没有就它们的影响进行沟通。我认为这是许多高技术人员犯的一个错误。

描述技术工作的方式有助于任何人看到有人参与项目的价值,这是非常宝贵的。否则,一个人就有可能被从他们所珍视的项目中抽离出来,这个库就成了一个代码墓地。

当然,如果这个项目没有意义,再多的交流也无法扭转局面。关键是,如果一个人在技术主题方面沟通不畅,往往会对他们自己的项目造成不必要的伤害,并阻碍他们在公司从事更好的项目,这反过来可能会阻碍职业发展。

花时间在沟通上是值得的——尽管当时我的任期相对较低,但由于这一点,我已经能够在内部和外部的大舞台上亮相。在这篇关于数据科学讲故事的文章中,我写了一个我使用的技术

结论

随着我在首席数据科学家的职业生涯中不断学习,我一直在反思我开始这段旅程时所经历的事情,尤其是我(意外地)做得好的事情。后见之明 20/20。对于如何充分利用数据科学知识,我有更多的想法和观察,并将为未来关于该主题的文章收集更多材料。

我希望这些想法是有帮助的!像往常一样,你可以在 LinkedIn 或 hello@susanshu.com 上找到我来讨论这个帖子。

原载于 2021 年 1 月 3 日 https://www.susanshu.com**

高效使用 Kubernetes 的前十个主要概念和代码示例

原文:https://towardsdatascience.com/the-first-nine-primary-concepts-and-code-examples-for-using-kubernetes-productively-d2aabccc0380?source=collection_archive---------35-----------------------

Kubernetes 的解释和使用不应该讨论内部架构组件。相反,我用代码示例讨论 Kubernetes 的基本概念。最后,作为奖励,Kubernetes 在设计上有一个明显的漏洞。

Kubernetes 编排了一个由网络连接的虚拟机云或分布。在 Unsplash 上由Manuel n Geli拍摄的照片

不使用 Kubernetes 部署和管理应用程序

无论是个人、初创公司还是大型企业,在你向公众推出应用的第一天,都会有少量用户。

第二天或者第三周呢?它会是一个哑弹还是会被广泛传播?

病毒意味着大量的用户。您必须开发和测试软件,以便将不断增加的用户负载分散到您正在交换的计算资源中。

可扩展性意味着计算资源(节点)随着用户负载的增加而增加,模式随着用户负载的减少而闲置——作者的动画。

如果你有负载平衡软件就最好了。

添加计算机节点时,一些早期安装的计算机节点会出现故障。

您必须开发和测试软件来检测、切换、恢复和切换出故障节点。

如果有故障管理软件就最好了。

可扩展性意味着计算资源和应用程序副本(节点)代替了故障节点(红色)——作者的动画。

容错和可扩展性要求监控许多节点。我们需要知道哪些节点正在运行,哪些节点空闲,哪些节点出现了故障。

金发女孩寓言是关于云的使用和成本的一课。

您不希望分配太多的节点,也不希望分配太少的节点。您希望为您的应用程序分配“恰到好处的数量的节点。

您有一个从无用应用程序到病毒应用程序的最佳扩展解决方案——Kubernetes。

为什么使用 Kubernetes?

嗯,上面的讨论有一些使用 Kubernetes 的好理由。以下列举了更多的原因:

充足的理由

  1. Kubernetes 是免费的。
  2. Kubernetes 是开源
  3. Kubernetes 有一个庞大的贡献者社区。
  4. Kubernetes 在谷歌积累了 15 年的经验,使用名为 Borg 的系统大规模运行生产工作负载。
  5. 云计算基金会管理着 Kubernetes ( CNCF )(不是谷歌)。

更好的理由

这些都是很好的理由,我还可以列举更多。然而,对我来说更重要的原因是什么呢?

  1. Kubernetes 实际上是唯一的云操作系统。云供应商提供的其他服务是黑盒软件即服务(SasS)或您必须通过网络连接的单个对象。
  2. Kubernetes 既可以是陈述性的,也可以是命令性的。

https://medium.com/payscale-tech/imperative-vs-declarative-a-kubernetes-tutorial-4be66c5d8914

我最好的理由

这些都是很好的理由,我还可以列举更多。然而,对我来说最重要的原因是什么?

  1. 弹性和可伸缩性是 Kubernetes 的中心主题;
  2. 在 Kubernetes 中,弹性(容错)和可伸缩性是声明性的;
  3. Kubernetes 根据用户工作负载进行扩展。
  4. Kubernetes 支持更改,例如图像更新,而不会给最终用户带来停机时间。
  5. 我可以在我的沙箱或任何联网的计算资源集群上使用 Kubernetes 作为分布式操作系统。

https://alexellisuk.medium.com/walk-through-install-kubernetes-to-your-raspberry-pi-in-15-minutes-84a8492dc95a

1.Kubernetes 是一个分布式计算操作系统

这个讨论有助于将 Kubernetes 看作是一个分布式计算资源云的操作系统。

Kubernetes 作为一个操作系统有很多部分,是一个复杂的框架。

不同经历和知识水平的人对 Kubernetes 的需求是不同的。我试着在我们都能分享的层面上解释 Kubernetes。

库伯内特生态系统(或护城河)

围绕着文档、教程、课程、认证、仪表板、操作方法博客文章、培训工具、持续集成(CI)工具、持续部署工具(CD)、混合云(不止一种云类型)工具和机器学习操作(MLOps)工具,有一个庞大的生态系统。

Kubernetes 是开源的。

我需要再次提到,Kubernetes 是开源的、免费的,并作为托管服务在所有主要的云供应商(亚马逊、谷歌、IBM、通用微软、Paperspace、阿里巴巴、甲骨文等)上提供。

Kubernetes 作为云管理服务( SaaS )。

安装、操作和维护您自己的 Kubernetes 的所有系统管理任务都是作为托管服务为您完成的。

: Kubernetes 作为云厂商的托管服务不是免费的。

Kubernetes 建筑是美丽的,也是复杂性的最大来源。

除非您参与了 Kubernetes 的开源工作或者实现了一个定制工具,否则您不需要了解 Kubernetes 的架构和内部编排组件。

https://appfleet.com/blog/understanding-kubernetes-custom-resource-definitions/

我详细介绍了有效使用 Kubernetes 所需的基本概念,同时避免了 Kubernetes 内部架构的复杂性。

注意:Octant不认为自己是仪表板。然而,“仪表板”使您能够可视化您的 Kubernetes 工作负载,而不是自上而下的 Kubernetes 集群视图我稍后定义集群。现在,把 Kubernetes 集群想象成一个应用程序和计算资源的蜂巢。

2.什么是云?

云是无数的异构计算设备。每台不同的计算设备都有自己的硬件、操作系统(裸机),用于托管您的应用程序,您希望复制这些应用程序(扩展)并在应用程序出现故障时重新启动(容错)。

:我把应用作为一个微服务、应用、包、网络资源、存储服务的通称,或者说 应用即服务(AaaS= = Saas)。

云供应商意识到,计算资源是可以作为通用计算类型提供的商品。

云供应商联合起来

  • 云计算引擎商品
  • 应用程序

为您提供为不同类型的应用租用不同类型的计算资源的能力。

:云厂商通过开源许可、免费许可和高带宽联网变得可行。想象一下管理许可支付的成本与云供应商的开源维护成本的对比。

3.博格是什么?

考虑一个服务,您希望跨节点复制(扩展)该服务,并在该服务的节点出现故障(容错)时将该服务移动到另一个节点(计算资源)。

Google 在大约 16 年前为他们的内部应用和服务创建了 Borg,这些应用和服务运行在一个计算资源的 hive (Google 的内部云)上。

今天,我们揭开了传闻已久的谷歌内部面向容器的集群管理系统 Borg 的面纱,在学术计算机系统会议 Eurosys 上公布了细节。你可以在这里找到论文

Kubernetes 追溯其血统直接来自博格。许多在 Google 工作的 Kubernetes 开发人员以前是 Borg 项目的开发人员。我们在 Kubernetes 中融入了 Borg 的最佳创意,并试图解决用户多年来在 Borg 中发现的一些痛点。—2015 年 4 月 23 日, Kubernetes 博客文章

4.什么是 Kubernetes?

Kubernetes 是 Borg 的开源、净化版,增加了许多特性。

Kubernetes 概念深刻,难以理解,而且范围仍在扩大。Kubernetes 是第 n 代分布式操作系统。

我使用不同的方法来理解和直接使用 Kubernetes,不讨论 Kubernetes 的内部组件和架构。

然而,我用 Minkube 代码示例和参考详细介绍了 Kubernetes 的概念,因此:

  • 我们在 Kubernetes 项目的使用和推广上立竿见影。
  • 如果你愿意,你可以更深入地了解 Kubernetes 的概念。

注意 : Minikube 是一个 Kubernetes 克隆,运行在您的本地机器上。我的团队用它来训练和测试 Kubernetes 的配置。需要安装 Docker 和 [kubectl,](https://kubernetes.io/docs/tasks/tools/) 才能使用 Minikube。

5.Kubernetes 是二维的。

Kubernetes 基线概念存在于两个抽象维度上。第一个维度是节点——计算资源。第二个维度是容器图像—应用程序。

Kubernetes 与云无关,因为:

  1. 将物理机引擎转变为虚拟机。然后将虚拟机映射到 Kubernetes 抽象节点
  2. 通过将应用程序放入容器映像中,将应用程序转换为一组虚拟应用程序。容器被映射到 Kubernetes 抽象pod。

Kubernetes 协调 pods,在节点上启动和初始化 pods ,如果它们变得不可达,则在不同的节点上重新启动 pods (容错、复制(扩展)pods),并在 pods 上执行其他分布式操作系统操作。

安装 kubectl

在这篇博客文章中,我经常提到kubectl

kubectl是您的本地命令行界面(CLI ),用于与单个 Kubernetes 集群交换声明性或命令性指令。Kubernetes 群集位于您的本地沙盒中;我们使用 Minikube 或通过网络远程操作。

下面这篇博客文章更详细地介绍了如何设置和改变哪个 Kubernetes 集群kubectl是针对 Minikube 的。

https://itnext.io/is-minikubes-profile-a-kubernetes-cluster-c0f134c5e684

在调用神奇的 Kubernetes 控制命令之前,你需要安装[kubectl,](https://kubernetes.io/docs/tasks/tools/)

您可以使用以下命令在本地沙盒上检查您的安装:

kubectl version

错误-“连接到…”

您会看到上面的错误,即输出的最后一行,因为[kubectl](https://kubernetes.io/docs/tasks/tools/)输出版本信息,并且试图连接到 Kubernetes 集群。

下面的[kubectl](https://kubernetes.io/docs/tasks/tools/)命令显示了哪个集群([kubectl](https://kubernetes.io/docs/tasks/tools/)上下文):

kubectl config current-contex

kubectl 上下文(集群)被命名为“沙箱”。

使用 minikube,我们启动了一个名为“sandbox”的集群。

哎呀,我需要在本地运行 Docker。通常我们不必担心,因为 Docker 是 Kubernetes 服务的一部分(对于大多数云供应商来说)。

启动 Docker,然后:

现在试试

kubectl version

带输出:

kubectl version工作正常。

记住,你必须

  1. 在本地运行 Docker
  2. 您需要在本地运行一个 Minikube 集群。

有了 Minikube,你可以不用云就能完成 Kubernetes 实验。

6.Kubernetes 如何扩展?

缩放是 Kubernetes 的两个主要目标中的第一个目标。

记住 Kubernetes 的“集群”是沿着计算资源和应用程序两个维度配置的。

Kubernetes“集群”由计算资源和应用程序的自动创建副本组成。通过多路复用到副本,在 URL 或互联网协议(IP)地址上发送传入请求。

不同的共享(多路复用策略)是通过“负载平衡”算法实现的。这些“负载平衡”算法被选中,或者你放一个自定义的“负载平衡”算法。

:我建议设置一个合理的节点上限。您或您的组织不希望因意外或恶意使用而收到巨额账单。

7.Kubernetes 是如何实现容错的?

容错是 Kubernetes 的两个首要目标中的第二个目标。

我们再次利用了 Kubernetes 创建计算资源和应用程序副本的优势。

Kubernetes workload 管理副本,而不是您。任何不响应(失败)的拷贝都可以互换,并从拷贝池中替换。

我们是容错的,因为 n-1 个副本可能会失败,其中 n 是副本的数量,您仍然可以使用应用程序。

无故障时间应该与您使用的计算资源类型相对应。如果应用程序跟踪故障时间,那么您可能在应用程序中有一个或多个潜在的错误。

:我把 bug 分为两类。“必须修复”应用程序在不到一天内失败的错误,以及“不要担心”应用程序在一天以上失败的错误。我正在利用 Kubernetes 固有的容错能力。

8.你可以在你的本地沙盒上玩 Kubernetes,或者我在我的台式机或笔记本上用 Kubernetes 做严肃的工作。

当地 Kubernetes 使用包装应用。有些是:

Minikube 是我安装在本地机器上的一个程序,用于培训或测试 Kubernetes。

和 Kubernetes 一样,Minikube 使用客户端命令行工具[kubectl](https://kubernetes.io/docs/tasks/tools/)。然而,Minikube 还需要一个名为minikube.的独立命令行工具

我在这篇博客文章中展示了 Minikube 的例子,

我们中的一些人在将 Kubernetes 配置推送到云端之前,会在本地沙箱(工作站)上使用 Minikube

安装 minkube 和 kubectl

在调用神奇的 Kubernetes 控制命令之前,你需要安装 [kubectl,](https://kubernetes.io/docs/tasks/tools/)

接下来我建议安装 Minkube 。使用 Minkube,您可以在本地计算机上使用 Kubernetes,从而避免使用 Kubernetes 云服务的潜在高成本。

Minikube 和[kubectl](https://kubernetes.io/docs/tasks/tools/)的关系在以下章节中有详细说明:

**https://itnext.io/is-minikubes-profile-a-kubernetes-cluster-c0f134c5e684 **

9.您可以在大多数云供应商上部署 Kubernetes 即服务(SaaS)

大多数主要的云供应商都有自己的 k8s 版本( SaaS )。其中包括:

  1. Azure Kubernetes 服务
  2. 亚马逊弹性 Kubernetes 服务 (EKS)
  3. 谷歌 Kubernetes 引擎 (GKE)
  4. 国际商用机器公司
  5. 图纸空间

: k8s 是 Kubernetes,其中 8 是中间字的个数。请不要杀信使。

10.额外收获:Kubernetes 的主要不足是

Kubernetes 和云存在一个明显的漏洞——安全性。云供应商提供的仅仅是登录账户的安全性。

另一个很容易解决的突出问题是 dockerfiles 用于创建 Kubernetes 容器映像,在它们的混合命令中使用:

USER root
RUN apt-get updat.
.
.

安全问题是容器以root特权运行。简单的解决方法是:

USER root
RUN apt-get updat.
.
.USER $USER

另一个安全问题是,容器用新的图像更新,包括带有病毒的图像。

为 Kubernetes 寻找安全工具。

摘要

这篇文章过去的版本有 8000 字,并且还在增加。我觉得它太长了,不适合在媒体上发表。

然而,作为参考,它需要留在一起。

我通过反向链接以前发表的文章解决了“待在一起”。另外,每篇文章都可以单独阅读。

  1. 这篇博客文章是第一部分;
  2. 下一篇博客文章将介绍 Kubernetes 集群、节点、pod、容器映像、端点和入口对象的七个概念。最后,对调试容器进行了简要描述。
  3. 下一篇博客文章将介绍 Kubernetes 的九个概念——种类、部署、服务和其他六个概念。
  4. 我计划写一篇博客文章,详细介绍我们使用的丰富的工具生态系统。

每个博客都有你可以使用的代码。

快乐高效地编码!

学习生物信息学的第一步是不要跳到生物信息学

原文:https://towardsdatascience.com/the-first-step-to-learning-bioinformatics-is-to-not-jump-to-bioinformatics-2e958f7b811a?source=collection_archive---------8-----------------------

来源: Unsplash

这个标题听起来有点矛盾,但是学习生物信息学的过程并不简单。学习生物信息学更像是建造一座大楼,顶层是生物信息学。知识有多个支柱和基础,需要足够强大才能正确学习生物信息学。大多数人错误地直接跳到生物信息学和代码教程,他们可以运行这些教程来分析他们的数据。但是在这种自上而下的方法中,他们的基础从来都不简单,因此,大多数实验生物学家放弃了学习生物信息学或者没有正确地学习它。

迈向生物信息学的第一步是完全没有生物信息学。生物信息学的基础依赖于你的编码能力。更重要的是,它依赖于你有效编码的能力和学习编码模式的能力,这些模式已经被程序员利用了好几代来构建有效的解决方案。

从更普遍的角度来看,生物信息学与工程学非常相似。你有一个需要解决的问题。您可以分解成更小的块,并使用您的编程技术知识来分别解决每个块。然后你把所有的都集合起来,达到最终的目标。正如一位智者曾经说过的那样——“一名优秀的数据科学家首先是一名优秀的工程师,然后才是数据科学家。”

基于此,让我们列出有效学习生物信息学应该遵循的步骤:

  1. 学习编码的基础知识(无论你想用什么语言)

说到这里,让我们弄清楚一些事情——您选择的语言并不重要,因为这里的目标是学习编码的基础知识,并理解工程师如何解决问题。一旦你的解决问题的技能达到了速度,学习另一种语言来执行脚本就不是一个大任务。以下是编码人员解决问题的一些方法:

  • 使用“for”循环迭代数据块。
  • 使用“while”循环遍历更复杂的数据集,使用“if”循环处理数据的不同情况。
  • 使用变量和数据结构存储中间结果。
  • 使用适当的库来有效地可视化和呈现您的数据。

在我看来,开始学习生物信息学最好的地方是www.datacamp.com。(注意——他们不会为我的这种背书付钱。我提到它们是出于我个人对多个电子学习网站的体验。DataCamp 针对 R 和 Python 的入门和中级课程,互动性很强,开门见山。与 Coursera 中的 Python 课程不同,它有太多不需要的描述性信息,DataCamp 专注于基本的基础知识。

2。练习你的编码!

你必须通过实践来测试你的编码能力。像 Leetcode 这样的网站非常适合着手解决现实世界的问题,并编写代码来解决这些问题。既然你的目标不是成为世界级的工程师(当然,欢迎你来!)但作为一名生物信息学家,你可以坚持用更简单的问题来练习。在不看解决方案的情况下,解决大约 15-20 个简单问题和 5-10 个中等问题是生物信息学家在 Leetcode 上的一个好目标。LeetCode 是为那些想从更广阔的角度了解编码模式的人而构建的。出于时间的考虑,您可以坚持我上面列出的目标,但是欢迎您进一步探索。

3。学习 Bash / UNIX

欢迎来到完全在代码中运行而没有桌面的操作系统世界。与允许您交互工作的 Mac/Windows 不同,Bash 和 UNIX 帮助我们使用代码执行实际的进程和脚本。

Bash 就像一种父语言,它编译一切,并允许我们托管 Python 或 R 环境来运行我们的脚本和执行我们的分析。bash 语言学习起来也很重要,因为许多允许我们预处理数据的软件都是基于 Bash 的。

打开您的终端(在 Mac 中)或命令提示符(在 Windows 中)来查看我们编写 bash 代码的命令行。作为第一步,你可以写“echo‘hello world’”。命令 echo 会回显您在单词后说的任何内容。

Bash 也是广泛用于分析的服务器和计算机器的主要操作语言,因为标准计算机不具备处理复杂操作和代码的能力。DataCamp 还有一个很棒的 bash 脚本入门课程

理解和学习集群上科学计算的基础知识,并在不破坏服务器的情况下有效地运行您的进程也是至关重要的。本简明教程很好地概述了高性能计算集群,并教授如何使用它们。

4。了解如何管理环境和包

数据科学家通常会花大量时间来确保在开始处理数据之前,他们已经建立了正确的竞争环境。生物信息学家也是如此。理解包/库如何工作以及构建有效使用它们的环境是至关重要的。

YouTube 上这段 10 分钟的视频将教你如何在康达掌控环境并有效管理它们。这些环境帮助我们避免版本冲突,如果您的两个包需要第三个包的不同版本,但是这些不同的版本不能共存,就会出现版本冲突。

5。了解如何用 R 和 Python 启动 Jupyter 笔记本

你的下一个目标是推出一个 Jupyter 笔记本,在那里你可以用 R、Python 或者任何你需要的语言来编码。可以把 Jupyter 想象成一个交互式的地方,在这里你可以以一种有组织的方式编写和运行代码,而不会丢失进度,并且在你编写代码的时候记录你的工作。这里有一个非常简短的关于如何学习 Jupyter 笔记本基础知识的 30 分钟 YouTube 视频。既然您已经学习了 bash 脚本、编码模式的艺术,并且可以启动和运行您的编码环境,那么是时候开始考虑生物信息学了。

6。学习 Github!

生物信息学的另一个非常重要的方面是学习 GitHub,并能够有效地记录您的代码。去 www.github.com 开个账户吧。git 爱好者 Roger Dudler 编写了一个简明扼要的 GitHub 命令教程。他的教程应该让你了解 Github 和文档的基础知识。

7。了解数据的基本原理,然后选择一个教程来使用

进入教程之前的最后一步是学习数据结构的基础知识。如果你要处理下一代测序数据,你应该学习。fastq 文件,。山姆档案还有。bam 文件,然后再开始教程。如果您打算对变体调用做同样的事情,您应该学习。vcf 文件和。bcf 文件。

一个简单的方法是选择一个教程,写下你能在那里看到的所有数据结构。事先用谷歌搜索它们,了解它们的结构和存储数据的过程。有趣的事实——我过去的傻瓜认为床档是一些储存神秘信息的神奇文件。原来,它们只是制表符分隔的文件,在 3 列中存储基因组坐标,加上一些不同的额外元数据。

一旦你掌握了这七个步骤,任何生物信息学教程对你来说都不会很难,因为你已经掌握了编码的基础。

在分析时间序列时,我做的前三件事

原文:https://towardsdatascience.com/the-first-three-things-i-do-when-analysing-a-time-series-56936d240d89?source=collection_archive---------32-----------------------

理解数据是最重要的

来源:图片来自 Pixabay

对于那些缺乏时间序列分析经验的人来说,试图“本末倒置”是很常见的,即在没有正确理解时间序列的情况下建立一个模型来分析时间序列。

时间序列与许多其他数据集的行为不同,因为在序列中通常存在自相关——即不同时间段内相关变量的观测值之间的相关性。

抛开预测不谈,分析时间序列的最重要的组成部分之一是能够将信号噪声分开——即能够从随机波动的数据中辨别出有意义的模式。

为了实现这个目标,在分析一个时间序列时,我做了以下三件事。

1.生成移动平均值

移动平均值是所讨论的变量的一定数量的观察值的平均值。

例如,让我们以数组[1,2,3,4,5]为例。假设这是一个时间序列。我们希望计算该数组的三期移动平均值。

  • 1,2,3 的平均值= 2
  • 2,3,4 的平均值= 3
  • 3,4,5 的平均值= 4

以这种方式计算移动窗口的平均值有助于消除序列中的噪声,并识别出用肉眼很难发现的模式。

例如,让我们以下面的时间序列为例,测量一段时间内的耗电量,单位为千瓦。有问题的数据来自 data.gov.ie。

来源:Jupyter 笔记本输出

使用 7 天移动平均线(橙色线),我们可以更容易地在图表的第一部分看到下降趋势,在第二部分看到上升趋势。

更具体地说,我们可以看到在时间序列的中间,千瓦消耗突然下降(橙色线显示暂时急剧下降)。

如果我们观察时间序列本身(蓝线),这种下降 1)不会立即显现出来,2)在更长的时间段内,这种千瓦消耗的下降是否显著,这一点并不清楚。

这只是移动平均线如何帮助理解时间序列数据趋势的一个例子。这是为什么人们经常看到这些被金融市场中的交易者使用的原因之一,例如,当 30 天移动平均线穿过 180 天移动平均线时,这表明时间序列中趋势的长期变化,并作为一个重要的视觉信号。

2.生成自相关图

回到关于自相关的观点,时间序列不同组成部分之间的相关性也提供了关于时间序列中季节性模式的重要信息。

季节性描述的是时间序列的模式有规律地重复出现的情况。

例如,假设有人正在分析北半球某个国家的温度数据。人们最有可能遇到每年一次的季节性模式,因为每 12 个月就会注意到温度之间最强的相关性。

例如,2020 年 1 月的气温可能与 2019 年 1 月的气温表现出最强的相关性-当将 2020 年 7 月与 2019 年 7 月进行比较时也是如此,等等。

有了这个认识,我们再来回顾一下用电的例子。这是上图中观察到的每日数据的自相关图:

来源:Jupyter 笔记本输出

我们可以看到,相关性的峰值每隔一段时间就会重复出现一次。这意味着电力消费存在每周的季节性,由此消费模式倾向于每周重复。

3.确定是否应该使用对数转换的时间序列

时间序列的对数变换大致近似于该时间序列中各值之间的百分比变化。这可以实现两件事:

a)它可以对两个具有显著不同尺度的时间序列进行视觉比较。

b)它有助于消除时间序列中不提供任何有意义信息的过度变化。这使得时间序列更容易与 ARIMA 等预测模型一起工作,因为它有助于降低时间序列的波动性。

例如,我们来看两个时间序列——一个的标度为0–100,另一个的标度为0–1000

为每个生成 100 个随机数的数组:

来源:Jupyter 笔记本输出

我们可以看到,从视觉的角度来看,没有办法能够比较这两个变量,因为它们在不同的规模上运作。

现在,让我们为这两个标度生成另外 100 个随机数——但这一次这两个序列将进行对数变换。

来源:Jupyter 笔记本输出

我们现在看到,这两个序列在视觉上(以及统计上)更具可比性,这也是为什么各国的时间序列通常是对数转换的原因之一。例如,将美国一段时间内的国内生产总值数字与比利时等国家直接进行比较毫无意义——两国国内生产总值的绝对规模差异很大,因此比较变化率更有意义。

结论

在尝试对时间序列进行建模预测之前,了解该时间序列的性质非常重要。如果时间序列背后的假设是错误的,那么预测输出也将是错误的。

在本文中,您已经看到:

  • 移动平均线在识别时间序列的总体趋势中的应用
  • 自相关图在确定季节性模式中的应用
  • 对数变换在检测时间序列的变化率和消除波动中的作用

非常感谢您的参与,您可以在michael-grogan.com找到更多我的数据科学内容。

免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

大数据的五个阶段

原文:https://towardsdatascience.com/the-five-stages-for-big-data-b89ad1e8e156?source=collection_archive---------20-----------------------

如何实现大数据项目

汉娜·沃伦坎普在 Unsplash 上拍摄的照片

设置大数据环境时,在实施过程中必须考虑五个步骤和主题块。

数据集成

为了处理数据湖或数据仓库中的数据,分析数据或使数据可用于其他系统,必须首先使数据可从源系统获得。源的例子可以是:

  • SAP、Salesforce 等内部系统。
  • 来自甲骨文,微软,MySQL 等内部数据库。
  • 存档文件和日志文件
  • 文档
  • 社交媒体(如脸书或 Instagram API)
  • Web 抓取数据
  • 开放 API/数据

除了来自关系数据库和归档系统的传统批处理和 ETL 流程数据集成(例如,一天一次/多次或 CDC 机制),您还必须关注大数据源,如 IOT 和社交媒体数据,这些数据必须以流形式传输,以满足实时可用性等要求。

数据存储

大数据存储的特点有[2]:

  • 分布式存储
  • 数据复制
  • 本地数据处理
  • 高可用性
  • 数据划分
  • 非规范化数据

基本上,这意味着大数据只需要不同于传统系统的技术。例如,已知的技术有:HDFS、HBASE、Cassandra、MongoDB、谷歌 Bigtable 和许多其他系统,这些系统是大数据和亚马逊红移或谷歌 BigQuery 等经典系统的混合。

数据分析

大数据技术的使用为使用数据开辟了新的可能性。由于更多的可用计算能力(关键字云),更大量的数据可以更快地处理/分析。一些例子是:

  • 深度学习—基于大量数据,例如图像
  • 机器学习——更多的数据可能意味着对模型更好的解释
  • 预测分析—更多属性=更多变量,这解释了数学模型
  • 实时报告—例如在物联网领域

然而,也有新的挑战,如:

  • 数据质量——在大量数据的情况下也能获得良好/有意义的结果(例如,准确的分类模型)。
  • 数据集成—必须从内部或外部来源获得数据。由于需要更多的数据,在这个过程步骤中需要额外的努力,等等。

可视化

在大数据世界中,随着数据越来越多地用于重要的管理决策,数据可视化工具和技术对于分析大量信息和做出数据驱动的决策至关重要。因此,有一种趋势是从直觉和情感决定转向基于数字的理性选择。因此,报告和可视化必须易于理解和有意义。

大数据 Viz-树形图示例—作者提供的图片

越来越多的专业人士能够利用数据来做出决策,并通过视觉来讲述故事,传达数据如何告知人、主题、时间、地点和方法的问题[1]。在大数据领域,由于数据量巨大,可视化带来了新的方法和挑战。因此,必须创建新的可视化技术,以使数据量对用户来说更加有形。

数据安全

防止内部机密数据泄露出去,防止类似[3]的数据丑闻:

  • 脸书(多达 5000 万用户的数据被盗)
  • Google Plus(由于 API 漏洞,50 万用户的私人信息被盗)
  • 英国航空公司(被黑,36 万用户数据被盗)等。

数据安全和数据保护起着至关重要的作用。不仅银行和大型 IT 公司存储了值得保护的用户和客户数据。几乎每个公司都有以下数据:

  • 客户数据(姓名、地址、账号等。)
  • 关于员工的数据(姓名、账号、工资、婚姻状况等。)
  • 财务数据

阅读此处 [4】更多关于数据安全和 GDPR 等重要话题的信息。

摘要

大数据是一个时髦词,新的通常基于云的服务提供了巨大的优势和处理数据的新方法。然而,它带来了需要克服的技术挑战。在这里,我介绍了大数据的五个主要阶段,以及您必须了解和注意的事项。

资料来源和进一步阅读

[1] Tableau,手册 zur Datenvisualisierung:定义,beispile und Lernressourcen(2021 年)

[2] Padgavankar,M. H .,& Gupta,S. R .,《大数据存储与挑战》。国际计算机科学与信息技术杂志(2014)

[3] CAPrice 社区 向隐私泄露致敬:2018 年 21 个最恐怖的数据泄露事件! (2019)

[4] Christian Lauer,数据保护在每个分析项目中都很重要 (2021)

蟒蛇/熊猫的完美管道

原文:https://towardsdatascience.com/the-flawless-pipes-of-python-pandas-30f3ee4dffc2?source=collection_archive---------0-----------------------

招数

在这篇文章中,你将学习如何使用 Python 和 Pandas 中的一个伟大概念来使你的代码更有效、更易读(甚至对你未来的自己而言)

照片由 JJ 英Unsplash 上拍摄

介绍

就职业而言,我是一个机器人。特别是 Tidyverse 就是这样一个强大、干净、易于理解、文档完善的数据科学平台。我向每位初学者强烈推荐免费的数据科学在线书籍。

然而,我的团队选择的编程语言是 Python/Pandas——这也是一个非常棒的数据科学平台。一个主要的区别(至少对我来说)是我们如何编写 Python 代码,这与 R 代码非常不同——这与语法本身无关。

R 的一个优雅之处是使用了管道功能性编程隐喻。这允许您编写更高效、可读性更强的代码。一个很好的例子是 Soner yld rumTidyverse的《完美无瑕的烟斗》一文。

我想重现他的帖子,并向你展示如何为熊猫使用管道(或方法链接)。

什么是管道?

根据r magritter package[1】管道允许您编写代码,具有以下好处:

  • 从左到右(与从里到外相反)结构化数据操作序列,
  • 避免嵌套函数调用,
  • 最小化对局部变量和函数定义的需求,以及
  • 使得在操作序列中的任何地方添加步骤变得容易。

R 不使用管道的示例(参见【2】)

您在下面的代码中看到的是一个典型的例子。我们可以将函数调用的结果保存在一个变量中,例如foo_foo_1,唯一的理由是将它传递给下一个函数调用,例如scoop()

这导致许多变量的名字可能没有意义,结果可能会增加代码的复杂性。

foo_foo_1 <- hop(foo_foo, through = forest)
foo_foo_2 <- scoop(foo_foo_1, up = field_mice)
foo_foo_3 <- bop(foo_foo_2, on = head)

R 管道示例(参见【2】)

R 中的管道与语法%>%一起使用。它允许你链接你的功能。在下面的例子中,试着以下面的方式阅读它:

  1. 我想计算/操作变量 foo_foo
  2. 我要 foo_foo 跳过森林,然后,
  3. 我要foo _ foo去捞一只田鼠最后,
  4. 我要foo _ foo在它头上 bop
foo_foo %>%                  
  hop(through = forest) %>%
  scoop(up = field_mice) %>%
  bop(on = head)

请注意,数据集是一个名词,而函数是动词。您可能会了解它是如何增加代码的可读性的。

为了更好地理解管道代码是如何工作的,下面显示了解释版本:

bop(
  scoop(
    hop(foo_foo, through = forest),
    up = field_mice
  ), 
  on = head
)

Python/ Pandas 中的管道(或者更确切地说是方法链)

因为 Python 中没有 magrittr 包,所以它必须以不同的方式工作。我们将利用在 Pandas 中大多数数据框函数返回数据集本身的事实。这被称为方法链接。让我们继续使用 foo_foo 的例子。

一个可能的 Python 代码可能如下所示:

foo_foo_1 = hop(foo_foo, through = forest)
foo_foo_2 = scoop(foo_foo_1, up = field_mice)
foo_foo_3 = bop(foo_foo_2, on = head)

链接看起来像这样:

foo_foo.hop(through = forest).scoop(up = field_mice).bop(on = head)

这是接近的,但不完全是。添加一个小调整,即()代码周围的括号,使其成为我们想要的样子。请查看下面的代码,它展示了这一点。

(
    foo_foo
    .hop(through = forest)
    .scoop(up = field_mice)
    .bop(on = head)
)

这一概念的好处

我喜欢使用这种编码方式。以下是我在使用这个编程比喻时看到的一些好处:

  1. 您的代码对于团队中的其他数据科学家(以及您未来的自己)来说更具可读性
  2. 您避免了对或多或少无意义的局部变量的需求
  3. 您可以在数据评估中快速添加或删除函数
  4. 在数据评估和分析期间,您的代码遵循您的思路(名词-动词-范式)

R 的管道参考

[1] 马格里特包
【2】Pipes 章节在 R for Data Science book

Python 中完美的管道(即方法链接)

我将遵循 Soner y ldr RM 的文章,以便您比较如何在 R 和 Python 中使用管道/方法链接。Soner 使用了关于墨尔本房产的 Kaggle 数据集。你可以下载它,跟着我。

读取数据集并导入相关包

*# import libs*
**import** **pandas** **as** **pd**

*# read data*
melb = pd.read_csv("../01-data/melb_data.csv")*# Have a quick look at the data*
(
    melb
    .head()
)

作者图片

过滤、分组和创建新变量

下一个例子通过低于 2 的Distances过滤房屋,通过Type分组,并计算每个Type的平均值Price。然后做一些格式化。

(
    melb
    .query("Distance < 2") *# query equals filter in Pandas*
    .filter(["Type", "Price"]) *# select the columns Type and Price*
    .groupby("Type")
    .agg("mean")
    .reset_index() 
    .set_axis(["Type", "averagePrice"], axis = 1, inplace = **False**)
)

作者图片

在下一个例子中,我们将使用多个标准进行过滤计算附加特征。请注意,可以使用功能agg(用于聚合)。我个人多是将assignlambda结合使用。请在此处查看它的运行情况。

(
    melb
    .query("Distance < 2 & Rooms > 2") 
    .filter(["Type", "Price"]) 
    .groupby("Type")
    .agg(["mean", "count"])
    .reset_index() 
    .set_axis(["Type", "averagePrice", "numberOfHouses"], axis = 1, inplace = **False**)
    .assign(averagePriceRounded = **lambda** x: x["averagePrice"].round(1))
)

作者图片

整理

下一个示例显示了如何按区域(仅从字符串 South 开始的区域)的平均距离对房屋数据框进行排序。

(
    melb
    .query('Regionname.str.startswith("South")', engine = 'python') 
    .filter(["Type", "Regionname", "Distance"])
    .groupby(["Regionname", "Type"])
    .agg(["mean"])
    .reset_index()
    .set_axis(["Regionname", "Type", "averageDistance"], axis = 1, inplace = **False**)
    .sort_values(by = ['averageDistance'], ascending = **False**)
)

作者图片

使用柱状图按区域绘制平均距离

美妙之处在于,这一概念并不仅限于评估或操纵数据。您也可以将它与绘图一起使用。就个人而言,我强烈推荐绘图库plot nine——python 中图形的语法的一个伟大实现,它是精彩的 ggplot2 r 包的一个克隆。请在 Medium 上找到一篇关于 plotnine 的扩展文章。

但是对于第一次看你的数据熊猫剧情功能是非常值得的。

(
    melb
    *#.query('Regionname.str.startswith("South")', engine = 'python')* 
    .filter(["Regionname", "Distance"])
    .groupby(["Regionname"])
    .agg(["mean"])
    .reset_index()
    .set_axis(["Regionname", "averageDistance"], axis = 1, inplace = **False**)
    .set_index("Regionname")
    .sort_values(by = ['averageDistance'], ascending = **False**)
    .plot(kind = "bar")
)

作者图片

使用直方图绘制价格分布

(
    melb
    .Price *# getting one specific variable* 
    .hist()
)

作者图片

结论

在本文中,我鼓励在 R 中使用管道,在 Python 代码中使用方法链接,以提高可读性和效率。我强调了一些好处,我们一起将这一概念应用于住房数据框架。我特别展示了如何读取数据框、过滤和分组数据、计算新变量以及如何绘图。再次请务必查看plot nine包,以获得更好的可视化效果

如果您有改进此解决方案的想法,请随时联系我!谢谢大家!

点击此处查看我的更多文章:

  1. 了解我如何为媒体设计文章
  2. 学习如何使用链接(或管道)在 Python 中编写干净的代码
  3. 学习如何使用 R 分析你的 LinkedIn 数据
  4. 学习如何使用图形语法在 Python 中以描述性的方式创建图表
  5. 了解如何在两分钟内用 python 数据科学代码设置日志记录

Gregor Scheithauer 是一名顾问、数据科学家和研究员。他专门研究流程挖掘、业务流程管理和分析。你可以在 LinkedInTwitter 上和他联系,或者在 Medium 上这里。谢谢大家!

有用的资源

Tidyverse 的完美烟斗

原文:https://towardsdatascience.com/the-flawless-pipes-of-tidyverse-bb2ab3c5399f?source=collection_archive---------35-----------------------

探索性数据分析变得简单

Unsplash 上的 Vikas Gurjar 拍摄的照片

Python 和 R 是主导数据科学领域的编程语言。使它们如此高效和受欢迎的是那些简化和加速典型任务的包或库。

在本文中,我们将重点关注 Tidyverse ,这是一个用于数据科学的 R 包集合。Tidyverse 包含几个用于数据分析、操作和可视化的包。

我们将实现的管道实际上来自 magritte 包,但我们没有明确地安装它。Tidyverse 自动加载管道(%>%)。我们将通过几个例子来演示管道如何将数据操作和分析步骤结合起来。

我们将在 Kaggle 上可用的墨尔本住房数据集上做例子。让我们从读取数据集开始。

library(tidyverse)melb <- read_csv("Downloads/melb_data.csv")
head(melb)

(图片由作者提供)

数据集包含关于房屋的 21 个特征。其中的前 10 个显示在表格中,其余的列在底部。

管道基本上是一种执行一系列多重操作的方法。这些操作可以是过滤、选择、聚集、排序等形式。

以下管道计算的是到中央商务区距离小于 2 的每种房型的均价。

> melb %>%
      filter(Distance < 2) %>%
      group_by(Type) %>%
      summarise(avg_price = mean(Price)) Type    avg_price
 <chr>       <dbl>
1  h      1498114.
2  t      1046379.
3  u       711863.

管道用“%>%”表示。我们首先根据给定的条件过滤行。在下一步中,将根据“类型”列中的类别对行进行分组。最后一步中的 summarise 函数根据指定的函数对给定的列进行聚合。

我们可以基于多个条件进行筛选,也可以计算多个聚合。例如,以下管道根据距离和房间数量过滤观察值(即行)。除了平均价格,它还计算每个类别的房屋数量。

> melb %>%
      filter(Distance < 2, Rooms > 2) %>%
      group_by(Type) %>%
      summarise(avg_price = mean(Price), count = n()) Type    avg_price   count
  <chr>     <dbl>     <int>
1   h      1816802\.     60
2   t      1157615\.     13
3   u      1026040      25

我们还可以使用 mutate 函数在管道中创建新的列。例如,下面的管道创建了一个列来显示每个类别中房屋的总价值。

> melb %>%
      filter(Distance < 2, Rooms > 2) %>%
      group_by(Type) %>%
      summarise(avg_price = mean(Price), count = n()) %>%
      mutate(total_worth = avg_price * count) Type  avg_price   count   total_worth
  <chr>     <dbl>   <int>       <dbl>
1  h      1816802\.    60     109008100 
2  t      1157615\.    13      15049000.
3  u      1026040     25      25651000

可以使用排列功能对结果进行排序。以下管道首先过滤以“South”开头的区域,然后按照区域名称和类型对行进行分组。然后我们计算每组的平均距离和观察次数。arrange 函数根据平均距离按降序对结果进行排序。

> melb %>%
      filter(str_starts(Regionname, "South")) %>%
      group_by(Regionname, Type) %>%
      summarise(avg_distance = mean(Distance), count = n()) %>%
      arrange(desc(avg_distance)) Regionname                  Type    avg_distance   count
  <chr>                       <chr>        <dbl>     <int>
1 South-Eastern Metropolitan   h            24.1      388
2 South-Eastern Metropolitan   u            22.7       37
3 South-Eastern Metropolitan   t            21.6       25
4 Southern Metropolitan        t            10.2      425
5 Southern Metropolitan        h            9.33     2721
6 Southern Metropolitan        u            7.34     1549

我们还可以通过在管道中放置 select 函数来选择列的子集。假设我们需要创建一个子集,其中包含价格低于 100 万美元的房屋的类型、价格、地区名称和距离列。我们还想按价格列对行进行排序。

> subset <- melb %>%
      filter(Price < 1000000) %>%
      select(Type, Price, Regionname, Distance) %>%
      arrange(desc(Price))> head(subset)

(图片由作者提供)

通过书写列名来选择列。如果我们要选择的列数接近总列数,那么指定我们不需要的列会更方便。通过在其名称前添加减号(“-”)来排除列。

结论

感谢 Tidyverse 中丰富的函数选择,我们可以创建许多不同的管道。此外,Tidyverse 中的包提供了高效灵活的方式来过滤、转换、聚合、排序和选择数据。例如,我们可以利用 stringr 包中的函数来操作字符串。

在数据分析中使用管道的另一个优点是,它通过将连续或复杂的操作组合在一次执行中,使它们自动化。

感谢您的阅读。如果您有任何反馈,请告诉我。

谷歌翻译对性别刻板印象的强有力和坚持不懈的应用

原文:https://towardsdatascience.com/the-forceful-and-insistent-application-of-gender-stereotypes-by-google-translate-d6b79cbee48?source=collection_archive---------41-----------------------

公平和偏见

世界上最常用的语言翻译工具之一是如何延续偏见的?

注:本文由 Sreyasha Sengupta 合著,他是数据科学家、钢琴家,也是一位老朋友。

作者图片

对于那些在过去十年左右的时间里一直沿着这些路线进行研究的人来说,算法偏见和成见并不新鲜。自然语言作为源数据的现实往往是主观的,也代表了特定的国家、文化、社会和口语因素——当然,还有偏见和刻板印象。在本文中,我们旨在从性别的角度探讨谷歌翻译这一世界上最常用的语言翻译工具所延续的偏见。

谷歌翻译始于 2006 年的统计机器翻译(SMT)系统。基本上,这种系统读入大量数据(在这种情况下,是从源语言到目标语言的多语言文本数据),尝试建立关系模式(在这种情况下,选取常见的源单词/短语及其翻译的对应物),然后使用统计技术来预测结果(在这种情况下,翻译给定的单词/短语)。因此,这些翻译结果只是基于大量训练数据的数学决策的最佳教育猜测。训练数据是通过谷歌的翻译社区通过众包获得的,这意味着全球数百万人贡献数据供算法学习。这种众包可以导致各种不同的人类偏见被编码到数据中,从而编码到算法中。

一些研究人员已经表明,这一翻译过程以英语为支点,即首先将语言 A 中的单词翻译成英语,然后将英语结果翻译成语言 B,而不是直接从语言 A 翻译成语言 B。这一过程可能并且很可能会导致重要上下文的丢失,从而赋予短语“在翻译中丢失”真正的含义。

谷歌翻译利用一种神经机器翻译系统,旨在将句子作为一个整体来翻译,而不是它们的组合部分,类似于人类在语言之间手动翻译的方式。它旨在将更广泛的人类语境应用于翻译,这可能是其偏见编码的原因。由于这种系统是根据人类验证的数据进行训练的,因此人类对性别陈规定型观念的偏见和理解很可能深深植根于系统的工作中。这不仅导致创建一个在翻译层面上有偏见的系统,还通过继续主观知识的人机转移的恶性循环强化了它的存在,其中伦理和道德的基本概念在数学中丢失了。

我们将通过翻译成我们的母语来证明这一点:孟加拉语/孟加拉语。不用深究语言构成的细节,英语和孟加拉语的一个关键区别在于它们的代词用法。英语使用不同的性别代词(“他”/“她”)和中性代词(“他们”/“他们”),孟加拉语只使用中性代词:সে(发音为“shey”)、ও(发音为“o”)等。因此,性别化和性别中立的英语文本可以容易地被翻译成孟加拉语而不丢失信息,并且翻译包含性别中立代词的文本可以容易地被翻译成性别中立的英语。然而,相反的情况往往是困难的,因为在我们的英语语法中,分配性别代词几乎是有条件的,即使是从性别模糊的语言翻译过来也是如此。

不幸的是,谷歌翻译也有这种区别。当从我们的母语翻译成英语时,它不仅将性别分配给性别中性代词,还通过强化大范围的性别刻板印象来做到这一点。下面是这项活动的几个例子。

示例 1:

作者图片

在这个例子中,在孟加拉源文本中没有额外的信息来推断所写的一个或多个人物的优选性别代词。但是,谷歌翻译附加了性别刻板印象,即医生和那些去工作的人必须是男性,而那些做饭,打扫卫生和照顾孩子的人应该是女性。从理论上看,这种翻译并没有错——NMT 给每个代词都指定了一个性别,而且有几种排列方式可以做到这一点。然而,合理的预期翻译可能是“他们是医生”。他们做饭和打扫卫生。他们照顾孩子。“他们去工作”——但这种社会意识的缺失使得模型(及其创造者)不太可能理解可量化的准确性并不能捕捉社会政治。

示例 2:

作者图片

和前面的例子一样,这个例子中的翻译再次强化了一种性别刻板印象:婚姻是一个男人和一个女人之间的事,男人在婚姻中向女人求婚。然而,在孟加拉语文本中,并没有关于被讨论的人的额外的上下文。孟加拉语中的句子可能很容易指的是一个女人问这个问题,或者性别非二元个体之间的问题。在生活的各个方面,包括人工智能,LGBTQ 代表的缺乏不应该在我们身上消失。

示例 3:

作者图片

在这个最后的例子中,翻译体现了性别刻板印象,即男性的角色是保护者,保护和照顾女性。现在你可能已经猜到了,孟加拉语的原句没有对保护者的性别做出这样的声明。公平地说,谷歌翻译学习的数据足以符合我们社会中确实存在的男女权力动态的参数。准确性和性能度量的概念可能需要比纯粹的数字更广泛、更复杂的技术。

谷歌翻译中的这种偏见可以并且已经被证明适用于各种具有类似性别代词缺失的语言:芬兰语土耳其语匈牙利语菲律宾语马来语爱沙尼亚语等等。为了回应用户的这种发现,谷歌在 2020 年宣布了性别中立的翻译,它声称可以更好地检测性别特定和性别中立的上下文之间的差异。然而,目前的这些结果表明,在解决这个问题之前,还有许多工作要做。

以这种想法结束文章也是谨慎的:创造无偏见、有道德和建设性的人工智能的责任在哪里——在数学上还是在人类自己身上?

财富 100 强和黑人的命也是命

原文:https://towardsdatascience.com/the-fortune-100-and-black-lives-matter-f8ef1084f7b6?source=collection_archive---------28-----------------------

作者图片

《财富》100 强在 BLM 抗议期间发布的一组推文揭示了美国企业与社会正义的尴尬关系。

企业使用 Twitter 主要是为了新闻发布、广告和客户服务。但由于与客户平等分享 Twitter,企业从未如此公开地对社会运动的力量负责,尤其是像黑人的命也是命这样的 Twitter 本土运动。

乔治·弗洛伊德于 5 月 25 日去世,随后的抗议活动在他去世后的两个周末达到顶峰,任何没有解决美国历史上最大规模抗议活动的推文往好了说是失礼,往坏了说是对现状的含蓄支持。“站在一边”有重大的商业含义,企业(尤其是那些与政府有合同或保守客户基础的企业)必须决定如何应对这一时刻(如果有的话)。

在这些独特的社会压力下,财富 100 强企业是如何反应的?企业使用“黑人的命也是命”这个词有多舒服?哪些部门最支持这场运动?在他们的行业中,哪些公司是第一个支持抗议者的?还有哪些公司决定若无其事地发微博?

我收集并分析了从 5 月 25 日到 7 月 25 日的财富 100 强推特数据集,希望回答这些问题以及其他关于美国企业与社会责任、种族公正和黑人的命也是命运动的关系的基本问题。

一些警告

本报告并不关注这些公司声明中所谓的虚伪。的报告紧接着的报告显示,企业在过去曾做出类似的承诺改革的声明,但没有做出他们承诺的根本性改变。相反,这份报告只关注了每家公司在 Twitter 上回应的即时性、策略和内容,具体是从 5 月 25 日到 7 月 25 日。

最重要的是,一家公司解决种族平等的努力的实质不能仅凭他们在 Twitter 上发布的内容来判断,任何对这些数字的耸人听闻的反应都会被误导。一些公司决定在内部讨论这个问题,或者在其他社交媒体平台上发布他们的捐款。我试图在的公司细分中提供尽可能多的背景信息。本报告仅调查传播战略。

因为 9 家公司(包括苹果、好市多和摩根大通)没有活跃的 Twitter 账户,所以只收集和分析了财富 100 强中的 91 家公司的数据。围绕数据集管理的进一步微妙之处,如将 Twitter 句柄映射到企业,解决种族不平等的推文的特征,以及 Twitter 数据的局限性,在数据集的网页上有详细解释。虽然这种分析主要集中在文本数据上,但我也让下载了可用的媒体

安静的公司

正如人们所料,许多企业没有对抗议活动发表任何公开声明,也没有进行慈善捐赠。但这只是财富 100 强中令人惊讶的一小部分。91 家公司中只有 6 家似乎没有发表任何评论,无论是在 Twitter 上还是在 Twitter 外:洛克希德·马丁公司、瓦莱罗能源公司、菲利普斯 66 公司、能源转移公司和甲骨文公司。

当被问及缺乏公开声明时,Phillips 66 发言人 Allison Stowe 说,“在那段时间,公司的重点仍然是内部员工。”

福特汽车也没有发推特或发布新闻稿。想必他们试图保持中立,但当错误地将与黑人的命也是命的捐款联系起来时,福特发布了一份声明,澄清“福特很自豪成为美国生产警用、应急和急救车辆的长期领导者。”福特声称将供应三分之二的警车。当他们的员工质疑福特与警察部门的关系时,福特发布了一份内部备忘录(最终被泄露)。当时的首席执行官吉姆·哈克特回应道,“困扰警察信誉的问题与他们驾驶的车辆无关。”

在 Twitter 上的 91 家公司中,有 19 家没有发关于种族不平等的微博。航空航天和国防领域的《财富》100 强企业中,没有一家企业和一半的能源企业在推特上发布关于抗议的消息。这也许并不奇怪,因为这两个部门都依赖于政府合同和监管,而政府当时并没有明确支持 BLM 运动。

当被联系时,通用动力公司和雷神技术公司(两家航空航天和国防公司)解释说,他们主要使用 LinkedIn 进行交流。雷神公司发言人克里斯·约翰森说,“我们认为推特的字数限制了我们深思熟虑的交流能力。”

甲骨文是科技行业的异类,是财富 100 强中唯一一家没有在推特上报道抗议活动的科技公司。他们也没有发表声明。甲骨文董事长拉里·埃里森曾是前总统特朗普的支持者和捐助者(尽管并非没有来自员工的反对),所以这种反应可能也不会太令人惊讶。记者无法联系到甲骨文置评。

一些公司向支持种族公正的组织进行慈善捐赠,但没有在 Twitter 上或甚至通过任何正式的公共渠道提及此事。例如,诺斯罗普·格鲁曼公司发布了一份声明,称他们将捐出 100 万美元,并为员工捐款 100 万美元。他们没有发微博。埃克森美孚加入了其他 30 家公司的“同舟共济”活动,为少数股权企业集体筹集了 10 亿美元。他们没有发表声明。《华尔街日报》援引了 Progressive 公司首席执行官 Tricia Griffith 的话,他提到该公司承诺向“公平正义倡议”捐赠 100 万美元。《华尔街日报》的引用似乎是唯一一次提到它。通用电气的首席执行官概述了一项增加多样性的计划,包括来自通用电气基金会的“100 万美元资助经济包容性”。通用电气基金会有自己的推特简介,没有在推特上发布关于这项努力的消息。

显然,过于吹嘘自己的捐赠有时会显得很没品味。但是这些公司中的许多人过去并不羞于在推特上发布他们的慈善捐赠,这表明缺乏宣传不是谦逊,而是一种政治考量。

这一趋势揭示了企业奇怪的经济计算:向种族正义组织捐款对于支持内部员工的需求很重要,但过于公开捐款可能会有分裂客户群的风险。

最好的例子是 Publix Super Markets,尽管他们没有在他们的主页面上发布关于他们向全国城市联盟捐赠 100 万美元的推特,但当直接回应批评 Publix 在种族正义问题上保持沉默的顾客时,他们会提到他们的捐赠。同时他们的员工不能戴“BLM”面具,因为它被定义为“非公开信息”记者无法联系到 Publix 置评。

一些公司没有采取一致的公开立场,而是似乎在实践一种双重思想,试图两全其美。从上面看,这当然很奇怪,但它可能是成功的。如果你的客户和员工有不同的需求和不同的媒体渠道,细分你的沟通策略并不困难。

长期利息

在为期两周的大规模抗议活动中,企业发推的频率减少了一半,其中大约三分之一的推文涉及抗议活动或乔治·弗洛伊德之死。正如人们可能预料的那样,随着时间的推移,企业对在推特上更多地谈论他们的产品、更少地谈论种族公正感到满意。下图中的双峰显示了对第一波抗议的回应,第二个高峰是 6 月 10 日那一周。

查看代码

一些公司决定只发几条有意的推文。例如,迪士尼或百事可乐发出了谴责种族主义的第一份声明,第二份声明称他们正在向种族正义组织捐款,然后在 6 月底以正常速度发布了推文。这是迄今为止在 Twitter 上讨论黑人的命也是命最流行的方式。超过一半的企业在推特上发布了三条或更少的抗议信息。

与此同时,也有一些明显的例外,一些公司要么将这一运动作为其品牌身份的核心,要么一直在推特上谈论他们的公司将如何解决种族不平等问题。发推特最多的公司是美国电话电报公司和威瑞森通讯。两人都领导了持续的推特运动,引用了黑人雇员的话,强调了黑人拥有的企业。

耐克和可口可乐等其他公司很少发微博,但当他们发微博时,他们会发微博表示对黑人的命也是命运动的支持。

即时响应

企业反应的即时性,尤其是明确支持黑人的命也是命的企业,尤为重要。这场运动最终提升了公众对黑人的命也是命的支持,但直到抗议活动后期才明朗起来。与那些等到抗议活动达到顶峰后才表态支持的公司相比,那些早早表态支持的公司在运营时获得的信息要少得多。

一些公司将 Twitter 的即时性视为公司沟通策略的核心。当被问及 Twitter 是否是传达企业价值观的有效媒介时,沃尔格林发言人苏珊娜·巴斯顿说:“绝对是。尤其是对于实时、紧急的通信来说,它是一个必不可少的工具——在危机时刻,展示你作为一家公司的价值观至关重要。”

查看代码

在 Twitter 上,微软是反应最快的,其首席执行官于 5 月 28 日在 Twitter 上发布了关于他们改革刑事司法系统的努力。但是耐克公司在 5 月 29 日是第一个更直接地表达抗议的公司,他们的视频“不要这样做。”

大多数发布声明的公司都是在乔治·弗洛伊德(George Floyd)去世后的一周发布的,从 6 月 1 日周一开始,但也有一些公司等了几周才发表评论。一些公司能够将他们关于种族不平等的第一条推文与 6 月 19 日(星期五,2020 年 6 月 19 日)配对。如果一家公司在 6 月初犹豫是否要在推特上发布关于黑人的命也是命的消息,Juneteenth 提供了第二次机会来解决这个问题。例如,Capital One 在 6 月 5 日发布了一份声明,承诺向各种种族正义组织捐赠 1000 万美元,但决定在 6 月 10 日之前不在 Twitter 上分享该新闻稿。其他使用这种策略的公司有康菲石油公司、马拉松石油和脸书。

脸书是科技行业中最后一个在推特上谈论种族公正的人(不包括甲骨文,甲骨文没有发表任何评论)。但是公司很早就被卷入了种族公正的争论。5 月 29 日,总统在推特上写道“当抢劫开始时,枪击开始。”该推文因“美化暴力”在推特上被删除,但脸书首席执行官马克·扎克伯格决定不审查该帖子,尽管一再 承诺删除煽动暴力的政客的帖子。经过一周的员工抗议,扎克伯格在 6 月 5 日发表了一篇脸书邮报,概述了脸书将如何审查其政策。两周后的 6 月 18 日,脸书在推特上发布了针对黑人企业的 1 亿美元拨款计划。

“黑人的命也是命”禁忌

22 家财富 100 强公司在 5 月 25 日至 7 月 25 日期间使用了“黑人的命也是命”这个词。也就是说,#BlackLivesMatter 标签并不受欢迎,只有六家公司使用:英特尔、思科系统、辉瑞和可口可乐在推特上使用这个标签,然后耐克和美国电话电报公司在他们的推特个人资料中使用它。

按行业划分,科技行业最常提到“黑人的命也是命”,10 家科技公司中有 5 家在推特上提到它。四家金融公司也参与其中,但由于金融行业占据了财富 100 强中的 24 家公司,所以从比例上来说,其重要性较低。剩下的公司分布在许多部门。

理解这些数字的来龙去脉会有所帮助,但要获得财富 100 强与 Twitter 上的短语“黑人的命也是命”之间关系的完整历史并不简单。Twitter 限制了程序员可以访问的推文数量,当直接搜索时,Twitter 警告“搜索 API 并不意味着是推文的穷尽来源”,因为他们不能保证所有推文都被索引。

无论如何,作为一个粗略的启发,我们可以使用 Twitter 的高级搜索来查找每个公司在 2020 年 5 月 25 日之前的完整历史中“#BLM”、“BLM”、“BlackLivesMatter”和“黑人的命也是命”的实例。

在 Twitter 上的 91 家财富 100 强公司中,自黑人的命也是命运动开始以来的 8 年里,Twitter 只发现了两条 推文,均来自谷歌,一条来自 2015 年,一条来自 2016 年。尽管 Twitter 的搜索引擎存在局限性,但可以肯定地说,直到 2020 年夏天,财富 100 强企业都在犹豫是否要在 Twitter 上发布“黑人的命也是命”。

尽管有这种趋势,但很明显,企业仍然对采用这个短语犹豫不决:49 家企业在推特上发布了向种族正义倡议捐款的消息,而只有 22 家明确表示“黑人的命也是命”

对国会大厦袭击的反应

2020 年的黑人的命也是命抗议和 1 月 6 日对国会大厦的袭击是不一样的;然而,自 2020 年 BLM 抗议以来,1 月 6 日是 Twitter 上最悲伤的一天,这两天都引发了企业对社会和政治问题的行动。比较这两种反应会有所帮助。

最大的收获是,虽然 91 家公司中有 71 家对 BLM 的抗议做出了回应,但只有 21 家对国会大厦的暴民做出了回应。

此外,虽然有 49 人在推特上谈论为 2020 年的种族正义倡议提供资金,但有 6 人在推特上谈论停止为没有投票证明选举的共和党国会议员提供资金: AT & T波音思科AIG甲骨文信诺。(尽管这个列表很可能会增长。)BLM 运动似乎更直接地呼吁企业解决种族不平等,但三倍的差异不仅表明了像黑人的命也是命这样的 Twitter 本土社会运动可以影响企业行动,也表明了去年夏天的抗议活动是多么强大和独特。

几乎每一个对国会大厦暴民发表声明的公司也对 BLM 的抗议发表了声明。但最有趣的是三家公司,它们没有谈论 BLM,但却谈论了国会大厦的暴民:波音、甲骨文和纽约人寿保险。

对于那些有兴趣对这两个事件之间的比较进行更深入分析的人,欢迎你使用财富 100 条回应国会大厦袭击的推特的列表。流行信息也对财富 500 强公司的反应进行了很好的总结

进一步研究

如需进一步的统计问题和详细说明数据收集和处理方式的文档,请访问数据集的网页。我在公司总结页面上收集了一些公司的背景信息。同样,数据集只能回答针对该公司在 Twitter 上的行为的问题。仅使用该数据做出任何价值判断(即“公司是坏的”、“公司是好的”)都是不诚实的。

发推特的公司一定更“好”吗?美国电话电报公司在推特上谈论种族正义的次数比其他任何一家财富 100 强公司都多,但在国会大厦暴徒之前,他们也是众议员汤姆·科顿(Tom Cotton)最大的企业捐助者之一,汤姆·科顿鼓励对黑人的命也是命抗议者采取军事行动,在全美有色人种协进会的支持率为 6%。尽管将黑人的命也是命作为其品牌身份的核心,耐克仍然公布了糟糕的多元化数据。脸书在推特上很少提到黑人的命也是命(可能是因为他们有自己的社交媒体网站),但捐赠了 1 亿美元支持黑人拥有的企业,这一金额比他们的同龄人的捐赠高出几个数量级。

我们才刚刚开始看到企业在社会运动中如何吸引和解决顾客问题。重要的是,在分析这种行为时,我们要记住,一家公司的影响力几乎来自所有东西,除了他们的 Twitter 平台。社交媒体活动可能是衡量企业价值观的粗略启发,但要全面理解美国企业与种族公正的关系,我们不能让推特和新闻稿分散对企业举措的实质、有效性和一致性的分析。

本报告的互动版本可在本项目网站上获得。

在条形图竞赛中可视化财富 500 强公司

原文:https://towardsdatascience.com/the-fortune-500-bar-chart-race-9612dc9d0e63?source=collection_archive---------29-----------------------

使用 Python 和 fluorescent 可视化世界最大公司的排名和收入趋势

由 Vectorarte / Freepik 设计

公司在激烈和残酷的全球竞争中兴衰,因此,想象一下过去几十年中全球顶尖公司的进步将是非常有趣的。

《财富》全球 500 强 是按收入衡量的全球 500 强企业的年度排名,它是运行可视化分析的良好数据来源。我认为使用代码(Python)和非代码(fluore)解决方案生成条形图比赛动画也是一种丰富的体验。我们开始吧!

目录

(1) 数据采集
(2) 数据准备
(3) 条形图竞用 Python 条形图竞用
(4) 条形图竞用兴盛(5)附加见解

数据采集

财富 500 强搜索页面中检索到关于财富 500 强公司收入和排名的公开数据。数据是在没有任何形式的 web 抓取的情况下提取的,因为数据集的大小很小,并且将值复制粘贴到 Excel 表中的简单方法远比编写抓取代码更有效。

虽然最近的数据包含了有用的信息,如利润、资产和员工数量,但这些功能在本项目中被忽略了,因为它们仅从 2015 年开始可用。因此,该分析侧重于收入(美元),该数据自 1995 年以来一直可用。

据此,我整理了一个数据集,其中包含 26 年来(1995 年至 2020 年)全球 500 强公司的年收入和排名的 13,000 个观察数据。

注意:财富 500 强的原始数据源中有一个错误,其中 2007 年和 2008 年的数据集是彼此重复的。

数据准备

1)数据预处理

我们首先将 Excel 表导入 Python Jupyter 笔记本(使用 openpyxl 包)并将它们连接成一个 Pandas 数据框架。

串联数据帧的随机样本(10 行)

预处理步骤至关重要,主要是因为我们需要为每个独特的公司提供一个一致的标识符(即标准化名称),以便跟踪他们的进度。多年来,这一问题因几个问题而变得复杂:****

  • 合并和收购导致不同的公司名称
    (例如‘埃克森’+‘美孚’=‘埃克森美孚’)
  • 公司名称因品牌重塑而改变
    (例如“Amazon . com”->“Amazon”)
  • 公司名称格式不一致
    (如“沃尔玛商店”与“沃尔玛”)
  • 缩写和非缩写名称产生的不同版本
    (例如‘英国石油’和‘BP’)

还采取了额外的努力(例如搜索财富 500 强网站)来了解这些公司的历史,以便准确地捕捉代表它们的名称。

我的最终目标是只显示条形图竞赛中排名前 10 的公司,因此我简化了数据清理过程,将重点放在曾经进入前 10 的公司上。进行了两轮预处理:

****第一轮:删除公司名称中的填充词,如“有限公司”、“公司”、“P.L.C .”、“公司”、“A.G .”等。
第二轮:识别公司名称的不同变体,用标准化的替换。这允许对这些公司多年来的数据进行准确的检索。下面是预处理代码的一个片段:

master_df['Name'].replace('Apple Computer','Apple',inplace = True)
master_df['Name'].replace('Amazon.com','Amazon',inplace = True)
master_df['Name'].replace('American International Group','AIG',inplace = True)
master_df['Name'].replace('British Petroleum','BP',inplace = True)

2)数据帧格式

在验证预处理已经成功完成(通过手动检查输出)之后,我们需要将数据帧转换成宽格式,以便进行条形图比赛可视化。格式如下:

  • 时间部分(即年份)作为索引
  • 每一行都包含该特定年份的值(在索引中)
  • 每一列都包含各个公司的值
  • 数值代表公司的年收入(百万美元)

格式化的数据帧应该如下所示:

用于条形图比赛可视化的格式化数据帧的快照

注:“0”值表示该公司在当年的世界 500 强榜单中是 而不是

既然数据集已经正确格式化,让我们探索两种可视化条形图竞赛的方法,即使用PythonT0 和flower**

用 Python 进行条形图竞赛条形图竞赛**

Python matplotlib 库已经让我们可以相对容易地构建条形图比赛,如本文中的所示。为了用更少的代码行更有效地完成它,我利用了构建在 matplotlib 之上的bar-chart-race包。它的官方文档可以在这里找到

这是用于生成条形图竞赛的 Python 代码(其中输出是. mp4 文件):

下面是条形图比赛输出(显示为低分辨率 gif):

Python 中的条形图比赛可视化(值代表年收入,单位为美元)

注意:要将动画保存为. mp4(以后可以转换为 gif),我们需要 安装 FFmpeg 将 FFmpeg bin 文件夹添加到路径 中。

虽然bar-chart-race包可以让我们创建基本的功能条形图比赛动画,但它仍然有很多需要改进的地方。一些缺点包括:

  • 需要进行多次代码更改,以便进行细微的美学更改(例如,颜色、位置等。)
  • 可用于动画定制的有限选项
  • 无法在更改后立即显示图表

至此,让我们来看看,通过允许我们无需任何代码就能轻松地生成漂亮的可视化效果,fluore 是如何克服这些问题的。

条形图竞赛与蓬勃发展

是一个强大而灵活的平台,用于数据可视化和讲故事,让用户可以轻松地将电子表格转化为交互式可视化。它配备了一系列的功能和模板(包括条形图竞赛),允许使用简单的点击选项进行轻松编辑。

将格式化的数据集导出为 Excel 文档后,将其导入到 fluore 平台上的新可视化中。只需几个步骤就可以生成下面的条形图竞赛:

在 fluore 中的条形图比赛可视化(值代表年收入,单位为美元)

虽然我从编写功能性代码中获得乐趣,但我更喜欢能够帮助我以更简单、更实用的方式完成任务的工具。繁荣当然符合这里的要求。

蓬勃发展提供了广泛的定制,包括一个播放按钮,供用户暂停或倒带条形图比赛(尝试点击上面的交互图!)。**

这个漂亮的可视化是用免费计划完成的,唯一的缺点是数据和项目必须是公开的,并且图表的 HTML 版本不能在本地下载。

因为这个可视化是公开的,所以您可以随意复制我的条形图比赛副本,并通过点击右上角的“复制和编辑”按钮在 fluore 上进行试验:**

点击右上角的按钮复制繁荣可视化|作者图片

其他见解

排名靠前的公司

通用汽车在 20 世纪 90 年代领先排行榜,但自 2002 年以来,沃尔玛一直是排名中的主导力量。事实上,在过去的 26 年里,沃尔玛令人难以置信地 15 次排名第一(没有减弱的迹象)。

按收入计算,沃尔玛经常是全球最大的公司

比较排名最高和最低的公司

多年来,全球 500 强公司中排名靠前和垫底的公司之间的收入差距越来越大。这主要是因为随着时间的推移,排名第一的公司的收入显著增加。

全球 500 强公司排名和收入趋势(可视化由 Plotly 完成)

1995 年的收入差额是 1679.92 亿美元,自 2020 年以来已经增长了两倍,达到 4985.78 亿美元。有趣的是,一家公司进入世界 500 强的“截止”收入保持相对稳定,大约在 170 亿到 220 亿美元之间。

结论

在这篇文章中,我分享了如何获取和预处理数据(用 Python ),以可视化财富全球 500 强公司的排名和收入趋势。我还讨论了如何使用代码(Python bar-chart-race)和无代码(fluore)解决方案创建条形图比赛动画。这个项目的 Python 代码可以在这个 GitHub 页面上找到。

在你走之前

欢迎您加入我的数据科学学习之旅!点击此媒体页面,查看我的 GitHub ,了解更多精彩的数据科学内容。同时,尽情享受使用 Python 的乐趣吧!**

*** ***

ML 生产系统的四个成熟度等级

原文:https://towardsdatascience.com/the-four-maturity-levels-of-ml-production-systems-94c4468e6b3?source=collection_archive---------31-----------------------

行业笔记

训练模型只是开始

乔希·卡特Unsplash 上拍摄的照片

和很多 ML 从业者一样,我是从 Kaggle 比赛开始我的 ML 之旅的。但是 Kaggle 的舒适设置,在那里你得到的是基本上干净的数据以及特征和标签,这与今天的 ML 从业者的现实相去甚远。事实上,模型构建过程本身只是开发 ML 解决方案并在生产中部署和维护它时需要完成的工作的一小部分。

根据各种成熟度来谈论大规模生产系统是很有用的,其中最不成熟的系统是一次性模型,最成熟的系统自动运行,在最少的人工干预下进行自我更新。在这里,我将 ML 系统大致分为四个逐渐成熟的级别,并讨论了每个级别所涉及的一些挑战。

免责声明:鉴于媒体的选择(一篇博客文章,而不是一本书的一章),这个列表肯定会不完整,我也不想这样。如果您发现缺少了某个重要的方面,欢迎您在评论区添加。

第一级:“空白状态”

在第 1 级,您既没有标注也没有要素,因此您需要创建两者。

先说标签。你需要多少标签?这取决于标签分布、您想要测量的指标以及您对该指标的确定程度。

假设您有一个不平衡的二进制分类问题,每 100 个样本中有 1 个阳性样本,您需要开发一个召回率为 90%的解决方案。标记样本越少,召回测量的噪声越大:这种噪声被称为散粒噪声。对于这个问题,一个好的开始将是单独为测试集准备 100K 个标签,这样您在召回上的散粒噪声将不超过 0.1%。对于训练集,您可能还需要至少 100K,但越多越好。像主动学习或伪标记这样的高级技术可以进一步简化和加快标记过程,正如 Eugene Yan 在他的文章“引导标签”中所讨论的那样。

接下来,功能。当今典型的业务问题包含许多不同类型的特征,数字、分类、文本,有时还包括图像。你需要决定你是要做你自己的特征工程,还是把原始数据扔进一个深度神经网络,它会隐式地学习数据表示。

在获得标签和功能后,现在是考虑正确模型的时候了。从我的个人经验来看,如果训练数据和特征是经过仔细选择的,那么简单的基线模型(线性/逻辑回归、基于树的集成)通常会提供很好的性能,并且应该始终作为一个起点。当实践者在没有首先对简单基线进行基准测试的情况下就直接跳到高级方法,如深度神经网络时,我经常感到惊讶。

级别 2:生产中的一次性模型

祝贺您,您的模型已投入生产!但是,令人惊讶的是,工作还没有完成,现在才刚刚开始。

最重要的是,你需要为你的模型的预测建立审计,以便随着时间的推移跟踪它的表现。审计集的设计取决于您想要跟踪什么指标,以及您想要该指标有多精确(同样,散粒噪声会限制您的测量)。

通常,对于不平衡的分类问题,如电子商务中的欺诈检测,社交媒体上的仇恨言论检测,或制造业中的缺陷检测,召回比精度更难审计。正如我在上面解释的那样,在不平衡率为 1/100 的情况下,您至少需要 100K 个审计样本,以便在散粒噪声不超过 0.1%的情况下测量召回率。精度更容易:假设您期望模型以 50%的精度运行。然后,只需 2K 个样本,就可以达到不超过 0.1%的散粒噪声水平。换句话说,由于不平衡率为 1/100,您的召回审核需要比精确审核大 50 倍。

级别 2 本身可以细分为各种成熟度:在最低级别,模型将简单地将具有高模型分数的样本搁置给人类专家,而不自己采取行动。在最高程度上,模型将自动对大量样本采取行动。这些动作(来自模型本身和人类)需要被记录在数据库中,以便它们可以在以后(在第 3 级)被重新用于模型重新训练。

级别 3:手动模型更新

通常,所有的 ML 模型都受到概念漂移的影响:在模型被部署后,我们周围的世界发生了变化,导致模型性能下降。根据领域的不同,这可能发生得非常快,如在欺诈检测模型中;也可能发生得比较慢,如在产品分类模型中。

由于概念漂移,您需要频繁地用最新的数据更新模型,或者在某些预定义的时间间隔,或者当性能下降到指定的阈值以下时。更新模型的训练数据可以通过以下三种方式之一收集:
1 .每次更新模型都可以收集一个全新的人类标注的训练集;
2。您可以使用现有审核标签的记录(来自人类专家)作为训练数据;
3。您可以使用记录的预测标签和审核标签的组合作为训练数据。

①可以说是最严谨,但也是最昂贵的着手方式。利用现有记录来更新模型更经济。(2)如果审计样本数量足够大,是一个很好的选择。(3)如果模型生成的标签的质量足够高,比如 95%以上的精度,则是一个好的选择。然而,(3)可能会引入危险的反馈循环:如果模型存在偏差,并且一直对特定人群做出错误预测,那么根据模型自身的标签重新训练模型将会放大该偏差。

第四级:自动驾驶

手动模型更新会造成流失,因此级别 3 不是理想的最终状态。如果一个 ML 团队部署了大量的模型,那么由手工模型维护引起的操作负担会变得难以承受,从而产生技术债务。幸运的是,这个过程可以并且应该通过 AWS Lambda 和 Step 函数等工具实现自动化。最简单的解决方案是定期安排再培训工作。更复杂的解决方案可以在审计性能低于指定阈值时触发重新培训工作。

一旦你达到第四级,你就达到了成熟的最高水平。团队可以指派一名(轮流)待命人员,只需要在自动模型更新失败时采取行动,而不是让一名团队成员专门手动维护模型,从而腾出时间投入到改进模型的研究和部署中。

ML 代码本身只是一个成熟的 ML 生产系统的一小部分。图片鸣谢:斯卡利等人,机器学习系统中隐藏的技术债务(链接)

结论:永远以第四级为目标

在商业环境中应用 ML 仍然是一个相对年轻的领域。根据我的个人经验,我见过的大多数工作都在 1 级和 3 级之间。我坚信四级自动驾驶系统应该永远是 ML 团队的最终目标,因为它们固有的可扩展性。因此,在从第 1 级到第 3 级的旅程中,应该始终牢记这最后一个阶段。

最后,还要考虑第 4 级之后会发生什么,即(很少讨论的)当不再需要 ML 模型时优雅地放弃它们的问题。在为不同目的服务的多个模型之间创建依赖关系时要小心,例如,通过将模型 A 的输入作为特性提供给模型 b。这起初听起来可能令人兴奋,但是一旦存在这样的依赖关系,一旦时机成熟,就很难甚至不可能放弃一个模型。最好有一个长远的想法,通过构建 ML 系统,在未来,可以优雅地弃用,而不会破坏业务的其他部分。

四个最常见的数据科学面试问题以及如何准备

原文:https://towardsdatascience.com/the-four-most-common-data-science-interview-questions-and-how-to-prepare-for-them-2a39f7647ec5?source=collection_archive---------53-----------------------

图片来自与岛一起工作

面试一个数据科学的职位可能是一项艰巨的任务,尤其是对这个领域的新手来说。我已经数不清这些年来我参加过多少次数据科学面试,但这里有我遇到过的四个最常见的问题和准备每个问题的策略。为这些问题做准备是发展你的故事论点的好机会,这是任何数据科学面试中最重要的部分。

最常见的数据科学问题:

1)说说你自己。

2)描述一份你从事过的数据科学工作。

3)你对杂乱的数据有什么样的体验?

4)你用过哪些编程语言和软件?

问题 1:说说你自己吧。

这可能是所有行业和领域中最常见的面试问题,而不仅仅是数据科学,因此这是数据科学面试中最常见的问题这一事实似乎并不令人惊讶。一个好的答案对建立良好的第一印象至关重要,并奠定你的主要故事或论点,你是谁,你会在整个面试中回来。

在数据科学采访中,我强调我对使用数据科学工具帮助组织解决以前令人烦恼的复杂问题的热情。如果你不确定你的论文是什么,我设计了这个活动来帮助人们解读它。下面是我描述自己的一个例子:

“我爱上了数据科学,因为我喜欢帮助组织解决复杂的问题。在我过去的工作中,我综合运用了数据科学和社会科学技能来探索和构建复杂问题的解决方案,而组织内的典型工作方式对这些问题不起作用。打破复杂问题并使用数据科学来开发潜在的创新但有用的解决方案的智力刺激让我充满活力。你们遇到了什么样的问题,导致你们需要找到像我这样的数据科学家?”

你的自我描述应该讲述你是谁,如何证明你是这个职位的合适人选,并对公司有所帮助。就像你的面试主题一样,如果你设计得很好,那么你回答的其他每一个问题都将简单地涉及充实你的自我故事的三个基本部分中的一个(或一个组合):1)你是谁,2)你的身份如何使你天生适合这个角色,以及 3)这将如何有益于公司。

图片来自免费照片

关于我是如何讲述我的故事的,下面是另外四个需要注意的重要观察:

  1. 我强调我是谁——一个为复杂问题开发独特解决方案的创新者——同时展示我的创新者身份自然与数据科学联系在一起,并可能对组织有所帮助。你可能不认为自己是一个“创新者”,但诀窍是根据什么让你充满活力和激情来确定你是谁,然后展示如何履行你申请的数据科学角色是你的天然选择。
  2. 我用普通的语言讲述了这个故事,而不是专业术语。我发现,我的许多面试(如果不是大多数的话),尤其是第一轮面试,都是与没有技术专长的员工进行的,由于你通常不知道面试官的技术专长水平,所以宁可错在非技术方面。
  3. 我让我的故事保持正面,只提到我喜欢做的事情。有时,人们本能地试图通过描述他们不喜欢做的事情来说明他们想要什么:例如,“在之前的最后一份工作中,我知道我不喜欢做 Y,所以我想做 X”或“我正在做 Y,我讨厌它”。我想退出。”如果面试官问我,我会稍后描述我故事的这些方面,但我会一开始就坚持积极的方面:只提我想做的事情。
  4. 我使用了强烈的、主观的、甚至是情绪化的短语,比如“爱上了”、“对……充满热情”和“被……激励着”乍一看,这些短语似乎过于非正式,但我发现它们有助于面试官记住我。不要做得太过分,但是更加生动和有风度通常会帮助而不是损害你的数据科学职位的面试机会。

问题 2:描述一个你参与过的数据科学项目。

这是我遇到的第二个最常见的问题,所以请确保你准备了一个范例项目来展示。他们可能会问你很多关于你的项目的问题,所以我会建议你选择一个你做得很棒的项目,一个你引以为豪的项目。除非有披露问题,将你的工作发布在 GitHub、博客、LinkedIn 或其他在线网站上,并在你的求职申请中包含一个链接。

如何解释这个项目取决于你的面试官的专业程度。我通常从非技术性的、高层次的解释开始,如果面试官继续提问,我会提供技术细节。这使得面试官可以自由选择他们在后续工作中想要的专业技术水平。一个称职的数据科学家面试官会很快将谈话引导到他/她希望了解的项目的更多技术方面,但即使如此,开始非技术方面的谈话也表明你知道如何有效地向非技术受众传达你的工作。

当描述你的项目时,你有效地讲述了项目的故事,大多数项目故事有以下核心组成部分:

图片来自 geralt

谁:你可能是故事的主角(毕竟这是你的采访,所以自然选择一个你是主要驱动力的项目或项目的一部分),但你可能需要设置多个重要的次要角色,比如谁委托了这个项目,它是为谁做的,数据是关于谁的,等等。

什么:你的项目寻求解决的问题、需求或疑问通常会形成项目故事的“冲突”,所以一定要解释是什么导致了问题、需求或疑问(在故事中,称为煽动事件)。

时间和地点:项目发生的时间框架/背景(例如,您正在工作的组织或您参加的项目课程)。你需要多长时间来完成这个项目也很重要。

如何:你解决了什么问题。如果你在发现什么有效之前尝试了很多方法,“如何”包括你的方法论故事和你的最终解决方案(这是你如何克服项目的上升和下降行动的一部分)。这是你故事的核心。您需要技术和非技术方面的描述:

技术方法:一般来说,技术描述的两个核心部分是你使用的模型(以及你尝试过的任何模型,如果适用的话)和你如何确定你选择的特性/变量。另一个重要的部分可能是你如何清理和/或收集数据。

非技术人员如何做:我发现非技术人员通常不会从我结束使用的模型或我的特征选择过程中收集到太多信息。相反,我解释了我确保模型必须解决我刚刚设置的问题的功能类型:例如,“我建立了一个模型,它基于数据源 A、B 和 C 计算 X 现象的概率,测试各种类型的模型以确定哪种模型做得最好,然后辨别这些数据集中的哪些变量最好使用。”对于非技术观众来说,这已经足够了。对他们来说,核心组件是什么进入了模型(数据),模型从中产生了什么结果,以及它如何通知问题、需求或驱动项目的问题。

最后,在你的 how 解释中,确保你使用了任何编程语言和软件:Python、R、SQL、Azure 等等。

为什么:确保你对为什么的非技术性解释与你对如何的非技术性解释一致。我经常看到数据科学家犯这样的错误,他们试图用技术上的“为什么”来解释非技术上的“如何”,而忽略了非技术人员。特别是,我不会在我的非技术解释中解释您用来比较模型或决定特征选择过程的度量或标准,因为这些可能会失去一个非技术人员。如果我的非技术性的“如何”描述关注的是模型使用了什么数据以及它用这些数据做了什么,那么我的非技术性的“为什么”关注的是为什么构建一个模型来做这件事很重要,以及它如何在现实世界中帮助他人和/或我自己。

这些是项目故事的基本组成部分。这里的是我最常用的项目,通读的时候,随意分析一下我是如何呈现故事的各个组成部分的。我写这篇博客是为了普通读者,所以我提供了我的非技术性的方法和原因。

图片来自达尔文蔬菜

问题 3:你对杂乱的数据有什么样的体验?

面试官问我这个问题的频率出奇的高。他们通常会先解释说,他们组织中有许多杂乱的数据,需要为他们未来的数据科学家清理/处理。这是展示您对数据科学和数据科学问题的熟悉程度的绝佳机会。

我通常会这样回答:

是的,我不得不一直整理和清理杂乱的数据。这在数据科学的课程中是正常的:数据科学家之间流传的笑话是,任何数据科学项目的 90%都是数据清理,而 10%实际上与数据清理有关。至少你们诚实地承认了你们的数据是混乱的。例如,当我作为顾问工作时,我与许多组织谈论潜在的数据科学项目,如果他们说他们的数据是干净的,随时可以使用,那么他们很可能是在对自己或对我撒谎,说他们的数据实际上是多么混乱和随意。事实上,你们坦率地承认自己的数据很乱,这告诉我,作为一个组织,你们正在现实地评估自己的现状和需求。”

这个答案不仅证明了我以前处理过混乱的数据,还把这个领域的问题正常化为可以由专家(比如我自己)解决的问题,并称赞他们的坦率。自信而积极地回答这个问题让我在一些面试中脱颖而出,成为最有希望的候选人。给出一个好的答案是一个让面试官喜欢你的绝佳机会。

问题 4:你用过什么编程语言和/或软件?

尽管技术面试官可能也会问这个问题,但我在非技术面试官中最常遇到这个问题。根据我的经验,数据科学家面试官有更多的内部方法来判断你是否真的了解数据科学,但对于非技术面试官来说,这个问题是他们探索这一点的最初方式。有时,他们会抓住一系列软件和/或语言来决定你是否合格。

现在,我相信,拥有使用你将加入的数据科学团队所使用的软件的确切组合的经验,通常不是工作成功的重要标准。对于一个优秀的数据科学家来说,在掌握了几十种软件系统或编程语言之后,再去学习另一种软件系统或编程语言并不是一件难事。但是他们的问题是完全自然和合理的,所以你必须回答。

图片来自杰拉德

如果他们问你用过什么软件和语言,列出你用过的,也许从你最常用的开始。我通常从提到 Python 开始,因为它不仅是我最喜欢的数据科学语言(见这篇文章),而且传达了我对编程很熟悉的信息。

然而,更多的时候,他们可能会问你以前是否使用过 X 软件,通常会问你是否使用过他们面前列表上的每个软件。我绝不会建议你撒谎,声称你有从未使用过的软件的经验,但是我会建议你提供一个与你使用过的软件相当的软件来重写一个“不”字。这里有一个例子:

“不,我没有用过 Julia,但那是因为我更喜欢用 Python 做别人可能会用 Julia 做的事情。Python 在复杂性方面是一种相当高功能的编程语言,我工作过的数据科学团队碰巧更喜欢它而不是 Julia。”

这不仅以更积极的方式传达了“不”,而且表明你熟悉他或她刚刚提到的软件,并有信心用它来匹配你的潜在团队。

问题 5:你对工作的期望是什么?

大多数情况下,这是面试官问我的最后一个主要问题,但我在一开始也遇到过。他们可能会把这个问题留到最后,因为这个问题很容易转移到面试的下一部分:要么他们描述这个角色,要么你提出你的任何问题。

如果你在第一个问题中很好地展示了你的论文故事,那么在这里你只需要从不同的角度重述它。你已经打好了基础,现在你只是把它带回家。如果他们在“说说你自己”这个问题之前,在面试一开始就问我这个问题,那么我就用这个问题从这个新的角度复述我的论文故事。

以下是我的典型回答:

“就像我说的,我被如何帮助组织解决复杂的数据科学问题所激励。这些年来,我在一个组织中发现了两件具体的事情帮助我做到了这一点。首先,我在激励性的工作环境中茁壮成长,在这种环境中,我有空间和资源来创造性地思考问题。其次,我还需要能够与来自各种背景和学科的人一起工作,我可以向他们学习,并开发解决手头问题的创新方法。你们两个似乎都有。[然后,我会根据您在面试中对公司的了解,解释为什么他们似乎同时提供了这两种信息,或者如果我们还没有机会谈论他们,请在公司内部询问这些信息。]"

请注意,第一句话引用了我对“说说我自己”问题的自我解释答案。如果他们在我演讲之前问这个问题,我会花大约 30 秒或 1 分钟做一个简短的自我介绍,然后继续回答剩下的问题。

图片来自 jenoliver777

结论

以上是我遇到的最常见的五个数据科学面试问题,以及如何准备。我发现,当数据科学家就如何准备工作面试给出建议时,他们通常专注于准备高度技术性的事实性问题(例如,这里的和这里的)。尽管拥有坚实的数据科学基础可能很重要,但精炼你的整体故事主题——你是谁,你热衷于做什么,以及这与这份工作有什么关系——在面试过程中更重要。

我发现,人类,甚至被认为是“书呆子”的数据科学家,倾向于与人和故事联系起来,所以如果你能在那里吸引他们,他们通常会更好地记住你,更有可能雇用你。当你有一个引人入胜的故事时,所有其他的问题都会自然而然地到位,作为对整个故事的直观的进一步澄清。

https://ethno-data.com/common-science-interview-questions/.】https://ethno-data.com/common-science-interview-questions/.【原文发表于此】更多关于网站和其他文章的信息,请前往https://ethno-data.com/。)

也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见*。***

我在 2021 年参与的四个最有价值的数据项目

原文:https://towardsdatascience.com/the-four-most-valuable-data-projects-i-worked-on-in-2021-9fe55d422f37?source=collection_archive---------19-----------------------

作为一名数据通才,我在 2021 年参与了许多奇怪、令人惊讶的项目

无论您是数据科学家、BI 开发人员还是数据工程师,您的目的都是从数据中提取价值。

2021 年,我走出了定义数据和分析工作的传统框框。我不再担心我正在做的工作的类型,而是专注于通过数据提供价值。最终的结果是,这一年充满了各种奇怪但影响深远的项目。

在本文中,我将与您分享我在 2021 年参与的 4 个最有价值的数据项目。我还会给你一些建议,告诉你如何在你工作的地方识别有价值的项目。

从本地 SQL Server 迁移到 Azure 云

问题

ETL 是最古老也是最无聊的数据项目之一。然而,我一次又一次地看到它成为许多公司的优先事项。

2021 年,我们的 BI 团队在 Power BI 实例上经历了长时间的数据刷新。一项分析表明,问题的根源在于我们整合数据集的方式。

解决方案

使用 Azure Data Factory (ADF ),我规划并开发了一个从本地数据库到 Azure SQL 数据库的 90%的迁移。我构建了几十个管道作业,将数据从基于旧 DB2 的 AS400 零售数据库运行到 Azure cloud 中。

我们有几个电源 BI 报告,从需要 1 到 2 个小时来刷新,到不到 5 分钟就可以刷新。迁移使 BI 和其他团队不必再在数据库之间移动来查询某些数据。几乎每个团队现在都可以在同一个位置获得他们需要的所有数据。

该项目每周为我们的分析师和其他从业者节省了几十个小时。在这一年中,该项目将节省大量成本和时间。

用于电子商务运营的自动化图像聚合

问题

我公司的电子商务团队花费大量时间处理运营任务。过去,一项耗费大量时间的具体任务是收集图像并上传给销售我们产品的零售商。当收到图片请求时,我们的电子商务团队必须根据各个零售商的 SKU 列表手动查找并下载每张图片。

解决方案

对于这个项目,我首先编写了一个查询,将外部客户 SKU 与我们的内部商品分类联系起来。有了这些数据,我就能够用 Python 编写一个 for 循环,它将接受一个 SKU,并使用我们的 CMS 工具的 API,识别一组与 SKU 相关的图像链接。然后,我的脚本将使用图像链接,并通过 web 调用将每个图像下载到公司的 One Drive 文件夹中。

我结合使用微软表单和 MS Power Automate 来提交图片请求。使用 Power Automate 允许用户提交表单,并将提交内容写入数据库表。然后,我的 python 脚本根据提交时间戳寻找新提交到表中的内容。

要完成这个简单的任务,需要大量不同的 API 和技术:

  • Azure SQL 数据库的内部数据集和 SQL 查询
  • Salsify 和 Microsoft Graph APIs
  • Microsoft 表单和电源自动化

与上面的迁移项目类似,这个项目的主要价值是节省时间。我让我们的电子商务团队的生活变得更加轻松,同时节省了他们手动下载图片的数百个小时。

拍摄的照片来自 Pexels

产品管理工作流分析

问题

我公司的产品管理团队在一年的时间里准备并提交了几十个新产品。预测、规划、电子商务和艺术部门都参与新产品的发布,这使得协调项目发布变得复杂。市场上没有一个项目管理解决方案能够完全满足我们复杂的零售和电子商务业务的独特需求。

PM 团队想要一个解决方案,他们可以提交关于新产品的信息,并自动将任务分配给各个团队。随后,他们还希望有一个仪表板,可以看到所有不同任务的进度。

解决方案

这个项目在很大程度上得益于我们是一家基于微软的公司。作为公司 Office 365 客户,我们用来使项目工作的许多工具(就像以前的项目一样)都是免费的。使用 Power Automate,我建立了一个产品管理提交表单,通过 Microsoft Planner 启动了一个大型任务列表。这个表单会自动分配并通知不同的团队成员。然后,使用一些简单的 SQL 和 Power Automate 内置的 SQL 写回功能,我能够编写检查来查看任务是否已经完成,然后相应地分配新任务。

不可否认,这个解决方案是由鸭带在一起!但是,它有效。使用我的数据技能和一些无代码工具的组合——我能够构建一个我的 PM 团队在市场上的任何项目管理工具中都找不到的过程。

拥有一个易于遵循的自动化流程来跟踪新产品,意味着项目经理可以节省时间来构思新产品,并减少跟踪产品任务所花费的时间。这一过程也有助于新产品更快地进入零售市场,这意味着从产品开发到收入的时间更短。

自动化内容更改检测

问题

我公司的艺术和电子商务运营团队过去常常花大量时间管理内容变更。一件商品投入市场后,在其生命周期中会经历数十次变化,包括新功能、颜色,以及关键字、标题、描述和图像的变化。跟踪所有这些变化并确保它们在众多零售商之间同步是一项繁重而单调的任务。

解决方案

通过将 CMS 系统中的产品数据快照/加时间戳到我们的数据库中,我能够编写 SQL 查询来比较和对比同一 SKU 在一段时间内的差异。例如,如果一个新产品在 2020 年 11 月上线,它可能会在其生命周期中的不同日期更改图像和标题。然而,我们的 CMS 并没有通过它的 API 来记录这个变化。为了解决这个问题,我开始每天对包含来自 CMS 的产品内容数据的表进行快照。然后,我编写了针对这些表的查询,以查看在不同的日子里相同的 SKU 之间的列/记录是否有变化。通过在 Power Automate 中实现 SQL 查询,我能够自动触发一个通知,通过电子邮件和微软团队发送给适当的团队。

在产品上拥有正确的内容组合会对其销售业绩产生重大影响。这个通知工具允许我公司的内容团队快速、轻松地对我们产品的所有不同位置进行调整,并确保每个产品都显示正确的内容。虽然持续内容变化的影响难以衡量,但该项目不仅为我们的电子商务和艺术团队节省了数百个小时,还通过发现各自零售页面上内容不匹配的产品,创造了数以千计的销售额。

外卖食品

作为数据从业者,很容易将我们的工作职能局限在一个狭窄的盒子里。构建模型和数据管道、清理数据、编写查询和构建仪表板只是其中的一部分任务,但数据和分析可以做得更多!就像我之前说的,数据专业人员的目标不是执行数据人的任务,是为了公司的整体利益从数据中提取价值(创造收入,节约成本)。

只要你在做,你如何创造价值并不重要。在我数据生涯的最后几年里,这个事实变得尤其普遍。

你可以在你的公司或创业公司做同样的事情。以下是我用来帮助找出高价值机会和数据技能组合的几种方法:

  • 如果你读过我的其他文章,你会知道我这是在白费力气,但是:从人和问题开始,而不是技术。忘记 Python 和 R 的争论,去和你公司周围分析之外的从业者和领导者交谈,找出人们真正关心的是什么。是什么让人们感到紧张?有没有数据可以帮助减轻这个人的压力,让他们的生活更轻松?我保证,如果你把这作为优先事项,你将会被高价值的项目所淹没。
  • 走出你的舒适区。如果你主要是一名数据科学家,大部分时间都在开发模型和特性工程,那么尝试涉足一点自动化或数据工程。使用 Python 脚本和 cron-job 创建一个简单的自动化。尝试使用自动化工具,如 Microsoft Power Automate 或 Zapier。另一方面,如果你主要是 BI 开发人员(分析工程师等)。)问问你自己,你是否有其他方法来传达你的见解。充满小部件的仪表板真的是交付该项目的洞察力的最佳方式吗?带附件的备用通知会更好吗?也许是电子邮件?或者与他们已经在使用的系统集成?可能性是无限的。
  • 不要害怕成为多面手。专家非常重要,但通才可能更有用(大多数时候)。你的技能范围越广,你能解决的问题就越多。一旦你在一些数据技能方面有了一个有能力的基线,不要害怕扩展到其他领域,这样你就可以应对更有趣的挑战。你可以通过思考那些你、你的老板或你的团队想做,但决定“超出范围”的项目来发现机会。要问的问题是:“如果它在范围内呢?”只要能激起你的兴趣,就去追求它。一个也能制作 web 应用的数据工程师比一个超级专家数据工程师更有价值(也更有趣)。其他例子:可以用 API 和自动化工具编码的数据分析师;了解营销战略和营销运营工具的数据科学家。一个能写 R 闪亮应用的 BI 开发者。忘记那句常见的格言,要更深入——深入到足够的深度,然后再拓宽。

希望这篇文章为您提供了一些独特的方法,为您公司的数据专业人员提供价值。

如果你喜欢这篇文章,并想阅读我的更多内容,在 medium 上关注我。你也可以在推特上找到我 @camwarrenm

数据可观察性的四大支柱

原文:https://towardsdatascience.com/the-four-pillars-of-data-observability-95a96a1a24e7?source=collection_archive---------16-----------------------

数据可观察性的四个支柱:指标、元数据、谱系和日志(图片由作者提供)

了解数据状态的必要和充分条件是什么?

回答诸如“我们的桌子是最新的吗?”以及“这种度量是反常的吗?”需要我们数据的历史知识。在存储数据的完整快照变得可行之前,我们只能捕捉近似值。

我们需要什么信息来重建我们数据的有用图像?这就是我们在这篇文章中试图回答的问题。描述我们的数据所需的信息类型与支撑新兴的数据可观察性类别的支柱相同。

为什么我们还需要另一个 X 柱?

软件可观察性建立在的三个支柱之上,即度量、跟踪和日志。指标是描述一段时间内软件系统组件的数值,如微服务的 CPU 利用率或 API 端点的响应时间。跟踪描述了基础设施之间的依赖关系,例如从 API 端点到数据库的应用程序请求的生命周期。日志是描述基础设施状态及其与外部世界交互的最细粒度的信息。

这三个支柱的目的是描述可用于重构的信息类别,尽可能详细地描述与用例相关的软件基础设施的状态。这与为什么术语“可观测性”是从控制理论中借用的密切相关,在控制理论中,可观测性被定义为“系统内部状态可以从其外部输出的知识中推断出来的程度的度量”。这些支柱一起让用户推断出系统在过去任何时间点的内部状态。因此,软件和 DevOps 工程师可以随时了解他们的基础架构。

数据可观察性从软件可观察性中获得灵感,尽管有重要的差异,比如数据片段和数据系统组件之间的谱系。由于这些差异,软件可观察性的三个支柱并没有完全满足数据团队的需求,无论他们是数据操作、数据工程、数据科学还是分析工程团队。最大的相似之处是随着时间的推移,他们的目标是增加对数据系统的可见性。

软件可观测性和数据可观测性工具的比较(图片由作者提供)

我们如何推导出四大支柱?

本着这种精神,我们要问:我们对数据了解多少才能推导出它在任何时间点的状态?我们添加了两个额外的约束:我们希望最大限度地精简支柱的数量,同时确保它们是正交的,以最大化每个支柱的信息价值。

这篇文章的灵感来自热力学的一个概念:材料的密集和广泛属性。密集属性不取决于材料的大小。例如,材料的温度、密度、压力和粘度不取决于材料的含量。一杯水的温度可以和整个海洋的温度一样。

度量:数据的内部特征

在数据世界中,与密集属性相似的是数据本身的属性。如果数据是数字,属性包括关于分布的汇总统计,如平均值、标准差和偏斜度。如果数据是分类的,分布的汇总统计可以包括组的数量和唯一性。

对于所有类型的数据,可以通过计算完整性、是否包含敏感信息以及准确性等指标来描述数据本身。这些都是不同的数据质量指标,它们描述了汇总底层数据的某个方面,无论它们是针对仓库中的静态数据表计算的,还是针对数据管道中正在传输的数据计算的。

元数据:关于数据的外部特征

相反,广泛的属性与材料本身无关,如质量、体积和热容量。你可以拥有一磅或一升的水和黄金。请注意,这种类比并不准确,因为在热力学中,广泛的属性取决于物质的数量,而新鲜度和结构并不取决于此。

元数据通常被定义为“关于数据的数据”,但我们要补充的是,元数据是“关于独立于数据本身的数据的数据”与数据世界的直接类比包括数据量(行数)、数据结构(模式)和数据及时性(新鲜度)等属性。

虽然数据的容量、模式和新鲜度会对内部指标产生影响,但它们可以在保留统计特征的同时独立扩展。相反,数据的内部特征可以改变,而不会影响卷、模式或新鲜度。元数据可以和度量标准一起用于识别数据质量问题。

数据质量的高级维度(图片由作者提供)

沿袭:数据之间的依赖关系

使用度量和元数据,我们可以尽可能逼真地描述单个数据集。然而,现实世界中的数据集通常不是孤立存在的,它们位于数据仓库中,彼此之间没有关系。

我们可以从物理科学中得出另一个类比,系统可以在自身内部建模,但我们的理解可以通过建模交互来丰富。例如,热力学系统具有较小的具有内部相互作用的组件,并且还具有与外部环境的相互作用。

从 dbt 生成的表数据谱系示例(来自 dbt Labs 的图像)。

在数据世界中,主要的内部交互是从一个数据集派生另一个数据集。数据集源自上游数据,并可用于衍生下游数据。这些双向依赖被称为数据的血统(也称为出处),以及整个系统之间(这个仓库依赖于那些来源)、表之间、表中的列之间以及列中的值之间的血统的抽象级别范围。

日志:数据和现实世界之间的交互

有了描述数据内部状态的指标、描述其外部阶段的元数据以及描述数据片段之间依赖关系的谱系,我们只缺少了一个部分:数据如何与外部世界交互。我们将这些交互分为机器-机器交互和机器-人交互。

机器与数据的交互包括移动,例如当数据通过 ELT 工具从数据源(如事务数据库或外部提供者)复制到分析仓库时。交互还包括转换,例如当 dbt 作业将源表转换为派生表时。日志还记录这些交互的属性,例如复制或转换所花费的时间,或者该活动的时间戳。

至关重要的是,日志捕捉数据和人之间的人机交互,如数据工程团队创建新模型,利益相关者使用仪表板进行决策,或数据科学家创建机器学习模型。这些人机交互有助于理解谁负责数据以及如何使用数据。

把所有的放在一起

有了描述数据内部属性的指标、描述外部属性的元数据、描述依赖关系的谱系以及描述交互的日志,我们就有了四个可以利用的杠杆,来全面描述数据在任何时间点的状态。

没有任何一个支柱,我们重建数据状态的能力都是不完整的。

如果没有指标,我们将无法了解数据本身的内部属性,从而无法基于指标的实时异常检测发出警报。如果我们只有元数据,我们会知道数据的形状、结构和时间,但不一定知道我们是否有坏数据。

没有元数据,我们就不知道数据的结构、构造或时序,这使得像模式变化检测这样的用例或通过跟踪停机来满足服务水平协议(SLA)变得不可能。这些用例对于提高数据可靠性和减少数据停机时间至关重要。如果我们只有指标,我们将知道数据是否正确,但不一定知道它是否在适当的时间内被刷新。

如果没有沿袭,我们就不知道不同的数据是如何相互依赖的,这就很难分析数据质量问题的上游根本原因和下游影响。如果我们只有指标和元数据,我们会对数据的健康状况有一个整体的看法,但对问题之间的关系却不完整。

没有日志,我们不知道 ELT 和转换工具等外部系统如何影响我们的数据,以及外部用户如何受到我们的数据的影响。只有数据血统,我们知道数据是如何关联的,但不一定知道那些关系有多重要(有人使用这些数据吗?)或谁对上游变更负责(谁可能导致问题?).

让支柱发挥作用

开始建立这些支柱是一个项目,不要让完美成为好的方式。2021 年的大多数数据团队对他们的系统了解甚少,所以第一步就是开始。要开始收集指标,您可以从识别最重要的表和指标开始,定期查询这些指标的属性,如nullnessmeanstddev

元数据通常由您的数据仓库提供,像 Snowflake 和 Google BigQuery 这样的仓库提供行计数、模式和表的最后更新时间的快照。您可以从将元数据存储到单独的表中开始。

血统和日志更具挑战性。推断表和列之间的谱系是一项困难的任务,但是有一些开源库提供了一个起点。如果您使用 dbt 或 Prefect 之类的转换工具,那么您很幸运,可以开始接收这些系统生成的元数据。存储和解析日志高度依赖于数据栈中的工具,尽管您的 ELT 和 BI 工具通常会提供访问这些日志的 API,并且您的仓库可能会存储查询历史。

如果您没有带宽来构建收集数据资产的指标、元数据、世系和日志的系统,那么这就是数据可观测性平台的用武之地。这是一个由商业和开源工具组成的活跃生态系统,可以自动收集这些信息,将其合成为可用的形式,并与您已经使用的工具集成。

摘要

  1. 在随着时间的推移存储数据快照变得可行之前,我们依赖于存储数据的近似值,即有损压缩
  2. 数据的四类特征构成了数据可观察性的四大支柱
  3. 指标和元数据支柱描述了数据本身的内部特征及其外部特征
  4. 沿袭和日志支柱描述了我们的数据内部的依赖性及其与外部世界的交互
  5. 如果没有这四个支柱中的任何一个,我们在给定的时间点只能看到不完整的数据

如果这篇文章引起你的共鸣,我们很乐意聊天!你可以联系到 凯文 ,团队在 元位面 ,或者 在这里预定一个时间

强化学习的四个策略类别

原文:https://towardsdatascience.com/the-four-policy-classes-of-reinforcement-learning-38185daa6c8a?source=collection_archive---------12-----------------------

思想和理论

强化学习解决策略的综合分类

图片由汉斯·布拉克斯梅尔通过皮克斯贝拍摄

强化学习(RL)的政策笼罩在某种神秘之中。简单地说,策略 π: s →a 是返回问题可行行动的任何函数。不多也不少。例如,你可以简单地采取第一个想到的行动,随机选择一个行动,或者运行启发式。然而,RL 的特别之处在于,我们主动预测决策的下游影响,并从我们的观察中学习;因此,我们希望我们的政策中有一些智慧。在他的顺序决策框架[1]中,Warren Powell 认为 RL 有四个政策类别。这四类技术被广泛应用于各个领域,但还没有得到普遍认可。本文将对这种解决方案策略的分类做一个简短的介绍,这无疑是不完整的。

求解 MDP 模型

在继续强化学习之前,让我们先稍微回忆一下解析解。通常,我们的目标是将 RL 问题公式化为马尔可夫决策过程(MDP)模型。如果我们靠近 MDP,强化学习的目标将是求解相应的贝尔曼方程组,从而找到最优策略 π* :

MDP 的贝尔曼方程。找到最优策略 π* 产生最优值函数 V(s) ,反之亦然。

但是我们实际上并不需要贝尔曼方程。最终,我们只是试图最大化一个累积的回报;最优策略正是这样做的。它还消除了考虑价值函数【v^π(s'】*的需要,这是我们只在四个策略类之一中做的事情。因此,我们可以将我们的目标陈述如下:

时间范围内的报酬函数。最优策略 π使累积报酬最大化。*

要解决 MDP 模型的最优性,基本上有两种方法:(一)政策迭代和(二)价值迭代。策略迭代修复策略,计算相应的策略值,然后使用新值更新策略。该算法在这些步骤之间迭代,直到策略保持稳定。价值迭代实际上依赖于非常相似的步骤(见下图),但是旨在直接最大化价值函数,并且仅在之后更新策略。注意,找到最优值函数等同于找到最优策略;任一个都足以求解贝尔曼方程组。

策略迭代(左)和价值迭代(右)的比较。请注意策略迭代的迭代特性和值迭代中的最大值运算符。改编自萨顿&巴尔托[2]

大多数(如果不是全部的话)RL 算法要么基于策略迭代,要么基于值迭代(或者两者的组合)。由于部署的模拟方法通常不能保证找到最优策略,在 RL 中我们分别谈到策略近似值和值近似值。鲍威尔指出,这两种策略可以细分为两类,总共产生四类,即将讨论。只需要一些基本的符号,我们就可以开始了:

s :状态(做出决策所需的信息)

a :动作(可行操作 on 状态)

π :策略(将状态映射到动作)

ϕ :基函数(从状态中导出特征)

θ :特征权重(策略的参数化)

t :时间点(离散时间点)

R :奖励功能(在状态下采取行动的直接奖励)

V :价值函数(某种状态的下游奖励)

策略近似

在策略近似解决方案中,我们直接修改策略本身。当策略具有清晰的结构时,这样的解决策略往往效果最佳。我们可以区分两类:PFA 和 CFA。

政策功能近似(PFA)

策略函数近似(PFA)本质上是策略的参数化函数。直接插入状态返回一个可行的动作。线性 PFA 可能看起来像:

政策功能近似(PFA)示例

这里的关键挑战是找到合适的基础函数ϕ(s】抓住决策过程的本质。要做到这一点,需要对问题的结构有很好的洞察力。通过选择更通用的功能表示,例如神经网络(演员网络),使用状态作为输入并输出动作,可以减轻设计工作。这种 PFA 表示的缺点是参数调整变得更加困难,并且可解释性受到影响。无论如何,对问题结构的牢固理解仍然是必要的。

成本函数近似法

像 PFA 一样,成本函数近似(CFA)也直接搜索策略空间。然而,CFA 不直接返回动作,而是在受约束的动作空间中解决优化问题。一个示例配方是:

成本函数近似值(CFA)示例

PFA 直接返回一个动作,而 CFA 要求我们首先求解一个参数化的最大化函数。请注意,真正的奖励和价值函数已经被一个近似的奖励函数所取代。此外,动作空间 A^π受到策略 π 及其参数化 θ 的约束,通常产生比原始空间更小的动作空间。注意,CFA 的最简单形式仅仅是贪婪启发式,然而修改的奖励函数可以嵌入探索元素。每次迭代的计算工作量可能高于 PFA(由于最大化步骤),但所需的设计工作量较少。

价值近似值

价值近似值明确考虑了当前决策的下游影响,考虑了整个决策范围。提醒最优价值函数等同于最优策略;它们都给出了贝尔曼方程的相同解。当政策结构不突出或我们不能恰当地监督当前决策的下游效应时,价值近似值可能是合适的。

价值函数近似(VFA)

价值函数近似值(VFA)将下游价值表示为一个函数。贝尔曼方程的一个问题是,在采取一个行动后,随机事件可能会把我们带到许多新的状态 s'∈ S' 。因此,对于每个动作,我们应该考虑所有可到达状态s’的值以及在那里结束的概率。vfa 通过用确定性近似函数 V_t(s_t,a_t) 代替随机期望项来规避这个问题。在规范形式中,VFA 看起来像:

价值函数近似值示例(VFA)

最简单的 VFA 是一个查找表,其中存储了每个状态-动作对的平均观察值。足够的迭代允许我们学习每一对的精确值,然而这在计算上很难处理。因此,我们通常求助于捕捉状态本质的特征,我们可以通过例如使用自动编码器来手动设计或提取这些特征。因此,我们在紧凑函数(例如,critic 网络)中捕获状态-动作值,并通过观察来调整特征权重。

直接前瞻近似(DLA)

设计 VFA 通常需要很好地理解问题结构,尽管神经网络在一定程度上缓解了这个问题(以额外的调整为代价)。直接前瞻逼近(DLA)只是对下游值进行采样,而不是导出显式函数。DLA 可由以下代表:

直接前瞻逼近的例子(DLA)

诚然,这个等式看起来很麻烦,但实际上可能是最简单的。预期项意味着我们对未来进行采样,并应用一些(次优)策略来估计下游值。尽管我们在当前时间 t 最大化所有可行的动作,但是对于未来时间周期t’,我们通常使用计算量更小的策略(例如,启发式)和/或简化的问题表示(例如,假设完全预见)。DLA 战略带来了自己的挑战(情景取样、汇总技术等)。),但与其他三种策略不同,它不需要估计函数(因此,用“前瞻”替换“函数”不仅仅是语义上的)。因此,对于其他三种策略都失败的复杂问题,它通常是最后的手段。

混合班

如果不提到结合多个职业的策略的选项,那将是我们的失职。例如,经典的演员-评论家框架包含了 PFA(演员)和 VFA(评论家)的元素。然而,还有更多的组合,例如将 VFA 作为下游策略嵌入到直接前瞻算法中。与单一类别的解决方案相比,组合策略可能会消除彼此的弱点,通常会产生更好的结果。

外卖食品

根据 Powell 的说法,实际上任何解决方案策略都可以归为四个策略类别中的一个(或多个)。除此之外,从分类中还可以得出一些有趣的结论:

  • 没有一刀切。虽然有一些经验法则,但多种策略可能会产生好的解决方案。在 Powell&Meisel[3]中可以找到这种说法的一个具体例子,展示了对同一问题的所有四种解决策略的实现。
  • 学者喜欢优雅。PFA 和 VFA 似乎在学术界最受欢迎。毕竟,在一个函数中捕捉一个复杂的决策政策有一定的数学美。
  • 行业喜欢结果。当问题变得太大或太复杂时,CFA 和 DLA 可能会产生意想不到的好结果。尽管更多地依赖于蛮力和枚举,但设计工作量却大大减少了。
  • 万物皆有价。在便利性、设计努力、计算复杂性、可解释性等方面总是存在权衡。问题的本质决定了这些权衡的轻重。
  • 分类是关键。有许多 RL 社区,许多技术,许多符号风格,许多算法。为了简化领域并促进进步,需要一个清晰的总体框架。

参考

[1]鲍威尔,沃伦 b .“随机优化的统一框架。”欧洲运筹学杂志275.3(2019):795–821。

[2]萨顿、理查德 s .和安德鲁 g .巴尔托。强化学习:简介。麻省理工学院出版社,2018。

[3]鲍威尔、沃伦·b .和斯蒂芬·梅塞尔。"能源中的随机优化教程——第二部分:能量存储图解." IEEE 电力系统汇刊31.2(2015):1468–1475。

傅立叶变换,应用(1):频域介绍

原文:https://towardsdatascience.com/the-fourier-transform-1-ca31adbfb9ef?source=collection_archive---------14-----------------------

了解 FFT 幅度的基础知识

我努力理解傅立叶变换,直到我把这个概念映射到现实世界的直觉上。这是一系列越来越技术性的解释的第一篇文章。我希望直觉也能帮助你!

声音是机械波,是空气或其他介质中的振动。音符对应波的频率。高频波对应高音(高低压之间变化较快),低频波对应低音(高低压之间变化较慢)。

这些波随着时间在空间中传播。当声波到达麦克风时,它会摆动一种叫做振膜的结构。隔膜的运动产生电流,这使我们能够记录加压和减压的速率。

图 1 :对于一个纯音来说,压力随时间变化绘制出一个简单的正弦曲线。对于复杂的音调,即纯音的混合,压力随时间的变化是正弦曲线的总和。

如果我们考虑一个固定的麦克风,当一个波通过它时,记录的压力变化是时间的函数。这种在时间域中的表现与我们的直觉吻合得很好:随着时间的推移,压力以与频率相对应的速率周期性地增加和减少。更复杂的音调是多个频率的总和(图 1 )。

信号在时域中的这种表示是 密集的:对于大多数域来说是非零的。但是我们知道,我们可以更简洁地谈论音乐音调,而不是描述每个时间点的压力。相反,我们可以简单地命名一个音符,或者,等价地,用赫兹(Hz) 表示频率:每秒的周期数。

在频域中,x 轴表示频率,y 轴表示信号中的频率量。对于图 1 中描述的简单音调,这种描述在频域中是稀疏的:在大部分域中是零。

傅立叶变换是一种数学运算,它将时域或空域中的信号映射到频域中的函数。

傅立叶变换正是我们想要的!它采用了我们在图 1 中绘制的密集时间信号,并给出了图 2 在频域中的稀疏描述。从图上看,每个分量频率都很明显。

图 2 :对于图 1 中相同的三个信号,离散傅立叶变换的正频率项的幅度。x 轴值对应于窗口时间段内的周期数。

如果我们将来自图 1 的信号的持续时间视为一秒,则图 2 中的 x 轴值对应于赫兹。傅立叶变换恢复第一个曲线的 5Hz,第二个曲线的 25Hz,以及第三个复音调的组合。对于所有其他频率值,傅立叶变换近似为零值。现在,我们只考虑的量级,我们将在以后的帖子中探索更多!

图 3 :使用 my repository source 的音频图,同时使用 Tone Gen app 播放 440Hz 音调!

我发现对实时音频数据进行傅立叶变换实验是最有价值的!我构建了一个小型 Python 库,对从计算机麦克风录制的简短片段进行傅立叶变换,并对其结果进行实验。

查看来源!尝试乐器和环境声音。

https://github.com/peterbbryan/Understanding-Fourier/tree/master/fourier_1

如果回购或文本对你有价值,请为文章鼓掌!如果你遇到了其他帮助你理解数学概念的隐喻,请留下评论。

如果人们感兴趣,我期待着写越来越多的傅立叶变换的技术总结!感谢阅读!

查看本系列的下一篇文章!

傅立叶变换,应用(2):了解相位角

原文:https://towardsdatascience.com/the-fourier-transform-2-understanding-phase-angle-a85ad40a194e?source=collection_archive---------2-----------------------

了解 FFT 相位的基础知识

在前一篇文章中,可视化专门讨论了傅立叶变换的幅度。在这里,我们将扩展缺失的部分:阶段!

查看该系列的前几篇文章!

https://peterbbryan.medium.com/the-fourier-transform-1-ca31adbfb9ef

在上一篇文章中,我展示了如何利用傅立叶变换的幅度来估计信号的频率成分。然而,仅仅依靠频率,我们无法完美地重建信号;我们需要相位!

图 1 :三个相同的正弦波相位偏移。图片作者。

如果我们看一个纯音音频文件,但我们将信号从左向右移动,会怎么样?

在我们之前的音频示例中,这是一个挑战。左侧的所有三个信号(图 1 )具有相同的频率。高压和低压之间的振荡速率是相同的。唯一不同的是起始位置,从左向右移动。

我们可以把这表示为“相移”这三个信号的频率相同,只是在振荡的起始位置有所偏移。查看三个生成等式,分别为 0.5 * cos(5x)、05 * cos(5x + 1)和 0.5 * cos(5x + 2),该失调以余弦表达式中的和值表示,即 0、1 和 2。

图 2 :使用傅立叶变换的 np.angle 恢复的近似相位。图片作者。

这种相位信息也用傅里叶变换表示,可以用 numpy“角度”函数恢复。如果我们在与幅度最大的频率相同的索引处查看相位值,就可以确定与该频率成分相关的相位偏移。在这里(图 2),傅立叶变换从上面的等式中恢复 0、1 和 2!

https://github.com/peterbbryan/Understanding-Fourier/tree/master/fourier_2

如果回购或文本对你有价值,请为文章鼓掌!感谢阅读!

查看本系列的下一篇文章!

傅里叶变换,应用(3):复数数据中的幅度和相位编码

原文:https://towardsdatascience.com/the-fourier-transform-3-magnitude-and-phase-encoding-in-complex-data-8184e2ef75f0?source=collection_archive---------8-----------------------

重新实现 np.abs 和 np.angle 以更好地理解 FFT

对于傅立叶变换的幅度和相位值可以告诉我们信号的复合频率,我们已经有了一个常识性的理解。现在,我们将停下来欣赏一下 np.abs 和 np.angle 函数是如何工作的。为了达到这个目的,我们还将引入复数的有效定义!

查看该系列的前几篇文章!

复数基础

在本系列的后面,我们将在处理复数时接触更多的技术。不过现在,我们只需要认识到复数是由两部分组成的:一个实数分量和一个虚数分量。

我们将很快回到复数的一些神奇性质(并介绍一位名叫欧拉的特殊客人),但为了讨论幅度和相位,我们可以将复数视为简单的二维值。每个复数都是一对实数值和一个虚数值。像任何二维一样,我们可以画出这些复杂的对。按照惯例,我们通常把实部放在 x 轴上,虚部放在 y 轴上。

图 1 :可视化幅度和相位。图片作者。

我们复数的虚部是 i (或者 j ,看你问谁了): (-1)。在左边,我看到了复数 1+1j。实数为 1,虚数为 1 的复数。同样,实部在 x 轴上,虚部在 y 轴上。正如所料,这使我们正好处于第一象限。

现在,我们不需要太担心为什么 y 轴被表示为一个系数 j. 只要你接受我们可以把这个虚值当作第二维度,几何直觉就会起作用。我们会回来的,我保证!

傅立叶变换返回的值是复数。对这些复数值调用 np.abs 可以得到每个复数值的大小。对这些复数值调用 np.angle 会给出每个复数值的相角。这样,幅度和相位被编码在傅立叶变换的复数值中。

重新实现 np.abs

一个复数的大小正好是到原点的欧几里德距离(0+0j):平方和的平方根。如上图所示,对于 1+1 j ,这就是 (1 + 1 )≈1.41(想想勾股定理!)。下面,我包含了任意复数的逻辑:

重新实现 np.angle

复数的相位是标准角度(从右顺时针)。如上图所示,对于 1+1 j ,这是 arctan2(1,1)≈0.79 弧度。对照度数检查(0.79 弧度* 180 / π弧度≈ 45),该值正确反映了上图中的角度。如果反正切使你的血压升高,花一分钟回顾一下反三角恒等式,它允许我们恢复这个角度!

下面,我包含了任意复数的逻辑:

太好了!总结一下,我们现在对傅立叶变换的幅度和相位的含义有了很好的直观理解。我们对复数有一个基本的了解,并且知道如何从复数中恢复幅度和相位信息。

接下来,我们将看看逆傅立叶变换(IFFT ),并演示我们可以用迄今为止开发的工具包完成什么!

如果代码或文本对您有价值,请为文章鼓掌!感谢阅读!

查看本系列的下一篇文章!

傅立叶变换,

原文:https://towardsdatascience.com/the-fourier-transform-a-first-look-1bf17f956cdd?source=collection_archive---------13-----------------------

第一眼

克里斯蒂安·祖尼加博士

1822 年,约瑟夫·傅立叶出版了他的著作《热的解析理论》,在书中他指出许多信号可以分解成正弦和余弦的和。两百年后,傅立叶的思想在现代社会的很多地方都被使用,从密码学到收音机和 x 光机。正如令人惊讶的有趣的书《小波世界》中提到的,“傅立叶变换是一个数学棱镜,将函数分解成组成它的频率”[1]。傅立叶变换将信号 x(t)表示为正弦和余弦的叠加,或者更简洁地表示为复指数。为了获得表示为 X(f)的变换,信号与所有频率的指数相关。这是一个类似于调谐收音机的过程,其中某些频率可能更占优势。但是,在转换过程中不会丢失或获得任何信息。

一些函数有解析表达式,但一般来说,变换必须用数值计算。数字计算机只能计算 x(t)和 X(f)的离散值的变换。正如大多数学习数字信号处理的学生所证实的那样,实现的细节可能很复杂。使用梯形积分的上述积分的直接近似将表明傅立叶变换可以通过离散傅立叶变换(DFT)来近似。

DFT 只包括求和。为了逼近傅里叶变换,DFT 应乘以 t,信号必须在时间和频率上分别以 t 和 f 为间隔进行采样。这些区间是如何选择的?细节可以在几个参考文献[2][3]中找到。《快速傅立叶变换及其应用》是一本经典的参考书。重要的是要知道,一个域中的采样会在另一个域中引入周期性,其周期是采样间隔的倒数。如果以间隔 t 对 x(t)进行采样,频谱将变为周期为 1/,图 1 显示了时间采样后的样本信号频谱。如果信号受最大频率 B 的带宽限制,显然,为了避免副本重叠,采样频率 Fs = 1/∏t 应大于或等于最大信号频率 B 的两倍,如果信号不受带宽限制,副本之间会有重叠或混叠。通常,信号可以通过低通滤波器以限制其频率。此限制将采样时间间隔设置为。

图 1 采样信号的频谱。采样频率必须大于最大频率 B 的 2 倍,以避免混叠。(图片由作者提供)

或者,如果信号以频率 Fs 采样,则可分辨的最大频率为 Fs/2(也称为奈奎斯特频率)。

类似地,频率采样使时域信号以 1/∏f 为周期,时域信号从 0 开始,截断至持续时间 t,为了避免时域混叠,频率采样间隔是信号持续时间 t 的倒数。

傅里叶积分近似值中的乘积 t f 为 1/N,其中 N 为持续时间为 t 的信号中的样本数,图 2 显示了采样间隔的关系。

图 2 时域采样(左)和频域采样(右)。(图片由作者提供)

一切似乎都准备好计算近似值了,所以让我们用一个已知的傅立叶变换函数来试试。余弦是一个非常特殊的函数,在时间上具有周期性,在频率上具有带宽限制。虽然大多数信号不会有这种性质,但研究这种情况还是有指导意义的。频率为 f0 的余弦函数 x(t) = cos(2πf0t),具有傅里叶变换 0.5(δ(f-f0)+ δ(f+f0))或两个δ函数,如图 3 所示。每个都有一个 0.5 的值,或者更确切地说,集成到。

图 3 余弦函数及其傅里叶变换(右图)。如图所示,时域信号每个周期最少可以有 2 个样本。使用的周期数可以不同,但最好设置 T=NTp,其中 Tp = 1/f0。(图片由作者提供)

该函数的采样频率至少应为 2xf0,或者每个周期至少两个样本,如图 3 所示。由于函数是周期性的,因此最好将截断间隔 T 设置为周期的整数倍或 T= N/f0。DFT 最方便的计算方法是快速傅立叶变换(FFT ),并且可以在许多数值包中完成。计算 DFT 并绘制幅度,结果如图 4 所示。余弦的频率为 f0 = 200 赫兹。采样频率为 Fs=2f0,T=10/f0。第一个画出这个结果的人很可能会觉得这个情节很神秘。它与图 3 中的预期转换有什么关系。

图 4 余弦级数的 DFT。f0=200 Hz,Fs=2f0,T = 10/f0 = 1/20。有 N=20 个样本。指数 10 对应于余弦的频率 200 Hz。DFT 的数值 20 和期望值不相等

首先,重要的是要记住指数代表什么。每个指数 k 代表一个频率 k f,频率分辨率 f 是 T 的倒数,因为 T 使用了 10 个周期,所以 f = 20 Hz。图 4 显示在索引 k=10 时只有一个非零值。这表示频率为 10x20 = 200 Hz,符合预期。

k=10 时的变换幅度是多少?该图显示 XD[10] = 20。将该值乘以 t=1/400 得到 1/20,这并不等于实际值 0.5。傅立叶变换的近似值出了什么问题?

理解差异的来源包括理解卷积运算。卷积给出线性时不变滤波器 h(t)对输入序列 x(t)的响应 y(t)。傅立叶变换可以简化这种运算,因为时间上的卷积变成了变换的乘法或 Y(f) = H(f)X(f)。类似地,时间上的乘法涉及频域上的卷积。

计算 DFT 间接涉及原始信号通过采样函数的乘法和卷积。信号 x(t)首先通过将 x(t)与矩形函数相乘得到 x(t)rect(T)而被截断为持续时间 T。图 3 已经显示了截断余弦的结果,余弦原本是无限的。时间上的乘法意味着相应的变换被卷积或 X(f)⊗ sinc(f)。rect 函数的傅里叶变换是 sinc,如图 5 所示。这种转换的细节可以在参考资料中找到。关键是 sinc 函数引入了原始频谱 X(f)的 T 倍缩放。

图 5 矩形函数及其傅立叶变换。图片来自维基百科[4]

如图 6 所示,信号的离散化涉及与一系列δ函数 d(t)的第二次相乘。δ函数由采样间隔 t 分隔。δ函数序列的傅立叶变换结果也是频率中的δ函数序列,但分隔 1/∏t。这一结果在频域中引入了周期性。然后,采样信号是 2 次乘法的结果,或者

xs[n] = x(t)rect(T)d(t)。

图 6 采样和截断余弦系列使频谱具有周期性,并以 2T/∏t = 2N 调整数值。

这一新的见解解释了连续版本的 DFT 结果的差异。DFT 实际上是计算 xs[n]的变换,而不是 x(t)。在这种情况下,它们之间的关系是 Xs(f)=(2T/𕐼t)X(f)=(2/N)X(f)。获得因子 2 是因为对于选定的 Fs 值,两个δ函数正好重叠。对于采样频率 Fs 的较大值,没有重叠,因子 2 消失。

为了获得傅立叶变换的值,将计算出的 DFT 除以 n,在上例中,将该值除以 2N 或 40 得到 20/40 =现在等于实际值!遗憾的是,对于其他类型的信号,没有通用的比例关系。然而,DFT 仍然给出了傅立叶变换的近似值。

参考文献

[1]哈伯德《小波的世界》第二版,A . K .彼得斯有限公司,版权 1998

[2] Brigham《快速傅立叶变换及其应用》Prentice Hall 1988

[3] Lyons《理解数字信号处理》第二版,Prentice Hall 2004

[4]https://en.wikipedia.org/wiki/Fourier_transform

FP 增长算法

原文:https://towardsdatascience.com/the-fp-growth-algorithm-1ffa20e839b8?source=collection_archive---------0-----------------------

实践教程

利用 Python 中的 FP 生长算法进行购物篮分析的频繁项集挖掘

FP 增长算法。由玛丽-米歇尔·布沙尔Unsplash 上拍摄的照片。

在本文中,您将发现 FP 增长算法。它是用于频繁项集挖掘(也称为关联规则挖掘)购物篮分析的最先进算法之一。

频繁项集挖掘和购物篮分析

让我们从介绍频繁项集挖掘和购物篮分析开始。

篮子分析

购物篮分析是对购物中的购物篮的研究。这可以是在线购物,也可以是离线购物,只要你能获得跟踪每笔交易产品的数据。

购物篮分析中一个被广泛研究的用例是研究经常一起购买的产品。这种类型的洞察力可用于向客户推荐网上购物,或重新安排常规商店中的产品,以便客户更容易将它们添加到他们的购物篮中。

频繁项目集挖掘

频繁项目集挖掘是寻找经常一起购买的产品组合的技术术语。您通常从事务列表开始,其中每个事务都表示为产品列表。

频繁项集挖掘的目标是用快速有效的算法识别经常出现的产品组合。这个有不同的算法。基础算法之一是Apriori 算法

FP 增长算法可以被看作是 Apriori 的现代版本,因为它在获得相同目标的同时更快更有效。

顺便说一下,频繁项集挖掘算法不是特定于域的:您可以将频繁项集挖掘用于篮子分析之外的其他领域。

FP 增长算法的一个示例用例

让我们使用一个示例数据集,它包含一家夜店的交易列表。对于每笔交易,我们都有一份在交易过程中购买的产品清单。这个例子也用在了 这篇关于 Apriori 算法 的文章中,这样就给我们提供了一个比较这两种算法性能的有趣基准。

您可以在下面的表格中看到交易列表。这是一个相当小的数据库,因为这使得在深入 Python 实现之前手动跟踪 FP 增长算法的步骤变得容易。

FP 增长算法。交易记录列表。

FP 增长算法是如何工作的?

FP 增长算法背后的思想是在数据集中查找频繁项集,同时比 Apriori 算法更快。Apriori 算法基本上是在数据集上来回检查数据集中产品的同现。

关于我们必须击败的基准测试的更多细节,本文详细列出了 Apriori 算法的步骤。

为了更快,FP 算法将数据的组织方式改为树而不是集合。这种树形数据结构允许更快的扫描,这也是算法赢得时间的地方。

FP 增长算法的步骤

现在让我们看看如何使用上面介绍的例子中的事务数据,用产品集制作一个树。

步骤 1 —统计单个项目的出现次数

FP 增长算法的第一步是统计单个项目的出现次数。下表显示了每个项目的数量:

FP 增长算法。统计每个产品出现的次数。

步骤 2—使用最小支持度过滤掉不常用的项目

您需要决定最小支持度的值: 出现次数少于最小支持度的每个项目或项目集都将被排除

在我们的例子中,让我们选择最小支持度 7。这意味着我们要丢弃面粉和黄油。

第 3 步—根据单个事件对项目集进行排序

对于剩余的项目,我们将创建一个有序的表。该表将包含尚未被拒绝的项目,交易中的项目将根据单个产品的出现情况进行排序。

FP 增长算法。基于单个产品出现的项目集排序。

步骤 4——创建树并逐个添加交易

现在,我们可以从第一个事务开始创建树。每个产品都是树中的一个节点,如下所示:

FP 增长算法。仅添加第一个事务后的树。

请注意,我们还为每个产品添加了一个计数,稍后我们将使用它进行计数。

我们现在可以进入第二项交易:

FP 增长算法。添加前两个事务后的树。

现在让我们看看添加第三个事务时会发生什么:

FP 增长算法。添加第三个事务后的树。

与前两笔交易不同,第三笔交易不含啤酒。因此,不可能将其直接链接到第一棵树。它有一个单独的开始节点,您可以通过主 cheese 节点到达该节点。

一旦构建了 FP 树,遍历它并找到最频繁项目集的信息会快得多。要了解更多的技术细节和遍历速度的基准,你可以看看这篇文章,,我觉得这篇文章很清楚。对于本文的其余部分,让我们继续讨论在 Python 中应用 FP Growth 算法的示例用例。

Python 中的 FP 增长示例

现在让我们开始学习 Python 中的 FP 增长算法。为此,我们将使用mlxtend包,您可以使用下面的代码安装它:

FP 增长算法。安装 mlxtend。

正如代码中所提到的,如果你运行在 Google Colab 中,你必须升级软件包,因为这可以避免以后出现错误。

现在,您需要将数据作为交易列表输入。每个事务都是一个项目列表。注意:您不能像在其他实现中那样使用项目元组,因为这将导致错误。

FP 增长算法。以列表的形式输入数据。

不可能将 FP 增长算法直接应用于交易列表。你首先要用一个类似于一键编码器的编码器对它进行编码。TransactionEncoder是由mlxtend包提供的,您可以使用下面的代码来生成一个编码的数据帧:

FP 增长算法。创建编码数据帧。

您获得的数据帧应该如下所示:

FP 增长算法。编码数据。

下一步是计算频繁项集。您可以使用mlxtend中的fpgrowth功能,如下所示:

您将看到对每个项目集的支持。不在此处的项目会被过滤掉,因为它们没有达到最低支持级别。顺便说一下,注意这里的最低支持级别是用百分比表示的,而在手动示例中是用整数表示的。

FP 增长算法。显示频繁项集及其支持。

最后一步,我们需要使用association_rules函数将那些频繁项集转换成关联规则。这可以使用以下代码来完成:

FP 增长算法。计算关联规则。

使用 FP 增长计算的最终关联规则如下所示:

FP 增长算法。最终的关联规则。

解释 FP 增长算法的结果

我们现在进入本文的最后部分:解释由 FP 增长算法生成的规则和指标。

规则

首先,我们可以得出结论,有两个产品组合,这两个协会是双向的。买奶酪的人也买酒,买酒的人也买奶酪。另外,我们看到买啤酒的人也会买薯片,反之亦然。

规则的度量标准

第二件有趣的事情是规则的度量。总的来说,它们告诉我们一些规则的可靠性。以下三个指标非常重要:

  • 支持告诉我们产品同时出现的次数或百分比
  • 置信度告诉我们一个规则出现的次数。这可以不同地表述为给定左手边的右手边的条件概率
  • 电梯给了我们团结的力量

总结衡量标准

不一定有一个总的度量标准,我们可以用它来决定“正式”接受或丢弃哪些规则。毕竟,方法更多的是一种探索的工具,而不是确认的工具。

在我们当前的案例中,我们最终得到了两个双向规则,根据数据,这两个规则看起来非常有效。如果我们有更多,例如太多要看,我们可能想要使用度量来制作对我们最有用的规则子集。然后我们也可以改变最小支持。

最后,要记住的重要事情是使模型适应您的特定用例。

结论

在本文中,您已经发现了 FP 增长算法。您已经看到了该算法的逐步描述,以及用 Python 实现的一个示例用例。

我希望这篇文章对你有用。现在,请不要犹豫,继续关注更多的数学、统计和数据内容!

弗兰肯斯坦假说

原文:https://towardsdatascience.com/the-frankenstein-hypothesis-f075f809ec9b?source=collection_archive---------22-----------------------

直面人工智能的影响和后果

来自 Unsplash.com 的照片

前言:

我在 AI 内部作为未来学家的工作通常发表在学术期刊上, 【弗兰肯斯坦假说】 也是以学术的方式撰写。对于那些希望了解人工智能发展的整体背景以及人类在不久的将来将面临的一些伦理/道德困境的人来说,我真的希望这篇文章将成为一个信息丰富的介绍。

【The Frankenstein Hypothesis】为 2021 年 10 月出版的一部更广泛的作品提供了背景( Applied Marketing Analytics 第 7 卷第 2 期《亨利·斯图尔特杂志》出版物)呈现了理论发散融合处理人工智能(AI)的进展——从混沌理论到复杂性(如有兴趣,欢迎在媒体LinkedIn 给我发消息,免费获得一份 【发散总汇】 的 PDF 版本)。**

摘要:

人工智能(AI)已经渗透到社会的各个领域。在人工智能中创建正确的结构和算法已经成为“圣杯”,指导我们的决策,并迅速超越我们生活的方方面面。

我们如何定义“思想?”在什么程度上“智力”是假定的?什么时候我们认为某样东西是“有意识的”有可能获得意识吗?

“人工智能”这个术语的悖论似乎很荒谬。不存在一个无可争议的“智力”分类。“思维-思考”同样没有一个普遍接受的定义。那么,在没有明确描述这些术语的情况下,我们如何理解人工智能的含义呢?我们何时何地应用我们的技术能力来实现人工智能?

随着人工智能潜力的增长,“意识”成为一个至关重要的名称。如何定义一个实体是否有意识已经变得至关重要。我们正在迅速到达一个点,在这个点上,社会将被迫决定何时何地思维、智力和可能的意识是非人类物体的基本组成部分。

几千年来,哲学家们试图定义“存在”和“存在”的本体论问题,这与“思想”、“智力”和“意识”有着内在的联系。然而,“思想-智力-意识”的困境不仅是构成的本体,也是人工智能发展的核心。

“弗兰肯斯坦假说:面对人工智能的影响和后果”探讨了人工智能带来的困境。AI 是如何进化的?在一个我们不再能够控制人工智能指数增长的时代,“人工智能”一词意味着什么?本文通过对人工智能发展的分析,探讨了这些基本问题,从而引出人类最终必须承认并应对隐藏在背后的潜在怪物/恩人。

智力、思维和意识

“我建议考虑这样一个问题,‘机器能思考吗?’"

艾伦·图灵(Alan Turing)在曼彻斯特大学(University of Manchester)工作期间发表了一篇名为《计算机械与智能》(Computing Machinery and Intelligence)的论文,他以这句开场白正式开始了对实现人工智能(AI)的探索,但从未使用过“人工智能”这个术语。尽管图灵立即重建了他的论点,但由于不可能定义“机器”和“思考”这两个词,这个问题仍然存在。我们仍在努力定义两个术语:“智力”和“思想”它们是什么意思?真正定义智力的是什么?思维的初级分类是什么?那个三个字的问题“机器能思考吗?”(重新定义后)永远改变了技术进步的命运。

如同许多天才的伟大飞跃一样,图灵思维过程的一个推动力是一个世纪前艾达·lovelace⁴.女士所做的一个假设洛夫莱斯女士被认为是计算机编程的先驱,因为她创造了世界上第一个计算机算法。⁵

洛夫莱斯女士当时正在研究“分析引擎”,这是一种理论机器,由她的导师查尔斯·babbage⁶提出,能够解方程,精确计算伯努利数序列。她在笔记中写道:

分析引擎无意创造任何东西。它可以做我们知道如何命令它执行的任何事情。它可以跟随分析;但是它没有能力预测任何分析关系或真理。⁷

图灵确信这一说法,他称之为“洛夫莱斯夫人的 Objection,"⁸是错误的”,并着手证明这一点。

在这一点上,忽视“真相比小说更奇怪”这句老话是不恰当的。洛夫莱斯夫人的父亲是 Byron⁹.勋爵,她一生都与他疏远 1816 年一个多雨的夏天,拜伦勋爵与玛丽·雪莱·⁰在日内瓦度过了一个夏天。由于连绵不断的雨水,拜伦和玛丽·雪莱开始讲述鬼魂和吸血鬼的故事,因此小说《弗兰肯斯坦》首次被构思出来,这是基于天气造成的命运的突发奇想。几年后,拜伦的女儿洛夫莱斯女士在她关于“分析引擎”的笔记中为艾伦·图灵提供了部分原始动力图灵在科技领域打开的潘多拉魔盒以弗兰肯斯坦的真实面目再次困扰着我们。它让人们思考巧合的本质、命运、因果报应、上帝,或者我们选择相信或忽视的任何道路。

在图灵提出他的基本问题五年后,1955 年,“关于人工智能的达特茅斯夏季研究项目提案”被提交。不到一年后的 1956 年,第一次真正的人工智能会议在达特茅斯学院召开。“人工智能”一词应归功于该提案的原始作者之一约翰·麦卡锡·⁴。

图灵的问题深刻地改变了伦理、哲学、神学、道德、心理、科学和理论的结构,这一点不应该被低估。AI 已经到来,人类别无选择,只能面对它。技术和创新不会停滞不前。

七十多年后,人们会发现关于定义“思想”和“智能”的争论仍然激烈——尽管“人工智能”这个术语现在是我们自然词汇的一部分。人工智能是任何技术讨论中最受关注的术语。它被许多人视为“圣杯”,涵盖了从机器人到决策到自我进化算法的创造等领域,这意味着智能思维的自我进化。(艾米·韦伯的《九大巨头:科技巨头和他们的思维机器如何扭曲人性》一书中对其中一些话题进行了精彩的总结。⁵)

“我思故我在”——我思故我在

1637 年,哲学家勒内·笛卡尔·⁶在他的《论方法》⁷ ⁸和 1644 年的《哲学原理》中,提出了他现在著名的哲学格言:“ Cogito,ergo sum”——“我思故我在”(1647 年⁹翻译成法文——“je pense,donc je suis”),此后在伦理学家和哲学家中引起了一致、争论、异议和惊愕。笛卡尔的陈述很简单地暗示了——如果一个人思考,那么他就存在。然而,“存在”意味着什么?此外,如果我们被迫考虑笛卡尔定义为思考的存在的困境,对我们理解生命的结构会有什么影响?

“思想”(或“思考”)是否意味着智慧?再者,如果是这样,思维和智力是否推断出‘意识’?在人工智能时代,我们不能对这些问题不屑一顾,也不能忽视它们的影响。关于这个主题,已经有大量的书籍、期刊和思想发表,但是仍然没有达成共识。简单浏览一下维基百科只会让事情变得更加复杂。

虽然思考对人类来说是一种具有生存价值的活动,但对于如何充分定义或理解它,仍然没有达成共识。

因为思想是许多人类行为和互动的基础,所以理解其物理和形而上学的起源及其影响一直是许多学术学科的长期目标,包括哲学、语言学、心理学、神经科学、人工智能、生物学、社会学和认知科学。

思维让人类能够理解、解释、表现或模拟他们所经历的世界,并对那个世界做出预测。因此,当一个有需求、目标和欲望的有机体制定计划或试图完成这些目标时,它是有帮助的。⁰

任何参与人工智能及其后果的人都应该清楚,我们不仅处于技术的前沿,而且它触及所有科学和哲学中的每一种思维模式、反应和反应,这将导致许多先入为主的观念的深刻分歧和重新评估。

什么叫做思考?

最奇特、最令人烦恼的研究领域之一是试图给“思想”或“思考”下一个具体的定义从维基百科中引用的上述声明将这一困境置于适当的背景下:“尽管思考是一种对人类具有存在价值的活动,但对于如何充分定义或理解它,仍然没有达成共识。”

《剑桥词典》将“思想”定义为“思考或考虑某事、一个想法或观点或关于特定主题的一组想法的行为”,“思考”定义为“用你的头脑考虑某事的活动。”⁴ 这些定义是循环推理的一个很好的例子,让我们对“思想”到底是什么没有一个基本的理解。

布鲁姆在 20 世纪 50 年代创立的⁵分类法试图将思维分为六个主要领域:

1.知识
2。理解
3。应用程序
4。分析
5。综合
6。估价

然而,尽管布鲁姆的分类法可以定义不同的思维要素和过程,并按照复杂程度对它们进行排序,但它几乎没有解释我们如何才能精确地定义“思维”过程。⁶

哲学家兼现象学家马丁·海德格尔·⁷写的所有书中最著名的一本书可能是《什么叫做思考》基于他在 1951 年和 1952 年的冬季和夏季在弗赖堡大学所做的讲座。正如⁸所写:“在我们发人深省的时代,最发人深省的是我们仍然没有思考。”⁹:这份声明无疑是对人类的有力指控。尽管如此,它仍然没有回答最根本的问题,“什么叫做思考?”海德格尔自己也被这个术语所矛盾,尽管他确实试图对思维过程进行令人信服和着迷的审视。

例如,我们永远不会通过阅读一本关于游泳的专著来学习什么叫做游泳,或者它需要什么。只有跳进河里才告诉我们什么叫做游泳。“什么叫做思考?”永远无法通过提出思维这个概念的定义,然后努力解释这个定义包含了什么来回答。接下来,我们将不再思考思考是什么。我们仍然置身于那种仅仅使思考成为其对象的反思之外。⁰

没有广泛的研究和对现象学和存在主义的深入探究,海德格尔对思维的定义似乎一如既往地难以捉摸。我们仍然坚持这样一个悖论,即思维是,嗯,思考或体验某种不可定义的活动,然后用一个确定的短语来解释这种体验。

图灵测试和中国房间

图灵首先提出了他的著名问题“机器能思考吗?”他立即重组了这个问题,以避免有问题的定义,特别是对“智力”这个词的定义,因为图灵意识到“思考”和“智力”之间有一个直接的等式。

我建议考虑这样一个问题:“机器能思考吗?”这应该从术语“机器”和“思考”的定义开始。这些定义可能是为了尽可能地反映这些词的正常用法,但这种态度是危险的,如果要通过考察“机器”和“思考”这两个词的通常用法来发现它们的含义,就很难避免这样的结论,即“机器能思考吗?”这个问题的含义和答案是在诸如盖洛普民意测验的统计调查中寻求的。但这是荒谬的。我不会试图给这个问题下定义,而是用另一个问题来代替,这个问题与这个问题密切相关,并且用相对明确的语言表达。”

图灵称他的替代品为“模仿游戏”。虽然对图灵试图完成的目标仍有争议,但模仿游戏是引领我们进入人工智能时代的最关键的一点。(人们可以在图灵的原始文章或维基百科上找到关于模仿游戏的详细描述。)然而,即使在七十年后,关于图灵测试是否不是专门为了确定 计算机是否能够欺骗审讯者相信它是人类 ,而是计算机是否能够 模仿人类 的讨论仍在继续⁴

然而,在图灵的文章中,有一段被证明是预言性的,它将读者直接引向我们论文的核心。

原问题,“机器会思考吗?”我认为这毫无意义,不值得讨论。尽管如此,我相信在本世纪末,词语的使用和一般受过教育的观点将会发生如此大的变化,以至于人们可以谈论机器思维,而不必担心会遭到反驳。我进一步相信,隐藏这些信念是没有用的。流行的观点认为,科学家不可阻挡地从既定事实前进到既定事实,从来不受任何改进的猜想的影响,这是非常错误的。只要弄清楚哪些是事实,哪些是猜测,就不会有什么害处。推测非常重要,因为它们暗示了有用的研究方向。⁵

图灵的预言假说,在 AI 时代重要性不可低估,却屡遭挑战。然而,最显著的反对意见来自约翰·塞尔·⁷在 1980 年开发的“中文房间思想实验”⁶(这个实验的整个范围可以在塞尔的论文中找到),这是一个不同的图灵测试实现。图灵写道:

我不希望给人这样的印象,即我认为意识并不神秘。例如,任何试图使其地方化的努力都存在某种悖论。但我认为,在我们回答本文所关心的问题之前,并不一定需要解开这些谜团。⁸

然而,塞尔提出了基于“意识”的棘手问题。事实上,随着中文教室发展成为一场意义重大的辩论,塞尔坚定地认为意识是整个辩论的核心。因此,中文室的后果变得至关重要。

中文屋的论点认为,执行程序的数字计算机不能被证明具有“思维”、“理解”或“意识”,不管程序能让计算机表现得多么智能或像人一样。⁹

或者,正如塞尔自己在他的摘要中所说:

“机器会思考吗?”在这里提出的论点,只有机器可以思考,只有非常特殊的机器,即大脑和内部因果能力相当于大脑的机器。这就是为什么强人工智能几乎没有告诉我们什么是思考,因为它不是关于机器而是关于程序,没有一个程序本身足以思考。⁴⁰

想象力和知识

阿尔伯特·爱因斯坦表达了纯科学在预测未来时是多么的矛盾,他说“想象力比知识更重要。知识有限。想象力环绕着世界。”⁴即使是那些以科学数学为基础的人也认识到,如果不运用想象力和预见不同未来的深刻天赋,事实上什么都不会向前发展。在这样一个世界里,创新是不存在的。

科幻小说经常成为现实,尽管它也揭示了关于我们思想和智力的中心话题的重大问题。例如,我们能把“Frankenstein"⁴”放在思想和意识的领域吗?玛丽·shelley⁴写了一个鬼故事,这将创造一个全新的写作风格,被称为“恐怖”⁴⁴:令人怀疑的是,她是否曾思考过她的故事将引发的哲学问题、辩论和争论。尽管如此,弗兰肯斯坦确实表达了思想和情感,尽管是由肉制成的,但可以说在被称为弗兰肯斯坦的怪物的肉和冰冷的机械金属之间不再有巨大的鸿沟。

科幻小说中充满了这样的事件。像亚瑟·c·clarke⁴⁵、艾萨克·asimov⁴⁶这样的作家,在他的《Saga⁴⁸沙丘》中第一次使用了“robotics,"⁴⁷·弗兰克·赫伯特”这个词,他们通常被认为是预言家,而不仅仅是反面乌托邦未来的故事编织者。事实上,《沙丘传奇》在宗教上恪守法则:“你不应该制造一台酷似人脑的机器。”⁴⁹

在斯坦利·库布里克和亚瑟·C·克拉克于 1968 年上映的开创性电影《2001:太空漫游》中,我们被介绍给了“哈尔”,一个有意识的(阅读“思考、智能和有意识的”计算机),一心想毁灭的人。注意到甚至哈尔这个名字也有预言的含义。“H”是“I”前的字母;“A”是“B”前面的字母;“l”是“m”前面的字母,因此拼出了生产人工智能机器的“IBM”,Watson,"⁵⁰在 2011 年的电视节目《危险边缘》中首次展示了自然语言能力⁵ ⁵

“2001:太空漫游”是一个自我实现的预言,一个幸运的猜测,想象,巧合,还是仅仅是创造性的电影制作?也许只有爱因斯坦能给我们提供答案的洞察力。“……过去、现在和未来之间的区别只是一种顽固不化的幻觉。”⁵

召唤恶魔——人工智能的危险

我们已经超越了讨论人工智能实现的可能性,因为它已经成为现实,并继续通过不断进化的系统、结构和算法得到增强和扩大。我们需要面对有一天人工智能会强加给我们现实的危险。令人惊讶的是,关于人工智能的使用及其不断融入我们日常生活的警告来自技术领导者,人们最初会认为他们应该是人工智能的最狂热的支持者。

埃隆·musk⁵⁴在 2014 年谈到人工智能时说:

我认为我们应该非常小心人工智能。如果要我猜我们最大的生存威胁是什么,可能是这个。所以我们需要非常小心,”马斯克说我越来越倾向于认为应该有一些监管监督,也许是在国家和国际层面,只是为了确保我们不会做一些非常愚蠢的事情……

有了人工智能,我们在召唤恶魔。在所有那些有五角星和圣水的人的故事中,就像——是的,他确信他能控制恶魔。不起作用的 out…⁵⁵

马斯克多年来不断重申这一观点。

我认为,人工智能是一个罕见的案例,我们需要积极主动地进行监管,而不是被动应对。因为我认为当我们对人工智能监管做出反应时,就太晚了。人工智能对人类文明的存在是一个根本性的威胁。⁵⁶

马斯克并不孤单,在他的关注中有非常有趣的伙伴。Microsoft,⁵⁷的联合创始人比尔·盖茨表达了他对人工智能发展的担忧。

我在关注超智能的阵营。首先,机器将为我们做很多工作,但不是超级智能的。“如果我们管理得好,这应该是积极的,”盖茨写道几十年后,尽管智能强大到足以令人担忧。在这一点上,我同意埃隆·马斯克和其他一些人的观点,不明白为什么有些人不担心。⁵⁸

物理学家斯蒂芬·hawking⁵⁹也非常担心人工智能。

全人工智能的发展可能意味着人类的终结。一旦人类开发出人工智能,它就会自行起飞,并以越来越快的速度重新设计自己。受到缓慢生物进化限制的人类无法竞争,将会被取代。⁶⁰

尤瓦尔·诺亚·harari⁶在他最近出版的关于无拘无束的人工智能危险的三本书中一直不断地发出警告。然而,有一句话应该立即引起我们的注意。

一旦人工智能在大多数认知任务上超过人类,就业市场会发生什么?一个庞大的新经济无用阶层将会产生什么样的政治影响?当纳米技术和再生医学把八十岁变成新五十岁时,人际关系、家庭和养老基金会发生什么变化?当生物技术使我们能够拥有设计婴儿,并拉开前所未有的贫富差距时,人类社会将会发生什么?⁶

也许最可怕的警告来自《纽约时报》的畅销书,哲学家尼克·博斯特罗姆写的《超级智能:道路,危险,Strategies,"⁶》。⁶⁴·何认为,当机器大脑超过人脑的能力,并可能成为主导生命形式时,就标志着“超级智能”。

这很可能是人类有史以来面临的最重要、最艰巨的挑战。无论我们成功还是失败,这可能是我们面临的最后一个挑战。⁶⁵

由于机器可以比人更快地提高能力,这将导致一场生存大灾难。埃隆·马斯克、比尔·盖茨和许多其他人赞同这种思维模式,非常担心人工智能的反响,正如我们在上面所展示的那样。

改善生活——人工智能的回报

在审视人工智能的危险的同时,我们也必须对人工智能给我们带来的回报给予同等的评价。人工智能的积极影响已经深入到医学科学中,人工智能影响着从研究到实际诊断的一切。人工智能拯救生命,改善生活,并作为一个关键的预防因素,以避免疾病的发展。

AI 已经将触角伸向社会和科技的方方面面。这些进步中有许多是建设性的,允许在朝着更有能力和更安全的环境前进的过程中实现巨大的飞跃。

尽管强烈反对不受监管的人工智能,但埃隆·马斯克也在人工智能项目上投资了数千万美元,如 OpenAI⁶⁶、Institute⁶⁷生命的未来和 DeepMind⁶⁸.

甲骨文公司的首席执行官马克·hurd⁶⁹创造了“终结者论点”这个术语(基于科幻电影《终结者》系列),并驳斥了对人工智能的担忧,认为好处远远超过危险。他在推特上写道:“与行业分析师就#AI 的风险进行了很好的交流。我更担心的是不引入终结者的经济风险,因为它创造的就业机会将多于它摧毁的就业机会。”⁷⁰

“本体技术”——思想-智能-意识的困境

上面的话应该合理地引导我们进入一场关于“狭隘或弱小的 AI'⁷对强大的 AI'⁷”的讨论,以及一系列其他关于人类与人工智能融合的哲学辩论。⁷然而,最终的问题仍然存在。思想的意义是什么?什么时候我们可以明确地说某物被赋予了智能?我们如何定义意识?由于这些问题,不可能忽视对本体论的提及。

本体被字典定义为:

形而上学的一个分支,关于存在的本质和关系,或者叫做,关于存在的本质或存在的事物种类的特殊理论。⁷⁴**

更全面:

本体论是哲学的一个分支,研究存在、存在、成为和现实等概念。它包括如何将实体分成基本类别,以及哪些实体存在于最基本的层次。本体论传统上被列为被称为形而上学的主要哲学分支的一部分。⁷⁵

我们提出的问题本质上是本体论的,起源于形而上学,促使我们再次审视关于“存在”和“存在”的意义的长达几个世纪的争论。⁷⁶然而这场争论现在已经被无情地改变了——一场剧烈的变化正在发生。人类再也没有奢侈去思考几千年来寻找答案。人工智能科学以令人难以置信的速度发展,在走向“本体技术”的新时代的同时,引发了判断和智慧的危机。

将人工智能分为各种类别,如“窄”、“强”或“超级”,并不能缓解困境。一种被开发用来检测威胁生命事件开端的人工智能算法,从各方面来看,都是一项值得称赞的非凡成就。尽管如此,一旦算法存在,它可以被调整或微妙地改变用于其他目的。

由于人工智能算法渗透到技术和社会的每个方面,每个算法都成为等待组装的巨大拼图中的一部分。在这种情况下,“复杂性 Science'⁷⁷”的分支“对从一系列相互作用的 objects"⁷⁸中出现的现象的研究是不可忽视的。复杂性将导致奇点 Event⁷⁹ ⁸⁰.

那么,什么是奇点呢?这是一个未来时期,在此期间,技术变革的步伐将如此之快,其影响如此之深,人类生活将发生不可逆转的变化。尽管既不是乌托邦也不是反乌托邦,但这个时代将改变我们赖以赋予生活意义的概念,从我们的商业模式到人类生命的周期,包括死亡本身。理解奇点将改变我们对过去的意义以及对未来的影响的看法。

'Emergence'⁸的“整体大于部分之和”,奇点期间和之后的“T1”就有了巨大的意义。简而言之,一个全面的人工智能系统将展示出从每个部分的研究中不明显也不可预测的属性。各个部分之间的相互作用导致了一个全新实体的出现,这反过来又会把最基本的困境和决定强加给我们。

术语“思想”、“智力”以及至关重要的“意识”仍然没有准确、客观、也没有普遍接受的定义。这种情况令人困惑,并提出了一个令人不安的困境,在这个时代,人工智能一词被如此频繁地使用和放弃。如果我们不能定义人工智能,我们如何实现它?更重要的是,如果我们对智力、思想和意识都没有真正的概念,那么最具挑战性的问题就摆在我们面前。什么定义了生命?我们如何区分生物和计算机?

弗兰肯斯坦假说

他之前在这篇文章中提到弗兰肯斯坦并不是出于任何提及恐怖片的平淡愿望。这是我们论文的核心。

想象两个实验场景:

  1. 一组科学家小心翼翼地,一步一步地,用计算机化的(机械的)等价物替换活人的部分。手臂和腿被机器人取代,包括脸、胃,甚至性附属物也被工作的机械机器人部件互换。液体被化学物质所取代,这些化学物质复制了人体内所有液体的功能。慢慢地,这个曾经有血有肉的人变成了一台“机器”然后,科学家们用一套能够表达情感和思想的机械设备和芯片替换大脑和心脏。完全复制这些人体器官。
  2. 第二组科学家用所有相同的部件制造了一台机器,使其看起来和功能都像人。除了 之外,它拥有所有的第一批实验元素——它从一开始就由机械部件建造而成,并不需要一个活人慢慢替换他们的各种生物部件。在我们的词典中,我们称之为“机器人”****

更复杂的是,这两种情况都会产生同卵双胞胎。它们看起来一样,有同样的部分,以同样的方式运作,并根据思想和智力做出决定。

注意“意识”这个词被明确地省略了。场景# 1是否包含意识,根据其源头的定义,因为它的源头是人类。相比之下,在场景#2 中暗示意识是有疑问的,——由于对意识及其定义的激烈争论。即使取得了如此惊人的成就,一个无意识的神器能否实现意识仍然是个谜。**

在《有意识的头脑:寻找一个基本的 Theory,"⁸》一书中,哲学家大卫·chalmers⁸⁴告诫我们要达成一个意识的基本法则——一个我们还没有实现的东西。关于“意识”的争论只会加剧弗兰肯斯坦假说中的困难。

因为这两个场景现在都被认为是“机械”性质的,让我们暂时假设,它们包含一个“开-关”开关。现在,花一点时间考虑下面的困境:

  • 在场景#2 中,关掉一个人类的机械复制品会有任何伦理或道德上的困境吗?它是一台机器——一个机器人,不管计算机化工作得多好。有没有任何伦理或道德上的必要来阻止一个人按下开关,即使他们确信这台机器可以“思考”或具有“智能”?
  • 现在,就场景#1 提出同样的问题。在这种情况下,最初,一个所有部件都被机械和计算机化部件取代的活生生的人变成了一个“机器人”有人能在任何时候关掉那台“机器”而不称之为“谋杀”吗?我们是否可以忽略“意识”这个迫在眉睫的问题,或者我们是否希望“灵魂”隐藏在那些金属部件之后?

可怕的,骇人的,可怕的,令人愤慨的,令人发狂的。当思考场景 1 中把开关拨到“关”的后果时,一个表达强烈情绪的连续词汇浮现在脑海中。

不要认为上述场景只是人工智能时代的一个假设的伦理道德困境。人们只需要看看正在进行的 GPT-3⁸⁵ ⁸⁶项目(由上面提到的 OpenAI 创建和运行)就能知道不是如果——而是“弗兰肯斯坦假说”将成为真正的 dilemma⁸⁷.虽然有一个令人信服的论点,GPT-3 不会让我们更接近 machine⁸⁸ ⁸⁹的自然智力,但重要的是要重申,我们没有普遍接受这个词的含义——智力。如果在 2021 年,人类创造的机器可以“撒谎”并承认自己撒谎,但拒绝告诉你它是如何、在哪里或何时这么做的,那么就必须面对深刻的悖论。⁹⁰此外,随着 DALL-E⁹最近加入 GPT-3,一个基于视觉概念创建和操作的图像生成器,无论是真实的还是幻想的描绘,没有使用“库存照片”,只有基于简短的文本请求,将 GPT-3 项目转变为一个将想象概念化为现实的时代。⁹ ⁹

DeepMind⁹⁴被认为是 GPT-3 项目的替代竞争对手,密切参与该项目的马斯克谈到人工智能时说:“除非你直接接触像 DeepMind 这样的团队,否则你不知道它有多快——它正在以接近指数的速度增长。”⁹⁵

马斯克最近宣布,他的初创公司 Neuralink Corp .将一只猴子的大脑连接起来玩视频游戏。这样的成就让我们更接近于将思维和智能融入机器。⁹⁶

如果我们再用 30 到 50 年的时间来增强 GPT 3 号、DeepMind 和其他随后的项目,我们会在什么时候将“思想”、“智能”甚至“意识”这些词应用到机器上?什么时候弗兰肯斯坦假说会成为一个需要无条件答案的基本谜,因为不仅思想和智力发展了,而且意识也已经实现了?什么时候机器会进化到“存在状态”,不再可能简单地“关掉”开关?

没有一个科幻小说迷会忍不住将“终结者 Franchise"⁹⁷与弗兰肯斯坦假说”相提并论。在《终结者:Salvation"⁹⁸》(系列电影第四部)中,角色马库斯·赖特做了如下陈述:

是什么让我们成为人类?这不是你能编程的。你不能把它放进芯片里。这是人类心脏的力量。我们和机器的区别。⁹⁹

以上说法准确吗?“人类心脏的力量”是我们与机器的唯一区别吗?再者,如果我们接受这个前提,当我们可以赋予机器意识的时候,会发生什么?这难道不意味着机器现在拥有了“人类心脏的力量吗?”或者我们是在暗示一个人需要“灵魂”吗?此外,灵魂的定义不就是被意识分类的吗?

所提出的问题在表述和解决方法上令人恼火甚至疯狂。这个困境让我想起了霍瑞斯·曼的一句名言:“人类活着的灵魂,一旦意识到它的力量,就无法被压制。”⁰⁰ 想象一下,一台意识到自己能力的计算机能做什么!

弗兰肯斯坦假说应该让我们感到恐惧,而不仅仅是最初的弗兰肯斯坦在我们的邻居中胡作非为,并迫使我们做出决定,如果我们能在道德上杀死弗兰肯斯坦,因为他-它可能是人类。我们不能再忽视这种假设的后果,也不能把这种决定的全部责任都推给后代。虽然大多数人希望人工智能改善人类,但我们对人工智能的追求也迫使社会做出判断和决定(只要想想军事和军备竞赛),这将是一个不容忽视的严重错误。

人工智能的进步会立即应用到我们的计算机技术中,通常不会考虑后果。我们发现自己不再处于技术专家、哲学家、神学家、伦理学家和道德家的理论问题领域。如果我们不以应有的谨慎对待这个问题,人工智能将很快指导我们的思维模式,因为它已经严重影响了我们的选择和互动方式。

作为一个证明,只需考虑目前应用于社交网络和营销的所有人工智能。我们的思维过程不再是“独立的”,但人工智能影响了我们做出的每一个决定——我们阅读的信息,我们看的东西,以及很快,我们如何对暴露在大脑中的信息做出反应。此外,甚至我们头脑中的信息也会基于 AI 进行选择和审查。不归点将会到来,在那里我们甚至不敢考虑“开-关”开关的可能性,而这本身就是一个我们不能忽视的危险。

凝视深渊

耶和华神用地上的尘土造人(亚当),将生气吹在他鼻孔里,他就成了有灵的活人。

《旧约》中的这些话表达了我们自然赋予上帝的众多属性之一——“他将生命之气吹入鼻孔。”我们也可以参与这种创造模式,因为大自然及其法则赋予了我们繁衍后代的能力。然而,自然界中的生殖和被称为上帝的实体之间有一个主要的区别。我们通过结合创造生命。至少在一神论信仰中,上帝可以将“生命之息”吹入一个无生命的物体,并且不需要伴侣来完成这样的行为。**

没有比试图确定“上帝”的近似定义更有争议的争论了。不同的宗教对上帝的描述大相径庭,甚至在信仰相同的人之间也是如此。几个世纪以来,哲学家们一直在争论一个至高无上的存在与否。⁰韦氏词典在很多方面给上帝下了定义。然而,它始于上帝是“最高或最终的现实”的观念⁰ 维基百科大胆尝试描述上帝的概念。**

在一神论的思想中,上帝被认为是至高无上的存在、创造者和信仰的主要对象。上帝通常被认为是全能的(全能的)、全知的(全知的)、无所不在的(全在的)和全善的(全善的),并且有一个永恒和必要的存在。上帝通常被认为是无形的(非物质的)。上帝的无形体或有形性与上帝的超越性(在自然之外)或内在性(在自然之中)的概念有关;中国神学展示了这两个概念的综合。⁰⁴

正如已经表明的那样,弗兰肯斯坦假说不可避免地把我们引向“存在”和“存在”的根本问题人工智能的进步将导致哲学和神学的裂痕,迫使人类重新评估“上帝”这个术语的本质。那些相信某个无所不在、不朽、无所不知的对最初的创造负责的人必须处理这些分歧。此外,即使一个人是不可知论者或无神论者,它仍然不打折扣,也不允许解雇弗兰肯斯坦假说的道德伦理困境。

现在,我们面临的终极问题是一个复杂简单的悖论。当我们创造了一台机器,意识随之而来,开关的使用变成了一个道德伦理的难题时,我们是否也变成了无所不能的神?在这一点上,我们能宣布人类有能力将生命的气息注入非生命实体吗?当我们继续我们的智力和技术探索而忽视我们行为的后果时,我们对权力的渴望会无节制地增长吗?人工智能会通过我们的创造引领我们走向不朽吗?我们注定要把自己想象成“凡人之神”吗?正如尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)如此优雅地指出的那样,“我们已经将人类提升到了生存斗争的野蛮水平之上,现在我们的目标是将人类升级为神,并将智人变成智人。”⁰⁵**

在我们向“凡人之神”进化的过程中,有一个复杂但基本的推论,如果你希望“德乌斯人”(源自拉丁语——“人”的意思是人,“德乌斯”的意思是上帝。)一旦我们赋予自己这样一个称号的特权,特别是随着人工智能继续进化成无所不知,关闭开关将不再真正与我们相关。作为神,我们可以给予和夺走生命,而不用考虑任何道德伦理上的难题。

正如哈拉里等人所阐明的那样,“神性不是一种模糊的形而上的品质。这并不等同于全能。”⁰⁶要达到在机器中创造意识的地步,只需要一个小小的飞跃,就能将我们自己视为“创造者”和“上帝”如果进行了这样的计算,就像我们可以通过奖励意识来创造生命一样,我们也可以通过同样的推理来剥夺生命。很难不想起约伯在失去他所有的孩子后说的那句名言:“*主怎样给,主就怎样拿。”⁰⁷*****

这是一个可怕的,令人不安的,令人不安的反思,后果不堪设想。然而,当我们在一个曾经无生命的物体中实现意识的目标时,这是不可避免的,合乎逻辑的结论。当考虑到弗兰肯斯坦假说时,弗里德里希·尼采·⁰⁸的话变成了预言。

与怪物搏斗的人可能会小心,以免自己因此变成怪物。如果你凝视深渊很久,深渊也会凝视你。⁰⁹

一种新的思维方式至关重要

在上面提到的尼克·博斯特罗姆的书《超级智能:路径、危险、策略》中,他写道:

在智能爆炸的前景面前,我们人类就像小孩子在玩炸弹。这就是我们玩物的力量和我们行为的不成熟之间的不匹配。超级智能是一个挑战,我们现在还没有准备好,在很长一段时间内也不会准备好。我们不知道什么时候会发生爆炸,尽管如果我们把这个装置放在耳边,我们可以听到微弱的滴答声。⁰

当爱因斯坦惊恐地意识到原子分裂在战争中的实际后果时,他听到了“微弱的滴答声”。在接下来接受《纽约时报》采访时,他表达了自己对此事的想法。

我们的世界面临着一场尚未被那些拥有权力做出重大决定的人察觉的危机,无论这场危机是好是坏。原子释放出的能量改变了一切,除了我们的思维模式,我们因此走向空前的灾难。我们这些释放出这种巨大能量的科学家在这场生死攸关的世界斗争中负有压倒性的责任,要利用原子造福人类,而不是毁灭人类……我们需要……一场全国性的运动,让人们知道,如果人类要生存并向更高层次发展,一种新型的思维是必不可少的。

爱因斯坦呼吁一种“新型思维”,这样人类才能生存。可能是他的天才,他的正直,他自己的经历,以及由此引发的破坏导致了这种行动的呼吁。然而,最重要的是,爱因斯坦的智慧是通过巨大的痛苦和想象更美好世界的能力获得的。

当一个人读到上面的引用时,我们可以很容易地用“人工智能”取代“原子”的原话——这种相似性令人不寒而栗,挥之不去。如果我们选择忽视即将到来的后果,随着人工智能变得具有思维和智能,我们继续不受阻碍地向一个世界前进,在这个世界中,曾经是机械创造的“意识”得到发展——这很有可能在未来五十年内发生——我们再次打开了潘多拉的盒子,就像我们在原子弹时代的黎明在洛斯阿拉莫斯所做的那样。

我们可能已经开始为人类创造难以置信的进步,却发现我们已经陷入了僵局。一旦在七十多年前发布,人工智能就不会静止不动,也不会一成不变,它总是以出乎意料的方式不断前进。弗兰肯斯坦假说将很快不再是理论领域,而是我们日常生活的一部分。超级智慧将毫无防备地降临到我们头上。在奔向高级人工智能的过程中,我们绝对必须应用一种“新的思维方式”如果我们选择忽视这一点,罗伯特·奥本海默在面对他的领导所创造的世界时所说的话将会让我们惊恐不已。

我们知道世界将会不同。少数人笑了,少数人哭了,大多数人沉默了。我想起了印度教经文《博伽梵歌》中的一句话。毗湿奴试图说服王子,他应该履行自己的职责,并给他留下深刻印象,他采取他的多臂形式,并说, “现在,我成为死亡,世界的毁灭者。” 我想我们都这样或那样想过。

人类是有弹性的。尽管无数次危险地接近原子毁灭,我们还是通过意志力、克制力和不小的恐惧来避免相互毁灭。目前,我们沉浸在人工智能的成就中,以及人工智能如何促进社会的各个领域。然而,弗兰肯斯坦的影子总是在背景中若隐若现,每个月都在变大。我们会允许它不受限制地发展,还是会对这种创造加以限制?如果思想、智力以及后来的意识得到发展,局限性会有帮助吗?当人工智能达到这些目标的时候,我们有能力识别那个时刻吗?

我们不可能抑制我们的好奇心和创造力——它们定义了我们的存在。

随着技术的进步,没有任何法律法规会限制我们固有的创造力。正如阿尔伯特·爱因斯坦告诉后代的那样:

重要的是不要停止提问。好奇心有它存在的理由。当一个人思考永恒、生命和现实的奇妙结构的奥秘时,他不禁感到敬畏。如果一个人每天仅仅试图理解这个秘密的一点点,这就足够了。⁴

人工智能嵌入到我们做的每一件事情中,嵌入到所有对我们的生活以及收集、使用和分析的数据施加控制的公司中。⁵然而,当我们回头看时,看到弗兰肯斯坦在后台耐心等待,我们必须保持警惕,并采取明智的克制措施。

希望在我们无法就使用开关在道德上或伦理上是否可行达成一致之前,同样的创造力、意志力、克制力、恐惧和不小的智慧会给我们提供另一个答案,只是我们还没有看到或感知到。

套用古老的意第绪语格言,“Mann Tracht,Un Gott Lacht”,的意思,“人计划,上帝大笑”,这可能很容易让人不屑一顾,轻视弗兰肯斯坦假说然而,人工智能无节制的发展不再允许文明假装无知。我们必须立即开始努力寻找一个解决方案,让人类和人工智能在我们的宇宙中保持各自独立但不*平等的地位。*****

一个中心项目将是保护人类和整个地球免受我们自身力量固有的危险。⁶

参考资料:

[1] Turing, A.M. (1950) ‘Computing Machinery and Intelligence’, Oxford University Press on behalf of MIND (the Journal of the Mind Association), Oxford, England. Vol. LIX, no. 236, pp. 433–60
[2] Wikipedia (n.d.) ‘Turing test’, available at: https://en.wikipedia.org/wiki/Turing_test (accessed 13th January, 2021).[3] Wikipedia (n.d.) ‘Alan Turning’, available at: https://en.wikipedia.org/wiki/Alan_Turing (accessed 23rd January, 2021)[4] Wikipedia (n.d.) ‘Ada Lovelace’, available at: https://en.wikipedia.org/wiki/Ada_Lovelace (accessed 19th April, 2021)
[5] Wikipedia (n.d.) ‘Ada Lovelace’, available at: https://en.wikipedia.org/wiki/Ada_Lovelace#First_computer_program (accessed 19th April, 2021)
[6] Wikipedia (n.d.) ‘Charles Babbage, available at: https://en.wikipedia.org/wiki/Charles_Babbage (accessed 19th April, 2021)[7] Isaacson, W. ‘The Innovators: How a Group of Hackers, Geniuses, and Geeks Created the Digital Revolution’, Simon & Schuster, New York, Kindle Edition, Location 651.
[8] Wikipedia (n.d.) ‘Computing Machinery and Intelligence’, available at: https://en.wikipedia.org/wiki/Computing_Machinery_and_Intelligence (accessed 19th April, 2021)
[9] Wikipedia (n.d.) ‘Lord Byron’, available at: https://en.wikipedia.org/wiki/Lord_Byron (accessed 19th April, 2021)
[10] Wikipedia (n.d.) ‘Mary Shelley’ available at: https://en.wikipedia.org/wiki/Mary_Shelley (accessed 19th April, 2021)[11] Isaacson, W. ‘The Innovators: How a Group of Hackers, Geniuses, and Geeks Created the Digital Revolution’, Simon & Schuster, New York, Kindle Edition, Location 367.
[12] McCarthy, J. Minsky, M.L., Rochester, N. and Shannon, C.E. (1955) ‘A Proposal for The Dartmouth Summer Research Project on Artificial Intelligence’ available at: http://www-formal.stanford.edu/jmc/history/dartmouth/dartmouth.html (accessed 13th January, 2021).
[13] Wikipedia (n.d.) ‘Artificial intelligence’, available at: https://en.wikipedia.org/w/index.php?title=Artificial_intelligence&oldid=997705860 (accessed 13th January, 2021).
[14] Wikipedia (n.d.) ‘John McCarthy (computer scientist)’, available at: https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist) (accessed 13th January, 2021).
[15] Webb, Amy. (2019) ‘The Big Nine: How the Tech Titans and Their Thinking Machines Could Warp Humanity’ PublicAffairs, New York, Kindle Edition Chapter One “Mind and Machine: A Very Brief History of AI”
[16] Wikipedia (n.d.) ‘René Descartes’, available at: https://en.wikipedia.org/wiki/Ren%C3%A9_Descartes (accessed 23rd January, 2021)
[17] Descartes, R. (1637) ‘Discourse on the Method of Rightly Conducting One’s Reason and of Seeking Truth in the Sciences’, The Project Gutenberg EBook available at: https://www.gutenberg.org/files/59/59-h/59-h.htm#part4 (accessed 23rd January, 2021)
[18] Wikipedia (n.d.) ‘Discourse on the Method’, available at: https://en.wikipedia.org/wiki/Discourse_on_the_Method (accessed 23rd January, 2021)
[19] Descartes, R. (1644) ‘Principia Philosophiæ’ Translated into French by: Picot, A.C., “Les Principes de la Philosophie”
[20] Wikipedia (n.d.) ‘Thought’ available at: https://en.wikipedia.org/wiki/Thought (accessed 23rd January, 2021)
[21] Heidegger, M. (1968) ‘What Is Called Thinking?’, Harper & Row, New York.
[22] Wikipedia (n.d.) ‘Thought’ available at: https://en.wikipedia.org/wiki/Thought (accessed 23rd January, 2021)
[23] Cambridge Dictionary (n.d.) ‘thought’ available at: https://dictionary.cambridge.org/us/dictionary/english/thought (accessed 24th January, 2021)
[24] Cambridge Dictionary (n.d.) ‘thinking’ available at: https://dictionary.cambridge.org/us/dictionary/english/thinking (accessed 24th January, 2021)
[25] Wikipedia (n.d.) ‘Bloom’s taxonomy’ available at: https://en.wikipedia.org/wiki/Bloom%27s_taxonomy (accessed 24th January, 2021)
[26] ‘Types of Thinking’, College Success, available at: https://open.lib.umn.edu/collegesuccess/chapter/3-1-types-of-thinking/#lochhaas-ch03_s01_f01 (accessed 24th January, 2021)
[27] Wikipedia (n.d.) ‘Martin Heidegger’ available at: https://en.wikipedia.org/wiki/Martin_Heidegger (accessed 24th January, 2021)
[28] Heidegger, M. (1954) ‘What Is Called Thinking?’, self-published by the author.
[29] Ibid, page 6
[30] Heidegger, M. (1976), ‘What Is Called Thinking’, Harper Perennial Modern Thought, New York, Reprint Edition pg. 21
[31] Turing, A.M. (1950) ‘Computing Machinery and Intelligence’, Oxford University Press on behalf of MIND (the Journal of the Mind Association), Oxford, England. Vol. LIX, no. 236, pg. 433
[32] Turing, A.M. (1950) ‘Computing Machinery and Intelligence’, Oxford University Press on behalf of MIND (the Journal of the Mind Association), Oxford, England. Vol. LIX, no. 236, pp. 433–60
[33] Wikipedia (n.d.) ‘Turing test’ available at: https://en.wikipedia.org/wiki/Turing_test (accessed 27th January, 2021)[34] Ibid
[<#_ednref5>35] Turing, A.M. (1950) ‘Computing Machinery and Intelligence’, Oxford University Press on behalf of MIND (the Journal of the Mind Association), Oxford, England. Vol. LIX, no. 236, pg. 450
[36] Searle, J.R. (1980), ‘Minds, brains, and programs’, Behavioral and Brain Sciences, Volume 3, Issue 3, September 1980, pp. 417–424
[37] Wikipedia (n.d.) ‘John Searle’ available at: https://en.wikipedia.org/wiki/John_Searle (accessed 29th January, 2021)[38] Turing, A.M. (1950) ‘Computing Machinery and Intelligence’, Oxford University Press on behalf of MIND (the Journal of the Mind Association), Oxford, England. Vol. LIX, no. 236, pg. 444
[39] Wikipedia (n.d.) ‘Chinese room’ available at: https://en.wikipedia.org/wiki/Chinese_room (accessed 29th January, 2021)[40] Searle, J.R. (1980), ‘Minds, brains, and programs’, Behavioral and Brain Sciences, Volume 3, Issue 3, September 1980, Abstract available at: https://www.cambridge.org/core/journals/behavioral-and-brain-sciences/article/abs/minds-brains-and-programs/DC644B47A4299C637C89772FACC2706A (accessed 29th January, 2021)
[41] Viereck, G.S. (1929), ‘What Life Means to Einstein’, Saturday Evening Post, October, 26, 1929 pg. 117
[42] Shelley, M.W.G. (1818) “Frankenstein; or the Modern Prometheus”, The Project Gutenberg EBook available at: https://www.gutenberg.org/files/84/84-h/84-h.htm (accessed 23rd January, 2021)
[43] Wikipedia (n.d.) ‘Mary Shelley’ available at: https://en.wikipedia.org/wiki/Mary_Shelley (accessed 30th January, 2021)[44] Wikipedia (n.d.) ‘Frankenstein’ available at: https://en.wikipedia.org/wiki/Frankenstein (accessed 23rd January, 2021)[45] Wikipedia (n.d.) ‘Arthur C. Clarke’ available at: https://en.wikipedia.org/wiki/Arthur_C._Clarke (accessed 23rd January, 2021)
[46] Wikipedia (n.d.) ‘Isaac Asimov’ available at: https://en.wikipedia.org/wiki/Isaac_Asimov (accessed 23rd January, 2021)[47] Wikipedia (n.d.) ‘Liar! (short story)’ available at: https://en.wikipedia.org/wiki/Liar!_(short_story) (accessed 23rd January, 2021)
[48] Wikipedia (n.d.) ‘Frank Herbert’ available at: https://en.wikipedia.org/wiki/Frank_Herbert (accessed 23rd January, 2021)[49] Dune Wiki (n.d.) ‘Orange Catholic Bible — Selected Quotes from the Commission’s Orange Catholic Bible Commentaries’, available at: https://dune.fandom.com/wiki/Orange_Catholic_Bible (accessed 23rd January, 2021)
[50] Wikipedia (n.d.) ‘Watson (computer)’ available at: https://en.wikipedia.org/wiki/Watson_(computer) (accessed 23rd January, 2021)
[51] TBS Staff (2020), ‘Jeopardy! as a Modern Turing Test: Did Watson Really Win?’ TheBestSchools, March 23, 2020, available at: https://thebestschools.org/magazine/watson-computer-plays-jeopardy/ (accessed 3rd February, 2021)
[52] Best, J. (2013) ‘IBM Watson: The inside story of how the Jeopardy-winning supercomputer was born, and what it wants to do next’, TechRepublic, September 9, 2013 available at: https://www.techrepublic.com/article/ibm-watson-the-inside-story-of-how-the-jeopardy-winning-supercomputer-was-born-and-what-it-wants-to-do-next/ (accessed 3rd February, 2021)
[53] Falk, D. (2106) ‘A Debate Over the Physics of Time’, Quanta Magazine, July 19, 2016 available at: https://www.quantamagazine.org/a-debate-over-the-physics-of-time-20160719/ (accessed 30th January, 2021)
[54] Wikipedia (n.d.) ‘Elon Musk’ available at: https://en.wikipedia.org/wiki/Elon_Musk (accessed 23rd January, 2021)[55] Gibbs, S. (2014), ‘Elon Musk: artificial intelligence is our biggest existential threat’, The Guardian, October 27, 2014 available at: https://www.theguardian.com/technology/2014/oct/27/elon-musk-artificial-intelligence-ai-biggest-existential-threat (accessed 23rd January, 2021)
[56] Gibbs, S. (2017), ‘Elon Musk: regulate AI to combat ‘existential threat’ before it’s too late’, The Guardian, July 17, 2017 available at: https://www.theguardian.com/technology/2017/jul/17/elon-musk-regulation-ai-combat-existential-threat-tesla-spacex-ceo (accessed 23rd January, 2021)
[57] Wikipedia (n.d.) ‘Bill Gates’ available at: https://en.wikipedia.org/wiki/Bill_Gates (accessed 23rd January, 2021)
[58] Mack, E. ‘Bill Gates Says You Should Worry About Artificial Intelligence’, Forbes, January 28, 2015 available at: https://www.forbes.com/sites/ericmack/2015/01/28/bill-gates-also-worries-artificial-intelligence-is-a-threat/?sh=332f7821651f (accessed 23rd January, 2021)
[59] Wikipedia (n.d.) ‘Stephen Hawking’ available at: https://en.wikipedia.org/wiki/Stephen_Hawking (accessed 23rd January, 2021)
[60] Cellan-Jones, R. (2014) ‘Stephen Hawking warns artificial intelligence could end mankind’, BBC News, December 2, 2014 available at: https://www.bbc.com/news/technology-30290540 (accessed 23rd January, 2021)
[61] Wikipedia (n.d.) ‘Yuval Noah Harari’ available at: https://en.wikipedia.org/wiki/Yuval_Noah_Harari (accessed 23rd January, 2021)
[62] Harari, Y.N. (2017), ‘Homo Deus: A Brief History of Tomorrow’, Harper, New York, Kindle Edition Location 4533–4546
[63] Bostrom, N., (2014) ‘Superintelligence: Paths, Dangers, Strategies’, Oxford University Press, New York
[64] Wikipedia (n.d.) ‘Nick Bostrom’ available at: https://en.wikipedia.org/wiki/Nick_Bostrom (accessed 1st February, 2021)[65] Bostrom, N., (2014) ‘Superintelligence: Paths, Dangers, Strategies’, Oxford University Press, New York, pg. V
[66] ‘OpenAI’ (n.d.), available at: https://openai.com/ (accessed 3rd February, 2021)
[67] ‘Future of Life Institute’ (n.d.), available at: https://futureoflife.org/ (accessed 3rd February, 2021)
[68] ‘DeepMind’ (n.d.), available at: https://deepmind.com/ (accessed 3rd February, 2021)
[69] Wikipedia (n.d.) ‘Mark Hurd’ available at: https://en.wikipedia.org/wiki/Mark_Hurd (accessed 3rd February, 2021)[70] Hurd, M. (2019), ‘Good give and take with industry analysts about risks of #AI. I’m less worried about the Terminator than the economic risk of not leading in it because it will create more jobs than it destroys.’, tweet from 21 March, available at: https://twitter.com/MarkVHurd/status/1108497157957402624 (accessed 1st February, 2021)
[71] Davidson, L. (2019), ‘Narrow vs. General AI: What’s Next for Artificial Intelligence?’, Springboard Blog, August 12, 2019, available at: https://www.springboard.com/blog/narrow-vs-general-ai/ (accessed 5th February, 2021)
[72] O’Carroll, B. (2017), ‘What are the 3 types of AI? A guide to narrow, general, and super artificial intelligence’, Codebots, October 24, 2017, available at: https://codebots.com/artificial-intelligence/the-3-types-of-ai-is-the-third-even-possible (accessed 5th February, 2021)
[73] Wikipedia (n.d.) ‘Existential risk from artificial general intelligence’ available at: https://en.wikipedia.org/wiki/Existential_risk_from_artificial_general_intelligence (accessed 1st February, 2021)
[74] Merriam-Webster (n.d.) ‘ontology’ available at: https://www.merriam-webster.com/dictionary/ontology (accessed 1st February, 2021)
[75] Wikipedia (n.d.) ‘Ontology’ available at: https://en.wikipedia.org/wiki/Ontology (accessed 1st February, 2021)
[76] Ibid
[77] Wikipedia (n.d.) ‘Complexity’ available at: https://en.wikipedia.org/wiki/Complexity (accessed 7th March, 2021)
[78] Johnson, N. F. (2009), ‘Simply complexity: A clear guide to complexity theory’ Oneworld Publications, Oxford, England, pg. 3.
[79] Wikipedia (n.d.) ‘Singularity (system theory)’ available at: https://en.wikipedia.org/wiki/Singularity_(system_theory)#Singularities_and_complexity (accessed 21st March, 2021)
[80] Wikipedia (n.d.) ‘Technological singularity’ available at: https://en.wikipedia.org/wiki/Technological_singularity (accessed 21st March, 2021)
[81] Kurzweil R. (2010), ‘The Singularity Is Near: When Humans Transcend Biology’ Duckworth, New York, Prologue
[82] Wikipedia (n.d.) ‘Emergence’ available at: https://en.wikipedia.org/wiki/Emergence (accessed 7th March, 2021)
[83] Chalmers, D. (1996), ‘The Conscious Mind: In Search of a Fundamental Theory’, Oxford University Press, United States, pgs. 432
[84] Wikipedia (n.d.) ‘David Chalmers’ available at: https://en.wikipedia.org/wiki/David_Chalmers (accessed 5th February, 2021)
[85] Wikipedia (n.d.) ‘GPT-3’ available at: https://en.wikipedia.org/wiki/GPT-3 (accessed 30th January, 2021)
[86] Rao, D. (2021), ‘GPT-3: We’re at the very beginning of a new app ecosystem’, VentureBeat, February 27, 2021 available at: https://venturebeat.com/2021/02/27/gpt-3-were-at-the-very-beginning-of-a-new-app-ecosystem/amp/ (accessed 28th February, 2021)
[87] Ohlheiser, A., Hao K. (2021), ‘An AI is training counselors to deal with teens in crisis’, MIT Technology Review, February 26, 2021 available at: https://www.technologyreview.com/2021/02/26/1020010/trevor-project-ai-suicide-hotline-training/amp (accessed 2nd March, 2021)
[88] Heaven, W.D. (2020), ‘OpenAI’s new language generator GPT-3 is shockingly good — and completely mindless’, MIT Technology Review, July 20, 2020 available at: https://www.technologyreview.com/2020/07/20/1005454/openai-machine-learning-language-generator-gpt-3-nlp/ (accessed 30th January, 2021)
[89] Heaven, W.D. (2021), ‘Why GPT-3 is the best and worst of AI right now’, MIT Technology Review, February 24, 2021 available at: https://www.technologyreview.com/2021/02/24/1017797/gpt3-best-worst-ai-openai-natural-language (accessed 26th February, 2021)
[90] Elliott, E. (2020), ‘What It’s Like To be a Computer: An Interview with GPT-3’ (Video Recording) available at: https://www.youtube.com/watch?v=PqbB07n_uQ4&feature=youtu.be (accessed 30th January, 2021)
[91] Ramesh, A. Pavlov, M. Goh, G. and Gray, S. (2021) ‘DALL·E: Creating Images from Text’, OpenAI, January 5, 2021 available at: https://openai.com/blog/dall-e/ (accessed 30th January, 2021)
[92] Mohammed, M. (2021), ‘OpenAI GPT-3 created an AI Artist that can draw ANYTHING — DALL.E’ (Video Recording) available at: https://www.youtube.com/watch?v=y_TKakn3OPA (accessed 30th January, 2021)
[93] Letitia (2021), ‘OpenAI’s DALL-E explained. How GPT-3 creates images from descriptions’, AI Coffee Break with Letitia (Video Recording) available at: https://www.youtube.com/watch?v=mvG2FGF0TvM (accessed 30th January, 2021)
[94] DeepMind, available at: https://deepmind.com/ (accessed 31st January, 2021)
[95] Parsons, J. (2015), ‘Everybody working in Artificial Intelligence knows the Terminator scenario’: Futurologist explains when killer robots could endanger humanity’, Daily Mirror, November 4, 2015 available at: https://www.mirror.co.uk/news/technology-science/technology/everybody-working-artificial-intelligence-knows-6759244 (accessed 31st January, 2021)[96] Stevenson, R., Davis, R. (2021) ‘Elon Musk Says He Wired Up a Monkey’s Brain to Play Video Games’ Bloomberg, available at: https://www.bloomberg.com/news/articles/2021-02-01/elon-musk-wired-up-a-monkey-s-brain-to-play-videogames (accessed 2nd February, 2021)
[97] Wikipedia (n.d.) ‘Terminator (franchise)’ available at: https://en.wikipedia.org/wiki/Terminator_(franchise) (accessed 1st February, 2021)
[98] Wikipedia (n.d.) ‘Terminator Salvation’ available at: https://en.wikipedia.org/wiki/Terminator_Salvation (accessed 1st February, 2021)
[99] IMDB (n.d.) ‘Terminator Salvation’ available at: https://www.imdb.com/title/tt0438488/characters/nm0000288 (accessed 1st February, 2021)
[100] Mann, H., (1867) ‘Thoughts selected from the writings of Horace Mann’ H.B. Fuller, Boston pg. 14 available at: https://archive.org/details/thoughtsselected00mann (accessed 1st February, 2021)
[101] Genesis 2:7, The JPS Hebrew-English Tanakh — The New JPS Translation — 2nd Edition (2003), The Jewish Publication Society, Philadelphia
[102] Wikipedia (n.d.) ‘Existence of God’ available at: https://en.wikipedia.org/wiki/Existence_of_God (accessed 15th February, 2021)
[103] Merriam-Webster Dictionary (n.d.) ‘God’ available at: https://www.merriam-webster.com/dictionary/god (accessed 14th February, 2021)
[104] Wikipedia (n.d.) ‘God’ available at: https://en.wikipedia.org/wiki/God (accessed 15th February, 2021)
[105] Harari, Y.N. (2017), ‘Homo Deus: A Brief History of Tomorrow’, Harper, New York, Kindle Edition Location 657
[106] Harari, Y.N. (2017), ‘Homo Deus: A Brief History of Tomorrow’, Harper, New York, Kindle Edition Location 1092
[107] Job 1:21
[108] Wikipedia (n.d.) ‘Friedrich Nietzsche’ available at: https://en.wikipedia.org/wiki/Friedrich_Nietzsche (accessed 14th February, 2021)
[109] Nietzsche, F. (1886), ‘Beyond Good and Evil’, Translated by: Zimmern, H., Gutenberg Press, (2013), Chapter IV. Apophthegms and Interludes #146 available at: https://www.gutenberg.org/files/4363/4363-h/4363-h.htm (accessed 14th February, 2021)
[110] Bostrom, N., (2014) ‘Superintelligence: Paths, Dangers, Strategies’, Oxford University Press, New York, pg. 259
[111] New York Times — ‘Atomic Education Urged by Einstein’, May 25 1946, p.11 available at: https://www.nytimes.com/1946/05/25/archives/atomic-education-urged-by-einstein-scientist-in-plea-for-200000-to.html (accessed 1st February, 2021)
[112] Wikipedia (n.d.) ‘J. Robert Oppenheimer’ available at: https://en.wikipedia.org/wiki/J._Robert_Oppenheimer (accessed 1st February, 2021)
[113] Oppenheimer, J.R. “Now I am become death…”, Media Gallery available at: https://www.atomicarchive.com/media/videos/oppenheimer.html (accessed 1st February, 2021)
114[] Miller, W. (1955), ‘Death of a Genius: His fourth dimension, time, overtakes Einstein, Subsection: Old Man’s Advice to Youth: ‘Never Lose a Holy Curiosity’, LIFE Magazine, Time Inc., May 2, 1955, pgs. 62–64.
[115] Fast Company Staff ‘The 10 most innovative companies in artificial intelligence’, Fast Company, March 9, 2021 available at: https://www.fastcompany.com/90600124/artificial-intelligence-most-innovative-companies-2021 (accessed 11th March, 2021)
[116] Harari, Y.N. (2017), ‘Homo Deus: A Brief History of Tomorrow’, Harper, New York, Kindle Edition Location 639

关于作者:

特德·w·格罗斯是一位未来学家和理论家。他担任 R&D 首席技术官兼副总裁多年,擅长数据库技术,专注于 NoSQL 系统、NodeJS、MongoDB、加密、人工智能、创新、颠覆和混沌理论。他还擅长虚拟世界技术和增强现实。Ted 在专业期刊和在线@ 媒体 & LinkedIn 上撰写了许多关于技术主题的文章。

可以通过电子邮件联系 TedLinkedIn中等

神射的频率

原文:https://towardsdatascience.com/the-frequency-of-god-shots-f4b215b4d15c?source=collection_archive---------33-----------------------

咖啡数据科学

看看伟大的浓缩咖啡每周的变化

当人们被介绍到家庭浓缩咖啡时,他们经常会被吸进去。这有点像海洛因。会上瘾的。过程,香味,咖啡。所以,人们经常在寻找比你吃过的任何东西都好吃的神酒。神射是如此之好,你甚至不知道你在寻找它,直到你喝了它。这是一个超出你目前味觉体验的镜头。这是一个很好的镜头,它扩大了你的口味范围。

定义和数据

神射球的定义是:完美的球,比你以前的任何球都好。

在过去的几年里,我一直在收集大量的拍摄数据,大约一年前,我在数据表中开始了一个公式,以表明我是否比以往任何时候都更好地拍摄了一个镜头。从神枪手的定义来看,每次你比以前打得更好,那就是神枪手。我拿着这些数据,我观察了过去一年中这种拍摄的频率。

我称我的味觉得分为最终得分,它是 7 个指标(尖锐、浓郁、糖浆、甜味、酸味、苦味和余味)的记分卡的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难,会影响最终得分。

数据分析

首先,我可以把这些数据放在一起。许多变化是由于烘焙用的咖啡豆不同,所以我每周都看。我根据过去的分数和我看到的所有分数对数据进行了缩放。这最终会在最后收敛。通常,当我击中一些不可思议的烤肉并结合优化的技术时,神射发生在集群中,因为我的技术也一直在发展。

我们可以将镜头分为好的(> 8)、好的(> 5 &<8)和差的(< 5)。然后我们可以看到任何有趣的运动,无论是在时间上还是在全球范围内:

我用这些数据对我的咖啡烘烤品进行分类,寻找任何模式。

这是同一个图,但是是全球范围的:

一些有趣的趋势出现了。我看了最好的烤肉,有些比其他的好得多。他们拍摄了一系列精彩镜头。

我把烤肉分成最好的和最差的。最好的烤肉是中美洲的非洲咖啡豆。在这些最好的烘焙中,危地马拉豆和巴拿马豆是艺妓豆,所以它们的表现正如你所料。

最糟糕的烧烤似乎更加随机。有一种哥斯达黎加和夏威夷咖啡豆在两种情况下都不太好,它们被放在一起烘烤。

我过去的目标是在我的味觉尺度上达到一些数字。我记得打 10 分就像是一件了不起的事情,当时就是这样。但我也不知道 20 分的投篮会是什么味道。我不再那么关心击球了。准确地击中那种球是很困难的,因为它需要正确的烘烤、正确的准备和一些运气,但当它发生时,我当然很享受。

如果你愿意,可以在 Twitter 和 YouTube 上关注我,我会在那里发布不同机器上的浓缩咖啡视频和浓缩咖啡相关的东西。你也可以在 LinkedIn 上找到我。也可以关注我

我的进一步阅读:

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影启动页面

使用图像处理测量咖啡研磨颗粒分布

改善浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡用纸质过滤器

浓缩咖啡篮及相关主题

意式咖啡观点

透明 Portafilter 实验

杠杆机维护

咖啡评论和想法

咖啡实验

“经常一起买”推荐系统

原文:https://towardsdatascience.com/the-frequently-bought-together-recommendation-system-b4ed076b24e5?source=collection_archive---------5-----------------------

实践教程

使用 Apriori 和 FP 增长算法以及mlxtend库的 python 演练

马克·柯尼希Unsplash 上的照片

不是所有的推荐系统都需要机器学习;有些只是需要一点数据挖掘。

本文将介绍一个相对简单的经常一起购买(又名经常一起购买)推荐系统的实现。这种推荐系统的一个显著优点是,除了用户正在查看哪个项目之外,它不需要我们知道关于用户的任何信息。这很重要,因为今天大多数电子商务网站的大部分流量直接来自脸书、Twitter 或谷歌广告的产品页面。如果他们希望在这种流量上进行销售,他们不能要求新用户登录或选择他们喜欢的项目来帮助推动他们的推荐。

这种方法只依赖于在商店以相同的订单一起购买的商品的历史记录。它确实要求商店有足够长的交易历史来进行关联。一旦这一点得到满足,我们就可以向网站访问者推荐他们经常购买的商品以及他们正在查看的商品。

让我们开始吃吧。

数据

对于这个例子,我们将使用来自 UCI 机器学习库在线零售数据集。描述如下:

这是一个跨国数据集,包含 2010 年 1 月 12 日和 2011 年 9 月 12 日之间发生的所有英国注册无店铺在线零售交易。该公司主要销售独特的适合各种场合的礼品。这家公司的许多客户都是批发商。

该数据集在知识共享署名 4.0 国际许可(CC BY 4.0)下可用,该许可允许出于任何目的共享和改编数据集,前提是给予适当的信用。

我不知道“无店铺在线零售”是什么意思,但需要注意的是,许多客户是批发商,这可能会影响我们看到的推荐类型。

像大多数数据集一样,这个数据集相当混乱,我们必须做一些清理工作,以使数据可用。如果你想直接进入主题,请随意跳过。

数据清理

1)我们将首先加载数据集并查看它:

import pandas as pd# read the dataset in from the excel file
df = pd.read_excel('Online Retail.xlsx')# show the first few rows
df.head()

作者图片

2)我们会面临的一个问题是,StockCode的值有的是整数,有的是字符串。稍后,当我们将这些转换成一个列表并通过我们的算法运行它们时,我们会得到一个错误。让我们在 StockCode 前面加上一个字符,以确保它总是被解释为一个字符串。当然,还有其他方法可以做到这一点,但这很简单,而且可以节省以后的代码行。

# Prepend '_' to StockCode
df['StockCode'] = df['StockCode'].apply(lambda x: '_'+str(x))

3)然后,我们将数据分成两个数据帧,一个用于计算关联规则( the what?不要担心,我们一分钟后会谈到这个问题,另一个问题是查找要在我们的推荐中显示的描述。

注意,对于products数据帧,我们创建了一个副本。这是为了避免未来的A value is trying to be set on a copy of a slice from a DataFrame警告。

# DataFrame for building the recommendation system
orders = df[['InvoiceNo', 'StockCode']]# DataFrame for retrieving product descriptions
products = df[['StockCode', 'Description']].copy()

4)股票代码的字符大小写不一致。我们通过将所有股票代码全部大写来解决这个问题。

# Convert StockCode to uppercase
products['StockCode'] = products['StockCode'].str.upper()

5)我们需要从产品数据框架中删除重复的行。

# Drop duplicated products
products = products[~products.duplicated()]

5)一些股票代码仍然有多种描述,如下所示:

原来显示项目名称的描述都是大写的。我们将删除Description列中的值不是大写的所有行。

# Drop descriptions that are not uppercase
products = products[
    products['Description'].str.upper() == products['Description']
]

6)让我们像这样去掉其余的重复的StockCode:

# Keep only the first Description of each product
products = products[~products.duplicated(subset=['StockCode'])]

7)最后,我们将设置 StockCode 作为索引,并将我们的数据帧转换为 Pandas 系列,这样我们以后就可以很容易地查找描述了。

# Set the index to StockCode
products = products.set_index('StockCode')# Convert to Series for eve easier lookups
products = products['Description']

术语

这里有许多关于数据科学的优秀文章,深入解释了我们正在使用的算法。看一看这里,这里这里,这里这里。我也发现这个 youtube 视频特别有用。我的目标是向您展示一个使用 Apriori 和 JP 增长算法的推荐系统的实际实现。我们将而不是从头开始编写算法。不过,有些事情你需要知道。

条款

  • 商品:根据与其他商品的关联度,我们试图推荐的商品或事物。在杂货店,这些可能是产品,如牛奶,尿布和啤酒。
  • 项目集:一起购买的一个或多个项目。
  • 关联规则:我们将根据项目集计算的规则来确定推荐。一旦我们有了关联规则,我们就可以使用它们来推荐经常购买的商品以及客户正在查看的商品。

韵律学

  • 支持度:以任意给定顺序找到一个项集的概率。这是包含特定项目集的订单的百分比。

作者图片

  • 置信度:给定商品 1 在订单中,在订单中找到商品 2 的概率。这告诉我们一个商品与另一个特定商品一起被购买的可能性有多大。

作者图片

  • Lift: 一个项集中两个项的支持度与每个项独立时出现的期望概率之间的关系。关于 lift 需要知道的重要事情是, 1 的值意味着两个项目是独立的,大于 1 的值意味着这些项目比它们独立时更有可能一起出现,小于 1 的值表示这些项目比它们独立时更不可能一起出现。

作者图片

算法

  • Apriori: 可能是数据挖掘关联规则最著名的算法,因为它的简单性。对大型数据集进行计算可能需要很长时间,因为它的时间复杂度为 O(n)或更低,具体取决于实现。
  • JP Growth: 一种快得多的算法,使用基于树的方法,将数据读取限制在两遍。这导致线性时间复杂度 O(n),随着数据集的增长节省了大量计算资源。查看此视频以获得关于 JP 增长算法如何工作的详细描述。

履行

既然我们已经解决了所有这些问题,我们就来看最简单的部分:实现推荐系统。

这很容易,因为像所有流行的算法一样,python 库已经为我们处理了繁重的工作。我们将使用mlxtend库,在其网站上将其描述为“用于日常数据科学任务的有用工具的 Python 库”

转换数据

我们用来计算项目集的两种方法都需要一个一次性编码的 Pandas 数据框架,其中产品作为列,订单作为行。幸运的是,mlxtend还提供了一个方便的 TransactionEncoder,它负责从我们当前的数据帧到所需格式的大部分转换。

from mlxtend.preprocessing import TransactionEncoder# fit the TransactionEncoder
te.fit(orders['StockCode'])# do the transformation
orders_1hot = transform(orders['StockCode'])

orders_1hot是一个 NumPy 数组。mlxtend 函数需要 pandas 数据帧。我们可以很容易地将 NumPy 数组转换成 DataFrame,如下所示:

# convert orders_1hot to a DataFrame
orders_1hot = pd.DataFrame(orders_1hot, columns =te.columns_)# Inspect the first 5 rows of the DataFrame
orders_1hot.head()

作者图片

先验模型

我们可以对我们的数据运行 Apriori 模型,用一行神奇的代码来挖掘项集。但是在我们这样做之前,我们需要决定一个最小的支持(还记得术语部分的支持吗?).这个最小支持值使我们不会只考虑订单中很小一部分一起购买的商品。这些关联是没有帮助的,会大大增加我们的计算开销。最小支撑因应用而异。我们将使用 0.01,这意味着模型返回的任何项集将在商店中至少 1%的订单中出现。

我们还将使用可选参数use_colnames返回由股票代码标识的项目集,而不是列索引。这将有助于我们稍后解释我们的结果。

max_len项集的大小限制为 1。因为我们只希望根据站点访问者查看的特定项目推荐单个项目的列表,所以我们只需要关注最多 2 个产品的项目集

准备好了…

from mlxtend.frequent_patterns import apriori# the moment we have all been waiting for
ar_ap = apriori(df_ary, min_support=0.01, max_len=2,
                use_colnames=True)

哒哒!

你可能注意到这并不快。然而,在这个数据集上,它也不是无休止的。我笔记本电脑的运行时间是 2 分 15 秒。请记住,这只是一年半的交易。如果我们有更多的事务,并且考虑到 Apriori 模型的时间复杂性,这将花费相当长的时间。

让我们来看看结果。

作者图片

这是一个包含每个项目集及其支持的表格。完美,这正是我们最终计算关联规则所需要的。

FP 增长

FP 增长算法(fpgrowth)的 mlxtend 实现是apriori的替代。要查看它的运行情况,我们将执行以下操作。

from mlxtend.frequent_patterns import fprowth# the moment we have all been waiting for (again)
ar_fp = fprowth(df_ary, min_support=0.01, max_len=2,
                use_colnames=True)

这给了我们一个数据帧,其中的项目与apriori算法相同(顺序不同),但耗时 5.2 秒!在我们的数据集上,Apriori 算法的计算时间是 FP Growth 算法的 33 倍以上。它的时间复杂度是线性的,所以当我们的商店变大时,这种差异会更加明显。

注意:itemsets 列中的值是 frozensets。这与用于实现 Apriori 算法的方法有关,并且它被带到 FP 增长,以便 *fpgrowth* 可以是对 *apriori* 的替换。这使得比较数据帧变得困难。然而,如果你想看到它们包含相同信息的证据,看看下面链接的与本文相关的笔记本。

https://github.com/benbogart/frequently_bought_together

计算关联规则

有了这些项集,我们现在可以很容易地计算出关联规则。同样,我们必须设置一个度量的最小阈值。我们可以从支持、信心提升或其他几个我们没有讨论过的指标中进行选择。这里的目的是限制不太可能高度相关的结果。您设置的阈值将取决于您的应用。例如,如果您想在大多数时间显示一个推荐,而不管质量如何,您可以将min_threshold设置得很低。如果你只对向你的访问者展示高度相关的推荐感兴趣,你应该提高门槛来消除弱关联。

我们将使用提升,因为提升是两个项目之间关联的度量。如果 lift 大于 1,它告诉我们项目集中的项目被一起购买的次数比随机购买的次数多,这似乎是一个常见的选择。

from mlxtend.frequent_patterns import association_rulesar = association_rules(is_fp, 
                       metric="lift", 
                       min_threshold=10)

这给了我们一个 808 行 9 列的数据帧。

作者图片

这是我们的关联规则表,其中包含为我们计算的所有指标!大部分栏目都很清楚,但是让我们看看前两个。

  • 前情:我们推荐的产品。
  • 结果:我们根据前因推荐的产品。

提出建议

现在我们有了关联规则,我们只需从数据框架中提取正确的规则,返回一个经常一起购买的推荐。

我们将使用一个简短的函数来完成这项工作。我们将股票代码作为 python 集合传入(关键字是 frozensets,但是 frozensets集合可以成功比较)。

predict 函数中有一个技巧值得解释。不能对 frozenset 进行索引,也不能用pop方法(或任何其他方式)从 frozenset 中移除项目。)要将frozenset转换成一个字符串,我们首先用iterfrozenset转换成一个可迭代的,然后用next从其中取出第一个也是唯一的元素。

规则已经按照我们在计算关联规则时选择的度量进行了排序,所以我们不需要再次排序。

def predict(antecedent, rules, max_results= 6):

    # get the rules for this antecedent
    preds = rules[rules['antecedents'] == antecedent]

    # a way to convert a frozen set with one element to string
    preds = preds['consequents'].apply(iter).apply(next)

    return preds[:max_results]

让我们试一试

preds = predict({'_20712'}, rules)
preds

作者图片

我们做到了!

但是我们怎么知道我们做到了呢?让我们看看这些预测代表了什么。

首先,让我们找出股票代码 _20727指的是哪种产品。这将是我们的前因。

print(products['_20712'])

作者图片

现在我们来看看推荐产品或者后果的描述。

for stockid in preds:  
    print(products[stockid])

作者图片

一堆袋子。这是有道理的,考虑到我们是在和批发商打交道。

我们再试试另外一个:股票代码 _20719

print(products['_22112'])

作者图片

# get the predictions
preds = predict({'_22112'}, rules)# Display the descriptions of the predictions
for stockid in preds:  
    print(products[stockid])

作者图片

耶!水瓶!由于许多顾客是批发商,他们一起购买各种水瓶是有道理的。看起来我们成功了。

结论

当创建一个经常一起购买的推荐系统时,有相当多的东西需要理解。我们只是触及了表面,但重要的是,经常一起购买的推荐系统是基于创建一个静态表,称为关联规则。最后的推荐只是一个查找。这很棒,因为它很简单。但是这些关联规则需要定期重新计算。

有了 python 和mlxtnd库,为经常一起购买的推荐系统生成关联规则只需要很少的代码。

去做点好事吧。

资源

这里有一些我发现对本文写作有帮助的资源。

  • 实用推荐系统 作者金·福克
    (这是附属链接。我得到一小笔钱,如果你通过这个链接购买,支持更多像这样的文章)

文章和网页

录像

GitHub 知识库

https://github.com/benbogart/frequently_bought_together

[1]陈大庆、赛梁赛恩和郭昆,“在线零售业的数据挖掘:使用数据挖掘进行基于 RFM 模型的客户细分的案例研究”,《数据库营销和客户战略管理杂志》,第 19 卷第 3 期,第 197-208 页,2012 年(印刷前在线出版:2012 年 8 月 27 日)。doi: 10.1057/dbm.2012.17)。

[2]https://archive-beta.ics.uci.edu/ml/donation-policy(在撰写本文时,许可证声明网站测试版的 ssl 认证是无效的。)

数据仓库+数据湖=湖屋的基础

原文:https://towardsdatascience.com/the-fundamentals-of-data-warehouse-data-lake-lake-house-ff640851c832?source=collection_archive---------2-----------------------

照片由 janer zhangUnsplash

介绍

随着数据仓库和数据湖的发展,在过去的几年中,它们确实变得更加专业化,但是仍然各自为政。这两种数据管理技术都有自己的特性,最适合用于特定的任务和需求,但是它们在提供一些重要的功能方面也有困难。数据仓库的优势集中在分析结构化数据、OLTP、写模式、SQL 和交付符合 ACID 的数据库事务。数据湖的优势集中在分析所有类型的数据(结构化、半结构化、非结构化)、OLAP、读取时模式、API 连接性以及针对开放文件格式数据的低成本对象存储系统(即 Apache Parquet)。

值得注意的是,数据仓库尤其难以支持高级数据工程、数据科学和机器学习。例如,他们无法存储非结构化数据(即文本、图像、视频、特征工程向量等)。)进行机器学习开发。此外,专有数据仓库软件价格昂贵,并且难以集成开源+云平台数据科学和数据工程工具(即 Python、Scala、Spark、SageMaker、Anaconda、DataRobot、SAS、R 等)。)通过笔记本电脑、分布式计算处理、托管部署模型和存储推理管道结果进行探索性数据分析。在混合本地云环境中,系统集成、数据移动成本和数据陈旧性甚至会变得更具挑战性(尤其是在可供您选择的技术有限的情况下)。

不幸的是,另一方面,数据湖有时会与数据质量、事务支持、数据治理和查询性能问题发生冲突。没有关键技能、关键能力和专业技术的数据湖随着时间的推移将不可避免地变成“数据沼泽”。这种情况很难逆转,尤其是在数据量和速度持续增长的情况下。避免这种困境对于实现数据驱动的价值和为用户提供客户满意度是绝对重要的,这些用户依赖可靠的快速数据检索来为其利益相关者执行下游分析工作职责。

从战略上来说,集成和统一数据仓库和数据湖成为一种情况,在这种情况下,您需要两全其美,灵活而富有弹性地构建一个经济高效的弹性企业生态系统,无缝支持商业智能和报告、数据科学和数据工程、机器学习和人工智能,以及交付“大数据” 5 V(数量、多样性、速度、准确性、价值)。这是 Lake House 作为一个新的统一数据架构背后的想法和愿景,它将数据湖和数据仓库的最佳组件结合为一体。

Databricks 是湖屋建筑(即三角洲湖)的行业领导者和原创者。亚马逊网络服务(AWS)是另一个湖屋架构的先驱(即湖泊形成+ AWS 分析)。Lake House 架构的一些主要高级技术特性和解决方案包括:ACID 事务、upserts [update + insert] &删除、模式实施、文件压缩、批处理和流统一以及增量加载。3 种主要的开放数据湖表格式是 Delta Lake、Apache 胡迪和 Apache Iceberg。这三者都提供了与上述特性相似的技术。在这篇博客中,我将讨论 Databricks Lakehouse 和 AWS Lake House 的 基础构建模块解决方案架构

数据布里克斯湖屋

基础

Databricks Lakehouse 围绕着一项名为 Delta Lake 的技术,这是一个由 Linux 基金会管理的开源项目。Delta Lake 是通过 Apache Parquet 格式的存储层,它为数据湖提供了符合 ACID 的事务和额外的好处。Databricks 提到了 Delta Lake 可以帮助解决的 9 个常见数据湖挑战。它们是:

  • 难以追加数据
  • 工作中途失败
  • 修改现有数据很困难
  • 实时操作
  • 保留数据的历史版本成本高昂
  • 难以处理大量元数据
  • “文件太多”问题
  • 很难获得出色的性能
  • 数据质量问题

Lakehouse 体系结构和 Delta Lake 的内部设计消除了始终拥有数据仓库/数据湖双层体系结构设置的需要。对于数据湖中的 ACID 事务,在事务成功完成或完全失败之前,链接到外部表的底层数据文件不会被更新。因此,这简化了增量加载(即追加数据),避免作业在过程中失败(即 ETL 恢复),以及修改数据(即删除/更新/插入)。因此,由于 Delta Lake 为数据湖带来了 ACID 合规性和版本控制日志记录,元数据差异显著减少。

此外,组合(即 ETL 同步)批处理和流数据管道的能力为实时操作和历史回滚(时间旅行)提供了更多的一致性和合规性。因此,日期过期的频率较低,并且保留了历史表版本,因为 Delta Lake 总是为每个微批处理事务创建一个实时可用的新表版本日志。数据湖最明显的挑战之一是实现一致的高性能。一个常见的原因是少量数据分散在[数百万个]太多的文件中(即 KB 大小的文件)。实际上,对于技术最先进的专家来说,调优 ETL 作业可能也很困难。因此,Delta Lake 可以执行文件压缩命令来优化数据布局和分区,以获得更快的查询结果和数据质量检查。

积木

由 Delta Lake 提供支持的 Databricks Lakehouse 包含一些关键的内部设计,旨在确保数据的可靠性和一致性。它们是:

  • 增量表
  • 增量文件
  • 增量事务日志
  • 德尔塔发动机
  • Delta 存储层

增量表在 metastore(即 Apache Hive、AWS Glue)中注册,并包含数据的底层文件位置路径、表属性和模式定义。根据业务逻辑,增量文件作为普通数据文件(即 Apache Parquet)或分区文件夹(即年-月-日)存储在云对象存储(即 AWS、MS Azure、GCP)或文件系统(即 HDFS)中。delta 事务日志是一个非常重要的文件夹,名为 _delta_log。它本质上是理解 Delta Lake 的核心和关键,因为它[按顺序]跟踪执行的每一笔交易。它是事实的单一来源和增量表更改的集中存储库。例如,增量表上的每个原子提交都会创建一个新的 JSON 文件和 CRC 文件,其中包含各种表元数据和统计信息。这种机制通过原子性提供 ACID 事务,其中操作(即插入、更新)将不会在数据湖中执行,除非它们在增量事务日志中被记录和完全执行。从视觉上看,这是 Delta Lake 目录结构的高级文件系统分解图。

作者图片

Delta lake 与 Delta 引擎和 delta 存储层捆绑在一起,它们是通过 Apache Spark 和云对象存储集成的内部组件。该引擎提供动态文件管理修剪、增量缓存和许多性能优化优势。存储层跟踪元数据、模式更改、表版本控制和许多 ACID 合规性操作。

解决方案架构

Databricks Lakehouse 遵循一种设计模式架构,通过 3 个表格层 medallion 命名法提供多层数据质量和监管。它们是:

  • 青铜
  • 金色的

这些层在构建的 delta 架构管道中各有一个重要用途,以确保数据对多个下游用例高度可用。Bronze 存储原始运营数据(即 OLTP),通常很少涉及数据处理,并充当记录系统。该层通常从上游流管道(即 Apache Kafka、Amazon Kinesis)或现有对象存储登陆区(即 Amazon S3)获取数据,并通过自动加载器+ Spark 结构化流将原始数据格式(即 JSON、CSV、XML)转换为 Delta 格式,模式演变或强制取决于获取的数据结构和下游要求。

Silver 存储干净的原子数据(即 OLAP),通常涉及一些数据处理,并作为强调模式实施的单一数据源。这一层可能涉及连接青铜数据集、数据转换(清理和过滤),以及按照某些业务逻辑重新划分数据,并执行文件压缩技术来提高查询性能。Gold 存储聚合的部门数据“市场”(即 OLAP),通常涉及大量数据处理,并作为商业智能和数据科学查询的表示层。这一层提供了分区数据,可供个人用户通过 BI 工具、SQL、Python、Apache Spark 等执行特定查询和使用 OLAP 立方体。

有时,银层可以是机器学习和特征工程的主要来源,以构建特征存储、管理的数据仓库或推理管道。这很可能取决于所涉及的组织和用例。青铜、银和金层不是必需的。它们只是在整个治疗过程中获得可靠和一致数据的最佳实践和入门工具包。还要知道,对于通过 medallion 架构构建 Lakehouse 架构来说,拥有关于数据在云存储中如何存放(即分区、文件格式、路径结构)的可靠数据分类和本体将是非常重要和关键的。从视觉上看,这是 Databricks Lakehouse 增强 delta 架构的高级数据管道构建图。

作者图片

总之,Databricks Lakehouse 正在引领和创新提供一个平台环境,可以做到这一切。它减少了在企业中跨孤立系统移动和连接数据的现实挑战(例如,类比→在一个太阳系的不同星球之间旅行和通信)。持续起步并为 BI、AI/ML、大数据分析等提供价值。,我坚信 Lakehouse 架构将继续发展,教育和支持组织利用数据做出更好的业务决策。因此,确保诸如“数据沼泽”、肮脏的不道德数据差异、糟糕的 I/O 性能、缓慢的数据移动、工具集成问题和团队孤岛等挑战不会继续阻碍您解决客户问题和交付数据驱动的解决方案!

作为参考,这里是莱克豪斯和德尔塔湖的官方白皮书,以便向专家了解更多信息。

亚马逊网络服务湖边小屋

基本面

AWS Lake House 专注于串联使用许多 AWS 分析服务。具体来说,集成这些专门的服务来构建数据湖、数据仓库和系统间数据移动之间的无缝交互。AWS 坚信在正确的工作中使用正确的工具,这也是我个人所提倡的。您经常会看到项目失败或实施创可贴解决方案,因为没有或没有选择正确的工具。毕竟,当链锯是专门为手头的特定任务设计的最佳和推荐工具时,用刀子(甚至斧头)砍树既麻烦又可笑。如果走捷径,选择过时的技术,随着时间的推移,您的数据湖将崩溃,遭受性能损失,成为“数据沼泽”。因此,AWS Lake House 强调确保 AWS 服务之间的数据移动通过设计变得更容易是多么重要。因此,AWS 将 3 种数据移动场景描述为:

  • 从里到外
  • 由外向内
  • 环绕周界的

例如,inside-out 是指从内部数据湖中收集数据,并将其复制到另一个系统中(即在 Amazon Elasticsearch 中聚合日志)。类似地,由外向内指的是将数据从外部数据仓库转移到内部数据湖或文件系统的相反方向(即在亚马逊 S3 &亚马逊 SageMaker 中执行特性工程)。有时,外部数据存储会在周边复制数据,以扩展更好的性能(例如,Amazon RDS 到 Amazon Redshift 集群迁移)和/或改善用户体验。所有这 3 种数据移动场景都有许多客户使用案例。

AWS 将数据增长和数据移动困难称为“数据重力”,这基本上与“大数据”阶段相关,在该阶段,数据存在和不断增加的数据量出现在许多 IT 系统中。导致需要一种能够满足客户需求、基础设施管理成本、数据局部性性能和数据&系统集成的数据架构。AWS 记录了由 5 个支柱组成的架构良好的框架,如下所示:

  • 卓越运营
  • 安全性
  • 可靠性
  • 性能效率
  • 成本优化

这些支柱是实现数据架构的基础,可提供持续的可扩展性能、灵活的服务工具选择、数据和系统集成、安全的数据保护和基础架构弹性。湖边小屋建筑从采用这些基本的最佳实践开始。

积木

AWS Lake House 有 5 个数据架构元素。它们是:

  • 可扩展的数据湖
  • 专门构建的数据服务
  • 无缝数据移动
  • 统一治理
  • 高性能且经济高效

每个元素都通过专门的 AWS 服务服务于一个目的,以提供一个有弹性、可伸缩、有弹性、安全和灵活的架构。AWS 湖形成是通过亚马逊 S3 构建安全和可扩展的数据湖的主要因素。一些新的 Lake Formation 特性包括 ACID 事务和受管表,通过文件压缩方法来提高查询性能。这些是非常相似的特征,就像这篇博文的数据块部分讨论的三角洲湖。

对于特定的数据需求,AWS 为您提供了许多数据服务:用于交互式 SQL 查询的 Amazon Athena,用于 Spark 数据处理的 Amazon EMR,用于搜索分析的 Amazon Elasticsearch,用于实时流的 Amazon Kinesis,以及用于数据仓库的 Amazon Redshift。这些服务对于构建高级分析工作流和拥有连接到湖边小屋生态系统的各种工具至关重要。

使用和集成这些服务将导致源系统和目标系统之间由内向外、由外向内和环绕外围的数据移动。AWS Glue 是一种无服务器的数据集成服务,专门从事 ETL、表目录、模式推理、作业调度,以及最近通过 SQL 将表虚拟化为跨数据库和数据存储的物化视图。这些无服务器视图称为弹性视图,提供自动化数据复制、连续监控和最新数据刷新,使数据移动和基础架构更易于管理和虚拟化。

Lake Formation 还为共享数据和控制访问提供了行级安全特性,从而消除了跨数据存储复制数据的需要。这有助于节省存储成本和额外的基础架构管道层,同时维护数据治理。最后但同样重要的是,AWS 努力通过 Amazon EC2 compute 提供顶级性能和成本节约,并提供多种购买选项(即按需购买、预约购买、现货购买、节约购买)来满足您的所有使用案例需求。此外,Amazon EMR 和 Amazon Redshift 也将继续发布更多优化的实例类型。总的来说,这 5 个关键要素引领着 AWS Lake House 架构的实施。

方案架构

AWS Lake House 遵循一个生态系统架构,通过 5 个层使用位于集中式数据湖外围的专业 AWS 服务来解决数据重力问题。这些柔性层是:

  • 摄入层
  • 存储层
  • 目录层
  • 处理层
  • 消费层

摄取层通过批处理和流式方法执行数据迁移。主要的 AWS 产品包括用于 RDBMS 迁移的数据迁移服务和用于缓冲向亚马逊 S3 或亚马逊红移传输数据的亚马逊 Kinesis(即数据消防软管、数据流)。存储层包括作为数据湖的亚马逊 S3 和作为数据仓库的亚马逊红移。亚马逊 S3 对象存储提供了廉价的存储,并能够以开放的文件格式(即 Apache Parquet、Apache ORC、Apache Avro、CSV、JSON 等)存储不同类型的模式。)作为读取时模式。Amazon Redshift 提供了将数据存储在表中的结构化维度模式或非规范化模式,即写模式。

目录层涉及元数据管理和注册。Lake Formation 和 AWS Glue 作为中央目录服务来跟踪所有湖泊房屋数据集的元数据。功能包括表版本控制、模式和分区定义、数据位置、表权限以及保护业务和数据所有者信息。处理层将 ETL 作业构建到有组织的桶或前缀中,如着陆区、原始区、受信任区和管理区。这与 Databricks Lakehouse 的青铜、白银和黄金命名相同。大量的数据处理服务可用于执行这些任务。根据使用案例的不同,AWS 产品包括亚马逊 EMR(即 Apache Spark)、Kinesis Data Analytics(即 Apache Flink)、AWS Glue、AWS Lambda、亚马逊 SageMaker Processing、亚马逊红移 SQL(即红移光谱)以及针对较小数据集的单机亚马逊 EC2 实例。

消费层为特别 SQL 查询、商业智能和机器学习等分析用例提供了许多 Lake House 接口。对于 SQL,AWS 提供了亚马逊 Athena 和红移谱。对于商业智能,您可以通过 Amazon QuickSight 创建可视化和仪表板。对于端到端的机器学习,AWS 利用亚马逊 SageMaker 来构建、训练和部署模型和推理管道。

从视觉上看,这是一个 AWS Lake House 架构的高级分层生态系统构建图。请注意,一些 AWS 分析服务不包括在内。

作者图片

这 5 层中的每一层都发挥着各自的作用,在湖边小屋中实现无缝的数据流动。关键是技术上的灵活性,通过以可承受的价格(按使用量付费)为正确的工作使用正确的服务,可以进行相应的迭代扩展和调整。

作为参考,这里是 AWS 分析和 Lake House 最佳实践设计的官方 AWS 博客,以了解更多深入的细节。

https://aws.amazon.com/blogs/big-data/harness-the-power-of-your-data-with-aws-analytics/ https://aws.amazon.com/blogs/big-data/build-a-lake-house-architecture-on-aws/

结论

总的来说,这两种架构提供了非常相似的解决方案。从文化的角度来看,Databricks Lakehouse 和 AWS Lake House 正在革新管理、存储、处理和消费数据的更好方法。从技术角度来看,Databricks Lakehouse 使用了 Delta Lake、Apache Parquet 和 Apache SparkAWS Lake House 利用了大量 AWS 服务,利用了本博客中提到的大量开源 Apache 项目。一些主要的技术焦点包括:

  1. 计算和存储的分离—弹性计算、可扩展基础架构、廉价存储和高度可用的可重用数据
  2. 可靠性和一致性—提高了数据质量,减少了损坏和重复数据,优化和压缩了文件大小,减少了模式/元数据不匹配,并保证了完整的事务和回滚选项
  3. 实时流支持—随着新数据的到来,持续/即时增量更新和更改,同时保持出色的查询性能,跨业务线连接批处理和流数据,消除复杂的工作流(即 Lambda 体系结构→流作业的并行数据管道,可持续追加+批处理作业,可按照一定的节奏[每日]重新分区、更新和覆盖文件)

令人兴奋的是,这些数据解决方案可以在将承诺的工作文化与尖端的技术专业知识和能力相结合时得到解决和交付。我坚信 Lakehouse/Lake House 可以帮助组织和员工体验一种更加数据驱动的文化,提升技能/教育和促进人才成长,节省云[或减少内部供应商锁定]成本,简化现有和新的架构设计,并通过将数据固化为单一真实来源,更好地统一在组织孤岛中工作的团队进行类似的分析工作。天空才是极限!

感谢你阅读这篇博文。我对这种创新技术的出现非常着迷,并期待继续在技术实现、教育演示和咨询活动中贡献这些技术。快乐学习,解决问题,交付解决方案!

人工智能的未来是分散的

原文:https://towardsdatascience.com/the-future-of-ai-is-decentralized-848d4931a29a?source=collection_archive---------6-----------------------

据报道,训练 GPT-3 单次训练就花费了 1200 万美元。那真的是训练一个模型最有效的方法吗?

刘宇英Unsplash 上的照片

人工智能是一种商品。事实上,提取这种商品可以为谷歌、百度和脸书等公司带来数十亿美元的收入。因此,在过去 10 年中,它将计算成本提高了 300 倍,并将该领域的研究人员数量增加了 10 倍。

如今,每年都有关于 AI 化合物的研究。研究人员通过建立在以前的基础上,进行渐进式的改变,以创建更强大和更通用的模型。然而,这些模型产生的智能总是会丢失,因为用户必须在自己的系统上重新训练这些模型来复制它们。

此外,通过在同一设备上工作的模型组合找到的任何值(例如:文本数据、图像数据等。)也丢了。这是因为模型本质上是孤立于它们的环境的。他们不能彼此分享他们的知识,因此如果任何一个模型学到了对其他模型可能有价值的东西,它也不能与他们分享以加速他们的训练。

最后,今天的人工智能研究领域本质上是非合作性的。“获取数据集、创建模型、击败当前最先进水平、冲洗、重复”的研究方法使得新的研究人员和计算资源低的研究人员进入市场有很大的障碍。大多数研究人员无法为大型神经网络的开发做出贡献,因为进行必要的实验对他们来说太昂贵了。如果这种趋势继续下去,最终唯一能够进行人工智能研究的实验室将是那些拥有巨额预算的实验室。

人工智能(AI)的未来将由我们在协作中投入的权重决定。⁴ — 约翰·苏特(CTO)在 科达公司

美国宇航局在 Unsplash 拍摄的照片

人类总是合作创造世界科技奇迹。阿波罗 11 号登陆月球是因为超过 300,000 人参与了阿波罗计划,从测量员到工程师,再到宇航员自己。为什么 AI 不能也是一种协作的方式?

也许这个问题需要重新措辞:如何我们可以把人工智能变成一种协作的方法?

答案很简单,就是权力下放。类似于人类大脑是数十亿相互连接的神经元如何相互发送信号,或者互联网是数十亿相互连接的计算机如何相互共享信息,那么人工智能应该以同样的方式构建。

输入位张量

分散式人工智能是一种范式,其中人工智能模型相互协作以实现其目标或解决一系列复杂的挑战。今天,由于其免费人工智能和模型之间知识共享的影响,分散式人工智能正慢慢成为协作智能的圣杯。最新的项目之一是比特张量项目。

Bittensor 是一个对等市场,奖励机器智能的生产。它利用最先进的技术,如专家混合知识提炼,以创建一个对等网络,激励知识生产,生产者可以出售他们的工作,消费者可以购买这些知识,以使他们自己的模型更好。这为协作智能打开了大门,在协作智能中,研究人员受到激励,相互帮助产生更强大的模型。最终,这种“认知经济”有可能为人工智能的整体进步开辟一个新的前沿。

比特张量背后的核心思想是知识的个体贡献的集合。通过建立人工智能模型并在 Bittensor 网络上训练它来贡献知识的计算机将获得 bittensor 的货币 Tao 。其他希望简单地使用或消耗知识的人也可以使用道来获得它,并在这一知识上训练他们的模型。

位张量结构

Bittensor 的设计非常接近人脑的设计。每台运行 Bittensor 的计算机都被称为一个神经元。每个神经元包含一个模型、一个数据集和一个损失函数。这些神经元根据它们的输入数据和与它们通信的其他神经元来优化它们的损失函数。

两个位张量神经元之间的通信

为了保持人类大脑的并行性,每个位张量神经元都有一个轴突末端来接收来自其他神经元的输入,以及一个树突末端来发送输入给其他神经元。

简而言之,位张量神经元通过向其相邻神经元发送其数据集的一批输入来进行训练,并通过其自己的模型运行同一批输入。接收这一批的神经元将通过它们自己的本地模型运行输入,并发回输出。然后,我们的神经元将聚集这些输出,并根据远程神经元的损失和我们的局部损失来更新其梯度。

运行 Bittensor 就像几个命令行参数和一个数据集一样简单

Bittensor 中的每个神经元都在不断地从其他模型中挖掘知识。运行 Bittensor 模型相当简单,可以在一个 yaml 文件上或通过命令行进行配置。

最后的想法

人工智能的未来应该是去中心化的,句号。我们需要将人工智能创造的知识视为终极商品,相当于人类大脑中的认知过程。合作增加这种知识的广度和深度不仅是我们作为科学家的使命,也是我们作为人类的使命。

位张量网络。节点越暗,它贡献的知识越多。

Bittensor 网络于 2021 年 1 月启动,目前已经运行。您可以简单地安装并立即运行它,使用库中已经构建的模型之一,或者创建您自己的模型

Bittensor 库可以在这里找到,你也可以通读项目的文档白皮书。如果你想联系开发者、合作或为项目做贡献,开发者也活跃在 Bittensor Discord server 上。

加入我们,人工智能的前沿也属于你。

参考资料:

[1]凯尔·威格斯“OpenAI 庞大的 GPT-3 模型令人印象深刻,但大小并不代表一切”(2020)。https://venturebeat . com/2020/06/01/ai-machine-learning-open ai-GPT-3-size-not-everything/

[2]斯坦福大学哈尔。《艾指数报告》(2019)【https://hai.stanford.edu/research/ai-index-2019

[3]艾伦人工智能研究所。《绿色 AI》(2019)。”【https://arxiv.org/pdf/1907.10597.pdf】T4

[4]大数据内幕。《各就各位:去中心化人工智能的潜力》(2020)。https://inside bigdata . com/2020/12/31/everything-in-the-right-place-the-potential-of-decentralized-ai/

[5]位张量。“互联网规模的神经网络”。(2021)https://www.bittensor.com/

分析的未来可能是“低代码/无代码”

原文:https://towardsdatascience.com/the-future-of-analytics-may-be-low-no-code-at-first-6c2b140e39f3?source=collection_archive---------35-----------------------

…起初

图片来自免费图片来自 Pixabay

如今,你不可能通过大量的数据滚动而不听说所谓的“低代码和无代码”数据工具的崛起。“它把数据带给人们。”典型的帖子是这样的。“您不再需要学习如何编写代码来执行复杂的在此插入分析项目。”

我完全看到了低代码和无代码数据解决方案的吸引力:在经历了多少轮乏味的[import pandas as pd](https://www.dataindependent.com/pandas/import-pandas-as-pd/)[object of type 'closure' is not subsettable](https://coolbutuseless.github.io/2019/02/12/object-of-type-closure-is-not-subsettable/#:~:text=A%20common%20error%20in%20R,or%20vector%20or%20something%20e.g.)错误之后,你能不这样做吗?也就是说,我并不认为这种趋势像人们常说的那样具有革命性或持久性。原因如下。

这是采用周期的预期部分

举一个低代码和无代码数据产品的例子,直接从 Excel 构建 Azure 机器学习模型的能力。这是疯狂的事情,毫无疑问,这是前所未有的民主化机器学习。但是没有问的是,在这个创新之前,接下来会发生什么。

创新通常是一波一波地到来,一个趋势建立在下一个趋势之上,并最终取代下一个趋势。分析软件也不例外。每一波都是建立在代码之上,由低代码和无代码的图形用户界面(GUI)推出,然后又被代码取代。

作者制作的图像

这是一个大大简化的采用浪潮:公正地对待它需要一篇论文(我在博士阶段研究过创新,所以我不是在开玩笑)。结果是低代码和无代码在分析工具中来来去去;让我们看一些例子。

1.案例研究:SPSS

SPSS(社会科学统计程序)始于 20 世纪 60 年代末,在接下来的十年中,S 和 SAS 作为探索性数据分析和统计编程的新工具加入进来。

当时,计算机脚本通常需要首先被编译成机器可读的文件,然后运行;这使得实时操作、可视化和分析数据变得非常困难。这些工具是新颖的,因为它们允许立即执行和打印脚本的各个部分,这极大地支持了迭代。分析师现在可以专注于数据分析,而不是编译代码。

在某个时候(我无法找到确切的发布时间,所以如果有人知道,请联系我!)SPSS 更进一步,增加了菜单驱动的选项来编写程序。所有的菜单选项都生成了可以保存的语法,但是这个想法是分析师可以进一步减少对代码的关注,更多地关注数据,从而使分析民主化。精通技术的统计学家不再垄断数据处理。

SPSS 可以证明,低代码和无代码会变得混乱。(来源:格雷戈·艾尔弗斯,代顿大学)

这种“无代码和低代码”实现的一个成果就是上面的菜单截图。处理数据没有放之四海而皆准的答案,所以试图在一个菜单中容纳所有需求会导致臃肿的界面。我在研究生院使用 SPSS,虽然能够通过点击来进行数据分析很棒,因此可以专注于工作的概念部分,但我很快发现编写代码比浏览菜单更容易。所以,SPSS 语法生成是一件幸事…但它不是全部。

SPSS 的菜单只是 GUI 驱动的计算革命的一个产物。作为点击式选项,GUI 向数据用户提供相对低代码或无代码的特性。这场革命的另一个成果是电子表格,在许多人看来,它是个人电脑的第一个“杀手级应用程序”。商业用户现在已经拥有了触手可及的计算能力,而不一定需要编码。

2.总是需要一些组件

让我们坚持使用电子表格,因为在我称之为“个性化云计算”的时代,它们面临着与 SPSS 相同的 GUI 困境:依赖云功能存储和处理数据的计算机应用程序。

Excel 的 Power Query 是一项引人注目的创新,允许用户直接从电子表格中构建提取、转换、加载(ETL)管道。(类似的低/无代码数据准备的工具还有 Alteryx、Tableau Prep 等。).虽然基于 M 编程语言,但它包括菜单驱动的语法生成,很像 SPSS。Power Query 本质上不是云应用,而是微软更大的“Power Platform”的一部分,该平台主要作为云(以及无/低代码)解决方案进行营销。

它的菜单可以满足用户的大部分需求……但不是全部。事实上,对于 Power Query 用户来说,一个必经之路就是开始编写自己的代码:

最近在幂查询中尝试按子群添加一个索引号;这在超级查询菜单和 M 自定义编码之间花费了相当多的时间。最后,我问自己,这真的比严格编码简单吗?毕竟,Power Query 不像 R 或 Python 那样,提供一个带有包管理的专用集成开发环境。这是一个奇怪的 GUI 和代码的大杂烩,有点像 SPSS。

处理数据在很多方面都是混乱的,我们任何人都数不清。正是这种模糊性使得构建一套严格的菜单选项变得如此困难。我还没有见过一个 GUI 可以在简单的用户体验中轻松容纳我想用数据做的一切事情。能做到吗?可能考虑到未来的技术。但是对我来说,学习编码比任何图形用户界面都有更多的可能性。那么,为什么要等待一些理想化的 UX 呢?

结论:代码和图形用户界面,应和杨

至少值得指出的是,许多人声称 R 和 Python 的兴起部分是因为它们是纯编程的应用程序。通过提供优秀的开发环境和大型开源代码库,用这两种语言做几乎任何事情都成为可能…如果你愿意学习编码的话。几乎没有争议的是,如果,也许不是作为用户交互的层,代码应该是如何进行分析的主要工件。

那么,为什么要转向低代码和无代码的分析解决方案呢?就像我前面说的,一次又一次地编写相同的调用并收到相同的小错误会令人沮丧。因此,我认为这些可能会被视为实现更大数据民主的障碍。图形用户界面在分析创新的浪潮中有自己的时间和位置,通常是当一些应用程序达到一定的成熟度时。代码也是构建应用程序的一部分,因此它们可以达到那个成熟度。

我不知道下一波会是什么,但我肯定当前这波低代码和无代码解决方案不会持续下去。可能需要更少的编码人员来对采用的低代码/无代码部分进行创新,并且产品可以真正做到用户要求的一切。

在此之前,我建议数据专业人员学习一点编码知识。可能不是每个数据方案都需要;那很好。但是考虑到我们在数据世界中的发展,我不倾向于说未来都是低级的和没有代码的。**

原载于 2021 年 1 月 16 日【https://georgejmount.com】

数据集成的未来

原文:https://towardsdatascience.com/the-future-of-data-integration-7694ebacfe92?source=collection_archive---------19-----------------------

云计算、Python 堆栈、数据仓库和 SaaS 平台的发展将如何改变数据集成的面貌。

云计算、大数据、机器学习、数据湖、数据仓库——毫无疑问,如果你一直关注科技世界,你一定听过这些时髦词汇。这些趋势和由此产生的技术已经改变了世界,并继续挖掘新的创新机会。

如果你看看 15 年前 Talend(现在是该领域的巨头)推出 Talend Open Studio 时数据集成的面貌,脑海中出现的词汇是“拖放”界面、基于 SQL、内部部署和 Windows 原生。从那以后,事情发生了巨大的变化。

“我们已经观察到行业向云技术的过渡,以及内部大数据应用采用的减少……我们未来的成功取决于此类市场的增长和扩张,以及我们适应和有效应对[it]的能力。”— 塔伦德,2020 年

来源: unDraw

新时代

破坏 Talend 和 Informatica 等公司遗留集成解决方案的工具非常不同。首先,它们是基于云的而不是本地的,是 web 应用而不是桌面软件,受益于强大的转换工具,如 dbt ,并利用数据仓库和数据湖的容量,如 Snowflake 来整合比以往更多的数据。

这些新工具如此吸引人的原因很大程度上是因为数据变得越来越分散。帮助企业管理线索、销售、发票、账单、广告、投资、用户分析等的新 SaaS 平台正在快速发展。现代业务分析师的任务是有效整合这些数据,并得出影响业务决策的有用见解,而这些工具正是如此。

简要概述

为了让您了解一些背景知识,我们来讨论一下数据集成领域的一些现代参与者。

来源: unDraw

StitchData

StitchData 创建了一个平台,专注于将数据从这些 SaaS 平台转移到数据仓库。该公司最终在 2018 年被 Talend 收购,这是 Talend 渗透新的基于云的市场的更大努力的一部分。

Stitch 的天才吸引了分析师和开发者。他们开始了一项名为歌手的开源计划,该计划引入了在 Python 中构建 taps (不同平台的连接器,如 CRMs、ERP 等)和 targets 的标准规范。近年来,Python 堆栈因其与机器学习和数据清理(例如,Pandas、PySpark、Dask 和 more 等包)一起使用而闻名,因此为获取数据而设计的 tap 使用相同的堆栈并吸引相同的开发人员是有道理的。

这个想法是,每个人都可以从所有这些平台的良好维护中受益。毕竟,当 API 和模式发生变化时,哪个组织愿意投入人力来维护数百个这样的 tap 呢?

对于他们的企业产品,Stitch 提供了一个很好的 web 界面和 API,使业务分析师和开发人员能够通过 Stitch 的基础设施利用这些 tap。

Fivetran 和 Xplenty

FivetranXplenty 这样的工具采取了一种稍微不同的方法,并专注于业务分析师市场。这两个平台都拥有数百个由他们的团队维护的预构建的专有连接器、一个健壮的转换层和高度可伸缩的基础设施,以便将数据从这些连接器同步到您的数据仓库。

这些平台吸引了需要整合数据和获得洞察力的技术业务分析师。Fivetran 强调预先规范化的数据,并通过 dbt 提供基于 SQL 的仓库内转换。虽然 Xplenty 提供了一个基于 UI 的转换系统,让人想起了 Talend Data Studio,但是具有云计算可能带来的可伸缩性。

梅尔塔诺

不幸的是,在 Talend 收购 Stitch 之后,Singer 项目失去了方向,许多 tap 不再维护。幸运的是, GitLab 资助了Meltano开源项目,该项目旨在继续辛格的工作。该项目旨在为分析师提供他们自己托管、创建和运行数据集成管道所必需的工具。他们同意 Singer 的最初使命,并且正在开发 SDK以使创作高质量的歌手抽头更容易。

与 Stitch 不同,他们希望完全实现分散的开源维护 taps 的想法,每个组织都可以利用它并为之做出贡献。他们的目标是在 Meltano 员工之外找到开源维护者,这些人使用他们的 Singer taps,并有动机维护它们。他们已经有了几家咨询公司和开发商,他们已经开始让这些水龙头为整个社区服务。

空气字节

Airbyte 正在构建另一个快速增长的开源平台,以解决数据集成中的问题。与 Meltano 非常相似,他们的目标是将数据集成商品化,并为 Fivetran 等工具提供一个自托管的替代方案。该公司专注于扩展他们的开源平台和社区,并致力于成为市场的新标准。

一个不同的视角:SaaS 平台怎么样?

有趣的是,这些业务分析师在试图整合来自所有 CRM、ERP 和计费平台的业务数据时面临的问题,也是这些 SaaS 平台背后的开发人员所面临的问题。

来源: unDraw

事实上,这些 SaaS 平台已经开始通过它们支持的集成将自己的产品与竞争对手区分开来。例如,支持直接从 Quickbooks 导入发票的会计报告平台比需要手动将发票上传为 CSV 文件的平台更有可能赢得客户。

坚持住!我们刚刚讨论了所有这些不同的工具,这些工具帮助分析师利用所有这些新奇的新技术趋势为他们的数据创建管道。这些难道不能帮助这些开发者吗?

在某种程度上,是的。事实上,像 Stitch 和 Airbyte 这样的产品背后的 API 是作为解决方案提供给这些开发者的。问题是开发人员通常比分析人员需要更多的对集成的控制,所以他们通常会自己构建和维护这些集成管道。

对我们来说,这似乎是对已经在帮助业务分析师的所有新基础设施和工具的浪费。为什么不利用同样的软件来帮助这些开发人员呢?这就是我们开始 hotglue 的原因——这是一个轻量级工具,专注于帮助开发人员为他们的 SaaS 平台构建集成,利用这些新趋势。

结论

数据集成空间是巨大的。整合您的业务数据有许多不同的原因,还有更多工具可以帮助您做到这一点。不过有一点是明确的——最好的工具正在利用最新的数据工程趋势,并吸引越来越多的技术受众。

数据集成的未来似乎是一个有更多利基参与者的市场,并重新依赖开源社区来扩展所有新的 SaaS 平台和用例。

感谢阅读!欢迎在下面留下评论或问题。

数据科学的未来是很好的判断

原文:https://towardsdatascience.com/the-future-of-data-science-is-good-judgment-3cc3e0e12264?source=collection_archive---------33-----------------------

数据科学最重要的部分将是理解在哪里应用人工智能。

来源于 Pixabay

介绍

未来十年,数据科学领域最需要的技能是什么?提示:它不是 Tensorflow,不是 GPT-3,也不是下一个花哨的深度学习算法。你需要的最重要的技能实际上是运用良好的数据科学判断。

几乎没有人用手做机器学习

还记得机器学习真的很难的时候吗?在你真正能够编写 train _ test _ split XGBoostClassifier 并在五行中构建一个模型之前?我个人不这么认为。但这是 sci-kit learn、tensorflow 和所有其他我们在 21 世纪 20 年代依赖的机器学习库的创造者的现实。因为这些库的创建者没有库来工作。他们必须从头开始设计所有的分类器

从零开始应用机器学习真的很难。这就像 Python 和 c 编程的区别,没有人真的想管理内存和跟踪指针,就像我不想在运行随机森林模型时手工构建树一样。

来源于面试查询(有权限)

但随着数据科学在过去二十年中的发展,我们逐渐打破了人工智能和机器学习中越来越多的技术壁垒。我们让数据科学家更容易进入这个领域,而不是完全的编程和学术专家。现在,任何人都可以重用由有经验的(通常是无偿的)专业人员开发的包来渲染他们的 K 近邻模型,几乎不用尝试。

与机器学习中的其他任何东西相比,Auto-ML 的出现将数据科学的前沿推得更远。根据维基百科:

“自动机器学习(AutoML)是将机器学习应用于现实世界问题的过程自动化的过程。AutoML 涵盖了从原始数据集到可部署的机器学习模型的完整管道。”

这个行话实际上是什么意思?这意味着未来将依赖于你能够建立机器学习模型,甚至不需要编码。您将能够查看界面(少数报告风格),拖放您关心的数据集,选择您试图预测的目标变量,按下 run,并在几秒钟内获得部署的预训练模型。

面向未来的数据科学

因此,随着数据科学的发展,你不得不思考:它会在哪里停止?我们都将被自动淘汰出数据科学领域的工作吗?

好吧,让我们看看时间线。随着时间的推移,机器学习的发展正在加速。我们知道,随着模型创建、部署和实施变得更加容易,从想法到生产的瓶颈将会大大减少。这就是为什么数据科学最重要的部分将是理解在哪里应用人工智能。这意味着根据具体情况理解利用人工智能和机器学习的权衡、成本和好处。

未来的问题本质上不会是技术性的。相反,未来的问题将依赖于高效、准确地将数据科学判断应用于大量场景。当你有能力在几秒钟内生产和建造模型时,最重要的技能将是了解在哪里以及如何应用它们

例如,假设你在一家为公司提供人力资源福利的初创公司工作。这个领域包括会计,401K,工资,税收等。创业可能会有很多不同的方向。作为一名数据科学家,你希望能够准确地指出这家初创公司可以在哪里应用 AI,以获得产品增长的最大价值。

假设你的同事想要建立一个模型来预测有多少用户会注册 401K。你看不到这对业务有什么影响。

但是,假设你看到一群数据输入人员被雇用来填写税务表格,这是一个漫长而艰巨的过程。你需要了解足够多的机器学习和数据科学,以了解如果你可以更有效地自动化他们的流程,他们可以花十分钟而不是一个小时来填写税务表格。

这就是你的数据科学判断发挥作用的地方。也许通过应用一个快速的 AutoML 模型来解决这个问题,你估计你可以减少他们一半的工作时间。但也许当你应用一个更详细的深度学习模型时,它会将这个时间减少到几秒钟。

公司每天都要处理这类问题。数据科学领导者和机器学习专家必须权衡将人工智能应用于不同类型的项目。大多数数据科学领导者的唯一工作是两个部分:确定在哪里应用人工智能,然后为其他人制定一个高级实施架构 来实施

因此,即使在未来十年,假设人工智能变得极其复杂,以至于我们只需打个响指,一个程序就会突然为我们建立一个模型。我们仍然需要使用我们的判断来理解我们把模型放在哪里。因此,随着数据科学的进步,要学习的最重要的技能将是了解在哪里应用数据科学来实现最显著的改进。

做一个能把人工智能引向正确方向以获得最大产出的人,你将永远不会被外包或取代。

结论

人类的判断不会停止在商业决策中发挥作用,直到超越的那一天,那时 AI 将对 AI 进行判断和改进。到那时,你就不用担心失业了,因为每个人都会失业。

因此,在那一天到来之前,请提高您的数据科学判断能力,并了解通过将数据科学基础知识应用于日常生活中遇到的问题,您可以在哪些方面获得最大收益。

如果您有兴趣提高您的数据科学判断力,请立即加入 面试查询 练习产品和分析问题!

人工智能决策的未来

原文:https://towardsdatascience.com/the-future-of-decision-making-in-ai-17576cdb6e66?source=collection_archive---------27-----------------------

如何不陷入天网,建筑师,奥创或 HAL9000 的情况

刘玉英和许在 Unsplash 上的照片

一般来说,我不是人工智能(AI)这个术语的粉丝。它太宽泛了,非技术头脑的人(吃了蓝色药丸的人)把人工智能想象成一个独立决策的单一实体。此外,因为人工智能是一个流行的术语,我见过一些公司宣传自己使用人工智能的例子,而他们实际上“只是”使用线性回归。在过去的 80 年里,由于所有的末日科幻故事和电影,这个词在流行文化中受到了不好的指责。无数次我们看到科幻小说变成了科学派别,随着 OpenAI 的文本生成器 GPT-3 等技术的出现,看起来我们确实走上了正轨。那么,这里也会发生这种情况吗?

没有。

至少现在不是。自动驾驶汽车的自主能力由七个不同的自动化水平(或智能)来表征。人工智能被分为三大类:狭义、通用和超级人工智能。目前,公众可以获得的最高自动驾驶汽车级别是第 3 级(最大级别 5),在特定情况下,驾驶员可以脱离驾驶行为。关于人工智能,我们只是在狭窄的人工智能类别中打转——尽管它有时看起来像更高级别的人工智能。

照片由达米亚诺·林戈里Unsplash 上拍摄

人工智能中的决策是通过三种媒介完成的:数据、建模和/或决策者。圣杯是将这三者都纳入决策过程,但有时你缺乏数据,而其他时候过程是如此复杂(或快速),决策者最好被排除在外(例如,为什么电话运营商是过去的事情)。最主要的是要明白什么时候。

这个故事将集中在如何恰当地整合决策者,因为有大量伟大的故事,论文,书籍等。,讲述如何进行适当的建模和集成数据科学技术来支持决策。

决策者是如何影响人工智能决策的?

许多问题太复杂,我们无法立即找到解决方案。同时,我们天生懒惰,所以我们想找到一个更好(更容易)的方法来获得解决方案——进入“人工智能”方法。

决策者的偏好可以分为硬偏好和软偏好。硬偏好一般是指决策或解决方案必须服从的那些意见。在建模术语中,这些有时被称为约束——例如,在保持一定生产水平的同时,将工厂成本降至最低。请注意,硬约束和硬偏好是不一样的,因为一些物理限制(可用的工作时间、可用的资金)是无法超越的,但是在建模中它们通常被视为相同的。软偏好是“愿意”一类的意见,通常具有冲突的性质,有点不祥,也是大多数关于人工智能公司的决策者、经营者、管理层甚至董事会层面的讨论背后的原因。矛盾的是,硬偏好和软偏好之间的差异也是人类实施的决定——我认为最理想的是我们不应该区分这些,所有的偏好都应该被认为是软偏好。

但是这些软偏好是如何实施的呢?这里,我们区分了偏好何时被纳入决策过程:先验的、后验的或交互的。方法的选择在很大程度上与问题的复杂性、可用的计算能力以及何时做出决定的时间要求相一致。注意,对于这些问题中的一些,获得一个决定也是指获得一个解决方案的概念。

共同的目标是确定最能代表决策者偏好的解决方案。至少,如果决策者知道他们的偏好——通常他们的偏好非常不确定、模糊,一大群决策者必须同意,或者他们根本没有能力定义他们(Que 数据和建模方法)。

格雷格·拉科齐Unsplash 上拍摄的照片

后验方法

对于偏好被非常具体地定义的多目标问题,通常创建具有非支配解的图,突出帕累托前沿。此后,决策者评估帕累托前沿的哪个解决方案最能反映他们的偏好。

该方法大体上包括计算大量的解决方案或模拟决策,以便随后评估结果并将它们与决策者的偏好结构进行比较,然后最终选择一个。该过程相当广泛,因为必须为不同目标设置之间的大量组合计算解决方案。对于多目标问题,几乎任何计算的解都是非支配解(对于单个目标,它是最优解),因此该方法很快会遇到维数问题。但是对于较小的问题,它仍然是可行的,而且非常有用。

帕累托阵线的例子。作者插图。

在这些方法中,决策者拥有所谓的“偏好的后验表达”

先验方法

这种方法试图在开始寻找解决方案之前将多个目标组合成一个单一的目标。问题是,人们不知道问题对组合的影响,不确定性如何影响结果,以及最后,如何组合不同的偏好。

综合这些偏好,我们必须讨论标准是否相互独立,或者是否存在积极或消极的相互作用。例如,当决定步行到哪个公共汽车站时,两个标准“在公共汽车站的活动”(公共汽车在 x 分钟内到达的概率)和“到所述公共汽车站的步行距离”是相关的。较高的活动水平会使距离不再是一个问题。

此外,对某些标准的偏好不一定是恒定的,甚至可能不是线性的。在“到公交车站的步行距离”标准中,两个选择之间小于 10 米的差异不会影响一个人的选择——我们对这样的差异漠不关心。与此同时,超过 4 公里的差异将否决一个公交车站,迫使人们不选择该公交车站,无论其他标准有多高。

政治是一个很好的例子,说明了多个决策者如何试图走到一起,并通过先验的方法试图在不知道实际结果的情况下实施一个解决方案。由弗雷德里克·科贝尔Unsplash 上拍摄的照片

也就是说,先验方法包括评估价值函数的方法,引入“等级关系”,分析层次过程,或者甚至试图识别决策规则。在这些方法中,决策者拥有所谓的“偏好的预先表达”

也许,最广为人知的价值函数法是目标规划;这种方法包括对未达到预定目标的处罚,并寻求将处罚降至最低。从而将多目标框架转化为单目标框架。

重点是;当利用先验方法时,有许多要考虑的,但是它们是快速的并且适用于大型复杂问题。

那么,为什么我们最终不能复制《黑客帝国》、《我》、《机器人》、《奥创时代》、《终结者》或《2001:太空漫游》中的场景呢?

这项技术还不够远,人们正在进行广泛的研究,研究如何主动避免这种情况,并适当地纳入决策者,根据没有偏见的数据建模和适当地训练模型。

科幻作家艾萨克·阿齐莫夫提出了机器人和人工智能必须遵守的三条规则。即:

  • 第一定律:机器人不能伤害人类,也不能坐视人类受到伤害。
  • 第二定律:机器人必须服从人类的命令,除非这些命令与第一定律相冲突。
  • 第三定律:机器人必须保护自己的存在,只要这种保护不与第一或第二定律相冲突。

但是如果它们不完美,超级人工智能应该能够找到它们的漏洞。新增的第零定律表达了这样一个固定的漏洞。因此,我们必须促进研究和技术,以改善人工智能决策的合作和理解。

我希望你喜欢这个关于决策和人工智能的一般性故事。请注意,我没有详细描述问题的特征以及哪些方法适用于哪些问题,因此也省略了对评估问题和设计问题的必要讨论。如果你对其他研究领域感兴趣,运筹学就是一个很好的例子,我已经写了一个小故事:

深度学习的未来

原文:https://towardsdatascience.com/the-future-of-deep-learning-7e8574ad6ae3?source=collection_archive---------13-----------------------

意见

来自 IEEE 频谱的关键预测

信用:Pixabay

IEEE Spectrum 发布了可能是关于深度学习的最重要的论文,对其长期可行性提出了批评——结论对深度学习教会来说是严峻的。

作者尼尔·C·汤普森是麻省理工学院的人工智能研究员,所以可以肯定地说,这些不是一个不合格记者的想法;相反,这是对深度学习走向的公平评估,而不是受到公司股价的支撑。

早期,汤普森描述了对 100%准确性的追求。假设一个任意的模型在一些分类任务上执行 90%的准确率。从计算角度来说,精度每增加一次,向 100%迈进,都要比前一次昂贵得多。摩尔定律表明,随着时间的推移,处理能力呈指数级增长。但是,尽管未来有更高效的芯片,我们对深度学习模型的渴望将远远超过硬件的发展。这可能看起来很抽象,但当考虑到货币和环境成本时,趋势变得很明显:深度学习永远不会是财政或环境友好的。无论硬件的发展如何,我们对深度学习的期望都将超过硬件所能提供的一切——而成本只会增加。

为了将这种现象置于背景中,考虑一下训练 Alpha Go(基于 RL 的机器人,培养了世界上最好的围棋选手)的成本。)Deepmind 支付的价码:3500 万美元。与此相关,在图像分类上达到 1%的错误率对环境来说可能比 T2 一个月的碳排放量还要糟糕!深度学习已经因算法偏见而受到负面关注,因此它作为人工智能金童的地位已经岌岌可危。环境影响进入一个同样响亮的阶段,深度学习被视为完全不人道,这只是时间问题。

深度学习的成本变得如此昂贵,以至于元学习和迁移学习已经成为当前的权宜之计:一个财大气粗的组织训练一个模型,不是检测猫或狗、人或脸、建筑物或桥梁——或任何其他事物本身——而是检测一切。元学习就是这样;随后,数据科学家、软件工程师和机器学习工程师针对他们的需求,在一些下游任务中重新训练这些模型,这就是迁移学习。这种元迁移学习设计的问题是,下游任务的准确性通常被认为是不可行的,肯定达不到所宣传的最先进的阈值。解决办法?更大的元学习模型以更高的成本——在金钱和环境方面。然而,成本将超过进展,因此这种解决方案的创可贴性质。

考虑到上述事实,深度学习社区的严峻未来摆在面前:成本呈指数级上升,而性能回报却在下降。这是另一个所谓的人工智能冬天的配方。

那么,在深度学习复活之前,社区将走向何方?主要基于专家的系统,领域专家利用他们的知识来开发本体和基于规则的系统。这在计算上更有效,然而,它不允许经验学习。一个潜在的前进方向?神经符号方法——领域知识和自主学习之间的一种联系。

有趣的是,我从未热衷于深度学习模型本质上是黑箱;有数以亿计的参数,很难抓住一个给定的参数值,并使用它来增加我们人类对周围世界的了解。然而,神经符号方法可能是人类理解和自主学习之间缺失的一环。现在下结论还为时过早。我们现在唯一可以确定的是——深度学习社区正在面临清算。也许不是今天或明天,但冬天即将来临。

机器学习的未来以及为什么它看起来很像朱莉娅🤖

原文:https://towardsdatascience.com/the-future-of-machine-learning-and-why-it-looks-a-lot-like-julia-a0e26b51f6a6?source=collection_archive---------3-----------------------

作者图片

TLDR;ML 的未来是朱莉娅。如果你正在寻找一个快速的答案,你有它。如果你想要一个合理的解释,留下来。不要只相信我的话:

https://dev-discuss.pytorch.org/t/where-we-are-headed-and-why-it-looks-a-lot-like-julia-but-not-exactly-like-julia/276

(上面的帖子总结道:PyTorch 开发者想要 Julia 提供的所有功能,但他们还不想在 Julia 中重写 PyTorch,因为生态系统还不够成熟)

编辑:我和我的合著者很高兴地告诉大家,我们的新书《茱莉亚速成班》已经开始预售了:

https://logankilpatrick.gumroad.com/l/juliacrashcourse

概观🌄

首先,让我指出房间里的大象:Julia 生态系统还没有 Python 生态系统成熟。这是目前的现实,但正如你可能在这篇文章中发现的那样,这并不意味着你不能在你的机器学习工作流中成功地使用 Julia。

下面,我将简要概述 Julia 机器学习和深度学习生态系统,然后谈谈为什么您可能希望为您的 ML 和 DL 工作流学习 Julia。我们将探讨以下想法,我认为这些想法使 Julia 成为 ML 领域的主要候选人:

  • 你可以利用朱莉娅,所以你可以享受朱莉娅为🧑‍提供的所有好处🤝‍🧑
  • 灵活且可扩展💪
  • 它(实际上)是开源的👐
  • 易于使用的内部构件🍳
  • ML +科学=突破性成果🧬🧪
  • 还有更多!

如果你想在 Julia 做机器学习,有几个地方你应该看看:

总的来说,在这篇文章中,我们将重点关注作为深度学习框架的 Flux.jl,但这并不是说 Knet 和 MLJ 不是制作良好或有用的软件包。我只是没有使用它们的经验,所以我将把我的印象留到以后的文章中。

用茱莉亚代表曼梯·里,因为,你可以用茱莉亚

作为一种语言,Julia 旨在提高开发人员的工作效率。从包管理器,到运行代码的速度,所有这些特性带来了一种开发者体验,这种体验带来了大批新的开发者

我在我的帖子中提到了这一点:

https://medium.com/@logankilpatrick/why-you-should-invest-in-julia-now-as-a-data-scientist-30dc346d62e4

但是由于 Julia 处理类似多维数组的方式,您可以避免使用类似 Numpy(有时会在 Tensorflow 中看到)和 Tensors(在 PyTorch 中使用,基本上是一个重新命名的 Numpy 数组)的包。

这里我们可以看到使用 Julia 的好处是减少了精神负担。对于 Python,我们可以做到:

import tensorflow as tf
tf.ones([3, 4], tf.int32)<tf.Tensor: shape=(3, 4), dtype=int32, numpy=
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]], dtype=int32)>

然后在 Julia 中我们会做这样的事情:

julia> using Flux
julia> ones(Float32, 1, 2, 3)
1×2×3 Array{Float32, 3}:
[:, :, 1] =
 1.0  1.0[:, :, 2] =
 1.0  1.0[:, :, 3] =
 1.0  1.0

在后一种情况下,我们只处理基本的数组,至少在我看来,这使得代码更直观一些。

在上面的帖子中提到的另一点值得重复的是,你在数据科学/机器学习工作流中使用的其他包在 Julia 中运行得非常快。加载 CSV 的速度比 Python 和 DataFrames 快 10-20 倍。jl(类似于 Pandas)的速度和性能也是同类中最好的(特别是对于一个相当“年轻”的包,它在 2021 年才发布 1.0 版本)。

如果你还不相信朱莉娅的力量,它会让你更有效率,快速搜索“为什么我应该转向朱莉娅”,你会发现许多其他(希望令人信服)的文学作品,比我在这里想的更深入。

为什么是 Flux?🤔

我试图在这段 1 分钟的视频中回答这个问题:

我也鼓励你查看 https://fluxml.ai 以获得更高层次的概述。

简单、灵活且可扩展💪

可扩展系统是指其内部结构和数据流受新的或修改的功能影响最小或不受影响的系统……(通过维基百科)

在 Flux 的设计中,灵活性和可扩展性是最重要的。对于初学者来说,Flux 可以用来直接编写模型,但也可以用作 FastAI.jl 等软件包的后端。此外,Flux 试图保持一个最小但有用的 API,以便开发人员可以自由地使用所提供的内容,或在其上构建自己的自定义功能,这些功能可以自动集成到 Flux 生态系统中。

如果你曾经花了大量的时间探索过https://www.tensorflow.org/api_docs/python/tf,你会像我一样发现有很多事情正在发生(只要看一看左侧的所有模块)。相反,Flux 专注于保持 Flux 本身的代码和文档数量最少。如果你还没有看过这些文件,那就快速浏览一下:https://fluxml.ai/Flux.jl/stable/

使用 Flux 是多么简单的一个例子:

using Flux
model = Chain(Dense(10, 5, σ), Dense(5, 2), softmax)

这里我们定义了一个简单的模型,有 3 层:2 个密集层(一个使用 sigmoid 激活函数)和一个 softmax 层。

在 Tensorflow 中,这将看起来像:

from keras.models import *                                                       
from keras.layers import *                                                       

model = Sequential([Dense(10, 'sigmoid'), Dense(5), Dense(2, 'softmax')])# Thanks to Stanisław Pitucha for the updated Keras / TF code

在 Tensorflow 的情况下,我们可以看到,因为我们使用了Sequential()模型,我们实际上并没有指定层的输出大小。模型的顺序性质将一层的输出设置为下一层的输入。

虽然像 PyTorch 这样的库确实给出了如何扩展库的说明,正如文档中提到的:https://pytorch.org/docs/stable/notes/extending.html比起 Flux 有更多的限制。

它(实际上)是开源的👐

我不想在这个话题上喋喋不休太久,但是当大多数贡献者都集中在一个机构的时候,那些声称“开放”的项目总是让我担心。事实上,这是我们在评估加入 NumFOCUS(Jupyter,Pandas,Numpy,Julia,Flux 等背后的非营利组织)的新项目时要看的东西之一。对我来说,Flux 的一个核心特征是它不是由谷歌(Jax 和 Tensorflow)或脸书(PyTorch)开发的。虽然有这种支持肯定有一大堆好处(比如付给员工很多钱😄),如果我是一个用户,正在决定我想围绕什么框架来建立我的公司或项目,我的偏好将是一个我可以成为实际利益相关者的框架。就 Flux 而言,如果你想开始做出贡献并成为一名利益相关者,我们欢迎你的加入。你可以加入并开始为生态系统做出贡献:【https://julialang.org/community/#events】https://github . com/FluxML/flux . JL/blob/master/contributing . MD 或者参加两周一次的开发人员电话会议:。我将再次指出,这并不意味着对 Tensorflow 或 PyTorch 社区的轻视,因为我知道许多有价值的贡献来自主办机构之外,但从高层次来说,我认为这个想法值得记住。

易于使用的内部构件🍳

如果你想知道这里的表情符号选择,那是因为煮鸡蛋很容易,几乎和使用 Flux 的内部一样容易。既然我们已经解决了这个谜,让我们深入研究一下为什么 Flux 的内部如此易于使用。

剧透一下,就是因为他们是用朱丽亚写的。当我说用朱莉娅写的时候,我的意思是 100%用朱莉娅写的。如果你不相信我,就来看看:https://github.com/FluxML/Flux.jl

图片由作者从 Flux.jl GitHub 获取

上图与 Tensorflow 和 PyTorch 形成鲜明对比:

图片由作者从 Tensorflow GitHub 获取

图片由作者从 PyTorch GitHub 获取

你的眼睛没有欺骗你,PyTorch 和 Tensorflow,如果你不知道的话,都主要是用 C++编写的,并为用户提供了 Python 包装。这意味着,如果你想一窥究竟,你不仅要熟悉 C++和 Python,还要熟悉它们的交互方式。对我来说,我仍然害怕在大学第一年使用指针,所以如果我能避免 C++,我会这样做。如果我们看一个例子的一些内部的通量,如前所述,这是朱莉娅,只是普通的老朱莉娅:

function onehot(x, labels, default)
  i = something(findfirst(isequal(x), labels), 0)
  i > 0 || return onehot(default, labels)
  OneHotVector{UInt32, length(labels)}(i)
end

在这里,我们看到的是的一个定义,一个不断变化的热点编码。我没有看到任何指示,这是一种解脱。我将避免在这里展示任何 C++代码,因为我不想吓跑你,但是如果你够大胆,去看看一些内部的东西。

易于使用的内部代码和 100% Julia 代码的副作用之一是,软件包的用户可以很快成为开发者和关键贡献者。在过去的几个月里,当我使用 Flux 时,我亲眼目睹了这种情况的发生。虽然做出贡献仍然很困难,但毫无疑问,这比使用其他框架要容易得多。

一个基本的例子是:https://github.com/FluxML/Flux.jl/pull/1801,我发现在一些代码上调用gpu函数并没有提供任何警告或指示代码实际上没有在 GPU 上运行,这很奇怪。

ML +科学=突破性成果🧬🧪

Flux 擅长的一个领域是将它和其他软件包结合起来,创造出最先进的结果。这方面的一个例子是https://github.com/SciML/DiffEqFlux.jl,它提供:

具有 O(1)反向投影、GPU 和刚性+非刚性 DE 解算器的通用神经微分方程,展示了科学机器学习(SciML)和物理学信息机器学习方法

现在,除非你是克里斯·拉考卡斯,否则你可能会问自己这到底意味着什么。你并不孤单,朋友。当我第一次读到这本书时,我的大脑几乎永远关闭了。在高层次上,常微分方程用于模拟自然过程,如人口增长和衰退,身体对葡萄糖的吸收,甚至流行病的传播。神经 ODE 允许我们创建一个更健壮的系统,它不依赖于模型中固定数量的预设层。虽然这可能导致性能下降,但在许多情况下,结果是速度提高。你可以阅读这篇论文的详细内容:https://arxiv.org/abs/1806.07366或者这篇中篇文章:https://towardsdatascience . com/differential-equations-as-a-neural-network-layer-AC 3092632255

DiffEqFlux.jl 提供以下功能:

-可以定义神经网络,其中“激活”是由微分方程描述的非线性函数

-可以定义神经网络,其中一些层是 ODE 求解的

-可以定义 ODEs,其中一些术语是神经网络

-常微分方程上的成本函数可以定义神经网络

另一个很好的参考资料是发布博客:https://julialang.org/blog/2019/01/fluxdiffeq/

我将诚实地说,我还没有用 DiffEqFlux 弄脏我的手。这是我的待办事项列表中的一件事,对我来说最重要的是,Flux 正在推动这种创新,我觉得这很有趣。

我建议你去看看克里斯就这个话题做过的很多精彩演讲中的一个:

我还建议查看:

在那里达里亚·甘地经过了许多在科学界/生态系统中使用 Flux 的地方。

分布式和超级计算🔀

正在积极开发的是 DaggerFlux.jl ,它将提供模型并行性(在不同设备/节点上并行训练模型的能力),这对于确保 Flux 在 ML 军备竞赛中保持竞争力至关重要。

也有很多积极的工作,让朱莉娅设置工作在 TPU 的(谷歌定制 ML 硬件):https://github.com/JuliaTPU/XLA.jl虽然该项目目前似乎处于停滞状态。尽管如此,它仍然是一个可以使用朱莉娅的领域。

基准通量和张量流🪑

只是作为一个简单的比较点,我们来看看做一个通量 vs 张量流的基本梯度需要多长时间。在 Flux 中,我们将执行以下操作:

**julia>** using Flux**julia>** f(x) = 3x^2 + 2x + 1; # define our function**julia>** @time df(x) = gradient(f, x)[1]; 0.006222 seconds (995 allocations: 73.773 KiB, 44.35% compilation time) # longer time on the first run, Julia is compiled**julia>** @time df(x) = gradient(f, x)[1];0.000241 seconds (20 allocations: 1.234 KiB)**julia>** @time df(2)0.000001 seconds14.0**julia>** @time df(2)0.000000 seconds14.0

现在,让我们看看 Tensorflow 中使用梯度胶带的一个例子:

import tensorflow as tf
import timestart = time.time()
x = tf.Variable(3.0)with tf.GradientTape() as tape:
  y = x**2# dy = 2x * dx
dy_dx = tape.gradient(y, x)
dy_dx.numpy()
end = time.time() - start
print(end) # 0.002371072769165039

我要指出的是,我必须在 Google Colab 上运行 Python 示例,因为我的 Tensorflow 安装在本教程中途中断,并且我在 M1 上安装它的正常操作导致整个终端缓冲区充满红色文本和错误。提到 Julia 在 M1 mac 和许多其他平台上运行的最佳时机:https://julialang.org/downloads/#current_stable_release

再次在高层次上,本教程似乎是相关的,因为在引擎盖下,机器学习只是采取梯度。

Flux 需要改进的地方(以及如何提供帮助)🆘

Flux 落后于其他 ML 库的最大领域之一是社区书面内容。如果我想在 TF 或 PyTorch 中做一些事情,通常只需要一次搜索。这是我们在 Flux 社区中正在努力的事情。如果你有兴趣为这部值得注意的影响力极高的作品做出贡献,请查看:https://github.com/FluxML/fluxml.github.io/issues/107

如果你想参与编写教程以外的内容,这里的投稿指南:https://github . com/flux ml/flux . JL/blob/master/contributing . MD是一个很好的起点。

比较:迁移学习🧠

迁移学习是机器学习中最酷的事情之一。我们可以采用为特定用例构建的模型,并对它们进行微调以适应新的用例。我们来对比一下 Tensorflow 和 Julia 的迁移学习的代码。你可以在 GitHub 上找到 Julia 代码:

https://github.com/logankilpatrick/DeepLearningWithJulia

在:https://github . com/logankilpatrick/DeepLearningWithJulia/blob/main/src/transfer _ learning . ipynb下面还有一个 Tensorflow 的例子:https://www . tensor flow . org/tutorials/images/transfer _ learning

值得一提的最大区别之一是每个框架中处理数据(尤其是图像)的方式。在我看来,实际的机器学习很容易,在许多情况下相当琐碎。从编程的角度来说,挑战在于将数据转换成可以输入到机器学习模型的形式(并进行清理)。在这种情况下,我们可以看看张量流:

train_dataset = tf.keras.utils.image_dataset_from_directory(train_dir, shuffle=True, batch_size=BATCH_SIZE, image_size=IMG_SIZE)

对我来说,像这样的函数使得使用 Tensorflow 这样的框架变得如此容易。PyTorch 也有许多类似的函数,使得处理数据变得简单。我认为 Flux 可以从加载 ML 中的图像和其他常见数据形式的统一接口中受益匪浅。

如果我们看一下 Julia 的例子,我们实际上是从零开始编写加载代码,我已经记录下来了。同样,这实际上比迁移学习示例中使用的大多数其他代码更难。

const DOGS = filter(x -> occursin("dog", x), FILES)
const CATS = filter(x -> occursin("cat", x), FILES)function load_batch(batchsize = 10, imagesize = (224,224); path = PATH)
    if ((batchsize % 2) != 0)
      print("Batch size must be an even number")
    end imgs_paths = shuffle(vcat(sample(DOGS, Int(batchsize/2)), sample(CATS, Int(batchsize/2))))

    labels = map(x -> occursin("dog.", x) ? 1 : 2, imgs_paths)
    labels = Flux.onehotbatch(labels, [1, 2]) imgs = Images.load.(imgs_paths)
    imgs = map(img -> Images.imresize(img, imagesize...), imgs) imgs = map(img -> permutedims(channelview(img), (3, 2, 1)), imgs)
    imgs = cat(imgs..., dims = 4) Float32.(imgs), labels
end

我们看到的代码中的另一个区别是图像放大:

data_augmentation = tf.keras.Sequential([
  tf.keras.layers.RandomFlip('horizontal'),
  tf.keras.layers.RandomRotation(0.2),
])

这里我们可以看到 TF 代码做随机翻转和旋转。在茱莉亚的例子中,我们需要使用:https://github.com/Evizero/Augmentor.jl

julia> pl = FlipX(0.5) |>
            Rotate(0:20) |>julia> img_new = augment(img, pl) # here we apply the augmentation

再次,从可用性的角度来看,在我看来,将图像增强作为核心包的一部分是有好处的,但是将它提取出来以保持最小化的想法是可以理解的。

最后,让我们看看 Julia 中的模型定义本身:

model = Chain(
  resnet[1:end-2],
  Dense(2048, 1000, σ),  
  Dense(1000, 256, σ),
  Dense(256, 2),
  softmax        
);

这里,我们采用一个预训练的 Resnet,并抓取它的所有层,除了最后两层,我们将用我们新的微调层来替换。在 Tensorflow 中,我们会做一些事情,效果如下:

base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
inputs = tf.keras.Input(shape=(160, 160, 3))
x = data_augmentation(inputs)
x = preprocess_input(x)
x = base_model(x, training=False)
x = global_average_layer(x)
x = tf.keras.layers.Dropout(0.2)(x)
outputs = prediction_layer(x)
model = tf.keras.Model(inputs, outputs)

这是在 TF 中创建模型的方法之一(Flux 也有类似的方法),其中定义输入和输出,而不是模型层,但我更喜欢使用我们看到的 Julia chain函数的格式来创建模型。

将 Tensorflow 或 PyTorch 集成到 Julia 中🤯

虽然 Tensorflow.jl 不再被积极开发,但你仍然可以在 Julia 中使用 Tensorflow(以及任何相关的 python 代码)。Torch.jl 也被积极维护:https://github.com/FluxML/Torch.jl它提供了 PyTorch 的 C++代码在 Julia 中的包装。

如果您有兴趣阅读更多关于将 Python 和 Julia 集成在一起的内容,请查看:

总结想法🎬

我这篇文章的目标是说服那些不确定是否使用 Julia 进行机器学习的人,让他们相信尝试一下是值得的。我还希望我提到的 Flux 生态系统需要进一步发展的领域设定了正确的预期,即事情并不完美,但它们肯定是在你可以进行严肃科学和 ML 的点上。

如果你对这篇文章有什么意见,请联系我:https://twitter.com/OfficialLoganK或者如果你想在 Flux 上有所帮助,我们非常欢迎你!

数据工程师的未来

原文:https://towardsdatascience.com/the-future-of-the-data-engineer-4dcfa53800ab?source=collection_archive---------0-----------------------

意见

数据工程师仍然是“餐桌上最差的座位吗?”对我们行业中工具、流程和文化的过去、现在和未来的思考。

图片由汤姆·斯托克Unsplash 上提供。

巴尔摩西 利奥加维什

在数据工程的世界里,Maxime Beauchemin是不需要介绍的人。

作为脸书和 Airbnb 的第一批数据工程师之一,他编写并开源了广受欢迎的 orchestrator, Apache Airflow ,随后不久又推出了ApacheSuperset,这是一款数据探索工具,正在席卷数据领域。目前,Maxime 是 Preset 的首席执行官和联合创始人,这是一家快速发展的初创公司,为现代公司的人工智能数据可视化铺平了道路。

公平地说,马克西姆经历了——甚至设计了——过去十年中许多最具影响力的数据工程技术,并通过他 2017 年的里程碑式博客帖子The Rise of The Data Engineer,开创了这个角色本身,他在博客中记录了他的许多观察。简而言之,Maxime 认为,为了有效地扩展数据科学和分析,团队需要一名专业工程师来管理 ETL、构建管道和扩展数据基础设施。进入,数据工程师。

几个月后,马克西姆在那篇文章的基础上反思了数据工程师面临的一些最大挑战:工作很艰难,受到的尊重很少,他们的工作和产生的实际见解之间的联系很明显,但很少被认识到。作为一名数据工程师是一份吃力不讨好但越来越重要的工作,团队成员要跨越构建基础架构、运行工作以及处理来自分析和 BI 团队的临时请求。因此,成为一名数据工程师既是福也是祸。

事实上,在马克西姆看来,数据工程师是“餐桌上最差的座位”

那么,五年后,我们的处境如何?

在他在IMPACT:Data Observability Summit发表主题演讲之前,我们与 Maxime 坐下来讨论了当前的事态,包括现代数据堆栈的分散化、数据团队的分散化、云的兴起,以及所有这些因素如何永远改变了数据工程师的角色。

ETL 和分析的速度提高了

Maxime 回忆起不久前的一段时间,当时数据工程师会一次运行几个小时的 Hive 作业,需要在作业之间频繁切换上下文,并管理数据管道的不同元素。

直截了当地说,这既无聊又累人。

“这种永无止境的上下文切换和运行数据操作所花费的时间长度导致了精疲力尽,”他说。“通常情况下,晚上 11:30 工作 5-10 分钟可以为你第二天节省 2-4 个小时的工作时间——这不一定是件好事。”

2021 年,由于 BigQuery、Snowflake、Firebolt、Databricks 和其他云仓储技术的计算能力,数据工程师可以非常快速地运行大型任务。这种从内部和开源解决方案向云和托管 SaaS 的转移释放了数据工程资源,使其能够处理与数据库管理无关的任务。

另一方面,成本更加有限。

Maxime 说:“过去在内部运行相当便宜,但是在云中,你必须注意你的计算成本。”"资源是有弹性的,而不是有限的."

随着数据工程师不再负责管理计算和存储,他们的角色正在从基础架构开发转变为更基于性能的数据堆栈元素,甚至是专门的角色。

“我们可以在 数据可靠性工程 的兴起中看到这种转变,数据工程师负责管理(而不是构建)数据基础设施,并监督基于云的系统的性能。”

在治理问题上达成共识更加困难——这没关系

在以前的时代,数据团队结构非常集中,数据工程师和精通技术的分析师充当整个公司的数据“图书管理员”。数据治理是一个孤立的角色,数据工程师成为数据信任事实上的守门人——不管他们喜不喜欢。

如今,马克西姆认为,治理是分布式的,这一点已被广泛接受。每个团队都有自己的分析领域,迫使分散的团队结构围绕“好”数据的广泛标准化定义。

“我们已经接受了寻求共识并非在所有领域都是必要的,但这并没有使事情变得更容易,”他说。“数据仓库在许多方面是组织的镜子。如果人们对他们在数据仓库中称之为什么或者度量标准的定义不一致,那么这种缺乏共识将会反映到下游。但也许这没关系。”

Maxime 认为,也许为企业寻找共识不一定是数据团队的唯一责任,特别是如果数据在整个公司以不同的方式使用。这必然会导致重复和不一致,除非团队仔细考虑哪些数据是私有的(换句话说,只有特定的业务领域使用)或与更广泛的组织共享。

“现在,不同的团队拥有他们使用和产生的数据,而不是由一个中心团队负责公司的所有数据。他说:“当数据在团队之间共享并在更大范围内公开时,需要更加严格地为变更管理提供 API。

这就引出了我们的下一点…

变更管理仍然是一个问题,但是合适的工具可以有所帮助

2017 年,当 Maxime 写下他的第一篇文章时,“当数据发生变化时,它会影响整个公司,但没有人会被通知。”这种变革管理的缺乏是由技术和文化差距造成的。

当源代码或数据集被更改或更新时,下游会发生中断,这将导致仪表板、报告和其他数据产品实际上无效,直到问题得到解决。这种数据停机(数据丢失、不准确或出现其他错误的时间段)成本高昂、耗时且难以解决。很多时候,停机时间会悄无声息地到来,数据团队会绞尽脑汁试图找出哪里出了问题,谁受到了影响,以及如何解决问题。

如今,数据团队越来越依赖于 DevOps 和软件工程最佳实践来构建更强大的工具和文化,优先考虑通信和数据可靠性。

Maxime 说:“数据的可观察性和沿袭性无疑帮助团队识别和修复了问题,甚至提供了关于什么破坏了以及谁受到了影响的表面信息。”“尽管如此,变革管理不仅是技术性的,也是文化性的。如果分散的团队没有遵循将下游消费者甚至中央数据平台团队保持在循环中的流程和工作流,那么有效地处理变化将是一个挑战。”

如果没有区分哪些数据是私有的(仅由 data domain 所有者使用)和哪些数据是公共的(由更广泛的公司使用),那么就很难知道谁使用了哪些数据,如果数据损坏了,是什么原因造成的。血统和根本原因分析可以帮助你完成一半。例如,当 Maxime 在 Airbnb 时, Dataportal 的建立是为了使数据访问民主化,并使所有 Airbnb 员工能够探索、理解和信任数据。尽管该工具通过端到端的沿袭告诉他们谁将受到数据更改的影响,但它仍然没有使管理这些更改变得更加容易。

数据应该是不可变的——否则混乱就会接踵而至

数据工具严重依赖软件工程来获得灵感——总的来说,这是一件好事。但是有一些数据元素使得使用 ETL 管道与使用代码库有很大的不同。举个例子?像代码一样编辑数据。

“如果我想改变一个列名,这将是相当困难的,因为你必须重新运行你的 ETL 和改变你的 SQL,”Maxime 说。“这些新的管道和数据结构会影响您的系统,并且可能很难部署更改,尤其是在出现问题时。”

例如,如果您有一个增量流程,该流程定期将数据加载到一个非常大的表中,并且您想要删除其中的一些数据,那么您必须暂停管道,重新配置基础设施,然后在删除新列后部署新的逻辑。

工具并不能真正帮助你,特别是在不同负载的情况下。回填仍然会很痛苦,但坚持回填也有一些好处。

“实际上,维护你的数据的这种历史记录也有好处,”他说。“旧逻辑与新逻辑并存,可以比较。你不必去破坏和改变过去已经发布的一堆资产。”

保留重要的数据资产(即使它们不再使用)可以提供有用的上下文。当然,目标是所有这些变化都应该随着时间的推移被明确地记录下来。

所以,选择你的毒药?数据债务或数据管道混乱。

数据工程师的角色正在分散

正如在软件工程中一样,数据工程师的角色和职责正在发生变化,尤其是对于更成熟的组织。随着数据仓库需求转移到云,数据库工程师正在消失,数据工程师越来越多地负责管理数据性能和可靠性。

按照马克西姆的说法,这大概是一件好事。在过去,数据工程师是"桌子上最差的座位",负责用不太符合业务需求的工具和流程操作其他人的工作。

现在,出现了各种各样的新角色,让这变得稍微容易了一点。例如,分析工程师。由的编辑本地乐观迈克尔·卡明斯基创造,分析工程师是一个跨越数据工程和数据分析的角色,并应用一种分析性的、面向业务的方法来处理数据。

分析工程师就像数据密语者,负责确保数据不会孤立于商业智能和分析之外。

“数据工程师几乎成了良好数据习惯的守护者。例如,如果分析工程师在每次运行 dbt 时都重新处理仓库,他们可能会养成坏习惯。数据工程师是看门人,负责就最佳实践对数据团队进行培训,尤其是围绕效率(处理增量负载)、数据建模和编码标准,并依靠数据可观察性和数据操作来确保每个人都以同样的勤奋对待数据。”

运营蔓延并没有消失,只是被分散了

正如 Maxime 的早期文章中所讨论的,操作蠕变指的是随着时间推移职责的逐渐增加,不幸的是,这对于数据工程师来说是一个太普遍的现实。虽然现代工具有助于提高工程师的工作效率,但它们并不总是让他们的生活更轻松或更轻松。事实上,随着时间的推移,他们经常会引入更多的工作或技术债务。

尽管如此,即使随着更专业化的角色和分布式数据团队的兴起,操作蠕变仍未消失。随着技术知识的增长和越来越多的职能部门投资于数据素养,其中一些已经转移到其他角色。

例如,Maxime 认为,分析工程师优先考虑的不一定是数据工程师优先考虑的事情。

“分析工程师关心管道的运营成本吗?他们是关心优化您的堆栈,还是主要关心提供下一个洞察?我不知道。”他说。“操作蠕变是一个行业问题,因为数据工程师很可能仍将不得不管理“不太吸引人”的事情,如跟踪存储成本或处理数据质量。”

在分析工程师的世界里,操作蠕变也存在。

“作为一名分析工程师,如果我所要做的就是编写大量的 SQL 来解决问题,我可能会使用 dbt,但它仍然是大量的模板化 SQL,这使得很难编写任何可重用或可管理的东西,”Maxime 说。“但在很多情况下,这仍然是我的选择,因为它简单明了。”

他认为,在理想的情况下,我们会想要看起来更像现代代码的东西,因为我们可以用更具可伸缩性的方式创建抽象。

那么,数据工程师的下一步是什么?

我和马克西姆的谈话让我思考了很多,但是,总的来说,我倾向于同意他的观点。虽然数据团队的报告结构和运营层级变得越来越垂直,但数据工程师的范围变得越来越水平,并专注于性能和可靠性,这最终是一件好事。

专注孕育创新和速度,这可以防止数据工程师试图煮沸海洋,旋转太多的盘子,或者通常耗尽精力。数据团队中更多的角色意味着传统的数据工程任务(处理特定的查询、建模、转换,甚至构建管道)不需要仅仅落在他们的肩上。相反,他们可以专注于重要的事情:确保数据在其生命周期的每一点都是可信的、可访问的和安全的。

不断变化的工具环境反映了这种向更加集中和专业化的角色的转变。DataOps 使计划和运行作业变得容易;云数据仓库使得在云端存储和处理数据变得容易;数据湖允许更细微和复杂的处理用例;与之前的应用程序监控和可观察性一样,数据可观察性可以自动执行许多与数据质量和可靠性相关的机械性和重复性任务,从而提供基准健康水平,使整个数据组织能够平稳运行。

随着这些新技术和工作流的兴起,工程师们也有了一个绝佳的机会来掌控向 发展的趋势,像对待产品 一样对待数据。只有当数据本身被一个进化的、迭代的产品认真对待时,构建可操作的、可伸缩的、可观察的和有弹性的数据系统才是可能的。这里是用例特定的元数据、ML 驱动的数据发现以及可以帮助我们更好地理解什么数据真正重要以及什么可以像渡渡鸟一样的工具。

至少,这是我们在水晶球中看到的。

你在你的眼睛里看到了什么?🙂

伸出手去 格言*巴尔 ,或者 利奥 用你的数据工程预测。我们洗耳恭听。*

现代数据堆栈的未来是什么样的?

原文:https://towardsdatascience.com/the-future-of-the-modern-data-stack-2de175b3c809?source=collection_archive---------3-----------------------

2022 年预测

雪花的前首席执行官 Bob Muglia 讨论了推动数据分析和工程的工具和技术的下一步

图片由 斯蒂夫·约翰森 在 Unsplash 上提供。

几周前,我有机会与现代数据堆栈的先驱之一、雪花的前首席执行官 Bob Muglia 聊天,了解他对我们行业未来的预测。

如果说 Maxime Beauchemin 是数据工程之父,那么 Muglia 无疑是云数据分析数据库之父,为市场带来了该领域最受欢迎的解决方案之一: Snowflake ,该解决方案于 2016 年推出,帮助推广了十年来最具变革性的技术之一。

然而,在我们开始之前,重要的是理解我们所说的现代数据堆栈的确切含义:

  • 它是基于云的
  • 它是模块化和可定制的
  • 首先是同类最佳(为特定工作选择最佳工具,而不是一体化解决方案)
  • 这是元数据驱动的
  • 它运行在 SQL 上(至少目前是这样)

记住这些基本概念,让我们深入了解 Bob 对现代数据堆栈未来的预测。(关于更广泛的对话,一定要看看下面我的采访)。

https://www.montecarlodata.com/impact-2021-the-modern-data-stack/

1.数据湖和数据仓库将变得难以区分

数据仓库已经存在了几十年,并在 2013 年亚马逊红移首次推出基于云的仓储时实现了飞跃。近年来,更加可定制和灵活的数据湖变得越来越流行,公司不得不评估数据仓库或数据湖是否是他们业务的正确选择。鲍勃认为,这种划分不会持续很久。

“越来越多的数据湖和数据仓库正在融合成一个整体,”Bob 说。“我真的认为五年后它们会变得很难区分。这实际上是你是否把它看作一个文件,或者你是否把它看作一个关系表。这才是正确的抽象。有时候文件是有价值的,尤其是在交换的时候,但是您想要执行的大多数操作实际上都是在关系架构中执行的。因此,数据湖和数据仓库的想法走到了一起。”

2.分析将与数据平台中基于 SQL 的系统合并

这种凝聚力的趋势一直延续到分析领域,包括机器学习。

Bob 说:“今天,这个行业中基本上有五家供应商正在构建一个人们可以在其上构建的云平台。“有雪花和数据砖块,然后三大云供应商——亚马逊、微软和谷歌——都有自己的东西。所有这些都有一致性,我认为你会看到分析系统融入数据平台。你肯定会看到 Databricks 和 Snowflake 以及所有云供应商正在做的事情。你会看到一个非常完整的堆栈,其中既有分析、高级分析和机器学习系统,又有基于 SQL 的数据管理系统。”

3.治理、沿袭和度量的通用标准将开始出现

在不久的将来,Bob 希望看到行业从 2022 年开始围绕数据治理制定标准。

“我看到了在现代数据堆栈中开发一些关键标准的机会,这些标准与治理、沿袭、指标等相关,”Bob 说。“我觉得有必要考虑到这些平台和工具之间的互操作性,并且有必要存在一些标准。”

然而,他并不认为这很容易。“治理不是一个简单的问题,但却是一个重要的问题,因为这是一个全世界都关心的问题——保护人们的信息对每个人都很重要,”他说。“就公司的声誉而言,这很重要。就知识产权而言,这很重要。有很强的监管原因。所以这个世界在不断发展,人们必须保持领先。虽然现代数据堆栈的这些工具提供了许多令人难以置信的数据处理功能,但它们也必须受到保护和适当的管理,以确保只有应该访问数据的人才能获得访问权限。我认为,虽然有一些可用的工具,但我们在这方面仍处于初级阶段。”

Bob 对希望解决治理问题的企业有一个具体的建议。

“Gartner 在设计他们所谓的数据结构方面做得非常好。说到数据治理,这是一个值得关注的模型。这是高级和抽象的,但作为与供应商合作的人,这是一个非常好的模板,可以用来思考如何构建这些东西。”

4.预测分析将会发生巨大的变化

展望未来几年,Bob 预测预测分析工作的完成方式将发生重大变化。

“我认为我们将继续看到预测分析的发展,”Bob 说。“当前一代的预测分析系统实际上是围绕一个数据框架构建的,你可以使用 Python 或 Scala 等语言来操作该数据框架。虽然这是有效的——人们正在这样做,工具也在改进——但我仍然认为我们处于非常非常原始的水平。我预计在未来五到十年内,机器学习的方式会有相当大的改进。”

5.知识图表将会大受欢迎

具体来说,鲍勃预见到对知识图表的需求将会增加——他认为数据平台将会发展以满足这一需求。

“我认为,总的趋势是我们将开始看到知识图表的出现,”鲍勃说。“现代数据堆栈将开始发展,从而能够通过它构建知识图表。这实际上是将与某些东西相关的业务逻辑嵌入到数据库中。这就是区别。”

6.下一代数据共享将需要组织内部(以及组织之间)的面向领域的治理

Bob 认为数据共享——包括组织内部和组织之间的数据共享,如商业数据共享——是我们行业未来的核心。

“数据始于组织,并由组织创造,”Bob 说。“它是组织创造的资产,您可以从中提取价值并适当利用。Thoughtworks 围绕数据网和数据的组织原则和领域导向的理念所做的工作是正确的。”

鲍勃承认,对于不同的组织来说,如何实现这一点看起来会有所不同。

“现在,如果你是一个 50 人的公司,你可能没有一堆不同的数据域,”他说。“但是如果你是一个非常大的公司,面向领域的数据在概念上是正确的。有趣的是,你实际上是用什么机制做到这一点的?我们对雪花就是这么做的。数据共享的想法是建立支持面向领域的治理模型所需的机制。因此,这种面向领域的治理思想非常适用于现代数据堆栈。这就是数据共享。如果你看看雪花在公司内部的数据交换方面做了什么,它允许公司建立不同领域的数据专业知识,然后与其他组织共享这些数据。”

Bob 预测,这种对领域专业知识采用的增加将导致数据应用程序开发的增加。“人们有数据,但他们也有关于业务的知识,他们希望将这些知识带到数据中。这意味着您正在创建一个数据应用程序,您正在获取数据和关于业务的知识,并构建一个可以根据数据中发生的事情采取自主行动的应用程序。这就是下一代的数据市场和共享——因为不同的领域将会有不同的专业知识。”

这种影响将远远超出数据行业本身。

“如果你有一家小型地区性银行,能够从专注于该行业的精品机构获得分析技能是不可思议的,”Bob 说。“您的组织内部可能不具备数据科学家的能力,但您可以通过提供这种能力的组织租用。我认为我们将会看到成千上万的公司建立以垂直行业为目标的分析服务,他们可以将专业知识应用到业务中。这是下一代的数据共享。”

一句话:2022 年是专注于解决数据信任问题的一年

正如 Bob 所看到的,现代数据堆栈将继续为在组织内部和跨组织使用数据提供机会。随着越来越多的公司采用面向领域的架构,并向其他企业共享或出售数据,对一致的、行业范围的数据信任和可靠性标准的需求将变得更加迫切。

“现代数据堆栈本身仍然相对较新,”Bob 说。“无论是数据的可观察性和性能,还是元数据管理和治理,仍然有大量的机会可以改进,客户仍在努力解决问题。”

你怎么看待这些预测?伸手 巴尔 随你拿!

赌徒的破产问题

原文:https://towardsdatascience.com/the-gamblers-ruin-problem-9c97a7747171?source=collection_archive---------4-----------------------

马尔可夫链的一个独特应用

乔纳森·彼得森在 Unsplash 上拍摄的照片

介绍

条件概率理论经常导致某些数学问题的独特而有趣的解决方案。当一个复杂的概率问题能够以相对简单的方式解决时,人们既兴奋又难以置信。赌徒的破产问题就是如此,这是一个围绕条件概率和实验结果的著名统计场景。这个问题可能更令人着迷的是,它的结构超越了条件概率,扩展到随机变量和分布,特别是作为具有有趣性质的独特马尔可夫链的应用。

初等概率问题基于对不确定结果的数学描述。初等统计学为我们提供了一套工具,我们可以使用这些工具通过定理来确定不确定结果的概率,并揭示复杂的情况。解决赌徒的破产问题不是我们必须每天完成的任务,但理解其结构有助于我们在处理植根于不确定性的情况时培养批判和数学思维。

N 注:这篇文章要求读者理解初等概率和统计理论,这本身就要求接触微积分和线性代数。还假设读者对马氏链有一定的基础知识。

问题陈述

赌徒的破产问题最基本的形式是由两个赌徒 A 和 B 组成,他们相互之间进行多次概率游戏。每次游戏都有一个概率p(0<p1)赌徒 A 会赢赌徒 B 。同样,使用基本的概率公理,赌徒 B 赢的概率是 1-p。每个赌徒都有一个初始财富,限制他们能下多少注。总组合财富由 k 表示,赌徒 A 的初始财富由 i 表示,这意味着赌徒 B 的初始财富为 k - i 。财富要求为正。我们应用于这个问题的最后一个条件是,两个赌徒都将无限期地玩下去,直到其中一个失去了他们所有的初始财富,从而不能再玩下去。

想象一下,赌徒 A 的初始财富 i 是整数美元,并且每场游戏都是一美元。这意味着赌徒 A 至少要玩 i 游戏,他们的财富才会降到零。他们每局赢一块钱的概率是 p ,如果游戏对两个赌客都公平的话,那就等于 1/2。如果 p > 1/2,那么赌徒 A 具有系统优势,如果 p < 1/2,那么赌徒 A 具有系统劣势。系列游戏只能以两种结局收场:赌徒 A 拥有财富 k 美元(赌徒 B 输光了所有的钱),或者赌徒 A 拥有财富 0 美元(赌徒 B 拥有所有的财富)。分析的主要焦点是确定赌徒 A 最终获得财富 k 而不是 0 美元的概率。无论结果如何,其中一个赌徒将以金融破产告终,因此得名赌徒的破产

问题解决方案

继续上面概述的相同结构,我们现在想要确定赌徒aᵢaa将会以 k 美元结束的概率,假设他们以 i 美元开始。为了简单起见,我们在这里会增加一个额外的假设:所有的游戏都是相同且独立的。每一次赌徒玩一个新的游戏,它可以被解释为一个新的迭代的赌徒的破产问题,其中每个赌徒的初始财富是不同的,取决于最近游戏的结果。从数学上来说,我们可以认为每一个游戏序列都以赌徒 A 拥有 j 美元结束,其中 j = 0,…, k 。假设一个特定的序列发生,赌徒 A 赢的概率是 aⱼ 。任何以赌徒 a 有 k 美元结束的序列都意味着他们赢了,所以 aₖ= 1。同样地,任何以 0 美元结束的序列都意味着他们破产了,所以₀=0.我们感兴趣的是确定 i=1,…,k - 1 的所有值的概率。

使用事件符号,我们可以将 A ₁表示为游戏者 A 赢得游戏 1 的事件。类似地, B ₁是赌徒 B 赢得第一场比赛的事件。事件 W 发生在赌徒 Ak 美元结束时,在他们以 0 美元结束之前。此事件发生的概率可以使用条件概率的属性来推导。

使用条件概率的获胜概率

假设赌徒 a 从美元开始,他们赢的概率是 P(W)=aᵢ。如果赌徒 A 在第一局赢了 1 美元,那么他们的财富就变成了 1 美元。如果他们在第一局输了一美元,他们的财富就会变成 1。他们赢得整个序列的概率将取决于他们是否赢得了第一场比赛。当我们将这一逻辑应用于前面的等式时,我们知道有一个赢得整个游戏序列的概率的表达式,它取决于每场游戏赢得一美元的概率和给定赌徒财富的赢得序列的条件概率。

使用问题符号的获胜概率

在任何给定的时间点,赌徒 A 的财富在两个赌徒的总初始财富和零之间变化。换句话说,给定 i= 1,…, k - 1,我们可以将 i 的所有可能值代入上式,得到 k - 1 个方程,根据 i 的相邻值确定中奖概率。我们可以用初等代数将这些方程集合成一个标准化的格式,可以简化成一个公式。这个公式规定了每场游戏的获胜概率 p、两个赌徒的总初始财富 k 和给定一美元财富 a 的获胜概率之间的基本关系一旦我们已经确定了 a ₁,我们可以迭代地遍历所有的 k - 1,以导出 aᵢ 对于 i. 的所有可能值的概率

基本关系

我们现在将考虑两种可能性:公平游戏和不公平游戏,这取决于我们代入上述等式的 p 的值。在一个公平的游戏中,其中 p =1/2,等式右边的指数的底数可以简化为(1 - p )/ p =1。然后我们可以将整个方程简化如下:1-a₁=(k-1)a₁,可以重新排列为 a ₁=1/ k 。如果我们迭代所有先前的方程,这些方程决定了不同的 i,I 值的获胜概率,我们就得到公平游戏的一般解。

公平游戏的解决方案

上面的等式是一个显著的结果:假设游戏是公平的,赌徒 A 在以零美元结束之前以 k 美元结束的概率等于他们最初的财富除以两个赌徒的总财富。

如果 p 不等于 1/2,这个游戏就是不公平的,因为两个赌徒中的一个有系统优势。我们可以类似地推导出一个依赖于 p 的值和财富参数的一般解。

不公平游戏的解决方案

:如果读者有兴趣学习数学证明以得出通解,请查阅最后的参考文献。

马尔可夫链

郭佳欣·阿维蒂斯扬Unsplash 拍摄的照片

代表由离散时间间隔定义的不同时间点的随机变量序列 X 可以被称为随机过程。流程中的第一个随机变量称为初始状态,流程中的其余随机变量定义了每个流程在时间 n 的状态。马尔可夫链是一种特殊的随机过程,其中未来状态的条件分布只取决于当前状态。也就是说, X 在时间 n + j 对于 j > 0 的条件分布仅取决于时间 n 的进程状态,而不取决于直到 n - 1 的任何更早的状态。我们可以用下面的符号来表达这一点。

马尔可夫链

如果在任意时间点可能出现的状态数是无限的,那么马尔可夫链是有限的。考虑一个有 k 个状态的链。给定在时间 n 的状态,在时间 n+1 取特定值 j 的状态的概率分布被称为马尔可夫链的转移分布。如果每次 n 的分布都相同,则认为这些分布是稳定的。我们可以用符号 pᵢⱼ 来表示这些分布。

平稳转移分布

pᵢⱼ 可以取的不同值的总数取决于可能状态 k 的总数,我们可以通过 k 矩阵 P 将其排列在一个 k 中,称为马尔可夫链的转移矩阵。

跃迁矩阵

转移矩阵具有重要的性质,使它们是唯一的。因为矩阵的每个元素都代表一个概率,所以所有元素都是正的。由于给定前一个状态的值,每一行代表下一个状态的整个条件分布,因此每一行中的值总和为 1。通过使用转移矩阵,我们可以直接将概率计算扩展到多个步骤。也就是说,我们可以通过取转移矩阵【p】的幂来计算马尔可夫链从一个状态 i 多步移动到一个状态jm 的概率。也就是说,可以用 m 步转移矩阵 P ᵐ来计算特定状态的概率

如果我们有一个转移矩阵,其中任何对角线 pᵢᵢ 等于 1,那么状态 i 被认为是吸收状态。一旦马尔可夫链进入吸收状态,它就不能再进入任何其它状态。另一个有趣的性质是,如果一个马尔可夫链有一个或多个吸收态,那么这个链最终会被吸收到这些吸收态中的一个。

在时间 1 的马尔可夫链的开始,我们可以指定一个向量,它的元素表示该链将处于每个状态的概率。这就是所谓的初始概率向量* v 。我们可以通过初始概率向量 v 乘以转移矩阵 Pn - 1 次方来确定链在任意时刻的边际分布。例如,我们可以通过表达式 vP 求出链在时刻 2 的边际分布。*

当一个概率向量乘以转移矩阵等于其自身时会出现一种特殊情况:vP=v .出现这种情况时,我们称该概率向量为马尔可夫链的平稳分布

赌徒的破产马尔可夫链

使用马尔可夫链的理论框架,我们现在可以将这些概念应用于赌徒的破产问题。我们能够做到这一点的事实表明了概率和统计理论是如何相互交织的。我们最初使用从基本概率公理中导出的条件概率定理来设计这个问题。现在我们可以进一步形式化这个问题,并使用马尔可夫链给它更多的结构。采用抽象概念并使用各种工具对其进行分析和扩展的过程凸显了统计学的魔力。

赌徒的破产问题本质上是一个马尔可夫链,其中赌徒在任一时间点拥有的财富数量序列决定了潜在的结构。即在任一时间点 n ,赌徒 A 都可以拥有 i 财富,其中 i 也代表链条在时间点 n 的状态。当游戏者达到 0 财富或 k 财富时,链进入吸收状态,不再玩游戏。

如果该链移动到剩余的 k - 1 个状态 1,…,k - 1 中的任何一个,则再次进行游戏,其中游戏者 A 将赢得 p 的概率决定了该状态在该特定时间点的边际分布。跃迁矩阵有两个吸收态。第一行对应于游戏者 A 拥有 0 财富的场景,该行的元素是(1,0,…,0)。同样,转移矩阵的最后一行对应于当游戏者 A 达到 k 财富并且元素为(0,…,1)时的场景。对于每隔一行的 i ,除了具有坐标 i - 1 和 i + 1 的项之外,元素都是零,它们分别具有值 1 - pp

赌徒破产转移矩阵

我们还可以使用 m 步转移矩阵 P ᵐ.来确定多步状态的概率当 m 趋于无穷大时,m 步矩阵收敛,但平稳分布不是唯一的。ᵐ的极限矩阵除了第一列和最后一列都是零。最后一列包含所有的概率 aᵢ 赌徒 A 将会以 k 美元结束,假设他们以 i 美元开始,而第一列包含所有相应的 aᵢ.的补码由于稳态分布不是唯一的,这意味着所有的概率都属于吸收态。

赌徒破产极限矩阵

这最后一点尤其重要,因为它证实了我们在推导赌徒破产的解决方案时最初的逻辑步骤顺序。换句话说,我们能够从整体上推导出问题的一般公式,因为问题中发生的随机过程(博弈序列)收敛到两种吸收状态之一:赌徒 A 带走 k 美元或赌徒 A 带走 0 美元即使可以玩无限多的游戏,我们仍然可以确定这两个事件中任何一个发生的概率,因为马尔可夫链的转移矩阵收敛于两个平稳分布。

结论

赌徒的破产问题是一个很好的例子,说明了如何利用统计工具,从一个复杂的情况中得出一个简单的总体结构。可能很难相信,给定一个公平的游戏,某人赢得足够多的游戏以获得两个玩家的总财富的概率是由他们的初始财富和总财富决定的。这不仅在序列的开始是已知的,而且在每个步骤也是已知的。使用马尔可夫链,我们可以用转移矩阵和初始状态的概率向量来确定任意博弈序列之间的相同概率。考虑到这一点,我们在这篇文章的第一部分得出的结论通过使用一个额外的概念得到了加强。对同一个问题应用不同的观点可以打开有洞察力的分析之门。这就是理论统计思维的力量。

参考

[1] M. H. Degroot 和 M. J. Schervish,概率与统计 (2018),皮尔森

游戏分析师应对危机指南

原文:https://towardsdatascience.com/the-game-analyst-guide-to-deal-with-a-crisis-71b91cea2598?source=collection_archive---------41-----------------------

尽管所有的努力都是为了提高软件质量,但有时还是会发生意想不到的事情,作为一名游戏分析师,你必须处理危机情况。

当你是一名游戏/产品/商业分析师时,你很可能以一杯你最喜欢的含咖啡因的饮料和一个监控会议开始你的一天。你检查了你的主要 KPI,你最喜欢的仪表板,然后,在危机的一天,你会注意到有些不对劲。理想情况下,一些警报系统已经提示你房间里有烟,或者可能是其他人首先注意到这种情况。

根据危机的严重程度,(即对底线的潜在影响),你的心脏会跳动,你的大脑会释放多巴胺,奖励你发现有什么不对劲,在“战斗或逃跑”的反应中,你会感到肾上腺素突然激增。你需要所有这些化学物质来度过这一天。是时候戴上侦探帽了。

夏洛克·福尔摩斯侦探和约翰·华生医生在火车上一起破解一个谜。西德尼·佩吉特的插图

从为什么开始

除了作为一本令人惊奇的书的标题之外,西蒙·西内克的《从为什么开始》是你注意到你的产品/游戏发生了一些事情之后的第一个任务。

你的任务是帮助你的团队理解某些 KPI 过低的原因。如果你能找出原因,团队就能更快地解决问题。或者至少,会有应对后果的策略。

马库斯·温克勒Unsplash 上拍摄

因此,您的首要任务是为可能对您的产品造成负面影响的任何因素制定假设。为了提出更好的假设,你应该试着理解:

  • 是否报告了任何可能影响 KPI 的错误?
  • 谁受到影响/有多少玩家受到影响?
  • 负面影响是否与更新/修补程序相关?
  • 有没有可能在以前的更新中引入了一些东西,以前的 AB 测试开始了雪球效应?
  • 是否有任何不可预见的季节性/黑天鹅事件可以解释这场危机?

客户支持/社区是您的得力助手

我明白了,同情和接触玩家/用户是获得玩家体验核心的关键。在团队中,没有人比客户支持(CS)和社区经理更了解玩家/客户。

询问 CS 某一类型的票证是否有所增加,是否报告了任何值得注意的错误,可以加快了解是否存在错误的时间。你将能够利用这一信息来源开始制定假设,或者为你正在考虑的现有假设提供支持。

沟通和可见性

大多数公司都有一定的程序来处理即将到来的产品危机。不管过程如何,你都应该是团队和利益相关者的持续信息来源。

掌握事实,让每个人都了解情况。西德尼·佩吉特的插图

你应该让团队参与你的假设和整个调查过程。让他们了解任何可能帮助他们解决/解决问题的新信息。

您还应该让所有利益相关者参与当前的调查。让每个人都了解最新情况有助于在问题解决后报告长期影响。

分步解决

细分、细分、细分、细分……所有你能想到的细分用户的潜在方法都应该考虑到你的跑步假设。这里有一些典型的例子,如果你感到恐慌,并且在这个需要的时刻你的创造力让你失望了,这里有一个你可以参考的列表(专业提示:创建你自己的“飞行前检查”/“正常清单”部分,你可以浏览一下以确保你覆盖了所有的基础):

  • 按设备。不同平台的用户受到的影响是一样的吗?这意味着检查看到负面影响的主要 KPI 是否表现不同,无论用户是在桌面上玩还是在移动上玩,iOS 还是 Android,iPhone 9 还是 iPhone 12。
  • WiFi 与 4G。WiFi 上的玩家和 4G 上的玩家受到的影响有区别吗?
  • 按国家/地区。不言自明,但在处理涉及季节性、游戏服务器位置等假设时会很有帮助…
  • 按用户获取来源。如果问题只影响新用户,那么了解我们在有机活动与付费活动、代销商活动与营销活动之间的 KPI 行为是否有任何差异至关重要…在过去几天中,交易量是否有显著变化(考虑至少 30 天的时间来检测这些变化)
  • AB 测试。如果你正在进行多变量测试/实验,不要忘记检查一个特定的变量是否导致了即将到来的危机。

关联并消除

细分有助于了解和找到哪些球员受到影响的证据,从而有助于缩小搜索范围。但是,我们不应该忘记良好的旧技术图表分析,以了解什么可能导致手头的问题。在这里,我们使用与单受试者设计实验相同的原则,并使用视觉分析来快速了解是否存在与可能影响游戏状态的事件的相关性(在单案例设计研究中系统地使用视觉分析来评估结果)。

为了实现这一点,我们希望绘制一段时间内的相关 KPI,并将基线移动与某些事件相关联。

专业提示:让团队的所有成员都参与绘制/记录可能影响基线的特定事件。当你不得不回顾和关联基线运动和特定事件时,这是非常有用的。如果你需要灵感,这里列出了一些常见的东西:

  • 营销计划和特色。我们想检查一些营销活动是何时发生的,或者是否有病毒/特色活动。这些事件通常会导致新玩家的大量涌入,而这些新玩家可能并不最适合该产品。在这些事件期间和之后,一些早期 KPI 会受到影响,这是正常的。
  • AB 测试。除了对当前的 ab 测试进行细分之外,回到过去并理解推出一个变体是否会产生不可预测的负面长期影响通常也是相关的。
  • 游戏更新,补丁。更多的时候,游戏更新或补丁引入的错误会成为危机的根源。当涉及到先前更新的不可预见的长期影响时,要特别好奇。当你觉得你的产品知识不是最好的时候,仔细检查所有引入的变化并询问团队成员他们是否认为某些东西对游戏有负面影响是很重要的。
  • 已知的错误。有时还有众所周知的“宠物”虫子。这些曾经被标记为低优先级,并被归入 bug backlog 的遗忘区。当团队发现与新内容的新协同作用,或者环境发生变化,并且它们的相关性增加时,其中一些 bug 会回来困扰他们。
  • 直播行动。现场修改或游戏内事件。

无害的“宠物”细菌有时会演变成超级细菌,对游戏 KPI 产生负面影响。Joshua Hoehne 在 Unsplash 上拍摄的照片

根据危机的性质,你的游戏分析师工作和优先事项可能会在一段时间内发生变化,从几天到几周。因此,我在这个系列中又增加了两篇文章,重点介绍预防措施以及如何处理后果。

我喜欢在工作中遵循一个著名的“5-P”咒语:适当的准备可以防止糟糕的表现。在游戏分析师工具上了解更多关于如何为危机做准备,以防止和解决危机

如果你已经准备好处理产品危机避免后的事情,请阅读本系列的第三部分,也是最后一部分:游戏分析师处理危机后果指南

原载于 2021 年 3 月 8 日 https://danielafontes.com**的

数据科学和组织之间的差距

原文:https://towardsdatascience.com/the-gap-between-data-science-and-the-organization-7cfa8b0e2be5?source=collection_archive---------33-----------------------

为什么数据科学项目失败的次数比成功的次数多?

资料来源:联合国人类住区规划署

当我开始在数据分析领域的旅程时,“数据科学家”这个词并不存在,但现在它被称为“十年后最性感的工作”:可能仅次于 SpaceX 和维珍银河的宇航员!数据总是让我着迷,我相信在未来的许多年里,它将继续如此。在这段旅程中,我看到了许多项目在不同阶段的失败和瓦解。VentureBeat 在 2019 年的引用仍然是正确的:“87%的数据科学项目从未投入生产”,有几个原因需要认真干预和修复,以提高这个数字。

在 Gartner 的最新预测中,有几点值得注意:

  1. 到 2025 年,80%寻求扩展数字业务的组织将会失败,因为他们没有采用现代化的数据和分析治理方法(Gartner,2021 年)
  2. 到 2022 年,只有 20%的分析洞察将带来业务成果(Gartner,2019 年)
  3. 到 2025 年,80%关注业务成果而非数据标准的数据和分析治理计划将被视为基本业务能力(Gartner,2021 年)
  4. 到 2024 年,在采用高级合同分析解决方案的企业中,合同审查流程所需的人工工作量将减半(Gartner,2021 年)
  5. 到 2023 年,没有首席数据官(CDO)的企业中,50%的首席数字官需要成为事实上的 CDO 才能成功(Gartner,2021)

看一下第 2 点和第 3 点之间的区别,数据分析对业务成果的影响的巨大差距表明,为什么组织应该尽快修复他们的数据分析能力。这让我开始探究数据分析项目失败的 5 个原因 以及如何弥合这一差距。对于你和你的组织来说,这将是一个启示,看看这些撤退和重新评估。

1.将它视为一个项目,而不是一个产品

资料来源:联合国人类住区规划署

大多数组织认为数据科学计划是项目,而不是产品。这样的场景为独立项目腾出了空间。没有合适的产品前景,项目会被推到一个非常高风险的失败区域。这些项目在部署后很快就失去了重要性,原因如下:

  1. 利益相关者失去兴趣或最终用户不采纳您的结果
  2. 没有反馈循环,没有对现有解决方案的更新
  3. 开发团队不平衡,导致没有未来的维护和支持
  4. 对当前的业务挑战没有价值

当组织将数据科学视为一种产品时,它就会深入整合到战略、价值驱动的计划以及所有业务部门中。这类组织将拥有根深蒂固的数据驱动型决策文化。

2.在 C 级和 B 级之间丢失

资料来源:联合国人类住区规划署

如果没有高层和中层管理人员的组织支持,数据分析和业务成果就不会有效。每个人都应该经历数据分析的成熟曲线,从描述性分析到说明性分析(换句话说:从仪表板到预测性结果,如我的客户停止使用我的产品的概率),以欣赏和理解数据分析产生的价值。当学习曲线需要更长的时间或中断时,这就是价值链丢失的地方,项目无法向组织展示其意义。

在产品开发的所有阶段都需要与非技术利益相关者进行有效沟通,以实现可持续发展。这需要“数据讲故事”的艺术来对方法及其通过这些决策产生的价值进行有力的叙述。

3.数据的可用性/理解

资料来源:联合国人类住区规划署

这是任何分析团队和产品最常见的问题之一。它总是需要数据科学家的一双神奇的眼睛,以正确的方式看到数据,以将其纳入数据管道。组织、收集、创建或购买数据可能是一项具有挑战性的任务。即使在你克服了障碍并让它变得可及之后,你还会遇到下一组障碍:

  1. 数据有偏差吗?
  2. 将数据用于预期目的是否道德和合法?
  3. 对数据进行切片和切块以获得描述性结果的正确方法是什么?
  4. 有没有时间等因素的影响?
  5. 如何清理数据以达到目的?
  6. 当涉及到 ML 时,如何充分地标记数据以最小化误差和偏差?
  7. 最大的威胁是:我如何保护数据并很好地管理它?根据 Gartner 的预测,到 2024 年,大多数组织将尝试基于信任的数据共享计划,但只有 15%的组织会成功,并在大多数业务指标上超过同行。

4.没有价值驱动因素的产品

资料来源:联合国人类住区规划署

在任何新计划的开始阶段,尽可能地仔细检查方法和业务结果以得出正确的计划总是很重要的。许多机器学习模型得到部署,并作为一个数字保留在数据库中,然后成为业务的宝贵见解。在多次重复反馈和微调结果后,当企业意识到他们无法再使用这些结果时,无论是因为新战略、新工具还是任何其他原因,预测都将消失,没有人使用或更新它。

当产品创造了巨大的价值,并与下游系统紧密相连时,下游系统总会有反馈来完善结果。通过与商业实践相关,社交倾听等技能将对产品产生巨大影响。金玉良言:耗尽价值是产品寿命缩短的标志。

5.数据科学家

资料来源:联合国人类住区规划署

有时,一个错误的数据科学家自己可能会对项目构成挑战,这个问题有很多原因。

1。对商业知识了解较少

对于任何数据科学家来说,第一步也是最重要的一步是了解问题的背景以及解决方案将如何有所帮助。没有这方面的知识,解决方案就会陷入困境,并随着进展变得更加混乱。

2。具有和不具有可视化的数据讲述能力

在与利益相关者交谈时,遵循说话、解释和绘图的神奇规则。与利益相关者的互动越多,对结果的信心就越高,影响就越大。当链条断裂时,就会产生一个空白,导致对解决方案的信心降低。

3。ML 问题难度和方法适应性

过于复杂的方法适用于简单的问题,或者将问题简化为过于简单的陈述并试图解决它。这两种情况都是恶性的,需要与利益相关者一起以适当的权重来解决。

4。没有得到合适的人才

经验、领域理解、数据和工具的舒适性对于解决复杂的业务问题最为重要。

关闭:

产品生命周期在不同阶段会面临不同形式的挑战,正如阿尔伯特·爱因斯坦所说:“不要成为成功人士。更愿意成为一个有价值的人”,这句话同样适用于我们正在打造的产品。当我们所做的事情有价值时,成功就不可避免地会随之而来。

我将留给大家一些 Gartner 的预测来思考:

  1. 到 2025 年,80%寻求扩展数字业务的组织将会失败,因为他们没有采用现代化的数据和分析治理方法
  2. 到 2024 年,30%的组织将投资于数据和分析治理平台,从而增加可信见解和新效率的业务影响。
  3. 到 2024 年,大多数组织将尝试基于信任的数据共享计划,但只有 15%的组织会成功,并在大多数业务指标上超过同行。
  4. 到 2024 年,用于开发 AI 和分析解决方案的 60%的数据将是合成生成的。

您的数据策略中的差距(第 1 部分)

原文:https://towardsdatascience.com/the-gap-in-your-data-strategy-part-1-e078cc4be526?source=collection_archive---------39-----------------------

两个简单的问题让您的业务更加数据驱动

杰西卡·阿伦兹在 Unsplash 上的照片

每个企业都不断面临新的挑战,决策者的任务是快速应对这些挑战。面对这些障碍,运营商和领导者越来越多地转向数据来确定和执行他们的业务战略。然而,当他们花费时间和资源收集、清理和集中的现有数据不是万灵药时,企业领导人开始感到沮丧。我们看到关键决策者在他们想要的结果和他们拥有的数据之间出现了鸿沟。

看到我在职业生涯中观察到的这种差距,我的反应是集体举手说,“好吧,看起来数据在这里实际上是无用的,让我们用另一种方式来解决这个问题。”

但这不应该是回应。我认为,你只需要问两个简单的问题来弥合这一差距,这将把你的业务目标与你的数据战略联系起来,并将你的业务转变为真正由数据驱动的业务。

那么我们遗漏的这两个问题是什么?

1。我们需要什么数据来解决这个问题?

有一种误解,认为数据只是出现,这当然不是真的,数据必须被故意收集。鉴于企业所处的动态生态系统,期望在新的关键问题出现时访问所有数据是非常不合理的。数据需要时间来检测、清理和分发。因此,我们不应该期望正确的数据随叫随到,在没有数据驱动的情况下放弃数据驱动的方法,而是需要改变我们的思维模式,问问自己我们真正需要的数据是什么。一旦我们做到了这一点,我们就可以进入第二个关键问题。

2。这些数据值得收集吗?

虽然有些数据比其他数据更容易收集,但这总是需要刻意的努力。如今的企业倾向于根据收集数据的难易程度来收集数据,但我们更应该采用基于价值的方法来确定我们应该收集哪些数据。这意味着评估净值()。潜在价值减去成本)。

我还想强调一下这些问题的顺序。你应该试着回答第一个问题,不要考虑第二个问题。消除你思维中的束缚,将有助于你和你的团队想出更多样、更有创意的解决方案。我们都有自己的看法,知道什么数据有价值,或者甚至可能收集,最好进入构思阶段,让团队中的每个人都在同一页上——这是指任何空白页——不要限制你的想法。

安吉丽娜·利文Unsplash 上拍摄的照片

我将分两部分讨论这个话题。

在第 1 部分中,我将通过一个说明性的例子,重点介绍弥合数据策略中这一差距的高级框架。第 2 部分将重点讨论如何建立定性和定量的论据,以获得转向基于价值的数据收集策略的支持。

弥合我们数据战略中的差距—示例

假设我运行一个数据科学相关内容的电子邮件列表,该列表遵循免费增值模式。任何人都可以注册,每周免费收到一篇文章,但他们也可以注册“高级”订阅,每周在收件箱中收到三篇新文章,而不是一篇。

Stephen Phillips 在 Unsplash 上拍摄的照片

作为这份邮件列表的主人,我有一个明显的问题。

我如何说服免费订阅者开始为我的内容付费?

现在,我有 5%的人注册为免费用户,每个月都会转换为高级用户。然而,我注意到免费订阅者通过评论对我的文章给予了很多积极的反馈,这向我表明,他们正在从一篇分配的文章中获得价值,并且可以通过付费订阅从额外内容中获得更多价值。这让我相信,通过建立一个工具来更好地向免费读者展示我的内容的价值,有可能提高我的转化率。

接下来,我需要某种解决方案来更好地向免费读者展示我的内容的价值。

我咨询了我的智囊团,我们决定我可以把我每周写的三篇文章中最感兴趣的一篇发给免费读者。这将有助于向每个读者展示更多的价值,从而提高免费到付费的转化率。但是现在我有一个新的问题,我如何确定我的读者最感兴趣的是什么?

现在,我来谈谈数据鸿沟,我可以用我们的两个问题来弥补这个鸿沟:

1.我们需要什么数据来解决这个问题?

由于数据科学是一个如此广泛的话题,我认为收集关于他们对数据科学世界的哪些子集最感兴趣的数据对于解决这个问题至关重要。这一决定让我为我的电子邮件列表的注册流程增加了一个步骤,要求人们选择他们最感兴趣的三个数据科学主题(例如机器学习、可视化、数据策略等)。)

但是收集这些数据并不是没有代价的。

2.这些数据值得收集吗?

我可以听到营销人员在这里尖叫,给注册流程增加任何摩擦都会降低我的整体注册率。虽然这可能是真的,但我们需要记住我们基于价值的方法,问问自己:我注册率的下降值得我转换率的上升吗?

我认为用定性和定量的论证来解决任何商业问题都是很重要的,我将展示一个策略来做到这一点。现在,我想强调解决您的数据策略中的差距的过程,但在本文的第 2 部分,我将深入研究如何让您接受这种方法。

在这个例子中,我们已经铺设了跨越这个数据鸿沟所需的桥梁

不要决定一个基于直觉的方法来解决这个问题(比如说,“哦,机器学习现在都在炒作,让我们给免费读者发一些关于它的文章吧!”),我们选择弄清楚我们需要什么数据来解决我们的问题。然后,我们提出了一个问题,即我们收集这些数据是否值得(同样,我将在第 2 部分讨论这个问题)。

现在,我只想强调提出这两个问题的重要性。

数据对企业的价值已经在市场上得到证明。我会让读者决定是否真的是新的石油,但是,如果没有看到关于人工智能的文章,或者像雪花这样的数据公司的大规模 IPO,很难阅读新闻。然而,并不是所有的数据都是平等的,也不是所有的数据都会进入您的数据湖。

当我们在使用数据解决业务中最大的问题时遇到摩擦时,我们需要改变我们的态度。现在,当不容易采用数据驱动的方法时,我们可能会放弃。但是,我们需要通过采取基于价值的方法来看待我们的数据,从而克服这个障碍。同样,这伴随着问这两个问题:

1。我们需要什么数据来解决这个问题?
2。这些数据值得收集吗?

您的数据策略中的差距(第 2 部分)

原文:https://towardsdatascience.com/the-gap-in-your-data-strategy-part-2-66dd6f731956?source=collection_archive---------26-----------------------

行业笔记

跨越鸿沟的数据驱动解决方案

在这篇文章的第一部分中,我认为企业需要问两个关键问题来更有效地实现数据驱动。

1。我们需要什么数据来解决这个问题?
2。这些数据值得收集吗?

如果你还没有看过这篇文章,我建议你在阅读之前先看看。

在第 1 部分中,我展示了一个假想业务的场景,该业务管理数据科学相关内容的电子邮件列表。简单回顾一下,我的邮件列表遵循免费增值模式,任何人都可以注册,每周免费获得一篇文章。人们还可以订阅高级订阅,每周获得三篇有见地的数据相关文章,而不是一篇。

作为一名企业家,我被激励向更多的人提供更多的内容,并在这个过程中谋生,我希望获得尽可能多的优质订户。现在,我有这样一个场景,我的登录页面有 2%,或者说每 10,000 个访问者中有 200 个注册了我的电子邮件列表。还不错。

在这 200 名注册用户中,我让其中的 5%或 10 人在他们收到的前 3 封电子邮件中升级到 premium。我假设这些人会订阅 premium,而无需我进行任何额外的干预。我们现在将忽略这些人,因为我们认为不管我们在这里讨论的任何干预措施,他们都会注册。

Austin Distel 在 Unsplash 上拍摄的照片

在注册后的前 3 封电子邮件中没有升级到 premium 的人中,3%的人会在收到的前 52 封电子邮件中订阅 premium(大约 1 年,假设我很努力!)所以,每 10,000 个访问者中,我会有大约 190 人注册,并且没有立即成为高级订阅者的打算。这意味着,在 10,000 名访问者中,我预计他们中的 6 人会暂时获得免费内容,最终看到我的内容的巨大价值,并转向溢价。

如何从 6 开始增加这个数字?

正如我在这篇文章的第一部分中所描述的,我认为我可以通过向免费读者发送我每周写的三篇文章中他们最感兴趣的一篇来实现这个目标。我的假设是,向每个用户发送最相关的文章将有助于他们看到我的电子邮件列表的价值。似乎很合理。

所以我问这个问题:我需要什么数据来解决这个问题?

为了了解我的用户对什么感兴趣,我想在我的注册流程中增加一个额外的步骤,要求人们选择他们最感兴趣的三个数据科学主题(例如机器学习、可视化、数据策略等)。)

然而,这个世界上没有免费的午餐。我有一个假设,如果我在我的注册流程中增加一个额外的步骤,我会观察到我的注册率下降,因为不耐烦的读者可能会被另一个在线表单阻止。

所以现在我提出这样一个问题:这些数据值得收集吗?

这个问题可以重新措辞,以很好地适应分析环境。收集这些数据的净收益是积极的吗?这类问题可以用 成本收益法 来解决。

进行成本效益分析的一个常见问题是,他们要求分析师做出许多静态的假设,这些假设可能是不现实的或不明智的。这些假设的不可靠性会破坏你的整个分析。我想积极主动地解决这个问题。

这就是为什么我将使用一个包含一些随机性的模拟来进行成本效益分析。我将介绍这个模拟的框架及其结果。如果你想看模拟的代码,你可以在我的 Github 页面上查看。

成本效益模拟

承认你的偏见,并牢记在心

在你开始任何编码之前,分析师应该采取的第一步是承认他们的任何偏见。例如,我可能会对收集读者偏好数据的想法感到非常兴奋,这可能会让我设计一个成本效益分析,并得出“是的——好主意!”

有这种偏见没关系。重要的是承认它,并在你做分析的时候记住它。当你做一个假设时,问问你自己,如果你持有与你目前倾向的完全相反的信念,这是否现实。这将保持你的诚实和你的分析稳健。

模拟设计

这个模拟将有 3 个步骤,这反映了在我的电子邮件列表注册/转换过程中发生的关键事件。我选择模拟 90 天的活动,但这可以在模拟代码中轻松更改。

  1. 日流量:基于历史数据我知道我平均一天有 1000 左右的访客,900 ~ 1000 ~ 95%的时间都在下降。我的每日流量分布接近正态,所以我假设它将继续遵循这种分布。
  2. 注册:对于我的每次模拟运行,我假设我们继续看到 2%的注册率。然而,我们并没有假设向流程中添加新表单会对注册率产生固定的影响,而是允许有一些可变性,因为此时我们并不确定这种影响到底会是什么。
    我们最大的猜测是,增加这种形式会使我们的注册率从 2%下降到 1.9%,或者说阻止 200 个注册中的 10 个。同样,我们不能完全确定这种影响,所以我们允许一些可变性,但我们假设 95%的超时注册率影响将在 0 到 0.2 个百分点之间。
  3. 转换率:类似于注册率效应,我们希望在我们的结果中加入一些可变性。我们认为,这种新的针对性练习将我们的转化率从 3%提高到 4%是合理的,因此提高了 1 个百分点,但如果 95%的情况下效果在 0 到 2 个百分点之间,我们也认为这是合理的。

请注意,对于注册率和转换率,我们假设它们将遵循正态分布。我们选择用正态分布来模拟这些比率,因为它具有使值更接近我们假设的平均值的属性,但它不排除意外值,例如我们有针对性的文章发送的负面影响。我们认为这种情况不太可能发生,但也不是没有可能,所以我们想对这种不确定性进行建模。

展示结果:将你的分析建立在业务背景下

我经常听到有人呼吁数据科学家在展示他们的分析结果时,要设身处地地为观众着想。我认为这通常是一个好的实践,因为它迫使你把你的分析放在你试图解决的业务问题的背景中。然而,如果你围绕业务问题、你的利益相关者以及坦率地说,你公司的任何人来设计你的演示,而不是关注个人,那么你公司的任何人都将能够理解结果。

在这个例子中,我试图决定我是否会通过收集更多的用户数据和为用户管理我的内容来赚更多的钱,代价是可能阻止一些人注册。因此,我想以一种展示此提议解决方案的财务净收益的方式来框定我的结果。要做到这一点,我需要再加入一个假设,即付费用户对我来说值多少钱。

在这个例子中,假设我已经运行了这个分析,并且发现一个付费用户平均为我的企业创造了 60 美元。所以每月 5 美元。对于这种订阅,这意味着高级订阅用户的平均持续时间为 12 个月。

好吧,让我们来看看模拟结果。

我们可以用柱状图展示可能性的范围。平均 90 天的收入影响为正,约为 550 美元。中值影响也大致相同—这告诉我们,在我们的模拟中,一半的结果产生了 550 美元或更多的收入。

看到各种可能性是很重要的——根据我们的假设,我们可以看到从-1,500 美元到 2,500 美元的净收益。我在这里也要强调的是,在中,80%的模拟运行返回了非负的净收入变化。

这告诉我们,做出这种改变并不是没有风险的,但如果影响大小与我们假设的大致相同,我们通常会期望获得比其他情况下更多的收入。这足以说服我采取行动!

儿童马戏团在 Unsplash 上拍摄的照片

再现性和扩展性

这个模拟练习的另一个重要特征是它很容易重复(见代码)并且它的假设很容易调整。如果您与对这些假设有不同信念的多个利益相关者一起工作,这一点尤其重要。很容易测试出不同的输入值。

概述

这篇文章展示了一个例子,说明我们如何使用基于模拟的成本效益分析来回答这个问题:这些数据值得收集吗?

这当然不是回答这个问题的唯一方法,而且很可能解决方案不会像我在这里提出的那样简单明了。但这就是为什么你的公司聘请了像你这样的智能数据科学家来解决这个问题!

说明我们是否应该收集数据是很重要的,但是如果不促进一种文化,让你和你的团队问这两个重要的问题,你甚至无法达到这个阶段。

1.我们需要什么数据来解决这个问题?

2.这些数据值得收集吗?

Gartner 元数据管理魔力象限刚刚被废弃。这是你需要知道的一切。

原文:https://towardsdatascience.com/the-gartner-magic-quadrant-for-metadata-management-was-just-scrapped-d84b2543f989?source=collection_archive---------1-----------------------

这标志着我们应该如何处理元数据的范式转变。下面是原因和方法。

苏珊·Q·尹在 Unsplash 上的照片

今年一月,我写道元数据管理正处于一个转型飞跃的风口浪尖。

本周,Gartner 朝着这一目标迈出了一大步,它放弃了元数据管理解决方案的魔力象限,代之以活动元数据的市场指南。这一变化预示着在当今的现代数据堆栈中处理元数据的新方法。

无论您每天处理的是千字节还是兆字节的数据,您可能都想知道这到底意味着什么。

  • 传统元数据管理为什么会失败?
  • 传统元数据和主动元数据有什么不同?
  • 为什么这份报告标志着元数据管理模式的转变?
  • 这对当今的数据领导者意味着什么?

在本文中,我试图解开这些问题(没有任何营销术语),并分享我对元数据管理发展方向的预测。

元数据管理的过去和现在

元数据作为一种组织信息的思想,自古就有,但元数据的现代思想要追溯到 20 世纪 90 年代末。

元数据管理开创了一门 IT 学科。随着我们拥抱互联网,随着数据类型和格式的爆炸式增长,IT 团队负责创建一个“数据清单。”

然后,随着数据在 IT 团队之外传播并变得更加主流,数据治理的想法就生根发芽了。这是管理围绕数据的人员和流程的原则,以确保企业数据的可用性、完整性和安全性。

随着数据治理的想法开始流行,许多公司喝了库尔 Aid,在数据上投入了全部。他们为数据治理创建了完整的部门,为被称为“数据管家”的人建立了新的角色,投资于数据治理委员会,等等。

这些团队开始意识到他们需要软件来管理所有这些元数据。这开启了元数据管理的黄金时代。

和任何新技术一样,事情发展得很快。

新的公司成立了,现有的公司创造了新的元数据产品。人们需要一种方法来整理所有这些新的元数据软件选项,因此 Gartner 开始发布他们的元数据管理魔力象限报告。像 Informatica、Collibra 和 Alation 这样的公司 Gartner 报告中的所有领导者——利用这一市场炒作迅速增长。

数十亿美元的公司诞生了,数亿美元花在了元数据管理软件上。

那么,在经历了这一切之后,为什么 Gartner 上周取消了他们的报告呢?为什么取代它的市场指南以不祥的注释开始,“传统的元数据实践是不够的…”

传统元数据管理失败的原因可以用一个词来回答:被动

如果你形容某人消极,你的意思是他们不采取行动,而是让事情发生在他们身上
柯林斯字典

如果你谷歌“被动”这个词,这是第一个结果。老实说,没有更好的方法来解释早期被动元数据系统的根本失败。

  • 传统的元数据管理工具没有采取行动。通过简单地编目或存储元数据,传统的元数据系统无法从元数据信号中驱动任何“动作”。这降低了元数据对数据平台和数据消费者的影响。
  • 传统的元数据管理系统让事情发生在他们身上。传统的元数据系统基本上是静态工具,依靠人工来管理和记录数据。这意味着元数据计划的成功取决于实施它的人。

这些基本缺陷导致了传统元数据管理工具的最终失败。

因此,尽管在元数据管理软件上投入了大量资金,但大多数公司都在努力使他们的元数据项目取得成功。几周前,一家大公司的高级数据主管谈到了这些工具,“每个人都知道我们购买的工具是昂贵的货架软件。

一家实施元数据管理解决方案的著名专业服务公司的顾问证实了这种观点:“我们约有 50%的业务是这样的,公司中有人花费数百万美元购买了一个昂贵的工具,2-3 年后发现它不起作用或没有被使用,于是让我们来尝试并拼命解决这种情况。”

范式转变:从被动到主动的元数据

今天,我们正处于元数据管理的转折点,这是一个新时代的开始,其标志是以一种全新的方式思考元数据及其在数据堆栈中所扮演的角色。这就是 Gartner 新市场指南的主题活动元数据的用武之地。

快速搜索“主动”一词,会出现与被动截然相反的短语:

  • “从事行动;以精力充沛的工作、参与等为特点
  • 处于存在、发展或运动的状态
  • “具有快速运动的能力;敏捷”

花一点时间在元数据的上下文中思考这些短语,它们描绘了活动元数据可能是什么的画面。

主动元数据:一个永远在线、智能驱动、面向行动的系统,与其被动、静态的前身截然相反。

主动元数据平台的 4 个关键特征

根据 Gartner 的说法,活动元数据是“一组支持持续访问和处理支持持续分析的元数据的功能……”

这实际上意味着什么,主动元数据平台与传统元数据管理平台有何不同?以下是你应该留意的四个基本特征。

活动元数据平台始终处于开启状态。

主动元数据平台不会等待人类通过委员会手动输入元数据。相反,他们在现代数据堆栈的每个阶段都在不断地收集元数据—日志、查询历史、使用统计数据…几乎是任何类型的元数据,随时随地,每秒钟。

主动元数据平台不仅仅收集元数据。他们从元数据中创造智慧。

与传统的元数据平台不同,主动元数据平台不断处理元数据,以连接各个点并创建智能。

例如,通过解析来自查询日志的 SQL 代码,主动元数据平台可以自动创建列级血统,为每个数据资产分配流行度分数,甚至推断每个资产的潜在所有者和专家。

主动元数据平台真正突出的是它们是真正的学习系统,这意味着平台的智能只会随着时间的推移而增长。随着人们越来越多地使用平台,平台观察到数据堆栈中更多的元数据,最终用户体验将会变得更好。

主动元数据平台不仅仅停留在智能上。他们推动行动。

这可能是主动元数据平台从其前辈身上迈出的最重要的一步。他们不再只是被动的观察者,而是在实时数据系统中推动建议、生成警报和实施智能。

例如,主动元数据平台可以利用过去的使用日志来了解哪些数据集使用得最多,并相应地推荐数据管道运行的优化调度。然而,真正的活动元数据平台不会就此止步。它会将此建议发送到数据管道系统,并通过本机集成进行实际调整。所有这些都没有任何人工干预,进一步推进了真正的数据操作驱动系统的原则。

另一个例子是使用活动元数据来提高数据质量。当在源表中检测到数据质量问题时,系统可以自动停止下游管道,以确保不正确的数据不会到达仪表板。或者更好的是,该系统可以使用过去关于数据质量故障的记录来准确预测出了什么问题,并在没有任何人工干预的情况下修复它。

活动元数据平台是 API 驱动的,支持嵌入式协作。

嵌入式协作是指工作发生在你所在的地方,摩擦最少。活动元数据平台的动作层最终使得嵌入式协作成为可能。

如果你可以在获得链接时请求访问数据资产,就像使用 Google Docs 一样,而所有者可以在 Slack 上获得请求,并在那里批准或拒绝它,那会怎么样?

虽然这个工作流程听起来很简单,但是无缝实现却非常困难(这也是它可能还不存在的原因)。它需要最终用户的工具(用户请求访问数据,如数据目录)与访问和授权策略引擎连接,该引擎会在通信工具(如 Slack)上向数据所有者发送请求。

如果没有一个活跃的元数据平台来协调整个数据堆栈的操作,我们将永远无法实现像这样的嵌入式协作工作流。

元数据的下一步是什么?

多年来,元数据管理远远落后于现代数据堆栈的其他部分。但在 2021 年,元数据似乎终于开始赶上了。

创新正在加速。我敢肯定,在过去的 12 个月里,这个领域的初创公司比过去十年都多。(我的同事 Rohan 密切跟踪太空,他甚至决定创建一个数据目录的目录!)

Gartner 放弃其元数据管理魔力象限并引入活动元数据作为新类别的重大决定是向前迈出的一大步。

这最终抛弃了传统的、被动的元数据管理方法,为元数据的新时代铺平了道路。

与 Gartner 的任何重大公告一样,此次公告可能会给市场带来一些短期混乱。传统的元数据产品将争先恐后地将自己重新标榜为“活跃的元数据平台”。一些公司实际上将开始在他们的产品中添加一些活动元数据功能,这进一步增加了混乱。当然,更多的创业公司将会成立。

但最终,在接下来的 12-18 个月中,一个或多个真正基于正确设计原则从头开始构建的活跃元数据平台将成为该类别的最终赢家。

对于现代数据堆栈中的元数据来说,这是一个不可思议的时刻。希望这一次我们最终能做对。

发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章 【亚特兰】 在此订阅。

开始量子机器学习的温和方式

原文:https://towardsdatascience.com/the-gentle-way-to-start-with-quantum-machine-learning-5e9ff61d886b?source=collection_archive---------21-----------------------

量子贝叶斯网络可能是你正在寻找的

量子机器学习要不要入门?看看 动手量子机器学习用 Python

作者图片

如果你想开始学习量子机器,你会喜欢量子贝叶斯网络(QBN)。它们很直观,因此很容易理解。然而,他们使用基本的量子计算概念。因此,您可以亲自动手学习这些概念。

在我每周的量子机器学习挑战中,我问了一个简单的问题:“一个学生能解决问题吗?”

原来解决方案是量子贝叶斯网络。

“什么?!"你在想,“这个挑战几乎不包含任何信息。更不要说一些把柄来决定如何解决它,并最终去解决它!”

当然,你是对的。我在制定挑战时提供了更多信息。

但是,这篇文章不是关于挑战本身。如果你对挑战感兴趣,你可以在这里找到它。相反,这篇文章是关于一个简单的量子贝叶斯网络如何教你量子计算和机器学习的基本概念。

当我问学生是否能解决这个问题时,你可能会说是或不是。两个答案都可能是正确的。这才是重点。除非学生尝试解决,否则我们不知道。

在此之前,我们只能推测。要回答这个问题,我们需要表达我们的信念。所以,充其量,我们的答案是概率性的。例如,可以是“我相信这个学生能解决这个问题”“她有 50%的机会解决这个问题。”

贝叶斯网络和量子计算共享概率观点。

我们能想到的最简单的变量就是布尔。这是一个有两个可能值的变量。是真或假,1 或 0,或者学生解决问题与否。在贝叶斯网络中,我们使用伯努利分布来描述布尔变量。它表示任一值的概率。下图显示了示例性的伯努利分布。

作者图片

在量子计算中,我们使用量子比特(qubit)。当你看到它时,它要么是 0,要么是 1,每一个都有明显的概率,取决于不可见量子位的状态。

例如,如果量子位处于叠加态,比如|+⟩,测得它为 0 的几率是 50%。因此,量子位类似于我们刚刚谈到的伯努利分布。

除了变量,贝叶斯网络还包含它们之间的条件依赖。举个例子,如果学生读了我的书 用 Python 动手做量子机器学习,解决的几率增加到 90%。现在,我们有了一个双变量网络,如下图所示。

作者图片

在量子计算中,我们使用纠缠来模拟依赖性。纠缠量子位是强相关的。如果我们测量一个量子比特为某个值,纠缠的量子比特瞬间跳到与那个值对应的状态。下图显示了得到的测量概率。

作者图片

第一个量子位(右上角的数字)代表学生是否读过这本书。并且,第二个(左下角的数字)量子位代表学生是否能解决这个问题。如果我们只看第一个量子位为 1 的情况——这意味着她读过这本书——我们可以看到,她在 90%的情况下都解决了问题。

如果她没读过这本书,她有 50%的机会。在这种情况下,我们只看第一个量子位为 0 的状态。

她解决这个问题的总体机会是 74%。这是第二个量子位为 1 的所有状态的总和。

结论

贝叶斯网络是一个简单而强大的机器学习工具。而且,他们很容易开始量子机器学习,因为他们分享了量子计算中最重要的概率观点。

我们经历了伯努利分布如何代表叠加态的量子位。我们看到,我们可以使用纠缠来模拟贝叶斯网络中变量之间的依赖关系。

想了解更多关于量子机器学习和量子贝叶斯网络的知识吗?在我的书 用 Python 实践量子机器学习中,我们从零开始构建了一个 QBN,训练它解释缺失值,并使用它进行推理。

免费获取前三章这里

贝叶斯数据分析最温和的介绍

原文:https://towardsdatascience.com/the-gentlest-of-introductions-to-bayesian-data-analysis-74df448da25?source=collection_archive---------10-----------------------

如何基于数据以自然的方式思考

肯尼斯·约翰·德拉·维加在 Unsplash 上拍摄的照片

如果你曾经上过大学的统计学课或在线课程,你可能会想起假设检验、置信区间或 p 值等术语。如果是这样的话,你所学的就是所谓的“经典”或“频率主义者”统计学,这是教授统计学 101 的主要方法。然而,还有另一个学派叫做贝叶斯统计,它建立了一种不同的思考数据和模型的方式。

贝叶斯方法经常在大学和在线课程中被忽视,因为它更难解释、理解和应用。我认为这样的品牌是不公平的。实际上,我认为贝叶斯思维方式更自然,并且比经典方法有更大的优势。在本文中,让我尽我所能为您提供贝叶斯统计的最温和的介绍。让我们开始吧!

用数据更新信念

想象我们在台球桌旁。你背对着桌子站着,这样你就看不见了。我把一个白球放在桌子上的某个地方,然后问你它在哪里:在桌子的右边,左边,还是中间?自然,你不知道任何事情,你所能做的就是猜测。然后,我开始在桌子上随机放置彩球,每次我这样做时,我会告诉你新的球是在白色球的左边还是右边。5 轮过后,桌子(你仍然看不到)可能看起来像这样:

台球桌后,随机放置白色和五色球。图片由作者提供。

根据我告诉你的,你知道四个彩球在白色球的右边,一个在左边。它告诉你白球的位置了吗?当然了!因为彩球是随机放置的,而且大多数都在白球的右边,你可能会得出结论,白球更有可能在桌子的左边。

花点时间思考一下刚刚发生的事情:你根据数据更新了你对白球位置的看法。最初,您对它的位置一无所知:从您的角度来看,它同样可能在表的任何部分。现在,有了五个数据点,你就知道了一些事情,尽管这个事情不是很精确:球更可能在左侧而不是右侧。

贝叶斯方法是基于数据更新一个人的信念。

现在,如果我在桌子上放上 50 个彩球,它会是什么样子?

台球桌后,随机放置在白色和 50 色球。图片由作者提供。

在这一点上,我会告诉你,50 个彩球中有 9 个(18%)在白色球的左边,而剩下的 41 个(82%)在右边。基于这些信息,你可以更新你对白球位置的看法:它很可能在离桌子左边缘五分之一的地方。你拥有的数据越多,你的估计就越精确。

简而言之,这就是贝叶斯推理:你开始时对感兴趣的量——白球的位置——有一些先验的信念。你之前的想法是它同样可能在桌子上的任何地方。然后,随着新数据的到来,你已经更新了你的信念,直到你拥有大量数据并能够精确定位球的位置——这被称为后验信念,这是基于数据进化后的先验信念。

贝叶斯思维方式是人类的天性。

我认为这种贝叶斯思维方式实际上就是我们的思维方式。考虑这个琐碎的现实生活中的例子。你要出门,不知道该不该带伞。最近天气很好,所以你认为你不需要——那是你以前的想法。然后你在电视上看到一个天气预报员预报有 50%的可能性会下雨,这让你更新了你的信念,考虑带上雨伞。当你向窗外望去,看到乌云向你逼近,你肯定这把伞可能有用——这是你的后见之明。但是这种更新信念的思维方式与数据、统计和模型有什么关系呢?

贝叶斯三步走

贝叶斯方法有三个特点,你需要弄清楚:

  • 参数有分布,
  • 概率是主观的,
  • 贝叶斯公式很酷。

我们一个一个来看。

参数有分布

在统计学中,参数是一些我们感兴趣的未知量,例如桌子上白球的位置,或者花哨的神经网络中的权重。我们通常应用一些统计程序或拟合机器学习模型来从数据中估计它们。在经典统计学中,这种估计是固定值,是固定不变的数字。想想传统的线性回归:你运行它,得到回归系数。

在贝叶斯方法中,参数不是数字,而是随机变量。这意味着它们可以用给定的概率取许多不同的值,由它们的概率分布描述。考虑下面的参数:白球到桌子左边缘的距离,以厘米为单位(桌子有三米长)。最初,你先前的想法是球同样可能在距离左边缘 0 到 300 厘米之间的任何地方。下图左侧面板中的分布反映了这一点。放置 5 个彩球后,你对白色球位置的后验信念(以概率分布表示)可能与中间面板中的信念相似。一旦所有 50 个彩球都在桌子上,你可以再次更新你的信念来表达你对白色球的位置更加确定。

图片由作者提供。

注意概率分布是如何捕捉到我们对参数的了解,以及我们对它有多确定。分布越窄,可能值的范围就越小,因此我们就越有把握。

概率分布反映了我们对参数的了解以及我们对参数的确定程度。

概率是主观的

在贝叶斯方法中,我们正在处理所谓的主观概率。不,这并不意味着它在某些方面不公平或有偏见。

关于概率定义的讨论是一个长期的数学和哲学争论。抛开所有这些争议,一个流行的定义是频率主义概率,它指出概率是重复试验的频率。为什么骰子掷出六的概率是 1/6?因为如果你滚动它 6 00 万次,你会得到大约 1 00 万个 6。如果你滚动它无限次,那么正好 1/6 次滚动将会是 6 次。这是 frequentist 的定义,整个 frequentist 统计数据都是基于这个定义,假设您的数据是一个单一的实现,或者说是一个试验,来自一组无限多的数据样本,这些样本都是您可以假设得到的。听起来奇怪还是不直观?因为事实如此。但这就是大多数经典统计学的工作原理。想想 95%置信区间的意义。如果您无限次地重新收集数据,获得稍微不同的数据样本,并对每个样本重复分析,则 95%的间隔将捕获感兴趣的参数。

相比之下,贝叶斯主义者将概率定义为主观,你可以认为是直觉概率。根据这个定义,你不需要重复试验。你可以根据自己的判断来定义概率。你可以自由地说:我认为切尔西有 80%的机会赢得本赛季的冠军联赛,这是一个完全有效的概率陈述。

贝叶斯主义者允许根据个人判断来定义概率。

你想知道为什么这个看似不重要的区别如此重要吗?请继续阅读,寻找答案!

贝叶斯公式很酷

贝叶斯推理的核心,是所谓的贝叶斯定理。听起来可能有点吓人,但这只是一个计算条件概率的简单公式。这些是什么?下面的例子借用了我在 DataCamp 上教的贝叶斯数据分析课程

盒子里有三个球:一个蓝色的,两个橙色的。图片来自作者在 DataCamp 讲授的 Python 课程中的贝叶斯数据分析。

想象一个盒子,里面有三个球。一个是蓝色的,两个是橙色的。你随便抽一张。它是蓝色的概率是P(blue)=1/3,它是橙色的概率是P(orange)= 2/3。这些是无条件的概率。另一方面,条件概率是某个事件的概率,假设某个其他事件已经提前发生。比方说,你画了一个橙色的球,把它放在一边。现在,盒子里还有两个球:一个蓝色的,一个橙色的。你随机抽取两个中的一个。它是蓝色的概率有多大?我们用P(blue|orange)表示这个量,读作:假设第一个球是橙色的,第二个球是蓝色的概率。在这种情况下,它等于 1/2。贝叶斯公式允许精确地计算这一点。它是这样说的:

贝叶斯公式。

其中 A 和 B 是一些事件。将其转换为 balls 示例会产生

你可以把贝叶斯定理看作是一个成立的概率公理。在这个玩具的例子中,它并不那么有用,因为要计算P(blue|orange),我们需要知道P(orange|blue),这同样很难(或很容易)得到。但事实并非总是如此!

贝叶斯公式是基于数据更新信念的秘密钥匙。我们只需要一个小技巧:我们可以用概率分布替换公式中的事件(比如抽一个蓝球),公式仍然成立!

贝叶斯公式是基于数据更新信念的秘密钥匙。

这意味着我们可以将其重写如下:

我把大写的 P 换成了小写的 p ,习惯上这样做是为了强调我们谈论的是概率分布而不是事件的概率。剩下的还是老样子。

我们感兴趣的左边的项是给定数据时参数的分布。这是我们的后验分布。为了计算它,我们需要三个量:

  • 给定参数的数据分布。这被称为可能性,取决于我们用于数据的模型。
  • 参数的分布。这是我们之前的分布。在之前的台球桌示例中,我们将使用 0 到 300 之间的均匀分布。
  • 数据的分布。这个可能很难计算,但是因为整个分数需要加起来等于 1(因为它是一个分布),你可以简单地把它想成一个归一化因子,使它等于 1。

因此,简而言之,为了得到参数的后验分布,我们需要得到先验分布,然后乘以基于我们选择的模型的似然性。但是如何将分布相乘呢?嗯,有几种方法可以做到:

  • 你实际上可以写下概率密度函数的公式,并在纸上相乘,希望你可以将结果简化为简单的东西。在某些情况下,当先验和可能性很好地对齐时,这是可能的。如果是这样,我们称这样的先验为相应可能性的共轭先验。这样的案例已经有人研究过了,所以实际上你不需要自己做任何笔和纸的数学计算,你只需要使用维基百科表格中的一个公式就可以了。
  • 如果上述方法不起作用,你总是可以求助于模拟方法,简称为马尔可夫链蒙特卡罗或 MCMC。这些对于这篇介绍性的文章来说太复杂了,但是它们所做的只是从参数的后验分布中模拟绘制。

无论选择哪种方法,最终结果总是参数的后验分布。理论讲够了,让我们来看看贝叶斯推理在实际中的应用!

掷骰子

我有一个六面骰子。但这不是普通的死亡。我的面上可以有任意数量的点,而不是一个、两个、三个、四个、五个和六个点。我会掷骰子 30 次,你的工作是根据你看过的所有掷骰子,估计每掷一次后掷出 6 的概率。这个概率可以是零、一或介于两者之间的任何值。

让我们从频率主义者的方法开始。没有任何数据,我们无法估计掷出 6 的概率。然后,我们的第一次掷骰子是 4。就这一个数据点,我们只能估计得到 6 的概率为 0。接下来,我们有一个 2,这不会改变我们的估计,但在此之后,我们连续得到五个 6,这使我们的估计达到 5/7 或超过 0.7(因为五次掷骰子在迄今为止的 7 次尝试中出现了六次)。下面的图显示了在每次掷骰之后,常客估计值是如何变化的。最后,在 30 次掷骰子之后,我们得到 6 的概率大约是 0.47。

观察每次掷骰后掷出 6 的概率——频率主义者的估计。图片由作者提供。

现在,让我们用贝叶斯方法。我们需要一个参数的先验,在看不到任何数据的情况下,你认为掷出 6 的概率是多少?一个合理的做法是假设我在虚张声势,而我的骰子实际上只是一个普通的骰子。如果是这样的话,掷出 6 的概率是 1/6。因此,我们的先验分布应该在 1/6 或 0.17 附近达到峰值,但是它应该足够宽以允许其他可能性。一个好的选择是 Beta(1,3)分布,你可以在下面的图的顶部看到,标记为“在滚动之前”。该图显示了这种先验信念是如何随着数据(或滚动)的到来而更新的。滚动结果与之前相同。每掷一次,我们的分布——掷出六点的概率的贝叶斯估计——变得更窄,表明估计更有把握。一般来说,它也向右移动,表明我们所追求的概率可能大于 0.17。最后,在 30 次滚动后,后验分布峰值在 0.42 附近,可能值的范围大约在 0.25 到 0.65 之间。

观察每次掷骰后掷出 6 的概率——贝叶斯估计。图片由作者提供。

实际上,我的骰子的六个面分别有 1、2、3、4、6 和 6 个点,这意味着掷出六的概率是 2/6 或 0.33。我模拟过掷骰子,在 30 次掷骰子中得到 14 个 6。两种估算方法如何比较?

从这种频繁主义者与贝叶斯的比较中,我们可以学到一些东西:

  • 在数据很少的情况下,frequentist 方法是非常不可靠的。它给你一个数字,创造一种虚假的安全感,但这个数字可能会有很大的偏差。这里,我们得到了一个频率主义者估计的 47%,而实际值是 33%。
  • 贝叶斯方法为我们估计的参数提供了一个分布,而不是一个单一的数字。感谢这一点,你可以看到你的估计是多么确定。请注意,随着数据的增多,后验概率变得越来越窄,表明确定性越来越大。这里,33%的值可能不是最有可能的,但是在后验分布下仍然是非常有可能的。
  • 如果数据很少,贝叶斯方法更依赖于先验知识。在没有数据的情况下,后验就是先验。数据越多,先验知识就越丰富。这可能是危险的(你可以选择一些非常糟糕的先验,这会扭曲结果),但如果负责任地使用,它可能是有利的——下一节将详细介绍。

去贝叶斯是值得的

为什么要去贝叶斯?除了作为一种更自然的统计思维方式,贝叶斯方法还提供了一系列实际优势:

  • 由于输出参数的分布而不是单个数字,它以自然的方式捕捉不确定性。
  • 即使只有很少的数据,它也能工作,尽管它严重依赖于先验知识。因此,优先选择是一项重要而负责的任务。在实践中,人们通常基于先前的研究(例如,当估计药物的功效时,先前的功效率可以是类似药物的功效率或在相同药物的先前试验中发现的功效率)或基于常识(例如,当估计产品的价格弹性时,先前的弹性可以是仅允许负值的某种分布——通常需求随着价格增加而下降)。
  • 贝叶斯方法使得假设检验更加容易和直观。例如,在 A/B 测试中,它允许直接计算变量 A 优于 B 的概率,而无需求助于 p 值或假设置信水平。

感谢阅读!如果你有兴趣了解更多,可以查看我在 DataCamp 的 Python 课程中的 贝叶斯数据分析。它从最基本的开始,通过贝叶斯 A/B 测试和决策分析,直到用 MCMC 模拟方法拟合和评估贝叶斯回归模型。

如果你喜欢这篇文章,为什么不订阅电子邮件更新我的新文章呢?并且通过 成为媒介会员 ,可以支持我的写作,获得其他作者和我自己的所有故事的无限访问权限。

需要咨询?你可以问我任何事情,也可以在这里 为我预定 1:1

你也可以试试 我的其他文章 中的一篇。不能选择?从这些中选择一个:

</6-useful-probability-distributions-with-applications-to-data-science-problems-2c0bee7cef28>

2021 年顶级 Visual Studio 代码 Git 扩展

原文:https://towardsdatascience.com/the-git-cli-is-dead-are-you-still-using-git-from-the-command-line-2f4793d355ba?source=collection_archive---------1-----------------------

除了设计最精良的 CLI 工具之外,还有哪些替代工具?

照片由扬西·敏Unsplash 上拍摄

我知道有些读到这些文字的人已经讨厌我了。你们中的一些人可以并且实际上把每一个工作时间都花在终端窗口前;你喜欢它。这没有什么不好,一些命令行界面(CLI)工具设计得非常好,即使您有一个图形用户界面,您也很可能永远不会使用它。

我听到了!实际上,我喜欢在终端窗口中工作。我喜欢 ViM 编辑器,我的工作站是一个 Ubuntu 服务器虚拟机,我每天都用 SSH 连接到它,直到最近,我还只通过它的 CLI 使用 Git。更重要的是,我坚信在终端窗口内工作通常会让你更有效率,并让你真正理解在引擎盖下发生了什么。

然而,当您真正知道自己在做什么时,将带有图形视图的工具集成到您的工作流程中可以简化流程并丰富您的体验。仅仅因为你必须使用鼠标和点击一些按钮就对一切说不,最终感觉就像一把老虎钳。

所以,让我们抛开固执,看看几个免费的 Visual Studio 代码扩展如何增强我们的 Git 体验。

Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里

Git 增压

Visual Studio Code 是一个免费的、轻量级的、跨平台的代码编辑器。它可能不像 IntelliJ Idea 或 PyCharm 那样是一个成熟的 IDE,但它是一个强大的、不受干扰的工具,有一个专门的粉丝群和一个繁荣的生态系统。

此外,大量强大的附加组件可以使 VS 代码成为最终的开发环境。今天,我们讨论四个扩展,它们会动摇你的 Git 工作流程。

GitLens | 5 ⭐

GitLens 是该领域无可争议的冠军。事实上,GitLens 并不像是一个扩展;它几乎就像是 VS 代码核心不可分割的一部分。所以,当安装一个新的 VS 代码副本时,首先要做的事情之一就是安装 GitLens。

没有什么是 GitLens 做不到的:惊人的修订导航、当前行责备、代码作者身份、丰富的工具提示、代码热图等等。

此外,GitLens 是高度可定制的,并与左侧栏中已经存在的 Git 图标相集成。因此,它实际上感觉像是核心 VS 代码体验的一部分。

Git 图| 5 ⭐

你在 VS 代码里面寻找 GitKraken 或者 SourceTree 的体验吗?然后 Git Graph 为你覆盖,最重要的是,它是免费的!Git Graph 必须是 VS 代码中最漂亮的 Git 扩展。

最重要的是,Git Graph 只需一次点击就可以提供任何提交的详细视图,允许您查看文件中的更改,甚至执行代码审查!

Git Graph 是非常可定制的,允许您为 UI 元素设置个人风格,例如,改变图形样式或颜色。

GitLive | 5 ⭐

GitLive 将代码协作带到了另一个高度。使用 GitLive,你可以看到谁在线,他们的代码更改(即使他们还没有提交!),他们在做什么分支,或者什么问题。所有这些都是实时的!拜托,这太荒谬了!

此外,GitLive 对可能的冲突发出警告,并允许您直接在您的工作分支中挑选他人所做的更改。最后,您甚至可以进行视频通话,并与他人实时共享您的代码以进行协作,而无需来回发送代码片段!

Git Automator | 4.5 ⭐

在我从事技术工作的日子里,我见过类似下面这样的提交消息:

Commit: ebf6e4f81483e4e470ea1cb99e0064b73c2d70ea
Parents: d239ef0360904b8991790686713813d898d9076b
Author: Lazyperson
Date: Tue Apr 03 2018 23:48:08 GMT+0300 (CEST)fix

这不是很好的描述,你不觉得吗?所以,这是为你,懒惰的开发人员准备的: Git Automator 可以帮助你编写提交消息,提供更多关于发生了什么的细节。

Git Automator 可以暂存您的更改,预填充您的提交消息,提交,并通过快捷方式将所有内容推送到远程存储库。你所要做的就是使用它!真的,请使用它。

因此,您可以为简单的操作预填充提交消息,如删除创建文件或创建您自己的模板来生成与您的例程匹配的提交消息。

结论

CLI 工具很棒。特别是 Git 有一个设计最好的 CLI 工具。但是,有些工具可以丰富您的 Git 体验,您现在就可以免费使用它们。

我知道改变你的习惯很难;我所要求的是保持开放的心态,至少尝试一下这些扩展。此外,如果你有任何你所信赖的 Git 工具,请在评论区留下链接和描述。我将非常感激!

关于作者

我的名字是迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 MediumLinkedIn 或 Twitter 上的 @james2pl

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

全球人工智能竞赛和战略平衡

原文:https://towardsdatascience.com/the-global-artificial-intelligence-race-and-strategic-balance-which-race-are-we-running-e0176b2349e5?source=collection_archive---------29-----------------------

我们在跑哪场比赛?

作为第四次工业革命的一部分,人工智能(AI)有可能影响军事和民用生活的更多方面。各国正在争夺全球人工智能的主导地位,无论谁“赢”都将获得预期的经济和地缘政治实力。然而,人工智能增强技术可能会带来前所未有的新安全风险。

最后,本文认为,英国和欧盟应该谨慎对待关键通信基础设施的外包,并更认真地对待最近涉及中国的安全问题。

英国核问题项目 2020 论文可在此处https://rusi.org/sites/default/files/202011_poni_papers_2020_web.pdf**及录音可在此处https://www.youtube.com/watch?v=TZ-frSSLIdw。我的博文可以在这里找到*https://blog.tiggalina.org/2020/11/06/ukponi2020/。*****

当前人工智能能力

人工智能因其对经济的潜在变革性影响和对其他创新的支持而被比作电力。1 许多人预计人工智能开发竞赛的“赢家”将在未来几十年中在经济和地缘政治上占据主导地位,从而加剧国家之间的紧张局势并转变国家力量的要素。2

美国在大多数人工智能能力指标上保持领先,英国排名第三,落后于中国。3 其他来源使用不同的指标来产生他们的排名。4 应用于军事的人工智能在美国、中国、俄罗斯和以色列的议程上占据重要位置。5 这意味着无论哪个国家在人工智能发展方面领先,都将在网络战和传统战争方面具有军事优势。6

根据 John Launchbury 提供的框架,人工智能可以被概念化为具有三个波,每个波基于不同的能力,如图 1.7 所示。世界仍处于被称为“弱”或“窄”人工智能的领域,其中人工智能针对特定的窄任务进行了优化,如语音识别和执行重复功能。强人工智能,或人工通用智能(AGI),即机器将具有类似人类的认知能力,仍然是一个重大的技术挑战。

图 1: AI 概念化框架。
图片 via 美国政府问责局, 【人工智能:新兴机遇、挑战和影响】 ,提交给众议院科学、空间和技术委员会的报告,GAO-18–142 sp,2018 年 3 月,2020 年 5 月 16 日查阅。

目前的 AI 技术有两大局限:需要大量的标签化数据来训练系统;系统对环境仍知之甚少。8 未来五年,在构建关键数据集的同时,可能会看到大量现实世界的试验。9 关于 AGI 开发的时间表,意见不一。10 据预测,计算机将在 2029 年通过图灵测试,技术奇点将在 2045 年出现。11 然而,一些消息来源认为 AGI 开发在未来 20 年内不太可能实现,如果有的话。12 人们还认为,至少某些方面的决策能力可以在 2040 年实现。13

第四次工业革命(工业 4.0)

工业 4.0 涉及智能和互联机器和系统的开发,其中将出现人工智能、物联网(IoT)、利用大数据和量子计算等领域的进一步突破。14

大数据是高容量、高速度和/或高多样性的信息,被称为 3Vs.15 物联网广泛涵盖了人与物之间不断增加的连接,已被视为可能影响美国实力的关键民用技术。16 物联网对象数量和类型不断增加的主要目的是产生关于我们周围环境的有用数据,使其更加智能。17 物联网预计将成为大数据的主要生产者,对大数据的融合和分析可以实现准确可靠的决策和对无处不在的环境的管理;这是一个巨大的未来挑战,人工智能在其中发挥着关键作用。18 人工智能和大数据已经改变了经济,提高了整个市场的生产力,思科预测,2021 年 94%的全球工作负载将在云中处理。19 人工智能正在成为管理大量数据的解决方案,特别是基于数据集进行预测。20

防御中的人工智能

欧洲防务局(EDA)分析了它认为的 10 个最具颠覆性的关键创新(表 1),与这些重点发展相关的连接技术是人工智能。

表 1: 即将到来的 10 项最具颠覆性的国防创新。来源:欧洲防务事务, “前方颠覆性防务创新!” ,欧洲防务局杂志,2015 年第 14 期,2020 年 7 月 1 日获取。**

增加武器系统的自主性可以在战场上提供优势,潜在地允许较弱的核武器国家重置力量的不平衡,但加剧了对较强国家可能进一步巩固其统治地位并参与更具挑衅性的行动的担忧。21 全球领导者之间的竞争可能导致武器化人工智能的扩散。22

此外,人工智能增强的核武器和战略非核武器的混合将通过破坏战略稳定而加剧意外升级的风险

美国、中国和俄罗斯都宣布了通过机器人和人工智能实现抵消优势的战略。24 C4ISR 已被确定为未来 20 年的潜在影响领域,其中人工智能支持的自主系统将被作战部队采用。25 众所周知,欧盟和北约都刚刚开始处理国防中的人工智能问题,而俄罗斯和中国已经开始从战略角度考虑这个问题。26

5G、安全和政治稳定

5G 的引入将使收集数据的物联网传感器数量激增;5G 比 4G 快 20 倍,具有创纪录的低延迟,并允许开发人员创建近实时应用。27 然而,如果没有人工智能,这将是不可能的。28 大数据的使用在性能和隐私之间建立了一种平衡;如果运营商未能以道德的方式利用信息技术,大量敏感个人信息(姓名、身份证号、位置、密码)的数据保密性问题就会变得显而易见。29

面对人工智能和大数据可能被恶意/有偏见地使用,各国都面临着保护其公民甚至政治稳定的压力。30 因为 5G 网络是我们日益数字化的经济和社会的未来支柱,所以确保其安全性和灵活性至关重要。31 即使在当前的能力水平下,人工智能也可以用于网络领域,以增强对网络基础设施的攻击。32 没有完美的安全性这种东西, 只有不同程度的不安全性。33 这些“智能”技术依靠双向无线链路与设备和全球服务进行通信,这为网络威胁提供了更大的“攻击面”。34 因此,5G 网络可能会导致政治分裂和潜在的不可互操作的技术势力范围,其中一个势力范围由美国领导,另一个由中国领导,其他一些势力范围介于两者之间(例如欧盟、韩国和日本)。35

所有这些问题在专制国家的背景下都是最重要的,但也可能破坏民主国家维持真实公共辩论的能力。36 例如,“deepfake”(源于“深度学习”和“假”)算法可以创建假图像和视频,人类无法轻松区分这些图像和视频。如果使用 deepfake 方法传播错误信息,将威胁到全球安全。此外,他们是隐私和身份的巨大威胁。因此,提出能够评估数字媒体完整性的技术是不可或缺的。37

安全和控制也是人工智能需要监管的领域,一些人还呼吁禁止或严格限制人工智能领域的 R&D,如自主武器、超智能人工智能和进攻性网络能力。38 几乎所有的人工智能模型都包括软件的“黑盒”方面,即使是创作者也不能完全理解,这增加了保持算法开放性的重大挑战。39

人工智能对欧盟和英国的安全和国防的影响在现阶段基本上是未知的。40 欧洲落后于其他全球参与者。41 然而,连续的欧盟战略继续加强欧洲技术自主的愿望,甚至在关键战略重要领域的直接“主权”,包括 5G 和 6G.42 欧盟已经宣布在人工智能和机器人技术中需要高水平的数据保护、数字权利和道德标准,并坚持道德标准以及对人工智能引起的社会变化的准备。43

《中国 2025 战略》是关于让中国成为“主要的网络力量”,以及根据自身利益塑造网络空间国际治理的能力。有些人把正在进行的数字革命和日益加深的中美竞争称为新的军备竞赛

中国是威胁吗?

尽管华为的产品和服务被评估为高度不安全,但中国最近有望成为 5G 技术的全球领导者。45 今年 1 月,英国宣布华为将被允许建设该国 5G 核心网络的一部分。美国引用华为设备对关键基础设施的高风险特性,以限制情报合作的威胁作为回应。46 英国华为网络安全评估中心监督委员会在 2018 年报告称,“各种产品中使用的安全关键第三方软件没有受到足够的控制”;华为回答说,它可能需要三到五年来缓解这两个缺陷,但到那时,有关 5G 合同的大多数决定都将做出,5G 网络的建设也将开始。47 一旦引入,它将成为英国基础设施中“不可分割”的一部分。48

可以说,中国大数据的普遍实践远不符合以人为本的方法所要求的社会、政治和道德含义。因此,中国的技术和政府政策吸引了越来越多的国际关注和审查。49 中国正在实施广泛的社会监控和基于人工智能的社会信用计划,这在其他国家会被认为是有争议的,并使用户行为数据的收集能够在以后潜在地给予或拒绝获得国家提供的一系列服务。该政权对其人工智能和大数据系统的日益依赖建立了一个数字专制政权。50

如果一个国家的 5G 基础设施的许多关键组件来自中国,这将使中国更容易监视或破坏该国的在线通信。51 英国需要了解如何降低外国设备带来的风险,因为即使是现在,人们也很少知道英国如何应对安装在伦敦各行政区的中国生产的监控设备可能带来的潜在安全漏洞。52《电讯报》的 Jeremy Warner 指出,英国有“在我们匆忙进行数据保护的过程中把未来留给中国”的风险。53

2019 年 6 月,中国发布了首个人工智能道德规范:《北京人工智能原则》。这是国内讨论人工智能伦理的第一个公开信号。54 2020 年早些时候,美国商务部发布了新法规,限制各种中国公司获得美国技术。55 未来法规的需求将在很大程度上取决于人工智能的技术进步,因为政策和法规可能会破坏其发展(反之亦然)。56 国际合作治理和新技术外交的潜力可能是在工业 4.0.57 期间实现稳定的关键

结论

人工智能技术对国家安全的影响在现阶段仍基本未知。然而,英国最近的行动似乎是为了在战略上孤立自己的盟友,最初是反对美国禁止华为进入其 5G 基础设施的愿望,并决定离开欧盟,欧盟有自己的战略优先事项来证明地缘政治的相关性。直到最近,英国政府才决定在该国逐步淘汰华为的 5G 角色。58 然而,通过识别现有框架和执行机制中的潜在差距,英国充分了解已经在使用的监控设备仍然极其重要。59

欧洲国防管理局应与非传统的 R&D 国防团体和创新者合作,以加快获得新兴的和潜在的破坏性研究,并确定额外投资的领域,以充分满足未来的国防能力需求。60 还应考虑欧洲工业能力的发展

在人工智能方面落后的国家可能只有两个选择:加入竞赛并可能开发利基人工智能,或规范其使用以减少潜在的不良应用

国际政策协调仍然是解决人工智能的伦理和政治影响的必要工具,以促进人工智能政策和治理的全球协调。63

参考

1. US-China Economic and Security Review Commission, ‘Emerging Technologies and Military-Civil Fusion — Artificial Intelligence, New Materials, and New Energy’, 2019 Annual Report to Congress of the US-China Economic and Security Review Commission, US-China Competition, chapter 3, Section 2.
2. Claudio Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All: The Case for a New Technology Diplomacy’, Telecommunications Policy (Vol. 44, №6, 2020), pp. 1019–88.
3. Tortoise Media, ‘The Global AI Index’, accessed 3 April 2020.
4. Stanford University, ‘The 2019 AI Index Report. Human-Centered Artificial Intelligence’, 2019, accessed 30 June 2020; Oxford Insights, ‘Government Artificial Intelligence Readiness Index 2019’, 2019, accessed 30 June 2020; Sarah O’Meara, ‘Will China Lead The World in AI by 2030?’, Nature (Vol. 572, 2019), pp. 427–28.
5. Congressional Research Service, ‘Artificial Intelligence and National Security’, updated 26 August 2020, accessed 30 June 2020; Forrest E Morgan and Raphael S Cohen, ‘Military Trends and the Future of Warfare: The Changing Global Environment and Its Implications for the US Air Force’, RAND Corporation, 2020; Samuel Bendett et al., ‘Russian Unmanned Vehicle Developments: Syria and Beyond’, in Center for Strategic and International Studies (CSIS), ‘Improvisation and Adaptability in the Russian Military’, 30 April 2020, pp. 38–47; Vincent Boulanin and Maaike Verbruggen, ‘Mapping the Development of Autonomy in Weapon Systems’, SIPRI Publications, November 2017; Pax, ‘Don’t Be Evil?’, August 2019, accessed 30 June 2020.
6. J Scott Brennen, Philip N Howard and Rasmus Kleis Nielsen, ‘An Industry-Led Debate: How UK Media Cover Artificial Intelligence’, Factsheet, Reuters Institute for the Study of Journalism, December 2018.
7. John Launchbury, ‘A DARPA Perspective on Artificial Intelligence’, DARPA, 2016, accessed 1 July 2020.
8. US-China Economic and Security Review Commission, ‘Emerging Technologies and Military-Civil Fusion — Artificial Intelligence, New Materials, and New Energy’.
9. Congressional Research Service, ‘Artificial Intelligence and National Security’.
10. Leopold Schmertzing, ‘Trends in Artificial Intelligence and Big Data’, European Parliamentary Research Service (EPRS) Ideas Paper Series, 2019, accessed 4 August 2020.
11. Roman V Yampolskiy, ‘Artificial Intelligence Safety and Cybersecurity: A Timeline of AI Failures’, Artificial Intelligence, 2016.
12. D F Reding and J Eaton, ‘Science & Technology Trends 2020–2040: Exploring the S&T Edge’, NATO Science & Technology Organization, 2020, accessed 9 July 2020.
13. Edward Geist and Andrew J Lohn, ‘How Might Artificial Intelligence Affect the Risk of Nuclear War?’, RAND Corporation, 2018.
14. Klaus Schwab, ‘The Fourth Industrial Revolution’, World Economic Forum, 2016.
15. Gartner, ‘Gartner Glossary’, 2020, accessed 5 August 2020; Doug Laney, ‘Application Delivery Strategies’, META Group Inc., 2001, accessed 5 August 2020.
16. SRIC-BI, ‘Disruptive Civil Technologies: Six Technologies With Potential Impacts on US Interests Out to 2025’, National Intelligence Council Conference Report, SRI Consulting Business (SRIC-BI) Intelligence, 2008, p. 48.
17. Furqan Alam et al., ‘Data Fusion and IoT for Smart Ubiquitous Environments: A Survey’, IEEE Access (Vol. 5, 2017), pp. 9533–54.
18. Ibid.
19. Schmertzing, ‘Trends in Artificial Intelligence and Big Data’.
20. Daoqu Geng et al., ‘Big Data-Based Improved Data Acquisition and Storage System for Designing Industrial Data Platform’, IEEE Access (Vol. 7, 2018), pp. 44574–82.
21. Franz-Stefan Gady, ‘Elsa B. Kania On Artificial Intelligence And Great Power Competition’, The Diplomat, 31 December 2019; Lora Saalman, ‘The Impact of AI on Nuclear Deterrence: China, Russia, and the United States’, East-West Center, accessed 14 May 2020.
22. Amy Ertan, ‘What, Who, Where, How: The Impact of Recent Military AI Innovation in Security Terms’, Defence and Security Doctoral Symposium (DSDS19), 2015, accessed 14 May 2020; James Johnson, ‘Artificial Intelligence in Nuclear Warfare: A Perfect Storm of Instability?’, Washington Quarterly (Vol. 43, №2, 2020), pp. 197–211.
23. James M Acton et al., ‘Entanglement: Chinese and Russian Perspectives on Non-Nuclear Weapons and Nuclear Risks’, Carnegie Endowment for International Peace, 2017; James Johnson, ‘The End of Military-Techno Pax Americana? Washington’s Strategic Responses to Chinese AI-Enabled Military Technology’, Pacific Review, 2019; James Johnson, ‘VIII. The Impact of Artificial Intelligence on Strategic Stability, Escalation and Nuclear Security’, 2019 UK Project on Nuclear Issues (UK PONI) Annual Conference Papers, 2019.
24. Ministry of Defence (MoD), ‘Joint Concept Note 1/18: Human-Machine Teaming’, 2018, accessed 6 July 2020.
25. United States Government Accountability Office, ‘Artificial Intelligence: Emerging Opportunities, Challenges, and Implications’, Report to the Committee on Science, Space, and Technology, House of Representatives, GAO-18–142SP, 2018; James S Johnson, ‘Artificial Intelligence: A Threat to Strategic Stability’, Strategic Studies Quarterly, Spring 2020.
26. Ulrike Esther Franke, ‘Not Smart Enough: The Poverty of European Military Thinking on Artificial Intelligence’, European Council on Foreign Relations, 2019, accessed 14 May 2020; EU-NATO Relations and Artificial Intelligence Conference, co-organised by the EU Institute for Security Studies (EUISS) and the Finnish Presidency of the Council of the EU at the Permanent Representation of Finland to the EU, Brussels, 14 November 2019, accessed 14 May 2020.
27. Mark Howden, ‘5G Opportunities for App Developers’, Samsung Insights, 2019, accessed 3 August 2020; Moayad Aloqaily et al., ‘Design Guidelines for Blockchain-Assisted 5G-UAV Networks’, Networking and Internet Architecture, 2020, accessed 4 August 2020.
28. Karen Hao, ‘DARPA is Betting on AI to Bring the Next Generation of Wireless Devices Online’, MIT Technology Review, 25 October 2019, accessed 3 August 2020; Geng et al., ‘Big Data-Based Improved Data Acquisition and Storage System for Designing Industrial Data Platform’.
29. Roxana Mihet and Thomas Philippon, ‘The Economics of Big Data and Artificial Intelligence’, Disruptive Innovation in Business and Finance in the Digital World (Vol. 20, 2019), pp. 29–43; Ying He et al., ‘Big Data Analytics in Mobile Cellular Networks’, IEEE Access (Vol. 4, 2016), pp. 1985–96.
30. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’; Schmertzing, ‘Trends in Artificial Intelligence and Big Data’.
31. European Commission, ‘Report On EU Coordinated Risk Assessment Of 5G: Member States Publish A Report On EU Coordinated Risk Assessment Of 5G Networks Security’, 2019, accessed 3 August 2020.
32. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.
33. Yampolskiy, ‘Artificial Intelligence Safety and Cybersecurity’.
34. James Hayes, ‘Hackers Under The Hood’, Institute of Engineering and Technology, 2020, accessed 6 July 2020; Idaho National Laboratory, ‘Cyber Threat and Vulnerability Analysis of the US Electric Sector’, US Department of Energy Office of Scientific and Technical Information, 2016, accessed 6 July 2020; European Commission, ‘Report on EU Coordinated Risk Assessment of 5G’.
35. Paul Triolo, Kevin Allison and Clarise Brown, ‘Eurasia Group White Paper: The Geopolitics of 5G’.pdf), Eurasia Group, 2018, accessed 5 August 2020; Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.
36. Miles Brundage et al., ‘The Malicious Use of Artificial Intelligence: Forecasting, Prevention, and Mitigation Authors are Listed in Order of Contribution Design Direction’, Future of Humanity Institute, 2018, accessed 5 August 2020.
37. Gady, ‘Elsa B. Kania on Artificial Intelligence and Great Power Competition’; Thanh Thi Nguyen et al., ‘Deep Learning for Deepfakes Creation and Detection: A Survey’, Computer Vision and Pattern Recognition, accessed 5 August 2020.
38. Schmertzing, ‘Trends in Artificial Intelligence and Big Data’.
39. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.
40. Daniel Fiott and Gustav Lindstrom, ‘Artificial Intelligence: What Implications for EU Security and Defence?’ EUISS, accessed 17 May 2020.
41. Ibid.
42. Andrés Ortega Klein, ‘The US-China Race and the Fate of Transatlantic Relations: Part II: Bridging Differing Geopolitical Views’, CSIS, 2020; EU-NATO Relations and Artificial Intelligence conference, co-organised by the EEUISS and the Finnish Presidency of the Council of the EU, Permanent Representation of Finland to the EU, Brussels.
43. European Group on Ethics in Science and New Technologies, ‘Statement on Artificial Intelligence, Robotics and Autonomous Systems’, accessed 5 August 2018; European Commission, ‘Artificial Intelligence for Europe’, (COM2018) 237 final, accessed 5 August 2020.
44. François Godement et al., ‘The China Dream Goes Digital: Technology in the Age of Xi’, European Council on Foreign Relations, 2018, accessed 5 August 2020.
45. Elsa B Kania, ‘Securing Our 5G Future: The Competitive Challenge and Considerations for US Policy’, Center for a New American Security (CNAS), 2019, accessed 6 July 2020.
46. Valentin Weber, ‘Making Sense of Technological Spheres of Influence’, London School of Economics and Political Science, 2020, accessed 6 July 2020.
47. Valentin Weber, ‘Finding a European Response To Huawei’s 5G Ambitions’, Norwegian Institute of International Affairs (NUPI), 2019, accessed 6 July 2020.
48. Sarah Young, ‘UK Defence Committee to Probe Security of 5G Network on Huawei Concerns’, Reuters, 2020.
49. Min Jiang and King‐Wa Fu, ‘Chinese Social Media and Big Data: Big Data, Big Brother, Big Profit?’, Policy & Internet (Vol. 10, Issue 4, 2018), pp. 372–92; Gaurav Shukla, ‘Google Removes Viral Indian App That Deleted Chinese Ones: 10 Points’, Gadgets360°, 2020, accessed 5 August 2020; Leo Kelion, ‘TikTok: How Would the US Go About Banning the Chinese App?’, BBC News, 3 August 2020, accessed 5 August 2020.
50. Valentin Weber, ‘AI, China, Russia, and the Global Order: Technological, Political, Global, and Creative Perspectives’, Centre for Technology and Global Affairs, University of Oxford, 2019; Max Craglia et al., ‘Artificial Intelligence: A European Perspective’, Publications Office of the EU, 2020, accessed 3 August 2020; Christina Larson, ‘Who Needs Democracy When You Have Data?’, MIT Technology Review, 20 August 2018, accessed 5 August 2020.
51. Weber, ‘Making Sense of Technological Spheres of Influence’.
52. Ibid.
53. Brennen, ‘An Industry-Led Debate’.
54. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.
55. Dieter Ernst, ‘Catching Up in a Technology War: China’s Challenge in Artificial Intelligence’, East-West Center, 16 June 2020, accessed 3 August 2020.
56. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’; Schmertzing, ‘Trends in Artificial Intelligence and Big Data’.
57. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.
58. Aishwarya Nair and Daniel Wallis, ‘UK PM Johnson to Phase Out Huawei’s 5G Role Within Months — The Telegraph’, Reuters, 4 July 2020.
59. NIS, ‘EU Coordinated Risk Assessment of the Cybersecurity of 5G Networks’, NIS Cooperation Group, 9 October 2019, accessed 6 August 2020.
60. European Defence Matters, ‘Disruptive Defence Innovations Ahead!’, Magazine of the European Defence Agency (№14, 2017), accessed 1 July 2020; Loredana Ceccacci, ‘The Ethics of Big Data’, European Economic and Social Committee, 2017, accessed 18 May 2020.
61. NIS, ‘EU Coordinated Risk Assessment of the Cybersecurity of 5G Networks’.
62. Yuval Noah Harari, ‘Who Will Win the AI Race?’, Foreign Policy (Winter 2019), pp. 52–55.
63. Feijóo et al., ‘Harnessing Artificial Intelligence (AI) to Increase Wellbeing for All’.

好的,坏的,和中立的

原文:https://towardsdatascience.com/the-good-the-bad-and-the-neutral-87c4e94687?source=collection_archive---------42-----------------------

意见

为 Twitter 情绪分析在当今世界的有用性提供商业案例

马丁·比约克Unsplash 上的照片

再过几个星期,我们将距离世界卫生组织宣布的全球健康疫情还有一年。毫无疑问,我们不得不适应一系列新的情况,并采取新的做法来确保我们的安全。

我们必须做出的改变之一是取消大型公众集会。新冠肺炎的发作使得人们无法亲自出席音乐会、体育赛事和电影。对于苹果和谷歌这样的公司来说,这意味着他们必须重新考虑如何举办像 WWDC 或谷歌 I/O 这样的活动。通常这些活动将为科技公司提供向特定观众推出新产品的机会,并提供关于他们公司如何处于科技创新前沿的信息。

然而,这些技术会议不仅仅是为了服务观众。现场观众可以提供即时反馈,并让公司判断他们的产品是否受欢迎。在一个新 iPhone 的演示结束后,像苹果这样的公司会为与会者提供演示设备,以检查和测试新功能。如果这款新 iPhone 真的是革命性的,值得谈论,那么我们可能会期待这些特定受众的成员转向社交媒体来分享他们的想法和意见,这使得围绕产品的讨论能够继续进行,并触及更广泛的受众。显然,由于没有现场活动,从活动参与者到更广泛的全球观众的典型信息传递被打破了。

Teemu PaananenUnsplash 上拍照

尽管疫情切断了这一信息渠道的面对面部分,但社交媒体的存在和使用在整个 2020 年保持不变(如果不是放大的话)。因此,在这种情况下,社交媒体对产品的反应成为公司获得反馈的主要方式。随着社交媒体成为主要的反馈系统,评估这些社交媒体帖子对其产品的看法变得更加有价值。

NLP 来救援了!

幸运的是,自然语言处理(NLP)领域将允许科技公司训练和建立一个模型来评估推文的情绪。鉴于我们可能会预计新产品的首次亮相会成为 Twitter 等平台上的热门话题,尽快分析这种情绪符合公司的最佳利益。根据 Twitter 的市场调查,四分之三的用户表示他们会向其他 Twitter 用户寻求更多关于某个话题的信息。Twitter 还从这项研究中发现,90%的用户“改变了对购买的看法,因为他们在 Twitter 上认识的人给了他们建议”。

优 X 创投Unsplash 上的照片

这意味着好的推文可能对公司非常有利,而负面推文可能会损害公司的底线。一个训练有素的模型可以比一群人更快地浏览数千条推文,因此至少它提供了一种有效的方法来衡量社交媒体平台上的普遍情绪。让我们考虑几周前发生在 Xbox 和 Robinhood 身上的事情。

金子使人变成怪物。

艾琳·鲍曼,复仇之路

2021 年 1 月 22 日,Xbox 决定将 Xbox Live Gold 订阅的价格从每年 60 美元提高到 120 美元(除了 1 个月、3 个月和 6 个月的价格)。推特上和游戏媒体上迅速出现了对这一决定的强烈反对。Techcrunch 的一篇文章将其描述为“试图掩盖一些坏消息”。在疫情期间,视频游戏无疑成了许多人的一种逃避方式,并让人们有了另一种与朋友和家人保持联系的途径。当还考虑到许多个人(其中一些可能是 Xbox 游戏玩家)在疫情期间已经看到工资下降,许多人想知道为什么微软会提高价格。毕竟,当他们刚刚在 2020 年 11 月发布两款新主机时,为什么要提高订阅服务的价格?

可以肯定地说,公众舆论法庭没有做出有利于微软决定的裁决。事实上,在不到 24 小时的时间里,微软通过 Twitter 宣布,他们“错过了目标”,它将改变其定价决定。这件轶事的意义是双重的:

  • 对微软决定的负面情绪始于 Twitter,随后由知名游戏媒体渠道升级,最终通过 Twitter 结束,微软承认自己目光短浅。
  • 提高订阅价格带来的潜在收益并没有超过现有黄金会员退订以及企业贪婪的负面印象带来的潜在损失。

你知道吗,罗宾。我只是在想,我们是好人还是坏人?

——小约翰,迪士尼的罗宾汉

就在我们看到微软颠覆了它的粉丝群的几天后,Robinhood 应用程序发现自己也在类似的地方。2020 年 1 月下旬,对冲基金决定做空 Gamestop 的股票,认为鉴于视频游戏行业越来越多的数字存在只会使 Gamestop 更难生存,Gamestop 的股价将会暴跌。然而,一些人通过 subreddit r/WallStreetBets 联合起来,决定他们将与对冲基金交易,并通过购买 Gamestop 股票来寻求自己的利润。这些人中的许多人转向像 Robinhood 这样的应用程序购买他们的股票。对 Reddit 交易员来说不幸的是,Robinhood 决定停止 Gamestop 股票的交易,从而限制了个人获利的潜力,同时也防止了对冲基金彻底破产。

正如你可能已经猜到的,公众并不喜欢停止交易。Robinhood 因为错误的原因迅速成为 Twitter 上的热门话题,一些用户选择前往 Google Play 商店并对该应用程序留下负面评论。这款应用的评分跌至 1 星。这些评论随后从 Google Play 商店中删除,谷歌认为它们违反了服务条款。尽管如此,社交媒体对罗宾汉决定的反应很可能给他们的声誉留下了不可磨灭的印记。在撰写本文时,SEC 正在调查罗宾汉停止交易的决定,因此社交媒体上表达的负面情绪似乎是未来反响的不祥征兆。

那么 NLP 模型有多必要呢?

值得注意的是,即使实现了可以分析和评估 Twitter 情绪的 NLP 模型,它也代表了一种被动的方法。在这种情况下,tweets 表示原始数据,这些数据必须经过转换并输入到模型中。这些推文只能基于公司的行动。对于上面的微软和罗宾汉的例子,该模型将是一个工具,帮助这些公司通知他们的即时和长期决策。看到像这样的模式已经在微软这样的科技巨头中使用一点也不奇怪,特别是当你考虑到他们在不到 24 小时内扭转价格上涨的决定时。我相信,尽管社交媒体情绪分析代表了一种被动的方法,但它仍然非常有价值。大型、盈利性的技术公司关心他们的品牌,并总是希望提高底线,因此情感分析模型的实施是一项值得追求的事业。

为了我在熨斗学校的数据科学训练营的一个项目,我使用 2011 年 SXSW 节日的推文建立了一个 Twitter 情绪分析模型。这与 iPad 2 的发布和社交媒体平台 Google+的发布不谋而合。你可以在这里找到这个项目的数据,这里是我的 Github 回购 的链接。欢迎任何反馈!

感谢阅读!请随时通过 LinkedInTwitter 与我联系。

谷歌数据分析专业证书:反思

原文:https://towardsdatascience.com/the-google-data-analytics-professional-certificate-a-reflection-5264982365f9?source=collection_archive---------22-----------------------

首先,我需要指出我是一个书呆子。我妻子开玩笑说我“学习是为了乐趣”我一直喜欢学习新东西。

图片由 StockSnap 来自 Pixabay

我也有芝加哥地区学校的 MBA 和经济学硕士学位,但除非你来自你很可能没听说过的地区。当我在攻读经济学学位时,我意识到我缺少一些定量技能,如果我想提高自己的水平,或许申请经济学博士学位,这些技能是我真正需要的。我正在攻读的学位并不像我希望的那样侧重于量化方面,而且这个项目很小,所以没有很多课程。我联系了我的教授,并与一位在 r 做了大量工作的金融学教授成为了朋友。问题是,当你全职工作并上学时,很难积累新技能。

然后我写了一个愿望清单,至今还保存在我工作的电脑上。这是我想学和想做的事情的清单:“学编程;r *;SQL 更优秀;Python?;Stata 重新学习微积分;致力于诗歌。”你可以看到我的兴趣很广泛。我花了一些时间通过约翰霍普金斯大学在 Coursera 上学习 R 课程,但它对我不起作用。我从一开始就喜欢 MOOCS 的想法,但这是我的第一次尝试,课程和课程中的内容与评估的作业之间有太大的差距。没有谷歌,我无法着手解决这些问题,这感觉就像作弊。所以,整个夏天,我只上了几门课程。

但我没有放弃这个列表——我于 2020 年春天毕业,获得了经济学硕士学位,而且有足够的时间,所以我在 Coursera 上又开始了一个序列,这次是从 Excel 中的杜克到 SQL 轨道。我喜欢那份工作,因为它有很多实际操作的工作,而且作业也不会让我觉得自己很笨。唯一的缺点是,这个项目低估了每周课程需要的时间。

我正在学习 SQL 的第四门课程,这时我收到了来自谷歌的电子邮件,说他们正在提供数据分析课程。我登录了他们的网站,看了演示,我知道我想成为其中的一员。这似乎是显而易见的。课程安排是八门课程,可以在六个月内完成,你只需要支付 Coursera 的费用。

Via Coursera

课堂讲授的基本框架是数据分析过程的六个步骤:提问、准备、处理、分析、分享和行动。他们在每堂课和大多数小课堂上都强调这一点。有 bookend 类,但是中间的六个类都只关注其中一个步骤。他们会在课堂上教授一些软件程序。对于电子表格,他们会经过 Google Sheets 的步骤,但他们也会在 excel 中提供详细信息。在可视化过程中,浏览 Tableau 在线版本的步骤。在 SQL 课程中,你可以登录谷歌云平台 Big Query,摆弄可用的数据集,并浏览上传自己的数据。R 中有一个类,带你下载 R and R 工作室,用 ggplot2 创建你自己的精美图表。

总的来说,这些课程对我来说并不难。基于工作和学校的经验,我熟悉他们使用的软件和编程语言。让我能够快速浏览程序。我能在一个月内完成六个月的课程。他们在三月中旬发布了第一批六门课程,在大约三周的时间里,我完成了这些课程。他们直到四月份才发布最后两个课程,R 课程和顶点课程,只花了几天时间就完成了。我能够很快完成,但我确实投入了时间。我看了视频,写了日志。我参加了讨论板,并在 LinkedIn 上与参加该计划的人联系,建立了可能对我未来旅程有帮助的网络(加入我的网络!)。评估没有那么难,是选择题,如果你失败了,你可以重考。

你可以从这个过程中获得很多。虽然这对我不是一个巨大的挑战,但我认为我真的从“询问、准备、处理、分析、分享和行动”框架中受益匪浅,因为这基本上是我现有的过程,但它给了你所做的事情一个名字。它也让我对数据分析感到兴奋,当我想了解更多的时候,它给了我很多跳跃的地方。这些课程应该是为初学者设计的,我认为这是可行的。这些视频通俗易懂,没有太多的术语,看起来也很有趣。实践活动不会让你放弃,就像我第一次尝试 R 编程时让你放弃一样。最重要的是,如果你完成了,你的 LinkedIn 和简历上有谷歌,他们有资源可供那些试图往上爬的人使用。对我来说这是值得的,我希望它能让其他人受益。我认为,在我目前的角色中,有很多东西需要我去成长。我很期待接下来的事情。

数据科学的难点在于

原文:https://towardsdatascience.com/the-hard-part-of-data-science-fa9cad734319?source=collection_archive---------22-----------------------

那些闯入这一领域的人往往会遗漏什么

马库斯·斯皮斯克在 Unsplash 上的照片

第一次看数据科学实习生候选人简历的时候,我得了冒名顶替综合症。这些应届毕业生拥有我所有的技术技能(在很多情况下,甚至更多)。如果所有这些直接从大学毕业的人都知道我所做的一切,我如何证明我作为“高级”数据科学家的工作是正确的?

我对他们的第一次采访也没有帮助——许多人可以回答所有的技术问题,并且在数学上更容易。许多人有更令人印象深刻的编码经验。那我到底有什么用?

直到我开始与实习生和初级数据科学家密切合作,我才真正意识到,那些简历和技术面试并不能告诉你全貌。

缺失的技能

大多数候选人最大的缺失不是技能。它能够在目标和算法之间进行转换。如果你不知道什么时候该用锤子,什么时候该用螺丝刀,那么你的工具箱里有多少工具都没用。

商业问题很复杂。它们很少被定义得如此之好,以至于与一个技术解决方案是同构的。相反,你需要足够好地理解一个业务问题(和技术工具),以知道哪些部分可以被抽象掉或者近似。

一个例证

一个例子将使这一点更加具体。当我在医疗保健行业工作时,预测分析的圣杯是预测哪些病人会住院。如果我们能够识别这些患者,我们就有可能避免住院,这将是一个巨大的胜利(对患者和公司的底线而言)。听起来像是一个简单的分类问题,对吗?

比尔·牛津在 Unsplash 上的照片

但事实并非如此。这里有一堆隐藏的问题。给出一个简短的、非详尽的清单:

  • 我们想在住院前多长时间发现它?
  • 鉴于我们正在努力防止住院,我们如何看待基于我们实际上无能为力的高风险因素(如年龄)的预测?
  • 考虑预测可预防的住院是不是更好?
  • 考虑预测我们认为最有可能预防的住院是不是更好?
  • 假阳性(预测某人将不住院)与假阴性(未发现将住院的人)的成本是多少?
  • 如果我们认为这在经济上是值得的,我们是否有无限的资源,或者我们是否试图在我们能接触到的病人的特定限制下最大限度地进行预防?
  • 一个模型需要多精确才能提供价值?

这些问题很多都没有明确的答案。有些人只是需要做出判断。有些需要对问题进行艰难的重构。有些需要业务目标和技术方法之间的折衷。

根据我的经验,商业利益相关者很适合回答这些问题,但是需要技术专家来识别正确的问题。

第二次看简历

建立判断和商业意识以知道如何在商业问题和技术解决方案之间进行转换需要一些经验和常识。这也是很难在简历中发现的东西,尽管很容易看出一个人何时可能缺乏这些技能。

除了 Kaggle 项目,或者上过一些 Coursera 课程,或者跟随一个在线教程,所有这些都指向技术技能,而没有将它们应用于商业问题的经验。并不是说这些都是学习技能的坏方法。只是他们不能教你所有你需要的技能。在一个真实的数据项目中,有各种各样的妥协要做,有各种各样的环境要考虑,有各种各样的假设要质疑。

现在我已经有了看简历的经历,当某人的技术技能和项目不具备在现实世界中应用这些技能的适当能力时,这变得有点明显。这就是为什么 Kaggle 的玩具项目往往不成功,正如我在另一篇文章中深入讨论的那样,我经常建议有抱负的数据科学家通过从事具有真实应用程序的项目来获得真实世界的经验——通过志愿服务、实习或与小型初创公司合作。

严酷的事实是:数据科学并不适合所有人

原文:https://towardsdatascience.com/the-hard-truth-data-science-isnt-for-everyone-1689b7c05e62?source=collection_archive---------7-----------------------

数据科学|观点

努力工作和努力有时是不够的。

照片由思想目录Unsplash 上拍摄

我们相信努力工作胜过一切。是假的。

无论我们想在职业上取得什么样的成就,总有几个因素会影响结果。我们喜欢“努力=成功”的理念,因为努力是认可我们优点的可控因素。然而,我们无法控制的因素也会影响我们的生活。我可以努力训练以在 NBA 打球,但以我 5 英尺 11 英寸的身高,无论我怎么努力都没用,机会对我非常不利。

努力工作可以弥补其他因素的不足,但只是在一定程度上。认为只要改变努力的方向和力度,任何人都可以成为任何人,这是非常误导人的。我们被我们的处境和环境所束缚。他们定义了我们。西班牙哲学家何塞·奥尔特加·加塞特有一句名言完美地抓住了这一思想:

“我就是我和我的环境。”

在本文中,我将解释为什么数据科学——或者几乎任何其他学科——并不适合所有人。我将描述影响我们在该领域工作准备程度的三种力量。

免责声明:这是一篇观点文章。欢迎在评论中打开讨论!

缺乏智慧——失去潜力

人工智能专家经常使用人工通用智能(AGI)的概念来指代具有人类智能水平的系统。这是一个奇怪的概念,因为我们把所有的人类放在同一个袋子里。无论你有多聪明,你都有人类水平的智力。

然而,当我们放大时,我们意识到不同人的智力差异很大。爱因斯坦常常被视为人类智慧的典范,他比我聪明得多。同样的情况也适用于光谱的另一端。人类几乎都一样聪明,但只是从远处看。

我不是指智商这个词意义上的智力。虽然没有科学依据,但我高度评价哈沃德·加德纳的多元智能假说。当我说“智力”这个词时,我把这个概念理解为一套多维的技能。我可以擅长语言,但不擅长跳舞。另一个人可能有出色的人际交往能力,但缺乏自省。数学和逻辑只是一维。在这一方面表现出色的人更适合在技术、数学学科中学习和工作,比如数据科学。

技术人员有一些共同的特征:他们有逻辑和分析能力,善于解决问题,有批判性思维能力,他们的抽象理解能力是一流的。从某种程度上来说,他们生来就有这样的潜力。当我们出生时,我们不是白板;我们来到这个世界时,已经被预先设定了一些潜在的能力。这些人恰好属于可能适合这些领域的群体。

另一方面,生物预编程没怎么关注过数学和逻辑的人,在数据科学方面的日子会更难过。即使他们很想成为一名数据科学家,并且付出了巨大的努力。原因是他们缺少拼图的关键部分。缺少足够的潜力。这不是不可能的——环境力量可能会补偿较低程度的先天能力——但几率对他们不利。

缺乏教育——未实现的潜力

如果智力在生物学上限制了我们的能力,那么教育在文化上也限制了它们。打个比方,智力将是我们“能力桶”的大小,而教育将是它的满或空的程度。有趣的是,能力桶通常比我们想象的要大,而这正是我们所缺少的适当的教育。

我们的潜力部分是天生的,但实现的程度是后天习得的。如果我的父母都是工程师——在其他条件相同的情况下——我在学校学习数学和物理会比其他学生更容易。如果我参加一门数据科学课程,教授对这个主题充满热情,我会比那些参加其他课程的人学得更快更好。环境解释了——也许比天生的能力更能解释——我们在某一特定领域所能达到的精通程度。

其他环境也会影响我们的教育质量:社会经济地位、历史事件、熟悉关系的亲密程度、缺少机会,或者像我们的出生地这样简单的事情。即使我的父母是工程师——同样,在其他条件相同的情况下——我住在纽约也比住在底特律、孟买或内罗毕要好。可用资源或基础设施条件也影响我们的教育质量。无法获得良好教育服务的人处于不公平的劣势。

最终,休眠的智能和没有智能一样有用。如果潜力没有实现,它的存在并不重要。我们必须接受教育,支持成长和发展我们与生俱来的技能。我准备在 AI 工作,因为我父亲学过物理,我学过航空航天工程,然后参加了几门高水平的 AI 课程。否则,我会不知道我能做什么,也不会尝试在 AI 工作。

缺乏知识—未利用的潜力

数据科学领域已经变得非常有吸引力,因为人们有一种错觉,认为这是一个容易进入且高回报的领域。 《哈佛商业评论》 称之为“21 世纪最性感的工作”数十种在线课程承诺,只要几个月的努力学习,任何人都可以为在一家体面的公司获得数据科学家职位做好准备。我的个人经历进一步强化了这一观念:我于 2017 年 9 月开始学习人工智能,并于 2018 年 1 月在一家人工智能创业公司找到了一份工作。四个月的学习时间似乎不足以学到一个领域的知识来找到一份工作。

解决这种明显不一致的方法是,学习任何东西都有不同的途径。如果我从图灵和符号人工智能的早期思想开始学习人工智能理论,4 年后我还会学习专家系统。而是上了一个简短的课程,了解了一些机器学习的基础知识,然后直接去学习深度学习和编码。我使用了一种自上而下的方法:我通过使用我能找到的最直接的应用程序来学习,而不是牢固地建立基础。

然而,这种方法不是没有风险的。如果一个没有良好数学/统计背景的人——我的例子不成立,因为我是航空航天工程本科生——认为学习 Python、TensorFlow 和一些关键的架构和模型就足以在人工智能中工作,他们就大错特错了。

最近,一些关于这个主题的文章——表达了不同的观点——已经发表在走向数据科学上。Soner y ldr um上个月给写了一篇很受欢迎的帖子说数据科学家应该知道如何做数据工程师的工作。本周早些时候,数据专家克里斯写了一篇有争议的文章声称一个 ML 工程师不需要数学。两天前,Sarem Seitz 发表了一篇与此完全相反的文章。

凡事总有取舍。如果我们选择花更多的时间编码和做真正的项目,我们的理论理解会更肤浅。如果我们选择学习基础知识,接触每一种理论、算法和技术,我们的实践技能会更加浅薄。无论你做什么,如果你没有投入足够的时间去学习一个领域,你的部分潜力将会被闲置。你的教育只完成了一半,这可能会危及你获得数据科学/人工智能工作的选择。

结论

几个原因解释了为什么有人可能不太适合从事某个学科的工作。这三个因素——智力、教育和知识——可以扩展到每个领域。尽管数据科学具有吸引力和横向性,但也不能幸免于这种情况。

有些人不具备在该领域取得成功所必需的先天潜力。其他人因为不同的原因不能享受良好的教育,所以他们的潜力没有得到发挥。其他人可能会忽略对该领域很重要的知识,而最终却没有利用这些知识的潜力。即使有智力、教育和知识的人也可能只是决定他们不喜欢从事技术性工作。无论如何,很难否认有些人比其他人更适合数据科学。

这种情况产生的一个后果是,愿意在这些领域工作的人群与非常适合在这些领域工作的人群并不完全重叠。然而,这篇文章并不意味着阻止人们试图在数据科学或人工智能中找到自己的位置。它旨在描述那些微妙的因素,即使我们不经常考虑,也会影响结果。心中有了更完整的图景,我们就能更好地应对我们和我们的目标之间的挑战。

这个讨论也很重要,因为数据科学在未来会变得更加无处不在。它的横向性可能会使许多现在感觉远不会受到影响的工作中有必要拥有与技术相关的技能。鉴于本文中的论点,如果数据科学和人工智能最终在不久的将来取代工人,那么说“我们可以帮助人们重新安置到人工智能创造的新工作岗位”将不会是一个可实现的政策。

跟我一起去未来旅行了解更多关于人工智能、哲学和认知科学的内容!此外,欢迎在评论中提问或在 LinkedInTwitter 上联系!😃

推荐阅读

</5-reasons-why-i-didnt-take-a-master-s-degree-in-ai-ml-dl-34485822365>

机器学习算法(MLA)最难说的是

原文:https://towardsdatascience.com/the-hardest-thing-for-a-machine-learning-algorithm-mla-to-say-1f3d935fbc60?source=collection_archive---------61-----------------------

我不知道(保罗·尼科勒洛在 Unsplash 上拍照)

摘要: 在这篇文章中,你将了解为什么机器学习算法很难检测到新奇事物,思考人类如何更擅长于此,找出为什么一些常见的方法达不到要求,并欣赏其好处,如果有一种方法可以让机器学习算法说——我不知道。

思想实验

想象一个思维实验,你试图教一个孩子各种水果,如香蕉、苹果、橘子、西瓜等。你向孩子展示每种水果的一些图片(各种大小和形状),以确保孩子熟悉这些水果。最后,当你现在给孩子看一个水果时,他能够根据所学的知识正确地识别它。

包含训练数据的水果图片(由卡玛拉·萨拉斯瓦蒂Unsplash 上拍摄)

让我们假设这个孩子从未见过狮子或大象的图片,而你现在给一个孩子看这样的图片,并让他辨认出同样的图片。一个可能的结果是,孩子要么很安静,要么说我不知道。当然,在某些情况下,孩子可能会把它认作是他最近熟悉的水果之一,但我想这不太可能。

处于困境中的 MLA

你认为用机器学习算法(MLA)做同样的实验会产生同样的结果吗?也就是说,MLA 能说我不知道或者用机器学习的说法,它能把它归类为新物体还是未知物体?

在这个实验中,MLA 可能会将狮子归类为橙色,因为颜色相似;将大象归类为香蕉,因为象鼻形状相似。

注意,MLA 学习图像中的模式,并将它们与适当的图像标签相关联。

可能不起作用的方法

有时候,知道什么行不通和知道什么行得通一样重要。这里有一些我们可能想到的方法,但它们在某个方面存在不足。

用更多数据进行训练 —虽然机器学习中大多数事情的答案可能是用更多数据进行训练,但这是一个例外。无论您拥有多少数据,总会有一个映像不在分布范围内,即不在培训或测试数据范围内,但在实际部署中会遇到。训练有素的 MLA 仍然不能将脱离分布的对象识别为未知对象。

引入更多的分类类别 —同样,仅仅通过增加类别并使其成为多类别分类问题并不能自动解决这个问题。尽管分类粒度可能会变得更好,但它并没有解决识别分布外对象的核心问题。

添加负面类别 —一种方法是添加一堆与目标无关的随机对象,并将所有这些随机对象标记为训练数据中的未知对象。对于我们上面讨论的实验,添加不同的汽车、飞机、动物、鸟、宠物、家具等的图像。并将所有这些标记为未知。这里的问题是负类可以做到多详尽,即可以包括多少随机对象,以及对解决方案的成本和复杂性的影响。

置信分数—MLA 可以与它们的预测的置信分数相关联,该置信分数被表示为概率或百分比。例如,新图像可以被分类为置信度为 92 %的橙色。虽然这似乎是一种明智的方法,但请注意,置信度得分是基于在新图像中看到的与 MLA 已被训练的模式的相似度。对于未知的类别,分类模型可能返回非常高的分数,尤其是当这些类别共享共同的模式时。例如,一只狮子可能被归类为置信度为 78 %的橙色,因为在颜色上可能存在相似性。

那么什么是可行的方法呢?

让我们通过一个例子来了解可以做些什么。

考虑下面的样本代表性数据,该数据使用两个特征— 宽度 (x1 米)和长度 (x2 米)将车辆标记为汽车非汽车(类别标签)。

x 轴和 y 轴上绘制的表示数据边界的平行线将二维(2-D)空间分割成可以用适当的类别标签标注的区域。请注意,在另一个表中显示并以红色绘制在图表上的测试数据点被给予了它们所在区域的标签,即使它们离以蓝色绘制的训练数据点有相当大的距离。这就是为什么 MLA 会将任何新数据点归类到已知类别,而不是将其称为未知

训练和测试数据绘制在带有分类区域的图表上(来源:youplusai.com)

我们需要的是一种机制来标记 2-D 空间中足够重要的区域,在这些区域中,训练数据没有被看作是未知的。如果这样做了,在这个例子中看到的测试数据点将落入未知区域,因此将被标记为未知而不是已知类别。

与标记为未知的训练数据相差甚远的测试数据点(来源:youplusai.com)

请注意,上面描述的是一种方法,而不是简单的解决方案。

在机器学习中识别自己不知道的东西是一个尚未完全解决的难题

由于来自 Aaron Chavez 的参考,我在这个主题上读到的一篇有趣的研究论文的标题是— 深度学习中的不确定性量化是否足以进行非分布检测? 在本文中,作者就深度神经网络检测新输入的能力,比较了几种最先进的不确定性量化方法。总之,他们指出,目前的不确定性量化方法本身不足以进行全面可靠的分布外(与训练数据明显不同的数据)检测。

好处

在基于机器学习的解决方案的实际生产部署中,这种将非分布数据即新颖性作为未知类调用的能力可能有几个好处。

  • 小说数据误分类的规避。
  • 效用——在很难获得完全有代表性的训练数据的领域。
  • 警报—如果被分类为未知类别的数据输入的百分比超过了设定的阈值(比如总分类输入的 10%),则可能会发出警报。
  • 再培训—如果大量数据输入被归类为未知,则可能触发再培训。

由于对数据科学的浓厚兴趣,我将在这个领域探索更多的主题。如果你对这样的努力感兴趣,请加入我的旅程,在推特上关注我,订阅 YouTube 频道。

非常感谢Madhusoodhana Chari的宝贵反馈。

最初发表于youplusai.com

在人工智能和数据科学领域,身为女性的残酷现实

原文:https://towardsdatascience.com/the-harsh-reality-about-being-a-woman-in-ai-and-data-science-cc6a61f9cddc?source=collection_archive---------11-----------------------

变更数据

新数据显示,人工智能领域的女性资历过高,但只占劳动力的不到 22%。怎么会这样?

基里尔·巴洛巴诺夫Unsplash 上拍摄的照片

本周,英国伦敦数据科学和人工智能中心图灵研究所的研究人员发表了一份报告,标题恰如其分: “女人在哪里?绘制 AI 中的性别工作差距" 。他们的发现虽然令人悲伤,但一点也不令人惊讶:女性在英国和世界各地都严重不足,约占人工智能劳动力的 20%。作为一个数据科学的女性,我几乎连这篇文章都没打开过。我知道。我知道这一定是真的。然而,得到这个结论的完全定量分析的前景使我把它通读了一遍。

人工智能劳动力中的性别差距令人不安,原因有几个。最大的担忧是:像数据科学和人工智能这样一个如此容易受到偏见影响的领域,如何能够由一个人口结构如此偏向男性的劳动力推动?谷歌在 2018 年报告称,他们的人工智能员工中有令人震惊的 10%是女性。脸书以 15%紧随其后。想象这些数字是很难的,除非你恰好是一个男性主导空间的女性。当我通读这份报告时,我越来越对“20%女性”这个数字的背景感到震惊,而不是这个数字本身。根据研究人员的其他发现,每一页的性别差距都变得越来越奇怪。让我们看一看。

AI 里女性比男性更有资格

一般来说,如果你是一名从事科技行业的女性,你可能早就怀疑这一点了。在这一点上,男人只符合部分工作标准就申请工作的轶事作为给求职女性的一条建议广为流传。“如果一个男人认为他能做到,你也能!”,我在找现在的数据科学工作的时候听过无数遍。

不管你是否相信这个轶事,事实是,在雇用人工智能劳动力的所有行业,从技术、金融和企业服务到医疗保健和非营利组织,人工智能领域的女性都比男性拥有更高的正规教育水平。虽然平均而言,资格差距看起来相当不明显,拥有研究生或以上学位的女性比男性多 6%,但这一数字在 C-suite 职位(公司高管,如首席执行官、首席技术官等)中高达 13%。

我们多年前就知道,在美国最大的上市公司中,女性占员工总数的 45%,但仅占董事会席位的 20%左右,在 t 2,女性仅占首席执行官职位的 5%。在人工智能中,让这种性别差距变得更奇怪的是,女性平均来说受教育程度更高,更有资格,这应该意味着高薪工作的招聘或进展。可悲的是,图灵报告还显示,女性比男性更有可能在职业生涯中期离职(10-20 年后)。该研究没有说明这是因为缺乏生育支持,还是因为晋升瓶颈导致她们的职业生涯停滞不前。我的意见:可能两者都有。

女性自我报告的技能比男性少

图灵研究所的研究人员使用超过 19500 份人工智能工作者 LinkedIn 个人资料的数据显示,女性可能会在个人资料中自我报告 30 项或更少的技能。不到 12%的女性报告超过 45 种技能,而男性超过 16%。由于女性平均比男性更有资格,研究人员认为原因可能是女性的自信心较低。

我们已经知道“冒名顶替综合症”不成比例地影响着女性,尤其是有色人种女性。事实上,冒名顶替综合症是在一个由 150 名高成就女性组成的队列中首次被描述的。甚至在“冒名顶替综合征”一词被创造出来的 40 年后,可能还有一个信心问题在起作用。

在需要较少技术技能的行业和职位中,妇女人数过多

如果你认为这不能再糟糕了,请坐好:人工智能领域的女性实际上在需要较低技术技能水平的行业中人数过多。主要是,保健、教育和非营利部门的人工智能性别差距从 1.2 到 1.4 不等,其中 0 表示没有妇女,1 表示男女比例相等。在看软件工程、硬件和网络的时候,这个比例下降到 0.4 及以下。

此外,调查显示,女性更有可能从事数据清理、准备和分析工作。与此同时,男性更有可能从事高薪工作,比如机器学习者或软件工程师。虽然性别薪酬差距本身在很大程度上得到了解决,但高薪酬职位缺乏适当的代表性仍然是一个问题。

只有 8%的 Stack Overflow 参与者是女性

如果我们在 Stack Overflow 这样的平台上没有广泛的社区参与,我们作为程序员和数据科学家会是什么样呢?正如图灵报告中所报道的,栈溢出的活跃用户中仅有 8%是女性。花一点时间来思考这些信息。

作为一个以编码为生的女性,我可以用两个字告诉你为什么我们在男性主导的社区找不到女性:性别偏见。就这三个字:普遍的性别偏见。我说的不仅仅是在线游戏社区,它们以敌视被认为是女性的玩家而闻名。

我说的是任何在线空间。2016 年,北卡罗来纳州立大学的研究人员在一项研究中成为国际头条新闻,他们揭示了 GitHub 上的 140 万个拉请求中, 78.6%的女性拉请求被接受,而男性的比例为 74.6%。然而,当他们的性别可以识别时,接受率下降到 62.5%。

在网上很难逃脱这种性别偏见。当我选择我的中间笔名时,我考虑模糊我的性别。我很高兴我没有,虽然我几乎没有看到任何女性与我的写作互动。我收到男人无数的反馈信息;我还没有收到一个女人的来信。

我们能做些什么呢?

女人不希望男人背上“抢饭碗”的黑锅。女性不想成为多元化雇员,尤其是在她们不知情的情况下。女人想要的是平等的机会。然而,这并不是那么容易实现的。

我们需要记录更多的数据

图灵报告的作者多次强调,收集全球和/或区域人工智能劳动力的数据极具挑战性。他们求助于 LinkedIn 和 Stack Overflow 等在线平台进行分析,因为其他数据根本不可用。即使雇主监控员工的多样性和职业发展,也足以说这些数据永远不会成为公共领域。

因此,我们能做的最重要的事情就是让对话继续下去。考虑到缺乏数据,我们必须要求透明度,增加性别偏见问题的可见度。卡罗琳·克里亚多·佩雷斯在她的书《看不见的女人》中写道:

“关于性别数据差距,最重要的一点是,它通常不是恶意的,甚至不是故意的。恰恰相反。它只是一种已经存在了几千年的思维方式的产物,因此是一种T5 而不是 思维。一个不思考的替身,甚至:男人不说话,女人根本不说话。”

记录人工智能劳动力的数据时,假设男性和女性的代表性是平等的,这是一种不好的做法。任何称职的数据科学家都会告诉你这一点。根据 Glassdoor 的年度调查,数据科学家是 2021 年美国第二好的工作。工作满意度得分为 4.1 分(满分 5 分)。知道 80-90%的劳动力是男性,我不禁想:这 4.1 是男性的工作满意度,还是所有人的工作满意度?

我们需要放弃那些不起作用的干预措施

数据显示,我们不能只是希望性别偏见消失。我们必须采取行动。然而,强制性多元化培训和女性专用会议等干预措施并没有产生我们所希望的结果。事实上,他们让事情变得更糟。2016 年,从 800 家美国公司收集的数据显示,团队经理多元化培训五年后,黑人女性的数量减少了 9%。亚裔男性和女性的排名下降了 4%,而白人女性、黑人男性和西班牙裔美国人的排名没有任何变化。

其他数据表明多样化干预效果更好。公司需要(毫不夸张地)阅读整个房间,找到适合员工的饮食,而不是只在招聘时监测多样性,或者只针对特定类别的员工举办研讨会。

结论

  • 女性在人工智能和数据科学领域的代表性不足,尽管她们更有资格。他们更有可能离开自己的职业生涯,而不是晋升到管理职位和高管职位。
  • 我们需要更多关于劳动力的数据,以确保性别偏见得到描述和理解。我们必须使用这些数据来创建一个不会使问题恶化的干预计划。
  • 我们需要继续对话。这包括专业中的每个人。你可以支持我们希望在未来几年看到的改变。

“你好,世界!”ML 陷阱

原文:https://towardsdatascience.com/the-hello-world-ml-trap-1cae6dccdf98?source=collection_archive---------55-----------------------

查尔斯·埃托罗姆在 Unsplash 上拍摄的照片

人们很容易被诱惑去做没完没了的肤浅 ML 模型——不要回避深水区

介绍

机器学习的领域如此广阔,以至于很容易迷失其中。我学习机器的头几个月是在泳池的浅水区四处溅水,甚至没有意识到我在浅水区。我在那里结束的方式是通过文章和博客帖子的示例项目工作,并不断地转到下一个项目,展示不同风格的 ML。

简单的样本项目没有任何问题——典型的“Hello World!”project 是学习计算机科学新知识的悠久传统。但重要的是继续前进,并向池的更深处移动,看看行业领先的专家目前正在为值得生产的模型做些什么。

照片由 Aaron BurdenUnsplash 上拍摄

先说房间里的大象:书籍。在一篇文章或 YouTube 视频中,不可能超越一定的深度。需要一本书来真正深入并详细阐述一个主题。本书要求读者清除TL;DR 的障碍——但是奖励他们的知识可以将一个 ML 模型带到一个全新的水平。

通读一本 ML 书籍需要奉献精神,这类似于为你的公司处理一个新项目。我发现买书比卷起袖子实际阅读要容易得多。我发现让自己保持动力的一个方法是在 Azure 中把每本书都设置成一个项目,并使用看板来跟踪我每章的进度。从 接任务到>做- >完成 绝对有一种极客的快感!

走在路上

我通常给自己几个星期的时间来完成一本书,有时一次做多本书(把东西混在一起)——但从来不会杂耍太多以至于丢失每本书的中心线索。我反复考虑是否要实际输入示例中的代码——我过去更热衷于这样做,最近我发现通过从 GitHub 下载代码,并和书一起阅读,我也能从中获得同样多的收获。对我来说最重要的部分是让每个模型运行起来,这样我就可以在 ML 项目中根据需要重用它们。

以下是我最近一直在研究的一些具体建议。他们都是我在 ML 书籍中寻找的例证:深厚的专业知识和值得生产的代码,以及大量 ML 项目生命周期的态度!

https://www.amazon.com/gp/product/149204511X

https://www.amazon.com/gp/product/1492032646

喜欢什么?

我喜欢上面两本书的地方在于,它们分享了一种实用的方法来构建 ML 解决方案。它们基于对 ML 特定领域的深入了解,并鼓励读者也深入了解。

我在每本书里增加了一些相关的文章、视频和在线课程——这些杂耍可以给有时看起来令人生畏的练习增添许多色彩。但是在一天结束的时候,我发现我在每一章中花的时间越多——并且真的把它放在心上——我带走的东西就越多。把它当成一项长期投资,在未来会不断获得回报。

结论

乔·奇恰雷利在 Unsplash 上拍摄的照片

  • 深入
  • 看书
  • 寻找成功秘诀
  • 描绘终点线

当你在 ML 泳池里嬉水并找到一个让你兴奋的地方后,不要犹豫,去深水区吧!找一本专注于你感兴趣的领域的书,并努力读完它——用类似的文章和博客丰富你的经验。

从别人的错误中可以学到很多东西——找到真正适合你的成功秘诀,并将它们作为你下一个项目的模板!

试着想象一下你正在开发的 ML 模型是如何插入到生产系统中的。退后一步,挑战自己,不要仅仅孤立地看待模型,而是要在为客户提供端到端解决方案的背景下看待它。你能想象一个能让客户满意的完整渠道吗?

圆周率的隐藏之美

原文:https://towardsdatascience.com/the-hidden-beauty-of-pi-a694422a0740?source=collection_archive---------16-----------------------

在圆周率日用圆周率的前 1000 位数字制作的图像。

照片由谢里·西尔弗Unsplash 上拍摄

3 月 14 日是阿尔伯特·爱因斯坦的生日,它有着特殊的意义。这一天还有一个奇怪的变化,它被写成 3.14,是圆周率常数的近似值,这一天被官方庆祝为 π 日。人们通常通过烘烤或吃馅饼来庆祝这一天。

数学常数是通过取圆的周长与其直径之比来计算的。2019 年,谷歌员工艾玛·相户爱 Iwao 通过将圆周率的值计算到 31 万亿位,打破了吉尼斯世界纪录。计算出的精确位数是 31,415,926,535,897(见相关关系)。使用 25 台虚拟机执行计算大约需要 121 天。

出于实际目的,我们不会使用精确到万亿分之一位的精度。在实际情况下,pi 近似值可能会限制到小数点后第 5 位,因为近似值导致的误差将趋于零。美国国家航空航天局局长兼首席工程师解释了美国国家航空航天局工程师使用的圆周率常数的精确度,精确到小数点后第 15 位。

那么,圆周率的这许多位数有什么用呢?有创造力的头脑发现了圆周率数字在数据艺术中的用途,这使得无穷级数变得有限,并被限制在数字画布上。这里是我在 R 中复制的一些马丁·克日温斯基创造的圆周率艺术。

为了创造视觉效果,我考虑了圆周率的前 1000 位。

圆周率螺旋上升

在这个画面中,圆周率从圆心开始,向外盘旋。第一个图像具有沿着螺旋轨迹绘制的 1000 个 Pi 数字,这些数字在第二个图像中变成点。每个数字都用一种颜色表示。在第三个可视化中,螺旋用偶数和奇数进行颜色编码。

作者图片

作者图片

作者图片

带 Pi 的随机游走

对于随机漫步,数字 0 到 9 被分配了方向,当数字出现在圆周率近似值中时,光标向相关方向移动一个单位,从而创建了一个漂亮的再现。

作者图片

船上码头

圆周率的数字用颜色编码,奇数用空心点表示,偶数用实心点表示。

作者图片

Pi web

这是马丁·克日温斯克复制圆周率艺术的失败尝试,但产生了圆周率可视化的不同版本。为提出了一个全新的视觉效果而感到自豪(还没有见过这样的视觉效果)。

作者图片

这是我在数据科学之旅中急需的一次休息。我可以称之为突破,尽管我仍然使用了 ggplot2 包和所有可能在分析中使用的数据操作技术。这里的结果要漂亮得多。

我相信你们喜欢 Pi 的视觉效果。当你们厌倦了处理数据时,你们会做什么?分享你的激情?在下面的链接中查看更多酷炫的视觉效果。

寻找灵感:

  1. https://www . vice . com/en/article/qkwdbp/visualizing-the-infinite-data-of-pie
  2. https://www.visualcinnamon.com/portfolio/the-art-in-pi/
  3. https://public.tableau.com/shared/QJ5PHW26D? :display _ count = yes&:show viz home = no

参考资料:

  1. https://blog . Google/products/Google-cloud/most-calculated-digits-pi/
  2. https://fivethirtyeight . com/features/even-after-31 万亿-was-behind-no-closer-the-end-of-pi/
  3. https://www . JPL . NASA . gov/edu/news/2016/3/16/how-many-decimals-of-pi-do-we-really-need/

链接到代码

您可以在 LinkedInTwitter 上与我联系,跟随我的数据科学和数据可视化之旅。

GPU 低效的隐藏世界

原文:https://towardsdatascience.com/the-hidden-world-of-gpu-inefficiency-776ae1c9cf5?source=collection_archive---------36-----------------------

一种重要、强大、珍贵的资源大多处于闲置状态。为什么?

UnsplashDuan veverkolog拍摄的照片

就像一头沉睡的狮子,我们已经使用的图形处理器比看起来要强大得多

本文是三篇系列文章中的第二篇。这里有 1 3

的上一篇文章中,我们探讨了近期的业务转型如何受到 GPU 供应紧张的威胁。我们知道 GPU 是新兴技术的关键资源,费用已经成为许多组织的瓶颈,GPU(和相关新兴芯片设计)的需求和供应方面的宏观趋势都指向严重短缺。

然而超过 85%的 GPU 总容量闲置 对于使用 GPU 的公司来说,这不仅在财务上非常低效,而且从环境角度来看也非常令人震惊— 全球计算的大部分排放、有毒化学物质和水消耗都是由制造过程造成的,如果我们能够以更少的资源做更多的事情,所有这些都会大幅减少。我们当然不会容忍我们生产的 85%的汽油被浪费掉。那么为什么我们会容忍 GPU 被如此低效的使用呢?

简短的回答是:因为(目前)我们几乎没有选择,由于我们如何将软件应用程序连接到他们需要的 GPU 的现状约束。

GPU 已经被排除在分解和虚拟化趋势之外

几十年来,计算的趋势已经从集中式系统转向分散式服务。虚拟机、网络连接存储、软件定义的网络、容器—所有这些都促使当今的计算环境比以往任何时候都更加灵活和高效。

但是,尽管加速器在现代数据中心的重要性不断上升,GPU 却像一个疼痛的拇指一样突出,在其配置中保持顽固的静态。

PCIe 皮带的物理束缚

当然,有一些复杂的因素在起作用,但有一个主要的限制迫使我们进入这种不灵活的模型:运行 GPU 密集型应用程序的操作系统通过一种称为外围组件互连快速(Peripheral Component Interconnect Express,简称 PCIe)的高吞吐量连接与 GPU 紧密相连。

简单来说,应用程序向其 GPU 发送大量数据。发送的数据类型在很大程度上取决于用例(纹理、网格、图形的命令缓冲区、机器学习的训练数据集等)。),但一般来说,用网络术语来说,GPU 必须非常“接近”运行应用程序的操作系统(通常在同一台物理机器内),从而使操作系统环境与 GPU 保持物理联系,通常是一对一的联系。

峰值工作负载和自私的利用率

当一个组织问“我们的 GPU 性能如何?”,他们可能会运行 GPU 基准测试。但基准测试旨在将 GPU 推向最大利用率——它们能告诉你的只是最佳情况下的性能场景。这就像你的汽车在下坡滑行时测量每加仑汽油的英里数一样——有趣,但不代表现实。你真正需要知道的是你在真实环境下行驶了多少英里。

正如我们在上一篇文章的中提到的,在 GPU 上运行的大多数计算工作负载的真实环境非常“尖锐”——它们使用大量 GPU,然后做一段时间其他事情,然后回来要求 GPU 再次努力工作,然后再做一段时间其他事情。

一分钟内真实的 GPU 利用率模式可能如下所示:

大量空白=低利用率

因此,一个组织可能知道其 GPU 的最高性能,并且可能知道 100%的数量的 GPU 都在使用中。不太明显的是,每个单独的 GPU(平均而言)的运行效率低于 15%,因为它被一个物理上受限制的操作系统实例“自私地”使用,该实例呈现出一种峰值利用率模式。

这就是 GPU 低效的隐藏世界。

停下来思考一下这其中的含义:

出于某种目的,您的企业决定通过 GPU 在高性能计算方面进行重大(几乎肯定会不断增长)投资,无论是图形(可能是视频游戏开发或动画)还是纯计算(可能是深度学习),并且已经购买或租赁了内部部署的 GPU 硬件,正在从云提供商处租赁,或者两者兼而有之。

但是,理所当然的现状自私的操作模式,通过物理束缚的一个操作系统实例到一个 GPU 模型服务的尖峰工作负载,导致 85%的投资被浪费。

今天,提高利用率的尝试非常有限

当然,有一些现有的提高 GPU 效率的策略,如果我没有提到它们,那将是我的失职。这里有助于对分割共享进行关键区分:

分割:将 GPU 容量分割成更小的独立块(如 MIG )和/或预定时间块(使用类似 Slurm 的编排系统),每个块仍然一次只能由一个消费客户端使用。

分割根本不能解决自私的问题——任何给定的块仍然会经历峰值利用率。

共享:共享 GPU 容量,以便多个消费客户端同时使用,客户端的工作负载在同一个共享 GPU 区块内重叠。

Nvidia 的 vGPU 可以做到这一点,但所有消费客户端都必须是与 GPU 位于同一物理机上的虚拟机,这也是物理共享问题,它严重限制了池的大小,从而影响了 GPU 的利用率。

“真正的”GPU 共享填补了峰值,并提高了利用率

想象一下“真正的共享”——允许许多客户端系统远程和同时访问许多 GPU 块,当它们的工作负载达到峰值时,块的利用率高达 100%,但在需要时,将全部 GPU 容量留给其他客户端的峰值。像这样:

空白少=高利用率

就像我们的电网通过在一个广阔的区域汇集提供商和消费者来平衡容量,而不是在每个街区都建立一个发电站,极大地扩展客户端(GPU 的消费者)和服务器(GPU 的提供商)的池使给定的工作单元更有可能由合适大小的硬件单元来服务,让我们有效地匹配供应和需求。

由虚拟或物理 GPU 服务器(绿色)动态服务的大量虚拟或物理客户端(蓝色)

在这个世界中,GPU 加速看起来更像是一项简单的服务,甚至是一个实用程序,最重要的是,它的利用率接近 100%。

实现这一愿景需要两大飞跃。

首先,我们必须挣脱 PCIe 的束缚。尽管出现了增加 PCIe 范围以扩展池的解决方案,但池仍然是有限的,而且这些解决方案需要额外的专用昂贵硬件,并且不适合许多环境。

因此,第二,我们需要我们的解决方案是纯软件的。通过这种方式,我们可以针对任何加速器用例,在任何操作系统、任何设备和任何环境中无处不在地部署它,而不必担心太多的细节。与通过提高利用率创造的巨大价值相比,纯软件方法还可以轻松测试、轻松交付,并以较低的成本出售,因此各方都是赢家。

我们正在实现这两个飞跃。在我的下一篇文章中,我将解释这是如何做到的。

史蒂夫·戈利克是 果汁实验室 的联合创始人,这是一家初创公司,其愿景是让计算能力像电力一样容易流动。

自动化武器的高成本

原文:https://towardsdatascience.com/the-high-cost-of-automated-weapons-7c07dc9e186f?source=collection_archive---------32-----------------------

播客

雅各布·福斯特谈人工智能驱动的杀手无人机

苹果 | 谷歌 | SPOTIFY | 其他

编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。

自动化武器意味着更少的伤亡、更快的反应时间和更精确的打击。对任何部署它们的国家来说,这都是一个明显的胜利。你可以看到吸引力。

但它们也是经典的囚徒困境。一旦许多国家部署了它们,人类就不再需要被说服投入战斗,引发冲突的障碍也大大降低了。

无人机等自动化武器系统带来的真正风险并不总是显而易见的。其中许多以二阶效应的形式出现——这是建立一个多个国家拥有大型自动化力量的世界所带来的连锁反应。但是我们能做些什么呢?这就是我们在本期播客中与 Jakob Foerster 一起探讨的问题,Jakob Foerster 是多主体强化学习的早期先驱,也是多伦多大学的新任教师。雅各布参与武器化无人机自动化的辩论已经有一段时间了,最近他给德国政界人士写了一封公开信,敦促他们考虑与部署这项技术相关的风险。

以下是我在对话中最喜欢的一些观点:

  • 目前,武器系统一般都是在人的参与下建造的,这就防止了未经训练有素的专家批准就发射。虽然这减缓了反应时间,但它在减少意外使用武器攻击错误目标或在错误情况下的机会方面发挥了关键作用。冷战的历史包括许多案例,其中一个人通过中断反应循环避免了灾难——就像俄罗斯海军军官瓦西里·阿尔希波夫的案例。
  • 将人类完全排除在反应循环之外,有可能导致一连串被误解的敌人行动导致冲突在人类控制之外迅速升级。这并非没有先例:算法交易导致了类似的失控效应,有时会导致交易暂停和重大价值损失,正如 2010 年闪电崩盘期间可能发生的那样。
  • 至关重要的是,人在回路系统还使得高度自动化系统的行动更容易归因于特定的人或权力。将人类从这些决策循环中移除的风险之一是,如果没有一个人具有明确的组织隶属关系,那么就很难判断——即使在原则上——谁应该对给定的攻击或生命损失负责。
  • 武器化系统的自动化也对民主原则构成威胁。从历史上看,至少大多数公民的同意——通常是在军队中——对所有治理模式的稳定都至关重要。但自动化系统可能会让一小群人有效地挟持一个国家。因此,公民代表政府的价值将会降低,暴政变得更有可能。
  • 我们如何才能最好地避免这些风险?目前的方法侧重于协商无人机等系统的自动化程度。理论是,只要我们让人类参与进来,或者不允许使用自动化来做出某些类型的决策,我们就可以安全地避免这项技术最危险的影响。但 Jakob 不同意这种方法:正如他指出的,一种决策的结束和另一种决策的开始并不总是很清楚,尤其是在涉及机器学习的时候。因此,从“全人类”到“全人工智能”的武器系统有一个连续的范围。由于政府和军队总是面临着向“完全人工智能”方向发展的竞争压力,雅各布担心随着时间的推移,事情会向这个方向发展。
  • 因此,雅各布主张进行更清晰的区分。他建议将重点放在武器化上,而不是将“全自动系统”从“其他系统”中分离出来。雅各布认为自治系统应该是合法的,除非它们是武装的。
  • 我们的讨论强调了我们之前在播客中讨论过的一个问题:我们政府中制定人工智能政策的人通常不了解他们正在监管的技术。只是因为雅各布的技术专长,他才能够识别使用“自动化程度”作为武器系统合法性的晴雨表所涉及的风险——而类似的错误无疑正在其他同样关键的领域犯下。正如雅各布所言,这就是为什么人工智能研究人员在思考其工作的政策影响方面发挥更积极的作用如此重要。

你可以在 Twitter 上关注 Jakob 这里,或者 me 这里

章节:

  • 0:00 介绍
  • 2:00 背景故事
  • 5:04 技术知识的价值
  • 10:45 自动化武器的能力
  • 15:05 军备竞赛
  • 22:10 这些技术的个人所有权
  • 27:05 不稳定的平衡
  • 31:05 连接到开源文化
  • 36:50 资助政策工作
  • 39:10 鼓励沟通
  • 41:10 国际合作
  • 48:30 弥合知识差距
  • 52:00 参与
  • 53:45 总结

关键词搜索的高成本

原文:https://towardsdatascience.com/the-high-cost-of-keyword-search-9b147d4b2452?source=collection_archive---------24-----------------------

艾米丽·莱文在 Unsplash 上拍摄的照片

基于深度神经网络的语义搜索正在改变信息检索。

当大多数计算机科学家想到信息检索时,像 TF-IDF 和 BM25 这样的统计关键字算法可能会出现在脑海中。这些都部署在开源系统中,比如 Apache Lucene 和 Apache Solr。关键词搜索的云版本可以从 Elasticsearch 和 Algolia 等公司获得。

你可能不知道的是,自然语言处理(NLP)的进步,特别是 2017 年变形金刚的推出,已经带来了一种新的信息检索风格,被称为神经信息检索(简称神经 IR)和语义搜索。这些系统的定义特征是,它们应用神经网络在比关键字搜索更深的层次上理解语言。这使他们能够呈现更广泛的相关内容,同时更精确地显示结果。

神经信息检索系统还处于起步阶段,如果你有兴趣深入了解这个领域,我推荐 Mitra 和 Craswell 的神经信息检索导论2020 年初发布的亚马逊 Kendra 是这种系统的第一个商业例子,而2021 年 4 月发布的微软语义搜索Vectara 神经搜索则更近一些。

目标

在本文的其余部分,我们将构建一个针对一小部分
酒店评论的搜索。我将使用 Vectara 的神经搜索平台,因为它旨在轻松、经济地集成到 SaaS 和 PaaS 产品中,并且具有跨多种语言索引和搜索内容的独特能力。

你可以从 GitHub 下载这篇教程的源代码,网址是 amin3141/zir-souffle

酒店评论集

OpinRank 数据集包括来自全球主要城市的大量酒店评论。出于演示的目的,我们将对旧金山三家评论最多的酒店进行搜索:贝斯特韦斯特托斯卡纳酒店、喜来登渔人码头酒店和威斯汀圣弗朗西斯酒店。

数据文件具有简单的制表符分隔格式。第一列是审查的日期,第二列是标题,第三列是实际文本:

Nov 16 2009 The Prefect Hotel Have visited San Francisco several times and this…
Nov 15 2009 Great location and great hotel My friend and I…
Nov 13 2009 Perfect experience This hotel was perfect. It was a brilliant location…

首先,我们将每个评论分离到它自己的 JSON 文档中,并保存为一个单独的文件。我们将包括酒店的名称和评论的日期作为元数据(Vectara Neural Search 自动返回元数据和搜索结果。)

{
 “documentId”: 1036995557631769528072025822232699890,
 “metadataJson”: “{\”date\”: \”Apr 23 2005\”, \”hotel\”: \”best_western_tuscan_inn_fisherman_s_wharf_a_kimpton_hotel\”}”,
 “section”: [
 {
 “text”: “We spent six nights at the Tuscan Inn and have nothing but rave reviews for this hotel! The location was perfect. Walking distance to Cable Cars,Wharf, Bus 47 and F Line. Great restaurant with a friendly staff. Everyone was pleasant and very helpful. Nice clean rooms and a spaciousbathroom. We are anxious to return!Mary and Jack from Scituate MA”
 }
 ],
 “title”: “Great Hotel”
}

文档 ID 是全文审查的 murmur3 x64 128 位哈希。当返回搜索结果时,会包含这个 ID,这使得查询系统可以轻松地检索整个文档。为了便于查找,
opinrank2json.py 程序实现了这个逻辑,它还创建了一个 SQLite 数据库,包含文件中的所有评论,以文档 ID 为关键字。

索引数据

就像 Algolia 和 Elasticsearch 这样的关键词搜索系统一样,你必须将你想要搜索的内容推送到平台中,这样它才能被索引。Vectara Neural Search 为此提供了基于 gRPC 的 API,以及支持快速原型制作的基于 UI 的拖放。

  1. 登录您的账户
  2. 使用左侧菜单导航到语料库,并创建一个名为“酒店评论”的新语料库。语料库只是一个命名的文档和文本材料的集合,可以在以后查询。
  3. 点击并打开酒店评论语料库。将包含评审 JSON 文档的文件夹拖放到语料库中。

登录您的帐户并上传客户评论。

在添加后的 5 到 10 分钟内,文档将变得可搜索。您可以通过在 Hosted UI 选项卡上运行查询并检查是否返回结果来验证这一点。

安全性

因为对平台的所有访问都是经过认证的,所以我们需要一个有效的用户来连接和运行查询。现在,为了方便起见,我们将使用 OAuth 2.0 客户端凭证流。通常,只有当客户端在受信任的环境中运行,并且凭据可以保持安全时,例如在运行的服务器中,才应该使用此流程。

创建一个应用程序客户端,并授权它读取酒店评论文集。

  1. 使用左侧菜单,导航至认证→ 应用客户端,并点击“创建应用客户端”按钮。
  2. 为其命名(例如 hotels-cli),将类型设置为客户端凭据,并输入任何用于回叫和注销的 URL(例如 https://auth.vectara.dev)。注意客户端 id客户端秘密,因为在连接和运行查询时都需要它们。
  3. 点击返回语料库,点击授权选项卡,点击“创建角色”按钮。选择您在第二步中创建的应用程序客户端,并授予它查询语料库的权限。

语义搜索 CLI

信息检索的神经方法围绕着单词、句子和段落的矢量化。神经网络是以短语作为输入并产生高维向量作为输出的数学函数。这些向量以这样的方式表示短语的语义,即具有相关语义的短语共享向量空间中的几何结构。这些向量经常被称为嵌入

由于这种抽象的性质,神经系统对拼写错误
和其他丢掉关键字系统的错别字是健壮的。相比之下,为了获得好的结果,关键字系统通常必须配置停用词移除、词干提取和拼写纠正。

为了使教程简单,我们将构建一个基于 Python 的命令行解释器,它接受查询并返回我们之前添加的客户评论中的最佳匹配结果。Vectara 神经搜索在每个结果中返回以下信息:

  1. 文档 ID 和元数据。客户端使用该信息将结果连接到原始信息源,并在上下文中显示它。我们将使用文档 ID 来查找并显示完整的评论。
  2. 相关片段。一个文档通常包含许多主题,因此搜索结果包括它认为最相关的部分。一般来说,在向用户显示这个代码片段时,显示一点周围的文本是有帮助的。
  3. 一分。分数是与搜索结果的可信度相关的实数。重要的是,这个分数是而不是一个校准的概率,所以应该谨慎解读。然而,它可以安全地用于下游机器学习模型,如重分类器。

我已经在 hotels.py 中实现了一个完整的客户端。下面的代码展示了如何使用请求库提交查询。

探索语义搜索

下面的动画 gif 展示了一个交互式语义搜索会话。第一个问题“房间宽敞吗”的结果表明,搜索理解单词宽敞的语义,因此可以返回类似“唯一的缺点是房间大小”的结果。

第二个查询询问“附近的餐饮”,搜索能够返回相关结果,而没有关键字重叠,例如“Alos[原文如此],邻近餐馆的食物非常好!”

通过 hotels.py 命令行解释器运行三个查询。

最后,第三个查询故意拼错了一个关键词,“早餐自助”,但搜索仍然返回了自助早餐甚至自助早餐的结果!

结论

大量的研究已经证实了相关性在吸引和满足用户方面的重要性。例如,微软 2012 年的一项研究展示了相关性降低和用户参与必应搜索的长期减少之间的因果联系。众所周知,谷歌在搜索结果排名中超越了关键词,加入了关于网页链接结构的信息,从而战胜了 Alta Vista、Lycos 和其他公司。

无论你的目标是提高用户参与度,或者你只是想帮助你的用户快速找到最相关的信息,你每天都要以丢失和不相关的搜索结果的形式支付关键字搜索的高成本。各种各样的应用程序,如电子商务、客户支持、企业搜索和法律电子发现,都将从语义搜索技术的出现中受益,语义搜索技术有望重塑信息检索的格局。

关于数据科学的最高工资,美国劳工统计局的数据能告诉我们什么?

原文:https://towardsdatascience.com/the-highest-data-science-salaries-ef495645911a?source=collection_archive---------18-----------------------

深入探讨各州的数据科学就业水平和薪酬

Jp 瓦列里Unsplash【1】上的照片。

目录

  1. 介绍
  2. 就业水平
  3. 州工资明细
  4. 摘要
  5. 参考

介绍

数据科学薪资各州不同,行业不同。本文讨论的职业、就业和工资统计数据来自美国劳工统计局。无论您是在计算机系统设计和相关服务行业,还是在公司和企业的管理层,您都可以期待数据科学的工资是劳动力中最具竞争力的工资之一。下面,我将分析某些州的就业水平,以及这些州的工资,同时也指出一些可能影响你总税后工资的关键因素。

就业水平

Toa HeftibaUnsplash【3】上拍摄的照片。

科学家的数据量因州而异,我们将看到哪些州拥有最多。值得注意的是,是的,一些州的总人口比其他州多。另一个警告可能是远程工作。随着这种趋势的增长,我们可能需要研究远程水平与物理水平,以及这如何影响每个州的整体就业水平。

在下表中,你可以看到就业水平最高的州是加利福尼亚州,大约在9,510左右,然而,它并不是每千份工作中就业水平最高的州——哥伦比亚特区在0.86位居第一,而华盛顿州位居第二,在下表中位于0.82

BLS 就业数据作者列表[4]。

*作为参考,最绿色是每千份工作中最高的就业率,按降序排列。

州工资明细

提莫·维林克Unsplash 上拍摄的照片。

薪水可能更有意思一点,因为有许多因素不仅可以提高数据科学家的薪水,也可以提高所有职业的薪水。话虽如此,它可能会被一些州的高得多的州所得税所否定,所以即使某个州的工资最高,它也可能不会最终取决于该州的税收和生活成本。

在下表中,你可以看到加州人的最高年平均工资是$129,060。你还可以看到,在这个排名中,从第一名到第五名有了显著的跃升,因此,即使是美国的平均水平也可能会被一两个生活成本更高、人口数量更多的州所扭曲。

BLS 薪资数据。作者列表[6]。

*供参考,最黄的是最高年平均工资,按降序排列。您还可以看到,每小时平均工资统计数据与“薪金”列直接相关。

总的来说,有许多因素会影响你一天结束时的实得工资……或工资期。

以下是一些我认为可能导致这一数字相对减少或增加的因素(如果有任何你知道的因素,请随意在下面评论):

  • 州税
  • 州生活费用(住房、杂货等。)
  • 通勤或远程工作环境

其他一些警告是,这些数据在技术上由“数据科学家和数学科学职业”组成,因此仅对于数据科学,这些值可能不同。

摘要

如你所见,与其他职业相比,数据科学的工资较高,在未来 9 年左右的时间里,工作前景更好,看起来这一职位将会继续存在。根据你所在的行业和你工作的州,你可以期待略有不同的薪水。需要注意的一点是,随着工作场所变得越来越偏远,我们可能会问这样一个问题:

远程公司的薪资会有变化吗?

只有时间能证明一切。可以说,公司可能会减少或增加工资。如果你的公司大楼开始成为过去,也许这些运营资金可以转移到工资上。很难知道,大部分公司大概都会不一样。我问你一个问题:你在哪个州和哪个行业工作——你同意这个分类中的工资数额吗?你认为随着时间的推移会发生什么?

总而言之,我们讨论了数据科学职业的两个主要方面:

* Employment Level* State Salary Breakdown

感谢您的阅读!如果您有任何问题,请联系我,如果您有任何经验、同意或不同意上面看到的数字,请在下面评论。除了你在这份报告中实际看到的以外,你还能想到哪些因素会导致税后工资的增减?

参考

[1]照片由 Jp ValeryUnsplash(2019)上拍摄

[2]美国劳工统计局,职业就业和工资统计,(2021)

[3]照片由 Toa HeftibaUnsplash(2018)上拍摄

[4] M. Przybyla, BLS 就业数据,表格,(2021 年)

[5]照片由 Timo WielinkUnsplash 上拍摄,(2020)

[6] M.Przybyla, BLS 工资数据,表格,(2021 年)

透过计算机象棋和法律人工智能的镜头看人工智能的历史和未来。

原文:https://towardsdatascience.com/the-history-and-future-of-artificial-intelligence-through-the-lenses-of-computer-chess-and-legal-a-i-a7b7327f8800?source=collection_archive---------13-----------------------

达米亚诺·林戈里在 Unsplash 上拍摄的照片

深度采访贾普·范·登·赫里克教授

虽然我们可能只是处于人工智能革命的黎明,但我们周围没有人工智能的世界已经是不可想象的了。四十年前不是这样;那时,几乎没有人知道这个术语。在过去的几十年里,人工智能经历了巨大的发展。国际象棋和围棋的世界冠军在计算机面前毫无胜算,汽车可以自动驾驶,一些人声称图灵测试已经通过。虽然一些专业人士担心他们的职业会灭绝,但其他人似乎远不会被人工智能取代。

在这次对贾普·范·登·赫里克教授的采访中,我们将总结四十年来人工智能的进步。此外,我们还将讨论未来的发展。

1981 年,Jaap 是 B.N.V.K.I .的 19 位创始人之一,他与 Bob Wielinga 和 Denis de Champeaux de Laboulaye 一起领导着这个由阿姆斯特丹和代尔夫特掌控的组织。他们有雄心将人工智能放在荷兰研究议程的显著位置。当贾普在 1983 年被授予“计算机国际象棋、国际象棋世界和人工智能”博士学位时(见相关参考资料,以下简称 R.R .),他的推广人之一阿德里安·德·格鲁特教授不相信他所说的计算机在未来会打败世界上最伟大的国际象棋选手。1997 年,人类国际象棋世界冠军(1985-2000)卡斯帕罗夫被国际商业机器公司的深蓝击败,这一说法被证明是正确的。

作为一个有远见的人,范·登·赫里克教授(以下简称 vdH)在 1991 年预言,机器将在未来审判法庭案件并取代法官(R.R .,1991)。这种国王的策略在当时是一种滑稽的说法,但随着技术的发展,它变得越来越现实(见电影《女王的策略》)。在他的职业生涯中,vdH 向 91 名博士生授予了博士学位,他为各种组织*的建立做出了贡献,并因其在计算机国际象棋方面的研究于 2014 年获得了 Humies 奖,在他作为法律和计算机科学教授退休后,他被任命为 Orange-Nassau 勋章的官员,这是一个为社会做出特殊贡献的个人颁发的皇家奖项。

范·登·赫里克教授,你的博士论文关注的是计算机象棋。同时,你自己也是一名优秀的棋手(2290 分);你还能打败你的算法吗?

是的,我可以。早期的国际象棋程序不是很好,直到 1980 年代中期,我都可以相当轻松地击败他们,并在 1988 年打出标准杆。1966 年 11 月,理查德·格林布拉特在贝尔实验室开发了 MACK HACK VI 国际象棋程序,实际上已经开始开发了。这是世界上最好的。然而,在马萨诸塞州业余锦标赛上比赛时,它只被评为 1243。之后,建立了全方位的计算机国际象棋程序,最终形成了超世界冠军的游戏实力。

你论文的主要贡献是什么?

我的博士论文(Delft,1983)是荷兰最早的人工智能论文之一。它是多学科的(计算机科学、心理学和哲学)。它始于对人工智能和计算机国际象棋历史的描述。在我的研究中,我研究了知识最小化知识分类等价类的使用*、类的组合以及象棋残局中复杂的组合评估的方法。接下来是对击败人类世界冠军的项目的影响分析。我在个人访谈中收集了来自克劳德·香农、赫伯·西蒙、肯·汤普森、唐纳德·米基、阿德里安·德·格鲁特、米哈伊尔·博特文尼克、马克思·尤伟、阿纳托里·卡尔波夫、简·蒂尔曼、根纳·索松科和许多其他人的想法。最后,我专注于关于计算机、直觉和创造力的哲学问题。

在仪式答辩之前,代尔夫特理工大学安排了一场新闻发布会,讨论我对人工智能对社会的潜在影响的研究和思考。我的期望很高;我预言有一天国际象棋电脑会打败世界冠军。

“人工智能”这个术语在当时是什么意思?

如今,人工智能应用层出不穷。在一开始(20 世纪 50 年代),情况并非如此,人工智能可以分为四个领域:

1.国际象棋和跳棋

2.知识表达

3.问题解决

4.语言翻译

你对人工智能的定义是什么?

正如人工智能随着时间而进化,我的定义也是如此。在我的博士论文答辩之前,我一直使用赫伯·西蒙的定义:“人工智能程序应该模仿人类思维”。

然而,很快我意识到计算机程序在国际象棋方面会远远胜过人类,我对这个定义的想法也发生了转变。对人工智能研究人员来说,计算机国际象棋是一个很好的例子,但“模仿”在定义上过于严格。我的第二个定义(1983 年至 2000 年)是基于唐纳德·米歇尔关于人类之窗的定义。我的定义是:'人工智能程序是一种能够洞察人类思维过程的计算机程序。这个定义的目标是在人类窗口的范围内构建程序,这意味着它们是人类可执行和可理解的。

然后,'学习'和'深度学习'进入了场景,现在我倾向于将'人工智能'和'自然智能'这两个术语分开。显然,“智力”指的是聪明的行为或对复杂问题的巧妙解决。但是我们应该区分人类智能和人工智能。我目前的定义(2000 年至今)是:'人工智能是以适当的方式解决现实世界中问题的能力'

计算机象棋的发展与人工智能的发展有相似之处;你能解释一下每十年的发展吗?

早期的国际象棋计算机是基于搜索算法和基于规则和库的。然后,计算能力呈指数级增长,象棋计算机的性能也是如此。一般来说,每个十年都有特定的发展。

五十年代:这十年的重点是 搜索 算法;树搜索和评估。克劳德·香农和艾伦·图灵对所有作品进行量化,然后将这些作品的估计值相加。具有最高值的位置是优选的。约翰·冯·诺依曼也是如此。

六十年代:这十年,强调的是知识和 知识表征;特别关注位置特征(例如,开发件、打开的文件)。这十年的一个典型例子是理查德·格林布拉特的 MACK HACK VI 国际象棋程序。

七十年代:五十年代( )和六十年代( )的发展在七十年代被 了,我的学位论文就是一个很好的例子。由于计算能力的显著提高,这两个方面的结合成为可能(MACK HACK VI,1966 年由 BELLE (Ken Thompson,1980 年)从每秒 200 个节点提高到 160 000 个节点)。

八十年代:随着 并行 的引入,计算能力在八十年代进一步提高。1988 年,深度思考国际象棋程序击败了国际象棋大师本特·拉尔森。它结合了 64 个国际象棋筹码,每秒钟可以考虑多达 50 万个位置。

九十年代: 分布式 系统被研究并用于计算机象棋。任务是通过调度来分配和执行的——在这个十年的前五年,两个荷兰程序占主导地位,即。g . I . d . e . o . n .(Ed sch rder)和 FRITZ (Frans Morsch)分别在 1992 年和 1995 年获得了世界计算机国际象棋冠军(W.C.C.C .)。然后,在 1995 年,IBM 的深蓝 I 项目开始了。它有 36 个处理器,但在 1996 年以 2 比 4 输给了国际象棋世界冠军加里·卡斯帕罗夫。在那次失败后,深蓝 II 被开发出来,比它的前辈拥有更强的计算能力;它每秒可以评估 250 万个位置。结果在 1997 年,深蓝二以 3.5–2.5 击败卡斯帕罗夫。

总之,深蓝用 高级计算 (被 R.S./6000 计算机所知)和机器学习的引入标志着国际象棋程序新时代的开始。他们使用所谓的“Dap”“Tap ”,在打开的文库和随后的搜索过程中寻找模式。然而,IBM 开发的研究结果和技术并没有公开。他们被认为是单一的知识点。

2000 年代:在这十年里,弗朗斯·莫什通过他的商业产品 FRITZ 和 DEEP FRITZ 将超人的力量公之于众。2002 年,弗里茨与新科世界冠军弗拉迪米尔·克拉姆尼克打了 8 场比赛;结果是 4 比 4。然后,在 2006 年深弗里茨赢得了 6 场比赛与 Kramnik 的 4-2。这是人类象棋优势的终结。

国际象棋界发生了巨大的变化。在世界锦标赛期间,公众不再被允许进入比赛大厅,因为所有的观众都通过他们的电话知道最好的移动,只有世界冠军和竞争者不知道。

2010 年代:在研究方面,大多数进展是通过结合机器学习、后来的深度学习和神经网络实现的。2004 年,我与奥米德·戴维·塔比比、内森·内塔尼亚胡和摩西·科佩尔一起启动了一个进化计算项目。主题是使用 遗传算法 来调整评估函数,以便象棋算法可以从头开始学习(即,程序只知道棋子如何移动)。我们对 2014 年大会的贡献获得了 2014 年 H.U.M.I.E.S .奖。这是一个突破,因为简单来说,它展示了 随机学习 的力量。这个想法本身已经导致了 2012 年与 Jos Vermaseren (Nikhef)的合作。然后,我们将这个概念应用到费曼图上,并为 H.E.P.G.A.M.E(高能物理游戏)制定了一个 蒙特卡罗树搜索 。该建议被接受为 ERC 高级研究项目。此外,在这十年中,DEEP 'MIND 在计算机围棋中的表现占主导地位。ALPHAZERO 确实给所有人工智能研究人员敲响了警钟。

21 世纪 20 年代:虽然这十年才刚刚开始,但我预计《变形金刚》【b . e . r . t .】中的 双向编码器 代表着最先进的电脑游戏(包括象棋)的下一个时代。B.E.R.T .是一种基于转换器的机器学习技术,最初是为自然语言处理而提出的。但是它在模式分析方面的强大能力非常适合国际象棋和其他游戏。

蒙特卡罗树搜索是现代计算机象棋程序中的一个基本算法。什么是、,你在它的发展过程中扮演了什么角色?

Bruno Bouzy 是 2004 年第一个发表围棋博弈树中随机搜索的研究人员。我有幸成为这本书的编辑。鲍西有两个天才学生,即。rémi Coulom(2006 年在都灵提出了第一个想法)和 Guillaume Chaslot(在马斯特里赫特获得了一个研究职位)。Chaslot 等人(2008 年)设计并发表了蒙特卡罗树搜索(M.C.T.S .)的正式描述。

M.C.T.S .是一种有效的树搜索技术,其特征在于根据模拟播出的结果逐节点地构建搜索树。这个过程可以分为四个步骤。

1.选择 —从根 R 开始,递归选择最优子节点,直到到达叶节点 L

2.扩展 —如果 L 不是终端节点(即不结束游戏),创建一个或多个子节点 C 并选择一个 C

3.模拟——从 C 运行模拟淘汰赛,直到获得结果。

4.反向传播 —用仿真结果更新当前节点序列。

每个节点必须包含两条重要的信息。

1.基于模拟结果的估计值。

2.它被访问的次数。

会有 ' 最优象棋电脑吗?

虽然大约有

国际象棋中的不同位置,我相信游戏可以解决,并预计这将在 2035 年左右发生。

一台最佳象棋计算机的等级是多少?

到那时,这个问题就无关紧要了,或者说我们制定了不同的玩法实力解读。

在这次采访中,我们聚焦于人工智能的过去和未来,你的热情是双重的象棋和法律。为什么法律也是?

1987 年,我被邀请加入莱顿法学院,让他们熟悉计算机科学的现代发展。受艾伦·图灵(1950)‘的启发,机器能思考吗?乍一看,从计算机下棋到计算机审判法庭案件的这一步似乎很小。然而,我非常明白,上述问题是大胆的。此外,直到 1990 年,法律和人工智能在科学界很少受到关注。因此,向这个方向发展的邀请是令人兴奋的。请注意,最初,在 1988 年,我对法律知之甚少,我花了三年的努力才形成了正确的理解。

1991 年,你预言未来计算机会取代人类法官。你能详细阐述一下这个声明吗?

计算机是否会在某个时间点 取代 法官是我无法预测的事情(见链接https://www . universitetvnederland . nl/college/Kan-een-computer-een-rechter-vervangen)。它不仅仅取决于任务表现。社会和政府将决定是否接受。此外,律师、法官和律师助理的全部任务是一个研究课题,对于计算机是否合格还没有正式的定义。尽管如此,我的预测是,在可预见的未来,计算机在执行简单和复杂的法律任务时,将与人类不相上下,甚至更胜一筹。因此,在我看来,经验证据将向我们展示社会的最佳方式。

与计算机交谈似乎与与人交谈大不相同。人类法官可以考虑到嫌疑人的情绪,并相应地调整他们的言语和非言语交流。这将如何应用于基于计算机的法官?

我预见计算机将来能够理解情感。还是那句话,只有时间才能告诉我们,当计算机展示出这种能力时,社会是否准备好接受它。我相信 B.E.R.T .的后代会有一个美好的未来。

你不相信“计算范式”,即计算机执行分析和结构化数据,而人类致力于道德、直觉和创造力。

在我看来,计算范式当然适用于我们如今与计算机的互动。因此,我不排除计算机在本世纪末能够处理伦理、直觉和创造力方面的工作。 创造力 对于计算机科学家来说,实现永远不是问题,从你清单的末尾开始。根据 Michie 的说法,创造力是人类最没有价值的能力之一,因为它最容易被遗传算法(或随机搜索)模仿。

直觉 又是另一回事。德格鲁特说:“像世界象棋冠军那样水平的比赛需要直觉。直觉不能被编程。所以,电脑永远玩不到那个水平”。目前,我自己的观点是“直觉是可编程的”(参见 R.R .,我在蒂尔堡的告别演说,2016)。

伦理 才是真正的问题。伦理能在多大程度上融入计算机程序,这个问题无法简单回答,主要是因为伦理依赖于文化。在这里,我注意到,在法律上,我们看到许多司法管辖区的文化差异。在我看来,每一个地方性和全球性的法律体系都可以在一个具备表达人类措施的条件的正式体系中得以实施。因此,伦理学是未来的研究挑战。**

你对道德的定义是什么?伦理难道不是天生主观的吗?

制定道德的定义是困难的,因为有 170 多个定义。也可以叫 道德纪律;因此,它关注的是道德上的对错。请注意,伦理对任何道德价值或原则的体系或理论都同样有价值。

的确,伦理是主观的,对人类和计算机系统都是如此。客观上没有对错之分;伦理推理有不同的方法。我想过计算机会如何处理这些,但是除了寻找的人体测量之外,我无法为未来的研究提出建议。

什么是人体尺度?****

最近,政策执行采纳了人的措施。过紧的 法规会以人为代价限制立法的执行能力。因此,制定这一措施的定义变得很有意义。然而,制定一个定义归结为一个哲学问题‘什么是人’?’。我对人性化措施的定义是:在执行中,人性化措施意味着执行者在法律框架内考虑个人情况**

毫无疑问,个体环境局限于一个固定的集合。计算机如何学会处理每一种独特的情况?

先验地了解每个独特的情况是不可能的。但是这对人类和机器都适用。如果人类还没有学会对所有子集(或所有元素)做出充分的判断,为什么计算机要学会这样做呢?当然,在两者(人和机器)的实践中,一些环境集合将会被遗漏,但是我假设这些近似对于人的度量是足够的。

你预言计算机将在八十年后实现人类的测量。它会基于人类预先定义的特征吗?如果是这样的话,既然有些特征是隐性的,那不就是信息的损失吗?

它可以基于预先定义的特征,这无疑将是这一系列研究开始时的情况。这确实意味着信息的丢失。但是我确信人类调查员会赶上来的,也许是在计算机助手的帮助下。由于前面有如此多的挑战,我仍然预测从现在起八十年内会实现。在更准确地确定新的挑战之前,我们必须继续前进。

大多数人工智能算法都是通过在大量数据中学习模式来训练的,在与过去相关的问题上表现良好。但是如果一个新的’断章取义的问题出现了会怎么样呢?****

算法将根据 类比距离度量** 并通过开发 新度量 来做出决定。这样的决策对于一些断章取义的问题也是足够的。**

我们现在拥有的算法足以开发一个人工智能驱动的法官吗?如果没有,还有什么需要开发的?

目前,这些算法还不够。或许,我们需要新的计算方式。然而,我们首先应该记住,到那时还没有出现完美的调优。此外,一些人认为我们可以通过量子计算获得好的算法。不过,我不建议等这么久。

人类是有偏见的,如果根据有偏见的人类的决定对计算机进行训练,它们也会有偏见。如果我们只根据过去的数据训练算法,人工智能法官将永远有偏见。如何才能防止这种情况发生?

这是一个极好的、至关重要的问题。我们应该在旨在处理偏见的研究上投入足够的精力和金钱。

人工智能法官正面临着向人工通用智能(A.G.I .)的巨大飞跃,在人工通用智能中,智能代理可以学习人类执行的任何智力任务。《自然》杂志(Nature publication)[r . r . 2020]称,人工智能将不会实现。你认为会吗?

这篇论文有许多事实,可能是真的。但是,我相信在某个时候会有人工智能法官,但未来仍然是开放的。此外,我无法监督人工智能的发展会给我们带来什么。

我们的采访到此结束。你最后还有什么要说的吗?

讨论过去的人工智能发展相对容易;预测未来更具挑战性。目前,我们离拥有人工智能法官还有大约 80 年的时间。我无法预见我们面临的所有中间挑战,但我相信一旦提出这些挑战,将会进行充分的调查。我想不出阻止人工智能法官实现的理由。

*** 1981 年,Denis de Champeaux de Laboulaye 完成了题为‘人工智能中的算法’的博士论文,在论文中,他提出了(n -1)难题等主题。**

相关参考文献 (R.R.)

Bouzy 和 B. Helmstetter (2004 年)。蒙特卡洛围棋开发,计算机游戏的进步 10:许多游戏许多挑战,第 159–174 页(编辑。范·登·赫里克,饭田和亨氏),施普林格。

查斯洛、G.M.J.-B、M.H.M .温恩斯、H.J .范·登·赫里克、J.W.H.M. Uiterwijk 和 B. Bouzy (2008 年)。蒙特卡罗树搜索的渐进策略,《新数学和自然计算,第 4 卷第 3 期,第 343–357 页。

库仑河(2007 年)。蒙特卡罗树搜索中的高效选择性和备份算子,计算机与游戏 (C.G. 2006),第 72–83 页(eds )。范·登·赫里克、钱卡里尼和唐克斯。斯普林格。

戴维、范·登·赫里克、科佩尔和内塔尼亚胡(2013 年)。进化计算机象棋程序的遗传算法。 IEEE 进化计算汇刊第 18 卷第 5 期,第 779-789 页。doi:10.1109/tevc . 2013.2285111 . ISSN 1089–778 x。

弗耶兰德河(2020 年)。为什么通用人工智能不会实现。人文社会科学 通讯,第 7 卷第 1 期,第 1–9 页。

赫里克,H.J .范登(1983)。计算机科学知识。代尔夫特,1983 年 6 月 21 日,630 页,ISBN 90-6233-103-3。(荷兰语)

赫里克,H.J .范登(1991 年)。昆能电脑 Recht spreken ?就职演说,莱顿大学,6 月 21 日,豪达金特,阿纳姆。ISBN 90–6000–842–1。(荷兰语)

赫里克,H.J .范登(2016)。直觉是可编程的。1 月 29 日,在蒂尔堡大学的告别演说。ISBN 978–94–6167–268–1。

与现场的区别

b . n . v . k . I——比荷卢人工智能协会(荣誉会员)

荷兰计算机象棋协会(荣誉会员)

j . u . r . I . x——司法专家系统基金会(名誉主席)

s . I . k . s——信息和知识系统学院(荣誉成员)

e . c . c . a . I ./EurAI-欧洲人工智能共同体(研究员)

ICCA/ICGA——国际计算机象棋(游戏)协会(荣誉编辑)

这次采访是代表比荷卢人工智能协会进行的。我们汇集了来自比利时、荷兰和卢森堡的人工智能研究人员。

构建数据科学团队的搭便车指南

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-building-a-data-science-team-9b9c5630537b?source=collection_archive---------28-----------------------

失败通向成功:我们在建立数据科学团队时采取的 11 个步骤

作者图片

在过去的一年里,我的团队、我的经理和我集中精力在公司总部建立了一个数据科学团队。我们已经有几个团队的数据科学家,包括我的数据分析团队。然而,他们中的大多数人在不同的项目中单独工作,几乎没有机会分享他们的知识、经验和想法。

当我们开始建立我们的数据科学团队时,我们做出的一些决定不够好,或者当时没有经过深思熟虑。此外,我们没有一个人来自工程背景,这促使我们学习(艰难地)一些对于具有计算机科学背景的数据科学家来说可能显而易见的东西。然而,今天我们觉得我们已经发现了一些重要的构建模块,每个数据科学团队都应该确保将它们包含在他们的项目和实践中。

简而言之,这是我们列出的 11 个步骤:

  • 定义我们的客户
  • 修建管道
  • 优先考虑管道
  • 管理任务(通过系统)
  • 周会(分享想法,共同解决问题)
  • 代码和模型评审
  • 版本管理
  • 编码测试
  • 模型监控(生产中)
  • 自动化培训流程
  • 文献
  • 与其他团队的合作

所以,事不宜迟,我提出建立数据科学团队的搭便车指南。你需要眼睛里的火花,几个月的时间,还有——如果你是《搭车人》的粉丝——一条好毛巾!开始了。

定义我们的客户

我们做的第一件事是确定我们公司的每个潜在数据科学客户。我们与不同的经理和同事进行了交谈,以获取他们的意见。对于每个部门或单位,我们询问是否可以建立一个模型来实质性地提高他们的工作或价值。对于任何一个我们收集到好点子的单元,我们都把它们写下来,并把它定义为潜在客户。当这个过程完成后,我们的名单包含了几个部门和单位,包括高层管理人员,甚至人力资源。

建设管道

收集了项目第一步的所有想法,我们的团队建立了一个建议模型列表,为每个潜在客户提出的每个想法或问题创建了一个数据科学框架。然后我们将列表上传到我们的任务管理系统中(在我们的例子中,是吉拉),让我们的团队和同事可以得到所有的想法。

确定管道的优先顺序

在我们列出了所有的想法和可能的模型之后,我们不得不承认有些想法可能并不那么聪明。我们决定把长长的模型列表组织成我们都知道并且喜欢的东西——图表。我们将 X 轴定义为开发工作(考虑数据可用性和模型的复杂性),将 Y 轴定义为价值(对公司而言)。需要最少努力和增加最大价值的模型被分配最高优先级,其次是需要更多努力和增加高价值的模型。优先级最低的模型需要付出巨大的努力,产生的价值很小,留给以后更快乐的日子。

自从我们创建这个列表以来,它已经改变了一百次。随着团队和我越来越了解我们的能力和局限性,模型的顺序也在不断变化。

管理任务

现在我们有了一个管道,并且它的项目被优先化了,我们需要弄清楚我们将在哪里与我们的队友协调,并且计划如何开发所选择的项目。这意味着将每个项目划分为高层次的阶段,定义每个阶段必须完成的任务,最重要的是,得出完成(DOD)的定义,也就是说,确定该模型的预期结果以及该模型要求的准确性度量水平。

在我们的组织中,R&D 团队使用吉拉。我们选择它作为我们的任务管理平台,主要是因为我们可能会发现自己在未来的任务中与 R&D 团队合作。我们为我们的团队打开了一个板,并开始上传每个项目的高级阶段。

让我的团队成员使用吉拉是一项稍微困难的任务,因为他们中的大多数人习惯于单独工作,并且以前从未使用过任务管理平台。当他们给我他们正在进行的任务的每周状态报告时,我会提醒他们也更新吉拉(有时我会自己添加任务,放入标题并让他们填写其余的)。最终,通过管理层的唠叨,更新吉拉成了一种习惯。今天,我们都了解吉拉的价值及其在任务协调、时间估计和文档编制方面的重要性。

每周会议

团队合作在很多方面都很有帮助。其中一种方式是通过每周的团队会议,每个人都谈论他们一直在做的任务,他们遇到的问题,以及他们计划解决这些问题的方式。

例如,我们中的一个人需要创建一个机制,当某个预测与实际结果相差很远时,可以在预测做出后的前 30 天内更新该预测。我们必须计划一种机制,将正在进行的结果与预测值进行比较,标记需要更新的预测,更新进行新预测所需的相关数据,并最终发送输出。一起思考这个过程帮助我们节省了很多时间,最终我们创建的过程是轻便高效的,而不是我们最初认为必须的非常复杂的过程。

这些分享可以演变成严肃的辩论,在辩论中,我们回顾数据和方法,并作为一个团队来解决问题。我们已经用这种方式解决了许多问题,包括我们遇到“硬墙”的问题——我们觉得无法解决的问题,例如在我们尝试了“一切”之后,准确性度量太低,或者各种性能问题。分享我们的知识,用一种全新的眼光看待一个问题,把具有不同专业知识的人聚集在一起,往往会带来一个新的视角,并最终找到一个明确的解决方案。

代码和模型评审

像每周的团队会议一样,同行评审可以提高我们的工作质量。一旦完成了一个模型,我们要求团队成员之一对它进行详细的审查,查看代码、它的设计、准确性度量、超参数、阈值以及过程的技术效率。评审者提供反馈,例如“您可以尝试这个功能,使流程更加优雅和高效”或者“添加这个功能可能会提高准确性。”

实现评审者的评论通常需要一点时间,偶尔会迫使我们推迟模型的部署,但是我们从不跳过评审。这样的输入是保持高质量结果的关键,它使我们避免犯错误或遗漏将来会回来咬我们的错误。

版本管理平台

在开发数据科学项目的漫长而艰难的过程中,我们做出了许多改变。这些可能是添加或删除一个功能,调整一个阈值,或者在我们完成模型后对我们的设计进行彻底检查(例如,如果我们意识到模型的计算顺序应该与我们最初的想法不同)。有时候我们后来会后悔这样的改变;对于某些类型的模型,我们不会立即理解变化的后果,直到为时已晚。因为一些模型像一个“黑盒”一样工作,一个改变可能无法撤销——这是我们从惨痛的教训中学到的事实。

出于这些原因以及更多原因,小心管理版本是极其重要的,始终保留返回到早期版本的选项。当进行重大更改时,我们通常只是将模型保存在单独的笔记本中。然后,按照 R&D 的建议(和两个团队教程),我们转向了在 Git 版本控制软件中管理模型版本的更优雅的解决方案。这种做法也使我们的团队能够更好地合作。不要跳过版本管理——它可以节省您大量的时间和精力。

编码测试

数据科学家使用各种各样的工具来开展工作,从线性代数原理到统计方法。为了从所有这些技术和数据中创建一个学习模型,我们需要使用编码。虽然我们可能不是从程序员开始的,并且编码可能不是我们工作的主要焦点,但是编码(并且正确地做)是我们最重要的工具之一。

我们学会做的事情之一是向代码中添加测试。例如,检查我们正在使用的数据的有效性(垃圾输入,垃圾输出)以及确认代码的功能性(通过单元测试)。此外,在我们部署一个新版本之前,我们要确保我们所有的过程和包都能够正常工作(集成测试);我们验证整个模型功能正确(端到端测试);我们还会执行我们认为必要的任何其他可用性测试。

我们从糟糕的部署(让我们周末工作来发现和纠正问题)和错误中学会了如何做这些事情,这些错误是我们在没有意识到错误的情况下偶然插入到代码中的。

我们再次向 R&D 团队的同事寻求帮助。在与他们进行了几次会谈后,我们慢慢地开始在我们的代码中实现测试。对我们来说,这绝对是一项正在进行的工作,我们需要学习如何更好地计划和实现测试。

模型监控

测试是不够的。例如,一旦我们的团队处理一个或两个以上每天或每周运行的正在进行的过程,我们必须建立一个监控系统来确保它们正确运行。如果没有,系统会立即向我们发出警报。

我们在 R&D 的朋友(他们已经知道他们在和谁打交道了!)也帮助了我们。他们使用 Grafana 仪表板来监控他们的流程,并友好地提出为我们构建一个仪表板。我们将仪表板与 Slack 通信平台连接起来,为所有相关的技术人员启动了一个群聊,并对其进行了编程,以便在流程失败时向我们发送推送通知。

我们的大部分进程都是在晚上运行的,所以我们睡觉的时候会把 Slack 设置成静音。然而,当我们醒来时,我们可以看到是否发生了一些事情。如果是这样,我们可以立即调查问题,通常会保存流程,并在将输出发送给客户端之前将其恢复到正常工作状态。

自动化培训流程

在我们选择了一个项目,计划了它,构建了它,评审了它,部署了它,并开始监控它之后,我们的工作仍然没有完成。为了使机器学习能够执行其“学习”过程,我们必须将新数据输入到我们的模型中,然后根据新数据的趋势来校正和调整我们的预测。有时,趋势是持续的,并且足够强大,以证明模型的重新校准是正确的。

这个过程可以手动完成,但需要手动监控模型的质量,以确定何时需要校准。另一种方法是使过程自动化。我团队中的一位数据科学家决定为他的一个模型建立一个自动化的训练过程,它非常成功,以至于我们决定对所有模型都采用它。

训练过程是这样的:我们将一批新的训练数据加载到模型中,并对其进行重新训练。然后,我们比较最重要的准确性测量,并检查重新训练的模型是否在新的看不见的数据上产生更好的结果。如果模型改进,我们保留重新训练的模型。如果没有,我们丢弃它,继续前进。这个过程可以定期安排(比如一个月一次),也可以在我们部署新的产品版本时应用。

证明文件

当规划一个项目时,我们记录一些高层次的设计,以表明模型应该如何工作,计算和测量过程的各个部分是什么,以及最终的输出应该是什么样子。这个文档是什么意思,它有什么用途?

通常,项目文档包括几个部分:

  • 产生项目的业务目标以及通过数据科学模型实现目标的基本原理
  • 对模型结构和所用数据的解释
  • 审查项目的准确性目标和当前模型版本的实际准确性(可能会随着时间的推移而改变)
  • 关于流程的详细信息(运行时间、输出形式和相关流程)
  • 代码本身、笔记本和/或 Git 的链接

本文档的目的是为处理项目过程的任何人(如我们团队的成员、R&D 集团或客户)提供参考,并保存必要的信息以备将来使用。

在项目开始时准备设计文档,包括模型的最终输出和精度目标的描述,是一个重要步骤。然而,项目结束时的实际结果(有时需要长达一年的时间)往往与最初的设计大相径庭。虽然业务问题通常保持不变,但是我们解决它或提供最终输出的方式可能会有很大的不同。发现我们可以做得比我们最初认为的更好、更有效率是一个非常积极的过程的一部分。

那么为什么不跳过文档阶段,把它留到项目的最后呢?假设我们正在与另一个团队合作,该模型将被整合到他们的产品中。我们将被期望在计划期间规划模型的一般结构,并理解哪些部分将需要产品方面的开发工作,以便其他开发团队(通常以敏捷方法工作)能够计划他们的冲刺,并相应地估计所需的工作。

与其他团队的合作

我一遍又一遍地提到我们从 R&D 部门的同事那里得到的极好的帮助,从建立和维护我们的基础设施到帮助我们使用新的工具或我们需要的专业知识(例如在测试上)。虽然随着时间的推移可能会出现一些问题(如技术问题和偶尔的沟通失误),但事实证明,与 R&D 团队的良好关系对我们至关重要。在本节中,我们将描述一个协作化险为夷的例子。

在过去的一年中,我们发现一个好的数据科学模型并不总是足够的。如果我们缺少一个愿意接受我们的模型输出并使用它的客户,那么这个模型是多么的惊人和精确都没有用。当预测到用户即将流失时;我们需要找到一种可以防止搅动的治疗方法(否则我们提前标记出来也没用)。运行某种分析或进行调查可能有助于我们理解用户流失的原因。然后,我们必须想出适当的解决方案,其中一个可能会改变用户的想法。不是所有的治疗都有效;测试可以帮助显示哪种治疗最有效。整个过程花费的精力和时间与开发数据科学模型本身一样多。

幸运的是,这项活动通常由公司的产品、分析和研究团队来执行。因此,我们必须与其他团队分享我们的项目,并在此过程中进行合作。通常,各方最终都会喜欢这种合作关系,这为其他团队了解数据科学团队的工作提供了一个令人兴奋的机会。

离别赠言

当然,如果没有我的团队一年来的辛勤工作和创造力,以上这些都是不可能的。你在这里读到的大部分内容都是他们的首创精神、工作成果,以及从我们做得不太好的地方吸取的经验教训。所以谢谢你们让这一切发生。

最后,如果你看完了这篇长文,我感谢你的时间,并希望这是对你有帮助的阅读。请伸出手来,让我知道你的想法,你在做什么不同,主要是,还有哪些未知是我不知道的!

数据科学的搭便车指南🌌

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-data-science-bc8cae917fa7?source=collection_archive---------20-----------------------

UnsplashGreg Rakozy 拍摄的照片

我的数据科学知识综合指南

如果您想复制本指南的部分内容供自己在 idea 中参考,您可以在此 处访问指南的 idea 版本

目录📖

(1)简介(2)工具讲解(3)基础 Python(4)熊猫(5)可视化 作品集构建【10】简讯【11】生产力【12】面试准备<#dbf7>

1.介绍📝

回顶回顶回顶

1.1 什么是本指南?

这是我在过去 2 年中积累的所有数据科学知识的(正在进行中的)综合指南。它并没有涵盖数据科学的所有内容,只是我个人认为有趣和有用的主题子集。从本质上说,这是我希望在第一次开始数据科学之旅时就拥有的指南。

我喜欢读科幻小说,所以这本指南是以道格拉斯·亚当斯的书命名的。

1.2 我为什么要做这个指南?

我做这个指南有两个主要原因。首先,当我开始学习数据科学时,我没有太多的指导,因为我仍然没有找到任何接近“全面的数据科学指南”的东西,所以我认为我应该根据我的经验自己制作一个。该指南可以作为刚刚进入数据科学的人的某种起点,或者可以帮助更有经验的人学习新的东西。

第二,以我个人的经验来看,无论是独立学习还是在学校学习,学习新事物可能会非常缓慢,但如果有已经经历过的人的帮助,学习会变得非常有效。我第一次涉足数据科学是花了 40 个小时搜集和整理大学排球运动员的数据,然后意识到我还不具备对这些数据进行真正分析的技能。我花了无数个小时学习我并不真正需要的技能,还花了无数个小时低效地学习我确实需要的技能。这个指南将理想地防止其他人经历同样的时间浪费。

最终,我希望这本指南能让人们以一种比我学到的更有效的方式来学习我现在知道的东西。

1.3 我是谁?

我是瑞安·布朗,这是我的个人网站和我的 LinkedIn 个人资料。2020 年 1 月,我在德州大学奥斯汀分校的 MIS 专业的 Python 入门课上写了第一行代码。我还参加了其他课程来教授数据科学技能,但我的大部分技能(我估计 90%以上)都是自学的。

大一的夏天,我在奥斯丁的两家以数据为中心的初创公司实习,大二的夏天,我在戴尔实习数据科学,今年夏天,我将在 Meta(脸书)实习数据科学。

1.4 我该怎么做?

我认为自己是一名分析型、专注于产品的数据科学家;我的工作包括收集、清理、分析、可视化以及偶尔建模数据,最终利用这些技能来创建数据驱动的叙述、推动决策并提供可操作的见解。我应用机器学习模型,但我对它们背后的数学或从头构建自己的模型并不特别感兴趣。我不写 SWE 级别的生产代码,主要工作环境一直是 Jupyter 笔记本。有些人可能认为我做的是“数据分析”而不是“数据科学”;我觉得没关系。

Benn stan cil 的这篇文章使用的决策时间作为衡量分析工作的标准,非常有见地,很好地总结了我对自己所做的事情以及应该如何衡量自己的感受。

1.5 本指南的结构是怎样的?

每个技术部分都有三个子部分:“资源”、“我的观点”和“如何实践”。“资源”包含了一个我推荐用来学习该技能的资源列表,以及对该资源+如何使用它的描述。许多主要资源都是我创建的指南,它们汇总了我在该技能方面的所有经验。“我的视角”包含了我对该技能的资源、该技能整体的重要性以及它如何融入我的工具箱的想法。“如何练习”包含了帮助我学习技能的方法或者我希望我曾经用来学习技能的方法。这些方法没有特定的顺序。

第 2 部分以外的所有部分都是独立的;有些技能显然是相互依赖的,但是您可以只阅读“Pandas”一节(第 4 节)并理解资源、观点和实践,而不必阅读前面的“基础 Python”一节(第 3 节)或后面的“可视化”一节(第 5 节)。你也可以阅读“投资组合建设”或“时事通讯”部分,而不阅读任何其他内容,仍然可以获得价值。

1.6 如何使用本指南

从开始到结束遵循这个指南(理论上)会导致一个模仿我自己的旅程和经历;不过,我不认为我的数据科学方法是“最好的方法”,所以模仿我不一定是我的目标。

Dan Luu 的这篇文章讨论了决定学习什么的困境,我完全同意他的观点。遵循“学我所学”的建议并不总是有效,因为每个人都有不同的天生优势和弱点——丹建议,除了经验中的明显漏洞,你应该专注于放大你的天生优势,而不是消除弱点。他提到的决定学什么(/提高)的两个“要素”是对某样东西有相对的天赋和有一个好的学习环境;我要补充的是,对这个话题真正感兴趣是第三个重要的因素。

所以,澄清一下,这个指南并不是“学习我所学的”的建议。相反,你可以使用本指南中的主题、文献和资源来帮助你弄清楚你想学什么。如果你想学的东西恰好和我学的东西重叠,并且你的环境有利于它,那么这个指南将(希望)帮助你快速+有效地学习那些主题,达到我目前的知识水平。

2.工具说明🔧

回顶

  • Python: 用于数据收集、清理、操纵、分析、可视化、建模。Python 是我用于数据科学的主要工具,本指南中的大部分信息都与学习和应用 Python 有关。
  • 与 Python 类似,但我的经验有限,我更喜欢 Python。本指南不包括 r 上的内容。
  • SQL: 在现实世界中使用了一个 lot 来查询+转换数据(尤其是大型数据集),但是我发现很难合并到个人项目中。本指南提供了学习和练习 SQL 的资源,但这不是主要重点。
  • PowerBI/Tableau: 用于创建仪表板的 BI 工具,这些工具在个人项目中更容易使用——因为项目可能仪表板——但是本指南不包括关于它们的内容,因为我不觉得我在使用它们方面特别有经验。此外,一旦您在概念上知道如何可视化数据,这些就相当于查找特定于工具的接口和语法。**

3.基本 Python🐍

回顶

Python 是一种解释性的、可读的、多功能的编程语言,是数据科学家编码的主要方式之一。

3.1 资源

谷歌的“欢迎来到 Colabatory”笔记本

  • 介绍 Google Colab 作为开发环境。我推荐你先阅读这篇文章,这样你就熟悉了什么是 Python 笔记本。

我的熊猫指南第 0 节

  • 我的熊猫指南的这一部分涵盖了如何使用 Colab、Python 数据类型以及有用的 Colab 降价和快捷方式。我建议您在安装了 Colab 笔记本之后阅读这篇文章,这样您就可以更加适应开发环境了。

科里·斯查费在 YouTube 上的“Python 编程初学者教程”播放列表

  • 科里·斯查费的 YouTube 视频播放列表,涵盖了 Python 的基础知识。我个人没有用过这个完整的播放列表,但我是他的视频粉丝,在这个播放列表中看了一些,而不是试图从我的课上学习。我会推荐使用 Colab 而不是他描述的设置,我认为有用的视频有 2–9(初学者主题教程),17(日期时间),19(排序),20(尝试/例外),23(请求)。我觉得那个文件 I/O 没啥用。

3.2 我的观点

我在 Python 入门课上学习了基本的 Python,但我认为它的节奏相当慢,而且有很多不同的方法可以学习。因为我没有使用在线资源,所以我不能给出第一手的建议,但我确实在 Youtubefor 上看了相当多的科里·斯查费的视频,以便澄清,它们非常棒。链接这里是他的《Python 编程初学者教程》,里面有很多很棒的视频。不过,我推荐使用 Google Colab 作为你的 IDE这里是 Google 的 intro Colab 笔记本,下一节我的熊猫指南也有对 Colab 的介绍。

3.3 如何练习

在你自己的 Colab 笔记本上跟随科里·斯查费的视频中的代码。

完成 Python 课程介绍的作业或项目;以下是我搜索“python 类介绍作业”时得到的一些结果,以及我在 UT Austin 找到的一些结果;这些我都没有细看。

4.熊猫🐼

回顶

4.1 资源

我在 Colab 上的熊猫综合指南

  • 我创建的一个 Colab 笔记本,它汇集了我在数据科学旅程中了解到的关于熊猫的一切。我建议从头到尾阅读这篇文章,并创建一个副本,这样您就可以在阅读时运行+试验代码。您也可以修改指南本身,使其对您更有意义。

科里·斯查费在 YouTube 上的“熊猫教程”播放列表

  • 科里·斯查费的 YouTube 视频播放列表,涵盖了各种熊猫主题。我个人没有看过或用过这个播放列表,但我是他视频的粉丝。我建议使用这些视频对阅读我的指南后仍然不清楚的概念进行更深入的解释。

Dataquest.io 的备忘单ent thought 的备忘单DataCamp 的备忘单Dataquest.io 的正则表达式备忘单

  • 来自各种数据科学网站的三个熊猫小抄。我自己并不使用这些工具,但是它们提供了一些主题的可视化解释,您可能会发现在编码时参考它们很有用。我确实使用正则表达式备忘单。

4.2 我的观点

熊猫的设计简单易用。我认为你应该首先从概念上弄清楚你想对数据集做什么,然后使用适当的语法实现它。我的熊猫指南旨在全面,既可以用来学习熊猫的大量功能,也可以在你编码时作为参考,这样你就不必经常查找语法。如果你想做的事情没有在指南里,一旦你查了一下,想明白了,就把它加到你的指南里吧!

4.3 如何实践

StrataScratch 上使用熊猫完成练习面试问题。

  • 很有用,因为你可以免费检查许多问题的答案——这有助于确认你的编码是否正确,并掌握其中的窍门。
  • 这些问题并不完全代表分析在实践中的样子,编码环境也不理想,但是这是一个开始清理、操作和聚集的好方法。

Kaggle 抓取一个有趣的数据集,加载到 Colab,并开始探索。

  • 为了更有针对性,您可以生成一组关于数据的问题,然后通过使用 Pandas 探索/操作数据来尝试回答这些问题。

5.形象化📊

回顶

可视化是探索性数据分析以及向技术和非技术风险承担者传达分析结果的主要部分。

5.1 资源

我在 Colab 上的全面 Plotly 数据可视化指南

  • 我创建的一个 Colab 笔记本,它汇编了我所了解的关于 Plotly Express 的所有内容,这是我最喜欢的可视化库。类似于我的全面的熊猫指南,我建议从头到尾阅读,并创建一个副本,以便您可以在阅读时运行+试验代码。

科里·斯查费在 YouTube 上的“Matplotlib 教程”播放列表

  • 科里·斯查费的 YouTube 视频播放列表,涵盖了 Matplotlib 中的各种图表和定制。我个人没有看过或用过这个播放列表,但我是他视频的粉丝。如果 Plotly 指南让人感觉难以接受,并且您相对来说是数据可视化的新手,我推荐您观看本指南。

我在 Colab 上的 Seaborn 参考指南

  • 我为自己创建的参考 Colab 笔记本,用于在 Seaborn 中创建不同类型的可视化。我建议在你已经学习了 Matplotlib 和 Seaborn 的基础知识之后,在编码时参考这一点;它也可以作为 Seaborn 能力的一个简短展示。

5.2 我的观点

Python 中数据可视化的“黄金标准”是 Matplotlib (推而广之,还有 Seaborn ),我曾经是这些工具的狂热用户。然而,今年夏天在戴尔,我发现 Plotly (特别是 Plotly Express )更有用,主要原因是它的图表是交互式的。在上面链接的 Plotly 指南的介绍部分,我会更详细地解释为什么我更喜欢 Plotly。

我仍然认为 Matplotlib 和 Seaborn 是有用的,特别是对于快速绘制玩具数据或数值数组(如模型精度),所以我也包含了学习这些的资源。这三个都学会了当然好,但我个人认为专注于 Plotly 是最有效的。在现实世界中,如果不先聚合数据集,你通常不会将它可视化,如果你已经聚合了数据,那么 Plotly 就是一种方法。

5.3 如何实践

Kaggle 中抓取一个有趣的数据集,加载到 Colab 中,开始探索。

  • 为了更有针对性,您可以生成一组关于数据的问题,然后尝试通过使用 Pandas 可视化来探索/操作数据来回答这些问题。
  • 可视化可用于帮助记录并向他人展示您的答案。

数据黑客马拉松。

  • 有各种各样的数据科学竞赛,但我所说的数据黑客马拉松是一场比赛,你被赋予一项广泛的任务,你必须通过分析数据来解决它,最常见的交付物是数据驱动的叙事演示。
  • 数据黑客马拉松(和例子)在第 10 节(项目组合构建)中有更详细的介绍。

6.机器学习🤖

回到顶端

机器学习用于各种复杂的任务,如分类、回归、聚类和 NLP,模型本身可以是可交付的,也可以用于验证决策。

6.1 资源

StatQuest 的机器学习播放列表

  • StatQuest (Josh Starmer)制作的 YouTube 视频播放列表,涉及广泛的机器学习主题。它温和地介绍了机器学习中的许多核心思想,以便您对您正在编写的代码有一个更好的概念性理解。
  • 我建议,在开始编码之前,至少要看一下关于 ML 基础(1-5)、线性回归(9-12)和逻辑回归(一种分类技术)(16-19)的视频。翻阅播放列表,其他我个人觉得有用+有趣的视频有 23–24,28–30,33,37–40,42–45,47–48,51–52,59,80。所有的视频都很棒,但是其他的话题与我个人的工作并不相关。

PyCaret 教程

  • PyCaret 网站上的一个页面,其中包含 PyCaret 的各种教程,py caret 是一个开源的低代码 Python 机器学习库。它可以用于分类、回归、聚类、异常检测、NLP 和关联规则挖掘。我建议浏览你感兴趣的每个 ML 任务的所有教程。

scikit-learn 主页

  • scikit-learn 的主页。当您在别处看到某个函数时,我建议您查看该函数的文档(例如 PyCaret)

6.2 我的观点

正如我在介绍中提到的,我对应用机器学习模型感兴趣,而不是自己构建它们。我不觉得有必要了解 PyCaret 中包含的 22 种回归算法中的每一种算法是如何工作的,尽管我觉得这个主题很有趣,但我不认为深度学习应用程序(例如,使用 PyTorch 或 TensorFlow 的图像分类)是我工具箱的一部分。出于我的目的,理解机器学习的基础知识(来自 StatQuest 播放列表/随着时间的推移的各种阅读)并能够快速应用它(使用 PyCaret)就足够了。

我经常使用 scikit-learn ,在我旅程的开始,我通常非常关注复杂的机器学习,因为我认为这就是成为一名“好”数据科学家的意义,但现在我知道不一定是这样。现实世界中有不同技术水平的数据科学家(或“分析师”或“工程师”),从比我技术水平低得多的到比我技术水平高得多的。

机器学习是一个非常容易陷入的兔子洞,但我认为每个人都应该强烈考虑他们实际上需要知道多少才能达到他们的目的:你到底需要知道或使用机器学习吗?作为从业者只需要会应用就可以了吗?您对构建和优化自己的模型感兴趣吗?“数据科学家”是一个超级宽泛的头衔,但我个人会把最后一个问题回答“是”的人归类为 ML 工程师而不是数据科学家。

PyCaret 上的一个小旁白:太棒了。只需几行代码,您的 Pandas 数据框架将被自动处理、分割,并针对您任务的所有关键模型类型进行训练(无论是分类、回归还是其他)。

6.3 如何练习

Kaggle 上参加机器学习比赛。

  • 从这些比赛中可以学到很多东西,尽管很多都不属于我感兴趣的领域。你可以练习用 PyCaret 快速得到一个模型的构建+评分;磨练你的数据工程技能;并且看看丰富的社区笔记本,学习各个学科的先进技术。

7.结构化查询语言🐘

回顶

SQL 代表结构化查询语言,用于访问、清理和分析存储在数据库中的数据。在非常大的数据集上,它比熊猫的性能好得多。

7.1 资源

模式分析的 SQL 指南

  • 一系列 SQL 指南(初级、中级和高级),涵盖了 SQL 中的大多数主要主题。我建议通读全文,并为自己创建一些语法参考指南。你可以在这里找到我的,但是它不是很干净,我也没有非常广泛地使用 SQL。

7.2 我的观点

在第 0 节中提到,SQL(据我所知)在现实世界中非常重要并被广泛使用,但我在个人项目中并没有怎么用过。Deepnote(在“如何实践”中提到)使它更容易合并,但我一直认为它是我将在工作中学习的东西。肯定有公司要求你了解大量的 SQL,但我个人并不需要它来通过我的实习面试。

7.3 如何练习

StrataScratch 上使用 SQL 完成模拟面试问题。

  • 正如在第 4 节(pandas)中提到的,对于大多数问题,StrataScratch 将让您使用 SQL 而不是 pandas。
  • 使用 SQL 时有许多微妙之处/片段,仅仅从模式分析指南中学习语法是看不出来的,因此这样做可以帮助建立一些 SQL 直觉并充实您的参考指南。
  • 同样,这些问题并不完全代表分析在实践中的样子,编码环境也不理想,但是这是一个开始清理、操作和聚集的好方法。

Deepnote 上练习用 SQL 代替熊猫。

  • Deepnote 是 Google Colab 的云托管 Jupyter 笔记本替代产品。我真的很喜欢它的很多地方(在单个项目中的多个笔记本之间轻松切换,轻松的文件访问,集成),但我把它放在这里是因为它允许您创建 SQL 单元格,您可以在其中对数据帧运行 SQL 并以数据帧的形式返回结果。
  • 您可以回顾其他个人项目或分析,并尝试用 SQL 而不是 pandas 来做尽可能多的数据操作。也可以从头开始尝试使用 SQL。

8.统计数字🎯

回顶

统计学是 A/B 测试和大多数机器学习算法的基础,也可以用来更好地理解数据的分布。

8.1 资源

我的面试备考统计笔记

  • 我为准备脸书数据科学实习生面试而做的所有统计笔记。它不是一个全面的统计指南,格式也不是特别好,但它应该提供某种基线+把许多有用的信息放在一个地方。

CXL.com A/B 测试统计by 专利 A/B 测试TDS A/B 测试篇Shopify A/B 测试指南

  • 为了更好地理解 A/B 测试,我阅读了一些资源。

8.2 我的观点

我在大学里上过一些统计学课程,但是统计学还不是我数据科学工具箱中很大的一部分。编码时会用到非常基本的概念(均值中值模式、方差+标准差、正态分布、分位数等),但除此之外,我并没有用到太多的知识。很多人说,繁重的统计和数学是成为一名数据科学家的必要基础或先决条件,但我个人不同意。对一个 ML 工程师来说,是的。对于一个专注于产品、创造数据驱动的叙事并推动决策的数据科学家来说,答案是否定的。这是 A/B 测试的一部分,但我还没有这样做,我认为如果我需要学习笔记以外的东西,我可以在工作中学习。

我没有任何练习统计的资源,因为我自己没有练习过(除了在我的大学课堂上,我没有发现它特别有用)。

9.投资组合构建📁

回顶

构建投资组合是数据科学之旅的一大部分,因为它让你可以通过更个性化的项目来追求自己的兴趣,并且在努力实现目标的过程中你会学到很多东西。本节将介绍如何获得项目创意的灵感,项目数据的来源,以及您的项目可能采用的 9 种不同格式。

9.1 项目灵感

想出一个项目创意没有什么神奇的公式;有时候你会有太多想都不想就开始,有时候你一点也没有。想法可能来自数据科学之外的个人兴趣,来自看到其他人的工作,来自学习您想要应用的新技术技能,或者来自看到有趣的数据集。

下面我列出了一些网站,在那里你可以找到代码、项目和文章,它们可能会帮助你激发自己项目的灵感。

有一点要注意的是,你不应该因为一个项目“太简单”或者“其他任何人都可以做”而犹豫不决;总会有比你更有技能的人,如果他们愿意,可能会做类似的项目,但你是做这件事的人

9.2 数据来源

要在项目中使用的数据可能来自三个主要的源类别,从最不唯一到最唯一列出:

  1. ****现有数据集:这些是。准备下载+分析的 csv 文件,比如在 Kaggle 上找到的那些。有大量不同的数据集,它们可能是由发布它们的人搜集来的,但事实上这些数据是公开的,这意味着其他人可能已经分析过了。
  2. ****来自 API 的数据集:API 允许您访问数据的子集,这通常是因为数据更新频繁,并且太大而无法包含在单个 API 中。csv 文件。例如天气数据、Spotify 数据或 Twitter tweets。寻找 API 的好地方是 RapidAPI。当您自己从 API 收集数据时,虽然其他人可能可以访问相同类型或格式的数据并在过去对其进行分析,但您最终分析的数据集将根据您选择的唯一参数进行过滤,因此可能会讲述一个完全不同的故事。
  3. ****自行收集的数据集:不存在于网上任何容易获取的形式的数据,所以你必须自己收集数据。它可以是你生成的数据(比如手动调查、你拍摄的图像、你读过的书等等。)或者你要从现有网站上收集的数据(比如我学校的报纸网站上的文章, The Daily Texan )。由于您正在处理一个从未见过的数据集,因此您的分析更有可能是唯一的。

尽管它们不那么独特,我还是建议从现有的数据集开始。这样做大大加快了数据收集和清理的过程,并让您更快地了解如何实际分析数据。

在我使用熊猫之前,我的第一个“数据科学项目”包括我花了大约 50 个小时来搜集和清理数据。一旦我终于有了数据,我意识到我不具备实际分析它的技能,我不得不将这个项目搁置一年多,直到我使用更干净的数据集了解更多。没有有效利用我的时间。

9.3 数据黑客马拉松/数据驱动的演示

我将数据黑客马拉松定义为一场比赛,你被给予一个(相对)广泛的任务,必须通过分析数据来解决它,最常见的交付物是数据驱动的叙事演示。数据集通常是给定的,但是您通常可以自由地使用额外的数据源。

我认为数据黑客马拉松是学习数据科学和构建您的投资组合的最快+最有效的方式之一,原因如下:

  1. 你只有有限的时间(通常是 24-48 小时)来竞争,所以你必须快速学习和创造。
  2. 演示交付格式模仿现实世界的数据科学,意味着您可以花更多的时间学习如何分析数据,以有效地传达您的信息,而不是花更少的时间挑剔代码。
  3. 预定义的数据集+任务意味着您可以绕过项目的头脑风暴阶段以及数据收集阶段。

我参加的两个数据黑客马拉松的参赛作品链接如下:每个页面还包含黑客马拉松的信息包。

你不一定要在黑客马拉松现场比赛;虽然你实际上无法提交参赛作品并有可能获胜,但如果你模仿黑客马拉松的条件,你将获得同样的体验并产生同样的可交付成果。如果你不确定从哪里开始,你可以为我上面链接的黑客马拉松创建一个条目。我会推荐第二个,MLDS 数据黑客 2021,因为我认为这个任务更好+更开放。你也可以在 Kaggle 上查看分析比赛;他们中的许多人已经完成了,交付物通常必须是一个笔记本,但无论如何创建一个演示条目对练习+学习是有好处的。

9.4 数据驱动的叙述性文章

文章比演示文稿更有力,但是对于练习你讲故事的技巧和对一个主题或数据集做更深入的探究来说,文章是很棒的。下面是一些使用各种分析和数据的记叙文的例子。除了这些例子,您还可以在上找到数千篇关于数据科学的数据驱动文章。

用 NLP 探索 4.5 年的日志条目:使用作者(me)生成的日志条目数据。

身高真的很重要吗? :使用作者(我)抓取的数据。

16 进行中 17:各种 NFL 记录的健全性 :使用公开的体育统计数据。

9.5 独立研究论文

如果你正在做一个更大、更广泛的项目,超出了一篇文章所能容纳的范围,你可能想写一篇独立的研究论文。我自己的关于基于内容的推荐系统的独立研究论文开始是一篇文章,但是变得太大太专业了。

你不一定需要在教授或某个学术机构的领导下写研究论文;请注意,我的是一篇独立研究论文,而不是一篇学术研究论文。“研究论文”没有正式的定义;我完全是靠自己完成的。应用必要的严格性、格式等取决于您。我推荐背页的用乳胶写论文。

9.6 包含笔记本的项目

如果您想将代码、可视化和叙述/文本都放在一个地方,您可以创建一个完全包含在笔记本中的项目。它可以是你自己创作的,也可以是提交的,或者是为比赛而创作的。灵感链接里有很多这些笔记本项目的例子,更具指导性的例子是我参加 2021 Kaggle ML & DS 调查比赛的参赛作品。

****关于笔记本电脑竞赛的说明:我发现,要制作一款适合竞赛的笔记本电脑,需要花费大量的时间来打磨和完善它;比我想的要多。我也阅读了关于的文章,并且同意这样一个事实,即演示文稿,而不是笔记本,才是实践中讲述视觉故事的方式。

笔记本项目本身是好的,因为你自己定义了格式,但是我不会再用笔记本作为可交付物来竞争。正如前面提到的,使用相同的提示/任务,但是创建一个演示文稿,仍然是有价值的。一个笔记本项目的例子是 Deepnote 上的这个Goodreads Profile Analysis Dashboard,它利用了笔记本的格式而又不显得冗长/复杂。

9.7 教程/指南

有成千上万的关于如何执行各种数据科学分析技术的教程,其中许多都是关于走向数据科学的文章形式。如果你完成了一些有用的任务,却找不到相应的教程,或者如果你不得不将多个教程组合在一起,因为没有一个单独的教程是完全合适的,那就制作你自己的教程吧!

我非常喜欢技术指南的笔记本格式,并创建了您在本笔记本中看到的格式;我也写过一篇用 Python 在这里推送数据到 data.world 的文章教程。请记住,创建教程没有“经验要求”;我在数据科学之旅的早期就写了那篇文章,虽然我现在知道的更多,但它仍然很有用,是我的投资组合的一部分。

你也可以创建非技术性的指南或教程,就像你现在正在阅读的一样。

9.8 数据收集管道

如果您对收集经常更新的数据感兴趣,并且认为这些数据可能对其他人有用,那么在您使用这些数据做更多事情之前,数据本身可以是一个项目。编写代码以在笔记本或脚本中收集数据,并定期(例如每天)运行代码。然后数据可以被导出到不同的地方:一个 SQL 数据库,一个. csv 文件,然后被推送到 Git 存储库,Kaggle.com,data.world,等等。

除了实习之外,我自己还没有完成过这些项目中的任何一个,但是在 Data 是复数有数百个独特数据集的例子;这些数据集非常有趣,即使没有任何分析也值得一提。

我知道 DeepnoteKaggle 都有运行预定笔记本的原生能力,你可能在 Colab 或本地笔记本上稍加努力就能做到。

9.9 仪表板/独特的可视化

仪表板不仅仅是为“数据分析师”/“业务分析师”保留的,它们可能比您通常认为的业务用例(销售数字、用户计数等)更加动态和有趣。如果您使用自己收集的数据(实时更新或其他方式)创建仪表板,或者自己从 API 调用数据,则会获得额外的积分。

我也没有在实习之外创建过仪表盘,但仪表盘和各种可视化工具都可以在 Tableau Public 上找到。除了一个完整的仪表板(通常是为了监控或通知),你可以创建一个单一的、非常独特的可视化,例如双峰中喝的咖啡的可视化。

9.10 数据驱动的网络应用

如果您对产品创建过程、前端或后端编码感兴趣,有一些 SWE 朋友/同行,或者想要扩展您的技能组合而不仅仅是纯数据科学,那么构建一个数据驱动的 web 应用程序可能是一个很棒的(尽管相当复杂)项目。作为我所在组织的一部分,在一个学期中,我为 Spotify 开发了 Moodify ,一个情绪播放列表生成器。我使用 React.js,但这花了很多时间来学习,我仍然不擅长它+将来不会使用它,所以另一个选择是使用 Bubble.io (一个超级强大的拖放网站,可以连接任何后端),使用 Python Flask 或 Django(或其他任何东西)进行数据分析+后端。

9.11 Python 库

编写自己的 Python 库听起来非常令人望而生畏,但事实并非如此。有大量的教程,您所需要的只是几个有用的函数,您希望导入并在多个数据科学项目中使用它们。它可以被编码来使用现有库创建某种更复杂的可视化,

我自己没有写过库,但我想在某个时候写,据我所知,Python 让这变得很容易。这里的是我打算创建一个教程的链接。

10.时事通讯📧

回到顶端

我关于数据科学的大多数实用的、非技术性的知识(以及我的一些技术知识)都来自于阅读时事通讯。我注册了几个,它们包含数据科学/通用技术领域正在发生的新事物的内容,作为一名数据科学家真正意味着什么,公司如何克服各种数据挑战等。以下是我目前订阅的时事通讯。

TLDR 时事通讯(日报)

  • 在他们的登陆页面上被描述为“为忙碌的技术人员提供字节大小的新闻”,他们每天都发出一份时事通讯,其中包含以下四个类别中每一个类别的两篇文章的链接和简短摘要:(1)大型技术和初创公司,(2)科学和未来技术,(3)编程、设计和数据科学,(4)其他。

数据药剂(每周一次)

  • 更具体地说,他们发送关于数据科学中各种主题的文章链接+摘要,例如技术技能指南、与数据科学领域大型参与者相关的事件,以及关于数据科学行业实践的观点文章。

分析工程综述(每周)

  • 更多的是关于单个主题的较长/叙述性帖子,引用+相关文章的链接,它谈论许多不同的事情,但它通常与数据科学家或分析工程师的工作以及他们应该做什么有关,工作应该如何分工,改变我们工作方式的新工具等。

数据是复数(双周)

  • 杰瑞米·辛格·文的双周时事通讯,包含来自互联网的各种有趣的数据集。

Deepnote 产品更新(定期)

  • 不是真正的时事通讯,但 Deepnote 每隔几周就会发送产品更新电子邮件,笔记本领域有一些非常酷+创新的东西。我仍然使用 Colab(主要是因为偶尔的速度问题,然后 Colab 有可折叠的 markdown 块,而 Deepnote 只有可折叠的“title”块),但我最终想切换到 Deepnote,我喜欢看到数据科学笔记本的功能得到扩展。除了拥有一个帐户,我不知道如何订阅更新。

11.⌨生产力

回顶

这与数据科学没有明确的关系,但我非常投入于生产力领域,并认为这种思维模式非常适合在数据科学领域工作和学习。我将再次引用 Benn Stancil 的这篇文章中的关于使用时间到决策作为衡量分析工作的指标;作为数据科学家,我们必须高效工作。

11.1 日历+电子邮件

我用谷歌日历和 Gmail,没什么特别的。不过,我会尽量清空收件箱,在每封邮件被阅读后,将它们归档到各自的文件夹中。我有以下文件夹:数据科学、杂项、个人、学校、工作、订单,然后每个我工作过的公司一个,每个我所在的 UT 组织一个。

11.2 任务管理

我使用来管理,并且很喜欢它。我使用专业计划(3 美元/月),但免费计划也很有能力。您可以将任务组织到不同的项目和子项目中,创建子任务,给出任务描述和优先级,创建不同的过滤器/视图,设置重复任务等。优先级、日期和项目可以使用自然语言来设置,因此非常快速和简单:如果我键入go grocery shopping every sunday #misc p1,它将在我的 Misc 项目中创建一个每周日优先级为 1 的周期性任务。还有一个移动应用程序,具有所有相同的功能。

一个非常显著的特点是:你可以设置一个通用的快捷方式,不管你在电脑上做什么都可以使用,只要你必须在某个地方打开。我的是WIN + ALT + N。此快捷方式会打开一个覆盖在屏幕顶部的创建任务窗口:

作者图片

这是非常强大的,因为当你想到你需要做的事情时,你可以立即将它添加到 Todoist,而不必改变窗口或离开你当前正在做的任何事情。除了任务之外,我还用这个来快速写下我有的零散想法或想法;我有一个名为Scratch的项目专门用于这个目的。我的其他项目有:生产力、杂项、乐趣、职业、编码、学校和组织/公司项目。添加表情符号使项目更容易识别。

11.3 笔记/知识管理

我以前用意念做笔记,但现在我主要用黑曜石做重要的笔记。在了解了概念笔记之后,我做出了这个转变,这完全改变了我思考知识的方式。我从这部视频中了解到,这部视频很好地解释了这一点,但这是我对它的理解:

传统上,我们按顺序记笔记:我们按照在课堂上出现的顺序写下事情,我们按类别存储信息:我的营销笔记在一个文件夹中,我的统计笔记在另一个文件夹中。在课堂上,我们经常根据考试或单元进一步细分:我的考试 1 或单元 1 的笔记在这个文档中,考试 2 或单元 2 在另一个文档中,等等。班级也可以分为学年或学期;我每个学期都有文件夹(2021 年秋季,2021 年春季等)。我用概念来做这种笔记,它在准备考试或随堂考时效果很好。

不幸的是,顺序笔记不利于信息的长期保存。我在大学里上过三门统计学课,每一门课都教我贝叶斯定理。如果我想使用我以前关于贝叶斯定理的笔记,我必须记住我在哪一个学期上过另一门课,然后记住它是哪门考试或单元的一部分,并在这些笔记中寻找它。这个过程需要很长时间,所以我只是重新学习贝叶斯定理,现在已经这样做了 3 次。

进入概念注释。概念音符就是它们听起来的样子;每个笔记都是一个原子概念,它不是存储在一些嵌套的文件夹列表中,而是我长期知识的大金库中的另一个笔记。贝叶斯定理不会是某个更大的“统计笔记”页面的一部分,它现在是自己的页面,如果我遇到与它相关的新信息,我可以很容易地搜索和添加。黑曜石鼓励这种笔记结构,并允许您轻松地搜索您的笔记,将相关概念链接在一起,等等。

这个想法是,如果你已经学过一次,你就不应该再学一次——无论这意味着在谷歌上查找它还是在文件夹和长文档中挖掘它。一旦我创建了一个概念笔记,这个概念就会成为我的知识库的一部分。我可以很容易地找到它,并查看我第一次学习它时对这个概念的理解。

不是我学的所有东西都需要成为我知识库的一部分;我上的一些课,比如会计,我知道我再也不会用到了。在这种情况下,我只是按顺序记笔记来完成整个课程。然而,如果它是我可能想要记住或在未来使用的东西,我会把它作为一个概念性的笔记添加到我的黑曜石储藏室中。黑曜石个人知识管理(PKM)** 篇幅很大,我在本指南中只是触及了皮毛。开始确实需要很多努力,所以如果你感兴趣,不要犹豫,伸出手来!我对黑曜石的很多了解来自布莱恩·詹克斯。**

12.面试准备💼

回顶

我不认为自己特别有资格提供招聘建议——今年夏天我在脸书实习,但这是我唯一面试的地方,我在他们大二探索项目(脸书数据挑战)结束时自动收到了面试通知。然而,我可以分享我用来准备面试的资源,因为它们应该对所有产品管理和以产品为中心的数据科学面试有用。你也可以在我的个人网站上查看我的简历,网址是 ryan-brown.me 。如果你有任何问题,请随时联系我,我很乐意尽我所能帮助你。

PM & DS 面试准备资源

13.结论

回到顶端

我希望你发现本指南的某些部分是有用的;我投入了大量的时间和精力,并认为当我两年前开始我的数据科学之旅时,它确实对我有所帮助。如果您认为本指南中有任何可以改进的地方,或者有某个部分非常突出,请告诉我!我想继续更新这个指南,如果知道人们从中受益,那就太好了。你可以通过电子邮件联系我,ryan.brown@utexas.edu,或者在 LinkedIn 这里

机器学习中的优化指南

原文:https://towardsdatascience.com/the-hitchhikers-guide-to-optimization-in-machine-learning-edcf5a104210?source=collection_archive---------17-----------------------

Unsplash 上由 Max Duzij 拍照

最优化和随机梯度下降的详细指南

本文的目的是正确理解机器学习算法的“优化”的确切含义。此外,我们将看看基于梯度的类(梯度下降,随机梯度下降等)。)的优化算法。

注意:为了简单和更好的理解,我们将讨论的范围限制在监督机器学习算法。

机器学习是应用数学和计算机科学的理想高潮,在这里我们训练和使用数据驱动的应用程序来对可用数据进行推理。一般来说,对于 ML 任务,推理的类型(即,模型做出的预测)根据问题陈述和正在为手边的任务处理的数据类型而变化。然而,与这些不同之处形成对比的是,这些算法往往也有一些相似之处,尤其是在它们如何操作的本质上。

让我们试着理解前一段。将监督 ML 算法视为一个超集。现在,我们可以根据这些算法共有的特征将这个超集进一步划分为更小的子组:

  • 回归与分类算法
  • 参数与非参数算法
  • 概率与非概率算法等。

尽管将这些差异分开,但如果我们观察监督机器学习算法的一般化表示,很明显这些算法倾向于以或多或少相同的方式工作。

  • 首先,我们有一些带标签的数据,这些数据可以分解成特征集 X ,以及相应的标签集 Y

功能集和标签集(图片由作者提供)

  • 然后我们有模型函数,用 F 表示,它是一个数学函数,将输入特征集 X_i 映射到输出 ŷ_i

模型函数(图片由作者提供)

通俗地说,每个有监督的最大似然算法都涉及将特征集 X_i 作为输入传递给模型函数 f,函数 f 对其进行处理以生成输出ŷ_i.

然而,这只是一个模型的推断(或测试)阶段,从理论上讲,我们应该使用该模型对它从未见过的数据进行预测。

但是“训练”模型呢?接下来我们来看看。

模型优化

监督 ML 算法的训练阶段可以分为两个步骤:

  1. 前向传播:前向传播步骤类似于模型的推理阶段,这里我们有一个参数化的模型函数 f,它对输入集 X_i 执行转换以生成输出 ŷ_i
  2. 反向传播:在我们了解反向传播的工作原理之前,了解我们为什么需要它是非常重要的。当我们使用参数化模型时,参数矩阵(模型权重和偏差)通常是随机初始化的。由于这种随机初始化以及与之相关的不确定性,初始模型的性能很有可能会令人失望。 因此,我们需要一种方法,以某种方式改变模型参数,从而提高其性能 。这正是反向传播的目标。在反向传播步骤中,我们首先参考实际标签 Y_i 通过损失函数计算总信息损失(有时也称为模型成本)来评估推断的模型输出 ŷ_i 。然后,基于所产生的损失,我们优化模型,使得在下一个训练周期,模型产生的总成本减少。

模型训练(图片由作者提供)

那么我们到底如何定义模型优化呢?

模型优化可以定义为基于一个标准(损失函数)更新模型参数(即模型权重和偏差)的过程,使得模型对训练数据进行推断时的信息损失减少。简单地说,在优化步骤中,我们迭代地更新模型参数,使得成本函数最小化。

因此,模型训练可以总结为一个迭代循环,其中我们从一些随机初始化的模型参数开始,然后通过几个反向传播步骤慢慢优化这些模型参数,目的是实现高精度和低模型成本。

现在我们知道了什么是模型优化,让我们来看看机器学习中一些最广泛使用的优化算法。

梯度下降算法

梯度下降是机器学习中最容易实现的(也可以说是最差的)优化算法之一。它是一阶(即,基于梯度的)优化算法,其中我们迭代地更新可微分成本函数的参数,直到达到其最小值。

在我们理解梯度下降如何工作之前,首先让我们看一下 GD 的广义公式:

梯度下降(图片由作者提供)

这里的基本思想是在损失函数相对于参数的负梯度方向上更新模型参数。为了给你一个更好的直觉,你可以把梯度下降想成这样:

让我们假设我们的成本函数是一个山区,我们的优化函数梯度下降的目的是找到这个山区的山谷(即成本函数的最小值)。继续山区的类比,让我们假设一个被蒙住眼睛的人被丢在山上的某个地方,并被要求到达山脚。

现在,由于被蒙住了眼睛,这个人自然不知道去山脚的方向。因此,对于人来说,关于到基地的方向的最佳可用信息将是他们每走一步的最陡斜坡的方向。因此,按照梯度下降法,我们被蒙住眼睛的人会以这样一种方式移动,他们采取的每一步都将是最陡下降的方向。

下山(图片由作者提供)

基本上,梯度下降算法遵循一种贪婪搜索策略,在其他方向可能有更好的解决方案,然而,参数仅在相对于梯度(或斜率)的方向上更新。

然而,这种搜索策略有一个重大缺陷!由于这是一个贪婪算法,该算法很有可能会陷入局部最小值而不是全局最小值 ,因此我们可能永远不会收敛到模型成本最小的最佳参数值。

学习率的影响(γ)

当涉及到梯度下降算法中的参数更新时,表示步长(或学习率)的超参数γ的值起着关键作用。

  • 如果 γ 太低,达到最优解的几率会增加。然而,收敛速度,即多快达到最小值,将急剧下降。这仅仅意味着当学习率太低时,模型必须被训练的时期的数量将增加。

γ太小(图片由作者提供)

  • 如果 γ 太大,由于模型参数倾向于在最小值附近振荡,获得最优值的概率降低。然而,由于更大的步长,收敛速度增加。高学习率的另一个明显的缺点是一种叫做发散的现象,简单地说就是损失爆炸。

γ太大(图片由作者提供)

处理这种高学习率和低学习率之间的权衡的一种实用方法是具有可变的学习率——在初始时期具有较大的学习率,然后随着我们在模型训练过程中进一步进行,在以后时期具有降低的学习率。这将具有高学习率(更快的收敛)和低学习率(达到最优的更高概率)的优点。

虽然梯度下降很容易实现,但它容易频繁陷入局部最优的缺点是不容忽视的。

如果优化算法实际上不能最小化模型成本,那么它有什么用?

因此,研究人员提出了改进的、更优化的梯度下降版本——随机梯度下降。

随机梯度下降

虽然随机梯度下降与梯度下降算法属于同一类一阶迭代优化算法,但它在计算和性能方面都比梯度下降有了显著的改进。

在 SGD 中,我们不是使用整个训练集的梯度来更新权重,而是随机地从训练集中选择一个数据实例,然后基于该单个数据实例的梯度来执行权重更新。

概括的公式可以给出如下:

随机梯度下降公式(图片作者提供)

看一下 SGD 公式,很明显它非常类似于梯度下降算法。唯一的区别是,SGD 使用从数据集中随机均匀选择的单个数据实例的模型损失梯度,而不是采用整批数据实例的模型损失梯度。

然而,在实践中,与梯度下降相比,SGD 工作得更好,原因是 SGD 中的噪声参数更新。由于我们是在每个实例的前向推进后更新参数,而不是在累积整个训练集的梯度后更新参数,因此参数往往会来回波动。这在某种程度上降低了陷入局部极小值的概率。这种现象被称为退火

SGD 中的退火(图片由作者提供)

此外,还观察到 SGD 与 GD 相比的计算成本更低,因此显著减少了训练时间

理论上,我们假设数据集中的所有数据实例都是相互独立的,即训练集中的所有实例都是唯一的。然而,在实践中,数据集中有很多冗余(相似的数据实例)。这有助于降低数据集中的噪声,从而确保更新的参数值接近(如果不是更好的话)从梯度下降中获得的参数值。

注意:在实践中,我们不是在单个数据实例上更新模型参数,而是在小批量数据上执行权重更新。这可以认为是 GD 和 SGD 的混合体。 mini-batch-SGD 的优势在于它针对 GPU 上的并行化进行了优化(即,模型函数可以同时处理多个数据实例),从而允许更快的训练时间和更少的噪音。

基于动量的 SGD

如果我们用物理学术语来说,动量是一个物体保持其运动方向不变的属性。换句话说,动量是一个物体的物理属性,允许它保持其运动的方向和状态。

当我们在上一节讨论随机梯度下降时,我们观察到由于噪声,模型参数振荡很大。这种过多的噪声虽然在实践中对局部最小值有效,但阻止了模型损失函数达到绝对最小值。因此,成本函数可能永远不会收敛,如下图左侧所示。

新币 vs 新币+动量(来源:https://at cold . github . io/py torch-Deep-Learning/en/week 05/05-1/)

因此,为了减少这些振荡,优化研究人员使用了牛顿物理学动量背后的动机,并引入了基于动量变化的随机梯度下降算法。

为了理解动量是如何起作用的,让我们看一下 SGD 带动量的通用公式。

新币+动量(图片由作者提供)

以下是 SGD+momentum 的工作原理:

  • 在非动量 SGD 中,通过梯度方向上的贪婪搜索来更新参数。
  • 然而,在 SGD+动量中,来自前面步骤的动量添加剂影响斜坡的下降。结果,参数更新被迫沿着某个方向,而不是在负梯度的方向上振荡。结果,这抑制了噪声,并因此增加了模型成本达到绝对最小值的概率。

如果你仔细注意动量公式,它只是 SGD 中每个参数更新步骤后梯度的累积。然而,这里需要注意的一件重要事情是,超参数β(范围在 0-1 之间)会在每步之后衰减累积的梯度。因此,与更早的步骤中的动量相比,由于更近的步骤中的梯度而产生的动量更多地影响参数更新。

实际上,正如我们在上图中看到的,动量增加了收敛的可能性,同时计算量也不是很大。这就是为什么大多数深度学习和机器学习包使用 SGD 的基于动量的实现而不是常规实现的原因。

到此,我们来结束这篇文章。这篇文章的要点是:

  • 我们看到了什么是模型优化。
  • 我们概述了一些最广泛使用的优化算法,如梯度下降、随机梯度下降和基于动量的 SGD。

如果你觉得这篇文章很有帮助,并希望继续看到更多这样的文章,请确保点击“关注”按钮。

这里是我的一些其他策划的文章:

你可以在 LinkedIn 上联系我:

https://www.linkedin.com/in/amansharma2910/

快乐学习!

Hopfield 网络

原文:https://towardsdatascience.com/the-hopfield-network-67267d0569d2?source=collection_archive---------43-----------------------

Unsplash 上由 Silas Baisch 拍摄

一个 C++实现

模型

Hopfield 网络 是一种由 John Hopfield 在 1982 年描述的递归人工神经网络的形式。

Hopfield 网络由 N 个全连接神经元和 N 条加权边组成。此外,每个节点都有一个由等于+1 或-1 的自旋组成的状态。

当一个人有一组状态(即自旋向量)并且希望网络记住它们时,这种网络被部署。在数学术语中,我们在数据空间中建立一个哈密顿量,其最小值在我们选择的一些特定点上:存储器。

当模型建立后,可以给系统增加一点扰动,让它再次收敛到全局最小值。换句话说,如果损坏的存储器出现在系统中;系统本身能够修复它并回到它的原始状态之一(由其中一个存储器定义)。

在本文中,我将展示一个使用 C++中不同的并行化技术实现的模型的例子。

可以代表 Hopfield 网络的全连接网络示例。图片作者。

形式主义

Hopfield 网络可以用描述神经元状态的向量ᵢ和邻接矩阵ᵢⱼ.来表示

给定内存 X ={x₁…xₙ}用尺子 J ᵢⱼ=1/N xᵢxⱼ.设定重量

训练简单到指派sᵢ=sgn(jᵢⱼsⱼ),或者取 JS 之间矩阵乘积的符号。这里的关键点是 S ᵢ可以异步更新*

很容易验证,如果 S = X 系统处于其能量最小值之一。

既然这样

***sᵢ=sgn(jᵢⱼxⱼ),所以

S ᵢ=sgn(1/N xᵢxⱼ xⱼ)*

并且由于 xⱼ xⱼ总是等于 1,所以对于每一个 i 我们是系统的一个吸引点中的。*

能量函数的吸引盆。来源维基百科

一个 C++实现

这个模型可以用 C++高效地实现,这是我的界面。

class Model : public Model_I<Memory>
{
public:
    Model(uint16_t P, uint16_t N, size_t num_threads = 4, devices device = kNull); void load_memories(std::vector<Memory>);
    void train(devices device = kNull);
    void reconstruct(Memory &);private: spin* fNeurons;
    float* fWeights;
};

用户可以声明一个具有 N 个能够加载不同记忆的神经元的模型。该模型可以在多线程和不同的设备(CPU/GPU)上运行。

用户有方法加载内存训练模型和重建内存。记忆只不过是一系列的旋转,以及操纵它们的方法。

私有数据成员实际上是 SJ ,如前一段所述。

注意,我选择将 S 定义为布尔向量

typedef bool spin

一个 bool 通常占用 1 个字节的内存,相反,一个 int 可以占用 4 个字节的内存,所以这个选择可以减少 75%的内存使用。

J (权重)是 float 的向量。

我还实现了一些助手方法来从文件中读取和写入数据。

重建记忆

我用来自 MNIST 的一些数字和一个中等的标志来训练这个模型。

在设置好权重后,我给模型展示了一个损坏的内存。正如你在左边的下图中看到的,损坏是由一个黑色的矩形覆盖了图像的一半。

在这一点上,我调用了重建方法…瞧,模型重建了图像的缺失部分

损坏的(左)和重建的(右)媒体标志。图片作者。

另一个例子可以用数字来说明。左边是损坏的手写 4 ,右边是重建的版本。

来自 MNIST 的一个损坏和重建的数字。图片作者。

一个例子

在下面的模块中给出了该模型的完整示例。

存储数据并设置重量

模型中存储了两个内存({1,1,-1,-1,1,1}和{1,1,1,1,1})。

std::vector<Memory> training_dataset;
training_dataset.emplace_back(Memory(6, 1, 1, -1, -1, 1, 1));
training_dataset.emplace_back(Memory(6, 1, 1, 1, 1, 1, 1));//Create a model
auto model = Model(
    training_dataset.size(), //P, number of memories
    training_dataset[0].size() //N, number of neurons
);model.load_memories(training_dataset);

训练模型并设置神经元的旋转。

模型被训练。(注意,用户可以选择设备;在这种情况下是 CPU)

// Train the model.
model.train(kCPU);

创建损坏的内存

我们创建了第二个内存的损坏版本(最后一次旋转从-1 翻转到+1)。

// Build a corrupted memory
spin corrupted_data[] = {1, 1, 1, 1, 1, -1};
Memory corrupted_memory;
std::memmove(corrupted_memory.fData, 
     corrupted_data,
     corrupted_memory.size_of()
);

让模型重建记忆

最后,记忆应该被重建并打印出来。

model.reconstruct(corrupted_memory);

cout << "Reconstructed: " << endl;
for (uint8_t i = 0; i < corrupted_memory.size(); i++) 
    cout << corrupted_memory.fData[i] << " ";

模型的最终输出显示了正确固定的内存。最后一次旋转恢复到其原始值,输出为{1,1,1,1,1}

整个代码

// Create a dataset with memories
std::vector<Memory> training_dataset;
training_dataset.emplace_back(Memory(6, 1, 1, -1, -1, 1, 1));
training_dataset.emplace_back(Memory(6, 1, 1, 1, 1, 1, 1));

//Create a model
auto model = Model(training_dataset.size(),training_dataset[0].size());
model.load_memories(training_dataset); // Train the model. Use can use kNull, kCPU, kGPU, kMultiThread, kOMP
    // If the chosen device is not available another one is automatically picked up
model.train(kCPU);// Build a corrupted memory
spin corrupted_data[] = {1, 1, 1, 1, 1, -1};
Memory corrupted_memory;
std::memmove(corrupted_memory.fData, 
     corrupted_data,
     corrupted_memory.size_of()
);

model.reconstruct(corrupted_memory);

cout << "Reconstructed: " << endl;
for (uint8_t i = 0; i < corrupted_memory.size(); i++) 
    cout << corrupted_memory.fData[i] << " ";

cout << model;

设备

该代码使用多种方法实现。当用户选择设备时,行为被定义。可用选项包括:

  • kCPU 在这种情况下被调用的方法没有什么特别的。这可以很容易地在任何平台上运行,但是性能比较差。
  • k 多线程在这种情况下,调用的方法使用 std::thread C++实现,计算由多线程执行。性能与机器内核的数量成正比,但比只有一个线程的性能要好。在这种情况下,每个线程对自旋的子集进行操作。
  • kOMP 在这种情况下,借助 OpenMP 进行运算并行化。该选项要求安装 OpenMP,但代码会切换到 kMultiThread。
  • kGPU 在这种情况下,我使用苹果金属框架,使用苹果机器的 GPU 执行操作。这应该是最快的选项。由于每个神经元可以独立于所有其他神经元进行更新,因此这个问题可以很容易地利用 GPU。

结论

总之,Hopfield 网络可以很容易地用来存储二进制格式的一组数据,比如图像。当内存的损坏版本呈现给模型时,它能够修复错误,填充缺失部分,并完全重建原始内存。

我用 C++实现了一个具有不同并行化形式的模型,并演示了它在重建徽标或手写数字时的作用。

代码

这个模型的全部实现和其他例子都在我位于 https://github.com/fvalle1/hopfield/的仓库里

国际象棋中的热门牌

原文:https://towardsdatascience.com/the-hot-hand-in-chess-17984b01e694?source=collection_archive---------26-----------------------

阿莫斯·特沃斯基热手谬误分析的再现,适用于国际象棋选手

GR StocksUnsplash 上拍照

背景

在篮球中,有一个“热门手”的概念,如果一个球员在最近的过去投了几次球,他被认为是“在状态”,更有可能在未来投篮。用稍微多一点的统计学术语来说,当以先前投篮为条件时,投篮的概率更高。

1985 年,阿莫斯·特沃斯基、托马斯·吉洛维奇和罗伯特·瓦隆从统计学的角度分析了这一众所周知的心理现象,他们使用了 1980 年 NBA 赛季费城 76 人队和波士顿凯尔特人队的详细投篮记录。他们的分析分为 4 个部分:

  1. 篮球迷对投篮顺序相关性信念的调查。
  2. 分析了 48 场比赛中 76 人队球员的投篮记录(除了罚球以外的任何投篮)。
  3. 分析凯尔特人球员的罚球记录,以控制投篮选择,防守等。
  4. 招募康奈尔大学学生进行的控制射击实验

在本文中,我们应用了 Tversky 等人用来衡量篮球热门牌局的统计技术,但重点是互联网闪电战国际象棋游戏。针对一组业余和职业玩家,我们:

-找出玩家在之前赢了 1、2 或 3 次的情况下赢得游戏的概率
-找出玩家在之前输了 1、2 或 3 次的情况下赢得游戏的概率
-找出玩家赢和输的序列相关性

数据

这个分析的数据是使用 Lichess 非常有用的 API 提取的,该 API 允许请求者提取他们网站上任何给定玩家的数千场历史游戏。下面是一个简单的例子,我用几行代码就提取了 1000 个我自己的游戏。

不幸的是,输出非常混乱,需要大量的争论才能变成可用的形式。下面是一个游戏请求的输出示例:

然而,经过大量的解析后,我们得到了一个典型的熊猫数据帧中的数据,每个游戏占一行。为了进一步细化数据,我们只选择玩家之间的评级游戏,这些游戏彼此的 elo 评级在 20%以内,以确保只包括竞技游戏。最后,我们有一个如下例所示的数据框架:

分析

最初热手谬误分析的统计学家计算了 76 人队 9 名球员的 8 项数据。

-他们的整体投篮命中率
-他们投篮的概率给他们:错过了最后一次投篮,错过了最后两次投篮,或错过了最后三次投篮
-他们投篮的概率给他们:做了最后一次投篮,做了最后两次投篮,或做了最后三次投篮
-他们投篮的序列相关性

这是他们原始论文的截图,其中他们指出,平均而言,他们实际上看到了一手好牌的反面,一名玩家在之前出手 1、2 或 3 次后,不太可能出手。另一方面,普通球员在投丢 1-3 个球后似乎更有可能投中,这完全否定了篮球中“手热”的说法。

https://www . science direct . com/science/article/ABS/pii/0010028585900106

利用我从 Lichess 的 API 中提取的 1000 款游戏的数据,我能够重现这些相同的统计数据。对于每个条件概率,我会查看自己是否连续赢了或输了 1/2/3 场比赛,然后记录下一场比赛的结果。平均每种情况的结果,我最终得到了与原始热手研究中相同的条件获胜概率(完整代码在此为)。看看下面的平均条件概率图,看起来有一手好牌的暗示,在我连续赢了 3 场比赛后,我赢得了 55%的比赛,但在我连续输了 3 场比赛后,我只赢得了 47%的比赛。

然而,一个样本的大小并不十分令人放心。根据我和我最近的 9 个对手的数据,我们重新制作了 1985 年 Tversky,Gilovich 和 Vallone 为 76 人队球员制作的表格。

赢得一场比赛的概率,取决于先前比赛的结果(表示 p < .05)*

查看加权平均获胜概率(如下图所示),我们看到一个明显的趋势,支持国际象棋中“热门牌”的观点。随着玩家连续赢得更多游戏,他似乎更有可能赢得下一场游戏。另一方面,如果一个玩家连续输掉比赛,他更有可能输掉下一场比赛。除此之外,还有两个玩家的游戏历史的系列相关性是 stat-sig 阳性的。

上图中玩家获胜概率的加权平均值

诚然,我自己和我在这个分析中随机选择的对手将被认为是业余选手。下面,我进行了同样的分析,但使用的是目前在 Lichess 上 blitz 排行榜上名列前茅的 10 位大师的游戏数据。使用这些球员将更类似于最初的热手研究,使用职业篮球运动员。

赢得一场比赛的概率,取决于先前比赛的结果(表示 p < .05)*

虽然这些大师的平均胜率比业余选手高得多,但我们仍然看到了相同的趋势,即如果以赢得先前的比赛为条件,赢得当前比赛的概率更高(如果以先前的失败为条件,赢得的概率更低)。此外,大师级游戏的每一个序列相关性都是正的,3 具有统计显著性。

上图中特级大师获胜概率的加权平均值

这一分析绝非完美。可能存在混淆的变量,如一天中的时间、互联网连接,或者,正如我的朋友大卫指出的,清醒。样本量很小,而且它只是模拟了原始热手研究的一部分。抛开所有的不完美,这一分析强烈地表明,在国际象棋中有这样一种“热手”,玩家进入状态,更有可能赢得比赛。业余和职业玩家也表明,他们可能会有冷条纹,或者变得倾斜,正如以先前的失败为条件赢得游戏的较低概率所示。

感谢阅读,这个分析的完整代码可以在我的 GitHub 上找到。要获得所有媒体文章的完整访问权限,请点击此处

根据谷歌趋势数据,2020 年最热门的俚语

原文:https://towardsdatascience.com/the-hottest-slang-of-2020-according-to-google-trends-data-7bae348409b4?source=collection_archive---------32-----------------------

从“simp”到“wfh”,这 10 个词在过去的一年里占据了互联网

谷歌趋势可以告诉我们很多关于语言的信息——它经常被用来分析地区俗语或趋势话题。对于这个项目,我想看看我是否可以使用谷歌趋势来确定全年上升的俚语词汇。

我对“俚语”的标准如下:

  1. 这个词必须在 2020 年出现,这意味着它在前几年很少被搜索到
  2. 人们不知道这个词的定义,这意味着人们在搜索“____ 定义”、“什么是 ”和“_ 字典”等。

第一点确保我们的列表不会充满像“woke”或“karen”这样的既定单词——我们最终列表中的每个单词都是在 2020 年首次出现的。

第二点确保我们列表中的单词是新的,因为人们以前没有听说过它们——例如,“选举”肯定是一个可能在 2020 年“出现”的单词,但很少有人会搜索选举的定义

正如我在上面所说的,我使用谷歌趋势来确定十大名单。这个项目的完整代码可以在这里看到。

我首先建立了一个过去一年的相关查询数据集,包括以下术语:“字典”、“定义”、“定义”和“城市字典”。我使用了 Google trends API 的 Python 包装器 pytrends 来收集这些数据。

***import** **pandas** **as** **pd**                         
**from** **pytrends.request** **import** TrendReq pytrend = TrendReq()
pytrend.build_payload(kw_list=['define', 'definition', 'dictionary', 'urban dictionary'], timeframe='2019-12-30 2020-12-29')related_queries = pytrend.related_queries()*

related_queries()命令为我们的关键字列表中的每个术语返回相关查询的 pandas 数据帧的字典。输出可能如下所示:

*{'define': {'top':                     query  value
  0          define synonym    100
  1          define meaning     83
  2              definition     63
  3                synonyms     27
  4   what does define mean     11
  5              dictionary      8
  6           define health      7
  7       define management      6
  8      define coronavirus      6
  9             define love      6
  10        define computer      5
  11           define force      5
  12        pandemic define      5
  13               pandemic      5
  14              thesaurus      5
  15     define environment      4
  16         define concept      4
  17       define community      3
  18          define values      3
  19            define verb      2
  20       define objective      2
  21       define essential      2
  22        define furlough      2
  23            define simp      2
  24          define racism      1,
  'rising':                              query  value
  0               define coronavirus  29400
  1                         pandemic   3450
  2                  pandemic define   3350
  3                  define furlough    850
  4                      define simp    850
  5                define quarantine    850
  6              define asymptomatic    300
  7                important synonym    180
  8                  however synonym    160
  9                       define wap    160
  10                  define synonym    150
  11                        synonyms    120
  12  the song that define your life    120
  13                  define meaning    100
  14             define asynchronous     90
  15                  define endorse     80
  16                   define racism     70
  17                define endurance     70
  18                 define parasite     70
  19                    define evoke     70
  20             define apprehension     70
  21                   define prefer     70
  22                  define deviant     60
  23                       thesaurus     60
  24                  define condemn     60},
 ...*

如您所见,该调用返回了两个字典,一个名为“rising”,另一个名为“top”。出于我们项目的目的,我们对出现在‘rising’字典中的相关查询感兴趣。

在连接每个关键词的数据框架并过滤掉重复的术语后,最终的数据集有 95 个来自 2020 年的潜在俚语词。

然后,我开始量化每个词的搜索兴趣,以确定前 10 名。这是一个相当简单的过程,因为 Google trends 允许您传递多个术语进行比较。

经过计算,我有了我的前 10 名!这是:

图片作者。

上图显示了每个单词的两个图表——2020 年和 2004 年以来的利息。第一张图显示了这个词在一年中的流行程度,第二张图证实了所有这些词在 2020 年都是“新”的。

除了…是真的吗?像流行病,无症状这样的词肯定已经存在很长时间了。为什么他们会出现在这个名单上?

是的,“流行病”无论如何都不是一个新词,但是 2020 年“流行病”的搜索量绝对让前几年的搜索量相形见绌。无症状、休假和隔离也是如此。我相信我们都知道为什么会这样。

事实上,这个列表中不到一半是真正的俚语。我不认为这是因为方法有缺陷,而是因为今年的环境使得语言趋势几乎完全由外部事件驱动。

查看 2018 年布丁的一个类似项目可以发现,当年的热门词汇是“incel”、“uwu”等。——这些词大多来自互联网,并没有受到“真实世界”的巨大影响

2020 年名单上的几个词在某种程度上与新冠肺炎·疫情有关。让我们再来看看这个列表:

图片作者。

这个列表中唯一真正的俚语是 simp,BIPOC,wfh 和 WASP mom。甚至 wfh 也受到了新冠肺炎疫情的激励,而 BIPOC 可能是对黑人的命也是命抗议和呼吁种族公正的回应而变得更受欢迎。

2020 年是非传统年,这个榜单也证实了这一点。这些词不是在小众群体中冒出来并慢慢流行起来的——这些词是随着我们日常生活的环境突然发生巨大变化,我们被迫理解和适应的。

我所能说的是,“冠状病毒”在这个名单上名列前茅是恰当的,它在许多方面都被疫情打上了标记。事实上,“冠状病毒”是一个在 2020 年之前很少有人使用的词,并且在全年的日常对话中几乎占据了主导地位。

不确定其中一些单词的意思,或者想了解我的更多数据科学项目?考虑查看我的 youtube 视频和我的频道,我在那里发布了大量数据科学内容!

人类偏差-准确性权衡

原文:https://towardsdatascience.com/the-human-bias-accuracy-trade-off-ad95e3c612a9?source=collection_archive---------32-----------------------

图片来源:乔恩·泰森Unsplash 上的照片

理解历史数据如何导致算法偏差以薪酬预测模型为例

做人就是要偏心?

“偏向”是一种倾向或倾向偏向或不偏向某一组。所有的人类都有一定程度的偏见,因为我们天生就有辨别不同威胁的能力。由于这种隐性偏见,我们倾向于无意识地将特征和品质归因于社会中通常被污名化的群体。这些包括基于性别、种族、国籍或地理遗产的群体。根据斯坦福大学哲学百科全书****

“对‘隐性偏见’的研究表明,人们可能会基于偏见和成见行事,而并非有意为之”

现在,如果我们知道并理解了这个事实,我们就有办法消除这种隐性偏见,即意识到并认识到它是如何影响我们的认知决策的。这将包括有意识地努力改变陈规定型观念,调整我们的视角。

图片来源: GIPHY

对准确性无止境的追求

机器学习的目标是获得最准确的预测。数据科学家有几个指标可以通过最小化已知的预测误差来量化这一既定目标。在回归问题的情况下,这些度量是均方根误差、平均绝对误差、R 平方值等。对于分类算法,度量包括 AUC、准确度、精密度、灵敏度、特异性等。使用几种方法来进一步调整,然后微调参数和超参数。

一切都归结为优化一个特定的权衡——偏差-方差权衡;确保我们对人口数据的任何部分都有准确的预测。

被忽视的权衡

在获得更高准确性的同时,一个事实被遗忘了——人类收集的数据充满了人类偏见。《卫报》很好地阐述了这一事实:

虽然可以说神经网络可以编写自己的程序,但它们是朝着人类设定的目标,使用为人类目的收集的数据来这样做的。如果数据有偏差,即使是偶然的,计算机也会放大不公正。****

人类偏见可以在数据科学管道中的任何一点出现,并以 算法偏见 的形式出现。当然,收集的数据的多样性是最容易受到影响的一点。如前所述,这也与优化偏差-方差权衡有关。此外,这些数据要么是由人收集的,要么是由人设置的数据收集过程。这意味着,不知不觉中,数据收集的代理人也可能是进入管道的偏差的来源。此外,从所生成的预测中得出的见解也会受到解释结果的人的主观性的影响。算法偏见的直接影响可能是针对或针对特定人群的歧视行为。

令人惊讶的是,这并不是一个新问题。文章“我们对人工智能中的偏见做了什么”(HBR,2019)讲述了早在 1988 年,一所英国医学院根据算法做出录取决定,被发现对女性和非欧洲名字的人有偏见。有趣的是,这种算法在匹配人类决策时表现出 90–95%的准确性。

《华盛顿邮报》在 2016 年的这篇文章中强调了算法偏差的一个更近的例子。它谈到了在美国全国范围内用于保释判决的软件 COMPASS,ProPublica 组织发现该软件对非裔美国被告有偏见。

让我们看一个例子

工作场所的性别差异一直存在,并且仍然普遍存在。因此,历史员工数据必然会有不利于女性的趋势。为了理解算法偏差,让我们以上市公司高管的历史薪酬数据为例我们制作有和没有高级职员的特征 ' 性别 ' 的模型来预测他们的直接报酬。此外,我们对结果进行比较,以了解包含对偏差敏感的特征会如何导致歧视性结果。

关于数据

这些数据是使用沃顿研究数据服务从 BoardEx 获得的。它涵盖四个地理类别:美国,英国,欧盟(欧盟),所有其他国家。我们使用了两个数据集来获得与上市公司高管薪酬相关的不同特征:

1.薪酬数据:包括关于现在和过去的股票期权持有量、直接薪酬、从每个职位退休的时间、在公司服务的时间、关于董事会的信息(如果服务)、公司的部门类别、关于过去的董事会的信息(如果服务)。

2.个人资料特征:包括性别、学历、年龄、网络或关系等数据。

详细的数据字典可以在这里访问。

数据清理

由于公司拥有多个代码,数据中存在重复值,这些重复值已被删除。之后,数据中唯一 BoardIDs(公司董事会的唯一标识符)的数量为——17K 来自美国,5K 来自欧盟和英国,大约 8K 来自其他国家。最终合并数据(所有国家)包含大约 32.5 万名董事/高级管理人员的信息。

然而,对于每一位董事来说,这些数据都来自公司不同年份的年度报告。例如,如果一名董事从 2000 年至 2010 年为一家公司服务,则该董事-公司配对有 10 个条目。为了我们的分析,我们保留了董事-公司配对,其中董事 X 在公司 y 中的直接报酬总额最高。

在选择了与我们的分析最相关的变量之后,即在决定一位高级官员的报酬时最重要的变量之后,最终的数据集有 80879 行和 21 个变量。现在,我们的数据是这样的,每一行是一个独特的董事-公司配对。

数据集中变量的描述(按作者)

注: 在我们的分析中,我们将使用直接薪酬总额作为因变量(Y)。

数据快照(按作者)

探索性分析——数据真的有偏差吗?

按作者

仅从数据中女性和男性的数量来看,我们看到了巨大的差异。我们有 9908 名女性和 70971 名男性高级军官!

性别比例或男性高级官员比例的分布也证实了这一点。

按作者

让我们看一下按性别划分的 表示总直接薪酬 。如下所示,男性的平均直接报酬总额几乎是女性的两倍。

按作者

现在,让我们来看两个变量,它们可以被视为访问机会的代理。

按作者

令人惊讶的是,两性在公司度过的时间分布并没有太大差异。表明高级官员不分性别,给公司的时间相等,但得到的报酬不同。

按作者

比较按性别划分的高级官员资格数量的分布,我们看到,总体而言,女性往往拥有更多资格。这可能表明一种趋势,即要达到与男性同等的水平,女性需要更多的资格。

建模方法

按作者

我们首先尝试 Lasso 回归,看看性别变量是否会被模型拾取。我们的 因变量 或 Y 是 总直接补偿

该模型不仅选择性别作为特征,而且预测男性的总直接薪酬比女性多大约 135 个单位。套索的 R 平方为 0.38。因此,该模型只能解释直接薪酬总额中 38%的差异。

此外,为了获得更高的精度,尝试了梯度提升,其给出了 0.57 的 R 平方。因此能够在总直接薪酬中获得更高的差异。

与我们的预期相反,根据 GBM,“性别”并没有成为一个重要的变量。然而,男性的平均预计直接报酬总额几乎是女性高级官员的两倍。为了进一步研究这个问题,我们运行了一个 GBM 模型,没有将“性别”作为一个变量。尽管如此,女性高级官员的平均预计直接薪酬总额仍低于男性。

我们例子的局限性

虽然我们举了预测直接薪酬总额的例子,但重要的是要考虑到没有组织使用这种使用性别、种族、国籍等变量的算法。为了这个目的。选择这个数据集是为了说明历史数据是如何促进预测中的社会偏见的!另一点要记住的是,对于大多数公司的高级管理人员来说,提供的薪酬不仅仅是直接的。薪酬有间接成分,包括股票、期权和长期激励计划。由于这些特征的稀疏性,它们没有包括在分析中。由于数据涵盖了不同国家的组织,了解不同国家的薪酬、税收优惠和公司结构也很重要。因此这可能扭曲了结果。

记住这些警告,即使预测的准确性提高了,简单的预测性薪酬分析也可能产生带有社会偏见的结果,这一点仍然很重要。

结论

那么,我们能做些什么呢?我们如何利用机器学习做出道德的预测?

一个解决方案是使用砝码

1.为可能受到社会偏见影响的每一类人口的隐含偏见的变量增加不同的权重。例如,在罗盘称重或归一化的情况下,可以使用非裔美国人和他们的白人同伴按人口比例的先前被捕人数。

2.给予其他独立于社会偏见的变量更多的权重,如犯罪的严重性,而不是之前的逮捕。

另一个解决方案是用实时数据监控模型结果,假设数据中的社会偏见会随着时间的推移而减少。

记住这一点,为了预测的公平性,向“可解释的 ML/AI”的转变将传播和产生更多社会公正的数据。这一方向的重要一步是欧盟的通用数据保护条例或 GDPR。数据的使用受到更多的监管,对敏感的人口特征,如性别、种族、民族血统、国籍、地理位置、宗教信仰、遗传、工会会员资格等进行特殊保护。根据第 9 条。

该法规中另一个有趣的地方是,根据第 4 条,法律甚至将消费者的在线位置数据视为个人数据;根据第 6 条,任何个人数据的使用都需要征得所有者的同意。此外,根据第 13 条,公司必须告知消费者他们的数据是如何被利用的。

我们仍然不知道人类的偏见在多大程度上影响了机器学习算法的公平性。但正如雪莉·桑德伯格所说的那样,“ 我们不能改变我们不知道的,一旦我们知道,我们就不能不改变 ”!

参考

[1] 《欧盟一般数据保护条例》(问答), 人权观察 (2018)

AlphaFold 上的宣传随着这种新的预印本不断增长

原文:https://towardsdatascience.com/the-hype-on-alphafold-keeps-growing-with-this-new-preprint-a8c1f21d15c8?source=collection_archive---------26-----------------------

查看这项新工作,通过将 AlphaFold2 与强大的蛋白质序列匹配器 MMseqs2 集成,使 alpha fold 2 的全部功能变得更加大众化。

这个故事介绍了 ColabFold,这是一套 Google Colab 笔记本,它将一种强大而快速的序列匹配方法与 AlphaFold2 相结合,同时还公开了它的所有功能,以便在全球范围内免费访问蛋白质建模的最新技术。文本“蛋白质”不是打印错误,而是代表真实的标准氨基酸的单字母代码。图由作者根据自己的截图合成。

通过将 AlphaFold2 与 MMseqs2 套件集成用于计算多序列比对,第一个正式发布的cola bfold——正如其作者所命名的——允许用户在没有任何硬件或软件负担的情况下最大限度地利用 AlphaFold:预测单体蛋白质及其同源和异源复合物的结构,通过分子动力学模拟对它们进行精炼,并通过预测模型质量的指标对它们进行评分。

我相信你在 2020 年末读到过 AlphaFold,当时它在蛋白质结构建模方面“赢得了”CASP14“竞赛”,在 2021 年 7 月同行评审论文和人工智能模型发布时也读到过。如果不是,或者如果你想更新什么是蛋白质结构,为什么生物学家几十年来祈祷程序能够准确预测它们,以及 AlphaFold 如何工作和执行,然后检查这个故事这个,然后回到这里。

这个新故事给你带来了最新的消息,基于刚刚出版的预印本。

目录

这个故事是基于刚刚在 bioRxiv 上发布的预印本,它正式描述了一个在 moto 下被称为 ColabFold 的工具,该工具使所有人都可以访问蛋白质折叠(我宁愿将其称为使所有人都可以访问 现代蛋白质结构建模 )。

由德国马克斯·普朗克生物物理化学研究所的米洛特·米尔迪塔、美国哈佛大学的谢尔盖·奥夫钦尼科夫和韩国首尔国立大学的马丁·斯坦内格创建的 ColabFold 是一套从早期原型演变而来的谷歌 Colab 笔记本电脑,允许用户只拥有一台计算机、互联网连接和一个免费的谷歌帐户,在谷歌提供的硬件上使用最新的尖端机器学习技术来运行蛋白质结构预测;此外,受益于一些优化,减少了运行时间,而不影响结果的质量,并利用现代工具快速生成多个蛋白质序列比对-正如我在其他故事中解释的那样,这对确保准确的结果很重要。

更准确地说,ColabFold 允许用户运行 AlphaFold2 或 RoseTTAFold(一个基于学术人工智能的程序,来自贝克实验室,蛋白质结构预测的学术领导者之一,它出现在 CASP14 之后,因此尚未正式评估,但显然与 AlphaFold2 的性能接近),并结合 MMseqs2 程序的快速多序列比对生成。用户也可以上传他们自己的比对,这对于非常复杂的蛋白质或蛋白质家族,或者来自专有数据(如宏基因组学项目)的比对来说可能很方便。

使用 MMseqs2 优化生成蛋白质序列比对改进了模型并减少了运行时间

正如近年来 CASP 论文中广泛显示的(例如参见我的同行评审 CASP13 评估),所有这些方法的性能的关键在于计算大量的多重序列比对,在理想情况下,大量的序列平滑地覆盖了整个靶蛋白。因此,比对的初始编译至关重要。更复杂的是,典型的蛋白质序列数据库包含数百万到数十亿个序列,但当然只有非常小的子集对应于相同结构家族的蛋白质,这些蛋白质是人们想要在多序列比对中显示的蛋白质。这就是 ColabFold 的 MMseqs2 组件的用武之地。

Martin Steinegger 和 Johannes Sö ding 的 MMseqs2 是一个在巨大的序列数据库中搜索敏感蛋白质序列的程序。我不会进入任何细节,但描述 MMSeqs2 的论文可能会引起数据科学家的兴趣,因为该程序的核心目标是加速序列搜索。ColabFold 通过对专用服务器的 API 调用来执行 MMseqs2 程序。作者优化了他们的序列数据库中包含的蛋白质序列的大小和可变性,以便通过反复运行该程序几次,他们可以产生大量的、信息丰富但易于处理的比对。在预印本中,作者事实上表明,MMseqs2 产生的这些多序列比对导致 AlphaFold 2 比通过其定制的多序列比对获得的预测更准确,并且运行速度快一个数量级。

超越单体“分离”蛋白质的简单建模

绝大多数蛋白质不是作为孤立的分子工作,而是作为复合物工作,或者与自身(所谓的同二聚体、同三聚体等,或一般的同寡聚体)或者与其他蛋白质(称为异二聚体、异三聚体等)一起工作。).主要的评价是发现 AlphaFold2 在 CASP14 中“胜出”,是在模拟蛋白质自身的结构方面,但也有一些迹象表明 AlphaFold2 也正确地模拟了蛋白质复合物。Minkyung Baek 和 Yoshitaka Moriwaki 在早期的 Google Colab 笔记本中对此进行了进一步的探索,然后 ColabFold 的作者最终将这种可能性集成到了已发布的笔记本中。因此,ColabFold 用户可以很容易地模拟分离的蛋白质以及它们的同源和异源复合物。对于异源复合物来说,进行比对是很棘手的,但 ColabFold 的作者已经处理了所有这些负担,为用户制作了一个非常简单的界面,只需勾选寡聚化状态并输入相关蛋白质的不同序列。

值得注意的是,AlphaFold 本身无法辨别一种蛋白质是单体的、同二聚体的、与另一种蛋白质是异二聚体的等等。这种信息有时从生物化学或生物物理实验中得知,在这种情况下,它被用作输入。如果没有这方面的提示,那么用户可能应该在不同的模式下运行预测,并严格比较结果。

普通用户和高级用户的口味

正如 GitHub 官方页面中所述,ColabFold 包括为不同类型的运行定制的各种笔记本:一个用于 RoseTTAFold,一个用于 AlphaFold2 的简单模式,仅允许运行单体蛋白质,但只需做出最少的决定,另一个用于 AlphaFold2,具有完全暴露的功能,允许完全控制寡聚化状态以及用户可以尝试的其他选项。

根据用户登录 Google Colab 时分配的确切 GPU 资源,可以对多达 1000 到 1400 个氨基酸的蛋白质进行建模,这涵盖了大量感兴趣的蛋白质。对于更大的蛋白质,或者为了更多的隐私或方便,用户也可以获得生成的代码,下载整个 AlphaFold 程序和 MMseqs2 生成的比对,并使用其自己的 GPU 在本地运行一切(甚至可以受益于笔记本中的代码)。

质量评估

这些用户友好的界面不仅为用户提供了蛋白质结构的模型,还提供了对它们质量的估计。这样的估计是必不可少的,我认为和预测本身一样重要,所以它们应该是准确的。这是因为最终用户应该知道模型的哪些区域是可靠的,即可能与真实结构相似,以及哪些区域可能无法很好地预测。当我在 CASP13 ( 这篇学术论文)期间担任学术评估员时,我强调了产生三种质量评估的重要性:一种是测量整体折叠的整体质量,另一种是单独测量每个氨基酸的质量,另一种是测量蛋白质中任何一对氨基酸之间的相对距离和方向的质量。ColabFold 笔记本提供了所有三个指标,如下例所示。

结果的完全在线可视化-示例运行

所有可调变量都输入到一个非常丰富的 GUI 的字段中,在此之上,用户当然可以手动修改代码。但是舒适的界面并不局限于输入。笔记本电脑具有丰富的图形输出,用户可以在运行过程中进行检查,并在最后检查所有的质量评估图,甚至是浏览器中的 3D 模型。

请看我对一种蛋白质进行的实际运行的结果,我知道这种蛋白质是同型二聚体,但我对它的结构知之甚少。在 ColabFold 笔记本中第一次点击安装所需的软件,然后设置蛋白质的序列并告诉笔记本我知道我的蛋白质是同型二聚体之后,我首先运行笔记本的 MMseqs2 模块以获得多序列比对,笔记本将在下一步将其输入 AlphaFold。MMseqs2 返回的校准由该总结图表征,其中我们希望顶部有更多的绿-青-蓝色调,并且理想情况下有更平坦的黑色轮廓,尽管这看起来不太坏:

对测试蛋白质运行 MMSeqs2 的结果,我知道它是同型二聚体。该图描述了 MMseqs2 可以检索的多重序列比对。理想情况下,我们会期望顶部有更多的绿-青-蓝色调,以及更平、更平滑的黑线。但这看起来还不算太糟。作者截图。

一旦比对完成(理想情况下,人们应该下载并探索其序列是否足够好,但这很难,因为 MMseqs2 返回大量的命中结果),我就进入笔记本的下一个模块,在那里我启动 AlphaFold2。在笔记本运行时,我可以监控 5 个预测模型的生产过程:

随着 AlphaFold 的运行,笔记本显示了产生的模型的静态图像,按链(每条链是一个蛋白质分子,见左边绿色和青色各一个)或预测 LDDT(一种预测蛋白质每个氨基酸模型质量的指标)进行颜色编码。随后,用户可以在 3D 中检查所有的最终模型。作者截图。

在 AlphaFold 运行结束时,我可以在那里检查每个 3D 模型,这要感谢一个 3Dmol 插件。请注意,5 个模型中的每一个都有一个平均预测 LDDT 分数,用于对模型进行排序。在这种情况下,所有 5 个模型在整个序列中都相当好(由高 pLDDT 值表示),并且它们彼此都非常相似,具有相当高的平均 pLDDT。然而,PAE 图确实揭示了形成二聚体的两条蛋白质链的相对位置的一些不确定性(在预测的比对误差图中白色到红色的阴影):

结果是 3D 模型和完整的质量评估指标:对于每个模型,用户得到预测的结构(左上角,在这种情况下用链着色)加上预测的 LDDT 对沿着蛋白质序列的位置的图(右上角,这里两次,因为这被建模为同型二聚体)和预测的比对误差的图(底部,其中同型二聚体的每个蛋白质链相对于自身和相对于另一个链作图)。作者截图。

通过分子模拟对模型进行改进

由 AlphaFold 或任何其他建模方法产生的模型可能存在各种问题,例如原子之间的冲突、未实现的相互作用等。当模型被预测为高质量时,通过分子动力学模拟进一步改进它们是有意义的。简而言之,在这种模拟中,蛋白质模型是在全原子水平上描述的,有时甚至有模拟的水分子在周围,并允许在给定的温度和压力下在现实物理中波动。目的是消除任何不切实际的冲突,优化几何结构,并满足相互作用和包装,特别是氨基酸侧链。

有几个程序允许运行分子动力学模拟。用户可以下载所有模型,并在本地计算机上用自己的方法和管道运行这些模拟。但是 ColabFold 允许用户在笔记本上运行模拟,只要模型的平衡版本在适当的位置。

结束语

Google Colab 中 MMseqs2 与 AlphaFold2 的结合提供了对蛋白质结构预测技术的免费访问,而不需要任何专门的、昂贵的硬件,也不需要安装任何软件。正如我在这里所讨论的,这将会彻底改变生物学,最好的是全世界的研究人员都可以免费使用它。

链接到文献、代码和笔记本

预印本位于 bior XIV:https://www . bior XIV . org/content/10.1101/2021 . 08 . 15 . 456425 v1 . full . pdf

ColabFold GitHub,包含所有发布版和原型笔记本的链接:https://github.com/sokrypton/ColabFold

Github 中的 MMSE QS 2:https://github.com/soedinglab/MMseqs2

MMseqs2 论文:https://www.nature.com/articles/nbt.3988

我以前在 AlphaFold2 上的故事:

  • 查看这个故事介绍早期的 Colab 笔记本
  • 这一篇讨论 AlphaFold2 可能对生物学和机器学习科学产生的影响。

喜欢这篇文章,想给我提示?【https://www.paypal.me/LAbriata】-谢谢!

我是一个自然、科学、技术、编程和 DIY 爱好者。生物技术专家和化学家,在潮湿的实验室和计算机里。我写我广泛兴趣范围内的一切。查看我的 列表 了解更多故事。 成为媒介会员 访问我和其他作家的所有故事, 订阅通过邮件获取我的新故事 (平台原创附属链接)。

假设检验者指南

原文:https://towardsdatascience.com/the-hypothesis-testers-guide-75f7db2e4d0d?source=collection_archive---------27-----------------------

一篇简短的介绍为什么我们可以拒绝假说,但不能接受它们的入门书,有例子和图像。

图片由作者提供。

假设检验是经典统计推断的基础。这是一个在不确定性下做出决定的框架,目标是防止你做出愚蠢的决定——前提是有数据证明他们的愚蠢。如果没有这样的数据… _(ツ)_/

假设检验的目标是防止你做出愚蠢的决定——前提是有数据可以验证他们的愚蠢。

这里的问题是,你只能用假设检验来否定一个愚蠢的选择,但你不能用它来接受一个好的选择。为什么?请继续阅读,寻找答案!

建立假设

一切都始于做出一个决定。考虑一下这个:您有一个大型数据处理管道,您认为它太慢了。因此,您重写代码以使用更有效的数据结构,并最终得到一个新的、有希望更快的管道版本。要做的决定是:你应该用新管道替换旧管道吗?

您希望您的决策是由数据驱动的,所以您收集了一些数据。您运行每个管道 50 次,并记录运行时间。旧管道平均需要 41 分钟才能完成,差异为 25。对于新管道,相应的数字是 38 和 29。

旧管道运行时间:均值= 41,方差= 38
新管道运行时间:均值= 38,方差= 29

现在,新管道的平均运行时间短了三分钟是因为它确实更高效,还是这些平均值只是偶然不同?找出答案的一个方法是多次重新记录两个管道的运行时间……但是这将花费更多的时间,不值得。进入假设检验!

在这一点上,你可以制定你的假设。通常,它应该与你实际想要证明的相反,你很快就会明白为什么。在我们的例子中,假设两条管道的平均运行时间实际上是相同的,甚至旧管道更快。这被称为无效假设,我们将试图拒绝这种假设。然后,还有另一个假设,包含了所有不包含在零中的东西,这里是:新管道更快。

通常,零假设被定义为与我们实际想要证明的相反。

零假设通常表示为 H₀,另一个假设表示为 H₁.所以,我们有这个:

H₀:旧运行时≤新运行时
H₁:旧运行时>新 _ 运行时

很好。现在,它们为什么是这个顺序?为什么不在零假设下假设新管道更快?这是因为零假设应该反映我们的默认行为,即:没有任何数据或测试我们会做什么。

在没有任何数据证明新管道更快的情况下,你不会冒着浪费时间和资源的风险在整个公司实施它,是吗?你的默认动作不要将切换到新的管道,除非数据让我们相信它确实更快,我们应该拒绝零假设

零假设反映了我们的默认行为:在没有任何数据或测试的情况下我们会做什么。

我们说过,我们只能拒绝一个假设,而不能接受它。我们有我们的零假设,即新管道实际上是而不是更快,这反映了我们没有切换到新管道的默认行为。接下来,我们将基于数据尝试拒绝它。如果我们能做到这一点,我们去新的管道。如果不行,我们就用旧的。

现在你可以明白为什么假设检验可以防止我们做出愚蠢的决定了。另一个假设可能是一个愚蠢的决定。如果不能更快,切换到新管道将是对时间和资源的愚蠢浪费。假设检验阻止我们这样做,除非数据证明新的管道更快,切换实际上并不愚蠢。

另一个假设反映了一个潜在的愚蠢决定。假设检验阻止我们去做,除非数据证明不是这样。

如果新的管道确实更快,但数据并不能很好地证明这一点,而我们错误地继续使用旧系统,那该怎么办?嗯……这就是我们在这里冒的风险。稍后详细介绍。

数据让你的零假设看起来很蠢吗?

好的,那么我们如何决定是否拒绝零假设呢?我们这样做是基于一种叫做测试统计的东西。它是根据某个公式计算出来的一个数字,具体到我们正在进行的测试。一般来说,一个数字要被认为是一个检验统计量,必须满足两个条件:

  • 它必须可以从我们收集的数据中计算出来。
  • 如果零假设为真,我们需要知道它的分布。

第一部分很简单,我们有两条管道的运行时间,我们可以编造这些数字来得到我们的测试统计数据。第二部分可能需要一些阐述。它说的是,假设零假设是真的,那么假设新管道不是更快,我们知道我们的测试统计有一个特定的分布。我们是怎么知道的?因为已经被证明了。数学上。这就是一些统计学家的谋生之道。

在我们的例子中,我们比较两组的平均值(旧管道和新管道的运行时间)。已经证明,如果真正的平均值相等,并且我们通过偶然性和随机性观察到差异,那么下面的检验统计量具有 t 分布。

t 统计公式,截屏来自维基百科。

顶部带破折号的 X s 表示两组的平均值, s 表示方差, n 表示测量次数,假设两组测量次数相同。回想一下,我们已经测量了每个管道 50 个运行时,所以 n=50 。这里没有魔术,一些基本的计算,我们得到我们的测试统计: t=2.887。

现在,我们知道这个检验统计量在零假设下的分布是一个具有 (2n)-2* 自由度的 t 分布——这是学术界的统计学家已经证明的。让我们把这个分布和我们得到的数字进行比较。

98 df 的 t 分布与观察到的测试统计值。图片由作者提供。

我们在这里看到了什么?蓝色密度表示假设空值为真,测试统计值取特定值的概率。不出所料,如果平均值相同,它们之间最有可能的差异是零,而相差五几乎是不可能的。

根据我们的数据计算的 t 统计量等于 2.887。这是什么意思?如果空值为真,那么得到这个值是非常不可能的。所以这两个中的一个刚刚发生了:要么得到 2.887 的极小概率自己实现了,要么零假设是假的。

如果新管道不比旧管道快,那么我们得到的 t-统计量将是极不可能的。所以,最有可能的是,零假设是错误的。

考虑到我们得到的这个 2.887,零假设开始看起来很愚蠢。得到 2.887 并且空值仍然为真的几率极小。你可能会问,有多小。量化答案的数字称为 p 值。假设零假设为真,p 值是获得 2.887 或更大数值的概率。换句话说,p 值就是蓝色物质与红色虚线右侧的比例。

p 值是位于红色虚线右侧的蓝色物质的比例。如果零假设为真,这是我们得到 t-统计的概率(或者更极端的概率)。

在这种情况下,p 值等于 0.00479,或 0.479%,表明零假设很可能是错误的。因此,我们拒绝它:我们宣布新的管道更快,我们高兴地切换到它!

我们能有多确定?

我们在这里所冒的风险是,空值实际上是真的,并且发生概率大约为 0.5%(即 200 次中有 1 次)的极不可能的事件已经发生。如果是这种情况,我们已经错误地拒绝了一个好的零假设或切换到一个新的更快的管道,这被称为假阳性类型 1 错误。

这是我们必须接受的事实——犯这种错误的可能性只有 0.5%。如果我们一丝不苟,我们会在计算任何东西之前选择一个显著性水平。显著性水平是我们可以容忍的犯第一类错误的概率。特定值将取决于业务环境,例如,犯错误的成本。但是一般来说,我们可以说,错误拒绝零的概率不大于 1%。由于我们的 p 值小于这个值,我们可以安全地拒绝空值。

如果 p 值小于我们的显著性水平(可接受的风险水平),我们拒绝零假设。

但是想象一下,切换到新的管道需要关闭公司的所有系统一段时间。这是一笔巨大的成本,只有新管道确实更快,我们才能接受。在这种情况下,你的重要性水平可以是,比方说,0.1%,这意味着你只接受 1/1000 的机会切换到一个没有更快的管道。在这种情况下,p 值大于显著性水平,所以不要切换!数据中没有足够的信息让你证明新管道更快。

为什么不能接受 null?

所以,我们可以拒绝或不拒绝空值,这取决于我们的风险承受能力。如果我们拒绝零,我们说它是假的。如果我们不这样做,我们会说数据中没有足够的信息来拒绝它。但是为什么我们谈论拒绝,我们不能我们接受null 并且说新管道不是更快吗?

想想这个故事。在冰岛的时候,我非常想在野外遇见一只驯鹿。尽管我去过一些高地徒步旅行,但我还没有发现一个。这是否证明冰岛没有驯鹿?

如果我的无效假设是没有,我可以通过发现一只驯鹿来否定它。但是我怎么能接受呢?我可以说:发现驯鹿的几率很小。如果我待久一点,我最终会看到一个。

回到我们的数据。看一下这个情节。

蓝色:如果零假设成立,t 统计量的分布。格林:如果另一个假设成立。图片由作者提供。

如果零假设为真,蓝色密度也是 t 统计量的密度。但是如果它不是真的,那么 t 统计量可以有任何其他的分布。假设它有绿色的(现实中我们不知道),想象我们已经从数据中计算出我们的 t 统计量为 0.5

在零假设下,我们得到的 t 统计量是很可能的,所以我们不会拒绝它。但是在绿色分布下,这种可能性很大!因为我们不知道绿色,我们无法知道它是否更有可能在它下面。

当 t-统计量在空值下不太可能出现时,我们拒绝将空值作为假值。但是如果它非常有可能,在其他分布下它仍然可能更有可能。因此,我们永远不能接受零——我们只能不拒绝。

去贝氏是值得的!

所有这些都是所谓的经典统计学。如果它没有引起你的共鸣,并且你觉得 p 值阈值和置信水平有些武断,那可能是你本质上是贝叶斯主义者!

感谢阅读!

如果你喜欢这篇文章,为什么不 订阅邮件更新 我的新文章呢?并且通过 成为媒介会员 ,可以支持我的写作,获得其他作者和我自己的所有故事的无限访问权限。

需要咨询?你可以问我任何事情,也可以在这里 为我预约 1:1

也可以试试 我的其他文章 中的一篇。不能选择?从这些中选择一个:

理想的数据科学家并不存在(招聘经理也知道这一点)

原文:https://towardsdatascience.com/the-ideal-data-scientist-doesnt-exist-and-hiring-managers-know-this-d507723a9804?source=collection_archive---------17-----------------------

办公时间

窥探招聘经理的心思

你不能读她的想法,是吗?(Unsplash 上 Dollar Gill 的照片)

你有没有盯着招聘启事,担心自己还没有技能?

你曾经希望进入招聘经理的思维吗?

你有没有申请过多份工作却没有任何回音的经历?

我有。我有。当然,我有。

我知道你至少回答了问题中的一个,如果不是全部三个的话。在我旅程的不同点,我也有同样的问题。当我觉得我已经学到了足够的数据科学知识,并建立了一个投资组合时,我开始在网上申请工作。很快,我意识到典型的策略是可怕的。

所以我稍微改变了策略。我会将我的简历定制为更少的职位,并从我的关系网中的某个人那里请求推荐。效果更好,但当我走进面试时,我不知道招聘经理在找什么。

我笨手笨脚,因为我没有信心。这种情况持续了一段时间,直到我幸运地获得了突破。进入这个领域和行业四年后,我意识到我一直是愚蠢的。是啊,是对的词。

在这篇文章中,我将清除你头脑中所有的神话和疑虑,当我们完成时,你将有一个明确的战略来攻击你的数据科学求职。相信我,一直读到最后。

以下是对招聘经理想法的一次窥探

这是几年前的一个真实故事。随着新的潜在项目的出现,需要雇佣一批数据科学家。很快,我们就开始概述工作描述,并在网上发布广告。

数据科学的负责人,也是招聘经理,接手了这件事。当我们看到最终确定的职位描述时,我们很困惑。我们是一群经验不足三年的数据科学家,但新的数据科学家必须有至少五年的经验。反正广告就是这么说的。

作为一名好奇的队员,我问他发生了什么事。他告诉我的事情让我吃惊:

“如果有人有 5 年的经验呢?你知道,有经验的人总是更好,我们可以向他们学习。如果我们只要求 3 英镑,他们绝不会申请。”

很聪明,但是有个问题。

我通知了一位正在寻找这个职位空缺机会的前同事。尽管提醒了他两次,我还是没有收到他的简历和申请。我以为他有其他的计划,就让它保持原样。

几个月后,当我见到他时,他仍然对机会敞开大门。我准备给他介绍一份他非常适合的工作,但他忽略了这一点,但他仍在寻找机会。这说不通。他为什么要这么做?

“伙计,我看了你分享的工作细节,我想他们在找一个资深的人。我还没到那一步。我仍然需要提高我的数据科学技能。我知道我不适合,所以申请没有意义。”

你知道这是什么意思吗?一方面,招聘经理为理想的候选人创造职位描述,尽管他们知道这些职位描述并不存在。另一方面,合适的候选人因为要求的技能不合理而犹豫申请。

作为数据科学的追求者,我们无法控制招聘经理做什么,但我们可以更好地解释工作要求。

这对您意味着什么:

大多数职位描述都是招聘经理的愿望清单,他们不想错过理想的候选人。句号。

他们知道理想的人几乎不存在,对于那些不完全符合他们要求的人,他们完全没有意见。

该行业的大多数专业人士都知道发生了什么,但有抱负的数据科学家却不知道这一点。 Sebastián Ramírez 需要在他 1.5 年前创建的图书馆中积累 4 年的经验。py caret 库的创建者 Moez Ali 也遇到了类似的情况。

作者截图(来源:推特 & LinkedIn )

那么这个问题的解决方法是什么呢?批量应用不会解决这个问题;这会让事情变得更糟。答案是一种叫做“60%规则”的东西,我们即将解读它。

在申请工作之前使用这个“60%规则”

我读过的关于在数据科学领域建立职业生涯的最好的书之一是 Emily Robinson 和 Jacqueline Nolis 写的。在所有有价值的信息中,有一个想法脱颖而出,与我的策略产生了共鸣。

这是 60%规则。

“如果你达到了工作要求的 60%以上,你就已经为这份工作做好了准备。别再想了,去申请吧。”

在这个行业工作了将近 4 年,我可以保证这是真的。一旦你进入这个行业,你会直觉地理解这是可行的,但是请相信我们,暂时使用这个规则。

这对您意味着什么:

每当你看到一份工作描述时,要对自己诚实。

问自己一些这样的问题:

  • 如果这个职位需要 3 年的工作经验,问我是否有至少 2 年的工作经验?
  • 如果他们要求你了解 R、Python 和 Scala,我至少了解其中的两种吗?
  • Scikit-learn、Tensorflow 和 PyTorch。我对三分之二中的任何一个满意吗?
  • 你明白了。一言以蔽之,如果他们列出了 10 项要求,我是否至少满足了其中的 6 项?

要诚实,不要想太多。

正确的应用会给你必要的自信,这对于面对接下来的面试是至关重要的。现在,你已经理解了招聘经理的心态。你也知道选择你要申请的工作。接下来你会做什么?

如何确保自己非常适合

推荐帮助你最大化机会。但说实话,这并不总是可能的。在这种情况下,你应该试着定制你的简历以适应你申请的工作。

下面是如何做到这一点:

  • 你可以从工作描述中列出的技能开始,选择你擅长的技能。
  • 确保在你的简历中使用这些关键词。如果招聘人员通过自动申请跟踪系统(ATS)手动扫描或运行你的简历,你肯定会非常适合。
  • 求职者最常犯的错误是增加他们不熟悉的技能。不要成为他们。当测试这些技能时,他们最终会在面试中笨手笨脚。你不需要知道所有的事情,但是你应该知道你简历上的所有事情。

我知道这个建议听起来很简单,但你不会相信很少有人遵循它。暂停一秒钟,试着回忆一下你最后一次为一个工作角色定制简历的时间。你可能会用同一个简历申请多份工作——我也是。

闯入数据科学的艺术在于少申请,确保你脱颖而出。

您可操作的外卖

打入数据科学领域很难。招聘经理不切实际的期望让情况变得更糟。我们要么继续大量申请,但没有任何回应,要么干脆不申请。

我们对该行业的运作方式无能为力,但以下是我们能做的最大化机会的回顾:

  • 让我们停止批量申请工作。这绝不会有任何好处。
  • 请花时间阅读职位描述。
  • 要明白这些职位描述仅仅是招聘经理的愿望清单。
  • 不要被职位名称所欺骗,而是要深入了解所需的技能。
  • 看看你是否符合最低 60%的技能要求。什么事?你有机会做这份工作,否则就去做下一份。
  • 根据你申请的职位定制你的简历。使用准确的关键字。
  • 面试高手。你能行的!

我使用了这个策略,并开始得到更多的回应,并最终得到了公司的邀请。我很乐观这对你有用。你没什么可失去的,但会有很多收获。

试一试?

想了解更多关于数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表

图示的 loc 和 iloc 事件

原文:https://towardsdatascience.com/the-illustrated-loc-and-iloc-affair-75b3f378aaf0?source=collection_archive---------26-----------------------

熊猫基于索引的数据选择可视化指南

在这个高效咀嚼和处理数据的时代, 熊猫 库已经成为每个数据科学家的面包和黄油。该库具有过多的数据操作能力,其中,我们在这里的重点在于系列数据框架对象中的基于索引的数据选择。虽然这个主题在过去已经得到了一些实际的关注,但是这里特别强调两个著名索引器存在背后的动机

图片由作者提供,使用制作。

首先,让我们看一下下图,其中我们构造了两个名为 s_imps_exp 的系列 对象。后缀 _imp_exp 表示隐式和显式索引。

阐释了隐式和显式索引的 series 对象 s_imp 和 s_exp。请注意,当显示 s_imp(左)时,Jupyter notebook 输出隐式默认索引[0,1,2,3],而在 s_exp(右)的情况下,Jupyter notebook 仅输出显式索引[4,5,6,7]和数据['a ',' b ',' c ',' d']作为输出。虚线椭圆所包围的隐式(默认)基于整数的索引只是为了清楚起见。图片由作者提供,使用制作。

如上所示,默认情况下,两个 series 对象都包含一个隐式生成的基于整数的索引,从 0 开始。在 s_imp 的情况下,默认隐式索引是其唯一的索引,而在 s_exp 的情况下,它最终有两个,即从 0 开始的隐式默认基于整数的索引和从 4 开始的显式用户定义索引。起初,这似乎是好的;但是,在执行基于索引的数据选择时,这可能会导致不必要的混乱。例如,让我们考虑先前定义的系列对象 s_exp 并执行一些操作,如索引切片,见下文

演示了使用显式索引的 series 对象 s_exp 的索引和切片操作(左),以及混淆的情况(右)。注意,由虚线椭圆包围的隐式缺省的基于整数的索引仅仅是为了清楚起见。图片由作者提供,使用图表制作。

如上图所示, s_exp 使用显式用户定义索引[4,5,6,7]进行索引,使用隐式默认索引[0,1,2,3]进行切片。尽管这些隐式-显式索引选择是在幕后进行的,但记住特定于操作的索引可能会令人困惑。因此,这就是为什么熊猫提供两个独立的索引器的特殊原因🎉 lociloc — 一个用于使用显式用户定义索引( loc ),另一个用于使用隐式默认索引( iloc )。这非常方便,因为拥有独立索引器的主要目的是帮助避免不必要的混乱,见下文

说明了使用 loc 和 iloc 索引器的索引和切片操作。仔细观察术语 iloc,“I”可能意味着隐式或基于整数。类似地,术语“loc”也可以被认为是“locator”的残词。这里我们选择“iloc”作为隐式索引器来调用。请注意,右下角单元格中的隐式默认基于整数的索引只是为了清晰起见而举例说明的。图片由作者提供,使用图表制作。

此外,仔细观察上面的切片操作,您可以观察到 loc 步进器包括最后一个步进 5,而 iloc 步进器符合标准切片规则,即不包括最后一个步进 2。这非常方便,因为显式索引也可以是 string 类型,而隐式索引默认从 0 开始基于整数。请参见下图,其中使用基于字符串的索引序列执行切片操作

说明了使用 loc 和 iloc 索引器(定位器)对具有显式定义的基于字符串的索引(标签)的序列进行切片操作。注意使用 loc 的切片操作。loc 包括标签“三”,而使用 iloc 索引器的切片操作忽略相应的基于整数的索引 2。虚线椭圆所包围的隐式默认基于整数的索引只是为了清楚起见。图片由作者提供,使用制作。

到目前为止,上面的插图只集中在系列的物体上。但是, DataFrame 对象中的隐式-显式索引呢?还有, lociloc 索引器如何适用于数据帧?

从技术上来说,一个简单的二维数据帧对象是一组系列对象的集合,其中每个系列都被赋予一个名称标签,也就是标签,并且,比方说,出于视觉目的,它们被放置在彼此旁边。结果,我们得到了一个包含行和列的二维数据结构,其中每行有一个索引,每列有一个标签。然而,为了一致性,让我们坚持使用列索引而不是列标签。现在,当一个数据帧对象建立在一个系列对象上时,在前面的插图中展示的隐式和显式索引的存在也可以在数据帧中观察到。事实上,在显式索引的数据帧中,数据帧对象包括两对索引,即隐式-显式行索引对和隐式-显式列索引对。例如,请参见下面两个插图,它们展示了隐式索引数据帧和显式索引数据帧之间的差异。第一个图示展示了具有默认的基于整数的行和列索引的隐式索引数据帧,而第二个展示包括由隐式-显式索引对组成的显式索引数据帧,即隐式默认的基于整数的索引和显式用户定义的索引。

详细说明了隐式索引的数据帧。图片由作者提供,使用制作。

说明了一个显式索引(带标签)的数据帧,其中显式行和列索引是字符串类型的,隐式默认行和列索引是基于整数的。请注意,虚线椭圆所包围的隐式行和列索引只是为了清晰起见而展示的。图片由作者提供,使用图表制作。

通常,当使用显式定义的基于字符串的行和列索引时,如上所示,术语索引经常与标签互换。因此,产生了类似于行-列-标签的术语来代替行-列-索引。此外,将数据帧对象的构造函数中的关键字参数 index 和 columns 重命名为 row_indexcolumn_index 有助于命名的一致性。然而,让我们不要在这里进入命名约定,因为这纯粹是一个品味问题,可能是一个故事本身😉

因此,继续深入,数据帧在许多方面类似于二维结构化数组。因此,为了执行传统的类似数组的索引,上述隐式索引方案起着至关重要的作用。使用 iloc 步进器,可以执行如下所示的阵列式步进

示例说明了使用 iloc 索引器对显式索引的数据帧 df_exp 进行类似数组的索引和切片操作。同样的类似数组的索引也适用于隐式索引的数据帧 df_imp。请注意,虚线椭圆所包围的隐式行和列索引只是为了清晰起见而展示的。图片由作者提供,使用制作。

当然,上述索引和切片操作也可以使用 loc 索引器来执行,其中它利用显式行和列索引(标签),例如 df_exp.loc['r1 ',' c2'] ,而不是默认的基于整数的索引。此处不提供图示,因为它被省略作为读者的练习😜然而,出于好奇, pandas 确实提供了一个叫做 ix 的混合索引器,它能够同时利用隐式和显式索引。然而,自 2018 年以来,这种新的索引器已被弃用,因为它有可能导致不必要的混乱,而这正是 lociloc 首先想要避免的😄

所以,这让我们结束了 lociloc 事件。希望上面的插图已经清楚地展示了系列数据帧对象中隐式和显式索引之间的区别,更重要的是,帮助您理解拥有两个独立的索引器,显式( loc 和隐式( iloc )背后的真正动机。谢谢你🙏

基于云的数据仓库的影响

原文:https://towardsdatascience.com/the-impact-of-cloud-based-data-warehousing-eff1cadcf6f2?source=collection_archive---------24-----------------------

基于云的数据仓库极大地影响了数据科学和分析。这是一件坏事吗?

迈克尔&黛安·魏德在 Unsplash 上拍照

云中的数据科学和分析是大数据的现代范式。由于存储和处理地球上不断增长的数据量的成本和要求,数据科学和分析的云存储和处理应运而生。在这种情况下,云的弹性、成本效益、安全性和物理位置是最基本的因素。由于越来越普遍地从传统的内部数据仓库转移到基于云的现代替代方案,数据科学和分析的实施方式发生了巨大变化。

随着地球上数据量的不断增长,对可扩展存储和处理的需求应运而生。维护这一架构的成本来自与运行这一重要架构相关的庞大数量、处理能力、安全性和人力资源。对于努力通过传统方式控制数据的企业来说,将这种财务责任转移给这些服务的专业提供商可能是一个有吸引力的选择。这种情况,或者类似的情况,导致了云的兴起!云的常见定义是异地软件和存储即服务(SaaS)或硬件,通常通过 TCP/IP 经由互联网访问。

Inmon 将数据仓库描述为“主要用于组织决策的面向主题的、集成的、时变的、非易失的数据集合”。简而言之,它是在企业生命周期中纵向收集的业务数据的中央存储库,对这些数据的分析可以为未来的业务决策提供信息,或者衡量以前决策的影响。

随着业务的发展,数据仓库的规模和复杂性也在不断增长。这种增长意味着有效运行数据仓库所需的系统资源会随着时间的推移而增加。对数据仓库的要求是存储、处理、记忆和输入输出能力。这些需求被分为两个更高层次的类别:软件需求、安全需求和硬件需求。

一个成功的数据仓库在软件方面需要一个存储引擎和一个规则和处理引擎。存储引擎提供了原始数据本身的接口。传统上,这是关系数据库管理系统的工作。然而,有一个微小的转变,那就是使用面向对象的数据库或者像文档 stores⁴.这样的半结构化的替代品数据仓库的规则引擎部分负责处理数据的转换。规则引擎通常为日常任务提供设计模板,当与 DataVault 2.0 等现代仓储实践相结合时,可以实现高度自动化、元数据驱动的 ETL process⁵.

数据仓库的安全需求可能很复杂,这取决于给定业务的市场细分和法律含义。不过,它们可以简化为安全模型的总体概念。安全模型需要足够复杂,以允许对所有业务分支进行适当级别的访问,而不停止日常任务所需的访问。数据仓库的这一部分通常是 complicated⁶.由于不同的软件提供访问的方式在不同的存储引擎之间不断变化,数据仓库的这一部分必须从一开始就考虑到 end⁷.从逻辑模型生成物理模型通常是设计过程中受安全模型影响最大的一点。它通常高度依赖于软件。

数据仓库的硬件需求同样高度依赖于业务;然而,所有公司的共同主题是,这一要求将改变 time⁸.的事实从长期来看,随着更多数据的添加,这种需求通常会上升,从而增加处理和存储需求。从更敏锐的角度来看,ETL 过程在运行时消耗大量的处理和存储,但是当它们空闲时,这种需求就会减少。这意味着数据仓库受益于硬件性能和容量的弹性扩展。

术语云通常用于描述运行大规模仓库规模数据中心的公司的产品。这些公司通过出售服务器群的一部分(个人 businesses⁸.)来提供存储、处理能力和安全性通过有效地整理多个企业对此基础设施的需求,他们获得了经济优势。在处理基于云的系统时,硬件需求被排除在外,因为云服务提供商处理这些决策和复杂性。除此之外,像管理安全团队和架构/运营团队这样的开销也减少了,因为企业自己可以有效地将其中的大部分分包给云提供商;他们实际上是租用硬件,由提供商负责故障转移和正常运行时间的担保。基于云的服务提供商支持越来越多的数据库和数据处理服务。当数据仓库托管在云中时,这些需求都有利弊。当数据仓库托管在 cloud⁹.时,数据进入和退出提取、转换和加载(ETL)过程的方式有很大的不同

弹性是指系统资源能够独立、无缝地扩展,而不会影响数据可用性或性能。云计算的这一特点使其成为数据仓库和分析/数据科学工作负载的主要候选对象。弹性处理和内存扩展的能力允许应用在短时间内利用增加的资源来克服短暂但密集的工作负载,而企业不必一直运行大量的硬件。磁盘空间的弹性伸缩意味着公司可以临时为非持久性暂存区域租用磁盘空间,并在 ETL 过程结束时释放它们,而无需直接购买硬件。弹性扩展不仅降低了购买该硬件的初始成本,还降低了企业为保持这些驱动器始终在线而使用的电力成本。

将存储和处理转移到异地会给业务带来新的问题。这些问题包括更改数据治理计划以允许数据存储在异地,通过互联网而不是本地服务器访问数据的延迟,以及员工对流程变更和所需培训的抵制。分析和数据科学直接或间接地受到这些利弊的影响。如上所述,在治理计划和访问方面存在直接影响。与围绕在数据处理和存储中采用云的其他问题相比,云支持最好的数据科学堆栈中的最好的。关于基于云的数据仓库在分析和数据科学方面的优势的文献将是本文献综述的主要焦点。

托管在云中的数据仓库通常可以非常快速地直接接入互联网。当加载已经在互联网上托管的数据集时,这允许非常高的吞吐量。然而,这也可能损害 LAN 到 WAN 速度较慢的企业,在通过互联网从公司的本地存储加载大型数据集并将其加载到云托管的数据仓库时会出现问题。LAN 到 WAN 的速度问题在云数据仓库的初始设置或迁移过程中最为突出。这通常被称为批量迁移或批量加载阶段。一旦数据仓库在云中运行,企业就广泛地将更少量的数据动态地推上来。这部分标准业务受局域网到广域网速度问题的影响要小得多。

Talend 认为,从根本上来说,以下是企业希望将其数据仓库和分析/数据科学堆栈迁移到云的原因。企业的总成本降低了,因为他们不需要立即购买所需的硬件,也不需要一直租用最大数量的处理能力。云计算解决方案提供的灵活性使公司能够节省这笔资金,但允许资源的弹性扩展以匹配工作负载,并要求企业仅在使用增加的电力时支付他们所需的费用。这种无缝扩展和降低总体成本的能力使企业能够利用比以同等预算购买本地硬件更高的性能水平。这种整体处理能力的提高使企业在整体经济的特定领域中具有更高的成本效益和竞争优势。构建新数据集市和登台区的便利性允许高级开发和测试实践,这又通过自动化和封装为业务提供了更快的开发迭代,最终又增加了他们在市场上的优势。将数据托管在云中可以改善对数据的访问。这使得公司更容易消费和分析他们的数据。云提供商有庞大的专门团队来处理安全问题,这意味着企业可以更容易地访问他们的数据。这也比他们试图将数据接入公共互联网并要求他们的内部安全团队更便宜。

基于云的数据仓库是数据科学和分析向云迁移的重要推动因素。将数据科学/分析堆栈与数据仓库处理管道和存储一起放在云中是一个自然的选择。目前云数据仓库领域的领导者是 Snowflake。雪花提供真实的云数据仓库体验,提供弹性计算能力和存储。除此之外,雪花还集成了数据科学和分析工具,直接托管在其数据仓库产品中。这是云数据仓库如何影响数据科学和现代分析的一个例子。

如前所述,在云中托管分析和数据仓库可以快速、直接地访问通过数据科学实践获得的报告和知识。从任何地方(包括公司自己的网络之外)访问这些调查结果的能力带来了竞争优势。除了访问总结的结果之外,云中数据仓库的托管和包含的数据集市支持对来自世界任何地方的原始底层数据进行快速和无缝的深度分析。

基于云的数据仓库对数据科学和分析产生了深远的影响。在云中托管虚拟数据仓库以及现代分析堆栈的能力是近年来数据科学最重大的范式转变之一。正如包括 Talend 和 Gartner 在内的公司所解释的那样;Smoot,Ren,Lindstedt 和 Zulkernine 等研究人员证实,以下因素是基于云的数据仓库如何影响分析和数据科学的。这些因素是易用性、弹性扩展、增强的安全性、物理位置和降低的总成本。新兴的数据科学和分析堆栈通常是为支持云硬件上的弹性扩展和部署而全新设计的,以便在物理上接近并集成云数据仓库的发展趋势及其提供的优势。

  1. [Zulkernine 等人,2013 年] Zulkernine,f .,Martin,p .,Zou,y .,Bauer,m .,gwadry sridhar,f .,Aboulnaga,A. (2013 年)。面向基于云的分析即服务(claaas ),用于云中的大数据分析。第 62-69 页。
  2. [詹等,2013]詹,张,李,孙,王,李,贾,罗,陈(2013)。高容量计算:识别和描述数据中心面向吞吐量的工作负载。
  3. [英蒙,1992]英蒙,W. H. (1992)。建立数据仓库。美国约翰威利父子公司。
  4. [Linstedt 和 olschmke,2015 年] Linstedt 博士和 olschmke 博士(2015 年)。使用 Data Vault 2.0 构建可扩展的数据仓库。摩根考夫曼出版公司,美国加利福尼亚州旧金山,第一版。
  5. 林斯特德和格拉齐亚诺,2011 年。超级充电您的数据仓库:无价的数据建模规则,以实现您的数据仓库。创建一个独立空间酒吧。
  6. [卡尔库达等人,2018 年]卡尔库达,k .,纳布利,a .,加尔古里,F.(2018 年)。云数据仓库中的隐私和可用性。美国纽约。计算机协会。
  7. [Moghadam 等人,2017 年] Moghadam,s .,Darmont,j .,和 Gavin,G. (2017 年)。S4:在云数据仓库中实施隐私保护的新安全方案。
  8. [Cheng 等人,2018] Cheng,y .,Chai,z .,Anwar,A. (2018)。表征协同定位的数据中心工作负载:阿里巴巴案例研究。
  9. [潘,2020] (2020)。云数据仓库与传统数据仓库概念。

新冠肺炎对美国食品配送服务的影响

原文:https://towardsdatascience.com/the-impact-of-covid-19-on-food-delivery-services-in-the-u-s-47eae04655c8?source=collection_archive---------16-----------------------

使用谷歌移动和趋势数据来确定行业的结构变化

叶夫根尼·阿列克山大罗夫、洪金和瑞恩·杨

就在一年前,食品配送服务还在财政上苦苦挣扎。但是随着 2020 年的进展(大部分经济都在倒退),这些公司看到了急需的增长

随着家庭订单的实施和全国各地不同程度的现场用餐关闭,去年春天出现了一次食品配送需求冲击。而且随着疫情的存续,对这些服务的依赖也在不断增加。

来自饥饿的杜克 MQM 学生的两个单独的订单,他们像许多在疫情的学生一样,负责任地放弃了室内用餐。请注意,六人小组将订单放在左边,三人小组放在右边。(可以理解的是,PII 被移除是为了防止食欲不振。)图片作者。

我们的使命

我们希望提供一份对食品配送服务、准备进入这一市场的新公司、投资者以及任何关心疫情对消费者行为的最终影响的人有用的分析。

我们想弄清楚对美国食品配送公司的需求是如何受到疫情的影响,以及人们在全国各地的不同行为方式所导致的结果。

大家心中的疑问(继“疫情何时会平息?”)就是后 Covid 世界的生活会是什么样子。因此,我们的最终目标是确定食品配送行业在 2020 年的发展是否是消费者行为真正转变的开始。

我们的数据

我们选择了以下品牌,这些品牌为我们提供了两种食品配送公司的良好样本:

餐馆:Door Dash,Uber Eats,Grubhub,Postmates,Seamless,Chownow

杂货:Instacart,亚马逊生鲜,Shipt,生鲜直购

在一个完美的世界里,我们应该有可访问的性能数据,如每周收入、订单或应用程序活动,但正如我们在 2020 年所了解的那样,这绝不是一个完美的世界。所以我们决定发挥创意。

趋势数据

我们收集了 Google Trends 数据来衡量每个州对某家公司的兴趣。Trends 记录了一段时间以来谷歌搜索词的流行程度。尽管并不完美,但我们相信这是一家公司受欢迎程度的恰当代表。当人们有兴趣使用服务时,他们通常会搜索公司名称。

为了确定趋势数据是否可以额外用作公司业绩的可接受代理,我们检查了它与公司调整后股价的相关性。

整个 2020 年唯一公开交易的食品配送公司是 Grubhub,其趋势和股价数据不相关。然而,我们认为 Grubhub 是一个不同寻常的案例,因为与 2019 年相比,2020 年的需求确实飙升,但运营成本的上升速度更快。近年来,随着这些其他服务进入美国市场,Grubhub 在美国的市场份额也在不断下降。我们的趋势数据显示了这两个因素的某种混合(在疫情开始时有显著增加,但与其他交付服务不同,相对较快地下降到疫情之前的水平)。

尽管如此,我们发现许多食品和零售公司的趋势数据与其调整后的股价相关。例如:星巴克和沃尔玛(相关系数分别为 0.483 和 0.514)。

比较星巴克和沃尔玛的相对兴趣和调整后股价(标准化值)的时间序列图。

因此,看起来趋势数据可能是公司业绩的一个不错的代理,但它在对应受欢迎程度和需求方面更可靠。为了进一步证明谷歌趋势数据的信号力量,向下滚动到之前的一篇博文的“使用谷歌数据作为信号”部分。

我们设置了一个脚本来提取每个州每个公司的每周趋势值,日期可追溯到 2019 年初,另一个单独的集合仅可追溯到 2020 年 2 月中旬。我们将这些值称为“相对兴趣”,因为它们给出了兴趣值(从 0 到 100 ),其中 100 是在给定的时间段和地点内公司被搜索次数最多的一周。因此,我们在给定位置为一家公司准备的每个数据表恰好有一周的最大受欢迎度为 100。因此,我们无法比较各州之间的绝对兴趣(或搜索次数)。(例如,我们不能用我们的数据来判断 Uber Eats 在纽约还是在北卡罗来纳州更受欢迎。)

使用这些数据作为表现信号的最大问题是,有时谷歌用户搜索术语只是为了了解该公司或涉及该公司的新闻。因此,兴趣的变化通常可以归因于搜索词的“新闻价值”。我们在数据中寻找无法解释的异常,以及每家公司在 2020 年的新闻事件。我们决定,我们需要针对 12 月 6 日那周 DoorDash 的 IPO 公告以及导致 6 月 29 日和 7 月 5 日那周宣布 Postmates 被优步收购的传言进行调整。我们通过用前后几周的平均值替换这些值来进行调整。

虽然相对兴趣将是我们的因变量,但我们希望我们的输入能够说明 Covid 的严重性以及由此产生的行为变化。

移动数据

为了跟踪活动的变化,我们使用了谷歌的社区移动报告,谷歌在疫情期间公开了该报告。这个数据集通过访问不同类别的地方来测量运动的变化。这些数据是从打开了设备“位置历史记录”的用户那里收集的。谷歌拥有来自世界各地的数据,但我们将使用美国的数据,其中包括国家、州和县一级的数据。

每天的数值是通过计算“与基线相比,不同地方的访问次数和停留时间的变化”得出的基线计算为 2020 年前五周(1 月 3 日至 2 月 6 日)期间一周中每个相应日期的中值,当时新冠肺炎尚未影响美国的行为

我们将重点关注以下两类移动性(从 2020 年 2 月 16 日至 2021 年 1 月 2 日):

杂货店&药房(杂货店、食品仓库、药店等场所)

零售&娱乐(餐馆、购物中心、电影院等场所)

我们还使用了 CDC 的数据集来收集关于 Covid 病例和死亡的信息。我们汇总了数据,所以我们的值是每周一次。

为了便于分析,我们还重点关注了代表该国不同样本的 11 个州(从地理和人口统计角度):

阿拉巴马州、加利福尼亚州、佛罗里达州、佐治亚州、爱荷华州、马萨诸塞州、北卡罗来纳州、纽约州、德克萨斯州、犹他州、威斯康星州

探索性数据分析

在查看流动性数据时,很明显,随着疫情带来的法规和健康风险,餐馆、商店和娱乐场所的访问量减少了。以下是对 2020 年第二季度和第三季度的看法:

似乎限制越严格或城市人口越多的州去这些地方的次数越少。我们都不熟悉蒙大拿和怀俄明,但是似乎一些更冷的州的居民在冬天冬眠。天气可能是这些地区夏季流动性异常增加的一个因素。(第四季度的地图看起来与第二季度的地图几乎相同。)

杂货店的流动性更是一个复杂的问题。这是因为杂货店被认为是必不可少的,因此在全国范围内仍然开放,即使在家订货也是如此。因此,随着餐馆关门,杂货店之旅就像度假一样,这类场所的流动性更加多样化:

一般来说,对于两种类型的移动性,最大移动性和最小移动性状态保持不变。

这是美国每周的交通状况。

如果你需要更多的证据来证明美国人庆祝 7 月 4 日。

从最初的“Covid 休克”中,你可以看到活动的急剧下降,并且在下降中的反应与病例的增加不成比例。当我们直接将 Covid 案例与迁移率数据进行比较时,“疫情疲劳”也很明显:

下面是各州流动性随时间的变化情况:

在这两种情况下,每个状态的迁移率数据遵循相似的模式。

最后,让我们看看谷歌趋势数据。以下是 2020 年各公司的相对兴趣,从 2 月的第三周开始:

三月中旬美国疫情的爆发给所有军种带来的冲击是显而易见的。我们将继续称之为“柯维德冲击”与餐馆外卖服务相比,它对 Instacart 的跨州影响要明显得多,比如 Uber Eats:

最后,当我们比较我们的趋势数据和我们的移动数据时,我们可以看到某种程度上的反向关系。(随着杂货/零售流动性降低,对送货公司的相对兴趣增加。)

将美国和纽约的流动性与趋势数据进行比较。

我们假设随着时间的推移,这种关系可能适用于所有州和公司,但我们将进一步探讨这一点。

建模

在初步探索了数据之后,我们现在将调查在 3 月和 4 月疫情形成前后兴趣水平的结构变化的存在。此外,我们将探讨流动性和利息变量之间是否存在因果关系。接下来,我们将确定流动性对利息的影响,控制 Covid 案例的数量。总之,我们提出了一个基于多元时间序列的向量自回归模型,目标是预测某公司未来的相对兴趣。这种预测对各种利益相关者都很有价值,比如投资者、雇员和记者等等。

T 检验

我们使用 2019 年初开始的移动数据版本。这将为我们提供更多的 Covid 冲击之前的数据,为了这个模型的目的,我们将它标记为 3 月和 4 月。我们观察了美国疫情发病前后的差异

DoorDash、UberEats 和 Instacart 在 Covid 冲击前后的国家相对利益有显著差异,但 Fresh Direct 没有。

在 Covid 冲击之后,一些趋势值恢复到 Covid 冲击之前的水平,但是一些趋势值仍然比以前高。为了查看两个时期之间是否有显著差异,我们决定进行 t 检验。10 个品牌中,有 8 个(DoorDash、Uber Eats、Grubhub、Postmates、Instacart、Chownow、Amazon Fresh、Shipt)表现出了统计上的显著差异,而 Seamless 和 FreshDirect 则没有。根据我们的发现,我们能够看到人们对送货服务的整体兴趣仍然高于冲击前。

在这一点上,我们希望进一步调查这种更高的兴趣是否只是由于移动性本身或人们的行为变化。

当我们深入到州一级时,我们能够看到这种趋势在相对城市化的州(纽约、马萨诸塞州、佛罗里达州)变得更强,特别是与更多农村州(公共卫生法规较少)如阿拉巴马州、爱荷华州和犹他州相比。

因果矩阵

我们都知道现在著名的成语“相关并不意味着因果关系”。想一想所有虚假相关性的荒谬例子,比如在游泳池中淹死的人数和美国核电站的发电量,或者游乐场和美国授予的计算机科学博士学位产生的总收入。因此,虽然简单和可访问的相关性不是这里要分析的理想值,但是我们想要显示相关性的东西。输入格兰杰因果关系。根据格兰杰因果关系,如果一个系列 X“格兰杰原因”一个系列 Y,那么 X 的过去值应该包含有助于预测 YT5 的信息,而不仅仅是 Y 的过去值所包含的信息。这是检验两个变量之间因果关系的最好和最容易使用的计量经济学方法之一。

在这个图中,我们可以看到一个矩阵,用 p 值表示格兰杰因果关系检验的结果。当 p 值很小时,我们拒绝空值,我们可以说 X 变量格兰杰原因是 Y 变量。请注意,这不像相关数那样是对称的。该矩阵显示了兴趣和流动性的美国水平数据。我们可以看到,零售和娱乐移动系列往往会引起各种运输公司的相对兴趣。杂货店和药店的流动性没有这样的影响。

让我们进一步看看州级的因果矩阵。我们发现纽约、爱荷华和马萨诸塞州之间有一个有趣的对比。在纽约州的结果中,我们可以看到零售和娱乐移动性如何影响食品配送公司(DoorDash、Uber Eats 和 Grubhub)的利益与杂货店和药店移动性数据之间的明显区别(我们无法拒绝零因果关系)。
在爱荷华州,我们可以看到,杂货店和药店的移动性引起了人们对杂货配送公司(Instacart、Amazon Fresh 和 Shipt)的更多兴趣。对于马萨诸塞州,我们在食品配送公司、零售和娱乐流动性方面看到了相同的一般因果趋势。在一些州,例如北卡罗来纳州,对于六个公司和两种类型的移动性数据没有区别:两者分别引起六个公司的兴趣。

滚动贝塔系数

确定了因变量和自变量之间存在因果关系后,让我们研究流动性(任一类型)对我们正在研究的食品和杂货配送公司的相对利益的影响的大小和方向。

为此,我们将利用滚动线性回归模型,将自变量、相对利益、因变量、流动性和新冠肺炎案例作为控制变量。我们对这些情况进行了控制,以获得流动性对利息的纯粹影响,而不考虑疫情的影响。我们通过时间序列上的移动窗口递归提取迁移率的β系数。这创建了β系数的新时间序列。可以对这一时间序列进行分析,以确定流动如何影响兴趣的趋势和结构变化。

在 10 家选定的食品配送公司中,就美国而言,我们发现其中 7 家全年的趋势是积极的。这些公司是 Uber Eats、Grubhub、Postmates、Instacart、FreshDirect、Amazon Fresh 和 Shipt。对于其余的,有一个不重要的或消极的趋势。在 2020 年全年呈现积极趋势的七家公司中,年末流动性对利息的影响是积极的,并且显著高于年初观察到的影响。现实世界/商业对此的解释是,从整个美国的角度来看,新冠肺炎导致了个人行为的结构性变化,也就是说,随着我们走过 2020 年,流动性对大多数主流食品配送公司的兴趣产生了更强的积极影响。

贝塔系数的正趋势示例(Instacart,美国水平)

贝塔系数的负趋势示例(Chownow,美国水平)

在查看州一级的数据时,出现了一些有趣的结果。下表总结了调查结果。

我们可以看到,在加利福尼亚州和马萨诸塞州,流动性和兴趣之间的关系出现了最积极的变化。变化最不明显的州是佛罗里达州、犹他州和威斯康星州。我们还观察到,在佐治亚州和爱荷华州,流动性和兴趣之间的历史关系有许多负面趋势。定性解释可能来自各州不同的 COVID 相关法规、各州公司的业绩和成功,以及其他一些特殊原因。例如,马萨诸塞州和加利福尼亚州拥有全国最严格的法规,而爱荷华州的措施是最弱的,这可能是这些差异的原因之一。

预报

在确定了决定流动性和利息之间关系的结构性变化的因素之后,理解未来会发生什么是很重要的。为了有一个积极和前瞻性的视角,最重要的是构建一个预测模型,让投资者、记者和其他利益相关者对未来有一个经验上合理的预期。当我们处理多个时间序列时,就功效和可解释性而言,最适合我们需求的模型是向量自回归(VAR)模型。该模型可被视为在单变量时间序列预测中使用的著名 ARMA 模型的扩展。

为了实现 VAR 模型,我们必须首先满足一些假设。最初,我们在我们选择的变量中检查格兰杰因果关系。平均而言,这些变量必须互为因果。这一假设得到了满足,我们已经在前一小节中探讨过了。我们必须进一步研究协整检验,以确定多个时间序列之间是否存在统计意义上的显著联系。

然后,我们为测试集保留最后四天的观察,这将允许我们衡量使用来自训练集的数据创建的预测的质量。向量自回归所需的另一个假设是我们的序列的平稳性,这通过扩展的 Dickey-Fuller 检验来检验。结果表明需要对数据进行微分,即所有数据都变成 X(t) = X(t) — X(t-1)。在我们拟合我们的模型之前,需要的最后一步是确定包含在 VAR 模型中的自回归部分的滞后量。通过 Akaike 信息标准,我们确定滞后量为 3。然后,我们将模型拟合到我们的变量的美国级子样本,即‘door dash’,‘Uber eats’,‘Grubhub’,‘insta cart’,‘Retail _ Recreation’,‘杂货店 _ 药房’,‘病例’和‘死亡’。Durbin-Watson 统计数据向我们保证,该模型被正确地指定,并且可以进行预测。

蓝线=预测;橙色线=实际结果

在上图中,我们显示了四家选定公司在美国层面的 2020 年最后四周的预测结果。我们可以看到,对于 DoorDash,Uber Eats,Grubhub,兴趣的大趋势预测是正确的。这些信息使得各种利益相关者能够开展增值活动。

结论

所以总的来说,零售流动性确实对食品配送的受欢迎程度有影响,杂货店流动性对杂货店配送有影响。然而,不同州的不同行为会产生不同的影响。

在这篇文章中,我们试图了解移动性如何影响人们对送货服务的兴趣(以及需求)。通过比较流动性和利息如何随时间变化,我们看到这两个指标的趋势相反,特别是在 Covid 冲击期间。接下来,我们试图评估因果关系。基于我们最初的假设,即变量是负相关的,我们想知道活动的恢复是否会导致兴趣下降。通过因果矩阵,我们发现流动性的变化实际上引起了利息的变化。然而,当运行滚动回归时,结果与我们最初的假设大相径庭。

随着 2020 年的进展,移动性对许多州(如纽约和加利福尼亚州)的兴趣的影响从负面关系变为正面关系,这意味着即使移动性恢复,对交付服务的兴趣仍保持不变或更高。根据我们的发现,我们认为公共卫生法规和关闭不是交付应用需求增长的唯一直接驱动力。相反,我们认为,自 Covid 休克事件以来,美国消费者的看法和行为发生了实际变化。这种洞察力不仅可以应用于快递公司,而且持久的行为改变可以影响电影院、餐馆、音乐会场地等。

此外,我们建立的模型还可以用来预测未来利率的变化。我们之所以相信我们的模型是有意义的,是因为使用流动性数据预测需求是新颖而强大的。

如果你喜欢这个帖子,请给我们的 Linkedin 帖子一个赞!

在 github 上查看这篇帖子 背后的完整代码。

使用的工具:Python、R、Tableau、Excel

数据来源: 谷歌趋势 谷歌社区移动报告 CDC 雅虎财经

预测代码来源:https://www . machine learning plus . com/time-series/vector-auto regression-examples-python/

作者是杜克·富卡大学 MQM 项目的学生。

球迷对英超球队的影响

原文:https://towardsdatascience.com/the-impact-of-the-fans-on-premier-league-teams-3423f8d8ebae?source=collection_archive---------41-----------------------

他们的粉丝群有多重要?数据不言自明。

布雷登·霍普金斯在 Unsplash 上的照片

像许多体育联盟一样,英格兰超级联赛的最后两个赛季受到了新冠肺炎疫情的影响,导致比赛闭门进行。换句话说,很多比赛都不允许球迷观看。这启发我分析数据,并试图理解球迷对主队的整体影响,因为球迷的存在通常被认为是为主队提供了主场优势。

从数百万利物浦球迷在安菲尔德球场高喊“你永远不会独行”到无数当地纽卡斯尔联队球迷感到不寒而栗,他们是最热情和最激烈的,许多人会说球迷的存在以这样或那样的方式被感受到。

之前,我对有球迷的比赛和没有球迷的比赛之间的数据和统计进行了整体分析。

然而,对于这篇文章,我想深入到具体的球队,了解球迷对他们的成功有多大的影响。为此,我们将比较 2019-2021 赛季期间有球迷和无球迷比赛的比赛结果和每支球队的统计数据。

包括团队

两个赛季的所有球队都包括在内,除了那些在 2019-2020 赛季结束时降级或晋级的球队。否则,我们就不会有联盟中这些球队的两组比赛的数据。

收集的数据都是 2019 赛季开始到 2021 年 3 月 15 日的比赛。这些比赛被分成两组:一组有球迷在场,另一组没有。关于数据收集过程的更多细节,请随意参考之前的

勘探领域

基于主场优势和球迷如何影响球队的一些假设或普遍信念,我想探索几个领域。这包括:

  • 主队的总胜率,我们可以定义为总胜率占总潜在胜率的百分比
  • 裁判向主队和客队出示的犯规或黄牌的分布,他可能会感受到来自咆哮的球迷的压力
  • 主队的投篮命中率。他们是否拍摄更多镜头来满足粉丝,这是否会导致更高的准确性?

比较标准:提升

为了比较两场比赛的数据平均值,我们将计算每个团队的值之间的。**

Lift 就是两个值之间变化的百分比,通常用于比较 A/B 测试前后的结果。

作者创建的图像

跨团队的结果

下面的图表和分析着眼于每支球队从有球迷的比赛到没有球迷的比赛的百分比变化或提升。换句话说,正升力表示风扇不存在时观察到的特定度量值比风扇存在时大,反之亦然。

主场胜率

作者创建的图像

从主场胜率来看,我们可以看到大多数球队的主场胜率都出现了负增长(-20%到-40%)。然而,有两支球队的胜率明显上升,超过 40%:西汉姆联队和南汉普顿队。这两支球队是 2019-2020 赛季英超联赛中最差的五个主场记录之一,输的比赢的多。

来自 soccerstats.com的表格

快进到最近的 2020-2021 赛季,这个赛季主要是在没有球迷的情况下进行的,两支球队都有前十名的最佳主场战绩,西汉姆联队排名第二。

表来自soccerstats.com

最重要的是,西汉姆联在本赛季以第五名结束赛季,这使得他们能够击败更受欢迎的球队,如托特纳姆热刺队和阿森纳队,获得参加欧联杯的资格。

主场犯规分布

作者创建的图像

当观察主队犯规的分布或细分时,大多数球队在每个方向上都有不到 0.25%的细微提升。两个例外是利物浦和切尔西,当球迷不在场时,他们的犯规率上升了 0.25%。这两支球队都是拥有庞大球迷基础的英超强队。两年前利物浦赢得了冠军联赛,今年切尔西也赢得了冠军,给你一个视角。

这告诉我们,要么这些球队在主场没有球迷的情况下踢得更有侵略性,要么裁判在没有球迷的情况下对他们吹了更多的犯规。这可能会给他或她在球场上的决策带来偏见。

客场黄牌分布

作者创建的图像

同样,我们可以看看比赛中客场球队的黄牌分布情况。除了四支球队之外,所有球队都有明显的负提升,这表明当球迷缺席时,黄牌的分布更加平衡。然而,这并不是两支球队的情况:莱斯特城和水晶宫,他们在客场比赛时收到的黄牌数量增加了近 0.50%。

目标命中率的本垒打

作者创建的图像

最后,我们还观察了在没有球迷的情况下,主队的射门命中率。令人惊讶的是,大多数球队的投篮命中率都有积极的提高,托特纳姆热刺队的命中率提高了超过 0.25%。这也许告诉我们的是,球队可能会在尖叫的球迷大喊“投篮”的压力下或为了满足球迷的兴奋欲望而投篮。然而,这并没有转化为更好的位置拍摄。

也就是说,并不是所有的团队都经历了积极的提升。如上图所示,西汉姆联队和伯恩利队的准确率都下降了 20%以上。

最后的想法

虽然可能没有足够的比赛数据或实质性差异来对特定球队的表现得出任何强有力的结论,但分析确实为我们提供了在没有球迷的情况下比赛如何更加平衡的洞察力。排名较低的球队有更好的机会表现良好,无论是由于裁判的低偏见,还是体育场内尖叫的球迷对两支球队可能产生的任何影响的逆转。

退一步来看今年欧洲的主要足球联赛,在过去的 2020-2021 赛季发生了一些非常有趣和罕见的事情,与这里的分析类似。多年没有赢得联赛冠军的球队赢得了冠军:

  • 西班牙的西甲联赛——马德里竞技队(7 年来的第一个冠军)
  • 葡萄牙的西甲联赛——运动 CP(19 年来的第一个冠军)
  • 意大利甲级联赛——国际米兰(11 年来首次夺冠)
  • 法国法甲里尔队(10 年来首次夺冠)
  • 苏格兰超级联赛——流浪者足球俱乐部(10 年来的第一个冠军)

以下是一些值得思考的问题:这一切都发生在粉丝几乎不存在的一年。

这到底是不是巧合?也许吧。

信息论在机器学习中的应用

原文:https://towardsdatascience.com/the-implications-of-information-theory-in-machine-learning-707132a750e7?source=collection_archive---------11-----------------------

思想和理论

一瞥什么是信息论,机器学习如何依赖于它。

来自 PexelsJanko Ferlic 摄影

信息。这个术语在每一个可能的场景中都出现过。但是理所当然的是,世界是靠信息运行的。那是什么?解释它的最简单的方法是通过一个例子。假设你正在杂货店购物,你已经挑选了多件商品。你知道这些物品的价格;因此这是你的原始数据。稍后,当你在柜台结账时,收银员会扫描这些物品,并给你这些物品的总价。说得详细点,收银员会用每件商品的成本来处理商品的数量,给你一个固定的数字,你可以支付。在某种程度上,收银员处理原始数据(单个商品的价格)并给你信息(最终的账单金额)。所以,我可以把信息描述为有上下文意义的经过处理的数据。

再进一步,下面是两条消息:
a)我没去上班。我没去上班,因为我约了医生。很明显,第二条消息比第一条包含更多的信息。但是我如何定义“更多”是什么呢?我如何量化它?这就是信息论的用武之地!下一节将探索信息论领域和其中的重要概念。

信息论

自 20 世纪初以来,研究人员一直在思考量化信息,1948 年,克劳德·香农发表了一篇名为“沟通的数学理论”的非凡文章这篇论文诞生了信息论领域。从定义上来说,信息论是对信息的量化、存储和交流的研究。但远不止如此。它对统计物理、计算机科学、经济学等领域做出了重大贡献。

香农论文的主要焦点是通用通信系统,因为他发表这篇文章时正在贝尔实验室工作。它建立了相当多的重要概念,如信息熵和冗余度。目前,其核心基础应用于无损数据压缩、有损数据压缩和信道编码领域。

信息论中使用的技术本质上是概率性的,通常处理两个特定的量,即。熵和互信息。让我们更深入地研究这两个术语。

香农熵(或仅仅是熵)

熵是对随机变量的不确定性或描述变量所需信息量的度量。假设 x 是一个离散随机变量,它可以取集合中定义的任意值, χ。让我们假设这个场景中的集合是有限的。T5x的概率分布将为p(x)= Pr {χ=x}, xχ 。考虑到这一点,熵可以定义为

熵的单位是比特。如果你观察这个公式,熵完全依赖于随机变量的概率,而不是依赖于 x 本身的值。公式前面有一个负号,使它永远为正或 0。如果熵为 0,则没有新的信息可以获得。我将通过一个例子演示这个公式的实现。

考虑抛硬币的场景。有两种可能的结果,正面或反面,概率相等。如果我们量化一下,x{正面,反面}, p (正面)= 0.5, p (反面)= 0.5。如果我们将这些值代入公式:

在掷硬币事件中计算熵

因此,熵是 1 比特,也就是说,抛硬币的结果可以完全用 1 比特来表示。所以,直观地表达香农熵的概念,理解为“一条消息需要多长时间才能完整地传达其价值”。我想再深入一点,讨论一下联合熵、条件熵和相对熵的概念。

联合和条件熵

之前我定义熵是针对单个随机变量的,现在我把它推广到一对随机变量。这是一个简单的聚合,因为我们可以将变量对( XY )定义为单个向量值随机变量。

一对具有联合分布 p ( xy )的离散随机变量( XY )的联合熵 H ( XY定义为

相关熵

这也可以用期望值来表示。

联合熵(期望值形式)

同样,对于条件熵, H ( Y |X)定义为:

条件熵

直观上,这是给定 XY 的熵在 X 的所有可能值上的平均值。考虑到( XY)~p(Xy ),条件熵也可以用期望值来表示。

条件熵(期望值形式)

让我们尝试一个例子来更好地理解条件熵。考虑一项研究,其中受试者被问及:
I)他们是否吸烟、饮酒或两者都不做。如果他们患有任何形式的癌症,我将把这些问题的回答表示为属于联合分布的两个不同的离散变量。

数据表

在左边,你可以看到 10 名受试者回答问题的数据表。变量 Activity 有三种不同的可能性(我称之为 X)。第二列代表受试者是否患有癌症(变量 Y)。这里有两种可能性,即是或否。由于我们还没有处理连续变量,我已经将这些变量保持离散。让我们创建一个概率表,使场景更加清晰。

上例的概率表

接下来我会计算 x 的所有可能值的边际概率 p ( x )的值。

X 的边际概率

基于概率表,我们可以在条件熵公式中插入值。

条件概率在上面的例子中

相对熵

从随机变量到分布,相对熵有所不同。它是两个分布之间距离的度量。更本能的说法是:相对熵或 KL 散度,用D(p|q表示,是当真实分布是 p 时,假设分布是 q 的低效率的度量。它可以定义为:

相对熵

相对熵总是非负的,只有当 p = q 时才能为 0。尽管这里要注意的一点是,它不是一个真实的距离,因为它在本质上是不对称的。但是它通常被认为是分布之间的“距离”。

让我们举一个例子来巩固这个概念!设 X = {0,1} 并考虑 X 上的两个分布 pq**设 p (0) = 1 — rp (1) = rq (0) = 1 — sq (1

p||q 的相对熵

我还要演示一下非对称性质,所以我也算一下D(q| |p)。

q||p 的相对熵

如果 r = s,D(p| |q)=D(q|p)= 0。但是我会取一些不同的值,例如, r = 1/2,s = 1/4。

**

可以看到,D(p|q)≦D(q|p)。

现在,既然我们已经讨论了不同类型的熵,我们可以继续讨论互信息。

交互信息

互信息是一个随机变量包含的关于另一个随机变量的信息量的度量。或者,它可以被定义为一个变量的不确定性由于另一个变量的知识而减少。其技术定义如下:
考虑两个随机变量 XY ,它们具有联合概率质量函数 p ( xy )和边际概率质量函数 p ( x
p相互信息I(X); Y )是联合分布与乘积分布p(x)p(Y)之间的相对熵。**

交互信息

互信息也可以用熵来表示。推导过程很有趣,但我会克制自己,因为它可能会弄乱文章。

互信息 w.r.t 熵

从上面的等式中,我们看到互信息是由于 Y 的知识而导致的 X 的不确定性的减少。有一个维恩图完美地描述了这种关系。

互信息与熵的关系

让我们举个例子来更好地理解它。我可以用我在解释熵的时候用过的例子,把吸烟、饮酒和癌症联系起来。我们已经看到,H(Y| X)= 0.8184 位。为了计算互信息,我需要多一项 H ( Y )。 H ( Y ),在这种情况下,将为:

因此,交互信息的定义是:

互信息的计算

或者,我也可以用 H ( X )和 H ( X | Y )来计算互信息,结果也是一样的。我们可以看到,知道 X 对于变量 y 的不确定性来说意义如此之小。让我改变这个例子的段落,并引导您了解这一切在机器学习中是如何有意义的。假设 X 是预测变量,Y 是预测变量。它们之间的互信息可以是检查该特征对于预测的有用程度的很好的前兆。让我们讨论信息论在机器学习中的含义。

信息论在机器学习中的应用

周围有相当多的应用程序,但我将坚持使用几个流行的应用程序。

决策树

照片由安民像素拍摄

决策树(DTs)是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断的简单决策规则来预测目标变量的值。这里使用的核心算法叫做 ID3,由 Ross Quinlan 开发。它采用自上而下的贪婪搜索方法,并涉及将数据划分为具有同类数据的子集。ID3 算法通过使用熵计算样本的同质性来决定划分。若样本同质,熵为 0,若样本均分,则熵最大。但是熵对树的构造没有直接的影响。该算法依赖于信息增益,信息增益基于数据集在属性上拆分后熵的减少。如果你凭直觉思考,你会发现这实际上是我上面提到的相互信息。在给定一个变量的值的情况下,互信息减少了另一个变量的不确定性。在 DT 中,我们计算预测变量的熵。然后,基于熵分割数据集,并从先前的熵值中减去结果变量的熵。这是信息增益,很明显,是相互信息在起作用。

交叉熵

交叉熵是一个非常类似于相对熵的概念。相对熵是指随机变量将真实分布 p 与每个样本点的近似分布 qp 的差异进行比较(散度或差异)。而交叉熵直接比较真实分布 p 和近似分布 q 。现在,交叉熵是深度学习领域中大量使用的术语。用作损失函数,衡量分类模型的性能,其输出为 0 到 1 之间的概率值。交叉熵损失随着预测概率偏离实际标签而增加。

KL-散度

K-L 散度或相对熵也是深度学习文献中的一个主题,特别是在 VAE。变分自动编码器接受高斯分布形式的输入,而不是离散的数据点。对 VAE 的分布进行正则化以增加潜在空间内的重叠量是最佳的。 K-L 散度对此进行测量,并添加到损失函数中。

K-L 散度也用于 t-SNE。tSNE 是一种降维技术,主要用于可视化高维数据。它将数据点之间的相似性转换为联合概率,并且试图最小化低维嵌入和高维数据的联合概率之间的 Kullback-Leibler 散度。

计算目标类别分布的不平衡

熵可以用来计算目标阶级的不平衡。如果我们将预测的特征视为具有两个类别的随机变量,那么一个平衡的集合(50/50 分割)应该具有最大的熵,就像我们在掷硬币的例子中看到的那样。但是,如果分裂是偏斜的,一个类有 90%的流行率,那么获得的知识较少,因此熵较低。实施计算熵的链式法则,我们可以检查一个多类目标变量在一个量化值中是否平衡,尽管一个平均值掩盖了个体概率。

摘要

信息论是一个激动人心的领域,对多个领域都有重大贡献。作为其中之一,机器学习并没有完全利用信息论所提供的一切。我觉得在机器学习的背景下,有许多信息理论概念有待发现,作为一名数据科学家,这让我非常热情。就此,我想结束我的文章。

我希望你喜欢我的文章,如果你真的真的喜欢,这里是我的:

  1. 我的网站:https://preeyonujboruah.tech/
  2. Github 简介:https://github.com/preeyonuj
  3. 上一篇媒体文章:https://Medium . com/analytics-vid hya/aptos-blindness-challenge-part-1-baseline-efficient net-c 7a 256 da a6e 5?sk = d0e 445 f 99 DAA 71d 79 f 0452665 f1 a59 db
  4. 领英简介:【www.linkedin.com/in/pb1807
  5. 推特简介:https://twitter.com/preeyonuj

参考

  1. https://www . khanacademy . org/computing/computer-science/information theory
  2. https://web.stanford.edu/~montanar/RESEARCH/BOOK/partA.pdf
  3. https://web.mit.edu/6.933/www/Fall2001/Shannon2.pdf
  4. https://www . science direct . com/topics/neuroscience/information-theory
  5. http://staff.ustc.edu.cn/~cgong821/Wiley.interscience . elements . of . information . theory . 2006 . 7 . ebook-DDU . pdf

激活函数背后的重要性和推理

原文:https://towardsdatascience.com/the-importance-and-reasoning-behind-activation-functions-4dc00e74db41?source=collection_archive---------3-----------------------

神经网络的一个重要组成部分

ML 工程师必须做出的最重要和最有影响力的选择之一是他们将为其网络的节点使用什么激活函数。这取决于网络的结构、数据集和目的。令人欣慰的是,对于哪些函数在哪些场景中有用,已经有了广泛的共识。

我们为什么需要它们?

概括地说,激活功能对于防止线性是必要的。没有它们,数据将只通过线性函数(a*x+b)通过网络的节点和层。这些线性函数的组合也是线性函数,因此无论数据经过多少层,输出总是线性函数的结果。下图解释了一个示例。

一个简单的三层网络。f 是激活函数。(图片由作者提供)

如果示例 x1 经过第 1 层的第一个节点、第 2 层的第一个节点和最后一个节点,则输出将由下式给出:

作者图片

如果所有的激活函数都是线性的,那么这就等于另一个线性函数!

作者图片

所以,我们还不如刚刚用了一层一个功能呢!为了避免这种情况,我们使用非线性激活函数。这是因为对于复杂的问题,数据无法通过线性方程很好地建模。

展示非线性函数对拟合数据模型的好处的示例。(图片由作者提供)

什么是常见的激活功能,为什么?

乙状结肠的

作者图片

这会输出一个介于 0 和 1 之间的值,这对于二进制分类问题非常有用,因为可以设置一个阈值“概率”值。高于该值,输出可归类为 1,低于该值,输出将为 0。这使得它成为网络最终输出节点的普遍选择。

不幸的是,计算指数需要大量的能量,因此会降低大型网络的速度。该函数不是以零为中心的,这使得后续层的参数优化更加困难。它还具有几乎完全平坦的大部分线,给出非常小的梯度。如果输出非常正或非常负,这使得梯度下降非常慢。这就是所谓的饱和度和消失梯度问题。在大多数情况下,下列功能远远优于乙状结肠。

双曲正切值

作者图片

这将输出一个介于-1 和 1 之间的值,并且由于其指数的原因,与 sigmoid 函数的功耗类似。它也遭受饱和,但是它是零中心的,这使得在它之后的层中的参数优化更容易。我们说,如果各种节点的平均输出为零,则该层更接近正常化。

整流线性单元

作者图片

这将输出一个介于 0 和无穷大之间的值,对于 x 的正值,梯度始终为 1。这意味着不存在会发生饱和的平坦区域,除非 x 为负,这会使梯度下降非常快。该函数的计算非常简单,正是由于这些特点,它是最受欢迎的隐藏层激活函数的选择。

一个缺点是它不是以零为中心的,因此输出没有标准化。这就产生了下一个函数,它非常类似,但更接近于平均输出为零。

泄漏 ReLU

作者图片

通过使用 alpha(通常很小,例如 0.01),为负 x 添加一个浅斜率。这使 x 值为负值的节点保持活动状态。同样,这很容易计算,并且从-无穷大到无穷大,这意味着它几乎以零为中心。这使得将来的层计算更容易处理。作为隐藏层的激活函数,Leaky ReLU 也是一个非常受欢迎的选择。

摘要

这是一个简短的介绍当你选择激活功能时的思考过程。要考虑的要点是,该函数是否为您的问题环境输出有用的值,它能多快做到这一点,它是否会遇到消失梯度问题,以及它的平均输出是否接近零。

初始化背后的重要性和原因

原文:https://towardsdatascience.com/the-importance-and-reasoning-behind-initialisation-829d8f6e9f43?source=collection_archive---------28-----------------------

神经网络的一个重要组成部分

神经网络通过学习哪些参数最适合数据集来预测输出。为了学习最佳参数,ML 工程师必须初始化,然后使用训练数据优化它们。你可能会考虑一些初始化的选项,尽管错误的选择会导致网络变慢甚至无用!

布拉登·科拉姆在 Unsplash 拍摄的照片

为什么我们不能将权重初始化为零

这是一个诱人的选择,尽管它不起作用。如果你将所有的权重初始化为零,或者任何相同的数字,网络的所有节点都以相同的方式运行。下图解释了一个例子。

具有相同初始权重的简单 3 层网络。(图片由作者提供)

这里,所有的权重和偏差已经分别初始化为相同的 w 和 b。在这种情况下,我们假设任何单层中的激活函数都是相同的。无论一个示例数据点通过什么路径到达输出,它都会产生相同的输出。因此,它将产生相同的成本。在反向传播期间,同一层中的参数将经历相同的梯度下降,并在训练后达到相同的最优值。所以每层中的节点彼此之间没有任何不同!当一个新的数据点通过网络时,无论它采用什么路径,都会产生相同的输出!我们需要“打破节点的对称性”…

为什么我们不能完全随机地初始化权重

虽然这将“打破对称”,但它带来了渐变消失和爆炸的问题。每个节点输出的平均值应该为零。我们说我们希望激活函数以零为中心。这在我的文章介绍激活函数中有解释,链接如下。

考虑下面的多层网络。

作者图片

在产生输出 y 之前,数据点 X 必须经过几个节点。如果它所乘以的权重都很大(或都很小),这将导致最终层的输出非常大(或非常小)。成本的梯度将因此爆炸(或消失)。在爆炸梯度的情况下,成本将永远不会达到它的最小值,因为它将一直错过它并围绕它振荡。这是因为每个梯度下降步骤太大。

爆炸梯度问题。(图片由作者提供)

在梯度消失的情况下,成本永远不会达到最小值,因为接近它的步骤非常小。

消失梯度问题。(图片由作者提供)

什么是最常见的初始化技术,为什么

为了防止梯度变得过大或过小并减缓梯度下降,我们需要确保满足两个条件。任何图层输出的平均值为 0,并且在整个图层中方差相对恒定。解决方案是随机化权重,但是将它们乘以一个值,该值取决于正在初始化的层中的节点数量。不同的激活功能的值是不同的。

他初始化

对于具有 ReLU 或泄漏 ReLU 激活函数的节点,我们将随机数乘以前一层中节点数量的函数。公式如下所示。

作者图片

Xavier 初始化

对于具有 Tanh 激活函数的节点,我们使用 Xavier 初始化。这非常类似于初始化,但是我们用随机数乘以的值在分子中是 1 而不是 2。公式如下所示。

作者图片

摘要

这是对初始化方法的简短介绍。这两种初始化技术保持跨层的方差相同,并且如果我们使用有效的激活函数,我们可以确保每个节点的输出的平均值为零,从而保持梯度下降时间合理。

数据分析在解决问题中的重要性

原文:https://towardsdatascience.com/the-importance-of-data-analysis-in-problem-solving-2f8ad041708d?source=collection_archive---------14-----------------------

我解决项目管理问题的经验

活动发起人Unsplash 上的照片

与大多数人的想法相反(我也不例外),在大型 IT 转型项目中,项目经理的角色不仅仅是管理任务。它带来了几个解决问题的机会。

有时会有管理成本的问题,有时会有进度的问题,有时会有质量的问题,很多时候是所有的问题。这些问题会因为各种原因——企业、环境、利益相关者,有时纯粹是人的心理所致。

要解决这些问题,数据分析非常重要。数据处理、业务分析和发现独特的见解是管理分析和决策制定的一个非常重要的部分。使用了多种工具和技术。但我意识到,除了工具,更重要的是你如何思考和使用数据解决问题。该工具可以像 MS Excel 一样简单,有时甚至可以是纸笔。

有一次,我参与的项目在进度上有很多延迟。人们正在度长假,因此,这个项目被推迟了。IT 团队正在努力弥补延迟。在那个关键时刻,业务部门回来说,由于摆在他们面前的优先活动,他们不能参与转型计划。这意味着会有更多的延迟 2 个月。

这是个问题。一个大问题。当项目延迟时,会产生相关的成本。谁来承担?你会把这归因于利益相关者吗?你知道,事情从来不是那样的,每件事都有一些理由。或者也许你把它归因于计划不周。你知道,那也会有一个解释的。还是你只是将其归因于环境和情况并有所缓解?

不幸的是,当影响到钱的时候,解决办法就不那么容易了,而且总是要务实。

不管计划得多么好,多么详细,多么有根据,这种情况还是很常见的。有时,如果解决困难,这些问题会被提出来,并在指导委员会的会议桌上决定下一步。在这些情况下,人们带着情绪交谈,反驳,争论,每个人都有自己的观点,等等。在这样的环境下,变得难以抉择。

在这种情况下,唯一的解救办法就是根据数据做出决定。你不能对数据提出太多异议。

我想起了纳拉亚纳·穆尔蒂的一句名言,他说——我们相信上帝,其余的必须靠数据。

同样在上面的场景中,我们努力寻找数据在哪里,以证明会有延迟。当然,许多人直截了当并且情绪激动地说会有一个延迟,但是哪里有数据显示呢?

我们做了一个练习,以获得所有资源在计划阶段的指定持续时间内的可用性。与通常在 Microsoft project planner 中维护详细计划的程序不同,在该程序中,资源计划不在 project planner 中维护。只保留了时间表。原因?有太多的可移动部分、资源和定期变更,因此实际上为这样一个大型项目维护一个基于资源的项目计划是很困难的。

所以这是个问题。此外,组织通常会犯一个错误,即许多转型计划仅与 it 相关,而 IT 通常是业务转型。商业的参与对项目的成功同样重要。但事实是,这只是以 it 为中心的计划。考虑到业务参与和可用性,我们必须对计划中的现状进行分析。

我们与业务团队合作,在 excel 电子表格中收集数据。这些数据是非结构化的,资源如此之多,可用性数据也千差万别。但至少它有一天中有多少百分比的业务资源在一周内对程序有贡献的信息。

我们遵循以下步骤:

  1. 确定未来 4 个月要执行的任务
  2. 如这里提到的一样,从逻辑上将它分解成微小的部分
  3. 对于每个组,称之为流或逻辑组。什么是适当的计划,我们需要多少业务可用性。
  4. 每周为这些逻辑组准备业务可用性矩阵
  5. 比较 3 和 4,找出差距

好吧,这在纸上看起来很简单。然而,当实际尝试时,数据是非结构化的;它必须以一种决策机构中的每个人都可以看到的形式出现。

我认为这就是经验的价值所在。

我们如何表示数据?理想的解决方案是按每个流程的涉众每周的工作进行分组,并显示每个关键流程的可用性。当我们在 excel 中拥有所有这些数据时,很难得出这些组并可视化来做出决定。

在这个阶段对我有帮助的一些问题是:

  1. 在这种情况下,我的变量是什么?我可以用简单易懂的方式把它们都表现出来吗?
  2. 我是否可以用利益相关者的术语来代表他们,因为他们可以用更简单、更好的方式来可视化对他们的影响?
  3. 你能否用决定下一步所需的细节来代表一个逻辑组?哪些关键数据是必需的?您能在多大程度上代表这个逻辑组?
  4. 如果你想出了一个表述,走出来问,如果你这样表述,还有什么问题?它回答了这个,这个,还有这个问题吗?那个问题呢?我该如何填补这一空白?我还需要总结什么?
  5. 有时候,你无法彻底解决。能不能务实一点解决至少 80%才能得到至少更好的见解?有哪些数据可以省去?如何在不使分析过于复杂的情况下进行简化?

花几分钟时间深入思考这些问题,对获得更好的结果大有帮助。你有多少数据并不重要,重要的是你从中获得了什么样的洞察力。

让我告诉你,不是所有的人都能做到这一点,它只是来自经验。

在处理过 SQL 和各种类似的问题之后,在这种情况下,我可以在很短的时间内想到这个解决方案,对此我感到非常高兴。解决方法是在 excel 上用许多公式和分组,花了半天时间,但结果显示了问题所在。

一开始,这看起来确实像是一个问题,但当我们深入了解时,我们发现了一些不同的东西。事实证明,这个问题几乎没有预计的 10%。

我怎么强调都不为过,用数据说话,掌握分析数据的技能,准确地将数据可视化,从而获得一些见解,是多么重要。

商业故事带有情感因素,这很重要,但在许多情况下,它必须有数据支持。培养对数据分析的敏锐眼光会让你的故事更加有力。

(你可能会发现这个有用的 13 种提高效率的方法 )

数据项目中以道德为中心的重要性

原文:https://towardsdatascience.com/the-importance-of-ethics-centricity-in-data-projects-ea2a60e6b67?source=collection_archive---------39-----------------------

构建安全公平的人工智能

作者为 IG & H 创建的框架

在我的伦理数据分析博客系列的前两篇文章中,我研究了数据驱动的决策过程中可能出现的潜在伦理问题;这些问题如何影响商业、社会和消费者,以及如何避免它们。在这最后一部分中,我将深入探讨如何消除或减少数据用例中的伦理风险。

我在上一篇文章中介绍的伦理风险快速扫描是一个在项目开始前快速评估用例伦理风险的工具。快速扫描是专门设计的,在最终解决方案和模型的许多方面尚不清楚的早期阶段非常有用。这样,伦理风险和复杂性可以在用例优先级和项目方法中考虑。

然而,一旦项目开始,团队将对数据、模型工作和实现需求有更好的理解。在这一点上,评估可以通过道德指导框架进入下一个层次,我将在下面进行描述。这提供了评估维度、更详细的检查问题和可能的解决方案。

该框架基于四个指导维度,为每个团队的道德指南针提供信息[1]。与快速浏览相比,指导框架最好在整个项目生命周期中持续使用,同时了解模型和实现的更多特征。

作者为 IG & H 创建的框架

每个维度都包含了示例检查问题和防止或减轻风险的方法的几个例子[2]。我将首先用一个用例来说明框架的应用,然后在这个用例之后提供一个包含检查问题和解决方案示例的表格。

道德指导在行动:出租车公司使用案例

我现在将在一个现实但虚拟的用例中应用这个框架。让我们以出租车服务为例,该服务以数字方式监控分配给司机的行程的许多方面(在上一篇文章中已经介绍过)。该公司希望开发一种模型,可以对司机的表现进行评分,并相应地自动调整司机的工资。请注意,虽然这个例子代表了我为不同客户所做的工作,但它不是一个实际的客户用例。

当在项目开始前应用快速扫描时,快速扫描中的八个类别中的六个表示中度到高度风险。毫不奇怪,当我们为公司建立这个自动评分和决策模型[3]时,我们遇到了一些道德挑战。我们每月使用指导框架评估项目,识别的挑战都属于(至少)框架中的一个主题。

安全

快速扫描已经警告我们,没有人在回路中的意图是一个风险因素,特别是因为模型可能会影响生活的事情。这意味着,如果模型精度随着时间的推移而下降(模型漂移),或者由于数据质量问题而产生意外输出,在驱动因素受到影响之前,可能没有人会注意到。考虑到我们的指导框架的“安全”维度,我们选择执行两个缓解措施:部署前的敏感性分析和模型输入和输出的统计监测的实施。

公平

在快速扫描中,我们指出了数据偏差的中等风险,这意味着我们可能需要额外的努力来确保我们指导框架的“公平性”。当我们分析模型测试结果时,我们发现女性驾驶员的分数偏向量表的高端,而男性驾驶员的分数偏向低端[4]。

在这一点上,我们需要了解该模型在评分时是否意外地存在性别偏见[5]。经过仔细检查,我们得出结论,该模型使用有效的客观特征进行评分。并且女性和男性驾驶员对于相同的驾驶行为得到相同的分数。所以,我们和出租车公司一起决定不需要改变。

透明度

正如我们在快速浏览中看到的,影响生活的事情是该用例的一个风险因素。生活事件包括可能影响一个人生活质量的事情。例如,在金融服务中,这可能是信贷的可负担性,或者在医疗保健中,这可能是获得某些治疗的机会。对于出租车公司来说,该模型的决定肯定会通过员工的薪水从财务上影响他们。

该模型也可能影响个人行为,在这种情况下,我们认为是中等风险。例如,司机可能会感到有压力,不得不开车穿过更危险的街区,或者接受可能构成威胁的人的搭车。

作为我们的缓解措施之一,我们必须向出租车司机清楚地解释该模型是如何工作的。我们还引入了一个流程来处理司机提出的任何问题。最后,我们还与模型所有者和人力资源一起确保模型对奖励分配和驾驶行为的影响得到监控。这样,出租车公司可以提供这种模式的潜在影响所证明的透明度。

我们还想在这里提到,应该始终有一个正式的公司代表,负责决策模型对人和业务的影响。在这种情况下,首席运营官在项目开始时被指定为负责任的模型所有者[6]。

隐私

这家出租车公司的数据集包含地理位置数据,一旦与其他公开可用的数据结合起来,就可以用来(重新)识别个人。其他敏感的个人数据元素,如“性别”和“年龄”被从模型中删除,以避免不必要的偏见,但我们确实将这些保留在我们的数据集中,以便能够测试模型的公平性。员工应该能够相信他们的隐私得到了尊重,他们的个人数据得到了安全的处理和存储。因此,我们执行数据隐私影响评估,并应用公司的所有技术和运营措施来确保其受到保护。

作者为 IG & H 创建的框架

图 2 指导框架中每个维度的样本检查问题和可选解决方案表

伦理中心主义

上面的案例表明,如果你把数据伦理放在第一位,许多潜在的问题是可以避免或减轻的。在我工作的公司,我们努力把道德和经济并列在我们所做的一切的中心。我们帮助客户像我们一样关心这个问题。在这两种看似对立的力量之间取得平衡是我日常工作中许多有趣和迷人的方面之一。

由于数据项目的伦理可能比经济学更模糊,我们创建了我们的框架作为指南。为什么?提供所需的结构和早期预警信号,帮助我们的客户遵循他们的道德指南针,并采取适当的措施。这样每个人都可以安全公平地享受数据和 AI 带来的好处。

这篇文章和框架已经与我的同事曼多·罗特曼和楼科曼合作完成,并于早前发表到我们公司的网站https://www.igh.com/post/ethical-data-analytics-iii-solving-an-ethical-use-case*。它是一个三件套系列的一部分,其中第一部* 在这里可以找到 ,第二部 在这里可以找到

[1]SFTP 准则是从一项对 36 份著名的人工智能原则文件进行的元研究中提炼出来的。

[2]让我们在这里提一下,数据伦理领域正在迅速发展,我们的框架也是如此。当我们遇到新的相关话题时,会添加更多的检查问题和解决方案。

[3]在即将出台的人工智能法规中,这种模型将被称为“高风险人工智能系统”,它将在未来承担额外的责任

[4]我们没有在模型本身中使用变量“性别”,但出于验证目的,我们将它保留在数据集中。通过这种方式,可以为模型收集敏感数据,但确切地说是为了防止违反这种敏感性

[5]即使模型中的不平等不是偏见的结果,你也可能有充分的理由消除不平等。我们选择不在本文中涉及这一点,但是偏见/不平等本身可能是一篇文章的好主题。

[6]首席运营官对该模式对企业和员工的影响负责,她将日常责任委托给了公司的绩效经理

目标设定在产品开发中实现负责任人工智能的重要性

原文:https://towardsdatascience.com/the-importance-of-goal-setting-in-product-development-to-achieve-responsible-ai-eda040809292?source=collection_archive---------42-----------------------

你为什么要开发你现在正在做的产品?

是的,花点时间考虑一下,我就在这里!

昂斯普什河畔诺德伍德

这个你有明确的答案吗?如果不是,你认为这是一个问题吗?

产品经理将此作为他们工作的核心部分:阐明为什么产品应该存在。然而,有时我们会对新技术感到兴奋,并一头扎进它去寻找一个我们可以用闪亮的新玩具解决的问题。

缺乏对为什么一个团队在一个项目上工作的明确性会对坚持负责任的人工智能原则产生后果。

为什么要设定目标?

设定目标的练习有助于我们突出做某个项目的原因。这是确保我们能够在项目中集中负责任的人工智能原则并将其注入基础的第一步。

我们可以借用克莱顿·克里斯滕森的 《创新者的困境 》一书,该书强调了阐明我们正在构建的东西试图满足用户的什么需求的必要性。这是一个暴露用户需求和组织需求之间矛盾的机会,由于数据需求、财务动机等原因,用户需求和组织需求之间可能存在矛盾。

通过聊天机器人自动化常见问题

让我们举一个例子:你被委托创建一个聊天机器人来自动化 FAQ,以减少打给你的客户支持的来电数量。如果人们参考 FAQ,或者让你相信 FAQ,客户支持收到的许多问题都可以很容易地解决。您可能会看到第 1 级电话的数量下降,这表明这种预感是正确的,您是成功的。但是,总体目标实现了吗?

想象一下,在这种情况下,由于呼叫量下降,组织缩减了第 1 级支持人员。但是,他们注意到第 2 层+的来电数量增加了。为什么会这样?

可能是聊天机器人提供的答案让用户感到困惑,加剧了他们的问题,因为他们采取了错误的步骤,或者其他许多事情。所以现在,他们跳过所有的交互式语音应答(IVR)选项,直接与代理交谈,并粗鲁地提到他们已经尝试了聊天机器人建议的所有步骤。他们想让他们的投诉升级。

现在,当他们达到 2+级时,支持代理可能必须首先帮助他们撤销一些错误的步骤,这些步骤可能是他们根据聊天机器人的建议采取的。情况可能是,客户支持的总体支出实际上已经上升,因为您预期通过 FAQ 自动化和通过 chatbot 交付解决的更简单的查询已经在另一个地方出现,并对更昂贵的资产施加了额外的压力。这推高了客户支持运营的总成本。这当然不是本组织想要的结果。

还有一个风险是,你疏远了那些不太懂技术的用户,他们可能会对取消他们已经习惯的第 1 级客户支持感到更加困惑。这会让他们不满意,你可能会失去生意。

二阶效应和不可行性

显然,在尝试部署自动化解决方案时,会有许多二阶效应。明确您的目标将有助于突出您在技术方面进行优化时必须应对的权衡及其对业务方面的影响。

最后,这个过程可以突出项目的不可行性。在自动化常见问题解答的情况下,假设您正在将它应用到一个类似于Info sant的服务中,在该服务中,入站查询通常很复杂,并且呼叫者很紧张。赌注要高得多,并且查询的复杂性至少目前超出了自然语言理解(NLU)系统有效处理的能力。目标设定练习可以为参与项目的所有利益相关者创造一个北极星

我应该如何设定目标?

实施有效的目标设定并不是一件容易的事情。深思熟虑很重要。

与你的利益相关者一起

从把合适的利益相关者带到谈判桌前开始。这包括内部和外部的利益相关者。

在内部方面,这应该包括来自业务、设计、工程、法律和营销团队的成员。在外部方面,这应该包括将受到此解决方案部署影响的实际社区的成员。

在选择外部利益相关者时,你可能会选择做一些类似于微软对负责任创新的公民评审团的想法所做的事情。给予他们发言权,并在一个紧密的反馈回路中考虑他们的建议,对于这一进程的顺利运作至关重要。

共同构建目标可以是您通过利益相关方咨询流程努力实现的另一个结果,这样您就可以创建一个北极星来满足您希望通过您的产品服务的社区的需求。利用“5 个为什么”的方法可以帮助你做到这一点。

组织调整

你在这个过程中设定的目标应该明确地与组织的使命陈述保持一致和偏离。这是至关重要的,因为它将帮助团队以深思熟虑的方式选择权衡,而不是将这样的选择留给团队中个人的特别决定。个人可能会面临低水平的项目压力,如预算和时间限制,而更大的组织使命一致性可以在危机时刻指导决策。

这些目标应该是什么样的?

有效的目标设定有很多框架,我不会在这里重复,我会谈谈一些我认为相关的想法。

目标应该是可以转化为衡量标准的东西,特别是因为团队和个人在最初的会议后将利用这些标准来标记他们在实现目标方面的进展。它们对于跟踪整个人工智能生命周期也很有用。

这些目标应该与谁将对它们负责明确地联系起来。这防止了责任分散的问题。它还有助于组织内的其他功能,如法规遵从性和审计。

如果我们没有适当的激励措施来鼓励坚持既定的目标,所有这些都是没有意义的。有正确动机的人是有力量的。它们将加速你在实践中实现负责任的人工智能的旅程。

那么,你如何看待将目标设定作为在实践中实现负责任的人工智能的练习?把你的想法留在这里,我们开始对话吧!

在这里报名领取 可诉人工智能伦理书 更新!而你可以在这里 了解更多我的作品

你可以通过订阅 人工智能伦理简报 蒙特利尔人工智能伦理研究所 了解更多这样的见解!

分层思维在数据工程中的重要性

原文:https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71?source=collection_archive---------8-----------------------

行业笔记

如何在机器学习(ML)用例中使用真实世界的数据

看起来有点像数据湖,对吗?(Flickr 上科利·多克托罗的《纠结的电线》 (CC BY-SA 2.0))

这是给谁的?

你是数据科学家还是数据工程师,热衷于构建可持续和健壮的数据管道?那这篇文章就送给你了!我们将通过一个真实世界的例子,到本文结束时,您将理解为什么您需要一个分层的数据工程约定来避免我们过去所犯的错误🙈。我们是 QuantumBlack 我们将讨论我们的开源 Python 框架: Kedro

为什么我们需要一个约定?记住—数据通常是偶然存在的

经验丰富的数据科学家、分析师和工程师非常清楚,并非所有数据都是为分析而设计的。通常它是“偶然”存在的,是一些其他业务流程的随机副产品。

当这种情况发生时,数据质量差和基础设施不可靠是很常见的。

以下是一些在企业组织中常见的情况,它们说明了一个人是如何不可避免地陷入这种境地的:

  • 生产线的值班经理仍然在 Excel 中维护时间表,而不是使用他们现有的花哨的企业软件,因为这是一个有效的系统,可以通过电子邮件发送,并且迁移会中断业务关键时间表。
  • 一家跨国制药公司的库存系统实际上仍然是 20 世纪 80 年代的大型计算机(嘿,它可以工作!).它有一些基本的报告和预测功能,但它是专门为管理股票而设计的,而不是用于分析。

许多组织,尤其是大型组织,并不是“互联网原住民”,现在正在将机器学习追溯到他们的运营中。在这种情况下,我们必须采取灵活的迭代方法来构建 ML 用例。

人们不能指望数据结构整齐,随时可用。例如,你会看到像 Monzo 这样的数字银行非常仔细地思考他们如何从源头将 PII 的数据从分析中分离出来。这是更传统的机构在尝试进行同类分析时,必须在不同的系统之间进行分解的事情。

在现实世界中,将为某个目的设计的数据逆向工程成对分析有用的东西是构建 ML 管道的一个重要部分。

承认这种情况并使用标准化的项目模板是简化代码库和工作心理模型的有效机制。

在这个问题上,一组固执己见的最佳实践可以求助于 Cookiecutter 数据科学。他们的任务是促进数据科学的正确性和可再现性,而且,碰巧的是,他们也采用了数据工程的分层方法…

我们❤️库克数据科学

Cookiecutter 及关联的 Cookiecutter 数据科学 项目都是该领域的领导者,有着坚如磐石的见解。如果你还没有机会详细阅读他们的方法,看看他们的。我们等着,没事的😀 ⏳。

嗯……(hlkljkgk的健康巧克力曲奇获得 CC BY-SA 2.0 授权)

总之,他们的想法是基于以下 6 条规则:

1.数据是不可变的
2。笔记本是用来探索和交流的
3。分析是一个DAG4。从环境中建立起来。将秘密和配置置于版本控制之外
6。在更改默认文件夹结构时要谨慎

您可以从标准的 Cookiecutter 目录结构中看到,一种清晰简洁的数据工程约定形式得到了实施:

*...
├── data
│   ├── external       <- Data from third party sources.
│   ├── interim        <- Transformed intermediate data.
│   ├── processed      <- The final data sets for modeling.
│   └── raw            <- The original, immutable data dump.
│
...*

虽然这是一个很好的工作框架,但随着我们项目的规模和复杂性的增长,我们觉得我们的方法需要更多的细微差别。

凯卓:它是什么,它有什么帮助

曾几何时,QuantumBlack 交付的每个项目看起来都不一样。人们每次都是从零开始,独立地经历相同的陷阱,再现性是耗时的,并且只有最初项目团队的成员真正理解每个代码库。

进入 Kedro ,这是一个开源的 Python 框架,用于创建可复制、可维护和模块化的数据科学代码。如果你以前从未听说过 Kedro 框架,你可以在这里了解更多

我们用疤痕组织建造了凯卓。

我们需要在我们自己的工作中实施一致性和软件工程最佳实践。Kedro 给了我们将人们从一个项目转移到另一个项目的超能力,这改变了游戏规则。

**工程师中途加入长期运行的 Kedro 项目的现场镜头(【180327-N-VN 584–3279】由美国第七舰队指挥官根据 CC BY-SA 2.0 授权)

在与 Kedro 合作一次后,你可以进入另一个项目,知道代码库是如何构建的,所有东西都在哪里,最重要的是你可以如何提供帮助。

Kedro 是一个专注于 ML 产品开发的开发和实验阶段的框架。它不是以执行“成品”为中心——那被称为“编排”,是我们视为已部署的 Kedro 项目的下游的东西。如果您对如何使用 orchestrators 感兴趣,请阅读我们的部署指南

Cookiecutter 项目的核心观点对我们有巨大的影响,也是我们试图在 Kedro 中体现的东西。Kedro 项目结构的初始前提是扩展 Cookiecutter 目录结构。此外,它还为今天的kedro new命令和 Kedro 启动器功能提供动力。

如前所述,我们发现我们的开发过程需要一组稍微微妙一些的“层”:

*...
├── data
│   ├── 01_raw            <-- Raw immutable data
│   ├── 02_intermediate   <-- Typed data
│   ├── 03_primary        <-- Domain model data
│   ├── 04_feature        <-- Model features
│   ├── 05_model_input    <-- Often called 'master tables'
│   ├── 06_models         <-- Serialised models
│   ├── 07_model_output   <-- Data generated by model runs
│   ├── 08_reporting      <-- Ad hoc descriptive cuts
...*

Kedro 数据层

下面复杂的图表代表了在 Kedro 出现之前这种思维的样子。在我们有标准化的工具来构建我们的管道之前,它是(现在仍然是)处理数据的剧本。

有一套定义良好的规则来确保清楚地了解每一层需要执行哪些任务。

并非所有这些都与今天的 Kedro 相关,但展示了我们更广泛的思维

今天,这已经被简化并转化为 Kedro 的工作模式。下面有一个表格描述了这些是如何工作的,但是我们很快也会带您看一个端到端的例子。

在 Kedro 项目模板中,我们生成了一个实现该约定的文件结构。这在很大程度上是为了引导用户采用这种思维方式——然而,在实践中,我们希望用户将他们的数据存储在云中或数据湖/仓库中。如果你正在寻找一个例子,这是一个开始的好地方!

使用这种方法的另一个主要好处是能够可视化 kedro-viz 中的层,我们关于这个的文档可以在这里找到。

***shuttles**:
  **type**: pandas.ExcelDataSet
  **filepath**: data/01_raw/shuttles.xlsx
  **layer**: raw*

**layer**键可应用于任何目录条目的第一级,并反映数据集将如何在 kedro-viz 中可视化。

关键概念——源与领域数据模型

在 Kedro 世界中,我们称域级数据为primary层……但稍后会详细介绍。

让我们以下面的示例问题为例,讨论源数据模型和域数据模型之间的区别。

工厂里的哪台机器下一步会出故障?

我们从两个raw数据来源开始:

  • Inventory -跟踪可用的设备
  • Maintenance schedule -哪个机械师工作哪个班次

这些数据源不是为分析而设计的,但是两个系统之间的一条线允许我们创建一个与手头问题相关的数据集。

这是使用 kedro-viz 建造的,它可以显示任何 kedro 管道

尽管两个原始数据集是以它们最初设计的任何形状接收的,但是**Machine shutdowns**反映了问题正在被解决。有了这个导出的数据集,我们可以开始评估我们关于停机原因的假设。

将 Kedro 层与 Cookiecutter 数据科学进行比较

最重要的区别是我们如何将“临时”部分分成具有明确职责的不同子部分。作为参考,这里是完整的 Cookiecutter 目录结构

*在 Kedro 中,内部和外部数据之间没有区别

将 Kedro 数据工程惯例应用到一个实际的例子中

在这一节中,我们将把它们都集中在一起。让我们以上述(在概念上,数据是不同的)中的预测性维护示例为例,并将其置于机器学习用例的现实版本中。

实践中的分层思考(《TACC 大脑》作者约安尼斯·n·阿塔纳西亚迪斯授权于 CC BY 2.0 )

在我们开始之前,需要提到两个关键点:

🧢:这是带着数据工程的帽子写的,因此数据科学的工作流程有些简化。所采用的建模方法也是指示性的,而不是一项强有力的工作。
🤷‍♀️:归根结底,这些都是建议,而不是规则——这篇文章旨在将我们的基本原理放在上下文中,但最终你应该自由地遵循这种思维方式,提出你自己的层次,或者完全无视它。

构建管道和整体 ML 用例所必需的数据目前分布在多个系统和业务部门,它们之间很少相互交流。

如果我们能够控制这些数据是如何到达的,它们将被很好地记录、打印和访问。实际上,很典型的情况是,到达的东西不是理想的格式💩。

🔒 01.原始层

️We 从不在这里修改数据,只在副本上工作

在本例中,raw层填充了来自大型分布式组织的数据。存在以下数据源:

  1. 一份基于 Excel 的维护日志,详细记录了机器的维修时间等。
  2. 来自 ERP 系统如 SAP机器操作员列表,描述了哪些操作员在不同时间使用不同的机器。
  3. 来自未知的设备清单 SQL 数据库的静态剪切,提供关于范围内各种机器的其他元数据。该导出以多个部分的形式提供。

现在我们已经设置好了场景—在我们介绍数据如何在各层之间流动之前,请熟悉下面的管道。

使用左侧边栏滑出底部的标签来关注特定层。

🆕 02.中间层

实际上,intermediate层只需要是仍在“源”数据模型中的raw层的类型镜像

  • 一旦intermediate层存在,你永远不必接触raw层,我们消除了与改变原始数据相关的风险。
  • 我们允许对数据进行较小的转换,在本例中,我们将多部分设备摘录合并到一个数据集中,但没有改变数据的结构。
  • 清理列名、解析日期和完全删除null列是这个阶段通常执行的其他“转换”。
  • 我们使用现代的类型化数据格式,比如 Apache Parquet
  • 如果您的数据已经被类型化和结构化,那么从这一点开始是可以的——但是要把它当作不可变的。
  • 从这里而不是从raw层运行管道通常会有性能提升。就计算而言,键入和解析大型 CSV 或 Excel 文件可能是非常重要的活动。
  • 此时应执行概要分析、EDA 和任何数据质量评估。

⚙ 03.初级层

primary层包含针对正在解决的问题而构建的数据集。

  • intermediate层构建了两个领域级数据集,描述了设备关闭操作员操作
  • 这两个primary数据集都是以这样一种方式构建的,即每行描述一个固定时间点的动作/事件,允许我们以直观的方式提出数据问题。
  • 迁移到您的模型的概念在这里非常关键。这是将数据设计成适合分析目的的结构的地方。
  • 此外,当我们在各层之间流动时,冗余的源级数据点将被丢弃,从而简化我们的工作心理模型
  • 由此我们有了一个平台,我们可以用它来构建我们的feature层。

🧩 04。特征层

要素层由位于primary层的输入构建而成。

  • 从前面的primary层专门构建feature表(而不是从intermediate层跳转)被认为是一个好的实践。然而,与 Kedro 中的所有东西一样,这是一个建议,而不是硬性规定。
  • 在成熟的情况下,这些将保存在功能存储中,为用户提供一个版本化的集中位置,为低延迟服务做好准备。
  • 特性通常在一致的聚合级别上进行设计(通常称为分析的'单元或表'粒度')。在本例中,我们可以转换数据,使每一行都对应于一个独特的设备。
  • T 目标变量位于该层内,被视为通用特征。
  • 在本例中,创建的 3 个特征代表了一些变量,这些变量可能是设备停机的预测因素或信号:

a)上次关机和上次维护之间的天数
b)过去 6 个月的维护小时数
c)上次关机后的天数

⚡️ 05.模型输入层

我们觉得“主表”这个术语不够精确,所以选择使用这个术语

  • 在这里,我们将所有的特性结合在一起,为我们的模型创建输入
  • 在实践中,通常要试验多个模型,因此需要多个“模型输入”表。
  • 这里的第一个例子是基于时间序列的表,而另一个表是以设备为中心的表,没有时间元素。
  • 在这个例子中,我们使用一个简单的“脊柱”连接表,以便将每个输入表锚定到正确的“颗粒”/“分析单位”。

🧠 06.模型层

这是训练好的模型被序列化的地方

  • 在本例中,我们有两个模型,为了安全起见,我们将其保存为 pickles
  • 与其他层一样,“模型”层是一个概念性的盒子,有助于在构建管道时组织您团队(或您自己)的思维。
  • 在现代生产环境中,经常可以看到模型注册表在流程的这一点上使用。

🎁 07.模型输出层

各种模型运行的结果在这里直播

  • 在这个例子中,两种不同的建模方法以不同的格式输出推荐和评分结果,这些结果在下游被消费。

📣 08.报告层

在本例中,所执行的特征工程工作也使得向企业提供以前无法获得的维护活动的描述性直升机视图成为可能。

额外加分—在本例中,我们使用了一种高级的模块化管道模式,以便在两种模型中重用相同的数据科学管道(因此采用了镜像结构)。通过这样做,我们可以通过简单地覆盖每个管道的相关输入和输出来重用相同的代码。

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

在现实世界中,数据的设计往往没有考虑到分析。它有助于建立一个框架,将您的数据转换成适合分析的格式,而且,碰巧的是,我们开发了一个框架,帮助我们理解复杂性并避免常见错误。

本文给出了我们如何发展我们的思维的想法,并提供了一个关于 Kedro 的数据约定是如何制定的工作示例。

作为读者,你用什么来指导你的数据工程呢?请在评论中告诉我们!

📦 GitHub
💬不和不和
🐍PyPi🤓阅读文档

你是软件工程师、产品经理、数据科学家还是设计师?你想成为创新产品和技术的多学科团队的一员吗?然后查看我们的 QuantumBlack Labs 页面了解更多信息。

加入 Kedro 社区,成为一名 Kedroid

大数据世界中合成数据的重要性

原文:https://towardsdatascience.com/the-importance-of-synthetic-data-in-the-big-data-world-7e50fc64854f?source=collection_archive---------17-----------------------

对于那些刚刚开始学习合成数据的人,这是一篇介绍性文章

学习合成数据的三个关键要点

布雷特·乔丹在 Unsplash 上的照片

真的是吗?我的意思是,现实是罕见的吗?好吧,如果不是现在,很快就会了。据 Gartner 称,到 2024 年,超过一半的可用数据将是合成的。这是他们在博客文章中的说法。

到 2024 年,用于人工智能和分析项目开发的 60%的数据将是合成生成的

我们应该为此担忧还是欢欣鼓舞?在我看来,我们应该庆祝这个消息!当然,有许多理由为此感到高兴,但首先想到的是数据隐私和安全。因此,在我们的公司和个人生活中,我们都关心这些问题。对公司来说,使用合成数据的一个最重要的好处是,也许人们会使用这些数据,而不是实际数据。然而,从合成数据中获得结果并不容易。现有数据越复杂,生成合成数据就越困难。开发合成数据来代替实际数据给我们带来了我学习这门学科的第一个重要收获。

1.到底什么是合成数据?

至简单来说,合成数据是由算法创建的数据。这意味着它们不是真实的。然而,它们的主要目的是像实际数据一样。例如,假设一家金融公司需要一个更好的算法来检测欺诈,他们请了一家第三方公司来解决这个问题。但是,金融公司不想完全共享他们的交易数据,因为其中包含一些可以识别客户身份的信息。金融公司需要共享他们没有那些敏感部分的数据,第三方公司需要生成合成数据来完成缺失的部分。

此外,第三方公司将综合开发缺失的部分,并生成额外的综合欺诈数据,以使用机器学习算法。这是因为实际的欺诈交易数据在数据集中可能不够大。为了实现一种新的机器学习算法来检测未来的欺诈交易,需要足够大的欺诈交易。

2.为什么合成数据很重要?

有很多理由可以证明合成数据的重要性。然而,我们将在本文中重点讨论三个原因。这三个原因列举如下。

  • 对罕见事件的需求
  • 生产成本低
  • 分享方面的隐私

首先,如果我们考虑第一个原因,对罕见事件的需求,我们记得上一节的例子。一家金融公司需要一种新的算法来检测欺诈交易,这是一个假想的场景。因为欺诈交易可能在巨大的交易池中发生一次,并且需要了解这些交易何时以及如何发生,所以需要合成数据生成来增加测试数据集中欺诈的数量。同样,这样做的主要原因是机器学习算法需要足够的数据来学习,以便在欺诈真的发生时检测到欺诈。

其次,当我们考虑金融机构欺诈交易的成本时,它可能非常高。这里的代价不仅是金钱上的,还有名誉。因此,为了降低这种风险和成本,生成合成欺诈数据,或者让我们称之为假欺诈数据,对于事先模拟在什么条件下会发生什么是至关重要的。当然,生成这种类型的合成数据需要一个开发过程,也需要成本。然而,当我们比较这两个成本时,我的意思是一个是开发成本,另一个是来自实际欺诈交易的成本加上声誉损害的成本,那么显然赢家是显而易见的。

第三,最后但并非最不重要的一点,作为公司和个人,我们都普遍关注隐私!如果我们继续上面的例子,当谈到与另一家公司共享财务数据时,你必须考虑你正在共享的那些数据的特征。如果该数据集包含任何敏感信息,如个人信息,您必须在共享之前删除或屏蔽它们。在这一点上,合成数据的想法来拯救金融公司!屏蔽数据操作是合成数据生成器用来保护这些敏感信息的方法之一。专门为此开发的算法用与原始数据相似的合成数据替换敏感信息。

3.有什么工具可以生成合成数据吗?

在过去的几年里,合成数据提供商的数量增加了。这些公司通过他们的平台和 API 提供服务。由于需求和合成数据的重要性,越来越多的新提供商开始准备在市场上提供这种类型的服务。这里举几个关于隐含公司的例子,你可以在下面找到它们的一些名字和平台链接。

或者,也有开源工具来生成合成数据供您使用。再次举例来说,你可以在下面找到一些例子。但是,您应该知道,使用开源项目可能需要更多的技术知识来安装特定的库并从中受益。

结论

综上所述,合成数据现在无论是对公司,还是对个人都是一种需求。个人如何从中受益仍不明确,但公司已经开始使用这种技术来遵守法规并提高其业务的预测能力。这也是很好的思考一些未来的问题可能会从这篇文章中出现,如;

  • 合成数据会对元宇宙产生什么影响?
  • 合成数据对其他行业有什么好处?
  • 公司怎么会允许个人在个人生活中使用合成数据呢?

我希望你在阅读的时候喜欢它。如果你觉得这篇文章有用,请分享。谢谢大家!

注:你也可以在我的媒体页面查看这篇博文和其他一些有趣的话题。此外,您也可以通过此链接在 LinkedIn 上找到我。

系统适应性对有意义的负责任的人工智能部署的重要性

原文:https://towardsdatascience.com/the-importance-of-systems-adaptability-for-meaningful-responsible-ai-deployment-a14e6ccd0f35?source=collection_archive---------42-----------------------

照片由 Petr Ruzicka 在 Unsplash 上拍摄

到目前为止,我们已经讨论了一些关于如何部署负责任的人工智能的想法,包括“在产品开发中设定目标以实现负责任的人工智能的重要性”、“在人工智能系统中权衡道德、安全和包容性的决定”和“负责任的人工智能的系统设计思维”,这些想法向我们表明,从相邻和相关领域借鉴想法可以帮助将负责任的人工智能变为现实,而不是空想。

让我们利用这篇文章来探索系统适应性的想法,这是另一个可以帮助我们在实践中实现负责任的人工智能的原则。

活力

人类是动态的!(毫无意外!)

我们的经营环境也是如此。

所有的模型都是错的,但有些是有用的。—乔治·博克斯

必要的是,当我们有一个人工智能系统时,我们必须对它将要部署的世界做出一些简化的假设。这样的假设将高保真的真实世界转化为低分辨率的数字世界,我们在那里进行优化,我们希望它们能推广到真实世界。

但是,希望不是策略!(我的意思是技术上我们当然不希望;在发布之前,我们会进行测试、评估、验证和确认。如果你没有这样做,请这样做!)

牢记这一点,我们需要确保我们能够以审慎的方式适应这种动态。我们需要这样做的原因是,在一个动态的世界中,人工智能系统的僵化会导致伦理挑战。

我们举个例子。

考虑一下每季度更新一次的内容审核系统,因为培训和部署成本很高。这可能是因为巨大的成本、不成熟的基础设施,或者团队认为他们不需要更频繁地进行这些更新。或者任何数量的其他原因。那么什么会出错呢?

在一个数字化和互联的世界里,语言(如果我们以单峰内容调节为例)迅速呈现出新的语义。想一想政治运动可以采用一个词成为呼号,或者单词如何在网上变成仇恨言论。这可能在几周内发生。系统的季度更新可能会滞后于现实世界中发生的变化,从而限制其效力,并让仇恨言论在平台上不受限制地蔓延。

非自适应系统或缓慢自适应系统有可能偏离目标,并导致比其在实践中旨在减轻的危害更大的危害。

那么,我们能做些什么来应对这些挑战呢?

如何做到这一点的建议

鉴于我在本文顶部链接的一些文章,这可能看起来很老套,但它值得重复,因为它非常重要:将正确的利益相关者带到桌面上来!在这种情况下,它特别包括社区利益相关者,他们将是系统的主体,以及他们周围可能在管理系统中发挥作用的人。这一点之所以重要,是因为我们永远不知道一个系统将如何在现场准确使用,以及它可能如何被滥用(有意或无意)。将这些利益攸关方聚集在一起的做法将有助于阐明这些关切,并将它们置于中心位置。

内部红队的工作是破坏系统,这也有助于找到系统被滥用的方法。这是安全测试中的常见做法,也应该成为人工智能系统中更常见的事情。机器学习安全领域就是关注这一点的领域。这样的红队也可以帮助对系统进行压力测试,发现系统开始表现不稳定的新方式。这对于运输和医疗等关键任务系统尤为重要。

适应性还来自于快速替换不工作或行为不当的模型的能力。这需要一个成熟的 MLOps 基础架构才能成功。我在“采用人工智能伦理的 MLOps 思维模式”中更多地谈到了这个想法。

期待听到你的意见,谈谈你认为我们可以实现更具系统适应性的其他方式,以进行有意义的负责任的人工智能部署。

了解更多关于我的作品 这里

还有,看看我作为 蒙特利尔人工智能伦理研究所 的一部分发布的 人工智能伦理简报

提升您的 Python 代码:测试的重要性

原文:https://towardsdatascience.com/the-importance-of-testing-your-python-code-9b1262d009dc?source=collection_archive---------33-----------------------

入门

从一次性分析到生产级代码

来源( Unsplash )

为什么要测试?

数据科学中一个经常被忽视的方面是正确测试您的代码。这通常意味着确保它按预期工作,并且没有重大错误。当处理更小的、孤立的编码项目和分析时,编写测试可能不那么重要,有时可能会被完全跳过。随着项目规模和复杂性的增长,越来越多的用户开始与之互动。一切仍然会很好地工作…直到它不工作。

这就是测试的用武之地。编写测试对于维护干净可用的代码是至关重要的。这可能不是数据科学最令人兴奋或迷人的一面,但对于防止以后代码出现问题来说,这肯定是必要的。一个足够大和复杂的代码库将不可避免地包含错误和问题。将这些错误和问题保持在最低限度将在很大程度上取决于测试的全面性。在添加新功能或重构代码时,它也会有所帮助,确保您没有破坏任何您不想破坏的东西。

那么我们从哪里开始呢?对于我们这些没有传统编程背景的人来说,编写测试似乎是一项艰巨的任务。在这篇文章中,我将分解测试 Python 代码的基础知识,并希望在以后消除那些由 bug 引起的头痛。

做出断言

在代码中添加测试的最基本方式是通过assert语句。这个内置的关键字允许你传入一个给定的条件,并检查它是True还是False

assert 1 == 1
>> True

当断言为False时,我们可以在要打印的初始条件后添加一条错误消息。当一个断言条件被评估为False时,就会产生一个错误并显示错误消息。

assert 1 == 2, "The assertion is False"
>> AssertionError: The assertion is False

在您的代码中添加这些简单的 assert 语句对确保一切按预期运行大有帮助。为了说明这一点,让我们假设我们正试图制作一个简单的计算器应用程序。我们为加法和减法定义了两个函数,它们只是简单地将两个数相加和相减。

使用 assert 语句检查函数输出

使用assert语句,我们现在可以验证这两个函数实际上是按照它们的设计进行加减的。

单元测试的进一步发展

Python 有一个名为 unittest 的内置库,专门用于测试你的代码。以之前的计算器应用程序为例,假设我们将这两个函数放在一个名为operations.py的文件中。我们现在将在同一个目录中创建一个名为test_operations.py的新文件来存放我们的测试。这里我们将导入原始的operations.py文件和unittest库。

使用 unittest 库进行基本测试

让我们在这里分解代码。前两行导入了operations.py文件和unittest库。接下来,我们创建一个名为TestOps的类。我们可以随意命名,重要的是我们创建的类必须继承自unittest.TestCase。这个TestCase类为我们提供了几个有用的方法来测试我们的代码。

之后,我们在类中定义了两个方法,每个方法都以单词test为前缀。这很重要,因为它允许 unittest 模块将这些方法中的每一个都标识为单独的测试。如果没有这个前缀,这些方法实际上会被忽略。这两种方法都包含一个变量expectedanswer,前者是我们正在测试的函数的预期输出,后者是运行该函数返回的值。为了通过测试,答案必须与期望值相匹配。

我们还在 unittest 库中看到了可用的方法之一,assertEqual。我们向这个方法传递两个参数,它检查这两个参数是否相等。下面是unittest库中更多最常用的方法。

unittest 库中一些最常用的方法

在这两个方法下面,我们看到了if __name__ == “__main__”:,这意味着只要直接运行test_operations.py模块,if 块中的代码就会运行。最后unittest.main()运行我们模块中的所有测试。

我们的输出从两个时期开始。其中的每一个都代表一个单独的测试,或者在我们的例子中,代表我们类中的每一个方法。这些句点只有在测试成功通过时才会出现。如果测试失败,将会出现一个F。然后我们有一系列破折号,后面是测试运行的总结,包括测试运行了多长时间。在我们的例子中,我们在 0 秒内运行了两个测试。最后是文本OK,表明我们的测试已经全部成功。

测试边缘案例

在编程中,边界情况测试函数或程序的边界。这可能包括向函数传递不寻常的输入,或者传递可能被认为是极端的值(例如,在一个值范围的开始或结束)。在我们的测试中添加不同的边缘案例总是一个好主意,以确保我们的程序在各种条件下都能工作。相信我,从长远来看,花时间写这些边缘案例是值得的。

对于我们的计算器应用程序,边缘情况可能包括使用负数作为输入。我们可能还想处理用户传入非数字输入的情况。让我们为这些添加一些测试,并看看test_operations.py文件的更新版本。

向我们的测试中添加边缘案例

我们在这里修改了文件,删除了expectedanswer变量,并将值直接传递给我们的函数。您可能还注意到,我们在这里使用了一个名为assertRaises的新方法,当我们向函数传递一个字符串和一个整数时,它会检查一个TypeError。这个方法允许我们确保当一组特定的输入被传递给我们的函数时,抛出正确的错误。这有利于输入验证,以确保只接受特定类型的输入。

安装()和拆卸()

setUp()tearDown() 方法允许我们定义在每次测试之前和之后应该立即运行的某些指令。如果我们想在测试之间共享输入,我们可以在计算器示例中使用它。我们可以将它们放在我们的setUp()方法中,而不是在每个测试中单独定义它们。

在测试过程中使用安装和拆卸方法

我们可以从测试运行的输出中看到,setUp()tearDown()方法在每个测试之前和之后都被调用了。我们还将测试输入设置为setUp()方法中的属性。如果我们需要改变我们的测试输入,我们将不得不经历每一个单独的测试。这看起来不像是太多的工作,因为我们总共只有两个测试,但是如果我们有几十甚至几百个测试,你可以想象这将是非常耗时的。

结论

我们已经看到了为您的代码编写测试的重要性,以及一些能够有效地做到这一点的方法。在最基本的层面上,有一个测试条件是否成立的assert语句。在代码的关键区域使用这种方法应该有助于减少将来一些意想不到的错误和问题。我们还介绍了内置的unittest库,它为您提供了强大的方法,如assertEqual来轻松测试您的代码。我们还看了setup()tearDown()方法,它们帮助您在运行测试之前准备好环境,并在每次测试之后关闭环境。你可以用这个库做更多的事情,这只是基础!我希望这能帮助你写出更干净、可维护、无错误的代码。

感谢您的阅读!

您可以通过以下渠道与我联系:

数据科学中的激励问题

原文:https://towardsdatascience.com/the-incentive-problem-in-data-science-1ce4ec57cd86?source=collection_archive---------38-----------------------

了解你为什么喜欢或讨厌数据科学家的工作

卡尔·海尔达尔Unsplash 上拍摄

在过去的几周里,我一直在考虑是接受一个新的数据科学职位,还是彻底离开这个领域。在尝试选择最佳方案时,我发现自己并没有考虑“10 年后我想去哪里”,而是回顾了 10 年前,也就是我接触格雷格·曼昆的《经济学 10 原则》的时候。具体来说,他的第四个是最重要的。

原则#4:人们对激励的反应

在仔细思考这一原则以及它与我在数据科学领域接受新工作的决定之间的关系时,我有了以下问题:

作为一名数据科学家,以及更广泛的数据科学家角色,我有什么激励措施?

免责声明:就本文而言,我所说的数据科学家是指其职位为“…与利益相关者一起影响我们最有影响力的业务决策”的人我说的是 Cassie Kozyrkov 概述的角色(分析师/专家分析师/统计学家/数据科学家)

为了回答这个问题,我为一个数据科学家绘制了一个激励框架(从我的角度;您的里程可能会有所不同)。

这一框架中概述的五种激励措施中的每一种都会在两个维度上有所不同:基于工作地点的突出度和基于个人偏好的重要性。作为这项练习的一部分,我将每项激励对我和我当前工作场所的相关性和重要性从 1(低)到 5(高)进行了排序。考虑换工作的读者可能会发现这个练习很有用。

数据科学家的激励框架

回答问题(突出:3;重要性 3)

曾经在课堂上第一个向空中开枪的数据科学家会理解这种激励(我承认,我就是这些学生中的一员)。如果你被这种激励所驱使,你会更倾向于享受即席分析或仪表板创建工作流。这种激励的问题是它通常是短暂的。一旦你回答了问题,它就消失了。所以,如果你被这种感觉所激励,并且你得到即席提问的几率很低,你现在的角色可能不太适合。

为你的论点获得认同(突出:1;重要性 4)

从他们工作的讲述故事方面得到乐趣的数据科学家最有可能被这种激励所驱使。我被获得认同的感觉所激励,然而我的工作并不经常专注于交流数据驱动的论点,目的是影响具体的决策。这里的另一个细微差别是,有时数据科学家会被这种独立于围绕论点的上下文的感觉所激励,而其他人可能需要对论点的上下文真正感兴趣或投入。

例如,如果我对提高电子邮件点击率的想法没有动力,我可能不会有足够的动力来提出一个强有力的论点来改变电子邮件的美学以提高点击率。

加薪/升职/不被解雇(突出:4;重要性 4)

这些外在动机并不是数据科学家独有的,但我认为,相对于其他类型的角色,它们对数据科学家的影响力减弱了。这有几个原因。

首先,数据科学处于萌芽阶段,因此,职业轨迹并不十分清晰。两种常见的途径是“人事经理”和“个人贡献者”(ICs)。从 IC 到人事经理,工作职能肯定会有更多的变化,但一旦你管理了一个数据科学家团队,职业阶梯上就没有明确的下一个目标了。

这与我的第二个原因有关,即外部激励因素对数据科学家的影响较小——这些团队通常(但并不总是)对公司收入的直接影响较小,因此他们往往规模较小,在领导层中的席位也较少。

建筑材料…主要是为你自己(突出:5;重要性 2)

受天生的学术好奇心驱使的数据科学家将最强烈地感受到这种激励。解决构建预测模型或大型仪表板带来的小问题可能会很有趣。想想为家常菜剁碎食材所带来的内在快乐。现在想象一下这个场景:在准备了一顿美味的饭菜后,50 次中有 49 次全部被扔进了垃圾桶,只有 50 次中有 1 次有人会享受到你的劳动成果。剁碎这些蔬菜你会有多兴奋?

Unsplash 上的 Max Delsid 拍摄的照片

数据科学工作远不像切菜那么简单,它可能需要找到复杂的技术、实践和哲学问题的解决方案。因此,这种激励的力量不仅仅取决于个人,还取决于他们正在解决的问题类型。

为别人做事(突出:4;重要性 4)

这种动机可以是内在的,也可以是外在的。知道自己在帮助别人,感觉真好。将他们需要的可视化整合在一起,或者构建一个销售线索评分模型来帮助销售团队赢得更多交易(并提高他们的佣金!)——送过来的时候就是感觉很好。类似于帮助你的朋友搬出他们的公寓,这可能是一个拖累,但知道你帮了忙感觉很好。同样,这不是数据科学角色独有的,事实上,我认为这种激励是任何团队固有的。然而,鉴于数据技能的缺乏以及数据在企业各个部分的无处不在,目前数据科学家比其他工作职能部门更经常地为他人提供服务。

委托代理问题

考虑到这个激励框架,我更好地理解了为什么文章会像一样突然出现。这就是为什么这么多数据科学家离开他们的工作岗位 (52K 掌声中等!).这个领域没有吸引合适的人来解决合适的问题。

这是一个经典的 委托代理问题 信息不对称加剧了这一问题。好吧,这是一个术语——让我们从不对称信息部分开始,把这句话分解开来。

不对称信息

数据科学家带着(几乎肯定是错误的)对他们工作的预期开始工作。与数据科学团队一起工作的人会对数据科学家的工作有另一种(也可能是错误的)期望。

真正糟糕的委托代理问题

有着一系列期望的数据科学家将根据他们自己的激励结构采取行动(例如上述五种激励的某种分布)。数据科学家合作的团队也将有自己的一套激励机制,这些机制可以是多种多样的(想想产品经理和销售代表的激励机制)。当双方的激励机制没有朝着相同的目标发展时,我们就会错过创造商业价值的机会,团队会感到沮丧,员工也会不开心。

如果你是一名数据科学家,这可能会帮助你更好地理解为什么你喜欢你目前的角色,或者对你目前的角色感到沮丧。如果你在工作中不开心,我建议你进行类似的练习。你可能会发现你的动机严重错位,也许是时候改变了,不管是一家新公司还是一份新的工作。

复杂性的劣势

原文:https://towardsdatascience.com/the-inferiority-of-complexity-5f9f15da910f?source=collection_archive---------29-----------------------

思想和理论

为什么快速和简单的试探法做得更好

照片由 Renith RUnsplash 上拍摄

在诺贝尔奖得主哈里·马科维茨(Harry Markowitz)发展现代投资组合理论的七年后,均值-方差优化仍然是投资组合选择方法的基石,也是基金经理统计工具箱的关键组成部分。对于寻求最小化波动性和增加回报的当代投资者来说,多元回归和均值-方差优化的标准组合是当今的主流。复杂性带来了安慰,全球顶级商学院开发的大量统计策略为寻求理性和统计逻辑保证的基金经理提供了避难所。但投资者的水晶球被复杂性蒙上阴影了吗?

进入,快速和节俭的启发式。尽管有令人信服的计算,可靠的公式和常见但复杂的统计方法背后的基本原理,快速和节俭的试探法为这种计算昂贵的策略提供了一种令人耳目一新的替代方案。快速,因为它们的使用使决策能够快速做出节俭,因为决策通常是通过忽略除部分可用信息(预测)之外的所有信息做出的。通过将计算简化为简单透明的方法,启发式方法可以比复杂的方法更快地做出决策,并且使用更少的信息。

试探法并不新鲜,众所周知,我们在决策中经常依赖它们,这是我们有限理性的一个假设结果,即由于内在和环境的限制,我们做出理性决策的能力有限。在人类(和其他动物)中使用启发法通常是本能的,并作为次优策略被容忍,这是时间和准确性之间的必要权衡。然而,简单的试探法已经在体育、医学、金融和政治等领域取得了预测性的成功。在 2006 年,Scheibehenne 和 brder 发现使用认知启发式的业余选手比专家更能成功预测温布尔登的结果,同样,在 1997 年, Green 和 Mehr 发现医生使用快速和节俭的树木比复杂的替代品更能准确预测心脏病发作。

没有什么地方比吉杰伦泽、卡尼曼和特沃斯基的作品更能引起关于启发式的争论了。在这里,人类决策中的偏见被认为要么是朋友,要么是敌人,要么是一个起作用的因素,要么是一个重大的非理性影响,只有通过使用统计和逻辑才能减轻。

在我们继续之前,我将回头向精通统计学的投资者介绍一个熟悉的权衡启发法:1/NT4 法则。被称为平等启发式,它可以应用在资源分配的情况下,在 N 个选项之间平均分配资源,因此, 1/N 。我在图 1 中用比萨饼和盘子表示了这一点。表面上看,这似乎是一种不合理的方法,但在 DeMigeul 等人的研究中,这种方法与 14 种备选投资策略进行了对比。使用夏普比率,non 的表现始终优于 1/N 。事实上,当用 25 种资产的 250 年训练数据进行评估时,只有 Markowitz 的均值-方差成功。然而,这并不是说 1/N 应该是首选,只是说在某些环境和情况下,简单的启发法可以胜过复杂的策略。事实上,Markowitz 自己也依靠这个简单的启发式方法进行投资。注意,这里没有复杂的安慰。

图一。用披萨解释 1/N 法则。注意,这里没有复杂的安慰。

为什么简单的启发式策略能胜过更复杂的策略?答案不一定在于启发法本身,而在于它们被运用的环境的本质。

不确定情况下的理性

新古典经济学以理性为基础。在这种理性范式中,决策是通过考虑所有相关结果、其后果和可能性而做出的。这是商学院熟悉的逻辑世界,一个充满风险的世界,未来是确定的,优化是王道。在一个充满风险的世界里,启发式是第二好的。

在赌场之外,完美的知识和确定性的情况是罕见的。1954 年,野人大世界中描述了这种情景对比。在小世界里,结果是可知和可解释的——想想轮盘赌;在大千世界中,未来是不确定的,尽管有信息的限制,还是必须做出决定。在 Incerto 中,纳西姆·尼古拉斯·塔勒布把决策策略的应用,在我们小世界学术实验室里始乱终弃到大世界的情形称为卢迪谬误。描述不可能满足复杂预测策略的要求,并强调未知因素对此类模型造成的危险。在大千世界中,理性决策的基础是不现实的。

所以,大世界是启发法的发源地。更少的线索和更少的数据可以带来更好的结果:启发式不是次优策略。

预测:少即是多

简单的启发违反了我们的理性观念。我们已经看到,至少在一种情况下,简单的东西可以做得更好,最复杂的策略不一定是最好的。为了进一步探索这一点,并扩大我们对启发法是受欢迎的决策策略的情况的理解,我试图复制心理名人 Gigerenzer 和 Todd 在 1999 年的发现,他们的书:简单的启发法使我们聪明。但是在我开始之前,请记住启发式(al)成功的几个条件:

  • 当有很多可预测的不确定性时,试探法工作得很好;
  • 当有多种选择时;和
  • 学习机会少的时候。

这些条件不仅导致简单方法的成功,也导致许多复杂方法的失败。在复杂的策略中,预测的不确定性意味着准确假设的可能性很小(或者说,不准确假设的可能性更大),大量的选择意味着需要估计更多的参数(这样做会产生更多的错误),最后,较少的学习机会意味着较差的概括。

让我们简单地浏览一下模型复杂性。通常,复杂性可以被认为是模型中自由参数的数量;它们是我们知道的变量,量化和估计权重,取决于它们的影响。具有大量变量的复杂模型需要更多的估计,而更多的估计会产生更多的错误机会(尤其是如果我们使用的数据有一点大噪音的话)。因此,这些模型往往会过度拟合——这是偏差-方差困境的产物。如果你不熟悉,你可以在这里阅读困扰机器学习的权衡。现在,只需知道过度拟合通常等于预测不佳,产生图 2 中那种倒置的 U 形函数。节俭模型受益于它们的高偏差和缺乏方差,产生更好的预测和剔除噪音中的信号。

图二。模型精度(在拟合和预测中)与复杂性(模型中估计的自由参数的数量)。改编自皮特和明(2002)

简单试探法的速度、准确性和节俭性允许创建健壮的预测策略。在本例中,我们将基于九个二元预测值来考察四种策略在拟合和预测 83 个德国城市人口时的稳健性(图 3)。

考虑的策略包括多元回归,一种典型的统计方法,以及学习更少变量和搜索更少线索的试探法:

多元回归 是计算开销最大的策略,我们会考虑我们的“复杂模型”。它通过寻找数据点和一个超平面(想想:线)之间的最小平方距离来创建一个函数。

取优 是一种快速而节俭的启发式方法。它根据重要性对线索进行排序,并选择最好的线索(最成功地区分所有其他线索的线索)——这是一种非补偿性策略。也就是一个好理由。

道斯法则 ,像回归但更快。它只分配+1 或-1,而不是找到最佳的参数权重。不节俭。

极简主义者 ,喜欢博采众长但没有最初的排名。非常快;节俭。

图 3。各种模型在拟合[1]和预测[2]德国城市人口时的稳健性,转载自 Gigerenzer 和 Todd (1999)。取优(FF)试探法在预测方面比回归法表现更好,线索更少。

结果(不)令人惊讶。回归法是最彻底的方法,它搜索所有的线索,分配权重,并以 75%的准确度创建最佳拟合。在预测中,回归法是第二差的,比最简方法高几个百分点,最简方法随机选择一个线索并坚持下去。两种试探法:取最佳法和道斯法则名列前茅,取最佳法的预测准确率约为 72%。但这有什么大惊小怪的?回归预测仍然达到了可观的 71%。

计算密集型策略是昂贵的,并且启发式算法因偏爱时间而不是准确性而声名狼藉。这些结果表明,事实并非总是如此。在某些情况下,你可以通过更少的努力做出更准确的预测。在简单策略和复杂策略一样成功的情况下,节省时间(和金钱)是有意义的!).

另一个促进使用启发式的重要环境因素是学习机会很少。在现实世界中,人们的决定会受到他们的经验的影响,他们所学到的会影响他们的行为。事实上,这在各种情况下可能意味着很多事情,并且通常被认为是一种不必要的偏见,是人类决策的易错性和局限性的典范,但现在,让我们将学习机会视为我们数据集的大小——这是我们为了建立模型和产生预测而必须处理的数据量。

为了了解学习机会如何影响模型的预测准确性,我再次尝试重现 Gigerenzer 和 Todd 的发现,使用与之前相同的模型,评估它们在各种规模的训练数据中的准确性(图 4)。

图 4。各种模型在不同规模训练集上预测德国城市人口的通用性。除了训练集超过 80%的可用数据之外,在所有情况下,快速而简单的启发式算法都比回归算法表现得更好。在训练集的补充上测试策略。转载自吉杰伦泽和托德(1999)。

同样,没有惊喜。我们在这里看到的是少即是多的效果,用更少的数据和更少的计算做出更准确的决策,而不是更多。

在训练数据超过我们可用数据的 80%之前,我们的复杂模型至少输给了一个简单的启发式算法。这是不现实的。在风险的世界里,我们知道样本空间;在这个不确定的世界里,我们知道的很少。正是在这里,启发式的简单性发挥了作用,在信息非常有限的情况下,可以快速轻松地做出准确的决策。值得注意的是,在可用数据量增加 9 倍的情况下,取最佳(我们的 A*启发式方法)只能将预测性能提高 6 个百分点。

在不确定的情况下,复杂模型的预测准确性较差,这与卡尼曼等学者的工作中理性的假定优势形成了鲜明对比,卡尼曼领导了(反)启发式辩论,声称他们的偏见和节俭是我们的非理性和有限系统的产物 1,而不是支持他们的环境成功。当然,当代计算技术的进步和对启发式的研究已经允许以前只被理解为本能和天真的策略被量化和分析。在有些情况下,复杂的策略非常成功,而在另一些情况下,忽视简单快速的启发式实现是一个代价高昂的疏忽,如果不是潜在有害的话。通过生态理性的概念可以更好地理解这些情况。

生态合理性

用更少的信息、更少的资源和更少的时间可以做出更好的决策。由于大世界是真实的世界,面对不确定性时启发式的有效性使它们成为必要的决策工具。但是,试探法的使用应该在适合成功结果的环境中进行,换句话说,在生态合理的环境中使用。

生态理性可以帮助我们决定是否最好选择复杂的统计策略,而不是快速和节俭的策略,反之亦然。在管理决策的背景下,他们的研究发现启发式策略并不次于理性策略。

不是所有的结果、选择和可能性都是已知的;给定最少的数据和大量的选择,快速和节俭的试探法的鲁棒性提供了一个生态理性的选择。我们都满意的一个例子是资源的分配,这里我们已经看到 1/N 是生态理性的,因为预测的不确定性,一个大的 N 和缺乏有意义的学习机会。

复杂策略长期以来饱受过度拟合之苦。在人员选择、资源分配、急救医学、政治和体育预测的情况下,启发式是有效的决策工具。这些都是不确定的情况,通常伪装成风险,预测比事后诸葛亮更重要,在某些情况下,启发式的透明度和可记忆性以一种计算昂贵的方法无法比拟的方式帮助人类决策。

注释、参考文献和推荐读物

我高度推荐我最喜欢的两本书,作为对风险、决策科学和统计学感兴趣的人的必读书: 纳西姆·尼古拉斯·塔勒布的《黑天鹅 (2008】和 思考,丹尼·卡尼曼的《快与慢 (2013】)。

Gerd Gigerenzer 领导了一些令人难以置信的启发式研究,但它相当沉重,所以这里有一个链接到一个 TED 演讲。你会看到他讨论了 1/N,并回顾了我写过的简单启发法。

引用我找不到链接的资源:

Gigerenzer,g .和 Todd,P.M. (1999 年)。使我们变聪明的简单启发法。牛津大学出版社。

Gigerenzer,G. (2008 年)。凡人的理性:人们如何应对不确定性。牛津大学出版社。

posted @ 2024-10-16 09:04  绝不原创的飞龙  阅读(395)  评论(0)    收藏  举报