原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
原文:https://towardsdatascience.com/averting-algorithm-aversion-through-explainability-f186d8c787dc?source=collection_archive———37———————–

科尔·凯斯特在 Unsplash 上的照片
想象一下,你正在申请研究生院,而你梦想中的大学的招生委员会决定今年的录取决定将由机器学习(ML)算法而不是人类评审员做出。你会对 ML 算法评估你并做出决定感到舒服吗?我们中的一些人可能不希望这样。但是为什么呢?
研究表明,基于证据的算法(ML 算法)比人类预测者更准确地预测未来。在一系列应用中,算法预测被认为优于人类预测,无论是股市预测还是游戏预测(在 AlphaGo 中)。录取决定也可以被视为一项预测任务,因为它们只不过是对候选人是否适合某个特定项目的预测,或者对候选人将有多成功的预测。然而,为什么我们中的一些人想要一个人来评价我们呢?
如果算法是比人类更好的预测者,那么人们应该选择算法预测而不是人类预测。然而,他们往往不会。这种现象,我们称之为算法厌恶,是有代价的,了解其原因很重要(Dietvorst,Simmons,and Massey,2014)。
我们对人们何时以及为何表现出算法厌恶知之甚少。关于人们何时使用人类预测者而不是高级算法,或者为什么人们不能使用算法进行预测,没有一致同意的机制。由于我们每天产生的数据量现在已经达到了几乎所有预测任务都需要某种算法参与的程度,因此解决算法厌恶问题非常重要,这样我们大多数人就可以依靠性能更好的算法来预测我们的未来。
Dietvorst、Simmons 和 Massey ( 2014 和 2016 )进行了几项研究,寻找算法厌恶的原因。他们发现:
- 在看到算法预测者犯同样的错误后,人们往往会比人类预测者更快地对算法预测者失去信心。
- 如果人们可以(甚至轻微地)修改结果,他们就会使用不完美的算法。因此,给予控制权是克服算法厌恶的一种方式。
然而,我们知道在许多情况下提供控制是不可能的。因此,我们需要寻找其他方法来克服或避免算法厌恶。

什么是黑盒算法?(来源)
现代预测算法大多被大多数人视为黑盒,因为它涉及复杂的机器学习模型,很少有人理解。除此之外,算法的复杂性和性能与其可解释性成反比。例如,线性回归模型可能很容易解释,但性能可能很差。另一方面,神经网络可以有很好的性能,但同时也很难解释。那么,解释模型的预测或者理解模型学到了什么,有助于克服算法厌恶吗?让我们来了解一下!
我进行了一项在线实验,将模型可解释性和算法厌恶这两个领域结合起来,以回答算法厌恶的可能机制这一更广泛的问题。特别是,我想探索这个问题:模型可解释性在算法厌恶中扮演什么角色,解释能帮助克服对算法的厌恶吗?我通过观察如果有解释,人们是否会比人类预测者(他们自己)更频繁地选择相同的算法(或给予更高的评价),来操作这个问题。
在开始我的实验之前,我需要选择一个机器学习算法,作为我的预测器/预测器。为了训练任何机器学习算法,我们需要数据,在我们的情况下,需要标记数据。为此,我使用了一个来自 Kaggle 的开放数据集,它类似于上面讨论的招生场景。
为了确保参与者不会被数字淹没,我特别强调在数据集选择过程中将特征/预测器的数量保持在 10 个以下。研究生招生数据集为每个学生档案提供了一个从 0 到 1 的“录取机会”衡量标准,以及以下 7 个参数:
- GRE 成绩(满分 340 分)
- 托福成绩(满分 120 分)
- 申请人完成本科学业的大学评级(满分 5 分)。1 是最低等级,5 是最高等级。
- 目标陈述优势(满分 5 分):1 分最低,5 分最高。
- 推荐信强度(满分 5 分):1 分最低,5 分最高。
- 本科 GPA(满分 10 分)
- 研究经验(0 或 1 ) : 0 表示以前没有研究经验,1 表示至少有一些研究经验。
我将“录取机会”指标乘以 100,转换为“录取分数”,以便参与者更容易处理,即他们可以输入整数作为预测值。“录取分数”可以被认为是对学生成功与否或个人实力的预测。分数范围从 0 到 100,分数越高表明录取/个人资料优势的机会越大。数据集总共有 500 个条目。数据集是干净的,不需要任何其他主要的数据预处理或数据争论步骤。
我在数据集上训练了几个模型,XGBoost 是表现最好的模型之一。我决定坚持使用 XGBoost 作为研究生入学预测器,因为即使使用最小的参数调整和预处理,我也获得了足够好的结果。准备好机器学习模型后,我必须选择一个库来为算法的预测生成解释。令人欣慰的是,机器学习社区已经接受了模型可解释性的问题,并开发了几种新的方法来解释机器学习模型。
一个这样的解释者是 SHAP (沙普利附加解释),一种解释任何机器学习模型输出的博弈论方法。SHAP 可以为单个行提供解释,说明每个要素都有助于将模型输出推离基准值。使用 SHAP 库也可以生成指示总体模型解释的摘要图和贡献依赖图。以下资源对使用 SHAP 理解模型可解释性非常有帮助,我推荐你去看看:
[## 学习机器学习可解释教程
从任何机器学习模型中提取人类可以理解的见解。
www.kaggle.com](https://www.kaggle.com/learn/machine-learning-explainability) [## 一种特征归属方法(假定)可以统治所有这些特征:Shapley 值
在 NIPS 上引起我注意的论文中,有一篇文章声称已经发现了一个框架…
towardsdatascience.com](/one-feature-attribution-method-to-supposedly-rule-them-all-shapley-values-f3e04534983d)
该实验是一个简单的随机控制实验,旨在检查添加解释是否对人们做出的选择或他们如何感知/评价该算法有任何影响。它建立在 Qualtrics 调查平台上,参与者通过朋友和关系在亚马逊 MTurk 和众包平台之外招募。参加者总数为 445 人,其中 350 人来自土耳其电信公司,其余 95 人来自不同来源。参与者的平均年龄为 30.76 岁,其中约 43%为女性,57%为男性。
调查 (请看一看以更好地了解流程)从询问参与者的年龄、性别以及对概率、计算机科学和机器学习的熟悉程度(1-4)开始。这是为了在实验完成后探索治疗效果的异质性。然后,所有参与者都熟悉一所加拿大大学在其招生委员会中利用机器学习算法的想象场景。接下来,参与者会看到 10 名申请者的特征值,并被要求预测他们的录取分数。在参与者给每个申请人打分后,如果参与者属于对照组,参与者的预测会显示在算法预测的旁边。然而,对于治疗组,除了参与者和算法的预测之外,还显示了对影响模型的特征的解释。

向参与者提出问题(左侧),并给出申请人概况特征的值。控制组(右上):预测分数后,控制组中的参与者会看到他/她的预测以及实际分数和算法的预测分数。向治疗组(右下)参与者展示对申请人的算法预测分数的解释,以及对照组所看到的一切。
此外,处理组中的参与者具有解释在 10 个问题之前显示的 Shapley 值的页面,以及具有特征重要性和贡献依赖图的页面,即,在 10 个问题之后显示的整体模型解释。
对照组(无解释)和治疗组(有解释)分别有 227 和 218 名参与者,他们在调查开始时被随机分组。一旦这些问题完成,参与者会被问一系列关于他们所看到的后续问题。本节特别关注三个问题:
- 你今年申请了同一个理学硕士/工商管理硕士项目,招生委员会正在试验你在前面 10 个问题中看到的算法。你支持哪种复习方法?
- 现在想象一下,你被任命为 MBA 项目的招生委员会主任。你会用算法代表你做决定吗?请注意,你必须应对大量的申请人和有限的劳动力,但你也要对自己做出的决定负责!
- 你认为机器学习算法做得有多好?在 0-100 的范围内给算法打分。

调查结束时向所有参与者提出的问题
这些问题代表了算法的结果(I)对参与者有直接影响,(ii)参与者对算法的结果负责,以及(iii)分别与它们没有任何联系的一般评级。
对于实验设计部分提到的三个后续问题,观察到以下结果:

1.当申请入院时,即当算法的预测对他们产生影响时,在没有解释的对照组中,参与者选择 ML 算法的百分比为 48.13%,在有解释的治疗组中,为 49.78%。

2.当出席招生委员会时,即当算法减轻了他们的工作但让他们负责时,在没有解释的对照组中,参与者选择 ML 算法的百分比为 47.95%,在有解释的治疗组中,为 49.50%。

3.当被要求对该算法进行总体评分时,对照组的参与者平均给它打了 70.81 分(满分为 100 分),而治疗组的参与者平均给了 71.07 分。两组的 Cohen d 值为 0.016。
从上面的结果,我们可以看到两组之间有一个非常明显的差异。在问题 1 和 2 中,当算法与 SHAP 解释一起出现时,更高比例的参与者选择使用该算法。还有,在问题 3 中, Cohen 的 d 值 0.016 说明均值之间的差异是正的,有利于具有可解释性的群体,但效果大小很小。总的来说,更大的样本量会使结论和效果更清晰。
**治疗效果的异质性:**与任何其他实验一样,我从三个方面探索了参与者之间治疗效果的异质性:年龄、性别以及对概率、计算机科学和机器学习的熟悉程度。所有年龄组的治疗效果都一样。性别在决定算法分数时也没有发挥作用。
当我们看算法得分或参与者对算法的感知方式时,总体差异并不大。然而,当我们根据他们对概率、计算机科学和机器学习的熟悉程度来看分组时,结果如下。

一个重要的观察结果是,与没有解释的对照组相比,没有技术背景(即从未听说过概率、计算机科学和机器学习)的参与者给出的算法分数在有解释的治疗组中总是更高。Cohen 的 d 值在这个小组中也显著增加,这表明与呈现给他们的纯粹数字相比,人们如何评价带有解释的算法有很大的积极影响。
通过这个实验,我试图找到算法厌恶可以通过可解释性来克服的经验证据。它适用于参与者受到算法预测影响的情况,也适用于参与者对算法准确性负责的情况。在进一步的实验中,治疗效果的异质性应该是主要关注点。我们可以特别关注非 STEM(科学、技术、工程和数学)参与者,提出额外的问题来了解他们选择这种方式的原因。如果我们可以在一个更大的数据集上证明这个实验的外部有效性,像 SHAP 这样的简单方法可以被纳入我们日常的机器学习预测器中,以帮助人们避免算法厌恶!
世界正在走向“可解释的人工智能”,许多人认为这是深度学习算法的必要条件。这个实验仅仅证明了这些步骤对于建立对算法的信任是必要的。
尽管算法厌恶不是一个大问题,但就目前而言,这是一个我们需要严肃对待的问题。虽然我们可能认为今天的预测任务只是一个简单的研究生入学问题或房价估算任务;这将是明天自动驾驶汽车上预测你前面卡车速度的任务。无论是医疗保健还是太空探索,在人类生命受到威胁的情况下,算法不可避免地要接管这些任务。无论在什么情况下,我们都需要找到一种方法来建立对这些算法的信任。因此,看到机器学习社区通过在我们的创新道路上像对待复杂性一样认真对待可解释性来解决这个问题,这是非常令人鼓舞的。
[1] Dietvorst,Berkeley 和 Simmons,Joseph P .和 Massey,Cade,算法厌恶:人们在看到算法出错后错误地避免算法(2014 年 7 月 6 日)。即将在《实验心理学杂志:总论》上发表。在 http://dx.doi.org/10.2139/ssrn.2466040 的 SSRN 有售:
[2] Dietvorst,Berkeley 和 Simmons,Joseph P .和 Massey,Cade,克服算法厌恶:人们会使用不完美的算法,如果他们能够(即使是轻微地)修改它们(2016 年 4 月 5 日)。可在 http://dx.doi.org/10.2139/ssrn.2616787SSRN买到
[3] Lundberg,S.M .,Erion,g .,Chen,h .等从局部解释到全球理解用可解释的人工智能对树木进行研究。自然机器智能 **2,**56–67(2020)。https://doi.org/10.1038/s42256-019-0138-9。
请随时在帖子上发表您的反馈和建议,或者通过 LinkedIn 与我联系。
原文:https://towardsdatascience.com/avoid-these-rookie-python-mistakes-9cc17cccd051?source=collection_archive———5———————–

