TowardsDataScience-博客中文翻译-2021-九十七-

TowardsDataScience 博客中文翻译 2021(九十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

关于东南亚的新冠肺炎,有哪些公开数据可以告诉你(除了病例数之外)

原文:https://towardsdatascience.com/what-open-data-can-tell-you-about-covid-19-in-southeast-asia-besides-number-of-cases-6bea0d3d51d?source=collection_archive---------39-----------------------

变更数据

#社会影响数据:东南亚新冠肺炎应对数据仪表板及分析

联合国开发计划署亚太地区区域创新中心 UNV 在线志愿服务在线志愿者邓华。

概述

自新冠肺炎开始以来,有大量仪表板帮助了解疫情的进展情况,其中大部分侧重于公共卫生数据。然而,疫情不仅仅是一场健康危机。它还对人们的福祉构成了从流动性到就业的社会经济风险。事实上,我们看到越来越多、种类越来越多的开放数据源也有很大的潜力来揭示这些方面,这可以加深我们对新冠肺炎影响的理解。将不同的开放数据源结合在一起,我们能够提供丰富的内容并提取有用的见解。

我们对新冠肺炎如何影响人们流动性的问题很感兴趣;尤其是在封锁政策下。这引导我们回顾谷歌移动数据,这是关于人们在不同类型的地点移动的活跃程度,包括工作场所、中转站、杂货店和其他地方。我们将流动模式与遏制政策和疫情进步联系起来。此外,由于政策的有效实施也受到人们遵守和改变行为的意愿的影响,我们还研究了由于新冠肺炎引起的人口行为和态度转变的调查数据。为了将这一分析置于背景中,我们对菲律宾、越南和泰国进行了案例研究,在这些国家,不同的政府应对措施导致了不同的后果。

该分析利用多个开放数据源在 Tableau 中提供一个交互式可视化仪表板。仪表板可以帮助领域专家访问开放的数据,并通过提供切片数据和钻取到不同地理粒度级别的灵活性来轻松获得洞察力。这是仪表盘的链接,我们希望你能喜欢玩它。

作者图片

注:以下分析主要基于 2020 年 9 月前的情况。

见解:隔离政策——时间、地点和方式

为了减少新冠肺炎病毒的传播,隔离是一项普遍实施的政策。但是,在何时、何地以及如何实施检疫政策方面,没有“一刀切”的做法。隔离策略需要与环境相关联,并且足够敏捷以响应快速变化的环境。在此,我们将深入探讨三个东南亚国家--菲律宾、越南和泰国的检疫政策,作为案例研究,讨论他们的良好做法和教训。

菲律宾:长时间的隔离政策在保持低水平的流动性方面变得不那么有效。

菲律宾的检疫政策在不同的阶段和地点以不同的严格程度实施。这里我们重点关注首都地区(NCR),因为这是菲律宾受灾最严重的地区。

菲律宾有四种检疫政策,严格程度从高到低依次为:强化社区检疫(ECQ)>改良强化社区检疫(MECQ)>普通社区检疫(GCQ)>改良普通社区检疫(MGCQ)。到目前为止,NCR 的检疫政策可以概括为五个阶段,你可以在下面的图表中找到详细的时间表。

作者图片

从上图中,当我们比较第 2 阶段与第 1 阶段(ECQ)以及第 5 阶段与第 3 阶段(MECQ)时,我们应该注意到,即使在相同的隔离政策下,与前一阶段相比,后一阶段的移动性水平通常无法保持较低。

虽然我们不能做出因果推断,因为可能有其他因素影响迁移率,但我们怀疑隔离的影响随着隔离时间的延长而减弱。首先,隔离时间越长,经济成本越高,人们没有足够的积蓄负担在家里呆太久。根据世界银行的数据,与包括印度尼西亚、新加坡、马来西亚、泰国和越南在内的其他东南亚国家相比,菲律宾的国内储蓄总额最低。这也是为什么 NCR 在 8 月份被划归 MECQ,尽管医护人员呼吁 ECQ。只有少数人有存款以备不时之需?嗯,我们的积蓄只是毛毛雨,”杜特尔特总统说马尼拉被封锁的贫民窟的状况也令人担忧,那里的人们担心他们是否会死于饥饿而不是病毒。

第二,民众对政府的处理方式逐渐失去了信心,这一点得到了 YouGov 新冠肺炎追踪数据的支持(见下表,每个调查时间段每个国家的样本量约为 1000 人)。调查结果显示,与其他东南亚国家相比,越来越少的人认为政府对冠状病毒的处理非常好或比较好。人们可能越来越不愿意遵守严格的检疫政策,因为他们只看到这样做的不确定的好处。

图片来自 YouGov

根据最近的研究 [1],“适当的非药物干预措施组合对于遏制病毒传播是必要的”,并且“破坏性较小且成本较高的非药物干预措施可以与更具侵入性、更激烈的干预措施(例如全国封锁)一样有效。”事实上,由于最初几个月实行了非常严格的封锁,菲律宾在后期调整政策以应对新情况的空间似乎更小了。从 6 月 1 日到 8 月 3 日,NCR 被 GCQ 统治了两个多月。随着 7 月中旬创纪录的 2000 多个新病例,隔离政策方面没有任何变化,直到 8 月 4 日,医疗保健部门警告医院几乎达到饱和,并呼吁进行更严格的隔离。这一次,虽然建议将 NCR 置于 ECQ 之下,但政府只能以 MECQ 告终。事实上,对一些人来说,“即使只是两周,对我们来说也很难”,而且“我们可能会挨饿”,根据路透社的报道

作者图片

V

根据 YouGov 的调查,越南人对隔离表现出非常独特的行为和态度。如果公共卫生当局建议进行自我隔离,越南人非常愿意,并且觉得这样做很容易。然而,关于他们每天与多少人有密切的身体接触以及离开家多少次,越南人表现出不太谨慎的态度。菲律宾的情况正好相反,他们不太愿意也觉得很难自我孤立,同时非常谨慎,很少与人见面,也不经常外出。这是非常反直觉的,不是吗?

为了解释这种反差,我们应该把它放在它们不同的检疫政策和整体政府反应的背景下。越南政府采取了针对性的封锁和其他措施来有效控制疫情,他们很快就恢复了正常。尽管 8 月份出现了一点反弹,但在短短一个月内就得到很好的控制。因此,在越南的人们没有遭受太多的隔离,并对政府的处理建立了信任。在与人交往和外出方面已经没有必要过于紧张,但他们愿意并觉得如果必要的话很容易自我隔离。与此同时,菲律宾人的情况正好相反。

作者图片

在与新冠肺炎的战斗中,越南的确是一个典范,我们的数据世界已经全面总结了越南的故事。值得注意的是,越南的目标隔离是基于流行病学风险,而不是症状或区域水平的病例数据。因此,他们可以将封锁限制在街道、村庄、社区和地区级别,影响尽可能少的人,但有效地管理风险。越南只有一个全国范围的封锁,最初设定为 15 天,然后在 63 个省中的 28 个省延长至 21 天。

T

也有很多关于是什么让泰国成为应对疫情的典范的讨论。在这里,我们想举一个具体的例子,说明泰国是如何设计宵禁政策的,以展示其灵活的决策。

简单介绍一下泰国实施宵禁的时间表:

这就像通过逐步评估公众反应和疫情局势来试水,这降低了风险,允许进行调整,并帮助人们平稳过渡。

作者图片

我们可以使用牛津大学的新冠肺炎政府反应跟踪系统的数据,从宏观的角度来讨论政策制定的速度。在这一数据来源中,各国政府的应对措施被分为不同的类别,并按所采取措施的数量和严格程度进行量化。在这里,我们来看看“遏制与健康指数”,它包括遏制与关闭政策和卫生系统政策。在图表上,菲律宾的污染控制和健康指数在短短几天内就飙升至近 100。与此同时,泰国总是迅速做出小的调整,以寻求当时最佳的一揽子政策。看看越南的曲线也很有意思,它与我们在上一节讨论的内容一致——政府很早就开始应对,并试图控制受影响人口的规模;全国范围的封锁在 4 月份被强制执行,以消除风险,但再次被限制在一个可承受和可管理的时期,比菲律宾的封锁短得多。

总结

通过对菲律宾、越南和泰国的案例研究,我们学到了一些关于何时、何地以及如何实施检疫政策的经验。

  • 何时——期限不能太长,超过人口的承受能力,否则政策的效果会随着时间的推移而减弱。
  • 哪里—没有其他配套措施的全国范围的封锁不会达到预期的好处,而是会造成广泛的危害,而有针对性的封锁会更有效,造成的负面影响更小。
  • 如何——灵活制定政策,进行适应性规划和持续改进。最好不要突然实施过于严厉的政策,因为公民可能还没有准备好,可能会做出混乱的反应,这可能会导致更糟糕的情况。

感谢您的阅读!我们希望我们的分析能够激发更多的问题和分析,我们强烈建议您亲自探索 仪表盘 以获得更多见解!

特别感谢联合国开发计划署区域创新中心数据与影响管理顾问刘淑敏对项目的监督和给予我的大力支持!

附录:数据

私营部门

NGO

学术机构

政府

  • 菲律宾卫生部,《新冠肺炎跟踪报告:菲律宾分区域详细数据》。

附录:参考文献

[1] Haug,n .,Geyrhofer,l .,Londei,A. 对世界范围内新冠肺炎政府干预的有效性进行排名。Nat Hum Behav (2020)。https://doi.org/10.1038/s41562-020-01009-0

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

关于机器学习,神奇宝贝能教会你什么

原文:https://towardsdatascience.com/what-pokémons-can-teach-you-about-machine-learning-d72586c4b202?source=collection_archive---------40-----------------------

简单的数据集消除了学习数据科学等复杂主题时不必要的困难

Unsplash 上拍照

机器学习是数据科学的一个分支,专门让计算机在没有明确编程的情况下行动【1】。最近,机器学习给了我们无人驾驶汽车、精确的网络搜索、实用的语音识别以及对遗传学的大量了解。机器学习是如此相关,以至于你可能一天用很多次都没有注意到。因此,机器学习专业知识在多个行业的兴起并不令人惊讶。

然而,机器学习并不是一个容易学习的话题。它需要相当高的数学和统计学水平,更不用说编程技能了。尽管如此,为了达到你熟悉和舒适地使用机器学习的程度,你必须开始尽可能多地让自己接触这个话题。但是,对于初学者来说,很难找到一个简单的例子。

大多数时候,学生必须处理机器学习的理论方面和问题的特定部分(例如预测股票价格时金融市场中使用的术语)。因此,学生可能会被破译行业的特殊性所淹没,以理解手头的机器学习问题。为此,我使用一个学生友好的机器学习示例创建了一个 Kaggle 数据集

为什么是神奇宝贝?

因为它比任何其他现实生活中的例子都简单,也不复杂,所以您在学习数据科学和机器学习时会遇到。神奇宝贝是虚构的生物,每个都有独特的特征、能力和技能【3】。神奇宝贝被训练成互相战斗(就像拳击或空手道一样)。由于其特点的组合,其中一些更有可能赢得战斗。然而,少数种类的神奇宝贝非常强大,可以击败大多数对手。这些稀有而强大的生物被称为传说中的神奇宝贝。

考虑到这一点,我们将把机器学习算法应用于每个物种的特征、能力和技能,以预测 Pókemon 是否具有传奇色彩。所以,现在,检查下面的步骤。

Unsplash 上由 Lia Panidara 拍摄的照片

机器学习循序渐进

理想情况下,您需要两个数据集。第一个称为训练数据集,是神奇宝贝及其特征的列表。还会对每个物种的神奇宝贝是否传奇进行分类。在机器学习的术语中,传说中的神奇宝贝将是‘1’,而非传说中的神奇宝贝将是‘0’(零)。我们的机器学习将查看这个列表,并交叉检查传奇和非传奇神奇宝贝的数据点之间是否有相似之处。您将训练您的计算机识别传说中的神奇宝贝,因此数据集的名称。

第二个数据集称为测试数据集,应该是一个单独的文件,包含类似的神奇宝贝列表。然而,测试数据集并没有显示神奇宝贝是否是传奇。一旦我们在训练数据集上排序了我们的算法,我们将在测试数据集上测试它,看看我们的模型预测传奇神奇宝贝的效果如何。

结果将是一个百分比;例如,81.3%的确定性一个神奇宝贝物种是传奇。剧透预警:几乎可以肯定的是,在现实生活的案例上你永远达不到 100%的把握,所以不要气馁勇往直前。尽你最大的努力。

准备数据

为了让你的学习过程更加高效,我已经清理了数据,这样你就不用浪费时间整理列和空值了。我是这样做的:

数据分析

在本节中,我们将分析与'is generic '相关的不同特征之间的关系。各种组件之间的关联热图可能会有所帮助:

  • 正数 =正相关,增加一个特征会增加另一个特征&反之亦然。
  • 负数 =负相关,一个特征的增加会减少另一个特征&反之亦然。

在我们的例子中,我们关注的是哪些特性与传说中的特性有很强的正相关或负相关。

作者创建的热图

看来,‘攻击、‘防御、‘捕捉率等特性与传奇性的关联度很高。这些特性可能对我们以后的模型有用,所以,让我们记住它们。

现在,让我们仔细看看与 isLegendary 密切相关的另外两个特征。

似乎大多数传说中的神奇宝贝也是飞行型的,其次是龙型的。没有传说中的毒药,战斗或昆虫类型。尽管如此, Type_1 特征对于预测传说中的神奇宝贝还是很有用的。和 Type_1 一样, Type_2 可以帮助预测传说中的神奇宝贝。

特征提取

在过程的这一步,我们希望只提取对我们的机器学习模型有用的特征(如上所述)。此外,我们必须使我们的模型更容易读取数据点并进行必要的计算。因此,我们必须转换每个数据集…

作者创建的表格

对此…

作者创建的表格

虽然采取这一步骤没有秘密可言,但是没有理由在介质上进行数据准备过程。所以,我已经在我的 Kaggle 页面上为你勾勒出了它的轮廓。现在,我们可以转到有趣的部分,机器学习。

机器学习

最后,我们已经到了机器学习这一步。有许多算法,但我们将只应用一些最常用的分类算法来预测传奇的神奇宝贝:

  • 逻辑回归
  • k-最近邻(KNN)
  • 决策图表
  • 随机森林
  • 朴素贝叶斯

以下是培训和测试程序:

首先,我们将定义数据集,并用我们的训练数据训练这些分类器。此外,导入必要的模块。

其次,利用训练好的分类器,我们将从测试数据中预测传说中的结局。

逻辑回归

逻辑回归是因变量(DV)为分类变量的模型。它涵盖了二元因变量的情况—例如,它只能取两个值,“0”和“1”。这些案例代表了赢/输、死/活和传奇/非传奇等结果。

k-最近邻

k-最近邻算法( k NN)是用于分类和回归的最简单的机器学习算法之一。在 k NN 分类中,我们得到的输出是一个类成员关系。该类意味着输入将获得与其大多数邻居相同的分类。数据点被分配到其最近邻居中最常见的类别。k 是邻居的个数,所以必须是正整数(通常是个小数字)。如果 k=1,则该对象被给予该单个最近邻的类。换句话说:

如果它有一条尾巴,四条腿,还会叫,那么它很可能是一只狗。

决策图表

决策树是类似流程图的结构,其中每个内部节点代表对某个属性的“测试”。在我们的例子中,神奇宝贝是龙型的还是电动型的。每个分支代表测试的结果,每个叶节点代表考虑所有属性后的决定。因此,从根到叶的每条路径代表一个分类规则。

随机森林

随机森林是一种分类的分组学习方法,通过构建几个决策树来工作。随机森林输出的类是类(分类)的模式或个体树的均值预测(回归)。随机决策树纠正了决策树过度适应训练集的缺点。

高斯朴素贝叶斯

朴素贝叶斯是一个简单的概率分类器,基于著名的贝叶斯定理,在特征之间具有强(朴素)独立性假设。

贝叶斯定理描述了一个事件的概率,基于可能与事件【4】相关的条件的先验知识。换句话说,贝叶斯**定理是在我们知道某些其他概率的情况下,寻找一个概率的一种方法。例如,假设新冠肺炎与年龄有关。在这种情况下,一个人的年龄可以用来评估一个人有新冠肺炎的可能性,这比在不知道这个人的年龄的情况下评估新冠肺炎的可能性更准确。

所有朴素贝叶斯分类器都假设,给定类变量,特定特征的值独立于任何其他属性的值。例如,如果一个水果是橙色的,圆形的,大约 7 厘米大,那么它可以被认为是橙子。朴素贝叶斯分类器认为每个特征独立地贡献了该水果是橙子的概率,而不考虑颜色、圆度和直径特征之间的任何可能的相关性。

最后,我们将计算每个训练好的分类器的准确率分数(百分比)。

作者创建的表格

我们可以看到,决策树和随机森林分类器的准确率最高。然而,我们选择随机森林分类器,因为它可以限制过拟合,而决策树分类器不能。因此,下一次有人创造一个新的神奇宝贝,我们可以应用我们的随机森林分类器以 86.2%的把握预测这个新生物是否是传奇。

结论

如今,机器学习就在我们身边。它将继续为困难的分类和预测问题提供创新的解决方案。的确,这不是一个容易学的题目。尽管如此,在大多数情况下,由于现实生活中的例子,这可能会更加令人生畏,这需要对行业有一定程度的熟悉(例如股票市场)。对于想要了解分类在最基础层面上如何工作的数据科学家和机器学习学生来说,神奇宝贝派上了用场。专家可能会批评 86.2%的准确率不够。尽管如此,本文的主要目标是带您了解机器学习项目背后的基本原理。我希望你受到鼓励去参加神奇宝贝挑战。最终,这些挑战会让你更加适应机器学习。你准备好了吗?

感谢阅读。这里有一些你可能会喜欢的文章:

参考文献:

【1】骏马https://www.coursera.org/learn/machine-learning】T2

【2】KD 掘金https://www . KD Nuggets . com/2020/11/rise-machine-learning-engineer . html .

【3】神奇宝贝https://www.pokemon.com/uk/pokedex/

【4】贝叶斯定理https://en.wikipedia.org/wiki/Bayes%27_theorem

你的数据在解决什么问题?

原文:https://towardsdatascience.com/what-problem-is-your-data-solving-f39ae1daa6e9?source=collection_archive---------32-----------------------

变量

我们每周精选的必读编辑精选和原创特写

数据科学职业的持续流行是许多因素的结果,从劳动力市场的变化到云计算的进步。不过,这也取决于一个基本理念:聪明而热情的人会寻找感觉有意义的工作。而有意义的工作,顾名思义,就是回答重要的问题,解决现实世界的问题。

招聘中的偏见就是这样一个问题,格雷瓜尔·马丁农有兴趣研究人工智能在延续这种偏见中的作用——并希望它有可能结束这种偏见。结果是一篇发人深省的文章,显示了分离偏见的原因是多么棘手,更不用说让它们无能为力了。格雷瓜尔的深潜绝对值得你花时间。

妮娜·梅尔卡多在 Unsplash 上拍摄的照片

数据科学家每天都要应对许多其他挑战,从理论一直到物理。他们的共同点是需要创造力和开放的心态。我们最近与机器学习工程师Mark Saroufim 的对话就是一个很好的例子:Mark 的职业生涯跨越了多个学科和不断变化的兴趣,但其共同的主线是他对挑战的无限好奇心。

有时,数据科学家面临的问题是组织性的:如何构建一个分析堆栈并从零开始雇佣一个数据团队?Veronica M. Zhai 在一家金融服务巨头和一家快速发展的初创公司都经历过这一过程,她根据这些经验分享了关于扩展数据操作的五条关键建议

拥有一支经验丰富的数据团队并不总是能保证成功。当技能、期望和工作流程不同步时,很多事情都会出错。Cassie Kozyrkov 的最新文章正是针对这些情况。她讨论了一些暗示你的人工智能项目注定失败的最常见的症状——并提供了先发制人解决它们的想法。

对于埃琳娜·斯塔马特卢来说,产品开发的一个主要障碍是,即使有大量的数据可用,“如果我们立即开始查看数据,我们可能会在试图理解数据列和字段时迷失方向,忘记最初的问题。”阅读她的《设计思维导论》,了解这种方法如何影响她的数据科学工作。

后退一大步, Gadi Singer 反思了人工智能目前的局限性,以及我们在该领域看到的所有进展可能只是更深层次知识的前奏——人工智能可以超越语言的表面模式,进入更深层次的抽象和表示的阶段。然而,人工智能的进步也伴随着重大风险,其中最关键的风险莫过于新兴的自动化武器行业。在最近一期 TDS 播客中,Jeremie Harris 和 Jakob Foerster 讨论了这些人工智能驱动系统所涉及的道德和政治风险。

作为 TDS 的读者,您可能知道我们对动手解决问题情有独钟,并对我们的贡献者多年来与我们一起发布的教程的深度存档感到非常自豪。让我们用一些最近最好的补充来完善本周的变量:

你用数据科学解决了哪些问题?你最感兴趣的挑战是什么?如果我们本周分享的帖子激励你反思自己的工作,考虑为 TDS 写关于它们的文章。(如果你刚刚开始,我们为期两周的免费电子邮件指南可能会给你所需的轻轻一推。)

感谢您本周加入我们,并支持我们广泛的社区。

直到下一个变量,
TDS 编辑

我们策划主题的最新内容:

入门指南

实践教程

深潜

思想和理论

关于 A/B 测试,产品分析师应该知道什么

原文:https://towardsdatascience.com/what-product-analysts-should-know-about-a-b-testing-a7bdc8e9a61?source=collection_archive---------14-----------------------

实践教程

从计划到评估的产品分析师入门

来自佩克斯卡罗琳娜·格拉博斯卡的照片

在成为产品数据分析师之前,我的大部分数据角色都是支持市场营销的。我有营销 A/B 测试的经验,但很快意识到不是所有的 A/B 测试都是平等的,尤其是产品测试。通过反复试验,我发现了我希望从一开始就知道的最佳实践。今天,我将讨论我学到了什么,如果你被要求进行产品 A/B 测试,我会给你一个好的开始。

产品 A/B 测试的生命周期可分为 3 个阶段。

1.规划

  • 实验设计和衡量成功的 KPI—在计划阶段,产品经理和我审核了实验设计,并就衡量成功的 KPI 达成一致。可以有多个 KPI 来衡量成功,但要与产品经理达成一致,决定哪一个应该是主要的还是次要的 KPI,以决定获胜的变体。我支持的移动应用订阅几乎在每个测试中都使用了相同的 KPI,但它会根据你支持的群体和测试的目标而有所不同。
  • 检查用户何时被随机分组 —用户根据应用程序登录被随机分组,但有测试表明这没有意义。例如,一个旨在增加成功注册数量的 A/B 测试将需要从人们点击注册流程的第一个屏幕而不是登录时开始随机选择,因为我们正在测试这一变化是否会方便用户完成注册过程。与产品经理讨论用户将被随机分配到哪里,以确保他们被适当地划分到每个变体中。
  • 确认测试的目标人群 —新功能或变更可能不会同时在所有用户和平台上进行测试。在我的公司,我们在一个国家或平台测试了变化,并在将它们发布给我们剩余的用户之前应用了从测试中学到的知识。与产品经理一起检查预期的测试人群,因为这可能会影响用于计算样本大小的基线 KPI。例如,如果一个新功能只对 iOS 上的英语用户进行测试,转化率可能与 iOS 上所有用户的转化率不同。这也影响了预期参加测试的用户数量,因为更多的用户登录了 iOS,而不仅仅是英语用户。
  • 计算样本量和预期测试持续时间—这一步很重要,因为你可能会发现需要几个月的时间才能达到确定统计显著性所需的样本量。这通常是因为预期到达被随机化的点的用户数量太低。对于那些情况,你需要回到产品经理那里决定另一个 KPI 来衡量成功或者改变实验设计。

2.发动

测试启动后,我们检查了几个项目,以确保实现没有任何问题。这是由我们的产品经理完成的,但作为贵公司的产品分析师,您可能必须这样做。

  • 确认变量比例与分配的百分比相匹配 —例如,如果我们预计测试中有 4 个相等的组,包括控制组,那么每个变量应该包含进入测试的用户总数的 25%。这是比例不平衡的测试中最常见的问题。有时这在早期被发现,工程人员修复了问题,我们重新开始测试。在其他情况下,我们在测试结束时发现了这一点,结果是可疑的。
  • 检查 KPI 是否受损 —并非所有测试都成功,有时变体的表现比对照差。有时,相对于控制的相对差异足够大,以至于在早期达到显著性,产品经理关闭测试以避免造成更大的伤害。其他时候,我们关掉表现比对照差的变体,因为其他变体表现得更好。产品应该运行测试并从中学习,但我们需要确保业务 KPI 不会受到重大影响。

3.估价

在一些公司,你可能不参与计划或启动阶段,你只是被要求在最后评估 A/B 测试。如果是这种情况,要求尽早参与,因为这可以确保产品经理获得有用的结果。否则,他们可能会因为糟糕的测试结果而做出错误的决定,或者因为测试设置不当而没有结果。

当测试准备好进行评估时,我在开始计算结果之前浏览了一下这个清单。

  • 是否有足够的时间来评估测试? —即使测试达到了确定显著性所需的样本量,也可能需要运行更长时间,这取决于衡量成功的 KPI。例如,当我们推出一项新功能时,我们想测试它是否增加了注册 30 天后返回应用程序的新用户的百分比。这意味着测试需要额外运行 30 天,以确保控制中的新用户不会在我们想要测量的 30 天参与窗口内接触到新功能。有时候,当我被要求评估 A/B 测试时,测试已经结束了。这减少了我可以用来计算结果的用户数量,并且样本大小不足以确定显著性。
  • 变异比例是否正确?—如果一个测试有 4 个变量,包括控制变量,并且预期是均匀分布的,那么每个变量包含 25%的用户总数吗?在一些测试中,我没有看到相等的比例,但工程人员告诉我,用户在每个变体中都是随机的。根据具体情况做出最佳判断。现实情况是,A/B 测试可能会出错,而分析师的工作是评估结果是否仍然可用。
  • 用户是否接触到多种变体,有多少?—每个用户应该只处于一个变体中,但有时一个用户可以处于多个变体中,这意味着他们处于控制中,并且还可以看到我们正在测试的更改。大多数时候,一小部分用户处于多个变体中,这是意料之中的。A/B 测试中有很大比例的用户属于多个变体,这可能会对测试实现和测试结果的有效性提出质疑。如果这发生在你的 A/B 测试中,与你的经理或同事讨论一下,因为他们可能在过去处理过类似的情况。

尽管 A/B 测试结果可能没有明确的赢家,但在审查结果和提出建议时,您应该考虑一些业务因素。

  • 用户体验(User experience)—测试很重要,但有时管理层可能会在样本量达到显著水平之前就决定推出新功能,因为他们认为这将提高用户参与度。我们使用测试结果作为方向指导,无法计算相对于控制的真实改进。
  • 平台对等 —有时,在 iOS 上的相同测试与控制相比有正面结果,但在 Android 上有负面结果。偶尔,我们会在两个平台上推出这些变化以保持平等,因为我们觉得随着时间的推移,这将有利于我们的用户,即使测试结果现在没有显示出来。
  • 季节性 —我们不能总是等待一年中的最佳时间来运行 A/B 测试以避免季节性,因为那样我们可以运行的测试数量就会受到限制。如果我们在今年的其他月份运行,结果可能会有所不同,但我们推出了一些变化,我们相信结果的积极方向会保持不变。

无论您是产品新手还是正在考虑成为产品分析师,我希望这能让您在 A/B 测试体验上有一个良好的开端。感谢阅读!

你可能也会喜欢…

https://medium.datadriveninvestor.com/netflix-q1-21-subscriber-growth-miss-can-we-avoid-another-one-189a87f9dcb8

关于 MAU,产品分析师应该知道什么

原文:https://towardsdatascience.com/what-product-analysts-should-know-about-mau-c07c13443dfe?source=collection_archive---------21-----------------------

如何衡量产品参与度

照片由 Cookie 在 Unsplash 上的 Pom 拍摄

当我成为一名产品数据分析师时,我被介绍给了 MAU(月度活跃用户),这是衡量产品参与度和增长的主要 KPI(关键绩效指标)。随着时间的推移,我意识到 MAU 作为一个单一的 KPI 不足以回答产品利益相关者的问题。今天,我将讨论 MAU 的问题,以及如何让它成为衡量产品参与度的更有意义的 KPI。

问题

不同的定义

MAU 被定义为过去一个月内访问网站的独立用户数量,其中一个月是 30 天。

第一个问题在于“用户”的定义。这些网站的匿名访问者是由 cookie ID 跟踪的吗?这些仅限于注册了帐户的用户,还是两者都有?

第二个问题是什么被认为是“活跃”用户?我们算不算一个在网站上看了一页就离开的访问者?如果用户只是因为得到了推送通知而登录了 app,然后关闭了它怎么办?一种选择是要求一个活跃的用户在你的产品的核心功能中执行至少一个活动,以此来计算“活跃”。如果你有一个游戏应用程序,这可能意味着用户玩了一个游戏。如果你有一个信息应用程序,用户必须发送或阅读信息。

鉴于“用户”和“活跃”的定义不同,不同产品的 MAU 可能不具有可比性,因此在分析 MAU 变化时,您应该注意澄清这些定义。

如果不看构成,总体 MAU 可能会产生误导

在下面的例子中,总 MAU 从一月份的 310 万增加到九月份的 360 万。如果产品经理只是关注 MAU 的增长,他们会认为一切都很好,因为参与度提高了。

然而,如果我们使用下面的定义将 MAU 分成三个部分,我们会看到不同的趋势。MAU 增长的大部分来自于用户和持续回归用户,实际上自一月份以来一直在下降。

  • 新用户是本月注册的用户。
  • 持续上个月和本月用户活跃。
  • 回头客2 个多月前活跃,本月活跃。

作者图片

按细分市场绘制的 MAU 图更清晰地显示了趋势。蓝色的用户线在增加,橙色的继续和灰色的回归用户在逐渐减少。

作者图片

堆积条形图帮助我们看到用户占总 MAU 的百分比在增加,而继续返回的百分比在减少。

作者图片

在上面的例子中,公司有一个用户保留问题。新用户在增加,但许多人不会回来。如果不细分 MAU,产品经理就不会意识到有一个需要解决的用户保留问题。

可供选择的事物

由于 MAU 无法讲述产品参与的全部情况,因此有几个备选方案。

使用群组分析 MAU

群组按注册月份统计用户,分析一段时间内的留存率。对于我上面使用的例子,群组分析可以帮助确定保留率是否一直在下降,或者是由于 2021 年的产品变化影响了保留率。群组分析将有助于确定保留率何时开始下降。

粘性比

产品粘性是“客户再次使用你的产品或更频繁使用它的倾向”。DAU(每日活跃用户)除以 MAU 可用于衡量粘性,这是一个流行的参与度指标,因为它曾被脸书使用。

外卖食品

最后,MAU 有助于跟踪产品参与度,但可能无法反映全部情况。现在你已经理解了局限性并有了替代方案,我希望这能有所帮助,让你在下次遇到关于敬业度的问题时有一个新的视角。

你可能也会喜欢…

[## 关于 A/B 测试,产品分析师应该知道什么

towardsdatascience.com](/what-product-analysts-should-know-about-a-b-testing-a7bdc8e9a61) https://bettermarketing.pub/what-marketers-should-know-about-subscription-models-7643bbede5eb

什么是矩阵行列式?

原文:https://towardsdatascience.com/what-really-is-a-matrix-determinant-89c09884164c?source=collection_archive---------0-----------------------

入门

行列式背后的几何直觉会改变你对它们的看法。

图片作者(【marcelmoos.com】T2)

回想我的高中时代,线性代数是我特别着迷的一个话题。它给了我解决大型线性方程组的技巧,以及对问题的几何透视,使整个过程变得直观。

然而,关于矩阵行列式,我被教导的是它们是矩阵的数字,如何计算它们,而不是更多。直到上了大学,我才了解到行列式背后的美。

当我一知道行列式的几何意义,我就在想为什么高中没有教它,因为它非常容易理解和开放思维。

在数学中,如何计算一个东西永远不应该是第一个问题。第一个问题总是:“它到底是什么?”。只有到那时,我们才应该问:“好了,现在我们知道了它是什么,我们如何计算它”。以导数为例,我们大多数人都知道什么是导数:

给定一个函数,它的导数就是它的斜率或变化率。

就是这么简单的描述。然而,以这种方式定义衍生品是如此强大和自由。我们知道什么是导数,不管具体的函数,或者函数的维数,也不管如何计算它。不同函数的导数的实际计算有很大不同。然而,衍生品的基本含义是将一切联系在一起,将秩序带入混乱。

没有老师会像这样给学生介绍导数:"给定一个函数,导数就是另一个函数,这就是你计算它的方法……"尽管如此,对于矩阵行列式,这样的解释似乎流传很广。根据行列式的几何意义而不仅仅是一些数字来定义行列式,就像把导数看作斜率而不仅仅是函数一样强大。

行列式和几何

在深入研究行列式之前,让我们快速回顾一下它们的定义:矩阵。

矩阵是一个数字表,代表一个线性函数以一个向量作为输入,产生另一个向量作为输出:

除了矩阵转换单个向量,我们还可以考虑矩阵同时转换多个(甚至所有)向量:

你能看见它吗?看起来我们选择的矩阵拉伸了空间。无论我们选择输入空间中的哪一个区域,看起来在变换之后,区域变大了。这正是行列式的意义所在!

矩阵的行列式是该矩阵缩放面积的因子。

因为矩阵是线性变换,所以知道一个单一区域的缩放因子就足以知道所有区域的缩放因子。让我们回到我们的例子:

由粉色和蓝色单位向量内接的矩形,面积为 1。应用我们的矩阵变换后,这个矩形变成了一个平行四边形,底边为 2 高为 2。所以它的面积是 4。这意味着,我们的矩阵以 4 的系数缩放面积。所以我们矩阵的行列式是 4 。很整洁,不是吗?

这个故事有一个警告:决定因素可以是负的!如果我们从面积 1 开始,用一个负的因子来缩放,我们将得到一个负的面积。而负面区域就是扯淡。那么,在负行列式存在的情况下,我们如何理解我们的几何定义呢?幸运的是,解决方法很简单:如果一个矩阵有一个负的行列式,比如说-2,面积按 2 缩放。减号只是意味着空间颠倒了它的方向。“这到底是什么意思?”你可能会理直气壮地问。让我们来看看:

我们可以看到,给定的矩阵按系数 2 缩放面积。如果我们仔细观察,我们会进一步注意到蓝色向量在粉色向量的右边,但最后却在左边。这就是“空间颠倒了方向”的含义。这就是为什么矩阵的行列式不是 2 而是 -2 的原因。包括负面决定因素在内,我们得到了全貌:

矩阵的行列式是该矩阵缩放面积的符号因子。如果符号为负,矩阵反转方向。

我们所有的例子都是二维的。很难画出更高维的图。行列式的几何定义适用于高维空间,就像它适用于二维空间一样。在三维空间中,决定因素是体积的有符号比例因子,在更高维度中是超体积。

知识带来力量

有了行列式的这个新的几何定义,我们可以轻松地解决问题,如果没有它,事情会变得困难得多。例如,你可能听说过也可能没有听说过以下事实:

如果矩阵的行列式为 0,则它是不可逆的。

矩阵不可逆意味着矩阵所代表的变换不可撤销或回复。如果我们只知道行列式是如何计算的,而对它们的几何意义一无所知,证明这一事实是困难的。相比之下,使用我们新建立的关于决定因素的直觉来解释为什么这是真的并不困难

假设我们有一个行列式为 0 的矩阵。这意味着矩阵以系数 0 缩放所有区域,这又意味着所有区域在变换后变成 0 。只有当矩阵将整个空间压缩到一个更低的维度时,这种情况才会发生。例如,二维空间将被压缩成一条线或一个点,并且这种转换是不可撤销的。

到了这一步,我们可以为自己感到骄傲。我们引入了矩阵行列式作为面积比例因子,并证明了矩阵和行列式的一个著名性质。我们做这些甚至没有考虑行列式是如何计算的。但是这个问题应该是次要的。

觉得这个故事有趣?你可以在这里成为一个中等会员来支持我的写作:medium.com/@mmsbrggr/membership。你将获得所有媒体的访问权,你的部分会员费将直接支持我的写作。

欢迎在 LinkedIn上向我提出私人问题和评论。如果你喜欢这篇文章,让我告诉你我的时事通讯:marcelmoos.com/newsletter

AI 的未来应该是什么样子?

原文:https://towardsdatascience.com/what-should-the-future-of-ai-look-like-4afdd9f3f7a8?source=collection_archive---------24-----------------------

自从人工智能开始走出科幻小说的领域进入我们的日常生活以来,还没有多久。也许是因为它的新近性,人工智能向现实世界系统和技术的过渡既鼓舞人心又令人不安,这种紧张在围绕其未来的辩论中同样强烈。AI 应该变成什么样?它应该为谁服务?

在本周的《变量》中,我们分享了两个令人大开眼界的话题。但是,如果您喜欢让事情更具可操作性,请不要担心:我们还包括了一些我们最近喜欢的主题,如 MLOps 和模型堆叠。我们开始吧!

  • 了解企业主导的 AI 研究的风险 。近年来,我们在强化学习等领域取得的重大进展代价高昂,谷歌和脸书等科技巨头财力雄厚。那是做这件事的正确方法吗? Travis Greene 提出了一个关键问题,他接着细致入微地回答了这个问题:“我们是否应该相信,以‘私人利益’为目的的市场驱动的人工智能研发将符合透明、公正、公平、责任、问责、信任、尊严、可持续发展和团结等以人为本的价值观?”
  • 探索语言模型统治地位的潜在替代物 。人工智能最近大步前进的最明显的例子可能是像 GPT-3 和伯特这样的大规模语言模型。在最近一集的 TDS 播客中,Diffbot 首席执行官 Mike Tung 与 Jeremie Harris 聊起了开发人工智能未来能力的另一条有前途的道路:知识图。

照片由 Georg AuffarthUnsplash 上拍摄

  • 试验堆叠来提高你的模型的性能 。如果你本周只有时间修改一个实践教程,那还不如的 Jen Wadkins 的逐步介绍模型堆叠,这是一种通过从几个不同的模型中获取预测,然后将它们“作为更高级元模型的特征”来提高结果的方法
  • 对 MLOps 感到舒服——或者至少更熟悉。机器学习操作已经成为一个热门的子领域有一段时间了,Yashaswi Nayak 非常容易理解的指南对于任何想了解更多的人来说都是一个很好的资源。Yashaswi 从基本定义开始,然后向我们介绍了从基础设施到部署的整个 MLOps 生命周期。
  • 用实际的、来之不易的建议为读研做准备。如果你正在考虑重返校园攻读数据分析或数据科学的硕士学位,你会想看看伊莎贝拉·贝拉斯克斯几年前对自己经历的描述。它包括许多实用的见解,可以让你走上正确的道路,并帮助你充分利用你的计划。

感谢您加入我们又一周激动人心和发人深省的文章!如果这些帖子中的任何一个激发了你对人工智能、机器学习或其他主题的未来的看法,请考虑与我们的团队分享。

直到下一个变量,
TDS 编辑

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

当你开始学习朱莉娅语言时,你应该期待什么?

原文:https://towardsdatascience.com/what-should-you-expect-when-picking-up-the-julia-language-deb36a1e3df4?source=collection_archive---------36-----------------------

Julia 语言如何满足或不满足计算科学家在开始使用该语言时可能有的先入为主的观念和期望?

(src =https://unsplash.com/photos/hMQKDpchGK8

介绍

J ulia 是一种高性能语言,在过去的两年里,它在科学计算和数据科学领域掀起了一场风暴。这是有充分理由的,因为这种语言在速度方面已经取得了一些令人印象深刻的成就。然而,许多有抱负的朱利安科学家可能不知道使用这种语言的最佳方式,尤其是在专业场合。使用 Julia 语言或任何其他语言,都不会像“这种语言更快,所以更好,我们应该使用它”这样简单这种语言有很多优点,也有很多缺点。

也就是说,很难确切地说出从这种语言中能得到什么。这种语言只有大约十年的历史,而且很难预测技术的未来,因为技术的发展通常特别缓慢。在专业或公司环境中尤其如此,这也是我喜欢在创业公司工作的部分原因。Julia 语言目前面临着一些问题,新用户在熟悉这种语言之前可能需要了解这些问题。在这方面,学习一门永远不会应用到你工作中的语言,或者学习一门对你可能使用的另一门语言没有优势的语言肯定是浪费时间。考虑到这一点,我认为这将是一个很好的想法,它揭示了人们可以期待进入 Julia 计算世界的一些事情。

采用

很容易,任何新的 Julia 用户将面临的最大问题是收养。虽然 Julia 近年来变得越来越受欢迎,但它肯定还没有达到科学计算世界中大多数竞争语言的水平。这部分归因于它的年轻,但让我们也考虑一下这种语言可能永远不会成为主流的可能性。

这种缺乏收养的现象渗透到你在茱莉亚做的任何事情中。通常情况下,对于任何类型或规程的工作都没有特定的约定,当从一个包跳到另一个包时,这可能会有问题。例如,通常在 Python 这样的语言中,我们可以假设大多数模型都遵循类似函数和类型命名的 SkLearn 约定。然而,在 Julia 中,没有设置这样的约定,尽管 SkLearn 约定通常是最接近被遵循的。也就是说,朱莉娅的范式不一定能很好地促进这一点。一个非常明显的例外是 Lathe.jl 包,它使用 dispatch 来创建混合了强制转换和非强制转换类型的类型。如果你想了解这一点,你可以查看车床网站:

收养问题也进一步渗透到了帮助领域。Julia 是一种很难找到相关信息的语言。这对该语言的新手来说可能是个问题,因为为该语言中的每个模块自动生成的文档可能会使查找帮助和信息变得有点乏味。虽然这肯定是一个问题,但我想指出的是,在许多情况下,你可以通过简单地向社区寻求帮助来缓解这个问题,例如 Julia discourse。这个社区很容易接受这种事情,所以如果你陷入困境,这可能是有意义的。

缺陷,缺点

随着时间的推移,Julia 包生态系统被反复构建,许多包相互利用。这是生态系统工作的一个很好的方式,特别是考虑到编程语言的可扩展性。然而,它肯定会产生一些问题。为什么会出现这种情况的简短答案是,因为在许多情况下,这些包特别年轻。此外,它们中的大多数是由看似随机的开源贡献者开发的,这些贡献者的工作通常没有报酬。

在使用 Julia 语言时遇到包的问题是很常见的。在 Julia 中,“归咎于包”的借口比在竞争语言 Python 和 r 中更有可能成立。

在这方面可能面临的另一个问题是某些包装的缺点。有许多软件包可能会满足某些科学家的需求,而缺少您需要的代码肯定会有问题!

快速——但需要注意

Julia 编程语言吸引新程序员的一个原因是它在速度方面的声誉。是真的!Julia 是一种快速编程语言,其编译时间接近 C 语言,而语法看起来类似于 MATLAB 和 Python 的奇怪产物。也就是说,有很多很容易犯的错误会完全破坏这种性能,学习使用 Julia 代码对于语言的成功非常重要。

再者,我觉得需要注意的是,Julia 真正的妙处不仅仅在于它的编译速度,还在于它的编写速度。Julia 利用了多重分派,事实上,该语言的整个范例在许多不同的方面都以多重分派为中心。学会利用这一点对于有效地与 Julia 合作至关重要。

结论

朱莉娅语言似乎处于技术的最前沿。如果我们能挺过去,我们很有可能在未来十年内看到广泛的采用。那将是一件了不起的事情,因为在我看来,朱莉娅目前最大的障碍是受欢迎程度低。我记得当我最初开始学习这门语言时,我是在某个不知名的机器学习论坛上听说的,并且花了大量的研究才发现 Julia 是一门编程语言。幸运的是,这已经完全改变了,在我看来,这是进入编程语言的最佳时机。

当然,收养的问题会渗透到你在茱莉亚做的每一件事情中。软件包可能更难使用,只是因为用 Julia 语言工作的开发人员少了很多。这也产生了学习语言和真正正确使用语言的问题。如果你在网上找不到任何关于如何使用这门语言的信息,那么这门语言当然很难学。尽管存在所有这些问题,我仍然认为现在值得捡起来,因为所有这些事情都有很好的机会改变。我这么说只是因为这种语言在过去一年左右的时间里取得了如此巨大的进步。感谢您阅读我的文章,我希望它能提供信息,让您更好地理解 Julia 语言面临的问题,以及您可能想了解的内容。

对于 FAANG 的数据工程职位来说,哪些技能是重要的?

原文:https://towardsdatascience.com/what-skills-are-important-for-a-data-engineering-role-at-faang-ec5230cbc962?source=collection_archive---------23-----------------------

数据工程

在 FAANG 这样的大公司获得数据工程职位之前,你需要知道什么

!丹尼尔·索罗金在 Unsplash 上拍摄的照片。由作者修改。

作为一名在大型 FAANG 公司工作的数据工程师,我经常听到人们问,在知名科技公司获得数据工程工作,什么技能是重要的?许多人认为他们需要精通 Spark 或了解 Hadoop 系统的一切才能在这些公司找到工作。虽然对某些数据工程角色来说是这样,但它与大公司(包括 FAANG 公司)内部的许多其他数据工程角色无关。

在这篇文章中,我提到了在大型科技公司获得数据工程工作所需的最重要的技能。在继续之前,我想强调一下,这篇文章更多地是针对与分析团队一起工作的数据工程师,而不是与基础架构团队一起工作的数据工程师。

结构化查询语言

SQL 可能是你在任何公司获得数据工程职位所必须掌握的最重要的技能。如果有人跟你说 SQL 老了,已经没人管 SQL 了,请忽略它。即使在 FAANG 这样的大公司,SQL 仍然是很多数据工程师使用最广泛的语言。记住,做一个万能的数据工程师,要努力学习 standard/ANSI SQL。许多公司使用不同的数据库,他们使用像 Presto 这样的平台从一个点访问和查询它们。

对于那些想认真学习 SQL 的人,我的第一推荐是 Vertabelo Academy(披露:与作者无隶属关系)

https://academy.vertabelo.com/

提高 SQL 技能的另一条建议。始终考虑如何提高 SQL 查询的性能。许多人可以用一个复杂的非优化的 SQL 查询来完成一项任务,但是当涉及到大量数据时,编写优化的查询是至关重要的,它将您与 SQL 初学者区分开来。

计算机编程语言

也许,数据工程师最重要的任务是构建数据/ETL 管道。许多现代数据管道都是用 Python 语言编写的。Python 为构建复杂的 ETL 管道提供了一套灵活而广泛的工具。Python 是许多工作流管理平台的语言(见下一节)。大多数现代数据管道是 Python 和 SQL 查询的混合脚本。对于大多数数据工程任务,您应该能够使用 Python 的基本工具、对象和库来完成任务。

气流或工作流管理平台

大多数管道都需要定期运行。此外,在没有综合专用工具的情况下,很难监控和维护管道。因此,许多大公司开始使用像 Apache Airflow 这样的工作流管理平台。一些公司有自己的工作流管理平台,另一些公司使用像 Airflow 这样的开源选项。由于 Airflow 被许多科技公司广泛使用,并且与一些大公司的其他专有工具非常相似,因此鼓励投入时间学习 Apache Airflow。你有很多选择来学习(甚至获得认证)气流。以下是一些选项(披露:与作者无隶属关系)。

https://www.udemy.com/course/the-complete-hands-on-course-to-master-apache-airflow/

(披露:与作者无关)

https://www.astronomer.io/

仓储系统基础

数据仓库是公司中所有可用数据(理想情况下)的结构化组织。使用数据仓库,数据科学家和决策者可以回答重要的业务问题并分析业务绩效。建立和维护数据仓库的人是数据工程师。与数据仓库交互是数据工程师工作的重要部分。因此,对于数据工程师来说,理解数据仓库基础知识和了解该领域的最佳实践是至关重要的。

对于那些想学习数据仓库和最佳实践的人来说,克里斯多夫·阿达姆松的《星型模式完整参考》是最好的起点(声明:与作者无关)。

https://read.amazon.com/kp/embed?asin=B003Y8YWAE&preview=newtab&linkCode=kpe&ref_=cm_sw_r_kb_dp_TYBC3G1Z4548S1HF2JVV

如果你没有时间阅读这本优秀的书,或者如果你想获得阅读它的动力,请阅读我在《走向数据科学》上发表的书籍摘要。它在一篇短文中涵盖了所有重要的基础知识。

[## 数据科学家的数据仓库基础

towardsdatascience.com](/fundamentals-of-data-warehouses-for-data-scientists-5314a94d5749)

Hadoop、Spark 和 Hive 的基础知识

由于数据的规模(通常一个简单的查询需要数 Pb 的数据),大多数大型科技公司的数据仓库都是基于 Hadoop 系统的。尽管一些数据工程师熟悉 Hadoop 和 Spark,但许多这些公司利用 Hive(和 Presto)来支持所有数据工程师(他们最熟悉 SQL)。数据工程师应该熟悉 Hadoop、Spark 和 Hive 的基础知识。然而,许多数据工程师(尤其是分析方面的 DEs)只需要基本的知识就可以完成他们的日常工作。像 Presto 和 Hive 这样的系统使数据工程师能够通过 ANSI SQL 与许多类型的数据库(包括 Hadoop 系统)进行交互。同样,如果你在上游团队(涉及基础设施系统和维护数据仓库的团队)中担任 DE,你可能需要更好的 Hadoop 和 Spark 技能,但对于分析团队中的 DE 角色,基本知识应该足够了。这里有一本书可以帮助你熟悉 Hive 和 Hadoop(披露:与作者无隶属关系)。

https://read.amazon.com/kp/embed?asin=B009D76316&preview=newtab&linkCode=kpe&ref_=cm_sw_r_kb_dp_YYMH6J8N04P2VCPGEX19

摘要

你需要非常了解 SQL 和 Python 才能在知名科技公司(比如 FAANG 公司)找到数据工程的工作。使用 Apache Airflow 这样的工作流管理平台的经验可以帮助您构建 ETL 管道,并在您的工具箱中拥有这种技能。此外,您需要了解 Hadoop、Hive、Spark 和数据仓库的基础知识,以便通过面试并能够完成日常工作。对于许多公司和角色来说,了解关于 Hadoop、Hive 或 Spark 的太多细节是不必要的,因为许多 DE 角色通过 Presto 或 Hive 等基于 SQL 的工具与数据仓库进行交互。

2010 年代我错过了什么歌?

原文:https://towardsdatascience.com/what-song-did-i-miss-in-the-2010s-306ff6a061c5?source=collection_archive---------24-----------------------

使用 Spotify Web API 和 k-means 聚类找出它们

介绍

没有人能否认 Spotify 革新了整个音乐行业。但很多人不知道的是,Spotify 还免费提供了强大的 Web API。在 Spotify 中创建你的开发者账号后,你就可以打开这个闸门,摆弄与音乐相关的海量信息。今天我在这里演示如何用 Python 玩 Spotify Web API。

情况

我有自己的播放列表,只有 56 首歌曲。我确定我错过了很多好歌。但是我怎么才能确定我错过了什么呢?更重要的是,我如何利用我当前的播放列表找到我可能也喜欢的其他歌曲?所以需要一个基于我目前歌单的推荐系统。但是如何量化我的歌单里我爱听的歌?

我们开始吧!

第一步:访问 Spotify Web API

首先,你需要在你的 Spotify 账户中设置好一切。客户端 ID 和客户端密码是必需的。如果您还没有,请点击链接下的“设置您的帐户”部分。

在仪表板页面上设置应用程序后,您将获得客户端 ID 和客户端密码。这两个是访问 Spotify API 所必需的。不要和别人分享!

Spotify Web API 基于 REST。所以我们需要的就是包装。在获得客户机 ID 和客户机秘密之后,我们需要的下一件事是访问令牌。你可以向 Spotify 提出请求,Spotify 会将访问令牌返还给你。

auth_response = requests.post("[https://accounts.spotify.com/api/token](https://accounts.spotify.com/api/token)", {
    "grant_type": "client_credentials",
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET,
})auth_response_json = auth_response.json()access_token = auth_response_json["access_token"]

auth_response_json将采用 JSON 格式,如下所示

当我们向 Spotify 发送任何请求时,我们都会添加一个包含此 access_token 的额外标头。

headers = {"Authorization": f"Bearer {access_token}"}

访问 API 的基本 URL 是https://api.spotify.com/v1/。URL 后面的会话是选择 API 的类型。比如对于一个艺人,网址会是https://api.spotify.com/v1/artists;对于播放列表,它将是https://api.spotify.com/v1/me/playlists。然后对于每种类型的 API,会有不同的 API 调用。欲了解更多信息,您可以访问此链接

第二步:我的 Spotify 播放列表中的歌曲

现在我们都准备好享受 Spotify API 了。第一个问题,我的播放列表里有哪些歌曲?要识别哪个播放列表,您需要提供该播放列表的 ID。如果你点击三个点->共享->复制链接到播放列表,就可以获得 ID。

你会得到一个网址。playlist/后面的字符串是播放列表的 ID。

如果我们专门获取一个播放列表中的所有歌曲,您可以按如下方式进行:

requests.get("https://api.spotify.com/v1/playlists/YOUR_PLAYLIST_ID/tracks", headers=headers).json()

然而,有一个问题是,每次发送请求,你最多只能从 Spotify API 获得 100 首歌曲。

因此,如果您的播放列表中有超过 100 首歌曲,那么您需要包含offset参数并使用 for 循环来获取所有歌曲的详细信息。

但由于我的播放列表只有 56 首歌曲,所以我没事。

你会收到一个长长的 JSON。Item中的每个元素代表一首歌。它列出了歌曲的详细信息,包括歌曲名称、艺术家和专辑名称。

艺术家详细信息

歌曲细节

我们下一步需要的是歌曲的 ID。但是这里我们也得到歌曲名称和艺术家,只是为了演示。

由于我们将发送请求超过三次,我简单地创建了如下函数( Link ):

def send_request(send_type_,id_,remaining_ = ""):
    return requests.get(BASE_URL + send_type_ +"/"+ id_ + "/"+remaining_, headers=headers).json()myPlaylist = send_request("playlists", YOUR_PLAYLIST_ID,"tracks")

第三步:歌曲的特点

是时候想办法描述一下我喜欢什么类型的歌了。从最后一步,我们可以获得每首歌曲的唯一 ID。在这个阶段,我们可以使用audio_features发送一个请求,并将 ID 作为参数。例如:

requests.get("[https://api.spotify.com/v1/audio-features/4ltxkXhSE3oH4Xnx0Ek598/](https://api.spotify.com/v1/audio-features/4ltxkXhSE3oH4Xnx0Ek598/)", headers=headers).json()

这就是你将得到的,一个列出了歌曲特征的 JSON。

这里就不解释每个字符的意思了。有兴趣的话,去这个链接了解更多。

现在,我们几乎完成了收集我的播放列表中歌曲的所有必要信息。最后一步是将所有信息存储在数据帧中。

# This is to get the song ID of a song
def get_id(dict_):
    return dict_["track"]["id"]# This is to get all details of a song 
def getSongDetail(trackID_):
    # Get the audio feature of a song 
    audioFeatures = send_request("audio-features" , trackID_)
    # Get the information of a song 
    songDetails = send_request("tracks", trackID_)
    songName = songDetails["name"]
    artists = songDetails["artists"]
    artistsName = [x["name"] for x in artists]
    # Combine all into a dict
    return {**{"Song_Name": songName, "Artists": artistsName},**audioFeatures}mySongs = []
for song in myPlaylist["items"]:
    mySongs.append(getSongDetail(get_id(song)))
mySongsDF = pd.DataFrame(mySongs)

第四步:k-means 聚类

(这里我假设你已经知道什么是 k 均值聚类。如果没有,有大量的材料介绍。例如 scikit-learn doc 。)

因此,我们将只需要数字变量进行 k 均值聚类。在执行聚类之前,还要执行标准化,以调整所有数值变量的标度。

numeric_Variable = ["danceability", "energy",  "loudness", "speechiness",
       "acousticness", "instrumentalness", "liveness", "valence", "tempo","duration_ms"]
mySongsNumericDF = mySongsDF[numeric_Variable]# This is to standardize all numeric variables 
mysongsScaler = StandardScaler().fit(mySongsNumericDF)
mysongsNormalizedDF = mysongsScaler.transform(mySongsNumericDF)

用肘法求最优 k。

# This is to return the sum of squared distances of samples to their closest cluster center.
def get_inertia(n_cluster_,df_):
    return  KMeans(n_clusters = n_cluster_, random_state= 42).fit(df_).inertia_mySongSqDistance = []
for i in range(1,10):
    mySongSqDistance.append(get_inertia(i,mysongsNormalizedDF))plt.plot(range(1,10), mySongSqDistance, "rx-")
plt.show()

肘部不清楚,但至少从 1 到 2 的下降比从 2 开始大。所以下一步我取 k =2。

kMeansResult = KMeans(n_clusters = 2, random_state= 42).fit(mysongsNormalizedDF)

第一个问题:每个集群有多少首歌?

collections.Counter(kMeansResult.labels_)
# Counter({1: 18, 0: 38})

第二个问题:每个集群都分组了哪些歌曲?

mySongsDF["kCluster"] = kMeansResult.labels_.tolist()
list(mySongsDF[mySongsDF["kCluster"]==1]["Song_Name"])

有意思的一点是,我所有的粤语歌都在这个集群里。

第五步:我错过了什么歌?

现在是时候找出我错过了哪首歌了。

我将使用现有的歌曲列表,并将所有歌曲放入经过训练的 k-means 聚类中。聚类之后,我将进一步计算每首歌曲与相应聚类的质心之间的距离。

这将是歌单。

得到歌曲特征的过程和前面一样。所以下面更侧重于 k-means 聚类部分。首先是标准化,然后预测结果。

# playlist_songsNumericDF is a dataframe for storing all numeric characteristics of all songs in the playlist# Below processes are to standardize all numeric variables and then predict the result. playlist_songsNormalizedDF = mysongsScaler.transform(playlist_songsNumericDF)playlist_songsPredict = kMeansResult.predict(playlist_songsNormalizedDF)

下面是所有被预测在聚类 1 中的歌曲。

然后,我们计算每首歌曲与其各自的聚类质心之间的距离。这里我们使用距离 numpy 的欧几里德距离。

playlist_songsDF["Distance_to_Centroid"]=[np.linalg.norm(
    result[0]-kMeansResult.cluster_centers_[result[1]]) 
    for result in list(zip(playlist_songsNormalizedDF,
                           playlist_songsPredict))
]

与质心距离最短的前五首歌曲是:

list(playlist_songsDF[playlist_songsDF["kCluster"]==1].nsmallest(5,"Distance_to_Centroid")['Song_Name'])

最后的

这里我只演示一个简单的例子来使用 Spotify Web API。如果你对此感兴趣,我建议你访问 https://developer.spotify.com/,发现 Spotify 免费提供的其他酷功能。

本文到此结束,整个 Jupyter 笔记本已经发布在我的 GitHub 上(链接)。

下次见。

应该做什么统计检验?

原文:https://towardsdatascience.com/what-statistical-test-should-i-do-612036412147?source=collection_archive---------26-----------------------

借助流程图,根据变量的数量及其类型选择最合适的统计测试

作为一名统计学助教为不同背景的学生提供帮助,我有机会看到全球学生没有很好理解的东西。

我已经意识到,当学生被告知使用哪一个时,他们做一个具体的统计测试通常不是问题(当然,只要他们有良好的资源,并且他们在课堂上一直很专心)。然而,当他们需要选择做什么测试时,这个任务对他们来说似乎要困难得多。

本文给出了一个流程图,帮助学生根据几个标准选择最合适的统计测试: 1

统计测试概述(图片由作者提供)

由于大量的测试,图像很宽,因此可能无法在所有屏幕上很好地呈现。在这种情况下,您可以通过点击以下链接全屏查看:

PDF 格式下载

正如您在流程图中看到的,选择最合适的测试基于:

  • 感兴趣的变量的数量:一个、两个或两个以上的变量
  • 变量类型 : 定量定性
  • 在定性变量的情况下,组的数量以及它们是独立的还是成对的(即从属的)
  • 无论您想要参数或非参数版本 2

在一幅图像中总结如此多的测试并不是一件容易的事情。此流程图的目标是为学生提供一种快速简便的方法,从最常见的统计测试中选择最合适的统计测试(或查看有哪些替代方法)。显然,这个流程图并不详尽。还有许多其他的测试,但是为了保持简单和可读性,大部分都被省略了。我决定保持简单,这样流程图就不会让人不知所措,希望它对大多数学生来说仍然是完整和精确的。

为了完整起见,这里有一些关于此流程图的附加说明:

  • 两个以上变量的测试也适用于两个变量的情况。然而,为了简单起见,当可能有多个测试时,我倾向于建议最简单的测试。例如,对于两个定量变量,可以进行相关性检验简单线性回归。在统计学入门课上,我很可能会教授相关性的概念,但不一定是线性回归的概念。出于这个原因,我最有可能推荐相关性测试而不是线性回归,除非学生的水平更高。
  • Kolmogorov-Smirnov 检验,用于将一个样本与参考概率分布进行比较或比较两个样本,已被省略,因为它通常不会在入门课程中讲授。然而,请记住,这个测试在单变量和双变量情况下都是有用的。
  • 正态性检验(如 Shapiro-维尔克或 Kolmogorov-Smirnov 检验等)也省略了,因为它们是另一类检验的一部分(用于回答“我的数据集是否通过正态分布很好地建模了?”).然而,请记住,它们对于验证许多假设测试中要求的正态性假设非常有用。例如学生 t 检验要求在小样本情况下数据近似服从正态分布。如果不是这种情况,则应首选非参数版本(即 Wilcoxon 检验)。方差分析和许多其他统计测试也是如此。
  • 流程图可以扩展到包括更高级的线性或非线性模型,但这超出了其范围和目标。请记住,我创建这个工具的目的是帮助非专家人士更清楚地看到并大致了解最常见的统计测试,而不是让他们更加困惑。
  • 如果打开 PDF 中的流程图,您将能够点击大部分测试。单击测试名称将重定向到相应的文章,该文章进一步详细解释了该测试。如果测试是不可点击的,这意味着我还没有写它。如果我发布一篇关于其中一个缺失测试的文章,我将更新流程图。

希望本指南能帮助您确定正确的统计测试。请随意与所有可能感兴趣的学生分享。

一如既往,如果你有问题或建议(例如,如果我错过了一个你认为应该包括在内的测试),请添加它作为评论,以便其他读者可以从讨论中受益。

  1. 对于那些有兴趣画这样的流程图的人,请注意我用的是 diagrams.net。在写这篇文章的时候,它是免费的,你可以和 Google Drive,GitHub 等同步。 ↩︎
  2. 参数测试意味着它是基于理论统计分布,这取决于一些定义的参数。相反,非参数检验不依赖于属于任何特定概率分布参数族的数据。非参数检验与参数检验具有相同的目的。然而,与参数检验相比,它们有两个优点:(1)它们不需要假设正态分布,以及(2)它们可以处理异常值。权衡是,当正态假设成立时,非参数检验通常不如相应的参数检验有效。因此,在其他条件相同的情况下,如果数据遵循正态分布,那么在非参数检验中,当零假设为假时,您不太可能拒绝该假设。因此,当假设得到满足时,最好使用参数版本。 ↩︎

相关文章

最初发表于 2021 年 12 月 2 日https://statsandr.comT22。

这些云存储桶到底是什么?!

原文:https://towardsdatascience.com/what-the-heck-are-these-cloud-storage-buckets-2bf27d0a0872?source=collection_archive---------40-----------------------

了解自动生成的 GCS 时段、费用来源以及如何删除它们。

Pedro da SilvaUnsplash 上拍照

我喜欢在业余项目中使用谷歌云平台(GCP)(点击这里查看我为什么使用 GCP)和谷歌的云存储 (GCS)产品已经多次进入我的设计。然而,我很快意识到其他 GCP 服务利用 GCS,创建桶并用对象填充它们。

起初,我对 GCS 的使用很少,这些系统桶并没有困扰我,但后来我开始在我的账单上看到费用(尽管只有几分钱),并决定是时候了解这些桶的用途以及如何消除或减少费用了。

理解这些费用可能是一个挑战,并且是什么创建了系统存储桶被松散地记录。我在这里记录了我的经历,希望它能帮助其他人避免类似的挫折。

下面包括我的调查过程,发现,以及我采取的步骤,以尽量减少我的 GCS 费用。如果您只是对解决方案感兴趣,您可以跳到解决方案部分。

警告:不要在不了解其用途的情况下更改 GCP 自动生成的任何存储桶(或其内容)。有些绑定到活动进程,改变它们会导致不可逆转的对象损坏!

调查

所有这一切都是从我开始承担 GCS 费用时开始的,如果你在这里调查你的费用,你会知道在计费仪表板上没有太多的细节。这是我对 2021 年 2 月的预测。

作者图表

美国多地区 SKU 下每月1.45 GB 存储空间需要支付 5 美分的费用。我认为这里有两个问题:

  1. 前 5GB 存储应该是免费的(谢谢免费层!)
  2. 我对云存储的使用不应接近 1.45 GB

谷歌云存储价格页面解决了我的第一个问题。免费层适用于某些地区。

云存储总自由配额适用于 *US-WEST1* *US-CENTRAL1* *US-EAST1* 地区 的使用情况。这三个地区的使用量是合计的。永远免费是可以改变的。资格要求和其他限制请参见我们的 常见问题解答

也许我为我的桶选择了错误的存储类型?

云存储浏览器

存储桶详情可在云存储浏览器页面找到:

作者图表

在这种情况下,我总共有 6 个桶。绿色突出显示的是一个活动存储桶,用于存储一些物联网设备数据。我没有直接创建其他的和一些有多区域的位置类型。

这部分解释了这些指控,但不清楚是什么过程创造了这些桶,GCP 用它们做什么。关于这一点…

警告:在不了解其用途的情况下,不要更改 GCP 自动生成的任何存储桶(或其内容)。有些绑定到活动进程,改变它们会导致不可逆转的对象损坏!*

*由于其重要性,有意重复!

下一步是分析铲斗空间利用率,并了解成本的来源。

监控页面

尽管 GCS 浏览器不显示按存储桶划分的总空间利用率,但有几种不同的方法可以获得此信息。我更喜欢 GCP 监控页面。以下是首次使用监控页面时谷歌的设置说明:

如果您从未使用过云监控,那么在您第一次访问 Google 云控制台中的 监控 时,会自动创建一个工作区,并且您的项目会与该工作区相关联。否则,如果您的项目不与工作区相关联,那么将出现一个对话框,您可以创建一个工作区或将您的项目添加到现有的工作区。我们建议您创建一个工作区。做出选择后,点击 添加

加载后,了解 GCS 使用情况的最简单方法是在 resource dashboard 下选择它。

作者图表

在资源仪表板上展开对象大小图形的图例,提供了所有存储桶及其当前空间利用率的列表。

作者图表

在这种情况下, us.artifacts bucket 负责我的总存储的 99.7%。主要成本驱动因素已经确定!

解决方案

在我的谷歌云存储中的 5 个自动生成的存储桶中,有 4 个是跨地区的,并且正在产生成本。我将概述 GCP 流程使用每个存储桶的目的,以及如何最小化或消除成本。

作者图表

云跑桶

<project-id>_cloudbuildartifacts.<project-id>.appspot.com桶由 Google Cloud Run 引擎使用。当代码提交到云运行时,引擎使用 cloudbuild 存储桶来存放构建对象,使用工件存储桶作为工件注册表。确切地知道这些对象是什么并不重要,但是您应该知道它们在部署之后通常并不重要,并且没有理由将它们放在多区域存储桶中。

好消息是 GCP 允许用gcloud builds submit 命令重载缺省值。以下是确保您不会因 Clour Run 部署而产生更多 GCS 成本的步骤:

  1. 用您想要的区域存储(例如 gcr_store)创建一个新的存储桶
  2. 为这个存储桶中的构建对象创建一个默认文件夹(例如 source)
  3. 为这个存储桶中的工件对象创建一个默认文件夹(例如工件)
  4. 在您的部署目录中创建一个类似下面这样的cloudbuild.yaml文件(注意映射到新工件文件夹的位置和指示使用什么构建器gcr.io/cloud-builders/docker

5.使用--gcs-source-staging-dir标志来指定在构建新的云运行应用程序时应该保存构建对象的位置,并包含您的 config yaml 文件

gcloud builds submit --gcs-source-staging-dir=gs://gcr_store/source --config cloudbuild.yaml

6.删除您自动生成的<project-id>_cloudbuildartifacts.<project-id>.appspot.com

5.(可选)在新存储桶上添加一个生命周期规则,以删除超过 X 天(如 7 天)的对象

完成后,您应该不再有与您的云运行部署流程相关联的多区域存储桶,如果您发现您的自定义存储桶的大小失控,您可以实施步骤 6。

云函数存储桶

gcf-sources-<id>-<region>桶用于存储 Google Cloud Function (GCF)对象和元数据。这个文件夹与您的函数部署在同一个区域,应该不会太大(我的文件夹是 11 kB,包含 5 个函数)。我不建议接触这个桶的内容,因为它可能会永久损坏你的 GCF 对象。

一些云函数也将使用 Cloud Build,它将工件转储到us.artifacts.<project-id>.appspot.com桶中。参见下面的us . artifacts Bucket部分,以及如何处理这些对象。

应用引擎桶

在部署期间,staging.<project-id>.apopspot.com桶被谷歌应用引擎用于临时存储

App Engine 还会创建一个存储桶,用于在部署新版本的应用时进行临时存储。这个桶名为 *staging.project-id.appspot.com* ,仅供 App Engine 使用。应用程序无法与此桶进行交互。

您不能去掉这个桶,但是您可以通过在构建时用-bucket标志指定一个不同的桶来减少存储对象的数量。以下是确保您从该铲斗中获得最低成本的步骤:

  1. 使用您想要的区域存储(例如 gae_storage)创建一个新的存储桶——如果需要,您可以为每个应用程序使用不同的存储桶
  2. 使用-bucket标志来指定部署应用程序时构建对象应该保存在哪里
gcloud app deploy --bucket=gs://gae_storage

3.删除staging.<project-id>.apopspot.com目录中除ae/文件夹以外的所有内容

完成后,多区域staging.<project-id>.apopspot.com存储桶将得到最低限度的利用,您的自定义存储桶将包含每个部署的应用程序的 99%的对象。

应用引擎部署也利用us.artifacts.<project-id>.appspot.com桶。参见下面的美国工件桶部分,以及如何处理这些对象。

美国文物桶

us.artifacts.<project-id>.appspot.com桶用于存储由云构建服务生成的容器映像。我观察到的在这个桶中生成对象的唯一过程是云函数和应用引擎构建。由这些过程生成的对象可以安全地在部署后移除,如这里的所述

部署完成后,App Engine 不再需要容器映像。请注意,它们不会被自动删除,因此为了避免达到存储配额,您可以安全地删除任何不需要的图像。

这同样适用于云函数工件。

虽然我不使用 Firebase 来部署功能,但我在网上看到了几个公开的标签,表明下面的方法可能会给你带来问题。我可能会写另一篇文章来探讨 Firebase 问题和可能的解决方案。

如果您使用 Firebase 部署功能,请不要完全删除此存储桶,也不要遵循以下说明!

我们不能完全移除铲斗,但我们可以遵循以下步骤来最大限度地减少空间占用。

  1. 导航到us.artifacts.<project-id>.appspot.com存储桶的生命周期选项卡
  2. 添加一个新的生命周期规则,删除年龄大于 X 天的对象(我使用 7 作为我的)
  3. 删除此桶中的所有对象

完成后,您应该会看到这个存储桶的空间消耗显著下降。在我的例子中,我能够将 85%的已用空间释放到 300MB 以下。

结论

GCP 是一个很好的平台,但当涉及到元数据对象的自动存储和构建容器映像时,事情会变得复杂和混乱。通过这次考察,我有机会更多地了解了云运行、App Engine 应用程序和云功能是如何管理的。我希望你也能从这篇文章中学到一些东西,如果不能,至少我能帮助你整理你的 GCS 环境。

祝好运,编码快乐!

原载于 2021 年 3 月 2 日 https://theappliedarchitect.com**的

什么是数据民主化?

原文:https://towardsdatascience.com/what-the-heck-is-data-democratization-39b86eb27aa6?source=collection_archive---------25-----------------------

变更数据

提示:它不仅仅是使数据可访问

作者图片

介绍

谷歌“什么是数据民主化”,你会看到所有关于“数据访问”是数据民主化的关键的顶级搜索结果(除非你发现这个很棒)。

截图来自谷歌搜索

然而,仅仅给予数据访问权——无论是作为数据仓库中的原始数据,还是作为产品分析工具或商业智能工具中的美丽可视化图像——肯定不是数据民主化。

那是什么呢?

数据民主化是正在进行的过程,使组织中的每个人,不管他们的技术知识如何,都能够舒适地使用数据**,感到自信地谈论数据,因此,做出基于数据的决策建立由数据驱动的客户体验

一个真正想要实现数据民主化的组织需要遵循以下原则(在本指南中称为数据民主化三要素):

  • 让员工能够放心地询问与数据相关的问题
  • 提供合适的工具,让每个人都能处理数据
  • 将数据民主化视为一个持续的过程,甚至可能需要整个组织的文化转变

在深入探讨以上内容之前,请允许我离题。

数据挑战

Mixpanel 最近进行了一项调查,受访者包括在各行各业的产品团队中工作的人,这些公司的员工从不到 10 人到超过 1000 人不等。

这项调查的目标是了解产品团队之间关系的好、坏、丑,以及数据。如果你想深入研究,这是完整的报告。

当被问及挑战时,最常见的挑战如下:

  • 我无法访问我需要的数据
  • 我不能相信这些数据
  • 我可以访问数据,但缺乏找到问题答案的技能
  • 我公司提供的分析工具不是为产品团队设计的
  • 我公司的数据专家太忙了,无法帮助我

如果您的员工认为上述一个或多个陈述是正确的,那么可以有把握地认为您组织的数据民主化需要努力。

有趣的是这些挑战是如何映射到上述原则的。

是时候深入研究数据民主化的三大优势了。

如何让员工在问数据相关的问题时感到舒服?

从在您的组织中制作数据素养表开始。

数据素养不应再被视为一种美好的拥有,每个人都应该获得他们需要的资源,以便成为他们希望的数据素养。

对于一些人来说,理解收集什么数据看起来像什么就足够了。

而其他人可能会发现甚至知道为什么某些数据被跟踪,它是如何做的,它存储在哪里,以什么格式是值得的。

因此,数据素养解决了数据民主化的最大瓶颈之一——对数据的访问。

获取数据,但什么数据和在哪里?

当有人说他们无法访问数据时,他们可以参考数据库中的原始数据、数据仓库中的转换数据、可视化仪表板形式的数据、产品分析工具中的产品使用数据、订阅分析工具中的交易数据、客户参与工具中的人口统计数据、客户数据平台中关于营销活动的数据等等。你明白了。

当那个人可以指定他们希望在哪里访问什么数据时,提供访问变得不那么复杂。此外,如果此人能够在正确的时间、正确的地点访问正确的数据,他们更有可能会信任这些数据。

因此,下次有人说他们没有访问数据的权限,并且他们无法指定在哪里他们想要访问什么数据时,您就有了一个需要解决的数据读写能力问题。

不同层次的数据素养

很明显,数据素养并不局限于知道如何编写 SQL 查询或如何分析复杂的报表。

每个团队都需要某种形式的数据来执行他们的日常任务或分析他们工作的影响。但是具有不同数据需求的不同团队需要不同水平的数据素养。

实现数据跟踪、从数据中获得洞察力以及根据这些洞察力采取行动需要非常不同的技能。此外,通过运行数据导向的营销活动来根据这些见解采取行动,需要不同的技能组合,而不是通过查看 CRM 中的相同数据来识别正确的潜在客户。

同样,构建预测模型和实时交付个性化体验依赖于不同类型的数据和非常不同的技能。前者需要数据科学方面的培训,而后者是数据工程要解决的问题。

可以肯定地说,在某种程度上,数据素养已经成为个人在工作中脱颖而出的先决条件。投资于让员工获得数据素养的公司肯定会让竞争对手迎头赶上。

既然我们同意数据素养是桌面赌注,那么数据民主化三重任务中的下一个原则就是通过投资工具让每个人都能够使用数据。

这引出了一个问题..

如何选择合适的工具让每个人都能处理数据?

要回答这个问题,首先让我们看看不同的团队通常如何处理数据。

  • 市场营销利用数据创造引人入胜、转化率更高的内容
  • 增长利用数据进行实验,提供个性化体验
  • 产品工程*使用数据构建实际使用的功能,并删除那些没有使用的功能*
  • 支持处理数据以提供更快的解决方案(通过查看用户在产品中做了什么或没做什么)
  • 客户成功利用数据提供更好的客户体验(根据使用模式向他们提出正确的问题)
  • 销售使用数据来识别可能转化的潜在客户(通过查看他们在免费试用期间的行为)。

几个工具真的能做到以上所有的吗?绝对不会。

这只是对最常见的数据处理方式的高度概括。这还不包括数据团队的需求,他们需要一整套其他工具来确保在正确的时间以正确的格式在正确的系统中提供正确的数据。

仅仅是产品和增长团队就需要至少半打工具来做好他们的工作(我说的是同类最佳的工具,而不是“做得很差,但却什么都做”的工具)。

说真的!我一点也不夸张。

工匠的好坏取决于他们的工具

每个工具都在变成数据工具,迫使每个团队都要懂数据。

产品和增长团队需要像 MixpanelHeap 这样的工具来进行产品分析,需要像 HotjarFullStory 这样的工具来收集定性数据,需要像 VWOAB Tasty 这样的工具来运行 A/B 测试,需要像 UserflowUserpilot 这样的工具来引导入职,需要像 Intercom 或这样的工具 像 Customer.ioUserlist 这样的工具用于生命周期电子邮件活动,以及像 mParticle 或 Segment 这样的客户数据平台用于数据统一

好了,已经有七种工具了,我们只讨论了用于产品和增长团队的基本数据工具。除此之外,每家公司都需要一套其他特定于数据的工具,根据公司的规模,这些工具可以由专门的数据团队管理,也可以由产品团队管理。

至少,企业,特别是那些捕获大量数据的企业,必须投资一个数据仓库(DWH) ,如雪花BigQuery ,以使所有数据可用于分析和下游行动,一个商业智能(BI) 工具,如 LookerMode ,它位于 DWH 之上,支持自助分析, 一个数据集成(ETL/ELT) 工具,如 FivetranStitch 将数据从外部系统(如上面提到的七个工具)移动到 DWH,以及一个反向 ETL 工具,如 HightouchCensus 将数据从 DWH 移动到外部系统以进行下游操作。

从上面的愿望清单中可以看出,仅在数据分析的背景下,今天的公司就需要一个产品分析工具和一个 BI 工具——它们都为不同的团队服务于不同的目的。这是除了谷歌分析或营销需要的网络分析的等价物。

唷!这确实看起来势不可挡,但这是未来——要么接受它,要么被甩在后面。

至关重要的是投资一套工具,使个人能够有效地处理数据,并在不依赖他人的情况下做出以数据为导向的决策。这使每个人都富有成效,并保持团队士气高昂!

此外,实现能很好地完成工作的同类最佳工具比花费无数时间寻找理想的工具要好,或者更糟,决定构建一些容易购买的东西。

构建还是购买是另一个话题,但我必须说,无论你采取哪种方式,一定要评估你的决定对你的员工有什么影响,特别是它对他们的日常工作和长期目标有什么影响。

记住这一点,让我们解决..

为什么数据民主化是一个持续的过程,可能需要组织中的文化转变?

首先,我想说的是,公司的规模及其增长轨迹会严重影响数据民主化的速度。不用说,在一家公司的早期,建立数据民主要容易得多,因为更容易塑造支持它的文化。

大型组织可能面临一系列挑战,数据民主也可能被视为数据演示疯狂!

请记住,组织越大,就应该越早投资于数据民主化进程。

为了避免将本指南写成一本书,我将只关注大中型公司的需求,这些公司有专门的营销、增长、产品、工程、支持、客户成功和销售团队。

那么,为什么数据民主化是一个持续的过程?

因为它依赖于数据素养,这也是一个持续的过程。数据世界正在经历前所未有的增长,工具和技术的发展速度令人着迷。但这也很难跟上,坦率地说,对于数据空间之外的大多数人来说,这有点烦人,因为它会影响他们的工作。

至少,组织中的每个人,无论其角色如何,都应该能够毫不费力地获得与数据相关的问题的答案。

此外,各种团队如何处理数据以及处理到什么程度应该成为组织内的常识。员工应该很容易知道谁可以访问什么类型的数据,数据存储在哪里,以及访问数据或对数据提出问题的流程是什么。

Airbnb 的 data portal是一个很好的例子,说明了大公司如何通过分配专用资源来解决这个巨大的问题,从而使数据民主化。像 Dataportal 这样的项目当然需要持续的资源,但回报似乎是值得努力的。

最后,我们在谈论什么样的文化转变?

Mixpanel 调查中提到的挑战之一是我公司的数据专家太忙了,没时间帮我

数据民主化需要一种文化转变,使这种挑战过时——在您的组织中成为过去。

每个依靠数据来出色完成工作和实现目标的人都应该成为数据专家。

组织中的每个人都应该对谈论数据充满信心,并具备处理数据的工具和知识,能够在没有任何依赖性的情况下获得问题的答案。

最后,组织中的每个人都应该有机会为数据相关项目做出有意义的贡献。

建立数据民主没有公认的通用方法,但赋予人们权力似乎是朝着这个方向迈出的合乎逻辑的一步。

如果你喜欢这篇文章,你可能也会喜欢 《数据节拍快讯》

关于在数据科学行业工作,互联网没有告诉你什么

原文:https://towardsdatascience.com/what-the-internet-doesnt-tell-you-about-working-in-the-data-science-industry-855a9913394c?source=collection_archive---------18-----------------------

期望与现实—在一家大型数据科学公司担任数据分析师一个月后

Unsplash 上的 krakenimages 拍摄的照片

哇,时间过得真快。就这样,我现在正式成为研究生数据分析师已经一个月了。

还有什么比写一篇文章来记录我在旅途中学到的经验和观察并与世界分享更好的方式来反思过去的一个月呢?

具体来说,在这篇文章中,我想解决我对这个角色的期望与现实之间的差异,这种期望很大程度上是由互联网告诉我的数据分析师工作是什么样的而形成的,而现实是数据分析师工作实际上是什么样的。

我觉得有必要分享我的故事,因为像你们中的许多人一样,互联网在我决定从事这一领域的职业中发挥了巨大的作用。

虽然网上有很多令人惊奇的资源(教程视频、文章、博客帖子等)。)涵盖了作为一名数据分析师的技术方面,但我发现这份工作的其他方面并不经常在互联网上讨论或展示。

如果你目前正在考虑从事数据科学方面的职业,我认为你现在应该确切地了解自己正在进入的职业,而不是在做了与你最初预期完全不同的事情后后悔。

所以,废话不多说,这是我对互联网没有告诉你的关于在数据科学行业工作的看法。

1.口头和书面沟通技巧被低估了

在我得到工作机会的前几个月,我的大部分时间都花在了在线课程或个人项目上。

虽然做这些事情有助于加深您对数据科学项目背后的工作流的理解,并提高您的编码能力,但它们缺少一个关键的组成部分:协作。

你看,当我在做我的个人项目时,我都是自己做的。我不需要和任何人交流,我不需要向我的经理汇报我在做什么,我只是在我的笔记本电脑上写代码。

然而,说到行业,现实远非如此。

在现实世界中,无论你是数据工程师、数据科学家还是机器学习工程师,你最有可能在团队环境中工作。

例如,在我目前的公司,项目团队通常由以下人员组成:

  • 根据项目时间表委派和管理团队进度的首席顾问
  • 一两名资深分析师,他们更有经验,有能力处理更复杂的任务
  • 一些像我一样的初级分析师仍在学习诀窍,但渴望做出贡献

正如你所看到的,当你在一个项目中工作时,你很容易与 4-5 个人一起工作,在某些时候,你的工作需要被检查错误和进一步的反馈。

这时,口头和书面交流的能力变得极其重要。这可能是向你的同事更新你正在做的工作,寻求帮助,总结你的分析中的关键发现,最重要的是,记录你的工作。

就我个人而言,我花了一些时间来适应这种工作方式,因为我花了太多时间在自己的项目上。但如果你渴望有一天在这个行业工作,这绝对是我鼓励你尽快开始掌握的东西。

实际上,这意味着在编码时养成写注释的习惯,学习如何使用版本控制系统,如 Git ,在完成一项分析后写一份总结报告等等。

一旦你开始实践这一点,你将成为一个更好的沟通者,这将使你在任何专业环境中取得成功,而不仅仅是在数据科学领域。

2.你不需要知道所有的编程语言

最近收到一封粉丝的邮件。他告诉我,他已经完成了一些在线课程,对于使用一种或两种编程语言来处理数据和机器学习,他感到相当舒服。

然后,他在电子邮件中问我,为了最大化获得数据科学工作的机会,他下一步应该学习什么编程语言。

看了他的问题,我心都碎了。但我不怪他。

特别是对于初学者来说,很容易陷入这样一个陷阱,认为你知道的编程语言越多,你就越容易找到工作。因此,许多人最终陷入这种永无止境的循环,追逐下一个要学习的闪亮技术,而不是使用他们已经知道的技术开始一个项目。

事实是,我迄今为止遇到的大多数数据科学家都是从只懂一两种编程语言开始的。

我得出的结论是,一个好的数据科学家不是知道所有编程语言的人,而是能够快速适应团队使用的东西并且足智多谋的人。

不要误解我。我不是说所有的技术都一样。显然,你需要考虑业内大多数人在使用什么,我很高兴现在就告诉你:Python、R 和 SQL。

除此之外,学习其他工具没有什么好处,尤其是如果你的目标是获得一个入门级的数据分析师职位。你的时间花在一个项目上以及提高你解决问题的技能上会更好。

3.并非所有的数据分析师都是一样的

不,我不是指数据工程师、数据科学家和机器学习工程师之间的区别。网上有大量的其他文章和视频详细探讨了这个话题。

相反,我想更多地关注在咨询公司工作的数据分析师与在产品公司工作的数据分析师之间的区别,我认为这在互联网上很少被谈论。

我想讨论这个问题的原因是,根据你最终选择的道路,你所承担的任务和责任会有所不同。

例如,如果你不喜欢长时间工作,从事产品工作可能更适合你。另一方面,如果你对工作和与客户打交道充满热情,你应该考虑进入咨询行业。

我目前在咨询行业工作,虽然我以前没有亲自从事过产品方面的工作,但我觉得我对这两者之间的差异有足够好的理解,因为几周前我采访了一位产品经理。

以下是这次谈话的一些要点:

咨询

  • 面向客户端,来自客户端的大量特别请求
  • 小时通常(如果不总是)更长
  • 在 PowerPoint 演示上花费更多时间
  • 项目覆盖的广度大于深度,更多地接触不同的行业
  • 更加强调实用性(例如,我的客户能理解吗?)比复杂,因为有时候你需要与非技术客户沟通
  • 例子:四大会计师事务所(德勤、EY、普华永道和毕马威)中的 BCG Gamma 和数据分析

产品

  • 不要面向客户,你的客户就是你工作的公司
  • 更稳定的时间是可以预测的
  • 项目覆盖的深度大于广度,你的主要精力是不断改进和优化产品
  • 你在那个产品或行业内变得非常专业,你知道所有的细节
  • 工具和技术通常更加严格和技术性
  • 例如:谷歌、脸书、Canva 和 Atlassian

同样值得指出的是,没有哪一个比另一个更好。这完全取决于你优先考虑什么,你更喜欢做什么。

根据我的理解,这两者之间也有很多重叠,这使得如果你决定在未来尝试不同的道路,很容易切换。

4.你不必学习数据科学来成为一名数据科学家

在开始这个角色之前,我有很多冒名顶替综合症的感觉,主要是因为我没有计算机科学背景,我担心我会比其他人处于劣势。

但随着我与公司内越来越多的人交往,我意识到许多人也来自非传统领域。工程、金融、生物信息学,应有尽有。人们来自各行各业,并最终在他们现在所做的事情上表现出色。

事实证明,成为数据科学家并不一定要学习数据科学。最重要的是你有利用数据解决问题的好奇心和热情。

在工作中学习实际上比你想象的要容易得多,只要你知道基础知识(基本的统计学,一些编程经验并了解如何汇总数据),并有学习的渴望。

一旦你开始跑步,你会很自然地开始学习新技能,更重要的是,将这些技能融入情境中,以解决你面临的问题。

长话短说,不要仅仅因为你没有获得计算机科学学位就对从事数据科学职业感到气馁。如今,数据科学以某种形式存在于许多不同的行业中。你的学位不是目的,而是一切。

擅长数字并有一定程度的编程知识?你有机会了!

5.数据科学并不总是建立模型

互联网有美化数据科学行业的趋势。

花足够多的时间在线阅读数据科学相关内容,你将不可避免地发现机器学习、人工智能、神经网络和数据建模等术语。

虽然这些是构成数据科学整体的部分组成部分,但陷入认为这是你在工作中 100%时间要做的事情的陷阱是危险的。

在网上流行谈论的事情和现实生活中实际发生的事情之间存在偏差。我认为,人们被激励去谈论网上更流行的东西,以吸引浏览者和订阅者,这一事实有时会导致对现实的不准确描述。

到目前为止,进入角色一个月了,我还没有做过一点建模或预测,可能在可预见的未来也不会。

事实是,特别是作为一名入门级的数据分析师,你的大部分时间都将花在寻找、验证和清理数据上,也就是说,作为一名数据分析师,这是一个平凡而没有吸引力的部分,没有人喜欢谈论。具有讽刺意味的是,正是数据科学中平凡而不吸引人的部分才是最关键的。

你看,真实世界的数据可能会非常混乱,人们经常会忽略将原始数据转换为干净数据所花费的时间和精力。离群值、缺失值、重复、不一致的命名约定,应有尽有。

在一段数据准备好进行探索性分析和建模之前,需要做大量艰苦的工作。

我并不是说这是一种令人不快的方式,但我真的认为,重要的是,你要意识到这些任务是你最有可能被要求去做的,而不是有一种错误的心态,认为你会一直构建花哨、复杂的模型。

然而,从好的方面来看,我个人确实认为做这些看似例行公事和无聊的任务实际上是一件好事,因为它不仅教会我们欣赏干净的数据,而且还帮助我们在处理数据时培养对细节的高度关注。

我希望这篇文章能够给我们一些启发,让我们更好地了解在这个行业中作为一名数据分析师是什么样的。

此外,我还希望这篇文章能成为一个邀请,开始培养尽职调查、习惯和技能,比如使用 Git 和记录代码,以便在数据科学的职业生涯中获得真正的成功。

如果您目前正在寻找一份数据分析师的工作,或者如果您有兴趣了解我是如何获得目前职位的,请随时查看我下面的其他文章:

https://chongjason.medium.com/i-finally-got-a-data-science-job-39f58774785 https://medium.com/geekculture/70-data-science-interview-questions-you-need-to-know-before-your-next-technical-interview-ccfbd37a37b3

感谢您的阅读,我希望在我的下一篇文章中见到您!

你在说什么行动?

原文:https://towardsdatascience.com/what-the-ops-are-you-talking-about-518b1b1a2694?source=collection_archive---------30-----------------------

DataOps vs. MLOps vs. AIOps 如何选择?什么是适合您的大数据团队的运营?

两年前,我因领导一次低效的行动而获得了不光彩的徽章。我有数据科学和机器学习的背景,所以当然,我们已经从我们的工程同事那里了解了 DevOps。

我们大概是这样认为的。

当时我们对此感到莫名其妙,因为我们的数据科学家就坐在数据工程师旁边。我们遵循了所有良好的敏捷实践,讨论我们的阻挡者,并且没有“把它扔过墙”的态度。我们密切合作,我们的科学家和工程师相亲相爱。但是开发很慢,团队成员很沮丧。

快进两年,我终于领悟了 DevOps 的真谛。以及在一个数据团队中如此相同但又如此不同。

在讨论以数据为中心的运营之前,让我们先从软件说起。这里有太多的相似和对比,所以请原谅我…

照片凯利·西克玛在 Unsplash 上拍摄,由作者编辑。

自从 2000 年代后期 DevOps 流行以来,软件行业一直被各种各样的 ops 术语所困扰。10 年前,软件开发到部署有一种完全不同的方法。软件工程师开发应用程序,然后交给运营工程师。该应用程序在部署过程中经常出现问题,并在团队之间造成严重摩擦。

DevOps 实践使部署过程变得更加顺畅。这个想法是将自动化作为一等公民来构建&部署软件应用。

这种方法彻底改变了这个行业。许多组织开始组建跨职能团队来管理整个 SDLC。该团队将建立基础设施(基础设施工程师),开发应用程序(软件工程师),建立 CI/CD 管道(开发运维工程师),部署应用程序(每个工程师),然后持续监控和观察应用程序(站点可靠性工程师)。

在一个大团队中,不同的工程师有一个主要的职能。但是在较小的团队中,一个工程师经常扮演许多角色。理想的情况是让许多团队成员能够履行多种职能,这样就消除了瓶颈和关键人员的依赖性。所以在现实中…

DevOps,与其说是一个工作职能,不如说是更多的实践或文化。
在构建任何软件之初都应该采用。

加上 DevOps 的兴起,诞生了各种各样的 op。

软件开发世界中存在的各种操作。由作者生成。

SecOps 以安全为核心,GitOps 致力于持续交付,NetOps 确保网络能够支持数据流,itOps 专注于软件交付之外的操作任务。但总的来说,这些运营的基础源自 DevOps 承诺的愿景:

“为了尽快发布软件,

误差极小。”

五年前, F 数据是新的石油这句话大肆宣传。世界各地的领导者开始投入资源建立大数据团队,以挖掘这些宝贵的资产。这些团队的交付压力是巨大的——毕竟,我们怎么能辜负新石油的承诺呢?随着快速扩张,分析团队也经历了相当多的悲伤。

然后我们让这一切发生了。

数据科学家成为 21 世纪最性感的职业。我们不断壮大,正处于数据和分析的黄金时代。每位高管都有一个仪表盘。一个仪表板,其中包含来自整个组织的数据和嵌入的预测模型。每位顾客都有基于其行为的个性化建议。

但是现在添加一个新功能需要几周甚至几个月的时间。数据模式很混乱,没有人知道我们是使用信贷团队还是营销团队的活跃客户的定义。我们对将模型投入生产变得谨慎,因为我们不确定它会破坏什么。

因此,以数据为中心的社区站在一起,承诺反对因管理不善的数据流程而导致的低效率。此后,各种以数据为中心的运营模式也应运而生…

在以数据为中心的团队中诞生的各种操作:数据操作 vs . m 操作 vs . ai 操作。由作者生成。

数据操作🆚MLOps🆚DevOps(和 AIOps?)

* :在本文中,分析团队指的是使用 SQL/PowerBI 为业务生成洞察的传统 BI 团队。人工智能团队是指使用大数据技术建立高级分析和机器学习模型的团队。有时他们是同一个团队,但我们将把他们分开,这样更容易解释概念。

为了了解所有这些不同的运营,让我们来看看数据是如何在组织中流动的:

  • 数据是由与软件应用程序交互的客户生成的。
  • 该软件将数据存储在其应用程序数据库中。
  • 分析团队从跨组织团队的这些应用程序数据库中构建 ETL。
  • 分析团队为业务用户构建报告和仪表板,以做出数据驱动的决策。
  • 然后,数据工程师将原始数据、整合数据集(来自分析团队)和其他非结构化数据集吸收到某种形式的数据湖中。
  • 然后,数据科学家从这些海量数据集中构建模型。
  • 然后,这些模型利用用户生成的新数据进行预测。
  • 然后软件工程师向用户展示这些预测,
  • 这个循环还在继续…

我们知道 DevOps 的诞生是因为开发和运营团队之间产生的摩擦。因此,想象一下运营、软件、分析和人工智能团队之间的 4 向接口带来的头痛。

为了解释不同的运营是如何解决上述流程的,这里有一个图表,它描绘了每个工作职能在时间线上执行的一些任务。

每个工作职能在时间线上执行的任务的图表。由作者生成。

理想情况下,X-Ops 文化应该在项目开始时就被采纳,并且在整个项目中实施。

总而言之,这就是每个 Ops 的含义:

DevOps 更快地交付软件

一组实践旨在消除开发和操作团队之间的障碍,以便更快地构建和部署软件。它通常由工程团队采用,包括开发运维工程师、基础设施工程师、软件工程师、站点可靠性工程师和数据工程师。

DataOps 更快地交付数据

一套提高质量和缩短数据分析周期的实践。DataOps 的主要任务包括数据标记、数据测试、数据管道编排、数据版本控制和数据监控。分析和大数据团队是数据运营的主要运营商,但任何生成和消费数据的人都应该采用良好的数据运营实践。这包括数据分析师、BI 分析师、数据科学家、数据工程师,有时还包括软件工程师。

MLOps 更快地交付机器学习模型

一套设计、构建和管理可复制、可测试和可持续的 ML 驱动软件的实践。对于大数据/机器学习团队来说,MLOps 包含了大多数数据操作任务和其他特定于 ML 的任务,如模型版本化、测试、验证和监控。

额外收获:AIOps 利用人工智能的力量增强了 DevOps 工具

有时人们会错误地将 MLOps 称为 AIOps,但它们是完全不同的。来自 Gartner:

A IOps 平台利用大数据、现代机器学习和其他高级分析技术,通过主动、个性化和动态的洞察力,直接和间接增强 IT 运营(监控、自动化和服务台)功能。

因此,AIOps 通常是 DevOps 工具,使用人工智能技术来增强服务产品。AWS CloudWatch 提供的警报和异常检测是 AIOps 的一个很好的例子。

💎委托人而非工作角色

人们错误地认为,为了实现这些运营部门承诺的效率,他们需要从选择正确的技术开始。其实技术不是最重要的。

DataOps、MLOps 和 DevOps 实践必须与语言、框架、平台和基础架构无关。

每个人都有不同的工作流程,该工作流程应该由负责人提供信息,而不是您想要尝试的技术,或者最流行的技术。先用技术的陷阱是,如果你想用锤子,所有东西对你来说都像钉子。

所有的运营都有相同的 7 个首要原则,但每个原则都有细微的差别:

1.服从

DevOps 通常担心网络和应用程序的安全性。在 MLOps 领域,金融和医疗保健等行业通常需要模型的可解释性。DataOps 需要确保数据产品符合 GDPR/HIPPA 等法律。

🔧工具: PySyft 解耦私有数据用于模型训练, AirCloak 用于数据匿名化。令人敬畏的人工智能指南关于人工智能的原则、标准和法规的管理。

2.迭代开发

这一原则源于敏捷方法,它关注于以可持续的方式持续产生商业价值。该产品的设计,建造,测试和部署迭代,以最大限度地快速失败和学习的原则。

3.再现性

软件系统通常是确定性的:代码应该每次都以完全相同的方式运行。所以为了确保可再现性,DevOps 只需要跟踪代码。

然而,机器学习模型经常因为数据漂移而被重新训练。为了重现结果,MLOps 需要对模型进行版本化,DataOps 需要对数据进行版本化。当审计员问及哪个数据被用于训练哪个模型来产生这个特定的结果时,数据科学家需要能够回答这个问题。

🔧工具:实验跟踪工具,如 KubeFlowMLFlow 或 SageMaker 都具有将元数据链接到实验运行的功能。厚皮DVC 用于数据版本控制。

4.测试

软件测试包括单元测试、集成测试和回归测试。数据操作需要严格的数据测试,包括模式变更、数据漂移、功能工程后的数据验证等。从 ML 的角度来看,模型的准确性、安全性、偏倚/公平性、可解释性都需要测试。

🔧工具:库如 Shap & Lime 用于可解释性, fiddler 用于可解释性监控,远大前程用于数据测试。

5.持续部署

机器学习模型的持续部署有三个组成部分。

  • 第一个组成部分是触发事件,即触发是数据科学家的手动触发、日历计划事件还是阈值触发?
  • 第二个组成部分是新模型的实际再培训。产生模型的脚本、数据和超参数是什么?它们的版本以及它们是如何相互链接的。
  • 最后一个组件是模型的实际部署,它必须由部署管道进行编排,并准备好警报。

🔧工具:大部分工作流管理工具都有这个,比如 AWS SageMaker、AzureML、DataRobot 等。开源工具如 SeldonKubeflow KFServing

6.自动化

自动化是 DevOps 的核心价值,实际上有许多工具专门用于自动化的不同方面。以下是机器学习项目的一些资源:

7.监视

软件应用需要监控,机器学习模型和数据管道也是如此。对于 DataOps,监控新数据的分布以发现任何数据和/或概念漂移非常重要。在 MLOps 方面,除了模型降级之外,如果您的模型有公共 API,监控对抗性攻击也是非常重要的。

🔧工具:大多数工作流管理框架都有某种形式的监控。其他流行的工具包括用于监控指标的 Prometheus ,用于数据模型监控的 Orbit by Dessa

结论

采用正确的 X-Ops 文化来加速交付数据和机器学习驱动的软件产品。请记住,原则高于技术:

  1. 培养跨学科技能:培养 T 型个人和团队
    弥合差距,协调责任
  2. 尽早自动化(足够):汇聚到一个技术堆栈上,并自动化
    流程以减轻工程开销
  3. 着眼于最终目标进行开发:预先投资解决方案设计,以减少从概念验证到生产的摩擦

感谢阅读 ⭐在媒体LinkedIn 上关注我,或者访问我的网站。此外,如果你想了解更多关于云原生技术和机器学习部署的信息,请发电子邮件给我们。

什么鬼东西!?

原文:https://towardsdatascience.com/what-the-pip-71dbfeda12eb?source=collection_archive---------21-----------------------

深入探讨 Python 更好的包管理

克莱门特·布科·勒沙特维基共享资源上拍摄的照片

Python 通常非常适合数据科学,然而,包管理对于许多人来说仍然是一个困惑的话题,做得更是如此。有几个原因可以解释为什么花时间学习诀窍是值得的:

  • 我们可以自动化繁琐耗时的手动任务
  • 我们可以与其他开发人员分享依赖性的变化
  • 我们可以保证可重复的代码构建和测试运行

本文的目的就是要做到这一点,带读者了解管理 Python 项目的依赖关系所涉及的复杂性和最佳实践,假设读者很少或根本没有这方面的知识。我们将从非常的开头开始,所以请随意跳过任何已经熟悉的部分。

包到底是什么?

包是相关代码模块的集合,通常捆绑在一起并分发,以便为其他软件系统提供有用的通用功能。正如函数允许我们重用自己的代码一样,包提供了重用第三方代码的标准方式。

术语包和依赖项将在本文中互换使用。

Python 打包索引( PyPI )是 Python 包的分发平台,通常使用 Python 命令行工具的包安装程序( pip )来安装这些包。

pip install <package>

这种依赖关系管理方法对于小型项目来说已经足够了。然而,随着我们的代码增长并开始依赖更多的包,记忆和安装每个包所需的努力变得不那么容易了。出于这个原因,项目的依赖项通常会列在根目录下的需求文件中。

/my_project
   **requirements.txt**
   /src
   /test
   ...

理想情况下,这个文件将由源代码进行版本控制,以确保依赖关系的更改对所有开发人员都可用。

git add requirements.txt
git commit -m "Add requirements"
git push

-r选项允许我们使用 pip 从需求文件进行安装。

pip install -r requirements.txt

到目前为止,我们已经避免描述这个文件的内容,因为它将是整篇文章中的热门话题。现在,知道每行必须包含 python 包的名称就足够了。

从前在狂野的西部…

一个项目的需求文件是一个无法无天的地方,依赖关系在那里自由漫游。通过 unpinned ,我们的意思是软件包不绑定到任何特定的版本:pip 将在每次安装时下载最新的版本。例如:

pandas
requests
boto3

为什么这是一个问题?

无法保证一个包的版本有令人不安的含义,尤其是当一个突破性的改变被发布到它的公共 API 时。

作者图片

开发人员安装一个包,然后使用它编写并运行一些有效的 Python 代码。在这个时间点上,一切看起来都很好!

然而,后来这个包发布了一个突破性的改变。随后进行安装的个人会收到此更改,因为依赖项被解除固定,并且相同的代码会因 ImportError 而失败。

这让开发人员很头疼,他们不能保证代码在彼此的机器上可靠地运行。如果我们用一个自动化的测试运行替换另一个开发人员,我们可以看到它是如何容易出现间歇性故障的。用部署脚本替换它们,这样的破坏可能会影响到实时系统。

作者图片

用别针别住它

也就是说我们的依赖关系必须被钉住! Pinning 指的是明确指定安装哪个版本的过程,保证在不同时间不同机器上的包解析是可预测的。

一个简单的方法是将每个包固定到它当前安装的版本,我们可以通过使用 pip 进行检查来找到它。

pip show <package>

然后,我们通过在每个包名后面手工添加版本号来固定我们的需求文件。

pandas==1.2.4
requests==2.25.1
boto3==1.17.92

这当然比让一切都不固定有所改进,但也有一些缺点:

手动更新包是乏味的,尤其是当我们的需求文件变得很大的时候。然而,如果做不到这一点,我们的依赖就会变得陈旧:无法从改进、补丁或安全修复中受益。

更重要的是,不能保证我们依赖的包都是钉住自己的依赖!除非我们钉住整个依赖树,否则不钉住的包仍然可能临时出现。

作者图片

这反过来给我们的需求文件增加了噪音:区分直接包和可传递包变得很困难,手工管理每个版本甚至更麻烦。

自动化拯救世界

幸运的是,有工具可以为我们做艰苦的工作;值得注意的是,画中画工具:

pip-tools:一套保持 Python 依赖关系新鲜的工具。

pip install pip-tools

让我们看看它提供的两个实用程序,pip-compilepip-sync,以我们之前的解钉需求文件为例。按照惯例,这个文件的扩展名应该是.in

以这种方式保存一个未固定的包的副本,使得查看和管理直接的项目依赖关系变得容易,将固定的需求从问题的症结中分离出来。

/my_project
   **requirements.in**
   /src
   /test
   ...

从解钉的依赖项中,pip-compile将为我们生成钉扎的依赖项,处理寻找合适版本和添加适当约束的繁琐工作。

pip-compile requirements.in

输出是一个熟悉的requirements.txt文件,我们永远不需要修改它。

/my_project
   requirements.in **requirements.txt** /src
   /test
   ...

检查requirements.txt,我们应该高兴地发现整个依赖关系树已经被钉住,确保后续的安装是可预测和可重复的。我们还可以看到每个包来自哪里,从而提高调试的可追溯性。

#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile requirements.in
#
boto3==1.17.92
# via -r requirements.in
botocore==1.20.92
# via
#   boto3
#   s3transfer
certifi==2021.5.30
# via requests
chardet==4.0.0
# via requests
idna==2.10
# via requests
jmespath==0.10.0
# via
#   boto3
#   botocore
numpy==1.20.3
# via pandas
pandas==1.2.4
# via -r requirements.in
python-dateutil==2.8.1
# via
#   botocore
#   pandas
pytz==2021.1
# via pandas
requests==2.25.1
# via -r requirements.in
s3transfer==0.4.2
# via boto3
six==1.16.0
# via python-dateutil
urllib3==1.26.5
# via
#   botocore
#   requests

作者图片

每当我们想要更新所有的包时,我们可以再次运行pip-compile,用最新的版本重新生成我们固定的需求:这比我们自己手动修改它们要容易得多!

可以使用--upgrade-package参数更新单个的包。

pip-compile --upgrade-package pandas

随后,pip-sync允许我们安装这些固定的依赖项。最好在虚拟环境中这样做,这样不同项目中的包版本就不会相互重叠。

python -m venv .venv
source .venv/bin/activate
pip-sync

有了这些工具,我们在成为 Python 软件包专家的道路上走得很好!

但是等等,还有呢!

到目前为止,我们已经讨论了作为软件系统运行时依赖的包。然而,故事并没有就此结束,因为额外的打包工具可能有助于开发过程:linters、测试框架、部署库等等。

出于前面概述的相同原因,以相同的方式管理工具版本是可取的,但是这样的工具只在特定的上下文中需要。虽然对开发人员和他们的测试有所帮助,但是这些包并不被源代码本身使用,因此在与代码捆绑在一起进行部署时可以忽略它们。这减小了构件的尺寸和潜在攻击面。

作者图片

实现这种分离的一种常见方法是保存多个需求文件:每一个都指定了特定上下文中所需的包。我们将使用两个这样的文件。

/my_project
 **requirements.in
   requirements-dev.in**
   /src
   /test
   ...

requirements.in包含我们熟悉的非固定运行时依赖项。

pandas
requests
boto3

包含我们未固定的开发依赖项。

black
pytest
safety

同样,在开发、测试和部署过程中保持包版本的固定以保证代码的可预测性是非常必要的。由于每个需求文件都是独立的,共享包可能会被固定到不同的版本。使用pip-sync将两个.txt文件安装在一起会突出问题,但不会修复它。

pip-compile requirements.in
pip-compile requirements-dev.in
pip-sync *.txtIncompatible requirements found: ...

作为一种补救措施,我们从添加运行时和开发需求之间的引用开始。

-r requirements.in
black
pytest
safety

然后,我们可以利用一个新工具, pip-compile-multi :

pip-compile-multi:编译多个需求文件来锁定依赖版本。

pip-compile-multi的功能与pip-compile相似,允许我们一起编译多组依赖项,同时还可以跟踪引用。已经固定在我们的运行时需求中的包将从开发需求中省略,因此前者作为共享包版本的单一真实来源。这允许我们将两套需求一起安装,而不会产生冲突。

pip-compile-multi *.txt
pip-sync *.txt

概括起来

  • 软件包允许我们在我们的软件系统中重用由第三方开发的有用的、通用的功能。
  • Python 包使用 PyPI 分发,使用 pip 安装。
  • Python 包通常列在一个需求文件中,以便于管理,并允许对它们进行版本控制。
  • 应该固定软件包,以确保在不同时间不同机器上的安装是可预测和可重复的。
  • Pip-tools 为我们固定软件包,使它们更容易更新。这使我们能够从改进、补丁和安全修复中受益。
  • 通过应用程序和开发环境来划分需求允许我们最小化构建工件的大小。
  • Pip-compile-multi 一起编译多个需求文件,防止共享包版本冲突。

感谢您花时间阅读这篇文章!我希望它被证明是有用的,任何反馈都非常感谢。

他们没有告诉你的:人类仍然远远胜过人工智能的 4 种方式

原文:https://towardsdatascience.com/what-they-dont-tell-you-4-ways-humans-still-vastly-outperform-ai-ba640aae0d4?source=collection_archive---------18-----------------------

人工智能

媒体报道经常把人工智能描绘得比它实际上更聪明。

安德烈·亨特在 Unsplash 上的照片

人工智能系统看起来如此智能,因为它们更多地暴露了反映它的成就。现实告诉我们并非如此。

每当人工智能有显著突破时,我们只会听到系统变得多么智能和熟练。2012 年辛顿的团队在 ImageNet 挑战赛中获得了 63%的最高准确率。几年后,一个系统以惊人的+90%的最高准确率超越了人类的表现。新闻:“AI 能比人类更好地识别物体。”嗯,不当他们在真实世界的对象数据集上测试这个精确的模型时,它的性能下降了 40–45%

去年,人们为 GPT 3 号疯狂。《纽约时报》、、《卫报》、《连线》TechCrunchDigitalTrends 以及许多其他享有盛誉的新闻杂志都在传播它惊人的能力。炒作过头了,OpenAI 的首席执行官 Sam Altman 不得不降低语气:

“[GPT-3]令人印象深刻[……]但它仍然有严重的弱点,有时会犯非常愚蠢的错误。人工智能将改变世界,但 GPT 3 号只是非常早期的一瞥。”

相比之下,几乎没有人谈论 AI 仍然非常愚蠢的所有任务。人工智能不太聪明不会成为吸引人的标题。尽管深度学习系统取得了所有的成功,但人工智能仍然在一些关键方面与“超人”相反。加里·马库斯是纽约大学的心理学教授,也是著名的人工智能专家,他在自己的书《重启人工智能 中提到了一些例子。在这篇文章中,我将解释我们在哪些方面仍然远远胜过人工智能——并且在可预见的未来仍将如此。

理解语言——语用学

生成性预训练语言模型是人工智能的最新趋势。2017 年,谷歌发明了变压器架构,这已经成为大多数 NLP 系统的首选。鼎盛时期出现在去年,当时由 OpenAI 开发的基于变形金刚的模型 GPT-3 显示出在学习和生成语言方面无与伦比的能力。从令人难以置信的结果中可以得出结论,GPT 3 号掌握了语言。但是,它只擅长句法和语义:语言的形式和结构。它缺乏理解。它无法将形式与潜在的意义联系起来,也无法触及语言的语用维度。

我最近为数据科学写了一篇文章,声称“人工智能不会很快掌握人类语言。”像 GPT-3 这样强大的艺术级模型可以生成人类级别的语言,但它们不知道为什么输出给定的句子。虽然 GPT-3 可以说:“我今天早上吃了一个苹果”,但这并不意味着它知道闻、摸或吃苹果是什么感觉。它缺乏实际去做的主观体验。

语言的目的是将现实与对现实的心理表征联系起来。AI 无法访问我们共享的物理现实,因为它被困在虚拟世界中。如果我不说:“我今天早上吃了一个苹果”,而是说:“我今天早上吃了一个苹果。我去了商店,拿了它,吃了它,然后离开,“只有人类才能推断我偷了它——以及这么做的社会/法律含义。今天的人工智能无法获取这种类型的实用信息。

[## 人工智能不会很快掌握人类语言

towardsdatascience.com](/ai-wont-master-human-language-anytime-soon-3e7e3561f943)

了解世界——虚拟陷阱

反对机器学习是通向 AGI 的正确道路的最有力的论据之一是,智能需要具体化。联结主义人工智能——机器学习是其中最重要的范式——松散地基于笛卡尔二元性:思想和身体是不同的、分离的物质。因此,智慧可以在没有身体的情况下产生。哲学家休伯特·德雷福斯是第一个批评这种观点的人。今天,有一个完整的子领域叫做发展机器人基于相反的想法:智能来自于大脑和身体与世界的互动。

除了具身认知,其他论点将连接主义者 AI 推向了绝境: Judea Pearl 认为机器学习和深度学习是只能利用数据相关性的技术,而我们通过识别事件的因果来学习。约书亚·特南鲍姆(Joshua tenen Baum)希望给人工智能注入我们在进化过程中发展起来的直觉物理概念,而这正是机器所缺乏的。 Gary Marcus 捍卫了将连接主义人工智能与基于符号知识的旧范式相结合,向机器灌输常识的想法。

现在的 AI 没有具体化,不懂因果关系,不懂物理,也不懂语言,不会表现出常识性的推理。然而,我们每天都用这些能力在世界上导航。只要机器在计算机中生存和发展,被限制在虚拟现实的范围内,它们就不能理解世界。用 Ragnar Fjelland 教授的话来说:“只要计算机不长大,不属于一种文化,不在世界上活动,它们就永远不会获得类似人类的智能。”

适应新环境——外推

Andre Ye写了一篇精彩的文章深入神经网络的理论基础。在他的文章中——T4·史蒂芬·平克和加里·马库斯在推特上称赞了他的文章——他解释了一般化(内插法)和外推法之间的区别。他认为神经网络只不过是“伟大的近似器”。他说,神经网络的目标是在训练范围内进行归纳,而不是超出训练范围。本质上,神经网络是一个高度熟练的多维插值器。

但是人类可以推断。我们可以在给定的训练范围之外做出“合理的预测”外推包括将一个问题的结论转化为另一个不同的——通常更复杂的——性质的结论。机器学习系统无法执行这一过程,很大程度上是由于“独立同分布(iid)”假设。它声明真实世界的数据和训练数据具有相同的分布,这是错误的。深度学习革命的三位领先先驱 Geoff Hinton、Yoshua Bengio 和 Yann LeCun 在最近的一篇论文中解释了为什么这是一个关键缺陷:

“人类可以以一种不同的方式进行归纳,这种方式比普通的 iid 归纳更强大:我们可以正确地解释现有概念的新组合,即使这些组合在我们的训练分布下极不可能出现。”

没有什么能保证机器学习系统能够像我们一样进行推断。这也是为什么 Elon Musk 不得不在本周早些时候收回他在推特上的话:

“广义的自动驾驶是一个困难的问题,因为它需要解决现实世界人工智能的很大一部分。没想到这么难,但回想起来难度是显而易见的。没有什么比现实拥有更多的自由度。”

快速学习新事物——进化适应性

机器学习系统——尤其是深度学习系统——需要大量数据(已标记或未标记)来学习,需要大量计算能力来训练。三种主要的培训框架——监督学习、强化学习和自我监督学习——都受到这些限制。在击败 Stockfish 之前,AlphaZero 与自己进行了 4400 万场比赛。GPT-3 是用互联网的大部分文本数据训练出来的。国际象棋专家和世界级作家不需要这么多的练习。

总的来说,相比之下,人类儿童学得相当快。在 1 个月大的时候,语前婴儿能够辨别音素。1 岁前,他们可以推断因果关系。孩子们在 5 岁的时候就能通过稀疏的数据学会流利地说话。成年人也没什么不同。经过几个小时的练习,我们可以学会驾驶的基本知识。正如我们之前看到的,经过多年的模拟,自动驾驶汽车仍然远远低于我们的水平。

正如辛顿、本吉奥和勒村在他们的论文中提到的,“人类似乎能够学习大量关于世界的背景知识,主要是通过观察,以独立于任务的方式。”我们从经验和观察中快速学习的能力是无与伦比的。这个难题的关键是进化。我们开发了很好的工具来导航世界,而人工智能是由我们直接设计的。人工智能必须通过学习来弥补进化优势的缺乏。我们来到这个世界上,大部分时间都在准备应付它。人工智能必须从零开始学习。

总结

AI 很擅长解决一些问题。机器学习系统开始在感知任务中表现出色,也称为系统 1 任务——借用心理学家丹尼尔·卡内曼的概念。但它们似乎无法主导高级认知能力。

人类也很擅长解决一些问题。与人工智能有一些重叠,但我们在更高的认知任务方面仍然没有挑战。推理、规划、决策、理解因果关系、语言或直觉物理……所有这些大脑过程仍然在人工智能的范围之外。而且看起来也不会很快改变。

跟我一起去未来旅行了解更多关于人工智能、哲学和认知科学的内容!此外,欢迎在评论中提问或在 LinkedIn 或 Twitter 上联系!😃

推荐阅读

什么是时间加权平均值,为什么你应该关心

原文:https://towardsdatascience.com/what-time-weighted-averages-are-and-why-you-should-care-523ee234b942?source=collection_archive---------37-----------------------

如何计算时间加权平均值以及如何使用它们进行数据分析

图片由国家癌症研究所Unsplash 上拍摄

了解如何计算时间加权平均值,为什么它们对于数据分析如此强大,以及如何使用 TimescaleDB 超函数来更快地计算它们——全部使用 SQL。

许多处理时间序列数据的人都有很好的、定期采样的数据集。数据可以每隔几秒或几毫秒采样一次,或者他们选择的任何时间,但是我们所说的定期采样是指数据点之间的时间基本上是恒定的。计算常规数据集中指定时间段内数据点的平均值是一个相对容易理解的查询。但是对于那些没有定期采样数据的人来说,获取一段时间内的代表性平均值可能是一个复杂且耗时的查询。当您处理不规则采样数据时,时间加权平均值是获得无偏平均值的一种方式

时间序列数据来得很快,有时每秒产生数百万个数据点(阅读更多关于时间序列数据的信息)。由于信息量和信息速率巨大,时间序列数据可能已经很难查询和分析,这就是为什么我们构建了 TimescaleDB,一个多节点、Pb 级、完全免费的时间序列关系数据库

不规则采样的时间序列数据只是增加了另一个层次的复杂性,而且比你想象的更常见。例如,不规则采样的数据,因此需要时间加权平均值,经常出现在:

  • 工业物联网,团队通过仅在值改变时发送点来“压缩”数据
  • 遥感,从边缘发回数据可能成本高昂,因此您只需为最关键的操作发送高频数据
  • 基于触发的系统,其中一个传感器的采样率受另一个传感器的读数影响(即,当运动传感器被触发时,安全系统会更频繁地发送数据)
  • …还有很多很多

在 Timescale,我们一直在寻找让开发人员的生活更轻松的方法,尤其是当他们处理时序数据时。为此,我们引入了 hyperfunctions ,这是一个新的 SQL 函数,可以简化 PostgreSQL 中时间序列数据的处理。这些超功能之一使你能够 快速高效地计算时间加权平均值,因此你获得了数小时的生产力。

请继续阅读时间加权平均值的示例,它们是如何计算的,如何在 TimescaleDB 中使用时间加权平均值超函数,以及如何使用它们来提高项目生产率的一些想法,无论在哪个领域。

什么是时间加权平均值?

我在时标公司做了 3 年多的开发人员,在数据库工作了大约 5 年,但在那之前我是一名电化学专家。作为一名电化学家,我为一家电池制造商工作,看到过很多这样的图表:

电池放电曲线示例,描述了电池可以供电多长时间。(这也是时间加权平均值的主要例子💯必要)图片由作者来源于https://www.nrel.gov/docs/fy17osti/67809.pdf

那是一条电池放电曲线,描述了电池可以为某样东西供电多长时间。x 轴显示以安培小时为单位的容量,由于这是一个恒流放电,x 轴实际上只是时间的代理。y 轴显示电压,决定电池的功率输出;当你继续给电池放电时,电压会下降,直到需要充电为止。

当我们为新的电池配方做 R&D 时,我们会对许多电池进行多次循环,以找出哪些配方使电池持续时间最长。

如果您更仔细地观察流量曲线,您会注意到只有两个“有趣”的部分:

电池放电曲线示例,调出“有趣的位”(数据快速变化的时间点)。作者图片

这些是放电开始和结束时电压快速变化的部分。在这两个部分之间,中间有一段很长的时间,电压几乎没有变化:

电池放电曲线示例,调出“无聊位”(数据保持相当稳定的时间点)。作者图片

现在,当我之前说我是一个电化学家时,我承认我有点夸张了。我对电化学的了解足够危险,但是我和那些拥有博士学位的人一起工作,他们比我更了解 T2。

但是,在处理数据方面,我常常比他们做得更好,所以我会做一些事情,比如对恒电位仪进行编程,这是一种为了进行这些测试而连接电池的设备。

对于放电周期中有趣的部分(开始和结束时的部分),我们可以让恒电位仪以最大速率采样,通常大约每 10 毫秒采样一次。我们不希望在电压不变的漫长而无聊的时间里采样那么多数据点,因为这意味着保存大量值不变的数据,浪费存储空间。

为了减少我们必须处理的枯燥数据而不丢失有趣的部分,我们将程序设置为每 3 分钟采样一次,或者当电压变化合理时,比如超过 5 mV。

实际上,会发生这样的事情:

叠加数据点的电池放电曲线示例,用于描述感兴趣位期间的快速采样和无聊位期间的慢速采样。作者图片

通过以这种方式采样数据,我们将在有趣的部分获得更多的数据,而在无聊的中间部分获得更少的数据。太好了!

它让我们回答了更多关于曲线快速变化部分的有趣问题,并为我们提供了关于缓慢变化部分的所有信息,而无需存储大量冗余数据。但是,这里有一个问题:给定这个数据集,我们如何找到放电期间的平均电压?****

这个问题很重要,因为这是我们可以将这个放电曲线与未来的放电曲线(比如 10 或 100 个周期后的曲线)进行比较的事情之一。随着电池老化,其平均电压会下降,随着时间的推移下降多少可以告诉我们电池在其生命周期中的存储容量如何,以及它是否可以变成有用的产品。

问题是,感兴趣位中的数据采样频率更高(即感兴趣位有更多数据点),这将在计算平均值时赋予它更大的权重,尽管它不应该如此。

电池放电曲线示例,用说明性的数据点表明,虽然我们在有趣的时刻收集了更多的数据,但它们不应该算作“额外的”作者图片

如果我们只是对整个曲线取一个简单的平均值,将每个点的值相加,然后除以点数,这将意味着采样率的变化可能会改变我们计算的平均值…即使潜在的影响实际上是相同的!

我们很容易忽略我们试图识别的任何差异——任何关于我们如何改进电池的线索都可能在我们采样协议的变化中丢失。

现在,有些人会说:那么,为什么不在恒电位仪的最大速率下采样,即使是在无聊的部分?嗯,这些放电测试运行真的长。它们需要 10 到 12 个小时才能完成,但有趣的部分可能很短,从几秒钟到几分钟。如果我们以最高的速率采样,大约每 10 毫秒采样一次,这将意味着要存储多几个数量级的数据,尽管我们几乎不会使用这些数据!数量级更多的数据意味着更多的成本,更多的分析时间,各种各样的问题。

所以最大的问题是:当我们处理不规则间隔的数据点时,我们如何得到一个有代表性的平均值?****

让我们从理论上考虑一下:

(接下来的这一点有点方程式的味道,但我认为它们是相对简单的方程式,它们很好地映射到它们的图形表示上。我总是喜欢人们给我计算背后的数学和图形直觉,但如果你愿意,你可以跳过来看看时间加权平均是如何使用的。)

数学位:如何得出时间加权平均值

假设我们有如下几点:

理论上的、不规则采样的时间序列数据集;作者图片

那么,正常平均值就是这些值的总和除以总点数:

等式:平均值等于值(v1,v2,v3,v4)之和除以 4。

但是,因为它们的间距不规则,我们需要一些方法来解释这一点。

考虑这个问题的一种方法是在每个时间点得到一个值,然后除以总时间。这就像得到曲线下的总面积,除以总时间δt。

不规则采样时间序列数据集下的区域;作者图片

等式:更好的平均值等于曲线下的总面积除以总时间(δT)。

(在这种情况下,我们在点之间进行线性插值)。所以,让我们集中精力找到那个区域。前两点之间的区域是一个梯形:

代表前两点下面积的梯形;作者图片

实际上是一个长方形加一个三角形:

同一个梯形被分解成一个长方形和一个三角形。作者图片

好,让我们来计算面积:

等式:面积等于δt1 乘以 v1 加上δt1 乘以δv1 除以 2。

所以要说清楚,那就是:

δt1 乘以 v1 表示矩形的面积。δt1 乘以δv1 除以 2 表示三角形的面积。

好吧。所以现在如果我们注意到:

等式:δv1 等于 v2 减去 v1。

我们可以很好地简化这个等式:

开始于:

等式:δt1 乘以 v1 加上δt1 乘以 v2 减去 v1 除以 2。

排除因素:

δt1 除以 2

等式:δt1 除以 2 乘以 2v1 加上 v2 和 v1 之差。

简化:

等式:δt1 除以 v1 和 v2 之和的两倍。

值得注意的一点是,这给了我们一种新的方式来考虑这个解决方案:它是每对相邻值的平均值,用它们之间的时间加权:

等式:面积等于 v1 加 v2 除以 2 乘以δt1。

它也等于绘制到 v1 和 v2 中点的矩形面积:

画到两点之间中点的梯形和矩形的面积相等。作者图片

既然我们已经导出了两个相邻点的公式,我们可以对数据集中的每一对相邻点重复这个过程。然后我们需要做的就是求和,这就是时间加权和,等于曲线下的面积。(学过微积分的人可能会记得他们学习积分和积分近似时的一些内容!)

计算出曲线下的总面积后,我们只需将时间加权总和除以总δT,就得到时间加权平均值。💥

既然我们已经在理论上研究了我们的时间加权平均值,让我们用 SQL 测试一下。

如何在 SQL 中计算时间加权平均值

让我们考虑一个冰淇淋制造商或店主监控他们的冰柜的场景。原来,冰淇淋需要保持在一个相对较窄的温度范围内(~ 0–10℉)(见脚注 1 ),这样它才不会融化并重新冻结,造成那些没人喜欢的怪异晶体。同样,如果冰淇淋变得太冷,就太难舀了。

当人们开关冰箱门时,冰箱里的空气温度会有很大的变化,但是冰淇淋的温度变化需要更长的时间。因此,只有长时间暴露在极端温度下,问题(融化、讨厌的冰晶)才会发生。通过测量这些数据,冰淇淋制造商可以对储存在冰箱中的每批产品进行质量控制。

考虑到这一点,冰柜中的传感器以如下方式测量温度:当门关闭并且我们处于最佳范围时,传感器每 5 分钟测量一次;当门打开时,传感器每 30 秒测量一次,直到门关闭,温度回到 10℉以下。

为了建模,我们可能有一个简单的表,如下所示:

CREATE TABLE freezer_temps (  freezer_id int,  
    ts timestamptz,  
    temperature float);

一些数据是这样的:

INSERT INTO freezer_temps VALUES
( 1, '2020-01-01 00:00:00+00', 4.0),
( 1, '2020-01-01 00:05:00+00', 5.5),
( 1, '2020-01-01 00:10:00+00', 3.0),
( 1, '2020-01-01 00:15:00+00', 4.0),
( 1, '2020-01-01 00:20:00+00', 3.5),
( 1, '2020-01-01 00:25:00+00', 8.0),
( 1, '2020-01-01 00:30:00+00', 9.0),
( 1, '2020-01-01 00:31:00+00', 10.5), -- door opened!
( 1, '2020-01-01 00:31:30+00', 11.0),
( 1, '2020-01-01 00:32:00+00', 15.0),
( 1, '2020-01-01 00:32:30+00', 20.0), -- door closed
( 1, '2020-01-01 00:33:00+00', 18.5),
( 1, '2020-01-01 00:33:30+00', 17.0),
( 1, '2020-01-01 00:34:00+00', 15.5),
( 1, '2020-01-01 00:34:30+00', 14.0),
( 1, '2020-01-01 00:35:00+00', 12.5),
( 1, '2020-01-01 00:35:30+00', 11.0),
( 1, '2020-01-01 00:36:00+00', 10.0), -- temperature stabilized
( 1, '2020-01-01 00:40:00+00', 7.0),
( 1, '2020-01-01 00:45:00+00', 5.0);

门打开后的 31-36 分钟,有更多的数据点。如果我们取所有点的平均值,我们会得到一个误导的值。在 45 分钟内,只有 5 分钟(11%的时间段)冰箱温度高于阈值温度,但是这 5 分钟占了 20 个数据点中的 10 个数据点(50%!)因为我们在冰箱门打开后会更频繁地对其温度进行采样。

为了找到更准确的时间加权平均温度,让我们为上面处理这种情况的公式编写 SQL。为了便于比较,我们还将得到正常平均值。(如果你读起来有困难,不要担心,我们稍后会编写一个简单得多的版本)。

WITH setup AS (
    SELECT 
         lag(temperature) OVER (PARTITION BY freezer_id ORDER BY ts) as prev_temp,
         extract('epoch' FROM ts) as ts_e,
         extract('epoch' FROM lag(ts) OVER (PARTITION BY freezer_id ORDER BY ts)) as prev_ts_e,
         *
    FROM  freezer_temps),
nextstep AS (
    SELECT CASE WHEN prev_temp is NULL THEN NULL 
             ELSE (prev_temp + temperature) / 2 * (ts_e - prev_ts_e) END as weighted_sum,
        * 
    FROM setup)
SELECT freezer_id,
    avg(temperature), -- the regular average
    sum(weighted_sum) / (max(ts_e) - min(ts_e)) as time_weighted_average -- our derived average
FROM nextstep
GROUP BY freezer_id; freezer_id |  avg  | time_weighted_average 
------------+-------+-----------------------
          1 | 10.2  |     6.636111111111111

它确实返回了我们想要的东西,并给了我们一个更好的描述,但是写起来并不有趣,不是吗?

我们有几个窗口函数,一些处理空值的 case 语句,和几个 cte 来试图让事情变得相当清楚。当人们试图弄清楚发生了什么并对其进行调整时,这种事情真的会导致代码维护问题。

代码都是关于管理复杂性的。完成一个相对简单的任务的长而复杂的查询使得下一个开发人员(也就是 3 个月后的你)不太可能理解发生了什么,如何使用它,或者如果他们(或者你!)需要一个不同的结果。或者,更糟糕的是,这意味着代码永远不会被修改,因为人们不太理解查询在做什么,它只是变成了一个没有人想碰的黑盒(包括你)。

时间尺度超功能救援!

这就是为什么我们创造了 超功能 ,让复杂的时序数据分析变得不那么复杂。如果我们使用超函数来计算时间加权平均值,让我们看看时间加权平均冷冻温度查询是什么样的:

SELECT freezer_id,
    avg(temperature),
    average(time_weight('Linear', ts, temperature)) as time_weighted_average
FROM freezer_temps
GROUP BY freezer_id;freezer_id |  avg  | time_weighted_average------------+-------+-----------------------1 | 10.2  |     6.636111111111111

这不是更简洁了吗?!用'Linear'加权法(就是上面推导出来的那种加权)(见脚注 2 )算出一个[time_weight](https://docs.timescale.com/api/latest/hyperfunctions/time-weighted-averages/time_weight/?utm_source=tds&utm_medium=blog&utm_campaign=hyperfunctions-1-0-2021&utm_content=time-weight-docs),然后取加权值的平均值,就大功告成了。我更喜欢那个 API(我也更喜欢,因为是我设计的!).

更重要的是,我们不仅不用编写所有的 SQL,而且编写(在时间加权平均值的基础上构建更复杂的分析)也变得非常非常容易。这是超功能背后的设计哲学的一个重要部分;我们希望将基本的东西变得简单,以便您可以轻松地使用它们来构建更复杂的、特定于应用的分析。

假设我们对整个数据集的平均值不满意,我们希望获得每 10 分钟时段的时间加权平均值:

SELECT time_bucket('10 mins'::interval, ts) as bucket,
     freezer_id,
     avg(temperature),
     average(time_weight('Linear', ts, temperature)) as time_weighted_average
FROM freezer_temps
GROUP BY bucket, freezer_id;

我们添加了一个[time_bucket](https://docs.timescale.com/api/latest/hyperfunctions/time_bucket/?utm_source=tds&utm_medium=blog&utm_campaign=hyperfunctions-1-0-2021&utm_content=time-bucket-docs),按它分组,大功告成!让我们看看超功能所能实现的其他一些复杂的分析。

继续我们的冰淇淋例子,假设我们已经设置了阈值,因为我们知道如果冰淇淋在 15 ℉以上停留超过 15 分钟,它将形成那些冰晶,使其尝起来都是沙质/颗粒状的。我们可以在窗口函数中使用时间加权平均值来查看是否发生了这种情况:

SELECT *,
    average(time_weight('Linear', ts, temperature) OVER fifteen_min) as rolling_twa
FROM freezer_temps
WINDOW fifteen_min AS
     (PARTITION BY freezer_id ORDER BY ts RANGE  '15 minutes'::interval PRECEDING)
ORDER BY freezer_id, ts;freezer_id |           ts           | temperature |    rolling_twa------------+------------------------+-------------+----------------1 | 2020-01-01 00:00:00+00 |           4 |1 | 2020-01-01 00:05:00+00 |         5.5 |               4.751 | 2020-01-01 00:10:00+00 |           3 |                4.51 | 2020-01-01 00:15:00+00 |           4 |  4.1666666666666671 | 2020-01-01 00:20:00+00 |         3.5 | 3.83333333333333351 | 2020-01-01 00:25:00+00 |           8 |  4.3333333333333331 | 2020-01-01 00:30:00+00 |           9 |                  61 | 2020-01-01 00:31:00+00 |        10.5 |  7.3636363636363631 | 2020-01-01 00:31:30+00 |          11 |  7.5108695652173921 | 2020-01-01 00:32:00+00 |          15 |  7.7395833333333331 | 2020-01-01 00:32:30+00 |          20 |               8.131 | 2020-01-01 00:33:00+00 |        18.5 |  8.5576923076923081 | 2020-01-01 00:33:30+00 |          17 |  8.8981481481481491 | 2020-01-01 00:34:00+00 |        15.5 |  9.1607142857142861 | 2020-01-01 00:34:30+00 |          14 |   9.353448275862071 | 2020-01-01 00:35:00+00 |        12.5 |  9.4833333333333331 | 2020-01-01 00:35:30+00 |          11 | 11.3690476190476191 | 2020-01-01 00:36:00+00 |          10 | 11.3295454545454551 | 2020-01-01 00:40:00+00 |           7 |             10.5751 | 2020-01-01 00:45:00+00 |           5 |  9.741666666666667

这里的窗口是过去 15 分钟的,按时间排序。看起来我们保持在低于我们的冰晶温度!

我们还提供了一个特殊的[rollup](https://docs.timescale.com/api/latest/hyperfunctions/time-weighted-averages/rollup-timeweight/?utm_source=tds&utm_medium=blog&utm_campaign=hyperfunctions-1-0-2021&utm_content=rollup-docs)函数,因此您可以从子查询中重新聚合时间加权值。例如:

SELECT average(rollup(time_weight)) as time_weighted_average
FROM (SELECT time_bucket('10 mins'::interval, ts) as bucket,
         freezer_id,
         time_weight('Linear', ts, temperature)
      FROM freezer_temps
GROUP BY bucket, freezer_id) t;time_weighted_average
-----------------------
6.636111111111111

这将为我们提供与第一个等式的总计相同的输出,因为我们只是重新合计了分时段的值。

但这主要是为了让你可以做更有趣的分析,比如说,将每个 10 分钟的时间加权平均值归一化为总的时间加权平均值。

WITH t as (SELECT time_bucket('10 mins'::interval, ts) as bucket,
         freezer_id,
         time_weight('Linear', ts, temperature)
     FROM freezer_temps
     GROUP BY bucket, freezer_id)
SELECT bucket,
     freezer_id,
     average(time_weight) as bucketed_twa,
     (SELECT average(rollup(time_weight)) FROM t) as overall_twa,
      average(time_weight) / (SELECT average(rollup(time_weight)) FROM t) as normalized_twa
FROM t;

这种特性(存储时间权重以供以后分析)在连续聚合中最有用,而我们恰好将时间加权平均值设计为在该上下文中可用!

我们将在未来的帖子中更详细地介绍这一点,所以请务必订阅我们的新闻简报,这样当我们发布新的技术内容时,您就会收到通知。

今天试试时间加权平均值

****如果你想马上开始使用 time _ weight hyperfunction——还有更多——那就升级一个完全托管的 TimescaleDB 服务:创建一个账户免费试用30 天。Hyperfunctions 预装在每个新的数据库服务上,所以在你创建一个新的服务后,你就可以使用它们了!

如果您喜欢管理自己的数据库实例,您可以 下载并在 GitHub 上安装 timescaledb_toolkit 扩展 ,之后您将能够使用 time_weight 和所有其他的超功能。

如果您对这篇博文有任何问题或评论,我们已经在 GitHub 页面上开始了讨论,我们希望收到您的反馈。(而且,如果你喜欢你所看到的,GitHub ⭐也总是受欢迎和赞赏的!)

我们要特别感谢 @inselbuch ,是他提交了 GitHub 问题,让我们开始了这个项目(还有其他人👍让我们知道他们想使用它。)

我们相信时间序列数据无处不在,理解它对于各种技术问题都至关重要。我们构建了超函数,让开发人员更容易利用时序数据的力量。我们一直在寻找关于下一步构建什么的反馈,并且很想知道您如何使用超函数、您想要解决的问题,或者您认为应该或者可以简化的事情,以便更好地分析 SQL 中的时序数据。(要提供反馈,请在 GitHub 的未决问题讨论主题中发表评论。)

最后,在未来的帖子中,我们将围绕我们的设计理念提供更多的上下文,我们围绕时间加权平均值(和其他功能)的 API 做出的决定,并详细说明其他超函数是如何工作的。所以,如果那是你的包,你很幸运——但是你必须等一两个星期。

脚注

  1. 我不知道这些时间或温度本身是否准确;然而,冰淇淋部分融化和重新冻结的现象导致更大的冰晶形成——结果是冰淇淋变得粗糙——这是有据可查的。例如,参见哈罗德·麦基的《论食物与烹饪》(2004 年修订版,第 44 页)。因此,如果你想从一个关于时间序列数据库的博客中寻找关于储存冰淇淋的建议:对于长期储存,你可能希望冰淇淋储存在 0℉以下。我们的例子更像是你在冰淇淋展示中看到的场景(例如,在冰淇淋店或工厂生产线上),因为冰淇淋保持在 0–10℉之间(对于舀来说是理想的,因为较低的温度会使冰淇淋太难舀)。
  2. 我们还提供’LOCF’或最后一次观察结转权重,这最适合于每当值改变时记录数据点的情况(即,旧值在获得新值之前一直有效)。)其推导过程类似,只是矩形具有第一个值的高度,而不是我们在本文中讨论的线性加权(即,我们在相邻数据点之间进行线性插值):

当您知道值在下一点之前保持不变时,LOCF 加权非常有用。作者图片

而不是:

当您以不规则的间隔对变化的值进行采样时,线性加权非常有用。作者图片

一般而言,线性加权适用于采样率可变的情况,但系统不能保证仅在采样率变化时提供数据。当保证系统只在发生变化时才提供数据,并且在收到新值之前可以准确地保留旧值时,LOCF 最有效。

原载于 2021 年 7 月 22 日【https://blog.timescale.com】**

评估分类模型时要考虑什么

原文:https://towardsdatascience.com/what-to-consider-when-evaluating-your-classification-model-a1092ddcc1df?source=collection_archive---------24-----------------------

通过选择正确的评估指标,构建可靠的机器学习模型

安娜·涅克拉舍维奇摄于佩克斯

分类任务中的大量工作放在特征工程和参数优化上,这是理所当然的。这些步骤对于构建具有健壮性能的模型是必不可少的。然而,如果您选择用错误的评估标准来评估这些模型,那么所有这些努力都将付诸东流。

目前,有很多方法可以量化一个模型的性能。然而,由于机器学习术语的混乱,很容易忽略这些指标之间的区别,并随意选择它们。

不幸的是,这样做会妨碍模型满足目标的能力。

例如,模型的功能之一是提供洞察,在随后的分析(例如 A/B 测试)中,哪些特性应该进行研究或实验。如果你依赖于一个用错误的评估标准训练的模型,你将冒着把你的时间、精力和金钱投入到探索错误的变量中的风险。

因此,明智的做法是花时间了解不同评估指标的含义,它们是如何计算的,以及它们何时最有用。

关键术语

在讨论任何指标之前,有必要介绍一些在比较模型预测和实际值时使用的关键术语。

模型进行的分类会导致四种结果之一。

一个真阳性反映了机器正确预测阳性病例的结果。

真否定反映了机器正确预测否定情况的结果。

一个假阳性反映了一个机器将一个阳性预测分配给一个阴性病例的结果

假阴性反映了机器将阴性预测分配给阳性病例的结果。

为了更好地理解这些术语,考虑一个检测信用卡欺诈的模型。

真正的正面结果需要正确地将交易识别为欺诈。

真正的负面结果需要正确地将交易识别为合法。

假阳性结果意味着将合法交易识别为欺诈。

假阴性结果意味着将欺诈性交易识别为合法交易。

这些预测结果充当用于导出分类模型的许多评估度量的组件。

让我们来看看其中的几个。

评估指标

1.准确(性)

这是迄今为止最简单的指标。

精度可通过以下公式计算:

这一指标在现实生活中不受欢迎。因为它不区分假阳性和假阴性,所以对于不平衡的数据集来说,这是一个可怕的选择。

2.精确

精度指标类似于准确度指标。它惩罚假阳性而不考虑假阴性。

其值可通过以下公式计算:

如果您想避免误报或对误报更宽容,这是一个有效的度量标准。

例如,医疗专业人员有足够的动机来避免假阳性。诊断一个病人患有一种他们根本没有的疾病会导致治疗或手术,而这些治疗或手术本来就没有必要。这反过来会对接受他们护理的病人造成更大的伤害。此外,这种错误的预测会导致名誉损失和一连串的诉讼。

3.回忆

召回率度量可以被认为是精确度度量的对立面。这个度量惩罚假阴性并忽略假阳性,而不是惩罚假阳性并忽略假阴性。

召回指标可通过以下公式计算:

考虑之前的疾病诊断案例。虽然假阳性对医疗专业人员来说没有吸引力,但假阴性也是如此。未能诊断出患者实际患有的疾病或状况的成本将导致他们被剥夺必要的治疗。

4.F-1 分数

在许多现实生活中,假阳性和假阴性都没有吸引力。因此,精确度和召回率可能不足以评估模型的性能。

幸运的是,人们可以使用 f-1 分数指标来平衡精确度和召回率,而不是分别跟踪这两个指标。

f-1 得分指标通过以下公式计算:

考虑到它的适用性,当我接手分类项目时,这是我个人的首选指标。

对于许多不希望出现假阴性和假阳性的领域和学科,f1 分数是一个很有吸引力的选择。

5.F-beta 分数

使用 f1 分数的一个警告是,它同等地权衡了精确度和召回率。然而,可能有这样的情况,一个精度可能比回忆更重要,反之亦然。

f-beta 指标非常适合这种情况。它可以通过以下公式导出:

如果您希望精度指标优先于召回指标(即限制误报),请选择低于 1 的 beta 值。

如果您希望召回指标优先于精确度指标(即限制假阴性),请选择大于 1 的 beta 值。

结论

照片由 Unsplash 上的 Prateek Katyal 拍摄

为您的分类模型选择评估指标可能不像数据争论和功能工程那样耗时。

然而,它仍然对你的项目或研究的最终结果有相当大的影响。花时间考虑最适合该模型的指标可以确保令人满意的最终结果。

我祝你在机器学习的努力中好运!

如果你不能对你的产品进行实验,该怎么办?—因果推理 I

原文:https://towardsdatascience.com/what-to-do-if-you-cant-run-experiments-on-your-product-causal-inference-i-f6950bf10681?source=collection_archive---------28-----------------------

简单介绍因果推理及其在产品开发中的应用

https://en.meming.world/wiki/Confused_Nick_Young

最近 AB 测试已经成为产品开发团队的黄金标准。在产品上运行实验有助于团队理解每个变化对他们的关键度量的增量效应,并逐渐改进他们的产品。然而,建立能够有效运行实验的基础设施是非常昂贵的。因此,作为一名产品分析师,您经常需要找到其他方法来量化特性变化对关键指标的影响。在这一系列的文章中,我们将探索为什么实验是理解因果关系的最佳方式,以及在没有因果关系的情况下可以使用的其他因果推理技术。

  1. 理解实验的重要性
  2. 因果推理的统计方法
  3. 因果推理的机器学习

为了理解实验的重要性,让我们快速了解一些关键术语及其定义。我们尤其需要理解混杂因素的概念。

混杂因素

混杂因素是一个独立于我们正在测试的变化的因素,但可能会对我们的关键测试指标产生影响。这些可能是外部因素,如时间和地理位置,也可能是内部因素,如对您的实验产生影响的不同产品变化。

例如,如果你的产品是基于用户的爱好,比如游戏或锻炼,那么星期几很可能会对你的产品产生混淆的影响。他们很可能会在周末比平日更多地接触你的产品,因为他们很可能会在周末有更多的空闲时间来从事上述爱好。

同样,用户的国家或地理位置也会对他们如何使用你的产品产生很大的影响。例如,如果你的产品专注于赌博,世界上不同国家对赌博的不同态度会对用户如何使用你的产品产生巨大的影响。

现在我们对混杂因素有了更好的了解,让我们看看如何用实验数据和观察数据来处理这些混杂因素。

实验数据

实验数据使我们能够控制这些混杂因素,进而使我们能够对变化是否导致我们的关键测试指标增加或减少做出强有力的声明。在产品实验中,用户被随机分配到不同的组。然后给每一组展示产品的不同版本,实验数据是用户参与每个版本的方式的总结。由于这种随机分配,随着用户样本量的增长,每个混杂因素下每个组的分布变得类似于同一混杂因素下整个用户群的分布。因此,每个组都很好地代表了整个用户群,并且与其他组几乎相同。然后,可以使用测试指标直接比较不同的版本,以了解哪个版本最吸引人。

让我们举一个真实世界的例子来帮助理解这个想法。让我们假设获取用户的渠道是实验的混淆因素。这可能是由于不同渠道传递的信息不同,因此通过某些渠道获得的用户对您产品的期望与通过其他渠道获得的用户不同。类似地,这可能是由于来自不同渠道的用户所表现出的不同层次的意图。一个积极寻找你的产品的有机用户比一个点击了脸书广告的用户更有可能被吸引。

下图显示了一个假设的移动应用程序获得的用户的渠道分布。正如我们所看到的,渠道在整个用户群中的分布反映在每个控制和治疗用户组中。这是由于上面提到的随机分配。现在,控制组和治疗组中因渠道而对产品更感兴趣或不太感兴趣的用户比例相等。因此,我们可以直接比较两组的测试指标,以了解哪个版本更好地独立于混杂因素。

实验数据的通道分布(图片由作者提供)

在这一点上值得注意的是,我们可以很容易地测量通过每个渠道获得了多少用户,因此如果渠道是一个混杂因素,我们可以很容易地看到这种影响。如果我们不能观察到我们的混杂因素呢?随机分配的妙处在于,它将这一概念扩展到了无法观察到的混杂因素。

让我们假设用户的头发颜色是我们实验的一个混杂因素。我们假设的应用程序允许用户在打开前置摄像头的情况下应用滤镜。让我们假设,在我们不知道的情况下,用于这些过滤器的面部识别算法对某些颜色的头发比对其他颜色的头发更有效。这将意味着一些用户会比其他人有更好的体验,头发的颜色将是一个我们无法观察到的混淆因素。尽管我们无法测量这种混杂因素,但在足够大的样本量上进行随机分配将确保两个用户组具有相同的用户头发颜色分布,如下图所示。

实验数据的发色分布(图片由作者提供)

观测资料

观察数据是收集的数据,没有假装随机分配给每个版本。在这种情况下,用户被分配到基于时间、地理或一些其他混杂因素的每个版本。例如,我们可以在一个新特性发布之前和之后对用户进行分组,或者只在某些地区发布该特性。

在这种情况下,由于缺乏随机分配,很可能每个组在一个混杂因素下的分布将不同于同一混杂因素下其他组的分布。因此,我们不能仅仅根据各个团队如何参与其中来直接比较不同版本的测试指标。

让我们用前面的例子更仔细地看看这个。让我们假设我们已经在给定的日期发布了我们的特性,并且想要基于群组日期来划分我们的对照组和治疗组。在功能发布前 2 周内安装我们应用程序的所有新用户都是控制组的一部分,在发布后 2 周内安装我们应用程序的所有新用户都是治疗组的一部分。

下图展示了我们团队的渠道分布情况。对照组有更多通过脸书广告获得的用户,而治疗组有更多通过谷歌广告获得的用户。让我们假设通过脸书获得的用户由于信息与产品一致而更加投入。因此,通过脸书获得的用户比通过谷歌获得的用户有更高的参与度。由于两组之间的渠道不平衡,这意味着对照组将具有比两组平衡时更高的参与度指标,类似地,治疗组将具有比两组平衡时更低的参与度指标。如果我们要直接比较两组的测试指标,那么 Channel 将成为一个混杂因素,扭曲我们的实验结果。

观测数据的通道分布(图片由作者提供)

我们如何控制混杂因素?

能够控制混杂因素的第一步是能够测量它们。时间、地理和渠道等混杂因素很容易衡量,因此我们可以控制它们。然而,在没有实验设置的情况下,更难测量的混杂因素,如上述示例中用户的头发颜色,更难控制。

我们可以对实验数据进行的分析是一个强大的工具,可以帮助我们了解产品变化对关键指标的因果影响。但是如果不可能获得实验数据,我们该怎么办呢?有几种不同的技术可以用于观察数据。我们可以使用统计方法,比如不同类型的加权,或者机器学习方法。

因果推理的统计方法

统计方法通过加权参与度来解释组间混杂因素下分布的不平衡。本质上,如果两组在混杂因素下具有相同的分布作为潜在的用户基础,我们将使用它们来计算度量标准。一旦我们做到这一点,我们就可以直接比较不同组之间的计算结果,从而宣布获胜者。

让我们重新看一下渠道的例子,看看实际情况。下面,左边,我们看到的是各个群体的分布,以及获取用户的渠道下的用户基数。图像的右侧显示了应用统计方法后的组。

应用统计因果推断方法后的渠道分布(图片由作者提供)

再次值得注意的是,这些统计方法只能应用于可观察的(即可测量的)混杂因素。

在本系列的下一部分,我将探索可用于此练习的不同统计方法。我将探索的方法包括:

  • 分层
  • 逆概率加权
  • 倾向匹配

因果推理的机器学习方法

一些方法使用机器学习来计算出你的变化对你的关键指标有什么影响,同时控制混杂因素。

如前所述,值得注意的是,这些最大似然法仅适用于可观察(即可测量)的混杂因素。

在本系列的后面部分,我将探索可用于本练习的不同的 ML 方法。我将探索的方法包括:

  • 受控回归
  • 隆起建模
  • 元学习者

我希望这篇博文有助于解释为什么 AB 测试允许我们以比其他方法更强的方式陈述每个变化的因果影响。我还希望它介绍了因果推理技术在产品分析中的应用。请关注本系列的下一部分!

参加一年的 Kaggle 比赛会有什么收获

原文:https://towardsdatascience.com/what-to-expect-from-doing-kaggle-competitions-for-a-year-405836191705?source=collection_archive---------25-----------------------

我已经参加了一年的卡格尔比赛——这里有好的方面也有不好的方面

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

Kaggle 是最大的数据科学竞赛平台。如果你是一个数据科学初学者,你可能已经多次听到过进行几场 Kaggle 比赛的建议。在过去的一年里,我参加了大约 4 次为期 2 个月的比赛,我发现它们非常有帮助。将他们添加到我的个人资料后,我开始找自由职业者的工作,甚至全职数据科学工作,所以我也将在这里详细谈论这一点。

选择 Kaggle 竞赛

我想给你的一个建议是,你在选择你想参加的比赛时要有策略。就我个人而言,我知道我想进入医疗领域,我知道医疗领域目前有点依赖图像。所以我选择了监督图像分类竞赛、分割和物体探测竞赛。我一个都没赢,但这种经历已经足够了。

以下是您可以期望了解到的内容:

  1. 探索性数据分析

数据科学项目的第一步始终是理解您正在处理的数据。有很多这样做的教程,但是相信我,你必须经历为多个项目这样做的过程,才能真正理解和获得技能,因为这很难只是教。不同的项目使用不同的数据,因此在不同的环境中技术总是不同的。一个好的数据科学家知道在给定的场景中使用哪种技术是最好的,以最好地理解和构建潜在的问题。

2。挑选模型并装配它们

这是我最喜欢的部分,我想也是很多人最喜欢的部分。然而在大多数项目中,你将面临选择一个最先进的模型并使用它的挑战。在许多竞赛和现实世界的项目中,你没有时间去完成所有的项目并实施它们,所以你必须对你的选择有战略眼光。您还必须正确理解为什么您的实现没有像预期的那样工作或者给出了糟糕的结果。即使结果很好,你也必须明白为什么。这是数据科学家的一个常见错误,他们从一个模型/实验转到另一个模型/实验,而没有充分分析他们已经做过的实验,因此他们以令人失望的结果告终。

3。开源协同工作

经过多次比赛,我开始注意到这个趋势。在每场比赛中,最终的高分解决方案都是建立在所有开源的好解决方案之上的。直到比赛的最后两个星期,竞争者将不断地发布高分的核仁。这对您来说总是一个学习这些内核、理解它们并在它们之上进行构建的绝佳机会。

4。机器学习项目技巧和优化

在几场比赛的过程中,我总是发现获胜的解决方案有一些小的优化,对他们有利的一点点提高性能。这是你在网上、媒体上或书中找不到的东西。你将不得不去竞争、设计和观察其他人的解决方案,以开始理解这些模式,甚至可能自己开发一个。

我如何利用这些项目来提升我的形象

Unsplash 上由 Bram Naus 拍摄的照片

这是一个枝节问题,但我认为值得一提。我发现,如果你试图通过竞争获得一份数据科学的工作,仅仅参加竞争并忘记它可能是浪费你的时间。如果你不在网上展示你的作品,没人会知道。每次比赛后,我都确保自己对结果进行了适当的反思,理解为什么我会排在前 x%以及我本可以做得更好。之后,下一步是我在 Medium 上写一篇关于我的经历的文章,并写一篇解释获胜解决方案的文章。

您还应该在 GitHub 存储库中正确地格式化和记录您的代码,并在您的文章中添加指向该存储库的链接。最后,确保在你的 LinkedIn 个人资料上添加竞争对手、你的 Kaggle 个人资料和结果,这是相当重要的一步。我发现,在一遍又一遍地正确完成这三个步骤后,人们开始注意到我,并且因为我为我所做的比赛进行的“在线演示”,我已经收到了多个数据科学咨询邀请和一个全职工作邀请。

你从卡格尔比赛中学不到的东西

Kaggle 比赛是一个非常好的起点,但它们不是一切。在我开始获得咨询工作后,我发现你在这些竞争中学到的只是第一步。不要误解我的意思,它们非常有用,但它们并不全面。

在您清理数据、构建高性能模型和一切之后,下一步将是将该模型推向生产。这是一个相当具有挑战性的步骤,伴随着许多问题,例如:

  1. 我应该在哪里部署这个模型?客户端还是服务器端?
  2. 我如何监控该模型的性能?
  3. 我是否有足够的人工智能可解释性度量标准来呈现给项目的涉众?
  4. 我如何证明这个模型将适用于真实世界的数据分布,而不仅仅是它所训练的分布?
  5. 这种模式能满足客户的性能需求吗?如果没有,我该如何改善?

有些问题很难回答,有些问题是开放式的。但是,好消息是,在有了真实世界的经验之后,你可能会给出好的答案。

记录什么?来自 Python ETL 管道!

原文:https://towardsdatascience.com/what-to-log-from-python-etl-pipelines-9e0cfe29950e?source=collection_archive---------18-----------------------

ETL 管道的详细日志结构!

学分- 爆发

作为我工作的一部分,我一直在将一些在传统的基于工具的框架上开发的 ETL 工作转换成 python 框架,并且遇到了一些挑战。这几个挑战是编排、代码管理、日志、版本控制等。对他们中的一些人来说,在工具上开发他们并不需要太多的努力。但是,在像 python ETL 这样的手写代码中,这些都是相当大的挑战!这就带来了一个挑战,也就是我们今天的话题!

此外,我们今天主要关注的是“什么”,而不是描述“如何”,因为平台上已经有许多好文章。

词汇:

  1. 介绍
  2. ETL 框架
  3. 日志的结构!!
  4. 使用我们的日志结构的示例 ETL 作业。
  5. 代码位置。

简介:当我们在工具上设计和开发 ETL 管道时,我们关注像源、目标对象、转换逻辑和一些处理管道的支持任务这样的组件。这些工具还将为所有正在运行的作业生成日志,并且可以通过其内部界面进行监控。基本上,我的意思是说开发/维护日志在工具中并不是一项具有挑战性的活动。而在 python 中,这是一个需要处理的独立活动。今天,在我们的帖子中,我们将讨论 ETL 作业的基本框架,我们可以在任何管道中记录的细节的粗略想法,然后我们将它们组织到我们的 ETL 代码中,最后,我们将开发一个记录日志的示例场景。

ETL 框架:正如我们已经知道的,有不同种类的 ETL 作业,如合并/上插流程、分段加载、SCD 2 加载、增量作业、直接插入加载等。所有这些 ETL 作业都有一个非常基本的结构(如下面的 python 所示),即调用管道中的模块、提取模块、转换模块和加载模块的主要功能,现在,我们可以使用下面的框架来确定 ETL 日志的外观。

def extract():
    pass

def transformation():
    pass

def load():
    pass

def main():
    extract()
    transformation()
    load()

if __name__=="__main__":
    main()

日志的结构:当我们勾勒出 ETL 工作的蓝图时,让我们试着列出一个粗略的想法,我们可以从工作中跟踪哪些细节。

我们可以记录的一系列细节—

  • 显示初始化的元素/组件,如文件夹位置、文件位置、服务器 id、用户 id 详细信息、作业中的流程详细信息
  • 显示提取阶段详细信息,如源文件名、源文件计数(如果需要)、文件格式、文件大小、源表名、源数据库连接详细信息(除了任何秘密身份证明(用户/密码))、文件/源表缺失或无法获取数据消息时的任何异常或错误。
  • 显示转换阶段的详细信息,如在数据处理期间内存不足时的失败/异常消息,以及任何数据/格式转换的详细信息(如果需要)。
  • 显示加载阶段详细信息,如文件/目标位置、加载的记录数、加载失败、任何数据库加载的约束、加载摘要详细信息。
  • 显示作业摘要,如流程运行时间、内存使用情况、CPU 使用情况,这些也可以在提取、转换和加载级别进行跟踪,以均匀地确定作业的瓶颈。

现在让我们把上面的细节整合到我们的 ETL 框架中,看看我们的日志结构是什么样子的!

##basic config
##logging.config.fileConfig('logging.conf')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

#job parameters config
config = configparser.ConfigParser()
config.read('etlConfig.ini')
JobConfig = config['ETL_Log_Job']

formatter = logging.Formatter('%(levelname)s:  %(asctime)s:  %(process)s:  %(funcName)s:  %(message)s')
##creating handler
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(JobConfig['LogName'])
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

def extract(counter):

    logger.info('Start Extract Session')
    try:
        pass
    except ValueError as e:
        logger.error(e)
    logger.info("extract completed!")

def transformation(counter):
    logger.info('Start Transformation Session')
    pass
    logger.info("Transformation completed,data ready to load!")

def load(counter):
    logger.info('Start Load Session')
    try:
       pass
    except Exception as e:
        logger.error(e) def main():

    start = time.time()
    ##extract
    start1 = time.time()
    extract()
    end1 = time.time() - start1
    logger.info('Extract CPU usage {}%'.format(psutil.cpu_percent()))
    logger.info("Extract function took : {} seconds".format(end1))

    ##transformation
    start2 = time.time()
    transformation()
    end2 = time.time() - start2
    logger.info('Transform CPU usage{}%'.format(get_cpu_usage_pct()))
    logger.info("Transformation took : {} seconds".format(end2))

    ##load
    start3 = time.time()
    load()
    end3 = time.time() - start3
    logger.info('Load CPU usage {}%'.format(psutil.cpu_percent()))
    logger.info("Load took : {} seconds".format(end3))
    end = time.time() - start
    logger.info("ETL Job took : {} seconds".format(end))
    logger.info('Session Summary')
    logger.info('RAM memory {}% used:'.format(psutil.virtual_memory().percent))
    logger.info('CPU usage {}%'.format(psutil.cpu_percent()))
    print("multiple threads took : {} seconds".format(end))

if __name__=="__main__":
    logger.info('ETL Process Initialized')
    main()

而且,如果您观察上面的代码结构,我已经创建了一个配置文件来维护所有作业级别的详细信息。通过将该文件导入到您的代码中,您可以利用代码的不同部分,包括用于日志记录。

etlConfig.ini:

##ETL jobs Parameters

[ETL_Log_Job] ##Job name
Job_Name = etl_log_job.py
LogName = etl_log_job.log
TgtConnection = Customers.db
SrcConnection = Customers.db
SrcObject = customer_file.csv
TgtObject = customer##Add more job details as needed

使用我们的日志结构的示例 ETL 作业:

import logging.config
import time
import psutil
import configparser
import pandas as pd
import sqlite3##basic config
##logging.config.fileConfig('logging.conf')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)#job parameters config
config = configparser.ConfigParser()
config.read('etlConfig.ini')
JobConfig = config['ETL_Log_Job']formatter = logging.Formatter('%(levelname)s:  %(asctime)s:  %(process)s:  %(funcName)s:  %(message)s')
##creating handler
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(JobConfig['LogName'])
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)def extract():logger.info('Start Extract Session')
    logger.info('Source Filename: {}'.format(JobConfig['SrcObject']))try:
        df = pd.read_csv(JobConfig['SrcObject'])
        logger.info('Records count in source file: {}'.format(len(df.index)))
    except ValueError as e:
        logger.error(e)
        return
    logger.info("Read completed!!")
    return dfdef transformation(tdf):
    try:
        tdf = pd.read_csv(JobConfig['SrcObject'])
        tdf[['fname', 'lname']] = tdf.NAME.str.split(expand=True)
        ndf = tdf[['ID', 'fname', 'lname', 'ADDRESS']]
        logger.info('Transformation completed, data ready to load!')
    except Exception as e:
        logger.error(e)
        return
    return ndfdef load(ldf):
    logger.info('Start Load Session')
    try:
        conn = sqlite3.connect(JobConfig['TgtConnection'])
        cursor = conn.cursor()
        logger.info('Connection to {} database established'.format(JobConfig['TgtConnection1']))
    except Exception as e:
        logger.error(e)
        return
    #3Load dataframe to table
    try:
        for index,row in ldf.iterrows():
            query = """INSERT OR REPLACE INTO {0}(id,fname,lname,address) VALUES('{1}','{2}','{3}','{4}')""".format(JobConfig['TgtObject'],row['ID'],row['fname'],row['lname'],row['ADDRESS'])
            cursor.execute(query)except Exception as e:
        logger.error(e)
        return
    conn.commit()
    logger.info("Data Loaded into target table: {}".format(JobConfig['TgtObject']))
    returndef main():start = time.time()##extract
    start1 = time.time()
    tdf = extract()
    end1 = time.time() - start1
    logger.info('Extract CPU usage {}%'.format(psutil.cpu_percent()))
    logger.info("Extract function took : {} seconds".format(end1))##transformation
    start2 = time.time()
    ldf = transformation(tdf)
    end2 = time.time() - start2
    logger.info('Transform CPU usage {}%'.format(psutil.cpu_percent()))
    logger.info("Transformation took : {} seconds".format(end2))##load
    start3 = time.time()
    load(ldf)
    end3 = time.time() - start3
    logger.info('Load CPU usage {}%'.format(psutil.cpu_percent()))
    logger.info("Load took : {} seconds".format(end3))
    end = time.time() - start
    logger.info("ETL Job took : {} seconds".format(end))
    ##p = psutil.Process()
    ##ls = p.as_dict()
    ##print(p.as_dict())
    logger.info('Session Summary')
    logger.info('RAM memory {}% used:'.format(psutil.virtual_memory().percent))
    logger.info('CPU usage {}%'.format(psutil.cpu_percent()))
    print("multiple threads took : {} seconds".format(end))if __name__=="__main__":
    logger.info('ETL Process Initialized')
    main()

##Log output for above sample job

我们还可以对日志做一些改进:

  1. 通过为作业实现配置/参数文件,维护作业日志也将变得容易。
  2. 我们可以添加系统级的摘要细节,以便以后优化或识别作业中的瓶颈。能够识别提取、转换和加载的 CPU 性能/使用情况可以为开发人员提供更多帮助。
  3. 如果我们正在加载目标,尝试跟踪加载摘要,这将有助于识别加载数据的一致性。
  4. python 中的日志模块在 ETL 作业中使用简单有效。
  5. 此外,提供进程 id 或线程 id 详细信息可能有助于以后在其他平台上对进程进行故障排除。
  6. 给出服务器或节点上作业运行的详细信息将有助于挖掘根本原因。

样本代码位置:

https://github.com/Shivakoreddi/ETL-Log-Structure

感谢您阅读这篇文章,未来的工作将涉及开发 python ETL 作业的其他挑战,如编排、代码管理、版本控制等。

参考:

  1. 埃利奥特·福布斯,https://tutorialedge . net/python/python-logging-best-practices/(2017)

在量子机器学习框架中寻找什么

原文:https://towardsdatascience.com/what-to-look-for-in-a-quantum-machine-learning-framework-b7a7c281aa4f?source=collection_archive---------20-----------------------

相关量子机器学习框架综述

量子机器学习要不要入门?看看 动手量子机器学习用 Python

作者弗兰克·齐克特的图片

在量子机器学习中,我们的目标是利用量子力学现象,在机器学习算法的计算方面实现巨大的飞跃。

机器学习仍然是一项相对较新的技术。但与量子计算相比,它已经相当成熟了。看看框架的前景就明白了这一点。

当深度神经网络的成功在 2014 年左右结束了第三个人工智能冬天时,我们看到许多框架争夺霸权。有些名字已经快忘了,比如 Theano 和 Caffe。其他的被合并了,比如 Keras。似乎只有两家留下来了,谷歌支持的 Tensorflow 和脸书支持的 PyTorch。

我们见证了关于编程语言的同样的整合。Python 成为机器学习领域的主流编程语言。它使朱莉娅和 R 沦为下层阶级。

量子计算太新了。它甚至不是一项真正的技术。我们刚刚开始弄清楚如何建造量子计算机,以及我们可以用它们做什么。

尽管量子计算的理论已经存在了一段时间,但是实际的量子计算仍然处于绝对的劣势。

在量子计算领域,我们可能会看到类似的整合。当然,你会希望使用一个持久的框架。然而,赢家尚未确定。选手们正在准备。

这些选手是:

  • IBMs Qiskit
  • 谷歌的 Cirq
  • 亚马逊的 AWS Braket
  • 微软的 Q#和 Azure Quantum
  • 里盖蒂的森林
  • 世外桃源的潘尼莱恩
  • 再来几个…

对于现在进入该领域的学生和从业者来说,决定从哪个框架入手并不容易。所以显而易见的问题是,如果你想应用量子机器学习,应该使用哪一个?

像早期的机器学习库一样,量子计算框架在函数数量、语法和抽象级别上有所不同。

较低层次的框架更接近硬件。虽然它们提供了高度的控制,但在开发端到端应用程序时,使用起来可能会很麻烦。

相反,更高级别的框架抽象掉了许多硬件相关的细节。因此,它们使应用程序的开发变得方便,但缺乏细粒度的控制。

当我们谈论量子机器学习时,我们更倾向于应用领域。但是,正如我们所说,我们希望使用量子计算进行机器学习算法的计算。所以对于量子机器学习来说,量子计算是达到目的的手段。因此,要想在量子机器学习方面取得成功,你很可能会选择一种更高级的语言。

量子计算框架对于将想法转化为量子计算机可以执行的指令至关重要。不幸的是,量子计算机是罕见的设备。除非你为享有特权的学术机构或量子计算机的制造商之一工作,否则你不会有机会接触到最先进的量子计算机。

然而,这并不意味着你不能使用量子计算来增强你的机器学习算法。量子计算框架提供了模拟器,您可以使用它在经典计算机上运行量子算法。当然,你的经典计算机计算电路的速度不会像量子计算机那样快。事实上,你的经典电脑会慢得离谱。所以,虽然你不会观察到任何加速(整体性能会比一个纯粹的经典算法差),但你可以使用模拟器来验证你的量子算法是否有效。如果真的如此,你将为量子计算机的问世做好准备。因此,您将希望使用一个提供强大模拟器的框架。

最后,除非你已经是量子机器学习的专家,否则你需要培训材料。例如,这些可能包括在线教程、书籍和 API 参考。如果你不知道如何使用,最好的框架也不会有帮助。

大致说来,有两种培训材料。有开发商提供的官方资料。社区提供的材料已经使用了这个框架。

对于任何人来说,官方资料都是入门的基础。如果一个框架没有文档,即使是专家也无法了解它。大量的官方文件表明开发者对他们的野心有多认真。这是一项投资,制作培训材料需要花费大量的时间和金钱。一个框架开发者不能够或者不愿意投资他们的框架不是一个好的迹象。

但是新来的人通常很难理解官方文件。框架开发人员通常假设领域的先验知识,在我们的情况下,量子机器学习。他们专注于解释如何用他们的框架实现某个算法。但他们通常不会笼统地解释算法。虽然这是完全合理的,但它并不能帮助你开始。

相反,社区驱动的资源也很有味道。它们的范围从初级到高级,再到专家级。此外,具有较大社区的框架更有可能持久。而且,当你遇到问题时,有一个你可以联系的人就像金子一样好。

总而言之,这些是你可能想要在量子机器学习框架中寻找的东西:

  • 开发商是谁?
  • 抽象级别(是否支持更高级别的机器学习算法?)
  • 提供模拟器
  • 学习材料(官方、社区)

考虑到这些事情,让我们看看现有框架的当前状态。

IBM Qiskit

Qiskit(量子信息软件包)是 IBM 的量子软件开发框架。Qiskit 是免费和开源的。

它由四部分组成:

  • QASM 是运行在硬件级的量子指令语言
  • Terra 是底层 API,可以让你在量子脉冲层面编程,形成量子门。
  • Aqua 是支持量子化学、优化问题和机器学习中使用的算法的高级 API。
  • Aer 是一个高性能的量子电路模拟器,甚至包括噪声模型。

IBM 对它的量子计划是认真的。他们是量子硬件的主要制造商之一。他们提供了大量的 API 文档和一本全面的教科书。然而,即使这本教科书看起来是初级的,它面向的是(量子物理学的)专家而不是初学者。作为一名物理学家,你可能会发现阅读起来很容易,但是如果你是一名软件开发人员,你很快就会迷失方向。

Qiskit 周围的社区非常大,非常活跃。当然不能和 Tensorflow 或者 PyTorch 周边的社区比。但是相对于其他框架的社区,Qiskit 似乎是最大和最活跃的。

此外,IBM 甚至主办了一个旨在向高中生教授量子计算的暑期学校。

最后,Qiskit 与 PyTorch 集成。它允许你用量子对应物替换部分神经网络。

而且,还有一个噱头。IBM 让你在 IBM 云中免费运行量子电路——在真正的量子硬件上。然而,你必须等待几个小时,直到他们计算出你的电路。而且,他们提供的量子计算机只有不到十个量子位。你的本地模拟器对于这么小的电路来说也是相当快的。所以,与其说这是一个严肃的开发工具,不如说是一个营销工具。

但是,所有这些东西形成了一个令人信服的一揽子计划。因此,IBM Qiskit 是我目前量子机器学习的头号框架。

谷歌 Cirq

Cirq 是谷歌的量子 SDK。Cirq 是一个开源 Python 框架,用于“创建、编辑和调用有噪声的中尺度量子(NISQ)电路”。Cirq 处于 alpha 阶段,还没有(还没有?)一款谷歌官方产品。

Cirq 与 Qiskit 基于相同的抽象。此外,它还提供了一些库和扩展。他们的数量将来可能会增加。然而,最令人兴奋的已经存在。这是张量流量子。与 Qiskit 的 PyTorch 集成一样,TensorFlow Quantum 允许您在神经网络内部使用量子电路。

官方文档非常广泛,质量也很好。在我看来,在谷歌的积极支持下,这个社区正在稳步发展。

Cirq 附带模拟器,您可以使用 Colab 在云中运行您的代码。

毫无疑问。谷歌的目标是赢得量子霸权的竞赛。而且它的几率也不算太差。

我一定会去看看 Cirq。特别是,TensorFlow Quantum 有望成为我不想错过的工具。

微软 Q#

微软另辟蹊径。又来了。当所有其他框架都使用 Python 作为编程语言时,微软带来了自己的语言。这是 Q#。它与 quantum 开发工具包相集成,后者包括一个 Quantum 模拟器和实现量子算法的库。

微软也提供模拟器,你可以在云端运行你的代码。

官方的培训资料好像也挺不错的。这个社区异常活跃。你可以在那里找到相当多的教程。

但是,说实话,我想用 Python。Qiskit 和 Cirq 与 PyTorch 和 TensorFlow 集成。即使他们没有,唯一的事实是他们使用 Python 使得将你的量子电路与你想让它工作的任何东西集成起来变得容易得多。如果您使用的编程语言没有提供所需的绑定,这种事情就更难了。

亚马逊 AWS Braket

我不得不承认。我是亚马逊 AWS 的忠实粉丝。它是我最喜欢的云提供商。但是,当谈到量子计算时,我仍然有些怀疑。AWS Braket 相对较新。它于 2020 年 8 月启动。网上有一些培训资料。但不如其他选手的素材广泛。

我看不出使用 AWS 软件工具有什么好处。但是,这是一个很大的“但是”,AWS Braket 提供了对真正的 IonQ 和 Rigetti 量子硬件的访问。因此,如果你的目标是在一个高效的环境中运行量子算法,AWS Braket 可能是你要走的路。但是,AWS 不再是免费的了。

里盖蒂计算公司

Rigetti 是领先的硬件制造商之一。它提供了自己的量子编程框架 py Quil——一个针对低级量子指令集 Quil 的绑定。PyQuil 从量子门和经典运算中生成 Quil 程序。它带有一个编译器(quilc)和一个模拟器,量子虚拟机(QVM)。最重要的是,你可以使用 Rigetti 的量子云服务(QCS)或 AWS Braket 在真正的量子处理器(QPUs)上运行 PyQuil 程序。

Rigetti 在他们的 Forest SDK 中捆绑了所有这些组件。它针对作为协处理器运行的近期量子计算机进行了优化,与传统处理器协同工作,运行混合量子经典算法。

Rigetti 没有 IBM、Google、微软那么大。因此,学习材料不像其他框架那样广泛。作为初学者,皮奎尔和森林不会是我的第一选择。但是对于有经验的开发人员来说,它们无疑是一个有效的选择。

Xanadu

最后,还有 Xanadu —(不仅仅是)另一家量子硬件制造商。他们的 Python 库“草莓场”允许你设计、模拟和优化量子电路。进一步,它提供了解决实际问题的高级功能,包括量子机器学习。

Xanadu 为专业人士提供全面的学习材料。然而,很难找到由更广泛的社区提供的材料。

是什么让 Xanadu 不仅仅是另一个量子硬件供应商有了“PennyLane”这个名字。PennyLane 是一个跨平台的 Python 库,用于量子计算机的可微分编程。不局限于世外桃源自己的量子框架,森林。但是它集成了前面提到的所有设备,IBM Qiskit、Google Cirq、微软 QDK、Amazon Braket 和 Rigetti Forest。

因此,它是量子机器学习的一个令人兴奋的框架。还有一个相当活跃的社区。然而不幸的是,大多数资源都希望你了解机器学习和量子算法。

结论

四大云提供商争夺量子计算市场的霸主地位。IBM 和谷歌遵循类似的方法。他们提供 Python 框架和大量培训材料。此外,它们与主要的机器学习框架相集成。这些提议很合理。

微软追求一条不同的道路,因为它不是建立在 Python 之上的。最后,亚马逊采取了转售的方式。他们宁愿出售真正的量子硬件,而不是专注于开发自己的平台。

quantum 的竞争对手 Rigetti 和 Xanadu 提供了令人惊讶的有吸引力的框架。尤其是 Xanadu 的 PennyLane 有可能成为集成量子计算和机器学习的主要框架。

量子机器学习要不要入门?看看 动手量子机器学习用 Python

在这里免费获得前三章。

扩展您的数据团队时需要注意什么

原文:https://towardsdatascience.com/what-to-look-for-when-scaling-your-data-team-986e00024d6a?source=collection_archive---------33-----------------------

行业笔记

管理者在壮大团队时应该寻找什么?什么工具可以为他们已经负担过重的员工提供帮助?

布鲁克·卡吉尔Unsplash 拍摄的照片

对于任何与数据打交道的人来说,你可能都听过“数据是新的石油”这句话然而,在今天的数字经济中,如果数据真的是新的石油,我们将需要更多的人在钻井平台和炼油厂工作,以满足需求。

如今,数据驱动的创新已经成为各行各业几乎所有公司的战略要务。但是,随着组织扩大在分析、AI/ML、商业智能等方面的投资,数据团队正在努力跟上业务预期的步伐。

例如,许多数据工程师经常因构建和维护数据管道所需的时间而不堪重负。由于这些积压,数据分析师和数据科学家经常会遇到严重的延迟,这使得他们无法访问工作所需的数据。

使用石油类比,可以这样想:每当石油钻井平台和管道出现延误,炼油厂也会减速,这可能对分销渠道产生重大影响,并最终影响开车前往加油站的消费者。数据也是如此,数据生命周期中的任何积压都会导致延迟,阻碍下游用户和消费者访问、分析数据并从中获得洞察力。

企业只会继续更加依赖他们的数据团队。然而,最近的调查研究表明,96%的数据团队已经达到或超过了他们的工作能力。为了避免让他们的团队陷入困境,许多组织将需要从效率和团队规模两方面大幅扩展其数据团队的运营。事实上,79%的数据团队表示基础架构不再是扩展问题,这将重点放在了人员和团队能力上。但是经理们在壮大他们的团队时应该寻找什么?什么工具可以为他们已经负担过重的员工提供帮助?

打造你的梦想团队

数据团队的经理必须做的第一步是评估他们团队的当前技能,使其与业务的预期需求紧密结合。这样做可以让经理们更深入地了解面试候选人时需要具备哪些技能。需要记住的一些注意事项包括:

  • 现有团队的技能组合。从数据中创造价值通常需要数据工程、数据分析师、数据科学家等技能组合。通常在较小的团队中,一个人可能会负责几项技能。评估您的团队在哪些方面可以利用更多的帮助和/或经验,有助于确定高杠杆雇用。这种团队扩展也是一个很好的机会,可以发现团队中有人负责的工作部分,并愿意减少分配的时间——例如,数据工程可能是一个少数人投入的领域,但他们更愿意将时间集中在分析上;引入数据工程师不仅给实践注入了激情,还允许其他人将更多的时间分配到他们自己的激情和增值活动上。
  • 识别瓶颈。数据收集、清理、聚合、分析、机器学习、报告等,共同创造商业价值。像所有的瓶颈一样,缓慢的交付或者一个瓶颈的问题通常会限制整体的产出,从而降低团队的士气。即使分析师的数量远远超过数据工程师的数量,如果最终输出仍然主要受分析师带宽的限制,那么在那里增加更多仍然是有意义的。如前所述,很容易发现某项技能,例如数据科学,发现团队中不存在该技能,并寻找该员工。然而,表现最好的团队会全面评估这一技能差距:也许企业还没有做好有效管理机器学习的准备,或者需求可以通过不需要 FTE 的平台来满足,节省下来的成本更适合加倍使用另一套技能。
  • 牢记现代数据团队的新鲜度。我们都见过招聘信息要求拥有 10 年的工作经验,而这项技术才问世 6 年。尽管数据实践已经存在了一段时间,但某些角色和技能组合(如现代数据科学、数据工程)却是新出现的。在寻找优秀的候选人时,更多地依靠相关职位的过往经验,而不是准确的职位/职称,通常是有意义的。例如,一名软件工程师可能拥有数据工程师的所有合适背景,但却没有非常具体的职称。

问正确的问题

接下来,管理者需要仔细考虑面试过程。除了一般的、人力资源要求的面试问题,经理们应该把面试作为一个机会,深入了解每个候选人的技能、抱负和才能,以了解他们如何有利于你不断发展的团队。以下是经理应该讨论的话题:

  • 对数据空间的热情。不管是行业新手还是长期从业者,最好的候选人继续保持对学习的好奇心和对交付的热情。为了表现出这种兴奋,经理可以讨论候选人接下来有兴趣尝试的过去的项目/副业或实践和技术。
  • 技术敏锐。数据领域的大多数角色都有技术成分。分析师通常需要对 SQL 有很强的掌握(不仅仅是基本的 group by 和 counts,还要回答更复杂的问题,比如使用 lead/lag 来确定用户事务之间的中间时间)。通过一个小的真实世界(不是编程难题)的 SQL 分析可以帮助确保候选人的技能满足要求。在“构建”会议中一起解决这个问题需要更多的时间,但对于如何与候选人一起工作,通常会有更深刻的见解。这些相同的构建会议适用于团队中的其他角色。
  • 配合商业目标。大多数数据团队没有将“研究”作为最终目标。相反,研究、模型训练、提供报告、创建分析和建议都与创造结果相关联。经理们应该审查候选人拥有成果的动力以及他们的商业头脑。考虑到数据团队与公司领导层的密切关系,他们的商业敏锐度尤为重要。

小心危险信号

回到我们的“数据是新的石油”类比,众所周知,石油钻塔上的高强度工作不适合心脏虚弱的人。我们都有过这样的经历——无论是在钻井平台、数据团队,还是基本上任何类型的团队——一名候选人通过了面试,在纸面上看起来很棒,并正式加入你的团队。直到后来你才意识到这个人可能不太适合这个角色或这个团队。虽然后知之明是 20/20,但在招聘过程中有几个常见的危险信号需要注意。

  • 候选人的兴趣和公司面临的挑战不匹配。一些数据工程师被他们的管道处理的数据量所驱动,其他人则被他们能够提供的商业价值的速度所驱动。对于一个每天处理几 GB 数据的小型创业公司来说,一个兴奋地每天处理 TB 数据的数据工程师可能会在招聘过程中自行选择,但如果他们不这样做,就有必要仔细检查一下引起候选人兴趣的其他因素。
  • 只对数据职责的一部分感兴趣。除了可以支持细粒度数据角色和职责的超大型数据团队之外,大多数团队需要几种不同类型的任务来交付最终业务价值。不愿意参与一些额外的数据清理和验证(传统上可能属于数据工程的任务)的候选人可能不是团队成功的最佳人选。

自动化:你最喜欢的新同事

企业在运营上扩展其数据计划的能力需要的不仅仅是增加团队规模。如今,数据团队被跟上业务快速发展所需的大量工作淹没,因此经理们应该考虑寻找自动化工具,使团队能够更快、更有效地完成工作,并且不会成为数据生命周期的瓶颈。

自动化技术使团队能够从本质上“自动驾驶”小规模任务,因此他们可以专注于更复杂和创新的业务计划。前面提到的调查研究还发现,大多数数据专业人员(73%)将自动化视为推进其职业发展的机会。最终,有了合适的团队和合适的技能范围,这些自动化工具可以作为一种显著增加团队带宽和产出的方式。

我认为另一种自动化技术的巨大价值是 flex-code。尽管低代码和无代码工具大量涌现,但是许多团队已经发现了这些技术的严重局限性。挑战在于,这些工具中的许多并没有给团队在需要时定制代码的能力,这可能阻止团队收获低代码或无代码的好处。

虽然依赖于业务需求,但最终还是由团队经理来决定如何最好地扩展他们的团队,以及在哪里实现自动化以实现他们的总体目标。但是,有了合适的人和合适的工具,企业可以更快地提供见解,并从他们最有价值的新自然资源:数据中获取更大的价值。

数据科学面试前要学什么

原文:https://towardsdatascience.com/what-to-study-before-a-data-science-interview-3a971a1ce78d?source=collection_archive---------12-----------------------

帮助我成功通过面试并获得工作机会的指南!

照片由 Maranda VandergriffUnsplash 上拍摄

一个周五的下午 2 点 34 分,你正在结束一周的工作,准备在周末放松一下,或者还在申请几份工作,这时你收到一封来自人力资源招聘人员的电子邮件,询问你是否有空参加第一轮面试。这是个好消息!现在该怎么办?

这时候,你停下来,计划,准备你的面试。

求职是我们每个人经历的最具挑战性的过程之一。数小时的准备、对面试的焦虑、冒名顶替综合症、无助于让你平静下来的咖啡——肾上腺素激增会让你濒临把一切都搞砸的边缘。

关于如何准备数据科学面试,没有完美的手册,除了你在网上或在你的同事和网络中做的研究。话虽如此,每次我经历几次数据科学面试过程(如果你准备充分,这并不可怕),我都会意识到,有一件事是肯定的——成功没有秘密;它是准备、努力和从失败中学习的结果。

为面试做好充分准备是在招聘过程中减少损失的唯一可行的方法。在开始准备之前,磨砺你的武器——一份好的投资组合、沟通技巧、对数据科学概念的清晰理解,以及更多本博客所讨论的内容。

1.研究工作描述(用心学习)

数据科学工作面试可能会令人生畏。招聘经理可能会在面试官的技术环节中要求你用 Python 编写问题代码、开发逻辑或使用 SQL 查询数据。招聘人员需要了解你如何将数据技能与商业决策和战略联系起来。

在这种情况下,你应该根据工作描述来准备与招聘人员的对话。

来源:谷歌招聘——数据科学家,工程

数据科学是一个非常多样化的领域,在技能和工作角色方面有细微差别。甚至在你开始准备面试之前,你可以关注的第一件事就是确定所需技能的哪些部分最符合你的专长/兴趣。仅仅是通读一下职位描述,就能让你对面试中的内容有所了解。

专业提示: 你可以保留一份讲义,上面有关于职位描述、技能和优先资格的笔记,或者一份完整的职位描述,上面有重点,以确保在你的回答中涵盖这些内容!

2。关于面试过程的研究

我会这样开头——总是问人力资源招聘人员“我应该在面试中期待什么?

表明你想为面试做好充分准备是没有坏处的。有了面试结构的概念,你可以开始回顾数据科学、数据分析师和机器学习面试中的常见问题。

资源

  1. 通读其他求职者在 Glassdoor 上发布的类似职位的面试问题
  2. 研究公司文化,关于团队,当前项目,与其他企业的合作(基本上跟踪公司!)
  3. 准备一个你是如何听说这家公司的故事,职位名称。你对这家公司了解多少,为什么你对这个行业感兴趣(如果这家公司不是一个知名公司)——仅仅说你是从 LinkedIn 上看到这份工作是不够的!

3.技术准备

一旦你确定了工作描述和面试形式,下一步就是开始你的技术准备。

现在,在面试前两天,你不能开始学习 TensorFlow,或者 ANN、CNN 和 RNN 之间有什么区别?是时候了,你复习一下。

没有特别的顺序,我会这样准备:

A.编程/编码技能

在开始准备编码问题之前,要考虑的一个要点是确定面试的形式:技术电话面试(TPS)、现场面试或两者兼有。

对于手机屏幕,编码面试通常会使用在线 ide,如 HackerRank、CoderPad 或 CodeSignal。对于现场面试,您可以在现场面试前使用在线 IDE,或者在聊天过程中使用白板。

  1. LeetCode 是练习和掌握编程技能的绝佳资源。关于每个主题的大量问题是大公司在面试、社区帮助等过程中常见的问题
  2. Hackerrank 是公司进行技术评估和远程面试的首选平台,这个平台也让你练习解决竞争性编程挑战
  3. CodeForces、编码忍者是其他一些你可以用来练习的流行平台
  4. 为编程语言准备一份备忘单(或者你可以从 Google 下载一份)——Python、R、Java 和 SQL 之类的外围技能

(这些资源将对您有所帮助,因为您已经具备了一些数据科学方面的知识。对于初学者,我会推荐https://www.learnpython.org/或者 DataCamp。

— — — — — — — — — — — — — — — — — — —

B.统计数字

  1. 如果你想在面试前复习你的统计学概念,StatQuest 就是你的圣经。通过大约 5-6 分钟的短视频,Statquest 真正带您了解统计的基础知识,如直方图、何时使用决策树和神经网络。(我更喜欢 YouTube 频道)
  2. O'Reilly《数据科学家实用统计学》——这本书将从数据科学的角度教你统计学,这本书的前三章应该足够你做初步的面试准备了
  3. 机器学习的统计方法— 这本书为机器学习实践者提供了统计方法的速成课程(当你有时间阅读整本书时)

— — — — — — — — — — — — — — — — — — — -

C.SQL 和 NoSQL

我们生活在一个数据驱动的世界,企业将他们的信息存储在大型关系数据库中。

如果你要面试一个与数据相关的职位,你必须掌握数据库管理、处理和使用数据的概念。同样,对于数据科学家和工程师以及任何想要精通数据的人来说,SQL 是一项很好的技能。正确的数据库知识与了解 pandas、NumPy 等 Python 库或 Tableau 等工具同样重要。

虽然只需要大约两到三周的时间就可以掌握 SQL 的基础知识,但这是一项通过实践逐渐形成的技能。当我过去为我的学校作业写查询时,我什么也不明白——代码的目的和乐观。或许,更像是教长颈鹿跳舞。

当他们说学习 SQL 的最好方法是通过实践时,这是真的!没有 SQL 查询的实际应用,很难将理论付诸实践。但是,我帮你准备好了:

  1. 【W3 schools】:如果你只想记住面试的定义,那就选基础的。通过学习这里的概念,我通过了学校的先决条件测试。
    在线 SQL 编辑器使编辑 SQL 语句、查看结果和练习变得非常容易。它涵盖了 SQL 的基础知识— SELECT、JOIN 语句、WHERE、数据库操作、函数等等。
  2. 可汗学院 有我的雄鹿当谈到免费的,值得注意的关于 SQL,高级 SQL,关系查询,用 SQL 或其他概念修改数据库的课程。有了文档、视频、挑战的素材,我敢肯定,你会找到你需要的一切!
  3. 数据营有一些不错的速成课程,可以帮助你复习面试所需的 SQL 知识
  4. Codecademy 有一些适合初学者的课程来复习这些概念。它带有免费试用,足以为你的面试做准备😉

— — — — — — — — — — — — — — — — — — —

D.ML 算法和库

数据科学面试不可避免的一部分是你对机器学习的了解——从监督和非监督学习的区别到使用 TensorFlow 的神经网络。你永远不知道在面试中会向你抛出什么问题。

我通常会复习我的 ML 概念、算法、库和包(pandas、NumPy、seaborn、matplotlib、Keras,或者任何其他你觉得需要快速阅读的项目相关的内容。

  1. 监督学习:线性回归、逻辑回归、决策树、随机森林、SVM、朴素贝叶斯、梯度下降、K-最近邻(kNN)等。
  2. 无监督学习: K 均值聚类、层次聚类、异常检测、神经网络、主成分分析(PCA)、独立成分分析、Apriori 算法等。
  3. 算法:二分搜索法,递归,排序,动态规划,正则化,集成,降维
  4. 数据分析库: pandas,NumPy,Keras,NLTK,gensim,scipy,scikit-learn,statsmodel,TensorFlow,plotly 等。

虽然在面试中,你可能不会被要求从头编写一个深度学习算法,但招聘经理可能会抛出多个业务用例,例如:你如何识别需要续订的人?如何处理 70%数据缺失属性的数据集?

为了帮助你做好准备,我强烈推荐 cheatsheets: Python 和 ML

  1. Python 中的数据科学:熊猫小抄
  2. 数据结构与 Python 备忘单
  3. 收集数据科学备忘单 —一个包含 Python 备忘单的博客,托管在 DataCamp 上,用于 Python 基础知识、数据操作、机器学习、深度学习、大数据、数据可视化、IDE (Jupyter 笔记本)
  4. 安德烈·布尔科夫(Andriy Burkov)写的一本 136 页的书,仅用几个词就涵盖了机器学习的核心概念,从符号和定义,基本算法,数学,神经网络和深度学习,实践问题,无监督的机器学习,以及许多字里行间和字外的信息。

快速提示:根据您之前对数据科学的了解,您阅读这本小说的体验将会截然不同。我建议你在准备面试的时候读这本书,而不是在时间紧迫的时候

— — — — — — — — — — — — — — — — — — —

E.数据可视化

我正在读一篇关于“应对数据可视化采访”的文章,围绕这个主题的一点挖掘让我意识到围绕你所做的可视化“准备”你的对话是多么重要。

当谈到技术面试时,我们对 SQL、编码或统计问题有一个马眼式的看法,而没有关注数据可视化在今天对企业来说有多重要。在大多数情况下,数据科学家只关心问题的深度,但对于数据科学通才或数据科学独角兽来说,这是完全不同的游戏!

招聘经理往往会评估你设计有效可视化的能力,如果你了解设计经验,对业务的影响,可视化的错误对利益相关者意味着什么,以及各种类型的可视化的正确用例。

为了提高这些技能,

  1. 将你所有的可视化展示推给 Tableau Public(在面试过程中,你可以随时在聊天中滑动链接到你的个人资料,面试官肯定会看一眼)
  2. 如果你要把你最雄心勃勃的可视化项目卖给一个投资者,就要为它做一个推介
  3. 参考 Tableau 小抄,比如Tableau 图表上的终极小抄或者由 Intellipat 写的小抄
  4. 对于 PowerBI 来说,我喜欢花 3/4 个小时在 LinkedIn 上学习,参加像 Power BI 基础培训这样的课程。如果你不是一个有能力的人,但需要用它的知识去面试,那就参加一个速成班吧
  5. 探索市场上的新工具,如 Alteryx、Altair、Google Analytics 等,并与时俱进

— — — — — — — — — — — — — — — — — — —

F.数学和概率

如果我被问及数据科学数学中最重要的主题,那将是微积分、线性代数、概率和统计。

我在专业环境中接触数据科学数学的大部分时间都是在开发机器学习模型的时候;当您要创建一个函数或公式来表示

  1. 可汗学院 提供简短实用的线性代数课程,涵盖最重要的主题,适合大量应用的角色
  2. 麻省理工学院的开放式课程 提供了一门严谨的线性代数课程,内容涵盖视频讲座和课程材料
  3. 用于机器学习的线性代数复习 是一个 6 集视频系列,可以在 1 小时内观看。这些视频是吴恩达机器学习课程的一部分,只有当你之前有线性代数的先决知识,并且只需要快速复习(比如在面试之前)时,才推荐这些视频。)
  4. 《矩阵食谱》(PDF ) 是滑铁卢大学关于矩阵代数的优秀参考资源
  5. 多变量微积分复习 是解决实际问题的多变量微积分快速视频复习

如何在有限的时间内准备面试

如果你在最后一分钟被叫去参加一个工作面试,如果你认为在面试前的有限时间里你不能完成任何有意义的事情,那就太遗憾了。不管你之前做了什么准备,总有一些事情你想要修改。在另一种情况下,如果你对自己掌握的技术概念非常有信心,现在是为公司和角色做准备的好时机——仅仅为可能出现的问题做准备是远远不够的。

如果我要在一次好的面试和一次成功的面试之间划一条线,那就是对公司和你的未来进行研究的时间。当你在信息电话前有一个滴答作响的时钟时,以下是我如何准备自己:

1.打开求职申请,阅读职位描述

在面试前,至少花 5-10 分钟阅读最初的职位描述,熟悉术语。张贴出来,好的下一步可能是将工作职责和技能与你的简历联系起来。这样做的必要性在于,如果你对该职位的基本期望了解不足,你将如何正确地推销自己,展示你在该领域的技能或经验。

此外,这份准备工作会引导你回答一些问题,比如“为什么你很适合这个职位”或者“你的背景对这个职位有什么帮助?”

2.掌握工作描述中特别列出的技能

一旦你看到了职位描述,看看这份工作需要什么样的技能。

例如,如果重点是 SQL,你可以谈谈你写过的最复杂的 SQL 查询,面临的挑战以及你是如何解决的。或者您从涉及上述数据科学建模的在线课程/认证和项目中学到的工具。

3.查看当前新闻或社交媒体账户

我通常会在谷歌上搜索公司,然后导航到新闻选项卡,阅读公司最近的谈话——季度业绩、领导层变动、业务的波峰/波谷、该领域最近的头条新闻,或者他们发布的任何消息。当你提出这样的对话时,它会让你成为一个知识渊博、见多识广的候选人,这可能会也可能不会让你优先考虑。

4.磨练你的商业头脑

如果你了解这家公司,它的价值主张,行业和商业模式,那你就成功了一半。根据我的经验,让数据科学家了解数据模型对业务的影响从来都不是一个坏主意。一个了解错误术语对涉众意味着什么的数据科学家肯定能开发出更好的模型。

尝试了解 covid 对行业和公司的影响,COVID 前后的数字(股价、净收入)如何波动,或者公司增长取决于哪些因素。你可能会也可能不会有机会提出这个话题,但如果你足够坦诚,你总能把面试引向你想要的方向。

5.记住你的简历作为你的电梯推销!

大多数面试官会让你看一遍简历来开始面试。对此,你不能说“这写在我的简历上”。招聘人员已经看过了你的简历,只有在这之后你才能参加面试。

这里的目标是了解你的思维过程,你为什么从事简历上列出的项目,你从以前的工作经历中学到了什么——超出了纸上已经写好的内容。

你可以研究一下你的其他项目(把 Github 链接放在手边)——列出 3 到 4 个除了简历上的项目之外你可以谈论的项目

6.记下几个你自己的问题

当被问到时,“你有什么问题要问我们吗”,问创新的问题。你不能用谷歌式的来描述公司文化。他们可能会对其他 7 名候选人做出同样的回答,是什么让你与众不同?如果你真的想听,那就另当别论了

如果你没有时间研究这个组织,列出一个详细的问题清单,那就记住几个问题,不管是什么职位和公司,你都可以问。

你可以在手机上记下这些面试后的问题,并根据职位和公司进行调整。我通常会提前说我有多少问题。我通常会提出一些技术性和非技术性的问题,问题细分如下:

  1. 一个关于工具、技术的技术问题,为什么你会想到这个问题
  2. 这是一个业务问题,它解决了我对 covid 的影响等基本问题的好奇心。
  3. 非技术性问题也可以包括类似这样的内容:
    • 在最初的 30/60 天里,你对这个职位的应聘者有什么期望?
      -你最近参与了哪些项目?
      -这个职位上的人可能面临的最大挑战是什么?
      -你最喜欢公司的什么?
  4. 如果面试官没有提到关于招聘过程下一步的问题

击败数据科学面试的秘密

  1. 不要忘记向招聘人员询问面试的结构(30 分钟,电话或视频电话)和面试的形式(编码评估,基于情景的问题,行为回合或人力资源筛选)
  2. 通读其他求职者在 Glassdoor 上发布的类似职位的面试问题
  3. 不要重复在前几轮面试中已经交流过的项目,如果同一个人出现在多轮面试中,这绝对是一个禁忌
  4. 展示你的软技能:沟通、领导能力、自我激励能力
    你可以谈论课外活动或学校/工作之外的活动,当这些技能为你铺平道路的时候,“谈一次”
  5. 准备一些你有信心会以某种方式解决的问题的答案或提示:这将在面试中引导你,让面试不那么令人生畏
  6. 以星形格式回答每一个可能的答案——情境、任务、行动、结果

这就是我的博客的结尾。感谢您的阅读!我希望你喜欢这篇文章。请让我知道哪些技巧帮助你在数据科学之旅中赢得面试。

如果你喜欢阅读这样的故事,并希望支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,而不需要你额外付出任何成本!)

数据帐篷快乐!

拉什是芝加哥伊利诺伊大学的研究生。她喜欢将数据可视化,并创造有见地的故事来传达隐含的见解。当她不赶着赶学校的最后期限时,她喜欢喝一杯好咖啡,写关于数据的博客…

为什么我花了这么长时间才找到一份数据科学家的工作

原文:https://towardsdatascience.com/what-took-me-so-long-to-land-a-data-scientist-job-c2dee99b98ca?source=collection_archive---------5-----------------------

以及如何缩短它

照片由mārtiņš·泽姆利克斯Unsplash 上拍摄

我从在 Coursera 上完成 IBM 数据科学专业证书开始了我的数据科学之旅。我花了将近两年时间才找到一份数据科学家的工作。

我花了比预期更长的时间才找到这个领域的工作。在花了这么多时间找工作后,我想我知道延长我旅程的原因,我想和你分享一下。

有面试吗?

第一个也是最重要的问题是显示我确实知道一些东西。没有工作经验,很难展示你的技能。在大多数情况下,我甚至不能通过第一步,得到一个技术面试。我觉得人力资源专业人士没有考虑我的简历,因为我缺乏该领域的工作经验。

我得到了很少的技术面试,而且我大部分都做得很好。这让我很开心,也让我有动力通过技术面试。这是一个好迹象,表明我走在正确的道路上,并提高了我的知识。

然而,我很难到达技术面试。解决这个问题的有效方法显然是联网。如果你认识或遇到在这个领域工作的人,至少获得一次技术面试的机会会大大增加。

如果你没有数据科学领域的工作经验,最好的选择是完成项目。我指的不是一两天就能完成的任务。

你需要提出一个问题,并设计出旨在利用数据解决问题的方法。然后,你实施你的方法。你的项目不一定要完成任务或解决问题。然而,你如何分析性地思考,如何处理问题,以及如何使用数据作为解决方案非常重要。我知道做这样的项目很难,但你至少应该试一试。

有时间吗?

我的另一个问题是没有足够的时间。在我学习数据科学的两年中,我不得不保住我的工作(无论如何都与数据科学无关)。所以我只有晚上和周末可以学习。

这不仅仅是有时间的问题。你需要有一个新的思维来学习,并真正学习新的概念和技能。如果你计划在学习数据科学的同时工作,请记住这并不容易。

如果你能致力于学习数据科学,整个过程会变得相对容易。如果你有能力辞职,你可能会更快实现目标。然而,对于一些人来说,包括我自己,这不是一个选项。

你好世界!

软件或编程是数据科学的一项基本技能。仅仅对统计学、机器学习模型有一个全面的理解,或者有一个伟大的分析头脑是不够的。您需要能够使用工具和软件包来实现您的解决方案。

我以前没有任何编程经验。我甚至要上两次“C++入门”课才能及格。这并不是因为它非常困难。我只是对编程不感兴趣。我在大学里学的是电子工程,我不认为我会需要编程技能。我显然错了。

我花了一段时间获得编程技能。我说的不仅仅是熊猫和 Scikit-learn。你需要的远不止这些。我觉得 SQL 是必须的。你还需要真正擅长一门编程语言,最好是 Python 或 r。Git、Spark(或 PySpark)、Airflow、云计算、Docker 是你需要熟悉的一些其他工具。

因此,如果你没有编程背景,就软件工具和软件包而言,你将需要一段时间来做事情。

有足够的工作吗?

在我居住的地方,数据科学家的工作数量有限。这可以被认为是一个环境问题,但它肯定有影响。刚开始学数据科学的时候,职位空缺并不多。然而在过去的两年里,寻找数据科学家的公司数量大大增加了。因此,仅仅考虑空缺职位的数量,我找到工作的机会就比两年前高了。

结论

虽然我花了两年时间才开始从事数据科学家的工作,但我非常高兴我决定转行成为一名数据科学家。自从我开始作为一名数据科学家工作以来,我的动力和热情增加了。

在生产环境中使用真实的生活数据是我们无法通过证书、课程或教程实现的。对我来说,这是一次漫长而疲惫的旅程,但绝对值得。

感谢您的阅读。如果您有任何反馈,请告诉我。

脸书情绪研究给我们的启示

原文:https://towardsdatascience.com/what-we-can-learn-from-facebooks-study-on-emotions-1ec866357c0?source=collection_archive---------17-----------------------

为什么预先设计你的研究对任何研究都非常重要

照片由赤脚通讯Unsplash 上拍摄

2014 年,脸书进行了一项名为“ 的秘密社会实验,通过社交网络进行大规模情绪传染的实验证据 ,旨在了解在没有面对面互动和非语言暗示的情况下,情绪是否可以转移。虽然我们今天在很大程度上知道假新闻和充满情绪的内容可以通过社交媒体传递情绪——正如 2016 年美国大选前所证明的那样——但在研究时,尚不清楚或不明确情绪是否可以通过社交媒体互动传递。

这项研究:

纽约公共图书馆在 Unsplash 拍摄的照片

脸书与康乃尔大学通信和信息科学系合作,研究了在缺乏面对面互动的大规模社交网络互动中,情绪传染(可转移的情绪状态)是否会发生。这项研究的重点是通过脸书的帖子暴露情绪(积极和消极)是否会改变人们的情绪,这是通过他们在随后的脸书帖子或状态更新中使用的语言来衡量的。该研究是在大约 700,000 个人的群体中进行的,这些人是通过他们的用户 ID 来识别的,并且在一周的时间内进行了两个平行实验。在一个实验中,对于特定的观看,用户对积极情绪内容的接触减少了 10%到 90%之间,而在另一个实验中,用户对消极情绪内容或充满情绪的内容的接触减少了 10%到 90%之间。

然后使用“ ”语言查询和字数统计 ”软件(LIWC)分析随后的状态更新或帖子,以将帖子分类为“正面”、“负面”或“中性”。该研究发现,当新闻订阅中的正面帖子减少时,人们状态更新中的正面词比例下降了 0.1%,而负面词比例增加了 0.04%。相反,当负面帖子减少时,状态更新中负面词的百分比下降了 0.07%,而正面词增加了 0.06%。该研究得出结论,这表明情绪传染纯粹基于文本互动,而不需要面对面的互动或非语言行为(参考文献 1)。该研究还发现,接触较少情绪帖子(积极和消极)的人在接触后的几天里表达能力较低,这表明情绪接触会影响人们的社交媒体参与。虽然人们每天都会经历一系列影响他们情绪的经历,尽管研究表明这些经历的影响很小,但研究得出的结论是,这些都是情绪可以通过社交网络传播的强有力的实验证据。此外,该研究认为,鉴于脸书庞大的社交网络,这些小影响在更大的范围内会累积成更大的后果。

研究设计忽视:

从这项研究中还不清楚是否采取了科学的方法来设计这项研究并分析其结果。为了客观地看待问题,请看下面显示的两个模型。

研究设计方法的两种模式。图片作者。

理想的模型是“线性模型”,在这种模型中,你提出一种理论/模型,并在此基础上进行假设、收集样本数据、分析和解释数据、验证其发现并展示出来。但是任何从事过研究甚至实验室实验的人都知道,这与现实相差甚远。这就是为什么我们需要“迭代模型”。实际上,研究者经历了各种自我怀疑、分析、理论、数据收集的反复,甚至是分析原始研究问题的反复,以检查是否提出了正确的问题,以及所采取的方法是否正确。在脸书的研究中似乎没有这样做。该论文承认,这项研究是在 1 周的时间内完成的,旨在观察和收集数据,然后在没有后续纠正或数据收集的情况下进行分析,以宣布情绪可以通过社交媒体互动进行传递。虽然可能在 1 周的数据收集后完成了大量的工作来清理、分析和解释数据,但论文中没有提供甚至暗示在收集的数据中遇到了什么问题、数据质量面临的挑战或对初始假设的挑战的细节。这就好像他们收集数据,分析数据,然后不做任何评估就展示出来。

样本量忽略:

Robby McCullough 在 Unsplash 上的照片

鉴于相对于使用脸书的广大用户而言,进行这项实验的人口规模较小(70 万用户被分为两个平行实验),将数据推断到脸书的所有用户,并暗示用户通过新闻源接触到的情绪与之后的感受之间存在联系,似乎有些冒昧。应该注意的是,该研究仅发现用户随后表达的情绪(最多 0.1%)发生了非常小的变化(我们接下来将讨论“情绪”部分),并且没有提供在本次采样中使用的受试者周围发生的背景和事件,以及这些是否会对研究产生任何影响。该研究未能分析或讨论暴露于 90%情感内容的用户与暴露于 10%情感内容的用户之间的情感差异。

忽略算法偏差:

照片由马库斯·斯皮斯克Unsplash 拍摄

谈到研究中分析的“情绪”,用于分析的算法或软件是“语言查询和字数统计”软件(LIWC),用于查看“测试对象”的状态更新,以分析其情绪,并将文本分类为充满“积极”或“消极”情绪。应该注意的是,LIWC 仅仅寻找预先编程的关键字的存在来将句子分类为具有积极或消极的情绪(参考文献 2)。凭借其有限的词汇量(915 个单词对英语中的 170,000 个单词(参考文献 2))和孤立地分析单词的内在特征,LIWC 天生无法通过理解上下文、俚语、习语、讽刺、挖苦来完全理解句子并对句子进行分类,并通过其分析带来上下文崩溃(参考文献 2)。

为了正确理解这一点,我使用文本" 对 LIWC 的样本进行了分析,如下所示,太棒了!现在,我不得不花 500 美元修理我的摩托车,因为有人不能在 红灯时停下来。

对任何人来说,这句话都明显带有讽刺和恼怒的意味,因为有人在红灯前不停车就损坏了我的摩托车,这让我很恼火。但 LIWC 没有。LIWC 将这篇文章归类为“积极的”**分 97.6* ,负面情绪为零。你可以去 LIWC 的网站试试。*

LIWC 进一步澄清说,情感基调的得分越高,信息就越积极。

除了 LIWC 的缺点之外,这项研究忽略了文本附带的任何照片,这些照片可以为研究人员提供分类情绪的背景。LIWC 的输出被认为是表面上的,没有任何数据的支持。被引用来支持 LIWC(参考文献 1)的研究要么没有任何验证工作,要么有证据表明 LIWC 不能破译积极和消极情绪(参考文献 2)。这种对算法偏差的忽视是惊人的,而且更令人震惊的是,这项研究没有解决在“分析”阶段遇到的关于 LIWC 给出的分类的任何问题。

社会科学忽视:

照片由内森·杜姆劳Unsplash 上拍摄

这项研究的作者参与了另一项研究,该研究发现,人们通常会在帖子最终被分享到脸书之前进行自我审查(参考文献 2)。由于没有关注分享状态更新的社会背景,并且仅仅关注状态中积极或消极的词语,作者未能理解任何可能改变或偏见实验的潜在情绪或社会背景。虽然作者承认人们经历了一系列影响他们情绪的经历(参考文献 1),但很少信息给出如何在实验中解释这一点及其对结果的影响。该研究的作者认为,鉴于情绪和身体健康之间的良好联系,该研究的发现对公共健康具有重要意义。然而,与使用该平台的用户数量相比,这是对极小样本规模的夸大推断。如果没有适当的上下文来支持用户感受到的情绪或用户看到的帖子背后的上下文,就会出现“上下文崩溃”(参考文献 2),这可能会对一个人的情绪产生不同的影响,并且不能简单地使用 LIWC 软件以非黑即白的方式进行分类。

本研究的伦理问题:

蒂姆·马歇尔在 Unsplash 上的照片

这项研究发表后,脸书处于社交媒体愤怒的中心。这项研究提出了一些社交媒体倡导者提出的伦理问题。首先也是最重要的是,脸书在没有知情同意的情况下对 70 万名参与者进行了这项研究。参与者不知道这项研究,或者不允许他们决定是否要参加。让我们用贝尔蒙特报告作为衡量标准来解决伦理问题。这项研究违背了公认的“尊重人”的原则,即把个人当作人而不是测试对象。该研究参考了脸书的数据使用政策,以表明此类研究受用户在注册脸书时同意的条款和条件的约束(参考文献 1)。但是,假设全球所有用户都已经通读了“条款和条件”的每一行是不切实际的。虽然“条款和条件”将作为法律辩护,但使用消费者作为不知情的测试对象背后的道德考虑增加了对脸书的批评,即该公司像使用产品一样使用消费者(参考文献 2),即使用消费者的数据、情感和互动来为他们提供更多的广告和内容。

从这项研究来看,谁从中受益还不清楚。这项研究是否以利他主义的方式进行,以了解一个人在脸书暴露于各种情绪后的情绪损失,并利用结果更好地资助心理健康项目?或者是为了了解脸书是否能更好地理解用户的情绪,以及如何将他们微推至对公司有益和有利的行为模式(参考文献 3)。最后,该研究缺乏一个机构审查委员会,这使得人们不清楚这是一项学术研究还是脸书为其利润而进行的研究。虽然脸书不会在没有彻底审查的情况下向用户发布任何新功能,但缺乏机构审查委员会对该研究及其方法的审查是一个严重的疏忽。

结论:

这项研究对研究设计和伦理考虑的忽视提出了很多问题。如果没有一个合适的设计,这项研究能被接受吗?一旦您接受了条款和条件,知情同意如何发挥作用?合法远非道德,因为合法总是赶上技术的进步。在我们追求“第一”的过程中,我们可能已经失去了产生共鸣的能力。

参考资料:

  1. 社交网络大规模情绪传染的实验证据| PNAS
  2. 为什么脸书实验是糟糕的社会科学
  3. 脸书和公众工程|作者 Zeynep Tufekci | The Message | Medium
  4. 阅读贝尔蒙特报告| HHS.gov

我们能从谷歌的长期 AB 测试中学到什么

原文:https://towardsdatascience.com/what-we-can-learn-from-googles-long-term-ab-test-64e45b649cc4?source=collection_archive---------14-----------------------

避免在线实验中的短期价值陷阱

(图片编辑自unsplash.com)

在 AB 测试中,我们关注特定变更的短期影响:

  • 一个新功能会带来更高的转化率吗?
    -设计变更是否会鼓励更多用户使用某个特定功能?

如果答案是肯定的,那么“变更”将对所有用户生效。

但是短期目标可能会与企业更重要的长期目标相冲突。想象一下一家超市提高价格,这可能会在短期内带来更高的利润。但从长远来看,如果更多的顾客选择从竞争对手那里购买,这可能会减少商店的收入。

在这篇文章中,我概述了在线实验的先驱之一 Google 是如何通过运行长期实验来处理这个问题的。以及我们能从这一课中学到什么来确保我们的 AB 测试推动可持续的成功。

权衡用户价值和收入

用户价值和收入之间的权衡似乎并不直观。商家难道不应该通过提供用户价值来获取资金吗?

是也不是。举个例子,想想报纸、杂志或电视节目。对他们的客户来说,看到更少的广告和更多的内容确实更有价值。这对出版商的收入有明显的影响。

这适用于产品开发领域。无论我们是想增加用户保留率、吸引更多用户还是鼓励更多用户使用某个特定功能:任何优化工作背后的长期目标都是增加收入。在进行实验时,我们通常专注于改进其主要组件之一。

对于像谷歌这样的搜索引擎来说,其收入的构成如下:

这个等式给出了这样一个观点,即改进其中一个组成部分应该增加总收入。

可惜没那么容易。这些部件经常相互缠绕在一起。一个指标的增加可能会损害收入等式的另一个组成部分。最终,总体影响可能是负面的。

例如,看看每个任务的查询数量。此指标代表用户需要在 Google 搜索上回答问题的尝试次数。正如我们在等式中看到的,这是对总收入的直接贡献。但是降低搜索结果的质量来留住用户可能是增加谷歌收入的糟糕尝试。用户数量(另一个组成部分)将迅速减少,因为越来越多的用户将转向其他搜索引擎,如 Bing 或 DuckDuckGo。

这和 AB 测试有什么关系?

通常,这些效果之间有一个时间间隔。如果谷歌降低了搜索结果的质量,用户可能需要一些时间来决定尝试不同的搜索引擎。在此之前,团队会观察到每个用户的查询量增加,收入也可能略有增加。

在 AB 测试中,我们测量与变化密切相关的指标,这些指标也是收入的驱动因素。使用如此窄的范围节省了时间,并且更容易将我们感兴趣的度量的变化归因于治疗。

但是正如我们所看到的,对我们总体目标(增加收入)的长期影响可能是完全相反的。如果变更可能对用户体验产生负面影响,这种冲突尤其明显。

谷歌试图衡量长期影响

谷歌的团队意识到了这一困境。因此,它试图开发一种方法来评估改变谷歌搜索页面上显示的广告数量的长期影响。

谷歌搜索上的广告(作者图片)

除了用户被竞争对手抢走之外,增加广告数量会对整体收入产生更多负面影响。例如,它可能会训练用户忽略广告,这种现象被称为广告盲

这种学习效应会降低用户点击他们看到的广告的比率,并最终降低谷歌的收入。

为了量化显示更多广告和更低点击率之间的长期权衡,该团队进行了一项长期实验。实验分为三个阶段:

  • 前期:对照组和实验组的经验相同,以确保两组具有可比性。
  • 实验:实验组接触更多的广告。在这个阶段,可以观察到治疗的短期效果。
  • 后期:两组都再次接触到谷歌搜索的正常体验。在这个阶段,可以观察到实验组的学习效果。如果用户点击广告的频率明显低于未接受治疗的用户,那么实验组的用户就被训练忽略广告。

测试谷歌搜索广告曝光度增加的长期效果的实验装置(图片由作者提供)

通过这个实验,团队可以观察广告点击率的变化以及对收入的影响。然后,通过结合短期变化和学习效果,可以计算出整体的长期效果。

在后期,实验组中看到更多广告的用户在看到与对照组用户相同数量的广告时,点击率较低。因此,研究小组确实观察到了学习效应:

与对照组相比,两个变量中的用户在后期的广告点击率(图片由 Hohnhold 等人提供)

注意:正如你在上面的图表中看到的,谷歌在实验中包括了第三组。在实验阶段,这种变体的用户看到的广告比对照组少。结果显示,显示更多广告的那一组产生了相反的效果。

如果长期实验不可行呢?

上述方法允许谷歌在改变显示给用户的广告数量时量化短期和长期变化之间的权衡。

此外,该团队可以使用他们的发现创建一个公式,仅使用短期结果来衡量变化的总体影响。当进行 AB 测试时,这个估计可以用作主要度量。

长期实验的弱点

但不仅仅是因为谷歌拥有其他公司难以拥有的资源和流量。这种方法也显示出一些严重的缺陷,这一点已经被一个来自谷歌在必应的朋友的研究团队所强调。

其中,研究小组指出了长期 AB 测试的以下问题:

  • Cookie 搅乳器:在试验时,用户在被分入变体之前必须被识别。如果用户不必登录某项服务(谷歌搜索和大多数网站都是这种情况),那么识别用户的唯一方法就是 cookies。由于用户可以随时更换浏览器或删除 cookies,因此保持一致的样本几乎是不可能的。实验进行的时间越长,这个问题就变得越大。

(来源:【Giphy.com )

  • 生存偏差:增加实验组的广告负载可能会增加用户流失。因此,对服务忠诚度较低的用户流失的可能性更高。因此,实验组在后期可能会有更高比例的忠实用户。在这种情况下,对照组和实验组不再具有可比性。
  • 选择偏差:由于 cookie 的流失,post 期间检查的群体可能只包括非常忠诚的用户,因此不能代表整个群体。
  • 副作用:有时候实验会涉及到一些个性化。在后期比较控制组和实验组时,实验组可能会有更好的体验,因为他们的帐户是以更好的方式建立的。
  • 例如,想象一个新的功能,如果谷歌地图用户在回家的路上有大量的交通流量,它会提醒用户。那些用户被提示提供这种信息,这种信息在测试之后也是可用的,并且仍然可以显著地改善他们的体验。

并非所有这些效应都适用于每个长期实验。例如,如果用户必须登录才能使用特定的服务(想想网飞或 Spotify),cookie 流失不是问题。

衡量长期影响的替代方法

虽然有(复杂的)方法来解决或减轻上述副作用,但问题是资源较少的企业如何衡量实验的长期影响。

在评估 AB 测试的成功时,增加客户终身价值应该是指导原则。

简单的答案是,在进行实验时,我们必须选择正确的度量标准。当选择一个特定的目标和衡量标准时,增加客户的终身价值应该是指导原则。应该在充分了解业务的情况下选择决定实验成功的短期指标。

例如,网飞的团队知道,用户留存率与用户参与他们产品的程度高度相关。衡量留存率的显著变化不仅耗时,而且在网飞的案例中,考虑到该公司已经拥有的高留存率,这也很棘手。因此,团队使用用户参与度作为 AB 测试中的主要指标,并作为保留的代理,这更容易测量并提供更快的结果。

这里有一些牺牲(短期)收入来改善用户体验的更多启示:谷歌在进行多项长期研究后,将其移动平台上的广告负载减少了 50%。向用户展示的广告数量大幅减少,这可能会导致收入大幅下降。但事实上,该团队观察到了对谷歌搜索盈利能力的积极长期影响,这是他们网站用户体验显著改善的结果。

结论

对于产品团队来说,带来短期收入增长的变化可能是一个大放异彩的绝佳机会。但我们必须明白,这些立竿见影的效果往往与企业的长期目标不一致。

为了解决这个难题,产品团队应该把客户的终身价值放在实验工作的中心。在我看来,有两个因素至关重要:

  • 实验需要专注于改善用户体验,而不是推动收入的短期增长。想想谷歌广告减少 50%带来的长期收益。
  • 应该使用对企业长期目标具有已知积极影响的指标来评估实验的成功。网飞在易受影响但与用户保持率正相关的领域使用敏感指标。

资源

对本文有帮助并提供更详细概述的论文和文章:

  • 着眼长远:这对用户和企业都有好处。
  • 长期在线控制实验的陷阱
    德米特列夫等人。
  • 可信的在线控制实验:科哈维等人解释的五个令人困惑的结果
  • 网飞推荐系统:算法、商业价值和创新。

基于机器学习的业务,我们能从 Zillow 学到什么

原文:https://towardsdatascience.com/what-we-can-learn-from-zillow-on-basing-a-business-around-machine-learning-646ee5daf7e0?source=collection_archive---------6-----------------------

你可以在自己的人工智能策略中应用的十个经验

Zillow 最近宣布退出房屋交易业务,并指责其“即时购买”模式无法正确预测价格。Zillow 还裁掉了 25%的数据科学团队。我们值得从这一事件中寻找教训。

Tierra MallorcaUnsplash 上拍摄的照片

单向门的机器学习

杰夫·贝索斯推广了这样一个观点:有些决定是双向的:你可以走进门,如果你不喜欢你看到的,你可以随时走回来。这些决定很容易逆转,正因为如此,它们是实验的理想选择。其他的决定是单向的,很难逆转。

自动化机器学习非常适合双向决策——个性化、推荐、聊天机器人等。通常是双向决定。

然而,对于 Zillow 来说,启动一个翻转房屋项目是一条单行道。他们应该一直在想办法把它做成双向门。

这里有一些方法可以让机器学习项目成为双向的:

  1. 环中人:使用机器学习模型作为决策辅助,而不是作为决策者。Zillow 应该有一个实地的评估人来批准最终的出价。
  2. 从小做起。比如,在区区一个小区域。或者给你投入到这个项目中的资金设定一个上限。然后,等待。在这种情况下,Zillow 需要等待 6 个多月才能看到最初的投资结果。

看来 Zillow 确实做到了第二点,达到了 2021 年的产能,仔细看了一下投资组合,然后退出了这项业务。从这个意义上说,这不是一场惨败。只是一次失败的实验。影响他们 25%的数据科学团队。看来试点项目本身的成本太高了。

这让我怀疑 Zillow 的高管团队甚至不明白他们的试点在多大程度上是一扇单行道。Zillow 程序的结构——如果当前价格和 6 个月后的估计价格之间的差异足够大,就决定买房子——要求模型在整整 6 个月内都是正确的。

该计划涉及 3 个机器学习模型:

  • 价格估算模型。今天市场上的房子值多少钱?这是 Zillow 的 Zestimate,他们拥有最多内部数据的模型。
  • 维修评估模型。装修房子要卖多少钱?
  • 一个未来价格估计模型。房子 6 个月后会卖多少钱?

让我们一个一个地研究这些模型,因为每个模型中都有有用的经验。

价格估算:设计敏捷系统

我们来看 Zillow 系统中的第一个模型。Zestimate 是他们认为的关键区别,也是他们认为他们可以翻转房子的原因。

价格评估系统并不试图预测未来的价格,只是房子今天的售价。即便如此,它也会经历漂移

机器学习模型中的每个特征都受到漂移的影响-训练数据分布不会与测试数据分布匹配,即使模型学会了不过度拟合训练数据,它学会的是不要以会导致验证数据失败的方式过度拟合数据。该模型仍然依赖于训练/验证/测试数据的分布。然而,未来将与这三者不同。

3 。你需要做持续评估来快速捕捉这些变化。一旦你发现变化,你将需要不断地重新训练你的模型。这是 MLOps 的一个关键方面。

然而,捕捉趋势的开端是困难的——然而,尽管你擅长 MLOps,但在分布变化和捕捉这些变化之间会有差距。这种差距提供了一个机会,用户会在你赶上潮流之前找到一种方法来欺骗你的系统。

4。 寻找用户的行为伎俩。你给那些把东西放在购物车里过夜的人打折吗?用户会开始添加商品,然后走开,等着你给他们发打折券。Zillow 是否对当前出售房屋附近的房屋提供更高的报价?用户将学习并分享这些技巧。

5。 寻找异常的活动浓度。卖家通常比买家拥有更多的信息。他们可能知道什么时候一个机场将要建成,这将导致附近的房价下跌。也许一个新的雇主即将来到镇上。也许利率即将上升。那些知道内情的人会赶在算法流行起来之前卖出。

这种模型监控在游戏和反滥用的情况下非常常见。如果 Zillow 没有做这些我会很惊讶。然而,如果他们发现这种活动,他们可能没有准备好采取什么行动。

6。你将不得不考虑不可避免的损失的可能程度,并且设置断路器以避免在给定的时间范围内在一个社区或时间段内购买过多的房屋。

维修评估:逆向选择

现在,以第二个模型为例——计算修理房子要花多少钱才能让它达到市场预期。这里的风险是逆向选择。想象一下,定价模型几乎确定了房屋的价格。它在 5%的误差范围内得到房子将出售的价格。

很可能会有更多房子被高估(即+5%)的人把房子卖给 Zillow。房子被低估(-5%)的人会更少出售。这是信息不对称的结果,所以 Zillow 会买更多高估的房子,而不是低估的房子。要么 Zillow 给出很少有人接受的吝啬报价,要么出价过高并承受损失。

更糟糕的是,下行风险没有上限,而上行风险却有上限。如果你花 10 万美元买一栋房子,它不太可能卖到 15 万美元。但是有一个很大的风险,房子有一个未公开的地基问题,售价仅为 5 万美元。

7。如果输入的数据很差,那么 ML 就不是一个好的选择。信息的不对称导致 ML 模型中卖方和未来买方的信息不一样。因为机器模型的质量更多地是由数据质量而不是算法的复杂程度驱动的,所以在一个你比其他参与者拥有更少信息的市场上玩游戏是一场失败的游戏。

期权定价:不同行业的相似问题

最后,我们来看第三个问题。这是预测未来 6 个月房价的模型。

Zillow 是否恰当地聘请了期货定价方面的专家,还是他们的数据科学团队天真到认为量化交易只不过是时间序列预测?

8。雇佣合适的专家。期权定价是一个众所周知的学科,但它不是机器学习。Zillow 所做的期权交易是另一回事。是量化交易。机器学习模型预计世界是静止的,但交易者知道未来的事件将使过去的模式变得无关紧要。没有雇佣合适的专家在很大程度上是管理上的失败。

整体战略

知道这里有三个模型,以整体的方式考虑整个管道的风险是很重要的。

9。了解模型的局限性。数据科学家非常了解漂移。房地产经纪人很清楚逆向选择。量化交易者非常清楚基于一个声称能捕捉大部分历史方差的模型进行交易的风险。对于您使用的每种类型的机器学习模型,您需要知道潜在的限制是什么。识别每个模型的风险。

10。设计业务以分离不同模型的风险。Zillow 能做些什么来区分这三种模型的内在风险?。他们可以使用他们的价格评估模型,对房屋进行投标,并立即在市场上出售一部分房屋。将风险转移给知道如何处理风险的交易者。

如果他们这样做了,Zillow 就会在市场上以低于公平市价的价格购买房屋,这种业务更适合他们的价格评估模型。

:不用说了,但我还是要说。我住在西雅图,有朋友在 Zillow 工作。ML 是我的团队在 Google Cloud 的投资组合的一部分(公开消息表明他们是 AWS 客户,但 Zillow 也可能是我们的客户。)然而,这里的一切都是我的个人观点,并不反映我的 Zillow 朋友或关于他们工作量的内部信息。

注 2:Zillow 可以处理整体风险的另一种方式是建立一个精算团队,对风险进行定价,并长期持有房屋,同时将其出租。然而,美国的租金远低于抵押贷款的服务成本,因此大多数房东押注于价格升值,以弥补拥有住房的沉没成本。

我们喜欢完美的地方

原文:https://towardsdatascience.com/what-we-love-about-prefect-2efdee6ee42f?source=collection_archive---------30-----------------------

它是开源的,与 Kubernetes 配合得很好,并且有一个很好的社区

来源:作者

背景故事:为什么我们放弃了库伯弗洛

在我们之前的帖子中,你可以读到更多关于为什么我们对 Kubeflow 不感兴趣的信息。简而言之,我们正在为机器学习项目构建一个参考架构。完成后,它将是我们最喜欢的机器学习工具的集合,加上文档和 Terraform 脚本,以帮助您快速轻松地建立完整的机器学习项目。

我们最初的计划是在 Kubeflow 的基础上构建这个工具,但是这个工具有一些缺点,所以我们决定放弃它。现在我们用提督. io 代替,我们很喜欢它。

为什么我们选择了提督

我们之前比较了其他几个工作流程编排工具,我们已经将 Luigi 用于我们现有的许多项目。不幸的是,Luigi 不能很好地与 Kubernetes 配合,尽管我们在旧项目中用一些自定义代码修补了这个缺口,但我们希望 Kubernetes 成为我们新参考架构的核心。所以我们需要一个具有本地 Kubernetes 支持的工具。

我们也是 Dask 的大用户。Prefect 是建立在 Dask 之上的,他们共享一些核心贡献者,所以我们从一开始就对 Prefect 充满信心。我们知道这些 Dask 基础会带来一个稳定的核心和一个强大的社区——这两者我们在 Kubeflow 中都没有发现。

最后,我们被 Prefect 所吸引,因为 Python 工程师对它很熟悉。它解决了气流等更复杂工具的许多常见问题。具体来说,Prefect 允许您使用一个简单的 Python 装饰器将任何 Python 函数转换成一个任务。

相比之下,像 Airflow 这样的平台使用更加冗长、严格限制的任务。如果你想在气流中完成任务,你必须学会“气流方式”要在 Prefect 中构建任务,您可以简单地编写 Python。

提督自己的“为什么提督”文章提供了几个更有说服力的使用提督的理由:

  • 任务是函数——我们不需要学习另一种做事方式,因为任何 Python 函数都可以是任务。
  • 细节问题 — Prefect 专注于高质量的软件,拥有令人印象深刻的单元测试和文档。
  • 模块化允许适应— 每个完美的组件都被很好地定义,所以我们相信,如果我们愿意,我们可以用其他工具替换它们。

提督适合在哪里?

对于任何机器学习解决方案来说,与训练模型相关的算法和代码只是一小部分。管理工作流程数据流是任何大规模生产解决方案的重要组成部分,但却不太受关注。这就是提督的用武之地。

我们使用 Prefect 从源中提取数据,根据需要进行转换(Prefect 的 ETL 流程非常简洁直观,可以构建),并监控任何需要运行的作业。

通过标准的机器学习架构,Prefect 将接管所有数据流自动化需求。它还将与像 Dask 这样的库集成,无缝地处理分布式计算。

我们使用 Prefect 实现数据流自动化,但它也集成了 Dask 来帮助分布式计算。来源:作者

详细看看我们的完美设置

提督是由几个组件组成的,有很多方法来使用它。我们只把它作为开源软件使用。这意味着在 AWS 上建立我们自己的完美服务器,而不依赖完美云。

我们的整个参考架构必须完全免费(就像 freedom 和 beer 一样),这意味着我们的设置甚至不需要用户拥有一个 Prefect.io 帐户。

更具体地说,我们使用 Helm 在我们的 Kubernetes 集群中设置提督。Helm 创建了几个提督依赖的组件,包括:

  • 提督代理 处理任务编排和资源分配。
  • 提督 UI ,提供了一个很好的用户界面和一个仪表盘概览。
  • Apollo,GraphQL,Hasura,提督用哪个来服务 API。
  • Postgres,提督用它来存储流的元数据。

提督服务器的掌舵图还在实验阶段,但是提督社区再一次超越了使命召唤来帮助我们解决一些初期问题。

缩小一点,这意味着 Prefect 位于我们的 Kubernetes 集群中,处理我们所有的工作流和数据流管理。

我们的 Kubernetes 集群还包含其他机器学习服务,特别是:

  • JupyterHub ,我们用它作为我们的实验中心来做快速原型。
  • Dask ,我们用于分布式计算。

在我们的 Kubernetes 集群中,Prefect、JupyterHub 和 Dask 都作为名称空间存在。来源:作者

这种设置使我们的工程师能够专注于解决难题,而不必担心基础设施。他们可以在 Jupyter 笔记本上建立一个实验作为完美的任务,并提交给 Dask 进行处理——所有这些都在熟悉的笔记本界面中进行。

Prefect 在跟踪什么在哪里运行,以及在出现问题时提供有用的日志和可视化方面做得很好。

我们迄今为止的经验

我们已经在我们的 Kubernetes 集群中设置了 Prefect,并在我们的一些管道中进行了测试。到目前为止,这都是很棒的经历。我们遇到的唯一障碍与某些 Prefect 核心组件有关,这些组件假设您使用的是 Prefect 云(Prefect 的专有企业部分)。

因为我们运行的是我们自己的完美服务器(而不是完美云),所以我们对作为第三方服务的完美没有任何依赖性。Prefect 社区在这点上特别有帮助:我们在他们的 Slack 组上的问题在几分钟内就得到了回复。他们还解决并部署了我们在几小时内报告的一个 bug 的修复程序。

几天之内,Prefect 也合并并部署了我们对他们关于用 HELM 部署 Prefect 的文档的改进。

现在,我们的 Jupyter 笔记本电脑与 Prefect 集成在一起。我们喜欢这种设置的简单性,干净的用户界面和仪表盘让使用起来很愉快。

需要帮助创建可扩展的机器学习管道吗?

我们喜欢使用新的 ML 工具——我们已经尝试了其中的大部分。如果你需要帮助建立你自己的可扩展机器学习管道,请联系聊聊。

注册订阅我们的时事通讯以获取我们的下一篇文章,详细介绍我们的完整参考架构。

当我们谈论 ML 时,我们谈论什么

原文:https://towardsdatascience.com/what-we-talk-about-when-we-talk-about-ml-d4a07cbc14f2?source=collection_archive---------34-----------------------

我想花些时间反思一下我自己发展 ML 技能的经历。有一个 NYT 项目利用公共跑步数据来寻找最快的跑鞋。我将用这个项目来突出三个不同方面的 ML 技能:建模、工程和策略。

首先,我想澄清 ML 和数据科学之间的区别,至少在这个背景下。主要的区别特征是项目可交付物是由人还是由机器来使用。对于数据科学家来说,交付品可以是决策者的仪表板。他们可以为零售商工作,并利用这些见解来决定库存哪些跑鞋。对于 ML 工程师来说,可交付成果可能是一个用于在网站上对鞋子进行排名的预测 API。

大学的时候,我懂线性代数,概率,还有一些算法。我会花一半的时间来收集数据和安装 ML 库。然后,我会花另一半的时间通过跟随教程来弄清楚如何运行一个基本模型,但并不真正理解发生了什么。迷上了 ML,就去读研了解更多。

我最终在博士期间获得了 ML 建模专业知识。我们可以在计算机视觉模型中使用跑鞋的照片,并在文本模型中加入评论。我们甚至可以构建所有跑鞋的嵌入,以便进行一些迁移学习。这些是人们在谈到 ML 时喜欢谈论的事情。然而,它们是一种错误的表述。

西蒙·伯杰在 Unsplash 上拍摄的照片

我喜欢把 ML 项目想象成登山运动。攀登需要的不仅仅是纯粹的体能,还需要你知道如何在危险的条件下正确使用装备和随机应变。从这个意义上说,ML 研究更类似于健身房里的抱石运动。大多数登山运动员可能不会闪光 V10,强壮的登山者可能甚至不知道如何打结…

软件工程师将建立一个可靠的管道来定期获取数据,以适当的格式存储数据,并使用多个版本重新训练模型以进行 A/B 测试……工程技能对于生产中可扩展的东西是必要的,例如每秒至少获得数百次点击的网站。

经过一段时间和大量的挠头,一个人可以掌握建模和工程技能,这将使他们更容易就业。大多数时候,ML 项目往往是高度迭代的,具有不可预测的挑战。这就是为什么人们被吸引到 ML,但同时当你得到报酬或付钱给别人做这件事时,有很多东西需要制定策略。

运筹帷幄有三个重要问题:

1。ML 问题实际上是可解的吗

这是人们容易忽视的一点,因为这听起来并不性感。先动手建立一个强大的基线模型!

2.实际上这意味着什么

ML 指标并不能转化为现实世界。如果我们在一个网站上使用 ML 进行跑鞋排名,即使使用不太准确的模型,负面影响也可能相当小。然而,这可能是一个市场差异化因素,并推动流量/收入。在另一个稍微虚构的场景中,我们使用 ML 在实体店中存储跑鞋,较高的误差会导致更困难的后果。

3.如何进行成本/收益权衡

时间和资源有限。举个例子,你可能经过一整年的开发,有了一个牛逼的模型。但你也可能会花太多时间在创造花哨的模型功能上,并在假日购物季后推迟发布。或者模型刚好消耗了那么多计算量,整个网站都很慢。不管怎样,这都是未能平衡正确权衡的结果。

Python 中序列化(反序列化)的内容、原因和方式

原文:https://towardsdatascience.com/what-why-and-how-of-de-serialization-in-python-2d4c3b622f6b?source=collection_archive---------13-----------------------

其实比你想象的简单

照片由 timJUnsplash 拍摄

我第一次听说序列化和反序列化这个词的时候,我不知道它们是什么意思,而且觉得这些术语很“吓人”。过了几天,我开始拾起这个概念,但被它们与编码和解码的相关性搞糊涂了。在这篇文章中,我想像新手一样向你介绍这个概念。到文章结束的时候,你会发现这并没有你想象的那么难。

什么是(反)序列化,我们为什么需要它?

我们每天在 Python 中创建大量的对象,如果程序死亡,这些对象最终会消失。有时我们希望将对象的状态存储在文件或数据库中,或者通过网络传输以备将来使用。这有助于我们在不同的程序甚至不同的环境中重用该对象。

但是我们可能面临的问题是兼容性。假设你用 Python 创建了一个对象,Java 程序如何重用它呢?Python 中的布尔值看起来像TrueFalse,但是在 Java 中,它们是用truefalse来表示的。必须有一个“中间人”创造一种两个程序都能理解的通用语言——这是一个字节序列。

将结构化对象转换成可以存储在文件系统或数据库中或通过网络发送的字节序列的过程称为序列化。相反的过程称为反序列化,这意味着将一个字节序列重新转换成一个结构化的对象。通过反序列化创建对象通常比从类初始化要快。

创作人:高

在许多数据科学项目中,将对象的状态存储在文件或数据库中可以节省处理大型数据集的时间。例如,您只需对数据集进行一次预处理,并将模型保存到磁盘中。稍后,您只需要反序列化它,并根据需要多次重用预先准备好的模型。这肯定比每次都进行预处理要好。它的副作用是序列化的对象可能太大而无法加载到内存中,所以最好使用几个分块的对象。

此外,您可以对数据流进行加密和压缩,以提高安全性并进一步提升性能。

有哪些流行的(解)序列化格式?

要序列化复杂的数据结构,需要一种序列化格式。它将对象转换成某种可以存储和传输的格式。有两组序列化格式:基于文本的和基于二进制的。顾名思义,基于文本的序列化是以人类可读的格式序列化对象的过程,而基于二进制的序列化是以人类不可读的格式。

编码&解码

如引言部分所述,我在早期并不真正了解编码和序列化之间的区别。简而言之,编码是一种使用编码模式(如 UTF-8)将字符转换为比特的方法,而序列化是一个漫长的过程,它也将比特存储到文件、数据库中或将它们发送到网络。所以我将编码视为序列化过程的一部分。如果您想了解更多关于 Python 编码的知识,我推荐您阅读 RealPython 的这篇文章。

https://realpython.com/python-encodings-guide/#whats-a-character-encoding

回到序列化格式,典型的基于文本的序列化格式有 CSV、JSON、XML、YAML、TOML 等。基于二进制的格式有 protobuf 和 Avro。Python 也有几个包,像 pickle,numpy 和 pandas,支持将自定义对象序列化为字节格式。

为了让您感受几种序列化格式之间的差异,我在整篇文章中使用了同一个示例。假设我有一个属性为authorpublicationpublish_datetopicsword_countis_vip的类Article。我想在一个文件中存储许多对象的状态,并与消费者共享。

CSV

CSV 可能是最简单的序列化格式。它代表逗号分隔的值。它非常适合存储列表数据(平面数据)。正如您在这个例子中看到的,它不太适合嵌套数据结构。在代码中,我首先使用来自dataclassesasdict函数将一个 Article 对象转换成一个字典,然后使用csv.DictWriter将那个字典写入一个 csv 文件。

实际上,我们刚刚完成了一个序列化过程。多简单啊!在很高的层次上,序列化只不过是将数据写入磁盘,而反序列化意味着将数据读入内存。

但是您可能会注意到,属性topic应该是一个列表,但在 csv 文件中却表示为一个字符串。这是因为 csv 只支持平面数据,这意味着在读取文件时,需要一个额外的步骤来将字符串topic转换回列表。此外,csv 文件不存储类型信息,所以一切都被解释为字符串,就像属性word_count。如果我读取article.csv文件并打印该行,我将得到一个 dictionary 对象,其中每个属性都是字符串格式。

总之,csv 文件可以存储平面对象的属性和值,但不能总是存储正确的数据类型信息。为了解决这个问题,我们需要更灵活的格式。

JSON

JSON 是一个很好的选择。JSON 是最广泛使用的数据序列化格式,因为它具有人类可读的语法,与几乎所有编程语言兼容,并支持嵌套数据结构和多种数据类型。

我们可以使用内置库json将同一个article对象写入 JSON 文件。dump()将一个对象序列化成 JSON 格式的字符串,然后写入 file 对象。json使用JSONEncoder类将 Python 类型转换为 JSON 类型(例如True => trueFalse => falseNone => null)。可以扩展JSONEncoder并序列化其他类型。

我推荐另一篇来自 RealPython 的关于 Python 中 JSON 数据的文章。

https://realpython.com/python-json/

另一方面,反序列化过程只是读取JSON 文件并重新创建一个 dictionary 对象。如您所见,重新创建的对象与原始对象相同。

不足为奇的是,在这个例子中,JSON 比 csv 更适合,因为它比 csv 拥有更多的对象特征,因此能够完全恢复对象。但是 JSON 的一个潜在问题是,您必须将完整的文件加载到内存中,而您可以迭代 csv 中的行,而不会给内存带来太大的压力。

当然,你可以创建多个块来释放内存,但是你必须记住这一点。

另一种与 JSON 类似的格式是 YAML。我已经在这篇文章里讲过他们的区别。YAML 还支持嵌套数据结构和不同的数据类型。

XML

下一个基于文本的格式是 XML,用于以树状结构表示嵌套信息。它广泛应用于 Web 和面向服务的架构中。XML 文件不包含任何类型信息,但是您可以通过一个模式(所谓的 XSD)来标准化和验证 XML 文件。

Python 提供了一个内置的库xml.etree.ElementTree来帮助我们创建或读取 XML 文件,但是从字典到树元素的转换不像以前的格式那样简单。在这个代码示例中,我自己实现了一个简单的 dict2xml 适配器。

因此,它的 XSD 文件看起来像这样,其中每个元素都绑定到一个类型。除了内置的数据类型之外,您还可以用[xs:restriction](https://www.w3schools.com/xml/schema_facets.asp)定义自己的数据类型,如xs:maxLengthxs:pattern等。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="[http://www.w3.org/2001/XMLSchema](http://www.w3.org/2001/XMLSchema)">
  <xs:element name="article">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="author"/>
        <xs:element type="xs:string" name="publication"/>
        <xs:element type="xs:date" name="publish_date"/>
        <xs:element type="xs:string" name="topics" maxOccurs="unbounded" minOccurs="0"/>
        <xs:element type="xs:integer" name="word_count"/>
        <xs:element type="xs:boolean" name="is_vip"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

不幸的是,xml.etree.ElementTree不支持 XSD 验证。一个很好的选择是[lxml](https://lxml.de/)

回到例子,让我们反序列化(读取)XML 文件。由于数据类型的不确定性,Python 中的每个元素值都被解释为字符串。iterparse from cElementTree返回一个迭代器,当你想读取一个大的 XML 文件,又不想把所有东西都加载到内存中时,这个迭代器很有用。

总之,XML 是一种基于模式的序列化格式。但是不管 XSD 文件的类型是什么,Python 总是把它作为字符串读取。因此,将 XML 数据类型转换为 Python 数据类型需要一个自定义适配器。

BSON

到目前为止,我们已经研究了 3 种基于文本的序列化格式。接下来,让我们看看基于二进制的序列化格式。这种格式不是人类可读的,但它可以有效地压缩数据,并被大量用于分布式系统中的通信和存储。

BSON (二进制 JSON)是类似 JSON 的文档的二进制编码序列化。像 JSON 一样,BSON 支持文档和数组的嵌入。BSON 还允许表示不属于 JSON 规范的数据类型。

BSON 主要用于 MongoDB 数据库。安装pymongo时,bson是库的一部分。使用 BSON 编码和解码的方法和 JSON 一样简单。

BSON 记录比 JSON 记录占用更多的空间,因为它还包含记录的元信息,比如数据类型和长度。

来源:http://bsonspec.org/faq.html

另一方面,BSON 提供了一些优于使用 JSON 的优势:

  1. BSON 支持比 JSON 更多的类型,例如,字节和日期。
  2. 由于额外的元数据,BSON 记录易于遍历和查询。它允许在不阅读整个文档的情况下进行值检索。

Avro

另一个著名的基于二进制的序列化格式是 Avro 。Avro 是一种快速的基于模式的序列化格式。在序列化和反序列化过程中必须提供架构。由于其高性能,它最常与阿帕奇卡夫卡一起使用。

Avro schema 以 JSON 格式定义,这使得它与语言无关,可以存储在几乎所有环境中。该模式使用允许数据定义和文档的丰富类型系统来描述记录。有了模式,就有可能对数据建模并创建所有实体的目录。这样的目录可以在模式注册表上提供,使得模式可供消费者和生产者使用。

下面是一个关于Article实体的 Avro 模式的例子。

许多编程语言都支持 Avro,包括 Python。在这个例子中,我使用的是 fast-avro ,一个基于 CPython 的库。已经证实 fast-avro 比纯 Python 实现库 avro 要快得多。

fast-avro 提供writer/readerschemaless_writer/schemaless_reader。第一个选项将模式作为文件头插入到.avro文件中,而第二个选项没有。

泡菜

好了,在展示了不同的序列化格式之后,我将向您介绍几个方便的 Python 库,它们可以序列化 Python 对象。其中一个就是咸菜

“Pickling”是将 Python 对象层次结构转换成字节流的过程,“unpickling”是相反的操作。

关于什么可以被酸洗和拆洗,这里是 Python 文档上的列表

来源:https://docs . python . org/3/library/pickle . html #什么能被腌制和解除腌制

被取消拾取的对象属于Article类型,可以立即使用。

然而,如这里的所述,Pickle 模块由于代码注入的可能性而不安全。像 Bandit 这样的工具不会让它通过安全检查,所以永远不会从不受信任的来源中取出对象。

熊猫/熊猫

著名的数据操作库如 Pandas 和 Numpy 也提供类似 pickle 的功能。如果DataFramenp.ndarry被认为是生产者和消费者之间的通用数据类型,这将变得非常方便。

如果你知道更多可以将数据序列化为不同格式的 Python 库,请在下面留下评论与我们分享。

多种序列化格式的比较

最后,让我们看看每个序列化格式/库的性能。这些测试是在 8 核 i9 的 Macbook 上执行的。

在这个例子中,我想将 100 个article对象写入一个文件,然后在不同的函数中重新创建这些对象。最后,我使用assert来比较重新创建的对象和原始对象。完整的实现可以在这里找到。

创作人

图表告诉我们:

  1. pickle在这次性能测试中胜出。大概是因为一个article对象不需要先转换成 JSON 就可以直接序列化。
  2. BSON 在序列化和反序列化方面都比 JSON 表现得更好。同样适用于numpy v.s pandas
  3. csv的反序列化花费了更多的时间是因为将属性从字符串转换成原始类型的步骤(例如intbool)。
  4. 作为唯一基于模式的序列化格式,avro的性能相当可观。
  5. XML 的缓慢可以归咎于实现。请让我知道我如何能改进它。😃

结论

首先感谢看完这么长的文章。恭喜你!你活下来了(我也活下来了)!:)在本文中,我们讨论了序列化和反序列化 Python 对象的许多可能性。到目前为止,你一定不再觉得这两个术语令人生畏,在某种程度上,这只是一种说的花哨说法。

每种序列化格式都有优点和缺点。你应该想想你是想要基于文本的还是基于二进制的,基于模式的还是基于非模式的,你的数据格式是什么?字典,DataFrame 还是 Python 对象?是只保存值还是也保存类型?你在乎性能和内存吗?

希望这篇文章能帮助你做出明智的决定。如果你有任何想法,请在下面留下你的评论。

参考

https://docs.python-guide.org/scenarios/serialization/

甘和贝叶斯网络预测全球变暖对我滑雪出游的影响

原文:https://towardsdatascience.com/what-will-be-the-impact-of-global-warming-on-my-ski-outings-8ac3cf10a843?source=collection_archive---------49-----------------------

生成对抗网络(GAN)近似分布,而贝叶斯网络(BN)调节温度和滑雪路线。

作为一名滑雪者,我已经在现场观察到了气候变化的影响:雪会在季节的晚些时候到来,中等海拔地区的雪会减少……作为一名数据科学家,我想知道接下来会发生什么:随着气候变暖,是否有可能在同样的斜坡上滑雪?

提交人于 2003 年 3 月 23 日在穆什度假

数据:从营地到营地的滑雪旅行

滑雪旅行是在度假胜地滑雪的越野变体:在上山的路上,它看起来像越野跑或徒步旅行,但在滑雪板上,在下山的路上,它看起来像免费乘坐,即使滑雪板更薄更轻。至于越野车,游乐场比滑雪胜地大得多。

然而,这种活动取决于积雪的质量和数量,以及雪崩的风险。提前获得路线信息是营地对营地存在的理由。最新的信息是通过郊游报告收集的,有点类似于 Strava 的报告,但有更多关于户外条件的定量和定性信息。报告是条件的指示:在给定的路线或日期上没有或坏的报告可能意味着条件不适合

滑雪旅游,上坡作者

对于我的机器学习任务,我们选择了勃朗峰地区的郊游报告,这是法国上萨瓦省的行政区。这是最多样的滑雪区,最高峰海拔从 1000 米到勃朗峰的 4810 米不等。但是这个地区的范围还不足以承受完全不同的气候条件。郊游报告的时间跨度从 2009 年到 2019 年。总共有 6656 个外出报告,丢弃所有不完整的报告。

报告既有文本的,也有定量的。在上一篇文章“fast text 和 Tensorflow 2 的完整 NLP 用例”中,我重点介绍了路线的文本描述。在这篇文章中,我将讨论郊游报告的量化特征。我选择了以下与我们的目标相关且在报告中广泛可用的功能:

  • 最高海拔【米】,这是景观的一个特色,也是滑雪爱好者的一个选择(如:只有高海拔才适合五月滑雪)。
  • 滑雪板打开,向上【米】,告知何时积雪足够厚,可以使用滑雪板(滑雪旅行者习惯于在背包上携带滑雪板),如果缺失,则填入最低海拔
  • 滑雪板关闭,向下【米】,与之前类似,但向下需要更多的雪,或不同的路线(例如,用缆车部分向上,在滑雪板上向下),填充最低海拔如果丢失。
  • 滑雪评分,为路线(不是郊游)定义,在编辑 Volopress 的量表上[8],从 1.1 到 5.5,“正常”(对所有人)都在 2.1 到 3.3 之间。间接表示地形地貌(坡度、覆盖层……)。它从序数转换成数字。
  • 状态评级,滑雪者对此次郊游的主观评价,分为从糟糕到优秀五个等级。它从序数转换成数字。
  • 季节中的某一天,从开始日期中提取,作为对最接近的 2 月 15 日(隆冬)的偏移。

也有对积雪数量和质量的主观评估,但它们在大多数报告中是缺失的。

天气状况是通过温度来捕捉的。我用的是早晨的温度【C】来自www.historique-data.net位于海拔 1000 米左右的梅吉夫度假村。郊游地点的实际温度不同,但相互关联。为了考虑郊游时间附近的天气条件,从早晨温度中导出两个额外的特征:郊游前过去 7 天和 30 天的平均值

现在我总共有 9 个特征来定量描述滑雪旅行。

数据说明了什么?

特征的相关性提供了很多信息。三个温度是相关的,甚至当天的温度和前 30 天的平均。海拔也是相关的,预计上的滑雪板和下的海拔有很强的相关性。季节的大多与三个温度最高海拔相关。但是条件等级与任何其他特征几乎没有关联,甚至比主要取决于地形的滑雪等级更没有关联!

营地间郊游报告上的特征相关图

使用直方图观察边际分布,我发现:

  • 季节性很明显,夏季外出不多:-)

作者出游开始日期直方图

  • 郊游季节在 2010-2019 年间分布相当均匀,这有利于统计

出游季节直方图作者

  • 这个季节从 2 月 15 日之前的 100 天到之后的 110 天

相对于 2 月 15 日(仲冬)作者郊游的日子

温度已经上升了吗?

观测时间范围(2010 年至 2019 年)太小,无法解释每年的变化,也无法获得气候演变的一些有力迹象。无论如何,让我们比较一下观察的开始(2010-2012)和结束(2017-2019)。

从下面的直方图来看,季节的日分布在中央峰的左侧被修改:季节开始得更晚。当地的观察证实,在这个季节的晚些时候,圣诞节之后,有时是一月中旬之后,雪的条件会变好。

作者 2010-2012 年和 2017-2019 年相对于 2 月 15 日的外出日直方图

早晨的气温上升了平均变化 1.8 摄氏度

2010-2012 年和 2017-2019 年早晨温度的累积直方图

生成对抗网络(GAN) [1]是一种在给定参考数据集的情况下同时训练两个深度神经网络的方法:

  • 发生器将随机生成的分布变量(如高斯分布)作为输入,即潜在变量,并输出模拟所需分布的随机变量
  • 鉴别器是一个二元分类器,旨在将属于数据集的输入从生成器的输出产品中分离出来

这两个网络的训练是同时进行的,对于每批随机样本和数据集样本,生成器的性能最大化,而鉴别器的分类误差最小化。

甘训练方案作者

GAN 的应用范围从数据扩充[6]到风格转换[7]。GAN 能够近似如[2]中用数学公式表示的分布。我使用这个属性来创建一个 outing 报告的生成器,生成器的输入是一组高斯独立变量,输出是与真实报告分布相似的报告定量变量。

这是通过对发电机输出进行采样来验证的,即生成数千份伪造的外出报告。如下图所示,特征相关性与真实相关性非常相似。最显著的错误是雪板打开和雪板关闭时高度的完全相关性。此外,与营地间数据的相关性相比,季节的日期与其他特征的相关性太大。

特征相关图为 GAN 生成的样本作者

下面的例子是真实的(营地到营地)和生成的数据的季节中一天的边际密度分布。有一个相当好的匹配,即使分布在两边都被截断。

从营地到营地的样本和甘生成的样本的出行日直方图

我现在有一个假郊游的生成器,我可以做数据扩充。

贝叶斯网络

在上面的 GAN 模型中,所有的特征都组合在一个黑盒中,我不能在它们之间创建关系或条件。为了解决这个缺点,我将在 GAN 架构中构建一个贝叶斯网络。

贝叶斯网络[4]是在直接非循环图上显示因果关系的图形概率模型。在目前的情况下,我想表达郊游类型(最大海拔、滑雪等级)、天气条件(温度、季节日期)和其余特征(滑雪板开和关、条件等级)之间的相关性。

贝叶斯网络建模特征之间的依赖关系

与条件 GAN [3]类似,我的新 GAN 生成器由三个生成器组成,它们接收随机变量和观察变量的组合作为条件:

  • 第一种是将潜在随机变量作为输入,输出前两个特征(最大海拔、滑雪等级)。
  • 第二个生成器将这两个特征和一些潜在变量作为输入。第二个发生器的输出是三个温度和季节中的一天。
  • 相同的方案被应用于第三生成器,但是使用 6 个已经生成的特征和一些潜在变量(随机)作为输入。

最终,三个发生器的输出被组合成 9 个特征的单个向量。这些特征被输入到与前一种情况相同的鉴别器。

GAN 生成器架构实现贝叶斯网络调理作者

每个生成器是一个 4 层的深度神经网络。

类似的训练被应用于该第二 GAN。验证是相似的:特征相关性,边际分布。

专注于特定的路线

我现在能够设置与特定路线相关的参数:最高海拔和滑雪等级。我选择了名为“穆什路”的路线,滑雪等级 2.3,最高海拔 2453 米。“特劳德拉穆什”(字面意思是飞孔)是一条穿过挤压岩石的通道,形状类似于昆虫的头部和身体。这是当地一条非常著名的路线,1440 米处的停车场非常容易到达,1000 米以上的斜坡平缓而连续,由于没有太多的阳光照射,雪的质量通常很好。

2019 . 02 . 20 . www.camptocamp.org 从到穆什路郊游报道截图

我现在正在采样甘发电机的输出,与营地间的报告进行比较。滑雪板开/关标高如下图所示,实际标高大部分在 1440 米,停车场标高。生成的高程主要分布在 1200-1600 米之间。GAN 不知道停车场的高度,但是知道类似外出的开/关高度的分布。

作者在特劳德拉穆什营地间郊游报告和甘生成的样本的滑雪板开和关高度直方图

同样的情况也发生在一个季节的某一天,额外的困难是,关于所选出游的报告数量不足以从直方图中获得平滑的分布。

直方图的一天的季节郊游在特劳德拉穆什对营地和生成的样本从甘作者

全球变暖的影响

仍然使用“穆什之路”的路线参数和上面的 GAN 架构,我现在将发电机 G2 输出的生成温度偏移 1 到 6°C 的固定偏移量。与前工业时代相比,全球变暖当前目标增加 3 到 5°C,即从现在起增加 1.5 到 3.5°C。然而,有研究表明,阿尔卑斯山的增幅是两倍[5],这就是为什么我们可以期待更大的增幅。

GAN 生成的郊游滑雪板开/关的中间标高,作为温度变化的函数

气温升高 3.5 摄氏度,中位标高升高 100 米,气温升高 6 摄氏度,中位标高升高 200 米。鉴于“穆什路”的实际起点海拔为 1440 米,气温上升 3.5 摄氏度将使其只有一半的路程被雪覆盖。30%的户外活动需要 100 米的步行道。

结论

我只展示了几个特征和一个只影响温度的简单气候变化模型,展示了对特定位置的影响。这项研究还展示了 GAN 模拟复杂概率分布的能力,以及基于贝叶斯网络的架构技巧,以根据变量子集调整这些分布。

这个笔记本可以从我的数据科学博客上获得:

https://nbviewer.ipython.org/github/tonio73/data-science/blob/master/generative/GAN_ski_outings.ipynb

从作者穆什路看到的勃朗峰山脉

参考

  1. 《生成性对抗性网络》,I .古德菲勒,j .普热-阿巴迪,m .米尔扎,b .徐,d .沃德-法利,s .奥泽尔,a .,y .本吉奥,NIPS,2014
  2. 《贝氏甘》,y .萨奇,A.G .威尔逊,NIPS,2017
  3. “条件生成对抗网”,M. Mirza,S. Osindero,2014
  4. 《贝叶斯网络导论》,德文·索尼,中,2018
  5. 《找到确认高山融化的树》《卫报》,2013 年
  6. “使用生成对抗网络(GANs)进行结肠直肠图像的数据增强”,Jerry Wei,Medium,2019
  7. 《神经风格转移》,Tensorflow 教程
  8. Cotation Toponeige (法语),Volopress

未来的空间分析会是什么样子?

原文:https://towardsdatascience.com/what-will-spatial-analysis-look-like-in-future-a671d9cc34c9?source=collection_archive---------40-----------------------

思想和理论

图论、细胞自动机和深度学习如何悄无声息地一起塑造空间建模的未来。

米利安·耶西耶Unsplash 上拍摄的照片

讨论的主题非常广泛,因为在展望未来之前,我们需要讨论空间分析的整个范围。预测未来的第一件事是了解过去。因此,我将把讨论范围逐步缩小到最吸引我的空间分析领域。我参与了许多深度学习项目,也有一些将城市过程建模为时间图的经验。这种接触的组合给了我一种特殊的视角,我经常试图比较所有这些范式(就在我的脑海里)。因此,在这篇文章中,我将讨论这三种范式的统一,这就是我所预见的空间分析的未来。

从这篇文章的主题转移,我将首先简要地讨论那些陈词滥调的论点,它们通常是任何关于计算建模技术未来的争论的中心。这些过分强调但却是真实的观察结果是

  1. 随着我们更深入地进入数字化时代,我们将会遇到不断增加的数据量和多样性,这使得模型的参数化更加精确
  2. 随着现代计算设备的计算能力不断提高,我们将能够为所有建模范例探索更大和更复杂的假设空间,并进行更少的以逻辑为中心的简化。这些方面肯定会加速空间分析技术的研究和采用,并使其在决策中无处不在。

在空间分析中,我们花费大量时间研究空间和时间地理,了解它们之间的内在关系,并在分析中建立包括空间和时间维度的评价。此外,很容易观察到,大多数真实世界的现象固有地表现出复杂的空间和时间依赖性,并且任何旨在建立真实世界的精确模型的建模范例都应该具有将这些依赖性与正在分析的其他属性结合起来的能力。尽管存在明显的空间依赖性,但将空间信息纳入建模并没有得到很好的理解。因此,具有讽刺意味的是,大多数统计和经典的机器学习方法,如时间序列预测,通过将它们的理论基础建立在特征空间不相关的假设上,系统地分离了空间相关性。而空间调整的形式只是后来才发展起来,试图以有限的方式将空间信息结合到模型中。考虑到建模空间和时间依赖性的能力,我将讨论细胞自动机(CA),并推测该领域与基于图形的建模和神经网络的可能结合。下面的段落将为我的预测奠定基础。

元胞自动机

如上所述,元胞自动机(CA)是一种流行的城市系统建模范式,可应用于土地利用、蔓延、社会空间动态、城市化和中产阶级化[2]。元胞自动机模型的一个吸引人的方面是,它意识到大多数全球现象是由小的局部细胞的相互作用产生的[3]。这是直观的,并且与大多数城市场景相关,因为系统范围的影响是由小规模行动者之间的相互作用引起的,这些行动者按照他们的动机和议程行动。

CA 建模将空间量化为单元,将时间量化为离散的步骤。这些单元的状态可以根据状态转换规则以离散的时间步长变化[4]。CA 提供了通过离散时间状态转换对系统的时间动态进行建模的能力。对于空间关系的建模,CA 依赖于位置的概念,并使用像元的邻域。通过考虑单元的邻居以及单元本身的属性来确定单元的状态。像 von Neumann 邻域和 Moore [5]一样,相邻单元在单元空间中通常是一致的,即单元空间中相邻的单元被认为是相邻单元。但是直觉认为空间邻近的影响超出了近邻,因此引入了基于距离衰减的模型[6]。这是建立在托布勒地理第一定律的基础上的,该定律指出,距离越近的事物之间的联系越紧密。时间动态和邻里关系共同模拟了对城市系统至关重要的空间扩散过程[4]。由于每个单元都影响其相邻单元的下一个状态,所以在一些时间步骤之后,该影响可以传播到非直接相邻单元。此外,据报道,您还强调了 CA 与地理信息系统集成的便利性,特别是当细胞空间被组织为栅格时[7]。

CA 的一个限制是细胞空间可能是不均匀的。在空间分析的第一节课中,我们广泛研究了空间的概念,并了解到空间并不局限于物理地理空间,而是可以推广到过多的空间定义,例如我的 facebook 朋友的空间。以这个空间为例,一个单元(人)可以有许多邻居(直接朋友),不同的人可以有不同数量的邻居。这种不规则性使得在欧几里得空间中将其建模为多维网格变得更加困难。此外,如果我们同时考虑多个空间之间的关系,即社交媒体上的连通性和地理空间的邻近性,那么转换到细胞空间就变得更加重要。下一节将讨论一个方便的解决方案。

CA 与图的关系

一个自然的更灵活的选择是图,它可以很容易地捕捉非统一的细胞空间、细胞之间的结构和拓扑关系。Sullivan 引入了图形细胞自动机的概念[8],其中细胞被表示为图形顶点的节点,捕捉了细胞之间的关系。任何节点都可以通过边连接到图中的任何其他节点,并且这些边可以具有属性,从而允许连接的定量参数化和跨越多个邻近定义的建模。另一个优点是图形可以是动态的,并且可以模拟变化的邻域和时间动态结构。此外,图可以模拟扩散过程,并形成由子图组成的层次结构。图形的每个节点都可以是一个复杂的组件,就像图形本身一样,允许表示复杂的单元。研究表明,图 CA 展示了传统 CA 的所有性质,因此可以顺利地应用于相关应用[8]。

细胞自动机与深度学习的关系

深度学习一直在默默和 CA 调情,但最近因为新获得的名气而受到关注。深度学习的冠军之一是卷积神经网络(CNN)。CNN 成功背后的关键是它们保持局部空间相关性的能力,这是通过使用有限的核大小来实现的[10]。托布勒第一定律又赢了!最近,CNN 已经在许多基于空间栅格数据的任务上产生了最先进的结果,例如遥感[11][12][13]。Gilpin 将 CA 中动态更新的局部性与卷积神经网络中的卷积核进行了类比[9]。他提出了一种卷积神经网络架构,当在简单二进制 CA 的视觉光栅表示上训练时,该架构能够学习状态转移规则。

为了处理时间依赖性,引入了类似长短期记忆(LSTM) [14]的循环神经网络。与有限状态自动机和隐马尔可夫模型相比,它们不限于预定义的有限状态,可以处理无限状态[14]。但是神经网络是黑盒,很难解释,不像 CA。为了解决这个问题,已经尝试从训练好的递归神经网络中提取有限状态自动机[15][16]

图形与深度学习的关系

这是最新的发展,他们的关系是这些领域观众最热门的话题。随着深度学习在其他领域建模复杂非线性关系方面的成功,前馈神经网络(NN) [17]和递归神经网络(RNN) [18]被用于时空交通预测。由于能够模拟非线性时间动态,长短期记忆(LSTM)和门控循环单元(GRU)在交通预测等城市系统中表现出显著的改善[19][20][21]。但是这些方法不能精确地解决空间和结构依赖性。后来,基于卷积神经网络(CNN)的方法[22][23]被开发出来,用于模拟空间关系。尽管传统的 CNN 在欧几里得空间中对图像和其他空间关系建模工作得很好,但它们不适合连通性和结构超出空间邻近性的网络。由于 CNN 不能很好地推广到图,所以开发了图卷积网络 GCNs 来将卷积运算从欧几里得空间推广到图。GCN 方法目前有两个不同的类别。光谱方法基于图形信号处理理论[24],而空间方法基于来自节点邻居的特征集合。

最近,出现了图时空网络,其使用基于图的神经网络方法来同时建模空间和时间依赖性。李等人。al [25]介绍了扩散卷积递归神经网络(DCRNN),它将交通网络中的空间依赖性建模为扩散过程,并使用递归神经网络来建模时间依赖性。他们表明,他们的方法在预测道路交通网络方面优于以前的策略。张等人。al [26]引入了图的门控注意网络(GaAN ),并将其作为构建块来构建图门控递归单元(GGRU)。GGRU 被用在交通速度预测中,并且显示出达到最先进的结果。

图形、深度学习和细胞自动机

发展关系的最初迹象开始出现。Johnson 引入了门控图形转换器神经网络[27],它能够使用转换器神经网络学习图形状态转换。他们证明,通过在图中表示细胞,他们的网络可以通过成功学习规则 30 [28]来模拟细胞状态转换。基于我在整篇文章中讨论的发展,我预测这种关系将会很好地工作,我们将会看到它在未来二十年的空间分析中完成许多壮举。最初,关系中存在压力的可能性,因为 CA 将通过失去其参数可解释性(支持直观的空间分析)来进行权衡。但是,我相信,在研究团体的辅导下,他们将能够克服这些问题,并从此幸福地生活下去。

参考文献

  1. 下午托伦斯和德·奥沙利文。2001.细胞自动机和城市模拟:我们将何去何从?环境与规划 B28(2):163–68。
  2. Couclelis H,1985,“细胞世界:微观-宏观动力学建模框架”环境与规划 A17 585–596
  3. 巴蒂,硕士,1997 年。社论:作为细胞自动机的城市系统。环境。计划。B 24,159–164。
  4. Palash Sarkar,《细胞自动机简史》,美国计算机学会计算调查(CSUR ),第 32 卷第 1 期,第 80-107 页,2000 年 3 月
  5. Clarke K . C,Hoppen S,Gaydos L,1997,“旧金山湾区历史城市化的自修正元胞自动机模型”《环境与规划 B:规划与设计》24,247–261
  6. Torrens P M,2000,“城市系统的细胞模型如何工作”,WP-28,高级空间分析中心(CASA),伦敦大学学院;在 http://www.casa.ucl.ac.uk/howcawork.pdf有售
  7. 奥沙利文博士,2001 年。图形细胞自动机:一个广义的离散城市和区域模型。环境与规划 B,28(5):687–706。
  8. W.吉尔平,arXiv 预印本 arXiv:1809.02942 (2018)。
  9. 勒昆,y,博图,l,本吉奥,y,哈夫纳,p . 1998。基于梯度的学习在文档识别中的应用。继续。IEEE 86 (11),2278–2324。
  10. Anwer,R.M .,Khan,F.S .,van de Weijer,j .,Molinier,m .,Laaksonen,j .,2018。用于纹理识别和遥感场景分类的二进制模式编码卷积神经网络。国际摄影学会杂志。遥感器 138,74–85。
  11. 丁,张,杨,邓伟杰,贾,高,2018。一种用于光学遥感图像目标检测的轻型快速区域卷积神经网络。国际摄影学会杂志。遥感器 141,208–218。
  12. Paoletti,M.E .,Haut,J.M .,Plaza,j .,Plaza,a .,2018。一种用于快速高光谱图像分类的新型深度卷积神经网络。国际摄影学会杂志。遥感器 145,120–147。
  13. “长短期记忆”,神经计算 9 (8),1997 年,第 1735-1780 页
  14. 盖尔·韦斯、约夫·戈德堡和埃兰·亚哈夫。使用查询和反例从递归神经网络中提取自动机。《第 35 届机器学习国际会议论文集》,第 80 卷,第 5247–5256 页,2018 年 b。
  15. 、张凯旋、亚历山大·奥罗比亚二世、邢新宇、刘学和 c·李·贾尔斯。递归神经网络规则提取的实证评估。神经计算,30(9):2568–2591,2018b。
  16. 东珠公园和劳伦斯·R·里莱特。1999.用多层前馈神经网络预测高速公路路段行程时间。计算机辅助土木和基础设施工程 14,5 (1999),357–367。
  17. 范·林特、胡根道恩和范·苏伦。2002.用状态空间神经网络预测高速公路行驶时间:用递归神经网络模拟状态空间动力学。运输研究记录:运输研究委员会杂志 1811 (2002),30-39。
  18. 、柯瑞民和王。2018.用于全网交通速度预测的深度双向和单向 LSTM 递归神经网络。arXiv 预印本 arXiv:1801.02143 (2018)。
  19. 、陶志敏、、王、、王云鹏。2015.使用远程微波传感器数据预测交通速度的长短期记忆神经网络。运输研究 C 部分:新兴技术 54 (2015),187–197。
  20. 俞、李亚光、赛勒斯·沙哈比、乌古尔·德米留雷克和刘燕。2017.深度学习:极端条件交通预测的一般方法。2017 年 SIAM 数据挖掘国际会议论文集。暹罗,777–785。
  21. 、庄岱、、何、、、、王云鹏。2017.将交通作为图像学习:用于大规模交通网络速度预测的深度卷积神经网络。传感器 17,4 (2017),818。
  22. 张军波,,齐。2017.用于城市人群流量预测的深度时空残差网络。在 AAAI,第 1655-1661 页。
  23. D.I .舒曼、S. K .纳朗、p .弗罗萨德、a .奥尔特加和 p .范德盖恩斯特,“图形信号处理的新兴领域:将高维数据分析扩展到网络和其他不规则领域”,IEEE 信号处理杂志,第 30 卷,第 3 期,第 83–98 页,2013 年。
  24. Y.李,,c .沙哈比,刘,“扩散卷积递归神经网络:数据驱动的交通预测”,载于 2018 年国际学习表示会议录。
  25. J.张,x .石,j .谢,h .马,I. King 和 D.-Y. Yeung,“Gaan:在大型时空图上学习的门控注意网络”,载于《人工智能中的不确定性学报》,2018 年。
  26. 约翰逊博士(2017)。学习图形化状态转换。学习表征国际会议录(ICLR)。
  27. 史蒂夫·沃尔夫勒姆。一种新的科学,第 5 卷。沃尔夫拉姆媒体香槟,2002 年。

“绿色人工智能”会是什么样子?

原文:https://towardsdatascience.com/what-would-a-green-ai-look-like-28d91aaff3be?source=collection_archive---------16-----------------------

变更数据

未来的环保人工智能会是什么样子?

照片由切尔西Unsplash 拍摄

免责声明:此为观点篇,此处表达的观点仅归作者所有。

你可能会问,“Raveena,你所说的绿色人工智能到底是什么意思?”好吧,我想我确实在上面的斜体摘要中透露了我的意图,但这并没有给我们一个关于环境友好型人工智能可能会是什么样子的解决方案,因为我们没有人能够准确预测未来 10 年或 20 年——甚至 5 年。见鬼,就在 9 年前,第一个大规模深度神经网络诞生了,能够在图像分类方面打破纪录——想想 ImageNet 竞赛。神经网络现在可以准确地对几十种狗、动物、物体等的真实数字图像进行分类。我现在要诚实地告诉你,直到我偷看了 ImageNet 数据集中的标签,我才知道“马耳他狗”和“西藏梗”是真正的狗品种。

在过去的几年里,我们已经建立了更好的深度学习系统,不仅可以对图像进行分类,还可以处理视频——我从来没有想到过——在我看来,最令人兴奋的结果是——创建文本到图像的字幕,以及语言模型,如 GPT-2,伯特和 GPT-3,它们在生成类似人类可读的段落和句子方面产生了真正令人惊叹的结果。

但是这是我们能创造的最有效的人工智能吗——这真的是朝着“更绿色的人工智能”的进步吗?

我认为,事实上,这可能不是我们能够创造的最有效的人工智能类型,我还认为,用更复杂的架构创造更多更深层次的网络模型,并不是真正为“绿色人工智能”铺平道路首先,虽然这些模型在语言生成、字幕生成和其他任务方面可能是野兽,但它们也是能源使用的野兽。

在 Timnit Gebru 博士和她的同事最近的一篇论文中——Gebru 博士是谷歌大脑的一位杰出的黑人人工智能研究员,他因报道此事而被解雇——引用了【Emma Sturbell 博士的这篇计算语言学论文,指出训练一个“单个 大型 语言转换器模型从零开始”估计要使用只是澄清一下,“变压器模型”只是“大”深度学习语言模型的一个花哨的词。

神经架构搜索是深度学习中的另一种较新技术——但只要把它想象成计算机“搜索”神经网络中排列节点和连接的可能方式。这听起来可能很性感,但它也是一只能源兽。在同一篇论文中,Sturbell 博士和她的同事计算出,使用一种称为“神经架构搜索”的技术训练单个变压器模型所使用的电力和能源消耗相当于62.6 万吨二氧化碳排放——或者相当于同时驱动五辆特斯拉直到其寿命容量耗尽时的二氧化碳排放。

根据 Sturbell 的说法,从头开始训练一架单人 BERT model 需要的能源和碳足迹与跨大西洋商业客运航班相同。更不祥的是,Gebru 博士和她的同事写道,“大型语言模型的大规模基于互联网的训练数据已被证明具有有问题的特征,导致“模型编码了性别、种族、族裔和残疾状况方面的陈规定型和贬损联系”。最后,Sturbell 指出了训练这些大型 NLP 模型的经济成本,称“许多[NLP 模型]现在需要多个专用硬件实例,如 GPU 或 TPU,因此在财务基础上限制了对这些高度精确模型的访问。基本上,如果你没有足够的钱来租赁 GPU 的使用或购买 GPU 芯片来执行深度学习——你不能真正地用大型 NLP 模型进行创新或计算,除非他们已经过专门的预培训。

现在,你可以说,这些模型只被训练一次,然后被部署到云中,可以被其他人使用。然而,将大型深度学习模型部署到云上需要耗费大量能源,正如《福布斯》在这篇关于英伟达的文章中引用的——一个模型大约 80%的能源用于推理。谷歌、脸书和其他公司都是大公司,比你我有生之年拥有的钱和资源都多。我们真的应该相信大公司为我们所有人民主化人工智能,而他们从我们这里获取大量数据——几乎是在最少的同意下——来训练他们更新、更性感、更大的模型吗?

关于深度学习的局限性本身我要说的最后一点是:传统的深度学习神经网络模型没有处理不确定性的好方法。这里,我举个例子:

照片由 Unsplash 上的路博尖塔拍摄

在这里,我们人类的大脑可以非常自信地告诉我们,上面的照片是一个大都市的,也许是一个大城市的市区——即使照片是模糊的。但传统的卷积神经网络在图像识别方面没有内置的机制来显示自己的“网络不确定性”。

那么,我们能做什么呢?

那么该怎么办呢?我并不是以任何方式暗示深度学习不好——深度学习本身确实是一个工程奇迹——但是本身,深度学习还没有真正接近人脑在大量不同任务上的泛化灵活性。并宣称深度学习是人工智能和智能的唯一解决方案——就个人而言,这有点冒昧。

走向人工智能的灵活性

以我诚实的拙见,我们需要的是比纯粹的函数逼近更聪明的东西:我们需要理解推理和建模在大脑中是如何工作的。诚然,这就像把“烫手山芋”传递下去——必须回答可能比“如何使人工智能民主化”更难的问题以及“如何制造更绿色的 AI?”,不过还是顺其自然,娱乐一下这个问题吧。

如果你曾经参加过 SAT 考试,你可能还记得那些可怕的问题,叫做“句子推断”问题——给出一个不完整的句子,有一个空格——你必须用“最合适”的词来填充这个空格(或许多空格)。所以 SAT 考试的例子可能是这样的:

SAT 示例问题:

由于凯莉没有期待任何情人节礼物,她被桌上的玫瑰花束迷住了。

从答案选项中:1)好奇,2)惊讶,3)热恋,4)失望,5)愤怒——你会选择哪个词?你的答案会是什么?

这个问题的答案是(2),我相信这对你们所有人来说都是“显而易见”的,但是对于我们目前用于自然语言处理的人工智能系统来说,这真的那么明显吗?许多解决方案在语法上可行,可能有办法使用频繁出现的单词的统计来解决这个问题——但有效地解决这个问题——我们寻找的答案最符合句子的上下文和含义,也符合我们对 Kelly 感受的直觉。

现在,这个例子表面上似乎不涉及概率——毕竟这些都是 SAT 单词!但是想一想:如果你对 SAT 了解不多,也没有为它学习过,只是看到了这个问题,你会做出一个有根据的猜测对吗?你知道,在看到情人节与玫瑰有关的问题之前,我们也有一个关于凯利可能如何反应的先验直觉模型,给定句子中的信息,并且事实上我们没有关于凯利的意图、信仰或情绪的其他信息。这种高级、灵活、基于模型的抽象推理是人类大脑特别擅长的——而今天的人工智能系统还没有真正接近这一水平,特别是当人工智能试图模拟其他人类的行为时。

这种高级、灵活、基于模型的抽象推理是人类大脑特别擅长的——而今天的人工智能系统还没有真正达到这一水平,特别是当人工智能试图模拟其他人类的行为时。绿色&负责任的 AI 需要这个。

但在过去的 10-15 年里,认知科学家、认知心理学家和人工智能研究人员一起,在创造能够进行这种推理的机器系统方面取得了进展:最近,它被称为概率编程。我不会讲太多的细节,所以如果你想在回到本文之前学习它的基础知识,可以看看 TDS 编辑的九月版文章。

依我拙见,概率编程提供了一条通向环境友好型人工智能的途径,因为它创造了一种表达大量推理的可能性,而不需要用数千或数百万个数据点进行蛮力推理。当你看到一张汽车或摩托车的照片时,你不需要知道照片中成百上千个精确的像素位置和值:相反,你对物体的图元有一些概念。车轮、底盘、窗户、一般边缘形状、镜子、引擎罩——这些都是物体的“基本体”或积木。有了这些积木,一个人几乎可以画出一辆汽车的无限变化。事实上,研究人员和计算机图形专家丹尼尔·里奇已经使用概率编程,从几个例子和物体的基元— 积木中生成了逼真的 3D 虚拟宇宙飞船和其他物体。他在 2020 年概率编程会议的一个惊人视频中详细描述了这一过程,在视频中,他使用一个图形程序来渲染许多使用其图元的宇宙飞船变体——例如,船体、机翼、推进器。

当你看到一张汽车或摩托车的照片时,你不需要知道照片中成百上千个精确的像素位置和值:相反,你对物体的图元有一些概念。用这些简单的积木,一个人可以画出几乎无限种汽车。

概率程序可以抽象地识别组成狗的子部分,并使用生成模型和“生成的整体是生成部分的总和”的思想来创建狗的新例子。(图片鸣谢:https://en . Wikipedia . org/wiki/File:Whole _ Dog _ vs . _ Dog _ as _ Sum _ of _ its _ parts . jpg)

兜了一圈回来

说到里奇教授的计算机图形工作,我确实想回到原点,回到这个作品的开头。在里奇 2016 年的一项工作中(以及上面链接的视频中),他指出,在概率编程中执行推理——也就是说,在给定概率模型的情况下,推断隐藏的生成程序,尤其是在图形的背景下,是一项非常复杂的任务。通常的推理技术包括所谓的“随机抽样”方法——但就其本身而言,这些方法需要相当长的时间来接近一个答案。在视频演讲中,Ritchie 教授谈到了基于单一样本图像的计算机生成的字母图形表示。

使用随机抽样,推断需要大约 10 分钟——但里奇能够将概率图形程序与另一个工具结合起来,以快 10 倍的速度生成图像。你可能会问,这个工具是什么?兜了一圈回来,你瞧,这是一个神经网络。事实证明,当涉及概率编程的推理算法部分时,神经网络特别好——网络能够“指导”程序寻找优化图形程序的更快值。

结论

读者们,我希望我已经向你们展示了我对环境友好型人工智能在不久的将来会是什么样子的一些想法。当然,如果我们能够准确预测未来,时间将有点没有意义,但如果我不得不猜测一下——创造一个更绿色的人工智能将涉及深入理解大脑如何能够在许多方面执行智能,而目前的人工智能方法是缺乏的。绿色人工智能将不得不涉及对人类大脑可以进行的抽象推理类型进行硬编码,这样我们就不必在数据中心存储大量数据,并花费数十万美元从零开始训练新的语言模型或其他人工智能语言模型来模仿人类。绿色人工智能还需要内置不确定性,以应对现实世界杂乱无章、一点也不像数学逻辑陈述那样清晰的事实。至关重要的是,绿色人工智能不仅需要来自计算机科学家和数学家的输入,还需要来自认知科学、认知心理学、神经科学、文化心理学和其他许多不同领域的输入。

绿色人工智能不仅需要来自计算机科学家和数学家的输入,还需要来自认知科学、认知心理学、神经科学、文化心理学和许多其他不同领域的输入。

如果给遗传算法交易的能力会怎么样?

原文:https://towardsdatascience.com/what-would-happen-if-you-gave-genetic-algorithms-the-ability-to-trade-51d89218481e?source=collection_archive---------22-----------------------

用机器学习进行股票交易的不同方法

阿瑟尼·托古列夫在 Unsplash 上的照片

机器学习的大多数应用,或者至少是 medium 上的大部分内容,包括训练一个机器学习算法来预测股票的未来价格或未来方向。这已被证明是无效的,因为股票数据不适合时间序列预测方法。这是因为数据点之间没有相关性。这将使得神经网络学习的任何权重都只是数据中的统计噪声。

这让我想到,也许问题出在解决方案的范围上:也许基于历史数据的直接预测不会成功,因为它不是直接关联的。预测和股票交易之间的直接联系可能会产生不同的结果。我开始理论化应用这个概念的方法。

我想到的想法是一种类似于强化学习的设置:有一个由神经网络驱动的代理,它可以与环境交互。该环境将充当过去股票数据的经纪人。

为了解决时间序列回归带来的大部分问题,我使用了遗传算法。这将意味着神经网络实际上永远不会根据数据进行训练,从而排除了“落后于”实际数据或过度拟合交易数据的可能性。这是以牺牲效率为代价的,因为遗传算法即使能够收敛也需要很长时间。

我创建的程序由三部分组成:

  1. 构建代理
  2. 创造环境
  3. 构造遗传算法

在实际程序之前,这里是我在这个项目中使用的所有库:

构建代理:

代理的功能非常清楚。它应该能够与环境产生有影响力的互动,并且必须存储其适应性(即利润)。

如你所见,这很简单。除了 init 函数之外,它只有另外两个函数。这是因为代理与环境交互所需的大多数功能都包含在 keras 模型中。

clone_model 函数 3 是必要的,以便生成的每个单个代理具有不同的权重,同时保持相同的模型架构。

这是我在这个项目中使用的模型架构。这非常简单,因为这个项目只是一个概念证明。此外,使其更复杂会使计算时间成倍增加。调用 model.summary 时,可以通过查看参数的数量来控制计算时间。

这个项目的一个更好的模型可以由 1 维卷积层组成,因为它们在从数据中选择特征时会更有效。

创造环境:

环境与代理人密切相关。它应该能够处理代理的请求,并且应该能够有效地来回发送数据。它还应该能够计算代理的适合度。

然而,环境比代理更复杂,因为环境必须远离任何可能使代理易于过度拟合或落后于实际股票数据的函数。

这是环境的 init 函数。它包含所有其他函数运行所需的所有变量。开始日期和结束日期变量用于控制提取数据的时间。这可用于比较不同时间段的模型结果,以便更好地分析结果。

该设置功能可以设置和重置环境。它将所有变量初始化为它们的初始值,并访问数据。通过 get_data 函数,代理可以访问数据并使用该数据进行预测。

请注意,调整后的收盘价和成交量列被删除。邻近收盘价格对神经网络不是很有用,而且成交量值太大。这是一个问题,因为标准缩放不应用于未分割的数据,因为它会提供对未来数据点的洞察。

这两个功能是代理用来与环境交互的关键功能。close_position 函数实际上是开仓函数的一个子函数。这是因为模型的输出被直接馈入开仓函数。只有当输出映射到[0,0,1]时,才会调用 close_position 函数。

开仓函数返回一股资产的价格,而平仓函数返回平仓后的利润(或亏损)。这些值可以用来计算代理商的总利润。

构造遗传算法:

遗传算法被用作防止使用分类和回归产生的问题的另一种方法。这是因为没有所谓的过度拟合,因为数据没有标签。你可以尝试实现其他非监督算法,这可以提高程序的速度。

首先,我们将代理代码添加到遗传算法中。

这个脚本使用定义的模型架构创建定义数量的代理。

这是遗传算法的主要部分,它被改变以适应这个问题。这个脚本基本上设置了环境,并允许代理在每个时间步与模型进行交互。这个过程可以根据变量 len_episodes 运行多次。这是为了让我们更全面地了解每个代理的适用性。

将被设置为适应度的值将是模型在设定的时间步长数上的利润。

该函数根据代理的适合度选择前 20%的代理。所有其他代理都将被丢弃。尝试改变被选中的代理的百分比:在计算速度和收敛之间进行权衡。截止点越低,计算速度越快。然而,较高的截止点可能会增加收敛的机会。

此选择功能已经过修改,可用于 keras 模型。最初的交叉功能只适用于我定制的神经网络。这个函数相当复杂。要理解为什么会这样,你必须理解交叉函数是如何工作的:

从前 20%的代理中随机选择两个“父”代理。这两个代理的权重变平。找到一个随机分裂点。提取第一个父项的权重,直到该点,第二个父项的权重在该点之后连接到第一个父项的权重。

问题是权重必须被拉平。当 keras 模型中的权重创建具有不同形状的嵌套列表时,这变得很困难。因此,我结合了 list comprehension、numpy 的 flatten 函数以及我自己编写的一个单独的 unflatten 函数。

这个函数就是变异函数。对于每个代理,有 10%的几率随机权重会变成随机值。这允许遗传算法缓慢但肯定地走出局部最小值。

由于所有这些都包含在一个执行函数中,程序的这一部分运行前面定义的所有函数。它返回列表中的第一个代理。从理论上讲,这个代理将是遗传算法创造的最好的代理。每一代的损失也被返回,这样损失就可以被绘制出来,看看遗传算法是否有进展。

这个函数运行遗传算法。我最终把模型改成了卷积网络,但这真的没有太大的区别。

结果:

这个程序的计算成本如此之高,以至于我需要使用 Google Colab GPU 来运行这个脚本。我发现结果相当不一致,主要是模型太简单了。我试图增加模型的复杂性,但是计算成本太高了。

我认为最好的解决方法是改进每一个单独的部分,让它跑得更快。

感谢您阅读本文!

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

我的链接:

如果你想看更多我的内容,点击这个 链接

如果 AI 不叫 AI,世界会是什么样子?

原文:https://towardsdatascience.com/what-would-the-world-look-like-if-ai-wasnt-called-ai-bfb5ae35e68a?source=collection_archive---------21-----------------------

人工智能|观点

一个关于可能会发生什么的思想实验

Marjan Blan | @marjanblan 在 Unsplash 上的照片

人工智能领域可以有很多名字。人工智能可能是最不准确的。

当人工智能的创始人在 1956 年开会为该领域命名时,他们心中的目标是创造一台具有类似人类的智能、行为甚至知觉的机器。一种人工通用智能(AGI)。然而,当时无论是硬件、软件还是数据科学都不够成熟,无法实现这一目标。他们天真地认为 AGI 很容易到手。

如今,人工智能的承诺及其创始人的梦想和愿望在很大程度上被遗忘了。我们正在创造有效的系统,善于从数据中提取模式来进行预测。但是我们不再以建设 AGI 为目标(至少大部分研究和项目不是)。然而,这个领域仍然被称为人工智能。

这是一个朗朗上口的概念。我甚至喜欢写下“人工智能”这几个字听起来好像我们正在创造未来,就像阿西莫夫书中的科幻故事一样。如果我们现在改名会怎么样?或者,描绘一个更具历史意义的场景:如果人工智能一开始就没有这个名字,这个世界会是什么样子?

人工智能这个名字的反响

大约在 20 世纪 40 年代,神经科学和计算机科学领域的发现产生了一波新的研究兴趣,催生了几个学科。控制论,一个研究系统如何通过反馈进行自我调节的领域。人工神经网络,它在大脑神经生理学中找到了灵感。以及人工智能,研究智能代理如何感知环境并采取行动影响环境的问题。

那时候学科还没有那些名字。它们是解决共同问题的想法和方法的混合体。但是在 1956 年,约翰·麦卡锡和其他人决定从控制论中分裂出来,并创立了一个新的研究领域。麦卡锡提议用人工智能作为名字。其他想法也考虑过,但都被否决了。人工智能被证明是一个很好的选择,因为它引起了人们的注意——并囤积了资金——将控制论推向了社会科学,并使人工神经网络被遗忘了 20 多年。

人工智能,其最初的目标是创造 AGI,旨在解决智能。即使在今天,每个谈论我们正在建造的所谓智能系统的标题上都有“人工智能”的字样。人工智能领域自提出以来已经取得了很多成就,但没有什么可以被称为“人工智能”

在《华尔街日报》 的一篇文章中,微软首席技术官凯文·斯科特解释了为什么“人工智能对于我们正在做的事情来说是一个坏名字。”“人工智能”这几个字让我们想起了我们的智能。斯科特说,如果我们问一个外行人人工智能系统能做什么或不能做什么,他们会“联想到自己的智能,联想到对他们来说什么容易什么难”。“(人们)将这些期望叠加到这些软件系统上。”

麻省理工学院的经济学家德隆·阿西莫格鲁表示同意,“我认为人工智能有点用词不当。”对于不熟悉人工智能研究的人来说,人工智能这个词让他们的想象力天马行空。终结者母体。艾萨克·阿西莫夫的基础 三部曲和亚瑟·C·克拉克的 2001:太空漫游。人工智能在我们的文化中根深蒂固,这是它对大多数人的意义。

但并不是每个人都认为这个名字有那么大的影响。朱莉娅计算公司的首席执行官维尔拉·沙阿认为,我们不应该“拘泥于语义”。但是,这仅仅是一个语义问题吗?如果人工智能像希尔伯特·西蒙提议的那样被称为“复杂信息处理”,它会在早期受到关注吗

语义问题?—语言的力量

约翰·麦卡锡为什么选择“人工智能”这个名字在他的著作 为 AI 研究 辩护中,他给出了一个出人意料的理由:

T21 发明“人工智能”这个术语的原因之一是为了逃避与“控制论”的联系。“它对模拟反馈的专注似乎被误导了,我希望避免要么接受诺伯特·维纳为大师,要么与他争论。”

最初,人们在控制论的更大领域内结合早期的人工神经网络来研究人工智能。但是麦卡锡似乎不喜欢维纳,他是主要的控制论专家之一。他没有选择准确描述他们想要做的工作的名字。他选择人工智能来区分和拉近与另一个领域和从事该领域工作的人的距离。

他成功了。艾获得了声望和足够的资金来资助几年的研究。这个名字对事件发展的影响程度是不可测量的。但我怀疑这是它吸引人的主要原因之一。

现在,让我告诉你两个关于名字重要性的故事。

语言影响现实——没有蓝色的痕迹

我们如何给事物命名极大地影响了我们如何感知这些事物,进而影响我们周围的世界。现实影响语言。我们谈论和思考我们周围的物体和发生在我们身上的事情。我们的现实定义了我们使用语言的目的。但是语言也会影响现实。以一种比你想象的更基本的方式。

英国前首相威廉·e·格拉德斯通是第一个注意到古希腊人感知颜色的奇怪之处的人。在对荷马的《T2》、《伊利亚特》和《奥德赛》的研究中,他意识到对荷马来说,天空不是蓝色的,大海是“葡萄酒色的”语言学家 Guy Deutscher 研究了 Gladstone 的文章,找到了一个解释:这并不是说希腊人缺乏进化的视觉系统。他们根本没有一个词来形容蓝色。

但是,这是一个语义问题吗,就像 Shah 为人工智能辩护的那样,还是语言影响了古希腊人的感知?

有一种感知现象叫做分类感知。它解释了为什么尽管颜色是连续变化的(光的波长),我们只能感知颜色的种类(蓝、红、黄、绿……)。因为希腊人没有蓝色一词,相应的波长属于最接近的类别,如黑色或绿色。我们擅长区分类别,但不擅长区分类别内部。

希腊人有和我们一样的视觉系统,但是颜色感知能力更差。语言是原因。

语言影响行为——印度还是三角洲?

但是让我们举一个最近的例子。再来说说 covid。

美国(以及整个世界)正遭受冠状病毒病例的新一轮上升。臭名昭著的 delta 变体似乎是这一浪潮背后的原因——在反 vaxxers 和有利于取消限制的政策的帮助下。但是德尔塔变体并不总是被命名为德尔塔,它被称为印度变体。世卫组织决定将 covid 突变的名称从起源国改为希腊字母。

目的是停止对这些国家的人的污名化。当川普称新冠肺炎为“中国病毒”时,美国针对中国人的种族主义行为急剧增加。

特朗普用一个词代替另一个词让中国人的生活变成了一场噩梦。语言改变了人们的行为。

我们如何使用名字会影响现实和行为。具体来说,名字对我们如何看待陌生的概念有更大的影响。叫一个地方坐椅子,凳子,或者沙发都不会改变什么。我们熟悉它,知道它的功能。然而,如果我谈论加密货币、量子计算或人工智能,这些名字很重要。这些名字隐藏在巨大的多层含义中,而这些含义并没有反映在单词中。

不知道人工智能是什么的人会试图从它的名字来推断它的意思。一个复杂的新学科的名字肯定会影响它的命运。

一个“复杂信息处理”战胜“人工智能”的世界

1956 年,人工智能的创始人之一希尔伯特·西蒙为这个领域提出了一个不同的名字。他认为这应该被称为“复杂信息处理”名字不能再难听了。但是,更能代表 AI 人的所作所为。他不喜欢“人工智能”这个术语,并在此后的几年里以他提议的名字展示他的工作。

如果希尔伯特·西蒙侥幸逃脱,人工智能被称为复杂信息处理(CIP ),会发生什么?让我们想象一下会有什么不同。

CIP 不会连接到人类智能

让人工智能发挥作用的一个(如果不是主要的)动机是解决智能问题的承诺,进而解决人类智能问题。它所开启的可能性简直不可想象。CIP 不是一个承诺的名字。它没有说“未来会从我这里经过。”它肯定没有承诺任何关于我们人类的事情。

我们不会把信息处理和人类的智力联系起来。即使大脑进行信息处理,我们也从未这样称呼它,所以它不会引起我们任何接近人工智能的兴趣。人工智能概念不断提醒我们我们的生物学。AI 中的很多概念都是以我们都知道的——甚至是直觉上知道的——神经科学概念命名的:神经网络,计算机视觉,深度学习自然语言处理,注意力机制,长短时记忆 (LSTM)。同样重要的是,我们经常将 AI 系统称为“理解”数据或具有“思考”过程。

CIP 没那么浮夸,但更真实。

CIP 不是一个吸引人的名字

复杂信息处理是一个很无聊的名字。这听起来很行政化。人工智能很吸引人。因为人工智能听起来很好,它很早就获得了兴趣和资金。CIP 可能从一开始就没有得到所有的资金(当然,实际的项目很重要,但如果认为这是唯一有意义的事情,那就太天真了)。象征性的人工智能将永远不会存在,也许人工智能的冬天和夏天也不会发生。

CIP 不会引起业外人士的注意。投资者、政治家、记者,甚至外行人,都不会那么关心像 CIP 这样听起来很无聊的领域。它不会像 AI 那样成为头条新闻。即使所做的工作是相同的,听起来也不会造成干扰。

CIP 是一个诚实的名字

CIP 更接近地代表了人们在该领域中所做的事情。人工智能不是具有潜在危险的机器人、全能的虚拟思维或超人机器。AI 复杂的信息处理。如果我们从人工智能中去除炒作和关注的虚幻层,只有这样我们才能找到真正的科学。在 CIP 中,我们不会经常用不可行的承诺来装饰我们的工作。

然而,我们不能排除这样一个事实,即如果这个领域被称为“复杂信息处理”,它可能没有它所拥有的资金,因此即使我们已经取得的成就也不会被完成。将字段命名为 CIP 而不是 AI 是吸引力和诚实性之间的权衡。CIP 可能描绘了该领域内部的真实视图,但可能不会吸引那么多的资金、兴趣和人力资源。

如果我们不做出承诺,而是诚实地对待我们正在做的工作,我们可能没有足够的钱来做这项工作。如果我们“保证”AGI 在未来的 20-30 年,那么我们可能会获得大量资金,最终取得更多成就,即使这个承诺被打破。

然而,这种方法是最初产生人工智能冬天的原因。大承诺吸引大资金→大承诺太大→大资金退出→没钱做最简单的工作→领域停滞不前。

找到吸引力和诚实之间的平衡是不让我们依赖的人失望的关键。

炒作声明将不会如此平常——或可信

如果一个物理学家声称:“我们将能够在 20-30 年内创造一颗恒星”,没有人会相信。那么,当某个人工智能大师声称我们将在几十年内建成 AGI 时,我们为什么还要继续听下去呢?马文·明斯基在 1967 年说,“在一代人的时间内……创造‘人工智能’的问题将会得到实质性的解决。”当时没有发生。现在还没有发生。而且这似乎不会很快发生。

人们一直声称这个领域的终极目标就在几十年后。象征性人工智能取得了一些适度的成功。那么 AGI 一定就在附近。机器学习系统学会了识别单词和对物体进行分类。那么 AGI 一定就在附近。深度学习系统生成了人类水平的文本和梦幻般的图片,揭示了蛋白质折叠的机制,并且(几乎)可以驾驶汽车。那么 AGI 一定就在附近。

AGI 不在拐角处。如果一个复杂的信息处理系统是世界上最好的棋手,而不是人工智能,我们会看得更清楚。因为这个名字包含了“智能”,看起来我们正在朝着最初的目标努力,但事实不再是这样了。我们正在建立狭窄的信息处理系统。如果一个在 CIP 工作的研究员声称 AGI 就在眼前,人们会笑:你为什么还要提到智力,伙计?

最后的想法

如果约翰·麦卡锡没有创造人工智能这个术语,我们无法知道这个世界会是什么样子。这篇文章纯属猜测。然而,这个思想实验是有价值的,它让我们反思一些我们认为理所当然的事情。“可能”如何影响我们看待和理解“它是什么”的方式?

我最初被人工智能吸引是因为“人工智能”这个词听起来非常未来,非常科幻。艾似乎保守着未来的秘密。不仅仅是我,AI 有意识地努力占据我们集体想象中的空间。它改变和适应,以包含那些仍然遥不可及的思维技术方面。当被认为是人工智能的东西开始被很好地理解时,我们就不再称它为人工智能了。它不再是人工智能,而开始“仅仅”是花哨的数学和统计学。人工智能在我们的技术和社会优先等级中拥有令人羡慕的地位,同时,它欺骗我们认为它是我们正在寻找的绿洲。

一个研究领域向前发展,只包括似乎超出我们能力的东西,这有意义吗?这让我想起了阿瑟·c·克拉克的一句话:“任何足够先进的技术都和魔法没什么区别。”我们希望人工智能成为我们只能梦想的先进技术。但是如果我们把 AI 当成魔术,看到帽子里的兔子,我们会失望的。

订阅我的免费每周简讯明日之心获取更多关于人工智能的内容、新闻、见解和思考!

此外,请随时在 LinkedInTwitter 上发表评论和联系!😃

</5-must-know-ai-concepts-in-2021-75d8c1ff938>

你能从一个额外的实验中学到什么

原文:https://towardsdatascience.com/what-you-can-learn-from-one-extra-experiment-c14e3b0d2232?source=collection_archive---------25-----------------------

行业笔记

如果你只是在做 A/B 测试,或者按照改变一件事(成本)的方法去实验,你可能会错过有用的知识。显示了对您的过程提供更多洞察的备选方案,并讨论了获得这种洞察的成本。

总结

至少在 100 年前的,成本(改变一件事情)的实验方法在已经被证明是一种无效的实验方法。然而它依然存在。为什么?A/B 测试方法是成本的一种变体,但缺点较少,尽管在获取所有需要学习的内容方面仍然效率低下。让我们通过介绍常用术语来深入了解原因。如果实验设计对你来说是一个熟悉的话题,请跳到第 3 部分。

实验可以应用在你想象的任何地方,所以下面的例子来自烘焙、学习一门新语言、科学、机器学习和网站优化。但是不要让这些例子限制了你。

1.一些常用语言/术语

以下将解释的概念说明[ 自己的工作 ]

  • 因素 :你在实验中正在改变的一件事:比如字体大小,系统的温度,发酵粉的量,一种配料的供应商,或者你给一个网站做背景的颜色。在上图的横轴上,比如温度, T
  • 数值因子 允许排名和量化,如:调音台上的速度等级 1、2、3;要学习的新单词数量;pH;图像的宽度;ML 模型中的调整参数。
  • 分类因素 代表一种选择,虽然有时可以对其进行排序,但简单地将其视为一种选择可能更容易。例如:使用供应商 R 或供应商 Q 进行塑料包装;使用搅拌桨和面团钩制作面包;使用带衬线的字体 T 或不带衬线的字体 A;使用文本 D、E 或 F(每种文本以不同的语气书写)作为您的行动号召;用古典音乐 C 或流行音乐 P 学习词汇列表;使用稳健回归或常规回归建立模型。分类因素也可以以任何顺序显示在上面的横轴上。
  • 等级 :您为因子选择的值。字体大小 22 是数值因子的级别,您可以使用大小 18 作为同一因子的不同级别。使用 ArialTimes New Roman 是分类因子的两个可能级别。上图显示了两个水平:21℃和 27℃。
  • 响应 (s):你在一个实验完成后测量的东西,而且几乎总是可以量化的。例如:50 天内每个客户的利润;你能正确回忆起的随机词汇的分数;你的 ML 模型的分类精度。大多数实验系统测量多个响应。在上图中,有一个(看不见的)垂直轴显示了两个响应:€320 利润/天和€390 利润/天。
  • 优化目标 :知道你想往哪个方向移动响应 in:是向上,还是向下?有时我们希望保持不变,同时调查因素水平的敏感性。
  • 最后,一个 实验 :至少一次独立运行,在特定的因素组合下,你可以从中测量反应。不严格地说,当需要多次运行时,我也会认为是“一次实验”,然后我们使用平均响应。严格地说,这些多次运行是在相同条件组合下的重复。只要你知道系统中的典型噪声是什么,这种区别不会改变下面的大部分解释。在图示中,我们预计 5 个单位的响应值大致相同。您可以使用噪声的范围或标准偏差,只要工作一致即可。

2.为什么改变一件事情(成本)似乎是正确的事情

当建议同时改变两个或更多因素时,我最常得到的直接反应是,这违背了科学方法:“我怎么知道哪个因素导致了反应的变化?”人们从学校开始就被教导,单一因素的变化是确认因果关系的唯一方法。

即使在学术环境之外,成本法也在我们的日常生活中被反复验证。考虑让一个软件包正常工作。你改变了设置 D,不幸的是,它仍然不像你想要的那样工作。将 D 变回原来的位置,并尝试改变设置 E;还是什么都没有,把 E 变回原来的样子;最后,改变设置 F 使软件工作。

这并没有错,而且这篇文章也没有宣称成本是错的。单因素实验包含在深思熟虑的实验设计中。

让我们看看如何,通过例子。

3.我们能从一个额外的实验中学到什么?

这是出自一个实际的例子, 而不是 做作地提出一个观点;只是场景变了。我们正在烘烤。我们有一个因子 B =黄油的克数,一个因子 F =面粉的种类。响应是烤箱烘焙产品达到特定棕色的时间(分钟)。所有其他条件尽可能保持相似。

在基线时,用 B = 200g 克黄油和用 F =全麦(w-w)面粉,我们重复实验两次,反应时间分别为 16 分钟和 14 分钟(用相应的能量消耗)。我们这样来说明:

第一个实验,重复两次,结果为 15 分钟[ 自己的作品

然后我们用 240 克黄油(B=+1)做实验,保持全麦面粉的面粉因子不变;所以只改变了一个因素;即因素 b。现在的平均响应是 16 分钟(两次重复,都是 16 分钟)。

添加接下来的两个实验。更改黄油系数 B 的结果显示在右侧[自己的工作

因此,从科学的角度来看,我们可以得出结论:额外的黄油并没有真正改变反应;在噪音范围内。现在试试面粉因素。回到基线,但从全麦转换到普通面粉。仅改变这个因素会将响应增加到 20 分钟烘烤时间。

因此,从这 3 个数据点中,我们了解到:

  • 我们可以用更少的黄油(200 克),用更少的能源获得大致相同的褐变;
  • 与全麦面粉相比,普通面粉的烘焙时间要长 5 分钟,才能达到同样的褐变效果。因此,除非普通面粉节省的成本超过额外 5 分钟烤箱时间的能量消耗,否则坚持全麦面粉。

改变面粉因子 F 的结果显示在右边[ 自己的工作 ]

许多实验者在这 3 次运行后就停止了。

让我们再增加一个实验:相对于基线点,使用额外的黄油 同时切换到普通面粉。我们获得 25 分钟的烘烤时间。让我们解释一下我们可以获得哪些额外的知识(在帮助我们的图表中有所说明):

所有 4 个场景的结果,右边是完整的互动图[ 自己的作品

  • 我们认为黄油的数量对烘烤时间没有影响,但这只适用于全麦面粉,而不适用于普通面粉!对于普通面粉,额外的黄油 会显著增加 的烘焙时间。另一种说法:“黄油的效果,取决于面粉种类”。
  • 与上面的说法对称:“改变面粉种类的效果取决于黄油的用量”。图中的分歧线反映了引号中的这两种说法。
  • 以上两个要点说明了系统中存在交互。相互作用是对称的。数学上,设 x B 为黄油效果,编码为xB =-1(200g)xB =+1(240g);全麦面粉的 x F=-1,普通面粉的 x F=+1。然后我们可以从下式预测烘烤时间 y :

  • 最后一项是相互作用项,由于它是非零和重要的,我们知道相互作用图中的线不是平行的。如果最后一项因为为零而消失,那么相互作用图有平行线,第四个实验没有增加多少新知识(除了证实我们已经知道的)。
  • 除了了解交互作用,我们还看到了下一步实验的地方,以进一步减少烘焙时间:尝试使用更少的黄油,绝对坚持全麦面粉。然而,这是有限度的,因为如果我们走得太远,我们可能会开始改变系统中的其他结果。但这正是设计实验存在的目的。以系统的方式发现这些权衡。

交互作用是非常正常的,并且几乎可以从任何析因实验中学习到。我很少做交互作用项为零的实验。

这里有一个日常互动的例子:用冷水或温水洗手——这是一个因素。用或不用肥皂洗手——这是第二个因素。但是用温水和肥皂洗手:现在有了很强的相互作用,因为肥皂改变了温水的效果,而温水改变了使用肥皂的效果。你又看到了对称。

这种 学来的资料 极有价值。互动可以增强你的反应,就像肥皂水的例子,或者有时它们会对你不利,就像上面的例子,抵消了单个因素的改善。

4.将此扩展到多个因素

上述方法是 设计实验 的核心,被称为析因设计。它可以扩展到多个因素,并在多个级别处理这些因素。它是组合的:如果每个因素有 2 个水平,那么你需要 2ⁿ实验,对于 n 个因素。但是也有替代的设计方法,仍然保持析因实验的理想特性,同时需要的实验比 2ⁿ实验少得多。

这些部分因子实验真正伟大的地方在于它有一种内在的可折叠性。如果一个因素被证明是不重要的,你仍然可以从其他因素中恢复知识。也有一定程度的冗余,这样如果其中一个组合出了问题,你的其他实验至少包含一些信息来恢复大部分学习。

要了解这些优势以及更多,您可以参加一个关于实验设计的免费课程 【注意:我没有从这个课程中获得任何东西——它是完全免费的审计】。

5.A/B 测试如何成为成本法的一种变体

那么如果只使用 A/B 测试,你会错过什么呢?

A/B 测试是一种形式的实验,其中有一组基本情况参数(B,之前的基线)和另一组与之比较的参数(A,之后的,或替代方案)。这两个场景之间的反应进行比较,并作出选择坚持更好的场景:A 或 B。通常需要在 B 和 A 场景大量运行,以克服系统中的多样性:特别是网站优化,你不能总是控制使用你的网站的观众。[在实验室实验中,这些干扰(如他们所称的)是可以控制的,因此需要较少的重复运行。]再者,你所谓的 A 和 B 是可以互换的,保持一致就好。

如果您要运行 A/B 测试,在两个级别测试网页上的字体大小、字体类型和文本位置,您可以按如下方式进行可视化:

A/B 实验:基线与备选方案[ 自己的工作

在传统的 A/B 测试中,不检查立方体的其他 6 种组合:只检查标记为 A 和 B 的 2 种情况。偶尔会添加沿粗线的单因素实验。出于方便起见,省略了其他 6 种组合,因为查看可靠差异(功效分析)的测试数量可能相当高,并且获取所有组合的数据可能需要非常长的时间。

继续上面的例子,在 A/B 测试之后,我们不能确定 3 个因素中哪一个影响最大,也不能确定是否有交互作用,也不能真正了解我们的系统,除了知道 A 和 B 哪个更好。我们没有通过等高线图获得方向性的感觉,也不清楚下一组实验应该在哪里。我们要用更大的字体吗?我们是否将文本在页面上向右移动了更多?我们对哪个因素最敏感?

当我读到 A/B 测试失败的报告时,我想知道还有哪些因素的组合会成功。也许是系统中的交互作用抵消了个体因素的收益?

相反,对于成功的测试,替代场景更好仅仅是运气/良好的直觉吗?在其他组合中还能学到多少?

当然,没有免费的午餐:这些额外的学习是以额外的测试和更长的运行时间为代价的,以获取其他组合的数据。

6.顺序实验

为什么这些都很重要?实验本质上是连续的。你从一系列实验中学习,修改系统并继续前进,添加或删除因子,和/或改变它们的水平。你几乎不会在最佳的第一时间着陆。此处的插图显示了价格和吞吐量这两个因素的变化,从蓝色组开始,然后是绿色组(两者都是经典的析因设计),最后是橙色组的实验(显示了带有轴点的响应面优化设计,即星形)。每组都朝着最佳响应移动。

一系列 3 组实验,显示接近最佳值[自己的工作]。

了解系统中的相互作用和非线性是至关重要的。当你接近一个最佳值时,你必须保持水平,然后梯度改变符号。这意味着,最初的轮廓线可能是平行的,远离最佳值,但当你接近最佳值时,你会看到曲率和非线性。以下是烘焙示例的轮廓:

烘焙示例的等高线图,使用 x 轴和 y 轴上的编码变量[ own work

烘焙例子的所有上述学习可以在这个等高线图中看到,包括在哪里计划下一轮实验的感觉。

你可以在这本 (免费)教材章节 中了解更多关于设计性实验的一般方法。

7.摘要

  • 实验往往需要很长时间,每个数据点都是有价值的。因此,为了从有限的实验预算中获取尽可能多的知识,使用结构化的方法进行适当的规划是必不可少的。
  • 使用关于你的系统的理论,或先前的知识,来告知包括哪些因素,同样,部分因子,或类似结构的设计,可以用来筛选有影响的变量。
  • 在一系列实验完成后,用新的发现来补充你现有的知识。不要直接跳到新的、性能更好的场景:试着理解为什么会观察到变化,并从现有的交互和非线性中学习。
  • 最后,并不是所有的实验都会导致最优化。通常,了解哪些因素有影响,以及影响的程度,是我们所需要的。但是要确保你使用结构化的方法,这允许你建立在先前的工作之上,并且如果必要的话,在后面进行优化步骤。

你在学校学不到的数据

原文:https://towardsdatascience.com/what-you-dont-learn-about-data-in-school-2bf872ceda47?source=collection_archive---------38-----------------------

如何用不完美的数据得到有用的结果

照片由来自佩克斯布拉德利·胡克拍摄

有许多资源可供数据科学家和数据分析师学习机器学习、SQL、Python、数据可视化等等。这些对开始数据分析职业生涯的人和试图提高技能的人非常有帮助。然而,学校并没有为你准备好我所说的“数据现实”。你通过完美完整的数据进行学习,但你在现实世界中得到的是肮脏的,有时是不完整的数据。运用完美数据调整所学并将其应用于“数据现实”的能力将使你成功——以下是几个例子。

显示方向结果

我曾经被要求帮助市场部建立一个 A/B 测试,以评估他们的电子邮件系列的有效性,该系列旨在将用户转化为试用用户并成为付费用户。我被拉去做其他项目,我们不得不等到雇佣了营销数据分析师之后,才能对 A/B 测试进行评估。这是当我们发现测试已经运行了 6 个月还没有正确设置的时候。控制组和测试组的比例并不像我们最初打算的那样是 50/50。

如果这是一个关于 A/B 测试的类,你将会收到完美的测试数据,有适当的 50/50 分割,足够的样本大小的用户,并继续评估统计显著性。实际的电子邮件测试并没有满足所有这些参数。我们不能告诉市场部我们必须重新进行测试,再等 6 个月。我们如何挽救这个数据不完善的测试?

由于数据不符合适当的 A/B 检验标准,统计显著性被排除了。队列分析是我们能想出的挽救结果的唯一方法。用户被分为控制组和测试组,然后根据点击或打开电子邮件的用户与没有点击或打开电子邮件的用户进行细分,以显示产品参与度、试用启动率以及向付费会员的转化。

在利益相关者的陈述中,结果被认为只是方向性的,不符合统计学意义的标准。营销部门很高兴,因为与对照组相比,测试组表现出了更高的参与度和试用启动率,尽管这并不显著。现实是利益相关者需要向他们的老板报告结果,只要他们是积极的,即使没有统计学意义,这也比显示消极的结果要好。

你可能会想,如果测试组的参与度低于控制组,我们会如何处理这些结果。然后,我们可能会尝试分析系列中的每封电子邮件,以确定测试组中与控制组相比参与度较低的邮件,或者试用开始率较低的邮件。A/B 测试出错的可能性无穷无尽,适应显示方向洞察力是挽救结果的一种方法。

Takeway: 在缺乏完美数据的情况下,对你的用户进行细分,找到有方向性的见解。利益相关者不需要完美。有时候,在更好的数据出现之前,正确方向的指导就足够了。

针对数据差距进行调整

营销归因在现实中比你在学校里学到的更难实现。问题是,公司很少或根本没有追踪将销售和转化归因于特定的营销接触点。虽然我知道这些问题,但当我被要求将营销努力归因于收入时,我不能很好地说这是不可能的。我如何利用部分跟踪数据将收入归因于营销努力?

首先,我确定了所有推动收入的营销活动,如引导用户开始试用的付费营销广告,以及旨在将当前试用用户转化为付费会员的试用电子邮件系列。然后,我将个人转换率和总转换率结合起来,应用于我拥有用户级别和活动级别信息的活动,以估算收入。结果并不完美,但在归因追踪得到改善之前,对于第一轮测试来说已经足够好了。

要点:用汇总信息或外部来源填补数据缺口,直到更好的数据出现。结果不会尽善尽美,但有方向性的见解是良好的第一步。

最后的想法

无论你上了多少课,当你遇到现实生活中的情况时,都不会是一样的。成功的关键是能够把你学到的东西应用到可用的数据中。虽然我没有涵盖每一个不完美的数据场景,但我希望这能让您在如何处理您的“数据现实”方面有一个良好的开端。

你可能也会喜欢…

https://medium.com/swlh/how-i-used-a-machine-learning-model-to-generate-actionable-insights-3aa1dfe2ddfd

关于 VLOOKUP 你可能不知道的是

原文:https://towardsdatascience.com/what-you-might-not-know-about-vlookup-657103e1ca77?source=collection_archive---------47-----------------------

以及为什么你应该开始使用熊猫

照片由 Marten NewhallUnsplash 拍摄

VLOOKUP 是一个基本的 Excel 函数,任何需要匹配两个表中数据的人都可能使用它。也许更令人惊讶的是,一些网站展示了如何在简历中包含 vlookup 功能的简历样本。虽然有许多文章讲述了如何使用这个函数,但是有些文章可能不完整、过时或者缺乏深度。本文旨在强调 vlookup 函数中通常被忽视的局限性,然后展示一些创新的技巧来克服这些局限性。

Vlookup 是 Excel 中的内置函数,它允许用户在给定数组的最左侧列中找到特定值的第一个匹配项,然后返回与特定列对应的同一行中的值。

vlookup 的一个小例子。图片由作者提供。

对于大多数目的来说,它是非常有用的。然而,在特定的情况下,在 vlookup 能够被有效地使用之前,需要相当多的人工工作来形成数据。

帮助器/重复列

如果交换了Fruit & Qty列,则不能直接执行 vlookup。常见的解决方法是使用公式复制列。(可以将包含键的列复制到左侧或将包含值的列移动到右侧。)

复制列。图片由作者提供。

图片由作者提供。

(例如,当数组最左边的一列有重复值时,或者当需要将两列数据连接在一起以形成查找关键字时)

这对于简单的表来说非常好,但是当表变得有些复杂时,就会出现许多这样的重复列。通常,所有的键列都在左边结束。这是不可持续的。

多条件虚拟查询

一位德高望重的 Excel 大师在博客上讲述了如何使用数组公式和choose()函数创建一个 vlookup,它可以看起来“靠左”而不需要添加辅助列。请注意,您将需要按下Ctrl + Shift + Enter,而不是只按下Enter来获取数组公式。如果不这样做,可能会产生一些意想不到的结果。

多条件 vlookup。图片由作者提供。

这种方法也可以用于执行多条件 vlookup。

图片由作者提供。

我们可以通过高亮显示整个表达式并按下F9来评估choose表达式。注意,它计算出一个有 5 行的数组,其中Fruit & Column的连接是每行的第一个条目,Qty是第二个条目:

图片由作者提供。

有些文章可能会建议将表格转换成网格,将Fruit作为列,将Color作为行,将交集作为值,然后使用 INDEX()和 MATCH()。这对于两个标准来说没问题,任何超过 2 的标准都很难实现。这种转换也可能是手动完成的。INDEX() & MATCH()对读者来说并不友好,过一段时间后很难调试。总之,我不推荐;多条件 vlookup 的可扩展性更强。

XLOOKUP

如果你或你的公司订阅了微软 365,最干净的方法就是使用 XLOOKUP。

图片由作者提供。

我们可以突出显示$I$4:$I$8&$H$4:$H$8并按下F9来评估表达式,并观察它将值成对连接起来。

图片由作者提供。

处理重复

vlookup 的另一个缺点是它只能返回一个值,因此如果键列包含重复项,返回值将对应于匹配的第一行。如果第二个值是预期的值,这可能是危险的,因为错误将被无提示地传递。因此,在执行 vlookup 之前,应该始终检查 key 列是否包含重复项。在下面的示例中,在Fruit列下有 2 行的值为Apple。Vlookup 只返回Qty列下的第一个值。

图片由作者提供。

执行左合并将返回底部表格,参考下图。并且所产生的附加行将提供在FruitQty表中存在重复的指示。

图片由作者提供。

结论

  1. 检查键列中的重复值
  2. 考虑使用 helper 列是否更具可伸缩性,否则使用多条件 vlookup 或 xlookup
  3. vlookup 不等同于 merge

事后思考

这篇文章的目的是让人们意识到 vlookup 的局限性,并分享使用 vlookup 的创新方法——这些方法更具可扩展性、可读性和可维护性。

只是在我花了一些时间用 python 编写脚本之后,我才学会了“可读性很重要”,这让我更加清楚我在 Excel 中编写公式的方式。有些人(嗯,我就是其中之一)以在 Excel 中编写冗长的嵌套 if-else 语句为荣。(天哪!修改它们是如此困难/痛苦/令人困惑,尤其是如果你有一段时间没有看它们的话。)希望这能启发读者思考如何更好地准备电子表格,以便于阅读、维护和调试。

如果你喜欢这个故事,也可以看看以下内容:

量子机器学习入门需要什么

原文:https://towardsdatascience.com/what-you-need-to-get-started-with-quantum-machine-learning-5c7334d480c6?source=collection_archive---------3-----------------------

即使你不是数学家或物理学家

量子机器学习入门需要的一件事不是物理学学位。能够简单解释的是老师!

这就是用 Python 动手学习量子机器的目的。

量子机器学习是利用量子计算来解决机器学习问题。这听起来确实有点像火箭科学。真的是!

火箭科学是一个广泛使用的短语,指智力上困难的东西。超出了普通克里特斯人的能力。

作者弗兰克·齐克特的图片,灵感来自《辛普森一家》

但是你偶然发现这篇文章的唯一事实让我有把握地认为你具备进入这个领域的智力先决条件。一些智能算法已经评估了你感兴趣的主题,并得出了这篇文章可能适合的结论。但也是你自己选择的。如果你没有考虑过学习量子计算、机器学习或量子机器学习,你就不会决定看这篇文章。如果你不够聪明就不会做的事。

我们生活在这样一个时代,知识和教育不再局限于一小撮特权人士。你可以从网上抓取量子机器学习的最新研究。Arxiv 上有大量的科学文章。有很多关于机器学习的书,也有一些关于量子计算的书。而且,有无数的博客帖子。

问题是关于量子计算的文献充满了物理术语和数学公式。很快,你可能会觉得这个话题仅限于拥有博士学位的数学家和物理学家。

让我们以这段引文为例:

VQE 可以帮助我们估计一个给定的量子力学系统的基态能量。这是给定哈密顿量的最低特征值的上界。它建立在被描述为: ⟨ψλ|H|ψλ⟩ > =E0 的变分原理上

如果你没有物理学学位,第一个自然的反应是把文章收起来。

“嗯,不错的尝试。可能整个题目都不适合我,你想。“也许,量子机器学习是我力所不及的”。

不要那么快放弃。量子计算中的大部分东西都是由物理学家和数学家发现的。当然,当他们分享他们的见解和教导他们的学生时,他们建立在他们的同龄人的知识之上。他们使用自己熟悉的术语是合理的。

你也不会用酒保的词汇来解释编程和机器学习吧?

当我们谈论或写一些东西时,假设某种知识是合理的。但是,我们应该阻止附近其他学科的学生学习这些东西吗?为什么我们不应该支持一个计算机科学家或者一个软件工程师学习量子计算?

我有明确的看法。我相信任何一个真心对量子机器学习感兴趣的人,应该都能学会。应该有满足学生需求的资源,而不是为了方便老师。当然,这需要老师能够用简单的语言解释复杂的东西。

作者弗兰克·齐克特的图片

“如果你不能简单地解释它,你就不够了解它。” —阿尔伯特·爱因斯坦

我不相信任何人(包括我)真的理解一台经典计算机是如何工作的。然而,我们都在使用它们。我们甚至给它们编程!我学会了如何编写经典计算机的代码,因为我的老师用我能够理解的方式向我解释了它。

我的高中老师用应用的方式解释了数据类型和算法的概念。他教我它们是如何工作的,以及它们有什么用处。尽管——或者可能是因为——我们没有经历电子机械电路和信息理论,我还是能够学习编程。

结论

当然,理解量子力学的基本理论是可取的。当然,能够做数学是可取的。但是,更重要的是,你需要明白如何解决某个问题。

本质上,在量子计算中,我们使用量子叠加、纠缠和干涉来解决任务。这些是惊人的,也许是违反直觉的现象。但是不管它们看起来有多怪异,量子力学系统都遵循一定的物理定律。这些定律使得系统以特定的方式运行。

学习这些规律并不比学习一门新的编程语言更难——当放在正确的环境中并从概念上解释时。

我真的相信至少有一些编程经验的开发者、程序员和学生能够精通量子机器学习。

量子机器学习入门需要的不是物理或数学学位。这是一个老师能够简单地解释它!

我不敢说我对量子机器学习的理解足以用调酒师使用的词汇来解释它。但是我会试着向计算机科学家和软件工程师解释一下。我看不出有什么理由把这个领域局限于数学家和物理学家。

在我的帖子“量子编程—针对非数学家”中,我展示了如何用 Qiskit—IBM 的量子 SDK 计算两个概率的联合概率。你不需要知道所有的理论来遵循它。在《T2》中,你是否纠结于量子叠加?”,我给大家动手介绍一下量子计算。

这两个帖子只是 用 Python 动手量子机器学习的一个小摘录。

无论你是刚刚开始学习量子计算和机器学习,还是已经是一名高级机器学习工程师, 使用 Python 进行量子机器学习是你开始学习量子机器学习的全面指南——将量子计算用于机器学习算法的计算。

关于 2021 年的朱莉娅,你需要知道什么

原文:https://towardsdatascience.com/what-you-need-to-know-about-julia-in-2021-22875f34465b?source=collection_archive---------14-----------------------

2021 年数据科学家需要了解的关于 Julia 的一切概述。

Patrick Amoy 在 Unsplash 上拍摄的照片

介绍

在最近几年,数据科学和机器学习行业的人气爆炸式增长。这已经让位于新的和旧的编程语言,随后流行程度有升有降。例如,SAS 在数据科学中的应用就不那么普遍,不如 Python 及其机器学习能力令人兴奋。由于 Python 的生态系统、高级语法和通用性质,python 在数据科学中的使用在过去几年中广受欢迎。

然而,在数据科学的世界里,出现了一个新成员。如果您从事数据科学领域的工作,那么您可能已经听说过来自麻省理工学院的新开源语言 Julia。由于 Julia 最近越来越受欢迎,许多科学家一直在质疑他们是否应该学习 Julia,以及行业在最流行的编程语言方面将走向何方。

大约三年前,我写了一篇文章,详细介绍了我认为程序员在使用 Julia 进行机器学习之前应该知道的一些最重要的事情。如果你想读这篇文章,你可以在这里:

今天,我想为 2021 年的一般数据科学实践更新这一概念。自从那篇文章发表以来,发生了很多变化,主要是朱莉娅在过去两年中人气飙升。今年,在开始学习这门语言之前,肯定有一些新的东西需要学习和了解。今天,我试图回答关于 Julia 的现代问题,提供你需要知道的关于 Julia 目前状态的一切,以及我对未来语言的主观期望。

Python 不会去任何地方

每当工作安全感受到威胁时,人们很容易变得恐慌。如果 Julia 在机器学习方面变得更受欢迎,Python 会被完全抛弃吗?我们都必须从头开始学习如何用完全不同的编程语言编程和使用库吗?这个问题的简短答案是否定的。

这种产业转移需要很长时间才能完成,尤其是在任何涉及软件工程的学科中。随着时间的推移,我们完全有可能看到 Julia 在机器学习和其他数据科学应用方面的受欢迎程度超过 Python。然而,重要的是要记住在 Python 和它各自的生态系统上投入了多少钱。所有的行业标准工具仍然迎合 Python,作为一个例子,TensorFlow 已经被 Google 投入了大量资金,以便在这种情况下尽可能地变得更好。

正如我们在 R 中所看到的,一个新的解决方案工作得更好还是更差并不重要,任何技术都可能在适当的时间内在某些环境中保持相关性。Python 不会被 Julia 淘汰,但 Python 和 Julia 可能会在数据科学行业内部形成某种协同作用。Julia Computing 也明确表示,他们的目标不是取代 Python,而是找到一种很好的方法,让 Julia 可以与 Python 一起使用,并作为该语言面临的一些问题的解决方案。创建 Julia 是为了填补空白和解决问题,而不是颠覆行业,而且目前 Julia 的某些应用程序肯定不能在任何其他编程语言中复制,所以这个目标肯定正在实现。

你应该用朱莉娅吗?

关于 Julia,我最常被问到的问题是,一个人是否应该学习或使用这门语言,尤其是在制作中。至于前者,我认为茱莉亚是一门值得学习的语言。首先,业内人士已经肯定地表示,随着时间的推移,朱莉娅似乎会越来越受欢迎。也就是说,如果你最终接触到朱莉娅,熟悉她可能是至关重要的。这种语言是非常高级的,语法通常与 Python 非常相似,所以如果你已经了解 Python,学习 Julia 并不困难。

至于在产品中使用 Julia,现在并不是部署 Julia 并在专业环境中使用它的最佳时机。语言已经为此做好了准备,但是生态系统还没有。许多数据科学软件包仍处于起步阶段,使用不稳定的工具(可能在几年后仍会维护,也可能不会维护)不适合合适的生产环境。几年后,这种情况很有可能会改变,但是现在我认为在生产中坚持使用 Python 是有意义的。

也就是说,虽然 Julia 可能暂时不会在大多数数据科学专业工作中发挥作用,但教育是数据科学的一个非常重要的方面。首先,Julia 可以教你很多关于编程的知识,这对于数据科学家来说总是一件好事。其次,对数据科学行业教育的需求总是迫在眉睫,因为它有时发展如此之快。作为一名数据科学家,保持工作价值的一个非常重要的方面是知识。如果这种技术已经出现并用于数据科学,那么没有什么理由不去尝试学习它。随着 Julia 可能给该领域带来的变化,Julia 无疑是我们大多数人作为数据科学家应该了解的事情之一。

多重分派范例

自从 Simula 和面向对象编程范例发布以来,许多人推测已经没有什么编程范例可以发现了。然而,朱莉娅通过创造多种调度模式证明了这一理论是错误的。在讨论这种“范式”之前,重要的是要考虑到 Julia 像大多数其他现代编程语言一样,是一种多范式语言。这意味着该语言集中基于一种范式,但也借用了泛型编程概念,允许它在需要时脱离这种范式的规范。

多分派概念本身,参数多态性,是一个通用的编程概念。考虑到这一点,很难想象这能成为它自己的范例。然而,编程范式描述的只是一种语言如何处理类型、方法和数据。也就是说,Julia 使用多重分派改变了它对这三者的处理,而且 Julia Computing 认为这种语言的范例就是这样(正如在https://julialang.org)所说的那样),所以我认为也是这样。

但是多重分派范例实际上意味着什么呢?这意味着代码不会与面向对象的语言(如 Python)或函数式语言(如 R)完全一致。虽然我会说在这两者之间,Julia 可能在范式方面与 R 最相似,但多重分派可以让您跨越到看起来与 Python 相同的代码中。在 Julia 的构造函数和方法上使用了多重分派,改变了它们的工作方式,并允许您按照自己的意愿构建数据结构和方法。这是一个很好的例子,因为它使 Julia 成为一种非常通用的语言,可以组成你想用的任何风格。如果你想了解我为什么如此喜欢多重分派,你可以在这里阅读我写的一篇完整的文章:

我还想链接另一篇来自不同作者的很酷的文章,该文章将抽象和多重分派结合在一起,形成一个有效地创建方法继承的强大组合:

生态系统

关于 Julia,你最不应该知道的是它的生态系统。Julia 生态系统中的许多软件包都在不断发布新的突破性版本,并且处于开发的早期阶段。有关于为什么企业参与可能是朱莉娅语言的下一步的讨论,但在很多方面这是一个大杂烩。

软件开发需要时间。对于科学计算来说尤其如此,我们今天在 Python 中使用的许多最流行的包都是大约十年前开始的项目。也就是说,你不应该在进入 Julia 的时候就期望拥有一个万能的工具,因为事实并非如此。Julia 的大部分工具都有一些方面使它们无法用于某些应用程序,这是你在学习这门语言时应该牢记的。我发现这个缺点最明显的领域是数据处理或建模。有时会有一些方法可以用来改变数据的形状或清理数据,但这些方法并不适用于 Julia 语言。

结论

机器学习和数据科学的兴起也催生了许多非常酷的技术。在我看来,我认为这是一个令人兴奋的时代,因为这个行业不断有新的焦点,而且总是有东西可以学习。我的兴趣中最大的一个问题是,我总是会感到厌倦,觉得没有什么可学的了,而数据科学的兴奋之处在于学科的结合,总是有新的东西要学。

对于未来,我预计 Julia 和 Python 之间的某种共生关系将主导这个行业。尽管 Julia 的特性很棒,Python 拥有最大的软件包生态系统——基于数据科学,或者不在世界上。不管 Python 在未来几年中处于什么位置,Julia 肯定也会在那里。我认为可能是某种协调,Julia 要么用在后端,要么用 Python 做原型。然而,这些只是预测,我没有时间机器,所以没有办法确切地知道每种语言的应用将会是什么,只知道它们仍然会被使用。

朱莉娅当然是我认为值得花时间去研究和学习的新课题之一。学习 Julia 实际上可以使你成为一个更好的编程者,并且帮助你更好地理解范例和那些范例的不同应用。最重要的是,朱莉娅总有可能变得越来越受欢迎,所以对它提供的信息保持警觉是很重要的。虽然在某些情况下使用这种语言存在一些障碍,例如不成熟的生态系统,但 Julia 无疑是一项很酷的技术,不会很快普及。我认为它值得一试,它所提供的教育绝对是无价的。祝您学习愉快,并祝您和 Julia 一起踏上数据科学之旅!

参加斯坦福大学的机器学习课程之前需要知道的事情

原文:https://towardsdatascience.com/what-you-need-to-know-before-taking-the-machine-learning-course-by-stanford-84fd7bf94628?source=collection_archive---------7-----------------------

意见

机器学习课程由吴恩达&史丹福评论

阿瑟尼·托古列夫在 Unsplash 上的照片

在这篇文章中,我将陈述我对斯坦福大学的机器学习课程的看法。如果你还不知道这门课程,这是由 Coursera 联合创始人 deeplearning.ai吴恩达创建的最受欢迎的机器学习课程之一。

后面我会说,这门课程是初学者的最佳选择,但是我们这个世界的一切都有弊端。我试着注意到其中的一些,并附上来源的链接,学习它们你会对机器学习和数据科学有一个更完整的了解。

主要缺点——应该理解什么

尽管这门课程很有魅力,但它已经过时了。这不是课程的直接劣势,但是已经快 11 年了!(课程发布于 2011 年)。这段时间发生了很多变化。如果课程是关于深度学习(或其他快速发展的领域),它将完全失去相关性

但是因为这个课程是关于基础的,所以几乎所有的东西都和 T21 有关。可能除了关于机器学习应用的故事——它们现在看起来有点滑稽。目前,解决实际任务的工具完全不同。这都是因为在计算机视觉和自然语言处理方面的主要成就是在 2011 年之后取得的(课程主要例子是自动驾驶汽车和电子邮件垃圾分类器)。

这是绝对正常的情况——一切都在进步,10 年后现代课程也会显得过时。这门课讲的是永远不会改变的基础知识(至少我们是这么认为的),但值得理解的是,实际任务的方法和工具在不断变化。这对某些人来说是显而易见的,但对初学者来说也是令人困惑的。

技术方面的问题是声音质量有时不尽人意。然而,如果你在一个安静的地方戴着耳机学习,那么一切都可以听得很清楚。此外,还有字幕。

用 Python 代替 Octave 或者 MATLAB

据你所知,本课程的另一个主要缺点是它不使用 Python。作业必须只用 【八度】MATLAB 完成。

尽管课程作者的论点(Octave/MATLAB 比有意义的编程语言更容易让初学者理解),但这些语言与数据科学的实际应用毫无关系。所以如果你想深入数据科学,最好马上学习 python

我当即决定把这门课翻译成 Python。但是在继续我自己的 Python 实现之前,我决定检查一下是否有人在我之前做过。当然,有人做到了。您可以通过以下链接使用 Python 完成本课程。

https://github.com/dibgerge/ml-coursera-python-assignments

就我个人而言,我想对这些帖子的作者说一声非常感谢——他们做得真的很棒。

这门课不会教你什么

课程有意识的压制很多机器学习方面。我有意识地使用了“T14”这个词,因为我确信吴恩达和设计课程的团队熟悉下面的所有概念。这样做是为了简化课程,让初学者更加舒适。然而,我认为提供一些额外的材料来探索数据科学世界是非常重要的。

下面是一些例子,学习这些你应该对机器学习和数据科学有更完整的了解。我这里说的不是提 CNN,RNN,还有其他方面的深度学习,因为真的是高级水平。但是我认为这个列表可以帮助你对数据科学有一个更全面的了解。

集成学习

课程根本没说什么集成学习方法——装袋随机森林助推堆叠等。在我看来,这是最大的遗漏,因为课程中的神经网络被感知为【自身】,而不是弱分类器的集合。

https://bdtechtalks.com/2020/11/12/what-is-ensemble-learning/ https://machinelearningmastery.com/tour-of-ensemble-learning-algorithms/

分类变量

虽然特征工程是数据科学工作的一个重要部分,但是没有提到分类和其他类型的变量。

https://machinelearningmastery.com/one-hot-encoding-for-categorical-data/

使聚集

只有 K-均值聚类被认为是一种聚类算法。

https://neptune.ai/blog/clustering-algorithms

降维

只有 PCA 被认为是一种降维技术。更不用说有完全不同的方法,在课程结束后,你可能会觉得使用主成分分析进行数据可视化是一个好主意。

https://bdtechtalks.com/2021/05/13/machine-learning-dimensionality-reduction/

异常检测

在课程中,吴恩达谈到了异常检测,尽管事实上,他谈到了新奇检测——一个稍微不同的任务。这个任务在课程中用密度估计方法解决,其他方法根本不考虑。

我的文章可能对你有用

您也可以使用我的备忘单文章作为数据科学概念的列表,以便理解每个任务都有几种解决方法:

摘要

尽管有这些缺点,这门课仍然是开始学习数据科学和机器学习的最佳选择。这个课程的优点与所有缺点重叠:

  • 吴恩达的天赋和教学经验使得用简单的语言解释复杂的事情成为可能。特别是,在我看来,本课程是对内核技巧和模型选择概念(欠拟合/过拟合预防)的最好解释。
  • 不要忘记的课程材料是完全免费的,你只需要为证书付费(标准 Coursera 费用——大约 80 美元)。
  • 超过 10 种语言的字幕可供选择。这让你可以在任何你想去的地方学习,即使你不擅长英语。
  • 虽然不直接,你可以用 Python 来完成课程作业。

如果您很久以来一直想投身于数据科学领域,但一直不敢,那么现在或许是报名参加该课程并获得独特体验的最佳时机。

参考

https://www.coursera.org/learn/machine-learning

感谢您的阅读!

  • 我希望这些材料对你有用。在 Medium 上关注我,获取更多这样的文章。
  • 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论里问我,或者通过 LinkedIn 或者 Twitter 联系。
  • 为了支持我作为一个作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。

所见即所得:Twitter 在时间轴上显示图像的新策略

原文:https://towardsdatascience.com/what-you-see-is-what-youll-get-twitter-s-new-strategy-for-displaying-images-on-the-timeline-3ddc2040c728?source=collection_archive---------25-----------------------

总结 Twitter 关于图像裁剪算法的论文

亚历山大·沙托夫在 Unsplash 上拍摄的照片

2020 年,Twitter 上对他们的图像裁剪算法的偏见性质有很多不满。Twitterati 抱怨说,它偏向于白人,是物化女性的身体。Twitter 承诺调查这个问题和其他几个问题以确保负责任的人工智能实践。这篇文章总结了 Twitter 的图像裁剪算法的问题,他们研究团队的发现,以及他们打算如何为他们现有的机器学习(ML)系统带来更多透明度。文章中的内容基于 Twitter 发布的论文。

论文:Twitter 上的图像裁剪:公平性指标、它们的局限性以及表现、设计和代理的重要性

作者 : 基拉绮 乌泰彭 舒班舒

图像裁剪及其业务用例

每天有数百万张图片以各种形状和大小上传到各种社交媒体平台。这些上传的图像必须进行裁剪,以保持 UI 的一致性,并确保图像中最相关的部分在用户的时间轴中可见。然而,裁剪是一个繁琐的过程,为了消除数小时的繁重工作,公司主要使用机器学习来自动化这一过程。Twitter 使用了一个显著性算法来实现同样的效果。

Twitter 上的图像裁剪

Twitter 是一个广为人知的社交媒体平台,图片分享是其核心。2018 年之前,Twitter 使用人脸检测来裁剪图像。然而,这种方法有许多缺点。

基于人脸检测的图像裁剪|作者图片

2018 年,Twitter 宣布他们将采用快速神经网络来智能自动裁剪图像。这个系统依赖于显著性技术,它从感知角度识别图像中最重要的区域。换句话说,显著性算法识别人在图像中最可能观察到的那些图像部分。自然,这将包括文本、人脸、动物、物体和高对比度的背景。

基于显著性的图像裁剪|来源:https://arxiv.org/pdf/2105.08667.pdf

Twitter 的显著性模型利用了深度学习架构 DeepGaze II 。然而,这种模型本身在计算上是昂贵且缓慢的。为了加快这一过程,Twitter 还在深度学习网络的基础上采用了一种叫做 fisher pruning 和知识提取的技术组合。用作者的话说:

总的来说,这两种方法使我们裁剪媒体的速度比模型的普通实现快 10 倍,并且没有进行任何实现优化。这使我们能够在所有图像上传后立即对它们执行显著性检测,并实时裁剪它们。

Twitter 图像裁剪算法的问题

大约在 2020 年秋天,许多推文出现,抱怨他们的图像在 Twitter 上的显示方式。也就是说,图像裁剪算法对白皮肤的人比对黑皮肤的人更有利。不仅如此,人们还担心男性的注视和表现偏见,也就是说,不允许人们自由选择他们希望在平台上如何表现。

Twitter 决定调查这些问题,并重新评估其算法。

为了解决这些问题,我们使用正式的组公平指标进行了广泛的分析。我们发现了种植中的系统性差异,并确定了影响因素,包括基于单一最显著点的种植会放大差异。

调查结果和提议的改变。

这篇论文解释了 Twitter 如何进行精心的测试,以检查其算法中潜在的性别和种族偏见以及男性凝视。

数据集和方法

使用的数据集是 WikiCeleb 数据集,由 Wikidata 上记录的 4073 位名人的图像和标签组成。这些数据根据种族和性别被分成四个亚组→:黑人女性、黑人男性、白人女性和白人男性。

结果-性别和种族差异

结果显示,女性比男性更受性别青睐,白人比黑人更受青睐。

推特图片裁剪分析的发现|来源:https://arxiv.org/pdf/2105.08667.pdf

结果——男性凝视

对于男性凝视的问题,结果显示,对于每个性别,100 张照片中有 3 张是在头部以外的地方。庄稼不在脸上;通常是在图像上的这些区域显示数字,比如运动衫。这种行为在所有性别中都是相似的。

分析推特图像裁剪算法中的男性凝视问题|来源:【https://arxiv.org/pdf/2105.08667.pdf

本文还讨论了放大不同效果的其他要点,如深色背景、深色眼睛、较高的可变性等。最后,作者总结如下

然而,我们证明了形式化的公平性度量和定量分析本身不足以捕捉自动裁剪中代表性伤害的风险。我们建议去除基于显著性的裁剪,以利于更好地保护用户代理的解决方案。为了开发一种新的解决方案,充分解决与代表性伤害相关的问题,我们的评论激发了包括以人为中心的设计在内的定量和定性方法的结合。

因此,当用户在推特上发布照片时,他们将获得他们的图像将如何出现的准确预览。在测试了这一变化后,Twitter 终于在 2021 年 5 月推出了这一更新功能。

5.我们的外卖

这篇论文强调了负责任的人工智能必须成为任何机器学习系统的核心。今天人工智能系统的广泛使用使得确保它们的预测不应该是歧视性的和不公平的歧视成为当务之急。批判性地评估机器学习系统并仔细思考其后果是朝着这个方向迈出的重要一步。

参考

成为营销数据分析师之前你应该知道什么

原文:https://towardsdatascience.com/what-you-should-know-before-becoming-a-marketing-data-analyst-c35109be773e?source=collection_archive---------13-----------------------

从我的营销分析经验来看利弊

来自 Pexels 的 Joshua Miranda 的照片

数据分析师支持营销是很常见的,但没有太多信息告诉你作为营销数据分析师实际上是什么样的。我曾在多家公司担任数据分析师,为市场营销提供支持,现在我想谈谈我的经历,以及如果你决定担任市场营销分析的角色,将会发生什么。

无尽的想法

营销人员有很多想法,他们需要有这种能力才能在工作中取得成功。不幸的是,这也意味着随着新想法的形成,数据请求会从他们的脑海中消失。预计额外的时间来理解营销目标和细化分析要求。

难以衡量影响

营销归因可能很难,因为没有一个系统可以对所有营销活动进行跟踪。因此,在营销支出上获得真正的 ROI 可能是不可能的。营销仍然会要求你用不完美的数据来计算投资回报率,而且通常很难说营销产生了影响。我能说的最多的是,从方向上看,当活动启动时,我可以看到营销 KPI 出现峰值。准备在缺乏归因数据的情况下发挥创造力,计算营销支出的投资回报率。

要求需要在昨天完成

营销对商业需求非常敏感。不利的一面是,当他们提出要求时,他们也希望立即得到满足。即使公司遵循敏捷框架并且有 sprint 计划你也可能有新的请求,把当前的票推到下一个 sprint。在某些情况下,业务需要立即完成请求,您需要准备转换思路,专注于新的请求。与产品等其他部门相比,这在市场营销中更为常见。

策略经常改变

有时,业务转移了重点,或者现有的营销战略没有产生预期的影响,于是形成了新的战略。这意味着与旧策略相关的票证可能不再适用,您所做的工作将变得无关紧要。预计营销重点会发生变化,如果你的分析没有用上,不要把它当成个人问题。

创意第一

一些营销人员可能缺乏数据素养,因为他们从事的是创造性的工作。这并不是说营销人员不是数据驱动的,而是你可能需要花更多的时间来弄清楚如何有效地解释你的数据结果。好的一面是,你得到了大量向不太懂数据的利益相关者解释结果的练习,这将帮助你发展你的沟通技巧。

领域知识

如果你没有市场营销领域的知识,确保你阅读了常见的营销概念和术语。这些知识有助于指导营销,因为他们可能不知道要问的正确数据问题。搜索术语,如 SEO 和 SEM ,电子邮件指标,如打开和点击率,以及网站跟踪概念,如cookie 和会话可能会在数据请求中引用,了解这些领域知识将有助于您提出正确的问题。

结论

我上面列出的听起来像是与其他部门相比,市场营销很难支持,但也有专业人士。

  • 营销人员是最好的促销员,因为说服是他们的天性。如果你在支持他们方面做得很好,他们会在整个组织中对你大加赞赏。这将有助于你获得高层领导的关注,也有助于你获得晋升。
  • 营销概念是普遍的,支持营销将帮助你理解一个企业的重要组成部分,无论你决定在哪里工作。
  • 一些数据分析师工作支持多种职能,如营销和产品,与没有任何领域经验的候选人相比,至少在一个领域有经验会增加你的机会。
  • 如果有一天你决定开创自己的事业,你将已经熟悉营销实践,不需要从头开始学习。

尽管作为营销数据分析师存在挑战,但这是一次值得的经历,我希望这不会阻止你尝试营销分析。

你可能也会喜欢…

https://bettermarketing.pub/what-marketers-should-know-about-subscription-models-7643bbede5eb

在开始数据分析职业生涯之前,你应该知道什么

原文:https://towardsdatascience.com/what-you-should-know-before-starting-a-career-in-data-analytics-4a39e80bafa0?source=collection_archive---------18-----------------------

期望与现实

图片作者🎄圣诞快乐🎄来自 Pixabay

当我刚开始作为一名数据科学家和一名数据分析师工作时,我对这份工作有很多误解。几年后,我希望有人提前告诉我会发生什么。今天,我想讨论一下数据分析工作的期望与现实,以便为接下来的工作做好准备。

数据可用

一个常见的误解是,你总是有你需要做分析的数据。您可能认为这是理所当然的,但即使是数据基础设施成熟的大公司也无法容纳所有必要的数据。数据可能分散在多个数据库中,或者没有共同的键来连接在一起。我为一家不在数据库中存储电子邮件活动数据的公司工作。每次我做活动分析时,电子邮件团队的人都必须手动为我提取一份电子邮件列表。

数据是干净的

当你第一次参加数据分析课程时,你会得到干净的作业数据,不必考虑异常值、缺失或坏数据。在现实世界中,数据是脏的,在开始分析之前,您将花费大量时间清理数据。ETL 管道可能会出现数据延迟或不完整的问题,您必须记住检查这一点,否则可能会导致糟糕的结果。

你只做数据分析

数据可能存在于 Excel 文件中,在开始分析之前,您必须花费数小时将这些文件组合在一起并加载到数据库中。该公司可能没有数据工程师来帮助构建 ETL 管道,以自动将数据加载到数据库中。如果您需要数据,但没有人可以提供帮助,那么您可能必须构建 ETL 管道并对其进行故障排除。

你可以独自工作

您可能认为数据分析师整天运行 SQL 查询和构建仪表板。事实上,一整天都有来自利益相关者的会议和问题。担任数据分析角色需要你与许多人互动。你需要有良好的沟通技巧来向利益相关者解释结果,以便他们做出决定。如果你喜欢独自工作,很少与他人交谈,你需要学习如何与人合作,提高你的沟通技巧,成为一名有效的数据分析师。

你只有一个经理

我敢打赌,没人告诉你数据分析也是一项客户服务工作。作为一名数据分析师,我向利益相关者汇报,他们的反馈直接影响我的绩效评估。我的经理创建团队的项目路线图,并帮助确定组织中各小组之间的优先级,但利益相关者是我的客户。如果利益相关方对我的绩效不满意,那么我的高于预期评级的目标就不会实现。

我所有的工作都很重要

预计您的数据分析、模型和仪表板的一部分永远不会被使用。发生这种情况的原因有很多。你没有提供任何利益相关者现在可以采取行动的可操作的见解,仪表板变得没有意义,因为业务转向了另一个方向,或者你的利益相关者只是忘记或没有意识到是你创建的。我开发了我的利益相关者忘记的仪表板,并生成了从未使用过的机器学习模型。如果这种情况发生在你身上,不要生气,因为你的大部分工作都会得到重视,不会白白浪费。

数据分析的需求量很大,找工作应该不难

没有任何经验很难找到数据分析的工作。根据为 IBM 进行的这份报告第 7 页的显示,在 81%的 DSA(数据科学与分析)招聘职位要求拥有 至少三年工作经验的员工 。对有经验的候选人的强烈需求,加上许多 DSA 职位的强劲增长,在 DSA 就业市场中产生了一个先有鸡还是先有蛋的问题。“寻找数据实习机会,建立联系,研究如何在雇主面前脱颖而出,从而更容易获得你的第一份数据分析工作。

这并不意味着阻止你从事数据分析职业。我喜欢做一名数据分析师,并且知道错误的想法不会阻止我,但是我想给你一个机会来权衡你正在考虑的其他选择的利弊。不管你现在选择了哪条路,你都可以睁大眼睛走进去。

你可能也会喜欢…

https://madfordata.medium.com/why-i-love-being-a-data-analyst-4dc7130a2d1 https://madfordata.medium.com/how-to-get-your-first-data-analyst-job-without-experience-7a9afc663439

WhatAPhish:检测钓鱼网站

原文:https://towardsdatascience.com/whataphish-detecting-phishing-websites-e5e1f14ef1a9?source=collection_archive---------13-----------------------

一种基于机器学习的方法,根据 25 种不同的特征来检测可能的钓鱼网站

动机

网站钓鱼每年给互联网用户造成数十亿美元的损失。网络钓鱼者窃取用户名和密码等个人信息和金融账户详情,使用户在网络空间易受攻击。

什么是黑客的周末度假?

他们去钓鱼了!

Bermix 工作室Unsplash 拍摄的照片

新冠肺炎疫情促进了技术在各个领域的应用,导致了组织官方会议、上课、购物、支付等活动的转变。从物理空间到网络空间。这意味着网络钓鱼者有更多的机会实施攻击,对受害者造成经济、心理和职业上的影响。2013 年,45 万次网络钓鱼攻击导致超过 59 亿美元的财务损失。根据 2018 年 CheckPoint Research 安全报告,77%的 IT 专业人员认为他们的安全团队对当今的网络安全挑战毫无准备。同一份报告指出,64%的组织在过去一年中遭遇过网络钓鱼攻击。

检测钓鱼网站并不容易,因为使用 URL 混淆来缩短 URL,链接重定向和操纵链接,使其看起来可信,并且列表还在继续。这就需要从传统的编程方法转向机器学习方法。

技术发展水平

传统上,ad-hoc 方法被用于基于网页的内容、URL 等来检测网络钓鱼攻击。网络钓鱼检测主要有三种模式:

  1. 基于内容的方法:使用版权、空页脚链接、正文 HTML 的零链接、具有最大频率域的链接来分析页面的基于文本的内容。仅使用纯 TF-IDF 算法,可以以 6%的误报率检测到 97%的钓鱼网站。
  2. 基于 URL 的方法:使用页面排名,并基于先验知识将其与从 URL 导出的其他度量相结合。这种方法可以检测高达 97%的钓鱼网站。
  3. 机器学习方法:使用不同的机器学习模型,这些模型针对诸如 URL 是否包含@、URL 是否具有双斜线重定向、URL 的 pagerank、网页上嵌入的外部链接的数量等特征进行训练。该方法的真阳性率高达 92%,假阳性率为 0.4%。

M E Pratiwi 等人对 UCI 机器学习提供的数据使用神经网络感知器,并能够通过使用 18 个 features⁵实现 83.38%的准确率。A. Alswailem 等人使用从 36 个可用特征中的 URL 和页面内容提取的随机特征,并通过随机森林分类器实现了最低 53%和最高 98%的准确度。

方法学

数据集描述

我们使用的数据集由 repository⁴UCI 机器学习公司提供,由 Mohammad 等人整理。该数据集有 11055 个数据点,其中有 6157 个合法网址和 4898 个钓鱼网址。每个数据点有 30 个特征,细分为以下三类:

  1. URL 和衍生功能
  2. 基于页面源代码的功能:包括网页中嵌入的 URL 和基于 HTML 和 Javascript 的功能。
  3. 基于域的功能

研究了特征的提取方式和相关性,我们从 30 个特征中去掉了 5 个,分别是:端口号、异常 URL、弹出窗口、Google 索引和指向某个页面的链接数。由于功能漂移,端口号被丢弃。其余的都被丢弃了,因为没有方法以编程方式提取它们,或者缺少公共 API。

TSNE 图(1 代表合法网址,2 代表网络钓鱼网址)

可视化数据集

为了观察这两个类别的可分性,我们绘制了 t-SNE 曲线。该曲线暗示,尽管类是可分离的,但是它们没有聚集在一起,并且需要特征的变换或者非线性模型来获得好的结果。

预处理数据集

我们使用 80:20 拆分将可用数据拆分为训练和测试数据。发帖说,由于我们在训练数据中只有 7075 个数据点,我们使用 5 折交叉验证来训练它。因此,我们实现了 64:16:20 的 train:val:test 分割。

我们对特征进行了一次性编码,以避免由于数值而产生的任何偏差。

模型细节

我们尝试了各种具有超参数调整的分类模型:

  1. 逻辑回归:是一种统计模型,使用逻辑函数对数据点进行分类。我们将最大迭代次数固定为 2500 次。
  2. 分类朴素贝叶斯:它是一种概率模型,假设特征相互独立。
  3. 决策树:它通过创建决策边界来创建学习的分类模型。使用的最大深度是 17。
  4. 随机森林分类器:它是一种集成分类模型,采用多个决策树的平均结果,并进行最佳预测。采用的估计数为 200。
  5. K-最近邻 : KNN 为每个数据点计算最近的 K 个邻居,并返回其中的多数标签。所使用的超参数是 n 个邻居 3,距离评估的度量是“欧几里德”距离。
  6. 支持向量机: SVM 通过创建用于分类的最优超平面,对给定的带标签的训练数据进行分类。使用的超参数是核作为 rbf,伽马值为 0.1,C = 10。
  7. XGBoost: XGBoost 基于决策树,使用梯度推进框架进行分类。超参数是:无声=假,标度位置权重= 1,学习率= 0.01,列样本 bytree = 0.4,子样本= 0.8,目标= '二进制:逻辑',n 估计量= 1000,正则 alpha = 0.3,最大深度= 4,伽马= 10。

评估指标

为了测试所获得的结果,我们使用了 3 个参数:准确性、召回率和假阳性率(FPR)。

  1. 准确率:是正确预测的数量与输入样本总数的比值。由于目标要求大多数 URL 被正确分类,因此高准确度是度量之一。
  2. 召回:是真阳性数与预测阳性总数的比值。由于我们希望网站预测为积极的,只是合法的,高召回是可取的。
  3. 假阳性率(FPR): 它是被错误识别为阳性的样本数与实际阴性样本总数的比率。该要求旨在最大限度地减少被识别为合法的网络钓鱼网站的数量,因为这可能会给访问该网站的人带来重大损失。因此,低 FPR 是所使用的度量之一。

结果

经过训练的模型及其对验证数据的表现如下:

我们的目标是提高准确性、提高召回率和降低误报率,以便大部分点被正确分类,并减少被标记为合法的钓鱼网站的数量。

讨论

随机森林分类器和支持向量机在给定数据集上表现相似,与其他模型相比,具有更高的精度和更低的 FPR。除了逻辑回归和分类朴素贝叶斯,其他模型的性能也相当。

逻辑回归假设线性可分的类。然而,从 t-SNE 图中可以看出,类是可以分离的,但不是线性的。因此,逻辑分类器不能很好地执行。朴素贝叶斯假设特征的独立性,这可能不完全正确。在这种情况下,像 pagerank 和 statistical report 这样的特性是紧密相关的,类似地,请求 URL 和锚的 URL 似乎也是紧密耦合的。出现这种耦合是因为大多数钓鱼网站在静态特征上往往遵循相似的模式。因此朴素贝叶斯不能很好地捕捉模式。

决策树能够对非线性可分模式进行分类,因此在修剪后对给定数据表现良好,但是由于随机森林是使用决策树的集成模型,其以随机方式组合各种决策树的输出,因此它提供了对结果中所反映的决策树的改进。k-最近邻处理特征的相似性。许多钓鱼网站都有一些共同的特征,如不到六个月的活动,不到一年的域名注册长度等。因此,KNN 可以根据这些特征进行很好的分类。但是,使用“欧几里德”距离,非凸模式可能无法很好地分类,因此会稍微影响性能。

支持向量机适用于线性可分数据。数据不是直接线性分离的,但在应用“rbf”核后,数据变得可分离,SVM 能够从数据中很好地学习。XGBoost 是一个基于决策树的集成模型,它使用梯度推进来减少误差。由于它使用类似于梯度下降的技术,所以它不是很适合分类数据,甚至在一键编码之后也不会很好地执行。

所以,我们决定用 SVM 作为最终的模型。它表现良好,具有高准确率、高召回率和低 FPR。眼前的问题是二元分类,SVM 是一个相对简单的模型,对异常值有容忍度。此外,它还为所涉及的特性提供了可解释性。

下表显示了 SVM 在完整的训练和测试数据上获得的度量:

废弃给定 URL 的功能

我们将训练好的模型部署为一个 webapp 来对任何输入 URL 进行分类。为了获取输入 URL 的要素,根据数据集描述的规则使用了以下条件和工具:

  1. 输入 URL 应该是完整的,即带有“http”或“https”以及任何后续字符,以便在目标页面上着陆。
  2. 我们使用 curl 和 BeautifulSoup 来抓取网页及其标题,使用 tldextract 从给定的 url 获取域名,使用字符串解析来识别可从 URL 文本本身提取的特征,使用 WHOIS 数据库来验证链接的真实性。
  3. 除此之外,我们还从开放页面排名中发现了 URL 的 pagerank,使用 Alexa 数据库发现了页面受欢迎程度,使用 PhishTank API 发现了网站的感知声誉。

[## 工作平台演示

drive.google.com](https://drive.google.com/file/d/1iw6A-mal0WFw_8QSwvY8xdthAHskFPFq/view?usp=sharing)

结论

在这个项目中,我们构建了 WhatAPhish:一种检测钓鱼网站的机制。我们的方法不仅使用传统的基于 URL 或基于内容的规则,还使用机器学习技术来识别数据中不太明显的模式和关系。我们使用了各种领域的功能,从网页的 URL 到 HTML 标签,从嵌入式 URL 到 favicon,以及 WHOIS、Alexa、Pagerank 等数据库。检查网站的流量和状态。我们能够获得超过 96%的准确率,召回率超过 96%,误报率低于 5%,从而正确地对大多数网站进行分类,并证明了基于机器学习的技术在解决钓鱼网站问题方面的有效性。我们提供的输出是一个用户友好的网络平台,可以进一步扩展为浏览器扩展,为用户提供安全健康的在线空间。

完整的代码和报告可以在https://github.com/himanshi18037/WhatAPhish找到。

参考

[1] Ankit Jain 和 B . B . Gupta。网络钓鱼检测:基于视觉相似性的方法分析。安全与通信网络,2017:1–20,01 2017。

[2] A. Alswailem、B. Alabdullah、N. Alrumayh 和 A. Alsedrani。使用机器学习检测钓鱼网站。2019 年第二届计算机应用信息安全国际会议(ICCAIS),第 1–6 页,2019。

[3] R. M .穆罕默德、f .塔博塔和 l .麦克卢斯基。使用自动化技术评估与网络钓鱼网站相关的特征。2012 年互联网技术和担保交易国际会议,第 492–497 页,2012 年。

[4] R. M .穆罕默德、f .塔博塔和 l .麦克卢斯基。UCI 机器学习知识库,2012(【https://archive.ics.uci.edu/ml/datasets/Phishing+Websites#】T2)

[5]普拉蒂维、洛罗沙和维博沃基于人工神经网络的钓鱼网站检测分析。物理学杂志:会议系列,1140:012048,2018 年 12 月。

作者: 维布·阿格拉瓦尔、希曼希·马图尔、万什卡·戈埃尔(德里 Indraprastha 信息技术学院)

课程项目 针对 CSE343:机器学习,德里 Indraprastha 信息技术学院。

课程导师:Jainendra shuk la 博士。

到底什么是数据平台?

原文:https://towardsdatascience.com/whats-a-data-platform-anyway-37773d9aef47?source=collection_archive---------14-----------------------

以及为什么你的创业需要或使用一个

Unsplash 上的 hoch3media 拍摄的照片

到 2014 年,优步已经生成了刚刚超过几万亿字节的数据。这些有限的数据分散在少数传统数据库中,如 MySQL 和 PostgreSQL。工程师可以单独访问数据库,并编写脚本来组合数据源。

与一个或多个数据库交互的服务|作者图片

因为数据是直接从数据库中访问的,所以访问速度非常快,不到一分钟。

但是有一个问题——数据分散在几个数据库中。在许多情况下,不同的服务与不同的数据库交互。

为什么这是个问题?

我们从根本上知道优步是一家数据驱动的公司——例如,预测高流量事件期间的需求并调整定价是其特点之一。随着优步的扩张,它产生的数据也在增长——非常巨大!。

但是,由于数据存在于互不连接、分散的孤岛中,分析人员执行需要来自多个来源的数据的任务变得非常困难。这只是他们在处理脱节数据时面临的众多困境之一。

因此,在一个地方访问和分析所有数据的需求成为最重要的目标。随之而来的是让优步成为优步的一代数据平台

超级——/ˈuːbə/指某一类人或事物的杰出或最高范例。

当一家公司成熟时,它产生的数据会增长,拥有一个整合的数据存储库对于分析、商业智能和人工智能系统变得越来越重要。优步仍然可以继续不相交的筒仓,它永远不会成熟到今天的样子。统一不同的来源有助于 it 分离数据的价值,而使这种统一成为可能的是数据平台。

数据平台是一种允许收集、转换、统一数据并将其交付给用户、应用程序或用于其他商业智能目的(如运行推荐引擎)的技术。

用更正式的术语来说,它支持数据访问、治理、交付和安全性。数据平台(DP)是组织内数据不一致和冗余的结果。它解决了这一问题,使我们能够编排、转换数据并将其提供给最终用户(例如,数据科学家)。

例如,考虑一个拥有多个应用程序和独立数据库的组织。这些独立的数据库中可能存在相同数据的副本。这增加了多余的问题,然后带来了可扩展性的问题——这在技术世界是一个大禁忌!

当工程师专注于与数据库的复杂交互而不是制作新产品时,公司如何专注于发展?

现在我们对数据平台有了一个概念,让我们来看看流媒体服务使用的 DP 的一般顶层数据架构。

流数据平台的数据架构|作者图片

Bifrost 就是迪士尼+Hotstar(一种 OTT 流媒体服务) 使用的数据平台的一个例子

Bifrost 没有为不同客户及其不同用例生成的数据提供多个存储库,而是提供了一个单一的入口点。所有客户端和所有微服务都有一个基于 Kafka 的摄取点。

在执行逻辑操作并将数据发送到数据湖或数据仓库之前,首先对数据进行聚合、统一和标准化。

  • 数据仓库(DW)提取结构化数据并在关系数据库上运行。服务示例—雪花。
  • 数据湖(DL)以原始格式提取和存储数据,只进行最少的统一或转换。历史数据存储在 DL 中。示例服务——亚马逊 S3。

然后,DL 和 DW 中的数据被用作不同产品的输入,例如推荐和广告定位系统。DW 中的结构化数据主要由分析师用来执行 BI 任务。

上面讨论的 DPs 是现代数据平台的例子。其他几种平台是:

  • 企业数据平台—MDP 的前身,处理基本存储/服务。
  • 客户数据平台—主要处理客户数据,并用于为未来的推荐建立用户档案。
  • 大数据分析平台—用于数据分析目的的专用数据平台。
  • 云数据平台—完全采用云计算技术和数据存储构建。

你可能已经注意到了,这些 DPs 之间没有细微的差别。通常,您会发现企业使用这些基本 DP 的组合来创建他们自己的 DP。

如果您想知道数据平台的每个阶段都使用了哪些技术,下面的图表列出了每个阶段的常见技术堆栈。

数据平台要素 |来源图集

总而言之,数据平台是可互操作的、可扩展的和可替换的技术的组合,这些技术一起工作来满足企业的整体数据需求。

什么是好的数据平台?

现在我们对 DP 是什么以及为什么使用它有了一些了解,让我们通过研究 DP 是如何成为一个好的 DP 来结束这篇文章。

  • 可用性—数据平台应对客户和终端用户(如数据分析师和科学家)高度可用。这在实时应用中变得更加重要。
  • 治理—当数据出现时,企业需要遵循严格的策略。一个好的数据平台必须能够轻松地启用或更新数据治理策略。
  • 安全性——谁有权访问数据以及可以提供多少数据访问点,应该可以通过数据平台轻松配置。如今,许多服务使用单点登录(SSO)类型的身份验证系统,为所有能够访问数据的人提供单点访问。
  • 集中化——一个好的数据平台必须支持所有类型的数据源,如 MySQL、Cassandra、MongoDB 等,并帮助弥合孤岛。
  • 交付——它应该允许并启用调度和主动提醒等功能。

奖金

我们从 2014 年之前的优步如何存在筒仓开始,这使得可扩展性变得困难。优步经历了三次大的迭代才达到目前最先进的数据平台。在这个过程中,它诞生了一个胡迪,一个开源的 Spark 库,以低延迟和高查询速度处理优步的数据。对于好奇的头脑,优步当前数据平台的数据架构可以在这里探索。

本文汇集了我最近对数据平台的探索中的所有要点。如果你喜欢这篇文章,并想了解更多关于数据平台的信息,请继续阅读。

感谢您的阅读,请在下面留下您的想法。

进一步阅读

什么是数据平台?定义&福利(looker.com)

什么是数据平台?新兴技术| Splunk

优步大数据平台:100+Pb,分钟延迟|优步工程博客(必读!)

数据民主化@ Hotstar。简介|作者 Jayesh Sidhwani |迪士尼+ Hotstar

什么是数据平台?——YouTube

什么是前推分发?

原文:https://towardsdatascience.com/whats-a-pushforward-distribution-17758c1fd542?source=collection_archive---------18-----------------------

学习如何通过计算和分析来评估它,利用 JAX 的力量!

照片由 David SjunnessonUnsplash 上拍摄

介绍

假设你有一个随机变量 X ,你把它经过一些变换 g 。由此产生的随机变量g(X)的分布称为“前推分布”。今天我们将学习如何计算它的概率密度。

例子

与其抽象地谈论,不如让我们从一个实际的例子开始。让我们考虑一个 2D 随机变量 X

和变换 g

我们会用到它。 X 将由 g 得到转化为g(X),我们要一个g(X)的概率分布公式。

预赛

让我们导入我们需要的东西,定义我们的发行版,并定义我们的转换。

太好了。要计算g(X),我们只需要:

  1. distribution提取样本
  2. g应用于samples的每个元素

(如果你不熟悉jax.vmap -参见 jax 矢量化 -别担心,这只是矢量化计算的一个技巧)

我们接下来可以看看 X 的概率密度在 g 下是如何变化的:

概率密度在变换下是如何变化的

这是我们的向前推进的分布!现在让我们看看如何分析计算它。

让我们分析一下(不用数学)

在网上搜索(例如这里,我们可以找到一个可爱的前推概率密度的小公式:

最后一项涉及一个行列式和一个雅可比行列式,我不相信自己能正确计算它们(尤其是对于任何可以生产的东西)。

然而,幸运的是,我不需要自己计算它们——我的计算机可以替我做!有了 JAX ,求transformationpoint的雅可比就和jax.jacobian(transformation)(point)一样简单!看看这个:

一旦我们找到了pushforward_density,我们就可以把它和它的计算副本一起绘制出来:

g(X)的密度图,通过计算和分析得出(并排)

嘿,他们匹配!

结论

如果我们通过一个变换推动一个概率分布,我们最终得到一个向前推动的分布。在这里,我们学习了如何通过计算和分析来计算它的概率密度。这两种方法都不需要我们手工做任何数学运算,多亏了令人敬畏的 JAX 图书馆。

参考

关于前推分布的更多内容,我建议阅读贝坦科特的优秀概率论或 y 案例研究。

ETL 是什么?

原文:https://towardsdatascience.com/whats-etl-b4903a57f8ce?source=collection_archive---------14-----------------------

入门

以及为什么它对数据科学至关重要

戈兰·艾沃斯Unsplash 上的照片

在我的上一篇文章中,我谈到了通过引入机器学习(ML)模型的概念来将 ML 模型投入生产意味着什么。这次我们将看看 ML 的数据科学步骤的另一端——数据提取和集成。

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

ETL 代表提取-转换-加载,它通常涉及从一个或多个源移动数据,进行一些更改,然后将其加载到一个新的单一目的地。

  • 在大多数公司中,数据往往处于孤岛状态,以各种格式存储,并且经常不准确或不一致
  • 如果我们希望能够轻松地分析这些数据并从中获得见解,或者将这些数据 用于数据科学,这种情况就很不理想

🚣🏼我们是如何来到这里的

大多数最大似然算法需要大量的训练数据,以便产生能够做出准确预测的模型。他们还需要高质量的训练数据,代表我们试图解决的问题。

为了强调这一点,我遇到了一个很好的例子,类似于“马斯洛的需求层次”,它强调了数据收集和存储在数据科学中的重要性:

图 1:数据科学需求层次金字塔,来源:“人工智能需求层次”MONICA ROGATI[1]

金字塔的底部是以正确的格式和系统以及正确的数量收集正确数据的基本需求。

人工智能和人工智能的任何应用都取决于所收集数据的质量。

所以,假设你已经框定了你的问题,并确定它很适合 ML 。你知道你需要什么数据,至少开始实验。但不幸的是,它位于不同的系统中,分散在您的组织中。

下一步是找出如何将这些数据整合在一起,根据需要进行转换,然后将其作为一个集成的数据集放到某个地方。一旦数据可用,您就可以开始探索数据、执行特性工程和模型训练——这就是我们友好的缩写 ETL 发挥作用的地方!

🧪:它是如何工作的?

为了更具体一点,让我们使用一个现代真实世界的 ETL 例子。

假设您是一家在线零售商,使用 SalesForce 等客户关系管理(CRM)系统来跟踪您的注册客户。

您还可以使用 Stripe 等支付处理器来处理和存储通过您的电子商务网站进行的销售交易的详细信息。

假设您的目标是通过使用客户的历史购买数据来提高您的转化率,以便在他们浏览您的网站时提供更好的产品推荐。

您当然可以使用 ML 模型来驱动推荐引擎以实现这一目标。但是挑战在于你需要的数据存在于两个不同的系统中。在我们的案例中,解决方案是使用 ETL 过程来提取、转换和组合它们到一个数据仓库中:

图 2:使用 ETL 将数据从不同来源转移到仓库的过程。作者插图。

让我们分解一下上图中发生的情况:

1。提取 —流程的这一部分涉及从我们的两个源(SalesForce 和 Stripe)中检索数据。一旦检索到数据,ETL 工具将把它加载到一个暂存区,为下一步做准备。

2。转换 —这是一个关键的步骤,因为它处理我们的数据将如何被集成的细节。任何数据清理、重新格式化、重复数据删除和混合都发生在这里,然后才能在管道中继续传输。

在我们的例子中,假设在一个系统中,一个客户记录以名字“K. Reeves”存储,而在另一个系统中,相同的客户记录以名字“山谬·里维”存储。

假设我们知道这是同一个客户(根据他们的送货地址),但是系统仍然需要核对这两个客户,这样我们就不会以重复记录结束。

➡️ ETL 框架和工具为我们提供了自动化这种转换所需的逻辑,并且也可以满足许多其他场景。

3。Load —包括成功地将传入的数据插入目标数据库、数据存储,或者在我们的例子中是数据仓库。

现在你知道了,我们已经收集了我们的数据,使用 ETL 管道将其集成,并将其加载到数据科学可以访问的地方。

📌 侧注 📌

ETL 与 ELT

你可能也遇到过“ELT”这个术语。提取、加载和转换(ELT)与 ETL 的区别仅在于转换发生在哪里。在 ELT 过程中,数据转换发生在目标数据存储中。

这可以通过删除有时是托管数据转换的独立或中间的暂存系统来简化架构。另一个优势是,您可以受益于云数据仓库等目的地通常提供的额外规模和计算性能。

📌 侧注 📌

🦀共同的挑战

好吧,所有这些 ETL 的东西听起来很简单,对不对?以下是一些需要注意的“陷阱”:

☄️标度

根据 IDC 的一份报告,到 2025 年,企业产生的数据量预计将增长 175 吉字节[2]。因此,您应该确保您选择的 ETL 工具不仅能够满足您当前的需求,而且能够满足未来的需求。您现在可以批量移动数据,但情况会一直如此吗?您可以并行运行多少个作业?

如果您想让您的 ETL 流程经得起未来考验,那么迁移到云是一个非常安全的选择 —既能获得理论上无限的存储和计算可扩展性,同时还能降低您的 IT 资本支出。

🧮数据准确性

另一个大的 ETL 挑战是确保您转换的数据是准确和完整的。手动编码和更改,或者在运行 ETL 作业之前没有进行计划和测试,有时会引入错误,包括加载副本、丢失数据和其他问题。

ETL 工具肯定会减少手工编码的需要,并有助于减少错误。数据准确性测试有助于发现不一致和重复,监控功能有助于识别处理不兼容数据类型和其他数据管理问题的情况。

🍱数据来源的多样性

数据量正在增长。但更重要的是,它变得越来越复杂。一个企业可能要处理来自数百甚至数千个数据源的不同数据。这些可以包括结构化和半结构化源、实时源、平面文件、CSV、对象桶、流源以及任何新出现的内容。

其中一些数据最好是批量转换,而对于其他数据,流式连续数据转换效果更好。

对于如何处理不同的数据源,有一个策略是关键。一些现代 ETL 工具可以提供多种支持,包括在一个地方进行批处理和流式处理。

👷🏾‍♀️:那我该如何开始呢?

此时,您应该对为什么以及何时需要在您的数据科学工作流中使用 ETL 有一个很好的想法。我们还讨论了在您开始考虑 ETL 过程时需要注意的常见挑战。

我将用一个选择 ETL 工具的简单方法和一些其他有用的资源来结束本文。

🤷🏽‍♀️:我应该在什么时候使用哪种 ETL 工具?

因此,我们理解了 ETL 过程中发生的事情,但是从更实际的角度来看,这意味着什么呢?

您将需要设计一个 ETL 管道,明确描述:

  • 从哪些数据源提取数据以及如何连接到它们
  • 一旦有了数据,要对数据进行什么样的转换,最后
  • 管道完成后,在哪里加载数据

ETL 管道可以使用基于代码的框架来表达,或者目前更流行的选择是使用 ETL 工具,这些工具提供“拖放”用户界面,允许您以可视化的方式定义管道中的步骤。

一旦实现了 ETL 管道,它通常需要在某个地方运行,即使用将执行管道的 ETL 工具,以及提供临时存储和转换数据所需资源的环境。

我已经尽力在下图中为你简化决策步骤(点击放大):

图 3:使用哪个 ETL 工具以及何时使用。作者插图。

NB。这个决策树绝不是这两者的详尽列表;您需要做出的决策、可用的框架或产品。

事实上,对于每一个中间的 ETL 步骤,都有许多开源和专有的产品。从编排到调度,我们不可能在这里面面俱到。

这篇文章的目的是作为进入 ETL 世界的跳板!祝您的数据集成之旅好运!😀

💡有用的资源和进一步阅读

链接

书籍

  • 数据仓库 ETL 工具包:提取、清理、符合和交付数据的实用技术,Wiley,作者:Ralph Kimball,Joe Caserta
  • 流系统:大规模数据处理的内容、地点、时间和方式,O'Reilly,作者:Tyler Akidau,Slava Chernyak,Reuven Lax

数据不可知的 ETL 工具

📇参考

[1]人工智能的需求层次,莫妮卡·罗加蒂

https://hacker noon . com/the-ai-hierarchy-of-needs-18 f 111 FCC 007

[2] 175 吉字节到 2025 年,福布斯,汤姆·库格林

https://www . Forbes . com/sites/tomcoughlin/2018/11/27/175-zetta bytes-by-2025/?sh=6a5d2e7a5459

什么是可解释的人工智能?

原文:https://towardsdatascience.com/whats-explainable-ai-fff416111830?source=collection_archive---------33-----------------------

模型可解释性

揭秘 AI 输出,建立信任

弗拉德·法拉Unsplash 上拍摄

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

  • 人工智能系统的有效性和广泛接受度取决于它们的可信度,尤其是领域专家和最终用户的可信度。
  • 反过来,信任可能会受到我们无法理解和解释人工智能解决方案工作或失败的原因和方式的限制。
  • 人工智能可解释性是指易于理解的信息,解释人工智能系统做出决策的原因和方式。

🚣🏼我们是如何来到这里的

机器学习已经进化了

自 20 世纪 60 年代开发出第一个专家系统以来,更容易获得的计算资源和不断增长的训练数据集规模使机器学习(ML)模型能够为人工智能提供强大动力,并取得了长足的进步[1]。

在我们寻求推动人工智能边界的过程中,从基于规则的系统到线性模型和决策树、神经网络和深度学习模型,再到最近的元学习模型或“创建其他 ML 模型的 ML”,一直在稳步发展。

图 1:机器学习的演变,改编自《人工智能可解释白皮书》【2】

这些新的更精确的模型实现了:

  • 更广泛更高级的用例,比如自动驾驶、蛋白质折叠,以及药物发现。
  • 数据类型的多功能性,这意味着使用图像、音频、语音、文本、表格和时间序列数据的组合来训练模型的能力。
  • 更强的适应性,这是使用转移学习等技术快速构建通用模型的能力,无需从头开始训练。

但是有一个权衡。以下是一些常见的挑战:

  • 透明度和调试能力的丧失,随着复杂性的增加,理解一个模型如何做出预测变得越来越困难,因此也更难修复。这种缺乏透明度的情况确实会减缓这些模型的采用,尤其是在金融服务和医疗保健等受到严格监管的行业。
  • 数据偏见的放大,数据中的人类和社会偏见,如历史不公平、隐含的刻板印象和偏见,可能会被放大,更难确定。

🤯对可解释人工智能的需求

机器学习的发展意味着,在理解人工智能系统如何做出决策时,我们需要找到建立信任和透明度的方法。

2021 Marketoonist。经 Marketoonist LLC 许可使用。

今天,有越来越多的用例具有真实世界的结果,这反过来需要清晰和相关的解释——那么可解释的人工智能如何满足这种需求?

它提供了以下功能:

1-解释一个模型如何得出一个预测,甚至是一个特定的数据点。例如,图 2 中的截图显示了 H2O.ai 中的一个模型解释工具,一个云不可知的 AutoML 产品。

在这种情况下,我在贷款违约数据集上训练了一个模型[3]。对于突出显示的行,您可以看到哪些功能和值导致了模型的预测,即 0 =客户持续付款,1 =客户违约。

解释预测的能力有一些重要的含义;我们可以开始证明决策的合理性,并提供如何影响结果的建议。

图 2: H2O.ai,k-LIME 模型解释工具

2-调试以隔离模型中的异常行为,并优化数据收集过程。调试工具,比如那些基于谷歌综合梯度研究所发表的论文【4】的调试工具,可以返回表示模型预测的单个像素。

例如,图 3 说明了一个场景,其中一个模型使用胸部 X 射线图像重复错误分类疾病。

图 3:使用胸部 x 光图像时的误分类疾病。作者插图。

经过更仔细的检查,发现这个模型把医生在 x 光片上的记录误解为疾病的征兆。这种可解释性使得采取纠正措施变得容易,在我们的例子中,清理图像并重新训练模型。

3-验证模型的行为是可接受的。例如,用于识别博客帖子中有毒评论的自然语言处理(NLP)模型可能会对敏感术语赋予过多的权重。

有毒评论有时会使用人们用来识别自己的词语,如种族、宗教和性别,以贬损他人。因此,包含这些术语的评论可能会被误归类为“有毒”。

第一步可以是确定模型分配给特定特征的权重,然后调整(应用正则化)以减少分配给包含与个人身份相关的术语的特征的权重,如图 4 所示。

图 4:验证模型行为。作者插图。

4-至今一款车型的“要旨”。例如,图 5 中的屏幕截图是 H2O.ai 中的可解释性工具的另一个示例。同样,使用贷款默认数据集,它生成一个决策树,描述通向模型预测输出的输入和路径。

也许与直觉相反,一条路径表明,有工作的人比没有工作的人拖欠还款的可能性更高。但是有人可能会说,一个没有工作的人不可能首先获得贷款!

但是严肃地说,这种能力对于向最终用户概括模型如何工作非常有用,而不需要进入复杂的代码。

图 5: H2O.ai,决策树代理模型解释工具

👷🏾‍♀️:那我该如何开始呢?

这篇文章的目的是介绍可解释人工智能的概念,但显然这是一个非常广泛的话题。从如何使用它来帮助建立信任、解决偏见和确保公平,到大量可用的工具和技术。这超出了我在这里打算涵盖的范围,所以我在进一步阅读下面添加了一些建议。

➡️:对于那些想直接进入的人,我根据你的专业知识水平和建立模型的经验,对“如何开始”将可解释的人工智能添加到你的 ML 工作流程中的选项进行了细分(点击放大):

图 6:如何入门可解释的 AI。作者插图。

我希望这篇文章对你有用,如果有用,请给它一个👏而且一定要分享。我也很想知道你对这个帖子和格式的想法,所以请使用下面的评论或 twitter 来联系!

🙏🏼最后,非常感谢塔希尔·马哈茂德的内容建议!

📇参考

[1]Britannica.com,专家系统,计算机科学,弗拉基米尔·兹沃斯:https://www.britannica.com/technology/expert-system

[2] Google Cloud,AI Explainability 白皮书:https://storage . Google APIs . com/Cloud-AI-whites/AI % 20 explaibility % 20 white page . pdf

【3】【https://www.kaggle.com/kmldas/loan-default-prediction】贷款违约预测,金融分析初学者资料集,卡迈勒达斯:

[4] 深度网络的公理化归属,穆昆德·孙达拉拉詹,安库尔·塔利,奇奇·严,2017 年 6 月 12 日:

📚进一步阅读

DAX 中的语境转换有什么花哨的地方?

原文:https://towardsdatascience.com/whats-fancy-about-context-transition-in-dax-efb5d5bc4c01?source=collection_archive---------10-----------------------

行和过滤器上下文是 DAX 中众所周知的概念。但是我们可以通过上下文转换在这两者之间切换。让我们看看我们能用它做什么。

雷蒙·克拉文斯Unsplash 上拍摄的照片

介绍

在本文中,我将向您展示什么是 DAX 中的上下文转换以及如何使用它。

我将只讲述这个特性的基础知识。如果我想解释所有的细节,我将不得不开始一整个系列的文章。

相反,我想给你一些小例子,告诉你如何使用上下文转换,以及关于它最重要的事情。这样,您可以开始使用它,并根据需要了解更多信息。

你可以在文章的最后找到一个文章和博客帖子的列表,这些文章和博客帖子更深入地探讨了上下文转换。

首先,我们来说说数据。

我使用 Contoso 样本数据集,就像我以前的文章一样。

在整个数据模型中,对于本文中的示例,我只需要两个表:

  • 客户(dim 客户)
  • 在线销售(FactOnlineSales)

关于在线销售表的一个重要因素是存储在在线销售表中的订单包含一个 OrderNumber 和一个 OrderLineNumber。

一个订单可以有一个或多个 OrderLineNumber:

图 1 —样本数据(图片由作者提供)

每个 OrderLineNumber 都有一个映射的产品和一个 SalesAmount。

为了保持代码简单,我将分析单个订单行,而不是订单。

我需要改变数据的粒度,以便能够分析订单。我将在以后的文章中继续讨论在 DAX 中改变粒度的话题。

商业案例

让我们假设以下情况:我们有一个客户列表,我们想知道每个客户的总销售额并获得其他信息。

为了获得所需的信息,我们希望计算以下结果:

  • 客户表中每个客户的最高销售额
  • 每个客户每年的总销售额
  • 每位顾客的平均销售额是多少
  • 按客户列出的销售额占所有销售额的百分比
  • 每年总销售额排名前 10 %的客户是谁

我无法创建度量来计算这些结果,因为我想将它们用作切片器中的筛选器以及我的报告中的报告属性。
这意味着我必须在 Customer 表中添加计算的 DAX 列。

客户表中每个客户的最高销售额

这个要求看起来很简单:从每个客户的在线销售表中获取 MAX()。

但是,我无法在 Customer 表中用 MAX('Online Sales'[SalesAmount])创建计算列,因为 SalesAmount 列不在 Customer 表中。

我可以编写以下代码:

Highest OrderLine = MAXX(‘Online Sales’
      , ‘Online Sales’[SalesAmount]
)

结果将如下所示:

图 2 —简单的 MAXX(图片由作者提供)

由于 MAXX 没有过滤器上下文,它将检索所有客户中销售额最高的订单行。

我必须使用上下文转换来强制 DAX 引擎从行上下文切换到过滤器上下文。在上下文转换过程中,实际行的内容将被添加到过滤器上下文中,MAXX 将使用该过滤器上下文执行。

我可以用 CALCULATE()强制进行上下文转换:

Highest Order Line =
    VAR Result =
        CALCULATE(
            MAXX( ‘Online Sales’
                  ,’Online Sales’[SalesAmount])
                 )RETURN
    Result

你可以在下图中看到结果:

图 3 —带有上下文转换的 MAXX(图片由作者提供)

会发生什么?

  1. 在对 Customer 表中的每一行进行迭代的过程中,context transition 将实际行的内容添加到筛选器上下文中,包括 CustomerKey 列。CustomerKey 列用于与 Online Sales 表的关系中。
  2. CustomerKey 为每个客户筛选在线销售表
  3. 现在为每个 CustomerKey 计算 SalesAmount 列的最大值

您可以利用所有迭代器函数的上下文转换,包括 FILTER()和其他函数。

我在我的上一篇文章(称体重或不称体重——这是一个普通的问题)中使用了这个技巧,采用了以下方法:

Average per Country =
    AVERAGEX(VALUES(‘Geography’[Region Country])
        ,DIVIDE([Online Sales (By Customer)]
                 , [Order Count (By Customer)] )
    )

尽管您在解决方案中看不到任何 CALCULATE(),但我在 AVERAGEX 函数中使用了度量。在行上下文中使用度量会自动触发上下文转换。

客户表中每个客户销售额最高的年份

这个要求解决起来有点复杂。

如上所述,我不想创建度量,因为我想在切片器中使用计算结果。

因此,我还必须创建一个计算列:

Year of Highest Order Line =VAR HighestOrderLine = ‘Customer’[Highest Order Line]VAR Result =
    CALCULATE(
        MAXX ( ‘Online Sales’
                ,YEAR(‘Online Sales’[OrderDate])
               )
            , ‘Online Sales’[SalesAmount] = HighestOrderLine
            )RETURN
    Result

同样,我使用 CALCULATE()启动上下文转换,这会自动将 CustomerKey 列添加到 MAXX()函数的过滤器上下文中。正因为如此,我不需要在 CALCULATE()里面按 CustomerKey 过滤。

我只需要搜索销售额最高的订单行,这是我在上一篇专栏文章中计算的,然后使用 MAXX 获得去年的销售额。

使用 CALCULATE()添加的筛选器被添加到现有的筛选器上下文中,该上下文已经通过上下文转换包含了 customer 表中当前客户的行。

你可以在下图中看到结果:

图 4 —去年销售额最高的一年(图片由作者提供)

每位顾客的平均销售额是多少

以你到现在为止所获得的知识,你应该能够独立解决这个需求。

试着想一想,想出一个解决方案可能是什么样子的想法。

.

.

.

完成了吗?

好了,这是这个计算列的解:

Average Sales = CALCULATE(
                          AVERAGEX(‘Online Sales’
                          ,’Online Sales’[SalesAmount])
                          )

上下文转换允许我们编写这样简短而强大的 DAX 公式。

另一种方法是用 AVERAGEX()创建一个度量,如上所示,并将这个度量直接用于计算列。

按客户列出的销售额占所有销售额的百分比

这一要求要求我们结合获得的知识,使用以下 DAX 公式创建一个新的计算列:

% Sales of Total Sales =VAR SalesOverall = SUMX(‘Online Sales’
                        ,’Online Sales’[SalesAmount]
                        )VAR SalesOfCustomer = CALCULATE(
                             SUMX(‘Online Sales’
                                   ,’Online Sales’[SalesAmount]
                                  )
                              )VAR PctOfTotalSales = DIVIDE(SalesOfCustomer, SalesOverall)RETURN
    PctOfTotalSales

下面是这个公式的解释:

  1. 变量sales total不使用上下文转换。结果是所有客户的总销售额
  2. 变量 SalesOfCustomer 用 CALCULATE()包含了与sales total相同的表达式,从而强制执行上下文转换。
    结果是当前客户的销售额总和
  3. 变量中的除法运算 PctOfTotalSales 计算销售额占总销售额的百分比

结果看起来像这样:

图 5 —每个客户占总销售额的百分比(图片由作者提供)

哪个客户在总销售额的前 10 %之内

为此,我需要根据总销售额计算所有客户的排名。然后我需要得到最高的排名,或者说客户数量,计算出哪些客户在所有客户的前 10 %。

输出应该是包含 True 或 False 值的列。

你可以想象,这是不可能一步到位的。

在这里,我想向您展示两种解决方案,它们以略微不同的方式使用上下文转换。

解决方案 1-计算表和查找值()

通过这种方法,我创建了一个计算 DAX 表。然后我使用 LOOKUPVALUE()将这些值映射到 Customer 表中。

这是创建 DAX 表的代码:

Customer Ranking =VAR CustAndSales = ADDCOLUMNS( VALUES(Customer[CustomerKey] )
                              ,”Amt”, [Online Sales (By Order Date)]
                              )VAR RankedCustomer = ADDCOLUMNS(CustAndSales
                                ,”Rank”, RANKX(CustAndSales
                                               ,[Amt]
                                               )
                                 )VAR MaxRank = MAXX( RankedCustomer
                     ,[Rank]
                     )VAR Result = ADDCOLUMNS(
                    RankedCustomer
                    ,”IsTop10Perc”
                        , IF(
                               DIVIDE( [Rank]
                                     , MaxRank ) <= 0.1
                               , TRUE()
                               ,FALSE()
                               )
                         )RETURN
    Result

变量 CustAndSales 创建一个所有 CustomerKey 的列表,并使用度量[在线销售额(按订单日期)]计算每个客户的销售额总和

  1. 在变量 RankedCustomer 中,我使用 RANKX()根据每个客户的总销售额来计算总体 CustomerKeys 的排名
  2. 变量 MaxRank 获得最高等级,我将在下面的变量中使用它
  3. 最后,我将添加带有 IF()结果的列 IsTop10Perc。根据每个客户的总销售额,如果客户位于前 10 %的客户中,则此列包含该标志

现在,我使用以下表达式在 Customer 表中创建新的计算列:

Is Top 10 % customer by Sales =VAR Result = LOOKUPVALUE(‘Customer Ranking’[IsTop10Perc]
                          , ‘Customer Ranking’[CustomerKey]
                          , ‘Customer’[CustomerKey]
                          )RETURN
    Result

我可以使用这种方法从计算的 DAX 表中添加以下列:

  • 按销售额排名
  • 是前 10%
  • 每位客户的总销售额

解决方案 2-本地计算的列

使用这种方法,我创建了几个包含中间结果的计算列来获得最终结果。

  1. 每位客户的总销售额:

要获得每个客户的总销售额,我需要使用现有的方法[在线销售额(按订单日期)]:

Total Sales per Customer = [Online Sales (By Order Date)]

当我们在行上下文中使用一个度量时,DAX 开始一个上下文转换,这足以获得每个客户的销售总额。

2.计算每个客户的排名

我需要列[每个客户的总销售额]来计算排名。

与第一个解决方案一样,我使用 RANKX 来完成这项工作:

Rank by Sales (local) = RANKX(‘Customer’
                              ,’Customer’[Total Sales per Customer])

3.按销售额设定前 10 %的客户

最后,我可以使用与之前相同的逻辑来查找当前客户是否在总销售额前 10 %的客户中:

Is Top 10 Percent (local) =VAR MaxRank = MAXX( ‘Customer’
                    ,[Rank by Sales (local)]
                    )VAR Result = IF(
                DIVIDE( [Rank by Sales (local)]
                        , MaxRank ) <= 0.1
                  ,TRUE()
                  ,FALSE()
                  )RETURN
    Result

如您所见,这两种解决方案使用相同的基本逻辑,但技术略有不同。

你想用哪个由你决定。

两种解决方案的结果是相同的:

图 6 —带有排名和前 10%标志的客户列表

解决方案 1 是我的第一个方法,因为它看起来更容易做到。我隐藏了计算表,因为在我将所有列都包含到 Customer 表中之后,它就没有用了。但是,我不喜欢模型中有不必要的对象,所以我想出了没有 DAX 表的情况下如何解决需求。

结论

上下文转换是 DAX 中一个复杂但非常有用的特性。这个功能可以比你不知道怎么用的时候更快的帮你解决问题。

米歇尔·玛特隆在 Unsplash 上的照片

但是它有一些重要的怪癖,你需要知道:

  • 背景转换在措施上是缓慢的
  • 上下文转换所使用的表中的重复行(上面例子中的“在线销售”事实表)可能会导致错误的结果,这是很难发现的。
  • 您需要知道上下文转换何时发生:总是在您遍历行、使用度量或者使用 CALCULATE()时

我鼓励您阅读下面的 SQL 文章了解上下文转换——SQL bi来学习基础知识。

您可以阅读文章CALCULATE-SQLBI 中的上下文转换和过滤器来了解 CALCULATE 中的上下文转换。

阅读本文https://www . burning suit . co . uk/blog/2021/08/context-transition-where-the-row-context-become-a-filter-context/,其中包含了对上下文转换的完整解释,包括使用上下文转换时需要考虑的事项

这里有更多关于这个重要话题的文章和博客:

https://blog . enterprise DNA . co/power-bi-filters-invoking-context-transitions/

https://blog . enterprise DNA . co/iterators-and-context-transitions-in-DAX-queries/

https://blog . enterprise DNA . co/DAX-calculation-filter-context-transitions/

https://Community . power bi . com/T5/Community-Blog/DAX-Context-Transition-Why-it-can-hand-to-use-a-Measure/ba-p/1133639

一张脸有什么?

原文:https://towardsdatascience.com/whats-in-a-face-measuring-the-risks-and-benefits-of-facial-recognition-technology-7335348e01b6?source=collection_archive---------30-----------------------

权衡面部识别技术的风险和好处

信用:Karelnoppe/Shutterstock

近年来,面部识别技术(FRT)在能力和使用范围上都有了很大的发展。它在医药、消费应用以及安全和执法领域提供了解决方案。然而,首次登记税使用的增加引起了对信息技术滥用的担忧,以及对隐私、公民自由和偏见的担忧。几个州已经颁布了拟议的法律来规范首次登记税的使用,但是各州的法律并不一致。

为了利用 FRT 背后的力量,同时保护隐私和公民自由,必须有一部联邦法律来保护整个国家免受风险。为了更好地理解什么是可行的联邦法规,需要对首次登记税进行更详细的检查。

面部识别的种族主义历史

面部识别的根源可以追溯到相面学,即通过一个人的外表来推断其性格的实践。切萨雷·龙勃罗梭是 19 世纪的意大利科学家和外科医生,他记录了精确的测量数据和身体特征,从而得出罪犯是天生罪犯的结论。他提出的理论是试图证明北方意大利人长期持有的种族主义信仰是正确的,他们认为南方意大利人在种族上是劣等的。

在 20 世纪,像艾伦斯特·赫克尔这样的德国生物学家用同样类型的种族等级合理化来丑化外国群体。这种相同类型的面相类型的理论,然后被纳粹用来证明对犹太人的迫害和种族灭绝。面相学长期以来一直被怀疑,并被贴上伪科学的标签。但这并没有阻止现代研究人员和初创公司尝试使用面部数据来评估性格和智力。人工智能和机器学习不仅推动了现已被揭穿的相面学的重生,还为其不道德的使用提供了一种客观性。

面部识别技术今天是如何工作的

人脸识别技术可以分为人脸数据和人脸识别。面部数据是与可识别个人相关的任何信息,包括来自一系列来源的图像,包括个人自己提供的图像、政府身份记录、社交媒体、网站、罪犯面部照片和监控。面部识别描述了提取数据,从数据中挑选出面部,识别面部的独特特征,然后比较面部以找到匹配的过程。机器学习对卷积神经网络(CNN)的使用使 FCR 变得准确、自动化和快速。

面部识别技术的好处

公司和组织已经开发了面向消费者的面部识别技术应用,改善了客户体验。FRT 应用包括安全和安保、访问和认证方面的增强、疾病诊断方面的巨大飞跃以及有针对性的营销和客户服务。

在所列的 FRT 应用中,与安全和安保相关的应用往往是与该技术相关的最受吹捧的好处。执法机构使用 FRT 寻找失踪人员、识别通缉犯和早期威胁检测。在医学上,FRT 可用于诊断导致可检测的外观变化的疾病,并有望成为所有类型疾病的无价诊断工具。

在消费者层面上,FRT 可以用作锁定个人设备和访问账户或服务的工具,就像银行业一样。人脸识别不需要可破解的密码,这项技术可以在分行和自动取款机上使用。FRT 在零售业中也有重要的应用。用你的脸付款可以大大减少结账队伍。顾客体验也可以通过定制购物体验来改善。

面部识别技术的缺点

虽然 FRT 的好处是显而易见的,但让我们看看这项技术带来的一些陷阱。

知情同意: 面部识别由于其使用范围的扩大,引起了立法者和公民及隐私权倡导者的关注。无论是私营部门还是公共部门,面部识别技术通常都是在未经同意的情况下部署的。因此,面部数据的收集和随后的使用引起了对民事和隐私权的关注。与其他形式的帐户身份验证不同,面部数据是唯一且不可替代的。因此,关于面部识别的安全问题变得至关重要。一旦面部数据遭到黑客攻击,个人的隐私和安全就会受到威胁,因为他们的生物特征数据不再能够用作安全的识别特征。

偏差: 面部识别技术应该被期望为特定用途显示准确性,以证明整体利益战胜风险。然而,事实并非如此。CNN 使用主要包含白人男性面部图像的面部数据进行训练。由于缺乏多样性,面部识别算法在被要求识别非白人面孔时表现不佳。美国公民自由联盟在测试亚马逊的面部识别工具“rekognition”时证明了这种偏见,他们将国会议员的脸与数据库中因犯罪被捕的人的图像进行比较。该软件错误地将 28 张面孔与数据库匹配,错误匹配的是不成比例的有色人种。

面部识别技术:伦理和隐私

道德: 使用 FCR 技术的组织使用各种道德借口来合理化面部识别技术的不道德使用,这种使用可能会延续偏见并阻碍隐私和公民自由。

隐私: 除了身份识别,FRT 还可以用于监控,这种监控方式不需要被监控者知情、同意或参与。由于监控摄像头现在无处不在,人们已经习惯了在公共场合被记录。这些属于私人公司、执法部门和政府机构的相机不再被注意,被认为只是用于安全目的。

个人并不完全理解 FRT 如何消除与在公共场所被记录相关联的匿名性,并允许组织不仅识别个人,还分析他们的面部数据并从中得出见解,而无需同意。由于首次登记税在公共和私营部门的广泛使用,它的这一方面引起了立法者和隐私权倡导者的注意。但是,对于扩大首次登记税的使用,各州和联邦政府正在做些什么呢?

当前关于面部识别的州法律:WPA 2020 模型

各州一直在努力解决如何监管开发和实施面部识别技术的组织。目前针对面部识别的法律包括伊利诺伊州的《生物识别信息隐私法》(BIPA)、加利福尼亚州的《消费者隐私法》(CCPA)和华盛顿州的《隐私法》(SSB 6281),该法案将很快由州参议院投票表决。

在所有现行的州法律中,《华盛顿州隐私法》提供的保护超过了《CPPA 》,这是美国唯一一部全面涵盖消费者隐私的法律。为了更好地突出法律的优势,比较一下《华盛顿州隐私法》、《CPPA》和《欧盟一般数据保护条例》( GDPR)是有益的。

鸣谢:作者图片

FCR 的允许用途

华盛顿隐私法案为国会提供了一个很好的模板,用于监管面部识别技术。它解决了对首次登记税商业用途的保护,同时建立了保护个人权利和确保履行公司义务的 GDPR 模式。由于各州的首次登记税法律不同,让国会在联邦层面通过法律将确保所有美国人免受首次登记税的滥用。《面部识别技术授权令法案》的通过可以进一步保护隐私和公民自由,该法案要求有正当理由的授权令才能跟踪一个人超过 72 小时的公共活动,并将跟踪限制在 30 天内。

任何联邦法律都必须提供一个强有力的道德框架来帮助企业穿越灰色地带。这一框架应强调公平和包容性、问责制、信任和适应性。有了正确的监管和保护,面部识别技术可以让世界变得更安全、更方便、更智能。首次登记税可以给社会带来广泛的好处,包括诊断疾病、协助执法、促进安全交易和改善客户体验。采取适当的安全措施将有助于确保每个人安全可靠地从 FRT 的进步中受益。

“随机森林”里有什么?预测糖尿病

原文:https://towardsdatascience.com/whats-in-a-random-forest-predicting-diabetes-18f3707b6343?source=collection_archive---------15-----------------------

动手教程,机器学习,凭直觉

直观地理解随机森林并在真实的医院患者数据中预测糖尿病

照片由普里西拉·杜·普里兹Unsplash 上拍摄

(免责声明:这篇文章主要是为那些想要友好、直观地了解随机森林和决策树中正在发生的事情的人准备的——所以我不会涉及大量的数学细节。如果你想了解更多的统计细节,我会在文章的下面贴一些视频和材料的链接。如果您也对 Python 实现感兴趣,请进一步阅读!)

如果你听说过“随机森林”是一个热门、性感的机器学习算法,并且你想实现它,那太好了!但是如果你不确定随机森林中到底发生了什么,或者随机森林是如何做出分类决定的,那么请继续阅读:)

我们会发现,我们可以将随机森林分解成更小、更易消化的部分。正如森林是由树组成的一样,随机森林是由一堆随机抽样的子组件组成的,这些子组件被称为决策树。所以首先让我们试着理解什么是决策树,以及它是如何进行预测的。现在,我们只看分类决策树。

顾名思义,决策树有一个树状结构,由“真/假树枝”组成,这些树枝会分裂(就像现实生活中的树枝会分裂一样!).这就像看一棵倒挂的树——想象树干在顶部。事实上,决策树是非常容易解释的,因为人类也对某些选择做决策树——通常称为流程图!

图片来源:维基百科(https://en.wikipedia.org/wiki/Decision_tree_learning)。这里我们看到一个简单的流程图(决策树),显示了计算机如何估计泰坦尼克号沉没时有人幸存的概率

在上面的决策树中,机器(或者可能是诊断医生)在树的每一层做出一系列判断,继续往下直到达到概率。例如在树的顶端根:机器问:乘客的性别是男是假?如果是真的,沿着左边的树枝走;错,沿着右边的树枝走。这是决策树中对/错(或者是/否问题)的一个例子。

通过这种方式,很容易将决策树形象化。但是,你知道,决策树究竟是如何做出决策的呢?

选择在上拆分哪些“功能”

在上面的泰坦尼克号数据示例中,我们看到决策树决定根据某些特征在树中对有问题的乘客进行“拆分”(我前面提到的对/错问题拆分),如人的性别,他们的年龄,以及乘客的兄弟姐妹。决策树是如何找出这些特征的?因为我们没有明确要求树选择这些属性。

想象自己是一棵决策树,你面临着根据数据预测泰坦尼克号上的乘客是死是活的问题。起初,当你还没有问关于属性的是/否问题时,你不知道如何对“死去的”乘客和“活着的”乘客进行排序。但是凭直觉,如果您选择正确的特征来询问是/否问题(如上图所示),在您的流程图决策中,您可能希望一个分支包含所有“死亡”的乘客,而另一个分支包含“活着”的乘客,对吗?此时,您已经对您的乘客进行了分类和筛选,通过选择正确的属性,您可以真正地阅读流程图,直观地跟随每个分支向下,并查看乘客是活着还是死了——这是一种多么棒的预测方式!

什么是决策树中的“信息增益”?

挑选特征,使决策树的某些“分支”变得“充满”一种类型的数据——例如,一个分支只有所有“死亡”的乘客,而另一个分支只有“活着”的乘客——这种“充满”的概念与概率中称为信息内容的概念直接相关。

为了给“信息内容”提供一些动力和直觉,想象一下这种情况:你生活在一个受降雨量不足困扰的地区,正因为如此,干草和植物物质更容易因太阳暴露的热量而着火——你开始习惯于在当地看到火灾。然而,一天晚上,你突然听到一声的破裂声!天空中,紧接着是一场巨大的火灾爆炸,显然你震惊地意识到这次火灾是由雷击引起的。你从来没有在当地见过闪电!更令人惊讶的是这次看到的是闪电引起的火灾。“惊喜”这个词是该事件的信息内容—在这种情况下,是闪电导致了火灾(而不是太阳的热量+干燥导致了火势蔓延)。惊讶程度很高,因为你没有预料到闪电是一个原因——同样,如果一个事件发生的可能性较低,那么该事件的信息含量就会较高

David MoumUnsplash 上拍摄的照片

照片由张秀坤亲吻上的 Unsplash

我们可以把“局部干旱地区火灾的原因”称为一个变量,一些我们不知道的东西。这个变量有很多值,因为可能有很多原因。其中一些价值(或者称之为事件),比如“一个小火花点燃了该地区成千上万的干焦的草,一场大火蔓延”比“一次突然的雷击导致了大火蔓延”更有可能为了更好地了解这个变量,我们可以平均出具有较高概率和较低概率的值,并得出一个称为该变量的的数字。熵这个数字对于理解决策树如何进行是非问题分裂至关重要。

决策树如何进行分类

还记得我以前说过,你作为决策树分类器的直观目标是挑选“正确”的特征,这样当你沿着树向下做是/否(或真/假)决策时,最后你应该有一个或两个分支,只是纯粹由“死去的乘客”类和另外一个或两个“活着的类”组成?从某种意义上来说,通过问正确的是/否问题——选择正确的特性属性——我们沿着选择的树往下走,使最后一个分支变得纯粹。在决策树中,当我们沿着分支向下行进时,我们想要选择特征来增加类的“纯度”。

现在,如果最终分支包含所有或大部分“活着的乘客”类别,请注意:该分支中“活着的”与“死去的”乘客的比例非常不均匀;还有很多活着的。在雷击类比中,“活着的乘客”类具有“高纯度”——在那个“最终分支”中也被称为“熵”——为什么?因为“活着的”类在那个分支中的可能性要大得多;那里只是有更多的“活级”数据点!以对称的方式,在“死亡类别”数据点的最终分支中,理想地,“死亡”类别的熵也很低,因为该分支纯粹由“死亡乘客”数据组成。因此,我们在决策树中的目标是找到要分割的“正确”特征,这样我们就可以使用对/错问题尽可能降低熵。这种沿着决策树的“降低熵”也被称为“增加信息增益”。之所以这样说,是因为减少树中的熵有助于您获得关于找到正确的分割特征的信息,从而创建一个好的分类器。

很多决策树在一起=随机森林!

既然我们已经对决策树的工作方式有了直观的感受,我们确实需要提到一些事情。决策树非常容易理解(因为你可以从左到右和从上到下阅读它们),但是它们容易过度拟合。当机器学习算法将它们的模型拟合得过于接近数据时,就会发生过度拟合,因此它们不能在测试集上很好地概括。

如何解决过度拟合的问题?嗯,我们不是只看一个决策树,而是看一个集合,比如 10 或 20 个。根据不同决策树的分类,我们让这些树投票。假设我们在医院病历中对糖尿病进行分类。如果我们在数据的随机子集上训练 20 个决策树,对于一个新的未见过的患者记录,15 个树说“是的,这个患者有糖尿病!”只有 5 棵树说“不!”,多数票(就像在民主国家!)默认为患者预测糖尿病。这个对分类进行民主投票的决策树“集合”就是随机森林

在开始 Python 实现之前,我想做一个重要的说明:上面例子中的 20 个决策树是由数据的采样子集训练的;每个决策树都是从不同的随机数据样本中构建的——这被称为 bootstrapping (它来自统计学中的一个术语,称为 bootstrap sampling)——当你需要获得关于你的人口的信息,但你只有一个小样本可以处理时;比如说,一个小型的社区调查。)当我们在随机森林中的 20 棵决策树之间进行“民主投票”时,这被称为聚合——因此结合这两种方法被称为自助聚合,或“打包”如果你想了解更多关于随机森林中“装袋”过程的细节,请查看Medium上的这篇帖子!

如果你想看一个比我在我的帖子中更深入决策树数学的视频——这样你就可以更好地理解信息增益、熵和我们上面讨论的概念——看看 YouTube 频道“StatQuest”的这个精彩视频😃

Python 实现

现在我们已经了解了什么是随机森林和决策树,以及它如何做出决策的一些概念背景,让我们用 Python 来实际实现这个算法吧!

在这个实现中,我将使用来自孟加拉国 Sylhet 的 Sylhet 糖尿病医院的患者的真实数据。这些数据是在去年 2020 年 6 月由 MM Faniqul Islam 博士和其他人收集并发表在这篇研究论文中的(引用如下),并且可以在 UC Irvine 机器学习知识库的这个链接上免费获得。

首先,从存储库中下载 CSV 文件后,您需要导入它。数据集在 Pandas 数据框模块中格式化后,应如下所示:

图片来源:Raveena Jayadev,作者

一旦我们下载了数据,很好的标准做法是将“是”和“否”的答案分别转换成数字格式的 1 和 0。我们可以通过编写以下代码来做到这一点:

binary_dict = {'Yes':1, 'No':0}
gender_dict = {'Male':0, 'Female':1}
DBdata_copy['Gender'] = DBdata['Gender'].map(gender_dict)
for name in DBdata.columns[2:-1]:
    #loop through each column of the dataframe
    x = DBdata[name]
    DBdata_copy[name] = x.map(binary_dict)

无论如何,一旦我们用数字转换了数据,它应该看起来像这样:

图片来源:Raveena Jayadev,作者

我们现在所要做的就是使用 Python 令人敬畏的 Sci-kit Learn 模块中的随机森林分类模型。我们可以像这样实例化分类器:

from sklearn.ensemble import RandomForestClassifierrf_classifier = RandomForestClassifier(n_estimators=20, criterion='entropy', n_jobs=-1)
rf_classifier.fit(X_train, y_train)

注意“RandomForestClassifier”模块中的一个参数:标准。我把criterion =‘entropy’放在这里,这就是我之前在解释随机森林如何选择它们的特征来分裂时谈到的同一个“熵”字。

厉害!一旦我们适合我们的随机森林分类器,我们就可以为森林绘制一个最重要的可视化图:特征重要性。这可以使用 Matplotlib 中的条形图( plot.barh )以及这段代码来完成:rf_classifier.feature_importances_

图片来源:Raveena Jayadev,作者

看起来“多饮”、“多尿”和年龄是随机森林用来对糖尿病进行分类的三个最重要的因素。厉害!

可视化实际决策树

现在有趣的部分来了,这可能是你们所有人一直在等待的:我们将想象这个随机森林中的一棵决策树。为此,首先我们需要包“ graphviz ”。Graphviz 是为决策树开发的可视化工具,您可以使用pip install graphviz安装它,或者,如果您在 Anaconda 环境中,可以使用conda install -c graphviz

w 可以在随机森林中选择一个个体“估计量”——估计量是一棵决策树,并像这样对可视化编程:(这里,我选择的决策树,我称之为“estimator_0”。

estimator_0 = rf_classifier.estimators_[0]tree_estimator = export_graphviz(estimator_0,
                 feature_names=features,
                 class_names=target)# Draw tree
graph = graphviz.Source(tree_estimator, format="png")

决策树是这样的!您应该能够点击图像,并使用附加工具放大它。

图片来源:Raveena Jayadev,作者

让我们看看每个框中的“价值”一词:它是什么意思??当您在根节点上看到类似 value=[149,215]的内容时,这意味着在真/假特征分离之前,149 个样本属于“无糖尿病患者”(阴性)类别,215 个样本属于“有糖尿病患者”(阳性)类别。如果你还记得这篇文章的“信息增益”部分,我提到过决策树的目标是做出“最好的”真/假分裂,所以在树的最底部,我们得到这些“纯”节点,那里只有一种类型的类。这些树并不完美,因此最底部的节点并不总是 100%纯的,但如果你看看上图中的底部,例如:在底部附近的“年龄≤ 39.5,熵=0.8”分裂处,左边蓝色框中的值为[0,2],右边橙色框中的值为[6,0]。这意味着年龄≤39.5 的特征分割足以创建纯节点,在左侧,只有阳性糖尿病患者,在右侧,它是阴性的-这太棒了!如您所见,决策树越往下,分裂成纯节点就越好。

查看决策树中每个节点的“纯度”如何增加的另一种简单、直观的方法是,方框的色调越暗(如深蓝色或深橙色),节点就越纯。请注意,在树的顶部,节点通常是浅棕色/浅蓝色/浅橙色,随着向下,节点的颜色变得更深。

就准确性而言,随机森林做得非常好,因为它们对许多决策树进行平均。决策树本身会过度适应,但作为一个团队,它们会进行大量的多数规则分类。在我们的例子中,随机森林的准确率为 94%,假阴性率为 2.2%,这对于糖尿病检测器来说非常好,因为机器做出假阴性的风险更大,并且对患者撒谎说他们没有糖尿病。

结论

读者们,我希望你们已经对随机森林、决策树以及它们如何做出分类决策有了更好的直观感受。我还希望您已经学习了用 Python 实现代码和解释每个决策树的基础知识。你可以点击查看我的 Github 代码,下载糖尿病数据并导入 graphviz 用于森林的可视化。

下次见!😃

参考文献

  1. Islam,MM Faniqul,等,“使用数据挖掘技术早期预测糖尿病的可能性”(2020),医学图像分析中的计算机视觉和机器智能。新加坡施普林格。第 113-125 页。

硅谷的数据科学家是怎样的?

原文:https://towardsdatascience.com/whats-like-a-data-scientist-in-silicon-valley-d500b338c6e2?source=collection_archive---------14-----------------------

成长和学习让每个有抱负的数据科学家受益

前言

今天在谷歌上搜索数据科学家,或者成为数据科学家需要哪些技能,你会被海量的信息淹没——媒体、LinkedIn、新闻、私人教练网站等等。每个人都告诉我们,数据科学家是 21 世纪广泛需要的职业。成为一名数据科学家需要掌握统计学、编程和机器学习。但是大量的信息真的给我们带来很多价值吗?真正的工业数据科学家在做什么样的工作?

工作是补偿和自我实现的结合。每一个选择都是在这两个维度勾勒出的空间里,找到一个能让我们最大化满足感的点。想成为一名数据科学家,或者想成为一名更优秀的数据科学家,取决于你在工作中能提供什么样的价值,以及你如何在职业生涯中实现自我实现。

德国人说世界是具体的。今天,我将具体谈谈我所熟悉的硅谷科技行业,数据科学家工作的不同要求和技能,如何在这个职位上成长,以及查理·芒格告诉我们的内容

我只想知道我会死在哪里,所以我永远不会去那里

我是一名数据科学家

从 UIUC 毕业后,我加入了微软的硅谷办公室,到现在已经 4 年了。我们组主要负责语言模型,这是微软云平台 Azure 提供的语音识别服务的核心组件。

作为一名数据科学家,这几年我为公司创造了哪些影响和价值?

  • 通过设计和构建深度学习非流利性标记系统,实现了 26.2% 非流利性标记F1-团队得分提高直播字幕& Office 单词听写和 2.54 BLEU 英德翻译得分提高
  • 通过建立第一个基于深度学习的去噪 N-gram 语言模型,改进了 Bing 语音搜索的语音识别准确性和用户体验,实现了 7% 的惊人指标减少和 2%的单词错误率减少
  • 试行了多语言神经网络语言模型26 欧洲地区进行预训练,构建了一体化子词分词器

我的工作更倾向于自然语言处理中的机器学习,这通常被称为 NLP,只是数据科学的一个分支。在硅谷,不同公司和团体所需要的数据科学家和技能是不同颜色的马。在下一章,我会谈到硅谷需要的各种数据科学家。

硅谷的数据科学家有哪些类型?

一般来说,数据科学家有三种职位。

  • 数据分析师
  • 数据工程师
  • 机器学习工程师

首先,这三个岗位需要的技能是不一样的。

  • 数据分析师。负责使用 SQL 和其他语言处理数据,汇总数据,可视化数据统计,得出业务见解,并根据数据分析完成报告。在脸书有一个数据科学家分析赛道,主要负责设计统计实验作为 A/B 测试。例如,我们现在已经设计了一个全新的新闻推荐系统,那么我们如何知道这个新系统是否能够增强用户粘性,帮助我们增加订阅人数以提高收入?在线评估以及一系列的 A/B 测试实验设计和统计分析发挥了作用。
  • 数据工程师。严格来说,这是软件工程师的一个分支,主要针对大型数据基础设施的设计和建设。比如在 Instagram 上,你的每一次浏览、点击,甚至是浏览两个商品的间隔,都是要沉淀到数据系统中的实时用户反馈数据。这些数据可以帮助我们构建用户画像,更精准地推送个性化产品推荐。所有这些大规模在线数据的存储、处理、查询和维护都是数据工程师的工作。
  • 机器学习工程师。负责大规模机器学习系统的设计和开发。需要对机器学习有很好的理解,深度学习,优秀的编程技能,以及,在我看来,最重要的支柱,如何将一个商业问题转化为机器学习问题。设计量化指标来定义问题,大规模收集和处理数据,通过智能算法的迭代优化,实现机器自动决策,提高整体性能。生活中无处不在的推荐系统就是机器学习的典型应用,比如 YouTube 的视频推荐,Spotify 的每日播放列表,亚马逊的商品推荐等等。此外,谷歌助手/Alexa 的智能语音识别和人机交互,机器翻译,智能驾驶辅助,以及在线广告。他们背后是机器学习系统。

其次,在薪酬方面,工程相关岗位普遍高于分析学,这主要是由经济学的基本面理论——供给和需求决定的。相对而言,通过一系列商业软件进行图表可视化的学习曲线低于机器学习和编程,真正有行业经验的人才匮乏。从需求端来看,云计算平台对众多行业的渗透,使得大规模数据的数字化和流体化成为可能,数据智能化的快速扩张增加了这方面的人才需求。

机器学习工程师> =数据工程师>>数据分析师

当然,SDE 是硅谷最需要的。在很多产品中,机器学习都是锦上添花。比如我们都用 Zoom 来开视频会议。机器学习提供的一些功能将有助于改善用户体验和客户粘性。但是,从第一原理思维出发,我们首先需要一个低延迟、无障碍的视频通信软件。当然,我知道如今许多新产品和服务完全基于数据智能。他们建立工程系统,收集实时用户行为数据,通过迭代机器学习推动智能系统,吸引更多用户,聚集更多数据,推数据的飞轮->模型->产品,比如抖音。一般来说,工业中的机器学习本质上是工程问题,不完全是科学问题。关于这部分,我会在以后的博文中给你一些具体的例子。

数据科学家需要具备哪些技能?

图片由李妙拍摄

上面的技能树包含了我认为的数据科学家必备的硬技能,根据不同岗位的需求会有不同的侧重。当然,硬技能并不是在现实世界中成功的全部。要真正成长,软技能更重要。如何与同事沟通,如何协作,如何写邮件,如何讲好自己所做的事情,如何展现领导力,如何管理自己甚至直接经理,如何扩大自己的影响力等等。这些都是我每天不断反思和不断学习的领域。我会在以后的博客中分享更多我的想法。

在访谈中,一般从以下四个方面考察被访谈者

  • 编码:Python(算法/数据结构)+ SQL
  • 机器学习系统设计
  • 甲乙测试设计+统计
  • 恢复项目

作为数据科学家有哪些不该做的事?

1。不要认为算法是唯一的。

在很多已经有机器学习的成熟产品中,短期内不太可能通过构思一个全新的算法来突然提升产品性能。这样的机会存在于传统机器学习向深度学习的过渡中,尤其是在数据规模巨大的产品中。或者从长远来看,我们可以期待每五年一次的算法突破时刻。但在许多现实情况下,真正帮助我们提高系统性能的是数据,即经过正确处理的新信息带来的价值。

我们生活在一个计算能力和通用算法像水和电一样是基础设施的时代。有了云服务,每个人都可以轻松利用机器学习,构建自己的数据产品。精确而新颖的数字化数据是你工作的核心,这些数据过去没有被挖掘出来。

2。不要忽视真正的业务需求!

我们可以花很多时间来建立一个深度学习模型,这个模型提高了 1%的离线度量。但是,这线下的 1%未必转化为线上的评价,对真实的业务需求没有任何帮助。如何将真实的业务需求转化为数据+机器学习的解决方案,如何用最终的业务目标校准我们的模型训练目标,是我们在工作中首先需要思考的事情。

3。不要忽略全局。

如果你只是被困在自己的项目中,对产品的大局没有把握,首先你会失去发现新增长点的机会,其次你付出的努力的边际回报也会大打折扣。如果某个线下指标提高了 1%用了 6 个月,而这 1%的提高没有人太在意,那么这个项目的投资回报率就是深谷了。总方向的不断思考,赋予我们寻找处女地的力量,让我们从 0 到 1 不断领先。

下一步是什么

这是我作为数据科学家的第一篇反思文章。接下来的系列将讨论更多关于机器学习算法的内容,什么是真正的机器学习系统,我(痛苦的)LeetCode 练习,以及我每天在工作中学到的新东西。

欢迎关注我的个人博客www.thelimiao.com!以后我会更多地分享我的学习和成长。

敬请期待

JPEG 丢失了什么?

原文:https://towardsdatascience.com/whats-lost-in-jpeg-e5e6e80b1f94?source=collection_archive---------30-----------------------

实践教程

从头开始有损图像压缩

作者图片

当我第一次拿到相机时,我拍摄的所有照片都是 JPEG 格式的。然而,一旦我开始在网上查看摄影教程和博客帖子,所有严肃的摄影师都以 raw 图像格式拍摄,JPEG 被认为是次等的。我的 JPEG 图像文件也只有 raw 的一半或四分之一或更小,这让我相信 raw 格式捕捉到了更多的信息。但我也在想:JPEG 到底缺了什么?

在这篇文章中,我将用 Python 复制 JPEG 压缩过程中的有损部分,使用公共库(实际压缩中通常只有 Numpy 和 Scipy),包括色度子采样、离散余弦变换和量化。JPEG 还进行一种称为熵编码的特殊编码,以使文件更小,但它不会影响最终图像的质量,因为压缩是无损的。我不会在这里介绍熵编码,因为在这个阶段没有信息丢失。

原始文件预处理

原始图像文件包含来自数码相机传感器的最低限度处理的数据,通常它与相机传感器的“视觉”最为接近。为了处理和操作原始图像数据,我们将把图像转换成一个 Numpy 数组。

注意文件扩展名。ARW 是索尼相机特有的,还有许多其他的扩展。还要注意,文件大小超过 25MB,我的相机有 2400 万像素。

在这里, rawpy 库完成了读取图像和元数据的繁重工作,并将其后处理成一个具有三个颜色通道(RGB)的图像数组。然后我使用 OpenCV 将图像转换到 YCrCb 颜色空间。这个特定的色彩空间具有一个亮度分量(Y)和两个色度分量(Cr 和 Cb ),亮度分量是像素的亮度,色度分量表示颜色。使用 YCrCb 优于 RGB 的优势在于,我们可以对亮度和色度分量使用不同的压缩级别,因为我们的眼睛对亮度比对色彩饱和度更敏感。像素值也以 0 为中心,为以后的计算做准备。

YCrCb 颜色空间的不同通道。Cr 和 Cb 是红色和蓝色的差异成分,其中较亮的像素表示更强烈的颜色。照片中的蓟花有明亮的紫色,这是红色和蓝色的组合,因此是 Cr 和 Cb 通道中的亮点。

向下采样

知道我们在亮度通道中看到更多细节,我们将在水平和垂直方向上以因子 2 对两个色度分量进行下采样(也称为色度子采样)。为此,我们将计算四个相邻像素的平均值,并用平均值覆盖它们。如果您熟悉神经网络中的池化,这本质上是一个具有 2x2 内核的平均池化操作,但没有减少图像维度。

上面的代码很慢,尤其是在下采样比为 4:2:0 的情况下使用双循环时。我们可以使用 Scipy 来加速它,因为它相当于步长为 2 的 2D 卷积(在每个元素乘法后跳过 2 个像素),并且相等的内核权重总和为 1。

将函数包装在一个类中,这样如果 ratio 参数不变,我们就可以重用一个实例。convolve2d 函数没有 stride 参数,所以我将跳过结果矩阵中的每隔一个条目。同样重复这些元素,以便输出与输入具有相同的维数。

如上所述,我们将仅对色度分量进行下采样:

色度二次采样示例,请注意,我们通过取平均值丢失了一些颜色变化。

块分裂

在进行下一步之前,我们需要将所有通道的图像分割成 8×8 的块,如果维数不能被 8 整除,则应用必要的填充。

正向操作分割输入图像,并返回块以及一组索引,用于以后的重建。向后操作将块连接回以形成图像,并从向前传递中移除填充。

离散余弦变换和量化

你能在多大程度上区分绿色的深浅?在一张树的照片中,我们只用了 5 种不同的色调,而不是 20 种不同的绿色,你还能分辨出这是一张树的照片吗?亮度的变化也是如此,如果我们使用更少的级别,我们可能无法分辨出差异。

来自 XKCD 色彩调查,我们如何命名色彩。

这是量化的主要动机,我们将相同颜色或相似亮度级别的阴影放在一起,只使用一个值来表示整个桶。我们将在频域而不是空间域中这样做,因为在一个域中难以解决的问题在另一个域中可能更容易解决。在我们的例子中,并不总是很容易说出哪种红色应该被组合在一起,或者我们应该在橙色和黄色之间划一条线。

离散余弦变换

我们将使用二维 DCT 将我们的 8×8 块转换成频率。这意味着我们将试图把亮度或色块表示为各种余弦函数的和。形式上,

2D DCT 来自维基百科

这里,输入是来自图像通道(Y、Cr 或 Cb)的 8×8 块,输出是相同大小的 DCT 系数矩阵。我们可以使用循环手工编码:

当然,Scipy 中有一个 DCT 函数,它可以更有效地进行计算。二维版本相当于沿一个方向应用 DCT,然后再沿另一个方向应用。

这里使用“正交”或标准正交范数,使其与公式中的归一化标量保持一致。

一个示例块可能如下所示:

左边是 8×8 像素的输入,右边是四舍五入到两位小数的 DCT 系数。

注意,DCT 矩阵的第一个条目(左上角)比其余的条目大很多。这被称为 DC 系数,它反映了输入块的最显著特征。其他系数称为交流系数。

量化

现在我们有了一个块的频率表示,我们可以将频率组合在一起,减少可能信号的数量。为此,我们将一个块按元素划分为一个相同维数的矩阵,称为量化矩阵,然后将结果四舍五入为最接近的整数。

摘自 ImpulseAdventure 的量化矩阵示例。左边是亮度分量的量化矩阵,而右边是色度分量的矩阵。

因为我们对亮度通道的细节比对颜色通道的细节更敏感,所以我们可以使用单独的量化矩阵。随着研究的深入,量化矩阵的值也逐渐变大。回想一下,DC 系数位于左上角,将其除以一个较小的数会使其四舍五入为最接近的整数时不太可能为 0。另一方面,除以较大的值会将较高的频率归零。量化矩阵中的值也控制压缩比;如果我们想要更大的压缩,我们可以使值更大,这样当舍入时,大部分块将是 0。

使用上面的示例块(来自 Cr 通道),除以色度量化矩阵并舍入到最接近的整数,得到:

左图是量化矩阵的除法结果,右图是四舍五入到最接近整数的矩阵。

在这种特殊情况下,我们实际上只保留整个块的 DC 系数。

解码

我们已经完成了压缩,需要将频域中的这些块转换回图像。要做到这一点,我们基本上只需反向执行每个步骤。

首先,我们将块乘以相应的量化矩阵。请注意,我们在这里丢失了一些信息,因为一些系数被四舍五入为 0。然后,我们对块应用逆 DCT,以将它们变换回空间域。

2D 逆 DCT 来自维基百科

我们可以再次利用 Scipy 中的 DCT 函数,这一次将 type-III DCT 的“Type”参数指定为“3 ”,这是(Type-II) DCT 的逆运算。

以下是将量化矩阵相乘并反转 DCT 后的量化效果示例:

后加工

使用上面的块分割部分中的 ImageBlock 类的向后操作,我们可以将这些压缩的块重新排列成一个图像。我们还需要取消居中,将图像转换回 RGB 颜色空间,然后将其保存为 JPEG 文件。

以下是最终结果:你能看出区别吗?

当你放大时,蝴蝶上会有一些压缩伪影(黑点)。

熵编码

简单说说熵编码;这是量化后 JPEG 的关键部分,其中图像数据以非常紧凑的方式编码,以使文件更小。它不是在我们的图像矩阵中存储每一个值,而是只存储非零条目,并计算它们之间的 0 的数量。因为我们的矩阵量化后是稀疏的,这是非常高效的。此外,只有位表示而不是实际值被写入文件。用于以比特表示矩阵条目的技术被称为霍夫曼编码,实现起来相当繁琐(完全可以是一篇独立的文章)。我只想重申,这是一种无损压缩,因此在熵编码中不会丢失任何信息。

结论

我最终的 JPEG 图像(使用熵编码)大小略大于 1MB,比我们开始时的 25MB 小了很多。当然,在文件大小和图像质量之间有一个权衡,但是如果你有足够的百万像素,并且你没有放大细节,JPEG 文件看起来就很好。同时,由于 SD 卡现在很便宜,如果有人想要我的照片的真人大小的照片,我想保持最高的质量,我将继续以 raw 拍摄:)

一如既往,GitHub 上的全部代码。

人工智能偏见的辩论中缺少了什么

原文:https://towardsdatascience.com/whats-missing-in-the-ai-bias-debate-a5d654809a3c?source=collection_archive---------47-----------------------

公平和偏见

关于人工智能偏见的争论经常忽略一个重要的问题:人工智能应该首先用于给定的决策吗?

照片由希拉·墨菲Unsplash 上拍摄

幸运的是,人工智能(AI)中的偏见最近受到了很多关注。然而,从关于有偏见的人工智能的故事中产生的大部分辩论是关于如何修复数据,使它们不再有偏见,或者固有的可解释的机器学习模型是否应该用于更复杂的模型(例如[1])。很少讨论是否应该首先使用基于机器学习的工具来做出给定的决策。在这篇文章中,我提出了一些问题,你可以问自己,以确定你是否应该使用机器学习来解决手头的问题。

不适合人工智能的决策

让我举几个例子,这些例子应该让我们问“人工智能应该用于这些决策吗?”在我看来,答案应该是“不”

为面临家庭虐待风险的儿童分配风险分值

2018 年,两个城市的丹麦社会工作者开始使用基于机器学习的工具来支持他们关于是否将孩子从父母身边带走的决定。机器学习模型为其他公共部门员工通知的儿童分配了一个风险分数。在发现机器学习模型存在缺陷后,该模型被停产之前,该模型评估了 200 份关于儿童惊人行为的通知。事实证明,该算法具有高度的年龄偏见,因此,除了年龄之外,所有输入特征都相同的两个孩子会得到不同的分数,年龄较大的孩子被赋予更高的风险分数[2]。

你为什么想用人工智能来做这个风险评估?人类更善于理解因果关系[3],之前已经发现社会工作者完全有能力在没有机器学习模型“帮助”的情况下自己做出决定[4]

预测成绩

“2020 年,英国许多成绩优异的学生受到了一种标准化算法的惩罚,该算法旨在预测新冠肺炎疫情 A-level 考试的成绩。为了匹配历史分布,该算法提高了小型私立学校的预测分数,降低了大型公立学校的分数,这些学校在历史上培养了更大比例的黑人、亚裔和少数族裔(BAME)学生。结果,与同龄人相比,BAME 和贫困学生不成比例地看到他们的预测成绩下降。”[5,第 3 页]

为什么不让更擅长评估学生学术能力的老师来做这项工作呢?对于几个小时的额外工作,你可以消除大量学生被不公平评估的风险。的确,老师的评价也会有偏差,但至少这种偏差不会大规模存在。

预测一个人是否会再次犯罪

在美国,当局使用一种名为“替代制裁的罪犯管理概况”的所谓风险评估工具,根据估计的被告重新犯罪的可能性对其进行分类。有人认为该模型存在种族偏见[6],尽管这一发现受到质疑[7]。

为什么你想用人工智能来预测一个人是否有违反假释条款的风险?这并不意味着它有巨大的成本节约潜力,尽管它可以消除单个法官做出偏见决定的风险,但该模型是根据已经被人类偏见和几个世纪的种族主义污染的历史数据进行训练的。

问是不是应该,不是可能

在我看来,在上述情况下使用人工智能的决定更多地受到问题“我们能使用人工智能来做出这些决定吗?”我们应该用人工智能来做这些决定吗?”。

下面,我提出了一些问题,可以帮助确定是否应该使用人工智能来做出一个给定的决定。

  • 人类能以合理的成本水平同样出色地做出决策吗?使用一种算法来确定地图上两点之间的最短路径是非常合理的,因为人类需要不合理的时间来完成这项工作。然而,使用一种算法来预测累犯是没有意义的,因为算法在这项任务上的表现还不够好,不足以抵消使人类偏见永久化的风险[8]
  • 这个决定对一个人的生活有重大影响吗?虽然打翻花瓶的自动吸尘器可能会给花瓶的主人带来一些不便,但与造成人身伤害的自动车辆事故相比,这种决定对人类生活的影响就相形见绌了。
  • 这个人工智能用例的好处是否大于风险?如果在某个时候我们有了完全自动驾驶的汽车,它们可能会不时伤害人类,但它们可能不会像人类司机那样频繁。

以下是显示为流程图的问题:

“我是否应该使用人工智能来解决这个问题”流程图

如果您认为人工智能应该用于您的决策问题,则可以考虑标准保健因素来回答人工智能是否能够解决问题,例如数据质量、模型性能、风险和概念漂移的缓解等。

虽然上面列出的问题并不全面(甚至可能不正确),但我相信它们是一个很好的起点。通过问“我们应该用人工智能来做这个决定吗?”来开始你的人工智能项目我们可以减少一些对人类未来做出不公正决定的风险,并避免浪费资源来构建人工智能,以做出人工智能不适合的决定。请让我知道你的想法。

参考文献

[1] C. Rudin,停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型 (2018),作者 2019 年自然机器智能文章的预发布版本。较短的版本发表在 NIPS 2018 机器学习趋势批判和纠正研讨会上。在十字路口网上研讨会上也扩展了 NSF 的统计数据

[2] F. Kulager,什么是算法? (2021),Zetland.dk

[3] J. Pearl,D. Mackenzie,原因之书:因果的新科学 (2018)。纽约:基础书籍。

[4] Blinde Vinkler,第 10 集:AI I jobcentrene—hjlpende eller stemplende?(2021).https://soundcloud . com/IDA-blinde-vin kler/ai-I-jobcentrene-hjaelpende-eller-stemplende

[5]沃希特,米特施塔特,拉塞尔机器学习中的偏见保持:欧盟非歧视法下公平指标的合法性 (2021)。沃希特、桑德拉和米特斯塔特、布伦特和拉塞尔、克里斯,《机器学习中的偏见保持:欧盟非歧视法下公平指标的合法性》(2021 年 1 月 15 日)。西弗吉尼亚州法律评论,即将出版,可在 https://ssrn.com/abstract=3792772或 http://dx.doi.org/10.2139/ssrn.3792772 的获得

[6] J. Angwin,J. Larson,S. Mattu 和 L. Kirchner,机器偏差 (2016)。ProPublica.org。

[7] C. Rudin,C. Wang,B. Coker,再犯预测中的保密与不公平时代 (2018)。哈佛数据科学评论 2(1)。

[8] M .朱,《一个算法陪审团:利用人工智能预测再犯罪率》,(2020)。耶鲁科学。

什么是 MLOps?

原文:https://towardsdatascience.com/whats-mlops-5bf60dd693dd?source=collection_archive---------23-----------------------

大规模管理复杂的 ML 系统

约翰·巴克利在 Unsplash 上拍摄的照片

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

机器学习(ML) IT 运营(Ops)旨在将 DevOps 推广的工程文化和实践应用于 ML 系统。但是为什么呢?

  • 创建一个 ML 模型是容易的部分——操作化和管理 ML 模型、数据和实验的生命周期是事情变得复杂的地方。事实上,超过 87%的数据科学项目从未投入生产[1]
  • 人工智能驱动的组织正在使用数据和机器学习来解决他们最困难的问题,并正在收获巨大的利益。但是如果管理不当,ML 系统会产生技术债务

🚣🏼我们是如何来到这里的

数据科学和 ML 正在成为解决复杂现实世界问题、改变行业和在许多不同领域提供价值的筹码。在过去的 5-10 年中,该领域的最新进展加快了 ML 系统的主流采用,因为以下必要的“成分”更容易获得:

  • 大型数据集
  • 廉价的按需计算资源
  • 各种云平台上的专业 ML 加速器
  • 不同人工智能研究领域的快速发展(如计算机视觉、自然语言理解和推荐人工智能系统)

因此,许多企业正在投资于他们的数据科学团队和 ML 能力,以开发能够为其用户提供商业价值的预测模型。

数据科学家可以很容易地在本地机器上构建一个 ML 模型,该模型在单独运行时表现得非常好。这意味着真正的挑战不是构建一个 ML 模型,而是构建一个集成的 ML 系统并在生产中持续运行它。如下图所示,ML 代码只是运行 ML 系统所需的一小部分。

图一。生产中 ML 系统的要素。作者插图,改编自机器学习系统中隐藏的技术债务[2]

它是图中所需的“其他 95%”的庞大而复杂的周围组件。要开发和操作这样的复杂系统,您可以将 DevOps 原则应用于 ML 系统(MLOps)。

🥜为什么 ML 模型部署具有挑战性?

有许多因素使得大规模部署 ML 模型非常具有挑战性,但简而言之:

  • 代码——迎合用于构建模型的不同 ML 库、框架和编程语言。它们并不总是能很好地相互作用,包版本的变化和其他的相互依赖会破坏你的管道。Kubernetes 等现代容器化技术可以解决将代码移入生产环境时的可移植性和兼容性问题,但可再现性也是一个挑战。数据科学家可能会构建特定模型的许多版本,每个版本都有不同的编程语言、库(或同一库的不同版本)——很难手动跟踪这些变化。
  • 计算-训练、重新训练和提供来自 ML 模型的预测的过程可能是计算密集型的。为了在生产中快速服务,需要昂贵的硬件,这可能需要巨大的资本投资。当需求激增时,基于云的服务可以开始解决快速扩展的经济性和能力问题。但是仍然需要维护模型的性能和准确性。

💸‘技术债’呢?

技术债务就其本身而言是一个复杂的话题,并且更广泛地适用于一般的 IT 系统。但我会尝试在这里给你一个“10,000 英尺的视角”,以及它与 ML 系统的关系。

简而言之,技术债务是一种随着时间的推移可能会无意中发生的现象,它会导致工程成本增加,从而对产品开发速度、质量和工程团队满意度产生负面影响。它可以被引入到系统中(不同的版本或其组合部分),因为它们的实现方式会导致:

  • 与系统目标相比质量较低,
  • 与系统的目标相比额外的复杂性,
  • 与系统目标相比的额外等待时间,
  • 或者上述的任何组合

呆伯特·斯科特·亚当斯。经 ANDREWS MCMEEL SYNDICATION 许可使用。保留所有权利。

ML 系统可能会加剧技术债务,因为它们结合了传统的 IT 系统,在传统的 IT 系统中,行为由代码和数据定义。例如,ML 模型的性能在很大程度上依赖于它们被训练的数据。如果不加以检查,训练数据中的变化可能会产生依赖性,这种依赖性具有类似的积累债务的能力,这种能力也可能来自代码的复杂性。更糟糕的是,与代码中有明确定义的方法相比,确定数据依赖关系更具挑战性。

虽然没有灵丹妙药可以克服 ML 系统部署的困难,同时减少技术债务的负担,但在您的组织中建立 MLOps 文化是一个很好的起点。

🙇🏻‍♂️·德沃普斯对姆罗普斯

与 DevOps 一样,MLOps 是一种 ML 工程文化和实践,旨在统一 ML 系统开发(Dev)和 ML 系统运营(Ops)。与 DevOps 不同,ML 系统对持续集成和持续交付(CI/CD)等核心 DevOps 原则提出了独特的挑战。

ML 系统不同于其他软件系统的主要方面:

  • 持续集成(CI)不仅仅是测试和验证代码和组件,还包括测试和验证数据、数据模式和模型。
  • 连续交付(CD)不仅仅是关于一个单独的软件包或者一个服务,而是一个系统(一个 ML 训练管道)应该自动部署另一个服务(模型预测服务)。
  • 连续训练(CT)是 ML 系统独有的新特性,它涉及自动重新训练候选模型以进行测试和服务。
  • 持续监控(CM)不仅仅是捕捉生产系统中的错误,还包括监控生产推断数据和与业务成果相关的模型性能指标。

图二。综合考虑ML 系统组件和 MLOps 流程的组合。作者插图

实践 MLOps 意味着您倡导 ML 系统构建的所有步骤的自动化和监控,包括集成、测试、发布、部署和基础设施管理。

👷🏾‍♀️:那我该如何开始呢?

这篇文章的目的是解释 MLOps 的“为什么”和“是什么”。如果这篇文章中描述的任何挑战引起了共鸣,你可能会考虑“如何”在你的组织中部署 ML 系统,这里有一些明智的出发点:

  • 认真考虑大规模培训和部署 ML 模型的云优先战略。如果您已经有了一个,请评估您当前的提供商是否提供了合适的工具和最佳的用户体验来支持 MLOps
  • 不要重新发明轮子——例如,在 Kubernetes 上运行 ML 系统也需要熟悉容器、包装、缩放、GPU 等知识。然而,有云就绪的开源解决方案,如 Kubeflow 利用了 Kubernetes 的优势,但消除了部署的头痛,并为大规模管理复杂的 ML 系统提供了一个框架

您可以在网上找到大量信息,有许多详细的文章和出版物深入探讨了如何迁移到全自动 MLOps 环境。我可以强烈推荐“机器学习设计模式:数据准备、模型构建和 MLOps 中常见挑战的解决方案”

📇参考

[1] VB 工作人员,为什么 87%的数据科学项目永远无法投入生产(2019),Venture Beat

[2] D .斯卡利、加里·霍尔特、丹尼尔·戈洛文、尤金·达维多夫、托德·菲利普斯、迪特马尔·埃布纳、维奈·乔德里、迈克尔·杨、让-弗朗索瓦·克雷斯波、丹·丹尼森,《机器学习系统中隐藏的技术债务》(2015 年),《神经信息处理系统进展》第 28 卷(NIPS 2015 年)的一部分

📚进一步阅读

“为什么机器学习模型在生产中崩溃和烧毁”

https://www . Forbes . com/sites/forbestechcouncil/2019/04/03/why-machine-learning-models-crash-and-burn-in-production/?sh=604afc8f2f43

Python 3.10 的新特性–您应该尝试的 4 个惊人特性

原文:https://towardsdatascience.com/whats-new-in-python-3-10-4-amazing-features-you-should-try-4f3044871476?source=collection_archive---------5-----------------------

从更好的上下文管理器到 Switch 语句——这将是一个大问题。

泰勒·拉斯托维奇Unsplash 上拍摄

随着 Python 3.10 目前进入 alpha 版本,值得看看令人兴奋的新特性。今天,我们将探讨最重要的四个,并简要提及一些小的修复和更改。

免责声明 : Python 3.10 还没有准备好投入生产,所以把它作为默认的 Python 解释器安装可能不是一个好主意。

这篇文章的结构如下:

  • 更好的错误消息
  • 结构模式匹配(Switch 语句)
  • Union 运算符
  • 更好的上下文管理器
  • 最后的想法

更好的错误消息

Python 中的错误消息有时会令人沮丧。Python 3.10 改变了这一点。对语法、缩进、属性和名称错误进行了改进。

下面我们来探究几个。

情况 1 —字典未关闭:

图 1 —未关闭词典的语法错误(作者提供的图片)

案例 2 —无效字符串文字:

图片 2-无效字符串文字的语法错误(图片由作者提供)

案例 3——块前缺少::

图 3-块前缺少冒号的语法错误(作者提供的图片)

案例 4 —不合适的缩进:

图 4 —缺少缩进级别的缩进错误(作者提供的图片)

您可以自己进一步探索,但是改进的错误消息应该可以节省一些调试时间。

结构模式匹配(Switch 语句)

是时候了。

Switch 语句在大多数编程语言中都很常见,它提供了一种更简洁的实现条件逻辑的方式。当有很多条件需要评估时,它们就派上用场了。

让我们使用结构模式匹配来编写一个简单的函数— get_mood(day: str) -> str,它返回一个值取决于输入参数的字符串。随着周末的临近,返回值变得更加令人兴奋。愚蠢的小功能,但可以用于演示目的:

简而言之,结构化模式匹配将提供一种更整洁的方式来组织您的代码,并避免一堆 if-else 语句。概括一下:

  • 使用case关键字来评估条件(case ‘Monday’if day == ‘Monday’相同)
  • 使用管道操作符|分隔多个条件,例如,如果两个输入值应该产生相同的返回值
  • 使用下划线运算符— _ —指定默认大小写。

Union 运算符

类型提示是一个东西。您可能知道,Python 不要求您在声明变量时指定变量的数据类型,而是提供了一种可选的方法。

然而,糟糕的是声明一个接受整数或浮点数的函数。如何指定数据类型?在 3.10 版本之前,你可以使用Union操作符。

长话短说,用类型提示声明一个返回一个数的平方根的函数如下所示:

从 Python 3.10 开始,一定会有更好的解决方案,而且确实有。您可以完全抛弃Union操作符,用管道操作符|分隔潜在的数据类型。这里有一个例子:

现在干净多了,不是吗?

更好的上下文管理器

上下文管理器的概念在 Python 3.10 中并不陌生。新的 Python 版本允许在上下文管理器( source )中使用圆括号来延续多个文本行。

让我们看一个例子。我有两个 TXT 文件:

  • first_file.txt —包含“这是第一个文件”
  • second_file.txt —包含“这是第二个文件。”

我们现在将使用上下文管理器来打开和处理这两者的内容。代码如下:

相应的输出如下所示:

图 5 —上下文管理器输出(作者提供的图片)

如您所见,您现在可以以一种更有条理的方式管理多个文件。这不是一个革命性的特性,但绝对值得拥有。

最后的想法

我必须说,自从 3.6 版本引入 f 字符串以来,我还没有对新的 Python 版本如此兴奋过。这四个不会彻底改变我写 Python 代码的方式,但肯定会使一些事情变得更简单、更有条理。

今天的文章只涵盖了主要的新特性,因此请参考官方文档以获得完整列表。

你最喜欢的 Python 新特性是什么?

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

了解更多信息

保持联系

Python 3.10 有什么新特性?

原文:https://towardsdatascience.com/whats-new-in-python-3-10-a757c6c69342?source=collection_archive---------0-----------------------

最酷功能的概述

图案由亚历山大蚁上展开

P ython 3.10 截至 2021 年 10 月 4 日发布!你可以在这里下载最新版本

我们将介绍 Python 中一些最有趣的新增内容——结构化模式匹配、带括号的上下文管理器、更多的类型,以及新的和改进的错误消息。

点击这里查看文章的视频版本:

结构模式匹配

结构模式匹配是 Python 中一个不可思议的特性——真的很棒。

想象一个如下所示的 if-else 语句:

Python 3.9 中的 If-else 逻辑

你拿着它,修改语法,使它看起来更像这样:

Python 3.10 中的大小写匹配逻辑

这是新的match-case说法——很酷,但目前为止没什么特别的。

match-case语句如此有趣的是一种叫做结构模式匹配的东西。

结构模式匹配允许我们执行相同的匹配用例逻辑,但是基于我们的比较对象 结构 是否与给定的 模式 匹配。

所以让我们定义两个字典,两个都有不同的结构。

我们定义 dict_adict _ b——两者包含相似的信息,但是在不同的字典结构中

现在,我们可以像这样写一个模式来匹配dict_a:

字典 _a 的模式

还有一个模式来匹配dict_b:

dict_b 的模式

如果我们将这两者放在一个匹配案例语句中,加上实际上是一个else/包含所有内容的case _——我们得到:

我们循环遍历 dict_adict _ b——由于结构模式匹配,两者都在我们期望的地方匹配

很酷吧?我已经发现这对于数据处理非常有用——你可以在15:22 处的视频中找到一个例子。

带括号的上下文管理器

一个较小的变化源于 Python 3.9 中出现的一个更大的变化——新的基于 PEG 的解析器。

以前的 Python 解析器有很多限制,这限制了 Python 开发者可以使用哪些语法。

Python 3.9 的基于 PEG 的解析器消除了这些障碍,从长远来看,这可能会导致更优雅的语法——这种变化的第一个例子是新的带括号的上下文管理器

在 Python 3.9 之前,我们可以编写类似这样的代码来打开两个(或更多)文件 I/O 流:

在新的解析器之前,如果两个上下文管理器都在同一行上,我们只能使用两个上下文管理器

第一行很长,事实上太长了。但是由于解析器的限制,我们将这一行拆分成多行的唯一方法是使用\行继续符:

或者,我们可以使用行继续符 **

可以用,但不是 Pythonic。有了新的解析器,我们现在可以使用括号将这一行拆分成多行,如下所示:

有了新的解析器,并且从 Python 3.10 开始正式支持,我们现在可以用括号括起我们的上下文管理器

哪个蟒。

现在,在我们继续之前——在这个特性中有一个小小的奇怪之处。这并不是全新的…

如果我们写:

尽管直到 Python 3.10 才被“引入”,但由于新的 PEG 解析器,CPython 接受了新的语法变化——所以我们有了一个完全兼容 3.9 的新特性

在 Python 3.9 中,这是可行的。这是因为新的解析器支持这种语法,尽管直到 Python 3.10 才正式支持https://docs.python.org/3.10/whatsnew/3.10.html#parenthesized-context-managers

更多打字

Python 的类型特性也有更多的更新,如果你感兴趣,我在这里写了更多的细节。

很容易,这里最有趣的添加是包含了一个新的操作符,它的行为类似于类型的逻辑,这是我们之前使用Union方法做的:

3.9 中类型的联合方法

现在,我们不需要写from typing import UnionUnion[int, float]已经简化为int | float——看起来干净多了:

3.10 中类型的联合运算符

更好的错误消息

告诉我你第一次看的时候没有直接跳到谷歌上:

*SyntaxError: unexpected EOF while parsing*

在谷歌上输入语法错误的第一个结果表明,我们中的许多人在某个时候确实如此。

解析时出现意外的 EOF 这是一种简单而优雅的方式,说明我们遗漏了一个括号

这不是一个明确的错误消息,Python 充满了不太理想的错误消息。幸运的是,有人注意到了——并且这些信息中的许多已经得到了显著的改进。**

**

缺少带 3.9(左)和 3.10(右)的括号— 点击此处查看包含所有三种对比的笔记本

**

3.9 和 3.10 中未闭合的字符串

**

在 3.9 和 3.10 中使用赋值运算符,而不是比较运算符

官方变更列表中提到了更多的变更,但在测试中似乎没有显示出来,包括:

*from collections import namedtoplo> AttributeError: module 'collections' has no attribute 'namedtoplo'. **Did you mean: namedtuple?***

这里,AttributeError与之前相同,但是增加了一个建议的属性名称— namedtoplo被识别为属性namedtuple的潜在错别字。

同样,我们看到NameError消息也有同样的改进:

*new_var = 5
print(new_vr)> NameError: name 'new_vr' is not defined. **Did you mean: new_var?***

错误信息还有很多其他的更新!在这里把它们都检查出来

因此,它们是 Python 3.10 引入的一些关键新特性!

完整版于 2021 年 10 月 4 日发布,在过去的几个月中,所有的功能都在几个预发布版本中可用(因此这篇文章!).

如果你想自己看看,3.10 可以从这里下载。

我希望你喜欢这篇文章!如果你有任何问题,请通过 Twitter 或在下面的评论中告诉我。如果你想要更多这样的内容,我也在 YouTube 上发了帖子。

感谢阅读!

🤖《变形金刚》NLP 课程 70%的折扣

*所有图片均由作者提供,除非另有说明

今年夏天数据科学学了什么新东西?

原文:https://towardsdatascience.com/whats-new-to-learn-in-data-science-this-summer-5d76f3e0047a?source=collection_archive---------21-----------------------

技术和商业的未来是数据:我们如何保持相关性!?

迈克尔·D·贝克与在 Unsplash 上的合影

在当今快速发展的世界中,技术在不断发展。我们正以前所未有的速度发展。我们一次又一次地阅读这些统计数据,世界上大约 90%的数据是在过去的一两年中产生的,其中不到 10%的数据正在被分析。

全球的科技爱好者都在朝着数据科学家和分析师这一被称为“最性感的工作”的光荣职业迈进。话虽如此,但在适应工作要求时,我有不同的观点。每个人都想成为数据科学家,但在从学校或项目毕业 86 天后才意识到自己是数据科学通才——一只无所不能的独角兽。

数据科学已经存在。

一份 Dice 报告称,2020 年医疗保健、电信、媒体、银行、娱乐、金融服务和其他领域对数据科学家的需求平均增长 50%。

在这个蓬勃发展、要求过高的技术世界中,我相信作为数据科学家,我们应该为自己创造独特的价值主张。说,
' 用数据说书'
' 用数据创造人性化分析'
'数据&金融奇才'

今年夏天,我开始探索在数据领域还需要学习什么,以增加我的知识面,并赋予我独特的技能。我希望能找到一些文章/博客,让我先睹为快。我最终阅读了许多博客,并记录了我的发现。

这里有一些概念、工具和技巧,我觉得这一季很有意思!

1.谷歌汽车

Google Cloud suite 中的 Google AutoML 旨在以最少的努力和机器学习专业知识来训练高质量的定制机器学习模型。有一种关于 AutoML 的误解,认为它是完全的数据科学自动化。然而,仔细看看,AutoML 只是自动化了数据科学的机器学习和调整部分——也就是说,数据科学的一部分。

Google Cloud AutoML 不是从零开始建立模型并使用数据训练它们,而是为自然语言分类、图像分类或语言对翻译等多种应用实现其高精度、自动深度学习和神经架构((意味着它从现有的在其他数据上训练的深度神经网络开始,并找到额外网络层的正确组合),

学习 Google AutoML 的成果:

  1. 执行自动数据清理和预处理
  2. 预测自变量与目标变量的关系
  3. 选择和构建最佳特征的特征工程
  4. 用超参数选择最佳模型
  5. 分析和调整结果

2.云数据仓库

当我们想到云上的数据时,我们会想到将我们的文件和数据存储在由云提供商维护的服务器上,而不是(或者同时)存储在我们自己的本地系统(内存)上。

2020 年,全球云计算市场价值 3714 亿美元,据估计到 2025 年将上升到惊人的 8321 亿美元。随着企业专注于数字革命并转向包括更多云技术,重点是将遗留数据库转变为云。

在数据科学方面,云数据仓库为快速、高度可扩展的分析查询和报告提供了帮助。云数据仓库利用云提供商分配的空间和计算能力来集成和存储来自不同数据源的数据,以便进行分析。

一些流行的数据仓库工具可供参考:

  1. 亚马逊红移,DynamoDB,RDS,S3
  2. 雪花
  3. 微软 Azure
  4. 谷歌大查询
  5. Teradata
  6. 一种数据库系统
  7. SAP HANA

学习数据流的结果

  1. 提供从应用到业务的预测分析,而不干扰商业智能所依赖的核心系统
  2. 获得营销策略的洞察力,使企业从竞争对手中脱颖而出
  3. 改进了信息存取,加快了查询响应时间

3.Kafka 和 Spark 的数据流

在现代数据工程中,数据流可以定义为从源到目的地的连续数据流,以便进行近乎实时的处理和分析。

数据流可以从网站上收集用户的浏览器行为、客户使用移动或网络应用程序生成的日志文件、在线购买、社交网络信息等。

数据科学家开始构建实时流系统和应用程序,以大规模处理大数据(也称为快速数据)。

数据流流程是一个生态系统,由 Apache Kafka、ApacheAvro、Kafka Connect 和 REST proxy、KSQL、Faust Stream Processing 等工具以及各种所需的数据模式组成。该技能是一个附加层,前提是您具备中级 Python 和 SQL 知识,以及 ETL 经验。

学习数据流的结果

  1. 实时分析以更短的周期时间解决业务问题陈述
  2. 从流媒体平台生成的报告中推断分析见解

4.构建数据管道

数据行业中消耗大量数据的大公司通常采用数据管道将原始(未经分析的)数据从软件即服务(SaaS)平台或其他来源传输到数据仓库,以供商业智能(BI)、分析和报告工具使用。

数据管道将一系列操作编织在一起,从收集数据、 it 转化为洞察力、培训模型、交付洞察力,以及根据业务目标应用模型。

数据管道的一般架构很简单:

数据源>摄取>转换>目的地>监控

企业依靠数据管道实现以下目标:

  1. 可访问性:数据人员轻松访问数据,进行假设检验、模型开发或简单的数据查询
  2. 可伸缩性:保持较低的成本,并随着大量摄取的数据而伸缩
  3. 效率:在指定的延迟时间内,使用数据和机器学习技术解决业务问题

如果你有兴趣了解更多关于大数据管道的信息,我强烈推荐你阅读这篇文章,作者在文章中对这一概念进行了深入的概述。

学习数据管道和工具的结果:

  1. 消除错误,消除模型开发过程中的任何瓶颈或延迟
  2. 过滤并只使用那些提供故障恢复能力的特性
  3. 轻松访问数据以进行探索性数据分析
  4. 每个公司都需要具备这种技能的数据工程师!

5.营销分析

2019 年全球数字营销支出 3300 亿美元

营销分析可以打开一扇大门,了解广泛的营销和业务指标,以及如何评估您的营销工作的增长和健康。

企业坚持不懈地通过营销活动收集数据,以获得共同的营销观点。营销分析的应用范围从跟踪消费者行为、识别购买力趋势、衡量活动的成功到转化、人口偏好、创意偏好和重要的业务指标,如投资回报、归因和整体效果。

营销数据分析师是一个既需要执行定性市场分析又需要执行定量市场分析的人,以告知企业当前营销策略的状态。他们可以使用可视化或预测等机器学习技术来提供营销计划,并使业务取得成功。

学习营销分析的成果:

  1. 让企业从获取渠道获得数据驱动的决策,以获取数字营销、网站指标等。
  2. 优化流程,获得客户洞察,发现渠道缺陷
  3. 根据需要调整业务战略和战术,以获得分析的支持

我为初学者推荐的在线课程:

https://www.coursera.org/learn/uva-darden-market-analytics https://www.udacity.com/course/marketing-analytics-nanodegree--nd028 [## 营销分析在线课程

www.udacity.com](https://www.udacity.com/course/marketing-analytics-nanodegree--nd028)

这就是我的博客的结尾。感谢您的阅读!如果你在这个夏天遇到了任何新的概念,请在评论中告诉我,我很乐意了解更多。

如果你喜欢阅读这样的故事,并希望支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,而不需要你额外付费!)

数据帐篷快乐!

Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造有见地的故事来传达隐含的见解。当她没有赶着赶上学校的最后期限时,她喜欢喝一杯好咖啡,写关于数据的博客……

如果你找不到数据科学家的工作,下一步该怎么办

原文:https://towardsdatascience.com/whats-next-if-you-can-t-get-a-data-scientist-job-8309c6d0a895?source=collection_archive---------25-----------------------

数据科学家的替代工作可能性

照片由前方什么也没有来自 Pexels

T4 对数据科学家的需求近年来有所增长,但与此同时,获得数据科学家工作的竞争也变得更加激烈。如果你目前正在寻找一份数据科学家的工作,但没有得到任何面试或进入最后一轮,但仍然没有被录用,你有什么选择?你可以继续申请,希望你最终能找到工作,或者考虑改变你的求职策略。今天,如果你发现很难找到一份数据科学家的工作,我想讨论一下可供探索的替代方法。

并非所有数据科学家的工作都是平等的

拥有数据科学家头衔的职位可能不需要将构建机器学习模型作为主要职责。寻找主要是数据分析师职责的数据科学家工作,例如评估 A/B 测试和构建需要一些建模的仪表板。由于机器学习只是一个责任,如果你发现很难通过更多技术数据科学家面试,技术面试应该不那么复杂。您仍然可以构建模型,但部分时间将用于数据分析师任务。

申请数据分析师职位

你可能想知道,当你努力成为数据科学家时,为什么还要申请数据分析师的工作。除了技术技能,数据科学家最重要的软技能是沟通技能和商业头脑。成为数据分析师可以帮助你建立这些软技能,如果这是你无法成功获得数据科学家工作的原因。与需要几周或几个月时间来构建和生产的建模项目相比,数据分析师任务的周转时间更短,并且允许您处理更广泛的业务问题,以发展您的业务敏锐度。作为一名数据分析师,你需要学会如何很好地沟通,向利益相关者解释分析结果。

接受数据分析师的工作并不意味着你不能建立模型。有数据分析师但没有数据科学团队的公司会给你建立模型的自由,如果它符合业务需求的话。作为一名数据分析师,当机器学习模型是商业问题的正确解决方案时,我会使用它。在你感兴趣的领域成为一名数据分析师将有助于你理解这个行业。这将使你在未来申请类似业务时成为更强的数据科学家候选人,因为你已经拥有该领域的经验,需要的培训更少。

附加选项

以下是您可以探索的与数据科学相关的其他选项。

作为一名数据科学家,你可能认为你应该只申请需要建立模型的工作,但现在你知道还有其他的可能性。我提到的选择可能并不理想,但另一种选择可能是留在你目前的工作岗位上,这份工作可能会因为预算削减而面临风险,或者如果你缺乏经验,就找不到工作。不管你选择哪条路,我希望你的求职早点结束。

https://madfordata.medium.com/how-to-reduce-stress-in-a-data-analytics-job-d6567ee85322

Python 中的“是”和“==”有什么区别?

原文:https://towardsdatascience.com/whats-the-difference-between-is-and-in-python-dc26406c85ad?source=collection_archive---------0-----------------------

何时使用哪个,为什么

Alex Chumak 在 Unsplash 上拍摄的照片

当我们在 Python 中比较对象时,我们通常使用**==**操作符。我们有时可能会尝试使用**is**操作符来执行相同的任务。

这两个运算符有什么不同吗?

作者图片

这是一个简短的帖子,解释两者之间的细微差别,并提供何时使用哪一个的建议。

有什么区别?

我个人是查了才知道的。这其实很容易理解,但知道这一点也很重要。

  • ==代表值相等。它用来知道两个对象是否有相同的值。
  • is用于参考相等。它用来知道两个引用是否指向同一个对象,即它们是否相同。如果两个对象有相同的内存地址,那么它们就是相同的。

两个值相等的物体不一定相同。

简单来说:== 确定两个对象的值是否相等,而 **is** 确定它们是否是完全相同的对象。

或者更简单:**is**语句是** **id(a) == id(b)**的语法糖**

*id()是 Python 中的内置函数。它接受单个参数,并使用 返回对象 的标识。

让我们看一些例子👨‍💻

让我们定义一个变量**a**来保存一个列表,让我们将它影响到一个变量**b**

**a****b**在内存中引用同一个对象,我们可以使用 id 函数来检查这一点。(id 保证在同时存在的对象中是唯一的)。

**a****b**因此具有相同的 id,因此语句**a is b**为真。

**a = [1, 2, 3]
b = a****id(a)
# 140545544215872****id(b)
# 140545544215872****a is b
# True****a == b
# True**

现在让我们通过 slice 操作符复制列表**a**。拷贝应该在内存中创建一个新的对象,有一个新的地址,这样就分配了一个新的 id。

**c = a[:]****id(a)
# 140545544215872****id(c)
# 140545544587008**

因此:

**a is c
# False****a == c
# True**

这里ac指向内存中两个不同的对象,即使它们的值相等。

Python 中的一些不一致行为

让我们运行这个小例子。

**>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False**

这种行为是意料之中的,就像我们在前面的例子中看到的一样。

现在让我们用 100 代替 1000。

**>>> c = 100
>>> d = 100
>>> c == d
True
>>> c is d
True**

这里发生了什么?这与之前的结果不一致。

结果是 Python 的参考实现缓存了-5 范围内的整数对象..256 作为单例实例。

同样的事情也发生在弦上。

PEP8 对此怎么说?

标准库的官方 Python 风格指南 PEP 8 也提到了T6 的两个用例:

与 None 之类的 singletons 的比较应该总是使用 is 或 is not,而不是等号运算符。

此外,当您真正的意思是如果 x 不是 None 时,要小心编写 if x——例如,当测试默认为 None 的变量或参数是否被设置为其他值时。另一个值的类型(比如容器)在布尔上下文中可能为 false!

概述

  • 如果两个对象有相同的内存地址,那么它们就是相同的
  • 两个相同的对象具有相等的值,但是具有相等值的两个对象不一定相同
  • 使用**is**检查同一性,使用**==**检查相等性。
  • 在大多数其他情况下,当你比较像 None 和**==**这样的单例时,使用**is**:这是一个安全的选择。

参考

感谢阅读🙏

新到中?你可以订阅每月 5 美元,并解锁无限的文章——点击这里。

Python 中浅拷贝和深拷贝有什么区别?

原文:https://towardsdatascience.com/whats-the-difference-between-shallow-and-deep-copies-in-python-ceee1e061926?source=collection_archive---------7-----------------------

Python 中的 copy()与 deepcopy()

unsplash.com上查尔斯布隆尼亚尔的照片

Python 附带了一个名为copy的模块,它提供了某些复制功能。在本文中,我们将探讨什么是深度和浅度副本。此外,我们将讨论它们的区别以及何时使用其中一个。

不可变对象与可变对象

在开始学习 Python 中的浅层和深层拷贝之前,首先理解可变和不可变对象类型之间的区别是很重要的。顾名思义,不可变的对象是不能被改变的,因此,Python 会在这种对象的值被修改时创建一个新对象。

例如,假设我们有两个变量引用同一个整数对象:

>>> a = 10
>>> b = a  # variables a and b hold the reference to the same object

现在,如果我们对变量a执行任何类型的操作——假设 Python 中的整数是不可变的——结果基本上将是一个保存新值的新对象。这意味着对象的旧值(以及引用它的所有变量)将保持不变:

>>> a = a + 1
>>> print(a)
11
>>> print(b)
10

另一方面,可变对象类型允许就地修改对象值。这意味着当一个可变对象类型的值被修改时,对所有保存对同一对象的引用的变量都有影响。例如,让我们假设我们有以下列表

>>> list_1 = [1, 2, 3]
>>> list_2 = list_1

鉴于 Python 中的列表是可变的,如果我们改变两个列表中的任何一个,这个动作也会直接影响另一个变量,因为它们都指向内存中的同一个对象引用。

>>> list_1[0] = 0
>>> print(list_1)
[0, 2, 3]
>>> print(list_2)
[0, 2, 3]

关于 Python 的动态类型模型的更多细节,你可以在 Medium 上阅读我的一篇文章:

正常分配

复制对象最直接的方法是通过普通的赋值操作。让我们假设我们有以下操作

a = [1, 2, 3]
b = a

在这种情况下,两个变量ab拥有对同一个对象的相同引用。这意味着,如果两个变量中的任何一个用于执行就地修改,另一个变量也会受到影响。

>>> a[0] = 0
>>> print(a)
[0, 2, 3]
>>> print(b)
[0, 2, 3]

因此,当我们必须处理不可变的对象类型时,通常使用普通的赋值操作。在这种情况下,当使用两个变量中的任何一个执行操作时,另一个变量将保持不变,因为它的引用指向也保持不变的旧对象,假设它是不可变的。

>>> id(a) == id(b)
True

Python 中的赋值语句不复制对象,它们在目标和对象之间创建绑定— Python 文档

浅层拷贝与深层拷贝

在深入浅拷贝和深拷贝的细节之前,请注意它们的区别只在我们必须处理本质上是嵌套结构的复合对象时才相关。换句话说,复合对象是包含其他对象的对象,例如,列表的列表或集合的字典。

一个浅拷贝将复制原始对象并创建一个新的复合对象,但如果我们复制的对象是一个复合对象,内部对象将与原始对象中的相同。

>>> import copy
>>> b = copy.copy(a)
>>> id(a) == id(b)
False

正如我们所见,列表对象ab是不同的,这意味着它们拥有指向内存中不同对象的不同引用(即使这些对象的值是相同的)。

当我们需要处理复合对象时,事情变得有点复杂。现在让我们假设变量a是一个复合对象,它表示一个列表列表:

a = [[1, 2, 3], [4, 5, 6]]

现在我们拿a的浅抄

>>> import copy
>>> b = copy.copy(a)

我们可以看到ab是不同的物体

>>> id(a) == id(b)
False

但是,内部对象(即两个内部列表)与原始对象引用的对象相同:

>>> id(a[0]) == id(b[0])
True

这是非常危险的,因为任何内部列表的变化都会影响引用这些内部列表的其他复合对象:

>>> a[0][0] = 0
>>> a
[[0, 2, 3], [4, 5, 6]]
>>> b
[[0, 2, 3], [4, 5, 6]]

因此,浅拷贝只有在我们不必处理复合对象时才适用。

一个浅拷贝构造一个新的复合对象,然后(尽可能地)将引用插入到其中,指向在原始的 Python 文档中找到的对象

一个深度拷贝将复制原始对象,然后递归复制找到的内部对象(如果有的话)。

>>> import copy
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = copy.deepcopy(a)

同样,我们可以看到原始对象和复制的对象本质上是不同的:

>>> id(a) == id(b)
False

但是在这种情况下,即使是内在的物体也会不同:

>>> id(a[0]) == id(b[0])
False

这意味着a中任何嵌套列表的变化都不会影响对象b中相应的列表:

>>> a[0][0] = 0
>>> a
[[0, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]

因此,当我们必须处理复合对象,并希望确保任何内部对象的变化都不会影响引用相同对象的其他变量时,深度复制更合适。

一个深度拷贝构建了一个新的复合对象,然后递归地将在原始的 Python 文档中找到的对象的拷贝插入其中

结论

在本文中,我们探索了在 Python 中复制对象的三种基本方法。最初,我们讨论了不可变和可变对象类型之间的区别。不可变对象类型没有必要被复制,因为这种实例的值永远不会改变。另一方面,开发人员在修改可变对象类型时需要小心,因为这一操作可能会影响持有对同一对象的引用的其他变量。当此类对象被就地更改时,引用同一对象的所有其他变量也将受到此更改的影响。

因此,理解如何正确地复制可变对象以避免代码中的错误是很重要的。回想一下,浅层复制会在原始对象的基础上创建一个新对象,但是如果该对象包含其他对象,那么内部对象将不会被复制,而是使用与原始结构相同的引用。另一方面,深层拷贝将创建一个新对象,即使是包含在复合对象中的内部对象。

Python 中静态方法和类方法有什么区别?

原文:https://towardsdatascience.com/whats-the-difference-between-static-and-class-methods-in-python-1ef581de4351?source=collection_archive---------13-----------------------

关于 classmethod 和 staticmethod,您只需要知道

照片由克里斯·利维拉尼unsplash.com拍摄

除了实例方法——这是面向对象编程环境中最常见的类成员 Python 中的类也可以有静态和类方法。该语言带有两个装饰器,即@staticmethod@classmethod,它们允许我们在类中定义这样的成员。理解这些概念是很重要的,因为它们将帮助你编写更清晰、结构更合理的面向对象的 Python,并最终使维护变得更容易。

在本文中,我们将探讨这两者的作用,如何创建它们,以及在哪些情况下应该使用其中一个。

花点时间浏览一下下面的代码,因为它将被用作示例 Python 类,我们将使用它来探索一些概念。

class Employee: NO_OF_EMPLOYEES = 0

    def __init__(self, first_name, last_name, salary):
        self.first_name = first_name
        self.last_name = last_name
        self.salary = salary
        self.increment_employees() def give_raise(self, amount):
        self.salary += amount @classmethod
    def employee_from_full_name(cls, full_name, salary):
        split_name = full_name.split(' ')
        first_name = split_name[0]
        last_name = split_name[1]
        return cls(first_name, last_name, salary) @classmethod
    def increment_employees(cls):
        cls.NO_OF_EMPLOYEES += 1 @staticmethod
    def get_employee_legal_obligations_txt():
        legal_obligations = """
        1\. An employee must complete 8 hours per working day
        2\. ...
        """
        return legal_obligations

类方法(@classmethod)

类方法接受类本身作为一个隐式参数和——可选地——定义中指定的任何其他参数。理解一个类方法不能访问对象实例(像实例方法一样)是很重要的。因此,类方法不能用于改变实例化对象的状态,而是能够改变该类的所有实例共享的类状态。

当我们需要访问类本身时,类方法通常是有用的——例如,当我们想要创建一个工厂方法时,这是一个创建类实例的方法。换句话说,classmethods 可以作为可选的构造函数。

在我们的示例代码中,Employee的一个实例可以通过提供三个参数来构造;first_namelast_namesalary

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.first_name)
print(employee_1.salary)'Andrew'
85000

现在让我们假设一个雇员的名字可能出现在一个字段中,其中名和姓用空格隔开。在这种情况下,我们可以使用名为employee_from_full_name的类方法,它总共接受三个参数。第一个是类本身,这是一个隐式参数,意味着在调用方法时不会提供它——Python 会自动为我们做这件事。

employee_2 = Employee.employee_from_full_name('John Black', 95000)
print(employee_2.first_name)
print(employee_2.salary)'John'
95000

注意,也可以从对象实例中调用employee_from_full_name,尽管在这种情况下没有太大意义:

employee_1 = Employee('Andrew', 'Brown', 85000)
employee_2 = employee_1.employee_from_full_name('John Black', 95000)

我们可能想要创建类方法的另一个原因是当我们需要改变类的状态时。在我们的例子中,类变量NO_OF_EMPLOYEES跟踪当前为公司工作的雇员人数。每次创建一个新的Employee实例时都会调用这个方法,并相应地更新计数:

employee_1 = Employee('Andrew', 'Brown', 85000)
print(f'Number of employees: {Employee.NO_OF_EMPLOYEES}')employee_2 = Employee.employee_from_full_name('John Black', 95000)
print(f'Number of employees: {Employee.NO_OF_EMPLOYEES}')Number of employees: 1
Number of employees: 2

静态方法(@staticmethod)

另一方面,在静态方法中,实例(即self)和类本身(即cls)都不会作为隐式参数传递。这意味着这些方法不能访问类本身或它的实例。

现在有人可能会说,静态方法在类的上下文中没有用,因为它们也可以放在助手模块中,而不是作为类的成员添加。在面向对象编程中,将类组织成逻辑块是很重要的,因此,当我们需要在类下添加方法时,静态方法非常有用,因为它在逻辑上属于类

在我们的例子中,名为get_employee_legal_obligations_txt的静态方法简单地返回一个字符串,该字符串包含公司每个员工的法律义务。这个函数既不与类本身交互,也不与任何实例交互。它可以被放入一个不同的助手模块,但是,它只与这个类相关,因此我们必须把它放在Employee类下。

静态方法可以直接从类中访问

print(Employee.get_employee_legal_obligations_txt()) 1\. An employee must complete 8 hours per working day
    2\. ...

或者来自类的实例:

employee_1 = Employee('Andrew', 'Brown', 85000)
print(employee_1.get_employee_legal_obligations_txt()) 1\. An employee must complete 8 hours per working day
    2\. ...

结论

在本文中,我们介绍了 Python 中静态方法和类方法的工作原理,以及应该优先使用这两种方法的主要原因。

可以使用@classmethod装饰器创建类方法,它们用于访问类本身,但同时,它们不能访问单个实例。当我们需要创建可选的构造函数时,它们是非常有用的,这是一个创建同一个类的实例的类方法(可能接受稍微不同的参数)。

另一方面,静态方法可以通过@staticmethod装饰器来构造,但是它不同于实例或类方法,它没有任何隐式参数(既不是self也不是cls),因此它们不能访问类或它的实例。当我们需要将一个成员放入一个类中时,它们通常是有用的,因为它在逻辑上属于这个类。

这两种类型的方法都可以帮助您编写易于阅读和维护的代码。

预测准确性指标的隐性成本是多少?-来自 M5 竞赛的见解

原文:https://towardsdatascience.com/whats-the-hidden-cost-of-a-forecast-accuracy-metric-64ee0b86ce25?source=collection_archive---------31-----------------------

行业笔记

有几十种花哨的预测指标,做出正确的选择似乎相当棘手。每一种都有它的特点,它的优点和缺点,它的捍卫者和它的批评者…你的选择真的重要吗?有需要避免的度量标准吗?相反,是否有比其他指标交付更多价值的指标,如果有,交付多少?

迈克尔·朗米尔Unsplash 上拍摄的照片

附录

本文于 2021 年 7 月 4 日更新,以反映各种读者评论,这些评论指出了本文第一版中的局限性和潜在偏见。特别感谢 Trixie Tacung(欧莱雅)和 Ivan Svetunkov (CMAF 兰卡斯特大学)。

在前一集里…

这一系列文章主张需要新一代的预测指标,将重点放在预测的业务影响上,而不是仅仅放在准确性/精确度上。

在我们的上一篇文章 [1]中,我们将各种预测与它们引发的商业决策的质量进行了比较。

为此,我们利用了“M5-竞争”[2]数据集(基于沃尔玛的数据)和来自基准和竞争对手的 74 种预测方法。这使得超过 680 万次补货决策的模拟成为可能。

如此大的工作台使得每种方法的成本(从它们触发的决策中测量)和各种性能指标(MAPE、wMAPE、sMAPE、MSLE、MAE、MSE、RMSE、WRMSSE、BIAS、DIao)的公平比较成为可能。

有趣的是,该测试表明传统的预测指标在从业务角度确定最佳方法方面表现不佳。事实上,从商业的角度来看,一个被给定的度量标准确定为“最佳”的方法很可能是最差的。

然而,并非所有指标都是平等的!

例如,新引入的 DIao 指标在优化业务决策方面明显优于任何其他指标。事实上,该指标并不关注预测误差,而是考虑所引发的决策和相关成本。

这篇文章里有什么?

外面有一大堆花哨的度量标准,如果现有的已经“足够好”并且附加值不明确,那么肯定没有必要引入新的。

在第四篇文章中,我们描述并实现了一个测试框架,它回答了以下问题:

  • 所有指标的表现都一样吗?
  • 如何确定满足您需求的最佳预测指标?
  • 有最好避免的度量标准吗?
  • 应用适当的度量标准的投资回报是什么?

那我们就来分享一些实验答案吧!

设置测试工作台

路易·里德Unsplash 上拍摄

资料组

在这个实验中,我们使用了我们上一篇文章中提到的“沃尔玛/ M5 竞争”数据集。如果你有兴趣学习,请参考“后来者居上,前来者居上”……M5 竞赛见闻

关于补充政策,我们使用上述文章中描述的假设,除了:

  • 设置为零的初始库存。事实上,我们的目标是评估度量的真实性能,我们不希望现有的清单使我们的度量产生偏差。然后在相同的“无初始库存”假设下分析每个补货决策。
  • 固定成本也设置为零。这是因为固定成本是在订单级别计算的,这在较低级别计算相关性时会添加一些不必要的噪声。

相关性度量

我们在这里感兴趣的是测量各种预测指标和它们触发的决策成本之间的相关性。

相关系数用于衡量变量之间关系的强度。更准确地说,相关系数衡量两个变量之间的线性关系。

然而,给定预测指标的公式(包括权重、对数、平方、平方根、绝对值等等),我们不能期望指标与其成本之间的关系是线性的。

相反,我们可能期望单调性以“当一个指标提高时,成本降低”的形式出现。因此,我们在这个分析中应用了 Spearman 的等级-顺序相关性。

斯皮尔曼的等级-顺序相关性关注的不是价值本身,而是它们的等级。当等级完全相关(rho=1)时,变量向同一方向演化。当等级反向相关(rho=-1)时,变量向相反方向演化。在这两种情况下,从我们的角度来看,指标的演变完全符合成本的演变。

但是,一旦相关系数不等于+1 或-1,变量就不再完全相关。从业务的角度来看,这种情况意味着,虽然预测指标提高了,但决策的质量可能会下降……这会增加成本而不是产生价值!

花费如此多的精力和资源来改进预测,却不能为您的业务服务,这是多么可耻的事情啊!

性能指标

在这里,我们重点关注经典的预测指标,包括 MAPE、wMAPE、sMAPE、MSLE、MAE、MSE、RMSE、WRMSSE、BIAS (最后是 BIAS 指标)。

当然,我们在这个列表中添加了新引入的“决策影响”指标。在三个“决策影响”指标(即 DIna、DIno 和 DIao)中,选择 DIao 是因为它关注错误的成本。

关于那些 DIao 和其他两个度量的更多细节,您可以参考:“决策影响”:实现新一代面向业务的度量的 10 个理由 [3]。

聚合级别

大多数从业者在特定的计算级别评估和交流他们的性能指标。例如,一些需求计划员将决定选择一种预测方法,并将其应用于整个(或全局)范围。其他人将决定为不同的子范围选择不同的方法,例如按产品类别。一些需求计划员最多会按物料/商店选择一种预测方法。

评估所选聚合级别的影响不是很有趣吗?然后,让我们向这个测试平台添加各种聚合级别。

以下是所选的 12 个级别(括号中的数字是该级别的节点数) :

  • 全球(1),
  • 状态(3),
  • 类别(3),
  • 部门(7)、
  • 国家/类别(9),
  • 商店(10),
  • 州/部门(21)、
  • 商店/类别(30)、
  • 商店/部门(70)、
  • 项目(3049),
  • 状态/项目(9147),
  • 商店/项目(30490)。

分析相关性

照片由 mari lezhavaUnsplash 上拍摄

计算完成后,下面的箱线图显示了 Spearman rho 排名相关性的分布(每个聚集水平的平均值)。

作者图片

作者图片

这个怎么解读?

下表就如何解释 Spearman rho 的等级相关性给出了一些指导。

Spearman rho(分级)相关性解释指南(Prion 和 Haerling,2014 年)

根据上述指南进行测量:

  • MAPE,通常被认为是最常用的预测指标[4],在这种情况下是最差的指标,与成本的相关性可以忽略不计微弱
  • 不出所料,偏差对成本也有一个可以忽略的微弱的相关性。
  • 其他指标的相关性具有较大的 rho 范围,从可忽略中等。
  • 在经典指标中,MAE & wMAPE 明显脱颖而出,相关系数从可忽略中等
  • 再一次,提出的 DIao 指标明显优于其他指标,因为其设计与成本完全相关,无论成本水平如何。

有趣的是,如下图所示,在高聚合级别,指标与成本的相关性往往不同。不幸的是,补货决策必须在商品/商店层面做出,其中每个指标(除了 DIao)与成本都有相同的相关性。

作者图片

基于这个测试,刁绝对是一个非常合适的指标。另一方面,在经典的度量中,没有一个度量在决策层是突出的。

毫无疑问,从科学角度来看,相关性是必不可少的。但是,从一个度量转换为 DIao 会产生什么附加价值呢?这个额外的价值是否足够大到可以使这样的改变合法化?

让我们定义另一个测试来检查这一点!

分析有效成本

照片由 Jp ValeryUnsplash 上拍摄

对于上述每个指标,让我们选择最佳的 5 个预测(从 74 个可用预测中)。选择几个预测而不是一个预测会使我们的结论更加可靠,因为它避免了传统的陷阱,例如意外选择一个表现不佳的预测。

然后,按指标计算并平均所选预测的成本,以获得每个指标触发的平均成本。这些成本显示在下面的方框图中。

作者图片

该图显示:

  • BIAS & MAPE 精选预测比任何其他指标都贵,平均值分别为 3.5 万美元和 3 万美元。
  • 其他指标选择的预测平均成本为 2.6 万美元(比 MAPE 低 13%)。它们从一个到另一个提供了小的额外的改进,但是没有很大的不同。
  • DIao 指标选择了平均成本为 2.4 万美元的预测值(与 MAPE 相比下降了 21%,与上述指标相比下降了 10%)。

这代表了多大的附加值?

让我们客观地看待这些结果,并比较每个聚合级别的每个指标与 DIao 的成本。

作者图片

作者图片

无论聚合级别如何,DIao 指标始终为给定的决策流程确定最适合的预测。

从高层次来看,由于指标与成本的相关性更好,因此额外的节省是有限的(700 到 3,000 美元)。但是,一旦在更精细的级别(如商品/商店级别)计算指标,节省就会大幅增加,从 1.9 万美元到 9.3 万美元不等

嗯……它很棒还是垃圾?

为了更好地理解这些数字,让我们把它们放在上下文中。

下面,我们将重点关注 MAPE(因为它是应用最广泛的指标)和商品/商店级别(做出补货决策的地方),从而节省 93000 美元。

我们的预测期包括 288 万美元的销售额。沃尔玛 2020 年的年销售额定为 5591.5 亿美元[5]。这意味着我们的分析代表了沃尔玛年收入的 0.00052%。此外,沃尔玛 2020 年的年总收入为 1388.4 亿美元[5]。

考虑到这些数字,93000 美元的节约是多少?

  • 3 周内 10 家商店的 3049 件商品售价 93000 美元
  • 即。总补货成本的 35.2%
  • 即。每个项目和商店每年 5.29 美元
  • 即。沃尔玛规模 18.05 亿美元/年
  • 即。年营业额的 0.32%
  • 即。沃尔玛年度总收入的 1.30%

结论

正如我们所展示的,并非所有预测指标都是一样的!

为您的业务选择正确的指标将极大地提高您的绩效!相反,使用错误的指标(比如 MAPE)会让你的公司损失很多钱。

当然,并不是所有的公司都像沃尔玛那么大!然而,高达 35.2%的总成本降低对任何业务都有实际影响。当您简单地用一个指标替换另一个指标时更是如此。

虽然“决策影响指标”的第一个用例很棒,还有更多用例可以分享。我们将在本系列的后续文章中逐一介绍它们。

承认

特别感谢Manuel Davy(Vekia 创始人&首席执行官)Stefan De Kok(wah upa 联合创始人&首席执行官)hervéLemai(Vekia 首席技术官)。

本文旨在阐明预测性能测量的当前实践、局限性和可能的改进。它肯定不是完美的,并且受到限制。

如果你觉得这很有见地,请分享和评论…但也请随意挑战和批评。如果你想进一步讨论这个问题,请联系我!

无论如何,敬请关注下一篇文章!同时,请访问我们的网站www . vekia . fr了解更多我们在为供应链提供高价值方面的专业知识和经验。

Linkedin:www.linkedin.com/in/johann-robette/
Web:www . vekia . fr

参考

[1] Vekia,Johann ROBETTE,最后将是第一个,第一个最后——来自 M5 竞赛的见解,2021

[2] Kaggle, M5 竞赛网站,2020 年

[3] Vekia,Johann ROBETTE,“决策影响”:实施新一代面向业务的指标的 10 个理由,2021

[4] Gartner,财务堵塞限制预测准确性,2019

[5]《华尔街日报》,沃尔玛公司,2021 年

你能达到的最大 ROC 是多少?(不,答案不是 1)

原文:https://towardsdatascience.com/whats-the-maximum-roc-you-can-achieve-no-the-answer-is-not-1-da11b66c0f28?source=collection_archive---------23-----------------------

无论是准确度、精度,还是 ROC 下面积,大概你的预测模型都无法达到完美(甚至无法接近)。这是(统计上的)原因。

[图片由作者提供]

人们普遍认为预测模型的准确性完全取决于两个因素:

  • 你的数据有多完整整洁;
  • 你的分类器有多强大。

当然,这两个方面是最基本的。但是还有第三种,经常被遗忘:

  • 你正在解决的问题有多难?

直觉上,很明显不是所有的问题都一样难。例如,对 MNIST 数字进行分类并不像预测明天的股票市场那样困难。换句话说,每个问题都有一个固有的“硬度”。这对数据科学家有着重要的意义,因为实际上,它意味着:

在给定任务上可以实现的最大 ROC 不一定是 100%,但是可以低得多,这取决于问题的难度。

这只是常识,但在某个时候,我开始问自己:

分类任务的难度有没有量化的衡量标准

我发现这个问题发人深省,因为它触及了一个有趣话题的本质:机器学习的边界,以及——我要说——一般学习的边界。这篇文章介绍了我是如何回答这个问题的。

1.让我们摇摆吧

想想任何分类任务,无论是预测保险欺诈、分类垃圾邮件还是推荐电影。

假设我们能够为该任务生成所有可能的预测模型(这个假设的模型集被称为“模型空间”)。对于它们中的每一个,我们也可以计算其在 ROC 曲线下的面积(从现在开始简称为“ROC”)。

模型空间。[图片由作者提供]

正如我们所知,ROC 是衡量模型性能的一个标准。因此,如果我们采用模型空间中具有最高 ROC 的模型,那么这就是正在讨论的任务的最佳可能模型

事实上,

最佳可能模型的 ROC 是任务“难度”的度量。

事实上,根据定义,最好的模型是不可战胜的。因此,最佳可能模型的 ROC 越高,问题越简单;最佳可能模型的 ROC 越低,问题越难

所以,我们所有的工作归结为找到某种方法来定义最佳可能模型的特征。要做到这一点,让我们从基础开始。

2.最好的模型

任何分类任务的结构都可以概括如下:

一个二元分类问题的结构。[图片由作者提供]

这个想法是,目标变量是一些“隐藏的”(或不可观察的)概率的实现。预测模型的目的是对这些潜在的概率进行估计(尽可能准确)

但是隐藏的概率和观察到的结果之间有什么联系呢?如果所有样本都是独立的,生成观察结果就像为每个样本投掷一枚(装载的)硬币,硬币的装载与样本的隐藏概率成比例。在 Python 中,投掷一枚装满硬币的等价体是numpy.random.choice,所以生成过程看起来是这样的:

数据生成过程的样子。[图片由作者提供]

隐藏概率的随机性是不可分散的。这意味着没有模型能比隐藏概率做得更好。换句话说,

最好的可能模型是能够正确猜测所有隐藏概率的模型。

我们终于有了我们一直在寻找的最佳可能模型的定义!由于我们最初的直觉是计算最佳可能模型的 ROC,这相当于计算隐藏概率的 ROC。

综合我们发现的一切,我们可以得出这样的结论:

在预测问题上可能达到的最高 ROC 是产生目标变量的概率的 ROC。

根据这个定义,现在很容易计算出我们上面看到的玩具问题的最高可实现 ROC:

用 Python 计算 ROC 分数。[图片由作者提供]

只有 77%,离 100%还差得很远!

除了这个小例子,我们能不能用这个洞见说点更普遍的?为了回答这个问题,我们需要后退一步,尝试在更一般的背景下理解隐藏概率的特征。

3.隐藏概率的拼图

考虑到隐藏概率是不可观测的,我们对它们了解多少?

至少,我们知道他们的意思。事实上,假设与目标变量的均值重合是合理的。例如,如果您正在尝试对垃圾邮件进行分类,并且您观察到收到的邮件中有 10%是垃圾邮件,您可以得出结论,潜在隐藏概率的平均值也是 10%。

我们还可以说一下它们的方差,至少是上下界。方差的下限当然是零。关于上界,我们可以用 Bathia-Davis 不等式,它说明方差的上界是(mean — min)*(max — mean)。由此,我们可以得出结论:

我们所知道的隐藏概率的均值和方差,其中 y 代表目标变量。[图片由作者提供]

但这还不是全部。我们也可以假设隐藏概率是贝塔分布的。事实上,贝塔分布是描述概率的最佳选择,因为:

  • 它仅在区间[0,1]上定义(因此,它主要用于表示百分比和比例,例如在贝叶斯推理中);
  • 它足够通用,可以表示许多不同的“形状”。

贝塔分布由两个正参数决定,称为 αβ

贝塔分布的概率密度函数,基于 αβ 的不同值【来源:维基百科

但是即使我们假设隐藏概率遵循贝塔分布,我们如何选择 αβ

贝塔分布的一个方便的特性是均值和方差都可以很容易地从 αβ: 中获得

作为参数函数的贝塔均值和方差。[图片由作者提供]

然而,在我们的例子中,我们宁愿做相反的事情,即从均值和方差中得到 αβ 。为了做到这一点,将上面的两个方程表示为均值和方差的函数就足够了。经过一些简单的代数运算,结果是这样的:

作为均值和方差函数的β参数。[图片由作者提供]

将我们看到的所有关系放在一起,我们可以编写一个 Python 函数,提供对应于任何(合法的)均值和方差对的 αβ :

**def** get_beta_params(mean, var): **assert** 0 < mean < 1, 'mean must be in ]0 and 1['
    **assert** 0 < var < mean * (1 - mean), 'var must be in ]0, mean * (1 - mean)[' alpha = ((1 - mean) / var - 1 / mean) * mean ** 2
    beta = alpha * (1 / mean - 1) **return** alpha, beta

该函数允许我们绘制具有给定均值(假设为 0.1)和不同方差水平的贝塔分布的 pdf(注意,在这种情况下,方差的上限将是 0.1 * 9 = . 09)。

**from** scipy.stats **import** beta **as** beta_distrib
**import** numpy **as** npmean = .1**for** variance **in** [.000001, .0005, .001, .002, .005, .01, .04, .089999]:
  alpha, beta = get_beta_params(mean, variance)
  pdf = beta_distrib(alpha, beta).pdf(np.linspace(0, 1, 100))

均值= .10 且方差不同的贝塔分布的概率密度函数。注意:最小理论方差是 0,而最大理论方差是 0.09[图片由作者提供]

除了绘制概率密度函数,一旦我们知道了 αβ ,我们可以通过函数np.random.beta(alpha, beta, size)抽取一个随机样本,并绘制各自的直方图:

直方图:均值= .1 和不同方差的贝塔分布。[图片由作者提供]

4.寻找 ROC 的上界

既然我们已经学会了如何模拟尽可能多的 Beta 分布(对于给定的均值,从最小方差到最大方差),我们终于可以回到我们最初的目的了。

事实上,从每个分布中,我们可以抽取一个概率样本,用于生成目标变量。比较概率和目标值计算出的 ROC 正是我们最初寻找的度量。

这是一个流程图:

完整的过程:隐藏概率是从具有指定参数的 Beta 中提取的,然后概率被用于生成目标变量,最后 ROC 分数是根据隐藏概率和观察结果计算的。[图片由作者提供]

在 Python 中,该过程如下所示:

**import** pandas **as** pd
**import** numpy **as** np
**from** sklearn.metrics **import** roc_auc_scoremean = .1
var_min = 0
var_max = mean * (1 - mean)**for** var **in** np.linspace(var_min + 1e-10, var_max - 1e-10, 100):
  alpha, beta = get_beta_params(mean, var)
  proba = pd.Series(np.random.beta(alpha, beta, 100000))    
  y = proba.apply(**lambda** p: np.random.choice([0, 1], p = [1 - p, p]))
  roc_auc_score(y, proba)

让我们看一些例子:

贝塔分布及其 ROC 的一些例子。[图片由作者提供]

这是 6 个不同的测试版,平均值为 0.1。但是我们可以生成无穷多个,从最小方差到最大方差。所以让我们取 100 个平均值相同、方差递增的贝塔。然后,让我们在 x 轴上绘制最大方差的百分比,并在 y 轴上绘制各自的 ROC。这是我们得到的结果:

贝塔分布的方差与其相关 ROC 的关系。[图片由作者提供]

是不是很迷人?有一个明显的模式:

隐藏概率的方差越低,问题越“难”(即可实现的 ROC 越低)。

毕竟,这很直观。当方差为 0 时,意味着所有样本都具有相同的隐藏概率:不可能对它们进行排序,因此即使是最好的可能模型也不会比随机模型好。这意味着 ROC = .5。

相反,当方差达到最大值时,这个过程实际上没有随机性:最好的可能模型可以完美地区分积极因素和消极因素。这意味着 ROC = 1。

最有可能的是,所有现实世界的分类任务都介于这两个极端之间。

当然,我们所看到的不仅适用于 ROC,也适用于任何性能指标。出于好奇,让我们也画出 F1 的分数,平均精度和准确度:

贝塔分布的方差与其相关指标(ROC、F1、平均精度、准确度)之间的关系。[图片由作者提供]

这次旅行让我们发现了为什么有些问题看起来如此“困难”。我们已经证明,对可以达到的最大 ROC 有统计限制:如果生成概率的分布具有低方差,即使是最好的可能模型也不能在物理上达到高 ROC 分数。

这是对我们最初猜测的更严谨的解释。您实现的 ROC 不仅取决于您的数据有多好或您的模型有多强大,还取决于您正在解决的问题有多困难。

感谢您的阅读!我希望这篇文章对你有用。

我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人

你最喜欢的机器学习味道是什么?

原文:https://towardsdatascience.com/whats-your-favorite-machine-learning-flavor-3faaf80b37f7?source=collection_archive---------39-----------------------

我们每周精选的必读编辑精选和原创特写

我们发布的文章涵盖了一系列令人眼花缭乱的数据科学主题,但我们发现更令人印象深刻的是,当我们放大某个特定领域时,我们会发现有多少变化。本周的《变量》( Variable)就是一个很好的例子,我们在这里关注最新的一批机器学习必读材料。一个很好的起点是 Josh Poduska 的 T2 维护 ML 模型的综合框架。乔希认为,监控你的模型的表现是一回事;全面地处理它以确保它随着时间的推移表现良好是另一个问题,并且需要不断的迭代和创造力。

照片由泰勒·希雷Unsplash 拍摄

关于机器学习的最强大的帖子完成了一件极其困难的事情:将复杂的想法从该领域的前沿转化为既容易理解又令人振奋的叙述。Patrick Huembeli 和他的合著者在探索基于能量的模型和相互作用粒子的物理学之间的联系时就是这样做的,以便更好地理解前者的内部工作方式(本文献给他们已故的合作者彼得·魏特克)。 Felizia Quetscher 设定了一个类似的目标——将密集和不透明的东西转化为吸引人和可接近的东西——当她耐心地解释卷积神经网络(CNN)时,并使用清晰的插图来强调输入和输出阵列与它们之间的卷积核的关系。最后,受生物信息学和计算生物学的启发, Remy Lau 向我们介绍了网络传播背后的理论和直觉,并使用 HotNet2 算法的例子来帮助将事情变得更加具体。

如果你对机器学习的一些更实际、更真实的利害关系感到好奇,你会欣赏赵明杰关于结构化思维的观点,以及它如何产生有效的数据故事。它们涵盖了科学家需要执行的所有大量工作数据,以发现他们创建的数据集的建模可能性。沿着平行的路线, Javier Marin 将学术研究领域的强化学习引入创业场景,强调了武装强盗算法的潜力,以促进更好的商业决策。与此同时,对于 Russo Alessio 来说,机器学习既是一个学术领域又是一个现实世界的问题:作为一名新兴学者,他担心快速增长和该领域的受欢迎程度对会议同行评审过程的质量和公平性的影响

受够了一周的机器学习?真的吗?嗯,没关系——我们也为您提供了保障:

我们祝大家阅读愉快,本周休息愉快——感谢对我们作者工作的支持

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门指南

实践教程

深潜

思想和理论

当一阵狂风卷走我们的记录时,你会怎么做?

原文:https://towardsdatascience.com/when-a-crazy-wind-wipes-away-our-records-what-do-you-do-a9f2aab3dc17?source=collection_archive---------21-----------------------

你应该假设今天的温度会和昨天一样,还是假设全年的平均温度是一个很好的基准?

休伊·费恩·泰

和格雷格·佩奇一起

(上图:澳网的拉斐尔·纳达尔; I 法师 by moer schy;创建日期:2012 年 1 月 18 日)

我喜欢澳大利亚墨尔本的一月。

一月是网球之神降临的时候,这是一年中的第一个网球大满贯——澳大利亚网球公开赛。当比赛进行时,墨尔本中央商务区笼罩在派对的气氛中。沿着亚拉河通往罗德拉沃竞技场的道路上挤满了坐在长凳上和豆袋上观看像罗杰费德勒或塞雷娜威廉姆斯这样的明星在大屏幕上比赛的人。罗德·拉沃尔竞技场本身随着每一次胜利而焕发生机。

你们中的一些人可能想徒步到这个东南部城市亲眼看看这里的活动,他们可能想知道墨尔本的夏天会有多热。很有可能你会去谷歌、Weather.com 甚至是墨尔本气象局查询,从而知道会发生什么。

但是如果,只是如果,一股疯狂的风卷走了前一年记录值的五分之一呢?或者,如果墨尔本奥林匹克公园的气象站有 20%的时间发生故障,导致那些丢失的值,该怎么办?你怎么能提前计划呢?

你可能认为这两种情况都不太可能发生——坦率地说,你可能是对的——但为了以防万一,我们决定模拟这样的事件。从墨尔本一整年的日最高温度开始,我们随机选择了其中的 20%进行移除,在那一栏中留下了 73 个 NA 值。

现在,假设我们不容易重新获得原始值,我们需要为 max_temp 变量输入数字,这样我们的行将再次成为“完整案例”(完整案例是某些建模算法和可视化技术的要求)。

在这种情况下,解决这个问题的一种方法是使用一种称为“上次观察结转”(LOCF)的统计方法,这意味着用最近的已知值填充空白。对于某些季节性因素,比如墨尔本的每日气温,这是一种合理的方法,尤其是当 NAs 的比例不是非常大的时候。虽然墨尔本全年的天气变化很大,但每天的变化很小。

LOCF 可以通过 na.locf()函数用 R 中的 zoo 包实现。

LOCF 用最近记录的观察结果来代替我们的每一个 NAs。对于有两个连续 NAs 的情况——如我们之前看到的 1 月 29 日和 1 月 30 日,两者都被替换为 28 日的观察值。

LOCF 的一种替代方法是采用单一的中心测量值进行插补,例如整个数据集中已知观测值的平均值。这里,这将通过将 2020 年的平均温度(即 19.6 摄氏度,或 67.28 华氏度)分配给每个空记录来实现。我们可以通过 naniar 包中的 impute_mean()函数来实现。

现在,我们将 LOCF 方法和估算方法的结果与原始数据集进行比较。

在整个数据集中,LOCF 值与观察值之间的平均绝对值差为 3.99,中位数差为 3,而平均插补值与真实观察值之间的平均绝对值差为 4.62,中位数为 3.8。

虽然这两种方法都易于实现,易于向受众描述,并且对于相对可预测的数据集是可靠的,但它们也有一些缺点。对于差异很大的数据集,使用中心测量值进行插补特别麻烦。LOCF 不适用于周期性波动的数据,如波动股票的股价。

如果我们处理的数据集的值范围较窄,例如某个热带国家的温度记录、各种玫瑰花瓣的长度或几只吉娃娃的高度,那么这两种方法的缺点就不会那么明显。

也就是说,如果我们使用一月的平均温度来解释该月的差异,估算方法的准确性可能会有所提高。

但那是以后的事了。

数据来源: 澳大利亚气象局

KPI 上升可能是一件坏事

原文:https://towardsdatascience.com/when-a-kpi-going-up-can-be-a-bad-thing-7021e4d27fef?source=collection_archive---------34-----------------------

你的利益相关者应该得到比低垂的果实更好的东西

作者照片

…这是一个从来没有人来职业介绍日发表演讲的群体,这是犯罪!”伟大的哲学家伦道夫·杜普利

在处理数据时,问题和想法非常重要。移动数字并只关注 KPI 何时上升或下降可能会很棘手。没有问很好的问题就直接进入分析是犯罪!

我想介绍两个简单的假设场景,并向您解释理解业务需求/目标的重要性,以及生活在数据表的泡沫中可能会出错的地方。

你能看看转化率吗?

在第一个场景中,我们为一家牙科诊所工作。我们的 KPI 之一是“conv 比率”,其中我们使用“conv 数量”列作为分子,使用“考试数量”作为分母。

本质上,每个进来的顾客都要接受某种考试。我们希望跟踪除了标准检查/清洁之外,还有一些牙科工作的顾客的百分比。

我们正在按月查看结果。我们通常会看到 40–45%的转化率。

作者照片

每位顾客的平均消费也大幅上升(未图示)。我们要大展身手了!

照片由 Claudio Poggio 通过 Unsplash 拍摄

这看起来并不怎么好

让我们从稍微不同的角度来看这个问题。

作者照片

这开始讲述一个不同的故事。三月和四月看起来是非常好的月份。这个数据中有些东西很突出。现在是 2020 年!

那时发生了很多事情。作为一种预防措施,牙医只看那些确定需要牙科治疗的病人。要求预期“仅检查/清洁”的客户在稍后日期预订他们的检查。

尽管我们的 KPI 看起来在以天文数字的速度提高,但最终的结果是我们基本上只追逐那些‘灌篮’客户。对于未来的业务,这种策略可能不是最好的。希望我们能在太晚之前取消定制游艇的合同!

有东西在疯狂地推动销售!

在这个场景中,我们为澳大利亚的一家家用发电机公司工作。我们被要求查看电子邮件活动的一些结果。我们开始看到销售的大幅上升,看起来就像是在这些电子邮件发出后才进来的。我们或许应该给这家新的第三方营销公司送去一卡车的现金,以实现更多的未来增长。

“非常成功!”—波拉特

作者照片

电子邮件运动的影响有多大?人们认为什么样的事件会促使他们购买更多的发电机?为什么运费也在疯狂上涨?

这些订单中的很大一部分将运往美国,Snovid 在其中扮演了重要角色?!?

该死的魔鬼!—暗黑破坏神的超级巨星,埃利奥特·理查兹

这个场景不一定是一个复杂的 KPI。销量上升很好。焦点是什么会推动上升。这可能属于“相关性不等于因果关系”的范畴。

最后的想法

在数据分析/科学世界中,你不会总是有时间或资源从树顶上摘下最好的果实。只要确保你没有从地上捡起腐烂的水果,并试图把它当作闪亮美味的食物。

在小组中提问会激发更多的问题和思考。当这些问题和想法流动时,指南针上的指针才真正开始指向正确的方向。

一如既往,继续学习!

当时间序列像鸭子一样呱呱叫时

原文:https://towardsdatascience.com/when-a-time-series-only-quacks-like-a-duck-10de9e165e?source=collection_archive---------12-----------------------

运行预测模型之前测试平稳性。用 Python。和一张小鸭子的照片。

ADF、KPSS、OSCB 和 CH 检验平稳性和稳定的季节性模式;以及如果它们提供相互矛盾的结果时如何处理它们。

为了避免可能导致预测模型不完善的陷阱,我们将并行应用 ADF 和 KPSS 检验,以检查时间序列是否不仅像鸭子一样呱呱叫,而且像水鸟一样摇摇摆摆。我们还将运行 OCSB 和 CH 测试,以检查是否需要季节差异。

黄色和棕色的小鸭子照片 Unsplash 上的自由动物形象

我们的资料来源包括东达科他马州下泰德马什小镇(完全是虚构的)1200 个月的历史气温记录。下蒂德马什镇档案馆在 20 世纪 80 年代被一场厨房火灾摧毁,之后(或者,正如一些居民告诉我们的那样,因为)志愿消防队前来救援。温度记录必须通过采访两位百岁老人来重建。时间序列是合成的,由正弦季节成分组成,反映了东达科他州的严冬和温和的夏季;过去一个世纪的全球变暖趋势;和表示估计不确定性的白噪声分量。

你可以通过上面的链接从 Google Drive 下载小的 Temp.csv 源文件(大约 33 kB)。Jupyter 笔记本可通过第二个链接获得。

0.属国

1.数据处理

下载源数据文件 Temp.csv。

熊猫进口。csv 日期列作为对象/字符串。因此,我们将日期转换为 datetime,设置一个索引,并从索引中导出年份和月份。

让我们创建一个 pandas 数据透视表,以表格形式查看源数据。

我们使用数据透视表来计算 10 年的滚动平均温度,这将消除季节性高峰和低谷的短期波动,然后创建一个图表来研究长期趋势(如果有的话)。

该图显示了上升趋势——这是我们的时间序列不是稳定的第一个迹象。

在我们将温度输入像 SARIMA 这样的预测模型之前,我们需要测试它的稳定性。

我们可能会尝试开始某种网格搜索来寻找合适的超参数,然后让自动调整过程来识别具有最低 Akaike 信息标准的模型。但是这会导致前面提到的预测质量陷阱。

  • 信息标准代表我们希望根据自回归 AR 和移动平均 MA 项最小化的目标;
  • 而差分的顺序必须通过运行平稳性测试来预先确定。

2.平稳性测试

2.1 平稳性和差异

平稳性

“平稳时间序列的特性不依赖于观察时间。”(8.1 平稳性和差分|预测:原理和实践(第二版)(otexts.com))

如果时间序列的均值、方差和自相关结构不随时间变化,则时间序列是稳定的。如果它们不是时不变的,我们今天用来准备预报的属性将不同于我们明天观察到的属性。一个不稳定的过程会避开我们利用过去的观察来预测未来发展的方法。时间序列本身不需要在过去和未来期间保持平坦、恒定的直线才能被认为是平稳的,但决定其随时间变化的模式需要是平稳的,以使其未来行为可以预测。

时间序列需要展示:

  • 非时变均值
  • 非时变方差
  • 非时变自相关

具有先验非平稳观测值的时间序列通常可以被转换以达到平稳性。

变化无常的意思

显示强劲上升或下降趋势的序列没有恒定的平均值。但是如果它的数据点在扰动后趋向于回复到趋势线,时间序列就是趋势-平稳的。像去趋势化这样的变换可能会将它转换成可用于预测模型的平稳时间序列。如果趋势遵循可预测的模式,我们可以将趋势线拟合到观察值,然后在将去趋势序列输入预测模型之前将其减去。或者,我们可以在模型中插入一个日期时间索引作为额外的独立变量。

如果这些去趋势测量不足以实现恒定平均值,我们可以调查一次观察到的差异是否具有恒定平均值。

通过差分时间序列——取观察值 y(t)和早期观察值 y(t-n)之间的差值——我们可以获得变化的平稳(均值回复)序列。

一个时间序列,其中的任何观察只取决于它的一个或多个前导(由几个滞后分开),加上或减去一些随机误差,被称为随机行走。除了误差项之外,观测值之间的差异具有零均值,根据定义,如果误差项不包含对预测有价值信息的信号,则误差项本身具有零均值。随机漫步可能表现出明显趋势的长阶段,上涨或下跌,然后是不可预测的方向变化。恒定的平均趋势需要一阶差分。

相邻观测值之间的差异具有非零均值的时间序列将倾向于向上(正均值)或向下(负均值)漂移。我们将一个时间序列与漂移进行差分,得到一个具有常数均值的序列。

一些时间序列需要两轮差分。观测值之间的变化不是恒定的(观测值之间没有恒定的“速度”),但变化速率可能是稳定的(恒定的“加速”或“减速”)。如果两轮差分不足以使一个时间序列平稳,第三轮很少是合理的。相反,应该更仔细地研究时间序列的特性。

具有季节性的时间序列将显示出在恒定数量的周期之后重复的模式:一月份的温度与七月份的不同,但是一月份的温度在不同年份之间将处于相似的水平。季节差异将观测值与其前一个观测值之间的差异去掉 S 个滞后,S 是一个完整季节的周期数,比如一年 12 个月或一周 7 天。

如果趋势和季节模式都是相对时间不变的,差分时间序列(相对于趋势的第一差分;和相对于季节性的季节性差异)将具有近似恒定的平均值。

非恒定方差

如果时间序列呈现扩大或缩小的漏斗形状,那么它的观测值会随着时间的推移围绕其趋势波动,方差会增大或减小。它的方差不是时不变的。

通过取观察值的对数,它们的平方根,或者应用 Box-Cox 变换,我们可以通过变换稳定方差。预测之后,我们可以逆转这些转变。

非恒定自相关结构

对于任何给定的 t,两个观测值 y(t)和 y(t-1)之间的相关性和协方差不会随时间保持不变。对于平稳性,自相关应该是时不变的。

PSA #1:在拟合模型之前确定平稳性

在将预测模型拟合到数据之前,所需的差分阶数是应该预先确定的参数。调整算法可以根据选定的基准(如 Akaike 信息标准)测试超参数的任何组合。但是一些超参数可能会相互抵消。SARIMA 模型中的超参数搜索会用自回归 AR 和移动平均 MA 项来交换差分顺序的变化。

“重要的是要注意,这些信息标准往往不是选择模型差分(d)的适当阶次的良好指南,而只是选择 p 和 q 的值。这是因为差分改变了计算似然性的数据,使得具有不同差分阶次的模型之间的 AIC 值不可比。所以我们需要使用一些其他方法来选择 d,然后我们可以使用 AICc 来选择 p 和 q”(hynd man, 8.6 估计和顺序选择|预测:原则和实践(第二版)(otexts.com))。

因此,如果超参数搜索试图确定与其他参数并行的差分顺序,我们可能会获得一个较差的预测模型。这个搜索会找到一个明显最小化 AIC 或 BIC 的差分顺序。但它可能错过了一个模型,尽管它的 AIC 更高,但该模型可以导致更准确的预测。搜索算法不知道它的目标,信息标准,不能比较不同阶差分的模型。

调整算法应该在开始对其他超参数进行网格搜索之前应用假设测试来确定适当的差分顺序;或者数据科学家确定差分的顺序,然后将网格搜索限制到剩余的参数,例如 AR 和 MA 项。

PSA #2:对稳定性进行平行测试

为了确定是否需要差异,我们可以运行四个测试来获得客观的结果,这是目视检查图表可能会遗漏的:

  • 扩充迪基-富勒 ADF
  • 科维亚特科夫斯基-菲利普斯-施密特-申·KPSS
  • Osborn-Chui-Smith-Birchenhall OCSB 季节性差异
  • 卡诺瓦-汉森季节差异研究中心

我将跳过其他一些单位根测试,如菲利普斯-庇隆。

在相当多的情况下,这些测试可能会返回相互矛盾的结果。下面的例子将说明 ADF 和 KPSS 应该并行评估,而不是孤立地评估。我们中的许多人——包括我在内,当我准备我的第一份预测时——习惯于依赖 ADF 检验作为我们的平稳性检验的默认;其他人更喜欢 KPSS 测试。我想,我们当中很少有人习惯性地应用这两种测试,然后比较它们来决定差异。

2.2 增强的迪基-富勒试验(pmdarima)——像鸭子一样嘎嘎叫?

  • 零假设:数列包含一个单位根:它是而不是平稳的。
  • 替代假设:没有单位根。
  • 低 p 值是优选的。如果测试返回的 p 值低于所选的显著性水平(例如 0.05),我们拒绝该空值,并推断该系列不包含单位根。
  • 如果 ADF 检验没有找到单位根,但是 KPSS 检验找到了,那么这个序列就是差分平稳的:它仍然需要差分。
  • ADF 和 KPSS 的 pmdarima 测试提供 p 值作为输出;和一个布尔值,它是问题的答案:“我们应该不同吗?”

2.3 科维亚特科夫斯基-菲利浦斯-施米特-申试验(KPSS)(pmdarima)——但它不会像鸭子一样走路?

  • 零假设:序列围绕一个确定的趋势是平稳的(趋势平稳)。
  • 请注意,与 ADF 检验相比,KPSS 检验交换了原假设和替代假设。
  • 替代假设:数列有单位根。它是不稳定的。
  • 高 p 值是优选的。如果测试返回的 p 值高于选定的显著性水平(如 0.05),我们得出结论,它似乎是(至少趋势)稳定的。
  • 如果 KPSS 检验没有找到单位根,但是 ADF 检验找到了,那么这个序列就是趋势-平稳的:它需要差分(或者其他变换,比如去趋势)来消除趋势。

2.4 比较 ADF 和 KPSS 测试结果(pmdarima)

因此,pmdarima 测试返回相互矛盾的结果。

2.5 ADF 和 KPSS 推荐的差分顺序

pmdarima 还提供了一种返回推荐的一阶差分的的方法。

这些建议也是矛盾的,因为同样的 ADF 和 KPSS 测试被用来推导它们。

但是我们稍后将回到这些差异的顺序,那时我们将总结我们的发现并决定如何进行。

让我们用 statsmodels.stattools 测试来检查这是否只是 pmdarima 算法中的一个怪癖(提示:它不是)。

2.6 增强的 Dickey-Fuller 测试(stattools)——像鸭子一样嘎嘎叫?

  • 与 pmdarima 测试相比,我们使用 statsmodels.stattools 的 adfuller 测试来获得更多信息。
  • 零假设:数列包含一个单位根,它是而不是平稳的。
  • 替代假设:没有单位根。
  • 低 p 值是优选的。如果测试返回的 p 值低于所选的显著性水平(例如 0.05),我们拒绝该空值,并推断该序列不包含单位根。它看起来是静止的。
  • 如果 ADF 测试没有找到单位根,但是 KPSS 测试找到了,这个序列就是差分-平稳的:它需要差分。

2.7 科维亚特科夫斯基-菲利普斯-施米特-申试验(KPSS)(stattools)——走路不像鸭子?

  • 零假设:序列围绕一个确定的趋势是平稳的(趋势平稳)。
  • 替代假设:数列有单位根。它是不稳定的。
  • 高 p 值是优选的。如果测试返回的 p 值高于选定的显著性水平(如 0.05),我们得出结论,它似乎至少是趋势稳定的。
  • 如果 KPSS 检验没有找到单位根,但是 ADF 检验找到了,那么这个序列就是趋势- 平稳的:它需要差分或其他变换来消除趋势。

2.8 比较 ADF 和 KPSS 的结果——ADF 像鸭子一样呱呱叫,但 KPSS 不像水鸟一样走路

2.9 区别还是不区别?

  • 所以 ADF 测试没有找到单位根,尽管上面的图表显示了明显的上升趋势。
  • KPSS 检验报告说该序列不是平稳的。

我们如何处理冲突?KPSS 检验总是正确的吗?

2.10 视觉真实性检查:分解

  • 趋势图没有显示一个恒定的平均值,而是一个上升的趋势。该系列不能是静止的。
  • 自相关图在其 ACF 图和 PACF 图中显示了高度和持续的自相关性,并伴有季节性振荡。如果该序列表现出稳定的季节性,它就不可能是稳定的。

2.11 第一个区别:达到平稳性

我们应用差分法。diff()到原始时间序列;然后检查 ADF 和 KPSS 的平稳性。

ADF 和 KPSS 一致认为差分系列是静止的。差异系列不仅叫起来像鸭子,走路也像鸭子。

2.12 平稳——但是季节性呢?

我们已经应用了一阶差分,并从 ADF 和 KPSS 获得了良好的测试结果。尽管 ACF 图仍然显示季节性波动。

让我们运行 OCSB 和 CH 测试来决定我们是否也需要季节差异的帮助。

两个测试的 pmdarima 实现返回季节差异的推荐顺序。

奥斯本-楚伊-史密斯-伯兴霍尔 OCSB 试验:

卡诺瓦-汉森季节稳定性检验:

  • 零假设:季节性模式是稳定的

2.12 当我们调查原始数据时,我们观察到另一个冲突,这次是关于季节差异:

  • OCSB 没有确定对季节性差异的需求,类似于 ACF 对首次差异的需求。
  • CH 检验推荐一阶季节差异,类似于 KPSS 的一阶差异。

2.12b 当我们对我们在第 2.11 章中生成的一阶差分数据运行 OCSB 和 CH 时,OCSB 和 CH 同意一阶差分已经消除了任何季节差分的需要。

相反,如果 OCSB 或 CH 建议进行差分,我们将通过追加。diff(12)方法到原始系列。

pandas 中差分的语法:如果 y 是表示一系列未差分数据的变量,则:

  • y.diff(1)表示一阶差分
  • y.diff(12)表示季节性差异,如果季节性的周期为 12 个月。建议的季节差异顺序将乘以 12 的周期,以告知 pandas 函数。diff()关于从季节周期的末尾跳到前一个末尾应该使用的滞后数。
  • y.diff(1)。diff(12)或 y.diff(12)。diff(1)-用于在一行中结合第一和季节性差异。第一和季节差异的序列是不相关的——结果是一样的。
  • 【duke.edu ARIMA 车型识别规则(T3):
  • “规则 12:如果系列有一个强而一致的季节模式,那么你必须使用季节差异的顺序(否则模型会假设季节模式会随着时间的推移而消失)。
  • 但是,不要使用一个以上的季节差异或
  • 超过 2 阶的总差异(季节性+非季节性)。"

2.13 民主同盟军与 KPSS 的冲突——我们如何处理?

如果 ADF 和 KPSS 测试返回相互矛盾的结果,我们该如何进行:区别还是不区别?

作为一般规则:

  • ADF 检验和 KPSS 检验都不会孤立地证实或破坏平稳性。运行这两个测试来决定你是否应该有所不同。
  • 如果至少有一个测试声称发现了非平稳性,你应该区别对待。对躲避(平稳性)的明确确认要求两种测试都确认嘎嘎叫和摇摆。

更具体的解释是:

KPSS 和 ADF 测试结果有 4 种可能的组合

  • 如果 KPSS 和 ADF 同意序列是平稳的(KPSS 有高 p 值,ADF 有低 p 值):认为它是平稳的。没必要区别它。
  • ADF 找到一个单位根;但是 KPSS 发现这个序列在一个确定的趋势附近是稳定的(ADF 和 KPSS 具有高 p 值)。那么,该序列是趋势稳定的,需要消除趋势。区别它。或者,转型可能会让它摆脱这种趋势。
  • ADF 找不到单位根;但是 KPSS 声称它是不稳定的(ADF 和 KPSS 具有低 p 值)。那么,这个序列是差分平稳的。区别它。
  • 如果 KPSS 和 ADF 一致认为序列是非平稳的(p 值低的 KPSS;具有高 p 值的 ADF):认为它是非平稳的。区别它。

让我们将这个启发转化为 Python:

对于一阶差分,我们采用 ADF 和 KPSS 推荐的高阶差分。

对于季节性差异,我们采用 OCSB 和 ch 推荐的较高订单。为了避免过度差分,我们应该检查一阶差分是否已经达到平稳性。

在一轮差分后,代码再次运行所有四个测试——ADF、KPSS、OCSB 和 CH——以确认是否需要额外的差分。在我们的例子中,所有四个测试都同意我们在第 2.11 章中应用的一阶差分足以得到一个平稳的时间序列——我们现在可以把它交给一个预测模型。

小鸭子图片:unsplash.com 张铠麟·盖奇;

当统一的阈值不够时

原文:https://towardsdatascience.com/when-a-uniform-threshold-is-not-enough-b16da0fbb4e1?source=collection_archive---------19-----------------------

适应可以走很长的路。

你儿子是阅兵式上唯一一个步调一致的士兵?

图一。由马克·德容Unsplash 上拍摄的照片

你立刻就注意到了。不是因为这是你的儿子,而是因为你善于发现规律中的偏差。

如果你的工作是在显微镜下检查平板显示器,以检测异常像素,这种超能力可能会被证明是有用的——只要你能连续几个小时这样做而不会无聊死。

检查常规模式很容易——对任何人来说都是如此——但是非常乏味。这是一项应该用计算机视觉自动完成的任务。

织物中的缺陷

织物是具有规则图案的制成品的一个例子,任何偏差都被认为是缺陷。

让我们站在一位计算机视觉工程师的立场上,他负责设计一个自动系统,用于检测从织机上输出的布条的图像。

图二。漂亮的布料图案。在 Unsplash安娜露莎·甘博亚的照片。

在本文中,我们将使用 AITEX 织物图像数据库【1】。它由有缺陷和无缺陷的织物条的灰度图像组成。该数据库还包括指示缺陷位置的掩模。

图 3。织物带(上图)及其相应缺陷遮罩(下图)的图像。缺陷显示为黑色。来自 AITEX 织物图像数据库的图像。

图 4。织物带(上图)及其相应缺陷遮罩(下图)的图像。缺陷看起来很亮。来自 AITEX 织物图像数据库的图像。

我们将重点关注那些以像素斑点形式出现的缺陷,这些像素的灰度明显高于或低于其周围环境。我们将不描述织物的质地。

你可以在这里找到本文中使用的代码。

一种合理的方法是应用阈值操作来突出亮像素,并应用反阈值操作来突出暗像素。阈值(对于两种操作)将必须单独计算,因为整体灰度级从一幅图像到下一幅图像变化很大。

均匀阈值

一个好的起点是评估图像的中间灰度级,因为中间灰度级不会受到图像左侧的太大影响,在图像左侧,成像系统可能在织物带到达照相机的成像线之前扫描列。然后可以通过将灰度级中值加上(对于标准阈值)或减去(对于逆阈值)一个固定量来设置阈值。这些增量值的大小将决定阈值操作对于亮像素和暗像素的敏感度。

我们将这种方法称为 统一阈值 ,因为单个阈值和逆阈值将统一应用于图像。

我们首先模糊图像以衰减其高频成分,假设缺陷将大于几个相连的像素。OpenCV 函数 cv2.blur() 对中心像素附近的灰度级进行均匀平均。我们选择一个足够大的邻域大小,以使不需要的图案消失,但是足够小,例如足够大的缺陷仍然从背景中清晰地突出。

图 5。使用 11x11 的邻域大小进行均匀平均的模糊效果。图片由作者提供。

为了计算中位数,我们调用 NumPy 的函数 np.median()

标准阈值和反阈值操作都由 OpenCV 函数 cv2.threshold() 实现。函数参数中的“类型”标志指定了所需的操作类型。我们通过偏移刚刚计算的中值灰度级来获得两种操作的阈值。

标准和逆阈值。作者代码。

在将暗像素的掩模与亮像素的掩模合并之后,我们得到异常掩模,突出灰度级足够暗或足够亮的像素。如果我们忽略图像的左侧,在某些情况下我们会得到好的结果。看起来我们只差一点点了!

图 6。统一阈值成功识别异常的三个例子(红色=明亮;蓝色=深色)。图片由作者提供。

但这并不是故事的结尾!

随着我们测试更多的图像,我们发现织物带的大部分区域被检测为亮或暗,而我们的判断告诉我们这些区域不应被视为异常。

图 6。三个示例中,统一阈值突出显示了没有异常的区域。图片由作者提供。

我们达到了统一阈值方法的极限。经过一些研究,我们观察到,在某些情况下,当我们从左向右扫描图像时,平均灰度级缓慢变化。

图 8。每列的平均灰度级示例。变化是显著的。图片由作者提供。

原因可能与成像系统有关。也许图像是用线扫描相机拍摄的,并且光照强度或积分时间不是恒定的。这也可能与产品本身有关:织物的颜色可能会随着条纹的变化而变化。我们不知道为什么,但我们必须处理这个问题。

统一的门槛是不够的。

自适应阈值

自适应阈值正是为这种情况而发明的。不是对整个图像使用单个阈值,每个像素都计算其阈值,因此有了限定词自适应

对于给定的中心像素,评估邻域中像素的灰度加权平均值。阈值是平均灰度级,偏移某个常数以提供所需的灵敏度级别。在输出遮罩中,将中心像素灰度级与其自己的个性化阈值进行比较。

自适应阈值处理允许高亮显示与它们的邻域有足够差异的像素,而不是简单地高于或低于统一阈值。

图 9。左图:棋盘的原始图像。中心:均匀阈值由于光照不均匀,无法同时分割黑色和白色方块。右图:自适应阈值处理可以同时分割黑色和白色方块。图片由作者提供。

回到均匀阈值处理没有产生良好结果的织物图像情况,我们可以找到一组工作得更好的参数,使用自适应阈值处理(由 OpenCV 函数cv2 . adaptive threshold()实现)。

标准和反向自适应阈值处理。作者代码。

图 10。当平均灰度级沿 x 轴缓慢变化时,自适应阈值产生更好的结果。图片由作者提供。

从这一点来看,下一步将是基于维度标准和与其他斑点的接近度(或者机器学习,如果我们有足够的例子)来过滤异常掩模斑点。这将是一个巨大的挑战,但至少,通过这个简单的技术,我们摆脱了与织物缺陷无关的伪像。

结论

在自动化系统检测零件的制造环境中,经常会遇到类似于我们刚刚观察到的图像不一致的情况。照明条件可能不同,被检测的零件可能有不同的颜色或反射率,多个摄像头可能有不同的灵敏度,等等。

设计对这些变化具有鲁棒性的计算机视觉系统是至关重要的,因为它们不是制造工程师和操作员所关心的:找到缺陷而不被大量的错误警报所超载。有时,像使用自适应阈值这样简单的事情会有很大帮助。

[1] AFID:用于缺陷检测的公共织物图像数据库。Javier Silvestre-Blanes,Teresa Albero-Albero,Ignacio Miralles,Rubén Pérez-Llorens,Jorge Moreno,AUTEX 研究杂志,2019 年第 4 期

当人工智能出错时

原文:https://towardsdatascience.com/when-ai-gets-it-wrong-2d561e7d7d73?source=collection_archive---------69-----------------------

人工智能校准和安全

实现人工智能的承诺需要什么样的伦理框架?

图片来自 Nick WessaertUnsplash

2020 年 12 月初,蒂姆尼特·格布鲁(Timnit Gebru)在提交了一篇概述使用基于人工智能的语言模型所引发的伦理紧张的论文后,被谷歌解雇。这一事件在科技行业引起了很大的轰动,突显了大型科技公司面临的道德问题以及它们在内部管理这些问题的努力。

正如《麻省理工技术评论》的一篇文章所强调的[1],这些模型的形成是非常消耗二氧化碳的。神经架构研究的变压器模型(213M 参数)的形成消耗了超过纽约-旧金山往返行程的二氧化碳当量的 300 倍。这些庞大的训练数据集的另一个问题是不可能仔细检查数据集的组成并识别偏见不道德内容。这很容易导致种族主义或非包容性的模式。

来自 Strubell 等人的数据,来自作者的可视化,来自 Good Ware 的图标

这是与人工智能模型不断增长的能力和可扩展性相关的风险的最新例子。如果不仔细考虑,他们很容易在许多方面危及我们的社会。为了让这些新产品获得系统用户的信任和认可,必须定义一个清晰的道德框架,如上所示,内部道德控制可能不是解决方案

人工智能带来的挑战

人工智能的使用引发了许多问题:

  • 当使用人工智能工具做出的决定伤害了某人,并且你无法解释这个决定是如何做出的,会发生什么?
  • 我们能在多大程度上防止算法重现人类行为的错误和偏见?
  • 如何防止人工智能加剧排斥和贫困
  • 人工智能的使用如何适应联合国设定的全球目标框架?
  • 在一些领域,如生命攸关的医疗保健,失败不是一个选项,我们迫切需要了解何时使用和何时不使用模型以及如何获得问责

深度神经网络可能无法推广到非分布输入,包括自然的、非对立的输入,这在实时设置中很常见。(2)

什么是负责任的 AI?

随着模型变得越来越复杂,我们会遇到隐私、T2、可解释性、公平、歧视等问题。负责任的人工智能确保我们与社会价值观保持一致。我们希望我们构建的产品是包容的、无害的。

当向用户呈现数据时,负责任的人工智能最佳实践需要最大可能的透明性:例如为什么用户会看到一个推荐。这将帮助建立信任。此外,需要有一个良好的内部工作流程,人们评估生成的模型的结果,并验证模型正在做它们应该做的事情。最后,我们还希望得到公平(公正)的结果,而不是复制或强化你在数据中看到的偏见。

其他注意事项

当你需要了解模型的局限性,它能做什么,它不能做什么的时候,很多人就把模型下架了。此外,你构建产品的方式也必须是道德的:你是否拥有使用数据的所有必要的许可?你公平对待给数据贴标签的人吗?

当涉及到决策时

今天,在某些情况下,AI 替我们做决定。如果不是,它会影响我们的决定。

人工智能可以造成更大规模的伤害。强化刻板印象的语言模型就是这种情况。即使你的性别不在简历里,也可以通过模型推断出来,作为特征使用[3]。这些模型目前用于招聘、信用评分或由司法系统使用,它们可能导致整个人口类别的机会丧失,因为同样的启发式规则可以应用一百万次

这就是为什么我们需要后退一步,不仅要看性能指标,还要看它实际上如何改变行为。世界上没有多少公司关注他们模型的道德标准。这需要在开发模型和维护模型时进行评估。

那么我们该怎么办呢?

如果你正在构建一个人工智能产品,从哪里开始你的道德之旅是最好的?

图像来自 Unsplash 上的 Lili Popper

这些数据需要进行伦理审查

我们通常关心数据质量和数据量。现在我们还需要看看代表性:我们的数据是否公平地代表了所有类别?

我们有需要注意的敏感数据吗,比如性别、种族或国籍?从数据集中移除这些特征通常是不够的。例如,使用高度相关的其他特征(你住在哪里,你的爱好是什么……)来重建种族数据是可能的。

人工智能团队需要接受教育,不仅要追求模型的准确性,还要追求模型背后的责任。

追求数据的多样性和包容性

良好的数据多样性意味着你不仅仅是强化已经很明显的现有趋势。例如,仅基于购买次数的项目推荐系统将突出众所周知的现有项目,并对尚不知名但可以提供更好的原创建议的新兴设计师隐藏新项目。最后,模型不会很有用。

寻求多样性需要检查隐藏在系统和流程背后的歧视|图片来自克里斯蒂娜@ wocintechchat.comUnsplash

某些群体得到了更有利的结果吗?

这一努力需要包括来自非常不同地方的人们的声音,以便不重复过去的错误。[2]

“如果我们允许该领域缺乏地理多样性来定义我们自己的努力,我们这些从事人工智能伦理工作的人将弊大于利。” 阿布舍克·古普塔【2】

2019 年来自 ArXiv 的每个国家在总 AI 作者中的百分比|来自https://jfgagne.ai/的数据,来自作者的可视化

规格不足

欠规范是指在训练数据上学习了正确的映射,但没有再现自然的因果关系。当观察到的行为是多种原因的结果时,通常会出现这种情况[4]。这导致模型不能很好地概括。

在固定数据集上形成一个模型可以产生几个工作类似的模型。如果没有对模型如何做出预测的解释,它们之间的差异将不会直接可见。只有通过在现实世界中的具体例子上进行测试,我们才能看出其中的区别。

因此,为了避免生产中令人不快的意外,我们应该添加测试和规范,覆盖大量场景,甚至是不可能的场景。

“我们需要更好地准确说明我们对模型的要求。[……]因为通常最终发生的情况是,只有在模型在世界上失败后,我们才发现这些需求。”亚历克斯·达穆尔

构建能够揭示困难情况的场景

当所有的利益相关者都在房间里时,问问谁会受到你的产品的影响。确保你没有强化任何偏见。想想你的产品的用途与最初的意图不同。最后,如果出了问题,最坏的情况是什么,有办法改变吗?

可解释性

我们必须能够给出原因。

为什么我有这么可怕的信用额度?为什么我要多雇 7 个人?你为什么推荐我看这个节目?

它与解释模型预测的能力有关。

让人类参与进来

  • 当您评估模型输出时,在循环步骤中添加一个人
  • 添加手动过程:重新手动注释一些数据(可以随机选择或者使用主动学习策略)

“是的,特斯拉的过度自动化是一个错误。准确地说,是我的错误。人类被低估了。”埃隆·马斯克

Z 检验流程

几个月前,在 Zicari 教授的领导下,我们与来自欧洲和加利福尼亚的多种多样的合作者一起,开始了对两种人工智能产品的伦理检查。前者是一个机器学习系统,用作识别紧急呼叫中心脏骤停的支持工具[4],后者是一个基于深度学习的皮肤病变分类器[5]。

检查的目的是确保接受检查的产品没有表现出不适当的行为,并解决围绕它的道德紧张。

这种检查始于一个多学科专家团队的创建,他们将成为负责检查人工智能产品的伦理影响的外部行动者。

这个过程从与产品的创建者会面开始,以了解产品的规格、目标和限制。通过经历多次迭代,我们已经创建了需要考虑的信息和紧张的积压。这用于创建社会技术场景,将产品置于与演员、用户和系统的交互中。反过来,强调了紧张和困境,如果有必要,将通过建议和道德维护来分析和解决。有关该流程的更多信息,请访问网站[6]。

我将在以后的文章中更详细地描述这个伦理检查的故事。

图片来自米切尔罗Unsplash

参考

[1] 凯伦·郝,我们读到了迫使蒂姆尼特·格布鲁离开谷歌的那篇论文。它是这样说的。麻省理工科技评论。链接

[2] 阿比谢克·古普塔&维多利亚·希思档案馆,人工智能伦理组织正在重复社会的经典错误之一。麻省理工科技评论。链接

[3] 古普塔,a .,卢茨,M.J .,拉赫马尼,a .,王,K. ,2019。简历排名工具中隐含的性别偏见。

[3]Will Douglas heave archive,我们训练 AI 的方式从根本上就是有缺陷的。麻省理工科技评论。链接

[4]布隆伯格·SN、福尔克·F、厄斯伯尔·AK、克里斯滕森·HC、托尔普-彼得森·C、塞尔·MR、伯爵 CR、利珀特·FK。机器学习作为识别紧急呼叫中心脏骤停的辅助工具。复苏术。2019 年 5 月;138:322–329.doi: 10.1016/j .复苏. 2019.01.015. Epub 2019 年 1 月 18 日。PMID: 30664917。

[5]卢西耶里,巴杰瓦,M.N .,布劳恩,s .,马利克,m .,登格尔,a .,艾哈迈德,S. (2020)。使用概念激活向量的深度学习皮肤损伤分类器的可解释性。 2020 年国际神经网络联合会议(IJCNN) ,1–10。

http://z-inspection.org/the-process-in-a-nutshell/

机器学习中何时以及如何使用幂变换

原文:https://towardsdatascience.com/when-and-how-to-use-power-transform-in-machine-learning-2c6ad75fb72e?source=collection_archive---------24-----------------------

让我们看看这个强大的数据预处理工具

作者图片

专业数据科学家知道,在向任何模型提供数据之前,必须准备好数据。数据预处理可能是机器学习管道中最重要的部分,其重要性有时被低估了。

幂变换是一组在某些情况下非常有用的变换。让我们看看什么时候。

什么是电力转换?

Power transfom 是一系列使用幂定律转换数据的函数。我们的想法是对数据集的每个要素应用变换。

电源转换的目的是什么?想法是增加特征分布的对称性。如果特征不对称,应用幂变换将使其更加对称。

让我们看一个使用 scikit-learn 中的乳腺癌数据集的例子。如果我们绘制前 6 个特征的直方图,我们会发现它们非常不对称。

作者图片

如果特征不对称,某些模型可能无法正常工作。例如,如果分布是偏斜的,基于距离的模型如 KNN 或 K-means 可能会失败。为了使这些模型起作用,幂变换将使特征对称化,而不会过多地影响它们的预测能力。

一些能量转换

最常见的幂变换是 Box-Cox 和 Yeo-Johnson 变换。

Box-Cox 变换有这样的公式:

如您所见,我们有一个λ参数,可以使用最大似然法进行估计。例如,我们可以尝试最小化偏度,尽可能保持方差稳定。

这个公式必须独立地应用于每个特性。每个特征可能具有不同的λ值。

由于独立变量出现在对数中,这种变换只能应用于严格正的特征。

如果我们对之前的数据集应用 Box-Cox 变换,我们会得到:

作者图片

如您所见,新特性比原来的特性更加对称。

Yeo-Johnson 变换有这样的公式:

我们仍然有一个λ参数要估计,但现在这种变换甚至可以应用于负面特征。

我们数据集的结果是:

作者图片

同样,我们有一组可以被我们的模型使用的对称特征。

何时使用电源转换

根据我的经验,当我们使用像 KNN、K-means、DBSCAN 这样基于距离的模型时,使用幂变换是值得的。有人说它们对线性模型和高斯朴素贝叶斯有用,但我对前者比对后者更有把握。基于树和神经网络的模型不受特征对称性的影响,而如果我们只需要使用线性核,SVM 有时可能需要提前进行幂变换。

python 中的一个例子

让我们看看如何在 Python 中使用幂变换。我们将在乳腺癌数据集上使用 KNN 分类器,并看到使用幂变换将提高模型的性能,这是使用 AUROC 测量的。

这段代码可以在我的 GitHub 库这里找到。

我们先导入一些库。

from sklearn.datasets import load_breast_cancer 
import pandas as pd 
from sklearn.preprocessing import StandardScaler 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.metrics import roc_auc_score,balanced_accuracy_score
from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.preprocessing import PowerTransformer 
import matplotlib.pyplot as plt

为了简单起见,让我们导入数据集的前 6 个特征,并将它们存储到 pandas 数据框架中。

d = load_breast_cancer() 
df = pd.DataFrame(d['data'],columns=d['feature_names']).iloc[:,0:6]

我们现在可以将这个数据集分为训练和测试。

X_train, X_test, y_train, y_test = train_test_split(df, d['target'], test_size=0.33, random_state=42)

现在,我们可以在训练集上训练我们的模型,并在测试集上测试它。我们将使用 scikit-learn 中的 pipeline 对象来应用必要的特征缩放。对于第一个例子,我们将避免使用电源转换

model = Pipeline([ ('scaler',StandardScaler()),('model',KNeighborsClassifier()) ]) model.fit(X_train,y_train) roc_auc_score(y_test,model.predict_proba(X_test)[:,1])

如果不进行功率变换,我们得到的 AUROC 值等于 0.976

现在,让我们试着使用能量转换。在 Python 中,我们有 PowerTransformer 对象,它默认执行 Yeo-Johnson 变换,并自动搜索 lambda 的最佳值。如果我们愿意,我们可以使用 Box-Cox-transform,但是对于这个例子,我们将使用默认设置。缩放是可以避免的,因为 PowerTransformer 自动标准化了特性,但是显式地使用它总是一个好习惯。

如果我们对流水线应用功率变换(在缩放器之前),代码是:

model = Pipeline([ ('power',PowerTransformer()), ('scaler',StandardScaler()), ('model',KNeighborsClassifier()) ]) model.fit(X_train,y_train) roc_auc_score(y_test,model.predict_proba(X_test)[:,1])

使用幂变换,AUROC 值增加到 0.986。因此,该模型比没有幂变换特征的模型执行得更好。

结论

当我们必须处理倾斜的特征并且我们的模型对分布的对称性敏感时,幂变换是非常有用的。重要的是要记住在任何缩放之前使用它们。

如果你想了解更多关于电力转换的知识,请加入我的 Python 在线课程中的机器学习数据预处理。

原载于 2021 年 4 月 21 日 https://www.yourdatateacher.comhttps://www.yourdatateacher.com/2021/04/21/when-and-how-to-use-power-transform-in-machine-learning/

当相关性优于因果关系时

原文:https://towardsdatascience.com/when-correlation-is-better-than-causation-1cbfa2708fbb?source=collection_archive---------33-----------------------

“相关性不等于因果关系”

米凯拉·帕兰特拍摄的照片

我不喜欢这个短语。不是因为不准(当然准)。我不喜欢它被用来解除分析师的武装。这句简单的话一出口就能让任何分析嘎然而止。

当一个利益相关者说,“是的…但是相关性不等于因果关系”,那就是“你的见解不足以让我采取行动。”又名节目主持人

这个流行的短语让决策者相信,他们需要因果洞察力,以便根据数据做出决策。是的,在一个完美的世界里,我们只会根据因果洞察力行动。但是在实践中,这个要求是不合理的。通常情况下,当利益相关者需要“因果关系”来做决定时,会花费很长时间,所以他们会失去耐心,最终在没有任何数据的情况下做出决定。

例如,考虑 A/B 测试。这是当今团队处理因果关系需求最常见的方式。但是 A/B 很难正确执行——正如无数统计学家挥手试图让我们承认这一事实所显示的那样(比如这个这个)。可悲的现实是,A/B 测试需要大量的数据、完美的工程实现和高水平的统计严谨性才能正确完成…所以我们最终发布了没有有效结果的新特性。

这种事经常发生!但是,数据团队为了在一天结束时做出一个基于直觉的决定,而敷衍了事地试图证明因果关系,这对他们自己没有任何好处。我们需要改变方法。

因果关系的负面影响

现实是因果关系很难证明。它不仅需要更高水平的统计严谨性,还需要大量精心收集的数据。这意味着你要等很长时间才能做出因果关系的判断。这也适用于其他因果推断方法,不仅仅是 A/B 测试。

最终,当用数据做决策时,因果关系是一个不切实际的要求。所以让我们停止尝试,寻找另一种方式。让我们回到使用相关性。

我并不是建议一场混战。我们不想以“技术上相关”但没有合理解释的荒谬见解告终,就像这些。我说的是在商业环境中使用相关性来最大化我们做出“最佳”决策的机会。并且以这样一种方式去做,我们可以相信洞察力给了我们一个合理的预期,任何给定的决定将如何影响我们所关心的事情。毕竟这是数据的目标。

解决方案:一种使用相关性来通知决策的启发式方法

为了从相关性中获得可信的见解,我们希望最大化我们在数据中看到的相关关系实际上是因果关系的可能性。我们可以通过以下四个最佳实践来做到这一点。

1.测试相关性时要有意识

不要把随机的事情联系起来。搜索足够长的时间,你一定会发现一个真正“令人惊讶”的相关性,就像这个。最有可能的是,这种关系是由于机会,现在你已经浪费了你和其他人的时间。统计学家将这种方法称为“p-hacking”。

相反,把重点放在已经联系在一起的事情上。一个很好的方法是关注顾客的行动。如果你试图关联以客户行为为中心的数据,你肯定只能探索以某种方式实际上关联的行为。听起来很简单,但是很容易被忽略。例如,我们不应该看“我们开设课程的时间”如何影响客户注册的可能性,我们应该看“客户看到课程的时间”如何影响他们注册的可能性。因为我们从客户及其行动的角度看待所有行为,所以我们可以保证这些行动是相互关联的,从而增加了我们看到的相关关系也是因果关系的可能性。

2.关联转换率,而不是总数

在大多数分析中,我们试图判断一个特定的决定或变化将如何影响客户的行为。客户行为最好用转化率来表示,而不是总数。如果我告诉你,10 个人转化了 30 个人,这并不能告诉我太多关于客户的行为心态。如果我告诉你网站上 10%的人转化 vs 30%的人,那么你对客户的转化意愿有所了解。

现在,想象一下试图将电话查询总数与总转化率联系起来。我们可能会发现,电话咨询总量的增加与总转化率的增加高度相关。显然是的,因为我们的漏斗中有更多的人,但是我们直觉地知道更多的电话询问并不会导致更多的转化。它们只是相互关联,因为它们都受到另一个因素(体积)的影响。通过查看转换率,我们可以更容易地梳理出可以用来影响客户行为的见解。

您可能还想关联其他标准化指标(如平均订单值),但如果可能的话,应该避免这样做。这些指标可能会有更多的差异,这意味着您要么需要更多的数据来找到可靠的见解,要么需要对指标进行降维(有效地将其转化为转换率)以减少差异,然后再进行分析。我现在不会在这个问题上讲太多细节,但是我们会在以后的博客文章中涉及到它。与此同时,转换率永远是一个安全的赌注。

3.确保趋势在较长时间内保持一致

您的业务和客户总是在变化,因此了解这一点非常重要。很多时候,我们会以汇总的方式查看相关性,从我们的分析中剥离时间。但是一切都在随时间变化,所以过去存在的相关性今天可能已经消失了,如果你不分析数据,你永远不会知道。

由于历史行为是未来行为的最佳预测者,我们需要了解数据是如何随时间变化的,尤其是当我们正在分析的要素也在变化时。如果有 X 的人一直有更高的 Y,那么我们知道我们可以更容易地相信,当我们让更多的人做 X 时,我们也将有更好的机会增加 Y。只要影响随着时间的推移是一致的,我们就可以更有信心这些趋势在未来也是可靠的。

证明这一点的一个很好的练习是回顾你以前运行的 A/B 测试。当我们这样做的时候,我们发现其中一些在短时间内具有统计学意义,并且随着时间的推移并不一致。这是 A/B 测试中常见的风险,因此,许多专家建议运行 evergreen 测试。但是这带来了很多工程上的复杂性,大多数团队最终都没有设置好。

4.始终监控结果

使用相关性的坏处是,我们可能是错的。尽管当我们遵循上面的最佳实践时,这种可能性降低了,但它仍然是一种风险。但是,如果我们能够对相关的发现迅速采取行动,并警惕地监控结果,我们就可以极大地降低任何错误决策演变成灾难的风险。顺便说一句,这也适用于因果洞见。事情总有不按你预期的方式发展的风险(就像这个警示故事)。

在监控结果的时候,追踪你所做的改变是如何影响你想要达到的结果是很重要的。假设您发现使用折扣代码的客户与平均订单价值之间存在正相关关系。一旦你发现一个相关的趋势,你会想慢慢地将客户量转移到有更好表现的群体中。然后,我们可以使用下图监控结果。

作者图片

如果我们能在做出改变的同时跟踪这些数据,我们就能知道我们是否做出了正确的决定,如果没有,我们就会很快失败。

一种可重用的、可靠的方法

我们可以将这种方法自动化,分析将类似于下面的分析,使决策者能够更快地做出更多数据驱动的决策。

作者图片

结论

在实践中,我们需要准确的洞察力,我们需要快速行动。等待两个月的因果分析或四周的 A/B 测试是不会成功的。但是,如果我们能够对相关性迅速采取行动,特别是当它们已经使用上述技术进行了严格评估时,我们将能够更快地做出更好的决策。所以,让我们放弃“相关性不等于因果关系”这句话,对相关性本身多一点信心。

原载于 2021 年 8 月 11 日 https://www .叙述者. ai

支持向量机什么时候会失败?

原文:https://towardsdatascience.com/when-do-support-vector-machines-fail-3f23295ebef2?source=collection_archive---------5-----------------------

托马斯·索贝克在 Unsplash 上的照片

何时使用和不使用它们,以及如何使用

介绍

你可能碰巧看到了我的上一篇关于介绍支持向量机(SVMs)的文章,在这篇文章中,关键的基本概念在一个高层次上被介绍了。在本文中,我们将讨论在分类和回归用例中,支持向量机何时不适合使用。

1)支持向量机不适合大型数据集

已知最初的 SVM 实现具有具体的理论基础,但它不适合在大型数据集中进行分类,原因很简单-算法训练的复杂性高度依赖于数据集的大小。换句话说,训练时间会随着数据集的增长而增长,直到由于计算限制而变得不可行为止。

从好的方面来看,自 1992 年美国电话电报公司贝尔实验室首次实施以来,SVM 已经取得了一些进展[1]。如今,随着数据集规模的增大,训练支持向量机的可扩展性大大提高。

2)支持向量机在不平衡数据集中表现不佳

这有两个更好的理由。第一个是软利润优化问题的弱点。当不平衡数据用于训练时,这导致超平面偏向少数类。

第二个原因源于不平衡支持向量比率的问题,即正和负支持向量之间的比率变得不平衡,结果,超平面的决策边界处的数据点被分类为负的可能性更高。

然而,有一些方法可以减少这种影响。一种更常用的方法是引入类别权重,因此正面支持的大小将成比例地高于负面支持向量的大小。当使用不平衡数据集进行训练时,类权重也用于其他机器学习算法中。

3)具有“错误”核的支持向量机

这有点直观。对于现在的支持向量机来说,选择正确的核函数是关键。例如,当数据不可线性分离时,使用线性核会导致算法性能不佳。然而,选择“正确的”核本身是另一个问题,在所使用的技术中,流行的技术包括在超参数搜索中改变核函数。

4)当数据中有太多噪声时

在这些有噪声数据的情况下,目标类是重叠的,也就是说,要素可能具有非常相似或重叠的属性。由于优化算法的性质,这可能导致达到几个局部最优,特别是对于高维数据集。

然而,值得注意的是,对于具有高偏差的核,例如线性和多项式核,噪声不应该是问题。噪声问题应该更多地存在于诸如径向基函数(RBF)的低偏差核中。

附加备注

虽然使用原始 SVM 算法有几个众所周知的缺点,但多年来已经进行了大量研究来改进它,使得上述现有影响不太严重,并且可以通过其他方法来减少/减轻。

参考

[1] Boser,b .,Guyon,I .,Vapnik,v .:最优间隔分类器的训练算法。《第五届计算学习理论年度研讨会论文集》,匹兹堡(1992)

[2]巴图维塔和帕拉迪(2013 年)。支持向量机的类别不平衡学习方法。在不平衡的学习中。https://doi.org/10.1002/9781118646106.ch5

当 Google Analytics 和 Data Studio 不够用,是时候转而使用 Google BigQuery 了

原文:https://towardsdatascience.com/when-google-analytics-and-data-studio-arent-enough-and-it-s-time-to-switch-to-google-bigquery-ff286fcdf8d8?source=collection_archive---------23-----------------------

来源: Unsplash

让我们弄清楚什么时候应该放弃标准的 Google Analytics 和 Google Data Studio 解决方案,转而考虑选择数据仓库

业务越来越多地转移到网上,2020 年已经表明,许多行业的公司没有网上业务根本无法生存。自然,在线客户越多,在线用户活动就越多,营销分析师就越需要处理数据以获得有用的见解。

这些数据必须存储在某个地方,进行处理(最好是实时处理),并无限期存储。毕竟,对于一个有经验的营销人员来说,历史数据是一笔真正的财富。

让我们弄清楚什么时候应该放弃标准的 Google Analytics 和 Google Data Studio 解决方案,转而考虑选择一个数据仓库。

挑战

许多人都熟悉这样一种哲学:如果一切正常,不要碰它,因为你会弄坏它。一方面,这种说法非常合理,但另一方面,企业的需求往往很快超出定制服务的能力。

如今,游戏规则正以惊人的速度变化着。移动和智能设备使营销变得复杂,并不断增加营销中使用的数据量。从 GlobalWebIndex 的 2020 年全球媒体情报报告中可以看出,这种趋势不会消失。

来源: eMarketer

为营销报告生成数据的设备数量每天都在增加。相应地,营销专家处理的数据量也在增长。仅仅使用关于销售和广告活动的信息已经不够了。营销报告应该考虑许多不同来源的数据(广告服务、网站、移动应用程序、在线商店、线下商店、客户关系管理系统和呼叫跟踪系统)。同时,来自不同来源的数据也有不同的组织方式。

几乎所有营销人员使用的标准服务,如谷歌分析和谷歌数据工作室,都有其局限性。它们的灵活性和可扩展性不足以应对不断变化的需求。此外,许多公司根本缺乏处理数据的资源。因此,大多数信息都有未经处理和未被使用的风险。

营销分析师的首要任务是尽可能快、尽可能便宜地为他们的公司提供高质量、有用的见解。云服务和数据仓库在这方面发挥了重要作用,提供了重要的扩展解决方案和设置灵活性。让我们来看看如何理解什么时候该改变你正在使用的工具。

什么时候使用 Google BigQuery 才有意义?

大多数公司使用谷歌的知名和受欢迎的服务。然而,并不是所有的服务都同样有用,也不是所有的服务对所有的公司都合适或必要。这完全取决于企业和行业的规模。从逻辑上讲,只有一个登录页面的初创公司和大型全渠道零售商需要不同的分析工具。为了避免不必要的金钱和时间支出,公司必须清楚地了解自己需要什么。

当您遇到以下服务的局限性时,是时候改变您的分析系统了:

谷歌分析

注意!在本文中,当我们谈论谷歌分析时,我们指的是通用分析。谷歌最近推出了名为谷歌分析 4 的新版谷歌分析,这是新用户的默认选项。下一代谷歌分析有其优势和局限性,但目前(截至 2021 年初),该产品仍在完善、改进和更新中。

如果你还没有太多的数据,或者你刚刚推出你的在线商店,那么谷歌分析(即通用分析)非常适合你。一开始,如果你只有几个广告源,你可以很容易地手动下载数据。但是随着广告渠道和活动数量的增加,考虑自动化是值得的。否则,你会发现自己陷入了例行和无聊的数据传输。为了节省时间和避免人为错误,你应该自动化你的营销。

OWOX BI 允许您轻松快速地将不同广告服务的成本数据自动收集到 Google Analytics 和 Google BigQuery 中。此外,OWOX BI 检查 UTM 标签,并自动将所有成本数据转换为您的基础货币。

回到 Google Analytics 的数据收集限制:这项服务是免费的,可以处理世界范围内的大量信息,从逻辑上讲,它对数据收集设置了限制。这些限制适用于所有 Google Analytics 收藏标签、库和 SDK。

如果你有一家小企业或一家初创公司,每年的广告预算高达 10 万美元,你就没什么好担心的。你不太可能超过服务限制。但是那些一年广告预算在 10 万美元或以上的公司应该小心了。您很容易超出限制,并因此丢失有关用户行为的重要信息。您需要非常小心这些限制:

  • 测量协议,Android SDK,iOS SDK,gtag。js 和分析。js —每个用户每天 200,000 次点击,每个会话 500 次点击
  • Web 属性、属性、跟踪 ID —每个属性每月 1000 万次点击
  • 移动片段,遗传算法。js 和任何其他遗留跟踪库——每个会话 500 次点击

当然,很难错过谷歌分析关于超出限制和限制新数据收集的信息。但是我们的目标是不要坐以待毙,然后四处乱跑,惊慌失措。意识到这些限制并在达到这些限制时有一个行动计划是很重要的。事实上,当你达到这些极限时,你可以向三个方向移动:

  1. 转到谷歌分析的付费版本。
  2. 保持免费版本,但是减少了监控参数的数量。
  3. 使用数据收集连接器、云存储和可视化服务,专门为您的企业设计定制的分析系统

数据工作室

Google Data Studio 是一款出色的数据可视化服务,可以与其他 Google 产品进行本地集成,并具有许多优势:

Data Studio 还包括许多过滤器、页面和报表级别的元素、计算字段、简单的共享选项以及许多其他功能。

您可以在两个级别使用此服务:

  • 基础。根据 Google Analytics 的数据创建报告。
  • 高级。根据不同数据源的数据创建报告(内部 CRM 系统、广告服务的成本数据)。

如果您需要基于一个或两个数据源设置一个直观易懂且优雅的仪表板,Data Studio 非常适合小公司和初创公司。但是不要忘记这个服务是为数据可视化而设计的。它的缺点包括缺乏对 Excel 文件的支持(来自 Excel 的数据必须手动连接),自动仪表板更新速度慢,以及缺乏使用许多数据源的复杂可视化。

Data Studio 功能对于大多数中型公司来说已经足够了,只要它们使用单一数据源。换句话说,您需要将不同来源的数据上传到同一个数据存储中,在那里对数据进行处理,然后上传到 Data Studio。

但是对于每年广告预算超过 100 万美元的大公司来说,处理的数据量对于这项免费服务来说实在是太大了。为了解决这种数据困境,你可以使用 Google BigQuery,它让公司能够在几分钟甚至几秒钟内处理数 Pb 的数据。

什么是 BigQuery?

不同的企业(即使他们来自相同的细分市场)对营销分析有不同的要求——销售渠道、购买频率以及品牌推广和客户保持的方法。值得注意的是,Google BigQuery 的发展使得市场上的所有公司都可以进行大数据分析,而不仅仅是大公司。

Google BigQuery 是一个完全托管的无服务器数据仓库,能够安全、可扩展地分析数 Pb 的数据。此外,作为谷歌云平台的一部分(根据 Forrester Research 的数据管理领导者),该服务与谷歌产品进行了内置集成。

图片由作者提供

Google BigQuery 简单快捷,许多专家都可以使用它。它还带有现成的 SQL 查询集,因此您可以从收集的数据中获得有用的见解。它的其他优势包括:

  • 安全可靠。控制对加密项目或数据集的访问,实施身份访问管理(IAM)。
  • 可扩展性。根据贵公司的规模、性能和成本要求定制数据存储。
  • 成本优化。获得现收现付的定价选项和预测成本的能力。
  • 实现价值的时间。轻松快速地开始使用 Google BigQuery,探索数据以找到有用的见解,并更快地抓住新的商机。

BigQuery 有助于减轻公司管理、控制、维护和保护数据仓库基础设施的负担。这使得组织能够专注于实现业务目标。

此外,不要忘记,当你为营销部门创建一个分析系统时,你应该始终关注两个因素:

  1. 您的企业应该能够完全访问和控制其数据。
  2. 数据应该呈现在一个方便、熟悉、适合决策者的界面中。

当使用 Google BigQuery 时,您可以确保满足这些条件。虽然我们认为这项服务是营销分析师的一个真正发现,但它不能被称为完美无缺。Google BigQuery 限制传入请求的数量、每天更新表的数量等等。为了避免不必要的例行和繁琐的工作,我们建议设置从所有数据源自动导入数据。

市场认可的大型连接器,如 OWOX BI 已经与 Google BigQuery 合作多年。OWOX BI 收集数据并将数据(来自谷歌分析、广告服务、网站、线下商店、电话跟踪系统和 CRM 系统)合并到谷歌 BigQuery 中。因此,您可以以统一的结构接收所有数据,并可以使用它来创建任何报告。

图片由作者提供

用 Google BigQuery 集成数据

如果您决定使用 Google BigQuery 来研究您的数据,那么请注意,这样做的第一步是准确地识别您需要处理的所有数据源。这可能包括各种服务、平台和应用程序,如 Google Analytics、广告服务、网站、线下商店、呼叫跟踪系统和 CRM 系统。对于许多公司来说,这是使用 BigQuery 的主要挑战。

请注意,要从非谷歌产品自动上传数据,您需要一个处理和传输数据的平台,如 OWOX BI Pipeline ,它为每个人提供流行和定制的连接器。

许多营销人员被 BigQuery 吓坏了,因为他们必须等待分析师准备好报告或了解 SQL。OWOX BI 是专门为将数据存储在 Google BigQuery 数据存储中的营销人员设计的。

OWOX BI Smart Data 将您的数据以适合您业务模式的格式进行组合,并允许您在简单的报告设计器中轻松构建报告。数据只有在给你的企业带来优势时才有价值。您可以完全专注于您的业务目标,而智能数据则关心您的数据源和数据结构,并考虑您的业务模型。该产品为营销人员提供了一个解决方案,无需 SQL 查询,只需点击几下鼠标即可构建报告。

无需任何编码即可获得现成的营销报告!通过使用简单的 OWOX BI Report Builder 界面,您无需了解数据的结构或等待分析师的响应。只需选择您希望在报告中看到的维度和指标,智能数据就会以您能够理解的方式即时显示您的数据。

图片由作者提供

关键要点

  • 为了应对现代数据驱动营销的复杂性,您需要创建一个适合您业务的营销分析环境。
  • 从小步开始,但要有未来发展的规划。
  • 对于有望使用大数据的成长型企业来说,云存储是最佳选择。
  • 使用像 Google BigQuery 这样的服务可以降低运营和材料成本,确保项目的可扩展性,并利用包括机器学习在内的高级功能。
  • 通过将您的数据工作负载迁移到 BigQuery,您将降低基础设施维护成本,并有时间发挥创造力,寻找强大的见解和想法来实现您的业务目标。

了解数据操作

原文:https://towardsdatascience.com/when-i-was-told-to-lead-the-dataops-initiatives-at-work-i-didnt-know-where-to-begin-489b6aa751ca?source=collection_archive---------33-----------------------

行业笔记

当我被告知在工作中领导数据运营计划时,我不知道从哪里开始。所以我从最容易的地方开始,通过谷歌搜索。

数据操作的定义很无聊。这是:

DataOps 是一种自动化的、面向流程的方法,由分析和数据团队使用,用于提高质量和缩短数据分析的周期时间。—维基百科

好吧,所以任何与流程、政策、框架有关的事情,为了缩短分析周期,提高数据质量,确保数据正确性,强调协作和自动化,都是数据运营。

起初,这听起来让人不知所措。数据操作的定义是如此模糊和宽泛,以至于它似乎涵盖了数据世界下的一切。我过去常常花数小时与我的经理讨论和辩论什么是数据运营,什么不是数据运营。我需要清楚地定义数据运营,否则我该如何为数据运营团队制定计划和路线图?

幸运的是,经过一段时间的研究和与我的经理交流,我对 DataOps 有了更好的理解。我想在这里分享的是我个人对数据操作相关工作的理解。虽然有些细节只适用于我的工作场所,但我相信也有适用于任何地方的普遍经验。

第 1 部分:为什么选择 DataOps?

简而言之,DataOps 是管理日益庞大和复杂的数据的一种方式。如果你只有少量的数据管道,你就不需要数据操作。无论有没有框架,工程师都可以轻松管理管道。

当你有更多的数据时,比如由数百个不同来源创建的数百条管道,管理它们将会变得更加棘手。如果您想快速、高效地扩展,您必须有一个一致的方法来收集、处理和理解数据。你需要某种框架,那就是数据操作。

第二部分:如何做数据操作?

我将尝试通过给你一些数据操作相关工作的常见主题来解释这一点。

1.找到共同的模式,对每个用例进行归纳

是的,这一点也不奇怪。与编码类似,找到一个好的抽象有助于使数据更容易管理,更不容易出错。

在一家高速发展的公司中,数据量和数据管道的数量呈指数级增长。数据工程团队的发展速度赶不上数据的增长速度,那么我们如何处理不断增长的数据需求呢?

虽然对新管道的需求迅速增加,但幸运的是,不同类型的数据问题数量很少。通过标准化,并认识到数据问题的共同模式,我们能够建立通用框架来处理数据。当我们创建一个通用框架来解决一种类型的数据问题时,我们就解决了所有相同类型的数据问题。这可以应用于任何需求不断增长的问题,比如创建新的数据管道、新的数据模型、管理数据访问等。对于每个问题,找出共同的模式,并为其设计解决方案。

这里有一个好的建议,在制定任何规则和设计解决方案之前,先列出用例及例子。列出用例可以帮助你可视化和识别现有问题空间中的模式。将每个模式或用例放在不同的桶中进行分类。列出每个存储桶中项目的属性。然后设计一个规则,定义什么进入同一个桶。如果规则必须变得复杂,以确定哪个用例属于哪个存储桶,那么用例的类别很可能没有被清楚地定义。回去重新设计存储桶,而不是改变规则或创建复杂的分类规则。冲洗并重复。

测试用例是否被清晰定义的一个好方法是尝试把一个新的数据问题分类到一个桶中。如果所有新的数据问题都可以很容易地归入定义的桶中,那么恭喜你!您已经找到了共同的模式,现在您可以着手为它们中的每一个设计解决方案。基本上,它是对数据模式进行切片和切块,直到您达到足够好的折衷:一个足够健壮的解决方案,以满足任何已知数据问题的变化,并高度覆盖所有不同的用例。

这一过程的难点在于正确地构建问题。设计解决方案更加容易。如果你没有解决方案,很有可能互联网上的其他人有。但是,要确保问题得到正确解决,需要更多的考虑和思考。花点时间把这个问题弄清楚是值得的。这是您如何确保在为 it 设计解决方案时,您所付出的努力是值得的。

2.文档文档文档

随着公司的发展,不可避免的是,跨部门的团队越来越分散,越来越难保持相同水平的团队凝聚力。虽然口头交流只能做这么多,但书面和记录的交流是永恒的。文档是组织中最被低估的工作。随着公司规模的扩大和多样化,文档的重要性只会增加。做得好的话,文档可以节省时间,保留知识,并提高用户的生产力。是跨部门同事沟通理解最有效的方式。随着公司员工的来来去去,文档有助于用户快速加入,并确保他们离开时上下文不会丢失。

有了数据,这敲响了更真实的警钟。数据通常很难理解,因为它有许多维度。它不仅仅是您在表格中看到的列和行。要理解数据,用户需要理解数据的 5W1H。它从哪里来的?谁创造的?什么时候产生的?是如何产生的?创建数据的目的是什么?谁使用它?这些问题的答案可能来自几个方面,这取决于我们查询的是数据流的哪一部分。

如果你不想陷入一个恶性循环中,总是问一些关于数据的简单问题并寻找答案,那么数据文档会有很大的帮助。像 Amundsen 这样的数据发现工具是现有的最好的开源工具之一,旨在解决核心的数据理解和发现问题。

在扩展团队时,记录我们的工作方式以及工具在公司中的使用方式是至关重要的。写好文档可以节省大量时间,也许是最大的节省。当新用户加入时,他们可以浏览文档,了解所创建的指南和框架。它简化了与每一个新来者握手和重复的时间。它还可能节省用户花费在从头开始计算和重新发明轮子上的时间。当用户浏览文档时,他们可能会发现更好的做事方法。然后,用户可以向原始文档创建者提供反馈,他们可以就改进流程进行建设性的讨论。可以立即修改文档以反映更好的和改进的过程,并且阅读文档的以下用户将受益于结果。

随着数据工程师设计框架并向公司引入更好、更新的工具,我们也有责任分享关于它们的指导方针和资源。录制的研讨会和有用的阅读材料也记录在案,让用户发现和了解它们。这鼓励了组织内部的知识共享和自我学习。用户可以在自己的时间阅读和学习他们角色之外的新事物。有了更好的知识,用户和工程师就可以按照概述的最佳实践创建更高质量的管道和数据资产。随着数据质量的提高,数据消费者在使用数据时也会获得更好、更顺畅的体验。

记录数据问题也是我们团队采用的一种做法。这种实践帮助我们阐明痛点,评估影响,并允许我们创建一个更清晰的问题描述。如果有什么不同的话,记录可以帮助我们更清晰地思考。每当我们处理一个新问题时,我们都从创建一页纸开始。在这篇一页纸的文章中,作者首先描述了当前的状态,列出了棘手的问题和对用户的影响。作者随后探索了几种解决棘手问题的方法,并为每种方法提供了所需工作量的细节,然后根据影响来衡量其优先级。然后在团队成员中进行讨论,以浏览文档。这个练习有助于团队了解作者的思考过程,并使每个人对问题有相同的看法。它为团队提供了一个框架来评估问题,并随后以系统和科学的方式设计解决方案。它还允许团队在设计最佳解决方案时利用更多观众的意见。问题越复杂,在为其设计解决方案之前,我们记录并与团队交流就越重要。

3.减少与数据的摩擦

数据有生命周期。随着数据的创建,它会随着时间的推移而增长和变化。最后,当数据源被弃用时,数据也会被弃用。在数据中,变化总是意料之中的。因此,传输数据的管道以及对数据的理解也需要随着数据行为的变化而更新。为了管理数据变更,我们设计系统来减少与数据的摩擦。

当引入变化时,它可能会中断管道(仓库中的数据变得陈旧),或者它可能会引入用户没有意识到的行为变化。无论哪种方式,用户都会注意到他们的报告仪表板上发生了一些奇怪的事情,并会去敲数据工程师的门问问题。数据工程师会去敲生产商的门寻找答案。通常需要生产者和用户之间的几轮来回,才能完全理解哪里出了问题。由于缺乏背景,数据工程师通常不能完全理解用户看到的数据中的问题,以及由生产者引入的数据行为的变化。对于用户和数据工程师来说,这个过程通常既耗时又令人沮丧。这打断了他们的日常工作流程。当沟通破裂时,对数据的信任度降低,数据的价值也随之降低。当业务用户不能信任数据时,他们又怎么能信任从数据中产生的洞察力呢?

减轻这种沟通痛苦的尝试之一是设计警报系统,以便在管道事故发生时通知相关的利益相关方。管道警报发布到围绕特定数据主题的公共渠道,生产者和用户都在场。欢迎公司内使用相同数据的任何用户加入该频道并订阅警报。这确保了当管道发生故障时,所有的利益相关者都能得到通知。可以立即讨论 bug 和数据问题,并与渠道内的所有利益相关者透明地共享。这有助于改善生产者和消费者之间的沟通,缩短反馈周期,从而减少数据停机时间。生产者和消费者之间的公开交流也有助于培养一种文化,即数据的变化提前通知数据工程师和下游用户,而不是事后通知。

除了开放数据通道之外,增加数据的元数据,使其易于获取,也有助于减少使用数据时的摩擦。一天中,数据用户经常会问数据工程师一些关于数据的重复问题。管道计划何时运行?管道上次成功运行是什么时候?数据的来源是什么?这些信息和其他有用的元数据可以发布到一个集中的平台上,用户可以在那里自助服务并自己发现。它提高了数据用户的工作效率,因为只需点击一下鼠标就能找到答案,并且它将数据工程师从重复回答问题的工作中解放出来。

4.添加检查器和阻止器来管理数据

现在,我们已经设计了适合常见数据用例、文档资源和沟通指南的框架,并实现了更快的数据反馈循环,下一个挑战是让数据用户实际利用可用的正确框架和工具!

当我们向最终用户提供在数据仓库中执行操作的能力时,我们还希望管理并确保用户安全可靠地使用数据。根据墨菲定律,任何可能发生的事情都会发生。因此,我们实施检查和拦截器来防止未经授权的行为。这使我们能够保护数据资产免受人为错误的影响,确保框架按预期使用,并确保遵循最佳实践。

这就是执行过程的作用所在。我们设计的工作流在流程中嵌入了自动检查,并在用户不使用预期的工作流时阻止操作。

例如,我们实现检查以确保数据资产是根据指导原则集创建的。我们有一个集中的存储库,在那里我们存储和跟踪所有的数据转换逻辑。用户可以提出“拉”请求来创建新的数据资产或对现有的数据资产进行更改。任何变更都将触发自动检查,以确保要执行的变更遵循设定的指导原则和标准。检查失败将阻止用户创建新数据资产的能力。

我们努力在组织内实施数据记录实践。我们从惨痛的教训中学到的一点是,从长远来看,指派数据工程师来定义各个产品生成的数据的数据字典是行不通的。尽管数据工程师将大部分时间花在处理数据和管道上,但我们并不是数据的原始创造者。作为代表每个产品团队收集数据字典并记录它们的中间人,是不可伸缩的。一旦数据工程师离开产品团队去从事其他工作,数据字典就会漂移并变得陈旧。为了确保可持续的数据文档,数据字典需要从它们的合法所有者那里众包,他们是数据的原始创建者。为了实施数据文档,必须将它作为数据创建过程需求的一部分。这确保了通过管道进入仓库的任何数据都被记录在案。

重要的是,数据团队了解现有的框架和系统,并在指导用户通过正确的渠道提出请求方面发挥积极作用。例如,当用户面临一个数据问题时,我们会引导他们在开放的数据渠道中讨论这个问题,所有其他利益相关者都在场。这样就减少了多余的沟通,减少了误传。当用户有数据访问请求时,我们会指导他们通过服务台提出请求,我们会要求他们为请求提供足够的信息,并获得相应所有者的批准。对于任何可自助服务的东西,数据工程师会指引用户找到合适的文档链接,帮助他们快速起步。

为了防止关键数据集发生意外变化,我们还添加了数据测试来监控它们。数据测试的一些例子是数据唯一性检查、无效性检查、分布检查和可接受的范围/值检查。当数据测试失败时,会发送警报通知风险承担者。利益相关者必须澄清数据的变化是否是预期的。数据测试将不时更新,以反映数据行为的变化。

实现的所有检查和阻止程序应该充分覆盖仓库的所有入口点,并嵌入到用户的工作流程中。这确保了数据仓库受到充分保护,并且没有允许用户绕过该过程的漏洞。

结论

DataOps 实际上是确定数据用户工作流程中的常见问题,并加以改进。它是关于缩小差距,加强沟通,提高数据的可靠性和易用性。根据您组织中的数据缺口,数据运营任务可能会有所不同,但很可能围绕以下共同主题:

  1. 找到共同的模式,并对每个用例进行归纳
  2. 文档文档文档
  3. 减少与数据的摩擦
  4. 添加检查器和阻止器来管理数据

希望这篇文章能帮助您了解数据操作的工作方式。😃

什么时候数据才算大数据?

原文:https://towardsdatascience.com/when-is-data-considered-big-data-2f2b38942276?source=collection_archive---------36-----------------------

关于大数据这个流行词,你必须知道什么

妮娜·朗在 Unsplash 上拍摄的照片

大数据是指来自互联网、移动电话、金融行业、能源行业、医疗保健等领域的大量数据。以及智能代理、社交媒体、智能计量系统、车辆等来源。使用特殊解决方案对其进行存储、处理和评估[1]。

与大数据相关的领域和术语—按作者分类的图片

4v 的

为了处理、存储和分析数据,必须考虑以下四个挑战:

  • 数量(数据总量——2025 年的数据将是 2017 年的八倍[2])
  • 速度(数据生成和处理的速度,例如流媒体、IOT、社交媒体)
  • 多样化(结构化和日益非结构化的数据)
  • 准确性(缺乏数据质量和评估的专业知识)

技术方面

但是我们什么时候谈论大数据呢?必须收集多少数据才能被视为大数据?正常的数据存储技术通常以兆字节/千兆字节工作。当数据量达到 TB/Pb 时,我们就在说大数据。这一经验法则的原因是,当处理这种数据量时,传统系统不再足够强大,而且成本也明显更高。

大数据(存储)技术的典型特征是:

  • 分布式存储
  • 数据复制
  • 本地数据处理
  • 高可用性
  • 数据划分
  • 非规范化数据
  • 处理结构化和非结构化数据

用谷歌的 BigQuery 在几秒钟内查询大量数据——作者图片

分析和可视化方面

通过使用大数据技术,使用和分析数据有了新的可能性:

  • 通过更多可用的计算能力(关键词:云),可以更快地处理/分析更大量的数据(例如,对于机器学习是必不可少的)
  • 深度学习(基于大量数据,例如图像)
  • 实现实时报告是必要的,例如在物联网领域

但是由于大量的数据,可视化领域也带来了新的方法和挑战。因此,必须创建新的可视化技术,以使数据量对用户来说更加有形。一些示例可视化是树状图、旭日图或文字云。

爱荷华州白酒数据的树状图示例—作者图片

未来会带来什么?

虽然就数据量而言,许多公司尚未进入大数据世界,但大数据的一两个特征可能适用于他们的数据。但是有一点是明确的:数据量将不断增长,即使不是指数增长,因此为这个主题做好准备也是有用的。人们在考虑他们的 IT 架构和系统环境时,需要考虑大数据。还有一点,深度/机器学习这个新兴领域,通过更多的数据进行训练,变得越来越高效。因此,该区域是大数据的完美补充。借助功能强大且易于使用的公共云提供商服务,人们能够更快、更轻松地处理、存储和分析大数据。这对于中小型公司来说尤其具有优势[4]。

结论

大数据绝对是一个时髦词,并不是每个公司都需要它。然而,大数据领域提供了巨大的优势和处理细节的新方法。然而,它带来了需要克服的技术挑战。有了公共云服务,这一挑战更容易应对。

“世界是一个大数据问题。”——作者安德鲁·迈克菲(Andrew McAfee),麻省理工学院项目联合主任

来源

[1]谷歌,【https://cloud.google.com/what-is-big-data】T2(2021)

[2]麦肯锡公司,人工智能下一个数字前沿? (2017)

[3] itsvit,https://it svit . com/blog/big-data-information-visualization-techniques/

[4] Bernice M Purce 大数据利用云计算 (2013)

什么时候可以用零来估算缺失值?

原文:https://towardsdatascience.com/when-is-it-ok-to-impute-missing-values-with-a-zero-6d94b3bf1352?source=collection_archive---------11-----------------------

用零代替缺失数据有时是合理的

休伊·费恩·泰

同格雷格·佩奇

图片作者:【Pixabay 的安德烈亚斯·百年灵

缺失数据的出现有各种各样的原因。

当调查时间过长或询问非常私人的问题(如年收入、月支出)时,就会出现这种情况。

当机器出故障时就会发生。

有时,这只是记录不一致的结果。

不管是什么原因,在填空之前都应该仔细思考。使用估算数据构建的模型可能会产生受新更改值强烈影响的结果。

在前面的一个例子中,我展示了通过查看售出的日票数量来估算室内游戏中心的收入是合理的,因为这两个因素有很强的线性关系。

但是另一个变量“降水量”也包含缺失信息,该怎么办呢?推论在这种情况下不适用,因为降雨量不依赖于我们数据集中的因素,如一周中的天数或 SnackShack 的销售收入。

作者图片

处理丢失数据的一个合理的方法是检查数据,看是否大部分时间都在下雨。毕竟,如果缅因州通常是干燥的,那么我们假设记录失败的那一天下雨是不正确的。

为了使用 R 执行这个验证,我们使用了代表“最频繁值”的 mfv()函数

因为那年缅因州很少下雨,我们可以通过在这些单元格中插入零来解决缺失值。

其他时候,简单地使用零作为缺失值的自动替代可能是不合适的。例如,假设我们缺少美国以下几个月的煤炭消耗量:

作者图片

首先,用零来计算意味着煤炭神秘地从这个国家的能源组合中消失了四个月!虽然数据集中的 NAs 确实令人沮丧,但我们认为这种消耗根本没有发生,这将会产生一个更大的问题。

其次,这种错误的替代会削弱多元回归模型。请注意当我们从用 0 进行插补切换到用已知月份的平均值进行插补时,模型强度的差异——调整后的 R 平方立即从. 5135 提升到. 8586。

作者图片

作者图片

虽然这里没有演示,但弱多元回归模型可能会对预测准确性产生负面的连锁效应。根据这些估计做出的不准确计划会在整个供应链中产生负面的“连锁反应”。我们再一次看到了面对缺失数据时谨慎行事的重要性。

归根结底,不存在适用于北美估算的“一刀切”的解决方案。用零替换确实有其优点,但是和其他方法一样,上下文也很重要。最终,建模者需要了解数据集,理解问题,并能够针对特定的环境做出最佳决策。

当逻辑回归不起作用时

原文:https://towardsdatascience.com/when-logistic-regression-simply-doesnt-work-8cd8f2f9d997?source=collection_archive---------15-----------------------

逻辑回归不能正常工作时的一个简单例子

蒂姆·高在 Unsplash 上拍摄的照片

逻辑回归是从结构化表格数据中预测目标标签的一种非常常用的方法。虽然有一些更高级的方法通常表现更好,但逻辑回归的简单性使其成为首选。

然而,理解逻辑回归的局限性是很重要的。在这篇文章中,我想通过展示一个非常简单的用例来展示一些局限性,在这个用例中,逻辑回归不能很好地工作。

假设你想根据室外温度和空调是否开着这两个特征来预测室内温度是高是低。

让我们为此任务创建一个模拟数据集:

这是一个非常简单化的“室内温度”模型——空调外面冷就把外面的温度加 10 度,外面热就降低 10 度。热的定义是超过 25 度。而且如果空调关了,室内温度和室外温度是一样的。

将数据分成训练和测试:

训练逻辑回归模型:

以前 10 个测试用例为例,看看模型预测到了什么:

正如我们所看到的,10 个案例中,有 4 个被预测错了。

检查模型的准确性:

0.655

尽管生成该数据集背后的想法非常简单,但有大量的数据点,而且完全没有噪声,逻辑回归模型在该数据集上表现不佳。

原因是目标标签与特征没有线性相关性。在这种情况下,逻辑回归(或回归问题的线性回归)无法以良好的准确性预测目标(即使是在训练数据上)。

那么在这种情况下我们能做些什么呢?

我们可以使用另一个模型,一个非常简单的选择可能是决策树。

让我们看看它在测试集的前 10 个案例中的表现如何:

正如我们所看到的,决策树正确地预测了所有 10 个例子。

如果我们计算它的精确度:

1.0

这意味着决策树正确地预测了测试集的所有情况。

也许我们应该看看决策树的结构,以了解它是如何表现得如此之好的。

我们可以看到,它基本上搞清楚了逻辑——如果外面的温度超过 35.5 度(我们这里只有整数,所以 35 足够了),房间里就会很热。如果外面的温度低于 15.5 度,房间里就会很冷。任何介于两者之间的事情都取决于空调是否开着。

一件有趣的事情是,通过更多一点的特征工程,我们可以使逻辑回归在这里工作。如果我们创建新的特征,以某种方式将室外温度与空调结合起来,让模型知道空调是在加热还是冷却,我们就使这个问题适合于用逻辑回归来解决:

0.99

我希望这篇文章能让你明白什么时候使用逻辑回归是好的,什么时候寻找其他方法更好,或者如何创建新的特性使你的任务更适合逻辑回归。

当一切都不确定时——用神经网络

原文:https://towardsdatascience.com/when-nothings-certain-go-with-neural-networks-54e07516b87a?source=collection_archive---------29-----------------------

试图交付一个完美的软件解决方案并不容易。尤其是当你遇到一个不容易解决的问题时。

用 python 打印的我们的一个 docx 文件的字节表示(我是作者的图像)

在开发另一个项目时,我们的团队遇到了一个巨大的挑战——仅通过查看传入的数据来猜测接收的是哪种内容。这个想法来自于对发送给我们的文件内容是否是给定扩展名指定的内容的质疑。

在本文中,我们将详细描述基于文件内容识别不同类型文件的问题、解决此类问题的方法、可能解决方案的初步证明以及对结果的有趣解释。

各种不同的扩展

有这么多不同的文件扩展名,以及随之而来的编码和结构。有些是我们日常使用的。有些非常罕见,并且是特定于工作平台的。你可能对像 pngtxt 这样的扩展名很熟悉,但是对于 1stdiz 呢?这些听起来不是每个人都熟悉的。但最重要的是,它们是以某种特殊的方式被创造出来的,所以认出它们应该不是不可能的。

说到找到合适的解决方案,有很多方法可以尝试。我们的团队正在使用 python,这就是为什么我们首先要寻找 python 模块——但不能就此止步,要走得更远。所有被检查的库都有一些共同点——要么根据文件头(大多数情况下是前 300 个字节)猜测文件的类型,要么在文件中搜索特定类型的短语。不幸的是,它们都不足以满足我们的需求——当 zip archives 遇到 docxxlsx office 文件时,查看标题是有问题的,并且搜索特定类型的短语不能保证这些短语不是出于对文件进行编码以外的目的(例如,演示)。

出现了许多问题:如果归档中有一个未压缩的文档怎么办?如果有人将特定编码序列粘贴到文档中会怎样?如果将许多具有不同扩展名的文件合并成一个文件会怎么样?问了这么多问题,我们不确定如何建立这样一个灵活的解决方案。此外,我们真的希望它是自适应的,能够适应未知的新数据类型。

当谈到处理任何不确定性时,用神经网络武装起来的人工智能已经多次显示出它的优势。没有别的选择,我们决定试一试。

概念的初步证明

首先,因为我们没有太多的时间,无论我们试图实现什么都不能花太长时间,必须给我们足够的论据来决定我们是否在正确的道路上。我们已经定义了关键假设,以避免在流程中迷失方向:

  • 使用卷积神经网络(CNN)
  • 只为两个类准备数据 docxzip
  • 将文件二进制表示转换为图像输入数组(用于 CNN)
  • 为了能够在训练模型之后回顾文件,并查看它对哪些部分感兴趣
  • 要使用最大 32 千字节的文件

输入数据表示

由于使用卷积神经网络,输入数据必须从二进制表示转换为图像阵列表示。每个编码字符由相应像素的亮度表示(从 0-全黑到 255-全白)。输入的形状是 180 x 180 像素,这样我们就可以显示 32,400 个字符。

输入可以用以下几个部分来表征:

在我们的一个 docx 文件中标记的部分被翻译成图像(我由作者制作)

A 部分—这是文件的二进制内容所在的位置。

B 部分—填充图像其余部分的黑带,以防文件中的数据少于 32 千字节。

为什么用图像表示而不是顺序数据?

为了进行概念的初步验证,最好首先准备一个易于解释的解决方案,以便任何人都能够理解您实际在做什么,而不是直接跳到任何需要更复杂理解的东西,如递归神经网络或变压器模型。为可解释的人工智能提供了很好的工具 tf-explain 模块,您可以使用它轻松地向其他人展示训练模型的高级神经活动区域(决定性部分)。

为什么黑带是必要的?

当使用卷积神经网络进行数据分类时,必须为神经网络模型使用的所有训练、测试和验证数据确定固定的输入形状。对于这种特殊的概念验证,我们选择处理大小最大为 180 x 180 (~32 千字节)的文件。某些 docx 文档和 zip 归档文件所占用的空间可能会小于大约 32 千字节所确定的最大可能空间。这就是为什么有必要用可能的中性值填充我们输入的其余部分——在我们的例子中,黑带是底部用二进制零填充的结果( \x00 )。

准备好的数据集

我们的小数据集由 115 个 docx 文件和 114 个 T2 压缩文件组成,这些文件是从个人文件和网上找到的。值得一提的是,出于好奇,一些 docx 文件被附加在 zip 档案中,作为额外的复杂性级别(看看这样的实验在没有大型数据集的情况下是否可行)。

下面,你可以看到我们的 docxzip 文件转换成图像的例子:

由图像表示的数据集文件的示例网格—使用 matplotlib 库生成(Iimage by author)

神经网络模型

为了让事情变得简单,我们决定使用在官方文件中找到的卷积神经网络模型。如果你开始你的机器学习之旅,这就是你应该做的——只需谷歌必要的东西,检查你已经找到的东西,并根据你的需要进行调整。一开始没什么特别的。

结果及其解释

在训练我们的模型 100 个时期后,我们已经达到了 98.4%的准确率。当试图预测未知文件的类型(两个类中的 16 个文件)时,我们获得了 99.1%的平均准确率。

我们能指望准确性吗?

作为衡量我们所构建的潜力以及结果如何随时间变化的指标之一,这是我们可以使用的指标。但是如果您想要构建生产就绪解决方案,请记住不要忘记准备好您的测试集。如果这不会花费你太多的时间,只需查看数据并一步一步地手动构建您的集合——只有这样,您才能找到任何更可靠的指标。

预测 docx 文件的决定性区域

为了更准确地了解我们的模型所关注的内容,我们使用了前面提到的 tf-explain 模块和 GradCAM explainer,这有助于我们找到高度神经活动的区域——这在决定特定文件是否将被分类为 docxzip 时非常重要。

使用 绿色色图标记活动水平,其中 0 表示特定像素上的最低活动,255 表示最高活动。GradCAM explainer 将此颜色贴图用作默认贴图。

用 matplotlib 库生成的 Viridis 颜色图(I 作者的图像

下面你可以看到对一些 docx 文件的解释:

TF-解释模型神经活动的 GradCAM 结果,同时对我们的一个 docx 文件进行分类——使用 matplotlib 库创建(Iimage by author)

每张图片代表一个特定的 docx 文件,该文件被转换成图像并标有绿色颜色图。根据文档的内容,活跃度会有很大的不同,例如,在第一个示例中,我们可以看到内容底部的活跃度最高,而在接下来的两张图片中,活跃度最高的是中上部。有趣的是,该模型考虑了相当大的区域来判断它是否是 docx 类型的文件。

填充如何影响结果?

我们选择的表示输入数据的方式有助于做出更准确的预测,但也会因为观察到与特定情况无关的部分而产生干扰。

让我们来看看下图:

TF-解释我们的一个 docx 文件的 GradCAM 结果,该文件在图像的中性部分有明显的神经活动

您还记得 model 通过查看背景而不是与分类对象相关的部分来对图像进行高精度分类的案例吗?比如在对动物进行分类时查看树木。

我们的情况没有什么不同——模型确实会查看我们为填充输入形状的其余部分而创建的黑带。

但这有错吗?

回答这个问题时有两个想法需要考虑。

首先浮现在脑海中的其中一个问题提示我们这是不正确的——谁会通过观察一个物体以外的任何东西来对这个物体进行个人分类,尤其是当它是一个在预测时应该保持中立的人工附加部分时?

第二个告诉我们试着去理解——为什么我们会认为这样的部分是相关的?在许多情况下,当涉及到发现未知的数据特征时,重要的是不要将可以看到的内容缩小太多—总有更多的东西是不确定的,可以帮助我们找到一种更简单的方法来执行复杂的分类,只需说一个文件比其他文件小,这在一些抽象的情况下可能是真的。

在我们的情况下,这是第一个。但是记住这一点——它并不总是不相关的。

预测 zip 档案的决定性领域

我们还对 zip 文件执行了相同的活动级别检查:

TF-解释模型的神经活动的 GradCAM 结果,同时对我们的一个 zip 存档进行分类——使用 matplotlib 库创建(Iimage by author)

docx 文件相比, zip 文件的活动图彼此更加相似,在图像上的扩散程度也更低(完全集中在特定区域)。

zip 档案中包含的 docx 文件呢?

即使没有使用太多的例子,该模型预测的 zip 类也令人惊讶地好——在每张测试图像上都达到了 98%以上的准确率。

在试图交付一个完美的软件解决方案时处理不确定性并不容易。很多时候,我们每个人都会走到走进死胡同的那一步。在那个时候,记得检查记录良好的机器学习算法。在许多情况下,简单的神经网络是可行的——你不必成为解决问题的数据大师。

敬请期待!

当熊猫不再为我召唤熊时,我知道我已经成为了一名数据科学家

原文:https://towardsdatascience.com/when-pandas-stopped-conjuring-bears-for-me-i-knew-i-had-become-a-data-scientist-8b6142697fd5?source=collection_archive---------4-----------------------

入门

作为一名年轻的数据科学家,有三件事不用担心

图片由 Kankanravee Kanyawath 来自 Pixabay

熊一直困扰着我的职业生涯。

当我还是心理学研究生的时候,我们听说过一个叫丹·韦格纳的研究员,他因研究多余的想法而出名。在他臭名昭著的实验中,他将证明如何要求人们不要去想事情,比如白熊,会适得其反,并导致与人们被要求抑制的事情相关的高侵入性想法。“白熊现象”或者更恰当地称为“讽刺过程理论”有助于解释各种心理问题。

离开研究生院后不久,我发现自己又一次面对熊。这次他们是熊猫。我记得我觉得 Python 库的名字很有趣,当我开始学习如何使用它来分析数据时,我的想法被黑白相间的皮毛图像打断了。

但是这些侵扰性的熊的想法并没有持续多久。随着我对数据科学的了解越来越多,也越来越擅长使用熊猫库来操作数据,我的真实熊猫图像慢慢被数据帧和代码行所取代。

随着这些心理图像的改变,我知道我不再是一个压抑白熊想法的绝望的心理学家,而是一个数据科学家,一系列全新的焦虑浮现在我的脑海中。

以免你认为这篇文章仅仅是关于熊的,事实并非如此。相反,这篇文章是关于这些年来那些熊在我身上唤起的东西,主要是焦虑。

因此,我想重点谈谈年轻的发展中的数据科学家面临的 3 个常见焦虑。我也在那里,我也面对他们,但最终胜出。在此,我分享我在这个领域工作了近 15 年后,现在如何看待他们。所以,不要再说白熊和熊猫了,让我们为数据科学的学生介绍一下房间里的其他大象吧!

Image by 愚木混株 Cdd20 from Pixabay

数据科学教育和焦虑似乎是相辅相成的。数据科学是许多不同技能的复杂组合。它包含了许多不同的技术,需要对数学模型有所了解,并且最适合批判性思维。由于其复杂性,在学习数据科学时存在许多不确定性。这种不确定性造成了很多焦虑。

焦虑#1:专注

年轻数据科学家最大的担忧之一是知道应该重点学习哪些技能。事实上,就在几天前,我参加了一个由大学主办的会议,会议由一群不同的年轻数据科学家参加。在分组讨论中,一名学生问道:

“你认为哪些技能是我最需要关注的?”

关注的核心是认识到这个领域正在迅速发展,随着任何领域的发展,专业化越来越成为一个问题。当您可以雇佣一位对适用于特定业务问题的有限工具集非常了解的数据科学家时,为什么要雇佣一位对许多数据科学工具略知一二的数据科学家呢?

专家的问题是,一旦他们解决了手头的问题,他们对公司的效用就降低了。多面手的问题是,在处理新用例时,需要多花一点时间进行实验。

归根结底,专业化非常重要,因为它提供了学习数据科学过程的环境。也就是说,专业化不应该是目的,而是学生学习数据科学如何更普遍地工作的一种手段。因此,对于学生来说,重要的是集中精力学习一套专门的技能,同时认识到这些技能如何推广到其他用途。

这里的关键是要认识到,最重要的不是特定的技能组合,而是你能够将复杂的技能组合起来,并解决问题。

少关注你应该学习的具体技能,多关注用你所学做一些有用的事情。你控制着潜在雇主或客户的叙述,所以确保你能证明你知道如何应用一套专门的工具来解决一个专门的问题。更进一步,解释同样的过程如何应用到与他们更相关的用例中。

简而言之,你应该关注的技能是理解你所学的特定技能如何也是适用于大多数数据科学问题的更基本过程的一部分。演示如何快速从学习转向应用。

焦虑#2:自信

第二个焦虑是信心。大多数年轻的数据科学家对自己用新获得的技能解决业务问题的能力缺乏信心。缺乏自信是由两种主要力量激发的:复杂性和自我。

我说的复杂是什么意思?

Python 中最流行的数据科学库之一是 Scikit-Learn (sklearn)。Sklearn 包含了近 200 种不同的模型或“估算器)”这只是一个数据科学库。此外,过多的深度学习模型架构、混合和集成以及模型的选择是压倒性的。更不用说可用于预处理数据和部署解决方案的所有技术,这两者都对整体成功有影响。

所有这些复杂性增加了高度的不确定性,从而降低了信心。

第二种影响自信的力量是自我。将术语“科学”作为其定义的一部分的数据科学伴随着学院科学家的包袱而来。也就是说,这个领域中有一些自大的人,他们乐于评判进入这个领域的新数据科学家的能力。

这些自负会让人觉得数据科学在商业中的应用比实际情况更加僵化。底线是,没有人知道所有的事情,尤其是在数据科学领域。

对你所知道的要有信心,因为你已经成功地应用了它。因为你不断地应用新的东西,所以要对你能够学习的东西建立信心。

焦虑#3:适当性

我要分享的最后一个焦虑是恰当性,我看到很多学生也在经历这个问题。这种焦虑与信心有关,但延伸到对什么是数据科学的“适当”使用的担忧。例如,我过去总是质疑我的解决方案是“正确的”还是“正确的”我从来没有意识到,对于大多数商业问题来说,没有一个单一的“正确的”或“正确的”解决方案。

此外,有太多的可能性让我们无法知道绝对的“最佳”解决方案。所以与其担心你的解决方案是否合适,不如多关注你的解决方案是否通过解决一个问题带来价值。下面是一个向消费者展示价值的简单框架:

考虑一个好的基准,比如一个现有的过程、人为错误(人类每小时大约犯 3-6 个错误,或者一个基线模型。

围绕该基准构建您的解决方案,以展示其价值。

基于业务需求、反馈和使用新数据进行的持续性能评估,从那里进行迭代。

以上只是我职业生涯早期经历过的一些更常见的焦虑,该领域的学生直到今天仍在表达。我希望你发现这有助于设定期望,并为你提供一些帮助克服这些焦虑的见解。

比如参与学习数据科学、职业发展或糟糕的商业决策?加入我

“我应该什么时候收到回信?”以及其他痛苦的问题——用数据回答

原文:https://towardsdatascience.com/when-should-i-hear-back-and-other-painful-questions-answered-with-data-cd06edb1976a?source=collection_archive---------18-----------------------

办公时间

用实际数据讲述的求职故事

避免“我什么时候会收到回复”的焦虑,让你自己免于尴尬的去看牙医——图片由 Unsplash 提供

求职过程中最大的问题之一是缺乏可操作的数据。

没有数据,求职者对自己的处境一无所知。是我的简历很糟糕,还是只有这种难得的回音?我现在应该得到一份工作了吗,或者我的经历对这个就业市场来说是正常的吗?这个提议合理吗,或者我应该谈判吗?更一般地说:我的经历是典型的,还是我做错了什么?

一个人对这些问题得不到答案的时间越长,就会越自我怀疑。

我看到市场上一些最有前途的数据科学家公开质疑自己的能力,这都是因为他们在没有正确背景的情况下,在艰难的经济或异常竞争的就业市场中航行。

很难找到合适的上下文。大多数人所能做的最好的事情,就是通过听取新员工的经历,来满足于轶事数据。但是求职是非常随机的,每个人的经历都不一样。为了真正了解就业市场,你需要几千份工作申请的回复率、面试率、回复时间和许多其他参数的大量统计数据(实时更新)。

sharpes minds,我们已经帮助数百名学员找到了数据科学领域的工作。我们处在一个独特的位置,可以从他们求职的大量统计数据中了解就业市场。这是我们的发现。

就这么难得听到回音?

即使是最好的申请人也经常得不到他们申请的公司的回复。但是响应率是非常多变的,并且在很大程度上取决于您决定采用的应用程序策略。以下是我们发现的三种不同申请策略的平均回复率:求职公告板申请、LinkedIn DMs 和冷冰冰的电子邮件(所谓“冷冰冰的电子邮件”,我指的是突然向某人传达一条深思熟虑的定制信息)。

我应该在这里补充一点,尽管这些招聘信息看起来很糟糕,但实际上可能更糟糕。这是因为求职公告板的回复率非常不均衡:对于极少数求职者来说,回复率确实很好(在某些情况下,回复率可能高达 30%),但对于大多数人来说,回复率确实很糟糕。回复率中值接近 2%。

这个故事的寓意是:尽量避开求职公告板,除非你有可能被求职者跟踪系统发现的经验——尤其是如果你所在的领域工作机会稀缺,你需要让每一份申请都有价值。

我现在应该收到回复了吗?

很少有什么事情比在申请或面试后怀疑自己是否逾期未得到公司的跟进更让申请者紧张的了。这是可以理解的:如果许多公司不想前进,他们会让你见鬼去,这意味着没有消息往往是坏消息。但是你什么时候应该永远放弃一份申请呢?

以下是我们发现的每种应用策略的平均响应时间:

面试真的那么难吗,还是我有什么问题?

收到 LinkedIn DM 或冷冰冰的电子邮件的回复本身就有价值。它可以带来信息交流,甚至是潜在的导师。但是正如我们在上面看到的,这意味着你会很快收到回复,如果没有别的事情的话——拒绝或者其他。

但是得到回音并不是申请的真正目的——你想要的是一次面试。在这一点上,应用策略的表现如何?每个人获得面试机会的可能性有多大?

在你看到这些数字并决定求职公告板到底好不好之前,你可能应该知道,尽管 LinkedIn 的申请看起来像是给求职公告板一个类似的面试机会,但根据我们的数据,它们实际上导致获得工作机会的概率高出3 倍。

通过与我们的导师(其中许多人本身就是招聘经理)交谈,我们认为我们知道为什么:向招聘经理发送定制信息,让你有机会在进入正式流程之前,在非正式场合与招聘经理建立联系。这是给人留下好的第一印象的好方法,也是展示你对公司或职位所做的研究的好方法。这种印象会产生持续的积极影响。

这个报价合理吗,或者我应该谈判吗?

SharpestMinds 在美国和加拿大都有业务,我们发现按国家划分我们的工资数据很有用,因为信不信由你,在货币调整的基础上,加拿大的数据科学家、分析师和机器学习工程师的收入大约是美国同行的一半!

以下是我们过去六个月在美国雇佣的学员的薪资数据:

这是加拿大学员的相同情况:

顺便说一下,“我应该谈判吗?”几乎总是是的。只要你合理地提出你的要求(例如,“我认为我们接近一个可行的数字,我真的很想加入这家公司,但还有 3000 美元的加薪空间吗?”),公司能做的最糟糕的事情就是拒绝你的要求,坚持最初的提议。即使是入门级的数据科学家和分析师通常也比他们想象的有更多的谈判空间。

我的求职经历是典型的,还是我做错了什么?

我们从研究这些数据中学到的最大的一个教训是,人们在求职过程中的经历是多么的不同。

一些学员开始找工作,并在几周内被录用。还有的在积极寻找 3 个月、6 个月甚至 12 个月。您的里程可能会有所不同。

但平均而言,我们发现,从他们获得导师的技术支持(意味着他们的导师认为他们已经做好工作准备)开始,学员需要 3 到 6 个月才能找到工作。

做什么?

如果你找工作的时间已经超过 6 个月,那可能只是运气不好——你可能只是在分布的远端。

但这也可能是一个暗示,你需要改进你的简历,改变你的申请策略,或者提高你的面试和技术技能。在一天结束的时候,唯一确定的方法就是努力地跟踪你的申请。一旦你这样做了,你就可以将你的回复率和面试率与我们在这里分享的典型值进行比较,希望能更好地了解你的立场。

如果事实证明你得到的面试机会明显少于正常水平,你可能需要找人来审核你的简历和 Linkedin 个人资料。

如果这不是问题所在,那么你可能需要关注你的面试技巧。模拟面试是一个很好的主意,和那些也在积极面试的同行交流也是一个很好的方法。

如果在那之后,你需要一些额外的支持,我们很乐意帮助

我们什么时候应该使用对数线性模型?

原文:https://towardsdatascience.com/when-should-we-use-the-log-linear-model-db76c405b97e?source=collection_archive---------12-----------------------

线性模型的一个有吸引力的替代方案

图片由 Gerd Altmann Pixabay 提供

世界不是线性的。这是一个人人皆知的简单陈述。然而,它给我们的建模方法带来了有意义的结果。学术界和工业界使用的绝大多数模型都是线性模型。

所考虑的现象的线性假设是非常武断的。对于包含少量观测值的研究来说,这通常是必要的,因为它有助于参数估计。当我们有较大的观察样本时,我们可以考虑因变量和自变量之间的非线性相关性。为此,我们可能需要估计一个非线性模型。这些类型的模型需要更先进的估计技术和计算能力。然而,这种方法有一个重要的替代方案。也就是说,我们可以用变换变量的线性模型的平均值来近似非线性关系。

对数线性模型

可以简化为线性模型的广泛使用的模型是由以下函数形式描述的对数线性模型:

对数线性模型和线性模型的区别在于,在对数线性模型中,因变量是独立变量的乘积,而不是总和。通过对上述方程的每一侧取对数,可以很容易地将该模型转换成线性模型:

只需替换为:

其中 n = 1,2,…,k,我们得到一个纯线性模型:

什么时候用?

如果我们使用对数线性模型,我们必须记住,我们是在计算因变量和自变量的对数。因此,变量应该只有正值,因为负值的对数不存在。

出现的问题是,在考虑使用对数线性模型时,我们应该观察变量的哪种分布。长话短说:对数正态分布。

不同均值和标准差的对数正态分布。来源:https://en.wikipedia.org/wiki/Log-normal_distribution

当我们的误差项等于正态分布误差的指数时,我们得到对数正态分布:

我们可以观察到,如果误差项具有对数正态分布,那么它的对数也具有正态分布。我们还知道,正态分布变量的线性组合也具有线性分布。因此,如果对数线性模型中的所有变量都具有对数正态分布,则:

正态分布。因此,我们看到,在实践中,当因变量和自变量具有对数正态分布时,我们应该使用对数线性模型。另一方面,当那些变量是正态或接近正态时,我们应该坚持简单的线性模型。

参考

[1]https://en.wikipedia.org/wiki/Log-normal_distribution

[2]迈尔斯基,耶日。 Ekonometria。2009 年,UW WNE

什么时候应该考虑用 Datatable 代替 Pandas 处理大数据?

原文:https://towardsdatascience.com/when-should-you-consider-using-datatable-instead-of-pandas-to-process-large-data-29a4245f67c6?source=collection_archive---------9-----------------------

在处理大型数据集时,使用熊猫可能会令人沮丧。数据表可能是解决方案。

照片来自 Unsplash

介绍

Pandas 在主要使用 Python 的数据科学家的数据分析工具中脱颖而出,因为它的易用性和它为数据处理提供的灵活性。尽管有这些好处,但不幸的是,在处理非常大的数据集时,它并不那么有效。有工具可以克服这一挑战。

下面是 Datatable ,一个用于处理表格数据的 python 库。它是最有效的工具之一,支持内存不足的数据集、多线程数据处理和灵活的 API。在本文中,我们将介绍数据表的一些基础知识,并与熊猫进行比较分析。

不使用熊猫的理由很少

以下是你不应该使用熊猫的两个主要原因:

  • 内存管理:由于 Pandas 为内存分析提供了一个数据结构,它有时需要 10x 的内存数据集。要做到这一点,您必须确保您的机器上始终有足够的内存。
  • 代码执行的高时间复杂度 : Pandas 的设计并没有有效地利用计算能力。默认情况下,它使用单个 CPU 内核作为单个进程来计算其功能。

什么是数据表,如何设置它

图 1:来自 H2O 的数据表徽标/数据表 github

正如简介中所解释的, Datatable 是一个 python 库,用于在单节点机器上以可能的最高速度执行大型数据处理(高达 100GB)。Datatable 项目始于 2017 年,第一个用户是无人驾驶. ai

Datatable 的一个重要特性是它与 Pandas/NumPy/pure python 的互操作性,这使得它为用户提供了轻松转换到另一个数据处理框架的能力。

数据表入门

运行本文的代码有两种选择。

  • 第一个选项 :本文中使用的那个,当你想在自己的机器上运行一切的时候。
  • 第二种选择 :使用我制作的 colab 笔记本,运行不同数值的实验。
  1. 安装数据表库

安装很简单,可以在 macOS、Linux、Windows 上用下面的命令行执行。

对于安装,我建议您首先创建一个环境变量,以防您有一个与 Datatable 不兼容的 python 版本。

确保在激活环境变量后运行以下指令。

最后,您可以在创建新的笔记本文件时选择环境变量,如下所示。

图 2:创建新的。ipynb fine(图片由作者提供)

  1. 数据表基础

在开始对 Pandas 和 Datatable 进行比较分析之前,让我们通过运行下面的代码来确保我们的安装一切正常。

图 3:代码执行结果(图片由作者提供)

现在我们确信安装过程一切顺利,我们终于可以开始了!

数据表与熊猫——让我们进行比较分析

基准数据集

使用来自 Kaggle 的糖尿病数据集,我将每一行复制了 10 万次,最终得到 76 80 万行(令人震惊🤯不是吗?)以便我们可以有足够大的数据集来执行适当的比较。最终数据集大小为 5.7 GB。

下面是来自基准数据集的 5 个随机样本。

图 4:来自基准数据的五个随机样本(图片由作者提供)

1。数据加载

此分析的目标是确定包含 76 800 000 行的同一数据集的加载时间。

图 5:熊猫和 Datatable 的数据的内存使用量是 5.7 GB(图片由作者提供)

Pandas 和 Datatable 都使用相同的内存来存储数据。但是它们加载的时间不一样。

图 6:熊猫数据加载时间:78 秒,数据表:2.13 秒(图片由作者提供)

从上面的图 6 中,我们可以注意到用 Pandas 加载数据集需要大约 74 秒,而 Datatable 只需要不到 3 秒。总的来说,Datatable 比熊猫快 34 倍。34 是 73.9/2.13 的结果。

2。卸载数据

我们通过加载 Datatable 和 Pandas 格式的数据开始实验。但是,我们可能希望将数据转换成不同的格式。让我们将 Numpy 视为目标格式。

图 7:熊猫的数据卸载时间:16.62 秒,数据表:6.56 秒(图片由作者提供)

从上面的图 7 中,我们观察到在将数据卸载到 NumPy 数组方面,Datatable 仍然胜过 Pandas。对于熊猫来说,这个过程需要 16.62 秒,而 Datatable 只需要 6.55 秒。总体数据表比熊猫快 2 倍。

3。分组数据

Datatable 也有分组功能,类似于 Pandas。让我们计算患者的平均年龄,并根据结果值(0 和 1)进行分组。

第五行中的。f 变量是 Datatable 的原生变量,它提供了一种方便的方法来引用框架中的任何列。

图 8:熊猫数据分组时间:2.15 秒,数据表:0.77 秒(图片由作者提供)

从图 8 中,我们可以注意到 Pandas 在分组数据时比 Datatable 慢 2 倍。

4.分类数据

医生可能希望根据怀孕次数从低到高对患者的数据进行排序,以便进一步分析。这是我们的计算方法。

图 9:熊猫的数据排序时间:22.61 秒,数据表:063 秒(图片由作者提供)

Datatable 在相同的列上破坏了熊猫的数据排序!它的运行时间比熊猫快大约 36 倍。

结论

基于前面的比较分析,我们可以观察到 Datatable 库优于 Pandas。然而,当使用非常小的数据集(例如,少于 1000 行)时,使用 Pandas 而不是 Datatable 可能会有所不同,因为时间执行间隔非常小(2 毫秒)。

我希望这篇文章能够帮助您清楚地了解为什么应该在 Pandas 上使用 Datatable,以及它如何通过将您的大数据处理提升到一个新的水平来为您的组织增加价值。您可以在下面找到更多资源。

YouTube 上关注我,了解更多互动环节!

额外资源

数据表文档

再见🏃🏾

当速度很重要时,使用 C

原文:https://towardsdatascience.com/when-speed-matters-use-c-f040d9381680?source=collection_archive---------14-----------------------

C、Python 和 C++之间的 CSV 读取性能测试

Unsplash 上的 CHUTTERSNAP 拍摄

介绍

当我使用 C 时,我倾向于感觉自己像一只恐龙。没有人知道 C 了。它不再是主流,它的使用主要与驱动程序或操作系统编程和嵌入式系统有关。

还值得再学 C 吗?我最初以为懂 C++会让 C 变得无关紧要。但是在我学习 C++的过程中,我开始注意到可能是这样的情况,C 仍然有它的位置。

真实测试:阅读大型 CSV

尽管简单,CSV 文件仍然无处不在。解析它们的需求非常普遍,在某些场景中,您可能需要处理数万亿字节的 CSV。

如果是这样的话,实施就很重要。当数据集很小时,一个简单的操作很容易在数据集变大时成为瓶颈;应该观察性能,速度比代码可维护性和代码冗长更重要。

在这篇小文章中,我将使用 Python、C 和 C++17 中逐行读取文件的惯用方法来分析三种不同的行解析器。

特定的测试将解析一个 570 万行的 CSV,其中每行大约有 50 个字符宽(在我的测试中,我使用了 derivates 市场报价,但是该场景适用于任何类型的数据)。我们将测量在每种语言中逐行读取文件需要多长时间。

计算机编程语言

Python 因其简单而被广泛(过度)使用。学习 Python 极其简单。语法简单明了,其垃圾收集器使得编程变得简单明了。它不是一种快速的语言,除非你使用 C 编译的库,比如 Numpy。当你需要做一些用 Numpy 无法完成或难以实现的事情时,性能问题就会到处出现。

上面的代码展示了 Python 中逐行读取文件的惯用方式。测得的运行时间为 22 秒。

C/C++

我最近开始用 C++工作,而不是用 C 或 Java。通过这样做,我可以在需要时拥有 C 的性能和控制,以及 Java 的高级和面向对象的结构来简化代码的编排,特别是集合(C++中的容器),这在数据分析中很有用。

下面的代码片段包括用 C 和 C++编写的逐行读取 CSV 文件的代码。

C++惯用方法的测量时间分别是 300 秒,经典 C 方法的测量时间是 16 秒。

结论

惯用的 C++实现所花费的时间如此之大,令人尴尬。

惯用代码例程逐行读取文件所花费的时间

相反,我们观察 Python 是如何对某些函数/库进行了如此多的优化,以至于它们的性能几乎和 C 一样好。这并不意味着 Python 和 C 一样快,因为当你使用定制代码或密集数据分析时,Python 的效率会非常低。但是我惊讶地发现 Python 中有如此优化的例程。

这个简短测试的要点是惯用的并不意味着你的代码将会执行。

不要卖你的 K&R【C 编程语言】的拷贝;在 C++中重用那些 1980 年代的 C 方法仍然可以节省一些计算时间。

当锤子遇见舞蹈

原文:https://towardsdatascience.com/when-the-hammer-meets-the-dance-f1c86386f161?source=collection_archive---------26-----------------------

新冠肺炎疫情早期德国和瑞典的社会距离政策展开的鹰眼比较

盖尔·马塞尔在 Unsplash 上拍摄的照片

新冠肺炎疫情促使全球各国政府建立了一个非药物干预(NPI)的军火库。除了接种疫苗,NPI 是公民必须遵循的社区缓解策略,以防止冠状病毒的传播。无论 NPIs 是作为纯粹的建议(例如,经常洗手)还是强制性措施(例如,晚间宵禁),我们可能都同意这些干预措施已经从根本上改变了我们近两年的日常生活方式。在我的上一篇文章中,我以德国和瑞典的单一政策为例,证明了政府干预的影响,这两个国家对疫情问题的反应截然不同。但是这些策略总体上如何发挥作用呢?现有的研究暗示,各国政府何时以及以何种节奏推出 NPI 存在相当大的差异(Hale 等人,2020 年)。受到这些发现的启发,我接下来提出了以下问题:

德国和瑞典在疫情早期针对每日 COVID 病例动态制定严格的社会和物理隔离措施方面有何不同?

我们为什么要关心?在新冠肺炎·疫情事件之后,我们只有直觉。进入疫情将近两年,我们拥有的是数据,大量的数据。将政策部署时间表与灾后的案例动态联系起来,为政府提供了宝贵的经验,以便在今后制定更多基于证据的应对战略。

设置

我收集了 2020 年 2 月下旬至 11 月下旬的数据,以分析疫情早期阶段应对新冠肺炎病例动态的政策动员。

收集流行病学数据。我进入可公开访问的 OxCOVID19 数据库(Mahdi et al .,2020)查询在感兴趣的时间跨度内,这两个国家累计的确诊新冠肺炎病例数。(在我的上一篇文章中阅读更多关于这个库的信息)。由于事件数据是以累积计数的形式返回的,所以我首先将所有值分解成每日数字。这项工作揭示了瑞典 88 例连续 0 日病例中的可疑部分。通过对来自 worldometer 的案例报告进行抽查,我将这些数据点暴露为缺失值。此外,20 例每日病例数为负值的情况发出了危险信号。我求助于欧洲疾病预防控制中心(ECDC,2021)的事件数据来解决缺失和错误的值。这对于防止此类记录扭曲任何数据操作至关重要。

从这条弯路中得到的启示是双重的:首先,即使是通过最著名的来源提供的数据,也不能让我们在一头扎进分析之前摆脱严格验证的任务。第二,如果快速浏览一下可能会给我们带来“有机”替代价值,我们应该抵制采用更复杂估算策略的诱惑。为什么?数据驱动的插补减轻了痛苦,但考虑到算术合成值是未披露现实的纯近似值,因此无法提供解决方案。

在消除了所有提到的不一致之后,另一个问题浮现在脑海中。某个新冠肺炎案例被确认的那一天,不一定是这个事件进入数据库的那一天(官僚主义是我们最大的敌人,数据工程师也有周末……)。为了消除报告延迟的影响,我将案例数转换为 7 天移动平均数。值得一提的是,重新采样到更高的粒度级别(例如,从几天到几周或几个月)为我们提供了一种驯服噪声的替代方法。然而,我故意决定不采用这种方法,因为我的目标是在尽可能低的粒度级别上探索案例策略动态。最后,我将观察结果归一化为每 10 万公民的每日病例数,以排除瑞典和德国之间总体人口规模的巨大差异(德国的居民人数大约是瑞典的 8 倍)。

收集策略数据。世界卫生组织的 PHSM API 被查询以获取两国在一段时间内采取的公共卫生和社会措施的数据(世卫组织,2021)。鉴于 OxCOVID19 将政策数据预先分为 8 个粗粒度类别,PHSM 提出了一个更细粒度的分类方案。使用分类属性 who_category、 who_subcategorywho_measureenforcement ,我将这些政策划分为严格的社会和物理距离措施。此外,属性 prev_measure_numberfollowing _ measure _ number允许我追溯策略之间的父子依赖关系。这对于更深入地描述两个国家所采取的政策部署方案非常有价值。从这个意义上来说,任何没有在 prev_measure_number 中输入的策略都有资格作为新引入的干预。相反,与 prev_measure_number 相关联的任何策略都是现有策略的后代。

图一。 针对常态化每日案例的 7 天移动平均线的政策部署。

我创建了一个 2 乘 2 的小倍数图,以框定我对德国和瑞典每日案例数相关的政策部署动态的分析。底部两个类似甘特图的图表显示了一段时间内这两个国家政策干预的开始和持续时间。颜色编码区分没有前任的父策略和代表前一干预的修改、扩展或重新引入的子策略。为直观起见,在任何给定时间点有效的母公司和子公司保单的数量以堆叠条形图的形式投射到上部两个象限,描绘了两个国家/地区在可用日期的 7 天移动平均案例数。

下面的两个图表(图 1,支线剧情 3 和 4)描绘了一个对比鲜明的叙述。在最初的几个案例被记录下来后,德国政府发布了一系列的 68 条强制性的距离政策,是瑞典出台的数量的 4 倍多。事实上,在德国当局实施的所有强制距离政策中,有 54%在观察范围结束时仍然有效。两次干预措施出台之间的时间间隔非常短,平均不到 4 天,而大范围的平均政策运行时间为 101 天,这成为德国政策动员机制的主导主题。总之,视觉线索和汇总统计暗示了一个非常系统和充分的政策反应。联邦政府结构通常被认为是迅速遏制危机的协调障碍。根据这一分析,我敢说德国的分权行政结构可能最终会支持快速、全面地推出这些干预措施。

这些发现与从瑞典相应图表中得出的推论形成鲜明对比。截至 9 月底,瑞典所有 16 项强制距离政策都已逐步取消。这些政策不仅出台的时间间隔更长,平均为 11.53 天,而且平均持续时间仅为 42 天。支持这些观察的相关线图(副曲线 2)显示,当每日病例数变化时,瑞典几乎不改变齿轮。相比之下,德国的政策组合在最初的快速增长之后稳步扩大,几乎与病例数的增加完全同步,直到 3 月中旬事件首次达到峰值(子情节 1)。即使新确诊病例仍然很少,德国也维持了许多父母和子女政策的 2:1 混合。

统计分析

使用皮尔逊相关系数,我将有效保单的数量与每日确诊病例和死亡人数相关联,以从统计角度观察已确定的动态。简单地说,相关系数量化了两个不同变量之间线性关系的强度。接近 0 的值暗示弱关系,而接近绝对 1 的值暗示两个变量接近完美同步。正系数意味着两个变量朝同一个方向移动,而负系数表示朝相反方向移动。值得一提的是,变量之间线性关联的假设仍然是对现实的天真简化,但这没关系。在解释结果时,我们对这些潜在假设的认识很重要。最重要的是,相关系数是易于计算和概念上可访问的关联度量,便于我们对潜在的更复杂的关系得出初步结论。

表 1。 现行保单数与每日确诊病例/死亡数的皮尔逊相关系数(归一化 7 天移动平均数)。

表 1 中展示的相关性分析结果证实了瑞典和德国政策部署方案如何适应日常案例动态的推断差异。将德国的有效保单数量与标准化每日病例数和死亡数相关联,得出的相关系数分别为 0.33 和 0.36。具有证明统计显著性的低 p 值的系数对。我们可能会哀悼这些系数的数量级。然而,研究结果应该放在国家政策制定的背景下。当考虑到官僚主义的障碍无疑会限制一个民主的、联邦政府组织的政策日程每天重新调整的灵活性时,已确定的相关性被认为是实质性的。

同样的分析得出瑞典的相关系数相对较小,不显著,为-0.1。这些发现再一次与强调瑞典政府极简政策反应的文献产生共鸣,瑞典政府选择自愿的自我监管,而不是通过明确的立法行动来缓解(Capano 等人,2020 年)。然而,将有效保单的数量与标准化的每日死亡人数相关联产生了 0.3 的统计显著相关系数。这一有点令人惊讶的发现可能源于瑞典随着累计死亡人数的上升而从较宽松的政策干预转向更严格的政策干预的趋势(Cheibub 等人,2020 年)。

这一切意味着什么?

疫情政策回应中发现的差异与 Cheibub 等人(2020)的发现相呼应,即国家民主政体对疫情的回应方式绝不相似。这些异质性背后的驱动力仍然存在争议。我借助霍夫斯泰德的文化维度理论来解释德国和瑞典之间的明显差异。这一理论将不确定性规避的概念定义为“(……)一种文化的成员感受到模糊或未知情况威胁的程度,并创造了试图避免这些情况的信念和制度” (Hofsede-insights.com,2020)。

瑞典在满分 100 分中获得 29 分,被描绘成一个容忍不确定性的国家,它更愿意在一套最基本的必要规则下引导其社会。另一方面,德国在 100 分中得了 67 分,它依赖于规划和对不确定性的系统预测。两张甘特图(图 1,子图 3 和 4)为这一推理提供了令人信服的支持。德国在疫情早期发布了一套密切关注的父母政策,随着时间的推移,新的父母和子女政策不断增加,这些政策不仅在很大程度上得到维持,而且扩展到大量的社会距离政策中。虽然这可以被理解为一种彻底缓解不确定性的行为,以对抗未知比例的疫情,但德国维持平均父母与子女政策比率为 2.23 比 1 的事实(图 1,子曲线 1)描绘了政策干预的持续而可控的扩张。相比之下,瑞典 0.53 比 1 的比率是反应主义方法的缩影(图 1,副曲线 2)。最终,瑞典的政策机构在所有主题化的维度上都有所欠缺——政策持续时间、部署频率和迄今为止的总干预量——这暗示了一个高信任度社会所特有的政策足迹,它无视过度的政府控制。

限制

我的分析采用了两个外部数据源来解决 OxCOVID19 数据库中的不足,并获得了将手头的研究问题“数据化”所需的额外变量。然而,整合来自多个来源的数据意味着整合不同的信息分类法、数据收集和预处理方法,这些只是在数据控制者的网站上暂时披露。由于我的分析受制于几个关于数据来源和方法的未知因素,因此必须像往常一样,对调查结果有所保留。

虽然该分析确定了活动策略数量和每日案例计数之间的显著相关性,但我提醒您不要将相关性误认为是因果关系。这一分析为读者提供了一个描述性的切入点,让他们见证不同的社会距离政策策略在起作用。然而,这种便利是以忽略许多因素为代价的,这些因素很容易将我们推入错误的因果归属。例如,在夏季的几个月里,其他因素,如不受分析控制的天气,可能会促进社交距离。这种情况提醒我们不要把社交距离政策的数量贴上降低每日病例数背后的独立驱动因素的标签。我在我的上一篇文章中简要地谈到了省略变量偏差的概念,以防这个小小的反思引起你的兴趣。

结论

我们首先提出以下问题:德国和瑞典在疫情早期针对每日 COVID 病例动态制定严格的社会和物理隔离措施方面有何不同? Capano 等人(2020)称疫情为“自然实验”,在此过程中,政府对同一问题表现出明显不同的政策反应。我的分析揭示了德国和瑞典政府在动员起来对抗疫情方面的巨大差异。与此同时,我得出的结论是,这些应对措施是国家领导、政府组织以及在全国范围内构想和部署政策的政治能力的复杂产物。

士气:这不是锤子或舞蹈,而是需要在国家和文化特殊性的背景下理解的新闻和发布之间精心制作的混合。但如果我们可以肯定地说一件事,它可能是这样的:一个答案,在什么情况下我们需要多少锤打和舞蹈不应该放弃把这个疫情提供给我们的数据进行测试的机会。

参考

Capano,g .,Howlett,m .,Jarvis,D. S. L .,Ramesh,m .,和 Goyal,N. (2020)。动员政策(能力)抗击新冠肺炎:理解国家反应的差异。政策与社会,39(3),1–24 页。https://doi.org/10.1080/14494035.2020.1787628

洪金元,朱耀杰,朱耀杰(2020)。权利与死亡:政府对疫情的反应。SSRN 电子杂志。【https://doi.org/10.2139/ssrn.3645410

t .黑尔、n .安格里斯特、a .彭斯瑞克、b .基拉、t .菲利普斯和韦伯斯特(2020 年)。政府对新冠肺炎的反应各不相同。Blavatnik 政府学院工作文件系列,32。www . bsg . ox . AC . uk/covidtracker % 0ah ttps://www . bsg . ox . AC . uk/research/publications/variation-government-responses-新冠肺炎

数据

ECDC (2021 年)。每日更新世界各国新报告的新冠肺炎病例。[数据集]。https://www . ecdc . Europa . eu/en/publications-data/download-todays-data-geographic-distribution-新冠肺炎-cases-worldwide

马赫迪、布拉什奇克、德洛特科、萨尔维、陈、T. S. T .、哈维和扎雷布斯基(2020)。OxCOVID19 数据库:更好理解新冠肺炎全球影响的多模态数据库。medRxiv。

世卫组织(2021 年)。PHSM:跟踪公共卫生和社会措施。【数据集&码书】。https://www . who . int/emergencies/diseases/novel-coronavirus-2019/phsm

产品特征与评论层次的情感分析:当部分比整体更有价值时

原文:https://towardsdatascience.com/when-the-parts-may-be-worth-more-than-the-whole-feature-vs-review-level-sentiment-analysis-eb101ea31539?source=collection_archive---------36-----------------------

入门

马库斯·温克勒Unsplash 上拍摄

由德克萨斯州奥斯汀西湖高中的 Aadit Barua 和 Josh Barua 制作。

主旨

我们开发并测试了一种简单的方法,用于从用户评论中提取关于产品或服务的个体特征的情感。动机是用户可能在他们的评论中提到多个特性,并且可能对这些特性持有不同甚至相反的意见。例如,客户可能喜欢一副耳机的音质,但不喜欢噪声消除功能。然而,对整个评论执行情感分析可能产生关于对个体特征的情感的误导或不正确的结果。因此,在假设用户表达他们的情感接近特征词的情况下,我们首先预处理文本以提取特征周围的词窗口,而不是通过情感分析器传递整个评论。使用跑鞋的评论,我们为每个特征情感分数建立了基础事实,并且表明与我们的方法相关联的误差显著小于通过使用整体评论获得的误差。

何必纠结于功能级的情绪?

情感分析在许多自然语言处理应用中扮演着重要的角色,包括推荐系统和理解消费者对品牌和产品的看法。评论通常涉及多个特征或属性。下面的表 1 提供了一些例子。

表 1:经常提及的产品特性

对完整评论进行情感分析是很常见的。然而,总体评论的情绪可能不会正确地反映对个别特征的情绪。考虑表 2 中显示的一些评论。特征词以粗体显示。

表 2:功能级别与总体情绪

在这些例子中,用户表达了对两个特征的相反意见,其结果是总体情感没有反映与任一特征相关联的正确情感。

特征级情感分析什么时候有用?

特征级情感分析在许多应用中是有用的。将消费者对产品特征的偏好作为输入的推荐系统可以使用针对个体特征的情感分数来做出更相关的建议。我们可以根据消费者对特定功能的感受(例如,两款智能手机的摄像头和电池质量),准确地比较产品。向公司提供详细的反馈以帮助改进其产品或服务取决于我们获得特征级情感的能力。例如,从酒店评论的情感分析中,我们可以告诉酒店管理层,消费者喜欢它的酒店。但是在特征级别执行分析可以提供这样的见解,即虽然客人对服务感到兴奋,但对便利设施的体验并不深刻。对第一个特征(服务)的非常积极的看法可能掩盖了对第二个特征(便利设施)的稍微消极的看法。

一种简单的无监督方法

可能有复杂的监督方法来提取特征级情感。然而,我们概述了一个简单的无监督方法。我们假设诸如形容词之类的带有情感的词很可能靠近特征词而不是远离它。表 3 中示出了三个评论、其中包含的特征、带有情感的单词以及特征和带有情感的单词之间的距离(单词的数量)。我们在计数中忽略停用词。 Stanford NLP 页面提供了一个常用停用词以及基本上表现类似停用词的单词的列表。

表 3:特征词和情感词之间的距离

为了提取特征词的情感承载词,我们建议提取特征词周围的词窗口,如图 1 所示。

图 1:围绕特征词的 3 个词的窗口

例如,考虑我们数据中的真实评论(我们在这个相当负面的评论中删除了品牌和产品名称):

“在 10 多双上面有数百英里的(品牌名称)后,我尝试了这些作为替代品。不幸的是,它们在舒适度和质量上倒退了一大步。总的来说,我发现(产品 1)比(产品 2)更窄,但 6 毫米的跌落感觉差不多。对于一双中性的鞋子来说,足弓支撑感觉真的很大,因为它们对我来说太窄了。我喜欢鞋面上添加的网格,但是,我发现(产品 1)在鞋前半部分的缓冲中有所欠缺。”

如果我们对用户对气垫的看法感兴趣,我们提取以下窗口大小为 3 的内容:

这种情绪被“缺乏”这个词抓住了。我们使用短语“发现缺少缓冲前半鞋的产品”作为无监督情感分析的 VADER 的输入。在一篇评论中多次提到一个特性也是可能的。在这种情况下,我们为给定评论的相同特征提取多个窗口。提取单词窗口的代码如下所示:

from nltk.tokenize import word_tokenize #import word_tokenize 
limit = 3 #the number of words on either side of the feature word used to create the window
attribute = "cushion" #desired feature 
reviews_list = ["I love the cushion, but hate the support.", "Even though the shoe was durable, it had very little cushion and made my feet sore after runs."] #list of product reviews
attribute_position_list = [] #list of positions where the feature word was found in each review
review_with_attribute_list = [] #list of review containing the feature wordfor review in reviews_list:
    word_tokens = word_tokenize(review) #tokenizes each review
    position = 0 #position in the review where the feature is found
    for word in word_tokens: #for each word in the review
        if(word.find(attribute)>-1):
            attribute_position_list.append(position) 
            review_with_attribute_list.append(word_tokens) 
        position = position + 1index = 0 #keeps track of which review is being parsed
for review in review_with_attribute_list:
    limited_sentence_list = [] #list of words within the window 
    for item in range(len(review)):
        if(abs(item - attribute_position_list[index]) <= limit): 
            limited_sentence_list.append(review[item])
    parsed_review = ' '.join(limited_sentence_list)
    print(parsed_review)
    index = index + 1

VADER 代码分享如下:

from nltk.sentiment.vader import SentimentIntensityAnalyzer
def get_sentiment(parsed_review): #passes the parsed review 
    sid = SentimentIntensityAnalyzer()
    score = sid.polarity_scores(parsed_review)
    compound = score.get('compound')
    return compound #returns the sentiment score

测试我们的方法

我们使用一组跑鞋评论来测试我们的方法。首先,我们使用 VADER 来获得完整评论的情感分数。然后,我们使用上面的解析器提取特征词周围的词窗口。我们使用两个功能:缓冲和支撑。为每个特征提取的单词被用作 VADER 的输入。我们注意到特征情感之间的相关性是. 44(表 4),这不是特别高。结果,如表 4 所示,个体特征和总体情绪之间的相关性甚至更低,这表明总体情绪不会给我们一个用户对特定特征感觉如何的良好指示。

表 4:整个评论、特征 1 和特征 2 的情感之间的相关性

为了建立基础事实,我们手动阅读每篇评论,并对两个特征中的每一个进行评分。我们为每个特征计算两个均方根误差(RMSE)值:一个使用整个评论的基本事实分数和情感分数,另一个使用基本事实分数和特征级情感分数。我们设置的 RMSE 公式是:

表 5:使用整体评论和词窗进行情感分析的 RMSE 值

结论

情感分析是自然语言处理的一个关键要素,它的有用性依赖于它对顾客偏好的洞察。向公司提供有关其产品或服务的详细指导和建议的能力取决于我们在特征或属性层面进行情感分析的能力。我们在本文中演示了一个简单的方法。我们希望你能尝试更复杂的方法。也许 Peter Turney (2002)提出的提取词类二元模型和分析语义倾向的想法可以适用于我们的环境。也许 BIOES 标记方法可以以修改的形式应用。但是无论你做什么,玩得开心点!

参考文献

彼得·特尼,《竖起大拇指还是竖起大拇指?语义导向应用于评论的无监督分类。”arXiv 预印本 cs/0212032 (2002 年)。

何时避免深度学习

原文:https://towardsdatascience.com/when-to-avoid-deep-learning-a7cfe3635022?source=collection_archive---------1-----------------------

意见

以下是原因和时间…

纳丁·沙巴纳在Unsplash【1】上拍摄的照片。

目录

  1. 介绍
  2. 当你想简单地解释
  3. 当你可以使用其他算法时
  4. 当你有一个小的数据集和预算
  5. 摘要
  6. 参考

介绍

本文面向可能考虑使用深度学习算法的数据科学家,并希望了解更多关于在您的工作中实施这些类型的模型的缺点。深度学习算法有很多好处,功能强大,炫耀起来也很有趣。然而,有一些时候你应该避免它们。我将在下面讨论你应该停止使用深度学习的时间,所以如果你想更深入地研究深度学习,请继续阅读。

当你想简单地解释

照片由马尔特赫尔姆霍尔德Unsplash【2】上拍摄。

因为其他算法存在的时间更长,所以它们有无数的文档,包括使可解释性更容易的例子和函数。这也是其他算法的工作方式。由于这个原因,深度学习可能会让数据科学家望而生畏,当你不确定如何向利益相关者解释时,使用深度学习算法可能会令人厌烦。

这里有 3 个例子,说明你在解释深度学习时会遇到困难:

  • 当你想要描述你的模型的主要特征时——这些特征变成了隐藏的输入,所以你不知道是什么导致了某个预测的发生,如果你需要向利益相关者或客户证明为什么达到了某个输出,这可能更像是一个黑盒
  • 当您想要调整学习率和批量大小等超参数时
  • 当你想解释算法本身是如何工作的——例如,如果你要向利益相关者展示算法本身,他们可能会迷路,因为即使是简化的方法仍然难以理解

这里有 3 个例子,说明如何从非深度学习算法中解释上述相同的情况:

  • 当你想解释你的主要特性时,你可以很容易地访问 SHAP 库,比如说,对于 CatBoost 算法,一旦你的模型被拟合,你可以简单地从feat = model.get_feature_importance()制作一个摘要图,然后使用summary_plot()按特性名称对特性进行排序,这样你就可以向利益相关者(和你自己)展示一个不错的图

非深度学习模型的分级 SHAP 输出示例[3]。

  • 作为一种解决方案,其他一些算法通过随机网格搜索或更结构化的集合网格搜索方法,使调整超参数变得非常容易。甚至有一些算法可以自行调整,因此您不必担心复杂的调整
  • 解释其他算法的工作原理可能会容易得多,比如决策树,例如,你可以轻松地显示是或否,0/1 图表,显示导致预测的特征的简单答案,如是的,下雨了是的,现在是冬天,将提供是的,天气将会变冷

总的来说,深度学习算法是有用和强大的,所以它们肯定有一个时间和地点,但也有其他算法可以替代,我们将在下面讨论。

当你可以使用其他算法时

卢卡·布拉沃在Unsplash【4】上拍摄的照片。

坦率地说,有一些算法可以很快给你一个很好的模型和很好的结果。其中一些算法包括线性回归、决策树、随机森林、XGBoost 和 CatBoost。这些是更简单的选择。

这里有一些例子,说明为什么你会想要使用非深度学习算法,因为你有这么多其他更简单的非深度学习选项:

  • 它们可以更容易、更快速地设置,例如,深度学习可能需要您让您的模型添加连续、密集的层,并对其进行编译,这可能比简单地使用回归器或分类器并用非深度学习算法对其进行拟合更复杂、更耗时
  • 我个人发现,这种更复杂的深度学习代码可能会导致更多的错误,如何修复它的文档可能会令人困惑或过时,不适用,而使用类似随机森林的算法,可以有更多易于理解的错误文档
  • 深度学习算法的训练有时可能并不复杂,但当从一个端点进行预测时,可能会对如何提供预测值感到困惑,而一些模型,您可以简单地将值放在有序值的编码列表中

我会说,你当然可以尝试深度学习算法,但在你这样做之前,最好从一个更简单的解决方案开始。这取决于你训练和预测的频率,或者是一次性的任务。还有一些其他原因让你不想使用深度学习算法,比如当你有一个小数据集和小预算时,我们将在下面讨论。

当你有一个小的数据集和预算

照片由你好我是尼克Unsplash【5】。

通常,你可以在一家小公司或者一家初创公司担任数据科学家。在这种情况下,您可能没有太多的数据,也没有太多的预算。因此,你会尽量避免使用深度学习算法。有时,您甚至可以有一个只有几千行和几个要素的小数据集,您可以简单地在本地运行一个替代模型,而不是频繁地花费大量资金来维护它。

这里是你应该根据成本和数据可用性使用深度学习算法的时候:

  • 小数据可用性通常是许多公司的情况(但并不总是如此),深度学习在具有大量数据的信息上表现更好
  • 您可能正在执行一次性任务,因为模型只预测一次—并且您可以在本地免费运行它(并非所有模型都会在生产中频繁运行),就像一个简单的决策树分类器。在深度学习模型上投入时间可能不值得。
  • 您的公司对数据科学应用感兴趣,但希望保持较小的预算,而不是从深度学习模型中执行昂贵的执行,而是使用带有早期停止轮次的基于树的模型,以防止过度拟合,缩短培训时间,并最终降低成本

我曾经提出过深度学习,但由于各种原因,它被否决了,而这些原因通常都是如此。但是,我不想完全劝阻某人使用深度学习,因为这是你在职业生涯中有时应该使用的东西,可以是你经常做的事情,或者主要取决于环境和你工作的地方。

摘要

总的来说,在你深入研究深度学习之前,要意识到有些时候你应该出于各种原因避免使用它。当然,有更多的理由避免使用它,但也有使用它的理由。最终还是要看你自己深度学习的利弊。

以下是不应使用深度学习的三种情况/原因:

* When You Want to Easily Explain* When You Can Use Other Algorithms* When You Have Small Dataset and Budget

我希望你觉得我的文章既有趣又有用。如果你同意或不同意避免深度学习的原因,请在下面随意评论。为什么或为什么不?作为一名数据科学家,你认为还有哪些原因应该避免使用深度学习?这些当然可以进一步澄清,但我希望我能够对深度学习有所启发。感谢您的阅读!

我不属于这些公司中的任何一家。

请随时查看我的个人资料、 Matt Przybyla和其他文章,并通过以下链接订阅接收我的博客的电子邮件通知,或通过点击屏幕顶部的订阅图标 ,如果您有任何问题或意见,请在 LinkedIn 上联系我。

订阅链接:https://datascience2.medium.com/subscribe

参考

[1]Nadine sha abana 在 Unsplash 上拍摄的照片,(2018)

[2]照片由马尔特·赫尔姆霍尔德Unsplash 上拍摄,(2021)

[3] M.Przybyla,来自非深度学习模型的排名 SHAP 输出的例子,(2021)

[4]Luca Bravo 在 Unsplash 上拍摄的照片,(2016)

[5]图片来自你好我是尼克Unsplash(2021)

何时使用套索回归

原文:https://towardsdatascience.com/when-to-use-lasso-regression-8a4c4b334fa8?source=collection_archive---------21-----------------------

如果您正在处理大数据,LASSO 回归是您数据科学武库中的一个很好的工具。计算效率很高同时执行变量选择和回归。那有多厉害?!在本文中,我们将讨论何时需要使用这个强大的工具对多元线性回归建模。

照片由迈克考克斯在 Unsplash。

1.你想要一个稀疏模型。

在多元线性回归中使用 LASSO 的第一种情况是当您想要一个稀疏模型时。实际上,稀疏模型可以采取多种形式。最“经典”的情况是,你有一大组变量,但其中只有一小部分是真正重要的。但情况并非总是如此。例如,所有的变量可能都很重要,但是在一个局部区域内,只有少数变量是必需的。例如,假设您有高光谱成像数据,这些数据的波长彼此高度相关。因为它们高度相关,所以你只需要在高度相关的集合中选择一个变量。基本上,这一个变量充当所有与其高度相关的变量的代表。最后,也有可能你的所有变量都很重要,但只有少数变量解释了大部分变异。

该图显示了 15 种不同的组织类型,基因从上到下排列。套索正则多项式分类器显示相对少量的基因是重要的(4,718 个基因中的 254 个),右边的条表示正系数,左边的条表示负系数。图片来自具有稀疏性的统计学习(2015)。

套索回归适用于稀疏模型,因为它是围绕“赌稀疏”原则建立的。本质上,这一原则表明,如果我们想有效地估计我们的参数,“真相”必须是稀疏的。

“使用在稀疏问题中表现良好的过程,因为没有过程在密集问题中表现良好。”

哈斯蒂,提布拉尼,&弗里德曼(2015)

然而,一些人认为“真相”本质上是密集的,我们的模型应该考虑到这一点。绝对是哲学辩论的话题!

2.n << p

当预测变量的数量远大于观测值的数量时,您会希望选择套索回归而不是多元线性回归。当 n < < p 时,这就是所谓的大 p ,小 n 的问题。这是非常典型的基因组数据。有了基因组数据,每个人都有成千上万个基因。这意味着,仅仅为了使 n 等于 p ,你就必须收集数千个样本。这种情况通常不会发生,因为这相当昂贵,而且需要做很多工作。这通常意味着你会留下一个大问题,小问题。

包含 1,000 个基因序列的微阵列数据。照片由国家癌症研究所在 Unsplash 上拍摄。

n < p 怎么了?本质上,如果真实的模型不是稀疏的,我们就没有足够的观测值来精确估计我们的参数。如果 n < p ,最小二乘法将失效,我们将无法获得唯一的估计值(Hastie,Tibshirani,& Wainwright,2015)。现在,如果我们假设稀疏性,或者,如果我们假设只有一小部分变量是重要的,我们可以使用 LASSO 将许多系数缩小到零,只留下大 p ,小 n 场景中的重要系数。

3.你有一些多重共线性。

最后,当您的模型中存在多重共线性时,套索回归非常有用。多重共线性意味着预测变量(也称为独立变量)并不那么独立。对于多元线性回归,这可能会导致系数发生显著变化,并影响模型的可解释性。幸运的是,由于 LASSO 内置的变量选择,它可以在不牺牲可解释性的情况下处理一些多重共线性。但是,如果共线性太高,LASSO 的变量选择性能将开始受到影响。如果有高度相关或共线的预测值,它将只选择其中一个。如果每次运行 LASSO 时得到不同的预测值,您将知道您的共线性是否过高。如果您确实发现您的数据有许多多重共线性,请尝试使用弹性网。这是岭回归和套索回归的混合,在多重共线性较高时效果很好。或者,你可以通过多次运行 LASSO 来破解它,每次运行都跟踪所有重要的预测因素。

多元线性回归是对大量数据进行建模的一个很好的工具,但是它也有其局限性。幸运的是,LASSO 回归是处理稀疏模型和大数据的一个很好的选择。我希望你有机会自己尝试套索!快乐造型!

参考

Hastie,T.J .,Tibshirani,R.J .,和 Friedman,J.H. (2001 年)。统计学习的要素:数据挖掘、推理和预测。纽约斯普林格。

t . j . hastie、r . j . TiB shirani 和 m . wain right(2015 年)。稀疏统计学习。佛罗里达州博卡拉顿 CRC 出版社。

原载于 2021 年 12 月 28 日【https://thatdarndata.com】

何时使用可空的 NaN

原文:https://towardsdatascience.com/when-to-use-the-nullable-nan-10c073b0261e?source=collection_archive---------30-----------------------

当 NA 不为 False、False 为 False 且 NA 不为 Null 时的布尔值。

Unsplash 上由 Nerfee Mirandilla 拍摄的照片

对于 Pandas 中的布尔数据来说,NaN、Null、NA 和 bools 之间有着至关重要的区别——简要介绍何时以及如何使用它们。

任务:清理包含布尔值(真/假)的熊猫数据帧以优化内存。约束是将所有空值保留为空值,即不要将空值变为 False,因为这是一个有意义的变化。

动作:显式转换列 dtypes ,即使用 float32 代替 float64 节省内存,使用 bool 代替 object

问题:将选定的列转换为 bool 时,所有行的计算结果要么全为真,要么全为假,并返回一个令人头疼的问题。

要在布尔值中保留类似 null 的值,请用 pd 显式替换 null 值。NA 并将 dtype 设置为‘布尔型’而不仅仅是‘布尔型’—这就是布尔型数组。

要点:当源列包含空值或非布尔值,例如像 1.0 这样的浮点数时,应用 Pandas 'bool' dtype 可能会错误地将所有行评估为 True 。相反,用 pd 显式替换空值。NA 并将 dtype 设置为“boolean”而不仅仅是“bool”

该项目

在构建和部署应用程序时,我变得非常专注于让事情尽可能快地运行。为此,我最初开始大幅度地将 Pandas dtypes 设置为布尔浮动 32 ,只要有可能。然而,虽然我节省了大量内存,但我后来发现我的数据完整性受到了影响。

继续阅读,学习如何修正和避免这种错误。

权衡

当强制一个列为 bool 数据类型时,几乎可以立即节省一半的内存。虽然这很诱人,但事情还有另外一面。当源数据不只有真/假值时,Pandas 将返回一些不想要但逻辑上正确的结果。

例如,假设在数据帧中有几个“标志”列,表示某种真/假组合。

*# unique values of columns in a DataFrame# col1 -> False True
[False True]# col2 -> True True                     
[nan   True] # col3 -> True True              
[nan   1.]* 

col1 中,唯一的值只有 False 和 True——这是理想的,应用一个 dtype 的 bool 可以很好地工作。

第二栏中,我们遇到了一个问题。虽然我们有一个真值,但是我们也有一个 nan 值。“南”代表熊猫“不是一个数字”,这是计算机知道那里应该什么都没有的一种方式。虽然我不会深入到逻辑地狱( TDS 已经在那里了),但应该足以说明将 col2 设置为 dtype bool 会将每一行评估为 True。这很糟糕,因为不应该为真的行现在为真,而应该为空的行现在有东西了。

列 3 中,我们有与列 2 相同的问题,但是现在有一个浮点数 1。( 1。是电脑 1.0 的简称。与 col2 非常相似,在没有任何干预的情况下,Pandas dtype bool 将对该列求值为 True,如果我们以后按此标志进行过滤,就会出现问题。

失败的解决方案

要解决这种情况,您可以像我一样尝试用字典映射数据,然后将 dtype 设置为 bool。例如,如果 1。应该是真的,那就把它映射出来,然后忘掉它,对吗?没那么快。

*# a tempting but spurious solution
# given a dataframe as dfimport pandas as pd
import numpy as npkey = {'nan': np.nan,
       1.: *True*} df['col1'] = df['col1].map(key)
df['col1'] = df['col1].astype(bool)# this will not work like you might think*

上面的代码片段不起作用的主要原因是它试图将字符串“nan”映射到一种特殊类型的 NaN 值——这永远不会起作用。可以肯定的是,如果你字面上把' nan '作为一个字符串,字典映射返回 np.nan ,但是接下来呢?正如我们从 col3 例子中所知道的,它最终都是真值,我们又回到了起点。

解决方案设置

为了说明如何让 Nulls、nan 和 bools 为您工作,考虑一个示例表和通过 GitHub Gist 编写的代码,它用实际数据涵盖了到目前为止的问题。

如何看待空值的条件匹配

通常,我们可能会尝试测试 if 语句的等价性,但是由于很多原因,传统的条件语句不能处理空值,这些原因我不会在本文中讨论。

*a = 1
b = 1
if b == a:
   print('this will work but not for NaNs')*

虽然听起来不可思议,布尔数组允许你在一个布尔列中携带两个以上的值。

可行的解决方案

相反,使用 isnull() 方法结合类似 np.where() 的方法来测试和查找数据。要替换数据,使用 pd。NA 而不是 np.nan 。接下来,在浮点 1.0 的情况下,我们可以嵌套第二个 np.where() 语句,将 1.0 映射为 True。最后,使用 dtype ' boolean '而不是' bool '来创建一个布尔数组。虽然听起来不可思议,布尔数组允许你在一个布尔列中携带两个以上的值。

结论

优化是神奇的,将 Pandas 对象转换成 bools 以节省内存是一个关键的组成部分。然而,如果不小心,结果可能是痛苦的。在本文中,我描述了在将 null 值保留为 pd.NA 的同时转换 boolean 或 True/False 数据的一些缺陷。

虽然具有两个以上值的可空布尔数组的概念可能看起来很奇怪,但它完全有效,可以帮助您充分利用多个世界的优势!

文件

感谢阅读!请鼓掌或关注我,继续关注我在编程、数据科学和人工智能方面的故事。

当“顶”是误导的时候

原文:https://towardsdatascience.com/when-tops-are-misleading-70b53e280c39?source=collection_archive---------17-----------------------

神经加速器通常以性能特征“TOPS”为特征,即每秒万亿次运算。但仅此还不够。了解这些加速器是如何工作的,以及在进行比较时还应该考虑什么,这一点很重要。

SpaceX 在 Unsplash 上拍摄的

内容列表

简介
什么是上衣?
通用还是专用?比较
–测量
–比较
我什么时候需要很多陀螺?
总结
补遗

介绍

人工智能的硬件加速器有很多名字。它们被称为神经加速器、AI 加速器、深度学习加速器、神经处理单元(NPU)、张量处理单元(TPU)、神经计算单元(NCU)等。所有这些都表示相同的东西:为矩阵运算而优化的电子设备,这是特别有效地计算人工神经网络所需要的。在下面的博客中,我们将坚持恩智浦的名称声明“NPU”。在前几年,主要是英伟达的 GPU 主导了人工智能(AI)领域。随着 AI 领域日益向边缘拓展(移动设备、工业端硬件等。),edge 产品的专用硬件组件已经开发了好几年了。这些主要集中在低精度计算(主要是整数)、现代数据流架构和最佳内存连接。

什么是上衣?

为了能够以简单的方式比较不同的 NPU 架构,创建了“每秒万亿次运算”(TOPS)这一指标。在专家中,该指标不被认为是最佳指标,但它用一个易于理解和可比的数字抓住了一个复杂的问题:我的芯片一秒钟可以进行多少次数学运算?这个数字可以用来快速比较不同的芯片。没有考虑操作的质量,甚至没有考虑更详细地涉及哪些操作。在许多情况下,芯片还专注于一个特定的任务,在那里它们可以调用它们的最大性能。因此,直接比较并不总是合理的。

在大多数情况下,top 用经典的“ResNet50”来衡量,有时用“MobileNet”架构来衡量。在应用中,ResNet50 现在经常被更现代的网络所取代。然而,它为比较提供了一个良好的基础。

通用还是专用?比较

在这一部分中,我们将比较两个 npu,以展示需要注意的地方。一个侧重于工业应用和“低顶点”,另一个侧重于高速图像分析和“高顶点”。首先,我们展示一些测量,然后讨论一些利弊。

图 1 带有 i.MX 8M Plus 的 phy board-Pollux[图片由作者提供]

—测量

phyBOARD-Pollux 单板计算机(图 1)是基于恩智浦 i.MX 8M Plus 四核处理器的工业板。i.MX 8M Plus 的 NPU 由恩智浦指定为 2.3 TOPS。然而,这本身并不能说明可以实现的推理时间。使用 ResNet50 对该 NPU 进行图像处理测试,结果每秒处理 60+帧(fps ),每张图像的平均推理时间为 16 毫秒(224×224 pxl);在相同分辨率下,MobileNetV1(图 2)每幅图像平均 6 毫秒,每秒 159 帧。恩智浦自己的测试显示,MobilNet 架构的推断时间约为 3 毫秒。

图 2 在 i.MX 8M Plus NPU 上使用 MobileNetV1 (224x224)的推理[图片由作者提供]

还有其他标有名义上更高顶点的神经加速器。我们将看看 Gyrfalcon 的 Lightspeeur 2803s(图 3),它可以提供高达 16.8 TOPS 的峰值。这导致使用图像输入分辨率为 448 x 448 pxl(来自他们的网站)的 MobilNet 的速率超过 100 fps。如果我们假设输入大小与 200.704 pxl 和 50.176 pxl 的推断时间成线性比例,我们可以直接比较 i.mx8 M Plus 的大约 40 fps 和 gyrfalcon 的 100 fps,从而得到大约 60 fps 的增量。因此,TOPS 中 7.3 倍的差异导致 fps 中 2.5 倍的差异。

对于 Gyrfalcon,在撰写本报告时无法进行测量(见附录)*

接下来,我们将讨论两种芯片的不同之处。

—比较

将恩智浦的 i.MX 8M Plus 与 Gyrfalcon 的 Lightspeeur 2803s 进行比较,似乎很明显,Lightspeeur 在 TOPS 中明显优于 8M Plus。然而,当查看细节时,很明显不应仅根据 TOPS 来比较芯片,两者都有其合理的应用领域。

图 3 Gyrfalcon Lightspeeur 2803s [CC 许可]

TOPS 到 fps首先值得注意的是,推理速度仅快 2.5 倍,而 TOPS 是 7.3 倍。尽管我们不能肯定地说,但这似乎归结于集成到模块和/或测量应用代码中的芯片。芯片和嵌入式存储器之间的短连接对于避免数据传输瓶颈非常重要。

NPU-Model Integration
一般来说,i.MX 8M Plus 的一大亮点就是恩智浦提供的 eIQ 库。 eIQ 提供模型和 NPU 之间的无缝连接。eIQ 库支持 TensorFlow Lite 和 ONNX 模型,确保模型在嵌入式硬件上顺利、直接地实施。对于 eIQ ,例如 TensorFlow Lite 中的简单转换和量化足以向 NPU 提供模型。

Gyrfalcon 使用一个 MDK 和 SDK (模型和软件开发工具包)来实现模型,这更具挑战性(*见附录)。不应该低估一个简单的实现,因为模型的简单适应允许更多的时间用于应用程序和模型开发,从而在敏捷模式中实现更快的迭代。
提供用于模型转换的特殊 SDK/mdk 的一个问题是客户依赖于提供软件开发人员的分配和奉献。每个更新周期都依赖于它们;每次故障排除都必须由他们处理。可惜 SDK 尸体一次次出现。因此,软件越接近开源/社区解决方案,对个人开发者的依赖就越少。这是恩智浦 eIQ 库的一个优势,它非常接近 Google 的 NNAPI,直接使用 TF-Lite 和 ONNX 模型格式。

标准还是自有模型架构? 另一个区别是,i.MX 8M Plus 几乎支持当前所有的模型类型和模型架构。另一方面,Lightspeeur 2803s 专注于用于图像处理的卷积神经网络(CNN)。Lightspeeur 2803s 还仅支持三种最重要的模型架构:VGG、ResNet 和 MobileNet。这是三种常用的基础架构,但是这里忽略了适应性模型、现代架构以及其他类型的网络(例如,递归神经网络)。这种对 CNN 的关注使得 Lightspeeur 2803s 达到了最高的 top 数。

综合还是 PCIe? I . mx8 M Plus 的伟大之处还在于它作为片上系统(SOC)的集成,创造了一个“一体化”解决方案。因此,所有硬件组件直接共享存储器(直接存储器访问),并且不需要例如 CPU 和 NPU 之间的额外数据传输。这一点特别有趣,因为 i.mx8M Plus SOC 集成了其他几个非常特殊的硬件组件,如硬件图像预处理、图像和视频解码/压缩、原始传感器图像处理……这些组件可以直接集成到数据管道中,无需任何额外的数据传输。
gyr falcon 当然也可以设计成 SOC,但这需要大量的工作和专业知识才能完成。经典的 Gyrfalcon 是通过 PCIe 作为外部芯片添加的。这需要在开发阶段进行集成,并在推断阶段在硬件组件之间进行额外的数据传输。

目标市场是什么?
许多工业应用的决定性因素是 i.MX 8M Plus 的长期可用性。工业工厂中的边缘设备通常被期望在低维护和特殊条件下运行数年。在这里,Lightspeeur 2803s 更适合消费电子领域的应用,在正常的商业使用中,设备运行时间可以达到两到三年。Gyrfalcon 目前不保证两年后的可用性。假设新的 i.MX 8M Plus 的长期可用性超过 10 年。

图 4 恩智浦和 Gyrfalcon NPU 的对比[图片由作者提供]

功耗
两款芯片的功耗与 Lightspeeur 2803s 的 700mW 相当,i.mx8 M Plus(仅 NPU)的功耗也在 900mW 左右。在这种情况下,功耗并不是一个优于另一个,但是,在比较嵌入式设备的芯片时,功耗通常是一个重要的特征。

通过所描述的要点,您可以看到两种芯片都有不同的关注点和目标群体。在这里,通过 TOPS 进行纯粹的比较会产生误导。i.MX 8M Plus 更像是一种通用芯片,可以用于许多方面,而 Gyrfalcon 则适合于具有高性能要求的狭义应用。

我什么时候需要很多上衣?

这个问题是什么时候出现的 Lightspeeur 2803s 优于 i.MX 8M Plus?高 fps 很快浮现在脑海中,这里更多而不是更少的陀螺是首选。然而,我们必须意识到,大多数相机只能提供 30 到 60 帧/秒。在这里,i.MX 8M Plus,即使有一个有点重的 ResNet50,仍然是完全足够的。

批处理,处理图像流,也经常与 TOPS 相关联。然而,批处理更常用于训练神经网络。在经典推理中,一次处理一个图像,即一个图像一批。

真正需要大量 top 的是“实时关键应用。尤其是在自动驾驶领域。举例来说,如果您想要使用 360 度多流输入,在一毫秒内检测到一个孩子跑到马路上,则需要 TOPS 形式的大规模计算能力,并具有像素精度的检测。对于这项任务,像 Lightspeeur 2803s 这样的高顶芯片是正确的选择。

重要的是要记住,纯粹的推理并不是人工智能应用程序的唯一任务。在许多情况下,至少一个或多个数据预处理步骤发生在计算之前和之后。结果将用于指导进一步的过程。如果没有向 NPU 提供足够的数据,过多的 top 没有影响。目前,一个编程良好的精益应用比一个高度调优的 NPU 更有价值。
当然,这两者的结合将消除任何技术性能障碍。

总结—不同的任务,不同的硬件!

我们对比的两款芯片在各自的特定领域都非常优秀。然而,TOPS 并没有给出 NPU 是否适合计划应用的完整描述。对不同模型的支持,尤其是模型在芯片上的顺利实现,至少与纯粹的性能一样重要。

还必须考虑硬件以及周围的软件应用程序可以利用或服务于 NPU 性能。一个未优化的软件应用无法通过更多的 top 来补偿。基本上,NPU 必须符合整体概念。TOPS 只是众多参数中的一个。

为了更清楚地了解情况,可以提出以下问题:

  • 我的输入数据类型和大小是什么?
    • 传感器数据,视频流,混合数据流,…
  • 我多快需要结果?
    ——时间关键还是性能关键?
  • 我们看到的计算难度是什么?
    • “经典”ML,深度学习,分类,细分,…
  • 你的目标市场是什么?
    • 工业和消费市场有不同的要求。
  • 功耗是否至关重要? ——手持设备,多个设备累加,或一个插电设备,…

我需要一个 NPU 吗?
是否需要一个 NPU 可以基于以下几点:如果有一个任务可以被“经典机器学习”(支持向量机、树学习器、…)处理,那么在很多情况下使用一个 CPU 就足够了。一旦使用深度学习架构,我们建议使用 NPU。

表 1 不同输入和规格所需的顶部[表格由作者提供]

需要多少个 top 的问题可以大致基于以下准则:如果我们有大量的输入数据(例如,以 HD 图像作为输入的图像处理应用),并且我们需要 1 ms 以下的结果,我们应该选择具有 5+top 的芯片。如果例如 10 ms 就足够了,那么具有 2 个顶部的芯片就足够了。同样重要的是手头的确切任务,例如分类与分割,其中需要不同的计算工作。此外,考虑网络/模型的复杂程度会影响决策。表 1 中的列表旨在给出不同考虑因素下需要多少顶部的粗略概述。请记住本文中提到的影响每个用例的芯片有用性的不同方面。

与数据科学一样,每个问题都需要量身定制的方法。

调查基于 PHYTEC AI 试剂盒:

https://www.phytec.de/produkte/development-kits/phyboard-pollux-ki-kit/

以及回转隼的光速 2803s:

附录

从 Gyrfalcon 芯片上展示我们自己的测量结果会更好。然而,即使我们拥有来自 Gyrfalcon 的 Plai Plug 2803,调试仍然困难重重,导致我们无法生成自己的测量值。

我们在本文中提出的关于客户对开发人员时间、奉献和项目关注的依赖性的观点,在我们使用 Gyrfalcon 芯片的努力中得到了很好的体现。完成文章草稿后,我们试图用自己的数据更新 Gyrfalcon 的结果。当我们遇到自己无法解决的错误时,我们通过他们的 sdk 论坛联系 Gyrfalcon 开发者。截至发稿时,已是 12 天后(8 个工作日),我们没有收到任何答复。
这并不是要抨击 Gyrfalcon,因为这种延迟有许多可能的理由,然而它很好地描绘了所描述的现象。想象一下,你正处于一个紧张的项目进度中,现在不得不依赖这个答案。8/12 天没有任何迹象表明是否会得到答复是不令人放心的。如上所述,问题是,我们可以询问的社区很少,甚至没有,因为 SDK 没有广泛传播。几天后,我们也在 Stackoverflow 上询问过,由于其独特的性质,也没有得到答复。
相比之下,我们在 i.mx8M Plus 尝试运行 TensorFlow lite 模型时也遇到了问题,然而,TFlite 社区非常庞大,我们几乎立即就从社区而不是恩智浦那里收到了我们的解决方案。

请自行检查我们的问题到目前为止是否得到了回答,以及花了多长时间才得到回答:

https://dev.gyrfalcontech.ai/forums/topic/2083-plug-device-cannot-be-found/

2020 年 1 月发布了一个具有非常相似问题的主题,在撰写本文时尚未得到回复(2021 年 4 月 26 日):

https://dev.gyrfalcontech.ai/forums/topic/bugreport-gti-sdk-4-5-0-0-cannot-find-2801-device/

训练模型时,您将需要训练、验证和维持数据集

原文:https://towardsdatascience.com/when-training-a-model-you-will-need-training-validation-and-holdout-datasets-7566b2eaad80?source=collection_archive---------16-----------------------

理解为什么需要 3 组独立的数据来建立模型

照片由 Amirali Mirhashemian 拍摄,来自 Unsplash

介绍

当我第一次开始建立机器学习模型时,我曾经用两组数据训练我的模型— 训练数据集和验证数据集,使用通用的分裂规则(80%用于训练数据,20%用于验证数据)。然而,当模型被部署并应用于新的数据集时,模型性能开始下降。发生这种情况的原因之一是模型没有使用维持数据 t 进行进一步验证,这一点很重要,因为它在训练过程中验证模型性能,从而对模型性能进行最终验证。

在本文中,让我们更多地了解为什么我们在开发机器学习模型时需要不同的数据集,包括每个数据集的功能和重要性— 训练数据集、验证数据集和维持数据集。

数据分割

在您开始构建机器学习模型之前,如果您正在训练一个监督学习模型,则需要对数据进行分区。拥有不同数据集的目的是拥有可用于验证模型性能的数据子集。让我们了解一下您需要划分的 3 组数据:

(1)训练数据集

(2)验证数据集

(3)维持数据集(也称为测试数据集)

什么是训练数据集和验证数据集?

训练数据集和验证数据集(图片由作者提供)

训练数据集是用于训练模型的数据集,这也将是最大的数据集。这是模型将使用并从中学习行为的数据集。将基于训练数据集持续训练模型,以理解其中的行为和模式。

验证数据集用于模型评估,并在训练过程中微调模型超参数。该模型将基于这组数据验证其性能和准确性,但不从验证数据集学习。

什么是维持数据集?

添加维持数据集(按作者分类的图像)

在模型训练过程中不使用维持数据集,而的目的是在训练过程中提供模型性能的无偏估计。只有当模型使用训练数据集和验证数据集完成训练时,才会使用这组数据。维持数据集起着重要的作用,因为它确保模型可以很好地对看不见的数据进行归纳。因此,为了确保模型的准确性,确保维持数据集不包含任何定型或验证数据集非常重要。

此外,还应该将维持数据集上模型的准确性与训练期间的准确性进行比较,以确保模型不会过度拟合。如果与维持数据集的准确性相比,训练期间的准确性表现得明显更好,则这表明模型可能过拟合。

配置分流比

定型、验证和维持数据集的通用拆分比率(图片由作者提供)

通常,经常使用的拆分比率是 60:20:20 (60%用于定型数据,20%用于验证数据,20%用于维持数据)或 50:25:25。然而,这也取决于所用数据的大小和类型。重要的是要确保数据集被很好地划分,每组数据都包含原始数据的模式或趋势,否则我们最终可能会选择一个基于验证数据中的模式或趋势的模型。

结论

这篇短文总结了将数据分成三个不同数据集的重要性,这三个数据集分别是定型数据集、验证数据集和维持数据集。维持数据集用作模型性能的最终估计,仅应在模型完成基于验证数据集的定型和调整后使用。

感谢阅读这篇文章,我希望这对任何人来说都是很好的信息。

参考和链接:

[1]https://machine learning mastery . com/difference-test-validation-datasets/

[2]https://sdsclub.com/how-to-train-and-test-data-like-a-pro/

[3]https://towards data science . com/training-vs-testing-vs-validation-sets-a 44 bed 52 a0e 1

我是如何预测美国何时接种疫苗的

原文:https://towardsdatascience.com/when-will-the-us-be-vaccinated-1b24890a8c38?source=collection_archive---------20-----------------------

使用广义加法模型预测美国疫苗接种何时不再受供应限制

照片由哈坎·努拉尔Unsplash 上拍摄

接种疫苗的竞赛开始了。虽然大多数发达国家只有百分之几的人口接种了疫苗,而发展中国家才刚刚开始,但美国是领先的国家之一,其 21%的人口至少接种了一剂疫苗。那么美国什么时候才能达到所有想要疫苗的人都有疫苗的地步呢?

为了回答这个问题,我决定对美国的疫苗接种工作做一个快速预测。虽然这绝不是详尽无遗的,但希望它能产生一个合理的猜测。

数据

数据取自数据中的我们的世界。我使用至少接种过一次疫苗的人口比例。真实数据的最后一天是 3 月 15 日。

代码

分析是在 R. Code 中执行的,数据集在我的 Github 中可用。

假设

进行了一些调整。目前没有疫苗被批准用于 16 岁以下的儿童。虽然疫苗最终会被批准用于它们,但这项分析并没有解决这个问题。第二,一部分人可能会因为各种原因拒绝接种疫苗。最近的调查显示,目前约有 30%的成年人会拒绝接种疫苗,尽管这一数字在最近几个月呈下降趋势。

根据人口普查局的数据,在这个练习中,我剔除了 14 岁及以下人口的 18.74%(记录没有对 15 岁及以下的人口进行细分,所以这个比例可能会略有偏差)。然后我假设剩下的 30%的成年人会拒绝接种疫苗。据估计,还有大约 57%的人口能够并愿意接种疫苗。实际上,这个数字可能会有所不同。

天气预报

首先,我通常认为疫苗接种会遵循一条“S”曲线,开始时很慢,中间时疫苗接种量增加,最后随着希望接种疫苗的人数减少而逐渐减少。逻辑曲线非常接近这个形状。将数据放入逻辑回归,我得到以下输出:

y 轴代表有能力和愿意的人口

这些数据实际上并不符合逻辑曲线。在某些点上,回归始终低估了实际的疫苗接种。目前,回归结果将实际疫苗接种量高估了几个百分点,曲线显得有些过于陡峭。

这个问题是由于美国疫苗接种在二月中下旬的一个间歇。逻辑回归不够灵活,无法处理疫苗接种中的这种纠结。

图片由我们的世界在数据

因此,需要一个模型来解释这种扭结而不影响预测。为了对此进行建模,我使用了一个广义加法模型(GAM ),它可以表示如下:

其中 E(Y)是 Y 变量的期望值,g 是链接函数。鉴于线性回归具有β系数,在 GAM 中,每个预测变量(由 x 表示)具有可以是线性或非线性的平滑函数(f)。

GAM 是一个高度灵活的模型,可以处理各种模式和情况。虽然我不会详细介绍 GAM 的属性和优点,但是对于感兴趣的人来说,是一本很好的读物

然而,GAM 并不直观地知道数据在 0%和 100%之间有界(或者在我的假设下是 57%)。如果我做一个预测,模型的预测将远远超过 100%,从而打破了概率定律。为了纠正这一点,首先需要通过将 Y 变量传递到以下等式来转换 Y 变量:

其中 a 是下限(0),b 是上限(0.57)。

我使用 R 中的 mgcv 包来适应游戏。为了估计平滑参数,我通过限制最大似然(REML)使用混合模型方法。

该模型有两个预测因子:时间(以天为单位)和星期几,为此我为平滑函数指定了一个循环三次回归样条。在创建了一个仅使用时间作为预测因子的模型后,我在残差图中发现了一个循环模式,之后添加了工作日预测因子。95%的置信区间是用贝叶斯方法计算的。

拟合模型后,Y 数据以及预测值和置信区间现在需要转换回原始形式进行解释。为此,它们通过以下等式传递:

创建结果图,生成的预测如下:

总的来说,我对模型和预测很满意。预测符合预期的“S”模式,您可以看到预测中的小波动说明了每周的周期。

根据这一预测,超过 90%希望接种疫苗的符合条件的人应该在 5 月底接种疫苗。到 5 月 18 日,预计 50%的人口将接种一剂疫苗。这相当于大约一半的人口作为一个整体在该日期前接种了疫苗。这似乎与白宫提出的计划相一致,该计划承诺疫苗将在 5 月份提供给所有需要的人。

当然,对 COVID 疫苗态度的进一步改变可能会使这一问题复杂化,并稍微推迟这一时间表。也有可能——甚至很有可能——当更多的疫苗被批准时,这个预测将被证明过于保守。据报道,美国已经为 T2 储备了超过 3000 万剂的阿斯利康疫苗,他们正在等待 FDA 的批准,这可能会在下个月初到来。

当你不应该用准确性来评估你的机器学习模型时

原文:https://towardsdatascience.com/when-you-should-not-use-accuracy-to-evaluate-your-machine-learning-model-4d58f16968e6?source=collection_archive---------9-----------------------

以及有哪些选择。

米歇尔·玛特隆在 Unsplash 上的照片

创建机器学习模型是一个迭代的过程。您将需要进行几次迭代,以获得一个健壮且体面的模型。此外,您可能需要在将模型部署到生产环境中之后对其进行更新。

这个过程中的一个重要部分是模型评估。这和创建模型一样重要。

有几种损失函数和度量来评估模型性能。使用哪一个取决于任务和数据。当谈到分类模型时,最简单和明显的选择似乎是分类精度。但是,在某些情况下,它不是最佳选择。

在本文中,我将解释什么时候应该避免使用分类精度,以及存在哪些替代方法。

分类准确度可能是最直观的度量。它显示了正确预测与所有预测的比率。

分类准确性(图片由作者提供)

那么这个基本指标有什么问题呢?

潜在的问题最好通过例子来解释。想一想垃圾邮件。由于高效的垃圾邮件检测算法,我们不必在这些问题上纠缠不休。

假设我们正在设计一个检测垃圾邮件的模型。与其他电子邮件相比,普通电子邮件地址收到的垃圾邮件非常少。因此,用于训练的数据集很可能是不平衡的。

假设数据集中垃圾邮件和普通邮件的比例是 5 比 95。如果一个模型预测每封邮件都不是垃圾邮件,它的准确率将达到 95%,这听起来不错。然而,它是一种无所作为的模式。

此外,垃圾邮件和其他电子邮件中的错误应该以不同的方式处理。错过一封垃圾邮件并让它进入收件箱并不是什么大问题。但是,将重要的电子邮件标记为垃圾邮件可能会产生严重的后果。

分类准确性没有为我们提供区分垃圾邮件和其他电子邮件错误所需的灵活性。

类似的情况可以是用于将肿瘤分类为恶性或良性的模型。将恶性肿瘤检测为良性是一个致命的错误。我们的模型应该更加集中于正确地检测恶性肿瘤。评估指标也应该相应地设置。

对于到目前为止所讨论的情况,我们需要一个比分类精度更高级或更具体的度量。有哪些替代方案?

我认为有些术语对于理解这些替代方案的工作原理很重要。我先解释一下。

混淆矩阵

它分别概述了不同类上的模型性能。在二元分类的情况下,我们可以观察模型在预测正类(或 1)和负类(或 1)方面的表现。

(图片由作者提供)

  • True positive (TP)表示实际类值和预测值都为正(或 1)。
  • 真负值(TN)意味着实际类值和预测值都是负值(或 0)。
  • 假阳性(FP)意味着预测值为正,但实际类值为负。
  • 假阴性(FN)意味着预测值为负,但实际类值为正。

TP 和 TN 都是正确的预测,因此我们预计它们比 FP 和 FN 高。

现在,我们可以详细了解分类准确性的替代指标。

精确

精确的焦点是正面的预测。因此,它基于正面预测来评估模型。精度值是正确的肯定预测与所有肯定预测的比率。

(图片由作者提供)

在垃圾邮件检测模型的情况下,假设垃圾邮件代表肯定的类别,我们希望精确度尽可能高。

回忆

回忆的重点是正面类,而不是正面预测。它被计算为正确的正预测与整个正类的比率。

(图片由作者提供)

假阴性的实际类别是阳性,因此所有阳性类别的数量可以通过将真阳性和假阴性加在一起获得。

在肿瘤检测模型的情况下,我们希望最大化召回值,因为检测每个恶性细胞是至关重要的。

:虽然精度和召回率多用于二分类问题,但也可用于评价多类分类任务。

结论

彻底的评估是机器学习的关键步骤。否则,改进你的模型将是一场艰苦的战斗。

评估过程中最重要的部分是选择合适的指标。对于目标变量不平衡的分类问题,分类精度不是最佳选择。

精确和回忆可以用在这样的任务中。您也可以使用 F1 得分,它是精确度和召回率的加权平均值。

感谢您的阅读。如果您有任何反馈,请告诉我。

当您的机器学习模型与 Django REST API 合作时,成功地部署到了生产中

原文:https://towardsdatascience.com/when-your-machine-learning-model-teams-up-with-django-rest-api-a-successful-deployment-into-2f720bd67ff1?source=collection_archive---------8-----------------------

关于如何构建机器学习模型并使用 Django REST API 部署它的完整概述

SpaceX号航天飞机上拍摄的照片

介绍

让我们考虑一下下面的场景:您已经实现了一个出色的机器学习模型,该模型可以预测患者是否患有帕金森病。然后,您所在城市的医院希望将您的模型集成到他们的系统中,以供一般使用。但是这些系统是用完全不同的编程语言开发的。这是否意味着他们将不能再使用您的模型了?答案是否定的,因为有了 RESTful 服务,无论应用程序开发人员使用哪种编程语言,他们都可以使用您的模型。

本文分为两个部分:

  • 构建一个机器学习模型,预测给定患者是否患有糖尿病。
  • 演练 REST 的步骤-使用 Django REST APIs 启用您的机器学习模型。

第一部分:模型构建

目标不是拥有一个花哨的模型,而是快速拥有一个模型并将其序列化,以便创建最终的 REST API。

下图描述了模型构建项目的结构。

按作者列出的项目结构

先决条件

本节的目的是安装正确实现分类模型所需的所有库。

1-创建并激活虚拟环境

python3 -m venv mlAPIEnv   # Create the environment
source mlAPIEnv/bin/activate  # Activate the environment

2-安装 熊猫 进行数据读取

pip install pandas

3-安装 sklearn 导入机器学习模型

pip install -U scikit-learn

4-安装 作业库 以序列化最终模型

pip install joblib

每个文件的内容

运行以下命令后,您将看到下面的图像:前 7 行,后 7 行,以及分类报告中的模型性能。

cd src # move to the ***scr*** folderpython3 run_training.py # Run the model training

数据帧的头和尾

分类报告

现在,您应该在模型文件夹下找到一个新文件diabete _ detector _ model . pkl**

您的机器学习模型已经准备好了。现在是时候休息了——用 Django REST API 启用它。

第 2 部分:应用编程接口的实现

先决条件

本节的目的是安装正确实现 REST API 所需的所有库。

1-安装姜戈

pip install django

2-安装 Django REST 框架

pip install djangorestframework

Django 项目和 REST API

所有库都已安装。下一步是创建一个姜戈项目和姜戈 rest API。

1-从项目的根文件夹创建您的姜戈项目。

django-admin startproject diabete_deployment

运行前面的指令将创建一个名为 diabete_deployment 的新文件夹。移动到该文件夹并创建您的应用编程接口。

2-创建您的 API 文件夹

cd diabete_deployment # Move into the folderdjango-admin startapp diabete_api # Create your API folder

从下图中,我们可以看到前面的附加文件夹及其相应的文件。

按作者列出的带有附加文件夹的项目结构

对于构建我们的 API 很重要的文件是 settings.pydiabete_api/views.py,diabete _ deployment/URLs . py .我们稍后需要创建额外的文件和文件夹。

  • settings.py :用于注册项目中的所有新应用/API。新信息注册在下面突出显示的 INSTALLED_APPS 变量下( diabete_apirest_framework )。

settings.py 内容

每次更新设置文件时,进行迁移是很重要的,以便将更改传播到数据库模式中。确保在 manage.py 所在的 diabete_deployment 文件夹下运行该命令。

运行迁移

python manage.py makemigrations

b-迁移更改

python manage.py migrate

以下是运行 migrate 命令后的输出

运行服务器,检查到目前为止是否一切正常

python manage.py runserver

前面的命令生成以下信息来访问通向 Django 接口的 URL,这意味着到目前为止一切正常。

Watching for file changes with StatReloader
Performing system checks...System check identified no issues (0 silenced).
November 29, 2021 - 03:47:18
Django version 3.2.9, using settings 'diabete_deployment.settings'
Starting development server at [http://127.0.0.1:8000/](http://127.0.0.1:8000/)

Django web 界面,意味着配置是成功的

  • diabete _ API/views . py:用于实现调用特定路线时会触发的所有功能。在我们的例子中,实现将基于预测函数。为了进行预测,我们的函数需要加载模型。为此:我们需要 在主diabete _ deployment文件夹下创建一个新的静态/模型 文件夹,该文件夹将包含序列化的 。pkl 型号型号。

diabete_api 文件夹的 views.py

  • 新建一个文件diabete _ API/URLs . py,内容如下

  • diabete _ deployment/URLs . py:用于将所有的 URL 链接到它们在 views.py 文件中实现的对应函数。

现在,所有重要的文件都已更新,新的文件也已创建,我们终于准备好重新启动网址,并确保一切正常!

运行服务器

python manage.py runserver

我们可以访问前面命令行生成的 url。

System check identified no issues (0 silenced).
November 29, 2021 - 16:23:24
Django version 3.2.9, using settings 'diabete_deployment.settings'
Starting development server at [http://127.0.0.1:8000/](http://127.0.0.1:8000/)
Quit the server with CONTROL-C.

这是我们得到的屏幕,它指向 索引 页面,显示视图文件内 索引 功能中指定的信息。

此页面显示 HTTP 200 OK 表示页面请求成功。

(图片由作者提供)

从该页面中,我们可以通过在 URL 中添加 /predict 来最终调用预测函数。

(图片由作者提供)

在上一页中,我们可以通过将以下 JSON 数据粘贴到 content 部分来模拟预测。

(图片由作者提供)

从前面的图像中,我们观察了从请求到预测的整体交互。

用 CURL 测试您令人敬畏的 API

下面是我们正在进行的 post 请求的语法

curl -d "param1=val1&param2=val2...paramN=valN" [URL]/funct_to_call
  • param1 :第一个参数和 val1 是对应的值
  • param2 :第二个参数和 val2 是对应的值
  • 等等。
  • URL :要使用的 URL,在我们的例子中是 http://127.0.0.1:8000
  • 【funct _ to _ call】:请求调用的函数,在我们这里是 /predict

将所有内容相加,我们得到以下请求:

curl -d  'pregnancies=6&glucose=148&bloodpressure=72&skinthickness=35&insulin=0&bmi=33.6&diabetespedigreefunction=0.627&age=50' http://127.0.0.1:8000/predict

以下是请求的结果:

{"info":"success","patient_status":1,"model_confidence_proba":63.36}

文章结尾

从本文中,您已经学习了如何使用 Django 构建您的机器学习模型和创建 REST API。你现在可以将你的 API 提供给你所在城市的医院,从而拯救生命😃。

额外资源

Django REST 框架

用 Postman 和 curl 测试 REST API

再见🏃🏾

高级分析从何而来,又将走向何方?

原文:https://towardsdatascience.com/where-advanced-analytics-is-coming-from-and-where-it-is-heading-up-to-d031837d3082?source=collection_archive---------42-----------------------

让我们探讨一下基于证据的决策系统如何提供最佳结果,以及预测性分析和规范性分析之间的区别

决策制定是复杂的,但 AI/ML 在这里是为了增强规定性分析,credit: Canva

我们想要高质量的商业分析,一个更好的“在数据中发现有意义和可操作的洞察力的过程”,正如Dursun Delen教授在他的书规定性分析中所描述的那样,因为我们想要通过使用数学/统计模型或机器学习/深度学习算法、技术、工具和实践来做出更好的决策并更好地解决问题。

有许多人试图提出人类理性的决策过程,其中最著名的是赫伯特·亚历山大·西蒙(1916-2001),他是美国经济学家和政治学家,于 1975 年获得图灵奖,并于 1978 年获得诺贝尔经济学奖。

为了取得成功,决策过程应该遵循标准化、系统化和符合逻辑的步骤。H. A. Simon 在 1977 年提出了一个理论,这个理论涉及到智能、设计、选择、实施以及每个阶段之间的反馈形式。西蒙的理论是迄今为止关于基于证据的科学决策的最简明和完整的理论。

西蒙称,人类确实愿意满足于不如最好的东西, 满足感 ,因为他们表现为有限理性,因为他们的理性思维能力有限,他们提出的最佳解决方案可能不是现实世界中的最佳解决方案。这也是许多经理凭直觉行事的另一个原因。如果你想了解更多,我亲爱的朋友艾姆拉有一本关于这方面的很棒的书,叫做《经验的神话》。

简而言之, 智能 阶段是关于理解目标和目的,以及问题识别、问题分类和问题所有权。这个阶段的输出是一个清晰的问题陈述。

第二阶段 设计 是关于模型抽象、模型公式化、方案生成、标准识别。这一阶段会产生一组可供考虑的备选方案。它确实验证了问题陈述。

第三阶段 选择 是对备选方案进行评估、排序,并选择最佳方案。这是进行 敏感度分析 以验证和测试备选方案以及 假设分析 陈述和规划实施的地方。

第四个阶段是 实施 ,就是做需要做的事情,采取行动,了解影响。实施的结果将在周期的下一阶段得到考虑。

现在,我们对人类决策的基本原理有了更好的理解,让我们看看这些年来工具和技术的演变,使我们能够做出更好的决策。

决策系统发展简史

在 20 世纪 70 年代之前,运筹学(or)以类似模拟模型的启发式方法统治了这个行业。随着基于规则的专家系统(ES)的引入,“if/then”语句规范了智能决策算法。

在 20 世纪 80 年代,企业公司需要将来自不同部门的数据统一到一个具有模式的单一数据源中。数据库管理系统和 ERP 系统的出现有助于数据的整合、引用。通过轻松访问数据,基本级别的静态、按需生成的报告提供了系统的总体视图。

20 世纪 90 年代,随着数据仓库的引入,Prism 作为先驱,因曼和金博尔出版了数据仓库的入门书籍,即构建数据仓库数据仓库工具包。业务主管现在知道他们的决策支持系统的关键绩效指标,并能够在仪表板、记分卡的可视化支持下跟踪结果。

21 世纪初,数据仓库驱动的决策支持系统打上了商业智能的烙印,数据量大到需要“挖掘”数据来“发现”数字背后的含义。持续修补和更新数据仓库基础设施的需求/开销增加,这得益于 IaaS 运动。软件系统也变得越来越复杂,并且需要为每个通信进行拆分和创建契约,于是出现了面向服务的架构来解决这些需求。

在 2010 年代,各种数据源使数据生态系统不堪重负,从智能电表到智能健康监测器,再到社交媒体源,“大数据”成为每个人都参与其中的一部分。大规模并行计算机将它们的位置留给了 Hadoop better Map Reduce 编程,内置了 NoSQL 查询能力。

21 世纪 20 年代挑战了批处理的局限性,实时分析是任何交易的核心,要求管道完全自动化,以缩短反馈循环,更快地提供价值。

分析类型

最基本的分析类型是 描述性分析 。这是关于通过运行来自数据仓库、数据湖、数据仓库的报告,从旨在支持决策过程的信息系统中收集数据。任何解释因果关系的报告都试图解释“发生了什么?”。它提供了洞察力和仪表盘,监控系统显示指标以支持正确的决策。

比汇总数据和处理数据更复杂的一个层次是 预测分析 ,它回答“会发生什么?”并提出建议。预测客户行为/需求、金融市场动向和股票市场价格的能力是无价的。数据挖掘使用高性能基础设施上的多维数据集进行探索性分析,而 ML 模型使用无监督学习(如在您不知道您收集的要素名称的情况下)通过分类、回归或时间序列预测来预测或聚类信息。罗尔斯·罗伊斯拥有一个智能发动机健康管理 (EHM)系统,该系统通过车载传感器和实时卫星传输产生的数百万亿字节数据来跟踪全球范围内的发动机健康状况。这是一种预测性监控形式,可标记潜在威胁并建议发动机改进。他们扩展了该系统,使其航空燃料效率提高了 14%。

规定性分析 使用复杂的优化、模拟和基于启发式的决策建模技术来回答“我应该做什么?”这样系统就能代替人类思考。他们执行强化系统,以及其他应用统计学、运筹学、机器学习、自然语言处理、图像处理、语音识别和信号处理。 Kensho 是最重要的之一增强了分析真实世界事件对金融市场的影响的能力,能够回答复杂的金融查询,对事件进行分类,这是一个平均工资为 35 万美元到 50 万美元的员工。

希望它将澄清混乱的分析,与决策系统的历史背景,模型,以及例子。随着强化系统的到位,我认为我们需要一个新的词来描述自动化版本的规定性分析,(自动化分析听起来很老套),以便我们可以确定建议和采取行动之间的界限。正如我们相信我们的 满意的 决策一样,也许我们可以相信系统从它们的反馈循环中学习…

如果你有任何问题,请留下评论,如果你喜欢,别忘了关注我。直到下一个,保重!

机器人记者在哪里?

原文:https://towardsdatascience.com/where-are-the-robojournalists-b213e475ca64?source=collection_archive---------24-----------------------

面向研究的机器人新闻介绍,或自动化新闻,及其当前状态

安德烈·德·森蒂斯峰在 Unsplash 上拍摄的照片

你遇到过机器人记者吗?机器人记者是一种很棒的方式,可以对重复事件进行报道,同时让人类记者专注于需要研究和人类洞察力的工作。洛杉矶时报的 Quakebot 就是这种系统的一个例子。然而,我发现很难找到明确说明机器人记者证用法的例子。

什么是 robojournalism?

在 robojournalism 或自动化新闻业中,一些数据被转换成用某种人类语言撰写的新闻报道。这是通过自然语言生成技术实现的。根据 Graefe [1,p.9]的说法,机器人记者的动机如下:“……算法不仅可以为特定主题创建数千个新闻故事,而且比任何人类记者都更快、更便宜、可能更少出错。”根据同一篇论文,当有结构化数据时,robojournalism 是最合适的,并且主题本质上是重复的。一些传统的用例是体育、金融和天气预报。

根据 Graefe [1]的观点,自动化新闻的过程有五个阶段:

  1. 收集数据,
  2. 有趣事件的识别,
  3. 洞察的优先顺序,
  4. 叙事的产生,
  5. 最后出版这个故事。

他们强调,自动化新闻系统需要领域专家的输入,以定义特定领域的规则和新闻价值的标准。最简单地说,这个系统就像我之前的文章中描述的如何创建你自己的机器人记者。更复杂的系统可以报告更详细的匹配信息,这需要系统对每个匹配的洞察进行优先排序。换句话说,系统应该根据新闻价值对比赛中的事件进行评分。

一篇好的新闻报道需要人类记者满足一些要求。根据为人类记者确定的要求,Leppä nen 等人[2]得出新闻生成系统应该:

  1. 透明的,
  2. 准确,
  3. 可修改并可转移到其他领域,
  4. 产生流畅的输出,
  5. 根据现有的数据,
  6. 制作热门新闻。

新闻自动化的想法一点都不新奇。最早提出这一观点的文章是早在 1970 年由 Glahn 发表的[3]。在文章中,他们描述了天气预报报告的过程,类似于软件提供商当前基于模板的解决方案,其中使用一组预定义的规则来确定选择哪些预先编写的语句来创建故事[1]。

机器人记者(现在)在哪里?

如果想法陈旧,所需技术存在,为什么在各大新闻出版物中发现自动生成新闻的例子却出奇的困难?2020 年,Graefe 和 Bohlken [4]通过对 2017 年至 2020 年间英文科学期刊上的 11 篇同行评议论文进行元分析,总结了读者如何看待自动化新闻与人工新闻相比的可信度、质量和可读性的结果,并指出相同的结果。此外,据他们称,被列为 NLG 提供商客户的媒体机构数量相当少。然后,他们又补充道:“……尽管这可能与商业机密有关。”基于这些概念,他们认为自动化新闻领域仍处于早期市场扩张阶段,类似于多尔在 2016 年已经说过的[5]。

2020 年,Graefe 和 Bohlken [4]通过对 2017 年至 2020 年间英文科学期刊上的 11 篇同行评议论文进行元分析,总结了读者如何看待自动化新闻与人工新闻相比的可信度、质量和可读性的结果。

他们预计媒体机构可能会抑制机器人新闻,而他们的读者可能会不赞成自动新闻。根据 MAIN-model(情态-中介-互动-导航性)[6],自动生成的新闻可能会被读者以冲突的方式感知。

Graefe 和 Bohlken 确定了 Sundar [6]提到的以下启发法,以适用于人类和机器人记者之间的这种对抗。权威启发式建议读者应该更喜欢人类记者,因为他们可以被视为主题专家。此外,对人类记者有利的是,社交存在启发式建议读者应该更喜欢人类记者,因为这感觉更像是与人类而不是机器互动。但是相互矛盾的是,机器启发法认为机器生成的新闻应该比人类撰写的新闻更客观,因为它们不包含偏见。

有趣的是,Graefe 和 Bohlken 陈述了以下内容[4,第 57 页]:“换句话说,不管实际来源是什么[人类还是机器人记者],参与者仅仅是在认为他们阅读了人类撰写的文章时,就给予了更高的评级。”根据他们的说法,总体比较结果显示,读者认为人类和机器人记者的可信度是一样的,质量稍微有利于人类作者,可读性非常有利于人类作者。

“换句话说,不管实际来源是什么(真人还是机器人记者),只要参与者认为他们读了一篇真人写的文章,他们就会得到更高的评级。”

—格雷夫和波尔肯(2020 年)[4,第 57 页]

Graefe 和 Bohlken [4]预计,人们仅仅因为知道机器生成的新闻是由机器生成的而给机器生成的新闻评分较低,这一发现可能会鼓励新闻提供者不要说一个故事是由机器人记者报道的。他们指出,这强调了机器人记者论的伦理挑战(参见关于伦理挑战的讨论[7])。最后,我想补充一点,不说明新闻报道的真实记者,不管是人还是机器人,都是对透明度要求的不尊重。

在 Sirén-Heikel 等人[8]在 2019 年进行的一项研究中,26 名接受采访的美国和欧洲媒体代表中有 13 名提到特定领域、基于模板的 NLG 是他们的媒体机构使用的自动化类型。基于这一点,再加上 2020 年 Graefe 和 Bohlken 没有发现行业有重大进展,我敢预测基于模板的系统仍然是行业标准。

基于模板的系统的使用受到这样一个事实的鼓励,即它们尊重输出的透明度、准确性和流畅性的要求。基于模板的系统的一个缺点是它们不考虑系统的可修改性和可移植性的要求。这里,我指的是本文前一节提到的自动化新闻的需求。

正如在任何遇到自动化的领域一样,机器人记者论当然引起了讨论,人类记者的未来是否岌岌可危。最近有一些关于人类记者被机器人记者取代的新闻,比如微软将在 2020 年用机器人取代记者。

优点和局限性

尽管机器人记者团的使用可能进展缓慢,但它有一些明显的好处。Graefe 列举了 2016 年的以下好处[1]。

  1. 速度——自动化允许快速发布新闻报道——当源数据可用时,报道可以几乎实时发布。
  2. 规模–发布报告的规模可以扩大——例如,可以发布一份关于地震传感器所有观测结果的报告,而不是只报道大地震,而不会耗尽新闻资源。
  3. 无错误——自动化新闻系统被认为不太容易出错,因为它们不会犯拼写或计算错误之类的错误。换句话说,他们的准确性高于人类记者的准确性——假设代码中没有错误,并且源数据是正确的。
  4. 客观性–再次假设系统中没有编码主观性,数据是客观的,系统将产生客观的输出。
  5. 个性化–最后,自动化允许为更小的目标群体——甚至是个人——提供个性化的新闻报道,并按需提供新闻。

除了潜在的好处,Graefe 提到了以下限制[1]。应该指出的是,这篇文章发表后,NLG 进步很大。

  1. 自动化新闻系统的好坏取决于它所使用的数据。换句话说,源数据的可用性和质量是成功的关键。
  2. 尽管系统可能在源数据中识别出有趣的事件,但它不能问“为什么?”。因此,仍然需要人工验证和推理。
  3. 这些算法缺乏独创性,因此限制了它们观察社会和完成新闻任务的能力。
  4. 根据实验证据,人们更喜欢阅读人写的新闻,而不是自动的新闻。

结论

如前所述,robojournalism 有许多好处,已经非常适合于报告结构化数据可用的重复事件。新闻自动化让我们能够为更小的目标受众报道新闻,用多种语言报道同一件事,并对内容进行个性化处理——所有这些都不会产生巨大的额外成本。

尽管有明显的好处,但很难找到由机器人记者撰写的文章的例子。我想知道这是否是由于新闻机构阻止了系统的发展,或者阻止了他们正在使用它们的信息。

参考

  1. Graefe,A. (2016) 自动化新闻报道指南
  2. Leppä nen,l .、Munezero,m .、Granroth-Wilding,m .和 Toivonen,H. (2017) 自动化新闻业的数据驱动新闻生成。在第十届国际自然语言生成会议上,会议记录,188-197 页,美国,9。计算语言学协会。
  3. 格兰(1970 年)。计算机生成的语言预报。美国气象学会通报,51(12),1126–1132。
  4. Graefe,a .,& Bohlken,N. (2020 年)。自动化新闻:一项关于读者对人工撰写的新闻和自动化新闻的看法的元分析媒体与传播8 (3),50–59。
  5. 丹麦注册会计师协会(2016 年)。绘制算法新闻领域的地图。数字新闻。
  6. Sundar,S. S. (2008 年)。主模型:理解技术对可信度影响的启发式方法。(第 73-100 页)。麦克阿瑟基金会数字媒体和学习计划。
  7. 多尔,K. N .,&霍恩布希纳,K. (2017 年)。[算法新闻的伦理挑战](http://Dörr, K. N., & Hollnbuchner, K. (2017). Ethical challenges of algorithmic journalism. Digital journalism, 5(4), 404-419.)。数字新闻,5(4),404–419 页。
  8. Sirén-Heikel,s .,Leppä nen,l .,Lindén,C. G .,& bck,A. (2019)。拆箱新闻自动化:探索自动化在新闻业中的可想象性。北欧媒体研究杂志。

感谢您的阅读!如果你学到了新东西或者喜欢这篇文章,在 Medium 上关注我。我发表关于数据工程和数据科学的文章。你可以从 be 网页了解更多关于我的信息😊

如果你知道一些 robojournalist 的例子,无论有没有关于它被自动化的披露,请让我知道它的评论!👀

线性回归中的置信区间从何而来——最小二乘公式的例子

原文:https://towardsdatascience.com/where-do-confidence-interval-in-linear-regression-come-from-the-case-of-least-square-formulation-78f3d3ac7117?source=collection_archive---------7-----------------------

实践教程

了解线性回归中学习参数权重的标准误差,以及其他指标,如 t 指标和 P>|t| metic。

图片来自 Pixabay

我一直认为我很了解线性回归,直到最近我的大脑对一个同事的问题一片空白——当使用 Python 的普通最小二乘类 OLS 时,参数置信区间来自哪里?我决定推导出线性回归的所有相关公式,并将这些推导汇编成一组文章。这是第一个。

线性回归模型

线性回归模型 f(x)=xᵀ w 是大多数人研究的第一个机器学习模型。在这个模型中:

  • x 是特征, w 是模型参数。 xw 都是长度为 p 的向量,其中 p 是特征的数量。矢量点积
  • 我们需要从训练数据集 (X,Y) 中学习 w 的具体值,其中 X 是形状为 n×p 的特征矩阵,其中 n 是训练数据点的数量。 Y 是形状为 n×1 的观测矩阵。

以下代码使用普通最小二乘类(OLS)来学习模型参数 w 的值:

第 4 ~ 6 行建立了一个线性回归模型,有三个特征声望、教育和一个常数特征(或偏差),目标变量收入

第 10 行打印了下表。在表格中:

  • coef 栏(用黄色背景突出显示)显示了我们的特征的学习参数值— 声望教育和添加的常量特征。这是我们平时关注的。
  • 有趣的是,该表还显示了一些概率度量(用粉红色背景突出显示):对于学习的系数, std errtP > |t| 和置信区间【0.025,0.975】。它们似乎是概率度量,它们意味着什么?

本文解释了这些概率度量的含义,以及它们是如何在线性回归模型的最小二乘公式中计算出来的。

但是在我们回答这些问题之前,我们首先需要了解如何从训练数据 (X,Y) 中学习我们的模型参数 w 的值。我们使用的方法叫做最小二乘法

最小二乘公式

在最小二乘法公式中,为了找到模型参数 w、的具体值,我们最小化以下损失函数

损失函数 L(w) 是观测值 Y 和模型预测值 X w 之间距离的平方。工作就是最小化这种损失——找到 w 的值,使得 L(w)的值最小,因此得名最小二乘法。**

解正规方程求 w

由于 L(w) 是一个未知 w 的二次函数,找到最小化 L(w)w 的值的显而易见的方法是:

  1. L(w) 相对于 w 的导数导数是另一个未知的函数 w
  2. 将导数设置为 0。这就给了你著名的法线方程
  3. 求解法线方程以找到 w 的具体值。

形式上:

第(1)行左侧是损失函数 L(w) 相对于 w 的导数的符号。“ 这个符号反映了一个事实,即 w 是一个变量的向量,而不是单个变量,所以我们在偏导数的世界里。“偏导数”是指每个导数都与向量 w 中的单个变量相关,从而产生 p 偏导数,其中 pw 向量的长度。我们将在本文后面更清楚地看到这一点。

线(2)插入 L(w) 的定义。

第(3)行应用向量微分规则来计算导数。将这个导数设为 0,我们就得到了正规方程。

为了求解法线方程,我们做:

让我们用名字 wₒₚₜ 来指代使法线方程成立的 w 的值,换句话说:当 w 取值 wₒₚₜ=(XᵀX)⁻ XᵀY 时,法线方程的左侧计算结果为 0。所以我写 w 时,指的是未知模型参数的向量;而当我写 wₒₚₜ 的时候,我指的是 w 可以取的值,让正规方程成立:

注意在 wₒₚₜ、的表达式中,你不能用规则(xᵀx)⁻=x⁻(xᵀ)⁻来简化 (XᵀX)⁻ ,因为 X 通常不是一个方阵。只有方阵才有逆。例如,如果有 n=10 个数据点,并且 p=2 个特征, X 的形状为 10×2;它不是一个正方形矩阵。

向量微分

我认为以上所有的步骤都很简单,除了我们应用向量微分法则来推导正规方程的那一步。我可以背出 ∂(wᵀw) = 2w 这样的向量微分法则,但结果似乎还是很神秘。

它看起来很神秘,因为使用了线性代数中引入的向量微分规则。这些规则提供了一定程度的抽象。一方面,它们允许你以简洁的方式写下冗长的表达;但另一方面,它们阻止你立即看到计算是如何进行的。

我们应该理解所有这些向量符号和线性代数规则只是为了记账。如果展开所有向量并应用非向量版本的微分规则,向量微分的结果应该是相同的。如果你想知道这是如何解正规方程的,请查阅本文的附录。

求解正规方程是对线性回归模型进行参数学习的一种方法。存在其他方法。这里是关于如何通过另一种方法——随机梯度下降法找到线性回归参数值的好读物。

最小二乘公式中的不确定性

直到现在,我们的线性模型 f(x)=x w 都是确定性模型,而不是概率性模型。要看这个:

  • 学习的参数值 wₒₚₜ=(XᵀX)⁻ XᵀY 是确定性的,因为其成分 XY 是给定的训练数据集。 wₒₚₜ 是一个实标量的具体向量。
  • 这个模型ŷ= xwₒₚₜ的预测是确定性的,因为 Xwₒₚₜ 都是确定性的。**

但是这里再次显示的模型拟合总结包括概率指标,如标准误差、置信区间。这是怎么回事?

概率测度与随机变量一起存在

这些概率度量只与随机变量的概念一起存在。因此,为了讨论这些指标,我们需要在我们的模型中引入随机变量。具体地,由于标准推导,置信区间是用于学习的模型参数的。我们需要将学习到的模型参数值从一个标量,如 0.6237 的声望,变成一个随机变量。

在线性模型中引入随机变量

我们按照以下步骤引入随机变量来表示可能的模型参数值:

第一步

引入一个随机变量向量 y=X wₜᵣᵤₑ+ ε ,其中 wₜᵣᵤₑ 代表我们永远不会知道的单一真实模型参数值。不要担心我们不知道 wₜᵣᵤₑ 的值,稍后,我们会估计它。 ε 是均值为零的多元高斯噪声,在每个数据点上是独立的,方差 η。 y 为形状为 n×1 的随机变量向量,其中 n 为训练数据点的个数:

进一步理解 y 的定义:

  • 随机变量向量 y 中的每一项 yᵢ 代表对应的训练数据点 Yᵢ 可能取的值。因此,我们训练数据集中的观察值 Y 向量可以被建模为来自随机变量向量 y 的样本。
  • 在这个随机变量向量中,每一项 yᵢ 被定义为两部分之和: yᵢ=Xᵢ wₜᵣᵤₑ+ εᵢ.**xᵢwₜᵣᵤₑ部分是确定性的,因为 Xᵢwₜᵣᵤₑ 都是具体值。噪声部分 εᵢ 是随机的——是来自高斯分布 N(0,η ) 的一维随机变量。如此定义, yᵢ 也是来自一维高斯分布的随机变量。
  • 来自向量 y 的所有单个随机变量遵循相同的定义模式。我们有 n 个数据点,所以有 n 个独立噪声,它们都有零均值和方差 η
  • 我们可以用一个多元高斯随机变量来更简洁地表示这些 n 独立噪声(但数学上等价): ε~N(0,Iₙ η)。所以 ε 是长度为 n 的随机变量向量, Iₙn×n 的单位矩阵。 Iₙ η 中的 η 部分表示 ε 中各单个随机变量的方差为ηIₙ 部分表示所有这些单个随机变量都是独立的。
  • 另一种写法 y=X wₜᵣᵤₑ+ εy ~ N(X wₜᵣᵤₑ,Iₙ η)。

第二步

我们已经解出了得到 wₒₚₜ=(XᵀX)⁻ XᵀY. 的正规方程,这是理解这个公式的另一种方式:

  • 揭示了具体值 Y 通过变换矩阵 (XᵀX)⁻ Xᵀ,)线性变换为 wₒₚₜ.注意 wₒₚₜ 与我们在步骤 1 中介绍的 wₜᵣᵤₑ 不同。 wₜᵣᵤₑ 是我们永远不会知道的真实系数的符号。 wₒₚₜ 当使用最小二乘法作为估计方法时,我们对 wₜᵣᵤₑ 的估计(或学习参数值)。
  • 既然现在我们将 Y 建模为来自随机变量向量 y 的样本,该向量具有分布 N(X wₜᵣᵤₑ,Iₙ η ) ,我们可以将wₒₚₜ=(xᵀx)⁻xᵀy建模为来自新的随机变量向量 ŵ ,定义为 ŵ=(XᵀX)⁻ Xᵀ y. 没错,随机变量向量ŵ**
  • 从结构上看, ŵ 是由 (XᵀX)⁻ Xᵀy 的线性变换,正如 wₒₚₜ 是由 Y. 而来,甚至 ŵ 也是由 y、的线性变换,请注意 wp×1 的形状,而

作为一个随机变量向量, ŵ=(XᵀX)⁻ Xᵀ y 代表我们的线性回归模型的参数的所有可能值及其概率密度。我们使用 ŵ 的概率密度函数,我们将在后面推导,来谈论我们的线性回归模型中的参数的那些概率概念,如标准差、置信区间。

ŵ,“学习参数值的分布”是什么意思?

理解我们引入 ŵ 来表示学习参数值的分布是很重要的。但是短语“学习参数值的分布”是什么意思呢?

理解这个短语的最好方法是提醒我们自己,我们假设有一个单真参数值 wₜᵣᵤₑ** 。并且我们想要通过从线性模型xt14】wₜᵣᵤₑ的透镜来查看训练数据集 (X,Y) 来弄清楚 wₜᵣᵤₑ 是什么。这适用于以下情况:**

  1. 观察值 Y 确实是使用公式xt22】wₜᵣᵤₑ从 X 生成的。
  2. 当我们对 Y 的测量确实精确时。

然后我们可以通过解正规方程来计算出 wₜᵣᵤₑ 的值。

作为建模者,我们可以挑战上述两个条件。

我们可以挑战第一个条件,说 XY 之间的线性关系不正确,反而应该是指数关系。这很好,它将我们引向一个模型选择问题——我们到底应该考虑线性模型吗?或者我们应该考虑指数模型,或者神经网络,或者决策树?这个题目我再写一篇。现在,让我们保持线性。

我们可以挑战第二个条件,说由于一些测量上的困难,测得的观测值 Y 并不严格等于 X wₜᵣᵤₑ.取而代之的是被具有零均值的高斯噪声 ε 破坏的 X wₜᵣᵤₑ一种等价的说法是 Y 现在是随机变量 y 的一个样本,它被定义为 y~ N(X wₜᵣᵤₑ,Iₙ η)。这就是我们在这篇文章中所做的。

根据其定义 Y 是来自随机变量向量 y 的样本,我们必须将训练数据集中的具体观察值 Y 视为随机过程的结果——我们必须承认,下次采样时,我们将获得一组不同的观察值 Y (我说不同的组是因为 Y 是具有 n 标量的具体向量)。

由于学习到的参数值 (XᵀX)⁻ XᵀY 是从 Y 计算出来的,而 Y 因为来自于 y 所以现在具有随机性,所以学习到的参数值变成了一个随机变量。我们用 ŵ 来表示这个随机变量向量,定义为 ŵ=(XᵀX)⁻ Xᵀy. 根据定义,一个随机变量代表一个值的分布(具有不同的概率密度),因此短语“ ŵ 代表学习参数值的分布”。

推导出 ŵ 的概率密度函数

要谈概率性如 ŵ 的标准差,我们需要导出它的概率密度函数。推导很简单:

  1. 因为随机变量向量 y 定义为 y=X wₜᵣᵤₑ+ ε。ε 是多元高斯随机变量 ε~N(0,Iₙ η )y 也是多元高斯随机变量: y ~ N(X wₜᵣᵤₑ,Iₙ η)。我们只需要将平均值从 0 移动到 X wₜᵣᵤₑ.
  2. 由于根据多元高斯线性变换规则, ŵ 被定义为 y : ŵ=(XᵀX)⁻ Xᵀ y,的线性变换, ŵ 也是多元高斯随机变量,规则告诉我们 ŵ 的概率密度函数是什么。

多元高斯线性变换规则

这个规则在机器学习里很多地方都会弹出来,比如卡尔曼滤波高斯过程,所以请大家用心记住。形式上,它说:

用英文说,如果一个多元高斯随机变量 a 有一个已知的概率密度函数,随机变量 b 是由 a 经变换矩阵 A 的线性变换,那么 b 就是与 a 形状相同的多元高斯随机变量。并且 b 的概率密度函数具有上述固定形式,即从 a 的分布中提及均值、协方差矩阵,以及变换矩阵 A

对于 ŵ ,我们有 :

对于ŵ.来说,这是一个非常长的概率密度函数幸运的是,我们可以大大简化它:

第(2)至(3)行简化了平均分量。第(4)~(7)行简化了协方差矩阵分量。需要注意的一点是从第(6)行到第(7)行的简化是有效的,因为 (XᵀX)⁻ 是一个对称矩阵,它自己转置它。

从第(7)行我们注意到, ŵ 的平均值是真正的参数值 wₜᵣᵤₑ ,换句话说, ŵ 是**wₜᵣᵤₑ.的无偏估计量****

估计 ŵ 的概率密度函数中的未知量

简化的概率密度函数, ŵ~N(wₜᵣᵤₑ,**(xᵀx)η)有两个未知数, wₜᵣᵤₑη 。在使用这个概率密度函数来报告概率度量之前,我们需要给它们具体的值。

  • 对于 wₜᵣᵤₑ,我们用 wₒₚₜ=(XᵀX)⁻ XᵀY.
  • 对于 η,我们使用以下公式,其中ŷ= xwₒₚₜ是来自我们的线性回归模型的样本内预测:

估计为wₜᵣᵤₑt35】**

我们先来理解一下为什么可以用 wₒₚₜ=(XᵀX)⁻ XᵀY 来估算 wₜᵣᵤₑ.从导出的 ŵ~N(wₜᵣᵤₑ、**【xᵀx】η)的概率密度函数可知 ŵwₜᵣᵤₑ.的无偏估计量因此,如果我们从这个分布中抽取无限数量的样本,这些样本的平均值(或期望值)将等于 wₜᵣᵤₑ.换句话说,我们可以用样本的期望从 ŵ估计wₜᵣᵤₑ.

实际上,我们不能从这个分布中抽取无限的样本。其实我们只有一个样本,那就是 wₒₚₜ=(XᵀX)⁻ XᵀY ,它的平均值就是它自己。

首先,你可能会问为什么 wₒₚₜŵ 分布的样本?这是

因为:

  • ŵ 定义为线性变换,用变换矩阵 (XᵀX)⁻ Xᵀ从随机变量 y.**
  • Y 是来自 y. 的样本
  • wₒₚₜ是通过对样本应用相同的变换而定义的

那么你可能会问,我们应该用 ŵ 分布的无限个样本的平均值来估计 wₜᵣᵤₑ ,但是我们只有一个样本。这样可以吗?嗯,不太理想,但我们只有这些了。

估计为η**

现在让我们来理解对 η 的估计:

η 是观测噪声随机变量的方差 ε~N(0,Iₙ η)。我们不直接观察噪音。相反,我们只从随机变量 y=X wₜᵣᵤₑ+ ε中观察到一个样本 Y根据定义, y 的方差等于噪声 ε 的方差,因为 y 中唯一的随机分量来自噪声。在 y 的定义中的 X wₜᵣᵤₑ 分量只是移动了 y 的平均值,而不是它的方差**

y 是包含 n 个随机变量的随机变量向量:

  • 这些随机变量的平均值,即 X wₜᵣᵤₑ,我们用ŷ=xt30】wₒₚₜ.来估计
  • 我们知道 y 的一个样本,那就是 Y 。这个观察 y 不等于ŷ.换句话说,拟合的线不会通过所有的观测值。我们使用引入的噪声分量来解释这些偏差——我们的模型接受实际观测值 Y 不等于其均值预测值xt42】wₒₚₜ因为在模型中,观测值 Y 只是来自高斯分布 N(X wₜᵣᵤₑ,Iₙ η ) 的样本,在我们插入均值估计值后,它变成了n(ŷ,Iₙ η )* 。样本不需要等于该分布的平均值样本 y 与均值相差多少由噪声方差 Iₙ η决定。*
  • 所以y-ŷ可以被看作是噪声的观测值。y-ŷ是一个长度为 n 的向量,代表噪声部分,每次观测一个。根据定义我们知道,所有这些噪声随机变量的均值为零,它们彼此独立,并且具有相同的方差 η

由于所有这些 n 噪声共享相同的方差值 η ,我们可以这样想:我们有一个单一的随机变量,它的均值为零,我们也有这个随机变量n 个样本y-ŷ我们要估计这个随机变量的方差,也就是 η。回忆一下从样本中计算随机变量方差的公式(来自 wiki ):

在我们的例子中,我们有一些类似的东西,其中y-ŷ是样本,0 是平均值。(y-ŷ-0)ᵀ(y-ŷ-0)为平方部分,简化为(y-ŷ)ᵀ(y-ŷ)),所以估算 η 的公式(再次)为:

需要规格化器 1/(n-p-1) 来将结果转化为噪声方差的无偏估计量——还记得在估计样本总体方差时为什么我们使用 n-1 而不是 n 的讨论吗?这是同样的论点,部分 -p 反映了我们使用 p 特征来预测ŷ.的事实这导致了 p 自由度的减少。

ŵ 完全指定概率密度函数

随着 wₜᵣᵤₑη 的估计,最终的、完全指定的 ŵ 的概率密度函数为:

在我们插入 wₒₚₜ=(XᵀX)⁻ XᵀY 后,我们有一个学习模型参数 ŵ 的可评估(没有未知数)概率密度函数。我们可以使用它来报告学习参数值的那些概率度量。

随着ŵ完全指定的概率密度函数的推导,我们终于可以理解这些概率度量是如何计算的。

的标准误差(或标准差)

汇总表中的标准误差栏报告了 ŵ.中每个随机变量的标准偏差

ŵ 的分布,也就是多元高斯我们得到随机变量向量ŵ—【var(ŵ】=(xᵀx)η的协方差矩阵。是一个 p×p 矩阵每个随机变量的方差在这个矩阵的主对角线上。所以每个随机变量的标准差就是那些主对角线元素的平方根。**

ŵ的置信区间t69】

现在来说说 ŵ 的置信区间,重点介绍如下:

列名[0.025,0.975]定义了系数值的 95%范围—系数值的真实值有 95%的可能性位于该区间内。

由于 ŵ 是一个多变量高斯随机变量,每个单个随机变量的置信区间,如声望,在 ŵ 只是偏离其均值的一些标准偏差(上下)。[0.025,0.975]范围对应于偏离平均值 2 个标准偏差,因为我们讨论的是高斯分布。**

为了报告突出显示的置信区间,我们需要找到学习参数值的平均值和标准偏差:

  • 我们用 wₒₚₜ 来估计 ŵ 的均值,并在系数栏中报告。**
  • ŵ 中每个单变量随机变量的标准偏差已经在标准误差列中。这是因为多元高斯边缘化规则**

特征重要性

现在,让我们了解与功能重要性相关的列,如下所示:

有两个相关的指标 tP > |t|。P>| t |度量对 t 度量的假设检验。

P > |t| 度量报告模型参数值为 0 的概率,不管 coef 列中报告的是什么。P > |t|度量的高值表示该特征的系数可能为 0,因此它对预测目标变量 Y 没有贡献。

从上面的汇总表中可以看出:

  • 对于特征声望,P > |t| 列报告有 0%的概率声望的系数为 0。换句话说,很有可能声望特征有助于预测目标变量。**
  • 对于特征教育*P>| t |列报告有 80%的可能性教育的系数为 0。换句话说,教育功能不太可能有助于预测目标变量。***

为了计算这个 0%或 80%的概率,我们需要引入 t 统计量。

t 统计量

对于 ŵ 中的第 j 个随机变量,我们表示为 ŵⱼ,我们从 ŵ 的概率密度函数中得到这个随机变量的均值和标准差:**

  • 平均值是平均值向量中的第条目。让我们用 μⱼ、来表示平均值,这是一个特性的报告系数值——0.6237 表示声望,0.0323 表示教育。****
  • 标准差是协方差矩阵主对角线中第 j 个项的平方根。让我们用 ηⱼ 来表示标准偏差,这是一个特性的报告标准误差值——0.125 表示声望,0.132 表示教育

那么第 j 个特征 tⱼ 的 t 统计量为

该统计测量估计参数 ŵⱼ 的平均值 μⱼ 到平均值 0 之间的归一化距离。该距离按分母中的标准偏差进行缩放。汇总表中的 t 栏报告该 tⱼ 数量。事实上, t 统计量是一个缩放的距离(也称为无标度度量),这一点很重要,它使得不同特征的 t 统计量具有可比性。

**P>| t |公制

由于 tⱼ 统计被缩放,我们可以使用单位高斯概率密度函数来研究它。从现在开始,让我们使用 t 而不是 tⱼ 来与汇总表中的度量名称保持一致。

P > |t| 指标报告单位高斯分布中两条阴影线的累积概率。这是[-∞,-t]和[t,+∞]中的紫色阴影区域,加在一起:

我们要问的问题是:如果一个特征的系数确实为零,那么(从单位高斯分布来看)具有由[-∞,-t]和[t,+∞]定义的两个尾部的概率是多少。

t-统计量越大(如果t-统计量为负,则越小),从-t 和 t 开始的两个尾部越小,因此计算出的t-统计量越不可能来自均值为零的单位高斯分布。**

所以,如果我们看到一个具有大的 t 统计量的特征,我们就更确定那个特征的报告系数确实不为零。或者等价地,该特征更可能有助于预测目标变量,因此它更重要。

你可能会问,为什么我们把 P > |t| 度量定义为两个尾部的累积概率,而不是只看 t 位置的概率密度?这是因为我们想要报告一个概率,根据定义,概率是概率密度函数曲线下一系列值的面积。如果我们只看 t 位置,概率为 0,因为单位高斯是连续分布。

你可能还会问,为什么我们测量两条尾巴的面积而不是一条?我们使用双尾,因为我们正在进行一个双尾假设检验,其零假设是 t 统计量来自一个单位高斯分布。我们使用双尾假设检验,因为我们有兴趣知道计算出的t-统计量和零之间是否存在差异(或者是正的,由一个尾捕捉,或者是负的,由另一个尾捕捉)。

您可能会进一步问,我可以使用单尾假设检验来报告特性的重要性吗?是的,你可以,只是 OLS 班报告了一个双尾假设检验结果。

结论

本文解释了如何将随机变量引入确定性最小二乘线性回归模型,以推断学习到的模型参数值的不确定性。我们使用随机变量,因为不确定性度量,如置信区间,只存在于随机变量中。

除了最小二乘法,线性回归还有其他公式,如完全贝叶斯公式、最大似然公式(MLE)和最大后验公式(MAP)公式。这些方法对不确定性有更自然推理方式。我将在以后的文章中介绍它们。

支持我

如果你喜欢我的故事,如果你考虑通过这个链接成为一名灵媒会员来支持我,我将不胜感激:https://jasonweiyi.medium.com/membership

我会继续写这些故事。

附录:法线方程的梯度

让我们用一个例子来推导法线方程,其中我们有三个数据点,并且 w 是一个二维向量。形式上:

在上面:

  • 【x₁=[x₁₁、x₁₂】【x₂=[x₂₁、x₂₂】【x₃=[x₃₁、x₃₂】。它们是 2×1 行向量**
  • X₁₁、X₁₂、X₂₁、X₂₂、X₃₁、X₃₂ 是标量**
  • Y ,Y ,Y 都是标量
  • w₁w₂ 都是标量变量。

下面我们进一步介绍一下向量 U :

其中 U₁、U₂、U₃ 都是标量根据他们对 Uᵢ=Yᵢ-Xᵢ w. 的定义可以清楚的看到 Uw 的函数。这为应用链式法则计算 L(w) 相对于 w 的导数铺平了道路。

现在让我们推导正常方程(再次显示):

线(1)是损失函数 L(w) 相对于模型参数 w 的导数的符号。

线(2)插在 L(w) 的定义中。

第(3)行使用 U 简化公式,并应用微分中的链式法则将整个导数分成两部分。

让我们分别关注这两个部分。

第一部分首先:

第(1)行是第一项。

第(2)行用基于元素的定义替换了向量 U

第(3)行对分子应用点积运算。

第(4)行明确写下了偏导数的定义——计算每个变量的导数,分别是 U₁、按照约定将这三个导数组织成一行。

第(5)行应用求导规则。

第(6)行插入 u₁、U₂ 和 u₃.的定义

第(7)行使用向量符号来简化公式。这给了我们一个接近正态方程中团队的项。

现在我们研究第二个术语:

第(1)行是第二项。

第(2)行扩展了 Uw 的元素式定义。

第(3)行应用向量偏导数规则,遵循行越过 U 列越过 w 的约定

第(4)行扩展了 U 的定义。

第(5)行计算导数。

Lien (6)使用向量符号简化了公式。

现在我们可以将这两项相乘:

注意,在第(5)行,我们有一个行向量——记住,当我们做 ∂w 时,我们遵循惯例,在一个行向量中写下关于 w 的每个元素的偏导数。为了把 ∂L(w)/∂w 变成一个列向量,我们转置它得到法线方程 -2Xᵀ(Y-X w) 的左手边大小,我们也可以 drop -2,因为我们有一个方程

AI 从何说起?

原文:https://towardsdatascience.com/where-do-i-start-with-ai-c2769c61fcde?source=collection_archive---------46-----------------------

进入人工智能的世界

在过去 7 年多的时间里,我与许多希望踏上第一次人工智能之旅的领导者一起工作。他们中的大多数人不知道如何或从哪里开始。一些人认为他们做到了。为了让你的企业实现使用人工智能的可能收益,你需要确保你在正确的道路上开始你的旅程。以下是开始旅行时需要考虑的一些关键事项…

弗拉德·巴加西安在 Unsplash 拍摄的照片

目标

你需要能够清楚地阐明你的最终目标是什么。如果你不能做到这一点,那么你还没有准备好真正开始旅程。你的目标不应该是“我要跑一个 AI 项目”。这太模糊了,不是结果或结果驱动的。这是一个危险信号,而且往往是失败的原因。

明确的目标也可以是不同层次的。一个有针对性的,但有点高的目标可以是“我想改善客户体验”。总体结果是明确的——“改善客户体验”,但在没有目标维度的意义上,它仍然是模糊的。一个更具体的目标是“我想改善呼叫中心的客户体验”。一个非常具体的目标是“我想通过减少呼叫处理时间来改善呼叫中心的客户体验”。你能得到的越具体,你在下游就越有利。

同样,试图在没有清晰愿景和目标的情况下使用人工智能启动一个项目,可能不会给你带来最佳结果。不要为了“做”而试图实现 AI。带着明确的目标开始旅程。

确定优化领域

下一步是确定痛点在哪里。在本例中,您将看到端到端的客户体验。您将确定什么是最佳的和非最佳的、现状和目标场景、涉及的参与者等等。这可以通过设计思考会议来实现——我不会在这里讨论这个话题。有很多讨论和解释设计思维的在线资源。IBM 有一个非凡的设计思维项目来帮助客户开始他们的旅程。

让我们假设您已经完成了设计思考会议,并且已经确定了这些领域。在这个环节中,你还将确定优化这些领域的人工智能能力。例如,实现对话式人工智能助理将帮助您的呼叫中心代理更快地获得问题的答案,这将减少呼叫处理时间。始终首先确定优化的用例/领域,然后用技术来解决它。不要做相反的事情!

一个重大决定

您还需要决定如何处理实现。这里有几种选择。

1 —建立自己的人工智能实践,开发自己的人工智能技术

这通常需要最多的时间和投资。作为一名领导者,你需要评估许多事情,例如:你内部是否拥有现有的人工智能技能?如果没有,你将如何获得它们?你有什么技术可以开始使用?与你的时间表相比,这需要多长时间?这会带来最好的结果吗?这是否符合我们公司的战略和愿景?到 2021 年,有许多公司已经拥有成熟的人工智能平台。你需要评估是否有必要为自己的目的重新发明轮子。

2-使用现有的人工智能供应商平台建立自己的人工智能实践

在这里,你在另一个人工智能供应商的平台上提升员工的技能,如 IBM Watson 或微软人工智能。在这种情况下,你更大的投资是在你自己的员工知识上。这里的好处是你不需要开发人工智能技术——只需要学习如何使用它。在本例中,您的员工将定制虚拟助手,以满足您的用例。例如,使用 IBM Watson Assistant(一个人工智能支持的虚拟助手),您可以利用现有的云服务 API(通过 SaaS 模型)。你也可以在 Azure、AWS 或 GCP 上部署 Watson,或者你也可以选择在本地部署 Watson。无论哪种情况,您的团队都可以专注于构建虚拟助手来满足您的用例。他们不需要担心开发或维护人工智能服务本身。

3 —聘请专业服务人员为您实施

作为一名领导者,有些情况下你根本没有时间或人手去执行选项 1 或 2。人工智能也可能令人生畏,这取决于你的技能组合。您可以选择雇佣专业服务人员来为您实现虚拟助理。在这里,你仍然利用市场上现有的人工智能平台,但你将雇佣一家公司来定制助手,以适应你的用例。这应该会让你安心一些,因为你已经雇佣了专业人士。他们将指导实施的每一步。您的主要参与将是向实现团队提供领域主题专业知识。

4-建立自己的人工智能实践并雇佣专业服务

这是上述选项 2 和 3 的混合模式。您可以聘请专业服务来指导实施,同时您的内部团队与专业人员一起提升技能。这种方法有很多好处。最大的好处是,你可以在训练自己的员工自给自足的同时,获得所需的专业帮助。在这里,你在提升团队技能的同时,平衡了虚拟助理的主要项目成果。你正在同时完成两个主要目标。

当你做出选择时,有许多方面需要考虑。你需要评估预算、时间表、策略、员工等。你也可以用不同的方式开始你的旅程。例如,您可以从第一个版本的选项 3 开始,然后转到第二个版本的选项 4。理想情况下,你想选择一个策略,并努力坚持下去,以实现价值最大化。

最后

底线是你需要确保你出于正确的原因开始你的人工智能之旅,有可量化的目标,有意义的业务成果和正确的实施计划。如果你不确定,寻求专业帮助。还有许多在线资源可以帮助你学习人工智能,让你免费动手操作,比如 IBM Watson services。

马克IBM 沃森人工智能战略合作组织的首席技术官。当不领导 IBM 合作伙伴的技术战略和愿景时,Marc 喜欢做 DJ、玩视频游戏和摔跤。

易贝在人工智能上的对错:你衡量的东西很重要

原文:https://towardsdatascience.com/where-ebay-went-right-and-wrong-with-ai-what-you-measure-matters-2322dacc9320?source=collection_archive---------40-----------------------

了解人工智能需要付出努力,而且这是值得的

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

以下改编自真实世界 AI。

我在 2006 年加入易贝,在 2009 年,公司的情况非常糟糕。其股价处于历史低点,远低于近 24 美元的历史高点;它在削减成本,负增长,市场份额在萎缩,技术团队没有能力创新。

简而言之,公司陷入了严重的困境。

他们扭转了局面,这主要归功于对技术的投资。特别是,该公司开始了使用技术、数据和人工智能来推动业务的旅程。我很幸运地加入并建立了搜索科学团队,这是首批利用机器学习来优化买家体验并帮助他们在易贝网站上更容易找到所需商品的团队之一。

我们开始建立一个人工智能模型,以改善客户体验并推动收入,但我们在第一次尝试时并没有做到完美。通常,对于人工智能,事情在变好之前就变坏了。作为一名企业所有者或决策者,或者作为一名工程师或数据科学家,理解为什么人工智能模型可能不会像预期的那样工作很重要,这样你就可以修复它,更有效地使用人工智能。

建造我们的第一个模型

因为我们想增加收入,当我们第一次开始构建我们的人工智能模型时,我们的团队专注于增加每次会话的购买量:买家在一次用户会话中购买的平均商品数量。

考虑到这个目标,我们的人工智能模型强调销售(一件商品销售了多少次)而不是印象(一件商品被浏览了多少次),较便宜的商品比昂贵的商品销售得更频繁,排名高于其他商品。

我们尝试了不同的机器学习模型——重写买家查询的模型,生成用于排名模型的特征的模型,以及对最终搜索结果进行排名的模型。然后,我们运行了一系列 A/B 测试来评估模型结果,取得了巨大的成功。许多模型证明了购买者的转变已经增加。其他团队受到这些成功的激励,开始努力增加每次会议的购买量。

一切看起来都很美好。也就是说,直到财务团队发现这些 A/B 测试的胜利并没有转化为收入的增加。

工作模式不一定是盈利模式

我们在某个地方走错了路,我们需要一个解决方案——要快。在公司一分钱都输不起的时候,我们损害了公司的收入。

我们深入挖掘了不同查询的搜索结果,发现了一个有趣的现象:我们经常将附属物品排在最上面。例如,当买家搜索“iPhone”一词时,许多 iPhone 手机壳会排在结果的顶部虽然这些配件在网站上很受欢迎,但它们并不是用户一直在搜索的,所以这就造成了我们所说的“配件污染”,并导致了糟糕的用户体验。

啊哈!我们已经找到了收入下降的原因;一个 10 美元的 iPhone 手机壳比一个 300 美元的 iPhone 少得多。我们的模型推荐了不太贵的配件,而它应该推荐价格更高的手机。

我们的模型完全按照我们构建的那样工作,但是我们构建它是为了做错误的事情。

选择正确的测量方法

很多时候,成功取决于你选择衡量什么。

当我们开始我们的旅程时,技术团队将不同的目标统一成一个单一的目标,专注于增加销售。说你的唯一目标是卖出更多,这是一个非常以客户为中心的选择,但这是卖家和买家想要的,也是我们最终获得报酬要做的。

经过多轮讨论后,我们开始通过每次会话的购买量来衡量成功与否。我们的人工智能模型成功实现了目标,但创造了糟糕的用户体验,未能实现业务增长。我们需要找到一种不同的人工智能模型的新解决方案,更重要的是,一种新的方法来衡量人工智能模型的成功。显然,“每次购买”在我们的人工智能模型和团队中产生了错误的动机。

教训是显而易见的:小心选择正确的度量,因为它将告知你的人工智能的方向。

后来,我们将价格相关信号纳入模型,解决了“配件污染”问题。更重要的是,我们将每次会议的购买量改为每次会议的商品总值(GMV)。有了这些改变,我们不仅有了一个工作模式,而且有了一个盈利模式。

人工智能需要工作,但很值得

一旦我们的团队向整个公司展示了机器学习和数据的强大,更多的团队开始利用人工智能作为业务增长的动力。这最终对收入产生了巨大影响,并帮助公司实现了惊人的转变。

到 2012 年,易贝的股价上涨了 65%,该公司实现了约 1750 亿美元的电子商务——约占全球电子商务的 19%,占全球零售市场的近 2%。

如果易贝没有拥抱人工智能,该公司现在可能会在一个非常不同的地方。今天,错过人工智能的机会就意味着失去你所在行业的竞争优势。

解决人工智能可能会感觉势不可挡,过于技术性,但重要的是要记住这是一个过程。第一次尝试你可能不会做对,但是如果你从错误中学习——并努力衡量正确的事情——你就可以构建具有真正影响力的强大工具。

关于构建有效的、以商业为中心的人工智能的更多建议,你可以在亚马逊上找到真实世界的人工智能。

Wilson Pang 于 2018 年 11 月加入阿彭,担任 CTO,负责公司的产品和技术。Wilson 在软件工程和数据科学领域拥有超过 19 年的经验。在加入阿彭之前,Wilson 是携程中国的首席数据官,他带领数据工程师、分析师、数据产品经理和科学家改善用户体验,提高运营效率,从而推动业务发展。在此之前,他是加州易贝的高级工程总监,也是 IBM 的架构师,为各种客户构建技术解决方案。Wilson 在中国浙江大学获得了电子工程硕士和学士学位。

Alyssa Rochwerger 是一位以客户为导向的产品领导者,致力于打造为现实生活中的人们解决难题的产品。她乐于将对顾客产生积极影响的产品推向市场。她在将产品从概念扩展到大规模投资回报方面的经验已经在初创公司和大型企业中得到证明。她在机器学习组织中担任过许多产品领导职务。她曾担任 Figure Figure(被阿彭收购)的产品副总裁,阿彭的人工智能和数据副总裁,以及 IBM Watson 的产品总监。目前,她担任加州蓝盾公司的产品总监,在这里,她愉快地被大量的数据、许多难题以及产生积极影响的机会所包围。Alyssa 在加利福尼亚州旧金山出生和长大,拥有三一学院美国研究学士学位。

“隐私第一”失败的地方

原文:https://towardsdatascience.com/where-privacy-first-fails-ec24fe47a678?source=collection_archive---------39-----------------------

数据最小化、粒度和分散处理的挑战

“我们是一家隐私至上的公司”。今天你经常听到这句话。“我们根据设计原则使用隐私”。“我们实行数据最小化”。这些都是善意的声明,并且通常它们的实现也是完全正确的,但是这种方法经常会留下一些问题,如数据完整性的损失或缺乏真正的去身份验证,这导致“隐私第一”失败。让我们将这些概念分解,并探索一些替代方案。

为了本文的目的,让我们使用一个疲劳应用程序的实际用例。这个疲劳应用程序使用 24 小时的时间序列心率数据,从中生成一个疲劳分数。该疲劳分数可用于管理例如驾驶员的疲劳,以降低事故。

雅罗斯拉夫·德维亚Unsplash 上拍摄的照片

“我们匿名处理所有数据”

好的。所以我们来考虑一下这个。你有可穿戴数据,例如你的个人客户的活动数据。您可以去掉个人身份信息等唯一标识符,用假名“Mary Adams”称呼用户,但这对于属性级别意味着什么呢?

作为一个例子,考虑这个完全合理的输出,它实际上是完全合成的。

{“data”: {
“person”: {
“sex”: “Female”,
“device”: “Android”
},“deviceLocation”: {
“coordinates”: {
“latitude”: 51.5072682,
“longitude”: -0.1657303
},“altitude”: 16,
“accuracy”: 95,
“verticalAccuracy”: 90,
“velocity”: 4
},“activity”: {
“timestamp”: “2021–01–02T23:37:00+00:00”,
“type”: “Sleeping”
},“heartRate”: {
“currentHeartRate”: 58,
“minHeartRate”: 45,
“maxHeartRate”: 83},
 }
 }

你可能把用户名匿名了,但是怎么把 GPS 坐标匿名呢?上面的数据清楚地显示了你的用户睡在哪里。只有这么多的人会花大量的时间在你的家庭住址或工作地址,所以结合这些信息在事后识别这个人(这个过程叫做再识别)真的是幼儿园水平。

《纽约时报》发表了一篇很棒的文章,并附有关于这个话题的例子,展示了匿名位置数据如何能够轻易地识别在最安全的地点工作的军事官员。如果五角大楼不能做到这一点,你会相信你的普通公司吗?

解决方案:让我们删除敏感的数据对象

在清理数据时,可以采取剥离数据对象和属性的方法(通常都是这样做的),比如位置历史,以后很容易重新识别。这似乎是一个解决方案,但是它有明显的缺点:我们丢失了用户和应用程序的有价值的数据。

您的输出如下所示。它的确远没有那么具有侵略性,但也远没有那么丰富。说白了,你把你的“玛丽·亚当斯”丢在地图上了。

{“data”: {
“person”: {
“sex”: “Female”,
“device”: “Android”
},“altitude”: 16,
“accuracy”: 95,
“verticalAccuracy”: 90,
“velocity”: 4
},“activity”: {
“timestamp”: “2021–01–02T23:37:00+00:00”,
“type”: “Sleeping”
},“heartRate”: {
“currentHeartRate”: 58,
“minHeartRate”: 45,
“maxHeartRate”: 83},
 }
 }

等等:现在我们丢失了所有的 GPS 定位数据!对于需要复杂数据集和上下文信息的更复杂的应用程序或用例,删除数据不是最佳解决方案,因此我们可以采取另一种方法来调整数据粒度。

关于数据粒度的一点注记

数据粒度是一个光谱,从绝对、详细的度量开始,一直延伸到没有信息价值的无用抽象。但是,作为一个频谱,您可以上下调整粒度。

作者图片

一组 GPS 坐标是数据的一个极端的很好的例子,非常精确和丰富,而邮政编码仍然是关于位置的信息,但是远没有精确到一个人那么独特。

“deviceLocation”: {
“coordinates”: {
“place": 94105
},

同样的逻辑可以应用于几乎所有的数据对象,您可以在属性级别上创建一个分组,比如收入范围或年龄组。然而,在有些领域,这变得更加二元,如个人是否属于少数群体或报告了收入。这些二进制分组中的一些也可能成为不成比例的信号,例如用户是否有任何疾病或报告的犯罪行为。它们也是强标识符。

考虑到我们的个人疲劳应用,该时间序列数据对于确定疲劳至关重要,以便能够判断过去 24 小时的变化以及心率强度的相对偏差。使用更小粒度的数据(总结过去 24 小时)不会产生有意义或准确的疲劳评分。虽然心率很难与个人联系起来,但降低数据质量不是一个选项。

数据结果不应显示 N<50 的组群

不同的法规和行业有不同的规则。经常使用的一种方法是限制结果群体的大小,以保证去识别。该限制可以是 50 人的群体,在这种情况下,您的算法不能在结果中显示比该群体更小的群体。

然而现实并非如此简单。如果您正在利用位置数据,有多少人有可比较的位置模式呢?然后,您必须将属性抽象或聚合到组中,例如处理邮政编码。但即使这样也不足以保证 N<50。

其他数据点呢,比如健康数据?个体模式要具体得多,尤其是考虑到糖尿病或损伤等情况时。例如,通过简单地记录“条件”是否存在来进行抽象,可能有助于避免小组规模变小。

使用主观属性而非绝对属性

bpm 中的心率等客观属性很容易理解,类似的还有经纬度坐标中的位置。然而,静息心率的±15%的相对心率或距离旧金山 1 条市场街 5 公里的相对位置都是有意义的,但是相对难以从外部联系到特定的个人。

“deviceLocation”: {
“coordinates”: {
“distanceFromHome": 1-5km
},

因此,将数据抽象为主观属性可能很有吸引力,但在管理大型数据集时,这将显著增加开销,而且这也不是微不足道的,因为主观测量的组合将越来越多地集中于特定的个人。

管理组合数据的群组是很棘手的

即使您将基础属性抽象成组,如果有足够的数据点,群体大小也很容易识别。例如,考虑位置历史(抽象到邮政编码级别)和活动数据(抽象到用户是否活动)的时间序列。即使这个相当模糊的数据集也能很容易地创造出小于 50 的人口。

你很容易得到数据最小化的概念。为了实现这些限制数据敏感性的目标,我们限制了数据本身的质量,甚至是我们包含的数据维度,从而潜在地降低了我们可以提供的价值。

使用合成数据集来保证隐私

数据市场中令人兴奋的方法之一是合成数据,它允许开发人员和数据工程师基于真实数据集创建合成数据集,允许数据工程师保留数据隐私。这方面的先驱公司的一个例子是格雷特尔。

这种方法处理数据隐私的一个更基本的方面,即底层数据集可能无法匿名化或剥离个人身份信息。因此,创建一个可比较的(注意:数据完整性问题取决于对正在讨论的用例的理解)合成数据集,是一个概念上有吸引力的选择。

现在这个选项有它的局限性,主要与它实际上适合什么类型的用例并产生足够的结果有关。人们还经常对保持数据的统计完整性持怀疑态度,因为即使稍微修改数据,也可能会失去许多联系和意义。

合成数据可以作为一个起点,但是不能代替与要回答的问题密切相关的真实数据。理解如何生成合成数据取决于对真实数据的理解,这对于每个不同的数据对象和源来说,复杂性增加了几个数量级。

正如一位合作伙伴所说,“我们不喜欢使用合成数据来预测心脏病发作”,强调在健康相关的使用案例中,真实数据是唯一真实的选择。

作为一种选择的分散数据处理

分散数据处理是指在中央服务器之外处理数据,例如在用户自己的设备、计算机、电话或浏览器上。分散处理还可以受益于没有外部共享,这意味着除了用户自己的设备之外没有共享日志。因此,数据和数据的使用属于个人。

在一些个人数据用例中,我们可以观察中央服务器之外的数据处理(“在用户侧”)。由于能够在不从用户处删除数据的情况下处理数据,这也使得关于数据隐私的争论大相径庭。作为一种操作,它是个人优先的,个人自己从数据中获得代理和效用。

默认情况下,分散式应用提供了更多隐私

同样重要的是要记住,并非所有的隐私都来自于数据处理,其中一些来自于更平凡的方面,比如你的用户如何连接到你的应用程序或服务器。无论您如何解构数据,如果您的最终用户通过他们的 IP 地址直接与您通信,匿名性可能会丧失。是的,有 VPN 部分地解决了这个问题,但是,VPN 的使用远远没有达到正常水平,大多数用户可以通过他们的直接网络连接来识别。

从用户处删除数据需要正当理由

有各种各样的数据工程方法用于处理数据以及在节点上部署和训练算法,例如联邦学习。假设可以在用户侧以分散的方式处理高清晰度数据,将数据从用户传输到集中的服务器需要证明,这不仅是因为这不可避免地使用户暴露于更大的风险,而且由于隐私和伦理问题,还需要降低数据粒度。

我们已经在各种论坛上讨论过数据工程,例如在 Liberty Equality Data 播客上与 Privacy By Design 的发明者 Ann Cavoukian 博士讨论,我们经常得出这样的结论:存在许多方法,默认采用集中处理可能只是因为不熟悉。

对于我们的疲劳应用程序,我们打印出一个绿灯/红灯类型的结果(是否太累),根据用户的疲劳分数显示给用户。然而,利用过去 24 小时的时间序列心率数据,我们不仅可以确定疲劳,还可以确定酒精和物质的使用。

共享绿灯/红灯类型的结果有效地共享了个人的疲劳分数。然而,共享整个数据集(时间序列心率数据)也会暴露嵌入到结果中的其他因素,例如饮酒。

这意味着远离用户传输原始数据可能会给双方带来额外的风险,而疲劳评分或红灯或绿灯系统的最终结果可以在不泄露底层数据的情况下交付。

复杂的应用需要数据完整性

当然,我们不能得出一种方法适合所有用例的结论。

复杂的应用程序依赖于高清晰度的上下文数据可用性,剥离敏感数据可能会破坏整体数据的完整性。对合成数据集进行数据工程以获得初始假设集,对于某些用例以及构建模型来说是一个非常有价值的选择,但是它不能替代真实数据。当部署模型或启动应用程序时,通过限制共享,能够采取不同的方法来利用数据,这具有巨大的适用性。

疫情之后我应该在哪里吃饭?(第 1/2 部分)

原文:https://towardsdatascience.com/where-should-i-eat-after-the-pandemic-895731933841?source=collection_archive---------44-----------------------

使用变压器进行基于方面的情感分析进行决策。

我们以前都遇到过这种情况:查找我们感兴趣的新产品或我们想尝试的餐馆的评论。我们从一篇评论到下一篇评论收集信息,每篇评论都更精确地再现了产品。我们不停地翻啊翻,突然一个小时过去了,而我们并没有比以前更接近答案。我们意识到这是一种徒劳的努力,我们将无休止地寻找决定如何使用我们辛苦赚来的钱的决定性因素。那么,在本教程中,我将使用基于方面的情感分析(ABSA)来解决这个西西弗式的任务。花更少的时间筛选评论,花更多的时间享受产品或服务。我们开始吧!

Unsplash 上由夏月拍摄的照片

介绍

由于疫情,我对旅行和美食有着无法满足的渴望。我没有花时间在网上搜索,而是想弄清楚一旦情况允许,我应该去哪里。通过自动化上述过程,我分析了超过 100 万条评论,以选择最适合我个人偏好的餐厅。在我们进入细节之前,让我们从一个更简单的例子开始。

奥米德·阿明在 Unsplash 上拍摄的照片

例子

我想买无线耳机,我想在 AirPod Pros 和 Powerbeats Pros 之间做出选择。以下是购买前需要考虑的一些特性:音质、舒适度、降噪质量和电池寿命。我为每个组成部分分配了一个重要性权重,并着手梳理评估每个产品表现的评论,以创建一个如下所示的表格:

耳塞比较

方便的是,这些特性和相应的特性评级都在 Amazon 上,所以我不必做自己想出这些值的繁重工作。通过将每个特性评级乘以重要性,并对所有特性求和,我可以得到每个产品的最终得分。例如,对 AirPod Pros 的评估如下所示:

对比最后的分数,我们可以看到 AirPod Pros 击败出局(哈!)Powerbeats Pros。有一个系统的方法来达成我的决定是非凡的,但是有一些实际的问题。例如,这个分析花了我不到 10 分钟的时间,但也是在亚马逊上已经有基于方面的评级的产品之间进行的。由于这些是而不是其他大多数产品容易得到的,我将不得不筛选大量的评论来为每个产品产生基于方面的评级。另一件要考虑的事情是,在这种情况下只有两种产品;以这种方式比较更多的产品会让我 10 分钟的分析变成 2-3 个小时的冗长努力。

那么,我们如何协调我们的系统决策和效率呢?自动化。通过自动化这个过程,我们可以更快地做出决策。下面定义了我们将在其中工作的框架:

由于这一过程适用于任何产品或服务,我决定在 Yelp 数据集中的餐馆中进行尝试。我总是很难决定我想去哪里吃饭,经常花太多时间在 Yelp 上,以至于已经过了晚餐时间。鉴于疫情,现在外出就餐不是一个很好的选择,所以我想在一切结束后找到一个最好的地方吃一顿令人难以置信的饭。不要再拖延了,让我们开始吧!

数据集

首先,让我们导入我们将使用的所有库。

塞姆瓦尔-2014 年

对于教程的这一部分,我们只需要 SemEval-2014 数据集。在 SemEval-2014 数据集中,餐厅的各个方面是食物、服务、价格、氛围和轶事。对于每个方面,只有一个相关的标签:积极、消极、冲突或中立。您可以从我的 GitHub 中检索该数据集;然而,这已经在我们将要构建的预处理函数中考虑到了。

我们所有的数据都准备好了,让我们继续训练吧!

模型

这项任务可以选择几种不同的模型,从基于规则的模型到深度学习。在翻阅文献之后,我看到了一篇利用变形金刚完成 ABSA 任务的论文。作者将 ABSA 任务转换为句子对分类任务,使他们能够使用 BERT 作为他们的模型。下表显示了论文的结果:

来源:转载自“利用 BERT 通过构造辅助句进行基于体的情感分析”,作者:孙,黄,邱,2019,arXiv。

作者对来自transformers库的bert-base-uncased模型进行了微调,报告伯特-对-NLI-M 模型的准确率为 85.1%,伯特-对-QA-B 模型的准确率为 85.9%。由于两者之间的唯一区别是预处理的方法,我选择伯特-对-NLI-M。虽然这不是最高的性能,但它比伯特-对-QA-B 更快。伯特-对-QA-B 模型需要构建 25 个句子来执行评论的全方面分类。相比之下,伯特-对-NLI-M 只需要五个句子,每个句子都是一个单词,就可以完成同样的任务。就我的目的而言,这两个模型之间的精确度差异可以忽略不计。换句话说,精度提高 0.08%不足以保证速度降低 5 倍。

预处理

对于句子对分类任务,该模型将两个句子作为输入,并输出单个标签。我们把感兴趣的方面作为第二个输入句子。因此,预处理如下:

预处理示例

为了准备用于训练和评估的数据集,我使用以下代码从我的 GitHub 存储库中加载 SemEval-2014 数据集,并为 PyTorch 准备它:

火车

现在我们已经使用 transformers 结合上面定义的预处理方法将模型的范围缩小到句子对分类,对于我们想要微调的特定模型,我们仍然有几个选项。鉴于最近在用更少的参数逼近 BERT 方面的进展,我想看看这些模型中是否有比 BERT 表现更好的。如果较小的模型可以达到相同或更高的精度,我将能够更快地处理 Yelp 数据集,而不会牺牲性能。以下是变压器库中的模型列表,以及训练时使用的相应超参数:

模型比较

为每个模型设置的时期是验证损失达到平稳状态所需的数量。我将使用以下代码来训练每个模型:

评价

在训练完所有模型后,我根据精确度和马修相关系数(MCC)对每个模型进行评估。可以包括其他指标,如宏观 F1 分数,但 MCC 比其他单一分数指标更能提供信息。关于 MCC 的更多细节,你可以访问它的维基百科页面。在多变量情况下,混淆矩阵用于计算 MCC。

除了质量度量之外,我还将计算每个模型评估测试集所花费的时间。以下是我将用来评估每个模型的代码:

模型比较

从表中我们可以看出,bert-tiny 虽然速度很快,但精度或 MCC 不够高,无法与其他模型相媲美。然而,从其他方面来看,我们可以看到 bert-small 在 88.8%的准确率方面做得非常好,并且比 bert 快大约 7 倍,比 distilbert 快大约 3 倍。有趣的是,在所有显示的指标中,distilbert 的表现略好于 bert,除了 MCC 之外,其表现微不足道。本质上,我们发现在这个任务上,distilbert 总体上比 bert 好,并且快了大约 2 倍!因此,选择真的归结为伯特-小或蒸馏伯特。作为一个主观的决定,我将选择 distilbert,因为我重视精度提高 2.4%,而不是速度降低。下面快速浏览一下 distilbert 的混淆矩阵:

混乱矩阵热图

我们可以看到,该模型很好地预测了无标签和正标签,同时在负标签和中性标签上具有低于标准的性能。然而,冲突标签似乎给这个模型带来了最大的麻烦。这可能很难克服,因为如果句子是矛盾的,就会有积极和消极的情绪嵌入其中。如果没有足够数量的例子来说明一个句子何时是冲突的,那么该模型将不会学习如何区分肯定和否定。然而,我们将继续使用 distilbert。

例子

为了了解我们的分类器是如何做出决策的,让我们看几个例子,看看它是如何执行的,从下面我写的综述开始,然后是模型的分类。

We had a good time at the restaurant.

示例 1

这个例子中的模型是正确的;句子中没有具体关于食物、服务、价格或环境的内容。然而,对于去那里的一次特殊的轶事经历,人们有一种积极的情绪。这个例子很简单,所以我将添加另一个讨论食物的句子。

We had a good time at the restaurant. The food was delicious.

示例 2

在这种情况下,模型正确地将食物分类为好的。然而,它错过了积极的轶事部分的审查。我试着用颠倒的句子运行它,但是分类器犯了同样的错误。

现在,我将添加一些关于该服务的信息。

The waiter we had was horrible, but the food was amazing.

示例 3

这是一个很好的测试例子,因为它在同一个句子中包含了对两个不同类别的积极和消极情绪。该模型正确地识别了两个类别的情感。

最后,我将尝试一个更长的审查,并添加另一个类别。

My girlfriend is still not even speaking to me after I took her on a date here last week. The atmosphere was nice, but the food here was disgusting and the service was even worse. I will never in my life go back to this pizzeria.

实例 4

该模型对所有类别都是正确的,除了轶事,它被认为是负面的。然而,考虑到评论是多个句子,这个模型做得很好。尽管它在这个评论上表现良好,但当评论超过几个句子时,该模型表现不佳。然而,有办法处理这个问题。就我个人而言,我已经对数据集中的所有评论运行了该模型。我采用的方法是使用spacy将评论分成多个句子,对每个句子运行模型,然后通过取平均值将它们聚合回一个输出。如果你准备好了,也试着迈出下一步。然而,由于时间关系,我们不会在这里展示。

结论

现在我们对模型的行为有了更多的了解,是时候探索 Yelp 数据集了!在下一篇文章中,我将深入研究使用 Yelp 数据集来决定在疫情之后去哪里吃饭。

敬请期待!

代号

链接

参考

[1]孙驰,黄,邱希鹏,利用 BERT 通过构造辅助句进行基于体的情感分析(2019)arXiv 预印本 arXiv:1903.09588

疫情之后我应该在哪里吃饭?(第二部分)

原文:https://towardsdatascience.com/where-should-i-eat-after-the-pandemic-part-2-2-3b3498523757?source=collection_archive---------32-----------------------

使用变压器进行基于方面的情感分析进行决策。

在上一篇文章中,我从 SemEval-2014 数据集训练了一个关于 ABSA 任务的模型,并分析了它的性能、速度和行为。本文详细介绍了我如何使用这个模型从 Yelp 数据集中选择一家餐馆就餐。不要再拖延了,让我们开始吧!

Yelp 数据集

我们可以通过两种方式下载 Yelp 数据集:

第一种要求与 Yelp 签署协议,之后数据集可以作为 zip 文件下载。Kaggle 方法需要一个在本地~/设置了用户名和 API 密钥的帐户。kaggle/kaggle.json。以下链接可以帮助您设置 kaggle:

如果你使用 Yelp,你必须下载 zip 文件,然后上传到 Google Colab。然而,如果你使用 Kaggle,你可以避免额外的步骤,直接将数据传输到 Google Colab。对于我自己,我将在本教程中使用 Kaggle 方法。以下代码从 Kaggle 下载数据集:

极性

为了给每篇评论打分,我们需要将每个标签映射到一个极性范围[-1,1]。

极性映射

与其拿分类器的硬分类,不如处理它的软会更有信息量。软分类将提供关于如何评价的正面或负面方面的信息。通过利用模型产生的概率向量和我们上面定义的极性图,我们可以找到一个方面在审查中的预期极性。例如,假设我们向模型中输入一个评论,并沿着食品方面进行评估,得到以下输出:

示例输出

我们没有将食物的极性指定为-1,而是发现这些标签的预期极性如下:

正如我们所看到的,这种方法更加实用,因为我们可以获得正负极性之间的梯度,从而为每个类别呈现更具代表性的情绪。

技巧

在运行我们的算法之前,有一件重要的事情需要注意。数据集中有两个评论来源:reviewstips。提示比评论更紧凑;它们通常只有一句话。这是有帮助的,因为我们的模型的缺点之一是对较大的文本进行分类,正如我们在上一篇文章中看到的。以下是每种类型评论的文本中发现的单词数量的累积分布比较:

分布比较

显然,一个提示的字数比一篇评论的字数少得多。因此,小费将在模型的范围内很好地工作。考虑到这一点,我还将筛选未倒闭且相关小费超过或等于 100 的餐馆。这增加了有足够的信息为每个方面生成评级的可能性。下面的代码将对我们筛选出的所有提示进行批量预测,并将它们写入一个 JSON 文件,以便在下一步中进行处理。

此外,我将为我们的设置添加一个方面:餐厅的总体星级。我不会直接用星,我会考虑每个用户的平均星,做一个调整后的星系统。

在评估评论时,偏见分布是向左倾斜的。也就是说,在适当的 1-5 星评级系统中,人们倾向于给出比预期更多的星。

星级偏差修正

在做了这个修正后,我们现在可以根据我的偏好对每个提示进行个人重要性加权,从而对餐馆进行评分。

结果

运行完上面的代码后,我终于来到了我的餐馆列表🎉。看来我要去唱歌熊猫亚洲餐厅&酒吧用餐了!

结果

在谷歌上搜索了这个地方之后,我非常兴奋,准备在合适的时候尝试一下。看了一眼评论,我只看到了对这个地方的正面评价。以下是我谷歌搜索结果的截图:

来源:谷歌搜索“唱歌熊猫亚洲餐厅&酒吧”

现在我有了结果,我想尝试一些不同的权重。尝试了几种不同的重要性权重配置,我得到了非常相似的答案,这让我质疑结果中有多少变化。为了测试这一点,我从狄利克雷分布中生成了 100,000 个随机重要性权重并进行分析。这是我想到的:

根据这些发现,看起来你们中的很多人可能会和我一起去歌唱熊猫亚洲餐厅&酒吧!显然,对于大多数人来说,使用权重相对相同的方面的警告是,结果可能缺乏多样性。也就是说,有许多方法可以获得更个性化的结果。例如,您可以尝试添加更多方面,或者通过使用数据集业务表中的类别属性,尝试对您想吃的食物类型进行过滤。至于我,我对我的结果很满意,所以我会在我的晚餐时间结束之前停止我的分析😉。

结论

总之,本文的目的是展示如果我们采用机器学习的方法来为我们工作,我们如何利用大量的评论对我们有利。

在这种意见挖掘中可以做的一个改进是开发非特定领域的模型。换句话说,拥有一个框架,在从相应的评论中预测每个特征的极性的同时,衍生出任何产品的特征,将是一个明显的进步。

无论是您应该购买什么样的耳塞、应该穿什么样的鞋,还是应该在什么样的餐厅用餐,基于方面的情感分析都可以为我们节省普通决策所需要的时间和精力,是一个很好的决策工具。本文到此为止,我希望在这个疫情,每个人都保持安全和健康。当一切都结束了,希望你能看到我在亚利桑那州钱德勒的歌唱熊猫亚洲餐厅&酒吧用中国菜填饱我的脸!

下次见!

密码

链接

参考

[1]池孙,黄,邱锡鹏,利用 BERT 构建辅助句进行基于方面的情感分析 (2019), arXiv 预印本 arXiv:1903.09588

机器学习和量子力学之间的对称性改善了模拟

原文:https://towardsdatascience.com/where-symmetries-between-machine-learning-and-quantum-mechanics-improve-simulations-e77e2f4d4d19?source=collection_archive---------29-----------------------

思想和理论

UT 奥斯汀物理学研究生克里斯·罗斯用对称的力量解决奇异的量子问题。

以不直观著称的量子力学定律预言了一系列奇怪的效应。许多奇异的材料,如超导体,具有如此复杂的行为,即使是最强大的计算机也无法处理它们的计算[1]。因此,一些系统必须通过创新的大规模模拟来征服[2]。UT Austin 的研究人员 Chris Roth 开发了一种机器学习算法,使用两种对称来使这个问题更容易处理[3]。首先,他的周期系统在输入结构中找到一个模拟。第二,粒子之间的力方便地服从算法输出的一种依赖性特征。

对称性的概念在物理学中不断出现;它简化了问题,突出了不同属性之间的关系。引用先驱量子物理学家菲利普·安德森的话:“说物理学是对对称性的研究只是稍微夸大了一点。”它可以采取多种形式,比如一片叶子的两面是彼此的反射,或者是时间上的循环模式。晶体的定义是展现对称性:当你以不连续的步骤穿过一种材料时,你会发现任何地方的局部环境都是一样的。这被称为“平移不变性”,如图 1 所示。

图一。二维晶体的一部分。对于长度 a 的垂直或水平方向上的每次平移,左下角的橙色点和右上角的绿色点的图案会重复自身。在这种情况下,晶胞是长度为 a 的平方,其中有一个橙色原子和一个绿色原子。因此,只要你在这些类型的离散位移中移动,从 P 点的视图将是相同的。图片作者。

在固体中,带正电的原子核固定在一个周期模式中,电子或多或少可以自由漫游。因此,模拟只专注于模拟电子之间的相互作用[4]。库仑力导致同性粒子相互排斥,并不取决于电子的确切位置,而是取决于它们之间的距离。这种只关心相对距离而不是精确位置的特性也出现在递归神经网络(RNN)中,这是一种机器学习算法。然而,在 RNN 的情况下,该距离是输入步骤的索引之间的距离,而不是实际空间。输入被分解成离散的、连续的片段,每一个片段都被编码以产生自己的输出。RNN 允许更早的输入被向前传递以告知结果,因此最终的输出依赖于所有的输入[5]。该过程如图 2 所示。三个彩色圆圈代表这个“隐藏状态”,即输入和输出之间的步骤。在本例中,有三条输入,索引为 1-3。输入 1 (i1)被馈送给算法,该算法将特定于 RNN 试图解决的问题。然后,i2 和先前的隐藏状态被馈送给算法。它们产生 o2,这就更有料了。这将传播许多步骤,直到考虑了所有的输入。在此图中,只多了一个步骤,即生成最终输出 o3。

图二。具有三个输入和输出的递归神经网络。与以前的投入相比,最近的投入对产出的影响更大。图片作者。

如图所示,并非所有的输入都同等重要——最近的输入对输出的影响最大。这被称为“短期记忆丧失”,RNN 氏症的形成方式导致了这种效果。在具有输入和正确输出的数据集上训练模型。训练模型微调每个隐藏状态中的参数,以产生正确的最终值。预测后,根据与已知答案的比较计算误差,并调整每层的参数。这个调整就是机器学习的方式!每一层中的更新取决于前一层必须改变多少。通常,调整随着每一层而减少,从末端向后传播。因此,第一层几乎没有经历任何调整,也没有学到太多东西。

虽然短期失忆在某些情况下是一种缺点,但在其他情况下,它实际上反映了自然。电子有一种叫做自旋的性质,自旋是内部角动量的度量。一个电子处于某一位置的概率可以从一种叫做波函数的东西中预测出来[4]。在 Roth 的情况下,输入是每个晶胞的自旋态,输出是波函数。如果电子只关心其他附近的,那么短期记忆丧失不是问题——答案应该更少依赖于远处的电子输入!因此,RNN 重视本地输入多于进一步输入的特性模拟了系统的物理特性。但是,需要注意的一点是,每个输出只考虑前面的输入,实际上忽略了后面的输入,即使它同样在附近。这相当于支持一个方向,尽管电子排斥应该是空间对称的。为了说明 RNN 架构中的这种不对称,可以对输出取平均值,以获得精确的结果。系统之间的第二个模拟出现在 RNN 离散输入格式中,这在晶体中是合适的,因为它们的属性仅适用于离散空间平移。

计算几个晶胞的波函数在定性上可能很有趣,但接近实验中使用的实际晶体大小将提供关于新量子行为的更确定的答案。Roth 的方法不仅适用于小系统,而且随着输入量的增加,计算质量也会提高。这表明 RNN 能够学习系统的物理学,也许能够捕捉到使用具有相似对称性的算法来模拟一个系统是多么自然。如果物理学家要理解我们这个时代一些最有趣的量子现象,如超导、相互作用的磁场和电场效应(量子霍尔效应)和纠缠,这样的计算进步是必要的。

参考

[1]https://www.nature.com/articles/s41524-018-0085-8

[2]https://www.nature.com/articles/s41567-018-0048-5

[3]https://arxiv.org/abs/2003.06228

[4] R. M. Martin,《电子结构:基本理论与实践方法(剑桥大学出版社,英国剑桥,2004)。

[5]https://towards data science . com/illustrated-guide-to-recurrent-neural-networks-79 E5 EB 8049 c 9

量子优势从何而来

原文:https://towardsdatascience.com/where-the-quantum-advantage-comes-from-5accd926eb7a?source=collection_archive---------24-----------------------

格罗弗算法的直觉

本帖是本书的一部分: 用 Python 动手做量子机器学习

在许多情况下,我们需要在一组项目中找到一个特定的项目。毫不奇怪,搜索算法是计算机科学中最突出和最有用的算法之一。

让我们想象一下,你需要给一个著名的量子计算先驱打电话,格罗弗先生。你在电话簿里搜索他的号码,因为你还没有。你在中间打开这本书,你会看到以 L 开头的名字,因为 G 在 L 之前,你拿起书的前半部分,再在中间打开。你会看到有 E 的名字,因为 G 在 E 后面,你翻开书,在 E 和 l 中间,你会看到 Grover 先生的号码。

我们把这种搜索算法称为二分搜索法。该算法重复地将搜索间隔分成两半。如果搜索的项目低于区间中间的项目,它会将区间缩小到下半部分。否则,它会将范围缩小到上半部分。它会重复,直到找到值或间隔为空。二分搜索法算法缩小了搜索空间非常快,收敛到一个解决方案。唯一的问题是,该算法依赖于你搜索的数据进行排序。如果数据没有排序,算法就不起作用。

这是一个大问题,因为不仅二分搜索法依赖于分类数据,几乎所有的搜索算法都是如此。

如果数据没有以任何其他方式排序或结构化,唯一有效的搜索算法是线性搜索。在线性搜索中,我们必须评估每一个条目,以验证它是否是要搜索的条目。虽然这种方法适用于小数据,但不适用于大数据集。

这就是格罗弗算法发挥作用的地方。在这篇文章中,我们了解了 Deutsch 的算法,该算法可以计算两个输入参数的函数,而只运行一次。Grover 的算法告诉我们如何在一个无序列表中搜索一个项目,而不需要逐个查看每个项目,而是一次查看所有项目。它使用两种技术来实现。首先,它使用量子神谕来标记被搜索的状态。第二,它使用一个扩散器来放大被标记状态的幅度,以增加其测量概率。

我们可以用状态、振幅和测量概率来描述量子系统。但这些都是我们无法直接观察到的内在描述。每当我们测量一个量子系统时,我们都会得到一个单一的值——这个特定系统所处的状态。

如果我们测量两个相似的系统,我们可能会测量不同的值。然后,我们知道这个特殊的系统可以处于不同的状态。如果我们有许多相似的系统,我们可能在某些州比在其他州更频繁地测量系统。我们测量一个量子系统在某个状态下的频率取决于概率。量子系统的每个状态都有一定的测量概率。它越高,我们就越有可能在这种状态下测量系统。

一个状态的测量概率取决于这个特定状态的幅度。数学上,测量概率是振幅的绝对值的平方。我们马上就会明白这意味着什么。

格罗弗的搜索算法从一组相等叠加的量子位开始。这意味着所有状态的振幅相等。因此,它们都具有相同的测量概率。如果我们只测量这个系统一次,我们会发现它处于任何状态。哪一个取决于运气。如果我们测量这个系统无数次,我们会看到它在每一个国家同样频繁。

作者弗兰克·齐克特的图片

我们要寻找的州就在这些州中。目标是以一种方式改变系统,如果被测量,我们会发现系统处于这一状态。一直都是。

量子预言机的任务是识别被搜索的状态。量子神谕不是一种神奇的成分,而是一种控制结构。它是一个量子算符。该运算符对搜索状态的幅度求反。

当然,重要的问题是:“神谕如何识别被搜索的状态?”

先知使用被搜索的量子态的任何特征。如果我们从一组相等的状态开始,那么根据定义,这些状态只是在枚举方面不同。它们的不同之处在于,我们测量(如果我们测量的话)某个量子位是 0 还是 1。例如,如果我们使用四个量子位,那么就有不同的 2^4=16 态。从|0000⟩出发,到|0001⟩,在|1111⟩.结束

每个量子位可以有特定的意义。我们可以把它理解为一封信。这封信没有 26 个不同的选项,只有两个,|0⟩和|1⟩.有了足够数量的量子位,我们可以代表所有活着的人。有了 33 个量子位,我们可以代表大约 85 亿个不同的状态。人类的电话簿。我们还没有分类。

现在,假设四个量子位就足够了,格罗弗先生被称为|0010⟩.oracle 使用该状态的特定特征来识别它。也就是说,这个州有一个|1⟩在第三位,而|0⟩在第三位。

由于量子预言机将所有量子位作为输入,它可以很容易地应用这种精确状态的转换。我们用 4 个量子位还是 33 个都没关系。先知一下子就认出了格罗弗先生。

神谕应用于被搜索状态的变换是振幅的反转。

作者弗兰克·齐克特的图片

在振幅的这种表示中,我们可以清楚地看到被搜索状态和所有其它状态之间的差别。我们可以过早地宣布搜索结束。

唯一的区别是振幅的符号。对于来自振幅的绝对平方的测量概率结果,符号根本不重要。

振幅源于这样一个概念,即每个量子实体不仅可以描述为粒子,也可以描述为波。波浪的主要特征是它在运动时上下起伏。振幅是波的中心和波峰之间的距离。

如果我们颠倒一个波在所有位置的振幅,结果是同一个波偏移了其波长的一半。

这两种波的不同之处仅在于它们的相对位置。这是波的相位。对于外界来说,波的相位是不可观测的。单独观察,这两个波看起来是一样的。所以,问题是我们无法区分这两种波。

作者弗兰克·齐克特的图片

因此,该系统从外部看起来没有任何不同。即使神谕标记了被搜索的状态,因此它不同于其他状态,所有状态仍然具有相同的测量概率。

我们需要将差异转化为可衡量的东西。我们需要增加标记状态的测量概率。这是扩散器的任务。扩散器应用关于平均振幅的反转。

我们来看看平均振幅。

作者弗兰克·齐克特的图片

有了四个量子位,我们就有了 16 种不同的状态。每个状态的幅度为 1/sqrt(16)=1/4。事实上,除了一个状态之外,每个被搜索的状态都有这个振幅。搜索状态的幅度为 1/4。因此,平均值为(15÷1/4 1/4)/16 = 0.21875。

平均值比我们没有标记的所有状态的振幅小一点。如果我们用这个平均值来反转这些振幅,它们最终会比平均值低一点,为 0.1875。

因为标记状态的振幅是负的,它离平均值相当远。均值的反转有更大的影响。它将幅度从 0.25 乘以 2(0.25+0.21875)翻转到 0.6875。

作者弗兰克·齐克特的图片

如果我们在许多正振幅中寻找单个或几个负振幅,关于平均值的反演工作得很好。然后,这个操作增加了我们知道是正确的负振幅。这个操作减少了正振幅,我们知道这是错误的。

该操作将负振幅增加一个大的量,同时将正振幅减少一个小的量。

但是我们拥有的状态越多,整体效果就越低。在我们的例子中,我们计算出被搜索状态的新振幅为 0.6875。相应的测量概率是 0.6875^2=0.47265625.因此,在我们寻找的状态下,我们大约每隔一段时间才测量这个系统。否则,我们在任何其他情况下测量它。

当然,我们现在可以多次测量系统,并将我们搜索到的状态视为最有可能的状态。但是运行这个算法这么多次将会失去我们从不搜索所有状态中获得的任何优势。

相反,我们重复算法。我们用同样的神谕来否定被搜索状态的幅度。然后我们再次反转平均值附近的所有振幅。

然而,我们不能重复这个过程太多次。有一个重复这个过程的最佳次数,以获得测量正确答案的最大机会。获得正确结果的概率增长,直到我们达到大约π/4*sqrt(N)其中 N 是量子系统的状态数。超过这个数字,测量正确结果的概率再次降低。

在我们有四个量子位和 N=16 个状态的例子中,最佳迭代次数是 3。

结论

格罗弗的算法搜索未排序的数据。它遵循一个简单的程序。量子预言反转了被搜索状态的振幅。然后,扩散器反转关于平均振幅的所有状态,因此,放大搜索的状态。该算法重复这些步骤,直到解决方案具有接近 100%的测量概率。

重复的次数取决于它需要考虑的状态的数量。由于重复次数只增加了大约状态数的平方根,与经典的线性搜索相比,该算法提供了二次加速,这是唯一能够搜索未排序数据的经典方法。

然而,像所有的量子计算机算法一样,格罗弗的算法是概率性的。它以很高但不是绝对的概率返回正确答案。因此,我们可能需要重复该算法,以尽量减少失败的机会。

本帖是本书的一部分: 用 Python 动手做量子机器学习

在这里免费获得前三章。

哪里有物质,哪里就有几何…

原文:https://towardsdatascience.com/where-there-is-matter-there-is-geometry-8560d36c9ce6?source=collection_archive---------33-----------------------

规范理论、对称性、机器学习等等

目的: 对于这篇初始帖子,我想简要介绍一下微分(黎曼)几何中的关键概念,这是理解即将到来的帖子所必需的,这些帖子位于机器学习、能效、拓扑和几何的交叉点。然而,与其直接推动机器学习,我希望科学家和工程师们思考一下— 为什么要利用几何来理解统计推断 ?总是从为什么开始!我们使用几何学,不是因为它很酷,相反它是必要的。

在 ubi materia,ibi Geometria 是约翰尼斯·开普勒的原话。看看你的周围;世界充满了不同的形状和空间——橙子(圆形)、马鞍(双曲线)、地球(椭圆形)以及许多其他形状。随着复杂算法的出现,我们可以很容易地推断出纽约离伦敦有多远,或者如果你是一个机器学习爱好者,你可以测量分布之间的距离和散度(Kullback-Leibler,Jensen-Shannon 等)。).为我们提供这种洞察力的纯数学部分是几何学。几何本身以不同的形式出现——从欧几里得几何、解析几何、代数几何等等。作为剑桥大学的一名研究生,我非常幸运地在伊萨克牛顿数学科学研究所呆了很长时间,学习了许多不同类型的几何知识。然而,直到我遇到了甘利顺一,我对信息几何(基本上是用来理解概率分布的几何)及其与统计物理的联系的兴趣才被激发起来。Amari-san 的眼睛里有一种明亮的火花,我总是喜欢去听他的讲座。说够了。

我们周围物体的常见形状。来源:科学杂志

机器学习特别感兴趣的是微分几何。为什么?因为它集合了微积分和多元线性代数的工具来研究各种流形。微分几何着眼于黎曼流形——这些是带有度量的光滑流形(就像信息几何中的那些),洛伦兹流形——这是爱因斯坦广义相对论的基础,芬斯勒流形,克勒几何——用于复杂流形,等等。正如你所看到的,有很多东西要学,我们从某种东西开始怎么样,这种东西为我们理解我们周围的任何物理现象提供了一个平台——规范理论。

规范理论是预测一个或多个物理场如何与物质相互作用的物理理论。每一个规范理论都有一个关联的拉格朗日量(即一个概括了所讨论的系统动力学的函数),它在一组局部变换下是不变的。考虑惯性参考系中的牛顿运动定律(例如,一个球在一个空房间中)。这些定律在房间的任何地方都有效。这意味着动力学和拉格朗日不依赖于球的位置。在这个系统中,在空间平移下,动力学将是不变的。这些变换——保持了拉格朗日——据说配备了规范对称性。简而言之,对称只不过是对参照系变化的不变性或免疫。

取一个旋转的参照系(如地球),称之为系统。在地球自转的过程中,每个城镇之间的距离保持不变。随着地球的旋转,我们可以说我们有一个规范转换,它不会改变城市的距离。这意味着系统保持其对称性(,自然法则),尽管全局力(作用于系统的每一点)的作用(或规范变换)。这个动作对应于系统的全局变换——保持不变的变换;在这种情况下,距离。然而,还有另一种可能性:例如,比较地球和其表面的运动物体(例如,海洋中的水)。当相对于地球描述水的运动时,它的惯性(即它沿直线运动的趋势)扭曲了它的运动。这种现象被称为科里奥利效应:电流在北半球往往以顺时针方向(相对于行进方向)流动,而在南半球则以逆时针方向流动,而不是像在非旋转世界那样直接从高压区流向低压区。因此,科里奥利效应是旋转(非惯性系)参照系中的曲线运动。不恒定的规范变换,即随空间位置变化的规范变换,被称为局部对称性。一个或多个局部力只作用于系统的几个部分,产生局部变化。

尽管有局部力的扰动作用,为什么对称性仍然存在?这是因为局部力被另一个力平衡了——称为规范场。注意,当系统的整体对称性在局部力的作用下保持不变时,就会出现局部变形,这种对称性被称为局部破坏,或者充其量是隐藏。在一个具有整体对称性的系统中,有可能找到一个可以被规范场“修复”的局部对称性破缺。让我们再次以科里奥利力为例。对于只使用惯性参考系的人来说,科里奥利力不存在;它们只是我们发明的力,用来假装我们在一个惯性系统中,而事实上我们并不在:它们是实用的,因为它们允许我们继续使用牛顿定律。阿尔伯特·爱因斯坦发现了类似的东西;当重力(由能量和动量引起)存在时,狭义相对论就不成立。然而,通过允许能量和动量弯曲时空,他可以保留狭义相对论,至少在局部,使引力消失。对爱因斯坦来说,重力和科里奥利力一样不真实;当选择一个不合适的参照系时,它们是我们必须发明的力量。让我用一个单摆的例子来说明这些想法:

*Consider a simple pendulum that oscillates with the same frequency  **ω** in ***x***and ***y*** coordinates. It is usually convenient to use polar coordinates, where **z = x + iy**, such that the motion can be described by a (second order) differential equation **∂ₜₜz + ω²z = 0** and the direction or angle satisfies **tan θ  = y/x**. In terms of the motion, the absolute coordinates (the ***x*** and ***y*** axes) are simply irrelevant; for example, we can rotate the axes by **a** to represent the motion in new coordinates **x'** and **y'**. The differential equation remains the same (although we need to replace **θ** by **θ−α**. This amounts to multiplying the differential equation by **exp(-iα)** and redefining **z'=zexp(-iα)**. This means that although we have rotated the frame of reference, the equation of motion is unchanged. This is **global gauge invariance**. It is global because the entire frame of reference was rotated by the same amount, irrespective of where or when we describe the motion.Now imagine we rotate the ***x*** and ***y*** co-ordinates by an angle that depends on time: i.e., the rotation **α** now becomes **α(t)**. With this local transformation (local with respect to a particular time), multiplying by **exp(-iα)** does not ensure the invariance of the differential equation. How could we then retain the laws of motion? Remarkably, we can do so by replacing the time derivatives by **∂ₜ − iA(t)**. The field **A(t)** is the compensatory **gauge field** that ensures the equation of motion holds, locally. This is **local gauge invariance**. This amounts to rotating our coordinate system with an angular velocity **∂ₜa(t)** creating a fictitious force (like a Coriolis force). In short, the gauge field  **A(t)** induces compensatory yet fictitious forces, necessary to retain invariance under a local gauge transformation. From a local perspective, the pendulum will appear to move erratically in response to the gauge field; while, from a global perspective, nothing has changed.*

简而言之,规范理论相对简单:有一个描述运动方程式的拉格朗日量。这些运动方程在空间参考系的变化下通常是不变的(例如,一条直线在一张纸上的任何地方都是直线);然而,如果我们退后一步,看到运动(时空中的一条线)随着位置而改变(例如,一张弯曲的纸上的一条直线),我们可以通过引入补偿场或力——规范场,将整体对称性扩展为局部对称性。这里弯曲或曲率的概念很重要,因为在概率分布空间中形成轨迹的流形必然是弯曲的。

微分几何

我们所有人都沉浸在一个 4 维的世界里,3 个空间坐标和 1 个时间坐标构成了参照系。纤维束是微分几何的构造,它提供了这种参考系的一般公式。直观地说,通过将一组相同的一维线粘合在一起,例如堆叠在 x 轴上,可以对二维薄片进行采样。然后,这些线被称为纤维( F ),将它们粘合在一起的子空间被称为基底(b)——合在一起,这些线形成了一个纤维束( )。用圆柱体代替二维薄片只是改变了基底;其中纤维附着在一个圆上,一条线的坐标在正负无穷之间,而圆上的坐标取值在 0 和 2π之间。在这种情况下——很容易找到一个全局坐标系——我们称相应的束 平凡 。一个重要的束可能是一个莫比乌斯带,其中不可能实例化一个全局坐标系。这种情况经常发生。在这些情况下,可以使用局部坐标系网络。唯一的要求是建立一些规则来描述局部坐标如何在相邻的面片之间变化。一个连接域*——也称为规范域——满足了这一要求,并协调了粘合到基底附近点的光纤坐标系之间的明显不一致。*

因此,规范场是一个由独立的底坐标组成的向量场。对于两个坐标系统(两个局部点)的比较,只需构建一个框架调整规则以及独立的基座坐标即可。这种差异可以通过沿着独立方向的一系列转变来说明(比如说 b )。在数学上,计算基数 db 和规范域的点之间的差的标量积。**

这里的规范域 AF(b)F(b + db) 坐标系之间的转换。和之间的路线定义了一条曲线;连同轨距字段,这些定义了沿曲线的平行传输。当我们用一个连接场来比较一根纤维中两个相距很远的元素时——没有发现差异——我们可以说第二个元素是第一个元素沿曲线平行传输的结果。现在让我们将我们到目前为止所描述的概念形式化:

****定义 1。一个光滑纤维丛是一个复合对象,由——( a)一个光滑流形 组成,称为全(丛)空间,(b)一个光滑流形 B 称为基空间,(c)一个光滑映射 w: F̄ → B 称为投影,要求它的雅可比矩阵在每一点都具有最大秩, (d)称为纤维的光滑流形 F 和(e)称为纤维束的结构群的纤维 F 的光滑变换群 G相切共切束是纤维束的特例。总结动力学的拉格朗日函数是切线束上的自然能量函数,而哈密顿函数是共切线束上的自然能量函数。一个喷射束概括了切线束和余切束。

****定义 2。如果我们可以引入全局坐标系,使得任何点都可以使用一对坐标 (x,f) 来识别,则光纤束被表征为 平凡的 ,其中 f 是光纤上的一组坐标, x 是基底上的一组坐标。同样, 主纤维丛 是一种特殊的纤维丛,其纤维是群 G

定义 3。对于底座上的一条曲线 γ ,一条连线**是光纤在点 γ(m) 到光纤在点 γ(n) 的映射 (b) ϕᵧ 与路径的参数化无关——平行输送是由路径而不是函数 γ(⋅) ,(c ) ϕᵧ 是恒等映射如果【t】γ(t)【d】沿两条连续曲线的平行输送是等价的 其推论表明,在相反方向的运输产生反向平行运输。如果映射 ϕᵧ 是基中任意曲线的结构组的一个元素,则称一个连接为g-连接。综上所述,端点相同但路径不同的并行传输的结果可以不同。纤维束的曲率**测量这种差异。****

出于我们的目的,我们将把自己限制在一个黎曼流形——一个解析的流形,其中每个切空间都配有一个内积,从点到点平滑变化。这个内积采用局部逼近流形的切丛上的度量的形式。这使我们能够定义各种概念,如长度、角度、体积等。

定义 4。流形 上的黎曼度量是共变的 2 张量 g ,它将流形上的每个点与切空间 Tₓℳ 上的内积g =<->ₓ。度量是双线性的、对称的和正定的,因此定义了切空间上的欧几里德距离。在局部坐标方面,度量由矩阵 给出 gᵢⱼ = < Xᵢ,> ₓ 其中 XᵢXⱼ处的切向量,并且随着 x 平滑变化测地线曲线是用黎曼度量计算的弧长的局部最小值。********

定义 5。在黎曼几何中, Levi-Civita 连接是保持黎曼度量的切丛的挠率或曲率自由连接。更具体地说,它是一个独特的仿射连接 使得它是

兼容公制,即:

具有对称性,即,

其中【X,Y】卧括号*。*

相容条件可以用协变导数来表示,即如果 X(t) = X(γ(t))Y(t) = Y(γ(t)) 是沿曲线 γD/dt 的两个向量场

定义 6。在已经参数化的流形中,曲线 γ(t) 表示为 ({x }(t),…,{xᴹ}(t)) ,向量场 v 的协变导数可以写成:

在这里,连接γᵢⱼᵐ的系数被称为克里斯托夫符号*。简单地说,沿曲线的平行输送变成一阶线性系统,*

在这种情况下,克里斯托夫符号由下式给出:

gᵐˡ 代表公制倒数。测地线方程现在可以写成一个二阶系统,

今天就到此为止。

注:我不得不承认,在介质上使用 LaTeX 写数学并不简单,因为需要将所有内嵌的 LaTeX 方程转换成 Unicode 🤐。因此,请原谅这篇文章中的数学排版。

我打算写一些帖子,要么是(a)数学的(就像这里的这个),要么是(b)机器学习的商业用例(这里的这个关于 人工智能产品-市场契合度 )。我会试着将每篇文章交错,以保持不同受众群体的博客文章之间的平衡。

DOTA2 中在哪里放置选区

原文:https://towardsdatascience.com/where-to-place-wards-in-dota2-84f534b9b64e?source=collection_archive---------10-----------------------

实践教程

向职业玩家学习

叶夫根尼·切尔卡斯基Unsplash 上拍摄的照片

TL;博士:购买病房并把它们放在战略位置

成为 DOTA 中的支援英雄

DOTA2 是一款 MOBA 游戏,有许多有趣且有时隐藏的机制。这是一项团队运动,每个队员都要扮演各自的角色。例如,支援英雄被期望为农场依赖英雄创造喘息空间,堆叠营地,并购买支援物品。

当我学习扮演支援英雄时,一个重要的角色是地图视觉。事实上,正确的愿景可以帮助团队实现关键目标。此外,视觉创造了地图感知和空间,让你的队友相对安全地漫游或伏击( gank )。

该员额的目标是:

  • 借助一些数据科学工具,探索职业玩家在何时何地使用视觉。
  • 作为休闲玩家的向导,改善他们的游戏体验。
  • 推断一下像 Dota Plus 这样的付费订阅是如何做病房建议的。

完整的代码可以在这里找到:

https://github.com/NadimKawwa/DOTAWardFinder

定义愿景

第一种是观察区,提供一个区域的视野。他们的视线被树线挡住了,一个放置在山顶上的观察病房提供了飞行视野。注意观察结界不会暴露隐形单位。

另一方面,哨兵病房没有自己的视野。然而,站在岗哨旁边的玩家可以看到隐形单位。

两种类型的结界对敌人来说都是不可见的,除非设置了岗哨结界。在战略要地放置结界的行为称为 守卫 ,移除敌方队伍放置的结界称为 去守卫

地图概述

下图显示了完整的 DOTA 地图,辐射队在左下方,可怕队在右上方。更多详情,请参见这篇维基文章

来源: CC BY-NC-SA 3.0 牌照下的【https://dota2.fandom.com/wiki/Map】T2

OpenDota 项目允许玩家查看比赛概要和有用的情节,如下图取自一场样本比赛:

  • 绿色光芒四射
  • 红色是可怕的
  • 带虹膜的椭圆形是一个观察病房
  • 没有虹膜的椭圆形是一个哨兵病房

请注意,观察员病房有一个更大的视线,地图没有考虑到由于树木或高地上的障碍。

OpenDota 制作的病房地图样本在麻省理工学院许可下提供

数据收集

OpenDota 的任何人都可以免费查询这些数据:

https://www.opendota.com/explorer

用于解析数据的 SQL

以下 SQL 查询返回专业比赛的日志数据。时间框架被任意设定为 2021 年 1 月 1 日及以后。此外,25000 个匹配应该足以满足我们的目的。

数据格式

下图显示了感兴趣的两个主要列。这些日志是 JSON 格式的,为了更好地接收数据,它们将被扁平化。以下信息与本项目相关:

  • (x,y)病房的位置。
  • 哨兵或观察者。
  • 时间安排。
  • 如果由辐射或可怕的团队放置。

作者截屏

OpenDota 坐标系

OpenDota 使用的坐标系与实际地图尺寸不同。实际上,地图的左下角对应于坐标(64,64),并且地图被分成从 0 到 127 编号的象限。因此,地图的右上角有坐标(192,192)。

数据一览

数据看起来怎么样?下图显示了数据集中所有观察区的分布情况,以及按高度显示的地图颜色。蓝色点(z=132)对应于一座小山,因此位于山顶的病房视野开阔。此外,还添加了一个红色边界框来显示地图的范围。

有趣的事实:( 100,150)处的灰色空白点对应罗山的坑,里面不能放置任何结界。

作者的情节

之前的剧情很乱,没有透露太多。因此,让我们来看看所有病房的安置时间:

作者的情节

有人可能会问:两个团队的守卫活动是一样的吗?下图证实了这一点,没错,不管是哪个团队,活动都是一样的。

作者的情节

此外,让我们看看下图中山丘的守卫活动。它遵循与整体防护活动相同的趋势,并在游戏的第 40 分钟后下降。

作者的情节

如何识别病房群集

考虑下面的情节,它显示了游戏开始前放置的所有观察者的病房。一眼我们就能推断出玩家想要在哪里放置结界,但不知道他们优先选择在哪里放置。

作者的情节

如果我们想要识别具有激烈竞争视觉的位置呢?团队在哪里优先考虑守卫?我们可以使用下一节中解释的聚类算法来回答这些问题。

选择的型号:DBSCAN

DBSCAN 由两个关键参数控制:

  • ε:两个样本之间的最大距离,其中一个被认为是另一个的邻域。
  • min_samples:一个点的邻域中被认为是核心点的样本数。

DBSCAN 的一个优点是它不需要指定簇的数量,并且它可以找到任意形状的簇。此外,它有一个噪声的概念,是健全的离群值。因此,一些病房将不会被分配到一个集群,并作为离群值。

为什么不使用 KMeans?

KMeans 可以作为一种替代的聚类算法。然而,它依赖于三个假设:

  • 每个变量分布的方差是球形的(KMeans 喜欢球形斑点)。
  • 所有变量都有相同的方差。
  • 每个聚类都有大致相等数量的观察值。

这是第三个最严重阻碍知识手段的假设。事实上,有些地方有几个病房就可以了,比如中间的车道,而其他地方经常会有争议,比如安全车道。

时间的影响:后期游戏 Vs 早期游戏

DOTA 是一个分秒必争的游戏,每一刻都是创造新事物的机会。事实上,时间(游戏的阶段)的影响是制定策略的一个主要因素。

如果一级塔还在的话,在你的基地里放置一个守卫区是没有意义的。因此,根据任意的时间框架对病房进行分组比忽略时间的影响更有见地。

每个阶段的地图视觉集群

这一部分包含了由哨兵/观察者和辐射者/恐怖分子划分的守卫图。此外,还提供了一个注释来解释集群如何反映玩家的策略。

赛前—0:00 分钟前

在第一波蠕动波离开基地之前,玩家会争夺金色符文。因此,玩家在河流附近的地图中心放置观察哨,以便观察敌人在做什么。此外,有些人会在敌人有时间撤退之前,在敌人的丛林深处安置观察员。

最后,红色显示的岗哨对应的是经济战。事实上,在一个中立的爬行动物营地的边界内放置一个岗哨可以防止后者产卵。因此,敌人的团队被剥夺了黄金和拉蠕变波的能力。

早期游戏— 0 点到 10 点

在早期的游戏中,中线和安全丛林仍然是有争议的。因为一级塔可能还在,所以优先视野在丛林入口附近。

游戏早期到中期— 10:00 到 20:00

在游戏的早期到中期,恐怖和光辉都试图将观察者的守卫放在敌人安全的丛林深处。在游戏的这个阶段,三角形开始变成一个有争议的区域。

游戏中期— 20:00 到 30:00

视觉主要集中在三角形和山顶上。

游戏中后期— 30:00 到 40:00

比赛中后期,队伍可以把注意力转向罗山的坑。这表现在矿坑附近的山顶上布满了观察哨和岗哨,它们被放置在入口处,用来探测抢夺神盾的企图。

游戏后期— 40:00 到 60:00

现阶段罗山的坑还是一个相关的客观。重点是三角形。一些岗哨被安置在基地附近。

非常晚的游戏— 60:00 及以后

在游戏的最后阶段,兵营和三级塔可能已经没有了。为了弥补塔楼视野的损失,在基地内部安置了病房。

创建交互式浏览器

图的输入和参数是任意的,并且基于领域知识(即,数百小时的游戏)。如果你想调整数据,请使用下面的 streamlit 应用程序:

https://share . streamlit . io/nadimkawwa/dotawardfinder/main/appwardfinder . py

下面的截图显示了该应用程序,并要求用户输入 3 个信息:

  • ε值
  • 时间范围
  • 每个聚类的最小样本数

本项目的优势

这个项目使用真实可靠的大规模数据。因此,它可能会捕捉职业玩家的最佳实践,并跟上战略和游戏机制的变化。

此外,这里使用的方法与地图的变化无关。因此,输出中已经考虑了对地图布局或高程的任何更改。

固有的局限性

这个项目不评估一个病房的寿命。玩家面临着决斗的优先权:

  • 守卫一个敌人可能会向其开火的区域,因为它提供了有利的视野。
  • 守卫一个鲜为人知的地点,失去关键视野,但敌人不太可能放弃它。

此外,一个岗哨守卫需要 50 金币,如果被摧毁将不会得到任何奖励。另一方面,观察结界是免费的,但是提供 100 金币奖励,并且每 15 秒额外提供 1 金币。因此,有一个成本/收益比方面的 warding,这个职位没有解决。

结论

有可能查询数据和识别关键地图位置,在那里病房可以帮助团队安全杀死或关键目标。这篇文章的方法的优点是它跟上了地图布局和游戏机制的变化。因此,通过观察大量的比赛,我们可以发现关键位置,并在我们的游戏中实现它们。

参考

https://github.com/odota http://varianceexplained.org/r/kmeans-free-lunch/ https://en.wikipedia.org/wiki/DBSCAN#Disadvantages https://github.com/odota/core/issues/1473

接下来去哪里旅游?兴趣点推荐系统构建指南

原文:https://towardsdatascience.com/where-to-travel-next-a-guide-to-building-a-recommender-system-for-pois-5116adde6db?source=collection_archive---------16-----------------------

来源

的上一篇文章中,我写了如何制作你自己的电影和书籍推荐系统。在下文中,我将一步一步地描述如何构建一个推荐系统,该系统基于用户偏好、地理影响和社会影响来建议新的游览地点。

推荐方法在文章 iGSLR:个性化地理社交位置推荐:一种核密度估计方法】中介绍,张和周,SIGSPATIAL'13。

我将使用 Surprise Library 一步一步地介绍他们方法的实现。

加载数据集和预处理

我使用的数据集是从社交媒体 Gowalla 收集的。它由 2,724,891 个兴趣点中的 407,533 个用户的 36,001,959 次签到组成。

它包括用户签到信息、用户朋友信息、位置信息和用户信息的数据集。

为了减少计算时间,我只选择了拥有 5 次以上 50 次以下签到的用户,但是你当然可以处理所有的数据。

最终的训练数据集应包含所有兴趣点信息和用户信息,没有冗余信息,为此:

  1. 我使用地点 id 连接了签到数据框和位置数据框

2.我从获得的数据帧 df_checkins_location 中计算了被访问位置的频率,以去除冗余的行

3.我连接了测向频率和测向位置,以获得最终的训练数据集

然后,整个数据集被意外加载

这篇文章的作者设计了一个推荐系统,利用社会和地理影响来表达用户的偏好。

社会影响

作者观察到,用户通常会向朋友寻求书籍、电影或兴趣点的推荐。他们通常更喜欢去朋友们强烈推荐的景点,而不是随便去一个地方。

他们建议使用以下步骤来计算用户的社会影响力:

(1)测量她/他与她/他的每个朋友的相似性。

两个用户之间的社会相似性

  • F(u)是用户 u 的朋友的集合

实现

首先,我创建了一个数据框,将每个用户与她/他的朋友联系起来。

数据集中每个用户的朋友列表

(2)在协同过滤公式中使用这种相似性

社交协同过滤评级预测

  • r_vi 是用户 v 访问 POI i 的频率

为了获得 r_vi,我们需要使用下面的函数:

使用以下函数计算预测评级的实施情况:

(3)将 POI 的预测转换成概率得分

在哪里

  • l 是所有 POI 的列表

位置的地理影响

作者建议利用同一用户访问的每对位置之间的距离。例如,曾经在世界各地旅行的用户希望得到国外的兴趣点的建议,相反,经常访问其生活区域周围的兴趣点的用户希望得到附近兴趣点的建议。

随着距离分布从一个用户到另一个用户的变化,其计算如下:

距离分布估计

在哪里

  • d_ij 是要推荐的 POI 和用户已经访问过的 POI 之间的距离

  • D_u 是用户 u 访问的所有 POI 对的距离列表

  • k(。)是一个普通的核函数

正常核函数

  • h 是作为最佳带宽的平滑参数。

最佳带宽

用户访问新 POI 的最终概率计算如下:

用户访问新位置的地理概率(POI)

最终公式

将社会影响和地理影响概率相加,以为用户 u 估计 POI 的相关性分数。

结论

就是这样!这个推荐系统可以帮助你决定你的下一次旅行,以防你认为离 POI 的距离和你朋友的推荐是选择的重要因素。你可以通过 LinkedIn 给我发消息获取完整的代码。请继续关注推荐系统的更多代码。

吉菲演出

沃尔多在哪?

原文:https://towardsdatascience.com/wheres-waldo-3dcd3c3b199f?source=collection_archive---------33-----------------------

实践教程

物理世界中的搜索算法

凯莉·米歇尔Unsplash 上拍摄的照片

想象你想读(或重读)你的《无限玩笑》。你家里的书架上摆放着成千上万本书。你如何找到那本特别的书?

蛮力

你可以在房子里走来走去,浏览每一个书架上的每一本书,直到你发现无限的笑话。这是可行的,但会相当令人厌倦和费时。这样的策略在计算机科学中被称为蛮力 算法。它确定了解决方案的存在以及最坏的情况是什么。除了放弃暴力策略,别无选择。

这种算法显然很麻烦,但到底有多麻烦呢?在最好的情况下,《无限的玩笑》碰巧在你浏览的前几本书里,你会很快找到它。在最坏的情况下,你只有在看完所有其他的书之后才会碰到它。当你在生活中反复使用蛮力搜索时,你会发现平均来说你必须翻完一半的书才能找到一本特定的书。用计算机科学的说法,这个算法的运行时间是 N ,其中 N 是图书总数。粗略地说,这意味着平均来说,找到一本书需要的时间与书的数量成正比。如果你把书的数量增加一倍,你就要花两倍的时间去找一本具体的。

你怎么能比蛮力搜索做得更好呢?通过整理书籍!在计算机科学中,解决问题的数据组织被称为使用数据结构。

二进位检索

让我们从一个常见且熟悉的组织策略开始:a 按照书名的字母升序排列书籍

按字母顺序排列的书籍(图片由作者提供)

显然,你将能够比必须检查每一本书更快地找到 Infinite Jest。你知道如何在一个按字母顺序排列的列表中找到一些东西,甚至不用考虑你正在使用的算法。您隐式使用的关键属性是,如果您检查一本书,并且它的标题按字母顺序比您要查找的书大(小),那么您想要的书必须在该书之前(之后)。通过这种方式,您可以利用图书的排序来反复缩小目标图书的范围。

算法到底是什么?它叫做二分搜索法。事情是这样的。你在一套排列好的书中间粗略地检查了一本书,你发现它是莫比·迪克。《无限的玩笑》按字母顺序排在莫比·迪克之前,所以你知道它一定在第一本书和莫比·迪克之间。您刚刚将要搜索的帐套减少了一半。然后,在新范围的中间位置(第一本书和莫比·迪克之间)检查这本书。原来青蛙和蟾蜍是朋友。所以你知道,青蛙和蟾蜍是朋友,莫比·迪克之间肯定是无限的玩笑。你又一次将书籍的范围缩小了一半。继续这样下去,你最终会发现无限的玩笑。

无限玩笑的二分搜索法(图片由作者提供)

二分搜索法比强力全扫描搜索快多少?如果有 N 本书要搜索,在第一次比较之后,要搜索的书的数量减少到 N/2。在下一次比较之后,该集合的大小是 N/4,然后是 N/8,以此类推,直到只剩下一本书:《无限的玩笑》。如果 k 是查找一本书所需的比较次数,那么 2^K = N。换句话说,二分搜索法的运行时间是 log N 。所以如果你把书的数量增加一倍,你只需要做一次额外的比较就可以找到特定的一本。这确实比随着书籍数量线性增长的蛮力运行时间要好得多。

带有二分搜索法的排序数组似乎是一个好的解决方案,但是它有两个严重的问题:

  1. 对大量的书籍进行分类是很困难的。有一些聪明的排序算法可以帮助你做到这一点,但是有一个事实是无法回避的,那就是你必须进行大量的图书交换才能正确排序。
  2. 很难在已分类的藏书中添加或删除书籍。例如,如果你买了一本新书,根据书名排序,它属于书架上的特定位置,如果书架上没有空间,你必须将许多/所有的书移到那个位置之后,为它腾出空间。

二叉查找树

这里有一种不同的方式来组织书籍,以解决排序和添加/删除书籍的问题。把书按书架上的顺序放好。在每本书里插入一张索引卡。每个索引卡将包含一些对数据结构进行编码的信息。

索引卡上的第一条信息是书的位置。第一本书的索引卡将把它的位置记为 1,下一本书记为 2,依此类推。

每个索引卡还将包含右子左子的位置。这个指针的结构定义了一个二叉树。第一本书是二叉树的。第二本书是根的左边或右边的孩子,这取决于它的标题在字母顺序上是低还是高。诸如此类。右边的子树只包含字母顺序大的标题,左边的子树只包含字母顺序小的标题,这种排序特性使得二叉树成为一个二叉查找树

要添加新书,从第一本书(根)开始,根据新书的标题是在根的标题之前还是之后,跟踪左边或右边的孩子,沿着树不断重复遍历,最后当要跟踪的孩子不存在时,使新书成为孩子。请注意,为了简单起见,我们在书名中包含了任何主要文章(the,a,an)。下图中的一个示例概括了这一点:

在二叉查找树中添加图书(图片由作者提供)

要查找一本书,从第一本书(根目录)开始,沿着相应的子目录(取决于书名的顺序)直到找到所需的书。以下是如何在我们上面构建的二叉查找树中找到无限玩笑的示例:

在二叉查找树找到无限的玩笑(作者图片)

使用这种二叉搜索树算法查找一本书的运行时间是多少?因为我们沿着树向下遍历,要么选择左边的孩子,要么选择右边的孩子,所以在每一步之后,我们基本上将搜索空间减少了一半,类似于二分搜索法算法。所以,就像前面的结果一样,需要 log N comparisons 才能找到一本书。

我们忽略了几个细节:

  1. 为了在每次比较后将搜索空间减少一半,树应该是平衡的,即右边和左边的子树应该是大致相同高度的子树。通常,当标题以随机顺序插入树中时,树应该足够平衡。如果做不到这一点,还有算法技术(比如树旋转)来平衡一棵树(但这超出了本文的范围)。
  2. 要在特定的位置找到孩子,你必须依靠按位置分类的书籍,并使用二分搜索法在指定的位置找到孩子。因此,沿着树向下的每一个 log N 跳本身都需要对索引卡上的位置进行 log N 次比较来找到这本书。这导致运行时间为(log N)。

二叉查找树解决方案是正确的、可行的和有效的。但这是矫枉过正。它引导我们跟踪索引卡中的元数据,以便可以使用搜索树数据结构将书名按排序顺序链接在一起。如果我们真的需要把书按顺序排列,那就好了。但是不需要仅仅为了搜索而排序。有没有更简单的方法至少同样有效?

散列法

如果我们放弃对书籍进行分类的努力(无论是直接分类,还是通过搜索树间接分类),我们确实可以提出一个更简单、更有效的解决方案。它涉及到一种被称为哈希的计算机科学技术。

哈希是什么?你将架子分成数百个更小的,并将桶标为 0、1、2、3 等等。通过以可重复的方式从标题计算桶号,将每本书散列到一个桶中。例如,使用手机键盘上的 T9 系统从书名的最后 4 个字母生成一个 4 位数,用 4 位数除以桶数,将余数作为书的桶数。所以,《无限 Jest》对应的是 T9 编号 5378。如果有 101 个存储桶,它散列到存储桶 25(因为 5378 = 25 + 101*53)。

通过将每本书放入它所指向的桶中来组织书籍。假设数千本书大致平均分布在数百个桶中(如果您的哈希方案足够健壮,就会出现这种情况),每个桶应该只包含几十本书。

通过哈希组织图书(作者图片)

你如何发现无限的玩笑?您将标题散列到它的桶中(使用与组织书籍完全相同的散列方案),进入那个桶,从那里的几十本书中挑选出一本书。

通过哈希找到无限的笑话(作者图片)

通过哈希查找一本书有多快?速度极快。它本质上只需要一个步骤,不管书的总数是多少!你所要做的就是计算你要找的书名的哈希值,这就把你的搜索范围缩小到一桶书中的几本书。这就是所谓的常数时间算法。如果你把书的总数增加一倍,你最终会发现每个桶里的书的数量也增加了一倍。但是,如果有足够多的桶,每个桶应该只包含几十本书,所以在恒定的时间内找到特定的书仍然很容易。

对于在一大堆书中寻找一本书来说,散列似乎是一个很好的解决方案。尽管它并不完美。它有一些相对较小的缺点,包括以下几点:

  1. 假设你的藏书越来越多,书架空间开始不够用了。你买更多的架子。但是现在你的散列方案有了更多的桶,你必须将每本书重新散列到新的桶中。多痛苦啊!如果改变搁置是一个罕见的事件,也许你可以忍受。但如果不是呢,或者你做不到呢?
  2. 如果您希望存储桶的大小不相等,也就是说,将更多的书散列到更大的存储桶中,将更少的书散列到更小的存储桶中,该怎么办?例如,每个搁板可以是一个桶,不同尺寸的搁板上有不同的书柜。这里介绍的散列算法似乎不能适应不同大小的桶。

这两个问题都可以解决。但这需要使用更复杂的基于哈希的算法,如一致哈希会合哈希。我将让这篇文章立足于基础,避免讨论这些迷人的技术。如果你有兴趣了解他们,请留下评论,我会写一篇后续文章。

哪些科技工作是 AI 无法替代的?

原文:https://towardsdatascience.com/which-data-professional-roles-cannot-be-replaced-by-ai-c7abd6d10f54?source=collection_archive---------36-----------------------

试图预测即使人工智能变得越来越普遍,仍然以人类为中心的领域

来源: @lhgerona on Unsplash

扩展我的先前预测的灵感来自于我最近听到的一句话,“任何可以自动化的都将被自动化”。有了这些明显的金钱激励,组织自动化,百万美元的问题是,技术专业人员应该如何最好地为未来做准备。为了回答这个问题,我们需要深入了解哪些流程可以自动化,这对技术专业人员意味着什么。

什么可以自动化?

机器人流程自动化的领导者 UiPath 概述了五套标准来决定一个流程是否应该自动化。虽然他们的标准侧重于 RPA,但这些概念也适用于可以自动化的其他领域。

标准#1:员工参与

耗时或严重依赖人工。手动操作会导致流程出错。

标准 2:复杂性

在考虑自动化时,复杂性可能是一件好事,也可能是一件坏事。评估复杂性可以基于所涉及的应用程序/系统的数量、人工干预的频率以及完成该过程所需的步骤数量。更复杂的流程可能更希望自动化,但也可能更难以自动化。

标准 3:数量

高容量的活动需要更多考虑自动化,因为它们会带来更高的 ROI。

标准#4:标准化和稳定性

人工智能应用主要集中在狭义人工智能上。因此,自动化要求过程依赖于基于规则的决策,而不需要计算机做出主观选择。在可预见的未来,主观选择是人类的事情。

标准 5:外包的难度

需要更多控制和自主权的流程不能外包。如果准确性和控制是重中之重,内部自动化策略可能是合适的。

摘要

一般来说,自动化非常适合可重复、高容量、耗时、基于规则的流程,并且将证明设置和维护自动化的费用是合理的。

自动化将如何发生?

人工智能一点也不像电影。我们还没有接近这样一个时代,你可以和 Siri 对话,让她即时创建一个“类似优步”的移动应用。人工智能和智能自动化的浪潮将增加计算机与计算机之间的交互数量,而不是人与计算机之间的交互。一个滑稽的例子是谷歌 Android 操作系统的自动来电过滤。当我收到一个烦人的机器人电话时,Android 会为我屏蔽电话并接听。结果是两个软件机器人进行了对话。听起来像是瑞克&莫蒂剧集中的一个笑话。

在商业意义上,这通常以脚本的形式调用应用程序接口(API) 来执行动作。脚本是一组指令,告诉一台计算机联系另一台计算机来执行所需的操作。常见的 API 包括 Twlio 的 SendGrid 和 Okta,前者根据特定规则发送电子邮件,后者在登录 web 应用程序时实现用户身份验证。API 变得如此重要,以至于它们支持着数十亿美元的公司(例如 Twilio、Okta、Stripe)。

谈到数据科学,谷歌发布了机器学习算法,比如他们的图像分类器,可以很容易地集成到软件中。微软有Azure Machine Learning Studio,这是 Azure 中的一个无代码工具,可以构建简单的机器学习模型。

说到无代码工具,这些工具到处都是。如果您想构建一个简单的 web 应用程序,您不再需要成为一名程序员。像 Adobe XD 这样的工具让任何人都可以很容易地为数据产品或 web 应用程序创建快速 MVP。

最酷的无代码软件之一是运行 GPT-3 模型的应用程序。这种人工智能模型允许用户键入问题作为输入,并接收大块的计算机代码作为输出。无论是 GPT-3 还是另一个工具,如果低复杂性功能或应用程序中的代码主要是由狭义人工智能编写的,我们都不应该感到惊讶。这些工具和开源算法只会随着时间的推移而改进。

来源:南方公园推特

哪些工作职责是安全的?

RPA 和 API 将接管大量可重复的流程,这就引出了一个问题,技术专业人员将承担哪些工作职责?在未来 5 到 10 年内,有三种主要的工作职责看起来不会受到自动化的影响。这些预测的一个重要前提是假设我们仍然处于企业向云迁移的早期阶段。

流#1:自动化创建者和支持团队

自动化不是瞬间产生的,也不是免费的。所有自动化都是由大量数据和技术专业人员创建和维护的,不管你是否看到他们*。如前所述,API 优先的公司雇佣了数千名数据和技术专业人员。随着对这些接口的依赖越来越大,我预计对这些职位的需求只会增加。看看 Stripe 的职位空缺,你会看到数百个软件工程师的职位(如后端工程师、fullstack 等。).需要软件工程师来构建、维护开源算法和 API,并将其集成到数据产品或 web 应用程序中。

如果机器人过程自动化起飞,对 RPA 专家的需求将激增。生产一个 UiPath 工作流需要需求收集、开发自动化过程和生产自动化过程方面的专家。UiPath 列出了他们在 UiPath 学院的几条不同的职业道路。几年后,人们可以看到 UiPath 在招聘信息中的应用会像现在的 Tableau 或 PowerBI 一样无处不在。

对于这个群体来说,一个很好的经验法则是,任何头衔中带有“工程师”或“开发人员”的人都更安全,不会受到自动化的威胁,因为他们是构建者。除了建筑工人,你还需要专业人员来支持和促进他们的工作。我们将它们称为使能因素。我们将需要以下的建设者和推动者:

  • 建筑商
  • 构建和维护支持构建或自动化流程的工具(如 UiPath、API 等)。)
  • 将 API 和开源算法集成到 web 应用程序/数据产品中
  • 构建、生产 RPA 工作流并为其提供支持
  • 使能器
  • 自动化需求的需求收集
  • 自动化用例的决策者和预算决策
  • 自动化开发的项目和产品经理
  • 数据质量和数据治理专家确保数据(和自动化触发器)准确可靠

流程#2:不符合自动化标准的流程

并不是每一个过程都符合设置和维护自动化版本的标准。对于数量少、定义模糊、需要主观决策和/或不容易标准化的流程,自动化不值得花费成本。以下是一些难以自动化的工作职责和潜在的职称:

作者图片

流程#3:数字化转型团队

因为我们正处于向云转变的早期阶段,所以可以预期对实现这种数字化转型的专业人员或自动化的需求会很高。数字转换可以分为三层:

  1. 云基础设施
  2. 数据工程
  3. 数据科学

行业向云的转移将需要能够建立云基础设施、支持持续维护并保持其安全性的技术专业人员。这将要求对云专业知识、开发运维以及网络安全的需求水平不断提高。

基础设施之上的下一层是数据工程。随着数据量呈指数级增长,对获取、清理、存储和移动这些数据的专业技能的需求将会持续增长。在保持质量的同时,快速移动大量数据将是组织多年来的一项需求。这方面的职位头衔通常包括数据工程师、分析工程师、BI 工程师、分析经理和数据经理。

一旦你有了值得信赖的数据,你将需要熟练操作、分析、可视化和建模数据的人。如果不全面了解可以从数据和数据之外的得出什么样的见解,你就无法做出数据驱动的决策。

虽然数字化转型团队的工作职责至少在未来五年内仍将是必要的,但人们可以很容易地想象自动化会减少需求。软件很可能会减少在这个流程中执行许多过程所需的人工劳动的总时间。例子包括如下:

  • 加速探索性数据分析的软件
  • 通过无代码工具(如 H2O、数据机器人)运行 ML 模型
  • 人工智能算法使一些数据清理/工程过程自动化(例如,完美)
  • 软件可以自动创建数据可视化
  • 监控和检测软件可以实现云工程和网络安全的自动化

这个流程的工作职责是(三个中)最容易被自动化替代的。

谁来负责?

在思考未来的时候,考虑工作职责比考虑职称更有益。职称变动频繁,而工作职责更稳定。后者有更多的信号。这类似于在做出长期投资决策时,只关注股票的市场价格,而非其背后的基本面。

五年前,一个称职的数据分析师只需要是 Excel 和/或 SQL 方面的专家。如今,最好的数据分析师应该能够胜任一套技术和方法。这个列表通常包括 Python、R、SQL、Tableau、PowerBI 和机器学习概念。

数据科学家的职位发布终于开始找到一些稳定性。正如我在上一篇文章中提到的,将工作职责分为决策科学家/分析师和软件工程师的趋势仍在继续。

普通的“商业”角色将变得更加技术化。我注意到我的许多没有传统 STEM 背景(或职称)的朋友正在承担更多以数据为中心的责任。由于对理解数据的压倒性需求,典型的“商业”专业人员将被要求学习更多关于软件开发和数据科学的概念和工具。对于商科本科生来说,仅仅胜任基本的 Excel 和描述性统计已经不够了。数据分析、数据科学和信息技术课程变得更加基础。

来源:百事可乐 Linkedin

最后的想法

引导我对未来技术专业人员角色进行预测的两个主要驱动因素是向云的长期转变,以及组织希望通过尽可能自动化来减少劳动力支出。在接下来的十年里,我设想这样一个世界:自动化带来的最安全的工作职责将是那些从这两项技术变革中受益的人。主要受益者将是那些构建和维护自动化的人,那些支持数字化转型的人,以及那些角色需要主观决策的人。将这些流转化为职称,我认为以下技术专业人员的职业道路是自动化最安全的。

  • 软件工程师
  • 软件销售工程师/其他销售角色
  • 技术项目/产品经理
在投资界,讨论一家公司是否有护城河是很常见的,护城河是指他们相对于竞争对手保持竞争优势的能力。数据和技术专业人员拥有的最大护城河是他们对继续学习和提高技能的强烈渴望。如果你想避免 AI 取代你,我建议你让学习成为你生活中的一个常数
数据通才
数据分析职业顾问

*在 IT 群体中有一个流传已久的笑话,即没有人认识或看到 IT 团队。这是因为他们的办公室在地下室。

  • *公民开发人员是新一波专业人员的一部分,他们可以在软件的帮助下履行技术职责(例如 RPA 公民开发人员、Alteryx 上的公民数据科学家、不用代码工具构建 MVP 等)。)

你希望提升哪种数据科学技能?

原文:https://towardsdatascience.com/which-data-science-skill-are-you-looking-to-level-up-cbe1d097624b?source=collection_archive---------21-----------------------

在数据科学和机器学习等快速变化的领域,向你的工具包添加新技能有时可能会让人感到不知所措:你如何选择下一步?你是专注于一些实际的和工作相关的东西,还是通过最新的研究拓展你的视野?你探索一个全新的领域,还是建立在现有的兴趣上?

虽然我们不能为你回答这些问题,但由于我们的作者社区,我们可以提供令人兴奋的、多样的、通常意想不到的选择。以下是我们本周想要强调的几个。

  • 了解模型优化不同方法的好处Bradley Stephen Shaw 的实践教程从新的角度涵盖了模型优化这个始终重要的话题。他将使用贝叶斯方法在 LightGBM 模型中调整超参数的结果与他从仔细的特征工程中获得的结果进行了比较,并得出了一个令人惊讶的结论。

安妮·斯普拉特在 Unsplash 上的照片

  • 让你的图表更引人注目 我们都已经内化了视觉叙事在数据科学中的重要性,但即使你的图表和图形已经很清晰,也总会有更多东西需要探索。Parul Pandey 向我们展示了如何给可视化注入额外的个性,创建看起来像手绘的 xkcd 风格的图表(而不牺牲可读性)。
  • 确保所有利益相关者都能理解你的回复 如果没有人能找到完成给定任务所需的资料,即使是最聪明、最努力的数据团队也会浪费数百个小时。露西·罗斯韦尔前来救援。她介绍了一种快捷的捷径,可以为任何回购建立一个通用的结构,让团队中的同事能够自助获取他们需要的数据和代码。
  • 找到更有效的方法掌握 Python 。我们只能第一次学到一样东西一次,但是我们在这个过程中犯的错误对我们自己和他人的成长都是有价值的。 Nicholas 回顾了他早期与 Python 的斗争,并分享了他所学到的经验,以便刚刚起步的数据科学家可能会有比他更顺利的体验。
  • 填补你时间序列预测知识的空白 。迟早,大多数数据科学家的任务是获取历史数据,并用它来预测未来的情景。马特·索斯纳对 ARIMA(自回归综合移动平均线)模型的深入研究首先奠定了必要的基础,然后耐心地带领我们了解几种常见的实际应用。
  • 从一个整洁的作物测绘项目中获得灵感 。即使你的兴趣不在农业、农作物或劳工问题上,从一个结合了技术知识和创造力来解决复杂问题的端到端项目中,你总能学到很多东西。典型的例子: Madeline Lisaius洛克菲勒基金会的工作,利用卫星数据绘制手工收割的作物,以更好地检测产量的变化。

我们希望你本周能抽出时间来学习一些新的东西,或者在你感兴趣的领域扩展你的知识;如果你想教 TDS 社区一些你擅长的东西,你真的应该——我们很乐意听到你的意见。

直到下一个变量,
TDS 编辑器

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

在 2021 年,哪些数据科学技能是最重要的?

原文:https://towardsdatascience.com/which-data-science-skills-are-the-most-vital-in-2021-88ae9e76b560?source=collection_archive---------17-----------------------

市场在找什么技能,新的一年该拿什么?

(图片由作者提供)

介绍

对于像数据科学这样不断发展变化的领域来说,很容易理解为什么有时在任何给定的时间很难获得最受欢迎的工具。成为一名数据科学家的一个关键部分是研究并熟悉在任何给定时刻可供您使用的现代技术。你永远不知道什么时候你可能需要一个你以前从未使用过的工具、函数或模块,因此需要首先学会如何使用它。这就是为什么我们大多数人读数据科学!

数据科学学科的最大障碍是它在过去几年中的巨大增长。近年来,数据科学已经从一个相对不太知名的领域变成了未来十年最热门的工作。也就是说,生态系统也在快速发展。这意味着,如果你没有站稳脚跟,很难不被超越。

雇主可能会在数据科学家身上寻找几个关键属性,但最重要的一个是你熟悉的技术。也就是说,熟悉模仿《摩登原始人》中的脚车的技术可能远不如 TensorFlow 这样的东西有价值。

因为这个市场和生态系统在不断发展,所以很难确定雇主实际上希望在自己的解决方案中利用的最新技术到底是什么。幸运的是,由于我们是数据科学家,我们可以继续在互联网上寻找关于这个主题的数据,并找到比我们可能需要知道的更多的关于特定语言、软件包和软件的数据科学技能的最新工作需求。

找到一个完美的“数据科学技术”数据集并不完全可行,所以下面的概述来自我的经验。也就是说,这些也是全面列出的工作要求,对数据科学来说本质上很重要。另一件需要记住的重要事情是,数据科学领域也是一个发展非常迅速的领域。这意味着,尽管这些技术在第一季度、第三季度或第四季度可能非常受欢迎,但它们可能不会再被使用。因此,考虑到这一点,我也想就技术在这方面的地位提供我个人的见解。

受欢迎的技能

有许多行业标准工具是任何有抱负的数据科学家都希望熟悉的。使用这些工具的经验几乎总是作为工作列表的一项要求,因为它们很可能是你将在内部使用的工具。至少,在您有机会体验这些工具之前,熟悉这些工具提供的概念会使它们更容易使用。

计算机编程语言

首先,如果你还不知道 Python,我建议你学习它。尽管在数据分析领域肯定有 R,SAS,甚至 Julia 的工作,但大多数工作将会寻找那些精通 Python 的人。这并不是说没有其他语言是有用的,因为不同用途的工具集合总是最佳的。如果我要建造一个花园,我想用的不仅仅是铲子——尽管做更多的工作,我还是能完成它。

Python 是科学计算的当前行业标准。这是有充分理由的,因为几乎任何事物的 Python 生态系统都是无与伦比的。另一件很棒的事情是 Python 的采用使得它非常容易掌握。对于那些门外汉,我当然会说拿起 Python,因为它会对你有很大帮助!

分析学

至于分析方面,技术通常不会直接列出。然而,这仅仅是因为当涉及到制作具体的可视化时,任何包都是可行的——这取决于您想要做什么。因此记住这一点,最好是获得一组不同的库用于数据可视化。分析过程的另一个重要步骤当然也是统计。

我想说的是,特别是熟悉 Python 的 SciPy 将会对你被录用非常有帮助。在分析方面,雇主正在寻找真正的量化结果。统计测试是执行测试的最简单方法,可以获得真正的定量结果。此外,这些统计技能将发展成为你的机器学习技能。

数据

至于数据,无论使用哪种编程语言,对数据有一个复杂的理解是很重要的。也就是说:虽然大多数语言都有相似的数据类型,但是用你喜欢的语言使用它们很可能会完全不同。掌握如何实际处理观测数据的复杂基础知识,对于清理数据和实际制作有效的管道来说,将会很方便。

也就是说,对于 Python 来说,像 NumPy 和 Pandas 这样的包对于处理数据是绝对必要的。如果您想要处理复杂的观察集并训练大型模型,那么首先非常好地学习如何用您最喜欢的编程语言管理数据可能更为重要。虽然数据科学的一个重要部分是机器学习,但职位名称中不包含机器学习是有原因的。首先,数据科学家处理数据,然后进行科学研究。考虑到这一点,如果没有对数据操作的正确理解,甚至很难建立并运行一个模型。处理数据也是擅长机器学习最重要的一步。

在数据方面,另一件重要的事情是理解数据是如何处理和存储的。在了解了数据湖、库和表之后,您还应该知道如何查询这些数据,并将其放入代码中进行测试。能够用数据进行算术运算是很棒的,但是当你没有数据时,它就变得非常无用。

此外,无论是来自记录的数据、生成的数据还是最常请求的数据,数据聚合算法都很重要。使用 API 并能够以许多非传统的方式检索数据对于任何数据科学家来说都是必不可少的。

机器学习

在机器学习方面,虽然像构建神经网络这样的一些更高级的概念可能很酷,但在许多情况下,使用典型的、更多的黑盒模型可能是最佳的。我认为这意味着一个数据科学家至少应该具备这两方面的知识。虽然我不认为这些技能是有价值的,因为大多数时候它们是建立在其他技能之上的(尤其是在行业中),但大多数工作可能会要求 Python 开发人员至少有类似 Sklearn 的经验。

开发运营

开发运营是一项经常被忽视的数据科学技能。所有的模型都有一个目的,通常这个目的是为了部署那些相应的模型。因此,虚拟环境管理往往会成为您的数据科学团队的重要组成部分。这些至关重要的基本技能可能也有助于编程,但主要是经验将有助于构建更复杂的数据解决方案。

如果你不知道任何一部分是如何组合在一起的,那么使用已经在使用的开发-运营实现可能会很困难。至少,知道如何使用终端和熟悉 CLI 对于许多数据科学来说是绝对必要的。实际上,我在一年前写了一篇关于为什么这如此重要的文章,你可以在这里查看:

在你的生态系统中

很难接触到大量的数据科学家,因为他们经常使用不同的语言。也就是说,对于你的特定语言,如果你还没有的话,可能有一些工具是你想在 2021 年学会的。根据我放在工作列表上的内容,以及我在工作列表上看到的内容,我会说这些是对他们各自的语言来说最重要的学习包。

计算机编程语言

  • NumPy
  • 数学
  • 科学情报
  • 熊猫
  • 张量流
  • Sklearn
  • Matplotlib/Seaborn
  • Plot.ly
  • 克拉斯
  • Pytorch
  • PySpark

朱莉娅

  • 情节
  • Makie
  • 数据帧
  • 牛虻
  • MLJ
  • 车床
  • GLM
  • 流量
  • Knet

稀有

  • 发光的
  • ggplot2
  • 数据表
  • dplyr
  • tidyr
  • 针织工

C++

  • Xtensor
  • OpenCV
  • 将军
  • 张量流

当然,这不是一个学习如何使用的模块列表,而是给出了一个人们可能期望使用的生态系统的概念。例如,Seaborn 和 Matplotlib 有很多相同的功能,所以你可能不需要知道这两者,但知道如何制作统计图表是绝对必要的。

未来

预测像数据科学这样快速变化的领域的未来可能相当困难。然而,我们每天都可以看到技术发展的迹象。对于这个列表中的大多数行业标准工具——tensor flow、Python、Pandas——它们很可能会存在并使用很长时间。我怀疑我们工作的整个生态系统会走向何方,而且肯定不会很快。

也就是说,新的编程语言 Julia 拥有许多有趣的前景,可能暗示着数据科学的未来。需要明确的是,这对 Python 的地位没有任何意义,但对 Python 旁边的其他语言的角色来说可能有意义。

我认为在数据科学的世界里,每天都有很多有趣的事情发生。对于像我这样喜欢不断学习新事物的人来说,这是一件很棒的事情,但它也可能令人担忧,因为为了跟上行业的步伐,很难知道在任何给定的时间点你应该做什么。

2021 年开发者对哪些数据库环境感兴趣?

原文:https://towardsdatascience.com/which-database-environments-are-of-interest-to-developers-in-2021-7482f718f47a?source=collection_archive---------51-----------------------

2021 年开发人员对数据库环境的预期使用分析

2021 年数据库管理系统使用统计的词云—作者图片

介绍

近年来,世界上人工智能在工业和研究中的使用都有所增加。毫无疑问,人工智能日益增长的相关性导致了对不同人工智能应用领域专家的需求。这些专家需求领域包括软件开发人员、机器学习工程师、数据科学家和数据库管理员。此外,上述专业领域的工作需要计算机编程、数据库管理系统、统计学和矩阵代数等领域的技术知识,这是必不可少的。在本文中,我只关注数据库管理系统的使用。更准确地说,我让人们知道了预计在 2021 年将在软件开发者中流行的数据库环境。

在揭示数据库环境将如何流行时,我使用了 2020 年的 Stack Overflow 年度开发者调查数据集。我使用这些数据集的原因是,在过去的十年中,Stack Overflow 年度开发者调查已经成为世界上最大、最值得信赖的专业软件开发人员社区。因此,有必要了解这些软件开发人员对 2021 年软件开发人员中流行的数据库环境的看法。

进行的调查有来自 182 个国家和地区的 64,461 名受访者。调查问题分为以下几个部分:基本信息、教育、工作和职业、技术和技术文化、堆栈溢出使用以及社区和人口统计。调查中提出了 61 个问题。一些问题包括:

你住在哪里?

在过去的一年中,您在哪些协作工具上做了大量的开发工作,在接下来的一年中,您希望在哪些工具上工作?(如果您已经使用了该工具,并希望继续使用,请选中该行中的两个框。)

但是我最感兴趣的问题是

在过去的一年中,您在哪些数据库环境中做了大量的开发工作,接下来的一年您希望在哪些环境中工作?(如果你们都使用过数据库,并且希望继续使用,请勾选该行的两个框。)

按国家和大洲分列的调查对象分布情况

在回答兴趣问题之前,我想了解一下

调查中回答者的分布如何与其国家相对应(分别为。以及这种分布是否很好地代表了这些国家的人口。大洲)?

在第一小节(调查对象在各国的分布情况),我根据调查对象所在的国家介绍了我的调查结果。第二小节(按国家分列的调查对象分布情况)给出了与调查对象所在大洲相对应的调查结果。

按国家分列的调查对象分布情况

在这一小节中,我将对下面的问题提出我的发现。

调查对象的分布如何与其国家相对应?

用来回答这个问题的数据集部分是国家列,询问受访者他们住在哪里?

下图 1 显示了按居住国降序排列的调查受访者的百分比。人们可以看到,美国记录的最高调查受访者人数为 19.46%。接下来的四个国家依次是印度、英国、德国和加拿大,分别为 13.11%、6.08 %、6.07%和 3.42%。

图 1:根据国家的调查受访者数量和百分比(仅显示至少 1%的受访者的国家)—按作者分类的图片

提出了一个后续问题,以了解调查对象的分布如何与其居住国相对应。这是通过了解

答卷人数最多的国家在多大程度上代表了各自国家的人口?

为了回答上述问题,我引入了一个新的量,称为受访者密度,它衡量的是给定各自国家人口后受访者的密度。准确地说,它由下面的公式给出:

图 2:回答者密度公式——作者图片

我使用由 Tanu N Prabhu 提供的 2020 年人口数据集来获得 Stack Overflow 年度调查数据集中所代表的国家的人口。

下面的图 3 显示了我的分析结果。从中可以看出,有趣的是,瑞典、荷兰、以色列、加拿大和英国是受访者密度排名前五的国家。因此,可以说来自这些国家的调查答卷人的数量很好地代表了他们国家的人口。

图 3:调查受访者在受访国家的百分比和受访者密度(仅显示受访者至少占 1%的国家)——按作者分类的图片

另一方面,美国虽然记录了 19.46%的调查受访者,但根据受访者的密度衡量,排名第八位。印度占调查受访者的 13.11%,按受访者密度衡量排在第 16 位。在这两个国家,人们可以假设那里的软件开发人员对调查不感兴趣。也可以说,从这两个国家的结果来看,在本次调查中,没有多少软件开发商能够很好地代表他们各自的国家。虽然这些可能是明智的猜测,但我想知道我得出这个结果的简明原因。或许在进行进一步的研究以获得一个具体的答案,为什么这是一个明显的例子,我将是出路。

调查对象在各大洲的分布情况

在这一小节中,我将呈现我对上一小节中讨论的可能的后续问题的分析结果。即,

哪个洲的受访者人数最多?

我使用了由柴坦尼亚·戈卡莱创建的国家大陆数据集,将调查受访者所在的国家按照各自的大陆进行分组。

调查结果见下图 4。

图 4:各大洲的调查受访者数量和百分比——按作者分类的图片

从上面的图 4 中可以看出,接受调查人数最多的是欧洲大陆,占 38.5%,其次是美洲、亚洲、非洲和大洋洲,分别占 29.08%、25.59%、4.21%和 2.44%。

与上一小节中提出的第二个问题一样,我引入了受访者密度度量,将其限制为调查受访者在各大洲的人口。这里感兴趣的问题如下:

前一个问题的结果在多大程度上代表了调查对象所在的大陆?

从下图 5 可以看出,大洋洲的答卷密度最高。因此,来自该大陆的受访者比来自其他被调查大陆的受访者对调查更感兴趣。

图 5:各大洲的调查受访者百分比和受访者密度——按作者分类的图片

调查受访者对数据库环境的使用情况

在本节中,我将介绍我对以下主要问题的调查结果:

在过去的一年中,您在哪些数据库环境中做了大量的开发工作,接下来的一年您希望在哪些环境中工作?(如果你们都使用过数据库,并且希望继续使用,请勾选该行的两个框。)

在调查数据集中,对于标有 DatabaseWorkedWithdatabasedesinerextyear 的列,也提出了同样的问题。调查受访者的回答显示,在全球范围内,有 14 种不同的数据库管理系统(DBMS)受到软件开发人员的欢迎。其中包括:

Cassandra
couch base
DynamoDB
elastic search
Firebase
IBM DB2 Maria db
微软 SQL Server MongoDB
MySQL
Oracle

本节的其余部分分为两个小节。在第一小节(2020 年调查受访者对数据库环境的使用情况)中,我介绍了我对 2020 年之前感兴趣的问题的调查结果,第二小节重点介绍了 2021 年的调查结果。

2020 年受访者对数据库环境的使用情况

在这一节中,我将展示我对标有 DatabaseWorkedWith 的专栏中感兴趣的问题的发现。在这一栏中,调查受访者被要求指出他们在 2020 年之前进行了大量开发工作的数据库环境。换句话说,我对下面这个问题感兴趣。

调查对象中最受欢迎的数据库环境是什么?

下面的图 6 显示了截至 2020 年底所有调查对象对各种数据库管理系统的使用情况。

图 6:截至 2020 年底,调查受访者使用数据库环境的百分比—按作者分类的图片

从上面的图 6 中可以看出,受访者在过去一年(即 2020 年底前)进行了大量开发工作的五大流行数据库环境是

MySQL—20.07%
PostgreSQL
—13.03% 微软 SQL Server—11.90%
SQLite**—11.24**********

有趣的是,尽管 MongoDB 与其他数据库环境(如 Oracle DBMS )相比,是最近数据库社区的新产物之一,但在调查受访者中,它已经上升到前五名 DBMS。在下一小节中,我将探究一下 2021 年 MongoDB 可能会有多流行。

在下面的图 7 中,我们可以看到这五大数据库管理系统在最具代表性的国家中的排名。

图 7:2020 年排名前五位的国家/地区的数据库管理系统使用百分比——按作者分类的图片

从上面的图 7 可以看出, MySQL 仍然是排名靠前的国家中使用最广泛的数据库环境,除了俄罗斯联邦,在俄罗斯联邦 PostgreSQL 排名第一,其竞争对手 MySQL 排名第二。人们还可以看到,MySQL 在巴基斯坦、印度和意大利被广泛使用。

在所有这些国家,五大数据库管理系统中至少有两个存在竞争。波兰是 MySQL 有竞争对手的唯一国家。它的竞争对手是 PostgreSQL 。在美国、印度、荷兰、澳大利亚和意大利, PostgreSQL微软 SQL Server 的使用存在竞争。 MongoDB 在以色列排名第二,在加拿大和法国与 SQLite 竞争。

2021 年受访者对数据库环境的使用情况

最后,我根据调查对象在数据集中标为 DatabaseDesireNextYear 的一栏中给出的答案展示了我的发现。这里有趣的问题是

明年,也就是 2021 年,受访者希望在哪些数据库环境中工作?

下图 8 显示了 2021 年数据库管理系统使用情况的预期排名。

图 8:截至 2021 年底,调查受访者使用数据库环境的百分比—按作者分类的图片

从上面的图 8 可以看出,2021 年最受软件开发人员欢迎的五大数据库环境是:

PostgreSQL—14.30%
MongoDB—12.96% MySQL—12.73%
Redis
—9.69%
********

将此处看到的 2021 年的结果与上一小节中显示的 2020 年的数据进行比较,可以看出 PostgreSQL 很有可能在 2021 年受到来自世界各地的受访者的欢迎。得出这一结论的原因是,其使用量预计将增长 1.27%。从而以 14.30%的排名从 2020 年的 13.03%的第二名上升至第一名。

接下来是 MongoDB ,令人印象深刻地从 2020 年的第五位上升到 2021 年的第二位,上升幅度为 3.43%。这是一个很好的进步。考虑到 MongoDB在 2020 年和 2021 年之间仅上升了三位,一个可能要探讨的问题是,MongoDB 在未来几年是否会成为全球受访者中最受欢迎的数据库环境。

MySQL 从 2020 年的第一位下降到 2021 年的第三位,降幅为 7.36%。因此,在世界范围内,MySQL 很有可能在 2021 年变得不那么受欢迎。

接下来是 2020 年受访者中排名第六的 Redis 。它以 3.09%的增幅排名第四,预计将于 2021 年在全球范围内受到软件开发商的欢迎。它在 MongoBD 之后排名第二,预计在 2021 年也会大受欢迎。

最后, SQLite 下降了 2.41%,从 2020 年的第四位跌至 2021 年的第五位。调查对象也认为数据库管理系统在世界范围内失去了受欢迎的程度。

从调查结果可以明显看出,在全球范围内, Microsoft SQL Server 很有可能不受调查对象的欢迎。我之所以得出这个结论,是因为微软 SQL Server 以 3.91%的差距从 2020 年的第三位跌落到 2021 年的第七位。

图 9 显示了调查中代表性最强的国家对同一问题的调查结果。

图 9:2021 年排名前五位的国家/地区的数据库管理系统使用百分比——按作者分类的图片

将上面的图 9 与图 7 相比较,我们可以观察到 PostgreSQL 在 2021 年仍然会在俄罗斯流行。对于美国、英国、德国、加拿大、法国、巴西、荷兰、波兰、澳大利亚、瑞典和土耳其,也可以预测 PostgreSQL 的受欢迎程度。也就是说, PostgreSQL 很有可能在 2021 年在这些国家的受访者中流行起来。

在印度、西班牙、巴基斯坦和以色列的受访者中,MongoDB 预计将成为 2021 年最受欢迎的 DBMS。在土耳其、巴西、西班牙和意大利, MongoBDPostgreSQL 竞争。印度和巴基斯坦是个例外,在那里你可以看到 MongoDB 正在与 MySQL 竞争。

有趣的是,意大利是唯一一个预计 MySQL 在 2021 年保持流行的国家。比较 2020 年和 2021 年的 MySQLPostgreSQL 以及 MySQLMongoDB 之间的差异,可以说,在意大利, MySQL 的密切竞争对手,即 PostgreSQLMongoDB 可能会在 2021 年接管。

结论

这项调查的大多数受访者居住在以下国家之一:美国、印度、英国、德国和加拿大。

使用受访者密度测量,我发现来自以下国家的受访者对调查最感兴趣:瑞典、荷兰、以色列、加拿大和英国。也就是说,他们很好地代表了他们的人口。尽管美国和印度有更多的受访者,但其受访者的密度值表明,他们没有像预期的那样很好地代表其人口。

在洲一级,欧洲成为接受调查人数最多的洲。另一方面,根据答复者密度衡量,大洋洲是唯一得到充分代表的大陆。

在全球范围内, MySQL 在 2020 年底之前一直是受访者中最受欢迎的数据库环境。尽管 2020 年有这个记录,但是 PostgreSQL 很有可能在 2021 年超过 MySQL 。此外,人们对 2021 年的 MongoDBRedis 的兴趣预计会上升。这项研究中没有探究产生这种兴趣的原因。尽管如此,了解这个原因还是很有趣的。我的调查结果还显示,预计 2021 年微软 SQL Server 将不再受调查对象的欢迎。

值得注意的是,这项研究的发现是观察性的,而不是彻底的正式研究。然而,它们引出了有趣的面向商业的研究问题,这些问题不仅指向软件开发者,而且指向生产这些数据库管理系统的公司。无论您属于哪一类,是软件开发人员还是数据库管理系统的生产者,问题仍然存在:

你认为什么样的数据库管理系统会在 2021 年流行起来?

关于这些分析和更多的技术细节,请点击这里查看我的 Github 链接。

哪种编码器最适合随机森林精度?浮点数还是序数?

原文:https://towardsdatascience.com/which-encoder-is-the-best-for-random-forest-accuracy-float-or-ordinal-ea7ba7ee697d?source=collection_archive---------19-----------------------

基尼指数随机森林分类器上分类编码器的比较。

(src =https://unsplash.com/photos/50bzI1F6urA

介绍

O 处理分类数据和问题的最常见模型类型之一是随机森林分类器。这是有充分理由的,因为它相对容易使用,不需要太多努力就可以产生一些非常惊人的结果。随机森林分类器使用一种称为基尼指数的统计指标来种植节点,以分析数据和结果之间的某些一致性。

处理这类数据时,需要处理连续的要素是很常见的,但在不是这种情况的情况下,我们需要将分类值转换成某种数字形式,以便计算机可以实际分析它。为此,通常使用编码器。编码器获取典型的文本或分类数据,并将其转换成一种新的形式,有时具有惊人的准确性性能,这取决于用什么模型对什么数据处理什么类别。也就是说,我真的想尝试一下,了解一下哪些不同类型的编码器可以更好地处理基尼指数,以便在我们的随机森林分类模型中获得最高的准确性。

笔记本

我的预测是,顺序编码器的性能将超过浮点和标签编码器。我之所以估计这个案例,部分是因为我在这个课题上的经验。以我的经验来看,顺序编码对于基于基尼指数的预测非常有效,而在许多其他分类模型中,一种热编码可能是最合适的解决方案。我估计这是因为一个热点将创建更多的特征来作为我们节点的基础,这将把我们的胡萝卜放入几个基于布尔的篮子中,而不是只保留一个集合编码的特征。另一方面,float 编码器只是简单地将字符转换成数字,所以本质上它要做的事情和 ordinal 编码器一样,对每个类别应用唯一的值。我认为序数编码器在这方面仍将领先的原因是,序数编码器不会有可能具有高方差且本质上是任意的高数字,它不会浪费任何连续的空间,使我们的评估者更容易跟踪我们总体中的数字。如果你想了解更多关于这三种编码器的信息,你可以在这里查阅我写的这篇关于这三种编码器的文章,甚至是如何用 Julia 编写它们:

依赖性和数据

对于这个项目,我们将使用模型和编码器的 Lathe.jl 实现。这将有助于降低依赖性,并为我们将要使用的每个工具提供一致的方法。此外,我们将使用 DataFrames.jl 和 CSV.jl 来读入我们要处理的数据。

这个过程的第一步是读入我们的数据。为此,我们将使用 sink 参数和 CSV.read()方法。如果你想了解更多关于水槽的论点,我也有一篇关于它的文章,你可以在这里找到:

我为这个项目选择的数据是 2008 年发生在亚特兰大的犯罪数据集。让我们继续往下读:

using CSV
using DataFrames; df = CSV.read("atlcrime.csv", DataFrame)

现在我们已经有了数据,我删除了缺失的值,然后继续使用我为此项目选择的两个要素创建了一个新的数据框:

df = dropmissing(df)
df = DataFrame(:crime => df[!, :crime], :neighborhood => df[!, :neighborhood])

现在,为了了解我们将在这里处理多少个类别,我将集合类型转换为数组。然后,我打印了这些内容的长度,给出了一些类别,因为我们可能不希望我们的目标有比我们的功能更多的类别:

println(length(Set(df[!, :crime])))

犯罪特写最终有 11 个不同的类别。

println(length(Set(df[!, :neighborhood])))

邻域要素最终有 243 个不同的类别,因此对于我的目标,我最终选择了犯罪要素。现在,我们可以使用 Lathe.preprocess 中的 TrainTestSplit()方法将我们的特征分成两个不同的集合,以便使用以下内容进行训练和测试:

using Lathe.preprocess: TrainTestSplit
train, test = TrainTestSplit(df)

现在,我要让我们的火车和测试 x 和 y 的数据框架,并进入一维数组:

target = :neighborhood
feature = :crime
trainX = train[!, feature]
trainy = train[!, target]
testX = test[!, feature]
testy = test[!, target]

请注意,在 DataFrames.jl 的新版本中,这些调用将返回 PooledDataArray 类型。Lathe 专门处理 Julian 数组类型,而不是抽象数组类型,所以这意味着我们肯定需要改变这一点。当然,我们可以通过简单地将数组类型转换成它们来实现:

trainX = Array(trainX)

浮点/标签编码器

现在我们将使用 Lathe.preprocess 的 FloatEncoder 对这个新数组中的标签进行编码。

using Lathe.preprocess: FloatEncoder

FloatEncoder 是车床内部的一种类型,是编码器类型的子类型。更进一步,我们也可以说这是一个车床预处理器。这意味着我们可以期望从这个调用中返回一个类型,而不是结果编码数组。为了获得数组,我们需要从类型内部调用 predict()函数:

fetX = FloatEncoder().predict(trainX)

现在我们有了我们的特性,我们还需要将数组类型转换到我们的目标上:

trainy = Array(trainy)

最后,我们将使用来自 Lathe.models 的 RandomForestClassifier 类型。与编码器一样,我们将使用新类型调用 predict 方法。当然,我们也想对我们的测试 X 进行编码:

using Lathe.models: RandomForestClassifier
model = RandomForestClassifier(fetX, trainy)feteX = FloatEncoder().predict(Array(testX))
y_hat = model.predict(feteX)

现在,我们可以使用 Lathe.stats 中的 catacc 方法以基于百分比的精度验证该模型:

using Lathe.stats: catacc
catacc(y_hat, testy)

低得可笑(图片由作者提供)

顺序编码器

与 float 编码器一样,这个过程的第一步是初始化编码器,并在我们的数组上调用 predict()函数。唯一的区别是,这一次我们需要提供数组作为参数来创建类型。这将创建查找字典,稍后用于对结果进行编号。

using Lathe.preprocess: OrdinalEncoder
ordenc = OrdinalEncoder(trainX)
oetX = ordenc.predict(trainX)

和以前一样,我们将使用这些数据来拟合 RandomForestClassifier:

model = RandomForestClassifier(oetX, trainy)

然后在使用相同的序号编码器对特征进行编码后调用预测函数:

oeteX = ordenc.predict(testX)
y_hat = model.predict(oeteX)

现在我们将像以前一样使用 Lathe.stats.catacc 验证结果:

catacc(testy, y_hat)

作者图片

结论

虽然我们用顺序编码器得到了基本的精度提升,但这还在误差范围内。也就是说,这不应该是一个巨大的惊喜。这两种编码器做的事情基本相同,但方式不同。我最初的意图是将这些预测与来自一键编码器的结果进行比较,但是在这方面仍然有一些问题需要解决。谢谢你看我的文章!

OpenCV 和 TensorFlow 哪个更适合你的机器学习任务?

原文:https://towardsdatascience.com/which-is-better-for-your-machine-learning-task-opencv-or-tensorflow-ed16403c5799?source=collection_archive---------4-----------------------

其中一个真的比另一个好吗?一位同时使用这两种框架的 ML 工程师的解释。

由作者制作

背景

我每天上网寻找机器学习和计算机视觉的内容。我喜欢了解 ML 领域的最新动态,因为这是一个几乎每天都能给你带来惊喜的领域!

我遇到过几次的一个问题是:

OpenCV 和 Tensorflow 哪个好?

对一些人来说,这不是一个合理的问题。

对其他人来说,这是一个值得思考的问题。

最简单的回答就是 Tensorflow 比 OpenCV 好,OpenCV 比 Tensorflow 好!

希望没有让你困惑!如果我知道,请继续读下去!

事实是,这些框架中的每一个都注定要用于机器学习和计算机视觉的特定领域。所以,直接说一个比一个好,就是没有意义。

但是我们可以说,在某些方面,一个比另一个好,反之亦然。

其实 Tensorflow 是一个机器学习框架,帮助你建立机器学习模型。它更出名的是建立神经网络,这是机器学习中的一种算法和方法,称为深度学习。

因此,Tensorflow 已经发布,以服务于一个主要目的,即建立机器学习模型。在这里,我说机器学习而不仅仅是深度学习,因为已经有一些努力让 Tensorflow 能够训练非深度机器学习模型,如决策森林

另一方面,OpenCV 是一个计算机视觉框架,可以帮助你对图像和视频进行各种处理。自发布以来,它一直是图像处理任务中广泛使用的工具。它使您能够轻松地操作像素,因此如果您愿意,您可以构建自己的图像和视频处理算法。

随着深度学习的兴起,OpenCV 通过引入一个名为https://docs.opencv.org/4.5.2/d2/d58/tutorial_table_of_content_dnn.html(深度神经网络)的新模块,开始集成更多支持基于深度学习的任务的功能。

这个 DNN 模块旨在使其易于集成已经训练过的深度学习模型。这就是为什么你会在 OpenCV 中找到如何整合深度学习模型的例子:图像分类、图像对象检测和图像分割。

现在,正如你所看到的,所有这些例子都是专注于计算机视觉任务的深度学习模型。

据我所知,没有对语言模型的支持,例如(如 BERT )。

现在,这两个框架在特定情况下可以有一些相似之处。例如,使用 Tensorflow,您可以操作图像,并为训练您的机器学习模型做准备。

OpenCV 也可以用来做一些机器学习的任务。例如,您可以在 OpenCV 中训练 SVM 模型、逻辑回归模型或视觉单词包模型。

何时使用哪个

来源:pexels.com

现在,来看看这两个广泛使用的框架的用例。

如果你正在为一些特定的任务和自定义数据集建立一个新的深度学习模型,那么 Tensorflow 应该是你的选择。

如果你已经完成了为计算机视觉任务训练深度学习模型,特别是:图像分类,物体检测和图像分割,并且你正在寻找部署你的模型,那么 OpenCV 可能是一个不错的选择。

Tensorflow 和 OpenCV 都有 C++和 Python APIs。

在 Tensorflow 中,机器学习工程师使用 Python API 进行训练,他们使用 C++ API 在 C++应用程序/API/SDK 中部署他们的模型。

但是正如我之前提到的,OpenCV 可能 是一个很好甚至更好的部署选择,原因如下。

现在很多公司已经用 OpenCV 很久了。这些公司正在开发计算机视觉产品。他们非常习惯于框架,他们不想在他们的产品代码中添加另一个第三方库(另一个依赖)。在这种情况下,他们可能会选择使用 OpenCV 来部署他们的计算机视觉深度学习模型。

OpenCV 成为生产部署的更好选择的另一个非常重要的方面是 性能 。事实上,对于一些深度学习模型来说,在 OpenCV 中运行它们可以比在 Tensorflow 中运行它们快一个数量级(即使使用 Tensorflow 的 C++ API)。

对于某些行业来说,这可能是一个关键点。

另外,关于这两个框架的 c++ API 的另一件事是 文档 。OpenCV 的文档比 Tensorflow 的 C++ API 的文档要好得多(即使我们这里只是说 DNN 模块)。

使用 OpenCV 而不是 Tensorflow 的最后一点是,使用 OpenCV,您可以用 C++训练 SVM 模型。这意味着在相同的生产代码中,您可以训练一个模型并部署它。

结论

总结一下:

  1. Tensorflow 在某些用例上优于 OpenCV,OpenCV 在其他一些用例上优于 Tensorflow。
  2. Tensorflow 的强项在训练方面。如果您将模型作为 C++应用程序/API/SDK 的一部分进行部署,OpenCV 的优势在于部署方面。
  3. 这两个框架的主要重叠点发生在计算机视觉任务中。

作者制作的图像

我是一名机器学习工程师,致力于解决具有挑战性的计算机视觉问题。我想帮助你学习应用于计算机视觉问题的机器学习。以下是方法。

  1. 通过帮助您了解该领域的最新动态。我几乎每天都在 、LinkedIn、Twitter****上分享小型博客帖子。那就跟我去吧!****
  2. 每周给你一份我的 时事通讯 上那些琐碎帖子的摘要。所以订阅吧!
  3. 通过在 Medium 上写关于机器学习不同主题的文章。所以跟我来吧!
  4. 给你一份免费的机器学习工作清单,帮助你检查你需要学习的所有要点,如果你计划在 ML,特别是在计算机视觉方面的职业生涯。你可以在这里 获得核对表

5.最后但同样重要的是,通过与你分享我的 免费入门张量流课程 ,它有超过 4 小时的视频内容,你可以在那里问我任何问题。

此外,如果您有任何问题或者您只是想聊聊 ML,请随时在 LinkedIn 或 Twitter 上联系我!

Python 线程和进程哪个更快?一些有见地的例子

原文:https://towardsdatascience.com/which-is-faster-python-threads-or-processes-some-insightful-examples-26074e90848f?source=collection_archive---------5-----------------------

理解大数据

一系列的例子解释了线程和进程的优缺点。用 Dask 代码做你自己的实验。

乔纳森·肯珀在 Unsplash 上的照片

如果你正在阅读这篇文章,你可能已经在试图找出 Python 中线程和进程之间的区别,以及何时应该使用它们。为了解释一些关键差异,我将展示一些示例函数,并分析使用线程和进程运行它们需要多长时间。重要的是,我将讨论为什么线程和进程在每种情况下有不同的计时。

我将使用 Dask 来运行使用线程和进程的示例函数。关于如何用 Dask 做到这一点的更多细节在文章的底部。现在,我将把重点放在线程和进程的区别上。

1。激活 GIL 的功能

让我们从一个简单的函数开始,只是一个 Python for-loop 。它采用一个参数n,该参数是循环中重复次数的整数。

def basic_python_loop(n):
    """Runs simple native Python loop which is memory light 
    and involves no data input or output."""
    mydict = {}
    for i in range(n):
        mydict[i%10] = i
    return None

这个函数只创建一个 10 个条目的字典,所以使用很少的内存,并且对 CPU 的要求不高。你的计算机实际上会花大部分时间解释 Python 代码,而不是运行它。

下图显示了执行功能basic_python_loop(n=10_000_000) 16 次所需的时间。相比之下,运行这个函数只需要 0.8 秒。

作者图片

在图中,对该函数的 16 次调用中的每一次调用都被分配了一个任务编号 1-16。橙色阴影条显示了每个函数调用开始和结束的时间。例如,左边面板中的task 8开始计算后开始~5 秒,并一直运行到 5.6 秒。顶部的蓝条显示了完成所有 16 个函数调用所需的全部时间。

图中的三个面板使用简单的循环、多线程和并行处理对函数进行计时。

完整的 16 部分计算使用线程花费的时间与使用循环花费的时间相同。有趣的是,使用线程时,每个单独的任务都要花费更长的时间。这是因为全局解释器锁(GIL)在 Python 中,一次只有一个线程可以读取代码。这是 Python 语言的核心特性,但大多数其他编程语言没有这种限制。这意味着你读到的关于多线程的其他文章可能不适用于 Python。

在 Python 中,线程的工作就像一组厨师共享一本食谱。假设他们要准备 3 道菜(3 个线程),有 3 个厨师(你电脑上的 3 个内核)。厨师会从食谱中读出一行,然后去完成它。一旦他们完成了这一步,他们就排队阅读下一步。如果食谱中的步骤很短(就像在一个基本的 Python for-loop 中一样),厨师会很快完成它们,因此会花费大部分时间等待轮到他们阅读食谱。因此,每一份食谱的制作时间都比厨师单独阅读这本书的时间要长。

上面显示的 16 个任务使用 3 个线程运行,这意味着同时处理 3 个函数调用(3 个配方)。由于步骤很简单(就像访问字典一样),线程花费大部分时间等待读取 Python 代码。因此,尽管我们同时运行 3 个函数调用,但每个调用都要花 3 倍的时间来完成。所以这里使用多线程没有任何好处!

在图中,您可以看到在完成所有 16 个任务时,进程比使用循环或多线程快了大约 3 倍。当使用进程运行时,每个单独的任务花费的时间与使用循环运行时一样长。这是因为每个进程都有自己的 GIL,所以进程不会像线程一样互相锁定。

在 Python 中,并行处理就像一个厨师团队,但是每个厨师都有自己的厨房和食谱。

2.从 CSV 加载数据

在这个函数中,我们从一个目录中加载一个随机选择的 CSV。目录中的所有 CSV 大小相同。

def load_csv():
    """Load, but do not return, a CSV file."""
    # Choose a random CSV from the directory
    file = np.random.choice(glob.glob(f"{temp_dir}/*.csv"))
    df = pd.read_csv(file)
    return None

作者图片

线程和进程花费的时间差不多,而且都比使用循环要快。在这个函数中,与前一个不同,线程完成的每个任务与循环完成的任务花费的时间相同。但是为什么线程不会因为 GIL 而变慢呢?

在这个函数中,大部分时间花在运行行pd.read_csv(file)上。这个函数使 Python 运行一大块 C 代码来从文件中加载数据。当运行这个 C 代码时,一个线程释放 Python 解释器,以便其他线程可以读取 Python 代码,并且它在完成加载之前不需要再次读取 Python 代码。这意味着线程不会像上一个例子那样互相锁定。他们并不都在努力一次读懂代码。

NumPy、scipy 和 pandas 中的大多数函数都是用 C 语言编写的,因此它们也会导致线程释放 GIL,避免相互锁定。

在食谱-烹饪的类比中,这就像食谱中有一个步骤说“揉面团 5 分钟”。这个指令读起来很快,但要花很长时间才能完成。

3.使用大量 CPU 的数字函数

下一个函数使用 NumPy 创建一个随机数组,并求它的逆。基本上,这只是一个计算量很大的计算。

def numpy_cpu_heavy_function(n):
    """Runs a CPU intensive calculation, but involves 
    no data input or output."""
    x = np.linalg.inv(np.random.normal(0, 1, (n,n)))
    return None

这个函数的时序如下所示,使用n=2000使得数组的形状为 2000x2000。

作者图片

奇怪的是,无论是使用线程还是进程,我们都没有获得很大的加速。但是为什么呢?在前面的例子中,我们获得了 3 倍的加速,因为所用的计算机有 3 个内核。这是因为 NumPy 本身使用多线程,使用多核。这意味着当你试图使用线程或进程并行运行这些 NumPy 函数时,你会受到计算能力的限制。每个内核都试图招募额外的内核来运行其 NumPy 计算。因此,一旦所有内核都以 100%的速度运行,就没有办法从它们那里获得更多的计算能力。

4.具有大量输入或输出的功能

到目前为止,我们使用的函数要么没有输入参数,要么输入参数只是一个整数。当我们有大量的输入或输出时,进程和线程之间的一个关键区别就显现出来了。

def transfer_data(x):
    """Transfer data into and out of a function."""
    return x*2

在上面的函数中,我们将传入一个数组x,并返回一个 doubled 数组。在下面显示的结果中x是一个 10,000x1000 大小的数组,内存为 80 MB。

作者图片

在这种情况下,线程完成任务用了 0.36 秒,循环用了 0.51 秒,但是进程用了 14 倍多的时间。这是因为进程都有自己独立的内存池。当我们将数组x传递到函数中,并使用进程运行它时,x必须从主 Python 会话复制到每个进程中。这花了大约 3.5 秒。一旦复制了数组,进程可以非常快速地将数组翻倍,但是将翻倍的数组复制回主会话又需要 3.5 秒。与此相反,线程与主 Python 会话共享相同的内存空间,因此不需要再来回复制数组。

在厨师类比中,过程就像三个厨师,每个人都有自己的食谱和自己的厨房。厨房在不同的地方,所以如果我们想让厨师运行一些食谱,我们需要把配料带给他们,然后他们可以烹饪这道菜,我们需要去收集这些菜。有时,使用线程并让它们在同一个厨房烹饪菜肴会更容易,即使这意味着它们必须阅读同一本食谱。

线程与进程——简要总结

让我们总结一下:

  • GIL 意味着一次只有一个线程可以读取 Python 代码。这意味着多个线程可能会相互锁定。
  • 像在 NumPy、SciPy 和 pandas 函数中一样,使用对 C 代码的外部调用意味着线程在运行这些函数时将释放 GIL。这意味着线程不太需要等待机会来读取代码。
  • 每个进程都有自己的内存池。这意味着将大量数据复制进或复制出它们的速度很慢。例如在大型输入数组或数据帧上运行函数时。
  • 线程与主 Python 会话共享相同的内存,因此不需要在它们之间来回复制数据。

这些导致了一些加速计算的经验法则。

  • 首先,关于数据传输。如果你的函数接收或返回大量数据,使用线程;否则你会浪费太多时间传输数据。然而,问问你自己,你真的需要数据作为参数吗,你能在函数中加载数据吗?如果是这样,那么您仍然可以使用进程。
  • 接下来是 Python 循环。如果您的函数必须使用简单的本地 Python 循环,那么使用进程。然而,问问你自己,这些循环可以用 NumPy 数组操作代替吗?如果是这样,您仍然可以使用线程。
  • 如果您正在使用计算开销很大的 NumPy/etc 操作,那么您可能不会从使用线程或进程中获得太多好处。

使用线程运行函数,使用 Dask 运行进程

在这篇文章中彻底覆盖 Dask 会让它太长,所以相反,我会覆盖必要的部分,并将 链接到一个笔记本 ,这样这些情节就可以重现了。

如果你感兴趣,我在 DataCamp 上还有一个 Dask 课程 在那里我会用互动视频和练习更全面地介绍 Dask。该课程的第一章是免费的,大约需要 30 分钟,涵盖了下面和笔记本中使用的所有 Dask。

我们可以使用 Dask 来运行使用线程或进程的计算。首先,我们导入 Dask,并使用dask.delayed函数创建一个延迟评估结果的列表。

import daskn = 10_000_000lazy_results= []
for i in range(16):
    lazy_results.append(dask.delayed(basic_python_loop)(n))

请注意,函数basic_python_loop实际上还没有运行,因为它是延迟求值的。相反,只存储了运行它的指令。

我们可以使用多线程来运行计算,例如:

results = dask.compute(lazy_results, scheduler='threads')

或者可以使用多重处理来运行计算,例如:

results = dask.compute(lazy_results, scheduler='processes')

这些是最简单的方法,但是在本文的实验中,我希望对使用的线程和进程的数量有更多的控制。为此,您可以创建一个客户机,它设置了一个进程和/或线程池,您可以用它来完成计算。

例如,要创建和使用 3 个进程的池,可以使用:

process_client = Client(
    processes=True, 
    n_workers=3, 
    threads_per_worker=1
)results = process_client.compute(lazy_results)

一些类似的故事和进一步的阅读

我从 Brendan Fortuner 几年前的文章中获得了很多灵感。事实上,我在这里所做的很多都是重现他的例子,但我想比他写的原始文章更深入一点。

https://medium.com/@bfortuner/python-multithreading-vs-multiprocessing-73072ce5600b

如果你在代码中大量使用原生 Python 循环,那么你绝对应该使用 Numba 。它可以将这些循环加速到接近 c 的速度。最好的是,如果你正确使用 Numba(见笔记本)你可以设置它,这样你的循环函数就不会锁定 GIL。这意味着你可以使用你的 Numba 循环函数,它已经快得多了,并与多线程并行运行。

最后,我们在本文中得出的使用线程和进程的经验法则与这里描述的 Dask 最佳实践非常相似。

哪些 NBA 新秀会成为全明星?

原文:https://towardsdatascience.com/which-nba-rookies-will-become-all-stars-1cdeb198afab?source=collection_archive---------26-----------------------

使用随机森林模型来预测哪些新秀有一天会进入全明星队

图片由基思·艾利森维基共享资源上提供

在 2010/11 NBA 赛季中,有两名球员打出了同样稳定但不起眼的新秀赛季。埃文·特纳,2010 年 NBA 选秀的第二顺位球员,在每场 23 分钟的比赛中得到 7.2 分。与此同时,在同一选秀中第 10 顺位的保罗·乔治,每场比赛 21 分钟,得到 7.8 分。然而,从那时起,他们的职业生涯走上了截然不同的道路。保罗·乔治参加了 7 场(还在继续)全明星赛,同时成为 NBA 最危险的双向球员之一。虽然特纳在 NBA 又打了 9 年,但他大部分时间都是作为一名平庸的替补球员度过的。

我打算回答的问题很简单:我能建立一个统计模型,把这两个球员和他们的新秀赛季区分开来吗?

数据和代码

数据取自篮球参考。从“三分时代”(1979/80 赛季起)开始,我总共训练了 1300 个新秀赛季的模型。赛季至少有 30 场比赛,每场比赛 7 分钟。我使用的最后一个新秀赛季是 2010/11 赛季,因为从那时起出道的新秀可能仍然有机会成为全明星,如果他们还没有成为全明星的话。在这 1300 名球员中,有 197 人最终在职业生涯中至少入选了一支全明星队。

数据和代码可在 my GitHub 上获得。我使用 randomForestROCR 软件包在 R 中执行所有分析。

模型

我将使用随机森林分类器。随机森林是一种灵活的学习方法,它使用许多决策树来对观察值进行分类。每个决策树包含随机选择的 mₜᵣᵧ预测特征。决策树的模式结论成为模型的分类。

总的来说,该模型被训练有 13 个特征:

  • 每场比赛的时间
  • 每场比赛得分
  • 场均进攻篮板
  • 场均防守篮板
  • 每场比赛的块数
  • 每场抢断
  • 场均助攻数
  • 有效投篮命中率(根据相应赛季的平均水平进行标准化)
  • 罚球命中率
  • 年龄
  • 进攻方加减(OBPM)
  • 防守方加减(DBPM)
  • 使用率
  • 周转率

拟合和调整模型

在最初用 750 个决策树拟合模型之后,可以对其进行一些调整以提高模型性能。我要优化的超参数是 mₜᵣᵧ,即每棵树的特征数量。我将 mₜᵣᵧ设置为最小化袋外(OOB)误差。正如你在下面看到的,4 是我的数据的神奇数字。

既然模型适合 mₜᵣᵧ=4,让我们来看看结果。

该模型的 OOB 估计误差率为 12.54%。简而言之,我预计这个模型有 12.54%的时间猜错。

我们还可以查看随着树数量的增加,误差如何变化:

起初,增加树的数量减少了 OOB 误差。然而,它很快稳定在略高于 12%的水平。750 棵树足以最大限度地发挥这种模式的潜力。

该混淆矩阵显示了该模型如何根据真实结果对玩家进行分类:

毫不奇怪,这个模型的猜测有相当大的误差。在真实世界的全明星中,模型有三分之二的时间会错过他们。

下面的图表显示了每个特征对于分类的重要性。左边的图表显示,如果删除任何一个特征,精度就会下降。右边的图表显示了基尼系数(衡量节点杂质的指标)的下降。在这两个图表中,顶部的特征最重要,而底部的特征最不重要。

最重要的指标是每场比赛的上场时间和得分。防守篮板(DRB)比我想象的要重要得多。令人惊讶的是,有效投篮命中率和罚球命中率都可以从模型中移除,而精确度几乎没有损失。由于这两个变量高度相关,因此任何一个变量的损失对模型的影响都很小。然而,这两个特征的损失使得模型的准确性大大降低。

由于 OBPM 在两个排行榜上都高于 DBPM,这似乎也证实了在全明星赛中进攻比防守更重要。然而,框加减度量可以是对性能的粗略度量。虽然得分等统计数据也可以衡量进攻,但防守价值更难以量化。最近的高级统计在使用更高级的追踪来测量防御方面取得了很大的进步,但是这些统计在这里没有足够大的样本可用。最终,很难说防守是否对全明星赛没有什么影响,或者我们只是没有很好地衡量防守。

评估该模型的一种方法是使用下图所示的受试者工作特征(ROC)曲线。该图显示了在不同的辨别阈值下假阳性率如何变化。在默认函数下(在此模型中使用),阈值为 0.5。虽然这是可以修改的,但我对默认设置很满意。

ROC 曲线下的面积(AUC)可用于查看模型的有用程度。AUC 可以在 0.5 和 1 之间。AUC 为 0.5(曲线遵循上面的灰色虚线)表示该模型根本无法区分所有恒星和非所有恒星。AUC 为 1 表示模型可以完全区分。该模型的 AUC 为 0.818,这是令人尊敬的。

改进模型的一个选择是加入来自高级玩家跟踪技术的统计数据。然而,由于该数据仅从 2013/14 赛季开始收集,因此这还不是训练模型的现实选择。

另一个考虑可以是增加一个特征来说明他们球队的实力,因为与弱的重建队相比,好的前景可能在竞争的球队中发挥得更少。

有趣的数据点

在这篇文章的开始,我想知道一个模型是否能区分埃文·特纳和保罗·乔治的新秀赛季。最终,该模型认为保罗·乔治有 33%的机会成为全明星,埃文·特纳有 7.5%的机会成为全明星。虽然它仍然将两人归类为非全明星球员,但我很满意它能够确定两人是有意义的不同。

在训练样本的球员中,模型给了蒂姆·邓肯最高的赔率——超过 96%的机会成为全明星。这并不奇怪;邓肯在新秀赛季是全明星。这个模型也给了沙奎尔·奥尼尔(94.3%)和加索尔(93.3%)很高的赔率。

最大的假阳性是克拉克·凯洛格,该模型给出了几乎 90%的机会成为全明星。凯洛格在新秀赛季场均得分超过 20 分,但膝伤很快阻碍了他。他的职业生涯在仅仅五个赛季后就结束了,而且他从未超过他新秀赛季的平均得分。在光谱的另一端,该模型给贾森·威廉姆斯和里基·皮尔斯 0%的赔率,但这两名球员继续出现在一个单一的全明星赛。

最后,下面是这个模型如何处理几个年度最佳新人的:

对 2020 年选秀班的预测

最后,我们可以使用模型对未来进行一些预测。如果这个模型负责重新起草 2020 年的职业,它会这样做(排除一些小样本玩家):

虽然该模型没有发现任何全垒打的前景,但它准确地预测了两名全明星球员(泰瑞斯·哈利伯顿和拉梅洛·鲍尔)将从这一组中产生。混乱矩阵的结果表明,很可能还有其他人潜伏在狼群中。

结论

评估前景是篮球运动中最困难的任务之一。那么你能根据新秀赛季预测所有的球星吗?答案是有些。虽然新秀赛季可以给我们一个体面的想法,职业生涯仍然可以采取一些非常不可能的路径。很可能有更多的优秀球员(甚至是全明星球员)潜伏在这个平庸的新秀池中,这个模型还无法区分。

更好的数据可能会有所帮助。2013/14 赛季开始使用的球员跟踪技术为我们提供了比以往任何时候都更详细的 NBA 球员数据。这有可能使我们做出比以前更准确的预测。然而,我们还没有足够大的样本来充分利用这些数据。

哪些 NBA 球队最擅长选秀?

原文:https://towardsdatascience.com/which-nba-teams-are-best-at-drafting-20070ccd1702?source=collection_archive---------6-----------------------

一项数据驱动的分析对每个 NBA 球队的选秀成功进行了排名

图片来自维基共享资源上的全职业卷轴

注:这里有一个 新仪表板 可以查看数据。这篇文章在 2022 年 6 月 14 日更新了新的数据和数字,以及方法的改进。

选秀是一个成功的 NBA 球队最困难也是最关键的因素之一。从 1998 年到 2019 年,圣安东尼奥马刺队创纪录地连续 22 次季后赛出场,并在此过程中赢得了五个冠军。这种不可思议的运行是由一系列强有力的选秀权推动的,其中许多是在彩票之外。

在光谱的另一端,萨克拉门托国王队现在已经连续 16 个赛季错过了季后赛——这是 NBA 的记录。不出所料,这个分析显示了国王队一贯糟糕的选秀记录。

在这个分析中,我创建了一个衡量标准,通过将他们与之后选中的球员进行比较来对每个选中的球员进行评分(完整的方法在文章结尾提供)。每个球员的分数不仅取决于他们自己的表现,还取决于球队放弃了什么来选择他们。在对过去 12 次 NBA 选秀(从 2009 年到 2020 年)进行分析后,持续选秀的球队与不选秀的球队之间出现了明显的差异。

结果

在被分析的 849 名球员中,尼古拉·约基奇脱颖而出。在被选中之前,乔基奇已经被传了四十多次,在他的前七年里,他已经连续获得了 MVP。另一方面,马文·巴格利的排名比所有其他选秀状元都要差。

总的来说,选秀分数以零为中心——这是一个相当典型的既不差也不好的选秀分数。这些选秀权中有许多是第二轮选秀权,期望值低,相应的价值也低。

五大选秀状元:

正如所料,顶级选秀是中后期选择的一些顶级球员。同样值得注意的是弗雷德·范弗利特(多伦多猛龙),得分 3.7,第 7 高,排名第一的未选秀球员。

另一方面,底部的五个选择主要是没有成功的高选择。

当巴格利还年轻的时候,萨克拉门托放弃了卢卡·东契奇、小贾伦·杰克逊和特雷·杨。选择巴格利的巨大机会成本是他得分低的原因。

詹姆斯·怀斯曼是一个异数——他的 NBA 生涯才开始两年,他就因伤错过了整个第二个赛季。他的排名很低,主要是因为勇士队没有选中拉梅洛·鲍尔(在他的第二个赛季已经是全明星了)。虽然怀斯曼有足够的时间来恢复他的选秀分数,但他的选择已经被设定得很高了。

多伦多猛龙队仍然是 NBA 中遥遥领先的最佳选秀球队,而萨克拉门托国王队和克利夫兰骑士队则排名垫底。

不出所料,圣安东尼奥马刺队排名第二,其他一些长期竞争者也接近榜首。

如果排除未选秀的球员,多伦多仍然是第一,尽管差距较小。

在活跃的总经理中,孟菲斯灰熊队的扎克克雷曼拥有迄今为止最好的选秀记录(尽管迄今为止只有 6 个选秀权)。在样本量较大的人当中,马赛乌吉里(多伦多猛龙)高居榜首。

大多数至少有 5 个选秀权的活跃高管在起草方面至少比平均水平好一点。这可能是因为不擅长起草的高管被解雇了,而更擅长起草的高管却被保留了下来。

包括至少有五个选秀权的非活跃高管,拉里·伯德(印第安纳步行者队)排在克雷曼和乌吉里之后,弗拉德·迪瓦茨和克里斯·格兰特垫底。

方法学

这里有一个完整的仪表盘,你可以自己查看和探索完整的数据集(按团队、球员或负责起草的高管)。

总结

该指标的目标是衡量团队和高管识别人才的能力。

这种方法背后的中心思想相对简单:为了评估选秀选择,球员应该与可供选择的球员进行比较。如果有更好的球员,那么选秀会被认为是糟糕的。如果更好的球员没有可用——或者被选得太早以至于在那个选秀位置没有被现实地考虑——那么选秀选择是一个好的选择。

在那个位置被选中的球员通常表现如何并不重要——事实上,你会发现这种方法有时会将被认为令人失望的球员评为体面的选秀权,因为接下来被选中的球员甚至更差。例如,安德鲁·威金斯实际上得到了一个正的选秀分数,因为克里夫兰避免了选贾巴里·帕克(第二顺位),他比克里夫兰差得多。

因此,每个被选中的球员的表现都要与之后被选中的球员的加权平均值进行比较。距离较近的球员比距离较远的球员被赋予更高的权重,因为他们更有可能被认为是那个位置的替代者。

彩票选择(#1 到#14)也根据选择的“明显”程度而打折扣。如果一名球员是一致同意的第一选择,那么这个选择既不好也不坏,因为任何球队都会做出同样的选择。

球员包括

所有被选中的球员(从第 1 名到第 60 名)都包括在内。未选秀的球员也包括在内,如果他们在符合条件的一年后的第一个赛季就进入了花名册。如果它们是后来签署的,则不包括在内。

一旦两个完整的季节过去,就会增加新的征兵年份。

团队归属

一些调整是围绕哪些球队的选秀权来进行的。虽然一名球员被正式列在了他们被选中的球队名下,但如果他们在选秀之夜或下一个赛季开始前的任何时候被交易,我会把选秀权归于他们被交易到的球队。此后的任何交易都不会影响归属。

未选秀的球员归属于他们签约的第一支球队。

衡量玩家表现

虽然该模型的最后一次迭代使用获胜份额来衡量球员的表现,但现在使用 BBall Index 中的 LEBRON Wins Added (WA)指标来衡量球员的表现。这个指标比传统的高级统计数据更全面,应该能更准确地捕捉 NBA 球员的价值。然而,这一指标只适用于 2009 赛季至今,限制了对 2009 年选秀的分析。

任何低于零的 WA 值都将被替换为零。一个打得很差的球员不应该被认为比一个从来不打比赛的球员更差。

用于比较的加权平均值

为了形成权重,我使用了布朗简单指数平滑模型的稍微修改版本:

其中 V 代表 yd 拔模位置的反事实( C )值( V )。α代表在 d 的平滑因子,它必须在零和一之间。一个高的 alpha 值会将更多的重量分配给靠得更近的玩家,而一个低的 alpha 值会将重量更平均地分配给许多玩家。alpha 乘以玩家在 yd + 1(紧接其后)拍摄的实际值( V )。

但是,alpha 在任何一年内的草稿选择中并不一致(尽管它在不同年份的同一草稿位置中是一致的)。在选秀中,通常只有很少一部分球员可以被选中。在以后的选秀位置上,有大量的球员可以考虑。通过比较实际的选秀位置和 ESPN 对最佳选秀前景的排名可以很容易地看出这一点。在早期选秀位置中,ESPN 排名与实际选秀位置非常接近。到了第二轮,两者之间往往会有巨大的差异。

在统计学中,这种现象被称为异方差,当可变性在值的范围内变化时,就会出现异方差。在这种情况下,在较后的拔模位置可变性增加。

因此,每个拔模位置都有一个唯一的平滑因子。首先,我确定了同一名球员在 2014 年至 2020 年期间每次选秀的实际选秀位置和 ESPN 最佳球员排名之间的绝对差异。在极少数情况下,没有被 ESPN 排名的球员被选中,他们的排名被记录为 101。然后,我找到了每个草稿位置的平均值,并将其回归到实际草稿位置,如下所示:

β系数为 0.317,然后将其输入以下等式,以确定每个吃水位置的α:

这样产生的阿尔法值在以后的选秀位置会下降。与之前的分析版本相比,这种方法为第一轮选秀权提供了相当高的 alpha,但为第二轮选秀权提供了相当低的 alpha。最终的结果是,顶尖选秀权的得分严重依赖于直接被选中的球员的表现,而后面的选秀权的得分则更加平均地与许多球员进行比较。

计算原始选秀分数

alpha 用于计算每个玩家的反事实表现。通过从反事实值中减去实际值,确定每个玩家的净等级。

净评级可以被视为草案选择相对于可能的可用备选方案产生的“超额价值”。虽然该值可以与一年内的其他草案选择进行比较,但不能在年份之间进行比较,因为较旧的草案年份有更多的时间来累积 WA。

为了使选秀分数可以跨选秀年份进行比较,我使用 z 评分法,将每年每个球员的净评分除以该年内净评分的标准偏差来计算原始选秀分数(RDS):

概率得分

最后,彩票选秀权会根据选择的明显程度而“打折扣”。例如,一个一致的第一次整体选秀权(普遍同意该球员应该先去)会被打折扣接近 100%——这意味着无论该球员表现如何,选秀分数都接近于零。不太确定的选秀权(可能有多名球员被选中)会因为积极或消极的结果而受到表扬。

对于分析的这一部分,我欠 Chris Feller 一份感激之情,因为他在这里创造了他的原创分析,这是我的灵感来源,也因为他花时间和我谈论这个项目。

为了估计一个球员在选秀中被选中的概率,我收集了一些专家和作家的选秀板和模拟草稿。

使用 R 中的 PlackettLuce 包,模拟选秀选择符合 Plackett-Luce 排名模型。然后,生成的模型用于为每个草稿创建 10,000 个模拟。

使用模拟,Kaplan-Meier 估计值(一种生存分析的常用方法)用于计算每个彩票选择在他们的实际位置被选中的概率(P ),条件是他们在该点之前没有被选中。

然后,通过条件概率(P)对 RDS 进行贴现,计算出最终草案得分(FDS):

由于数据限制,这一过程仅针对彩票选择(前 14 名)完成,尽管无论如何对以后的选择影响不大。

所有个人草案分数的平均值构成了每个团队和高管的草案分数。

针对高管的贝叶斯估计

每个团队的高管都来自篮球参考。虽然样本量对于团队来说相对较大,但对于高管个人来说通常很小。所以除了正常的选秀分数,我还计算了每位高管的贝叶斯估计。贝叶斯估计将每个分数向平均草案分数收缩。随着每位高管的选秀权数量的增加,他们的贝叶斯估计越来越接近他们的实际选秀得分。当您感兴趣的高管的样本量非常小时,这种估计非常有用。

贝叶斯估计的计算方法如下:

每位高管(e)的贝叶斯选秀得分(B)的计算方法是,将每位高管的缩水权重(W)乘以他们的正常选秀得分(S ),并将其与所有选秀的平均选秀得分(DS)相加,再乘以 1 减去权重。

每位高管的权重计算如下:

其中,高管选秀得分的方差(在那些至少有八个选择的人中)除以方差加(所有选秀得分的平均值除以该高管的选秀次数)。

(我还要感谢我的女朋友玛丽娜,帮我收集和输入草稿板。这是一个耗时的过程,在她的帮助下变得容易了。)

你的哪些特征是过度拟合的?

原文:https://towardsdatascience.com/which-of-your-features-are-overfitting-c46d0762e769?source=collection_archive---------7-----------------------

提示和技巧

发现“ParShap”:一种高级方法,用于检测哪些列使您的模型在新数据上表现不佳

[图片由作者提供]

W 机器学习中最重要的是对新数据做出正确的预测。

当训练数据上的预测很好,但测试数据上的预测很差时,就说模型“过拟合”。这意味着该模型从训练数据中学习了太多的噪声模式,因此它无法很好地推广到它以前没有见过的数据。

过度拟合该怪谁?换句话说,

哪些特性(数据集的列)会妨碍模型对新数据进行良好的概括

在本文中,借助真实世界的数据集,我们将看到一种高级方法来回答这个问题。

功能重要性这次救不了你了!

如果你对上述问题的回答是“我会考虑特性的重要性”,那就再努力一点。

要素重要性并没有说明要素在新数据上的表现。

事实上,它只是模型在训练阶段所学内容的代理。如果模型已经学习了许多关于特征“年龄”的模式,那么该特征将在特征重要性中排名较高。这并没有说明这些模式是否正确(所谓“正确”,我指的是一种足够通用的模式,对新数据也适用)。

因此,我们需要一种不同的方法来解决这个问题。

“曾经有一家德国医院…”

为了解释这种方法,我将使用一个包含从 1984 年到 1988 年德国健康注册记录的数据集(该数据集可以从库 Pydataset 访问,使用 MIT 许可证)。

下载数据非常简单:

import pydatasetX = pydataset.data('rwm5yr')
y = (X['hospvis'] > 1).astype(int)
X = X.drop('hospvis', axis = 1)

该数据集由 19,609 行组成,其中每行包含给定年份的某个患者的一些信息。请注意,对患者的观察跨越不同的年份,因此同一患者可能出现在数据帧的不同行中。

目标变量是:

  • **hospvis**:患者在相应年度内住院时间是否超过 1 天。

我们处理了 16 列:

  1. **id**:患者 ID(1-7028);
  2. **docvis**:一年中看医生的次数(0-121);
  3. **年**:年(1984-1988);
  4. **edlevel**:教育程度(1-4);
  5. **年龄**:年龄(25-64);
  6. **outwork**: 1 如果失业,0 否则;
  7. **女** : 1 如果女,0 否则;
  8. **已婚** : 1 如果已婚,0 否则;
  9. **kids**: 1 如果有孩子,0 否则;
  10. **hhninc**:家庭年收入,单位为马克(马克);
  11. **educ**:正规教育年限(7-18 年);
  12. **自营** : 1 如果自营,0 否则;
  13. **edlevel1**: 1 如果不到高中毕业,否则为 0;
  14. **edlevel2**: 1 如果高中毕业,0 否则;
  15. **edlevel3**: 1 如果大学/学院,0 否则;
  16. edlevel4 `: 1 如果读研,0 其他。

让我们将数据分为训练集和测试集。有更复杂的方法可以做到这一点,如交叉验证,但让我们保持简单。由于这是一个实验,我们将(天真地)把所有的列当作数字特征。

from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifierX_train, X_test, y_train, y_test = train_test_split(
  X, y, test_size = .2, stratify = y)cat = CatBoostClassifier(silent = True).fit(X_train, y_train)

一旦模型被训练,让我们看看特征重要性:

import pandas as pdfimpo = pd.Series(cat.feature_importances_, index = X_train.columns)

训练模型的特征重要性。[图片由作者提供]

不足为奇的是,“docvis”——看医生的次数——对于预测患者是否住院超过 1 天非常重要。“年龄”和“收入”也有些明显。但是病人的 id 在重要性上排名第二的事实应该让我们怀疑,特别是因为我们已经把它当作一个数字特征。

现在,让我们在训练集和测试集上计算模型性能(ROC 下的面积)。

from sklearn.metrics import roc_auc_scoreroc_train = roc_auc_score(y_train, cat.predict_proba(X_train)[:, 1])
roc_test = roc_auc_score(y_test, cat.predict_proba(X_test)[:, 1])

在训练集和测试集上模拟性能。[图片由作者提供]

差别太大了!这是严重过度拟合的迹象。但是哪些特征对此“负责”呢?

听说过 SHAP 价值观吗?

我们有许多指标来衡量一个模型在一些数据上的表现。但是我们如何衡量一个特性在一些数据上的表现呢?

做到这一点的最有力的工具叫做“SHAP 价值观”。

一般来说,要高效地计算任何预测模型的 SHAP 值,可以使用专用的 Python 库。然而,在本例中,我们将利用 Catboost 的本机方法:

from catboost import Poolshap_train = pd.DataFrame(
  data = cat.get_feature_importance(
    data = Pool(X_train), 
    type = 'ShapValues')[:, :-1], 
  index = X_train.index, 
  columns = X_train.columns
)shap_test = pd.DataFrame(
  data = cat.get_feature_importance(
    data = Pool(X_test), 
    type = 'ShapValues')[:, :-1], 
  index = X_test.index, 
  columns = X_test.columns
)

如果你看一下shap_trainshap_test,你会注意到它们是各自数据集的相同形状。

数据帧的形状。[图片由作者提供]

如果你想更多地了解 SHAP 价值观及其运作方式,你可以从这里的和这里的开始。但是——为了我们的目的——你需要知道的是,SHAP 值让你了解每个单一特征对模型在一次或多次观察中做出的最终预测的影响。

让我们看几个例子:

原始数据与相应的 SHAP 值。[图片由作者提供]

第 12071 排的患者已 0 次就诊。相应的 SHAP 值(-0.753)告诉我们,这条信息将他住院超过 1 天的概率(实际上是对数优势)降低了-0.753。相反,排 18650 的患者已经去看过 4 次医生,这将她住院超过 1 天的对数比提高了 0.918。

会见 ParShap

直观地说,数据集上要素性能的一个很好的代理是要素的 SHAP 值和目标变量之间的相关性。事实上,如果模型在一个特征上发现了好的模式,那么该特征的 SHAP 值必须与目标变量高度正相关。

例如,如果我们希望计算特征“docvis”和测试集中包含的观测值上的目标变量之间的相关性:

np.corrcoef(shap_test['docvis'], y_test)

但是,SHAP 值是相加的,这意味着最终预测是所有要素形状的总和。因此,如果我们在计算相关性之前去除其他特征的影响,这将更有意义。这正是“ 偏相关 ”的定义。Python 库 Pingouin 中包含了部分相关的一个方便实现:

import pingouinpingouin.partial_corr(
  data = pd.concat([shap_test, y_test], axis = 1).astype(float), 
  x = 'docvis', 
  y = y_test.name,
  x_covar = [feature for feature in shap_test.columns if feature != 'docvis'] 
)

这段代码意味着“在去除所有其他特征的影响之后,计算特征‘doc vis’的 SHAP 值和测试集的观测值上的目标变量之间的相关性”。

既然每个人都需要一个名字,我就把这个公式叫做【ParShap】(来自“Shap 值的偏相关”)。

我们可以在训练集和测试集上对每个特征重复这个过程:

parshap_train = partial_correlation(shap_train, y_train)
parshap_test = partial_correlation(shap_test, y_test)

注意:你可以在本文末尾找到函数partial_correlation的定义。

现在,让我们在 x 轴上绘制parshap_train,在 y 轴上绘制parshap_test

plt.scatter(parshap_train, parshap_test)

在训练集和测试集上,SHAP 值和目标变量之间的部分相关。注意:颜色条代表特征的重要性。[图片由作者提供]

如果一个特征位于等分线上,这意味着它在训练集和测试集上的表现完全相同。这是最理想的情况,既不过度配合也不欠配合。相反,如果一个特征位于等分线以下,这意味着它在测试集上的表现比在训练集上的表现差。这是过度拟合区域。

从视觉上看,哪些特性表现不佳是显而易见的:我用蓝色圈出了它们。

蓝色圆圈中的要素最容易过度拟合当前模型。[图片由作者提供]

因此,parshap_testparshap_train之间的算术差(等于每个特征和平分线之间的垂直距离)为我们的模型提供了特征过度拟合程度的度量。

parshap_diff = parshap_test — parshap_train

parshap_test 和 parshap_train 之间的算术差异。[图片由作者提供]

我们应该如何解读这个输出?基于我们上面所说的,这个分数越负,特征带来的过度拟合就越多。

“我不相信你”

没关系:你不必!你能想出一个方法来检查这篇文章背后的直觉是否正确吗?

在逻辑上,如果我们从数据集中删除“过拟合特征”,我们应该能够减少过拟合(即roc_trainroc_test之间的距离)。

因此,让我们尝试一次删除一个特性,看看 ROC 下的区域如何变化。

在训练集和测试集上的性能,一次删除一个特征,按特征重要性(左)或 ParShap(右)排序。[图片由作者提供]

左侧,我们一次移除一个特征,按照特征重要性排序。因此,首先删除最不重要的(edlevel4),然后删除两个最不重要的( edlevel4 '和 edlevel1 `),依此类推。

在右侧上,我们遵循相同的过程,但是移除的顺序由 ParShap 给出。因此,首先删除最负的 ParShap (id ),然后删除两个最负的 ParShap (id '和 year `),依此类推。

正如我们所希望的那样,删除具有最大负 ParShap 的特性导致过度拟合的大幅减少。事实上,roc_trainroc_test越来越近了。

请注意这只是一个测试,用来检查我们推理路线的正确性。一般来说,ParShap 不应该作为特征选择的方法。的确,一些特征容易过度拟合的事实并不意味着这些特征根本没有携带有用的信息!(例如,本例中的收入和年龄)。

然而,ParShap 在给我们提示如何调试我们的模型方面非常有帮助。事实上,它允许我们将注意力集中在那些需要更多特性工程或规则的特性上。

本文使用的完整代码(由于随机种子,您可能会获得略有不同的结果):

# Import libraries
import pandas as pd
import pydataset
from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifier, Pool
from sklearn.metrics import roc_auc_score
from pingouin import partial_corr
import matplotlib.pyplot as plt# Print documentation and read data
print('################# Print docs')
pydataset.data('rwm5yr', show_doc = True)X = pydataset.data('rwm5yr')
y = (X['hospvis'] > 1).astype(int)
X = X.drop('hospvis', axis = 1)# Split data in train + test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2, stratify = y)# Fit model
cat = CatBoostClassifier(silent = True).fit(X_train, y_train)# Show feature importance
fimpo = pd.Series(cat.feature_importances_, index = X_train.columns)
fig, ax = plt.subplots()
fimpo.sort_values().plot.barh(ax = ax)
fig.savefig('fimpo.png', dpi = 200, bbox_inches="tight")
fig.show()# Compute metrics
roc_train = roc_auc_score(y_train, cat.predict_proba(X_train)[:, 1])
roc_test = roc_auc_score(y_test, cat.predict_proba(X_test)[:, 1])print('\n################# Print roc')
print('roc_auc train: {:.2f}'.format(roc_train))
print('roc_auc  test: {:.2f}'.format(roc_test))# Compute SHAP values  
shap_train = pd.DataFrame(
  data = cat.get_feature_importance(data = Pool(X_train), type = 'ShapValues')[:, :-1],
  index = X_train.index, 
  columns = X_train.columns
)
shap_test = pd.DataFrame(
  data = cat.get_feature_importance(data = Pool(X_test), type = 'ShapValues')[:, :-1],
  index = X_test.index, 
  columns = X_test.columns
)print('\n################# Print df shapes')
print(f'X_train.shape:    {X_train.shape}')
print(f'X_test.shape:     {X_test.shape}\n')
print(f'shap_train.shape: {shap_train.shape}')
print(f'shap_test.shape:  {shap_test.shape}')print('\n################# Print data and SHAP')
print('Original data:')
display(X_test.head(3))
print('\nCorresponding SHAP values:')
display(shap_test.head(3).round(3))# Define function for partial correlation
def partial_correlation(X, y):
  out = pd.Series(index = X.columns, dtype = float)
  for feature_name in X.columns:
    out[feature_name] = partial_corr(
      data = pd.concat([X, y], axis = 1).astype(float), 
      x = feature_name, 
      y = y.name,
      x_covar = [f for f in X.columns if f != feature_name] 
    ).loc['pearson', 'r']
  return out# Compute ParShap
parshap_train = partial_correlation(shap_train, y_train)
parshap_test = partial_correlation(shap_test, y_test)
parshap_diff = pd.Series(parshap_test - parshap_train, name = 'parshap_diff')print('\n################# Print parshap_diff')
print(parshap_diff.sort_values())

# Plot parshap
plotmin, plotmax = min(parshap_train.min(), parshap_test.min()), max(parshap_train.max(), parshap_test.max())
plotbuffer = .05 * (plotmax - plotmin)
fig, ax = plt.subplots()
if plotmin < 0:
    ax.vlines(0, plotmin - plotbuffer, plotmax + plotbuffer, color = 'darkgrey', zorder = 0)
    ax.hlines(0, plotmin - plotbuffer, plotmax + plotbuffer, color = 'darkgrey', zorder = 0)
ax.plot(
    [plotmin - plotbuffer, plotmax + plotbuffer], [plotmin - plotbuffer, plotmax + plotbuffer], 
    color = 'darkgrey', zorder = 0
)
sc = ax.scatter(
    parshap_train, parshap_test, 
    edgecolor = 'grey', c = fimpo, s = 50, cmap = plt.cm.get_cmap('Reds'), vmin = 0, vmax = fimpo.max())
ax.set(title = 'Partial correlation bw SHAP and target...', xlabel = '... on Train data', ylabel = '... on Test data')
cbar = fig.colorbar(sc)
cbar.set_ticks([])
for txt in parshap_train.index:
    ax.annotate(txt, (parshap_train[txt], parshap_test[txt] + plotbuffer / 2), ha = 'center', va = 'bottom')
fig.savefig('parshap.png', dpi = 300, bbox_inches="tight")
fig.show()# Feature selection
n_drop_max = 5
iterations = 4features = {'parshap': parshap_diff, 'fimpo': fimpo}
features_dropped = {}
roc_auc_scores = {
  'fimpo': {'train': pd.DataFrame(), 'test': pd.DataFrame()},
  'parshap': {'train': pd.DataFrame(), 'test': pd.DataFrame()}
}for type_ in ['parshap', 'fimpo']:
  for n_drop in range(n_drop_max + 1):
    features_drop = features[type_].sort_values().head(n_drop).index.to_list()
    features_dropped[type_] = features_drop
    X_drop = X.drop(features_drop, axis = 1)
    for i in range(iterations):
      X_train, X_test, y_train, y_test = train_test_split(X_drop, y, test_size = .2, stratify = y)
      cat = CatBoostClassifier(silent = True).fit(X_train, y_train)
      roc_auc_scores[type_]['train'].loc[n_drop, i] = roc_auc_score(y_train, cat.predict_proba(X_train)[:, 1])
      roc_auc_scores[type_]['test'].loc[n_drop, i] = roc_auc_score(y_test, cat.predict_proba(X_test)[:, 1])

# Plot feature selection
fig, axs = plt.subplots(1, 2, sharey = True, figsize = (8, 3))
plt.subplots_adjust(wspace = .1)
axs[0].plot(roc_auc_scores['fimpo']['train'].index, roc_auc_scores['fimpo']['train'].mean(axis = 1), lw = 3, label = 'Train')
axs[0].plot(roc_auc_scores['fimpo']['test'].index, roc_auc_scores['fimpo']['test'].mean(axis = 1), lw = 3, label = 'Test')
axs[0].set_xticks(roc_auc_scores['fimpo']['train'].index)
axs[0].set_xticklabels([''] + features_dropped['fimpo'], rotation = 90)
axs[0].set_title('Feature Importance')
axs[0].set_xlabel('Feature dropped')
axs[0].grid()
axs[0].legend(loc = 'center left')
axs[0].set(ylabel = 'ROC-AUC score')
axs[1].plot(roc_auc_scores['parshap']['train'].index, roc_auc_scores['parshap']['train'].mean(axis = 1), lw = 3, label = 'Train')
axs[1].plot(roc_auc_scores['parshap']['test'].index, roc_auc_scores['parshap']['test'].mean(axis = 1), lw = 3, label = 'Test')
axs[1].set_xticks(roc_auc_scores['parshap']['train'].index)
axs[1].set_xticklabels([''] + features_dropped['parshap'], rotation = 90)
axs[1].set_title('ParShap')
axs[1].set_xlabel('Feature dropped')
axs[1].grid()
axs[1].legend(loc = 'center left')
fig.savefig('feature_selection.png', dpi = 300, bbox_inches="tight")
fig.show()

感谢您的阅读!我希望你喜欢这篇文章。如果你愿意,在 Linkedin 上加我

哪支英超球队的主场球迷最有冲击力?

原文:https://towardsdatascience.com/which-premier-league-team-has-the-most-impactful-home-fans-2f1579d424e5?source=collection_archive---------18-----------------------

内森·罗杰斯在 Unsplash 上拍摄的照片。

主场优势一直是足球界被广泛研究的现象。据说好处主要来自减少旅行和主场球迷的出现。主场球迷为他们帮助球队获胜的影响力而自豪。然而,在过去很难确定有多少影响来自球迷。

2020-21 英超赛季的大部分时间都没有球迷。有几场比赛的上座率较低,但没有接近前几个赛季的水平。这给了一个绝佳的机会来确定主场球迷真正有多大的影响力,以及对哪支球队的影响最大。

在这篇文章中,我分析了过去十个赛季的英超历史数据,即从 2012-13 赛季到当前赛季(2021-22)。首先,我会试着回答这个问题:球迷在整个联盟中增加了主场优势吗?然后,我会具体看每支球队,确定哪些球迷对自己球队主场成绩的影响最大。

摘要为那些赶时间的人陈述了关键发现,而细节部分为那些想要更多信息的人提供了关于这些发现的进一步细节。

摘要

2020-21 赛季见证了主场胜率的大幅下降和客场胜率的上升。近十个赛季唯一一次客场胜率超过主场胜率。这表明,总的来说,在整个联赛中,主场球迷对结果有影响。随着粉丝的回归,本赛季的收视率多少回到了疫情之前的水平。

图片作者。

每支球队都计算了主场球迷因素,这是基于 2020-21 赛季英超联赛球队在 2020-21 赛季主场比赛中的分数与之前 8 个赛季的分数相比的比例。

富勒姆被证明有最大的主场球迷因素,这意味着富勒姆球迷的存在对联盟中任何球队的结果都有最大的积极影响。另一方面,南安普顿的得分最低,这意味着南安普顿在没有球迷在场的情况下主场表现更好。图 4 的细节部分显示了所有团队的因素。

图片作者。

主场球迷的出现被证明对比赛结果有积极的影响,对主队有利。然而,体育场容量对主场球迷因素没有影响。这说明粉丝的存在很重要,但数量并不重要。

细节

第一部分:总体

首先,在过去的十个赛季中,主场球迷的影响是跨整个联盟来看的。图 1 显示了本赛季主客场球队的胜率。在疫情之前的八个赛季中,主场胜率从未低于 40%,客场胜率从未超过 35%。事实上,这两个比率从来不会相差 10%以内。

图 1:按赛季划分的主场/客场胜率。图片作者。

对于 2020-21 赛季,客场胜率超过主场胜率,这证明了主场球迷在整个联盟中平均发挥着重要作用。事实上,它甚至可能表明大多数(如果不是全部)主场优势来自球迷,因为旅行因素仍然存在。有趣的是,2019–20 赛季的最后三分之一是在没有球迷的情况下进行的,但主场胜率与往年一致。然而,总体平均上座率并没有明显低于前几个赛季(见附录中的表 1)。

对于 2021-22 赛季,主场率再次提高,但差异没有以前那么极端。随着平均上座率回到疫情之前的水平,这表明了平局的趋势。事实上,提取率(29%)是所有季节中最高的。然而,由于赛季不完整,这可能只是统计上的波动,随着赛季的进行,差异可能会增加。

查看影响的另一种方式是查看自 2012-13 赛季以来的滚动胜率,如图 2 所示。红线表示没有球迷出现在体育场的时间。在此期间,滚动率明显下降。考虑到这一比率是由之前的八个赛季加权得出的,这一下降是相当惊人的。

图 2:最近十个赛季的滚动胜率(%)。图片作者。

所以,下一个问题是:在 2020-21 赛季,这些额外的客场胜利来自哪里?观察主客场进球总数(图 3)可以发现,这两个类别的进球数量多年来一直保持相对稳定。然而,对于 2020-21 赛季,我们看到了最剧烈的变化。虽然仍然有更多的主场进球,但差距现在已经小得多了。事实上,只有四个主场进球。因此,不出所料,客场胜率增加了,因为客场球队得分更多,主场球队得分更少。

图 3:按赛季划分的主客场进球数量。图片作者。

对每个赛季的平均出勤率(如附录中的表 1 所示)和客场赢球率进行学生 t 检验,结果显示出–0.72 的显著相关性(p 值为 0.02 <0.05), suggesting that higher fan attendance leads to a lower away win rate. Hence, we can conclude that the attendance of fans has a statistically significant effect on the away win rate.

第 2 部分:特定团队

在这里,我试图调查每支球队的球迷对他们表现的具体影响。为此,我将把 2020-21 赛季之前的八个赛季直接与 2020-21 赛季进行比较。我不会包括当前的赛季,因为这个赛季是不完整的。我会把疫情之前的赛季分组。这种比较只使用了 2020-21 赛季的球队,不包括利兹联队和谢菲尔德联队,因为他们在疫情之前的赛季中不在英超联赛中。

为了量化球迷的影响,我们可以看看每支球队在疫情之前和 2020-21 赛季之间主场胜率的差异。然而,一个队可能有较低/较高的胜率,仅仅是因为那个赛季的形式不同。相反,我会看一个赛季中主场比赛占总积分的比例。这样,球队的整体形式是不相关的,而是主场形式被认为是相对于客场形式的。我将比较疫情之前赛季和 2020-21 赛季球队主场总得分的比例。两者之间的差异将被称为主场球迷因素(HFF) ,定义为:

图 4 显示了每个团队的 HFF。正值表示该队在 2020-21 赛季主场比赛中的得分比例有所下降,这表明主场球迷通常会产生积极的影响。负值表示相反的情况。当球迷不在场时,整个联盟的主场胜率都下降了,所以 HFF 对大多数球队来说是积极的也就不足为奇了。水晶宫和南安普顿是例外。这两支球队似乎更喜欢在空无一人的体育场里比赛——也许他们也没有处理好球迷的压力。富勒姆和埃弗顿的 HFF 最大。这表明这两家俱乐部的球迷对主场比赛的结果有着最大的影响。

图 4:每支球队的主场球迷因素(HFF)。图片作者。

最后一点,比较 HFF 和每个队的体育场容量,发现没有显著的相关性,如图 5 所示。这表明体育场的大小并不影响主队的表现。事实上,HFF 最大的球队(富勒姆)容量也最低。尽管富勒姆并不以其特别喧闹的氛围而闻名,但与安菲尔德这样的地方相比,球队可能会在压力稍小的情况下比赛。所以,也许在家里最好的表演来自于更温和的氛围。

图 5:体育场容量与每支球队主场得分率的差异。图片作者。

总之,主场球迷的出现降低了整个联盟的平均客场胜率。富勒姆被证明拥有最具影响力的球迷。然而,体育场的容量与 HFF 没有相关性。这表明,虽然球迷的存在很重要,但实际人数相对来说并不重要。

来源:

资料:【https://www.football-data.co.uk/englandm.php

使用的软件:R

延伸阅读:

https://www.sciencedirect.com/science/article/pii/S146902922100131X

附录:

表 1:每季平均上座率。

应该使用哪种 Python 数据结构?

原文:https://towardsdatascience.com/which-python-data-structure-should-you-use-fa1edd82946c?source=collection_archive---------5-----------------------

列表、元组、集合、字典...什么时候使用哪种内置数据结构?

照片由维多利亚诺·伊斯基耶多Unsplash 拍摄

Python 是一种面向对象的编程(OOP)语言。类和对象用于结构化和模块化代码,以便可重用和易于修改。OOP 要求使用数据结构来组织和存储数据,以一种可以被有效访问的方式。

Python 有原语(或基本)数据结构,如浮点、整数、字符串和布尔。Python 还有非原语数据结构,比如列表、元组、字典和集合。非原始数据结构存储各种格式的值的集合,而不是单个值。有些可以在数据结构中保存数据结构,从而增加了数据存储能力的深度和复杂性。

作者照片

在本文中,我们将研究每种内置数据结构,以决定何时使用一种结构优于另一种结构。

什么是可变性?

可变性意味着数据结构中的数据在创建后可以被修改(添加、删除或更改)。可变性是选择数据结构时要考虑的一个重要因素。如果你知道你不需要改变内部状态,考虑使用一个不可变的对象来确保它是线程安全的,并且没有任何东西可以覆盖你的数据。

列表

为了表示按整数位置索引的项目序列,可以使用的一种数据结构是列表。列表包含零个或多个元素,并且可以包含不同类型的元素(甚至是对象!).这使得列表非常强大,因为它们允许您创建深度和复杂的数据结构。

列表是可变的,这意味着您可以灵活地添加、删除或更改元素。另一种顺序数据结构是一个元组;这两者的区别在于元组是不可变的。

因为列表有一个顺序元素:如果你只想跟踪唯一的值而不关心顺序,使用 Python set

使用[]list()创建列表。使用list()进行类型转换。

一些值得注意的方法和技巧

获取列表项: my_list[0]通过偏移获取列表项。像字符串一样,负索引可以用来从末尾向后计数。
my_list[0] = ‘new item'通过偏移改变列表项。
my_list[0:2]通过偏移切片来提取项目。该示例返回my_list的前两个元素。

添加列表项: append()在列表末尾添加一项。
extend()+=将一个列表合并到另一个列表中。
insert()在任何偏移前添加一项。

删除列表项目:
remove()从列表中删除项目值。
pop()删除最后一个(或指定的)元素,同时返回值。
del根据项目在列表中的位置删除项目。del是 Python 语句,不是 list 方法。

join()返回组合列表项的字符串。join()的参数是一个字符串或任何可迭代的字符串序列。
len()返回列表中的项数。count()返回指定值出现的次数。

元组

元组也是一种有序的数据结构,就像列表一样。但是,元组是不可变的;创建元组后,不能添加、删除或更改项目。元组不同于列表,它的函数要少得多,因为它们在定义后不能修改。元组包含零个或多个元素,并且可以包含不同的不可变类型的元素。

元组相对于列表的优势:

  • 元组使用更少的空间
  • 不变性防止错误地更改元组项
  • 元组可以用作字典键
  • 函数参数作为元组传递

使用()或没有括号的逗号分隔的元素列表创建元组。使用tuple()进行类型转换。

一些值得注意的方法和技巧

count()返回一个元素在元组中被找到的次数
index()返回一个元素的索引位置

字典

字典不使用偏移量,而是使用来关联每个值。这意味着顺序是不可跟踪的,如果你打算使用字典的话,这并不重要。字典键是不可变的和唯一的,然而,字典是可变的。可以添加、删除或更改键值元素。简而言之,字典非常类似于散列表

使用{}创建字典。使用dict()进行类型转换。

一些值得注意的方法和技巧

my_dict[‘key’]通过键获取一个项目
my_dict['key'] = ‘value'使用一个键添加(或改变,如果它已经存在)一个值。
update()将一个字典的键和值合并到另一个字典中。
del按提供的键删除项目。del是 Python 语句,不是字典方法。
keys()返回所有字典键。values()返回字典中的所有值。items()返回所有字典键值对。

设置

集合就像一本字典,只有关键字,没有值。这意味着集合是唯一的,而不是连续的(无序存储)。集合也是可变的。集合包含零个或多个元素,并且可以包含不同的不可变类型的元素。

本质上,当你想知道某样东西是否存在,而对它一无所知时,就要用到集合。如果跟踪值的顺序或存储相同值的倍数很重要,考虑使用空间友好的元组来代替。

使用set()创建器械包。使用set()进行类型转换。

一些值得注意的方法和技巧

add()向集合中添加不存在的项目
clear()从集合中删除所有项目
intersect()返回两个集合的交集
union()返回两个集合的并集

概括起来

  • 如果需要跟踪排序,使用列表元组
  • 如果你只想跟踪唯一的值,而不关心顺序,使用 Python set
  • 如果一旦定义了对象就不需要修改,那么使用一个元组来节省空间并确保没有东西会覆盖你的数据
  • 如果你需要跟踪和修改键值对结构的数据,使用字典

哪个 Python 库最适合数据可视化?

原文:https://towardsdatascience.com/which-python-library-is-the-best-one-for-data-visualization-1b6ad1d66163?source=collection_archive---------15-----------------------

大蟒

Matplotlib、Seaborn、Plotly Express 和 Altair。哪一个是最好的数据可视化库?

图片由 Jason Coudriet 提供。来源: Unsplash

数据可视化是任何探索性数据分析或报告的关键步骤。它通常易于阅读,并且可以让我们一眼就能洞察数据集。有几十个很棒的商业智能工具,比如 Tableau、Google Data Studio 和 PowerBI,它们让我们可以轻松地创建图表。数据分析师或数据科学家通常会使用 Python 在 Jupyter 笔记本上创建可视化效果。幸运的是,有几十个很棒的 Python 库可以创建很棒的图形。然而,百万美元的问题是:哪一个是最好的?

无论你是学生还是专业人士,你都应该知道一些选择。没有完美的图书馆。因此,您应该知道每种数据可视化的优缺点。我将介绍四个最流行的用于数据可视化的 Python 库:Matplotlib、Seaborn、Plotly Express 和 Altair。为此,我将创建一个简单的条形图,并分析使用每个库有多容易。对于这个博客,我将使用一个城市数据集。你可以在这里找到笔记本。

类别

这篇博客将分析建立一个柱状图有多容易,定制图表使其最少呈现有多容易,以及库文档。

设置数据集

首先,让我们导入所有重要的库。很有可能你的电脑上已经安装了 Matplotlib 和 Seaborn。但是,你可能没有 Plotly Express 和 Altair。您可以使用pip install plotly==4.14.3pip install altair vega_datasets轻松安装它们。

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import altair as alt
import plotly.express as px

现在我们将导入数据集。出于演示目的,我们仅创建一个包含美国人口最多的前 15 个城市的数据框。我还将修改城市名称的大写字母。当我们创建可视化时,这将有助于编辑过程。

df = pd.read_csv('worldcitiespop.csv')us = df[df['Country'] == 'us']us['City'] = us['City'].str.title()cities = us[['City', 'Population']].nlargest(15, ['Population'], keep=’first’)

现在我们应该准备好分析每个库了。你准备好了吗?

类别:设置难度和初步结果

赢家: Plotly Express
输家: Matplotlib、Altair、Seaborn

在这个类别中,所有的库都表现良好。它们都很容易设置,基本编辑的结果对于大多数分析来说已经足够好了,但我们需要有赢家和输家,对吗?

Matplotlib 非常容易设置和记忆代码。然而,图表并不好看。它可能会做数据分析的工作,但它对于商务会议的结果不是很好。

作者图片

Seaborn 创造了一个更好的图表。它会自动添加 x 轴和 y 轴标签。x 记号可能看起来更好,但对于基本图表来说,这比 Matplotlib 好得多。

作者图片

Plotly Express 表演得很精彩。用很少的代码就可以创建一个好看且专业的条形图。没有必要设置图形或字体大小。它甚至旋转 x 轴标签。所有这些都只需要一行代码。印象非常深刻!

作者图片

牛郎星图表现不错。它提供了一个好看的图形,但是它需要更多的代码,并且出于某种原因,要按照字母顺序组织容器。那不可怕,很多情况下也能有帮助,但我感觉这应该是用户自己决定的事情。

作者图片

类别:编辑和定制

赢家: Plotly Express,Seaborn,Matplotlib
输家: Altair

我相信这四个图书馆都有成为赢家的潜力。在它们中的每一个中定制图表是不同的,但是我认为如果你学得足够多,你将学会如何创建漂亮的可视化。然而,我正在考虑编辑和在互联网上找到关于编辑它们的信息有多容易。我确实有使用这些库的经验,但是我把自己想象成一个新用户。

Matplotlib 和 Seaborn 非常容易定制,它们的文档非常惊人。即使你没有在他们的文档中找到你要找的信息,你也可以很容易地在 Stack Overflow 中找到它。他们还有一起工作的优势。Seaborn 基于 Matplotlib。因此,如果你知道如何编辑一个,你就会知道如何编辑另一个,这将非常方便。如果使用sns.set_style('darkgrid')设置 Seaborn 主题,会影响 Matplotlib。这可能就是为什么 Matplotlib 和 Seaborn 是两个更受欢迎的数据可视化库。

作者图片

作者图片

例如,Plotly Express 从一开始就提供了漂亮的图表,比 Matplotlib 需要更少的编辑,以获得最低限度的会议可视化。它的文档简单易懂,他们通过Shift + Tab提供文档,非常方便。在我尝试过的所有库中,它还提供了最多的定制选项。您可以编辑任何内容,包括字体、标签颜色等。最棒的是这不费吹灰之力。它的文档中有很多例子。

作者图片

我发现 Altair 的文档非常混乱。与其他库不同,Altair 没有Shift + Tab快捷键。这对初学者来说是非常有问题和困惑的。我可以做一些编辑,但是寻找相关信息很有压力。与我花在编辑 Matplotlib 和 Plotly Express 上的时间相比,我要说 Altair 对于初学者来说并不是一个很好的选择。

作者图片

类别:附加功能

赢家: Plotly Express 和牛郎星
输家: Matplolib 和 Seaborn

对于这一类别,我将考虑除了那些我们可以通过代码实现的特性之外的附加特性。Matplotlib 和 Seaborn 在这一类中是非常基础的。除了代码所提供的,它们不提供任何额外的编辑或交互选项。然而,Plotly Express 在这一类别中大放异彩。首先,图表是交互式的。你只需要将鼠标悬停在图表上,就会看到相关信息。

作者图片

Altair 提供了一些选项来保存文件或通过 Vega Editor 打开 JSON 文件。咩!

作者图片

类别:文档和网站

赢家: Plotly Express,Altair,Seaborn,Matplotlib

所有这些库的文档都很好。Plotly Express 有一个漂亮的网站,上面有代码和可视化演示。非常容易阅读和查找相关信息。我喜欢他们的网站看起来如此复杂和精心设计。你甚至可以与图表互动。

作者图片

Altair 也把他们的网站做得很好。他们的定制文档不是最好的,但网站看起来很好,很容易找到代码示例。我不会说这是惊人的,但它确实起了作用。

作者图片

Seaborn 的网站还可以。有些人说他们有最好的文档。我觉得还可以。它完成了任务。它包含代码示例。如果您正在寻找定制选项,这可能会变得棘手,但除此之外,这是一个干净的网站,其文档非常完整。

作者图片

Matplotlib 有完整的网站。在我看来,它有太多的文本,找到一些信息可能有点棘手。然而,信息就在那里的某个地方。他们还提供 PDF 格式的文档,我计划在将来的某个时候阅读这些文档。

作者图片

最终交付

我在这篇博客中分析的四个库都是很棒的库,有无限的可能性。我只检查了几个因素。基于这个原因,不要认为这个博客是理所当然的。所有的库都有优点和缺点,我是作为一个初学者写这篇博客的。我最喜欢的是 Plotly Express,因为它在所有类别中都表现良好。然而,Matplotlib 和 Seaborn 更受欢迎,大多数人会在他们的计算机上安装它们。在这些库中,Altair 是我最不喜欢的,但它值得我在未来给予一些关注。让我知道你最喜欢的数据可视化库是什么。

你是谁,数据工程师?

原文:https://towardsdatascience.com/who-are-you-data-engineer-8febb06552a?source=collection_archive---------10-----------------------

在这篇文章中,我将解释当今存在的数据角色,特别是谁是数据工程师?其中包含的角色定义、职责和挑战是什么?

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片

在过去的几年里,我一直在做一名大数据工程师,虽然这听起来像是当前的流行语,但我已经知道,我在软件世界的许多同事不一定理解这个角色的内容。

有些人会将其与 DevOps、数据分析或数据科学相混淆。有些人会认为这是数据库架构师(DBA)这个神话角色的新品牌。

因此,在发现自己向许多不同的人解释了几次我做什么,以及为什么它与我之前提到的那些不同之后,我意识到可能会有更多的人乐于知道数据工程是怎么回事。

但是首先:目前存在哪些数据角色?

老实说,这种困惑是可以理解的-今天,许多公司已经意识到数据对组织的重要性,在这个世界上,每一个基本操作都被转换为数据并由某人使用,几乎每个公司都有一个数据组,其中的角色定义略有不同。

有时数据组将作为整个公司的一个组,通常是在具有特定领域的小公司中,但是随着公司以这种方式发展,对于具有特定领域的每个部门来说,将有一个专用的数据组来保存数据处理。

这些是数据组中的关键角色:

  • 数据分析师 —数据分析师的工作是将信息转化为知识,识别趋势,并将分析后的数据用作制定更好的基于数据的业务决策的战略引擎。它的主要工具将是数据库、SQL 和 HIVE 查询,以及用于数据可视化的图形仪表板。
  • 数据科学家 —使用数据驱动的算法、机器学习来解决业务问题,通常具有丰富的统计和数学知识,在数据中寻找趋势和模式,以将公司的利益带到下一个级别。
  • 数据工程师— 构建和维护数据基础设施,如数据管道,负责将来自不同来源的数据传输到其他角色使用的地方,为数据科学家的模型构建准备数据。

作者图片

数据工程师的类型

数据工程师不仅“获取”数据,还允许您方便地访问数据,随时甚至实时收集最新数据。

“经典”数据工程师——数据管道工程师

大部分工作是基于将数据从不同的数据源传输到单个目标,在许多情况下,他们将主要使用 ETL ( ETL 代表 E xtract,Ttransform,以及 L oad,指的是从多个数据源提取数据并根据业务需求将其转换并加载到目标数据库的过程)或者构建和维护这样的数据库。

这种类型的数据工程师需要对关系数据库和 SQL 查询有很高的理解。

机器学习数据工程师

这些工具的主要作用是将模型(由数据科学家开发)部署到真实的生产环境中,并完成所有必要的工作—构建包括自动化、测试、监控和日志的生产基础架构。

机器学习工程师将参与编写用于训练和准备模型的代码(大数据解决方案中的数据准备和训练层),在这种情况下,Python、Spark 和云环境方面的强大背景是必须的。

数据工程师的主要技能

虽然数据科学家通常在数学和统计学方面有很强的背景,但数据工程师通常是有几年经验的软件开发人员,他们了解云基础设施和开发语言,如 Python 或 Java、Scala 等。

由于我们处于一个大数据世界,它通常是在中管理的,因此了解其中一个提供商将是有用的——如谷歌云服务、Azure 或 AWS。

此外,数据库的知识是工作所需的知识之一——理解关系和非关系数据库,运行复杂的数据获取查询,所有这些都不会影响用于生产环境的数据。

在某些情况下,根据工程师从事的项目,需要对机器学习算法、统计模型和各种数学函数有基本的理解。

作者图片

作为数据工程师的挑战

可靠性

数据世界中最重要的事情是数据的可靠性——在数据损坏的情况下,任何复杂的模型都无法提供帮助。因为数据工程师负责收集数据(有时来自不同的来源)并将它们移动到一个目标,转换和处理它们以创建一致性,等等,所以人们担心数据的可靠性会在这个过程中受到损害。

这是一个巨大的挑战,要确保一路上我们没有改变数据的本质,我们收到的和我们传递的是一样的。

为了提供高度确定的数据,我们必须全程采取行动,例如:

  • 数据一致性 —意味着数据中的每个变量都只有一个含义。为了确保数据的可靠性,我们必须验证模式的一致性——对于特定的模式,每个记录都以相同的方式处理。
  • 元数据存储库 —通过有序保存元数据的来源和处理方式,为数据提供上下文。
  • 数据修改权限 —只有被授权的人才能修改数据——人和流程都一样。这将确保不会发生意外的变化。

可扩展性和性能分析

有时,传入数据的数量和速度是不可预测的,该角色面临的挑战之一是构建一个知道如何轻松快速地处理增加的负载的系统。

重要的是要明白 Scale 没有神奇的解决方案,但是会根据问题给出解决方案——如何处理负载?
例如,如果您的系统是一个 web API,负载可能会影响响应时间,因此解决方案应该在这个级别。

再现性

数据是一切的基础。因此,我们应该做好准备,以防由于各种原因导致某些数据丢失。因此,高效、快速地恢复并保持数据随时间推移而可用的能力,是数据工程师面临的一项重要挑战。

结论

综上所述,关于谁是数据工程师,他们的职责是什么的困惑是理解的。这确实是一个有趣而多样化的角色,包括代码编写以及云基础设施的维护和建立,数据库的复杂工作,在某些情况下还包括统计和机器学习。

数据基础架构用户相信您能为他们提供一个数据可靠的系统,能够快速处理突发负载而不丢失关键数据,并且能够在意外情况下恢复信息。
工作中的许多挑战增加了人们的兴趣和令人印象深刻的学习曲线——数据世界正在快速发展,为了保持一致,我们必须跟上我们作为解决方案所面临的变化和技术。此外,这一角色还伴随着许多责任,例如,数据可靠性是一个真正的挑战,至少在“最坏的情况”下意味着大量的金钱损失,在其他情况下,可能会因为不正确的数据或错误的决策而产生法律后果,从而导致人员伤亡(例如,安装在煤气罐上的传感器和实时泄漏报告,如果数据在此过程中被不同地翻译,则可能会错过实时灾难警报)。

这个数据库是谁设计的?

原文:https://towardsdatascience.com/who-designed-this-database-19ab75eee457?source=collection_archive---------36-----------------------

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

一个设计良好的数据库和最新的文档是最理想的,但是如果不是这样,并且您无法改进数据库设计,那么有什么解决方法呢?

考虑以下场景

你是一名自由职业的数据科学家,受雇对一家公司的数据进行分析。这似乎很简单,您知道如何使用 SQL 和 Python,以及如何进行假设检验,并且您会被告知您将获得一个数据库模式。

该公司一直在向一些客户提供不同程度的折扣。作为您的第一项任务,您需要弄清楚提供产品折扣是否有助于增加订单中的商品数量,如果有,它是否特定于某个或某些折扣?

看一下这个模式

您要做的第一件事是查看提供给您的数据库模式,并提出一个收集数据的计划。

提供的数据库模式

您会看到订单明细表中列出了产品折扣。您已经看到了这个数据库设计的一个问题,这个表的标题中有一个空格,这不是一个好现象,但是您可以通过引用表名来解决它。

订单细节表数据看起来像什么?

您将使用 Python 的 sqlite3 包来查询数据库,并计划将查询到的数据存储在 Pandas Dataframe 中。

首先,您需要查看表中的几个条目。

import sqlite3
import pandas as pdquery = """SELECT * FROM 'Order Details' LIMIT 10"""df = pd.DataFrame(cur.execute(query).fetchall(), columns = [description[0] for description in cur.description])df.head(10)

您收到的不是数据,而是以下错误:

OperationalError                          Traceback (most recent call last)
<ipython-input-5-8791be329a46> in <module>
----> 1 cur.execute(query).fetchall()

OperationalError: no such table: Order Details

嗯。在仔细检查模式中的拼写错误后,很明显没有名为 Order Details 的表。

如果模式是错误的,那么表名是什么?

不幸的是,如何做到这一点取决于您正在使用的关系数据库实现,但是在我们的例子 sqlite 中,您可以使用下面的查询。

query = """
        SELECT name FROM sqlite_master
        WHERE type='table'
        ORDER BY name;
        """
cur.execute(query).fetchall()

返回的表名是:

[('Category',),
 ('Customer',),
 ('CustomerCustomerDemo',),
 ('CustomerDemographic',),
 ('Employee',),
 ('EmployeeTerritory',),
 ('Order',),
 ('OrderDetail',),
 ('Product',),
 ('Region',),
 ('Shipper',),
 ('Supplier',),
 ('Territory',)]

什么?没有一个表名与模式匹配。此时,您不能信任该模式,但是希望即使表名不匹配,每个表之间的关系仍然存在。

现在您知道了正确的表名,您可以再次尝试检索一些数据。

query = """SELECT * FROM 'OrderDetail' LIMIT 10"""df = pd.DataFrame(cur.execute(query).fetchall(), columns = [description[0] for description in cur.description])df.head(10)

这次你得到一些数据!

OrderDetail 表的输出

您会发现模式和当前数据库实现之间存在更多的不一致。有一个 Id 列未在架构中显示,并且 OrderId 列和 ProductId 的大小写与架构不匹配。虽然大写在 SQL 中并不重要,但是一旦你将数据放入 Pandas 数据框架中,大写就很重要了。您需要记下这一点,以便将来进行查询和分析。

你现在可以使用这个表进行假设检验了,我不会在这篇文章中详细介绍这个表,但是如果你需要其他表中的数据呢?

订单表呢?

你可能已经注意到上面有一个叫做 Order 的表。如果您熟悉 SQL,您会知道顺序是一个保留字。您应该怀疑从订单表中查询数据会有问题,但是为什么会这样呢?

举个简单的例子,您可以尝试从那个表中查询几行数据。

query = """SELECT * FROM Order LIMIT 5"""df = pd.DataFrame(cur.execute(query).fetchall(), columns = [description[0] for description in cur.description])df.head()

正如所料,您会收到一个错误

---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-31-dc8e46beab2b> in <module>
 **1** query = """SELECT * FROM Order LIMIT 5"""
 **2** 
----> 3 df = pd.DataFrame(cur.execute(query).fetchall(), columns = [description[0] for description in cur.description])
 **4** df.head()

OperationalError: near "Order": syntax error

对此你能做些什么?SQL 怎么知道 Order 是表名不是保留字?不幸的是,该解决方案依赖于数据库实现。我将向您展示如何在 sqlite 的情况下处理它。您需要用反斜杠将表名括起来。

query = """SELECT * FROM `Order` LIMIT 5"""df = pd.DataFrame(cur.execute(query).fetchall(), columns = [description[0] for description in cur.description])df.head()

这次检索了一些数据。

订单表中的数据

如果您参考上面的有问题的模式,您会注意到被指定为 OrderID 的内容实际上被称为 ID,并且需要注意。

如果您需要引用订单表中的一列,该怎么办?你还在用反勾号。下面是一个更复杂的查询示例。

query = """
SELECT `Order`.Id AS OrderId, 
       SUM(OrderDetail.Quantity) AS TotalQty 
FROM `Order` JOIN OrderDetail 
ON `Order`.Id = OrderDetail.OrderId 
GROUP By `Order`.Id
"""

您可以看到,在任何使用 Order 的地方,都需要用反勾括起来。如果您需要将它用作子查询,重命名顺序。Id 到 OrderId 将有助于保持查询的其余部分“干净”。

感谢你花时间阅读这篇文章。当您遇到设计和/或文档不良的数据库时,我希望我详述的解决方法会有所帮助。

谁是自然语言处理领域的“维基百科名人”?

原文:https://towardsdatascience.com/who-is-wikipedia-famous-within-natural-language-processing-fa0c8e91bdf6?source=collection_archive---------25-----------------------

变更数据

尽管维基百科的简历中存在众所周知的偏见,但拥有维基百科的简历通常被视为衡量知名度的一个标准

作为一名研究人员,拥有一篇维基百科文章是衡量一名研究人员有多著名的众多标准之一。然而,维基百科因其性别偏见而受到严厉批评,这是一个如此突出的问题——你可能已经猜到了——有一个关于这个话题的专门的维基百科页面。此外,研究发现,在维基百科上有一篇传记文章实际上与传统的影响指标如引用计数没有关联。鉴于我在自然语言处理(NLP) 研究领域参与了多样性&包容计划,以及对性别偏见检测学术数据的兴趣,我对我们领域的现状感到好奇,具体来说:1) 有多少研究人员拥有维基百科传记,2) 是否存在显著的性别差异,3) 拥有一篇维基百科文章与拥有, 4)谁有维基百科的文章中有任何可观察到的国家或机构偏见

注意事项:我先分享一些数据准备的注意事项,然后是数据分析和讨论。尽管我尽了最大努力,但还是有可能无意中排除了一些维基百科页面。还要注意的是,NLP 研究人员可能因为他们的 NLP 研究之外的原因而出名。此外,有许多不同的影响指标可以比较,我选定了一个将研究人员发表的 NLP 论文数量与这些论文吸引的引用数量相结合的指标。最后,除了性别之外,还有更多偏见——我也将分享一些关于这方面的笔记。如果你只是想要外卖,跳到 TL;博士总结在最后。

数据准备

这种分析需要两种类型的数据:关于自然语言处理研究人员的维基百科文章列表,以及这些研究人员的出版数据,以衡量他们对该领域的相对影响。

收集维基百科的简历

有几种方法可以识别维基百科文章的主题,最直接的方法是出现在文章底部的类别标签。虽然有用,但不幸的是它们也很稀少。因此,我浏览了大约 1000 篇链接到自然语言处理页面的文章,如果它们代表了相关研究人员的传记,就将它们标记为自然语言处理和/或计算语言学研究人员。正如你从(现在更新的)类别列表以及这个电子表格中看到的,总共有 138 名 NLP 研究人员拥有维基百科简介

附注:术语“自然语言处理”和“计算语言学”之间有一些语义上的差异,但由于它们经常被混为一谈,因此出于分析的目的,我将它们视为同一个术语,并通篇使用当今更常见的术语“自然语言处理”。
此外,我只考虑了英文维基百科的 NLP 页面作为起点。因此,我可能错过了只有维基百科非英文版页面的 NLP 研究人员。

收集学术资料

为了评估这些研究人员对该领域的影响,我使用了 NLP 学者数据集,它包含了 ACL 选集中的所有论文(反过来,它索引了在著名的 NLP 会议、研讨会和期刊上发表的论文)。除了论文列表,它还包含截至 2020 年 6 月谷歌学术论文的引用计数。请注意,相关研究人员不必拥有谷歌学术帐户;只有论文需要被谷歌学术索引。

衡量研究影响

衡量研究影响的一个常用指标是研究人员的 h 指数。然而,这个衡量标准考虑了所有研究者的论文,而不仅仅是某个特定学科的论文,正如我在这里想要捕捉的。为了衡量 NLP 中的研究影响,我选择了一个不同的指标,即研究人员发表了多少篇论文,以及这些论文被引用的情况,这两个指标也是常见的研究影响指标。不仅仅是测量引用的原因是,基于NLP 的哪个子领域是关于、第一作者的性别是什么、和更多,关于什么论文获得多少引用存在偏见。
此外,我采用了一个相对宽泛的“突出”场所的定义,因为这些偏见也会影响同行评审,从而影响作者希望在多有声望的场所发表他们的工作——例如,介绍新数据集的论文虽然对社区非常有价值,但很少在 NLP 内排名最高的场所发表,因为介绍新模型的论文通常被评审员认为更值得发表。

请进一步注意,这些研究人员可能在其他领域发表过论文,或者他们可能因为他们的研究论文以外的原因而更加引人注目。此外,维基百科页面的长度,它们被编辑的频率或其他更细粒度的统计数据可能有助于衡量,正如Samoilenko&Yasseri(2013)所调查的那样。由于我对维基百科上高影响力的 NLP 研究人员的代表性感兴趣,我只考虑了他们的 NLP 出版物(如上所述,我在这里使用的 NLP 学者数据集只包含由 ACL 选集索引的论文,这些论文都是关于 NLP 的论文)。此外,我没有对他们的维基百科简历进行更细致的统计。

此外,测量研究影响是非常复杂的,当然不仅仅是研究人员的出版物,例如,参见关于替代指标的讨论。出版物的数量也受到研究小组规模的限制,而研究小组的规模本身又受到研究经费等资源的限制。给研究人员排名甚至会对科学本身有害,因此除非必要,否则应该避免。在这里,衡量研究影响应被视为达到目的的必要手段,而不是目的本身。我想积极劝阻读者试图过多地解读下面某个研究人员的特定影响排名,因此不会发布与他们的 NLP 影响度量配对的研究人员的完整列表。

事不宜迟,这是我选定的衡量标准。根据 NLP 学者数据集,我首先计算了每位研究人员的论文数量和引用数量。然后,我对结果列表进行降序排列,以获得两个等级: r_p ,一个研究人员的等级,表示他们相对于其他研究人员发表了多少篇论文,以及 r_c,一个研究人员的等级,表示他们相对于其他研究人员获得了多少引用。然后,我线性组合了两个等级,即 r_p + r_c ,并对结果等级进行归一化,这样每个位置之间的增量为 1。

数据分析

回想起来,我主要对两件事感到好奇:维基百科上 NLP 研究人员的代表性是否存在性别差异,以及拥有维基百科简历本身是否与 NLP 的科学影响力相关。总共有 138 名研究人员拥有维基百科的简历,因此很难从中得出任何结论性的发现(如果我将这篇博文作为论文提交,审稿人 2 可能会反对我这样做)。然而,这是我的发现。

定性分析

我知道你们中的一些人来这里是为了一些容易理解的情节/图表/例子,所以下面是根据我之前定义的研究影响排名以及赛义德和性别(手动标记,见下文)列出的拥有维基百科页面的前 20 名研究人员。显而易见,并非所有有影响力的 NLP 研究人员都有维基百科的简历。此外,有很有影响力的男性和女性 NLP 研究人员都有维基百科的简历。

前 20 名最有影响力的 NLP 研究人员,他们的维基百科页面和手动标记的性别。影响排名是根据他们的 NLP 论文及其引用来确定的。

性别代表性

我根据维基百科简历中描述他们的代词,在维基百科页面上手动标记了每个研究人员的性别。没有一个研究者被称为“他们”,51 个被称为“她”,86 个被称为“他”。请注意,维基百科页面不是自传性的,因此,尽管不太可能,但有可能有人无意中弄错了性别。此外,一些非二元的人使用代词“她”或“他”,而不是“他们”或其他代词,这意味着性别不能仅从代词中推断出来。尽管如此,我得出的结论是,极不可能存在拥有维基百科页面的非二进制 NLP 研究人员,拥有维基百科简历的女性研究人员比例为 37.2%。作为比较, Mohammad (2020) 估计 NLP 中 29%的第一作者和 25%的最后作者是女性, Schluter (2018) 估计 NLP 中女性占所有研究人员的比例为 33.5%。鉴于此,似乎拥有维基百科简历的女性 NLP 研究人员的比例明显低于男性 NLP 研究人员的比例。然而,这也略高于妇女在该领域的代表性。

影响分析

回想一下,我感兴趣的是拥有维基百科简历的研究人员是否也倾向于对该领域产生重大影响。总的来说,在 NLP Scholar 数据集中有 45041 个唯一作者条目。其中一些可能是重复的,例如,如果一名研究人员以不同的名字发表了论文——出于这种粗略分析的目的,没有努力将这些联系起来。

研究这个问题的一个简单方法是计算拥有维基百科简历的研究人员的平均排名(回想一下,有 138 个这样的排名——你可以在这里看到所有的排名)。拥有维基百科简历的 NLP 研究人员的平均排名是 8152,而数据集里 NLP 研究人员的平均排名是 22521。此外,拥有维基百科简历的研究人员中有 37%属于 NLP 影响排名最高的前 1%的 NLP 研究人员。为了说明这一点,下面是具有维基百科简历的 NLP 研究人员的绝对影响排名(x 轴)与具有维基百科简历的所有 NLP 研究人员的相对影响排名(y 轴)的曲线图。

拥有维基百科简历的 NLP 研究人员的绝对影响排名(x 轴)与拥有维基百科简历的所有 NLP 研究人员的相对影响排名(y 轴)

正如你可以再次看到的,这些研究人员中约有 2/3 的影响力排名为 5000 或更低,只有少数离群值在远端,没有被 ACL 选集索引的 NLP 研究论文。因此,他们被分配了一个虚拟级别(可能的最高级别)。观察一些离群值,他们要么是在不被 ACL 选集索引的本地期刊上发表文章的 NLP 研究人员,要么主要不是 NLP 研究人员(但其他领域的研究人员,现在在行业中的前研究人员,或者根本不是主要研究人员的人)。

总体而言,由此可以得出结论,拥有 bios 的 NLP 研究人员在该领域的影响力远远高于没有拥有 BIOS 的研究人员,这与Samoilenko&Yasseri(2013)的发现相反。

国家和机构分析

最后,我很好奇,想知道谁有维基百科的简历是否存在国家或机构偏见。在最近的 ACL(NLP 中排名最高的会议)上,记录了每篇论文联系作者的国家或地区,会议组织者发现大多数研究论文来自美国(39%),其次是中国(24%),英国(6%),德国(6%)和日本(3%)。

注意,因为国家和地区在 ACL 调查中被合并,所以左图中的地区“大不列颠”和“爱尔兰”不能直接映射到其他图表中的国家“英国”和“爱尔兰”。“香港”和“中国”也是如此,它们在 ACL 调查中被视为独立的地区,但在维基百科中却不是独立的国家。

为了与维基百科上的研究人员进行比较,我考虑了一个人出生的国家,他们获得博士学位的机构和它位于哪个国家,以及最近的机构隶属关系和它位于哪个国家。所有这些都是从研究人员的维基百科页面手动获得的。在没有现成可用的地方,我在研究人员的机构网站上搜索这些信息,并相应地更新他们的维基百科页面。结果可以在下面看到。

左图:基于联系作者的 ACL 2020 论文的国家或地区分布;共有 779 篇论文被接受。右图:在维基百科上有简历的 NLP 研究人员最近被雇佣的国家。只有拥有最多两篇论文/维基百科简历的国家被明确命名。

显而易见,ACL 作者所在的国家(左)和拥有维基百科简历的 NLP 研究人员目前受雇的国家(右)之间存在明显的差异。有 57%的美国 NLP 研究人员拥有维基百科的简历,只有 39%的 ACL 2020 论文是由美国提交的。此外,在 ACL 2020 上发表的所有论文中,有 24%是由中国提交的,而只有 2%的维基百科关于 NLP 研究人员的简历是关于目前在中国的研究人员的。以色列、新加坡和加拿大各占 ACL 2020 认可的论文主要作者居住国的 3%,但在维基百科关于 NLP 研究人员的简历中却一个都没有。

左图:拥有维基百科简历的国家自然语言处理研究人员在。右图:拥有维基百科简历的 NLP 研究人员出生的国家。只有拥有最多两个维基百科传记的国家才被明确命名。

将 NLP 研究人员目前所在的国家与他们获得博士学位的国家和出生的国家进行比较,很明显,随着时间的推移,分布越来越倾向于以英语为主要语言的国家,在某种程度上是英国和加拿大,但特别是美国(34%出生于,52%获得博士学位,57%最近就业的国家)。

作为补充,这并不令人惊讶,这里是拥有维基百科简历的 NLP 研究人员获得博士学位的最著名的机构。

左图:拥有维基百科简历的 NLP 研究人员最近加入的机构。右图:NLP 研究人员获得博士学位的机构。

在这两种情况下,分布都是由美国的机构主导的,这些机构在 CSRankings 等排名中也名列前茅。虽然可以看出,并不是所有排名靠前的机构都在维基百科上的 NLP 简历中有大量出现,这意味着这可能部分是大学公关努力的结果。

总的来说,在每个国家发表的研究论文数量和被引用的程度上已经存在差异。当谈到维基百科上 NLP 学者的代表性时,这些问题进一步加剧,这使他们处于进一步的劣势。所以总的来说,在英文版的维基百科中,NLP 学者有很强的国家和机构偏见
这些偏见可能是由多种因素造成的,文化和资源可能是社会偏见的一部分。

行动呼吁

总体而言,存在明显的国家和机构偏见,以及女性 NLP 学者在维基百科上的代表性不足。尽管性别偏见并不像我预期的那样明显有利于男性研究人员,但在 NLP 和更广泛的社会中,还有许多其他传统上代表性不足的群体。首先,性别不仅仅是二元性别,偏见也不仅仅是性别和制度偏见,例如种族、宗教、阶级、性别、残疾等方面的偏见。交叉性,即一个人身份的不同方面如何相互作用,也应予以考虑——研究人员可能面临不止一种类型的偏见,例如性别和种族偏见。我帮助发起的拓宽 NLP 倡议,旨在提高所有传统上在 NLP 中代表性不足的群体的代表性。作为这项计划的一部分,我维护着 NLP 中代表性不足的群体的大目录。如果你有兴趣支持这项倡议,并且有几个小时的空闲时间,为什么不为这个目录中的一个人创建一个维基百科个人资料呢?

如何开始

第一件要做的事当然是挑选一个值得维基百科关注的人。维基百科社区整理了一些关于这个的指南,不遵循这些指南的文章通常会被标记为删除。还要注意的是,文章应该从中立的角度来写,所以强烈反对写一篇关于你自己的维基百科文章。为了让你更容易理解,我将大目录与 NLP 学者数据集中有影响力的研究人员列表进行了交叉引用,你可以在这里找到结果。如果您为这些研究人员之一添加维基百科页面,请将维基百科页面链接添加到相应的栏中。具有高影响力指标的研究人员很可能通过显著性标准,但是没有高影响力指标并不意味着他们不显著,因为人们可能因为不同的原因而显著(也参见进一步的讨论)。

TL;博士;医生

一开始,我提出了以下研究问题:
1)有多少研究人员拥有维基百科传记,2)是否存在显著的性别差异,3)拥有一篇维基百科文章与对自然语言处理领域产生影响之间是否存在关联?以及 4)在谁拥有维基百科文章的问题上,是否存在任何可观察到的国家或机构偏见?

答案是:

  1. 138 名 NLP 研究人员拥有维基百科传记,而 ACL 选集有 45041 名独特的作者,该选集索引了所有著名的 NLP 期刊、会议和研讨会的会议记录。
    2)拥有维基百科简历的自然语言处理作者中,37.2%为女性,明显低于男性。然而,ACL 选集中女性论文作者的比例估计在 25%到 33.5%之间,这意味着,相对于女性在 NLP 领域的代表性,女性在维基百科上的代表性更突出。
  2. 37%拥有维基百科简历的研究人员属于 NLP 研究人员中影响力排名最高的前 1%,仅根据他们的出版物计算。因此,可以得出结论,在拥有一篇维基百科文章和对 NLP 领域产生影响之间有很强的相关性。
    4)美国有 57%的自然语言处理研究人员拥有维基百科的简历,只有 39%的 ACL 2020 论文是由美国提交的。此外,在 ACL 2020 上发表的所有论文中,有 24%是由中国提交的,而只有 2%的维基百科关于 NLP 研究人员的简历是关于目前在中国的研究人员的。拥有大量拥有维基百科资料的 NLP 学者的机构不一定在诸如 CSRankings 这样的排名中排名靠前。因此,可以得出结论,在自然语言处理学者的维基百科简历中,存在非常明显的国家和机构偏见。

遗言&致谢

谢谢你能走到这一步。如果你喜欢阅读这篇文章,并有评论或建议,请在下面留下。

感谢 Saif Mohammad 的有用和详细的反馈,以及分享 NLP 学者数据集。还要感谢巴里·诺顿、拉达·米哈尔恰、莫娜·迪亚卜、佩帕·阿塔纳索娃、瑞安·科特雷尔、嵇和塔马尔·索洛里奥分享了他们对本文的看法。也感谢 Pascale Fung 和 Smaranda Muresan 鼓励我写这篇文章。

谁说单片应用已经死了?

原文:https://towardsdatascience.com/who-said-that-monolithic-applications-are-dead-2a4b9e3ac56d?source=collection_archive---------29-----------------------

整体服务与微服务:没有放之四海而皆准的方法

图片来自 Pixabay

就软件设计而言,微服务和单片应用是设计、构建和部署软件的两种截然不同的方法。那么,微服务和单片应用有什么区别呢?

首先,微服务是业务逻辑的小部分,旨在彼此独立地开发、部署和扩展。相比之下,整体式应用程序被设计为作为一个整体来开发、部署和扩展。

然而,不同的组织有不同的资源,并且没有一个放之四海而皆准的方法来构建一个成功的产品。开发人员花费大量时间和精力来设计、构建和部署应用程序,结果却发现代码库不可维护、伸缩性不好,或者团队没有足够的资源或知识来维持项目,这种情况很常见。

因此,从一开始就确定项目结构和理解权衡是很重要的。本文将解释每种方法的优缺点,并帮助您决定哪种方法适合您。

学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。订阅这里

设计考虑

设计应用程序时,通过列出所有的功能和业务需求来设置环境是很重要的。在一张纸上写下申请的范围将有助于你确定实现目标所需的资源。这个阶段奠定了基础,我们都知道如果你在一个错误的基础上开始构建会发生什么。

因此,第一步是描述应用程序将交付给用户的服务。考虑所有的功能需求,把自己想象成客户。然后,你应该列出所有可以帮助你完成项目的资源。

为什么要破解这个练习?简单的回答是,它将帮助您确定您应该遵循的架构模型;这将使在单片和基于微服务的架构之间进行选择变得更加容易。

收集功能需求

最初,收集和理解项目的业务需求是非常重要的。一种简单的方法是提供以下问题的答案:

  • 你的应用程序的最终用户是谁?
  • 你的产品将提供什么服务?
  • 应用程序的输入和输出是什么?
  • 输入和输出的格式是什么?

列举可用的资源

确定了业务和功能需求之后,下一步是列出所有可以帮助我们完成这个项目的资源。同样,让我们做同样的练习,并回答一系列重要问题:

  • 我们可以支配的工程资源有哪些?开发人员使用什么工具,哪种编程语言是他们工作中的常用语言?
  • 你愿意花多少钱来实现它?换句话说,预算是多少?
  • 截止日期是什么时候?你有时间吗,或者有到达市场的紧迫性吗?

单片与微服务

既然您已经收集并列出了应用程序的所有业务需求以及实现这些需求的可用资源,那么是时候决定最合适的应用程序架构了。

没有两个系统是完全相同的。然而,在大多数情况下,您可以在基于单片的架构或基于微服务的架构之间进行选择。无论您采用哪种系统,主要目标都是设计一个能够为客户提供价值并且易于维护和扩展的应用程序。

每个体系结构分为 3 个主要层:

  • UI(用户界面):UI 通常响应 HTTP 请求并提供图形界面,这有助于用户体验
  • 业务逻辑:业务逻辑层包含控制一切并向用户提供服务的代码
  • 数据层:数据层提供对应用程序所需信息的访问,并存储应用程序的状态

巨石

在整体架构中,我们之前看到的应用层是同一个单元的一部分。它们在一个存储库中管理,共享所有资源,并且用一种编程语言开发。最后,它们被打包并作为一个二进制文件分发。

微服务

在微服务架构中,应用层是独立管理的。通常,每个单元都保存在一个单独的存储库中。它在运行时消耗自己的资源,有一个定义良好的 API 用于与其他微服务建立通信,它的实现栈独立于其余部分。最后,它作为一个单独的单元发布,通常作为一个容器化的服务。

在微服务和单芯片之间选择

我们如何在这些方法中做出选择?毕竟,微服务是新的趋势,如果我们选择这种方式,似乎我们总是会赢?还记得我们在“设计考虑”部分做的练习吗?让我们来测试一下。

那么,你什么时候会选择建造一个整体呢?假设您有严格的预算,并且您的工程团队由几个熟悉特定框架(例如 Java Spring 框架)的开发人员组成。此外,时间紧迫,你必须在一个紧张的期限内建立一些东西。

在这种情况下,我认为开发一个单一的、集成的系统是你最好的选择。单一应用程序具有较低的启动成本,较低的开发复杂性(一种编程语言,一个存储库),以及更快的上市时间(一个部署整个堆栈的交付管道)。

然而,基于微服务的架构的优势是如此巨大,随着时间的推移和业务的增长,您应该制定一个计划,将您的代码库迁移到河的对岸。这种转变的好处是更大的可伸缩性、更低的规模运营成本、更高的可靠性和更高效的软件开发过程。

结论

自从引入 web 应用程序以来,微服务范式慢慢地在其他组织中获得了牵引力。微服务是业务逻辑的小部分,旨在彼此独立地开发、部署和扩展。相比之下,整体式应用程序被设计为作为一个整体来开发、部署和扩展。

然而,没有放之四海而皆准的方法,单一的应用程序设计肯定不会消亡。你必须做好功课,决定什么最适合你所在的职位,然后开始建设!

关于作者

我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 MediumLinkedIn@james2pl

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

谁是《复仇者联盟 3:无限战争》中的主角?

原文:https://towardsdatascience.com/who-was-the-main-character-in-avengers-infinity-war-a15c486b920e?source=collection_archive---------24-----------------------

利用网络分析和节点中心性确定复仇者联盟 3:无限战争最重要的特征

图片由来自 PixabayCarlos Hilario 拍摄

复仇者联盟 3:无限战争出现在大银幕上已经三年了。电影中有这么多角色,当决定哪个角色在故事情节中扮演最重要的角色时,无疑是具有挑战性的,甚至是有争议的。是钢铁侠吗?是绿巨人吗?是美国队长吗?为了找出故事中最有影响力和不可或缺的角色,我们可以利用社交网络分析来了解电影的情节。

1.数据

我们将使用复仇者联盟 3:无限战争的文字记录,可以在网上找到。以下是我改编的出处:

https://transcripts.fandom.com/wiki/Avengers:_Infinity_War

上面的脚本包含了无限战争的情节,这是在知识共享下授权的。

2.构建字符网络

我们构建一个网络,其中每个节点代表一个角色(例如史蒂夫·罗杰斯),每个边表示两个角色出现在同一个场景中。我们定义边权重为这两个由边连接的人物出现的共同场景的数量。

此时,我们注意到某些边的边权重很低,因为字符很少一起出现。我们可以去掉这些无关紧要的边,在网络中制造更多的空隙,以突出网络的结构特征。下图显示了字符网络,其中每条边的宽度表示两个节点之间的边权重

《无限战争》中人物的社会网络(图片由作者提供)

3.衡量一个角色的重要性

一个角色的重要性可以用多种方式来定义。以下是一些可能的标准:

  • 这个角色有多少“朋友”(或关系)?
  • 人物在维护网络结构中有多重要?

度中心性和特征向量中心性

程度中心性是衡量一个人物在网络中有多大影响力的有用指标。节点的度中心性是与它共享直接边的节点的分数。在我们的上下文中,高度的中心性意味着一个角色至少出现在一个场景中,而故事情节中的其他角色占了很大比例。

特征向量中心性是另一种测量节点影响的方法,基于它连接到什么类型的节点。如果相邻节点具有高中心性分数,则节点本身也将具有高中心性分数。这种排序方法比简单地查看节点度更简单,因此与度中心性相比,它是节点与网络中心的接近程度的更好指标。

左:程度中心性右:特征向量中心性(图片由作者提供)

我们观察到托尼·斯塔克(钢铁侠)根据程度中心性(左)出现在同一个场景中的人物数量最多,这意味着他与电影中的人物数量最多。然而,基于特征向量中心性,来自银河护卫队的人物(彼得·奎尔和德拉克斯)实际上占据了更多的中心位置(即,他们与更多的主要人物相连)。

中间中心性

介数中心性是通过特定节点的最短路径数量的度量,并且可以指示网络中节点的结构重要性。在我们的上下文中,具有高介数中心性的节点将表明,如果没有特定角色的出现,故事将无法顺利进行。如果一个节点具有高介数中心性,这意味着如果没有该节点,网络更可能变得脱节,因此该节点是不可或缺的,因为它是一组节点和另一组节点之间仅有的链接之一。

前 10 个字符的中间中心性得分

参照上面的柱状图,我们看到中间中心性有一个相当有趣的趋势。对于程度和特征向量中心性,前 10 名得分之间只有轻微的变化。然而,我们终于看到了一些角色之间在中间中心性方面的鲜明对比,布鲁斯·班纳和托尼·斯塔克名列前茅。

铰接点

考虑到布鲁斯·班纳的特征向量中心性甚至不在网络的前 10 名之内,布鲁斯·班纳(绿巨人)的高中间中心性看起来确实令人惊讶。让我们试着把他从网络中移除,然后观察会发生什么。

移除 Bruce Banner 后将网络分成两部分(图片由作者提供)

有趣的是,这个网络把自己分成了两个截然不同的角色群体。我们只在 Bruce Banner 的情况下观察到这一点,这解释了为什么他具有最高的中间值。这个节点作为一个关节点,这意味着如果这个节点被删除,该图将分裂成其取代不相交的集群。

这很有意义,因为在电影中,布鲁斯·班纳(绿巨人)是连接银河护卫队(左边)和其他复仇者(右边)的复仇者。布鲁斯·班纳(Bruce Banner)是一个警告复仇者联盟灭霸(反派)威胁的人,也是一个通过他与托尼·斯塔克(Tony Stark)和斯蒂芬·斯特兰奇(Stephen Strange)的联系间接将新角色引入复仇者联盟电影系列(如《守护者》)的角色。《无限战争》也紧随托尔·拉格纳洛克的事件,布鲁斯·班纳(或绿巨人)充当了两部电影之间的桥梁。

4.结论

从纯粹的影响力角度来看,托尼·斯塔克和彼得·奎尔与电影中的其他角色互动得更频繁,可以被认为是网络中最有影响力的节点。

然而,在考虑了布鲁斯·班纳在网络中的结构意义后,很明显布鲁斯·班纳是无限战争故事情节中不可或缺的角色,尽管像托尼·斯塔克和彼得·奎尔这样的角色在故事中与更多的角色互动。

这是一个相当简单的角色网络表示,这里可能有更多的角色。然而,基于我们从网络上获得的观察,似乎浩克绝对是一个关键的(也可能是被低估的)角色。

我希望你喜欢阅读无限战争角色之间的关系!网络让我们可以在多维的层面上可视化角色之间的关系,这对于揭示这些网络中有趣的模式是很有用的。用于生成网络的源代码,点击这里

在这个项目的下一部分中,我们将使用哈利波特系列探索这样的故事网络是如何随着时间的推移而演变的。点击下面的链接继续阅读!

https://jiangzh.medium.com/storytelling-via-temporal-networks-110ddeefb633

我受到了下面这篇文章的启发,这篇文章使用了自然语言处理(NLP)方法来分析角色,如果你对更多的电影数据分析感兴趣,我强烈推荐它:

如果你有任何新的见解,请随时发表评论!

谁会赢得下一轮《反恐精英:全球攻势》?

原文:https://towardsdatascience.com/who-will-win-the-next-round-of-counter-strike-global-offensive-de574a4f37f4?source=collection_archive---------37-----------------------

使用贝叶斯统计预测回合获胜概率

的文章、代码和数据可以在 github 上的https://github.com/PaulHiemstra/bayes_csgo_round找到

介绍

像在其他领域一样,统计和数据的使用在电子竞技中有所增长。一个具体的领域是电子竞技广播,其中统计数据用于增强和改善观看体验。最近一个让我印象深刻的例子是 Blast Spring CS:GO 总决赛的一部分,在比赛中展示了一轮获胜概率“AI 预测”。随着回合的展开,这个概率被更新。例如,一个反恐(CT)玩家倒下会降低 CT 获胜的概率。我脑子里的齿轮立即开始转动:除了不称之为“人工智能预测”之外,我如何实现这样一个舍入预测器。在这篇文章中,我将提出我的解决方案,使用贝叶斯统计来解决这个问题。使用这种方法,需要回答的问题可能是:

  • 放置炸弹时 1v1 获胜概率如何变化
  • 当炸弹被放置时,获胜的概率一般是怎样变化的
  • 当 CT 或 T 玩家倒下时,获胜概率如何变化
  • 地图对获胜概率有什么影响

反恐精英玩家可以利用这些信息在特定情况下做出明智的决定。此外,一个团队可以使用总的获胜概率,并用它们来衡量自己。例如,你的 4v5 胜率与整体 4v5 胜率相比如何。

在接下来的几节中,我将慢慢建立统计模型。

还剩两个 CT

我想解决的第一个问题是当两个 CT 玩家活着的时候,CT 获胜的概率。一般来说,活着的玩家数量的减少应该会降低特定团队获胜的概率。但是在我们进入统计之前,首先我们必须确定使用什么数据。

为了计算这种可能性,我使用了大量的历史数据(感谢基督徒!):

*122410
Index(['time_left', 'ct_score', 't_score', 'map', 'bomb_planted', 'ct_health',
       't_health', 'ct_armor', 't_armor', 'ct_money', 't_money', 'ct_helmets',
       <<<SNIP>>>>>
       't_grenade_flashbang', 'ct_grenade_smokegrenade',
       't_grenade_smokegrenade', 'ct_grenade_incendiarygrenade',
       't_grenade_incendiarygrenade', 'ct_grenade_molotovgrenade',
       't_grenade_molotovgrenade', 'ct_grenade_decoygrenade',
       't_grenade_decoygrenade', 'round_winner'],
      dtype='object')*

该数据集在一轮 CS:GO 中提供了超过 122k 的快照,提供了该轮的属性,例如有多少 CT 仍然活着,哪些武器或工具仍然存在,等等。此外,它还列出了谁赢得了这一轮。回合属性和谁赢了回合的组合使我们能够计算赢的概率。

以下帮助器函数计算成功概率,在本例中只是计算总联系类型成功概率。

*0.4901887100727065*

其简单地计算例如CT赢得一轮的次数与总回合数的比值。在这种情况下,它显示 CT 赢得了 49%的回合。但是当然,我们有更多的数据可用,而不仅仅是我们属于哪个队,例如有多少 CT 球员仍然活着。为了扩展我们的回合获胜概率以包括该信息,我们转向贝叶斯统计

贝叶斯统计从 CT 获胜概率(𝑃(CT 获胜)的先验估计开始,在这种情况下,我们之前计算了总体获胜概率(0.49)。接下来,我们添加额外的证据,在这种情况下,我们知道只有 2 个 CT 玩家仍然活着。使用贝叶斯定理来计算后验* CT 获胜概率(𝑃(CT 获胜|2 存活)😗

当剩下两个联系类型时,𝑃(2 活着|联系类型获胜)是联系类型获胜的可能性。等式右侧的所有项都可以使用我们的数据进行计算:

*0.27515169576151494*

因此,当一轮中剩下两名 CT 玩家时,获胜概率从 0.49 下降到 0.27。这是有道理的,因为 CT 玩家越少,CT 赢得这一轮的可能性就越小。

de_cache 上还剩两个联系类型

为了使我们的 CT 获胜概率更加真实,我们将扩大我们放入贝叶斯定理的证据数量。这里我们添加了各队正在比赛的地图,de_cache

假设这两个证据不相关(条件独立),我们可以非常直接地扩展我们的公式。这里,除了两个联系类型处于活动状态的证据之外,我们还添加了我们在映射 de_cache 上使用的证据:

条件独立性的假设确保了新的似然𝑃(map 可以以这种简单的方式被插入。这导致以下后验 CT 获胜概率:

*0.48211252170893965*

这表明,给定 2 个 CT 在缓存上处于活动状态时,CT 获胜概率远远高于给定 2 个 CT 处于活动状态时的总体获胜概率,在本例中为 0.48 比 0.27。

引入更多的证据

添加更多的证据当然会使我们的估计更准确。为了让我们的代码更灵活一点(我是一个懒惰的程序员),我写了一些帮助函数,它允许我们传递任何我们想要的证据,只要它是我们数据集的一部分:

*0.48211252170893965*

这表明,通过在字典中提供证据,我们可以在缓存图中获得两个活动联系类型的相同后验概率。有了这些更灵活的代码,我们可以更自由地开始试验。例如,在这里,我们计算了 1v1 情况下放置炸弹前后的获胜概率:

这表明,当炸弹是而不是放置时,获胜概率稍微偏向于 T(CT 为 0.45)。这可能是因为 T 可以选择战斗发生的地点。当 T 成功放置炸弹时,概率会更有利于 T。

炸弹工厂的更多细节

有了更灵活的代码,我们可以计算出更多的概率,包括剩下的 CT 玩家,剩下的 T 玩家,玩的地图以及炸弹是否被放置:

请注意,这段代码需要很长时间才能运行,而且肯定没有经过优化。

从这一大组概率中,我们可以得出一些有趣的见解。例如,炸弹工厂如何影响 CT 获胜概率:

其中 x 轴是放置炸弹前的 CT 获胜概率,y 轴是放置炸弹后 CT 获胜概率的下降。在该图中,我们看到:**

  • 一般来说,放置炸弹后,CT 获胜的概率会下降
  • 当 CT 已经有很高的输赢机会时,概率的变化就不大了
  • 最大的变化发生在当联系类型的获胜概率在 0.62 左右时,下降到 0.3 左右。

职业 CS:GO 的一个要点是,在获胜的概率非常均匀的情况下,让 T 的植物和游戏进行重拍是有风险的。

为了扩大我们对炸弹工厂的探索,我绘制了双方存活玩家的数量,以及在瓦片图中放置炸弹工厂前后的获胜概率:

有趣的是:

  • 一般来说,5v5 的获胜概率几乎是 50/50。de_cache 是一个例外,它在很大程度上依赖于 CT。在较小的程度上,这也适用于裁减核武器和取消训练。
  • 当少于三名 CT 或 T 玩家存活时,CT 获胜概率发生最显著的变化。
  • 失去团队成员会降低每个团队的获胜概率。
  • 正如我们在前面的图表中看到的,当 T 设法放置炸弹时,CT 获胜的概率显著下降。

有趣的前进方式

本文中的方法仍然很简单,一些可能的有趣的改进途径可能是:

  • 添加更多的变量。这确实是一个挑战,因为数据集在计算获胜百分比时会越来越分散。另外,有些变量不是范畴。我目前的方法需要这样,所以这些必须分类。这可以使用pd.cut来完成。
  • 超越条件独立的。现在我假设所有的证据都是有条件独立的,这通常是不正确的。使用一个贝叶斯信念网络我们可以整合各种证据之间的依赖关系。这篇文章用 Python 很好地介绍了 BBN 的。
  • 地图和 CS:GO 元数据的变化可能会使我目前用来计算概率的数据失效。要在实践中使用这样的系统,需要使用相关的最新数据,例如来自 hltv.org 的数据。理想情况下,将证据纳入贝叶斯定理的方法可能是有益的。例如,较旧的数据对最终数据的影响可能小于较新的数据。不过,我不确定如何在实践中实现这一点。

我是谁?

我叫 Paul Hiemstra,是荷兰的一名教师和数据科学家。我是科学家和软件工程师的混合体,对与数据科学相关的一切都有广泛的兴趣。你可以在 medium 上关注我,或者在 LinkedIn 上关注 T4。

如果你喜欢这篇文章,你可能也会喜欢我的其他一些文章:

谁对 AI 和 ML 很好奇?

原文:https://towardsdatascience.com/whos-curious-about-ai-and-ml-628a0347e483?source=collection_archive---------58-----------------------

日常的例子让“人工智能”和“机器学习”不仅对数据专家来说是熟悉的概念,对普通大众来说也是如此。但是怎么熟悉呢?对谁呢?

博客预告图片由豪尔赫弗洛雷斯

本周我们有一个特别的音频节目:沙盒播客迷你剧数据的奖励集!我们用孩子们可以理解的方式解释“人工智能”和“机器学习”的含义,使用日常例子,如电视节目推荐、机器人吸尘器和数学作业。

这些日常例子使“人工智能”和“机器学习”不仅对数据专家来说是熟悉的概念,对普通大众来说也是如此。但是怎么熟悉呢?对谁呢?

谷歌趋势数据可以更精确地向我们展示这些术语有多流行,它们的用法如何随着时间的推移而变化,甚至它们在哪里更流行或更不流行。当然,这是一种分析方法,你可以使用各种关键词或短语,针对你最感兴趣的话题。

一段时间内的 AI/ML 利息

谷歌趋势帮助你探索人们搜索特定术语的次数。您可以一次比较多达五个术语,还可以查看地理细节(即,整个世界或特定国家的数据,以及美国、州、大都市地区或城市级别的数据)。

阅读趋势数据有点棘手。数据被标准化以反映搜索词的受欢迎程度,每个时间段的值从 1 到 100,100 反映该词的最高受欢迎程度。此外,悬停在地图位置上将提供从 1 到 100 的值,最频繁搜索该术语的位置得分为 100。(如果你想了解更多趋势,谷歌提供了深入的课程。)

如下所示,Google Trends 的网络界面提供了一种很好的方式来初步查看数据,随着时间的推移,相对搜索兴趣会被绘制出来,地图会自动显示。

作者图片(通过谷歌趋势)

但是,您会希望使用您最喜欢的软件进行更深入的挖掘,对吗?😉正如您可能猜到的,图右上角的小向下箭头将数据下载为 CSV 文件,以备进一步分析。地图显示也是如此。我下载了 2004 年至今美国大都市地区的数据。

下面是我的折线图在 Designer 中的样子——由于其更窄的布局,显得更有戏剧性:

作者图片

有趣的是,在 2013 年 10 月,美国对“机器学习”的搜索兴趣超过了对“人工智能”的兴趣,尽管人工智能的含义更广,而且流行文化也很熟悉。是什么让 ML 当时领先,并且之后几乎每个月都保持领先?

这种变化的一个可能原因可能是 Coursera 的增长,Coursera 成立于 2012 年,其特色是现在著名的由网站创始人之一吴恩达教授的机器学习课程。如今,它仍然是 Coursera 上最受欢迎的课程,注册人数达 380 万。

地理比较

将这些数据引入 Designer 后,可以将趋势数据与其他数据结合起来,包括 Designer 中包含的美国人口普查数据。例如,这允许我使用城市地区的名称来添加空间信息,并生成更具体、信息更丰富的地图。

我将谷歌趋势的地铁名称与来自分配输入工具的数据中使用的名称进行了匹配,然后向趋势数据中添加了一些基本的人口统计信息和空间数据。我创建了一个新的变量,ML 中的搜索兴趣与 AI 中的搜索兴趣的比率。确定对机器学习相对于可能不太专业的术语“人工智能”有更大相对搜索兴趣的地方可能是有趣的这一比率从旧金山-奥克兰-圣何塞大都市地区的 0.69 到北卡罗来纳州威尔明顿的 0.07 不等(不包括对一个或两个词都没有搜索兴趣的城市)。

我还使用城市地区的纬度和经度,通过K-质心聚类分析工具生成地理聚类。该工具与追加集群工具相结合,将城市分配到组中。拥有一个“集群”变量允许我在数据中寻找地理模式,而不依赖于纬度和经度。这种方法生成了下面的地图,其中的城市按照它们的人工智能搜索兴趣比进行了颜色编码;钻石越红的城市比例越高,而钻石越蓝的城市则相反。城市的数字标识了它们的地理集群。

作者图片

美国东北部的人工智能与人工智能搜索兴趣的平均比率最高,为 0.29,美国西部排名第二,为 0.27。虽然我们可能会在旧金山地区和西雅图等美国主要科技中心看到更多的“机器学习”搜索,但在地理集群中脱颖而出的城市也很有趣,如弗吉尼亚州的夏洛茨维尔和宾夕法尼亚州的匹兹堡。随着学生研究数据科学主题,主要大学可能也会提高 ML 与 AI 的比率。

继续学习

那些搜索 AI/ML 的人就像我们的数据(在沙盒中)听众,嗯,就像我们所有人一样——只是试图跟上这个快速增长和变化的领域!感兴趣的关键术语和概念将会改变,但拥有数据驱动和好奇的心态有助于我们所有人保持在趋势的顶端。

查看沙盒奖励集的数据,并与你认识的一个年轻人分享人工智能/人工智能的阴谋!

原载于 Alteryx 社区 并精选于 Alteryx 数据科学门户

谁不见了?

原文:https://towardsdatascience.com/whos-missing-d717ee657674?source=collection_archive---------62-----------------------

https://unsplash.com/@timmossholder

编写 Python 实用函数来计算要素方面的缺失值。

找出数据中缺少的东西是数据科学中令人头疼的数据争论任务之一。虽然它们是丢失的数据,但如果不指出并正确处理,它们会回来并长期困扰你!

在使用 Python 的项目中工作时,我发现找到丢失的数据很容易,但在笔记本中很好地呈现可能会很麻烦。因此,这是我的努力,使失踪的数据探索更容易和更有用。

动机

在 Python 中,我们可以使用简单的一行代码data.isnull().sum来列出数据集中缺失的数据。但是问题在于这个函数如何产生一个包含所有特性名称的完整列表,不管它们是否有任何缺失值。当所讨论的数据集是一个包含许多特性的大数据集时,在笔记本中可能看起来非常混乱。

为了克服这一点,在本教程中,我们将了解如何编写一个简单的效用函数,该函数将仅计算具有缺失观测值的要素的缺失值,并将其存储在数据框中,该数据框稍后可用于报告或可视化。

准备

工具和库

在本教程中,我将使用 RStudio 作为 IDE。因此我将使用 R 包 Reticulate 来运行 Python 代码。

我将使用一个迷你 Conda 虚拟环境,后端的好奇乔作为 Python 环境。为了能够重现本教程,您可能想在 Conda 中创建自己的虚拟环境,并在reticulte::use_condaenv()函数中使用其名称。要了解有关创建和管理 Conda 环境的详细信息,您可以访问此文档

# loading libraries
library(reticulate)
library(dplyr)
library(kableExtra)
library(knitr)# setting up virtual python environment
reticulate::use_condaenv("curious-joe")

Python 函数

我们将看到的函数依赖于 Python 库 Pandas ,这是一个常用于数据争论和分析的库。

这个函数非常简单,你可以通过它来理解。但是对于 Python 编程的新手来说,这里有一个功能在函数内部流动的分解:

  1. 创建一个字符串值列表, colNames 用于存储列名,
  2. 用来自 colNames 的值作为列名创建一个空白数据框 df
  3. 运行 for 循环以迭代输入数据框的每一列,并执行以下一系列任务:
  • 计算列中缺失值的百分比,并将输出保存在名为 p 的对象中,
  • 计算一列中缺失值的总数,并将输出保存在一个名为 q 的对象中,
  • 检查 p 、缺失值的百分比是否大于零,如果大于零,则用列名及其相应的计数和缺失值的百分比填充空数据框 df
  • 将结果数据帧 df 按降序排序,
  1. 返回 df ,带有名称的数据框和带有缺失值的要素的缺失计数。
# pyhton library
import pandas as pd# @ countMissing
# Fetches columns from the spefied dataset that contains missing values
# @param dataFrame Name of the dataframe objectdef countMissing(dataFrame):
    # colNames = ['colNames', 'missingValue', 'missingValuePerc']
    colNames = ['Featuers', 'Missing_Value', 'Percentage_Missing']
    df = pd.DataFrame(columns = colNames)
    for i in dataFrame.columns:
        p = round((dataFrame[i].isnull().sum()/dataFrame.shape[0]) * 100, 2)
        q = round(dataFrame[i].isnull().sum(), 0)
        if p > 0:
            df.loc[len(df)] = [i, q, p]
    # creating data frame with the missing value columns and values   
    df = df.sort_values(['Percentage_Missing'], ascending = False).reset_index(drop=True)
    return(df)

演示

数据

为了演示该函数如何工作,我将使用 iris 数据集,并在数据中引入一些 NA 值(R 语言中的缺失值)。

# preparing data
data <- iris
data = data %>% mutate(Sepal.Width = ifelse(Sepal.Length >7, NA, Sepal.Width))
data = data %>% mutate(Sepal.Length = ifelse(Sepal.Length >7, NA, Sepal.Length))

在代码中,我们删除了 Sepal 的值。宽度和萼片。萼片时的长度特征。长度值大于 7。这导致 24 行缺少值。

应用

下面的代码块应用了我们刚刚创建的函数 countMissing() ,并打印出输出数据帧。

# calculating missing value using countMissing()
table = countMissing(r.data)
table##        Featuers Missing_Value  Percentage_Missing
## 0  Sepal.Length            12                 8.0
## 1   Sepal.Width            12                 8.0

让我们使用一些 R markdown 包来使输出看起来更好!

knitr::kable(py$table, caption = "Missing Values") %>%
  kable_classic(full_width = F, html_font = "Cambria")

我们改进了什么?

如果你查看一下 countMissing() 函数,你会发现我们使用的是 isnull()。sum() 内部,我们可以使用相同的函数来获得缺失的计数。我们创建 countMissing() 的唯一原因是确保缺失计数以一种更可展示和可用的方式产生。虽然当它们在更大的数据集上运行时,差异会更明显,但是下面的代码块显示了这两种方法的输出是如何不同的。

r.data.isnull().sum()## Sepal.Length    12
## Sepal.Width     12
## Petal.Length     0
## Petal.Width      0
## Species          0
## dtype: int64

VS

countMissing(r.data)##        Featuers Missing_Value  Percentage_Missing
## 0  Sepal.Length            12                 8.0
## 1   Sepal.Width            12                 8.0

甚至更好的

knitr::kable(py$table, caption = "Missing Values") %>%
  kable_classic(full_width = F, html_font = "Cambria")

在本教程中,我们基本上介绍了如何用 Python 编写函数。我们学会了如何编写自己的小效用函数来解决我们独特的问题。

感谢阅读!

通过阅读本文,您应该对 Python 中的函数是如何工作的,以及如何在您的数据分析中使用它有一个基本的了解!

不确定接下来要读什么?我为你选了另一篇文章:

阿拉法特·侯赛因

谁是谁,什么是什么:生物医学命名实体识别进展

原文:https://towardsdatascience.com/whos-who-and-what-s-what-advances-in-biomedical-named-entity-recognition-bioner-c42a3f63334c?source=collection_archive---------20-----------------------

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

思想与理论

命名实体识别研究概述,以帮助解决与生物医学领域相关的挑战。

介绍

Slimmer AI ,我们一直在探索生物医学领域的 NER(BioNER)。这种探索很重要,因为有一些挑战在其他领域并不总是存在,包括:

  • 数据通常不能自由获取,尤其是在临床病例中。
  • 数据注释需要专业知识。
  • 生物医学概念的空间是巨大的,这使得 NER 系统不太可能超越它们被注释的特定设置。

本文概述了命名实体识别工作和研究,以帮助解决与生物医学领域相关的挑战,如生物医学数据集和处理它们的技术。我还将讨论迁移学习和多任务学习在这一领域的重要性。我将快速介绍一些 BioNER 的替代方法,与基于深度学习的流行模型(如 BERT)进行比较。

NER 发展概述

命名实体识别(NER)是自然语言处理的组成部分之一,被用于许多下游任务,如问题回答、主题建模和信息检索。【1】该任务涉及使用诸如人、组织、位置等类别来标记非结构化文本中的实体。

命名实体识别的目标是将单词识别为实体,并对它们所属的实体类型进行分类。图片作者,灵感来自 MonkeyLearn

早期的 NER 系统使用手工制作的规则、词汇、拼写特征和本体。【1,2】诸如此类的模型有一些好处,比如它们不需要带注释的训练数据。然而,这些模型有几个缺点。例如,词典需要详尽,相关词典需要由领域专家主动更新。

随着这一领域的发展,人们开始使用机器学习,但这种方法也有其缺点,如费力的特征工程。最近,引入了端到端深度学习方法,并消除了对每个特定数据集手动设计特征的需要。尽管缺乏特定领域的规则和知识,这些特征推断网络优于特征工程系统。【1】

数据集噪声和偏差

许多带注释的数据集已被引入生物医学领域,包括实体类别,如细胞系、化学、疾病、基因、蛋白质和物种。他们中的大多数使用 PubMed 的文章作为他们的来源,这已经被一些领域专家注释过了。对于流行的 BioNER 数据集的概述,GitHub 上由 Flairthis overview所做的评论是很好的参考。

NER 数据集最突出的问题之一是数据集是不完美的,这并不局限于生物医学领域。例如,大多数人——如果不是全部的话——都会遇到注释者不同意或者缺少注释的问题。

李等人强调数据注记质量是领域的主要挑战之一。【2】举几个例子,MedMentions 语料库的创建者通过让生物学家审查专业注释者所做的注释来评估注释质量,并报告了 97.3%的一致性。【3】2004 年的 JNLPBA 任务在 2019 年有了一个修订版,试图修复原始语料库中的不完善之处。【4,5】有两轮注释,注释者在两轮之间讨论了一些分歧。在第一轮中,注释的一致性为 79.5%,而在第二轮中为 91.4%。这离 100%还是挺远的。Wang 等人分析了广泛采用的 CoNLL03 数据集,能够在大约 5.38%的测试句子中识别错误。鉴于最先进的测试分数已经达到 93%左右,他们进一步强调了这一点的重要性。

根据知识或视角,插图或文字可以有不同的解释。这可能导致注释者不同意和不完善的数据集。图片由 Pixy 提供。

发现注释错误需要深厚的专业知识和大量的时间投入。为了用另一种方式处理它们,王等人引入了一个叫做 CrossWeigh 的框架。他们的解决方案很简单,但确实需要相当长的运行时间。想法是训练多个模型,每个模型基于训练数据的不同分割。分割或折叠是以这样的方式建立的,即训练集不包含来自相应测试集的任何术语。不正确的预测在所有测试集上聚集,并且这个过程重复几次迭代(给定不同的随机种子来创建折叠)。直觉告诉我们,如果一个术语在每个文件夹中都被错误分类,那么这个注释可能是不正确的。然后通过在训练期间给它们较小的权重来抑制这些注释。随着 F1 分数提高 0.2-0.4%,他们注意到他们的模型变得更加稳定,在多次运行中 F1 分数的标准偏差更低。

正如在许多机器学习任务中显而易见的那样,数据集通常包含偏见。NER 也不例外。识别在训练(记忆)期间看到的实体提及和处理形态变化(同义词概括)通常不会对像(生物)BERT 这样的大模型造成问题。【8】然而,Kim 和 Kang 发现,BioNER 模型经常利用数据集偏差,并且未能归纳出在训练期间未见过的概念。【8】他们分析了 BC5CDR 数据集中的 50 个分类错误,发现 BioBERT 在其中 34%的情况下使用了统计线索。

为了解释他们滥用了什么样的线索,让我们首先快速查看一下 NER 数据集中最常用的格式:内-外-开始注释模式) (IOB)。当一个实体由多个(子)字组成时,例如组织' Slimmer AI ',第一个字' Slimmer '以 B- 为前缀,表示一个实体的开始, 'AI'I- 为前缀,表示一个字是前面实体的一部分。不属于实体的单词用 O 标注。这种格式有助于区分文本中的连续实体。

用 IOB-scheme 注释的例句。 Slimmer AI 是一个组织实体,由两部分组成: Slimme r,前缀为 B-AI ,前缀为 I- 。其他单词不是实体,用标注。图片作者。

Kim 和 Kang 发现,一些单词只在训练集中与 B- 一起出现,因此在测试集中总是被归类为 B- ,导致不正确的预测。【8】为了解决这种偏差,他们提出了基于偏差乘积法的去偏差程序。【9】结果,这些模型确实对记忆性能产生了一点影响,但它们在同义词和概念概括方面有所改善。然而,他们的去偏置方法可能会减少在实体中使用有效模式的机会。这种模式的例子有“__ street”和“__ disease”,它们是非常相关的模式,可以用来促进概念的泛化。作者指出这是未来的工作。

生物医学领域的另一个大问题是,通常很难获得由专家注释的大型数据集。如果你碰巧找到这样一个黄金标准的语料库,它们通常都很小。为了解决小数据集的问题,你可以利用迁移学习、多任务学习或少量学习。

迁移和少量学习

使用预先训练的模型和应用迁移学习技术是当今 NLP 社区的常见做法,可以显著提高下游任务的性能。将它应用于 BioNER 任务也不例外,因为基于大量生物医学数据训练的几个模型已经开源并被频繁使用。最突出的模型之一是 BioBERT,首先在一般领域语料库上进行预训练,随后在 PubMed 等生物医学领域语料库上进行预训练。【10】为了说明开源这些模型如此重要的原因,仅生物医学领域预培训的后半部分就花费了 23 天时间,使用了 8 个 Nvidia V100 GPUs。这对中小型企业来说是一笔不小的投资。另一个取得显著成功的模型是 HunFlair 模型,它在 23 个生物医学数据集上进行训练,远远超过 SciSpaCy 和 HUNER 等 BioNER 模型。【11,12,13】使用领域特定模型而不是普通模型提高下游任务性能的证据是压倒性的。【8,10,11,14–18】

展示迁移学习概念的高级概述。在一个数据集上训练的模型的一部分被转移,并在另一个任务上进一步微调。图片由作者提供,灵感来自 TopBots

与随机初始化的 LSTM 相比,HunFlair 模型利用预训练,在不同类别的 F1 分数上提高了 0.80-4.75%。观察到的增加主要是由更高的回忆引起的。他们的模型和训练数据可以在他们的 GitHub 页面上找到,而且,由于它是流行的风格 Python 库的一部分,你可以很容易地根据自己的喜好扩展这个模型。【19】

Peng 等人引入了生物医学语言理解评估(BLUE)基准,其中 BioNER 是标准之一,以促进预训练模型开发中的研究(有关 BLUE 的更多信息,请查看各自的 GitHub 页面)。【16】他们评估了几个 BERT 和 ELMo 基线,发现根据 PubMed 摘要和 MIMIC-III 临床笔记预先训练的 BERT 模型取得了最好的结果。【20】他们的模型被恰如其分地命名为 BlueBERT,在所有数据集上均优于 ELMo、BioBERT 和其他最先进的模型。最佳模型设置在 BioBERT 上提高了 8.9 F1 分,单个数据集平均提高了 1.8 分。

Giorgi 和 Bader 利用银标准语料库,这些语料库往往更大,但质量较低。【17】这样的语料库可以通过使用现有的 NER 模型来标注大的、未标记的语料库来生成。作者通过首先在这些银标准语料库上进行训练,然后在金标准语料库上进行微调,在几个数据集上实现了 11%的错误减少。对于注释很少的数据集(< 6000),改进特别大。

预培训也带来了应用一些技术的机会,比如少量学习:只使用少量标签来微调你的模型。这是一项非常有用的技术,尤其是在缺少带注释数据的领域。Hofer 等人评估了在医学领域中处理这种小数据集的五种技术,直到仅使用 10 个训练样本。【21】作为基线,他们使用了一个基于当时为 CoNLL-2003 和 OntoNotes 5.0 调整的最先进模型的模型。【7,22】改善他们的少数镜头学习任务的技术之一涉及使用更多样本对相关数据集进行预训练。在对几个数据集进行测试后,他们在最佳设置下的 F1 分数比基线提高了 4.52%。使用同一个域中的数据集明显优于使用另一个域中的数据集。

另一种设置利用多个单独的数据集,并对所有数据集进行组合预训练。有趣的是,与使用单一数据集进行预训练相比,作者报告了-1.66%的负面影响。作者指出,这可能是由他们的训练策略引起的,因为他们使用了针对单独数据集优化的超参数。他们进一步认为,通过对第一个数据集进行预训练获得的权重可能不适合第二个数据集。值得注意的最后一种技术是使用专门在生物医学文本上训练的单词嵌入作为输入,而不是使用普通的手套嵌入。【23】这让他们的 F1 得分又提高了 3.78%。所有技术的结合使他们的 F1 分数从 69.30%提高到 78.87%,这是一个很好的提高。

多任务学习

除了应用迁移学习,另一种流行的方法是使用多任务学习:不仅训练手头的任务,还包括其他相关任务,以提高主要任务的表现。这背后的概念是,相似的任务或数据集具有语义和语法的相似性,这有助于为手头的任务训练更优化的模型。此外,它可以减少过度拟合的机会。常见的任务包括标注词性(POS)标签、句法成分和依赖关系。【2,14】此外,这些任务的数据相对容易获得,因为语法特征可以使用现成的工具包获得,如 NLTKStanford CoreNLP

应用多任务学习的示例架构。第一层由不同但相关的任务共享。图片由作者提供,灵感来自 Ruder.io

Tian 等人尝试使用键值记忆网络将句法特征结合到 BioBERT 模型中,并看到其性能提高了约 0.2–0.9% F1。这听起来可能不多。然而,当考虑到一些数据集上的一些模型已经在 90%以上的范围内执行时,这样的增加可能是显著的。

Wang 等人将使用具有不同实体类型的多个数据集的训练视为多任务问题。【18】他们通过迭代遍历数据集来训练不同的 BioNER 模型,同时在这些模型之间共享一些参数。在 15 个数据集的 14 个数据集上,它们优于之前的最先进水平,f 1 得分提高了 0.2%至 1.8%。

Khan 等人采用了类似的方法,但他们将他们的模型视为一个单一的模型,每个任务都有共享的底层和特定的顶层。【15】对于下层,他们使用了预训练的 BioBERT 模型。在三个数据集上的训练产生了最佳性能,与单任务学习模型相比,F1 分数提高了 0.2-1.3%,并在王等人的模型上进一步提高了 0.7-2.3% F1。

应用多任务学习的一种独特方式是让多个单一模型进行协作。CollaboNet 是一个应用这一技巧的框架,它使用在不同数据集上训练的特定模型来完成不同的任务。【24】作者指出,常规的多任务学习产生的模型在回忆上得分较高,但精确度较低。因为这些模型是针对几种不同的实体类型进行训练的,所以它们在预测正确的实体类型时往往会有困难。此外,作者确定了生物医学领域的一个问题,即实体可以根据上下文被标记为不同的实体类型。有些词在一种语境中可以表示基因,在另一种语境中可以表示疾病。

使用 CollaboNet,他们试图通过为协作的每种实体类型建立专家模型来解决这个问题。在训练期间,这些模型轮流被更新或作为合作者。每个模型接收协作者模型的输出,并将其用作辅助输入。因此,每个模型都被认为是自己领域的专家,同时通过利用多领域信息来提高其他模型的性能。与王等人相比,CollaboNet 的 F1 得分提高了 0.2-5.0%。【18】值得注意的是,使用 BiLSTM-CRF 架构的 CollaboNet 已经被 BioBERT 超越。然而,该框架本身仍然可以应用于更先进的模型,进一步提高它们的分数。然而,人们需要足够的记忆和时间来应用它。

缓解内存和时间问题的一种方法是使用较小的网络,或者使用利用权重共享的网络。一个很有前途的模型是生物阿尔伯特,基于(你猜对了):阿尔伯特。除了他们的参数缩减技术来加速模型,作者不仅在 NER 的任务上训练他们的模型,而且还应用了句序预测。这种技术从训练数据中提取两个连续的句子和两个随机的句子,并尝试预测一个句子是否跟随另一个句子。这允许模型更好地学习依赖于上下文的表示。

BioALBERT 在几个数据集上的表现一直优于 BioBERT,而且常常是大幅度领先,他们报告的分数相当可观。随着参数的减少,训练时间减少了大约 2-3 倍:这是一个巨大的胜利!作者在 Github 上公开了他们的模型。

基于知识的 NER 和本体论

当您由于昂贵且劳动密集型的标注过程而没有大量已标记数据时,可能有另一种训练模型的方法:基于知识的 NER。基于知识的 NER 模型基于与本体和注释的对应关系进行分类。

照片由德文神Unsplash

具有挑战性的 MedMentions 数据集将他们的注释建立在广泛的 UMLS 本体论的基础上。【3】这个丰富的本体包含了数百万个概念,在几个专注于创建仿生系统的研究中使用。MedMentions 数据集“仅”标注了 35.2 万次 UMLS 概念,但它仍然是最具挑战性的数据集之一。大量的概念使得任何模型都难以记忆或概括。因此,在这个数据集上表现最好的基于 BERT 的模型达到大约 56% F1 的测试分数就不足为奇了。【27】我的同事 Stephan Tulkens 的后续博客文章将尝试使用无监督方法处理 MedMentions 数据集,敬请关注!

回到基于知识的:2013 年,Zhang 和 Elhadad 通过对语料库中每个出现的 TF-IDF 向量进行平均,为每个出现的实体类型创建了签名向量。然后,将这些向量与所有名词短语块的向量进行比较,以识别所有实体。它优于传统的基于字典的方法,但低于最近的监督方法。

吉亚斯万德和凯特通过几项改进超过了张和艾尔哈达德。【28,29,29】他们只使用明确的 UMLS 项作为种子项来生成正反例。这些例子的句法和语义特征被用于训练决策树的集合。这个模型的输出然后被用来扩展例子,以包括模糊的 UMLS 术语。这个循环重复了几次。该方法优于其他非监督方法,并且在一些实体类上,它的性能与使用手动注释的监督系统相当。

类似地,De Vine 等人从自由文本笔记中学习概念嵌入,首先使用 UMLS 附带的匹配器提取概念。【30】然后,他们用概念的 ID 替换文本中的任何跨度,然后通过应用 skip-gram(例如,word2vec)学习概念嵌入。通过在两个小数据集上将概念之间的余弦距离与人类判断相关联来评估这些概念,并获得了积极的结果。

Beam 等人采用了类似的方法,后来他们的嵌入技术公开发布【31】Phan 等人通过使用一种“暹罗”网络来学习姓名嵌入:他们使用预先训练的单词嵌入和字符嵌入作为 BiLSTM 的输入。【32】然后使用 BiLSTM 的输出来计算三个损失:一个损失是惩罚同义词之间的距离(即同义词应该靠得很近),一个损失是惩罚名称和概念(即由名称表示的概念)之间的距离,一个损失是惩罚到“局部上下文”的距离(即概念出现在其中的单词嵌入的平均值)。).他们的模型在许多检索、相似性和关联性任务上优于其他基线。

脸书人工智能的研究人员提出了无监督知识增强语言模型(KALM),它用知识库增强了传统的语言模型,端到端地训练以优化困惑【33】在训练过程中,在给定目前观察到的上下文和作为输入的知识库的情况下,它使用门控机制来控制一个单词是一般单词还是应该被建模为对实体的引用。它随后在预测时间期间使用这种门控机制来预测一个单词是否是一个实体。它不需要任何额外的信息,例如在文本语料库中标记的命名实体标签,并且仍然实现了与现有技术的监督模型相当的性能。

Karadeniz 和 ozgür 解决了实体规范化的问题:将实体映射到一个本体/字典,这对理解被识别的实体是必要的。【34】由于几个原因,这在生物医学领域不是一个要解决的小问题。如前所述,通常存在歧义问题——实体可能根据上下文具有不同的语义。此外,还存在识别在文本中以不同表面形式出现的概念(例如,现在和过去时态,或缩写)的挑战。

作者通过使用带有句法分析信息的预训练单词嵌入,以无监督的方式利用语义和句法信息。他们获得了一个新的最先进的精确分数,以 2.9 个百分点的优势击败了之前的最先进分数。

但是,当您想要提取的实体没有在文本中明确提到,而是;含蓄?举个例子,假设一个句子包含水解这个词。单词H2O 没有被明确地提到,但是你可以推断水参与了这个过程。

Shoshan 和 Radinsky 创造了潜在实体提取(LEE)的任务,在这里你试图识别这些隐含的实体。【35】在他们的研究中,作者使用反应体本体集中于生化反应领域。他们使用预训练的单词嵌入和顶部的 BiLSTM 分类器训练了几个一对一对所有分类器,一个分类器用于一种类型的实体。这里还应用了多任务学习,不仅训练每个分类器的指定实体类型,还训练其他相关类型。作者表明,他们的模型在识别这些潜在实体方面达到了很高的性能。作者得出结论,LEE 任务将显著改进许多 NER 系统和基于它们构建的应用程序。

结束语

生物医学命名实体识别的挑战是不可低估的。幸运的是,对于我们所有在软件产品开发中积极应用人工智能的人来说,有许多聪明的头脑帮助我们处理这个复杂的领域。

我被我们可以用来走得更远的许多“技巧”所鼓舞。例如,您可以使用 CrossWeigh 框架来处理嘈杂的注释,识别和去偏差您的数据,或者使用银标准语料库来预训练您的模型。如果有机会的话,你当然应该在相关的任务中利用迁移学习和多任务学习。

有许多预先训练的模型可用,您可以从多任务学习方案中进行选择。而且,如果你没有可用的带注释的数据,我建议求助于基于知识的系统,它利用本体论或任何其他种类的知识库。最后,考虑在你的文本中是否有隐含的实体。如果是这样,一定不要忽视它们,无论如何都要尝试提取它们。

最后一点:我确信我们已经错过了文献中一些有趣和有前途的技术。如果你知道任何,请在评论中留下回复,与社区的其他人分享(你太棒了)。祝你的 BioNER 之旅好运!感谢我的同事米歇尔·范·德·斯蒂格斯蒂芬·图尔肯斯为这项研究做出的贡献。

参考

【1】v . Yadav 和 S. Bethard,深度学习模型命名实体识别近期进展综述 (2018),第 27 届计算语言学国际会议论文集。

【2】j . Li,A. Sun,J. Han,C. Li,面向命名实体识别的深度学习综述 (2020),IEEE 知识与数据工程汇刊。

【3】s . Mohan 和 D. Li, MedMentions:一个用概念标注的大型生物医学语料库 (2019),2019 年自动化知识库构建会议论文集。

【4】j . d . Kim,T. Ohta,Y. Tsuruoka,Y. Tateisi 和 N. Collier,jnl PBA 生物实体识别任务介绍 (2004),生物医学自然语言处理及其应用国际联合研讨会会议录。

【m . Huang,P. Lai,R.T. Tsai,W. Hsu,修订版 JNLPBA 语料库:用于关系抽取任务的生物医学 NER 语料库修订版 (2019),arXiv:1901.10219【cs .IR】。

****【6】z . Wang,J. Shang,L. Liu,L. Lu,J. Liu,J. Han, CrossWeigh:从不完全标注训练命名实体标记器 (2019),arXiv:1909.01441【cs .CL】。

****【7】e . f . Tjong Kim Sang 和 F. De Meulder,CoNLL-2003 共享任务介绍:独立于语言的命名实体识别 (2003),HLT-NAACL 2003 第七届自然语言学习会议论文集。

****【8】h . Kim 和 J. Kang,你们的生物医学命名实体模型是如何推广到小说实体的? (2021),arXiv:2101.00160【cs。CL】。

****【9】c . Clark,M. Yatskar 和 L. Zettlemoyer,不要走捷径:基于集成的避免已知数据集偏差的方法 (2019),2019 年自然语言处理经验方法会议和第九届自然语言处理国际联合会议论文集。

****【10】j . Lee,W. Yoon,S. Kim,D. Kim,S. Kim,C. Ho So 和 J. Kang, BioBERT:一种用于生物医学文本挖掘的预训练生物医学语言表示模型 (2020),生物信息学。

****【11】l . Weber,m . singer,J. Münchmeyer,M. Habibi,U. Leser 和 A. Akbik, HunFlair:一种用于最新生物医学命名实体识别的易用工具 (2021),生物信息学。

****【12】m . Neumann,D. King,I. Beltagy 和 W. Ammar, ScispaCy:生物医学自然语言处理的快速鲁棒模型 (2019),arXiv:1902.07669【cs .CL】。

l . Weber,J. Münchmeyer,t . rocktschel,M. Habibi,U. Leser, HUNER:用预训练改善生物医学 NER(2019),生物信息学。

【14】【2020】田永辉,沈文伟,宋永辉,夏,何,李,利用句法信息改进生物医学命名实体识别,BMC 生物信息学。

【15】m . r . Khan,M. Ziyadi 和 M. Abdelhady, MT-BioNER:使用深度双向变换器的生物医学命名实体识别的多任务学习 (2020),arXiv:2001.08904 [cs .CL】。

【16】【y . Peng,S. Yan,和 Z. Lu,生物医学自然语言处理中的迁移学习:在十个基准数据集上对 BERT 和 ELMo 的评估 (2019),第 18 届 BioNLP 研讨会和共享任务会议录。

【17】j . m . Giorgi 和 G.D. Bader,用神经网络进行命名实体识别的迁移学习 (2018),第十一届语言资源与评价国际会议论文集。

【18】x . Wang,Y. Zhang,X. Ren,Y. Zhang,M. Zitnik,J. Shang,C. Langlotz,J. Han,深度多任务学习的跨类型生物医学命名实体识别 (2018),生物信息学。

【19】a . AK bik,D.A. Blythe 和 R. Vollgraf,用于序列标注的上下文字符串嵌入 (2018),第 27 届计算语言学国际会议论文集。

【20】a . e . w . Johnson,T.J. Pollard,L. Shen,L.H. Lehman,M. Feng,M. Ghassemi,B. Moody,P. Szolovits,L.A 和 R.G. Mark, MIMIC-III,一个可免费访问的危重病数据库 (2016),科学数据。

m . Hofer,A. Kormilitzin,P. Goldberg 和 A. Nevado-Holgado,医学文本中命名实体识别的少镜头学习 (2018),arXiv:1811.05468【cs .CL】。

E. Hovy,M. Marcus,M. Palmer,L. Ramshaw 和 R Weischedel,onto notes:90%解决方案 (2006),NAACL 人类语言技术会议论文集。

【23】j . Pennington,R. Socher 和 C.D. Manning, GloVe:单词表示的全局向量 (2014),2014 年自然语言处理经验方法会议论文集。

【24】w . Yoon,C. So 和 J. Lee, CollaboNet:用于生物医学命名实体识别的深度神经网络协作 (2019),BMC 生物信息学。

【25】u . Naseem,M. Khushi,V. Reddy,S. Rajendran,I. Razzak 和 J,Kim, BioALBERT:一种简单有效的生物医学命名实体识别预训练语言模型 (2020),arXiv:2009.09223【cs .CL】。

【26】z . Lan,M. Chen,S. Goodman,K. Gimpel,P. Sharma 和 R. Soricut, ALBERT:一个用于语言表征自我监督学习的 Lite BERT(2019),arXiv:1909.11942【cs .CL】。

【27】k . c . Fraser,I. Nejadgholi,B. Bruijn,M. Li,A. LaPlante 和 K.Z. Abidine,使用通用和特定领域深度学习模型从医学文本中提取 UMLS 概念 (2019),arXiv:1910.01274【cs .CL】。

【28】s . Zhang 和 N. Elhadad,无监督生物医学命名实体识别:临床和生物文本实验 (2013),生物医学信息学杂志。

【29】o . Ghiasvand 和 R.J. Kate,无人工标注的临床命名实体识别的学习 (2018),医学信息学解锁。

【30】l . De Vine,G. Zuccon,B. Koopman,L. Sitbon 和 P. Bruza,用神经语言模型进行医学语义相似度 (2014),第 23 届 ACM 信息与知识管理国际会议论文集。

【31】a . l . Beam,B. Kompa,A. Schmaltz,I. Fried,G. Weber,N. Palmer,X. Shi,T. Cai 和 I.S. Kohane,从多模态医学数据的海量来源中学习的临床概念嵌入 (2018),太平洋生物计算研讨会。

【32】m . c . Phan,A. Sun,Y. Tay,生物医学名称的鲁棒表征学习 (2019),计算语言学协会第 57 届年会论文集。

【33】a . Liu,J. Du,V. Stoyanov,知识增强语言模型及其在无监督命名实体识别中的应用 (2019),计算语言学协会北美分会 2019 年会议论文集:人类语言技术。

【34】i̇.Karadeniz 和 a . ozgür,使用单词嵌入和句法重排通过本体链接实体 (2019),BMC 生物信息学。

【35】e . Shoshan 和 K. Radinsky,潜在实体提取:如何提取文本中没有出现的实体? (2018),第 22 届计算自然语言学习会议论文集。

为什么是 0.9?走向深度学习中更好的动量策略。

原文:https://towardsdatascience.com/why-0-9-towards-better-momentum-strategies-in-deep-learning-827408503650?source=collection_archive---------16-----------------------

思想与理论

更复杂的动量策略如何让深度学习不那么痛苦。

(摘自鲍里斯·波亚克的《最优化导论》)

介绍

动量是一种广泛使用的策略,用于加速基于梯度的优化技术的收敛。动量被设计成在低曲率方向上加速学习,而在高曲率方向上不变得不稳定。在深度学习中,大多数实践者将动量的值设置为 0.9,而没有试图进一步调整这个超参数(即,这是许多流行的深度学习包中动量的默认值)。然而,没有迹象表明这种对动量价值的选择是普遍合理的。

在这篇文章中,我们概述了最近的研究表明,在整个训练过程中衰减动量值可以帮助优化过程。特别推荐一个新颖的恶魔动量衰减策略。为了支持这一建议,我们对动量衰减的不同策略进行了大规模分析,并与其他流行的优化策略进行了比较,证明了使用 Demon 进行动量衰减实际上是有用的。

概述

这篇文章将首先总结深度学习优化的相关背景知识,重点介绍当前训练深度模型的常用技术。在此介绍之后,将介绍并激励恶魔动量衰减策略。最后,我们将对 Demon 进行广泛的实证分析,并与各种流行的优化策略进行比较。 总的来说,我们旨在通过这篇文章证明,通过开发更好的策略来处理深度学习中的动量参数,可以获得显著的好处。

背景

对于任何深度学习实践者来说,训练模型在计算上可能是昂贵的,这并不奇怪。当考虑超参数调整过程时,模型训练的计算费用甚至进一步加剧。例如,当考虑超参数调整时,一些最先进的语言模型可以花费数百万美元在公共云资源上进行训练(参见此处了解更多细节)。为了避免如此巨大的训练费用,深度学习社区必须发现优化策略,这些策略使得 (i) 有助于快速收敛, (ii) 能够很好地概括,并且 (iii) 对于超参数调整(相对)健壮。

带动量的随机梯度下降(SGDM)是一种广泛用于深度学习优化的工具。在计算机视觉(CV)领域,SGDM 被用来在几个著名的基准测试中实现最先进的性能。但是,SGDM 的超参数在众所周知的数据集(如 ImageNet)上是高度可调的,因此,用 SGDM 训练的模型的性能通常对超参数设置很敏感。

为了减轻 SGDM 的弱点,开发了自适应的基于梯度的优化工具,其对模型内的每个参数采用不同的学习速率(即,基于一阶梯度信息的历史)。尽管已经提出了许多这样的自适应技术,Adam 仍然是最受欢迎的,而 AdamW 等变体在自然语言处理(NLP)等领域中很常见。尽管自适应方法的收敛速度有所提高,但它们在历史上一直难以达到与 SGDM 相当的泛化性能,并且仍然对超参数调整相对敏感。因此,即使是深度学习优化的最佳方法也是有缺陷的— 没有一种用于训练深度模型的单一方法总是最佳的

这能怎么办?

虽然没有单一的优化策略总是最好的,但我们证明了深度学习社区中很大程度上未探索的衰减动量策略提供了改进的模型性能和超参数鲁棒性。事实上, Demon 动量衰减策略与众多领域中流行的学习速率策略(例如余弦学习速率循环)相比,表现出更加一致的性能。尽管最近的一些研究已经探索了超过 0.9 的简单设置的调整动量,但是还没有进行大规模的经验分析来确定训练期间动量参数的最佳实践。通过这篇帖子,我们希望解决这个问题,并使动量衰减成为深度学习优化的一个众所周知的选项。

最佳动量随 Demon 衰减

虽然存在几种衰退势头的选择,但我们推荐恶魔策略,在本文https://arxiv.org/abs/1910.04952中提出。 Demon 在实践中被广泛评估,并显示出优于所有其他动量衰减时间表。在这里,我们花时间来描述这种势头衰减策略,它的动机,以及如何在实践中实现它。

什么是妖?

(图片由作者提供)

众多众所周知的衰变策略,包括恶魔策略,如上图所示,其中 x 轴代表训练从开始到结束的进程。这些策略中的大多数最初是作为学习率衰减时间表而被推广的。然而,在这篇文章中,我们也评估了每一个动量衰减的有效性。与其他衰减时间表相比,恶魔等到训练后期才显著降低动量值。因此,对于大多数训练,恶魔保持动量值接近 0.9,在后期训练阶段迅速衰减为零。 Demon 策略的动机是衰减梯度对所有未来训练更新的总贡献。关于恶魔的动机的更严谨的描述,可以参考的关联论文,它提供了更广泛的理论和直观的分析。下面的等式给出了 Demon 衰变时间表的确切形式。

恶魔衰变时间表(图片由作者提供)

这里,t表示当前迭代次数,T表示训练时的总迭代次数,β表示动量参数。因此,上面的等式产生了在 Demon 衰变纲图的训练的迭代t时动量参数的值。β的初始值代表动量参数的初始值。一般来说,可以使用值 0.9 来初始化β,但是在实践中观察到稍高的值会产生改进的性能(例如,0.95 而不是 0.9)。在所有情况下, Demon 用于将动量参数从训练开始时的初始值衰减到训练结束时的零。

向现有优化器添加 Demon

虽然恶魔的衰变时间表并不复杂,但是确定如何将这个时间表整合到现有的深度学习优化器中并不是立即显而易见的。为了帮助理解如何将 Demon 用于 SGDM 和 Adam 等流行的优化器,我们在下面提供了这些优化器的 Demon 变体的伪代码描述。

SGDM 和亚当中的恶魔(图片由作者提供)

从上面的算法描述中可以看出,SGDM 和 Adam 优化器并没有因为添加了 Demon 而有很大的改变。特别是, Demon 仅用于修改 SGDM 和 Adam 中第一个矩估计(即训练期间随机梯度上的滑动平均)的衰减因子。优化器的其他方面都没有改变,这表明在实践中采用 Demon 实际上非常简单。

代码中的恶魔

实现 Demon 时间表的代码也非常简单。我们在下面用 python 语法提供它。

Python 中的 Demon 代码(图片由作者提供)

恶魔的实验分析

我们在实践中广泛评价。在几个数据集上提供了实验,如 MNIST,CIFAR-10/100,FMNIST,STL-10,Tiny ImageNet,PTB 和 GLUE。此外, Demon 经过了众多流行模型架构的测试,包括 resnet 和 Wide ResNets、非残差 CNN 架构(即 VGG)、LSTMs、变压器(即伯特微调)、VAEs、噪声条件分数网络和胶囊网络。我们使用 SGDM 和 Adam 进行基线实验,每个实验有 10 个不同的学习速率和动量衰减变量。此外,基线实验提供了广泛的最新优化策略,如 YellowFin,AMSGrad,AdamW,QHAdam,准双曲动量和聚集动量。我们的目标是在下一节中总结所有这些实验,并展示使用 Demon 进行动量衰减所带来的好处。

大局

在执行的所有实验中(即所有数据集、模型和优化策略组合),我们记录了与所有其他优化策略相比,每个优化策略产生前 1 或前 3 性能的次数。直观地说,这种度量反映了优化策略在模型和领域中的一致性。下面给出了最佳性能优化策略的性能统计数据。

不同优化策略的前 1 名和前 3 名性能比率(图片由作者提供)

从上面可以看出, Demon 在不同的域中产生了极其一致的性能。特别是,它在近 40%的实验中产生了任何优化策略的最佳性能——比第二好的余弦学习率时间表绝对提高了 20%。此外, Demon 与其他优化器相比,在超过 85%的总实验中获得了前 3 名的性能,这表明 Demon 即使不是最好的,也仍然表现良好。

有趣的是,除了与许多广泛使用的优化策略相比产生更一致的性能之外, Demon 在动量衰减方面明显优于其他调度。事实上,在所有实验设置中,任何其他动量衰减策略都无法实现顶级性能。这一发现强调了这样一个事实,即当选择适当的衰变策略时,动量衰变是最有效的。基于这些结果,恶魔显然是那些被考虑的最佳动量衰减策略。

详细的实验结果

Demon 已经在多个不同领域的众多模型和数据集上进行了测试。在这里,我们提供了使用 Demon 运行的所有实验的详细结果。对于这些实验中的每一个, Demon 都与众多基准优化方法进行了比较(如本节开头所述)。应该注意的是,下面显示的实验结果用于生成上面概述的汇总统计数据,从而揭示出 Demon 具有迄今为止所考虑的任何优化方法中最一致的性能。

(图片由作者提供)

(图片由作者提供)

超参数稳健性

除了加速训练和推广之外,降低超参数敏感性的优化策略也是需要的,因为它们可以减少超参数调整的需要,这在实践中是计算昂贵的。我们通过记录各种可能的超参数的模型性能(即测试精度),评估了 Demon 相对于 SGDM 和 Adam 优化器(即深度学习中最广泛使用的优化器)对不同超参数设置的鲁棒性。

超参数稳健性结果(图片由作者提供)

从左到右,上面描述的实验是在 STL-10 上使用 SGDM 的 Wide ResNet,在 CIFAR-100 上使用 SGDM 的 VGG,以及在 CIFAR10 上使用 Adam 的 ResNet-20。 Demon 性能显示在顶行,而普通优化器(即 SGDM 和 Adam)的性能显示在底行。较浅的颜色表示较高的性能,并且单独的模型被训练以在上述每个瓦片内生成测量值。对于测试的所有实验设置,可以看出,在训练期间使用 Demon 会在不同的超参数设置中产生明显更大的光带。例如,在 STL-10 数据集上, Demon 除了与 SGDM 相比实现了更好的顶级性能之外,在每一列中平均有 5-6 个浅色瓦片,而 vanilla SGDM 只有 1-3 个(大致如此)。这些结果表明 Demon 在大范围的超参数上产生了合理的性能,这意味着它对超参数调整更加鲁棒。

其他值得注意的实证结果

恶魔的实验支持是巨大的,我们推荐任何对具体实验指标和结果感兴趣的人参考的论文。然而,有几个关于恶魔的额外实验结果特别值得一提。

微调用恶魔上胶

变压器模型是深度学习中训练计算量最大的模型之一。为了测试使用 Demon 是否可以提高变压器的性能,我们使用 Demon 和 Adam 对 BERT 进行了微调。结果如下所示。

恶魔大战胶水上的亚当(图片由作者提供)

可以看出, Demon 在 GLUE 数据集上的 BERT 微调方面优于 Adam。此外,为了实现这些结果,不需要对 Demon 进行额外的微调。我们只需使用其他实验中使用的相同超参数,并以最小的努力获得更好的性能。这个结果很有趣,特别是因为 Adam,它是 NLP 领域中的一个首选优化器,已经在 GLUE 数据集上进行了广泛的调优。

定性结果为 NCSN

NCSN 在 CIFAR-10 上的初始得分(图片由作者提供)

我们发现在 CIFAR-10 上训练的噪声条件得分网络 (NCSN)在数量上优于 AdamDemon,如上表所示。然而,当用 Adam 和 Demon 训练的模型的结果被定性地检查时,我们注意到一个有趣的模式。

亚当(左)和恶魔(右)的 NCSN 结果(图片由作者提供)

从上面可以看出,用亚当训练的 NCSN,尽管获得了稍微提高的盗梦空间分数,但产生了看起来不自然的图像(即,所有图像看起来都具有绿色背景)。相比之下,用恶魔训练的 NCSN 产生的图像看起来明显更真实。

结论

深度学习社区的大多数从业者将动量超参数设置为 0.9,并将其遗忘。我们认为这不是最优的,通过采用更复杂的动量策略可以获得显著的收益。特别是,我们介绍了 Demon 动量衰减时间表,并证明与许多其他广泛使用的优化器相比,它产生了显著改善的经验性能。 Demon 非常容易使用,我们鼓励深度学习社区尝试一下。关于这篇文章没有包括的更多细节,请随意阅读恶魔写的论文

非常感谢你阅读这篇文章,非常感谢你的任何反馈。对于任何有兴趣了解更多类似研究的人来说,本文中介绍的项目是由莱斯大学计算机科学系优化实验室进行的。查看此处了解该实验室的更多细节,该实验室由Anastasios Kyrillidis博士领导。

为什么数据科学导师可以在 2022 年帮助你

原文:https://towardsdatascience.com/why-a-data-science-mentor-can-help-you-in-2022-a7b10152a069?source=collection_archive---------11-----------------------

办公时间

从数据科学导师那里学到的两年经验

照片由德鲁·比默Unsplash 拍摄

拥有一个数据科学导师可以帮助你提升你的职业和教育。当我刚开始作为一名数据科学家工作时,我有两位导师。一个是经验丰富的数据科学家,从团队成立之初就一直在团队中,而另一个是技术人员,想要指导年轻女性。从那以后,作为我职业发展的一部分,我一直在学习如何指导个人、管理团队以及与团队分享愿景。

最近,我在演讲会上做了一个名为的演讲,一次推挤。根据《柯林斯字典》的解释,push comes 的意思是“当事情变得危急时……需要做出决定。”通常,你会对你的职业生涯做出决定,你是否需要导师不应该是其中之一。所以,让推来推去,找到导师!今天,我想和你们分享过去一年我从导师那里学到的一些最重要的经验。

1.你是哪种类型的贡献者?

当我第一次开始在数据领域的旅程时,我和一位资深数据科学家坐在一起,问他我可以做些什么。在这次谈话中,他问了我一个很重要的问题:你现在是什么类型的贡献者,你想在哪里?当时,我的回答含糊不清,但现在回想起来,我对自己的目标有了更清晰的认识。当你刚加入一个团队或公司时,可能很难知道你希望你的职业生涯走向何方。但这是当时我能被问到的最好的问题。

当你和你的导师在一起时,问问他们职业发展和目标。例如,在你的团队和公司中,不同的职业道路是什么样的?你如何为你职业生涯的下一步做准备?一位导师可以帮助你回答这些问题,并问你一些你可能不会问自己的难题。

现在我已经在我的道路上走了几年,我对我想去的地方和我想做的工作类型有了更好的想法。我可以在与我的新导师一起工作时回答这些问题,并针对我工作的具体公司提出这些问题。如果我没有我的第一位导师,他推动我探索我的选择,我不知道我现在是否会对我的职业目标有如此好的把握。所以利用你的机会,找一个好的导师帮你发现你的道路。如果你觉得在你的团队中找不到合适的人,那就在你的公司或者你所在的行业中寻找可以和你一起工作的人。不要害怕伸出手去问别人。

为什么需要导师?他们会问你一些尖锐的问题,要求你反思自己的决定和下一步行动。你的导师可以帮助你更好地了解你在工作和职业中想要什么。你可能会改变你的想法,但是如果你有一个适当的计划,你可以朝着它努力。

2.展示并理解你的附加值

要学的最具挑战性的一课是理解我的项目和工作所带来的附加值。这在与商业利益相关者合作时尤为重要。这些利益相关者想知道你给企业增加了什么,以及他们如何利用它。

当我学习如何展示附加值时,我遇到的最大的绊脚石是解释我的工作成果。我经常展示我完成一项任务的行动,比如我在 sprint 中完成的用户故事。但这不是人们想看到的。相反,他们想看到你的结果摘要。例如:

  • 你的模型的准确性提高了吗?如果是,改善的程度和影响是什么。
  • 您是否自动化或简化了流程?这项工作节省了多少时间?清理一个流程节省了多少钱?

像这样跟踪指标对于展示您的工作、展示您的影响以及跟踪您的进展来说是一笔宝贵的资产。如果我没有一个导师来帮助我理解这种分析的重要性,我不相信我会这么快获得这种技能。导师是宝贵的资产,他们可以帮助你学习你可能从未考虑过的技能。

你为什么需要一个导师?在工作中有一个紧密合作的导师可以帮助你获得宝贵的技能,比如学习跟踪项目的绩效。此外,他们可以教你如何向利益相关者积极展示你的工作,并分享它如何为企业增加价值。

3.讲述你的故事

在这一年中,我在自己撰写的文章或发表的演讲中与共事过的学员分享了我的故事。在这段时间里,我也和我的导师们谈论了我的经历和我可以改进的地方。

我的导师给我的最重要的建议之一就是讲述你的故事。

你知道你是谁,你完成了什么,你从你的经历中学到了什么。但是你能和别人分享吗?即使你觉得自己的职业生涯才刚刚开始,你也已经学到了可以分享的经验和见解。这是我开始用媒体写作的主要原因之一。即使我才大学毕业几年,我仍然可以尝试帮助其他人,他们可能没有像我一样的机会去学习新的东西。通过这些对话,我意识到我有一些我经常说的经验,可以很好地转化为书面形式,我打赌你有!无论是公开演讲,文章写作,指导,还是其他形式的交流,分享你的故事。

为什么需要导师?当你思考他们提出的挑战性问题并对你们的讨论进行反思时,指导关系可以帮助你更多地了解自己。随着你成长为一名数据科学家,导师还可以教你如何展示你的故事和发展你的个人品牌。

最后的想法

数据科学领域的导师可以教你很多东西。一位导师可以在你的项目中帮助你,提供反馈,并在你需要帮助时帮助推动你前进。考虑在 2022 年找一个导师,尤其是如果你是从数据科学开始的话。当你在自己的岗位上学习和成长时,找到一个会为你辩护和支持你的人会是一笔宝贵的财富。这里有三个问题你可以问你的导师:

  1. 你是什么类型的贡献者,你想成为什么样的贡献者?考虑你在职业生涯中想要什么,并与你的导师讨论如何才能实现。2022 年或者未来几年,你的职业生涯如何才能走到下一步?
  2. 你如何最好地向企业和利益相关者展示你的增值?你能获得什么结果,那是怎样的积极影响?
  3. 你如何发展你的个人品牌并与他人分享你的故事?如何开始把自己学到的东西教给别人?

在过去的一年里,你从导师那里学到了什么?你在考虑 2022 年的导师吗?

感谢阅读!我希望你喜欢阅读我今年学到的东西。如果你愿意,你可以通过使用这个链接成为一个媒体成员来支持我的写作。

为什么阿德和 FDE 不是运动预测的最佳指标

原文:https://towardsdatascience.com/why-ade-and-fde-might-not-be-the-best-metrics-to-score-motion-prediction-model-performance-and-what-1980366d37be?source=collection_archive---------6-----------------------

行业笔记

最流行的运动预测度量的缺点和可能的替代方法。

[图片由作者提供]

介绍

现代自动驾驶技术通常意味着三种任务:感知、预测和规划任务。感知提供关于周围环境、静态和可移动障碍物的信息。预测提供了观察到的可移动物体的未来轨迹。在规划期间,该信息被处理,然后创建相对于机器人目标的未来轨迹。

首先检测周围物体(感知),然后预测其未来轨迹(预测)然后规划机器人路径(规划)[图片由作者提供]。

预测方法有很多种,大部分都是产生一个或几个预测轨迹。为了获得预测的质量度量,应该将预测轨迹与地面真实轨迹进行比较,为了做到这一点,有多种可能的度量可用。原则上,它可以是任何能够比较两个时间序列的函数,例如,最长公共子序列豪斯多夫距离

预测和地面真实轨迹的例子。为了评估预测的质量,应该将它们与一些度量标准进行比较。

最常见的度量是平均位移误差(所有轨迹点之间的平均 L2 距离)和最终位移误差(最终轨迹点之间的 FDE - L2 距离)。

平均位移误差(ADE)和最终位移误差(FDE)[图片由作者提供]。

这些指标很容易计算,也相对容易解释,但是它们有一些潜在的缺点,我想在这篇博文中讨论一下。首先,让我们从平面的角度来看一个预测轨迹的质量。

规划者视角

一般来说,规划者的任务之一就是避免与周围物体发生碰撞。从这个角度来看,如果预测的轨迹导致与自我-智能体路径相同的交集,这是一个很好的预测。在这种情况下,规划者可以根据预测采取行动,避免进一步的碰撞。如果预测的轨迹与未来的自我-代理路径完全不相交,但地面真相相交,则可以视为最坏的情况。在这种情况下,计划者可能不会行动并击中目标。介于两者之间的情况可能会导致更安全的情况(如预测更早的交叉口)和更危险的情况(如预测更晚的交叉口)。

机器人可能会与有交点的轨迹对齐,而忽略没有交点的轨迹[图片由作者提供]。

因此,这里的要点是,预测应该提供与机器人的规划路径尽可能接近地面事实的交集。

艾德和 FDE 怎么了

阿德和 FDE 没有考虑所提供的交叉点是否接近地面真相,此外,这两种度量标准可以对指向相反方向的轨迹进行相似的评分。为了说明这一点,我们来看下面的动画:

具有相同 ADE 分数的轨迹子集[图片由作者提供]。

考虑一些任意的地面真实轨迹(蓝点)。有一个具有相似 ADE 分数的轨迹子集,该分数在动画的每一步都从 0 到 5m 变化。可以看到,有许多轨迹指向不同甚至相反的方向,但这些轨迹与更长但指向正确方向的轨迹得分相同。FDE 度量表现类似。

此外,FDE 还有一个额外的缺点,它可以完全错误的轨迹得分。考虑下面的图像:

两条轨迹都有一个相似的终点[图片由作者提供]。

在这里,FDE 得分的值最低,为 0。但是预测的轨迹并不完美。这些缺点使得创建另一个没有这些属性的指标成为明智的选择。

我们能做些什么呢?

把轨迹的“相交能力”考虑进去,似乎是合理的。最直接的方法可能是测量到地面真实交点的距离,但这很难,因为它取决于机器人的规划路径。此外,这种度量没有考虑没有交叉点的轨迹的质量。那么如何才能在交集能力上建立代理呢?

我们可以把一个轨迹的相交能力看作它可以相交的轨迹集的大小。这样一个集合是无限的,为了使它易于处理,我们可以通过限制离轨迹的距离来考虑它的子集。通过这样做,可以在轨迹周围创建一个缓冲区,该缓冲区可以作为相交能力的代理。

可作为轨迹相交能力代理的轨迹周围缓冲区示例。缓冲区越大,可以相交的轨迹就越多。

通过这种方式,轨迹可以表示为由轨迹本身和缓冲区大小定义的多边形。因此,可以计算地面真实值和预测轨迹之间的交集联合分数来比较它们。

将轨迹表示为多边形。现在可以计算 IoU 来比较轨迹[图片由作者提供]。

这种度量具有几个期望的属性:

  1. 它始终在范围[0,1]内。1 是最佳匹配。
  2. 如果预测轨迹指向与地面实况相反的方向,则得分为 0。这就像有一个内部失误率,并惩罚完全错误的预测。
  3. 人们可以改变缓冲区的大小,改变它对错误预测的惩罚力度。

缓冲器的大小可以由自车的典型规划范围来确定,然后可以针对期望的属性进行调整。例如,让我们来看看三种不同缓冲区大小具有相同分数的轨迹子集:

具有相同 IoU 分数的轨迹子集[图片由作者提供]。

只有非常接近地面实况的轨迹对于小的缓冲区大小具有高的分数。缓冲区的大小越大,分数相同的轨迹范围就越大。具有低 IoU 的分数对应于至少前几个点接近地面真实情况的轨迹。等于 1 的分数总是对应于与地面真实情况完全匹配的轨迹。这种度量没有上述阿德和 FDE 的缺点,可以从另一个角度用于预测比较。

结论

理解性能指标的行为总是很重要的,运动预测任务也不例外。最常见的度量标准,如 ADE 和 FDE,提供了关于模型性能的有用信息,但也有一些限制和缺点。为了将这些限制考虑在内,人们不应该只受这些度量的限制,而应该从不同的角度,尤其是从那些可以相互补偿的角度来估计预测性能。所提出的度量可以用来代替经典的 FDE 或 ADE,或者作为评分预测的补充度量。根据您的应用程序的特定需求创建一组指标,并可视化一组具有相似分数的轨迹以更好地理解您的指标,这可能是一个好主意。

为什么人工智能伦理学需要文化驱动的方法

原文:https://towardsdatascience.com/why-ai-ethics-requires-a-culture-driven-approach-26f451afa29f?source=collection_archive---------41-----------------------

许多组织都缺少一大块:通过合作建立代表原则的文化。

照片由 Unsplash43 点击北

蒂姆尼特·格布鲁(Timnit Gebru)是一名埃塞俄比亚裔美国人,以其进步的人工智能伦理研究而闻名,他是谷歌伦理人工智能团队的联合负责人,周四在一条推文中表示,她因一篇强调人工智能偏见的研究论文而被谷歌解雇。虽然人工智能伦理研究人员和社会学家表达了他们对这一举动的担忧,但在当前组织对人工智能伦理的方法中存在着明显的差距。那就是合作建立文化来代表人工智能伦理原则。

数据或技术的所有权或使用权总是不平衡的,一边是经济和政治,另一边是权利和透明度。由于对偏见、政治影响、仇恨言论和歧视的担忧,技术伦理(人工智能伦理)正在成为全球科技企业在平台或产品伦理和负责任的人工智能方面的董事会议。

学术智库和技术巨头已经开发并分享了人工智能伦理的几个框架和原则。像谷歌和脸书这样的公司已经公开了他们的道德原则,并启动了一个分享见解的过程,分享他们在当前时代用什么和如何处理关键的道德问题。通常,框架或公司原则试图涵盖许多主题(如果不是全部的话),包括隐私、不歧视、安全和安保、问责制、透明度和可解释性以及保护人类价值。

聚焦人工智能伦理

公司的努力围绕三个主要领域发展:( a)建立原则、政策、指南、清单和焦点小组,以处理人工智能伦理,包括负责任的人工智能领导者和/或产品经理;(b)开展研究,以了解关键的道德问题并找到解决方案,(必要时利用或配合学术/学者的支持),并定期发布或分享有关努力或研究成果的最新情况;(c)使战略和倡议与人工智能伦理原则相一致,并在某些情况下带来或建立工具来帮助整个社区解决选定的伦理挑战。

这些努力虽然值得称赞,但极其有限。这些努力中有许多是由少数个人或群体做出的,公平和责任的定义是非常动态的或不断发展的,并且这些努力是针对最明显的挑战。它没有解决组织内存在的相互冲突的方法。这其中缺少了一大块,那就是合作建立文化来代表原则。

缺失的缺口

关于人工智能中的伦理,我们揭露的挑战比实际上要少。当 Joy Buolamwini 在 2017 年的 Ted 演讲(我如何与算法中的偏见作斗争)中发言时,使用面部识别的组织开始重新审视他们的产品和这类产品中固有的偏见。算法中的偏见并没有就此结束,随着越来越多的模型被开发,越来越多的数据被注释,越来越多的用例被识别,它还在继续。作为一个社会,我们天生就有偏见,并试图在某些方面采取初步措施来恢复(例如男女薪酬平等)

虽然政策和原则是一个很好的开始,但培养这种文化可能是持久的;人们有着共同的使命,并自愿与负责任的行为保持一致。文化不能用一套任务来建立;对于那些已经将人工智能伦理原则确立为他们的目标的组织来说,他们需要着眼于朝着它前进。这一进程将需要协调一些因素,包括信念(接受某事存在/为真,无需证明)、感知(理解或看待某事的方式)、身份(决定某人/某事是谁或什么的特征)、意象(视觉象征)、判断(结论或意见)和为任务协同工作的利益相关者的情绪(本能或直觉)。

人工智能伦理的文化驱动方法

这些因素可能都不仅仅取决于事实。这些因素中的每一个都对我们个人和集体的思想和行为产生独立或相互依赖的影响。让我们看看关键因素,以及影响这些因素是如何驱动文化现象的:

1。培养对道德准则的更广泛的情感:

情绪是公司所代表的原则的强有力的传达者和影响者。他们在宏观层面上是有效沟通的推动者,在个人层面上,它激发了许多携带这种原则情感的个人的自豪感和人生目标。结构化的交流和参与故事,生活经历,努力使社会的一部分从父权制中发展出来,是情感可以发展的一些方式。当对人工智能伦理的规定原则采取行动和努力时,情绪能够产生积极的神经反应,并对偏离这些原则表现出消极的神经反应,从而起到威慑作用。

2。向组织灌输对道德原则的信念

信念和感知很重要,因为员工并不总是了解组织对人工智能伦理原则的感受有多深。灌输共同的信念和认知需要战略方法来塑造与目标同步的商业模式,协调各级领导,设计沟通和展示代表性行为。例如,如果利益相关者不认为一个组织解决歧视问题的努力是有限和不可靠的,那么上述努力(原则、政策、研究等)对他们的影响将是有限的。

如果组织期望员工和利益相关者以某种方式行事,就有必要注意灌输这些信念。要做到这一点,可以将道德原则作为员工和利益相关方目标的一部分,或者确保道德原则成为利益相关方的关键战略讨论点。例如,Martin Fishbein 和 Icek Ajzen 在他们的“理性行动理论”中提到,行为的意图先于实际行为,这种意图是相信实施这种行为会导致某些结果的结果。这些反过来帮助组织创造一个环境,帮助人们提高他们对组织应该代表的价值观和原则的声音,从而引导方向。

3。不断丰富信念和情感

灌输信念和情绪的方法本身不会有显著的影响,除非这种努力是一致的。在这种情况下,保持一致并不局限于做同样的事情,而是通过每一次尝试来丰富其中的努力。例如,确定或创新与员工和利益相关者互动的方式,将故事讲述与真实世界的见解/事件联系起来等。Eric Van den Steen 在他的研究(“共同信念的起源”)中提到,人们更喜欢与分享他们信念和假设的人一起工作,因为这样的人“会做正确的事情”,并坚持认为信念会随着共同学习的时间而演变。这种方法必须渗透到新员工,包括横向招聘、第三方和业务合作伙伴,尤其是董事会和高级管理层。

结论

在某些方面,在人工智能伦理问题上保持沉默可能会反映出组织的不良表现,并表现出共谋,正如在 Gebru 的案例中可以看到的那样。这与组织内外沟通方式的语义差异无关。着眼于灌输共同的信念或实现积极的感知,并创造一种对人工智能道德的令人信服的情感,这不仅是必不可少的,而且是品牌和业务蓬勃发展的必要条件,因为与既定原则/价值观不一致的声誉的负面影响可能是灾难性的。因此,有必要对人工智能伦理有一个整体的看法,并通过向各种利益相关者灌输价值观来合作建立负责任的人工智能或人工智能伦理文化。

此前发布于 Linkedin Pulse ( 此处)

为什么算法不公平?

原文:https://towardsdatascience.com/why-algorithms-are-unfair-202659af3f57?source=collection_archive---------35-----------------------

旅行、移动和交付服务平台的试金石

资料来源:Freepik.com

近年来,旅游(票务)、移动(交通网络和打车平台)和送货服务平台已经成为一种常态,不用说,我们许多人都非常感谢《新冠肺炎时报》对他们的支持。凭借深厚的技术基础、整合的生态系统观点和满足客户需求的努力,他们已经成为 gig 经济的重要贡献者。此外,这些应用与数以百万计的用户和数以千计的合作伙伴有着内在的联系,能够满足他们的旅行、移动和交付需求。这种应用程序的算法公平性是必不可少的。它承担了更多的重要性,因为许多这些算法是无人监督的,给定的超实时行动不能被人类界面监控。

上周,在欧洲多个国家开展业务的在线食品配送公司 Deliveroo 被意大利一家法院勒令支付 5 万欧元,原因是该公司使用了一种歧视性的算法来对其骑手进行排名。有问题的算法,一个声誉排名算法,对违反当地劳动法的 gig 递送工人进行排名。例如,该算法根据送货工人的出勤情况对他们的声誉进行排名,而没有考虑可能受法律保护的原因,包括骑手生病。

虽然 Deliveroo 回应说,这一判断是基于一种假设的可能性,而且他们最近没有使用有问题的算法,但问题仍然存在:旅行、移动和交付服务平台算法公平吗?

Gig travel、mobility 和 delivery 公司使用机器学习和人工智能进步作为其商业模式的核心元素,以应对环境中的紧迫挑战。开发这些算法是为了解决特定的问题陈述,并且在许多方面局限于实现这样的目标。为了提高性能,使用了一层优化技术来为所述目标获得最佳的可用结果。

首先,目标可以是用另一个内在条件来解决问题陈述(例如,应该导致更好的收入)。例如,一个旅游票务应用程序总是推荐价格较高的座位作为首选座位,而不是价格较低的座位。在这种情况下,算法的目标是通过在预订时尽早选择座位来简化旅行。然而,该算法似乎被限制为促进优质座位的选择。类似地,出租车聚合器提供了一个选项,只需点击一个按钮,就可以预订任何可用类别的出租车(经济舱/高级舱)。然而,当点击时,它总是预订一个高级类别,而不是经济舱,尽管经济舱是可用的。

第二,例如,目标可以是为驾驶员更好地分配乘车,或者为顾客减少预计到达时间(ETA)。实际上,这些目标不一定是算法开发的相互包容的目标,除非减少的 ETA 是游乐设备分配的一个影响因素。

让我们考虑一个平台正在寻求提高驱动程序合作伙伴的收入(其中一部分将是公司收入),可能有几个目标,一个或多个数据科学家可能会关注。它们包括激励忠诚度、更好的乘车分配、优化路线和司机定价。为了激励忠诚度,可能存在定义驾驶员忠诚度的排名算法,该算法考虑包括日常活动、登录时间(供应时间)、获得的终身价值(LTV)和客户评级在内的指标。实际上,这些排名将受各自国家劳动法规的约束,可能不会像 Deliveroo 的情况一样,歧视司机缺席(未登录平台)的合法原因。此外,通过向排名高的驾驶员提供激励,追求使这些驾驶员优先于其他驾驶员的无限循环,其中后者将在一段时间内受到歧视或劝阻。这是导致人们注意到预测性监管算法表现不公平、边缘化某些教派的相同背景。

类似地,智能分配乘车目标将具有层,这些层是有助于某些结果的算法。这些可能包括在前往司机首选目的地的途中分配乘车,或通过取消需要司机注意掉头的预订来限制取消。在后一种情况下,目标(限制取消)是通过引入约束(消除预订)来实现的。在上述案例中,考虑到目标不需要相互包容的现实,这可以被认为是对贫困客户的歧视。

此外,动态价格优化或社会验证方法,如果不试图平衡司机合作伙伴和客户的目标,可能会对另一方产生歧视或偏见。此外,使用从司机伙伴和客户/用户的设备中挖掘的数据来预测竞争信号(无论司机是在另一个平台上驾驶还是客户在另一个平台上乘坐),本质上与数据道德和竞争实践相冲突。

这种算法公平性的问题是由许多原因造成的,包括代表性不足或不平衡的数据集,算法的有限集体观点,或组织内跨团队分层的多样化或冲突的目标或选择。

虽然新兴的研究人员试图优化算法以平衡一个或多个目标的结果,但平衡所有目标似乎并不明显。此外,这种平衡所有可能出现歧视的因素的方法不会成为旅游、移动或递送公司的首选商业选择。如果它不是首选的商业选择,它将不会为他们提供足够的激励来投资于会影响其延迟的计算密集型优化模型。

针对这种广泛使用的应用程序的自我调节算法公平性的努力对于保护对这种问题没有既定理解的利益相关者是至关重要的。与此同时,算法公平行动主义、监管框架、算法审计和社会影响商业模式应该也将有助于从当前阶段取得进展。在那之前,算法的歧视仍将不可避免。

为什么(以及如何)将笔记本投入生产

原文:https://towardsdatascience.com/why-and-how-to-put-notebooks-in-production-667fc3979dca?source=collection_archive---------8-----------------------

使用现代开源工具部署、测试和调试 Jupyter 笔记本电脑。

Jupyter 实验室截图(鸣谢:【jupyter.org】T2)

笔记本生产放在同一个句子中,肯定会引发一场激烈的网上辩论。这个话题经常出现,经常听到团队完全放弃笔记本电脑,因为它们不是用于生产的。不幸的是,讨论经常集中在当前工具已经解决的问题上,但是对于许多从业者来说,解决方案仍然是未知的。这篇文章展示了如何克服 Jupyter notebook 的一些限制,提出了一个工作流程来简化它们在生产中的使用,并讨论了仍然需要解决的问题。

笔记本的简史

计算笔记本的起源来自唐纳德·克努特介绍的识字编程。其核心是,这种思想提倡编写将源代码和文档交错的程序,以使程序更具可读性。笔记本电脑通过添加其他功能,如嵌入式图形和交互式代码执行,扩展了这一理念。

结合这三个元素(将代码与文档交错、嵌入图形和交互性)为数据探索提供了一个强大的界面。真实世界的数据总是带有特殊性;交叉文档有助于指出它们。数据模式仅在通过嵌入图形可视化数据时出现。最后,交互性允许我们迭代我们的分析,以避免每一次改变都要从头开始。

笔记本的问题

到目前为止,我还没有特别提到任何笔记本的实现。有多种风格可供选择,但是对于这篇文章的剩余部分,我将参考 Jupyter 笔记本。

为了支持交错文档,Jupyter 支持 Markdown 单元格。对于嵌入式图形,Jupyter 使用 base64 序列化图像,对于交互性,它公开了一个 web 应用程序,允许用户添加和执行代码。

这种实现决策有很大的副作用:

  1. 文件大小。如果笔记本包含图像,文件大小会大大增加,很快就会破坏 git 存储库。
  2. 版本控制。 .ipynb文件是 JSON 文件。git diff输出版本之间难以辨认的比较,使得代码审查变得困难。
  3. 隐藏状态。由于用户可以以任意顺序执行代码,这可能会产生中断的代码,当顺序运行单元时,其记录的输出不匹配。
  4. 测试/调试。鉴于笔记本的交互性,代码行增长很快。很快,你就会得到一个有一百个难以测试和调试的电池的笔记本。

文件大小和版本

前两个问题是.ipynb实现的结果。幸运的是,它们很容易用当前的工具解决。例如,如果我们可以在 git 上存储相对较大的文件,我们可以配置 git 使用不同的算法为.ipynb文件生成 diff 视图, nbdime 允许我们这样做。

如果我们关心 git 版本文件大小,我们可以完全替换.ipynb格式。 Jupytext 允许 Jupyter 将.py(以及其他)文件作为笔记本打开;警告是任何输出都会丢失,因为.py文件不支持嵌入图形。但是,您可以使用 jupytext 配对特性将输出保存在一个单独的文件中。

大多数人都不知道 Jupyter 不知道底层的文件格式。感觉像笔记本的东西并不意味着一定是 **.ipynb** 文件。改变底层文件格式解决了大小和版本问题;让我们来关注一下真题:隐藏状态

隐藏状态

Jupyter 允许用户交互地添加和执行代码单元。当处理新数据集时,这非常有用。它使我们能够探索和清理我们的数据,同时保留迄今为止我们所执行的记录(代码和输出)。但数据探索过程多是试错;我们经常修改并重新执行以前的单元格,导致单元格的历史不是线性的。最近,一项对 GitHub 上 1000 万台笔记本的分析发现,36%的 Jupyter 笔记本拥有以非线性顺序执行的单元。

笔记本的隐藏状态是迄今为止对笔记本最重要的(也是最有效的)批评。这是笔记本的悖论:任意的单元格执行简化了数据探索,但是它的过度使用经常产生不可复制的代码。图片作者。

调试/测试

笔记本的隐藏状态是迄今为止对笔记本最重要的(也是最有效的)批评。这是笔记本的悖论:任意的单元格执行简化了数据探索,但是它的过度使用经常产生不可复制的代码。

但即使是完美的线性笔记本也有其他问题;主要是它们很难调试和测试。这有两个主要原因。首先,笔记本是有机进化的,一旦它们变得足够大,就会涉及太多的变量,以至于很难对执行流程进行推理。第二个原因是笔记本内部定义的函数不能进行单元测试(尽管这正在改变),因为我们不能轻易地将.ipynb文件中定义的函数导入测试模块。我们可能决定在一个.py文件中定义函数,并将它们导入到笔记本中来解决这个问题。尽管如此,如果没有正确完成,这将导致手动编辑sys.pathPYTHONPATH,从而导致其他问题。

笔记本中原型问题然后被重构用于生产

考虑到这样的问题,团队不允许在产品代码中使用笔记本是很自然的。常见的做法是使用笔记本进行原型制作,并将代码重构为模块、函数和脚本进行部署。通常,数据科学家负责原型模型;然后,工程师接手,清理代码并部署。重构笔记本是一个痛苦、缓慢且容易出错的过程,会给数据科学家和工程师带来摩擦和挫折。

在正常的重构过程中,工程师会做一些小的改动并运行测试套件,以确保一切都正常工作。不幸的是,数据科学家的代码很少附带全面的测试套件(为数据科学家辩护:当你的工作成果以你的模型有多好来衡量时,很难考虑代码测试)。缺乏测试极大地增加了重构过程的难度。

另一方面,软件项目需要维护。虽然工程师可能能够做到这一点,但数据科学家最适合完成诸如模型重新训练之类的任务。重构过程发生后,即使是编写原始代码的数据科学家也很难浏览工程师部署的重构版本。更糟糕的是,由于代码已经不在笔记本中,他们不能再交互地执行它。最终发生的是生产代码和新开发笔记本之间的大量复制粘贴。

如您所见,这是一个低效的过程,经常会导致管道中断,并大大降低部署更新所需的时间。所有这些都造成了过度的负担,在某些情况下,导致公司由于高昂的维护成本而放弃机器学习项目。

在生产中拥抱笔记本电脑

对于我职业生涯中完成的大多数机器学习项目,我负责端到端的过程:探索数据集以创建新的模型特征,训练模型,并部署它们。我亲身经历过这种痛苦的重构过程,我不得不在笔记本环境和产品代码库之间来回移动。在我与数据打交道的最初几年,我认为这个问题是理所当然的,并学会了忍受它。然而,随着我开始参与更重要的项目,这种方式对我来说风险太高,我无法继续工作,我开发了一个工作流程,让我在很大程度上克服了这些挑战。

在设计这个工作流程时,我把简单放在第一位。数据科学团队必须快速行动,因为他们的工作本质上是实验性的。这种方法不是最终的解决方案,但它是对当前实践的巨大改进。笔记本电脑和机器学习工具有很大的创新空间,可以支持一个工作流,为数据科学家提供交互式开发的能力,同时允许他们在部署过程中更好地与工程团队合作。

工作流摘要

提议的工作流程如下:

  1. 将脚本用作笔记本。
  2. 每个git push上有一个数据样本的冒烟测试笔记本。
  3. 在多个小笔记本中分解分析。
  4. 打包项目(即添加一个setup.py文件)。
  5. 从笔记本之外的功能中抽象出逻辑片段,用于代码重用和单元测试。

现在让我们详细讨论每一个。

切换底层格式:作为笔记本的脚本

如前所述,.ipynb格式不能很好地与 git 兼容。然而,Jupyter 的架构允许使用替代文件格式。 Jupytext 使用户能够将.py作为笔记本打开,有效地解决了 git 版本问题,方便了代码审查。数据科学家可以从 Jupyter 交互开发他们的代码,但是存储库将只包含.py文件。本文的其余部分继续使用术语笔记本,但是请记住,我们指的是与 Jupyter 兼容的 Python 脚本。

隐藏状态、测试和调试

这三个问题高度相关,解决起来更具挑战性。与任何其他软件项目一样,解决方案在于开发模块化和可测试的代码。然而,面临的挑战是如何将其应用于高度不确定的环境,这种环境需要快速迭代,并采用 Jupyter 笔记本作为其主要开发工具。

我们希望实现以下目标:

  1. 每一次代码变更都要做测试笔记。
  2. 在多个小型笔记本中分离逻辑。
  3. 模块化数据转换,并分别进行测试。

测试笔记本

由于运行时的原因,测试数据处理代码本身就具有挑战性。我们不能在每次变更时都运行所有的处理代码,因为这可能需要几个小时才能完成。幸运的是,我们可以用少量数据检测最常见的错误:缺少列、错误的数组形状、不兼容的数据类型等。因此,一个有效的策略是在每次推送时使用数据样本运行所有笔记本,以消除笔记本损坏的可能性。然而,由于我们没有测试笔记本电脑的输出,这是不健全的;但是随着项目的成熟,我们可以加入更多完整的测试。如果你想了解更多关于测试数据科学管道的信息,请查看我在 PyData 2020 的演讲。

要自动执行笔记本,我们可以使用 papermillnbclient 。注意,由于我们转换了底层格式,我们必须使用 jupytext 将.py文件转换回.ipynb,然后执行它们。

在多个小型笔记本电脑中分离逻辑

模块化代码是软件工程中的常规实践,因为它使代码更易测试和维护。然而,数据科学家在一个笔记本上编写整个项目的代码是很常见的。为什么?方便。一旦您将一个项目分解成多个部分,您就必须处理需要数据科学家额外工作的技术难题,在某些情况下,这种工作超出了他们的专业领域。简化模块化过程是 dbt 蓬勃发展的原因(以及许多其他原因):它允许数据分析师将庞大的 SQL 脚本分解成多个部分,组装成一个连贯的管道。我们可以把同样的逻辑应用到笔记本上。

笔记本模块化是大多数工具的不足之处。虽然许多工作流程编排者支持笔记本执行,但他们并没有让这个过程变得愉快。帮助数据科学家(包括我自己)编写更易维护和模块化的管道是我创建 Ploomber 的主要动机。

Ploomber 允许数据科学家分两步从多个笔记本电脑创建数据管道:

  1. 在一个pipeline.yaml文件中列出笔记本。
  2. 通过引用其他笔记本的名称来声明笔记本依赖关系。

例如,典型的pipeline.yaml如下所示:

得益于 Ploomber(和 jupytext)插件,Jupyter 将.py脚本识别为“笔记本”;因此,数据科学家可以交互开发。然而,在执行过程中,Ploomber 将它们转换为.ipynb并执行它们,从而允许我们将源(.py)和输出(.ipynb文件中的表格和图表)分开。此外,任务可以生成任何其他数量的输出,如数据文件。

要建立执行顺序,用户只需声明必须在我们正在处理的笔记本之前执行的笔记本。例如,为了清理数据,我们必须下载原始版本,所以我们将在clean.py中做这样的事情:

就是这样。如果我们重新加载笔记本,我们会在依赖项列表的正下方看到一个新的单元格:

Ploomber 解析我们的引用,并添加一个包含输入位置的新变量。我们可以继续以这种方式构建,并创建包含几十个任务的管道,而不必跟踪每个任务的输出。因为跨文件分割逻辑很简单,所以多人可以同时处理它。Ploomber 帮助创建可维护的管道,感觉就像一个笔记本。

通过使用upstream变量引用其他任务,我们还可以确定执行顺序,从而允许我们创建一个这样的管道:

为了执行整个管道,我们运行:ploomber build

笔记本模块化有许多好处:它允许我们隔离运行部件进行调试,添加集成测试以检查每个输出的完整性,参数化管道以使用不同的配置运行(开发、试运行、生产),并行化独立任务等。

代码模块化和单元测试

笔记本中声明的代码不能轻易从其他笔记本中导入,这导致了.ipynb文件之间的大量复制粘贴。因此,当部署一个模型时,工程师经常不得不处理这样的项目结构:

重构一个像上面这样的项目是一个真正的噩梦。当工程师不得不重构这样的项目进行部署时,已经太晚了:笔记本可能很容易包含数千个单元,其中有几个部分是复制粘贴的,没有单元测试。相反,我们应该致力于在项目的所有阶段保持最低的代码质量。

首先,使用脚本作为笔记本(如前所述)方便了代码审查,因为我们不再需要处理不同 .ipynb文件的复杂性。其次,通过为数据科学家提供预配置的项目布局,我们可以帮助他们更好地组织工作。例如,一个组织得更好的项目可能是这样的:

前面的示例布局明确地将项目组织为三个部分。首先,我们用.py替换.ipynb文件,并将它们放在tasks/目录中。第二,将多次需要的逻辑抽象在函数中,存储在src/下。最后,在src/中定义的功能在tests/中进行单元测试。

为了确保该布局有效,在src/中定义的代码必须可以从tasks/tests/中导入。不幸的是,默认情况下这是行不通的。如果我们打开tasks/中的任何“笔记本”,我们将无法从src/中导入任何内容,除非我们修改sys.pathPYTHONPATH。尽管如此,如果数据科学家不能避开 Python 导入系统的有限性,他们会倾向于复制粘贴代码。

幸运的是,这个问题很容易解决。添加一个setup.py文件,让 Python 将您的项目识别为一个包,您将能够从项目中的任何地方(甚至在 Python 交互式会话中)从src/导入函数。每当我与其他数据科学家分享这个技巧时,他们就开始编写更多可重用的代码。要了解更多关于 Python 打包的内容,点击这里

思考生产中笔记本电脑的未来

讨论笔记本在作品中的使用总是一场艰苦的战斗。大多数人认为笔记本只是用来做原型是不可否认的事实,但我不这么认为。笔记本是处理数据的绝佳工具,虽然当前的工具使使用笔记本编写生产就绪代码变得更加容易,但仍有大量工作要做。

这项工作的一部分是开发更好的工具,而不仅仅是改善笔记本体验:毫无疑问,提供实时协作、与 SQL 更好的集成或云中托管 Jupyter 实验室等功能有很大的价值;然而,如果我们不在部署代码时更重要的领域(如编排、模块化和测试)进行创新,笔记本电脑仍将被视为一种原型工具。

此外,这项工作的一部分是消除关于笔记本如何工作的神话。我希望数据科学领域的开发实践能够吸收笔记本电脑的精华并不断发展,而不是抛弃它们,回到前笔记本时代的相同方法。

如果您想在生产中采用包含笔记本电脑的工作流程方面获得帮助,请联系,我很乐意谈论这些话题。

特别感谢 Alana Anderson 和 Sarah Krasnik 阅读早期草稿并提供宝贵反馈。

最初发布于ploomber . io

我们为什么(以及如何)与学术界合作

原文:https://towardsdatascience.com/why-and-how-we-collaborate-with-academia-6ba54a62ce7?source=collection_archive---------38-----------------------

将学术知识转化为工业数据科学应用

作者:米格尔·马丁内兹和迪亚·阿尔巴库尔

(图片由埃德温·安德拉德提供。Unsplash)

介绍

成功的科技企业总是推动创新,尽可能为客户提供最佳价值,并扩大他们在市场中的差异化。改善这些方面的方法之一是探索关于如何使用数据科学解决客户挑战的新方法和想法。我们认为,与学术伙伴的合作是这些努力的基础。

大学合作的好处

如果处理得当,与大学的合作对于任何创新企业来说都是一个强有力的工具,这有几个原因。对于科技企业而言,主要驱动力是获取专业知识、提高员工幸福感和公司品牌。例如,我们已经接待了 30 多名访问研究人员和探索 Signal AI 研究领域的硕士生,他们都能够产生影响并促进他们的职业发展。作为一名研究人员,你专注于非常具体的问题,而在那个阶段,一个常见的挫折是,这项研究可能不会产生任何影响,也不会解决任何真正的问题。通过与技术企业合作,研究人员看到了他们的工作对用户的影响。除了影响力之外,博士生等早期研究人员非常渴望加入一家从事应用研究的公司,以便了解这条职业道路并发展重要的技能,如与非技术人员的沟通和协作。

专业知识

为了说明这一优势,我们以我们公司为例。Signal AI 正在解决一个非常复杂的问题,为了给用户提供尽可能好的服务,我们需要解决自然语言处理(NLP)和信息检索(IR)领域的大量研究问题。这些挑战包括但不限于重复数据删除、实体链接、主题分类、情感分析或引用检测。同时拥有一个相对较小的内部数据科学家团队。即使我们的大部分研究与 NLP 相关,也不可能拥有所有这些任务的所有专业和最新的知识。一般来说,即使对于在不太复杂的环境中工作的公司(例如,专注于一项非常具体的任务),与大学的合作也可以发挥重要作用,允许对如何解决问题的最前沿替代方案进行探索性研究。这也间接允许公司影响社区来探索和讨论该领域的具体挑战(例如,重新关注新闻数据的重要性或推动可再现性和可复制性),并影响关于未来挑战的辩论。

员工获取和保留

对于许多数据科学家来说,与学术界保持联系非常重要,不仅从专业角度来看如此,从个人角度来看也是如此。以这样或那样的方式回馈社区,是我们许多人的强大动力。这对于那些有研究背景或者想提高自己作为研究人员的声望的人来说尤其重要。在这两种情况下,随着时间的推移保持与学术界的联系是至关重要的,以便保持最新和/或继续为其领域的最新发展做出贡献。此外,参与会议组织和拥有一致的出版记录对于那些希望保留在工业界工作后回到学术界的选择的数据科学家来说可能是不可或缺的。通过鼓励学术合作,不仅更容易吸引研究人员,而且作为一个整体,员工对研究职能的总体满意度也会提高。

公司品牌

很多公司的定位都是 AI 优先的公司。然而,MMC 的研究显示,2019 年,欧洲 40%声称使用 AI 的创业公司没有任何迹象。再次以我们的公司为例,Signal AI 的主要优势和可防御能力之一是我们如何应用 AI 来解决我们客户面临的挑战,我们拥有良好的声誉,至少在 NLP 领域是如此,我们实现这一目标的方法之一是参与学术和实践社区。通过这样做,我们的声誉领先于我们,要么是因为人们知道我们参加的会议,要么是因为社区中的网络效应。

Signal AI 如何与学术界合作

在这里,我们首先分享了我们与大学合作的方法,然后是我们从几年的合作中学到的东西

我们在获得资助后不久就开始了我们的访问研究计划,早期职业研究人员(通常是博士生)将加入公司,在特定的研究领域工作 3-12 个月。每种情况都有特定的目标,但它们总是适合以下两者中的至少一个:

  • 改进现有的系统组件(例如,我们的情感分析)
  • 减少不确定性,研究新方法或想法的可行性

在这两种情况下,我们都鼓励客座研究员发表我们可以与社区公开分享的任何研究发现。事实上,自 2015 年以来,我们每年至少出版一本书,所有这些都是学术合作的结果。

除了访问研究项目,我们的数据科学家还活跃在研究领域(尤其是在信息检索领域),我们中的一些人还参与了该领域一些主要会议的组织工作。我们还赞助了一些会议和倡议。例如,我们在 ECIR 社区设立了行业影响力奖,以表彰那些从行业角度来看最具潜力的论文。与社区互动的另一个重要方式是发布真实的数据集。这是一个关键的方面,因为学术界渴望找到新的数据,而行业可以从社区工作中受益。出于这个原因,我们发布了我们的 1M 信号数据集,该数据集现已被下载超过 6000 次。该奖项和数据集的发布都是在影响社区并提高我们品牌知名度的同时回报社区的例子。这种模式的美妙之处在于,每个人都从中受益。

学习和反思

与大学合作对我们来说非常有用,但在不同的发展阶段也会遇到挑战,通常与两个高层次的方面有关:优先级和影响。

优先级

使用协作来改进当前工作的主要挑战之一是时间范围的差异。从确定研究合作开始,到我们公司有一名客座研究员,通常需要几个月的时间。在学术界,这似乎不是很长的时间,但对于一家初创企业来说,甚至对于扩大规模来说,这都是一段很长的时间。在此期间,公司的优先事项可能会发生足够的变化,使项目变得不那么有趣,甚至过时。为了应对这一挑战,我们现在明确界定了每项合作的范围,要么是对现有组件的改进,要么是以减少不确定性为主要目标的探索(例如,我们能在多大程度上根据我们的内容总结事件?).

影响

数据科学家面临的一个常见挑战是,我们倾向于关注以学术为中心的指标。不幸的是,纯质量的度量标准(例如,F1 代表分类)可能与他们的目标业务度量标准没有很好的关联。为了最小化这种风险,项目应该非常明确地说明他们的假设、假设以及他们对用户行为或价值的预期影响。最好的方法是从我们希望从用户角度实现的高层次影响开始(例如,在应用程序上花费更多时间),然后向下级联到我们认为有助于实现该目标的所有潜在解决方案(例如,在搜索引擎中获得更好的结果)。一些研究人员特别难以理解的一个方面是,小的改进可能对高层次的目标没有影响,但可能需要付出巨大的努力。该规则也有例外,通常与明显可以货币化的问题有关(例如,在一家预测每天有数百万笔交易的公司中,欺诈检测系统可以提高 0.05%),但在许多其他情况下,用户不会明显注意到的改进可能对改变他们的行为产生有限的影响。

确保我们选择的候选人能够在工业环境中工作也很重要。这包括从沟通技能到开发技能,以及在考虑潜在解决方案时,考虑到当前基础设施,集成的效率、简单性和可行性也是重要的方面。显然,该公司应该始终努力为研究人员提供尽可能多的基础设施支持、数据和监督,以尽可能发挥其影响力。

结论

一些最优秀的研究人才仍然在大学里,那里的一些人想知道他们的研究的影响。另一方面,公司更接近他们的客户问题。我们真诚地相信,尽可能地弥合学术界和工业界之间的差距对所有相关方来说都是一个双赢的局面,尽管这不是一个轻松的旅程,而且从规划和组织的角度来看存在一些挑战,但这对公司,尤其是中小企业来说,是一个以新的创新方式改进其产品的绝佳机会。

为什么数据科学工作最抢手的时候却很难找到?

原文:https://towardsdatascience.com/why-are-data-science-jobs-hard-to-get-when-theyre-the-most-in-demand-30eda0d1b5ec?source=collection_archive---------5-----------------------

我想是时候解决这个问题了

纳蕾塔·马丁在 Unsplash 上的照片

在当今快速发展的技术世界中,来自右翼、左翼和中间派的人们正在开始他们的数据职业生涯,或者在数十年的金融经验后进行职业转变,或者回到学校获得数据科学学位。最近,我在数据科学就业市场上寻找实习和全职工作,亲身经历了我称之为“椰子田”的现实。

找工作很累;将你简历的第 496 份草稿命名为面试的最终版本,在四轮面试和无数 LinkedIn 信息联系和推荐后,公司会跟踪你——如果你足够幸运地收到了录用函,只有当你有足够的信心在第一天发布 LinkedIn 更新时,你才会平静下来。

如今,越来越多的人自称为数据科学爱好者。虽然数据科学候选人指数增长的主要原因被认为是数据职位空缺数量的增长,但获得数据科学工作比以往任何时候都更难。

但是,如果你正确地认识到就业市场的期望,就不会失去希望。关键是要确定什么最适合你,并利用它来帮助你找到最适合你的目标和兴趣的公司。

五六年前,当数据不是业务决策的核心时,公司会根据组织的需求制造数据专家,随着分析数据的需求不断增加,这些公司得到了学术界和具有初步技能的训练营的帮助。

统计是过去的事了

当《哈佛商业评论》称“数据科学家:21 世纪最性感的工作”时,请记住——那是 2012 年(显然,那一年世界本该走向末日😀)

你在网上读到的统计数据并不代表今天的动态。

一个组织的需求、要求和期望已经发生了巨大的变化。即使是关于数据科学工作的最新统计数据也至少有四分之一的历史了,而且数据科学还在不断发展。从 2016 年开始,数据科学家是美国的头号工作,但在 2020 年,它排在第三位( Glassdoor 的年度排名),谁知道到 2025 年,它甚至可能不会进入前 10 名。

当然,这取决于你如何看待这些统计数据,但如果一个网站上写着“2021 年 xx 百万数据科学工作岗位”,并不意味着它们都对你开放。

与其在线阅读大量数据科学市场的点播文章,我建议与你的网络中的数据科学家联系(或建立新的联系),并从这些对话中了解更多关于环境的信息。阅读你感兴趣的公司最近正在进行的新项目,或者联系你 15 年前刚从数据科学转行到商业智能分析师的同事,听取他们的真实意见。

数据科学独角兽还有更多的东西

每个组织、每个业务线的数据科学工作要求每天都在变化。这个领域变得越来越生产化,越来越商业化。数据科学家有望在同一天补一个数据工程师和一个 BI 分析师。

我可以说出 50 个不涉及姓名数据的工作简介,但你从事的是数据科学生命周期中的一个流程。如果说我从我的同学(2021 届)找工作的经历中学到了什么的话,那就是,你不能把自己的求职限制在关键词数据科学家和数据分析师上。

下面是几个令人兴奋的职位,类似于数据科学家的职位,你可以为其培养技能并申请—

图片来源:作者

这并不总是关于候选人

候选人在面试中常常无法表达自己的价值。

通常,绩点 3.4 的候选人会在面试中击败绩点 4.0 的候选人。在面试中,理论知识可能只占你整体评估的 40%。但是,在实际项目中工作过,在团队或研究中合作过,在学校实习过——交流这些的能力,阐明你带来的独特优势和品质是让游戏适合你的能力。

虽然公司正在寻找在工作描述中列出的工具和技能方面具有丰富经验的候选人,以增加团队的价值,但简历并不总是能传达预期。在这种情况下,需要关注的不是候选人,而是他们制作简历的技巧。让候选人心动的是简历筛选后的谈话。

企业寻求擅长形成理论、检验直觉、发现模式的专业人士,这些模式能让企业预测盈利情况或解决利润低的问题;一个候选人,他有可能建议利用启发式开发的途径,从而为用户增加价值。在 6 小时的小组面试中,一名新毕业生肯定会紧张地回答财务分析问题。如果你正在招聘候选人,一次让你的候选人感到舒服的谈话将会受到高度赞赏。

公司希望他们的数据团队有独角兽;我们找一个能预测如何降低营销成本和增加客户获取的分析师怎么样?!

从众心理

仅仅因为人们说数据科学领域的工作很热门,似乎每个人都想通过几天的培训来赶时髦。从我三年的数据科学之旅中学到的东西来看,这不是一个 15 天课程就能帮你找到工作的领域。数据科学需要一门学科,一套学习过程。

当前就业市场中的求职者只具备足够危险的知识——关于他们知道什么和他们想做什么的知识。

在现实世界中,你看不到工商管理硕士(MBA)或计算机科学(T2)的招聘信息。它们是学位,不是工作。企业似乎更有兴趣聘用数据科学职位的原因是,他们认识到云计算、大数据、人工智能和机器学习的新兴趋势和需求。

是时候拓宽求职范围了,不要局限于数据科学。

这就是我的博客的结尾。感谢您的阅读!如果你在寻找数据科学工作或正在寻找工作时也遇到了困难,请在评论中告诉我。我很想知道更多关于你的旅程和想法。

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,不需要你额外付费!)

数据帐篷快乐!

Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,周末会边喝一杯热巧克力边写博客

为什么变形金刚的记号化方法那么多?

原文:https://towardsdatascience.com/why-are-there-so-many-tokenization-methods-for-transformers-a340e493b3a8?source=collection_archive---------6-----------------------

通往同一个目的地的五条路线?

作者图片

H uggingFace 的变形金刚库是 NLP 事实上的标准——被世界各地的从业者使用,它功能强大、灵活且易于使用。它通过一个相当大(且复杂)的代码库来实现这一点,这就产生了一个问题:

为什么 HuggingFace 变形金刚里有那么多的记号化方法?

令牌化是将文本字符串编码成转换器可读的令牌 ID 整数的过程。

从人类可读的文本到转换器可读的令牌 id。

给定一个字符串text —我们可以使用以下任何一种方法对其进行编码:

这是五种不同的方法,我们可能会误认为它们会产生相同的结果——令牌 id。然而,这些实际上是产生不同产出的不同过程。

在本文中,我们将看看这些方法之间的区别和相似之处。你也可以在这里看这篇文章的视频版本:

变压器的标记化

在深入研究这些标记化方法之间的区别之前,有必要理解一下标记化在 transformer 模型的上下文中意味着什么。

在构建 transformer tokenizer 时,我们通常会生成两个文件,一个是 merges.txt ,另一个是 vocab.json 文件。这两者都代表了标记化过程中的一个步骤。

我们首先采用字符串格式的文本。第一个文件 merges.txt 用于将单词或单词片段翻译成标记:

文件 merges.txt 将我们的纯文本转换成一个令牌列表。

一旦我们有了令牌,我们就通过我们的 vocab.json 文件来处理这些令牌,这只是一个从令牌令牌 ID 的映射文件:

文件将我们的令牌列表转换成令牌 id 列表。

在推理/训练过程中,这些令牌 ID 由我们各自的转换器模型中的嵌入层读取——它将令牌 ID 映射到该令牌的密集向量表示(想象一下我们单词的表示的数字表示)。

其他输入张量

现在,我们刚刚解释了从人类可读语言到变压器可读令牌 id 的令牌化过程,但这只是变压器模型使用的几个输入张量之一。

所需的输入张量因不同的变压器模型而异,甚至因不同的变压器用例而异,但有几个常见的例子。

令牌 id(input _ IDs,左侧)和注意掩码(右侧),我们已经为字符串“hello world!”构建了令牌 id 和注意掩码张量 —添加特殊标记 101、102 和 0(填充标记)。

  • 注意力屏蔽–注意力屏蔽张量通常是一个包含 1 和 0 的张量,其维数与我们的 token IDs 张量相同。只有当注意屏蔽张量在其各自的位置包含 1 时,我们的转换器模型才会计算记号 IDs 张量中的记号的注意。
  • 段 id—通常在我们的令牌 id 张量中有多个“句子/部分”时使用。比如在 Q & A 中我们经常会把 token IDs 张量拆分成问题和上下文——每个段在段 IDs 张量中分别用 0 和 1 表示。

以上介绍了转换器的标记化背后的基本要素——现在让我们看看这些标记化方法的不同之处,以及为什么我们会决定使用其中的一种。

到令牌和 id

我们可以对文本进行标记的第一种方法是对单个字符串应用两种方法。

第一个方法tokenizer.tokenize将我们的文本字符串转换成一个令牌列表。

构建完令牌列表后,我们可以使用tokenizer.convert_tokens_to_ids方法将令牌列表转换成转换器可读的令牌 id 列表!

现在,这里没有我们可以使用的特别有用的参数(比如自动填充/截断、添加特殊标记等),所以我们在这里的灵活性受到限制。因此,通过这种方法进行的标记化看起来总是像这样:

尽管值得注意的是,我们的其他张量如attention_masktoken_type_ids(段 id)不能使用这种方法自动创建。

编码和编码+

接下来我们有encodeencode_plus,它们都为单个字符串执行两个标记化步骤——输出我们的标记 id 张量。

现在,你可能已经猜到了,encode_plus可以做得更多一点。

其中encode仅输出表征 id 张量,encode_plus输出包含表征 id 张量的字典,附加张量例如注意力屏蔽或片段 id(token_type_ids)张量。

这两种方法都带有常用的有用参数,如max_lengthreturn_tensors。要将encode与 BERT 一起应用于 PyTorch,我们可以编写如下代码:

但是我们还没有返回我们经常需要的注意力屏蔽或段 id 张量。

因此,为了获得我们的注意力屏蔽和段 id,我们简单地为encode_plus编写相同的代码:

我们返回我们需要的所有张量——令牌 id、注意力屏蔽和段 id。

对于批次

实际上,我们不会对单个字符串进行标记,而是对大量文本进行标记——为此我们可以使用batch_encode_plus

encode_plus一样,encode_batch 可以用来构建我们需要的所有张量——令牌 id、注意力屏蔽和段 id。

encode_plus不同,我们必须将一个字符串列表传递给batch_encode_plus,而batch_encode_plus将在我们之前看到的同一个字典容器中为每个编码张量返回一个列表/批次。

同样,我们也可以使用之前的encodeencode_plus方法中使用的所有参数:

标记器

现在我们剩下最后一个方法,tokenizer(args) —这里我们没有使用任何特定的方法,而是直接调用我们的 tokenizer 类。

让我们看看它会返回什么:

与我们的encode_plus方法完全相同的输出,如果我们尝试像我们的batch_encode_plus方法一样使用带有字符串列表的tokenizer(args),我们将会看到:

因此,这个最后的方法执行与encode_plusbatch_encode_plus方法相同的操作,通过输入数据类型决定使用哪个方法。

当我们不确定是否需要使用encode_plusbatch_encode_plus时,我们可以直接使用tokenizer类——或者如果我们只是喜欢较短的语法。

这就是本文的全部内容,涵盖了高频变压器中可用的不同符号化方法。

在不同的模型记号赋予器之间,我们会看到不同的行为,但是所有这些记号赋予器都从PreTrainedTokenizer类继承了它们的核心功能——包括了这些方法中的每一个!

因此,尽管许多记号赋予者是不同的——他们通常会分享我们在这里讨论的内容。

我希望你喜欢这篇文章!如果你有任何问题,请通过 Twitter 或在下面的评论中告诉我。如果你想要更多这样的内容,我也会在 YouTube 上发布。

感谢阅读!

🤖带变压器的 NLP 课程 70%的折扣

*所有图片均由作者提供,除非另有说明

为什么有抱负的数据科学家不应该重视机器学习

原文:https://towardsdatascience.com/why-aspiring-data-scientists-should-not-make-a-big-deal-of-machine-learning-218a66b18467?source=collection_archive---------9-----------------------

以及他们应该做什么。

照片由 Kyran Aldworth 在 Unsplash 上拍摄

机器学习听起来很吸引人,很有魅力。事实上,它在让数据科学家成为 21 世纪最性感的工作中发挥了关键作用。然而,如果你的目标不是创建自己的算法,你就不应该太关注机器学习,尤其是在职业生涯的初期。

我绝对不是在争论机器学习是琐碎的或者不必要的。它在许多领域和任务中至关重要。然而,您可以通过用几行代码实现现成的模型来获得令人满意的结果。

如果你关注 Kaggle 比赛,你会发现 log loss 或任何其他指标的一小部分改善会导致排行榜的大幅上升。嗯,现实生活中可不是这样。

一旦你有了清晰和适当格式的数据,关于所选模型或参数的成本函数的变化通常在可接受的范围内。

换句话说,与数据和特征相比,模型和参数对成本函数的影响很小。因此,数据清理或争论和特征工程比模型选择和参数调整重要得多。

我建议有抱负的数据科学家不要太关注机器学习算法和超参数调整,除非他们想成为机器学习研究员。

在本文的下一部分,我将提供我的建议,告诉有抱负的数据科学家应该关注什么,并花时间去做什么。

照片由哈维尔·阿莱格·巴罗斯在 Unsplash 上拍摄

首先要掌握的技能是 SQL。尽管 NoSQL 数据库越来越受欢迎,但仍有大量公司在使用 SQL,我认为这种情况会持续很长时间。

作为一名数据科学家,您应该能够从关系数据库中检索您需要的数据。您不希望依赖数据工程师或 SQL 专业人员来获取数据。此外,你工作的公司很可能没有专门的人员为你提供数据。

SQL 不仅用于检索数据,也是一种高效的数据分析工具。灵活多样的函数允许编写高级查询来从数据库中检索所需的数据。此外,我们可以在检索数据的同时执行数据转换和分析。因此,掌握高级 SQL 技能将非常有帮助。

另一个非常重要的技能是数据清理、操作和翻译。用于这种操作的更一般的术语是数据争论。你需要能够轻松流畅地处理原始数据。

现实生活中的数据通常是杂乱的,并且不是最适合分析和建模的格式。有许多软件库用于数据角力,比如 Pandas 用于 Python,Tidyverse 用于 r。

你应该掌握至少一种数据辩论工具。你的技能组合中最好有熊猫和 Tidyverse,因为大多数公司都在使用 Python 或 r。

这些库为数据操作和转换提供了许多功能。因此,它们在基于现有特征派生新特征的过程中非常有用。

作为一名数据科学家,你可能会编写生产级代码,或者与软件工程师合作。因此,Git 是数据科学家的必备技能。您至少应该习惯使用基本的 git 命令。

越来越多的公司正在采用基于云的数据存储和处理策略。因此,您也应该熟悉云计算。您不需要具备云架构师的技能。但是,您至少应该能够从云中访问和检索数据。

结论

我想再次强调,我并不是说机器学习是无足轻重的。事实上,它在从数据中创造价值的过程中非常重要。

我想指出的是,现成的机器学习算法和解决方案在大多数情况下都做得很好。除非你想成为一名机器学习研究人员,否则对机器学习算法及其优缺点的基本理解通常就足够了。

你的大部分时间将花在清理、转换、操作和理解数据上。因此,加速和简化这些过程的工具比掌握机器学习算法更重要。

感谢您的阅读。如果您有任何反馈,请告诉我。

为什么自动特征选择有风险

原文:https://towardsdatascience.com/why-automated-feature-selection-has-its-risks-363117e1a775?source=collection_archive---------40-----------------------

特征的理论相关性不容忽视

来源:图片由 geraltPixabay 拍摄

来自经济学背景,我对数据建模的第一次介绍是通过计量经济学——它严重依赖线性回归来建立变量之间的关系。

在配置回归模型时,人们总是强调,虽然选择解释结果变量的特征的过程可以在一定程度上自动化,但理论应该总是胜过统计,即相关性并不意味着因果关系。

例如,观察到消费的冰淇淋数量和杀人率之间有很强的统计相关性。然而,很难说食用冰淇淋会直接导致更高的凶杀率。炎热的天气可能会增加人们的攻击性,从而导致更高的杀人率——冰淇淋消费量的增加只是这一现象的副产品。

自动化特征选择的问题

在我们生活的这个数据驱动的世界中,人们经常需要过滤成千上万个不同的特征,以确定影响结果变量的特征。

孤立地手动观察每个特征并确定它是否充分解释了结果变量是不可行的。在这方面,我们必须在一定程度上依赖自动化。

然而,当这些特征选择工具仅仅用于选择应该包括在模型中的特征时,问题就出现了,而没有手动地双重检查所选择的特征以确保它们在理论上有意义。

使用 ExtraTreesClassifier,让我们看一些例子,看看在没有经过训练的眼睛的情况下,特征选择会如何出错。

酒店取消

出于这个目的,让我们考虑将 ExtraTreesClassifier 作为特征选择工具。

树外分类器是一种集成学习方法,它使用随机决策树来选择在解释结果变量的变化时显示出强统计相关性的特征。具体来说,对所有观察值进行随机分割,以确保模型不会过度拟合数据。

现在,想象一下这个场景。您将看到一个酒店取消数据集,如果客户取消,结果为 1 ,如果客户不取消,结果为 0

Antonio、Almeida 和 Nunes (2019)在本例中的原始数据可在此处获得。

数据集中包含各种要素,包括客户的原籍国、他们的交付时间(从预订房间到入住的时间)、他们预订的房间类型等等。

来源:Jupyter 笔记本输出

您决定使用树外分类器按重要性对要素进行排序(最低值最不重要,最高值最重要):

来源:Jupyter 笔记本输出

排名最高的三个功能是功能 21(存款类型)、功能 12(来源国)和功能 27(预订状态)。

然而,让我们仔细看看特性 27。这是一个具有类别的分类变量:

  • 取消
  • 失约
  • 退房

在这方面,任何取消预订的客户将被分配到“已取消”类别。在这点上,ReservationStatus 变量将显示与取消的结果变量接近完美的共线性。难怪 ExtraTreesClassifier 为这个特性显示了如此高的值——它有效地描述了与结果变量完全相同的东西!

然而,在现实场景中,在模型中包含这一功能是没有用的——酒店无法知道客户是否会取消预订,直到事后才知道。

在这方面,正确的决定是从最终的模型中去掉这个特性。

如果完全依赖于特征选择的自动化,这个特征将被保留在模型中——极大地扭曲了结果,并且与现实世界的场景没有理论上的相关性。

另一个例子:平均每日利率

使用相同的数据集,现在让我们看看不同的变量:【平均每日房价】。该变量描述了顾客每天在酒店的平均消费。

来源:Jupyter 笔记本输出

第一种倾向可能是使用特征选择工具来确定最能解释(至少在统计上)ADR 波动的特征。

然而,只有当我们仔细查看数据时,我们才注意到取消预订的客户的 ADR 值都包括在内。

在大多数情况下,ADR 反映了取消的顾客如果留在酒店会花费的价值——但实际上酒店将不再从这些顾客身上赚钱。

在这点上,用 ADR 作为因变量来实现特征选择是错误的。

相反,更合理的方法是假设表明客户是否会取消预订的特征也与确定该客户的 ADR 相关。坚持预订的顾客已经比取消预订的顾客表现出更高的顾客忠诚度。在这方面,即使取消预订的客户最初有较高的 ADR 值,现在这也是多余的,因为预订不会继续进行。

考虑到这一点,建立了一个基于回归的神经网络模型,使用以下特征预测 ADR:

  • 取消
  • 原产国
  • 细分市场
  • 存款类型
  • 客户类型
  • 所需的停车位
  • 到达日期:周数

该模型最终证明,相对于整个测试集的平均 ADR 105,平均绝对误差为 28。虽然模型显示的 RMSE 较高,为 43,但 MAE 被认为是衡量整体表现的更好指标,因为 RMSE 因少数客户的 ADR 远高于大多数客户而过度膨胀。

有许多重要因素会影响客户的 ADR,例如他们的年收入、货币波动、竞争链的价格等,这些都没有包括在数据集中。在这方面,包含的特征本身在能够解释 ADR 值的所有变化方面是有限的——但是考虑到这种限制,该模型表现得相当好。

结论

短语“垃圾输入,垃圾输出”也适用于特征选择。如果数据集中的要素是无意义的,那么要素选择工具将无法以有意义的方式解释这些要素。对数据的正确理解是最重要的,并且特征选择的自动化需要与领域知识相平衡,以便能够正确地判断特征是否适合在模型中使用。

在本文中,您已经看到:

  • 树外分类器在特征选择中的应用
  • 自动化特征选择的缺点
  • 手动解释相关特征的重要性

非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。你可以在这里找到这个例子的 GitHub 库。

免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。

为什么婴儿不能驾驭鳄鱼

原文:https://towardsdatascience.com/why-babies-can-not-manage-crocodiles-846df5371e47?source=collection_archive---------41-----------------------

用沃尔夫拉姆语讲述的警示故事

Unsplash 上由 vaun0815 拍摄的照片

很少有父母会愿意把自己的孩子和鳄鱼放在一个房间里。他们知道婴儿和鳄鱼对彼此的看法非常不同。婴儿容易信任他人,并寻求探索和结交新朋友。一只鳄鱼把一个婴儿视为一顿美味的午后点心。对大多数人来说,这是故事的结尾,但对逻辑学家、解谜者和像刘易斯·卡罗尔这样的数学家来说,故事才刚刚开始。

著名的奇怪的“爱丽丝梦游仙境”故事的作者刘易斯·卡罗尔也对逻辑谜题非常感兴趣。他写了下面的“幼鳄难题”,为读者提供了许多逻辑陈述,从中可以得出结论。这个难题有三个条件语句(原文):

  • 所有的婴儿都没有逻辑
  • 谁能管住鳄鱼,谁就不会被轻视
  • 不合逻辑的人受到鄙视

这些陈述被认为是“真实的”陈述,尽管它们在今天看起来可能很奇怪。比如,我们有可能会想象鄙视一个管理鳄鱼的人。不合逻辑的人不会被普遍鄙视。出于这个原因,我将使用“不谨慎”,因为这实际上是一个比“鄙视”更好的选择。

我们可以从标记每条语句的各个部分开始,因此:

  • b:代表婴儿
  • l:代表逻辑
  • I:代表不谨慎(以前被鄙视)
  • m:代表“能驾驭鳄鱼”

然后,我们可以将英语语句写成简短的逻辑表达式:

  • B → ~L(所有宝宝都不符合逻辑)
  • M → ~I(如果你能管住一只鳄鱼,那你就不算不小心)
  • ~L → I(如果你不符合逻辑,那么你就是粗心大意)

我们现在想从婴儿到管理鳄鱼,或者:

  • B → ~M

结合规则(1)和(3),很容易从幼稚(B)变成粗心(I)

  • B → ~L → I

换句话说,我们可以说婴儿是不小心的(根据谜题的规则)。

第二个规则(M → ~I)也可以换成它的反命题:

  • 我→ ~M

这让我们完成了这个链条,完成了我们的“证明”:

  • B → ~L → I → ~M

导致我们得出结论,确实婴儿(B)是不符合逻辑的,因此他们是不谨慎的,因此他们不能管理鳄鱼(~M)。父母会全心全意地认同这个结论。

汉弗莱·穆莱巴在 Unsplash 上的照片

现在逻辑证明会变得很长很乏味。甚至在上面给出的“证明”中,我们也忽略了很多细节。实际精确的逻辑证明可以通过 Wolfram 语言中的findcequationalproof函数获得,这是一种内置有用函数宝库的计算语言:

函数有两个参数:第一个参数是你试图证明的逻辑陈述,第二个参数是公理列表(假设为真的逻辑陈述)。

在我们的例子中,第一个语句是:不存在婴儿[x]和鳄鱼经理[x]都为真的“x”。接下来,公理列表重复初始问题的公理。

所有的逻辑证明都可以用有向图来表示,从公理和定理开始。在 Wolfram 语言中,您可以绘制这个证明图。在下图中,顶部的绿点是三个公理,左上角的绿色菱形是你要证明为真的定理。图表底部是由最后一个红色方块代表的结论“真”。图中的所有其他步骤都是非常简单的逻辑转换,需要进行 100%可靠的逻辑证明:

(图片由作者提供)

您还可以获得逻辑证明的每个步骤的文本表示,它使用一般的逻辑公理,并将它们应用于证明所需的特定情况。证明的前十步(共 100 步!)如下所示:

(图片由作者提供)

以下是得出最终结论的最后十个步骤:

(图片由作者提供)

逻辑是我们先进文明的核心。有了无可争议的事实和精心构建的论据,我们可以得出明智的结论,帮助我们在生活中前进。错误地提出不正确的论点可能会付出很高的代价,故意提出错误的论点可能会构成犯罪行为。理解是什么让一个论点正确,会让你变得更强大,因为这有助于你发现不好的论点。

要了解更多关于等式证明和如何解决它们的知识,请查看定理证明指南页面:

https://reference.wolfram.com/language/guide/TheoremProving.html

为什么装袋有效

原文:https://towardsdatascience.com/why-bagging-works-b9961354ee73?source=collection_archive---------20-----------------------

罗斯·斯奈登在 Unsplash 上的照片

在这篇文章中,我深入探讨了打包自举聚合。重点是建立对底层机制的直觉,以便你更好地理解为什么这项技术如此强大。Bagging 通常与随机森林模型相关联,但其基本思想更为普遍,可以应用于任何模型。

bagging——就像 boosting 一样——与学习者大家庭坐在一起。装袋包括三个关键要素:

  1. 使学习者适应数据的自举样本
  2. 对许多学习者和引导样本这样做;
  3. 从所有学习者中提取预测,并将平均值/模式值作为最终预测。

当每个学习者在输入特征的不同子集上被训练时,这种方法的有效性被进一步增强(尽管对于随机森林来说,这是稍微更细微的)。 但为什么这种做法在实践中如此有效?

什么是自举?

Bootstrapping 是从数据集中抽取替换的随机样本并计算每个样本的统计数据(例如,平均值、中值)的过程。当使用替换数据点执行采样时,原始数据中的数据点将被复制到引导数据集中。另一种方法是粘贴,其中数据被采样而没有替换。基本思想是通过随机生成数据可能是的替代视图来解决采样误差/偏差。该过程将生成感兴趣的统计结果的分布,在此基础上您可以估计标准误差和置信区间。一般来说,引导映射过程创建的基础统计数据的估计偏差较小。

学习拼图的随机部分

在预测建模的背景下,这种想法尤其强大。机器学习的一个基本挑战是过度拟合。当模型记住了它被训练的数据时,就会发生过度拟合。然而,如果一个单一的模型从未被展示完整的数据集,它的记忆能力就会受到极大的限制。从统计角度来看,自举是实现这一目标的便捷方式。当我们在机器学习中使用 bootstrapping 时,我们避免向任何单个模型显示完整的数据集。

为每个模型(或随机森林中的每个分裂)添加随机特征选择进一步防止过度拟合。实际上,bagging 方法的威力在于多个模型可以学习数据集不同组成部分之间的关系——样本和特征的不同组合——而不会过度拟合。

这意味着 bagging 模型中的每个子模型将学习底层数据的不同组成部分。如果每个子模型学习相同的结构或相同的参数估计,则在该过程中没有附加值。因此,当每个子模型不相关时,Bagging 是最有效的。

提取预测区间

bagging 模型的另一个好处是你可以提取预测区间。因为每个模型都适合数据的随机子集(以及潜在的随机特征空间),所以每个学习者都会学到输入和输出之间不同的关系集。这将为数据中的每个样本生成预测分布。

下面的代码将随机森林拟合到房价数据上,从每个子模型中提取预测,计算 95%的预测区间,并绘制每个样本的预测区间图:

图片作者。

上图显示了数据中所有样本的平均预测和 95%预测区间。当您需要识别预测高度不确定的样本时,这非常有用。当你想在预测中加入缓冲时,它也很有用。在这种情况下,您可以对所有样本进行 P95 预测。

我希望这篇短文有助于发展统计学和机器学习中 bagging 方法的直觉。如果你喜欢这个,你可能也会喜欢我在“为什么助推有效”上的这篇文章。

感谢阅读!

为什么平衡班级被过度炒作

原文:https://towardsdatascience.com/why-balancing-classes-is-over-hyped-e382a8a410f7?source=collection_archive---------13-----------------------

小窍门

不需要平衡数据集的三个原因

图片由 Loic Leray 在 Unsplash 上拍摄

我上个月上班时掉进了兔子洞。我试图建立一个模型来预测一个罕见的结果,但我的回忆和精度分数仍然很低。鉴于这两个阶层的高度不相称性,我认为这应该归咎于阶层失衡。

平衡类通常被框定为“修复”预测模型的一种方式,在某些方面的确如此。这项技术之所以流行是有原因的——它可以用于提高全局准确性、提供描述性摘要、应用某些统计数据、防止模型惩罚少数样本等。然而,我意识到很容易陷入平衡类的习惯行为中,而没有考虑到这会带来的新问题。在这里,我将回顾你可能而不是想要重新平衡的三个原因:

  1. 偏差引入
  2. 训练数据需要反映真实世界
  3. 少数阶级的数量可能已经足够了

首先,让我们快速回顾一下什么是阶级失衡。

什么是不平衡班?

不平衡的阶层,简单来说就是两个人口比例不对等。各行各业都有例子;例如,在医疗保健行业,良性肿瘤(多数类别)的数量远远超过癌性肿瘤(少数类别),或者在金融行业,正常交易的数量(多数类别)相对于欺诈交易(少数类别)而言相当高。这些比例可从 4:1 到 100:1 不等,极端的不平衡可高达 1000:1 到 10000:1 [1],有时甚至更高。

一般来说,少数民族阶层有一些邪恶或不受欢迎的东西,这有利于我们提前预测。在我的领域,医院向保险公司索赔的相对较小比例(5-15%)被拒绝。理想情况下,我们可以提前预测这些情况,为已经在微薄利润中生存的医院节省数百万美元的收入损失。

但让我们回顾一下重新平衡班级的一些潜在陷阱,并讨论一些更好地预测少数民族结果的替代方法。

原因 1:偏差引入

重新平衡数据集可能会引入偏差。当您重新取样时,除了人为地增加或减少数据点的数量之外,您什么也不做。如果您选择对多数类进行欠采样,如果关键的观察值被移除,则可能会引入偏差。新样本也可能无法准确反映您的真实测试数据。相反,对少数类进行过采样可能会无意中扩大隐藏的数据异常并造成过拟合。SMOTE 是另一种可以改善决策边界的重采样技术[2],但是如果新数据包含与少数类中的标记样本相似的属性,则预测性增强是次要的[3]。SMOTE 在高维数据集中也会受到影响,因为它没有考虑所有相邻的类,并且会导致重要的类区别重叠。

那么,我们为什么如此热衷于重新平衡数据集呢?事实上,这种动力是为了纠正另一个与估计全球精确度有关的问题。以上面我们被拒绝的索赔为例;基本模型可以达到惊人的 95%的准确性,因为多数类代表了整个数据集中的确切比例。简而言之,仅仅是每次预测多数类“非否认”,你就会有平均 95%的准确率。通过重新平衡,准确度分数变得更加真实。

然而,我们陷入了各种各样可以重新平衡的方法中,我们留下了一些更重要的考虑:我们有足够的代表性数据吗?我们的变量真的具有预测性和重要性吗?我们是否为自己的预测设定了合适的阈值?实际上,阈值的设置对于预测任务非常重要,您可以通过精确度和召回率来优化它们。天气预报是一个很好的例子,说明了为什么阈值比二元分类精度更好。例如,天气预报员从不报告“会下雨”或“不会下雨”。它们提供了阈值,比如“有 52%的可能性会下雨”,这为我们提供了更好的洞察力和自主权,让我们在生活中的其他相关因素下做出决定,例如,如果阳光明媚,我整天拿着夹克会有多烦恼?如果我真的讨厌整天带着一件夹克到处跑,而下雨的可能性只有 52%,我会掷骰子,不穿夹克就出门。然而,在我们的医疗保健示例中,这些阈值可能是生死攸关的,而不仅仅是不便之处。

大多数预测模型将自动阈值设置为 50%,尽管选择一个更上下文相关的阈值是重要的,也是可以做到的[4]。尽管如此,如果你过于关注类的再平衡而不是优化这些类型的权衡,你可能会掉进兔子洞试图“解决”错误的问题。

重新平衡阶级在统计学上也有一些历史根源,旧习难改。许多实验设计假设数据平衡,如多因素方差分析[5]。在这种情况下,平衡设计提高了统计功效,降低了同方差[6]。在计算机出现之前,用非常不平衡的数据来估计模型对于人工处理来说尤其具有挑战性。今天,计算机的进步已经使这些问题变得过时了。高级预测模型可以在高维度和稀疏矩阵中进行优化,而且它们肯定可以解决阶级不平衡问题。

原因 2:训练数据需要反映真实世界

不重新平衡数据集的另一个原因是,模型应该在数据集上训练,数据集的分布将反映它们最终应用的未来真实世界的测试案例。如果确定重新平衡是绝对必要的,那么在进行任何重新平衡实践之前,应该拆分训练集和测试集。

在 Harrell 的一篇论文中,根据平衡数据训练的分类器需要根据适当的测试数据重新训练,因为预测和模式可能会发生巨大变化[7]。例如,假设您有两个不平衡的类别:100 万名非癌症患者和 1000 名癌症患者。如果您通过对多数类进行 90%的下采样来训练平衡类的模型,您将训练 1/10 流行率的分类器,而不是自然发生的 1/1000 流行率。正如 Provost 指出的,分类器的假设是它“将对来自与训练数据相同分布的数据进行操作”[4]。对平衡数据的训练可能无法推广到自然不平衡的真实世界数据。

已经设计了几种方法来提高不平衡数据集上的算法性能。我们可以简单地在应用重采样技术之前将类分成测试和训练集。这防止了在两个集合中出现相似数据的可能性,这种可能性会导致过度拟合和较差的泛化能力。一种更强化的提升方法涉及通过在总数据集的不同样本上使用两个学习者(L1、L2)和一个最终学习者来检测它们之间的差异(L3) [8],使训练模型适应测试分布。其他常见的方法包括分配与训练数据中的类频率成反比的类权重,这也防止了过拟合[9]。基于核的学习方法也被用来改善 SVM 模型中的决策界限[10]。但是,这些解决方案解决了阶级不平衡,就好像它们是一个非常严重的问题,当更紧迫的问题存在时——你的少数阶级代表吗?少数人有噪音吗?你的课程真的重叠了吗?你的特征变量真的重要吗?你所在的多数班和少数班有太多的“脱节”吗?[11–17].

因此,成本敏感学习的应用不是平衡班级,而是在直接应用于生活中自然发生的不平衡班级时显示出一些有希望的结果[12,18-19]。特别是,对于大型数据集,对自然、不平衡分布的成本敏感学习比过采样或欠采样不平衡类产生更好的结果。作者认为,大量的训练数据允许模型更准确地估计类成员概率[20]。其他实证研究表明,在不平衡分布中,成本学习优于抽样方法[20–22]。

原因 3:少数民族阶级的数量可能已经足够了

如果你的少数类包含足够的相关性和强大的依赖关系来通知你的分类器[23],那么再平衡可能也是不必要的。这最终优先于少数阶级和多数阶级之间可能存在的极端不平衡的比例。在几项带有不平衡数据集的研究中,少数民族的概念被准确地学习,很少受到不平衡的干扰[24–26]。

这么想吧。包含 101 个样本(100 个多数案例和 1 个少数案例)的不平衡数据集将构成一个糟糕的预测模型。但是如果你有 1000 万个多数案件和 10 万个少数案件呢?同样程度的阶级不平衡。但是在第二个例子中,少数类可能足够大以建立质量预测模型。

如果两个类别都来自具有非常明确定义(即不同)的特征变量的非重叠分布,则尤其如此[1]。在我自己预测医疗保健中被拒绝的索赔的工作中,不平衡的类别不是预测不佳的罪魁祸首;我的初始特征对我的结果变量来说只是无信息的(否认与不否认)。如果您也遇到高维度和稀疏的特征空间,这些问题优先于类不平衡问题。

另一方面,如果少数类中的样本数量太少,分类器无法充分学习,那么你真的有一个不完整训练数据的问题,而不是不平衡数据集的问题。当然,你可以称之为阶级失衡,但这实际上只是权力的问题。如果这种情况发生,我真的想知道少数民族阶层是随机缺失还是不成比例的缺失?只要您可以访问更多的数据,前者是可以的,后者可能会出现采样偏差。

少数样本量低,而不是类别不平衡,可能是预测模型的一个特殊障碍。随机森林分类器(RFC)尤其“数据饥渴”,需要大量数据才能得出有意义的结果。例如,范·德·普洛格和他的同事证明了为了让 RFC 像处理训练数据一样处理新数据,总体样本量应该是候选特征数量的 200 倍[27]。因此,具有足够样本的少数类可用于分类模型。什么叫“够了”?没有真正的硬性规定。不断优化精度和召回率,同时确保您的数据不会过度拟合或出现泄漏。

结论

如果你的不平衡类是可分的,有很好的少数类代表性,并对你的结果变量有独特而强大的影响,那么尽管不平衡,数据对构建可靠的预测模型应该不会造成什么问题。诸如精度和召回率之类的条件概率应该在类的自然分布范围内进行评估和优化。

虽然阶级失衡引起了很多关注,但更重要的问题是:

  • 您是否优化了正确的分类指标,如精度和召回率,而不是准确性?
  • 你的小众阶层代表吗?有足够多的少数民族案例吗?
  • 你的少数群体中存在噪音吗?
  • 您的模型是否尊重并很好地应用了现实场景中出现的类的自然分布?
  • 你的课程有重叠的地方吗?到什么程度?
  • 你的特征变量真的重要吗?

乐意在 LinkedIn 上与任何人联系!如果你对数据科学和医疗保健的交叉领域感兴趣,或者你有有趣的挑战要分享,请留下评论或 DM。

查看我的一些其他文章:

预测患者住院时间

特征工程 CPT 代码

设计一个基本神经网络的 7 个步骤

引文

[1]巴托什·科劳兹克。"从不平衡数据中学习:公开挑战和未来方向."智力进展(2016 年)5:221–232

[2] Marco Altini,“处理不平衡数据:欠采样、过采样和适当的交叉验证。”博客。2015 年 8 月。https://www . marcoaltini . com/blog/处理不平衡数据-欠采样-过采样-适当交叉验证

[3]杨延平,马广智。"基于集成的主动学习解决类不平衡问题."生物医学科学与工程杂志,第 3 卷第 10 期,2010 年 10 月。

[4]教务长,F.."不平衡数据集的机器学习 101 . "(2000).

[5] R.H. Riffenburgh,第 13 章——多因素 ANOVA 和 ANCOVA,编辑:R.H. Riffenburgh,《医学统计学》(第三版),学术出版社,2012 年,第 275-297 页

[6]斯蒂芬妮·格伦。来自 StatisticsHowTo.comhttps://www.statisticshowto.com/的“平衡与不平衡的设计:定义,例子”:对我们其余人的基本统计!https://www . statistics show to . com/balanced-and-unbalanced-designs/

[7]弗兰克·哈勒尔,“分类与预测。”博客,2020 年 9 月。https://www.fharrell.com/post/classification/

[8] Robert E. Schapire 在“ 弱可学习性的强度机器学习,5(2):197–227,1990 年发表。http://rob.schapire.net/papers/strengthofweak.pdf

[9] Joshi,m .,Kumar,v .和 Agarwal,R. (2001)评估用于分类稀有类的增强算法:比较和改进。第一届 IEEE 数据挖掘国际会议论文集。华盛顿 DC: IEEE 计算机学会,257–264。

[10] Akbani,r .,Kwek,s .和 Japkowicz,N. (2004)将支持向量机应用于不平衡数据集。第 15 届欧洲机器学习会议记录,意大利比萨,39-50。

[11]何海波,爱德华多·加西亚,“从不平衡数据中学习”,《IEEE 知识与数据工程汇刊》,第 21 卷。,№9,2009 年 9 月。

[12] G.M. Weiss,“稀有矿产:统一框架”,ACM SIGKDD 勘探通讯,第 6 卷,第 1 期,第 7-19 页,2004 年。

[13] N. Japkowicz 和 S. Stephen,“阶层失衡问题:系统研究”,《智能数据分析》,第 6 卷,第 5 期,第 429- 449 页,2002 年。

[14] T. Jo 和 N. Japkowicz,“等级不平衡与小间断”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 40-49 页,2004 年。

[15] N. Japkowicz,“阶级失衡:我们关注的问题是否正确?”继续。国际会议。机器学习,从不平衡数据集中的车间学习 II,2003。

[16] R.C .普拉蒂、G.E.A.P.A .巴蒂斯塔和 M.C .莫纳德,“阶级不平衡与阶级重叠:对学习系统行为的分析”,Proc .墨西哥国际会议。人工智能,第 312–321 页,2004 年。

[17] S.J. Raudys 和 A.K. Jain,“统计模式识别中的小样本效应:对从业者的建议”,IEEE Trans .模式分析和机器智能,第 13 卷,第 3 期,第 252-264 页,1991 年 3 月。

[18] N.V. Chawla、N. Japkowicz 和 A. Kolcz,“社论:关于从不平衡数据集学习的特刊”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 1-6 页,2004 年

[19] M.A. Maloof,“学习何时数据集不平衡,何时成本不相等和未知”,Proc .国际会议。机器学习,从不平衡数据集中的车间学习 II,2003。

[20] K. McCarthy,B. Zabar,和 G.M. Weiss,“在对稀有类进行分类时,对成本敏感的学习胜过抽样吗?”继续。基于效用的数据挖掘,第 69–77 页,2005。

[21]刘晓燕,周志宏,“用处理类不平衡问题的方法训练代价敏感神经网络”,IEEE Trans .知识与数据工程。,第 18 卷,第 1 期,第 63-77 页,2006 年 1 月。

[22]刘小燕、周志宏,“班级失衡对成本敏感学习的影响:一项实证研究”,中国教育出版社,2002 年。国际会议。数据挖掘,第 970–974 页,2006 年。

[23] Stephen Senn,“临床试验中随机化的七个误区。”医学统计,2012 年 12 月。

[24] G.E.A.P.A. Batista、R.C .普拉蒂和 M.C. Monard,“平衡机器学习训练数据的几种方法的行为研究”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 20-29 页,2004 年。

[25] N. Japkowicz 和 S. Stephen,“阶层失衡问题:系统研究”,《智能数据分析》,第 6 卷,第 5 期,第 429- 449 页,2002 年。

[26] G.M. Weiss 和 F. Provost,“当训练数据很昂贵时的学习:类别分布对树归纳的影响”,《人工智能研究杂志》,第 19 卷,第 315-354 页,2003 年。

[27]t .范·德·普洛格,奥斯丁,P.C .和 Steyerberg,E.W,《现代模拟技术对数据的渴求:预测二分终点的模拟研究》。BMC 医学研究方法,第 14 卷,第137 号。(2014).https://doi.org/10.1186/1471-2288-14-137

为什么人工智能不会很快取代银行家

原文:https://towardsdatascience.com/why-bankers-will-not-be-replaced-by-artificial-intelligence-any-time-soon-cb9e38fd4a7c?source=collection_archive---------4-----------------------

野外的数据科学和机器学习

各种数据专家面临的挑战和职业机会

苏蒂尔塔·布迪曼在 Unsplash 上拍摄的照片

机器人银行家仍然是科幻小说

许多科幻电影描绘了一个人工智能和机器学习系统将取代我们的世界,但在大型银行中,这与现实相去甚远。实际发生的是,ML 革命正在打开十年前没有人会相信的大门。我很幸运能够站在这个领域的最前沿,所以我想让你看看这个行业现在发生了什么。

尽管与金融科技公司相比,大型银行的创新步伐似乎很慢,但我认为,它们面临的挑战更加复杂。精明的商人会意识到哪里有挑战,哪里就有机会……现在大银行里就有很多这样的机会。

金融科技的崛起引发的破坏迫使在职者开始认真对待机器学习,许多人现在专门为人工智能创新提供资金。这对全世界各种类型的数据和 ML 专家来说都是令人兴奋的消息。

大型银行的相对不成熟

任何一个 ML 专家都会告诉你,数据是让它工作的“神奇”成分。大型银行受托管理大量有价值的客户数据,但事实证明利用这些数据很困难。目前,与脸书、谷歌和亚马逊等公司相比,机器学习的数据生态系统还不成熟。我认为主要挑战是基础设施、监管和机器学习专业知识。

云平台和传统基础设施

云平台正迅速成为管理大规模应用机器学习的存储和计算需求的最简单方式。许多现任者明白这一点,正在慢慢过渡到云。现在云已经不是什么新鲜事了,一些科技公司已经在云平台上运营了十年。那么,问题是什么,为什么对大银行来说如此具有挑战性?为了理解这一挑战,我们需要简单回顾一下历史。

大多数现有银行自金融服务中的计算机出现以来就存在了。

1959 年,马丁银行(英国)安装了第一台计算机来复制所有的经常账户操作,与标准操作并行。

从那时起,银行的数据基础设施已经发展成为一个复杂的遗留平台和混乱的网络。很自然,这导致一些业内人士在添加更多层之前要谨慎行事。这里的主要担忧是技术性债务,一些银行目前为此付出了高昂的代价。

机遇:银行希望以一种技术债务最小且可长期持续的方式过渡到云。这里最大的机会是技术专家,他们可以理解遗留数据基础设施的复杂层,以及它如何与云平台交互。如果您能够绘制出数据架构,编写严谨的技术文档,理解您的技能集所需要的系统级别的数据。

职业道路:数据&云架构师、云平台工程师、数据工程师

监管是一件大事

监管往往是房间里的大象,忽视它会让你自担风险。银行业是一个受到严格监管的行业,自 2008 年金融危机以来,其复杂性有所增加。随着 2018 年 GDPR 的推出,所有公司都在加强对他们如何管理数据的审查。2021 年,监管机构对未能遵守规定的公司处以巨额罚款。

亚马逊因通过 cookies*收集和分享个人数据的方式被罚款8.77 亿美元

WhatsApp 被罚款2.25 亿美元,因为它没有正确解释其数据处理实践*。

Caixabank 因违反 GDPR 透明度要求和未建立使用消费者个人数据*的“法律基础”而被罚款720 万美元

*来源:https://www.tessian.com/blog/biggest-gdpr-fines-2020/

你可能已经注意到,一些最大的罚款已经被开给了那些已经达到机器学习成熟度的公司(相对而言)。这是大银行即将面临的危险,其中许多银行仍处于 ML 和大数据基础设施的早期采用阶段。随着数据生态系统的成熟,银行面临的监管挑战将变得更加复杂,巨额罚款的风险也将增加。

还有 AI 的公平性问题,这是一个滴答作响的定时炸弹。有许多机器学习模型已经在有偏见的数据集上进行了训练,这些数据集将面临监管打击。

如果你有机会阅读《数学毁灭的武器》(凯茜·奥尼尔),它可以作为一些即将出现的人工智能和公平问题的警告。

机遇:大型银行需要不仅懂数据监管,还懂机器学习的专家。特别是在银行业,可解释的人工智能是关键。大多数模型不会进入生产阶段,因为法规要求决策是可解释的。能够构建高性能、可解释模型的熟练操作员在这里也很关键。

如果你不相信这个机会的规模,那就再看看亚马逊在 2021 年收到的罚款。这里没有说明的是声誉损害,对银行来说,这通常比罚款的直接财务影响更大。

职业道路:法律&合规专员、统计学家和数据科学家

合适的机器学习专业知识很少

我认为这个挑战的两个方面在于原型和扩展机器学习。让我们先来看看原型。事实证明,在野外发现可行的机器学习用例并不容易。在现有银行中,挑战在于组织的规模和所需的领域知识。

第二个标题是关于缩放。大型现有公司服务的客户数量为数千万,客户交易总量数十亿甚至数万亿。交付这种规模的机器学习模型带来了工程挑战。这里的规模超出了数量,因为数据通常是在一个破碎的银行生态系统中生成的。

机遇:对于原型开发阶段,熟练的数据科学家和分析师有着巨大的机遇。你将需要快速“穿过混乱”的能力。你应该有一个制定合适的机器学习问题的框架和快速开发原型的能力。拥有一些银行和金融领域知识的数据科学家将在这里胜出(这就是我如何获得第一份数据科学工作的)。

对于扩展阶段,这更像是一个工程挑战。一名熟练的机器学习工程师将了解如何利用数据科学家构建的原型,并将其开发为规模化运营。

在实践中,原型和缩放之间有重叠。想象一下这个场景:您有数百个模型在运行,现在其中一些模型的性能开始漂移,您打算怎么办?好吧,一个熟练的数据科学家应该理解为什么那些模型会漂移,并适当地指导训练。或者,人们可能会发现这种漂移是由损坏的数据管道引起的,需要工程技术人员来解决。

大规模提供有效的机器学习需要工程和数据科学之间的持续合作,以实现模型交付、性能和监控。这里的重叠是一个现在通常被称为机器学习操作(简称 MLOps)的领域。

职业道路:数据科学家、软件工程师、开发人员、数据工程师、机器学习工程师、商业分析师

最后的想法

ML 革命给银行业带来了新的挑战,也给各种类型的数据专家带来了机遇。虽然现在有很多关于数据科学的宣传,但实际上需要各种类型的数据专家。所以,发挥你的优势,如果你有很强的分析能力,并且理解科学方法,那就追求数据科学。如果你对系统和软件更感兴趣,那就追求工程学。对于人工智能的监管挑战和公平性,选择法律和合规路线。如果你有银行业的专业知识,可以考虑参加机器学习课程来增加你的市场价值。

我想留给你们这个想法,现在机器学习系统需要一个人在循环中。人工智能系统没有取代我们,而是创造了我们必须理解它们的工作岗位。

⭐️ 我喜欢通过分享我在野外的数据科学经验来帮助人们。如果你还不是会员,可以考虑订阅 Medium,从我这里获得更多有用的内容。

https://johnadeojo.medium.com/membership

为什么自助抽样是概率思维的利器

原文:https://towardsdatascience.com/why-bootstrap-sampling-is-the-badass-tool-of-probabilistic-thinking-5d8c7343fb67?source=collection_archive---------31-----------------------

以及你现在如何在实践中运用它

照片由 Pixabay 发自 像素

介绍

你尽了最大努力,用电子设备在你的房间里测量了 50 次声速。感到非常自豪和兴奋,你看着你的结果:

好大的耳光!在前 10 次测量后,该设备出现了技术故障。它根本没有测量任何东西。你现在做什么?

你可以取可用数据的平均值,但你有多大把握呢?如果设备工作正常,你计算的平均值可能是其他数字。

事实上,测量 50 次速度的全部原因是,你可以对你的发现充满信心,并对任何环境下的声速做出有效的假设,而不仅仅是在你的房间里。

你必须经历所有的痛苦,并设置一个新的设备来记录更多的测量结果吗?见鬼,不!好吧,至少如果你知道 Python 和一个叫做 Bootstrapping 的神奇方法。

Bootstrapping 允许您模拟任何数据分布。这意味着您避免收集更多的数据。你可以只用一个子集对一个大得多的群体做出相当合理的估计。

使用 bootstrapping 从一个小样本到对整个群体进行预测的概念已经让人们信誓旦旦了很多年。如果在实践中使用,这似乎有点像作弊。但事实上,它只不过是很少的数学和大量计算能力的结合。

尽管这是一个非常简单的方法,但是它的应用远远超出了本文的范围。许多领先的机器学习算法,如随机森林随机梯度推进也使用它。

在本帖中,我们将了解这种方法的工作原理,以及我们如何使用 Python 实现这种方法来模拟数据分布,这有助于我们对人口进行预测,计算置信区间,并在未来进行假设检验。

https://ibexorigin.medium.com/membership

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

https://alphasignal.ai/?referrer=Bex

术语警报

在这篇文章中,我会经常用到人口、样本、统计和参数这些词。因此,在我们继续下一步之前,理解它们是很重要的:

  • 人口和样本:在统计学中,人口是指我们感兴趣的整个群体,样本只是人口的一个小的随机子集。例如,“走向数据科学”出版物的所有关注者可以是整个群体,而阅读这篇文章的人只是这个群体中的一小部分。对于我们的情况,我们房间中的 10 个声速测量值可以作为样本,而任何环境中的声速测量值可以作为总体。
  • 参数和统计:如果我们为总体计算某个度量,例如平均值或标准差,它被称为总体参数。如果我们对一个样本这样做,它将被称为样本统计

举个例子,假设你有一万个电子邮件用户。你给所有的订阅者发了一封邮件,询问他们最喜欢的编程语言。只有 2500 人回应,其中 70%的人喜欢 Python。这里:

  • 人口 : 1 万电子邮件用户
  • 样本 : 2500 人回应
  • 统计 : 70%喜欢 Python
  • 参数:未知,我们应该只使用样本计算所有喜欢 Python 的订阅者的百分比。

既然我们就术语达成了一致,让我们继续自举。

自举理论

为了在实践中展示自举,我们将从声速的十个测量值开始。首先,让我们绘制数据点:

我们的目标是在任何开放的环境中正确估计声速,而不仅仅是在房间里。因为我们不太可能看到声速的异常值,所以平均值可以是代表速度的一个很好的度量。所以,让我们在图上标注一下意思:

我们得到的平均值是 344.39 米/秒(米每秒)。现在,我们引导样本:

  1. 首先,我们从速度中随机选择 10 个测量值,允许重复。
  2. 计算这个随机样本的平均值,并将其存储在一个数组中。
  3. 重复第一步和第二步很多很多次,最好是 1000 或 10000 次。

因此,让我们从可用数据中随机选择 10 个点,我们可以根据需要多次选择任何数据点:

我使用 Python 随机选择这些点(稍后我将展示如何选择)。正如你所看到的,我们只有 7 个独特的点,这意味着有 3 个点绘制在彼此的顶部,因为我们最终有一些重复。然后,我们测量平均值并绘制出来,这次是 344.396。

以下是从最初的 10 次测量中随机抽取的 10 个点:

>>> list(temp)[345.59, 345.07, 340.4, 349.47, 340.92, 349.47, 340.26, 349.47, 342.91, 340.4]

以上称为单自举样本。它的平均值是 344.396,称为自举复制或度量。

接下来,我们应该重复这两个步骤数千次。例如,下面我将选取 1000 个 bootstrap 样本,并仅在一个图表上绘制它们的平均值:

上图是从最初 10 次声音测量中采样的 1000 个 bootstrap 复本(平均值)的图表。我用较低的透明度绘制线条,以便重叠的线条在实际估计的平均值周围创建一个更密集的背景。如您所见,样本平均值约为 344 m/s,我们可以放心地将其用作任何环境中的一般平均声速。

我们刚刚做的叫做自助抽样替换带替换是指从底层样本中随机选择一个数据点并放回原处,这样所有的数据点都有均等的机会再次被选中。

此外,重要的是每个引导样本与基础样本具有相同的长度。在我们的例子中,每个 bootstrap 样本的长度为 10,因为我们一开始只有 10 个速度测量值。

现在,问题是‘为什么我们必须假设我们用 bootstrap 抽样计算的平均值接近实际的总体参数?’。在下一节中,我们将根据一些数学知识来回答这个问题。

为什么自举有效

在概率论中,有一个理论叫做大数定律。它表明,如果同一个实验进行了很多次,随着实验次数的增加,实验的平均结果往往更接近真实的估计值。

例如,掷出一个公平的骰子会有六种结果 1,2,3,4,5,6。你的预期分数是这 6 个数字的平均值,即 3.5。当然,现实中你滚几次骰子也不会有 3.5 的平均分。但是,由于大数定律,随着你掷数的增加,你的平均分越来越接近 3.5。

如果你想一想,这实际上是有道理的。举一个更真实的例子,如果你参加两次 SAT 考试,你可能会得到两个非常不同的结果。然而,越来越多地参加考试会让你越来越接近你在考试上的实际技能衡量标准。

Bootstrapping 在幕后使用了同样的想法。给定一个好的样本(我将在下一节解释什么是好的样本),从这个样本中随机抽取样本实际上会给出非常接近实际总体参数的结果。

对我来说,多次使用少量数据对一大群人进行预测,而不必收集更多的数据,这是非常令人惊讶的。

自举有多有效

一个显而易见的问题是这种方法的效果如何。答案是,大多数时候,你可以期待引导的结果是正确的和可用的。但是,对总体参数进行推断的准确性取决于您收集的样本。

为了使引导正确工作,您使用的样本应该准确地代表感兴趣的总体。例如,如果你想收集人的身高信息,并计算地球上所有人类的平均身高,你必须选择正确的样本。

此外,收集的数据应该是真正随机的,包括来自人口中广泛群体的数据点。只选择运动员这样的特定群体不会是一个足够好的样本。因为运动员往往比较高。

如果您确定您正在使用一个足够好的样本,那么您几乎总是可以确定从引导中获得的结果是可靠的。如果没有,你必须大胆地使用 bootstrapping,因为大多数时候你给的数据都是次要的(别人收集的)。

作为一个额外的好处,自举可以用来测量人口的其他参数的整个范围。很好的例子有中位数、众数、标准差、方差、相关性等等。

什么是抽样分布

术语“自举”和“采样分布”经常一起出现,事实上,采样分布是使用自举获得的。让我们用早期的声速测量来澄清这一点。

回想一下,我们从最初的 10 次测量中提取了 1000 个引导样本,并绘制了每个引导样本的平均值。这一次,我将把所有的方法存储在一个 Python 数组中,而不是绘制:

我正在显示存储在变量means中的 1000 个平均值中的前 20 个。在概率学中,means被称为样本均值的抽样分布。相反,我们计算每个引导样本的标准偏差:

它将被称为“样本标准差的抽样分布”。

这种分布实际上是没有用的,除非我们把它画出来。采样分布的常见图形是直方图:

我们可以看到采样分布近似为正态分布。事实上,随着 bootstrap 样本数量的增加,在正确的 bootstrap 条件下获得的每个单个采样分布将遵循近乎完美的正态分布

最后,在下一节中,我们将看一下生成所有这些引导和示例发行版的代码。

Python 中的引导

Python 中的引导通常从数据帧开始。这项技术本身广泛使用了numpy,所以我们将把它和pandas以及两个绘图库一起导入:

我将加载 Seaborn 的内置钻石数据集,我们将使用 bootstrapping 来推断整个钻石群体的平均价格:

下面是钻石价格的核密度估计图,平均值标注为黑线:

平均价格是 3932.8 美元。

现在,我们将把钻石价格提升 10k 倍,这样我们就有了所有可能的钻石数量:

首先,我们创建一个空的numpy数组来存储平均值。然后,我们用 10k 次迭代初始化一个for循环。在每次迭代中:

  • 我们使用np.random.choice进行引导抽样
  • 我们使用潜在分布的长度(钻石价格)作为size参数
  • 我们使用每个样本计算平均值,并将其添加到means

*np.random.choice*默认情况下,接受任何值序列并随机选择替换的数据点。

为了绘制样本均值的抽样分布,我们可以使用 Seaborn 的kdeplot或 Matplotlib 的hist。虽然选择权在你,但我更喜欢 KDE 的情节,因为它噪音更小,也避免了宁滨偏见:

正如所料,我们看到了一个非常接近正态分布的匹配。现在,问题是‘我们现在如何对人口参数做出假设?’。这将使用置信区间来回答。

置信区间

一般来说,当你看到有人提到某个指标的 k% 置信区间为[m,n]时,这意味着他们有 k%的把握认为总体指标位于 mn 之间。

你看,当你从概率的角度思考时,你永远不能绝对肯定地说总体参数等于某个数字,因为你只用一个小样本来计算你的假设。因此,统计学家计算参数的区间,并声明参数位于某个区间内。

置信区间的常见百分比是 95%或 99%。区间本身基本上是用百分位数来计算的。例如,为了计算抽样分布的 95%置信区间,您将 2.5%作为下限,将 97.5%作为上限。

另外,记住取“中间”区间,而不是另一个像第 0 和第 95 或第 5 和第 100 百分位。实际参数总是位于更居中的区间。

为了在 Python 中实现这一点,我们将使用numpynp.percentile函数,该函数将采样分布和百分点作为参数:

看着上面的数字,我们可以 95%确定世界上所有钻石的平均价格都在 3899 ~ 3968 美元之间。

我们本可以轻松获得 99%的置信区间:

这次我们得到【3889.45,3977.59】

结论

恭喜你!你学到了大量的新知识,这对你的数据科学职业生涯非常有帮助。请记住,自举只是迈向更复杂的推断统计学和概率论的第一步。正如你将在我未来的文章中看到的,我们将使用 bootstrapping 来制定假设检验,这也是数据科学工作流程的一个重要部分。待调好

为什么自举真的有效

原文:https://towardsdatascience.com/why-bootstrapping-actually-works-1e75640cf172?source=collection_archive---------13-----------------------

一个简单的门外汉解释为什么这种流行的技术在数据科学中有意义

内森·杜姆劳在 Unsplash 上的照片

我们总是有丰富的项目数据。通常,由于缺乏资源来进行重复实验(例如 A/B 测试),我们只有一个样本数据集。

幸运的是,我们有重采样方法来充分利用我们拥有的任何数据。 Bootstrapping 是一种重采样技术,如果我们只在原始样本上拟合一次我们的模型,它可以提供否则无法获得的信息。

虽然我们可能熟悉自举背后的'什么'和'如何',但本文旨在以通俗的方式呈现自举的' 为什么 '。

快速回顾自举

bootstrap 的目标是基于从原始样本获得的多个数据样本,为总体参数(例如总体均值 θ )创建一个估计值(例如样本均值 )。

通过重复采样(替换)样本数据集以创建许多模拟样本来完成自举。每个模拟的 bootstrap 样本用于计算参数的估计值,然后将这些估计值组合起来形成采样分布。

然后,bootstrap 抽样分布允许我们进行统计推断,例如估计参数的标准误差。

引导程序|作者图片

自举为什么有效?

你一定想知道,重复采样同一个 样本数据集的行为怎么能让我们对人口统计数据做出推断呢?

理想情况下,我们希望从真实人口中抽取多个独立的真实样本来理解人口统计数据。然而,我们早些时候已经确定这并不总是可能的。

因此,我们必须使用我们的样本数据集,它成为我们所拥有的关于人口的最好的(也是唯一的)信息。

合理的假设是,大多数样本(如果随机抽取的话)看起来非常像它们所来自的人群。考虑到这一点,这意味着我们的样本数据可以被视为一个总体,我们现在假设它代表了真实的总体

有了这个虚拟群体,我们就可以从中抽取多个(bootstrap)随机样本。这就好像我们现在从真实人群中获得了多个样本。

注:现实中,原始样本只是我们从真实人群中得到的 一个 样本。

因为允许带替换的抽样,所以 bootstrap 样本也可以看作是在不同方法和假设下产生的随机样本。

从这些 bootstrap 样本中收集的样本信息将最终帮助我们获得总体参数(如总体均值)的(相对)精确估计。

图片来自统计学习入门—第二版 |经许可使用

那么 bootstrap 抽样有多有效呢?上图比较了真实人群中 1000 个模拟样本的参数( α ) 估计值与 1000 个 bootstrap 样本的估计值。

我们可以看到箱线图具有相似的分布,表明 bootstrap 方法可以有效地估计与参数估计相关的可变性。

摘要

在本文中,我们探索了引导背后的直觉的简单解释。希望这篇文章能让你更好地理解自举,以及为什么它在理论和实践上都行得通。

关键概念是假设原始样本代表总体。通过对该样本进行多次重采样,我们得到了总体参数样本估计的相对精确的采样分布。

当然,这里有几个注意事项。例如,在从真实人口中抽样的正常情况下,我们绝不会从整个人口中抽取同样大小的样本。但是,在引导中通常使用与原始数据集相同的样本大小。

关于众多警告的更多细节,你可以查看这个 StatsExchange 论坛线程这里。我也期待你对这个话题的反馈。

在你走之前

欢迎您加入我的数据科学学习之旅!点击这个媒体页面,查看我的 GitHub ,了解更多令人兴奋的数据科学内容。同时,祝你自举愉快!

为什么构建黑盒模型可能是危险的

原文:https://towardsdatascience.com/why-building-black-box-models-can-be-dangerous-6f885b252818?source=collection_archive---------31-----------------------

可解释性可以拯救生命

机器学习模型以复杂的黑盒而闻名,其输出和预测背后的推理通常是不可解释的。

Unsplash 上的 krakenimages 拍摄的照片

我们需要可解释性吗?

然而,当涉及到“高风险”决策时,我们真的想相信一个黑匣子吗?例如,当涉及医疗保健决策时,机器学习模型预测患者是否可以在重症监护中接受监控或需要特殊治疗(例如,不同的药物治疗)。这些决定不应该由训练有素的医生而不是黑盒算法来做吗?在这样的领域,参与这些“高风险”决策的每个人都“参与”决策是非常重要的。

但是模型是高度精确的,那么我们为什么需要可解释性呢?

经常有人认为我们不需要关心可解释性,因为模型的准确性非常高。这就是它变得危险的地方!通常情况下,模型会发现它们不应该发现的东西,并通过混淆变量来提高准确性。

A 混杂变量 是你没有考虑的变量。它们会毁掉模型,给你提供无用的结果。他们可以暗示有关联,但事实上没有。

这么说,鹳生孩子是真的了!

莫里斯·沙尔克在 Unsplash 上拍摄的照片

2000 年,马修斯发表了一篇名为“鹳分娩婴儿”的论文,他声称分娩和某个地区鹳的数量之间有着重要的关系。他发现相关系数 r=0.62,p 值为 0.008,这支持了他的发现。当然,他只是指出,我们应该意识到混淆变量和关联因果关系:

混淆变量-作者图片

即使两个变量可以表现出显著的相关性,但这并不意味着现实世界中存在因果关系。在这篇幽默论文的结尾,马修斯指出,读者应该更深入地研究一个国家(农村)地区的关系,看看是否与分娩有可能的相关性,而这种相关性更有可能与因果关系相关联。

新冠肺炎诊断中的混淆变量

Alex DeGrave 等人的一篇新论文显示,研究人员和放射科医生最近训练了 ML 模型,可以准确地检测胸片中的新冠肺炎。然而,在调查了模型的性能后,论文中的研究人员发现,该模型通过查看 x 光照片上的文本标记(文本片段)来走捷径,并将其预测建立在标记的位置而不是实际的 x 光照片上。

如果这些标记的位置发生变化(例如,由于不同的 x 光机而在不同的医院),模型的准确性将显著下降,并产生错误的预测,这在疾病诊断的情况下可能是危险的或危及生命的!

射线照片上的文本标记通过显示新冠肺炎预测重要性的显著图来突出显示。与交换相同大小的随机补片相比,新冠肺炎阳性和新冠肺炎阴性图像之间标记位置的交换显著改变了预测——改编自 DeGrave,Alex J .,Joseph D. Janizek 和 Su-In Lee。"射线照相新冠肺炎检测的人工智能选择捷径而不是信号."

如果你的模型有很高的准确性,甚至可能拾取训练有素的专家看不到的东西,问“为什么它表现得这么好”是非常重要的如果你不问这个问题,你的模型可能不能很好地概括,给你带来很多麻烦!辛西娅·鲁丁

可解释性与准确性

“为了可解释性,我们不得不牺牲准确性!”

为了可解释性,我们必须牺牲准确性,因为我们必须使用不太复杂的模型,这是一个有害的神话。由辛西娅·鲁丁(可解释 ML 的倡导者)提出的一个论点是,建立可解释的模型实际上可以提高准确性。当构建一个可解释的模型时,我们开始质疑和研究它,而不是黑盒模型,并提出更多的问题:

  • (确定的)因素真的是推动最终决策的最重要因素吗?
  • 我的结果没有任何意义,可能是数据集有问题?也许更多地关注数据而不是模型会提高准确性?
  • 如果这些变量很重要,也许它们中的一些可以组合成更有意义的东西(“特征工程”)。

通过了解您的模型并能够解释其预测,您可以通过在数据和特征工程上花费更多的时间来迭代地提高模型的准确性,而不是像构建黑盒模型那样将大部分这些部分从您身边带走。

一旦你开始做更多的数据科学,你就开始获得更多的性能!

那为什么我们还有黑盒模型呢?

所以你可能会问,为什么我们需要黑匣子。嗯,根据辛西娅·鲁丁的说法,这其实很简单:

  • 人们喜欢黑盒,他们喜欢这种想法,即这些复杂的算法可以揭示数据中没有人能够理解的秘密。
  • 黑盒保护商业!公司通常对构建可解释的模型不感兴趣,因为他们更喜欢没有人可以复制/窃取并且难以挑战的黑盒。
  • 黑盒模型不需要任何或很少的领域知识,几乎任何具有基本机器学习知识的人都可以实现。

如果一个模型是一个黑盒,那么很难争论它是否有意义,因为没有人能看到里面发生了什么。你经常剩下的唯一衡量标准是准确性——这是非常成问题的!

如果你有一个简单的可解释的模型,那么人们会争论和质疑它!—然而,可悲的是,这通常不是 ML 工程师和公司想要的。

更多材料

【1】数据怀疑论播客——不需要黑盒——辛西娅·鲁丁:https://dataskeptic . com/blog/episodes/2020/不需要黑盒

辛西娅·鲁丁——请停止“可解释的”ML:https://www.youtube.com/watch?v=I0yrJz8uc5Q

【3】罗伯特·马修斯—“鹳接生(p= 0.008)”:https://online library . Wiley . com/doi/ABS/10.1111/1467-9639.00013

【4】Alex de grave 等人,“用于射线照相新冠肺炎检测的人工智能在信号上选择快捷方式。”自然机器智能(2021):https://www.nature.com/articles/s42256-021-00338-7

为什么 C 对于数据科学来说很方便

原文:https://towardsdatascience.com/why-c-comes-in-handy-for-data-science-76071206bb5?source=collection_archive---------11-----------------------

为什么数据科学家可能会考虑学习 C 编程语言。

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

介绍

T 数据科学领域的奇妙世界通常存在于高级声明式编程语言中。这种语言的一个主要例子是 Python,但是只要看看最流行的语言列表,就可以很快发现大多数数据科学家更喜欢使用哪种语法。我通常认为数据科学最重要的三种语言是 Python、R 和 Julia。Scala、SAS 和类似的解决方案当然值得注意,尤其是其中一些选项比 Julia 语言更受欢迎。然而,我认为朱莉娅应该得到这个位置,因为它的采用率迅速上升。这里的要点是检查这些语言的属性。

Are 是一种为统计分析而创建的多范例、声明性、解释型编程语言。Python 是一种通用的多范例、声明性解释语言。Julia 也是一种多范例、声明性的编程语言,但它是编译的。这里我们可以考虑的是这些语言之间惊人的相似之处。所有这些语言都有非常简单的语法,很容易学习。由于今天用于数据科学的所有最流行的语言都具有相同的属性,因此可以有把握地认为这是数据科学家的偏好。

然而,尽管有这种偏好,其他编程语言在数据科学中仍然肯定有应用。例如,C++已经非常受机器学习工程师的欢迎。与用于数据科学的典型解释编程语言相比,这些类型的语言有许多优点。虽然经常有人说,如果你想进入数据科学,你应该学习 Python 或 R,这当然是真的,但了解 C 或 C++等语言也有一些好处。

特别是,我发现 C 编程语言对于数据科学工作来说非常方便。今天,我想讨论一下为什么会出现这种情况,简要介绍一下 C 语言的优点,并解释一下为什么我认为数据科学家可能会选择 C 语言。当然,C 语言是否是您的好选择的答案总是取决于您实际想做什么,但我认为在大多数应用程序中,C 语言可能是实现数据科学的宝贵财富。

学习 C 语言的一般原因

在我们进入数据科学家可能想要学习 C 语言的原因之前,让我们先回顾一下不管数据科学属性如何,你可能想要学习 C 语言的原因。数据科学可以转变为通用工程的情况很多,我认为先了解 C 作为通用语言,再了解数据科学语言当然是明智的选择。

多才多艺的

C 语言的第一个优点是它非常通用。大多数库和头文件都是用 C 语言编写的。几乎所有的编程语言都可以解释 C 语言,因为如果不使用 C 语言,这种语言就无法访问为运行整个系统而构建的代码。您正在阅读本文的内核很可能是用 c 语言构建的。

从最低级别的系统输入一直到最高级别的 web 开发,一切都可以用 C 来完成。与此同时,C 是一种使用了很长时间的受人尊敬的语言。C 语言有很多可用的库。

学问

作为一名数据科学家,我的首要任务之一是永远学习,无论我在做什么。学习是数据科学的一个非常重要的方面,因为数据科学涉及许多不同的学科。也就是说,你可以用你的余生来学习这些学科中的一门。如果你想从更底层的角度了解更多关于计算机的知识,它们是如何工作的,以及它们是如何与代码交互的,C 是一个很好的选择。当我学习 C 语言时,我学到了很多关于计算机的知识,这些信息在处理任何问题时都很方便,即使是像 Python 这样的语言。

快的

正如你对 C 语言的期望,它是一种编译速度非常快的语言。与我们通常用于数据科学的选项相比,尤其如此。如果你想让你的代码运行得更快,你可以直接使用 C 语言。此外,C 代码可以得到越来越多的优化,因为它允许您更直接地与计算机上的硬件进行交互。

c 代表数据科学

既然我们更好地理解了为什么 C 语言擅长做它应该做的事情,现在让我们考虑一下为什么它会是一个很好的选择,或者是一个值得学习的数据科学家。我首先要考虑的一件事是,C 编程语言绝对不是一个人进入数据科学领域应该使用的语言。有很多其他选择可以有效地完成工作,同时减少学习的时间。当您考虑到它在一些数据科学工作中的使用是如此之少时,情况就更是如此了。

计算机编程语言

Python 编程语言在数据科学家中变得非常流行。这种语言是用 C 编写的,最终由 C 解释。也就是说,我们可以使用带有 Python.h 头的 C 轻松地与 Python 交互。不用说,当人们想为 Python 编写更优化的代码时,这很有用。Python 中通常用于数据科学的大多数包实际上都利用了这一点。例如,考虑到 Pandas 和 NumPy 都至少有一部分是用 c 编写的。

快速(再次)

机器学习在处理器上可能是密集的。虽然许多解决方案已经转移到并行计算平台,但有时从更多迭代代码开始可能是一个更好的主意。c 是一种非常快速的语言,它可以更容易地优化,这可以导致更快的算法,所以它肯定是实现可能需要大量处理或内存来执行的机器学习算法的一个很好的选择。

C++

一种被证明非常受机器学习爱好者欢迎的语言是 C++。在很多方面,C++中的++只是面向对象的编程,以及一些使编写 C 更容易的有用特性。也就是说,学习 C 可以成为学习 C++非常坚实的敲门砖。这两种编程语言的代码往往非常相似,很容易理解为什么数据科学家会想了解 C++。如果你想成为机器学习专家,并专注于数据科学的这一部分,那么 C++是一个很好的选择。对于找工作来说尤其如此,因为 C++对于低级机器学习工程师来说是相当受欢迎的选择。

结论

对于数据科学,我们已经完全被 Julia 等伟大的语言和 Python 等伟大的生态系统宠坏了。虽然所有的数据科学语言都很好使用,但有时了解一种迭代语言肯定会派上用场。虽然它肯定不是专门为了从事数据科学而应该学习的语言,但它在数据科学领域会派上用场。对于计算机科学学科来说,这种语言也是一种非常有价值的学习经历。

这个领域的一个伟大之处在于,你有不同的选择。如果您热爱数据,那么您可能有几个不同的选择来更深入地研究它。虽然像 C 这样的语言对于那些想进行高级分析和对数据进行统计测试的人来说可能不太方便,但对于像我这样的数据科学家来说,它肯定会很方便。我通常倾向于编程和计算机科学部分,以及数据科学的机器学习部分。我有一篇文章详细讨论了这一点,以及如果您是数据科学领域的新手,可以采取的一些步骤。对于那些团结一致,只想试一试的人来说,这当然值得一读:

[## 2021 年如何闯入数据科学(8 步)

towardsdatascience.com](/how-to-break-into-data-science-in-2021-8-steps-87cb02a4a1f4)

这当然取决于我的偏好,因为这些是我觉得最令人兴奋的事情,但也因为我一生都是软件工程师。话虽如此,我认为对于一些数据科学家来说,C 语言肯定不是教育的下一步。当然,在数据科学应用中,知道 C 将会成为无用的信息,并且最终会浪费掉本可以用来学习其他东西的时间。然而,如果你对计算机科学和机器学习比对数据科学的其他应用更感兴趣,我当然会推荐你学习这门语言来扩展你的知识和进一步提高你的能力。感谢您的阅读,我希望这篇文章有助于确定学习 C 对于您来说是否是朝着正确方向迈出的一步。

为什么聊天机器人不能和 10 岁的孩子聊天?

原文:https://towardsdatascience.com/why-cant-chatbots-hold-up-a-conversation-with-a-10-year-old-d85e6fd87de3?source=collection_archive---------30-----------------------

自然语言处理的复杂性以及在机器开始处理之前进行数据辩论的必要性

如今,自然语言处理应用程序,如聊天机器人、语音识别和文本摘要越来越吸引人。无数公司已经集成或正在寻求集成智能聊天机器人服务,以更好地为客户服务。研究人员正在拓展的边界,提高自然翻译的准确性,希望有一天机器能够达到并超越人类对自然语言的翻译。

照片由安迪·凯利Unsplash 上拍摄

" Alexa,披萨计时器还剩多少时间?"

Alexa 回应那样的问题是微不足道的。但是它在和一个 10 岁的孩子交谈时有多擅长呢?

事实证明,自然语言比目前机器编程理解的要复杂一些。在我们深入研究任何花哨的人工智能算法之前,让我们先仔细看看语言中的模糊性。

语言中的歧义

任何学过第二语言的人都知道,直接的单词到单词的翻译并不总是有效的。通常,你需要重新连接你的心理语言模型来流利地交谈。这就是语言中的歧义。

莱昂纳多·大久保俊郎在 Unsplash 上拍摄的照片

迷失在翻译中

谷歌翻译在过去几年已经变得相当不错了,但是任何以前使用过这个工具的人肯定都观察到了一些奇怪的翻译,尤其是在彼此差异很大的语言之间。

法语短语:“我爱你。”大致可以翻译成以下几句话:“外面真美。”,“真的很好看。”,“天气真好。”

如果我们逐字翻译这句话,意思是“他真的很美”,这在英语中毫无意义。人类更善于根据周围的环境选择正确的翻译。

同一语言内的歧义

同一种语言内部也存在歧义。人们喜欢玩模棱两可的句子,但这对于自然语言处理来说可能是一场噩梦。以下面的新闻标题为例:

“老师打游手好闲的孩子。”

这可以从两个方面来解释。

  1. 教师罢工,孩子们无所事事。
  2. 也许老师受够了游手好闲的孩子,决定打他们。

根据经验,大多数人会以第一种方式解释它。但是正如你所看到的,从语法的角度来看,这对机器来说是一项具有挑战性的任务。

预处理

真诚媒体Unsplash 上拍摄的照片

要对这些文本执行任何机器学习,我们首先需要将文本转换成可以分析的格式。每种语言都有自己独特的特征,每种语言都可能需要不同的处理步骤。标记化、停用词移除和词条化是一些比较常见的语言预处理技术。

标记化

记号化是将原始文本分解成称为记号的小片段的过程。这些标记将有助于解释测试集背后的含义。

例如,句子“电影很棒”可以标记为[“The”、“movie”、“was”、“great”]

这一步在英语中可能看起来微不足道,一个简单的解析器就可以完美地工作:

str = "The movie was great"
str.split() # returns ["The", "movie", "was", "great"]

然而,当涉及到像日语这样不以空格书写的语言时,标记化就成了一项更复杂的任务。

映画は良かった (The movie was great)

这里有一篇很棒的文章是为日本人做的。

停止字移除

在 NLP 中,对整体解释没有贡献的词或无用的词被称为停用词。这包括像“这个”、“一个”、“是”这样的词。你可以在搜索引擎中看到这一点。试着在谷歌上搜索关键词“伟大的电影”和“伟大的电影”。尽管从语言学上来说,多一个单词“the”会有很大的不同,但搜索引擎会删除停用词,并提供相同的搜索结果。

停用词移除也可以是可选的步骤。

在像英语这样的语言中,句子是由几个单词组成的,这些单词是由一个共同的词根词派生出来的。想想“玩”和“戏”这两个字都是从“戏”衍生出来的。具有这种特性的语言被称为屈折语言。

对于屈折变化的语言,也有一个屈折变化的程度。根据维基百科的说法,一些语言如拉丁语、希腊语、圣经希伯来语和梵语有很高的音调变化,而其他语言如英语、荷兰语、波斯语和汉语则有很低的音调变化。

在执行 NLP 时,我们希望将这个派生形式“规范化”为它的根形式,以便有更好的理解。

“是”、“是”、“是”->“是”

“汽车”,“汽车”,“汽车的”,“汽车”->“汽车”

这个规范化过程也称为词汇化。

基本特征提取

有许多方法可以从句子中提取特征。在本文中,我将重点介绍更直观、简单的提取方法。让我们从一个简单的例子开始,想象我们想要对下面 3 个电影评论执行一个情感分析。在实现任何花哨的人工智能算法(即分类算法)之前,重要的是我们首先要从训练句子中提取出特征。

  1. “这部电影很棒。”

2."这部电影太棒了!"

3.“不推荐看这个。”

Unigram

一个简单的想法是将每个唯一的单词标记为一个特征。在上面的培训示例中,我们现在有 10 个功能。(在这个例子中,我们假设唯一的预处理是小写)

[“the”, “movie”, “was”, “great”, “phenomenal”, “would”, “not”, “recommend”, “watching”, “this”]

二元模型

一些研究人员认为,将句子分解成单个单词,我们可能会丢失一些额外的信息,如单词的邻近性和关联性。为了解决这个问题,我们可以将两个单词组合起来,中间加上一个特殊字符,以创建一个新的功能。

["the-movie", "movie-was", "was-great", "was-phenomenal", "would-not", "not-recommend", "recommend-watching", "watching-this"]

N-grams

上述相同的逻辑可以应用于将 n 个单词组合在一起以形成特征。

现在我们有了特征,下一步是将每个测试句子分配到这个特征空间中。这可以通过以下方法实现:

频率计数

顾名思义,我们可以简单地遍历我们的测试示例,并将频率计数分配给每个特性。如果“was-great”出现 2 次,那么我们可以存储键-值对:

{"was-great": 2}

指示灯

一种更简单的方法是根本不计算频率,只使用 1 或 0 来表示该特征是否出现在句子中。

{"was-great": 1, "was-terrible": 0}

结论

人们对自然语言处理中的预处理进行了广泛的研究,上面提到的方法只是皮毛。预处理的类型也根据 NLP 应用而不同,例如情感分析或文本摘要。

NLP 是一个令人兴奋的蓬勃发展的领域,这是一次内部工作的旅行。

亚历山大·奈特Unsplash 上拍照

感谢阅读。下次见。

为什么 2021 年需要人工智能伦理方面的公民能力

原文:https://towardsdatascience.com/why-civic-competence-in-ai-ethics-is-needed-in-2021-697ca4bed688?source=collection_archive---------35-----------------------

变更数据

Jukan TateisiUnsplash 上的照片

“因此,不仅参与这一技术未来对你来说很重要,而且要考虑另一种未来,在这种未来中,你的想象力可以塑造我们正在构建的技术。”

蒂姆尼特·格布鲁博士

文丘里管

从许多不同的角度来看,2020 年无疑是书籍的一年。我们不需要提醒所有出错的事情。感觉人工智能伦理领域本身就是周围发生的一切的缩影。接近年底的时候,我觉得 Gebru 博士在谷歌工作期间所经历的不公正和麻烦确实为我们蒙特利尔人工智能伦理研究所的使命增添了更多的燃料,我们呼吁建立人工智能伦理方面的公民能力。这在上面引用的 Gebru 博士的话中得到了恰当的体现,我希望我们把这句话作为我们进入 2021 年的战斗口号。

添加替代文本

照片由 马特·博茨福德

什么是公民能力?

公民能力是指日常生活和各行各业的人能够有意义地参与某一特定主题的讨论的能力。在这里,有意义的参与是指带着解决方案的心态,对问题有基本的了解,以前尝试过什么,以及我们可以采取什么实际行动来以富有成效的方式推进讨论。

至少,这是我对它的工作定义,也是我通过在蒙特利尔人工智能伦理研究所(T21)的工作努力帮助社区发展的东西。

在 AI 伦理学领域意味着什么?

人工智能伦理领域,无论你是一个完美的内部人士还是一个关心的公民,都充斥着许多不同的讨论,涉及隐私、偏见、公平、问责、透明度、治理、责任等主题,以及更多不同的想法,其中一些想法彼此有重叠,另一些则没有。

这里需要考虑的一件重要事情是,无论你是否选择直接接触人工智能,所有人都会感受到它的影响。因此,如果我们想要塑造该领域的技术和政策措施,以使我们走向一个技术创造积极变化的世界,我们需要以一种细致入微的方式参与其中,而不是对任何领域应用一刀切的方法。这种一刀切的做法将导致该领域的措施要么扼杀创新,要么使该领域过于不受监管和监督,从而继续对人们造成伤害。

添加替代文本

我们为什么需要它?

我认为人工智能伦理中的公民能力很重要,主要有三个原因:

  1. 平衡角色
  2. 更有意义的多元化之路
  3. 从人工智能系统中捕捉社会危害的持续基础

1.平衡角色

有许多来自政府、学术界、工业界和民间社会的人工智能伦理倡议。它们中的每一个都有特定的议程,这些议程决定了用于管理技术及其部署的技术和政策措施。

但是,由于它们的组成、资金来源、调查方法等原因,它们经常遗漏某个方面。拥有基础广泛的公民能力可以帮助更多的人以批判的眼光看待问题,并以某种方式发现盲点,而当我们有几个(通常)背景相似的人时,这是不可能的。

2.更有意义的多元化之路

我们来自不同的生活领域,有着不同的生活经历、文化、语言、能力、心态,以及我们所有人都是独一无二的,创造一个能够捕捉所有这些丰富性的单一工具是一个失败的秘诀。

我们不经常考虑这个问题,但是当你有很多人众包时,通常会有这样的印象,我们会得到很多低质量的建议,可能是因为不熟悉领域,钓鱼行为等。但是,这也导致了一些宝石,否则将去探索和阐明。我们已经在蒙特利尔人工智能伦理研究所举办的研讨会上亲眼目睹了这种情况,在那里,“专家小组”本应在讨论中提出(但没有)绝对精彩的建议。

多元化有许多方面(有许多学者在这方面受过更好的教育,他们清楚地阐述了多元化的维度),这是单个个人甚至一群人无法预见的。为此利用群众肯定是一种可以帮助我们尽可能彻底的方法。

3.从人工智能系统中捕捉社会危害的持续基础

最后,实时监控人工智能系统的危害并不是一件容易的事情。当然,当我们有许多不同的方式可以在现场部署像人工智能这样的多用途技术时,无论是良性还是恶意行为者,情况都是如此。

增强人们的能力,让他们能够更批判性地思考常见的伤害模式,可以帮助他们成为众包监管者,可以发现可能出错的地方,与记者分享(例如),并吸引研究和开发人员的注意,以便我们可以开始解决问题。

添加替代文本

我能帮什么忙?

有许多方法可以实现这一点,下面的列表只是思考其中一些问题的起点:

  1. 支持基层组织
  2. 逐渐熟悉其中的细微差别
  3. 即使你觉得辩论没有进展,也每天出现

1.支持基层组织

有很多方法可以帮助你在这个领域建立公民能力。一个简单的方法是支持你当地的组织做这种工作。这包括正式和非正式的努力,无论是通过对门票销售的捐款,还是通过认捐款项来支持他们的使命的更正式的承诺。经常有人问我,少量的钱是否会有所作为,对于那些由志愿者或自筹资金的组织来说,你可以放心,每一美元都会有所作为。

你不需要总是把财政支持视为唯一的途径;奉献时间和其他实物支持也是帮助当地努力的好方法。

2.变得熟悉细微差别

当谈到建设公民能力时,我们需要考虑的一个关键问题是保持必要的细微差别,以有意义地推进对话。这意味着要认真关注问题,不要妄下结论,花时间谨慎行事,以获得必要的跨学科视角,帮助我们做出明智的决策,并为生态系统所需的正确变化而努力。

这来自于相互接触和从更广泛的人群中学习,而不仅仅是一个人通常所习惯的。这可能很麻烦,但这种投资的长期回报是值得的。

3.即使你觉得辩论没有进展,也每天出现

这可能是最难的要求,但最终也是最有影响的:即使短期结果令人失望,进展缓慢,没有多少人支持你的使命,我们也需要继续推动公民能力的建设。

在蒙特利尔人工智能伦理研究所的工作中,我亲自面对了这个问题。在疫情会议之前,我们的活动和研讨会在很大程度上仅限于与蒙特利尔的一系列社区合作伙伴共同举办的现场活动。从那时起,我们已经成为一个数字优先的研究所,汇集了来自不同学科和机构的研究人员,并欢迎来自世界各地的参与者和合作者

我鼓励每个人在 2021 年人工智能伦理学的所有工作中保持这一理念,为今年和未来几年的成功奠定基础。

想了解更多我的作品,可以访问:https://ATG-abhishek . github . io

为什么不断查看指标会让公司走向失败

原文:https://towardsdatascience.com/why-constantly-looking-at-metrics-sets-companies-up-for-failure-a7a2d91ee7fd?source=collection_archive---------17-----------------------

仅仅因为某些东西是可以衡量的,并不意味着它有助于实现你的目标。

照片由 Unsplash 上的 Praveesh Palakeel 拍摄

你正在路上开车,这时一个警察在你后面停下来,没有闪灯,只是拐上了高速公路,而你恰好在前面。你没有超速,没有喝醉,没有打电话,也没有其他任何令人担心的事情。只是从一个地方到另一个地方,但你还是会瞥一眼速度计,以防万一。此时此刻,你不关心你的发动机温度,你有多少汽油,或者你的机油压力低。你只是在检查与你当时的情况相关的主要指标,以确保你没有给这位官员一个借口来完成他这个月的配额。

这个逻辑同样适用于商业。

我经常看到高管和经理试图将他们所知道的每一个指标都塞进一个仪表板中,试图确保他们对自己的业务“了如指掌”。我很欣赏你的意图,但这将不可避免地让你的生意偏离正轨。让我们回到前排座位,假设我们现在采取的立场与我们热切的执行官相同。你注意到了警察,但同时你开始检查你的油箱还剩多少英里,轮胎压力看起来好吗,后座的孩子们在说什么,哦,那些肯定是我身后明亮的闪光灯...

恭喜你,你设法在最糟糕的时候超速了一会儿,并得到了法庭授权的机会,向你所在的乡镇捐献 125 美元。或者在商界,你现在已经错过了你的季度目标,因为你的注意力分散在小事上,你没有对真正重要的事情给予足够的关注。

设置通知阈值

试图一直关注每一件事意味着你不能把注意力集中在重要的事情上。这并不是说不应该进行监控,只是你不应该一直盯着它。因为我不知道你是做什么生意的,所以在这个例子中,当我们把注意力集中在引擎温度上的时候,你要迁就我。如果你的车开始过热,你会得到通知,当然,你会停下来补救。没有人会反驳你的发动机融化不是最理想的情况,但你没必要每次出行都把眼睛粘在温度计上。一旦正常的门槛被突破,那么你就可以把注意力集中在它上面。在那之前,没什么好担心的,你明明还在前进。

请记住,通知不会在发动机熔化后出现,一旦有东西不再正常范围内,您就会收到通知。离开这个门槛后,你的注意力就被吸引到这个问题上,以免它变成一个真正的问题。这也正是您应该如何处理您的业务指标。不管你的指标是大幅波动还是周环比稳定;它会经历一些“正常”的版本,因此相应地设置触发器。确定一个合适的阈值通常既是科学也是艺术,所以你可以问一些问题来帮助你设定一个合适的水平:

  • 指标需要达到什么值才能引起警报?
  • 是否有一些上限或下限是不可接受的?
  • 一旦指标超过某一水平,它会开始影响其他指标或过程吗?
  • 简单地打破当前目标是一个足够好的通知吗?
  • 趋势比实际值更重要吗?

如果你对以上至少一个问题没有答案,那么你真的应该问问你为什么要看这个指标。然而,如果你处于别无选择的情况下,那么我至少会建议你采用某种控制限制。如果你想要更多的提示,你可以下降到 2.5 或 2 个标准差,但这都取决于指标的波动性。还要记住,趋势或斜率可能与实际表现一样重要,甚至更重要。因此,通知可以根据反复的下跌或上涨趋势来设置,而不是达到某一水平…或者两者都有。

一周又一周地审查绿色记分卡没有任何价值,因为这是在浪费会议时间。

无论如何,我们不可避免地会扫描任何红色的东西或丢失的目标,所以当事情得到控制时,为什么要浪费时间呢?这并不是说你应该改变目标。你能做的最糟糕的事情就是仅仅因为事情似乎在控制之中就改变目标。你完全可以探索在下一个级别操作的机会,但是这要从回顾你的过程能力开始,而不是要求任意的%改进。例如,期望发动机在比正常温度低的温度下运行是荒谬的——它应该变暖。不要忽视一些指标在一个范围内运行得最好,不应该不断地被进一步推动。

自动通知

您已经在查看记分卡,因此有能力定期获取这些数据。很可能已经有一些红/绿格式的目标了。从那时起,检查指标 A 是高于还是低于设置的阈值是一个简单的工作。没有理由不在您的仪表板中自动显示警报。重点是将会议中手动扫描记分卡的工作转移到让计算机扫描记分卡上。

不再审查不太重要的指标所节省的时间可能看起来微不足道,但想想所有因误解无关紧要的指标而发生的兔子洞讨论和衍生会议。对于一些领导者来说,不给出一些指导就离开运营回顾可能很难,所以很容易要求“双击”那个“关闭”的指标。见鬼,领导者很有可能忘记了它是如何计算出来的。你已经对汽车的温度计有足够的信心,可以安全地把你从一个地方带到另一个地方。信任这些新的阈值将是一项更容易、风险更小的任务。

高管和经理可能不会评审相同的指标

KPI 层次结构-按作者排序的图像

战略度量与运营度量相同是不常见的,这不是什么新鲜事,但人们往往会忘记。你可能不关心汽车的详细诊断结果,但你的机械师会关心。就像经理们可能不需要关注公司的营业利润率,但高管们需要。也就是说,经理们仍然会被问到为什么会出现某些趋势,所以确实需要在战略指标和运营指标之间进行一些转换。

例如,如果高管需要维持特定的服务水平,那么经理可以考虑员工的生产力。不难看出,同一周生产率的下降很可能是服务水平下降的原因。这种简单的分离允许管理者使用他们直接控制的和特别相关的度量。然而,强迫经理解释他们无法控制或理解的指标会导致审查期间出现虚假的答案,这些答案可能与问题无关或基于轶事信息。

允许自治

让我们回到车上,这次是和一名乘客。一条短信进来,你有一个选择 A)拿起电话读它 B)请乘客读它。在负责任的成年人的世界里,每个人都选择选项 b。明知故犯地选择选项 A 会让你处于暂时的风险之中,不管你认为自己能多好地保持对道路的关注。乘客完全有能力阅读文本,并让你知道它是否需要你的注意。是关于你的汽车延长保修期的垃圾短信,还是一个朋友的父母刚刚去世?无论哪种方式,乘客都会通知你,如果需要采取行动,不管最初是谁读了它,它都会发生。

这确实需要信任他人去做他们应该做的事情,但是如果你不能信任他们去做,那么你可能会遇到比管理度量更大的问题。

对于任何不能自动化或复杂到需要人工审查的事情,引入项目经理或 SME 没有坏处。给予项目经理或 SME 监控与其领域相关的运营指标的自主权,将使领导者的注意力集中在关键的业务计划上。这些中小企业将对趋势有适当的背景,并更适合于知道什么时候真的是一个问题,并在需要时提出来。在业务回顾期间保持讨论,避免对无关紧要的 KPI 趋势进行不必要的猜测。

随着关注点的转移,改变或重新评估指标

随着时间的推移,每个业务都会改变方向,因此仪表板也应该相应地改变。例如,当行驶在一条土路上时,速度表不再重要,取而代之的是,你的注意力集中在避开路上的岩石或坑洼。不要仅仅因为遗留指标在记分卡上一直有一席之地就抓住它们不放。如果他们不直接支持你前进的方向,那么就把它放回自动化上,把它交给 SME 来监控,或者完全摆脱它。别浪费时间了!

你回顾的指标应该与你努力实现的行动过程或最终目标直接相关,否则只会分散注意力。那些把注意力从目标上移开的行为最终会刺激不必要的工作,这些工作会导致大量毫无结果的行动。我们已经天生理解我们个人生活中的这个过程,我提到的没有一个是新的概念。因此,在商业世界中应用同样的原则应该是自然而然的,会产生显著的效率和结果。

为什么持续剖析可以改进您的 Python 应用程序

原文:https://towardsdatascience.com/why-continuous-profiling-can-improve-your-python-application-1c4ec2b238f7?source=collection_archive---------16-----------------------

照片由Fotis FotopoulosUnsplash

剖析 python 程序是进行动态分析,测量程序执行时间——代码执行每个程序的功能需要多少时间。由于函数和调用需要太多的资源,所以有必要对它们进行优化。而代码优化不可避免地会导致成本优化,因为它使用的 CPU 资源更少,这意味着为云基础设施支付的费用更少。

开发人员经常使用各种方法进行局部优化。例如,它们决定哪个函数执行代码更快。但是,如果我们试图在没有调查的情况下盲目调整程序,可能会导致问题并导致程序执行速度变慢。

剖析是如何完成的?

有必要决定您是需要使用宏观还是微观层次的剖析方法。在宏分析中,我们分析整个程序,并在程序执行时产生统计数据。在微分析中,像函数调用或计算一样,只对程序的特定组件进行分析。

根据您是想进行宏观还是微观分析,Python 中有几个模块和内置函数可用。对于微观分析,我们可以使用 line_profiler,对于宏观分析,我们可以使用 cProfile 或一个时间包,通过它我们可以确定一个程序执行的总时间。

有时,当我们使用时间包时,由于网络延迟或 CPU 繁忙导致的延迟,得出的时间可能是错误的。因此, timeit 函数多次执行代码,然后显示运行所用的平均时间。

连续分析和执行时间

最需要考虑的是程序执行的时间。程序运行的时间越长,使用该程序的应用程序就越慢。此外,当它被实现时,它占用了太多的 CPU 资源。在云上运行应用程序所用的资源越多,你需要支付的费用就越多。

让我们看看执行时间增加的几个常见原因。

减少内存泄漏和使用

读写数据的过程称为内存管理。默认情况下,它是用 Python 实现的。

但是,在某些情况下可能会发生内存泄漏。

  1. 当剩余的大物体没有被释放时。
  2. 当代码中有参考循环时。

让我们假设已经创建了一个服务器来进行缓存,但是缓存的大小还没有定义。这意味着大量的请求会将缓存大小扩大到内存泄漏的程度。

Python 管理自己的堆,独立于系统堆。内存是在 Python 解释器中分配的——我们根据需要创建的对象类型使用不同的方法。池和竞技场保存在 Python 堆中,因为 Python 处理自己的块。任何类型的内存块的释放仅仅是将它标记为可供将来在解释器中使用。

为了定位内存泄漏,我们利用了内存分析器,它逐行显示代码的内存使用情况。因此,我们可以找出哪些表达式消耗了大量的内存。接下来,我们可以优化这些语句,使它们使用更少的 RAM。

正确利用 CPU 资源

优化 CPU 资源的使用非常重要。如果你使用的是云服务,那就更有意义了,因为你使用的资源越多,你支付的费用就越多。现在,如果我们没有一个程序的统计数据,我们就不能盲目地开始优化过程。

在这种情况下,最好的办法是使用 cProfile ,它显示程序的完整统计数据并列出正在使用的函数——它给出了需要优化的函数或语句的概述。适当的代码优化将消耗更少的 CPU 资源,从而为公司节省成本或优化。

由于这些原因以及更多的原因,开发人员在生产阶段使用连续剖析来评估系统或软件,以查看什么是缓慢的或者利用了大量的资源。例如,连续分析有助于识别程序中可能需要大量 ram 或时间来执行的任何指令或功能。

进行连续分析

内置 Python 模块的问题是,当代码在生产服务器上执行时,无法监控代码的统计数据。即使您设法启用了生产分析,它也会消耗大量的 CPU 资源,这对公司来说成本太高了。

因为连续的剖析是必要的,你可以使用 gProfiler ,它是一个即插即用的模块。只需下载客户端并安装在您的服务器上。它将在后台运行,不会占用太多的资源,并密切关注一切。它还提供了无缝的产品剖析和大量 Python 剖析器无法提供的统计数据。它消耗更少的 CPU 资源,从而为团队节省成本。你也可以把它作为守护进程安装在 Docker 上,或者通过命令行安装。

让我们来看看如何设置和使用它。不费吹灰之力。

首先,您需要创建一个帐户,因为它需要一个 API 密匙来监控您的服务。接下来,您只需用wget下载并安装它。

创建帐户后,在终端上运行以下命令:

*wget https://github.com/Granulate/gprofiler/releases/latest/download/gprofilersudo chmod +x gprofilersudo ./gprofiler -cu — token “<API_token>” — service-name “Service name”*

一旦安装完成,它将开始在后台运行,您将能够在仪表板中查看代码的统计信息:

图片由颗粒有限公司提供

当我们使用 Python 模块进行概要分析时,它只向我们显示关于程序的统计数据。另一方面,gProfiler 提供了大量的数据,比如在内核级执行的进程、CPU 使用的资源等等。这样,开发人员就完全知道消耗了多少资源,哪些功能需要优化。

结论

连续分析对于确保正确使用资源至关重要。概要分析允许我们识别代码中一些最基本的瓶颈。解决这些问题可以显著优化代码,并最终降低公司的成本。

为什么数据分析师应该申请数据科学家的工作

原文:https://towardsdatascience.com/why-data-analysts-should-apply-to-data-scientist-jobs-4bd695e7d747?source=collection_archive---------21-----------------------

不要被职称误导

照片由picjumbo.com派克斯拍摄

如果你想找一份数据分析师的工作,你可能只需要搜索有数据分析师头衔的工作。你可能没有意识到的是,许多数据科学家的工作实际上是伪装的数据分析师工作。数据科学家的头衔吸引了更多的申请者,但实际上工作职责是数据分析师。作为一名数据科学家和数据分析师,我想澄清数据科学家和数据分析师之间的区别,并讨论为什么数据分析师应该申请数据科学家头衔的工作。

趋势与预测

数据分析师使用汇总级别的数据来发现趋势并提供建议以提高业务绩效。数据科学家将使用机器学习模型中的数据来预测通常在客户级别发生的事件。数据分析师通过回顾过去来寻找趋势,而数据科学家则利用过去来预测未来。

例如,一家电子商务公司将开展电子邮件活动,提供折扣,激励客户进行购买。数据分析师将使用打开率、点击率和总销售额等指标报告电子邮件活动的整体表现。该公司可能希望使用过去的行为(例如先前的购买和网站上的活动)为每个客户提供个性化的报价,以增加购买的可能性。在这种情况下,数据科学家将建立一个机器学习模型来预测发送给客户的最佳报价。

工作职责

谷歌上搜索数据科学家和数据分析师之间的区别,返回的第一条结果是这篇文章指出商业头脑和数据叙事是数据科学家而非数据分析师所需的技能。对于初级分析师来说,这可能是真的,但希望晋升为高级分析师的分析师也需要商业头脑和用数据讲述故事的能力。这些技能是数据分析师和数据科学家在职业生涯中进一步发展所必需的。

Glassdoor 的数据科学家工作描述A/B 测试列为一项职责,但我被要求以数据分析师的身份评估 A/B 测试。在同时拥有数据分析师和数据科学家的公司中,数据科学家将建立机器学习模型,而数据分析师则负责所有其他数据分析职责,包括 A/B 测试评估。

如何辨别

拥有数据科学家头衔的数据分析师工作将不会提到建立机器学习模型。

如果工作描述包含数据分析师的职责,包括 A/B 测试,但没有建模要求,那么它是一个混合的数据分析师和数据科学家角色,可能有一个数据科学家数据分析师的职称。

示例 1 —数据科学家头衔,但不需要建模

这个脸书数据科学家角色具有典型的数据分析师职责,例如“ 定量分析、数据挖掘和数据呈现 ”以及“ 通知、影响和支持产品决策 ”,但没有提到构建模型。"产品领导"是这个角色支持的四个领域之一,也是" 实验结果 "预期的地方。

示例 2 —数据科学家头衔,但主要是数据分析师,从事一些建模工作

这个数据科学家职位提到“ 构建数据科学模型”作为职责之一,只要求“ 一些构建数据科学模型 ”的经验。对于有建模经验并希望转型到数据科学的中级数据分析师来说,这是一份很好的工作。由于这是一个数据科学家的头衔,但工作职责不限于建立模型,这将利用你作为数据分析师发展的技能,并允许你在工作中发展建模技能。如果你把自己局限于数据分析师的职位,这可能不会出现在你的搜索中。

示例 3 —需要机器学习经验的数据科学家头衔

这个数据科学家角色正在寻找一个真正的数据科学家来建立机器学习模型。提到的第一个责任是“ 了解产品、风险和业务需求,以及如何应用 ML 来解决我们最具挑战性的问题 s ”,并需要“ 对各种机器学习技术 的深刻理解和体验”。这与前两个工作示例不同,前两个示例中的职责和要求是数据分析师的典型职责和要求。

结论

如果你是一名数据分析师,你可能会认为你应该只搜索数据分析师的工作,因为你不具备数据科学技能。然而,职称并不能反映实际的职责。如果你已经掌握了所有的数据分析师技能,但没有建立机器学习模型,那么就去寻找不需要建立模型的数据科学家工作。如果你是一名致力于培养数据科学技能的数据分析师,考虑一个拥有数据科学家头衔但需要数据分析师技能和一些建模经验的交叉角色。这将有助于你获得数据科学家的头衔,并获得更多的建模经验,以便在未来过渡到真正的数据科学家职位。

* *

为什么数据漂移检测如此重要,如何通过 5 个简单的步骤实现自动化

原文:https://towardsdatascience.com/why-data-drift-detection-is-important-and-how-do-you-automate-it-in-5-simple-steps-96d611095d93?source=collection_archive---------1-----------------------

卢克·切瑟在 Unsplash 上的照片

开发任何机器学习模型的基本假设是,用于训练模型的数据模拟真实世界的数据。但是在模型被部署到生产中之后,如何断言这个假设呢?本文详细介绍了这个问题,并展示了如何使用 Azure ML 处理它。

当您在监督学习的情况下训练模型时,训练数据通常是有标签的,当您在生产中部署模型时,没有实际的标签,无论您的模型有多精确,只有当提交给生产中模型的数据模拟(或统计等效)时,预测才是正确的?)训练中使用的数据。如果没有呢?我们称之为数据漂移

数据漂移的定义是,在将模型部署到生产中之前,生产数据与用于测试和验证模型的数据之间的差异。导致数据漂移的因素有很多,其中一个关键因素是时间维度。如果您观察下图,该图显示了机器学习模型开发的高级阶段,那么很明显,在收集数据的时间和使用模型预测真实数据的时间之间存在明显的差距。根据问题的复杂程度,这一差距可能从几周到几个月到几年不等。其他几个因素也可能导致漂移,如数据收集中的错误、季节性,例如,如果数据是在 covid 之前收集的,而模型是在 covid 之后部署的。

机器学习模型开发阶段(图片由作者提供)

如果你不认同漂移怎么办?

当数据漂移时,如果没有及时发现,预测就会出错,基于预测做出的业务决策可能会产生负面影响。向网飞用户推荐一部错误的电影比推荐一只错误的股票危害更小,在某些情况下,影响是延迟的。

根据漂移的性质、程度和类型,处理漂移所需的工作可能会有所不同。在少数情况下,可以通过根据新数据重新训练模型来管理数据漂移,但有时我们可能不得不重新开始,从头开始。

不仅仅是数据,甚至模型也会漂移,当模型的预测不再有用时,例如预测学生将选择。用于 covid 之前的在线课程,并在 covid 期间使用。处理概念漂移的一种方法是 在线学习 ,其中模型在每次观察时被重新训练。

建立一个可重复的流程来识别数据漂移、定义漂移百分比的阈值、配置主动警报以便采取适当的措施非常重要。有各种类型的漂移,如特征漂移、概念漂移、预测漂移等。但是它们都起源于从数据中检测到漂移的点,或者如果预测是不正确的(不正确的预测只有在存在找到正确标签的手动方法的情况下才能被识别,有时这也存在延迟)。在下面的博客中,已经有一些很好的尝试来定义不同类型的漂移,所以我不打算再次定义它们,请参考下面的博客。

https://towards data science . com/how-to-detect-model-drift-in-mlops-monitoring-7a 039 c 22 ea F9

https://medium.com/data-from-the-trenches/a-primer-on-data-drift-18789ef252a6

我们如何跟踪数据漂移?

可以使用顺序分析方法、基于模型的方法和基于时间分布的方法来识别数据漂移。像 DDM(漂移检测方法)/EDDM(早期 DDM)这样的顺序分析方法依靠误差率来识别漂移检测,基于模型的方法使用自定义模型来识别漂移,基于时间分布的方法使用统计距离计算方法来计算概率分布之间的漂移。计算任何两个群体之间差异的一些流行的统计方法是群体稳定性指数库尔贝克-莱伯或 KL 散度詹森-香农或 JS 散度科尔莫戈罗夫-斯米尔诺夫检验或 KS 检验瓦瑟斯坦度量或运土机距离。对这些的详细解释超出了本文的范围,如果你有兴趣知道,可以从这里开始。

如何在 Azure ML 中配置漂移检测?

微软提供了一种自动识别数据漂移的方法,该方法被集成到 Azure ML workspace 中,该功能目前正在公开预览中。Azure ML 使用统计方法来确定漂移,不同的时间窗口用于计算选定功能的漂移。包含数据漂移监视器的典型 ML Ops 工作流如下所示。接下来的部分解释了这个过程中涉及的每个步骤。

带有数据漂移检测和警报的 Azure ML 工作流。(图片由作者提供)

在 Azure ML 中实现数据漂移

识别数据漂移的步骤包括

  1. 注册基线数据集:基线数据集是用于模型训练的数据集。Azure ML 语言中的数据集是指向数据的指针,这些数据可以位于任何受支持的存储服务中,如 Azure Storage、Data Lake 等。目前,我们只能用时间序列表格数据集来识别数据漂移。

用于注册数据集的 python 代码。(图片由作者提供)

2.创建数据漂移检测器:可以通过传递基线和目标数据集以及计算要使用的目标和检查频率来创建漂移检测器对象。您在此选择的时间范围取决于您想要比较的时间窗口,找到一个正确的范围来识别逐渐漂移是很重要的。

用于创建数据漂移检测器的 python 代码(图片由作者提供)

3.特性选择:在按需运行漂移检测之前,我们需要提供一个要监控的关键特性的列表,这可能是数据集的所有属性或子集。其次,我们需要为我们想要监视的日子回填监视器,这应该以最大 30 天为单位来完成。

用于选择检测漂移的要素的 python 代码(图片由作者提供)

4.运行:然后,您可以按计划或按需运行漂移检测。下面的代码显示了从 2010 年 10 月 1 日起漂移检测的按需调用。启动该过程并等待完成。

按需运行漂移检测的 python 代码。(图片由作者提供)

输出可以从笔记本或 Azure ML Studio 的数据集- >数据集监视器窗格中可视化,下面的截图来自 Azure ML Studio,因为我觉得它们更直观。可用的统计距离度量是瓦瑟斯坦距离(数字特征)和欧几里德距离(分类特征)。您可能会注意到,漂移高于阈值,顶部显示了每个顶级特性的百分比漂移。

Azure ML Workspace 的漂移检测输出(图片由作者提供)

基于特征的漂移检测(图片由作者提供)

除了上面的报告,我们还可以得到特征漂移的大小和分布。如果你想尝试,完整的源代码可以从这里下载。

可交代的 AI。

从最近的调查中可以明显看出,企业在过去两年中优先考虑采用 ML,这在很大程度上可以归功于快速数字化和 Covid 带来的新业务方式。随着适应,同样重要的是,这些企业要了解 ML 模型的结果,而不只是把它看作一个“黑箱”。因此,我希望在未来看到更多的工具、框架和创新,这些都集中在“可解释的人工智能”上,这是一个用来使预测更加可解释的术语。在这种情况下,我认为用其他可用的替代方案来结束这篇博客是明智的,尽管可能有许多我将在这里特别谈论的方案。

  • 显然 : EvidentlyAI 是另一个开源工具,它有助于评估和监控生产中的模型。如果您没有使用 Azure ML,并且正在寻找一个简单易用的非商业工具,evidentlyai 是一个不错的起点。
  • Fiddler AI 监控 : fiddler.ai 有一套工具,可以帮助使 AI 变得可解释,帮助在生产中操作 ML 模型,监控 ML 模型和 yes 数据&模型漂移检测就是其中之一。
  • 如果你想实现你的自定义方法,你可以使用像 river.drift 的 PageHinkley 和 skmultiflow.drift_detection 的 ADWIN 这样的库。

总之,漂移检测是 ML 生命周期中的一个关键步骤,因此它不应该是事后的想法,它应该是您在生产中部署模型的计划的一部分,它应该是自动化的,必须仔细考虑确定漂移方法、要应用的阈值以及检测到漂移时要采取的行动

为什么数据完整性是 ML 监控的关键

原文:https://towardsdatascience.com/why-data-integrity-is-key-to-ml-monitoring-3843edd75cf5?source=collection_archive---------21-----------------------

米卡·鲍梅斯特的 Unsplash

机器学习(ML)应用建立在数据基础上:大量数据流入 ML 系统,以便根据历史实例训练模型,并实时做出高质量的预测。然而,许多机器学习项目降级或失败,很大程度上是因为数据完整性难以维护。

为什么数据会中断

维护数据完整性是一个难题。最大似然数据的动态特性是模型衰减的一个常见原因。ML 系统越来越多地被复杂的特征管道和涉及数据变更的自动化工作流所驱动。数据通常要经过多次转换,才能形成适合模型使用的形式。这些转换需要一致地应用于 ML 管道中的所有同类数据。此外,模型通常使用来自不同团队管理的多个管道的数据,并公开非常不同的接口。例如,ML 模型经常需要结合来自历史批次源和实时流的数据。由于有如此多的活动部分,包括数据和模型版本,生产中的 ML 模型经常会看到数据不一致和错误。

ML 系统将为这些畸形输入提供预测,而没有意识到它们有数据问题。如果没有额外的监控,这些错误往往不会被发现,并且随着时间的推移会侵蚀模型的性能。更糟糕的是,由于机器学习应用程序通常被视为黑盒,如果即时影响较低,这些错误可能在检测后无法解决。与其他类型的软件不同,ML 应用程序缺乏一个全面的解决方案,将正确的流程和监控放在适当的位置。

(图片由作者提供)

什么是 ML 数据完整性

虽然数据完整性可能有不同的定义,这取决于您的谈话对象,但最普遍接受的说法是数据在其整个生命周期中是一致的,没有不准确之处。

无论是在训练中还是在生产中,坏数据都会对 ML 模型的性能产生重大影响。数据工程师在特征工程方面投入大量时间,以确保训练集具有良好的数据质量,从而尽可能训练出最具代表性的模型。在要素工程过程中,数据工程师使用一组一致的规则将坏数据替换为好数据:删除具有缺失值的行、允许缺失值、将缺失分类值设为唯一值、输入缺失值、用统计表示法(例如平均值)替换缺失值或默认为某个值。

然而,并不是所有的 ML 团队都以相同的努力程度来处理部署的模型,即使他们遇到了相同的挑战。一旦 ML 模型被训练,它对坏数据漠不关心,并且将继续做出预测,在这种情况下,不管数据质量如何,都是坏的预测。

生产中的 ML 模型面临三种类型的数据完整性问题

  • 缺少值,其中特征输入在推理时为空或不可用。
  • 范围违规特征输入超出预期范围或者是已知错误。
  • 类型不匹配,不同数据类型的输入被传入。

(图片由作者提供)

有几种方法可以处理不良生产数据,但许多方法会产生自己的问题

  1. 丢弃推理请求 —如果数据是坏的,服务系统可以跳过预测以避免出错或做出不准确的预测。虽然当模型做出大量非关键决策(例如产品推荐)时,这可能是一个解决方案,但当它做出业务或生命关键决策(例如医疗保健)时,这不是一个选项。在这些情况下,需要有一个备用决策系统来确保结果。然而,这些备份系统会使解决方案更加复杂。
  2. 估算或预测缺失值-当某个值缺失时,可以使用简单的统计度量(如要素平均值)或基于其他模型输入的更复杂的预测值来替换该值。这种方法的一个关键挑战是它隐藏了数据问题背后的问题。持续替换坏数据会改变预期特征的分布(也称为数据漂移),导致模型降级。这种数据替换导致的漂移可能很难捕捉,随着时间的推移会慢慢影响模型的性能。
  3. 设置默认值 —当值超出范围时,可以用已知的高或低或唯一值替换,例如用最接近的已知最小值或最大值替换非常高或非常低的年龄。这也会随着时间的推移导致逐渐漂移,从而影响性能。
  4. 获取缺失数据 —在一些关键的高价值用例中,如贷款,ML 团队也可以选择获取缺失数据来填补空白。这对于绝大多数用例来说并不典型。
  5. 什么都不做 —这是最简单的,也可能是最好的方法,这取决于您的用例的关键程度。它允许坏数据出现在上游或下游,以便解决背后的问题。根据用于训练模型的 ML 算法,大多数推理引擎可能会抛出错误。对不良数据所做的预测可能会显示为输出或受影响输入的异常值,从而有助于发现问题。

考虑到可能出现的所有数据挑战,您需要一个早期预警系统,以便您可以立即发现并解决这些问题。

(图片由作者提供)

数据完整性问题的示例

  • 缺失值 在 ML 模型推断时会有规律地出现。即使要素中允许缺失值,模型也可以看到比训练集中更多的缺失值。缺失值错误的一个例子是基于表单输入进行推理的 ML 模型,其中由于代码错误,以前可选的字段现在总是发送空值输入。
  • 范围违规 发生在模型输入超出其值的预期范围时。分类输入的拼写错误和基数不匹配导致这个问题是很常见的,例如,类别和数字字段(如年龄等)的自由形式输入。未知的产品 SKU、不正确的国家和管道状态导致的分类值不一致都是范围违规的例子。
  • 类型不匹配 出现在模型输入类型与推理时提供的类型不同时。类型不匹配的一个原因是在一些数据冲突操作中列顺序不匹配。

如何捕捉数据完整性问题

设置数据检查很麻烦:虽然数据检查可能存在于 ML 管道和调用代码中,但是一种彻底的方法包括对模型推断进行检查,以便在运行时捕捉任何问题。但是随着功能的增加,添加这些缺失值、类型不匹配或范围检查可能会很繁琐。生成这些检查的快速方法是使用来自训练集的代表性数据样本,并设置一个作业来定期根据这些规则评估数据,并在违规时发出快速警报。

如何评估和缓解数据完整性问题

当发现数据故障时(许多故障会在几周或更长时间内未被发现),团队通过了解哪些数据违规对模型性能影响最大来确定修复的优先级是很重要的。不解决问题可能会产生意想不到的后果,特别是考虑到 ML 模型的脆弱性。

那么,如何评估数据问题呢?

1。局部分析——对于关键用例,最佳实践是通过重放问题的推理并查看其对模型的影响,从细粒度的预测分析方法开始。对于这种分析,可解释的人工智能有助于了解数据违规的影响,因此可以快速找到问题的根源——特别是在越来越多的黑盒模型的背景下。但是,重新创建导致问题的所有因素可能非常耗时,尤其是在数据或模型发生变化的情况下。有问题的数据可能没有与输入查询一起存储,可能需要重新创建。如果模型版本不正确,也很难重现结果。

(图片由作者提供)

2。全局分析 -对于全局问题,故障诊断范围扩大到了解数据问题的严重性。这包括在更大的时间范围内分析该功能的数据,以了解问题可能是何时开始的。数据更改通常与产品发布相一致。因此,查询数据变更时间表可以将问题与特定的代码和数据发布联系起来,有助于快速恢复或解决问题。

数据问题在模型输入中表现为漂移,并且根据其影响,在输出中表现为相应的漂移。因此,漂移分析是确定数据完整性问题原因的有用方法。当数据因完整性问题而被估算时,这一点尤为重要-在这种情况下,输入数据的构成将发生变化,即使这可能不会触发完整性违规

(图片由作者提供)

这些步骤通常有助于查明和评估管道中的数据问题。考虑到故障排除过程的复杂性,ML 团队很难在没有良好的 MLOps 解决方案的情况下快速解决数据完整性问题。

总之,数据完整性是任何 ML 应用取得成功的一个重要因素,MLOps 监控可以帮助解决以下棘手问题:设置正确的检查、检测数据中的异常,以及确定影响最大的故障的优先级。

为什么数据科学未能兑现其承诺

原文:https://towardsdatascience.com/why-data-science-has-failed-to-deliver-on-its-promises-ec14c1ad0ed6?source=collection_archive---------41-----------------------

不知情的市场如何赌上数据科学来帮助打击技术支持的颠覆者的崛起。失败的原因,以及最终的回报。

图片由穆罕默德·哈桑拍摄,来自皮克斯拜

颠覆和数据科学的兴起

金融危机是创造性破坏和技术积累的加速器。在 2008 年金融危机后的几年里,大范围的科技颠覆改变了美国大型企业的既定秩序。科技公司无与伦比的低成本扩张能力让它们摆脱了老牌竞争对手的地位,并为新一代人定义了时代精神;想想优步、Airbnb、WhatsApp、Dropbox、Instagram 等等。

现有企业对颠覆者的恐惧是有道理的,因为——通常,尽管肯定不总是——它们的规模大、成熟的商业模式、低风险偏好以及对最赚钱的客户群的过度关注导致它们行动迟缓,不愿意也似乎没有能力投资于新的创新技术和流程。

这与市场进入者天生的灵活性形成了鲜明的对比,他们将创新运动应用于渴望产品满足其需求的利基市场。

截短单词的后缀 tech 标记了新打乱的领域的句法结构——fin tech、EdTech、RegTech、InsureTech 等。几乎在所有情况下,“技术”只是指更先进的信息处理技术,它创造了相对于受陈旧、高开销的流程和系统束缚的现有参与者的相对价值增长。

那么,为什么这些老牌企业一直在努力从头开始重建现有平台,以挫败市场抱负?因为这是一项长期、昂贵的工作,不能保证投资回报,更不用说更大的利润,而且在风险调整后的水平上,这通常被认为是一种浪费和高风险的努力。

从概念上来说,一种实现类似目标的更直接的方法是雇佣一个数据科学家团队,这种方法对于一个对经济前景持乐观态度的高管来说更容易接受。在过去十年的大部分时间里,这种方法都失败了。

错误的喜剧

以草率的方式从头开始构建数据科学功能不仅弄巧成拙,而且是一种通病。标准的说法是,在互补的战略、系统和角色方面存在错位投资,并且对典型的数据科学家在数据管道的每一点增加价值的能力抱有过高的期望。

在这方面,缺乏经验的数据科学家处境艰难。大学数据科学课程过度关注数据科学的理论方面:模型、算法、数学、统计。公司和招聘经理在实践方面过度满足了他们对数据科学家的期望:实现支持数据科学模型的系统。

但是像这样的初期问题需要时间来阐明,尤其是在行动缓慢的组织中。与此同时,数据科学像服用了类固醇的火箭一样飞速发展。

但是为什么它起飞了呢?原因是多方面的:不断向网络世界迁移带来了增强的数据采集技术;通过基于云的产品提供更经济的处理能力;机器学习算法在不断扩大的 Python 生态系统中作为开源包的实现;病毒式传播和 FOMO 的网络效应(这一点不是因果关系,而是永久存在)。

泡泡、秋千和旋转木马

先来个题外话,说说市场泡沫。

当对未来状况的乐观预期融入某个市场中某项资产的感知价值时,投机泡沫就会出现。对一项资产的膨胀的感知表现为其价值的真实上涨,至少暂时如此。

我们都知道这个故事。首先,它翻了一倍,然后翻了五倍,然后摇摇晃晃,跌跌撞撞,最后变成瓦砾,最后被归类为泡沫。

在随后的几年里,学者和有识之士将观察到一系列预测和发展泡沫的熟悉特征——熟悉是因为我们以前在类似的投机展示中见过它们。

但是投机本身并不一定是坏事,它是创新的一个自然组成部分,在适当的条件下,投机泡沫可以对长期的繁荣发展负责,这就是所谓的生产性泡沫。市场范围内的投机可以将资本集中到如此程度,以至于这样做的副作用提供了可以在未来长期存在的生产能力。

以互联网泡沫为例。虽然它负责清算价值数万亿美元的股票和垃圾债券,但一个被忽视的副作用是铺设了数百万英里的光纤电缆,这是现代数字经济的基础。

类似地,20 世纪 20 年代末的华尔街股票泡沫导致了飞机、公用事业、电话电报、电气设备和无线电等新兴行业的投机行为。广泛采用此类产品的资本要求要求对有形基础设施进行巨额投资,并对专业劳动力提出新的需求,而这正是私人市场投资者急切提供的。

在这两种情况下,投机加剧了巨大的痛苦,但也为更先进经济体的出现奠定了基础。

DSaaB —作为泡沫的数据科学

这是一个熟悉的故事:一项新的技术突破拉开了序幕,媒体的兴趣助长了炒作,即使没有实际的产品存在。过早的宣传产生了广受欢迎的成功故事,而大量的失败却无人注意,无人记录。

大约在 2012 年 AlexNet 发布的时候,数据科学成了时髦的新玩意,它的崛起,很像经济泡沫,是基于投机和 FOMO 高管的浪潮。

在随后的几年里,数据科学家的空缺职位激增,围绕训练营和课程的整个家庭手工业出现在网上和大学里,专门讨论这一主题的会议诞生了,在线演示震惊了世界,随着通过即插即用解决方案实现的机器学习平台的民主化,准入门槛降低了。

虽然一些公司在数据科学运营方面取得了成功,但遗憾的是,许多公司却没有。高管们认为,他们需要的只是一个由“独角兽”数据科学家组成的精英团队,能够提供端到端的数据管道。不出所料,这个梦想失败了,使用它的公司没有看到他们预期的数据科学带来的好处。

慢慢地,慢慢地,公司变得成熟起来,超越了绝望的、投机的默认立场,即雇佣一支优秀的数据科学家团队将释放更大的利润,积累财富。高管们开始意识到支持有效数据科学运营的基本要求是什么。他们以前曾被模型和统计的应许之地愿景以及这个和那个指标的巨大收益所伤害,现在应该更加久经沙场,对肤浅的数据战略持怀疑态度。

过去十年左右,数据科学资本和智力投资膨胀的一个重要副作用是,支持数据科学发展所必需的数据基础设施被组装在代码行、学术机构的教室和高管的头脑中。这在数据工程师相对于数据科学家的招聘激增中显而易见,尽管相对于需求,初级数据科学家进入就业市场供过于求。

颠覆性技术上的投机泡沫是建立在有朝一日它将成为市场主导者的赌博之上的。通常被忽视的是,一个领域的创新往往取决于支持行业的创新。对于电动汽车,这是电池。毫不奇怪,智能手机的兴起使得智能手机相机的质量有了显著的提高。

对于数据科学而言,合作创新是一系列项目的集合,构成了一个全面的数据战略。这必须包括:明确的数据所有权和个人责任;对现有数据模型和数据质量的持续审查;集中式数据治理流程;对数据架构的深入关注;通过论坛、工作组和讨论推动数据驱动的文化;自动数据管道测试;定义良好的 ML 模型部署流程,包括持续监控、维护和所有权。

一旦该策略被采纳并被奉为真理,只有这样,数据科学家才能年复一年地做出有用的工作。在那之前,请期待概念证明和脆弱的实现。

数据科学的泡沫一直令人沮丧地与其预期目标背道而驰,但在它的影响下,它帮助制定了一个新的数据文化和更好的数据战略。

那么这里的教训是什么呢?应该很清楚。任何寻求通过数据科学创造价值的组织的先决条件是提前抵消在模型开发和部署期间积累的技术债务。如果没有严密的信息处理管道和数据第一的文化,你不能跑出去雇佣一个数据科学团队。

未来会怎样?

如果我们能从炒作周期中学到什么,那就是数据科学领域所经历的是许多令人兴奋的新技术的自然组成部分。炒作最多的时候是最穷的,但后来就变得有用了。

数据科学将继续成熟,成为一个类似于软件工程的职业。随着支持该领域的进程继续发展,其作为狂野西部自由竞争的非生产性根源将被遗忘。

TL;博士:

  1. 数据科学在激动人心的演示后崩溃了。它向眼界开阔的高管们承诺了一条拓宽利润、创造效率和获取新利润的捷径。
  2. 随之而来的是巨大的投资流入,家庭手工业如雨后春笋般涌现,用于训练营、大学课程和会议。这个时髦的新头衔助长了年轻人才的过剩。
  3. 不幸的是,这个领域还很年轻,定义不清。随后的十年是商业数据科学风险投资中毫无成果的十年,原因是数字管道的严重不足,以及对生产层模型管道所需的各种角色的错误期望。
  4. 几年后,公司开始意识到,没有更广泛的数据战略,数据科学就无法运作。数据科学终于可以派上用场了。

感谢阅读。如有任何意见或问题,请联系我们。

为什么数据科学对所有开发人员都很重要

原文:https://towardsdatascience.com/why-data-science-is-important-for-all-developers-cfe31aa6fb2b?source=collection_archive---------24-----------------------

是的,那意味着你也是

照片由石页·康让Unsplash

在我的消遣中,我喜欢看视频,读文章,甚至只是查看关于技术世界所有新事物的新闻。无论是创新还是像 iPhone 一样的隐私更新,保持对正在发生的事情的了解总是很有趣的。当我考虑跟上数据科学时,不管它来自哪个研究领域,保持最新的改进都是很有趣的。有时候可能是机器学习,其他时候可能是 AI(人工智能),或者是我个人最喜欢的 AR(增强现实)。我对数据可视化特别感兴趣,尤其是通过 AR。

到目前为止还没有什么突破性的进展。但今天我想更多地谈谈数据科学是如何包罗万象的。这篇文章的灵感来自于我的头号粉丝,也就是我的女朋友,她看了我所有的文章,即使她对“数据科学”没有任何兴趣,她将其归类为大数据和机器学习。虽然两者都是数据科学的一部分,但今天我想谈谈数据科学对所有研究领域的重要性,特别是计算机科学/工程和相关领域的研究,从开发运营到分析师到开发人员,以及介于两者之间的所有人。即使是业务方面也可以从数据科学更新和创新中获得很大帮助,因为它在数据方面更具包容性。因此,不再拖延,让我们看看为什么我认为数据科学对每个人来说都很重要。

第一种分析数据科学:预测

当你想到机器学习时,你可能会想到预测分析。这是创建算法来识别模式的地方,因此可以基于这些观察做出决策。但是,如果你不完全支持机器学习,为什么数据科学中的预测分析仍然适用?无论是用机器还是用手,预测分析都是相关的。这是指更多的职业,而不仅仅是技术职业。例如,医生会查看家族史,这是可识别的模式,以确定你是否有患某些疾病的风险。或者一个小面包师可能会看到他们的销售统计数据,以确定初秋是拿出他们的南瓜香料食谱的最佳时间。

虽然你可以用自己的眼睛做出这些预测,但机器学习试图让这更快。例如,商业分析师可以找到人口中的一个样本,然后让机器学习来预测其余成员的答案,而不是调查人口中的一千人。这可以节省大量时间,因为需要几周时间才能完成的工作可以在几分钟内完成。时间可以节省金钱,取得突破可以更快地做出对经营相关业务至关重要的预测。

但即使在你的日常生活中,预测分析出现的次数也比你想象的要多。当您在电话上键入信息时,“自动更正”可能会纠正您的拼写错误,或者您的电话甚至会猜出您想写的下一个单词。甚至像 Grammarly 这样的扩展也可以用来预测你想写什么。所以,你看,现在你可以告诉年轻一代,在你那个时代,你没有任何花哨的单词纠正器或预测器。你必须自己纠正这些错误。这些更新很重要,就像 Grammarly 一样,因为大学里的每个人都可以使用该扩展来清除他们的语法错误,并使他们的措辞更加专业,而不必找导师或反复校对。

作为一名开发人员,也许这个预测可以帮助你。仅就文本而言,诸如 Intellisense 之类的扩展可以在编码时帮助完成您的想法。例如选择正确的方法或找到键入了一半的表名。提出这一点是因为即使你不喜欢学习 Tensorflow 或任何其他机器学习语言,这并不意味着你不能欣赏你周围的世界。

第二类分析数据科学:描述

数据科学中的描述性分析是指全面的数据,以及用于可视化该数据的任何手段。这可能是指每月报表、图表、演示文稿,甚至是仪表板之类的更技术性的方法。在这四种类型中,这是最常见的。这是因为不仅开发人员可以使用它,而且它对业务用户也很关键。没有数据的表示,就很难发现其中的意义。例如,如果一家企业每月销售一定数量的书籍,他们可以使用图表来可视化他们的技术是在改进、保持不变还是变慢了。对于在家的开发人员来说,也许你正在尝试寻找一种解决方案来对照片进行分类。您正在考虑几种不同类型的编码方法,并对其中的三种进行测试。您可以使用一个图表,甚至是一个仪表板来直观地显示使用每种方法正确排序的图像的百分比。这将有助于你改进你的方法,也有助于你选择你应该采取的方法。

数据可视化对企业至关重要。r 是一个专门用于数据科学可视化平台。r 也能够表示大数据。这使得可视化数据比手动处理数据更快更容易。

第三类分析数据科学:诊断

另一种要讨论的分析数据科学是诊断分析。听起来,这是在寻找问题的根源。这可能涉及到挖掘和隔离所有混淆的信息。诊断分析的目标是更快地发现问题,以便制定解决方案。在我们之前的仪表板示例中,这可能表示找到导致问题的数据,然后深入到该问题的细节。

对于开发人员来说,仪表板示例仍然是相关的。然而,我们可以使用一个更全面的例子。在您选择的 IDE 中,我敢肯定您有时会键入错误的内容或调用不存在的方法。甚至可能在变量声明中用错了大小写。你可能会注意到那条熟悉的红色曲线。IDE 意识到有一个错误,但是他们在识别错误的位置上变得更聪明了。所以,对于很多新版本来说,花两个小时寻找一个丢失的分号的日子已经过去了。现在,您的 IDE 可以找到是哪一行抛出了错误。有些甚至提供了你可能想写的提示。

第四类分析数据科学:药方

我们要看的最后一种数据科学是规范分析。我最后解释这一点的原因是,它至少需要一些(如果不是全部)其他因素来创建一个解决方案。这意味着这个处方,你可能会猜到,是某个特定问题的解决方案。能够想象并描述这个问题,对于知道如何解决这个问题是很重要的。您还需要诊断问题以形成解决方案。你甚至可能需要找到其他预测事件的解决方案。所以,你可以猜到,它们都是紧密相连的。

规定性分析使用机器学习和统计模型的组合来基于测试结果推荐策略。使用的技术越先进,建议就越具体。

手动解释一下,假设你想和一群朋友进行一次编码会议(或者只是一次聚会)。为了见面,你需要交换时间表,看看你们什么时候都有空。通过链接彼此的日历,你可以指定哪一天见面,这将确保没有人有重叠的计划。你可以用手或者通过电脑用日历来做。但是这个例子如何与更大部分的数据重叠呢?在大学里,注意有时你的期末考试是如何在奇怪的时间进行的。但是 10 次中有 9 次,你会惊讶于它们似乎没有重叠。这是因为大学可以使用你的时间表,代表同一个班级其他学生的数据,并指定不会冲突的日期和时间(甚至地点)。现在,这个系统并不总是完美的。但那是因为他们的一些预测可能有点偏差。但这只是学习过程的一部分。

另一个现实世界的例子,一个你可能经常使用的例子,是你的 GPS 如何预测,然后给你开出到达你的位置的最快路线。它可以测量距离和比较道路速度,以确定哪条路线是最快的。创新使得预测哪里会发生交通堵塞以及需要多长时间才能解决交通堵塞变得更加容易。一些系统甚至开始允许你报告事故或超速。所以实际上,在你的日常生活中,数据科学仍在快速帮助你做出决策和解决一些问题。

将科学放回数据中

也许不言而喻,但是如果没有科学,你的数据将毫无意义。从销售数量到马里奥赛车圈的最快时间,除非你进行观察和比较,否则这些数据将毫无价值。但作为开发人员,我们更依赖数据科学,而不仅仅是担心我们的工作会有成功的商业冒险。甚至在尝试一份新工作时,你简历上的数据也会被使用并与他人进行比较,而决策就是根据这些数据做出的。无论你是对大数据感兴趣,还是在远处感觉更舒服,计算机都在更快、更容易地做出决策,而且还根据观察到的其他模式,对市场、消费者趋势,甚至只是天气状况做出有益的预测。

结论

无论你在研究什么领域,尤其是技术领域,数据科学已经成为一个越来越重要的因素,每个人都应该至少了解一点。不,你不必像我一样把空闲时间都用来研究新趋势。但时不时地,看看数据科学领域正在发生的事情也无妨。正如我们所讨论的,数据科学不仅仅是机器学习。每个人都有一点数据科学,即使是非技术领域。甚至在你的日常生活中,你会发现机器学习的例子旨在使你的生活更容易。

对于开发人员来说,跟上更新变得更加重要。我们简单谈过的一个例子是数据可视化,这对于企业中的每个人都是必不可少的,但是即使是预测和处方这样的方面也非常有用,尤其是对开发人员而言。像 Intellisense 这样的工具可以使编码更容易,或者至少节省时间。让您选择的 IDE 准确地指出您的错误在代码的哪一行,甚至给出如何纠正这些错误的建议。即使你只是享受机器学习的好处,跟上趋势和更新至少可以更清晰地描绘出你在编码未来可以期待的画面。至少,在我看来,跟上数据科学既有趣又有见地。我希望你喜欢我关于机器学习对所有领域有多重要的观点。下次见,干杯!

用我的 每周简讯 免费阅读我的所有文章,谢谢!

想阅读介质上的所有文章?成为中等 成员 今天!

看看我最近的一些文章:

https://miketechgame.medium.com/making-python-read-my-emails-9e3b3a48887c https://medium.com/codex/a-simpler-introduction-to-oauth-3533e53a4589 https://miketechgame.medium.com/after-nearly-five-years-i-left-my-job-a2e76f0dc0b4

参考资料:

https://www.kdnuggets.com/2017/07/4-types-data-analytics.html https://www.analytixlabs.co.in/blog/why-do-we-need-data-science/

为什么所有数据科学团队都需要认真对待 MLOps

原文:https://towardsdatascience.com/why-data-science-teams-needs-to-get-serious-about-mlops-56c98e255e20?source=collection_archive---------36-----------------------

随着越来越多的公司采用数据科学和机器学习,有时令人惊讶的是,有些公司仍然没有对一个关键方面——m lops——给予太多压力。这篇文章旨在让你相信致力于 MLOps 的时间和人力资源对于从事 ML 产品的公司是必不可少的

斯科特·格雷厄姆在 Unsplash 上拍摄的照片

我为什么要关心 MLOps?

先从商业角度来说。MLOps 实践的部分属于“未知的未知”,即你不知道你不知道的事情。如果不花时间去发现和实现它们,你的公司就有落后于竞争对手的风险,结果,竞争对手可以提供更好的产品和更快的迭代。换句话说,通过忽略 MLOps,您部分忽略了 IT 世界从 DevOps 革命中学到的所有伟大的东西。

DevOps 和 MLOps 都是为了向最终用户提供价值。

在更技术的层面上,在做数据科学时,当模型在测试/验证集上获得高分时,认为您的工作已经完成是错误的。恰恰相反,这只是旅程的开始。给你一个要点,在模型被部署到产品中之后(除了监控和保持它运行的所有操作之外),另外两个基本的生命周期开始了。第一个与模型改进和微调有关,第二个与贵公司吸收的新数据有关(由外部世界的变化引起)。

我们稍后将讨论更多的细节,但现在让我们集中精力,在我看来,最关键的成功因素。

MLOps 专用的人的因素的重要性

你的数据科学家有不同的动机,而KPI是围绕构建最佳模型而定义的。他们将并且应该把努力集中在这一领域。如果你希望有人认真研究 ML 的运营部分,你将需要一个新的角色,我喜欢称之为“MLOps 布道者”

“MLOps 布道者”是谁?他/她不仅具备你对 MLOps 工程师的所有期望,而且还具备:

  • 通过积极寻求、展示和实施最佳实践及其带来的价值,在业务、数据科学和工程部门传播“MLOps 福音”。
  • 负责您的 MLOps 过渡和实施流程(我不能强调这一点有多重要),并围绕他/她的行动为公司带来的价值设定 KPI。
  • 了解 DevOps 机芯的整体情况,同时能够深入研究技术细节。数据科学家和开发工程师的混合体。
  • 得到公司领导层的适当支持来实施变革。

正确计划和执行的 MLOps 将对您的 ML 产品的成功产生巨大影响。

同时,有些事情你需要注意。第一,不要指望这个角色有所有的答案。成熟的 MLOps“堆栈”仍处于早期,令人不安的发展。更重要的是,将有指定的 R&D 时间,因此,您公司的 MLOps 可以发展和改进。

MLOps 实践和改进应该由项目的类型、您公司的规模以及您现有团队的成熟度级别来决定。简而言之,没有“让了不起的百万富翁来做这件事”的清单。

是的,所有的项目都不一样;然而,MLOps 福音传道者可以特别注意的事情很少。让我们举几个例子:

  • 协作和跨团队/跨公司的可再现性,重点是创造一个环境,让数据科学家可以无摩擦地进行实验。
  • 引入严格的技术,当你继续开发你的产品时,你可以自信地断言所做的改变带来了额外的价值。你的信心应该建立在科学方法的基础上,例如,每次实验都会自动记录多个指标,并允许你将它们与之前运行的指标进行比较。
  • 流程自动化是 MLOps 的一个组成部分;然而,只有当它增加价值时才引入它。
  • 当团队开始处理大量的模型(项目)时,开始寻找可以在他们之间共享的步骤,并将它们打包成可重用的组件。
  • 不要同时为所有项目引入变更。选择一个“金丝雀”项目,在全公司范围内执行之前,确保你有足够的事情要做。

这都是关于价值的

更具体地说,让我们想象一家公司在数据科学之旅的开始阶段没有任何 MLOps 实践。it 部门将时间投入到 MLOps 中可以获得什么样的好处?

TL;下表的 dr 版本:借助 MLOps,您可以加快并标准化您的实验过程,更快地交付您对产品所做的改进,并获得持续的反馈,作为未来变革的重要输入。此外,您还可以确保 ML 产品的更高质量,并避免生产中模型可能发生的灾难。反过来,这也让你能够制造出更好的产品。

这只是几个例子(我没有触及许多重要话题),所以不要盲目地将它们应用到你的案例中。你的商业案例的细节可能需要一个完全不同的计划。此外,设计您的 MLOps 之旅不是一次性的过程,应该不断进行审查。

如果你想让你的团队更加认真地对待我提出的概念,请与你的老板或团队成员分享这篇文章。传播 MLOps 智慧!

为什么数据科学家从不快乐

原文:https://towardsdatascience.com/why-data-scientists-are-never-happy-8825318df5f9?source=collection_archive---------11-----------------------

我如何找到适合我的项目

为了追求 21 世纪最性感的工作,数据科学家经常带着不切实际的期望开始工作或者结束与他们职业抱负不一致的项目。我当然也陷入过几次同样的陷阱。也许你也经历过类似的事情。

在我职业生涯的初期,我经常对项目感到沮丧,因为我想什么都做——一方面是深入的科学研究,另一方面是以客户为中心的工作。在一系列不同的公司工作过之后,我意识到,基于公司和他们要解决的问题类型,DS 项目可以有非常不同的特征。

在此期间,我最终得出结论,我可以使用我称之为“3c”的三个类别对 DS 项目的类型进行分类和评估:

  • 科学挑战:需要尖端的机器学习(ML)技术
  • 创造性解决问题:有一个很大的开放式问题,却没有明显的解决方案
  • 客户影响:有明确的用例及生产基础设施。交付分析或模型直接转化为客户的价值

你过去的项目在哪里?(图片由作者提供)

实际上,对于一个数据科学项目,您只能选择两个 c!

让我们仔细看看这三个 c 实际上是什么意思。

科学挑战

如果你想专攻某项技术或应用(例如,NLP 或计算机视觉),这个项目特征是很有用的。我总是发现这些项目是有益的,因为它们推动了我对 ML 的理论理解,并且我很容易跟踪我的学习进度。

在这样的项目中,您会发现典型的活动有:

  • 回顾学术文献以确定艺术方法的状态
  • 从一篇论文中实现一个模型,并使它适应你的问题
  • 尝试新的软件库和模型的开源实现

创造性解决问题

您经常会在咨询风格的项目中发现这种特征,这些项目需要使用 ML 快速和创造性地解决现实世界中的问题。关键的挑战是让自己适应新的环境,并在固定的时间和预算内获得现成的 ML 解决方案。这些项目可能是令人兴奋的,因为它们通常允许对解决方案进行快速迭代。

在这样的项目中,您会发现典型的活动有:

  • 根据要求与客户接触,以了解业务问题
  • 探索提供的数据和适当的基础设施,以评估集成 ML 解决方案的可行性。
  • 构建“80/20”概念验证来测试 ML 的用例

客户影响

对客户有影响的项目有明确定义的价值主张,通常会在现有产品中添加 ML 特性。因为这样的模型改进可以直接部署到用户手中。这使得这些项目成为 ML 工程师和任何想提高他们工程技能的人的地方。我从用户的积极反馈中获得了很大的满足(“这让我每周节省了几天的工作”),我喜欢通过我为我的模型的用户创造的价值来衡量我的影响。

在这样的项目中,您会发现典型的活动有:

  • 与软件工程师密切合作生产模型
  • 进行 A/B 测试以衡量模型改进
  • 从现有用户中提取数据用于训练模型

选择两个 Cs

当作为一名数据科学家进行职业选择时,请考虑三个 c 以及您正在寻找哪个 c。不要期望在一个项目中得到这三者。根据我的经验,好的数据科学项目往往会落入以下交叉点:

寻找交叉点上的项目(图片由作者提供)

《深度科技》

你经常会在科技创业公司和大公司的 R&D 分部找到这些项目。新技术和建模技术被应用于具有颠覆整个行业潜力的开放性问题。数据科学家通常需要开发最先进的模型来获得竞争优势。然而,实际将模型投入使用可能需要大的业务开发和工程努力。

《嵌入 ML》

许多传统公司希望将 ML 嵌入到他们的流程中,以支持他们的核心业务。这为数据科学家创造了大量的机会和项目,以找到 ML 应用程序的唾手可得的果实。使用现有的 IT 基础设施,您可以交付具有巨大影响力的简单模型。

转移到另一个项目,开发另一个简单的模型,通常比进一步提高现有模型的准确性更有商业价值。这使得数据科学家很难获得更多前沿技术和模型的实践经验。

“海量级 ML”

这些项目可以在以技术为产品核心的公司中找到。他们雇佣了庞大的数据科学家和工程师团队,构建可以扩展到数百万用户的新功能。在这些环境中,数据科学家可以专注于一个小领域,在这个领域中,模型改进可以转化为大量的节约和利润。然而,随着专业化程度的提高,在你和客户之间可能会有很多层的产品/项目经理。

那又怎样?

如果你对当前的角色/项目感到沮丧,问自己以下问题:

  • 你希望你的项目包含哪些 Cs?
  • 你缺少什么特征?
  • 贵公司是否有其他项目可以提供这种服务?
  • 考虑新工作时:公司提供你想要的项目类型吗?

为什么数据科学家应该首先成为数据分析师

原文:https://towardsdatascience.com/why-data-scientists-should-become-data-analysts-first-d5a2bc68fc6e?source=collection_archive---------38-----------------------

确保成功的职业战略

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

您可能想知道为什么有人会倡导数据科学家成为数据分析师。作为一个曾经做过数据科学家和数据分析师的人,我想讨论一下为什么你应该考虑成为一名数据分析师,即使你已经接受了成为数据科学家的培训。

获得领域经验

Interview Query 发布的一项研究报告称,“数据科学面试将在 2020 年趋于平稳。数据科学仅面试同比增长 10% 之前同比增长 80%。数据科学职位中增长第二快的职位业务和数据分析师获得,增长了 20%** 。”**

数据科学职位的增长速度不如数据分析师职位。这意味着你将与更多的人竞争数据科学家的工作。如果你缺乏数据科学方面的经验,可以考虑申请数据分析师的工作,因为竞争不那么激烈。数据分析师的技术要求没有数据科学家高,受过数据科学培训并拥有研究生学位的人可能会比没有这些证书的候选人更受欢迎。首先成为一名数据分析师将有助于你积累领域经验,并使你在未来申请数据科学家工作时成为更强有力的候选人。

建立软技能

作为一名数据分析师,我与许多利益相关者互动,并更经常地展示结果,因为请求的周转时间比数据科学项目更短,后者可能需要数周时间来开发一个机器学习模型。这为我提供了更多的机会来练习发展我的演示数据讲述技能。如果我今天像当数据科学家时一样精通我的软技能,我可能会说服我的利益相关者采用更多我的模型,但遗憾的是,我的模型中只有三分之一被使用过

期望与现实

2012 年,《哈佛商业评论》称数据科学家为“21 世纪最性感的工作”。不幸的是,许多数据科学家的角色一点也不“性感”,而且期望往往与现实不符,因为你无法对业务产生重大影响。

作为一名数据科学家,我大部分时间都在构建模型,但我大部分时间都在使用相同的算法构建非常相似的模型

不用说,当唯一改变的是目标变量时,这变得很乏味。根据公司的不同,由于你支持的部门或高层领导的支持,可以用机器学习解决的商业问题可能会很有限。

虽然我作为数据科学家支持营销的工作是重复和枯燥的,但我作为数据分析师支持营销的经历是完全不同的。作为一名数据科学家,我支持电子邮件营销团队,专注于构建模型以提高客户转化率。我很少与其他团队互动,对电子邮件营销之外的业务一无所知。

作为一名数据分析师,我参与了广泛的项目,并与包括产品、客户成功和财务在内的多个团队互动。作为一名数据分析师,我在一年时间里对公司业务的了解比我作为数据科学家的三年时间还要多。我的项目范围从分析 A/B 实验到营销归因,当情况需要时,我可以建立机器学习模型。作为一名数据分析师,除了建模之外,还提供了从事各种项目的机会,这些项目仍然会对业务产生重大影响。

数据科学采用

公司可能还没有准备好采用数据科学,但由于数据生成的增加和数据访问的简化,对数据分析师的需求增加了。根据哈佛商业评论,“77%的高管报告称,企业采用大数据/人工智能计划是一项重大挑战,高于去年的 65%。”

当我作为一名数据科学家工作时,我意识到数据科学是一个模糊的概念,人们听说过但并不真正理解。这使得数据科学计划很难获得领导的支持,因为他们不明白如何使用数据科学来解决业务问题。如果没有合适的分析领导者来宣传数据科学的好处,你作为数据科学家的才华将会付诸东流。

相比之下,产生见解并提供建议以改善业务的数据分析师比机器学习更容易理解。作为一名数据分析师,当您将它定位为业务问题的解决方案时,您仍然可以找到构建模型的机会,并增加采用的机会。

与公司一起成长

公司(尤其是较小的公司)可能没有合适的基础架构或足够的工作来聘用数据科学家,因此可能会聘用数据分析师。这些都是很好的机会,可以让你从数据分析师起步,从事各种项目,这些项目可以影响业务,并随着公司的发展成长为高级角色。当有足够多的问题可以用数据科学来解决时,也有可能在未来成为全职数据科学家。

随着数据科学家角色的竞争越来越激烈,为了取得成功,你的职业战略可能需要转变。首先考虑成为一名数据分析师,以培养数据科学家所需的基础技能。一旦你掌握了基础知识,如果你一开始是一名数据科学家,添加模型开发将比试图在每件事情上都做得很好更容易。

你可能也会喜欢…

为什么数据科学家应该学习动态编程

原文:https://towardsdatascience.com/why-data-scientists-should-learn-dynamic-programming-e50dfe62a5c7?source=collection_archive---------10-----------------------

数据结构和算法

数据科学家的基本算法

Birger Strahl 在 Unsplash 上拍摄的照片

介绍

在当今的就业市场中,数据科学不再是一个纯粹的分析领域,而是需要编程和工程方面的丰富实践经验。除了模型开发和数据分析等正常职责之外,数据科学家正在与工程团队合作构建基础设施管道。对编程的深刻理解加快了生产进度,减少了摩擦。

Python 广泛应用于数据科学和软件工程社区。就是这样一种通用的编程语言,提供了各种数据结构和算法,包括数组集合堆栈字符串字典 ( 第一部分第二部分)、二分搜索法等。

在这篇博客文章中,我们将学习另一种流行的算法,称为动态编程,并了解为什么它的性能优于其他方法,如迭代和递归。

什么是动态编程?

DP 是一种算法,它将问题分解成子问题,并存储和重用之前计算的结果。

我们将在 DP 之前介绍什么是递归。

递归函数是相对于自身定义的函数,这意味着函数将继续调用自身,直到满足某些条件。递归包含两个部分:基本情况和递归情况。该函数将不断迭代递归情况,并计算子问题的结果,直到满足基本情况。

递归函数调用自身,反复重新计算子问题的结果,效率低下。

有什么解决办法吗?

记忆化!

也就是说,我们缓存之前已经计算过的答案,并将结果存储在字典或列表中,这个过程叫做记忆化,显著提高了算法效率。

我们将使用以下三个真实的面试问题来帮助我们更好地理解算法。首先,我们将浏览每个问题的思考过程,并讨论我们如何提出解决方案。然后,我们用 Python 编写代码,讨论它们的时间和空间复杂性。

这里,时间复杂度的大 O 符号是合适的。可以直观的查看各种算法的速度。例如,黄色区域中的线性时间 O(n)比红色危险区域中的 O(n)好得多。

https://www.bigocheatsheet.com

完整的 Python 代码请参考我的Github

问题 1:阶乘

-一个数的阶乘,N 是所有小于等于 N 的正整数的乘积,记为 N!。

-比如 3 的阶乘是 3!= 321 = 6.

-给定一个正数 N,计算它的阶乘。

走过我的思考

我的第一反应是应用迭代方法,将 n 范围内的元素相乘。

首先,我们定义一个名为 result 的对象,并将其设置为 1。

其次,迭代这些数字直到 n+1 并返回结果,如下所示。

# solution 1: for loop 
def factorial_1(n):
    result = 1
    for i in range(1,n+1):
        result*=i
    return result

迭代方法是线性的,因为 for 循环的迭代次数等于数的大小,直到 n+1,aka。,线性时间复杂度。该算法包含线性空间复杂度,因为它存储从 1 到 n+1 的数。

迭代方法具有以下特征:

Time complexity: O(n)
Space complexity: O(n)

让我们试试递归。基本条件是当 n 等于 1 时,对于递归条件,我们递归地调用同一个函数。

# solution 2: recursion
def factorial_2(n):
    if n==1:
        return 1

    else:
        n *= factorial_2(n-1)

 return n

递归阶乘方法具有线性时间复杂度,因为它为每个数字调用一次自身。因此,迭代轮次与数目 n 成正比,即其时间复杂度为 O(n)。此外,空间复杂度也是线性的,因为没有占用额外的空间。

递归方法具有以下特征:

Time complexity: O(n)Space complexity: O(n)

如上所述,递归方法会多次计算相同的值。例如,我们已经计算了 3 的阶乘(即 321 = 6),但必须再次计算 4 的阶乘(即 432*1),这是低效的。

当递归堆栈堆积时,递归迭代会显著降低速度。事实上,如果递归堆栈达到上限,递归方法可能无法运行。

为了解决重复计算的问题,我们可以通过存储先前的结果来应用动态编程方法。

解决方案:动态编程

3628800

动态规划方法具有以下特点:

Time complexity: O(n)Space complexity: O(n)

方法 2 和 3 具有相同的时间和空间复杂度。那么,为什么我们认为动态规划方法更好呢?让我们来看看问题 2 的答案。

问题 2:斐波那契数,被大家

https://leetcode.com/problems/fibonacci-number/

通常表示为*F(n)*斐波纳契数列形成了一个序列,称为斐波纳契数列,这样,从*0**1*开始,每个数字都是前两个数字的和。也就是说,

F(0) = 0,F(1) = 1
F(n) = F(n — 1) + F(n — 2),对于 n > 1。

给定*n*,计算*F(n)*

走过我的思考

这是一个几乎每个大型科技公司都会问求职者的普遍问题。按照问题 1 中的相同步骤,我们可以比较迭代、递归和 DP 方法。

#解决方案 1:迭代方法

简单地说,我们在 for 循环中不断更新三个项目的值:current、n1 和 n2。查看 Python 代码的解决方案。

迭代方法具有以下特征:

Time complexity: O(n)Space complexity: O(1)

#解决方案 2:递归方法

有两个条件:

  1. 基本条件:0 号位和 1 号位怎么办?
  2. 递归条件:位置 2 及以上怎么办?

我们从 0 和 1 开始,对每个位置的前两个函数求和,并对其他位置调用自身的函数,这是典型的递归设置!查看 Python 代码的解决方案。

递归方法具有以下特征:

Time Complexity: O(2^n)Space Complexity: O(n)

#解决方案 3: DP

与问题 1 类似,我们将之前的结果缓存在一个字典中,并在被调用时返回它们。回想一下,由于多次计算,递归方法具有 O(2^n 的时间复杂度。

得益于记忆化过程,DP 方法将时间复杂度从 O(2^n 降低到 O(n),这对于算法性能是一个显著的改进。查看 Big-O 复杂性图表(如上)进行比较。

让我们比较一下计算 20 的斐波那契数的这两种方法的运行时间。递归方法需要 3.42 毫秒(毫秒,1/1000 秒,但是 DP 方法只需要 215 微秒(微秒,1/1000000 秒),几乎相差 16 倍。

迭代方法的时间复杂度与它在每一步中需要的调用次数成正比。因此,如果迭代需要多次调用自己,运行时间可能会很快增加。如果发生这种情况,DP 方法就派上了用场,并为我们节省了大量时间。

动态规划方法具有以下特点:

Time Complexity: O(n)Space Complexity: O(n)

解决办法

5

问题 3:最长的增长子序列

https://leetcode.com/problems/longest-increasing-subsequence/

给定一个整数数组*nums*,返回最长严格递增子序列的长度。

子序列是可以通过删除一些元素或不删除元素而不改变剩余元素的顺序来从数组中导出的序列。例如,*[3,6,2,7]*是数组*[0,3,1,6,2,2,7]*的子序列。

走过我的思考

该问题要求最长的长度,该长度取决于当前位置 I 和其先前位置 i-1 之间的相对值。然后,我们可以创建一个新的列表, new_list ,其长度与 nums 相同,并将所有元素设置为 1。换句话说, new_list[i] 表示目前为止最长的递增子序列的长度。

然后,我们计算一个 for 循环中有多少元素小于new _ list【I】。如果是,则向new _ list【I】加 1,并更新位置 I 处的较大值,aka。【new _ list[I]= max(new _ list[I],new_list[i]+1)

最后,从列表中返回最大值。

由于嵌套的 for 循环和常数空间,该算法具有指数时间复杂度。

动态规划方法具有以下特点:

Time complexity: O(N²)Space complexity: O(N)

解决办法

4

完整的 Python 代码请参考我的Github

外卖食品

  • 理解什么是递归,它的整个过程,优点和缺点。
  • 记忆化可以通过存储以前的结果来提高算法性能。
  • DP 在递归方法必须在每一步中多次调用自己的场景中表现出色。

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

https://leihua-ye.medium.com/membership

我的数据科学面试顺序:

</5-python-coding-questions-asked-at-faang-59e6cf5ba2a0> </6-python-questions-you-should-practice-before-coding-interviews-f958af55ad13>

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

为什么数据科学家应该像放射科医生一样看待问题

原文:https://towardsdatascience.com/why-data-scientists-should-see-like-radiologists-13762a212f9?source=collection_archive---------30-----------------------

意见

为什么人工智能不会取代放射科医生

照片来自Unsplash

“你想当放射科医生?而且你不怕过不了多久被人工智能取代吗?”

早在 2016 年我成为一名放射科实习生时,就有人问过我这个问题。如今,几乎每个新的放射科实习生都至少听过一次。媒体无处不在地报道着艾的又一新成就,这与此有关。

领域内几个大佬的交流就是一部分。例如,在 2016 年的机器学习和智能市场大会上, Geoffrey Hinton ,将放射学家比作漫画中的 Wile E. Coyote:

“你已经在悬崖边上了,但你还没有往下看。下面没有地面。[……]相当明显,五年内,深度学习会比放射科医生做得更好”[1]。

5 年的时间框架(在同一次讨论中,半推半就地延长到了 10 年后)则主要描绘了当时人工智能研究界普遍的乐观情绪。事实上,在 2016 年,机器学习领域被深度神经网络所彻底改变,其第一份主要出版物只有 4 年的历史,其最近的进展令人眼花缭乱。大规模视觉识别挑战赛每年都展示计算机视觉领域的最新进展,汇集了国际知名团队。自 AlexNet [2]提出神经卷积网络以来,最低的错误率一直停滞在 25%左右,2012 年该分数飙升至 15.3%。在随后的几年中,几乎所有的团队都依赖于神经网络,以至于在 2015 年,ResNet [3]以 3.57%的错误率击败了人类的结果。

然而,G. Hinton 的预测在 5 年后的今天面临着现实,它们远未得到证实,正如欧洲放射学会(ESR) [4]提醒我们的那样,放射科医师不会被取代。

然而,G. Hinton 发布的关于放射学的预测仍然存在于人们的脑海中,这可能是该专业吸引力最近下降的原因。根据 2018 年对 322 名加拿大医学生的调查, 68%的人认为 AI 会减少对放射科医生的需求 [5]。2016 年,获得该专业的截止排名在法国国家分类考试(ECN)要求的专业排名中为第 2781 位,2020 年降至第 4417 位(+64.7%)[6]。前 1000 名中选择放射学的学生比例 2016 年为 11.1%,而 2019 年为 7.0%(绝对-4.1%,相对-36.9%)[7]。这种排名上的差异可能对新的放射科实习生的质量没有影响,但描绘了专业吸引力的下降。在“未来实习生指南”中,ISNI(Inter-Syndicale national des Internes)在 2020 年描述了“一个幽灵徘徊在这个专业周围,人工智能将取代放射科医生的世界的想法”。

机器更新换代是各个领域头条新闻反复出现的主题 。1940 年,甚至在计算机出现之前,《纽约时报》的标题是:

"从长远来看,机器会取代人吗?"(1940 年 2 月 25 日)。

人工智能能够取代放射科医生的想法是科幻小说,因为它掩盖了大量的中间步骤。

  • 用一个只知道最常见疾病的软件来取代放射科医生是不可行的。然而,目前的机器学习技术需要数百甚至数千个不同病例的图像来学习,这似乎不可能为罕见的病理收集。保护人们及其个人数据的法律(欧洲的 RGPD)极大地限制了医学领域的研究,并使收集如此多数据的工作变得不可思议。
  • 在明确定义的任务之外评估一个软件似乎几乎是不可能的。在复杂情况下,机器学习的整个困难在于避免陷入“局部最小值”:算法找到了一个适合它的解决方案,因为当它远离现实时,它看不到任何可能的改进。这就是当软件找到一个快捷方式,为问题提供一个快速(但不协调)的解决方案时所发生的情况。
  • 评估人工智能正确性的难度随着所要求的任务平行发展。
  • 所有的软件,作为医疗设备,都需要评估。代码的每次修改都会导致新的认证。如果人工智能变得如此复杂,以至于取代了放射科医生,那么这种评估就不可靠。

目前的技术无法克服这些步骤,但该领域的新突破不会解决所有问题:将医生从护理等式中移除是一个前所未有的医学法律和伦理难题,尚未得到充分探索

一个前所未有的医学法律和伦理难题

飞机自动驾驶既安全又高效,然而将一个人的生命交到没有人类替角的机器手里还不被接受。这种对机器的信任取决于文化,所以在飞机自动驾驶仪的例子中,留给人类的部分部分取决于你在哪里。在美国,航空公司要求飞行员进行人工监督和控制。另一方面,亚洲航空公司将自动驾驶仪的使用推到了禁止人工控制着陆的地步。当系统出现故障或面临无法处理的情况时,就需要专家。此外,航空公司和乘客希望这位专家在场:人类比计算机更善于快速吸收新的和不相关的事实,并据此采取行动。事实上,在那些机器已经证明其效率的领域,人类掌握着最终决策权,他对自动驾驶仪做出的决策负责。

同样的法医学问题也出现在医学上:谁对诊断负责,尤其是如果诊断是错误的?参与开发、营销和安装人工智能系统的科学家和制造商是否会为使用人工智能算法导致的有害结果承担法律责任?责任问题是有分歧的[9]。

相反,人工智能作为一种新的工具,参与丰富了放射科医生的角色。在 CT 和 MRI 出现的时候,一些人预测该专业将会过时,由于更容易的解释而变得没有必要。相反,技术已经完善,放射科医生从未如此必要。该专业已经证明了其适应新技术的能力,创新最终被输出到其他专业,例如用于血管流产的 Seldinger 方法[10],该方法也是心脏病学、血管医学和麻醉的参考。

欢迎来到人工智能增强放射学的第一章

我们在第 1 章的人工智能在放射学中,它将被整合,因为每一个以前的形式已经。学生不会因为人工智能而逃离专业,而是会从利用这种变化和培训中受益[11]。

正如 1896 年一位医生和一位工程师发展了放射摄影术一样,研究可以从放射学家和研究者之间的合作中获得一切。专业不与 AI 竞争。这种偏见可能让人想起邓宁-克鲁格效应(Dunning-Kruger effect )[ 13 ],预测对抗的个人主要来自初创企业和政治阶层,并不了解放射学家的真实活动。

放射科医师的角色不仅仅是标记图像;他或她参与医学讨论,讨论要进行的检查、临床假设、与病人档案的对质、咨询其他专家并为管理铺平道路。图像提供的信息被整合到患者问题的管理中。与普遍的看法相反,除了对病人进行的所有技术操作之外,介入放射学中还有会诊。另一方面,这种机器将使重复性工作变得更容易,加快管理速度,并可能有助于满足日益增长的放射学需求。诸如在 CT 扫描仪中引入有组织的肺癌筛查之类的进步,有可能需要每年解释数百万次以上的检查:如果没有计算机的帮助,这是一个无法实现的目标。放射科将需要人工智能。后者也将是有用的,当它将有助于改善技术,并加快 8 倍的 MRI 扫描的采集,正如第一次研究结果似乎显示的[14]。

我将站在斯坦福大学放射学家柯蒂斯·朗洛茨(Curtis Langlotz)一边,他在 2018 年表示:

“AI 不会取代放射科医生,但使用 AI 的放射科医生会取代不使用 AI 的放射科医生。”

为什么要害怕一个充满新奇未来的专业?

关于作者:
亚历山大·内罗特(Alexandre Nerot)医学博士(
https://www.linkedin.com/in/alexandre-nerot/)是一名法国放射学实习生,他在介入放射学的一项活动和他的笔记本之间分享时间,以参加各种可用的 Kaggle 竞赛。
这篇文章的标题灵感来自于在 Kaggle 上找到的一篇文章:
https://www . ka ggle . com/jhoward/don-t-see-like-a-放射科医生-fastai

作者照片,自动肌肉和脂肪分割

引用

[1]“杰夫·辛顿:关于放射学——YouTube”。https://www.youtube.com/watch?v=2HMPRXstSvQ

[2] O. Russakovsky 等,“ImageNet 大规模视觉识别挑战”,ArXiv14090575 Cs,janv。2015,Consulté le : avr。09, 2020.http://arxiv.org/abs/1409.0575

[3] K. He,X. Zhang,S. Ren,et J. Sun,“用于图像识别的深度残差学习”,ArXiv151203385 Cs,déc. 2015,【http://arxiv.org/abs/1512.03385】。

[4]“放射科医生应该了解的人工智能 ESR 白皮书”,《洞察成像》,第 10 卷,avr。2019,doi:10.1186/s 13244–019–0738–2。

[5] S. Reardon,“机器人放射科医生的崛起”,《自然》,第 576 卷,第 7787 号,第 7787 号文章,2019 年,doi:10.1038/d 41586–019–03847-z。

[6]“rangs limites”。【https://www.cngsante.fr/chiron/celine/limite.html

ECN 统计:放射学和医学影像学"。https://www . med shake . net/medicine/ECN/statistiques/radio logie-et-imagerie-medical e/

[8]“不要对波音公司的自动飞行飞机大惊小怪——机器人已经在天上飞了”,《连线》。

[9] M. Codari 等人,“人工智能对放射学的影响:欧洲放射学学会成员之间的 EuroAIM 调查”,《洞察成像》,第 10 卷,第 1 期,第 105 页,2019 年 10 月,doi:10.1186/s 13244–019–0798–3。

[10] S. I. Seldinger,“经皮动脉造影术中针头的导管替换;一种新技术”,无线电学报,第 39 卷,第 5 期,第 368-376 页,mai 1953,doi : 10.3109/00016925309136722。

[11] A. Nerot 和 I. Bricault,“放射学中的大数据介绍和人工智能自治的启动”,J. Imag。Diagn。Interv。,AOT 2020,doi : 10.1016/j.jidi.2020.05.016。

[12] W. J. Morton 和 E. W. Hammer,《看不见的 X 射线或摄影及其在外科手术中的价值》。纽约:美国技术图书公司,1896 年。

[13] J. Kruger et D. Dunning,“不熟练和不知道它:如何认识到自己的无能的困难导致膨胀的自我评估。心理网”,美国心理学会心理网,1999 年。/record/1999–15054–002?doi=1

[14] J. Zbontar 等人,“fastMRI:加速 MRI 的开放数据集和基准”,ArXiv181108839 Phys. Stat,déc. 2019,http://arxiv.org/abs/1811.08839

为什么数据科学家应该保持开放的心态、好奇心和非判断性

原文:https://towardsdatascience.com/why-data-scientists-should-stay-open-minded-curious-and-non-judgemental-49784a883a78?source=collection_archive---------35-----------------------

作者聚焦

“我总是意识到有多少我不知道,但随着我的学习,我试图将一切联系起来。”

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与大家分享 哈耶纳山 本胡伯尔曼 的对话。

照片由 Haaya Naushan 提供

Haaya 是一位专注于将数据科学和机器学习与社会意识研究相结合的数据科学家。她目前与 NLP 和计量经济学合作进行因果推断,并拥有利用大数据和图形算法研究社交媒体的经验。

在从事数据科学之前,她学习生物学,希望成为一名兽医。在空闲时间,她玩在线竞技视频游戏,阅读哲学和科幻小说,烘焙糕点,并用水彩画来表达自己。

你是如何决定进入数据科学领域的?

在疫情开始的时候,我开始学习如何以编码为乐;我的主要兴趣是数据可视化和 web 应用程序开发。2020 年 6 月,当我在非营利部门的工作被取消时,我有很多空闲时间,并决定学习数据科学,因为我一直喜欢统计和讲故事。我跟随自己的好奇心,很快迷上了机器学习,然后对语言的痴迷驱使我深入探索 NLP。

由于我致力于社会公正,我自然被像阿拉伯语这样的低资源语言所吸引。这给了我一个在世界银行工作的机会,在那里,我能够协助针对中东和北非的社交媒体研究。与经济学家一起工作激发了我对因果关系的兴趣,这也是我开始自学计量经济学的原因。

后来,我很幸运地签约研究如何将 NLP 用于经济分析,重点是可持续发展。我决定我需要领域知识来更好地解决问题;因此,我开始自学宏观经济学和发展经济学。一路上,我拓展了自己感兴趣的其他领域,例如语言学、虚假信息、网络安全、神经科学、流行病学和人工智能伦理学。

对于门外汉,你能分享一下什么是计量经济学吗?为什么你觉得它很有趣?

对我来说,计量经济学只是一套工具,可以用来解决因果问题。我被计量经济学吸引,因为我想做的不仅仅是使用数据驱动的模式识别进行预测——我想了解“为什么”因果推断令人着迷,传统计量经济学通常提供了确定因果影响的最佳方法。

此外,机器学习目前正在以很酷的方式推进计量经济学,由于大数据,现在有可能提出新类型的预测经济学问题。此外,我们现在有机会将因果方法应用于数据科学,我希望这将提高人工智能的可靠性和公平性。

理解如何应对流行病是考虑计量经济学的另一个原因——流行病学依赖于与经济学相同的基本因果数学。由于这两个学科对人们的生活有着直接的影响,所以它们都需要非常严格的要求。道德的社会政策需要良好的数据,因果关系对于确保决策者的责任是必要的。

迄今为止,在你的数据科学经历中,最具挑战性的方面是什么?

我的数据科学之旅始于避免无聊的愿望;让我保持兴趣的是该领域的跨学科性质、引人入胜的挑战和创造力的空间。我特别喜欢人工智能发展的快速步伐,因为总是有新的东西要学,我觉得这非常令人兴奋。然而,我面临的挑战是接受我需要自由地以非传统的方式学习。我必须学会不去评价自己不喜欢在线课程的结构,对重复的代码练习和传统课程缺乏耐心。这也意味着我没有办法衡量自己的进步,有时会感到很孤独。我的解决方案是在媒体上写文章,与人交流,并在确定优先学习内容时满足我的好奇心。

让自己变得真实是一种力量,也意味着我的数据科学之旅以自我发现为特征。更具体地说,我发现我喜欢通过阅读源代码和文档来学习如何编码。我更喜欢处理有趣的项目来练习我的技能,我通过阅读研究论文来最好地吸收领域知识。我总是意识到有多少我不知道,但是当我学习的时候,我试着把一切联系起来。我将这个过程概念化为构建一个图表,帮助我看到更大的画面,在这里我依靠灵感和直觉来寻找方向。因为我一直在寻找视角,所以这场斗争是在对抗存在主义的自我怀疑。我学会了通过抚摸我的猫或转移注意力来放纵我的其他爱好来休息和重置。

你的文章经常通过数据的镜头来探讨社会公正和道德。当你着手这类话题时,你的目标是什么?

我相信数据科学和人工智能有巨大的潜力来帮助人们;然而,我担心从业者可能天真地认为他们的工作是客观的,远离社会。现实是,科学不会在真空中产生:需要对当前的社会不公正有所认识,并有促进公平做法的动力。

我担心,对利润的盲目追求将破坏我们确保人工智能发展弊大于利的能力,特别是对历史上被边缘化的弱势群体。人工智能的当前应用已经揭示,由于缺乏公平的激励,并且对有偏见的算法没有影响,人工智能正在伤害人类。从积极的方面来说,我从寻求技术和研究民主化的开源运动中获得了希望。我还感到鼓舞的是,许多积极分子一直在努力提高对这些问题的认识。

你对刚刚进入这个领域的人有什么建议——尤其是那些可能对任务驱动的项目感兴趣但不知道从哪里开始的人?

对我有效的方法对其他人来说不一定是正确的;然而,当你善待自己时,每一段旅程都会更顺利。我会鼓励人们思想开放,充满好奇心,不做评判。我相信内在动机是有帮助的,激情对确保学习之旅本身是令人满意的有很大帮助,不管结果如何。如果一天结束时你很痛苦,成功就没有什么意义;最好是有乐趣,这样学习是一种乐趣,而不是达到目的的一种手段。

对于那些对社会影响计划感兴趣的人来说, DataKinddata for goodtech jobs for good 是一个好的起点。我认为在非营利组织做志愿者是一次很好的学习经历,有很多领域,比如公共卫生、教育和环境保护,都可以受到数据的积极影响。我也鼓励人们写作和分享他们的作品——这是巩固知识和学习如何让技术内容更容易理解的好方法。从小处着手是可以的:我只在自己喜欢的时候写作,我认为质量比数量更重要。Medium 对我来说是一个巨大的资源,为社区做贡献将会帮助其他人。

以充满希望的口吻结束,您希望在未来几年内看到数据科学领域发生什么样的变化?

疫情暴露了全球的不平等,这为以更公平的方式重建社会提供了机会。具体来说,我认为我们这一代最重要的两个问题是气候变化和贫困/不平等,我认为不可能只解决其中一个而不解决另一个。让我充满希望的是,我目前在世界银行的工作代表了他们同时、系统地解决这两个问题的承诺。我希望在数据科学和人工智能领域看到这种变化,在这些领域,开发和应用应该关注社会和气候正义。

我也希望看到因果 ML 的进步和增加的可访问性,因为我认为因果推理是伦理 AI 的关键。技术方面,我最激动的是量子计算;观察这个领域在未来十年的发展将会非常有趣。我也看到了神经经济学在更好地理解人类决策的生物和社会机制方面的潜力——我希望这一知识将转化为人工智能的改进。此外,我预计深度学习将继续对视频编辑、电影制作和视频游戏开发产生影响。与此相关的是,看到数据科学家或使用人工智能的内容创作者在 Twitch 上流动会很酷。

好奇想了解更多关于 Haaya 的工作和项目吗?在媒体LinkedIn 上关注她。以下是 Haaya 关于走向数据科学的档案中的一些杰出作品,她在这里分享了计量经济学和人工智能伦理的深度挖掘,机器学习和可视化技术的教程,等等。

请继续关注我们即将推出的下一位专题作者。如果你对你想在这个空间看到的人有建议,请在评论中给我们留言!

为什么数据科学家应该适度使用 Jupyter 笔记本

原文:https://towardsdatascience.com/why-data-scientists-should-use-jupyter-notebooks-with-moderation-808900a69eff?source=collection_archive---------5-----------------------

Jupyter 笔记本改变了全球数据科学家的游戏规则。但是应该乱用吗?

Elisa Ventur 在 Unsplash 上拍摄的照片

介绍

毫无疑问,2015 年 Jupyter 项目及其笔记本的推出改变了科学程序员和他们的代码之间的关系。第一个原因是连接不同编程语言(内核)的简单性,以及将文本与代码片段和输出(如表格、图形和地图)组合成一个页面的简单性。这种笔记本特性使得实现由 Donald Knuth 在 1984 年首次提出的有文化的编程范例成为可能,而且很简单。

识字编程最初是由斯坦福大学的 Knuth 提出的,目的是使程序逻辑更接近人类语言。它将代码与自然语言文本结合起来。

第二个原因是 Jupyter 笔记本的交互特性。试验数据并查看每个输入命令的代码结果的可能性使它成为数据科学家和研究人员的理想选择,他们的重点是数据分析而不是开发。
通过使用交互式笔记本,不再需要编写充满几十(或几百)行容易出错的代码的长脚本来在处理结束时显示结果。根据目标的不同,你甚至不需要费心去声明函数或者设计类。你可以按需声明你的变量,然后关注结果。

一句话:Python 和 Jupyter 成为数据科学家的标准。越来越多需要这些技能的课程和工作岗位可以证实这一点。

但现在,你可能会问自己。如果它这么好(而且是一个改变游戏规则的人),为什么我还要管它的使用呢?

为了回答这个问题,我要讲一个小故事。

老式节目

当我开始在大学开展我的研究时,我至少有 10 年没有从事任何编码工作,我几乎不知道 Python 的存在。我曾经用 Pascal、C 和 Fortran 中的一点点编写代码,它们是我毕业时在大学里使用的主要科学语言(我知道,那是很久以前的事了)。我既不知道 Jupyter 的存在,也不知道成千上万个不同的 Python 包中的任何一个,这可能会让人不知所措。

伯特 bUnsplash 上的照片

所以我开始了我习惯的方式。买了两本 Python 的书(没错没错…我还在用书)装了基本的 Python 解释器和一个很好的免费 IDE。快速的网络搜索让我找到了 Pycharm 社区的 T2 版本。

由于我没有 Jupyter 提供的快速可视化的优势,我创建了一个管道来预处理所有的输入数据,并测试不同的处理组合。最后,它生成了我的研究所需的所有可能的图表和输出。我被迫写一个好的代码,它很容易被复制,否则,我将不能分析一切。当我处理高分辨率卫星图像时,数据量非常大。

我花了一些时间来开发一切,但一旦工作完成,我就可以专注于在全球的不同地区,以不同的覆盖范围等来试验该算法。最终,我对结果感到满意,我的第一篇科学论文和公共 Python 包(一个卫星图像的水探测软件)发表了。你可以在 GitHub 库这里查看它们。

笔记本“编程”

通过了我的第一个研究“检查点”,我开始学习新的工具来提高我的技能,然后我安装了 Jupyter Lab(以前笔记本的更新版本)。

我的生活改变了。我记得当时在想… “为什么我之前不试试这个?”

照片由 Myriam JessierUnsplash 上拍摄

我对测试、记录和快速可视化我所做的所有事情的无限可能性感到惊讶。我甚至测试了一些最近的软件包,它们将笔记本变成了一种开发环境。这个名为**nbdev**的工具使得导出模块、创建包甚至记录全部内容变得更加容易。我想,这是两个世界中较好的一个。

然而,在另一个主题上工作了几个月,并在我的机器学习研究方面取得了相当好的成果之后,我的上司告诉了我一些害怕的话:“伟大的成果!让我们在不同的网站上进行尝试,以验证结果。”。不同的网站?验证结果?为了明天???

我对此没有准备。为了获得最初的结果,我用不同的算法、不同的预处理标准化等运行了一系列不同的机器学习测试。但重点是结果,而不是开发一个完整的加工链,我仍然在“试验”。因此,代码没有模块化,很难重现一个旧的实验,我从来没有找到笔记本上正确版本的实现,等等。等等。等等。

因此,仅仅是为一个新的位置复制结果就非常痛苦。而且要花很多时间。这让我们效率很低。对于要求苛刻的上级来说,这不是一件容易理解的事情。他只是想“…但是你已经开发了它,你已经给我看了结果,我现在所要求的是按下同样的按钮”。嗯……算是吧。

事实是,一段时间后,我做了很多不同的测试和实验,并编码,这是真的。但是我没有模块化的代码,无法发布,也无法与其他研究人员分享。我只有…一堆互不关联的笔记本,重复的功能,奇怪的名字,等等。

到最后,似乎我没有以前那么有效率了。我没有构建任何东西。我没有软件要交付。这种感觉很糟糕。

我已经在这个故事里写过科学软件设计不好的原因:科学软件设计不好的 7 个原因。而我相信,科学家“程序员”对 Jupyter 笔记本的不加选择的使用,会让这个问题变得更加严重。

卡格尔的洞察力

在我是一个狂热的笔记本用户的这段时间里,我也参加了一些 Kaggle 比赛,以提高我在深度学习方面的技能(在我看来,这是向其他 DL 从业者学习的最好方式)。比赛结束后,他们总会做的一件好事是采访获胜者。

于是有了这次采访,采访对象是一个俄罗斯人(我不记得他是哪个比赛的了)。有人问他使用的开发环境,他回答说:“我不使用 Jupyter 笔记本。我所做的一切都是通过简单的旧观念。那改变了我的想法。我是从一个有成千上万竞争者的比赛的获胜者那里听到的。很可能,他们中的大部分人直到现在还贴在他们的笔记本上。

这个故事让我重新思考我的一些误解。事实是,使用 Pycharm(或 Spyder,或 VS Code,任何其他 IDE)时,我使用笔记本的效率比开始时更低了。

这里我想指出的是:因为笔记本赋予我们的自由,所以有必要加倍承诺保持代码的干净、可复制、有组织等。有时候,这是不可行的。

图片作者。

解决办法?

现在,在我的数据科学之旅中,最适合我的是同时使用 IDE 和 Jupyter 进行开发,但目的不同。我在 IDE 上编写函数和类,放在我创建的一些新包中,然后我使用笔记本来调用包并可视化结果。这样,最终,我有了一个“现成的”包,可以与其他研究人员共享。

为了使这个设置工作,我们需要注意以下几点:

  • 创建一个新的(空)包,并使用 pip ( -e选项)在编辑模式下安装。这样,源代码将保留在原始的文件夹结构中,您可以在其上继续开发。
cd project_folder
pip install -e .
  • 使用 Jupyter 笔记本上的%autoreload分机。这将允许您在 IDE 上更新软件包,并在笔记本上检查结果,而无需重新启动内核。
# on the very first cell of the notebook
%load_ext autoreload
%autoreload 2
  • 或者,您可以将 IDE 的调试器附加到 Jupyter 内核。在 PyCharm 上,这是在运行菜单中完成的(下图)。

我目前正在开发一个新的掩模处理器,这是一个例子,展示了我现在的设置。我拥有 IDE 的所有优点(完成、参数检查等)。),调试器正常运行,最终,包“准备好”进行部署。使用 Jupyter 笔记本仅用于显示结果的另一个优点是,它可以用作新软件包的用户手册。

结论

先说清楚。我并不反对使用 Jupyter 笔记本或任何其他交互式环境,如 R 或 Matlab。我理解他们的优势,特别是对于研究和数据科学工作,重点是数据分析和实验,而不是代码生产。

然而,我们必须牢记期望是什么。通常,我们所做的最简单的数据分析应该是可重复的,并且容易与其他同事共享。

如果我们使用笔记本只是为了利用社区中已经存在的多个包并显示结果,那也没问题。但是,对于一段新的代码,一种新的处理,甚至是现有过程的简单自动化,最终可能会适得其反。

作为一名数据科学家,您认为哪种环境设置最适合您?留下你的评论和见解。

下一个故事再见。

保持联系

如果你喜欢这篇文章,并想继续无限制地阅读/学习这些和其他故事,考虑成为 中等会员 。你也可以在 https://cordmaur.carrd.co/查看我的作品集。

https://cordmaur.medium.com/membership

为什么 Python 中的装饰者是纯粹的天才

原文:https://towardsdatascience.com/why-decorators-in-python-are-pure-genius-1e812949a81e?source=collection_archive---------3-----------------------

小窍门

用一个@符号来分析、测试和重用你的代码

软件中没有什么是神奇的。但是装修工就很接近了!作者图片

If 如果说有什么东西让 Python 取得了难以置信的成功,那就是它的可读性。其他一切都取决于此:如果代码不可读,就很难维护。它对初学者也不友好——一个被不可读的代码困扰的新手不会有一天尝试自己写代码。

在装饰者出现之前,Python 已经是可读的和初学者友好的了。但是随着这种语言开始用于越来越多的事情,Python 开发人员感到需要越来越多的特性,而不要弄乱环境和使代码不可读。

装饰者是一个完美实现的特性的黄金时代的例子。确实需要一段时间来理解,但这是值得的。当你开始使用它们时,你会注意到它们并没有使事情变得过于复杂,而是使你的代码变得整洁而时髦。

首先是高阶函数

简而言之,decorators 是一种处理高阶函数的好方法。所以我们先来看看那些!

函数返回函数

假设你有一个函数,greet()——不管你传递给它什么对象,它都会打招呼。假设您有另一个函数,simon()——它在适当的地方插入“Simon”。怎么才能把两者结合起来呢?看下面之前想一分钟。

def greet(name):
    return f"Hello, {name}!"def simon(func):
    return func("Simon")simon(greet)

输出是'Hello, Simon!'。希望这对你有意义!

当然,我们本可以直接调用greet("Simon")。然而,重点是我们可能想要将“Simon”放入许多不同的函数中。如果我们不使用“西蒙”,而是使用更复杂的东西,我们可以通过将它打包成一个类似simon()的函数来节省大量代码。

其他函数中的函数

我们也可以在其他函数中定义函数。这很重要,因为装修工也会这么做!没有装饰者,它看起来像这样:

def respect(maybe):
    def congrats():
        return "Congrats, bro!"
    def insult():
        return "You're silly!" if maybe == "yes":
        return congrats
    else:
        return insult

函数respect()返回一个函数;respect("yes")返回祝贺函数,respect("brother")(或其他参数代替"brother")返回侮辱函数。要调用这些功能,输入respect("yes")()respect("brother")(),就像普通功能一样。

明白了吗?那你就可以做装修工了!

代码非常乏味。图片作者。

Python 装饰者的 ABC

带有@符号的函数

让我们试试前面两个概念的组合:一个函数接受另一个函数并定义一个函数。听起来难以置信?考虑一下这个:

def startstop(func):
    def wrapper():
        print("Starting...")
        func()
        print("Finished!")
    return wrapperdef roll():
    print("Rolling on the floor laughing XD")roll = startstop(roll)

最后一行确保我们不再需要调用startstop(roll)()roll()就够了。你知道那个调用的输出是什么吗?不确定的话自己试试!

现在,作为一个很好的选择,我们可以在定义startstop()之后插入这个:

@startstop
def roll():
    print("Rolling on the floor laughing XD")

这做同样的事情,但是在开始时将roll()粘合到startstop()

增加灵活性

为什么这很有用?这不是和以前一样消耗了很多行代码吗?

在这种情况下,是的。但是一旦你处理稍微复杂一点的东西,它就会变得非常有用。这一次,您可以将所有装饰器(即上面的def startstop()部分)移动到它自己的模块中。也就是说,您将它们写入一个名为decorators.py的文件,并将类似这样的内容写入您的主文件:

from decorators import startstop@startstop
def roll():
    print("Rolling on the floor laughing XD")

原则上,你可以不使用 decorators 来做这件事。但是这种方式使生活变得更容易,因为你不必再处理嵌套函数和无休止的括号计数。

你也可以嵌套装饰者:

from decorators import startstop, exectime@exectime
@startstop
def roll():
    print("Rolling on the floor laughing XD")

注意,我们还没有定义exectime(),但是您将在下一节中看到它。这是一个函数,可以测量 Python 中一个过程需要多长时间。

这种嵌套相当于这样一行:

roll = exectime(startstop(roll))

括号计数开始!想象一下,你有五六个这样的函数嵌套在一起。装饰符号不是比这种嵌套的混乱更容易阅读吗?

你甚至可以在接受参数的函数上使用装饰器。现在,想象一下上面一行中的几个参数,你的混乱将会结束。装修工把它弄得干净整洁。

最后,你甚至可以给你的装饰器添加参数——就像@mydecorator(argument)一样。是的,没有装修工你也可以做这些。但是我希望当你在三周内再次阅读你的无装饰代码时,你能从中获得很多乐趣…

装修工让一切变得更简单。图片作者。

应用:装饰者切奶油的地方

既然我已经满怀希望地让你相信了装修工让你的生活变得简单了三倍,那么让我们来看看一些装修工基本上不可或缺的经典例子。

测量执行时间

假设我们有一个名为waste time()的函数,我们想知道它需要多长时间。好吧,就用装修工吧!

import timedef measuretime(func):
    def wrapper():
        starttime = time.perf_counter()
        func()
        endtime = time.perf_counter()
        print(f"Time needed: {endtime - starttime} seconds")
    return wrapper@measuretime
def wastetime():
    sum([i**2 for i in range(1000000)])wastetime()

十几行代码就完成了!另外,你可以在任意多的功能上使用measuretime()

降低代码速度

有时你不想立即执行代码,而是等待一段时间。这就是慢下来的装饰派上用场的地方:

import timedef sleep(func):
    def wrapper():
        time.sleep(300)
        return func()
    return wrapper@sleep
def wakeup():
    print("Get up! Your break is over.")wakeup()

调用wakeup()可以让你休息 5 分钟,之后你的控制台会提醒你继续工作。

测试和调试

假设你有很多不同的函数,你在不同的阶段调用它们,你失去了对什么时候调用什么的了解。每个函数定义都有一个简单的装饰器,这样可以更加清晰。像这样:

def debug(func):
    def wrapper():
        print(f"Calling {func.__name__}")
    return wrapper@debug
def scare():
    print("Boo!")scare()

这里有一个更加详细的例子。注意,为了理解这个例子,你必须检查如何用参数来修饰函数。尽管如此,它还是值得一读!

重用代码

这不言而喻。如果你已经定义了一个函数decorator(),你可以在你的代码中到处散布@decorator。老实说,我认为没有比这更简单的了!

处理登录

如果你有一些只有在用户登录时才能访问的功能,那么对于 decorators 来说这也是相当容易的。我会让你参考的完整例子作为参考,但是原理很简单:首先你定义一个类似login_required()的函数。在任何需要登录的函数定义之前,弹出@login_required。很简单,我会说。

句法糖——或者为什么 Python 如此可爱

这并不是说我对 Python 不持批评态度,或者在适当的时候不使用替代语言。但是 Python 有一个很大的吸引力:它非常容易消化,即使你不是受过训练的计算机科学家,只是想让东西工作。

如果 C++是一个橙子,那么 Python 就是一个菠萝:同样有营养,但甜三倍。装饰者只是其中的一个因素。

但我希望你已经明白为什么它是如此大的甜蜜因素。句法糖给你的生活增添一些乐趣!没有健康风险,除了眼睛盯着屏幕。

祝你有很多甜蜜的代码!

为什么我(真的没有)在 50 岁重塑自己?

原文:https://towardsdatascience.com/why-did-i-really-not-reinvent-myself-at-50-75b905c50778?source=collection_archive---------19-----------------------

数据科学拯救了我

照片由 SOULSANAUnsplash 上拍摄

我厌倦了握手和亲吻婴儿,想赚更多的钱——我想有所作为。我在我认为是我想要的管理职位上度过了十多年,但他们留给我一个人的空壳,我只想回到我喜欢做的事情上。所以,我重塑了自己。

听起来很棒,很有戏剧效果,不是吗?多半是废话(空壳部分是真的)。作为一名高管,我真的想通过了解数据科学赚更多的钱,这就是为什么我在 49 岁时报名参加了数据科学硕士项目。我一直在关注和研究 AI,想要更多的细节,这样我就可以更好地销售它,并区分事实和虚构。

但是当我在读硕士课程的时候,意想不到的事情发生了;我对技术和编程的热爱(尤其是这种热爱)最初让我达到了那些专业水平,这种热爱以一种令人惊叹的方式被重新点燃。然后有一天变成的我和曾经的我面对面站在一起,曾经的我深深的失望和羞愧。我变成了我想避免的一切——物质主义、自私、傲慢、冷漠。

对我来说幸运的是,这种顿悟发生在我技术复兴的中期。我对技术的热爱一直驱使着我,没有限制,没有犹豫,现在又一次如此。我在重塑自己,这几乎完全是个意外。或许陈述这些最初时刻的更好方式是说我是被改造的

闪电击中,然后呢?

我想说,当现在的我和以前的我相遇时,我立刻辞职了,诸如此类。虽然这也非常具有戏剧性,但这也是一个谎言。我被解雇了,因为我真的不擅长销售。(我接受这份工作的时候并不知道,请注意,除了对那个前雇主的爱,我一无所有。)但在那份工作结束后,我非常肯定地知道,我需要回归基础。这一点(还有一点点运气,我一会儿会讲到)让我找到了现在的工作,挣的钱少得多,头衔也少得多,但享受、成功和给予他人的机会却多得多。这也让我有时间开始在大学教书(也令人难以置信地满足)。这也是我写这篇文章的原因。

我的杯子溢出来的咖啡少了很多。

泰勒·尼克斯在 Unsplash 上的照片

是啊,但是为什么呢?

在我看来,重新发明更多时候是一种需要,而不是一种选择。从逻辑上讲,这是有道理的——如果它没有坏,就不要修理它。这种必要性对我来说是肯定的,并回答了“为什么”这个问题。简而言之,我必须重塑自己,老实说,我的重塑一部分是需要,一部分是计划,一部分是运气。

我已经谈到了必要性部分(被解雇)。当我读研究生时,计划就开始了;我知道数据科学很重要,它就像 1995-1996 年互联网商业化一样重要(我当时在场)。在研究生院期间,我开始公开谈论离开我曾经做过的工作,以便回归数据科学的基础。其中一次对话直接把我带到了现在的位置。教学也是我最初计划的一部分,因为我不认为我会真的从事数据科学,所以我认为如果我教数据科学,我可以保持敏锐(结果是我可以做它并教它)。

幸运的部分不是一个单独的时刻,而是许多事情的结合在一起帮助了我。在我需要被推动前进的时候,我在推动我前进的东西上有技术复兴的可能性有多大?我说的那次对话让我走到了现在,它发生在伦敦,因为我认识并尊敬了很长时间的一个人恰好在那里——那个发生在的几率有多大?(我们都住在美国)有些运气是因为罗马哲学家塞内卡说过的,“运气是当准备遇到机会时。”有些只是运气不好。**

接下来是什么?

我不得不说,我现在的生活感觉非常像《终结者的最后一幕,加油站的服务员把小男孩不祥的话翻译成了琳达·汉密尔顿扮演的角色——“暴风雨即将来临。”琳达·汉密尔顿的角色用更不祥的“我知道”来回答**

丹尼尔·布索在 Unsplash 上的照片

我怀疑我的生活中会有一场风暴——更多头衔或金钱的诱惑。鉴于我的激情正在激励我,这似乎是可能的。我一生都在想,在遭遇风暴之前,琳达·汉密尔顿应该如何给她驾驶的吉普车装上车顶。不过,在我人生的这个阶段,我的观点已经改变了。我的意思是,她真的没有去任何地方,所以只是把该死的吉普车掉头,走另一条路!

搞什么鬼?

为什么强化学习要对未来的回报打折扣?

原文:https://towardsdatascience.com/why-discount-future-rewards-in-reinforcement-learning-a833d0ae1942?source=collection_archive---------13-----------------------

从数学,金融,生活,当然还有强化学习的角度讨论贴现率。

不是那种折扣。 Artem BeliaikinUnsplash 上的照片

虽然折现率是马尔可夫决策问题和强化学习(RL)的一个组成部分,但我们经常会不假思索地选择 γ=0.9γ=0.99 。当然,当被问到时,我们会有一些直觉,比如“今天的回报比明天的回报更有价值”或者“补偿不确定性”。当被追问时,你能为为什么这些直觉成立辩护吗?为什么挑 γ= 0.8 而不是 γ= 0.9?不确定性不是已经纳入期望值了吗?如果你没有现成的即时答案,这篇文章可能会对这个问题有所启发。

🧮数学中的折现

从严格的数学角度来看,贴现率的目的是显而易见的,至少对于无限期问题是如此。从贝尔曼的递归方程中,我们学会了求解状态序列的值函数:

如果那个数列是无穷的,那么奖励数列也是无穷的。考虑以下累积奖励序列 G_t :

G_t = R_t + R_t+1 + R_t+2 + … = 1 + 1 + 1 + … = ∞

众所周知,对一个无穷奖励级数求和会产生无穷奖励,使得方程组无解。幸运的是,加上贴现率γ∈【0,1】会产生一个收敛的几何级数。例如,如果我们设置 γ=0.8 ,我们得到:

*G_t = γ⁰R_t + γ¹R_t+1 + γ²R_t+2 + … = 1 + 0.8 + 0.64 + … = 5*

有了这个技巧,我们可以将值附加到状态上,并求解贝尔曼方程组。当然,在强化学习中,这个解决方案是近似的。

这解释了无限的情况,但是为什么要为有限时间范围的贴现而烦恼呢?你可能会说我们补偿了不确定性,但这不是已经反映在预期价值中了吗(用未来回报乘以它们的概率)?数学的观点不能解决这个问题,我们需要深入人类的心灵。

金融中的贴现💸

有什么比金钱更能诠释人类的精神?

投资的一个重要组成部分是存在一个无风险利率。这是在没有任何不确定性或违约风险的情况下可以获得的回报,作为所有其他回报的基准。美国国债经常被用作代理。将 1 美元投入 2%的美国国债,一年后你将获得 1.02 美元的保底收益。因此,我们更喜欢今天的 1 美元,而不是明年的 1 美元。不需要努力,我们的财富每年可以增长 2%,因此我们会将未来的回报折现 2%,以反映的时间价值

当考虑股票等风险工具时,这变得更有意思了。假设一只股票从现在起一年后会上涨 0%或 4%,两者的概率都是 0.5。的预期收益是 2%。然而,空手而归的可能性很大。在这种情况下,典型的投资者会更喜欢无风险的 2%债券,尽管预期的收益是相等的。由此可见,股票回报的折现率高于债券回报。

这种现象被称为避险 。人们期望不确定性得到补偿,否则他们会选择更安全的替代方案。不确定性越多,折现率越高。也许我们会选择收益率为 10%而不是 4%的股票(将预期收益提高到 5%)。投资需要在补偿时间价值的基础上提供一定的风险溢价

仍然有许多话题没有触及,例如使用指数贴现的趋势(类似于 RL)、机会或后悔成本(你只能投资一次)、冒险行为(从理性投资者的角度来看,彩票几乎没有意义),以及奇怪的不一致边界情况。现在,让我们确定贴现率既反映了时间价值又反映了风险溢价的基本原理。

生活中的折扣⏳

贴现行为不仅限于美元。在日常生活中,我们不断地平衡短期满足和长期后果,权衡确定性和不确定性。晚睡,明天会很累。冬天尽情地吃,夏天你需要减掉脂肪来打造海滩身材。现在没日没夜地学习,希望以后有所收获。

指数贴现和双曲线贴现的比较。前者通常用于强化学习,后者根据经验在人类中观察到。图片来自维基媒体

在这个问题上已经进行了无数的心理学研究,表明人类在决策中倾向于执行类似于双曲线贴现的东西。手臂上纹有及时行乐纹身的人很可能对未来的奖励大打折扣,其他人可能会更看重它们。尽管个人之间存在差异,但我们所有人都在某种程度上打了折扣。

这种现象的一个非常自然的原因是风险率——我们无法活到明天收获回报的概率。尽管急性死亡的风险不像我们狩猎采集的祖先那样高,但偏好奖励的生物冲动现在仍然非常完整。危险不需要像死亡一样病态。膝盖受伤可能会缩短运动生涯,而五年后的亚洲背包旅行也可能无法实现。即使在最平庸的层面上,我们也更喜欢现在吃一块饼干,而不是下周吃一块。

作为人类,无论明智与否,我们只是天生倾向于把现在的回报看得比(遥远的)未来更高。

强化学习中的折扣📖

现在我们对人类贴现的基本原理有了一些了解,但是这种推理对强化学习问题成立吗?尽管神经网络和人脑之间存在一些松散的联系,但典型的 RL 算法并不是为了模仿人类行为而设计的。危险率也是一个易受影响的基本原理,因为我们可以将危险模拟到环境中。例如,一个悬崖行走游戏在代理人踏入悬崖时结束——我们不需要额外打折来反映心脏病发作或脚趾受伤。一个相反的论点是,这种危险可能发生在政策没有经过训练的环境中,利用贴现率作为一种稳健性手段。

对于许多 RL 问题,不贴现未来的奖励是完全可以接受的。尽管如此,即使是有限的时间范围,也有充分的理由对 RL 进行贴现。其中之一是决策对长期绩效的实际影响。最终,由建模者决定什么样的折现率最能反映问题背景下的累积回报。

假设今晚我必须在清淡和丰盛的晚餐中做出选择。这个决定可能会影响我之后的健身课,但可能不会影响我明年的晋升。在这里,我们看到了贴现未来回报的明确理由——一些后果很难与今天的行动联系起来。RL 的目的是纳入当前决策的下游影响,然而未来的回报可能是不相关的。一般来说,环境越随机,我们的行为对绩效的持久影响就越小。

StackExchange 上的一个答案以一种有趣的方式形式化了这个概念,表达了一个参数 τ ,它反映了我们感兴趣的时间间隔:

和以前一样,假设回报总是 1。随着 γ=0.8 ,级数收敛到 5。实际上,超过五个时间步长的奖励——注意e^(-1/5)≈0.8——几乎没有影响。类似的,一个级数在 γ=0.9 时收敛到 10,在γ=0.99 时收敛到 100。请注意:在 t+τ 之后突然获得+100 奖励仍然会对折扣奖励产生重大影响,但是根据的经验法则这种方法是有意义的。如果你认为五个时间步后的回报与现在所做的决定没有什么关系, γ=0.8 可能是一个合适的贴现率。

希望这篇文章在贴现率的话题上提供了一些清晰度,然而它仅仅触及了表面。有人认为整个概念对于函数逼近(我们通常在 RL 中使用)是有缺陷的,并且平均奖励是比贴现奖励更好的衡量标准。另一个有趣的方法是放弃固定贴现率的概念,转而使用依赖于州的贴现率。考虑到人类的偏好,一个全新的世界就展现出来了。

的确,那个小小的参数 γ 隐藏了很大的深度。

外卖食品

  • 贴现通常是解决无限期问题所必需的。折扣率 γ < 1 确保了回报的几何级数收敛。
  • 从金融学中,我们了解到贴现反映了时间价值和风险补偿。像在强化学习中一样,指数贴现通常是假定的。
  • 人类天生倾向于对未来回报进行贴现(接近双曲线贴现),风险率是一个重要的生物学原理。
  • 对于有限范围的问题,是否需要贴现很大程度上取决于问题的性质和建模者的偏好。
  • 随机环境要求贴现率不那么强调未来回报;当前奖励对遥远未来的影响很小。贴现率隐含地反映了你希望预测的时间步数。

进一步阅读

达斯古普塔和马斯金(2005 年)。不确定性和双曲线贴现。https://scholar . Harvard . edu/files/maskin/files/uncertainty _ and _ 双曲线 _ 贴现 _aer.pdf

Fedus,w .,Gelada,C .,Bengio,y .,Bellemare,m .和 Larochelle,H. (2019)。双曲线贴现和在多个时间跨度上的学习。【https://arxiv.org/pdf/1902.06865.pdf

Investopedia (2021 年)。折扣率。【https://www.investopedia.com/terms/d/discountrate.asp

Investopedia (2021 年)。风险溢价。https://www.investopedia.com/terms/r/riskpremium.asp

卡尼曼博士(2017)。思考,忽快忽慢。

纳伊克,a .,沙里夫,r .,Yasui,n .,姚,h .和萨顿,R. (2019)。折扣强化学习不是一个优化问题。https://arxiv.org/pdf/1910.02140.pdf

Pitus,S. (2019 年)。再思考强化学习中的折扣因子:决策理论方法。https://arxiv.org/pdf/1902.02893.pdf

StackExchange (2016)。理解折扣因子在强化学习中的作用。https://stats . stack exchange . com/questions/221402/understanding-the-role-of-discount-factor-in-reinforcement-learning

维基百科(2021)。几何级数。https://en.wikipedia.org/wiki/Geometric_series

为什么生物信息学家避免使用 Windows?

原文:https://towardsdatascience.com/why-do-bioinformaticians-avoid-using-windows-c5acb034f63c?source=collection_archive---------16-----------------------

生物信息学

为什么几乎每个生物信息学家都使用 Linux 而不是 Windows 的原因列表

从 Pixabay 打开剪贴画的图像

简介

在我们触及主题之前,让我先向你介绍一下生物信息学。生物信息学是连接计算研究(计算机科学、统计学、数据工程)和生物学的一门学科。生物信息学家帮助生物学家存储非常大的生物数据,执行计算分析,并将生物查询转换成可理解的结果。

如果你是一名生物信息学家,或者曾经与生物信息学家共事过,你可能会意识到一件事。生物信息学家的大部分工作都不使用 Windows。

原因其实很简单。是因为大部分生物信息学的工作都无法在 Windows 下完成。即使这是可能的,还有很多其他问题。下面的列表解释了为什么生物信息学家更喜欢 Linux 而不是 Windows。

图片由打开剪辑 Ar t 来自 Pixabay

为什么要用 Linux 做生物信息学?

1.大多数生物信息学工具只在 Linux 中可用

不幸的是,生物信息学工具选项在 Windows 中非常有限。大多数标准的生物信息学软件,例如用于基因组组装、结构注释、变体调用和系统进化树构建的软件都是专门为 Linux 编写的。

你可以争辩说,仍然有一种方法可以在不使用 Linux 的情况下访问这些生物信息学工具。我们可以尝试使用 Galaxy,这是一个在线平台,包含常用的生物信息学工具,如 FastQC、BWA-MEM、SAMtools、FreeBayes、BCFtools 等等。然而,尽管 Galaxy 是一个很好的平台,但也有一些限制。

  1. 时间
    因为你正在银河服务器上运行程序。该过程可能需要一段时间才能完成,因为您正在与许多其他用户共享服务器。
  2. 内存
    Galaxy 在内存分配方面是相当慈善的。您的 Galaxy 帐户将获得 250 Gb 的免费配额。但是如果你超过了这个限制,那么你需要下载并删除你的文件来释放一些空间。
  3. 有限的工具选项
    这也许是生物信息学家仍然喜欢在 Linux 中做生物信息学的主要原因。即使在 Galaxy 中有如此多的选择,生物信息学领域是如此之大,以至于 Galaxy 不能集成每一个生物信息学工具。例如,有可能我不得不使用一个非常合适的函数,比如 computeGCBias,来进行 GC 偏差校正。像这样的利基功能在 Galaxy 中不可用,尽管该功能自 2012 年以来一直可用。

如果你对计算生物学的银河软件感兴趣,在这里 查看一下

2.Windows 处理生物数据的速度非常慢

有没有试过在 Windows 下用记事本打开一个很大的 FASTA 文件或者基因表达文件?我打赌它不行,因为记事本的大小限制是 58 Mb。像这样的大型生物文件不能直接用文本编辑器或电子表格应用程序打开。

图片来自 PixabayHassan

我们经常做的是查看文件的标题(或者列名,如果是表格的话)并获得一些理解。在 Linux 中,使用 head 或 tail 可以轻松地查看数据。

在 Linux 中,执行简单的数据争论也很容易。我们只对检查唐氏综合症的 21 号染色体感兴趣吗?使用 grep 并将输出重定向到不同的文件。我们要不要把多个 FASTA 文件组合起来做进化树构建?很简单,使用 cat 并将输出重定向到一个新的 FASTA 文件。

3.Linux 有内置的编程语言

Linux 的另一个好处是,它有几个内置的编程语言,随安装一起提供。在文件转换之后,生物信息学的下一步是数据分析。在 Ubuntu(最常用的 Linux 发行版)中,已经安装了 Perl 和 Python,可以直接使用。

如果我们想用其他语言进行数据分析呢?例如,我是一名 R 程序员,但 Ubuntu 中没有预装 R。幸运的是,在 Ubuntu 中安装 R and R 工作室非常容易,因为大多数(如果不是全部)编程语言在每个 Linux 发行版中都可用。

4.在 Linux 中创建生物分析管道可以很容易地完成

生物信息学家做的一个好的实践是自动化他们的管道。例如,从头到尾自动化基因组装配流水线将是一个好主意。如果没有自动化,我们需要运行每一行并等待它完成(这可能需要一段时间,因为生物数据通常非常大),然后手动运行下一行。

生物信息学家封装所有这些过程的一种常见方式是在一个Bash 脚本中列出它们。使用 Bash 实现管道自动化并不是我们在 Linux 中唯一可以做到的方式。我个人最喜欢的管道自动化方法是使用 Snakemake ,这是一个创建可重复和可扩展数据分析的工具。点击这里阅读更多关于 Snakemake 的信息。

5.Linux 是免费的

Linux 是一个免费的开源操作系统,任何人都可以安装、学习、修改甚至重新发布。因为所有的 Linux 发行版都是开源的,所以 Linux 发行版的开发和进步来自社区,也为社区服务。如果你有一个专门用于生物信息学工作的指定平台(笔记本电脑或台式电脑),为什么不选择免费的呢?

在那里你可以使用视窗进行生物信息学

既然我已经结束了对 Windows 的抨击和对 Linux 的赞美,那么实际上有一个实例表明生物信息学家使用 Windows 是没问题的。

图片由200 度像素点

数据分析和结果解释

在生物信息学中,整个计算流水线可以分为两个部分,数据转换和数据分析步骤。对于数据转换,生物信息学的选择非常有限。例如,从 FASTA 到 CSV 文件的生物文件转换在 Linux 上比在 Windows 上有更少的限制。然而,对于数据分析来说,情况完全不同。

用于生物数据分析或结果解释的三种最常见的编程语言是 Python、R 和 Perl。这 3 种语言在 Windows 中都是完全支持的。从创建用于乳腺癌预测的机器学习模型到使用曼哈顿图的不同密度可视化,所有这些分析都可以在 Windows 中使用这三种语言来完成。请记住,您也可以在 Linux 中进行这些分析,但是一旦您到达了生物信息学管道的这一部分,请随意选择您的操作系统。

结论

生物信息学家经常使用 Linux,因为我们在 Windows 中的选择非常有限。常见的生物信息学工具,如 FastQC、BWA-MEM 和 SAMtools 在 Windows 中不可用。确实有允许我们利用这些工具的在线平台,但是它们仍然没有摆脱限制。但是,如果您正在进行数据分析步骤,选择 Linux 还是 Windows 取决于用户。

感谢你阅读这篇文章!你同意我的想法吗,或者已经找到了一种即使在 Windows 下也能进行生物信息学工作的方法?欢迎在下面的评论中发表你的想法。

为什么人类的学习速度比机器学习模型快那么多?

原文:https://towardsdatascience.com/why-do-humans-learn-so-much-faster-than-machine-learning-models-cab0f5c111b6?source=collection_archive---------5-----------------------

当我们使用单词嵌入的魔力来说明对世界的理解时,会产生更好的机器学习模型

介绍

为什么人类可以在大约 50 小时内学会如何驾驶汽车,而机器学习(ML)模型需要数千小时的驾驶数据?在我看来,这种巨大的差异是由人类对周围世界有着与生俱来的理解这一事实造成的。如果我丢下一个鸡蛋,我可以预测鸡蛋一落地就会碎。此外,即使我没有把玻璃杯掉在地上,我也可以从鸡蛋的破裂推断出玻璃杯在撞击时也可能会破裂。将此转化为驾驶环境:当我在路上看到另一辆车时,我可以通过想象在这种情况下我会做什么来预测这辆车会做什么。这种对我们周围世界的理解以及我们在特定情况下准确推理结果的能力给了我们在 ML 模型上的巨大优势。

在使 ML 模型能够模仿人类的理解能力方面已经取得了很大的进步。一个很棒而且很神奇的例子是单词嵌入。在这篇文章中,我将挑选出一组经过训练的单词嵌入,并解释为什么在我看来它们显示了对我们生活的世界的真正理解。此外,我想传达我的绝对魅力,从一个简单的训练计划中可以产生对我们世界的微妙理解。

但是到底什么是单词嵌入呢?

单词嵌入是将文本数据表示为数字的一种方式,如果您想将文本输入到 ML 模型中,就需要这种方式。单词嵌入使用比如说 50 个特征来表示每个单词。在这个 50 维空间中靠得很近的单词意思都差不多,比如appleorange。我们面临的挑战是如何构建这 50 个特征。

已经提出了多种方法,但在本文中,我们将重点放在手套词嵌入。手套单词嵌入是从语料库中单词的共现矩阵中导出的。如果单词出现在相同的文本上下文中,Glove 假设它们的意思相似。这已经给出了第一个暗示,单词嵌入学习对它们训练的语料库的理解。

如果在一个给定的上下文中使用了大量的水果,单词 embeddings 将知道apple将适合那个地方。即使训练集从未在特定的上下文中使用过单词apple,这也是有效的。通过单词嵌入学习的世界的表示,单词嵌入允许训练更加灵活。

加载预训练的手套单词嵌入

为了真正挖掘单词嵌入的力量,我们将加载一些预训练的手套单词嵌入并探索它们。我使用的 50 个特征词嵌入:

array([ 0.08414142,  0.0502594 , -0.08301819,  0.02449763,  0.06950121],
      dtype=float32)

单词嵌入存储为空格分隔的文本文件,其中第一个条目是单词,其他条目是嵌入值。上面的函数只是将它读入一个大字典,其中单词是键,嵌入值是值。

单词嵌入的简单推理

最简单的推理形式是单词在单词嵌入特征空间中彼此有多相似。我们现在面临着可视化 50d 嵌入空间的挑战,这实际上是不可能的。为了可视化的目的,我们使用 PCA 将 50d 的嵌入空间减少到仅仅 2 维。在下图中,我们展示了一些从动物到水果的单词:

这里出现的模式是有意义的:

  • 不同的类别在嵌入空间中聚集在一起。
  • mouse介于PC stuffanimal类别之间。
  • horse介于animaltransport类别之间。

令我惊奇的是这种理解的微妙之处。一个mouse既可以是动物,也可以是 PC 外设。但是魔法并没有就此结束,兔子洞还要深得多。

更复杂的推理:关系

除了单独看单词,我们还可以看单词之间的关系。例如,单词franceparis之间的向量描述了关系capital of。让我们画出一些国家资本对的向量:

底部的国家和顶部的首都之间的向量大致相似。这表明单词嵌入学习了关系capital of。我真的很惊讶,仅仅通过查看输入文本中哪些单词出现得彼此接近,就出现了像capital of这样复杂的关系。

但是巫术并没有就此结束。有了这些单词嵌入,我们可以使用向量演算来执行一些真正令人惊奇的推理:

'warsaw'

这个结果真的让我大吃一惊(你现在可能已经发现我喜欢单词嵌入:)。我们可以取paris,从中减去它的国家,再加上一个新的国家(poland,就得到那个国家的首都:warsaw。这确实显示了嵌入这个词所包含的复杂的理解。

包扎

我希望到现在为止,我已经让你们相信,单词嵌入确实获得了对语料库所描述的世界的理解。这种理解可以被将这些单词嵌入作为输入的 ML 模型所利用。我认为 ML 模型理解我们生活的世界是建立更好的 ML 模型的重要组成部分。新的人工智能概念,如变形金刚,在将这种理解提升到一个新的水平上显示出更多的希望。

最后一点,真正的“理解”是什么。有人可能会说,单词嵌入并不真正代表人类意义上的理解。这只是一个隐藏在层层数学背后的非常复杂的派对把戏。话说回来,我们对世界的理解不也是大量神经元的一种自然属性吗?

你喜欢单词嵌入吗,你和我一样惊讶吗?还是你更怀疑?让我知道!

文章、代码和数据可以在 githubT10【上找到https://github.com/PaulHiemstra/wordembedding_magic

我是谁?

我叫 Paul Hiemstra,是荷兰的一名教师和数据科学家。我是科学家和软件工程师的混合体,对与数据科学相关的一切都有广泛的兴趣。你可以在 medium 上关注我,或者在 LinkedIn 上关注我。

如果你喜欢这篇文章,你可能也会喜欢我的其他一些文章:

为什么 ML 工程师努力构建值得信赖的 ML 应用?

原文:https://towardsdatascience.com/why-do-ml-engineers-struggle-to-build-trustworthy-ml-applications-b552220a308a?source=collection_archive---------30-----------------------

行业笔记

论理论与实践的差距及其弥合

亚历克斯·塞尔班和约斯特·维瑟

虽然关于人工智能的伦理的研究近年来显著增加,但从业者往往忽略了来自其 ML 组件的不公平或不公正的风险。这是斯坦福大学以人为中心的人工智能小组最近发布的 2020 年年度人工智能状态报告的见解之一。

理论与实践之间为什么会存在这种差距,如何才能弥合?

在我们自己的研究( SE4ML )中,我们从几个角度探讨了这个问题,特别是针对机器学习(ML)的主要 AI 子领域。

一方面,我们研究了 ML 工程实践及其在 ML 工程团队中的采用水平。另一方面,我们研究了政策制定者制定的可信 ML 的要求。最后,我们调查了一系列决策驱动因素对于 ML 系统的架构师的相对重要性。

正如我们在下面更详细地讨论的,我们的总体结论是 ML 工程团队缺乏具体的行动过程来设计和构建他们的系统,特别是满足可信性需求,例如安全性、健壮性和公平性

此外,我们可以得出这样的结论:从业者意识到由 ML 组件的不适当开发引起的伦理和健壮性风险,但是目前受到更传统的关注的约束,例如扩展他们的系统,或者在训练和测试之间保持性能。

什么是 ML 工程实践?

ML 工程是一门与开发工程原理有关的学科,用于设计、开发、操作和维护具有 ML 组件的软件系统。

为了促进从业者采用工程原则,我们从对从业者的采访以及对从业者博客和学术文献的广泛回顾中系统地提炼出可操作的工程实践。由此产生的实践描述在我们的网站上进行分类。

此外,我们测量并公布了这些实践的采用率及其感知的效果,以便允许评估和比较使用 ML 组件构建软件的工程师团队。

如果你是用 ML 组件构建软件系统的团队成员,你可以通过 参加我们关于 ML 工程实践的 10 分钟调查 来为我们的研究做出贡献。

值得信赖的 ML

随着政策制定者最近对解决机器学习(ML)的不当使用的兴趣,我们努力扩展我们的实践目录,以包括可信 ML 的操作实践。

特别是,我们遵循了欧盟委员会人工智能高级专家组制定的可信人工智能要求,该要求将可信人工智能定义为合法、符合道德和稳健,并定义了可信人工智能的七项关键要求

受这些需求的启发,我们搜索了工程实践的文献,这些工程实践可以被开发者直接应用来解决 ML 组件的道德和健壮的开发。总的来说,我们确定了 14 个新的实践 ,其中包括诸如偏倚测试、确保安全性或让第三方审核应用程序等主题。

对于所有新的实践,我们将相关工作总结为一个知识体系,该体系遵循与我们目录中以前的实践相同的结构,包括详细描述、意图的简明陈述、动机、适用性、相关实践和参考资料。

值得信赖的洗钱行为的采用率仍然很低。在我们的 ML 工程实践目录中详细定义了这些值得信赖的 ML 的 14 种实践。

我们还扩展了我们的调查来衡量开发 ML 解决方案的团队对可信度实践的采用。不幸的是,我们发现可信 ML 实践的采用率相对较低(如上图所示)。

特别是,与确保 ML 组件的安全性相关的实践采用率最低。造成这些结果的因素是多种多样的。例如,大多数针对对抗性例子的防御——一种对 ML 组件的已知威胁——已经被突破。此外,对数据中毒攻击的研究表明,只有一小部分训练数据需要修改才能诱发恶意行为。我们认为缺乏 ML 组件安全问题的“现成”解决方案是我们结果的最大贡献因素。

ML 系统的体系结构

在一项平行的研究中,我们调查了从业者如何定义具有 ML 组件的系统的软件架构,我们要求从业者为他们的系统排列最重要的决策驱动因素。

我们再次发现,与可信 ML 相关的决策驱动因素,如安全性、隐私性或健壮性,被认为不如性能或可伸缩性等更传统的驱动因素重要(如下图所示)。

使用 ML 组件的系统的架构决策驱动因素。与可信度相关的驱动因素往往被认为不太重要。

这些结果意味着实践者仍然致力于解决开发和操作 ML 组件的基本问题,并且倾向于忽略可信 ML 需求的重要性。

观点

我们相信,通过软件工程的眼光来解决道德和健壮性的持续努力将增强从业者的能力来优先考虑这些需求并开发值得信赖的 ML 组件。

此外,我们认为采用特定于可信度的和通用的 ML 工程实践是相互关联的。例如,持续集成的实践可以使偏差测试的实践更加有效。

因此,我们正致力于定义一系列传统的工程和信任相关的实践,从业者可以直接应用这些实践来开发更道德和更健壮的 ML 组件。

阅读我们的出版物,了解更多关于可信 ML 的实践。

Alex Serban 是 Radboud 大学的博士生,也是莱顿高级计算机科学学院的客座教授。

Joost Visser 是莱顿大学软件和数据科学教授。

SE4ML 项目 中,我们研究了软件工程原理和实践需要如何适应或补充包含 ML 组件的软件系统。

如果您是使用 ML 组件构建软件系统的团队成员,您可以通过 参加我们关于 ML 工程实践的 10 分钟调查 来为我们的研究做出贡献。

为什么组织需要数据策略?

原文:https://towardsdatascience.com/why-do-organisations-need-a-data-strategy-54eca1e4c4e8?source=collection_archive---------58-----------------------

在这个数字时代,你需要正确的数据来保持领先

本质上,这个问题的答案非常简单。如果你想获得成功,你需要定义你的愿景,你的使命,你的目标。一个组织,就像个人一样,应该知道它代表什么。它想要达到的目标。我认为在创建数据策略时有 4 个重要因素需要考虑,我想在这篇博客中强调一下。

你的组织前景如何?—作者图片

1。了解你的组织代表什么

数据战略只不过是一项业务战略,只是它明确强调了您将如何利用数据、信息和 it 来实现您的目标。这是从商业的角度来看,你需要什么信息才能成功?重新审视您的业务策略,突出或添加数据和信息组件,对于确定数据管理的优先级大有帮助。

2。正式化和授权数据管理功能

它已经与几乎所有的业务活动交织在一起,了解您的组织中哪些角色具有数据管理职能非常重要。支持这些员工—确保 IT 支持他们。他们需要能够提取完成工作所需的数据和信息,而不会遇到麻烦。确保减轻他们的负担,帮助他们,节省他们的时间。看到员工不得不经常改变他们的工作方式是很疯狂的,因为它没有做它应该做的事情。他们找到变通办法来使收支平衡,但这远非有效。因此,确定哪些员工收集信息,并将这一职责正式化。

3。建立沟通和反馈渠道

收集信息的员工(也称为数据管理员)通常没有与更高层管理人员直接沟通的渠道。然而,它们在数据管理流程和收集信息的质量方面发挥着至关重要的作用。我经常看到数据管理员有非常具体的反馈,可以帮助改进 IT 系统,但他们没有良好的反馈渠道来传达这些反馈。如果一棵树倒在森林里,没有人看到它——它会发出声音吗?我有客户解释说他们不想在内部网讨论。但我认为这正是关键所在。创造空间来创造共同理解和共同目标。如果内部网不是合适的地方,确保你定义了什么是。

4。确保对成功的价值和资金进行客观评估

知识就是力量。仅仅通过做他们所做的事情,有价值的和专业的信息组织收集的东西是非常不可思议的。但是如果没有数据策略,数据单一化的价值和潜力往往会被忽视。确保您有一个组织范围的流程来收集和传递数据管理改进计划。通过商业案例将它们正式化,这样就可以对它们进行客观的评估。收集和庆祝好主意!此外,确保高级管理层资助和支持变革。

为了取得成功,一个组织应该知道它代表什么。这不仅包括你想要达到的目标,还包括你达到这些目标所需要的数据。这就是组织需要数据策略的原因。没有正确的信息,很难做出正确的决定。通过清楚地定义你需要什么数据,什么责任应该被正式化就变得很清楚了。赋予员工数据管理职能,奖励他们执行这些任务,建立反馈沟通机制,并为数据管理计划提供资金。采取这些步骤将使您的数据管理组织以一种有机的方式变得成熟。那么,你的组织代表什么?

为什么我们要自动化数据收集?

原文:https://towardsdatascience.com/why-do-we-automate-data-collection-1fb0fdcf8fc2?source=collection_archive---------33-----------------------

图片鸣谢:作者原创插图。

我们自动收集数据,以节省时间、减少错误、增加严谨性并提高可重复性

简介和方法

A 在最近一篇关于获取联邦数据的文章中,我展示了如何使用 Python 来自动化从美国教育部(US DOE)获取数据,然后将这些数据组装成一个面板数据集的过程之后,我开始收到一些问题。

你为什么要为此大费周章地写代码呢?直接下载文件,然后用鼠标点击来组合数据,不是更快吗?

答案是,看情况。我做了一个实验。在执行这个实验的过程中,我记录了自己使用点击技术用美国能源部的数据组装一个六年数据面板的过程。我首先下载了数据文件。我还下载了美国能源部提供的支持清理和数据准备代码。然后,我使用 Stata(它提供了一个指向和点击界面,还提供了编写工作脚本的选项)。Stata 让我演示一下,并及时测量一下,在不写代码的情况下,编译这个六年的数据面板需要多长时间。

结论是,编写从获取数据的过程的脚本不会比点击选项花费更多的时间。

下面的文章介绍了这个实验的结果。在展示了结果之后,我还展示了一段视频,展示了我在延时摄影中的所有努力。这个视频在屏幕上显示了我所有的动作。我也有视频记录我在实验中用键盘和鼠标做了什么。我对视频进行了解说,以提供额外的背景。

证据和结果

整个过程从开始到结束需要 32 分 39 秒。在这 32 分钟里,我整理了一组数据,包括一个重复了六年的调查文件。来自美国能源部的数据也提供了几十个其他的调查文件。如果我只想添加一个额外的调查文件(针对这六年中的每一年),我们可以推断出大约 65 分 20 秒的时间承诺。

如果我想要这两个调查文件的 12 年数据面板,我们可以推断出超过 130 分 40 秒的时间承诺。或者,总共是 2 小时 10 分 40 秒。

但是,请记住,当您希望添加额外的调查文件或增加额外的年份时,数据汇编过程会变得更加复杂。数据类型会随着时间而变化。数据变量名会随着时间而改变。其他惯例也会随着时间而改变。

随着时间的推移,处理和管理这些变化的过程增加了使用点击工具完成这些任务所需的时间。

2 小时 20 分 40 秒是最好的情况。所需的时间可能会更多。

我猜测,上述 2 小时 20 分 40 秒的推断可能需要将近 3 或 4 个完整小时,这都取决于你可能选择汇编哪一年和哪一个调查文件。

这个视频提供了我在这篇文章中写的点和点击的延时视图。

上面的视频显示了我在本文中写的点和点击的时间推移视图。点击此处观看视频。如果你正在寻找我为这篇文章和视频收集的数据,请联系我。

为什么这真的很重要

真正重要的原因是,如果你编写了这个过程,你就有可能在职业生涯中节省数百或数千个小时,而不是使用点击来获取和汇集你的数据。

通过编写这个过程的脚本,您可以通过以下方式节省时间。

  1. 假设下载和汇编由大约 12 年的数据和大约 2 到 3 个调查文件组成的面板数据需要 3 到 4 个小时,那么编写解决方案的前期投资可能会少于 3 到 4 个小时。这样可以节省时间。
  2. 如果您花时间预先编写一个解决方案,而不是使用点击式方法,但是在项目后期(几天或几周后)您意识到您在数据收集和处理过程中犯了一个错误,您可能会面临再花 3 到 4 个小时来纠正您的错误的前景。使用编码的解决方案,您可能会花费不到一个小时来更新代码以纠正错误。一旦更新,代码将在瞬间运行,而不是几个小时。这防止了错误并节省了时间。
  3. 如果稍后在您的工作的传播过程中,您得到了关于您无法回答的数据准备的问题,也许是因为您不记得您指向和点击的确切位置,您将面临花费数小时复制您的工作以便回答任何问题的前景。使用编码的解决方案,您可以查看代码,它为您的答案提供了每一步的精确记录。这防止了错误,节省了时间,并增加了严谨性。
  4. 您可能会在以后决定继续或扩展您的工作。为了建立或扩展您的工作,您可能需要补充或扩充您的原始数据文件。如果您使用点击来构建原始数据文件,您可能会面临花费数小时来扩充原始数据文件的前景。有了编码的解决方案,更新原始代码可能会快得多。在这些更新之后,代码将再次在瞬间运行,而不是几个小时。这样可以防止错误,节省时间,并增加严谨性。
  5. 随着时间的推移,你或其他人可能会检查你的结果。你或其他人可能会用新数据来检验你以前的结果。如果您有一个获取和编译数据的编码解决方案,您将有机会快速收集和编译原始数据。您还将有机会使用原始代码作为模板来收集和编译新数据。使用和引用原始代码将节省时间。这样可以防止错误、节省时间、增加严谨性并提高再现性。

https://adamrossnelson.medium.com/membership

结论

为了准备这篇文章,我展示了一项实验的结果,该实验旨在测试我们可能会花费多少时间从网上获取数据,然后将这些数据汇编成适合于面板数据分析的格式。我表明,要编制一个由 2 个调查文件组成的 12 年面板,至少需要 2 小时 10 分 40 秒。

上面是一个视频链接,记录了我的实验。对于任何联系我询问的人,我将提供一份我通过这一点和点击过程收集的数据。

这篇文章回答了几个具体问题。

你为什么要为此大费周章地写代码呢?直接下载文件,然后用鼠标点击来组合数据,不是更快吗?

这些问题的答案是,下载并使用点击工具来收集数据并不一定更快。我还认为,使用编码的解决方案,不仅节省时间,而且可以防止错误,增加严谨性,并支持可再现性。

感谢阅读

感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。Twitter:@ adamrossnelsonLinkedIn:Adam Ross Nelson 在 Twitter 和脸书: Adam Ross Nelson 在脸书

posted @ 2024-10-17 11:33  绝不原创的飞龙  阅读(402)  评论(0)    收藏  举报