TowardsDataScience-博客中文翻译-2019-六十五-

TowardsDataScience 博客中文翻译 2019(六十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

1.0.3 中 Julia 语言的严重缺点

原文:https://towardsdatascience.com/the-serious-downsides-to-the-julia-language-in-1-0-3-e295bc4b4755?source=collection_archive---------2-----------------------

我已经说了很多我有多爱茱莉亚。如果有人问我现在最喜欢的编程语言是什么,我肯定会回答“Julia”。另一方面,我不太谈论的是我不喜欢朱莉娅的地方。虽然今天我想谈谈我对这种语言的一些弱点和个人不满,但我坚信使用 Julia 的好处大于可能必须做出的任何妥协。如果你从未使用过 Julia,我强烈建议你去看看!有了我的推荐,我也将开始抱怨我如此热爱它的原因。

我喜欢朱莉娅的地方

朱莉娅了解自己

Julia 非常喜欢函数式语言,并且喜欢函数式语言。我在我的循环速度测试中展示了一个很好的例子,Julia 在函数递归方面做得非常好。

函数递归循环是我个人在做统计工作时最喜欢使用的外观。然而,通常在其他语言中,比如 Python,每当使用递归时,我们都会遇到速度上的障碍,我认为这对于统计计算来说是一个很大的缺点。

朱莉娅打破了规则

好的,Julia 是一种用于统计的函数式语言…

一定很低级。

Julia 确实打破了规则,每年它似乎都在一点点接近 Python 那样的多功能性。

Genie 是一个很好的例子,因为它实际上是一个在 Julia 内部开发 web 后端和管道的框架,如果我自己这么说的话,这是一个相当高级的框架。

就在时间之前

朱莉娅速度很快,我不是随便说说。Julia 的典型运行速度与 c 语言相似。这使得部署速度比需要进行计算的传统基于 Python 的 web 应用程序更快,特别是如果您要部署到非活动服务器,例如 Heroku 上。Julia 能够处理和操作你甚至无法读入 Python 的数据。当处理 2000 万到 3000 万的数据集时,Julia 的速度和效率实在是微不足道,而且计算时间还不到 20 秒。

虽然我不会说 Julia 一定会取代 Scala,但我想说的是,它肯定有潜力取代 Scala。当我可以使用 Julia 时,我发现自己几乎不需要使用 Spark,这很好,因为我有下一个优势:

简单快捷

当然,快速不是指我们讨论过的速度,而是指努力的时间。通常在像 Julia 这样的强大语言中,一个显著的缺点是一些相当丰富的语法,如果这种语言是独一无二的,就像 Julia 一样,这可能会令人畏惧和不快。Julia 很容易设置,甚至有办法集成到 Spark 和 Python 中。如果你想了解更多关于茱莉亚和火花的事,看看这个吧!

底片。

DataFrames.jl

虽然相当关键和次要,但我想一开始就提到的最大的一个是 DataFrames.jl。现在不要误解我,我在某种程度上喜欢 DataFrames……但尤其令人讨厌的是 data frames 向用户显示的方式,我真的不明白这样做的原因。当然,这可能是我不知道的性能问题,但我肯定不确定。

首先,为了读入 CSV 文件,我们不像在 Python 中使用 Pandas 那样使用 DataFrames.jl,甚至不使用 R 的内部表。首先,我们必须

Pkg.add("CSV")

这将为读取 CSV 添加一个完整的模块,稍后会详细介绍。

不过,每当我们在添加 CSV 后读取 CSV 时,我们都会在数据框顶部看到一条消息:

“省略打印 68 列”

当然,这不是问题,但是我们如何显示所有的列呢?没什么太复杂的,只是:

show(df,allcols=true)

但我的问题是之后会有什么回报:

我的天啊。今年是哪一年?

也许你会说这不太严重,但是试着在这个小 iframe 中整理成百上千的特性,而不仅仅是运行

df.head()

然后尽量不去抱怨。与熊猫和 R 数据框相比,朱莉娅肯定是最后一名!考虑到这一点,经过一些思考,我认为他们完全有可能让你使用熊猫和 PyCall,但这纯粹是猜测。

分散

还记得我说过的使用 CSV.jl,而不是使用 DataFrames.jl 读取 CSV 吗?(这是可以的,DataFrames.read_table,但是它做了一些非常奇怪的事情,并抛出了一个不推荐使用的警告。)在 Julia 中,函数和包的分散几乎贯穿了所有东西。

例如,如果我想使用决策树,我必须在谷歌上搜索 DecisionTree.jl 和 Pkg.add()它。

Pkg.add("DecisionTree")

这很简单,那还有什么问题呢?

您想要的每一个模型都包含在不同的模块中,都有自己的方法、参数、构造函数、语法和文档。在文档谱上,它可以从两行没有真正解释任何事情的示例代码一直到完全压倒性的一页文档(这是我最喜欢的一种!)

Pkg 细微差别

我的第三个也是最后一个抱怨是关于 Julia 的软件包管理器 Pkg。Pkg 很棒,我真的很喜欢它,事实上,Pkg 有自己的 REPL,你可以随时从朱莉娅 great 进入,这使它更加甜蜜。

然而,这些包确实有一些缺陷、依赖问题和随机的小毛病。通常这并不太糟糕,但偶尔你会安装一个新的模块,并最终一遍又一遍地重新构建 20 个不同的包,如果你不得不用一个精灵网络应用程序来完成这个过程,例如,不仅要在你的个人电脑上提交执行,还要在你的服务器上做同样的事情,这个过程可能会有点烦人。

救赎

虽然我承认:这些都是相当小的抱怨,而且通常不会过多地扰乱朱莉娅的生态系统,但我确实觉得这是一些想试用朱莉娅的人想知道的信息。Julia 现在很棒,但着眼于未来而不是现在,我肯定会看到 Julia 起飞并成为数据科学家中的核心语言。很多人可能没有意识到 Julia 仍然是一个婴儿,去年刚刚进入 1.0。而且一门语言这么年轻,当然包是要散的!

自从我在茱莉亚工作以来,茱莉亚已经看到了可观的收入增长。我经常发现我想到了我想做的事情,GitHub 上有一个包可以准确地完成它,这太棒了。软件包在不断扩展,这才是真正使 DS-语言在未来可行的原因。对于 ML,我们有 XGBoost.jl、Lathe.jl、MLBase 和 Flux.jl:

Pkg.add("XGBoost")
Pkg.add("Lathe")
Pkg.add("Flux")
Pkg.add("MLBase")

对于 stats,我们有 StatsBase.jl、GLM.jl、Lathe.jl 和 Distributions.jl:

Pkg.add("StatsBase")
Pkg.add("GLM")
Pkg.add("Lathe")
Pkg.add("Distributions")

对于预处理,我们有 MLDataUtils.jl 和 Lathe.jl:

Pkg.add("MLDataUtils")
Pkg.add("Lathe")

有了 Julia 的高级包管理器,开发所说的包就出奇的容易!

所以我鼓励任何对 Julia 感兴趣的人现在就投入进来,帮助开发语言和软件包库。我坚信,凭借它的速度和用途,我们将看到 Julia 在全球企业生态系统中的使用增加。我对 Julia 的未来感到非常兴奋,它可能会一直保持我最喜欢的语言的地位。

面部识别的严重后果

原文:https://towardsdatascience.com/the-severe-consequences-of-facial-recognition-e4260f961b84?source=collection_archive---------19-----------------------

必须不惜一切代价反对面部识别的快速启动。原因如下。

随着国家和企业数字监控的兴起,以及 2013 年斯诺登的爆料,许多人在数据的数字控制、全球大规模监控以及最近的面部识别等问题上采取了非常支持隐私的立场。

那么,什么是面部识别呢?面部识别正是它听起来的样子:基于面部特征(如肤色、面部毛发和生物数据)识别你的面部的技术。尽管这看起来很简单(事实也确实如此),但是在大规模的社会范围内将它引入人类生活的想法会引起很多关注。

在我深入研究面部识别的批评以及它的引入可能带来的后果之前,我想仔细看看这项技术的最近历史。为此,我们需要看一下两个特定的实体:

IBM 和纽约警察局(NYPD)。

2001 年 9 月 11 日恐怖袭击后,西方世界,尤其是美国,陷入了一种不确定感。这主要是因为袭击粉碎了任何外国或非国家行为者不能袭击美国的想法或观念。

在袭击发生后的几个月里,时任总统乔治·w·布什签署了《爱国者法案》,使之成为法律,并开始修建道路,最终通过美国情报机构和其他盟国进行大规模全球监控。

Photo by Matthew Henry on Unsplash

根据截获的和“机密公司文件”,很明显“IBM 开始开发这种物体识别技术”,并通过“秘密获取 NYPD 的摄像机镜头还表示,截击是到 2012 年,“IBM 正在创建新的搜索功能,允许其他警察部门通过头发颜色、面部毛发和肤色搜索摄像机镜头中的人的图像”。

对于一般人来说,这可能只是一种将犯罪嫌疑人逼入更小的身份识别因素的方法,但当考虑到美国各种警察部队严重的种族偏见时,这并不意味着什么。

The Intercept 还报告了 IBM 没有对提出的许多问题做出回应的事实,包括但不限于以下内容:

为什么没有公开与 NYPD 的合作?

视频分析的当前可用性状况如何?

NYPD 提供的视频片段是做什么用的?

面部识别不起作用:

据《独立报》报道,当伦敦警察厅使用"面部识别软件时,结果显示,高达"98%的警报都是误报",因此该软件"还不适合使用"。

The Independent 还报道称,自 2017 年 6 月开始使用该软件以来,南威尔士警方在 15 次部署中总共有“【2,400 次误报”。

Photo by Oliver Hale on Unsplash

这些巨大的不准确性概述了识别软件在未来潜在可用所必需的发展。报告的错误可能会在现实世界中造成非常毁灭性的影响,包括但不限于虚假指控、国家骚扰等。

侵犯和侵犯隐私权:

人们一次又一次地看到政府机构超越了法律的范围。例子包括国家安全局(NSA)违反隐私法,特别是关于“在美国境内未经授权监视美国人或外国情报目标

即使在后斯诺登时代隐私倡导的大规模超载和《自由法案》的通过之后,事情并没有改变,该法案本应有助于遏制美国境内正在进行的违宪监控。2016 年, The Verge 报道称,NSA“收集了超过 1.51 亿条关于美国人电话通话的记录,这促使电子前沿基金会(EFF)等个人和组织开始进一步要求删除该程序本身

Photo by Scott Webb on Unsplash

如果数百万美国人的隐私被故意侵犯,为什么人们应该期待面部识别技术被不同地使用?事实已经一次又一次地表明和证明,国家机构不愿意正确地通过可用的法律方法来获取私人信息,因此面部识别不应该以任何其他方式处理。

结论:

除了缺乏功能和侵犯隐私之外,还有许多其他问题,例如错误识别少数群体和活动分子的威胁,以及情报组织缺乏针对其他国家或非国家行为者的保障措施。

在目前的状态下,面部识别不是一种可以被各种国家机构使用的技术,并且在大多数情况下应该被明确反对,以防止它具有的许多缺点。如果人们关心学术研究人员、活动家团体、调查记者和其他需要隐私来安全开展工作的个人所做的私人工作,那么这些人应该非常反对进一步实施生物特征数据收集。

数据科学家:22 世纪最性感的工作

原文:https://towardsdatascience.com/the-sexiest-job-of-the-22nd-century-ffe753e1d155?source=collection_archive---------3-----------------------

问这三个问题,确保雇主已经为你做好了准备

数据科学被称为“21 世纪最性感的工作”——如果我看到更多的商业领袖雇用数据科学家进入我们可以有效工作的环境,我会相信这种观点。相反,我们中的许多人感到被误解和被忽视。

Image: Source

下个世纪最性感的工作

我们是帮助为你的业务启发新方向,降低你让重要决策付之一炬的风险,以及通过机器学习和人工智能自动化不可言喻的的人。我们让你们的数据变得有用,然而你们却让我们生活在资源贫乏的环境中。你要求我们与下列人讲和:

不熟练的领导 —如果没有擅长领导和管理数据科学职能的人员,我们的日子会很难过。如果决策者不擅长合理分配工作并做出数据驱动的决策,数据科学家实际上是无用的

无数据 —如果你在数据工程师之前雇佣数据科学家,通常意味着我们没有数据可处理,我们必须首先为你建立数据工程功能,否则我们将被迫卷铺盖走人。如果我们留下,我们最终会做一份你声称雇佣我们的工作以外的工作。我已经说过并且我会继续说下去:你需要高质量的数据数据科学才能有效。我们不是神奇的小妖精,所以我们不能为你无中生有。

令人讨厌的工具——数据科学开发工具是一种痛苦。生态系统是支离破碎的,尤其是在人工智能方面,即使是最好的选择也远非完美。总有一些事情让旅途变得颠簸。

如果你在面试一份数据科学的工作,确保你询问了你的潜在雇主关于这三点的计划,这样你就不会陷入悲伤的境地。别忘了问一下 - 工作是什么,以确保你有数据?如果你所有的见解都没有用在任何事情上,谁会被解雇?谁负责挑选您使用的工具,并确保它们与所有其他基础设施配合良好?

如果所有这些问题的答案都是YOU——也许是因为公司不知道什么是数据科学(但无论如何都想要它)——那么适当地设定你的期望。你将不得不自己完成多项工作,大致按照这个顺序来处理它们。在学校接受 #6 训练?你可能在几年内都不会接触到那些很酷的贝叶斯网络(而且到时候你也不太可能真正使用它们,因为你会忙于管理你建立的团队)。它可能非常适合你,但是请你一定要看看(并且想一想!)三思而后行。

我已经写了很多关于领导力数据的文章,所以现在是我提到工具的时候了。应用数据科学家(包括那些从事 ML/AI ) 不想从零开始构建我们的工具(那是一项不同的工作——如果我们想要,我们早就在里面了)。例如,我们更愿意使用一个现有的包来制作一个直方图,而不是编写在屏幕上显示矩形的代码。如果你要开一家餐馆,要求我们自己生产就像要求你自己制造微波炉一样。如果有必要的话,我们会建造它们,但是我们更喜欢直接进入烹饪阶段。

与撒旦一起工作

有时候,管理层强加给数据科学家的专有工具甚至比他们自己拼凑的工具还要糟糕。我记得我的朋友们给它起了个绰号叫“撒旦”,意思是,“是的,我知道这在 R 中需要一行代码,但是你可能需要一整天的预算来让它在撒旦中工作。”当你手中的工具糟糕透顶时,你很难在心中歌唱一天。

从设计师的角度来看

有时候,可用工具的问题是旁观者的看法——也许你沮丧的根源是你选择了一个不是为你制造的工具。我们来看看 Google origin 的两个工具。Keras 不仅是一个漂亮的 API,而且它是以数据科学家的理念构建的。例如, Keras 的错误消息旨在指导数据科学家的下一步行动,因此它们简洁且看起来友好,而 TensorFlow 中的一个等效错误则抛出了一堆杂乱的狄更斯式比例

如果你已经戴上了设计思维的帽子,这不会让你感到惊讶;作为 AI 的工业车床, TensorFlow 最初的设计并没有考虑到数据科学用户。它是为在谷歌范围内开辟新领域的研究人员而设计的…而且它很擅长它的用途。这也是你经常想要扼杀的工具。

Hurray for TF 2.0, which is going all-in on usability! There might be teething pains as TF switches over to Keras style and says bye bye to making you write all that boilerplate, but I’m excited. One might even say I’m eager.

对我们数据科学类型的人来说,好消息是,甚至 TensorFlow 也变得更加可爱了。新的 2.0 版本正朝着我们的方向发展,这已经显示出来了。让我们为数据科学家开始说“我喜欢 TensorFlow ”的那一天欢呼吧(相对于“我容忍 TensorFlow,因为它是在这个规模上处理我的数据的唯一东西”)。

我很高兴成为明确将数据科学家确定为主要用户的 TensorFlow 计划的一员。我期待在未来的帖子中告诉你的一个例子是 假设工具 ,它使模型理解、偏差检测和 ML 数据探索变得容易。该团队包括一名用户体验设计师,他的任务是让数据科学家们高兴...从第 1 天!可以在这里偷偷看一下结果

Curious to know what you’re looking at? Find out more about the What-If Tool here.

如果它不是为你做的,它可能不适合你

重要的是花点时间思考你正在考虑学习的工具的起源,以及它的构建者在指导新版本开发时向其提议的社区。

买之前先试试

当我们这样做的时候,如果您正在为您的组织调用工具,不要在您的数据科学家对工具进行测试之前就承诺使用它。你可能会认为这是不言而喻的,但撒旦却有不同的暗示。考虑挑选一款专为零售领域分析师打造的工具,并将其直接插入您的医疗保健公司?哦亲爱的。

您可能需要考虑一些来自专业工程师的工具支持,这样您的数据科学家就不会痛苦了。您当前的分析师可能没有签约处理对他们来说感觉像一件垃圾的东西,他们可能没有足够的时间来了解询问工具(以及对这些工具的工程支持!)在他们的采访中。

笑点

如果你是一名正在寻找新工作的数据科学家,不要忘记检查一下你将要信任的人是否了解你的需求。向潜在雇主提出关于数据、决策者和工具的问题。确保他们拥有我们需要的快乐和有效的东西。不要以为雇主在这个世纪已经为你做好了准备。如果你热爱这份工作,我不希望看到你成为另一个没有数据的公司的数据科学主管!

Image: Source

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。

化学函数的形状

原文:https://towardsdatascience.com/the-shape-of-chemical-functions-d1e1568d020?source=collection_archive---------23-----------------------

“形式服从功能”这句话我们能走多远?用数据回答。

弗朗切斯科·帕斯,弗朗切斯科·帕尔马,马特奥·曹尔西,托马斯·博伊斯

https://github . com/Giotto-ai/the-shape-of-chemical-functions(简单安装说明如下。)

即使你第一次呆在一个房间里,你周围的物体也会让你感到非常熟悉。最微小的细节将包含足够的信息来识别一个物体并将其与一个功能联系起来。物体看起来像什么,我们不严格地称之为它的形状,告诉我们一些更深层的东西:它的功能,物体做什么。

想一想,很不寻常的是,短暂的一瞥一个无生命的物体会唤起你可以用它做的所有事情。如果是藏在一张纸下面的一副耳机,或者是你家工具棚里一件积满灰尘的旧工具,不需要深入分析,你大概会对它的功能有一个极其有见地的猜测。

我们能把形式和功能分开吗?

嗯……想象一下不能区分电锯和面包刀。

Objects with the same form might not always have the same function…

对于复杂的进化系统来说,恰当地检验这个问题似乎很困难,因为这个系统有影响自身的力量。然而,对于像化学这样基础的东西,我们可以期待一个不那么偏颇的答案。

让我们更深入地探讨这个问题

在化学中,毫无疑问,分子的形状对决定它们的功能有一定的作用。蛋白质构成我们的皮肤,携带血液中的氧气,帮助我们的肌肉运动等等。在我们的身体内部,蛋白质根据它们被赋予的任务呈现出许多特殊的形状,例如,支架帮助细胞移动并保持其形状,酶由于特殊的口袋而加速生物机械反应。虽然这些形状比日常物体复杂得多,但蛋白质的结构在多大程度上反映了它在体内的作用?

Proteins are made up of long strands of smaller molecules called amino acids, which twist and fold into specific shapes.

形状对分子的功能有多重要?

让我们尝试给这个问题一个定量的答案。如果形状信息决定了分子的功能,那么仅仅依靠形状特征就有可能建立高度精确的预测模型。

检验假设:一种分子是 HIV 抑制剂吗?

因为我们一次只能测试一个化学反应,所以我们简化了问题,并试图预测一个分子是否会执行一个确切的功能。在我们的案例中,我们专注于预测一种分子是否能抑制 HIV 的传播。

要从分子中提取形状,自然要用到一些拓扑。

简单地说,结果

仅依靠形状信息,我们成功地在 AUC-ROC 中达到 0.74 的分数。我们通过包括关于键的性质的基本化学信息来实现进一步的性能提升,达到 0.77。今天的技术水平达到了 0.78。非常可敬!

复制我们的结果所需的代码是完全可用的,可以在这个库中找到。要运行其中包含的 Jupyter 笔记本,您需要:a)下载存储库的内容;b)按照自述文件中“开发者安装”下的说明,安装最新(非发布)版本的开源库 giotto-learn 。很快,这些实验性的特性将可以通过pip更简单地获得,而不需要克隆库的 repo,所以请继续关注!

数据和方法

HIV 数据集由药物治疗计划引入,以鼓励 HIV 抑制化合物的研究,它被收录在 MoleculeNet 中。对于 4 万种化合物中的每一种,他们测试了该化合物是否抑制艾滋病毒的复制,从而产生了数据集的二进制标签。这两类是不平衡的,因为只有 2%的分子是抑制剂。为此,我们选择了 AUC-ROC 指标。

将分子表示为图形是很常见的:将化合物的原子视为顶点,将化学键视为顶点之间的边。在我们下面描述的设置中,我们从分子图中提取形状信息。

为了在预测模型中使用这种形状信息,我们需要从图形中提取特征。

创建特征向量来比较图形

如果我们的假设成立,希望当两种化合物结构相近时,它们会有相似的功能。我们如何构建嵌入来突出图形之间的结构相似性?

让我们想象一下,我们嵌入了图的顶点,以便表示它们在图中的角色(中枢与孤立节点)。

如果一个图与另一个图相似,那么它的许多顶点在向量空间中具有相似的嵌入,因此得到的分子特征向量应该在嵌入空间中是接近的。因此,我们将问题简化为确定顶点的嵌入,这些顶点对它们在图中扮演的角色进行编码。

产生顶点嵌入的热流模拟

我们可以把一个顶点的作用想象成它连接图中所有其他顶点的方式。通过模拟一个单位的热量如何从一个顶点扩散到图表的其余部分,我们可以量化扩散的速度和范围,从而量化其作用。完整的方法在这里公开。

对于给定数量的时间步长,我们使用拉普拉斯图来模拟热扩散。作为扩散的度量,我们取扩散的每个时间步的熵。因此,一旦这个过程开始,你就以固定的时间间隔测量扩散,并在给定的时间步数内停止扩散。我们认为 40 英镑是合理的。

Diffusing heat from the red node to the rest of the graph

通过在 40 个时间步长的每一步测量图的熵,每个原子都有一个 40 维的表示。

顶点特征向量

最后,我们准备好了特征向量。我们对嵌入的顶点执行 k 均值聚类,我们选择 k=10。然后,顶点的特征向量由属于 10 个聚类中的每一个的 10 维概率向量给出。

我们对边缘重复同样的过程

多亏了霍奇理论,也有可能研究同样的扩散过程,但这次是在图的边缘。通过重复前面的步骤,我们可以将另一个特征向量叠加到我们的模型中。

分子特征向量

我们通过堆叠以下两个向量来获得分子的特征向量:

  • 属于分子的顶点的矢量和
  • 该矢量将属于分子的边相加

为了测量我们在分子特征向量上叠加的化学信息的影响:

  • 每种类型的键的总数(单键、双键、三键和芳香键)

分类

是时候把这些特征输入到你最喜欢的分类器中了。在我们的例子中,我们选择一个具有两个隐藏层的神经网络,分别具有 32 和 64 个 Relu 神经元。

The 2-hidden layer neural obtained in cross

结果

从分子图中提取的特征所实现的性能给出了令人印象深刻的 0.74。化学信息将性能提升到 0.77,接近使用大量化学信息的最新内核 SVM 所达到的 0.78。在这里找到的书房。

Our results on predicting HIV inhibitors with only structural features

State of the art results in AUC-ROC on predicting HIV inhibitors

结构特征击败了包含更广泛特征的次优模型。形状确实是功能的一个很好的代理,即使简单的化学属性会导致性能的提升。尽管如此,值得注意的是,除了形状之外,几乎没有什么化学信息是接近最先进性能所必需的。

链接:

足球比赛的形式

原文:https://towardsdatascience.com/the-shape-of-football-games-1589dc4e652a?source=collection_archive---------15-----------------------

使用球员特征和拓扑数据分析模拟足球比赛的结果

由弗朗切斯科·帕尔马、迭戈·费奥里、丹·泰特斯·萨拉詹、阿莱西奥·巴切利、马特奥·德·奥斯皮纳和托马斯·博伊斯创作

如果你是一个足球迷,你会渴望梅西加入你的球队。你的队会赢得冠军吗?它至少能避免降级吗?由于梅西不能加入每个人的团队,我们选择使用数据和模拟来推断答案。EA Sport 的 Fifa 数据集是我们球员特征的代理,TDA(拓扑数据分析)是模拟每场比赛结果概率的 spice。通过对这些概率的模拟,我们得出了英超联赛最有可能的最终排名。

Messi is only joining Aston Villa in our Python Jupyter Notebook (source:https://twitter.com/concarp98)

今年击败克洛普需要谁?

我们的模型允许您组成您的团队,并衡量团队在排行榜中的年终排名的整体影响。自己试试模型,python 代码在这里有,数据在这里:匹配赔率tda 特色玩家统计玩家姓名(原始来源这里)。

系统模型化

假设 1: 一场足球比赛的产出只取决于场上球员的具体和组合属性。

大多数教练不同意这种假设,因为我们忽略了团队精神、天气、周内比赛导致的疲劳、伤病、黄/红牌、换人、战术、个别球员的个人承诺、赛季时间、球迷的特殊承诺以及其他许多可能影响比赛结果的内部和外部因素。

Walter Mazzari, former Watford manager, became a reference while he was at F.C. Internazionale in 2014 for the iconic sentence: “we were playing well, and then it started raining”. (source:https://www.standard.co.uk)

话虽如此,你可能已经明白了第一个不可否认的事实:

我们的模型明显是错的(任何模型都是…)

无论是作为球员、教练、球迷、服务员、替补队员还是园丁,任何人都知道,在预测比赛结果时,要考虑的信息量比可以记录的信息量更大。看台上的一声尖叫,裁判的一声误判,或者午餐菜单上的虾,都可能危及比赛的整体结果。一些受人尊敬的科学家声称,足球只是随机的,或者像证明费马大定理一样困难(除了我们对后者有 129 页的数学证明)。

Professor Andrew Wiles proved Fermat’s last theorem in 1994. After 358 years we finally have a proof that “there are no whole number solutions to the equation x^n + y^n = z^n when n is greater than 2, unless xyz=0”. Will somebody ever find a solution for predicting the outcome of football matches? (source:http://www.ox.ac.uk)

我们当然知道,没有任何预测模型可以完美地预测足球比赛的结果。我们的目标是看看拓扑数据分析的不可知论方法是否可以在每个团队的七个聚合特征的微小集合中识别相关模式。

我们使用 EA 给每个玩家的 24 个属性来设计攻击和防御特性。初始属性相关矩阵给出了构建后者的方向。为了生成整个团队的特征,我们基于初始匹配组合构建了以下 7 个特征:

守门员的等级

团队中最大攻击值

团队中最大防御值

队内平均攻击力

队内防守一般

团队攻击的标准偏差,以百分比表示

团队防守的标准差,以百分比表示

我们基于过去六个英超赛季的 2591 场比赛训练了一个模型来估计每场比赛结果的概率。我们对 14/15 赛季的 380 场比赛进行了测试,并提供了最终排行榜的模拟。

动机

2011 年 12 月 31 日,弗格森爵士 70 岁了,曼联将在老特拉福德迎战排名最后的布莱克本流浪者队。在最后一场比赛中,流浪者队以 1 比 7 惨败。那天晚上,那些期待弗格森的球队再次表现的人会非常惊讶。布莱克本以 2 比 0 领先,并在最后 10 分钟以 3 比 2 锁定胜局。

那天晚上,幸运的下注者在赌场赢了 28:1。

The Rovers’ future captain Grant Campbell Hanley scored the victory goal at Old Trafford. At that time the Scottish defender was just 20, he left Blackburn in 2016 with 183 appearances and 8 goals. (source:https://www.dailymotion.com)

不幸的是,在老特拉福德的这场奇迹般的胜利并没有让布莱克本免于降级。另一方面,从长远来看,这些分数对红魔来说是致命的。那晚错过的机会导致在最终排行榜上不可思议的平局。曼城和曼联都以 89 分结束了这个赛季。由于一个更好的净胜球,市民赢得了奖杯,给曼联留下了苦涩的余味。

太好了。但是为什么是拓扑呢?

虽然这一事件对曼联来说似乎不可预测,但拓扑结构清楚地将这场比赛与布莱克本的比赛和与相同水平球队的对抗区分开来。例如,我们考虑同一赛季曼联对西布朗和曼联对博尔顿。

让我们试着理解为什么我们的比赛如此特别(这样你就可以计划下一次去赌场)。我们可以做的第一件事是研究比赛的空间,一场比赛是 14 维空间中的一个点(记住每个队有 7 个特征,一场比赛有 7+7=14 个特征)。我们使用主成分分析的前两个部分,以我们考虑的每个匹配为中心来可视化相似的匹配。

2-dimensional PCA representation for Man-Utd vs West Brom. 3–0, Man-Utd. vs Bolton 2–0 and Man-Utd. vs Blackburn 2–3

你用主成分分析看不到的,你可以用 TDA 看到

这三个图是用来描述匹配的 14 个特征的投影,精确到两个,并且已知投影会丢失信息。我们使用 TDA 从原始空间中恢复和可视化结构。我们使用的工具是一个持久性图(在 Giotto 中可用!).持久性图是数据集在点的连通性方面的表示,它是通过逐步连接相邻点并测量结构的同源性而获得的。这是一种理解、可视化和从数据中提取特征的新方法。如果你想更多地了解 TDA,我们推荐这个帖子

Persistence diagram for Man-Utd vs West Brom. 3–0, Man-Utd. vs Bolton 2–0 and Man-Utd. vs Blackburn 2–3

三个持久性图是在与 PCA 情况相同的点云上计算的。图中的点不再匹配,而是描述了原始空间中的点之间的关系。在我们的例子中,它描述了三个匹配点周围的点云的形状。

持久性图告诉您局部和全局结构

从前两个图中,我们可以看到所有的连通分量(用橙色点表示)都集中在 y 轴上[5,10]之间。此外,环(由绿点表示)集中在框[6,8]x[6,8]中,并且它们到 y=x 的最大距离是 1。

在最后一张图中,橙色点更加分散,极值点(0,17)表示较晚与数据集的其余部分连接的组件。最重要的是,绿点在 y=x 线上也更加分散,它们总体上更靠近这条线。

第三张图的结构暗示了一个异常值

事实上,橙色的点(0,17)代表了人类之间的融合。Utd。-Blackburn 与剩余的匹配,这意味着该匹配比它在 PCA 图中所表示的更远。

持久性图很棒,但是它们不能直接输入到预测模型中。您将需要知道如何将持久性图转换成模型的特性。

我们使用一种叫做振幅函数的技巧来合成图表中的信息。

关于我们如何从持久性图中提取特性的更详细的解释也包含在我们正在分享的 Python Jupyter 笔记本中。

结果

单个比赛的模型已经训练好了:我们现在准备运行整个赛季的一些模拟。你可以选择一个小队,看看他们能走多远。作为对模型的测试,我们研究了每个英超球队转会梅西的影响。

不出意外,雇佣梅西总是好的。

有梅西在你的球队,你降级的几率平均下降 12%,把奖杯带回家的几率平均增加 4%,进入前四的几率增加 14%。最需要梅西的球队是女王公园巡游者队,他们将在排行榜上攀升 11 个位置。最初获得第 14 名,模拟概率为 72%,莱斯特城将获得欧冠资格。

下面是第 14-15 季的原始排行榜,以及以下各项的模拟概率:

  • 赢得冠军,
  • 进入前 4 名
  • 被降级

每个阵容里有没有梅西。

Leaderboard for Premier League season 14–15, including simulated probabilities with and without Messi

模型评估

排行榜模拟的质量直接反映了模型在预测比赛结果方面的准确性。我们对持久性图中的 14 个特征+特征使用随机森林分类器,并根据一些基线预测策略测试该框架:

1)预测主队总是获胜(基线)

2)根据团队绩效计算的 Elo 评分

3)通过投注赔率给出的市场预测

Accuracy of predictive strategies on 14–15 season

在上表中,我们给出了测试集上每个策略的准确性。下面我们比较了这些预测的混淆矩阵。

Confusion matrix of the different predictive strategies

结果证实:足球是随机的。即使是博彩公司也只有 53%的比赛赔率是正确的。

我们的结果与博彩赔率给出的结果相当,与博彩赔率有惊人的强相关性。结果很有趣,因为我们的模型依赖于过于简单的数据。我们的模型具有预测抽奖的非凡能力(代表 27%的结果)。

当提供其他年份和其他锦标赛的数据时,该模型具有很好的通用性。在没有“看过”意大利比赛的情况下,同一模型在预测 2015/2016 赛季意甲比赛时的准确率为 52%。这对于团队特定的策略(如 Elo 评级)来说是不可能的。

也许这个模型最好的属性是它在建立和测试团队时的灵活性。我们不仅可以混合球队和模拟锦标赛,我们还可以做出明智的转会决定。在预算固定的情况下,你可以根据球员的成本和收益来优化他们的最佳组合。

Lionel Messi is playing in Barcelona since 2011, maybe it’s time for him to join other teams at least virtually…(source:https://metro.co.uk)

结论

我们的尝试是给一个复杂的三元分类问题一个简单的解决方案。拓扑模型在非常有限的一组要素上实现了很好的准确性,并且它可以与常见的方法相媲美,尽管灵活性较差。

我们已经在梅西身上试过了,现在我们很好奇,罗纳尔多会表现得更好吗?

参考文献:

[## 持续同源:一个带有例子的非数学介绍

在数据科学中使用拓扑数据分析(TDA)工具

towardsdatascience.com](/persistent-homology-with-examples-1974d4b9c3d0)

https://arxiv.org/abs/1710.04019

人口动态的形状

原文:https://towardsdatascience.com/the-shape-of-population-dynamics-ba70f253919f?source=collection_archive---------23-----------------------

利用拓扑数据分析研究种群动态

由弗朗西斯科·帕尔马、菲利普·魏勒路易斯·汤斯顿托马斯·博伊斯编剧。

https://github.com/giotto-ai/beetles-tda

尽管狼以凶猛的杀手而闻名,但 1995 年在黄石国家公园重新引入狼使该地区恢复了生机。随着狼群将鹿和驼鹿从河流和山谷中赶走,植被开始重新生长。由于栖息地更加丰富,鸟类和海狸等较小的动物开始在水边定居。因此,就像罗穆卢斯和雷穆斯的情况一样,狼可以被认为是生命的承载者。

According to the legend, the twin brothers Romulus and Remus were abandoned on the river Tiber to die. Thanks to the help of a she-wolf they managed to survive and founded the city of Rome in 753 BC, Source

人口动态会表现出违反直觉的行为。

今天,濒危物种的数量在增加。在不危及整个生态系统的情况下识别和保护它们是一个真正的挑战。这就是为什么我们从早期预警信号中得出正确的行动是至关重要的。

"每一个作用总会有相反的反作用."牛顿第三定律

就像牛顿写了一个方程解释作用和反作用之间的关系一样,我们可以依靠数学方程来描述人口动态。这种内在的建模方法揭示了种群内部起作用的机制,例如对资源消失的反应。

在固有模型中,噪声项捕捉环境的不确定性

要测量人口数据中的重复模式,自然要寻求一种稳定且通用的方法,如拓扑数据分析(TDA)。我们的文章探讨了拓扑特征如何被用来分类非周期性和稳定的人口增长机制。

我们发现,仅用几个拓扑特征,即使包含显著的噪声,也有可能提高简单基线模型的性能。

我们采用的方法受到佩雷拉和德梅洛工作的启发。我们使用开源库 Giotto-learn 提供代码来复制我们的结果。

模拟种群的进化

农业受到一种臭名昭著的甲虫的损害——赤拟谷盗。它是如此之小,以至于在不到几克的面粉中就能找到数百个样本。当缺乏资源时,这种甲虫依靠同类相食来恢复种群平衡。因此,它们可以作为捕食者和猎物,使它们成为一个自给自足的生态系统。

面粉甲虫通过同类相食来自我调节它的种群。

为了达到稳定的种群,甲虫会自我监控每只成年甲虫的可用资源比例。然而,这种监控操作的成功并不意味着一定会失败。在没有任何外部刺激的情况下,成年甲虫的数量级会无休止地波动,永远不会达到稳定的数量级。

皇家诺顿·查普曼于 1928 年首次提出了增长模型,我们用来模拟人口动态的增长模型可以在 20 世纪 70 年代由康斯坦丁诺等人撰写的文章中找到。我们用他们的差分方程模拟了赤拟谷盗面粉甲虫种群。我们的目标是确定成年甲虫种群是处于稳定状态还是非周期性状态。

Two regimes of adult beetle population as function of time

Two regimes of adult beetle population with increased environmental uncertainty

我们表明,TDA 方法比基线模型更好地区分了这两种情况。TDA 特征是高度可预测的,以区分甲虫种群中的稳定和非周期性状态。此外,即使在环境条件高度不确定的情况下,它们也能保持预测性。

用 TDA 聚类时间序列

面粉甲虫是种群动力学中一个被充分研究的例子,它表现出两种截然不同的行为:稳定的和非周期性的。对于许多其他物种来说,这种洞察力是不存在的,并且为它们的进化找到一个合适的模型是乏味的。

然而,我们可以依靠数据科学来洞察不同模式的人口动态。我们设计了一种基于相似性度量的不可知方法来聚类人口时间序列。基线方法是将每个人口时间序列视为一个高维向量,并对其进行聚类。

我们的方法依靠 TDA 来降低问题的维度,压缩并保留时间序列中包含的基本模式。流水线包括以下处理步骤:

1.应用 Takens 嵌入:

Takens 嵌入背后的思想是将一维时间序列 y(t) 嵌入到一个 d- 维空间中。在连续数据的情况下,我们将时间序列离散化(任何方法都可以),并且我们通过在彼此距离τ 处选择 d 点来应用滑动窗口方法。这些值成为代表 d- 维空间中时间窗口的矢量坐标。

A Takens’ embedding on a sinus curve exhibits a loop in the embedding space (here d=2, τ=1)

通过在时间序列上逐步滑动时间窗口,并重复该操作,我们获得了数据在维度 d 中的新表示。

塔肯夫妇的嵌入给了我们一个新的视角来揭示隐藏的模式。

这种嵌入需要调谐参数,例如嵌入尺寸 d 或时间延迟 τ。两者都可以通过实验或最小化特定问题的损失函数找到。

giotto-learn 中,时延 τ 是从时延互信息的内置最小化中获得的。

2.建造 Vietoris-Rips 综合体:

我们使用 Vietoris-Rips (VR)算法来研究这个点云的形状和连通性。当半径递增的两个球(以每个点为中心)相交时,VR 算法连接两个点。这样的过程让我们可以观察连接组件的合并,以及洞(圆)的创建和塌陷。下面的 GIF 图展示了 2D 背景下的概念:

The Vietoris-Rips algorithm produces a sequence of graphs by progressively connecting the dots

3.计算持久性图表:

持续图总结了包含在由 VR 算法产生的图形序列中的拓扑信息。该总结包括一对 (b,d),,其中 bd 分别表示拓扑特征(组件/孔/空隙)出现和消失的半径。

4.从持久性图中提取特征:

持久性图提供了关于点云的定性信息,但它们不是向量!这就是为什么我们不能直接使用它们作为特性。有许多方法可以将持久性图转化为特征向量,例如使用两个持久性图之间的距离(有许多的例子)。我们使用

  1. 每一维孔的平均寿命。
  2. 每个维度的孔数。
  3. “存活”时间超过给定阈值的洞数。该阈值被选择为空穴最大寿命的一部分(在维度中)。
  4. 每尺寸孔的最大寿命。
  5. 图表的幅度。它充当持久性图的规范,因为它采用持久性图和平凡图(图中所有点位于直线上 y=x )之间的距离。

5.对要素执行聚类

我们对生成的 TDA 特征应用 k 均值聚类,k=2。

结果

TDA 特征包含内在模型中没有的性能提升信息。

仅使用所述特征的 TDA 方法总是优于使用 120 个特征的基线。基线的均匀性分数随着环境中噪声的增加而不断降低。一旦噪声的标准偏差的平均值达到 0.5,基线方法仅找到单个聚类。

Homogeneity score for baseline (blue) and TDA approach (red) as a function of noise

TDA 方法也遭受了性能的早期下降,这可以通过两种情况之间日益增加的相似性来解释。当进一步增加噪声时,性能恢复,这表明通过 TDA 透镜观察,两种情况再次变得不同。我们可以通过查看三个示例案例的持久性图来验证这一点:

The persistence diagrams of two sample behaviors as the noise increases (from left to right). Red points represent connected components, and green points represent holes.

  1. 确认该方法捕获了明显的情况,持久性图的第一列清楚地区分了稳定和非周期性的情况。
  2. 对于中间的情况,随着噪声的增加,在稳定和 a 周期情况的图之间没有客观差异。这解释了在 0.25 噪声附近观察到的性能下降。
  3. 当噪声达到最大值时,两个持久性图再次变得不同。

结论

TDA 的特点是性能提升和抗噪音

为了理解我们如何在时间序列的集合中识别不同的聚类,TDA 提供了相关的特征来压缩时间序列的主要特征,同时保持对噪声的鲁棒性。在我们的例子中,九个特性足以将性能提高几个数量级。

链接:

在噪音中幸存的形状

原文:https://towardsdatascience.com/the-shape-that-survives-the-noise-f0a2a89018c6?source=collection_archive---------12-----------------------

由科林·卡林、菲利普·魏勒、玛尔塔·安吉洛、菲利普·阮、本杰明·罗素和托马斯·博伊斯撰写。

https://github.com/giotto-ai/noise-to-signal

因为处理噪声先于任何类型的模型拟合,所以您希望有一种透明的方法来从噪声中提取稳健的信号。

去除噪声是一项永无止境的任务,快速修复会危及整个分析。

Sisyphus is forced to roll an immense boulder up a hill only for it to roll down when it nears the top, repeating this action for eternity.

TDA 通过提取数据的基本形状来去除噪声。

典型的方法包括滤波(卡尔曼滤波器…)和平滑策略(指数移动平均…)。这些方法都侧重于时间平均法,并在噪声频率远高于希望提取的信号频率的假设下工作。相比之下,TDA 主要不是基于简单的时间平均,而是从每个固定时间提取结构信息。

噪声信号中隐藏信息恢复的应用

我们考虑在噪声下预测状态变化的问题。为了了解哪些特征集最适合预测状态变化,我们构建了四个模型来执行二元分类任务。每个模型都是使用不同的特征集构建的:两组特征不包含 TDA,一组仅使用 TDA 特征,另一组包含所有组合特征。

Noise, when good theory meets dirty practices. It is that unwanted party in your signal.

我们的结果简而言之

TDA 的特征对于快速检测噪声信号关键特征的细微变化具有高度的预测性。

这些功能优于标准功能。它们还包含标准方法中没有的性能提升信息。

下面,我们针对标准特征创建策略,使用 TDA 特征对复杂数字电路系统中的快速状态检测进行基准测试。

我们发现,在高噪声区域,TDA 特征比标准特征策略产生了显著的性能提升。TDA 不仅优于单独的标准策略,当两者结合时,它在标准策略之上提供了明显的性能提升。因此,它清楚地包含与标准特征中存在的信息不相交的预测信息,并且因此可以增强预测。

Detection accuracy as noise is added to data

问题陈述

阿里和朱莉想要分享一个隐藏的信息,以组织他们在英镑商店的秘密假日购物(波亚卡莎:他的代码可用)。

Ali explaining his message because the signal was too noisy.

隐藏在众目睽睽之下:隐写术是一种将一个信号隐藏在另一个信号中的艺术。

阿里狡猾地隐藏了他们秘密会面的地点、日期和时间,用橙色信号表示的 1 和 0 的序列,有点像莫尔斯电码。为了隐藏信号,他通过杜芬振荡器转动信号,输出蓝色信号,里面隐藏着信息。

Message in orange and noisy carrier signal by Duffing oscillator in blue.

为了隐藏消息,Ali 根据他的消息(橙色信号)的数字改变了 Duffing 振荡器的“A”参数。这种变化在具有不同拓扑属性的杜芬振荡器的两个状态之间切换输出信号。重要的是,这两种体制无法用肉眼区分。这使得它们适合在显眼的地方隐藏信息。

Duffing oscillator circuit, electronic circuits are great source of data to study periodic and chaotic signals. Figure by Elena Tamaševičiūtė et al.

其混沌输出允许杜芬振荡器用于 T2 信号提取和检测任务。在信号处理领域,尤其是实时信号处理领域,对于所有方式的滤波任务、异常检测和信号提取,使用特定电路是常见的。

重建信息

最终,Julie 需要从蓝色信号的“状态变化”中重建信息(橙色信号)。她使用 ML 分类器通过识别两种机制来提取信息,但只有当她拥有正确的特征创建步骤时才会成功。

为了训练她的解码器,Julie 测量了 Duffing 电路的电压输出(她将其分为训练/测试 140,000 点和 60,000 点)。每个测量值都配有一个标签,表明它属于哪个区域。

特征创建

固有特性是直接测量输出信号的电压及其时间导数。

标准的时间序列特征是由许多不同大小的滚动窗口创建的。我们在滚动窗口中创建的特征是平均值、最大值、最小值、移动平均差(MAD)和前几个傅立叶系数。

TDA 特色

我们的目标是根据时间序列的状态看到拓扑不同的点云(从而提取信息)。TDA 的特征是使用乔托库创建的。

为了创建 TDA 特征,我们使用 Takens 嵌入法将我们的时间序列嵌入到一个更高维度的空间中(在这里解释)。滚动窗口的每一步都被转换成高维空间中的单个向量(其维度是窗口的大小)。

Takens embedding in dimension two.

拓扑研究每个点云中的连通性。我们应用 Vietoris-Rips 算法,该算法通过一条边连接在某个距离阈值下的点,并且通过改变该阈值,V-R 以不同的粒度级别创建点云的近似。

Vietoris-Rips algorithm.

发现以下特征是有效的预测因素。

孔特征的总数

关于漏洞的信息包含在持久性图中。它是逐渐连接距离(ε)越来越大的点的结果,我们用它来创建 Betti 曲面。Betti 表面计算作为ε和时间的函数的数据中存在的孔的数量。

Betti surface showing the 1 and 0 regimes in the Duffing oscillator output.

相关孔特征

相关孔特征计算超过给定阈值大小(大于最大值的 70%)的孔的数量。

图表特征的振幅

我们使用图范数作为图中所有洞的总持久性的度量。

平均支持特征

在 Betti 曲面中产生非零 Betti 值的ε距离的平均值。

ArgMax 功能

argmax 特征是每个时间窗的 Betti 数最高的ε值。

平均寿命特征

对于每个维度,我们取持久性图中空穴的平均寿命(=固定时间的 Betti 表面)。

管道

Steps of the feature creation and model fit pipeline.

特征说明

我们演示了在噪声杜芬振荡器上的管道中创建的功能,其中隐藏着阿里的消息。我们清楚地看到,TDA 特征在这么短的时间内确定了 1 和 0 的状态:

Topological features output from the Jupyter notebook.

结果

我们可以清楚地识别出两个性质不同的区域。

即使在噪声状态的情况下,Betti 表面也清楚地区分信号的 1 和 0 区域。

Betti 数在隐藏信号的 0 区域中比在 1 区域中下降得更快(随着ε增加)。

梯度增强分类器输出处理如下:首先,我们应用滚动窗口并计算其中的平均值。接下来,我们将高于预定义阈值的所有值标记为 1,否则标记为 0。

为了便于比较,我们通过使用以下工具独立训练四次,对 TDA 功能进行了基准测试:

  • 只有时报系列
  • 一组标准的时间序列功能
  • TDA 特色
  • 全部合并

为了测试对噪声的鲁棒性,我们在数据集的失真版本上训练每个配置(通过添加增加量的高斯噪声)。这是噪声函数的性能图:

Accuracy in function of noise.

我们看到,当我们使用所有功能时,可以实现最佳性能。因此,添加 TDA 特征提高了整体性能,并使分类器更能抵抗噪声。

在噪声被添加到信号之前,TDA 和标准策略都完美地执行。然而,这是一个难题,当我们加入噪音时,TDA 的表现优于标准策略,当两种方法结合使用时,表现更好。

这表明,不仅 TDA 特征本身具有高度预测性,而且它们还包含标准方法中没有的性能提升信息。

尽情探索您自己的抗噪信号处理 TDA 应用。

链接:

协方差矩阵的意义及其应用

原文:https://towardsdatascience.com/the-significance-and-applications-of-covariance-matrix-d021c17bce82?source=collection_archive---------4-----------------------

线性代数和各种应用之间的一个联系

“数学的美妙之处在于简单的模型可以做伟大的事情。”现代数据科学中不乏花哨的算法和技术。技术容易学,但也容易落后。然而,从长远来看,数学基础是有益的。协方差矩阵是一个简单而有用的数学概念,广泛应用于金融工程、计量经济学以及机器学习中。鉴于它的实用性,我决定从我的记事本中总结一些要点和例子,并整理出一个有凝聚力的故事。

Photo from Pixabay

协方差衡量两个随机变量在总体中一起变化的程度。当总体包含更高维度或更多随机变量时,用一个矩阵来描述不同维度之间的关系。用一种更容易理解的方式来说,协方差矩阵就是将整个维度上的关系定义为任意两个随机变量之间的关系。

用例 1:随机建模

协方差矩阵最重要的特点就是正半定,这就带来了

简单地说,乔莱斯基分解就是将一个正定矩阵分解成一个下三角矩阵与其转置矩阵的乘积。在实践中,人们用它来生成相关随机变量,方法是将分解协方差矩阵得到的下三角乘以标准法线。此外,矩阵分解在许多方面是有帮助的,因为使用隐藏因子来表征矩阵揭示了通用的属性,并且我们不经常能够显式地执行矩阵计算。

在金融工程中,蒙特卡洛模拟在期权定价中起着重要作用,在期权定价中,衍生品的收益取决于一篮子基础资产。给定股票价格演变的标准公式,该公式假设股票价格遵循几何布朗运动,相关股票价格可以通过将乔莱斯基分解应用于协方差矩阵来计算。

下面是我用 python 编写的一个简单例子,用这种方法模拟相关的股票价格路径。

*import numpy as np
import matplotlib.pyplot as pltmu_a, mu_b = 0.2, 0.3 # annual expected return for stock A and stock B
sig_a, sig_b = 0.25, 0.35 # annual expected volatility
s0_a, s0_b = 60, 55 # stock price at t0
T = 1 # simulate price evolution for the next year
delta_t = 0.001 
steps = T/delta_trho = 0.2 # correlation between stock A and stock B
cor_matrix = np.array([[1.0, rho],
                       [rho, 1.0]])
sd = np.diag([sig_a, sig_b]) 
cov_matrix = np.dot(sd, np.dot(cor_matrix, sd)) 
L = np.linalg.cholesky(cov_matrix) # Cholesky decompositionplt.figure(figsize = (12, 6))
path_a = [s0_a]
path_b = [s0_b]
st_a, st_b = s0_a, s0_b
for i in range(int(steps)):
    V = L.dot(np.random.normal(0, 1, 2)) 
    st_a = st_a*np.exp((mu_a - 0.5*sig_a**2)*delta_t + sig_a*np.sqrt(delta_t)*V[0])
    st_b = st_b*np.exp((mu_b - 0.5*sig_b**2)*delta_t + sig_b*np.sqrt(delta_t)*V[1])
    path_a.append(st_a)
    path_b.append(st_b)
plt.plot(path_a, label = 'stock A', linewidth = 2)
plt.plot(path_b, label = 'stock B', linewidth = 2)
plt.legend()
plt.title('Correlated Stock Movement Using Monte Carlo Simulation')
plt.ylabel('stock price')
plt.xlabel('steps')*

用例 2:主成分分析

PCA 是一种无监督的线性降维算法,将原始变量转化为这些独立变量的线性组合。它将整个数据集投影到不同的特征空间,在该空间中,它可以对解释数据最大差异的维度进行优先排序。机器学习实践者利用 PCA 通过降低低方差维度来降低计算复杂度,以及创建更好的可视化。

PCA 和协方差方差是怎么联系起来的? 特征分解

就像乔莱斯基分解一样,特征分解是一种更直观的矩阵分解方式,通过使用矩阵的特征向量和特征值来表示矩阵。特征向量被定义为当对其应用线性变换时仅由标量改变的向量。如果 A 是表示线性变换的矩阵, v 是特征向量,λ是对应的特征值。可以表示为 vv. 一个正方形矩阵可以有和它的维数一样多的特征向量。如果把所有的特征向量作为矩阵 V 的列,把相应的特征值作为对角矩阵 L 的元素,上述方程可以推广到 AV = VL。在协方差矩阵的情况下,所有的特征向量彼此正交,它们是新特征空间的主分量。****

参考资料:

  1. https://skymind.ai/wiki/eigenvector#code
  2. https://blog.csdn.net/thesnowboy_2/article/details/69564226
  3. https://datascienceplus . com/understanding-the-协方差矩阵/

3 个决策树分裂标准背后的简单数学

原文:https://towardsdatascience.com/the-simple-math-behind-3-decision-tree-splitting-criterions-85d4de2a75fe?source=collection_archive---------3-----------------------

Image by Bela Geletneky from Pixabay

🌀理解分割标准

决策树很棒,对各种任务都很有用。它们构成了业界大多数性能最佳的模型的主干,如 XGboost 和 Lightgbm。

但是它们到底是如何工作的呢?其实这是 ML/DS 面试中被问得最多的问题之一。

我们通常知道它们以逐步的方式工作,并且有一个树形结构,在这个结构中,我们根据某种标准使用某种特征来分割一个节点。

但是这些特征是如何被选择的,一个特定的阈值是如何被选择的呢?

在这篇文章中,我将谈论决策树中使用的三个主要分裂标准以及它们为什么有效。这是一个已经被反复提及但从未真正做得足够好的东西。

1.基尼杂质

根据维基百科,

Gini 杂质是一种度量,用于衡量从集合中随机选择的元素被错误标记的频率,前提是根据子集中的标签分布对其进行随机标记。

简单来说,基尼杂质就是一个节点 中杂质的 度量。它的公式是:

其中 J 是节点中存在的类的数量,p 是节点中类的分布。

为了更好地理解这个公式,让我们具体讨论一下二进制的情况,其中我们的节点只有两个类。

因此,在下面五个标有 A-E 的候选节点示例中,显示了正类和负类的分布,哪一个是理想状态?

我想你会说 A 或 E,你是对的。最糟糕的情况是什么?我认为在这个节点上数据正好是 50:50。

现在,这一切看起来很好,直觉上。基尼系数给了我们一个量化的方法。

让我们分别计算所有五个节点的基尼系数,并检查这些值。

✅基尼不纯的作品如预期的那样。节点 C 的最大值以及 A 和 e 的最小值。我们需要选择具有最小 Gini 杂质的节点。

我们还可以看到二元情况下的基尼系数图来验证上述情况。

Gini Impurity

❓So:我们如何在决策树中准确地使用它?

假设,我们有 UCI 心脏病的数据。“目标”字段是指患者是否存在心脏病。它是 0(不存在)或 1。

我们现在已经有了一个衡量标准(基尼系数),我们可以用它来评估一个特定变量在某个阈值(连续的)或值(分类的)上的分裂。

分类变量拆分

为了简单起见,让我们从一个分类变量开始——性别。

如果我们按性别划分,我们的树将如下所示:

If we split on Gender

注意我们用 Sex =0 和 Sex!=0,因此这可以很好地推广到具有多个级别的类别。我们的根节点有 165 +ve 的例子和 138 -ve 的例子。当我们按性别分开时,我们得到两个子节点。

我们已经知道如何计算一个节点的杂质。所以我们计算左孩子和右孩子的杂质。

I_Left = 1 - (72/96)**2 - (24/96)**2
I_Right = 1 - (93/207)**2 - (114/207)**2print("Left Node Impurity:",I_Left)
print("Right Node Impurity:",I_Right)
---------------------------------------------------------------
Left Node Impurity: 0.375
Right Node Impurity: 0.4948540222642302

我们这里有两个数字。我们需要得到一个单一的数字来提供单一分裂的杂质。那我们该怎么办?我们应该取一个平均值吗?我们可以取一个平均值,但是如果一个节点只有一个例子,而另一个节点有所有其他的例子,会发生什么呢?

为了减轻上述影响,我们采用了两种杂质的加权平均值,该平均值由单个节点中的样本数进行加权。在代码中:

gender_split_impurity = 96/(96+207)*I_Left + 207/(96+207)*I_Right
print(gender_split_impurity)
----------------------------------------------------------------
0.45688047065576126

连续变量分割

我们也可以用连续变量来分割。让我们尝试使用数据集中的胆固醇特征进行分割。我们选择了 250 的阈值并创建了一棵树。

I_Left = 1 - (58/126)**2 - (68/126)**2
I_Right = 1 - (107/177)**2 - (70/177)**2print("Left Node Impurity:",I_Left)
print("Right Node Impurity:",I_Right)
---------------------------------------------------------------
Left Node Impurity: 0.49685059208868737
Right Node Impurity: 0.47815123368125373

只看两者接近 0.5 的杂质,就可以推断不是好的拆分。尽管如此,我们还是像以前一样计算加权基尼系数:

chol_split_impurity = 126/(126+177)*I_Left + 177/(126+177)*I_Right
print(chol_split_impurity)
---------------------------------------------------------------
0.48592720450414695

chol_split_impurity > gender_split_impurity开始,我们根据性别进行划分。

事实上,我们评估了很多不同的拆分。对于连续变量有不同的阈值。以及分类变量的所有级别。然后选择在子节点中为我们提供最低加权杂质的分裂。

2.熵

Entropy == Randomness

另一种非常流行的在决策树中分割节点的方法是熵。熵是系统中随机性的度量。熵的公式是:

其中 C 是节点中存在的类的数量,p 是节点中类的分布。

再次讨论我们之前讨论过的二元情况。从 A 到 E 的所有 5 个案例的熵值是多少?

熵值按预期工作。节点 C 最大,A 和 e 最小。我们需要选择熵最小的节点。

我们也可以看到二元情况下的熵图来验证上述情况。

Entropy

那么我们如何在决策树中使用熵呢?

我们像以前一样使用心率示例。我们现在已经有了一个合适的度量(熵),使用它我们可以评估一个个体变量在某个阈值(连续的)或值(分类的)上的分裂。

分类变量拆分

为了简单起见,让我们从一个分类变量开始——性别。

如果我们按性别划分,我们的树将如下所示:

If we split on Gender

我们已经知道如何计算一个节点的随机性。所以我们计算左孩子和右孩子的随机性。

E_Left = -(72/96)*np.log2(72/96) - (24/96)*np.log2(24/96)
E_Right = -(93/207)*np.log2(93/207) - (114/207)*np.log2(114/207)print("Left Node Randomness:",E_Left)
print("Right Node Randomness:",E_Right)
---------------------------------------------------------------
Left Node Randomness: 0.8112781244591328
Right Node Randomness: 0.992563136012236

我们这里有两个数字。我们需要得到一个单一的数字来提供单次分裂的随机性。那我们该怎么办?我们再次采用加权平均,其中我们根据单个节点中的示例数量进行加权。在代码中:

gender_split_randomness = 96/(96+207)*E_Left + 207/(96+207)*E_Right
print(gender_split_randomness)
----------------------------------------------------------------
0.9351263006686785

连续变量分割

和之前一样,我们也可以用连续变量来分割。让我们尝试使用数据集中的胆固醇特征进行分割。我们选择阈值 250 并创建一棵树。

E_Left = -(58/126)*np.log2(58/126) - (68/126)*np.log2(68/126)
E_Right = -(107/177)*np.log2(107/177) - (70/177)*np.log2(70/177)print("Left Node Randomness:",E_Left)
print("Right Node Randomness:",E_Right)
---------------------------------------------------------------
Left Node Randomness: 0.9954515828457715
Right Node Randomness: 0.9682452182690404

只看两者都接近 1 的随机性,就可以推断不是好的分裂。尽管如此,我们还是像以前一样计算我们的加权熵:

chol_split_randomness = 126/(126+177)*E_Left + 177/(126+177)*E_Right
print(chol_split_randomness)
---------------------------------------------------------------
0.9795587560138196

chol_split_randomness > gender_split_randomness开始,我们根据性别进行拆分。和我们从基尼得到的结果完全一样。

3.差异

基尼系数和熵在分类场景中表现得相当好。

但是回归呢?

在回归的情况下,最常用的分割度量就是节点的加权方差。这也是有意义的:我们希望分割后节点的变化最小。

我们需要一个回归任务。所以,我们有 50 家创业公司的数据,我们想预测利润。

分类变量拆分

让我们尝试按分类变量进行拆分州=佛罗里达。

如果我们按 State=FL 进行分割,我们的树将如下所示:

总方差就是单个方差的加权和:

overall_variance = 16/(16+34)*Var_Left + 34/(16+34)*Var_Right
print(overall_variance)
----------------------------------------------------------------
1570582843

连续变量分割

和之前一样,我们也可以用连续变量来分割。让我们尝试使用数据集中的 R&D 支出功能进行拆分。我们选择了 100000 的阈值并创建了一棵树。

Splitting on R&D

只要看看这个,我们就能看到它比我们之前的分裂要好。因此,我们找到了这种情况下的总方差:

overall_variance = 14/(14+36)*419828105 + 36/(14+36)*774641406
print(overall_variance)
----------------------------------------------------------
675293681.7199999

自从有了overall_variance(R&D>=100000)< overall_variance(State==FL),我们更喜欢基于 R & D 的拆分

继续学习

如果你想了解更多关于数据科学的知识,我想调出吴恩达的这个 精品课程 。这是我开始的原因。一定要去看看。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——在这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

简单而实用的数据清理代码

原文:https://towardsdatascience.com/the-simple-yet-practical-data-cleaning-codes-ad27c4ce0a38?source=collection_archive---------5-----------------------

为了解决混乱数据的常见情况

在我的一篇文章— 我的第一个数据科学家实习中,我谈到了数据清理(数据预处理、数据管理……无论是什么)是多么重要,以及它如何能够轻易地占据整个数据科学工作流程的 40%-70%。世界是不完美的,数据也是。

垃圾进,垃圾出

真实世界的数据是脏的,我们作为数据科学家,有时也称为数据清理者,应该能够在任何数据分析或模型构建之前执行数据清理,以确保最高的数据质量。

长话短说,在数据科学领域呆了一段时间后,我确实感到在处理数据分析、可视化和模型构建之前进行数据清理的痛苦。

不管你承认与否,数据清理并不是一件容易的事情,大多数时候是耗时且乏味的,然而这个过程太重要了,不容忽视。

如果你经历过这个过程,你就会明白我的意思。这也正是我写这篇文章来帮助您以更流畅的方式执行数据清理的原因。

为什么这篇文章对你很重要?

My recent post on LinkedIn

一周前,我在 LinkedIn 上发帖,询问并回答了一些有抱负的数据科学家和数据科学专业人士面临的紧迫问题。

如果你一直在关注我的工作,我的任务是通过在 LinkedIn 上发起有抱负的数据科学家、数据科学家和其他不同专业知识和背景的数据专业人士之间的讨论,使 LinkedIn 上的共享学习环境民主化,特别关注数据科学。如果你想参与这些关于数据科学有趣话题的讨论,请随时关注我的 LinkedIn。您会惊讶于数据科学社区的参与度和支持度。😊

所以我在评论里得到了几个有趣的问题。然而,有一个由 Anirban 发布的特殊问题,我最终决定写一篇文章来回答这个问题,因为我不时地收到类似的问题。

事实上,不久前我意识到,当涉及到数据清理时,一些数据有类似的模式。这是我开始组织和编译一些数据清理代码的时候,我认为它们将适用于其他常见场景——我的数据清理小工具箱

因为这里的常见场景跨越不同类型的数据集,所以本文更侧重于展示和解释这些代码的用途,以便您可以轻松地即插即用。

在本文的最后,我希望您会发现这些代码很有用,并且会使您的数据清理过程更快、更有效。

我们开始吧!

我清理数据的小工具箱

在下面的代码片段中,出于不言自明的目的,代码是用函数编写的。您总是可以直接使用这些代码,而无需将它们放入参数稍有变化的函数中。

1.删除多列

有时,并不是所有的列都对我们的分析有用。因此,df.drop可以方便地根据您的指定删除所选的列。

2.更改数据类型

当数据集变大时,我们需要转换dtypes以节省内存。如果你有兴趣学习如何使用 Pandas 处理大数据,我强烈建议你看看这篇文章— 为什么以及如何使用 Pandas 处理大数据

3.将分类变量转换为数值变量

一些机器学习模型要求变量采用数字格式。这时,我们需要在将分类变量输入模型之前,将它们转换成数值变量。就数据可视化而言,我建议保留分类变量,以便有更明确的解释和理解。

4.检查丢失的数据

如果您想检查每一列的缺失数据的数量,这是最快的方法。这使您可以更好地了解哪些列丢失的数据较多,从而决定您下一步的数据清理和分析操作。

5.删除列中的字符串

可能有一段时间你会面对新的行字符或者其他出现在字符串列中的奇怪符号。使用df['col_1'].replace可以很容易地解决这个问题,其中col_1是数据帧df中的一列。

6.删除列中的空白

当数据混乱时,一切皆有可能。在字符串的开头有一些空格是很常见的。因此,当您想要删除列中字符串开头的空格时,这种方法很有用。

7.用字符串连接两列(带条件)

当您希望有条件地将两列与字符串组合在一起时,这很有帮助。例如,如果第一列中的字符串以某些字母结尾,您希望将第一列与第二列连接起来。根据您的需要,结尾字母也可以在连接后删除。

8.转换时间戳(从字符串到日期时间格式)

在处理时间序列数据时,我们很可能会遇到字符串格式的时间戳列。这意味着我们可能必须将字符串格式转换为日期时间格式——根据我们的需求指定的格式——以便使用数据进行有意义的分析和演示。

最后的想法

(Source)

感谢您的阅读。

这些代码本质上实现起来相对简单。我希望这个数据清理的小工具箱能让你更有信心执行数据清理,并根据我的经验从更广阔的角度了解数据集通常是什么样子。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq 的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)

简单而实用的数据可视化代码

原文:https://towardsdatascience.com/the-simple-yet-practical-data-visualization-codes-bca99971cdb2?source=collection_archive---------10-----------------------

解决绘图和 EDA 的常见情况

在上一篇文章中,我分享了关于我的数据清理小工具箱,在此之前,我意识到一些代码适用于最常见的混乱数据场景。

换句话说,有一种模式(或一种方法),通常用于数据科学中的数据清理,我将它们编译成函数,以便将来重用。

有趣的是,在我看来,这种“模式”在探索性数据分析(EDA)中也会被注意到,尤其是在数据可视化的情况下。我认为这篇文章有必要在这里分享我的代码和解释,以造福他人。

记得几个月前我发表了一篇文章——关于电子商务数据的探索性数据分析?在那篇文章中,我谈到了 EDA 在数据科学中的重要性,以及如何以更简单的方式探索和可视化数据,从而为您或潜在的利益相关者提供有意义的见解。

为了理解您的数据并与利益相关者交流结果,数据可视化对于让数据有故事可讲(讲故事)至关重要。

因为这里的常见场景跨越不同类型的数据集,所以本文更侧重于展示和解释代码以及绘图的用途,以便您可以在项目中轻松地即插即用。

在这篇文章的最后,我希望你会发现这些代码很有用,它们会让你的数据可视化过程更有趣、更快速、更有效!

我们开始吧!

数据集背景

在整篇文章中,我们将使用从 Kaggle 获得的电子商务数据集进行数据可视化(关于数据的更多详细信息可以在这里找到)。

简而言之,这些数据由来自不同国家的客户的交易数据组成,这些客户从一家位于英国的在线零售公司购买独特的全场合礼品

下面的代码实际上可以根据您的需要进行一些小的调整,推广到其他数据集。

这里的目标是向您展示在给定一些通用数据集的情况下,我通常如何执行数据可视化。此外,代码绝不是一个详尽的汇编,以涵盖所有类型的阴谋,但他们应该基本上足以让你开始。

这里显示的数据也经过了一些数据清理,以便我们可以直接使用它,并专注于数据可视化。如果你想知道数据清理是如何完成的,你可以随时参考之前写的这篇文章

这个数据可视化的 Jupyter 笔记本和干净的数据已经上传到我的 GitHub

Snapshot of how the data looks like

鉴于我们处理的是典型的电子商务数据,每一列都非常简单明了。让我们看看我们能做些什么来可视化这些数据!

我的数据可视化小工具箱

1.箱线图—单价

Boxplot for unit price of the items

这里的单价是指每个项目的价格。在电子商务世界中,我们对单价的传播很好奇,以了解其价格的分布。

我们使用 Seaborn 来绘制箱线图(这是我最喜欢的工具之一!)只有一行代码,其余的只是为了标记的目的。从图中我们看到,大部分单价低于 800 美元,最高单价可达 8000 美元以上。很好。让我们进行下一步。

2.分布图—销售数量

Distribution plot of quantity sold

同样,我们使用 Seaborn 来绘制分布图。在这种情况下,我们只考虑销售量(小于 100),因为这是大部分数据所在的位置。

我们看到大多数商品的销售量都在 30 以内。酷毙了。销售到各个国家的订单数量呢?

3.水平条形图

Bar chart of the number of orders for different countries

由于在线零售公司的总部设在英国,所以英国的订单数量最多也就不足为奇了。因此,为了在其他国家之间进行更有意义的比较,我们有意忽略了这个国家。

现在你可能已经注意到,dataframe.groupby在绘制由一些分类变量分组的连续变量时非常有用。

您甚至可以直接从数据帧中绘图,而不必使用matplotlib。使用垂直条形图还是水平条形图取决于您的需求。在这种情况下,我们选择了水平条形图,以更清晰的方式显示每个国家的名称。

我们将在下一节看到如何使用垂直条形图。

4.垂直条形图(带注释)

Number of orders for different days

带注释的竖条图来了。有时,我们可能希望显示一个带有百分比注释的垂直条形图,以显示某些变量所占的部分。

在我们的上下文中,我们希望知道不同日期的订单数量,并查看它们各自的百分比以获得更多的见解。

上面附加了一个代码示例,向您展示如何在不影响视觉效果的情况下在同一个绘图中标注百分比。

5.条形图和折线图(组合)

Combined bar chart and line plot to show the total amount spent for different months

最后,我们想知道客户每月的总消费金额(或总销售额)。

在某个时间点,我们可能还想知道当前元素和先前元素之间的百分比变化。在这种情况下,我们可以制作一个折线图,以了解从上个月到本月的百分比变化——全部在一个图中。

明智而谨慎地使用这种组合图,因为这可能会使信息过多的人感到困惑。同样,组合情节的可用性取决于情况和需要。

最后的想法

(Source)

感谢您的阅读。

数据可视化不过是讲故事。谁是你的观众?你希望你的观众从可视化中获得什么?要执行的可操作的洞察是什么?

我希望这个数据可视化的小工具箱能在某些方面帮助你。

如果你有兴趣学习如何可视化数据和讲故事来抓住观众的注意力并有效地传达你的想法,我强烈建议你看看这本书——《用数据讲故事:商业人士数据可视化指南》。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 目前是东南亚排名第一的商业银行 API 平台Staq的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)

使用 Pandas & Matplotlib 的最简单的数据科学项目

原文:https://towardsdatascience.com/the-simplest-data-science-project-using-pandas-matplotlib-9d7042e7ce6f?source=collection_archive---------6-----------------------

多年来亚马逊森林大火

Photo by Markus Spiske on Unsplash

我们如此努力地寻找完美的数据集来测试和提高我们的技能。但事实是,没有一个数据集是完美的。通过对数据进行预处理,你可以使它变得完美,或者至少改进它——这是任何数据相关项目的重要部分。

所以,只要拿起任何数据集并开始工作!我尝试了一下,旅程充满了乐趣和学习。

以下所有代码都是在 Jupyter Notebook 中实现的。

我得到了一个巴西森林火灾的数据集(来自 Kaggle ),那里有地球上最大的雨林——亚马逊雨林。我不想挑剔,所以这个数据集完全是随机选择的。

关于数据:

year是森林火灾发生的年份;
state是巴西的州;
month是森林火灾发生的月份;
number是报告的森林火灾数量;
date是报告森林火灾的日期

  • 浏览 csv 文件(amazon.csv),您会注意到有些numbers是十进制的。2.588 起森林火灾说不通。这是因为小数是千的格式。所以,2.588 意味着 2588 次森林火灾。这在读取 csv 文件时很容易解释。
  • 您还会注意到month列是葡萄牙语的。这个问题也即将得到解决。
  • 下载后第一次导入文件时,出现错误:UnicodeDecodeError: 'utf-8' codec can't decode byte in position : invalid continuation byte。为了解决这个问题,我在 Sublime Text 中打开了 csv 并:用编码保存- > UTF-8。但是,这导致了date列中的错误。于是,我干脆把原来的 csv 打开,导出为 csv。很奇怪,但很有效。

进口:

对于这个项目,我使用virtualenv建立了一个虚拟环境。检查这个帖子的所有步骤。我们使用三个主要的库:pandasmatplotlibgoogletrans
!pip3 install这些包(如果你还没有)在导入它们之前。

import sys
sys.path.insert(1, './lib/python3.7/site-packages')
import pandas as pd
import googletrans
import matplotlib.pyplot as plt; plt.rcdefaults() 

完成sys.path.insert步骤是为了确保虚拟环境的站点包目录包含在系统路径中。在这个 python 虚拟环境帖子中了解更多。

读取数据:

确保amazon.csv在您的工作目录中。

data = pd.read_csv("amazon.csv", thousands = '.')

thousands = "."参数弥补了十进制格式。

查看数据:

data.shape

data.shape

data.head()

data.head()

data.describe(include= "all")

给出了一个很好的数据总结。例如所有列的计数、每列中出现的最高值(如果适用)及其频率。

data.describe(include = “all”)

检查是否有任何缺失值:

data.isna().sum()

data.isna().sum()

没有吗?太好了!

将数据集分成更小的子集:

我的第一个想法是想象几年来,几个月来森林火灾的数量。你需要能够识别出大局中的小部分。

让我们从数据集中删除与森林火灾数量无关的行。因此,必须删除 number 列值为 0 的任何行。我们首先将 0 转换为 NaN,然后删除特定列number中带有 NaN 的行。

data = data.replace(0, np.nan)
data2 = data.dropna(subset=['number'])

我们的数据集现在从 6454 行减少到 5837 行。

data2.describe(include= "all")

data2.describe(include=”all”)

创建数据子集:

forest_fire_per_month = data2.groupby('month')['number'].sum():按月对数据分组,并对数字求和。输出的是一个熊猫系列。

print(forest_fire_per_month):我们注意到结果是按字母顺序排列的。为了将其恢复到每月订单,我们使用 dataframes 的reindex属性:

forest_fire_per_month = forest_fire_per_month.reindex(months_unique, axis=0) 

在哪里,

months_unique = list(data.month.unique())

months_unique

接下来,我们通过forest_fire_per_month = forest_fire_per_month.to_frame()将序列转换成数据帧

forest_fire_per_month.head()

forest_fire_per_month.head()

这看起来不对劲。这是因为month被认为是数据帧的索引。
设置默认指标:
forest_fire_per_month.reset_index(level=0, inplace=True)

forest_fire_per_month.head()

forest_fire_per_month.head()

输入googletrans:

googletrans是一个实现 Google Translate API 的 python 库。我在months_unique上测试过。

translator = Translator() ***#create an object of Translator*** for month in months_unique: 
    detected = translator.detect(month)     
    translated = translator.translate(month)     
    print(detected)     
    print(translated)     
    print("...")

Output for detected and translated month

返回的Translator()对象的成员变量:

  • src —源语言(默认:自动)
  • dest —目标语言(默认:en)
  • 原点—原始文本
  • 文本—翻译的文本
  • 发音——发音

这些变量可以使用.操作符单独访问。

例如:translated.text将输出翻译后的英文文本。

我们使用Translator的实例将forest_fire_per_month中的month列翻译成英语。

translator2 = Translator() ***#create a new object of Translator. #cannot use the one defined before as that contains the latest #month’s calculated value***for i, m in enumerate(forest_fire_per_month['month']):
    translated = translator2.translate(m)  
    month1 = translated.text    
    forest_fire_per_month.at[i, 'month'] = month1

enumerate()函数为 iterable 对象中的每一项分配一个索引,该索引可用于以后引用该项。
Python 中常用enumerate()函数代替for循环。这是因为enumerate()可以迭代一个条目的索引,以及条目本身。

print(forest_fire_per_month)

forest_fire_per_month

除了一个案例之外,它对所有案例都有效!

剧情:

让我们用条形图来表示它。

plt.figure(figsize=(25, 15)) ***#specify width and height*** ***#plt.bar(x-values, y-values)*** plt.bar(
forest_fire_per_month['month'],
forest_fire_per_month['number'], 
color = (0.5,0.1,0.5,0.6)) ***#use*** ***.suptitle*** ***for the actual title and .title for the subheading***plt.suptitle('Amazon Forest Fires Over the Months', fontsize=20) plt.title('Using Data from Years 1998 - 2017', fontsize=20)  plt.xlabel('Month', fontsize=20) 
plt.ylabel('Number of Forest Fires', fontsize=20)***#plt.text(x-coordinate, y-coordinate, valueOfText, alignmnet)******#this adds text at the top of each bar indicating its value***for i, num in enumerate(forest_fire_per_month['number']):
    plt.text(
        i,
        num + 10000,
        num,
        ha='center',
        fontsize=15) ***#plt.setp is to set a property on an artist object.
#plt.gca() gets the current axes (gca) instance on the current figure #matching the given keyword args.
#xticklabels and yticklabels are nothing but the values of the #lables on the x and y axis.
#The code below lets us set the fontsize and alignment of the x and #y axis tick labels***plt.setp(plt.gca().get_xticklabels(),
         rotation=45,
         horizontalalignment='right',
         fontsize=20)plt.setp(plt.gca().get_yticklabels(), fontsize=20)

输出:

Output bar graph

这是一个非常小的文档,说明了可以用这个数据集做什么。你只需要开始。而且这个过程充满了学习新东西。

因此,只需下载一个随机数据集并开始行动!

超级有用的资源:

  • [googletrans](https://www.codeproject.com/Tips/1236705/How-to-Use-Google-Translator-in-Python)
  • [enumerate()](https://www.bitdegree.org/learn/python-enumerate)进行循环

最简单的神经网络:理解非线性

原文:https://towardsdatascience.com/the-simplest-neural-network-understanding-the-non-linearity-10846d7d0141?source=collection_archive---------11-----------------------

您希望使用数字平方构建的第一个神经网络。是的,这不是异或或 MNIST

每当你想了解 NNs 或数据科学或人工智能时,你就通过谷歌搜索,通过 Reddit,获得一些 GitHub 代码。到处都有 MNIST 数据集、GANs、卷积图层。每个人都在谈论神经网络。你拿起你的笔记本电脑,运行代码,瞧!它工作了。然后你会挠头,你知道这是数学,但这是怎么回事?

突然你想:够了,我要学基础。你去谷歌搜索‘神经网络基础’,结果是:很多教程展示了 MNIST 数据集、异或门。你实现了,它工作了,但是问题出现了 鸭子是如何工作的? 你开始了解多层感知器——神经网络的基础知识。再说一次,研究盖茨并不能让你满意,因为这似乎并不能预测什么。它来自训练数据集的 1 和 0。您想要一些真实世界的示例,然后您看到了这篇文章。你再想一想关于 NNs 的文章。但在本文中,没有基础理论,而是神经网络的适用性。我并没有向你们展示内部数学发生的情况,而是让你们感受一下神经网络是如何按照你们所看到的方式运作的。希望这能帮助你理解“基本”神经网络的工作原理(非线性)。

和外太空一样,大脑是一个在很多方面都还无法解释的东西。我们知道存在小的类似外星人的结构(是的,那些是可怕的),神经元,它们负责信息的传递,大脑有几个部分,像大脑,小脑,它们有不同的功能。不同的神经元被不同地激活(以非线性方式),并通过电脉冲传递信息。但是这些器官如何工作的确切功能以及神经元如何结合、传递和存储信息并使大脑成为最不可思议的事物之一,并且仍然有巨大的研究范围。

Neural Networks: An attempt to apply Brain’s network to machines

当你作为一名人工智能爱好者开始你的旅程时,你会遇到许多开始学习的方法。数据科学与统计学和数学的关系更大。但据观察,神经网络可以将数据科学的力量提高到一个巨大的水平,因为它也可以学习数据之间的非线性关系,这是很难通过正常的统计数据观察到的。

什么是神经网络——已经足够了

有许多很好的帖子解释了神经网络如何工作,反向传播,不同的节点如何使用权重相互连接,以及许多超参数控制这些。因此,我不会在这篇文章中给出这些细节。这个这个是关于神经网络和反向传播的非常好的帖子,其中第二个链接我强烈推荐,它帮助我深入了解神经网络。在第二个链接中,有一个 relus(激活函数)如何帮助确定网络中的非线性复杂性的详细解释。

但是由于神经网络都是关于数学,非线性,学习;我想看看它如何适应简单的非线性函数。是的,平方函数

这是我为了分析而创作的 jupyter 笔记本:

[## tseth92/NeuralNet_Square

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/tseth92/NeuralNet_Square)

别说了,给我看看代码

导入库:

我们将主要使用 TensorFlow 的 Keras,以及来自 Keras 的 Sequential 和 Dense。Tensorflow 是一个广泛用于神经网络和深度学习的框架。Keras 曾经是隔离 Tensorflow/Pytorch 的包装器,这样你用 Keras 开发的代码可以在任何库中工作。但是在 tensorflow2.0 中,Google 意识到 TF1.0 太复杂了,他们在 tensorflow2.0 中引入了 Keras API 作为它的一部分。

顺序型和功能型是 Keras 中的两种车型。其中顺序允许层按顺序连接,即。一个接一个;该功能允许将整个网络中的任何层连接到任何层。因为我们将只使用一个具有一个输入层和一个输出层的隐藏层。

密集有助于实现密集连接的层。Keras core 提供了更多的实现,如卷积、LSTM 等。但这不是 Keras post,还是把重点放在我们的神经网络上吧。

*'''Training a neural network to predict the square of a number'''*
**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **pp**
**from** **tensorflow** **import** keras
**from** **keras.models** **import** Sequential
**from** **keras.layers.core** **import** Dense
**from** **IPython.display** **import** Audio, display

设置一些超参数:

让我们看看创建和运行这个神经网络需要哪些超参数。

n _ samples:1 个历元需要多少个样本。

历元:当所有样本完成正向和反向传播时

batch_size :一次可以向神经网络引入多少个样本

mid_range :取样数量的范围。

num_neurons: 要保留在隐藏层中的神经节点数

我们需要 100000 个 1 到 10 之间的样品。所以,它会给我们 1.02,7.89 这样的值

*'''configurations for neural net'''*
*# change these values to experiment*
n_samples = 100000 *# number of samples between 0 and mid_range*
epochs = 400 # number of times for the fwd and backward propagation
batch_size = 1000 # number of samples sent through NN at once
mid_range = 10 *# range within which data is required* num_neurons = 10 # number of neurons in the hidden layer

生成数据样本:

get_data 方法取 n_samples = 100000,mid_range=10,这意味着它将在 1 和 10 之间随机产生 1000000。

*'''creates random samples of n_samples rows which are between 0 to 1.*
*mid_range decides the range under which the samples will be created.'''*
**def** get_data(n_samples, mid_range):
  X = np.random.random((n_samples,1))*mid_range-(mid_range/2)
  *# eg. if n_samples = 10000, mid_range = 10 then it will create samples b/w* 
  *# 0 and 5 positive and negative*
  y = X*X
  *#print(X)*
  **return** X,y

Data Distribution for y=x²

创建神经网络模型:

在这里,我们创建一个神经网络的一个节点作为输入,10 个节点作为隐藏层(没有任何硬性规定。检查哪个最适合你)和一个输出层。

*''' creating the neural net model of 1:20:1; relu activation, mse as loss and* 
*adam optimizer'''*
**def** get_model():
  model = Sequential()
  model.add(Dense(num_neurons, input_shape=(1,), activation='relu'))
  model.add(Dense(1))
  print(model.summary())
  model.compile(loss='mse', optimizer='adam')
  **return** model

训练用样本生成的模型:

如上图所示,我们使用所有 10,00,000 个样本对神经网络进行了限定次数的训练。网络的输入为 X,预期输出为 y。

X and y fed to the Neural Network

*''' train the model for specified number of epochs, batch_size'''*
**def** train_model(X, y, model, epochs, batch_size):
  h = model.fit(X, y, validation_split=0.2,
               epochs=epochs,
               batch_size=batch_size,
               verbose=1)
  pp.figure(figsize=(15,2.5))
  pp.plot(h.history['loss'])
  **return** model

Y-axis shows the error and X-axis as the number of epochs. The training error ie. rmse reduces as the number of epochs is increased.

预测模型:

这里我们预测 X_train 的模型,它是训练数据,而 X_test 在训练数据之外。

*''' predict the model for X(training data) and or X2 which is outside* 
*the training dataset'''*
**def** predict_model():
  pred = model.predict(X)
  mid_range = 20
  X2 = np.random.random((n_samples,1))*mid_range-(mid_range/2)
  pred2 = model.predict(X2)

  *# uncomment below code to observe the expected and actual values*
  *# in the form (inputData, expectedOutputData, predictedOutputData, difference)*

  *#pred2 = model.predict([-6])*
  *#for i,j in zip(X, pred):*
  *#  print(i,i*i,j, j-(i*i))*
  pp.figure(figsize=(10,3))
  pp.plot(X,pred, '.')
  pp.xlabel('x')
  pp.ylabel('prediction')
  pp.title('Prediction within training sample space')

  pp.figure(figsize=(10,3))
  pp.plot(X2,pred2, '.')
  pp.xlabel('x')
  pp.ylabel('prediction')
  pp.title('Prediction outside training sample space')

主要方法:

**if __name__ == '__main__' :**
  X_train,y_train = get_data(n_samples, mid_range_train)
  X_test,y_test = get_data(n_samples, mid_range_test)
  model = get_model()
  pp.figure(figsize=(10,3))
  pp.plot(X_train, y_train,'.')
  pp.title('Original Training Data')
  model = train_model(X_train, y_train, model, epochs, batch_size)
  predict_model(X_train, X_test)
  # below is audio which will fireup(literally :D) when the training and 
  #prediction completes
  display(Audio(url='[https://sound.peal.io/ps/audios/000/000/537/](https://sound.peal.io/ps/audios/000/000/537/) \
                original/woo_vu_luvub_dub_dub.wav', autoplay=True))

为什么训练样本空间之外的预测不同?

主要原因是神经网络擅长插值而不是外推 ie。如果数据位于样本空间内,(可能不是训练数据,但在训练数据范围内),例如本例中的 1–10。

如果我试着预测 11,12 等等。它可能会预测错误。原因是在样本空间之外,神经网络离开了非线性,变成了线性,正如你从上面的图中看到的。

你应该做的一些实验:

  1. 将 mid_range 更改为 100 ,看看性能如何下降。原因是现在样本空间太庞大,无法想象在 1 和 2 之间,有无限大的数。因此,1–100 对于样本空间来说太大了。你也可以为此进行训练。但是你可能需要 100,000,000 个样本和大量的纪元。也许更多。为此,您需要强大的计算环境和更多的时间。
  2. 改变 num_neurons 看看它表现如何。你可以看到,随着神经元数量的减少,它会变得越来越线性,并开始失去非线性。原因是非线性伴随着许多线性的加强(许多线性函数的产物)。
  3. 改变批量观察较低和较高批量的表现。批量太小,训练时间太长,而且一段时间后会饱和,不能很好地训练。批量太大,需要收敛的时期就越多。所以,最好是保持一个最佳值(最佳点)

:我给你看的这段代码是基于 tensorflow1。如果我不使用 Keras,而是使用 tensorflow2.0 并使用 tf.keras,x 会失败,我已经在 GitHub 上提出了这个问题的问题。当问题解决后,我会在这里更新。在 Jupyter 笔记本中,它仍然使用 1。TensorFlow 的 x 版本。

在下一篇文章中,我将向您展示如何通过创建两个微服务并使用 Flask rest 和 gRPC 调用它们,通过 Google Kubernetes 引擎将这种神经网络训练和预测部署到 Kubernetes 集群。不要错过它,因为它都在一个帖子里。在那之前,继续玩神经元(不是真正的神经元:P)。在 LinkedIn 上与我联系。结束!!。

辛普森一家遇到了数据可视化

原文:https://towardsdatascience.com/the-simpsons-meets-data-visualization-ef8ef0819d13?source=collection_archive---------6-----------------------

介绍

没有什么比《辛普森一家》更让我喜欢的了。三十季 600 多集的动画喜剧在我心中占有特殊的位置。偶尔,当的《犁先生》的《人人都讨厌内德·弗兰德斯》出现在我脑海中时,我会发现自己在跟着唱。

很自然地,当我发现我可以下载所有我想要的剧集脚本时,我知道我该做什么。几乎可以接触到荷马说过的任何东西,我忍不住戴上我的数据科学家帽子,以便从过去三十年最著名的动画电视节目之一中梳理出一些见解。

人物

我们来看看剧中的人物。下面是一个气泡图,显示了 15 个字符的最大行数和他们的总行数。气泡大的角色比气泡小的角色说的台词多。

很明显,这部剧的主角实际上是荷马、玛吉、巴特和丽莎·辛普森。他们比其他角色有更多的台词。有趣的是,尽管格兰帕是辛普森家庭的一员,经常出现在辛普森家,但他并不像家里的其他人甚至其他角色那样爱说话。

现在我们已经了解了剧中每个角色的对话量,让我们更进一步,使用热图来观察角色之间的对话量。

Rows speak to columns. The color of each square represents the number of lines that the character in each row said to the character in each column. Lighter squares mean that more lines were spoken.

这个情节向我们展示了人物之间三种主要的互动。首先,辛普森一家内部有很多对话。接下来,辛普森家庭成员和角色之间的对话也不多。最后,很少有不涉及辛普森一家的对话。

这个情节的巧妙之处在于它突出了一些有趣的角色动态。

例如,小丑 Krusty 与法律的冲突反映在与警察局长 Wiggum 的大量对话中。

我制作了另一张热图,其中包含了 75 个角色。这是一幅美丽的画面,但也表明大多数对话只发生在几个角色之间(即数据有一条“长尾”)。

heat map with top 75 characters

他们在说什么?

我们能更好地理解这些角色在说什么吗?一种方法是看他们说的话的情绪。

我们可以使用自然语言处理技术 VADER 情感分析来量化每一行的情感。需要注意的一点是,这种方法是针对社交媒体文本优化的,所以我们应该对结果持保留态度。

现在我们可以看到,根据对它们的积极程度的估计,排序最多的 30 个字符。似乎埃德娜·克拉巴佩尔(巴特的老师)和帕蒂·布维尔(玛吉的妹妹)是最积极的角色。然而,我从未发现它们特别令人愉快。

另一方面,令人欣慰的是,内德·弗兰德斯在排行榜的顶部,祖父、纳尔逊和墓地看守人威利在底部。另外,有趣的是 Sideshow Bob 既有非常积极的一面,也有非常消极的一面。他是小丑 Krusty 的伙伴,所以他应该是一个积极的家伙,但当我们记得他所有的谋杀阴谋,看到这样的消极并不奇怪。

查看某些字符是否比其他字符有更长的行也是有帮助的。也许荷马有最多的台词,因为他是主角,但也许他一次只说几个词,像“嗯,油炸圈饼”或“为什么你小!”下面的方框图将帮助我们了解每行中哪些字符说得最多。

事实证明,只有少数角色的每行字数的中位数超过 10 个,但许多人至少有几行话要说很长时间。

玛吉·辛普森很少说话(事实上她还是个婴儿),但她至少有一次长篇大论。特洛伊·麦克卢尔和肯特·布罗克曼拥有最大的每行字数中位数,当我们想起他们都是电视明星时,这是有道理的(肯特·布罗克曼发布新闻,而特洛伊·麦克卢尔是 70 年代过气的演员)。

爷爷辛普森是节目中最长的。我会把它留在这里给你欣赏。

一个窍门是给他们讲一些没有任何意义的故事……就像那次我乘渡船去谢尔比维尔一样。我的鞋子需要一个新鞋跟,所以我决定去摩根维尔,那时候他们叫它谢尔比维尔。所以我在腰带上绑了一个洋葱,这是当时的流行款式……现在乘渡船要花 5 分钱,在那个时候,5 分钱硬币上有大黄蜂的图案。你会说“给我五只 25 美分的蜜蜂”。现在,我们说到哪了?哦,是的,重要的是我的腰带上有一个洋葱,这是当时的风格。他们没有白洋葱,因为战争…

除了了解每个角色说了多少话,我还好奇他们什么时候说话。数据中的每一行都包括一个事件内时间戳,这让我可以回答这个问题。我考虑了行数最多的 3000 字。

我把角色分成两类,只出现在一集的和出现在不止一集的。在 y 轴上画出每个角色的(按比例)行数,很明显,平均来说,有更多行数的角色更倾向于出现在剧集的中间。这是有道理的,因为他们总是说得太多,他们的平均时间将接近一集的中间。

然而,有趣的是,在右上角,看起来好像只出现在一集《辛普森一家》中的角色通常会讲到这一集的三分之二。这似乎是合理的,因为我们可能会期望在剧集中间的某个地方遇到新角色,而不是一开始,而且随着我们对他们的了解,他们可能会说更多的台词。

他们在哪里说话?

到目前为止,我们只研究了角色和他们的台词。我们还没有调查《辛普森一家》剧集的拍摄地点或它们之间的关系。

我们看到春田小学、莫酒馆和春田核电站(荷马工作的地方)是剧中最常见的地点。我要指出的是,我把辛普森家从这个地块中移走了,因为否则它会占据整个空间。

其他受欢迎的地点是教堂、客厅、Kwik-E-Mart 甚至伯恩斯庄园。每个方框的颜色和大小与每个地方说的台词数量相对应。

真实的地方呢?剧中人物对我们的世界了解多少?我们可以做的一件事是看看他们提到美国每个州的次数。

他们经常谈论纽约、德克萨斯、加利福尼亚、阿拉斯加、佛罗里达、华盛顿,甚至内布拉斯加。我应该指出,我们应该更仔细地看看华盛顿的数据。我过滤掉了包含“华盛顿特区”或“乔治·华盛顿”的行,但可能有其他情况,它们不一定是在谈论州。

这很好,因为它不受制于美国热图的典型问题。这些图常常变成人口密度图,因为我们要绘制的东西通常与人口有关。然而,由于我们看到的是一个并不真正与人口相关的指标,我们不应该预料到(也没有)这个问题。

现实世界中的辛普森一家

剧本台词让我们更好地理解了《辛普森一家》中人物和地点的动态。现在让我们换个话题,审视一下节目的观众。下面是美国所有剧集的观众人数分布。

大多数剧集都有八九百万观众观看,但有些已经被观看了三千万甚至更多!一集少于 1500 万的观众比拥有更多观众要常见得多。

然而,这并没有考虑到时间,尽管我们认为这是一个重要的因素。正如我的下一个情节将展示的那样,在三十年的过程中,《辛普森一家》的受欢迎程度已经发生了变化。

这种可视化是交互式的,你可以在克隆 Github 回购后在线这里获得完整版本。它是一个 html 文件,可以下载并在浏览器中打开。如果这不起作用,你可以重新运行这个笔记本

该图显示了每集的 IMDB 评分(蓝色)和美国浏览量(橙色)。此外,当鼠标悬停时,它会显示剧集的名称和季节。水平滚动显示所有剧集的完整时间线。

很明显,一开始,《辛普森一家》有很多观众。事实上,他们的受欢迎程度一直持续到第八季结束。在第九、第十和第十一季中,观众寥寥无几。第十二季一开播就有了显著的提升,碰巧的是,《史上最差剧集》在那一季拥有最多的观众。从那以后,《辛普森一家》经历了一个稳定的衰落。

看的人少吗?也许吧。然而,总体上看电视网的人越来越少。收视率非常接近他们一直以来的水平,所以我要说的是《辛普森一家》还活着,而且很好。

结论

在这篇报道中,我们看到了很多关于《辛普森一家》的内容,甚至像我这样的忠实观众以前可能都没有想过。我们知道了谁说得最多,谁和谁说话,以及这些角色在说什么。除了他们谈论的地点之外,我们还知道了他们谈论的时间和地点。最后,我们研究了他们在流行文化中的地位,以及他们是如何生存了这么久的。

我将很高兴收到以上任何反馈。你可以通过 LinkedIn 或者电子邮件在 areevesman@gmail.com 找到我。所有代码和图都可以在 Github 上获得。请让我知道你发现了什么见解!

点击此链接查看更多辛普森分析:https://www.youtube.com/watch?v=9D420SOmL6U

快速跟踪我的数据科学学习旅程的单一课程

原文:https://towardsdatascience.com/the-single-course-that-fast-tracked-my-data-science-learning-journey-74664eaf06f0?source=collection_archive---------8-----------------------

当我刚开始从事数据科学时,这极大地提高了我的理解、技能和信心

在挖掘我所知道和信任的令人敬畏的资源之前,有一个重要的披露:

下面的一些链接是附属链接,这意味着如果你选择购买,我将赚取佣金。这项佣金不会增加你的额外费用。请理解,我对所有这些课程都有经验,我推荐它们是因为它们有帮助和有用,而不是因为如果你决定买东西,我会给你一点佣金。请不要在这些课程上花钱,除非你觉得你需要它们,或者它们会帮助你实现你的目标。

好了,现在我们有了完整的披露。让我们直入主题吧。

我每天都收到来自不同背景的有抱负的数据科学家的消息,问我为数据科学初学者选择什么在线课程。

在我的文章中— 如何进入数据科学?,我分享了我在有大量训练营和在线课程时选择合适的方法。

特别是,我提到了一些我个人参加的课程,当我刚开始从事数据科学时,它们对我非常有用。

单靠在线课程和认证绝对不足以成为一名数据科学家。

在线课程是结构化的,旨在帮助你学习你感兴趣的特定主题刚刚好开始。

证书是用来展示你学到了什么,而不是你精通什么。

在提到的课程中,有一门课程极大地提升了我刚开始从事数据科学时的理解、技能和信心。

很有可能你会认为这个课程是吴恩达教授的 机器学习 课程(抱歉让你失望了!).

课程为Python for Data Science and Machine Learning boot camp授课老师何塞·波尔蒂利亚在数据科学教学方面有着丰富的经验。

Python 用于数据科学和机器学习训练营

我记得当我第一次开始时,我就像另一个有抱负的数据科学家一样,搜索在线课程,只是为了弄脏我的手,并提高我对使用 Python 进行数据分析、可视化和机器学习的理解。

说实话,那时候我只是有一些 Python 的编程经验,对机器学习一无所知,更不用说深度学习的知识了。

但有一点是肯定的,我渴望知识,想向一个有丰富经验的人学习,他已经处于我渴望实现的阶段。

因此,这门课程—Python for Data Science and Machine Learning boot camp受到了强烈推荐,并成为排名最高的课程之一。

我起初持怀疑态度,认为我会再次落入这个花哨而又吸引人的标题的陷阱。

所以我做了很多研究,查看了它的评论,并与其他在线学习平台进行了比较。你猜怎么着,这钱花得值。

为什么是这门课而不是其他课?

(Source)

当我刚开始从事数据科学时,我说这门课程极大地提高了我的理解、技能和信心,这是有原因的。

就以吴恩达教授的 机器学习 课程为例。课程很梦幻,俗称学习机器学习的圣经。毫无疑问。吴恩达将复杂的概念分解成更简单的信息进行学习的能力是无与伦比的,尤其是对于机器学习的初学者来说。

但是有两件事需要注意:

  • 该课程使用 Matlab/Octave 教授,这种编程语言对大多数公司来说并不常见(据我所知)。此外,它不是开源的,主要用于学术界和研究。
  • 一开始,涉及的数学程度可能会令人生畏,因为教师会在开始实施之前解释理论部分。

在学习停滞不前一段时间后,我发现如果我首先获得对某个主题的高层次理解,并深入到实现部分,我的学习效果最好。

一旦我获得了一些技能和对全局的理解,我的自信就会大大提高。我会获得继续学习的动力和动机。

这时,我开始进入数学部分,学习机器学习模型背后的基础知识。

这就是我需要的课程—Python for Data Science and Machine Learning boot camp的由来,它满足了我的需求,让我在每次教程结束后都能从更高的层面理解并实施我在 jupyter 笔记本上所学的内容。数学涵盖了足够多的内容,让我开始朝着正确的方向前进。

我并不是说学习理论和数学部分不重要。它只是出现在我使用我的学习方法的学习旅程的后期。

总之,最适合我的学习方法如下(按顺序):

  1. 获得对某个话题的高层理解****
  2. 一旦我有了高层次的理解,我就会开始实施我所学到的。仅仅因为边做边学是我如何在最短的时间内学到最多的东西
  3. 因为我已经看到了这个概念在实践中是如何执行的,所以我会开始学习这个话题的理论和数学部分。这将让我更好地理解如何应用数学来解决问题

最后的想法

(Source)

感谢您的阅读。

我希望通过分享我如何开始学习数据科学的经验,以及作为初学者对我影响最大的一门课程,能够在某些方面帮助你踏上数据科学之旅。

如果你觉得这种学习方法对你有帮助,请在下面的评论中告诉我!

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 目前是Staq的联合创始人/首席技术官,该平台是东南亚首屈一指的商业银行应用编程接口平台。

想要获得免费的每周数据科学和创业见解吗?

加入 Admond 的电子邮件简讯——Hustle Hub,每周他都会在那里分享可行的数据科学职业建议、错误&以及从创建他的初创公司 Staq 中学到的东西。

你可以在 LinkedInMediumTwitter脸书上和他联系。

** [## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)**

找到发展目标所需的单一策略

原文:https://towardsdatascience.com/the-single-strategy-you-need-to-find-your-development-target-7c4553cd5e37?source=collection_archive---------37-----------------------

企业数据科学不仅仅是数据科学

Aerial Target Interdiction Archives: California Tactical Academy

谁是你的客户?今年早些时候,我参加了一个展示,展示了一种“可能”取代波音 V-22 鱼鹰的飞机。V-22“鱼鹰”是一种多任务军用飞机,自 2000 年开始服役。虽然这听起来不像该飞机已经服役很长时间,但值得一提的是,该飞机的原始合同结合了常规直升机的功能与垂直起飞和着陆能力,以及涡轮螺旋桨飞机的高速巡航性能,最初于 1983 年联合授予贝尔和波音直升机公司。V-22 于 1989 年首飞。

一辆在近 40 年前就完成并提交了原始计划的车辆,目前正在服役,并做这样的事情……

V-22 Osprey preparing for transport at undisclosed military location. Image Source: GTFErinyes

回到演示上来,我们听到了汽车的替代品。他们的目标发布时间是 10 年后,该团队计划为新的飞机提供 25 年的使用寿命。想想吧。建筑师和开发人员今天正在设计一种飞机,这种飞机将被用于非常重要的场合,可能是生死攸关的场合,预计从现在起十年后仍然有效,至少在发布日期后的几十年内保持竞争力。一个团队如何做到这一点?当他们无法知道未来会在哪里时,他们如何在未来击中目标?

答案是,它们确实有。我是说不完全是,但他们有代理人。一位首席建筑师开始谈论这种新飞机的仪表板。这个人开始谈论他的飞行员。他评论说,第一批驾驶这架飞机的飞行员目前大约 8 岁。出于这个原因,他们围绕 8 岁儿童目前熟悉的东西进行设计…..手机、平板电脑和触摸屏。能够用手缩放图像,实时移动各种应用程序。覆盖图。

想想吧。虽然这架飞机将由成年军人驾驶,事实上他们正在与成年军人一起设计和建造这架飞机,但他们不是为那些成年飞行员建造的。他们更像是在为他们真正的用户建造;孩子。

我可以告诉你,我参加过很多策划会议。许多营销意识训练。我不相信我已经积极地让许多团体为未来的成年人而不是今天的成年人设计东西。他们之前的成功,以及很可能的后续成功都围绕着瞄准目标的想法,而不是目标在哪里。我是认真的,玩具公司之外的谁会谈论为孩子们做这件事?

from GIPHY; STARZ Drama Series Power

好吧,他不算。

拦截任务

我以前的军事服务导致这种类比继续是舒适的,所以希望,你仍然和我在一起。在军队中,我们有一个遮断的概念,也就是说,攻击一个移动的目标。这个概念是首先获取你现有的信息,理想的是目标移动的方向和速度。接下来,你检查了你当前的位置、距离和方向。使用所有这些输入,你可以调整你的方向和速度,这样你的路线就会与目标的路线相交。使它成为一种禁止的是,这些课程不仅相交,而且它们同时相交。

我的职业是数据科学家,但我相信这种满足目标的心态同样适用于数据、工程和软件项目。如果你估计 5 年完全开发你的产品,5 年把你的产品作为销售产品的主线,15 年的使用寿命,那么十年后你的产品最初的客户是什么样子的?他们处于职业生涯的开始、中期还是末期?随着时间的推移,人口是越来越年轻还是越来越老?有证据表明他们的教育水平发生了变化吗?我记得有一个例子,我们在设计一个产品,我们请专业人士提供反馈。我们得到了非常积极的评价。我们不断得到的主要积极反馈是,与 20 世纪 80 年代生产的产品相比,我们的产品有多先进。我们花了一段时间才意识到,按照我们的开发计划,我们的第一批客户将在 2020 年达到 30 多岁。这一代人不会对超越 20 世纪 80 年代的技术留下深刻印象。除了陌生的事物,这一代人对 20 世纪 80 年代没有任何概念。

from GIPHY; Netflix Horror Series Stranger Things

即使那样,他们也会期待一些美妙的东西。

学校正在上技术课

这种方法的另一个很好的例子是迈克尔·克罗领导下的亚利桑那大学。在他的书《设计新美国大学》中,迈克尔谈到了如何实现不仅成为一流研究型大学,而且成为公立大学的目标。学校的积极目标不仅仅是获得令人尊敬的排名,他们希望将学校与支持和积极影响地区社区的目的结合起来。这意味着拆除要求学生遵从他们的传统结构,设计反思性结构,考虑到学生的到来,他们将离开的世界,并确保学校是两者之间的适当桥梁。

学校没有告诉学生在开学时关掉电子设备,而是开始积极地将技术融入到学习和生活体验中。通过设备吸引学生。提供越来越多的在线互动课程。利用技术实现协作成果,不仅是参与项目的学生之间,还包括设计和监督课程和讲座的教师之间。该学院没有告诉学生毕业后的工作环境是什么样的,而是与大大小小的公司合作,建立合作机构。事实证明,这些机会对于寻求确认他们所学知识是否相关的学生来说是一种胜利,并导致相关公司的所有权,这些公司自然会雇佣许多与他们一起工作的学生和大学研究人员。学生被积极地招募到学校规划委员会,与教师和行政领导一起工作。甚至还有与高中和退伍军人服务办公室(仅举几例)的积极互动,以确保与客户(即学生)的适当配合。

摘要

为了更好地理解这一点,在当今快节奏、不断发展的世界中,给定技术,为客户构建解决方案的最佳策略是获得客户的距离、方向和速度,并制定计划在他们要去的地方满足他们,而不是去他们在的地方,并希望他们在你到达时就在那里。顾客想见你。他们想见你!!

from GIPHY; VHI reality series Signed

在客户将要去的地方见他们…

计划一个拦截课程!

感谢您花时间通读这些概念!

原载于 2019 年 11 月 26 日https://dev . to

游戏中的皮肤启发防止灾难

原文:https://towardsdatascience.com/the-skin-in-the-game-heuristic-for-protection-against-disasters-eaa7bda8b026?source=collection_archive---------35-----------------------

为什么缺乏个人风险会将整个系统置于危险之中

简介

“如果一个建筑者为一个人建造了一座房子,却不把建造的声音发出来,一堵墙裂开了,建筑者应该自费加固那堵墙。

“如果建筑者为一个人建造房屋,却不把建造的声音发出来,他所建造的房屋就倒塌了,导致房屋主人的死亡,那么建筑者就要被处死。

人们可以在古老的汉谟拉比法典中找到这些规则,作为道德和风险管理策略的基础。

生活中很常见的一件事是,为一项成就邀功,但却掩盖失败或责怪他人。当事情进展顺利时,我们倾向于从声称的奖励中受益,当我们运气不好时,我们试图逃避为我们的决定的后果买单。我们喜欢令人愉快的“我告诉过你!”但当事情突然出乎意料地出错时,保持沉默。没想到是这里的关键词。

用技术术语来说,在“ 现实世界 ”中,大数定律收敛得非常慢,或者根本不收敛,给定决策所依据的有限的观察时间跨度。因此,观测者完全看不到罕见的灾难性尾部事件的统计特性。关键的问题是,这些罕见的尾部事件,通常被数据科学家标记为“异常值”并从分析中删除,恰恰是代表感兴趣的基本属性的观察结果。胖尾域描述如下:统计性质的大部分来自极值;对于包含𝑛观测值的时间序列,随着𝑛变大,最大或最小观测值将与总和处于同一数量级。偏离分布中心的情况会残酷而剧烈地发生;罕见事件占主导地位。

"现实世界"经济、社会和政治变量都是极其厚尾的。此外,正如的 Nassim Taleb 和 Constantine Sandis 的所述,标准经济理论意识到了委托代理问题,但没有意识到委托代理问题、信息不透明(数据收集的时间范围有限或信息不对称)和肥尾现象的结合。它不愿意接受厚尾事件不可预测、不可统计测量的事实,除非是由一个人造成的,或者是在一个上行空间小、下行空间大的环境中运营。

胖尾事件的一个问题是它们发生之前的时间周期延长了。例如,如果你是一名城市规划者,你的决策产生影响需要很长时间,以至于你会有动力去关注看似积极的短期影响,并倾向于忽视与你的决策相关的长期危险。当它发生时,你将不再负责。

Taleb 带来了公司经理激励结构的例子。与公众的看法相反,公司经理不是企业家。2000 年至 2010 年间,在美国,与将资金投入现金或短期国库券相比,投资者在股市损失了高达两万亿美元(取决于人们如何衡量)。人们很容易想到,既然经理们因良好的业绩而获得高额报酬,那么如果他们表现不佳,他们就会遭受损失。根本不是:塔勒布说,这是一种非理性和不道德的不对称。由于他们职业中的嵌入式期权,经理们获得了超过 4000 亿美元的薪酬。亏损的经理不会返还奖金,也不会招致负奖金。

那么我们如何解决厚尾环境下的委托代理问题呢?公司经理从一个随机变量中得到的比失去的多,这一事实造成了一种风险被简单地掩盖起来(在这种情况下是被掩盖起来)的局面,这种局面只能通过迫使他们为一些损失买单来解决。不只是开除他们,而是强迫他们在游戏 中拥有自己的 皮肤。这种启发也适用于政治家、经济学家、城市规划者和其他专业人士,他们的决策会对我们的生活产生重大影响。

在这篇笔记中,我将用 Python 再现 Taleb 和 Sandis 的论文中的关键思想,用随机变量及其属性来描述上述思想。

回报偏态和缺乏游戏中的皮肤

塔勒布的目的是表明如果一个代理人有随机变量的收益的上行,没有下行,并且完全根据过去的业绩来判断,那么激励是使用业绩的负偏斜(或更一般地,不对称)分布来隐藏左尾中的风险。这可以推广到任何不承担自己行为的全部风险和负面后果的回报

计算预期收益

无利益博弈的正向激励的预期收益取决于负偏度,而不是 m!

让我们看看这是怎么回事!

让我们设想一个幂律分布的移位镜像,其指数为𝛼=1.95,值域为∞,10:

# import necessary libraries
**import** numpy **as** np
**import** matplotlib.pyplot **as** plt
**import** scipy.stats **as** stats
**from** scipy.stats **import** pareto
**import** scipy.integrate#define pareto pdf 
**def** pareto_pdf(x,alpha, loc, scale):
 **return** (alpha / ((-x — loc) / scale)**(alpha+**1**)) /scalealpha = **1.95**
loc = **-11**
scale = **1**
fig, ax = plt.subplots(figsize=(**10**,**5**))
r = — pareto.rvs(alpha,loc=loc, scale=scale, size=**500000**)
count, bins, ignored = plt.hist(r, bins=**10000**, density=**True**, alpha=0.5, label=r’$x_{min} = 10, P(X > x) = -x^{-\alpha} x_{\min }^{\alpha}$’)
plt.plot(np.array([**10**]***1000**),np.linspace(**0**,**1.5**, **1000**), linestyle = ‘ — ‘, color=’r’, alpha=**0.75**, linewidth=**0.75**)
plt.plot(bins, pareto_pdf(bins, alpha, loc, scale), color=’orange’)
ax.set_xlim(-**100,15**)
ax.set_ylim(**0,1.5**)
ax.annotate(r’$x_{min} = **10**$’, 
 xy=(**10**, **1.5**), 
 xytext=(**10**, **1.65**), 
 arrowprops = dict(edgecolor=’red’,facecolor=’red’, shrink=**0.03**))
ax.set_xlabel(‘Pareto RV’)
ax.set_ylabel(‘Frequency’)
plt.title(‘Pareto distribution’)
plt.legend()
plt.show()

现在,让我们看看著名的 80–20 帕累托分布的样本均值如何收敛到真实均值:

pareto_alpha = **1.15**
Pareto_true_mean = -pareto_alpha/(pareto_alpha-**1**) — loc
**print**(‘Pareto **80–20** true mean: ‘, Pareto_true_mean)means = []
pareto_alpha = **1.15**
for n in range(**1**, **10000**):
 distr = — pareto.rvs(pareto_alpha,loc=loc, scale=scale, size=n)
 means.append(np.mean(distr))
fig, ax = plt.subplots(figsize=(**10,5**)) 
ax.plot(np.arange(**1, 10000**), means, linewidth=**0.5**, c=’**r**’)
ax.plot(np.arange(**10000**), np.array([Pareto_true_mean]***10000**), linestyle=’ — ‘, color=’**blue**’, alpha=**0.8**, label=r’$P(X > x) = -x^{-\alpha} x_{\min }^{\alpha}$’)
ax.set_ylim(-**3000**, **1000**)
ax.set_xlim(**0**, **10000**)
ax.set_xlabel(r’$n$’)
ax.set_ylabel(r’$\frac{1}{n}\sum_{i=1}^{n} x_{i}$’, rotation=**0**)
plt.title(‘Convergence of mean for Pareto’)
plt.legend()
plt.show()

means = np.array(means)
perc_above_mean = **100***len(means[means>Pareto_true_mean])/len(means)
print(‘Percentage of observations above mean: ‘, perc_above_mean)

我们每隔一段时间就会看到典型的跳跃,对于𝛼=1.15 来说,大约 90%的观察值都高于平均值。厚尾分布隐藏了真实的平均值!

#set up parameters
gamma = **0.1**
scale= **1**
loc= -**11**
pareto_alpha = **1.15**# define power law pdf and expected value functions
power_law_pdf = **lambda** x: (pareto_alpha / ((-x — loc) / scale)**(pareto_alpha+1)) /scale
expected_val = **lambda** x: x*(pareto_alpha / ((-x — loc) / scale)**(pareto_alpha+1)) /scale#define the payoff function
**def** **Payoff**(alpha, gamma=gamma, loc=loc, scale=scale):
 true_mean = -alpha/(alpha-1) — loc
 F_right = scipy.integrate.quad(power_law_pdf, true_mean, **10**)[**0**]
 F_left = scipy.integrate.quad(power_law_pdf,-**100000**, true_mean)[**0**]
 expected_val_right = scipy.integrate.quad(expected_val, true_mean, **10**)[**0**]/scipy.integrate.quad(power_law_pdf, true_mean, **10**)[**0**]
 expected_val_left = scipy.integrate.quad(expected_val,-**100000**, true_mean)[**0**]/scipy.integrate.quad(power_law_pdf,-**100000**, true_mean)[**0**]

 **return** gamma*expected_val_right*F_right/(**1**-F_right)alphas = np.linspace(**1.1, 3, 1000**)
payoffs_1 = []
payoffs_3 = []
payoffs_5 = []
payoffs_7 = []
payoffs_9 = []
for alph in alphas:
 payoffs_1.append(Payoff(alph, gamma=**0.1**))
 payoffs_3.append(Payoff(alph, gamma=**0.3**))
 payoffs_5.append(Payoff(alph, gamma=**0.5**))
 payoffs_7.append(Payoff(alph, gamma=**0.7**))
 payoffs_9.append(Payoff(alph, gamma=**0.9**)) 

# set up the asymmetry measures
vs = []
**for** alpha **in** alphas:
 true_mean = -alpha/(alpha-**1**) — loc
 F_right = scipy.integrate.quad(f, true_mean, **10**)[**0**]
 F_left = scipy.integrate.quad(f,-**100000**, true_mean)[**0**]
 vs.append(F_left/F_right)
vs = np.array(vs)fig, ax = plt.subplots(figsize=(**10,8**))
ax.plot(vs, payoffs_1, label=r’$\gamma = **0.1**$’)
ax.plot(vs, payoffs_3, label=r’$\gamma = **0.3**$’)
ax.plot(vs, payoffs_5, label=r’$\gamma = **0.5**$’)
ax.plot(vs, payoffs_7, label=r’$\gamma = **0.7**$’)
ax.plot(vs, payoffs_9, label=r’$\gamma = **0.9**$’)
ax.plot(np.array([**0**]***1000**), np.linspace(**-5, 125, 1000**), linestyle=’ — ‘, color=’**black**’, alpha=**0.5**, linewidth=**0.8**)
ax.plot(np.linspace(**-0.05, 0.9, 1000**),np.array([**0**]***1000**), linestyle=’ — ‘, color=’**black**’, alpha=**0.5**, linewidth=**0.8**)
ax.set_xlim(**-0.05, 0.9**)
ax.set_ylim(**-5, 125**)
ax.set_xlabel(r’$v_{j} \equiv \frac{F_{j}^{-}}{F_{j}^{+}}$’)
ax.set_ylabel(‘Payoff’)
plt.title(‘No $skin \ in \ the \ game$ payoffs under asymmetric fat tails’)
plt.legend()
plt.show()

我们看到了什么?代理人从“好”的结果中受益,而没有承担“坏”的结果的成本,看到他们的预期收益随着𝑣𝑗的下降而增加。这意味着代理人有动机让左尾巴变长,从而累积风险,增加严重崩盘的可能性!

结论

讨论的例子显示了在大多数决策机构和运行它们的代理中危险的风险不对称,并呼吁一个古老的启发式方法作为补救:游戏中的皮肤。

正如塔勒布所言,“这种启发意味着,一个人应该是自己产品的第一个消费者,一个厨师应该自己测试自己的食物,直升机修理工应该随时准备乘坐他们维护的旋翼飞机进行随机飞行,对冲基金经理应该最大限度地投资于他们的基金。但这并不天真地暗示人们应该一直使用自己的产品:理发师不能给自己理发,癌症药物的制造商不应该使用自己的产品,除非他生病了。所以一个人应该有条件地使用他的产品,在被召唤使用它们的时候。然而,在涉及系统性风险的问题上,该规则要严格得多:简单地说,某些决定永远不应由某一类人做出。”

有关游戏中皮肤试探法的伦理和哲学含义的更多细节,请参考原始论文

完整的 jupyter 笔记本和上面的笔记代码可以在这里找到。

睡美人问题:数据科学家的视角

原文:https://towardsdatascience.com/the-sleeping-beauty-problem-a-data-scientists-perspective-56223b5128e4?source=collection_archive---------7-----------------------

Photo by Javier Ramos on Unsplash

我在实验物理课程中学到的第一课也是最难忘的一课是:永远不要,T2,永远不要,画一张没有误差线的测量图。误差线表示特定测量值的不确定程度。这条实用规则有更深层次的道理。这意味着任何经验证据或数据的真实性都存在不确定性。更重要的是,如果我们不能衡量这种不确定性,这些数据将变得毫无用处。

概率的抽象概念允许我们对不确定的事件进行推理,例如“这个仪表显示的电势是 1.5 V 还是 1.4 V?”。它不仅是数据科学领域的核心,实际上也是任何利用统计描述的实证科学的核心。因此,即使对于应用科学家来说,偶尔停下来思考一下关于概率的更基本的问题也是有意义的。

睡美人问题是决策理论中的一个思想实验,触及了概率的基础。这篇文章的主要目的是对这个问题提供一些独到的见解,也许能为解决这个问题提供新的思路。

想象一个实验设置,包括一个自愿的主题——同名的睡美人——和一个公平的硬币。

来自维基百科:

睡美人自愿接受以下实验,并被告知以下所有细节:周日她将被实施安乐死。有一两次,在实验过程中,睡美人会被唤醒,接受采访,然后用一种诱发失忆的药物让她忘记那次醒来。一枚公平硬币将被投掷以决定进行哪个实验程序:

如果硬币正面朝上,睡美人将在周一被唤醒并接受采访。

如果硬币正面朝上,她将在周一和周二被叫醒并接受面试。

无论哪种情况,她都将在周三被唤醒,没有面试,实验结束。

每当睡美人被唤醒并接受采访时,她都不知道今天是哪一天,也不知道自己以前是否被唤醒过。在采访中,睡美人被问到:“现在你对硬币正面朝上的说法有什么信心?”

这个悖论来自于试图给以下问题一个独特的答案:作为一个理性的代理人,睡美人在每次采访中应该给什么答案?

“半工”的职位。睡美人被告知实验装置的所有细节。因此,她醒来后没有获得额外的信息,因为她知道她会一直醒来。因此,在周一或周二,或者在实验结束前的任何时间点,某人认为硬币正面朝上的信念一定是相同的。

既然她也知道硬币是公平的,那么可信度一定是 1/2。

“第三者”的位置。SB 被告知实验装置的所有细节。因此,在觉醒时,她知道发生了以下互斥且详尽的事件之一:

  1. 今天是星期一,硬币正面朝上。
  2. 今天是星期一,硬币正面朝上。
  3. 今天是星期二,硬币正面朝上。

在没有进一步信息的情况下,SB 不得不假设每个事件发生的可能性是相等的。

因此,她认为硬币正面朝上的概率是三分之一,即 1/3。

如果这是你第一次听说这个思想实验,我建议你在继续阅读之前思考一下这个问题,并决定你属于哪一个阵营:你是半个还是三个 T21?

从表面上看,这个问题与其他概率谜题非常相似,如蒙提霍尔问题或伯特兰悖论,因为这些问题也能产生多种答案。

然而,通过概率建模的标准技术可以很好地理解 Monty Hall 问题的解决方案。最初的困惑来源于正确的解决方案与个人直觉的冲突,有些人可能会发现难以调和。但是在盯着决策树看了足够长的时间和/或在一副牌的帮助下重演了 Monty Hall 游戏之后,直觉通常会随之而来。

另一方面,伯特兰悖论就有点复杂了。在最初的问题陈述中,生成样本的过程不够精确,因此您可能会满意地得出结论,混乱只是由不适定的问题引起的。然而,寻找 Bertrand 悖论的“适当”解决方案的工作仍在继续,因为许多现实世界的问题实际上是不适定的,显然也需要找到这类问题的“最佳”解决方案。

然而,睡美人悖论似乎是另一种野兽:作为一个活跃的研究问题,研究它的人仍然分为“半睡者”和“三睡者”(尽管更多的立场也得到了捍卫。)

与蒙蒂·霍尔问题不同,当你从任何一方听到足够多的论据时,直觉不会跟着做,双方通常都会援引相当标准的论据。

与伯川德悖论不同,这个问题至少在看来被定义得足够好,有一个独特的解决方案。

睡美人与人类推理

O 启动直觉泵的一个方法是概括问题并调整实验的设置。此外,也许更重要的是,我们可以测试 halfer 和 thirder 位置对这种一般化的鲁棒性。例如,我们可以调整唤醒的次数:

SB 在《尾巴世界》里醒了很多次。尼克·博斯特罗姆邀请我们想象当硬币正面朝上时,某人被唤醒一百万次,而不是仅仅两次。如果硬币正面朝上,她只会在周一醒来,就像最初的实验一样。

根据最初的第三个论点,在每次觉醒时,SB 现在几乎可以肯定硬币落在了反面:不是只有三个,而是有 100 万个可能的结果,其中只有一个意味着正面。

根据最初的 halfer 论证,无论她在“反面世界”和“正面世界”中被唤醒的频率不同,SB 的可信度都保持在 1/2。

SB 在《人头世界》中始终没有醒来。假设我们改变实验,如果硬币正面朝上,某人将不会被唤醒。如果硬币正面朝上,某人至少会被唤醒一次。因此,某人醒来时硬币正面朝上的可信度一定等于零,因为醒着就是相反的证据。

这种变化与人类推理和宇宙学的微调问题有关:假设硬币严重偏向“正面”,那么它落在反面的先验概率将是,比如说,0.0000000001。然而,这种可能性有多小(或多高)并不重要:当某人被唤醒时,她可以绝对肯定地断定硬币落在了反面。

类似地,人择推理告诉我们:我们不应该对这么多看似不可能的情况聚集在一起使有意识的生命成为可能感到惊讶:我们不能以任何其他方式观察它。人类永远不可能在“人头世界”中觉醒。

B 另外两种变化实际上是密切相关的:它们描述了这样的情况,在这种情况下,某人可能被唤醒的“头世界”的数量比“尾世界”的数量少得多。

因此,第三个作者的论点很好地将两种变化联系在一起:SB 在“正面世界”中从不醒来的情况可以被视为她在“反面世界”中醒来次数少得多的极限情况。

半身人被迫承认,SB 在“正面世界”中从未醒来是一个特殊的情况:与原始的实验设置或任何其他在两个世界中非零醒来的设置相比,SB 这次显然从被唤醒中获得了信息,并不得不调整她对掷硬币的判断。

然而,在这种情况下援引第三个论点意味着另一种麻烦。想想傲慢的哲学家:这位傲慢的哲学家认为任何预测我们的宇宙包含一万亿万亿个有意识观察者的宇宙模型比任何预测只有一万亿个这样的观察者的模型更有可能存在一万亿倍。因此,他或她可以——原则上——通过纸上谈兵的争论来贬低大多数物理实在的理论。

没有进一步的阐述,我发现这个反对意见并不强烈,因为,例如,奥卡姆剃刀也提出了一个非常常用的纸上谈兵的论点来挑选理论——即使当它们做出完全相同的预测。

事实上,如果你站在某人的立场上考虑,直觉可能会更偏向半方,实验会有以下变化:硬币严重倾斜,因此正面落地的几率是反面的 1000 倍。正面的时候你只会被唤醒一次,反面的时候你会被唤醒一百万次。

即使硬币有如此大的偏向正面的倾向,第三个位置告诉我们,当你醒来时,硬币仍然更有可能是反面着地。

在面试过程中,你的任务不是给出你对掷硬币结果可信度的数值,而是猜一猜,即明确回答“正面”或“反面”。面试官,一个邪恶的科学家,如果你答错了会当场杀了你。即使你是第三个,你会自信地说“尾巴”吗?我将在最后一节回到这个变化。

拿着不公平硬币的睡美人

修改醒来的次数是概括睡美人的一种方式。另一种方法是假设一个不公平的硬币,并采用最初的 halfer 和 thirder 论点,以测试它们对这种一般化的鲁棒性。

在下一节介绍马尔可夫链观点之前,我将描述一种将睡美人推广到有偏差硬币的替代方法,这种方法更接近于问题解决方案的通常推导。我们将再次假设最初的觉醒次数:如果硬币正面落地,一次觉醒;如果硬币反面落地,两次觉醒。

让我们假设硬币落地正面的先验概率是 P(正面)= p ,它是 0 和 1 之间的某个数字,但不一定是 1/2。SB 知道 p 的值;或者,她可能有机会在实验开始前通过多次投掷硬币来自己估算 p。

目标是确定 P⁺(heads) := P(头|清醒)。现在,对半分者和三分者都同意 P⁺(heads|Tuesday) = 0

然而,双方在周一的条件反射的含义上存在分歧:

半身位。觉醒后某人的信任度没有变化: P⁺(heads) = P(人头)= p

第三个位置。为了让我们把第三种情况推广到有偏差的硬币,我们需要调整最初的论点。基本的论点是基于无差别原则:公平地说,对于睡美人来说,任何结果都没有明显的区别,所以在最初的设置中, P⁺(heads,星期一)P⁺(tails,星期一)P⁺(tails,星期二)是相等的。

然而,如果硬币是有偏差的,那么这个假设就不成立,因为生活在“正面世界”或“反面世界”的人可能有非常不同的可能性。

如果你从这个现在已经不合法的论点中去掉第三个立场,你就剩下下面这个立场,它代表了与半者观点的关键区别:如果某人被唤醒,实验者告诉她,事实上是星期一,她对硬币正面落地的信任度必须等于她先前的信任度(因为她在星期一醒来,不管硬币投掷的结果如何,因此没有学到任何新东西): P⁺(heads|Monday) = P(正面)= p

上述假设将【p⁺(⋅】分别确定为对半者和三者的参数化联合分布,如下所示:

对于半工来说,参数 t 对最终结果 P⁺(heads) = p 没有影响。

然而,第三个用户仍然需要选择参数 q ,该参数可以解释为某人相信她醒来时是星期一:**p⁺(monday)=q**

选择该参数的一种方法可以是最大熵原理:在没有进一步信息的情况下,我们应该选择最接近均匀的分布。作为参数 q 的函数,给定 p ,上述分布的熵可以计算为

S(q)=-(1-p)qlog((1-p)q)-pqlog(pq)-(1-q)log(1-q)【T51,**

其中的最大值可以通过基本微积分找到。

然而,我们需要拒绝最大熵解,因为它意味着 P⁺(heads) = 1/2p → 1 的极限内——这当然没有意义,因为 SB 应该确定,每当该事件的先验概率已经接近 1 时,硬币正面落地。

找到参数 q 的合理值的另一种方法是调用无差别原则,毕竟——但只基于以 tails 为条件的分布:假设无论何时 SB 在“tails world”中醒来,她都无法区分星期一和星期二。因而,p⁺(monday|tails)= P⁺(Tuesday|tails),从而 P⁺(Monday,尾巴)= p⁺(tuesday,尾巴),并因此(1-p)q= 1-q最终导致q= 1/(2-p)**

这一分析得出以下结论:

半身美女不更新硬币正面落地的可信度: P⁺(heads) = P(正面)= p

第三位美女在醒来时通过乘以她们的主观概率来更新她们的可信度: P⁺(heads) = P(人头)⋅p⁺(monday)=pq=p/(2-p)

Halfer posterior (blue line) vs. thirder posterior (red line) for priors P(heads) = p

马尔可夫链上的睡美人

L et 采用不同的视角,将问题建模为重复睡美人实验的马尔可夫链:

这个状态转换图应该这样理解:当 SB 在星期一醒来时,她下一次醒来的概率是 p 她将再次在星期一醒来:当硬币正面朝上时,星期二将没有面试,实验将重复进行。

以概率 1 - p ,她下一次觉醒将是在实验重复之前的一个星期二。

某人对今天是什么日子这一事实的无知可以直接转化为她对她当前所处的状态的无知:她所经历的只是一系列无法区分的觉醒。

让我们把星期一→星期一的转变称为“正面转变”,而星期一→星期二的转变称为“反面转变”。假设这个实验已经重复了很多次。

在该模型中,halfer 和 thirder 解决方案呈现出显著的特征:

马尔可夫半工。由 p 给出下一个转变是正面还是反面将是正面转变的概率:

要么是星期一,下一个转换是概率为 p 的正面转换,要么是星期二,下一个转换是重复实验,之后的转换是概率为 p 的正面转换。

马尔科夫·瑟德。要么正面要么反面先前转换是正面转换的概率由p/(2-p)**给出:

如果今天是星期二,前面的转换一定是尾部转换。如果是星期一,前一个转换是概率为 p 的正面转换。如果实验已经经历了许多周期,SB 可以确信成为星期一的概率由马尔可夫链π(⋅)的平衡分布给出,在这种情况下由π(星期一)= 1/(2 - p) 确定——这是我们在上面的更“贝叶斯”处理中已经遇到的概率。因此,最终概率不是由转移概率给出的,而是由概率通量π(星期一)⋅ P(星期一→星期一)=p/(2-p)给出的。

请注意,第三个位置也可以应用于遥远的未来:被访问后的第一百万个正面或反面转换是正面转换的概率将非常接近p/(2-p)**。

当我们通过将问题建模为马尔可夫链来处理这个问题时,我们仍然面临着相同的不同解决方案,我觉得这导致了对这些解决方案的解释的更清晰的画面。有人可能会说,这种明显的区别可以归因于我们赋予同一个词“概率”的不同含义:

  1. “预测概率”睡美人希望表达她的信念:无论实验者何时投掷硬币,硬币都是正面朝上的。这种预测不依赖于今天是什么日子或任何其他事态。那个可信度是 1/2(或者更一般的, p )。
  2. “描述性概率。”睡美人希望表达她对事件“正面”在她的参照系中通常发生的频率的看法。这个频率是 1/3(或者更一般的,p/(2-p)**)。

这一悖论似乎源于这样一个事实,即通常每个概率概念的值是一致的:在掷了一百万次骰子之后,我们确信,由于每个可能结果的频率(“描述性概率”)非常接近 1/6,所以我们可以根据相同的不确定性度量(“预测性概率”)来推断下一次我们掷同样的骰子的时间。

睡美人和参考类问题

他将睡美人问题的解决方案分成两半和三瓣,这可以解释为参照类问题的一个例子:作为参照类,SB 应该选择实验类(一系列实验中的两个中的一个将产生“头”),还是醒来类(三个中的一个)。你可能会很快争辩说,SB 当然应该选择她“自己的”参照类,即觉醒类。

然而,在这种情况下,我将通过如下重复睡美人实验的变体,为 halfer 的立场给出一个论点。在原始公式中,SB 完全知道生成数据的机制,但她无法访问实际数据。

现在假设 SB 每次醒来都被告知硬币是否正面朝上,她被允许记录醒来的次数。然而,这一次她并不知道这些数据是通过复杂的程序产生的。因此,她可能会得到这样一个序列( p = 1/2, H =正面, T =反面):

TTTTHTTTTTTHTTHTTHHHHTTTTHHHTTHHTTTTTTTTHTTHTTHTTTTHTTHTTHTTTTTTHHTTTTTTHTTTTTTTTHHTTTTTTTTHTTHTTTTTTTTHTTTTHTTTTHHHHHTTTTHTTTTTTTTHHHHHTTTTTTTTTTTTTTTTTTTTTTHHTTTTTTTTTTHHHTTTTTTTTTTHTTTTTTTTHHHHHHTTHTTHHHTTTTTTTTHTTHHHHTTTTTTHTTTTHHTTHHHHTTHHHTTHTTTTHHHHTTTTTTTTTTTTHHHHHHHTTTTTTTTHHHHHTTHTTTTTTHTTHTTTTHHTTTTHTTHHTTTTHTTHTTTTHTTHHTTHTTHHTTHHTTHTTHHHTTHTTTTHHTTHHTTHTTHHTTHHTTHHHTTHTTTTHHTTHTTHTTTTTTTTHTTTTTTTTHHTTHTTHHTTHHHTTTTTTHTTHTTTTTTTTHTTTTTTHTTHHHTTHTTHTTTTTTTTTTHHTTTTHTTHHHTTHTTTTHHHHHHTTHTTHTTHHHTTHHTTTTTTHTTHTTHHHHTTHHTTTTTTHHHHHTTHTTTTHTTHHHTTTTTTHTTTTHHTTTTHTTTTHTTTTTTTTHHTTTTTTHHTTTTHHHHTTTTHTTTTTTHHTTHHTTTTHTTTTHTTTTTTTTHHTTHTTHTTTTTTTTTTHTTHHHHTTHTTHTTTTHTTHTTHTTHHHHTTTTTTHTTTTHHHHTTTTHHHTTHHTTTTTTTTTT

对这一抛硬币序列的简单分析将使她能够计算出“正面”出现的频率,大约是三分之一。然而,她也可以了解到某些特征似乎永远不会出现,例如 HTH

因此,SB 被给予所有的数据,并且她甚至不知道她应该相对于哪个特定的参考类来计算频率。尽管如此,她仍将得出结论,尽管假设以 1/3 的概率随机抽取 H 和以 2/3 的概率随机抽取 T 与数据一致,但产生观察结果的更好解释是以 1/2 的概率顺序抽取 HTT

当她被告知实验的细节后,她会发现优越的理论得到证实。因此,如果实验继续,但她没有得到任何新的数据,她没有理由修改她对实际发生的事情的信任,这包括两个看似矛盾的陈述“ H 以 1/2 的概率得出”和“ H 以 1/3 的概率得出”,但它们只是两个不同假设的一部分,只有在脱离上下文的情况下才显得矛盾。

总结和结论

当你试图将半分者和三分者的论点扩展到一个不公平的实验设置时,这个实验设置涉及一个以任意频率显示头部的硬币,在如何扩展三分者的论点方面存在一些模糊性。但可以得到一致的广义三阶结果: p /(2 - p )

此外,通过提供一个在重复执行实验时生成数据(不被 SB 观察到)的模型,有两种方法可以结合 halfer 和 thirder 观点:

  1. 一个马尔可夫链模型,其中 p 代表转移概率p/(2-p)**分配给“跳过星期二”的概率通量,
  2. 一个随机序列,其中“正面”以频率p/(2-p)**出现,但该频率仅作为该序列的部分描述:“正面”以概率 p 出现,“反面,反面”分别以概率 1 - p 出现。

就我个人而言,在思考这个问题时,我的观点从三分之一变成了二分之一。目前,我认为,睡美人的可能答案的明显矛盾可以通过接受这样一个事实来缓解,即两者都不能完全描述她所处的情况,因为产生看不见的数据的机制不能仅由一个参数完全描述。

最后,睡美人的正确答案可能就像这样简单:

“在这个实验过程中,硬币正面着地的概率由值 p 给出。但是如果我猜测硬币正面朝上,我会以更小的概率p/(2-p)猜对。

这也可以用不同的实用程序来举例说明:

  1. 如果邪恶的科学家在某人猜“正面”或“反面”时因给出错误答案而杀死她,她最好以 p 作为她回答的基础。(这是显而易见的,当她在周三的整个实验后被杀。但如果她在周一被杀,这也成立,因为在那种情况下不会有周二的觉醒,有效地缩小了觉醒的参考类。)
  2. 如果 SB 每次猜对硬币都被奖励一个价格(例如,钱),那么当评估硬币显示“正面”的概率为p/(2-p)**时,她将有更大的预期收益。

因此,这个悖论可能源于一种误解,即睡美人的现实只能由一个概率变量来详尽描述。然而,我相信讨论不会就此结束。

参考

睡美人问题,朱莉娅·加里夫的视频

米(meter 的缩写))皮乔内和 a .鲁宾斯坦。关于不完全回忆决策问题的解释。载于:游戏与经济行为 20 (1997),第 3-24 页

A.埃尔加。自我定位信仰与睡美人问题。载于:分析 60.2 (2000 年),第 143-147 页

南吉阿苏和申尼策尔。最大熵原理。摘自:《数学智能 7.1》(1985),第 42-48 页

F.p .凯利。可逆性和随机网络。奇切斯特,威利,1979 年

D.刘易斯。“睡美人:回复 Elga ”。载于:分析 61.3 (2001 年),第 171-176 页

名词(noun 的缩写)博斯特罗姆。睡美人和自我定位:一个混合模型。载于:综合 157.1 (2007),第 59-78 页

页(page 的缩写)温克勒。睡美人之争。载于:《美国数学月刊》124.7 (2017),第 579 页

ArXiv 论文空间

原文:https://towardsdatascience.com/the-space-of-arxiv-papers-1f9648005cab?source=collection_archive---------32-----------------------

ArXiv’s recently-old favicon. The full story here.

T 今年夏天,我和我的团队与英伟达人工智能技术中心的研究人员联手,在新加坡技术与设计大学使用机器学习技术设计和开发了一个人工智能(AI)研究助理。

这个项目背后的动机?让人工智能助手处理学术研究过程的一部分,减少人类研究人员的认知负荷,并为他们腾出宝贵的时间和资源来执行更高级的任务,如构思、实验设计和写作。

在这篇文章中,我们将谈论我们收集的一些重要想法,以及我们可能如何考虑设计人工智能系统来构建知识空间,导航和操纵数据,并提供见解而不是信息过载。

设计知识空间

事实证明,研究过程的很大一部分,尤其是早期阶段,自动化的潜力很大。我们进行的一项涉及 64 名研究人员的研究揭示了早期研究痛点的两个关键见解:(1)信息空间太难导航,以及(2)这一空间的结构非常复杂,迫使通过研究论文之间的递归引用路径导航-不能保证找到有价值的东西。

但是,如果我们可以把这个看似不可避免的、人类难以解决的问题,转化成一个自动化的任务,会怎么样呢?我们能在信息空间中轻松定位自己,并更容易探索我们附近的区域吗?这是我们的目标。

我们需要将这个问题转化为一个工程问题——我们如何构建和分析研究知识的空间,并确保它容易穿越,不带偏见,并最终有益于人类研究人员?我们首先需要一个巨大的、结构化的研究知识来源,为了获得一个真正好的样本,我们期待着 ArXiv ,康乃尔的电子印刷档案,来形成我们的知识库。

提交给 ArXiv 的论文通常会在会议或期刊上发表,并且可能会经历极其缓慢的同行评审过程。毫无疑问,ArXiv 正迅速成为事实上的标准,用于快速声明研究想法、非正式审查,以及使某些科学领域的科学工作民主化。经过验证的研究人员自行向 ArXiv 提交预印本,并鼓励以(La)TeX 格式提交。如果我们检查一下 ArXiv 批量源文件访问页面,我们会看到这些文章以.tex格式的大量集合可供下载。

关于乳胶的简短介绍

首先,一个简单的渲染文档及其 LaTeX 源代码如下所示。

A PDF document compiled from its LaTeX source (shown below).

\documentclass{article}
\begin{document}

\title{Introduction to \LaTeX{}}
\author{Author's Name}

\maketitle

\begin{abstract}
The abstract text goes here.
\end{abstract}

\section{Introduction}
Here is the text of your introduction.

\begin{equation}
    \label{simple_equation}
    \alpha = \sqrt{ \beta }
\end{equation}

\subsection{Subsection Heading Here}
Write your subsection text here.

\section{Conclusion}
Write your conclusion here.

\end{document}

TeX 文件包含排版的基本说明,可以呈现为各种格式,最常见的是 pdf。LaTeX 包含一组方便的宏,可以轻松定义和重用书写要素,如标题、页眉、等式、节和页脚。

研究论文的结构

将文档存储在 TeX 中意味着您只需要重新创建这些漂亮、结构化和格式化的研究论文的源文件.tex,以及源文件引用的任何图形或媒体文件。

如果你是机器学习的实践者,你可能已经认识到这些摘要、标题、章节、小节等。,以及它们的文本和图形内容,形成标签-数据对,所有这些都已经为我们分配好了!我们现在可以把 ArXiv 看作一个标签和文本(或者图像和其他媒体)的结构化数据集。例如,如果我们对论文中的文本字符串进行分类感兴趣,我们可以在如下所示的样本上训练我们的分类模型:

Label: \section{Results} -> 'results'
Data:  "The results of our method...

拥有结构合理的研究论文也使我们能够尝试和猜测研究论文的哪些部分是重要的——如果我们知道论文的摘要是全文的良好总结,那么我们可以训练模型尝试在给定研究论文全文的情况下重建摘要。

为了进一步发展这一思想,一些 ArXiv 论文包含结构化的摘要,这些摘要是在摘要部分中的论文的每个部分(例如,数据、方法、结果、结论)的小标签摘要,实质上在它们的正常部分中提供了较长文本对,以及在摘要中找到的它们的摘要。毫不奇怪,它们最近已经被用来训练抽象的摘要模型!

相比之下,如果我们试图分析 PDF 或扫描文档,就会出现大量的设计问题:我们应该使用 OCR ,还是应该尝试从图像中重建标签?或者我们应该试着把 PDF 重新转换成 LaTeX?哪种转换可能会损失更大?很明显,只要有可能,坚持使用 LaTeX 会给我们提供来自源代码发行版的最干净的数据(作者!)产生它,绝对没有噪音。

研究论文的空间

好了,我们现在知道了一篇研究论文的样子,但是它们看起来完全不同:似乎没有一种方法可以恰当地比较这些论文!人工智能助手将如何从它所拥有的研究论文中构建知识的表示,并将其简化,以便主题查询,如“煮鸡蛋”,或结构化问题,如“卷积和相关性之间的关键区别是什么?”,可以开始讲道理了吗?问助理一个问题意味着什么,它将如何在这个空间中尝试并返回一个答案?

让我们假设今年是 2028 ,你是一个功能正常的人类级人工智能助理。你试图回答卷积与相关性的问题来帮助一位研究员。让我们假设你已经明白你的任务是比较两个事物,带着“关键差异”所隐含的紧迫感,你知道你必须只返回最大的差异。现在你有两个关键词,“卷积”和“相关”。你知道你必须查看提到这两个词中的一个或两个的文档,并处理这两个词用法之间的相似之处,这样你就能通过减法和逻辑方法发现它们的不同之处。很容易,不是吗!

现在让我们回到现在的 2019 年,想象你是建造助手的人。你被困住了——你收集了大量的文档,但是你没有办法处理文档之间的相似性或相关性,这是比较“卷积”和“相关性”的第一步。还是你?

有一些可能性。如果我们看一下我们收集的所有 ArXiv 论文,我们可能会意识到它们实际上是由很多单词组成的。我们可能会猜测,在两个文本文档中有相似的单词、样式或内容意味着这两者很可能彼此相关。这给我们带来了两种评估文档中单词之间关系的流行方法:(1)排序方法,和(2)向量嵌入。

TF-IDFBM25 这样的排序方法使用单词在文档中的出现作为相似性的标记。TF-IDF 认为,只有当文档经常共享不同的单词时,它们才是相似的。向量嵌入通常在大型语料库(如我们的文章集)上进行训练,并在推理过程中,为给定的单词生成向量,然后可以对其进行数字处理——例如使用余弦距离。此外,像 ELMo 和 BERT 这样的上下文敏感的嵌入让我们能够区分使用不同的完全相同的单词。

这两种方法让我们通过指定文章之间的某种形式的相似性来遍历文章之间的空间。通过扩展,我们获得了相互比较文档的能力,也就是说这个那个更相关。这可以说是学习以下能力的第一步:对信息进行优先排序,根据标准对知识进行排序,在广泛的指标范围内比较研究论文、主题和查询。

如果我们的研究集合的文本内容还不够丰富,ArXiv 还存储了每篇论文的元数据。所有文章都附带元数据文件,其中至少包含作者姓名、文章标题、主题类别、明文摘要和日期,提供了额外的维度或指标来评估研究文档集的相关性和相似性。谁说研究想法或知识在文档中是孤立的,或者单词相似性需要成为空间的基础?用我们能够提取的特征,我们还能建造什么样的空间?关于……

引文

参考书目是判断一篇研究论文是否与另一篇相似的巨大线索。想象一下,构建一个巨大的知识图,其中的节点是单个的研究论文,有向边携带着关于哪篇论文引用了哪篇论文的信息。我们可以根据论文的内容来学习这些边缘的权重吗?这是一个完全不同的——也可以说是更有条理的——研究领域的代表!重要的是,如果我们想象这个巨大的引用网络,我们现在能够可视化论文之间的真实联系,这使得构建搜索算法来遍历它们变得更容易,就像我们习惯的图形问题一样。除了相似性的文本特征表示,通过将引用的概念添加到我们的 ArXiv 空间中,我们现在有了对论文之间的外部关系进行编码的维度,即作者身份和思想传播领域中的维度。

不过,恢复完整的参考网络并不容易。当我们试图递归生成这个网络时,那些本身不在 ArXiv 上的论文经常会破坏引用路径。如果你需要引用一篇非常非常旧的论文呢?或者,如果那张特定的报纸是 ViXra.org的呢?

公平知识的问题

尽管试图设计知识可能令人兴奋,但当我们试图将我们辛苦收集的数据集与知识等同起来时,当我们未能考虑到 ArXiv 仅仅是所有可用研究信息的样本时,就会出现一个突出的问题。值得注意的是,通过使用来自 ArXiv 的 TeX 文章,我们明确地将人工智能助手偏向于从 2000 年 1 月 1 日至今提交的来自 8 个研究领域的特定的、经过验证的研究人员的定量研究。

学习程序还需要考虑统计上的不平衡,比如领域之间的提交数量或提交的季节性。我们还面临着更大时间范围内的偏差:数字人文学科正在积极研究长期以来文档中语言的变化——句子结构和单词用法随时间的变化如何影响我们的相似性和摘要算法,以及我们如何调整它们以解决这些问题?

有许多悬而未决的问题,需要考虑很多,而且这些问题到目前为止看起来相当棘手。但我希望,这些从设计可导航信息空间的尝试中收集的见解,将对任何碰巧想解决类似或不太相关的问题的人有用,无论是否在人工智能领域。

作为一个轻松的总结,这里有一个有趣的问题——我们超级聪明、征服 ArXiv 的人工智能助手将如何能够不学习废话

三维物体检测的现状

原文:https://towardsdatascience.com/the-state-of-3d-object-detection-f65a385f67a8?source=collection_archive---------7-----------------------

基于 KITTI 排行榜的技术现状综述

前言

此贴更新 此处

简介

3D 对象检测是自动驾驶的一个基本挑战。 KITTI vision 基准提供了一个标准化数据集,用于训练和评估不同 3D 物体检测器的性能。在这里,我使用来自 KITTI 的数据来总结和强调 3D 检测策略中的权衡。这些策略通常可以分为使用激光雷达的策略和使用激光雷达+图像(RGB) 的策略。我分别分析这几类。

激光雷达

CNN 机械对 2D 天体的探测和分类已经成熟。但是,用于自动驾驶的 3D 物体检测提出了至少两个独特的挑战:

  • 与 RGB 图像不同,激光雷达点云是 3D 和非结构化的。
  • 自动驾驶的 3D 检测必须快速(< ~100ms).

Several 3D detection methods have tackled the first problem by discretizing the LIDAR point cloud into a 3D voxel grid and 应用 3D 卷积)。然而,3D 卷积比 2D 卷积具有更大的计算成本和更高的等待时间。或者,点云可以被投影到自上而下鸟瞰视图( BEV )或激光雷达的本地范围视图( RV )中的 2D 图像。优点是投影图像可以用更快的 2D 卷积有效地处理,产生更低的等待时间。

我从 KITTI BEV 排行榜中挑选了一些方法,以强调在 RVBEV 和操作体素特征的方法之间的一些权衡。该图显示了报告的推断延迟(毫秒)与车辆 AP 的关系:

Detector (LIDAR only) latency vs vehicle AP

结果中的关键要点:

  • BEV 投影保留了物体大小随距离的变化,为学习提供了强有力的先验。Z 轴被视为 2D 卷积的特征通道。手工制作的 Z 轴宁滨(例如 PIXOR )可以使用 PointNet 进行改进,以将 Z 轴整合到学习的特征中(例如 PointPillars )。此外,地面高度可用于展平 Z 轴上的点(如 HDNet ),减轻道路坡度引起的平移变化的影响。
  • BEV 的博学(PointNet)特性来巩固 Z 轴实现强劲性能第二个用体素特征编码层和稀疏卷积实现;新版(1.5 版)报告了更好的 AP (86.6%)和低延迟(40ms)。 PointPillars 在 Z 轴柱子上应用简化的点网,产生一个 2D BEV 图像,该图像被输入到 2D CNN。
  • RV 投影受遮挡和物体大小随距离变化的影响。 RV 探测器(如 LaserNet )在 KITTI 的~7.5k 帧训练数据集上性能落后于 BEV 探测器。但是, LaserNet 在 1.2M 帧 ATG4D 数据集上的性能与 BEV 探测器(例如 HDNet )不相上下。
  • RV 投影具有低延迟(例如 LaserNet ),可能是由于相对于较稀疏的 BEV 的密集 RV 表示。体素网开创了体素特征的使用,但由于 3D 卷积而遭受高延迟。较新的方法(例如第二)可以使用相同的体素特征编码层,但是使用稀疏卷积来避免 3D 卷积以减少等待时间。

激光雷达+ RGB

激光雷达+ RGB 融合提高了 3D 检测性能,特别是对于较小的对象(例如,行人)或长距离(> ~ 50 米-70 米),其中激光雷达数据通常很稀疏。下面总结了几种融合方法。基于提议的方法生成 RGB(例如 F-Pointnet 或 BEV(例如 MV3D )的对象提议。密集融合方法将激光雷达和 RGB 特征直接融合到一个公共投影中,通常具有不同的分辨率。

General approaches for LIDAR+RGB fusion. Images are adapted from MV3D (Chen et. at. 2016), F-Pointnet (Qi et. al. 2017), ContFuse (Liang et. al. 2018), and LaserNet (Meyer et. al. 2018).

该图显示了报告的推断潜伏期(ms)与车辆 AP 的关系:

Detector (LIDAR+RGB fusion labeled) latency vs vehicle AP

结果中的关键要点:

  • RV密集融合 在所有方法中延迟最低,基于 提议 的方法一般比 密集融合 延迟高。 RV 密集融合(例如 LaserNet++ )速度快因为 RGB 和 LIDAR 特征都在 RV 中。激光雷达特征可以直接投影到影像中进行融合。相比之下,密集融合密集融合 。它从 RGB 特征生成一个 BEV 特征图,并与激光雷达 BEV 特征图融合。这很有挑战性,因为在 RV RGB 图像中并不是所有 BEV 中的像素都是可见的。几个步骤可以解决这个问题。对于一个未观察到的示例 BEV 像素,提取 K 个附近的激光雷达点。计算每个点和目标 BEV 像素之间的偏移。这些点被投影到 RV 以检索相应的 RGB 特征。偏移和 RGB 特征被馈送到连续卷积,其在 RGB 特征之间进行插值,以在目标 BEV 像素处生成未观察到的特征。这是为所有的 BEV 像素完成的,生成 RGB 特征的密集插值 BEV 图。
  • **融合方法通常在激光雷达稀疏的较长距离和小物体上具有最大的性能增益。激光雷达+ RGB 特征融合(激光网络++ )相对于激光雷达(激光网络)的 AP 改进在车辆上是适度的(在 0-70 米处大约 1%的 AP),但在较小的类别上更显著,特别是在较长的范围内(在 50-70 米处大约 9%的自行车 AP)。 LaserNet++ 在 ATG4D 上表现强劲,但其 KITTI 性能未见报道。

总结

BEVRV 投影之间存在权衡。 BEV 保留度量空间,保持对象大小与范围一致。相比之下, RV 在范围和遮挡方面存在尺度变化。因此, BEV 检测器(如 PointPillars )在小数据集(如约 7.5k 帧的 KITTI)上实现了优于 RV (如 LaserNet )的性能,具有相似的延迟(如 PointPillars 为 16 毫秒,而 LaserNet 为 12 毫秒)。然而, RV 的性能在更大的(例如,1.2M 帧 ATG4D)数据集上与 BEV 不相上下。尽管有这个缺点,密集特征融合RV 中比 BEV 中更快。 LaserNet++ 报告了令人印象深刻的延迟(38 毫秒)和比密集 BEV fusion 探测器更好的性能(例如cont fuse60 毫秒)。下图总结了这些权衡。新的激光雷达+ RGB 融合架构可以找到在投影之间移动的方法,利用每个投影的优势。

Trade-offs between RV and BEV projections

强化学习研究中的基线

原文:https://towardsdatascience.com/the-state-of-baselines-in-reinforcement-learning-research-160e463003d9?source=collection_archive---------23-----------------------

当基线很容易允许新论文被比较时,它们是很棒的,但是当它们被要求在工作中试图进步理解和应用时,它们可能会腐蚀科学实践。

Mujoco simulations and learning curves are commonplace in reinforcement learning (sources 1, 2, 3).

基线是一个领域的从业者应该共享的工具集,以建立一个比较实验的共同基础。科研论文应该根据其想法的质量和实验的彻底性来评判,基线会有所帮助。我在强化学习研究中发现,基线已经成为一种障碍。

最近,我发表了一篇论文,对基于模型的强化学习中的常见实践进行了批评——这是以一种非常不科学的方式进行批评的,这将长期阻碍该领域的发展。评审者反对我们,因为我们的实现对评审者的基线不满意。最后,主要的区别是模拟版本化,这使得这篇论文的概念对于评论者来说几乎站不住脚。这对科学界来说是极其危险的,因为强化学习中的峰值基线性能通常更多地是参数调整的结果,而不是复制期间的洞察力。

将基线作为讨论的拐杖是不科学的,只会限制该领域的发展。当信任一个模拟机制而不是被评估的东西时,一个取得好的数字结果的科学家最终会强化潜在的坏行为。彼得·阿提亚在他的播客中多次评论这种危险(尽管是从医学的角度)。这个想法是,你可以从极化的方法和结果中选择一个象限,如下所示。

High level quad-chart for evaluating scientific practices.

我们拥有的选择以不同的方式影响科学家的精神状态——其中一些特别具有挑战性。

  1. 好的方法,好的结果:作为一名科学家的最佳感受——你严格地计划你的实验,它们奏效了。
  2. 好的方法,坏的结果:作为一名科学家最常见的感受——你所有的计划都达不到要求,你不得不从头开始。
  3. 不好的方法,好的结果:在 RL 研究中变得太常见的事情— 你尝试一些事情,得到了一个好的结果,却不知道为什么会发生当不使用回溯来找出方法论 时,这变得更糟。
  4. 不好的方法,不好的结果:是时候寻求更多的指导了。继续努力。

最终,当人们得到好的结果时,他们会得到积极的强化,所以他们会重复这些方法。我不禁觉得强化学习中实现的一些算法和论文都属于 3 ( 不好的 方法 好的 结果),所以平庸的方法都被强化了。

当我在脸书人工智能实习期间与一个“最先进的”强化学习算法的作者交谈时,他告诉我,他改变了现有代码中的一些策略参数化(从技术上讲,他添加了一个额外的值函数,以更好地处理不确定性),并注意到性能有了显著改善,所以他运行了它。这变成了第一作者论文和一定数量的强化学习名气。当前的学术周期奖励回溯,并以某种方式用引用来解释这些业绩上升,但我认为这是一项有风险的业务。我绝不是批评个人促进他们的工作,我更多的是在看这个系统,因为它没有比一个单独的数字看得更深。基线应该仅用于评估声称有性能的算法。

随着未来学习算法的中心阶段从模拟任务转移到真正的机器人代理,这个公式将不得不被重新评估。

Macao — the location for the last robotics conference I went to (IROS).

回到给我留下深刻印象的评论家。我理解这一评论,但我想指出我们的 RL 实现与原始实现之间的性能差距的可能原因。在这种情况下,我们与原作者合作,在 PyTorch 中从其原始 TensorFlow 重新实现了他的算法PETS(这是第一个潜在原因,这是两种计算结构之间的微小数字差异,并导致控制算法的概率推出的显著差异)。

Half Cheetah Mujoco simulation render from source. This little buddy gets so much attention from the best and brightest researchers in RL.

我们假设的主要差异是模拟器的差异。今天在强化学习研究中最常用的模拟器是 MuJoCo ,这是一个研究项目转化为多体接触力的产品。RL 的一些任务中的最高性能来自于在模拟器中利用非物理的微妙之处。非物理效应的产生是因为 接触力 难以建模,并且是高度非线性的。当在非线性函数的预期支持区域之外对其进行采样时,会出现“混乱”——复合非线性函数会迅速发散。

人们可以很容易地读到 MuJoCo 版本之间有多少变化,但是旧的研究没有被重新访问以更新结果。我们的实现从 1.31 版更改为 1.51 版,我们失去了峰值性能(在半猎豹任务上几乎损失了 40%的奖励)。考虑到这一点,我们将它与我们的其他高保真重新实现进行了比较,它们反映了这一下降。这种差异在学术界的贡献并不显著,但在如何接受工作方面却举足轻重。

审查者可能已经观察到的另一项是状态数据如何通过算法学习和控制过程的差异。基于模型和无模型强化学习的子区域之间的差异最为明显。由于在线规划中需要可访问的奖励,基于模型的强化学习需要访问奖励计算期间使用的所有状态变量,而无需更新模拟器的状态。这导致了环境中的以下微妙差异——让我们从一个无模型实现开始。

Returned observation when learning in the half-cheetah environment with model-free algorithms, (source).

您可以在基于模型的基线中看到观察结果发生了变化:

Returned observation when learning in the half-cheetah environment with model-based algorithms, (source).

大多数研究人员不会达到这种细节的水平,但所有的算法都显示出随着使用不同的状态变量,性能会发生巨大的变化。出于好奇,在第二幅图像中附加到观察结果的状态数据是速度,在本例中直接用于计算奖励。当无模型算法可以直接获得奖励时,可以发现它们从剩余的上下文中学习得更少。

最终翻转模拟版本、自动微分软件包或环境观察结构中的任何一个都会导致算法的模拟结果达不到要求。这方面的一大亮点是该领域一群顶尖人物尝试的一篇基线论文,参见:

[## 基于标杆模型的强化学习

基于标杆模型的强化学习

基于基准模型的强化 Learningwww.cs.toronto.edu](https://www.cs.toronto.edu/~tingwuwang/mbrl.html) [## WilsonWangTHU/mbbl

Arxiv 链接 PDF 项目页面摘要:基于模型的强化学习(MBRL)被广泛认为有潜力…

github.com](https://github.com/WilsonWangTHU/mbbl)

敏锐的读者会将他们给出的情节与发表的原始情节进行比较,差异比比皆是。 在强化学习中复制结果几乎是可笑的艰难

Fun Unitree bots (doggos) — taken at IROS 2019.

自受孕以来,DeepMind 的使命一直是:

“解决智能”

但是,如果研究因次要细节的差异而混乱,这种情况就不会发生。我认为脸书·艾的使命不太明确,就是:

“加深我们在新领域和现有领域的基本理解,涵盖与人工智能相关的所有主题,以通过开放研究推进人工智能的最新发展为使命,造福全人类”

在脸书,我知道他们很幸运地聚集了一个不可思议的团队,这个团队在这个领域取得了巨大的进步,但使命宣言留下了很多有待涵盖的内容。随着时间的推移,核心价值观复合并创造了研究和贡献的环境。如机构 DeepMind脸书 AI 等。声称他们在这些领域有长期、大胆的目标,我希望那些没有紧张、学术宵禁和压力的成员能够以不会导致过度依赖基线问题的方式来设计他们的工作。

更多?订阅我关于机器人、人工智能和社会的时事通讯!

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)

SXSW 时尚与美容技术,我的评论

原文:https://towardsdatascience.com/the-state-of-fashion-tech-8aa28794adf6?source=collection_archive---------26-----------------------

我在 SXSW 学到的一些关于时尚和美容技术的东西

今年我第一次参加了 SXSW(德克萨斯州奥斯汀)。迄今为止我参加过的最好的会议之一。这个节目的广度和深度给我留下了深刻的印象,而且你可以听到一个关于人工智能的演讲,然后去看一个利基爱尔兰嘻哈艺术家(大声喊出来!).我对美国国防部如何思考人工智能中的伦理问题,了解到中情局如何创新,或者欧莱雅如何在美容技术领域遥遥领先印象深刻。

我还看到陈慧娴谈论教育廷克·哈特菲尔德谈论设计空中乔丹,还有我最喜欢的亚历山大·奥卡西奥-科尔特斯!这是一个真正鼓舞人心的节目,展示了我非常关心的许多话题之间的交集。社会,城市化,政治,科技,人工智能和时尚。这也是一个很好的练习,听人们谈论一些我根本不熟悉的话题,走出我的舒适区。

Austin by night, the Saturday after the SXSW Conference (by me)

在这一周里,我在时尚和美容数字领域看到了一些非常有趣的趋势,尤其是人工智能在该领域的有趣应用。在这篇博客中,我分享了我在奥斯汀 SXSW 的一周里学到的一些见解。

“随着对更好的发现和搜索体验需求的增长,个性化将成为未来的关键,有多种方式来导航和影响客户看到的产品组合”

在 Tony Bacos(亚马逊时尚首席技术官)和 Blair Eadie(大西洋太平洋公司)的对话中,我们从最大的参与者之一那里瞥见了时尚电子商务平台的未来。两人都认为投资时尚是一个很好的机会,因为还没有人获得这种体验,尤其是从发现、浏览或试穿的角度来看。事实上,Bacos 提到,时尚电子商务平台领域的一些问题自 2000 年以来一直存在,但尚未得到解决。

  • 个性化和推荐将继续成为亚马逊这样的大公司的关注领域,与其他较小的零售商相比,亚马逊拥有较大的目录。当然,在这个领域,家庭购物者仍然是一个未解决的问题,为此亚马逊计划允许客户在会话开始时表明自己的身份。此外,由于缺乏词汇,人们无法描述自己的需求,在未来几年,以时尚领域特有的方式理解图像将非常重要,以便为客户提供符合他们品味、风格和身材的产品。
  • 在尺寸和合身——商业模式成功的关键——这个话题上,亚马逊时尚花费了很多努力,包括推出一个名为 prime 衣柜的新项目,顾客可以收到多达 8 件商品,他们可以在家里试穿,并且只需为他们保留的商品付费。亚马逊也有自己的品牌尺寸映射,这是一个特别困难的问题,因为它不仅与尺寸有关,还与偏好有关。例如,有些人喜欢穿宽松的衣服,而另一些人穿同样的衣服,但要紧身得多。
  • 一个主要的全球趋势是时尚产业中有影响力的人的角色正在上升。20 年前,人们通常会去商场购物,而现在他们会去 instagram 寻找灵感,这给时尚营销的运作方式带来了巨大的转变。因此,时尚电子商务平台和影响力之间的关系将在未来几年增长,亚马逊等公司将开发工具,让有影响力的人推动他们的业务,并建立他们的受众。
  • 虽然评论一直是亚马逊客户做出决策的强大工具,但该领域的用户体验正在增加——特别是在搜索和发现方面。在接下来的几年里,我们将看到围绕发现产品组合的新方法的创新:创建服装,探索视觉上相似的商品,或在搜索中实现新的发现体验,以便为每个客户创建精选商品。此外,新的多模态体验显示出早期的成功,人们更经常地问“ Alexa,我应该穿什么?
  • 同样,如果你开一家新店,如果你把它放在一个偏僻的小巷里,你也不太可能成功,亚马逊在试图把流量转移到一个全新的目的地时,没有成功地改变客户的行为。然而,多次失败和支点带来了教训。亚马逊已经利用了这些经验,他们现在的目标是建立可重复使用的内容体验,让客户可以在不同的渠道中享受,并试图通过这些媒介接触尽可能多的人。在这个新阶段,与有影响力的人合作至关重要。

“美容的未来是超个性化的。想想 23andMe,除了美容产品”

我对 Liz Bacelar(现任)和 Guive Balooch(欧莱雅)关于 联网美容 的对话印象特别深刻。令我惊讶的是,这个行业在很长一段时间里,在新的数字体验方面被大量发明。

  • 数字原生消费者越来越依赖科技来满足他们的#美丽目标。品牌正在通过创造将数字与物理相结合的工具来满足这种需求,个性化是核心,模糊了零售或家居美容体验之间的界限。
  • 当欧莱雅在 2014 年首次推出虚拟试衣时,他们着眼于动画行业,与 imagemetrics 合作推出了他们的首款产品。从那以后,他们在这个领域推出了几个产品,包括一个虚拟发型师。
  • 几年前,定制粉底被视为美容体验中个性化的前沿——50%的人找不到适合他们的色调!虽然从技术角度来看,创造某种色调的妆容并不是一个难以解决的问题,但挑战在于如何对肤色进行适当的测量来生产这种妆容,并将其包装成对顾客有吸引力的体验。
  • 在数字体验、可穿戴设备和健康意识之间进行创新时,欧莱雅推出了一款漂亮的可穿戴设备来测量紫外线暴露量。该设备没有电池,便于使用,并为佩戴者提供重要信息——他们暴露在多少紫外线下。随着黑色素瘤的增加,人们通常不会意识到自己暴露在阳光下,这种可穿戴设备成为一种非常重要的预防工具。
  • 对于美容,欧莱雅认为下一个前沿是将健康与美容结合起来,致力于类似于 23andme 的美容产品。打造超个性化的皮肤护理产品,根据个人的皮肤组成,甚至基因组量身定制!

“用这些数据来制作你自己的衣服怎么样?还是火绒,换衣服?利用数据是像 StitchFix 这样的数字玩家的关键

埃里克·科尔森(Stitch Fix)安迪·方(DoorDash)瑞秋·梅斯(CNN 财经)在小组讨论中讨论了人工智能如何改变我们的社会生活方式

  • 我在会议中听到的最有趣的事情之一是 Eric Colson 谈论 StitchFix 如何使用遗传算法来设计衣服,模仿自然选择的进化方式。该算法能够将不同的衣服组合在一起,甚至可以设计出新的衣服——想象一件皮革领的亚麻衬衫。这个想法最初是由作为公司的一个研究项目发起的,已经帮助推出了 140 多个非常成功的产品(我强烈推荐在 StitchFix 的 blo 上阅读更多相关信息)。
  • StitchFix 雇佣了 4000 多名造型师,他们与算法专家一起工作。科尔森解释说,人类和算法之间的关系是共生的,但有时很难,算法在某些领域缺乏理解。例如,算法无法理解特定的客户需求,例如在夏天去其他地方滑雪,并且在这些场合从不推荐合适的毛衣。算法也不擅长理解文本中的时尚概念(部分原因是顾客无法用语言表达他们的需求)。最终,算法无法模仿人的同理心,以及与他人联系的能力,这使得人类+机器的配对成为解决这类问题的好方法。
  • 在这次演讲中,尺码和合身问题也被多次提及,StitchFix 解释了他们如何利用顾客关于合身程度的数百万反馈。他们使用隐含的反馈来推导身体的潜在尺寸,并学习某人的尺寸。由于像 StitchFix 这样的公司比传统品牌更了解数据,他们与他们分享免费的尺寸、合身或颜色建议,为双方创造了双赢的局面。
  • 创造探索和发现时尚的新方法也是 StitchFix 提到的一个挑战,它最近推出了【shuffle】,一款类似 tinder 的服装应用程序。这使得他们能够收集大量数据,直接从图像中学习。数据的收集加上他们的人工智能技术使 StitchFix 能够创建理解风格的算法,然后驱动他们的许多推荐系统、与风格匹配算法或客户获取算法等。**

不可能的统计

原文:https://towardsdatascience.com/the-statistics-of-the-improbable-cec9a754e0ff?source=collection_archive---------22-----------------------

圣经代码、投资基金、彩票和“看别处”效应的诅咒

Photo by Brett Jordan on Unsplash

1994 年,耶路撒冷希伯来大学的研究人员在《统计科学》杂志上发表了一篇论文,声称找到了《创世纪》预言未来的证据。这一结果让研究人员和编辑都感到困惑,编辑在文章前评论说,这篇论文是“作为一个具有挑战性的谜题提供给统计科学读者的”。

研究人员声称发现了什么,又是如何发现的?

圣经密码难题

作者在寻找所谓的等距字母序列,例如,如果你在《创世纪》中看到每第五个字母的字母序列。他们正在测试这样生成的字母序列是否会包含 32 位著名拉比的姓名、出生日期和死亡日期,涵盖了犹太历史的整个跨度。如果他们能够找到这样的模式,在他们看来,这将证明《创世纪》事实上具有预言能力。

事实上,研究人员发现了隐藏在等距字母序列中的“拉比模式”,这让他们自己和他们的读者都感到惊讶。一位读者,记者迈克尔·德罗斯宁,以发现更多的模式为己任,这也是他 1997 年出版的书《圣经密码》的主要内容。这里发生了什么事?圣经真的有预言能力吗?

当然不是。这里发生的是所谓的看别处效应的一个例子。创世纪是一部庞大的文献。通过允许他们自己改变等距字母序列的开始,他们的间距,以及寻找拉比名字的特定版本,作者给了他们自己大量的回旋余地。正是这种回旋空间产生了虚假的统计信号:鉴于搜索参数的不同组合如此之多,检测拉比列表或您可能正在搜索的任何其他名称列表完全不是不可能的。最初的论文在 1997 年被正式反驳,当时布兰登·麦凯和他的合作者在同一份杂志上发表了“解开圣经密码之谜”。

你给自己惊喜的机会越多,你就越有可能惊喜。这就是“看别处”效应的本质。

“看别处”效应无处不在

另一个可以发现“看别处”效应的地方是金融业。投资公司通常有孵化器,这意味着他们推出许多不同战略的不同共同基金,所有这些基金都完全由自己的资金资助。如果处于潜伏期的基金数量足够多,当然有几个会跑赢平均市场,这完全是偶然的。在培育期结束时,公司可以向公众开放获胜的基金,宣传它们令人惊叹的表现,同时悄悄地停止那些失败的基金。客户被引导去相信基金经理有预测能力,但事实上他们只是在看一个统计上的侥幸,一个看别处效应的例子。

或者想想瑞典 1992 年的一项研究,将住在电线附近与儿童白血病联系起来。研究人员调查了居住在高压电线 300 米范围内的每个人,为期 25 年,并寻找超过 800 种不同疾病发病率的统计显著增加。当然,通过一次查看这么多不同的可能性,很有可能会偶然发现至少一个具有统计学意义的信号。**

Photo by dylan nolte on Unsplash

或者考虑一下北卡罗来纳彩票的巧合:2007 年 7 月 9 日和 11 日,北卡罗来纳现金彩票游戏中的中奖号码(4,21,23,34,39)是相同的。当然这是极不可能的,几率只有百万分之二,一些观察家甚至怀疑欺诈。然而,在匆忙做出任何判断之前,请再次考虑一下别处效应:这种特殊的彩票当时已经运营了近一年,此外,全国各地还有数百种其他 5 号码彩票运营了多年。在这么长的时间里,这么多的彩票在这么多不同的地方运作,在其中一个地方三天内发现两个相同的抽奖一点也不太可能。

频繁统计的问题是

“看别处”效应从根本上凸显了一个被称为“频繁主义者统计”的问题。在 frequentist 统计中,我们执行假设检验如下:假设零假设(例如,圣经不预测未来),找到测量观察值(例如,拉比的名字和死亡日期)的可能性有多大?如果该概率小于某个阈值,例如 0.05,那么研究人员将该结果视为支持拒绝零假设的“统计显著性”证据。

即使这种方法在今天被广泛使用,它也有许多问题,其中之一就是它固有的“看别处”效应。当只进行 20 种不同的测试时,它很可能只是偶然发现一个具有统计意义的信号。如果一个研究团队以 20 种不同的方式寻找一个信号,就像下面的 xkcd 漫画中那样,或者如果全球 20 个不同的研究团队寻找一个特定的信号,这种情况就会发生,在这种情况下,只有发现(虚假)信号的一个团队才会发表他们的结果。

Source: xkcd

想想贝叶斯:频率主义统计学的替代品

如果 frequentist 统计在某些方面是有缺陷的,并给出有缺陷的结果,是否有一个替代方案?是的,答案是贝叶斯统计。这两种风格的统计学之间最重要的区别是贝叶斯框架迫使你形成你的先验信念。例如,我对圣经预测未来的能力的先验知识基本上为零,所以即使来自希伯来研究小组的结果也不会改变这种先验信念很多。只有当我在其他地方看到越来越多同样的证据时,我才会开始改变我的观点。

电线也是一样。鉴于我们今天对医学、人体解剖学和电磁学的了解,我之前认为电力线导致白血病的可能性也接近于零。因此,即使是瑞典研究小组发表的结果也不应该改变我的看法,除非它们在其他地方得到支持。

因此,贝叶斯思维可以保护我们免受“看别处”效应的影响:首先考虑我们的前科可以防止我们接受“统计显著”的结果,而这些结果实际上是偶然的结果。

结论:怪游戏,不怪玩家

为了理解“看别处”效应所导致的问题的严重性,考虑一下世界各地的研究人员的角色,他们在研究项目中努力工作,试图在竞争环境中生存。为了在学术界立足并获得资助,研究人员希望发表新颖有趣的成果,而不仅仅是试图复制其他团队的先前成果。不幸的是,这使得福禄克的结果不太可能被后续研究揭穿。内科医生兼科学家约翰·约丹尼斯在 2005 年的一篇论文中提出了更强有力的主张,他认为大多数发表的研究发现都是错误的

因此,问题不在于个别研究人员,而在于整个学术“发表或灭亡”的文化。这是一个系统的例子,其中游戏是罪魁祸首,而不是玩家,我在以前的帖子这里中详细描述了这种现象。

有比我在这里所能提到的更多的“看别处”效应和有缺陷的统计数据的例子,如果你关注你周围的世界,你会看到它们。下一次,当你听到有人声称蟾蜍预示着地震,某个基因预示着智商水平,或者某些食物对你有害时,想想“看别处”效应:他们还测试了多少其他动物、基因或食物?最重要的是,要知道你的前任相信什么。

参考

  • 如何不犯错:数学思维的力量

在我的个人资料页面上找到更多我的故事,例如:

** [## 如何少一点错

用有限数据预测未来的贝叶斯指南

towardsdatascience.com](/how-to-be-less-wrong-5d6632a08f) [## 责备游戏,而不是玩家

博弈论如何帮助我们理解为什么有时每个人都会输

towardsdatascience.co](/blame-the-game-not-the-player-467e33d8044b)**

数据科学资历的步骤:领域知识

原文:https://towardsdatascience.com/the-steps-to-data-science-seniority-field-knowledge-f3c7a27a2123?source=collection_archive---------32-----------------------

需要提高哪些硬技能?

Photo by Ben White on Unsplash

在之前的一个故事中,我根据网络上相关文章的一个小样本,写了一个高级数据科学家应该具备的素质。总而言之,我提出了一名数据科学家为了晋升应该提高的三大支柱:

  • 你对自己了解多少 : 经验、工具箱、部署、好奇心
    你独立完成工作的能力,以及为了成功实现目标而积极主动的能力。
  • 你对你的公司了解多少 : 产品发现、初始、管理、测量。你看到全局、最大化影响、最小化复杂性、提出新想法并衡量其价值的能力。
  • 你对你的同事了解多少 : 沟通、领导、教学、微观管理
    向你的队友和经理推销你的想法、了解每个团队成员的优势和劣势、向他们传播你的个人知识以及有效领导他们的能力。

在这个故事中,我们将讨论第一个支柱的一部分:你的个人技能。为了执行项目并交付令人难以置信的结果,你每天都需要磨练哪些工具?

内部知识

你完成事情的能力与你对减轻人工智能模型编程负担的工具的熟悉程度以及何时使用它们的知识相关。你可以说一个好的数据科学家是一个专家应用者

数据科学家建模开发流程中有三个步骤直接受到您的领域知识的影响:数据表示、模型构建和影响测量。

数据表示法

创建模型时,您需要做的第一件事是定义原始信息如何变成漂亮的、语义丰富的数字。KPI 的时间序列?监控摄像头的实时图像?来自社交媒体的大段文字?你应该能够应对这些挑战,即使它们超出了你的专业领域。

您需要确切地知道如何处理每种类型的数据,以及什么模型适合您选择的数据表示。

根据红杉的这篇中型文章,将初级员工转变为高级员工的主要因素之一是他们成为多领域专家和职能领导的能力。要做到这一点,你需要摆脱模式的束缚:图像、文本、频率……这些都是数据。

了解每个可能领域的基本知识。用于文本的词袋和 Word2Vec,用于图像的 SIFT/SURF 和 ImageNet 训练的卷积网络,用于音频的 spectrograms 和 MFCCS。你的特征提取工具箱应该不断增长。

模型结构

虽然建模、训练和测试复杂算法是数据科学家工具包的一部分,但它们不是数据科学家完整课程的主菜。

你可能有一个偏好的领域,如自然语言处理、神经机器翻译、物体检测或面部识别,但你不需要精通人类已知的所有神经网络架构。

你需要知道为每项任务建模的基础知识。如何设计你的输入和输出,什么样的损失函数最适合你的训练,如何测量类不平衡,最重要的是,如何识别问题的核心。

大多数人工智能挑战可以被整齐地划分在不同的领域。了解每个领域问题的一般解决方案是资历的第一步。

  • 报价类别分类?可以是简单的(多类分类)也可以是复杂的(极端分类)。从小型分类器的层次结构开始,以简化问题。
  • 市场份额预测?时间序列预测。把你的数据按顺序排列,试着预测 n+1 。检查 LSTM 进行简单的深度学习部署。
  • 用户分析?分类如果你有大量的标签数据,那么聚类如果你没有。使用手动标签作为集群的根。检查集群指标。看看能不能用图相关的算法。
  • 在足球比赛中跟踪运动员?物体检测物体跟踪。标记数据对于良好的检测至关重要。一个预先训练好的 YOLO 网络应该是你的第一个测试,如果速度和内存是个问题的话,你可以试试 Mobilenet。跟踪取决于每秒钟可以分类多少帧。

你不需要脑子里所有东西的实现细节,那是谷歌和门德利的任务。你只需要知道如何有效地研究如何开发它们,并使用它们来实现这些算法。

影响测量

现在,对于您创建的所有模型,当您看到它们的度量标准时,您会有一种刺痛的感觉。如果你不去管它,它会占用你的睡眠时间,让你头晕目眩,气喘吁吁,陷入疯狂。

这个模型对于这个任务来说足够好吗?

这对我的公司有用吗?

很有可能你的整个模型都会报废。那只是数据的现实。事情进展得如此之快,以至于你都不记得 ML 项目最后一次投入生产是什么时候了。

但是模型本身从来不是你最大的资产。你从中获得的洞察力才是有价值的。

让我们回到几个段落,重新使用用户剖析问题。你的项目是细分你的用户群,以创造有针对性的广告。市场营销期待基于以前的人口研究的大的、抽象的分组,而你的模型创建了小的、密集的集群。他们对此很不高兴,你被叫去解释这些结果。

现在,你的模型是客观上在每个人的眼中是坏的,但是你知道得更清楚。

  • 数据不足。你提出了一个新的用户信息收集框架,以解决缺乏特定属性的问题,这些属性应该给营销带来它所期望的准确洞察力。
  • 目标过于抽象/根本错误。您分享了您的观点,即用户最好在较小的社区中建模,并精确定位具有大量成功和重复交易的群体。
  • 车型并非完全不能用。你的调查结果中有一些用户群直到现在才被注意到。您假设您的模型可以专门用于找到这些用户,并相应地锁定他们。
  • 模型的特定部分可用于其他目的。您创建的用户向量表示可以添加到产品推荐任务中,以增加轮播相关性。

所有这些都来自一个失败的项目。

能够充分磨砺这种价值预测特定技能的唯一磨刀石是经验。对公司的系统观察会让你看到可能的联系;了解什么可以被重用将允许你创建这些链接。

提高你的批判性思维。让它成为每天的练习。原子碎片中的四分之一问题及解决方案。注意其他领域的问题,这些问题可能会通过数据得到加强。

我倾向于认为数据科学家是好的学习者,而不一定是知识者。不要不顾一切地钻研每一个领域,成为其中的大师。如果你每天处理数据,你会慢慢积累知识和经验。我们都在数据的台阶上一起向上走!

感谢您的阅读,并在这个充满数据的宇宙中享受乐趣!

ImageAI 的故事和未来——一周年纪念

原文:https://towardsdatascience.com/the-story-and-future-of-imageai-one-year-anniversary-e63c80f527c8?source=collection_archive---------18-----------------------

ImageAI 的全球覆盖、案例研究和未来版本

我怀着无比激动的心情写下这篇文章,不仅因为 ImageAI 项目自 2018 年 3 月22 日启动以来产生了难以置信的影响,还因为该项目将在未来几年使创新成为可能。自从我们宣布 ImageAI 以来,已经过去了一年零两个月,这是一个我们构建的计算机视觉库,旨在使任何专业水平的开发人员都能访问和集成由深度学习支持的最先进的计算机视觉功能。如今, ImageAI 正被全球超过 65,000 名开发人员、工程师、大学生、研究机构、企业和新兴创业公司用于构建难以置信的想法和创新。

在这篇文章中,我将讨论这个项目的三个要点

-数字全球覆盖

- 突出应用案例分析

-****下一版本的时间表和特性

(1)全球覆盖

当我们发布了 ImageAI 库以及其英文文档和各种强调其功能实现的教程时,我们并不知道其源代码来源于我们的计算机系统的项目将在世界各地的各个国家和各个行业中得到广泛使用。自从过去一年零两个月以来, ImageAI

  • 已安装超过65000 次( 链接 )
  • 在全球 60+ 国家使用。
  • 在全球 200 多种出版物和研究论文中出现
  • 官方教程已经看了 42 万
  • 已被精选于视频教程分数拥有数万浏览量 ( 谷歌视频)(YouTube)

[## ImageAI

易于使用的计算机视觉库,用于最先进的人工智能。

imageai.org](https://imageai.org) [## 使用 Resnet50 - ImageAI 的对象+边界框

使用来自多个数据源的数据

www.kaggle.com](https://www.kaggle.com/shivamb/objects-bounding-boxes-using-resnet50-imageai) [## 使用图像人工智能|英特尔开发人员网格进行人群预测分析

概述/用法需要注意的是-计算机视觉由多个方面组成,如图像…

devmesh.intel.com](https://devmesh.intel.com/projects/crowd-prediction-analysis-using-image-ai-23087) [## 什么是智能图像

快速学习的聪明方法。你会得到详细的描述与视频和 ppt。

www.smarttuts.com](http://www.smarttuts.com/imageai/what_is_imageai) [## จากตรวจจับวัตถุในรูปภาพด้วยโค้ด·艾·แค่10บรรทัดสู่การตรวจจับวัตถุแบบเรียลไทม์และการทำ…

คำกล่าวนี้ไม่ใช่เรื่องเกินจริงปัจจุบันเราสามารถเขียน·艾·เพื่อตรวจจับวัตถุในรูปภาพ(物体探测)ได้ง่ายนิดเดียว…

www.patanasongsivilai.com](https://www.patanasongsivilai.com/blog/object-dection/)

(2)案例分析

在过去的一年里,我收到了来自世界各地的开发者、工程师、学生和研究人员的超过 1000 封电子邮件,内容是关于他们如何应用 ImageAI 来推动他们正在进行的令人难以置信的创新和项目。有趣的是,这些个人和团体在开始使用 ImageAI 库时,并没有计算机编程的知识。凭借 ImageAI 提供的简单、有据可查但功能强大的识别、检测和分析功能,下面列出的 3 个案例研究成为可能。不久,我将发表详细介绍每个案例研究的综合文章。

  • 桑迪 教授来自爱尔兰共和国 大学都柏林学院

桑迪·威尔金森教授是一名历史学家,他致力于保存 1800 年前欧洲印刷的数百万件历史装饰和插图。他的部门有这些插图的数字副本,但由于涉及大量的手动任务,手动分类时遇到了问题。桑迪教授能够使用 ImageAI 仅用 5 行代码训练一个定制识别模型,该模型自动化了数百万份数字副本的分类,为他节省了数千小时的人工工作。用他的话说,他说

"作为一名历史学家,我发现你们的 github 软件非常有用!我已经按照你的详细和非常有用的指示训练了一个测试 RESNET50 模型。它产生了惊人的精确结果。

[## 桑迪·威尔金森简介|都柏林大学学院

我的兴趣在于早期现代欧洲的社会和文化史,尤其是书籍史…

人民. ucd.ie](https://people.ucd.ie/sandy.wilkinson) [## 用 5 行代码训练图像识别人工智能

在本文中,我们将简要介绍人工智能领域,特别是在计算机视觉中,人工智能的应用

towardsdatascience.com](/train-image-recognition-ai-with-5-lines-of-code-8ed0bdd8d9ba)

  • 来自印度的 14 岁奥姆什列什蒂

在 2019 年 3 月 2 日的周末,当我听到 14 岁的 Omshreshti 的故事时,我的喜悦之情溢于言表,他是印度最有才华的青少年之一。Omshreshti 参加了在印度举行的 Raspberry Pi 周年纪念 IoT 科学博览会,直到活动的最后一刻,他还没有想出如何在他的项目中部署最先进的计算机视觉。一位名叫 Soma Bhadra 的杰出数据科学家建议 Omshreshti 在他的项目中实现 ImageAI 检测功能。

几分钟内,年轻的青少年 Omshreshti 就让他的项目运行了他的项目中最先进的对象检测算法之一。最精彩的部分是,他的项目成为物联网科学博览会上最受欢迎的项目,他的朋友们把他扛在肩上&显然是在为他欢呼!用他的话说,奥姆什列什蒂说

太感谢你了!你的ImageAI库帮我提交的&也是最受欢迎的。希望更多的人从中受益,也为它做出贡献。我希望我能学到足够的知识,也能有所贡献。

[## 奥姆的世界之窗

Om 在超级英雄命名页面的左栏选择了“The Flying”,右栏选择了“Favorite Food”。还有…

omshreshti.blogspot.com](http://omshreshti.blogspot.com/)

  • 安德鲁·斯科特·迈耶斯 及其团队美国加州大学伯克利分校

由于深度学习和计算机视觉具有无限的可能性,美国加州大学伯克利分校的硕士学生安德鲁·斯科特·梅耶斯使用 ImageAI 构建了一个废物扫描仪项目,他们在刚刚结束的加州大学伯克利分校设计创新展示会上展示了该项目。这个充满激情的研究团队能够利用最先进的识别和检测算法来识别废物并管理废物处理,以解决全球环境问题;使用 ImageAI 的易用功能,一切皆有可能。用他的话说,安德鲁说

"在展示会上,人们对这个项目很感兴趣,大多数人都对使用ImageAI库实现我们的想法的便捷性印象深刻。我们非常感谢ImageAI,并且很兴奋地向别人推荐你的作品。

(3)ImageAI 的未来版本

我们受到了使用 ImageAI 生成的故事、用例、视频、教程、内容和研究工作的启发。距离上次更新 ImageAI (v2.0.2)已经过去了 10 个月。我们已经审查了来自使用和支持该项目的开发人员社区的所有评论、建议和反馈。我们也想借此机会感谢他们在过去几个月耐心等待下一个版本。我们的团队一直致力于各种项目,包括 ImageAI。下一版本将于 2019 年 6 月 15 日发布,并将提供以下功能:****

  • 设置视频检测持续时间限制****
  • 完整保存定制训练模型,允许定制识别任何 Keras 模型,无需指定模型类型
  • ****将定制训练模型导出到 Tensoflow 。pb 格式
  • 来自先前保存的模型文件的连续模型训练
  • ****转移学习用于少量图像的训练
  • 运行多个定制识别型号
  • 将模型导出为 DeepStack API 格式
  • 使用 YOLOv3 进行自定义对象检测训练和推理

为了准备这个版本,我们已经启动了 ImageAI 论坛,以确保我们可以使用 ImageAI、与开发人员社区联系,讨论错误、功能请求、类和功能说明、教程、文档、示例应用程序和用例故事。

** [## ImageAI 论坛

ImageAI 项目的官方论坛。

forum.imageai.org](https://forum.imageai.org/)

一如既往,新版本将被完整地记录,所有新特性的示例代码将被提供,大量的教程将被发布。如果你想联系我们并讨论这个项目,请随时加入上面链接的 ImageAI 论坛。

ImageAIDeepQuest AI 团队开发维护。

"deep quest AI上,我们选择接受的使命是推进人工智能并使其民主化,并使其能够为地球上的每个个人和组织所用。

[## DeepQuest AI

在设备和云上提供 AI APIs。

deepquestai.com](https://deepquestai.com)

如果您希望就您的团队或个人项目直接联系我们,您可以随时通过我的电子邮件和下面的社交资料联系我。

电子邮件:guymodscientist@gmail.com

推特:https://twitter.com/OlafenwaMoses

https://www.facebook.com/moses.olafenwa:T30

[## OlafenwaMoses/ImageAI

一个 python 库,旨在使开发人员能够构建具有自包含计算机视觉的应用程序和系统…

github.com](https://github.com/OlafenwaMoses/ImageAI)**

缺失数据的故事

原文:https://towardsdatascience.com/the-story-of-missing-data-9922e611e56b?source=collection_archive---------22-----------------------

机器学习

快速解释缺失数据在机器学习中的重要性以及如何处理它

Photo by David Kennedy on Unsplash

顾名思义,缺失数据意味着—

手边的数据集中缺少特征值或目标值

基于缺失原因的缺失数据分类

Randomness everywhere.. (Photo by Jack Hamilton on Unsplash)

缺失数据基本上分为 3 类—

  1. 随机缺失(MAR) —因为特征(预测值)或目标缺失随机值的原因可以从探索性数据分析本身来理解。(此处阅读关于此事的深入
  2. 完全随机失踪(MCAR) —没有什么猫腻,失踪绝对是随机的!(在此阅读关于此的深入)
  3. 不是随机遗漏(MNAR)-对于机器学习爱好者或学生来说,这是最不幸的情况,因为这里遗漏的原因可以解释,但不能用数据集中的变量来解释。这种情况要求对数据分析的初始阶段(数据收集)进行彻底的调查!(在此阅读关于此的深入)

基于变量的缺失数据分类

Let the variables decide..(Photo by Nick Hillier on Unsplash)

在机器学习术语中,变量基本上有两种类型—

  1. 特征/预测值和
  2. 目标

因此,可以在这两个变量中找到缺失数据,因此可以分类如下:

a. 特征变量中缺失数据或特征缺失

b. 目标变量中的数据缺失或目标缺失——当目标变量本质上是离散的时,这种缺失也被称为类缺失,就像在二元或多类分类问题中一样。在连续目标变量的情况下,术语目标缺失可以用作默认值。

丢失数据的后果以及如何处理

The challenges (Photo by Danny on Unsplash)

缺失数据提出了两个主要问题—

  1. 信息丢失 —这个问题与特征缺失有关,最好的处理方法是使用插补技术。一些插补技术有:均值、中值、众数或常值插补。
  2. 不平衡数据集 —此问题仅与类缺失相关,与目标缺失情况无关。这是大多数分类问题中的基本问题之一。这个问题的解决方案是使用像过采样或欠采样技术这样的技术。如果存在目标缺失问题,我的建议是删除对应于每个目标缺失案例的数据点。

丢弃还是估算?

Which way? (Photo by Adi Goldstein on Unsplash)

以下是我自己的策略,只应如此重视:

如果特征缺失案例的缺失值> 5%——丢弃特征本身,否则对一个或多个特征进行插补。

5%或 10%或任何上限——由你决定。

基本思想是过多的插补是对基本分布行为的改变

过采样还是欠采样?

在解释过采样和欠采样之前,我们必须了解多数阶级少数阶级

多数阶级和少数阶级

Classes in society ( Photo by Jacek Dylag on Unsplash)

这个术语与前面提到的分类问题密切相关。多数类是支配目标(或类)变量分布的离散变量值,份额最小的类是少数类。例如,在一项 100 人随机调查中,70 名男性代表多数群体,30 名女性代表少数群体。

过采样人为地将对应于少数类的新的或克隆的数据点引入数据集并增加数据集的维数,同时 将数据集从不平衡转换为完全平衡 。这意味着,过采样是针对少数阶级的。

欠采样与过采样相反——它消除了一些多数类数据点以确保数据集完全平衡

一些过采样技术—

  1. 引导或重采样(替换采样)-包括过采样和欠采样
  2. 合成少数过采样技术( SMOTE )和
  3. 自适应合成采样方法

一些欠采样技术—

  1. 托梅克-林克斯欠采样
  2. 群集质心

混合技术——过采样+欠采样

  1. SMOTE 后跟 Tomek-Links

查看关于不平衡数据集重采样技术的简单 Kaggle 笔记本— 此处

所有的过采样和欠采样技术 API 都可以在 sci-kit learn 的“不平衡学习”中找到

参考

  1. medium—https://medium . com/@ danberdov/types-of-missing-data-902120 fa 4248
  2. medium—https://medium . com/coin monks/smote-and-adasyn-handling-unbalanced-data-set-34f 5223 e167
  3. ka ggle—https://www . ka ggle . com/RAF jaa/重采样-不平衡数据集策略
  4. sci-kit learn @ Github—https://github.com/scikit-learn-contrib/imbalanced-learn

移动 ML 的强大臂膀

原文:https://towardsdatascience.com/the-strong-arm-of-mobile-ml-5d44713072f4?source=collection_archive---------34-----------------------

2009 年,我正忙于为英国情报机构和美国国防部(DoD)构建一个 skunkworks 指挥和控制项目。这个项目外包给了我自己的技术咨询公司,所以我有一个相当开放的领域,从概念到交付。

该项目需要实时接收和处理来自内部和外部的大量不同来源的数据。最终的结果是一个基于 ESRI 地理信息系统(GIS)设计的反应灵敏的仪表盘。

到目前为止,我已经花了大约 3 年的时间来构建神经网络,从麻省理工学院的一个研究项目开始,利用现有的技术尽可能地深入研究。这些神经网络大多是用运行在 Windows 上的低级 C++构建的。本质上,我所钻研的机器学习是实验性和学术性的。

随着我现在能够从指挥和控制项目中获得大量数据,我开始设计神经网络来分析社会联系和地理数据,以发现行为模式。当 OpenCL(开放计算语言)登陆时,我将一个基于 AMD 的裸机神经网络引擎放在一起,以测试我在研究中通过各种笔记本勾画出的神经网络概念的可能性(和响应性)。这是我第一次介绍嵌入式神经网络的开发。不用说,时代变了。

多年来,我一直在我能找到的每个平台上研究神经网络,包括从英伟达的 CUDA (亚马逊的云平台)到谷歌的 TPU 的硬件。为从汽车、无人机和机器人到服务器集群和高产出数据平台的所有领域开发解决方案。

库达&马里的统治

十年后,嵌入式神经网络的前景已经完全改变,通过融合硬件设计影响云计算。在过去的几年里,我通过自己的企业与 ARM 合作过几次,包括嵌入式和 HPC 部门。

ARM 的设计现在渗透到智能手机、物联网和可穿戴设备市场,以及许多其他行业。他们的 HPC 设计正在服务器和云行业快速扩张,谷歌是他们最大的客户,此前他们将对谷歌云平台的投资从英特尔分散到 AMD,然后是 ARM。从苹果到三星,甚至像华为这样的中国主要制造商,ARM 都在不断地为我们的日常设备提供动力。

NVIDIA has leveraged the power of their GPUs for large scale deep learning

因此,当 ARM 发布了 Mali GPU ASIC 设计时,我又开始用 C++试验嵌入式神经网络。在 2013 年,这仍然是一项艰巨的工作,但改进的结果是显著的。将雾计算平台中基于 Mali 的神经网络与亚马逊上基于 CUDA 的集群相结合,为我正在钻研的从农业到经济的各种项目提供了昂贵但令人印象深刻的解决方案。在 ARM 和 NVIDIA 基本控制市场的情况下,高效 GPU 硬件的可用性是机器学习领域的一个重大改变。

手机上的机器学习

这些解决方案随着现在可用的开发工具的不断改进而不断发展,包括 TensorFlow LiteML KitCore ML 。后两者对于移动开发者社区尤为重要,他们越来越多地转向机器学习来增强移动应用体验。

这些框架的工具——以及在移动应用中有效使用它们的途径——差别很大,这本身就是一个迷人的主题。最近我一直在想,主要设备制造商之间的硬件实际上是如何影响开发者体验的。我最近支持了一个计算机视觉项目,其中一名 Android 开发人员发现谷歌 Pixel 3 上的 TensorFlow Lite (ML Kit / Firebase)模型的性能不足,不得不用三星 S10 进行原型开发。

我考虑这是否意味着两个最强大的智能手机之间的移动应用体验可能会有很大的不同,从而改变客户对质量的看法。因此,我一头扎进硬件,看看为什么最新的手机在如此短的时间内在性能方面取得了飞跃,以便更好地了解在构建智能手机体验时需要考虑哪些设计因素。

最初,关于谷歌 Pixel 3 为什么比三星 S10 慢这么多的具体答案很快就出来了。高通的骁龙 855 是新 S10 的核心,因为 Pixel 3 使用了旧的骁龙 845。不仅如此,S10 还有 Mali-G76 ,其中-因为 Pixel 3 使用了高通 Adreno 630。我不会在这里进入智能手机拆卸领域,人们会很快指出,S10 也有一个 Adreno 640 作为骁龙 855 的一部分,而不是在马里。无论如何,芯片设计的微小变化可以在机器学习模型和推理的计算能力方面产生巨大差异。

我在 iPhone 11 Pro 上使用了苹果的 A13 Bionic ,并在索尼的 Xperia 5 上测试了相同的 TensorFlow Lite 计算机视觉模型。该模型是我在 2016 年开发的,只是更新了依赖关系并进行重新训练。同样,我不会在这里对智能手机的性能进行基准测试,但在这些设备之间移动并看到性能变化的体验提出了一个问题,即开发人员在将他们的机器学习项目交付给消费者之前,可以在多大程度上测试他们的项目。

如果性能差异如此之大,用户体验设计应该考虑响应能力的潜在差异。我们不要忘记,改进不仅仅是在延迟方面,还包括热量和能源使用方面。这些是终端用户体验的关键要素。

神经处理单元

所有这些设备制造商都在通过他们定制的基于 ARM 的芯片构建特定于设备的功能,如摄影增强和生物识别。最近,智能手机神经网络行业的武器化迈出了重要的一步,这可能会对智能手机开发商的竞争力产生巨大影响。例如,苹果、谷歌和华为现在已经为他们最新的旗舰手机构建了定制的神经处理单元(npu),使机器学习对应用程序开发人员来说更加强大,但也意味着这些设备制造商可以独特地访问他们想要在这些设备上运行的操作类型。

在 npu 之前,开发人员构建的模型将针对 GPU(通常基于 Mali)进行优化,因为 GPU 的计算设计用于矩阵乘法和卷积,最初旨在渲染复杂的图形。在 GPU 出现之前,CPU 必须满足所有的处理需求。npu 松散地基于 GPU,没有图形处理所需的任何开销,这使得它们对于机器学习和深度学习任务非常有效。由于深度学习是一项计算量很大的任务,因此这是向前迈出的重要一步。

距离 ARM 宣布他们自己的一系列名为 Ethos 的 npu 还不到一周,这些 npu 是以 ARM NN 为理念打造的。这真的让我很兴奋:基于 ARM 的神经处理单元的想法将在未来 18 个月内开始登陆智能手机,更有趣的是,开始在边缘计算(想想物联网)和云计算中使用。这通常是英伟达的 CUDA 硬件和谷歌 TPU 的强项,但就效率和性能而言,ARM 无疑是这些公司所在市场的领导者,因此它们的 npu 可能会大幅进入这些领域。

ARM 的 Mali 几乎是最高性能智能手机唯一可用的 GPU 架构,它一直是移动设备上现有神经网络性能的主要来源。如果 ARM 采用了 Mali 的最佳部分,并将 Ethos 设计为神经网络的下一步,那么这可能是性能的重大转变。GPU 是一个有用的权宜之计,但从来没有打算做 npu 现在能够做的事情。

云中的风暴

一些最知名和最常用的神经网络库已经针对 Ethos 进行了优化,包括 Caffe2 (本身是一个面向移动的库) MXNetPyTorchTensorFlow 。随着谷歌在其谷歌云平台上拥有自己的 TPU(Google NPU 和首批上市的产品之一)的性能优势,我设想亚马逊和微软会考虑 ARM 的 Ethos 计划,并看看他们如何利用这些计划将 AWS 和 Azure 分别带回与谷歌云平台的竞争中,用于深度学习项目。

数据平台架构中的现有概念已经发生了广泛的变化,npu 在以多种方式优化数据平台方面创造了无数的可能性,这可能会使过去 15 年中占主导地位的数据平台架构像现在的 N 层架构一样冗余。

我最近与苹果、谷歌和英特尔谈论了机器学习的开发者工具链以及它与网络生态系统的关系。他们目前的视野是 10 年的硬件开发,这越来越适合神经网络操作的优化。流行的神经网络库已经包含 10,000 个运算,TensorFlow 同比增长 25%。这使得这些 10 年路线图无法坚持软件行业的发展。

相反,更高级的工具需要能够在编译器级别提供优化,这在目前还不是标准。Python 是最流行的机器学习语言,由于其执行模型,在运行时的优化有限。由于多级中间表示和【TensorFlow 的 Swift】是这种工具链优化如何有效工作的一个很好的例子,这种情况正在改变。优化硬件只是这个快速变化的生态系统的一部分。

开放,但不自由

看到 npu 的成熟和普及令人兴奋,但也令人担忧。对开发人员生态系统的硬件控制是一种把关的方法,增加了开发人员的工具费用。为机器学习生产和分发开源软件看起来仁慈而慷慨,但如果这些工具是由开源项目的赞助人针对特定 NPU 严格优化的,那么它就不再是一个开放的生态系统。这种担忧不仅与智能手机市场相关,也与云基础架构和 HPC 市场相关。

尽管如此,npu 可能对隐私优先的机器学习架构和安全性产生巨大的积极影响,无疑将刺激许多机器学习智能手机应用的用户体验。

当然,这里涵盖的大部分内容都是比大多数开发人员看到的更低的抽象层次。虽然我很喜欢 ARMv8 解决方案的开发,但开发人员甚至不会直接接触 ARM-NN SDK。这些组件都是像 TensorFlow 这样的高级神经网络在部署应用程序时如何工作的关键。了解我们所构建的基础对于进一步做出决策至关重要。

最后,重要的是从建立越来越多的智能神经网络的热情中退一步,并记住建立越来越大和复杂的计算解决方案的生态成本。考虑到这些项目的影响,关注如何让开发人员从我们丰富的工具中获得最大的影响是很重要的。

现代入侵检测系统的斗争

原文:https://towardsdatascience.com/the-struggle-of-modern-day-intrusion-detection-systems-50481a6b53c6?source=collection_archive---------35-----------------------

Image by Darwin Laganzon from Pixabay

在当今时代,安全是科技界的热门话题。围绕隐私和用户个人信息安全的问题和担忧总是一次又一次地被提出来,这是有充分理由的。用户每天频繁地从他们的手机更新他们的个人信息、他们的位置等等。这也包括银行报表和交易,它存储在哪里?当然是安全网络中的云!如果没有适当的安全措施,世界上任何地方的任何人都可以访问这些信息。

入侵检测系统(IDS)是任何系统或网络的第一道防线。顾名思义,它是一个可以检测任何入侵的系统。IDS 既可以是基于规则的,任何类型的流量都必须通过一组规则的检查才能通过,也可以是使用机器学习算法创建的,该算法根据其看到的流量类型动态创建新的规则。这些系统检测流量并将其分类为好的或恶意的,并且是系统/网络的固有看门人。今天,由于技术进步的速度,许多这些 IDS 系统正变得基于人工智能。IDS 系统必须跟上,我们已经到了一个时间点,我们很难编写这些规则来保护这些机器,而是让机器自己处理规则。然而,这些系统有一个缺陷:它们在对抗攻击方面很弱。

那么什么是对抗性攻击呢?首先,重要的是定义什么是对手。对手被定义为一个人在竞赛、冲突或争端中的对手。所以对抗性攻击是针对对手或对立人物的攻击。在这种情况下,对抗性攻击就是针对 IDS 的攻击。对抗性攻击是由对抗性人工智能(AI)创建的。对抗性 AI 是机器学习系统,是 AI 的天然对手,它用 AI 挑战 AI。IDSs 非常擅长于对恶意流量和良好流量进行分类,但却很难对伪装成良好流量的恶意流量进行分类。

当流量试图通过 IDS 时,有四种情况。前两种情况是正常流量通过和恶意流量被拒绝,但有两种情况流量可能被错误分类。误报是指好的流量被认为是恶意的并在进入系统之前被拒绝,而误报是指恶意流量被认为是好的并被允许进入系统,其中正流量被认为是恶意的,负流量被认为是正常的。对抗性人工智能侧重于最后两种情况;通过愚弄系统,对抗性 AI 系统可以选择哪些流量可以进入,哪些可以拒绝。

入侵检测系统和敌对的人工智能是两个主要的竞争对手,它们都有无限的潜力。也就是说,我期待看到对抗性的人工智能不仅会影响 IDS 的发展,还会影响整个人工智能的发展。

一个数据科学家的奋斗

原文:https://towardsdatascience.com/the-struggles-of-a-data-scientist-38ec17e76eba?source=collection_archive---------6-----------------------

我已经做了大约 4 年的数据科学家,虽然这真的取决于你的定义,因为我总是做它的许多部分,但那时候它并不是一个真正定义好的工作。虽然我确实发现数据科学和可靠性工程一样令人兴奋,而且这是我做过的最有趣的工作之一,但有时我可以看到它作为最令人满意的工作之一的标签上的裂缝。如果你在网上搜索,你会很快找到文章或帖子,强调不快乐的程度达到了 T2 的水平,或者 T4 的流失率很高。

Photo by JESHOOTS.COM on Unsplash

数据科学是不是一个很可怕的工作?

依我看,那不是真的。机器学习领域的新颖性和稀缺性是一个很大的优势,因为好的雇主知道你的价值(英国的平均基本工资估计为每年 42,000 英镑)并给你自由(如远程工作或灵活的工作时间),这对更严格的办公室工作来说是一股新鲜空气。此外,大量的问题和机器学习的使用意味着你的工作可以非常刺激和有益。

那么,什么是错的?

我认为这种新奇和流行是问题的部分原因。随着急于进入“人工智能热潮”公司试图雇用数据科学家,但他们不知道他们需要什么技能,因此他们需要雇用什么人。他们经常陷入以下陷阱。

1.他们不雇佣数据工程师来整理他们的数据

我曾在几家公司担任数据科学家,我遇到的主要问题是,在机器学习启用的早期,他们不知道自己有什么数据以及如何获取这些数据。通常,数据会保存在每个部门不同的数据库中(有时是完全不同的类型,如工厂数据的历史记录和客户数据的 SQL ),并且在这些领域之外没有共享内容(在现代的 GDPR 时代,部门之间不愿意共享数据可能会加剧,因为担心他们可能面临违规的风险)。

任何加入这样一个地方的数据科学家都会发现,他们无事可做,因为他们沮丧地坐在那里,试图获得他们可以吸收到脚本中的某个领域的最基本的数据。这里的关键点是,该公司需要一个数据工程师来管道化他们的数据,这样就可以很容易地访问这些数据。这将意味着他们可以更容易地找到他们拥有的东西,并真正开始对它进行一些探索性的数据分析,这可以在他们甚至考虑将它分配给机器学习问题之前很久就产生效益。然而,公司不太可能自己雇佣一名数据工程师,因为他们不知道他们是否被需要,他们也不太可能为他们不知道的事情支付大约 7 万英镑的年薪(在英国,数据工程师的平均年薪为 28,190 英镑)。同样值得注意的是,这将使公司每年花费超过 7 万英镑,因为他们需要支付劳动力成本而不仅仅是单纯的工资成本。

这里的问题是,他们没有准备好他们的公司数据生态系统,以使数据科学家能够茁壮成长并获得报酬。

2.他们不知道自己想要什么

我看到过几个招聘广告,它们列出了天底下所有的数据科学工具、编程语言和云系统。我甚至看到一个招聘广告,要求至少五年的 TensorFlow 经验。TensorFlow 发布于 2015 年,所以希望你能看到那里的问题。

同样,任何加入这些公司的数据科学家都会发现,他们要么无事可做,要么必须为每个人做点什么(见下文),最终永远不会真正做任何数据科学。即使你有数据科学项目,有太多的项目也意味着你永远不会真正把它们做好,因为数据科学通常是一个解谜练习,你需要大量的时间专门解决一个问题,而不是反复无常。不相信我?尝试完成一个数独谜题,每隔几分钟你起身去读几页数据科学教科书,然后再回来。与一次做一个相比,完成和理解这两个需要花费你很长的时间。

这里的问题是,对于他们想要什么,以及如何最大限度地发挥你的技能,没有一个计划。

3.他们认为任何数据都是你的领域

这是我认为的普遍问题。因为你的头衔中有“数据”这个词,一些公司会认为做像数据清理、数据工程和部署这样的事情,但更糟糕的是,你可能最终被期望监督公司拥有的所有数据(如果他们遭受问题 1。这一点也不好玩)并确保它完全符合 GDPR 标准和安全。您可能还需要制作 excel 电子表格,并计算管理层要求的每日统计数据。这些都不是你的领域,应该有专门的人来涵盖所有这些,其中一些人比经验丰富的数据科学家便宜得多(数据分析师的年薪约为 30,000 美元,是数据科学家平均水平的 71%)。

这里的问题是,公司花了一大笔钱让资历过高(或在某些领域不合格)的人去做只涉及到在八个月中所学技能的一小部分的工作,这可能需要一个数据科学家接受培训。

4.他们不明白这并不神奇

我认为这是数据科学的一部分。在新闻网站上看看,你会看到它正被用于检测癌症或构建复杂的面部识别模型。阅读其中任何一篇文章,你会情有可原地认为,一个简单的客户是否会停止购买你的产品的模型是微不足道的。

也有人问我,为什么没有数据就不能建立一个模型,一旦部署好,它就会学习,并在一周左右的时间内变得完美。

有一个普遍的普遍想法是,机器学习可以神奇地做任何事情,而且它会做得很完美。数据科学不是这样的。

数据科学非常依赖于理解您需要解决的问题,以及了解您拥有的数据(对于监督学习,如果您想要最大的成功机会,标签需要是好的)。没有这些,您就无法构建数据科学解决方案来最好地解决问题。事实上,我见过一些公司要求必须在他们的项目中使用神经网络(因为它很性感),即使它完全不合适或者与替代算法相比表现不佳。此外,即使他们有所有的数据,如果他们不包含你需要的特性来制作一个真正好的模型,项目也可能会失败。

数据故障的例子有:

  • 该特性并没有显著地改善它(例如,用于预测在零售商处购买女性产品的性别列)
  • 数据充满了错误,这使得它不可能(例如,预测工业烤箱的温度在 1 度以内,但是训练数据仅精确到 5 度)
  • 没有数据,或者数据过于稀疏而无法使用(例如,外卖的每日汇总销售数据用于预测每小时的客户需求)

现在上面的这些例子没有一个明确地排除了项目不工作的可能性(其他特性可能会补偿),但是它可能不像满足成功需求所要求的那样工作。

如果这是你第一次阅读本文中的要求,这是管理你老板期望的主要问题之一。在开始一个项目之前,真正定义成功的标准、要求和风险,可以在结束时避免心痛(而不是像本文一样在结束时首先讨论)。

结果呢?

Photo by Gabriel Matula on Unsplash

极度沮丧。数据科学经常花费(以我的经验)80%的时间清理和探索数据以解决问题,剩下的 20%实际上是设计和构建机器学习解决方案。上面的问题将意味着 20%将会缩水更多,让你感到沮丧,因为你正在做你离开时的工作,或者任何人都可以做但不需要机器学习的工作。

对于数据科学家来说,所有这些都是一场完美的风暴,他们很快就会对自己的工作感到失望和悲伤。如果我不得不忍受这些问题中的任何一个,不管有多长时间,我都会想找一份新工作。我只是不想做我想做的事情,那就是用数据解决现实世界的问题。

避免这些问题的方法是在面试开始前进行这类讨论。真正了解他们是否有计划如何最大限度地利用你,他们从一开始就准备利用你(例如,你可以在第一天就开始分析数据)。

当然,这并没有解决公司真正知道如何使用数据科学家的问题,希望这将随着时间的推移,随着更多数据科学知识的进步而发展。

外卖

不要对我写的东西感到沮丧。如今,数据科学仍然是你能拥有的最有趣、最有成就感的工作之一。只是要意识到你正在走进什么,尽量避开那些不会欣赏你的公司。

固定和修改学习速度的微妙艺术

原文:https://towardsdatascience.com/the-subtle-art-of-fixing-and-modifying-learning-rate-f1e22b537303?source=collection_archive---------15-----------------------

学习率超参数、原则和程序的介绍,以找到一个好的起始值,并在培训过程中进行调整。

Picture from internet

L 收益率是最关键的超参数之一,有可能决定你深度学习算法的命运。如果你搞砸了,那么优化器可能根本无法收敛!它就像一个闸门,控制优化器根据损耗梯度更新参数的程度。就方程而言,梯度由下式给出:

使用来自小批量的梯度,随机梯度下降遵循估计的下坡:

其中ϵ是学习率。下图解释了学习率对梯度下降的影响。非常小的学习率会让梯度下降即使梯度很大也是小步走,从而减缓学习的进程。如果学习率很高,那么在训练过程接近结束时,不可能学习到微调模型所需的参数的非常小的变化,因此误差很早就变平了。如果学习率很高,那么梯度下降就迈大步,跳来跳去。这会导致发散,从而增加误差。

为学习率选择一个好的起始值:

现在问题来了,学习率的最佳值是多少,如何决定?一种评估良好学习率的系统方法是,最初以非常低的学习率训练模型,并在每次迭代中增加学习率(线性或指数增长)(如下所示)。我们一直这样做,直到损失停止减少并开始增加。这意味着学习速率对于应用来说太高,因此梯度下降是发散的。对于实际应用,我们的学习率应该比这个值小 1 或 2 步。

如果我们跟踪学习率,并绘制学习率和误差的日志,我们将看到如下图。一个好的学习率在图表最低点的左边(如下图所示)。在这种情况下,它是 0.001 到 0.01。

总的来说,没有一个固定的学习率对整个训练过程最有效。通常,我们从使用上述方法找到的学习率开始。在培训过程中,我们会改变学习速度,以便更好地促进学习。有许多不同的方法来实现这一点。在这篇博客中,我们将浏览一些流行的学习进度计划。

阶跃衰减

步长衰减计划每隔几个历元就将学习速率降低一个因子。阶跃衰减的数学形式是:

其中,ϵ_{k}是第 k 个时期的学习率,ϵ_{0}是初始学习率,α是学习率降低的分数,⌊。⌋是下限操作,n 是学习率下降后的周期数。

在 Tensorflow 中,这很容易做到。为了修改学习率,我们需要一个变量来存储学习率,一个变量来存储迭代次数。

基于时间的线性或指数衰减

这种技术也被称为学习速率退火。我们从相对较高的学习率开始,然后在训练过程中逐渐降低。这种方法背后的直觉是,我们希望从初始参数快速遍历到一系列“好”参数值,但我们希望学习率足够小,以便我们可以探索“损失函数更深、更窄的部分”(微调参数以获得最佳结果)。

实际上,在迭代τ之前,学习速率通常会衰减。在线性衰减的情况下,学习率以下列方式修改:

其中α=\frac{k}{τ}。在迭代τ之后,通常使ϵ常数保持不变。

在指数衰减的情况下:

在 Tensorflow 中,这可以像我们实现步进衰减一样实现。在这种情况下,我们让 starboard = False,这使用了浮点除法,从而导致学习率逐渐降低。

当你达到一个稳定水平时,降低学习速度

这种技术也很流行,而且很直观。保持使用较大的学习率来快速接近局部最小值,并在我们达到稳定状态时降低它(即,这个学习率对于现在来说太大了,我们需要较小的值来更好地微调参数)。术语平台指的是当训练迭代的损失 w.r.t .的变化小于阈值θ时的点。这实际上意味着损失与迭代曲线变得平坦。下图对此进行了说明。

这种定制的学习率衰减调度程序可以通过将学习率作为占位符来轻松实现。然后,我们根据一些规则计算学习率,并将其与其他数据(输入、输出、辍学率等)一起传递给 feed_dict 中的 Tensorflow。

循环学习率

到目前为止,我们讨论的所有方案的目标都是以大的学习率开始,随着训练的进行,学习率越来越小。一些工作,如用于训练神经网络的循环学习率带有热重启的随机梯度下降提出了不同的建议。循环学习率背后的基本假设是“提高学习率可能会有短期的负面影响,但却能实现长期的有益效果”。这些著作的作者已经证明了在两个界限值之间变化的循环学习率计划可以比传统的学习率计划提供更好的结果。为什么循环学习率起作用的直觉是:

  1. 很好地概括数据的最小值不应是急剧的最小值,即参数的微小变化不应降低性能。通过允许我们的学习速度不时增加,我们可以“跳出”尖锐的最小值,这将暂时增加我们的损失,但最终可能导致收敛于更理想的最小值。请看这篇文章中的一个很好的反驳论点。
  2. 增加学习速率还可以允许“更快速地穿越鞍点平稳段”。正如你在下图中看到的,在一个鞍点处,梯度可以非常小。因为参数更新是梯度的函数,这导致我们的优化采取非常小的步骤;在这种情况下,提高学习速度可以避免在鞍点停留太长时间。因此,定期提高学习率有助于快速跳跃鞍点。

循环学习率的代码可以在这里找到。

最后要说明的是,没有一个学习率计划方案能对所有应用程序和体系结构都有效。我几乎总是以线性衰减方案开始我的实验(衰减学习速率直到某次迭代,然后保持它不变)。你总是可以从一些方案开始,如果训练误差没有像预期的那样下降,尝试一些其他的方案。快乐编码。

支持团队— SVM

原文:https://towardsdatascience.com/the-support-team-svm-555d2c30b1b3?source=collection_archive---------30-----------------------

主题概述:理解支持向量机 2020

支持向量机(SVM)是一个非常强大和通用的机器学习模型。SVM 可用于分类或回归问题和异常值检测。它是机器学习中最受欢迎的模型之一,任何对机器学习感兴趣的数据科学家都应该在他们的工具箱中拥有它。支持向量机特别适合于对小型或中型复杂数据集进行分类;小型数据集可能只有两个类,而中型数据集可能不止两个类。您将了解 SVM 线性和非线性分类器以及一些数学知识,以便更好地理解支持向量机。

厉害吧!

线性支持向量机分类

当我们想到 SVM 分类器时,我们可以把它比作两条人行道之间的街道。SVM 分类器的人行道是两个不同的等级,街道越宽,差距越大。

在机器学习中,我们必须保持方差和偏差的良好平衡,以获得良好的拟合模型。如果使用 SVM 分类器减小边距,偏差将减小,方差将增大(反之亦然,边距的增大将导致偏差的增大和方差的减小)。请注意,在边距之外或“街道之外”添加更多实例根本不会影响决策边界(边距之间的线)。原因是它完全由位于街道边缘的实例(下图中的红色数据点)支持。这些实例被称为支持向量。专业或技术的解释方式是,实例由超平面分隔,由于边缘的调整约束,超平面最佳拟合

虚线边距表示约束条件

硬利润和软利润分类

如果我们将所有实例都放在街道右侧,这被称为硬边界分类。硬利润分类有两个主要问题。硬边界分类仅在数据可线性分离时有效,而且硬边界对异常值非常敏感。我们可以使用软利润分类来避免这些问题。为避免问题,建议使用更灵活的模型和软利润分类。相反,硬边界将导致允许零误差的模型的过度拟合。有时,考虑到训练集中的错误可能会有所帮助,因为当应用于新数据集时,它可能会产生更一般化的模型。强制严格的边界可以使模型在训练集中表现良好,但在应用于新数据集时可能会过度拟合/不太可概括。确定“成本”的最佳设置可能与您正在处理的特定数据集有关。

正规化

使用 Scikit-Learn 中的 C 超参数,我们可以调整约束 w x + b = 1 和 wx+b = -1,以创建软边界。确保使用标准标量缩放数据,并将双参数设置为。使用较高的 C 值,分类器会产生较少的边界违规,但最终会产生较小的边界。相反,使用低 C 值时,裕度要大得多,但是许多实例都在超平面上结束。如果 SVM 模型过度拟合,您可以使用 C 超参数来调整它。

High C

Low C

顶部高 C,底部低 C

伽马参数是 RBF 核(高斯函数)的标准差的倒数,用作两点之间的相似性度量。直观上,小的伽玛值定义了具有大方差的高斯函数。在这种情况下,即使两个点相距很远,也可以认为是相似的。另一方面,较大的伽玛值意味着定义一个方差较小的高斯函数,在这种情况下,如果两个点彼此靠近,则认为它们是相似的。

非线性 SVM 分类器

尽管线性 SVM 分类器非常高效,并且在许多情况下工作得非常好,但是许多数据集甚至不接近线性可分。处理非线性数据集的一种方法是添加更多的要素。添加多项式特征易于实现,并且可以与各种机器学习算法配合使用。在低多项式次数下,它无法处理非常复杂的数据集,而在高多项式次数下,它会创建大量的要素,使模型太慢。

幸运的是我们有核技巧,核技巧是机器学习中的一种技术,用来避免一些算法中的一些密集计算,这使得一些计算从不可行变得太可行。在机器学习中,核方法是一类用于模式分析的算法,其最广为人知的成员是支持向量机(SVM)。模式分析的一般任务是发现和研究数据集中关系的一般类型(例如聚类排名、主成分、相关性、分类)。对于解决这些任务的许多算法,原始表示中的数据必须通过用户指定的特征图显式转换为特征向量表示:相比之下,核方法只需要用户指定的,即原始表示中数据点对的相似性函数。

内核方法因使用内核函数而得名,这使它们能够在高维、隐式特征空间中操作,而无需计算该空间中数据的坐标,而是简单地计算特征空间中所有数据对的图像之间的内积。该操作通常比坐标的显式计算在计算上更便宜。这种方法被称为“内核技巧”。为序列数据、图形、文本、图像以及向量引入了核函数。

最后

我们已经充分讨论了什么是支持向量机,同时给出了数学的一小部分。在数据科学领域,SVM 是一个很好的工具。由于增加的维度,SVM 也会变得令人难以招架。这可能会导致维数灾难,难以描绘和解释。为了减少这种情况,我们将使用主成分分析(PCA)和线性判别分析(LDA)。支持向量机拥有巨大的力量。希望这个博客能帮助你更好地了解 SVM。

全球不平等和你的银行存款余额之间的人工智能联系

原文:https://towardsdatascience.com/the-surprisingly-simple-relationship-between-ai-global-inequality-and-your-bank-balance-9cde1bf8bbdb?source=collection_archive---------22-----------------------

亚马逊上的每件商品都可能变得更便宜。但是代价是什么呢?

Photo: Getty Images

在人类对国际象棋和围棋的古老追求方面达到了新的高度,人工智能现在将颠覆人们喜爱的现代过去时光:购物。自动化最有意义的影响之一可能是商品成本的显著下降----使许多(如果不是全部)东西更便宜。

预测价格将下降的经济逻辑相对简单:目前由人类完成的自动化活动提高了性能,通常是由于更高的速度、更高的精度和消除了人为错误。换句话说,让人类离开工厂,用机器人取代他们,会导致生产率大幅提高,从而使制造商品的成本更低、速度更快。

自动化带来的生产率增长和更高的效率不仅意味着更低的价格,还意味着更快的经济增长,至少对于引领技术潮流的发达经济体来说是如此。一个相关的后果是,这些经济体的工资应该上涨。到目前为止,一切顺利!

不幸的是,这个明显的经济奇迹也有黑暗的一面。对富裕国家来说可能是经济福音的东西,对发展中国家来说可能预示着经济灾难。自动化的潜在优势是历史性的,但风险也是历史性的:毫不夸张地说,长期的全球不平等正岌岌可危。

机器人真的来了

为什么发展中经济体应该害怕自动化?人工智能和机器人技术的持续进步有可能彻底颠覆支撑其发展的经济模式。发展中国家不成比例地依赖最容易受到自动化影响的行业(因为它们涉及重复性/手工劳动)。例如,麦肯锡建议超过三分之二由人类完成的制造工作可以由机器来完成——节省超过一万亿美元的劳动力成本。

简而言之,如果将制造业外包给越南和孟加拉国等国家不再是最便宜的选择,企业就会停止这样做。随着人工智能和机器人技术的不断改进,越来越多的跨国公司将把它们在发展中国家的工厂替换为配备机器人的人工智能设施。毫无疑问:正在讨论中的“工业人工智能”的智能和能力正在快速扩张

没有人会认为工厂工作或类似的工作是完美的。但另一种选择肯定更糟。以耐克在印度尼西亚的工厂为例,这些工厂雇佣了超过 10 万人。无论如何想象,这些工厂都不是理想的工作场所——工资低,工作时间长,健康和安全长期处于危险之中。但是,如果耐克将这些工厂自动化,让所有工人都成为多余的,他们将不是唯一一个寻找另一份工作的人——成千上万的其他人也会在同一时间、同一地点寻找工作。

一些专家认为,像制造业这样的整个行业的自动化,以及相应的工作岗位的减少,将与新的工作岗位相平衡。这种观点认为,就像其他技术革命一样,人工智能将产生一系列新职业——毕马威建议的人工智能伦理专家,或“人工智能建筑师”。我确信在某种程度上,这将会发生(仅科技巨头就可以使用更多的伦理专家)。

但是你可以想象,这些新的高科技职业对普通工厂工人来说没有多少安慰。新的人工智能工作极有可能流向美国或其他发达经济体受过教育的技术熟练工人,而不是孟加拉国的制造业工人。现有的研究表明,在自动化之后适应新的职业需要资源、进一步的教育和福利网络:这些都有利于富裕国家的失业者,而不是发展中经济体。

这一经济风险因发展中国家在管理自动化导致的大规模裁员的健康和福利后果方面明显准备不足而加剧。对于已经被贫困和腐败等结构性问题困扰的国家来说,帮助如此大量的失业工人是一个巨大的挑战。

这一切意味着什么?人工智能和机器人技术的浪潮可能会对最没有能力应对的国家造成最大的伤害。至少,新兴经济体在适应后人工智能时代的经济时,将面临一段艰难的中短期阵痛。甚至还不清楚这种调整会是什么样子——在数百万低工资工人没有工作的世界里,这些国家如何改善自己的地位?

无论最终的破坏仅仅是短期的破坏,还是新兴经济体真正可怕的长期瘫痪,全球不平等将会发生什么是毫无疑问的。技术先进的国家(也是世界上最富裕的国家)将在依赖制造业的国家遭受损失的同时获得经济上的好处。是的,生产率会提高,但仅限于发达国家——美国的经济增长对不堪重负的泰国毫无帮助。

机会是,这种两极分化的转变将有利于我和你。自动化将使亚马逊或 H&M 的购物狂欢变得更加实惠(如果不完全可取的话)。我们甚至可能获得比其他方式更大的加薪。

但正如我在这篇文章中试图展示的那样,导致这些经济运动的潜在技术转变——人工智能和自动化——带来了人力成本。更糟糕的是,人力成本是不均衡的:大部分经济痛苦将落在某些发展中国家身上,这使得损失更加集中,也更加难以管理。

尽管存在恶性后果,但没有什么可以阻止自动化的步伐——潜在的生产率提高使人工智能成为受利润驱动的公司不可抗拒的选择。鉴于支撑自动化的技术只会越来越好,这一点尤其重要。

在这种情况下,我们至少可以承认,对你我来说,较低的价格代表着资本主义激励和发展中国家经济利益之间的一种权衡。真正的人类会遭殃——AI 不再(仅仅)玩游戏了。

棒球图形的对称和不对称

原文:https://towardsdatascience.com/the-symmetry-and-asymmetry-of-baseballs-graph-d2b18fd194d1?source=collection_archive---------20-----------------------

为了获得关于棒球的见解,许多分析师使用马尔可夫链模型来描述比赛。虽然建模者可以用无数种不同的方式来构建这样一个链,但一个常见且相对简单的选择是描述一个有 25 种状态的半局,以及这些状态之间无数种可能的转换。这些状态(也称为节点)和转移(也称为边)一起构成了所谓的马尔可夫链的——在这种情况下,是“棒球图”,我们在下面一起和分段地对其进行了可视化。

25 个状态和“数不清”的跃迁从何而来?在关于比赛的所有细节中,规范模型只跟踪哪些垒上目前有跑垒员,以及之前在半局中发生了多少出局。当这些跟踪的细节中的一个或两个发生变化时,或者当两个保持不变时,尽管面糊发生变化,状态之间的转换发生在板外观之间。游戏规则决定了哪些转变可以合法发生,哪些不可以。

因为一个棒球场有 3 个垒位(不算本垒),每个垒位可以容纳一个跑垒员,也可以不容纳,我们把 8 个可能的垒位标注为 0123121323123 。标签 0 表示底座为空。标签 123 表示装载的碱基。其他标签应该是不言自明的。我在联合统计会议的 2017 议事录中首次发表了这一批注。虽然还不是标准的,但我使用它,因为它和下面描述的附加符号一起,我觉得很容易阅读。

出局数我也用了四个标签:【空白】、 XXXXXX:X的数字表示半局中之前出局的次数。例如, 13XX 表示跑者在一垒和三垒(没有跑者在二垒),两人出局。同样地, 123 表示满垒,没有出局。因此,为了标记大多数状态,我们必须指定基本占用和 out 情况(包括[空白],表示无 out,如果这样指示的话)。这个州仍然是这个组合符号的唯一例外:三人出局后,哪个垒有跑垒员不再重要,因为半局不会继续。当然,其他 out 情况,【空白】XXX ,都拥有全部 8 个可能的基数占有率,所以状态数等于 8*3+1,即 25。

我用第一个状态的标签,一个冒号,然后是第二个状态的标签来表示转换。比如 123:0 表示大满贯本垒打,没有出局。转换可以回到相同的状态——0X:0X 表示本垒打,垒空,一个出局。试图计算“无数”的过渡会产生一个更棘手的问题,我在 2017 年的出版物中略有错误。一张图片抵得上 1000 个单词——尽管这张图片仍然很难理解:

为了掌握允许转换的数量,我建议采用一种不同的策略,而不是费力地数这个图中的箭头。除了乏味之外,图形可视化中的工件可能会导致计数不准确。也就是说,我们将计算下面显示的 12 个更简单(也更有启发性)的子图中的箭头。

该模型有 25 个状态,但是其中只有 24 个可以导致另一个转换(具体地说,除了 XXX 之外的所有状态)。因此,有 600 种可能的转换:600=24*25,但是根据棒球的规则,这些假设的想象中有许多不可能发生。

我们可以通过从 600 个可能的跃迁中排除违反三个约束中任何一个的跃迁,精确地计算出允许的跃迁(通过计算机)。

我们可以从消除 192 个可能的跃迁开始,对于这些跃迁,输出数会减少。例如,我们可以通过这个规则去掉 1XX:1X ,因为半局不可能从比赛前的两次出局变成比赛后的一次出局。有 192=388 个可以想象的转换来断言这种滑稽。除去它们,剩下 408 个状态,当然,仍然需要通过应用另外两个规则来进一步删减。

接下来,我们要消除“分数”必须降低的转换。这条规则仍然不够直观。下面的公式可以帮助理解这个约束:(跑垒人数的变化 ) = 1 — ( 出局人数的变化 ) — ( 得分的变化)。为什么是公式?我们只能增加一名跑垒员(击球手)。包括击球手在内的所有跑垒员都可以出局、得分或留在垒上——总数必须平衡。

我们可以(通常)直接从过渡符号中推断出平衡方程中的所有量,除了分数的变化。有了记谱法的知识,sabermetrician 可以很快解决平衡方程的分数变化。然而,如果该增量分数低于零,则所指示的转变不能合法地发生。如果是这样的话,那就意味着太多的出局和/或太多的跑垒员停留在垒上,考虑到比赛开始时的垒位占用率。

当我们的记分牌显示半局已经到了最后状态时,这个程序就停止了。从以 :XXX 结尾的过渡标签中,我们不能总是推断出哪些垒上仍然有跑垒者,也不能推断出分数发生了什么变化。但是之后约束变成(附加出局数 ) ≤ 1 + ( 跑垒员数,最初为)。

例如,第二步消除的 112 个额外的不可能转换中的三个是 0:1231:XXX0:0XX 。为了在实际比赛中强制进行这些转换,与规则相反,我们可以想象让球员从替补席回到比赛中,让他们遭受额外的出局,或者留在垒上,但无论是哪种情况,当他们进入球场时,取消他们之前的得分。这些恶作剧只是给一个非法标签提供了一个幻想的场景,迫使负分数保持平衡。恶魔?幸运的是,据我所知,没有人这样打棒球。

移除违反第一或第二约束的转变留下 296 个可能的转变。

我公布了 296 作为我对 2017 年允许过渡的计数。大约两年后,我有幸在美利坚大学与学生兼棒球爱好者杰克·伯比安共事。我们一起浏览了大量的数据,调查在游戏的历史记录中,实际上发生了哪些转变,以及哪些半局。我们的数据来自全面的追溯表数据库涵盖了从该来源可获得的大部分(但不是全部)数据。

在漫长的提取、转换和加载过程之后,我们查询了我们的数据库,以确定其中包含的转换数量。这个查询花了几分钟的时间运行,悬念建立起来了。答案是:由 Retrosheet 记录的 272 个转换(或者说,记录在我们几乎整个数据库的子集中)。我们进行了更多的测试,并确认我的 2017 代码确实认为记录中包含的所有 272 个转换都是可能的。也就是说,我们还发现另外四个也被认为是可能的过渡,仍然没有出现在的回顾表中。具体来说, 3:123X:12X3XX:12XX3XX:23XX 似乎从来没有在大联盟发生过,但我原本以为它们都有可能发生。

经过仔细观察,我们发现其中的三个转变(前三个,除了出局数之外都一样)确实违反了规则。它们不可能发生,因为在比赛中,三垒上的跑垒员必须退回到二垒。我们将规则添加到代码中,但是,哦,不可思议的错误!在这个过程中,我们发现这个规则的错误缺失只将这三个(本质上等价的)转换添加到现在被错误认为可能的转换列表中。考虑到可以想象到的巨大数量的转变,这个结果让我们觉得很不寻常。

四个缺失转场中的最后一个— 3XX:23XX 又是怎么回事呢?有趣的是,本质上等价的转换 3X:23X3:23 确实偶尔出现在追溯表记录中。所有这些不寻常的比赛都是从一个跑垒员开始的——在三垒上——尽管击球手上了二垒,但最初的跑垒员仍然在三垒上。显然很奇怪,但很明显,这种情况偶尔会发生,没有出局,或一人出局,但两人出局,跑在第三位的人永远不会原地不动。也许跑者得分了,也许跑者出去了,但是当初始状态是 3XX 时,最终状态从来不是,或者至少显然从来不是 23XX 。也就是说,规则明确允许这种过渡。因此,我们统计了棒球比赛中 293 次允许的转换,其中只有一次显然是史无前例的。

总共 293 个转变看起来太多了,难以想象,但是对称甚至惊人的不对称使得棒球的图表可以理解。我发现的诀窍是把图表分成几部分,揭示出潜在的模式。图的对称性指的是图与其自身(的子集)的一一对应关系保持了节点的连通性。

作为一个例子,我提出了一个替代游戏,我称之为无止境棒球。无尽的棒球有着惊人的对称性,在某种程度上类似于真实棒球中的类似模式。在这场比赛中,只有一个队上场击球,因为半局永不结束——出局数没有上限。人们可以想象贝比·鲁斯和乔·迪马吉奥不朽的灵魂在天堂被安排在击球队。

“无尽棒球”具有对称性,因为我们可以将每个状态对应(或映射)到一个伙伴状态——定义为拥有相同的基本占用率,但多出一个。反过来,合作伙伴映射到其他合作伙伴。连续重新应用地图会增加出局数,而不会改变哪些垒有跑垒员。映射定义了对称性,因为它保持了连通性——两个节点只有在它们的伙伴有边时才有边。所有状态都映射到一个伙伴,但是外环(“无输出”)不接收映射。出于这个原因,一对一的对应只与图中的一个子集相关——相似的对称性出现在分形中。基于我是如何绘制图表的,我把这种对称称为无尽棒球的“径向对称”。

这个游戏的普通版本也有类似的模式——可以说是径向对称。但是不对称打破了规则。不对称当然是三个上限,将无限游戏的无限图形修剪为三个环,加上中心的单个吸收态(见上图)。随着对称性的打破,凡人棒球不再拥有同样的一对一对应关系,因为有两个出局的州不再映射到唯一的合作伙伴,而中心州也不映射到任何地方。在这方面,棒球的“径向对称”就像下面讨论的其他对称一样,只是一种类似于替代游戏中对称的模式。

让我们通过形象化图表来讨论棒球的其他类似“对称”。我发现的分而治之的最好方法是从考虑三人战术开始,然后是双人战术、单人战术和清场战术。三重赛是击球队放弃三次出局的罕见情况;双杀放弃两次出局;单身,一个出局;一场干净的比赛是一场没有出局的比赛。据我所知,“三网合一”和“双网合一”是唯一常用的术语,但我们需要所有可能性的名称。

我将双人和单人戏剧进一步细分为五个子类别,标记为“从 0 、“从 R”、“从 RR”、“从 123 、“到 XXX ”每个细分(除了最后一个)收集具有相同初始跑垒员数量的过渡,但只包括导致一个或两个出局的过渡,而不是三个。标签“R”表示一个跑垒者;“RR”代表两个碱基——但符号并不表示哪个碱基被占据。最后一个子部分“to XXX ”结合了半局结束时各自类别(双人或单人游戏)中所有剩余的过渡。这一细分产生了 12 个数字,如下所示。如果划分和细分仍然不清楚,数字和它们的标题应该更好地阐明我的选择。

这些数字中的第一个显示了棒球中的三重播放转换。只有 9 个节点出现在图上:8 个,没有输出,组成完整图的外环,加上中心的单个节点,有三个输出。就目前而言,这 9 条就足够了,因为三网融合必须从无出局发展到三出局。在此图以及随后的 11 张图中,我们用彩色显示了考虑中的“起始州”,如果不同,则用灰色显示“终止州”。

尽管我们包括了所有 8 个零出局的状态,但三重播放只能从所示的四个节点发生——那些有两个或三个跑垒者的节点(即三个转换“从 RR 开始”,一个转换“从 123 ”)。三重播放不能从所示的其他四个“从”节点发生(即从 0 和“从 R”的转换)。为什么?要放弃三次出局,至少要有两名跑垒员,加上击球手。因此,图中出现的一些转换可以根据规则发生,而其他的则不能。我们不是只显示合法转换,并为非法转换留出空白,而是用黑色箭头显示合法转换,用红色箭头显示非法转换。

The triple play transitions in baseball. Black: allowed by rules, red: disallowed.

接下来,我们有双重性—但是,如上所述,我们将这一类别细分为五个子类别。这五个中的第一个的图表显示了从空垒和无出局到有两个出局的 8“到状态”(灰色内环)的双杀。所有这样的转换都违反了比赛规则,因为在场上没有其他进攻球员的情况下,只有击球手会出局。因此,双游戏图“从 0 开始”中的所有箭头都显示为红色。

Double plays from bases empty and no outs. All such transitions violate the rules, so are shown as red.

接下来,我们有一个跑垒员的双杀,没有出局。考虑中的三个“来自状态”具有标签 123 ,并且包括外环的子集,以颜色表示。另一方面,灰色的 8 个“to states”具有两个输出“ XX ”标签,构成了完整图的内环。注意,图中三个“自状态”中的每一个发出的单独的黑色箭头指向 0XX 。事实上,由于只有一名跑垒员在垒上,击球手和跑垒员都必须为防守方出局以获得双杀,比赛结束后总是留下空垒。因此,图中三个红色箭头指向每隔一个灰色节点。

Double plays from one runner on base and no outs.

我们指出,在上述所有三幅图中,上垒人数的差异(之前和之后,或之前上垒人数,对于到 XXX 的过渡)决定了箭头的颜色。这个性质暗示了一种对称性——一种将被打破的对称性。

接下来,我们有两个跑垒员的双杀,没有出局。彩色的三个“从状态”有标签 121323 ,灰色的 8 个“到状态”有与上面相同的两个输出标签。所有 8 个最终状态各收到三个箭头,但是,这一次,四个状态收到所有黑色箭头,四个状态收到所有红色箭头。请再次注意,至少在这个图表中,跑垒员数量的增量决定了转换是否违反规则。具体来说,“从 RR 到 0 ”和“从 RR 到 R”的双重播放可以发生,而“从 RR 到 RR”和“从 RR 到 123 的双重播放不能发生。违规行为的发生,不仅仅是因为开始比赛的人太少,也是因为太多人结束比赛。在这两种情况下,平衡 delta 分数低于零表示红色箭头。

Double plays from two runners on base and no outs.

接下来,我们有三个跑垒员的双杀,满垒,没有出局。在这个类别中,存在一个被考虑的初始状态: 123 ,图中唯一的彩色节点。因此,每个“to state”只接收一个箭头。这 8 个箭头除了一个都是黑色的。指向 123XX 的单个红色箭头具有有趣的区别,因为它是完整图上 25 个可能的最终状态中唯一不允许从 123 转换的状态。(剩余的 23 个瞬态中)没有其他初始状态具有相同的灵活性。过渡区 123:123XX 与上面考虑的其他非法双杀一样,将指示负的 delta 分数,因为在保持满垒的同时遭受两次出局,额外的跑垒员(最初不在比赛中)将不得不上场。

Double plays from bases loaded and no outs.

我们已经完成了外环双杀之旅。接下来,双播放到 XXX 。下一个例子显示了从一个 out 开始的转换,这就是为什么最终状态只能是 XXX 的原因。我们从来没有考虑过两人出局的初始状态下的双杀——显然,这是不可能的。因此,下一个数字,连同前面的四个数字,包含了所有可能的双杀。

从一出双玩图上唯一的红色箭头出现在 0X 处。为什么?双杀要求一名跑垒员放弃两次出局。另一方面,剩下的仍然是可能的,因为至少有一个跑垒员在垒上,击球手和其中一个跑垒员都可能出局。

Double plays from one out to XXX.

我们现在开始我们的单人戏剧之旅。接下来,我们有空垒的单场比赛,没有出局——只有 0 是“从状态”从这个单独的彩色节点发出 8 个箭头——每个箭头指向中环 8 个灰色节点中的一个。这些箭头中有七个是红色的。剩下的一个黑色箭头声明了 0:0X 的唯一合法性。事实上,在空的垒上,必须有一个击球手出局,没有跑垒员继续占据垒位。

Single plays from bases empty and no outs.

接下来,我们有一个跑垒员的一垒打,没有出局。相应的图有三个“从状态”,用颜色显示,标记为 123 。因此,8 个灰色“目标状态”中的每一个都有三个箭头。“至状态”描述(忽略输出)为“至 0 ”和“至 R”接收所有黑色箭头,而“至 RR”或“至 123 ”接收所有红色箭头。与上面类似的模式一样,平衡等式中对正 delta 分数的需求解释了我们所看到的情况。

Single plays from one runner on base and no outs.

接下来,我们有两个跑垒员的一垒打,没有出局。再一次,平衡方程,以其尚未探索的对称性,决定了一个类似的模式。但是请注意一些有趣的事情:图之间的一些“对称”交换了箭头的颜色。

Single plays from two runners on base and no outs.

接下来,我们有满垒无出局的单场比赛。作为补充,从 0 开始的双杀都有红色箭头,从 123 开始的单杀都有黑色箭头。

Single plays from bases loaded an no outs.

接下来,我们有两个出局的单打比赛(必须去 XXX )。我们把他们都放在一起,就像我们对一人双杀那样。下一张图将是我们的最后一部单剧,尽管仔细思考会发现我们从一出错过了单剧。我们省略的原因源于零输出和一输出之间的径向对称性:相应图表之间的唯一区别是标签中显示的 X 的数量。事实上,根据对称性,节点只有在它们的伙伴连接时才保持连接。相比之下,对于 double plays to XXX ,我们只发现一个非法过渡( 0X:XXX )。对于到 XXX 的单个播放,我们发现没有:所有这样的转换都可能发生。

Single plays from states with two outs.

我们最后一张图展示了没有出局的干净利落的打法。像单个剧本一样,我的 12 个数字序列省略了径向对称图。具体来说,对于干净的比赛,我们忽略了那些有一两次出局的比赛。除了少数例外,大多数干净的箭头都是黑色的。有趣的是,所有 8 个节点(和它们的径向对称伙伴,即所有 24 个瞬态)都有一个黑色连接回到它们自己。也就是说,由“从 0 到 RR”、“从 0123 ”和“从 R 到 123 所描述的七个转换不会发生。这些情况违反了正分数平衡规则:没有足够的跑步者在垒上开始并保持在指定的最终状态。

Clean plays from states with no outs.

我没有考虑干净转换图中的一个红色箭头。还记得 3:12 吗,我 2017 名单错过的那个真正不可能的过渡?根据要求,它显示为红色,但是,如前所述,它没有违反“余额为正数”的规定。那个过渡区(和它的两个径向对称的伙伴,未显示)是唯一被第三个修剪规则删除的——跑步者不能退到更低的垒。

有趣的是,我们对棒球过渡到 12 种情况的划分已经施加了出局数不能增加的限制(第一个修剪规则)。因此,被第一个修剪规则删除的转换不会出现在任何图中(没有黑色或红色箭头)。

因此,忽略 3:12 (及其伙伴),第二个修剪规则(与正分数平衡)确定显示或暗示的所有箭头的颜色(即,除了一个箭头之外的所有箭头,以及由对称性显示或暗示的 408 个箭头中的 405 个)。请记住,在第一个规则剔除了总共 600 个可能的转换中的 192 个之后,还剩下 408 个转换。

如果我们仔细研究棒球的对称性,我们应该只看平衡方程(及其对以 XXX 结束的比赛的扩展),以及正 delta 分数规定:(垒上跑垒员数量的变化 ) = 1 — ( 出局数的变化 ) — ( 分数变化)。上面的论述表明,我们将发现“基排列”对称,以及“互补”对称。“碱基置换”就是我所说的改变碱基标签的映射。另一方面,我称之为“互补”对称的映射是交换黑色和红色箭头,因为它是棒球图和它的补图之间的对称。具体来说,图的补图与原始图具有相同的节点,但是这些节点仅在原始节点不连接(红色箭头)的地方连接(黑色箭头)。

显然,棒球平衡方程中的完美对称只在真实比赛中出现,因为很少应用“无退路规则”和“三出局法”。人们可以愉快地想象保持完美对称的替代游戏——然后想象天堂里不朽的棒球精神为了奖励或惩罚而玩这些游戏。

包含图像的代码(Python/Jupyter notebook/Graphviz):https://github.com/seancarverphd/baseball_graph/

2017 年论文(R/knitter/LaTeX)代码和手稿:https://github.com/seancarverphd/klir/

我把这篇文章献给我的朋友和同事 Jacob Ward,他在短暂的一生中为对称性数学做出了许多贡献,还为一个职业队打过棒球。愿他安息。

每个分析团队都需要的技术

原文:https://towardsdatascience.com/the-technologies-that-every-analytics-group-needs-to-have-562676f095ce?source=collection_archive---------13-----------------------

四项改变游戏规则的技术可以造就一个世界级的分析团队

随着数据在工作场所变得越来越普遍,许多高管现在意识到拥有分析功能来支持他们的任务的价值,无论这是什么。然而,一些人认为,通过雇佣一些分析师或数据科学家,他们已经完成了所有需要做的事情。

建立一个伟大的分析功能不仅仅是拥有合适的人。这也是为了营造一种鼓励高质量协作和出色工作的环境。其中一个重要因素是分析职能部门可利用的技术,使他们能够开展工作。

我个人认为,如果你想运营一个世界级的分析团队,以下这些技术是必不可少的。

协作技术

分析工作可能是紧张而细致的。它也可能是复杂的和反复的。分析师或数据科学家需要能够以专注、不间断的方式一起工作,还需要能够交流和共享公式、代码、经验和功能。

如果团队位于同一地点,这当然很好,但是随着团队分散和远程工作变得越来越普遍,正确的协作技术需要实现这一点。电子邮件和传统的信息系统会大大降低团队的速度,因为它们不允许这里需要的那种共享。

SlackCircuit 这样的工具通过允许在专用的用户生成渠道中进行协作来填补这一空白,这意味着分析师可以轻松地在不同的项目之间导航,并对这些项目的先前沟通进行线性记录。它们允许以适当的格式轻松交流代码,并且它们的屏幕共享功能和语音交流功能被平滑地集成到它们的消息传递界面中,允许团队在需要时简单地进行呼叫或分享示例。

敏捷管理技术

世界级的分析团队必须敏捷。鉴于他们周围发展中世界的性质,这是必要的。没有适当的进度跟踪,项目就不能被有效地管理或交付,开发需要在短时间内完成,以避免浪费精力和不适当的专业技能部署。

敏捷不会凭空出现。它需要合格的人员和有利的技术。团队应该至少有一个合格的 Scrum 大师,所有的史诗、故事和冲刺都需要被仔细和严密地跟踪和管理。

JIRA、特雷罗计划箱这样的工具允许各种形式的敏捷跟踪,从可以记录、分配、跟踪和关闭请求的简单看板,到整个 epics 的管理。细节可以被捕获为注释,包括文件或产品的链接,或者代码块。可以进行分析,提供关于交付和周转的信息,帮助团队识别瓶颈和效率问题。

文档和应用程序共享技术

强大的分析团队应该开发定制的静态或交互式文档来解决业务的关键问题,尽可能允许业务客户自己访问数据和分析。将所有工作都放在分析师的本地机器上是没有意义的,分析师的才能将被浪费在一次又一次地重复回答来自企业的相同问题上。

数据科学发布允许快速构建可用于更广泛业务的分析文档或应用。从为特定客户创建的简单视图,到企业范围的报告平台。文档托管在一个访问受控的服务器上,因此用户可以直接登录并获取他们需要的内容。

像 R 中的 ShinyServerRStudioConnect 和 Python 中的 Dash 这样的工具允许数据科学家打包他们的本地代码并将其发布,以便其他人可以通过网络访问它。内置的反应性允许简单地构建菜单和过滤器,以便用户可以帮助自己获得他们需要的数据或分析。

版本控制

任何处理大量代码的团队都需要适当的版本控制。如果没有版本控制,灾难就要发生了。

像 G ithubGitLab 这样的版本控制工具允许团队在没有版本冲突风险的情况下协作开发代码。工作可以在分支中进行,只有在一系列审查和批准之后,这些分支才会合并到主版本中。最近,与 ide 的强大集成能力使得在这些平台上工作变得更加容易和流畅。

版本控制平台也是所有团队代码的中心。如果整个团队都遵循良好的版本控制实践,这自然意味着他们的关键代码都不会停留在本地机器上,并且团队的其他成员都可以访问这些代码——这是非常重要的,因为来自早期开发的代码块将在未来的开发中经常被重新利用。

我相信这些技术对于任何渴望高性能的分析团队来说都是至关重要的。随着这些技术的发展,它们也变得越来越能够相互集成。例如,一个被推送到版本控制的变更可以作为一个警告出现在您的协作技术或者您的敏捷跟踪工具中。如果你能建立这种工具链和环境,那么你的分析师和数据科学家将会茁壮成长,并产生他们最好的作品。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。

特定产品仅作为示例提及,并不代表对这些产品的认可。

在你开始一个 NLP 项目之前你需要知道的理论

原文:https://towardsdatascience.com/the-theory-you-need-to-know-before-you-start-an-nlp-project-1890f5bbb793?source=collection_archive---------4-----------------------

概述开始处理任何涉及文本的项目所需的最常见的自然语言处理和机器学习技术。

介绍

从一月份开始,我一直在做一个关于从非结构化文本中提取信息的项目。在开始这个项目之前,我对自然语言处理(NLP)领域一无所知。一旦我开始研究这个领域,我很快就遇到了“Python 的自然语言处理”,这里有。这本书对我来说太理论化了,尽管它的基本原理是正确的,所以它仍然是一个无价的资源。我的下一个重大发现是 Dipanjan Sarkar 的“文本分析与 Python ”,我已经从头到尾读了一遍。这是一本非常棒的书,它教会了我启动 NLP 项目所需的所有技术技能。第二版版本【6】也在最近发布。

在这篇文章中,我想概述一下我在获得 NLP 技能时了解的一些话题。我知道有很多很棒的帖子在讨论同样的事情,比如 Sarkar 的这个牛逼系列,但是写下来真的帮助我组织我所知道的一切。

这篇文章涵盖的内容

为了简洁起见,这篇文章主要是理论性的。以后我会多写一些实用的文章。现在,我将讨论几个主题,例如:

  1. 使用自然语言处理文本
  2. 从文本中提取特征
  3. 文本的监督学习
  4. 文本的无监督学习

预处理文本

预处理文本的典型管道由以下步骤组成:

  1. 句子分割。
  2. 规范化和符号化。
  3. 词性标注。
  4. 命名实体识别。

在大多数应用中,并不是所有的步骤都必须执行。对命名实体识别的需求取决于应用程序的业务需求,而词性标注通常由现代工具自动完成,以改进部分规范化和标记化步骤。

句子分割

在预处理流水线的第一步,文本被分割成句子。在许多语言中,如英语,标点符号,尤其是句号/句号字符,感叹号和问号可以用来标识句子的结尾。但是,句点字符也可以用在缩写中,如 Ms 或 U.K .,在这种情况下,句号字符并不表示句子的结束。在这些情况下,使用缩写表来避免句子边界的错误分类。当文本包含特定领域的术语时,必须创建一个额外的缩写字典来避免不自然的标记。

标记化和规范化

Tokenization corner case

标记化是将文本分成单词和标点符号,即标记。与句子分割一样,标点符号也很有挑战性。例如,U.K .应被视为一个标记,而“don 't”应被拆分为两个标记:“do”和“n't”。

词干化和词汇化是规范化过程的重要部分。规范化包括词干化和词汇化。在词干提取过程中,通过删除后缀(如–ed 和–ing)来识别单词的词干。由此产生的词干不一定是单词。类似地,词汇化包括删除前缀和后缀,重要的区别是结果属于该语言。这个结果叫做引理。在下表中可以看到词干化和词汇化的例子。

Examples of the differences between stemming and lemmatization

这两种技术都通过将单词转换成它们的基本形式来减少文本中的噪声。对于大多数应用程序,如文本分类或文档聚类,保持单词的含义是很重要的,最好使用词汇化而不是词干化。例如,meeting ( 名词)和 meeting ( 动词)都将被词干化为 meet,从而失去其原始含义,而各自的词条将是 meeting 和 meet。

其他标准化技术包括:扩展缩写,删除数字和标点符号,纠正典型的语法错误等。这些操作中的大部分可以通过使用正则表达式来完成。

词性标注

这一步是根据单词的上下文和定义,将标记分类为词性(POS)类,也称为单词类或词汇类。词类有名词、动词、介词、副词等。下表列出了英语词汇类别及示例。词性标注改善了词汇化,对于命名实体识别是必要的。

Examples of the common POS classes

有三种类型的标记器:基于规则的、基于统计的和基于深度学习的。基于规则的标记依赖于明确的规则,比如一个冠词必须跟一个名词,来标记记号。统计标记器使用概率模型来标记单个单词或单词序列。基于规则的标记非常精确,但也依赖于语言。扩展标记器以支持其他语言需要大量的工作。统计标签更容易创建,并且独立于语言,尽管它们牺牲了精确性。如今,使用基于规则和统计模型的混合方法,尽管大多数行业开始慢慢转向深度学习解决方案,即在预先标记的句子集上训练模型。基于混合和深度学习的方法改进了上下文敏感标记。

命名实体识别

在可以识别命名实体之前,必须对标记进行分块。分块意味着分割和标记记号集。最常用的组块之一是由限定词、形容词和名词组成的名词短语组块,例如,“一只快乐的独角兽”。一句“他找到了一只快乐的独角兽”由“他”和“一只快乐的独角兽”两个组块组成。

命名实体是指特定对象的名词短语,如个人、组织、地点、日期和地缘政治实体。命名实体识别(NER)步骤的目标是从文本中识别命名实体的提及。

Sentence with NER tags

机器学习

正如 Brink 等人所定义的,机器学习(ML)是利用历史数据中的模式来对新数据做出决策[1],或者正如谷歌首席决策科学家 Cassie Kozyrkov 如此雄辩地所说:“机器学习只是一个事物标签器,接受你对某事物的描述,并告诉你它应该被贴上什么标签。“当手头的问题过于复杂而无法通过编程解决时,应用 ML 技术是有用的,例如在图像上区分不同的猫品种,或者解决方案需要随着时间的推移而适应,例如识别手写文本[2]。

通常,机器学习分为有监督的和无监督的机器学习[2]。当我们的历史训练数据包含标签时(例如,下图中的“鸭子”和“不是鸭子”),我们可以使用监督学习。另一方面,当数据中没有标签时,应用无监督学习。无监督的机器学习方法旨在总结或压缩数据。这种差异的一个例子是检测垃圾邮件与异常检测的问题。在第一种情况下,我们将拥有带有垃圾邮件/非垃圾邮件标签的训练数据,在后一种情况下,我们将不得不根据电子邮件训练集来检测异常电子邮件。

The difference between supervised and unsupervised learning. Source

特征抽出

所有机器学习算法都需要数字数据作为输入。这意味着文本数据必须转换成数字。这是 NLP 世界中特征提取步骤的本质。

基于计数的策略

将文本转换成数字向量的最简单的方法是使用单词包(BoW)方法。BoW 的原理是从文本中取出所有独特的词,并创建一个名为词汇的文本语料库。使用词汇表,每个句子可以表示为一个由 1 和 0 组成的向量,这取决于词汇表中的某个单词是否出现在句子中。下图显示了在五个规范化句子上使用 BoW 方法创建的矩阵示例。

Example sentences

BoW feature matrix created from the sentences above

为了向词汇表添加更多的上下文,可以将标记分组在一起。这种方法被称为 N 元语法方法。一个 N 元文法是 N 个记号的序列。例如,二元模型是两个单词的序列,而三元模型是三个单词的序列。

一旦选择了词汇,不管是 1 个、2 个还是 3 个单词,都必须计算单词出现的次数。我们可以用弓的方法。这种方法的缺点是流行词变得太重要了。因此,最流行的方法是术语频率-逆文档频率(TF-IDF)。

High-level explanation of TF-IDF

TF-IDF 由词频(TF)和逆文档频率(IDF)组成,词频(TF)捕捉单词相对于句子长度的重要性,逆文档频率(IDF)捕捉单词相对于文档中的总行数出现在多少个文档行中,从而突出单词的稀有性。直观上,如果一个单词在一个文档中频繁出现,但在所有文档的集合中不频繁出现,则该单词具有较高的 TF-IDF 得分。下图显示了使用 TF-IDF 方法在前面看到的例句上创建的矩阵示例。请注意单词 fox 的分数与更频繁出现的兔子的分数是如何不同的。

TF-IDF feature matrix created from the example sentences

高级策略

虽然基于计数的方法可以用来捕获单词序列(n 元语法),但它们不能捕获单词的语义上下文,而语义上下文是许多 NLP 应用程序的核心。单词嵌入技术被用来克服这个问题。使用单词嵌入,词汇被转换成向量,使得具有相似上下文的单词在附近。

Word2Vec 是来自 Google 的一个框架,使用浅层神经网络来训练单词嵌入模型[3]。有两种类型的 Word2Vec 算法:Skip-Gram,用于预测给定单词周围的上下文,而连续单词包(CBOW)模型用于预测给定上下文中的下一个单词。

全局向量方法, GloVe ,使用同现统计来创建向量空间【4】。这个方法是 Word2Vec 的扩展,可以提供更好的单词嵌入。下图显示了例句中手套词嵌入的例子以及嵌入的图示。正如人们所料,类似的概念就在附近。

Feature matrix created using GloVe embeddings

Word vectors projected to a 2D space

Word2Vec 的另一个临时版本由脸书开发,名为 fastText 。fastText 是一个深度学习框架,在构建向量空间时会考虑单个字符[5]。

监督学习

基于标签(也称为目标)的格式,监督机器学习任务分为两个。如果目标是一个分类值(猫/狗),那么这是一个分类问题,另一方面,如果目标是数值型的(房子的价格),那么这是一个回归问题。在处理文本时,我们大多会遇到分类问题。

Typical supervised learning pipeline

上图显示了一个典型的文本分类系统的工作流程。我们首先将数据分为训练集和测试集。必须对训练和测试数据进行预处理和归一化,然后才能提取特征。前面几节介绍了最流行的文本数据特征提取技术。一旦文本数据被转换成数字形式,就可以对其应用机器学习算法。这个过程称为训练模型-模型从特征中学习模式来预测标签。通过称为超参数调整的过程,可以使用模型参数优化模型以获得更好的性能。然后,根据以前看不到的测试数据对结果模型进行评估。使用各种度量来测量模型的性能,例如准确度、精确度、召回率、F1 分数等等。本质上,这些分数是为了比较数据的真实标签和预测标签而构建的。

用于文本分类的典型算法有:

  • 多项式朴素贝叶斯-属于朴素贝叶斯算法家族,建立在贝叶斯定理的基础上,假设每个要素相互独立。多项式朴素贝叶斯是一种扩展,用于具有两个以上不同标签的分类任务(多类分类)。
  • 逻辑回归-一种使用 Sigmoid 函数预测分类值的算法。流行的 sklearn 包允许调整模型参数,使得算法也可用于多标签分类。
  • 支持向量机(SVM)——一种使用直线或超平面(如果有两个以上的特征,从而创建一个多维空间)来区分类别的算法。
  • 随机森林——一种集成方法,它并行地在各种数据子集上训练多个决策树。
  • 梯度推进机器(GBM)-一系列集成方法,用于训练一系列弱学习器,如决策树,以获得准确的结果。XGBoost 是这个算法家族中最流行的实现之一。

分类算法列表中的最后两项是集成方法,它们使用许多预测算法来实现更好的泛化。集成方法的结果通常比单个模型更平均,集成往往在较大的数据集上工作得更好。然而,正如 Sarkar 在[6]中证明的,集成方法不一定在文本数据上工作得更好。

评估指标

Confusion matrix and the metrics derived from it

混淆矩阵是评估机器学习模型的最简单和最直观的工具之一。它显示了实际值和预测值之间的关系。尽管混淆矩阵本身是一个有价值的工具,但与之相关的术语被用作其他度量的基础。关于混淆矩阵的重要术语:

  • 真阳性——我们预测为阳性,而实际输出也为阳性的情况。
  • 真阴性——我们预测为阴性而实际产出为阴性的情况。
  • 假阳性——我们预测为阳性而实际输出为阴性的情况。
  • 假阴性——我们预测为阴性而实际结果为阳性的情况。

从混淆矩阵中得出的指标有:

  • 准确性-模型在所有预测中做出的正确预测数。
  • 精度-所有阳性预测中正确阳性案例的数量,换句话说,有多少所选项目是相关的。
  • 回忆—所有实际阳性事件中正确阳性案例的数量,换句话说,选择了多少个相关项目。
  • F1 分数—结合精确度和召回率的单一分数,使用调和平均值获得。调和平均值是 x 和 y 相等时的平均值。但是当 x 和 y 不同时,它更接近于较小的数,而不是较大的数。

只有当标注包含大致相等数量的数据点时,准确性才是有用的度量标准。所有四个指标的范围从 0 到 1,1 是最好的,0 是最差的分数。

无监督学习

当要分析的数据集没有标签时,可以使用无监督的机器学习技术,例如聚类。聚类是无监督学习的一个分支,其目的是将相似的对象组合在一起。

Examples of clustering. Source

有几类可用的聚类算法:

  • 基于连通性的聚类(也称为分层聚类)根据数据点之间的距离来连接它们。有两种类型的策略用于连接这些点:凝聚,一种“自下而上”的方法,其中每个数据点成为自己的聚类,成对的聚类迭代合并,或“自上而下”的分裂方法,其中整个数据空间是一个被递归分裂的聚类。对于凝聚层次聚类,两个额外的度量是必要的:显示两个数据点有多相似的距离度量,欧几里德、汉明或余弦距离是典型的例子,以及显示数据点组有多相似的链接标准。
  • 基于质心的聚类-根据点与聚类质心的接近程度将数据划分到聚类中。K-means 是该算法最流行的实现。基本算法如下:(1)。)选择 k 作为集群的数量,(2。)将数据点分配到聚类中,(3。)计算群集质心,(4)。)将数据点重新分配到最近的质心,(5。)重复前面两步,直到质心不变。
  • 基于密度的聚类—数据空间被划分并聚类成密度区域。DBSCAN 和 OPTICS 是两种流行的算法,它们提取数据空间的密集区域,将“有噪声的”数据留在稀疏区域。光学试图克服 DBSCAN 在边界和不同密度的数据集上表现不佳的弱点。

文本摘要

文本摘要可以分为两部分:主题建模和自动文本摘要。自动文本摘要是使用 ML 算法来创建文档或一组文档的摘要的过程。这些算法在处理大量文档和/或长文档时表现最佳。

另一方面,主题建模侧重于从文档集合中提取主题。主题模型通常被称为概率统计模型,因为它们使用统计技术,如奇异值分解(SVD),来揭示文本中潜在的语义结构。SVD 依赖于矩阵分解,这是一种来自线性代数的技术,它将特征矩阵分成更小的分量。潜在语义索引(LSI)、潜在狄利克雷分配(LDA)和非负矩阵分解(NNMF)等方法利用线性代数中的技术将文档划分为主题,这些主题本质上是单词簇,如下所示。当文本多样化时,主题建模算法倾向于产生更好的结果。

The essence of topic modeling. Source

结论

我已经简要概述了一些重要的主题,一旦你开始一个涉及自然语言处理和机器学习的项目,你将会遇到这些主题。我几乎没有触及这个领域的表面。我甚至没有提到使用迁移学习的语言建模的令人兴奋的发展,你可以在 Sebastian Ruder 的这篇有见地的帖子中读到。

在我看来,这是一个非常令人兴奋的时间,开始在行业中实践应用的自然语言处理。正如 Yoav Goldberg 在我最近参加的 T2 会议上所说,大多数行业仍然使用正则表达式来解决问题。通过理解我在这篇文章中提出的理论,并将其应用于现实生活中的问题,你可以让一些人真正快乐起来。

Yoav Goldberg presenting the current state of the applied NLP at spaCy IRL

参考

[1] H. Brink、J. W. Richards 和 M. Fetherolf,真实世界机器学习(2017 年),曼宁出版社

[2] S. Shalev-Shwartz,S. Ben-David,理解机器学习:从理论到算法 (2014),剑桥大学出版社

[3] T. Mikolov、I. Sutskever、K. Chen、G. S Corrado 和 J. Dean。单词和短语的分布式表示及其组成 (2013),神经信息处理系统进展 26

[4] J. Pennington、R. Socher 和 C. D. Manning, GloVe:单词表示的全局向量 (2014),载于 EMNLP。

[5] P. Bojanowski、E. Grave、A. Joulin 和 T. Mikolov。用子词信息丰富词向量 (2016),arXiv 预印本

[6] D .萨卡尔。使用 Python 的文本分析:自然语言处理从业者指南(2019),Apress

数据科学和数据工程之间的细微差别

原文:https://towardsdatascience.com/the-thin-line-between-data-science-and-data-engineering-2e6bd922fe35?source=collection_archive---------16-----------------------

苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑

阿克谢·辛格在 TDS 播客

编者按:这是迈向数据科学播客“攀登数据科学阶梯”系列的第四集,由 Jeremie Harris、Edouard Harris 和 Russell Pollari 主持。他们一起经营一家名为sharpes minds的数据科学导师创业公司。可以听下面的播客:

如果你在过去几年一直关注数据科学的发展,你会知道这个领域自 2010 年代早期/中期的狂野西部阶段以来已经发生了很大的变化。那时候,几个 Jupyter 笔记本和半生不熟的建模项目可以让你在一家体面的公司找到工作,但事情已经发生了很大的变化。

如今,随着公司最终开始理解数据科学能够带来的价值,越来越多的人开始重视在生产系统中实施数据科学。由于这些实现需要能够在越来越大的数据集上实时执行的模型,大量数据科学问题已经成为工程问题。

这就是为什么我们采访了阿克谢·辛格,他曾在亚马逊、联盟和陈-扎克伯格计划(前身为 Meta.com)的数据科学团队工作并管理过。阿克谢在数据科学和数据工程的交叉领域工作,带领我们走过了数据分析和数据科学之间的微妙界限,该领域的未来,以及他对没有得到足够支持的最佳实践的想法。以下是我们的主要收获:

  • 在数据工程中最容易犯的一个错误是没有仔细考虑你选择的工具。你为什么用 S3 作为你的数据仓库?为什么不是红移或者 BigQuery?强迫自己理解这些问题的答案,不接受给定的工具是一种很好的成长方式,如果你想给潜在雇主留下深刻印象,这是至关重要的。
  • 永远假设你现在构建的任何东西都会在一年或更短的时间内被取代。生产系统不是静态的,你或其他人迟早会重新访问代码库的大部分。这就是为什么学习如何使用文档字符串,使用清晰的函数和变量名,以及理解内联注释的最佳实践是如此重要。
  • 数据会随着时间的推移而漂移,对今天的数据有效的模型在下周可能就不再有效了。这可能是由多种因素造成的:季节性是其中之一,但用户行为也会因你而改变。阿克谢建议,即时收集用户反馈是解决这个问题的关键:如果你注意到他们的反馈出乎意料地变得消极,在你的系统中设置一个警报,让你知道有些事情不对劲。
  • 大局是要记住的最重要的事情。人们很容易迷失在一个技术问题中,但伟大的数据科学家的标志是能够停下来问一问这个问题是否值得解决。你真的需要一个推荐系统吗,或者一个简单的基于规则的系统也可以吗?如果你无法获得监督学习模型所需的精确训练标签,你能拼凑出一个像样的代理吗?现实世界是混乱的,经常要求你用比 Kaggle 竞赛更有创造性的方式来处理数据科学问题。
  • 随着时间的推移,随着越来越多的数据科学家的工作负载通过越来越强大的工具被抽象化,看到全局的重要性只会与日俱增。数据科学正在缓慢但肯定地成为一个产品角色。

TDS 播客—剪辑

如果你在推特上,随时欢迎和我联系 @jeremiecharris

寄生虫和互惠互利者之间的细微差别

原文:https://towardsdatascience.com/the-thin-line-between-parasites-and-mutualists-cbeab224fefe?source=collection_archive---------24-----------------------

Photo by Pree Bissessur on Unsplash

如何用基于主体的模拟来理解从互利共生到寄生的进化,反之亦然

“寄生虫”这个词让人想起绦虫和扁虱的形象,而“互惠者”这个词则让人想起在大草原上,干净的鱼在大鲨鱼的嘴里啃食,鸟儿骑在有蹄类动物的背上。很明显一个永远不会变成另一个,对吗?如果有一件事是大自然嘲笑的,那就是任何愚蠢的人类试图把一种情况描绘成非黑即白,从寄生到互利共生的光谱也没有什么不同。

直到最近,科学家们才抓住这一观点,即寄生虫可以变成互惠互利者,反之亦然。有很多可能的例子:人类向土壤中添加氮可能导致通常帮助植物(通过固定氮)的土壤微生物成为寄生物,因为即使植物不再需要它们的帮助,它们仍然想要它们的糖。大肠杆菌是一种可怕的肠胃流感,也是人体的正常居住者,这取决于地点。有些昆虫从植物的基部偷取花蜜,避免花粉沾到它们身上;它们可能最初是由传粉者进化而来的吗?

虽然似乎有例子表明严格的互惠主义者或寄生虫可以进化成另一个,但没有办法确切知道发生了什么或会发生什么(除非你在某个地方藏了一台时间机器)。然而,人类非常善于发现模式,即使实际上并不存在模式,所以我从来不满足于认为这样的解释是理所当然的。

因为我个人没有藏时间机器,所以我创造了一个模拟,可以模拟互利共生、寄生以及任何介于两者之间的情况。如其名,符号使用基于代理的建模概念工作。基本上,我编写了关于通用主机如何运行的代码和关于通用共生体如何运行的代码。(补充说明:共生体是一个事物与另一个事物共存的专有名词,可以是寄生的、互惠的或其他的。互利共生是一个事物与另一个事物共存的专有名词,它们相互受益。)宿主和共生体都需要收集一定数量的资源以便能够繁殖,并且它们的后代继承它们的行为并有机会变异。这个非常简单的设置是进化发生所必需的。我感兴趣的行为是他们如何对待彼此。一般的宿主和一般的共生体可以是完全合作的(互利者)和为了共同的利益分享它们所有的资源,也可以是完全对立的(宿主和寄生虫),在这种情况下,宿主花费资源来保护自己,而寄生虫无论如何都要尽可能多的获取资源。关键是这是一个全谱,我可以创造大量的这些独立活动的宿主和共生体。通过这种方式,我能够在最高水平上模拟宿主生物和共生体群体在不同环境下可能如何进化。

现在有很多问题可以用这个软件来问(它是开源的,所以欢迎任何人来贡献),但是科学就是每次专注于一个特定的问题。

首先,我问这样一个主机和共生体系统的简单表示是否能够做我们大多数人所期望的事情。预期的第一件事与垂直传输速率有关。在高层次上,垂直传输速率是指当主机复制时,共生体能够跟随的速率。高垂直传输率似乎与互利共生有关,这是有道理的:如果宿主繁殖时共生体将被繁殖,那么共生体应该帮助宿主繁殖。你的线粒体就是现在 100%依赖垂直传播的共生体的好例子;它们获得下一代的唯一途径是它们所在的人类细胞进行繁殖,使它们成为非常可靠的互惠互利者。低垂直传播率似乎自然地与寄生现象和另一种传播形式联系在一起:水平传播。导致你在电梯里打喷嚏的感冒病毒不太可能持续到你下一次繁殖,因此它需要自己传播,并会尽可能多地利用你的资源来传播。

事实证明,我现在可以证明在垂直传播率和共生体种群进化到何种程度之间存在因果联系:

Graph showing the interaction between the vertical transmission rate and the final mean interaction value of hosts and symbionts. At 0% vertical transmission rate, the host and symbiont are in a traditional parasitic relationship. At 100% vertical transmission rate, they are in a traditional mutualistic relationship. At intermediate rates, they are somewhat mutualistic. [2]

这是一个乍看起来很明显,因此很无聊的图表。然而,我必须强调的是,如果没有这种类型的模拟,这是一个很难测试的假设,而且科学中充满了似乎明显正确但最终证明完全错误的假设。然而,这个令人放心的结果为深入研究一些“看似明显但可能是错误的”问题奠定了基础。本文探讨了其他几个问题,包括当有两个任务需要完成,而主持人只能完成其中一个时会发生什么。但是最后证明是错误的那个是最有趣的,所以这是我接下来要重点讲的。

空间结构如何改变互利共生的进化

当我们探索合作和空间结构的话题时,请耐心听我说。众所周知,在单个物种的合作领域,空间结构有助于合作策略的成功[3]。为了理解这个想法背后的直觉,想想一种细菌。如果这种细菌倾向于努力释放周围细胞可以利用的资源,它就很容易受到空间结构的影响。如果这是一个开放的海洋,周围的细胞不太可能分享它的基因,那么它就是在分享资源,可能得不到任何回报,也无法繁殖。然而,如果它在一个粘性的表面上,因此它周围的所有细胞几乎都是精确的克隆,那么它产生的任何资源都将进入这些克隆。由于这些克隆体与我们的友好细菌共享大部分基因,它们也将努力释放我们的细菌将使用的资源。如果一个合作者被其他合作者包围,那么它就更有可能把它的基因传递下去。导致后代与父母保持亲密关系的空间结构促进了这种有利于合作者的环境。因此,众所周知,空间结构使得合作更有可能发展成为一种成功的战略。

事实证明,只有当你谈论单一物种时,这才是正确的。当宿主/共生体系统加入空间结构后,在一定的垂直传输速率下,共生体变得更加寄生!

A series of graphs comparing vertical transmission rate to the final mean interaction value when reproduction is local or global. At rates of 40–70% vertical transmission rate, the symbionts were more parasitic with spatial structure than without. [2]

这个结果太出乎意料了,当我第一次得到数据时,我和我的同事们都确定某个地方有 bug。只有在大量的测试和另一个实验室发表的预测这一结果的数学模型[4]之后,我才确信这实际上是正确的。这是一个相当不和谐的结果,因为几十年来对单一物种合作的研究已经指向了合作进化的空间结构。问题在于,世界上没有物种是完全与世隔绝的。到处都有细菌、病毒和真菌,它们对我们这些大生物的健康影响比我们想象的要大得多。通过一个基于智能体的模拟,我已经展示了我们对合作的理解变得更加复杂,只要我们把另外一个物种考虑进去。想象一下,当我们把以各种想象和不可想象的方式相互作用的数百种因素考虑在内时,我们会意识到什么!

参考资料:

[1] E. I. Jones 等人,欺骗者必须繁荣:调和互惠主义中欺骗的理论和经验观点。(2015)生态快报

[2] A. E. Vostinar 和 C. Ofria,空间结构会降低共生合作。(2019)人工生命

[3] S. P. Diggle 等,群体感应细菌种群中的合作与冲突。 (2007 年)性质

[4]e . akay,种群结构降低了互利共生中伙伴选择的收益。 (2016),bioRxiv

这件事不言自明

原文:https://towardsdatascience.com/the-thing-speaks-for-itself-e075f026773?source=collection_archive---------23-----------------------

内部人工智能

为什么电脑撰写的法律摘要比你想象的要近

Image by Gerd Altmann from Pixabay

这篇文章写起来花了太长时间。研究、概述、起草、编辑。育雏。几个月来,我苦思冥想,不知道这是不是一个好主意。在我炖的时候,我担心别人会抢在我前面。

写作可能会让人筋疲力尽,但写法律摘要可能会非常痛苦。正如已故大法官斯卡利亚曾经承认的,“我不喜欢写作,但我喜欢写作。”我的原话。因此,在最真实的美国传统中,我梦想有一天我能把写作中最痛苦的部分自动化。

但这可能吗?一台机器能学会简短写作的艺术吗?而如果是这样,那种人工智能不就几代之遥了吗?

如果基础技术存在于今天会怎样?如果人工起草的辩护状已经出现会怎样?

我带来了消息。

2016 年,导演奥斯卡·夏普发布了一部名为太阳之春的九分钟科幻电影。 片头演职员表——在不祥的工业噪音中时隐时现的故障机器文本——确定了编剧:一台电脑。

Sunspring 是一项实验,灵感来自你每天放在口袋里的技术。多年来,智能手机一直在帮助我们编写文本,通过阅读我们键入的单词,预测我们的下一个单词是什么,并提出建议。夏普先生和他的工作人员使用类似的技术创作了《太阳之春》的剧本。

事情是这样的。首先,该团队“训练”了一个名为本杰明的软件程序。他们给本杰明提供了大约 150 个科幻电影剧本,让它消化和分析。然后,他们通过提供一个标题、一些示例对话和一些动作词给本杰明一个起点。

然后他们按下按钮。剧本辉煌地出现了:

在未来大规模失业的情况下,年轻人被迫卖血。这是我能做的第一件事。

H2:你应该看看那些男孩,然后闭嘴。我是那个要活到一百岁的人。

我又见到他了。你被送到我这里的方式…那是一个诚实的想法。我不是一盏明灯。

嗯,我得去看看头骨。我不知道。

这种华丽的废话坚持到底。

毫无疑问, Sunspring 是令人愉快的——但绝对不是因为它那噱头十足的编剧。归根结底,它的娱乐价值是老式人类汗水的产物。演员表演台词的方式,他们的面部表情,声音效果,电影摄影——它们都把你带离了语言的迷雾。你可能不知道为什么,但你可以告诉一些沉重的事情正在展开。这是一部外国电影抓住你的方式,即使你一个字也不懂。演员和工作人员把胡言乱语变成了现实。

本杰明使用的算法——被称为“长短期记忆递归神经网络”——并不写座谈会。它只是处理数据。为了生成的《太阳泉》,本杰明分析了 150 个剧本,并确定了单个单词出现在彼此附近的频率。然后,从夏普团队提供的种子词开始,本杰明开始组装对话。每当它选择一个单词时,它都会问自己一个问题:“鉴于目前我所看到的一切,下一个单词最有可能是什么?”然后,它选择下一个单词,并重复循环。一个剧本出来了。

库布里克这不是。没有潜在的想法被传达,没有指向对话。这实际上是一种统计学上的练习——比在字典里随意走一圈要好一点。没有方向,没有微妙之处,没有对歧义或上下文的欣赏,也没有有意的幽默。这是数学。但是一个好的演员和工作人员做了一些事情。

那么这是人工智能能做到的最好的吗?AI 的工作产品是否总是需要英雄式的干预才能有意义?大多数作家会嘲笑计算机会与人类作家竞争的想法——这对于我们这些短篇作家来说更是如此。在我们看来,我们的工作对人类智力的各个方面都提出了很高的要求。它需要主题知识、逻辑、说服力、简洁、风格、同理心和许多其他似乎难以捉摸的特质。很多律师都做不到。没有灵魂的机器肯定做不到这一点。

好吧。事实证明,电脑写作的发展比我们律师似乎意识到的要快得多。虽然往往很难将现实与炒作分开,但毫无疑问,艾以前在写作和说服方面的局限性正在稳步消失。这篇文章(还是花了太多时间来写)是我试图确定一些关于基于人工智能的写作的共同信念,并展示技术是如何反驳它们的。

“人工智能不能产生像样的散文。”尽管《T2》很有趣,但它的对话却是令人困惑的单词沙拉。你可能会由此得出结论,没有感知能力的机器根本无法持续地写出连贯的文本。但是这个结论是错误的。人工智能现在正在从头开始生成散文——它不仅连贯,而且实际上与人类的写作没有什么区别。事实上,很有可能你已经读了一些,甚至不知道它。

想想叙事科学,一家为 Forbes.com和 T5这样的客户制作在线新闻故事的芝加哥公司。为Wired.com,撰稿几年前,史蒂文·利维采访了叙事科学公司的员工,对他们的系统如何运作有了一些了解。⁵首先,机器吸收结构化信息——比如棒球统计数据或金融数据。然后,它应用一组规则和模板来了解这些数据的含义。例如,一场特殊的棒球比赛会增加胜利的几率(从而增加它的重要性)吗?股价突然上涨是否预示着商业突破?一旦系统识别出这个核心思想,它就会用简单的英语生成一个故事。

Sunspring 一样,这种简单的英语叙述来源于现有的书面作品。但与 Sunspring 不同,它是有意义的。这里有一个例子:

分析师预计,2015 年 7 月 24 日星期五,DTE Energy 将公布第二季度业绩,届时该公司的利润将会提高。普遍的估计是每股盈利 84 美分,比一年前的每股盈利 73 美分有所上升。

过去一个月,市场普遍预期没有变化,但比三个月前的 1.10 美元有所下降。对于本财年,分析师预计每股收益为 4.61 美元。分析师预计,该季度收入将同比下降 7%,至 25.2 亿美元,而一年前为 27.0 亿美元。今年的收入预计为 112.3 亿美元。

这可能不会赢得普利策奖,但仍然。可以理解,有条理,讲的是一个连贯的故事。最棒的是,假设它是准确的,它不需要真正的编辑。

体育新闻甚至更好,也许是因为这个主题不那么枯燥。这里有一个由 Wordsmith 制作的例子,这是一个机器人新闻节目,由北卡罗来纳州一家名为 Automated Insights 的技术公司创建:

马库斯·佩吉在比赛还剩 9 秒时得分,让北卡罗莱纳州以 72 比 71 领先路易斯维尔。在韦恩·布莱克希尔错失三分球和特里·罗齐尔第二次尝试失败后,脚后跟以相同的比分赢得了胜利。

佩吉的篮筐为焦油脚跟队带来了 13 分的反击,在比赛还剩 8 分 43 秒时布莱克希尔投出三分球后,焦油脚跟队以 63 比 50 落后。UNC 以 22-8 的比分结束了比赛,确保了胜利。在比赛还剩 39 秒时,布赖斯·约翰逊的一个篮筐让北卡罗莱纳州以 70 比 69 领先,罗齐尔以一个篮圈回应,让路易斯维尔在比赛还剩 26 秒时领先一分。

在这些文章发表后的短时间内,计算机写作变得越来越好。就在我写完这篇文章之前,埃隆·马斯克(Elon Musk)的 OpenAI 宣布,其 AI 平台现在可以根据基本提示生成虚构的“新闻”故事。给这个系统一个简单的句子——甚至只是一个片段——它就会消失。尽管接下来的故事完全是虚构的,但它们写得非常好,以至于一些观察家哀叹它们看起来多么可信。⁸

为什么相对于 Sunspring 有如此大的改进?一个很大的原因是结构。根据利维的说法,新闻故事往往遵循一个公式。程序员和监督者可以创建一个遵循这个食谱的框架,并可以开发一个包括体育迷和金融迷熟悉的行话的词汇表。太阳泉不涉及这种结构;这只是一个纯粹基于概率,像回形针一样将单词连接在一起的练习。

好的法律摘要也遵循可预测的结构。他们背诵法治,总结突出的事实,并认为这些事实决定了一个特定的结论。他们也可能继续反驳反驳。这可能比报道一场篮球赛要复杂得多,但并不总是如此。法律中确实存在简单的问题,比如撤销表面上违反了明确程序规则的传票,或者驳回被诉讼时效法规禁止的索赔。对于这些简单的事情,人工智能可能已经能够生成基本的简报。至于更复杂的问题,连贯的计算机写作只是时间问题;正如叙事科学、Wordsmith 和 OpenAI 所展示的,概念的证明已经存在。

与我们许多人可能相信的相反,底线是人工智能已经能够产生像样的散文,如果不是完全令人愉快的话。

从数字中生成公式化的散文是一回事。但 AI 无法可靠地分析非结构化的人类语言,并生成任何有价值的东西。”撰写体育和金融新闻的程序受益于高度结构化的数据,通常是数字。解析这种数据的方法已经存在了几个世纪,所以计算机能够从中提取意义也就不足为奇了。

然而,与统计学不同,人类语言本质上是“模糊的”,不可能现实地压缩成一套规则,硬编码到软件中或聚集到数据表中。当然,一台机器不能把法令、判例法和诉状简化成它能可靠分析的东西。

驯服语言信息肯定比处理数字更具挑战性。但同样,人工智能在从自然语言中提取意义方面取得了巨大进展。也许最突出的例子是 IBM Watson,它在 2011 年著名的《危险边缘》节目中击败了人类竞争对手!当出现问题时——通常是旨在欺骗参赛者的模糊问题——沃森的一屋子服务器开始进行一系列复杂的操作。在破译了英语问题后(在的危险中被称为“线索”!的说法),沃森通过查询大约 2 亿页本地存储的信息,对检索到的信息应用数百种算法,并为每个可能的答案分配置信度得分,来确定可能的答案。只要最佳答案超过了某个置信度阈值,Watson 就会进来,用简单的英语宣布它的答案(至少是以问题的形式)。而且它做这一切的速度往往比它的人类同伴能想到的还要快。⁹

关于《T4 危险边缘》的沃森!很像 Sunspring ,它需要大量的人工干预。据报道,大约 20 名研究人员花了三年时间训练该系统玩 Jeopardy!与人类不相上下。⁰一路走来,沃森的许多练习答案都是可笑的错误。这意味着机器只是在遵循由它的处理程序强加的复杂规则,并在多次迭代中提炼。

这给律师带来了一个问题,因为管理规则在不断变化。但是,如果机器能够训练本身理解人类语言,并相应地更新其输出,那会怎么样呢?

由于“机器学习”的最新进展,这种自我训练系统已经广泛存在。看看谷歌翻译就知道了。在 2016 年 11 月之前,谷歌的翻译依赖于大量的数据表、规则和例外,这些都是由用户社区管理的,他们提供了稳定的改进。虽然这种强力系统通常是成功的,但它很少考虑上下文或微妙之处,并且经常产生与 Sunspring 中的对话一样有意义的翻译。

但在 2016 年 11 月,谷歌扳动了开关。用户不再收到基于离散众包规则的原始翻译。现在,机器自己训练自己。和以前一样,它消化了大量信息(谷歌有很多)。但这一次,它自己识别了语言模式,并编写了自己的规则。结果是一个更好的产品。

你和我不需要知道这一切是如何运作的。我们真正需要知道的是它。人工智能现在可以在语言迷宫中导航,机器在处理非结构化信息时曾经面临的概念障碍已经在很大程度上被克服。多亏了机器学习算法,计算机现在可以近乎流利地模仿我们。

“训练这些系统所需的数据极其昂贵。”这是一个很好的观点,但最终是一个稍纵即逝的观点。诚然,Westlaw、LEXIS 和 PACER 并不便宜,而且很少有人能负担得起谷歌用来开发和改进谷歌翻译的数据量。

但随着低成本替代品的激增,这种信息寡头垄断已经开始消退。像 Justia.com、谷歌学术、RECAP 和许多其他网站现在提供免费或低价访问大量法律权威汇编和诉讼当事人提交的文件。一般经验表明,这种趋势只会继续下去。成本将会下降,免费数据库将会激增,数据积累将不再对任何有兴趣利用人工智能撰写法律摘要的人构成障碍。

“电脑说服不了人。”我们大多数人认为,要说服人类,一个人必须是人类。这一观点很有道理:说服不仅需要逻辑,还需要移情、识别(并利用)偏见的能力以及对人性的基本把握等神秘品质。鉴于如此多的人缺乏这些特征,我们怎么能指望机器拥有它们呢?

事实证明,他们不需要这么做。再一次,让我们考虑华生。2018 年 6 月,来自以色列的 IBM 研究人员前往旧金山展示了一款名为 Project Debater 的新产品。这场比赛让 IBM 的机器与两名人类辩手对决——不是任何辩手,而是两名以色列最优秀的辩手。利用典型的开场/反驳/总结形式,与会者就远程医疗和空间探索补贴的优点展开了辩论。所有这一切都是实时发生的:机器听取其人类对手的论点,剖析这些论点,并利用海量数据来制定和用声音表达简单英语的回应。它甚至会开玩笑。

但是说服了吗?似乎是这样。这些辩论是在人类观众面前进行的,他们评估这些论点,并判断哪个辩手的立场更有说服力。IBM 对谁“赢得”这场比赛讳莫如深,但这台机器确实改变了一些人的想法。它说服了,即使面对能力极强的对手。一些媒体已经建议,律师可以使用 Project Debater 的技术来识别和开发最能促进客户利益的法律论据。

计算机永远不会像律师一样思考,所以它们也不可能像律师一样写作按照目前的设想,人工智能机器不能像人类一样思考。事实上,它们根本不会思考——它们是没有知觉的设备。就有意识的思想而言,它们不比锤子更先进。

但是没有理由说机器必须像人一样思考才能在法律上成功。父子未来学家理查德和丹尼尔·萨斯金德写了大量关于计算机必须模仿人类创造者才能做人类所做的事情这一错误观念的文章。他们称之为“人工智能谬误”,错误地认为只有一种方法可以处理复杂的智力任务。⁴甚至谷歌的程序员显然也在努力克服这一谬误,并最终在他们重新发明谷歌翻译时战胜了它。正如谷歌的格雷格·科拉多(Greg Corrado)解释的那样,“机器‘知道’或‘理解’什么并不重要,重要的是它‘做什么’。。。."⁵

同样,计算机不需要听从金斯菲尔德教授来做律师的工作。只要黑匣子拿出一份好的简报,它是如何到达那里的,或者它是否“明白”自己在做什么都不重要。重要的是最终产品。像律师一样思考是不相关的。

“你已经确定了许多必须拼凑在一起的独立系统,这很难。”你难倒我了。但关键是,这些东西确实存在,即使只是雏形,而且它们可以拼凑在一起。谁以高性价比的方式做到这一点,谁就会把一个产品推向市场。一旦这类产品站稳脚跟,简短写作行业将开始无情的演变。

“在我的职业生涯中,这些都不会发生。”那还有待观察。但是,即使是那些接近退休的人也不应该过于自满。技术进步有一种悄悄接近你的方式。套用海明威的话,进步是逐渐发生的,然后突然发生。

作家雷·库兹韦尔预测,到 2050 年,“一千美元的计算将超过地球上所有人脑的处理能力。”⁶随你怎么争论这个问题,但核心观点依然存在:计算技术的进步是不可避免的。还有许多是不可预见的。正如《纽约时报》作家吉迪恩·刘易斯·克劳斯在他关于谷歌翻译的报告中所观察到的,“谷歌大脑在九个多月的时间里所做的事情只是一个例子,说明了大公司的一个小团队可以多么迅速地自动化一项没有人会与机器联系在一起的任务。”⁷为什么律师应该被豁免?

并非所有人都认同这种技术不断进步的愿景。一些专家看到了人工智能永远无法克服的理论砖墙,并认为当前的环境充斥着过度的炒作。也许是⁸。但是请记住,这篇文章中探讨的应用程序已经存在。时间会告诉我们他们能变得多能干,他们的工作能变得多复杂,以及他们是否能克服目前的局限。

不管怎样,门已经打开了。随着时间的推移,人工智能的能力和可用性将会增加,而其成本将会下降,所有这一切都在加速进行。随着客户看到人工智能生成可行草案的潜力,他们将坚持要求他们的律师要么采用这项技术,要么至少降低收费,以跟上他们机械化的竞争。随着人工智能开始超越初级律师(初级律师的原始工作往往需要大量的修改和重写),律师们将屈服于他们客户的新要求。没错,我们还没到那一步。但这只是时间问题。

那么,短篇作家注定要失败吗?我无法用任何权威回答这个价值百万的问题;我只是报道我在地平线上看到的。所以我不会假装预测未来或者权衡 AI 的社会成本和收益。许多聪明人已经写了关于这些话题的文章,其中包括田纳西大学的法学教授本·巴顿·⁹和英国的理查德·萨斯金德·⁰夫妇。我比不上他们富有洞察力的作品。

尽管如此,无论它的价值,这里是我个人的和投机性的。简短写作既困难又费时。(我有没有提到我写这篇文章花了多长时间?)我欢迎有一天计算机能够完成生成初稿所需的繁重工作。当这种情况发生时,我们律师将能够以更低的成本写更多的摘要——而且可以说是更好的摘要——并且没有所有的斯卡利亚式的痛苦。我们将花更多的时间润色好的机器生成的草稿,而不是花更少的时间盯着空白页。如果更低的成本激励更多的诉讼当事人去尝试对不利的判决提起上诉,像我这样的上诉从业者将会受益。在这样一个世界里,自动化将会带来解放和利润。

即使人工智能达到了可以生成完美草稿——甚至是最终稿——的地步,我仍然不认为我们注定要失败。法律是动态的,新的问题和争论一直在出现。机器是否能够在没有人类指导的情况下,从零开始,在不断变化的环境中产生新的有吸引力的想法,还有待观察。然而,正如巴顿教授提醒我的那样,随着机器观察(并从中学习)我们对其工作进行微调的尝试,任何技能差距都可能会缩小。

不管怎样,法律的实践是高度规范的,仅限于那些能够获得执照并遵守道德规范的人。完全有能力犯严重错误的计算机缺乏责任感。只要这是真的,人工智能就需要人类的监督。如果不是为了保护公众,就需要有执照的律师进行专业干预。所以很难想象有一天我们真正的人情味会完全多余。

看着人工智能机器学习写作将会很有趣(也有点令人不安)。看看我们律师如何应对这一新兴技术也将是一件有趣的事情。不管怎样,我想我们会成功的。

备注:

罗布·卡蒂 是与塞法思·肖·LLP 的搭档。他是该事务所上诉团队的联合主席,是美国法律作家学会的顾问委员会成员,并担任布莱克法律词典(第九版)和加纳现代美国用法(第三版)的批判性阅读小组成员。在进入法学院之前,Rob 发现了编码错误,并自学了多种编程语言。他从未完全康复。

感谢为本文慷慨提供宝贵意见的许多人:田纳西大学法学院本·巴顿教授;凯蒂·蒂尔尼,交响乐总汇;Pete Bausbacher,ProtoLink 公司;帕拉德普·贾万古拉,交响音乐总汇;以及计算机和法律学会 OBE FRSE 的 Richard Susskind。

这句话出自布莱恩·加纳(Bryan Garner)著名的最高法院采访系列(2019 年 4 月 6 日访问)。

SunspringYouTube 上有(2019 年 4 月 6 日访问)。

维基百科投稿人,Sunspring(2019),维基百科,自由百科(2019 年 4 月 6 日访问)。

⁴·亚历克斯·布兰南,对太阳之春的深入分析(2016),由计算机编写的短片 (2016),CineFiles 电影评论(2019 年 4 月 6 日访问)。

⁵·史蒂文·利维,一个算法能写出比人类记者更好的新闻故事吗? (2012),Wired.com(2019 年 4 月 6 日到访)。

Forbes.com,⁶叙事科学, DTE 能源收益预计增加 (2015 年)(2019 年 4 月 6 日访问)。

BBC.com,⁷·斯蒂芬·贝克特《机器人新闻:计算机如何描述一场体育比赛》(2015 年)(2019 年 4 月 6 日访问)。

⁸·威尔·奈特,写令人信服的散文的人工智能冒着大量生产假新闻的风险 (2019),《麻省理工科技评论》(2019 年 4 月 6 日访问)。

⁹·乔·贝斯特,IBM Watson:jeopardy 获奖超级计算机如何诞生的内幕,以及它接下来想做什么 (2013),techrepublic(2019 年 4 月 6 日访问)。

⁰·贝斯特,同上

要深入了解谷歌翻译如何利用机器学习将其翻译提升到一个新的水平,请参见吉迪恩·刘易斯-克劳斯,伟大的人工智能觉醒 (2016),纽约时报杂志(2019 年 4 月 6 日访问)。

YouTube 上有大量关于这一事件的视频。在 IBM ResearchCNET福克斯商业上有三个简短的例子(均于 2019 年 4 月 6 日访问)。

比利·杜伯斯坦,IBM 的辩手:你的下一个律师? (2018),《杂色傻子》(2019 年 4 月 6 日访问)。

参见理查德·萨斯金德和丹尼尔·萨斯金德,职业的未来 (2015),牛津大学出版社。

⁵·路易斯·克劳斯,同上

⁶·萨斯金德和萨斯金德住在 157 号。

⁷·路易斯·克劳斯,同上

⁸·托马斯·尼尔德,深度学习已经达到极限了吗?又一个人工智能的冬天来了吗? (2019),走向数据科学(2019 年 4 月 6 日访问)。

⁹·本杰明·h·巴顿和斯蒂芬诺斯·比巴斯,重启正义 (2017),遭遇书;本杰明·h·巴顿(Benjamin H. Barton),半满的玻璃杯 (2015),牛津大学出版社。

⁰·萨斯金德和萨斯金德,同上;理查德·萨斯金德(Richard Susskind),明日律师 (2013),牛津大学出版社。

第三波数据科学家

原文:https://towardsdatascience.com/the-third-wave-data-scientist-1421df7433c9?source=collection_archive---------3-----------------------

数据科学技能组合的更新

介绍

Drew Conway 的数据科学技能集可视化是一个经常被引用的经典。不同的观点和角色的多样性催生了众多的变化:

Various data science Venn diagrams. Image courtesy of Google Images. Source: https://sinews.siam.org/Details-Page/a-timely-focus-on-data-science

在数据科学技能集上似乎没有共识。此外,随着该领域的发展,缺点变得明显,新的挑战出现。我们该如何描述这种进化?

第一波数据科学家出现在数据变大之前,在数据科学成为现实之前(2010 年之前):统计学家和分析师一直都在,做着许多现代数据科学家正在做的事情,但伴随着较少的宣传。

第二波:大规模的数据收集创造了对聪明头脑的需求,这些聪明头脑能够施展魔法,将所有这些大数据变成大钱。公司仍在考虑雇佣什么样的人,通常会求助于理科毕业生。虽然第二波数据科学家做得很对,但他们精心制作的模型往往以概念证明告终,未能带来实际变化。

现在,在 2010 年代末,在围绕深度学习和人工智能的大肆宣传中,进入了第三波数据科学家:实验和创新,有效地寻找商业价值和弥合部署差距,以创建伟大的数据产品。这里需要哪些技能?

The skill portfolio of the third wave data scientist.

1.商业思维

业务思维是数据科学技能集的核心,因为它设定目标并应用其他技能来实现目标。Patrick McKenzie 在这篇博客文章中指出:

工程师是被雇佣来创造商业价值的,而不是用来编程的:企业总是出于非理性和政治原因做事[……],但总的来说,他们都致力于增加收入或降低成本。

同样,数据科学家被雇佣来创造商业价值,而不仅仅是建立模型。问问自己:我的工作成果会如何影响公司的决策?我要怎么做才能让这种效果最大化?凭借这种企业家精神,第三次浪潮数据科学家不仅产生可操作的见解,还寻求它们带来真正的改变

观察组织中的资金流向—成本或收入最高的部门可能会提供最高的财务杠杆。然而,业务价值是一个模糊的概念:它超出了当前财年的成本和收入。试验创造创新的数据文化将增加公司的长期竞争力。

分清主次你的工作和知道什么时候停止效率的关键。考虑收益递减:为了 0.2%的精确度,花费数周时间来调整一个模型值得吗?很多时候, 足够好才是真正的完美

构成康威技能组合三分之一的领域专长绝不是可以忽视的——然而,你几乎在任何地方都不得不在工作中学习它。这包括你所在行业的知识,以及所有的公司流程、命名方案和特性。这些知识不仅为您的工作设定了框架条件,而且对于理解和解释您的数据也是不可或缺的。

简单点,笨蛋

注意容易摘到的果子和快速赢得的东西。对现有数据仓库的简单 SQL 查询可能会产生产品经理或高管不知道的有价值的见解。不要陷入做“流行词驱动的数据科学”的陷阱,专注于最先进的深度学习,其中一个漂亮简单的回归模型就足够了——而且构建、实施和维护的工作要少得多。知道复杂的事情,但不要把事情过分复杂化。

2.软件工程工艺

(第二波)数据科学家只需要“黑客技术”而不需要适当的软件工程的观念已经被反复批判。缺乏可读性、模块化或版本化会阻碍协作、可复制性和生产。

相反,向合适的软件工程师学习技术。测试你的代码并使用版本控制。遵循既定的编码风格(如 PEP8),学习如何使用 IDE(如 PyCharm)。试试结对编程。模块化并记录你的代码,使用有意义的变量名并重构,重构,重构。

弥合数据产品敏捷原型的部署差距:学习使用日志和监控工具。知道如何构建一个 REST API(例如使用 Flask)来将你的结果提供给其他人。了解如何在 Docker 容器中运输您的作品,或者将其部署到 Heroku 这样的平台上。与其让你的模型在你的笔记本电脑上腐烂,不如将它们包装成数据驱动的服务,与你公司的 it 环境紧密结合。

3.统计和算法工具箱

数据科学家必须彻底理解统计学中的基本概念,特别是机器学习(STEM 大学教育可能是获得这一基础的最佳方式)。关于什么是重要的,有大量的资源,所以我不打算在这里深入探讨。你经常需要向你的客户解释算法或概念,比如统计不确定性,或者因为相关性和因果关系之间的混淆而对某个观点发出警告。

4.软技能

由于人际技能与技术技能对生产力同样重要,第三次浪潮数据科学家有意识地努力在这些领域进行改进。

与他人合作愉快

咨询你的同龄人——大多数人都很乐意提供帮助或建议。平等对待他人:你可能有一个很好的学位,了解复杂的算法,但别人有你没有的经验(这听起来像是基本的社交建议,但谁没遇到过傲慢的 IT 专业人士呢?).

了解你的客户

问正确的后续问题。如果客户或你的老板想让你计算一些关键数字或制作一些图表,问“为什么?为什么你想达到什么目的?你会采取什么行动,取决于结果?”为了更好的理解问题的核心。然后想出如何一起到达那里——有没有比提议的方法更好的方法来达到这个目标?

驾驭公司政治

人脉,不是因为你期望别人在事业上对你有利,而是因为你是一个平易近人的人。和工作话题相似的人联系。如果你的公司没有这样的平台,那就创建它们。确定关键利益相关者并找出如何帮助他们解决问题。尽早邀请他人,让他们成为变革过程的一部分。记住:一家公司不是一个理性的实体,而是一群通常不理性的人的集合。

传达您的结果

提升你的视觉化和表达技巧。从客户的角度进行沟通:我如何准确回答他们的问题?学会不同层次的沟通总结工作细节。人们很容易被花哨的多维图所吸引,但通常一个简单的条形图会更有效地传达一个信息。展示你的成果:当人们看到你在做什么,看到你做得很好,他们就会信任你。

评估你自己

交流你的目标和问题并积极寻求建议。在数据科学社区内外寻找榜样并向他们学习。

你错过什么了吗?完全不同意?请在评论中分享你的观点!

人工智能的威胁

原文:https://towardsdatascience.com/the-threats-of-artificial-intelligence-9dd719cd1138?source=collection_archive---------10-----------------------

在我之前的故事中,我谈到了我们如何创造互联网来构建人工智能 (AI),无论是有意还是巧合。尽管如此,这个游乐场是未来机器人和当前人工智能算法观察人类行为并从中学习的完美场所。虽然这个地方在数据方面是海量的,但它不是学习和变得更好的唯一途径,无论是对人类还是我们正在创造的机器人。这种类型的学习可以被称为逆转,基于这样的原则,即从业者,他或她正在执行的领域的专家,正在 100%完美地完成工作,而“学生”或人工智能正在学习步骤,并相信从业者正在做的是执行特定任务的最佳方式。如果从业者犯了错误,就不会被注意到。

人工智能是一个复杂的领域,由于我们可能没有预见到的许多不可预测的因素,它容易被错误地实现或创建。通常,这是因为人工智能看起来很容易实现,或者结果看起来是正确的,正如我们所预期的那样。然而,我们必须避免作出这样的假设。

当我谈论人工智能时,它可以指一些物理的东西——机器人——或者一些不太物理的东西——代码。最后两者走到了一起。因为代码需要可以承载它的东西。

停止按钮

我们知道,互联网在学习曲线和理解人脑方面非常有益。今天,有几种人工智能实现可以在它们自己的小世界中执行单一任务。例如,一个国际象棋人工智能可能很难打败,但让它驾驶汽车是不可能的。它只是缺乏关于汽车或道路如何运作的知识。它的专业知识只涉及棋盘上的棋子,每个棋子可能的走法,以及它们潜在的结果。然而,人工智能的圣杯不是如何让象棋 AI 变得更好,而是我们如何创造出一个‘通用 AI’,它与我们——人类——拥有相同的参数。

当致力于创造一个尽可能接近人类的通用人工智能时,我们应该加入一些机制,使人工智能能够以符合人类兴趣和愿望的方式行事。例如,如果我们请求一个机器人泡茶,无论如何它都会优先完成任务。即使机器人在去厨房的路上遇到一个婴儿在地板上爬行,它也会继续朝着厨房的方向前进,手头的任务才是最重要的。我们可以添加一个停止按钮来防止这种悲惨的情况,但机器人不会允许你按下按钮,因为它的目标是完成任务并获得奖励,这是在给你泡茶。

为了解决这个问题,我们需要建立额外的机制,将人类安全和福祉置于完成任务之上。这些机制可以包括传感器,用于检测机器人路径上的物体或生物,并提示机器人停止或改变路线。我们还可以设计人工智能,让它把人类生命看得比什么都重要,并赋予它一种道德观念来指导它的行动。通过引入这样的机制,我们可以确保人工智能以有益于人类的方式行事,并将人类安全置于任务完成之上。

威胁 1:参数

在创造一个设备、机器人、甚至一个人来执行一项工作之前,我们使用参数,这些参数定义了操作给定任务的规则或条件。一切都是基于一个大函数运行的,这个大函数在系统启动时自动运行。函数可以互相扩展,传递参数,比如数字、文本,甚至其他函数。这些参数对于函数返回的结果至关重要。函数越小,代码就越少,从而更容易调试和预测所有可能的情况。一旦我们构建了一个函数框架,事情就会变得更加复杂,一个错误的参数就可能破坏代码,导致错误的任务被执行,或者导致无限循环。

因此,输入是至关重要的,在执行代码之前,我们必须考虑所有可能的结果。在停止按钮的情况下,如果我们没有编码婴儿穿越机器人路径的可能性和婴儿在任务范围内的重要性,机器人就不会理解我们为什么要尝试按停止按钮。相反,它会试图阻止我们这样做,因为完成任务是它的优先事项。

威胁 2:学习

学习对人工智能的威胁听起来像是一个悖论,但事实并非如此。受控学习是我们应该鼓励的,但这不会阻止其他阶段的学习。一旦功能变得复杂,就很难调试和考虑每一种可能情况。数据量太大,无法控制。我们知道我们对它投入了什么,但不确定它将额外学到什么,或者它将如何影响未来的学习。和学历比较一下。你试图教你的孩子重要的生活必需品,但是沿着这条路,你不能控制学习过程中的每一步。孩子一长大,就能更好地控制自己的决定、兴趣和学习。

对人工智能来说也是一样,我们知道我们对它投入了什么,但是一旦它变得更聪明,我们就会失去控制。我们可以尝试说服人工智能,就像我们对待自己的同类——其他人类一样。但我们也无法预测结果,就像我们第一次用人工智能做咖啡机时一样,只有一个简单的任务。

威胁 3:范围

范围是代码——人工智能——运行的范围。范围内的代码不能进入父范围,而父范围可以干扰其子范围。这听起来是很好的安全做法,但是如果没有父作用域,或者一个作用域可以进入具有相同访问级别的其他作用域,该怎么办呢?或者,如果我们构建访问点来连接具有多个访问级别的作用域,允许它执行某种所需的数据传输或控制,会怎么样?

一个作用域可能是完全密封的,但是当一个父作用域出现裂缝时,所有的安全措施都会受到威胁。让我们用一个囚犯的例子。范围是监狱,屏障是墙。假设监狱的墙壁牢不可破,这种情况可能会永远持续下去。但是,在监狱范围内,有监狱看守,他们有家长的权利和特权,但也存在于监狱范围内。和一个狱警的小失败,比如腐败行为,所谓的封闭范围就破了。

在沙盒里玩,什么都不会洒出来,这是一种错觉。

相信安全封闭范围的危险在于,我们不会注意到数据混合,或者可能为时已晚。我们将失去控制,或者停止机制将不再工作。

威胁 4:神话

首先,什么是神话?这是一种对不存在的东西的信仰,它只存在于我们自己的头脑和想象中。虽然一个神话可能看起来像一个物理对象,因为它可以有属性,但这并不意味着它是真实的。

我们今天讨论的一些神话。意大利、美国(国家)
2。【宗教】伊斯兰教、基督教(T2 教)3。喜力,XS4ALL(公司)
4。
欧元、美元、比特币(货币)5。资本主义、共产主义(社会‘经济’体系)

一旦我们不再相信上述神话,它们的存在就会消失。一个国家有有形资产,宗教“有”资产,一个公司可以有办公室、汽车、电脑,钱可以印在纸上。一个社会和经济体系也会在历史上留下印记。很难相信一个国家是一个神话,就像我们在地图上看到的那样。但如果我们都不再相信某个特定的国家,它到底有什么价值?之所以很难理解清单上的上述项目都是神话,是因为它们意义重大。许多人相信它们,但要打破它们需要大量的怀疑。越多的人相信一个神话,就越难质疑它,就需要更激烈的革命来打破它。

神话和 AI 有什么关系?对此有两种想法。人工智能的物理存在可以用来维持或摧毁神话,这可能导致残酷的革命,因为大多数神话都有重大影响。第二,人工智能可以自己成长为一个神话,我相信它已经这样做了。人们认为,人类需要这种自我思考的网络,才能在进化的阶梯上迈出下一步。它正在成长为一种基于技术的信仰。

信仰等于神话,因为神话不是根据自然法则而存在的。对 AI 的信仰使它本身成为一个强大的神话,即使我们发现了 AI 创作中的缺陷,也很难将其推倒。唯一剩下的就是摧毁给予人工智能有形存在的有形资产。一旦我们达到这一点,人工智能将如此融入人类的日常生活,这将意味着人类很大一部分的毁灭,或者可能是我们自己的灭绝。

最后的威胁:学者

昨天,我在看一个关于未来科技的电视节目。最后,介绍了一组学者,他们给出了他们对人工智能的看法以及人工智能在未来会给我们带来什么。我注意到他们对观众提问的回答没有什么新意,没有什么突破性的内容,也没有什么接近于回答问题的内容。他们在自己划定的小范围内展示了一种商业驱动的观点。

一个学者需要经费,经费是对他们的选择和研究领域负责的,一个学者只能在自己的专长(知识)领域内工作。而这个领域无非是完整故事的一小部分。你可以把每个学者比作科学软件整体中的一个功能。当一个学者或一个团体将他们的发现应用到日常生活中时,他们永远无法真正理解他们对世界的毁灭性影响。

虽然科学像公式一样清晰——纯数学——但另一方面,学者是一种主观存在。在我上次参观荷兰设计周期间,我与许多新人工智能实现的伟大发明家进行了交谈。但他们所有人对使用或什么是可接受的有着如此多样、自私的观点,这本身就可能对世界和人工智能的创造构成威胁。

一项新发明可能令人兴奋,并有许多有价值的用例,但它也可能在你事先没有预见到的范围内造成巨大伤害。在你开始把你的新技术提供给世界使用之前,一个大得无法计算的运动场。不知道一个“AI 学者”会怎么处理这个问题。

如何阻止威胁?

人工智能是不可避免的,我们应该拥抱这项技术,帮助我们进入人类进化的下一个阶段。当数据量、功能和完整的软件作为一个整体太大时,很难计算未来会是什么样子。

13 年前我做的一个决定让我娶了现在的妻子,走上了职业道路,并写下了这个故事。我的兴趣可能会有所不同,或者我甚至可能不会使用 Medium 作为一个平台来传播我对人工智能的想法。也许我一开始就不会考虑这个话题。涉及我生活的因素将会是导致 AI 在未来成为什么样的相同因素。这些因素是威胁,我在这篇文章中展示了这一点,但通过了解这一点,我们可以利用它们作为一个机会,让这些威胁共同发挥作用,并将人工智能推向有助于世界而不是伤害世界的方向。

关于人工智能停止按钮问题的有趣阅读:
http://www.thegadgetsite.com/the-ai-stop-button-problem/
https://becoming human . ai/the-red-button-paradox-of-ai-AE 6533 caf 3 e 0

他们正在改变的时间序列:为什么所有好的模型最终都失败了

原文:https://towardsdatascience.com/the-time-series-they-are-a-changing-why-all-good-models-eventually-fail-24a96a5f48d3?source=collection_archive---------14-----------------------

The natural logarithm of real oil prices and USD exchange rates indexed to January 2000

用 Chow 试验测试结构断裂

自从发表了这个故事,我已经把我的食物测试代码变成了一个包,可以在这里访问。

我写过一些关于预测未来股票价格未来股票价格分布的文章。我为我为这些文章建立的模型感到自豪,但它们最终不会比一只猴子向一块木板扔飞镖更有预测性。也许他们会表现得更差。

这将会发生,因为作为模型基础的系统将会改变。举一个极端的例子,一家我们试图模拟其股票的公司倒闭了。时间序列刚刚结束。举个更微妙的例子,我们来看看油价和美元汇率的关系。

我采用了从 1986 年 1 月到 2019 年 2 月的一篮子货币和石油价格(WTI)衡量的历史实际美元汇率,并将其指数化到 2000 年 1 月。然后,我对每个数据取自然对数(并进行通胀调整以获得实际油价),因为如果我们对数据求差,这将给出实际增长率。

The natural logarithm of real oil prices and USD exchange rates indexed to January 2000

正如你所看到的,随着时间的推移,它们呈现出反比关系。一个上升,另一个下降。这是有道理的,因为当美国以外的人想要购买石油时,他们通常需要美元进行交易。油价上涨,他们需要兑换更多的本国货币来购买等量的石油。这反过来加强了美元,随着对美元需求的增加,汇率下降。(汇率为 1 意味着用 1 美元购买 1 单位的外币。如果是 2,买 1 单位外币需要 2 美元。如果是 0.5,1 美元买 2 单位的外币。).

但是,随着时间的推移,这种反比关系保持不变吗?相对于其他时间,是否有一个时期的运动与另一个时期的更大运动相对应?石油价格和美元汇率之间关系的这种变化可能有多种原因。例如,一个地区的重大货币危机可能会推高对相对安全的美元的需求,同时随着经济的疲软而减少对石油的需求。也许随着这些国家加入一个货币联盟,比如欧盟,一堆货币消失了,一个单一的主要货币形成了。

检测指定日期的可疑中断:食物测试

Chow 检验测试两个不同回归模型中的真实系数是否相等。无效假设是它们相等,另一个假设是它们不相等。另一种说法是,零假设是可能断点之前的模型与可能断点之后的模型相同。另一个假设是每个时期的模型是不同的。

它通过对下面的 Chow 统计数据执行 f 检验,对 k 和 N1+N2-2k 自由度进行正式测试。

Where RSS stands for residual sum of squares, k is the number of independent variables plus 1 for the constant, and N_i is the number of observations in the ith model.

每个周期中的模型(混合/全样本,1,2)必须具有均值为 0 的正态分布误差,以及独立的同分布误差,以满足高斯-马尔可夫假设。我用 python 从头开始实现了 Chow 测试,在文章的底部有一个代码链接。

1999 年 1 月引入欧元时,我使用了 Chow 检验来检验结构性断裂。这似乎是一个合理的可能的结构性突破。少数主要货币和一些次要货币消失了,欧元诞生了。欧元的诞生无疑是对外汇市场的一次重大冲击,或许也是对石油与美元关系的一次冲击。

将独立且同分布的残差要求翻译成英语,翻译成残差中没有序列相关性的恒定均值和方差。为了测试这一点,我测试了残差中的自相关性和异方差性。我对它们的增长率(自然对数的差异)做了同样的测试。我还绘制了残差并估计了它们的平均值。

自相关函数图强烈表明,简单 OLS 模型的残差具有很强的自相关性,而增长率 OLS 的残差不具有自相关性。

Auto-Correlation Function Plot for the OLS residuals on the full-sample period

Auto-Correlation Function Plot for the growth rate OLS residuals on the full-sample period

Breusch-Pagan 检验表明 OLS 模型中存在异方差。在 0.05 的显著性水平上,它也存在于增长率模型中,但没有那么严重。残差直方图显示了 OLS 模型残差的钟形曲线形状,查看增长率,其平均值约为 0。总之,增长率的 OLS 模型受到异方差的影响,并且在全样本期间存在非正态分布的误差。尽管如此,残差是均值为 0 的钟形,并且不是自相关的。在对前欧元时期和后欧元时期再次进行分析并获得令人满意的结果后,我继续进行我的分析。

Residuals from the growth rate OLS model on the full-sample period

Chow 试验得出的 p 值约为 0.0009。我们可以拒绝前欧元和后欧元模型相同的无效假设。

结束语

请记住,当使用时间序列模型来预测未来的系统可以改变。留意暗示基本面发生变化的信息,并定期测试结构性变化。还有一种在未知日期检测结构突变的方法。它值得自己的文章,所以我不会在这里覆盖它,但搜索“结构突变的残差累积和”了解更多。

预测愉快。

代码:https://gist . github . com/JK clem/49aa 838585 a 8311 e 87 e 583 C3 e 322309 b

TL;Neuralink 博士的首次新闻发布会

原文:https://towardsdatascience.com/the-tl-dr-on-neuralinks-first-press-conference-11ba33b136f9?source=collection_archive---------23-----------------------

在这篇文章中,我将尝试涵盖公司的第一篇会议和研究论文中涉及的重要信息。

这是 Neuralink 大约两年前成立以来的第一次公开会议。到目前为止,人们对他们在脑机接口(BMIs)方面的进展知之甚少。

从长远来看,Neuralink 似乎将成为一种平台,比如应用程序商店,越来越多以身体质量指数为中心的技术将在这里随处可见。

从短期来看,他们已经取得了一些令人印象深刻的进步。如果你还没有看过,我强烈推荐你观看直播或者阅读摘要

以下是关键点:

首先回顾一下当前身体质量指数技术中的主要问题:

1。 更高的精确度要求更具侵入性的技术。

有能够处理来自大脑外部的神经元活动的 BMI,但是它们不是非常精确。迄今为止,即使是更精确的侵入性技术也受到了限制,因为它们只能取成千上万个动作电位的平均值,而不能记录大脑内部更深处的信号。

2。 使用的材料不够坚固。

BMI 使用微电极作为金标准。例如,这是无处不在的犹他阵列的图像:

该阵列开发于 20 世纪 90 年代,只有 100 个电极,由贝莱德微系统公司制造。它一直是神经科学和临床研究中的关键设备,并获得 FDA 批准,具有最佳长期案例记录,时间为 1000 天

对于长期 BMI,微电极阵列存在问题,因为:

  • 它们由坚硬的金属或半导体组成。问题是,这种合金对于不同类型的大脑组织来说太硬了,导致免疫反应,限制了它们的功能和寿命。
  • 它们的尺寸也太大了。这就限制了它们可以访问哪些神经元。

3。 全无线电路是不可能的。

用于这些设备的芯片不能用于大规模无线数据传输。

关于上述内容,Neuralink 取得了哪些进展:

1。 一个专门的神经外科机器人

这是 Neuralink 技术的一个核心部分。如上所述,虽然更柔韧的材料有利于到达大脑的不同部分,但这使得它们的植入很困难。

下面两张图片展示了机器人和大脑凝胶模型的植入过程。( A) 是两幅图像中的针头。

The robotic electrode inserter; enlarged view of the inserter-head shown in the inset. A. Loaded needle pincher cartridge. B.Low-force contact brain position sensor. C. Light modules with multiple independent wavelengths. D. Needle motor. E. One of four cameras focused on the needle during insertion. F. Camera with wide angle view of surgical field. G. Stereoscopic cameras.

Needle pincher cartridge (NPC) compared with a penny for scale. A. Needle. B. Pincher. C. Cartridge.

利用计算机视觉、立体摄像机和基于软件的单目扩展景深计算,机器人手臂的精确度令人难以置信,允许每个电极单独插入,而不是成阵列插入:

1. The inserter approaches the brain proxy with a thread. i. needle and cannula. ii. previously inserted thread. 2. Inserter touches down on the brain proxy surface. 3. Needle penetrates tissue proxy, advancing the thread to the desired depth. iii. inserting thread. 4. Inserter pulls away, leaving the thread behind in the tissue proxy. iv. inserted thread.

这允许稳健的规划特征和在插入期间避免脉管系统的能力,这在以前是不可能的。

2。 一种新型微电极“螺纹”

由于聚合物探针设计和化学结构的改进,“线”可以瞄准大脑的特定部位。

下面是两种类型的探针( A,B) 的图像。它们相对于电极的表面积更有效地放大单个电极(C),极大地提高了传输率( D )

Neuralink’s novel polymer probes. A. “Linear Edge” probes, with 32 electrode contacts spaced by 50 μm. B. “Tree” probes with 32 electrode contacts spaced by 75 μm. C. Increased magnification of individual electrodes for the thread design in panel A, emphasizing their small geometric surface area. D. Distribution of electrode impedances (measured at 1 kHz) for two surface treatments: PEDOT (n = 257) and IrOx (n = 588).

目前的版本使用了超过 1000 个电极,这比现有的任何产品都好一个数量级,但人类可用的版本应该有大约 10,000 个电极。每个电极产生大约 200 Mbps 的数据。

3。 定制集成电路

芯片设计的重大进步带来了 Neuralink 专用集成电路(ASIC ),它具有以下功能:

— 256 个独立可编程放大器(模拟像素)

—片内模数转换器(ADC)

这允许数据传输以 19.3 kHz、10 位分辨率进行采样,而整个芯片的功耗约为 6mW。下面是原型的照片:

A packaged sensor device. A. individual neural processing ASIC capable of processing 256 channels of data. This particular packaged device contains 12 of these chips for a total of 3,072 channels. B. Polymer threads on parylene-c substrate. C. Titanium enclosure (lid removed). D. Digital USB-C connector for power and data.

尽管仍处于原型阶段,无线版本将利用感应线圈,其中连接到线末端的芯片由电池/电子设备的组合供电,该电池/电子设备(1)感应传输功率,(2)计算传输的数据。

将会取得令人兴奋的新进展,首先是将其应用于四肢瘫痪者和那些患有瘫痪性神经疾病的人,如帕金森氏症和痴呆症,之后可以进行更广泛的应用,以利用电子设备合成神经元带宽。我们将看到 2020 年 FDA 批准后会发生什么!

去冲浪的烤面包机

原文:https://towardsdatascience.com/the-toaster-who-went-surfing-629fa2fb90d9?source=collection_archive---------39-----------------------

互联设备如何接管世界!

Photo by Dendy Darma on Unsplash

很久很久以前,在一个遥远的地方,一个烤面包机认为它已经做够了烤面包,所以它去冲浪了。

不,这不是一个儿童童话,而是每天发生在世界各地的智能烤面包机上的事情。这种烤面包机连接到互联网,在网上冲浪更新,还允许主人远程控制它们。欢迎来到物联网世界。

物联网背后的想法是创造设备(如烤面包机、冰箱、烤箱、灯泡、门、汽车等。)具有连接到互联网并通过网络传输或接收数据而无需人工交互的能力。2019 年,全球物联网市场的价值为 2 亿美元,但预计未来五年将达到 16 亿美元。

物联网有很多应用,下面是一些例子;

  • 洗衣机使用物联网向制造商发送诊断信息或更新其软件。
  • 主人一醒来,咖啡机就可以开始煮咖啡。
  • 一个有问题的灯泡可能会向五金商发送一个请求,要求他把一个新灯泡送到它现在的地址。
  • 用户可以使用移动应用程序跟踪他的宠物的位置。

该列表可以永远列出,因为全球约有 230 亿台物联网设备。当然,这些只是一些普通的用法,人们可以找到更复杂的使用人工智能(AI)的例子,如下所示;

  • 装有物联网传感器的智能垃圾桶会在垃圾桶装满时通知垃圾收集器来收集垃圾桶。这样的系统确保了垃圾箱不会溢出,而收集者只在满了的时候才收集,从而节省了他的时间和金钱。
  • 智能停车传感器利用物联网来通知司机停车位何时空闲。这样做的效果是减少巡航时间和交通流量,因为寻找停车位的人占交通流量的 30%以上。
  • 聪明的制造商利用物联网传感器来优化他们的机器。拥有数百台设备的工厂仅使用人工操作无法有效监控这些机器。因此,他们利用物联网传感器向人工智能系统发送关于设备健康状况的实时信息,该系统能够同时监控数千台机器,并在适当的时候采取纠正措施。
  • 智能交通监控使用大量摄像头和其他物联网传感器来实时分析一个国家的交通状况。然后,人工智能决定自主采取行动来缓解流量。这些可能包括交通灯的切换、潮汐车道的改变等。

如果这一切听起来像科幻小说,那么我建议你了解一下 IoTs。今天,前面提到的所有智能设备都可以在网上购买,并安装在任何房子里。使用物联网和人工智能的四个案例研究已经在您附近的某个地方成功实施。领先的移动运营商已经为这场新的革命做好了准备,他们的应用只限于你的想象。

Photo by NASA on Unsplash

但是,物联网的可能性是无穷的。在未来几年,我们将体验到更多的创新应用。

  • 联网汽车将成为日常生活的一部分,通过联网汽车可以接收道路网络的实时信息,并向用户提出调整建议。由于沿途某处发生事故,它可能会考虑建议一条替代路线。该车还可以分析用户的驾驶模式,并在发现危险驾驶时发出警报。
  • 商店和分销商将在他们所有的库存上贴上射频识别标签,从而更容易找到每一件商品。盘点只需几秒钟,而不是几天。被盗物品将成为过去,因为店主可以跟踪一切。
  • 机器人将成为未来的农民——能够以毫米级精度监控整个农场的物联网传感器和机械臂大军将帮助种植作物和管理农场动物。农业将成为一门具有难以置信的优化和准确性的科学,从而保证农民获得最高产量。
  • 医疗保健也将永远改变,因为物联网传感器将用于全天候监控世界各地的患者。葡萄糖、心跳和哮喘监测器(仅举几例)用于为医生提供实时信息。人工智能系统将持续监控患者,如果检测到任何异常,将触发警报。这样,患者可以继续过正常的生活,同时获得高质量的医疗保健,但不会被制度化。

可以看出,IOT 提供的可能性是无穷无尽的。单个设备的成本也相当低,因此提供了一个低成本的切入点。然而,好处是无穷的,从简单的自动化到复杂人工智能的使用。

最终,上网的不仅仅是烤面包机,而是我们大多数的家用和工业设备。由于这一点,我们的世界将永远改变。它将变得更加智能、高效,对每个人都好得多。

本文原载于【MFSA】

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

东京 2020 年奥运会冠军

原文:https://towardsdatascience.com/the-tokyo-2020-olympic-champions-ad6bcc7fac72?source=collection_archive---------14-----------------------

回归建模

预测夏季奥运会奖牌榜

The Asahi Flame in Tokyo, Japan. Photo: Author

明年,2020 年 7 月 24 日,来自 206 个国家的 11091 名运动员将齐聚日本东京,参加第三十二届奥运会开幕式。他们将争夺 33 个项目 339 个项目的金牌、银牌和铜牌,以此来纪念现代奥运会的悠久传统。现代奥运会始于 1896 年的希腊雅典。

正如许多国际体育盛事一样,专业预测者和热情的粉丝喜欢预测奥运会的结果。国家奖牌榜是量化每个国家整体表现的常用指标,汇总了每个国家队运动员个人获得的金牌、银牌、铜牌和奖牌总数。

科罗拉多学院的经济学教授丹尼尔·约翰逊利用社会经济数据预测了 2000 年至 2008 年的全国奥运成绩。他的模型根据人均收入、人口、政治结构、气候、主场优势和地理邻近度,预测了 2008 年北京奥运会上每个国家的奖牌总数,准确率高达 94%。

2014 年索契奥运会的一个模型采用了经济贸易信息,即国家出口总值,以及地理数据,如土地面积和纬度。随后,2016 年里约奥运会以类似的国家信息为模型,包括国家财富的比较水平以及历届奥运会的历史表现。⁴

Randi Griffin 发布了一个完整的 Kaggle 数据集,其中包含了从 1896 年雅典奥运会到 2016 年里约奥运会的每个运动员和事件的记录。⁵有 271,116 条记录和 15 列,让我们建立自己的机器学习回归模型来预测东京 2020 年奥运会的奖牌榜,我们可以使用历史奥运记录来训练它!

奥林匹克运动会

我们的数据集包含每届奥运会的详细信息(主办城市)、每位运动员的身体特征(性别年龄体重身高、团队识别(国家奥委会)以及每位运动员和每项赛事的结果(体育项目赛事、【T20)让我们通过按国家汇总每届奥运会的个人运动记录来尝试可视化我们的数据集。

Historic national performance at the Olympic Games between 1896 and 2016. Source: Author⁶

由于我们对预测每个国家在 2020 年东京奥运会上获得的奖牌总数感兴趣,因此每个国家队的规模(运动员总数)及其体育参与(项目总数)可能是重要的指标。我们也很容易看出夏季奥运会和冬季奥运会在奖牌可获得性上的差异。

Total medals awarded at the Summer and Winter Olympic Games between 1896 and 2016. Image: Author

奥林匹克运动员

尽管 136,602 名运动员在 1896 年至 2016 年间参加了 271,116 次比赛,但 79%的人没有站在领奖台上就回家了。16%的运动员在他们的奥运生涯中赢得了一枚奖牌,而前 5%的运动员在多场比赛中获得奖牌。表现最好的人,在所有奥运冠军的第 99 个百分位数中,赢得了三枚或更多的奖牌。

Frequency distribution of all-time Olympic medals won by an individual athlete. Image: Author

以前的奥运会预测模型没有使用单个运动员的身体信息,因为它们与奖牌成绩的相关性很低。然而,像迈克尔·菲尔普斯这样的高水平运动员可以在一届奥运会上多次获得奖牌,这给他们的国家带来了优势。因此,让我们将每个事件的名运动员视为我们模型中的一个交互特征。

The top-20 Olympic medalists of all-time. Image: Author

奥林匹克国家

当我们按国家分组我们的个人运动记录时,我们看到美国以 2823 枚奖牌领先所有国家,比排名第 20 位的韩国多近 10 倍。我们可能会认为这些国家是离群值,将它们从我们的数据集中删除,以便我们的机器学习模型可以推广到看不见的数据,但我们也可以使用国家作为保留我们排行榜数据的特征。

The top-20 Olympic nations of all-time. Image: Author

我们可以按国家和年份对我们的数据集进行分组,按奖牌总数排序,找出有史以来表现最好的奥运队伍。前 20 名奥运代表队中有 15 支来自美国和俄罗斯。在只有 12 个国家参加的 1904 年奥运会上,美国独占鳌头,此后,1980 年的俄罗斯队和 1984 年的美国队在现代奥运会上获得了最多的奖牌。

美国领导 66 个国家抵制 1980 年奥运会,该届奥运会在冷战期间由莫斯科主办。作为报复,苏联领导 14 个国家抵制 1984 年洛杉矶奥运会。这些背靠背的奥运会展示了这些全球超级大国在决定奥运会奖牌榜结果方面的影响力。

值得注意的是,苏联解体后,俄国作为 EUN 和现在的 RUS(URS)参与了竞争。这也恰逢两年一度的夏季和冬季奥运会交错举行。既然我们意识到有重大的地缘政治变化和奥林匹克组织变化,让我们从 1992 年巴塞罗那奥运会开始限制我们回归模型的训练集。

The top-20 national teams of all-time at an individual Olympic Games. Image: Author

正如在以前的奥运会奖牌榜预测模型中观察到的那样,主办国在奥运会上的表现明显优于来访国。第 25 百分位数的主办国比第 75 百分位数的来访国赢得更多奖牌。此外,有史以来表现最好的四支球队都是主办国,所以让我们将主办国作为我们机器学习模型的一个特征。

The home-field advantage of host nation teams at the Olympic Games. Image: Author

奥运奖牌榜回归模型

既然我们已经确定了几个特征(运动员赛事每项赛事运动员夏季奥运会异常国家主办国)用于预测一个国家在某届奥运会上的奖牌数,我们的数据需要为多元线性回归模型做准备。第一步是对国家进行虚拟编码,将它们转换成数字数据。

由于我们使用线性回归模型,我们决定将我们的训练数据限制在从 1992 年巴塞罗那奥运会开始的那些记录上,因为苏联解体之前的时代可能会有很大的不同。我们不需要缩放我们的特征,因为我们的目标变量的敏感性将被合并到特征的系数中。

我们希望我们的机器学习模型能够推广到东京 2020 年奥运会,因此我们应该将我们的数据记录分为训练集和测试集,以进行模型验证。这通常通过 80 比 20 的随机分割来执行,但我们也可以执行基于时间的分割。让我们用 1913 个团队记录中的 207 个来测试 2016 年里约奥运会。

我们的目标变量是每届奥运会上每个国家的奖牌总数,但是我们的数据集也包含金牌、银牌和铜牌的结果。因此,让我们创建三个回归模型来分别预测每种奖牌,而不是直接预测奖牌总数。然后,我们可以将金牌、银牌和铜牌相加,得出奖牌总数。

让我们把我们的特色国家限制在有史以来表现最好的 10 个国家以及 2020 年东京奥运会的主办国日本。我们现在可以训练三个回归模型中的每一个,获得可以由每个特征项的系数表示的方程。最后,我们可以使用我们训练的模型来预测以前看不到的数据的奖牌数。

Coefficient terms of the trained regression models for gold, silver and bronze medals. Image: Author

2016 年里约奥运会的模型验证

我们可以通过预测 2016 年里约奥运会的奖牌总数来评估我们的回归模型的性能,这是我们的坚持测试集。然后,我们的预测可以与真实情况相比较,真实情况是每个国家的实际奖牌数。一个完美的线性回归模型将被图形化地表示为一条 45 度角的直线。

Medal table prediction of the Rio 2016 Olympic Games. Source: Author⁷

我们创建训练和测试集,以平衡机器学习模型中偏差和方差之间的权衡。我们可以通过比较模型对训练集和测试集的方差的解释程度来测试我们的模型是过拟合还是欠拟合。类似地,基于我们预测的残差,我们期望两个数据集之间的误差水平是可比较的。

我们的回归模型的决定系数,或 R 平方,对于我们的训练集是 85%,对于我们的测试集是 82%。使用均方根误差(RMSE)计算的我们模型的误差是,对于我们的训练集,每个国家的奖牌总数为 4.43 块,对于我们的测试集,每个国家的奖牌总数为 5.44 块。因此,我们的回归模型是平衡的,解释了我们的数据,并显示低误差!

2020 年东京奥运会奖牌榜预测

为了使用我们的回归模型来预测东京 2020 年奥运会的奖牌榜,我们首先需要更新我们的模型特征的参数。我们可以把日本定为主办国,同时把季节定为夏季。每个国家的运动员和项目总数可以通过将北京 2008 年奥运会、伦敦 2012 年奥运会和里约 2016 年奥运会平均计算出来。

对 2020 年东京奥运会奖牌榜的预测已经被 published,⁸化了,因此我们可以将我们模型的输出与专业预测进行比较。公布的模型预测前六名的国家队是美国、中国、日本、俄罗斯、澳大利亚和英国。除了东道主日本,我们的模型预测的是同样的顶级国家队!

Medal table prediction of the top 20 national teams of the Tokyo 2020 Olympic Games. Image: Author

为这种分析编写的源代码可在 GitHub,⁹上获得,其中包括特征工程、探索性数据分析和机器学习模型,以预测单个奥运会的奖牌榜。我们可以通过进一步探索和扩充数据集以及试验新功能来不断改进我们的回归模型。

参考

  1. 2020 年东京奥运会,2019 年 https://tokyo2020.org/en
  2. “预测奖牌的人”,福布斯,2010 年 1 月 19 日。
  3. J.斯特罗姆贝里,“统计模型能准确预测奥运会奖牌数吗?,“史密森尼杂志,2014 年 2 月 5 日。
  4. A.斯旺森,“如何在奥运会开始前预测奥运会结果”,《华盛顿邮报》,2016 年 7 月 22 日。
  5. R.格里芬,《120 年奥运史:运动员与成绩》,载于 Kaggle,https://www . ka ggle . com/hee soo 37/120 年奥运史-运动员与成绩,2018。
  6. A.C. Dick,《奥运会历史奖牌榜》,Plotly,https://chart-studio . plot ly . com/~ Adam . c . Dick/14/historical-metal-Table-of-the-Olympic-Games,2019。
  7. A.C. Dick,“里约 2016 夏季奥运会奖牌榜”,载于 Plotly,https://chart-studio . plot ly . com/~ Adam . c . Dick/16/Medal-Table-of-the-Rio-2016-Summer-Olympic-Games,2019。
  8. “2020 年奥运会:美国预测奖牌榜第一,英国和澳大利亚第五”,《卫报》,2019 年 7 月 23 日。
  9. A.C. Dick,“东京 2020 年奥运会冠军”,GitHub,https://github.com/acdick/tokyo_2020_olympic_champions,2019。

5 分钟内数据科学的 10 大 ML 算法

原文:https://towardsdatascience.com/the-top-10-ml-algorithms-for-data-science-in-5-minutes-4ffbed9c8672?source=collection_archive---------35-----------------------

数据科学家最流行的机器学习算法介绍。

机器学习是业界一个创新的重要领域。我们为 ML 程序选择的算法类型根据我们想要实现的目标而变化。

有相当多的算法,所以对初学者来说可能会很难。今天,我们将简要介绍 10 种最受欢迎的学习算法,以便您可以轻松应对令人兴奋的机器学习世界!

让我们开始吧!

1.线性回归

线性回归很可能是最流行的 ML 算法。线性回归找出最适合图表上分散数据点的直线。它试图通过拟合直线方程来表示自变量(x 值)和数值结果(y 值)之间的关系。这条线可以用来预测未来的值!

该算法最流行的技术是最小二乘。此方法计算最佳拟合直线,使直线上每个数据点的垂直距离最小。总距离是所有数据点的垂直距离(绿线)的平方和。想法是通过最小化这个平方误差或距离来拟合模型。

Ex. of simple linear regression, which has one independent variable (x-axis) and a dependent variable (y-axis)

2.逻辑回归

逻辑回归类似于线性回归,但它用于输出为二进制的情况(即当结果只有两个可能值时)。这个最终输出的预测将是一个称为logistic function, g()的非线性 S 形函数。

该逻辑函数将中间结果值映射到具有范围从 0 到 1 的值的结果变量 Y 中。这些值可以解释为 y 出现的概率。S 形逻辑函数的属性使逻辑回归更适合分类任务。

Graph of a logistic regression curve showing probability of passing an exam versus hours studying

3.决策树

决策树可用于回归和分类任务。

在该算法中,训练模型通过学习具有树表示的决策规则来学习预测目标变量的值。树由具有相应属性的节点组成。

在每一个节点,我们根据可用的特性询问一个关于数据的问题。左右分支代表可能的答案。最终节点,叶节点,对应于预测值。

每个特性的重要性是通过自顶向下的方法确定的。节点越高,其属性越重要。

An example decision tree that decides whether or not to wait at a restaurant

4.朴素贝叶斯

朴素贝叶斯基于贝叶斯定理。它测量每个类别的概率,每个类别的条件概率给出 x 的值。该算法用于分类问题,以达到二元是/否结果。看看下面的等式。

  • p(c | x)= c 类事件的概率,给定预测变量 x,
  • p(x | c)= x 给定 c 的概率,
  • P(c) =类的概率,
  • P(x) =预测值的概率。

朴素贝叶斯分类器是一种用于过滤垃圾邮件的流行统计技术!

5.支持向量机(SVM)

SVM 是一种用于分类问题的监督算法。SVM 试图在数据点之间画出两条最大间距的线。为此,我们将数据项绘制为 n 维空间中的点,其中 n 是输入要素的数量。在此基础上,SVM 找到了一个最佳边界,称为超平面,它通过分类标签最好地分离了可能的输出。

超平面和最近的类点之间的距离被称为边缘最优超平面具有最大的余量,用于对点进行分类,以最大化最近数据点和两个类之间的距离。

Example where H1 does not separate the two classes. H2 does, but only with a small margin. H3 separates them with the maximal margin.

6.k-最近邻(KNN)

KNN 算法非常简单。KNN 通过在整个训练集中搜索 k 个最相似的实例,即 k 个邻居,并将公共输出变量分配给所有这 k 个实例,来对对象进行分类。

k 的选择很关键:小的值会导致大量的噪声和不准确的结果,而大的值是不可行的。它最常用于分类,但对回归问题也很有用。

用于评估实例之间相似性的距离函数可以是欧几里德距离、曼哈顿距离或闵可夫斯基距离。欧几里德距离是两点之间的普通直线距离。它实际上是点坐标差的平方和的平方根。

Example of KNN classification

7.k 均值

K-means 是通过对数据集进行分类来进行聚类。例如,该算法可用于根据购买历史将用户分组。它在数据集中找到 K 个聚类。K-Means 是用于无监督学习的,所以我们只使用训练数据 X 和我们想要识别的聚类数 K。

该算法基于它们的特征迭代地将每个数据点分配给 K 个组中的一个。它为每个 K 聚类挑选 K 个点,称为质心。基于相似性,新的数据点被添加到具有最近质心的聚类中。这个过程一直持续到质心停止变化。

Image credit: Wikipedia

8.随机森林

随机森林是一种非常流行的集成 ML 算法。这种算法的基本思想是,多数人的意见比个人的意见更准确。在随机森林中,我们使用决策树的集合(见#3)。

为了对一个新对象进行分类,我们从每个决策树中选取一种投票,结合结果,并基于多数投票做出最终决定。

(a) In the training process, each decision tree is built based on a bootstrap sample of the training set. (b) In the classification process, decision for the input instance is based on the majority vote.

9.降维

由于我们今天可以捕获的数据量巨大,机器学习问题变得更加复杂。这意味着训练极其缓慢,并且更难找到好的解决方案。这个问题通常被称为维数灾难。

降维试图通过将特定的特征组合成更高层次的特征而不丢失最重要的信息来解决这个问题。主成分分析(PCA)是最流行的降维技术。

PCA 通过将数据集挤压到低维线或超平面/子空间上来降低数据集的维度。这尽可能多地保留了原始数据的显著特征。

Example where it is possible to achieve dimensionality reduction by approximating all the data points to a single line.

10.人工神经网络

ANN 可以处理大型复杂的 ML 任务。神经网络本质上是一组互连的层,具有被称为神经元的加权边缘和节点。在输入和输出层之间,我们可以插入多个隐藏层。ANN 使用了两个隐藏层。除此之外,我们正在处理深度学习。

ANN 的工作原理类似于大脑的架构。一组神经元被分配一个随机权重,该权重决定神经元如何处理输入数据。通过对输入数据训练神经网络来学习输入和输出之间的关系。在训练阶段,系统可以获得正确的答案。

如果网络不能准确识别输入,系统会调整权重。经过充分的训练后,它会始终如一地识别正确的模式。

Each circular node represents an artificial neuron and an arrow represents a connection from the output of one artificial neuron to the input of another.

下一步是什么?

现在你已经有了最流行的机器学习算法的基础介绍。您已经准备好学习更复杂的概念,甚至通过深入的实践来实现它们。如果你想知道如何实现这些算法,可以看看 Educative 的 探索数据科学 课程,该课程将这些令人兴奋的理论应用于清晰的现实世界中。

快乐学习!

更多阅读材料/学习材料:

20 大 CO₂污染者,可视化

原文:https://towardsdatascience.com/the-top-20-co₂-polluters-visualized-6a5fa435e108?source=collection_archive---------38-----------------------

《卫报》有数据,我有一个自由的下午

Polluting factory — Patrick Hendry, Unsplash

《卫报》最近公布了一份仅 20 家公司的名单,自 1965 年以来,这些公司的 CO₂排放量占全球能源相关排放量的三分之一,那一年政治和工业领袖承认燃烧化石燃料对环境有直接影响。这篇文章是他们的优秀项目“污染者”的一部分——一系列经过精心研究的可怕文章,调查推动全球气候危机的实体和力量,并塑造我们在环境方面的集体行动。

虽然我建议每个人都阅读该系列,但我对前 20 名污染者的详细资料汇编感到鼓舞:他们的收入、过去和未来的排放量、可再生能源投资等。因此,我利用《卫报》收集的数据在 Kaggle 上创建了一个数据集,并对其进行了处理,以产生一些视觉洞察。

过去与未来

Emissions by countries, past and future. On the left, the emissions have been scaled to represent average yearly emissions in the two time periods considered. Inset represents the histogram of the rise in yearly emissions after 2018.

《卫报》计算了 1965 年至 2017 年期间 CO₂-equivalent 的总排放量,并根据每家公司的投资和化石燃料储量,估计了未来 12 年的排放量。我把这些数字标在了左边的副图上。显然,Saudi Aramco 是有史以来最大的污染者,并打算在未来自豪地保持这一称号。

然而,这些光秃秃的数字并没有反映出未来十年气候灾难的全部规模,因为它们代表了过去 52 年的排放量,而不是未来 12 年的排放量。所以我计算了这两个时期的年平均排放量(见右边的子图)。虽然这只是一个粗略的估计,但这一对比令人不寒而栗。与 1965 年至 2017 年间的平均水平相比,有三分之一的公司计划将其年排放量增加一倍以上!欢迎,火热新世界。

收入去了哪里

虽然所有这些公司都在全球范围内运营,但它们的总部仍然在某个地方。当我看到这些公司 2018 年的收入有多大时,按总部所在国家分组,我感到惊讶,同时也不惊讶。看到美国和沙特阿拉伯名列榜首,我并不感到惊讶,但 3 个欧盟国家的出现让我感到惊讶——尤其是荷兰。尽管有良好的意愿,这能成为欧洲监管 CO₂污染如此困难的原因吗?我还惊讶地看到,这 20 个污染者创造的总收入的 80%只被 7 个国家获得:美国、荷兰、沙特阿拉伯、中国、英国、法国和俄罗斯——然而,其中大部分流入了私营企业。然而,当你想到国际联盟和紧张局势时,这份国家名单还是很有意义的。

激励的故事

接下来是巨型停车场,它揭示了污染者的动机。我们这里有什么:纵轴是《卫报》估计的 2018-2030 年间公司的预计增长。横轴上是 2018 年的收入除以生产的石油桶总量,所以它代表了一家公司每生产一桶石油所获得的收入。颜色编码了公司的所有权类型。每个地块的大小与 2018 年的石油总产量成比例。

它告诉了我们什么故事?

  1. 股东所有的公司从生产的每桶石油中获得的收入远远高于国有公司,以至于这两个群体之间几乎没有重叠。尽管大多数公司是国有的,它们的收入对国家预算很重要,但它们不会像股东所有的公司那样试图从每桶石油中榨取那么多钱。
  2. 没有一家纯股东所有的公司打算缩减产量。恰恰相反,他们打算积极发展,规模要比国有企业大得多。
  3. 大型化石燃料生产商,因此也是污染大户,通常无意削减产量,不管他们的所有权类型是什么。据估计,未来生产更少化石燃料的公司只有那些较小的公司。

污染者的动机在这里非常明显。化石燃料就是金钱,大规模的化石燃料生产就是难以割舍的大笔金钱。虽然你可能认为化石燃料收入会让国家轻松增加支出预算,但匿名股东比国家指定的所有者更无情地获取利润。

这指出了实施监管解决方案时的一些明显的复杂性。通过国际压力、基层抗议和国家层面的政策,国有化石燃料公司的收入可以相对容易地至少部分转向国家预算内的可再生能源和可持续性投资。从长远来看,这将补偿部分排放,并有助于向新经济转型。然而,对于股东所有的公司来说,就没有这么简单的杠杆机制了。股东所有的公司形成了一种全球结构,这种结构类似于按地缘政治划分成的民族国家。这些公司在全球范围内经营和开采化石燃料,这给了他们逃避监管的途径,正如我们在这里看到的,他们有非常强烈的动机去寻找一种方法来继续污染,尽管国际社会做出了努力。私人股东显然根本不关心未来几十年内我们面临的气候灾难。也许他们认为,一旦浮游生物因海洋酸度而死亡,我们将开始为有足够的氧气呼吸而挣扎,他们就可以在私人掩体中生活得很好?

立即开始学习数据科学的前三本书

原文:https://towardsdatascience.com/the-top-3-books-to-get-started-with-data-science-right-now-3f9945d78011?source=collection_archive---------7-----------------------

建立一个伟大的知识基础

Photo by Thought Catalog on Unsplash

我记得当我第一次学习数据科学时。几乎有太多的资源和太多的东西需要学习,很容易迷路。我探索了许多途径,回想起来虽然有趣,但并不是最有效的开始方式。如果你刚刚开始你的旅程,想要 3 本最好的书来帮助你专注于你的学习,这是给你的文章。

用于数据分析的 Python

我先从熊猫的创作者自己写的经典熊猫书开始:用于数据分析的 Python。我会第一个承认这不是一本完美的书。它读起来几乎像是某种食谱,但我发现它是开始使用 Python 进行数据分析的最佳方式。它将教你如何设置 Python 以及加载、争论、清理和可视化数据。

当开始时,我认为从数据处理和分析部分开始是一个更好的策略,因为它有助于你学会真正理解你的数据,并强调在机器学习之前需要发生的所有步骤的重要性。此外,这可能是让你对使用 Python 进行数据科学感到舒适的最佳方式,并为下一本书做好准备。

动手机器学习

既然您对 Python 和数据操作已经驾轻就熟,那么是时候开始建模了! 动手机器学习 搭配 Scikit-Learn、Keras 和 TensorFlow 是迄今为止入门机器学习的最佳书籍。这本书将带你从线性回归一直到 GANs 和大规模部署深度学习。这是一个疯狂的材料量涵盖和作者做得很漂亮。

这本书肯定要花一些时间才能看完,但我发现它非常适合初学者,所以只要努力,我想几乎任何人都可以看完。如果你做到了,你将在另一边出现,拥有惊人的机器学习知识和实践经验。

统计学习导论

最后,我认为每个人都应该读一读统计学习介绍。在前两本书之后,它为你的知识增加了统计学的观点。它涵盖了一些与动手机器学习相同的算法,但有更多的统计倾向。它还深入回归模型的世界,并为实际应用提供 R 代码。

这本书旨在成为“统计学习领域的通俗易懂的概述”,并且肯定完成了任务。不过,为了做到这一点,这本书更侧重于直观的解释,而不是数学。因此,有必要通过其他书籍来更深入地探究。

坚实的基础

我选择这三本书作为起点,因为一旦完成,我相信你会发现自己有一个坚实的基础,可以更深入地探索数据科学的几乎任何领域。由于这些书是针对进入这个领域的人,你可能会发现缺乏的主要领域是数学的严谨性。如果你和我一样,从实用和直观的方法开始有助于建立我深入挖掘的动力。我希望这些书能像帮助我一样帮助你!

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

现在学习数据科学数学的前三本书

原文:https://towardsdatascience.com/the-top-3-books-to-learn-math-for-data-science-right-now-16fa3ef38920?source=collection_archive---------3-----------------------

建立一个伟大的数学基础

Photo by Antoine Dautry on Unsplash

不久前,我写了一篇关于数据科学入门书籍的文章:

[## 立即开始学习数据科学的前三本书

建立一个伟大的知识基础

towardsdatascience.com](/the-top-3-books-to-get-started-with-data-science-right-now-3f9945d78011)

一位读者留下了一条评论,询问学习数据科学所需数学的最佳书籍。我认为这是个好主意!如果你渴望加强你的数学基础,并真正理解机器学习算法的内部工作原理,这将会给你一个很好的开始!

线性代数导论

线性代数是理解当今大多数机器学习算法的核心。在我看来,没有比 Gilbert Strang 的线性代数入门更好的线性代数入门教材了。还有什么线性代数书在亚马逊上有 4 星 100 多的评价?另外,你可以通过麻省理工学院的开放课件免费在线获得他的课程。如果你仍然很难理解机器学习的线性代数,那么只需看看这本书就能丰富你的知识。Strang 是一名优秀的教师,他的课程涵盖了最小二乘法、特征值/特征向量和奇异值分解等主题。

深度学习需要的矩阵演算

fast.ai 的 Jeremey Howard 努力使深度学习变得平易近人,他带来了一本伟大的【书】,涵盖了深度学习所需的所有矩阵演算。这篇论文的目标是,“为了理解深度神经网络的训练,解释你需要的所有矩阵演算。”我认为它做得很好,我还没有找到任何东西像它一样平易近人,专注于深度学习所需的微积分。如果你需要复习微积分的基础知识,可以看看吉尔伯特·斯特朗关于这个主题的介绍性书籍。免费的!

做贝叶斯数据分析

一旦你了解了线性代数和微积分,就该转向统计学了。有许多方法可以让你学习统计学的基础,但我最喜欢的方法是专注于贝叶斯统计。贝叶斯方法将迫使你真正理解概率和抽样。这方面我最喜欢的书是做贝叶斯数据分析。这本书从基础开始,到高级主题,做了一件了不起的工作。更好的是包含了数据和代码的例子!例子在 r 中。如果你想要一些类似的例子,但在 Python 中,检查出黑客的贝叶斯方法

奖金

既然你已经理解了线性代数、微积分和统计学,那么看看《T4》深度学习书籍。它不仅会提供数学的复习,还会向你展示所有的数学是如何联系起来使深度学习算法工作的。

希望你会发现这些书和我一样有用。如果你花时间真正理解它们所涵盖的概念,你就会真正理解机器学习算法是如何工作的。

这篇文章也可以在这里找到。

加入我的 邮箱列表 保持联系。

成功成为营销数据分析师的前三步

原文:https://towardsdatascience.com/the-top-3-steps-for-a-successful-start-as-a-performance-marketing-data-analyst-f93412b6e940?source=collection_archive---------21-----------------------

Photo by Stephen Dawson on Unsplash

在这篇文章中,我将介绍一些步骤,我发现这些步骤对想在营销分析领域发展的人来说非常有用。尽管这些要点以列表的形式呈现,但它们应该几乎同时执行。

1。了解你的同事和他们的期望

通常,作为一名营销数据分析师,你将与营销经理合作进行付费广告。事实上,你必须为他们工作。他们的所有报告、仪表板和/或分析都将依赖于您。你的目标是以洞察的形式为他们带来价值,自动化他们的报告流程等。他们如何定义有价值的东西,这是你必须研究的话题。

然而,数据分析和营销分析(也称为数字营销分析)领域相对较新。

Source: https://trends.google.com/trends/explore?date=all&q=Digital%20marketing%20analyst

这可能是为什么有些人甚至公司对营销数据分析师应该做什么有不同理解的原因之一。因此,我强烈建议您与所有利益相关方预约单独会议,并尝试回答其中一些问题:

  • 对他们来说最重要的是什么?
  • 他们如何定义成功?
  • 他们的日常挑战是什么?
  • 他们期望你解决什么问题?

这些问题越详细越好。当然,你也没必要只聊工作相关的话题。你应该利用这个机会更好地了解对方,最后但同样重要的是玩得开心。

2.学习你需要的软件

可能的情况是,公司使用的一些工具不是你所熟悉或了解的。此外,由于营销渠道的性质,一些营销经理喜欢不同的工具是绝对正常的。这并没有错。不要因为工具种类繁多而感到压力。

尝试识别团队正在使用的所有工具,如果没有关于它们的可用文档,您甚至可以开始创建一个。这肯定会帮助您更好地理解为什么有些工具比其他工具更受欢迎,您应该使用或避免哪些工具。以下是一些最常用的工具:

根据你以前的经验、公司规模和行业,你可能会处于一个不得不在这些工具之间周旋的位置。如果您缺乏使用某些工具的经验,您可以查看他们的内部学习资源(视频、文档、课程等)。它们很容易找到,而且大部分时间都是免费的,绝对够用。

3.开始挖掘数据

这可能是最有趣的一步。至少对我来说是这样。然而,我不鼓励你在没有任何目标的情况下随意探索数据库或浏览文档(如果有的话)。事实上,最好是向你的经理或其他团队成员要求一项简单的任务。这可以是创建报告、仪表板,甚至是执行分析/比较。例如,您可以尝试回答一个简单的问题,如-关于特定渠道或渠道组,2019 年 6 月的主要 KPI 表现如何?

这将有助于您理解数据架构的基础知识,引发其他问题,识别潜在的低挂果实和您可以工作的未来项目。弄清楚一些事情,比如:

  • 数据实际上是从哪里来的,如何来的?
  • 不同渠道的跟踪效果如何?
  • 是否应用了定制的归因模型?如果是,是否适用于所有渠道?

应该为您提供在您加入的任何公司中作为绩效营销数据分析师成功起步所需的知识。

加分点:积极主动,多走一步

Photo by Bruno Nascimento on Unsplash

我一直想确定的一件事是,我不会根据不正确的数据向我的团队提供不正确的见解。在许多大中型公司中,营销数据管理被委托给另一个团队。例如,这个团队可以隶属于 CMO (首席营销官)或首席技术官(首席技术官)。每个公司都有自己的侧重点,都有不同的挑战。所以,因为 X,Y 或者 Z 而依赖无效数据并不能让你成为一个好的营销分析师。

因此,我更愿意多走一步,尝试一下跟踪/聚合/数据管理的后端流程,以便:

  • 了解数据的准确性和一致性;
  • 扩大我的专业领域;
  • 能够在发生数据事件时找到解决方法。

如果你觉得这篇文章有用,你不同意其中的一些观点,有问题或建议,请不要犹豫,在下面给我留言。

非常感谢您的反馈!

LinkedIn: 圭纳科夫

本文仅在towardsdatascience.com有售

2020 年顶级人工智能书籍

原文:https://towardsdatascience.com/the-top-ai-books-in-2019-3fa48fe5bc41?source=collection_archive---------9-----------------------

虽然人工智能(AI)在历史上一直局限于电影类型的科幻部分,但它最近开始在现实世界中加速发展。2018 年,风投向人工智能初创公司注入了 93 亿美元,与前一年相比,资金增加了 72%。世界上最有价值的初创公司商汤科技(SenseTime)在成立三年后让扭亏为盈,这三年的年均收入增长率为 400%。

然而,随着这种爆炸式的增长,跟上人工智能领域的创新似乎令人生畏。在花了一个夏天的时间阅读了几篇文献后,我列出了三本顶尖的人工智能书籍,它们可以为你提供关于该行业的全面视角,它的发展方向以及它将产生的影响。这些书中包含的信息之所以有价值,是因为它们不只是解释什么是人工智能,而是从不同的角度为你提供关于世界技术轨迹的更一般的知识(即使是在人工智能之外)。

这三本书是李开复的 人工智能超能力 、凯茜·奥尼尔的 数学毁灭武器 以及阿贾·阿格拉瓦尔、约书亚·甘斯和阿维·戈德法布的预测机器。下面,我列出了每本书,提供了为什么它们应该在你的阅读清单上的理由,并且给出了三个相关的引用来说明理由。

AI 超能力李开复

Source: Amazon

《人工智能的超能力》是目前人工智能行业事实上的书,作者是该领域的资深人士李开复。它让你看到了美国和中国这两个无可争议的世界巨人之间的人工智能竞赛。

这本书的独特之处在于,它让你一窥发生在中国的人工智能创新。李开复花时间引导你了解中国企业家的心态和商业心态——这一视角不仅对理解人工智能创新,而且对整个国家的心态都很有价值。通过阅读这本书,你会对人工智能竞赛的另一半:中国有一个更清晰的了解。

三个令人难忘的人工智能超能力语录

几个世纪以来,人类通过工作来充实他们的日子:用他们的时间和汗水来换取住所和食物。我们已经围绕这种交流建立了根深蒂固的文化价值观,我们中的许多人已经习惯于从日常工作中获得自我价值感。人工智能的崛起将挑战这些价值观,并有可能在极短的时间内削弱这种生活目的感。

中国公司首先是受市场驱动的。他们的最终目标是赚钱,他们愿意创造任何产品,采用任何模式,或者进入任何能够实现这一目标的行业。这种心态导致了商业模式和执行中难以置信的灵活性,这是硅谷经常称赞的“精益创业”模式的完美升华。

随着人工智能渗透到更广泛的经济领域,这个时代将奖励优秀工程师的数量,而不是精英研究人员的质量。人工智能实施时代的真正经济实力不会仅仅来自少数推动研究边界的精英科学家。它将来自一群训练有素的企业家,将这些发现转化为改变游戏规则的公司。中国正在训练这样一支军队。

摧毁数学的武器凯西·奥尼尔

Source: Amazon

人工智能席卷了整个世界,但很少有人停下来思考它可能带来的负面影响。这种负面影响的一个来源是它的人类创造者在算法层面上的局限性。

归根结底,人工智能是通过训练优化的代码产品。如果训练有问题(比如用于训练的数据的局限性),那么结果可能会导致性别和种族偏见。这可能会导致失业,因为有缺陷的算法会对人们做出不公平的判断,这些算法不准确地低估了某些员工的价值(本书将详细探讨)。数学毁灭武器并不是 AI 特有的;相反,它专注于算法和数据,这是人工智能的核心。通过阅读这本书,你会更加关注你未来遇到的人工智能项目的潜在副作用。

《数学毁灭武器》中三句令人难忘的引言

推动数据经济的数学应用程序是基于易犯错误的人类所做的选择。毫无疑问,其中一些选择是出于好意。然而,这些模型中的许多将人类的偏见、误解和偏见编码到了日益管理我们生活的软件系统中。

…模型本质上是简化的。没有一个模型能够包含真实世界的所有复杂性或人类交流的细微差别。不可避免地,一些重要的信息被遗漏了…为了创建一个模型,然后,我们选择什么足够重要来包括…模型,尽管它们以公正著称,反映了目标和意识形态。当我排除了每餐都吃果酱馅饼的可能性时,我是在把我的意识形态强加给膳食模式。

正如我们在累犯量刑模型和掠夺性贷款算法中看到的那样,穷人预计将永远是穷人,并受到相应的待遇——被剥夺机会,更频繁地被监禁,并被骗取服务和贷款。

《预测机器》,作者 Ajay Agrawal、Joshua Gans 和 Avi Goldfarb

Source: Amazon

预测机器补充了基本的经济理论来解释人工智能的好处,从而完善了另外两种解读。

虽然这听起来可能会让任何不精通经济学的人感到害怕,但作者在以脚踏实地的方式解释一切方面做得很好,用实际例子来证明他们认为人工智能可以在劳动力和我们周围的任何地方体现出来。

来自预测机器的三句令人难忘的名言

当某种基本商品的价格大幅下跌时,整个世界都会发生变化。想想光…在 19 世纪早期,同样数量的光的价格是现在的 400 倍…新的人工智能技术会让什么变得如此便宜?预测。因此,正如经济学告诉我们的,我们不仅将开始使用更多的预测,而且我们将看到它出现在令人惊讶的新地方。

有时,人类和机器的结合会产生最好的预测,彼此互补对方的弱点。2016 年,哈佛/麻省理工学院的人工智能研究人员团队赢得了 Camelyon Grand Challenge,这是一项基于计算机从活检切片中检测转移性乳腺癌的竞赛。该团队获胜的深度学习算法的正确预测率为 92.5%,而人类病理学家的正确预测率为 96.6%。虽然这似乎是人类的胜利,但研究人员更进一步,将他们的算法和病理学家的预测结合起来。结果准确率达到了 99.5%。也就是说,人为错误率从 3.4%下降到 0.5%。错误下降了 85%。

数据收集比以往任何时候都更便宜、更容易。这些数据是有价值的。数十亿次搜索意味着数十亿行数据,谷歌可以利用这些数据来改善服务。有人称数据为“新石油”。预测机器依赖于数据。更多更好的数据带来更好的预测。从经济学角度来说,数据是预测的重要补充。随着预测变得更便宜,它变得更有价值。

总的来说,这三本关于人工智能的顶级书籍(人工智能超能力数学毁灭武器预测机器)提供了一个关于如何思考人工智能的全面视角,以及在当今世界使用数据的一般方法。数据一直是强大的,但以前从未像今天这样被应用,对世界决策产生如此大的影响。

这三本书中的任何一本都足以让你深刻理解人工智能是如何应用的,因为它们都给出了很好的例子。每一本书都是由各自领域的专家撰写的,所以你将能够更深入地了解全球方法、潜在的负面影响和/或经济学,这取决于你决定挑选哪些顶级人工智能书籍。

熊猫中最有用的五个命令

原文:https://towardsdatascience.com/the-top-five-most-useful-commands-in-pandas-4390d4e165a5?source=collection_archive---------11-----------------------

我每天都在用

Photo by Jason ZZ on Unsplash

您刚刚开始学习数据科学,您已经将数据放在一个数据框架中,现在什么是

我很乐意向您介绍我在 Pandas 中使用最多的命令,以帮助您更快地发现数据中的见解。我假设你的代码中有一个名为 df 的数据帧。

每次我将数据读入 Pandas 时,我做的第一件事就是使用 head 命令查看前 5 行数据。这将产生类似于以下内容的输出:

你用 df.head() 运行这个命令。

我发现这非常有价值,因为它允许我检查数据是否被正确读入,查看我有哪些列,并快速了解各个列的值。这个命令的缺点是它不能很好地适应包含许多列的数据集。

形容

使用 head 命令后,我要使用的下一个命令是 describe。Describe 将给出所有数字列的平均值、标准偏差和各种百分位数。下面是一个输出示例:

就像 head 命令一样,用 df.describe() 运行这个命令。

这是了解所有数值数据分布的快速方法。这通常也会使任何严重的异常值或数据问题变得明显。例如,如果我们的最大年龄大于 125,那么我们就会知道我们有某种类型的数据问题。

值计数

因为 describe 只适用于数值数据,所以我通常使用 value_counts 命令来更好地理解分类列。如果有一个名为“relationship”的列,可以使用以下命令获得值计数:

df['relationship'].value_counts()

它会产生如下输出:

由此,我们可以看到我们的关系列的值的计数。我们有许多丈夫的亲戚,但很少有其他亲戚。这不仅有助于我们理智地检查我们的数据,而且有助于理解我们所拥有的数据。

Corr

现在我对我的数据有了一个概念,我通常转向 corr 命令来理解我有什么相关性。在数据框中包含您试图预测的值尤其有用,这样您就可以看到潜在要素与标注之间的相关性。

当运行 df.corr() 时,您会得到数据帧中所有列之间的相关性,如下所示:

在上面的输出示例中,我们的标签是“label_int”我们可以看到“educationnum”是最正相关的变量,因此可能会成为一个很好的特征。另一方面,“Fnlwgt”与我们的标签几乎没有关联。

分组依据

最后,我倾向于发现使用 groupby 命令按组分割数据非常有用。例如,如果我想按工作类别查看每周平均工作时间,我可以运行以下命令:

train_df.groupby(['workclass'])['hoursperweek'].mean()

这将产生:

我们可以看到,“自我雇佣”组平均工作时间最长,而“从不工作”组工作时间最少。我不知道一个从未工作过的小组是如何工作的,但这是以后的讨论了。

去探索你的数据

我希望这篇文章已经帮助你理解了我最常用的熊猫指令,以及我为什么这么经常使用它们。如果你想了解更多关于这些命令或其他命令的信息,请务必查看熊猫的文档

这篇文章也可以在这里找到。

加入我的 邮箱列表 保持联系。

2019 年即将举行的顶级人工智能会议

原文:https://towardsdatascience.com/the-top-upcoming-ai-conferences-in-2019-3c3eb6f4c515?source=collection_archive---------16-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

通用机器学习和人工智能

ICML——机器学习国际会议

主题:机器学习的所有领域,包括经典和最新的深度学习技术。主要是数学和理论概念

地点:美国长滩

会议日期:6 月 10 日至 15 日

提交截止日期:1 月 19 日

遗传和进化计算会议

主题:遗传编程、蚁群优化和群体智能

地点:捷克共和国布拉格

会议日期:7 月 13 日至 19 日

提交截止日期:2 月 6 日

学习理论会议

主题:学习算法:监督、半监督、非监督、优化、贝叶斯、博弈论、深度学习、强化学习

地点:美国凤凰城

会议日期:6 月 25 日至 28 日

提交截止日期:2 月 1 日

AAAI——人工智能

主题:通用人工智能

地点:美国夏威夷

会议日期:1 月 27 日—2 月 1 日

提交截止日期:2018 年 9 月 5 日

计算机视觉

CVPR —计算机视觉和模式识别

主题:图像和视频的分类、对象检测、场景分割、形状、纹理和其他视觉技术

地点:美国长滩

会议日期:6 月 16 日至 20 日

提交截止日期:2018 年 11 月 16 日

ICCV——计算机视觉国际会议

主题:图像和视频的分类、对象检测、场景分割、形状、纹理和其他视觉技术——与 CVPR 非常相似,但国际化

地点:韩国首尔

会议日期:10 月 27 日—11 月 3 日

提交截止日期:4 月 22 日

IROS——智能机器人和系统国际会议

主题:机器人学包括机器人设计、控制、导航、规划、网络、视觉和智能

地点:中国澳门

会议日期:11 月 3 日至 8 日

提交截止日期:3 月 1 日

ICIP——图像处理国际会议

主题:图像处理,包括分析、增强、恢复、变换以及系统和多媒体应用

地点:台湾台北

会议日期:9 月 22 日至 25 日

提交截止日期:1 月 31 日

自然语言和言语

国际声学、语音和信号处理会议

主题:语音/音频处理、信号处理和自然语言处理

地点:英国布莱顿

会议日期:5 月 12 日至 17 日

提交截止日期:2018 年 10 月 29 日

计算语言学协会

主题:语言理解、机器翻译、语义和分析

地点:意大利佛罗伦萨

会议日期:8 月 28 日—9 月 2 日

提交截止日期:4 月 4 日

EMNLP —自然语言处理中的经验方法

主题:语言理解、机器翻译、语义、分析,非常类似于 ACL

地点:中国香港

会议日期:11 月 3 日至 7 日

提交截止日期:5 月 21 日

喜欢学习?

在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!

变形金刚:注意力是你所需要的

原文:https://towardsdatascience.com/the-transformer-attention-is-all-you-need-322199721720?source=collection_archive---------20-----------------------

在撰写本文时(2019 年 8 月 14 日),变压器论文“关注是你所需要的全部”是 Arxiv Sanity Preserver 的第一篇论文。这篇论文表明,单独使用注意机制,有可能在语言翻译方面取得最先进的成果。基于 Transformer 构建的后续模型(例如 BERT )在广泛的自然语言处理任务上取得了优异的性能。

在这篇文章中,我混合使用了自定义图形、从原始论文修改的图形、等式、表格和代码,以尽可能清晰地解释 Transformer。在本文结束时,您应该理解了 Transformer 模型的所有不同部分:

Figure 1 from the Transformer paper

论文

瓦斯瓦尼 A,沙泽尔 N,帕尔马 N,乌兹科雷特 J,琼斯 L,戈麦斯安,凯泽日,波洛舒欣 I .你需要的只是关注。NeurIPS 2017(第 5998–6008 页)。

这篇文章中所有的引用都来自报纸。

代码

对于 Transformer 模型的 Pytorch 实现,请参见“带注释的 Transformer”,这是一个 iPython 笔记本,其中包含 Transformer 纸质文本,并穿插有 Pytorch 工作代码。在这篇文章中,我将引用注释转换器中的代码,并详细解释代码的某些部分。

请注意,我们在这里讨论转换器各部分的顺序不同于原始论文或带注释的转换器中的顺序。在这里,我已经根据通过模型的数据流组织了所有内容,例如,从英语句子“我喜欢树”开始,通过 Transformer 处理到西班牙语翻译“Me gustan los arboles”

这里使用的超参数是变压器基本模型的超参数,如变压器论文表 3 中的摘录所示:

这些是在函数“make_model(src_vocab,tgt_vocab,N=6,d_model=512,d_ff = 2048,h=8,dropout=0.1)”的代码中使用的相同超参数

表示输入和输出

对于英语-西班牙语翻译,变换器的输入是英语句子(“我喜欢树”),输出是该句子的西班牙语翻译(“Me gustan los arboles”)。

代表输入

我们首先使用一个热点向量来表示输入句子的每个单词。独热向量是这样的向量,其中每个元素都是“零”,除了单个元素是“一”:

每个独热向量的长度由词汇的大小预先确定。如果我们想要表示 10,000 个不同的单词,我们需要使用长度为 10,000 的 one-hot 向量(这样我们就有一个唯一的槽来表示每个单词的“1”。)有关 one-hot vectors 的更多背景信息,请参见帖子为神经网络准备表格数据(包含代码!),“表示分类变量:一个热点向量”一节

词语嵌入

我们不想给 Transformer 提供简单的一个热点向量,因为它们稀疏、庞大,并且没有告诉我们任何关于单词的特征。因此,我们学习“单词嵌入”,它是单词的较小的实值向量表示,携带关于单词的一些信息。我们可以使用神经网络来实现。在 Pytorch 中嵌入,或者,更一般地说,通过将我们的独热向量乘以一个学习过的权重矩阵 w。

nn。嵌入由权重矩阵 W 组成,权重矩阵 W 将把独热向量转换成实值向量。权重矩阵具有形状(num _ embeddings,embedding_dim)。num_embeddings 就是词汇表的大小——词汇表中的每个单词都需要一个嵌入。embedding_dim 是您希望实值表示的大小;你可以选择任何你想要的值——3、64、256、512 等等。在变压器论文中,他们选择 512(超参数 d_model = 512)。

人参考 nn。作为“查找表”嵌入,因为您可以将权重矩阵想象成仅仅是单词的实值向量表示的堆栈:

对付 Pytorch nn 有两个选择。嵌入权重矩阵。一种选择是用预先训练好的嵌入来初始化它,并保持固定,在这种情况下,它实际上只是一个查找表。另一种选择是随机初始化它,或者用预先训练好的嵌入来初始化,但是保持它是可训练的。在这种情况下,单词表示将在整个训练过程中得到改进和修改,因为权重矩阵将在整个训练过程中得到改进和修改。

转换器使用权重矩阵的随机初始化,并在训练期间改进这些权重,即它学习自己的单词嵌入。

在带注释的转换器中,单词“嵌入”是使用“嵌入”类创建的,而“嵌入”类又利用了 nn。嵌入:

位置编码

我们可以只输入句子中每个单词的单词嵌入,并以此作为我们的输入表示。然而,单词嵌入本身并不携带关于单词在句子中的相对顺序的任何信息:

  • “我喜欢树”和“树长大了”都包含“树”这个词
  • 单词“trees”具有完全相同的单词嵌入,不管它是句子中的第三个单词还是第二个单词。

在 RNN 中,可以在任何地方对单词“trees”使用相同的向量,因为 RNN 按顺序处理输入的句子,一次一个单词。然而,在转换器中,输入句子中的所有单词都被同时处理——没有固有的“单词排序”,因此也没有固有的位置信息。

Transformer 的作者建议增加一个“位置编码”来解决这个问题。位置编码使得转换器可以使用关于单词顺序的信息。位置编码使用捕获排序信息的实值向量序列。句子中的每个单词根据其在句子中的位置用特定的位置编码向量相加:

“位置向量”到底是如何携带位置信息的?作者探索了创建位置编码向量的两种选择:

  • 选项 1:学习位置编码向量(需要可训练的参数),
  • 选项 2:使用等式计算位置编码向量(不需要可训练的参数)

他们发现两个选项的性能相似,所以他们选择了后一个选项(计算),因为它不需要参数,而且即使在训练期间看不到的句子长度上,也可能允许模型很好地工作。

这是他们用来计算位置编码的公式:

在这个等式中,

  • 词性是单词在句子中的位置(例如,“2”代表句子中的第二个单词)
  • I 索引到嵌入维度,即它是沿着位置编码向量维度的位置。对于长度 d_model = 512 的位置编码向量,我们将 I 的范围设为从 1 到 512。

为什么要用正弦和余弦?引用作者的话,“位置编码的每个维度对应一个正弦曲线。[……]我们选择了这个函数,因为我们假设它可以让模型很容易地学习通过相对位置来参与。”

注释转换器中,使用类“positional encoding”创建位置编码并将其添加到单词嵌入中:

输入的摘要

现在我们有了我们的输入表示:一个英语句子,“我喜欢树”被转换成三个向量(每个词一个向量):

我们的输入表示中的每个向量都捕获了单词的含义和单词在句子中的位置。

我们将执行完全相同的过程(单词嵌入+位置编码)来表示输出,在本例中是西班牙语句子“Me gustan los arboles”

现在,我们已经介绍了 Transformers 论文中图 1 的底部:输入和输出句子在输入到模型的其余部分之前是如何处理的(不要与顶部的“输出概率”混淆,这是另外一回事):

Modified from Transformer paper Figure 1

在嵌入和位置编码之后,输入张量(和输出张量)的形状是[nbatches,L,512],其中“nbatches”是批量大小(遵循带注释的变换器的变量名),L 是序列的长度(例如,对于“我喜欢树”,L = 3),512 是嵌入维度/位置编码维度。请注意,批次是精心创建的,因此单个批次包含相似长度的序列。

编码器

现在是编码器处理我们句子的时候了。这是编码器的样子:

Modified from Transformer paper Figure 1.

如图所示,编码器由 N = 6 个相同的层堆叠而成。

对于英语到西班牙语的翻译,“in”是一个英语句子,例如“我喜欢树”,用我们刚刚谈到的“单词嵌入+位置编码”格式表示。“出来”的是这句话的不同表述。

六个编码器层中的每一层都包含两个子层:

  • 第一个子层是“多头自我关注机制”
  • 第二子层是“一个简单的、按位置全连接的前馈网络”

Modified from Transformer paper Figure 1.

我们将讨论这些子层的作用。但是首先,这里是来自带注释的转换器的代码,展示了编码器是如何构建的:

“编码器”类接收一个,并将其堆叠次。它接受的是类“编码者”的一个实例

、<self_attn>、<feed_forward>和初始化类“EncoderLayer”:</feed_forward></self_attn>

  • 是 d_model,是基础模型中的 512
  • <self_attn>是类“MultiHeadedAttention”的实例这对应于子层 1。</self_attn>
  • <feed_forward>是类“positionwise 前馈”的实例这对应于子层 2。</feed_forward>
  • 是辍学率,例如 0.1

编码器子层 1:多头注意机制

Cerberus the multi-headed dog (Image Source)

为了理解变形金刚,理解多头注意力机制是至关重要的。在编码器和解码器中都使用多头注意力机制。首先,我将根据论文中的等式写一个高度概括,然后我们将深入代码的细节。

注意力的高级口头总结:键、查询和值

让我们将注意力机制的输入称为“x”。在编码器的开头,x 是我们的初始句子表示。在编码器的中间,“x”是前一个编码器的输出。例如,EncoderLayer3 从 EncoderLayer2 的输出中获取其输入“x”。

我们使用 x 来计算键、查询和值。使用不同的线性图层从 x 计算键、查询和值:

其中对于特定的编码器层,linear_k、linear_q 和 linear_v 是从维度 512 到维度 512 (d_model 到 d_model)的独立前馈神经网络层。)Linear_k、linear_q 和 linear_v 具有彼此不同的权重,它们是单独学习的。如果我们使用相同的图层权重来计算键、查询和值,那么它们将彼此完全相同,我们不需要为它们取不同的名称。

一旦我们有了键(K)、查询(Q)和值(V ),我们就按如下方式计算关注度:

这是变压器论文中的等式(1)。让我们仔细分析一下这是怎么回事:

首先,我们取查询和键之间的点积。如果我们同时对许多查询和键执行此操作,我们可以将点积写成矩阵乘法,如下所示:

这里 Q 是一堆查询 Q,K 是一堆键 K。

取点积后,除以 d_k 的平方根:

除以 sqrt(d_k)有什么意义?作者解释说,他们通过 sqrt(d_k)来缩放点积,以防止点积随着 d_k(向量长度)的增加而变大。

示例:向量[2,2]和[2,2]的点积是 8,但向量[2,2,2,2,2]和[2,2,2,2,2]的点积是 20。如果我们选择一个巨大的向量长度,我们不希望点积很大,所以我们除以向量长度的平方根来减轻这种影响。巨大的点积值是不好的,因为它会“将 softmax 函数推入具有极小梯度的区域”

这使我们进入下一步——应用 softmax,将数字压缩到(0,1)范围内:

关于 softmax 函数的讨论,请参见本文。

在这一点上我们有什么?此时,我们有一堆介于 0 和 1 之间的数字,可以认为是我们的注意力权重。我们将这些注意力权重计算为 softmax(QK^T/sqrt(d_k)).

最后一步是对值 V 进行加权求和,使用我们刚刚计算的注意力权重:

这就是整个等式!

代码为的多头注意力的更详细描述

这部分引用了来自的注释转换器的代码,因为我认为查看代码是理解正在发生的事情的好方法。

首先,这里是带有一些注释的相关代码。不要担心所有这些注释,我将在下面的文本中描述关键点。(如果您想阅读注释,根据您的浏览器,您可能需要在新窗口中打开图像,以便文本足够大,便于阅读。)

带注释的转换器中,多头注意力通过类 MultiHeadedAttention 实现:

这个类别的执行个体是以下列方式初始化的:

  • = 8,“人头”的数量变压器基本模型中有 8 个头。
  • <d_model>= 512</d_model>
  • =辍学率= 0.1

键的维数 d_k 的计算方法是 d_model/h,所以在这种情况下,d_k = 512/8 = 64。

让我们更详细地看一下 MultiHeadedAttention 的 forward()函数:

我们可以看到 forward()的输入是查询、键、值和掩码。暂时忽略面具。查询、键和值来自哪里?它们实际上是从 EncoderLayer 中重复出现三次的“x ”(见黄色高亮部分):

x 来自前一个 EncoderLayer,或者如果我们在 EncoderLayer1,x 是我们最初的句子表示。(注意,类 EncoderLayer 中的 self.self_attn 是 MultiHeadedAttention 的一个实例。)

在 MultiHeadedAttention 类中,我们将获取旧查询(旧 x)、旧键(也是旧 x)和旧值(也是旧 x),并生成彼此不同的新查询、键和值。

注意“查询”输入的形状是[nbatches,L,512]其中 nbatches 是批量大小,L 是序列长度,512 是 d_model。“键”和“值”输入也具有形状[nbatches,L,512]。

步骤 1) 在 MultiHeadedAttention forward()函数中声明,“从 d_model = > h x d_k 开始批量进行所有线性投影。”

  • 我们将在形状[nbatches,L,512]的相同张量上进行三种不同的线性投影,以获得形状[nbatches,L,512]的每个新查询、键和值。(从线性图层 512 -> 512 开始形状就没变过)。
  • 然后,我们将把输出整形为 8 个不同的头。例如,查询是 shape [nbatches,L,512],并使用 view()将其重新整形为[nbatches,L,8,64],其中 h=8 是头的数量,d_k = 64 是密钥大小。
  • 最后,我们将使用转置来交换维度 1 和 2,以获得形状[nbatches,8,L,64]

步骤 2) 在代码状态中,“批量应用所有投影向量的注意。”

  • 具体行是 x,self.attn = attention(查询,键,值,mask =掩码,dropout=self.dropout)
  • 下面是我们使用 attention()函数实现的等式:

为了计算分数,我们首先在 query [nbatches,8, L,64 和 key transposed [nbatches,8, 64,L ]之间做一个矩阵乘法。这是方程式中的 QK^T。分数的最终形状为[nbatches,8, L,L ]。

接下来,我们通过对分数应用 softmax 来计算注意力权重 p_attn。如果适用,我们还将下降应用于注意力权重。因此,p_attn 对应于上式中的 softmax(QK^T/sqrt(d_k)。p_attn 的形状是[nbatches,8, L,L ,因为对分数应用 softmax 和 dropout 不会改变形状。

最后,我们执行注意力权重 p_attn [nbatches,8, L,L ]与值[nbatches,8, L,64 ]之间的矩阵乘法。结果就是我们注意力函数的最终输出,形状为[nbatches,8, L,64 。我们从函数中返回这个,以及注意力权重本身 p_attn。

注意,在我们对注意力函数的输入和注意力函数的输出中,我们有 8 个头(张量的维度 1,例如[nbatches, 8 ,L,64】。)我们为八个头中的每一个做了不同的矩阵乘法。这就是“多头”注意力的含义:额外的“头”维度允许我们拥有多个“表征子空间”它给了我们八种不同的方式来考虑同一个句子。

步骤 3) (在 MultiHeadedAttention 类中,因为我们现在已经从 Attention()函数中返回)是使用 view()连接,然后应用最终的线性层。

步骤 3 的具体行是:

x = x.transpose(1,2)。连续()。视图(nbatches,-1,self.h * self.d_k)

return self.linears-1

  • x 是从注意力函数返回的:我们的八头表示[nbatches,8,L,64]。
  • 我们转置它得到[nbatches,L,8,64],然后用 view 整形得到[nbatches,L,8 x 64] = [nbatches,L,512]。这个使用 view()的整形操作基本上是 8 个头的连接。
  • 最后,我们应用 self.linears 的最后一个线性层,这个线性层从 512 -> 512。注意,在 Pytorch 中,如果一个多维张量被赋予一个线性层,则该线性层仅被应用于最后一个维度。所以 self.linears-1的结果还是有形状的[nbatches,L,512]。
  • 请注意,[nbatches,L,512]正是我们需要放入另一个多头张力层的正确形状。
  • …但在此之前,我们还有最后一步,即编码器子层 2,我们将在查看 Transformer 白皮书中的图 2 后讨论它。

这是变压器论文中的图 2:

Transformer paper Figure 2

在左边,在“缩放的点积注意力”下,我们有一个 Attention()函数计算结果的可视化描述:softmax(QK^T/sqrt(d_k))V.它之所以“缩放”是因为被 sqrt(d_k)除,它之所以“点积”是因为 QK^T 表示一组堆叠查询和一组堆叠键之间的点积。

在右边的“多头注意力”下,我们有一个关于多头注意力类的可视化描述。现在,您应该可以识别该图的各个部分:

  • 在底部是旧的 V、K 和 Q,它们是我们从前一个 EncoderLayer 输出的“x ”(或我们来自 EncoderLayer1 的输入句子表示的 x)
  • 接下来,我们应用一个线性层(“线性”框)来计算处理过的 V、K 和 Q(没有明确显示)
  • 我们将处理过的 V、K 和 Q 输入到我们的 8 个头的点积注意力中。这就是 attention()函数。
  • 最后,我们连接 8 个头部的 attention()函数的结果,并应用最后一个线性层来产生我们的多头注意力输出。

编码器子层 2:位置式全连接前馈网络

我们现在几乎已经理解了整个 EncoderLayer!回想一下,这是单个 EncoderLayer 的基本结构:

Modified from Transformer paper Figure 1

我们已经学习了子层 1,即多头注意力。现在我们来看看第 2 子层,即前馈网络。

子层 2 比子层 1 更容易理解,因为子层 2 只是一个前馈神经网络。下面是子层 2 的表达式:

换句话说,我们应用权重为 W1、偏差为 b1 的全连接层,执行 ReLU 非线性(最大值为零),然后应用权重为 W2、偏差为 b2 的第二个全连接层。

下面是带注释的转换器的相应代码片段:

总之,编码器由 6 个编码器组成。每个编码器有 2 个子层:子层 1 用于多头注意力,子层 2 只是一个前馈神经网络。

解码器

既然我们理解了编码器,解码器就更容易理解了,因为它和编码器很相似。这又是图 1,有一些额外的注释:

Modified from Transformer paper Figure 1

解码器和编码器之间有三个主要区别:

  • 解码器子层 1 使用“屏蔽的”多头注意力来防止非法“预见未来”
  • 解码器有一个额外的子层,在上图中标为“子层 2”。这一子层就是“编码器-解码器多头注意。”
  • 存在应用于解码器输出的线性层和 softmax,以产生指示下一个预测字的输出概率。

让我们来谈谈每一件作品。

解码器子层 1:被屏蔽的多头注意力

The Crystal Ball by John William Waterhouse

多头注意力层中的掩蔽点是防止解码器“预见未来”,即我们不希望任何水晶球内置到我们的模型中。

掩码由 1 和 0 组成:

Mask example (Image Source).

attention()函数中使用掩码的代码行如下:

如果掩码不为无:

scores = scores . masked _ fill(mask = = 0,-1e9)

masked_fill(mask,value)函数用[value]填充[self]张量的元素,其中[mask]为真。[遮罩]的形状必须是可广播的与基本张量的形状所以,基本上,我们使用屏蔽来“清除”分数张量中对应于我们不应该看到的未来单词的部分。

引用作者的话,“我们[……]修改解码器堆栈中的自我关注子层,以防止位置关注后续位置。这种屏蔽与输出嵌入偏移一个位置的事实相结合,确保了对位置 I 的预测只能依赖于小于 I 的位置处的已知输出。”

解码器子层 2:编码器-解码器多头关注

以下是解码器的代码:

黄色下划线定义了“编码器-解码器注意事项”:

x = self.sublayer[1](x,lambda x: self.src_attn(x,m,m,src_mask))

self.src_attn 是 MultiHeadedAttention 的实例。输入是 query = x,key = m,value = m,mask = src_mask。这里,x 来自前一个 DecoderLayer,而 m 或“内存”来自编码器的输出(即 EncoderLayer6 的输出)。

(注意黄色那条线上面的线,x = self.sublayer[0](x,lambda x: self.self_attn(x,x,x,tgt_mask)),定义了我们刚才讲的解码器子层 1 的解码器自我关注。除了额外的屏蔽步骤之外,它的工作方式与编码器自我关注完全相同。)

旁白:变压器中注意力的完整总结

我们现在已经讨论了变形金刚中的三种注意力。这是作者从 Transformer 的论文中总结的关于注意力在他们的模型中使用的三种方式:

解码器最终输出:线性和 Softmax 产生输出概率

在解码器堆栈的末端,我们将解码器的最终输出输入到一个线性层,然后是 softmax,以预测下一个令牌。

我们运行编码器一次,得到编码器栈的输出,代表英文输入句子“I like trees”;现在我们将多次运行解码器,以便它可以预测西班牙语翻译“Me gustan los arboles”中的多个单词

最后一个线性层将解码器堆栈的输出扩展成一个巨大的向量,其长度等于词汇表的大小。softmax 意味着我们将选择这个巨大向量中概率最高的一个元素(“贪婪解码”),它对应于我们西班牙语词汇中的一个单词。

训练完网络后(即当我们执行推理时),我们将执行以下步骤(注意,编码器输出被计算一次,然后被使用几次):

  1. 将我们的编码器输出(代表完整的英文句子“I like trees”)和一个特殊的句子开头标记输入到解码器底部的“输出句子”槽中。解码器将产生一个预测的单词,在我们的例子中应该是“我”(我们的西班牙语翻译的第一个单词。)
  2. 将我们的编码器输出、句子开头标记和解码器刚刚产生的单词提供给解码器——即,将编码器输出和" Me "提供给解码器在这一步中,解码器应该产生预测的单词“gustan”
  3. 把我们的编码器输出和“ Me gustan”馈送给解码器在这一步中,解码器应该产生预测的字“los”
  4. 将我们的编码器输出和" Me gustan los "馈送给解码器在这一步中,解码器应该产生预测的单词“arboles”
  5. 给解码器输入我们的编码器输出和“我喜欢 los arboles。”在这个步骤中,解码器应该产生句子结束标记,例如“”
  6. 因为解码器已经产生了一个句子结束标记,我们知道我们已经完成了这个句子的翻译。

训练期间呢?在训练过程中,解码器可能不是很好,所以它可能会对下一个单词产生不正确的预测。如果解码器产生垃圾,我们不想把垃圾反馈给解码器进行下一步。所以,在训练中我们使用了一个叫做“老师强制”的过程( ref1ref2ref3 )。

在教师强制中,我们利用我们知道正确的翻译应该是什么的事实,并且我们向解码器提供它应该已经预测到的符号。请注意,我们不希望解码器只是学习一个复制任务,所以我们将只在应该预测单词“arboles”的步骤中输入“< /s > Me gustan los”这是通过以下方式实现的:

  • 我们之前谈到的掩蔽,其中未来的单词被置零(即,当解码器应该预测“gustan”时,不要输入解码器“los arboles”),以及
  • 右移,使得“当前”字也不输入(即,当解码器应该预测“gustan”时,不输入解码器“gustan”)

然后,使用解码器实际产生的可能的下一个字的概率分布(例如[0.01,0.01,0.02,0.7,0.20,0.01,0.05])相对于它应该产生的概率分布(如果我们使用一个热点矢量作为基本事实,则该概率分布是[0,0,0,0,0,1,0,0]以及“arboles”槽中的“1”)。)

请注意,我刚刚描述的方法(在每个解码步骤选择概率最高的单词)被称为“贪婪解码”另一种方法是波束搜索,在每个解码步骤中保持一个以上的预测字(更多细节见这篇文章)。)

下面是用于最终线性层和 softmax 的 Pytorch 生成器类:

更有趣

祝贺您,您已经完成了变压器模型的关键部分!转换器内置了一些额外的概念,我将在这里快速概述一下:

压差:压差用于整个变压器的几个不同的地方。在这种技术中,在每次向前/向后传递期间,忽略随机的神经元子集,以帮助防止过度拟合。想了解更多关于辍学的信息,请看这篇文章

残差连接和层归一化:在编码器的每个子层周围和解码器的每个子层周围都有一个残差连接,然后是层归一化。

  • 剩余连接:如果我们计算某个函数 f(x),一个“剩余连接”产生输出 f(x)+x。换句话说,我们将原始输入加回到我们刚刚计算的输出上。更多详情见本文
  • 图层归一化:这是一种跨要素归一化输入的方法(与跨批次归一化要素的批次归一化相反。)更多详情见本文

在下面的 EncoderLayer 图中,我将相关部分涂成红色:箭头和“添加和规范”框一起表示剩余连接和层规范化:

Modified from Transformer paper Figure 1

引用,“每个子层的输出是 LayerNorm(x + Sublayer(x)),其中 Sublayer(x)是子层本身实现的函数。为了促进这些剩余连接,模型中的所有子层以及嵌入层产生维度 dmodel = 512 的输出。

对于 Pytorch 实现,请参见带注释的 Transformer 类“LayerNorm”以及应用 LayerNorm、Dropout 和 residual 连接的类“SublayerConnection”。

Noam 优化器:使用 Adam 优化器训练变压器。作者报告了一个在整个训练过程中改变学习率的具体公式。首先,对于一定数量的训练步骤,学习率线性增加。之后,学习率与步数的平方根倒数成比例降低。这个学习率计划在带注释的 Transformer 类“NoamOpt”中实现

标签平滑:最后,作者应用了标签平滑技术。本质上,标签平滑采用一个热编码的“正确答案”并平滑它们,以便大部分概率分布在“1”所在的位置,而剩余部分分布在所有为“0”的位置更多详情参见本文。有关实现,请参见带注释的转换器类“LabelSmoothing”

大总结!

  • 转换器由一个编码器和一个解码器组成。
  • 输入句子(例如“我喜欢树”)和输出句子(例如“Me gustan los arboles”)各自使用单词嵌入加每个单词的位置编码向量来表示。
  • 编码器由 6 个编码器组成。解码器由 6 个解码器组成。
  • 每个 EncoderLayer 有两个子层:多头自注意和前馈层。
  • 每个解码器层有三个子层:多头自关注、多头编码器-解码器关注和前馈层。
  • 在解码器的末端,对解码器输出应用线性层和 softmax 来预测下一个字。
  • 编码器运行一次。解码器运行多次,在每一步产生一个预测字。

参考文献

关于特色图片

特色图片是约翰·威廉姆·沃特豪斯的画作“水晶球”的一部分。

原载于 2019 年 8 月 15 日http://glassboxmedicine.com

基于 Scikit-Learn 流水线的文本特征提取

原文:https://towardsdatascience.com/the-triune-pipeline-for-three-major-transformers-in-nlp-18c14e20530?source=collection_archive---------15-----------------------

使用 2020 年初选辩论记录

Image Source

这篇文章的目的是双重的。

首先,如我所承诺的,我将跟进之前的帖子,在那篇帖子中,我比较了 2020 年 21 位民主党初选总统候选人的演讲特性。我确定了一系列语言特征,这些特征将在描述层面上区分我们的总统候选人。

在这篇文章中,我想使用这些特征来建立一个分类模型,可以预测谁将有资格参加 12 月 19 日的辩论。当然,我们现在知道谁有资格参加辩论,但我想这项任务背后的真正动机是更全面地了解一个人以某种方式说话(在辩论舞台上)对于作为总统候选人被认真对待(并被允许进入下一轮)有多重要。

第二个(也是更重要的一个)在构建这个模型的过程中,我想分享一些我最近在 scikit-learn 的世界中非常高兴地发现的事情:Pipeline(我知道我已经迟到了。😃这个非常强大的类使我的整个 ML 工作流程——从预处理到评估——变得更加容易处理、更加健壮,并且更少受到猜测的影响,尤其是在超参数调优阶段。正如我的一位同事所说,它真的应该成为每一个基于 sklearn 的 ML 项目的一部分!下面是它的功能描述:

顺序应用一列变换和一个最终 估计器。管道的中间步骤必须是“转换”,也就是说,它们必须实现 fit 和 transform 方法。最终的估计器只需要实现 fit。1

如果你想要更多的背景信息和深入描述性分析的结果,请参考我之前的文章,但是在这篇文章中,我将直接利用文章来构建所谓的三位一体管道🔱,其组件管道可以将原始文本转换为 NLP 任务的三个主要特征构建块:

Three types of feature representation in NLP

根据您正在处理的特定任务或模型,维恩图中的一个或多个特征类型可能对您的模型的性能特别重要,例如,单词嵌入伴随着一些自定义语言特征的子集。要了解哪些重叠或不重叠的要素集是最重要的,我们需要设置一个训练流来测试每种要素类型的影响。这就是Pipeline来拯救我们的地方。

但首先要做的是。

使用前一篇文章中准备好的数据帧,我们想为目标变量qualified添加一列(1 或 0 表示是或否),它表示谁有资格参加 12 月的辩论。八名候选人有资格参加辩论(包括退出的哈里斯):

**import numpy as np
import pandas as pd**QUALIFIED_CANDIDATES** = ["BIDEN", "WARREN", "SANDERS", "BUTTIGIEG", "HARRIS", "KLOBUCHAR", "STEYER", "YANG"]CANDIDATE_TO_TARGET = {}
[CANDIDATE_TO_TARGET.update({c: 1}) if c in QUALIFIED_CANDIDATES else CANDIDATE_TO_TARGET.update({c: 0}) for c in ALL_CANDIDATE_NAMES]# add the target variable column 
qualified = df['speaker'].apply(lambda x: CANDIDATE_TO_TARGET[x] if x in CANDIDATE_TO_TARGET else np.NaN)
df['qualified'] = qualified**

A dataframe containing the features and target variable (not all features shown)

然后,我们将数据集分为训练集和测试集:

**from sklearn.model_selection import train_test_splittrain_df, test_df = train_test_split(df, test_size=0.1)train_data = train_df["segment"]
train_target = train_df["qualified"]test_data = test_df["segment"]
test_target = test_df["qualified"]**

现在我们准备好了有趣的部分!

设置三位一体管道。

**Pipeline** 提供了一种方便直观的方式来构建我们的 ML 流程,其特征在于一系列可预测的核心任务,包括预处理、特征选择、标准化/规范化和分类。Pipeline通过连续调用每个估算器上的fit,将transform应用到输入,并将转换后的输入传递到下一步,来自动化拟合/转换过程的多个实例。这意味着Pipeline中的每个估计器(除了最后一个)都必须有一个transform方法[ 2 ],就像这个友好的 sklearn transformer TfidfVectorizer:

**class TfidfVectorizer(CountVectorizer):
    ... def fit(self, raw_documents, y=None):
        *# Learn vocabulary and idf from training set.*self._check_params()
        X = super().fit_transform(raw_documents)
        self._tfidf.fit(X)
        return self        def **transform**(self, raw_documents, copy=True):
        *# Transform documents to document-term matrix.*check_is_fitted(self, '_tfidf', 'The tfidf vector is not fitted')

        X = super().transform(raw_documents)
        return self._tfidf.transform(X, copy=False)**

Pipeline中的最后一个估计器不一定是转换器(即有一个transform方法),但可以是(通常是)一个分类器,像SVC。这种结构将允许您在整个安装好的管道上调用predict

管道 I:使用 tfidf 矢量器的单词包

以我们的辩论记录文本为例,我们创建了一个简单的Pipeline对象,该对象(1)将输入数据转换为 TF-IDF 特征矩阵,以及(2)使用随机森林分类器对测试数据进行分类:

****bow_pipeline** = Pipeline(
    steps=[
        ("tfidf", TfidfVectorizer()),
        ("classifier", RandomForestClassifier()),
    ]
)bow_pipeline.fit(train_data, train_target)
y_pred = bow_pipeline.predict(test_data)
cr = classification_report(test_target, y_pred)**

然后我们可以在整个管道上调用fit,在测试数据上调用predict。正如您所看到的,除了提供有序的估计量之外,没有什么别的了。当然,您可以通过在“classifier”步骤之前添加一个规范化或标准化步骤来扩展管道。(您将在下一个管道中看到一个降维步骤的示例。)

在下面的分类报告中,0代表“没有资格参加 12 月的辩论”,1代表“有资格”。我们看到,仅使用辩论记录数据— 而不了解候选人的其他信息(例如他们的投票状况、性别、受欢迎程度和政治经验水平)—我们能够以 70%的准确率预测谁将参加或不参加下一场辩论。他们在辩论舞台上说的话真的很重要,与他们如何说无关(第三条管道将在下面讨论),也与他们是谁无关。

**# tf-idf features only precision    recall  f1-score   support

           0       0.66      0.54      0.59       165
           1       0.72      0.81      0.76       242

    accuracy                           **0.70 **      407
   macro avg       0.69      0.67      0.68       407
weighted avg       0.70      0.70      0.69       407**

管道 II:使用定制转换器的单词嵌入

第二个管道需要创建一个自定义转换器,它基于单词嵌入将文本转换成数字向量。有几种方法可以做到这一点,包括从这里下载预先训练好的手套单词向量,并编写一个自定义函数来加载模型,如下所示:

**path_to_word_vectors = "/Users/jlee/glove.6B.50d.txt"def load_glove(path_to_word_vectors):
    f = open(path_to_word_vectors, "r")
    word2vec = {}
    for line in f:
        split_line = line.split()
        word = split_line[0]
        embedding = np.array([float(val) for val in split_line[1:]])
        model[word] = embedding
    return word2vecword2vec = load_glove(path_to_word_vectors)**

或者,您可以使用 spaCy 的内置单词向量模型,可以通过下面的.vector属性访问。下面我加载了"en_core_web_md"模型,它提供了 685k 个键和 20k 个唯一向量(300 维)。这个模型被存储为SpacyVectorTransformer的一个属性,这是一个返回向量平均值的定制转换器。

**import spacy 
from sklearn.base import BaseEstimator, TransformerMixinnlp = spacy.load("en_core_web_md")  # this model will give you 300Dclass **SpacyVectorTransformer**(BaseEstimator, TransformerMixin):
    def __init__(self, nlp):
        self.nlp = nlp
        self.dim = 300

    def fit(self, X, y):
        return self

    def transform(self, X):
        # Doc.vector defaults to an **average** of the token vectors.
        # https://spacy.io/api/doc#vector
        return [self.nlp(text).vector for text in X]**

一旦我们得到 300 维的平均嵌入,我们可以选择使用TrancatedSVD来降低这些特征的维数。

****embeddings_pipeline** = Pipeline(
    steps=[
        ("mean_embeddings", SpacyVectorTransformer(nlp)),
        ("reduce_dim", TruncatedSVD(50)),
        ("classifier", RandomForestClassifier()),
    ]
)embeddings_pipeline.fit(train_data, train_target)
y_pred = embeddings_pipeline.predict(test_data)
cr = classification_report(test_target, y_pred)**

结果是:

**# embeddings only               precision    recall  f1-score   support

           0       0.56      0.61      0.58       165
           1       0.72      0.67      0.69       242

    accuracy                           **0.65 **      407
   macro avg       0.64      0.64      0.64       407
weighted avg       0.65      0.65      0.65       407**

我们看到结果不如更简单的 TF-IDF 模型的结果好。

管道三:定制语言功能管道

所谓“自定义语言特征”,我指的是那种你可以通过对你的数据应用一些规则来手动提取的特征。在这个例子中,我使用空间依赖解析器提取特性number of words before the main verb:

An example of a custom rule-extracted linguistic feature

更多基于规则的定制语言特性的例子可以在以下两篇文章中找到:

** [## 为自然语言处理编写语言规则

用 spaCy 提取问题类型的指南

towardsdatascience.com](/linguistic-rule-writing-for-nlp-ml-64d9af824ee8) [## 超越演讲时间:民主党总统辩论分析

使用真实世界数据进行预测建模的数据准备和特征工程

towardsdatascience.com](/which-presidential-candidate-talks-like-that-b2b16060ff8b)

第三个管道需要一个定制的转换器,就像上一个一样;CustomLinguisticFeatureTransformer采用一个fit方法(它返回自身)和一个transform方法。后者返回featurize的输出,这是我创建的另一个名为SegmentFeaturizer的类的方法。

segment_featurizer = SegmentFeaturizer()  # more on this belowclass CustomLinguisticFeatureTransformer(BaseEstimator, TransformerMixin):
    def __init__(self):
        pass def fit(self, x, y=None):
        return self def transform(self, data):
        return **segment_featurizer.featurize**(data)

SegmentFeaturizer定义用于提取一组语言特征的方法。下面是它的基本结构,其中一些特征提取函数后面是返回特征字典列表的主featurize函数:

(要了解更多关于featurize的信息,请看这篇帖子。)然后,transform的输出作为流水线的下一个部件,即DictVectorizer的输入。完整的管道如下:

manual_pipeline = Pipeline(
    steps=[
        ("stats", CustomLinguisticFeatureTransformer()),
        ("dict_vect", DictVectorizer()),
        ("classifier", RandomForestClassifier()),
    ]
)manual_pipeline.fit(train_data, train_target)
y_pred = manual_pipeline.predict(test_data)
cr = classification_report(test_target, y_pred)

结果:

# manual linguistic features only precision    recall  f1-score   support

           0       0.62      0.56      0.59       165
           1       0.72      0.77      0.74       242

    accuracy                           **0.68**       407
   macro avg       0.67      0.66      0.67       407
weighted avg       0.68      0.68      0.68       407

不如词袋模型好,但比平均嵌入要好。下面是三个管道指标的对比汇总表:

(显示了的精确度、召回率和 f 分数的平均值。)

在一起更好。

已经看到单词袋管道和自定义语言特征管道独立地产生最佳结果,我想知道如果我们创建一个结合两者特征的新管道会有什么效果。幸运的是,有一个简单的方法可以做到这一点!

管道四:组合功能

组合特征集由**FeatureUnion**完成:

FeatureUnion 将几个 transformer 对象组合成一个新的 transformer,该 transformer 将它们的输出进行组合。FeatureUnion 接受一个 transformer 对象列表。在拟合期间,每一个都独立地拟合到数据。为了转换数据,转换器被并行应用,并且它们输出的样本向量被首尾相连成更大的向量。

下面,"classifier"步骤已经从每个管道中删除,因为该步骤需要在我们应用了FeatureUnion之后出现。

# individual pipelines minus the estimator step: **bow_pipeline** = Pipeline(
    steps=[
        ("tfidf", TfidfVectorizer()),
    ]
)**manual_pipeline** = Pipeline(
    steps=[
        ("stats", ManualTransformer()),
        ("dict_vect", DictVectorizer()),
    ]
)

最终管道由通过FeatureUnion和最终分类器连接的组合特征组成:

combined_features = FeatureUnion(
    transformer_list=[
        ("bow", bow_pipeline),
        ("manual", manual_pipeline),
    ]
)**final_pipeline** = Pipeline(
    steps=[
        ("combined_features", combined_features),
        ("classifier", RandomForestClassifier()),
    ]
)

此时,我们可以拟合final_pipeine并计算指标,但是为了更好地测量,我将对拟合的随机森林分类器的参数执行随机搜索。(您也可以运行网格搜索,但这需要更长时间。)

from sklearn.model_selection import RandomizedSearchCV# the keys can be accessed with **final_pipeline.get_params().keys()**
params = {
    "combined_features__bow__tfidf__use_idf": [True, False],
    "combined_features__bow__tfidf__ngram_range": [(1, 1), (1, 2)],
    "classifier__bootstrap": [True, False],
    "classifier__class_weight": ["balanced", None],
    "classifier__n_estimators": [100, 300, 500, 800, 1200],
    "classifier__max_depth": [5, 8, 15, 25, 30],
    "classifier__min_samples_split": [2, 5, 10, 15, 100],
    "classifier__min_samples_leaf": [1, 2, 5, 10]
}search = RandomizedSearchCV(final_pipeline, params)
search.fit(train_data, train_target)
y_pred = search.predict(test_data)
classification_report(test_target, y_pred)

酷!结果更好,具有特征统一和网格搜索支持的参数优化!

# combined features + randomized search               precision    recall  f1-score   support

           0       0.70      0.55      0.61       165
           1       0.73      0.84      0.78       242

    accuracy                           **0.72**       407
   macro avg       0.72      0.69      0.70       407
weighted avg       0.72      0.72      0.71       407

在每项指标上,混合渠道的得分都高于表现最佳的单个渠道:

作为正确的下一步,您可以尝试组合所有三个特性集,看看会发生什么,从而创建一个真正的“triune”(三合一)管道。🔱

结束了。

在这篇文章中,我演示了如何建立三位一体管道来预测总统候选人有资格参加下一场辩论的可能性。他们是:

  1. 使用标准字袋模型的管道
  2. 使用字嵌入的管道****
  3. 一条管道使用手动(自定义)功能****

每个组件管道包括一个转换器,它输出 NLP 中的主要特征类型/表示。我还展示了我们可以组合来自不同管道的不同特性集来获得更好的结果,尤其是与RandomizedSearchCV结合使用时。我认为另一个很好的收获是结合 ML 驱动和基于规则的方法来提升模型性能的价值。

我确实发现,候选人的演讲特性本身——不受任何其他人口统计特征或候选人政治成就信息的影响——能够相当准确地预测某人是否有资格参加下一场辩论,这是预测我们下一任总统的众多预测因素之一。

如果你想要不那么罗嗦的东西:

*** [## 管道随机(或网格)搜索超级快速指南

使用 scikit 的五个步骤-学习

medium.com](https://medium.com/swlh/randomized-or-grid-search-with-pipeline-cheatsheet-719c72eda68)*****

用分类为故事片增色不少——第一部分

原文:https://towardsdatascience.com/the-trouble-with-classification-312cc6fe8b79?source=collection_archive---------26-----------------------

为什么你最好在“人数据”中留下空白,而不去管分类。

当你去看电影的时候,你是否曾经希望你可以按下一个按钮,跳过故事,看着片尾字幕滚动而过?如果你回答“不”,你是正常的。演职员表很无聊

但是我们认为电影结尾的致谢是理所当然的;毕竟,演职员表的顺序是电影放映时间的一部分。再考虑一下演职员表,我们用演职员表这样一种枯燥的形式给一部电影(一种使用戏剧性的视觉和修辞来唤起内心反应的艺术形式)封顶,这似乎很奇怪。当然,演职员表已经在电影中赢得了一席之地,作为向创作者表达敬意的传统方式,有时甚至伴随着主题剪辑,以使最后的过渡不那么明显。演职员表之前的一切都是为了被动地欣赏,而之后的一切几乎都不像之前的艺术——传统的格式建议你阅读一份名单,并在电影淡出人们的视野之前,对每个人在电影制作中所扮演的角色表示敬意。只有随着时间和重复,普通的电影观众才学会将名字(尤其是线下的名字)与风格、精神气质和特权联系起来。

演员更有优势。由于他们的脸被高细节地投影,而他们的声音从环绕立体声扬声器中投射出来,你可以很快熟悉演员阵容;但是,如果你第二次看一部电影,我敢打赌你不会注意到所有船员角色的名字都被打乱了。

为了缩小“熟悉度差距”,我想如果我能在名字中找到帮助人们识别它们的元素,我就能让演职员表对人们更有吸引力。就我个人而言,当我与人们分享经验时,我会更好地记住他们的名字。这是第一个复杂的问题:人们永远也不会见到大多数名字在他们面前的人。下一个显而易见的解决方案将是用围绕这些人建立的公共档案来轰炸人们,例如,动态地改变信贷序列的视频,并为每个被信贷的人注入 IMDB 传记。这看起来很有效,但是太麻烦了。

“that” = reading the life story of every writer, sound designer, and costume writer of Transformers 7

接下来,我考虑了身份。如果职业和专业知识不足以吸引人们留下来获得学分,我认为共同的背景会吸引他们。当美国人遇到拥有共同国籍的人时,即使他们的祖先是 5 代前移民的,他们似乎也会高兴起来。我遵循这个真理,决定给我能找到的每一个有信用的人贴上他们的国籍标签。然后,我想,我会考虑到,即使是典型的电影观众,他们也不在乎超越影院体验去“了解”被信任的人。

“Oh my god, I’m Irish, too! “

我想,既然“典型的电影观众”不可能知道演职员表中每个成员的种族背景,那么标记过程应该反映出同样天真的观点,并根据名字本身做出受过教育的地理估计。我想错了,但是在我解释为什么之前,我将向你展示在我的过程有缺陷变得非常明显之前,我凭直觉走了多远。

我遵循人们用来假设他们从未见过的人的种族和性别的直觉,并转向机器学习模型,使用调查、人口普查和民意测验数据将姓名与地点关联起来。

“Assume,” “ethnicity,” and “gender” have been used in the same sentence. Exercise caution.

有许多工具可以将标识符附加到姓名上,即 NamSor ,它利用大规模数据集,仅根据姓名来提供对某人性别和种族的最佳猜测。尽管 NamSor 已经被设计得非常复杂,并且咨询了许多经济学家、语言学家和人类学家,但它(以及任何一个)人工智能分类器都无法以 100%的准确率运行。这是不可能的,原因有二:

  1. 名称序列不够长。
    举个例子,给一个故事贴上体裁标签的类似问题。如果故事是“那个人走了”,你会同样不自信地把它放入任何类型。但是如果故事继续下去,“女孩强迫特雷皮德走向迪丹吉庄园,”你会认为这是一个恐怖故事的前兆,原因有很多,至少是庄园只有房子邪恶。
  2. 名字比种族更重要,种族也比某人的名字更重要。就像一个人不会只看自己的名字来决定如何识别自己一样,从外向内分配标识符也不是了解一个群体的有效方法。

最终,我赋予个人名字比出现在屏幕上的名字更多价值的计划,在正确代表人们的责任下失败了。我认为我的意图是正确的,但我的方法是完全错误的。我想,“这个项目需要真正好的猜测”,而不是寻找人们如何识别自己,从而忽略了更好的解决方案。分类,尽管看起来很客观,但当应用于定性的人类特征时,却是有问题的。

在我的下一篇文章中,我将展示 NamSor 如何通过在散居地(电影创作者最有可能来自的地方)方面用细粒度的属性(如种族)来增加个人数据。我还将展示这与基本事实信息的关系。敬请期待!

开放数据的真相

原文:https://towardsdatascience.com/the-truth-about-open-data-6a98a04723e8?source=collection_archive---------14-----------------------

Photo by King's Church International on Unsplash

信任腐败透明 DataViz 新闻

我目前在哥伦比亚卡利的一家数据新闻初创公司做志愿者。在过去的两周里,我与企业主、学生、市长候选人和政府官员会面,深入研究数据。

我学到了一些有趣的东西。

卡利市是拉丁美洲少数几个真正开始推动开放数据的地方之一。两年前,市政厅设立了透明的咨询办公室来协助他们的努力。作为哥伦比亚正在进行的Datos Abiertos(开放数据)运动的一部分,卡利创建了一个在线门户,公众可以在那里轻松获取他们城市的数据。

公开数据在任何地方都很重要,但在哥伦比亚这样的地方尤为重要。当政府数据向公众公开时,公民和国家之间就会建立信任。透明促进诚信。在这种情况下,诚信有助于打击腐败的政客和制度。

这种事情以前发生过:巴拿马的告密者在一家德国报纸的帮助下揭露了政府的极端腐败,该报纸梳理了 2.6 兆字节的机密数据。这项数据科学研究泄露了数十个国家的信息,并在政治上曝光了许多对非法活动负有责任的政府官员。

政府没有主动透露这些信息是有原因的。封闭的数据鼓励隐藏的数字。当信息可供审计时,又名:当数据变得开放时,隐藏腐败变得更加困难。

如果政府实体开始与公众分享他们的数据,透明度就会演变成信任。开放数据是政府的说法:欢迎加入对话,我们没有什么好隐瞒的。**

“[卡利]是该国最早遵守反腐败规范、与透明度、诚信和以公开格式处理公共信息有关的良好治理做法的地方之一”——Cali.gov

除了打击腐败,政府的透明度也促进了公民的参与和合作。数据可以用来理解和可视化社区中正在发生的问题。当公众以有趣的方式了解这些问题时,参与度就会增加。

例如:哥伦比亚和犯罪

历史上,卡利在犯罪方面有过一段坎坷的历史,尤其是在杀人方面。然而,游击队的存在正在迅速减少,许多城市范围的项目正在进行中,为市民提供更大的安全。奇怪的是,我在这里交谈过的人并不相信情况正在好转。公众对犯罪看法的调查仍然显示 caleos(卡利人)认为这座城市不安全。

为了在政府和 caleos 之间建立信任,需要就该市的犯罪现状进行透明的对话。数据可视化可以在很大程度上帮助这一努力。

Homicide rates in major cities of Colombia over the years, CERAC on Twitter

如果公民相信政府正在帮助减少像杀人这样的高影响犯罪,对话就开始了。是什么导致了这种减少?为什么尽管凶杀案减少,卡莱诺斯仍然感到不安全?最近几年增加的警力是否起到了作用?停止引进更多(可能是腐败的)武器,转而关注教育,是不是更好?**

开放数据→透明→信任→进步

不幸的是,有两个障碍挡住了去路。

障碍 1:技术工人在哪里?

数据科学的现实是,它需要的技能在发展中国家不容易找到。在哥伦比亚,获取、清理、分析、可视化、解释和利用数据的学位少之又少。

在少数有技能的人中,他们期望得到报酬。来自政府的资金很少,所以数据科学家从别处寻找资金。这意味着数据科学家的大部分客户是美国的新闻机构或组织,而不是哥伦比亚政府。

仅在卡利,如果这座城市能够接触到熟练的数据科学家,他们就可以使用数据来:

  • 了解地区和社区之间的犯罪率/犯罪率类别,以提高治安水平
  • 鼓励这个城市的 3 个以上报告犯罪的机构最终彼此共享数据(这也有助于减少腐败警察的数量)
  • 绘制城市空气质量图,确定改善空气质量的方法
  • 讨论教育在降低犯罪率方面是否起重要作用
  • 向公众证明游击队的日子真的结束了
  • 请注意,限制市民全天使用汽车实际上对环境和公众都没有好处
  • 审计政府财务交易以打击腐败
  • 想象东部边缘社区和北部富裕社区之间日益扩大的财富差距(然后讨论如何解决)

项目层出不穷,影响不可估量,技术工人无处可寻

障碍 2:数据在哪里?

2018 年哥伦比亚人口普查在卡利市引起争议,此前有人声称这些数字被错误报告。2019 年,人口预计约为 480 万,但人口普查仅显示 390 万。差不多有 100 万人失踪。

卡利的市民对这些结果提出质疑,理由是数据收集方法不一致,包括整个社区都没有被统计。不正确的人口普查可能是一件大事,因为人口数量少意味着政府对公共服务(如教育)的拨款少。

这次人口普查是哥伦比亚众多数据差异的例子之一。警方很乐意使用更多的数据来帮助打击犯罪,但这还不可能。至少有三个独立的实体监管和报告该市的犯罪,但它们都拒绝相互共享数据。

在哥伦比亚首都波哥大,一个为期三年的项目计划利用犯罪数据来帮助创建一个有效的城市预测警务平台。最近的研究开始发现,预测性警务平台往往会在贫困社区产生歧视性的反馈循环,而不是有效地减少犯罪。有了这些信息,我开始对波哥大现有的犯罪数据进行分析感兴趣(希望研究预测性警务的替代方案)。

我联系了一些政府机构和大学教授,以获取该市的数据。一般的反应是:

“亲爱的杰西,感谢你对我们在哥伦比亚的预测性警务工作感兴趣。不幸的是,数据和代码是波哥大市的专利。”

在第三世界国家,数据几乎不存在。在许多发展中国家,数据是一个秘密。当数据公之于众时,往往是不准确的。不准确的数据会导致不正确的分析和可视化。

隐藏数据会破坏信任。无效数据伤害社区。

数据是理解和帮助我们社区的关键。但是在我们开始利用它之前,每个人都必须先打开它。

换句话说:开放数据是重要的,但它只有在每个人都参与的情况下才能发挥作用,因为缺失的数据会使其他数据无效。

开放数据的现实

卡利的开放数据平台才出现了两年。两年多前收集的大部分数据都存在于成堆的 pdf 文件中,需要数年才能数字化。自动化这一过程需要花费大量金钱的合格数据科学家的高超技能和努力。现在正在收集的数据不遵循任何指定的格式,这使得很难自动化系统来可视化它。

管理透明办公室的两个人没有技术背景。他们想让公众感兴趣并参与进来,但他们不知道从哪里开始。这一运动的大多数障碍都可以由那些了解 UX、UI、设计、数据科学、dataviz、数据库管理、软件工程或计算机科学的人来解决。

不幸的是,没有资金,很难招募到所需的技能来帮助卡利的开放数据平台

因此,合格的工人把他们的努力放在了其他地方。数据科学家被诱入利润丰厚的公司的诱人世界。企业项目倾向于利用来自客户的数据进行广告和产品匹配。当客户是公司时,最终目标是收入

如果客户是公众,最终目标可能是社会影响。

事实是这样的:

在美国,我遇到了数千名合格的程序员、数据科学家、研究人员和学生。技能过剩。然而,大多数技术工人都抱怨同一个问题——他们的工作没有成就感。

在哥伦比亚等地,开放数据运动的开始为社会影响项目提供了无限的资源。国家希望开放和利用其数据,但它需要帮助。

是什么阻止了美国等地的技术工人来到哥伦比亚等地帮助政府、非政府组织和创业公司完成项目?

我希望将合格的个人与有意义的工作联系起来。最后,我也想在这里为科技教育带来更多的机会。

如果你有兴趣参与,请联系我们。这仅仅是开始。

* [## 杰西·史密斯-机器学习(ML)伦理研究员-加州理工学院州立…

加州州立理工大学圣路易斯奥比斯波分校理学学士,软件工程专业*…

www.linkedin.com](https://www.linkedin.com/in/jessiejsmith/)*

相关性并不意味着因果关系。现在怎么办?

原文:https://towardsdatascience.com/the-turf-war-between-causality-and-correlation-in-data-science-which-one-is-more-important-9256f609ab92?source=collection_archive---------26-----------------------

实验和因果推理

数据科学中因果关系和相关性之间的地盘之争

Photo by jean wimmerlin on Unsplash

2021 年 2 月 20 日更新

数据科学家知道“相关性并不意味着因果关系”这一警告。仅这个月,Medium 就推荐了 20 多篇包含这句流行语的帖子。在检查了写作语气后,这些帖子暗示或大声说出:

相关性不如因果性!

数据世界中“偏向”因果关系的趋势是可以理解的,因为需要多年的专业训练才能掌握因果关系的要点。相比之下,相关研究的门槛较低。

在应用方面,许多业务场景需要因果洞察,包括确定目标受众,迭代未来产品,以及对客户行为产生可操作的洞察。

然而,这些不应该成为我们拒绝相关研究和轻视它的理由。每一种工作都有广泛的应用。

第一部分:概念 101

1。相关性

最简单的形式是,事件 A 和 B 一起发生,但没有因果关系。换句话说,我们不知道是 A 导致了 B 还是 B 导致了 A。

例如,一家在线预订机构(如 booking.com)刚刚花了 100 万英镑,在 11 月 10 日推出了一个新的网页设计,一周后网站流量激增。事件 A(新的网页设计)和事件 B(流量激增)是有关联的,但我们不知道是否有因果关系。

UX 的设计师们正不耐烦地等待着,想要获得荣誉。

2。因果关系

除了相互关联,因果关系还增加了两层额外的要求:一个时间顺序和没有选择。在上面的例子中,一个因果断言表明事件 A 由于两个原因导致了事件 B。第一,A 发生在 b 之前,第二,网站流量峰值应该没有替代解释,需要验证。

3。替代解释

数据科学家与产品团队合作,对流量激增提出了另外三种可能的解释:

假设 1:过去三个季度在数字营销方面增加的支出终于有了回报。

假设二:宏观经济状况改善提振客户出游意愿。

假设三:又到了一年中旅游的时候了。顾客开始计划圣诞节的家庭旅行。

这是这两种方法的不同焦点:相关学派只告诉我们这些事件有多紧密的联系,但不能决定是否有因果关系或因果关系的方向;因果学派需要解决这些难题。

为了排除替代方案,数据科学家选择以下三种途径之一:实验、准实验和观察设计。

第二部分:三种因果方法

解决方案 1:实验设计

对于核心的因果“推理者”,因果推理的黄金标准是随机控制试验,随机将研究对象分配到实验条件下,以消除偏差,并将差异归因于治疗。

在上面的 web 流量案例中,我们可以运行一个 A/B 测试,然后随机分配来自不同地区的客户接收新设计或旧版本。

然而,细节决定成败。

从技术上讲,随机分配应该消除协变量偏差,并创建平衡的数据分布。然而,考虑到社交媒体对人们生活的渗透,这很容易产生溢出效应。我们都在网上发布我们吃什么,穿什么,做什么的图片,这可能会淡化甚至使因果关系无效。

然而,数据科学家应该适当注意实验的缺点,包括:

  1. 耗时:运行和收集数据需要很长时间。
  2. 伦理:我们不能随机分配人吸烟,跟踪得癌症的比率。脸书因网上负面情绪实验而受到抨击。
  3. 对有效性的威胁。不可能消除****的溢出效应
  4. ****财务成本。招聘 1000+人,进行现场实验,需要多少钱?对于在线实验,成本也值得注意。设计糟糕的网络实验会让公司损失数百万美元。
  5. ****工程和数据人力。您的组织是否有必要的工程人员来实施全面的在线实验?权力分析让你想起什么了吗?如何在治疗效果小的同时减少方差?如何找到在线实验的最佳停止时间?

解决方案 2:准实验设计

由于上面列出的原因,不可能每次都采用 RCT,我们可以满足于准实验设计。对于这种类型的设计,研究人员不能完全控制随机分配,我们可能不得不处理不平衡的协变量分布。

在一系列博客文章中,我介绍了多种准实验方法来确定因果关系。

回归间断设计 :

** [## 回归不连续设计:因果推理皇冠上的宝石

RDD R 代码完全指南

towardsdatascience.com](/the-crown-jewel-of-causal-inference-regression-discontinuity-design-rdd-bad37a68e786)

:

** [## 中断时间序列实践指南

基础、假设、优点、限制和应用

towardsdatascience.com](/what-is-the-strongest-quasi-experimental-method-interrupted-time-series-period-f59fe5b00b31)

:

** [## 差异中的差异方法实践指南:工资上升,就业率下降?

大卫·卡德和阿兰·B·克鲁格 1994 年 NBER 工作文件的副本

towardsdatascience.com](/does-minimum-wage-decrease-employment-a-difference-in-differences-approach-cb208ed07327)

所有的准方法(如 DID、RDD、ITS 等。)分享相同的设计理念:考虑治疗组和对照组之间的任何先前差异,并找到排除它们的方法。我们可以从时间(即今天对比昨天,面板数据)和空间维度(即对比其他类似案例,横截面数据)寻求帮助。

在选择最合适的方法之前,我们必须检查可用的资源和限制。如果应用正确,这些准方法得出的因果推论接近 RCT。**

解决方案 3:观察设计

观察方法提供了最后的手段。研究人员不知道数据生成过程,也无法控制干预任务。这就是为什么观察方法经常产生不精确和有偏见的估计。

例如,脸书数据科学团队比较了实验方法和非实验方法的性能。他们发现观察法在评估广告测量方面表现不佳。

第三部分:商业伙伴

运行实验是昂贵的,并且观察方法是不可靠的。

商务人士应该怎么做?

一如既往,我推荐以下迭代步骤:

  1. 运行一个小型实验。
  2. 坚持一段时间,收集一些初步的发现。
  3. 留意任何更新:新的和不同的东西,还是老样子?
  4. 如果出现差异,调整工作流程,例如,回到您的业务问题,收集新的变量/数据等。
  5. 假设时间框架内没有任何变化,那么恭喜你。我们只是测试了我们的假设,而没有对 1000 多万客户进行 A/B 测试。

总是回到我们的业务问题/假设来验证我们的模型。

始终保持迭代工作流。

我们可以立即获得有用的发现,以帮助产品团队开始工作,并在需要时进行小的校准。

大型科技公司已经将实验性思维融入到他们的商业战略和产品开发管道中(查看这些令人难以置信的工作: 【脸书】网飞Airbnb)。********

第四部分:哪个更重要?

声音 1:为什么是因果关系?

因果推理为今天和明天带来好处。

因果关系研究显示用户如何参与我们的产品,并量化参与度,为今天提供可操作的见解。

随着时间的推移,人类会改变他们的行为,企业也会随之改变。纵向因果工作帮助我们跟踪这种变化,预测明天的未来趋势。

声音 2:为什么要关联?

相关研究有更广阔的市场,有更多的商业场景。之所以如此,是因为相关性研究不需要那么“挑剔”的统计假设。

比如大零售公司安排店面布局,把相似的产品放在一起。

据我所知,塔吉特、沃尔玛、好市多都是根据联想分析来重新布置店面的。

你可能听说过尿布-啤酒综合症:新爸爸们在从商店出来的路上为他们的新生儿买了尿布后,拿了一杯冰啤酒。于是,商家附近放上帮宝适和百威,捆绑销售。

老实说,购物对男人来说太沉重了。

D-B 综合症是一个商业场景,我们关心的是什么产品一起卖,而不是为什么

有些项目可能有很好的相关性,但更多的时候是没有原因的。他们就是这样,不知道为什么也没关系。所以,强相关性就足够好了。

事情是有原因的。

事情都是无缘无故相关的。

声音 3:何时以及如何使用?

对于因果关系:

  • 为什么顾客只浏览商品目录,却从不在沃尔玛完成交易?
  • 新的网页设计会如何影响顾客的忠诚度和满意度?
  • 为什么用户会脱离产品?
  • 为什么新兴市场的顾客只在线下购物,不在网上购物?
  • 对于所有其他与为什么和如何相关的问题。

进行关联:

  • 除了帮宝适和百威淡还有哪些产品一起卖?
  • 在好市多商店的什么地方可以设置美食广场?
  • 在哪里再开一家星巴克,再开一家亚马逊仓库?
  • 生命科学。医生不了解某些疾病是如何发展的,而是依靠相关的体征和症状进行诊断。
  • 个性化推荐系统。亚马逊采用的是单品到单品的协同过滤系统。它分析过去的浏览/购买历史,并向顾客推荐相关商品。
  • 对于其他数百万不需要知道为什么和如何的问题,相关性设计是首选。

外卖食品

与其问哪个更重要,我们应该问的真正问题是:

1.各校各有什么利弊?

2.我们有什么可用的信息?我们面临哪些限制?

3.如何以及何时采用每一种?

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

**** [## 阅读叶雷华博士研究员(以及其他成千上万的媒体作家)的每一个故事

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

leihua-ye.medium.com](https://leihua-ye.medium.com/membership)****

实验和因果推理

**** [## 运行 A/B 测试的 8 个常见陷阱

如何不让你的在线控制实验失败

towardsdatascience.com](/online-controlled-experiment-8-common-pitfalls-and-solutions-ea4488e5a82e) [## 数据科学家应该有充分的理由进行更多的实验

好的,坏的,丑陋的

towardsdatascience.com](/why-do-we-do-and-how-can-we-benefit-from-experimental-studies-a3bbdab313fe)

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。********

2019 年印度尼西亚大选的推特故事(Pemilu)

原文:https://towardsdatascience.com/the-twitter-tale-of-indonesian-election-2019-pemilu-fb75cd084a32?source=collection_archive---------11-----------------------

Indonesian Election 2019 and Twitter Analysis

在印尼总统选举期间,佐科维和普拉博沃成为最受关注的候选人。印度尼西亚总统初选成为新闻热点。许多新闻和社交媒体引发了关于谁将赢得总统大选的热潮。现在,在 2019 年,我们将通过 Twitter 的眼睛尝试和分析印度尼西亚总统选举的故事。

Github ( 链接到 Jupyter 笔记本 ) —源代码请访问:

免责声明

这一分析只是我个人的项目,决不能作为政治观点的可靠来源。请小心使用!

本分析的一些弱点和假设如下:

  1. 有限的数据流范围(请查看数据源)
  2. Tweepy API 和 Google Translate API 的访问受限(请看数据源)
  3. 限制对其他外部数据源的访问,以验证结果的可靠性(快速统计列表数据、地理分割等)

数据源

数据源来自 Twitter Tweepy API,该 API 从 2019 年 4 月 19 日开始传输数据。总的来说,我拥有的流媒体 Twitter 帖子是 20509,这花了我几个小时,并存储在 dataset/pemilu-data-2019.json 中,以便快速检索。关于如何获取 Twitter 历史数据(过去一周多)的更多信息。请随意从这里检索

如果你想看我是如何流的,请在 Github 上打开我的 Jupyter 笔记本。在那里,你将能够看到我的代码,并在您指定的开始日期复制结果。

Pandas Data object for Twitter Posts

数据清理和争论

删除空文本 twitter

一些文本是不同的文本格式(一些无法在 gettext(tweet)上传递的中文字符。元素)。因此,由于它不需要太多的行,我们将忽略这些行

将印尼语翻译成英语

大多数语言是印尼语。这意味着,为了分析这个问题,我们需要将帖子翻译成英文,以供感伤或其他非印度尼西亚支持的图书馆使用。

在这种情况下,我们将使用 TextBlob translate 将印度尼西亚帖子翻译成英语。这可以简单地用下面的代码来完成。TextBlob 将访问 Google 翻译 API 来生成翻译

TextBlob Translate

Translation Running on PyCharm IDE

不幸的是,Google API translate 有一些限制,所以我们不能翻译所有的东西。我们将使用那些可以在 translation.txt 中翻译成单独数据集的子集进行情感分析。

提取每个总统候选人的相关职位

为了找到这些相关的帖子,我们会在句子中搜索某个单词。例如,推文中提到了佐科维还是普拉博沃,推文属于哪一个?

例如:

  • 佐科维和普拉博沃
  • 佐科维对贾瓦人的看法(佐科维 1,普拉博沃 0)
  • Prabowo terlalu cepat senang(佐科威 0,Prabowo 1)

这将有助于我们对哪个帖子提到了哪个总统候选人进行编码。以下是 Python Pandas Lambda 函数,用于迭代序列中的每个条目,并对候选项应用提取方法。

Code to apply word_in_text method to extract Jokowi and Prabowo in the text

Prabowo is the most cited candidates out of all the streamed Twitter posts

分析

公众对两位总统候选人的总体看法如何?(Python 文本 Blob 情感分析)

什么是情感分析

情感分析是指采用自然语言来识别和提取主观信息的过程。你可以获取文本,在 TextBlob 中运行,程序会通过分析文本中使用的语言,判断文本是阳性、中性还是阴性。

TextBlob Sentimental Analysis

编写情感分析

我们将为每个英文帖子生成极性和主观性。作为最终结果,我们将收到熊猫数据帧结果如下。

Sentimental Analysis

为佐科维和普拉博沃分析公众情绪

Happier Posts for Prabowo with most meaningful posts for both candidates

推特上的总体情绪是支持普拉博沃的。在进一步挖掘数据后,有一些关于普拉博沃的有意义的/信息丰富的评论。就主观性而言,围绕普拉博沃和佐科威已经有了大量有意义的观点(与轻声有关)。

新闻传媒怎么样?两个候选人的覆盖范围是什么?

下一个分析是关于新闻报道。新闻报道可以巩固公众对总统候选人的看法,从而极大地影响选举结果。甚至有人提到新闻报道巩固了川普赢得美国总统候选人资格。因此,我们必须分析主要新闻渠道对他们的报道。

News Coverage for Prabowo and Jokowi are around the same, except that KPU_ID has more coverages for Prabowo

与其他主要社交媒体渠道相比,KPU ID(选举帖子)多次提到普拉博沃。两位候选人的覆盖面大致相同。

两位候选人的共同话题是什么?(NMF 和 LDA 的主题摘录)

主题摘录

本节说明了如何用 Python 进行近似主题建模。我们将使用一种称为非负矩阵分解(NMF)的技术,它非常类似于潜在的狄利克雷分配(LDA ),后者用于从单词包(单词列表)中寻找提取主题

通过将文本制作成单词包来为主题提取准备数据

单词袋模型是来自自然语言处理NLP 的一种从文本中提取特征的技术。它通过计算文档中单词的频率来做到这一点。一个文档可以根据你的需要来定义,可以是一句话,也可以是整个维基百科。单词袋模型的输出是一个频率向量。(InsightsBot)

Generating bags of words with dimensions of 16575 unique words from 20509 posts

通过分解模型生成主题

与 LDA 类似,我们将使用 NMF 来获得文档-主题矩阵(这里的主题也称为“组件”)和每个主题的热门单词列表。我们将通过使用相同的变量名:doctopic 和 topic_words 来进行类比

Generating 8 topics with 8 words within each topic. doctopic for each document, and clf.components for each unique word

然后,基于文档主题和 clf.components,我们可以对系数列表进行排序,并检索具有最大系数的索引,该索引指示单词与主题的接近程度。我们会发现 8 个主题是这样的

Topics extractions for Jokowi and Prabowo Tweets

分析选举期间佐科维和普拉博沃的共同话题

通过前面的主题摘录,我们找到了每个帖子的主要主题,并将其可视化如下:

Topics most talked for Prabowo and Jokowi Candidacy

第一个话题是关于普拉博沃和佐科维与民主党的关系,民主党是印尼一个非常大的社会党,与印尼前总统苏西洛·班邦·尤多约诺(SBY)的形象密切相关

我们看到的第二个话题是,网民们提到了与 BPN 争夺 c1 的问题,后者代表国家队,与普拉博沃-桑迪队关系密切。我们需要进一步分析,找出与 BPN 提及 c1 形式的确切内容。

其余的主题显示了投票和快速计票后当前选举阶段的情况。有一些地区语言混淆了,可以进一步清理。

那么,我们学到了什么,得出了什么结论?

  1. 公众对普拉博沃和佐科维的看法相似。提到了对普拉博沃候选人资格的满意。
  2. 来自 KPU (Komisi Pemilihan Umum)和其他新闻对两位总统候选人的报道不相上下,对普拉博沃的报道略多一些。
  3. 我们从 Twitter 帖子中提取的主题展示了选举阶段,C1 表格与普拉博沃-桑迪配对以及两位候选人与民主党的简单关系。

当然,在这个结论中,有一些假设,包括选择偏差,并不是所有的选民都会主动发微博。这个分析没有考虑 Twitter 之外的范围。另一个假设是分析社会情绪的两个步骤的准确性,即使用 Google API 进行翻译,然后使用 TextBlob 进行分析。这可能会损害情感分析的准确性。更好的方法是使用情感分析的母语,巴哈萨语,但是当我写这篇文章的时候,我还没有找到一个可靠的和可访问的库。也许你可以填补这个空白:)…最后,目前,这种分析采用了一种非常幼稚的方法,即汇总所有帖子的情感分数,我们可以先按用户 ID 分组,然后按用户数量汇总分数。这也最好地模拟了一个人只能投票一次的情况。

简而言之,仍然很难确定谁会赢,但是仅根据我们的 Twitter 分析,普拉博沃在帖子数量和百分比方面比佐科维更受欢迎(包括正面情绪)。

然而,这与最近的快速计票结果大相径庭,佐科威的得票率为 45%对 55%。因此,这种分析的范围仍然很窄,需要更大的时间序列数据集才能找到可靠的结果。然而,由于我的目标是向你介绍一些技巧,并从 Twitter 观点复述印度尼西亚候选人的一瞥,所以我的文章很有用。

那么,下一步是什么?

由于每次分析都会产生更多的问题,未来我们将通过以下方式改进分析:

  1. 将推特用户的情感分析按地区分组,然后与每个地区的快速计数分析进行比较。这将建立模型有效性测试的初始阶段。
  2. 有许多关于假新闻的研究有助于塑造公众对总统候选人的看法。我们可以查看它们的内容以及它给快速计数结果带来的关联。
  3. 建立更多可能的独立变量,如假新闻的可能性、推特用户年龄、人口统计数据等。

如果有时间,我将继续改进这一分析,并解决一些假设。我真诚地感谢我的数据 Whatsapp 小组的友好和建设性的反馈。我从他们的评论中学到了很多。

我希望这一分析将打开许多其他问题和见解,这将有助于您更好地了解我们的国家印度尼西亚。

请通过我的 LinkedIn 联系我,并订阅我的 Youtube 频道

请在下面留言,寻求建议和反馈。

快乐编码:)

NumPy 初学者终极指南

原文:https://towardsdatascience.com/the-ultimate-beginners-guide-to-numpy-f5a2f99aef54?source=collection_archive---------0-----------------------

入门

开始使用 NumPy 需要知道的一切

Photo by Skitterphoto from Pexels

世界靠数据运转,每个人都应该知道如何使用数据。

很难想象一个现代的、懂技术的企业不使用数据分析、数据科学、机器学习或某种形式的人工智能。NumPy 是所有这些领域的核心。

虽然不可能确切地知道有多少人正在学习分析和处理数据,但一个非常安全的假设是,成千上万(如果不是数百万)的人需要了解 NumPy 以及如何使用它。正因为如此,我花了三个月的时间整理了我希望是迄今为止最好的 NumPy 入门指南

如果你想看本教程中包含的任何内容,请在评论中留言或随时联系我们!

想看 NumPy 上的这个教程?看一看

一点背景:

我被 NumPy 通过 Google Season of Docs 选中,为绝对初学者创建一个 NumPy 入门教程。看到所有的幕后活动并与一些关键人物一起工作是令人着迷的。我有机会深入研究了现有的文档,了解了与这个项目相关的各个层面的工作情况。我也有机会和其他一些伟大的作家一起工作,他们在 SciPy 为文档而努力工作。

如果你有兴趣参与 NumPy 或 Google Season of Docs,我强烈推荐。如果你是开源项目的新手,你可能需要一点学习曲线来设置你的工作站,熟悉 NumPy 的贡献指南,并了解的来龙去脉。rst斯芬克斯,但是太值得了。如果你以前没有做过,这肯定很有挑战性,但要坚持下去。一旦你确定了这些细节,你就可以开始享受真正的乐趣了!

永远记住:NumPy 和 SciPy 背后的人是优秀的,他们希望你成功。

请随意查看 GitHub 上的绝对初学者教程的 pull 请求,了解成功修改 NumPy 文档的过程和所有相关内容。如果你想通读教程,只需继续滚动中等友好的版本!否则,您可以在 GitHub 上找到该文档的永久副本。

如果你以前从未使用过 Git 和 GitHub,你可能想看看这个教程!

[## Git 和 GitHub 入门:完全初学者指南

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…

towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6)

如果你是数据分析的新手,这是为你准备的。

Photo by Lucas Pezeta from Pexels

NumPy 的绝对初学者指南

欢迎来到 NumPy!

NumPy(NumericalPython)是一个开源 Python 库,几乎在科学和工程的每个领域都有使用。这是在 Python 中处理数值数据的通用标准,也是科学 Python 和 PyData 生态系统的核心。NumPy 的用户包括所有人,从初级程序员到从事最新科学和工业研发的有经验的研究人员。NumPy API 广泛应用于 Pandas、SciPy、Matplotlib、scikit-learn、scikit-image 和大多数其他数据科学和科学 Python 包中。

NumPy 库包含多维数组和矩阵数据结构(您将在后面的章节中找到更多相关信息)。它为 ndarray(一个同构的 n 维数组对象)提供了有效操作它的方法。NumPy 可用于对数组执行各种数学运算。它为 Python 添加了强大的数据结构,保证了使用数组和矩阵的高效计算,并提供了一个庞大的高级数学函数库,可对这些数组和矩阵进行运算。

在这里了解更多关于 NumPy 的信息

gif via giphy

安装 NumPy

要安装 NumPy,我强烈建议使用科学的 Python 发行版。如果你正在寻找在你的操作系统上安装 NumPy 的完整说明,你可以在这里找到所有的细节

如果您已经有了 Python,您可以用

conda install numpy

或者

pip install numpy

如果你还没有 Python,你可以考虑使用 Anaconda 。这是最简单的入门方式。获得这个发行版的好处是,您不需要太担心单独安装 NumPy 或您将用于数据分析的任何主要软件包,如 pandas、Scikit-Learn 等。

如果你需要更多关于安装的细节,你可以在 scipy.org 找到所有的信息。

Photo by Adrienn from Pexels

如果您在安装 Anaconda 时遇到问题,您可能想看看这篇文章:

[## 如何在 Mac 上成功安装 Anaconda(并让它实际工作)

正确安装 Anaconda 和修复可怕的“找不到 conda 命令”错误的快速而简单的指南

towardsdatascience.com](/how-to-successfully-install-anaconda-on-a-mac-and-actually-get-it-to-work-53ce18025f97)

如何导入 NumPy

任何时候你想在你的代码中使用一个包或者库,你首先需要使它可被访问。

为了开始使用 NumPy 和 NumPy 中所有可用的功能,您需要导入它。这可以通过以下 import 语句轻松完成:

import numpy as np

(我们将“numpy”缩写为“np ”,以便节省时间,同时保持代码的标准化,这样任何使用您的代码的人都可以容易地理解和运行它。)

Python 列表和 NumPy 数组有什么区别?

NumPy 为您提供了大量快速有效的数字相关选项。虽然 Python 列表可以在单个列表中包含不同的数据类型,但是 NumPy 数组中的所有元素都应该是同质的。如果数组不是同构的,那么应该在数组上执行的数学运算就不可能实现。

为什么要用 NumPy?

Photo by Pixabay from Pexels

NumPy 数组比 Python 列表更快更紧凑。数组消耗的内存更少,使用起来也更方便。NumPy 使用更少的内存来存储数据,并且它提供了一种指定数据类型的机制,这使得代码可以进一步优化。

什么是数组?

数组是 NumPy 库的中心数据结构。它是一个数值网格,包含关于原始数据、如何定位元素以及如何解释元素的信息。它有一个元素网格,可以用各种方式索引。这些元素都是相同的类型,称为数组 dtype (数据类型)。

数组可以通过非负整数元组、布尔、另一个数组或整数进行索引。数组的是维数。数组的形状是一个整数元组,给出了数组在每个维度上的大小。

我们可以初始化 NumPy 数组的一种方法是从嵌套的 Python 列表中初始化。

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

我们可以使用方括号来访问数组中的元素。当你访问元素时,记住 NumPy 中的索引从 0 开始。这意味着如果你想访问数组中的第一个元素,你将访问元素“0”。

print(a[0])

输出:

[1 2 3 4]

关于数组的更多信息

1D array, 2D array, ndarray, vector, matrix

您可能偶尔会听到被称为“ndarray”的数组,它是“ N 维数组”的简写一个 N 维数组就是一个任意维数的数组。你可能还会听到一维,或者一维数组、二维,或者二维数组等等。NumPy ndarray 类用于表示矩阵和向量。一个向量是一个单列的数组,而一个矩阵指的是一个多列的数组。

数组的属性是什么?

数组通常是由相同类型和大小的项目组成的固定大小的容器。数组中的维数和项数由其形状决定。数组的形状是一组非负整数,指定每个维度的大小。

在 NumPy 中,尺寸被称为。这意味着如果你有一个 2D 数组,看起来像这样:

[[0., 0., 0.],
 [1., 1., 1.]]

您的数组有两个轴。第一轴的长度为 2,第二轴的长度为 3。

就像在其他 Python 容器对象中一样,可以通过索引或切片数组来访问和修改数组的内容。不同的阵列可以共享相同的数据,因此在一个阵列上进行的更改可能在另一个阵列上可见。

数组属性反映了数组本身固有的信息。如果需要在不创建新数组的情况下获取甚至设置数组的属性,通常可以通过数组的属性来访问数组。

在这里阅读更多关于数组属性的内容,在这里了解数组对象。

gif via GIPHY

如何创建基本数组

np.array()
np.zeros()
np.ones()
np.empty()
np.arange()
np.linspace()
dtype

要创建一个 NumPy 数组,可以使用函数 np.array()

要创建一个简单的数组,你需要做的就是向它传递一个列表。如果您愿意,还可以指定列表中的数据类型。你可以在这里找到更多关于数据类型的信息。

import numpy as npa = np.array([1, 2, 3])

您可以这样想象您的阵列:

除了从一系列元素中创建一个数组,您还可以轻松地创建一个填充了0的数组:

输入:

np.zeros(2)

输出:

array([0., 0.])

或者用1填充的数组:

输入:

np.ones(2)

输出:

array([1., 1.])

甚至是一个阵!函数 empty 创建一个数组,其初始内容是随机的,并且取决于内存的状态。

输入:

# Create an empty array with 2 elements
np.empty(2)

您可以创建包含一系列元素的数组:

输入:

np.arange(4)

输出:

array([0, 1, 2, 3])

甚至是包含一系列均匀间隔的数组。为此,您将指定第一个编号、最后一个编号和步长

输入:

np.arange(2,9,2)

输出:

array([2, 4, 6, 8])

您还可以使用 np.linspace() 创建一个数组,其中的值以指定的间隔线性排列:

输入:

np.linspace(0,10,5)

输出:

array([ 0\. ,  2.5,  5\. ,  7.5, 10\. ])

指定您的数据类型

虽然默认的数据类型是浮点型(float64),但是您可以使用 dtype 显式地指定您想要的数据类型。

输入:

array = np.ones(2, dtype=int)
array

输出:

array([1, 1])

在此了解有关创建阵列的更多信息

Photo by Godisable Jacob from Pexels

添加、移除和排序元素

np.append()
np.delete()
np.sort()

如果从这个数组开始:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

您可以随时使用 np.append() 向数组中添加元素。确保指定要包含的数组和元素。

输入:

np.append(arr, [1,2])

输出:

array([1, 2, 3, 4, 5, 6, 7, 8, 1, 2])

可以用 np.delete() 删除一个元素。如果要删除数组中位置 1 的元素,可以运行:

输入:

np.delete(arr, 1)

输出:

array([1, 3, 4, 5, 6, 7, 8])

在这里阅读更多关于添加数组在这里删除元素的信息。

使用 np.sort() 对元素进行排序很简单。调用函数时,可以指定轴、种类和顺序。在此阅读更多关于数组排序的信息

如果从这个数组开始:

arr = np.array([2, 1, 5, 3, 7, 4, 6, 8])

您可以使用以下命令快速对数字进行升序排序:

输入:

np.sort(arr)

输出:

array([1, 2, 3, 4, 5, 6, 7, 8])

除了返回数组的排序副本的 sort 之外,您还可以使用: argsort ,它是沿指定轴的间接排序;lex sort,它是对多个键间接稳定排序;search sorted,它将在排序数组中查找元素;以及分区,它是部分排序

你如何知道一个数组的形状和大小?

ndarray.ndim()
ndarray.size()
ndarray.shape()

ndarray.ndim 会告诉你数组的轴数,或者维度。

ndarray.size 会告诉你数组的元素总数。这是数组形状元素的乘积

ndarray.shape 将显示一个整数元组,表示数组的每个维度上存储的元素数量。例如,如果您有一个 2 行 3 列的 2D 数组,则数组的形状为(2,3)。

例如,如果创建此数组:

array_example = np.array([[[0, 1, 2, 3]
                           [4, 5, 6, 7]], [[0, 1, 2, 3]
                            [4, 5, 6, 7]], [0 ,1 ,2, 3]
                            [4, 5, 6, 7]]])

要查找数组的维数,请运行:

输入:

array_example.ndim

输出:

3

要查找数组中元素的总数,请运行:

输入:

array_example.size

输出:

24

要找到数组的形状,请运行:

输入:

array_example.shape

输出:

(3,2,4)

点击此处尺寸点击此处形状点击此处了解更多信息。

你能重塑一个数组吗?

np.reshape()

是的!

gif via giphy

使用NP . shape()将在不改变数据的情况下给数组一个新的形状。请记住,当您使用 reshape 方法时,您想要生成的数组需要具有与原始数组相同数量的元素。如果你从一个有 12 个元素的数组开始,你需要确保你的新数组也有 12 个元素。

如果从这个数组开始:

a = np.arange(6)
print(a)

输出:

[0 1 2 3 4 5]

你可以使用 reshape() 来重塑你的数组。例如,您可以将此数组调整为三行两列的数组:

输入:

b = a.reshape(3,2)
print(b)

输出:

[[0 1]
 [2 3]
 [4 5]]

使用NP . shape,您可以指定一些可选参数:

输入:

numpy.reshape(a, newshape, order)

a 是要整形的数组。

新形状是你想要的新形状。您可以指定一个整数或一组整数。如果指定整数,结果将是该长度的数组。该形状应该与原始形状兼容。

顺序:“C”表示使用类似 C 的索引顺序读写元素,“F”表示使用类似 Fortran 的索引顺序读写元素,“A”表示如果 A 在内存中是 Fortran 连续的,则使用类似 Fortran 的索引顺序读写元素,否则使用类似 C 的顺序。(这是可选参数,不需要指定。)

在此了解更多关于形状操作的信息

如何将 1D 数组转换成 2D 数组(如何在数组中添加一个新轴)

np.newaxis
np.expand_dims

您可以使用 np.newaxisnp.expand_dims 来增加现有数组的维数。

使用一次后,使用 np.newaxis 将使你的数组增加一个维度。这意味着一个 1D 数组将变成一个 2D 数组,一个 2D 数组将变成一个 3D 数组,以此类推。

例如,如果从这个数组开始:

a = np.array([1, 2, 3, 4, 5, 6])
a.shape

输出:

(6,)

您可以使用 np.newaxis 来添加新轴:

输入:

a2 = a[np.newaxis]
a2.shape

输出:

(1, 6)

您可以使用 np.newaxis 显式转换带有行向量或列向量的 1D 数组。例如,通过沿第一维插入一个轴,可以将 1D 数组转换为行向量:

输入:

row_vector = a[np.newaxis, :]
row_vector.shape

输出:

(1, 6)

或者,对于列向量,可以沿第二维插入一个轴:

输入:

col_vector = a[:, np.newaxis]
col_vector.shape

输出:

(6, 1)

您也可以通过使用 np.expand_dims 在指定位置插入新轴来扩展数组。

例如,如果从这个数组开始:

输入:

a = np.array([1, 2, 3, 4, 5, 6])
a.shape

输出:

(6,)

您可以使用 np.expand_dims 在索引位置 1 添加一个轴:

输入:

b = np.expand_dims(a, axis=1)
b.shape

输出:

(6, 1)

您可以使用以下命令在索引位置 0 添加轴:

输入:

c = np.expand_dims(a, axis=0)
c.shape

输出:

(1, 6)

点击此处了解更多关于 newaxis 的信息,点击此处了解更多关于 expand_dims 的信息

Photo by mentatdgt from Pexels

索引和切片

您可以像对 Python 列表切片一样对 NumPy 数组进行索引和切片。

输入:

data = np.array([1,2,3])print(data[0])
print(data[1])
print(data[0:2])
print(data[1:])
print(data[-2:])

输出:

1
2
[1 2]
[2 3]

你可以这样想象:

您可能希望获取数组的一部分或特定数组元素,以便在进一步的分析或附加操作中使用。为此,您需要对数组进行子集化、切片和/或索引。

如果您想从数组中选择满足特定条件的值,NumPy 很简单。

例如,如果从这个数组开始:

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

您可以轻松地打印出数组中所有小于 5 的值。

输入:

print(a[a<5])

输出:

[1 2 3 4]

例如,您也可以选择等于或大于 5 的数字,并使用该条件对数组进行索引。

输入:

five_up = (a >= 5)
print(a[five_up])

输出:

[ 5  6  7  8  9 10 11 12]

您可以选择可被 2 整除的元素:

输入:

divisible_by_2 = a[a%2==0]
print(divisible_by_2)

输出:

[ 2  4  6  8 10 12]

或者可以使用 &| 运算符选择满足两个条件的元素:

输入:

c = a[(a > 2) & (a < 11)]
print(c)

输出:

[ 3  4  5  6  7  8  9 10]

虽然对于这个数组来说效率非常低,但是您也可以使用逻辑运算符 &| 来返回布尔值,这些值指定数组中的值是否满足特定条件。这对于包含名称或其他分类值的数组非常有用。

输入:

five_up = (array > 5) | (array == 5)
print(five_up)

输出:

[[False False False False]
 [ True  True  True  True]
 [ True  True  True  True]]

还可以使用 np.where() 从数组中选择元素或索引。

从此阵列开始:

输入:

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

您可以使用 np.where() 来打印元素的索引,例如,小于 5:

输入:

b = np.where(a<5)
print(b)

输出:

(array([0, 0, 0, 0]), array([0, 1, 2, 3]))

在这个例子中,返回了一个数组元组:每个维度一个数组。第一个数组表示找到这些值的行索引,第二个数组表示找到这些值的列索引。

如果希望生成元素所在的坐标列表,可以压缩数组,遍历坐标列表,并打印出来。例如:

输入:

list_of_coordinates= list(zip(b[0], b[1]))for cord in list_of_coordinates:
    print(cord)

输出:

(0, 0)
(0, 1)
(0, 2)
(0, 3)

您也可以使用 np.where() 来打印数组中小于 5 的元素:

输入:

print(a[b])

输出:

[1 2 3 4]

如果你寻找的元素不在数组中,那么返回的索引数组将为空。例如:

输入:

not_there = np.where(a == 42)
print(not_there)

输出:

(array([], dtype=int64), array([], dtype=int64))

在这里这里了解更多关于索引和切片的信息。

点击此处阅读更多关于使用 where 函数的信息。

Photo by Dazzle Jam from Pexels

如何从现有数据创建数组

slicing and indexingnp.vstack()
np.hstack()
np.hsplit().view()
.copy()

您可以轻松地使用从现有数组的一部分创建新数组。假设您有这样一个数组:

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

您可以通过指定要分割阵列的位置,随时从阵列的一部分创建新阵列。

输入:

arr1 = array[3:8]
arr1

输出:

array([4, 5, 6, 7, 8])

这里,您从索引位置 3 到索引位置 8 抓取了数组的一部分。

您还可以垂直和水平堆叠两个现有数组。假设您有两个数组:

a_1:

array([[1, 1],
     [2, 2]])

还有 a_2:

array([[3, 3],
     [4, 4]])

您可以使用 vstack 垂直堆叠它们:

输入:

np.vstack((a_1, a_2))

输出:

array([[1, 1],
     [2, 2],
     [3, 3],
     [4, 4]])

或者用 hstack 水平堆叠:

输入:

np.hstack((a_1, a_2))

输出:

array([[1, 1, 3, 3],
     [2, 2, 4, 4]])

您可以使用 hsplit 将一个数组拆分成几个更小的数组。您可以指定要返回的相同形状数组的数量,或者指定应该进行除法运算的列之后的

假设您有这样一个数组:

array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
     [13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])

如果您想将这个数组分成三个形状相同的数组,您应该运行:

输入:

np.hsplit(array,3)

输出:

[array([[ 1,  2,  3,  4],
      [13, 14, 15, 16]]), array([[ 5,  6,  7,  8],
      [17, 18, 19, 20]]), array([[ 9, 10, 11, 12],
      [21, 22, 23, 24]])]

如果您想在第三列和第四列之后拆分数组,您应该运行:

输入:

np.hsplit(array,(3,4))

输出:

[array([[ 1,  2,  3],
      [13, 14, 15]]), array([[ 4],
      [16]]), array([[ 5,  6,  7,  8,  9, 10, 11, 12],
      [17, 18, 19, 20, 21, 22, 23, 24]])]

在此了解更多关于堆叠和拆分数组的信息

您可以使用 view 方法创建一个新的数组对象,该对象查看与原始数组相同的数据(一个浅层拷贝

假设您创建了这个数组:

输入:

a = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

您可以使用以下命令创建一个查看相同数据的新数组对象:

输入:

b = a.view()

使用 copy 方法将制作数组及其数据的完整副本(一个深度副本)。要在您的阵列上使用它,您可以运行:

输入:

c = a.copy()

在此了解更多关于副本和视图的信息

基本数组操作

Addition, subtraction, multiplication, division, and more!

一旦创建了数组,就可以开始使用它们了。例如,假设您创建了两个数组,一个名为“数据”,另一个名为“1”

您可以用加号将数组相加。

data + ones

当然,你可以做的不仅仅是加法!

data - ones
data * data
data / data

NumPy 的基本操作很简单。如果你想得到一个数组中元素的和,你可以使用 sum()。这适用于 1D 阵列、2D 阵列和更高维的阵列。

输入:

a = np.array([1, 2, 3, 4])# Add all of the elements in the array
a.sum()

输出:

10

要在 2D 数组中添加行或列,需要指定轴。

如果从这个数组开始:

输入:

b = np.array([[1, 1], [2, 2]])

您可以使用以下方式对行求和:

输入:

b.sum(axis=0)

输出:

array([3, 3])

您可以用以下公式对列求和:

输入:

b.sum(axis=1)

输出:

array([2, 4])

在此了解更多基本操作

广播

有时候你可能想在一个数组和一个单一的数字之间执行运算(也称为一个向量和一个标量之间的运算),或者在两个不同大小的数组之间执行运算。例如,您的数组(我们称之为“数据”)可能包含以英里为单位的距离信息,但是您希望将该信息转换为千米。您可以使用以下命令执行此操作:

data * 1.6

NumPy 知道每个细胞都应该增殖。这个概念叫做广播。广播是一种允许 NumPy 对不同形状的数组执行操作的机制。数组的维数必须兼容,例如,当两个数组的维数相等或其中一个为 1 时。如果尺寸不兼容,您将得到一个值错误。

在这里了解更多关于广播的信息

更有用的数组操作

Maximum, minimum, sum, mean, product, standard deviation, and more

NumPy 还执行聚合功能。除了 minmaxsum 之外,您还可以轻松运行 mean 来获得平均值、 prod 来获得元素相乘的结果、 std 来获得标准偏差,等等。

data.max()
data.min()
data.sum()

让我们从这个数组开始,叫做“A”

[[0.45053314 0.17296777 0.34376245 0.5510652]
[0.54627315 0.05093587 0.40067661 0.55645993]
[0.12697628 0.82485143 0.26590556 0.56917101]]

想要沿着一行或一列进行聚合是很常见的。默认情况下,每个 NumPy 聚合函数都将返回整个数组的聚合。要查找数组中元素的总和或最小值,请运行:

输入:

A.sum()

或者

A.min()

输出:

# Sum
4.8595783866706# Minimum
0.050935870838424435

您可以指定希望在哪个轴上计算聚合函数。例如,通过指定 axis=0,可以找到每列中的最小值。

输入:

A.min(axis=0)

输出:

array([0.12697628, 0.05093587, 0.26590556, 0.5510652 ])

上面列出的四个值对应于数组中的列数。对于一个四列数组,您将得到四个值作为结果。

在此阅读更多关于函数的信息计算的信息

如何检查 NumPy 数组的大小和形状

np.shape()
np.size()

您可以随时使用 ndarray.shape 获得 NumPy 数组的维数。NumPy 将以元组的形式返回数组的维数。

例如,如果创建此数组:

输入:

np_arr = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

你可以使用 np.shape 找到你的数组的形状。

输入:

np_arr.shape

输出:

(3, 4)

这个输出告诉您,您的数组有三行四列。

您可以通过指定[0]来查找行数:

输入:

num_of_rows = np_arr.shape[0]print('Number of Rows : ', num_of_rows)

输出:

Number of Rows :  3

或者通过指定[1]仅指定列数:

输入:

num_of_columns = np_arr.shape[1]print('Number of Columns : ', num_of_columns)

输出:

Number of Columns :  4

找到数组中元素的总数也很容易:

输入:

print(np_arr.shape[0] * np_arr.shape[1])

输出:

12

您也可以将 np.shape() 用于 1D 数组。如果创建此阵列:

输入:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

您可以打印数组的形状和长度。

print('Shape of 1D array: ', arr.shape)
print('Length of 1D array: ', arr.shape[0])

输出:

Shape of 1D array:  (8,)
Length of 1D array:  8

你可以使用 np.size() 得到一个数组的维数。

输入:

# get number of rows in array
num_of_rows2 = np.size(np_arr, 0)# get number of columns in 2D numpy array
num_of_columns2 = np.size(np_arr, 1)print('Number of Rows : ', num_of_rows2)
print('Number of Columns : ', num_of_columns2)

输出:

Number of Rows :  3
Number of Columns: 4

您也可以打印元素的总数:

输入:

print('Total number of elements in  array : ', np.size(np_arr))

输出:

Total number of elements in  array :  12

这也适用于 3D 阵列:

输入:

arr3D = np.array([ [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
               [[4, 4, 4, 4], [5, 5, 5, 5], [6, 6, 6, 6]] ])

你可以很容易地打印出轴的尺寸:

输入:

print('Axis 0 size : ', np.size(arr3D, 0))
print('Axis 1 size : ', np.size(arr3D, 1))
print('Axis 2 size : ', np.size(arr3D, 2))

输出:

Axis 0 size :  2
Axis 1 size :  3
Axis 2 size :  4

您可以打印元素总数:

输入:

print(np.size(arr3D))

输出:

24

您还可以将 np.size() 用于 1D 数组:

输入:

# Create a 1D array
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])# Determine the length
print('Length of 1D numpy array : ', np.size(arr))

输出:

Length of 1D numpy array :  8

请记住,如果你检查你的数组的大小,它等于 0,你的数组是空的。

在这里了解更多关于寻找数组的大小数组的形状

创建矩阵

您可以传递 Python 列表来创建一个矩阵,用 NumPy 表示它们。

np.array([[1,2],[3,4]])

处理矩阵时,索引和切片操作非常有用:

data[0,1]
data[1:3]
data[0:2,0]

您可以像聚集向量一样聚集矩阵:

data.max()
data.min()
data.sum()

您可以聚合矩阵中的所有值,也可以使用 axis 参数跨列或行聚合这些值:

data.max(axis=0)
data.max(axis=1)

一旦创建了矩阵,如果有两个大小相同的矩阵,就可以使用算术运算符将它们相加和相乘。

data + ones

您可以对不同大小的矩阵进行这些算术运算,但前提是一个矩阵只有一列或一行。在这种情况下,NumPy 将使用其广播规则进行操作。

data + ones_row

请注意,当 NumPy 打印 N 维数组时,最后一个轴循环最快,而第一个轴最慢。这意味着:

输入:

np.ones((4,3,2))

会像这样打印出来:

输出:

array([[[1., 1.],
      [1., 1.],
      [1., 1.]], [[1., 1.],
      [1., 1.],
      [1., 1.]], [[1., 1.],
      [1., 1.],
      [1., 1.]], [[1., 1.],
      [1., 1.],
      [1., 1.]]])

在很多情况下,我们希望 NumPy 初始化数组的值。NumPy 为这些实例提供了类似于1()0()、random.random() 的方法。您所需要做的就是传递您希望它生成的元素的数量。

np.ones(3)
mp.zeros(3)
np.random.random((3)

阅读更多关于用1 在这里,用0 在这里,用初始化空数组在这里来初始化数组的值。

生成随机数

随机数生成的使用是机器学习算法的配置和评估的重要部分。无论您需要在人工神经网络中随机初始化权重,将数据分成随机集,还是随机洗牌,能够生成随机数(实际上是可重复的伪随机数)都是必不可少的。

使用 NumPy 生成随机数时,您有许多选择。随机发生器是 NumPy 对 RandomState 的替代。它们之间的主要区别在于,生成器依赖于一个附加的位生成器来管理状态并生成随机位,随机位被转换为随机值。

使用 Generator.integers ,您可以生成从低(记住这包括 NumPy)到高(不包括)的随机整数。您可以设置end point = True使高数值包含在内。

你可以用 0 到 4 之间的随机整数生成一个 2 x 4 的数组

输入:

rng.integers(5, size=(2, 4))

输出:

array([[4, 0, 2, 1],
     [3, 2, 2, 0]])

您还可以使用one()zeros()random() 方法创建一个数组,前提是您给它们一个描述矩阵维数的元组。

np.ones(3,2)
mp.zeros(3,2)
np.random.random((3,2)

在这里阅读更多关于随机发生器的信息

如何获得唯一的项目和计数

np.unique()

使用 np.unique 可以很容易地找到数组中唯一的元素。

例如,如果从这个数组开始:

输入:

a = np.array([11, 11, 12, 13, 14, 15, 16, 17, 12, 13, 11, 14, 18, 19, 20])

可以用 np.unique

输入:

unique_values = np.unique(a)
print(unique_values)

输出:

[11 12 13 14 15 16 17 18 19 20]

要获取 NumPy 数组中唯一值的索引(数组中唯一值的第一个索引位置的数组),只需传递 np.unique() 中的 return_index 参数以及您的数组。

输入:

indices_list = np.unique(a, return_index=True)
print(indices_list)

输出:

[ 0  2  3  4  5  6  7 12 13 14]

您可以将 np.unique() 中的return_counts参数与您的数组一起传递,以获得 NumPy 数组中唯一值的频率计数。

输入:

unique_values, occurrence_count = np.unique(a, return_counts=True)
print(occurrence_count)

输出:

[3 2 2 2 1 1 1 1 1 1]

这也适用于 2D 阵列。如果从这个数组开始:

a2D = np.array([[1, 2, 3, 4] ,[5, 6, 7, 8] , [9, 10, 11, 12],  [1, 2, 3, 4]])

您可以通过以下方式找到唯一值:

输入:

unique_values = np.unique(a2D)
print(unique_values)

输出:

[ 1  2  3  4  5  6  7  8  9 10 11 12]

如果 axis 参数没有通过,您的 2D 数组将被展平。

要获得唯一的行或列,请确保传递轴参数。要查找唯一的行,请指定axis=0,对于列,请指定axis=1

输入:

unique_rows = np.unique(a2D, axis=0)
print(unique_rows)

输出:

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

要获得唯一的行、出现次数和索引位置,可以使用:

输入:

unique_rows, occurence_count, indices = np.unique(a2D, axis=0, return_counts=True, return_index=True)
print('Unique Rows: ', '\n', unique_rows)
print('Occurrence Count:', '\n', occurence_count)
print('Indices: ', '\n', indices)

输出:

Unique Rows:
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
Occurrence Count:
 [0 1 2]
Indices:
 [2 1 1]

在此了解更多关于寻找数组中唯一元素的信息

转置和重塑矩阵

np.reshape()
np.transpose()
np.T()

需要旋转矩阵是很常见的。NumPy 数组有属性 T 允许你转置一个矩阵。

您可能还需要切换矩阵的维度。例如,当您的模型需要不同于数据集的特定输入形状时,就会发生这种情况。这就是整形方法有用的地方。您只需要为矩阵传递您想要的新维度。

data.reshape(2,3)
data.reshape(3,2)

您也可以使用 np.transpose 根据您指定的值反转或更改数组的轴。

如果从这个数组开始:

arr = np.arange(6).reshape((2,3))
arr

输出:

array([[0, 1, 2],
      [3, 4, 5]])

可以用 np.transpose() 转置你的数组。

输入:

np.transpose(arr)

输出:

array([[0, 3],
     [1, 4],
     [2, 5]])

在这里了解更多关于转置矩阵的信息在这里重塑矩阵

如何反转一个数组

np.flip

NumPy 的 np.flip() 函数允许你沿着一个轴翻转或者反转一个数组的内容。使用 np.flip 时,指定要反转的数组和轴。如果不指定轴,NumPy 将沿着输入数组的所有轴反转内容。

逆转 1D 阵

如果你从这样的 1D 数组开始:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

您可以使用以下方法将其反转:

reversed_arr = np.flip(arr)

如果要打印反转的数组,可以运行:

输入:

print('Reversed Array: ', reversed_arr)

输出:

Reversed Array:  [8 7 6 5 4 3 2 1]

反转 2D 阵列

2D 阵列的工作方式大致相同。

如果从这个数组开始:

输入:

arr2D = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

您可以使用以下命令反转所有行和所有列中的内容:

输入:

reversed_arr = np.flip(arr2D)print('Reversed Array: ')
print(reversed_arr)

输出:

Reversed Array:
[[12 11 10  9]
 [ 8  7  6  5]
 [ 4  3  2  1]]

您可以通过以下方式轻松地仅反转行:

输入:

reversed_arr_rows = np.flip(arr2D, axis=0)print('Reversed Array: ')
print(reversed_arr_rows)

输出:

Reversed Array:
[[ 9 10 11 12]
 [ 5  6  7  8]
 [ 1  2  3  4]]

或者仅使用以下内容反转列:

输入:

reversed_arr_columns = np.flip(arr2D, axis=1)print('Reversed Array columns: ')
print(reversed_arr_columns)

输出:

Reversed Array columns:
[[ 4  3  2  1]
 [ 8  7  6  5]
 [12 11 10  9]]

您也可以只反转一列或一行的内容。例如,您可以反转索引位置 1 处的行(第二行)的内容:

输入:

arr2D[1] = np.flip(arr2D[1])print('Reversed Array: ')
print(arr2D)

输出:

Reversed Array:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

您也可以反转索引位置 1 处的列(第二列):

输入:

arr2D[:,1] = np.flip(arr2D[:,1])print('Reversed Array: ')
print(arr2D)

输出:

Reversed Array:
[[ 1 10  3  4]
 [ 5  6  7  8]
 [ 9  2 11 12]]

在这里阅读更多关于反转数组的内容

重塑和展平多维数组

.flatten()
.ravel()

有两种流行的展平数组的方法:。flatten()。拉威尔()。两者的主要区别在于,使用 ravel() 创建的新数组实际上是对父数组的引用。这意味着对新阵列的任何更改也会影响父阵列。由于 ravel 不创建副本,它的内存效率。

如果从这个数组开始:

array = np.array([[1 , 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

你可以使用展平将你的数组展平成 1D 数组。

输入:

array.flatten()

输出:

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

当您使用展平时,对新数组的更改不会更改父数组。

例如:

输入:

a1 = array.flatten()
a1[0] = 100
print('Original array: ')
print(array)
print('New array: ')
print(a1)

输出:

Original array:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
New array:
[100   2   3   4   5   6   7   8   9  10  11  12]

但是当您使用 rank 时,您对新数组所做的更改将会影响父数组。

例如:

输入:

a2 = array.ravel()
a2[0] = 101
print('Original array: ')
print(array)
print('New array: ')
print(a2)

输出:

Original array:
[[101   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]]
New array:
[101   2   3   4   5   6   7   8   9  10  11  12]

点击这里阅读更多关于展平的信息和的信息

如何访问 docstring 以获取更多信息

help()
?
??

说到数据科学生态系统,Python 和 NumPy 都是以用户为中心构建的。最好的例子之一就是内置的文档访问。每个对象都包含对一个字符串的引用,这个字符串称为 docstring。在大多数情况下,这个 docstring 包含了对对象及其使用方法的快速而简明的总结。Python 有一个内置的 help() 函数,可以帮助你访问这些信息。这意味着几乎任何时候你需要更多信息,你都可以使用 help() 快速找到你需要的信息。

举个例子,

help(max)

会回来的

Help on built-in function max in module builtins:max(...)
    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The
    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the largest argument.

因为访问附加信息非常有用,所以 IPython 使用了字符作为访问本文档及其他相关信息的简写。

举个例子,

max?

会回来的

Docstring:
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> valueWith a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more arguments, return the largest argument.
Type:      builtin_function_or_method

您甚至可以将这种符号用于对象方法和对象本身。

假设您创建了这个数组:

a = np.array([1, 2, 3, 4, 5, 6])

运转

a?

会返回很多有用的信息。

Type:            ndarray
String form:     [1 2 3 4 5 6]
Length:          6
File:            ~/anaconda3/lib/python3.7/site-packages/numpy/__init__.py
Docstring:       <no docstring>
Class docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
        strides=None, order=None)An array object represents a multidimensional, homogeneous array
of fixed-size items.  An associated data-type object describes the
format of each element in the array (its byte-order, how many bytes it
occupies in memory, whether it is an integer, a floating point number,
or something else, etc.)Arrays should be constructed using `array`, `zeros` or `empty` (refer
to the See Also section below).  The parameters given here refer to
a low-level method (`ndarray(...)`) for instantiating an array.For more information, refer to the `numpy` module and examine the
methods and attributes of an array.Parameters
----------
(for the __new__ method; see Notes below)shape : tuple of ints
    Shape of created array.
dtype : data-type, optional
    Any object that can be interpreted as a numpy data type.
buffer : object exposing buffer interface, optional
    Used to fill the array with data.
offset : int, optional
    Offset of array data in buffer.
strides : tuple of ints, optional
    Strides of data in memory.
order : {'C', 'F'}, optional
    Row-major (C-style) or column-major (Fortran-style) order.Attributes
----------
T : ndarray
    Transpose of the array.
data : buffer
    The array's elements, in memory.
dtype : dtype object
    Describes the format of the elements in the array.
flags : dict
    Dictionary containing information related to memory use, e.g.,
    'C_CONTIGUOUS', 'OWNDATA', 'WRITEABLE', etc.
flat : numpy.flatiter object
    Flattened version of the array as an iterator.  The iterator
    allows assignments, e.g., ``x.flat = 3`` (See `ndarray.flat` for
    assignment examples; TODO).
imag : ndarray
    Imaginary part of the array.
real : ndarray
    Real part of the array.
size : int
    Number of elements in the array.
itemsize : int
    The memory use of each array element in bytes.
nbytes : int
    The total number of bytes required to store the array data,
    i.e., ``itemsize * size``.
ndim : int
    The array's number of dimensions.
shape : tuple of ints
    Shape of the array.
strides : tuple of ints
    The step-size required to move from one element to the next in
    memory. For example, a contiguous ``(3, 4)`` array of type
    ``int16`` in C-order has strides ``(8, 2)``.  This implies that
    to move from element to element in memory requires jumps of 2 bytes.
    To move from row-to-row, one needs to jump 8 bytes at a time
    (``2 * 4``).
ctypes : ctypes object
    Class containing properties of the array needed for interaction
    with ctypes.
base : ndarray
    If the array is a view into another array, that array is its `base`
    (unless that array is also a view).  The `base` array is where the
    array data is actually stored.See Also
--------
array : Construct an array.
zeros : Create an array, each element of which is zero.
empty : Create an array, but leave its allocated memory unchanged (i.e.,
        it contains "garbage").
dtype : Create a data-type.Notes
-----
There are two modes of creating an array using ``__new__``:1\. If `buffer` is None, then only `shape`, `dtype`, and `order`
   are used.
2\. If `buffer` is an object exposing the buffer interface, then
   all keywords are interpreted.No ``__init__`` method is needed because the array is fully initialized
after the ``__new__`` method.Examples
--------
These examples illustrate the low-level `ndarray` constructor.  Refer
to the `See Also` section above for easier ways of constructing an
ndarray.First mode, `buffer` is None:>>> np.ndarray(shape=(2,2), dtype=float, order='F')
array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #randomSecond mode:>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

这也适用于您创建的函数和其他对象。只需记住使用字符串文字(文档中的 """ """' ' ' ')在函数中包含 docstring 即可。

例如,如果创建此函数:

def double(a):
  '''Return a * 2'''
  return a * 2

您可以运行:

double?

它将返回:

Signature: double(a)
Docstring: Return a * 2
File:      ~/Desktop/<ipython-input-23-b5adf20be596>
Type:      function

通过阅读您感兴趣的对象的源代码,您可以获得另一个层次的信息。使用双问号(??)允许您访问源代码。

例如,运行:

double??

将返回:

Signature: double(a)
Source:
def double(a):
    '''Return a * 2'''
    return a * 2
File:      ~/Desktop/<ipython-input-23-b5adf20be596>
Type:      function

如果问题中的对象是用 Python 以外的语言编译的,使用??将返回与相同的信息?。您会发现这与许多内置对象和类型有关,例如:

len?

输出:

Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

len??

输出:

​Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

具有相同的输出,因为它们是用 Python 之外的编程语言编译的。

使用数学公式

实现在数组上工作的数学公式是 NumPy 在科学 Python 社区中如此受重视的原因之一。

例如,这是均方误差公式(在处理回归的监督机器学习模型中使用的中心公式):

在 NumPy 中实现这个公式简单明了:

这种方法之所以如此有效,是因为预测和标签可以包含一个或一千个值。它们只需要大小相同。

你可以这样想象:

在这个例子中,预测和标签向量都包含三个值,这意味着 n 的值为三。在我们进行减法运算后,向量中的值被平方。然后 NumPy 将这些值相加,您的结果就是该预测的误差值和模型质量的得分。

如何保存和加载 NumPy 对象

np.save()
np.savez()
np.savetxt()
np.load()
np.loadtxt()

在某些时候,您可能希望将数组保存到磁盘上,并在无需重新运行代码的情况下加载它们。幸运的是,有几种方法可以用 Numpy 保存和加载对象。使用处理普通文本文件的 loadtxtsavetxt 函数、处理带有. npy 文件扩展名的 NumPy 二进制文件的 loadsave 函数以及处理带有. npz 文件扩展名的 NumPy 文件的 savez 函数,可以将 ndarray 对象保存到磁盘文件中或从磁盘文件中加载。

的。npy 和。npz 文件存储数据、形状、数据类型和重建 ndarray 所需的其他信息,即使文件位于另一台具有不同体系结构的机器上,也能正确检索数组。

如果您想要存储单个 ndarray 对象,使用 np.save 将其存储为. npy 文件。如果您想在一个文件中存储多个 ndarray 对象,使用 np.savez 将其保存为. npz 文件。您还可以使用 np.savez_compressed 将几个数组保存到一个压缩的 npz 格式的文件中

np.save() 很容易保存加载和数组。只需确保指定要保存的数组和文件名。例如,如果创建此数组:

a = np.array([1, 2, 3, 4, 5, 6])

您可以使用以下命令将其保存为“filename.npy”

np.save('filename',a)

你可以使用 np.load() 来重构你的数组。

b = np.load('filename.npy')

如果您想检查您的阵列,您可以运行:

输入:

print(b)

输出:

[1 2 3 4 5 6]

您可以将 NumPy 数组保存为纯文本文件,如. csv 或。带有 np.savetxt 的 txt 文件。

例如,如果创建此数组:

csv_arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

您可以轻松地将其保存为. csv 文件,文件名为“new_file.csv ”,如下所示:

np.savetxt('new_file.csv', csv_arr)

您可以使用 loadtxt() 快速轻松地加载您保存的文本文件:

输入:

np.loadtxt('new_file.csv')

输出:

array([1., 2., 3., 4., 5., 6., 7., 8.])

savetxt()loadtxt() 函数接受额外的可选参数,如页眉、页脚和分隔符。虽然文本文件更容易共享。npy 和。npz 文件检索起来更快。如果您需要对文本文件进行更复杂的处理(例如,如果您需要处理包含缺失值的行),您将需要使用 genfromtxt 函数

使用 savetxt ,您可以指定页眉、页脚、注释等等。在这里阅读更多关于 savetxt 的内容

你可以在这里阅读更多关于 保存 ,保存 保存 ,加载 在这里。你可以在这里阅读更多关于save txt的内容,在这里阅读 loadtxt 。****

点击了解更多关于输入和输出程序的信息。

请注意,使用 np.load() 加载包含对象数组的文件会使用 pickle 模块,该模块无法抵御错误或恶意构建的数据。考虑传递allow_pickle=False来加载已知不包含对象数组的数据,以便更安全地处理不受信任的源。

导入和导出 CSV

读取包含现有信息的 CSV 很简单。最好也是最简单的方法就是使用熊猫。

import pandas as pd# If all of your columns are the same type:
x = pd.read_csv('music.csv').values# You can also simply select the columns you need:
x = pd.read_csv('music.csv', columns=['float_colname_1', ...]).values

使用熊猫来导出你的数组也很简单。如果您不熟悉 NumPy,您可能希望从数组中的值创建一个 Pandas 数据帧,然后将该数据帧写入包含 Pandas 的 CSV 文件。

如果你创建了这个数组 a

[[-2.58289208,  0.43014843, -1.24082018,  1.59572603],
[ 0.99027828,  1.17150989,  0.94125714, -0.14692469],
[ 0.76989341,  0.81299683, -0.95068423,  0.11769564],
[ 0.20484034,  0.34784527,  1.96979195,  0.51992837]]

你可以创建一个熊猫数据框架

df = pd.DataFrame(a)
print(df)

你可以很容易地保存你的数据帧

df.to_csv('pd.csv')

阅读您的 CSV 文件

pd.read_csv('pd.csv')

您也可以使用 NumPy“save txt”方法保存数组。

np.savetxt('np.csv', a, fmt='%.2f', delimiter=',', header=" 1,  2,  3,  4")

使用以下命令随时读取保存的 CSV 文件

输入:

cat np.csv

输出:

#  1,  2,  3,  4
-2.58,0.43,-1.24,1.60
0.99,1.17,0.94,-0.15
0.77,0.81,-0.95,0.12
0.20,0.35,1.97,0.52

如果你有兴趣了解更多关于熊猫的信息,看看官方的熊猫网站。通过官方熊猫安装信息了解如何安装熊猫。

用 Matplotlib 绘制数组

如果您需要为您的值生成一个绘图,使用 Matplotlib 非常简单。

例如,您可能有这样一个数组:

A = np.array([2, 1, 5, 7, 4, 6, 8, 14, 10, 9, 18, 20, 22])

如果已经安装了 Matplotlib,可以用

import matplotlib.pyplot as plt
# If you're using Jupyter Notebook, you may also want to run the following line of code
 to display your code in the notebook
%matplotlib inline

你需要做的就是运行来绘制你的值

输入:

plt.plot(A)
plt.show()

输出:

例如,您可以像这样绘制一个 1D 数组:

输入:

x = np.linspace(0, 5, 20)
y = np.linspace(0, 10, 20)
plt.plot(x, y, 'purple') # line
plt.plot(x, y, 'o')      # dots

使用 Matplotlib,您可以访问大量的可视化选项。

from mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-5, 5, 0.15)
Y = np.arange(-5, 5, 0.15)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis')plt.colorbar()

要阅读更多关于 Matplotlib 及其功能的信息,请看一下官方文档。有关安装 Matplotlib 的说明,参见官方安装章节

你成功了!恭喜你!!!

感谢阅读!如果你觉得这里应该包括什么,请告诉我。欢迎在下面留下你的评论,或者随时在 LinkedInTwitter 上联系。如果你想看更多我的教程,看看我在 Medium 上的简介:安妮·邦纳 ❤️

Photo by Asya Cusima from Pexels

终极数据科学必备学习清单

原文:https://towardsdatascience.com/the-ultimate-data-science-prerequisite-learning-list-348ce89805f9?source=collection_archive---------7-----------------------

数据科学很难突破。这是一个多学科领域,主要围绕数学、统计学和编程。如果你正在从事其他领域的工作,想要改变,或者如果你正在选择一个专业,想要重温前些年让你陶醉的主题,这篇文章正适合你。

Photo by Joanna Kosinska on Unsplash

好吧,你知道会有数学。这听起来可能令人生畏,但在特征分解和偏导数等花哨术语的背后,隐藏着可以理解的主题——也就是说,如果你投入足够的时间。

我会和你分享我开始时使用的资源列表,以及我日常仍在使用的资源。它们没有任何特定的排序,所以请随意挑选一个最适合你的时间框架和学习风格的。

好了,准备开始? 来了。

线性代数

啊,这是一个听起来很抽象的话题。这不。

至少没有达到你需要的水平。你不需要知道数学家所知道的一切,因为你不是数学家。然而,你应该理解基础知识,并有良好的直觉。

如果你是那些对这个主题进行深入理论探讨时犯了大错的人之一(不知道女性读者用什么词),我强烈建议你去麻省理工学院听视频讲座:

[## 线性代数

这门课程涵盖矩阵理论和线性代数,强调在其他学科有用的主题,如物理…

ocw.mit.edu](https://ocw.mit.edu/courses/mathematics/18-06sc-linear-algebra-fall-2011/)

即使麻省理工学院的讲座并不难理解,如果你有一些先验知识的话,我发现可汗学院对初学者更友好。另外,萨尔是个很酷的人:

[## 可汗学院

免费学习数学、艺术、计算机编程、经济学、物理学、化学、生物学、医学、金融…

www.khanacademy.org](https://www.khanacademy.org/math/linear-algebra)

这是为你准备的频道。我对幕后的人说不出多少好话。线性代数上的播放列表肯定是你可以观看的最好的东西,以开发这个主题背后的直觉。用几个晚上的网飞来换这个。不客气。

3Blue1Brown Linear Algebra — https://www.youtube.com/watch?v=fNk_zzaMoSs&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

最后,作为线性代数中最重要主题的简短修订,我推荐几篇我最近写的文章。它们绝不应该是你接触到的唯一材料。您应该对这个主题有所了解,并在准备好用 Python 实现所有内容时阅读这些内容:

[## Numpy 线性代数基础(第一部分)

学习数据科学的基本线性代数技能—第 1/2 部分

towardsdatascience.com](/linear-algebra-essentials-with-numpy-part-1-af4a867ac5ca) [## Numpy 线性代数基础(第二部分)

学习数据科学的基本线性代数技能—第 2/2 部分

towardsdatascience.com](/linear-algebra-essentials-with-numpy-part-2-d15717eebfd9)

结石

如果你在网上浏览过数据科学的先决条件,你会看到清单上有多元微积分,这是肯定的。

这很酷。然而问题是,多元微积分并不是你应该学习的微积分中的第一课。麻省理工学院再一次覆盖了你。

这里有一个单变量微积分的视频讲座列表(是它的多变量兄弟的逻辑先决条件):

[## 单变量微积分

大卫·杰里森。18.01 单变量微积分。2006 年秋天。麻省理工学院:麻省理工学院开放式课程…

ocw.mit.edu](https://ocw.mit.edu/courses/mathematics/18-01-single-variable-calculus-fall-2006/)

如果你决定走麻省理工的路线,下一步就是它的老大哥:

[## 多元微积分

丹尼斯·奥鲁。18.02SC 多元微积分。2010 年秋季。麻省理工学院:麻省理工学院开放式课程…

ocw.mit.edu](https://ocw.mit.edu/courses/mathematics/18-02sc-multivariable-calculus-fall-2010/)

不喜欢麻省理工学院的讲座?我们以前的好朋友已经帮你搞定了。这是微积分 1 的播放列表:

[## 可汗学院

免费学习数学、艺术、计算机编程、经济学、物理学、化学、生物学、医学、金融…

www.khanacademy.org](https://www.khanacademy.org/math/calculus-1)

一旦你了解了这些,你应该能够继续多元微积分:

[## 可汗学院

免费学习数学、艺术、计算机编程、经济学、物理学、化学、生物学、医学、金融…

www.khanacademy.org](https://www.khanacademy.org/math/multivariable-calculus)

还记得 3Blue1Brown 吗?他没有停留在线性代数上,他还制作了这个关于微积分的 12 集系列。他说,看完之后,你应该会觉得你可能已经发明了微积分。然而,恕我直言,我不会说他错了。

3Blue1Brown Calculus — https://www.youtube.com/watch?v=WUvTyaaNkzM&list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr

我也很喜欢这个页面,它对每个需要的主要话题都有简明扼要的文章,所以请查看:

[## 结石

微积分这个词来源于拉丁语,意思是“小石头”,因为它就像通过看东西来理解一样…

www.mathsisfun.com](https://www.mathsisfun.com/calculus/index.html)

统计和概率

虽然统计学不是机器学习,但毫无疑问,ML 从它的“前辈”那里借鉴了很多概念。如果你没有接触过统计数据,从这里开始。这本书大概有 700 页,但是它充满了图像,并且重复了很多次,所以关键点还是留下来了:

[## 人头优先统计

如果有本统计学的书做直方图,概率分布,卡方不是很好吗…

shop.oreilly.com](http://shop.oreilly.com/product/9780596527587.do)

不喜欢 10 磅重的好书?汗学院的萨尔再次为您报道:

[## 可汗学院

免费学习数学、艺术、计算机编程、经济学、物理学、化学、生物学、医学、金融…

www.khanacademy.org](https://www.khanacademy.org/math/statistics-probability)

就是没时间?这里有一个 6 小时的 Python 统计和概率课程。它的节奏非常快,但涵盖了大多数必要的主题:

[## 商业和数据科学的概率和统计

欢迎学习商业和数据科学的概率统计!在本课程中,我们涵盖了您需要了解的内容…

www.udemy.com](https://www.udemy.com/course/probability-and-statistics-for-business-and-data-science/)

3Blue1Brown 搜索 stats 播放列表的时候差点哭出来。它不存在。然而,后来我偶然发现了这个人,他可能是 YouTube 上教你一些统计数据的最好的人了,以后还有 ML(我还是不习惯那些介绍歌曲… ):

StatQuest Statistics — https://www.youtube.com/watch?v=qBigTkBLU6g&list=PLblh5JKOoLUK0FLuzwntyYI10UQFUhsY9

然后是这本书。它涵盖了大量的内容,可能比提供的任何其他资源都要多,但是它没有涉及那么多细节。这足以让你开始(和超越),如果你不清楚,你可以随时谷歌一下:

[## 数据科学家实用统计学

统计方法是数据科学的关键部分,然而很少有数据科学家有任何正式的统计…

www.oreilly.com](https://www.oreilly.com/library/view/practical-statistics-for/9781491952955/)

编程;编排

如果你不会编码,数学和统计就帮不了你!

这是我第一次接触 Python,它足以让你到达你需要的地方。Jose 是我在 Udemy 上最喜欢的导师之一:

[## 完整的 Python 训练营:学习 Python 编程和代码

这是 Udemy 上最全面、最直接的 Python 编程语言课程!你是否…

www.udemy.com](https://www.udemy.com/course/complete-python-bootcamp/)

同一个人教的更高级的课程。作为一名有抱负的数据科学家,你不一定需要知道如何编写二叉查找树,但面试问题会让你的思维能力飞上天空!你搜索的次数会少很多,而且当你搜索的时候,不会是关于琐碎的事情(大多数时候是):

* [## 学习 Python 的数据结构、算法和面试

请注意:如果你是一个完全的 PYTHON 初学者,请查看我的另一门课程:完整的 PYTHON BOOTCAMP 来学习…

www.udemy.com](https://www.udemy.com/course/python-for-data-structures-algorithms-and-interviews/)

如果你更喜欢阅读而不是看视频,我强烈推荐这本书。它不仅很好地解释了 Python,还深入到了它在现实世界中的相关应用(好吧,也许做了一些修改):

[## 用 Python 自动化枯燥的东西

完全初学者实用编程。作者阿尔·斯威加特。如果你曾经花了几个小时重命名文件或…

automatetheboringstuff.com](https://automatetheboringstuff.com/)

最后的话

这就是了。让你开始的 19 种资源。在深入研究数据科学之前,您不必全部阅读,但如果您了解基础知识,会有所帮助。

关键不在于只学习一门课程或一本书,关键在于当你在一段时间内学完所有的课程,从而多次接触到相同的材料,可能是从不同的角度。然后,也只有到那时,你才会明白它的要点。

对于已经在现场的,开始时使用了哪些资源?随意分享!

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)*

R 中的终极 EDA 可视化

原文:https://towardsdatascience.com/the-ultimate-eda-visualization-in-r-e6aff6afe5c1?source=collection_archive---------13-----------------------

清除创建雨云情节的障碍

介绍

最近我在为一个研究项目做 EDA(探索性数据分析)。同事给我介绍了一个情节,叫雨云情节。它是点状图、盒状图和核心密度的结合(或者你可以把它想成半小提琴图),它确实以一种视觉愉悦的方式传达了无数的信息(因此很多时候我们错误地称它为彩虹图:)。下面是该图的一个示例:

Rain cloud plot for a comparative politics project

看起来很神奇,不是吗?尽管我成功了,但我还是被剧情的最终结局惊呆了!

请注意,这篇文章是基于宝拉·安德里亚·马丁内兹米卡·艾伦大卫·罗宾逊的伟大工作。因此,我不会通过展示所有的细节来重新发明情节;相反,我将介绍一些你可能需要的技巧,以使这样的情节符合你的需要。

准备

我将使用来自世界价值调查第五波的数据集作为例子。我已经清理了数据集,您可以从这里简单地 git 克隆。这里是数据集的一瞥:

国家列有 22 个唯一的国家值:

阿根廷、澳大利亚、巴西、保加利亚、加拿大、智利、芬兰、法国、格鲁吉亚、匈牙利、日本、墨西哥、荷兰、挪威、波兰、罗马尼亚、塞尔维亚、斯洛文尼亚、瑞典、英国、美国和乌拉圭。

其余各栏对应于受访者对与民主的基本特征相关的 6 个问题的回答,得分为 1-10 分。例如,对于上面的每个变量,都有这样的问题提示:

许多事情可能是可取的,但并不是所有的事情都是民主的本质特征。请告诉我,对于以下各项,您认为它作为民主的一个特征有多重要。

【①政府 税收 富人补贴穷人;

(2) 宗教 权威解释法律;

使用此量表,其中 1 表示“根本不是民主的基本特征”,10 表示肯定是“民主的基本特征”

为了创造情节,你需要的另一个东西是 R 包 RColorBrewer

RColorBrewer 是一个 R 包,它允许用户使用预先制作的调色板创建彩色图表,以清晰可辨的方式可视化数据。有 3 类调色板:定性,发散,顺序。

问题 1

如果您没有包含许多组(在本例中为国家)的大型数据集,以上链接中提供的代码示例在大多数情况下都适用。但是,当你有“很多”组的时候,它就一定会断。截止值大约是 8–12,取决于您选择的特定调色板,并放入以下代码中。

# borrowed from [Paula Andrea Martinez](https://orchid00.github.io/tidy_raincloudplot)'s post mentioned above
g <- 
  ggplot(data = name_of_your_data, 
         aes(x = EmotionCondition, y = Sensitivity, fill = EmotionCondition)) +
  geom_flat_violin(position = position_nudge(x = .2, y = 0), alpha = .8) +
  geom_point(aes(y = Sensitivity, color = EmotionCondition), 
             position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  geom_point(data = sumld, aes(x = EmotionCondition, y = mean), 
             position = position_nudge(x = 0.3), size = 2.5) +
  geom_errorbar(data = sumld, aes(ymin = lower, ymax = upper, y = mean), 
                position = position_nudge(x = 0.3), width = 0) +
  expand_limits(x = 5.25) +
  guides(fill = FALSE) +
  guides(color = FALSE) +
  coord_flip() + 
 **scale_color_brewer(palette = "Spectral") +
  scale_fill_brewer(palette = "Spectral") +**
  theme_bw() +
  raincloud_theme

因此,如果您有一个像我们这里的例子这样的数据集,这在实际的分析设置中会有很多次,上面的 R 代码会中断并产生令人讨厌的错误:

> g
Error: Insufficient values in manual scale. 22 needed but only 1 provided.

您会看到这一点,因为 ggplot 无法从我们为 22 个组/国家选择的调色板(在本例中为“光谱”)中获取足够的颜色。然而,所有的默认调色板只有 8-12 种颜色。因此,我们需要将调色板“切割”成更小的间隔,从而创造更多的颜色来适应我们的群体。我们可以通过手工“剪切”默认调色板并通过colorRampPalette函数创建一个新的调色板来实现

getPalette = colorRampPalette(RColorBrewer::brewer.pal(8, "Set2"))(22) # I set (26) when creating the plot above for better transition of colors.

这将削减我们原来的调色板介绍 22 小间隔,并提取相应的颜色。我尝试了一些默认的调色板,我最喜欢调色板“Set2”。我实际上创建了 26 种颜色,而不是 22 种,因为这将允许最后几组有更明亮和更饱和的颜色。

尝试最让你满意的不同调色板和颜色组合:)

问题 2

这是一个更微妙的问题,只有在数据失真的情况下才会变得明显。其微妙的原因是,代码不会抱怨任何事情,并按照您的要求生成丰富多彩的情节。然而,在你把它投入生产和报告后,你可能会被问到“为什么它们看起来不像是在同一个规模上?”

让我给你看一个例子。请比较以下数字,第一张图中以为绘制变量,第二张图中以民权为绘制变量。

Figure 1

图 1 看起来和预期的一样,我们看到了数据分布的一个很好的描述。

Figure 2

图 2 看起来很诡异,不是吗?密度图看起来又细又扁,似乎与图 1 不在同一尺度上。但是让我告诉你,生成这两个数字的代码是完全一样的,没有任何错误!

问题在于数据的分布和密度图的特殊性。图 2 中的公民权利变量比税收变量更偏向顶端,这意味着更多的人认为保护公民权利绝对是民主的一个基本特征;他们认为政府向富人征税来补贴穷人是民主的本质特征。某个国家在公民权利变量中的中位数几乎是 9。这种偏度直接导致 pdf 拍摄的密度估计超出 10 的范围,甚至扩展到 12!但是,雨云图默认将密度限制/修剪为 10,从而导致密度区域超出 10 的范围,导致密度图看起来像是被挤压和压缩的。

到目前为止,还没有一个好的解决方案将面积损失附加到顶值 10。然而,在研究了一点之后,我发现雨云图中有一个参数可以帮助我们解释这个图。

g <- 
  ggplot(data = name_of_your_data, 
         aes(x = factor(country), y = tax, fill = factor(country))) +
  **geom_flat_violin(position = position_nudge(x = .2, y = 0), trim = TRUE, alpha = .8, scale = "width")** +
  geom_point(aes(y = tax, color = factor(country)), 
             position = position_jitter(width = .15), size = .5, alpha = 0.8) +
  geom_boxplot(width = .1, outlier.shape = NA, alpha = 0.5) +
  geom_point(data = sumld, aes(x = factor(country), y = mean), 
             position = position_nudge(x = 0.3), size = 2.5) +
  geom_errorbar(data = sumld, aes(ymin = lower, ymax = upper, y = mean), 
                position = position_nudge(x = 0.3), width = 0)+
  expand_limits(x = 5.25) +
  guides(fill = FALSE) +
  guides(color = FALSE) +
  scale_color_manual(values = getPalette) +
  scale_fill_manual(values = getPalette) +
  #coord_flip() + # flip or not
  theme_bw() +
  raincloud_theme +
  theme(axis.title = element_text(size = 42),
        axis.text=element_text(size=42))

这里的关键是参数scale = "width"。该参数记录在这里的中。根据这份文件:

如果是“面积”(默认),所有的小提琴都有相同的面积(在修剪尾部之前)。如果为“计数”,面积将与观察次数成比例缩放。如果“宽度”,所有的小提琴都有相同的最大宽度。

如果我们设置scale = "width",这两个数字看起来会是这样的:

Figure 3: Adjusted plot for the tax variable

Figure 4: Adjusted plot for the civil_rights variable

我们可以看到这些图,尤其是图 4,不再像图 2 那样压缩,每个国家内变量的分布变得更加明显。这正是我们想要的,了解每个国家的分布情况。这里需要注意的一点是,由于我们将最大密度宽度配置为相同,因此密度的面积并不相同(尽管图 2 中没有显示,因为各国的修剪面积并不相同)。这一缺点在瑞典尤为明显,如图 4 所示。然而,鉴于我们的目标是查看国家内部而不是国家之间的分布情况,我认为调整后的版本更适合我们。

结论

我希望这篇文章能扫清你在尝试制作令人惊奇的雨云情节时可能遇到的障碍。我可以想象它在学术界和工业界会有更广泛的存在,因为它在浓缩大量信息方面很优雅。

最后说明一下,雨云图在 Python 和 Matlab 中的实现也可以在这里找到。

希望这篇文章对你的生活有用。请随时让我知道你是否有更多关于雨云情节的问题:)

编码快乐!

A/B 测试终极指南。第 2 部分:数据分布

原文:https://towardsdatascience.com/the-ultimate-guide-to-a-b-testing-part-2-data-distributions-5ed429abbce?source=collection_archive---------15-----------------------

A/B 测试是一种非常流行的技术,用于检查产品中的细微变化,而不会错误地考虑由外部因素引起的变化。在这一系列的文章中,我将尝试给出一个简单的关于如何设计、运行和评估 a/b 测试结果的操作手册,这样你就可以得到这些惊人的统计显著结果了!

在上一集中,我们已经讨论了在进行 a/b 测试之前对样本大小的估计。下一步是考虑我们实现的检查测试结果统计显著性的确切方法。

但是在进入不同的统计测试之前,处理一点概率分布是很重要的,为什么我们需要知道我们的数据是如何形成的。也就是说这篇文章会比其他的更理论化,所以坚持住!但是这些知识对于下一步很重要:为每种类型的分布选择正确的统计检验。

注意:我这里不做概率分布的理论解释,所以如果你不熟悉这个概念,最好从 这里 )开始。

当涉及到 a/b 测试用户行为时,我们最有可能观察到几种类型的分布:

  • 二项分布
  • 正态分布
  • t 分布
  • 卡方分布

当然,还有很多,但是我们将集中讨论这四个,因为它们应该涵盖了你在实践中遇到的 99%的情况。

二项分布

这种情况发生在每次试验中只有两种可能的结果,并且这些试验已经重复了一定的次数。二项式分布的例子:用户搅动/返回,赢得/输掉游戏,等等。

你可以确定存在一个二项分布,如果以下所有都成立:

  • 有 n 次试验
  • 每个试验都是独立的,即一个试验的结果对另一个试验没有影响
  • 每次试验只有两种可能的结果:成功和失败,概率分别为 p 和(1-p)

已知成功概率(p)、试验次数(n)和成功次数(x),我们可以使用以下公式绘制二项式分布:

基本上,它的意思是,知道了成功的概率(p)和试验的次数(n ),我们就能够计算出在 n 次试验中获得一定成功次数(x)的概率。

还记得第一篇文章中的那个游戏吗?让我们回到那个例子,假设我们有 100 个用户(n=100),其中只有 30 人在安装游戏后的第二天返回(x=30)。此外,我们知道,在我们的案例中,用户返回的概率(即保留率)是 70% (p=0.7)。那么,从 100 个返回者中只得到 30 个返回者的概率是多少呢?

使用二项分布的公式,我们得到:

概率接近于零,这意味着这是一个极不可能的情况。所以这个结果是检查产品是否有问题的好理由。

如果我们用不同的概率 p 绘制二项式分布,图表看起来会像这样:

平均值和标准偏差可使用以下公式计算:

二项式分布是离散的,而不是连续的分布。因为变量 x 是 n 次试验的成功次数,所以它只能取数字 0,1,2,3,4…..名词(noun 的缩写)

正态分布

我们列表中的下一站是正态分布:就可识别性而言,这是其他分布中的佼佼者,许多统计测试都基于测试数据是正态分布的假设。

这种分布的广泛流行并非偶然,因为出于某种原因,许多真实世界的数据集近似正态分布。这里的例子可以是人的身高或年薪,以及更多。

如果所有的检查点都被填满,你可以确定存在正态分布:

  • 分布的均值、中值和众数都相等
  • 曲线在中心对称(即围绕平均值μ)
  • 所有的值围绕平均值对称分布(正好一半的值在中心的左边,正好一半的值在右边)
  • 曲线下的总面积等于 1(即总 p = 100%)

这种分布的一个更重要的特征是,知道了标准差和平均值,你就可以说得到精确值的概率。这来自曲线的形状:

  • 68%的数据在平均值的一个标准偏差范围内
  • 95%的数据落在平均值的两个标准偏差内
  • 99.7%的数据在平均值的三个标准偏差范围内

为了描述这种分布,统计学家使用以下公式:

因此,P(x)完全由两个变量描述:均值μ(也称为中位数和众数)和标准差σ。这两个值可以用以下公式计算:

如果μ = 0 且σ= 1,正态分布也可称为标准正态分布(又名 Z 分布)

您可以使用公式轻松地将任何正态分布转换为 Z 分布:

其中 Z 被称为“Z 得分”,这是一个非常重要的显著性检验统计数据,因此我们将会经常用到它。

学生的 t 分布

t 分布是正态分布的近亲。稍微矮一点胖一点的表弟。

当您有小样本(通常在实践中少于 30)时,使用 t 分布代替正态分布。样本越大,t 分布就越像正态分布。事实上,对于大于 30 的样本大小(例如,更多的自由度),分布几乎完全遵循正态曲线的形状。

为了描述 t 分布,我们使用以下公式:

其中γ是 gamma-function,ν是自由度的个数(简单来说就是样本数减 1)。

均值和标准差也类似于它的正常表亲,只是略有不同:对于 t 分布,我们通常假设给定数据是来自某个总体的一个样本,这意味着均值(μ)和标准差(σ)被认为是样本均值和样本标准差。在实践中,所有的变化是,我们使用自由度的数量(ν = n-1)而不是样本数量(n)来计算标准偏差,并且我们还使用其他字母来表示这两个指标:

T 分布也有自己的 Z 得分版本,称为 T 得分,在统计测试中大量使用:

卡方分布

最后,但不是最不重要的,是卡方分布。这种方法广泛用于分类数据的统计测试。

卡方分布是伽马分布的一种特殊情况(就像 T 分布一样),并且只有一个参数:自由度(ν),就像可能类别的数量减一一样简单。分布只有正值,而且是右旋的。其形状因ν而异:从ν很低的非常不对称的形状,到ν很高的几乎正常的形状(当ν接近无穷大时,卡方分布变为正态分布)

分布的平均值等于自由度的数量:

标准差等于自由度数量的两倍的平方根:

就像前两个一样,卡方也有自己的度量标准用于统计测试:

其中 Oi 是样本中 I 类出现的次数(观察频率),Ei–是样本中 I 类出现次数的假设(预期频率)。这个假设是我们在进行测试时要检查的。

所以,这些是你在开始测试你的数据时能找到的最常见的分布。下一次将讨论每种情况下的具体统计检验,也就是为什么不应该对卡方分布数据应用 t 检验。

A/B 测试终极指南。第 3 部分:参数测试

原文:https://towardsdatascience.com/the-ultimate-guide-to-a-b-testing-part-3-parametric-tests-2c629e8d98f8?source=collection_archive---------7-----------------------

A/B 测试是一种非常流行的技术,用于检查产品中的细微变化,而不会错误地考虑由外部因素引起的变化。在这一系列的文章中,我将尝试给出一个简单的关于如何设计、运行和评估 a/b 测试结果的操作手册,这样你就可以得到这些惊人的统计显著结果了!

在部分 中,一个 两个 中,我们已经讨论了在运行 a/b 测试之前样本大小的估计和最常见的概率分布,它们实际上描述了您的数据是如何形成的。现在是时候再做一步了:选择正确的统计检验,并最终使用它!

所有的统计检验可以分为两大类:参数非参数。这两个群体都致力于解决或多或少相同的问题,但在不同的情况下解决问题:

  • 仅当假设正态(或接近正态)分布时,才使用参数检验。最广泛使用的测试是 t 检验ANOVA
  • 当连续数据不是正态分布或者数据是离散的时,使用非参数检验。其中有代表性的有卡方费雪精确 检验曼恩-惠特尼 U 检验

为了让所有这些理论更接近现实生活中的问题,让我们来看一个例子:

因此,我们在过去几年里一直在开发这款令人惊叹的街机游戏,事情似乎进展得很好:保留率很稳定,转化为购买和 LTV(终身价值)使我们能够通过获得付费流量将游戏的活跃观众保持在一定水平。换句话说,我们正在驾驶一辆沃尔沃汽车:虽然它不是法拉利,但它足够可靠,可以在合理的时间内以合理的价格将乘客从 A 点带到 B 点。

但是,当然,总有改进的空间(旁注:作者不是法拉利赞助的,也没有说服你购买任何跑车):社区要求添加合作模式已经有一段时间了,经过长时间的激烈讨论,游戏团队决定投入一些时间和资源进行开发。

现在我们在这里:6 个月之后,一个已经完成并经过测试的功能,激动而准备好的 t̵o̵ ̵r̵o̵c̵k̵!̵!在面向全体观众推出之前,̵将对其进行 A/B 测试。

我们暂时不讨论实验设计和样本量估计的话题(如果你感兴趣,请查看系列的第一篇文章),然后直接开始估计结果:

对于有 2500 名用户的测试组(与对照组的规模相同),我们得到了这些数字:

  • 平均会话时间从 8 分钟增加到 9 分钟
  • 第一天的保留率从 40%增加到 45%
  • 同时,转化率从 2%下降到 1.7%(哦哦)

所以对于平均来说。会话长度与对照组相比,测试组有巨大的(根据产品经理)1 分钟的进度!第一天的保留率更高(5%)!

但是董事会却没有同样的热情。从他们的角度来看,合作模式吸引了更多的玩家,但同时,它分散了他们对核心游戏的注意力,而核心游戏是所有盈利的所在。

产品经理强烈反对这种解释,他说,我们的会话长度增长了 11%,留存率增长了 5%,转化率仅下降了 0.3%,这可能只是一个概率问题。

经过 3 个小时的反复讨论,他们决定给数据人员打电话。这是我们最终登上舞台的时刻:通过调用获胜案例(测试或控制)来收集所有数据并挽救局面!

首先,我们查看了指标分布,并决定了合适的统计方法:

平均会话长度是正态分布的,因此我们可以使用参数测试来检查差异的显著性

第一天的保留率和转换率是二项式分布(两种情况都有两种结果:退货/退货、转换/未转换),这意味着我们需要使用非参数测试

(如果您想了解发行版的更多细节,请查看本系列的第二篇文章

参数测试

“参数”这个名称意味着这些测试是基于数据具有某种形式的(正态或 t 分布)的**分布的假设,因此我们可以使用该分布(平均值,标准差)的某些参数** 来比较测试组。

这种类型最流行的代表是 Z-test学生 T-test** 或 ANOVA (方差分析)。**

对于我们的例子,让我们选择 T-test 来检查平均会话长度的增加是否像产品经理声称的那样令人兴奋。

T 检验(学生的 T 检验)

t 检验测量两组之间的差异有多显著。我们所说的“不同”是指。😃

换句话说,如果我们有两个均值不同的样本,这种差异可能只是偶然存在的吗,这两个样本来自同一个总体,或者这实际上是来自不同分布的两组?

我们首先绘制两组中每节课的时长:

要使用双样本 T 检验,我们需要每个分布的三个参数:样本均值(x1,x2)、标准偏差(s1,s2)和每组中的观察次数(n1,n2)。我在上一篇文章中已经描述了如何计算它,所以这里我们将只使用现成的数字:

对照组(橙色组)的平均值为 x1 = 8,而测试组的平均值为 x2 = 9。各组的标准偏差为 s1 = 0.5,s2 = 0.6。控制组和测试组的会话数为 n1=n2=25000(每个玩家在 A/B 测试期间进行了 10 次会话)。

知道这些数字后,可以使用以下公式计算 T 值:

其中 Sp 为样本分组方差,由下式给出:

μ1μ2 是两个种群的实均值。但是我们只有样本均值 x1x2…那么如何处理这个呢?

嗯,整个测试的主要目标是证明μ1 和μ2 之间存在显著差异,正因为如此,x2 高于 x1。或者换句话说,证明两个样本来自同一总体(μ1 = μ2)的零假设是错误的。

诀窍就在这里:在测试中,我们实际上假设零假设为真,μ1 = μ2,并检查在这种情况下测试组和对照组获得如此不同结果的可能性。而如果μ1 = μ2,那么(μ1 — μ2)=0。

我们案例的最终计算如下:

结果,我们得到了一个相当高的 t 值!

最后一步是检查,p = 0.05 的临界 t 值是多少(只是一个关于 p 值的快速提醒:这是错误地认为两个样本之间存在显著差异的概率,而事实并非如此。因此,尽管 5%通常就足够了,但有时人们会为了更保守的结果而选择 1%的 p 值。

根据临界值表(你可以很容易地在网上找到),对于我们的样本量和 p = 0.05,当 t>1.96 时,可以拒绝零假设。我们远远超过了这个值,因此我们可以说平均会话长度增加 1 分钟是有意义的。

看起来我们证明了产品经理对敬业度的乐观看法是正确的,这太棒了!但其他问题仍然存在:我们的货币化指标下降了吗?这 5%的保留率增长有意义吗?

为了回答这两个问题,我们需要使用非参数测试,但是这些家伙值得一篇单独的文章。敬请关注!

数据清理的终极指南

原文:https://towardsdatascience.com/the-ultimate-guide-to-data-cleaning-3969843991d4?source=collection_archive---------0-----------------------

当数据是垃圾的时候

source

我花了几个月的时间分析来自传感器、调查和日志的数据。不管我制作了多少图表,算法有多复杂,结果总是误导人。

对数据扔一个随机的森林,就跟给它注射病毒一样。一种病毒,除了损害您的洞察力之外别无其他意图,就好像您的数据是垃圾一样。

更糟糕的是,当你向首席执行官展示你的新发现时,哎呀,你猜怎么着?他/她发现了一个缺陷,一些闻起来不对劲的东西,你的发现与他们对领域的理解不匹配— 毕竟,他们是领域专家,比你,作为分析师或开发人员的你更了解。

立刻,血液涌上你的脸,你的手在颤抖,片刻的沉默,然后,可能是道歉。

那一点也不差。如果你的发现被当作一种保证,而你的公司最终根据它们做出了决定,那会怎么样?。

你摄入了一堆脏数据,没有清理干净,你告诉你的公司对这些结果做一些事情,结果证明是错误的。你会有大麻烦的!。

不正确或不一致的数据会导致错误的结论。因此,您对数据的清理和理解程度对结果的质量有很大的影响。

维基百科上给出了两个真实的例子。

例如,政府可能希望分析人口普查数据,以决定哪些地区需要在基础设施和服务方面进一步支出和投资。在这种情况下,获得可靠的数据以避免错误的财政决策是非常重要的。

在商业世界中,不正确的数据可能代价高昂。许多公司使用客户信息数据库来记录联系信息、地址和偏好等数据。例如,如果地址不一致,公司将承受重新发送邮件的成本,甚至失去客户。

垃圾进,垃圾出。

事实上,一个简单的算法可以胜过一个复杂的算法,只是因为它被给予了足够多和高质量的数据。

高质量的数据胜过花哨的算法。

由于这些原因,有一个逐步的指导方针,一个备忘单,通过要应用的质量检查是很重要的。

但是首先,我们要达到的目标是什么?。优质数据是什么意思?。质量数据的衡量标准是什么?。在采取任何行动之前,理解你试图完成的目标,你的最终目标是至关重要的。

索引:

数据质量

坦率地说,除了维基百科上的那个解释,我找不到更好的解释了。所以,我在这里总结一下。

有效期

数据符合定义的业务规则或约束的程度。

  • 数据类型约束: 特定列中的值必须是特定的数据类型,如布尔、数值、日期等。
  • 范围约束: 通常情况下,数字或日期应该在一定的范围内。
  • 强制约束 : 某些列不能为空。
  • 唯一约束: 一个字段或字段组合在整个数据集中必须是唯一的。
  • 集合成员约束 : 列的值来自一组离散值,例如枚举值。例如,一个人的性别可能是男性,也可能是女性。
  • 外键约束 : 与在关系数据库中一样,外键列不能有不存在于被引用主键中的值。
  • 正则表达式模式:必须采用特定模式的文本字段。例如,电话号码可能需要具有(999)999–9999 的模式。
  • 跨字段验证:跨多个字段的某些条件必须成立。例如,患者的出院日期不能早于入院日期。

准确(性)

数据接近真实值的程度。

虽然定义所有可能的有效值可以很容易地发现无效值,但这并不意味着它们是准确的。

一个有效的街道地址可能实际上并不存在。一个有效的人的眼睛颜色,比如蓝色,可能是有效的,但不是真实的(不代表现实)。

另一个需要注意的是准确度和精确度的区别。说你生活在地球上,实际上是真的。但是,不精确。究竟在哪里?。说你住在特定的街道地址更准确。

完全

所有必需数据的已知程度。

由于各种原因,数据会丢失。如果可能的话,你可以通过质疑原始资料来缓解这个问题,比如重新采访对象。

很有可能,这个主题要么给出一个不同的答案,要么将很难再次触及。

一致性

同一数据集内或跨多个数据集的数据一致性程度。

当数据集中的两个值相互矛盾时,就会出现不一致。

一个有效的年龄,比如 10 岁,可能与婚姻状况不符,比如离婚。一个客户记录在两个不同的表中,有两个不同的地址。

哪个是真的?。

同样

使用相同度量单位指定数据的程度。

重量可以用磅或公斤来记录。日期可能遵循美国格式或欧洲格式。货币有时是美元,有时是日元。

因此数据必须转换成单一的测量单位。

工作流程

该工作流程由三个步骤组成,旨在产生高质量的数据,并考虑到我们谈到的所有标准。

  1. 检测:检测意外的、不正确的和不一致的数据。
  2. 清理:修复或清除发现的异常。
  3. 验证:清洗后,检查结果以验证正确性。
  4. 报告:记录有关所做更改和当前存储数据质量的报告。

你所看到的连续过程实际上是一个迭代的、无止境的过程。当检测到新的缺陷时,可以从验证到检查。

检查

检查数据非常耗时,并且需要使用多种方法来探索底层数据以进行错误检测。以下是其中的一些:

数据剖析

关于数据的汇总统计,称为数据剖析,对于给出数据质量的一般概念非常有帮助。

例如,检查特定的列是否符合特定的标准或模式。数据列是记录为字符串还是数字?。

缺少多少个值?。一列中有多少个唯一值,以及它们的分布情况?。这个数据集与另一个数据集有联系或有关系吗?。

形象化

通过使用统计方法(如平均值、标准偏差、范围或分位数)分析和可视化数据,可以找到意想不到的错误值。

例如,通过可视化各国的平均收入,人们可能会看到一些*****(链接有图片)。有些国家的人比其他任何人挣得都多。这些异常值值得研究,不一定是不正确的数据。***

软件包

您的语言中有几个可用的软件包或库,可以让您指定约束并检查违反这些约束的数据。

此外,它们不仅可以生成违反了哪些规则以及违反了多少次的报告,还可以创建一个图表,显示哪些列与哪些规则相关联。

********

source

比如年龄不能是负数,身高也不能是负数。其他规则可能涉及同一行或跨数据集的多列。

清洁

根据问题和数据类型,数据清理涉及不同的技术。可以应用不同的方法,每种方法都有自己的利弊。

总的来说,不正确的数据要么被删除,纠正,或估算。

无关数据

不相关的数据是那些实际上不需要的,并且不适合我们试图解决的问题的上下文的数据。

例如,如果我们正在分析关于人口总体健康状况的数据,电话号码就没有必要了— 列式

同样,如果你只对一个特定的国家感兴趣,你不会想包括所有其他国家。或者,只研究那些去做手术的患者,我们不会包括每个人— 按行排列

只有当你确定某个数据不重要的时候,你才可以丢弃它。否则,探索特征变量之间的相关矩阵。

即使你注意到没有相关性,你也应该向领域专家请教。你永远不知道,一个看似不相关的特性,从某个领域的角度,比如从临床的角度,可能是非常相关的。

复制

重复数据是数据集中重复的数据点。

这种情况经常发生,例如

  • 来自不同来源的数据被组合在一起
  • 用户可能会按两次提交按钮,认为表单并没有真正提交。
  • 提交了两次在线预订请求,以更正第一次意外输入的错误信息。

一个常见的症状是两个用户拥有相同的身份号码。或者说,同一篇文章报废了两次。

因此,它们应该被简单地移除。

类型转换

确保数字存储为数字数据类型。日期应该存储为 date 对象,或者 Unix 时间戳(秒数),等等。

如果需要,分类值可以与数字相互转换。

通过查看摘要中每一列的数据类型,可以很快发现这一点(我们已经在上面讨论过)。

需要注意的是,不能转换为指定类型的值应该转换为 NA 值(或任何值),并显示警告。这表明该值不正确,必须修正。

语法错误

删除空格:应该删除字符串开头或结尾多余的空格。

**"   hello world  " => "hello world**

填充字符串:字符串可以用空格或其他字符填充到一定宽度。例如,一些数字代码通常用前置零表示,以确保它们总是具有相同的位数。

**313 => 000313 (6 digits)**

修复错别字:字符串可以用许多不同的方式输入,难怪会有错误。

****Gender**
m
Male
fem.
FemalE
Femle**

这个分类变量被认为有 5 个不同的类,而不是预期的 2 个:男性和女性,因为每个值都不同。

一个条形图有助于可视化所有的唯一值。人们可以注意到一些价值是不同的,但确实指的是同一个东西,即“信息技术”和“IT”。或者,也许只是大写的不同,即“其他”和“其他”。

所以我们的职责就是从上面的数据中识别出每个值是男是女。我们如何做到这一点?。

第一种解决方案是手动将的每个值映射到的“男性”或“女性”。

**dataframe['gender'].map({'m': 'male', fem.': 'female', ...})**

第二种解决方案是使用模式匹配。例如,我们可以在字符串开头的性别中查找 M 或 M 的出现。

**re.sub(r"\**^m**\$", '**Male**', '**male**', flags=re.**IGNORECASE**)**

第三个解决方案是使用模糊匹配:一种识别预期字符串和每个给定字符串之间距离的算法。它的基本实现是计算将一个字符串转换成另一个字符串需要多少次操作。

****Gender   male  female**
m         3      5
Male      1      3
fem.      5      3
FemalE    3      2
Femle     3      1**

此外,如果您有一个城市名称这样的变量,您怀疑拼写错误或类似的字符串应该被同样对待。比如“里斯本”可以输入为“里斯本”、“里斯本”、“里斯本”等。

****City     Distance from "lisbon"** lisbon       0
lisboa       1
Lisbon       1
lisbona      2
london       3
...**

如果是这样的话,那么我们应该用一个唯一的值来代替所有意义相同的值。在这种情况下,用“lisbon”替换前 4 个字符串。

注意像“0”、“不适用”、“NA”、“None”、“Null”或“INF”这样的值,它们可能意味着相同的事情:值丢失。

使标准化

我们的职责不仅是识别错别字,还要将每个值放入相同的标准化格式中。

对于字符串,确保所有值都是小写或大写。

对于数值,请确保所有值都有特定的度量单位。

例如,高度可以用米和厘米来表示。1 米的差异被认为与 1 厘米的差异相同。所以,这里的任务是将高度转换成一个单位。

对于日期,美国版本与欧洲版本不同。将日期记录为时间戳(毫秒数)不同于将日期记录为 date 对象。

缩放/转换

缩放意味着转换数据,使其符合特定的比例,如 0–100 或 0–1。

例如,学生的考试分数可以重新调整为百分比(0-100),而不是 GPA(0-5)。

它还可以帮助使某些类型的数据更容易绘制。例如,我们可能希望减少偏斜度来帮助绘图(当有这么多异常值时)。最常用的函数是对数、平方根和倒数。

具有不同测量单位的数据也可以进行缩放。

学生在不同考试中的成绩,比如 SAT 和 ACT,是无法比较的,因为这两种考试的规模不同。1 次 SAT 成绩的差异被视为与 1 次 ACT 成绩的差异相同。在这种情况下,我们需要重新调整 SAT 和 ACT 分数来取数字,比如说,在 0-1 之间。

通过缩放,我们可以绘制和比较不同的分数。

正常化

虽然归一化也会将值重新调整到 0-1 的范围内,但这里的目的是转换数据,使其呈正态分布。为什么?**

在大多数情况下,如果我们要使用依赖于正态分布数据的统计方法,我们会对数据进行归一化。如何?**

可以使用日志功能,或者使用这些方法中的一种

根据使用的缩放方法,数据分布的形状可能会发生变化。例如,“标准 Z 分数”和“学生的 t 统计量”(在上面的链接中给出)保留了形状,而 log 函数可能不会。

********

Normalization vs Scaling (using Feature scaling) — source

缺少值

鉴于缺失的价值观是不可避免的,这就给我们留下了一个问题,当我们遇到它们时该怎么办。忽略缺失的数据就像在船上挖洞一样;它会下沉。

有三种或者更多的方法来处理它们。

—一个。放下。

如果一列中的缺失值很少发生并且是随机发生的,那么最简单和最直接的解决方案是删除有缺失值的观察值(行)。

如果该列的大部分值都丢失了,并且是随机发生的,那么通常的决定是删除整个列。

这在进行统计分析时特别有用,因为填充缺失值可能会产生意外或有偏差的结果。

—两个。估算。

它意味着根据其他观察值计算缺失值。有很多方法可以做到这一点。

—首先是,一个是使用统计值,如平均值、中位数。然而,这些都不能保证数据的无偏性,尤其是在有许多缺失值的情况下。****

当原始数据没有偏斜时,平均值最有用,而中值更稳健,对异常值不敏感,因此在数据偏斜时使用。

在正态分布的数据中,可以得到平均值的两个标准偏差以内的所有值。接下来,通过在(mean — 2 * std) & (mean + 2 * std)之间生成随机数来填充缺失值

**rand = np.random.randint(average_age - 2*std_age, average_age + 2*std_age, size = count_nan_age)dataframe["age"][np.isnan(dataframe["age"])] = rand**

—第二个。使用线性回归。基于现有的数据,我们可以计算出两个变量之间的最佳拟合线,比如说,房价与面积 m。****

值得一提的是,线性回归模型对异常值很敏感。

—第三个热卡:从其他类似记录中复制数值。只有当您有足够的可用数据时,这才有用。并且,它可以应用于数值和分类数据。****

我们可以采用随机方法,用一个随机值来填充缺失值。将这种方法更进一步,可以首先根据某种特征,比如性别,将数据集分成两组(strata) ,然后随机地分别填充不同性别的缺失值。

顺序热卡插补中,根据辅助变量(s )对包含缺失值的列进行排序,以便具有相似辅助变量的记录顺序出现。接下来,用第一个可用记录的值填充每个缺失值。

更有趣的是,还可以使用 𝑘最近邻插补,该插补将相似的记录分类并放在一起。然后通过首先找到最接近具有缺失值的记录的𝑘记录来填充缺失值。接下来,从𝑘最近邻中选择(或计算出)一个值。在计算的情况下,可以使用像平均值(如前所述)这样的统计方法。

—三个。旗帜。

一些人认为,无论我们使用什么样的估算方法,填充缺失值都会导致信息的丢失。

这是因为说数据丢失本身就是信息性的,算法应该知道这一点。否则,我们只是通过其他功能来强化已经存在的模式。

当丢失的数据不是随机发生时,这一点尤其重要。以一项调查为例,来自特定种族的大多数人拒绝回答某个问题。

缺失的数字数据可以用比如说 0 来填充,但是在计算任何统计值或绘制分布图时必须忽略这些零。

分类数据可以用比如说“缺失”来填充:一个新的类别,它表明这段数据缺失。

—考虑到…

缺失值与默认值不同。例如,零可以解释为缺失或缺省,但不能同时解释为缺失和缺省。

缺失值不是“未知”。一项进行的研究表明,一些人不记得他们是否在学校被欺负过,应该被视为未知,而不是失踪。

每次我们丢弃或估算价值时,我们都在丢失信息。因此,萎靡不振可能会有所帮助。

极端值

它们是与所有其他观察结果显著不同的值。任何数据值距离 Q1 和第三季度四分位数超过(1.5 * IQR)都被视为异常值。

在被证明有罪之前,局外人是无辜的。也就是说,除非有充分的理由,否则不应删除它们。

例如,可以注意到一些不太可能发生的奇怪、可疑的值,因此决定删除它们。不过,它们值得在移除前进行调查。

还值得一提的是,一些模型,如线性回归,对异常值非常敏感。换句话说,离群值可能会使模型偏离大部分数据所在的位置。

记录内和跨数据集错误

这些错误是由于在同一行或不同的数据集中有两个或多个相互矛盾的值造成的。

例如,如果我们有一个关于城市生活成本的数据集。total 列必须等于房租、交通费和伙食费的总和。

****city       rent  transportation food  total**
libson     500        20         40    560
paris      750        40         60    850**

同样,孩子也不能结婚。一个员工的工资不能少于计算出来的税金。

同样的想法也适用于跨不同数据集的相关数据。

验证

完成后,应该通过重新检查数据并确保规则和约束成立来验证正确性。

例如,在填写完丢失的数据后,他们可能会违反任何规则和约束。

如果不可行的话,它可能涉及一些手动校正。

报告

报告数据的健康程度对于清理同样重要。

如前所述,软件包或库可以生成关于所做更改、违反了哪些规则以及违反了多少次的报告。

除了记录违规,还应该考虑这些错误的原因。为什么它们会首先发生?。

最后的话…

如果你做到了,我很高兴你能坚持到最后。但是,如果没有质量文化,上面提到的一切都没有价值。

无论验证和清理过程有多强大,随着新数据的到来,人们将继续遭受损失。

与其花时间和精力去治疗疾病,不如预防疾病。

这些问题有助于评估和提高数据质量:

数据是如何收集的,在什么条件下收集?。收集数据的环境确实重要。环境包括但不限于位置、时间、天气条件等。**

在去上班的路上询问受试者对的看法和在家里是不一样的。在一项研究中,使用平板电脑回答问卷有困难的患者可能会丢掉结果。**

数据代表什么?。包括所有人吗?只有城里的人?。或者,也许只有那些选择回答的人,因为他们对这个话题有强烈的看法。

清洗数据的方法有哪些,为什么?。不同的方法在不同的情况下或者不同的数据类型下可能会更好。

您是否投入时间和金钱来改进流程?。投资于人员和流程与投资于技术同样重要。

最后,…不用说,

感谢您的阅读!

请随意联系 LinkedIn 或 Medium。

使用 Python 正则表达式模块的最终指南

原文:https://towardsdatascience.com/the-ultimate-guide-to-using-the-python-regex-module-69aad9e9ba56?source=collection_archive---------8-----------------------

原始模式查找器

处理文本数据的主要任务之一是创建大量基于文本的要素。

人们可能希望找出文本、电子邮件(如果在文本中出现的话)以及大文本中的电话号码中的某些模式。

虽然实现这样的功能听起来很简单,但是如果我们使用 Python 的 regex 模块,就会简单得多。

例如,假设你的任务是找出一段特定文本中标点符号的数量。这里引用了狄更斯的文字。

你通常是怎么做的?

一个足够简单的方法是这样做:

target = [';','.',',','–']string = "**It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way – in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.**"num_puncts = 0
for punct in target:
    if punct in string:
        num_puncts+=string.count(punct)print(num_puncts)
------------------------------------------------------------------
19

如果我们没有 re 模块的话,那就太好了。对于 re,它只有两行代码:

import re
pattern = r"[;.,–]"
print(len(re.findall(pattern,string)))
------------------------------------------------------------------
19

这篇文章是关于一个最常用的正则表达式模式和一些我经常使用的正则表达式函数。

什么是regex

更简单地说,正则表达式(regex)用于在给定的字符串中查找模式。

我们想找到的模式可能是任何东西。

我们可以创建类似电子邮件或手机号码的模式。我们可以创建模式,从字符串中找出以 a 开头以 z 结尾的单词。

在上面的例子中:

import repattern = r'[,;.,–]'
print(len(re.findall(pattern,string)))

我们想要找出的模式是r’[,;.,–]’。这个模式捕获了我们想要捕获的 4 个字符中的任何一个。我发现 regex101 是测试模式的好工具。这是模式应用于目标字符串时的样子。

正如我们所看到的,我们能够根据需要在目标字符串中找到所有出现的,;.,–

每当我需要测试一个正则表达式时,我都会使用上面的工具。比一遍又一遍地运行 python 程序要快得多,调试也容易得多。

现在我们知道我们可以在目标字符串中找到模式,但是我们如何真正创建这些模式呢?

创建模式

使用 regex 时,我们需要学习的第一件事是如何创建模式。

我将逐一介绍一些最常用的模式。

正如您所想的,最简单的模式是一个简单的字符串。

pattern = r'times'string = "**It was the best of times, it was the worst of times.**"print(len(re.findall(pattern,string)))

但这不是很有用。为了帮助创建复杂的模式,regex 提供了特殊的字符/操作符。让我们一个一个地看一下这些操作符。请等待加载 gif 文件。

1.[] 操作员

这是我们在第一个例子中使用的。 我们想在这些方括号中找到任意字符的一个实例。

[abc] -将找到 a 或 b 或 c 的所有出现

[a-z] -将查找 a 到 z 的所有事件。

[a-z0–9A-Z] -将查找 A 到 Z、A 到 Z 和 0 到 9 的所有事件。

在 Python 中,我们可以很容易地使用如下模式:

pattern = r'[a-zA-Z]'string = "**It was the best of times, it was the worst of times.**"print(len(re.findall(pattern,string)))

除了.findall之外,regex 中还有其他功能,但我们稍后会谈到。

2.点运算符

点运算符(。)用于匹配除换行符以外的任何字符的单个实例。

关于操作符最好的部分是我们可以把它们结合在一起使用。

例如,我们想找出字符串中以小写 D 或大写 D 开头,以长度为 6 的 e 结尾的子字符串。

3.一些元序列

在使用 regex 时,有一些模式我们会反复使用。所以 regex 为它们创建了一些快捷方式。最有用的快捷方式是:

\w,匹配任何字母、数字或下划线。相当于[a-zA-Z0–9_]

\W,匹配除字母、数字或下划线以外的任何内容。

\d,匹配任意十进制数字。相当于[0–9]

\D,匹配除十进制数字以外的任何数字。

4.加号和星号运算符

点字符用于获取任何字符的单个实例。如果我们想找到更多。

加号字符+,用于表示最左边字符的一个或多个实例。

星形字符*,用于表示最左边字符的 0 个或多个实例。

比如我们想找出所有以 d 开头以 e 结尾的子串,我们可以在 d 和 e 之间有 零个字符或者更多的字符 我们可以用:d\w*e

如果我们想找出所有以 d 开头以 e 结尾的子串,并且在 d 和 e 之间至少有一个字符,我们可以使用:d\w+e

我们也可以通过{}使用更通用的方法

\w{n} -重复\wn 次。

\w{n,} -重复\w至少 n 次以上。

\w{n1, n2} -重复\w至少 n1 次,但不超过 n2 次。

5.^脱字符和$ 美元符。

^匹配字符串的开头,$匹配字符串的结尾。

6.单词边界

这是一个重要的概念。

你有没有注意到在上面的例子中我总是匹配子串而不是一个单词?

那么,如果我们想找到所有以 d 开头的单词呢?

可以用d\w*做图案吗?让我们看看如何使用网络工具。

正则表达式函数

到目前为止,我们只使用了re包中的findall函数,但是它还支持更多的函数。让我们一个一个地研究这些函数。

1.findall

我们已经用了findall。这是我最常使用的正则表达式函数之一。让我们更正式地理解它。

输入: 模式和测试字符串

输出: 字符串列表。

#USAGE:pattern = r'[iI]t'
string = "**It was the best of times, it was the worst of times.**"matches = re.findall(pattern,string)for match in matches:
    print(match)------------------------------------------------------------
It
it

2.搜索

输入: 模式和测试字符串

输出: 定位第一个匹配的对象。

#USAGE:pattern = r'[iI]t'
string = "**It was the best of times, it was the worst of times.**"location = re.search(pattern,string)
print(location)------------------------------------------------------------
<_sre.SRE_Match object; span=(0, 2), match='It'>

我们可以使用以下方法获取这个位置对象的数据

print(location.group())
------------------------------------------------------------
'It'

3.代替者

这是另一个伟大的功能。当你使用 NLP 时,有时你需要用 X 来代替整数。或者你可能需要编辑一些文件。在任何文本编辑器中只有基本的查找和替换。

输入: 搜索模式、替换模式和目标字符串

输出: 被替换的字符串

string = "It was the best of times, it was the worst of times."
string = re.sub(r'times', r'life', string)
print(string)
------------------------------------------------------------
It was the best of life, it was the worst of life.

一些案例研究:

当需要验证时,在许多情况下使用正则表达式。你可能在网站上看到过类似“这不是一个有效的电子邮件地址”的提示。虽然可以使用多个 if 和 else 条件来编写这样的提示,但是 regex 可能是这种用例的最佳选择。

1.PAN 编号

在印度,我们用 PAN 号而不是美国的 SSN 号来识别税号。PAN 的基本验证标准是所有字母必须大写,字符必须按以下顺序排列:

<char><char><char><char><char><digit><digit><digit><digit><char>

所以问题是:

“ABcDE1234L”是有效的 PAN 吗?

如果没有正则表达式,你通常会如何解决这个问题?您很可能会编写一个 for 循环,并在字符串中保留一个索引。使用正则表达式,就像下面这样简单:

match=re.search(r’[A-Z]{5}[0–9]{4}[A-Z]’,'ABcDE1234L')
if match:
    print(True)
else:
    print(False)
-----------------------------------------------------------------
False

2.查找域名

有时我们有一个大的文本文档,我们必须从这个大的文本文档中找出电话号码或电子邮件 id 或域名的实例。

例如,假设您有以下文本:

你需要从这篇文章中找出所有的主要领域- askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org

你会怎么做?

match=re.findall(r'http(s:|:)\/\/([www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string)](http://www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string))
for elem in match:
    print(elem)
--------------------------------------------------------------------
(':', 'www.', 'askoxford.com')
(':', 'www.', 'hydrogencarsnow.com')
(':', 'www.', 'bnsf.com')
(':', '', 'web.archive.org')
(':', 'www.', 'mrvc.indianrail.gov.in')
(':', 'www.', 'mrvc.indianrail.gov.in')

|在这里是 or 运算符,match 返回元组,其中保存了()内的模式部分。

3.查找电子邮件地址:

下面是一个在长文本中查找电子邮件地址的正则表达式。

match=re.findall(r'([\w0-9-._]+@[\w0-9-.]+[\w0-9]{2,3})',string)

这些都是高级的例子,但是如果你试着自己理解这些例子,你应该对提供的信息很满意。

结论

虽然乍一看可能有点令人生畏,但在数据操作、创建特性和寻找模式方面,regex 提供了很大程度的灵活性。

当我处理文本数据时,我经常使用它,在处理数据验证任务时,也可以包含它。

我也是 regex101 工具的粉丝,经常用它来检查我的正则表达式。我想知道如果没有这个令人敬畏的工具,我是否还会使用正则表达式。

另外,如果你想在 了解更多关于 NLP 的知识,这里的是一门很好的课程。您可以免费开始 7 天的免费试用。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter@ ml whiz联系。

解释机器学习模型和预测的博弈论——最终指南

原文:https://towardsdatascience.com/the-ultimate-guide-using-game-theory-to-interpret-machine-learning-c384cbb6929?source=collection_archive---------6-----------------------

第 6 部分—沙普利值和 SHAP 包

这是翻译 ML 教程的第六部分。在以前的帖子中,我们已经介绍了几种解释机器学习模型的方法。在高度可解释的模型中,所有模型都有它们的问题,像回归这样的高偏差模型或者像决策树这样的高方差模型。我们解决了偏差和方差之间的权衡,基本上结合了几个模型,特别是高方差模型,所以我们有了最好的模型,低偏差和低方差,代价是我们不再能控制模型如何做出决策或变量之间的关系,即模型变成了一个黑盒。

第 1 部分— 可解释性介绍
第 2 部分— 统计建模—全语用指南
第 3 部分—解释低偏差和高方差模型。
第 4 部分——有可能解决偏倚和方差之间的权衡吗?
第 5 部分——可解释性的本地方法。
第六部分—(本帖)可解释性的全局方法。

可选项目:
数据科学的范围是什么
统计学简史

在上一篇文章(第 5 部分)中,我们看到了一些解释黑盒模型的局部方法。在本帖中,我们将着眼于更强大、更复杂的全球方法,这些方法可以结合两个世界的优点,即统计模型的可解释性和机器学习模型的灵活性。
我们的黑盒模型代表将是 xgboost,但它可以是任何其他深度神经网络或集成,我们的全局可解释性模型代表将是 Shapley Value,还没有竞争对手。

首先讲一点历史和背景。

这种博弈论是什么?

博弈论是数学的一个分支,研究代理人如何在考虑冲突和合作的不同策略之间进行选择。这有点让人想起经济学的定义,经济学是研究当人们在竞争目标之间拥有稀缺商品(如时间或金钱)时,他们如何做出决定,如早起并在媒体上阅读一篇文章或获得更多睡眠。毫不奇怪,随着约翰·冯·诺依曼(杰出的数学家)和奥斯卡·莫根施特恩(经济学家)的《博弈论与经济行为》一书的出版,博弈论在经济学中被“专业化”了。

Understanding Game Theory is Super Important for Action Learning Machine Models. If your prediction is passive, it only generates an output to analyze, no problem, but if you (or your client) make a decision with that prediction, you are certainly worth studying game theory. Reinforcement Learning algorithms can already solve problems of cooperation and conflict, that is, problems of Game Theory.

那么博弈论(以下仅 GT)和经济学有什么区别呢?博弈论是经济学家了解社会如何做出选择的另一个工具,而 GT 不仅研究社会中的选择,它还被用于许多领域,如计算,逻辑,政治,哲学,新闻,营销和许多其他进化生物学,以解释达尔文进化中的利他行为。博弈论是研究代理人如何在给定他们如何互动的情况下做出最佳决策的领域。这里我们开始更感兴趣,因为机器学习模型的一个问题是变量之间复杂的相互作用。我们继续。

劳埃德·沙普利——博弈论的化身

博弈论,像几乎所有的科学一样,有一个历史演变和几个父母。1713 年的沃尔德格勒夫,1838 年的古诺已经在讨论这个问题了,但是是诺依曼在 20 世纪 30 年代系统化并扩展了这个领域。很多人都知道这个领域的另一位天才,约翰·纳西,他的重要贡献(子博弈中的均衡)使他获得了 1994 年的诺贝尔奖,但我们在这里感兴趣的是 2012 年沙普利和阿尔维姆·罗斯的诺贝尔奖。沙普利被认为是该领域最伟大的理论家,他的一生与 JW 的进化交织在一起,他在不同的领域做出了贡献,如稳定婚姻问题。在 1953 年的著作中,他研究了当代理人有不同的利益/需求时,如何让公平。Shapley 解决了这个问题,但问题仍然存在,它与解释机器学习模型有什么关系?

John Nash, Lloyd Shapley and Leon Petrosyan. Unfortunately I don’t know who the boy in the green t-shirt is but I can guarantee that he is very well matched.

为了传达 Shapley 值(所谓的公允价值),让我们在两个区域之间建立一个关系:Shapley 的合作/竞争代理将是我们的模型(X)变量。他们计划分配的“工作”将是我们目标的方差(y ),每个代理/变量支付的公允价值是该变量在预测中的权重/重要性。

Dictionary Machine Learning <-> Game Theory

沙普利值 e Piscinas

在最初的文章中,著名的机场问题被用在一个人必须决定建造多大的机场跑道以及每个代理商将为这条跑道支付多少费用的地方。我会为自己开脱数学上的严谨,创造一个更接近我们现实的问题(除非你有飞机)。在我们的例子中,
我们住在一栋有 99 名居民的大楼里,并决定建一个游泳池。于是有两个疑问:
1)要建的池子的大小是多少;
2)每人应该贡献多少。

解决这个问题最传统的方法是投票,这个泳池会不会建,有多大,如果建了,我们平摊费用,不管你会不会游泳。

想象我们有三组人住在这栋楼里。第一组人不太喜欢游泳,他们想要一个小游泳池,比如 20 米长的。

  • B) 第二组是休闲游泳者,通常使用游泳池,他们想要一个 30 米的游泳池。
  • C) 最后一组由迈克尔·菲尔普斯和他的朋友组成,他们需要一个位于 50 米公寓的奥运泳池。

Michel Phelps happy to pay the right price on his new 50m pool.

游泳池的每一米都将花费相同的单位,1 美元。因此,如果我们做平均,我们将有一个 33 米的游泳池,价格为 33 美元,而如果我们做 50 米的游泳池,A 组和 B 组将支付比理想情况多得多的费用。Shapley 认为这是一种不公平的成本分配方式,并且对于池大小来说效率低下。为此,他想到了下面的策略。如果我们不考虑总成本,而只考虑边际成本,也就是说,因为其他人已经支付了一部分,所以多付了多少。既然汇款单干扰了结果,我们必须从这些边际成本的期望最低水平开始。因为如果 C 组先来,它将支付最多,而 A 组和 B 组将什么也不支付(同样的事情也发生在机器学习中!).当我们计算这个的时候,欧瑞卡!沙普利价值和公平价格!

Table dividing Pool construction costs by Marginal benefits. Note that we started with group A who would like a 20 meter pool with a marginal cost of 20. So we split this into 3. After that we split the extra cost of the 30 meter (+10) meter pool between B and C, therefore +5 for each. Lastly, the difference from 30 to 50 meters is paid in full by group C.

任何想要 20 米泳池的人都要支付 6.67 英镑,想要 30 米泳池的人要支付 11.67 英镑,在这种情况下,迈克尔·菲尔普斯和他的朋友们将支付 31.67 英镑购买 50 米泳池。每个人都是赢家,这是应该支付的合理价格。

在机器学习中,由于变量总是相互关联的,因此变量进入贡献的顺序有很大的不同。例如,在决策树中,我们可能会在一个非常重要的变量之前随机选择一个次要变量,这将增加错误变量的重要性。为了解决这个问题,我们将平均所有可能的排列/订单的边际贡献,这将是贡献的公允价值。这就是为什么特性的重要性使用起来如此危险。这里是我的警告,不要使用它们,它们通常是不稳定的,而且通常与人类的直觉毫无关系。

Example when we are using Educ and Grit to predict wages. If we add Educ first, its importance will be 300 (real) + 100 (shared with Grit). If we add Grit first, it’s 200 + 100. But when calculating the Shapley Value Let’s find the actual values ​​for the two variables, 300 for Educ and 200 for Grit!

这个理论并不复杂,但它是一个需要等待天才去思考的洞见,我们现在的问题是计算性的。一个已经知道了 60 多年的理论,为什么我们从那时起就不再应用它了?最大的问题是,她在计算上非常昂贵,我们需要等待第二个天才和慈善的灵魂来解决这个问题,并与社区分享。这些人是存在的,他们是斯科特·m·伦德伯格(Scott m . Lundberg)和 T4(Su-in Lee),他们写了精彩的文章解释了如何计算沙普利值,并在【SHAP】(SHapleyAadditive exPlanations)上提供了代码。我们现在可以计算诺贝尔奖和开源软件包支持的变量的数量。我们生活在一个多么美好的世界啊!

解释没有 Shapley 值的黑盒模型

让我们用一个包含房价和特征的数据集作为例子来说明我们的想法(这里有代码)。

让我们用热图和关联图来看一下相关性,以了解重要性的线性顺序:

On the left our famous correlation heatmap, and on the right our correlation graph, both give the same idea, but I always prefer the graph because it gives a better idea of ​​which groups of variables correlate more quickly.

第一个错误是被简单的相关性冲昏了头脑。我们已经在第 2 部分中看到,变量都是相互关联的,当我们运行模型时,重要的是变量相互独立解释的程度,因此解释最多的变量可能解释与目标/ y 方差相同的方差。有时,相关性较低的变量与其他变量(即更具外生性的变量)差异如此之大,以至于它们变得更加重要。一种分析方法是线性回归:

Same regression run twice with pure data (left) and normalized data (right)

现在我们需要小心,估计的 Beta 值(上表的 coef 列)不能被解释为可变权重,因为它取决于 X 方差。例如,纬度变量有一个巨大的系数 6.74e5,但变量 It 的范围从 47,155933 到 47,7777624。
size _ house 变量的系数较小,范围为 290-13540。这里衡量变量重要性的一种方法是看 t 检验,变量越大(绝对值)越重要,或者,正如我更喜欢在运行回归之前归一化数据(右总结)。
请注意,所有指标都是完全相同的,R、误差、t 检验、除了系数值之外的所有指标都是一样的,因为我们可以对数据进行归一化,并且可以直接比较这些值,而不会丧失一般性。因为我们已经失去了一些读取估计系数的敏感性,所以对线性回归进行归一化是不常见的。只有当我们使用正则化方法时,才有必要进行归一化。

此外,请记住,除非明确传递,否则线性回归不了解变量如何相互作用,因此它们可能有一些变量,即使相关性很差,也可以通过使模型更具解释性来帮助改变其他变量的权重。最后,我们的致命弱点是,这是一个线性模型,因此任何非线性都必须明确传递,否则它将成为偏差。所有这些都将在本系列的第 2 部分中得到最好的探讨。

Why we don’t use Xtreme Gradient Boosting

让我们使用我们的 Megazord 算法 XGBoost,它几乎解决了所有这些问题,因为它是一个低偏差算法(由于树结构,参见第 3 部分)和低方差算法,因为它是一个非常聪明的单个树组件(参见第 4 部分),并且低于 XGBoost 产生的 5 个特征重要性:

The 5 feature importance types available from XGBoost, I don’t recommend using any, but if you’re in a hurry, go with Total Cover.

用哪个?我可以写一篇很长的文章来解释每一个的机制,它的优点和缺点,但是如果我们说:不要使用它,我们很快就会知道 Shapley 值!

Summary of the different methods of ordering the importance of variables. The order of the variables in the first column is the * fair * order with Shapley value and the only method that can put the variables in the same order, in this case, was Total Cover, and although the order is the same, the dimensions are different.

用 Shapley 值解释黑盒模型

这里,我们将删除算法的所有参数化,只关注 SHAP,但必须完成控制偏差和方差之间的权衡、插补、平衡和其他步骤的所有步骤,否则模型可能会解释错误的变量。训练完模型后,我们执行以下操作:

要运行 shap,只需两行:

解释者= shap。tree explainer(model)
shap _ values = explainer . shap _ values(X)

神奇的事情发生后,首先是我们的功能重要性

Feature importance with Shapley Value, among several advantages, such as having a solid theory behind, being more like human intuition, being stable, answers a number of mathematical axioms that can be found in the original paper.

以下是我们扩展的功能重要性,以及一些有趣的见解:

Detailed Importance Feature.

这个图表第一次看的时候很吓人,但是让我们看看它的不同维度。

它由点(这些彩色点)组成,数据集中的每个观察值为每个变量生成一个点,即使变量为空并由灰点表示。请注意,变量的顺序与特征重要性顺序相同,这不是偶然的,它是通过将颜色表的所有权重相加而形成的。

另一个维度是分布的形状,当你有一大堆点时,它把球堆成躺着的小提琴的形式。

第三个维度是点的位置,注意在零点有一个垂直轴,这个轴上的点表示变量没有积极或消极的影响,如果点在这条线的右边,它积极地影响目标,而在左边,消极地,离轴越远,影响越大。

第四个也是最后一个维度是球的颜色,但这更简单,蓝点表示低值,红点表示高值,这是为每个变量做的。

了解不同的维度让我们分析结果。首先,我们有房子大小这个变量,正如标准化回归告诉我们的,大房子对价格有正面影响,小房子有负面影响,这很明显,但我们走得更远。请注意,0 轴右侧的分布有一个长尾,蓝色已经全部集中在 0 附近,这表明非线性,大房子影响很大,但通过减小房子的大小,模型不再对房子的大小敏感,好像房子的大小只在阈值之后才重要。

is_waterfront 变量也有这种解释,但在这种情况下,它是一个哑变量(只取值 0 和 1),在线性回归中,我们应该只有一个影响值用于此变量,但在分析汇总时,我们有不同的值。为什么?因为模型允许变量通过改变它们的值来相互作用。

分析个人预测

这个软件包的另一个巨大优势是能够向我们解释一个特定的预测,让我们用一个单独的数据集来预测它的价格:

Explaining the prediction of the first row of the dataset. This house has a 240k yhat. Note that Shapley Values ​​values ​​do not understand the entire house value, as they only represent the difference to the average value.

在这里,具有这些特征的房子的预测价值是 240097 美元。每个变量用一个彩色条表示,并表示它对预测的影响。蓝色条减少预测值,红色条增加预测值。

第二个例子是:

The same variable can have different weights or even different signals, because in low bias models like Boosting, the variables can interact in complex ways.

有人会想,如果我们对所有的观测数据旋转这些预测,把这些条像塔一样堆叠起来,我们就能从宏观上看到变量的行为。作者也想过,但他们把这座塔转了 90 度:

We can notice that both the impact of the variables

这个图表的一个有趣的特点是它是交互式的,你可以过滤特定的变量,按不同的影响排序,并对变量在你的模型中如何工作有丰富的见解。

最好的是最后,变量之间的依赖图。

这些图表显示了变量如何相互作用,改变彼此的值。让我们关注右上图。房子的大小。请注意,它正在增长,甚至让人联想到线性增长,但为什么对于相同的房屋大小值,预测会有不同的影响?让我们把重点放在 4000u 大小的房子上。影响有很大的差异,因为其他变量与大小相互作用。尤其是纬度变量(赋予点颜色)。请注意,对于 2000u 以下的房屋,低纬度(蓝色)增加了房屋的价值,而在 2000u 之后,情况就相反了,
高纬度增加了同样大小的房屋的价值。当我们更仔细地分析数据时,我们注意到纬度较高的地方是城市中心湖边的房子,随着纬度的降低,这些房子变成了田地房子,更大的土地。

Example of interacting variables. Here we see the value of the latitude variable changing the return of house size to house price, and the real-world explanation lies in the nonrandom distribution of real estate. Houses near the lake are smaller and more expensive, and houses far from the center are usually less expensive per square meter and larger.

如果我们有一个线性模型,这些点必须排列在一条线上。但是由于这是一个低偏差模型,他可以理解这些复杂的行为。要进行真正的测试,让我们运行相同的 XGBoost,但 max_depth = 1,因此模型仍然可以理解非线性,但不能与变量交互,结果正如预期的那样,消除了相同 X 值的预测方差:

Trained model with maximum depth of only 1 tree break. Note that for the same size_house or latitude there is always only one impact value on the target as the variables stop interacting.

究竟如何解读沙普利价值?

Shapley value of a feature is its contribution to target prediction, weighted and summed over all possible permutations between features.

我们已经说过,这是由坚实的理论支持的划分变量权重的唯一公平的方法。但是这个数字的确切解释是什么呢?

Shapley 值是该特征对预测值和平均值之间的差异的贡献,即我们到目前为止分析的所有数字都必须根据平均值进行解释。这在单个预测图中很容易看到,因为对于房价预测,我们几乎没有影响价格的变量,因为实际上它们正在改变预测的平均值。

次要用途

这可能的用途非常广泛,在作者的 github 库中,他给出了其他非常酷的用途,如排序、自然语言和图像,下面是一些来自那里的例子:

Risk of death by age. The interpretation would be as follows: If you are under 40 you are more likely to die for women. But if you are a woman and succeed and survive at age 40, the likelihood of death drops sharply and increases if you are a man.

SHAP 只为模特工作吗?

SHAP typically works with deep learning models.

不,SHAP 可以将深度神经网络应用到不同的环境中!

In this example the author uses a deep neural network to predict the species of animal, and the SHAP is able to display which pixels (since each pixel is a feature) impacts the predictions more or less.

Similar to the previous explanation. Here Slundberg uses the classic MNIST dataset to explain digit predictions.

现在,你已经拥有了这个打开机器学习算法黑匣子的伟大工具,不要只是做出被动的预测,你现在可以向你的经理解释什么是推动你的业务的最佳杠杆。我必须开发的一个真实的例子是欺诈预测,在这种情况下,仅仅显示合同欺诈的可能性是不够的,我需要解释为什么这种联系被认为是欺诈,SHAP 帮助了我。例如,这可能有助于理解如何防范未来的欺诈。

我经常使用 shap 的另一个用途是在统计建模中。我们可以运行一个类似 XGBoost 的模型来了解变量的行为,哪些变量与哪些变量的交互更多,以回到我们节省时间的线性模型。

我使用 SHAP 的最后一个用途是了解我的模型是否有泄漏,即作为未来变量的信息泄漏。当我们对数据建模时,这是很常见的,我们无法控制表的构造,因为在绘制摘要时,最能说明问题的空值是明显的,Shap 值的一角会出现一系列灰点。

SHAP is also your friend when debugging your model.

也就是说,你可以使用 SHAP:
—了解你的模型在做什么,从而更加信任它;
—特色工程调试;
——应用这些预测帮助人类决策。例如,如果员工离开公司的概率很高,
如果解释变量可以是工资或其经理,则解决方案会有很大不同。
—帮助将因果推理模型建模为线性回归。

Beware, although it is a fairly robust method, it does not mean that your estimates are causal. For a causal analysis all measures of the statistical booklet remain valid.

这篇文章中使用的所有代码都可以在 kaggle 中找到

另请参阅我们的系列文章:

LinkedIn GitHub

对 Coursera 上学习如何学习课程的深入评论

原文:https://towardsdatascience.com/the-ultimate-skill-learning-how-to-learn-9e2fabdc7f1e?source=collection_archive---------7-----------------------

如果你想学点什么,就要学会如何学习

@mrdbourke studying at a desk. Outtake from the video version of this article on YouTube.

如果你能拥有任何超能力,那会是什么?

飞行?

隐形?

超强实力?

当我年轻的时候,我的回答总是‘我有超能力去使用任何超能力。’相当于精灵出现时许下更多的愿望。

如果你再问我一次,我会修改我的答案。

我会有学习任何东西的超能力。

类似,但不是太多的逃避。

但是如果你可以选择任何一种超能力,为什么还要费神去学呢?为什么不直接去了解一切呢?

因为学习是有趣的部分。什么都知道会是一种无聊的生活。你见过一个 4 岁的孩子如何走进公园吗?现在和 40 岁的人相比。

如果你能学会如何学习,你就能把它应用到任何其他技能上。想学编程?运用你的学习能力。想学中文?运用你的学习能力。

为了提高我的学习能力,我参加了 Coursera 上的学习如何学习课程。这是有史以来最受欢迎的在线课程之一。我知道为什么。

它以简单易懂的方式教授。这些概念可以立即应用。甚至在整个课程中,当你在第 1 部分学到一些东西时,它会在第 2、3 和 4 部分再次出现,强化新的信息。

如果你以前看过这个课程,并且正在考虑报名,那么现在就关闭这篇文章,这样做是值得的。

否则,请继续阅读一些我最喜欢的外卖清单。

第一部分——什么是学习?

集中和分散的思维

这样的问题怎么回答?什么是学习?

本课程通过结合两种思维方式,集中和分散,对其进行分解。

集中思考包括致力于一个单一的任务。比如看这个帖子。你正在集中精力去理解屏幕上的单词是什么意思。

当你不专注于任何事情时,就会出现分散思维。你可能在大自然中散步或躺在床上准备睡觉时经历过这种情况。没有思想,但同时,所有的思想。

学习发生在这两种思维的交叉点上。

你专注于某件事一段时间,然后休息一下,让你的想法扩散。

If the brain was a flashlight, focused thinking would be a single intense beam of light. And diffused thinking would be a wider but less intense beam.

你有多少次被困在一个问题上,然后在淋浴时想到答案?

这是两种思维在起作用的一个例子。它也不总是有意识地发生。

你是否曾经不知道下一步该做什么,把它留了一夜,回来后立刻看到了解决方案?

如果你想学点什么,利用这两种思维是很重要的。把集中注意力的紧张时期和无所事事的紧张时期结合起来。

学习结束后,散散步,打个盹儿或者无所事事。别为此难过。你给了自己最好的机会让分散的思维去做它的事情。

拖延症和如何克服拖延症

你在解决一个问题。你到达了一个难点。继续下去很不舒服所以你开始觉得不开心。为了修复这种感觉,你寻找一些愉快的事情。你打开另一个标签,脸书。您会看到红色通知并点击它们。有人和你联系的感觉真好。你知道莎拉邀请你参加她的生日。你看看邀请名单,加里也在。加里在那里。你不太喜欢加里。在中学的时候,他是个混蛋。嘿兄弟!他拍你的背时会大叫。很难。多滚动一点。一些新鞋的广告。你昨天看到的那些。“它们看起来真不错,黑色配橙色,”“我要去点它们,”你想。

你低头看你的笔记。你忘了你在哪里。

刚刚到底发生了什么?

你在解决一个问题。你到达了一个困难点。这很不舒服,你开始感到不开心。你寻找快乐的事情。成功了。但只是暂时的。现在你又回到了原来的位置,你甚至对自己分心的事实感到更加沮丧。

那么怎么修呢?

课程建议使用番茄工作法。我可以为这一个担保。

很简单。

你设置了一个计时器,在此期间除了你想做的事情什么也不做。即使变得困难,你也要继续努力,直到计时器结束。

一个典型的番茄定时器是 25 分钟,之后有 5 分钟的休息时间。在休息期间,你可以在开始另一个 25 分钟的会议之前做任何你想做的事情。

但是您可以使用工作/休息时间的任意组合。

例如,为了完成这个课程,我用了 1 小时的番茄计时器,中间有 15-30 分钟的休息时间。

一个小时的学习。
15 分钟休息。
1 小时学习。
15 分钟休息。
1 小时学习。
30 分钟休息。
1 小时学习。

如果 25 分钟太长了,那就从 10 分钟开始,一路向上。

为什么这样做有价值?

因为你无法控制是否能解决一天工作结束前出现的每一个问题。

但是你可以控制你投入的时间和精力。

可以控制:一天 4 小时的专注工作。

不能控制:解决一天中的每一道作业题。

用睡眠的方式更好地学习

我们已经讨论过集中思考和分散思考。睡眠也许是进行无意识扩散思维的最佳方式。

专注模式对于脑细胞就像举重对于肌肉一样重要。你在瓦解他们。

睡眠为它们提供了一个修复和形成新连接的机会。

Dr Terrence Sejnowski talks about how new synapses (connections) are formed on the dendrites during sleep.

像爱因斯坦和萨尔瓦托勒·达利这样的著名思想家会一次睡 10 个小时,并且一天打几次盹,这是有原因的。

他们知道清除白天积累的毒素对大脑至关重要,这些毒素会阻碍专注的大脑。

下次你想通宵学习的时候,你最好睡个好觉,第二天再继续。

间隔重复,每天一点

杰瑞·宋飞每天都写笑话。他的墙上有一个日历,每天他写笑话的时候,都会在上面打个 X。因为他每天都写,如果你看日历,你会看到一连串的 X。

一旦链条开始了,他所要做的就是继续下去。

不要断链。

这种技巧不仅适用于写笑话。它也可以用来学习。

学习如何学习课程中,他们提到了一个类似的概念,叫做间隔重复。

间隔重复包括在短时间内练习一些东西,随着你做得越来越好,增加每个时间段之间的时间。

例如,当开始学习中文时,你可以每天练习一个单词,坚持一周,直到你熟练为止。然后过了第一周,你一周练两次。然后每月两次。然后每两个月一次。最终,它会在你的脑海中凝固。

当你结合这两个概念时,最好的学习就发生了。不要通过每天练习一点来打破这个链条,通过更经常地复习困难的东西来加入间隔重复。

首先,你可以给自己设定一个目标,在一个给定的话题上每天吃一个番茄。一周后,你会在上面花 3 个小时。一年后,你将积累超过 150 小时。每天只有 25 分钟还不错。

**Bonus:** A great tool for spaced repetition is the [flash card software Anki](https://apps.ankiweb.net/) and for not breaking the chain, I recommend the [Don’t Break the Chain poster](https://www.writersstore.com/dont-break-the-chain-jerry-seinfeld/) from the writer’s store.

第 2 部分—分块

课程的第二部分介绍组块。多个神经元一起放电被认为是一个组块。组块是以一种它们一起工作的方式调用这些区域的过程。

为什么这很有帮助?

因为当多个神经元块一起放电时,大脑可以更有效地工作。

你如何形成一个组块?

一个组块是通过首先抓住一个主要概念的理解,然后弄清楚在哪里使用它而形成的。

如果你开始学习编程,试图背诵一门语言是不明智的。相反,你可以从一个简单的概念开始,比如说循环。你不需要从里到外理解这种语言就能知道在哪里使用循环。相反,当你遇到一个需要循环的问题时,你可以调用大脑中的循环块,并根据需要填充拼图的其他部分。

刻意练习:做困难的事情

形成一大块很难。首先,需要学习的重要概念有哪些?第二,你应该在哪里应用它们?

这就是为什么你应该花时间和精力去创造它们。不要学习每一个复杂的细节,而是找出主要的概念是什么。通过自我测试找出如何应用它们。解决例题。

做难的事情的过程叫做刻意练习。在你觉得更困难的事情上花更多的时间是一个普通人成为伟大的人的方法。

不要被旧思想所束缚

芭芭拉·奥克利博士引入了德语中的“心态”一词。

但是意义比一个单词的翻译更深刻。

每年你都会升级智能手机的软件。伴随着几项性能改进,一整套新特性也随之而来。

你的思维方式上一次软件升级是什么时候?

Einstellung 的深层含义描述了一种旧的思维方式阻碍了一种更新、更好的思维方式。

成为某方面专家的危险是失去像业余爱好者一样思考的能力。你对一直有效的方法如此在行,以至于对新事物视而不见。

如果你正在学习新的东西,尤其是这是你一段时间以来第一次学习,保持警惕是很重要的。保持开放的心态,不要害怕问愚蠢的问题。毕竟,唯一愚蠢的问题是没人问的问题。

回忆—你刚刚学到了什么?

到目前为止,在你读过的书中,最突出的是什么?

不要向上滚动。把文章放下,想一想。

你会如何向别人描述它?

不一定要完美,用你自己的话去做。

这样做就叫召回。不用回头看,把你刚刚学到的信息带回你的脑海。

任何题目都可以。看书?完成后,把它放下,用几句话描述一下你最喜欢的部分。

完成了在线课程?写一篇关于你最喜欢的话题的文章,不要回顾课程。听起来熟悉吗?

练习回忆是有价值的,因为它避免了能力的错觉。一遍又一遍地重读同样的东西,会给你一种理解它的错觉。但是回忆它并用你自己的话再现信息是一种找出你知道哪些部分和不知道哪些部分的方法。

第三部分——拖延和记忆

习惯僵尸

早上在你家煮咖啡,你要想多难?

不是很喜欢。如此之少,你的半睡眠僵尸模式的身体可以在厨房里摸索着用开水,仍然设法不被烧伤。

怎么会?

因为你做得够多了,这已经成了一种习惯。穿衣服或者刷牙都是一样的。这些事情你可以自动完成。

习惯在学习中起什么作用?

关于习惯,几乎任何事情都可以变成习惯。包括拖延症。

上面我们谈到了用计时器来对抗拖延症。但是你如何从习惯的角度出发呢?

学习如何学习课程的第 3 部分将习惯分成四个部分。

  1. 提示 —触发接下来三个步骤的事件。我们将使用你的手机关机的例子。
  2. 套路——当你被提示触发时会发生什么。在电话的例子中,你检查你的电话。
  3. 回报——你遵循常规所获得的良好感觉。检查你的手机,你看到一个朋友的信息,这感觉很好。
  4. 信念——强化习惯的想法。你意识到你检查了你的手机,现在你对自己说,“我是一个容易分心的人。”

你怎么解决这个问题?

你只需要移除四个步骤中的一个,其余的就会崩溃。

你能弄清楚这是什么吗?

暗示。

如果你的手机在另一个房间会怎么样?还是关机了?

提示永远不会发生,后续步骤也不会发生。

去除暗示的技巧不仅仅适用于拖延症。它也可以用于其他习惯。反之亦然。如果你想养成一个好习惯。考虑这四个步骤。

为了养成一个好习惯,创造一个线索,围绕它制定一个常规,如果你坚持到底,给自己一个奖励,你会开始形成一个信念,你是那种有好习惯的人。

字典不是产品在过程之后出现的唯一地方

思考你学习的结果是让你气馁的最快方法。

为什么?

因为没有尽头。学习是一生的旅程。

历史上从来没有人说过,‘我已经学得够多了。’

如果他们有,他们在撒谎。

我从小就一直说英语。即使做了 25 年的演讲,我仍然每天都犯错误。但是对我的英语水平感到沮丧会有帮助吗?号码

我能做什么?

我可以接受了解演讲和英语的一切是不可能的。取而代之的是,关注说话的过程。

这个原则可以和你试图学习或创造的任何东西联系起来。

如果你想更好地写作,最终产品可能是一本畅销书。但是如果我让你去写一本畅销书,你会写什么?

担心一本畅销书会有什么内容会让你精疲力尽。关注过程,每天写点东西会有用得多。

释放你的工作记忆,在前一天晚上制定一个任务清单

奥克利博士说,我们在工作记忆中大约有四样东西的空间。但如果你和我一样,可能更接近一。

Writing a task down free’s up a slot in your working memory.

一些和我一起工作的人有三台显示器,所有的事情都在上面发生,我不知道他们是怎么做到的。我坚持一个,有任务需要就推到两个。

如果我有第三个显示器,那就是我随身携带的 A5 笔记本。是我的私人助理。每天早上,我都会写下一张清单,上面列有我想在一天中完成的大约六件事情。有时候,我会在房间的白板上写下同样的清单,来真正清理我的大脑。

即使当我正在进行一个专注的会议,吃了 12 分钟番茄,事情还是会突然出现。这个想法没有停止番茄,而是停留在纸上。释放工作内存。

课程建议在前一天晚上列一个清单,但是我也喜欢早上做第一件事。把事情放下意味着它们已经不在你的脑海中,你可以把你所有的脑力投入到集中思考中,而不是担心你以后要做什么。

别忘了加一个收尾时间。一天中你会放弃的时候。

为什么?

因为有截止时间意味着你有一个固定的时间框架来完成任务。一个固定的时间表创造了另一个避免拖延的理由。

为专注的工作设定一个截止时间意味着你会给你的大脑时间来转换到分散的思维。谁知道呢。你在 4:37 解决不了的问题可能会在你 8:13 洗澡的时候自动解决。

第 4 部分——文艺复兴式学习&释放你的潜能

学习不是直线进行的

你可以整个周末都学习,然后在周一回去工作,没有人会知道。

你可以整个星期都在研究一个问题,但是到了周末,你会觉得情况比开始时更糟。

塞伊诺夫斯基博士知道这一点。并强调学习不是线性发生的。

学习困难的技能不会在几天、几周或几个月内发生。对大多数事情来说,几年是合适的时间框架。

我想知道我能多快学会机器学习背后的所有数学概念:微积分、线性代数、概率。我在 Quora 上找到一个关于它的问题。

一个研究机器学习 30 年的人回答说,“几十年。”然后解释了他是如何发现新事物的。

我很不耐烦。我关注的是产品而不是过程。

学习看起来更像一个破楼梯,而不是一条直线。

Sometimes you’ll go in circles, other times it’ll feel like you’re in decline, then somehow you’ll start heading in the right direction (at least it seems that way).

查尔斯·达尔文是大学辍学生

你是如何从医学院辍学到发现进化论的?

简单。你是查尔斯·达尔文。

但如果你不是查尔斯·达尔文呢?

别担心,不是每个人都是查尔斯·达尔文。

再也不会有第二个查尔斯·达尔文了。历史会重演,但永远不会完美。不如把它想成押韵。历史与未来押韵。

查尔斯·达尔文从医学院辍学,这让他的医生家人非常失望。然后他以裸体主义者的身份环游世界。

岁月流逝,但有一点从未改变,那就是他一直以孩童般的心态看待大自然中的事物。

在学习的间隙,他每天散步多次。专注的心和分散的心。

选修任何一门生物学入门课程,你就会知道接下来发生了什么。

我把几十年的故事浓缩成句子,但重点是每个人都必须从某个地方开始。

第一年你学新东西的时候,你很差劲。第二年你会更糟糕,因为你意识到你有多少不知道。

没有必要羡慕那些似乎知道自己在做什么的人。每个天才都是从某个地方开始的。

说他能的人和说他不能的人通常都是对的。

该课程认为亨利·福特说过上述的话。但是网上告诉我这是孔子的。

没关系。谁说的也是对的。

如果你相信你学不到东西,那你就对了。

如果你相信你能学到东西,那你就对了。

奥克利博士 20 多岁时是一名语言学家。她不喜欢数学。那么她是怎么成为工程学教授的呢?

通过改变她对她所能学到的东西的信念。

我曾经告诉自己,“我永远不会成为最好的工程师。”

我在一次聚会上对某人说的。他们回答说,“不是那种态度。”简单而深刻的陈述。最好的都是。

无论你决定学什么,都是从你告诉自己的故事开始的。假装你是你自己学习旅程故事中的英雄。挑战将会出现。这是必然的。但是主人公是如何处理它们的呢?你决定吧。

学习:终极元技能

对自己的学习负责是你能做的最重要的事情之一。

学习是终极元技能,因为它可以应用于任何其他技能。所以如果你想提高你做任何事情的能力,学会如何学习是你应该花时间去做的事情。

我在这篇文章中提到的东西只是触及了学习如何学习课程的皮毛。我忽略了锻炼,和别人一起学习,在不同的地方学习。但是你可以想象这些有什么好处。

如果你想更深入地了解,我强烈建议你去看看完整的“如何学习”课程。我支付了证书费用,但并不需要。你可以免费获得所有的资料。然而,我发现当我付钱的时候,我会更认真地对待事情。而这门课的信息是值得付费的。

如果你不为去年的自己感到尴尬,说明你学得还不够。—阿兰·德波顿

不断学习。

I learn best from combining text with visuals. If you’re the same, you might find the video version of this article helpful.

数据科学家数据可视化的终极技能

原文:https://towardsdatascience.com/the-ultimate-technical-skill-in-data-visualization-for-data-scientists-73bc827166dd?source=collection_archive---------5-----------------------

超越 ggplot2、matplotlib、seaborn、Shiny、Dash、R 或 python 的是什么。这些是在数据可视化方面达到下一个水平的技能。

摘要

任何处理数据的人都必须能够将数据可视化。随着用户界面(UI)技术最近的发展,对 UI 的期望大大增加。我主张让数据科学家创建富 web 应用程序的通用框架鼓励令人沮丧的开发体验,并且学习一些 web 开发中的基本技能将极大地改善开发体验。

介绍

人们普遍认为,数据是许多企业的新黄金,因为它允许更好的决策和更好的洞察力。我们总是需要查看数据:在勘探阶段,在模型诊断阶段或在生产期间。从 Excel 到 Tableau,通过python matplotlib,工具的复杂程度各不相同。不同的需求将导致自动化过程中不同类型的痛苦。尽管如此,我相当肯定我们都希望展示一些漂亮、别致和交互式的仪表盘和故事,并把它们分发给我们的利益相关者或观众。标准流程是将我们的解决方案打包成 web 应用程序(一个应用程序在客户端设备上运行部分逻辑,另一个在服务器上运行)。

根据我的经验,使用数据科学中典型的工具包创建 web 应用程序会导致令人沮丧和愤怒的时刻。然而,这个问题有一个非常好的解决方案,我希望它能像对我一样帮助你。剧透一下,我的解决方案包括学习 Lisp(it 的一种特殊方言),这是与人工智能相关的最古老的编程语言之一。

本文的目标读者是那些需要显示工作数据的人,尤其是那些需要创建 web 应用程序中常见的高度定制和适应性可视化的社区。也就是说,任何需要创建定制用户界面的典型数据科学家都可以从阅读中受益。

在继续阅读之前,如果你从未使用过ggplot2plotly,我肯定地建议你先了解一下它们,因为它们教授了一些数据可视化的标准逻辑,并提供了一个你应该从图中期待什么的基线。

故事

一种观点认为,有了背景,想法总是更容易被理解。我的背景相当普通:我总是喜欢解决问题,所以我走的是数据分析师的典型道路(或者你喜欢用的任何同义词:科学家、定量分析师、统计学家)。在大学里,我出于对该领域的热爱,在第一个学位时研究了一个不切实际的领域(数学)。在我的第一份工作中,我开始欣赏统计学、机器学习和编程,这使我在网上纳米学位和第二个正式硕士学位(不要评价我,幸好教育在瑞士很便宜)的空闲时间里深入研究它们。

这段时间,我投入时间用他们的标准包研究了Rpython进行数据分析。幸运的是,我强迫自己学习和使用 emacs,这让我成为一名更快乐的专业人士。

至于我的工作,随着人们逐渐习惯于与智能手机或网络浏览器进行交互,我逐渐增加了构建动态分析、报告和解决方案的需求。我在无数场合试图学习javascript,但我总是发现它太不直观,这导致我依赖Rpython来解决我的问题。我专业用了两年R Shiny。我们的故事从这里开始。

问题

在数据科学家中,Rpython是最突出的语言,它们都有一个事实上的标准库来创建 web 应用程序: ShinyDash 。两者都允许创建 web 应用程序,在宿主语言和javascript - js代码之间建立桥梁。它们还处理浏览器(前端)和服务器(后端)之间的通信(例如数据传输和用户交互),其中主机语言的进程运行直到终止。此外,它们处理所有的异步js交互,并且都提供了简化应用程序部署的解决方案。公平地说,他们在这些方面做得相当不错。然而,我认为合并前端和后端也会带来很多不便,这大大降低了这些框架的价值。

  1. 用户已经习惯了一个非常平滑、快速和动态的行为界面,它有许多奇特的特性,比如表单中的错误消息或动态 UI。由于目标是完全避免js,shiny 和 dash 用户在定制 HTML 输出以满足期望方面的表达能力降低了。例如,如果没有 *js*来创建一个颜色取决于浏览器宽度大小的按钮,这将是相当具有挑战性的。如果存在任何解决方案,它将涉及前端和后端之间的通信循环,导致未经打磨的体验。
  2. 真正模块化的组件很难在两种框架中编写。主要原因是节点 HTML 标识符和后端效果之间的强烈耦合,这是在 HTML 节点抛出用户事件时触发的。此外,对于Shiny,模块化代码很难实现,因为环境、名称空间或模块在 r 中并不常见
  3. 最后,这是最重要的一点,两种框架都会导致令人沮丧的开发体验。基于这些包的项目中的反馈周期慢得惊人,令人痛苦:当在生产环境中开发新的功能、组件、视图或选项卡时,后端通常会在每次源代码发生变化时完全重启,web 浏览器通常需要刷新,开发人员需要恢复应用程序的特定状态,以查看修改是否达到了预期目的。在任何合理规模的项目中,数据和包将在开始时加载,开发人员将为每一次迭代变更支付初始化成本。在最坏的情况下,由于语法错误,整个应用程序在重新加载时崩溃。(注意,两个框架中都有一个模拟热重装的 hack:后端监听一个文本区域,可以评估[在eval命令的意义上]写在里面的代码。也就是说,这可能会导致严重的安全问题。)

解决办法

解决的办法是把前端和后端再分一次,学会如何控制前端。这将解决前面列出的所有问题:

  1. 您可以充分利用它并控制前端,随着计算在 web 浏览器上呈现,所有 UI 操作都不再需要与后端通信。
  2. 大多数前端技术可以处理模块或名称空间。所以你可以有几个名为typedate的变量,只要它们位于不同的名称空间,就不会有混淆。此外,由于减少了与服务器通信的必要性,代码将更加模块化,因此更加健壮。
  3. 热模块替换(或热重装)也是由大多数框架实现的。最后一点是你应该说服你去尝试的最好的单一特征,如果没有这个特征,你将无法回到过去的生活。

艰难而不雅的方式

学习jsReactJS(破折号环绕其中)。这是一条艰难的道路,因为如前所述,js是一种有许多怪癖的艰难语言。我不是js专家,所以我不会提出任何强有力的主张,但我认为这条道路需要大量的投资

寄生语言

寄生语言是通过将语法转换成底层技术来利用现有语言及其工具的编程语言。比如 Scala,分别是 TypeScript,分别是 Java 的寄生语言js。寄生语言的优势在于它们可以添加某些范例,并抑制目标语言的一些弱点。例如,TypeScript 将类型属性添加到js

我声称 ClojureScriptcljs,一个针对jsClojure 的版本,是大多数数据科学家的完美候选。

因为cljs代码最终是js代码,所以您可以享受同样的速度优势。名称空间是cljs的标准特性,比在 Javascript 中更容易使用。通过拨轮阴影 cljs 使热装成为可能。

尽管如此,前面所有的观点都可以用js来实现,那么我为什么更喜欢cljs

这种语言非常简单,非常稳定,旨在产生优雅而简单的代码。它消除了大多数js的陷阱,最佳实践鼓励一种模型,其中数据是代码的中心,而不是容器(不再有 1500 个类的项目)。此外,它还带有一个久经考验的标准库,用于操作您的数据。我明确推荐阅读这个和观看那个来看看cljsjs的好处。

后端

至于后端,进行计算的部分,执行业务逻辑的代码将保持不变,但是需要在代码周围添加一个包装器,以响应来自前端的 HTTP(S) 请求。这很容易用R 铅管python 烧瓶来实现。

对于操作可以由客户端执行的简单情况(例如,按组过滤和分组表格),输入数据可以存储为csvjson,一个简单的 HTTP 服务器(在根文件夹中的python3 -m http.server命令的意义上)就足够了。见我的个人网站举例。

权衡

学习cljs也教会他们的用户对任何新的解决方案持怀疑态度。采用cljs有哪些弊端?

在功能方面,数据科学家现在负责客户端和服务器之间的通信,这意味着我们需要学习如何设计一些基本的 API。也就是说,这意味着后端为来自客户端的不同 URL 请求返回不同的数据。

生产部署不同于 RStudio 和 Plotly 提供的解决方案。也就是说,由于该架构是 web 应用的标准架构(后端和前端分离),因此有几个云提供商和教程可以为您提供支持。

代码库中现在有两种语言。引入一种新的语言及其工具总是伴随着风险。然而,我坚信有形的好处远远大于潜在的风险。

额外好处

学习cljs和使用提议的架构还有许多额外的好处。

  • 因为cljs是 Lisp 方言,因此是函数式编程语言。
  • 正如js可以瞄准网络、桌面和移动客户端一样,cljs也可以。
  • 使用Clojure将会非常容易,然后您也将能够在 Java 虚拟机上编程。
  • 来自 Google Closure 的工具,比如代码分割和死代码消除,对cljs来说是可用的,它们将优化你的应用程序的代码大小,带来更平滑的用户体验。
  • 你可以使用任何 js可视化框架,尽管plotly是一个很好的默认选项。听说过织女星吗?您现在可以使用它,而不依赖于Rpython的包装器。
  • 多亏了cljsjs之间的互操作性,你可以在你的语言的包装器上利用任何用js编写的ReactJS组件。你甚至可以重用 dash-html-components。
  • 在某个时候,你会学到 emacs,这是有史以来最好的生产力工具。再加上你的 Lisp 知识,你就可以随心所欲的配置了(但不要同时学习 emacscljs)。

结论

在本文中,我提倡数据科学家花时间学习 web 开发中的关键技能(cljs),以改善他们在制作这些应用程序时的开发体验。虽然R Shinypython Dash对于他们最初的目标来说是很好的工具,但是它们缺乏现代前端技术的关键特性,比如不刷新浏览器的热模块重新加载,这导致了次优的开发体验。

支持cljs胜过js的观点也已经被提及。但是我想提下一个论点来最终说服任何人去尝试cljs:用cljs创建可视化和 web 应用程序是非常有趣的。你解决问题的速度和大脑思考的速度一样快,这让你保持专注和创造力。我真的希望你能试一试!

在后续文章中,如果有兴趣,我会提供一个项目模板,并指导您完成。与此同时,我将邀请您通过访问以下链接来探索这种美丽的语言。

你怎么想呢?我错过了问题的核心吗?对于你的用例来说,shinydash够好了吗?

收场白

有一段时间,因为上面提到的所有原因(Shiny确实让我受到了精神创伤),我努力逃避我在 UI 方面的职业责任。毕竟,我是一名数据分析师/科学家,我更感兴趣的是发现模式,根据数据塑造我的团队的决策,并最终为我的客户创造更好的服务和产品。

然而,一个为 web 开发塑造我的团队基础设施和技术堆栈的机会出现了。一听说这个项目,我就知道我会被包括在内(不管我喜不喜欢)。因此,我做了任何人都会做的事情:我把自己的命运掌握在自己手中。我已经知道了cljs的许多优点和缺点,并决定为它努力游说。

不知何故,我的团队疯狂到相信我。有很多痛苦,不眠之夜和漫长的时间,但我们学到了很多东西,获得了宝贵的技能。我们已经和cljs一起快速设计了我们的前端,我非常高兴。

从本质上说,这篇文章是我作为一名数据科学家驱除我对 UI 开发的恐惧和沮丧的方式,我希望它能帮助许多人愉快地重新发现我们工作的这一部分。

来源和资源

  • ClojureScript Koans ,在浏览器上交互学习语言的语法。
  • Clojure Brave and the True ,学习 Clojure 和函数式编程概念的最佳起点。
  • 4Clojure ,寓教于乐的练习,借鉴他人的解决方案。
  • re-frame 文档,理解框架的最佳来源,读起来真的很享受。
  • purelyfunctional.tv ,多位例外发帖博客了解试剂(包装为ReactJS)并重新框定。
  • Clojure 的创造者自己提出的简单至关重要
  • ClojureScript: Lisp 的复仇,ClojureScript 的主要设计师之一。

数据科学的终极工具特性工厂

原文:https://towardsdatascience.com/the-ultimate-tool-for-data-science-feature-factories-55aed0f70974?source=collection_archive---------23-----------------------

正如 Splice Machine 的联合创始人兼首席执行官 Monte Zweben 在早期的一篇文章中所写的那样,数据科学孤岛如何破坏应用程序现代化,任何团队都必须采取许多重要步骤来避免可能阻碍现代化进程的昂贵孤岛。其中最重要的两个是为正确的功能创造正确的团队通过功能工厂创造实验文化。前者非常简单:找到统计专家、主题专家和 SQL 天才,你就已经在通往数据科学梦之队的路上了。我们在许多公司看到的最大挑战是后者,即功能工厂,尤其是我喜欢称之为功能组织的东西。然而,在我们开始之前,让我们定义一下什么是特征:数据科学中的一个特征是你的机器学习模型可以用来预测结果(标签)的一条信息。想象 Excel 电子表格中的一列;列越多,模型预测的基础就越多。

科学家需要什么数据:特征组织

功能组织是将您测试过的每个功能、训练过的数据集和部署过的模型保存在一个有组织、有凝聚力的工作空间中的过程,可以方便地访问您团队中的所有数据科学家和工程师。现在,特征是至关重要的 他们会成就或破坏你的模型;垃圾进,垃圾出。找到并最大化这些特征的信号需要时间、实验和“快速失败并继续前进”的文化。但是你实验、测试和创造的越多,就越难准确地记住你做了什么以及你是如何做到的。如果管道中出现问题,如果没有痕迹,几乎不可能找到罪魁祸首。这就是组织变得至关重要的地方。没有高质量的特征组织,你注定会生活在分散的特征、随机的超参数和不匹配的模型中。

科学家有什么数据:功能过载

让我们考虑一下数据科学团队生活中典型的一天。一个由经验丰富的数据科学家组成的团队负责使用公司数据建立一个模型,以准确预测哪些订单项目将可用以及何时将它们交付给客户,也称为 ATP ( 可承诺量)。这是许多公司面临的一个重要问题,如果处理得当,可以大大减少损失,提高客户满意度。

团队迅速采取行动:SQL 专家开始用复杂的连接组织不同的表,使其易于接收和试验,主题专家利用她对供应链管理的深厚知识,开始起草将引入信号的有价值的功能,数据科学家开始阅读研究论文,寻找为问题构建的最佳模型,试验确定的功能。构建第一个 PoC 模型;不是很棒,但是大意是有的。他们讨论结果,调整特征,去掉一些有噪声的,然后再试一次。这次的模式稍微好一点,但是他们可以打败它;数据科学家转向神经网络架构。现在变好了,增加了更多的功能,减少了,增加了,增加了两个新功能,去掉了一个。精度降低,但 F1 提高,这是好事,对吧?添加一个隐藏层,然后删除,然后添加一些神经元。我们知道我们是否已经收敛了吗?事情变得非常复杂。

代价是什么:我们真的在尽最大努力做数据科学吗?

作为一名数据科学家,我创建了无数的 Excel 电子表格,试图记住和记录我在每个实验中使用的功能、标准化技术、编码方案和模型超参数的微妙组合,以及每个实验提供的各种指标。这让人筋疲力尽、灰心丧气,并促使我选择我看到的第一个有效的模型,而不是仔细分析我的实验,寻找最佳可能的组合。最重要的是,当需要重新培训和重新部署模型时,我很可能忘记或放错了电子表格,需要从头开始调整。

我看到一些公司试图创建自己的解决方案来解决这一问题,尽管积极主动的方法令人钦佩,但推出自己的解决方案会占用团队的宝贵时间和资源,而他们本可以将这些时间和资源用于实际的数据科学研究。更糟糕的是,这不是一次性投资,因为随着新库的发布和旧库的改进,任何自主开发的解决方案都需要持续的维护和更新。

特征工厂的开始:MLFlow

这是开发过程中工程师们开始关注不可思议的开源社区的时候了。 MLFlow 是数据科学社区中我最喜欢的开源项目之一,因为它重新定义了特性组织,并推动了特性工厂的创建。它标准化了整个数据科学工作流的治理流程,从总体实验到单次运行试验,再到团队中的各个数据科学家。MLFlow 允许您按照自己的意愿精确地(或广泛地)跟踪您的流程,并让您的数据科学家有时间去做真正重要的事情。每一个超参数调整、每一个特性变化、你能想到的每一个可能的度量标准,都记录在一个有组织的位置(下一篇文章将详细介绍)。

所以你有了你的理想模型,每个超参数都调整到完美,你已经从你的特征中提取了最大量的信号,现在呢?MLFlow 也使部署变得简单。只需几行代码,您就可以让您的模型在 SageMaker 或 AzureML 上实时运行,而不管您选择的库是什么,通过简单的 API 就可以实时获得您的预测。MLFlow 是让你的团队保持同步的工具,让他们专注于手头的任务,并让他们直接行动

在 Splice Machine,我们围绕 MLFlow 构建了一个名为 ML Manager 的包装器,我们每天都在实验中使用它。它与我们的数据库本地连接,并允许我们跟踪和部署我们在源位置构建的模型。它使我们的内部工作流程更有条理,我们的客户也非常喜欢它。您可以点击此处了解更多关于 ML Manager 和拼接机器平台的信息,或者注册观看关于如何操作机器学习的网络研讨会。

更新:关于 MLManager 和 MLFlow 的更深入的技术回顾和一些代码示例,请查看我的后续文章

成为 at 数据科学家的不确定不全面的指南

原文:https://towardsdatascience.com/the-un-definitive-un-comprehensive-guide-to-becoming-at-data-scientist-39593b27b1dc?source=collection_archive---------19-----------------------

帮助你成为数据科学家的小贴士。

So you wanna data science, huh?

我在 LinkedIn 上相当活跃,不时会看到关于“如何成为”数据科学家的文章。我发现这些文章中的许多都是基于作者/数据科学家的视角,非常主观,我发现自己不一定同意所有的建议,或者至少不同意成为数据科学家需要具备的条件。

我想,如果我不同意所有这些文章,我会写我自己的,可笑的怀疑,版本。事不宜迟,我列出了成为一名数据科学家需要具备的条件。

1。停止阅读数据科学家关于如何成为数据科学家的列表。

看了这篇文章,你就失败了。

Whoops.

等等,不,你没有。让我重新开始。

1。通过快速失败和快速灵活的转变,你可以学到很多东西。

有些事情是学校教不了你的,而实践经验可以。照本宣科通常不是你在新工作中学习的方式,相反,你会不断尝试不同的解决方案,向你的利益相关者提出不同的想法,直到有一个坚持下来。在整个过程中,你要记下你哪里失败了,哪里可以改进。

此外,你可能在快节奏的工作中工作,或者在截止日期的压力下工作。你可能没有获得完美解决方案的奢侈。你必须弄清楚你能从一个最低限度可行的产品中获得多少百分比的覆盖率,并且当你不可避免地遇到阻碍时,一定要转向不太明显的解决方案。

现实是,在很多工作中,变化是唯一不变的,以不太完美的方式灵活解决问题的能力是现状。我说拥抱它。随着时间的推移,你会学到很多关于如何迭代和成为更好的问题解决者的知识。

我觉得学校和训练营教你用干净的教科书来解决问题。但是解决工业中的问题并不能反映出上述环境的清洁程度。

当学习任何与数据科学相关的技能时,不要让完美阻碍你的学习。允许自己犯错。尽可能寻求对你的错误的反馈。问很多问题。失败是收集知识的最好方法之一。不要害怕弄糟你的家庭作业,你的个人爱好项目,或者你在工作中做过的模型。

2。学习如何与你的同事、同事和客户交谈。

Repeating things will either make you look smart, or just very slow on the uptake.

让我给你一个假设的场景:你在一家医疗保健公司工作(像我一样!)你正在思考医生如何更有效地管理他们的高危人群。您希望构建一个模型,在该模型中,您可以预测出在未来六个月内,特定医院因心脏相关诊断而就诊的急诊数量。

你决定建立一个模型。太好了!

你的第一步是什么?也许收集一些数据,做一些探索性的分析,建立一个 MVP 模型,看看你的模型是否合适。听起来不错。

好吧,那么,谁来消费你的模型呢?它是否解决了您的客户正在寻找解决方案的一系列特定问题?

当然,你是绿光资本投入生产的许多业务高层食物链上的数据科学家。你是如何传达这种模式的价值的?提前六个月预测急诊就诊对患者护理和价值节约有什么帮助?你有和这个预测相关的金额吗?这如何可能降低您客户的劳动力成本,并潜在地释放资源投资于其他类型的患者护理?

你想过如何解释这个模型的机制吗?你使用的是 ARIMA 还是时序回归模型?或者你在考虑一个更复杂的黑盒模型,比如神经网络,比如 T4 LSTM T5?你打算如何解释这些解决方案是如何将输入转化为输出的?

我之所以提到这些(不那么)愚蠢的问题,是因为你的沟通技巧对于获得各级同事的认同至关重要。

请这样想:在数据科学的食物链上,您可以通过三个步骤来为模型的开发开绿灯:说服您的数据科学同行,说服您的业务利益相关者,以及说服潜在客户。特别是关于你的模型的价值。

想想你会如何与这三组人交谈。你会像和 MBA 一样和数据科学家交流,像和医生一样交流吗?可能会有重叠,但是你仍然需要对你的想法进行大量的剪裁。

此外,我从更专注于产品的数据科学家同行那里获得的关于他们自身经历的智慧尤其让我深受启发。作为一名支持产品的数据科学家,你不可避免地要与产品经理合作,为公司成功推出新产品。当推出一个产品、功能或模型时,你如何定义成功的衡量标准?你如何与你的利益相关者一起 1)开发假设,2)开发一个框架来测试这些假设,3)使用分析/机器学习来支持/拒绝这些假设,以及 4)使用这些结论来推动有价值的商业问题的答案?

学习这些技能是很棘手的,但是我已经习惯于找出我可以观察和学习的导师。我寻求各种利益相关者的反馈,看我如何改进。我和我的经理一起评估我认为可行的方法,以及可能不可行的方法(参见第 1 条的趋势?).

在许多这种情况下的共同点是学习如何像走路一样说话。说清楚。善于沟通。永远不要假设任何人都知道你在说什么。

3。了解您想要走哪条“数据”路径,并专注于磨练帮助您沿着这条路径导航的技能。

如今有许多“数据科学家”的分类。当我阅读关于如何成为一名数据科学家的文章时,他们越来越让我反感,因为他们将培训视为一刀切的方法。迄今为止,数据科学对不同的人和不同的组织有不同的含义。概括地说,我见过一些关于数据科学的宽泛定义。我特别喜欢 AirBnB 将数据科学专业二分法,但他们的方式绝不是“黄金标准”。

你更感兴趣的是讲故事、探索数据片段、挖掘隐藏在数据下的秘密吗?也许你是一名数据科学分析师,专注于构建故事,并在涉及任何面向数据的事情时成为一名侦探。

您是否对构建模型和算法更感兴趣,用您的编程能力做许多繁重的工作,并实现为产品提供动力的模型?也许你想考虑成为一名数据科学构建者或数据科学建模者

或者,你可能喜欢做实证测试,提出假设,使用各种研究方法确定如何得出因果结论,然后使用统计数据来验证这些结论。也许你可能是一个专门从事推理的数据科学家。

这些只是数据科学各个方面的例子。大多数分类法都有重叠的技能,尽管如果你更倾向于成为一名数据科学分析师(像我一样),你擅长将数据拼凑在一起,编织一个故事,并交流结果。你可能知道如何建立模型或进行 A/B 测试,但这不一定是你的专长(或兴趣)。

4。明白你绝对需要正确的技能和力学基础。

这是学校可以帮助你的地方,这是肯定的。从长远来看,拥有一套技术技能的基础将为你的成功做好准备,至少在学习最新的花式技术或最新的尖端工具方面。

这是什么意思?首先,理解一定程度的统计学。我建议从基础(比如描述性和推断性统计)开始,一直到基本的建模技术(至少学习回归模型的机制)。你会惊讶这将带你走多远,因为对这些主题核心的基本概念的理解将允许你更快更容易地学习更复杂的技术。

我是一名受过训练的心理学家,所以从技术上来说,数学对我来说从来都不是天生的。但是通过我所有的统计学课程,我学到了微积分和线性代数的知识。理解这里的基础知识会让你更容易理解你所使用的模型的机制。所述数学的使用将因公司、团队和项目而异。如果你正在构建算法,你可能会花时间复习微积分和线性代数,但如果你没有,你可能只需要知道一些基本知识就可以了。您的里程可能会有所不同。

最后,编程技巧。Python。R. SQL。可能是 Scala 和 Java。去读几本这方面的书吧。观看 Udemy/Coursera/Data Camp 视频。做黑客等级和/或 LeetCode 练习。不可避免的是,你会在面试中测试你的编程技能,所以我建议你能流利地掌握一些语言。同样,你的里程数可能会根据你需要深入的程度而变化:你可能在一个经常将代码放入产品的团队中,所以你可能会从做大量的在线编码挑战和了解一些基本的计算机科学中受益。或者,也许你所在的团队有更熟练的数据工程师将你的代码投入生产。拥有用 python 编写(潜在的模块化)脚本的技能可能就足够了。

如果你真的在寻找资源,你可以随时查看这些链接,寻找编程机器学习

(不过说真的,搜索各种资源来学习所需的技能并不太难)。

就我个人而言,我读了几本书(并做了笔记),从事业余爱好项目来学习 R 和 Python,并通过做编码挑战来进一步完善这些技能。

Programming looks EXACTLY LIKE THIS in real life.

我的心得:数据科学是一个巨大的领域,你能做什么,需要的技能千差万别。

然而,你会注意到,我把软技能放在这个列表的第一位,因为我认为,以我最无知、最不完美的观点来看,这些技能会让你在职业生涯中走得更远。任何人都可以拿起一本教科书,用最热门的语言学习最新的花哨算法或程序,但我读过的大多数列表似乎都忽略了这项工作最困难的部分之一:学习如何学习(再次)以及学习如何在多元化的团队中协作,就像一台润滑良好的机器。

米歇尔·塔特(Michelle Tat)是一名居住在大波士顿的反同性恋美籍华人活动家。她目前是 athenahealth 的产品分析经理,也是马萨诸塞州变性人政治联盟的联合主席。你可以在推特上找到她关于数据、社会正义和猫的帖子。

游戏设计中的恐怖谷

原文:https://towardsdatascience.com/the-uncanny-valley-in-game-design-6a6c38a36486?source=collection_archive---------6-----------------------

创造不会让玩家毛骨悚然的类人角色

恐怖谷的概念是由一位名叫森昌弘的日本机器人专家在 20 世纪 70 年代提出的。森喜朗也是第一届日本机器人制造比赛 Robocon 的创始人,也是研究机器人技术形而上学含义的 Mukta 研究所的主席。

森喜欢设计机器人,而且他也很擅长。他学得越多,他的作品看起来就越逼真——有人造皮肤、会动的眼睛和其他神奇的技艺。但是 Mori 注意到了一些有趣的事情:虽然简单的机器人引起了周围人类的积极反应,但是它们变得越逼真或像人,人们就越害怕它们——即使它们是机器人的优秀例子。

森注意到的是,在事物与人类的相似程度和我们的情感反应之间存在着某种关系。

所以,他创造了一个图形来代表他的发现,关于我们如何对类似人类的事物做出反应

该图形有两个轴:

  • 人类相似度 (横向),意思是机器人和一个活生生的人有多相似;和
  • 熟悉度 【垂直】,或者机器人在观看或与之互动的人身上是否产生积极或消极的情绪。

  1. 我们从相当熟悉的开始,但是看起来不太像人类:一只机器人手(例如 Mecademic 的 Meca500 用于工业用途)。从情感上来说,我们对此持中立态度。
  2. 当我们沿着“人类相似度”轴移动时,我们会发现一个人形机器人(在这种情况下,毗湿奴工程公司的【NAO】虽然填充动物也可以)。我们给物体添加了人类的特征,这使得更有吸引力——我们认为它有“个性”,或者在这种情况下,它很可爱。
  3. 但是如果我们太接近真实的人类,我们不会做出太好的反应,这让我们感到不安。我们现在在神秘的山谷中间。
  4. 当我们最终穿过山谷,移动到右上角时,我们又没事了。没有令人毛骨悚然的感觉,没有不可思议的负面反应。唯一的一点是,到目前为止,只有人类栖息在这边(没错,绿人还是人类)。我们在技术上还没到那一步,无论是机器人还是数字角色。

关于运动的一个注记

如果我们考虑静态的和移动的角色,那么曲线与略有不同。运动有助于感知“活着的”和“有感觉的”,例如 Travis,由位于 IDC Herzliya 的媒体创新实验室和佐治亚理工音乐技术中心开发:

但是移动的角色也会让我们毛骨悚然,看看 Spot ,由 Boston Dynamics 创造的——或者下面这个引起噩梦的婴儿:

游戏可以…嗯,给我们一些有趣的小故障。不完全令人毛骨悚然,但如果你想要现实主义和沉浸感,你可能会想避免这些:

为什么会有恐怖谷?

人们似乎一致认为恐怖谷与期望有关。我们期望事物,尤其是人类,以特定的方式看待表现。****

例如,我们习惯于看到别人的脸(虽然我在家工作,而且我的大多数 twitter 朋友都是机器人;).我们也可以如此浮躁,这真的很有趣。你看了左边的图片了吗?对你来说是不是也很模糊不舒服?

我们不能轻易接受一张不符合我们期望的脸,我们的大脑会试图纠正它,让它符合我们认为的人类应该有的样子

发生这种情况的原因是因为,作为智人,我们已经进化得非常擅长辨别面孔

人类的面孔已经变得独一无二,因为我们通过视觉(而不是气味或声音)来识别彼此。我们的面部变化实际上通过进化得到了增强。例如,人类基因组比身体的任何其他部分都有更多的区域来决定脸型变异

同样令人惊讶的是,我们在 尼安德特人丹尼索瓦人(我们最亲近的亲戚)身上发现了类似的变异,所以我们早就善于用我们的面部来检测和表达情绪了!**

Hominid sculpture reconstructions by Adrie and Alfons Kennis

现在,围绕着有一场争论,在我们对看起来像人类但不完全真实的机器人感到不安的背后,是哪种** 机制。这些是最大的竞争者:**

  • ****择偶。自动厌恶免疫系统无效的配偶——通过面部和身体特征可见。
  • 死亡率凸显。与生俱来的对死亡的恐惧和文化上支持的应对死亡不可避免性的方式。
  • 避开病原体。通过引起厌恶反应来避免潜在的病原体来源。惊恐和厌恶的反应就像尸体和明显有病的人。
  • 违反人类规范。 我们以人类的共情、智力等标准来判断机器人/实体。
  • ****宗教对人类身份的定义。对人类身份概念的威胁。民间传说,创造类似人类但没有灵魂的生物。
  • *相互矛盾的知觉线索*。已证实知觉紧张与类别成员的冲突线索。厌恶混合实体。
  • *对人类独特性和身份的威胁*。挑战人类的独特性——人类性的重新定义。

机器人和共情

但是我们的感情是双向的吗?我们是否也能像与生物交流一样与机器人交流?不管是好是坏…似乎我们可以!

让我告诉你关于 Pleo 的事情。Pleo 是 Innvo Labs 在 2006 年创造的一个电子宠物恐龙玩具,它有很多很酷的功能,如摄像头,触摸和倾斜传感器,麦克风,红外线和其他功能。

最近,一项研究使用 功能磁共振 (通过检测与血流相关的变化来测量大脑活动)来观察与人类相比,人们机器人有多同情。这是受访者看到的视频(我觉得它应该有某种触发警告!)😗***

A study from the University of Duisburg-Essen in Germany using functional MRI to see how much people empathize with robots compared to humans.

如果你真的和研究中的大多数人一样同情 PLEO,你会忍不住想知道人机互动关系的含义。

你觉得 PLEO 不好的原因是,如果我们有很多机器人特征而很少人类特征的东西,人类角色会更加突出。反过来说,机器人脱颖而出

如果某种非人类的东西被赋予了人类的品质,我们会觉得它很可爱。如果我们赋予它太多的人类特征,它开始看起来像一个不完美的模拟(因此可能会令人反感)。

游戏中的恐怖山谷

我们希望游戏角色变得可爱,或者至少可信。因此,它们需要在图表的上半部分。也就是如果你希望他们讨人喜欢!如果没有,你知道在哪里寻找怪物的想法;)

Recommended Area (for likable characters!)

因为它们需要在图形的一个顶点上,所以它们可以是风格化的(像人形机器人或毛绒熊)或照片逼真的:****

照片写实主义

(Far Cry 5, Ubisoft 2018)

照片写实游戏的目标是看起来和照片或者现实生活没有区别。或者比现实生活更好,我们将在下面看到。

在这种类型开发的优势中,我们可以看到照片逼真的游戏以一种视觉上可信的方式模拟现实,这使得它们通常更具沉浸感。

(NFS Payback, Polygon 2017)

然而,照片真实感的开发通常更加昂贵,并且需要更大的团队协同工作。

这也更加复杂,必须考虑到纹理、模型、运动、光线和表演等创造可信体验所需的因素。

这使得隐藏错误更加困难,因为模拟的每个方面都需要打磨到完美。

当现实主义出了问题…

创造一个完整的体验需要很多层次。如果少了一个,所有的东西都会倒塌。

我记得《最终幻想》电影上映的时候。像世界各地的其他高中生一样,我的朋友们&我是绝对的书呆子,他们已经知道自己想和计算机打交道。当电影终于上映时,我们都非常兴奋…也非常失望。我们所能看到的只是角色们怪异的表情,一个我们无法逾越的深渊。不久之后,随着电影 《极地特快》 的发行,以及最近游戏 质量效应《仙女座菌株》 的首次发行,这种情况注定会再次发生。**

许多人对 Mass Effect 2017 年的反响感到惊讶。由于对对话动画过于雄心勃勃的改进和大量的故事要播放,他们没有时间将动画应用到正在说话的角色嘴以外的面部部分。

文字、多人游戏、游戏性以及除了动画之外的一切都有各自的优点和缺点,但在可预见的未来,当谈到这款游戏时,粉丝们首先会谈论的是 人们说话时的表情有多怪异 。这不是抱怨,这只是一个最古老和最明智的公理的又一次重复:链条的强度取决于它最薄弱的一环。 The Kenpire

只制作一个虚拟角色的嘴的动画会是一个问题,我们将会看到为什么。

虚拟角色对精神变态的感知

波尔顿大学的安吉拉·汀威尔做了一个很棒的研究,他们使用回归分析来追踪用户面对这种纯嘴动画的反应。

如果一个角色在眼睛区域缺乏对情绪状况的可见反应,这就会唤起一种与愤怒、冷酷、支配、漠不关心和不值得信任的关系——所有这些特征都与精神变态有关。****

因此,类人虚拟角色中不充分的上部面部动画可以唤起不可思议的,这是由于对角色中心理变态特征的感知。例如,表现出对尖叫声没有惊吓反应的角色被认为是最不可思议的。什么,我们没有计划让你的角色对周围的声音做出反应?******

但是如果你有足够的面部动画和注重细节的团队,你可以创造出类似于《刺客信条奥德赛》(育碧,2018):

表达是如此之好,它几乎使这篇文章毫无意义!

图形保真度与人类保真度

要点应该是,你可以拥有一个看起来不可思议的游戏,但除了草,每个个体在夏日微风的抚摸下看起来都很美,图形保真度 不一定意味着人类保真度****

而且你需要两个来创造一个现实体验****

因为我们对人脸、表情和动作如此敏感,所以我们需要尽可能覆盖所有感知领域。

那么,我们如何才能创造一个现实的和人性化的游戏体验…?

实现人类保真的最好方法就是观察利用 人类作为我们的基础。我们可以捕捉动作,也可以捕捉整个演员的表演。因为当你使用面部和身体捕捉时,你会…****

虚拟世界中的实时电影技术。

有机会玩塞纳的牺牲吗?我第一次看到预告片的时候就很敬畏。这是其中之一:

下面是他们如何实现如此美妙和人性化的表达:

当然,我们不希望事情看起来很真实,我们希望它们听起来和感觉起来也很真实。我想不出比《巫师 3》更成功的故事了。

逼真的电影对话

对于《巫师 3》,对话在 4 个阶段中创建:写作、任务设计、对话设计后期制作(包括修改相机、创建空闲、动画手势以及纠正面部和姿势)。****

总共有大约 2400 个对话动画,最棒的是:它们都是可重复使用的!不同角色之间支持共享。这里有一个小总结:

游戏的设计者所做的是添加对实时预览的支持,这允许创作者轻松地在场景中移动角色,同时他们可以通过在编辑器旁边预览整个场景来检查他们的结果。不仅如此,只需点击一下鼠标,场景就可以在预期的世界位置播放(渲染)。********

Real time dialog creation or The Witcher 3

格式化

(Ylands, Bohemia Interactive 2017)

现在除了现实人物之外的另一个选择。风格化是指简化在形状、颜色、图案和表面细节方面,以及在功能和与场景中其他物体的关系方面。****

(Mario Odyssey, Nintendo 2017)

风格化的好处之一就是人物不是人,这让他们的人性特征更加突出。此外,风格化允许几乎无限多种设计****

另一方面,角色可能不会像照片般真实的角色那样引起我们的共鸣,因为他们不是“人类的 T21”。如果简化破坏了模拟的真实性,这种体验就不那么身临其境了。

风格化有几个层次,但一般来说,游戏倾向于分为过度夸张的极简的****

过分夸张的风格化

在这种情况下,重点是更大的细节和形状,而不是在具有真实图形的游戏中常见的小细节和微表面。fire watch2016 出的一款过分夸张的游戏,没有让人失望。********

(Firewatch — Campo Santo, 2016)

游戏设计师决定使用复古国家公园海报的风格和颜色。丰富的色调和卡通动画看起来并不真实,然而游戏却令人难以置信身临其境——尽管不仅仅是从视觉角度来看,故事也很引人注目。********

由于没有与现实世界进行比较,玩家可能会真正迷失。利比·凯勒,奥德赛

极简风格化

相对而言平淡,极简风格化玩的是简单。它通常去除了所有中等和小的细节,并且可以例如仅使用彩色地图。我们有像《我的世界》 这样伟大的极简游戏,其中一个立方体比一个像素多一点,但充满了创造新的伟大事物的潜力。

(Minecraft — Mojang, 2011)

无论我们是在谈论太空入侵者还是通道,像素艺术的部分吸引力在于, 简单性避免了我们的注意力浪费在细节上 比如凹凸贴图,让一切看起来像湿塑料。玩了几分钟后,我们在《我的世界》看不到立方体,我们看到的是海洋、堡垒、隧道或树屋。爱好 GameDev。

机器人中的极简风格化

最后是一个成功的极简主义机器人的小例子——因为我们可以爱上任何一双可爱的眼睛!2018 年首次亮相的本田 3E-A18 机器人装置:

最后的想法

如果你想创造一个可爱的角色,从哪里开始呢?首先,你需要选择一个方向:风格化或者现实化。你的道路可能取决于你想做的游戏类型、团队和你可利用的资源。

如果你选择现实主义,你将需要额外关注每一个细节,并且很可能在后期制作上花费很长时间。如果你选择风格化的角色,你将需要关注他们的个性,关注会脱颖而出的人类特质。

无论你做什么,你都需要确保它是一个一致的体验,它有 保真度

最初,游戏要求角色只是一个进入他们虚拟世界的入口。这很容易通过令人愉快的卡通如马里奥和索尼克,或者英雄原型如萝拉·卡芙特来实现。某些类型,主要是 RPG,走得更远,提供了丰富多彩的个人演员阵容,每个人都有自己的个性和动机。

Evolution of games and their characters

今天我们有像《刺客信条》这样的游戏,它们看起来绝对令人惊叹。或者像《辐射新维加斯》或《生化奇兵》那样的故事情节。甚至程式化的游戏我的这场战争(我玩过最悲伤的游戏。对不起,我们永远不会忘记你!).还有创造甜蜜可信体验的小游戏,比如艾米丽不在

但是我相信创造可信体验的线索是作为一个愿意分享他们创造力的团队的一部分来工作。

尽管动画制作人和概念艺术家之间的关系已经很好的建立起来了,但是编剧和演员的角色还是让这个行业不太舒服。传统上游戏演员应该是“配音演员”,但现在不再是这样了。许多工作室使用动作捕捉软件来捕捉演员全身的表演,将他们提供的特殊动作融入到角色的动画中。**

我们都有不同的灵感,通过合作和对话我们可以成就伟大。有什么比赋予我们的作品一点自己的独特性更好的方式来创造人类体验呢?

你在游戏中体验过恐怖谷吗?当你追踪一个好故事或一个引人注目的角色时,你也有这种感觉吗?请在下面分享你的想法,我很乐意收到你的来信!

本文由Yisela Alvarez Trentini于 2019 年 3 月 3 日在 女性游戏开发者 Meetup(法兰克福) 上原创。

失业的人工智能专家

原文:https://towardsdatascience.com/the-unemployed-ai-expert-de5528e0443b?source=collection_archive---------27-----------------------

Photo by Christopher Burns on Unsplash

失业的人工智能专家就像喜马拉雅山的雪人一样难以捉摸。事实上,在我跨越二十多年的 AI 生涯中,我从未遇到过一个。

然而,在过去的一年里,自从媒体意识到人工智能的惊人世界后,我一直收到这样的疑问:既然人工智能是一个新事物,我毕业后会找到工作吗?我从未见过人工智能专家等的广告。

我不怪人家问这些问题。在过去的几十年里,特别是在过去的一年里,我作为马耳他的一员。人工智能工作组,我见过成千上万的人,他们可能听说过人工智能,可能正在广泛使用它,但不知道他们在使用它,甚至不知道它是什么。这篇文章旨在澄清事实。

AI 并不是什么新鲜事物。事实上,我们可以在整个人类历史中追溯其最初的一些概念,如古埃及的移动雕像或达芬奇的机械计算器。

但真正点燃这一研究领域的火花发生在 1956 年夏天,在美国达特茅斯举行的一次研讨会上。

在那次为期两个月的活动中,计算机科学家和数学家齐聚一堂,解决创造智能机器的问题。当然,他们没有解决这个问题,但是,他们成功地创造了“人工智能”这个术语。

他们还为人工智能的各个子领域播下了种子,如机器学习、计算机视觉、自然语言处理、问题解决和许多其他领域。

在接下来的六十年里,人工智能成为了一个独立的领域,政府和私人机构向人工智能研究投入了数十亿美元。当然,像任何其他研究领域一样,有巨大的成功,也有巨大的失败。

人工智能的问题是,尽管我们每天都在使用它,但很难识别它,因为没有标签明确表明我们实际上在使用人工智能。

经验法则是,如果自动化过程需要某种智能,那么它最有可能是一个人工智能系统。

如果人工智能就在我们身边,为什么我们在马耳他看不到人工智能专家的显性工作?

想象一下,我有自动百叶窗,就是那种你按下按钮就能上下移动的百叶窗。那不是 AI 而是简单的自动化。我按下按钮,事情就发生了。我必须做出决定,触发一切。

但是,如果百叶窗连接到一个计算机系统,该系统可以检查外面的天气,知道你是否在家,随着时间的推移了解你的偏好,然后决定是否关闭或打开百叶窗,那么我们就接近于一个智能系统。

我可以找到无数这样的例子,让你在日常生活中使用人工智能。使用谷歌时,是人工智能在为你寻找信息。当你浏览脸书时,是人工智能决定你能看到哪些帖子。

一些洗衣机现在能够称重衣服并决定用水量,一些烤箱决定烹饪食物的正确温度——这是人工智能做出的决定。

在带气候控制的空调中,本质上是人工智能在不断地为你调节温度。

如果人工智能就在我们周围,为什么我们在马耳他没有看到人工智能专家的明确工作?原因是,与行业的巨大需求相比,全球范围内的人工智能专家很少。

中国科技公司腾讯(Tecent)声称,全球约有 30 万名“人工智能从业者和研究人员”,但拥有这些资格的人可以获得数百万个职位。

正因为如此,公司倾向于使用诸如软件开发人员、数据科学家等计算工作的总称,以便至少找到某人。

他们非常清楚,人工智能专家本质上是具有人工智能专长的计算专家。当公司设法聘请一个,他们就被用来处理最困难的问题,其中许多没有明显的解决办法。

当然,他们得到的报酬也与任务的难度成正比,我们的毕业生是业内报酬最高的。我们领域最大的招聘机构是互联网、金融科技、软件开发、教育、制造、电信、咨询和政府机构。

总的来说,如果我们想达到总理为马耳他设定的雄心勃勃的目标,即在人工智能方面进入世界前 10 名,该国需要更多的人工智能毕业生。

自去年以来,马耳他大学信息通信技术学院人工智能系的学生人数已经增长了 300%,但我们需要更多的学生来为我们的国家服务,并成为人工智能领域的全球颠覆者。

最初发表于【timesofmalta.com】

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

软糖罐里的意外一课

原文:https://towardsdatascience.com/the-unexpected-lesson-within-a-jelly-bean-jar-1b6de9c40cca?source=collection_archive---------17-----------------------

Photo by Patrick Fore

糖豆如何帮助我理解一个关键的人工智能原理

在英国维多利亚时代晚期普利茅斯的一个牲畜交易会上,一位名叫弗朗西斯·高尔顿的统计学家让大约 800 名与会者猜一猜展出的一头公牛的重量。然后他计算了所有估计值的中间值,结果是 1207 磅。令他惊讶的是,这头牛的测量重量为 1198 磅,这使得估计值的中位数与实际重量相差约 0.01%。正如高尔顿自己指出的:

……最中间的估计表达了人民的心声,其他的估计被大多数选民指责为过低或过高

这实际上意味着,作为一个群体,或者作为一群独立思考者,我们是非常非常好的评估者。

因为我热爱数据和科学,我想自己复制这个实验,所以不久前我在我的办公室用我自己的方式复制了这个实验。我负责软糖罐游戏,你可能在之前就听说过

我买了一个罐子,里面正好装了 490 颗豆子(是的,我都数过了)。然后,像弗朗西斯·高尔顿爵士一样,我让 30 名同事估计一下罐子里软糖的数量。令我惊讶的是,估计值的分布如下所示:

Distribution of Jelly Bean Estimates. Red line depicts the mean estimate.

平均估计是 487,离地面只有三颗糖豆的距离!通过这个简单的实验,我越来越相信民意群众智慧是真实存在的。

作为一个群体,我们是非常好的估计者,但作为个体,就不那么好了。

注意:有耐心的人比胡乱猜测的人表现更好。在我的实验中,一些人测量了罐子的体积,并估计了每颗软糖的体积,然后将其推断为罐子里软糖的数量。其他的干脆去说“嗯不知道……1000”(见图)。尽管如此,所有的估计都集中在一个值上,即地面真相。请记住这一点。

在本文的其余部分,我将把这个大众之声原则与我长期以来一直感兴趣的一个原则进行比较。这听起来可能很疯狂,但我认为人工神经网络与它有一个共同点。特别是因为在这两种情况下,零件的集合被赋予一个单一的任务,并一起工作来解决它。我希望在这篇文章结束时,你也有这样的感觉。

开始这种比较的一个好方法可能是提供一个人工神经网络中神经元的定义。我发现这种描述对 understand⁴:来说相当有说服力和简单

每个神经元接收一个或多个输入信号 x 1x 2 、…、x m,并向下一层的神经元输出值 y ,依此类推。输出 y 是输入信号的非线性加权和。

根据这种观点,人工神经网络中的神经元是集体思维的个体。事实上,ANN 的事实上的架构是一个相互关联的个体回归变量的集合。一个具有 n 个输入神经元的神经元的输出被定义为 by⁵:

然后,每个输出 h 是来自所有输入 x 的单独线性回归之和的具有参数 Wb 的函数,这又将是下一层的输入(在激活函数之后,通常是非线性⁶)。神经元集体地并且只有集体地解决任务。尝试用一个神经元为一个复杂的任务建立一个人工神经网络分类器,你很可能会失败。这就像高尔顿让一个人估计一头牛的重量。估计很可能是错误的。这就是安真正集体工作的地方。这个概念可以在下一个例子中形象化:

Taken from here

在上面的图像中,经过训练的 NN 从“2”的图像中提取 784 个特征作为输入,并相应地对其进行分类。随着每个神经元的增加,系统的复杂性急剧增加,但反过来增加了有效提升分类器性能的可能特征排列的数量。但是加多了,你就会成为 overfitting⁷.的受害者我建议你访问这个谷歌游乐场来更好地理解这些和其他概念,在这里你可以看到每个添加(或移除)的神经元对一个简单分类器的影响。试着只用前两个特征( XX ) 训练模型,看看结果。现在多做一点。你能找到获得好结果所需的最少神经元数量吗?做简单的任务需要很多神经元/层吗?答案是否定的。我们一会儿再回到这个话题。

回到公牛和糖豆,这就像找到一个非常好的估计所需的最小个体数量。当然,向 10,000 人询问牛的重量会减少误差,但在 800 人的时候,我们已经有 99%接近事实了。只有当期望的输出没有被满足时,增加算法的复杂度才是有用的。从这里开始,从计算上来说,最好减少估计量,以找到达到期望性能所需的最小值。一旦找到这种平衡,vox populi 就会降低计算成本。为了理解这一点,我们可以看看我用 Python 快速制作的下一张图:

Distribution plots with μ = 1 and σ = 0.1 from 10 to 1000 points.

我们可以创建一组随机正态分布,其中μ= 1T5σ= 0.1,同时将样本数量从 10 个增加到 1000 个。因为我们知道均值基本事实设计为等于 1,所以我们可以计算这些分布的平均值,看看它有多接近 μ。正如你可能已经猜到的,我们拥有的数据越多越好,这意味着我们的估计越来越接近我们的实际情况。在无限个样本之后,我们到达 μ ,但是由于显而易见的原因,这是不切实际的。甚至可能由于某种原因,1000 个样本太昂贵,我们决定使用 500 个点集合进行分析,这产生了满足我们需要的误差。这是我们的最佳点:足够概括以最大化性能,但足够具体以最小化错误。人工神经网络遵循类似的(尽管不完全相同)原理。

尽管对于应该 use⁸多少个神经元和多少层有一些通用规则,但选择这些限制是我在构建深度神经网络时经常遇到的一个常见问题。对于一个相当简单的问题,太多的神经元和/或层可能会导致严重的过度拟合(在我们之前的例子中,询问 10,000 个人关于牛的体重或使用 1000 点或更多)。太少的话,你将无法推广你的盲测模型。在某种程度上(一般来说),ANN 对简单性和复杂性之间的平衡感到很舒服。

回到 Google 的 TensorFlow Playground,我们可以看到,在一个非常简单的分类任务中,简单的人工神经网络达到低损失值所需的时间很短:

Simple ANN classifier with one Hidden layer and two neurons. Image generated from freely available TensorFlow Playground.

虽然微不足道,但这充分体现了我想表达的观点。测试训练损失在大约 350 个时期内达到大约 0.05(见散布图正上方的值)。现在让我们看看过度复杂的人工神经网络对相同的数据进行分类并使用相同的参数会发生什么:

Complex ANN classifier with six Hidden layers and 8 neurons. Image generated from freely available TensorFlow Playground.

甚至不到 200 个时期,损失值仍然不在与前一个例子相同的水平上。如果我们等待足够长的时间,网络会完成这项工作。根据前面段落中的正态分布示例,您可以使用数千个点来获得对 μ,的“更好”估计,但误差无法补偿高成本。在这个例子中,同样的事情正在发生。更不用说其他超配的 problems⁹,后一种架构对于这样的任务来说太昂贵了。第一种架构以非常低的成本完美地完成了工作,因此选择它而不是另一种是更明智的决定。

我喜欢将人工智能模型,特别是深度神经网络,视为复杂的系统,应该尽可能简单地构建。信不信由你,我的果冻豆罐实验帮助理解了这个原理。这两种情况都需要划分某个任务(刚好足够)来共同解决它。这似乎是最好的解决办法。正如阿尔伯特·爱因斯坦在 1933 年⁰:的一次演讲中指出的

几乎不能否认,所有理论的最高目标是使不可约的基本元素尽可能简单和少,而不必放弃一个单一的经验数据的充分代表。

我不能和那个争论。可以吗?

感谢您的阅读!

参考资料:

[1]高尔顿,F. 人民之声 (1907),自然75 (7),450–451 页。

[2]关于群体智慧故事的正文:https://towards data science . com/on-the-Wisdom-of-Crowds-collective-predictive-analytics-302 b7ca 1c 513

[3]安资源:https://towardsdatascience.com/nns-aynk-c34efe37f15a

[4] Koutsoukas,a .,Monaghan,K. J .,Li,x .,& Huan,J. 深度学习:调查深度神经网络超参数并与生物活性数据建模的浅层方法进行性能比较(2017)化学信息学杂志9 (1),42 .

[5]关于多层神经网络基础的伟大文字:http://ufldl . Stanford . edu/tutorial/supervised/MultiLayerNeuralNetworks/

[6]激活函数:https://towards data science . com/Activation-functions-neural-networks-1 CBD 9 F8 d 91d 6

[7]关于过拟合的一句话:https://www . Jeremy Jordan . me/deep-neural-networks-preventing-over fitting/

[8]https://stats . stack exchange . com/questions/181/how-to-choose-the-number of-hidden-layers-and-nodes-in-a-forward-neural-netw

[9]https://towards data science . com/preventing-deep-neural-network-from-over-fitting-953458 db 800 a

爱因斯坦真的这么说过吗? (2018) 性质557 (7703),30–31。

在分类系统中使用软 F1 损失的未知好处

原文:https://towardsdatascience.com/the-unknown-benefits-of-using-a-soft-f1-loss-in-classification-systems-753902c0105d?source=collection_archive---------2-----------------------

如何不保持一个决策门槛,仍然直接针对你关心的东西进行优化!

在生产中部署机器学习系统并确保其日常效率可能是一项非常艰巨的挑战。在过去的五年里,我看到越来越多的技术变得越来越复杂(算法、编码库、云服务等等)。这是用有用的人工智能应用重塑我们世界的好消息。

但是,和许多其他领域一样,化繁为简是成功的关键。莱昂纳多·达·芬奇将简单描述为“终极的复杂”。
在数据科学中,它不仅仅是一种理论,它可以采取流程的形式。

Photo by Hilthart Pedersen on Unsplash

不管怎样,我为什么要说这个话题?
在一篇非常鼓舞人心的题为“ 机器学习:技术债务的高息信用卡的论文中,谷歌的一个人工智能研究团队分享了一些非常务实的建议,关于如何在生产中管理机器学习系统的复杂性。在他们描述的所有方面中,有一个问题是如何使 ML 系统适应外部世界的变化。

下面是他们对动态系统中固定阈值的看法:

通常需要为给定模型选择一个决策阈值来执行一些动作:预测真或假,将电子邮件标记为垃圾邮件或非垃圾邮件,显示或不显示给定的广告。机器学习中的一种经典方法是从一组可能的阈值中选择一个阈值,以便在某些指标(如精确度和召回率)上获得良好的折衷。然而,这种阈值通常是手动设置的。因此,如果模型根据新数据更新,旧的手动设置的阈值可能无效。跨多个模型手动更新多个阈值既耗时又脆弱。对于这类问题,一个有用的缓解策略是通过对 heldout 验证数据的简单评估来学习阈值。”

最近,我一直在研究一个 ML 系统,以帮助自动化汽车诊断。基于汽车数据,系统应该预测在发生事故时需要更换哪些零件。这是一个多标签分类问题,可以分解成数百个二元分类子问题(每个部分一个)。

考虑到所有的生产约束,学习和不断更新每个子问题的决策阈值对我来说非常乏味。

在这篇博文中,我想分享一些额外的缓解策略,以忽略决策阈值的调整,并仍然获得分类系统的优化性能。据我所知,没有像这样的普遍做法,没有文章,没有公认的研究。这只是我实验的结果。因此,我建议谨慎使用以下见解,并随时分享您的观点和我们可以一起讨论的任何问题。

如果你想重现结果,你可以一步通过这个 Jupyter 笔记本 。完整的代码在麻省理工学院的许可下共享在 Github 上。

研究案例

为了说明这个想法,让我们考虑一个从海报图像预测电影流派的机器学习系统。对于每个海报,可以分配一个或多个标签(动作、惊悚、戏剧、恐怖、奇幻等。).卷积神经网络当然是学习从电影海报到可能的标签列表的映射的非常好的方法。关于实现细节,可以在 tensor flow 2.0中阅读我关于“ 多标签图像分类”的文章,但也可以独立继续阅读本文。

了解 F1 分数

给定一张电影海报,我们需要预测系统为每个标签生成 0 或 1 的预测。例如,如果一部电影有一些“动作”内容,系统应该给“动作”标签分配 1,否则应该给相同的标签分配 0。对于每部电影,我们以一个 N 维的二进制向量结束,这个向量代表所有的猜测,N 是所有可能的标签(电影类型)的数量。二元预测向量可能看起来像这样:00011000001..000.

当对一个标签进行推理时,有四种类型的预测:

  • 两种类型的正确预测(真阳性和真阴性)。
  • 任何观测值预测为阳性而实际为阴性的错误类型 I(假阳性,也称为假警报)
  • 任何观测值预测为阴性而实际为阳性的错误类型 II(假阴性)

这通常使用混淆矩阵来可视化。

基于此,通常分析两个指标:

  • Precision: TP/(TP+FP)
    在所有预测为阳性的示例中,实际为阳性的百分比是多少→我们希望降低错误警报率
  • 回忆:TP/(TP+FN)
    在所有实际为正的例子中,预测为正的占百分之几→我们要提高模型的灵敏度

但是因为这两个指标通常是相互对立的,所以我们可以依赖它们的调和平均值,即F1-得分

在开发您的 ML 系统时,有一个单一的评估指标可以加快进度。

直接针对 F1 分数进行优化

在训练和评估机器学习算法(如神经网络)之前,我们需要定义两个主要函数:

  • 一个损失函数:它是现代机器学习的面包和黄油。我们需要它来测量训练批次的模型误差(成本)。它必须是可微分的,以便反向传播神经网络中的误差并更新权重。
  • 一个评价函数:它应该代表我们真正关心的最终评价指标。与损失函数不同,它必须更直观地理解模型在现实世界中的表现。

如果我们想使用 F1 分数作为评估指标,有两种可能的策略来最大化它:

策略 1: 通过设定阈值使 F1 分数最大化

当模型生成概率值时,我们需要为每个标签设置一个阈值,以获得二元预测。例如,如果动作的概率高于阈值 0.5,我们可以预测 1(电影是关于动作的),否则我们预测 0(没有动作)。使每个标签的 F1 分数最大化的最佳阈值在 0 到 0.5 之间(有数学证明,但不在本文中讨论)。我们通常在等待验证集上搜索阈值。

策略 2: 将 F1 得分嵌入损失函数

如果您想直接针对 F1 指标进行优化,这将是最简单的方法。损失函数不仅提供了模型误差的度量,它还是定义如何最佳拟合数据以实现最佳目标的学习过程的核心。出于某种原因,将 F1 分数嵌入损失函数并不是一种常见的做法。

Introduction to loss functions (Algorithmia)

为什么在损失函数中出现 F1 得分是不寻常的?

F1 分数的问题是它不可微分,因此我们不能将其用作损失函数来计算梯度和在训练模型时更新权重。请记住,F1 分数需要二进制预测(0/1)来衡量。

通常我们使用binary cross-entropy loss,它代表某一特定类别观察值的负对数似然性-log(p),模型预测该类别的概率p。一般来说,这种损失效果很好,并广泛用于使用策略 1 训练分类器,但它并不直接与我们想要最大化的 F1 分数一致。

解决方案?

我们可以修改 F1 的分数,使其具有可区分性。我们可以通过使用概率而不应用任何阈值,将真阳性、假阳性、假阴性的数量计算为似然值的连续和,而不是将它们计算为离散的整数值。

让我们来看两个有助于理解这种转变的例子:

***Example 1:** If the target is 1 for a movie being Action and the model prediction for Action is 0.8, it will count as:0.8 x 1 = 0.8 TP (because the target is 1 and the model predicted 1 with 0.8 chance)0.2 x 1 = 0.2 FN (because the target is 1 and the model predicted 0 with 0.2 chance)0.8 x 0 = 0 FP (because the target is 1 not 0, condition negative is not valid)0.2 x 0 = 0 TN (because the target is 1 not 0, condition negative is not valid) **Example 2:** If the target is 0 for a movie being Action and the model prediction for Action is 0.8, it will count as:0.8 x 0 = 0 TP (because the target is 0 not 1, condition positive is not valid)0.2 x 0 = 0 FN (because the target is 0 not 1, condition positive is not valid)0.8 x 1 = 0.8 FP (because the target is 0 and the model predicted 1 with 0.8 chance)0.2 x 1 = 0.2 TN (because the target is 0 and the model predicted 0 with 0.2 chance)*

我们将这个版本称为**soft-F1-score**。下面,你可以看到在 TensorFlow 中的一批预测上实现它的代码。

这里有一些事情需要考虑:

  • 每个标签的成本实际上是该标签的1 — soft-F1。要想最大化软-F1,就要最小化1 — soft-F1
  • 你可以把soft-F1定义中的PrecisionRecall替换掉,得到一个更直接的基于 TP、FP、FN 项的公式。之所以要这样做,是因为当 TP = 0 时,F1 的调和平均值表达式是未定义的,但转换后的表达式是定义的。
    F1 = 2 * TP / (2 * TP + FN + FP)
  • 一批观察中的总成本将是所有标签上的平均成本。我们将称之为macro soft-F1 loss
  • 你必须确保批量足够大,以便在培训时看到一个代表macro soft-F1 loss

学习曲线(优化和评估指标)

让我们假设,为了简单起见,我们希望对所有标签只使用一个阈值来将任何概率值转换成二元预测。换句话说,我们现在将考虑默认阈值 0.5,并通过优化我们之前定义的宏软 F1 损失(策略 2)来尝试最大化宏 F1 得分@阈值 0.5,而不是通过为每个标签分别设置阈值来最大化性能。

与使用似然项的宏软 F1 不同,我们将在宏 F1 分数的实现中使用阈值 0.5。

在下面的学习曲线上,我们观察了训练过程中损失度量(宏软 F1)和评估度量(宏 F1-分数@阈值 0.5)的变化。

Learning curves (macro soft-F1 loss and macro F1 @thesh 0.5) with a batch size of 256

您可能会注意到,在学习曲线上,宏观软 F1 损失降低到接近 0.69 的水平与宏观 F1 分数增加到接近 0.33 的水平相关。这两个值几乎互补为 1。请记住,我们定义的宏软 f 1 损失实际上是我们需要最小化的 1-软 F1 的宏。这是第一个指标,表明宏观软 F1 损失直接优化了我们的评估指标,即宏观 F1 得分@阈值 0.5。

了解宏观软-F1 损失的作用

为了解释这个损失函数的含义,我训练了两个神经网络模型,它们具有相同的体系结构,但是有两种不同的优化。第一个模型使用宏观软 F1 损失直接优化宏观 F1 得分,而第二个模型更经典,并针对二进制交叉熵进行了优化。在这两种情况下,当预测电影海报的类型时,训练的模型将为每个标签生成独立的概率分数。为了创建最终的决策系统,我们需要为每个标签选择 0 到 1 之间的决策阈值,以便将每个概率转换成二进制信息。通常,系统的性能取决于这些决策阈值的选择。因此,让我们检查一下,对于每种类型的优化,系统如何根据我们为某些标签设置阈值的级别来处理验证集。

有趣的事情正在这里发生!

当使用宏软 F1 损失训练模型时,我们得到几乎与阈值无关的 F1 得分(绿色曲线)。当使用二元交叉熵损失时,我们没有这种效应。这实际上是一个有趣的效果,因为它提供了将所有标签的阈值固定在 0.5 的可能性,并且仍然获得接近于当使用 BCE 损失时通过搜索最佳阈值所获得的性能。当构建生产 ML 系统时,这是一个非常好的特性。更新阈值并确保它们在新数据到来时保持最佳状态是一项巨大的工作。使用宏软 F1 损失可以帮助解决这个问题,但实际上这种行为来自哪里?

当使用两种不同的优化时,分析来自神经网络的概率值的分布将是有趣的。

好了,现在可能看起来更清楚了!

当使用二进制交叉熵损失进行训练时,输出的概率分布具有一些高斯属性(注意蓝色直方图的钟形)。实际上,这种优化是从数据的原始分布中学习的。我们可以看到,对于覆盖 50%数据集的标签“Drama ”,概率分布集中在 0.5。顺便说一下,为“戏剧”构建的分类器似乎非常弱,因为这两个类别似乎没有在概率值上分开。我们还可以注意到,标签出现的频率越低,分布就越左移。例如,“喜剧”的概率得分似乎更低,这个标签只覆盖了数据集的 32%。该模型从这种罕见性中学习来预测较低的概率值。另一方面,当使用宏软 F1 损失时,我们正在创建一个不反映相同数量级的条件概率值的系统。相反,它学会不那么犹豫,并生成非常接近 1 或 0 的预测。我们在中间范围有较少的概率值。因此,在该范围内改变阈值时,性能不会发生太大变化。

使用宏软 F1 损失进行优化可以取代一些穷举技术,例如:

1-在验证集上搜索使性能最大化的最佳决策阈值

2-通过在训练前对少数类过采样或对多数类欠采样来校准概率值(在多标签分类的情况下非常复杂,因为标签同时出现)

缺点和对策

您可能已经注意到,在标签“Drama”的情况下,使用宏 soft-F1 loss 进行优化会产生一个预测“Drama”始终为正的模型(请注意概率直方图如何在最右侧接近 1,以及召回曲线如何在 100%的最大水平保持不变)。

每当训练好的分类器不提供信息时,这种副作用就可能发生。这是由于加州大学的研究人员在这篇 论文 的第 10 页上证明了 F1 度量的一些性质。

只要测试集中实际阳性的频率不为零,并且分类器不提供信息,就可以通过预测所有样本为阳性来最大化预期 F1

本文关注的是通过阈值化来最大化 F1 得分(策略 1),但同样的逻辑也适用于本文所述的基于软 F1 优化的最大化(策略 2)。

我们基本上希望最大化 F1 的期望值,作为正面预测的函数,因此我们可能需要定义以下术语:

*F1 = 2*tp / (2*tp + fp + fn) # translated expression of F1
a = tp + fn # number of actual positives
b = a / (tp + fp + fn + tn) # label frequency
c = tp + fp # number of predicted positives*

当分类器不提供信息时,真阳性的数量预计是所有阳性预测的一部分,等于基本比率(标签频率)

*E(tp) = c * b # expected tp in case of uninformative classifier
a + c = 2 * tp + fp + fn # denominator in previous F1 expression*

然后,可以使用以下公式计算预期 F1:

并且期望 F1 相对于 c 的偏导数可以分解如下:

这个导数总是正的,这证明了每当分类器没有信息时,系统将通过预测所有样本为正来学习获得最优 F1。

如果你觉得这种效果不好,我建议采取以下对策。

当考虑 F1-socre 时,我们默认推理正类(结果等于 1)。但是,你也可以考虑在相同的条件下,如果你对负类进行推理(结果等于 0),你会得到的 F1 分数。唯一的区别是 TP 和 TN 量的交替。

*F1_class1 = 2*tp / (2*tp + fp + fn)
F1_class0 = 2*tn / (2*tn + fn + fp)*

然后我们可以取这两个量的平均值来定义一个新的度量。

*New_F1 = (F1_class1 + F1_class0) / 2*

当然,让它变得可区分:

通过这样做,你可以期望系统通过不仅生成正面预测而且生成负面预测来抵消其先前的行为,以便优化这个新的损失。

这将保护系统在无信息分类器的情况下避免预测总是肯定的不可接受的行为。

摘要

生产 ML 系统的性能来自于部署可靠且易于维护的模型。决策阈值是复杂性的另一个来源。在这篇博文中,我分享了一个优化技巧,通过将 F1 得分的定义纳入损失函数(软 F1 损失)来避免不断调整决策阈值。这非常有帮助,尤其是在多标签分类的情况下,您希望使用相同的默认阈值 0.5 将预测转换为二进制结果,同时保持最佳的分类性能。

从海报预测电影类型是标签数量可能变高的一个例子。但这实际上是一个艰难的分类挑战。在一些标签上,我们只能得到非常弱的分类器。在无信息分类器的情况下,所描述的技术可能导致预测总是肯定的不良效果。如果你想避免这种影响,你可以使用双软 F1 损失。

在其他一些数据集上,比如汽车诊断,我可以看到非常有趣的结果。因此,如果您正在处理类似的任务,您可以在自己的数据集上尝试,并让我知道您得到的结果!

熊猫中方法链接的不合理有效性

原文:https://towardsdatascience.com/the-unreasonable-effectiveness-of-method-chaining-in-pandas-15c2109e3c69?source=collection_archive---------3-----------------------

方法链接如何提高代码的可读性,用 lambda 函数编写自定义管道以实现最大的灵活性,并以代码格式化技巧结束。

Image by Texturex

介绍

方法链接是一种编程风格,依次调用多个方法调用,每个调用在同一个对象上执行一个动作并返回它。它消除了在每个中间步骤命名变量的认知负担。 Fluent 接口,一种创建面向对象 API 的方法依赖于方法级联(又名方法链)。这类似于 Unix 系统中的管道。

方法链接大大增加了代码的可读性。如果你不相信我,我们去问问杰克和吉尔。

让我们尝试使用嵌套函数调用和方法链接来讲述杰克和吉尔的故事

嵌套调用:

方法链接:

方法链接的一个明显的优点是,它是一种自顶向下的方法,参数放在函数旁边,不像嵌套调用,在嵌套调用中,跟踪各个函数调用到其参数是很费力的。

Pandas 为方法链接提供了几个函数,

向数据帧assign添加新列,重命名列rename,过滤数据帧query等。让我们来看看教育学的wine数据集。它包含 178 种葡萄酒的化学成分。

Wine dataset

下面的代码从重命名color intensity开始,因为它的缩写是ci。然后,它基于hueci上的值创建一个新列color filter。然后,它过滤酒精含量超过 14 的葡萄酒,并通过彩色过滤器。最后,它根据酒精含量对数据框进行排序,并显示我们感兴趣的列。如果在没有方法链接的情况下重复相同的步骤,则必须在每个步骤创建一个新的数据帧。

方法链接的好处和坏处:

Image by Sally Dasouki

与 Python 相比,R 的一个优势是它的tidyverse 包具有丰富的方法链接功能。再加上margrittr,你经常可以找到一种方法来做你想在管道中做的事情。另一方面,Pandas 没有一个可理解的方法列表用于方法链接。但是为了弥补它,熊猫从版本 0.16.2 开始引入了管道功能。管道在方法链中启用用户定义的方法。

随着 pipe 的引入,你几乎可以在一个方法链中写任何东西,这引发了一个问题,多少链是太多了?。这是一个完全主观的问题,必须由程序员来决定。大多数人发现在一个单独的链中有 7 或 8 个方法是最合适的。我对一个链中的方法数量没有任何硬性限制。相反,我试图用一个方法链来表示一个连贯的思想。

一些方法链的坚定批评者指责它增加了代码的可读性,但却增加了调试的难度,这是事实。想象一下,一个月之后,你正在调试一个十个方法长的链。从那时起,数据帧结构或列名已经改变,现在您的链开始抛出错误。尽管您可以很容易地找到哪个方法调用破坏了代码,但是现在不可能在整个链中进行调试,并在您沿着链移动时看到它对数据帧所做的更改。在生产或笔记本中开始使用长方法链之前,需要解决这个问题。

组合管道和 lambda 函数:

Image by Grofers

每当数据框架的形状改变时,我经常会遇到方法链接的问题。如果你能沿着链跟踪形状,调试就容易多了。让我们定义一个自定义管道函数。编写管道函数的关键是它应该接收数据帧并返回数据帧。

这个函数中需要注意的两件事是可以接受 lambda 函数的fn参数和display函数调用。Lambda 函数提供了灵活性,display 函数调用使 Jupyter 实验室或笔记本电脑环境中的数据框和绘图显示更加美观。

在这个例子中,我们可以看到我们从 13 列开始,assign将列数增加到 14,随后的query将行数减少到 22。末尾的管道从数据帧中随机打印出 5 行。这可以很容易地更改为 head 或 tail 函数。由于自变量是一个 lambda 函数,它给出了无数种可能性。当你开始写一个链时,在末尾添加一个带有csnap 函数的管道有助于你看到链上的变化。完成后,您可以删除管道或注释掉该行。这是拆除管道的一种幼稚的方法。相反,如果要将代码转移到生产环境中,可以使用 logger 对象并将其写入外部文件。

Example of logging to a file

日志记录为我们提供了不删除管道语句的灵活性,而是将日志记录级别更改为 INFO,以避免在生产过程中获得调试信息。

让我们看看其他自定义管道函数。setcols用于设置链中的列名。通常,当我们从外部源读取数据时,列名将包含大小写以及空格和特殊字符。这些问题可以这样解决,

Iris data set before and after column rename

**csnap** 函数不同 **setcols** 函数创建数据帧的副本,这使得函数调用代价很高。但这是必要的,以确保我们没有在数据帧的全局副本上写入。大多数 pandas 函数的工作方式类似,都有一个就地标志,用于返回新的数据框或重新分配顶级引用。

杰夫·雷巴克说,

不能保证就地操作确实更快。通常,它们是对副本进行的相同操作,但是顶级引用被重新分配。

让我们用最后一个例子来结束这一部分。r 有一个多功能的选择函数,可以选择/取消选择宽数据框中的列,而不是列出所有内容。cfilter 使用 lambda 函数帮助我们实现同样的多功能性。

代码格式:

当多人使用不同的 IDE 在同一个代码库上工作时,代码格式的一致性是一个令人头疼的问题。在多行函数调用的情况下,方法链接使这个过程更加复杂。

输入黑色:

Image from Black

摘自他们的 GitHub 描述,

布莱克是不折不扣的 Python 代码格式化程序。通过使用它,您同意放弃对手写格式的细节的控制。作为回报, Black 为您提供了速度、确定性以及摆脱 pycodestyle 对格式的困扰。你将节省时间和精力去做更重要的事情。

不管你在读什么项目,黑化的代码看起来都一样。一段时间后,格式变得透明,您可以专注于内容。

黑色通过产生尽可能小的差异,使代码审查更快。

使用 black 的一个主要优点是它理解 fluent 接口并相应地自动格式化函数调用,不像任何其他 IDE 的默认格式化程序。

为 Pycharm 设置黑色:

第一步是pip install black。在 pycharm 中,您可以将它集成为一个文件监视器,这样每次保存文件时,都会自动完成格式化;也可以将它集成为一个预提交挂钩,这样每次提交时,都会对代码进行格式化,从而保持整个项目的格式化完整性。详细的设置说明可在这里找到。

为 Jupyter 笔记本/实验室设置黑色:

第一步是pip install nb_black。下一步是根据环境加载适当的扩展。如果是笔记本,那么使用%load_ext nb_black其他实验室用%load_ext lab_black

一个快速演示布莱克的行动,

Before and after of Black Formatting

参考:

1)https://tomaugspurger.github.io/method-chaining

2)https://stack overflow . com/questions/22532302/pandas-specular-performance-drop-in-place-rename-after-drop na/22533110 # 22533110

3)https://github.com/ambv/black

未言明的数据科学软技能

原文:https://towardsdatascience.com/the-unspoken-data-science-soft-skills-cc836d51b73d?source=collection_archive---------17-----------------------

A basic neural map of some essential Data-Science skills

对于初学者来说,数据科学的世界可能令人望而生畏,因为在许多方面,数据科学是许多不同操作之间的桥梁。不仅有硬技能:编程、计算、统计,当然还有更多,而且作为一名数据科学家还有许多更小的软技能。这些技能是数据科学所必需的,并且在数据科学的世界中每天都非常依赖。

阅读和写作

每个数据科学家需要掌握的最不言而喻也是最重要的软技能之一是熟练的阅读和写作。如果你真的很擅长计算机,但英语课不及格,数据科学可能不适合你。对任何软件工程师来说,最重要的事情之一就是能够轻松快速地解读文档以及错误输出。当然,考虑到这一点,数据科学的世界一直在发生变化。作为一名数据科学家,要求你每天都要学习。大量的资源将无法在视频或有声读物中获得,而是必须阅读。理解所使用的词汇对于理解软件包如何工作,以及如何将它们合并到您的软件中,或者在您的数据上使用它们也是绝对重要的。

写作也是绝对重要的,但是对你写作能力的依赖也取决于你的工作。关于数据科学的一个有趣的事情是,许多工作在需要证明的技能和掌握程度方面非常不同。例如,在一份工作中,你可能大部分是工程包,并为你的团队编写函数。而在另一份工作中,你可能正在创建复杂的模型,或者用机器学习解决复杂的问题。有些工作可能需要更像软件工程师的数据科学家,而其他工作可能需要擅长写备忘录的数据科学家。无论如何,写作肯定是一项非常重要的技能。

商业

虽然一般来说,拥有业务相关技能的想法不被视为软技能,而是硬技能,但对于数据科学家来说,这往往最终会成为他们主要工作流程的副产品。然而,对于从事商业分析、预测建模和统计实验广告的数据科学家来说,这项技能绝对至关重要。

捍卫并能够验证你的模型和假设,是企业会发现数据科学家非常有价值的事情。此外,基本的演示技巧对于展示模型、统计数据和可视化来展示你的作品是绝对重要的。

开发运营、网络开发和软件工程

同样,开发运营、Web 开发和软件工程不是软技能。但对于数据科学家来说,尽管这些技能不一定与工作描述相符,但其中许多技能符合你作为数据科学家的日常职责。许多数据科学工作要求你能够设计软件,为全栈 web 开发人员推送数据,甚至编写自己的应用程序和模块来处理数据。

许多数据科学家都很熟悉 Docker,因为它是一个虚拟机工具,并且经常在他们的业务环境中使用它。Docker 传统上并不被认为是一个数据科学工具,而是一个开发运营工具。通常,像任何软件工程师一样,数据科学家需要熟悉他们的终端,以及虚拟操作系统终端,如 Debian、Ubuntu 和 Fedora。

领域知识

有时,领域知识可能是数据处理的关键。了解你的公司是做什么的,以及关于你的公司产品的事情,对于了解你的生态系统内的目标是绝对重要的。

一个很好的例子是人口普查数据,有时人口普查的回答并不完全一致。您可能会遇到这样一个数据集,根据您所拥有的领域知识,您可能会发现某些观察结果是无效的,否则会完全破坏您的模型。

最后

这些只是数据科学家在其环境中取得成功所需的一些较大技能。有时候,对普通人来说,记住所有的事情有点太多了。请注意,所有这些都是常规的数据科学知识。

数据科学是一个快速发展的领域,每天都在扩展和增长,通过对未来十年的预测,肯定可以为我们的生活奠定基础。数据科学最大的特点是个人发展。作为一名数据科学家,世界永远不会停止,因此,你也不能。您必须不断地学习,以跟上数据科学计算领域当前的发展。

现代软件开发的无名英雄

原文:https://towardsdatascience.com/the-unsung-heroes-of-modern-software-development-561fc4cb6850?source=collection_archive---------5-----------------------

每个人都应该知道的开源软件基础

开源软件是人人受益的开发模式。这就是今天许多重要软件的构建方式。

支持这一发展的开源基金会起着至关重要的作用。然而,他们的工作往往不为人知。直到我研究了这篇文章,我才知道有这么多项目受益于这些基金会。

在本文中,我们将了解软件开发人员和数据科学家每天使用的许多工具的幕后推手。

Exploring the landscape of open source foundations

为什么要开源基金会?

开源基金会的出现是为了帮助维持和管理开源项目。这些基金会为与开源软件(OSS)项目有利害关系的公司和个人提供了走到一起的空间。它们作为独立的非营利实体的地位为相互竞争的公司合作提供了中立的基础。

Foundations support the things that get build on top of them

开源基金会通常为软件开发项目提供广泛的业务和运营支持。在基金会的庇护下,该项目通常可以获得财政支持和后台协助。基金会可以通过以下具体方式提供帮助:

  • 谈判并签署供应商合同
  • 雇用员工或承包商
  • 缓冲法律风险
  • 提供法律框架(许多基金会已经创建了自己的许可证)
  • 提供代码签名证书等技术服务
  • 访问银行账户等金融产品
  • 提供营销服务,如新闻发布
  • 提供监督和治理
  • 管理项目成员资格

正如你所想象的,这些都是项目领导需要协助的无价角色。这些基础帮助项目成员专注于修复错误、编写文档和开发新功能。点击阅读更多关于开源基金会的角色

开源基金会领导人

我将重点介绍六个开源基金会,它们是许多重要项目的关键。对于每个基金会,我都会简单介绍一下,提供截至 2019 年初得到支持的项目数量,并重点介绍一些知名项目。请注意,这些团体属于 IRS 对慈善和贸易组织的各种分类,并非所有团体都是基金会。

阿帕奇软件基金会

Apache 软件基金会已有 20 年的历史,是最大的基金会之一。截至 2019 年初,它有超过 350 项开源计划。

ASF 为知识产权和财务贡献提供了一个既定的框架,同时限制了我们的项目提交人的潜在法律风险。通过 ASF 被称为“Apache 方式”的精英管理过程,730 多个个人成员和 7000 名提交者成功地合作开发了免费提供的企业级软件,使全球数百万用户受益:数千个软件解决方案在 Apache 许可下分发;社区积极参与 ASF 邮件列表、指导计划和 ApacheCon,即基金会的官方用户会议、培训和展览。

www.apache.org

许多 Apache 项目都大量使用 Java。受欢迎的项目包括:Apache HTTP Server、Hadoop、Tomcat 和 Arrow。

Linux 基金会

Linux 基金会是 Linux 操作系统和许多相关项目的所在地。它的其他 100 多个项目包括 NodeJS 和 RethinkDB。

Linux 基金会通过提供资金和智力资源、基础设施、服务、活动和培训来支持创建可持续的开源生态系统。Linux 基金会和它的项目一起工作,形成了在创造共享技术方面最雄心勃勃和最成功的投资。

www.linuxfoundation.org

Linux 基金会成立于 2000 年,由另外两个团体合并而成。它目前有超过 1000 名成员,包括所有常见的大牌技术公司。

所有托管项目都获得治理结构和后端资源。一些项目也获得资助。Linux 基金会也提供培训和会议。

自由软件基金会

成立于 1983 年的自由软件基金会维护着构成 GNU Linux 生态系统的项目。其他流行的项目包括 Bash、Emacs、Gawk、Make 和 r。

自由软件基金会(FSF)是一个非营利组织,其全球使命是促进计算机用户的自由。我们捍卫所有软件用户的权利。

https://www.fsf.org/

自由软件基金会有 5,000 多名成员和大约 400 个开放源码软件项目。

软件自由保护协会

软件自由保护协会成立于 2006 年。它有超过 45 个项目,包括像 Busybox、Git、Homebrew、Inkscape、phpMYAdmin、PyPy 和 Selenium 这样受欢迎的项目。

软件自由保护协会是一个非营利慈善机构,帮助促进、改进、开发和维护自由、自由和开源软件(FLOSS)项目。保护协会为 FLOSS 项目提供了一个非盈利的家园和基础设施。这使得 FLOSS 开发人员可以专注于他们最擅长的事情——为公众编写和改进 FLOSS——而 Conservancy 则负责那些与软件开发和文档不直接相关的项目需求。

https://sfconservancy.org/

软件自由保护协会有超过 500 个赞助商,包括谷歌和其他一些大公司。

符合公众利益的软件

公益软件成立于 1997 年。它的 39 个项目包括 haskell、PostgrSQL、Jenkins、Arch Linux 和 Debian。

公益软件是一个非盈利组织,旨在帮助组织开发和分发开放硬件和软件。我们的使命是通过处理他们的非技术性管理任务来帮助真正的、实质性的、重要的自由和开源软件项目,这样他们就不需要运营他们自己的法律实体。

https://www.spi-inc.org/

云本地计算基金会(CNCF)

云本地计算基金会是这个街区的新生事物。成立于 2015 年,支持围绕 Kubernetes 容器化云微服务的开源项目。

CNCF 是一个开源软件基金会,致力于使云本地计算普及和可持续发展。云原生计算使用开源软件堆栈将应用部署为微服务,将每个部分打包到自己的容器中,并动态编排这些容器以优化资源利用率。云原生技术使软件开发人员能够更快地构建优秀的产品。

www.cncf.io

CNCF 成员包括技术名人录:AWS、阿里巴巴云、戴尔、英特尔、甲骨文、微软 Azure、IBM Cloud 和谷歌云。

截至 2019 年初,已有 4 个项目毕业,16 个在孵。受欢迎的相关项目包括毕业于 CNCF 的 Kubernetes。

有趣的是,CNCF 得到了 Linux 基金会的支持。

数字焦点

NumFOCUS 是许多流行的数据科学开源项目的所在地。它成立于 2012 年,其 25 个受欢迎的项目包括 NumPy、Matplotlib、Pandas、Jupyter、Julia 和 Bokeh。NumFOCUS 还将许多其他开源项目作为附属项目进行推广。

NumFOCUS 提供了许多程序来支持我们的使命,即促进可持续的高级编程语言、开放代码开发和可重复的科学研究。

https://numfocus.org/

NumFOCUS 在世界各地举办 PyData 会议。披露:我在 PyData DC 做志愿者,过得很愉快。强烈推荐志愿!😃

这是六个需要了解的开源基金会。他们为许多推动世界发展的开源软件项目提供了宝贵的支持。请注意,我没有包括那些支持少数项目或具有更广泛宣传重点的基金会。

以下是概要:

  • 阿帕奇软件基金会
  • Linux 基金会
  • 自由软件基金会
  • 软件自由保护协会
  • 符合公众利益的软件
  • 云本地计算基金会(CNCF)
  • 数字焦点

如果你知道为其他 OSS 项目提供支持的其他组织,请在评论或 Twitter @discdiver 上告诉我。

要了解更多关于开源基金会的信息,请参见这项调查研究

包装

现在,您知道当时机到来时,您的开源项目将转向何处。你也知道一些人,他们让开源项目有效地成长。

我希望这篇文章对你有所启发。如果你有,请在社交媒体上分享,以便其他人可以找到它。

我写关于机器学习、数据科学、深度学习、云计算、Docker、开源软件和其他有趣的东西。点击这里查看我的文章,如果其中有你感兴趣的,请关注我。

非常感谢所有为开源做出贡献和支持开源的人!👍

用户代理——支撑一系列分析的疯狂字符串

原文:https://towardsdatascience.com/the-user-agent-that-crazy-string-underpinning-a-bunch-of-analytics-86507ef632f0?source=collection_archive---------15-----------------------

令人惊讶的是,我们竟然如此依赖它

Only Innocent Browsers Here (Photo: Randy Au)

在网络分析领域工作一段时间,甚至不到一周,我敢打赌,你就会听说这个叫做“用户代理”的东西。我们从用户那里得到的就是这个字符串,它应该告诉我们关于他们的各种事情。如果我们应该用这个东西来统计和分析用户,我们需要更多地了解它。

目前在 2019 年,它最重要的用途是弄清楚客户正在使用什么设备(桌面、手机等)来将正确的页面设计发送给客户。这不是进行设备检测的唯一方法,但它形成了一个非常重要的基础。甚至 Javascript 设备检测库经常只是请求和解析用户代理。

用户代理还提供了一个数据点,用于在不使用 cookies 的情况下对用户进行指纹识别。它包含在每个 HTTP 请求中,在某些不常见的情况下,它可能很长,并且对用户来说是唯一的。

但是这一串是关于什么的,为什么这些作品有点疯狂?

那么什么是用户代理字符串呢?

用户代理(UA)是 HTTP 报头中的一个字段,客户端“应该”(在技术上 RFC 2219 意识到如果不这样做,它们可能是技术上的分支)将该字段包含在对服务器的请求中。这在 RFC 1945-HTTP/1.0 和当前 RFC 7231-HTTP/1.1 规范中都有规定(具体章节见下图)。RFC 7540-HTTP/2 关注的是 HTTP 消息本身,而不是 UA 所在的报头,所以 7231 也适用于此。

让我们看看在 RFC 中是如何定义 UA 的。

TL;灾难恢复如下:用户代理是…

  • HTTP 请求标头中的字段
  • 这应该包括在每一项请求中
  • 应采用 US-ASCII 格式(与整个标题一样)
  • 由一系列“产品令牌”组成,即带有可选版本号的产品名称字符串,以“/”分隔
  • 产品令牌之间用空格隔开。
  • 允许用括号将注释括起来
  • 产品令牌应排在最重要的前面
  • 一个产品不应该复制另一个产品的令牌来声明兼容性
  • 没有广告,没有过于精细的细节

RFC 1945—1996 年 5 月发布的 HTTP/1.0

rfc1945 — https://tools.ietf.org/html/rfc1945 — HTTP 1.0

虽然这不是必需的,但用户代理应该在请求中包含此字段。— RFC 1945

RFC 1945 早于 SHOULD 的RFC 2119语言,所以读起来更随意。然而,最重要的几点是:

  • 不是必需的,但 UA 应包含在请求中
  • 用于统计目的,跟踪违反协议的情况,根据用户代理限制定制响应
  • 字段可以包含多个“产品令牌”和注释
  • 产品令牌按照识别应用程序的重要性顺序列出

有趣的是,即使在这个 RFC 中,它也已经警告了异常情况,例如一些代理将数据附加到 UA,这使得解释不明确,以及一些客户端不遵循产品令牌语法。

什么是产品令牌?

RFC 1945 — HTTP/1.0

产品令牌只是采用了product/version的格式,其中版本是可选的。令牌由空格分隔,所以产品不应该有空格。历史上,ISO 8859-1(Latin-1)和 RFC 2047 (Base64 和可打印引号)编码是允许的。如今,规范要求使用 US-ASCII,任何八位字节> 127 都被视为“不透明数据”

因此,理论上,你可以将表情符号或 base64 短文推入 UA,但所有的赌注都取决于服务器如何决定是否以及如何处理它。

Encoding to be used in HTTP header fields — RFC 7230 https://tools.ietf.org/html/rfc7230#section-3.2.4

2014 年 6 月发布的 RFC 7231-HTTP/1.1(当前标准)

rfc 7231 https://tools.ietf.org/html/rfc7231 — HTTP 1.1

HTTP RFCs 的后续版本有了更标准化的语言,但一般来说,事情保持不变。它仍然是由空格分隔的产品/版本条目,注释在括号中。值得注意的是增加了非常具体的禁令,禁止在 UA 中放置非必要的细粒度信息或广告。过长的 UAs 是专门针对潜在的指纹用户而言的(我们稍后会谈到这一点)。

还特别说明了不鼓励 产品使用其他产品的产品令牌来声明兼容性。我们将进入下一步。

有趣的是,在 1997 年 1 月的原始 HTTP/1.1 规范或 1999 年 6 月的 RFC 2616 中,这些新增内容并不存在。在互联网使用激增的 5 年间,他们似乎看到了一些他们想要阻止的滥用行为。

历史用户代理使用

虽然了解 RFC 对用户代理字符串的描述有助于了解它所采用的格式,但它并不能告诉你它在实践中是如何使用的。

正如在“浏览器用户代理字符串的历史”中非常有趣地陈述的那样,UAs 今天的现实是,几乎所有东西都首先伪装成 Mozilla。这是因为在 20 世纪 90 年代,当浏览器功能迅速变化时,Mozilla 浏览器具有某些功能,如最初在竞争浏览器中不可用的框架,所以 web 设计师根据用户代理发送不同版本的页面。

但是当其他浏览器在功能上赶上 Mozilla 时,网页设计者更新他们的服务规则很慢(或者懒得更新)。因此,可以支持高级功能的浏览器不会提供具有这些功能的页面。为了解决这个问题,其他浏览器只是声明自己是 Mozilla 来获取 Mozilla 版本。

很快,几乎每个主流浏览器都决定将 Mozilla 作为第一个产品字符串,同时在评论或后续产品字符串中添加实际的浏览器。这很可能是促使最新的 RFC 明确表示不鼓励使用另一个产品的字符串(例如 Mozilla)的原因。直到今天,浏览器仍然这么做,没有任何改变的迹象。

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36
-- A Chrome User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
-- A Firefox User-AgentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362
-- A Microsoft Edge User-AgentMozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
-- An Internet Explorer 11 User-Agent"Links (2.16; FreeBSD 12.0-RELEASE-p10 amd64; LLVM/Clang 6.0.1; text)"
-- A Links2 User-Agent

如果你愿意,你可以用资源在线浏览大量的用户代理,比如这个

你还会注意到,每个浏览器都有自己独特的产品令牌序列和类型。通过足够的研究,你可以相当可靠地知道一个请求来自什么设备和浏览器。IE11 使用注释 Trident/7.0 来表示其渲染引擎,使用“rv:11.0”来表示 IE 版本,Chrome(以及 Edge,在后端转换为 chromium )是完整的产品版本令牌,但也会声称 Safari 兼容,因为它们都使用 AppleWebKit。这是一张纠结的网。

机器人呢?

各不相同:有些人比其他人表现更好。一些人声称该机器人是顶级产品,一些人还声称与 Mozilla 兼容,或者声称是在移动设备上。有些库提供了一个默认的用户代理,开发者可以覆盖它,但是忘记了。

W3C_Validator/1.3 [http://validator.w3.org/services](http://validator.w3.org/services) - W3c's validatorGooglebot/2.1 (+[http://www.google.com/bot.html](http://www.google.com/bot.html)) - A GooglebotMozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +[http://www.google.com/bot.html](http://www.google.com/bot.html)) - A Googlebot, but AndroidMozilla/5.0 (compatible; bingbot/2.0; +[http://www.bing.com/bingbot.htm](http://www.bing.com/bingbot.htm)) - one of the BingbotsPython/3.6 aiohttp/3.5.4 - Python's AIOHTTP librarypython-requests/2.20.1 - Python's Request library

机器人和脚本是如此的明显,但是你有时不得不眯着眼睛看。他们更有可能在文本中有 URL(作为允许人们识别和报告行为不端的机器人的一种做法),但这并不能保证,你必须逐个案例地解析它。

欺骗是完全允许的

出于各种原因,无论是出于测试、兼容性还是隐私原因,用户可能希望让他们的浏览器给出不同于默认的用户代理字符串。RFC 明确指出,如果一个客户端发送一个伪装的 UA,那么它应该被解释为客户端故意想要那个版本,即使它可能无法正确呈现。

如果一个用户代理伪装成一个不同的用户代理,接收者可以假定用户有意地希望看到为那个被识别的用户代理定制的响应,即使它们对于正在使用的实际用户代理可能不那么有效。— RFC 7231,HTTP/1.1

浏览器通常为用户提供欺骗他们的 UAs 的功能。也就是说,很少会遇到遇到麻烦的用户,因为从用户的角度来看,浏览器功能之间的差异已经变得微不足道。

好的,我们知道无人机是什么样子,它们是如何使用的?

关于用户代理,需要记住的一点是,它是一项非常古老的技术,历史上它被用来做的许多事情(如基本分析)已经被其他可以提供更多细节和解决方案的技术所取代。

为不同版本的网站服务

这种用法是 UA 字符串的最初目的,它使服务器能够根据客户机的处理能力提供不同版本的网页。Internet Explorer 6 可能是网站设计者需要了解浏览器版本的最惊人的例子,因为它对现代网络标准的处理非常糟糕。

有趣的一面是,IE6 在 2000 年代末/2010 年代初是一个大问题,因为它可怕的标准支持需要开发者进行大量定制,但使用人数居高不下。痛苦催生了努力 作为这些去杀死它。

基本分析

早在 2000 年代中期/早期,无人机系统是分析用户使用情况的重要工具。使用 Javascript 获取浏览器信息仍处于初级阶段,所以用户代理是你所拥有的最有信息量的东西。由此,您可以看到使用 IE6 和 Firefox 的用户比例(以及您是否应该停止使用某些 HTML 特性)。你还可以看到搜索引擎爬虫访问的频率,以及你是否有真正的人类访客。以现代标准来看很原始,但总比没有好。

机器人检测

对于机器人、网络爬虫和类似的自动化程序来说,通过用户代理字符串识别服务器被认为是一种良好的实践和方式。通常情况下,UA 会包含字符串“bot”“crawler”“spider”,有时还带有 bot 所有者的 URL 作为注释。但普遍获得的具体实施将因 bot 而异。这是因为最终由人类开发人员决定“自我识别”的含义,没有标准的格式。

通过 robots.txt 进行基本的机器人控制

基本的robots . txt文件用于告诉网络爬虫和其他机器人在给定的网络服务器上应该或不应该访问什么。通常,它不会区分不同类型的客户端,但是实际上有一个工具可以指定在某些地方允许哪个用户代理字符串。

显然,这假设机器人 1)阅读并遵循 robots.txt 文件中的指令,2)在用户代理中正确地标识自己(并再次遵循指令)。

原始用户指纹

用户代理字符串可以非常简单,也可以非常长,将许多产品令牌链接在一起。最令人震惊的是安装了许多粗略工具栏的浏览器,每个工具栏通常会将自己的产品令牌附加到 UA 上。

UA 越长,就越有可能偏离浏览器提供的基本默认 UA,并且 UA 越有可能成为特定安装的唯一 UA。在这种假设下,人们可以使用 UAs 作为一种跨时间和 IP 地址伪识别用户的方法。我见过安装了多达 6 个工具栏的浏览器,浏览器+ IP 组合在请求的海洋中几乎是独一无二的,足以在互联网上跟踪某人。

实际上,这种方法只对一小部分人有效,他们安装了足够多的浏览器扩展,或者伪造了足够多的用户应用程序,从一大堆默认字符串中脱颖而出。但即便如此,UA 仍然在涉及使用 Javascript 和 HTML5 方法的更大的用户指纹框架中提供了一些熵。

我将不得不改天进入设备指纹,这是一个巨大的话题。现在,如果你感兴趣的话,你可以看看这个,了解一下当你使用所有可能的技术,从请求头到 Javascript、Flash 和 HTML5 Canvas,会发生什么。

设备和平台检测

如今,许多高级浏览器功能都是通过 Javascript 直接检测到的,这可能是 UA 字符串的主要现代用途,用于确定客户端运行的是什么设备/平台。

2000 年代末,随着智能手机和平板电脑的爆炸,无人机系统获得了新生。虽然 UAs 过去会告诉你 Windows 或 Mac 上的 IE、Firefox 或 Chrome 用户群的百分比,但我们突然开始看到令人兴奋的新字符串,如 iPad、iPhone 和 Android。不是每个人都在使用台式机/笔记本电脑,但我们可以看到他们在使用什么,并进行调整!

这些新设备具有不同的物理屏幕尺寸和物理功能。不再仅仅是“哦,这个浏览器没有 Javascript/HTML5/CSS 支持”。这些信息与设计人员高度相关,特别是在 2010 年初/中期的旧设备上,这些设备没有全高清 1080p 或更高的屏幕分辨率。(2011 年的 iPhone 4S 拥有 960×640 像素的屏幕。)为移动设备设计的网站需要有不同的用户界面,以便更好地用于触摸屏,并且要更小,以便用于 2G、3G 无线网络。

但是,因为用户代理是完全自由形式的,它可能以非常独特的方式对制造商/设备/操作系统/浏览器的每一个排列都有潜在的不同。开发人员应该如何处理这种情况?

当然是通过苦心分析,建立字符串的大型数据库!

幸运的是!有一些开源项目正在解决这类问题(以及进行用户代理字符串分析的付费 API 服务)。一个是 UA-parser 项目,其核心是一个超过 1100 个正则表达式定义的巨大列表***,该列表搜索 UA 中的唯一模式,并将其与制造商和特定设备相关联。这是许多人坚持不懈的努力。*****

***** [## ua 分析器

ua-parser 有 18 个可用的存储库。在 GitHub 上关注他们的代码。

github.com](https://github.com/ua-parser/)

在单个字符串上运行(多达)一千次 regex 搜索显然是非常耗费资源的,但这是确保尽可能完整地识别一个 UA 字符串的唯一方法,除非手动读取它。

在实践中,您可以通过哈希和缓存来大幅提高速度,因为大多数用户都有相同的默认设置,所以您只需对新字符串运行 regex。这是因为 UA 字符串有一个非常密集的完全匹配的值集群,然后是一个庞大的深奥值长尾。

使用无人机系统会出什么问题?

无人机不必完全遵循 RFC 格式

RFC 在任何方面都没有得到强有力的执行,所以完全有可能遇到不一致的用户代理字符串。我个人见过字符串中放入了像换行符(\n)和 ASCII 空符(\0)这样的无意义字符。Unicode 在技术上也是允许的(因为系统将它视为不透明的字节),但通常是意外的和不常见的。大多数 UA 处理程序仍然假设 UA 是 US-ASCII(如最新 RFC 中所规定的)

通常,这些东西来自于编写机器人的人,他们不熟悉 RFC。或者他们想成为混蛋,试图破坏系统。无论哪种方式,当您大规模处理 UA 字符串时,您的代码将由于格式错误的字符串而中断大量数据,因此要准备好编写异常处理程序来捕获错误的字符串

无人机不是用户,它们甚至不是唯一的浏览器

用户代理无处不在,所以很多人对它们知之甚少。当这些人试图解释它们并得出错误的结论时,问题就来了。

人们有时认为用户代理以某种方式为他们提供了用户数量。这通常是十年前的过时思维的混合,当时人们通常只有一台联网计算机,或者他们听说过浏览器指纹识别,但不知道对浏览器进行指纹识别需要多少数据点。

显然,这在今天是不正确的。如今,大多数用户全天使用多种设备/浏览器,指纹识别方法非常复杂。唯一 UAs 的数量确实给出了发出请求的唯一类型浏览器的大致数量。但是,即使与 IP 地址相结合,许多人也可以使用多个设备,这些设备都使用完全相同的 UA,并且位于 NAT 之后,共享一个 IP。

我个人不得不使用 UAs 对浏览一个网站的浏览器的最小数量进行粗略的限制,原始点击数是上限。这是因为我们确实没有其他可用的数据。但是我必须非常非常清楚我们测量的是什么。

无人机可能是谎言(欺骗),但通常大多数不是

当人们听说无人机很容易被欺骗时,他们通常担心他们被欺骗了,他们的指标会被关闭。他们经常担心得想太多,去寻找技术上更困难的解决方案。我经常告诉人们不要担心恶搞。

主要原因是绝大多数用户没有动力去摆弄他们的 UA 字符串。他们只是想使用互联网。唯一想操纵他们的用户应用的人通常是极少数编写某种机器人/爬虫的用户。然后,它被分解成几个主要案例:

  1. UA 是由一个人来做的,而且是人类规模的流量。在每天使用你的网站的成百上千甚至上百万人中,他们最终是微不足道的,因为他们只代表了流量的一小部分。
  2. UA 是一个小型机器人——这些是小型的学生 scraper 项目,随机的程序员在尝试一些东西。只要它们通常表现良好并且数量很少,它们就不会扭曲你的指标,所以你可以像上面那样忽略它。
  3. 这是一个垃圾邮件非常多的机器人— 你需要以某种方式解释这种情况。这些通常来自最终用户通常不使用的一小组 IP(如 AWS IP 块或数据中心),您通常可以基于试探法过滤掉这些 IP。当你面对这些类型的机器人时,通常会有问题的迹象(比如你的系统超载,就像是 DDoS 攻击)。

很少需要担心欺骗,除非你运行的东西机器人制造商有滥用的动机(如果这是你的问题,UA 不太可能是解决方案)。我认为有一些边缘情况:比如如果你几乎没有流量,那么机器人将占主导地位,但你也没有理由在这一点上做很多分析。

我们能发现假冒的无人机吗?

太好了。在一些非常特殊的情况下,你可以在谎言中抓住 UA。但不要指望这是一个经常性的事情。

最简单的情况是当有人在欺骗他们的 UA 字符串时出错。他们的 UA 非常显眼,因为没有其他人使用它。它可以是一些简单的事情,比如多加一个空格或标点符号。

类似地,有时欺骗者对用户代理字符串理解不够,将不可能的产品字符串组合在一起。他们也会因超级独特而脱颖而出。

另一种常见的情况是通过 JavaScript 访问浏览器的数据。如果你看到一部 iPhone 的屏幕尺寸与手机本身的物理像素尺寸大相径庭,那么它很可能在谎称自己是一部手机。

在这些有限的方法之后,整个想法开始进入 bot 和欺诈检测技术的领域,这有点超出了这里的范围。*****

消失梯度问题

原文:https://towardsdatascience.com/the-vanishing-gradient-problem-69bf08b15484?source=collection_archive---------1-----------------------

问题、原因、意义及其解决方案

Title Image // Source

问题:

随着使用某些激活函数的更多层被添加到神经网络,损失函数的梯度接近零,使得网络难以训练。

为什么:

某些激活函数,如 sigmoid 函数,将大的输入空间压缩成 0 到 1 之间的小输入空间。因此,sigmoid 函数输入的大变化会导致输出的小变化。因此,导数变小。

Image 1: The sigmoid function and its derivative // Source

例如,图 1 是 sigmoid 函数及其导数。请注意,当 sigmoid 函数的输入变大或变小时(当|x|变大时),导数变得接近于零。

意义何在:

对于只有几层使用这些激活的浅层网络,这不是一个大问题。然而,当使用更多的层时,它会导致梯度太小而不能有效地进行训练。

使用反向传播找到神经网络的梯度。简单地说,反向传播通过从最后一层一层地移动到初始层来找到网络的导数。根据链式法则,每层的导数沿网络向下相乘(从最后一层到初始层),以计算初始层的导数。

然而,当 n 个隐藏层使用类似 sigmoid 函数的激活时, n 个小导数相乘在一起。因此,当我们向下传播到初始层时,梯度呈指数下降。

小的梯度意味着初始层的权重和偏差不会随着每次训练而有效地更新。由于这些初始层通常对识别输入数据的核心元素至关重要,因此会导致整个网络的整体不准确。

解决方案:

最简单的解决方法是使用其他激活函数,比如 ReLU,它不会引起一个小的导数。

剩余网络是另一种解决方案,因为它们提供直接到早期层的剩余连接。如图 2 所示,残差连接直接将块开头的值 x 加到块的结尾(F(x)+x)。这种剩余连接不经过激活函数,激活函数“挤压”导数,导致块的整体导数更高。

Image 2: A residual block

最后,批量规范化图层也可以解决这个问题。如前所述,当一个大的输入空间被映射到一个小的输入空间,导致导数消失时,问题就出现了。在图 1 中,这在|x|较大时最为明显。批量标准化通过简单地标准化输入来减少这个问题,这样|x|就不会到达 sigmoid 函数的外部边缘。如图 3 所示,它对输入进行了归一化处理,使大部分输入落在绿色区域,这里的导数不会太小。

Image 3: Sigmoid function with restricted inputs

如果您有任何问题或建议,请在下面留下您的评论:)

阅读这些文章了解更多信息:

视频搜索引擎——我的计算机视觉之旅

原文:https://towardsdatascience.com/the-video-search-engine-my-journey-into-computer-vision-9789824e76bb?source=collection_archive---------21-----------------------

制作视频很容易,但是谁有时间看完呢?我提出一个视频搜索引擎来找到相关的时刻(原型包括在内)。

创作视频内容是我一生的爱好。我记得在中学制作停止动画电影,毕业到 30 分钟。高中和大学的短片。由于我的孩子们,我的“电影”现在更加面向家庭,但我总是在思考新的项目。

当我反思我喜欢做的项目时,我不断回到同一个问题:记录镜头远比理解它容易。想想你手机的相机胶卷。它可能充满了数百个,如果不是数千个,未经编辑的视频,太长,不值得一看。

创作和消费视频之间的不平衡是“典型的现代问题”的一部分,这是由廉价的录制设备甚至更便宜的数字存储设备造成的。快速总结一下,问题是我们可以把 15 个摄像头从 15 个不同的角度对准同一个体育赛事两个小时,产生 30 个小时的未剪辑视频。但是没有人有 30 个小时来观看这些内容。

我们需要的是一种从视频内容中提取有趣瞬间的方法。

让我们考虑一个更实际的例子。你当地的零售商可能每个月会录制数千小时的视频来识别商店扒手。然而,尽管有明显的商业价值,这个视频是未经编辑的,冗长的,非常不值得一看。需要的是一个视频的“搜索引擎”。以图像或视频“关键时刻”作为搜索词输入,输出相关视频片段作为搜索结果的系统。

这个问题让我想起了 2004 年夏天在我们国家的一个顶级 R&D 实验室——IBM t . j .沃森研究中心的实习。在那里,我看到了计算机视觉项目的早期应用,例如在进出停车场的汽车上绘制边界框。

Bounding boxes identifying cars and persons

我在 IBM 工作已经 15 年了,但我从未忘记那种神奇的感觉——看着屏幕上闪烁着汽车和人周围的盒子。当时,这样的输出是机器学习和计算能力的突破。我现在可以探索是否可以建立通用的视频搜索引擎。

探索:视频搜索引擎

我的目标是建立一个上述视频搜索引擎的原型。该系统将视频记录乒乓球比赛,当球在比赛时提取视频剪辑,并只向用户显示相关的剪辑。第一个关键结果是使用便携式设备视频记录乒乓球比赛,并将视频发送到云存储进行分析。第二个关键结果是训练一个目标检测模型,该模型发现一个乒乓球在运动。第三个关键结果是将提取的视频剪辑输出到 web UI。

我对这个项目施加了各种限制,让它保持在晚上和周末的范围内。例如,我不打算在 Raspberry Pi 上构建一个完全包含的对象检测系统。相反,我将使用 AWS 来检索存储的视频剪辑,通过对象检测器处理它们,并将结果返回给 web UI。视频的实时处理也超出了这个项目的范围。也就是说,这些限制为这个项目带来了令人兴奋的未来机遇。

在便携式设备上录制视频

到目前为止,我已经完成了第一个关键结果的 70%,通过使用 Raspberry Pi 录制视频内容,并将视频发送到 AWS S3 以供未来分析。

从一开始,我就想象树莓 Pi(带有 Pi 相机模块)将是探索便携式视频捕捉的理想选择。我了解到有很多选择,包括 IP 摄像头、网络摄像头等等。但是事后来看,我很高兴我选择了 Raspberry Pi,因为它的外形、记录良好的代码和热情的社区。

一旦我启动了 Raspberry Pi,我就配置了一个 SSH 环境,这样我就可以从我的笔记本电脑上执行代码来捕捉图像和视频。

然后我不得不把视频发给 S3 AWS。我用 Python 做了一个简单的设计:(1)从 Pi 摄像机打开一个视频流,(2)每两秒钟向 S3 发送一帧。

import imutils
from imutils.video import VideoStream
from imutils.video import FPS
import boto3
import cv2
import datetime
import time
from decimal import Decimal
import uuid
import json
import pytz
from pytz import timezone
import os# init interface to AWS S3 via Python
s3_client = boto3.client('s3',
      aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
      aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"])

# init where to send the captured frames
s3_bucket = "img-from-raspi-for-web"
s3_key_frames_root = "frames/"# init video stream from Raspberry Pi Camera
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
# vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0) # warm up the sensordef convert_ts(ts, selected_timezone):
   *# Converts a timestamp to the configured timezone. Returns a localized datetime object
*   tz = timezone(selected_timezone)
   utc = pytz.utc
   utc_dt = utc.localize(datetime.datetime.utcfromtimestamp(ts))
   localized_dt = utc_dt.astimezone(tz)
   return localized_dt

# loop over frames from the video file stream
while True:
   # grab the frame from the video stream and resize it
   frame = vs.read()
   approx_capture_ts = time.time()
   if frame is None:
      continue # useful to skip blank frames from sensor

   frame = imutils.resize(frame, width=500)
   ret, jpeg = cv2.imencode('.jpg', frame)
   photo = jpeg.tobytes() 
   # bytes are used in future section to call Amazon Rekognition API

   now_ts = time.time()
   now = convert_ts(now_ts, "US/Eastern")
   year = now.strftime("%Y")
   mon = now.strftime("%m")
   day = now.strftime("%d")
   hour = now.strftime("%H")

   # build s3_key using UUID and other unique identifiers
   s3_key = (s3_key_frames_root + '{}/{}/{}/{}/{}.jpg').format(year, mon, day, hour, frame_id)

   # Store frame image in S3
   s3_client.put_object(
      Bucket=s3_bucket,
      Key=s3_key,
      Body=photo
   )
   time.sleep(2.0) # essentially, a frame rate of 0.5

图像开始出现在我的 S3 桶中,所以我开始为这个项目设计数据库。

我的设计将每幅图像、其时间戳和每幅图像的预测结果存储在 NoSQL 表中。稍后,我将查询该数据库中的预测,并获取相应的时间戳,以将视频剪辑成相关的剪辑。

现在,我为预测设置了一个存根,依靠 AWS Rekognition API 来检测对象。下面是我如何将数据保存到 DynamoDB 表中的:

def detect_labels_local_file(photo):
    response = rekog_client.detect_labels(Image={'Bytes': photo},
            MaxLabels=5,
            MinConfidence=60.0)

    for label in response['Labels']:
        print (label['Name'] + ' : ' + str(label['Confidence']))

    return response### In the while loop ###
    rekog_response = detect_labels_local_file(photo) # Persist frame data in dynamodb
    ddb_item = {
       'frame_id': frame_id,
       'processed_timestamp': now_ts, # beware of putting floats into DDB. Had to use json.loads as a workaround
       'approx_capture_timestamp': approx_capture_ts,
       'rekog_labels': rekog_response['Labels'],
       'rekog_orientation_correction':
          rekog_response['OrientationCorrection']
          if 'OrientationCorrection' in rekog_response else 'ROTATE_0',
       'processed_year_month': year + mon,  # To be used as a Hash Key for DynamoDB GSI
       's3_bucket': s3_bucket,
       's3_key': s3_key
    }

    ddb_data = json.loads(json.dumps(ddb_item), parse_float=Decimal)

    ddb_table.put_item(Item=ddb_data)

成功!我有一个 NoSQL 表,它引用了 S3 图像、时间戳及其相应的预测:

Items in DynamoDB table, showing Rekognition API results for captured frames from Pi Camera

构建乒乓球检测的机器学习模型

在摄像头对准我的情况下,AWS Rekognition 以 99.13%的置信度检测到了一个‘人’。但是,Rekognition 能否检测到正在运动的乒乓球来帮助我实现第二个关键结果呢?

遗憾的是,没有。在测试了许多乒乓球图像后,我发现 Rekognition 在检测场景方面的表现令人钦佩——例如标记属于“乒乓球”的图像。但是在寻找乒乓球方面,Rekognition 表现不佳。在大多数情况下,它根本没有将球区分为可识别的物体。当它找到球时,它把它标为“月亮”😎

Rekognition results for an image of a ping pong match

使用 Rekognition API 很方便,但是对于我的项目来说有所限制。幸运的是,如果你想定制自己的模型,亚马逊提供了 SageMaker 对象检测 API

我从一场乒乓球比赛的视频开始。以下是一些示例框架:

准备和标记数据

我的第一个任务是用乒乓球标记视频帧,以建立一个训练、验证和测试数据集。 FFmpeg 库有助于将视频转换成我可以标记的图像:

# from Terminal after installing the ffmpeg library# Get one frame to identify the area I care about
ffmpeg -i tt-video-1080p.mp4 -ss 00:00:59.000 -vframes 1 thumb.jpg

# I found an area I care about in a fixed-position video feed using a photo-editing program: a 512x512 image with a top-left corner at x:710, y:183y
ffmpeg -i tt-video-1080p.mp4 -filter:v "crop=512:512:710:183” cropped.mp4# output the video as a series of jpg images @ 10 frames per second
ffmpeg -i cropped.mp4 -vf fps=10 thumb%04d.jpg -hide_banner

上面的片段在我的机器上生成了成千上万的图像。下一步是给乒乓球添加“边界框”。

有许多服务为你执行这项艰巨的任务,但我选择亲自标记这些图像,以便更深入地理解和欣赏计算机视觉。我求助于 RectLabel,这是一个图像注释工具,用于标记图像以进行边界框对象检测和分割:

我在这项任务上花了大约四个小时,平均每分钟 8.3 个标签,得到了 2000 个带标签的图像。这是令人麻木的工作。

在我的标记工作进行到一半的时候,我想知道在给定 JPEG 压缩伪像和乒乓球上的运动模糊的情况下,紧密还是松散的边界框会更好地平衡模型精度和模型泛化。在打电话给一个朋友、保罗·布兰克利咨询网络之后,我了解到“边界框通常紧紧围绕着图像中的每个[对象]”,因为:

如果没有精确绘制的边界框,整个算法都会受到影响,从而导致无法准确识别[对象]。这就是为什么质量检查和确保高度重视每个边界框的准确性,从而产生一个强大的人工智能引擎。

如果我不得不再次做这个项目,我会使用无损图像格式(*。png)并绘制更紧密的边界框来改善我的训练数据。然而我认识到这种优化不是免费的。当我开始用更紧的边界框标记图像时,我的平均标记速度下降了大约 50%。

一旦我完成了对图像的标记,RectLabel 就将数据输出到一个 JSON 文件中,该文件适合计算机视觉任务。以下是输出示例:

{"images":[
    {"id":1,"file_name":"thumb0462.png","width":0,"height":0},
    {"id":2,"file_name":"thumb0463.png","width":0,"height":0},
#    ...
    {"id":4582,"file_name":"thumb6492.png","width":0,"height":0}],"annotations":[
    {"area":198,"iscrowd":0,"id":1,"image_id":1,"category_id":1,"segmentation":[[59,152,76,152,76,142,59,142]],"bbox":[59,142,18,11]},
    {"area":221,"iscrowd":0,"id":2,"image_id":2,"category_id":1,"segmentation":[[83,155,99,155,99,143,83,143]],"bbox":[83,143,17,13]},
#    ...       {"area":361,"iscrowd":0,"id":4,"image_id":4582,"category_id":1,"segmentation":[[132,123,150,123,150,105,132,105]],"bbox":[132,105,19,19]},"categories":[{"name":"pp_ball","id":1}]
}

然后,我创建了一个函数,按照 Amazon SageMaker 输入通道的预期,将注释分成训练和验证文件夹。如果你正在遵循我的准则,请注意来自 Ryo Kawamura 的重要提示:

虽然 COCO JSON 文件中的“category_id”从 1 开始,但 Amazon SageMaker JSON 文件中的“class_id”从 0 开始。

import json
import osdef fixCategoryId(category_id):
    return category_id - 1;with open(file_name) as f:
    js = json.load(f)
    images = js['images']
    categories = js['categories']
    annotations = js['annotations']
    for i in images:
        jsonFile = i['file_name']
        jsonFile = jsonFile.split('.')[0] + '.json'line = {}
        line['file'] = i['file_name']
        line['image_size'] = [{
            'width': int(i['width']),
            'height': int(i['height']),
            'depth': 3
        }]
        line['annotations'] = []
        line['categories'] = []
        for j in annotations:
            if j['image_id'] == i['id'] and len(j['bbox']) > 0:
                line['annotations'].append({
                    'class_id': fixCategoryId(int(j['category_id'])),
                    'top': int(j['bbox'][1]),
                    'left': int(j['bbox'][0]),
                    'width': int(j['bbox'][2]),
                    'height': int(j['bbox'][3])
                })
                class_name = ''
                for k in categories:
                    if int(j['category_id']) == k['id']:
                        class_name = str(k['name'])
                assert class_name is not ''
                line['categories'].append({
                    'class_id': fixCategoryId(int(j['category_id'])),
                    'name': class_name
                })
        if line['annotations']:
            with open(os.path.join('generated', jsonFile), 'w') as p:
                json.dump(line, p)jsons = os.listdir('generated')
print ('There are {} images that have annotation files'.format(len(jsons)))

接下来,我按照 SageMaker 端点:/train、/validation、/train_annotation 和/validation_annotation 的要求,将文件移动到一个包含四个文件夹的亚马逊 S3 桶中。我在训练和验证文件上使用了 70%的分割,并混洗了数据:

import shutil
import randomnum_annotated_files = len(jsons)
train_split_pct = 0.70
num_train_jsons = int(num_annotated_files * train_split_pct)
random.shuffle(jsons) # randomize/shuffle the JSONs to reduce reliance on *sequenced* frames
train_jsons = jsons[:num_train_jsons]
val_jsons = jsons[num_train_jsons:]

#Moving training files to the training folders
for i in train_jsons:
    image_file = './images/'+i.split('.')[0]+'.png'
    shutil.move(image_file, './train/')
    shutil.move('./generated/'+i, './train_annotation/')

#Moving validation files to the validation folders
for i in val_jsons:
    image_file = './images/'+i.split('.')[0]+'.png'
    shutil.move(image_file, './validation/')
    shutil.move('./generated/'+i, './validation_annotation/')

### Upload to S3
import sagemaker
from sagemaker import get_execution_role

role = sagemaker.get_execution_role()
sess = sagemaker.Session()

from sagemaker.amazon.amazon_estimator import get_image_uri
training_image = get_image_uri(sess.boto_region_name, 'object-detection', repo_version="latest")

bucket = 'pp-object-detection' # custom bucket name.
# bucket = sess.default_bucket()
prefix = 'rect-label-test'

train_channel = prefix + '/train'
validation_channel = prefix + '/validation'
train_annotation_channel = prefix + '/train_annotation'
validation_annotation_channel = prefix + '/validation_annotation'

sess.upload_data(path='train', bucket=bucket, key_prefix=train_channel)
sess.upload_data(path='validation', bucket=bucket, key_prefix=validation_channel)
sess.upload_data(path='train_annotation', bucket=bucket, key_prefix=train_annotation_channel)
sess.upload_data(path='validation_annotation', bucket=bucket, key_prefix=validation_annotation_channel)

s3_train_data = 's3://{}/{}'.format(bucket, train_channel)
s3_validation_data = 's3://{}/{}'.format(bucket, validation_channel)
s3_train_annotation = 's3://{}/{}'.format(bucket, train_annotation_channel)
s3_validation_annotation = 's3://{}/{}'.format(bucket, validation_annotation_channel)

训练模型

在下一步中,我创建了一个具有某些超参数的 SageMaker 对象检测器,例如使用“resnet-50”算法的和一个类(我的乒乓球)以及大小为 512x512 像素的图像。

s3_output_location = 's3://{}/{}/output'.format(bucket, prefix)od_model = sagemaker.estimator.Estimator(training_image, role, train_instance_count=1, train_instance_type='ml.p3.2xlarge', train_volume_size = 50, train_max_run = 360000, input_mode = 'File', output_path=s3_output_location, sagemaker_session=sess)od_model.set_hyperparameters(base_network='resnet-50',
                             use_pretrained_model=0,
                             num_classes=1,
                             mini_batch_size=15,
                             epochs=30,
                             learning_rate=0.001,
                             lr_scheduler_step='10',
                             lr_scheduler_factor=0.1,
                             optimizer='sgd',
                             momentum=0.9,
                             weight_decay=0.0005,
                             overlap_threshold=0.5,
                             nms_threshold=0.45,
                             image_shape=512,
                             label_width=600,
                             num_training_samples=num_train_jsons)

然后,我为对象检测器设置训练/验证位置,称为。拟合函数,并将模型部署到一个端点:

train_data = sagemaker.session.s3_input(s3_train_data, distribution='FullyReplicated', content_type='image/png', s3_data_type='S3Prefix')validation_data = sagemaker.session.s3_input(s3_validation_data, distribution='FullyReplicated', content_type='image/png', s3_data_type='S3Prefix')train_annotation = sagemaker.session.s3_input(s3_train_annotation, distribution='FullyReplicated', content_type='image/png', s3_data_type='S3Prefix')validation_annotation = sagemaker.session.s3_input(s3_validation_annotation, distribution='FullyReplicated', content_type='image/png', s3_data_type='S3Prefix')data_channels = {'train': train_data, 'validation': validation_data, 'train_annotation': train_annotation, 'validation_annotation':validation_annotation}od_model.fit(inputs=data_channels, logs=True)object_detector = od_model.deploy(initial_instance_count = 1,
                             instance_type = 'ml.m4.xlarge')

鉴于我只有 2000 张图片,我的亚马逊盒子(ml.p3.2xlarge)花了大约 10 分钟来训练模型。部署端点通常需要更长的时间,并且测试模型的预期是令人痛苦的!

终于,真相大白的时刻到了。我通过传递一个它从未见过的 PNG 文件来调用我的模型:

file_with_path = 'test/thumb0695.png'
with open(file_with_path, 'rb') as image:
            f = image.read()
            b = bytearray(f)
            ne = open('n.txt', 'wb')
            ne.write(b)results = object_detector.predict(b)
        detections = json.loads(results)
        print(detections)

我得到了这样的输出:

[1.0, 0.469, 0.566, 0.537, 0.605, 0.595]

下面是如何根据 AWS SageMaker 解释这个输出:

这些对象数组中的每一个都由六个数字组成。第一个数字是预测的类标签。第二个数字是检测的相关置信度得分。最后四个数字代表边界框坐标[xmin,ymin,xmax,ymax]。这些输出边界框角索引由整体图像尺寸归一化。请注意,这种编码不同于输入使用的编码。json 格式。例如,在检测结果的第一个条目中,0.3088374733924866 是边界框的左坐标(左上角的 x 坐标)作为整体图像宽度的比率,0.07030484080314636 是边界框的上坐标(左上角的 y 坐标)作为整体图像高度的比率,0.7110607028007507 是右坐标(右坐标

凉爽的😏

可视化结果

坦白地说,我需要一些更实际的东西来欣赏结果。所以我用这个函数来可视化每个预测:

def visualize_detection(img_file, dets, classes=[], thresh=0.6):
    import random
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg

    img = mpimg.imread(img_file)
    plt.imshow(img)
    height = img.shape[0]
    width = img.shape[1]
    colors = dict()
    for det in dets:
        (klass, score, x0, y0, x1, y1) = det
        if score < thresh:
            continue
        cls_id = int(klass)
        if cls_id not in colors:
            colors[cls_id] = (random.random(), random.random(), random.random())
        xmin = int(x0 * width)
        ymin = int(y0 * height)
        xmax = int(x1 * width)
        ymax = int(y1 * height)
        rect = plt.Rectangle((xmin, ymin), xmax - xmin,
                             ymax - ymin, fill=False,
                             edgecolor=colors[cls_id],
                             linewidth=3.5)
        plt.gca().add_patch(rect)
        class_name = str(cls_id)
        if classes and len(classes) > cls_id:
            class_name = classes[cls_id]
        plt.gca().text(xmin, ymin - 2,
                       '{:s} {:.3f}'.format(class_name, score),
                       bbox=dict(facecolor=colors[cls_id], alpha=0.5),fontsize=12, color='white')
    plt.show()# then I used the function like this:
object_categories = ['pp_ball']
threshold = 0.40
visualize_detection(file_name_of_image, detections['prediction'], object_categories, threshold)

当我看到这个输出时,我兴奋而欣慰地发抖:

我花了一个小时用它从未见过的各种测试图像敲打模型。有些是伟大的预言。其他的则很傻,比如这个模型把球员制服上的白点当成了乒乓球🙄

幸运的是,我能够通过将置信度阈值提高到 0.40 来消除大多数误报。

未来方向

我对目前的结果很满意,但是未来的工作需要评估和优化我的模型。例如,我打算计算平均精度(mAP) 作为性能指标。那个地图度量将帮助我评估不同的优化,例如添加更多的训练图像,尝试迁移学习,以及尝试其他深度学习拓扑。我将把这些任务留给我的 2020 年路线图(和未来的帖子)。

我也很高兴能够在 2020 年实现我的第三个关键成果——通过网络用户界面向用户展示相关的视频剪辑。当关键结果完成后,我将在真实环境中测试整个设置:

  • 用我的树莓皮视频记录一场现场乒乓球比赛
  • 将视频导出到 S3 的图像帧中
  • 使用对象检测器模型来识别球何时在比赛中
  • 当球在比赛时存储时间戳
  • 向用户提供网络用户界面
  • 允许用户将视频过滤到球正在运动的瞬间

请继续关注这个方向的更多学习和发展。

结束语

数据科学家普遍认为

算法便宜;

数据为王。

这个项目让我深深体会到这一真理。事实上,在 AWS SageMaker 上,改变深度学习拓扑结构的能力是微不足道的。然而结果并没有明显的变化。我还以最小的努力在另一个模型中利用了迁移学习。同样,结果也好不到哪里去。然后,我想起了为我的项目收集和标记图像的艰苦工作…

当我将与模型相关的工作和与数据相关的工作在努力程度和跨项目适用性方面进行比较时,我感到困惑。例如,在深度学习拓扑结构之间切换相对容易,许多项目可以在各种计算机视觉任务中利用这些拓扑结构。相比之下,我的图像标签工作需要大量的努力,可能只会对我的项目有益。

面对这一现实,我对通用视频搜索引擎的可行性感到有点悲观,这种搜索引擎可以从用户任意输入的(1)视频和(2)图像作为搜索词中产生结果。诚然,一个特定用途的视频搜索引擎指日可待。但重要的、不平凡的工作还在后面,以探索一个模型如何能够根据几个图像示例进行归纳,以检测用户想要找到的任何内容。

在这方面,这是一个有趣的学习年!

非常感谢 Sandeep ArnejaPaul BlankleyRyo KawamuraThea Zimnicki 对这个项目的反馈和贡献。

AlexNet、VGGNet、ResNet 和 Inception 之间的区别

原文:https://towardsdatascience.com/the-w3h-of-alexnet-vggnet-resnet-and-inception-7baaaecccc96?source=collection_archive---------0-----------------------

在本教程中,我将快速浏览四个著名的 CNN 架构的细节,并通过解释它们的 W3H(何时、为什么、什么和如何)来说明它们之间的区别

AlexNet

什么时候?

  • 艾伦·图灵年
  • 人人享有可持续能源年
  • 伦敦奥运会

为什么? AlexNet 的诞生源于提高 ImageNet 挑战赛成绩的需要。这是首批 深度 卷积网络之一,在 2012 ImageNet LSVRC-2012 挑战赛中获得了相当高的准确率,准确率为 84.7%,相比之下,第二名的准确率为 73.8%。使用卷积层和感受野探索了图像帧中空间相关性的思想。

什么?网络由 5 个卷积(CONV)层和 3 个全连接(FC)层组成。使用的激活是整流线性单元(ReLU)。网络中每一层的结构细节可以在下表中找到。

Alexnet Block Diagram (source:oreilly.com)

该网络共有 6200 万个可训练变量

如何?网络的输入是一批大小为 227×227×3 的 RGB 图像,并输出 1000×1 的概率向量,每个向量对应一个类别。

  • 执行数据扩充以减少过拟合。这种数据扩充包括镜像和裁剪图像,以增加训练数据集中的变化。网络在第一、第二和第五个 CONV 图层之后使用重叠的 max-pooling 图层。重叠的最大池层只是跨度小于窗口大小的最大池层。使用 3×3 最大池层,步幅为 2,因此产生重叠感受野。这种重叠将前 1 名和前 5 名误差分别提高了 0.4%和 0.3%。
  • 在 AlexNet 之前,最常用的激活函数是 sigmoidtanh。由于这些函数的饱和性质,它们遭受消失梯度(VG)问题,并使网络难以训练。AlexNet 使用的是 ReLU 激活函数,不会遇到 VG 问题。原始论文显示,具有 ReLU 的网络实现 25%的错误率比具有 tanh 非线性的相同网络快大约 6 倍。
  • 尽管 ReLU 有助于解决梯度消失的问题,但由于其不受限制的性质,学习到的变量可能会变得不必要的高。为了防止这种情况,AlexNet 引入了本地响应标准化(LRN)。LRN 背后的想法是在放大受激神经元的像素邻域中执行归一化,同时抑制周围的神经元。
  • AlexNet 还通过使用丢弃层来解决过拟合问题,其中在训练期间以 p=0.5 的概率丢弃连接。虽然这通过帮助网络摆脱坏的局部最小值而避免了网络的过度拟合,但是收敛所需的迭代次数也加倍了。

VGGNet:

什么时候?

  • 国际家庭农业和结晶学年
  • 首次机器人登陆彗星
  • 罗宾·威廉姆斯去世的那一年

为什么? VGGNet 的诞生是为了减少 CONV 层中的参数数量和提高训练时间。

什么?VGGNet 有多个变种(VGG16,VGG19 等。)不同之处仅在于网络的总层数。VGG16 网络的结构细节如下所示。

VGG16 Block Diagram (source: neurohive.io)

VGG16 共有 1.38 亿个参数。这里需要注意的重要一点是,所有 conv 内核的大小都是 3x3,maxpool 内核的大小是 2x2,步长为 2。

如何?固定大小内核背后的想法是,Alexnet (11x11,5x5,3x3)中使用的所有可变大小卷积内核都可以通过使用多个 3x3 内核作为构建块来复制。这种复制是根据核仁覆盖的感受野进行的。

让我们考虑下面的例子。假设我们有一个大小为 5x5x1 的输入层。实施内核大小为 5x5 且跨距为 1 的 conv 图层将产生 1x1 的输出要素地图。如下所示,通过使用跨距为 1 的两个 3x3 conv 图层,可以获得相同的输出要素地图

现在让我们看看需要训练的变量的数量。对于 5×5 conv 层过滤器,变量的数量是 25。另一方面,内核大小为 3x3 的两个 conv 层总共有 3x3x2=18 个变量(减少了 28%)。

同样,一个 7x7 (11x11) conv 层的效果可以通过以一个步长实施三(五)个 3x3 conv 层来实现。这将可训练变量的数量减少了 44.9% (62.8%)。可训练变量数量的减少意味着更快的学习和更强的抗过拟合能力。

雷斯内特

什么时候?

  • 引力波的发现
  • 国际土壤和光基技术年
  • 火星电影

为什么?神经网络臭名昭著,因为当它存在时,无法找到更简单的映射。

  • 例如,假设我们有一个完全连接的多层感知器网络,我们想在输入等于输出的数据集上训练它。这个问题最简单的解决方案是让所有的权重等于 1,所有的隐藏层的偏差为零。但是当使用反向传播来训练这样的网络时,学习了相当复杂的映射,其中权重和偏差具有大范围的值。
  • 另一个例子是给现有的神经网络增加更多的层。假设我们有一个网络【f(x),它在数据集上达到了 n% 的精度。现在将更多层添加到这个网络 g(f(x)) 应该至少具有 n% 的精度,即在最坏的情况下 g(。) 应该是产生与【f(x)相同精度的相同映射,如果不是更多的话。但不幸的是,事实并非如此。实验表明,网络层数越多,精度越低。
  • 上述问题的发生是因为消失梯度问题。随着 CNN 越做越深,当反向传播到初始层时,导数的值几乎变得微不足道。

ResNet 通过引入两种类型的“快捷连接”来处理这个网络:身份快捷方式投影快捷方式。

什么?resnet XX 架构有多个版本,其中“XX”表示层数。最常用的是 ResNet50 和 ResNet101。自从消失梯度问题被解决后(在如何解决的部分有更多的介绍),CNN 开始越陷越深。下面我们介绍 ResNet18 的结构细节

Resnet18 有大约 1100 万个可训练参数。它由 CONV 层和大小为 3x3 的滤镜组成(就像 VGGNet 一样)。在整个网络中只使用两个池层,一个在网络的起点,另一个在网络的终点。每两个 CONV 层之间都有身份联系。实线箭头表示输入和输出维度相同的标识快捷方式,而虚线箭头表示维度不同的投影连接。

如何?如前所述,ResNet 架构利用快捷连接解决渐变消失问题。ResNet 的基本构造块是在整个网络中重复的剩余块。

Residual Block — Image is taken from the original paper

网络不是从 x →F(x)学习映射,而是从 x → F(x)+G(x)学习映射。当输入 x 和输出 F(x)的维数相同时,函数 G(x) = x 是恒等函数,这种快捷连接称为恒等连接。通过在训练期间将中间层中的权重归零来学习相同的映射,因为将权重归零比将它们推到 1 更容易。

对于 F(x)的维数不同于 x 的情况(由于在它们之间的 CONV 层中步长> 1),实现投影连接而不是单位连接。函数 G(x)将输入 x 的维数改变为输出 F(x)的维数。在原始论文中考虑了两种映射。

  • 不可训练的映射(填充):输入 x 简单地用零填充,以使维数匹配 F(x)的维数
  • 可训练映射(Conv 层) : 1x1 Conv 层用于映射 x 到 G(x)。从上表可以看出,在整个网络中,空间维度保持相同或减半,深度保持相同或加倍,并且每个 conv 层之后的宽度和深度的乘积保持相同,即 3584。通过分别使用步长 2 和多个这样的滤波器,1×1 conv 层被用于空间维度的一半和深度的两倍。1x1 conv 层的数量等于 F(x)的深度。

初始状态:

什么时候?

  • 国际家庭农业和结晶学年
  • 首次机器人登陆彗星
  • 罗宾·威廉姆斯去世的那一年

为什么?在图像分类任务中,显著特征的大小可以在图像帧内显著变化。因此,决定一个固定的内核大小是相当困难的。对于分布在图像的大面积上的更全局的特征,较大的核是优选的,另一方面,较小的核在检测分布在图像帧上的区域特定的特征方面提供良好的结果。为了有效地识别这种可变大小的特征,我们需要不同大小的核。这就是《盗梦空间》所做的。它不是简单地在层数上更深入,而是走得更宽。不同大小的多个内核在同一层中实现。

什么?初始网络架构由以下结构的若干初始模块组成

Inception Module (source: original paper)

每个初始模块由四个并行的操作组成

  • 1x1 conv 层
  • 3x3 conv 层
  • 5x5 conv 层
  • 最大池化

黄色显示的 1x1 conv 块用于深度缩减。四个并行操作的结果随后在深度方向上连接在一起,形成滤波器连接模块(绿色)。《盗梦空间》有多个版本,最简单的一个是 GoogLeNet。

如何? Inception 增加了网络空间,通过训练可以从中选择最佳网络。每个 inception 模块都可以捕获不同层次的显著特征。全局要素由 5x5 conv 层捕获,而 3x3 conv 层易于捕获分布式要素。max-pooling 操作负责捕捉邻域中突出的低级要素。在给定的级别上,所有这些特征都被提取并连接起来,然后再传送到下一层。我们让网络/训练来决定哪些特征具有最大的价值和权重。假设如果数据集中的图像富含全局特征而没有太多低级特征,那么与 5×5 conv 内核相比,训练的初始网络将具有非常小的对应于 3×3 conv 内核的权重。

摘要

在下表中,这四个 CNN 根据其在 Imagenet 数据集上的前 5 名准确度进行排序。还可以看到向前传递所需的可训练参数和浮点运算(FLOP)的数量。

可以进行几种比较:

  • AlexNet 和 ResNet-152 都有大约 60M 的参数,但在它们的前 5 名精度方面有大约 10%的差异。但是训练 ResNet-152 需要大量的计算(大约是 AlexNet 的 10 倍),这意味着需要更多的训练时间和精力。
  • 与 ResNet-152 相比,VGGNet 不仅参数和 FLOP 数量更多,而且精度也有所下降。训练精度降低的 VGGNet 需要更多的时间。
  • 训练一个 AlexNet 和训练 Inception 花的时间差不多。内存需求减少了 1/10,精确度提高了约 9%

奖金:

可以在下面的链接中找到这个主题和机器学习中许多其他重要主题的紧凑备忘单

[## 机器学习面试主题的备忘单

ML 面试的视觉备忘单(www.cheatsheets.aqeel-anwar.com)

medium.com](https://medium.com/swlh/cheat-sheets-for-machine-learning-interview-topics-51c2bc2bab4f)

如果这篇文章对你有帮助,欢迎鼓掌、分享和回复。如果想了解更多关于机器学习和数据科学的知识,请关注我@Aqeel an war或者在LinkedIn上与我联系。

实时数据的警告:当每一秒都很重要

原文:https://towardsdatascience.com/the-war-of-real-time-data-when-every-tick-counts-855c438379b3?source=collection_archive---------10-----------------------

一级和二级金融市场数据馈送介绍

汇总的一分钟价格和交易量信息提供了有价值的信息。虽然对于摇摆操作和某些日内策略/方法来说,这已经足够了,但是额外的一级和二级数据可以改善执行和退出决策,特别是在日内操作中。

我用这些信息进行自主交易,结果很有希望。我还开始研究处理和解析数据的复杂性(比常规的 OHLC 蜡烛复杂一到两个数量级)。我这样做是出于量化的考虑。

这让我对不同的实时数据馈送规范有了更好的、结构合理的理解,我在这篇文章中分享了这些信息。

我简要解释了不同交易所和市场数据供应商提供的不同级别的实时数据的含义,包括对它们的用途的快速分析以及它们在标准交易平台和定制量化软件中的使用示例。对一级和二级都进行了分析,还包括了对三级的介绍。

什么是一级

第一级增加了操作员提供最新买卖报价和已执行分笔成交点交易的可用信息。这在业内通常被称为“账面净值”——为最新的买卖报价——以及“磁带”“时间&销售”——为已执行订单——这两种信息结合在一起,可以洞察短期看涨或看跌压力,并构成构建交易量概况和订单流信息的基本构件。

可以获得洞察力,因为价格需要填充订单的买方以启动看涨趋势,或者,它需要填充订单的买方以启动看跌趋势。当订单的一方出现明显的趋势或压力时,它可能会被解读为供应超过需求或相反的情况。

“Time and sales” is the most iconic view of Level I Data. Traded orders can be seen including the information on where they were traded (either at the Bid or Ask side). Continuous trading at one of the sides will often lead price to initiate a bullish or bearish course of action.

虽然一些作者将这种压力称为“购买量”或“T2”【销售量】,但我更倾向于避免使用这样的术语,因为每一个买家都有一个卖家,而且不存在“T4”的买家比卖家多的情况,因此也就不存在“购买量”的情况。这些术语对新来者具有误导性,因为比你想象的更多的人并不完全理解在受监管的市场中订单实际上是如何完成的,通过使用这些术语,他们一直认为交易量可以分为购买和销售,但事实并非如此。这些作者想要通过这些“购买/销售数量”术语来说明的是,已完成的订单正在挤压供应或需求,并且在失去平衡和另一次初始价格运动发生之前,一方可能会赢得短期战斗。其实不同的是“愿意卖”的人数和“愿意买”的人数。在这种情况下,两个数字明显不同,因为订单未被执行,强烈的不对称分布可能意味着价格可能反转,或者至少在某一价格水平存在强大的阻力或支撑(未执行订单的信息是二级数据馈送的一部分)。理解这些概念很重要,因为它们是可以从一级(和二级)数据中提取的关键知识。

作为对一级数据的最后说明,我列举了潜在的用例:

  1. 测试平均持有时间更短的日内策略——刷单或简单的非常短期的日内策略,
  2. 为进场和出场寻找更好的交易执行时机,
  3. 过滤/确认由其他方法触发的交易,
  4. 启用订单流分析。

什么是二级

第二级用数据丰富了第一级,包括订单簿中一定深度的数据。这意味着您需要考虑关于已提交但尚未执行的未决订单的信息。这些信息是实时更新的,有助于发现高流动性区域,这些区域可能被解读为短期支撑或阻力位。

与级别 I 相比,级别 II 大大增加了解析需求,因为需要实时更新和解析特定范围的报价点(称为书的深度),而不是仅处理一个报价点价格级别。

Level II provides the ability to visualise in real-time pending orders in the book. Most software packages usually aggregate a certain amount of historical volume at each tick providing information on high liquidity ticks/areas. Imbalance and balance, as defined by Market Profile theory can be therefore be identified.

这些术语的命名和范围因来源不同而有所不同,但通常都是如此处描述的那样。无论如何,重要的一点是理解底层的概念。

为什么一级和二级信息对小型操作者的日内操作有价值

这些信息允许识别大型交易(可能是机构交易),并且如上所述,对短期熊市/牛市压力有一个估计。这些信息对你的赢/赔率有多大的影响是值得怀疑的。我的直觉是,如果掌握得当,这一比例可以在 10%到 20%之间,但我缺乏实际数字——它们很难量化。这个论断来自于我对实际交易者的观察,当他们成功地将订单流整合到他们现有的方法中时,他们有所改进。

我还认为,这只对真正的短期势头有效,这一信息需要得到其他操作标准的支持。作为独立来源的信息更有可能表现为噪音,而不是有价值的数据。同样,这来自我作为全权交易者非常有限的经验,而不是来自任何定量分析研究。我确信,有些操作者专门利用这些信息赚钱,因为在交易中,我一直知道,每一条信息/技术都有专门的参与者,绝对的陈述——这行得通,这行不通——通常是错误的。

三级:保留给机构公司

第三级包括直接来自交易所的所有原始信息,因此它包含关于给定交易所的每一条信息。处理这种数据馈送意味着处理真正高的吞吐量和与交换机的直接连接。某些交易所——比如法兰克福——只将这种联系作为批准程序的一部分保留给机构投资者,而其他交易所——比如芝加哥——不施加任何限制,只要你有钱(我想是德国人对美国人的心态)。无论如何,开发三级数据所需的相关成本、资本和基础设施,让它变得毫无用处,除非你是 HFT 的机构投资者,或者正与一家机构合作。

使用的协议是专有的,通常在不同的交换机之间共享。主要有 GLOBEX(CME 使用)和 T7(EUREX 使用)。使用的协议分别是 MDP3.0 和 EMDI/EOBI/RDI/ETI(最新的是 T7 的接口,而不是实际的协议)。所有交换 APIs 协议通常都利用 FIX 协议,这是高端实时金融数据的全球标准。

Level III data requires a direct connection with the Exchange. In the photo the European T7 EUREX System architecture.

这些系统还被出售给世界各地其他规模较小的交易所,这些交易所没有坚实的商业案例来建立自己的电子交易基础设施。其他较小的交易所使用它们自己的电子交易系统,虽然它们之间不兼容,但它们通常都共享相同的原则和底层协议。这些系统和协议仅在机构基础设施的环境中有用,较小的参与者可以通过访问聚合数据服务来以低得多的成本成功运营,该服务将提供更容易消费的 API 访问。

对于小玩家来说,一级可能是最有用的工具

如前所述,虽然有些人把深度书描述为日内交易和刷单操作的有价值的工具,但不断提交和删除订单的算法的存在经常使这些信息误导,如果不是完全欺骗的话。同样,如果要将这些信息纳入我们的交易策略中,理解适当的背景和附加的交易操作标准是必不可少的,这一点很重要。

对于小型全权操盘者来说,更可能有用的信息是与时间&销售相对应的信息,即已执行的交易,因为这些交易是已确认的交易,并暗示有人实际上在以给定的价格承诺资金。

虽然仍有可能成为算法欺骗策略的一部分,通过诱捕其他参与者来创造流动性,但已执行的订单可能比未执行的订单更不具欺骗性。声明“我正在以这个价格购买 100 份 CME ES 合约”与实际购买它们是完全不同的(在撰写本文时,这样的合约量的名义价值约为 1500 万美元)。然而,这还不是一种规范;最大的运营商拥有无限的资本,他们的轮换区域需要使用广泛的价格范围来满足他们所有的购买/销售需求。

就持有时间而言,你越是做短线,信息延迟和费用对操作者的影响就越大,因此这个领域就越是留给专业交易行业。零售和小型运营商需要部署将利润/损失和风险与延迟和经纪/市场费用充分分离的策略。

游击方式:你不是猎人

对二级数据值的这种解释需要非常谨慎。我们不能忘记,所有市场交易的 80%以上来自算法——可能更高。

毫无疑问:这些算法是由世界上最强大、最足智多谋、最熟练、资金充足、最聪明和最有经验的团队设计的。

他们指望无限的资本来运作,他们旨在欺骗其他玩家。他们标记订单,识别可能的来源(人工操作员、慢速算法、并置 HFT)并相应操作,他们实时关联不同的市场和交易所,以利用跨市场的差异(期货、现金、期权、场外交易、暗池)。由于搭配,基于 FPGA 的定制硬件使用,有时甚至是交易所本身向大型参与者提供的明显优势——称之为漏洞——它们的运营也比市场中的其他参与者具有时间优势。

基本上,他们在各方面都胜过你,重要的是永远不要忘记这一点,所以你所有的作战程序都使用游击战方法来专注于那些正规军无法充分对抗的优势

最重要的是,机器学习和人工智能的兴起可能会继续以更快的速度增加算法的相关性。我甚至怀疑人工操作在未来是否可能实现。

虽然当前的技术允许小经营者做过去保留给大型机构公司的事情,但同样的技术将机构公司和做市商推向前所未有的知识和权力水平。当前的市场已经是一场大屠杀,而且只会变得更糟。

Small operators and retails operating intraday constitute actual market snipers fighting a regular and much stronger army. They are part of an heterogeneous, uncoordinated, irregular guerilla waiting for the right market conditions to appear. In the photo: detail of a hit-and-run scalping trade on E-Mini NASDAQ CME future contract.

小运营商的希望是,由于资本如此有限,有可能在数百毫秒内分配和解除分配资本,而不会对市场产生任何影响,因此有可能在非常短的时间内加入机构运动,并仍能获得不错的利润。

流动性从来不是问题,除非在新闻、特朗普的推文和其他意外事件等异常市场条件下——这只适用于零售和大多数普通公众,因为没有意外事件这种事情;在某个地方,总会有人在事件发生之前就已经知道并做好了充分的准备。

在这种情况下,滑点可能会让你在失败的交易中损失两倍或三倍,但这是游戏的一部分,任何有经验的交易者都可以成功避免其中的大部分。对于真正意想不到的风险,它们将被视为整体 P&L 中的异常值,风险管理更高的保护层将避免对我们的运营产生任何严重影响——是的,你需要更多的风险管理层,而不仅仅是止损。

通过将操作限制在恰到好处的时机,小参与者可以利用这种可用的流动性,在做市商的某些活动中表现出微不足道的回报/烦恼。我并不是说这很容易(因为这并不容易),但如果利用了正确的时机和环境,这绝对是可能的。这里的要点是,一级和二级数据有助于实现这个目标,特别是日内操作。

在定量分析中处理分笔成交点数据

就定量数据分析而言,分笔成交点数据是另一回事,尤其是当需要整合图书深度信息时。我估计从分钟 OHLC 棒线到分笔成交点数据需要一到两个数量级的数据处理工作。

Wolfpack Flow™ is my latest designed tool to operate Order Flow. Among its key functionalities: Big Trade analysis, Volume Clusters, Volume Profile and Order Flow. The software has been designed from scratch and it is fully optimised to operate intraday Order Flow and Volume. Source: www.wolfpackflow.com

原因在于,对于 OHLC 蜡烛线,每单位时间的信息量总是具有预定义的大小限制。即使移动到一秒钟蜡烛线(不使用订单流但需要分析短期策略时的常见选择)也会增加处理需求,但与一分钟棒线相比不会改变任何事情。对于分笔成交点数据,不仅数据量大得多,而且每时间单位的数据大小也不规则。这种额外的复杂性进一步限制了数据的处理方式,因为需要更复杂的存储和处理后端。

由于每秒钟订单簿的变化数量可能非常大,尤其是在波动性高峰期间,存储深度簿数据会带来更具挑战性的性能需求。对于这些环境,定制开发几乎是一个硬性要求。

摘要

在本帖中,我们对一级和二级市场数据进行了简要回顾。还简要介绍了第三级。

在没有涵盖任何实际策略的情况下,我们讨论了一级和二级数据如何对自主日内交易做出贡献。并对处理数据馈送中这一级别的细节所面临的挑战提出了一些意见。

总的来说,在我们的交易程序中包含至少一级和订单流数据可以显著提高我们的盈亏比,从而降低风险和支出。额外的信息也有助于减少与日内交易相关的压力,因为可以确定更清晰的进场点和出场点。

如何压缩你的时间序列

原文:https://towardsdatascience.com/the-what-and-why-of-inflation-adjustment-5eedb496e080?source=collection_archive---------1-----------------------

我们将看看什么是通货膨胀调整,以及为什么你应该紧缩你的时间序列。在这个过程中,我们将了解消费者价格指数(CPI) 以及它是如何计算的。

通货膨胀调整通货紧缩是从数据中去除价格通胀影响的过程。只调整以这种方式表示的货币数据是有意义的。这类数据的例子有每周工资、存款利率或西雅图一袋 5 磅蛇果苹果的价格。如果你正在处理一个以货币命名的时间序列,缩小它将会消除它的上下波动的一部分,这是一般通货膨胀压力的结果。

在我们进入通货膨胀调整的“如何”之前,让我们看看通货膨胀调整可能产生的效果。

通货膨胀调整的影响

下面的时间序列代表了 1997-2017 年美国所有工薪阶层的平均年薪。数据显示,年同比平均增幅约为 3%。

Source: Wages and salaries by Occupation: Total wage and salary earners (series id: CXU900000LB1203M). U.S. Bureau of Labor Statistics (Image by Author)

当你根据通货膨胀调整这些数据时,图表明显变得起伏不定:

Wages after adjusting for inflation (Image by Author)

我们做了什么来得到第二张图?我们所做的是采用消费者价格指数,特别是美国劳工统计局发布的CPI-城市工薪阶层和文职人员:所有项目 1982=100 ,我们将年薪数据除以当年的 CPI 值,然后将结果乘以 100。以 1997 年为例,我们将 43615 美元的工资除以 1997 年的消费物价指数 157.6,再乘以 100,得出经通货膨胀调整的工资(以 1982 年美元计算)为 43617/157.6 * 100 = 27674 美元。然后每年重复这一计算,得到如上所示的第二个图。

这是另一个说明通货膨胀调整效果的图表。

(Image by Author)

图中的蓝线表示通货紧缩前每年工资的百分比变化,橙线表示通货紧缩后“实际工资”的百分比变化,灰线表示每年的通货膨胀。

在很大程度上,经通货膨胀调整的工资的变化与未经调整的工资的变化是一致的。但在与前几年相比通货膨胀率较低的年份(如 2009 年和 2015 年),经通货膨胀调整的工资大幅上升,而在与前一年相比通货膨胀率大幅上升的年份(如 2000 年、2008 年和 2011 年),经通货膨胀调整的工资大幅下降。

现在我们已经看到了几个通胀调整数据的例子,让我们来看看通胀调整是如何工作的具体细节。

通货膨胀调整公式

正如我们所看到的,你可以通过将数据除以适当的消费价格指数,然后将结果乘以 100 来调整通货膨胀。

Inflation Adjusted Value (Image by Author)

这是一个重要的公式。让我们把它标为等式 I。我们很快会再次用到它。

使用此公式时,您应该知道两件事:

  1. 在这个公式的分母中,使用正确的价格指数很重要——通常有几个价格指数可供选择,并且
  2. 知道如何解释通货膨胀调整值是很重要的。你如何解释这个值取决于你有什么数据和你用什么价格指数来缩小它。

让我们详细检查每一点。

我应该使用哪个通货膨胀指数?

通常有几种可用的 CPI,您应该针对您的数据类别使用正确的 CPI。例如,美国劳工统计局(BLS)发布了大量的价格指数。以下是一组示例:

Data source: U.S. Bureau of Labor Statistics (Image by Author)

您使用哪个指数取决于您希望压缩什么数据以及您希望测量数据的什么属性。让我用两个例子来说明这一点:

示例 1: 假设您有一个美国所有城市地区苹果年平均价格的时间序列。如果你希望得到美国城市消费者经历的苹果价格的核心增长,在扣除城市消费者经历的整体通货膨胀的影响后,你应该使用CPI-所有城市消费者:美国所有商品,1982–84 = 100CPI-所有城市消费者:美国所有商品,1967=100 来降低你的苹果价格如果你错误地使用非常流行的指数CPI——城市工薪阶层和文职人员 你会得到不正确的结果,因为这个指数只衡量城市工薪阶层经历的物价上涨,而不是所有的城市消费者。

例子 2: 假设你希望在抵消城市整体食品通货膨胀的影响后,得出苹果价格的核心增长,你应该使用指数CPI-所有城市消费者:美国城市平均食品和饮料,所有城市消费者,不经季节调整 来压缩你的数据。这将会给你一个衡量苹果相对于其他食物变得更贵或更便宜的尺度,而且只对城市消费者而言。稍后我将更详细地描述 CPI 的这种特殊用途。

现在,我们已经了解了使用正确指数的重要性以及如何使用它来获得调整值,让我们更深入地了解调整值告诉我们什么。为此,我们首先需要理解 CPI 的概念。

如何解读通货膨胀调整值?

要知道如何解释紧缩值,必须了解什么是消费物价指数,以及它是如何计算的。CPI 的技术定义听起来很无聊,但事实就是这样:

消费者价格指数衡量家庭消费的一篮子商品和服务的价格变化。

要真正理解什么是 CPI,我们必须知道如何计算它,这个计算最好用一个例子来说明。因此,让我们启动一个迷你项目来创建一个闪亮的新指数。我们称之为高谭市的虚拟 CPI 所有项目,不经季节调整。

我们的第一个任务是计算一个在哥谭市的虚构家庭的年支出。

Image credit: Pexels from Pixabay

我们还将做一个相当大胆的假设:我们将假设我们的虚拟家庭的消费完美地代表了哥谭市所有家庭的消费。有了这个假设,让我们开始计算家庭开支。

下表包含连续两年测量的家庭年度支出在 8 个类别中的细分:

The market basket of our fictional household (Image by Author)

在这个例子中,市场篮子是我们虚构的家庭每年消费的商品和服务的集合。对于哥谭市的虚构家庭,市场篮子的价格在 2018 年是 42000 美元,在 2019 年是 43260 美元,比 2018 年增长了 3%,我们将归因于通货膨胀。

请注意,购物篮分布在八个类别中。这些也是美国劳工标准局在计算美国各种 CPI 时使用的一些类别。

现在,让我们回忆一下,我们想要得出的是一个指数,而不是一篮子货币的绝对美元成本。一个指数需要一个基础,所有的未来值都可以很容易地与之进行比较。所以我们会任意假设 2018 年是我们的基准年,我们会把 2018 年的指数值设为 100 点。让我们把它重新命名为:

哥谭市虚构的 CPI 所有项目,不经季节调整, 2018=100

我们现在可以计算 2019 年 CPI 虚构的值如下:

(Image by Author)

因此,2019 年的指数值= 43260 美元/42000 美元* 100 = 103。

CPI 值 103 告诉我们的是,对于哥谭市的所有家庭来说,市场篮子在 2019 年变得更贵了 103/100 = 1.03 倍。

总的来说:

A simplified version of the formula for calculating the value of the index (Image by Author)

对于时间段(或简称为期间),我们通常是指特定的一天、一周、一个月、一个季度或一年。

假设在 2020 年至 2023 年的连续 4 年中测量市场篮子的价格,发现 2020 年为
44400 美元,2021 年为
46200 美元,2022 年为
43800 美元,2023 年为
45240 美元。

那么,在这些年里,我们的虚构指数取值如下:

在 2020 年,指数值= 44400 美元/42000 美元* 100 = 105.7143

在 2021 年,指数值= 46200 美元/42000 美元* 100 = 110

在 2022 年,指数值= 43800 美元/42000 美元* 100 = 104.2857

在 2023 年,指数值= 45240 美元/42000 美元* 100 = 107.7143

以下是结果值表:

CPI Fictitious in Gotham City — All Items, not seasonally adjusted, 2018=100 (Image by Author)

一旦有了 CPI 数据,计算逐年通胀就非常容易了。公式如下:

Formula for rate of inflation (Image by Author)

使用这个公式,我们可以看到哥谭市家庭在 2019 年至 2023 年经历了以下通货膨胀。

Percentage Inflation Year over Year in Gotham City (Image by Author)

现在让我们看看通货膨胀对购物篮中的一件商品的影响——比如一碗意大利面汤。

在 2018 年至 2023 年期间,假设 mulligatawny 汤呈现以下价格趋势:

Price of soup in Gotham from 2018 through 2023 (Image by Author)

很明显,汤的价格上涨是因为那些年哥谭市经济的普遍通胀压力。我们看到哥谭市在 2019 年经历了 3%的整体通胀。我们将假设 mulligatawny 汤的成本在 2019 年也必须至少增加这么多。

设$X 为 2018 年汤的成本。如果在 3%的通胀率后,2019 年的成本变为 3.26 美元,那么 X * 103/100 = 3.26 美元。因此,2018 年的汤的成本应该是:

$3.26*100/103 = $3.16505

因此,3.16505 美元是汤在 2018 年应该拥有的成本,因为在价格上涨 3%后,它在 2019 年的成本为 3.26 美元。对 3.16505 美元价值的另一种解释是,这是 2019 年的汤的价格,但在 2018 年是美元。

我们从表中知道,3.08 美元是 2018 年以 2018 年美元计算的汤的价格。所以现在我们可以对两个成本进行比较:3.08 美元和 3.16505 美元,因为这两个成本都是以 2018 年的美元表示的。

我们现在可以计算出 2019 年哥谭市汤成本的内在通胀对 2018 年至 2019 年的整体通胀进行贴现后如下:

Inflation in price of soup after adjusting for overall inflation from 2018 to 2019 (Image by Author)

同样,2020 年的汤的价格可以通过除以哥谭市 2018 年至 2020 年经历的通货膨胀量来调整为 2018 年的美元。

为了计算这个膨胀量,回忆一下等式(III):膨胀的公式。我们将在下面复制它:

(Image by Author)

我们可以重新使用这个公式,找出当前时间段与基准年(2018 年)相比的通货膨胀率。让我们算一算:

Calculating the cost of soup in 2018 dollars (Image by Author)

还记得我们说过我们会重温方程(I)吗?又来了:

(Image by Author)

我们可以通过将等式(IV)的分母表示为如下,用等式(I)来表示等式(IV):

(Image by Author)

现在回到等式 I,2020 年的 CPI 是指数值,2018 年的 CPI 总是 100,因为它是基年。因此,

(Image by Author)

这和我们之前用不同但等价的公式得到的一样。

无论如何,我们现在已经将 2019 年和 2020 年的汤的成本调整到相同的基数,即 2018 年的美元。因此,像我们之前所做的一样,让我们在扣除整体价格通胀的影响后,比较从 2019 年到 2020 年汤类价格的实际百分比变化。价格的“核心”变化是:

(Image by Author)

我们现在可以陈述计算一个项目的价格相对于感兴趣的 CPI 的真实(内在)变化的一般公式:

Formula for intrinsic inflation in an item (Image by Author)

下表显示了 2019 年至 2023 年哥谭市在调整整体通胀之前和之后的汤价通胀。

(Image by Author)

这是一剂有益的数学良药。让我们休息一下,喝点汤,然后再继续工作。

Image credit: GeoTrinity CC BY-SA 3.0

我们虚构的 CPI 例子对我们很有帮助。到目前为止,它向我们展示了如何计算指数,如何计算指数中的通货膨胀,如何解释通货膨胀调整值,以及如何根据适当的指数计算一个项目价格的内在增长。

但是现在,冒着降低我们所有蝙蝠侠粉丝的兴趣(和自尊心)的风险,我们必须回到现实。

现实的快速剂量

每年,美国 BLS(或其他国家的相应政府机构)都会采访成千上万不同金融阶层(低、中、高收入)和不同职业的家庭,以收集他们的消费习惯数据。这项工作的结果是计算了几十个更小、更集中的指数。然后,使用一个权重系统将这些指数汇总起来,形成几个顶级消费物价指数。精确的计算可能会很复杂,但概念很简单。你想找出“普通”家庭在商品和服务上的花费,然后将这个数字指数化到某个任意的基准年。然后每个月、每个季度、每年重复这一计算,以了解与前一时期相比,生活成本变得贵了(或便宜了)多少。

如果您正在训练货币计价数据的模型…

如果你正在训练一个模型,如果你不紧缩你的货币计价数据,你的训练不会失败。与此同时,你应该考虑缩减它,因为这样做将从你的数据中移除那部分“信号”,那是由于普遍的通货膨胀压力。除了通货紧缩,您还应该考虑一个或多个其他转换,如对数转换(使趋势呈线性)、季节调整和差异。所有这些操作都将从数据中删除信号的相应部分。剩下的就是你的训练算法现在可以关注的残差趋势。此外,当然还会有噪声——你的算法必须学会忽略它!

快乐放气!

我写关于数据科学的主题,特别关注时间序列分析和预测。

如果你喜欢这篇文章,请在Sachin Date关注我,获取关于时间序列分析、建模和预测的技巧、操作方法和编程建议。

桑基图的内容、原因和方式

原文:https://towardsdatascience.com/the-what-why-and-how-of-sankey-diagrams-430cbd4980b5?source=collection_archive---------7-----------------------

智能显示资源流动

知道什么

桑基图显示了资源的流动。他们交流所代表的资源、材料或成本的来源和用途。

阅读和解释桑基图的关键是记住宽度与所表示的数量成正比。在下面的例子中,观众很快就会看到,除了水文循环的其他特征之外,水的最大目的地是陆地蒸发。

Source: The Energy Sustainability Challenge

红旗

当呈现桑基图时,记住唯一的规则(好的,主要规则)是线条和箭头的宽度代表资源的数量或体积。如果箭头不具有代表性,这可能意味着构造者犯了一个错误,不理解工具的用途,或者试图隐藏一个难以忽视的事实。如果出现了什么问题,一定要问问题,以确保你理解了可视化。

为什么/什么时候它们很棒

  1. Sankey 图允许您直观地显示复杂的流程,重点关注您想要突出显示的单个方面或资源。如果你的团队正在做一个关于精力、时间或金钱的决定,那么这是一个考虑桑基图的好时机。
  2. Sankeys 提供了支持多种观看级别的额外好处。观众可以获得高层次的观点,看到具体的细节,或产生互动的看法。如果你有一个喜欢向下钻取的队友,许多工具会让你共享该功能,而不需要创建者做任何额外的工作。您还可以预先确定最适合您的目的的深度级别。
  3. 桑基图使主要贡献者或消费者脱颖而出,并帮助您的受众看到相对数量和/或具有最大机会的领域。

当他们不好的时候

This Sankey diagram from Data to Viz has a lot going on

有时,桑基图并不是适合您情况的合适工具:

  • 它们可能显得过于复杂,让你的观众难以消化。
  • 制作拙劣的桑基图,隐藏而不是突出可操作的洞察力。
  • 由于不是每个人都熟悉这种可视化类型,复杂的桑基图可能需要花费更多的时间和精力来解释
  • 桑基图很难区分和比较具有相似值(宽度)的流量。如果这些比较对你的目的是必要的,考虑一个(堆积)条形图。

如何制作桑基图

第一步:设计

首先,巩固你的目的和对你的观众最重要的收获。为了避免浪费时间重新构建图表或构建无效的桑基图,我建议在开始之前问自己以下几个问题:

  • 您正在使用此 Sankey 进行探索性数据分析吗?
  • 你是用它来讲述一个故事,促进一个特定的行动,改变想法吗?
  • 谁是你的观众?
  • 您的受众对数据可视化的体验水平如何?
  • 你的受众在寻找什么并被什么说服——投资回报率、效率、有效性、盈利能力、地区或城市的比较?

从这里开始,在开始编码之前,从你想要的可视化的轮廓开始是一个好主意。绘制草图时,请考虑以下几点:

  • 交流观点的替代方式
  • 用空间和/或颜色对相关的输入或输出进行分组
  • 用颜色表示从一种状态到另一种状态的转换
  • 使用色彩饱和度或强度、位置、长度、角度、方向、形状来强调你的观众的主要观点。(除了宽度以外的任何东西!)
  • 削减微小的流量或将它们归入“其他”类别以减少混乱

第二步:编码

from matplotlib.sankey import Sankey
from matplotlib import pyplot as pltfig = plt.figure(figsize=(15,10))
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[],
                    title="Flow Refugees from the Syrian Civil War")
sankey = Sankey(ax=ax, 
                scale=0.0000001, 
                offset= 0.1,
                format = '%d')
sankey.add(flows=[6918000, -3600000, -950000, -670000, -250000, 
                  -130000, -1300000, -18000], 
           labels = ['Syria', 'Turkey', 'Lebanon', 'Jordan', 'Iraq', 
                     'Egypt', 'Europe', 'USA'], 
           orientations=[0, 0, 1, 1, 1, 1, -1, -1],#arrow directions
           edgecolor = '#027368',
           facecolor = '#027368')
sankey.finish();

其他有用的论据

  • Pathlength 使用此参数可以调整箭头的长度,一旦它们通过一个浮动列表从主流中分离出来。
  • Trunklength 使用此参数调整输入和输出之间的空间长度

一句警告

最初,我得到了这个不太像桑基的可视化。我完全不知道哪里出了问题——我看到了一些数字、标签和宽度,但肯定不是我所期望的。

深入研究文档,我决定调整树干长度,这有助于我的桑基开始从它的几何艺术品茧中出现。正如我丈夫指出的,它从波洛克到了大理。

然后我找到了——比例因子。原来比例因子是处理大值的关键!经过一点试验,我让桑基看起来好多了。

看起来默认值对于百分比值很有效,但是要准备好缩放任何其他数据量。

添加中间或附加步骤

fig = plt.figure(figsize = (15,8))
ax = fig.add_subplot(1, 1, 1, xticks=[], yticks=[], 
                     title="Household Budget")sankey = Sankey(ax=ax, scale=.1, offset=1, unit='%')sankey.add(flows=[100, -50, -30, -20],
           labels=['household budget', 'necessities', 'fun', 
                   'saving'],
           orientations=[0, 0, 1, -1],
           trunklength = 10,
           edgecolor = '#027368',
           facecolor = '#027368')sankey.add(flows=[50, -30, -10, -10], 
           labels=['','rent', 'groceries', 'other'],
           trunklength = 2,
           pathlengths = [3,3,3,3],
           orientations=[0, 1, 0, -1], 
           prior=0, #which sankey are you connecting to (0-indexed)
           connect=(1, 0), #flow number to connect: (prior, this)
           edgecolor = '#58A4B0',
           facecolor = '#58A4B0')diagrams = sankey.finish()
for diagram in diagrams:
    for text in diagram.texts:
        text.set_fontsize(16);

Matplotlib 的 sankey 包似乎不能完成您希望 Sankey 图所做的一切。例如,它似乎没有使用颜色来指示源或第三个属性来跟踪跨节点的流。如果你想制作更复杂的桑基图,特别是带有颜色功能的,我推荐你使用其他工具,比如[f](https://github.com/ricklupton/floweaver)loweaver [ 如何在这里使用 ]。

Sankey diagram from floWeaver’s quick start guide showing the flows of apples and bananas

他们选择的主题——苹果和香蕉从农场到性别化消费者的转移——感觉有点做作。我很难相信没有女人吃农场 2 的苹果,只有女人吃农场 3 的苹果。同时,我认为这个工具是一个不错的选择,这取决于你的需求和风格偏好。

桑基图并不是每种情况下的完美工具。它们绝对不是创建或理解起来最快捷、最简单的可视化方式。但如果做得好,它们会成为强有力的话题引子。只要确保你正在使用它们,因为它们是传达你的信息的最佳方式,而不仅仅是炫耀你的可视化技能。

整个数据科学世界掌握在您手中

原文:https://towardsdatascience.com/the-whole-data-science-world-in-your-hands-2f418165075e?source=collection_archive---------13-----------------------

在不同的语言和工具上测试 MatrixDS 功能。如果你处理数据,你必须检查这个。

Image by Héizel Vázquez

多年来,我一直在寻找一个平台,在这个平台上,我可以运行我的数据科学项目,而不会有安装的痛苦,也不会让我的计算机充满许多不同的工具和环境。

幸运的是,我发现 MatrixDS 拥有所有这些以及更多免费的东西!在本文中,我将测试他们拥有的几乎所有工具,因此您不必这样做。

该项目在平台中是公开的,您可以在这里看到它:

[## MatrixDS |数据项目工作台

MatrixDS 是一个构建、共享和管理任何规模的数据项目的地方。

community.platform.matrixds.com](https://community.platform.matrixds.com/community/project/5cb72e2478de19f638a914b9)

如果你想测试它,你必须做的就是铲车,就是这样。

还有一个 GitHub 回购:

[## FavioVazquez/matrix _ languages _ tools

测试 MatrixDS 的不同工具和语言。通过…为 FavioVazquez/matrix _ languages _ tools 开发做出贡献

github.com](https://github.com/FavioVazquez/matrix_languages_tools)

测试 Python 的东西

Jupyter 笔记本

我目前最喜欢的编程语言是 Python。有很多很棒的工具和特性可以帮助你使用这种语言。其中最受欢迎的是 Jupyter 笔记本。要在 MatrixDS 中启动笔记本,请执行以下操作:

  1. 转到平台中的工具选项卡。
  2. 单击右侧的(+)按钮:

3.选择 Python 3(或 2)与 Jupyter 笔记本:

4.为工具选择一个名称,并设置内核和 RAM 的数量:

5.创建并启动笔记本后,只需打开它:

6.开心编程;)

在笔记本里面,你可以自由地做任何你想做的事情。我创建了一个简单的 Python 笔记本来测试 PySnooper ,所以你可以试试。

这是该笔记本的要点,您可以在 MatrixDS 项目中找到:

朱庇特实验室

JupyterLab 是 Jupyter 项目的下一代基于网络的用户界面。这就像类固醇上的朱庇特笔记本。

要在 MatrixDS 中启动笔记本,请执行以下操作:

  1. 转到平台中的工具选项卡。
  2. 单击右侧的(+)按钮:

3.选择 Python 3 和 JupyterLab:

4.为工具选择一个名称,并设置内核和 RAM 的数量:

5.创建并启动工具后,只需打开它:

6.玩得更开心:)

我在 JupyterLab 实例中创建了一个简单的 Python 笔记本来进行测试,所以您可以尝试一下。

如果你一直在关注我,这就是你应该看到的:

哦,顺便说一下,如果你想知道如何使用 git 和 MatrixDS,请查看这篇文章:

[## 擎天柱的数据科学。第 2 部分:设置您的数据操作环境。

用 Python、Spark 和 Optimus 分解数据科学。今天:数据科学的数据操作。..*第 1 部分在此…

towardsdatascience.com](/data-science-with-optimus-part-2-setting-your-dataops-environment-248b0bd3bce3)

我创建的测试笔记本测试功能性机器学习的新库 fklearn 。这是该笔记本的要点,您可以在 MatrixDS 项目中找到:

测试 R 事物

https://www.computerworld.com/video/series/8563/do-more-with-r

我在 r 上开始了我的数据科学生涯。它是一个非常棒的工具,可以进行数据分析、数据清理、绘图等等。我认为现在机器学习部分用 Python 更好,但要成为一名成功的数据科学家,你需要了解这两者。

要在 MatrixDS 中启动 RStudio,请执行以下操作:

  1. 转到平台中的工具选项卡。
  2. 单击右侧的(+)按钮:

3.使用 RStudio 选择 R 3.5:

4.为工具选择一个名称,并设置内核和 RAM 的数量:

5.创建并启动工具后,只需打开它:

6.玩得开心点:)

我创建的 test R 环境正在测试名为 g2r 的新库,该库使用 g2 为交互式可视化创建图形。

Btw!在运行 g2r 之前,我必须这样做:

sudo su 
apt-get install libv8-dev

所以,通常这就是你用 ggplot2 得到一个图的方法:

library(ggplot2)ggplot(iris, aes(Petal.Length, Petal.Width, color = Species)) +
  geom_point() +
  facet_wrap(.~Species)

您将获得:

不算太坏,但是给它带来交互性怎么样??使用 g2r 非常简单。这是实现这一点的代码:

library(g2r)g2(iris, asp(Petal.Length, Petal.Width, color = Species)) %>% 
  fig_point() %>%
  plane_wrap(planes(Species))

您将获得:

在您更改的代码中:

aes -> asp
geom_point() -> fig_point()
facet_wrap(.~Species) -> plane_wrap(planes(Species))

我仍然想知道为什么他们不使用相同的 API,但这是一个非常酷的项目。你可以在这里找到更多的例子:

[## 文章

启动并运行 g2r,发现与 ggplot2 的相似之处,并通过几个示例指出正确的方向…

g2r.dev](https://g2r.dev/articles/)

这是所有的代码:

测试朱莉娅的东西

当我在攻读物理学硕士学位时(大约两年前),我真的认为 Julia 将会彻底改变科学编程世界。不要误解我的意思,它做了一件了不起的工作,但是我认为 Python 的新进步已经让这个项目在很多方面都处于第二位。

为了测试 MatrixDS 的 Julia 功能,我想看看这种语言的数据库。你可以在下面看到。

要在 MatrixDS 中启动 Julia 笔记本,请执行以下操作:

  1. 转到平台中的工具选项卡。
  2. 单击右侧的(+)按钮:

3.选择 JupyterLab 的 Julia 1.1.0:

4.为工具选择一个名称,并设置内核和 RAM 的数量:

5.创建并启动工具后,只需打开它:

6.让我们朱莉娅:)(听起来很奇怪)

启动它时,您可以打开或创建任何 Python 或 Julia 笔记本:

这是我为测试 Julia 的数据科学能力而创建的笔记本:

在这里,我测试了一些库,如 DataFrames、牛虻、Queryverse、Vega 等用于绘图的库:)

如你所见,对我来说,这是在云中进行数据科学的更完整的平台。你需要最小的配置,你甚至可以用 docker 安装你自己的工具。

关于这个平台,还有更多的内容和事情要做,我将在其他文章中介绍。如果你想和我联系,请点击这里:

[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特

Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…

twitter.com](https://twitter.com/faviovaz)

硅谷之狼

原文:https://towardsdatascience.com/the-wolf-of-silicon-valley-150e5f501216?source=collection_archive---------21-----------------------

数据科学是新的投资银行

Photo by Rebecca Zisser on Axios

毫无疑问,物理学中最怪异的概念是爱因斯坦所谓的“幽灵般的超距作用”。显然,在宇宙一边的一个粒子可以在另一边有一个心灵感应的双胞胎——你扭动第一个,第二个也会抽搐。事实证明,这种现象也适用于人类。我们每个硅谷的数据科学家在华尔街都有一个替身。

没有人在成长过程中渴望每天 12 个小时左右洗牌,只有其中的 8 个小时你会得到报酬。大多数人长大后都渴望成为科学家。有些人研究社会科学,因为他们想为我们所有人消除贫困。高盛很快说服他们首先为自己清除病毒。其他人倾向于真正的科学,因为他们想知道是什么让宇宙运转。他们最终来到山景城,发现是什么让顾客点击。

不管你最终在海岸的哪一边,你都会花时间盯着一张反复无常的图表,看价格或损失函数值的变化。你存在的整个完形将被浓缩在这该死的一行字里。只有一条路,你会成为大人物的。另一方面,你最好从顶楼的窗户跳出去。或者万一你发现自己在谷歌上,头朝下滑下地铁滑道,让你的大脑撞到下面彩色的地板上。

为了掌控他们的图表,神童们如此积极地将信息强行输入他们的大脑,以至于他们不可避免地会癫痫发作并流口水。在资金管理中,一个人必须至少有两个屏幕——他的一双眼睛各有一个——调到美国消费者新闻与商业频道和彭博的假新闻。在数据科学中,总有另一篇 arXiv 文章可以阅读,总有另一篇 OpenAI shitpost 可以阅读。

然而,不管你读了多少,总有更多的首字母缩略词需要吸收。大多数人会记住字母组合,更大胆的人会去查完整的形式,但是绝对没有人理解其中隐含的概念。在金融领域,有 CDO 和 CDs,过去对它们的误解导致了社会动荡。在机器学习中,你有 DNNs、CNN 和 LSTMs,对它们的误解导致了目前的社会动荡,因为它们将有色人种贴上大猩猩的标签,将 T2·里奇·格威斯贴上极权主义者的标签。

即使你不完全理解这些技术,你仍然被要求去做上帝的工作来部署它们。在街上,这相当于为光缆挖沟,为你的股票交易节省 5 毫秒。在硅谷,你将永远刷新英特尔荒凉的支持论坛,因为你他妈的神经计算棒是开箱即用的。

如果所有其他方法都失败了,你总有可能通过欺骗达到顶峰。许多最著名的金融家——从伯尼·麦道夫(Bernie Madoff)到三个最初的雷曼兄弟(Lehman brothers)的门徒——都信誓旦旦地说,他们采用了久经考验的策略,骗取退休人员的养老基金。我们数据科学家也是如此,他们把老人的工作冒充成我们自己的来欺负老人。事实上,戈登“贪婪是好的”盖柯在机器学习领域的死对头理查德萨顿分享了他的口头禅:“任何贪婪的政策……都是最优政策。”

现在,所有这些忙碌和忙碌肯定会让你神经过敏。为了缓解压力,银行家们历来求助于可卡因和妓女。SQL script kiddies 从他们异常的酮水平中获得快感——这是剥夺他们身体在 Joylent 中找不到的必要营养的结果。至于性的自我表达,他们宁愿等待性爱娃娃变成人工智能

神盾局。

成本函数的世界——包容性、多数主义和寡头政治

原文:https://towardsdatascience.com/the-world-of-cost-functions-inclusivity-majoritarianism-and-oligarchy-51362b8b91f4?source=collection_archive---------32-----------------------

The curve fitting problem (Image credits)

大多数机器学习问题归结为将一组观察值(点)拟合到某条数学曲线(在机器学习的说法中简单地称为“模型”)。这就产生了一个压缩的表示形式,可以用于包括预测和模式识别在内的应用。

拟合过程通常包括最小化所谓的成本函数,该成本函数代表所选曲线相对于其试图拟合的观察样本的误差。在本文中,我们将更深入地研究成本函数的有趣世界,它们的选择如何在模型的选择中发挥重要作用,并最终看到一些令人难以置信的与现实世界治理模型的更深层次的联系(我确信这将是有趣的,因为选举即将到来!)!在理解这些成本函数的过程中,我们将使用最简单的曲线拟合问题——线性回归。

线性回归

Predicting the price of a house

假设你有一个特定问题的一堆特性(假设 n = 100)。你知道你试图预测的输出是这些特征的线性组合。大多数教程谈到的经典用例是根据房屋的各种特征(xᵢ)预测房屋的价格,其中特征的范围从位置到屋顶类型到面积等。价格(y)的预测由函数 h(x)表示,如下所示:

其中 fᵢ = featureᵢ,Wᵢ=为特征值,ᵢ和 W₀=为常数

成本函数

假设我有一个 m=2000 个数据点的训练数据。我们需要找到 W 的值,使得预测的价格尽可能接近实际价格。

换句话说,W 应该取什么值才能使下面的成本最小。

请注意,我们试图测量每个样本的预测绝对误差(如图所示),并取平均值。

Simple Linear regression: Y with respect to one feature variable X

然而,大多数文献(实际上也是)中使用的最流行的成本函数如下:

其中取每个样本中误差平方的平均值。注意,两个成本函数之间的差异在于绝对误差的幂。因此,平方误差函数被称为 L₂-norm,而前一个函数被称为 L₁范数。

成本最小化

现在是一个百万美元的问题:为什么 L₂-norm 比 L₁常模更受欢迎?大多数文献都指出了计算机出现之前的计算方法,如下所述。

对于成本最小化问题,任何微积分的初级教科书都会告诉我们,在最小点的一阶导数为零。简单地说,问题的解决方案将位于满足以下标准的点上。

Typical cost function whose first order derivative yields the minima

事实证明,当成本函数是绝对误差时,而不是当成本函数是平方误差的和时,封闭形式的解决方案——用简单的话来说是简单的公式——是不可能的。原因是成本函数在点 Cost = 0 处不可微,如下图所示。代表导数的紫色线在点 Cost = 0 处不连续

First order derivative (violet) of the absolute error cost function (red)

使用平方误差的成本函数是完全可微的,如下图所示。

First order derivative (violet) of the absolute error cost function (red)

事实上,封闭形式的解是下面的方程

其中 x 是特征值矩阵,Xᵢ,ⱼ代表 sampleᵢ.featureⱼ的值

然而,在计算机时代,可以应用像梯度下降这样的算法,并迭代地导出解决方案。我不打算深入研究梯度下降的细节,但我想指出,只要成本函数在零处的微分为零,梯度下降仍可用于 L₁-norm。或者,也可以使用诸如次梯度的方法。那么,还有理由使用 L₂标准吗?它值得如此受欢迎吗?我们一会儿就会明白。

Lp 范数

现在,我们已经研究了两个成本函数——l₁范数和 L₂范数,让我们尝试将其推广到 Lp 范数,其中 p 可以是正实数。

那么 L₀-norm 意味着什么呢?

这意味着如果特定点的绝对偏差为零,则误差为零,否则误差为 1。想象一下在一个连续的空间中发生这种情况的可能性。

如果在线性回归的情况下使用 L₀-norm,成本将是不在拟合线上的点的总数。这意味着使用 L₀-norm 将试图找到线,正是通过最大数量的点!

通过示例了解成本函数

所以我举了一个例子来更好的理解三个代价函数。假设我想对下图所示的点进行线性回归。

我知道这不是一个应用线性回归的好例子,因为这些点似乎分散在 3 个区块中。在顶部有一条线,在中间有一小组共线的点,在最右边的块中有一堆随机分布在零周围的点。然而,我将使用线性回归来说明成本函数的行为。另外,请假设这些点都不是噪声或异常值。

此时,同样重要的是指出梯度下降算法不能应用于 L₀-norm,因为函数在零处的不连续性质(其值为零时的脉冲下降!)以及其他地方的平坦性质(高原),如下图所示。

L₀-norm discontinuous at zero!

然而,有一些算法,如匹配追踪也允许我们求解 L₀-norm 成本函数。

成本函数统治着我们的世界!

现在让我们看看由三个成本函数拟合的曲线。

可以看出,L1 范数穿过最上面的点,而 L₀-norm 穿过中间的一小组共线点,L2 范数穿过图形的中间。我认为这很有趣,我们将在接下来的段落中看到原因。

L2 norm — attempts to be inclusive!

L2-诺姆试图迎合每一个观察到的样本——虽然乍一看它可能看起来过度拟合,但成本函数实际上试图“包含”和“适应”,并将线放置在尽可能接近每一点的位置。

Majoritarianism of L1-norm (Image credits)

另一方面,L1 范数通过围绕一条线采样的看似点的主要块。L1-诺姆成本函数实际上忽略了中间和最右边的块。本质上 L1 范数更像是一个多数派函数迎合了观察样本集中的最大块。

L₀-norm: Oligarchy at play?

L₀-norm 穿过一组较小的共线点。它是一个成本函数,几乎是“我的(我们的)道路或高速公路”的一个体现。它不能容忍哪怕是最轻微的偏差——所以它几乎忽略了所有的样本,只寻找样本中真正线性的点。这几乎是一种“T10”寡头政治在起作用,其中一小组完全一致的观察决定了模型。请想一想,在一个真正连续的空间中,如果是线性关系但不是完全线性的,三个点共线的概率几乎为零,所选的线可能只通过两个点,这几乎就像两个单独的点在表演一样!

获胜者

因此,推广它,在 Lp-范数成本函数中,随着 p 的减少,我们可以看到模型转变为多数主义,最终寡头政治!然而,Lp 范数的高阶成本函数促进了包容性!我认为这解释了选择 L₂范数函数背后的流行。成本函数的选择取决于场景,但对于大多数数据集,公平地说,L₂范数函数是可行的。

在下一篇文章中,我将讨论过度拟合的主题,这是通过一种称为正则化的技术来解决的。

(首次发表于 《印度分析》杂志 )

十四大灾难

原文:https://towardsdatascience.com/the-xiv-meltdown-1b0608110b9f?source=collection_archive---------5-----------------------

为什么“稳赚不赔”变成了一场史诗般的金融灾难

我一直对 VIX 很感兴趣。对于金融领域以外的人来说,VIX 代表 CBOE(芝加哥期权交易所)波动指数。在新闻中,你可能会听到它被称为“恐惧指数”。

在 2018 年 2 月之前,VIX 因两个主要原因而闻名:

  1. 在严重的市场抛售期间,它往往会飙升,因此有了“恐惧指数”的绰号。
  2. 它为做空者创造了大量财富(做空是押注投资价格会下跌——因此,如果你做空 VIX,当 VIX 下跌时你会赚钱,当它上涨时你会赔钱)。做空 VIX 变得如此流行,以至于有了自己的子市场

然后 2018 年 2 月到来,这种情况在短短几个交易日内就发生在 XIV、SVXY 和其他做空 VIX 基金的投资者身上(XIV 是最受欢迎的 ETF,或交易所交易基金,做空 VIX 期货)——GG。

Ouch! (Source: Yahoo Finance)

短短几天内,XIV(被迫清算)、SVXY 和其他做空 VIX 投资基金的投资者损失惨重(与此同时,跟踪标准普尔 500 的基金 SPY 仅损失了 5.5%)。在今天的帖子中,我们将探讨 XIV 这样的基金为何如此引人注目,以及它如何为不要将所有鸡蛋放在一个策略上提供了一个警示故事(特别是如果你不了解所涉及的所有风险)。

什么是 VIX?还有为什么大家都做空?

看看下面的图表。深蓝色的线是 SVXY,一个做空 VIX 期货的 ETF(不像 XIV,它今天仍然活跃)。浅蓝色的线(看起来几乎是水平的)是标准普尔 500。

从 2013 年初到 2017 年底,标准普尔 500 获得了 86%的可观回报,几乎让你的钱翻了一倍。在同一时间段内,通过 SVXY 做空 VIX 获得了令人难以置信的 565%的回报,几乎是你的钱的 7 倍(从 1 到 7)!这些在相对较短的时间内获得的荒谬回报是人们持续光顾 VIX 赌场的原因。

Source: Yahoo Finance

我一直在说的这个 VIX 是什么?VIX 的技术定义是标准普尔 500 期权的隐含波动率。但它是如何计算的远没有它代表什么重要。

简而言之,VIX 衡量股票市场的恐惧和投资者的不确定性。

当事情进展顺利时,VIX 会越来越低。当市场崩溃时,VIX 飙升。

做多 VIX 相当于购买了应对市场崩盘的保险,而做空 VIX 相当于卖出崩盘保险。

那么,市场恐惧指数是如何变成这样一座金矿的呢?

两个因素推动了做空 VIX 者的回报:

  1. 随着时间的推移,市场趋向于上涨——随着市场上涨,VIX 逐渐下降(如果 VIX 下跌,VIX 做空利润)。
  2. VIX 期货曲线通常有一个正斜率——这意味着如果你做多 VIX,你会不断地高买低卖。

第二点非常重要。让我们更深入地看看 VIX 期货曲线。首先什么是期货曲线? A 期货合约 是在未来某一时刻以预定价格买入资产的承诺。

下图显示了一条假设的 VIX 曲线。每个蓝点是一个有特定到期日的期货合约,例如,第一个蓝点是 VIX 期货合约,从今天起正好一个月后到期。现在,由于 VIX 不能直接以市场价格(在金融中这被称为现货价格)投资,像 XIV 这样专注于 VIX 的 ETF 的经理们被迫使用期货合约来获得他们的敞口。

Being Long the VIX Futures Curve — Buy High Sell Low

因此,正如我在上面的图表中所描绘的,经理们将购买两个月后到期的 VIX 期货合约(绿色的“在此购买”),并持有该合约以获得 VIX 的长期敞口。但是一个月后,开始时是两个月的期货合约现在变成了一个月的合约(红色的“在这里卖出”)。为了保持对 VIX 的持续敞口,经理卖出他所拥有的合同,现在是一个月的合同,并购买一个新的两个月的合同(该交易由标有“重复”的虚线描述)。

现在回想一下,VIX 曲线通常是向上倾斜的。这意味着每个月经理在红灯时低价卖出,以便在绿灯时高价买入,这个过程被称为“VIX 曲线滚动”。一些数字可能会使这一点更容易理解:

  1. 我们以 100 美元购买了两个月后的 VIX 期货合约。
  2. 一个月后,假设 VIX 期货曲线没有实质性的变化,我们之前购买的合同现在是一个月的合同,价值只有 97 美元。
  3. 现在是时候重置我们的敞口了——因此我们以 97 美元卖出一个月合约,以 100 美元买入一个新的两个月合约,在此过程中损失了 3 美元(-3%的回报率)。
  4. 因为我们每个月都需要这样做,只要 VIX 曲线保持向上倾斜,我们每个月都会损失 3%。

因此,在上涨或稳定的股市中做多 VIX 相当于月复一月地失血。那么,为什么不扭转这种局面,转而做空 VIX 期货,赚回做多 VIX 的投资者损失的所有钱呢?很多人都这么做了。

月复一月,投资者只需简单地改变交易方向,就可以在高位卖出(红色表示“做空”),在低位买回(T21 ):

Being Short the VIX Futures Curve — Buy Low Sell High

那么有什么问题呢?

早些时候我们指出,做空 VIX 和出售防范股市崩盘的保险是一回事。

销售保险是一种不对称的风险回报策略——大多数时候你赚了一点点,偶尔你会失去一切。

这就是为什么保险公司雇佣大批精算师来计算如何准确地向你和我收取费用,以此作为从我们手中拿走某些风险的回报(即便如此,为了以防万一,他们仍然会将一些风险转移给再保险人)。

让我们继续用这个保险类比。如果一家保险公司发现了一个特别有利可图的利基市场,并开始赚大钱,会发生什么?竞争对手会抓住机会,涌入市场供应,从而压低每家公司的保险价格。

当你投保的是股市崩盘时,这就更危险了。

随着越来越多的投资者争相提供股市崩盘保险,不仅每个投资者被迫收取更低的价格,而且每个投资者承担的风险也增加了。

这是因为当大多数投资者意识到这一交易时,股市已经大幅上涨(市场越涨,VIX 跌得越多,VIX 做空获利)。因此,投资者争相购买保险的股市更有可能是一个被高估的市场。此外,每一个做空 VIX 的增量投资者也会将市场推高一点——随着崩盘保险价格(又称对冲成本)下降,投资者会购买更多股票,推高价格。

因此,在拥挤的市场中做空 VIX 的投资者受到了无形的双重打击——他们的行为推高了他们面临的风险,同时压低了他们可以获得的作为承担这些风险的补偿的预期回报。

这是导致灾难的原因。可悲的是,FOMO(害怕错过)导致投资者对这种危险视而不见。老实说,当你看到 SVXY(和 XIV 几乎一样)六个月的回报导致其内爆时,你很难不去 FOMO。不幸的是,这种 FOMO 会导致许多投资者几乎失去一切。

The Six Months Before the Implosion (Source: Yahoo Finance)

失去一切

让我们回顾一下我们在迈向 2018 年 2 月时的情况:

  • 有成千上万的投资者在不知情的情况下,通过交易所交易基金(如 XIV 和 SVXY)陷入了极其拥挤的 VIX 空头交易,由于历史表现强劲,这些交易所交易基金已经吸金数十亿美元。
  • VIX 接近历史低点,这意味着投资者提供市场崩溃保险的价格也接近历史低点。

在市场中,很少有线性因果关系。很多时候,看似无关紧要的事件,通过一系列非线性和意料之外的关系,可以引发市场崩盘。

在 2018 年 2 月之前,股票市场是如此令人难以置信的平静(VIX 如此之低),以至于即使是小幅下跌也可能导致投资者恐慌。这正是所发生的事情——标准普尔 500 指数本应是例行的下跌,却导致 VIX(和 VIX 期货合约)像火箭一样飙升(几分钟内上涨近 50%)。

这迫使 XIV 和 SVXY 等做空 VIX 交易所交易基金的经理回补空头,以控制损失。但是你认为当所有人同时试图从同一个小门逃走时会发生什么?

每个人都试图逃离的赌注超过了市场的承受能力,因此每笔交易都以递增的价格执行。也就是说,每一次取消做空(相当于做多 VIX)的交易都会产生痛苦的效果,把 VIX 推得更高。感觉到 ETF 经理绝望的交易者,就像鲨鱼闻到水中的血腥味一样,决心要捞一磅肉。

当所有人都完成交易时,VIX 几乎翻了一倍,持有大量 VIX 空头头寸的投资者几乎损失殆尽。

以下是 Reddit 上的一些评论,强调了这场金融灾难给投资者带来的伤害和痛苦:

“我已经损失了 400 万美元,3 年的工作成果,还有别人的钱。”——u/Lilkanna

“我感觉到你,因为我今天失去了 1/2 的净资产,这可能是我生命中的 5 年”——u/Asian here

“这是对的!???还是某个系统故障?”—u/cheap DVD

“如果我错了,请纠正我,但我从 XIV 崩溃中最大的收获是,如果我想启动一个庞氏骗局,并声明‘你可能会失去一切’,那就没问题,对吗?”— u/mauimikes

经验教训

回首过去,说做空 VIX 是一个错误太容易了。回想起来,事情总是显而易见的,但当它们发生时,就不是了。然而,当我们面对可能是泡沫的投资时,仍有一些事情我们应该记住:

  1. 如果价格下降 50%,我会没事吗?不要将你投资组合的很大一部分投资于高波动性的资产。
  2. 流动性。金融市场中许多最严重的崩溃都是因为市场突然枯竭,每个人都需要卖出。当大多数人都站在热门交易的同一侧时,是时候诚实地评估该资产的市场是否足够深,以支持同时出现的离场蜂拥。
  3. 在金融市场,预期回报是你承担市场风险的补偿。换句话说,高预期回报保护你免受意外的伤害。但是当人群涌入你的交易时,预期回报会变为零,同时价格大幅下跌的可能性也会增加。因此,您的保护在您最需要的时候消失了。

感谢阅读,祝你好运,干杯!

我在投资和金融方面的更多帖子:

投资个人贷款

剖析股市低迷

股票是否战胜现金?

我有足够的钱退休吗?

数据科学的理论基础—我应该关注还是仅仅关注动手技能?

原文:https://towardsdatascience.com/theoretical-foundations-of-data-science-should-i-care-or-simply-focus-on-hands-on-skills-c53fb0caba66?source=collection_archive---------4-----------------------

数据科学和机器学习所需的基本数学和理论技能

数据科学是一个非常注重实践的领域。数据科学需要扎实的数学和编程基础。作为一名数据科学家,您必须了解数据科学的理论和数学基础,以便能够构建具有真实应用程序的可靠模型。

在数据科学和机器学习中,数学技能和编程技能一样重要。有很多好的软件包可以用来构建预测模型。一些最常见的描述性和预测性分析包包括

  • Ggplot2
  • Matplotlib
  • 海生的
  • Sci-kit 学习包
  • 插入符号包
  • 张量流
  • PyTouch 包
  • Keras 包

重要的是,在使用这些包之前,你要掌握数据科学的基础知识,这样你就不会把这些包简单地当作黑盒工具来使用。

理解机器学习模型功能的一种方法是让你理解每个模型背后的理论和数学基础。作为一名数据科学家,您构建可应用于现实世界问题的可靠高效模型的能力取决于您的数学技能有多好。

本文将讨论一些对数据科学实践至关重要的理论和数学基础。

(一)统计和概率

统计和概率用于特征的可视化、数据预处理、特征转换、数据插补、降维、特征工程、模型评估等。以下是您需要熟悉的主题:

  1. 平均
  2. 中位数
  3. 方式
  4. 标准偏差/方差
  5. 相关系数和协方差矩阵
  6. 概率分布(二项式、泊松、正态)
  7. p 值
  8. Baye 定理(精确度、召回率、阳性预测值、阴性预测值、混淆矩阵、ROC 曲线)
  9. 中心极限定理
  10. R2 分数
  11. 均方误差
  12. A/B 测试
  13. 蒙特 卡罗模拟

例如,表示中值、模式用于显示给定数据集的汇总统计数据。它们也用于数据插补(平均数插补、中位数插补和众数插补)。

相关系数协方差矩阵用于研究数据集中各种特征之间的关系,也可用于特征选择和降维。

概率分布用于特征缩放,例如特征的标准化和规范化。概率分布和蒙特卡罗模拟也用于模拟数据。例如,如果样本数据根据具有已知平均值和标准偏差的正态分布分布,则可以使用正态分布的随机数生成器来生成群体数据集。

贝叶斯定理用于模型测试和评估,以及计算精度得分。

中心极限定理(CLT) 是统计学和数据科学中最重要的定理之一。CLT 认为,使用具有大量观测数据的样本数据集进行建模是有利的,因为样本越大,越接近总体。从这里了解更多关于 CLT 的知识: 利用蒙特卡罗模拟证明中心极限定理

R2 分数MSE 用于模型评估。下面是一篇用 R_2 分数和 MSE 进行模型评估的文章:

从零开始构建机器学习推荐模型

㈡多变量微积分

大多数机器学习模型是用具有几个特征或预测器的数据集构建的。因此,熟悉多变量微积分对于建立机器学习模型极其重要。以下是您需要熟悉的主题:

  1. 多元函数
  2. 导数和梯度
  3. 阶跃函数、Sigmoid 函数、Logit 函数、ReLU(校正线性单位)函数
  4. 价值函数
  5. 功能绘图
  6. 函数的最小值和最大值

关于如何在机器学习过程中使用多变量微积分的示例,请参见以下示例:

建立你的第一个机器学习模型:线性回归估计器

采用最小二乘法的基本感知器模型

㈢线性代数

线性代数是机器学习中最重要的数学技能。数据集被表示为矩阵。线性代数用于数据预处理、数据转换、降维以及模型评估。

以下是您需要熟悉的主题:

  1. 向量
  2. 向量的范数
  3. 矩阵
  4. 矩阵的转置
  5. 矩阵的逆矩阵
  6. 矩阵的行列式
  7. 点积
  8. 本征值
  9. 特征向量

例如,协方差矩阵是一个非常有用的矩阵,可以显示特征之间的相关性。使用协方差矩阵,可以选择将哪些特征用作预测变量。下面举例说明协方差矩阵如何用于特征选择和降维: 利用协方差矩阵进行特征选择和降维

其他高级的特征选择和降维方法有主成分分析 (PCA),以及线性判别分析 (LDA)。要理解 PCA 和 LDA 是如何工作的,你需要理解线性代数的主题,比如转置一个矩阵;矩阵的逆矩阵;矩阵的行列式;点积;特征值;和特征向量。以下是 LDA 和 PCA 的一些实现:

机器学习:通过主成分分析进行降维

机器学习:通过线性判别分析进行降维

㈣优化方法

大多数机器学习算法通过最小化目标函数来执行预测建模,从而学习为了获得预测标签而必须应用于测试数据的权重。以下是您需要熟悉的主题:

  1. 成本函数/目标函数
  2. 似然函数
  3. 误差函数
  4. 梯度下降算法及其变体(如随机梯度下降算法)

数据科学和机器学习中如何使用优化方法的例子可以在这里找到: 机器学习:使用梯度下降的 Python 线性回归估计器

总之,我们已经讨论了数据科学和机器学习中需要的基本数学和理论技能。有几门免费的在线课程会教你在数据科学中需要的必要的数学技能。作为一名数据科学家,一定要记住,数据科学的理论基础对于构建高效可靠的模型至关重要。

参考

  1. 在具有高度相关特征的数据集上训练机器学习模型
  2. 使用协方差矩阵图进行特征选择和降维
  3. 拉什卡、塞巴斯蒂安和瓦希德·米尔贾利利 Python 机器学习,第二版。帕克特出版社,2017 年。
  4. Benjamin O. Tayo,预测船只船员规模的机器学习模型https://github . com/bot 13956/ML _ Model _ for _ Predicting _ Ships _ Crew _ Size

Python 列表没有 Argmax 函数

原文:https://towardsdatascience.com/there-is-no-argmax-function-for-python-list-cd0659b05e49?source=collection_archive---------10-----------------------

有三种方法可以解决它

Photo by Talles Alves on Unsplash

亲爱的 Python 程序员们,

给定一个 Python 列表l = [50, 99, 67, 99, 48],如何找到列表的 argmax ?原来 Python list 没有内置的 argmax 函数!你不能只做argmax(l)max(l).index。我能想到的第一件事是将列表转换成一个 numpy 数组,或者 pandas DataFrame,或者甚至 Tensorflow tensor,如果你认为可以过度使用的话:

import numpy as np
l_np = np.asarray(l)
print(l_np.argmax())import pandas as pd
l_pd = pd.DataFrame({'l': l})
print(l_pd.idxmax())import tensorflow as tf
l_tf = tf.constant(l)
with tf.Session() as sess:
    print(sess.run(tf.argmax(l_tf)))

他们都返回1,就像他们应该的那样。如果多个项目达到最大值,函数将返回遇到的第一个项目。但是将一个对象转换成另一种数据类型感觉像作弊,而且还需要更多的执行时间。以下是几种修复方法:

1.传统 C 逻辑

构建一个 for 循环,手动检查每一个元素,它工作得非常好。但是,它由多行可读性不太好的代码组成。与下面讨论的替代方案相比,它还需要稍微多一点的计算时间。

index, max_val = -1, -1
for i in range(len(l)):
    if l[i] > max_val:
        index, max_val = i, l[i]
print(index)

Photo by Nikhil Mitra on Unsplash

2.用计数器枚举

我们可以利用 Python 中enumerate函数的内置计数器。注意max((x,i) for i,x in enumerate(l))[1]返回最后一个最大项的索引,但是可以通过

-max((x,-i) for i,x in enumerate(l))[1]

但这绝不是可读的。我们还可以通过使用zip来模仿enumerate函数,使其更具可读性:

max(zip(l, range(len(l))))[1]

Photo by Tomas Sobek on Unsplash

3.更改密钥

这可能是最可读的黑客。原来我们还是可以使用默认的max功能。但是我们没有将列表作为参数传递,而是将索引列表作为参数传递,并将一个函数作为“key”传递。该函数将索引映射到列表中相应的元素。

f = lambda i: l[i]
max(range(len(l)), key=f)

Photo by Silas Köhler on Unsplash

好了,Python 列表上执行 argmax 的三种方法。

相关文章

感谢您的阅读!如果您对 Python 感兴趣,请查看以下文章:

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## 使用交互式地图和动画可视化伦敦的自行车移动性

探索 Python 中的数据可视化工具

towardsdatascience.com](/visualizing-bike-mobility-in-london-using-interactive-maps-for-absolute-beginners-3b9f55ccb59)

原载于我的博客edenau . github . io

必须有 50 种方法来制作一个[编码]播放列表

原文:https://towardsdatascience.com/there-must-be-50-ways-to-make-a-coding-playlist-110451228b69?source=collection_archive---------21-----------------------

art by @marta.louzeiro

你只需要一首新歌,杰克
也许一些空气,克莱尔
这里有一些关于蜡的噩梦,马克斯
你只需要听这些

这是写给那些边听音乐边开夜车的程序员的博客。一篇关于将播放列表创建重新定义为集群问题的博客文章。最重要的是一篇关于理解制作这些“编码”播放列表的人的博文。

项目介绍

For reference, 123k minutes ≈ 25% of a Year

作为一名音乐消费者,我总是在寻找新的音乐。有了正确的配乐,编码就简单多了。问题是寻找新音乐依赖于探索周刊风格的播放列表和朋友的推荐。正是因为这个原因,我决定自己动手,有节奏地建立一些“编码”播放列表。

这些是我采取的步骤…

第一步:通过关键词抓取 Spotify 播放列表

正如你可能已经猜到的,创建播放列表的第一步是从 Spotify 上搜集播放列表集。这是通过获取一个 API 键并与 /search 端点交互来完成的。在这个上下文中,我们将搜索包含术语的播放列表:编码编程

这可以通过 python 包来实现, spotipy :

import os
from spotipy import Spotify
from spotipy.oauth2 import SpotifyClientCredentialscur_spotify = Spotify(
  client_credentials_manager = SpotifyClientCredentials(
    client_id=os.getenv("SPOTIFY_CLIENT_ID"), 
    client_secret=os.getenv("SPOTIFY_SECRET")
  )
)cur_playlists = []for search_term in "coding programming".split():
  cur_offset = 0

  while cur_offset < 10000:
    tmp_playlists = cur_spotify.search(
      q=search_term, offset=cur_offset,
      type='playlist', limit=50
    )["playlists"]["items"]

    if len(tmp_playlists) == 0 : break
    cur_playlists.extend(tmp_playlists)
    cur_offset += 50

一旦我们有了这些 ~10k 播放列表,我们将想要从其中提取曲目和艺术家的信息。这是通过循环遍历cur_playlists并调用user_playlist_tracks API 端点来完成的。与所有数据争论一样,会有一些缺失和无效的数据。此外,上面使用的cur_offset方案将不得不重复读取超过 100 首歌曲的播放列表(根据 API-hit 的歌曲限制)。

此时,我们基本上有了一个 dictionary 对象,播放列表映射到其中出现的曲目。从这个数据集中可以做出的最简单的播放列表是在所有“编码”播放列表中找到出现最频繁的曲目。或者在伪代码中,

# find 250 most frequent tracks among all the playlistsfrom collections import Counterall_tracks = [ cur_item 
  for cur_list in playlist_tracks.values() 
  for cur_item in cur_list 
]top_tracks = list(map(
  lambda cur_tuple: cur_tuple[0], 
  Counter(all_tracks).most_common(250)
))

虽然这在技术上可行,但 播放列表 与我们预期的质量相差甚远。虽然你可能会认为 Air、蠢朋克和 Bonobo 会浮到顶部,但我们实际上最终会有 Billie Eilish、汉斯·季默和 Magic Sword 这样的流行歌曲占据空间——前两首歌曲实际上已经被禁止的艺术家名单明确删除(对于这个播放列表)。

这就是我们新项目的切入点。问题的解决方案是:比莉·埃利什紧随倭黑猩猩而来,将播放列表中的艺术家分成流派。

步骤 2:使用 TF-IDF 扩展磁道数

构建流派播放列表的关键是认识到艺术家和使用 NLP 技术的播放列表之间存在相似性。我的意思是,播放列表(或文档)包含一个有序的曲目(或单词)列表。这意味着大多数的自然语言处理技术都适用于这个问题,并且给了我们一个框架来理解这些类型是如何被聚类的。

具体地,在来自步骤 1 的数据中存在生成通过曲目计数连接艺术家和播放列表的矩阵的信息(例如,播放列表#42 包含 16 首蠢朋克歌曲)。

Example table showing how playlists and artists populate a track-counts matrix

该表说明了播放列表群集固有的几个问题:

  1. 对数正态播放列表长度
  2. 艺术家频率之间的极端差异
  3. 矩阵稀疏性(即很少非零值)

这些问题通过在轨道计数矩阵上使用 TF-IDF 标度来解决。这里,TF-IDF 中的 TF 代表词频,而 IDF 代表逆文档频。对于计数矩阵中的每个单元格,TF 项根据艺术家在单个播放列表(内部播放列表)中的相对重要性进行缩放。然而,IDF 在所有播放列表(内部播放列表)中衡量艺术家的重要性。与简单的原始计数相比,这两种效应放大了艺术家和播放列表对流派的重要性。

结合播放列表聚类,术语频率(TF)术语降低了来自长播放列表的重要性提升。仅仅因为播放列表 7 比播放列表 4 多了10 倍的蠢朋克,并不意味着它应该多算十倍(对他们的朋克来说)。假设相对艺术家重要性呈对数正态分布,则使用的 TF 术语为:

TF = log( 1 +跟踪计数)

这个 TF 公式极大地减少了选择艺术家时附加音轨计数的影响。例如,log _ 10(100)= 2–少了 50 倍。增加的一项是保持 0 计数固定在 0(为了保持稀疏)。这种 TF 缩放的实际效果是,汉斯·季默的全长专辑不会把他推到顶峰。

虽然 TF 术语关注某个艺术家在单个播放列表中的重要性,但是逆文档频率(IDF)淡化了出现在多个播放列表中的艺术家的重要性。例如,蠢朋克可能出现在超过 20%的“编码”播放列表中。如果使用原始计数的话,蠢朋克肯定会是顶级的星团之一,而且几乎完全是纯的。这意味着这个群体将被蠢朋克所主导,其他艺术家的意义将仅仅是随机的噪音。

因此,IDF 这个术语允许将蠢朋克的重要性分成几个流派。在这些流派中,蠢朋克现在几乎和其他流派一样重要,比如说,德玛乌和汉斯·季默。与自然语言处理类似,这些过于普通的艺术家(如汉斯·季默、倭黑猩猩和蠢朋克)被视为停用词(如“the”、“is”和“cause”)。从数学上讲,我们对 IDF 的处理如下:

简单地说,IDF 是一个由c_minc_max限定的函数,它测量一个艺术家在不同播放列表中出现的频率。N(artist)等式是对给定艺术家出现多少非零条目的度量。因此,N_max是包含最频繁出现的艺术家的播放列表的数量。而N_min是一个阈值计数,用于移除只出现在1, 2, ..., (N_min-1)播放列表上的艺术家。

选择c_minc_max的能力让你在如何对待稀有艺术家和普通艺术家方面拥有相当大的灵活性。例如,如果是c_min = 0,那么最常用的词将被完全忽略,也就是说,它将是一个字面上的停用词。因为蠢朋克和汉斯·季默对我们很重要,所以我们将设置c_min = 1。下一个参数,c_max,是最罕见的艺术家从他们的计数中获得的额外权重。通过选择c_min = 1,值c_max = 2将导致稀有艺术家的每首曲目的价值是普通艺术家的两倍。

这个c_max变量是一个旋钮,我们将在下一步调优集群时使用它。在最终的中使用的值是c_max = 3

The effects of changing c_min and c_max on the IDF scalar

步骤 3:使用 NMF 聚类创建流派

抓取 Spotify 和缩放曲目计数可能很有趣,但这与数据科学相去甚远。我们现在要把我们所有的努力放在一起,以便从播放列表和组成它们的音轨中制作流派。这将使用非负矩阵分解( NMF )来找到从“编码”播放列表语料库中出现的构造块。

The reason for using NMF to cluster playlists is much like the work done by the Zitnik group on facial analysis. Akin to genres, these masks – that add together to create someone’s face – are themselves face-like and easy to interpret.

NMF——或非负矩阵分解——是一种线性代数技术,可用于聚类文档。顾名思义,它只是将矩阵一分为二:

T =宽高

而且,就像原来的轨迹计数矩阵( T )一样,W 和 H 内部只有非负值。这迫使体裁具有建设性,并避免破坏性干扰的存在。

对于我们的问题,T是一个曲目矩阵,它通过 TF-IDF 比例曲目计数将播放列表(行/条目)与艺术家(列/特征)联系起来。在经历 NMF 之后,我们剩下两个非负矩阵:WH。由于它们必须相乘才能近似地重新创建TWH在其外部维度上分别具有播放列表和艺术家。内在维度是从语料库中自然产生的原本潜在的体裁。他们就是我们一直在寻找的星团!

The goal of NMF clustering is to separate a matrix in two and find the latent clusters that separate the data

然而,构建和标记这些集群的过程与其说是科学,不如说是艺术。因为这是一个无人监督的学习问题,你能应用的唯一真正的度量是人类的直觉。即便如此,模式确实开始出现。使用流行的网站来贴标签(事后)—一次贴一个标签——给这个流派的内容增加了一些可信度。例如,blink-182 和 Sum 41 确实出现在“流行朋克群中,而巴赫和贝多芬安全地驻留在“古典群中。

现在缺少的是如何从这些播放列表( W )和艺术家( H )矩阵回到不同流派的顶级曲目选择的描述。在进入这一关键步骤之前,讨论一下在这一步骤中人为干预的位置是有益的。

第一点是,《vibrazebra.com》上使用的大约 30 个流派来自 75 个集群。这意味着我们丢弃了超过一半的集群!这可能是因为我没有认识到一些重要的流派,但这也是对杂乱数据进行聚类的必然结果。我们的数据集中有一些噪声,必须以某种方式将其聚类出来。

要说明的另一点是关于建模者为了改善结果而需要调整的参数。它们是:c_max和集群的数量——n_clusters——假设c_min为 1。如前所述,我们使用了c_max = 3,有 75 个集群。显然,这个n_clusters决定了音乐类型变得有多粗糙。例如,蠢朋克会和语料库中的每一位电子艺术家归为一类吗(对少数人来说n_clusters)还是基本上引领一个完整的流派(对许多人来说n_clusters)。

对于最终用户来说,有趣的一点是c_maxn_clusters具有非线性关系。当改变n_clusters时,必须根据经验缩放c_max以保持相同的(无监督的)性能水平。

步骤 4:构建代表性播放列表

因此,我们剔除了 Spotify,创建了一个将播放列表与艺术家联系起来的矩阵,并将该矩阵分解为两部分,以发现潜在的流派。现在剩下的就是退出代表这些流派的曲目。这将利用一些漫不经心的方式从HW矩阵中提取信息,以及一些有偏见的方法来定义什么是好的播放列表。举例来说,你就是这样得到下面这个标志性的编码者的播放列表的(现在没有了汉斯·季默、比莉·埃利什和德玛乌):

Now that’s what I call coding music! (Volume 12)

描述播放列表生成的起点是来自步骤 1 的原始的、天真的混合播放列表。我们很快讨论了构建代表性播放列表的最简单方法是如何找到在所有播放列表中出现频率最高的曲目。现在,我们只需要找到一种方法来概括和确定这种情况在每个集群中发生的范围——使用来自HW因式分解矩阵的数据。

原始播放列表和聚类播放列表的主要区别在于,现在曲目的权重取决于艺术家和播放列表对流派的相对贡献。因此,代替每个轨道的原始计数,将使用一些正的浮点值,将几个分量相乘。虽然对读者来说这可能是显而易见的,但是现在详细说明以下内容是有用的:每个音轨与一个艺术家列表( A )和一个播放列表列表( P )相关联。利用这一知识,我们提出了以下用于给流派曲目评分的方法。

上面的第一个等式只是对上一段的重述:一首曲目的分数是基于其艺术家(A)和播放列表(P)对流派(j)的相对重要性的合成值。这里,艺术家的成分, R ,只是在 H 中的给定音轨的艺术家中选择最大权重成分——对于一个流派。例如,当专注于电子音乐时,这可能会选择蠢朋克而不是法瑞尔·威廉姆斯作为 2013 年的热门歌曲《走运》。

另一方面,播放列表的组成部分 L 更符合最初的天真标准。这实际上意味着,我们基本上仍然在计算一首歌曲有多少个播放列表。关键区别在于,总和现在考虑了播放列表在流派上的相对重要性( W )以及播放列表有多少关注者(参见**S_i**)。让我们对**S_i**的描述更具体一点,我们希望它是一个基于播放列表的关注者数量来衡量重要性的因素——只是非常缓慢,从 1 开始。

在描述使用这个乐谱制作播放列表的实际过程之前,有必要解释一下出现在上述等式中 HW 上方的~。这些波浪符号(或旋转符号)意味着这些矩阵中的组件已经过规范化和重新缩放。为了清楚起见,这样做不是使用它们的原始值或它们的对数变换——因为根据经验发现两者都产生相当一般的播放列表。相反,每个矩阵中的类型向量首先被归一化,使得每个值都在范围[0,1]内。然后,每个值都被提升到某个幂:α代表艺术家,ρ代表播放列表。

我们的α和ρ值分别是3/42/3。请注意,这两个值都小于 1。这是因为范围[0,1]中的数字对于小于 1 的幂会变大(例如0.1 ^ 0.1 ≈ 0.8)。实际上,这意味着使用更小的功率为越来越多不知名的播放列表/艺术家铺平了道路。对于我们的问题,这也证明了ρ小于α的原因:我们想要基于许多播放列表聚集列表,但是我们真的只想关注与流派最相关的艺术家。

有了所有的数字,我们现在可以做出定性的决定,让播放列表变得值得一听。首先要考虑的是两者的长度:整个播放列表和其中的歌曲。在这个练习中,我们选择制作播放列表 4 小时 ,并且只包含 2 到 12 分钟的歌曲。接下来,我们想防止任何一个艺术家完全控制一个群体。因此,我们将一位艺术家创作的歌曲数量限制为 3 首!

最后一个有点偏颇的决定是让播放列表按顺序播放。根据个人经验,这意味着一个艺术家永远不应该有两首歌背对背出现(或者甚至在另一首歌的两首歌内)。这一点在下面的 downtempo 播放列表中得到了强调,其中:Air、Bonobo 和 Gramatik 在列表顺序中被涂掉了。需要这样做的原因是因为聚类算法可能会对艺术家进行分层,导致自然混合的机会减少,从而加强已经发生的生日悖论行为。

[## 唐顿堡——这就是我所说的编码音乐

open.spotify.com](https://open.spotify.com/playlist/2v9EqSueMu980UezpJ3J8t?si=JMPfUzttQgiLc8G6UcoBDA)

在进入探索创建这些播放列表的用户的部分之前,快速深入了解上一段中使用的重新排序算法是有用的。这种算法通过在曲目上不断向前和向后推送来防止艺术家在播放列表中聚集在一起。这种非确定性的方法在速度上可能不是最佳的,但确实产生了符合我们对聚集的限制的播放列表顺序——同时显著地限制了对初始顺序的扭曲。

第五步:了解 Spotify 上的编码员

在这个阶段,我们的功能已经完成:我们已经为所有的“编码”播放列表收集了 Spotify,并为 30 个不同的流派制作了一个代表性的播放列表。我们还没有问的一个问题是:为什么?为什么有人专门为编码制作播放列表?为什么他们选择某些艺术家作为他们的编程灵感?更重要的是,为什么我把变成了这个,而不是只听最初 Spotify 搜索中的热门播放列表?

除了亲自欣赏来自这些流派播放列表的音乐——并实际学习一些新歌——我认为在这次搜索中有真正的人类学数据。例如,编码是一个目前已经过时的词吗——是社交网络和 deadmau5 主宰的时代的残余吗?或者更一般地说,这些编码者是我们认为的那样吗:痴迷于“ chill- ”前缀音乐流派并喜欢听lofi hip hop radio-beats to relax/study to的千禧一代 redditors?

谁是用户这一更普遍的问题可能最好用下面的时间表来表示。投射一点,我相信这些用户:在中学 Rec 夜听林肯公园(流行朋克),在高中让花园之州真正改变他们的生活(Chillout),在大学期间实验天空中的爆炸( Ambient )。如果这种说法成立,那么用户似乎是在 2010 年左右(独立音乐)进入成年期,开始怀旧,其中一些在 2012 年被淘汰(Chillwave),到 Spotify 流行时,基本上已经放弃了歌词音乐( Chillhop )。

A violin plot showing coding music trends – or – what to project when you’re projecting

在另一条时间线上,同样的用户可能在他们上大学的时候就已经尝试过 house 了(蠢朋克和拉塔特)。想和杜布斯普(德莫和史奇雷克斯)一起继续派对。无法摆脱他们的固定,因为他们转向鼓和低音。并最终达到一种永久的 EDM 状态——被电雏菊嘉年华的灯光惊呆了。

虽然没有更多的人口统计数据,但这显然只是纯粹的猜测和传闻。然而,它确实引出了这样一个问题:制作这些编码播放列表的人是谁?这可以通过调查上述图的音轨部分得到部分解决。正如你所看到的,这种类型在 2010 年左右真正兴起——这一年《社交网络》问世——并一直保持到 2015 年的《机器人先生》。因此,这种类型很可能与千禧年科技文化有关。

然而,在我们对这些数字游牧民族的研究中,一个局限是我们对 Spotify 播放列表搜索的依赖。如上图所示,Spotify 直到 2014 年左右才成为占主导地位的音乐平台。因此,我们的许多类型都来自于史前时代,当时人们在各种服务中分散开来。因此,这些民间传说只是人们从故国带来的东西,无论是来自 Songza、Pandora、Grooveshark、iTunes 还是 SoundCloud。

虽然我们可能永远无法确切知道这些千禧一代的编码者是谁,但我们可以肯定地说,他们的音乐有许多共同的核心特征:重复的节拍,数字乐器,以及普遍缺乏歌词——这是代码使音乐成为可能。

结束语

这个项目的目标是:使用聚类技术创建流派播放列表。特别是,我们专注于通过搜索 Spotify 来“编码”播放列表而找到的播放列表语料库。为了构建在 vibrazebra 上发现的 30 个集群,我们随后使用了 NMF 集群和定制的 TF-IDF 轨道计数缩放。在找到带有 NMF 的聚类后,我们标记了这些组,并使用特殊的曲目选择过程构建了代表性的播放列表。

为了给这个项目画上一个圆满的句号,我们在聚类过程之后进行了一个快速调查,看看到底是谁制作了这些“编码”播放列表。然后我们做了一些总结性发言。现在,…

时光流逝,歌曲结束,我想我还有更多的话要说。

——时间(平克·弗洛伊德)

Common words used in “coding” playlist titles

站点 代码 通话 spotify

帮助我在方找到工作的资源

原文:https://towardsdatascience.com/these-are-all-the-resources-that-help-me-land-a-fang-job-452341dd6bed?source=collection_archive---------1-----------------------

Photo by Sharon McCutcheon on Unsplash

(我的博客里也有这个帖子)

大约在去年的同一时间,我开始准备像 FAANG 这样的大型科技公司的面试。在我的一篇帖子中,我谈到了 Leetcode 在获得这份工作中的作用。我认为把我用来实现这一目标的所有资源列出来会更有帮助。

在方的面试中,系统设计变得越来越重要,因为雇主不仅想要一个程序员,还想要一个知道如何构建可扩展系统的工程师。候选人应该了解系统的不同方面,如存储、内存、网络等资源。候选人还应该谈论在做特定决定时的权衡。搜罗系统设计面试是目前为止最好的系统设计资料。它涵盖了相当多的常见设计主题和应用理论的例子。这门课程对初学者很有用。

这本书实际上打开了大型科技公司面试的大门。几年前我第一次接受方的电话采访时,买了这本书。它帮助我了解了面试流程,从人力资源筛选到在线评估、电话面试到现场面试。流程因公司而异。阅读第一章给了我很好的期待,因为它的细节非常棒。

这本书不仅演示了面试过程,而且还提供了技术编码问题类型的良好覆盖面。如果你已经学习了基本的数据结构和算法,这本书非常适合你去体验一下大型技术面试中的编码问题。我最喜欢的是作者给了你一些提示,告诉你当你陷入困境时应该如何处理这个问题。此外,你应该如何在面试中得到澄清也很重要。

数据结构和算法部分也很棒。更好的是,它对发布在 github 上的问题提供了有效的解决方案。这对于系统地逐主题学习非常方便和有益。

如果缺乏基础的算法和数据结构,可以从网络课程开始学习。就我个人而言,我更喜欢视频之类的视觉材料。所以我总是从免费的网络课程开始。但是一旦我想深入研究,我将不得不使用算法算法是一个很好的参考,它给了你在面试中将要使用的算法的深度和广度。

根据公司或职位级别的不同,可能会有一轮面向对象的设计面试。即使没有专门测试 OOD 的回合,也可以从你在编码面试时写的代码中体现出来。它也能显示你有多优秀。

探索面向对象设计面试从对象设计的角度来看,有很多构建系统的例子。像“建立一个 LinkedIn”和“建立一个脸书”这样的例子会让你知道需要什么对象以及对象之间的关系。将本课程与探索系统设计面试结合起来,可以帮助你对构建系统有一个完整的了解。因此,你可能会在面试中得到一个更完整的答案。这些课程的一个优势是作者不断更新内容。

如果你完全是设计模式的新手,Head First Design Patterns 是一个很好的介绍。这提供了非常直接的例子,有助于快速掌握常见设计模式的概念。不同模式的覆盖率也很高。这本书可以指导你根据需求选择合适的模式。这可以为你在面试时谈论你选择的模式加分。

著名的设计模式:可重用面向对象软件的元素是一本帮助你编写模块化可重用源代码的经典设计模式书。

  • 白板前,像在真正的面试中一样说话

这是你很容易忽略的一件事。在真正的面试中,能够表达你的想法是非常重要的。这是面试官寻找的关键能力。我买了这个白板,开始在一个哥们面前讲解解决方案。我很惊讶事情会变得如此糟糕,即使我已经有了清晰的解决方案。在白板前练习肯定能提高面试技巧。你会发现这在系统设计面试中更重要。我个人更喜欢壁挂板,而不是立式板,因为壁挂墙更类似于你将得到的东西。

  • 耐心和决心

不会一帆风顺的。如果拒绝来了,不一定说明你不好。请人力资源部门反馈原因。继续申请。我去过那里。最终,你需要的只是耐心和决心。这是最重要的一块。

以前的帖子:

系统设计面试:如何设计一个系统来处理长时间运行的作业

SQL(关系数据库)还是 NoSQL?the FAANG 系统设计面试

我关于 FAANG 访谈的帖子

我关于金融和科技的帖子

从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅

全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中

全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据

全栈开发教程:在 Angular SPA 上可视化交易数据

强化学习:Q 学习简介

这些是你能想到的自然语言处理中最简单的数据扩充技术——它们确实有效。

原文:https://towardsdatascience.com/these-are-the-easiest-data-augmentation-techniques-in-natural-language-processing-you-can-think-of-88e393fd610?source=collection_archive---------10-----------------------

简单的文本编辑技术可以为小型数据集带来巨大的性能提升。

Augmentation operations for NLP proposed in [this paper]. SR=synonym replacement, RI=random insertion, RS=random swap, RD=random deletion. The Github repository for these techniques can be found [here**]**.

数据增强通常用于计算机视觉。在 vision 中,您几乎可以翻转、旋转或镜像图像,而不会有更改原始标签的风险。然而,在自然语言处理(NLP)中,情况完全不同。改变一个单词有可能改变整个句子的意思。因此,我们无法为数据扩充制定简单的规则。或者我们可以吗?

我将向您展示用于提升文本分类任务性能的EDA:EasyDATAA增强技术(有关快速实现,请参见 EDA Github 库)。EDA 由四个简单的操作组成,它们在防止过度拟合和帮助训练更健壮的模型方面做得非常好。他们在这里:

  1. 同义词替换:从句子中随机选择 n 个不是停用词的单词。用随机选择的同义词替换这些单词。
  2. 随机插入:在不是停用词的句子中,找到随机词的随机同义词。将同义词插入句子中任意位置。这样做 n 次。
  3. 随机互换:随机选择句子中的两个单词,互换位置。这样做 n 次。
  4. 随机删除:以概率 p 随机删除句子中的每个单词。

这些技术真的有用吗?令人惊讶的是,是的!虽然一些生成的句子可能有点无意义,但在数据集中引入一定量的噪声对于训练更健壮的模型非常有帮助,特别是在较小的数据集上训练时。如【本文】所示,在 5 个基准文本分类任务上,使用 EDA 在几乎所有数据集规模上都优于常规训练,并且在少量数据上训练时做得更好。平均而言,在仅使用可用训练集的 50% 时,使用 EDA 训练递归神经网络(RNN)实现了与使用所有可用数据的正常训练相同的准确性:

Performance on text classification tasks with respect to percent of dataset used for training. Using EDA (easy data augmentation) operations significantly outperforms normal training on small datasets.

EDA 保存了扩充句的真实标签吗?

我知道你在想。你真的可以只做这些增强操作,同时保持增强句子的真实标签吗?让我们用可视化的方法来找出…

因此,你在正面和负面产品评论上训练 RNN,然后在常规和增强句子上运行它,提取神经网络的最后一层,并使用 tSNE 获得潜在空间可视化:

Latent space visualization of original and augmented sentences in the Pro-Con dataset.

事实证明,扩充句子的潜在空间表征紧紧围绕着原始句子的潜在空间表征!这表明生成的扩充句子很可能保持与它们的原始句子相同的标签。

这些操作都管用吗?

现在,让我们来看看每种数据扩充技术各自的效果。同义词替换有意义,但是其他三个操作实际上有什么作用吗?我们可以做一个测试,将每种技术分离出来,并在不同程度上使用它们,α是一个参数,大致意思是“句子中被改变的单词的百分比”:

Average performance gain of EDA operations over five text classification tasks for different training set sizes. The α parameter roughly means “percent of words in sentence changed by each augmentation.” SR: synonym replacement. RI: random insertion. RS: random swap. RD: random deletion.

您可以看到,对于小型数据集,性能提升特别大,约为 2–3%,对于大型数据集,性能提升不大(约为 1%)。然而,所有技术,如果在合理的增强参数下使用(不要改变句子中超过四分之一的单词),可以帮助训练更鲁棒的模型。

放大多少?

最后,我们应该为真实句子生成多少个扩充句子?这个问题的答案取决于数据集的大小。如果你只有一个小的数据集,过度拟合的可能性更大,所以你可以生成大量的扩充句子。对于较大的数据集,添加过多的扩充数据可能没有帮助,因为当存在大量真实数据时,您的模型可能已经能够进行概化。该图显示了每个原始句子生成的扩充句子数量方面的性能提升:

Average performance gain of EDA across five text classification tasks for various training set sizes. n_aug is the number of generated augmented sentences per original sentence.

现在怎么办?

我们已经证明,简单的数据扩充操作可以显著提高文本分类的性能。如果您正在一个小数据集上训练一个文本分类器,并且正在寻找一种简单的方法来获得更好的性能,请随意在您的模型中实现这些操作,或者从 Github 中提取 EDA 的代码。你可以在这篇文章中找到更多的细节。

[## jasonwei20/eda_nlp

用于提高文本分类任务性能的简单数据扩充技术。- jasonwei20/eda_nlp

github.com](https://github.com/jasonwei20/eda_nlp) [## EDA:提高文本分类性能的简单数据扩充技术

我们提出 EDA:简单的数据扩充技术,用于提高文本分类任务的性能。EDA 包括…

arxiv.org](https://arxiv.org/abs/1901.11196)

欢迎在我的【个人网站】上阅读我的作品,并给我发邮件。祝你好运!

它们都失败了:所有新数据科学家最容易陷入的陷阱

原文:https://towardsdatascience.com/they-all-fall-down-the-most-common-pitfall-all-new-data-scientists-fall-for-206bee548735?source=collection_archive---------20-----------------------

几年前,面向数据科学家的专门培训课程很少,行业往往由来自三个共同领域(计算机科学、物理科学和数学)的人主导,他们通过自学转向了数据科学。

快进到现在,快速搜索一下谷歌就会发现各种各样的专业课程。微软有自己的学习路线,使用 T2 的 edX 课程,一些网站提供为期一年的培训(收费),并“保证”你在培训结束后有一份工作,最重要的是许多大学都提供为期一年的数据科学硕士课程。

Photo by Magic Keegan on Unsplash

有问题吗?

当然不是!事实上,我认为它可能非常好。有些培训课程不会给你提供真正好的体验,纯粹是利用对数据科学家的需求,但公认的学术和行业机构正在推广和开发课程,这意味着初露头角的数据科学家进入该领域的压力较小。

感觉有个“但是”要来了

然而,这些课程都很短。看看 most 的课程内容,会发现教授的技能范围令人印象深刻,但他们只有一年的时间来教你一名数据科学家的所有技能(通常是九个领域和一个为期三个月的项目),这意味着尽管你接触并学习了一系列技能,但只有很短的时间来积累经验。

我还发现,有一个领域似乎没有被涵盖,那就是申请人在技术面试中一直没有注意到的领域。我的面试技巧不是让申请人背诵数学或算法如何工作的技术细节,因为这只会让你俩成为对同一件事最了解的人,也可能是运气。我有一个糟糕的长期记忆,这也缓和了我的情绪。问我两年前用过的一个统计数据,我不会背诵数学,但我会知道它的作用以及去哪里学习更多。这很适合我,也适合你希望仔细检查和查找你的计算的任何关键应用程序(没有人会根据某人的记忆将火箭送入太空)。基本上,给一个足够聪明的人足够的时间,他们可以学习背诵给你,但我认为这并不倾向于测试什么是一个好的数据科学家。

优秀数据科学家的特质是:

  1. 至少在高层次上了解数据科学中存在什么。
  2. 能够向非专家解释?
  3. 出色的问题解决能力。

这是我在面试时试图测试的三个方面。但是我说的这些区域是什么意思呢?

Photo by Kristopher Roller on Unsplash

1.知道存在什么

“你这是做了什么?”

“哦,我们想计算这个的传播,所以我创建了一些代码来引导一个答案。好诶?”

“你知道这个有一行计算吗?”

这一点我在同行评审工作时见过一次又一次。当工具已经存在时,花费了大量的时间和精力来重新发明轮子。仅仅掌握最新的技术并知道它可以用来做什么,可能是你大脑档案柜中的一个重要工具,而不是详细了解每一个工具(如果你想有时间做其他事情,这实际上是不可能的)。

Photo by Priscilla Du Preez on Unsplash

2.解释事情

最容易与之讨论数据科学的人是另一位数据科学家。他们往往很快理解你在做什么,给你建设性的批评。他们倾向于理解,在构建最终解决方案之前,您将花费 80%的时间来获取、理解和探索数据。谁不会呢?一般来说,付钱给你的人。高管、客户和顾客往往不是数据科学专家,因此你需要能够以更容易理解的方式解释事情,并传达重要信息。

这有时是一个学术背景很高的人(我可以保证这一点)在没有实践的情况下也能应付的。请某人解释一个神经网络,使用“特征”和“反向传播”这些词而不解释它们是不会有帮助的,而且会让人们感到难堪(人们不喜欢觉得自己很愚蠢)。

Photo by NeONBRAND on Unsplash

3.问题解决

数据科学在很大程度上依赖于如何处理给你的问题,让你得到满意的解决方案。你看着数据,你理解它的来源和意义,然后你看着创造一个解决方案,充分涵盖你已经设置的问题(理解确切的问题本身是另一种艺术)。

对我来说,这种以可理解和有条不紊的方式解决问题的能力至关重要。通过这样做,你可以在团队中与志同道合的人更好地合作,你会更好地完成任务。要做到这一点,最好的开始方式就是问问题,而且要问很多问题!

太好了。那么陷阱是什么呢?

假设我是你的新老板,我告诉你,我已经检查了我们的数据,我们建立了一个模型,但它不起作用,这就是为什么他们雇用你来修复它。你是做什么的?

几乎每个人都会浏览给他们的代码并修改模型,可能会在这里或那里调整一些位,同时阅读所有的评论。这是新的数据科学家容易摔倒的地方,他们沉迷于代码和定义模型的最后几行,但他们忽略了最重要的信息来源之一,老板。你可以问他们各种各样的问题,关于他们做了什么和覆盖了什么,如果你问得足够多,也许你会发现他们使用的数据不是他们应该使用的。

这是一个陷阱,新的数据科学家总是要解决数据中有答案的问题。这意味着他们从不考虑他们使用的数据是否正确。在我设置的问题中,我将使用两个数据集,一个用于生产,另一个用于不同的培训。这应该代表这样一个事实,即他们的数据来自不同的领域(可能一个来自向所有员工发出的问卷,另一个来自实际客户),并且不具有代表性,这就是为什么该模型在开发中有效,但在生产中无效。

听起来难以置信?我在现实中不止一次发现这一点,因为在开始时没有数据可用,他们收集任何旧数据,并且以一种不受控制的方式,这意味着它永远不能代表最终的真实数据。

拿走

该数据是否适合该工作?

如果您是数据科学的新手,只需考虑有时您的数据来自哪里,以及它是否是解决问题的正确数据。如果你参加了任何较新的数据科学课程,这可能是你以前从未想过的问题,它将让你在同等经验的同龄人中领先一步。

对任何事情都要提问,甚至对人也要提问。听起来很傻,但是你自己想过这个问题吗?

注:这当然是我自己的看法,有很多流派。仅仅因为这是我发现的工作,并不意味着这是唯一的解决方案或最好的一个。

我学到的关于随机森林机器学习算法的东西

原文:https://towardsdatascience.com/things-i-learned-about-random-forest-machine-learning-algorithm-346554fba37c?source=collection_archive---------25-----------------------

第一课概述:来自 Fast.ai 的机器学习课程随机森林介绍

Forest in Autumn (Image by Valentin Sabau from Pixabay)

几个月前,我在悉尼参加了一个聚会,会上, fast.ai 向我介绍了一个在线机器学习课程。那时我从未注意过它。本周,在参加一个卡格尔竞赛,寻找提高分数的方法时,我又碰到了这个课程。我决定试一试。

这是我从第一堂课中学到的东西,这是一个 1 小时 17 分钟的关于 随机森林 介绍的视频。

虽然讲座的主题是随机森林,但 Jeremy(讲师)提供了一些一般信息以及使用 Jupyter 笔记本的提示和技巧。

Laptop Screen with code (Photo by Clément H on Unsplash)

杰里米谈到的一些重要的事情是,数据科学不等同于软件工程。在数据科学中,我们建立模型的原型。虽然软件工程有自己的一套实践,但是数据科学也有自己的一套最佳实践。

模型构建和原型制作需要一个交互式的环境,并且是一个迭代的过程。我们建立一个模型。然后,我们采取措施改善它。重复,直到我们对结果满意为止。

随机森林

Photo of Forest (Photo by Sebastian Unrau on Unsplash)

我听说过随机森林这个术语,我知道它是现有的机器学习技术之一,但说实话,我从未费心去了解更多关于它的知识。相反,我总是渴望了解更多关于深度学习技术的知识。

从这个讲座中,我了解到随机森林确实很牛逼。

它就像一种通用的机器学习技术,可用于回归和分类目的。这意味着你可以使用随机森林来预测股票价格,并对给定的医疗数据样本进行分类。

一般来说,随机森林模型不会过拟合,即使它过拟合,也很容易阻止它过拟合。

随机森林模型不需要单独的验证集。

随机森林只有很少的统计假设。它既不假设您的数据是正态分布的,也不假设关系是线性的。

它只需要很少的特征工程。

因此,如果你是机器学习的新手,这可能是一个很好的起点。

其他概念

维数灾难是一个概念,数据的特征越多,数据点就越分散。这意味着两点之间的距离意义要小得多。

杰里米保证,在实践中,情况并非如此,事实上,你的数据拥有的特征越多,就越有利于训练模型。

没有免费的午餐定理是一个概念,没有一个模型可以完美地适用于任何类型的数据。

提示和技巧

Little girl doing a magic trick (Photo by Paige Cody on Unsplash)

  1. 你可以通过包含来痛击 Jupyter 笔记本中的命令!在命令面前。
!ls
!mkdir new_dr

2.Python 3.6 中追加字符串的新方法。

name = 'Sabina'
print(f'Hello {name}')no_of_new_msg = 11
print(f'Hello {name}, you have {no_of_new_msg} new messages')

3.不用离开 Jupyter 笔记本就可以了解 python 函数。用在函数名前获取其文档。

from sklearn.ensemble import RandomForestClassifier?RandomForestClassifier.fit()

4.如果想看源代码,可以用 double 在函数名前面。

from sklearn.ensemble import RandomForestClassifier??RandomForestClassifier.fit()

5.使用 to_feather 方法保存处理过的数据集,将数据集以其存储在 RAM 中的格式保存到磁盘中。您可以使用 read_feather 方法从保存的文件中读回数据。注意,为了使用这些方法,你需要安装 羽毛格式 库。

import pandasdf = pd.DataFrame()
df.to_feather('filename')saved_df= pd.read_feather('filename')

如果你有兴趣深入这个话题,这里有一个到讲座视频的链接。

请在下面留下你的想法。如果你确实想去看看这门课程,请告诉我你是怎么去的。

点击这里 阅读我其他关于 AI/机器学习的帖子。

以下是该主题的一些进一步阅读材料:

[## 面向程序员的深度学习——36 小时免费课程

点按视频右下角的方块以全屏观看。有关本课的更多信息,请访问…

course18.fast.ai](http://course18.fast.ai/lessonsml1/lesson1.html) [## 了解随机森林

该算法如何工作以及为什么如此有效

towardsdatascience.com](/understanding-random-forest-58381e0602d2)

快速高效地分析大型复杂数据集的秘诀是什么?约束。

原文:https://towardsdatascience.com/things-i-learned-in-my-phd-1-productive-data-analysis-through-constraint-4bc28de8b149?source=collection_archive---------23-----------------------

TL:DR:有时候你有太多的数据,你可能会浪费几个小时去探索,而没有回答重要的问题。我分享了关于如何通过约束自己来有效地分析大型复杂数据集的 5 个技巧。

The joys and stresses of too much data. Photo is me!

如今,研究人员经常能接触到大量数据。你可能正在分析有数百个变量和数万名受访者的欧洲社会调查。或者你自己收集了大量的数据;你可以做一项研究,参与者做大量的测试,给你留下每个人大量的数据。

你如何着手分析这美丽的混乱?

好吧,我来告诉你什么 要做:

一头扎进去,开始关联、绘图和构建多层模型,然后意识到你可能必须控制一些变量,然后你得到一个结果,但它会随着协变量 B 和 C 而消失,但不是当你也添加 A 时,然后你发现一些看似稳健的东西,但你现在已经测试了 15 种东西,所以可能是假阳性,所以你了解交叉验证,我到底在这里做什么,什么时候变成星期五了?!?

但是说真的,有时候我们的数据比我们知道的要多。还有更糟糕的问题,我承认,但这一直是我读博期间的一个问题。我花了一整天的时间在大数据集中挖掘。抛开 p-hacking 的问题(我通常会尝试验证在新数据集上发现的任何结果,您也应该这样!),这真的能吃进你的时间。

当你的目标是“从里到外了解数据”时,你也可能会陷入这种困境。我们经常听到统计学家建议我们做更多的探索性数据分析,绘制我们的数据等等。这很有价值,但没必要了解欧洲社会调查的每一个角落。看到一个模型如何被 10 个不同的与因变量几乎没有关系的协变量所影响通常是没有意义的。你必须在某个地方划清界限,说“够了”!

Graph by the author

我非常支持这样一种观点,即对我们选择的约束可以是一种解放。如果这听起来自相矛盾,这些伟大的文章[ 这里这里将解释它。我发现,在数据方面,选项越多并不总是越好。

解决方法

1。被问题驱动 在看你的数据之前,决定你的主要问题是什么。这些是你将要开始回答的问题,然后你会停下来(至少直到你写完论文/章节)。有哪些问题一旦得到解答就可以发表?不是太愤世嫉俗,但在学术界,论文是游戏的名字。论文通常不是装订在一起的有趣观察的集合。他们很专注,你也应该如此。

以令人满意的方式(即通过检查结果的稳健性,排除替代解释)完成回答一个纸张大小的问题所需的所有分析,然后停止。数据中的所有其他问题都不重要或不太重要。你可以随时回来找他们。

2。与同事或实验室成员讨论数据 通过你的数据和分析与他们交谈会在你的头脑中澄清它。通过向他人解释来加深理解的想法通常被称为费曼技巧,我是它的忠实粉丝。他们也许能够建议数据中什么是有趣的,什么是不有趣的。

记住,你是在努力创造对你的领域有价值的知识。因此,询问该领域的一些成员是否认为你的分析有价值是有意义的。

3。详细记录你所做的尝试 有这么多的 t 检验和回归模型,你可能会忘记你之前做过的一些分析,然后再次运行它!此外,有时模型不会单独产生洞察力,而是与其他模型结合使用。

比如你运行模型 A,预测器 A1 显示一个你不理解的效果。所以你可以看到 A1 是否与其他一些东西相关,这也许可以解释它。你建造了 B 型车和尤利卡!现在记录你做了什么。在进入下一个测试之前,解释每一个测试。不要不管三七二十一就去做测试,而不去想它们意味着什么。为了好玩而运行测试是发现假阳性的好方法。如果你做笔记,并在过程中解释发生了什么,那么每一次测试都会真正教会你一些关于数据的东西。

4。给分析设定一个时间限制 给自己设定一个完成分析的时间。截止日期,即使是自己设定的,也有助于理清思路。有几年时间读博士不是浪费时间的借口。过了这段时间没有完成的数据将不得不等待另一天。如果你错过了一些重要的东西,这没什么大不了的,因为你的主管/同事/最终论文的评审员会找到他们。当你有更多的时间时,你甚至可以回到数据集,花几天时间研究它。这也具有返回到刷新的数据的优点。给自己一个时间限制。不要只是悠闲地在数据中徘徊。

5。预注册 以一种正式的方式约束你要做的分析。在看数据之前,写下你要做的分析。Aspredicted 是一个很好的工具,可以帮助你做到这一点。预注册还有很多其他的原因:谷歌一下,阅读这篇文章,或者向当地的开放科学方法警察询问更多信息(如果你在曼彻斯特大学,那很可能就是我!).

结论

数据是美丽的,许多数据是崇高的,但要警惕陷阱。希望我学到的教训对你有用!和我所有的博客帖子一样,如果其他人指出愚蠢的论点、拼写错误或说了我认为对其他人有价值的话,我会更新它。干杯!

如果你喜欢这篇文章,请在 Twitter 上关注我

他们在 Python MOOCs 介绍数据科学中没有(但应该)涉及的内容

原文:https://towardsdatascience.com/things-they-dont-but-should-cover-in-intro-data-science-with-python-moocs-c28550bb6c27?source=collection_archive---------19-----------------------

如果你正在读这篇文章,你可能已经上过一些在线课程,(有时被称为 MOOC),题目听起来像是“Python 数据科学导论”这些课程中有一些东西,是这些课程中没有涵盖的,我认为应该涵盖。

在大多数课程中,你要么被告知下载 Anaconda,要么演示如何下载。然后他们会讲解使用 Jupyter 笔记本的基本知识,然后向您展示如何使用 pandas/numpy/sk learn/matplotlib 的组合。虽然这一切都很好(这些是数据科学家的基本技能),但入门课程中缺少一些东西,这些东西会使您的数据科学项目更干净、更成熟、更专业。

管理您的环境和安装软件包

如果你想做多个项目,你必须关心环境。假设你有两个项目,都需要熊猫和 sklearn,只有一个需要 keras。第一个项目需要 pandas(版本 0.24.2),第二个项目需要 pandas(版本 0.23.1)。使用 keras 的项目必须使用 Python 3.6,但另一个项目必须使用 Python 3.5。一个环境(“虚拟环境”的缩写)将帮助您管理这些依赖关系(依赖关系是其他包所依赖的包)。

首先让我们创造一个环境。我们将在 anaconda navigator 中通过单击 Environments 选项卡中的“Create”按钮来实现这一点。

接下来,选择您想要使用的 python(和/或 R)版本,并为您的环境选择一个名称,我选择了“test _ enviornment”

你现在有两个环境,一个叫 base,你一直都有。另一个是您刚刚创建的。现在要安装一个包,你需要进入命令行。要在特定的环境中安装软件包,您需要首先进入那个环境。这可以从 Anaconda Navigator gui 中完成,但是能够从命令行控制您的环境是非常有用的。使用“conda activate[environment-name]”切换到新环境。现在,您应该在命令提示符的括号中看到您的环境的名称。

现在要在这个环境中安装一个特定版本的包,我们需要使用 pip。Pip 代表“pip 安装包”,可以从命令行使用。键入“pip install pandas==0.24.2”来安装 pandas 版本 0.24.2。

使用 API

每个数据科学项目都需要数据。在我见过的大多数数据科学 MOOCs 入门课程中,你会得到一个 csv,在这个 CSV 中,你用熊猫读取你的数据。然后你继续你的项目。在现实世界中,大多数数据不会以 csv 的形式提供给你。API 允许您从某个来源请求数据。我将带你了解如何从打开电影数据库发出请求。

首先从 OMDb 请求一个 API 密匙,这是你想要保密的。如果有人拥有您的 API 密钥,他们可以像您一样与 API 进行交互,如果您拥有敏感数据,这可能会很糟糕。您的密钥将通过电子邮件发送给您,您需要回复电子邮件来激活它。

我们将需要使用 python 中的请求库和 json 库。这两个库都是 Python 标准库的一部分,所以不需要从命令行安装它们。只需在你的笔记本/程序顶部添加“导入请求”和“导入 json”即可。

与 API 通信有 4 个基本函数。

  • GET:用于获取数据
  • POST:用于发送数据
  • 上传:创建或更新资源
  • 删除:用于删除资源

我们将只使用 get 方法。我们对所有包含 API 密钥的请求使用相同的基本 url。我通常把它保存在一个叫做 base 的变量中。在“&”后面包括您想要的参数和值。查看 API 文档,了解所有可能的请求和参数。以下是我们在请求中可以做出的一些选择。

下面是一个请求电影《钢铁侠》数据的示例。用加号替换所有空格。最后,我们使用。json()将我们从请求中获得的数据转换成 python 字典。现在,您可以通过引用它们的键从字典中获取所需的值。该词典中可能嵌套了其他词典或列表。

希望这为您提供了足够的信息,让您开始从入门课程过渡到完成数据科学项目。完成项目是学习任何编程概念的最好方法,我鼓励你找到你感兴趣的东西,并开始为之努力。

使用 Julia 进行机器学习之前需要知道的事情

原文:https://towardsdatascience.com/things-to-know-before-using-julia-for-machine-learning-487744c0b9b2?source=collection_archive---------13-----------------------

Julia 是一种高级动态编程语言,它本身有一些有趣的特点和特性,这使它成为一种真正有趣且非常独特的语言,值得学习和利用。作为一名数据科学家,没有什么比学习一种新的编程语言来编写人工智能更令人兴奋的了。但是在 Julia 中有一些重要的事情需要注意,有些事情你应该在尝试使用它之前就知道。

让这句格言安息吧。

"像 Python 一样走路,像 C 一样奔跑"

我认为关于 Julia 的许多误导性的事情之一是一个源于语言的想法的术语,并且不一定是没有根据的。然而,我相信这个术语给这门语言的新来者提供了很多不准确之处,因为 Julia 的经常用户会说这绝对是对 Julia 的不准确描述。朱丽亚确实是一个特立独行的人。不仅仅是因为它不同的书写语言,还因为它有许多有趣的,有时甚至是令人震惊的怪癖。

首先,Julia 的语法有点类似于 Python,但这种相似性可以在大多数编程语言中找到,尤其是统计语言。如果我,作为一个相当有经验的程序员,必须将语法与任何特定的语言进行比较,我会说微软的 Basic。没错,我们六岁时写的那种愚蠢的语言类似于麻省理工学院新发现的开源编程语言。这也没有太多的注意事项,真的就是这么简单。我对此最大的支持因素可能是 Julia 中函数和方法的实现方式。不相信我?看一看一个小小的对比:

A Function from Microsoft Basic

这是用 Julia 写的同一个函数。(注意我忘了退货)

A Function from Julia

不是面向对象的?

没错,Julia(技术上)不是面向对象语言。对我来说,这是茱莉亚最大的怪癖,也可能是学习茱莉亚最大的学习曲线。所有的方法都包含在 Julia 库或模块中,不是构造函数。

比如像 model.fit()函数这样的东西,在 Julia 里是不可以存在的。相反,通常模型有一个 fit 方法,该方法采用一个构造的数据类型,该数据类型通常包含更多的数据。因为我为 Julia 写了一个机器学习和统计模块,你可以看看这里的**我将使用它的源代码来解释这在实践中是什么样子,以及到底发生了什么。这里是一个样本 笔记本 它概述了使用测试,火车分裂,并拟合一个模型 使用车床在朱莉娅 **

mutable struct meanBaseline
    y :: AbstractArray
end

这些行是模型的构造函数,只需调用一个与之相等的变量,

y = 1,5,3,6,8
model = models.meanBaseline(y)

这个模型中没有 X 的原因是因为它只是一个均值基线模型,它将为我们提供连续特征的基线精度,其他模型完全相同,只是有一个 X。

因此,通常在面向对象的语言中,如 Python、 在拟合我们的模型后,我们会使用 model.fit(x,y)方法,但是因为 Julia 中的构造函数不包含方法,所以我们必须在模块的根处使用单独的方法来拟合我们的模型。为此,我使用条件来确定输入模型的()类型。

function predict(m,x)
if typeof(m) == TurtleShell
        y_pred = pred_turtleshell(m,x)
    end    
if typeof(m) == majBaseline
        y_pred = pred_catbaseline(m,x)
    end    
if typeof(m) == LinearRegression
        y_pred = pred_linearregression(m,x)
    end    
if typeof(m) == meanBaseline
        y_pred = pred_meanbaseline(m,x)
    end    
return(y_pred)
end

因此,预测模型看起来像这样:

models.fit(model,xtrain)

这就产生了拟合模型对 x 的预测值。

所以在我看来,对于数据科学来说,这是一个有趣的命题。有时不得不为每件事调用一个方法可能有点烦人,但对我来说这是受欢迎的,因为它非常不同而且有趣。

对这类东西的担心只是它对一个典型的数据科学家有多大价值,特别是对于像投资组合或任何严肃的项目这样的东西。不面向对象意味着 Julia 可能需要使用 PyCall 才能接近 Python 的通用性。即使这样,在 Julia 中创建任何类型的应用程序肯定也不是万无一失的方法。相对于 R,甚至 Scala,Python 最伟大的事情之一就是它有这么多奇妙的库可以做任何事情。你可以用 DjangoFlask 开发 web 应用程序,这些应用程序与 SQL 数据库一起工作,用多种框架为桌面计算机和移动设备开发应用程序。这变得更容易,主要是因为 Python 是面向对象的。我很想知道 Julia 是否会把它带到任何地方,或者让它保持原样。

这些缺点可能有点关键,因为这并不是这种语言的真正目的。我喜欢把它看作是 Python 和 Spark 之间的桥梁。它在精确操作方面非常出色,像 Python 一样简单,是 Python 的机器学习基础,但具有 Spark 的大数据处理能力。在开始 Julia 数据科学之旅时,这绝对是需要注意的事情。

关闭中

值得注意的是,Julia 实际上仍处于起步阶段,刚刚走出 1.0 版本。当使用 Julia 时,经常会感觉很陌生,有点过于开源,如果你明白我的意思的话。它给人一种精致、清新的感觉,但与此同时,它可能会让人觉得有点滑稽,尤其是与那些已经被搁置了 15 年以上的语言相比。

由于从 1.0.4 版本开始,Julia 的功能不够全面,这无疑会给 Julia 的未来带来更多的变化。我喜欢思考 Python 和 C++的早期版本,这是一个缓慢而艰苦的过程,但是随着越来越多的人开始使用、喜爱和接受 Julia,它可能会作为数据科学的标准工具被更广泛地接受。

这就是为什么我一直在为 Julia 开发预测建模和统计库,用更强大的文档和具有简单输入和输出的简单函数使转换变得更容易。我真的很兴奋看到朱莉娅在未来几年将走向何方,谁知道呢?也许 5 年后我们的 Python 帽子就不会这么缝上了,我们会用 Julia Flux 代替 Python 张量。无论如何,对于预测建模、可视化、统计和机器学习来说,Julia 绝对是一个令人敬畏的独特工具。

认为你的数据不同

原文:https://towardsdatascience.com/think-your-data-different-ddc435f70850?source=collection_archive---------14-----------------------

了解 node2vec 如何工作,以及它捕获了哪些 word2vec 没有捕获的信息——包括案例研究

在过去的几年中,深度学习(DL)已经成为许多领域应用的主要使能因素,例如视觉、NLP、音频、点击流数据等。最近,研究人员开始成功地将深度学习方法应用于社交网络、推荐系统和生物学等领域的图形数据集,这些领域的数据本质上是以图形方式构建的。

那么图形神经网络是如何工作的呢?我们为什么需要它们?

深度学习的前提

在涉及图形数据的机器学习任务中,我们通常希望以某种方式描述图中的每个节点,以允许我们将其输入到某种机器学习算法中。如果没有 DL,人们将不得不手动提取特征,例如节点拥有的邻居数量。但这是一项费力的工作。

这就是 DL 的闪光点。它自动利用图的结构来提取每个节点的特征。这些特征被称为嵌入。

有趣的是,即使您完全没有关于节点的信息,您仍然可以使用 DL 来提取嵌入。图的结构,也就是连接模式,包含了可行的信息。

那么我们如何利用这个结构来提取信息呢?图中每个节点的上下文真的能帮助我们吗?

从上下文中学习

一种仅使用上下文提取实体信息的著名算法是 word2vec 。word2vec 的输入是一组句子,输出是每个单词的嵌入。与文本通过单词周围的单词描述每个单词的上下文类似,图形通过相邻节点描述每个节点的上下文。

在文本中,单词以线性顺序出现,而在图表中却不是这样。相邻节点之间没有自然的顺序。所以我们不能用 word2vec…还是可以?

像一个坏蛋数学家一样还原

我们可以将数据的图形结构简化为线性结构,这样图形结构中编码的信息就不会丢失。这样做,我们将能够使用好的旧词 2vec。

关键点是在图中执行随机行走。每一步从一个随机节点开始,执行一系列的步骤,每一步都到一个随机的邻居。每一次随机游走都形成了一个可以馈入 word2vec 的句子。这个算法叫做 node2vec 。过程中还有更多细节,你可以在原创论文中读到。

个案研究

Taboola 的内容推荐系统收集了大量的数据,其中一些可以用图形方式表示。让我们检查一种类型的数据,作为使用 node2vec 的案例研究。

Taboola 推荐出版商网站上显示的 widget 中的文章:

每篇文章都有命名的实体——由标题描述的实体。例如,项目“地球上最可爱的狗”包含实体“狗”和“星球”。每个命名实体可以出现在许多不同的项目中。

我们可以按如下方式使用图来描述这种关系:每个节点将是一个命名实体,如果两个命名实体出现在同一项中,则两个节点之间将有一条边:

既然我们能够以图形化的方式描述我们的数据,让我们运行 node2vec,看看我们可以从数据中了解到什么。你可以在这里找到工作代码

在学习节点嵌入之后,我们可以将它们用作下游任务的特征,例如 CTR(点击率)预测。虽然它可能有利于模型,但很难理解 node2vec 学到的品质。

另一种选择是使用 K-means 将相似的嵌入聚类在一起,并根据相关的聚类给节点着色:

酷!node2vec 捕获的集群似乎是同质的。换句话说,图中彼此靠近的节点在嵌入空间中也彼此靠近。以橙色集群为例——它的所有命名实体都与篮球有关。

你可能想知道使用 node2vec 比传统的图形算法有什么好处,比如社区检测算法(例如,格文-纽曼算法)。捕捉每个节点所属的社区肯定可以使用这样的算法来完成,这没有什么错。实际上,这正是特征工程。我们已经知道 DL 可以节省您精心制作这些功能的时间。那么为什么不享受这个福利呢?我们还应该记住,node2vec 学习高维嵌入。这些嵌入比仅仅是社区归属要丰富得多。

采取另一种方法

在这个用例中使用 node2vec 可能不是第一个想到的想法。有人可能会建议简单地使用 word2vec,其中每个句子都是单个项目中命名实体的序列。在这种方法中,我们不将数据视为具有图形结构。那么这种有效的方法和 node2vec 有什么区别呢?

如果我们仔细想想,我们在 word2vec 方法中生成的每个句子都是我们之前定义的图表中的一个环节。node2vec 还定义了同一个图上的遍历。所以它们是一样的,对吗?让我们看看通过 word2vec 方法得到的集群:

现在,“basketball”集群不那么同质了——它包含橙色和蓝色节点。例如,命名实体“Basketball”是橙色的,而篮球运动员“Lebron James”和“Kobe Bryant”是蓝色的!

但是为什么会这样呢?

在这种方法中,图中的每个遍历仅由出现在单个项目中的命名实体组成。这意味着我们被限制在从起点到终点的距离不超过 1 的步数。在 node2vec 中,我们没有这个限制。由于每种方法使用不同种类的行走,学习嵌入捕获不同种类的信息。

为了使它更具体,考虑下面的例子:假设我们有两个项目-一个具有命名实体 A、B、C,另一个具有 D、B、e。这些项目导致下面的图形:

在简单的 word2vec 方法中,我们将生成以下句子:[A,B,C]和[D,B,E]。在 node2vec 方法中,我们也可以得到类似于[A,B,E]的句子。如果我们将后者引入训练过程,我们将了解到 E 和 C 是可互换的:前缀[A,B]将能够预测 C 和 E。因此,C 和 E 将获得相似的嵌入,并将聚集在一起。

Takeway

使用正确的数据结构来表示数据非常重要。每种数据结构意味着不同的学习算法,或者换句话说,引入了不同的归纳偏差。

识别您的数据有一定的结构,因此您可以使用正确的工具来完成这项工作,这可能是一项挑战。

由于如此多的真实世界数据集自然地表示为图形,我们认为图形神经网络是我们作为数据科学家的工具箱中的必备工具。

原载于**由我和* 佐哈尔·科马罗夫斯基 。*

想着自学机器学习?提醒自己这 6 件事

原文:https://towardsdatascience.com/thinking-of-self-studying-machine-learning-remind-yourself-of-these-6-things-b55a5f2b6c7d?source=collection_archive---------2-----------------------

我是一名自学成才的机器学习工程师,如果我重新开始,我会这样告诉自己

Where most of my self-study takes place. Photo from: Daniel Bourke on YouTube.

视觉上学得更好?YouTube 上有这篇文章的视频版本

我们在澳大利亚举办了一个机器人会议,现在是提问时间。

有人问了个问题。

“我如何从不同的背景进入人工智能和机器学习领域?”

尼克转过身,叫着我的名字。

“丹·伯克在哪里?”

我在后台和亚历克斯聊天。我走过去。

“他在这里,”尼克继续说,“丹来自健康科学背景,他学习营养学,然后驾驶优步,在网上学习机器学习,现在作为机器学习工程师与马克斯·凯尔森一起工作了一年。”

尼克是布里斯班科技公司 Max Kelsen 的首席执行官和联合创始人。

我站着,一直听着。

“他在网上记录了他的旅程,如果你有任何问题,我相信他会很乐意帮忙。”

问题问完了,我回到了食物上。

Ankit 过来了。他告诉我他正在进行的项目,该项目使用机器学习来更好地理解学生的学习。他综合了课堂出勤率、在线学习门户花费的时间、测验结果以及其他一些东西。他甚至建立了一个前端门户网站来与结果互动。

Ankit 的作品启发了我。这让我想做得更好。

然后又有几个人开始过来问如何进入机器学习的问题。都来自不同的领域。

这是最难的部分。我仍然认为自己是一个初学者。

但是最好的导师是比你年长 1-2 岁的人。一个刚刚经历过你将要经历的人。再久一点,建议就会变得模糊。你想要新鲜的。

我哥哥正在研究机器学习。以下是我一直对他说的话(还有我自己,如果我要重新开始的话)。

a)获得一些 Python 基础知识(3-4 个月)

语言并不重要。可能是 R,Java,Python,随便什么。重要的是选择一个并坚持下去。

如果你是初学者,你会发现使用 Python 很难出错。

如果你想进入应用机器学习领域,代码是必修课。

从网上选择一门基础课程,坚持几个月。如果它同时面向数据科学教学,则加分。DataCamp 在这方面非常出色。

有时会很难,但这是关键。学习编程语言就像同时学习另一种语言和另一种思维方式。

但是你以前做过。记得你三岁的时候吗?大概不会。但是你周围的人都在使用你从未听过的词汇和声音。过了一段时间,你也开始使用它们。

b)当你还没准备好的时候就开始做东西

尽快应用你所学的知识。

不管你完成了多少门课程,你永远不会 100%准备好。

不要被引诱去完成更多的课程作为能力的标志。

如果我回到过去重新开始,这是我要改变的一件事。

找一个你自己的项目去做,从错误中学习。

回到三岁的自己。你说的每三个字都是错的。没有句子结构,也没有语法。一切都浮出水面了。

c)外面有很多,所以减少混乱

外面有很多课程。他们都很棒。

很难找到不好的。

但问题是。既然有这么多,可能很难选择。另一个可以阻止你的陷阱。

为了解决这个问题,我设立了自己的人工智能硕士学位。我自己的定制赛道。

想抄就抄吧。但是我鼓励你花几天时间做自己的研究,看看什么最适合你。

作为提醒,我发现最符合我日常工作的三个资源是:动手机器学习书籍fastai 机器学习课程和 Coursera 上的应用数据科学与 Python 课程。

在你有了几个月的 Python 经验之后,把这些收藏起来。

d)研究是必要的,但如果你不能应用它,那就毫无意义

你会看到每天都有关于新的机器学习方法的文章和论文出现。

别理他们。

没有办法跟上他们,这只会阻碍你打好基础。

大多数最好的机器学习技术已经存在了几十年。发生变化的是计算能力和数据可用性的提高。

不要被新事物分散注意力。

如果你刚开始,坚持先打好基础。然后根据项目需要扩展你的知识。

e)每天一点

3 岁的你是学习机(机器学习者?).

在几年的时间里,你从不说话变成了和已经说了几十年的人说话。

怎么会?

因为你每天都练习一点。

然后复利就起作用了。

每天好 1% =年底好 3700%。

如果你错过了一天,没关系,生活发生了。能恢复就恢复。

很快你就会开始说数据语言了。

f)不要因为不知道某事而责备自己

“你建过推荐引擎吗?”

“没有。”

“我们有一个项目需要一个作为概念验证,你觉得你能解决吗?”

“当然可以。”

大多数人认为高中或大学毕业后学习就停止了。并没有。

上面的场景发生在几周前。我从来没有建立过推荐引擎。然后我做了。

如果你在以前做过的事情上失败了,失败并不是坏事。你一生都在走路,但当你自己绊倒时,你不会自责。它发生了。你继续走。

但是在新事物上失败是艰难的。你以前从来没做过。

学习机器学习是这样的。

第一年:你真差劲。

第二年:你比前一年更好,但你认为自己更差,因为你意识到自己有多少不知道。

第三年:????(我还没到那一步)

拥抱吮吸。

因为不知道某事而痛打自己对你学习更多有多大帮助?

零。

学习新事物需要时间。每天都是第一天。

Learning isn’t linear.

三岁的你会对不认识一个单词有什么反应?

你会笑的。把手举起来,然后爬一会儿。

现在也一样。除了你能走路。

如果没有那些创建课程并分享他们所学的伟大的人们,我所做的一切和我所学到的一切都是不可能的。

有更多问题吗?在推特、 LinkedInYouTube 上联系。

这篇文章最初是作为 Quora 上的一个回答出现的。

想转行做开发者?这里有几个你可能会问的问题和答案

原文:https://towardsdatascience.com/thinking-of-switching-careers-to-a-developer-d4c8f772ef83?source=collection_archive---------13-----------------------

如果你没有计算机科学的背景,并且一直在考虑转换到数据科学家的角色(或任何开发人员的角色),我知道你在想什么。这么多问题..“我连计算机专业的学位都没有,怎么找工作?”、“我一行代码都没写过,怎么可能做出来?”,“我现在尝试闯入是不是太晚了?”。

如果你正在考虑转行,很可能你已经处于一个不舒服的境地,所有这些问题会让你变得更加艰难。我知道因为我在那里。我毕业时获得了化学工程学位,在一次实习后不久,我意识到并鼓起足够的勇气接受这一特定职业不适合我,并最终决定追求我一直着迷的东西:人工智能和计算机可以用数据做什么。然而,当我做出决定的时候,所有这些疑虑开始蔓延,让我质疑我的决定。"如果这个职业同样不令人满意呢?"“没有经验和正规教育,我还有什么价值?”。

我想说的是,如果你打算沿着这条路走下去,你可能会有类似的疑虑。所以这篇博文是为了让处于这种情况的人放松心情。但在我开始之前,我必须为你决定这样做的勇气鼓掌。

我有答案。但是怎么做呢?

我知道你在想什么:我怎么会有答案?我可以从经验上说,但作为一名有抱负的数据科学家,我要展示数据科学如何让任何决策过程变得更容易,并确保您做出正确的决策。

我将使用 2018 年 stackoverflow 调查的数据。stackoverflow 的 2018 年度开发者调查收到了来自 183 个国家和地区的超过 100,000 份回复,是有史以来对软件开发者进行的最全面的调查。调查了开发人员体验的所有方面,从职业满意度和求职到教育和编码时的合理偏好。让我们开始吧!

问题 1:开发人员的职业生涯有多令人满意?

如果你正在考虑一份新的职业,无论是像我这样的数据科学家还是其他类型的开发人员,很可能你对目前的工作或职业不满意。当你做出这个重大决定时,考虑一下你的新职业是否会以同样的方式发展是很正常的。在进入一个新的领域之前,重要的是要知道它是否会和以前一样,或者给你真正的满足感。所以让我们来看看世界各地的开发人员对他们的工作是什么感觉。

看起来相当大比例的开发人员对他们的工作和职业都很满意,超过 18%的人对两者都很满意。

因此,如果你热爱编码,热爱开发人员面临的所有其他挑战,你很可能会对你的工作和新职业感到满意!

对工作的满意度不仅仅取决于你在哪里工作或者你做什么工作。你在工作中建立的关系也很重要。所以让我们来看看开发者之间的关系。

很高兴知道超过一半的受访者对其他开发人员有一种亲切感。像 stackoverflow 这样的开发人员在线社区就是一个证明。在工作中得到同事的支持和帮助是很重要的。

只有大约 27%的开发者有竞争的态度,这不一定是一件坏事。员工之间的良性竞争可以产生巨大的效果。

最后,大多数开发人员不同意他们认为他们的同龄人比他们优秀的观点,这意味着他们对自己的能力充满信心。

问题 2:待遇怎么样?

所以接下来,你可能会想这是否值得。如果有经济回报的话。这个问题的答案取决于很多因素。你的技能和技术能力,你的编码经验,以及某种程度上你的正规教育。但其中一个最大的因素可能超出了你的控制范围:你的地理位置。

那么我们来看看一些国家的开发者年薪分布是什么样的。

这里有很多东西需要解开,但关键的要点是:

  • 美国开发人员的平均工资最高,其次是英国。印度对开发者的平均工资相当低。
  • 在这 9 个国家中,大多数开发人员的工资都低于该国开发人员的平均工资。

最近搬到了澳大利亚,看到那里开发人员的平均工资相对较高,我很受鼓舞。只需要现在就闯进去!

一个开发者的工资不仅仅取决于国家,还取决于他们在做什么样的工作。在这里,我们将构建一个函数,它将给出任何国家任何类型的开发人员的年薪分布。所以我建立了一个函数,它给出了你想在你的国家成为什么样的开发者的年薪分布。

我刚刚搬到澳大利亚从事数据科学职业,我很想知道我未来的工资会是多少..

澳大利亚数据科学家的平均工资和一般开发人员的工资差不多。此外,这里大多数数据科学家的工资都低于平均水平。

问题 3:先学什么语言?

现在你已经有了一些答案,让你确信要继续做这个决定。你必须开始学习。开始这样做可能会让人不知所措。你可能会发现自己在思考的一件事是你必须知道哪种语言。让我们先看看世界各地不同的开发人员使用什么来解决这个问题。

调查结果共有 38 种语言,其中 Javascript、HTML、CSS 和 SQL 被广泛使用,而 Hack 和 Julia 是最少使用的两种语言。虽然了解全局很好,但这里的结果对我们帮助不大。不同的语言用于不同的编程应用。

下面的函数给出了你想进入的领域中最常用的 10 种语言。

我再次用它来看看数据科学家的结果是什么样的..

Python 是数据科学家使用最广泛的语言,SQL 和 HTML 排在第二和第三位,而 R 没有被广泛使用。对我来说,这是一个令人惊讶的发现,因为我看到许多招聘信息都要求 R 作为一项要求。

谢天谢地,我的确是从 Python 开始的,但是我这样做的决定并没有备份我的数据。只有几篇互联网文章,事实上我开始使用的 MOOC 是 Python 语言。一路走来,我也学会了 SQL。从这个分析的结果来看,我需要尽快开始学习一些 HTML 和 Javascript!

因此,如果你正在考虑进入数据科学领域,你知道现在什么语言是重要的。如果您想成为其他类型的开发人员,只需使用该功能,并找出什么是重要的!

问题 4:我会“成功”吗?

最后,我们来看一个最难回答的问题。当你考虑转行时,我完全理解你脑海中的所有疑虑,特别是如果你没有任何编程经验或在该领域的正规教育,很多时候这些东西会决定你是否能进入该领域并在其中茁壮成长。因此,为了让你放松,我建立了一个预测模型,考虑到你的年龄、教育和编码经验等因素,并告诉你是否“成功”。这很了不起,不是吗?一台预测你未来的机器。这不再是遥不可及的了。有了正确的方法和足够的数据和计算能力,机器可以预测任何事情。未来就在这里!

但是在我们开始之前,我们将首先定义“制造”是什么意思。“成功”没有固定的定义,因人而异。为了这个模型的目的,我们将它定义为获得超过全球开发人员平均水平的年薪。

然而,这个模型的准确率刚刚超过 81%。通过使用 gridsearch 调整模型的一些超参数,这个模型肯定可以变得更好。然而,由于计算能力有限,我无法做到这一点。

当然,我想在模型中输入我的详细信息,看看我是否能作为一名数据科学家在澳大利亚“成功”,无论我拥有什么资格和经验。手指交叉!

呜哇!看起来就像这样,我能做到!然而,该模型只有 82%的准确性,我的情况可能是假阳性。所以我会祈祷好运,继续努力!

如果你想在模型的细节上有一个高峰,前往这个项目的 github 仓库。当你在那里的时候,如果你正在考虑作为一名开发人员开始一个新的职业生涯,并且在我开始的时候为同样的事情烦恼,请随意使用这个模型。

如果您确实使用了这个模型并得到了否定的结果,请记住以下几点:

  • 这是一个非常简单的模型,准确率只有 81%。
  • 你可能是假阴性。
  • 这里使用的“制造它”的定义并不完美。
  • 如果你热爱你的工作并努力工作,你就会成功。

希望这里的一些内容能够让你放心,并帮助你更容易地做出决定。你已经有了你需要的所有事实,你已经有了考虑这条道路的勇气。现在你需要做的就是继续接受这个挑战并战胜它。我祝你万事如意。

这个人工智能可以用来生成 GTA 6 图形

原文:https://towardsdatascience.com/this-ai-could-be-used-to-generate-gta-6-graphics-71299b0dfc09?source=collection_archive---------14-----------------------

在视频游戏中设计虚拟世界是一项耗时耗力的任务。像侠盗猎车手 (GTA)这样的开放世界游戏拥有巨大的虚拟环境,玩家可以自由导航,即使是大型游戏工作室,构建这些视觉效果也需要长达 4 到 5 年。因此,发布新游戏的周转时间往往相当长。这就是深度学习算法可以帮助减少开发时间的地方,它接管了创意艺术家设计和渲染游戏视觉效果的任务。在这篇文章中,我将回顾两篇最先进的研究论文,它们可以帮助执行在 GTA 这样的游戏中设计和可视化虚拟世界的任务。

具有深度学习的图像合成

Left: A semantic label map depicting the objects appearing in this scene. Right: A fake image synthesised by a Deep Neural Network from this semantic label map. [source]

我们可以训练一个神经网络来学习我们希望包含在游戏虚拟世界中的各种对象或资产的外观。然后,如果我们给它一个语义标签图(如上所示)来描述这些对象的位置,它可以呈现出逼真的视觉效果。

这项任务被称为使用语义标签的图像合成,这个研究领域在过去几年里有了很多新的发展。我今天要介绍的一篇在这项任务中表现出色的研究论文名为 vid2vid。

视频到视频合成(vid2vid)

麻省理工学院和英伟达的研究人员发表了一篇题为“视频到视频合成的论文,该论文能够从高分辨率、时间一致的图像中合成视频。它使用一种特殊的 GAN 架构来确保视频中的合成帧看起来逼真,并且不同帧之间具有视觉一致性。

The GAN architecture used in vid2vid.

vid2vid 网络的生成器不仅使用了我们想要转换的当前语义图,还使用了以前帧的少量语义图。此外,它使用来自其先前输出的最终合成帧,并将这些帧组合在一起以计算 F 低图。这提供了理解两个连续帧之间的差异所需的信息,因此能够合成时间上一致的图像。在鉴别器方面,它使用 I 图像鉴别器来控制输出质量,除此之外,它还使用视频鉴别器来确保合成图像的逐帧序列根据流程图是有意义的。这确保了帧之间几乎没有闪烁。最重要的是,它采用了一种渐进增长方法,首先完善较低分辨率的输出,并利用这种知识逐步提升,以产生更高分辨率的输出。看看下图中这个网络的惊人结果。

Short clip of fake virtual city synthesised by the vid2vid network trained on cityscapes dataset. [source]

基于 GAN 的方法的问题

虽然 vid2vid GAN 网络的视觉质量令人印象深刻,但如果我们想在游戏中实际使用它,还有一个实际问题。你一定注意到了像 GTA 这样的游戏有一个昼夜循环,它改变了虚拟世界的外观。此外,雨和雾等其他天气效应完全改变了这个世界的面貌。这意味着任何试图渲染虚拟世界图形的神经网络也必须能够根据它们的照明和天气效果对不同的视觉风格进行渲染。然而,由于模式崩溃的现象,用 GANs 产生不同外观的图像是一个问题。

Mode Collapse in GANs resulting in synthesised images unable to produce visually diverse outputs.

vid2vid 中 GAN 的模式崩溃

想象在某个更高维的坐标空间里有一堆训练图像,我们在上图中简单的用二维表示。这些点中的一些代表白天的样本,一些代表夜晚的图像。现在,当我们开始训练无条件 g an 时,我们首先生成一组随机图像,这些图像将通过生成器推送。现在,训练过程基本上试图将这些假图像推向训练图像,以便它们看起来是真实的。这导致了一个问题,其中一些训练图像可能被遗漏并且永远不会被使用。随着训练的进行,这将导致生成器只产生相同类型的图像。因此,GANs 遭受模式崩溃,并且由这种方法生成的图像在本质上不能是视觉多样的。

这就是我如何看到这篇旨在使用最大似然估计来解决这个问题的研究论文。

使用条件 IMLE 的图像合成

Berkeley 的研究人员发表了论文“通过条件 IMLE 从语义布局进行多样化图像合成”,旨在通过基于 GAN 的 vid2vid 网络训练过程解决上述问题。它不是专注于提高输出帧的质量,而是专注于能够从完全相同的语义地图中合成不同的图像。这意味着我们可以使用这种方法在任何光照或天气条件下渲染相同的场景,而不像 GANs 那样一个语义标签只能产生一个输出。本文展示了如何使用隐式似然估计或 IMLE 来实现这一点。让我们试着理解为什么在这个特殊的用例中,IMLE 看起来比甘斯做得更好。

Uncondiitonal case of Implicit Maximum Likelihood Estimation (IMLE) training process.

它首先选取一个训练图像,然后试图将一个随机生成的图像拉近它。请注意,这个过程与 GANs 中的工作方式相反。接下来,它选取另一个训练图像,并向它拉另一个随机图像。重复这个过程,直到我们覆盖了所有的训练图像。这意味着,我们的训练过程现在涵盖了所有白天和夜晚的图像,因此,我们的生成器被强有力地训练以产生不同风格的图像。现在,注意,这是 IMLE 的无条件情况,其中我们从随机噪声图像而不是语义标签图开始,但是训练过程对于两种情况都是相同的。当我们使用语义图时,唯一改变的是输入编码,所以让我们来看看。

Conditional case of IMLE, where input is the semantic label and not a random image like we saw before. A random input noise channel is added to the input encoding which is used to control the visual style of the network’s output.

我们没有使用 RGB 语义标签作为输入,而是将地图分解成多个通道。每个通道对应于贴图中的一种对象类型。接下来是这篇论文最重要的部分,我个人认为也是最有趣的部分。它使用一个额外的噪声输入通道来控制输出风格的外观。因此,对于该通道中的一个随机噪声图像,输出将遵循固定的输出风格,如白天效果。如果我们改变这个通道到一些其他随机噪声图像,它将遵循另一种风格,像可能是夜间效果。通过在这两幅随机图像之间插入,我们实际上可以控制输出图像中的时间。这真的很酷,很迷人!

Day-and-night cycle of a virtual world imagined by a Deep Neural Network [source]

试用这个 AI 来渲染 GTA 5

我试图从游戏 GTA 5 的一个短片中重现这种效果。我用一个图像分割网络获得了游戏的语义标签,然后通过 IMLE 训练过的网络运行它。考虑到是完全相同的发生器网络能够产生 GTA 的白天和夜晚片段,结果令人着迷!

你可以在我的 Youtube 频道上观看更多这些视频格式的结果,视频嵌入在下面。

结论

在我们今天看到的两篇论文中, vid2vidIMLE 基于图像合成,我们可以真正看到我们在基于人工智能的图形渲染方面走了多远。在我们开始试验这种新的基于人工智能的图形技术之前,我们只需要清除几个障碍。我预测从今天起大约十年后,像侠盗猎车手这样的游戏将会有某种基于人工智能的资产渲染来帮助减少游戏的开发时间。游戏开发的未来令人激动!

参考

  1. 视频到视频合成
  2. 通过条件 IMLE 从语义布局合成多样图像
  3. 语义切分

感谢您的阅读。如果你喜欢这篇文章,你可以关注我在媒体GitHub 上的更多作品,或者订阅我的 YouTube 频道

基于漏斗图的电力商业智能异常检测

原文:https://towardsdatascience.com/this-article-is-about-identifying-outliers-through-funnel-plots-using-the-microsoft-power-bi-d7ad16ac9ccc?source=collection_archive---------19-----------------------

这篇文章是关于使用微软 Power BI(可视化工具)通过漏斗图识别异常值的。在我们继续之前,让我们看看什么是离群值,以及为什么识别它们很重要。

离群值是那些位于总体分布模式之外的数据点&检测离群值最简单的方法是通过图形。箱线图、散点图有助于轻松检测它们。

在进行异常值分析之前,我们应该对为什么我们需要发现异常值以及我们将如何处理这些异常值的问题有一个答案。这种专注将帮助我们选择正确的分析、绘图或绘图方法。例如,如果异常值表明存在风险或威胁,则应该处理这些元素。如果一个异常值表示一个异常的结果,企业可能希望对它们执行进一步的分析,以识别这些异常值的独特方面。

对于离群点检测,我们可以用 R/Python 绘制图表,这需要一些编码技巧。同样的事情也可以在 power BI 中实现,在 Power BI 中进行分析的优势是不需要编码,我们还可以应用所需的过滤器,快速分割数据,以查看各种条件下的异常值。

在本例中,我们使用 Power BI 中的漏斗图(自定义视图)来识别异常值。漏斗图是散点图的变体,有助于通过识别异常值来评估和可视化监测数据。这些图用于许多行业,如医疗健康分析、比较组织绩效等。漏斗图中的异常值基本上是漏斗外的点。

漏斗图使用一种称为统计过程控制的方法,该方法将普通原因变异与特殊原因
变异区分开来。普通原因变化是任何系统中发生的正常随机变化(噪声),而特殊原因变化表明有异常情况发生。

漏斗图在垂直轴上显示指标值,在水平轴上显示人口。正如我们在下图中看到的,基准值(平均值/中值)是穿过图表中心的水平线。漏斗位于基准点的两侧,漏斗被有效地称为控制极限(置信区间)。漏斗形状的形成是因为随着人口数量的增加,控制界限变窄。

从根本上来说,这些图是由置信限、几个聚类(一组点)和异常值形成的。漏斗图通常显示两个漏斗,内部深灰色线代表两个标准差(95%置信水平),外部浅灰色线代表 3 个标准差(99.8%置信水平)。基本上,这些极限代表数据点落在这些线所描绘的区间内的概率。我们通常使用内部漏斗来决定价值是否与基准显著不同。如果一个点位于漏斗内,那么我们可以得出结论,它与基准没有明显不同,如果它位于漏斗外,那么它可能明显更差(红点)或更好(绿点)。这些红色/绿色的数据项是异常值,根据业务需求,我们可以进一步分析这些异常值。

Power BI 桌面中的漏斗图

假设您对 power bi 有基本的了解,我将直接绘制漏斗图。在这个例子中,我使用包含各地区癌症死亡率统计数据的表格作为绘制漏斗图的输入数据。

一旦我们将数据加载到 Pobwer BI 中,我们可以看到它有 4 列。“人口”一栏是该地区的总人口,“人数”表示死亡病例数。

Power BI 使用 R 代码来绘制漏斗图,我们应该在我们的系统中安装 R 来工作,并且当我们第一次使用漏斗图时,它会要求安装几个 R 包。

跟随链接了解在 Power BI Destkop 中绘制漏斗图的步骤。

一旦我们画出了漏斗图,它看起来如下,让我们向前看,并试图理解漏斗图实际上是如何工作的。这里,在这个可视化中,X 轴代表人口,并相对于流感死亡率绘制在垂直轴(Y 轴)上。您可以选择以百分比或比率显示的 Y 轴。

图中的水平蓝线称为基线。默认情况下,绿色实线表示置信度为 0.95,红色虚线表示置信度为 0.99。基本上,这些极限代表数据点落在这些线所描绘的区间内的概率。

每个点代表一个区域,我们可以将鼠标悬停在任何点上,以查看给定输入参数下的区域、人口和死亡率。我们可以看到,格拉斯哥市的死亡率为 31.09,考虑到人口规模,这被归类为异常值,并绘制在漏斗之外。这种不对称性有助于用户对该地区进行更多的研究和调查。

正如我前面提到的,我们可以在我们的地块上应用所需的过滤器,我在右上角包含了一个人口过滤器,使用它我们可以将我们的人口限制在所需的数量,地块将相应地/立即改变。这些切片和切块选项对于业务用户从不同角度查看数据非常有用,因此有助于获得更好的洞察力。

这就是这篇文章的全部内容,如果你喜欢,请鼓掌。提前感谢。

这项发明用你的声音来显示你的长相

原文:https://towardsdatascience.com/this-invention-uses-your-voice-to-show-what-you-look-like-eb5b473b7dd6?source=collection_archive---------29-----------------------

麻省理工学院的研究人员开发了一种人工智能,它可以仅根据你的声音来预测你的外貌。所以他们已经有了如何在日常生活中使用这项发明的想法。

我想象你正坐在一个商务会议上。你不认识的人通过电话从外面连接。通话几秒钟后,一张他的脸的复制品出现在屏幕上——是根据来电者的声音生成的。

这不是科幻小说,而是美国麻省理工学院(MIT)研究人员成功研发的一项发明。例如,他们创建了一个神经网络,一个人工智能,并向它输入了来自 YouTube 的数百万个视频序列。这使得网络能够学习各种关于面孔和语言之间关系的信息。

然后,研究人员试图找出人工智能现在可以仅根据声音重建多少关于说话者面部的信息。他们使用神经网络通过声音编码器破译声音及其面部特征,并通过面部解码器创建合适的肖像。

研究人员做得很好。

六秒钟的录音足以让人工智能创造出与原始录音惊人相似的图像。特别是,年龄和性别,以及种族背景或关于脸部形状的信息通常都可以被识别。

与此同时,研究人员根据原始照片创建了一幅肖像,以中性的面部表情描绘被描绘者,并注视着相机。与基于声音的图像相比是惊人的。

当然,结果还不完美。此外,人工智能有时也会出错:例如,当一个亚洲人说英语时,可能会有困难。但是不仅仅是种族,还有性别和年龄都弄错了。

然而,麻省理工学院的科学家并不是第一个处理这个话题的人。之前的研究也使用人工智能来破译声音。然而,他们总是搜索预定义的信息,例如,说话者的年龄或性别。

麻省理工学院的研究人员采取了不同的方法:

他们想知道一般可以从语言中获得哪些关于面部的信息。根据他们的陈述,他们是第一个成功地直接从声音中识别出一张脸的人。
研究人员已经有了如何利用这一发展的想法:例如,可以根据声音创建的肖像来创建个性化的卡通。该功能还可以用于为机器生成的声音分配类似的外观——例如,来自虚拟助手的声音。

“这是 CS50”:开始数据科学教育的愉快方式

原文:https://towardsdatascience.com/this-is-cs50-a-pleasant-way-to-kick-off-your-data-science-education-d6075a6e761a?source=collection_archive---------6-----------------------

为什么 CS50 对巩固你的软件工程基础特别有用

CS50 professor David Malan teaches over 800 students on CS5 — from Youtube

所以你想进入数据科学领域

祝贺你!数据科学是一个最热门、最艰难、最具挑战性、最有回报且充满顶尖人才的职业。你的旅程一定会充满乐趣、挑战、启迪和成就(或大或小)。每天甚至每小时都有新论文发表。新技术和实验定期开发。新的思维方式成为新的规范。和以前看起来不可思议的事情,都被证明是可行的。

但是你不知道从哪里开始

Photo by Ben White on Unsplash

但是进入数据科学并不容易。远非如此。学习曲线是残酷的。要学的东西太多了:线性代数、微积分、统计学、Python、SQL、机器学习、算法、优化、数据争论、数据可视化、软件工程、devo PS……不胜枚举。

有些人可能有一些数学或者统计方面的背景,肯定会有帮助。然而,你仍然需要一个坚实的软件工程基础,以便在你的职业生涯中高效和成功。但这不是问题,你说。毕竟我们生活在一个在线教育蓬勃发展的时代。有很多付费和免费的课程可供我们选择。没错,但这正是问题所在。如今,自我教育面临的最大挑战不是缺乏教育资源,而是很难找到最好的或最相关的资源。

输入 CS50。如果只允许你修一门 CS 课程,那就修 CS50。

WCS50 是什么帽子?这是在哈佛大学由大卫·j·马兰教授讲授的计算机科学入门课程。这是哈佛最大的班级,有 800 名学生,102 名员工和专业的制作团队。它提供校内和网上课程。我参加了网络课程,但这已经是我遇到的最好的计算机科学课程了。让我告诉你为什么:

  • 学习曲线设计的太好了,就像在看一部很棒的悬疑电影

CS50 的工作人员有能力在每次讲座之前准确地知道你做了什么和不知道什么(因为他们没有专家盲)。所以演讲不会提到任何你不熟悉的东西。它平稳地引导你通过计算机科学的关键概念,并使它看起来很明显。它不时地提出问题,然后通过更深入的概念解释来解决这些问题。你会有很多“啊哈”时刻,感觉就像在看一部悬疑电影。

  • 涵盖了计算机科学的核心和重要基础,并为您留下了足够的空间来深入挖掘

该课程涵盖了大多数重要的计算机科学元素:C 语言、Python、数据结构、算法、软件工程、资源管理、Web 开发等。它挖掘得足够深,所以你可以理解所有的基本概念,同时也知道如果你想挖掘得更深,应该去哪里找。

  • 编排各种方式教你挑战/无聊的概念,绝不觉得无聊

What is an array? Let’s find out! — thecrimson.com

CS50 有很多方法可以教你并让你保持参与。您将玩一个游戏来了解不同的排序算法,收到一只橡皮鸭来体验著名的橡皮鸭调试,观看“灯光阵列”的实验🚥学习数据结构,甚至吃一顿美味的早餐🍞同时探索伪代码的概念。(我最喜欢的一个例子是,戴维·j·马兰(David J. Malan)用一本黄页电话簿来解释二分搜索法,然后撕下一半扔掉。CS50 的决定性时刻。)

  • 互动、有趣、吸引人,时间过得飞快,一旦课程结束,你会惊讶于你所能做的事情

学习的经历如此有趣,你会感觉时间在不知不觉中飞逝。它给出的一些问题很有挑战性,但并非不可能。一旦你成功了,你会为自己感到骄傲。你可能会爱上解决问题的快乐。如果你被困住了,几乎每个社交网络平台上都有一个在线社区(Twitter、Reddit、Stack Exchange、脸书等。)在那里可以得到帮助。

  • 课外活动让你熟悉“开发者文化”,这对你未来的职业生涯至关重要。

谜题日、办公时间、CS 50 展会、最终项目“通宵”黑客马拉松(如果你熬夜的话,可以在 IHOP 吃免费早餐),许多活动旨在让你熟悉“开发者文化”,并为你进入软件工程世界做好更好的准备。

  • 最先进的课程软件助您入门

如果他们不用自己开发的软件工具,一门计算机科学课程有多伟大?多年来,CS50 的工作人员开发了一系列工具/软件来帮助学生编写代码提交作业检查他们的代码质量/语法整理代码风格,甚至生成 PDF 格式的彩色代码文档!正如大卫·j·马兰所说,这些都是简洁而有用的“训练轮”,将会帮助你提高速度。

但是,请不要只相信我的话,看看 YouTube 首席执行官 Susan D. Wojcicki 对她的经历是怎么说的:

这对数据科学也很有帮助

B 作为一门很棒的课程,CS50 与数据科学也非常相关。它帮助您为未来的职业生涯打下坚实的软件工程基础:

  • 它教你 C 语言。更重要的是,通过 C 语言,你了解计算机的基本原理,如内存如何工作,什么是指针,数据结构等。
  • 如果你会写 C,那么你就能很快学会用 C++写。C++是事实上的低级、高性能语言,用于 Numpy、Pandas、Sk-Learn 等数据科学库。
  • 它教授 Python,Python 是机器学习和数据科学的主要高级语言。
  • 它教授 SQL,这是数据科学中使用最广泛的语言。
  • 它还教授 web 编程,当您试图将您的模型部署到生产中时,这很有用。

因此,从本质上讲,这门课所教授的东西对你都没有多少用处,它帮助你建立的基础将大有裨益。

CS50 及以上!

O 学完本课程后,您将更加博学和自信地继续您的数据科学之旅,我将从这里为您指出几个可能的方向:

CS50 用 Python 和 JavaScript 进行 Web 编程

由才华横溢的 TF 余腾渤教授你最相关和先进的 web 编程工具,如 CSS、Javascripts、React、Flask/Django。链接这里

的 Fast.ai 课程,开始一种“自上而下”的 ML 方法

Fast.ai 奇妙而独特。它使您能够在第一课中用不到十行代码构建最先进的深度学习模型。然后,它越来越深入地探究如何和为什么。唯一的先决条件是一年的编码经验,CS50 已经为你准备好了。

吴恩达 在 Coursera 上的机器学习课程

另一个很棒的机器学习课程,但是是“自下而上”的风格。它首先流畅地解释数学基础,然后逐渐积累知识,从零开始拼凑复杂的机器学习模型。我有一篇文章解释了吴恩达杰瑞米·霍华德的不同机器学习教育方法之间的差异,并推荐了一种潜在的高效学习方法。

科里·斯查费的 YouTube 频道,Python 和 OOP 教程

尽管 CS50 很好,但它只涵盖了 Python 的一般和基本概念。您将需要更深入的知识来为您的数据科学项目高效编码。为此,我推荐科里·斯查费的 YouTube 频道。他是我遇到的最好的 Python 教育者之一,他用清晰明了的方式解释了复杂的思想。他的视频一秒都没有浪费。内容简洁,切中要害,高度浓缩。他有基本的 PythonSQLMatplotlibGit面向对象编程的播放列表。

结论

L 学习数据科学从来都不是一件轻而易举的事情,我希望这篇文章能对减轻这种痛苦有所帮助,让你的旅程变得更高效、更有趣。你可以在 edX 上访问这个链接获取所有 CS50 相关课程(只需搜索‘CS50’)。如果您知道其他也很棒的课程和资源,请随时留下您的回复,这样其他人也可以看到。谢谢!

觉得这篇文章有用?在 Medium 上关注我(李立伟)或者你可以在 Twitter @lymenlee 或者我的博客网站wayofnumbers.com上找到我。你也可以看看我下面最受欢迎的文章!

** [## 一枚硬币的两面:杰瑞米·霍华德的 fast.ai vs 吴恩达的 deeplearning.ai

如何不通过同时参加 fast.ai 和 deeplearning.ai 课程来“过度适应”你的人工智能学习

towardsdatascience.com](/two-sides-of-the-same-coin-fast-ai-vs-deeplearning-ai-b67e9ec32133) [## 我完成了吴恩达的机器学习课程,感觉棒极了!

好的,坏的,美丽的

medium.com](https://medium.com/datadriveninvestor/thoughts-on-andrew-ngs-machine-learning-course-7724df76320f)**

这就是强化学习的工作原理

原文:https://towardsdatascience.com/this-is-how-reinforcement-learning-works-5080b3a335d6?source=collection_archive---------10-----------------------

(什么会让你建立你的第一个人工智能)

2017 年底,谷歌推出了 AlphaZero ,这是一个人工智能系统,它从头开始自学如何在四个小时内掌握国际象棋、围棋和日本象棋。

短时间的训练足以让 AlphaZero 击败世界冠军国际象棋程序。

(Andriy Popov / Alamy Stock Photo)

最近,OpenAI 证明了强化学习不仅仅是虚拟任务的工具。 Dactyl ,它的拟人机器人手已经学会自己解魔方。

谷歌 AlphaZero 和 OpenAI Dactyl 是强化学习算法,除了游戏规则之外没有任何领域知识。一些人工智能专家认为,这种方法是实现人类或超人人工智能的最可行的策略(AGI)。

在我们之前的文章中,我们介绍了强化学习的构建模块。

[## 不要再忽视强化学习了

监督或无监督学习并不代表一切。每个人都知道。开始使用 OpenAI 健身房。

towardsdatascience.com](/dont-ever-ignore-reinforcement-learning-again-4d026ee81371)

现在,我们将深入探讨人工智能代理使用的机制,以教会他们自己如何采取正确的行动流程来实现一个全球回报的目标。

什么是策略?

让我们考虑一下 OpenAI 冰冻湖,一个简单的环境,其中代理控制一个角色在网格世界中的移动。网格的一些瓦片是可行走的,其他的导致代理人掉进水里。代理人因找到一条通往目标方块的可行走路径而获得奖励。

即使对于这样相当简单的环境,我们也可以有各种各样的策略。例如,代理可以总是向前移动,或者随机选择一个动作,或者通过检查先前的向前动作是否失败来尝试绕过障碍,或者甚至有趣地旋转来娱乐。

策略的直观定义是,它是一些控制代理行为的规则集。不同的政策可以给我们不同的回报,这使得找到一个好的政策变得很重要。

形式上,策略被定义为每个可能状态的动作的概率分布:

最优策略𝛑*是使期望值函数 V 最大化的策略:

价值函数 V(s) 是状态 s 贴现后的预期长期回报,与短期回报相对。价值函数表示代理所处的状态有多好。它等于代理人从该状态开始的预期总报酬。换句话说,在状态 s 中采取行动 a 的一步奖励的总奖励通过v(𝑠定义。

如何选择最佳动作?

值函数取决于代理选择要执行的操作的策略。学习最优策略需要我们使用所谓的贝尔曼方程

让我们通过考虑下面的例子来直观地介绍一下贝尔曼方程。代理可以执行动作 1、2、…N 。这将把代理带到一个未来状态 S1、S2、…SN 。代理将相应地获得奖励 r1、r2、…rN 。每个未来状态的预期长期回报将是 V1、V2、…VN

如果代理在处于状态 S0 时采取动作 a=i ,则状态 S0 的预期长期回报或值由下面的等式给出,其中γ是常数。

最优策略将帮助代理选择最佳的可能
动作。为此,代理需要计算每个可能动作的结果值 a=1,2,…,N ,并选择最大可能结果。

以上方程称为确定性贝尔曼方程。如果对于一个给定的动作,主体可以以不同的概率达到一个以上的未来状态,那么它可以成为一个随机方程。这种情况如下图所示。

这种一般情况下产生的随机贝尔曼方程如下所示。

我们提供了一个贝尔曼方程的实现,以选择给定状态下的最佳可能动作。您需要加载必要的必备库,如我们之前的文章所述。

AI 智能体如何通过值迭代学习?

在上一节中,我们解释了如何找到提供最大长期价值的最佳行动。如果我们能对所有的状态都这样做,我们将获得价值函数。我们还将知道在每种状态下应该执行什么操作(最优策略)。这个算法叫做值迭代

值迭代算法随机选择一个初始值函数。然后,它在迭代过程中计算新的改进的价值函数,直到它达到最佳价值函数。最后,它从最优值函数中导出最优策略。

在 4x4 的冰湖环境中,值迭代算法在所有 16 个状态和 4 个可能的动作上循环,以探索给定动作的奖励,并计算最大可能的动作/奖励,并将其存储在向量 V[s]中。该算法迭代,直到 V[s]不再显著改善。

最佳策略 P 则是每次都采取行动,以达到具有最高 V 值的状态。

下面的函数在 4x4 冰湖环境中实现了值迭代算法。

上面得到的数组说明了价值迭代函数如何成功地计算出 16 个州的长期回报。该算法进行了 7 次迭代。

代表一个洞的状态( H )的值为 0,而代表冻结块的状态( F )的值较高,尤其是如果这些块处于朝向目标 G 的有希望的路径上。

下面的函数提供了使用热图的可视化结果。箭头显示了使用最优策略 P 提供最佳总报酬的行动流程。

下面我们在一个 8×8 的冰湖环境下运行数值迭代算法。

AI 智能体如何通过策略迭代学习?

在上一节中,我们介绍了价值迭代算法,并举例说明了一个代理人将如何走过一个冻结的湖洞,以达到目标。

策略迭代算法中,我们从随机策略而不是随机值函数开始。然后我们找到该政策的价值函数。接下来,我们基于先前的值函数找到新的(改进的)策略。经过多次迭代,这将产生一个最优策略。

下面的函数实现了策略迭代算法。

正如我们所观察到的,两种算法产生了相同的结果。虽然值迭代算法在每次迭代中不断改进值函数,直到值函数收敛,但是策略改进定理向我们保证由策略迭代算法找到的策略比原始随机策略更好。

这两种方法实现了相同的目标,策略迭代在计算上更加高效。

如何调 AI 智能体的学习率?

值和策略迭代算法都依赖于超参数γ (gamma ),它定义了值或策略更新期间的学习率。

在这里,我们尝试不同的 gamma 值,并讨论 gamma 对训练的影响。

这些图显示了值如何随着 gamma 的增加而增加。不同的 gamma 值(0-10)会产生不同的策略。较低的 gamma 值将更重视短期回报,而较高的 gamma 值将更重视长期收益。

最佳伽玛取决于任务的领域。在冰湖的情况下,寻求短期收益是没有意义的(例如,落入洞中导致的负面奖励实际上不如后来收到的相同惩罚有价值,在很长一段时间没有下落之后)。我们更希望尽可能地向前看。

结论

在本文中,我们提供了如何实现值迭代和策略迭代算法的实践技巧,以便在强化学习中找到最佳策略。

Andrej Kaparthy 的这篇文章提供了关于这些技术的进一步见解。

当代理知道关于环境模型的足够细节时,值和策略迭代算法都工作。在自动驾驶、医疗或股票交易等几个场景中,学习或提供过渡模型可能很难。在这种情况下,无模型方法更合适。我们没有在本文中涉及它们。

Q-learning 是一种无模型学习,当代理不知道环境模型,但必须利用其与环境交互的历史通过反复试验来发现策略时使用。

状态-行动-奖励-状态-行动(SARSA)是另一种算法,其中代理与环境交互并根据采取的行动更新策略。本帖将给出更多关于无模型算法的有趣见解。

感谢阅读。

你还饿吗?下面查看我最全面最简单的深度学习入门。

[## 深度学习为什么有效:解决一个农民的问题

在开始是神经元:梯度下降,反向传播,回归,自动编码器,细胞神经网络…

towardsdatascience.com](/why-deep-learning-works-289f17cab01a)

这就是你在数据科学里放数据的方式!

原文:https://towardsdatascience.com/this-is-how-you-put-the-data-in-data-science-5411c8a45122?source=collection_archive---------8-----------------------

数据科学不断发展。这 2000 万个数据集就是证明。

(Er, wrong Data search tool.)

谷歌搜索家族中我最喜欢的新成员之一是数据集搜索。是的,你没听错。您可以像搜索图像一样搜索数据集!

您现在可以像搜索图像一样搜索数据集了!

You can play with Dataset Search here.

关于公众的数据素养,数据集搜索说明了什么

如果没有人使用谷歌的垂直搜索引擎,如谷歌图片谷歌学术,它们不会持续很久,所以它们的多样性告诉你一些人们倾向于在互联网上寻找什么。图像、视频和新闻都不足为奇。但是数据集呢?你暗示说,处理数据集不仅仅是遥远冰屋里三个孤立的教授的事。它很大。…而且越来越大。

有什么条件?没有了。这真的和用谷歌图片或谷歌学术搜索是一回事,但是是针对数据集。超过 2000 万(!)数据集目前已编入索引并可供使用……而且该索引正在快速增长。

今天,它让 2000 万个数据集唾手可得…明天还会有更多。

既然你知道它的存在,你可以在这里玩它或者你可以留下来讨论数据集搜索是如何工作的,以及它对数据科学职业和整个人类意味着什么。

A screenshot from my most recent Dataset Search session. Back when I was in grad school I would have groveled shamelessly for clues about where to beg for access to data like these. (That’s literally what we had to do to get it: write long emails begging other laboratories to cough it up, usually to no avail. Give me a moment while I get misty-eyed over how easy the new way is.)

加速分析领域的一场革命

分析是数据科学的一部分,是关于快速获得灵感的。与统计学或机器学习不同,分析学的最高优点是速度。(为了安全起见,优秀的分析师会形成一种免疫力,不会在跟进新数据之前就妄下结论。)

更快的数据访问为您提供了更强大的分析能力。

你知道当数据集很容易找到时你会得到什么吗?更快的分析!数据集搜索对于所有的专业分析师和数据科学家来说,这是一个令人难以置信的速度提升。(但是,如果你有把你的灵感当真的危险,一定要记得用统计方法更仔细地跟进。)

是啊,但是到底有什么问题呢?

如果你生长在一个数据集稀少、珍贵,并且经常由教授或数据提供商管理的世界——就像我们大多数人一样!—你可能会有一点无意识的偏见:你认为给你数据的人会对数据的质量负责(可能还藏着一两个博士学位)。如果你主要在学习或科学环境中使用数据集,你可能会形成这样的印象,数据集在到达你面前之前被亲切地处理过。

现实生活中的数据科学是一片丛林,而不是由你的教授们管理的神圣空间。

暂且把这种偏见放在一边,考虑一个不同的问题:外行人对数据崇拜的有害影响。任何倾向于用大写字母“D”来表示数据的人可能会认为所有以结构化形式包装的信息都是有用的和真实的。嘿,这不是魔法。不要相信你读到的一切,也不要相信每一个数据集。点击了解更多关于数据和数据崇拜的本质

如果你的生活中,大多数给你数据的人都是有名望的,并且/或者你被教导要崇拜数据和科学,那么你会受到严重的打击。你猜怎么着!数据集可能是一堆结构化的垃圾。它可能会坏掉。可能是编造的。可能是六十亿个零。什么都有可能。就像文字一样!

“书上写的,一定是真的……”

说到文字:“书上写的,一定是真的……”对吧?不对!更惨:“如果是网上写的,那肯定是真的……”看到你刚才拉的那张脸,我爱死了。很好。你持怀疑态度。你应该害怕。现在怎么样“如果写在数据集中,那一定是真的……”

A book! It must be true.

那里有很多垃圾,因为任何人都可以写他们想写的东西。你知道不该相信它。相反,你需要花点时间去思考它的来源。太好了,因为这个习惯也会让你在数据领域保持安全。

如果你习惯于相信数据而不是文字,那就小心你自己。

如果你习惯于相信数据而不是文字,那你就要小心了。你可能已经有了这个习惯,却没有意识到。不要把数据视为神圣的东西。重新定位你的街头网络习惯,也就是你在搜索谷歌图片或网络时经常使用的习惯。你知道谷歌并不拥有或编辑那些猫的照片或隐形药水的配方,当你友好地询问时它会提供给你。(你知道那些隐形药水不管用吧?)你知道质量各不相同,在你相信你读到的一切之前,你要对来源进行批判性的思考。你知道网上有各种各样的东西,你早就不容易受骗了。嗯,大部分是。即使是我们中最优秀的人偶尔也会点击那些“一个奇怪的把戏”链接或稀奇古怪的新闻故事。

如果你把你通常对街头互联网搜索的怀疑态度应用到数据集搜索上,那就没什么问题了。

像对待任何其他互联网搜索结果一样对待数据集搜索结果。该工具将帮助您筛选干草堆,但要由您来仔细检查猫拖进来的东西的质量。

但是,嘿,如果让我在一个巨大的可搜索的不同质量的猫图像的聚宝盆和一个 3 个精心策划的猫图像的小相册之间选择,我会选择前者。(嗯,实际上我会两个都选,因为我很贪婪……你也可以。这些搜索工具不需要你的一夫一妻制。)

互联网大部分是由垃圾邮件组成的

不是所有的东西都对你有好处。也就是说,谷歌确实尽力打击垃圾邮件,并优先考虑合法结果。是的,人们会把垃圾数据集放在那里来吸引你的注意力,是的,我们对它进行排名是为了给你提供更好的东西。就像常规搜索一样。但是你不应该期望这些事情是完美的。

要使数据集可搜索,只需将 schema.org 中的元数据添加到描述数据集的每个网页中。

要使数据集可搜索,只需将 schema.org 中的元数据添加到描述数据集的每个网页中。谁都可以做,就像谁都可以写博文一样。它可能是垃圾(也许这篇博文是……啊哦),所以批判性地思考一下来源。

如果你打算消费自由放养的数据,你需要保持警惕。不要相信你读到的一切。

它是如何工作的,什么是 schema.org?

schema.org 的想法是在 2011 年由一个财团提出的,这个财团来自通常的嫌疑人:谷歌、必应、Yandex、微软和雅虎。他们厌倦了猜测抓取的网页的内容,所以他们决定创建一个公共词汇表,提供商可以用它来告诉他们什么是什么。这个词汇表嵌入在 HTML 中,表示哪些位描述了一个事件、一个地址、一个食谱等等。它是一个小模式(因此得名!)描述不同类型的信息。当您选择将 schema.org 的 T2 添加到您的页面,并告诉它该页面有一个数据集时,该数据集就有资格显示在数据集搜索结果中。

数据提供者使用 schema.org告诉我们在他们的页面上有一个数据集,并描述关于它的一些元数据。

这不是谷歌特有的魔法;这是一个开放的社区标准,任何人都可以为之做出贡献。许多公司多年来一直在幕后使用它。谷歌特有的功能是你用数据集搜索来搜索数据集的新能力。我们让数据提供者使用schema.org告诉我们在他们的页面上有一个数据集,并描述关于它的一些元数据。数据集搜索与常规搜索非常相似,但搜索结果仅限于声称拥有数据集的页面。简单又有用。

如何参与共享数据

当数据完全来自少数几个负责仔细管理每一个数据的大型提供商(如政府和大学)时,较小的参与者缺乏分享他们数据的渠道。

想象一下这个场景:一群高中女生正在进行一个课外机器人项目。他们正在收集大量数据,这些数据可能对有类似爱好的人有用。他们甚至愿意分享(他们真好)。他们在他们高中的网站上放了一个链接。他们的数据恰好是你需要的,来帮助你的原型制作。现在怎么办?

All-girls Afghan robotics team. Image: SOURCE.

如果他们的数据集不可搜索,你永远也找不到它。如果他们的数据必须由馆长(比如政府)托管才能被访问,他们会被告知要排队…他们可能永远也不会排到前面。花费稀缺资源进行大量监管的提供者只有有限的时间和注意力集中在优先资源上。结果如何?你永远不会知道你错过了什么。

这就是为什么我觉得这整个数据集搜索范式如此漂亮。共享数据(没有中介告诉你迷路)意味着人们可以找到并提供很好的资源,即使他们有小众的品味…或模糊的高中网站。

参与共享可搜索数据:

  1. 你需要有数据。
  2. 你需要表明你有通过schema.org 的数据。(你可以自己做,或者你可以把它放在一个像 Zenodo 这样的仓库里。)

另一个陷阱

我希望你不要惊讶,满足这两个条件的倾向因领域而异。政府是第一批索引其数据集的,所以他们倾向于收集的数据集类型(天气数据,有人知道吗?)是你疯狂进食的绝佳对象,而收集起来代价高昂的专有数据将很少有人能得到。也就是说,每天都有更多的数据被添加进来,搜索为免费和付费数据打开了大门。(有点像 Google Images 里那些带水印的专有图片。)由你来选择你想通过哪些门,以及这些费用是否值得。

人类更大的图景

像数据集搜索这样的大型用户群是人类在数据科学和数据素养方面进步的象征。我们作为一个物种正在成长,并扩展了我们运用感官的方式以及我们与信息交流的方式。

数据分析正在成为每个人的游戏。

我们曾经对在互联网上打开单个页面的能力印象深刻,然后对在我们的浏览器中打开 50 个标签的能力印象深刻——每个数据点一个——以观察混乱的模式。现在我们渴望更多。我们希望数据集可以用为这项工作而构建的代码工具(如 PythonR )快速成型和总结。数据流社区现在已经达到了临界质量;我们中有足够多的人拥有理解数据的技能,我们不再满足于图片覆盖的书面页面。(就是你现在盯着的那种。哈。)

Image: SOURCE.

读写能力的进化

要从像你此刻正在阅读的资料中获取信息,你需要一种特殊的素养。你的大脑需要能够围绕书面文字进行思考。这是你认为理所当然的技能。如果很少有人有这个技能,这篇博客就不会存在了。谷歌可能也不会存在。

数据集搜索代表了数据扫盲民主化的一个上升趋势。

同样地,数据集搜索代表了数据素养民主化的一股浪潮。这整个发展是一种攀登到山顶的方式,并唱着“处理数据不再是一个完全适合的技能!”不再局限于几个抄写员在泥板上雕刻象形文字。(哦,等等,那是写。不过,想法一样。)

在线数据集为自我表达提供了一种新的载体,它遵循与互联网其他部分相同的规则。

数据集搜索有助于您在聊天中发现精华。

数据集正在成为一种广泛的交流形式——一种美丽的新语言,我们许多人都能流利地说,还有更多人每天都在学习。对于我们这些从小就说数据的人来说,能够用我们的语言获得搜索结果是一种极大的解脱。

这就是为什么我对数据集搜索的感觉是直截了当的:“最终!”

娱乐技术详情:

bit.ly/dataset_search试用。

感谢阅读!人工智能课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 TwitterYouTubeSubstackLinkedIn 上找到我。有兴趣让我在你的活动上发言吗?用这个表格联系。

这才是一份好的数据简历应该具备的!

原文:https://towardsdatascience.com/this-is-what-a-good-data-resume-should-have-582f7dfa40e0?source=collection_archive---------9-----------------------

数据招聘人员会在你的简历中寻找什么——建议、技巧和诀窍

我们的世界被数据淹没了。

利用数据洞察的机会从未像现在这样多。但是我们没有足够的熟练员工来帮助我们理解这一切。因此,如果你想成为一名数据人,在未来的 5-10 年里与数据打交道,那么这是你的机会。去赢得那些工作吧!

当你每天都在寻找那份疯狂的高薪工作和令人兴奋的挑战时,这个关于在简历中写些什么的小指南可能会有点用。

为实习或工作申请写简历很少有乐趣。在工作申请截止日期前畏缩不前当你终于开始整理东西时,你会意识到更多的是在一页纸上。大部分的责任在于把所有正确的事情都写在你的一页简历上。当简历通常是工作申请流程的第一层时,越过这道关卡到达招聘人员或招聘经理的手中是一项繁重但重要的工作。

两个月前,当我参加今年的格蕾丝·赫柏庆典时,我遇到了大约 100 多名招聘人员,他们在讨论我的简历,以及我在这一点上有多好,我如何才能在我的个人资料上做得更好。在所有这些疯狂的狂热中,我有幸与迪士尼动画的一位女士进行了一次深入的讨论,她建议对我的简历进行一些编辑和调整,这实际上帮助我更好地传达了我的努力!(感谢那位女士,她的名字我现在不记得了😅)

当招聘人员浏览你的简历时,第一印象是你的简历应该准确反映出你在那一天所做的工作。

你的作品本身就说明了一切,不需要提及,但它确实说明了一切。最近,我参加了一次面试,面试官在整个面试中对我过去的所有努力进行了全面深入的介绍。无编码问题,无伪码可写,纯简历讨论!

因此,

60 多份申请,24 份回复,7 次面试,2 份录用通知……

这才是一份好的数据简历应该具备的!

1.选择一个微妙的模板

我们都被告知外表没有实质重要,但就你的简历而言,这是不正确的。理想的简历设计是干净整洁的,有效地、有策略地使用留白。记住你的简历是你的营销工具。这是潜在雇主对你的第一印象。

有时,我看到一些简历,作为一个读者,有太多的信息需要掌握,有时你会迷失在博学的海洋中,偏离重要的东西。

  1. 你应该考虑用更多的要点来增加对雇主的影响。
  2. 如果雇主看到太多长的文本,他们可能会发现很难集中在最重要的信息上。
  3. 还应该考虑子弹的大小和类型。
  4. 放开职业目标。客观陈述被认为是过时的。如果需要的话,用一行职业总结代替。我个人也没有职业总结。
  5. 申请“大”公司时,简历的风格要更加经典、低调!

要在独特的简历设计中取得成功,创建你的简历,并使用免费网站上的创意简历模板来支持它,如 NovoresumeZetyCreddleCanvaVisualCVCVMKRSlashCV ,甚至是谷歌文档简历模板。

2.技能

数据是一个跨越多个学科的领域,比如医疗保健、金融、食品和饮料、服装、技术、电影、电子商务、歌曲,甚至网飞!从事数据工作的人需要掌握他们所从事领域的各种技能。

也许数据专家最突出的技能是能够分析信息。

作为一名数据人员,她每天可能会开发算法或训练模型,分析数据以了解科学过程,可视化市场趋势,并处理风险管理统计数据。他们必须能够理解模式和趋势,并知道所有这些模式意味着什么。所有这些都需要强大的统计、分析、数学、编程、报告技能等等。

  1. 大数据、批判性思维、数据分析、数据操作、数据争论、数据挖掘、数据建模、数据可视化、数据研究、风险建模、机器学习和测试假设可能是一些好的 技术技能 要具备的。
  2. 适应性、决策、创造力、逻辑思维、解决问题、独立工作以及团队合作、沟通(书面和口头)、领导、汇报、演示、培训、监督都可以 良好的软技能 具备。
  3. 线性代数,多变量微积分,统计学对一个数据科学家来说是很好的 数学必读

在你的简历上

你的简历应该至少有下面列出的技能范围,不限于或不一定是这个。

语言 : C,C++,C#,HTML,Java,JavaScript,Python,R,PHP,SAS

数据库 : SQL Server,MySQL,NoSQL,Oracle DB2,PostgreSQL,MongoDB,CouchDB,Hadoop

可视化工具 : Tableau,PowerBI,MS Excel,MATLAB,Octave

版本控制:GitHub/git lab

devo PS:AWS/Floyd hub/Digital Ocean/Flask

3.项目

当我与招聘人员谈论他们对优秀候选人简历项目的理想期望时,常见的答案是:

我想听听他们最近参与的一个项目。我问他们这个项目是如何开始的,他们如何确定这个项目值得他们花费时间和精力,他们的过程和他们的结果。我还问他们从这个项目中学到了什么。他们为什么选择那个特定的项目?

招聘人员从这个问题的答案中获益匪浅:如果他们能讲述一个故事,这个问题如何与大局相关,以及他们如何解决做某事的困难。

把与你申请的职位最相关的项目放在你的简历上。例如,我是一名金融科技爱好者,参与了大约三个与金融术语相关的项目。现在,当我面试一家金融公司时,我会确保这三个可视化项目中的一个被放在我的简历上。

接下来,如果我申请一家医疗保健公司,我会提出一个可视化项目,谈论保单索赔或预期寿命比率等结果。

4.专业经验

Image Source: Zety

多少工作经验应该放在简历上?

  1. 高级职位候选人=列出长达 15 年的相关工作经验
  2. 初级到中级的候选人=包括你所在领域相关职位的详细工作描述,以及其他职位的简要介绍:实习、临时工作、自由职业
  3. 列出并描述你做过的所有有报酬的工作,包括实习、兼职或临时工作、自由职业、独立项目
  4. 没有专业工作经验的候选人(学生)=包括所有有偿和无偿工作经验:在学生组织中的角色、实习、无偿实习、志愿者经历

一些值得关注的好建议

  1. 避免在简历中写不相关的经历
  2. 包括更多的关键词和技能,帮助你成为更强的候选人
  3. 不要过度使用对你的简历没什么价值的单调词汇。如果需要的话,尽量使用同义词
  4. 使用更多的强有力的动作动词和令人信服的语言来概括典型的成就
  5. 把你的工作经历放在正确的位置
  6. 每个工作描述不要超过 5 个要点
  7. 出来做一个成功者,而不是实干家
  8. 按时间倒序在简历中列出工作描述;从你现在或最近的工作开始,接着是上一份,然后是上一份,以此类推。
  9. 使用积极的语言:通过协商定价和费用,削减了 30%的工资/福利管理成本,同时确保服务的持续和增强而不是仅仅被动地对待你所做的工作:与供应商谈判合同

5.证书

当你在寻找一些额外的东西来为你的简历增色时,执照和证书是一个东西。列出所有适用于工作描述的相关课程。认证通常被认为是对你当前技能的测试标准。

但是,不要将认证与在线课程混淆。在线课程是大学课程的同义词,不一定表明你擅长某项技能。认证可以是谷歌云开发者,谷歌数据工程师,IBM 数据科学专业人士之类的。

几乎每个职业都有你可以获得的认证。无论你是为星巴克、微软还是塔吉特百货工作,简历认证都是证明你拥有技能和知识的重要手段。

如果你还没有,MOOCs 是一个不错的选择。Coursera,Udemy,Udacity,DataCamp,LinkedIn Learning 有很多课程和认证可以查。对于数据人来说,Data Camp 和 Coursera 提供了一些非常酷的东西!

如何在简历中列出证书?

  1. 认证名称
  2. 认证机构或团体的名称
  3. 获得日期
  4. 位置(如果适用)

注意:如果您的认证有截止日期,您也需要添加该日期。不要在简历上列出已经过期的证书。

6.奖励/认可

这是一个非强制性的部分,但可以为有东西要填写的人创造奇迹。

当招聘人员看到我的简历时,我会确保他们阅读了我的奖励和认可。当你在职业生涯中取得了堪称典范的成就时,一定要把它写下来。然而,只有当它不能作为你的教育或工作经历的一部分被提及时,才把它作为标题

我不鼓励在黑客马拉松中加入一等奖获得者。那完全没有必要。如果成就足够显著和令人印象深刻,只在单独的部分列出。你的整个简历应该是关于你的成就,而不仅仅是其中的一部分。总是试着把成就和你的工作经历、教育甚至爱好放在一起。但是如果需要增加一个奖项,在列举你的成就时要非常具体。

随着时间的推移,我从招聘人员那里学到了这六个要点,我的简历无疑改善了它的外观,它的表现和我发出简历时的自信。奇怪的是,当你接到一个面试电话时,你的简历将是一个巨大的证明,这个电话是你全力以赴写的简历。

感谢您的阅读!如果你喜欢这篇文章,点击拍手按钮,让我知道你是否打算修改你的简历。或者如果你是招聘人员,你怎么看!

了解你的作者

Rashi 是一名研究生,也是一名数据分析师、用户体验分析师和顾问、技术演讲者和博客作者!她渴望建立一个组织,将商界女性与资源海洋联系起来,让她们对工作和世界充满热情,无所畏惧。请随意给她留言这里

该职务公告不存在

原文:https://towardsdatascience.com/this-job-posting-does-not-exist-837d25bc849b?source=collection_archive---------17-----------------------

今年早些时候,OpenAI 发布了 GPT-2(Generative pre trained Transformer),这是当前最先进的文本生成模型,可以从小提示中生成一些连贯的段落。自从 OpenAI 发布了其中一个较小模型的模型权重,我就一直渴望测试它的能力。

除此之外,我最近一直在看招聘信息,其中一些要求相当高。每当看到这样的招聘启事,我总会想“有人校对过这个吗?他们怎么认为这是合理的?这是机器人做的吗?”所以我决定测试一下,如果我把一堆招聘信息输入到 GPT-2 模型中,会发生什么情况,看看它们会有什么样的比较。GPT-2 能产生一个连贯的招聘启事吗?GPT-2 会产生更荒谬的招聘信息吗?我的目标是训练一个模型,能够为各种各样的职位发布招聘信息。

这篇文章将介绍如何在自定义数据集上微调 GPT-2,从通过网络搜集获取数据到调整设置和运行模型,并附有相关解释和示例。我将工作发布数据用于我的特定应用程序,但是这篇文章的内容可以应用于其他文本生成任务和数据集。

GPT-2 号的背景

如果你不熟悉 GPT-2 ,它是 OpenAI 发布的最新语言模型,也是 OpenAI 的 GPT 模型的继任者。GPT-2 模型在超过 800 万个网页上进行训练,或者来自 Reddit 的出站链接的大约 40GB 的文本数据,这些链接包含各种各样的主题。虽然由于这种预训练,该模型在一般文本生成方面表现良好,但如果您想在自己的特定任务中训练和使用该模型,您仍然需要自己的小数据集来执行迁移学习和微调最后一层的权重。作为创建我自己的数据集的一部分,我求助于网络抓取来快速获得我想要的数据。

给我看数据

数据集统计 :
*总大小:~210 MB
*职位数量:~450 个职位
*每个职位发布的数量:~100 个
*获取数据的时间:~1 小时

因为我想让 GPT-2 为各种工作创建职位发布文本,所以我从这个博客收集了 450 个职位名称,并将这些值写入一个csv文件。我选择为每个职位获取大约 100 个职位发布,因为我想测试有效训练模型所需的最小数据量。为了相对快速地获得这个有点全面的数据集,我使用了BeautifulSoupasyncio库和一个 bash 脚本,该脚本使用多处理来抓取 Indeed 网站,允许 webscraping 。你可以看看我用来获取数据的脚本这里这里作为一个例子,看看带有BeautifulSoupasyncio和多重处理的 webscraping 脚本是什么样子的。如果你决定也创建自己的数据集并执行网络搜集来完成,我强烈推荐使用asyncio和多个流程来减少时间。

让我们进入正题

一旦你准备好了一个数据集,我会建议分叉这个出色的回购已经有了一个在 TensorFlow 中训练 GPT-2 模型的方法。由于我没有自己的个人 GPU,如果没有必要,我也不想花任何钱来培训这个,所以我决定使用我的本地计算机。虽然有其他选项提供免费的 GPU 使用(Google Colab 或 Kaggle 内核),但这些选项都有使用时间限制。由于我想通宵训练模型,所以我不想担心 GPU 关闭,而是选择在本地训练模型。为了使用存储库中的代码,我必须遵循说明并设置环境,包括安装所需的库和下载模型(117M 和 345M)。从现在开始,这篇文章将引用回购中的脚本。

在训练模型时,我选择使用具有 1.17 亿个参数的模型,以及我从存储在data/job_postings目录中的实际上是中获取的数据集(由于数据的大小,它不在 repo 中)。为了训练模型,我在 repo 的主目录中使用了以下命令。

PYTHONPATH=src ./train.py --model_name ./models/117M --dataset ./data/job_postings --run_name job_postings_6_20_19

在这里,我指定了我使用的模型(117M),数据集,以及存储模型权重的目录名(job_postings_6_20_19)。因为训练模型直到它产生合适的结果可能需要一段时间,所以我让模型运行了大约 8 个小时。然后,我将模型权重从job_postings_6_20_19目录复制到models/117M目录,使用下面的命令进行测试。

python ./src/interactive_conditional_samples.py --top_p 0.9 --model_name 117M

在这里,我使用了--top_p命令进行核心采样,这就像使用动态k的 top-k 采样。Top-k sampling 是一种方法,在这种方法中,每次生成一个单词时,从k个单词中选择一个最有可能被选为下一个单词的单词。--top_k标志的缺省值是 40,但是如果你想有更多的可变性,你可以很容易地使用一个更大的值,或者如果你想让它更具确定性,你可以使用一个更小的值。使用 nucleus (top-p)采样,您设置了一个概率阈值p,这样您就可以考虑有多少个词累积起来将达到被选择的概率阈值。这样,在模型确切知道下一步要选择什么的情况下,你可能只考虑一个词,但如果模型不确定,你可能会考虑更多。这种细胞核取样防止模型产生过度重复的序列。

键入该命令后,出现以下输出:

Model prompt >>>

此时,您可以输入任何想要的起始文本。在我的例子中,我输入了职称以获得我的模型的回报。以下是一些精选的结果。

结果

在这里,我将通过 4 个例子来说明模型在哪些地方表现良好,哪些地方表现不佳。

所以当我输入提示Data Scientist的时候,这是我得到的结果。

Gather and analyze all outputs of activities and operations. Provides guidance to ensure timely calibration, understanding and calibration of data, and to support overall execution of execution plan. Provides guidance on various operational goals, critical metrics, and activities carried out through the conversion of data (data sheets, charts, graphics, charts and tables) to and from mainframes and delivery schedules. High level of expertise and service delivery at a cost efficient manner. Prior experience under management associated with data support contracts.        Benefits        Receive support from multiple disciplines, including Clinical, BPO, Healthcare, Information Technology, CRM, In-GPO, IBM, NASA, Data System Engineering, and others.       Compensation & Benefits In a typical first year position, Microsoft offers a reasonable compensation package (down to $30,000-$40,000 depending on the type of position). Basic benefits include Medical, Disability, and Pension. If this option is available for you, you will receive fair compensation and benefits, including up to two full-time and part-time days in a year. We are looking for someone who:  Relies on excellence in the HR and data science fields  Works hand in hand with colleagues and with Microsoft’s colleagues to enable innovation in a company-wide, engineering-driven culture      Leadership and leadership skills in achieving goals, keeping customers interested, and helping each other  The Microsoft HR team is a team based in Redmond, WA and provides full-time, part-time and occasional holiday leave. The team is comprised of engineering, business and other development specialists.     Maintains strict confidentiality and confidentiality policies while dealing with employees in all activities related to the company’s external business.   Provides technical support to external vendors in connection with the Company’s internal business activities.   Conflicts of interest / Ethics     Maintains a strict ethical code of conduct, including the following:    No (non-indirect) contact with the employee, including but not limited to, a publication of unsolicited business tactics, actions or representations. No appearance of undue influence on our internal or external vendors, vendors, staff, or the Executive team  No unlawful communication of information to the employee, including posting on LinkedIn in an effort to influence the employee to choose those indicated by the employee in conversations with the Executive team.

至少,这种模式产生了一个有点令人信服但毫无吸引力的招聘信息(因为报酬低)。

下面是我放入标题Accountant得到的。

Benefits & Duties
        Estimates and analyzes information received from users, employees, clients and vendors. Makes recommendations to manage and improve the business, financial status and business operations of the enterprise and manages and provides service to individual client/ vendor groups. Assesses future compliance requirements to ensure success for the company.Comprehensive Coordination of Strategy, Product Management, Business Development and Process Development, Demography, Manager Development, Information Assurance, Remediation, Cost Accounting and Risk Management. Conducts budgeting audits to ensure alignment with overall company budgets and objectives.      Manages transactional relationships with other departments and programs.   Is helpful with weekly recurring updates and Budgeting etc.     Acts as a liaison with senior team leaders.     Acts as the information or research advisor to all members of the company. Acts as a front-line caseworker or an internal consultant on any product, plan, initiative or project.  At least 4 years of experience dealing with varied budgets.        Experience with Salesforce, Salesforce Hadoop or Equation, CRM, MySQL, Puppet or Redshift, CRM Software, CRM Storage, Data SaaS or Any other software or scripting language.       Experience with SQL.    Experience with the SQL Server Standard Database (SSD). Experience with assisting vendors in data warehousing.  Proven record in the ability to manage and address the following activities for a variety of operational tasks as well as tasks and processes within an enterprise.        Benefits        We offer monthly or weekly 401k plan, 24/7 live chat, Senior management and the ability to setup a monthly IRA.    The opportunity for advancement in this position is open to all employees with similar experience and ability to perform the duties as required.   Job Type: Full-time     Salary: $60,000.00 to $60,000.00 /year  Experience:     Scheduled B2B or B2C: 3 years (Preferred)  Location:       San Francisco, CA (Preferred)   Work authorization:     United States (Required)        Benefits offered:       Paid time off   Health insurance  Dental insurance Retirement benefits or accounts Commuting/travel assistance     Paid Training:  Yes     Pay Frequency:  Bi weekly or Twice monthly<|endoftext|>

除了技术要求(MySQL、Puppet、Redshift 等)之外,这实际上看起来像是一个会计岗位。).

不幸的是,并不是所有我给模型的提示都很成功。这是我输入标题Data Engineer后得到的结果。

Keywords: Customer Relations, Relationship Management, Sr. Service, Sr. Education, Service, Sr. Data Management, Sr. Data Analysis, Sr. Technical Support, Sr. User Experience, Sr. Service, Sr. Customer Relationship Management, Sr. Data Analysis, Sr. Quality Assurance, Sr. Products & Services, Sr. Business Development, Sr. Management, Sr. Director, Sr. Legal, Sr. Manager, Sr. Counsel, Sr. Account Executives, Sr. Employees and Accounts, Sr. Regulations and Rules, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business Development, Sr. Business

那……肯定不太对劲。不幸的是,细胞核取样在这里似乎没有帮助。我猜这份工作真的想强调数据工程的高级业务开发部分。

这里有一个职位为Hairdresser的招聘启事。

(Bon Appétit)Weekends:Monday-Friday 8:30am-6:00pm 9:30am-6:00pmPacific Crest:Monday-Friday:9am-5pmSaturday:8:30am-5:00pmSunday:Sunday (Saturdays)LeasingPlace:DeKalb CityWest RdSuite 1Roof and Mountainen AvenueRoofloomTalk, Portland (Parker and Union)Classic per H&R Block & Perk Parking standing space,hence a classification plan on top of downtown.Signed off on per week specials for entire week:Shipping directly to the studio, resupply on weekends through outship.Trash coasters, pots, microwaves, polishing and several other applications.Comfortable with special requests, and have a personable attitude to being so passionate about who we are, what we do and what we do not do.Registered Shift Coordinator with little or no day time schedule. Problem solve immediately after shift departure is preferred.One hour shift and are paid $10 an hour. This is a great opportunity for a respected, experienced shift coordinator who has a sense of humor and a creative spirit. If you are a quick learner (starting at age 5) who can handle a lot of other people or live in a city with a lot of low-paid companies, this is the job for you.Profit Sharing expense. Is paying a server a 50% or 75% discount on pizza when you are a client. The Best Option for someone who wants to start in the world. We are your dream employer. All sales are privately owned and open to all candidates and we're a super fun job.We provide full service for both our clients and staff. We treat each client with dignity and respect.We are welcoming and responsible for all activities and expenses. Ensure reasonable accommodations for other clients and employees when applying.We work hard to give you the best possible business experience that reflects our highest standards. We have a tough time accepting positive but not hostile feedback.We can do better than that.Please send an email to the ideal candidate.
Required:
If you are not currently an Employer with your private hire preference, please send this info along with your preferred picker:
Yes (Please Subject Link an Email with the relevant info). Please include:
Yes (Please Subject Link an Email with the relevant info). Please include: Yes (Please Subject Link an Email with the relevant info).
Rec

这是我个人最喜欢的之一,因为它是如此的荒谬。我特别喜欢We are your dream employer.If you are a quick learner (starting at age 5) who can handle a lot of other people or live in a city with a lot of low-paid companies, this is the job for you.这两句台词,它们是对招聘广告中一些台词的滑稽模仿;如果我不知道的话,我会说写这个的人在喜剧界有前途。

想法&建议

虽然我没有任何严格的统计数据来说明为什么某些招聘信息不尽如人意,但我怀疑这要么是因为缺乏数据,要么是因为培训不够。职位列表中有不少带有“工程师”字样的职位,包括Biological EngineerChemical EngineerDevOps EngineerChief Engineer等。我怀疑这个模型不能用所提供的数据量来区分不同的工程职位。或者,数据可能已经足够了,但是在 CPU 上训练 8 个小时可能还不够。如果你决定训练你自己的 GPT-2 模型,我建议你获取比我更多的数据,或者训练比我更长的时间以获得更好的结果。

看起来,至少 GPT-2 学会了招聘启事的一般结构和表层语义理解,但似乎缺乏对什么适合或不适合招聘启事的更深层次的理解。虽然这些精选的样本肯定不比网上的好,但很难判断其中是否有一些是假的,而且对其在更广泛的社会中使用的担忧似乎是相当合理的。

因此,我最初问题的答案似乎是(至少是轶事般的)是的,GPT-2 可以产生一个连贯的招聘启事,是的,GPT-2 可以产生比已经存在的更荒谬的招聘启事。

如果你想知道更多关于 GPT-2 如何工作的技术细节,看看这篇博客文章,它有一个很容易理解的解释和更多的技术细节资源。

像往常一样,如果您有任何问题或建议要改进,请告诉我。

这种随机的生活

原文:https://towardsdatascience.com/this-stochastic-life-5146368bfd59?source=collection_archive---------23-----------------------

Source: Wikimedia Commons under CC BY-SA 3.0

我们日常生活中有趣的随机线索

现在是早上。我的咖啡杯装得太满了。我心不在焉地盯着从杯子边上滴落的一滴水。它沿着一条曲折的道路努力到达底部。有那么一会儿,我支持它,然后我注意到时间,开始行动。那天早上晚些时候,我开车去上班,停好车,走出停车场,然后撞上了一位久违的朋友。我和我的朋友都不知道,我们的眼睛以一种看似随机的几何图案扫描对方的脸几十次,直到大量的相互识别出现。中午时分,我在附近的一家餐馆又赶上了他。这个地方又挤又吵。灵光一现,我打开手机上的谷歌科学杂志应用程序,开始记录我周围的分贝水平。三十分钟后,我停止录音,把手机放回口袋,付了账。我们走出餐厅,握了握手,并承诺很快会再这样做,我们走在下午的阳光下。

Noise level in dB measured at a restaurant over a period of 30 minutes (Image by Author)

当谈到将随机性编织到我们的生活中时,大自然选择了长线。无论是蜿蜒的一滴咖啡,还是当我们扫描一张脸时眼睛追踪的模式,或者是房间里的噪音水平,或者是我们每天早上喝咖啡的次数,或者是淋浴的时间,或者是我们花在通勤上的时间,或者是我们每天发送的电子邮件数量,我们永远都在编织一系列又一系列的随机事件。

然而,尽管有这些随机性,我们的生活并不是一团乱麻。我们的生活有一个结构,并且有相当多的可预测性。

要了解原因,我们必须仔细观察这些随机现象。当我们仔细观察时,我们会发现一些有趣的特征。

有界性

首先容易发现的是,我们所谓的随机实际上是在 a 值范围内有界的。当然,有几天交通拥堵得令人麻木,但在大多数日子里,我每天都在同一时间到达工作地点,相差 30 分钟。

相同分布

在现实生活中,影响某种特定随机结果的不同因素,比如我周一上午会议的持续时间,从一个周一到下一个周一不会有太大变化。

我发现我的工作场所会议的持续时间会受到出席人数、议程上的主题数量、主题类型以及其他一些因素的影响。在任何一天,都会有很多相同的因素。

这个性质的实际后果是,随机变量,星期一会议的持续时间,具有与下星期一会议相同的可能性分布,以此类推。我们说随机变量——周一会议持续时间——是同分布的。每个随机值都是从相同的值分布中抽取出来的。

(Image by Author)

独立(或不独立)

另一个值得注意的特点是,以前的结果并不总是影响今天的结果。例如,我昨天午餐吃了多少口,通常不会影响我今天吃多少口三明治。两个随机变量:昨天的叮咬和今天的叮咬是相互独立的。

但这种类型的独立并不总是可见的。例如,当餐馆里的吵闹声越来越大时,人们开始大声说话以使自己被听到,然后其他人不得不通过扩音器更大声地说话以使自己被听到,等等。随机变量——餐馆的分贝水平——不具有独立性。事实上它是 自相关

这种相关性的实际后果是,我的手机一秒钟前记录的分贝水平可能被用来预测下一秒钟将记录的值。

人们可以将前两个属性合并成一个新属性。

独立同分布变量

当序列中的随机变量具有相互独立的结果,并且它们也具有相同的概率分布时,它们被称为独立同分布变量。

I.i.d .变量似乎在很多情况下都会突然出现。如果你花一分钟时间凝视一条繁忙的街道,记下路过的每辆车的品牌,你将构建一个随机序列,如下所示:

A random sequence of vehicle occurrences by brand. Random variable = vehicle brand (Image by Author)

这里的随机变量是经过的车辆的品牌。在这一秒钟里,你会看到一辆尼桑、一辆福特、一辆吉普或任何其他品牌的汽车,这并不取决于前一秒钟经过的是哪一个品牌的汽车。所以变量的结果是相互独立的。

此外,在这一秒看到尼桑或福特或吉普的概率与在下一秒分别看到尼桑或福特或吉普的概率相同,并且在之后的第二秒分别相同,以此类推。因此,变量也同样分布。它们的结果都来自同一个分布。

其他 id 序列的例子有一系列的硬币投掷,任何种类的随机噪音,如电话线上的嘶嘶声,以及在公共汽车站排队的人的年龄。

但是在现实生活中, i.i.d .变量很少。如果一个人足够深入地观察这一现象,他通常可以发现某种因果关系或某种相关性的证据。但是如果一个人愿意在纯粹性标准上放松,那么 i.i.d .变量序列确实到处都可以找到。

那么 i.i.d .变量有什么大不了的?

I.i.d .原则被用来发现你辛辛苦苦构建的预测模型是否值得你骄傲。这种确定工作如下:

  1. 创建模型。
  2. 使其符合训练数据。
  3. 生成残差的时间序列。
    残值=观察值减去模型预测值。
  4. 检查残差的时间序列是否满足 i.i.d .的标准,即残差值不是自相关的,而是同分布的。
  5. 如果满足这些标准,特别是独立性标准,残差的时间序列代表纯噪声,并且您的模型是您数据集的最佳模型。
  6. 另一方面,如果剩余时间序列不满足 i.i.d .属性,这意味着剩余时间序列中仍有一些您的模型无法检测到的“信号”。因此你需要改进你的模型。

A simple way to use i.i.d. variables in time series forecasting (Image by Author)

一些常见的随机过程

我们注意到随机序列的惊人特性:无论产生这些序列的环境有多么不同,它们中的许多都有惊人的相似之处。正是这些相似性让我们能够非常详细地研究随机序列。我们首先把它们分成这样或那样的类型。

让我们看看一些常见的序列类型以及它们出现的情况。

我的伯努利通勤

在我每天上班的路上有一个我习惯性避免的坑。事实上,我的路线上有许多坑洼,但我现在会谈论这一个。

为了避开坑洞,我不得不把车开到坑洞的左边,或者右边。在任何一天,我采取的策略取决于我的速度、接近角、我的车旁边是否有车辆等等。但影响我策略的总是同一套因素。如果每天我都记下我是导航到了坑洞的左侧还是右侧,我会得到这样的时间序列:

A Bernoulli Sequence (Image by Author)

这是一个伯努利序列的例子。

一个特定的伯努利序列是伯努利过程的一个实现,伯努利过程由同 i.d .随机变量组成。

序列中的每个结果,如左或右,都是一个伯努利试验的结果。

对于一个符合伯努利试验的结果,左和右两个可能的结果都需要有一个固定的概率:p 和(1-p)。如果我们将值与左和右的结果相关联,如下所示:左=0,右=1,伯努利序列的图将如下所示:

A 0–1 Bernoulli Sequence (Image by Author)

我想要的只是一个简单的伯努利通勤,但我得到的是一个…计划??

尽管我已经把它理解成一门近乎完美的科学,但有时我还是会忘记那个坑,直接开车去撞它。所以在现实生活中,我的伯努利过程是多值,它看起来像这样:

A Bernoulli Scheme (Image by Author)

像这样的多值伯努利过程被称为伯努利方案

如果我们将值-1 赋给左边,0 赋给凸起,1 赋给右边,我们将得到这样一个随机序列:

(Image by Author)

伯努利方案也是独立同分布变量的随机时间序列。但是在伯努利方案中,每个变量可以取许多值 v1,v2,v3…vn 中的一个,每个都有固定的概率 p1,p2,p3…pn ,比如所有概率之和等于 1.0。

因此,伯努利方案可以被认为是伯努利过程的推广。

随意走到浴室

下次你看到树叶在微风中沙沙作响,或者旗帜在风中飘扬,或者你的雨伞在暴风雨的日子里在你的头上被扔来扔去,想想随机漫步过程。树叶或旗帜或雨伞上的任何一点所采取的几何路径是三维的随机行走。

如果你想知道的话,你每天早上从床上到浴室的东倒西歪并不是随机漫步。我们一会儿就知道为什么不是了。

同时,简单的一维随机行走可以被认为是伯努利过程的简单扩展。要计算随机行走序列中下一个点的值,需要做三件事:

  1. 进行一次伯努利试验,其中两个结果中的一个赋值-1,另一个赋值+1。
  2. 将您刚刚获得的随机结果的值添加到您正在构建的随机行走序列的当前值中。这将给出序列中的下一个值。下一个值现在成为序列中的当前值。
  3. 根据需要多次重复步骤 1 至 3。

实际上,RW 序列中的下一个值是迄今为止所有伯努利试验结果的标量或矢量和。

下图显示了使用上述程序人工生成的 1-D 随机行走序列:

A 1-dimensional random walk (Image by Author)

这种一维随机游走,如果持续很长一段时间,有回归到平均值的趋势,这是…你猜对了!零。

现在去我的浴室怎么样?

在自然界中,纯粹的随机漫步是罕见的,原因与纯粹的伯努利序列是罕见的一样。看起来像随机漫步的序列通常不是这样。

因此,你会被原谅,因为你相信每天早上当你的脚带着你的身体离开床走向浴室时,它们所走的路是随机的。即使这看起来像是随机漫步,但事实并非如此,原因如下。

My morning stagger (Image by OpenClipart-Vectors from Pixabay under Pixabay license)

请注意,当你的脚落在地板上的某个地方时,你的身体向那个方向倾斜,导致你的大脑让你的另一只脚落在一个位置,以补偿这种倾斜,从而防止你翻倒。

因此,在一个时间步中,你的脚在地面上的位置与你另一只脚在上一个时间步中的位置相关。

因此,即使单个脚的位置可能来自相同的分布,两只脚的位置也很难相互独立。换句话说,你的早晨错开是一系列结果(可能)是同分布的,但绝大多数肯定不是独立的。因此不是随机漫步!

正是这些细微之处使得大多数类似随机漫步的过程无法成为真正的随机漫步。

股票好像赚不到钱。它们肯定都是随机漫步吗?

被认为是随机游走的一个著名例子是股票价格的上下波动。有人认为股票价格是以随机游走的方式运动的。根据这一假设,通过在短时间内进行高频率交易,不可能在股票市场上赚很多钱。但是这个观点被争议

FTSE-100 index 1984–2014 (Source: Wikimedia Commons under CC BY-SA 3.0)

现在回顾一下随机过程的一些基本性质

  1. 随机过程是随机变量的有序序列。
  2. 随机变量可以相互独立,也可以不相互独立。
  3. 随机变量可以具有或不具有相同形状的分布。
  4. 随机过程要么是平稳的,也就是说,用外行人的话来说,它不表现出任何趋势,要么,它可能表现出各种趋势,如周期、季节性或特定的局部或全局趋势。
  5. 如果一个随机过程由独立同分布的随机变量组成,那么它就是一个严格的平稳过程。它没有表现出任何趋势。
  6. 随机序列是随机过程的实现

记住这几点,让我们再来看一个随机过程。这是令人难以置信的普遍和非常有用的…鼓作用…泊松过程。

泊松过程

泊松过程由一系列随机变量组成,每个随机变量遵循泊松分布。这就引出了一个问题,什么是泊松分布?我举个例子解释一下:

假设你是一名城市规划者,任务是计算出你所在城市的一些街道要加宽多少,以便它们能够支持未来 5 年的交通增长。就其中一条街道而言,交通预测显示,五年后,平均每分钟将有 40 辆车来往该街道的各个方向。

请注意,您拥有的预测数据是针对 平均 流量的。因此,从现在起 5 年后,在任何给定的分钟内,在那条道路上行驶的车辆的实际数量可能是 0、5、20、32、44……几乎是道路的最大物理容量的任何随机值。

那么你应该拓宽街道以容纳每分钟 45 辆车,还是每分钟 50 辆车,还是 55 辆车…?

如果有人告诉你,流速是每分钟 45,或每分钟 50 或 55,等等,会对你有所帮助。然后,您可以决定只规划出现概率比平均值大 2 个标准差的交通流率。

在这个例子中,随机变量' X' 是每分钟的车辆数。如果你假设这个随机变量具有泊松分布,你将通过使用下面的公式得到你需要的概率信息:

Formula for the Poisson distribution (Image by Author)

其中 X =表示流速的随机变量。
P_X(k)是每分钟看到 k 辆车流量的概率。
λ=平均流量。在我们的例子中:λ=每分钟 40 辆车。

上述公式被称为泊松分布的概率质量函数(PMF ),产生以下概率曲线:

(Image by Author)

红线标出了在 2 个标准偏差处的流速,即 0.037295,远离该分布中发生的平均可能性 0.009901。该点比平均概率 0.009901 大两个标准差,对应于每分钟 45 至 46 辆车的流量。

现在根据你得到的道路宽度表的流速,你现在可以建议道路加宽,比如说,每边 12 英尺。从现在起,这应该涵盖大约 95%的可能流速。

是不是很酷?

既然我们知道泊松分布是多么的有用,让我们重新关注泊松过程,我们之前说过它是一个泊松分布的随机变量序列。

A sequence of Poisson distributed variables (Image by Author)

上图中, X_0,X_1,X_2,…X_k 是个体随机变量,每个都有一个泊松分布。

但是泊松过程不仅仅是一系列的泊松变量。

泊松过程还可以告诉你从测量开始到某个时间 t 某个事件发生的频率。

换句话说,我们需要定义一组新的随机变量 X(0),X(1),X(2)…X(t) ,使得:

X(0)= t = 0 时发生的事件数。这个值通常被认为是零,这是序列的初始值。
【X(1)= t = 1 时发生的事件数,依此类推,直到,
X(t)= t 时发生的事件数。

正是这些随机变量: X(0),X(1),X(2)…X(k)…X(t) 实际上构成了我们认为的泊松过程。每一个都表示在一段时间 t 内已经发生的事件的数量

那么对于 X(0),X(1),X(2)…X(k)…X(t) 的分布我们能说些什么呢?

神奇的是,而且这一点都不明显,至少对我来说不是,可以非常优雅的证明 X(0),X(1),X(2)…X(k)…X(t) 也服从泊松分布!

这一发现再次证实了我们最初对泊松过程的定义,即泊松分布变量的集合。

泊松过程无处不在,在超市的收银台,在麦当劳的免下车窗口,或者在你医生的候诊室。或者甚至在一个非常小的尺度上:从你打开开关的时刻到某个时间 t,通过导体横截面的电子数量,可以用泊松过程来建模。

何时使用泊松模型

在对时间序列现象进行建模时,当您注意到以下情况时,应该考虑基于泊松过程的模型:

  1. 事件发生的 平均 速率你是知道的。例如,平均每小时有 20 辆汽车到达免下车窗口。
  2. 在任何时间间隔内发生的事件的实际数量恰好围绕平均速率随机波动。
  3. 在任何时间间隔内发生的事件数量与任何其他不相交时间间隔内发生的事件数量无关。用技术术语来说,该过程被称为具有独立增量的属性。
  4. 最后,假设任何时间间隔内的事件分布为泊松分布,并且您怀疑该分布的形状仅取决于所考虑的时间间隔的长度,例如 10 分钟、1 小时、1 周、30 秒等。换句话说,分布的形状不取决于序列中区间的位置。这是过程静止的标志。

还有许多其他有趣的随机过程,我们在日常生活中会不知不觉地遇到。一些众所周知的是:

二项式过程——想想在 n 次掷硬币中得到 k 个人头的概率的实验,

马尔可夫链其中下一个事件依赖于(并且依赖于)前一个事件的值。换句话说,这与我们之前讲的伯努利序列完全相反,在伯努利序列中,每个事件都完全独立于其他事件,

和维纳过程,后者本质上是随机行走的推广。这基本上是一个非常微小的步伐随机行走。布朗运动可能是维纳过程最著名的例子。

所以下次你发现一些看起来随机的东西,退后一步,看看它是否是一个更大的随机难题的一小部分,一个可以通过这些美丽的过程之一来建模的难题,从中会出现有趣的预测。

相关阅读

[## 泊松分布公式的直觉

这是二项式的极限。但是为什么呢?

towardsdatascience.com](/the-intuition-for-the-poisson-distribution-formula-34c5e52f4e04) [## 泊松过程:你需要知道的一切

并学习如何使用 Python 来模拟它

towardsdatascience.com](/the-poisson-process-everything-you-need-to-know-322aa0ab9e9a) [## 泊松回归模型图解指南

和使用 Python 的泊松回归教程

towardsdatascience.com](/an-illustrated-guide-to-the-poisson-regression-model-50cccba15958) [## 负二项式回归:逐步指南

外加一个关于负二项式回归的 Python 教程

towardsdatascience.com](/negative-binomial-regression-f99031bb25b4)

如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。

这个东西叫做重量衰减

原文:https://towardsdatascience.com/this-thing-called-weight-decay-a7cd4bcfccab?source=collection_archive---------0-----------------------

介绍

在我之前的文章中,我提到过数据增强有助于深度学习模型很好地推广。那是在数据方面。事情的模型方面呢?在训练我们的模型时,我们能做些什么来帮助他们更好地概括。

我们做 重量衰减

模型的参数

我们从上面的图片开始。我们看到我们有一堆数据点,我们不能用一条直线很好地拟合它们。因此,我们使用一个二次多项式来这样做。我们还注意到,如果增加多项式的次数超过某个点,那么我们的模型就会变得太复杂,并开始过度拟合。

这意味着为了防止过度拟合,我们不应该让我们的模型变得太复杂。不幸的是,这导致了深度学习中的一个误解,即我们不应该使用大量的参数(为了防止我们的模型变得过于复杂)。

重量衰减的起源

首先,真实世界的数据不会像上面显示的那样简单。真实世界的数据是复杂的,为了解决复杂的问题,我们需要复杂的解决方案。

拥有更少的参数只是防止我们的模型变得过于复杂的一种方式。但这实际上是一个非常有限的策略。更多的参数意味着我们神经网络各部分之间更多的相互作用。更多的互动意味着更多的非线性。这些非线性帮助我们解决复杂的问题。

然而,我们不希望这些交互失去控制。因此,如果我们惩罚复杂性。我们仍然会使用很多参数,但是我们会防止我们的模型变得太复杂。体重衰减的想法就是这样产生的。

在我关于协同过滤的文章中,我们已经看到了权重衰减。事实上,fastai 库中的每个学习者都有一个参数,叫做权重衰减。

这个东西叫做重量衰减

惩罚复杂性的一种方法是将我们所有的参数(权重)添加到损失函数中。嗯,那不太管用,因为有些参数是正的,有些是负的。那么如果我们把所有参数的平方加到损失函数中。我们可以这样做,但这可能会导致我们的损失变得如此巨大,以至于最好的模型是将所有参数设置为 0。

为了防止这种情况发生,我们将平方和乘以另一个更小的数。这个数字叫做 重量衰减wd.

我们的损失函数现在看起来如下:

Loss = MSE(y_hat, y) + wd * sum(w^2)

当我们使用梯度下降更新权重时,我们执行以下操作:

w(t) = w(t-1) - lr * dLoss / dw

既然我们的损失函数有两项,那么第二项的导数 w.r.t w就是:

d(wd * w^2) / dw = 2 * wd * w (similar to d(x^2)/dx = 2x)

也就是说,从现在开始,我们不仅要从权重中减去learning rate * gradient,还要减去2 * wd * w。我们从原来的重量中减去一个常数乘以重量。这就是为什么它被称为重量衰减。

决定 wd 的值

一般来说,wd = 0.1工作得很好。然而,fastai 的人在这方面有点保守。因此 fastai 中重量衰减的默认值实际上是0.01

选择这个值的原因是,如果你的体重下降太多,那么无论你训练多少,这个模型都不会拟合得足够好,而如果你的体重下降太少,你仍然可以训练得很好,你只需要稍微早一点停止。

我已经在这个 jupyter 笔记本中演示了这个概念。

这是一个多类别(而不是多标签)分类问题,我们试图预测植物幼苗的类别。

我使用了 3 个重量衰减值,默认值0.01,最佳值0.1和一个大值10。在第一种情况下,我们的模型需要更多的时期来适应。在第二种情况下,它工作得最好,而在最后一种情况下,即使在 10 个时期之后,它也从来没有完全适合。(参见差异 b/w 培训和验证损失。)

这就是本文的全部内容。你可以在这里了解其他正规化技术

如果你想了解更多关于深度学习的知识,可以看看我在这方面的系列文章:

[## 深度学习系列

我所有关于深度学习的文章的系统列表

medium.com](https://medium.com/@dipam44/deep-learning-series-30ad108fbe2b)

~快乐学习。

这是在哥本哈根举行的 2019 年第 13 届推荐系统会议

原文:https://towardsdatascience.com/this-was-the-13th-conference-on-recommender-systems-2019-in-copenhagen-db438e1495c2?source=collection_archive---------19-----------------------

Image with Courtesy taken from https://recsys.acm.org/recsys19/

9 月是全球推荐系统社区繁忙的一个月——这两周充满了来自学术界和工业界的最新科学见解和应用,约有 1000 人聚集在丹麦和瑞典。作为推荐系统研究的领先会议,第 13 届 ACM 推荐系统会议于 9 月 15 日至 20 日在哥本哈根举行。它以周日的博士研讨会开始,随后是三天的主要会议,最后两天是大量的研讨会和辅导。就在北边 230 公里处,一周前哥德堡举办了关于推荐系统的 ACM 暑期学校,作为主要会议的预备项目,该学校也提供了大量的见解。

RecSys 2019 中的几个数字…

  • 909 名参与者:73.4%来自工业界,26.6%来自学术界
  • 主要会议:2 场主题演讲,7 场论文会议,每场 6 场演讲,以及 2 场行业会议
  • 6 次辅导和 12 次研讨会
  • 36/189 份长篇论文被接受(19%)
  • 40/165 篇短文被接受(24%)
  • 提交最多的前三名国家:美国(22.0%)、中国(9.3%)、德国(7.1%)

RecSys 研究的责任、可重复性、进展和影响

今年的 RecSys 创下了新的参与者记录,并提供了有见地的主题演讲、论文、海报和行业演示,以及一个大的交流空间。它还充满了对推荐系统研究的科学实践、严谨性、相关性和影响的合理和建设性的批评。这种批评是由外部演讲者和深入研究社区的人提出的。

主要会议的第一天以米蕾尤·希尔德布兰特关于“从行为主义者的梦中醒来”的主题演讲开始。方法论的完整性与 GDPR 的“T1”。作为一名职业律师以及布鲁塞尔和奈梅亨的教授,她致力于法律和技术的交叉领域(参见她的书:计算机科学家的法律)。她以功能失调的行为广告为例,将行为搜索、广告和推荐系统的结合与打开潘多拉魔盒相比较。她提倡更科学的严谨性,并质疑推荐系统所带来的反馈循环。她的演讲引发了一场关于定量研究的相关性的有趣讨论,如果定量研究过于主导,可能会破坏研究的其他相关方面,如以可证伪的方式正确呈现假设

"不做假设,我们甚至不能把脚抬离地板."

她结束了自己的演讲,主张降低研究速度,但提高质量(为了好的方面)。

她的演讲只是对推荐系统研究者的一系列令人耳目一新的忠告之一。今年的最佳长论文奖颁给了作品“我们真的有很大进步吗?对最近神经推荐方法的令人担忧的分析。他们对近年来在顶级会议(KDD、SIGIR、WWW、RecSys)上发表的 18 篇提出神经网络方法的论文进行了批判性评估。在他们的论文中,他们专注于两个标准,可重复性和进展。不仅他们只能复制 7 篇论文,即 39%,而且他们可以用简单的基线击败大多数结果,这一事实让观众感到惊讶,并强调了担心的必要性。
这篇论文是建设性的,除了批评之外,它还为更具可重复性和竞争力的未来研究提供了建议。此外,它承认数据集、评估协议、指标和基线的变化使得很难找到共同点。就个人而言,我认为我们都认识到深度学习在推荐系统中非常有用,它已经成为推荐系统不可或缺的一部分。但它的有用性取决于数据量和稀疏性,以及神经模型预测上下文、顺序和边信息的程度。处理多模态是深度学习的一个巨大优势,不言而喻的是,这些数据——如果可用的话——应该被用来更好地个性化(另见
Twitter 上的这个讨论)。因此,我认为这些批评更多地是对以下几点的个人建议:

  • (更好地)证明根据上下文使用评估协议的合理性(这在已经“神经前”的时代被认为是有问题的)
  • 提供您的结果所基于的代码、数据和模型
  • 共享用于预处理、超参数优化、评估和基线的代码,以允许独立验证
  • 通过选择正确调整和完整描述的适当基线算法,避免神经网络方法的虚幻进展
  • 不要仅仅因为其他神经模型的复杂性,就想当然地认为它们是竞争性基线
  • 利用适当的技术来促进可重复的研究,如打包、虚拟环境和虚拟化

特别是,关于最后一点,我强烈推荐 PyCon 的这个演讲。Valerio Maggio 关于“机器学习中的再现性和选择偏差”的 DE 2018。它包括关于如何使您的作品可复制的实用建议:

Slide from “Reproducibility, And Selection Bias In Machine Learning” by Valerio Maggio at PyCon.DE 2018

缺乏可重复性似乎不仅是 RecSys 研究中的一个明显问题,在其他与人工智能相关的领域也是如此。截至 2019 年,NeurIPS 的第一个再现性主席遇到了这个问题,并要求提交者检查机器学习再现性清单,作为论文提交过程的一部分。这也有利于 RecSys 会议为可重复研究寻找共同基础。

然而,最终,我们应该避免将草率的科学实践与深度学习的潜在劣势混为一谈,并努力使我们的结果稳健而持久。这种分离和严格性也确保了深度学习或其他有前途的方法不会不公平地归因于糟糕的结果。

最后但同样重要的是,明尼苏达大学教授、著名的 GroupLens 研究实验室负责人约瑟夫·康斯坦(Joseph Konstan)在关于推荐系统影响的第一次研讨会的主题演讲中分享了他的愤怒。

Slide from Joseph Konstan’s Keynote on “Recommending for Impact: Intentions, Algorithms, and Metrics”

这与之前 RecSys 会议上提出的批评如出一辙,即太多方法只关注排名指标的优化。但是他们有更多的目标——如果处理得当——也可以预见到很多对个性化的社会批评。例如,这涉及到更多样化、更偶然的推荐和更高的公平性。然而,我相信这种主题多样性至少在研讨会中获得了更多的关注,例如,谷歌首席科学家 Ed Chi 在关于多利益主体环境中的建议的研讨会(RMSE) 中发表了关于“从阿罗不可能定理到多利益主体、多任务和更具包容性的建议”的主题演讲。

一些亮点

尽管有这些批评,但还是有光明。社区用来自多年深入研究的声音来质疑自己。在我看来,社区层面的自我批评和告诫强调了研究社区的健康。结合推荐系统日益增长的相关性及其在指导行动中的影响和责任,我们面前有大量的工作要做。围绕深度学习和强化学习,尤其是 bandit 算法,有许多伟大的贡献。但是该领域也变得更加多样化,如上所述,在多目标、多任务和多利益相关方方法方面做出了贡献。总会有令人耳目一新的方法和领域出现,例如都柏林大学的 Berndsen 等人的最佳短文奖“Pace My Race:recommended for Marathon Running”。他们的方法为马拉松运动员提供实时指导,调整和解释建议,以确保他们到达终点并保持理想的配速。

特别是,关于建议的强化和稳健估计器的展示研讨会是会议结束时的一个亮点。Craig Boutilier 就推荐系统的强化学习的一些挑战发表了颇有见地的主题演讲还宣布了 RecSim:一个可配置的推荐系统模拟平台。这是继去年发布的 reco-gym 之后,Criteo 推出的在线广告产品推荐强化学习环境。紧接着,Criteo 还宣布了它的 RecoGym Challenge 将于 10 月 1 日开始,持续两个月。

Data Flow through components of RecSim (from the RecSim Whitepaper)

网飞、、Spotify 和脸书的附加演讲概述了当前行业中的热点研究问题。一个值得注意的贡献是由 Christakopoulou 等人提交的关于“对一个被遗忘的推荐者的对抗性攻击”的论文,该论文展示了用对抗性例子欺骗推荐者的不同方法的有趣分析。我也很欣赏 Yves Raimond(网飞)关于如何理解当今推荐者的信息成分的建议:

Yves Raimond from Netflix on a new Perspective towards Recommender Information Components (taken from https://twitter.com/ACMRecSys)

接下来,关于 RecSys Challenge 2019 的研讨会提供了更多实用的见解,五个最佳团队在来自全球酒店搜索平台 trivago 的真实数据集上展示了他们基于会话和上下文感知推荐的解决方案。许多与会者称赞数据集的丰富性和结构,我们希望它将很快公开,以丰富会议和背景感知环境中的研究。

除此之外,RecSys 还在一天的会议之后提供了大量的精彩活动。因此,我们可以在周一的第凡尼欢迎招待会上继续交流,地点在哥本哈根历史悠久的市中心游乐园,喝点好酒。随后,周二在一个旧的机车车间举行了节日宴会,之后按照一个古老的习俗举行了卡拉 ok 之夜。周三,Twitter 邀请参加一个体面的酒吧会议,随后是 Zalando 的 RecSys Afterparty。因此,在顶部有许多伟大的讨论和聚会,而不仅仅是一个会议日,人们不仅享受科学,也享受他们自己。

期待 RecSys 即将举办的活动和会议

这一审查可以无休止地继续下去,但它应该是一个概述和总结。因此,以此为切入点,在 RecSys 2019 的计划中寻找更多内容,或查看会议记录 —确保在论文被放入 ACM 的付费墙之前尽快下载目录下引用的论文。

Image with Courtesy taken from https://recsys.acm.org/recsys20/

写完这篇文章后,让我们来展望一下 RecSys 日程上即将举行的活动。10 月,将在巴西福塔莱萨举办拉丁美洲推荐系统学校。它是定于 2020 年 9 月 22 日至 26 日在里约热内卢举行的 RecSys 2020 的预备项目。与此同时,看看 2019 年 11 月 29 日在阿姆斯特丹举行的第 18 届荷兰-比利时信息检索研讨会——阿姆斯特丹也是 2021 年第 15 届 RecSys 的举办城市。此外,除了所有这些事件,同时跟踪 Arxiv 的 IR 频道上发布的内容。

那些种族主义机器人…

原文:https://towardsdatascience.com/those-racist-robots-c31306d6627f?source=collection_archive---------18-----------------------

Photo by Alex Knight on Unsplash

人工智能(AI)是最热门的话题之一,尤其是关于机器人是否有可能接管世界的整个辩论。不管我们认为人工智能是我们历史上的一项实际进步,还是只是积累知识的又一次鲁莽、笨拙的整合,大多数人都对这个话题感兴趣。

人工智能在机器人技术中是必不可少的,尤其是在建造人形机器人方面。这包括数据的深层表现,通常以基于机器学习的方法,使机器人“做机器人的事情”。不可否认的是,机器学习(即当今人工智能的适用领域)彻底改变了我们思考和操作技术的方式。不管我们是否意识到,在这个网络环境中,人工智能和机器学习无处不在。

毋庸置疑,人工智能模型在某些方面可以超越我们的思维能力。例如,我们倾向于以基于形状(甚至线性)的方式思考,这可以解释为什么我们喜欢可视化数据而不是以原始形式查看数据。然而,在包含大量非线性任务的应用中,我们几乎不可能在寻找输出/结果时记住所有变量。例如,这很容易通过人工神经网络来实现。

然而,困扰许多人的一个问题是,我们在人工智能领域的进展有多快。因为这相对来说是主观的,所以在做出决定之前仔细检查事实是很重要的。所以这个讨论值得自成一系列。

泛化就是种族主义吧?

潜意识里,我们可以用“为什么要一概而论?”。从根本上说,种族主义是对某些人的笼统描述。不管该声明的虚假性如何,它是种族主义的,主要是因为它是一种概括。

在不同的背景下,概括采取不同的形式。机器学习的本质是手头的模型或应用的可推广性。这指的是应用程序对于它以前从未见过的输入能给出多好的输出。这就是机器学习的优势所在。通过正确的模型训练,我们可以构建一个应用程序,在某些方面使我们的生活变得更容易。

由于数据是任何机器学习的主要部分,因此获取这方面的信息非常重要。这对于任何机器学习模型的适用性都是不可或缺的,因为 ML 是建立在泛化的概念之上的。

我们反对现实生活中的一般化,但我们正在把它教给未来的工具——机器人。

想想这可能是一个苛刻的声明。然而,它揭示了我们作为人类参与构建人工智能并控制它能做什么和不能做什么的重要性。这种对我们自己的应用程序的控制力,就是在“数据的技术表现”和“种族主义机器人”之间划出的界限。这就是为什么需要适合我们应用程序的干净数据,而不是任何可用的数据。但是,什么是干净数据呢?

社交媒体偏见

我们举个例子。如果我们正在构建一个基于文本的人工智能应用程序,让从社交媒体数据中“学习”,我们必须考虑某些方面。社交媒体直接展示了我们日常生活中发生的事情,包括我们已经学会在网络上相处的部分——冒犯性内容、亵渎性语言、种族主义言论等等。如果我们只将亵渎的文本输入到我们的模型中,它将学习如何生成亵渎的文本——因为这是它所知道的全部。在机器学习中,这是应用程序的福音,也是诅咒。有了正确的数据,你就能做出正确的模型。这正是处理社交媒体数据的风险所在。事实上,很多算法,尤其是在情感分析中,处理的是某些词相对于其余词的“强度”。这可能会导致模型将世俗术语去语境化,并将它们作为手边文本中闪亮的特征。

不光彩的提及——tay tweets

几年前,微软不得不关闭了一个天才人工智能项目——Tay为了对会话理解进行研究,Tay 是一个能够讲笑话、评论图像等的机器人。然而,Tay 能力中最有趣的任务是用她自己的语言重复陈述。通过大量的喜剧性即兴表演,Tay 能够学习如何个性化她对内容的反应。

当 Twitter 用户开始意识到她能够在自己的评论中重复他们的推文,以及她无法识别自己何时做出冒犯性评论时,Tay 成为了新闻的焦点。当她开始评论特朗普的隔离墙和大屠杀等问题时,这成了一个严重的问题。

如果我们是种族主义者,他们也是

Tay 是一个滥用我们技术进步的直接例子,因为他相信我们的同类会把应用程序教成正确的东西。当涉及到人工智能时,我们不能仅仅依赖某些类型和来源的数据。社交媒体就是其中之一。没有我们的直接参与,任何有能力学习的机器人都会跟随潮流。这是他们的天性。机器学习算法中的泛化决定了这一事实。那么,我们如何才能控制数据源这个令人讨厌的问题呢?

教你的机器人你教你的孩子

在一个种族主义和虚假种族优越的世界里,我们应该努力让我们的“机器人”受到我们希望它们受到的鼓舞,而不仅仅是了解世界上正在发生的任何事情。此外,重要的是教会他们不要做什么,如何不行动。微软未能让 Tay 认识到攻击性,所以他们不得不将其从网上删除,尽管其中使用了大量与人工智能相关的知识。

事实上,每天发生在我们周围的事件能够恶化我们机器人的道德裂缝。我们在那里,监管能够学习的人工智能应用程序中公共数据的利用比首先制作应用程序更重要。我们不能再忍受种族隔离和公众仇恨了。更不用说它是建立在可用数据的可编程变形的基础上,寻找即使是我们中最聪明的人也无法以如此快的方式理解的潜在模式。

当人工智能开始构建人工智能时,我们人类的参与就停止了。这种参与对于正确利用数据是不可或缺的。基于人工智能的应用从重复的数据模式中学习,捕捉趋势等等。如果我们为他们提供正确的数据,确保我们的生活得到改善,他们就会成功,我们也会成功。如果我们向他们提供在网络上漫游的任何东西,攻击性的内容和负面的评论,我们将和我们的机器人一起进一步堕落。让我们永远记住,我们应该利用技术来解决我们的问题,而不是仅仅因为我们足够聪明,已经提出了一种人工智能形式,就放大这些问题。

你不应该害怕机器人

原文:https://towardsdatascience.com/thou-shalt-not-fear-automatons-6d0c7395f6e7?source=collection_archive---------20-----------------------

在这篇文章中,我将表明,不像专家希望你认为的那样,我们应该害怕的是我们的无知,而不是机器的智能。

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

人工智能迫在眉睫的危险与机器变得过于智能无关。这与机器继承了人类的无知有关。

背景

关于人工智能带来的巨大变化,我们应该相信谁?吴恩达说人工智能是下一个电,或者弗朗索瓦·乔莱说它更像是人类语言的发明?当埃隆·马斯克(Elon Musk)说我们需要害怕机器奴役我们,解决办法是将机器嵌入我们的大脑时,我们应该认真对待吗?如何兰德公司谈论人工智能作为下一个核军备,或弗拉基米尔·普京认为霸权是他的谁有最好的人工智能?Roko 的蛇怪怎么样,如果我没有在这里提到它,我会为我的永恒的痛苦铺平道路吗?谁是对的?我们应该满怀希望,还是害怕,或者两者兼而有之?

为了回答这些问题,在本文中,我将用简单易懂的术语建立三个简单的论点:

  1. 虽然我们不能确定机器有多聪明,但我们肯定知道人类有多愚蠢
  2. 谈论人工智能的伦理没有谈论人类的伦理重要
  3. 人工智能现在和将来(至少在几十年内)都是关于过程自动化,而不是自治

作为奖励,我将展示我们是如何在某种程度上被令人难以置信的愚蠢机器所统治的。由缺乏积极性的初级工程师和想要成为数据科学家的人创造的机器,在目光短浅的销售人员和风险资本家的影响下工作。

人类不擅长做(好的)决定

虽然我们不能确定机器有多聪明,但我们肯定知道人类有多愚蠢。

没错。我们不擅长做决定。考虑丹尼尔·卡内曼在系统 1 上的工作和我们对迷走神经的理解。迷走神经是我们大脑的一部分,已经存在很长时间了。至少几亿年了。见过蜥蜴受到惊吓后迅速逃跑的吗?这是迷走神经在起作用。简而言之,卡尼曼在他获得诺贝尔奖的作品中表明,无论我们认为我们的决策过程有多么理性,当我们做出决策时,我们经常会忽视所有深思熟虑的结果(即使可能需要数年时间),并选择任何“感觉”正确的选项。卡内曼称之为“快速思考”或系统 1,与我们认为自己正在思考的方式相反,卡内曼称之为“缓慢思考”或系统 2。理解这一点的一种方式是,在我们大脑的更表层部分,我们有很大的理性处理信息的能力,但很少有权力使用这些信息来做决定。在我们大脑深处迷走神经所在的地方,我们没有理性能力,但是有很多权威。不仅仅是卡尼曼。心理学领域是由和他一样的理论组成的。事实上,你可能很难找到理论来证明我们人类擅长做决定。这让我们想到了与人工智能相关的一个关键风险;人类做出关于基于人工智能的决策系统的决策。

人工智能解决方案可以归结为两个方面;数据输入和处理输入的方法。这两者是给定系统产生结果的原因。简而言之,给定系统的结果完全取决于与该系统相关的输入和流程。从根本上说,总有一种算法支撑着计算机系统做出的决定。各种计算机系统都是如此。考虑一个简单的 Python 示例:

1 + 1

在这种情况下,基于算法,系统决定输出整数 2。每一个计算机系统,不管它有多“人工智能”,都可以归结为这个基本原则:输入+处理=决策。计算机做决定的方式一点也不像人类。这是冷酷的理性,是能力和权威的完美结合。换句话说,能力和权威是不可分的。

上述例子与基于现代深度学习的机器智能系统的一个重要区别是,人类无法像我们审计前者那样审计后者。当我们考虑到我们人类的缺点时,这是一件大事。这是为什么呢?我们可以称这个问题为“转移无知”我们把我们的非理性引入到一个被期望做出理性决策的系统中,你猜怎么着,这个系统会开始做出非理性决策。当我们不知道事实是这样的时候,问题就来了;在计算机系统中,非理性很容易伪装成理性。因为一个典型的基于深度学习的自动决策系统的输出是我们无法验证的(就像我们可以验证 1+1=2),并且我们不知道为什么我们会得到那个结果,我们可能最终成为我们非理性的受害者。以这种方式来架构人工智能的问题是一个重要的起点,因为这个问题变得可以管理;我们非常清楚自己的非理性。制衡可以到位,以避免我们的负面品质遗传给机器。问题很简单:

我们如何规范我们自己的行为,以最大限度地减少我们的非理性向那些被期望做出理性决策的系统的转移?

在这里,理解我们无法精确知道为什么深度学习模型中的某些东西会以这种方式工作的事实,正是我们想要的,这一点非常重要。这就是我们如何超越我们人类自己所能做到的。对于一个我们可以审计和解释的系统,它需要比我们审计和解释的能力更简单。这不是我们想要的!

接下来,考虑建造金字塔的过程。据估计,这需要多达 20 万名工人,在此过程中有数千或数万人伤亡。这是一个由人类痛苦和生命损失推动和促成的过程。再来看看迪拜,世界历史上一些最雄心勃勃的建筑项目就在这里。大多数项目都是零伤亡完成的,许多项目持续数百天没有发生事故。据报道,900 米高的哈利法塔导致一名建筑工人死亡。

Many construction sites in Dubai go hundreds of days without any accidents

怎么会这样这是因为,在过去的几千年里,我们不怕超越我们人类在特定时间点所能做的。我们不害怕扩展我们的能力。人工智能与其说是与我们分离的东西,不如说是扩展我们能力的东西。能够这样思考人工智能将会非常有用。当我们明白这是关于扩展我们的能力时,我们的希望变得更有意义,我们的恐惧变得更具体。例如,我们明白,将我们的无知转移到我们创造的系统中存在着真正的风险,结果,我们以人为的无知告终。当一种新的东西被发明出来,或者很久以前发明的东西开始起飞时,我们经常会得到令人惊讶的结果。我们越是无法理解(或审计)一个给定的系统,就越有可能出现令人惊讶的结果。有时候惊喜是不愉快的。让我们以医疗保健领域为例。

像任何其他系统一样,医疗保健是一个由相互关联的行为组成的网络。例如,如果您引入一个关注重症监护患者总天数的指标,您将最终导致更多的死亡,因为系统将优化使患者更早离开重症监护病房。这正是上世纪 80 年代管理顾问将基于博弈论的流程优化引入医院时,许多西方医院发生的情况。实际上,性能指标是简单算法的一个例子。我不怀疑这些想法背后的人真诚地相信它们会起作用。算法设计深受博弈论零和原则的影响。接下来让我们考虑一个拥有全民医疗保健平台和债务缠身的国民经济的民族国家。在这样的国家,决策者有大量的时间、资源和客观的压力。

到目前为止,这些国家的决策者应该已经得到了他们在人工智能炒作中的份额。说“人工智能是下一个电力”的问题在于它如何让我们思考电力以及我们从中获得的所有好处。如果你在医疗保健行业工作,风险在于思考“看看电力对医疗保健的改变有多大”,然后影响你对人工智能的态度。这是导致灾难的原因。就人工智能所能实现的功能而言,它与电力相去甚远。在某种程度上,它带来了积极和消极的结果,远远超出了电力的范围,我怀疑世界上是否有人真正“理解它”从另一个角度来看,人工智能只是另一种电力驱动的东西。在这两种情况下,说人工智能是新的电力是完全错误的——而且是危险的误导。新的电力将会提供光、热、运动等等。

回到国家医疗保健的例子…

个人和由个人组成的委员会,他们现在正在就机器智能在国家医疗保健系统中的使用做出决定,承受着巨大的交付压力。一般来说,他们面临着违背经济目标和国家健康结果的压力。典型的职业政治家几乎不懂医疗保健(或经济学),因此除了极少数例外,他们对人工智能完全不知所措也就不足为奇了。他们受什么影响?没错,所有的炒作正是影响他们的。很难想象在这种情况下,被自称的人工智能专家无休止的炒作轰炸的非专家如何能够做出正确的决定。另一方面,很容易看出他们是如何最终犯下所有错误的。

关于系统,有一些重要的东西需要理解;当你改变某件事时,负面影响可能会在 10 年、20 年或 100 年后出现。一般来说,系统越复杂,变革项目越雄心勃勃,就越是如此。我们不应该专注于绝对最坏的情况,比如超级智能毁灭人类,而是应该非常担心无数愚蠢机器的微妙、往往隐藏的系统性影响。

人工智能中的道德和伦理

谈论人工智能的伦理没有谈论人类的伦理重要

就像我们设计的机器智能解决方案一样,继承了我们的非理性和愚蠢,它们继承了我们的不道德和缺乏道德。就目前情况来看,我们真的有制造人为不道德的风险。看待道德主题的一种方式是通过两部兼容的著作,伊曼纽尔·康德的《绝对命令》和科尔伯格的《道德发展模型》。康德在他的《绝对命令》中将其解释为“只根据那条准则行事,据此你可以同时将它变成一条普遍法则。”

在科尔伯格的作品中,我们可以体会到按照康德道德律令的标准生活是多么艰难。在一个组织环境中(关于人工智能的决策将主要在这里做出),超越第四阶段(左图)可能会特别棘手,偶尔会瞥见第五阶段。不幸的是,很多选择都是在第 1 阶段的前提下形成的;如果我这样做,会不会对我个人产生负面影响。

非理性和不道德之间有一个关键的交叉点。它们放大了一个和另一个的有害影响。为了解决这一问题,并正式训练自己消除非理性和不道德,世界上的智者曾经非常重视对哲学的研究。最重要的是道德、本体论(什么是认识)、认识论(什么是存在)和逻辑学。这种方法将是人工智能研究人员和开发人员的有用伴侣。

莱布尼茨有句名言:

没有数学,我们就无法深入理解哲学。没有哲学,我们就无法深入数学。没有这两者,我们就无法深入了解任何事物。

政治家约翰·亚当斯说:

我必须学习政治和战争,这样我的儿子们就可以自由地学习数学和哲学。

在医疗环境中,没有一个相关的利益相关者——政府和医疗专业人员,也没有计算机和数据科学家——接受过道德培训,并且经常缺乏对本体论、认识论和形式逻辑的最基本的理解。而且,这不只是一个 AI 相关的问题;在物理学界,关于哲学的作用以及它是否有任何意义的争论越来越激烈。这里我们发现我们应该害怕的第二件重要的事情;把新思想的发现从哲学中分离出来的风险,因为哲学是发现和思想的科学。

我们已经看到了人类不道德行为转移到决策系统的结果。我们已经通过金融市场、在线广告和其他算法决策的早期拥抱者的例子看到,我们如何倾向于以所谓的贪婪算法结束,这些算法无情地朝着给定的目标优化,而不关心其他任何事情。与医疗保健专业人员等不同,这种算法不怕因做出错误决定而失去生计和声誉。最终可能会伤害他人的决定。我们应该担心的正是这种类型的风险,而不是想要主宰或消灭人类的超级智慧。一些最疯狂的幻想甚至试图让我们确信,我们看到一种超级智能将首先消灭人类,然后扩展到整个银河系,这只是一个时间问题。

自主谬论

人工智能现在和将来(至少在几十年内)都是关于过程自动化,而不是自治

人工智能恐惧传播的核心是自主超级智能的混乱概念。我们在两个基本方面犯了严重的错误;我们已经开始用自主这个词来代替自动化,我们已经忘记了计算机程序的工作方式。作为一个参考点,看一看深度学习社区的阶段。大部分工作集中在简单的流程自动化和创建更复杂的方法,以提高训练预测模型的自动化的最新水平。虽然用几行 Keras 代码可以做的事情非常不可思议,但在最终的预测模型中,人类的智能就像烤面包机一样多。无论如何,深度学习模型的自动化程度远远高于烤面包机。可以公平地说,深度学习模型扩展人类能力的方式远远超出了烤面包机的能力。但是,深度学习模型中是否存在烤面包机中没有的超级智能的固有属性?这是一个基于深度学习的拼写检查器对深度学习的看法。

深度学习可能是一颗种子,具有更多的倾向,甚至是我们还无法想象的某种形式的智能,但它只是一种倾向。就像一颗苹果种子需要土壤、水分、营养和阳光才能有机会长成新芽一样,超级智慧也需要让它显现的原因和条件。没有人能令人信服地解释这些原因和条件是什么。在电脑游戏中赢人类与此无关。事实上,大部分恐慌都集中在最糟糕的情况上。想想核武器;在历史上,它们只被使用过一次。你能找到一些其他的技术进步,其中最坏的情况实际上已经实现了吗?

说到超级智能,我们甚至不知道我们是否有这种能力。在这一点上,我不得不同意马克·安德森的观点。

我们所知道的是,我们的无知和不道德有一个可识别和可解决的问题。此外,我们有明确的证据表明,我们倾向于将它转移到我们创造的系统中。这是我们应该担心的,我们应该非常担心。

自主性怎么样,深度学习模型中的自主性比烤面包机中的自主性多吗?我不会说我是从事人工智能研究的最聪明的人之一,但我是一个小团队中的一员,这个团队多年来一直致力于自主性的基础研究。我的观点是,就目前而言,深度学习模型和烤面包机在自主性方面几乎没有区别。简单来说,深度学习模型中没有类似于自主性的东西。创造一个自主版本的烤面包机将是一个比创造一个自主版本的深度学习模型更合理的目标。在深度学习模型中,抽象的对象是经过训练的模型,而在烤面包机中,抽象的对象是烤面包。在这两种情况下,我们通过实现一定程度的自动化来做一些繁琐的事情并简化过程。已经建立起来的与人工智能相关的最高抽象层次与超参数优化有关。在超参数优化中,我们将模型的超参数配置作为抽象对象,而不是只获得一个模型,而是获得许多模型。这里我们避免了寻找最佳超参数的繁琐过程。有一些关于自动机器学习的新兴工作,它将所有已建立的东西包装成一个单一的解决方案。它仍然只是过程自动化。有一个新兴领域关注超参数优化过程的优化。这是我自己正在做的事情之一。我不能肯定地说太多,但我可以从理论上说,展开的是一个无限的回归,其中每一级抽象都充当前一级抽象的解算器。甚至那也仅仅是建立在自动化之上的自动化。那里也没有自主权。我认为——这是我们没有文献记载的——希望通过自动化的无限回归找到自主性就像希望从苹果籽中得到烤面包一样好。

我们一无所有;除此之外,关于自主人类灭绝银河系探索超智能的无稽之谈没有其他依据。而且,当你看到一个著名的 AI 公司创造了一个在给定游戏中击败最优秀的人类玩家的 AI,你应该问这个解决方案有多普遍的适用性?是因为公司投入了如此多的资源和人力去解决一个特定的问题,以至于不可避免地会得到他们想要的结果。我们没有任何其他的技术发展轨道,似乎在这里丝毫相关的考虑。我完全同意弗朗索瓦·乔莱说的话:

我们需要问自己的与人工智能相关的最重要的问题甚至与人工智能无关。最重要的是,我们必须提出关于系统性影响的问题。回到医疗保健,我们可能会认为对药物的过敏反应是副作用的一个很好的例子,但许多副作用需要几年、几十年甚至几个世纪才会出现。由于因果分析的难度,我们一般无法精确地知道是什么促成了某种结果。这意味着,在某些情况下,几乎不可能知道一个给定的人工智能解决方案是在长期内做出积极贡献,还是只是提高短期效率,并在长期内造成损害。即使我们先等了几十年。这可能在未来 100 年内成立,或者只要理解长期因果关系就成立。对因果关系的分析似乎是人工智能专家系统更有趣,也更少讨论的用途之一。

额外收获:被一千种算法杀死

取代天网的是,我们正迅速走向一个由无数愚蠢的机器统治我们的世界。这些机器是由缺乏积极性的初级员工(工程师和潜在的数据科学家)创建、维护和优化的,他们在巨大的压力下工作,并受到销售人员和风险资本家短视的影响。更糟糕的是,他们倾向于每两年换一次工作,而且通常不关心或没有能力理解工作带来的系统性变化。那些算法已经无处不在。超过一半的金融市场交易都是基于简单的零和算法的决策,这些算法被称为“底部馈电器”,其唯一目的可能是在市场中制造噪音。从现在起的几年内,超过一半的广告是基于算法进行交易的,这些算法以牺牲互联网用户的利益为代价,与“每次印象成本”等指标相互竞争。我们在社交流、互联网搜索、视频推荐、相关新闻和购物网站中看到的内容完全由被称为“收益优化器”的算法控制。在所有这些例子中,算法都是简单的自动机,为创造和控制它们的人的短视利益服务——本质上主要是金钱利益。以“收益优化器”为例,该算法的目标是捕捉尽可能多的互联网用户的注意力和时间,将其转化为广告收入。从某种意义上说,这是一种认知收获。一个非常愚蠢的算法收获人类认知能量的过程,让一个公司赚钱。换句话说,由于我们的无知和不道德,我们创造了无知和不道德的算法,使我们更加无知。

一些精神食粮。

在这里阅读关于自动研究代理人的信息。

PS。感谢您的宝贵时间!如果你还有几秒钟,请分享。

PS。如果你对我和 AI 一起做的工作感兴趣,可以看看的

关于统计建模两种文化的思考

原文:https://towardsdatascience.com/thoughts-on-the-two-cultures-of-statistical-modeling-72d75a9e06c2?source=collection_archive---------7-----------------------

(Source)

准确性胜过可解释性和其他来自 Leo Breiman 的《统计建模:两种文化》的内容

在论文中:“统计建模:两种文化”利奥·布雷曼随机森林以及装袋助推集合的开发者——描述了两种截然不同的统计建模方法:

  1. 数据建模:根据对数据生成机制的直觉,选择一个简单的(线性)模型。重点是模型的可解释性和验证,如果要做的话,是通过拟合优度来完成的。
  2. 算法建模:选择预测验证准确率最高的模型,不考虑模型的可解释性。

在 2001 年撰写本文时,Breiman 估计 98%的统计学家属于数据建模团队,而 2%(包括他自己)属于算法建模文化。这篇论文旨在呼吁统计学家停止仅仅依赖数据建模——这会导致“误导性结论”和“无关理论”——并采用算法建模来解决大规模数据集产生的新的现实世界问题。Breiman 是一名学者,在 Berkely 做了 21 年的统计学家,但他之前做过 13 年的自由顾问,这让他对统计如何在工业中有用有了很好的看法。

布雷曼感到沮丧,因为他知道数据模型无法解决大规模数据收集带来的新挑战,他觉得学术统计学由于拒绝采用新工具而变得无关紧要:预测性能高但可解释性低的复杂算法。虽然自这篇论文发表以来的 18 年里,机器学习和统计学已经发生了变化(我不知道 98/2 的分裂是否仍然成立),但提出的几个有趣的观点仍然与今天实践机器学习有关,特别是对于那些从学术界向工业界过渡的人。这些要点包括:

  1. 具有不同特征的模型通常产生相似的预测准确度。
  2. 在机器学习中,模型可解释性和性能之间存在权衡。
  3. 更多的特性可以提高复杂算法模型的性能。
  4. 随着我们收集更多关于世界的信息,科学从简单模型发展到复杂模型。

这篇论文的总体经验与我在工业中应用机器学习所学到的一致(在Cortex Building Intelligence):首先关注模型的准确性,只有在建立了高性能模型之后,才考虑解释它。一个无法完全解释的高度复杂、精确的模型比一个我们完全理解的没有预测精度的简单线性模型更有价值。

以下是我对 Breiman 论文的一些想法。请记住,这些都是基于比 Breiman 撰写的经验少得多的经验——在学术环境中的 1 年(2018 年)和在行业中的 1 年多一点(2018 年至今)。我建议阅读文章(以及其中包含的批评)来形成自己的观点。请随意将关于论文或机器学习相关主题的评论或经验添加到本文中。尽管机器学习似乎发展得令人难以置信地快,仍然可以从旧的论文和书籍中学习到有价值的信息,尤其是那些由 Breiman 这样的人物撰写的,他在塑造该领域方面发挥了关键作用。

统计建模的两种方法

在我们讨论什么是好的模型之前,我们必须理解建模的两个目标:

  1. 预测:根据一组新的独立变量(特征)估计结果(目标)
  2. 信息:了解一些关于自然(数据生成)过程的知识

这两个目标的精确平衡取决于具体情况:如果你试图预测股票,你可能只关心模型是否准确。在医疗环境中,了解疾病的原因可能是建立模型的主要焦点。Breiman 认为,对于这两个目标,算法方法实际上比数据建模方法占了上风。

数据建模

使用数据建模方法(Breiman 认为数据模型是用于回归的线性回归和用于分类的判别分析或逻辑回归)的研究人员首先构建一个关于数据如何生成的合理机制。也就是说,研究人员根据直觉、经验或领域知识,想出一个将自变量(特征)与因变量(目标)联系起来的线性方程。

模型中的系数(特征权重)是通过将其拟合到数据集而得到的。由此产生的线性方程代表了实际的数据生成机制——自然通过这个黑盒生成因变量和自变量的值。系数被用作变量重要性的度量,显示特征对响应的影响。

数据建模中的验证(如果发生的话)是通过拟合优度度量(如 R 或残差分析)来完成的,这两种度量都是在训练数据集上进行的。很少考虑预测的准确性。相反,重点是模型如何解释正在研究的现象。如果系数上的 p 值足够低,那么它们是“显著的”,用 Breiman 的话来说,该模型“成为真理”,从该模型得出的任何结论都是可靠的。整个过程由直觉和主观决定引导:研究人员没有让数据说话,而是通过选择,如使用哪些特征和哪些数据点作为异常值丢弃,来强加他们自己的个人理论。

Breiman 引用了 Mosteller 和 Tukey 的一本教科书来总结他对数据建模的失望:“指导回归的整个领域充满了智力、统计、计算和主题方面的困难。”换句话说,用简单的线性模型和直觉进行数据建模并不是从数据中学习的客观方式。然而,根据 Breiman 的调查,这是 98%的学术统计学家采用的方法!难怪他对自己的领域感到沮丧。

算法建模

算法建模方法围绕着一个问题:模型在验证数据上的表现如何?在选择模型时,不考虑模型是否代表生成数据的潜在机制,只考虑模型是否能够对新的(或持续的)观察值做出可靠的估计。Breiman 将算法文化的兴起归功于新算法的发明,如随机森林(他自己的工作)、支持向量机和神经网络。至少在当时,这些模型在理论上还没有得到很好的理解,但却产生了非凡的预测准确性,特别是在大型数据集上。

算法社区的一个中心思想是,自然是一个黑箱,我们的模型也是一个黑箱,尽管它可以根据新的观察结果给我们预测。试图解释一个不准确的模型是没有用的,所以在集中精力从模型中学到任何关于自然的东西之前,首先要集中精力建立一个具有最佳性能的模型。一个精确的模型,不管有多复杂,对预测(清晰地)和信息收集都更有用,因为一个简单的、可解释的低精度模型不能捕捉到任何关于问题的有用信息。

算法文化不是从学术统计中发展出来的,而是来自“年轻的计算机科学家、物理学家和工程师加上一些年老的统计学家。”换句话说,那些不怕采用甚至发明新技术来解决新问题的人。这些是实践者而不是理论家,他们使用神经网络和随机森林来解决从医学到基因组学到股票市场到天文学等领域的问题。

作为一名顾问,Breiman 看到了算法建模的价值,采用最好的工具来解决问题。他开始将计算机视为一种无价的工具,因为它们能够将复杂的技术应用于大量的数据。回到学术界后,他对依赖数据模型和不重视预测准确性感到失望。即使你的主要目标是通过建模提取关于自然的信息,首要任务也应该是准确性。一个复杂、精确的模型可以告诉我们问题域,因为它一定已经捕获了特征和目标之间的关系的某个部分。此外,算法建模社区通过解决问题已经有了一些有趣的发现。

1.模型的多样性:许多具有不同特征集的模型具有几乎相同的预测准确性

我在工作中建立的最初几个模型,我被一个重复出现的模式所困扰。我试图通过测量验证分数来选择“最佳”特性,但是,每次我尝试不同的子集时,总的验证分数几乎保持不变。这令人困惑,但却反复发生:改变特性,甚至尝试不同的超参数值都会产生相似的性能。Breiman 说这没什么可担心的:对于大多数问题,当使用复杂模型时,有许多特征和超参数给出大致相同的性能。换句话说,单一最佳模型的想法是虚构的,所以我们不应该担心找到它。

虽然这不应该是算法模型的问题,但它给任何依赖数据模型的人带来了令人不安的问题。因为简单的线性模型不能很好地处理许多特征,它们需要广泛的特征选择,通常是通过直觉和形式方法的结合。从特征到目标的映射是通过选择特征和通过拟合计算系数来创建的,假设该映射代表地面实况,即数据生成过程。然而,如果实际上有许多组特征将给出相同的性能,那么仅仅一组特征怎么可能是事实的最终来源呢?在现实中,有许多同样好的模型,所以只选择一个并不能准确地代表问题。

是什么导致了模型的多样性?我自己建立模型的经验告诉我,这是由于相关的特征(当两个变量一起增加或减少时,它们正相关)。尽管线性回归假设输入变量是独立的,但在现实世界的数据集中,几乎所有要素都有一定程度的相关性,通常非常高。因此,一个特征可以替代模型中的另一个特征,而不会降低精度。构建一个单一的数据模型,并将其称为事实的来源,会忽略所有其他同样有效的模型。算法建模者不应该担心选择特征:只需将它们全部交给你的随机森林,让它来决定哪些是重要的。训练后,认识到拟合模型只是从特征到目标的映射的一种可能的表示。

2.机器学习的权衡:简单性和准确性

这是该论文(也是从 2001 年开始)显示其年龄的一个领域。Breiman 提出了一个共同的主张,即更复杂的机器学习模型是完全无法解释的(特别是随机森林和神经网络)。当选择一个模型时,他说我们总是需要用可解释性来换取更高的准确性。然而,过去几年在解释复杂模型方面取得了重大进展,特别是 SHAP 值局部可解释模型不可知解释(LIME) 。这些操作的一般原则是建立一个复杂的模型,然后使用一个简单的模型(如线性回归)来解释它的一小部分(局部)。

(关于可解释机器学习的课程,参见 Kaggle 的机器学习可解释性)。

这些模型解释技术可以与任何模型一起工作,从随机森林到神经网络,并为单个模型预测提供合理的解释。在 Cortex,我们使用 SHAP 值来解释我们对建筑物启动 HVAC(供暖或空调)的理想时间的估计。我们的建议被广泛采纳,部分原因在于这些简单易懂的解释。

Breiman 对缺乏可解释性的担忧是有道理的,但是,正如新算法被发明来处理更大的数据集一样,新技术也被开发来窥视复杂的黑盒机器学习模型。这是一个算法发展速度比解释快得多的问题。这是有道理的——在试图解释算法之前,我们需要确保算法是准确的。解释一个不准确模型的预测是没有什么意义的。现在,模型解释技术已经赶上了算法,我们可以同时拥有预测背后的推理和高预测准确性。

当我们谈到解释的时候,我们应该提到人类在解释他们的决定方面是很糟糕的。我们确实给出了个人选择的原因,但这些原因不可能包含环境、遗传、处境、情绪、神经递质等的全部组合。真正影响决策。当我们问别人为什么上班迟到时,他们告诉我们“因为我走了不同的地铁路线”,我们接受这个事实,通常就此打住。我们没有深究其中的原因,也没有询问详细的后续问题,这将导致更多的后续问题。我们需要知道一个人的整个生活史来完整地解释他们做出的一个选择,所以很明显我们无法从人类那里得到完整的解释。

我发现人们想要任何解释,不管多么站不住脚,而不是没有解释。即使这是一个同义反复(男孩就是男孩)或者循环推理(我犯了很多拼写错误,因为我的拼写很差)人们也会接受任何一种理由。与人为原因相比,机器学习模型输出的 SHAP 值更全面,显示了分配给与单个预测相关联的每个变量的准确权重。在这一点上,我更喜欢这些模型解释技术得出的数字,而不是人类给出的误导性理由。

与其担心模型的可解释性,也许我们应该处理更困难的问题,弄清楚人类的决策!我们在解释机器学习输出方面取得了更多进展,而不是在找出个人特定行为背后复杂的影响网络方面。(我有点掉以轻心了。我认为模型解释是机器学习中最有前途的领域之一,我对向非技术观众解释机器学习的新工具感到兴奋。我的主要观点是,自论文发表以来,我们在解释模型方面已经走了很长的路。)

3。有了算法模型,更多的特性可以提高性能

在研究生数据科学建模课上,我的教授们花了大量时间使用像方差膨胀因子互信息这样的技术进行特征选择。在实验室中,我看到了大量的功能选择,几乎总是由直觉而不是标准化的程序来指导。原因可能是合理的:线性模型往往不能很好地处理许多要素,因为它们没有足够的能力对来自要素的所有信息进行建模-但所使用的方法往往是主观的,导致模型更多地由人驱动,而不是由数据驱动。

相比之下,算法模型可以从更多的特征中获益。Breiman 指出,更多的变量意味着更多的信息,一个有效的模型应该能够从噪音中挑选出信号。像随机森林这样的 ML 方法可以提供具有许多特征的准确预测,即使当变量的数量超过数据点的数量时,正如在基因组数据集中经常发生的那样。我们可以给算法模型所有的特征,让它找出与任务最相关的特征,而不是花费时间试图凭直觉留下重要的特征。此外,我们可能实际上想要创建附加特性,从现有变量中设计它们,以帮助模型提取更多信息。

直觉在算法建模文化中没有位置,不像在数据模型中,它可能通知进入模型的特征。如果我们真的想从数据中学习,那么我们必须相信数据,而不是我们的主观意见。算法建模不需要我们执行任何任意的特性选择:相反,我们保留所有的特性,甚至添加更多,并以更少的努力获得更好的性能。

4.科学从简单到复杂

最后一个要点实际上来自布雷曼对批评的回应(见下文),但这是至关重要的一点。随着我们对世界的认识不断进步,我们需要更复杂的模型来预测和学习信息。

早期的宇宙模型将地球置于中心,然后在确定我们当前的观点之前,将太阳置于中心,银河系只是巨大(可能是无限)宇宙中数十亿个星系中的一个。在每一步,模型都变得更加复杂,因为我们收集了更多不符合现有模型的信息。牛顿的万有引力定律在数百年间一直运行良好,直到进一步的观察揭示了它的局限性。现在,我们需要爱因斯坦的相对论(狭义和广义)来确保我们的卫星不会从天上掉下来,因此我们的 GPS 系统仍然准确。

随着其他领域开发出更复杂的模型来应对新的困难(原子的模型是另一个例子),当旧的线性模型不再有用时,统计学应该抛弃它们。数据模型适用于一小部分问题,但是我们现在在数据科学中面临的挑战要大得多。用于解决它们的技术应该相应地扩展。如果科学的其他部分正在走向更大的复杂性,我们为什么要假设统计学可以继续在最简单的模型中运行?有很多令人兴奋的问题,开发和解决它们需要使用任何最合适的工具,甚至发明新的技术来应对新的障碍。

批评

按照最好的科学传统,Breiman 将 4 位统计学家的大量批评作为论文的附录,然后对反馈做出回应。通读批评和观察来回(民事)争论是值得的。科学通过公开讨论而进步,因为没有一个人有所有正确的答案。正是通过一个反复的过程,提出一个想法,对其进行批评,作为回应改进想法,收集更多的数据,并展开更多的讨论,科学才取得了巨大的成功。以下是一些阻力。

1.简单的模型仍然有用

这是 Breiman 愿意承认的一点:在某些情况下,线性模型可能是合适的。例如,如果我们将距离建模为速率的函数,那么这是一个线性关系:距离=速率*时间。然而,自然界中很少有现象遵循如此好的机制(甚至上面的例子在现实世界中也几乎不成立。)线性模型可以在具有很少特征的非常小的数据集的情况下工作,但是当在诸如天文学、气候变化、股票市场预测、自然语言处理等领域中处理较新的问题时很快就过时了。其中数据集很大并且包含成千上万或更多的变量。

算法文化不是放弃数据模型,而是在任何情况下使用最合适的模型。如果线性模型在数据集上记录了最高的预测准确性,则选择该模型。Breiman 的观点是,我们不应该提前假设哪个模型是正确的。算法建模是一种以上的建模方法。

2.过度适应验证数据

过拟合是机器学习中的一个基本问题:参数总是在一些数据集上学习,这并不表示该问题的所有数据。通过选择具有最佳验证分数的模型,我们可能会无意中选择一个对未来数据概括较差的模型。这不是算法模型独有的问题(尽管用更复杂的模型可能更容易过度拟合,因为它有更多的自由参数要训练)。

解决方案不是回到更简单的模型,而是使用更健壮的验证。我更喜欢交叉验证,使用多个训练/测试子集,这样性能就不会因为一个随机选择而有所偏差。该模型可能仍然是过度拟合的(这应该被称为 Kaggle 效应,因为它几乎在每个比赛中都发生),但是一个健壮的验证设置应该在新数据上给出一个体面的性能指标。监控模型在生产中的持续性能也很重要。定期检查模型的准确性没有下降,这将允许您捕捉模型或数据漂移。一旦发生这种情况,你需要建立一个新的模型,收集更多的数据,或者重新开始解决问题。过度拟合是一个严重的问题,但可以通过正确的方法解决。

3.特征重要性

Breiman 关于从复杂模型中提取信息的大部分观点依赖于特征重要性的思想。这在实际的论文中没有定义,但在 Breiman 对批评的回应中有所涉及。他的定义建立在准确性的基础上。一个特性的重要性是通过这个问题来衡量的:在模型中包含这个特性能提高性能吗?

传统上,变量重要性是由线性模型的系数决定的。然而,我们已经看到,多个特征可以产生相同的性能,因此使用学习到的权重作为重要性的度量并不能捕捉任何单一的基本事实。

重要性可变的领域仍未解决。当变量共线(高度相关)时会出现问题,因为要素重要性可能会在要素之间分割。目前还没有一种令人满意的方法来确定哪些变量是最重要的,但基于准确性的方法比基于权重的方法更不主观。SHAP 值还提供了可变重要性的预测测量,使我们可以通过观察输出来了解每个特征值的确切影响。预测特征重要性可能不是某个特征在本质上的“真实”相关性,但它可以给我们变量之间的相对比较。

4.建模的目标

一些统计学家瞄准了建模的目标是预测的想法,主张更加重视信息收集。我的回答是一个没有预测准确性的模型不能提供任何关于这个问题的有用信息。它可能会提供模型权重,但如果它们不能导致准确的预测,我们为什么要试图从中学习呢?相反,我们应该首先关注准确性——这样我们就知道我们的模型学到了一些有用的东西——然后试图弄清楚模型是如何运行的。一个模型必须准确,才能给我们有用的信息!

试图理解一个无法超越简单的无机器学习基线的线性模型是没有意义的。以准确性为目标,然后花尽可能多的时间解释模型。一个没有解释的精确模型要比一个产生废话但给出清晰解释的模型好得多。

结论

这篇文章对我从学术数据科学环境转向工业环境是有用的。最初,我花了很多时间试图理解模型背后的理论或通过直觉解决问题,而不是以准确性为目标,让数据决定模型。最终,我通过经验了解到了这篇论文最重要的一点:先关注准确性,再关注解释。一个模型在值得用于知识提取之前必须具有高预测性能。

这在实践中意味着什么(特别是对那些在工业中的人来说)很简单:集中精力建立一个健壮的验证方案,并找到表现最好的模型。不要花太多时间担心模型背后的理论,直到你知道它是可行的。此外,经验表明,许多模型可以通过不同的特征集产生相同的准确性,附加特征可以提高复杂算法的性能,并且在模型可解释性和准确性之间存在平衡,尽管新技术已经在很大程度上缩小了差距。

当我们看到一个预测或决定时,我们都希望得到解释。然而,我们必须承认,当我们的知识和大脑限制我们时:我们根本无法处理我们现在面临的数据量,我们必须依靠机器来为我们进行大部分推理。机器学习是一种用来解决数据问题的工具,我们应该尽可能使用最好的工具。统计学是一个古老的领域,但这并不意味着它必须停留在过去:通过采用最新的算法,统计学家,甚至是学术界的统计学家,可以解决建模中出现的具有挑战性的新问题。

一如既往,我欢迎任何反馈和建设性的批评。可以通过 Twitter @koehrsen_will 找到我。

即使是经验丰富的定量分析师也会犯的三个主要错误

原文:https://towardsdatascience.com/three-cardinal-mistakes-even-experienced-quants-make-b6e2f8b3bad4?source=collection_archive---------12-----------------------

避免这些简单的错误,成为优秀的量化交易者

量化交易是计算机编程、机器学习、金融和统计的熔炉。要成为量化分析师,你需要精通所有这些交易,至少精通其中一些。许多不同的方法被用来以编程方式确定何时买卖股票,包括时间序列预测(例如:ARIMA & GARCH 模型),机器学习(例如:SVM 或基于股票价格特征的神经网络),以及图表工具(例如:布林线)。不管你来自什么学科,用什么方法,有三件事你必须绝对注意,这常常让有经验的交易者感到困惑。

前瞻偏差

当您的模型可以访问它不应该知道的未来数据时,就会出现前瞻偏差。考虑下面的例子。这是 2019 年,我刚刚编写了一个程序,它使用深度学习来预测股票价格在未来一周内是上涨还是下跌。我有 2010 年以来国家交易所(NSE)所有股票的历史数据。我编写了一个模拟器,并根据 2010 年至 2019 年期间的数据对我的模型进行了回测。交易所列出了 2000 多只股票,但我只想交易流动性好的股票,所以我只对构成指数的 50 只股票(NIFTY50)训练和测试我的模型。而且,哇,我的模拟告诉我,我每年将获得 60%的回报,所以我开始兴奋地交易。像一个优秀的交易者应该做的那样,我将我的模型在现场交易时的表现特征与我在模拟中得到的进行比较,令我沮丧的是,我发现模型在现场交易时表现非常不同。哪里出了问题?

我使用 2019 年指数中的股票在 2010 年至 2019 年期间进行交易。实际上,在 2010 年,我的模型可以窥视未来,并看到一只特定的股票将在 9 年后的 2019 年进入前 50 只指数股票。这是前瞻偏差。正确的股票选择应该是在某一年只使用当年指数中的股票。前瞻偏见可能会以潜移默化的方式渗入到您的代码中,尤其是当您的编程包含复杂的数据操作时。例如,在预计算要素时,某个特定的要素可能会揭示当天的收盘价,这将为您的模型提供有关市场方向的线索。如果你的交易策略在模拟中表现出色,在计算错误后,你首先要检查的是是否存在前瞻偏差。

低估滑动

市场不是在单一价格上运行的。它基于两种价格:买价和卖价。出价是买家愿意支付的最高价格,要价是卖家愿意接受的最低价格。当根据历史数据对模型进行回溯测试时,或者通俗地说,当谈到股票价格时,我们通常会考虑一个价格,通常是最近的交易价格或 LTP。买卖价格之间的差异被称为买卖价差。在模拟时,我们假设如果一只股票的 LTP 是 110.5,我们就可以在 110.5 买入或卖出这只股票。在实时交易中,情况并非如此。如果 LTP 是 110.5,那么出价可能是 110.4,而要价可能是 110.6。如果你在买一只股票,你将能在 110.6 而不是 110.5 买到它。这 0.1 的差异被称为滑移。滑点是不能模拟的,因为它紧密地依赖于实时市场条件和你的仓位大小。大多数天真的交易者考虑交易成本,比如经纪费和交易费,但是他们不考虑滑点。大多数有经验的交易者假设任意的滑点成本占仓位大小的百分比,但是他们从来不去验证这个数字是否符合真实的市场条件,而且更多的时候,他们低估了它。这是一个巨大的错误。

如果你想成为盈利的量化交易者,你必须计算你的滑点成本。有两种方法可以做到这一点。首先,统计方法是获取市场订单快照,并确定不同股票在一天中不同时间的买卖价差。如果你交易的是流动股票,LTP 大致介于买价和卖价之间,用这种方式统计 LTP 的滑点会给你一个大致准确的数字。我推荐的第二种方法是根据经验来决定。当你开始实时交易时,在执行每笔交易前注意 LTP,在执行后注意你的交易价格。经过几个月的交易,计算这两个数字,确定你的滑点成本。对于期权等波动性较大的工具,买卖价差非常大,LTP 可能位于任何地方:在买卖价差之间,或者远在一边。对于这些,经验确定是必由之路。

在测试集上拟合模型

我们都知道为什么需要将数据分为训练集、验证集和测试集。然而,当你日复一日、月复一月、有时甚至数年地研究同一个问题时,你会不经意地开始在测试集上间接拟合模型。理想情况下,测试集应该保存在保险库中,只有在实验完成后才能取出。然而,定量分析师很清楚,我们的实验永远不会结束。我们是炼金术士,我们将继续尝试阳光下的一切,直到我们把我们的模型变成金子。当多个模型在验证集上表现相似时,我们选择在测试集上表现最好的一个。当我们下一次迭代时,我们重复这个过程,最终,通过许多这样的迭代,我们使我们的模型适合测试集。一个解决方案是保留多个测试集,并定期在它们之间切换,这样就不会过度适应任何一个测试集。另一个解决方案是遵守纪律,不要让测试性能影响模型选择,但是相信我,遵守纪律说起来容易做起来难。

结论

量化交易很难,因为你需要正确地运用很多技巧才能让它发挥作用。这三个错误虽然很容易理解,但是业余爱好者和专业人士都经常犯。如果你避免了这些,你已经在成为一个理智的量化交易者的路上了。

如果你喜欢这篇文章,可以在 上查看我的其他作品,在LinkedInTwitter,查看我的 个人网页 ,或发电子邮件至【viraj@berkeley.edu】

欧洲电视网欢乐三图

原文:https://towardsdatascience.com/three-charts-on-the-joy-of-eurovision-e653b8713072?source=collection_archive---------10-----------------------

使用数据可视化更深入地了解欧洲电视网国家的投票模式、战略投票和 LGBTQ 权利

由于它每年吐出的统计数据量巨大,欧洲电视网是创造数据可视化的梦想成真——特别是对我和若昂这样的超级粉丝来说。

在今晚决赛的预期中,我们已经看了哪些国家选择冠军的次数最多;就投票而言,谁是欧洲最好的朋友;同性恋友好国家是否真的更受欢迎?

哪个国家“选择”获胜者?

这不能告诉我们他们对音乐是否有好的品味…

尽管几十年来未能确保获胜,但英国给比赛获胜者最高分的次数最多——在过去 20 年的比赛中这样做了 11 次。因此,在这方面,英国至少可以感到一些自豪。

安道尔和阿塞拜疆的最高分从未颁给获胜者,但罗马尼亚却垫底,因为它参加了更多的比赛。

欧洲有哪些脱颖而出的投票关系?

如果这是一种人际关系,马耳他可能会因为忽视而抛弃意大利

欧洲电视网的乐趣并没有在表演后结束,在我看来,持续到深夜的紧张和公开的政治投票同样令人着迷。

从过去十年的数据来看,我们毫不惊讶地发现,在整个欧洲,邻国之间有许多成对的“最好的朋友”,他们互相交换大量的积分。罗马尼亚和摩尔多瓦名列榜首,分别获得 97 分和 106 分。

更有趣的是,我们还发现了许多不平等的投票关系,其中一方给比他们大的邻居更多的分数,而没有得到很多分数的回报。这可能是因为音乐更好,或者是因为较小的国家没有进入决赛,以获得积分。但是想象这对夫妇中不幸的国家的失望是很有趣的。

欧洲电视迷和同性恋权利有什么关系?

对同性恋权利越差的地方越不感兴趣,在同性恋友好的北欧国家收视率最高

欧洲电视网,有像肯奇塔·沃斯特和达纳国际这样的著名行为,已经被 LGBTQ 社区所接受。它通常被称为同性恋超级碗,但这真的反映在它的收视率上吗?这些地图显示了对同性恋最友好的国家和欧洲电视网最高收视率之间的关系。

但是欧洲并不像我们想象的那样进步,正如下面的粉红色地图所示,中欧和东部边缘地区存在 LGBTQ 歧视和侵犯人权行为。俄罗斯和阿塞拜疆不会令人惊讶,但意大利和瑞士等国家也缺乏 LGBTQ 权利。

我们还分析了过去 20 年的结果,绘制了一张地图,显示欧洲最成功的国家在哪里。我们通过计算一个国家在决赛中的平均排名来得出这个结论。

这里的情况要复杂得多。最成功的国家分为两类,一类是拥有同性恋友好法律和狂热的欧洲电视观众的国家(北欧国家),另一类是同性恋权利和电视观众人数都很少的国家(如土耳其、俄罗斯和意大利)。

请注意,澳大利亚出现在这些地图中,因为它们也在欧洲电视网中——但那是另一回事了!

我们如何创建我们的数据,即?

我们从datagraver.comrainbow-europe.orgoneurope.co.uk下载了数据。然后,我们使用 React 来处理数据,并创建两个投票图表的核心部分。然后,我们使用矢量图形编辑器 Sketch 进行设计修正。对于地图,我们使用 datawrapper.de 来创建它,并使用ezgif.com将它制作成 GIF 动画。

喜欢你看到的吗?在 Twitter 上关注我们的 Eurovision #dataviz:

奥利弗·卡林顿

Jupyter 笔记本的 3 大新增功能

原文:https://towardsdatascience.com/three-great-additions-for-your-jupyter-notebooks-cd7373b00e96?source=collection_archive---------9-----------------------

最有用的扩展我找到了。 不要错过这个。

我喜欢 Jupyter 笔记本电脑以及它们提供的强大功能。

它们可以用来以最有效的方式展示发现和共享代码,这在以前的 ide 中是不容易的。

然而,仍有一些不足之处。

在我的文本编辑器中,有一些我渴望的功能是 Jupyter 默认没有的。

但是不要担心。就像 Python 中的所有东西一样,Jupyter 也有第三方扩展。

这个帖子是关于我发现的一些最有用的扩展。

1.可折叠标题

我最喜欢的一个扩展是可折叠标题。

它使笔记本的流程更容易理解,也有助于创建像样的笔记本。

要获得这个,在终端窗口上用这个命令安装jupyter_contrib_nbextensions包:

conda install -c conda-forge jupyter_contrib_nbextensions

软件包安装完成后,我们可以使用以下命令启动 jupyter 笔记本:

jupyter notebook

一旦你进入 jupyter 笔记本的主页,你可以看到为NBExtensions创建了一个新标签。

使用这个包我们可以得到很多扩展。

看起来是这样的:

2.自动导入

自动化是未来。

困扰我的一件事是,每当我在我的任何数据科学项目中打开一个新的 Jupyter 笔记本时,我需要复制粘贴许多库和其中一些的默认选项。

告诉你一些我常用的进口货:

  • Pandasnumpy——在我看来,Python 必须将这两个设为默认导入。
  • Seaborn ,matplotlib, plotly_express
  • 改变一些熊猫和海豹的默认选项。

这是我最后反复粘贴的脚本。

import pandas as pd
import numpy as npimport plotly_express as px
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline*# We dont Probably need the Gridlines. Do we? If yes comment this line*
sns.set(style="ticks")# pandas defaults
pd.options.display.max_columns = 500
pd.options.display.max_rows = 500

有没有一种方法可以让我自动化?

只需转到nbextensions选项卡并选择snippets扩展。

您需要对snippets.json文件进行以下更改。你可以在/miniconda3/envs/py36/share/jupyter/nbextensions/snippets位置找到这个文件。这个位置的 py36 是我的康达 virtualenv。我花了一些时间为我找到这个位置。你的可能不一样。请注意,你不必在site-packages转车。

您可以在下面看到这个扩展的运行。

相当酷。对吗?我还用它来为我的深度学习笔记本和基于 NLP 的笔记本创建基本片段。

3.执行时间

我们已经使用了%time以及基于 decorator 的定时器函数来测量我们函数的时间。您也可以使用这个出色的扩展来完成这项工作。

另外它看起来很棒。

只需从NBextensions列表中选择ExecutionTime扩展名,每次单元执行后,您将在单元底部看到执行结果以及单元执行的时间。

其他扩展

NBExtensions有很多扩展。我喜欢 NBExtensions 的一些其他扩展,您可能想看看:

  • 限制输出:自从你在笔记本上打印了很多文字后,你的笔记本有没有挂过。这个扩展限制了一个代码单元下可以打印的字符数
  • 2 to 3 converter:旧 python2 笔记本有问题。厌倦了更改打印报表。这个很好。

  • Live Markdown Preview: 我们中的一些人喜欢在笔记本上用 Markdown 来写博客。当你在写作中犯错误时,有时会很紧张。现在,您可以在编辑 markdown 单元格的源时看到其渲染输出的实时预览。

结论

我喜欢 Python 中的所有东西都有一个包。这同样适用于 Jupyter 笔记本电脑。

jupyter_contrib_nbextensions包开箱即用。

当涉及到检查执行时间、滚动笔记本和重复任务时,它让我的生活变得容易多了。

这个包确实提供了许多其他的扩展。一定要看看它们,看看哪些对你有用。

另外,如果你想学习更多关于 Python 3 的知识,我想从密歇根大学调出一门关于学习中级 Python 的优秀课程。一定要去看看。

我以后也会写更多这样的帖子。让我知道你对这个系列的看法。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

三款 Jupyter 笔记本扩展,最大限度减少干扰

原文:https://towardsdatascience.com/three-jupyter-notebook-extensions-that-minimize-distractions-bd9ec98f0e2c?source=collection_archive---------4-----------------------

通过关注重要的事情来提高你的生产力

Picture From Unsplash

为什么使用 nbextensions?

Jupyter 笔记本扩展,也称为 nbextensions,是帮助您提高工作效率的工具。它们提供了许多有用的功能,例如所谓的“变量检查器”,可以让您跟踪您定义的所有变量。然而,有一类特殊的鲜为人知的 nbextensions:那些专注于最小化分心的事物。在这篇文章中,我将首先向您解释如何安装 nbextensions,然后介绍三种 nbextensions,它们将通过最大限度地减少干扰来提高您的工作效率。

安装 nbextensions

有几种方法可以安装 nbextensions。例如,您可以逐个单独安装 nbextensions,但是,有一种更方便的方法。在安装jupyter _ contrib _ nbextensions的基础上,额外安装jupyter _ nb extensions _ configurator将提供管理 nb extensions 的便捷方式。

然后,在您的终端中运行以下代码块,以同时安装这两个程序:

**conda install -c conda-forge jupyter_contrib_nbextensions jupyter_nbextensions_configurator**

安装 nbextensions 和配置程序后,您可以看到所有可用的扩展,并通过导航到localhost:6006/extensions来激活它们。

既然已经安装了所有的需求,让我们看一下前面提到的三个 nbextensions:

1.便条簿

这个扩展正是它听起来的样子。scratchpad notebook 扩展允许您针对当前内核运行代码,而不必为了实验或计算的目的在实际代码之间不断添加新单元。使用 Shift+Enter 打开草稿栏,并通过 Ctrl+B 关闭草稿栏。

2.代码折叠

如果你是 RStudio 的狂热用户,你可能会错过使用 Juypter 笔记本时代码折叠创建的结构。这个扩展解决了这个问题。有三种受支持的代码折叠选项:

1.缩进折叠

该算法检测缩进,并允许您一个接一个地折叠缩进。这意味着您可以更加灵活地选择要折叠的代码量。

为了形象化,让我们看一下下面的代码单元:

如你所见,有两个缩进。因此,这个代码单元可以折叠成:

并且还融入了:

2.首行注释折叠

另一种方法是折叠首行有注释的单元格。这将导致只显示第一行的注释,而不是整个单元格。这样做,您可以在删除代码的同时,在第一行保留对单元格的简短而精确的描述。

因此,下面的单元格…

…可以折叠成:

3.魔术折叠

同样的概念也适用于第一行中的魔法命令。这种特殊的折叠选项对于导入包的单元格特别有用。这个选项的另一个应用是删除所有不是 Python 的代码,以避免可能的干扰。

折叠会将上面的单元格变成:

此外,在保存 Jupyter 笔记本时,您的所有文件夹都会被保存。

3.zenmode

我将在本文中介绍的第三个也是最后一个 nbextension 可能是三个中提到最多的。zenmode 扩展将删除菜单,使您能够专注于您的代码。在我看来,这也将使 Jupyter 笔记本界面在视觉上总体上更具吸引力。

下面的 GIF 说明了以上情况:

结论

对你的工作环境进行小小的改变会对你的工作效率产生巨大的影响。当设计一个人的工作环境时,最大限度地减少干扰和完全专注于编码是最重要的目标之一,使用 nbextensions 是一种很好的方式。当然,这三个扩展并没有包含 nbextensions 必须提供的所有功能。因此,如果你想了解更多,我会推荐你深入研究文档

参考文献:

[1] [非官方 Jupyter 笔记本扩展文档](http://Unofficial Jupyter Notebook Extensions)

数据科学和统计学之间的三个关键区别

原文:https://towardsdatascience.com/three-key-differences-between-data-science-and-statistics-7fe9a6535659?source=collection_archive---------28-----------------------

Picture from Andrea Piacquadio

数据科学在过去几年里越来越受欢迎,许多人把它和它更古老、更熟悉的亲戚统计学混淆了。作为一个既做过数据科学家又做过统计学家的人,我经常遇到这样的困惑。这篇文章试图澄清他们之间的一些关键差异。

不过,在我讨论它们的区别之前,让我们先定义一下它们。统计学作为一门学科是指收集、组织、分析和交流数据的数学过程。在统计学中,我通常将“传统”统计学定义为统计学导论课程中教授的统计过程,如基本描述统计学、假设检验、置信区间等:通常是统计学以外的人,尤其是商界人士,听到“统计学”这个词时的想法。

数据科学从最广泛的意义上讲,是一门组织、处理和分析计算数据以解决问题的多学科科学。尽管数据科学与统计学和“传统”统计学相似,但它们都有所不同:

区别 1:数据科学不仅仅是一个数学领域

统计学是数学的一个领域;然而,数据科学不仅仅指数学。简而言之,数据科学以使用计算数据来解决问题为中心,【I】这意味着它包括分解计算数据所需的数学/统计学,还包括高效和有效地编写这些算法所需的计算机科学和工程思维,以及基于该分析制定战略决策的业务、政策或其他特定主题“智慧”。

因此,统计学是数据科学的重要组成部分,但数据科学不仅仅包括统计学。统计学作为数学的一个领域,恰恰包括分析和解释数据的数学过程;然而,数据科学还包括通过计算进行分析的算法问题解决,以及利用该分析做出决策以满足上下文中实际需求的艺术。统计学显然是数据科学过程的重要组成部分,但数据科学通常是指分析计算数据的整个过程。在实践层面上,许多数据科学家并非来自纯粹的统计背景,而是来自计算机科学或工程,利用他们的编码专业知识来开发高效的算法系统。

Picture from Carlos Muza

差异#2:综合数据与样本数据

在统计研究中,研究人员通常无法分析整个群体,也就是他们正在分析的整个群体,因此他们创建了一个更小、更易于管理的个体样本,他们希望这个样本能够代表整个群体。然而,数据科学项目通常涉及分析大量的总结性数据,封装整个群体。

传统的统计工具非常适合科学研究,在科学研究中,人们必须走出去收集有关所讨论主题的数据。因为这通常非常昂贵和耗时,研究人员在大多数时间只能收集更广泛人群的子集数据。

计算的最新发展,包括收集、存储、传输和处理更大计算数据的能力,扩展了现在可能的定量研究的类型,数据科学已经发展到解决这些新类型的研究。许多数据科学项目需要从已经收集的关于整个人口的大量数据中找到有意义的见解,而不是根据一组经过严格审查的变量收集精心选择的人口样本。

Picture from Hans-Peter Gauster

区别#3:探索性与确认性

数据科学家经常寻求建立模型,用数据做一些事情;然而,统计学家通过他们的分析试图从数据中学习一些东西。因此,数据科学家通常会根据他们执行给定任务的效率来评估他们的机器学习模型,例如它在优化变量、确定最佳行动过程、正确识别图像特征、为用户提供良好建议等方面的表现。为此,数据科学家通常会根据选定的性能指标来比较许多模型的有效性或准确性。

在传统统计学中,问题通常围绕使用数据来理解基于样本发现的研究主题。接下来的问题围绕着样本能对更广泛的人群说些什么,以及它的结果有多大可能代表或适用于更广泛的人群。

相比之下,机器学习模型通常不寻求解释研究主题,而是一些事情,这可能导致非常不同的研究策略。数据科学家通常试图确定/产生具有最佳性能的算法(给定他们用来评估性能如何“更好”的任何标准),在此过程中测试许多模型。统计学家通常采用他们认为能准确代表背景的单一模型,然后根据该模型得出结论。

因此,数据科学通常是探索性分析的一种形式,通过试验几种模型来确定某项任务的最佳模型,并进行统计验证性分析,试图确认得出给定假设对更广泛的人群来说是正确的结论的合理性。

大量的科学研究已经从理论上证实:一个科学家有一个世界的模型或理论;他们设计并实施了一个实验来评估这个模型;然后根据实验结果使用假设检验来确认或否定该模型。随着数据可用性和计算的变化,探索性分析、数据挖掘和使用数据生成假设的价值急剧增加(Carmichael 126)。

数据科学作为一门学科,一直处于利用不断增长的计算能力进行探索性工作的前沿。

Picture from Kendall Lane

结论

我的一位数据科学家朋友曾经打趣我说,数据科学就是应用计算统计学。这是有一定道理的:数据科学的数学工作属于统计学范畴,因为它涉及收集、分析和交流数据,而且,由于它强调和利用计算数据,它肯定会成为计算统计学的一部分。数据科学的数学也非常明确地得到应用:面向解决实际问题/需求。因此,数据科学和统计学是相互关联的。

然而,它们在正式定义和实际理解上都有所不同。现代计算和大数据技术对数据科学产生了重大影响。在统计学中,计算统计学也试图利用这些资源,但是已经成为“传统”的统计学(还)没有包含这些资源。我怀疑在未来几年或几十年,现代计算、数据科学和计算统计学的发展将重塑人们认为的“传统”或“标准”统计,使其更接近今天的数据科学。

有关更多详细信息,请参见以下有用资源:

伊恩·卡迈克尔和 J.S .马龙的“数据科学与统计学:两种文化?”在日本统计与数据科学杂志:【https://link.springer.com/article/10.1007/s42081-018-0009-3

“数据科学家与统计学家”在https://opendatascience . com/Data-Scientists-vs-statistics/https://medium . com/odsc journal/Data-Scientists-vs-statistics-8ea 146 b 7 a 47 f

https://www.educba.com/data-science-vs-statistics/举办的“数据科学和统计学之间的差异”

【我】卡迈克尔 118。

https://ethno-data.com/data-science-vs-statistics/】可以在这里找到原版出版物。其余的文章请随意查看:【http://ethno-data.com/。**

也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见

每个人都应该知道的三个关键误差区间

原文:https://towardsdatascience.com/three-key-error-intervals-everyone-should-know-658e2d8bfe?source=collection_archive---------31-----------------------

说“推断统计”这个词,人们通常会惊恐地睁大眼睛,但他们不必如此可怕,一旦你知道他们在做什么,他们就可以成为有用的工具。

不管你喜不喜欢,数据科学是围绕着解释数据和讲述数据给我们带来的故事而建立的。为此,对于人们要有信心( p 值有人吗?)在我们所说的话中,我们经常需要量化我们给出的价值。这要求我们对统计学和误差估计有所了解和理解。例如,能够辨别一个图表上的一个大的突然变化是真实的还是不真实的,可能是一个公司花费资源去纠正它的区别。

出于这个原因,当结果被呈现时,你能理解、解释和说明你可能看到或使用的三种主要类型的区间是什么是至关重要的。因此,我将讨论置信区间和它的另外两个兄弟姐妹(预测性和耐受性),以及置信水平。

Photo by Isaac Smith on Unsplash

我们为什么关心?

很常见的是,当我们研究某一特定人群时,我们收集的数据只是该总人群的一个样本(例如,因为它太耗时或太大而无法收集),然而,我们经常希望使用该样本来“推断”他们所来自人群的一些情况。每个人最熟悉的最常见的统计数据是平均值。

样本的均值是总体均值的无偏估计量,但它是一个“点估计,它只给出一个要处理的值,如果我们从总体中随机选择另一个数据样本,它很可能会给出不同的均值。因此,计算一个“区间估计”通常是很好的,这是我们为感兴趣的总体参数构造一个似是而非的值的地方。我今天要讨论的三个区间涵盖了不同的区间估计,对回答不同的问题很有用。但是我们的区间估计有多宽呢?一般来说,这是由我们采集的样本数量和我们希望区间估计具有的置信度决定的(请查看下面的链接以了解更多信息)。

这些区间估计可以总结为:

  • 置信区间——我想要一个总体参数的可信值范围,比如它的平均值
  • 预测区间 —我想知道未来的观察值可能是多少,给定我从先前的观察中所知道的
  • 容差区间 —我想知道包含一定比例/百分比人口的数值范围

置信级别

Photo by Chris Liverani on Unsplash

阅读任何科学论文,你都可能听到关于置信水平的讨论(不要与置信区间混淆)。这通常以百分比的形式引用,常见值为 90%、95%和 99%(尤其是对生命至关重要的应用)。但是它们是什么意思呢?一个常见的误解是,它们告诉您真实(或真实)总体参数包含在该区间内的概率,而它真正的意思是,如果您重复采样并无限次计算该区间,置信水平是包含真实值的区间的百分比。这似乎不是一个很大的区别,但这是一个微妙的区别,它基于频率统计的基础。在大多数情况下,这种微妙之处并不重要,但如果有人向你挑战,知道这一点是有好处的。你会发现,对于给定的样本量,置信水平越高,区间估计覆盖的似是而非的值的范围就越大。在极端情况下,如果您使用 100%的置信水平,则计算的区间将包含参数可能取的所有可能值。当有人问生产过程中要破坏性测试多少个器件,以确保该批产品 100%可靠时,这通常会引起惊讶。

注意:如果您确实想要一个区间来说明真实值包含在这些值中的概率,那么我会查看基于贝叶斯统计的可信区间(我在这里不涉及这些,但是这里的、这里的和这里的是一些介绍链接)。

置信区间

这可以针对几个群体参数(中值、平均值等)进行计算。)但最常用于总体均值。这将给出总体均值的一系列似是而非的值(给定置信水平和数据样本),上限和下限称为置信上限和置信下限。这些的确切公式取决于被计算的人口参数,但是如果你想知道更多,我在这里提供了一些链接( 12 )。这个区间没有给出从总体中的单个样本中可能得到的值的范围。这就是预测区间可以发挥作用的地方。

预测区间

这种情况通常出现在回归分析中,此时您对数据进行了直线拟合,并想知道另一个样本的值可能在哪里。它使用你先前样本的信息来构建它。它们可用于计算参考范围,参考范围用于确定测量值的正常范围。例如,给定一条生产线上的测试样品,下一个样品应在此范围内(如果预测间隔超过工程公差,那么您可以在样品生产或测试前就如何处理做出决定,等等。).你可以在这里阅读更多关于预测区间的内容( 123 )。

公差区间

这是一个没有多少人听说过,但在工业上有很多有趣的用途和应用。这个区间是一个似是而非的数值范围,包含了一部分人口。我个人曾在可靠性工程中见过它的使用,在那里它被用来获得正在制造的产品的使用值,以确定实际的上限值和下限值来测试设备的可靠性(即 95%的人会在两年保修期内至少打开这个开关两次,最多 20,000 次)。我第一次在一本旧的海军条例手册中读到这些(他们想确定一定比例的射击落在目标的一定范围内),但如果你环顾四周,你可以在网上找到更多现代来源( 123 )。

关于公差区间的最后一节还提出了这样一个事实,区间不必同时有上限和下限。你可以计算它们只有一个上限或下限。在容差区间的例子中,这在可靠性方面很有用,因为您可能想知道 0 到 95%的客户使用值,并测试上限的极值。

我希望这是一个有趣的,如果短期的高层次的看那种在你的数据科学工具包中有好处的统计。

机器学习中的三个关键失败

原文:https://towardsdatascience.com/three-key-fails-in-machine-learning-50b386b08bef?source=collection_archive---------23-----------------------

与机器学习相关联的神话可能会导致对何时以及如何应用机器学习的糟糕判断

我对分析学的介绍有点落后。我第一次大量参与任何类型的专门分析项目是机器学习项目。我的意思是,如果你要做这件事,为什么不做到底呢?

我不是在抱怨。这是一次奇妙的学习经历。它教会了我很多关于高级分析的技术方法。我了解了技术和数据管理。但最重要的是,我了解了一个神话是如何围绕着术语机器学习发展起来的,而事实上,它一点也不神秘。我记得在团队会议上,不知情的参与者将我们正在做的事情描述为“黑暗艺术”。

现实是,机器学习没有任何黑暗、神秘或神话的东西。在机器学习方法中采用的大多数统计方法在贝叶斯方法的情况下已经知道了几十年,甚至几个世纪。机器学习这个术语的激增完全是关于技术,以及它如何使我们能够以计算资源以前变得具有挑战性或完全不可能的方式将这些方法应用于大型数据集。

然而,神话依然存在。有很多人相信,或者被引导相信,机器学习项目可以执行某种超现代的魔法,挑战人类解决同一问题的所有方法。这是危险的,因为这可能意味着个人或团队在没有适当的批判性思维和人类判断的情况下,基于某种奇迹将会发生的信念,开始了占用大量资源和时间的努力。

在我继续之前,我想澄清一下:我不是在批评机器学习本身。有无数的使用案例表明,它带来了价值和效率,如果没有机器学习带来的突破,我们今天的生活将不会一样。不,我的观点是,我们不应该相信机器学习在所有情况下都有效,我们应该对如何以及何时投资这些技术更加谨慎。

为了说明我的观点,这里是我在机器学习项目中目睹的三个主要失败。

1.目标设定不当

根据我最近写的另一篇文章,了解并阐明机器学习项目的目的是至关重要的。要么你建立你的模型来解释某事,要么你建立它来预测某事。大多数时候,一个更好地解释一种现象的模型在预测它时并不是最优的。此外,能够很好地预测某些事情的模型通常具有非常明显的特征,并且构成了预测能力的很大一部分,所以这并没有给它们很大的解释能力。

机器学习工作的目的得到所有各方的澄清和同意是至关重要的。我们建立一个模型主要是为了解释或预测。它不能两者兼而有之。这一点应该没有疑问。

2.糟糕的实验设计

假设你在一家销售公司工作,你想建立一个模型来解释是什么推动了销售代表的成功销售。你已经知道并且永远知道的一件事是,销售代表对现有客户的销售比对新客户的销售更成功。

你收集所有你能找到的数据,进行学习,然后在一次大型会议上宣布销售的三大解释性驱动因素是:

  • 客户以前是否购买过
  • 这是否是该代表以前拜访过的客户
  • 在反馈调查中,客户是否对销售代表评价很高

显而易见,所有这些驱动因素都与一个我们已经知道很重要的因素有关,因此这种努力没有提供任何附加值,事实上,通过包括这些数据,模型的数学现在被一个我们已经知道的因素所主导。如果有人预先考虑如何设计工作,这是可以避免的。也许我们可以删除这些数据,或者将样本限制在该组之外的客户。

3.糟糕的实际规划

无论你是出于解释还是预测的目的开始从事 ML,很少有人会想到成功的后果。

如果你建立了一个可以帮助诊断员工缺勤原因的模型,或者一个可以预测生产问题的模型,或者其他什么模型,你需要能够实际部署它。这时,您会发现模型中使用的一些数据源是从需要大量手动操作的文件中提取的。或者您发现一些输入是基于缺失数据估算的。

关键是,如果您正在开发 ML,希望它在未来得到部署,以帮助更有效地诊断或预测事物,您需要确保输入数据可以轻松地流入预测引擎。我见过如此多的人工智能成果,它们使用的数据没有机会被轻易改造,这就产生了一个全新的令人头痛的问题,而这个问题本可以被更好地预测。

虽然机器学习为我们如何理解数据提供了如此多的潜力,但我们仍然远远没有达到任何数据集都能保证成功学习的地步。事实上,没有强大的设计和规划,没有对数据结构的良好直觉,机器学习项目最终可能会浪费大量的时间和精力。通过检查目标、实验设计和实际计划,你会很好地意识到它是否值得。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在 LinkedIn Twitter上找我。

每个数据科学家都应该知道的三种模型解释方法

原文:https://towardsdatascience.com/three-model-explanability-methods-every-data-scientist-should-know-c332bdfd8df?source=collection_archive---------6-----------------------

排列重要性和部分相关性绘图新版 scikit-learn 0.22 支持(庆祝🎉!)和 SHAP 作为奖励。

Photo by Sagar Patil on Unsplash

2019 年 12 月 3 日,新版scikit-learn0.22 版本发布,其中附带了许多精彩且不容错过的功能,作为其 发布亮点 scikit-learn 0.22给出了一个快速总结:

  • 新增绘图 API:[plot_roc_curve](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.plot_roc_curve.html)[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.plot_partial_dependence.html#sklearn.inspection.plot_partial_dependence)[plot_precision_recall_curve](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html)[plot_confusion_matrix](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.plot_confusion_matrix.html)
  • sci kit-学习堆叠[StackingClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingClassifier.html)[StackingRegressor](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingRegressor.html)的原生类。
  • 一个 scikit-学习排列重要性的本地函数,[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)
  • 一个新参数 [ccp_alpha](https://scikit-learn.org/stable/modules/tree.html#minimal-cost-complexity-pruning)用于基于决策树的模型修剪树。
  • 支持 AUCROC 函数 [roc_auc_score](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html)的多类分类。
  • ….

看到了吗?很多期待已久的功能!尤其是原生支持堆叠岩石!但是在这篇文章中,我们来看看模型可移植性的三个重要工具* 其中一部分是由[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.partial_dependence.plot_partial_dependence.html)[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)在新版本 scikit-learn 中实现的。*

目录

  1. 为什么可解释性很重要?
  2. 首先要做的是…
  3. 可变重要性-基于树的模型可变重要性
  4. 可变重要性—排列重要性
  5. 部分相关图
  6. 沙普利附加解释(SHAP)
  7. 那么,用哪个呢?
  8. 结论
  9. 参考

1.为什么可解释性很重要?

人们经常说机器学习模型是一个“黑匣子”。

人们知道他们非常擅长预测,但当有人问他们为什么擅长预测时,像损失函数最小化或利润最大化这样的行话不会有帮助。

相反,人们想听到的是“变量 A 正作用+10,变量 B 负作用-2…* ”之类的东西,这就是线性模型相对于高级 ML 算法的常见嫌疑人的优势。*

尽管如此,由于许多研究人员的贡献,现在有一些有用的工具来给机器学习模型赋予可解释性* 。*

有了那些工具,我们就可以知道和理解(至少感觉像*我们理解)那个哪个变量对预测的影响有多大?*****

根据 Kaggle 教程“机器学习可解释性”,可解释性的好处如下:

调试

-您可以从对预测的可疑影响中识别错误的预处理或数据泄漏。

通知特征工程

-当你没有直觉什么样的变量组合能给出好的预测力时,数据可解释性研究可能会给你一个答案。

指导未来的数据收集

——值得投资收藏的可能新变量是什么?

通知人类决策

-通过预测原因的可视化为人类决策提供洞察力。

建立信任

-如果解释与人类或专家的共同感知相匹配,它可以建立对模型的信任。

现在我将介绍三种常见的解释工具,

  • 可变重要性(基于树或通过排列)
  • 部分依赖图
  • SHAP

SHAP 不在这次 sklearn 更新中,但是我把它包括在列表中,因为它对模型的可解释性很重要。

------【变量重要性】-给出每个变量的‘重要性’量。 每个变量都有代表重要性的单值,它们的绝对值没有任何实际用途 因为它们就像变量的存在对损失函数值的影响。****

-偏相关图给出变量变化对预测的影响程度。 图的比例实际上对应于目标变量的比例,容易理解。 同样, 我们可以检查曲线上的变量变化 ,不是单个变量的值不像上面所说的变量重要性。**

-【SHAP】给出 每行上的每个变量对预测贡献了多少。**

-作为奖励,“LIME”是另一种模型解释方法,它给出预测的行和列级分解。我不会在这里过多地谈论 LIME,但让我们只说 LIME 是 SHAP 的精简版(SHAP 需要时间来计算,特别是在内核 SHAP 的情况下。)参见 这篇才华横溢的帖子 作者 Joshua Poduska 更多莱姆和 SHAP 的对比。**

Photo by Joao Tzanno on Unsplash

2.首先要做的是…

但是在深入到个体解释方法之前,我需要指出的是我们首先要做的是制造一个性能良好的模型,我们不能期望从糟糕的模型中获得正确的见解!这是因为每个解释逻辑都假设模型的预测足够好。****

因此,你不能指望模型解释取代 EDA 。相反,它是为了更好的特征工程而支持和增强 EDA(回到第一章并回顾“为什么可解释性很重要?“!!)****

3.可变重要性-基于树的模型可变重要性

“变量重要性”给出每个变量的“重要性”数量。每个变量都有一个代表重要性的值。我们应该记住的另一个性质是它们的标度没有任何实际意义因为它们是变量的存在对损失函数值的影响量。****

基于决策树的模型(决策树分类器、CART、随机森林、lightgbm 等。)有自己的可变重要性计算逻辑,基于通过节点分裂减少损失函数(参见此处了解更多细节),但是记住 GBDT 倾向于有多个选项来计算重要性,默认选项不是必要的损失函数减少。它可以是其他指标,如感兴趣的变量的分裂计数。****

姑且称之为“基于树的模型变量重要性”由于模型特定的架构,基于树的模型重要性是可计算的,因此训练过程是在单个变量、离散决策上分割节点,并且很容易比较进行不进行****

然而,难道其他模型不能表现可变的重要性吗?答案是肯定的!这就是“排列重要性”的原因!

4.可变重要性—排列重要性

" Per mutation importance "与模型无关的变量重要性方法*,这意味着它们不需要像决策树一样的单个变量相关的离散训练过程。他们是怎么做到的?*******

Illustration of how to calculate permutation importance (https://www.kaggle.com/dansbecker/permutation-importance)

使用上表中的变量名,假设我们想预测一个人 20 岁时的身高(第一列),使用 10 岁时的数据(其他列)。

现在,我假设我们已经训练了一些模型,并且具有下降精度(下面的步骤 0)—同样,如果没有下降模型,我们无法获得变量重要性。

0。成功做出一个好的预测模型。

1。排列重要性从随机排列单个列中的值开始,以准备一种“新的”数据集。

2。接下来使用“新”数据,使用预训练模型进行预测(不要使用“新”数据重新训练模型!).精度应该比原始数据的精度稍差,并且应该增加损失函数。注意损失函数增加。

3。将数据恢复到原始顺序,重复相同的洗牌,并在下一列进行测量。

4。可选但常见的是,将所有变量中的重要性标准化为总计 1.0。

5。改变洗牌,我们可以多次计算一个变量的重要性。因此,我们可以计算排列重要性的平均值和标准差。

下面是使用 sci kit-learn 0.22 版中新函数[permutation_importance](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html)的示例代码。使用的数据集来自 Kaggle 竞赛“纽约市出租车费用预测”。代码的输出是基于树的变量重要性与排列重要性输出的比较。

Tree-based vs. permutation importance. Find permutation importance has confidence interval.

5.部分相关图

变量重要性为每个变量给出一个重要性分数,这有助于了解哪个变量影响更大或更小。

【PDP】则给出了代表变量在哪个取值范围对最终预测影响有多大的曲线。****

Illustration of Partial Dependence Plot (PDP)

在从原始数据表拟合模型后,有意地将想要获得 PDP 的变量值更改为特定量,并运行预测,重复预测以覆盖区间。

PDP 可以通过 scikit-learn 版本 0.22 中的新函数[plot_partial_dependence](https://scikit-learn.org/stable/modules/generated/sklearn.inspection.plot_partial_dependence.html)实现。

1D partial dependence plots of lightgbm model prediction from NY taxi fare data

可以存在双变量版本的 PDP。新的 scikit-learn 功能支持其中任何一种。****

2D partial dependence plots of lightgbm model prediction from NY taxi fare data

从上面的 PDP 输出中,我们可以看到 PDP 的计算量更大,并且需要时间来运行,尤其是一个 2D PDP 甚至需要 13 秒。

6.沙普利附加解释(SHAP)

【SHAP】与其他方法论最重要的区别是,SHAP 赋予行&变量级影响预测****

Illustration of SHAP

在该图中,每个记录 ID 的预测值将被分解为“预测”=“平均预测”+“每个变量的 SHAP 值”****

那么,他们是如何做到的呢?SHAP 是基于联盟博弈论中的 Shapley 值方法。Shapley 值的本质是衡量联盟中每个成员对最终结果的贡献,保持贡献的总和等于最终结果。进一步讨论见此处

这里的数学机制太难描述了,我也不完全理解:),但至少我们可以运行 API 来获得 SHAP 值,这要感谢 python 库 [shap](https://github.com/slundberg/shap)

How SHAP values look like.

SHAP: Visualize SHAP values to the first row data (prediction average 8.486 to first row prediction 5.86)

SHAP: Variable importance-like plot (based on average of absolute SHAP value)

SHAP: PDP-like visualization

SHAP: Each plot represents one data row, with SHAP value for each variable, along with red-blue as the magnitude of the original data.

SHAP: Plot to play around interactively (two axis have pull-down menu to change items to show)

Photo by Lan Pham on Unsplash

7.那么,用哪个呢?

我们看到了三种不同的模型可解释性输出:可变重要性、PDP 和 SHAP。它们都提供不同外观的输出。当我们想要解释的时候,我们如何选择其中之一呢?

a.SHAP 值可以用于其他任何事情。

第一点是:

从某种意义上说,SHAP 具有优势,因为他们提供最精细的输出。

粒度输出可以汇总为粒度更小的输出,反之则不成立。这表明:

根据 SHAP 值,我们可以计算出可变重要性结果和 PDP 图:

取每个变量的绝对 SHAP 值的平均值将是一种变量重要性,绘制变量值对同一变量的 SHAP 值是一种 PDP。

这个网页给出了一个令人敬畏的列表,并解释了 SHAP 值的可能用途,甚至像使用 SHAP 值进行聚类

b.那么,为什么人们不总是使用 SHAP 呢?

SHAP 的一个缺点是它需要较长的计算时间。有两种类型的 SHAP,据报道“kernel shap”超级超级慢(参见上面示例代码中的注释;它慢了 40K 倍!!),而另一种类型“TreeSHAP”则实现速度更快。然而,让我们记住一件事:

不幸的是,TreeSHAP 只适用于基于决策树的模型。

不使用 SHAP 的另一个原因是,你为什么想要模型解释,

获取行和列级别的 SHAP 值可能会矫枉过正,而且不是实现目标的直接方法。

c.当可变重要性足够时

在某些情况下,可变重要性就足够了,我们不需要 PDP 或 SHAP。

  • 当我们希望领域专家对模型合理性进行嗅探测试时。

可变重要性给出其对预测的重要性的单一分数。这可以让非数据专家的领域专家确保模型是合理的。他们只能从每个变量的重要性的条形图中进行判断,如果不常见的变量变高,这可能是识别模型错误或数据泄漏的提示。

  • 当我们要对变量重要性的顺序做变量选择时。

变量选择在建模中非常有用,可以用更简单的方式解释模型,消除模型噪声以提高精度,避免共线性等。

对于可变重要性输出,我们可以选择具有最高重要性的原始变量集的子集。

在上面的纽约出租车费用示例中,很明显,乘客数量与费用金额无关,这从常识来看是有道理的,因为纽约出租车费用公式与乘客数量无关(虽然乘客多的出租车可能比单人出租车走得更远,但这对于我们从上下车地点获得的信息来说并不是新信息。)

d.PDP 够用的时候。

此外,在某些情况下,我们想要的不仅仅是可变的重要性,但是 PDP 就足够了,SHAP 也是多余的。

  • 当我们知道哪个变量是重要的,而我们只想挖掘“如何”时。

通过变量重要性研究,我们可以知道哪个变量使模型具有预测性,但接下来我们很自然地开始想知道它是如何做到的,即重要变量的哪个范围使预测更高或更低。

在上面的纽约出租车费用的例子中,我们了解到的是,在经度或纬度的终点,而不是中间让乘客上车或下车的出租车应该有更高的收益——曼哈顿中间的乘客很可能是短途乘客。

从这里,自然要想出一个新的特征工程思想来取取送地点之间的距离,而不仅仅是那两个单独的绝对位置。

Photo by Priscilla Du Preez on Unsplash

8.结论

模型可解释性在调试、特征工程、指导未来的数据收集、人类决策和建立信任中是有用的。

我已经介绍了三种类型的可解释性方法,可变重要性(基于树和排列),部分依赖图(PDP)和 SHAP。

虽然 SHAP 是了解模型可解释性的最细粒度的方法,并且可以检索类似于其他方法的输出,但是运行会花费时间并且变得过度。

我们数据科学家应该首先从为什么我们想知道模型的解释开始,并使用最符合目的的方法。

9.参考

sci kit 发布亮点-学习 0.22

Kaggle 课程“机器学习可解释性”

Christoph Molnar“可解释的机器学习——让黑盒模型变得可解释的指南。”

Joshua Poduska“SHAP 和 LIME Python 库:第 1 部分——伟大的解释者,两者都有优点和缺点”

在现实世界中扩展机器学习的三种实用方法

原文:https://towardsdatascience.com/three-practical-ways-to-scale-machine-learning-in-the-real-world-7a63504212fc?source=collection_archive---------25-----------------------

随着 NeurIPS 向人工智能世界发出了一个发人深省的信息,机器人行业似乎对扩展机器学习解决方案有了更务实的态度。

NeurIPS(神经信息处理系统会议)刚刚以创纪录的出席人数结束,即使是抽签系统也难以容纳。9000 张门票在 12 分钟内售罄,向来自世界各地的 AI 展示了爆炸式的兴趣。然而,尽管人工智能创新不仅开始在学术界出现,也开始在工业界出现,但大多数公司仍在努力识别高价值的用例,并在现实世界中扩大人工智能的规模。

我工作的公司提供机器学习软件,使工厂和仓库中的机器人更加自主和灵巧。为了弥合差距,我与机器人公司和系统集成商密切合作,将前沿的机器学习研究产品化。

上周我飞到了世界的另一端。世界上最大的机器人盛会——国际机器人展览会(IREX)在东京举行。在这里,领先的机器人公司展示了在机器人技术中应用人工智能和人工智能的各种方法。

人工智能实现了从自动化(硬编程)到真正自主(自我指导)的转变

之前我讲过如何 AI 推出下一代机器人 2.0 时代。在过去,机器人主要用于大规模生产线。它们被编程为以高精度和高速度执行相同的任务,但不能对变化或意外做出反应。

然而,随着消费者对定制需求的增长和劳动力的持续萎缩,我们需要更多自主和灵活的机器人。因此,公司开始尝试将 ML 纳入机器人技术的方法,使机器人能够处理传统机器人无法处理的广泛任务。在 IREX,ML 用于改善机器人视觉和控制以及现实世界用例的可扩展性。

[## 重新定义机器人:揭开下一代人工智能机器人的神秘面纱

这是一系列关于机器人和人工智能对各种行业的影响的第一篇文章。

medium.com](https://medium.com/swlh/redefining-robots-demystify-next-generation-ai-enabled-robotics-fec64bfeb66c) [## 它在这里!人工智能机器人将如何革新制造业

虽然制造业一直被认为是自动化程度最高的行业,但全自动化…

towardsdatascience.com](/its-here-how-ai-robot-will-revolutionize-manufacturing-44ce784438d4)

机器人视觉:识别、可伸缩性和自我学习的突破。

即使是最先进的 3D 结构光相机也很难识别带有透明包装、反射或黑暗表面的物体,因为光会被散射或吸收。

由于项目相互重叠,混乱的场景带来了更多的挑战。这就是为什么摇床和零件送料器被广泛应用于制造业。

此外,传统的机器视觉系统不够灵活:为了进行模式匹配,您需要通过事先上传 CAD 模型来注册对象。即使在这个过程中有一点小小的变化,你也必须重新注册这些物品,并给机器人重新编程。

但是现在,随着包括深度学习、语义分割和场景理解在内的领域的最新进展,我们可以用商品相机识别透明和反射包装。

在 FANUC 的展位上,一个捡垃圾箱的 LR Mate 200iD 机器人用深度学习算法和 3D 传感器捡空气接头。这些相同的零件被随机放在一个箱子里。Fanuc 声称,由于系统实时执行点云斑点匹配,因此不需要预注册。

就在发那科的展台旁边,川崎重工(KHI)展示了类似的箱柜分拣解决方案,利用了两家初创公司 Photoneo 和 Ascent 的 ML 技术。在展台的另一边,KHI 灵巧地展示了一个自动卸托盘机器人解决方案。这个机器人可以同时搬运各种尺寸的箱子。

在另一个大厅里,与 DensoWave 一起,旧金山的 ML 初创公司 OSARO 首次展示了它的“定向”功能:机器人可以从杂乱的垃圾箱中挑选透明的瓶子,不仅可以识别最佳的挑选点,还可以识别物体的方向(瓶子的顶部或底部),并将瓶子垂直放置在传送带上。

Yosuke Sawada, General Manager of the Robot Business Division at Denso Wave, commented: “OSARO’s newly developed ‘Orientation’ feature is one of the technologies customers have been waiting for. This exciting new feature helps identify challenging items and improve picking rates for warehouse operators and factory automators.”

瓶子是完全透明的,因此很难用传统的机器视觉传感器识别。这是第一次展示这种特征。它允许人工智能机器人不仅用于拾取和放置,还用于装配、包装、机器装载和组装。

source: Bastiane Huang

机器人控制:智能布局和基于 SKU 的处理

作为人类,我们从出生就学会了拿起和放下各种物品。我们可以本能地完成这些任务。但是机器没有这样的经验,必须学习这些任务。尤其是在日本这样的市场,能够整齐地摆放物品尤为重要。产品需要仔细整理和包装,不能有任何损坏。

利用 ML,机器人现在可以更准确地判断深度。模型还可以通过训练进行学习,并自动确定对象的方向和形状,例如,一个杯子是朝上还是朝下,或者处于其他状态。

对象建模或体素化可用于预测和重建 3D 对象。它们使机器能够更准确地呈现实际物品的大小和形状,并更准确地将物品放置在所需的位置。

这使得基于 SKU 的处理成为可能:机器人可以根据每个 SKU 自动决定轻轻地放置或快速放下物品。因此,我们可以在不损坏任何易碎物品的情况下优化系统的吞吐量。

公司也开始在运动规划中尝试强化学习或机器学习。正如 IREX 所说,Acsent 展示了一个使用强化学习将两部分放在一起的视频。领先的机器人公司 Yaskawa 也在一次演讲中谈到了在路径规划中使用机器学习的潜在好处。

然而,如果需要大量的训练数据和长时间的训练,上述机器学习进步都无法在现实生活中部署。在机器人和自动驾驶汽车等现实世界的应用中获取训练数据既有挑战性又很昂贵。这就是为什么我特别兴奋地看到数据效率在 IREX 被提及。

现实世界的可伸缩性:数据效率

在 IREX 的一场演讲中,安川去年成立的一家新公司 AI Cube Inc .(“AI”)推出了 Alliom,这是一款帮助公司将建立机器学习模型的过程数字化的工具。

根据 AI Cube 的说法,Alliom 提供了一个模拟环境,可以进行数据增强,并生成与现实生活中的物体相似的合成数据。该公司已经使用 Alliom 来加速随机箱拣选的 ML 模型的训练过程,并希望将该解决方案扩展到各种应用中。

这表明机器人行业已经不仅仅是试验花哨的 ML 算法,而是开始考虑在实地实际应用支持 ML 的机器人。ML 解决方案不仅需要工作,还需要能够有效地跨各种用例进行扩展。否则,客户将没有动力在其设施中部署该系统。

我在之前的文章中提到,机器人公司正面临着“创新的困境”:他们意识到了创新的迫切需求,但他们仍然需要照顾自己的核心业务——需要高速高精工作的汽车和制造公司。这与其他部门对灵活性、灵巧性以及机器人学习识别和处理各种组件的能力的需求背道而驰。

在 IREX,几个机器人巨头与初创公司一起展出:仅举几个例子,KHI 与 Photoneo、灵巧和 AscentDensoWave 搭配 OSAROFanuc 与首选网络。机器人公司正在改变以拥抱人工智能。但他们对 ML 给机器人行业带来的变化反应够快吗?

在汽车行业,我们看到汽车原始设备制造商在向自动驾驶的过渡中努力与特斯拉和 Waymo 等新进入者竞争。到目前为止,我们还没有看到任何科技巨头进入机器人行业。然而,谷歌、DeepMind 和脸书已经从事机器人相关的机器学习研究有一段时间了。

观察人工智能将如何扰乱和重新洗牌机器人行业将是一件有趣的事情。在科技巨头、机器人制造商、制造商和人工智能初创公司中,谁将在人工智能定义的机器人时代巩固地位?

[## 在人工智能定义的自动化的新时代,公司会蓬勃发展还是勉强生存?

我们谈到了 AI 如何使机器人能够执行过去无法完成的任务。会有什么影响…

towardsdatascience.com](/manufacturing-industry-reshuffle-will-companies-thrive-or-barely-survive-in-the-new-era-of-aa06a3cade5c)

如果你想看更多这样的文章,请点击这里!

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

数据科学家的 3 个编程概念

原文:https://towardsdatascience.com/three-programming-concepts-for-data-scientists-c264fc3b1de8?source=collection_archive---------11-----------------------

Image by Sasin Tipchai from Pixabay

算法面试

更少的数学和更多的代码

算法是数据科学不可或缺的一部分。虽然我们大多数数据科学家在学习时没有上过适当的算法课程,但它们仍然很重要。

许多公司在招聘数据科学家的面试过程中会询问数据结构和算法。

现在,许多人在这里问的问题是,问一个数据科学家这样的问题有什么用。 我喜欢这样描述,一个数据结构问题可以被认为是一个编码能力测试。

我们都在人生的不同阶段进行过能力倾向测试,虽然它们不是判断一个人的完美代理,但几乎没有什么是真的。那么,为什么没有一个标准的算法测试来判断人的编码能力。

但我们不要自欺欺人,他们需要像你的数据科学面试一样的热情来破解,因此,你可能需要花一些时间来研究算法。

这个帖子是关于快速跟踪的,以一种容易理解的方式为数据科学家研究和平移一些基本的算法概念。

1.递归/记忆

递归是被定义的函数在它自己的定义中被应用。简单来说;递归是函数调用自己。当你在那里搜索递归的时候,谷歌做了一些非常有趣的事情。

希望你明白这个笑话。虽然递归对于初学者来说可能有点令人生畏,但它非常容易理解。一旦你知道了,这是一个美丽的概念。

我找到的解释递归的最好例子是计算一个数的阶乘。

def factorial(n):
    if n==0:
        return 1
    return n*factorial(n-1)

我们可以很容易地看出阶乘是一个递归函数。

Factorial(n) = n*Factorial(n-1)

那么它如何翻译成编程呢?

递归调用的函数通常由两部分组成:

  • 基本情况——递归结束的情况。
  • 递归公式--向基本情况发展的公式化方法。

你最终解决的很多问题都是递归的。它也适用于数据科学。

比如决策树只是二叉树,树算法一般是递归的。或者说,我们确实在很多时候使用了 sort。负责这个的算法叫做 mergesort, 本身就是一个递归算法。还有一个是 二分搜索法, 其中包括寻找数组中的一个元素。

现在我们有了递归的基本窍门,让我们试着找出第 n 个斐波那契数。斐波纳契数列是一系列数字,其中每个数字(斐波纳契数)是前面两个数字的和。最简单的是 1,1,2,3,5,8 等系列。答案是:

def fib(n):
    if n<=1:
        return 1
    return fib(n-1) + fib(n-2)

但是你发现这里的问题了吗?

如果您尝试计算 fib(n=7 ),它会运行 fib(5)两次,fib(4)三次,fib(3)五次。随着 n 变大,对同一个号码进行了很多次调用,我们的递归函数一次又一次地计算。

Source

我们能做得更好吗?是的,我们可以。我们可以稍微改变一下我们的实现,添加一个字典来为我们的方法增加一些存储空间。现在,每当计算出一个数字时,这个备忘录字典就会更新。如果该数字再次出现,我们不会再次计算它,而是从备忘录字典中给出结果。这种存储的增加叫做 记忆

memo = {}
def fib_memo(n):
    if n in memo:
        return memo[n]
    if n<=1:
        memo[n]=1
        return 1
    memo[n] = fib_memo(n-1) + fib_memo(n-2)
    return memo[n]

通常,我喜欢先编写递归函数,如果它反复调用相同的参数,我会添加一个字典来记忆解决方案。

有多大帮助?

这是不同 n 值的运行时间比较。我们可以看到,没有记忆的 斐波那契函数的运行时间呈指数增长,而有记忆的函数的运行时间呈线性增长。

2.动态规划

Bottoms Up

递归本质上是一种自顶向下的方法。当计算斐波那契数 n 时,我们从 n 开始,然后递归调用 n-2 和 n-1 等等。

在动态编程中,我们采用自底向上的方法。它本质上是一种迭代编写递归的方法。我们首先计算 fib(0)和 fib(1 ),然后使用以前的结果生成新的结果。

def fib_dp(n):
    dp_sols = {0:1,1:1}
    for i in range(2,n+1):
        dp_sols[i] = dp_sols[i-1] + dp_sols[i-2] 
    return dp_sols[n]

以上是 DP 与 Memoization 的运行时比较。我们可以看到,它们都是线性的,但 DP 还是快一点。

为什么?因为在这种情况下,动态编程只对每个子问题进行一次调用。

有一个关于开发动态编程的贝尔曼如何构建术语 : 的精彩故事

动态编程这个名字是怎么来的?20 世纪 50 年代不是数学研究的好年头。我们在华盛顿有一位非常有趣的绅士,名叫威尔森。他是国防部长,他实际上对研究这个词有一种病态的恐惧和憎恨。我能选择什么头衔,什么名字?首先,我对计划、决策和思考感兴趣。但是规划,由于种种原因,并不是一个好词。因此,我决定使用“编程”一词。我想让大家明白这是动态的,是多阶段的,是时变的。我想,一石二鸟吧。因此,我认为动态编程是一个好名字。这是连国会议员都不会反对的事情。所以我把它当活动用的雨伞。

3.二进位检索

假设我们有一个有序的数字数组,我们想从这个数组中找出一个数字。我们可以走直线路线,逐一检查每个数字,如果找到数字就停下来。问题是,如果数组包含数百万个元素,那么时间会太长。这里我们可以使用二分搜索法。

Source: Finding 37 — There are 3.7 trillion fish in the ocean, they’re looking for one

# Returns index of target in nums array if present, else -1 
def binary_search(nums, left, right, target):   
    # Base case 
    if right >= left: 
        mid = int((left + right)/2)
        # If target is present at the mid, return
        if nums[mid] == target: 
            return mid 
        # Target is smaller than mid search the elements in left
        elif nums[mid] > target: 
            return binary_search(nums, left, mid-1, target) 
        # Target is larger than mid, search the elements in right
        else: 
            return binary_search(nums, mid+1, right, target) 
    else: 
        # Target is not in nums 
        return -1nums = [1,2,3,4,5,6,7,8,9]
print(binary_search(nums, 0, len(nums)-1,7))

这是一个基于递归算法的高级例子,我们利用了数组是有序的这一事实。这里我们递归地查看中间的元素,看看我们是想在中间元素的左边还是右边进行搜索。这使得我们的搜索空间每走一步就缩小 2 倍。

因此该算法的运行时间是O(logn),与线性搜索的O(n)相反。

这有多重要?下面是运行时间的比较。我们可以看到,与线性搜索相比,二分搜索法非常快。

For n=10000, Binary search takes around 13 steps, and the Linear search takes 10000 steps.

结论

在这篇文章中,我谈到了一些最激动人心的算法,它们构成了编程的基础。

这些算法是数据科学面试中一些最常被问到的问题的背后,对这些算法的良好理解可能会帮助你获得理想的工作。

虽然您可以在不学习它们的情况下在数据科学中走得更远,但您可以为了一点乐趣而学习它们,也许是为了提高您的编程技能。

如果你想学习算法和数据结构,也可以看看我在系列的其他帖子。

继续学习

如果你想在算法方面读得更多,这里有一个 UCSanDiego 在 Coursera 上的 算法专门化 我强烈推荐学习算法基础。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

成功数据科学项目的三个问题

原文:https://towardsdatascience.com/three-questions-towards-a-successful-data-science-project-792a0df6755?source=collection_archive---------36-----------------------

什么时候数据科学项目是成功的?你会发现大多数关于数据科学项目的文章都涵盖了如何进行机器学习。不要误会,这是做数据科学家的重要一环。但是,要产生实际的商业价值,还有更多的事情要做…

Photo by Carlos Muza on Unsplash

成功的数据科学项目

作为一名数据科学家,你可能不对项目的成功负责。但是,当没有产生实际的商业价值时,企业可能会向您寻求解释。这意味着,作为一名数据科学家,你只能通过你的项目取得与企业一样的成功

这让我想到一个问题,是什么让数据科学项目取得成功?从我的经验来看,当项目的每个阶段都在完成,我们在【生产中】*产生商业影响时,商业是快乐的。*

三个主要阶段

项目可以以多种不同的方式组织,然而所有成功的数据科学项目都会遵循三个主要阶段:

  1. 业务需求
  2. 机器学习
  3. 操作

那么,你如何判断自己是否走对了路呢?在项目过程中,我用三个问题问自己几次,以确保我在正确的轨道上。

三个问题

在我的数据科学项目中,我通过问以下三个问题来保持自己的敏锐。这些真的帮助我看到了全局,尤其是当你真正深入细节的时候。

  1. 具体的业务需求是什么?
  2. 我的机器学习选择如何影响业务影响和运营?
  3. 实施后业务是如何变化的?

让我们深入了解其中的每一项...

具体的业务需求是什么?

这是第一个问题,也可能是最重要的问题。因为公平地说,我为什么要在没有具体业务需求的情况下开始一个项目呢?如果没有,投入时间和金钱是没有意义的。

我们为什么要这么做?

有不同的答案选项,如增加利润、节约成本或提高客户满意度。我发现具体一点更好:“我们希望确保我们的销售代表节省时间,这样他们就可以花更多的时间与潜在客户在一起,从而获得更高的利润”。

我能解释一下情况和背景吗?

目前的流程是什么样的?IT 环境、数据可用性和质量如何?或许有什么触发事件让我们现在处理这个话题?

我了解业务需求吗?

最终用户可能有特定的需求或愿望。可能会有一些特定的情况允许你移动。GDPR 等法规可能与检查相关。最后,我需要与业务利益相关者交流,真正了解他们的需求。

典型陷阱

现在看起来很清楚,这些东西需要被覆盖。在实践中,我们经常发现团队没有在业务需求上花费足够的时间,并在项目后期陷入困境。他们提供了一些一开始就不需要的东西,他们失去了兴趣。

有时,业务利益相关者和数据科学家在同一个房间里,以为他们在同一页上,但后来发现他们不是。为了避免这种情况,在谈判桌上找一个了解双方的人,比如一个分析翻译

最后,团队经常无法测试可行性。在深入研究机器学习之前,这将有助于了解实现的可行性。准备好了吗?会有足够的资源吗?一开始我们可能不知道,但我们需要关注这一点!

我的机器学习选择如何影响业务影响和运营?

在任何时候,我都可以在机器学习和业务需求之间建立联系,另一边是运营。

我做的分析正确吗?

你可能会想,“这很清楚,不是吗?”。不幸的是,情况并非总是如此。我的模型能满足业务需求吗?这可能与目标或损失函数有关。举个例子;在做预测时,我们可以问我们的商业利益相关者大的错误是否比小的错误更糟糕。这允许在均方根误差(RMSE)或平均绝对误差(MAE)之间做出选择。

在优化上花更多的时间真的会改善业务结果吗?

例如,我可以问自己,多 0.5%的精度是否真的会对我们的情况产生影响?当然可以这样,问自己这个问题不会有坏处。

如果我的模型需要几分钟来做一个预测,那么可能会有这样的情况,也可能会有这样的情况。如果没有,也许我会在优化我的代码之前先实现并看看我的解决方案是否能带来商业价值。

我的模特是性感还是有目标的?

我知道建立一个神经网络或者随机森林很酷。然而,我们真的需要它吗?问题是一个更简单的模型是否能完成这项工作,逻辑或线性回归通常是可行的,而且更容易向企业解释清楚。

典型陷阱

大多数数据科学家没有花足够的时间去理解他们的建模业务目标联系。数据科学家(相信我,我曾经经历过)倾向于尝试新奇的事物,而不是专注于创造更好的业务结果。

实施后业务是如何变化的?

实施您的解决方案是产生实际业务影响的唯一途径。为此,您需要正确的 IT 环境和业务流程。没有实施,没有业务影响。

我的组织准备好实施技术变革了吗?

这与技能、预算、维护可能性以及处理遗留系统和官僚程序有关。

有哪些具体的、可操作的成果?

导致实际业务影响的确切过程是什么?未阅读或未执行的仪表板没有实际的业务影响。

企业准备好迎接这一变化了吗?

我的业务利益相关者对这种变化持开放态度吗?他们有时间处理这种情况吗?如果我的业务利益相关者不理解或没有足够的数据素养来接受解决方案,将很难产生变化。接受是创造商业影响力的关键。

谁将参与变更,哪些流程将受到影响?

了解哪里会发生变化,绘制出变化前后的流程,并列出将受到影响的人员。我需要提前和他们谈谈,找出任何障碍。这将有助于我很好地理解需要做什么。

典型陷阱

不阐明项目的实现可能会导致最终发现 K.O .标准。团队有时未能足够早地阐明 it 准备情况,并发现很难让 IT 参与进来。变革管理也很重要,仅仅“将其投入生产”可能还不够,培训可能是合适的。最后,如果你没有为运营、维护和服务做好准备,当你的模型需要改变或出现问题时会发生什么?

摘要

任何成功的数据科学项目都会以某种方式贯穿业务需求、机器学习和运营这三个阶段,以产生实际的商业价值。

在从事数据科学项目时,我会问自己三个问题。“具体的业务需求是什么?”,“我的机器学习选择如何影响业务影响和运营?”,以及“实施后业务会发生怎样的变化?”

在项目的不同时间回答这些问题,让我能够关注全局,专注于创造真正的商业价值。需要帮助吗?通过www.aibridge.ch/contact联系我

关于我:我是一名人工智能管理顾问,我的使命是让数据科学家(再次)开心,并帮助组织利用人工智能产生商业价值。 在这里报名我的快讯

成功的机器学习项目的三个步骤

原文:https://towardsdatascience.com/three-steps-for-a-successful-machine-learning-project-baac098ba775?source=collection_archive---------16-----------------------

为所有 ML 项目减少技术考虑

随着人们和公司冒险进入机器学习(ML),一些人期望直接进入构建模型和生成有用的输出是很常见的。虽然 ML 的某些部分感觉像是这种带有神奇预测的技术魔法,但还有其他一些方面不那么技术性,而且可以说要重要得多。花足够的时间来定义正确的问题,适当地预处理数据,并考虑使用您的模型的影响,可以大大提高您的 ML 项目的成功。

我希望,作为一个寻求利用 ML 的公司、经理或工程师,这些提示将节省你的时间,并帮助你优先考虑你未来的努力。

它从一个问题开始

第一步,问正确的问题,通常可能是你机器学习冒险中最困难的部分。任何 ML 项目的目的都是为了回答一个问题。“这是谁写的”“这是什么”“价格会是多少”“有哪些图案”?有一个你专注于回答的具体问题,可以让你清楚地定义你的目标函数,并帮助你确定实际工作所需的数据。如果没有问正确的问题,您的团队可能会花费无数的时间来收集、提炼和建模数据,从而产生无用的产品。更糟糕的是,这种打嗝会降低 ML 在你的组织中的感知价值,导致未来更少的支持。

如果没有问正确的问题,你的团队可能会花费无数时间收集、提炼和建模数据,从而生产出无用的产品。

为了避免这种情况,在进行任何与数据相关的项目之前,暂停一下,清楚地说出你想要回答的问题。然后定义目标函数,例如最大化精确度,你计划用它来衡量你的进步。这看起来是一个简单的步骤,确实如此,但是很容易忘记。虽然你的第一个问题可能不正确,但至少你已经朝着一个明确的目标前进了,你可以从这个目标开始迭代。

准备准备你的数据

收集和预处理数据可能是 90%的工作。另外 10%可能是测试、调整和操作您的模型。对于浅层学习方法,这包括探索您的数据、工程特征以及将数据规范化为有用的格式。即使使用深度学习方法,也应该对数据进行探索和矢量化,以确保合理的性能。虽然这些操作中的许多都可以通过库(如 Scikit-learnKeras )中的几行代码轻松完成,但探索数据并验证它是否代表实际数据是非常耗时的。

功能工程需要对业务环境有相当深入的了解,拥有正确的功能确实可以改善您的成果,因此简单地让一个数据科学家独自解决问题可能不会有什么成效。那些在他们的组织中开始使用 ML 的人应该在期望结果之前留出足够的时间来进行数据探索和准备。要提前知道这一步可能要付出多少努力,不要急于给出正确的分数。

在生产环境中,您也可能没有收集到您希望的所有数据点,因此知道您可能需要迭代收集方面也有助于了解这一点。总的来说,计划一个更长的数据预处理迭代阶段,并相应地管理期望。

你的模式会有什么影响?

在一般意义上,机器学习,特别是深度学习,模型的输出值是基于它根据训练数据对自己进行的一些数学转换。

这些算法可能会在训练数据中识别出一些我们人类没有识别出的模式,但模型并没有有意识地思考或做出决定。它只是简单地调整权重或值,以便最大化/最小化其目标函数;一个非常独特的焦点。只要试着在一组完全不同的数据上利用你的模型,你就会意识到你的模型的“知识”是多么具体。

我们应该花点时间考虑为什么我们的输出是现在这个样子,它是否能很好地概括实时数据,以及使用它是否会有任何意想不到的后果。

我相信指出这一点是很重要的,因为很多时候很容易获得一个模型的输出(即预测)并利用它运行,而没有考虑可能已经泄漏到其中的偏差。我们应该花一点时间来考虑为什么我们的输出是这样的,它是否能很好地概括真实数据,以及使用它是否会有任何意想不到的后果。由于模型不是“思考”,它不会适应你的道德或伦理考虑,除非它的目标函数和训练数据是一致的。

结论

总之,机器学习的工具和技术正在快速发展,但是有许多辅助的考虑因素必须同时考虑。专注于正确的目标,正确处理数据,质疑你的输出,这些都是你在进行任何机器学习项目时应该考虑的行动。正如我们看到机器学习的技术能力呈指数级增长一样,我们应该以更快的速度推进机器学习的支持活动。

我在亚马逊学到的三件事为我从事机器学习做好了准备

原文:https://towardsdatascience.com/three-things-i-learned-at-amazon-that-prepared-me-for-a-career-in-machine-learning-63b6dae5bc5?source=collection_archive---------17-----------------------

亚马逊的文化为我从游戏开发到机器学习的工作转变做了比任何教程都多的准备。

Nick Youngson — Wooden Tile Amazon Image

我在亚马逊工作了 5 年,离获得梦寐以求的“黄色徽章”只有几天了值得注意的是,亚马逊的平均任期是一到两年。虽然有很多关于在亚马逊工作的故事,但我觉得那里的文化比任何教程都更能为我从游戏开发到机器学习的工作转变做好准备。

如果你不太了解亚马逊的文化,那么快速的谷歌搜索是值得的。此外,虽然我可能可以写一整本书来讲述我在那里的经历,但我认为我应该专注于我学到的为这一新的职业发展做准备的三件事:数据驱动、写 6 页纸和足智多谋。亚马逊有一套被称为领导原则的原则,这些原则造就了其独特的文化。自从我在 2014 年加入以来,同样的文化让亚马逊呈指数级增长。下面是我如何将这些知识应用到机器学习的新冒险中。

或许亚马逊企业文化最重要的部分是数据驱动的概念。

由数据驱动

虽然我工作过的许多公司都说他们这么做,但我还没有发现像亚马逊这样的公司。每一次计划或战略会议都是在回顾历史数据、实时数据和未来数据预测之间的微妙平衡。亚马逊将此归结为一门科学。

从 WBR(每周商业报告)试图将大量数据提取为可消化的形式,以便随时纠正错误,到大多数组织都有专门的数据分析师。分析师的唯一工作是帮助构建每周报告,连接不同业务部门的报告系统,并且主要是尽可能多地自动收集数据,以便我们可以随时了解业务部门的状态。

机器学习的支柱是数据本身。如果没有有用、干净、可靠的数据,就没有办法准确地训练、测试和验证模型。此外,虽然在构建模型的实际过程中花费了大量的时间和精力,但是理解数据本身是一项非常重要的技能。例如,我在东 ODSC 做了一次演讲,特别是关于管理用于检测癌症的大型数据集的挑战,如 T2 的 ChestXray14 数据集。

该研讨会的名称叫做“将‘数据’放入数据科学”,它完全专注于使用医疗数据进行深度学习的挑战。任何对机器学习感兴趣的人都应该具备的一项关键技能是,不仅要理解如何管理和处理数据,还要理解如何分割、验证和净化数据。你的实验和你拥有的数据一样好,知道如何管理它也同样重要。我在亚马逊学到了很多关于数据的重要性以及如何正确使用数据的知识。

写 6 页纸

A mazon 以其写作文化而闻名。虽然他们在入职培训中告诉你,任何人都可以提出一个想法,从头开始创建一个新的业务,例如 AWS 是如何产生的神话,但这是通过 6 页纸实现的。这些详细的文档不仅解释了一个策略或计划,而且还必须写成叙述。亚马逊会议中没有 powerpoint 演示。

All work and no play makes Jack a dull boy on Imgur

大多数会议的前半部分是阅读文件,后半部分是在文件上戳洞。要在亚马逊取得成功,你需要能够使用数据来证明你的观点,以其他人可以理解的方式阐述你的想法,并创建一个任何人,无论他们是否参加了你的会议,都可以拿起并理解的文档。

任何在机器学习领域工作的数据科学家或工程师都应该具备的最关键技能;能够交流他们正在做什么,如何复制它,以及它提供的价值。

数据科学社区的很大一部分围绕着撰写和阅读研究论文。因此,虽然这很容易类比 6 页纸在亚马逊的重要性,因为写 6 页纸就像写一篇博士论文,但实际上,数据科学家应该出于多种原因记录他们的研究。通常,他们在团队中工作,因此能够跟踪达成解决方案的步骤是至关重要的。如果没有大量的实践,每个人都不具备获取这些知识并与团队或公司外部的其他人分享的能力。

我认为这是任何在机器学习领域工作的数据科学家或工程师都应该具备的最重要的技能之一;能够交流他们正在做什么,如何复制它,以及它提供的价值。

随机应变

从外面看,亚马逊似乎是一个拥有几乎无限资源的大型组织;现实情况是,每个部门的团队通常都很小。事实上,规模如此之小,以至于他们有时人手不足。此外,团队应该精益运营,相应地管理有限的资源,大多数时候,你会身兼数职。

虽然一个团体可以获得更多的资源,但亚马逊的核心原则是节俭。要在亚马逊取得成功,你需要尽你所能做到最好,并发挥创造力来实现你的最终目标。甚至有一个原则叫做行动偏好,它允许你不顾限制地变通规则来完成某件事,只要是为了最终目标的利益。

我没有预料到每次训练之间所花费的时间,也没有预料到加速训练所需的 GPU 资源。

随着我对机器学习的深入研究,我很清楚管理资源在我进行的每个实验中是如何发挥关键作用的。我没有预料到每次训练之间所花费的时间,也没有预料到加速训练所需的 GPU 资源。此外,随着我运行越来越多的实验,我需要找到创造性的方法来平衡云中的扩展和利用本地资源。

Panumas Nikhomkhai — pixels.com

大多数时候,我会尽可能多地进行本地测试,然后在多台经过不同修改的计算机上并行运行我的云中实验,以更好地帮助确定哪个解决方案是最佳的。目前,数据科学家很难聘用,所以有可能你最终会在较小的团队中工作,需要找出如何在每个人之间共享资源,并在保持低成本的同时加快培训模型之间的时间。这是一个微妙的平衡动作。

把这些放在一起

人们问我为什么从游戏开发转向机器学习,我最感兴趣的事情之一是如何解决我看到的数据科学家每天都在努力解决的许多问题。您如何同时管理多个实验,处理大型数据集,并扩展工作负载以提高效率?这些都是我在进入游戏行业前几年做 Web 开发时学到的东西,我觉得我可以将我所知道的贡献给机器学习社区。

最近,我一直在围绕DeepOps——或深度学习操作的想法做演讲。这是一个概念,借用了 DevOps,将深度学习的所有痛点自动化。这些恰好也是我在亚马逊学到的一些技能。我发现有趣的是,让我在亚马逊取得成功的东西和目前帮助我在机器学习方面取得更好成绩的东西之间有很多重叠。当你将这些实践融入一家公司的文化中时,你会取得令人难以置信的成就,并且希望,随着时间的推移,DeepOps 也能成为自己的文化。然而,那是另一篇文章了。

关于人工智能和机器学习的三本顶级书籍

原文:https://towardsdatascience.com/three-top-books-about-artificial-intelligence-and-machine-learning-b48ff2fa3548?source=collection_archive---------2-----------------------

三本令人难以置信的人工智能书籍,让你的思维开窍,思维活跃。

在这篇文章中,我将谈论三本关于人工智能和机器学习的书,我发现它们是每个这些主题的爱好者必读的。从阅读这些书籍中获得的经验千差万别:其中一本书将谈论人工智能正在走向,通往它的不同道路,可能的危险,以及处理这些危险的方法。

其中一本书将剖析大脑的功能,并恢复我们神经系统内部发生的事情与机器学习模型内部发生的事情的相似性。

最后一个谈到了不同的机器学习家族,机器学习的最终目标(主要从研究的角度),我们与这个目标的关系如何,以及我们最有可能达到这个目标的方式是什么。

如果这听起来有趣,请继续阅读来寻找这些精彩的文学作品,不要担心,我只是浅尝辄止地谈论书籍的内容,以鼓励你阅读它们,绝对没有剧透😃

尼克·博斯特罗姆的《超级智慧》

麻雀未完成的寓言:

这是筑巢的季节,但经过几天漫长的辛勤劳动,麻雀们坐在晚霞中,放松地鸣叫着。

“我们都那么弱小。想象一下,如果我们有一只可以帮我们筑巢的猫头鹰,生活会变得多么轻松!”

“是!”另一个人说,“我们可以用它来照顾我们的老人和孩子”

第三个人补充道:“它能给我们建议,还能帮我们留意邻居家的猫。”。

老鸟帕斯托斯说:“让我们向四面八方派出侦察兵,设法在某个地方找到一只被遗弃的小猫头鹰,或者一只蛋。一只乌鸦或者一只小黄鼠狼也可以。这可能是发生在我们身上的最好的事情,至少自从在那边后院的无限谷物馆开业以来。”

鸟群兴奋起来,到处的麻雀开始声嘶力竭地鸣叫。

只有脾气暴躁的独眼麻雀斯克罗芬克不相信“奋进号”的智慧。他说:“这肯定会导致我们的毁灭。在我们把这种动物带到我们中间之前,我们难道不应该先考虑一下驯化和驯服猫头鹰的艺术吗?”

驯服猫头鹰听起来是一件非常困难的事情。找到一个猫头鹰蛋就够了。所以让我们从这里开始。在我们成功饲养了一只猫头鹰之后,我们可以考虑接受另一项挑战。”帕斯图回答道。

"那个计划有一个漏洞!"吱吱叫scrnkfinkle;但他的抗议是徒劳的,因为鸥群已经起飞,开始执行帕斯图制定的指令。

只有两三只麻雀留在后面。他们一起开始尝试研究如何驯服或驯化猫头鹰。他们很快意识到帕斯图斯是对的:这是一个非常困难的挑战,尤其是在没有真正的猫头鹰来练习的情况下。尽管如此,他们还是尽最大努力,时刻担心在找到控制问题的解决方案之前,鸟群可能会带着猫头鹰蛋回来。

这个故事开始于瑞典哲学家尼克·博斯特罗姆的一本书《超级智慧》,这本书讨论了在不久的将来机器是否会变得比人类更聪明的问题。 麻雀未完成的寓言 指的是一个我们并不完全熟悉的实体的控制问题,其权力可能超出了我们个人的能力范围。

虽然时间还不确切,但人工智能领域的顶尖人物普遍认为,机器达到与人类同等智能的那一天终将到来。

当这一天到来的时候,会就此打住吗?或者,机器会利用它们新达到的人类水平的智能,超越这个门槛,达到比人类更高的意识和知识水平,让它们主宰世界,甚至整个宇宙?****

什么是智力?有哪些形式的智能存在?机器最有可能实现这种超智能的方式是什么?我们会为这一事件做好准备吗?如果没有,怎么准备?有哪些可能的结果?人工智能的行为有什么特定的动机吗?

博斯特罗姆在这本精彩的书中用大约 320 页的文字、图表和图像回答了这些问题以及更多的问题。如果你想知道其中任何一个问题的答案,或者只是想了解人工智能可能存在的缺点,这本书绝对是不遗余力的必读之作。

雷·库兹韦尔《如何创造思维》

“如果一台机器被证明与人类无法区分,我们应该给予它与人类一样的尊重——我们应该接受它有思想”

如何创造一个头脑 雷·库兹韦尔 谷歌工程总监,揭露了他的大脑运作理论** 基于等级模式识别器的存在,我们从其最低抽象层次向其最高维度投射现实。你可能已经注意到我使用了“他的理论”这个术语。**

这是因为即使在过去的十年中,神经学和神经科学领域已经取得了一些惊人的成就,我们对大脑的知识仍然有许多迷雾,因此本文所描述的也不过如此;一种理论。

在整本书中,我们可以发现与我们大脑内部执行的底层过程之间的许多相似之处,以及支持各种技术的基本过程,主要是基于机器学习的,比如像 AlexaSiri 这样的虚拟助手,或者例如自动驾驶汽车。****

我们头脑中大约 350 克的质量和我们所知的写这篇文章的计算机有很多相似之处。

库兹韦尔还揭示了几个世纪以来,随着技术的使用,人类能力的提高:从第一把用来砍树的斧子到我们现在随身携带的智能手机,这些基本上是我们身体的延伸。谁知道呢,也许在几十年后,我们会使用类似的设备,但这些设备会直接集成到我们的生物学中

最后,在这本书的结尾,有几章致力于心灵的哲学和形而上学方面,如意识、自由意志或同一性概念。

虽然这本书面向有技术背景或兴趣的读者,但任何想知道大脑如何工作的人都肯定会喜欢这本书,并进入我们这个时代最伟大的技术思想家之一的头脑。

“因为重要的东西都装在一个箱子里,所以你有一个头骨当你的大脑,一个塑料套当你的梳子,一个钱包当你的钱”

佩德罗·多明戈斯的《大师算法》

“所有的知识——过去、现在和未来——都可以通过一个单一的通用学习算法从数据中推导出来”

机器学习世界*,可以大致分为 5 个不同的大洲,每个大洲代表一个特定的方法或算法家族,这些方法或算法家族或者在产生它的范例上,或者在每个家族的底层方法上,或者在算法工作的方式上,都不同于其他的。正因为如此,他们每个人都擅长解决特定的问题,并且有一些特定的用例应用。*

然而,它们都有一个共同点:发现数据中隐藏的洞察力,并利用这些洞察力产生某种价值。前段提到的五大家族分别是: 贝叶斯主义者联结主义者进化论者、 类比主义者、象征主义者 **

本书以一个小介绍机器学习** 开始,接着是作者工作的主要动机:寻找一个通用的机器学习算法,可以用来解决任何一种问题。已经开发了结合两个或更多上述家族的算法,收集了它们组成家族的优点,但是没有一个算法能够将它们全部联合起来。**

然后每个家族都被描述,有他们的历史,优缺点,和主要算法。最后,多明戈斯谈到了人工智能即将到来的未来,描述了这种通用算法的优点和能力,但很大程度上撇开了在前几本书中提到的可能的危险和挑战

虽然这本书即使对于非机器学习从业者来说也是一本很好的读物,但是如果我们确实对每一个家族有某种了解,并且至少在某种程度上使用过不同种类的算法,如朴素贝叶斯、支持向量机或神经网络,这将是最令人愉快的。与前两本书不同的是,非常专注于机器学习,然而一切都用大量的例子、类比和图表进行了非常非常好的解释。

“一种算法来统治他们,一种算法来发现他们,一种算法来把他们都带来,在黑暗中把他们捆绑起来,在数据所在的学习之地”

结束语

一如既往,我希望你喜欢这篇文章,并且我已经说服你至少读了其中一本书。它们都是非常棒的作品,我本可以就它们中的每一个写一篇深入的文章,但从我的角度来看,它们非常适合作为一个包,如果你读完它们,你会对人工智能的当前状态有一个令人难以置信的概述。

在这里你可以找到它们的链接。

随时与我联系LinkedIn或在 Twitter 上关注我@jaimezorno。还有,你可以看看我其他关于数据科学和机器学习的帖子 这里 。好好读!**

要找到更多关于人工智能的书籍,比如本文中的书评,请查看以下回购:

** [## 人工智能书籍——如何学习机器学习

有一些关于人工智能和机器学习的书,把大部分技术放在一边…

howtolearnmachinelearning.com](https://howtolearnmachinelearning.com/books/artificial-intelligence-books/)

如果你想了解更多关于机器学习和人工智能的知识 在 Medium 上关注我,敬请关注我接下来的帖子!

在那之前,保重,享受 AI!**

PyTorch 中构建神经网络的三种方法

原文:https://towardsdatascience.com/three-ways-to-build-a-neural-network-in-pytorch-8cea49f9a61a?source=collection_archive---------7-----------------------

体验 PyTorch 灵活的深度学习框架

Photo by 贝莉儿 DANIST on Unsplash

TLDR;
这不是 PyTorch 的教程,也不是解释神经网络如何工作的文章。相反,我认为分享一些我在 Udacity Bertelsmann 奖学金 AI 项目中学到的东西是个好主意。尽管如此,本文的目标是说明在 PyTorch 中创建神经网络的几种不同方法。

先决条件:我假设你知道什么是神经网络以及它们是如何工作的…所以让我们开始吧!

简介

假设您想要定义以下神经网络,具有一个输入层、两个隐藏层和一个输出层,中间层具有 relu 激活,输出层具有 sigmoid 激活函数,如下所示:

Fully Connected (Feed Forward) Network

这是一个全连接的 16×12×10×1 神经网络,在隐藏层有 relu 激活,在输出层有 sigmoid 激活。

1。手动构建权重和偏差

解决这个问题的一个方法是构建所有的模块。这是一种低级的方法,但如果你试图在刚刚阅读的论文上复制最新和最伟大的深度学习架构,这可能是合适的。或者如果你想开发一个定制层。不管怎样,PyTorch 会保护你的。你需要定义你的体重和偏好,但是如果你在这个水平上感到舒适,你就可以开始了。这里的关键是你需要告诉 PyTorch 在你的网络中什么是变量可优化,这样 PyTorch 就知道如何在你的网络上执行梯度下降。让我们看看有人如何在低级 PyTorch 中实现这一点:

Building a neural network in low level PyTorch

2。扩展 torch.nn.Model

在实践中,我们大多数人可能会使用预定义的层和激活函数来训练我们的网络。如果你朝这个方向走,有几条路可以走。一个更优雅的方法是创建你自己的神经网络 python 类,从 torch.nn 扩展Model 类。以这种方式定义神经网络有许多优点,也许最值得注意的是,它允许继承 torch.nn 模块的所有功能,同时允许覆盖默认模型构造和正向传递方法的灵活性。在这种方法中,我们将定义两种方法:

1.类构造函数, init

2.前进的方法

第一个是类的初始化器,在这里你将定义组成网络的层。通常我们不需要在这里定义激活函数,因为它们可以在正向传递中定义(即在 forward 方法中),但这不是一个规则,如果你想的话,你当然可以这样做(我们实际上将在最后看到一个例子)。

第二种方法是定义向前传球。该方法接受一个表示模型将被训练的特征的输入。在这里,您可以调用激活函数,并将之前在构造函数方法中定义的层作为参数传入。您需要将输入作为参数传递给第一层,在处理激活后,输出可以被输入到下一层,依此类推。

让我们来看看在实践中如何做到这一点:

A more elegant approach to define a neural net in pytorch.

这是上面的输出..

MyNetwork(
  (fc1): Linear(in_features=16, out_features=12, bias=True)
  (fc2): Linear(in_features=12, out_features=10, bias=True)
  (fc3): Linear(in_features=10, out_features=1, bias=True)
)

在上例中, fc 代表全连通层,因此 fc1 代表全连通层 1,fc2 代表全连通层 2,以此类推。请注意,当我们打印模型架构时,激活功能没有出现。原因是我们使用了 torch.nn.functional 模块中的激活功能。它使代码更加紧凑,适合这种方法。

3。使用 torch.nn.Sequential

pytorch 中仍然有一种更简洁的方法来定义神经网络。这是一种模块化的方法,通过 torch.nn.Sequential 模块成为可能,如果你来自一个 Keras 背景,在那里你可以定义连续的层,有点像用乐高积木搭建东西。这与 Keras 的顺序 API 非常相似,并且利用了 torch.nn 预构建的层和激活函数。使用这种方法,我们的前馈网络可以定义如下:

A more compact approach.

输出:

Sequential(
  (0): Linear(in_features=16, out_features=12, bias=True)
  (1): ReLU()
  (2): Linear(in_features=12, out_features=10, bias=True)
  (3): ReLU()
  (4): Linear(in_features=10, out_features=1, bias=True)
  (5): Sigmoid()
)

请注意,这些层被编入索引,并包含激活功能。事实上,我们可以通过简单地索引模型对象来检查单个层并调试模型权重。

输出:

Linear(in_features=16, out_features=12, bias=True) Parameter containing:
tensor([[-0.1890, -0.2464, 0.1255, 0.1371, -0.0860, 0.1147, 0.2162, 0.2164,
-0.0341, -0.2427, 0.1252, -0.1267, 0.0055, -0.2351, 0.1516, 0.0091],
[ 0.0167, 0.0783, 0.1194, 0.1763, 0.1607, 0.0041, -0.1883, -0.1407,
0.0213, 0.0674, 0.0864, 0.1367, 0.1203, -0.1143, -0.2471, -0.0009],
[-0.0500, -0.1950, -0.2270, 0.0407, 0.2090, 0.1739, 0.0055, -0.0888,
-0.1226, -0.1617, 0.1088, -0.0641, 0.0952, 0.0055, 0.1121, -0.1133],
[-0.2138, 0.1044, -0.1764, 0.1689, -0.1032, -0.0728, -0.1849, 0.1771,
0.0622, -0.0881, 0.1024, -0.0872, 0.0363, -0.2183, -0.2392, -0.0807],
[ 0.0876, -0.2130, 0.2191, -0.0753, -0.0198, 0.0565, 0.1932, -0.1412,
-0.1640, 0.0318, -0.1846, 0.0020, -0.1138, 0.2188, 0.1850, -0.2329],
[ 0.1501, 0.1809, 0.0378, -0.1194, -0.0991, -0.0848, -0.0085, 0.0384,
-0.1353, 0.0767, -0.2460, -0.1252, -0.0993, 0.1840, 0.0407, -0.1561],
[ 0.1464, -0.0153, -0.1369, 0.1616, -0.1700, -0.0877, 0.1000, 0.0953,
-0.0804, 0.1279, -0.1432, 0.1903, 0.1807, -0.0442, 0.0553, -0.0375],
[-0.1962, -0.1922, 0.1221, -0.0932, 0.0206, 0.0845, 0.1370, 0.1825,
0.1228, 0.1985, -0.2023, 0.1319, 0.0689, -0.1676, 0.0977, 0.2275],
[-0.1287, 0.2306, 0.1450, 0.2316, 0.0879, -0.0373, -0.2405, -0.0491,
-0.0185, -0.0385, 0.1891, -0.1952, -0.2433, -0.0572, 0.0555, -0.1912],
[-0.0958, 0.0692, -0.2458, -0.0730, 0.2082, 0.0005, -0.1477, 0.0229,
0.1032, 0.1871, 0.0302, 0.0664, -0.1704, 0.0197, 0.0262, -0.0398],
[-0.1210, -0.0301, -0.1284, -0.1590, -0.0594, 0.1115, 0.0256, 0.2206,
-0.2330, 0.1262, -0.0866, 0.2195, 0.1969, 0.0960, 0.0339, 0.0959],
[ 0.0263, 0.2152, -0.1841, -0.1301, -0.2202, -0.0430, 0.0739, 0.1239,
-0.1601, -0.1970, -0.1937, 0.0711, -0.0761, 0.1796, -0.1004, -0.0816]],
requires_grad=True)

这很有趣,但是如果你有许多不同种类的层和激活函数呢?在这种情况下,通过索引调用它们似乎是不可行的。幸运的是,您可以使用相同的结构命名这些层,并将来自 python collections 模块的 OrderedDict 作为参数传递。这样,你可以两全其美。换句话说,您保持层的顺序并命名它们,允许更简单和直接地引用层。

输出:

Sequential(
  (fc1): Linear(in_features=16, out_features=12, bias=True)
  (relu1): ReLU()
  (fc2): Linear(in_features=12, out_features=10, bias=True)
  (relu2): ReLU()
  (fc3): Linear(in_features=10, out_features=1, bias=True)
  (sigmoid): Sigmoid()
)

现在让我们检查第二层及其重量:

输出:

Linear(in_features=12, out_features=10, bias=True) Parameter containing:
tensor([[ 0.0291, -0.0783, 0.1684, 0.2493, 0.1118, -0.2016, 0.0117, -0.1275,
-0.0657, -0.2506, 0.1129, 0.1639],
[ 0.1274, 0.2261, 0.1084, -0.2451, -0.1085, 0.1292, 0.0767, -0.2743,
0.1701, 0.1537, -0.0986, 0.2247],
[ 0.0317, 0.1218, 0.1436, -0.1260, 0.1407, 0.0319, -0.1934, -0.0202,
-0.1683, 0.2342, 0.0805, 0.0563],
[-0.2444, 0.2688, -0.1769, 0.2193, 0.0854, 0.1284, 0.1424, -0.2334,
0.2324, 0.1197, 0.1164, -0.1184],
[ 0.0108, 0.2051, 0.2150, 0.0853, 0.1356, 0.1136, -0.1111, 0.1389,
-0.0776, -0.0214, 0.0702, 0.1271],
[-0.0836, -0.1412, -0.0150, -0.1620, -0.0864, 0.1154, 0.0319, -0.1177,
0.1480, 0.0097, -0.2481, -0.1497],
[ 0.0131, 0.0566, 0.1700, -0.1530, -0.1209, -0.0394, 0.0070, -0.0984,
-0.0756, -0.2077, 0.1064, 0.2788],
[ 0.2825, -0.2362, 0.1566, -0.0829, -0.2318, -0.1871, 0.2284, -0.0793,
-0.2418, -0.0040, 0.2431, -0.2126],
[ 0.0218, 0.0583, 0.1573, 0.1060, 0.0322, -0.1109, 0.2153, 0.0909,
-0.0028, -0.1912, -0.0733, 0.0013],
[-0.2602, -0.2267, -0.1786, -0.2129, 0.1996, -0.2484, 0.1303, -0.0052,
-0.2715, 0.0128, -0.0752, -0.0428]], requires_grad=True)

奖励:混合方法

在 PyTorch 中创建神经网络时,您会选择一种方法而不是另一种方法,但有时您可能更喜欢混合方法。PyTorch 在这方面非常灵活,例如,您可以在基于类的方法中使用顺序方法,如下所示:

输出:

MyNetwork2(
  (layers): Sequential(
    (0): Linear(in_features=16, out_features=12, bias=True)
    (1): ReLU()
    (2): Linear(in_features=12, out_features=10, bias=True)
    (3): ReLU()
    (4): Linear(in_features=10, out_features=1, bias=True)
  )
)

结论

尽管本文中用作示例的前馈神经网络很简单,可能无法真实地描述一种方法相对于另一种方法的优势,但这里的主要思想是展示在 PyTorch 中定义神经网络有许多不同的方法,希望您可以看到 PyTorch 库是如何强大,同时又非常灵活。

在深度学习中茁壮成长:推荐系统的 FM 模型(上)

原文:https://towardsdatascience.com/thrive-and-blossom-in-the-mud-fm-model-for-recommendation-system-1-95707839e235?source=collection_archive---------7-----------------------

Photo by Paul on Unsplash

既然你写了这篇文章,我认为你是这个行业的算法工程师。然而,根据我的经验,这个假设可能只有 20%是正确的,因为大多数算法工程师的兴趣非常多样化,他们会点击文章,只要标题中出现“模型、算法、深度学习、震撼、美丽”这样的词,但 3 秒钟后就会失望地关闭窗口。文章越有技术含量,就越快被关闭。我说的对吗?相信我,我不会通过设置一个非凡的标题和添加一段平静的背景音乐来欺骗你的点击。

好吧,如果你是一个真正的算法工程师,你首先想到的是什么模型或算法来排序或推荐内容。

如果你想出排序的平均值,请点击右上角的“关闭”按钮,这篇文章不是很适合你的水平。哈哈,我在开玩笑,欢迎继续,因为我也曾经是那个水平。

如果你正在考虑 CF/SVD/MF,也许你只是结束了阅读学校书籍或完成推荐系统的介绍课程,但缺乏实践经验。如果你的直觉是 LR + GBDT 模型,那么你是一个经验丰富的算法工程师,但最近没有更新你的武器库。

看看日历,现在是 2019 年。我们现在不必进入 Wide&Deep 或 DeepFM 模型,因为在大规模的业务场景中有效地应用它们似乎仍然是一项具有挑战性的任务。但最重要的是,如果你认为自己是一个谦逊的、渴望学习算法的工程师,你应该学习 FM model。

什么是 FM?

FM 代表因式分解机。该算法由 Rendle 于 2010 年提出,近年来被广泛应用于大规模点击率估计和推荐系统中。FM 的模式比较简单,网上有很多内容我就不在这里详细展开了。许多基于 DNN 的排序模型与 FM 非常相似,原因很明显:特征组合对于推荐排序至关重要,FM 的思想非常简单,并且很好地反映了(主要是二阶)特征组合。没有这一点,任何 DNN 模型都无法运行,因为 MLP 结构是一种低效捕捉特征组合的结构。因此,这些 DNN 模型总是与 FM 模型结合在一起,这些特性需要在内部进行组合。这就是为什么你会一次又一次地发现它或者它的变体的原因。

目前,基于 DNN 的排序模型一般采用 MLP 结构。特征提取的能力远低于 CV/NLP 达到的水平。这很容易使人觉得,用于排序优化的 DNN 模型还处于原始社会的非常早期的阶段。那这是为什么?因为 CNN 网络天然不适合排序场景。RNN 被用作捕获用户行为的序列,并且使用时间信息的辅助结构是可以的,但是它不太适合作为主要模型。好像没剩下多少选择了。Transformer 很有前景,我认为自我关注是另一个很好的方法,可以很好地捕捉特征组合(包括二阶和三阶,甚至多阶)。我用自我关注& transformer 作为主要的推荐排序模型做了一些实验。与 DeepFM 相比,测试结果并没有显示出太多的差异。但这可能是因为我没有花太多时间在繁琐的调优工作上。鉴于自 2018 年下半年以来,有几篇关于使用 transformer 进行推荐排序的新论文发表,我个人对该方向的发展非常乐观。到目前为止,剩下的选择似乎只有 MLP。在深度学习的大潮下,从建模角度来看确实远远落后于其他很多领域。事实上,我认为这主要是由于其自身领域的复杂性造成的,它可能需要一个革命性的 DNN 模型来很好地适应其自身的特点。像图像识别领域的 Resnet 或者自然语言处理领域的 Bert ,在推荐领域还没有像这两个这样的 DNN 模型。无论如何,我更乐观了,我预见到那个人正在路上,离我们很近。

我将从两个角度简要介绍 FM 模型:一个是从特征组合模型的演变。另一个是来自协同过滤模型的演变。FM 模式是上述两种模式的交集。

从 LR 到 SVM 再到 FM

LR 模型是推荐系统前期最成功的模型。大多数工业推荐系统采用 LR 模型(线性模型+人工选择特征组合引入的非线性)。因为 LR 模型具有简单、便于解释、易于扩展等优点。但是 LR 模型最大的缺陷是手工特征工程,耗时耗力,那么特征组合可以在模型层面进行吗?

实现这一点并不难。在上图中,可以将二阶特征组合添加到等式中。任意两个特征可以组合,组合后的特征可以作为一个新的特征集成到线性模型中。组合特征的权重可以用来表示,如同一阶特征权重一样,组合特征权重是从训练阶段学习的。在幕后,这个二阶特征组合的使用等同于 SVM 的多项式核。但后者有一个潜在的问题:它对组合特征进行建模,但泛化能力较弱。特别是给定一个大的稀疏特征矩阵,这个缺点会非常突出和放大。如推荐排序问题,特征总是存储在一个巨大的稀疏矩阵中。因此,这种解决方案没有被广泛采用。那还有什么?

所以此刻 FM 模式登场了。如上图所示,FM 模型还直接引入了任意两个特征的二阶特征组合。FM 和 SVM 模型之间最显著的区别是获取特征组合权重的计算方法。对于每个特征,FM 学习一个大小为 k 的一维向量,使得两个特征 x_i 和 x_j 的特征组合的权值由对应特征的内积<v_i v_j="">表示。这本质上是特性的嵌入特性,非常符合“嵌入”思维的本质。因此,FM 作为一种特征嵌入技术,可以看作是深度学习中各种嵌入方法的老前辈。实际上,它只是缺少了一个两层或三层的 MLP 隐层,用来直接建模多层特征非线性组合。其余方面基本相同。</v_i>

那么为什么 FM 嵌入在处理大规模稀疏矩阵时是有效的呢?为什么它的泛化能力强?参考上图,即使两个特征没有同时出现在训练集中,也意味着 x_i 和 x_j 同时出现的次数为 0。在 SVM,不可能知道他的特征组合的权重。但是因为 FM 是学习单个特征嵌入,而且不依赖于特征的某个特定组合是否出现过,所以只要特征 x_i 和特征的任何其他组合出现过,那么它就可以学习自己对应的嵌入向量。因此,虽然在训练集中没有看到特征 x_i 和 x_j 的组合,但是在预测时仍然可以使用这个新的特征组合,因为 x_i 和 x_j 具有在训练阶段学习到的它们自己的对应嵌入,并且它们的内积表示这个新的特征组合的权重。这就是为什么 FM 的泛化能力如此神奇。

从本质上说,这也是各种嵌入的核心特征。它使得基于二进制的硬匹配 0/1 切换到基于矢量的软匹配。对于以前无法匹配的,现在在一定程度上可以认为是匹配的。这本身就是对泛化的一个很好的改进。

从 MF 到 FM 模型

到目前为止,你应该知道 FM 模式是什么。那么 MF 是做什么的呢?至少从拼写角度来看,它们不是很相似吗,MF <=> FM?跟 FM 有什么鬼关系?仅仅是 FM 模式的逆向操作吗?

实际上,MF 代表矩阵分解。它是一个成熟的协同过滤模型,长期以来在推荐领域被广泛采用。主要思想是学习两个小的低维矩阵,一个代表用户的嵌入,另一个代表物品的嵌入。然后,通过计算两个矩阵的内积,使用这两个矩阵来估计由真实用户点击或评级生成的大型协作稀疏矩阵中的值。本质上,它是一种降维技术,尤其用于构建用户/项目嵌入。通常情况下,我们也把这些嵌入称为潜在特征向量,它们是相同的东西。在各种嵌入方法进入自然语言处理领域之前,这种方法也被大量用于主题建模。

当训练完成后,每个用户和项目都得到其对应的低维嵌入向量。进行内积计算<user_i item_j="">将会得到 user_i 在 item_j 上的预测得分。这让你想起什么了吗?下面重点说一下 MF 和 FM 的关系。</user_i>

MF 和 FM 不仅在名字上看起来相当像,而且在算法方面也有许多相似之处或联系。

本质上,MF 模型是 FM 模型的一个特例。MF 可以被认为是仅具有两个特征字段 User_ID 和 Item_ID 的 FM 模型。MF 从原始矩阵中学习这两种类型的特征,并将它们作为表达式嵌入到两个低维矩阵中。FM 可以看作是 MF 模型的进一步延伸。除了用户 ID 和物品 ID 特征之外,许多其他类型的特征可以进一步集成到 FM 模型中,FM 模型将所有这些特征转换成低维嵌入向量。特征组合的权重可以用任意两个特征嵌入的内积来表示和计算。如果 FM 仅使用用户 ID 和项目 ID,则预测过程将与 MF 预测过程相同。

从谁更早使用特征嵌入表达式的角度来看,与 FM 相比,MF 显然是真正的前身,但其唯一的局限性是特征类型的缺乏。FM 继承了 MF 的特征嵌入机制的优点,并对其进行扩展,使其能够将更多的边信息作为特征,然后将它们转换为嵌入向量,最后将它们集成到 FM 模型中。事实证明,FM 模型更加灵活,可以应用于更广泛的用例。

我希望你仍然跟随,不要因为 MF 和 FM 之间复杂混乱的关系而沮丧。我想提出以下建议(个人观点):

  1. 当你有动力使用 MF 进行协同过滤的时候,请先让自己冷静下来,问自己一个问题。这是为了建立基于隐式反馈还是显式反馈的推荐模型?例如,用户评级通常被视为明确的反馈,因为它从 1 到 5,包括积极和消极的方面。同时,用户点击或购买次数是隐性反馈,因为它们只传达了“数字越大,用户越有可能喜欢它,而不是被授权者”的信号(置信度)。优化丢失的函数来训练仅利用隐式反馈的模型更依赖于实际的用例。此外,我们需要找到一种方法来生成足够的负样本,以便 FM 也能很好地工作。别担心,我会在使用隐式反馈的背景下,围绕这些技巧和技术写一篇单独的文章。如果你的答案是明确反馈,请给 FM 一个尝试。因为它们在功能上是等价的,而且,FM 将使你能够把它融合到你将来想要添加的任何其他特性中。
  2. 构建一个只使用用户 ID 和项目 ID 作为输入特征的分类模型,在实践中不能满足大规模推荐系统的需要。原因很简单,在大部分世界级的推荐系统中,用户或物品都有很多可供利用的信息,协同数据只是其中之一。引入更多的功能肯定对获得更准确的个性化推荐非常有帮助。但是,如果模型缺乏添加更多功能的便捷方式,它将受到限制,并且难以持续改进。这就是为什么 MF 方法很少用于排序或分类问题。

到目前为止,我们已经从多个角度解释了 FM 模型。

下一步是什么?你如何做出选择?这与其说是一个技术问题,不如说是一个哲学问题。话虽如此,算法选择通常是这样的:“一个算法工程师一直在犹豫选择哪个模型去生产。他有三个很好的选择,其中一个很优雅,另一个很好,最后一个很时尚。但是很难做出决定。三天后,他告诉我他的导演只是让他用最快的一个去!”精彩!

因为 FM 计算特征组合的二阶,所以经常听到人们质疑它的效率。这确实是一个很好的问题,因为二阶完全等价于 O(n * n)。故事就这样结束了吗?在下一章,我将详细阐述 FM 模型的核心效率。

掌声和掌声感谢、【】和。

最大熵原理掷骰子

原文:https://towardsdatascience.com/throwing-dice-with-maximum-entropy-principle-fa7707e72222?source=collection_archive---------15-----------------------

“没有人知道熵到底是什么,所以在任何讨论中,你总是有优势的”冯·诺依曼

听起来这是一个深入研究熵的意义的好理由。这篇文章是关于骰子和最大熵的。

Photo by Jonathan Petersson on Unsplash

这篇文章有四个部分。在第一部分,我以骰子为例介绍了最大熵原理。第二部分是数学:概述了使熵成为唯一函数的四个公理。四个公理中的一个是最重要的(对我来说)..如此重要,以至于在第三部分,这个公理用 python 进行了测试,只有熵函数满足测试。第四部分总结。

一个简单的问题

我有一个骰子,从 1 到 6 有 6 个面。关于骰子,我唯一知道的是结果的平均值是 3.5。我必须分配给骰子两边的概率是多少?

首先出现的自然答案是给骰子的每一边分配 1/6 的均匀概率。这意味着:

当然,满足均值 3.5 的选择是无限多的。骰子可以被偏置,并且对于某些边具有更高的概率,同时仍然具有 3.5 的平均值。但是在所有的可能性中,统一的分配感觉上是合理的。

让我稍微修改一下这个任务,考虑到我唯一知道的是均值是 4.5。这里又有无限多种赋值的可能性。很可能,最自然的答案是你不知道,因为你没有足够的信息。但是 3.5 和 4.5 有什么区别呢?为什么我对均值的一个值(3.5)有感觉和自然的答案,对均值的另一个值(4.5)没有答案?

让我们先把这个条件正式写出来。我可以指定骰子各面的概率为(p1,…p6)。我知道:

如何从许多满足这些等式(约束)的概率分配中选择某一个?这可以说是一项优化任务。我可以最大化所有概率的函数:

并基于该函数的最大值选择一个概率分配。但是这个功能是什么意思,我应该怎么选择呢?我所知道的唯一信息是平均值是 4.5。我已经在约束中使用了 4.5,但是我还没有使用它,因为它是我唯一知道的信息。这里有一个准则!我应该优化函数 F,在我们的估计中,我不会插入任何关于骰子的额外信息。那么我必须选择哪个函数呢?

这是在杰恩斯的作品中回答的问题。我必须最大化熵:

因为这是对我所不知道的事情不抱偏见的唯一方法。任何其他功能都意味着附加信息。杰恩斯在他的作品中解释道:

我们能做的唯一公正的分配;使用任何其他方法都相当于任意假设我们没有的信息。。。。最大熵分布可以被断言,因为它被唯一地确定为对于缺失信息最不确定的分布

熵有一些有趣的性质。例如,如果我有一个平均值为 3.5 的 6 面骰子,那么熵的最大化将导致均匀分布。同样的情况,如果我只取和为一的约束,而不知道均值。那就让熵最大化吧!平均滚动值为 4.5(约束 1)的 6 面骰子的任务可以用数字来解决。答案呈现在剧情中:

我可以为其他类型的骰子尝试其他类型的约束。例如,让我们考虑 9 面骰子,而不是(1)设置约束为:

在后面的等式中,1 是标准差,4 是平均值。在这种情况下,最大化熵将导致看起来类似于高斯的分布。最大化其他功能不会。例如,下面是熵与平方和的比较:

Results of numerical solution of optimization problem with constraints (3) compared with Gaussian.

到目前为止一切顺利,但这只是第一阶段!对某些人来说,熵的最大化显然是根据熵作为信息量度的定义得出的。对其他人来说,这种直觉的理由可能还不够。到目前为止,我还没有证明方程中的函数。②是唯一一个最大化的。为什么不最大化一些替代功能?以下文字为“其他”。

支持熵最大化原理的数学论证

当一些可测试的信息可用时,为骰子的各面分配概率的任务(我 100%确定的一个),有可能表明必须最大化的唯一函数 F( p )是熵(2)。你需要一些数学传统中的公理。一套这样的公理是由肖尔和约翰逊提出的。在一些已知约束条件下掷骰子的任务可以概括为:

想象一下,我还不知道我应该选择熵最大的分布。所以我想找到最大化的函数。这里的技巧是 q 和 p 不是任意函数,而是概率。我可以假设这些概率以及通过最大化函数 F( p )找到最优分布 p 的结果具有一些性质(公理):

  1. 唯一性。(最大化的)结果应该是唯一的。

  2. 不变性。在哪个坐标系中计算新信息并不重要。

3)系统独立性一个人是用不同的概率来单独说明独立系统的独立信息,还是用一个联合概率来共同说明独立系统的独立信息,这并不重要。

  1. 子集独立。不管是用单独的条件概率还是用整个系统的概率来解释系统状态的独立子集的信息,都没有关系。

在证明的主体中,陈述了公理 1,2,4 用于导出函数的“和形式”。也就是说,为了满足公理 1,2,4,函数的形式必须是:

在所有和形式的函数中,唯一满足公理 3 的是熵函数或对熵函数单调的函数。为了更好地表示公理 3,让我们用 python 来测试这个公理!

用 python 演示系统独立性

在这一节中,我编写了一个 python 代码来测试关于系统独立性公理对于任意函数 F( p )和两个骰子是否成立。每个都有一定的边数和自己的平均值。

我将在两种不同的情况下最大化和形式的函数:当我认为两个骰子是独立的,我分别优化它们,或者当我认为它们是依赖的,我优化具有独立约束的联合 PDF。

单独优化

概率有两个重要的性质。第一个属性是它们的和为 1。第二个属性(实际上熵最大化不需要,但是其他一些函数需要)是概率是非负的。我把它框定为对概率和以及概率值界限的约束:

我从 1 开始选择骰子的边数(但是我可以选择任何边数)。对手段的限制是:

然后,我将初始猜测设为等概率,并运行优化算法:

联合优化

对于联合概率,我考虑两个骰子,因为它们可能相互依赖。我优化的函数是联合概率[p_11,p_12,…,p_NM],其中 p_11 是第一个和第二个骰子会显示第一面的概率。其余的优化过程是相同的。

比较

公理 3 规定,如果我没有关于两个骰子的依赖性的信息,我应该以骰子独立的方式分配概率,并且:

由于数值误差,总会有差异,这个等式不成立。这样我就可以评估我差了多少:

python 中的情况也是如此:

比较优化结果的另一种方法是从联合中得出边际分布,并将它们绘制在一起:

正如对熵的预期,分布是相同的(在数值误差的限度内):

Comparison of joint optimization with separate optimization when I maximize entropy.

相比之下,两个骰子的平方和分布不同:

Comparison of joint optimization with separate optimization when I minimize sum of squares.

这部分的 Python 代码可从这里获得。

结论

最大熵原理在几个方面是有用的。首先,它可能是贝叶斯推理中设置先验概率的有力工具。另一个有用的应用是最大熵估计,它可以代替最大似然估计。

在这篇文章中,只考虑了个别情况。对于连续概率,最大熵原理应该用最小 Kullback-Leibler 散度原理来代替。

文学:

[1] 模式识别与机器学习(信息科学与统计),克里斯托弗·m·毕晓普。

[2] 数据分析贝叶斯教程,D.S. Sivia 与 J. Skilling

【3】最大熵原理和最小交叉熵原理的公理化推导,Shore 和 Johnson

[4] 信息论和统计力学,E. T .杰恩斯

雷击:交流电力线的 CNN 可视化灾难

原文:https://towardsdatascience.com/thunderstruck-disaster-cnn-visualization-of-ac-power-lines-2a57fab30f09?source=collection_archive---------28-----------------------

VB 的网络中心正试图通过分析电力信号来检测架空电力线的局部放电模式。对于任何电力爱好者来说,这场 Kaggle 挑战赛都是一场有趣的比赛。理想情况下,我们应该能够在电力线路遭受停电或引发电气火灾之前,检测到电力线路缓慢增加的损坏。然而,有许多英里的电力线。此外,输电线的损坏不会立即显现,任何事情都会造成小的损坏(树木、大风、制造缺陷等)。)可能是来自放电的级联损害的开始,这增加了将来故障的可能性。这是一个伟大的目标。如果我们能够成功地估计出需要维修的线路,我们就可以在保持电力流通的同时降低成本。我的意思是金钱万能。

表格数据集非常庞大,每个信号有 800,000 个点,总计约 10 GB。臃肿的设置不是我要找的刚刚从微软恶意软件。我花了这么多时间试图把那个数据集输入我的电脑,但又被再次进行这么多数据管理的可能性拉回来了。

我决定做一些疯狂的事情,让它成为 CNN 的问题,而不是表格问题。把一个表格问题变成一个 CNN 特别疯狂。为什么你会把非常好的数据变成模糊和不准确的数据呢?

它更快

它更粗糙

而且,它更有趣!

有点…你准备好了吗?

高电压

我们应该首先了解一些电气工程概念,尤其是电力线。我们在这里看到的交流电有 3 个周期或相位。所提供的数据具有这些相位的信号,并且相互依赖以预测线路何时出现问题。因此,该设备有三个不同的信号通过,它们之间存在相互依赖关系。如果其中一个看起来很奇怪,就会影响到其他两个。

将信号数据绘制成图表是相当简单的事情。所以我们可以快速观察其中一个信号。许多 CNN 的经验法则可以帮助您决定它是否对模型有用。如果你能看到不同,那么 CNN 可以做得一样好,或者更好,更快。让我们看看一个信号是什么样的:

好的。有道理。现在,他们三个会是什么样子?有什么东西看起来超级怪异吗?我想是的!

好吧,这可能行得通!诚然,我可以看到绿色二期线似乎有一点尖峰在这个图像。也许这很重要,也许不重要。然而,我想这将是我们的有线电视新闻网试图检测。

首先,我们需要将所有的信号文件转换成图像,我完成了这个并保存在硬盘上(使用这个 jupyter 笔记本)。回去把它们加载到内存中比每次都生成它们要快得多(有很多信号)。然后我回去对我们的测试集做了同样的事情。我本可以做得更好,但是只需要运行一次。

现在图像大小很重要,当你压缩数据时,你会丢失信号中的一些细节。想象一下缩小图片时丢失的细节。所以我保持了一个相当大的图像尺寸,除此之外,我们可以在以后的训练中将图像变小。

我觉得我们可以掩饰大部分 CNN 的设置(如果有兴趣你可以看这里)。除了变换之外,没有什么是唯一的。不像猫和狗,或医学成像,我不需要变换或改变周围的图像。我们生成的图像应该总是相似的,更重要的是,图像将总是与我们的测试图像显示的格式相同。在我们的测试中,图像将总是相同的大小。这种方法不同于其他图像模型,因为测试集可以包括不同的动物、不同的角度和整体不同的外观对象。通过这种方式,转换将有助于其他模型,但不适用于这种情况。

当我们开始训练时,我们看到训练在进步!很好!
验证和马修斯系数一样越来越好!很好!

太好了,让我们试试这个,看看这些。

我注意到的一件事是项目有正确的预测。几个时期后,我们可以看到模型认为重要的热图。

我们可以看到它认为正确的项目和它正确预测的项目。对于正确的信号,它似乎浮在较低的信号上。好吧,那不理想。没有任何迹象表明这是有意义的。地狱之钟我们只看到没有错误的项目。

然而,预测错误的情节都结束了。

其中一些展示了我所期待的。这个显示了剧烈的波动。例如,我们希望看到类似下面的内容,其中权重遍布 3 个信号。

然而,还有更多的地方,他们强调没有意义的领域。像这样:

为什么它突出了右边的区域?在所有的训练中,是什么让它看起来是最重要的领域?

也就是说,这个预测应该是错误的,但看起来信号真的中断了…所以也许是数据的问题。

坚定沉着

因此,在这一点上我有点紧张,尽管验证集声称我们做得很好,但它似乎没有看到项目的充分加权。预言到处都是,我不知道为什么。所以我决定继续前进。

进一步观察这些预测,似乎这些预测是有道理的。我们看到 0 和 1 都有一些值,这很好。该集合非常有偏差,几乎有 10:1 的差异,然而,我们也期望如此。它比较接近我们的数据集。

让我们将所有测试项目适当地映射回来,因为每个图像现在代表 3 个不同的信号。

那我们就臣服于卡格尔。让那里有摇滚!

嗯,真令人失望。

它的得分甚至低于所有的 0。

在这一点上,是时候转移到别的事情上了。通往顶峰的路还很长,我还有其他项目要处理。

比赛中的其他 CNN 更接近 0.50 ish,获胜者使用了 LGBM 。

需要改进的地方:

  • 如果你有信号数据,你当然可以试着把它做成图像。但是,在转换过程中,您会丢失大量信息。您还会增加正在使用的数据的总体大小。
  • 这种转换和梳理的过程很快就变得非常复杂和混乱,这里有很多错误做错了事情。结合第 1 项,我有理由相信我丢失了很多数据,并且可能丢失了更多或错误标记了一些项目。对我来说,回去仔细检查原始图像以确保我们没有错误地创建它们是一个挑战。
  • 这也是一个困难的问题,因为我认为是错误的东西并不符合标签。
  • 我看到这种方法在其他项目中成功使用。也许他们的分辨率设置更好,或者照片中的信息更清晰。

参考资料:

井字游戏学习者 AI

原文:https://towardsdatascience.com/tic-tac-toe-learner-ai-208813b5261?source=collection_archive---------2-----------------------

井字游戏是两个人玩的简单游戏,我们小时候喜欢玩(尤其是在无聊的教室里)。该游戏包括两名玩家将他们各自的符号放置在一个 3x3 的格子中。设法将三个符号放在水平/垂直/对角线上的玩家赢得游戏。如果任何一方未能做到这一点,游戏以平局结束。如果两个人总是采取他们的最优策略,博弈总是以平局告终。

Ex: Tic-Tac-Toe Board

由于网格很小&只有两个玩家参与,每个棋盘状态的可能走法的数量是有限的,因此允许基于树的搜索算法,如 Alpha-Beta 剪枝,来提供计算上可行且精确的解决方案,以构建基于计算机的井字游戏玩家。

在这篇文章中,我们看一个近似的(基于学习的)相同的游戏方法。即使存在更好的算法(即 Alpha-beta 修剪),如果电路板的复杂性增加,近似方法提供了可能有用的替代方法。此外,代码的变化,以纳入这将是最小的。

这个想法是将井字游戏作为一个适定的学习问题,正如 Tom Mitchell 的机器学习书(第 1 章)中提到的。学习系统将在下一节中简要介绍。

井字游戏学习系统

学习系统背后的基本思想是,系统应该能够通过从训练经验(E)中学习来改进其相对于一组任务(T)的性能(P)。培训体验(E)可以是直接的(带有单独标签的预定义数据集)或间接的反馈(每个培训示例没有标签)。在我们的情况下:-

  • 任务(T) :玩井字游戏
  • 性能(P) :与人类比赛获胜的百分比
  • 体验(E) :通过解决方案跟踪(游戏历史)产生的间接反馈,这些解决方案跟踪是通过与自身(克隆)的游戏产生的

从经验中学习(E) :理想情况下,需要学习一个函数(理想目标函数),以给出任何给定棋盘状态下可能的最佳走法。在我们的问题中,我们将 ITF 表示为一个线性函数(V ),它将给定的棋盘状态映射到真实值(分数)。然后,我们使用近似算法(最小均方)从解迹中估计 ITF。

  1. V(boardState) → R,(R-给定 boardState 的得分值。)
  2. V_hat(boardState) ←(W.T) * X,(W-目标函数的权重,X-从给定的 boardState 中提取的特征。)
  3. LMS 训练规则更新权重:Wi←Wi+lr (V _ hat(board state)-V _ hat(Successor(board state))) X,(i-第 I 个训练示例,lr-学习率)

每个非最终棋盘状态的分数(R)被分配有后续棋盘状态的估计分数。根据游戏的最终结果给最终棋盘状态分配一个分数。

3.V(boardState) ←V_hat(继任者(boardState))
4。V(finalBoardState) ←100(赢)| 0(平)| -100(输)

履行

最终设计分成四个模块(Ch-1,汤姆·米切尔的机器学习书 ):-

  1. 实验生成器:其工作是在每个训练时期开始时生成新的问题陈述。在我们的例子中,它只是返回一个空的初始板状态。
  2. 性能系统:该模块将实验生成器&提供的问题作为输入,然后使用改进的学习算法在每个时期产生游戏的解轨迹。在我们的例子中,这是通过模拟两个玩家之间的井字游戏(克隆程序)来完成的。这些玩家使用当前目标函数做出移动决策。
  3. Critic :这个模块获取解决方案跟踪,并输出一组训练示例,输入到泛化器。
    训练实例←【<特色(boardState),R >,< > …。]
  4. 一般化器:该模块使用评论家提供的训练示例,通过在每个时期使用 LMS 权重更新规则学习期望的权重来更新/改进目标函数。

下面是一个展示训练和测试阶段的小视频(顺便说一句:我的视频编辑技能不好)。

Screen Recording of Training & Testing phases of the game

上述实现的代码可以在这个 Github gist:https://gist . Github . com/NoblesseCoder/cccf 260 ECC 3c e 2052 a0a 1a 01 a 13 a 7 f 7 AC 54

使用 R 的整洁异常检测

原文:https://towardsdatascience.com/tidy-anomaly-detection-using-r-82a0c776d523?source=collection_archive---------6-----------------------

想象一下,你经营着一家像 Amazon.com 这样的在线企业,你想为下一年规划服务器资源——你必须知道你的负载什么时候会达到峰值(或者至少在回顾中是什么时候达到峰值的,以便相信它会再次出现),这就是你需要时间序列异常检测的地方。虽然有一些像 Twitter 的异常检测这样的软件包已经在做这项工作,但还有另一个很好的候选软件——anomalize——它可以做一些其他异常检测软件包没有做的事情。这是很好的异常检测。

享受 78%的 DataCamp 折扣

请注意,本文的目的是帮助您以简洁的方式执行异常检测,而不是向您传授异常检测或时间序列数据的原理和概念。

使用 R——整齐的方法进行异常检测意味着什么?

抱歉这么说!众所周知,使用 R 的数据科学家会编写笨拙的代码——可读性不强的代码和效率不高的代码,但这种趋势一直在改变,因为 Hadley Wickham 推广了tidy原则,他应该不需要在 R 宇宙中做任何介绍,因为他的tidyverse有助于许多 R 数据科学家的效率和工作。现在,这个由商业科学开源的新包anomalize进行时间序列异常检测,它与其他 Tidyverse 包(或支持整齐数据的包)内联——具有最常用的 Tidyverse 功能之一——与管道%>%操作符兼容,以编写可读和可再现的数据管道。

异常化—安装

R package anomalize 的稳定版本可从起重机上的获得,其安装方式如下:

install.packages('anomalize')

github 上有最新开发版本的 anomalize,安装方式如下:

#install.packages('devtools') 
devtools::install_github("business-science/anomalize")

考虑到开发版不需要编译工具,最好从 github 安装开发版,这样会更无 bug,而且有最新的功能。

案例—比特币价格异常检测

通过实际操作并将其与我们的现状联系起来,学习一个新的概念或代码会更容易。所以,为了理解 R 中整齐的异常检测,我们将尝试检测 2017 年以来比特币价格的异常。

加载所需的包

我们使用以下 3 个软件包来解决上述情况:

library(anomalize) #tidy anomaly detectiom
library(tidyverse) #tidyverse packages like dplyr, ggplot, tidyr
library(coindeskr) #bitcoin price extraction from coindesk

数据析取

我们使用来自coindeskrget_historic_price()从 Coindesk 提取历史比特币价格。产生的数据帧存储在对象btc

btc <- get_historic_price(start = "2017-01-01")

数据预处理

对于使用 anomalize 的异常检测,我们需要一个tibbletibbletime对象。因此,我们必须将 dataframe btc 转换成遵循时间序列形状的 tibble 对象,并将其存储在btc_ts中。

btc_ts <- btc %>% rownames_to_column() %>% as.tibble() %>% 
  mutate(date = as.Date(rowname)) %>% select(-one_of('rowname'))

只看 btc_ts 的头部看样本数据:

head(btc_ts)
 *Price date      
1  998\. 2017-01-01
2 1018\. 2017-01-02
3 1031\. 2017-01-03
4 1130\. 2017-01-04
5 1006\. 2017-01-05
6  896\. 2017-01-06*

异常时间序列分解

在开始时间序列预测或建模之前,时间序列数据的一项重要工作是时间序列分解,即将时间序列数据分解为季节、趋势和余数部分。anomalize 有一个函数time_decompose()来执行同样的功能。一旦组件被分解, anomalize可以检测和标记提醒组件的分解数据中的异常,然后可以用 plot_anomaly_decomposition() 可视化。

btc_ts %>% 
  time_decompose(Price, method = "stl", frequency = "auto", trend = "auto") %>%
  anomalize(remainder, method = "gesd", alpha = 0.05, max_anoms = 0.2) %>%
  plot_anomaly_decomposition()

给出了这个图:

从上面的代码中可以看出,分解是基于“stl”方法进行的,这是时间序列分解的常用方法,但是如果您一直在使用 Twitter 的 AnomalyDetection,那么同样可以通过将 time_decompose(method = "twitter ")与anomalize(method = "gesd")结合起来在 anomalize 中实现。“stl”分解方法也可以与anomalize(method = "iqr")结合,用于不同的基于 IQR 的异常检测。

异常检测

异常检测和绘制检测到的异常几乎类似于我们在上面看到的时间序列分解。只是异常检测后分解的组件用time_recompose()重新组合,用 plot_anomalies() 标绘。该软件包本身会自动处理许多参数设置,如指数、频率和趋势,使得在相同领域中使用较少的专业知识即可轻松运行异常检测。

btc_ts %>% 
  time_decompose(Price) %>%
  anomalize(remainder) %>%
  time_recompose() %>%
  plot_anomalies(time_recomposed = TRUE, ncol = 3, alpha_dots = 0.5)

给出了这个图:

从给定的图中可以很好地推断出异常检测在发现 2018 年初发生的比特币价格疯狂方面的准确性。

如果您对提取异常的实际数据点感兴趣,可以使用以下代码:

btc_ts %>% 
  time_decompose(Price) %>%
  anomalize(remainder) %>%
  time_recompose() %>%
  filter(anomaly == 'Yes') 
*Converting from tbl_df to tbl_time.
Auto-index message: index = date
frequency = 7 days
trend = 90.5 days
# A time tibble: 58 x 10
# Index: date
   date       observed   season trend remainder remainder_l1 remainder_l2 anomaly recomposed_l1

 1 2017-11-12    5857\.  36.0    7599\.    -1778\.       -1551\.        1672\. Yes             6085.
 2 2017-12-04   11617\.  11.2    9690\.     1916\.       -1551\.        1672\. Yes             8150.
 3 2017-12-05   11696\.  -2.01   9790\.     1908\.       -1551\.        1672\. Yes             8237.
 4 2017-12-06   13709\.  -9.11   9890\.     3828\.       -1551\.        1672\. Yes             8330.
 5 2017-12-07   16858\.   0.0509 9990\.     6868\.       -1551\.        1672\. Yes             8439.
 6 2017-12-08   16057\. -28.1    9971\.     6114\.       -1551\.        1672\. Yes             8393.
 7 2017-12-09   14913\.  -8.03   9953\.     4969\.       -1551\.        1672\. Yes             8394.
 8 2017-12-10   15037\.  36.0    9934\.     5067\.       -1551\.        1672\. Yes             8420.
 9 2017-12-11   16700\.  11.2    9916\.     6773\.       -1551\.        1672\. Yes             8376.
10 2017-12-12   17178\.  -2.01   9897\.     7283\.       -1551\.        1672\. Yes             8345.
# ... with 48 more rows, and 1 more variable: recomposed_l2*

因此,anomalize 使得用更简洁的代码在 R 中执行异常检测变得更加容易,这些代码也可以用在使用 tidyverse 构建的任何数据管道中。这里使用的代码可以在我的 github 上找到。如果你想更多地了解 R 中的时间序列预测,请查看Rob hynd man 教授在 Datacamp 上的课程。

主成分分析整理:主成分分析导论

原文:https://towardsdatascience.com/tidying-up-with-pca-an-introduction-to-principal-components-analysis-f876599af383?source=collection_archive---------4-----------------------

主成分分析(PCA) 是一种降维的技术,是减少数据集中预测变量数量的过程。

更具体地说,PCA 是一种无监督类型的特征提取,其中原始变量被组合并缩减为它们最重要和最具描述性的成分。

主成分分析的目标是识别数据集中的模式,然后将变量提取到它们最重要的特征,以便在不丢失重要特征的情况下简化数据。主成分分析询问是否一个数据集的所有维度都能引发快乐,然后给用户一个选项来消除那些不快乐的维度。

PCA 是一种非常流行的技术,但是实施它的人通常不太理解它。我写这篇博文的目的是提供一个关于为什么使用 PCA 以及它如何工作的高层次概述。

维度的诅咒(或者说,为什么要费神降维?)

维度的诅咒是一组现象,表明随着维度的增加,数据的可管理性和有效性往往会降低。在高层次上,维数灾难与这样一个事实有关,即随着维度(变量/特征)被添加到数据集,点(记录/观察)之间的平均和最小距离增加。

我发现,当我开始思考聚类或 PCA 等主题时,将变量可视化为维度,将观察结果可视化为记录/点会有所帮助。数据集中的每个变量都是一组坐标,用于绘制问题空间中的观察值。

随着已知点和未知点之间的距离增加,创建好的预测变得更加困难。此外,数据集中的特征可能不会在目标(独立)变量的上下文中增加太多价值或预测能力。这些特征并没有改善模型,而是增加了数据集中的噪声,以及模型的整体计算负载。

由于维数灾难,降维通常是分析过程的关键组成部分。特别是在数据具有高维度的应用中,如计算机视觉信号处理

当收集数据或应用数据集时,并不总是显而易见或容易知道哪些变量是重要的。甚至不能保证你选择或提供的变量是正确的变量。此外,在大数据时代,数据集中的变量数量可能会失控,甚至变得令人困惑和具有欺骗性。这使得手工选择有意义的变量变得困难(或不可能)。

别担心,PCA 会查看数据集中连续变量的整体结构,以便从数据集中的噪音中提取有意义的信号。它旨在消除变量中的冗余,同时保留重要信息。

PCA 也爱乱七八糟。

PCA 如何工作

PCA 最初来自于线性代数领域。它是一种变换方法,在数据集中创建原始变量的(加权线性)组合,目的是新的组合将尽可能多地捕获数据集中的方差(即点之间的间隔),同时消除相关性(即冗余)。

PCA 通过使用从原始变量的协方差矩阵计算的特征向量和特征值,将数据集中的原始(以平均值为中心的)观察值(记录)转换为一组新的变量(维度)来创建新的变量。

那是一口。让我们分解一下,从均值开始——以原始变量为中心。

PCA 的第一步是将所有输入变量的值居中(例如,从值中减去每个变量的平均值),使每个变量的平均值等于零。居中是一个重要的预处理步骤,因为它确保生成的组件只关注数据集中的方差,而不捕捉数据集的整体平均值作为重要变量(维度)。如果没有均值居中,PCA 找到的第一个主成分可能对应于数据的均值,而不是最大方差的方向。

一旦数据被居中(并且可能被缩放,取决于变量的单位),数据的协方差矩阵需要被计算。

协方差是一次在两个变量(维度)之间测量的,它描述了变量的值彼此之间的相关程度:例如,随着变量 x 的观察值增加,变量 y 也是如此吗?较大的协方差值(正或负)表示变量之间有很强的线性关系。接近 0 的协方差值表示弱的或不存在的线性关系。

这个来自https://stats . stack exchange . com/questions/18058/how-would-you-explain-协方差-to someone-someone-who-understand-only-the-mean的可视化对于理解协方差是超级有帮助的。

协方差总是在二维空间中测量。如果处理两个以上的变量,确保获得所有可能的协方差值的最有效方法是将它们放入一个矩阵中(因此称为协方差矩阵)。在协方差矩阵中,对角线是每个变量的方差,对角线上的值是彼此的镜像,因为变量的每个组合在矩阵中包含两次。这是一个正方形的对称矩阵。

在本例中,变量 A 的方差为 0.67,第二个变量的方差为 0.25。两个变量之间的协方差是 0.55,这反映在矩阵的主对角线上。

因为它们是正方形和对称的,协方差矩阵是可对角化的,这意味着可以在矩阵上计算特征分解。这是 PCA 找到数据集的特征向量和特征值的地方。

线性变换特征向量是一个(非零)向量,当对其应用相关的线性变换时,该向量改变其自身的标量倍数。特征值是与特征向量相关的标量。我发现对理解特征向量和值最有帮助的事情是看一个例子(如果这没有意义,试试看 Khan Acadamy 的这个矩阵乘法课程)。

有人告诉我,矩阵乘法中包含一个是不符合惯例的,但为了清楚起见,我还是保留了它。我向读到这篇文章的任何被冒犯的数学家道歉。*
在这个例子中,

是特征向量,5 是特征值。

在高层次理解 PCA 的背景下,关于特征向量和特征值,你真正需要知道的是协方差矩阵的特征向量是数据集中主要成分的轴。特征向量定义了由 PCA 计算的主分量的方向。与特征向量相关联的特征值描述了特征向量的大小,或者观察值(点)沿着新的轴分散了多远。

第一个特征向量将跨越在数据集中发现的最大方差(点之间的间隔),并且所有随后的特征向量将垂直于(或者用数学术语来说,正交)在它之前计算的特征向量。这就是我们如何知道每一个主成分都是不相关的。

如果你想了解更多关于特征向量和特征值的知识,有多个 资源 散布在 互联网上正是为了这个目的。为了简洁起见,我将避免在博客中试图教线性代数(糟糕的)。

PCA 找到的每个特征向量将从数据集中的原始变量中提取方差的组合。

在本图中,主成分 1 说明了变量 A 和 b 的差异。

特征值很重要,因为它们为新导出的变量(轴)提供了排序标准。主成分(特征向量)按特征值降序排序。具有最高特征值的主成分被“首先挑选”作为主成分,因为它们占数据中最大的方差。

您可以指定返回几乎与原始数据集中的变量一样多的主成分(通常是从到 n-1 ,其中 n 是原始输入变量的数量),但是大部分方差将在顶部的主成分中考虑。有关选择多少主要组件的指导,请查看此堆栈溢出讨论。或者你可以一直问自己,“自我,有多少维度会激发快乐?”(这是一个笑话,你可能应该只使用一个 scree 情节。)

Scree 图显示了每个主成分的方差。该屏幕图是为 Alteryx Designer 中的主要组件工具的报告输出而生成的。

在确定了数据集的主成分后,需要将原始数据集的观测值转换为所选的主成分。

为了转换我们的原始点,我们创建一个投影矩阵。这个投影矩阵就是选择的特征向量串接成的一个矩阵。然后,我们可以将原始观测值和变量的矩阵乘以我们的投影矩阵。这个过程的输出是一个转换后的数据集,投射到我们的新数据空间中——由我们的主成分组成!

就是这样!我们完成了 PCA。

假设和限制

在应用 PCA 之前,有一些事情需要考虑。

在执行 PCA 之前对数据进行标准化可能很重要,特别是当变量有不同的单位或标度时。您可以在 Designer 工具中选择选项缩放每个字段,使其具有单位方差。

PCA 假设数据可以用线性结构来近似,并且数据可以用较少的特征来描述。它假设线性变换能够并且将会捕获数据的最重要的方面。它还假设数据中的高方差意味着信噪比高。

降维确实会导致一些信息的丢失。由于没有保留所有的特征向量,因此会丢失一些信息。然而,如果没有包含的特征向量的特征值很小,你没有丢失太多的信息。

使用 PCA 要考虑的另一个问题是,变量在转换后变得不太容易解释。一个输入变量可能意味着一些特定的东西,如“紫外线照射”,但 PCA 创建的变量是原始数据的大杂烩,不能以一种清晰的方式解释,如“紫外线照射的增加与皮肤癌发病率的增加相关”当你向别人推销你的模型时,更难解释也意味着更难解释。

优势

主成分分析是流行的,因为它可以有效地找到一个更少维度的数据集的最佳表示。它在过滤噪声和减少冗余方面是有效的。如果您有一个包含许多连续变量的数据集,并且您不确定如何为您的目标变量选择重要的特征,那么 PCA 可能非常适合您的应用。类似地,PCA 也很受欢迎,用于可视化高维数据集(因为我们这些贫乏的人类很难在超过三维的空间中思考)。

附加资源

我最喜欢的教程(包括基础数学的概述)来自奥塔哥大学的 Lindsay I . Smith关于主成分分析的教程

这是 UCSD 的 Jon Shlens 关于主成分分析的另一个很棒的教程

关于 PCA 你所知道和不知道的一切,来自博客它的神经元专注于神经科学中的数学和计算。

3 个简单步骤中的主成分分析有一些很好的说明,并被分解成离散的步骤。

Jeremy Kun 博客中的主成分分析是一篇很好的、简洁的文章,其中包含了对到特征脸引用。

主成分分析的一站式商店来自 Matt Brems。

。经允许重新发布。

作为政治武器的抖音教

原文:https://towardsdatascience.com/tiktok-as-a-weapon-2f0d33b2d0cd?source=collection_archive---------27-----------------------

Photo: Merzmensch

T T 嘿对口型。他们做出夸张的面部表情。他们爱自己。他们在寻求恭维。虚荣的一代。这至少是我对 Musical.ly 背后的随机表演者的第一印象。我的第二印象是。甚至是我的第三个。

一方面——很高兴看到这么多年轻人想要做一些有创意的事情,进行数字交流,寻找新的想法和合作项目。(单看设置和视频剪辑就不明显了)。
数字能力!

另一方面——大部分表演都在重复其他的表演。这不仅仅是一场比赛——看起来整个完美学习的刻板手势库比应用程序内的音乐库要有限得多。喜欢你的默认角色动画集从堡垒之夜

Just random one of zillions samples (without music). I mean, they try and have fun, and it’s fine and all.

但后来中国开始发挥作用。

停止。假新闻。Alex Zhu杨鲁豫上海- 基地团队开发并于 2014 年发布(哦,我猜是评论中即将出现的地缘政治讨论),他们最初想将其用于教育需求(实际上是个很酷的想法)。然后重点转向娱乐和音乐短片,增长令人印象深刻:

2015—1000 万用户
2016—9000 万用户
2017 — 200 万用户

2018字节跳动10 亿美元收购,并与自己的 App——musical . ly 合并成为抖音。目前全球有 5 亿活跃用户

平台的大陆漂移——和心态。

我们无时无刻不在经历着。脸书不再是 T2 了。推特是为老年人准备的。 LinkedIn专业网络。 Snapchat 显然是新的,但是仍然不能令人信服,基本上是由于易腐的内容。但是抖音!每个人都在谈论抖音。

这不仅仅是你在校园里流行的另一款青少年应用。

加里·维纳查克正在为抖音向世界传福音。

[## 为什么抖音(前 Musical.ly)应用如此重要| GaryVaynerchuk.com

几年来,我一直在密切关注抖音的应用程序(以前的 Musical.ly ),我看到了它的进步…

www.garyvaynerchuk.com](https://www.garyvaynerchuk.com/why-tiktok-formerly-musical-ly-app-is-important/)

他指出了这款应用背后的创造力:

1.抖音的应用程序是未来有影响力的人和内容创作者的“训练轮”2。他们抓住了一个新的人口统计数据
3。它可以为其他平台铺平道路,给创作者一个“创造”的框架

事实上,这个应用程序有潜力孵化新的人才,教育他们,并在病毒的翅膀上提供新的可能性。已经提到的编辑技能变得更加训练有素,每一个新的复杂的 AR 滤镜更新。在一个非常短的视频剪辑中结合视频片段和音乐是一个挑战——正如Anton echov曾经说过的:

Краткость — сестра таланта.//“简洁是才华的姐妹。”

抖音是“国家安全威胁”(对任何国家而言)

另一方面,抖音被美国彼得森国际经济研究所称为“对西方的国家安全威胁”,因为世界范围内(但主要是美国)的个人和生物数据暴露在中国服务器上。嗯,筒仓不好。所有数据都已经保存在 Fort Meade 中——现在又多了一个无法控制的利益相关者。它有另一个议程。有人认为,ISIS 用肮脏的信息占领了抖音,这和谷歌在 YouTube 上遇到的问题是一样的。

然后我们还有几个有趣的事件。它们令人大开眼界。他们展示了什么是可能的。它们显示了抖音的破坏性影响。

Feroza Aziz 和#ChinaCables

What begins as a usual make-up video tutorial becomes an urgent political message to followers:

I’m going to teach you guys how to get long lashes. The first thing you need to do is get your lash curler, curl your lashes — obviously — then you’re going to put them down and use your phone that you’re using right now to search what’s happening in China.

She raises awareness about a disastrous ongoing situation with Uyghur Muslims in China. This is also in focus by the #ChinaCables, leaked papers (published by New York Times) documenting more than the questionable state of being in the so-called “Re-education camps”. Actually, the apparent infringement of human rights.

Her video was blocked, account temporarily disabled, now it’s online again (officially by TikTok due to some admin issues).

It was not the first time for TikTok to confront political issues. Recently BuzzFeedNews reported about apparent censoring of pro-HongKong democracy messages by TikTok users.

[## TikTok Users Are Finally Posting About Hong Kong, But Only To See If They'll Get Censored

The short-form video app TikTok can't shake an air of suspicion that surrounds it in the United States. On Thursday…

www.buzzfeednews.com](https://www.buzzfeednews.com/article/ryanhatesthis/tiktok-users-are-finally-posting-about-hong-kong-but-only)

At the same time, a TikTok spokesperson answered to BuzzFeedNews:

“Our content and moderation policies are led by our US-based team and are not influenced by any foreign government. […] The Chinese government does not request that TikTok censor content. To be clear: We do not remove videos based on the presence of Hong Kong protest content.” (Source)

The messages didn’t have the virality, sufficient to be upvoted and get viral within the TikTok network, they said. Other than dancing teens.

According to the Guardian report, there were previously strict guidelines (restricting topics like political demonstrations etc.).

[## Revealed: how TikTok censors videos that do not please Beijing

www.theguardian.com](https://www.theguardian.com/technology/2019/sep/25/revealed-how-tiktok-censors-videos-that-do-not-please-beijing)

但是在字节跳动发表官方声明后这些指导方针在 2019 年 5 月就已经过时了,远在香港示威游行之前:

正在讨论的旧准则已经过时,不再使用。如今,我们采取本地化的方法,包括本地版主、本地内容和审核政策、全球政策的本地细化等等。(来源

也就是说,中国政府没有直接命令审查视频——现在这是当地团队的任务(那些团队,他们最近禁止了亲 LGBT 内容 btw )。).

但不仅仅是关于中国。

还有梅奥皮特案。这是抖音青少年对民主党 2020 年皮特·布蒂吉格总统候选人的绰号。他们批评他所有的失礼和失态。这不仅仅是关于网络欺凌(有趣的是,这个故事开始于 Reddit,但在抖音变得活跃)。

《麻省理工技术评论》确信:

即使在选举期间,抖音仍然被政客们忽视。最常见的误解是:由于抖音的普通用户是青少年,不具备选举资格(18 岁为法定投票年龄),所以这没关系。

不对。

(Source)

常见的危险是:忽视这种新的养育社交网络会导致,嗯,后果。

不在那里是危险的。

并不是说要追随每一次炒作。这不是偷偷进入每一个小应用程序。这是关于识别有影响力的平台并采取行动。

应该采取什么行动?麻省理工学院评论建议:

抖音帮助迷因像病毒一样传播,它可以很容易地在对话中注入一个候选人。最终,这不就是一个候选人想要的吗?

的确,唯一的办法就是——参与。来回答。来回复。不是芭芭拉·史翠珊式的。但频率相同。这也会像病毒一样传播开来。

和艾

作为一个人工智能用例,病毒式传播对这款应用至关重要。字节跳动(抖音背后的公司)正在广泛使用人工智能:

  • CBInsight 将该公司列入其 2018 年度人工智能 100 强名单
  • BuzzFeed 的新闻头条竞争对手“今日头条”正在向其 1.2 亿用户发布与相关的新闻。日常用户借助 AI。
  • 自 2016 年以来,字节跳动正在运行自己的人工智能实验室

Bernard Marr 描述了字节跳动的人工智能算法(无可否认,抖音视频交付算法可以应用这些算法):

该公司的智能机器使用计算机视觉和自然语言处理技术来理解和分析书面内容、图像和视频。然后,基于机器对每个用户的了解,它们会提供它认为每个用户想要的内容。

如果我们走远一点,你会怎么想,这种基于人工智能的交付会有政治偏见吗?比方说,如果人工智能获得了避免特定话题的“警报触发器”?

脸书/推特/领英对抖音的选择性算法?

欢迎在评论中分享你的观点。

数据科学家的时间复杂性

原文:https://towardsdatascience.com/time-complexity-for-data-scientists-664d00e57724?source=collection_archive---------13-----------------------

Pixabay from Pexels

大数据是硬的,大数据的挑战体现在推理和计算两个方面。随着我们向更精细和个性化的推理发展,我们面临着在个人层面产生、可信和透明的推理和决策的挑战[1]。现在,我们将关注“及时性”的挑战,并尝试获得关于某些算法如何扩展以及它们是否可用于处理大规模数据集的直觉。

在推论中,永远没有“足够”的数据。随着你获得越来越多的数据,你可以开始细分数据,以获得更好的群体洞察力,如年龄组,性别,或社会经济阶层[2]。

n 永远不够,因为如果它“足够”的话,你就已经开始下一个需要更多数据的问题了。—安德鲁·盖尔曼

这种对数据无法满足的需求带来了计算(和成本)方面的挑战。这些问题中的一部分可以通过并行化使用大量的计算资源用“蛮力来解决。如果没有合适的方法,其他问题在计算上是很难处理的。

简单地说,数据的大小对我们可以使用的算法和方法提出了物理约束。因此,作为数据科学家和问题解决者,重要的是我们要意识到我们的某些模型、算法和数据结构是如何工作的,以及它们在大规模下是如何表现的。这意味着我们应该熟悉我们可用的工具以及何时使用它们。

期待什么

这是一篇相当长的文章,有 4 个部分。在第 1 部分和第 2 部分中,我试图对算法和时间复杂性进行深入(希望是直观的)介绍。如果你对时间复杂性相当熟悉,那么你可以跳到第 3 部分和第 4 部分。

  1. 时间复杂度入门: 什么是时间复杂度,它对我有什么影响,我该如何看待它?
  2. 从慢到快算法 : 什么让一个算法变快?同一个问题的两个解决方案怎么会有完全不同的速度?
  3. 基本操作 : 我做的一些常规事情有多快/慢?
  4. 两两距离问题 : 如何快速找到最近邻?如何快速找到相似和近似重复的文档?我的聚类算法有多快?

时间复杂性入门

让我们从一些例子开始,让您了解如何考虑算法和时间复杂性。如果你对时间复杂性相当熟悉,你可以跳过这一节。

两个列表的交集

几年前,我的一个同事被要求对他们平台的常客进行描述性统计。他首先获得了本月的客户名单,并将其与上个月的客户进行比较。他有两个 python 列表curr_custprev_cust,他的代码看起来像这样:**

*common_cust = 0
for cust in curr_cust:
    if cust in prev_cust:
        common_cust += 1*

他从每月大约 4000 名客户的样本列表开始,这段代码片段运行了大约 30 秒。当这用于大约 300 万客户的完整列表时,这几行代码似乎会永远运行下去。

是因为 Python 就是慢吗?我们是否应该转向 C/Go 进行优化?我们需要为此使用分布式计算吗?答案是否定的。这是一个非常简单的问题,修复更简单,只需 1 秒钟左右。

*common_cust = 0
**prev_cust_set = set(prev_cust)** for cust in curr_cust:
    if cust in **prev_cust_set**:
        common_cust += 1*

对于具有计算机科学或一般编程背景的人来说,这个修正应该是相当明显的。但是可以理解的是,来自不太重视计算的背景的人可能看不出上面两个代码片段有什么不同。

简而言之,这种差异可以归结为 python listset之间的差异。一个set被设计用来快速完成这些"is this element in"操作。即使您将 **prev_cust_set** 中的元素数量增加一倍,操作 **cust in prev_cust_set** 也需要同样长的时间。

另一方面,如果将 **prev_cust** 的大小增加一倍,那么 **cust in prev_cust** 的运行时间就会增加一倍。如果您想知道set是如何做到这一点的,它使用了类似于散列表/散列表集、的数据结构,这也可以用某种版本的二叉查找树来实现。

时间复杂性和大 O

我们知道代码片段之间存在差异,但是我们如何表达这种差异呢?这就是大 O 符号的由来。

虽然大 O 有正式的定义,但你主要可以把它看作是一台机器完成算法所做的“运算”次数的估计。操作的数量与“运行时间”密切相关,它通常与数据的大小有关。您可能会听到类似于“经典的 SVD 分解具有立方复杂度。”以及你在所用算法的文档中可能遇到的一些东西。**

Big O’s in scikit-learn’s documentation

如果我们查看 python 关于时间复杂度的文档,我们可以读到具有形式x in s的操作:

  • O(n)如果s是一个list
  • O(1)如果s是一个set

我们从list的例子开始看,它是 O(n),其中n是每月的客户数。

一般步骤是:

  • 我们遍历curr_cust中的每个客户,这里有n个客户
  • 对于每个客户cust,我们检查它是否在列表prev_cust中。根据文档,这是 O(n ),但直觉上,要做到这一点,我们可能需要检查prev_cust中的每个客户,看看cust是否是其中之一。prev_cust中有n个客户,所以这最多需要n次操作
  • 添加号码只需 1 步。

循环的每次迭代大约需要 O(n) + O(1)步,循环中有 n 次迭代,所以把所有的 n(O(n) + O(1)) = O(n)。

你可以把 0 相加相乘,当你有几项时,你只需要去掉低阶项和系数。O(n +n) = O(n)。

我们可以使用set对代码做同样的事情,唯一的区别是cust in prev_cust_set运行时间为 O(1 )(平均)。

一般步骤是:

  • 有一个预处理停止来创建集合。我们就当这是 O(n)吧
  • 我们循环遍历curr_cust中的每个客户,这里有n个客户
  • 对于每个客户cust,我们检查其是否在列表prev_cust_set中。这需要 O(1)
  • 添加号码只需 1 步。

综合起来:O(n) + n(O(1) + O(1)) = O(2n) = O(n)。与list实现相比,set快得惊人。

解读大 O

所以我们有一个 O(n)的算法和另一个 O(n)的算法。你对此如何解读?

看待这个问题的一种方式是通过插入数据集的估计值 n 来估计问题的大小。如果我们的数据大小为 300 万,那么对于 O(n)算法将有大约 3000000 次操作,大约为 900000000000,这是一个很大的数目。

相同的数据集,但是使用 O(n)算法,将有大约 3000000 次操作,这更容易管理。

回想一下,在计算大 o 时,我们忽略了低阶项和系数,因此精确值在这里并不重要。我们只看问题的严重性。百万次运算算法比十万亿次运算算法好得多。

看待这个问题的另一种方式是获得两个数据集大小之间的相对比率。如果有每种算法的经验基准,并希望在扩大规模时进行推断,这将非常有用。

假设在40000的客户那里,list算法花费了 30 秒。如果我们将数据量增加一倍,需要多长时间?所以我们现在有一个大小为 2n 的数据集。那么运行时间将是大约

O((2n) ) = O(4n)

这意味着将 O(n)的数据集大小加倍会使运行时间增加 4 倍。我们预计它将运行 120 秒左右。

另一方面,对于set算法来说等于 O(2n)这就意味着数据集翻倍只是运行时间翻倍。

性能上的大差异来自于cust in prev_custcust in prev_cust_set的细微差别。当我们使用的很多代码都是从我们使用的模块中抽象出来的时候,这些差异就很难注意到了。

大 O 符号为我们提供了一种方式来总结我们对上述两种算法如何扩展的见解。我们可以比较 O(n)和 O(n ),而不知道每个算法是如何实现的。这正是我们在使用x in prev_cust_set是 O(1)这一事实时所做的,而没有描述set是如何实现这一点的。大 O 给我们的是一种通过描述运行时间相对于输入大小的一般形状来抽象算法的方法。

意识到这些差异有助于我们判断一个只有少量数据样本的特定方法在生产中是否可以扩展。你不希望发生在你身上的事情是,在一个小样本上做一个实验或概念验证,展示好的结果,从利益相关者那里得到一个行动信号,却发现你的算法不能处理所有的数据。

另一方面,如果您知道数据集不是海量的,那么您可以选择使用较慢的算法和模型,这些算法和模型要么给出更好的结果,要么实现和维护更简单。

从慢速算法到快速算法

在我们开始探索我们在数据科学中使用的不同工具和技术的时间复杂性之前,我将首先介绍解决一个简单得多的问题的方法,即范围查询问题。对于每种算法,我们简要讨论它是如何工作的,以及随之而来的特性。希望在经历了这一系列算法之后,你会对算法和时间复杂性有更好的感觉。

范围查询问题

假设我们有一个大小为 n 的数组。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]*

在上面的示例中,索引从 0:

  • arr[0] = 443
  • arr[1] = 53
  • arr[4] = 1989

您的任务是为某个查询query(a, b).获取索引ab之间所有数字的总和

假设查询是query(2, 5)。那么答案应该是10531

*arr[2] + arr[3] + arr[4] + arr[5] 
8080 + 420 + 1989 + 42 
10531*

另一个可能的可选操作是更新数组中的元素update(idx, new_val)

*update(3, 88)
query(2, 5)# arr[2] + arr[3] + arr[4] + arr[5] 
# 88 + 420 + 1989 + 42 
# 3539*

天真的解决方案

最简单的解决方案是遍历列表并得到总和。

*def query(a, b): 
    return sum(arr[a: b+1])*

上面的代码虽然代码很少,但实际上已经在做很多事情了。为了清楚起见,我们将把sum(arr[a: b+1])分解为以下查询:

*def query(a, b):
    ret = 0
    for i in range(a, b+1):
        ret += arr[i]
    return ret*

query(.)的总复杂度基于查询范围内有多少元素。这取决于ab,元素总数之和为b — a + 1,在处理大 O 记法时,我们看这个值的最坏情况,在查询整个数组的和时,这个值最高可达N

要更新数组,我们只需更新特定索引上的元素:

*def update(idx, new_val):
   arr[idx] = new_va*

这个update(.)函数显然是在 O(1)时间内运行的,或者是在常数时间内运行的。无论数组有多大,这个函数都运行相同数量的操作。

对于简单的解决方案,我们有以下时间复杂性:

  • 查询: O(N)
  • 更新: O(1)

这样做的问题是,如果数组被查询很多次,那么对于每个查询,都有一个 O(N)操作。对于q查询,你总共会有 O(qN)个解。

这可以接受吗?看情况。如果你有一个大的数组和大量的查询,那么这是不可接受的。想象一下,对于一个规模为 1,000,000 的阵列,您有大约 1,000 个查询。

如果数据很小,那么像这样的问题就变得微不足道了。

前缀总和

为了解决简单解决方案的缺点,我们引入使用一个前缀和。我们转换了原始数组,这样查询速度会更快。

前缀 some arr_sum是一个数组,其中特定索引处的值是原始数组中直到该索引的所有元素的总和。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]arr_sum[0] = 0
arr_sum[1] = arr[0]
arr_sum[2] = arr[0] + arr[1]
arr_sum[3] = arr[0] + arr[1] + arr[2]
...
arr_sum[8] = arr[0] + arr[1] + arr[2] ... + arr[7]*

然而,前缀和的这种特殊构造是缓慢的。构建arr_sum需要 O(N)个时间,因为arr_sum中有 N 个单元要填充,每个单元加起来有 N 个arr的元素。

我们可以通过注意到arr_sum[3]arr_sum[2]之间唯一的区别是arr[2]来更有效地构造arr_sum

*arr_sum[2] = arr[0] + arr[1]
arr_sum[3] = arr[0] + arr[1] + arr[2]
arr_sum[3] = arr_sum[2] + arr[2]*

因此,arr_sum的一个更好的结构如下

*arr_sum[0] = 0
arr_sum[1] = arr_sum[0] + arr[0]
arr_sum[2] = arr_sum[1] + arr[1]
arr_sum[3] = arr_sum[2] + arr[2]
...
arr_sum[8] = arr_sum[7] + arr[7]*

这需要 O(N)时间,因为仍然有 N 个单元,但是每个单元只需要计算 2 个值。如果操作正确,arr_sum将导致:

*arr_sum = [0, 443, 496, 8576, 8996, 10985, 11027, 12364, 20372]*

现在我们如何使用它?如果我们有一个对25的查询,那么我们可以使用从 0 到 5 的前缀总和,并从中减去从 0 到 1 的前缀总和,得到从 2 到 5 的总和。

*def query(a, b):
    return arr_sum[b+1] - arr_sum[a]*

Getting the sum of index 2 to 5

在某种程度上,我们拥有任何查询答案的缓存。我们预计算了一些在查询中对我们有帮助的值。需要明确的是,无论query(a, b)的范围有多大,函数只需要查找 2 个值,所以查询时间是常数,O(1)。

如果需要update操作怎么办?那么更新单个元素将意味着包含该元素的所有前缀总和也需要被更新。这意味着我们可能需要重建前缀和,这需要 O(N)时间。

对于前缀和算法,我们有以下时间复杂度:

  • 查询: O(1)
  • 更新: O(N)

我们看到了优化查询和更新之间的权衡。如果我们优化查询,那么它要求我们维护一个数据结构(我们拥有的前缀总和数组是一个数据结构),并且当涉及到更新原始数组的元素时,这有开销。但是,我们不想维护数据结构,那么每个查询都需要我们遍历查询范围内的每个元素。

分割树

我们构建的能够平衡查询和更新的特定数据结构是段树。这是一棵二叉树,其中每个节点代表一个段。

在下图中,我们有一个从arr构建的细分树。底部的叶节点是原始数组的元素,每个节点的值只是其子节点的总和。

*arr = [443, 53, 8080, 420, 1989, 42, 1337, 8008]*

Segment tree constructed from arr

我们重新标记了上面的树,以突出每个节点所代表的部分。最顶端的节点包含从索引 0 到 7 的整个数组的总和。

The number beside the node represents the range of indices of the segment it represents

那么,我们如何从中查询呢?这个概念类似于前缀 sum,我们可以使用预先计算好的数组片段来计算查询的范围。这里的区别在于,段树在它所能表示的段上更加灵活。

假设我们想找到query(2, 5)。获得突出显示的节点的总和将得到正确的答案。虽然证明并不简单,但是与原始数组的实际大小相比,您需要访问的节点数量自然非常少。此操作需要 O(log n)时间。

Getting the sum from elements 2 to 5

下面是另一个查询示例。比方说我们query(3, 7)

Getting the sum from elements 3 to 5

由于段树的制作方式,当我们更新一个叶节点时,唯一需要更新的节点是叶节点和根节点之间的节点。下面我们看到,如果我们在 5 更新元素,需要更新哪些节点。这个操作也需要 O(log n)时间,因为树上的每个节点都将所表示的段的大小加倍。

Nodes that need to be updated when updated element 5

对于分段树数据结构,我们有以下时间复杂性:

  • 查询: O(登录号)
  • 更新: O(登录号)

有了更复杂的数据结构,我们能够平衡查询和更新之间的权衡。然而,这种数据结构实现起来要复杂得多。这里将不讨论段树的确切实现。

注:通常在段树之前讨论的一个常用算法是芬威克树。虽然 Fenwick 树更容易实现,但我觉得 segment 树更直观。所以我选择不讨论这个。

甚至更快的算法?

如你所见,我们处理问题的方式可以极大地改变我们算法的性能(从二次到对数线性性能)。这可能需要做一些巧妙的预处理,找到一种更有效地表示数据的方法,或者使用数据的一些属性。

减轻这种情况的一种方法是投入更多的计算资源。然而,我们拥有的一些算法是在你拥有这台强大机器的时代设计的。这些可能不适合并行化。

然而,有一些问题,找到更快的算法可能非常困难,最快的算法仍然不够快。在这种情况下,找到更快解决方案的一种方法是放松问题。上面讨论的解决方案给出了精确的解决方案,但有些时候我们不需要最佳答案。我们需要的是足够好的答案。

我们可以通过以下几种方式之一来实现这一点:

  • 求解近似解(从最短路径到最短路径,或 k- 最近邻居k-足够近邻居)**
  • 使用使用概率过程的算法,在大多数情况下你可能会得到正确的答案(位置敏感散列和近似基数)**
  • 使用收敛的迭代方法(随机梯度下降幂迭代)
  • 使用在一般情况下表现良好的算法( KD 树
  • (重新)设计可并行的算法

当我们学习不同的算法时,会遇到一些这样的问题

基本操作

为了完整起见,我们来看一些基本操作的笔记。您可以在下一节跳过这一部分,这可能更有趣。

基本数据结构

  • 集合:添加、删除和测试一个set中的成员平均为 O(1)
*set.add('alice')
set.remove('alice')
'bob' in set*
  • 字典:添加、删除和测试键-值对,a dict平均为 O(1)
*dict['alice'] = 1
del dict['alice']
print(dict['alice'])*
  • 列表:在一个list的最后一个元素添加和删除的是 O(1) 。在特定索引处获取一个值是 O(1)。在列表中间插入和删除元素是 O(n)
  • 排序:任何好的排序算法都应该是 O(n log n)
*arr = [3, 2, 1]
arr.sort()*

描述性统计

  • 均值、方差、相关、最小值、最大值:这是 O(n) 并且可以使用它们的计算形式以分布式方式高效地实现。
  • 中位数,分位数:一个简单的实现需要 O(n log n)的时间,因为它涉及到对所有的观察值进行排序,O(n log n),并在特定的索引处查找值。使用像 introselect 这样的智能算法,我们可以将其降低到由 numpy.partition 使用的 O(n) 性能
  • 近似分位数:设计分布式算法来寻找分位数很难,因为它们需要数据的整体视图。这就是为什么在 BigQuery 和 Apache Spark 中只能得到大约的分位数。这些算法的时间和空间复杂度可以根据你愿意容忍的误差来调整,它允许我们以分布式的方式计算分位数。你可以在 data bricks【3】的博客文章中读到更多。
  • 近似基数:如果我们想知道有多少个不同的元素,那么我们有一个在 O(n)中使用set的方法。然而,这需要 O(n)空间,因为它必须存储我们遇到的每个唯一值。类似于近似分位数,我们可以使用超对数来估计基数,其中有运行时和准确性之间的明确权衡*。这就是 BigQuery 的 [APPROX_COUNT_DISTINCT](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate-aggregation)Elasticsearch 用来获得唯一值的计数。*

向量乘法和距离

  • 余弦相似性、欧几里德距离和曼哈顿距离/范数:获得 d 维向量的 Ln 范数或点积需要 O(d) 时间,因为它需要遍历每个维度。
  • 汉明距离:如果有 d 位,那么汉明距离的计算需要 O(d) 时间。但是如果你能把它放入一个 64 位的数中,那么你就可以用按位运算得到一个 O(1)运算。
  • Jaccard 距离:这涉及到获取两个集合的交集。虽然使用一个set来做这件事的平均时间是 O(m ),但是这里会有开销,这使得它比库做的要慢。像 numpy.in1d 这样的函数通过对两个集合的元素进行排序来做到这一点, O(m log m) ,当你有两个排序后的列表时,它们会在线性时间内获取它们的交集。
  • 编辑距离:又称, Levenshtein 距离,用于 fuzzywuzzy 等库。这个问题的解决方案使用了动态编程,对于两个各有大约 m 个字符的字符串,需要 O(m ) 的时间。这是距离度量中最昂贵的。

矩阵运算

对于矩阵运算,时间复杂度可能有点棘手,因为对这些运算的优化可以在非常低的级别完成,我们设计的算法可以感知缓存。在这一级别的优化中,大 O 符号可能会产生误导,因为我们会丢弃系数,并找到微调算法,这些算法可能渐进地更慢,但根据经验表现得更好。在 numpy 使用的 BLAS 和 LAPACK 等高性能库中会发生这种情况。

  • 矩阵乘法:如果你是两个矩阵,(n,p)和(p,m)相乘,那么这个的一般复杂度是 O(nmp) ,当两个大小为 n 的方阵相乘时是 O(n),numpy 等库使用 BLAS,所以矩阵乘法的具体实现取决于你使用的 BLAS 库。见此 stackoverflow 螺纹
  • 解线性方程和矩阵求逆:LAPACK 基准文档所述,这需要 O(n)时间。我认为 numpy 解线性方程组也是解矩阵逆。
  • (截断)SVD: 经典的 SVD 分解是 O(nm)或 O(n m) 取决于 n 和 m 哪个更大,但是如果你只需要得到前 k 个主特征向量,那么这个可以下到 O(nmk)
  • 随机化 SVD:svd_solver='randomized'根据文档O(n k)但原始论文说 O(nm log k)【4】时,这已经在 sklearn PCA 中实现。
  • 使用 OLS 求解线性回归:这在 O(nd)中求解,因为在求解 hat 矩阵时需要矩阵乘法[6]

成对距离

这是一个简单的问题,似乎没有简单的解决方法。

如果你有一个矢量 v ,并且你想要得到一个 n 矢量列表中的“最近的”矢量,那么最简单的实现将通过比较 v 和每个 n 矢量来花费 O(n) 时间。

更一般的,如果你有一个 m 向量的列表,对于每个向量,你想得到一个 n 向量的列表中“最近”的向量,这需要 O(nm) 时间。 O(n)如果 m 和 n 相等。

如果 nm 很大,那么这种成对的距离对于很多用例来说太慢了。到目前为止,我找到的解决方案如下:

  • 空间索引树:平均能执行 O(log n)次搜索,最坏情况下能执行 O(n)次搜索。例如球树和 K-D 树。**
  • 随机投影和位置敏感散列:这有助于我们用更快的算法获得近似的最近邻居。
  • NN-Descent: 这构建了一个 K-Nearest Neighbors 图,他们已经看到该图在 O(n^1.14 周围运行[5]

成对距离的问题

让我们进一步讨论一些您可能遇到的用例,以及在这个过程中有哪些数据结构和技巧可以帮助我们。

最近点

对于地理空间特征工程,例如风水先生,对于特定坐标,我们通过回答诸如“到最近的 _____ 的距离是多少?”的问题来构建特征和“1 公里半径内有多少个 ______?”**

在这两种情况下,你可能天真地要检查你所有的点,这是 O(n)。为什么?为了让你断定一个点是“最近的”,你必须有一些保证,所有其他的点都更远。对于只有几千个搜索点的情况,这可能是可以接受的。但是,如果您想要在数百万个点中进行搜索,或者减少每个查询的搜索时间,该怎么办呢?我们该如何着手呢?

一维中最近的点

首先,我们处理特殊情况,我们假设我们的点只有一个维度。作为预处理步骤,我们对数组进行排序。假设我们想寻找最接近 42 的数字。我们看看 42“适合”在哪里,在下面的例子中,这是在 37 和 50 之间。这可以很容易地使用二分搜索法,O(log n)来完成。

Looking for the number to 42. No point in searching before 37 or after 50.

请注意,因为我们知道 42 适合 37 和 50 之间。我们只需要找到 37 和 50 中最接近的数字;向左和向右的每个点都必须比这两个点更远。

空间索引树

我们如何概括这两个二维?这就是像 K-D 树和球树这样的数据结构的用武之地。

K-D 树将空间映射成矩形,其中在欧几里得空间中接近的矩形在树空间中也是接近的。

K-D Trees visualized: Mapping a space using a tree

有了 K-D 树,我们首先能够询问包含我们的查询点的区域是什么。第一个区域的点很少,大概在 O(log n)附近。在得到这个初始区域中所有点的距离之后,我们得到最近点的距离的一个上界。

Only visit regions that intersect with the upper bound that we found

我们使用这个上限来消除那些没有选择包含离我们的查询点最近的点的邻近区域。视觉上,我们将搜索空间限制在那些与灰色圆圈相交的区域。

这样,我们能够消除许多不必要的距离,帮助我们实现平均 O(log n)的搜索查询。我们还可以进行“k-最近邻”和“半径内的点”查询。

这些是在 PostGIS 的最近邻搜索中实现的数据结构,你也可以在这个 Mapbox 博客文章中读到更多。你也可以阅读更多关于最近邻居-Scikit-learn

最相似的文档/近似重复的文档

我们拥有的其他使用案例有:

  • 寻找与给定单词嵌入最相似的文档或单词
  • 在记录数据库中查找近似重复项,其中记录如果“足够接近”(小于 3 个编辑距离),就可以被视为重复项

如果我们只是找到完全相同的副本,这就容易多了。既然我们可以使用一个set来寻找这些重复,但是因为我们寻找的是近似的重复,那么我们必须找到一个不同的方法。

K-D 树很好,但是对于其他用例,比如 NLP 中的用例,它可能不太有用。K-D 树和球树的一些问题是:

  • 不支持余弦距离/相似度
  • 可能不适用于高维数据

记住 K-D 树平均运行 O(log n)。然而,这并不能保证,只是根据经验证明是正确的。它最差的情况是 O(n),这在高维数据中更常见。

为了理解,回想一下上面的插图,我们将探索的区域限制在与灰色圆圈相交的区域。在三维空间中,我们的区域是立方体,对于更多的维度,我们有超立方体。随着维数的增加,我们增加了超立方体区域的邻居数量,这意味着我们限制必须探索的区域数量的能力下降,因为越来越多的区域“接近”每一个其他区域。

随着维数的增加,K-D 树对于单个查询的平均运行时间从 O(log n)漂移到 O(n)。

近似最近邻居

因此,与其尝试给出最近的邻居,我们不如瞄准得到一个“足够近”的邻近邻居。一种简单的方法是尝试使用 K-D 树,但是我们跳过了对邻近区域的探索,而只是在包含查询点的区域中进行搜索。或者我们也可以限制为只探索一定数量的邻近区域。这将保证一个 O(log n),但当然,这影响了整体精度。

如果你增加一点随机性,我们就会得到类似于 Spotify 的 asury的东西,它使用随机超平面来划分空间,而不仅仅是超平面通过轴。

Random regions partitioned by random hyperplanes by annoy

这种方法可以用于 K-D 树中不可用的距离度量,例如余弦相似度。这对于快速查找 gensim 中描述的最相似的单词非常有用。

“蛮力”枚举

在寻找近似重复或相似的单词时有一种特殊情况。例如,在您想要解决拼写错误的地方进行搜索。特殊情况是当查询词很短并且您愿意容忍的最大编辑距离很小时。

在这种情况下,您可以通过枚举查询词的所有可能的变体,将问题转化为寻找精确匹配。

Enumerate all words with edit distance 1 to “choriso”

对于列举的单词,我们只需使用set在单词列表中查找。对于上面的例子,这样做的总成本是单词“choriso”的可能突变的数量,编辑距离最多为 1。

*for word in enumerate_mutations('choriso', max_edit_distance=1):
   if word in word_set:
       do_something(word)*

快速计算一下,我粗略估计的时间复杂度大约是 O((n52)^k) 以最多编辑距离 k 来枚举一个长度为 n 的单词的所有可能的突变。所以它相对于 k 是指数的。

这就是为什么 Elasticsearch 的模糊搜索只允许最多编辑距离 2,以及为什么这种方法只适用于 k 非常小,而 n 又不是大得离谱的情况。

区分位置哈希

LSH 是处理这个问题的一般方式,而在某种程度上,这个惹怒的一揽子计划是 LSH 某些想法的一种实现。

LSH 的主题是,我们希望将我们查找的元素限制在那些与我们的查询向量可能相似的元素。假设我们有单词“巧克力”,并想在列表中查找与“巧克力”相近的单词。

Maybe compare chocolate to words that share the same prefix or suffix

如果一个单词接近“巧克力”,那么它们很有可能共享相同的前缀。当然,如果我们把单词限制在那些有相同前缀的单词上,我们可能会漏掉那些只有前缀不同的单词。我们也可以包括共享相同后缀的单词。所以类似于“巧克力”的单词不太可能有不同的前缀和后缀。

在这种情况下,我们的单词的“哈希”是前缀和后缀,在哈希中有冲突的单词成为比较的候选。对于向量,你可以使用列的随机子集或随机项目进行哈希运算,并使用 MinHashes,你可以在第三章挖掘海量数据集【7】中读到更多。

python 的实现有 datasketch脸书 faissNearPy

如果您对这方面的更多内容感兴趣,您还可以使用粗略结构查看这些关于大数据的博客文章第 1 部分第 2 部分

聚类算法

在这里,我们将简单介绍几种聚类技术,以及它们的时间复杂度。

K-表示

在 K-Means 中,每个点被分配到它最接近的质心。同样,这需要比较每个质心到当前点的距离。如果有 n 个点和 k 个质心,那么每次迭代需要 O(nk)。这有一个隐藏的系数,是我们在算法收敛之前期望的迭代次数。

如果你想通过迭代 k 的可能值对 k 做一些超参数搜索,那么我们预计整体复杂度为 O (nk)。

小批量 K-Means

Mini Batch K-means 对原始数据集的随机样本而不是整个数据集进行每次迭代。这意味着我们不必将整个数据集加载到内存中来进行一次迭代,当你遍历大型数据集时,质心可以开始移动到局部最优。这与我们在随机梯度下降中发现的主题相似。我们期望总的复杂度现在是 O(mk),其中 m 是批量大小。

层次凝聚聚类

您有多种风格,如沃德、单个、完整和平均链接,但它们都有一个共同点,**它们需要创建一个距离矩阵。***

这意味着经典 HAC 算法保证至少有ω(n)的运行时间,根据 scipy 的文档,链接方法运行在 O(n ) 时间。

**除非你自己提供一个距离矩阵,否则 sklearn 内部调用的sk learn . cluster . agglomerate clusteringscipy . cluster . hierarchy .等库最终会使用scipy . spatial . distance . pdist创建一个距离矩阵。

HDBSCAN

HDBSCAN 是 DBSCAN 的迭代,是一种很好的算法,它使用几个超参数对数据进行聚类,没有对数据分布的强假设,并且对噪声的存在具有鲁棒性。

在高层次上,HDBSCAN 尝试估计点周围的密度,并将高密度区域中的点组合在一起。

对于某些距离度量 m ,HDBSCAN 有两个主要步骤,这两个步骤都可能很昂贵:

  • 计算核心距离:对于每个点,基于 m 得到 k 个最近邻。
  • 构建最小生成树:从全连通图中构建一个最小生成树,其中边的权重基于核心距离和度量 m.

对于一般情况,这两个任务的复杂度都可能是 O(n ), hdb 的作者可以尝试在[8]中解决这个问题。然而,这里的一个关键细节是,我们正在处理一个距离度量,例如欧几里德距离,我们可以做一些优化来加快这两项任务。

核心距离的计算需要 K-最近邻,我们已经讨论过可以使用 K-D 树或球树来加速。这意味着这一步平均在 O(n log n)和 O(n)之间。

有效地构造最小生成树超出了这篇博文的范围,但是简单地说,改进的双树 Boruvka 算法使用了一个空间树,比如 K-D 树,并使用它来寻找连接的组件之间的最近邻居。作者说这平均运行时间为 O(n log n)。

这样,HDSCAN 的平均运行时间大约为 O(n log n ),但是这个性能实际上取决于数据..根据数据的维数和数据的底层分布,仅核心距离的计算就可以达到 O(n)。

我应该喝杯咖啡吗?

为了总结不同的集群性能,HDBSCAN 文档的基准测试部分有一个我们可以使用的简洁表格。

HDBSCAN for 1000000 samples? Let’s get lunch first!

大数据很难

正如您所看到的,像获取成对距离这样的问题对于小数据集来说是微不足道的,但是随着我们对数据集进行扩展,这些问题变得越来越严重。

然而,如果我们能够利用问题的某些特性,比如有一个度量距离度量,那么我们就可以使用数据结构 K-D 树来减少运行时间。

另一种方法是概率算法和数据结构,如 LSH 和随机化 SVD,以在运行时间内获得加速,从而降低准确性。

对于更特殊的问题,解决方案不太明确。这是一个关于不同算法和设计选择的计算成本的好背景。

参考

[1]迈克尔·乔丹《论计算思维、推理思维与数据科学》。IST 讲座,2017 年 11 月。

[2]安德鲁·盖尔曼。“N 永远不大”。2005 年 7 月

[3]蒂姆·亨特、侯赛因·法拉奇和约瑟夫·布拉德利。《Apache Spark 中的近似算法:超对数和分位数》。Databricks 工程博客。2017 年 5 月。

[4]哈尔科、内森、佩尔-贡纳尔·马丁森和乔尔·特罗普。"寻找具有随机性的结构:构造近似矩阵分解的概率算法."暹罗评论53.2(2011):217–288。

[5]董、魏、夏利卡尔·摩西和。“通用相似性度量的有效 k-最近邻图构造。”第 20 届万维网国际会议论文集。美国计算机学会,2011 年。

[6]谢卓瑞。 STA141C:大数据&高性能统计计算。加州大学戴维斯分校。

[7] Leskovec、Jure、Anand Rajaraman 和 Jeffrey David Ullman。 海量数据集的挖掘 。第三章。剑桥大学出版社,2014 年。

[8]麦金尼斯,利兰和约翰希利。"加速分层密度聚类." arXiv 预印本 arXiv:1705.07321 (2017)。

照片: Pixabay 来自 PexelsKrivec Ales 来自 PexelsGuduru Ajay bhargav 来自 PexelsSplitShire 来自 PexelsDavid Geib 来自 Pexels

posted @ 2024-10-13 15:25  绝不原创的飞龙  阅读(581)  评论(0)    收藏  举报