(python 徽标由 http://python.org/提供)
随着大量的实践,编程将逐渐变得容易,但底线是
编程很难。
假设和自己解决问题的不幸组合会使事情变得更加困难。尤其是在没有导师的情况下,甚至很难知道你做事的方式是否是错的。我们当然都为以后进入代码和重构而感到内疚,因为我们都在不断学习如何以更好的方式做事。幸运的是,如果有足够的意识,纠正这些错误可以让你成为一个更好的程序员。
成为伟大程序员的最好方法是克服错误和问题。做事情总有更好的方法,找到更好的方法才是有挑战性的。习惯做这样或那样的事情很容易,但有时需要一点改变,才能真正成为一名伟大的工程师。
虽然“未实现”错误可能是这个列表中最不常见的错误之一,但我认为发布一个提醒是很重要的。在 Python 中引发 NotImplemented 不会引发 NotImplemented 错误,但会引发类型错误。我写了一个函数来说明这一点:
def implementtest(num):
if num == 5:
raise(NotImplemented)
每当我们试图运行“num”等于 5 的函数时,看看会发生什么:

引发正确异常的解决方案是引发 NotImplementedError,而不是引发 NotImplemented。为此,我修改了我们的函数:
def implementtest(num):
if num == 5:
raise(NotImplemented)
if num == 10:
raise(NotImplementedError('This is the right way!'))
运行这个会给我们正确的输出:

(这是我犯的错)
Python 中的默认参数被求值一次*,*,求值发生在执行函数定义的时。假设这些参数只计算一次,那么每个 inbound 元素都会在每个调用中使用,这意味着每次在函数中访问变量时,变量中包含的数据都是可变的。
**def** **add**(item, items**=**[]):
items**.**append(item)
我们应该做的是将参数的值设置为 nothing,并添加一个条件来修改列表,如果它不存在的话
**def** **add**(item, items**=**None):
**if** items **is** None:
items **=** []
items**.**append(item)
尽管这主要适用于 Python 用户的统计/DS/ML 方面,但根据具体情况,拥有不可变的数据是普遍重要的。

在面向对象的编程语言中,全局变量应该保持在最低限度。然而,我认为,通过解释全局变量当然是必要的,并且在某些情况下很好,给这种说法加上副标题是很重要的。这方面的一个很好的例子是数据科学,这是实际上正在进行的有限数量的面向对象编程,Python 的功能性比通常情况下更强。
当多个函数调用并依赖同一个值时,全局变量会导致命名和隐私问题。我认为全局变量的一个很好的例子是类似于文件路径的东西,特别是要和 Python 文件打包在一起的。即使在编写 Gtk 类和移动图形用户界面构建器时,也应该私下进行,而不是全局进行。

使用 copy 在客观上可以比使用 normal 赋值更好。正常的赋值操作只是将新变量指向现有对象,而不是创建一个新对象。
d = 5
h = d
使用 Python 的复制模块可以执行两种主要类型的复制,
浅层复制和深层复制。
这两种类型的副本之间的区别在于您希望通过函数传递的变量的类型。当对包含在单字节数据中的变量(如整数、浮点、布尔或字符串)使用深度复制时,浅复制和深复制之间的差异是感觉不到的。然而,当处理列表、元组和字典时,我建议总是进行深度复制。
浅层拷贝构造一个新的复合对象,然后(尽可能地)向其中插入对原始对象的引用。深度拷贝构造一个新的复合对象,然后递归地将原始对象的拷贝插入其中。有了这些定义,就很容易理解为什么要对给定的数据类型使用其中的一种。
import copy
l = [10,15,20]
h = 5
hcopy = copy.copy(h)
z = copy.deepcopy(l)
为了测试我们的结果,我们可以简单地检查它们的变量 id 是否与条件语句相同:
print id(h) == id(hcopy)
False
成为一名伟大的程序员需要不断提高,希望随着时间的推移,一些错误的观念能够被消除。这是一个渐进而痛苦的过程,但是通过大量的练习和更多的信息,遵循这样简单的指导和建议肯定会有所收获。像这样分享“不要做的事情”通常会成为很好的话题,让每个人都成为伟大的程序员,所以我认为讨论这个肯定是有益的,不管你在你的无尽的编程之旅中走了多远。
原文:https://towardsdatascience.com/avoid-this-mistake-if-you-want-to-learn-programming-fast-c4569cd1ec6d?source=collection_archive———43———————–

安东尼·托里在 Unsplash 上的照片
一位程序员创建了一个 Slack 频道,并邀请感兴趣的人加入。精通 Python 的程序员为那些想学习编程的人创造了通过做项目来学习的渠道。
频道主上传任务到频道,会员在上面一试身手;然后一起头脑风暴。
我也加入了频道,但我总是迷路。通过评论,我发现频道上的许多人对编程都有一定程度的精通。我对 Python 的熟练程度为零。我知道这个频道不会像我希望的那样快速提高我的知识。我退出了频道。
频道所有者的目标是好的。但是作为一个初学者,我能感觉到这种学习方法对初学者来说并不好。
以下是我认为初学者应该警惕这个陷阱的原因。
编程需要你了解基础知识。这就是让你精通一门语言的原因。你会很好地掌握你正在学习的语言。
如果你有一门语言的基础知识,并且用它来构建项目,那就太好了。太完美了。这意味着你正在运用你所获得的知识。
我看过几次类似“在这个 5 小时的视频里用 Node.js 搭建一个 Twitter app”的文章。这些类型的文章对于那些已经了解 Node.js 的人来说非常好,初学者不应该学习如何用这样的文章编码。
首先,大多数时候你会发现自己迷失了。你将很难理解如何从 A 点到达 b 点。如果这是你将面临的唯一问题,那就更好了。还有一个问题。这可能会永远阻碍你学习如何编码。以这种方式学习编码会让你对编程失去兴趣,并怀疑自己的学习能力。
第二,你浪费了很多时间。因为你没有项目语言的基础知识,这意味着你要做大量的研究和询问。有人可以向你解释 A 点是如何通向 B 点的,想想在你能够理解它之前要花多少时间。
第三,你只精通你做的项目,而不精通这门语言。你只擅长你做的项目。你不会成为语言大师。作为一名成功的程序员,你需要解决问题。有些问题不会是你已经知道如何解决的。它们是一种新的球类运动,你需要把它放在你的最佳比赛中。
我正在浏览一个社交媒体平台上的帖子,一名开发人员在他的页面上写道,他从事的大多数项目都不是他所知道的。他必须研究和研究项目。
一个没有良好语言基础知识的程序员会有什么样的命运?
第四,你不会成为一门语言的专家。专业化是在编程领域取得成功的关键。如果作为一个初学者,你习惯于通过“在 4 小时内完成这个”的视频来学习,你会一直想要尝试用不同的语言来完成不同的项目,这样的视频会让你大吃一惊。长此以往,这让你成为了一个没有语言的高手。
根据经验,要学会快速编码并成为一名成功的程序员,掌握一门语言的基础知识是关键。有了这些基础知识,在此基础上培养你的技能就变得容易了。当你面临一个问题时,你会知道如何寻找解决问题的方法。
像“在这个 3 小时的视频中如此构建”这样的文章并不是学习如何编码的最好方法——对于初学者来说。这是浪费时间和分心。
不要跳过语言的基础,直接通过构建项目来学习。当你熟悉了基础知识,就开始根据你选择的职业道路来构建项目。如果你现在跟随一个视频或一篇文章,教你如何基于你正在学习或已经学习的东西来构建一个项目,这没有什么不好。
感谢您的阅读。
原文:https://towardsdatascience.com/avoiding-cold-starts-on-aws-lambda-for-a-long-running-api-request-15b8194f2e01?source=collection_archive———15———————–

布拉登·科拉姆在 Unsplash 拍摄的照片
如果你和我一样,你会认为无服务器很棒。可忽略不计的运行成本,无需占用您时间的服务器配置,默认自动扩展等。等等。当然,根据“没有免费的午餐”的说法,这种便利和成本节约是有代价的,虽然无服务器有许多实际成本(内存限制、包大小、运行时间限制、开发人员学习曲线),但本文将假设您已经解决了这些问题(或者不关心它们),而是专注于特定的性能成本—冷启动。
冷启动很慢。这就是问题所在,到底有多慢取决于各种因素,比如你的运行时(python 实际上是启动更快的 lambda 容器之一),以及你在 Lambda 的设置阶段做了什么(源)。
作为数据科学家和开发人员,我们习惯了缓慢的节奏。开始下载 200 GBs 的文本数据(放上水壶),加载模型(可怜的茶),运行聚类算法(去散步)……听起来熟悉吗?虽然这种缓慢的速度对于实验(以及运行在持久服务器上的生产系统)来说是好的,但是对于无服务器模式来说却是致命的。AWS Lambda 只允许在函数超时和容器死亡之前最多运行 15 分钟,将所有未持久化的工作(和运行的计算)限制在死亡容器的墓地中,永远不会重新启动。
当您的 lambda 函数实际上是一个 API 端点,客户端可以临时调用它来触发一些实时数据科学/分析过程(在我们的示例中,NLP 基于任意长度的单个短语)时,这个问题就变得复杂了,因为 15 分钟的 Lambda 运行时间窗口突然缩减为 30 秒的窗口,以向客户端返回 HTTP 响应。
本文并不是试图让您停止在 lambda 中运行特定的 NLP 管道,相反,它希望帮助您了解这些约束以及克服它们的一些方法(或者,从理解的角度选择忽略,帮助您生活在边缘)。
冷启动发生在容器关闭时,然后在调用 lambda 函数时必须重新启动,通常这发生在大约 5 分钟的不活动之后。
已经有很多关于冷启动的文章,所以这篇文章不会提供详细的指导(我建议你查看这篇文章)。但是简单来说…
当容器从冷态启动时,该功能需要:
- 从外部永久存储器(例如 S3)获取并加载包含 lambda 代码的包;
- 旋转容器;
- 将包代码加载到内存中;
- 运行函数的处理程序方法/函数。
(https://dash bird . io/blog/can-we-solve-server less-cold-starts/)
注意:每当你调用一个 lambda 函数(这是你的代码)时,第 4 步总是发生。),但步骤 1-3 仅适用于冷启动。由于设置阶段完全发生在 AWS 中,它们不在我们的控制范围内。我们可以在步骤 4 中优化我们内心的内容,但是步骤 1-3 仍然会随意地给我们带来大约 10 秒以上的延迟。这显然是同步 API 的问题。
现在开始讨论我们的具体问题。我们有一个同步 API,它:
- 从 HTTP 请求中获取任意文本输入
- 从 S3 下载了一个 NLP 模型(大约 220mb)
- 使用模型对输入执行 NLP
- 将序列化的结果返回给调用者。
这里的问题是第二步。每次调用时从 s3 下载模型可能需要 15-20 秒。这在大多数情况下对我们的用例来说是好的,因为尽管我们提供了一个长时间运行的同步端点,但我们并不期望它很快(我们讨论的是动态 NLP,而不是简单的 GET 请求)。
然而,在冷启动期间,我们经常看到请求超时。这完全说得通,就好像 lambda 需要 10 秒启动,而下载模型需要 20 秒,我们没有太多时间来运行 NLP 并在 30 秒的 HTTP 窗口中返回结果!

图 1(作者截图):3 个月窗口中各种 API 调用的平均延迟。当线路在 29k 毫秒处中断时,将会发生超时,并引发 504 错误。
有各种方法可以解决这个问题,例如:
a.供应的并发
b.无服务器插件预热
c.EC2
d.定制的解决方案
下面将逐一讨论:
如果您知道一个确切的窗口,知道您的 lambda 流量的预期时间,那么供应并发是一个很好的解决方案。它基本上预先分配了一定数量的容器来运行您的 lambda,这些容器将在指定窗口的持续时间内保持运行。
这种解决方案的主要优势之一是,它可以改善上述 lambda 流程的设置(1–3)和运行时(4)阶段的延迟。显而易见,由于容器已经在运行(即没有冷启动),设置阶段在提供的时隙中被消除了,但这种方法如何加快运行时间可能不太明显。答案在于,通过保持容器温暖,避免了后续调用中不必要的初始化(例如,建立数据库连接、初始化对象、下载参考数据或加载沉重的框架等任务)(源)。
对于我们的用例,供应并发的问题是,由于我们的 API 必须支持全球不同时区的集成器,供应窗口将变得非常大,这对我们来说将成为无效的解决方案。此外,我们不知道这些窗口的确切时间。
我们使用(强烈推荐的)无服务器框架,采用该框架的最大好处之一是可用的开源插件的社区和范围。一个解决这个问题的插件是无服务器插件预热。
这个插件采取了一种类似的方法来提供并发性,因为它试图防止 lambda 容器变冷,但它是通过在指定的时间窗口内用虚拟请求撞击它们来实现的。该插件有很好的文档记录,高度可配置,但最终我们认为它不是我们的最佳途径,原因与提供并发选项相同——我们不一定能准确预测何时需要并发,将其配置为宽窗口将是浪费/过度。
让我们简单关注最后一点——浪费。Lambdas 像芯片一样便宜,但对我们来说,真正的成本是下载 NLP 模型。一个烟盒计算表明,如果我们试图在整个月的正常英国办公时间内保持 10 个集装箱运行,我们一个月就会下载 1.89TB 的数据。虽然这在 S3 还不是一笔大开销,但比我们目前的支出高出了几个数量级。在扩展您的 lambda 时,请记住真正的成本——通常不仅仅是 lambda 本身的运行时间!
每次都从 S3 下载模型听起来效率很低——难道我们就不能启动几个自动缩放的网络服务器,然后在上面加载模型,这样就可以开始了吗?问题解决了,不是吗?
是的,但是 A)这需要大量投资来重构我们当前完全无服务器的 API 后端,B)另一个烟盒成本计算显示,这将比实现 A 或 B 的成本高几个数量级,而 A 或 B 本身比我们当前所做的要贵几个数量级。
排除上述解决方案后,我们决定采用定制解决方案。
现在,这里的警告是,当选择推出自己的解决方案时,不要忘记开发的成本。我喜欢 Yevgeniy Brikman 的规则,即如果你是一家初创公司,除非你正在构建的是你的核心价值主张,否则不要构建它——使用开源库,否则使用专有解决方案。
然而,在这种情况下,我决定打破这条规则,因为替代方案的持续成本会使该特性的一次性开发成本相形见绌。
我们的解决方案基于这样一个认识:虽然我们无法准确预测何时需要预热服务,但我们知道,为了使用服务,客户端必须首先使用 OAuth 验证自己。如果发送了一个获取 OAuth 令牌的身份验证请求,很可能会接着发送一个对该令牌执行某些操作的请求。
因此,模式如下:
- 当生成 OAuth 令牌时,也异步预热 lambda 容器。
- 当发出后续客户端请求时,会命中 warmed lambda。
这是一个序列图:

图 2(图片由作者提供):在认证请求期间处理 NLP 模型 lambda 预热的序列图。
注意:这个解决方案有一个小问题,如果客户端在 lambda 完全预热之前发送后续请求,它会引入一个竞争条件。在我们的例子中,只要我们向我们的 API 集成者明确表示,在认证后发送第一个请求之前,给 lambda 留出预热时间,这就可以了。
无服务器很酷。在无服务器上做 NLP 很酷。API 请求超时并不酷(讽刺的是,冷启动并不酷)。如果你想变得冷静,通过考虑上面强调的方法之一来解决如何避免冷启动的问题。
根据您的具体使用情况,像提供的并发这样的现成解决方案可能是您的正确选择,或者,如果这些解决方案都不理想,那么就像我们一样考虑简单的定制方法。始终考虑运行和扩展服务的全部成本(不仅仅是 lambda 调用运行时)。最后,在避免过早优化的同时,如果您的 API 开始遇到超时问题,那么您知道现在是优化的时候了!
关于这一点:“每次都从 S3 下载模型听起来非常低效”。的确如此。这里的解决方案是利用 AWS lambdas 附带的“/tmp”存储,并且只有在模型还没有保存在那里的情况下才重新下载模型(即冷启动)。
原文:https://towardsdatascience.com/avoiding-confusion-with-confusion-matrix-metrics-a8a3d0ead144?source=collection_archive———20———————–

由马库斯·斯皮斯克在 Unsplash 上拍摄的照片
一个混淆矩阵是一个度量工具,用于评估分类机器学习模型的结果。它是一个正方形矩阵,其大小取决于模型中的类的数量。尽管我经常对可以推导出的度量标准感到困惑,因为它们代表了什么以及它们是如何计算的。
在这篇文章中,我将在混淆矩阵上为我们所有人创建一个参考,它的 17 个相应的度量及其公式(根据上面链接的维基百科文章),一些帮助我们最终不再需要这个参考的解释,以及如何从头开始编码它们。让我们加载我们需要的库并开始吧!
注意:所有配方都是稍加修改或取自上述维基百科文章,并使用此 在线乳胶生成器 创建。
由于本文的重点是度量,我将使用 NumPy 的均匀分布生成器创建一些假数据,为y_actual和y_pred获得 500 个 0 和 1 的随机值。
首先,我们需要讨论混淆矩阵的组成部分。为此,让我们创建一个带有二进制分类情况的样本混淆矩阵。

用 Python 代码自制的混淆矩阵
如标签所示,矩阵有两面。“真实标签”在左侧垂直方向,“预测标签”在底部。这决定了 4 个小方框中的数字所代表的预测类型。这些值是以下各项的数量:
- 真底片(左上)缩写 TN
- 真阳性(右下)缩写 TP
- 假阴性(左下角)缩写 FN
- 误报(右上)缩写 FP
你怎么记得哪条对角线有正确的匹配?沿着从上到下的对角线走。你也可以用短语“自上而下”作为记忆工具,因为你是沿着对角线从上往下走的。
快速提示,如果你设置了参数normalize=True,你会水平归一化结果。回想一下,规范化值意味着将所有值相加,然后将每个值除以该总和。混淆矩阵的每一行中的所有值都会再次发生这种情况。

上述混淆矩阵的标准化版本。
在这种情况下,真 0 标签行的总和是 239。用 128 和 111 除以 239 得到的百分比分别是小数 0.54 和 0.46。在继续下一步之前,现在尝试使用 true 1 标签行。
在我们开始之前,让我们通过scikit-learn创建混淆矩阵。
你可以像对任何其他数组一样对矩阵的每个部分进行切片,从而得到它们的值。这是因为该函数的输出是一个 2×2 数组。为了获得每个值,我们使用以下公式:
- 真底片(左上)=
cm[0, 0] - 真阳性(右下角)=
cm[1, 1] - 假阴性(左下)=
cm[1,0] - 误报(右上)=
cm[0,1]
在我们开始之前还有一件事。我将在解释和代码之前给出度量的公式。我鼓励你先尝试自己编写公式。然后你可以对照你自己的版本检查我的版本。这将让你练习自己编写公式。现在来看指标(这次是真的)!

准确性是最简单的,也可能是你最熟悉的。这是告诉我们有多少数据被正确分类的量度。该值越接近 1,精确度越高。

你可以认为这是积极的准确性。这个指标告诉我们“1”值被归类为“1”值的准确程度。

你可以认为这是负面的准确性。这个指标告诉我们“0”值被归类为“0”值的准确程度。

这就是事情开始变得棘手的地方。你可能会问这和召回有什么不同。该指标的目的是确定预测值“1】实际为真实“1”值的百分比。再次回忆只是告诉我们在所有真“1”值中,有百分之多少的真“1”值被正确预测为“1”值。

这是上面精度的否定版本。同样,这和特异性之间的主要区别是分母。分母包含所有预测为“0”的值。特异性将所有真正的“0”值作为其分母。因此,这告诉我们预测的“0”值实际上是真实的“0”值的百分比。

也被称为落幕。除了错误分类的值之外,您可以将此视为要回忆的对应物。该指标越接近 1,您将“0”值错误分类为“1”值的百分比就越大。该指标越接近零,被错误分类为“1”值的“0”值的百分比就越低。

也被称为失败率。除了错误分类的值之外,您可以将此视为特异性的对应项。该指标越接近 1,您将“1”值错误分类为“0”值的百分比就越大。该指标越接近零,被错误分类为“0”值的“1”值的百分比就越低。

这又是事情变得棘手的地方。但是这个度量也是精度的对应物。这里的分母是被归类为“1”值的值。由于分子是 FP 而不是 TP,我们使用这个度量来确定实际上是假 "1 "值的预测 "1 "值的百分比。

该指标也是阴性预测值的对应指标。这里的分母是被归类为“0”值的值。由于分子是 FN 而不是 TN,我们使用这个度量来确定实际上是假“0】值的预测“0”值的百分比。

这也被称为威胁率。关键成功指数显然用于预测,它提供了一种衡量“1”值相对于错误分类值(FN 和 FP)的准确性的方法。一些文章将该指数描述为命中与未命中。如果你对一个用例更感兴趣,这里有这篇论文是关于深度 CNN 的一个应用,它使用索引作为结果的度量。

Matthews 相关系数是实际值和预测值之间的相关性,例如我们的二进制情况。像相关性一样,它的范围可以从-1 到 1。这个度量提供的好处是,不管两个类之间的数量差异如何,模型都有一个“平衡的度量”来解释它的质量。除了这里提到的内容之外,请查看本段中链接的文章以了解更多细节。

照片由劳伦茨·克莱因海德在 Unsplash 上拍摄
关于这些指标的组成部分,您注意到了什么?
如果你注意到所有的指标都是由混淆矩阵本身的各个部分构成的,那你就对了!从这一点开始,剩下的 6 个指标(是的,我们已经完成了 11 个)将由上面的指标组成。所以如果你准备好了,我们走吧!

阿曼德·库利在 Unsplash 上拍摄的照片

平衡精度是一种精度度量,用作原始精度度量的替代。只有当您的目标达到平衡时,原始的精度指标才是最佳的。这是当你有几乎相等数量的“0”值和“1”值来训练模型的时候。当您的数据严重不平衡时(比如说 97%的数据是“0”值,其余的是“1”值),最初的准确性指标就失效了。平衡准确度对真阳性率和真阴性率(也称为召回率和特异性)进行平均,以获得更能代表不平衡数据的模型结果的准确度度量。看看这个例子的对比。

F1 得分是精确度和召回率的调和平均值(又名阳性预测值和阳性准确率)。这是原始准确性的另一个衡量标准。根据本文中的,当您的数据有大量负值(在本例中为“0”值)时,您可能希望使用这一指标来衡量原始精度。

根据 Venkatesh-Prasad Ranganath 的文章,知情是回忆的另一种选择。Venkatesh-Prasad 解释说,回忆的缺点是,当情况需要时,它不考虑模型的负类值(“0”值)的任何变化。包括特异性的真实阴性率有助于解决这个问题。我建议阅读本段中链接的文章,了解对这一指标的详细解释。

Venkatesh-Prasad Ranganath 在的同一篇文章中也提到了标记性。他解释说,标记性是精确性的一种替代。预测值的精度与 recall 有类似的问题,它不考虑负的真“0”值。精确地包括负预测值有助于处理这个问题。我再次建议阅读本段中链接的文章,以进一步了解这一指标。

正如你所看到的,流行阈值仅仅基于回忆和特异性(也就是真正的阳性率和真正的阴性率)。这是一个衡量标准,为模型的良好表现设置了一个标准。请注意,流行阈值的分母是上面的信息度量。

Fowlkes-Mallows 指数用于确定两组数据之间的相似性。在我们使用二元分类的情况下,它可以是一组实际值和一组预测值。它的范围从 0 到 1,越接近 1 表示相似性越强。
令人惊讶的是,存在如此多的评估机器学习模型的指标。更别说这些只和分类有关!为了帮助您进一步理解这些指标,请尝试将它们相互比较。例如,回忆和特异性关心负值(“0”值)和正值(“1”值)的预测率。然后你也有他们的假阳性率和假阴性率。还要记住,前几个指标的意义取决于分子和分母的选择。
感谢阅读!这封推荐信对你有多大帮助?你会如何修改它?
欢迎您在 Linkedin 和 Twitter 上关注或联系我。对 Twitter 上的 DM 开放。
直到下一次,
约翰·德杰苏斯
原文:https://towardsdatascience.com/avoiding-detection-with-adversarial-t-shirts-bb620df2f7e6?source=collection_archive———8———————–

连浩曲在 Unsplash 上拍照
仅仅穿一件特定类型的 t 恤怎么能让你不被人发现和监视系统发现呢?好吧,研究人员已经发现并利用了深度神经网络的致命弱点——一些最佳物体探测器背后的框架(YOLOv2,fast R-CNN,HRNetv2,仅举几例)。
在[1]中,作者设法在真实世界的用例中得到欺骗的基准准确度 57% 。然而,这并不是第一次试图欺骗物体探测器。在[2]中,作者为他们的模型设计了一种方法来学习和生成可以欺骗检测器的补丁。这种贴片戴在纸板(或任何平面)上时,可以躲过人体探测器,尽管准确率只有 18%

出自[2]。左图:成功检测到没有贴片的人。右图:拿着补丁的人被忽略。
像这样“迷惑”或“愚弄”神经网络被称为做出 物理对抗性攻击 或*现实世界对抗性攻击。*这些攻击最初基于错综复杂的像素值,使网络(基于其训练数据)混淆,将对象标记为“未知”或简单地忽略它。
作者在[2]中转换其训练数据中的图像,应用初始补丁,并将结果图像馈入检测器。获得的对象损失用于改变补片中的像素值,旨在最小化对象性分数。

出自[2]。生成补丁并获取对象丢失。
然而,除了 18%的低准确性之外,这种方法仅限于像纸板这样的刚性载体,并且当捕获的帧具有扭曲或歪斜的补丁时,性能不佳。而且印在 t 恤上肯定效果不好。
“一个人的运动可以导致他们衣服上明显和不断变化的褶皱(也称为变形)”[1]。从而使得开发通用对抗性补丁的任务更加困难。
[1]中的新方法采用薄板样条映射来模拟布料变形。这些变形模拟了以前尝试使用对抗模式所面临的现实问题。考虑不同的变形将极大地提高系统的性能,因为它将能够在更多数量的帧中 不检测 图案。
理解样条本身就足以大致了解他们试图用这种方法做什么。
对于一个更正式的数学定义,你可以看看这篇文章,对于一个更简单的理解,我认为这篇文章做得最好。
从直觉上来说,样条有助于平滑地绘制任意函数——尤其是那些需要插值的函数。样条有助于对这些缺失的数据进行建模:在对布料变形进行建模时,可以在连续的帧中看到面片形状的变形,我们可以使用一种高级形式的多项式样条,称为 薄板样条 (TPS)。
查看哥伦比亚的这篇文章,这篇文章很好地解释了 TPS 回归。
这些变化,或位移,在补丁帧随时间的推移,然后简单地建模为一个回归问题(因为我们只需要预测未来帧的 TPS 参数)。
上述模式只是一个对立的例子——一个违背对象检测器目的的补丁。作者使用 对转换的期望(EOT)算法 ,该算法有助于在给定的转换分布上生成这种对立的例子。
这里,变换分布由 TPS 变换组成,因为我们想要复制实时起皱、轻微扭曲和织物轮廓的变化。

来自[1]:模拟布料变形的效果。
除了 TPS 变换,他们还在人的边界框内使用物理颜色变换和传统的物理变换。因此,这产生了对扰动图像的像素值进行建模的方程。
基于所有这些复杂公式的 EOT 公式可以最终计算出攻击损失,并欺骗目标探测器。
到目前为止,以其最简化的形式对该过程的解释是针对单个物体检测器的。作者还提出了一种针对多目标探测器的策略,该策略涉及将最小-最大优化应用于单目标探测器方程。
在他们自己的数据集上训练和测试后的结果令人印象深刻。

来自[1]。在作者的数据集上生成自定义对抗性补丁后的结果
TPS 的使用也显示出巨大的进步:

来自[1]。比较使用 TPS(第二行)和不使用 TPS(第一行)的不同姿势的结果
- 在东北大学的一篇文章中,【1】的作者之一林雪澄清说,他们的目标不是为了偷偷摸摸地不被探测器发现而创造一件 t 恤。
“我们研究的最终目标是设计安全的深度学习系统,……但第一步是对它们的漏洞进行基准测试。”—林雪
- 当然,作者们意识到他们的结果有很大的改进余地,并提到将做进一步的研究来实现它。

由塞巴斯蒂安·莫利纳·福托格拉夫在 Unsplash 拍摄的照片
感谢您从头到尾的阅读!您可以通过 LinkedIn联系我,获取任何信息、想法或建议。
[1]:徐,,等.对抗性 t 恤!在物理世界中躲避人探测器(2019), arXiv 预印本。 arXiv-1910.11099
https://arxiv.org/pdf/1910.11099.pdf
[2]: Thys,Simen,Wiebe Van Ranst 和 Toon Goedemé,愚弄自动监控摄像机:攻击人员检测的对抗性补丁(2019),IEEE 计算机视觉和模式识别研讨会会议录。
PDF:https://arxiv.org/pdf/1904.08653.pdf
[3]: Athalye,Anish,和 Ilya Sutskever,综合稳健的对抗性例子(2017), arXiv 预印本 arXiv:1707.07397。
PDF:https://arxiv.org/pdf/1707.07397.pdf
原文:https://towardsdatascience.com/avoiding-expensive-last-mile-data-science-failures-b2dccb5ec0f3?source=collection_archive———71———————–

“他一生都在看别处”——便利贴上的塔图因
每当我们读到关于数据科学的成功或失败时,人们常常会提到“最后一英里”。通常与“这是项目进行到 s***!”相提并论。
这是非常重要的一步,您可以将通过分析/机器学习获得的见解提供给客户。你相信这些见解可以帮助他们做出更好的决策…这些决策最终会带来真正的商业利益。
内心深处,有一丝怀疑。如果你对客户不太关心的问题提供了见解会怎样?
回到土木工程的第一年,我们见过一切的教授会给新生一个挑战。两个城镇,被一条湍急的河流分开,我们需要一座桥…一座牙签桥。
“任何一种牙签桥。桁架?悬臂?拱门?你决定……”
“做假设!”面对几乎没有任何信息的抗议,他会咆哮回应。当年没有谷歌!
在接下来的一周里,学生们带来的模型从糟糕到差强人意,从无聊到完全古怪。教授苦笑着,首先会问“你们相信这些设计吗?”。
然后他拿出一个钢珠轴承,把它放在正确的位置,果然,每个人的结构都会一个接一个地倒塌。

《公民 101》中没有人能接近这位拉斯·埃里克森笔下的尤物(转载请注明出处:http://www.pisymphony.com/toothpick/toothpick13.jpg)
从工程师的角度来看,最后一英里的成功是一座结构稳定的桥梁。但是土木工程也是一门成熟的学科。它有明确定义的流程,会让你得到一个输出…除非事情变得非常糟糕。
数据科学在很大程度上是概率性的。就预测而言,我们从数据中提取知识,然后拼命对未来做出更有根据的猜测。
我们倾向于说“顾客先生,你可能会得到一座桥——我们只是不知道是哪一种,也不知道它会有多坚固。但是我们认为你应该越过它,因为我们已经……完成了工作!”
对许多客户来说,这是一个黑匣子。魔法发生了,但是是什么样的炼金术呢?这是花招吗?没有人确定。
而没说出口的问题通常是“我们信任那个黑盒吗?而前面的人呢?”。
“商界有句老话:如果不提出正确的问题,你怎么能指望得到正确的答案?对于任何给定的产品或服务,客户的期望、愿望和要求往往被禁锢在客户的头脑中。”~Forbes ~ '为什么企业无法走完分析的“最后一英里”
信任的问题可以追溯到最初。在客户看来,数据科学类型的业务问题可以采取多种形式,并经过多次迭代。
客户通常告诉你的是他们认为他们在特定时间点想要的。但是如果他们不了解你,他们可能一开始不会告诉你足够的信息…或者给你理解问题本质所需的背景。
所以实际上,你听到的问题的第一个版本不太可能是你需要解决的问题。
例如看看这个是如何变形的。
- 第一周:你的系统能预测硬件何时会失效吗? 好吧。
- 第三周:你的系统能在 30 分钟内完成预测吗? 好吧,但为什么是 30 分钟?
- 第 6 周:当硬件出现故障时,有多少网络流量受到影响?那是一件有点多但可行的工作。
- 第 9 周:事实上,我们知道高网络流量会导致硬件故障。您能预测流量何时会激增到足以导致故障吗? 为什么一开始不告诉我们包含流量?
- 第 14 周:我们已经有了一个硬件更新计划。如果我们用你的预测,会不会更便宜?对自己思考>我们到底如何收回成本??
最终,我们与客户(内部或外部)相处的每一天,都离了解真正的问题更近了一步。
找到一种尽可能快速和亲密地接触到那个肮脏的下腹部的方法意味着一项艰巨的任务,即总是试着站在顾客的立场上想象……然后问供应商一些问题,目的是从内心感受*。*
- 供应商在做什么?
- 他们真的了解我们的问题吗?
- 这些都管用吗??
这也是故事板在数据科学中派上用场的地方,它能够以一种邀请对话的方式来组织问题和答案。
几年前,受到沟通不畅和结果不佳的困扰,数据科学抓住了用数据讲故事的概念。
看到我们的第一手观众被数据驱动的对话淹没,我们不得不寻找替代方案。我们发现 Brent Dykes 在他的“基本数据科学技能”文章中描述的使用视觉和叙事的原因实在太引人注目而不能忽视。
挤出时间学习一项新技能是一回事,但如何找到动力呢?为此,我们去了电影业…可能是真正的视觉故事大师。
所以我们阅读了 Studio Binder 的故事板指南,然后浏览了故事板形式的电影收藏库。老实说,首先尝试在画板上解决客户的问题的想法更加鼓舞人心!
当然,这仍然给我们留下了如何有效地将数据整合到故事板中的问题,以供高层、工程师、经理和其他人使用。谢天谢地,我们找到了南希·杜阿尔特,并欣然接受了她关于人性化数据的想法。
对我们来说,故事板现在已经成为我们和我们的客户需要走的路的路标。

这不是一部电影,但故事板可以帮助您和您的客户了解事情的发展方向
我们犯的早期错误之一是在数据分析期间开始我们的故事板过程。太晚了…除非你确信你理解了客户所看到的问题。
现在我们从确保我们可以首先通过数据看到问题的目标开始,这并不总是像听起来那么容易。但它给了我们信心,让我们相信问题是切实存在的。
通过用你的话向客户复述问题,他们可以理解你的过程,你也可以理解他们的过程。
你也有机会改进问题,客户可能会感觉到你真诚地试图理解和承认他们的痛苦。
客户通常想知道发生了什么事情。一次一张图,一点点进步,就能创造奇迹。
更重要的是,当他们看到你在做什么时,那个黑盒就不再是黑盒了。
我们需要快速找出是什么让客户心动,最好是离终点线越远越好。
引入成本估算是一个确定无疑的方法,可以提前了解问题有多严重,客户有多关心它,以及您可能会偏离轨道有多远!
就像课程中的马一样,相同的故事板不一定适用于您客户领域中不同层次的受众。这就是为什么使用允许多个故事板从相同的底层数据出发的工具是至关重要的。
很多。
毫无疑问,这是一项耗时耗力的工作。我们实际上是在进行前期投资,希望未来能有更多的收益。广泛澄清问题从来不意味着数据清理、转换、模型构建和机器学习应用程序的所有其他工作都要停止。
但它确实给了我们在最后一英里之前自我修正的机会,而不会造成太多的附带损害。
并帮助我们与客户一起一砖一瓦地构建至关重要的叙述和业务案例。
“他一生都在向远处看……向未来,向地平线。他从不关心他在哪里…他在做什么”——尤达
现实是,即使业务问题被充分定义,如果决策者不相信我们如何到达那里的过程,任何有用的洞察力都不可能工作。如果他们一开始就不是旅程的一部分,这通常会发生。
但是如果我们参与客户版本的流程,我们就给了自己一个机会。我们可能最终会花足够的时间和他们在一起,让信任和尊重自然而然地建立起来。
当然,我们的工作质量最好是体面的,数字必须工作。
然后,他们可能会在你的允许下过桥…

(2020 年 2 月)瑞士巴登一个冬日下午的最后一英里回家
原文:https://towardsdatascience.com/awesome-julia-machine-learning-packages-everyone-should-try-e36a84b8c361?source=collection_archive———41———————–

尽管 Julia 仍然是一门相对年轻和温顺的编程语言,但有时生态系统变得如此成熟会令人非常惊讶。我认为在机器学习领域更是如此。虽然 Python 等其他语言当然有更多的机器学习包,但 Julia 的机器学习包绝对值得一试。它们不仅具有用像 Julia 这样的快速高级语言编写的额外好处,而且它们是很棒的软件,无论使用何种语言,都易于使用。
这些包中的许多都利用了 Julia 富于表现力的语法。此外,它们都使用 Julia 库中可用的函数,使用 Julia 的多态分派在不同类型上完成类似的任务。这使得包跳转比在另一种语言中更容易。关于许多 Julia ML 包的另一个很酷的事情是,它们不会很庞大,因为通常你不需要为了做统计而写过多的 Julia 代码。

开始列表是朱利安机器学习的主要内容,
Flux.jl。
在 Julia 中,Flux.jl 通常用作创建神经网络的抽象层。Flux.jl 是我在 Julia 语言中最喜欢使用的包之一,也是我开始使用 Julia 时最先使用的包之一。Flux 的一大优势是它非常小。它在 Julia 已经很棒的 AD 和 GPU 计算代码基础上提供了轻量级的抽象。哦,我有没有提到,Flux 有很棒的 CUDA 支持?并行计算始终是一个巨大的优势,但除了已经投入 JuliaGPU 的出色工作,Nvidea 显卡和 Flux 的结合使机器学习工程师的梦想成为现实。
Flux 的重量也使它非常适合在服务器上使用,因为它不会占用太多空间,并且可以非常容易地放入带有 Pkg 的微型虚拟环境中。总而言之,Flux 是可移植的。Flux 也是用百分之百纯 Julia 代码编写的,这是一个额外的好处,因为你不必处理外来的语法,也不需要使用 CSyntax 这样的包来完成 Flux 的工作。如果您想更熟悉 Flux.jl,我在本文中为您写了一个简短的介绍:
[## Julia 对 Flux 的快速介绍(使用 CUDA)
用 Flux 在 Julia 中建立你的第一个渐变模型
towardsdatascience.com](/a-swift-introduction-to-flux-for-julia-with-cuda-9d87c535312c)

Merlin 是另一个在 Julia 中创建神经网络的深度学习框架。Merlin.jl 是许多开发人员可能会忽略的一个包。然而,这将是一个错误,因为 Merlin 是一个不可思议的工具,在许多不同的场合下节省了我很多时间。像 Flux.jl 一样,Merlin 是相对轻量级的,并且是用百分之百纯 Julia 代码编写的。Merlin 在许多操作中往往超过 Flux,尽管这并不一定意味着它总是更快。
同样类似于 Flux,Merlin 内置了对 CUDA 的 GPU 支持。不仅如此,Merlin 模型通常比 Flux 模型更易于部署。虽然这并不是说部署 Flux 特别困难,但也不是特别容易。所以我会说,如果你计划部署一个 API,使用一个带有 Genie 和 Julia 的神经网络,我可能会选择 Merlin。除了所有这些很酷的特性,Merlin 还包括一个小的发行库。

Knet 是 Julia 的另一个深度学习框架,有一点扭曲。Knet 实际上是为 kou 大学开发的。因此,这个包似乎比这个列表中的大多数其他包维护得更好,这些包通常只由少数出于热情而工作的人来管理。与 Flux 和 Merlin 不同,Knet 是一个更重的包。Knet 也不是用纯 Julia 编写的,而是用各种语言编写的,比如运行在 Julia 代码下的 C 和 MATLAB。
但是,需要注意的是,Knet 中有很小一部分是用 C 和 MATLAB 编写的,总共只有大约 1.8%。我想说 Knet 是这个列表中初学者的最佳选择之一,因为它非常简单。

我犹豫要不要把车床加入这个列表,因为我对它有点偏见,因为
我是创造者。
然而,我觉得不在这里添加它是没有意义的,因为车床提供了大量的特性。首先,Lathe 附带了一个相当大的统计库,其中包括 chi 测试、贝叶斯统计、t-测试、f 检验,甚至还有一些不太为人所知的统计,如 signs 测试。最重要的是,stats 模块中还包含了验证,它具有连续和分类预测的准确性指标。作为本模块中统计数据的精华,Lathe.jl 还包含了一个不错的发行版库。
为了增加 DS/ML 的乐趣,Lathe 还提供了大量的预处理工具,这些工具可能是你从这个不成熟的包中没有想到的。这方面的好例子是特征定标器、训练测试分割和分类编码。最重要的是,车床有一个短而甜的模块加载数据到朱莉娅。如果您想将任何类型的图像或类似数据加载到 Julia 中,这些工具非常有用。
最后,车床有一个不断扩大的机器学习模块库,甚至支持构建卷积神经网络。车床也有一个管道框架,使得部署一个具有 JLD2 序列化的车床模型变得非常容易。Lathe 也是用纯 Julia 编写的,并且在文档方面相对稳定(尽管在 0.1.2 中有一个很大的文档更新,文档字符串被修改。)我会说,如果说 Flux 是 Julia 的 Tenserflow,那么 Lathe 就是 Julia 的 Sklearn。这意味着车床是包容的,提供了你需要的所有工具,并且它对初学者来说也是非常友好和容易的。
如果你想通过检查车床来支持我,你可以在这里这样做:
[## 车床
车床使用更快的方法和简单的方法。使得包装快速、简单且轻便。许多工具和模型…
车床. ai](http://lathe.ai)
MLBase.jl 是另一个 Julia 模块,它遵循与 Python 中的 Sklearn 类似的方法。MLBase.jl 包括用于通用数据处理的工具,如特征缩放器和编码器,以及基于分数的分类和验证。这个包还有一个非常独特和有用的特性,
模型调整。
MLBase 的模型调整将使你的超参数优化变得非常容易。MLBase,你可能已经猜到了,MLBase.jl 完全是用 Julia 写的。它也是这个列表中最轻的包。它也非常容易使用,所以对初学者来说是另一个很好的选择。
你有它;这些是 Julia 开发人员拥有的一些最好的机器学习模块。虽然它们中的一些肯定服务于不同的目的,但是从所有的特性中挑选特性往往是最佳的行动计划。至于开始的最佳方案,我会说它介于
- MLBase.jl
- 车床. jl
- Knet.jl
从那里,我会问“你想做什么?”因为这些模块中的每一个都有自己独特的才能,根据您的情况,这些才能可能有用,也可能没用。总的来说,尽管 Julia 的生态系统不像 Python 的怪物生态系统那样成熟,但这也是 Julia 有趣的一部分。很多人对这门语言做出了巨大的贡献,更重要的是,对整个数据科学做出了巨大的贡献。总之,虽然 Julia 可能没有你在其他语言中看到的那么多令人惊叹的模块,但它所拥有的包通常都是开发良好的,并且只是刚刚开始它们的旅程。
原文:https://towardsdatascience.com/awesome-jupyterlab-extensions-90c2d64d244?source=collection_archive———7———————–

作者图片
Jupyter Lab 是数据科学界使用最广泛的 ide 之一。当涉及到快速原型和探索性分析时,它们是许多数据科学家的工具选择。JupyterLab 巧妙地将许多功能捆绑在一起,实现了协作、可扩展和可伸缩的数据科学。然而,这篇文章不是关于 Jupyter 实验室的各种优势。我相信有很多关于这个主题的资源。相反,这里的重点是 JupyterLab 的一个有用的组件,叫做扩展。这些扩展非常有用,可以提高一个人在单独工作或团队工作时的效率。让我们从理解什么是扩展开始,然后我们将快速浏览 Github 上目前可用的一些有用的 JupyterLab 扩展。
JupyterLab 被设计成一个可扩展的模块化环境。因此,人们可以轻松地在现有环境中添加和集成新组件。扩展正是基于这一核心思想。JupyterLab 可以很容易地通过第三方扩展进行扩展。这些扩展由 Jupyter 社区的开发人员编写,本质上是 npm 包(Javascript 开发中的标准包格式)。那么是什么让这些扩展如此有用呢?这里有一段摘自官方文档的摘录,回答了这个问题:
"扩展可以向菜单或命令调色板、键盘快捷键或设置系统中的设置添加项目。扩展可以提供 API 供其他扩展使用,并且可以依赖于其他扩展。事实上,整个 JupyterLab 本身只是一个扩展的集合,并不比任何自定义扩展更强大或更有特权。”
在本文中,我们将看看一些有用的扩展,以及它们如何增强我们使用 jupyter 实验室的体验。但是在我们开始之前,让我们快速地看一下如何安装这些扩展。要安装 JupyterLab 扩展,您需要安装 Node.js ,要么直接从 Node.js 网站安装,要么如下所示。
conda install -c conda-forge nodejs
or# For Mac OSX users
brew install node
安装后,它会作为一个新图标出现在 JupyterLab 侧边栏中。
为了管理各种扩展,我们可以使用扩展管理器。默认情况下,管理器是禁用的,但可以通过单击“enable”按钮来启用。

启用扩展管理器|作者图片
或者,您可以在命令面板中搜索扩展管理器,并在那里启用它。

通过在命令面板|作者图片中搜索来启用扩展管理器
现在让我们浏览一下 JupyterLab 中目前可用的一些有用的扩展。请记住这些是第三方扩展,未经审核。一些扩展可能会带来安全风险或包含在您的机器上运行的恶意代码。
您可以在扩展管理器中搜索所需的扩展。搜索时,您会注意到其中一些扩展的名称旁边有一个 Jupyter 图标。这些扩展由 Jupyter 组织发布,并且总是放在最前面。

可用的 Jupyter 实验室扩展|作者图片
顾名思义,jupyterlab-Google-drive 扩展 通过 google drive 为 JupyterLab 提供云存储。安装完成后,这个扩展会在 JupyterLab 的左侧面板添加一个 Google Drive 文件浏览器。您需要登录您的 google 帐户,才能通过 JupyterLab 访问存储在 google drive 中的文件。
您可以通过扩展管理器安装扩展。在搜索栏中搜索扩展的名称并安装它。

安装 jupyterlab-google-drive 扩展|作者图片
然后,您需要重新启动环境。一旦您这样做了,您将看到以下提示:

安装扩展时提示 JupyterLab 构建|作者图片
点击**Build** 来合并任何更改,你会立即在侧边栏看到一个 google drive 图标。除了安装扩展之外,您还需要通过 Google 验证您的 JupyterLab 部署。通过 设置 文件或此处 链接 进行处理。填写凭据后,您就可以从 jupyter 实验室访问您的驱动器。

Jupyterlab Google Drive 扩展|作者图片
或者,您可以通过 CLI 安装该扩展,如下所示:
#Install the jupyterlab-google-drive extension
jupyter labextension install @jupyterlab/google-drive#Set up your credentials using [this](https://github.com/jupyterlab/jupyterlab-google-drive/blob/master/docs/setup.md) guide.# Start JupyterLab
jupyter lab
现在,如果有人与你共享一个笔记本或 markdown 文件,它将反映在 Jupyter 实验室的shared with me文件夹中。您可以在 Jupyter 环境中无缝地打开并编辑它。
JupyterLab Github 是用于访问 Github 库的 JupyterLab 扩展。使用这个扩展,您可以选择 GitHub 组织,浏览它们的存储库,并打开这些存储库中的文件。如果存储库包含一个 jupyter 笔记本,您将能够在您的 JupyterLab 环境中直接访问它们。
同样,您可以通过扩展管理器或 CLI 安装这个扩展。请注意,这个软件包已经表明它需要一个相应的服务器扩展,在使用该扩展之前,系统会提示您安装该扩展。


l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
安装后需要从 GitHub 获取 凭证。
一旦输入了凭证和权限,您就可以访问 JupyterLab 环境中的所有存储库,而无需在不同的界面之间切换。

JupyterLab Github 扩展|作者图片
Jupyterlab-git 是另一个有用的 Jupyterlab 扩展,用于使用 git 进行版本控制。
要安装扩展,您可以执行以下步骤:


l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
安装后,可以从左侧面板的 Git 选项卡访问 Git 扩展

Jupyterlab-git 扩展|作者图片
Jupyterlab-TOC扩展填充 Jupyterlab 界面左侧的目录。如果有一个笔记本或 markdown 文件打开,其相应的目录将在侧边栏上生成。这些条目可以滚动和点击。
****
l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
一旦安装了扩展,您可以通过 JupyterLab 的高级设置编辑器修改它的一些属性。例如,您可以通过将*collapsibleNotebooks* 参数设置为 *True* 来从目录中折叠笔记本的各个部分。

Jupyterlab-TOC 扩展|作者图片
Drawio 插件 是一个 Jupyterlab 扩展,用于将 drawio/ mxgraph 独立集成到 JupyterLab 中。画画。 io 是一款免费的在线图表软件,用于制作流程图、过程图、组织图、UML、ER、网络图。
****
l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片

Jupyterlab-drawio 扩展|作者图片
J 顶部栏可用于放置一些有用的指示器,如:

Jupyter 实验室环境中顶部栏上的指示器|图片由作者提供
****
l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
一旦安装并启用了扩展,您将在顶部栏上看到一些指示器。将有一个注销按钮,黑暗和光明的主题开关,自定义消息,和内存指示器。

Jupyterlab-Topbar 扩展|作者图片
Jupyterlab 代码格式化程序 是一个小插件,支持 Jupyterlab 中的各种代码格式化程序。这是我最喜欢的扩展之一,因为它消除了代码格式化的许多痛苦。
第一步是安装插件。
****
l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
下一步是安装代码格式化程序。Jupyterlab 代码格式化程序目前支持 Python 和 r 中的以下格式化程序。

在 Python 和 R. | Image by Author 中, Jupyterlab 代码格式化程序目前支持以下格式化程序
# Install your favourite code formatters from the list abovepip install black isort#orconda install black isort
然后你可以重启 JupyterLab 并配置插件,正如这里提到的和。下面显示了一个快速演示,但详细用法请遵循 文档 。下面演示的代码取自扩展的 Github 库。

Jupyterlab 代码格式化程序扩展|作者图片
jupyterlab-chart-editor扩展用于编辑 Plotly 图表,基于https://github.com/plotly/react-chart-editor。该扩展支持通过用户友好的点击式界面编辑 Plotly 图表。
****
l:通过扩展管理器安装|| R:通过命令行界面安装|作者图片
以下示例摘自官方文档。首先使用 plotly 创建图形,然后将其写入 JSON 文件。然后使用新安装的 plotly 编辑器打开保存的文件,并在 jupyterLab 环境中对其进行一些更改。

Jupyterlab-chart-editor 演示:Source — 官方文档
在本文中,我们研究了一些有用的 JupyterLab 扩展,这些扩展使 JupyterLab 脱颖而出。在一个工作场所中拥有不同的工具非常有用,因为人们不必在不同的环境之间切换来完成工作。这些插件肯定会让你的数据分析过程更加顺畅和高效。
原文:https://towardsdatascience.com/awesome-rust-powered-command-line-utilities-b5359c38692?source=collection_archive———4———————–

照片由蒂姆·德·格鲁特在 Unsplash 拍摄
**Table of Contents**[**Introduction**](#072d)🦀 [Starship](#461e)
🦀 [ripgrep](#a547)
🦀 [bat](#1a8c)
🦀 [tokei](#5e9b)
🦀 [exa](#0ac4)
🦀 [fd](#ed5f)
🦀 [procs](#d4f9)
🦀 [How I found them](#0776)[**Conclusion**](#ee40)
Rust 编程语言已经连续四年成为 Stack Overflow 最受欢迎的语言。
Rust 在很大程度上被视为 C 或 C++等其他系统编程语言的替代品。
这就是为什么包括 Benjamin Sago 和 Andrew Gallant 在内的许多天才开发人员创造了优秀的 Rust 驱动的命令行工具。
在本文中,您将找到现在可以开始使用的七大命令行实用程序。
对于任何 shell 来说,Starship 是最小的、极快的、可无限定制的提示符。
要安装 homebrew run:
brew install starship
关于如何安装星舰的更多细节,请阅读 这篇文章 中关于星舰的内容。
并将 init 脚本添加到 shell 的配置文件中:
# ~/.zshrc
eval "$(starship init zsh)"
你可以在这里找到来自的其他装置。

图片来自星际飞船
一个超快的搜索工具,递归地在目录中搜索正则表达式模式。ripgrep支持 Windows、macOS 和 Linux ,是grep的现代替代品。
可以安装ripgrep:
# macOS Homebrew/Linuxbrew
$ brew install ripgrep
# MacPorts
$ sudo port install ripgrep
# Windows Chocolatey
$ choco install ripgrep
# Windows Scoop
$ scoop install ripgrep
你可以在这里找到其他装置。
MS 的 VS 代码使用一个由 ripgre 驱动的搜索。默认情况下,它还会忽略隐藏的二进制文件。

行动中的超快速 ripgrep
[bat](https://github.com/sharkdp/bat)是一个cat克隆,具有语法高亮和 Git 集成。bat是用 Rust 和 woks 在 Windows/macOS/Linux 上写的。
# for macOS
brew install bat
bat支持大量编程和标记语言的语法高亮显示:

带 md 文件的 bat
bat集成了git,并显示了对索引的修改(见上图左侧栏)。
是一个显示代码统计数据的程序。是cloc的超快速替代。
tokei显示文件数量、这些文件中的总行数以及按语言分组的代码、注释和空白。
tokei可在 Mac、Linux 和 Windows 上使用。参见安装说明。

时惠。/输出
[exa](https://github.com/ogham/exa)是 Unix 和 Linux 操作系统附带的命令行程序ls的现代替代品。
要安装 homebrew run:
brew install exa
你可以在这个链接中找到其他装置。

示例输出

exa -T 输出

作者的 exa 快速参考
[fd](https://github.com/sharkdp/fd)是find的简单、快速且用户友好的替代品。[fd](https://github.com/sharkdp/fd)在 Windows/macOS/Linux 上工作。
要安装 homebrew run:
brew install fd
对于其他安装,请参见此链接。

图片来自https://github.com/sharkdp/fd
[procs](https://github.com/dalance/procs)是用 Rust 写的ps的替代。它创建树形视图,其输出是人类可读的格式。
你可以对多栏进行关键字搜索。procs在 Windows(实验)/macOS/Linux 上工作。
请在此找到您的系统的其他安装。
按n可以循环浏览标题,按a可以升序排序,按d可以降序排序。
# for macOS
brew install procs

procs 输出

procs -w 然后使用 n 代表下一个,d 代表降序
网站不允许你按下载次数排序,所以你可以运行这段代码来保持更新。
我用 BeautifulSoup 抓取了网站,用熊猫在 Jupyter 笔记本上创建了一个数据框。
即使 lib.rs 有自己的排名算法,我还是按下载号排序的。
import requests
from bs4 import BeautifulSoup
import pandas as pd
URL = 'https://lib.rs/command-line-utilities'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')
# find all package names
divs = soup.select('.h > h4')
names=[]
for div in divs:
names.append(div.text.strip())
# find all package downloads
metas = soup.select('.meta')
downloads=[]
for meta in metas:
if(mytitle:=meta.find(class_='downloads')):
parts = str(mytitle).split()[2].split('="')[1]
downloads.append(int(parts))
else:
# some libraries do not have downloads class
downloads.append(0)
# create a dataframe using pandas
data_tuples = list(zip(names,downloads))
df=pd.DataFrame(data_tuples, columns=['Name','Downloads'])
# sort by number of downloads
df = df.sort_values(by='Downloads', ascending=False)
df.head(20)
结果(截至 2020 年 5 月 5 日)

作者图片
有些包是针对 Rust 环境的,所以我选择了每个人都可以用于终端的包。
还有更多 Rust 驱动的命令行实用程序不在这个列表中。我希望这些实用程序对您有用。
你最喜欢的是什么?或者你很受启发,想在 Rust 中开始构建自己的命令行应用程序。
通过 成为 会员,可以完全访问媒体上的每一个故事。

请订阅。
[## 通过将 Python 转换成 Rust 来学习 Rust
Rust 基础入门教程
towardsdatascience.com](/learning-rust-by-converting-python-to-rust-259e735591c6) [## 你想学 Rust 但是不知道从哪里开始
Rust 初学者的完整资源
towardsdatascience.com](/you-want-to-learn-rust-but-you-dont-know-where-to-start-fc826402d5ba) [## Rust-Powered 命令行实用程序可提高您的工作效率
您腰带下的现代快速工具
towardsdatascience.com](/rust-powered-command-line-utilities-to-increase-your-productivity-eea03a4cf83a) [## 终端改造的终极指南
今天你将度过的最好的 11 分钟:程序员的终端提示
towardsdatascience.com](/the-ultimate-guide-to-your-terminal-makeover-e11f9b87ac99) [## 为您的数据科学项目安排任务的分步指南
macOS/Linux 中 cron 和 launchd 的完整指南
towardsdatascience.com](/a-step-by-step-guide-to-scheduling-tasks-for-your-data-science-project-d7df4531fc41)
原文:https://towardsdatascience.com/aws-and-cloud-computing-for-dummies-84525fbabd1e?source=collection_archive———28———————–

图片由 Unsplash.com 的伊恩·巴塔格利亚拍摄
这将是我关于 AWS 服务系列文章的第一篇。这将是一篇介绍性的文章,适合没有任何 AWS 或云服务知识的初学者。这篇文章旨在帮助那些刚接触云计算领域的人加深理解。本文将涵盖以下内容:
- 传统 IT 基础设施。
- 什么是云计算?
- 传统 IT 与云基础架构。
- 亚马逊网络服务介绍。
当我们登录电脑,通过谷歌 Chrome 等网络浏览器浏览互联网,访问我们最喜欢的网站,如 YouTube.com 或 Facebook.com 时,很多事情都在幕后发生。许多不同的物理和虚拟、人类和非人类组件协同工作,使用户能够访问他们喜爱的网站或服务。
对于任何组织来说,无论规模大小,当他们必须通过 internet 向用户提供对任何服务的访问时,他们需要不同的组件来完成这项工作。基于 web 的服务的传统 IT 基础架构包括以下核心组件:
- 服务器。
- 存储和数据库。
- 网络和路由。
- 操作和监控整个基础架构所需的人力和空间。
- 维护、安全和灾难恢复。
如果某个特定服务的用户数量不是很大,这种安排非常有效。但是,随着这项服务越来越受欢迎,组织不断壮大,扩展物理基础设施并始终为用户提供即时、不间断的访问成为一项艰巨的任务。以脸书为例。大约有 26 亿用户在使用这个平台。他们拥有非常大的定制数据中心,2019 年全球有 15 个,超过 180,000 台服务器,使这 26 亿用户能够稳定、不间断地访问 Facebook.com。这些数据中心的核心是上述组件,即服务器、存储、网络和劳动力。
因此,我们可以看到,并不是所有的组织都能够负担得起这么多的物理硬件、人力和运营空间来开展日常活动。
简而言之,云计算就像任何其他数据中心一样,拥有服务器、存储、网络、劳动力和空间,以及数据中心的所有其他必需品,只是不由您管理。一个受信任的独立方通过互联网将其整个基础架构借给客户,这些客户是那些负担不起内部基础架构或认为没有必要拥有内部基础架构的其他组织。
云计算是计算能力、数据库存储、应用程序和其他 IT 资源的按需交付,价格随用随付。根据您的需要访问任意多的资源,并几乎即时地调配正确类型和大小的计算资源。
云服务提供商为其客户提供传统内部 IT 基础架构中涉及的所有核心服务,以及在定价、服务可用性、扩展或缩减、安全性、维护等方面的附加服务和优势。客户通常以非常合理的成本支付他们所使用的东西,并且只需担心他们想要的基础架构类型及其虚拟部署。一切都可以通过云服务提供商提供的一些接口在互联网上访问,用户登录后只需部署他们想要的基础设施。
云服务提供商
这些年来,随着越来越多的组织放弃物理数据中心,转向云计算,云计算经历了巨大的增长。到 2020 年,前三大云服务提供商将是:
- 亚马逊(Amazon)将在 2020 年占据 60%的市场份额
- 微软(Azure)在 2020 年拥有 31%的市场份额
- 谷歌(GCP)在 2020 年占 9%
云平台的客户
在这些云服务上运行的一些受欢迎的服务是网飞、Airbnb、麦当劳、Activision、NASA、沃尔玛、福特、T-Mobile、迪士尼、高露洁、易贝、Spotify 等等。
云服务在组织中越来越受欢迎,新的创业公司围绕云服务构建他们的产品,而旧的组织迁移到云。云计算已经成为一个 10 亿美元的产业,仅 AWS 在 2019 年就赚了大约350 亿美元,并拥有超过100 万活跃用户。
让我们来看看不同的提供商正在提供什么样的云服务:
- 基础设施即服务(IaaS): 它是云计算 It 的构建模块。允许您选择所需的网络、服务器、数据库和存储空间的类型。这是构建基于云的服务的最灵活的选择,并且可以很容易地与本地 It 并行。底层基础设施仍然必须由您来管理(尽管是虚拟的)。
- 平台即服务(PaaS): 允许用户构建、管理和部署应用程序,而无需管理网络、服务器、数据库等底层基础设施。例如 AWS 弹性豆茎,Windows Azure,Heroku。
- 软件即服务(SaaS): 它是完全由所提供的服务提供和管理的完整服务。用户只需创建账户,配置和使用服务。例子包括谷歌应用程序(Gmail),Dropbox,Zoom。
下图有助于理解每种云服务向用户提供的抽象级别。

图片来自 azure.microsoft.com
现在我们知道了传统 IT 和云的组成,我们可以很容易地对两者进行比较。与建立内部数据中心相比,云平台有几个额外的好处。下表可以帮助我们理解为什么云成为大多数人的首选:

传统 IT 与云基础架构
拥有基于云的基础架构有以下优势:
- **按需付费:**无需筹集大量资金购买基础设施。仅在需要时为您使用的内容付费。降低总体拥有成本和运营开支。
- **调配合适类型的资源:**云让客户有机会在电力、存储、速度、网络等方面选择合适类型的资源,以满足其业务需求。
- **计量和自助服务:**所有的资源使用都是计量的,只对用户使用的资源付费。此外,用户可以在任何时候自己使用服务提供商提供的任何服务,而无需依赖任何第三方。
- **灵活性和可扩展性:**云环境非常灵活和有弹性。用户可以轻松地在不同种类的资源之间切换,以获得更高的处理能力,并根据他们面临的工作负载类型增加或减少节点数量。
- **高可用性和容错:**由于云是基于全球基础设施的,因此资源会在多个数据中心之间自动调配,以便在发生灾难时提供高可用性和容错能力。
- **全球部署:**客户可以在几分钟内轻松地在全球范围内部署其整个基础架构,并拥有全球业务。
- **无运营或维护成本:**客户不必担心与员工、维护、租金、电力、冷却、硬件、许可等相关的任何成本。就这些费用而言,云对客户来说是经济高效的。
当我们谈论云计算时,亚马逊网络服务(AWS) 是第一个想到的名字。AWS 是云行业云计算的开创者。在 2004 年推出只有一项服务(SQS)的时候,他们已经走过了漫长的道路。毫无疑问,AWS 是最成熟的云服务提供商,也是目前云行业的市场领导者。
拥有超过 212 项服务,包括计算、存储、网络、数据库、分析、应用服务、部署、管理、移动、开发人员工具和物联网工具。AWS 在全球运营,在 42 个国家的 84 个城市拥有 216 个存在点 (205 个边缘位置& 11 个区域缓存)。

AWS 存在点。
AWS 允许客户以非常低的成本为各种各样的行业构建高度可伸缩、健壮和复杂的应用程序。他们的按需付费定价模式大幅降低了成本,随着用户群越来越大,AWS 通过其巨大的规模经济定价策略进一步降低了成本。
AWS 允许通过构建良好的基于 web 的控制台访问所有资源。其他方法包括通过 CLI、SDK 和 API 进行访问。
AWS 提供所有三种类型的云服务,即 IaaS、PaaS 和 SaaS。AWS 的常见使用案例包括:
- 企业 IT、备份和存储。
- 大数据分析。
- 网站托管。
- 移动和社交应用。
- 游戏。
AWS 拥有 200 多种服务,至少有一种产品符合您的需求

AWS 产品。
AWS 还提供特定于领域的解决方案,您可以利用已经实现的解决方案,构建您的架构良好的应用程序

AWS 解决方案。
如果你是一个初学者,刚刚开始使用云计算,AWS 提供一年的免费层(访问以下链接)。
[## AWS 自由层
获得免费的 AWS 平台、产品和服务实践经验探索 60 多种产品并开始…
aws.amazon.com](https://aws.amazon.com/free/?trk=ps_a134p000003yHuHAAU&trkCampaign=acq_paid_search_brand&sc_channel=PS&sc_campaign=acquisition_PK&sc_publisher=Google&sc_category=Core&sc_country=PK&sc_geo=APAC&sc_outcome=acq&sc_detail=%2Baws%20%2Bfree&sc_content=Cost_bmm&sc_matchtype=b&sc_segment=444990381791&sc_medium=ACQ-P|PS-GO|Brand|Desktop|SU|AWS|Core|PK|EN|Text&s_kwcid=AL!4422!3!444990381791!b!!g!!%2Baws%20%2Bfree&ef_id=CjwKCAjw0_T4BRBlEiwAwoEiAX1iJA1meZYK6AjkcrAMD4VjvxAgliNJVdyEM7_ILiJuGyvw1rkEgxoCq60QAvD_BwE:G:s&s_kwcid=AL!4422!3!444990381791!b!!g!!%2Baws%20%2Bfree&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc)
在本文中,我们了解了传统 IT 基础架构和云服务之间的区别。什么是云计算,它相对于传统 IT 的优势和附加好处,什么是 AWS?
如有任何疑问,请随时联系我。如果你喜欢这篇文章,请关注我,获取更多令人惊叹的内容(帮助我达到我的目标 500 名追随者)。链接到我的个人资料。
[## Furqan 黄油—中等
在介质上阅读 Furqan Butt 的文字。大数据工程师,Python 开发者。让我们连接…
medium.com](https://medium.com/@furqan.butt)
谢谢,继续看:)
原文:https://towardsdatascience.com/aws-and-python-the-boto3-package-df495bb29cb3?source=collection_archive———20———————–

现在是 2020 年,云存储和计算世界很可能是未来几十年大多数企业的发展方向。拥有可扩展的存储和计算能力而无需购买物理设备的前景非常诱人。云的三大巨头是亚马逊网络服务(AWS)、微软 Azure 和谷歌云服务。
由于 Python 是最受欢迎的语言之一(在撰写本文时),所以无论您选择哪种服务,查看允许使用 Python 的工作数据工程师、数据科学家和机器学习科学家利用云的能力的包都是有意义的。微软 azure 有 Azure 包,谷歌有谷歌云包,AWS 有 boto3。本文将重点介绍 boto3。
设置它
首先,我们需要设置一些东西。AWS 确实提供免费服务,你可以免费注册。你需要一个用户名和令牌来通过后台登录 boto3,所以去 https://aws.amazon.com 注册一个免费账户吧。您还需要在您的 IDE、笔记本电脑等中安装 boto3。只需使用 pip 或 conda 安装 boto3 即可。
接下来,您需要通过 Amazon 的身份和访问管理控制台( IAM )创建一个用户。在这里,您可以添加用户、组和任何与访问相关的内容。您需要为自己创建一个角色,这样您就可以拥有一个用于凭证目的的永久授权令牌。

步骤 1:设置用户名和访问类型

第二步:设置权限(对于这篇文章,你只需要 SNS,S3,理解和 Rekognition)。确保为每个选项选择完全访问权限。如果这是一个个人帐户,你可以给自己所有亚马逊服务的完全访问权限,只需在搜索中输入 FullAccess 并选中 all。

步骤 3:添加标记(可选)—这些是键:值对,它们是用于更好控制的附加标识符
完成上述步骤后,只需确认设置,用户就会收到访问密钥 id 和秘密访问密钥。在您的本地计算机上启动 AWS 会话将需要这些。
开始会话
这是你节省时间的地方。启动会话就像打开您的 IDE 或笔记本一样简单,只需使用以下命令:
import boto3
s3 = boto3.client(‘service_name’, region_name=’region_name’,
aws_access_key_id=key,
aws_secret_access_key=password)
对于上下文:“服务名称”是您正在连接的 AWS 服务(S3、SNS、理解、Rekognition 等),区域是您正在连接的计算服务的区域。该地区很重要,因为这将决定成本。请访问 AWS 网站获取服务列表,并访问https://how to . lintel . in/list-of-AWS-regions-and-avail ability-zones/获取地区列表。只有用户拥有权限的服务才可以访问。抱歉,到目前为止,它不需要服务列表,所以你需要一次加载一个。
服务和功能示例。
S3 。AWS 的简单存储解决方案。这是创建和存储文件夹和文件的地方。这是一个非关系型的存储空间,所以它需要许多不同类型的文件。AWS 对文件夹的术语是“桶”,文件被称为“对象”。以下是 S3 的几个函数:
import boto3, login into ‘s3’ via boto.client#### create bucketbucket = s3.create_bucket(Bucket=’bucket_name’)
#### list bucketbucket_response=s3.list_buckets() #requests a list of buckets
buckets = bucket_response[‘Buckets’] #sets bucket list from Buckets key
print(buckets)
#### delete bucketresponse = s3.delete_bucket(Bucket=‘bucket_to_be_deleted’)
#### upload objects3.upload_file(Filename=’local_file_path’,
Bucket = ‘bucket_name’,
Key = ‘object_name’,
ExtraArgs= #to specify type of content (html, jpg, etc.)
#### list objects#obtain many files
response =s3.list_objects(Bucket=’bucket_name’,
MaxKeys=2 #maximum number of files to list
Prefix=’prefix_of_file_for_search’)
print(response)
#obtain single file
response =s3.head_object(Bucket=’bucket_name’, Key=’file_name’)
print(response)#### download filess3.download_file(Filename=’local_path_to_save_file’,Bucket=’bucket_name’,Key=’file_name’)
#### delete file
s3.delete_object(Bucket=’bucket_name’,Key=’file_name’)
SNS。AWS 的简单通知系统。该服务将根据管理员设置的条件向组和用户发送通知。以下是社交网络的一些功能:
import boto3, login into ‘sns’ via boto.client#### create topicresponse=sns.create_topic(Name=’topic_name’)[‘TopicArn’] #sets topic and grabs response
#### list topicsresponse=sns.list_topics()
#### delete topicssns.delete_topic(TopicArn=’full_topic_arn_value’)
#### create subscriptionresp_sms = sns.subscribe(TopicArn = topic_name,
Protocol='delivery_method,
Endpoint=’phone_email_etc’)
#### list subscriptionsresponse = sns.list_subscriptions_by_topic(TopicArn = topic_name)
subs = pd.DataFrame(response['Subscriptions']) #converts list to a df#### delete subscriptionsns.unsubscribe(SubscriptionArn=’full_sub_arn’)
#### send messages##### publish to a topicresponse = sns.publish(TopicArn = topic_arn,
Message = ‘body of message’ #can use string formatting,
Subject = ‘Subject line’)
##### sending single smsresponse = sns.publish(PhoneNumber = ‘phone_number’,Message = ‘body of message’) #can use string formatting
领悟。理解是 AWS 的自然语言处理服务。它可以确定文件是用什么语言编写、翻译和执行情感分析。这些功能如下:
#### text translatetranslate = ‘translate’ via boto.client
response=translate.translate_text(Text=variable,’string’,etc.,
SourceLanguageCode = ‘auto’,
TargetLanguageCode = ’language_to_translate_to’)
#### detecting languagecomprehend = ‘comprehend’ via boto.client
response=comprehend.detect_dominant_language(Text=variable,’string’,etc.,)
#### sentiment analysiscomprehend = ‘comprehend’ via boto.client
response=comprehend.detect_sentiment(Text=variable,’string’,etc.,LanguageCode=’language’)
重新认识。这是 AWS 的图像识别服务。它实际上在检测物体和从图像中提取文本方面做得非常好。以下是一些函数:
#### object detectionimport boto3, login into ‘s3’ via boto.client
#upload file where images are located
rekog = ‘rekognition’ via boto.client
response=rekog.detect_labels(Image=’image_name’:
{‘Bucket: ’bucket_name’, ’Name’: ’file_name’},
MaxLabels = maximum # of objects to detect
MinConfidence = set confidence level of classification)
#### text detectionimport boto3, login into ‘s3’ via boto.client
#upload file where images are locatedrekog = ‘rekognition’ via boto.clientresponse = rekog.detect_text(Image=’image_name’:
{‘Bucket: ’bucket_name’, ’Name’: ’file_name’},
MinConfidence = set confidence level of classification)
显然,有许多服务和更多的功能需要花相当长的时间来总结。这将给您一个良好的开端,并让您有机会通过 Python 探索 AWS 服务。像往常一样,这些项目的回购可以通过我的 Github 在https://github.com/Jason-M-Richards/Data-Science-Toolkit获得。
原文:https://towardsdatascience.com/aws-athena-and-glue-querying-s3-data-ce83f1ba9f9f?source=collection_archive———24———————–
在这个特定的例子中,让我们看看如何使用 AWS Glue 将 csv 文件从 S3 存储桶加载到 Glue 中,然后在 Athena 中对这些数据运行 SQL 查询。
下面是 S3 存储桶中的 CSV 文件,如下图所示——数据集本身可以从本文末尾引用的 GitHub 存储库中获得。

来源:亚马逊网络服务
爬行器用于从源中提取数据,分析数据,然后确保数据符合特定的模式——或定义表中每个变量的数据类型的结构。
定义了 crawler,并设置了数据存储、IAM 角色和调度。

来源:亚马逊网络服务
crawler 将需要一点时间来提取表,这取决于数据的大小。在这里,爬虫被安排按需运行。

来源:亚马逊网络服务
但是,也可以将 crawler 设置为按特定的时间表运行。

来源:亚马逊网络服务
当 S3 存储桶中的数据定期更新或更改时,这一点尤其重要——必须确保 Glue 中的数据保持最新。
该表现在显示在 AWS 胶中。这里,模式被自动检测。

来源:亚马逊网络服务。
但是,也可以通过选择编辑模式,然后手动定义每个变量的数据类型来编辑模式:

来源:亚马逊网络服务。
现在这个表是用 AWS Glue 表示的,让我们试着运行一些查询!
Athena 是一项 AWS 服务,允许在 S3 对数据运行标准 SQL 查询。因为已经在 Glue 中建立了模式,并且表已经加载到数据库中,所以我们现在只需要查询我们的数据。
正在分析的特定数据集是酒店预订数据集。
让我们使用一些 SQL 查询来执行以下操作:
- 从表中选择所有列,其中 Country 列下的所有条目都以字母 p 开头。
- 计算平均提前期,其中国家= 'PRT '(葡萄牙)。
- 计算平均 ADR 值,其中 Country = 'GBR '(英国),且细分市场属于直接类别。
- 最后,让我们根据国家、预订的房间类型和客户类型来订购桌子。
select * from table where country like ‘P%’;

来源:亚马逊网络服务
select avg(leadtime) from table where country=’PRT’;

来源:亚马逊网络服务
select avg(adr) from table where country=’GBR’ and marketsegment=’Direct’;

来源:亚马逊网络服务
select * from table order by country, reservedroomtype, customertype;

来源:亚马逊网络服务
这些查询也可以保存起来供以后使用。让我们保存查询 3 作为一个例子。

来源:亚马逊网络服务。

来源:亚马逊网络服务
在本例中,您看到了:
- 如何用胶水在 S3 桶中抓取数据
- 在 Glue 中编辑表模式
- 使用 Athena 运行 SQL 查询
非常感谢您的参与,相关的数据集可以在 MGCodesandStats GitHub 存储库中找到。
您还可以在 michael-grogan.com 的找到我的数据科学内容。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
原文:https://towardsdatascience.com/aws-databrew-a-new-affordable-data-prep-tool-c90841750ef9?source=collection_archive———20———————–

图片由负空间来自 Pixabay
2020 年 11 月 11 日,AWS 宣布发布 Glue DataBrew。专注于数据准备,它提供了 250 多个函数来帮助。我喜欢所有的数据,所以我检查了一下。有两种主要类型的功能,数据配置文件和转换。我将介绍设置和使用这两个特性的步骤。
[## 介绍 AWS Glue DataBrew:可视化数据准备工具,用于清理和标准化高达 80%的数据…
AWS Glue DataBrew 提供了 250 多种预构建的转换来自动化数据准备任务(例如,过滤…
aws.amazon.com](https://aws.amazon.com/about-aws/whats-new/2020/11/introducing-aws-glue-databrew-visual-data-preparation-tool-to-clean-and-normalize-data-up-to-80-percent-faster/)
总要考虑成本。每节互动课 1 美元。转换作业每节点小时 0.48 美元。最好的部分是,它完全是随用随付。这使得该工具对每个人来说都非常容易使用和负担得起,甚至是休闲爱好者。
从 AWS 控制台,假设您已经设置了一个帐户,您可以直接进入 AWS DataBrew。有一个很好的界面来分析和转换数据。第一步是创建数据集。为了这个演示,我从纽约加载了一个开放的崩溃数据集到 S3。

从这里开始—作者截图
当我把我的数据加载到 S3 时,我很高兴看到了红移和 RDS 的直接联系。我希望很快看到更多的连接。

连接到您的数据—作者截图
创建数据集后,您可以选择运行分析作业。它有一个简单的设置。您需要确定输出的位置。

数据集已创建—作者截图。

概要职务参数—作者截图
我必须创建一个新的数据 Brew IAM 策略和角色。你得到了完成这个过程所需的信息,所以还不算太糟。如果能够在同一个屏幕中创建策略和角色,那就太好了。
输入信息后,点击创建并运行作业。
数据配置文件在数据集中的前 20,000 行上运行。这花了 2 分 2 秒的时间。如果您的数据恰好在第 20k 行之后变得疯狂,它不会显示在此报告中。这是一个基本只看一眼,不能全面分析。
对于您的数字数据,将为您提供相关性。我有大部分的字符串,所以这不是那么令人印象深刻。

点击放大—作者截图。
对于每一列,都提供了基本的数据分析。这是其他工具集的典型,可能有点偏轻。

点击放大—作者截图
提供了数据沿袭视觉,其被理解为:

作者截图
数据集屏幕中的一个选项是从数据集创建一个项目。一个项目由一个“配方”组成,它是数据转换工作中的一系列步骤。这确保了更新多个数据集时的一致性。权限与您的数据集相同。

该界面允许您以网格或模式格式查看数据。我更喜欢模式显示。

网格布局—作者截图

模式布局—作者截图
你可以给你的“食谱”添加不同的步骤我在下面的列表中注意到一些有趣的。能够一键处理、区分大小写、删除特殊字符和输入缺失值非常有用。这比在 python 中设置相同的逻辑要快得多。

配方动作参考
大写 _ 大小写,格式 _ 日期,小写 _ 大写,大写 _ 大小写,句子 _ 大小写,ADD _ 双引号,ADD _ 前缀ADD _ 单引号ADD _ 后缀,EXTRACT _ BETWEEN _ 分隔符,EXTRACT _ BETWEEN _ 位置 REPLACE_WITH_EMPTY ,REPLACE _ WITH _ LAST _ VALID, REPLACE_WITH_MEDIAN , FLAG_COLUMN_FROM_NULL ,REPLACE _ WITH _ MOST _ frequency,数学函数,,文本函数,日期和时间函数,
一个很好的特性是推荐标签。对于突出显示的列,详细介绍了建议的转换。

“推荐”选项卡—作者截图
为多类别列设置一次性列是为机器学习准备数据时的一项常见任务。有几个 Python 库可以用来完成这项任务。使用这个界面更加容易。这个工具似乎有一些不适用的限制。(样本数据集超过 10 个类别)。

一键编码—作者截图
点击应用。Boom —新列。就这么简单。

点击放大—作者截图。
发布你的食谱供再次使用。好东西。

作者截图
虽然我怀疑我是否需要数据分析功能,但我肯定会使用转换“配方”作业。“随用随付”选项真正将 AWS 与市场上一些常见的大型企业数据准备工具区分开来。该工具中提供了一些样本数据集,请立即试用!

原文:https://towardsdatascience.com/aws-deepracer-the-fun-way-of-learning-reinforcement-learning-c961cde9ce8b?source=collection_archive———29———————–
最近,我参加了一个训练营,将开始我学习强化学习(RL)的旅程。这个训练营是由亚马逊网络服务(AWS)和雅加达机器学习(JML)举办的。在接下来的三个月里,我们将接受 AWS 经验丰富的代表的指导,学习和应用强化学习理念。
这将是一个令人兴奋的旅程,因为我们将使用 AWS DeepRacer 以有趣的方式学习强化学习,并带上您!

尼古拉斯·佩罗尔在 Unsplash 上拍摄的照片
我们先从了解什么是 AWS DeepRacer 开始。DeepRacer 是 AWS 将强化学习带到每个开发者手中的举措之一。这项倡议带来了一种有趣的学习机器学习的方法,特别是 RL,使用自动驾驶赛车,3D 在线赛车模拟器来建立你的模型,以及比赛。
AWS DeepRacer Evo 是一辆 1/18 比例的自动驾驶赛车,由强化学习驱动。这辆车配有左右前置摄像头,组成立体摄像头。立体摄像机可以帮助车辆学习图像中的深度信息,这些信息可用于感知和避免轨道上的物体被接近。这辆车还有一个向后的激光雷达传感器,用于检测车辆后面和旁边的物体。立体相机和激光雷达传感器的结合实现了物体回避和短兵相接的比赛。

AWS DeepRacer Evo 汽车。图片由 AWS DeepRacer 提供
作为开发人员,我们可以在 3D 在线赛车模拟器中训练、评估和调整 RL 模型。这个旅程可以从学习 RL 的基础开始。AWS 提供了易于理解的学习材料来掌握基础知识。

模型创建流程。作者图片
然后,我们可以开始在 AWS 控制台中构建、训练和评估我们的模型。为了使它更容易,我们还可以开始使用预构建模型示例。AWS DeepRacer 控制台也为我们提供了执行此类任务的能力:
- 创建 RL 训练作业,以创建具有特定奖励函数、优化算法、超参数和环境的模型。
- 选择一个轨道来训练和评估一个模型。
- 克隆一个训练模型,通过调整超参数来优化模型的性能。
- 下载部署到 AWS DeepRacer 车辆的模型,以便它可以驾驶。
- 提交一个模型到一个虚拟的比赛中,并与其他模型进行比较。
一旦我们的模型准备好了,我们就可以将模型部署到 AWS DeepRacer 的在线或离线 AWS DeepRacer 联赛中,从而有机会赢得 AWS DeepRacer 冠军杯。

约书亚·戈尔德在 Unsplash 上拍摄的照片
2020 年 AWS DeepRacer 联赛有两种比赛方式。首先是在线虚拟电路,它允许你在世界任何地方进行比赛。AWS 还提供免费等级,使您能够进行 10 小时的培训。所以你可以免费进入联盟。第二个是顶峰赛道,在这里你可以和其他车手在顶峰比赛。
今年,联盟提供了三种比赛形式。它们是头对头,物体回避和计时赛。

AWS 深赛车联盟比赛格式。作者图片
- 在面对面排位赛中,我们需要完成几圈,同时避免 AWS 机器人赛车在赛道上移动。月底,前 32 名选手将被列入淘汰名单,我们需要与其他选手展开正面交锋。
- 在物体躲避比赛中,我们需要完成赛道,同时躲避路上指定数量的障碍物。最快的赛车手将晋级争夺冠军奖杯。
- 在计时赛比赛中,我们需要在赛道上完成规定的圈数。谁跑得最快,谁就能晋级争夺冠军奖杯。
现在,让我们看看车轮后面,了解强化学习的基本概念。RL 是一种先进的机器学习(ML)技术,采用与其他机器学习方法非常不同的方法来训练模型。它的超级能力是,它可以在不需要任何标记训练数据的情况下学习非常复杂的行为,并可以在为长期目标优化的同时做出短期决策。
在强化学习中,一个代理将探索一个环境来执行任务,采取行动并产生好的结果,避免坏的结果。该模型将从经验中学习,随着时间的推移,它将能够识别哪些活动会带来最佳的回报。
这里有一个有趣的例子来解释强化学习。在实验中,给鸡的任务是只钉粉红色的纸。当小鸡钉住正确的纸时,小鸡会被奖励食物。当桌子上引入其他颜色时,挑战变得更加有趣。有趣的是,这只鸡仍然设法只盯住粉红色。

AWS DeepRacer 中的重要术语。作者图片
有几个重要术语可用于探索这些想法,并理解它们与 AWS DeepRacer 的关系:
- **代理人。**代理由需要培训的 AWS DeepRacer 车辆代表。更具体地说,它体现了控制车辆、接受输入和决定行动的神经网络。
- **环境。**该环境包含一条定义车辆行驶路线的轨道。代理探索环境以收集数据来训练底层神经网络。
- 状态。状态表示代理在某个时间点所处环境的快照。前置摄像头捕捉车辆上的这种状态。
- 动作。动作是代理在当前状态下做出的决定。对于 AWS DeepRacer,动作对应于车辆以特定速度和转向角度移动。
- 奖励。奖励是当代理在给定的状态下采取行动时作为反馈给代理的分数。在训练 AWS DeepRacer 模型时,奖励由一个奖励函数返回。一般来说,您定义或提供一个奖励函数来指定在给定的状态下代理应该采取什么样的行动。
- 剧集。一集是代理终止之前的一组过程。
在这一点上,我们将在高层次上探索如何培训 AWS DeepRacer。训练过程是一个迭代的 tass。在模拟器中,代理将探索环境并获得经验。收集的经验用于更新模型,更新的模型用于获得更多的经验。
我们将在一个简化的环境中看到这些示例,以便真正了解培训过程是如何进行的。

简化的学习过程。作者图片
在这个例子中,我们希望车辆以最短的路径从起点到终点,而不离开赛道。然后我们可以将环境简化为一个正方形网格。每个方块代表一个单独的状态,我们将允许车辆在面向目标的方向上上下移动。
我们可以给网格中的每个方块分配一个分数,以决定激励什么行为。这里,我们将轨道边缘的方块指定为“停止状态”,这将告诉车辆它已经偏离了轨道并且失败了。因为我们想让车辆学会沿着轨道中心行驶,所以我们为中心线上的方块提供高奖励,而在其他地方提供低奖励。
在强化训练中,车辆将从探索网格开始,直到它移动出界或到达目的地。当它四处行驶时,车辆从我们定义的分数中累积奖励。这个过程被称为插曲。学习将需要一些迭代,以使车辆能够获取知识。
代理人需要探索,看看在哪里可以获得最高的回报,然后才能使用或利用这些知识。随着代理获得越来越多的经验,它学会留在中央广场,以获得更高的奖励。
随着更多的经验,代理变得更好,最终可以可靠地到达目的地,并找到最高的奖励。

照片由安东·舒瓦洛夫在 Unsplash 拍摄
到目前为止,你应该已经知道什么是 AWS DeepRacer,以及 AWS DeepRacer 车辆、训练控制台和 AWS DeepRacer League 等每个组件。您还将了解强化学习的基础知识及其在 AWS DeepRacer 中的应用,包括重要术语和培训的执行方式。
- https://aws.amazon.com/deepracer/
- https://docs . AWS . Amazon . com/deep racer/latest/developer guide/what-is-deep racer . html?ICM PID = docs _ deep racer _ console
- AWS 强化学习简介
Bima 是一名数据科学家,他总是渴望扩展自己的知识和技能。他毕业于万隆技术学院和新南威尔士大学,分别是采矿工程师。然后他通过 HardvardX、IBM、Udacity 等的各种在线课程开始了他的数据科学之旅。目前,他正与 DANA Indonesia 一起在印度尼西亚建立一个无现金社会。
如果您有任何疑问或任何要讨论的话题,请通过 LinkedIn 联系 Bima。
原文:https://towardsdatascience.com/aws-glue-101-all-you-need-to-know-with-a-real-world-example-f34af17b782f?source=collection_archive———0———————–

照片由埃里卡·普列塞从派克斯拍摄
有没有想过大型科技公司是如何设计他们的生产 ETL 管道的?有兴趣了解如何无缝抓取数据的 TB、ZB 并高效解析到数据库或其他存储,以便于数据科学家和数据分析师使用吗?
在本帖中,我将详细解释(用图形表示!)使用 AWS 服务(Glue、S3、红移)的 ETL 过程的设计与实现。任何没有 AWS Glue 或 AWS 堆栈经验或接触过 AWS Glue 或 AWS 堆栈(甚至没有深入的开发经验)的人都应该很容易理解。对于那些对使用 AWS Glue 感兴趣的人来说,这篇文章可以作为一个很好的入门指南。
在开始本演练之前,让我们简要回答三(3)个常见问题:
AWS 胶水到底是什么?
使用胶水有什么特点和优势?
真实世界的场景是什么?
那么什么是胶水呢?AWS Glue 只是一个无服务器的 ETL 工具。ETL 指的是大多数数据分析/机器学习过程中通常需要的三(3)个过程:提取、转换、加载。从源中提取数据,将数据转换成适合应用程序的方式,然后将数据加载回数据仓库。AWS 帮助我们创造奇迹。AWS 控制台 UI 为我们提供了将整个任务执行到底的简单方法。不需要额外的代码脚本。
- **数据目录:**数据目录保存元数据和数据的结构。
- **数据库:**用于创建或访问源和目标的数据库。
- **表:**在数据库中创建一个或多个表,供源和目标使用。
- **爬虫和分类器:**爬虫用于使用内置或定制的分类器从源中检索数据。它创建/使用在数据目录中预定义的元数据表。
- **作业:**作业是执行 ETL 任务的业务逻辑。在内部,Apache Spark 用 python 或 scala 语言编写了这个业务逻辑。
- **触发器:**触发器按需或在特定时间启动 ETL 作业执行。
- **开发端点:**它创建了一个可以测试、开发和调试 ETL 作业脚本的开发环境。
胶水对我们有什么好处?以下是在你自己的工作场所或组织中使用它的一些优势
- AWS 使用爬虫扫描所有可用的数据
- 最终处理的数据可以存储在许多不同的地方(亚马逊 RDS、亚马逊红移、亚马逊 S3 等)
- 是云服务。内部基础设施不需要资金。
- 这是一个划算的选择,因为它是一个无服务器的 ETL 服务
- 它很快。它马上给你 Python/Scala ETL 代码。
这里有一个使用 AWS 胶水的实际例子。
一个游戏软件每天会产生几 MB 或几 GB 的用户游戏数据。从软件中收集用户生成数据的服务器每 6 小时将数据推送到 AWS S3 一次(JDBC 连接使用亚马逊 S3、亚马逊 RDS、亚马逊红移或任何外部数据库连接数据源和目标)。
我们公司希望根据用户资料预测该剧的时长。为了执行这项任务,数据工程团队应该确保获得所有的原始数据,并以正确的方式对其进行预处理。Glue 提供了 Python SDK,我们可以在其中创建一个新的 Glue Job Python 脚本来简化 ETL。代码运行在 Spark(一个分布式系统,可以使过程更快)之上,它是在 AWS Glue 中自动配置的。由于 spark,数据将被分成小块,并在多台机器上同时并行处理。
提取— 该脚本将把 S3 存储桶中的所有使用数据读取到一个数据帧中(您可以把它想象成 Pandas 中的一个数据帧)
转换— 假设原始数据平均每秒包含 10 个不同的日志。分析团队希望以特定的逻辑每 1 分钟汇总一次数据。
加载— 将处理后的数据写回到另一个 S3 存储桶,供分析团队使用。
对于项目的范围,我们将使用来自电信流失数据集的样本 CSV 文件(数据包含 20 个不同的列。数据集的目标是二元分类,并且目标是基于每个人的信息来预测每个人是否会继续订阅电信。我在这个演示中使用的数据和数据集的描述可以通过点击这个 Kaggle 链接下载。

作者照片
您需要一个适当的角色来访问您将在此过程中使用的不同服务。IAM 角色类似于 IAM 用户,因为它是一个 AWS 身份,权限策略决定该身份在 AWS 中可以做什么和不可以做什么。当您获得一个角色时,它为您的角色会话提供临时安全凭证。你可以在这里找到更多关于我的角色的信息
- 打开亚马逊 IAM 控制台
- 点击角色 → 创建角色。
- 从“*选择将使用此角色的服务”*中选择粘合服务
- 从“选择您的用例部分选择胶水
- 从附加权限策略部分选择“AWSGlueServiceRole”。
- 点击下一步:标签。将添加标签部分留空。创建角色。
- 您的角色现在可以完全访问 AWS Glue 和其他服务

作者照片
- 在亚马逊 S3 控制台上,点击创建一个可以存储文件和文件夹的存储桶。

作者照片
- 输入一个桶名,选择一个区域,点击下一个

- 剩余的配置设置现在可以保持为空。点击下一个的来创建你的 S3 桶。
- 在您的存储桶中创建一个新文件夹,并上传源文件

- (可选)在将数据加载到 bucket 之前,您可以尝试使用 python 中的几个库将数据的大小压缩成不同的格式(例如 Parquet)

作者照片
为了将数据添加到粘合数据目录中,这有助于保存元数据和数据结构,我们需要将粘合数据库定义为逻辑容器。
所以我们需要初始化胶水数据库
由于我们已经准备好了胶水数据库,我们需要将我们的数据输入到模型中。因此,我们正在尝试这样做:我们将创建爬行器,基本上扫描指定 S3 桶中的所有可用数据。爬虫自动识别最常见的分类器,包括 CSV、JSON 和 Parquet。

作者照片
- 在 AWS 胶水控制台的左窗格中,点击爬虫- >添加爬虫
- 点击蓝色的添加爬虫按钮。
- 将爬虫命名为**、并保留不变,用于“指定爬虫类型”**

作者照片
- 在**数据存储中,**选择 S3 并选择您创建的存储桶。向下钻取选择读取文件夹

作者照片
- 在**我的角色中,**选择您在上面创建的角色
- 现在将频率设置为“按需运行”。您可以随时根据自己的兴趣更改爬虫计划。
- 在**输出中,**指定您在上面创建的胶水数据库( sampledb )

作者照片
- 然后,生成一个胶水爬行器,它读取指定 S3 桶中的所有文件
- 点击复选框,点击运行爬虫运行爬虫
- 完成后,您应该会看到它的状态为“停止”。并且指定了“上次运行时间”和“添加的表”。

作者照片
- 然后,左侧窗格中的数据库 → 表让您验证这些表是否是由爬虫自动创建的。
有了最终的表,我们知道创建粘合作业,它可以按计划、按触发或按需运行。创建 Glue jobs 的有趣之处在于,它实际上可以是一个几乎完全基于 GUI 的活动,只需点击几下按钮就可以自动生成必要的 python 代码。但是,我将做一些编辑,以便综合多个源文件并执行就地数据质量验证。默认情况下,Glue 使用 DynamicFrame 对象来包含关系数据表,并且它们可以很容易地来回转换为 PySpark 数据帧以进行自定义转换。
请注意,在这一步,如果来自爬行器的数据变大,您可以选择启动另一个数据库(即 AWS RedShift)来保存最终数据表。对于项目范围,我们跳过这一步,将处理后的数据表直接放回另一个 S3 存储桶

作者照片
- 在左侧窗格中,点击工作,然后点击添加工作

作者照片
- 给起个名字,然后选择之前为 AWS Glue 创建的 IAM 角色
- 选择类型的 Spark 选择 Spark 2.4,胶版的 Python 3
- 您可以在安全配置、脚本库和作业参数的最大容量字段中编辑 DPU(数据处理单元)值的数量(可选)。
- 剩余的配置是可选的

- 从选择数据源部分选择一个数据源表。您只能选择一个数据源。

作者照片
- 给 AWS 红移增加一个 JDBC 连接。我们需要选择一个位置来存储最终处理后的数据。如果您有数据库,可以选择现有的数据库。或者你可以写回 S3 集群。对于本教程,我们将继续使用默认映射。业务逻辑也可以在以后对此进行修改。

作者照片
- 通过选择最近创建的作业名称打开 Python 脚本。点击动作- >编辑脚本。
- 左窗格显示了 ETL 过程的可视化表示。右侧窗格显示脚本代码,在它的正下方,您可以看到正在运行的作业的日志。
- 通过单击运行作业保存并执行作业。

作者照片
- 我们在运行脚本后获得历史记录,并在 S3 中填充最终数据(或者,如果我们将红移作为最终数据存储,则为 SQL 准备好数据)
总而言之,我们已经构建了一个完整的 ETL 过程:我们创建了一个 S3 桶,将我们的原始数据上传到桶中,启动 glue 数据库,添加一个 crawler 来浏览上述 S3 桶中的数据,创建一个 GlueJobs,它可以按计划、按触发或按需运行,最后将数据更新回 S3 桶。
可以做的额外工作是根据业务需求修改 GlueJob 阶段提供的 Python 脚本。
(即改进预处理以缩放数值变量)
总的来说,上面的结构将让您开始在任何业务生产环境中设置 ETL 管道。
有关学习其他数据科学主题的更多详细信息,下面的 Github 存储库也会有所帮助。它包含易于遵循的代码,让你开始解释。
- 生产中的 AWS sage maker
展示如何使用 Amazon SageMaker 及其 ML/DL 算法解决业务问题的端到端示例。 - PySpark
函数和实用程序,带有真实世界的数据示例。可以用来构建一个完整的数据建模的 ETL 过程 - 推荐系统
py torch 中推荐系统的生产级实现。克隆 repo 并通过运行“main.py”开始训练 - 自然语言处理(NLP)
Python 中几种自然语言处理方法的完整实现示例。按照学习的复杂程度排序
贤俊是一名拥有统计学学位的数据极客。他喜欢分享数据科学/分析知识。在 LinkedIn 上给他发消息联系。
参考: 【1】杰西·弗雷德里克森,https://towardsdatascience . com/AWS-Glue-and-you-e2e 4322 f 0805
【2】Synerzip,https://www . Synerzip . com/blog/A-Practical-Guide-to-AWS-Glue/《AWS 胶水实用指南》
【3】肖恩·奈特,https://towards
原文:https://towardsdatascience.com/aws-glue-amazons-new-etl-tool-8c4a813d751a?source=collection_archive———18———————–

照片由艾丽在 Unsplash 上拍摄
Amazon AWS Glue 是一个完全托管的基于云的 ETL 服务,在 AWS 生态系统中可用。它是由亚马逊 AWS 于 2017 年 8 月推出的,大约在同一时间,由于公司无法成功实施大数据项目,大数据的宣传逐渐消失。2015 年, Gartner 曾做出一个著名的预测,到 2017 年将有 60%的大数据项目失败,尽管其分析师后来声称这个数字是保守的,实际失败率可能高达 85%。
在同一份报告中,在失败背后的许多因素中,Gartner 强调,缺乏正确的 IT 和基础架构技能将是此类大数据分析项目失败背后的一个关键因素。如果我们详细阐述这一点,任何大数据项目的主要挑战之一是将来自多个来源的各种数据纳入中央数据湖或数据仓库。这通常需要实现和管理复杂的 ETL 过程,这不是一件容易的事情,并且可能成为一个失败点。因此,亚马逊 AWS Glue 在 2017 年推出不仅仅是一个巧合,而是试图通过在其云上提供 ETL 服务来利用脆弱的 ETL 市场。
在我们深入探讨 Amazon AWS Glue 之前,让我们首先了解 ETL 到底是什么,以及与之相关的挑战是什么。然后我们来看看 AWS Glue 及其特性。最后,我们将讨论构建 ETL 管道的另一种解决方案:数据虚拟化。
ETL 代表提取、转换和加载,在这个过程中,从各种来源收集数据并加载到数据仓库或数据湖的目标数据库中。整个过程的三个主要步骤是:
在此过程中,来自各种来源的数据被提取出来并放入一个临时区域。数据既可以从同类来源提取,也可以从异类来源提取。例如,您很有可能从 SQL 数据库中提取一些数据,从 NoSQL 数据库中提取一些数据用于您的数据湖。
在第一步中提取的数据通常保存在一个临时区域中,以对其进行清理和预处理,从而使来自不同来源的数据保持一致,并确保它们符合我们的目标数据库的设计。例如,在从不同国家提取销售数据时,在将数据插入目标数据库之前,将不同的货币转换成一种通用货币(如美元)是有意义的。
在这个最后的步骤中,经过清理和预处理的数据最终被加载到数据湖或数据仓库的目标数据库中。现在,您可以使用这些数据来执行分析并从中获得见解。
- ETL 已经以某种形式存在了很多年。在大数据爆炸之前,ETL 被认为是一个批处理过程,通常只需要处理同质数据。那时候事情很简单,但是现在时代变了,数据量大、速度快、种类多,而且人们越来越期望执行接近实时的 ETL。所有这些都需要非常复杂的 ETL 设计,这对 ETL 开发人员来说是一种新的挑战。
- ETL 日益增长的复杂性要求更复杂的基础设施、服务器和资源。一个大企业仍然能够负担得起投资于内部强大的服务器,但是较小的公司可能并不总是发现花费来构建强大的 ETL 服务器是容易的。
- ETL 不是奖励,而是开销。这是因为最终目标是提取报告、有意义的见解、对数据执行分析,而 ETL 只是先决条件。这份 2015 年的旧调查提到,三分之一的受访者表示,他们将 50%-90%的时间用于数据准备,以使其“为分析做好准备”。因此,矛盾的是,主要目标是执行分析的公司最终会花费更多的时间和金钱将数据提供给分析师和数据科学家。

该图显示了 AWS Glue ETL 工具的通用工作流(图片由作者创建)
正如我们在介绍中所讨论的,Amazon AWS Glue 是一个完全托管的、无服务器的 ETL 服务,可以在 AWS cloud 上使用。这里的“托管和无服务器”是指 AWS Glue 将根据需要自行处理 AWS 云上的服务器和资源供应。所以作为用户,你不需要担心基础设施部分。
让我们借助它的架构来更深入地看看 AWS Glue。
AWS Glue 架构由三个主要部分组成
- AWS 胶水数据目录
- ETL 引擎
- 调度程序
AWS Glue 在爬虫的帮助下自动浏览所有可用的数据存储,并将它们的元数据保存在一个名为 Data Catalog 的中央元数据存储库中。在实际的 ETL 过程中会用到这些元数据信息,除此之外,目录还保存了与 ETL 作业相关的元数据。
可以有一个或多个数据存储,如 Amazon RDS、Amazon Redshift、Amazon S3 和其他运行在 EC2 实例上的数据库。爬行完成后,它会创建一个来自各种来源的数据目录,并呈现一个统一的视图,可以使用 Amazon Athena 或 Amazon Redshift Spectrum 进行查询。
如果您在 Amazon EMR 上处理大数据,这个目录也可以用作 Hive Metastore。不用说,它支持所有流行的数据类型和格式,比如 CSV、JSON、Parquet 等等。
AWS Glue 利用目录信息,可以根据您的选择自动生成 Scala 或 Python 格式的 ETL 脚本。这个 ETL 脚本负责将数据从源数据源加载到目标数据源,通常是数据仓库或数据湖。您还可以根据自己的需求灵活地进一步定制。
ETL 作业可以手动调用,但是对于重复的 ETL 作业,AWS Glue 提供了调度程序,以预定的频率执行 ETL 过程。您还可以灵活地将多个 ETL 作业按执行顺序连接起来,或者在预定义的事件时触发作业。更有用的是,这些调度程序也可以从 AWS Lambda 等外部服务中调用。
在本文的开始,我们向您展示了 ETL 的挑战,所以让我们看看 AWS Glue 如何使 ETL 过程变得更加容易。
- 由于 AWS Glue 是一种云 ETL 服务,组织不必担心投资本地 ETL 基础设施。
- 即使在 AWS 云上,AWS Glue 也是完全托管的,没有服务器,一切都在后台自行处理。对于 ETL 过程,您不必在 AWS 上显式地启动任何服务器或服务。
- 作为一个云 ETL 服务,AWS Glue 对于大公司和小公司都是一个划算的选择。
- 你不需要在 ETL 过程中花费太多时间,AWS Glue 会将 ETL 代码直接提供给你。这意味着您可以更专注于直接对数据执行分析。请记住,进行分析一直是实际的目标,ETL 只是以可能的格式获取数据的必要手段。
以下是一些使用 AWS 胶水的知名公司
- 德勤
- 布鲁特
- 21 世纪福克斯
- 西门子
- 金融公司
- Woot
- 罗宾汉
- Creditvidya
如果您是一家已经在使用 AWS cloud 运行应用程序的公司,并且正在寻找 ETL 解决方案,那么您肯定应该考虑 AWS Glue,因为您已经在该生态系统中了。
然而,如果你的公司根本没有使用 AWS 云,这就不那么明确了。如果您的公司愿意投入时间和金钱从头开始构建数据湖,那么迁移到 AWS 云并在 AWS Glue 和 AWS 生态系统中的其他服务的帮助下构建您的数据湖可能是有意义的。但是这肯定不会适合所有的用例。
尽管 Amazon Glue 已经减少了 ETL 过程中所需的工作,但是让我们花一点时间退一步问另一个问题——“我们真的需要 ETL 吗?”在本文中,这个问题听起来可能有些违反直觉,但是最近市场上出现了一些新的非 ETL 解决方案。
数据虚拟化是一种从一个或多个数据源检索或查询数据的技术,而不必担心数据的底层格式。由于数据虚拟化层,这是可能的。因为您是直接从数据源实时查询数据,所以不需要执行 ETL 来将数据加载到数据仓库或数据湖中。
数据虚拟化绝对是一个游戏规则改变者,因为它消除了对 ETL 过程的需求,甚至使 AWS Glue 对于许多用例来说都是不必要的。
对于任何数据分析项目来说,ETL 都是最具挑战性的方面,如果不是失败的原因,它通常会成为一个复杂的开销。Amazon AWS Glue 通过其完全托管的 ETL 服务来帮助简化 ETL 过程。然而,对于某些用例来说,使用 Knowi 这样的 BI 工具可能更实用,它消除了使用数据虚拟化进行 ETL 的需要。
原文:https://towardsdatascience.com/aws-glue-and-you-e2e4322f0805?source=collection_archive———11———————–

在这篇文章中,我将利用 AWS (Amazon Web Service) S3、Redshift 和 Glue,介绍云 ETL(提取、转换、加载)过程中涉及的架构和实现。我的目标是从我的家用计算机中获取源数据文件,并将其中包含的数据处理成云中可用的真实关系 SQL 表。我将使用 S3 来存放源数据,红移到从该源数据派生的主机表,并将数据从 S3 文件转换和加载到红移表。首先,让我们浏览一下项目数据上下文。
我喜欢把我感兴趣的话题作为我项目的基础,这个也不例外。为了这个项目,我从 OpenDoTA API 下载了 10gb 的数据样本,其中包括超过一百万场真实 DoTA 比赛的记录。(对于那些不了解内情的人来说,DoTA 是一种流行的在线视频游戏,两队 5 人在一个战场上比赛)。我的数据由 3 大块组成。csv 文件,分别包含整体比赛数据,球员特定的比赛数据,以及由 Valve (DoTA 开发者)分配的比赛技能等级。这些信息都非常有趣,可能会用于各种统计分析,甚至可能用于一些机器学习,如果你想给一个强化学习模型添加功能,学习实际玩 DoTA。但是把它放在我硬盘上的几个本地文件里并没有太大的好处——所以让我们把它移到一个云 SQL 数据库,在那里它可以被正确地共享和查询。
我将在这项工作中使用的 AWS 服务简述如下:
S3: 亚马逊的简单存储服务(S3)是一种云存储服务,类似于微软的 Azure Blob 存储。出于几个原因,我将把 S3 作为我的数据的中转区:
- S3 根据我的需求动态扩展。虽然我的数据现在只有 10gb,但如果它是 500gb,我将需要一个新的硬盘来本地容纳它,然后我将需要迁移所有这些数据。S3 可以在几乎没有我监督的情况下存储 PETA/EB 规模的数据。
- S3 设计用于冗余和数据损坏自检。如果我所有的真实来源的原始数据都存在我的硬盘上,而我的硬盘出了故障,我就会丢失它们。S3 降低了这种风险。
- 虽然我可以把它从我的硬盘加载到 Redshift 中,但 AWS 服务开箱后就能很好地协同工作。这意味着很容易设置可伸缩的服务来加载我的数据,同时在后台维护安全性、日志和维护。
- 这模拟了现实世界的生产场景,我们可以想象一个计划的抓取作业可能会定期将新数据转储到一个公共的网络位置(S3)。我们的 ETL 作业可以根据新的或更改的文件的出现而被触发运行。
Redshift: AWS Redshift 是一个 Pb 级的数据存储服务,我将使用它来托管由我的 S3 文件中的数据填充的 SQL 表。它的很多特性(巨大的容量,机器学习优化的查询队列,等等。)目前对我来说当然有些过了,但是 Redshift 在 AWS 生态系统中起着重要的作用,并且已经成为行业标准的关系数据存储解决方案,绝对值得这个项目去研究。和 S3 一样,作为云存储服务,Redshift 在备份和维护方面提供了低开销的便利,因为这一切都是由亚马逊在幕后提供的。
Glue: AWS Glue 是这个架构的主力。它表示数据目录中我的源 S3 文件中包含的数据,并包含负责将这些数据移动到红移表中的 ETL 作业。我不仅可以使用 Glue 来定义过滤、转换和验证我的数据的作业,还可以使用类似于气流的相互依赖的作业来协调整个调度/触发的 ETL 工作流。Glue 甚至提供开箱即用的机器学习来识别数据中的重复记录。此外,Glue 是完全无服务器的——我可以使用 Glue 来运行基于 pyspark 的 ETL 作业,而不必担心如何支持 Spark EMR EC2 集群,Glue 将为我做到这一点。
1。加载 S3: 我首先将从本地硬盘上抓取的数据文件加载到 S3。这 3 个文件中最大的一个大约是整个数据集大小的 50%,所以我将首先使用 python 中的 dask 和 pandas 库来压缩它。Pandas 可以将 csv 读入数据帧,然后将该数据帧转换为 parquet,这是一种压缩文件存储系统,其中保存了内容上易于阅读的元数据。Dask 可以并行化和批处理 pandas 功能,一旦 RAM 成为一个限制,这对大型数据集来说是非常关键的。这样做可以将这个特定 csv 的大小从 4gb 减少到 800mb。

将文件插入 S3 就像创建一个存储桶、定义访问规则和用 AWS 控制台上传我的文件一样简单。由于文件读写请求将来自我自己的 AWS 帐户和同一个虚拟私有云(VPC),我不需要编辑默认访问权限。

**2。初始化胶水数据库:**为了向胶水数据目录添加数据,我首先需要将胶水数据库定义为一个逻辑容器。我把我的命名为“gluedb”。

**3。创建粘合爬虫来构建数据目录:**接下来,我需要将我的数据“摄取”到模型中。我实际上并没有在这里移动任何数据,我只是要创建几个 Glue crawlers 来扫描我的 S3 桶,并从它们找到的文件中推断出我的数据的自然格式。我将为包含我的两个 csv 文件的文件夹定义一个,为保存我的所有 parquet 分区和元数据的子文件夹定义一个。这里很重要的一点是,每个爬虫都拥有对我的 S3 存储桶的读取和列表访问权限,我可以通过附加一个正确定义的 IAM 角色来授予它这种权限。


在运行每一个之后,我的 gluedb 数据库目录被填充:

**4。为 S3 配置 VPC 端点:**因为我要将数据移出 S3,所以我需要创建一个 VPC 端点,这是一个允许传输文件的网关。我可以从 AWS 控制台 VPC 页面执行此操作,并确保与正确的子网相关联。

**5。竖起红移星团:**现在我们准备竖起一个红移星团来容纳我们的最终表。亚马逊通过控制台简化了这个过程——只要确保它和 S3 在同一个子网中。对于这个项目,我知道我的表相对来说很小,所以我将选择在 1 dc2.large 节点上托管它们,该节点带有 160gb 的 SSD。重要的是要确保我在这里附加了一个 IAM 角色,它授予适当的红移安全性和访问控制。

**6。定义 SQL 模式,创建表:**现在架构已经就绪,我可以编写实际的 ETL 过程,将数据从源文件传输到目标表中。首先,我将定义我的最终模式,并通过基于控制台的编辑器在我的 Redshift 集群上执行 SQL 查询来创建我的最终表。

你会注意到我从‘matches’和‘player _ matches’中删除了大量字段。这有两个原因。“聊天”等一些字段包含大量非结构化文本,不适合存储在 SQL 表中;如果我想让它可供查询,我需要建立一个适当的数据存储。此外,我删除的大多数字段实际上都是 json 对象的字符串表示。例如,聊天字段是 json,遵循 OpenDoTA 文档中的结构:

一个合适的解决方案是使用 pyspark 从这些字段中推断出 json 模式,然后使用它们填充一个完整的星型模式,该模式由少量维度表组成,这些维度表通过自然键和派生键连接到一组事实表。然而,对于这个项目的目的,我只是对 AWS 工作流的概念证明感兴趣,不会费心解析这些字段。
7 .**。定义粘合作业:**准备好最终的表格后,我就可以开始移动数据了。我可以通过创建胶合作业来实现这一点,胶合作业可以按计划、按触发或按需运行。创建 Glue jobs 的有趣之处在于,它实际上可以是一个几乎完全基于 GUI 的活动,只需点击几下按钮就可以自动生成必要的 python 代码。但是,我将做一些编辑,以便综合多个源文件并执行就地数据质量验证。默认情况下,Glue 使用 DynamicFrame 对象来包含关系数据表,并且它们可以很容易地来回转换为 pyspark 数据帧以进行自定义转换。我所有的 ETL 脚本都可以在这个项目的 GitHub 资源库中找到,链接在本文末尾。

运行后:

两个表都已完全填充并准备好进行 SQL 查询:


重申一下,我现在已经建立了一个过程,通过这个过程,我从自己的硬盘上加载数据,将它存放在云中,并将其转换成一对目的地事实来源表。基础云架构现在已经就绪,我可以发展和定制我的 ETL 流程,我在这里可以做的额外工作是真正生产这个数据流,这取决于我特定的分析需求。例如,通过对我的 ETL 作业进行一些修改,我可以改进这个过程,以便在我向 S3 上传额外文件时自动合并我的数据表,我还可以规范化我的目标表并包含我选择删除的字段。为了这个概念验证项目的目的,我的工作已经完成了!
我想特别感谢我的朋友兼同事斯图尔特·明舒尔,他是亚马逊网络服务的高级云架构师,他就我在这个项目中采用的总体架构和最佳实践向我提供了咨询!
Github:https://github.com/jfreds91/DEND_Capstone








