TowardsDataScience 博客中文翻译 2020(四百二十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

硬 ROC:真正理解并正确使用 ROC 和 AUC

原文:https://towardsdatascience.com/hard-roc-really-understanding-and-properly-using-roc-and-auc-13413cf0dc24?source=collection_archive---------39-----------------------

学习如何使用 ROC 曲线和 AUC 分数,而不仅仅是说*“我认为这个模型表现很好”*

本帖中使用的 ROC 图生成代码是 [dython](http://shakedzy.xyz/dython/) 库的一部分,可以在我的 GitHub 页面 找到。本帖中看到的例子也可以作为 笔记本

使用此 好友链接 即使不是中等会员也能阅读此博文

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

使劲摇(原始图片由 Nadine_Em 来自 Pixabay )

评估任何机器学习模型的预测可能是数据科学家最重要的任务,甚至可能比实际开发模型更重要。毕竟,虽然构建超级复杂的算法是最酷的事情,但不知道如何正确估计它们的输出是而不是最酷的事情。

有几种算法和工具致力于让我们更清楚地了解模型如何使用我们提供的输入(如莱姆和 SHAP),但我们很少讨论如何分析模型的输出——这正是我们今天要做的。

我们都熟悉这样一个事实,即我们在输入数据中引入了偏差,但当涉及到分类问题时,我们也会不知不觉地在输出中引入偏差。这是因为模型从来没有真正选择一个类别——它们只输出对每个类别的概率评估。然后,我们通过选择具有最高概率的一个,基于这些概率选择一个类。

虽然这很有道理,但多思考一下就会产生一个问题— 如果预测概率是有噪声的呢?嗯,事实上它们是很合理的——这意味着我们可能想要调整概率阈值,从这个阈值我们将一个类别分配给一个样本。

让我们看一个例子:考虑一个二元分类问题,其中某个样本属于目标类的预测概率是 0.53。天真地,我们将决定将此解释为样本属于目标类并输出 y = 1 。但是,如果我们怀疑预测有噪声,0.53 可能和 0.48 一样好,我们可能会决定提高阈值,只向预测概率为 0.6 或更高的样本输出 y = 1 。在这种情况下,我们的样本将被赋值为 y = 0 ,这完全改变了我们的整体预测。

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

这意味着完全相同的模型的结果可以用各种不同的方式来解释——如何解释完全取决于我们。这意味着,为了真正理解一个模型的表现,我们必须去掉我们解释输出的这个额外的层。这样做的一个非常方便的算法被称为接收机工作特性曲线,或 ROC 曲线。

ROC 曲线已经在各个领域使用了多年,1989 年 Kent Spackman 已经表明机器学习也可以从中受益。

了解 roc

ROC 图描绘了对于任何可能的阈值,给定类别的真阳性结果和假阳性结果之间的权衡。让我们看一个例子,以便更好地理解它:

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

我在乳腺癌数据集上训练的随机森林分类器的 ROC 图,其中目标类是 0 =恶性或 1 = 良性。参见 这里的

y 轴显示真阳性率(TPR),即真阳性(模型正确预测的阳性样本)数除以总阳性数 (TP/P) 。x 轴显示假阳性率(FPR) —假阳性除以总阴性数 (FP/N) 。两者都是针对 y = 1 的情况计算的,因为 y = 0 类的行为是相同的。

图上的每个点代表一个可能的阈值,以及紧随其后的相关 TPR 和 FPR。当考虑预测概率时,阈值可以在[0,1]之间变化。当阈值最大时,即 1,我们将所有样本标记为阴性。这意味着没有真阳性和假阳性,这由曲线的起点(0,0)表示。当阈值最小时,即 0,所有样本都被标记为阳性。这意味着所有阳性样本确实被标记为阳性,但所有阴性样本也被错误地标记为阳性。这与图形末端的点(1,1)相匹配。所有 ROC 曲线都从(0,0)开始,到(1,1)结束。理想模型也将经过(0,1) —这意味着存在某个阈值,其中所有阳性都被标记为阳性,但没有任何阴性被错误标记。在这种情况下,使用匹配(0,1)的阈值将产生完美的预测。

但不幸的是,模型往往不是理想的——所以我们想衡量一下与理想模型的接近程度。如前所述,两个轴都在[0,1]范围内,所有曲线都从(0,0)开始,到(1,1)结束。这意味着我们可以简单地测量曲线下的面积 AUC。最优模型将有 AUC = 1

我们可以从 ROC 图中了解关于我们模型的更多见解。注意从(0,0)到(1,1)的虚线,它代表 TPR = FPR 。这条线上的任何一点都意味着样本有 50%的机会被正确分类为阳性,也有 50%的机会被错误分类为阳性。这条线代表随机预测,匹配 AUC = 0.5 。曲线接近该线的模型表现明显不佳,没有阈值选择将改善这种情况。

如果你的模型曲线低于虚线,AUC 为0.5怎么办?嗯,这意味着出于某种原因,你的模型替代了你的类——预测正面而不是负面,反之亦然。如果发生这种情况,请仔细检查自己。

使用 ROC 曲线改进您的模型

到目前为止,我们已经讨论了从 ROC 图中可以了解到我们的模型可能的性能,但是我们真正关心的是如何使用 ROC 图改进我们的模型?

为了提高我们的准确性,我们可以使用 ROC 曲线来尝试并找到一个估计的最佳阈值(eOpT)。我最喜欢的方法是找出曲线上哪个点最接近理想点(0,1),并使用其对应的阈值。

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

我在乳腺癌数据集上训练的随机森林分类器的 ROC 图,其中目标类是 0 =恶性或 1 = 良性。曲线上标出了估计的最佳阈值 0.71。参见 这里的

在上面显示的示例中,通过简单地将预测阈值调整为 0.71 而不是默认的 0.5,模型的准确性提高了 1%。自己看。很简单,不是吗?

多类分类的 ROC 曲线

到目前为止,我们只讨论了二元分类,其中只存在一个类(或者两个,但这是一回事)。当我们面对一个多类分类问题时会发生什么?

当面对许多类别时,我们以一对一的方式单独计算每个类别的 ROC 曲线:所有其他类别都被认为是负面例子,只有被检查的类别被认为是正面的。这产生了每个类别的不同 ROC 曲线。此外,计算整个分类器的微观和宏观 ROC 曲线很有用,只是为了看看它的整体性能(不确定什么是微观和宏观平均值?下面是 StackExchange 的数据科学论坛上的 精彩解说

让我们看看这是什么样子:

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

在 Iris 数据集上训练的 SVM 分类器的 ROC 图,其中存在三个不同的类别*。显示了每个类别的估计最佳阈值。参见* 这里的

在这种情况下,调整阈值变得有点棘手。我是这样处理的:

if prediction_probability[2] >= 0.53: predicted_class = 2
elif prediction_probability[0] >= 0.46: predicted_class = 0
elif prediction_probability[1] >= 0.27: predicted_class = 1
else: predicted_class = prediction_probability.argmax() # fallback

这变得很棘手,因为一些示例可能无法通过这些阈值中的任何一个(例如:【0.34,0.16,0.50】,这就是为什么需要选择最高阈值的原因),而一些示例可能会通过多个阈值(例如:【0.49,0.50,0.01】,这意味着 if/else 顺序很重要)。但是一旦你做对了,准确度就提高了——我的 SVM 分类器的准确度在以这种方式重新调整阈值后提高了 2.2%。

最后的话

在这篇文章中,我们讨论了从输出端引入到分类模型中的偏差,通过天真地将预测解释为标签,而没有考虑它们可能的噪声。我们已经看到 ROC 曲线如何让我们更好地估计我们的模型,去除我们添加的额外偏差,以及我们如何修正该偏差以更好地拟合模型。

如果你想拓宽你对 ROC 曲线的知识和理解,我强烈推荐阅读汤姆·福塞特的论文ROC 分析简介。我只能希望这个新工具能让你的模型表现得更好——并且你喜欢这篇文章。注意安全,用力摇!

直观解释硬统计和数据科学概念

原文:https://towardsdatascience.com/hard-statistics-and-data-science-concepts-visually-explained-de7325c2e9ef?source=collection_archive---------17-----------------------

我收集的最佳视觉学习工具。

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

来源:星夜——梵高

作为一名视觉学习者,我经常发现,如果不在脑海中想象一些复杂的概念可能是什么样子,就很难消化这些概念。研究表明,65%的人是视觉学习者,这意味着视觉学习比其他方式更快更有效。这也解释了为什么我们会在独白课上很快入睡,而在浏览 Instagram 时却保持清醒!

那我们为什么不试着把更多的视觉元素带进我们学习统计、数学和数据科学的方式中呢?我真的相信,我们都可以从它带来的新直觉和新观点中受益,这也更容易和更长久地留在我们的记忆中。

在这篇文章中,我想和你分享我收集的一些有用的资源,这些资源可以帮助你。

*更新 2021:你也可以在我的 Youtube 频道观看下面这篇整篇文章的视频版本📹。

1.直观解释——Setosa 项目

直观地解释是一个旨在使难以理解的想法变得直观的项目。你可以在这里找到各种数学和统计概念的直观解释:从普通最小二乘回归到特征向量,到主成分分析和马尔可夫链。最棒的是,你可以直接与可视化互动,改变参数来检查发生了什么。我是一个从来没有真正理解特征向量的人,直到我看了这个网站的解释!

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

来源:http://setosa.io/ev/

2.沉浸式数学

沉浸式数学是一本非常棒的关于线性代数的互动书籍。据说这是世界上第一本完全交互式图形的线性代数书。这本书包括 10 章,解释线性代数的所有基础(向量,矩阵,线性映射,特征向量和特征值等。).你可以在网上阅读这本书。请注意,你应该在浏览器上阅读,而不是在手机上,因为有些插图可能会呈现得有点慢。

3.3 蓝色 1 棕色频道

3Blue1Brown 是格兰特·桑德森(Grant Sanderson)创建的一个 Youtube 频道(老实说,这个频道的名字太拗口了,我一直记不住)。我认为这个频道非常有名,有 200 多万订户。你可以找到非常有用的视频和动画来解释各种各样的数学和统计主题。当我试图找到一种方法向我的同事解释 DNN 反向传播算法时,我找到了他的频道。他关于这个主题的视频也非常有帮助。

4.决策树直观解释

我遇到了这个伟大的 d3 可视化解释决策树如何使用滚动告诉工作。这是我第一次看到试图用讲故事来教授机器学习的可视化。而且看起来酷毙了!该网站还有另一个解释模型调整和偏差-方差权衡的帖子,这是每个有抱负的数据科学家都应该知道的另一个基本概念。

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

来源:http://www.r2d3.us/visual-intro-to-machine-learning-part-1/

5.如何有效地使用 t-SNE

t-SNE(t-分布式随机邻居嵌入)是一种非线性降维技术,特别适合于高维数据集的可视化,因为它可以将数据维数降低到基本上 2 或 3 维。这个视频distilt网站上的一个帖子,对于任何想要更深入地了解机器学习算法背后的直觉的人来说,这是另一个有用的来源。

该可视化显示了 t-SNE 算法对于数据中不同类型的模式的工作效率:

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

来源:https://distill.pub/2016/misread-tsne/

6.可视化算法

Mike Bostock 有一个好玩的网站,用于可视化各种计算机科学基础算法(采样、洗牌、排序等。).对我来说,看到这些画面非常鼓舞人心。即使是那些你可能认为理所当然的事情,你仍然可以通过从不同的角度来看待它们,从而学到一些新的东西。

7.视觉理论

视觉理论是另一个关于概率和统计的交互式视觉介绍,由丹尼尔·库宁在布朗大学读本科时创建。它目前包括六章:基本概率,复合概率,概率分布,频率干扰,贝叶斯干扰和回归分析。每章包含互动练习,以帮助形象化和理解信息。

谢谢你看我的帖子。我希望你能找到新的有用的东西。如果知道类似来源,请评论分享!享受学习:)

机器学习最难的部分?交流。

原文:https://towardsdatascience.com/hardest-part-of-machine-learning-communication-1b2a3bd68a7e?source=collection_archive---------34-----------------------

为了确保你的机器学习项目通过商业审查——确保你很好地沟通它。

一天,我们为我的一个客户建立了一个随机森林模型,可以预测任何用户的生命周期价值。和大多数模型一样,我们意识到沟通是关键。

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

优 X 创投Unsplash 上的照片

从一开始就沟通

好的,首先,沟通从来都不是事后的想法。实际上,您希望从一开始就将您的模型传达给涉众。问题是,建立生产化的机器学习模型是一个非常耗时的过程。而且,你需要利益相关者 100%的认同。否则,相信我,你的模型想法,类似于被鹈鹕吞食的小海龟,会很快死去。

“你的模型做好了吗?”(真诚地,利益相关者)

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

照片由 s tock123 在 Unsplash 上拍摄

建立一个具有可接受误差指标的强大模型需要几个月的时间。你猜怎么着?—这是一个很长的时间要求。利益相关者会追问你的进展,并想知道你的时间是否能得到更好的利用。

先做最重要的事情—确保首先有一个非常可靠的模型推介和使用案例。有一个 MVP 的概念——它代表“最低价值主张”就模型而言,MVP 是一个经过训练的基本模型,它以某种数据格式给出一些预测。

因此,确保以增量的方式交付您的模型。请不要为一个算法构建复杂的自动化管道,除非你已经交付了一些更基本的东西。不求完美。将有形的数据呈现在利益相关者面前,从而让他们体验他们可以利用这些数据做的所有事情。这为你接下来的步骤赢得了越来越多的支持。

或者,涉众可能意识到数据对他们没有用,他们理所当然地终止了项目。这将确保你不会在一个没人关心的模型上工作——这可能很有趣,但会毁了你在一家公司的职业生涯。

我需要一个模特吗?

求求你,求求你——一定要做好做模型的成本收益分析。我知道,作为数据科学家,我们对执行机器学习项目所涉及的复杂性和学习感到兴奋。但是,一定要认识到,机器学习模型的收益必须足够大,以证明建立一个完整的机器学习模型所花费的大量时间是合理的。所以,一定要寻求最简单的解决方案。首先避免机器学习解决方案,看看是否有更简单的解决方案就足够了。只有当问题很重要,没有机器学习无法解决时,你才着手进行机器学习项目。

沟通障碍

当利益相关者听你说话时,他们脑子里只有一件事“这如何影响或关系到我的业务?”因此,相应地调整你的信息。此外,业务利益相关者没有你所拥有的技术背景,所以这里是你对随机森林算法的详细解释——“bla bla Lala la bla bla bla Lala bla Lala bla”。

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

照片由 Unsplash 上按顺序拍摄

那么,这是否意味着完全不谈模型,只陈述模型的误差?不,我们的目标是从模型中抽象出来,让任何人都能理解。举例来说,有两种解释重力的方式——你可以写出所有的物理方程,或者说“这是一种当我们放下东西时使它们落下的力”。选择容易的一个。

我们是如何做到的

好了,我已经说够了该做什么不该做什么。这就是我们所做的。

我们意识到利益相关者并不太关心我们所使用的算法的本质。因此,我们省略了细节,用抽象的术语讨论了模型。

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

我们内部使用的指标

我们团队内部使用的误差指标是 RMSE。然而,RMSE 的想法对利益相关者来说有点复杂和难以理解。此外,我们在用户层面建立了模型,但随后我们将其扩展到真正精细的群组中。因此,我们选择了一个不同的、更适合利益相关者的指标。

我们选择的标准是实际值与预测值的百分比差异。然后,我们会观察误差在不同人群中的分布。然而,在内部,作为一个团队,当我们调整模型时,我们使用 RMSE 作为我们试图最小化的指标。但是,当我们与利益相关者交谈时,我们展示了一个不那么吓人的、更合适的百分比差异指标。

而且,因为 RMSE 是一个更敏感的误差指标,无论我们做什么来降低 RMSE,都会降低队列百分比差异的下游指标。

哈龙·乔德里:民主化人工智能扫盲

原文:https://towardsdatascience.com/haroon-choudery-democratizing-a-i-literacy-f81b7a624191?source=collection_archive---------92-----------------------

技术创新系列

为任何人采访人工智能的联合创始人

人工智能领域的创新已经彻底改变了多个行业的工作。CNN 的一篇文章称,人工智能的成长创造了历史上最大的“人机协作”。这些新技术的创造和先前发现的新应用已经开始在各行各业创造“利基工作”。随着美国约 16%的工作处于自动化边缘,以及 2025 年人工智能市场蓬勃发展的 900 亿美元规模估计,人工智能显然是未来的发展方向。

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

图片由哈龙·乔德里提供

然而,伴随这些创新而来的是跟上当今急剧变化的技术格局的压力。在企业和个人层面,个人都需要采取必要的步骤来利用和最大限度地发挥人工智能的潜力。特别是在新兴国家和边缘化社区,工作替代和收入差距扩大等社会后果的风险更加突出,跟上技术进步和掌握数据对于防止个人落后至关重要。

哈龙和他的团队为任何人创造了一种人工智能,让个人拥有知识和技能,以适应这个不断变化的世界。相信一个对人工智能有更好理解的社会将更有能力设计一个“所有人公平繁荣的未来”,人工智能为任何人创造了大量的资源,旨在提高个人对人工智能的总体理解,并学习必要的技能,以便在人工智能的未来发挥更积极的作用。

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

图片由哈龙·乔德里提供

Amber: 你能告诉我们一些你的背景吗?
**哈龙:**我目前是人工智能公司的联合创始人&执行董事,也是科莫多健康公司的数据科学家。此前,我曾在包括脸书、马克·库班公司和德勤在内的机构担任过各种角色。

我也是一名自豪的移民和第一代大学毕业生,拥有宾夕法尼亚州立大学经济学学士学位和加州大学伯克利分校信息和数据科学硕士学位。

你一直都知道在科技行业工作是你想做的吗?是什么激励你从事人工智能职业,并为任何人开创人工智能?
H: 我从小就一直对科技感兴趣。虽然我的家庭在我童年的大部分时间里没有电脑,但我总是想办法接触技术,无论是走到 J 大道上的布鲁克林图书馆玩电脑游戏,还是在高中时在易贝玩手机,以便购买最新最棒的智能手机。我在大学第一年就开始编写代码——不是因为我的课程要求我这么做——而是因为我很想知道如何为小企业建立和销售网站。

“现在,我们有机会防止数百万人经历同样的命运。我们不会让学生和员工被技术的快速变化弄得措手不及,而是让他们能够积极主动,在感觉不到被倾听时大胆直言。”哈龙·乔德里

我对人工智能的兴趣是在大学期间发展起来的,主要是通过流行文化对该技术的引用而激发的,包括像《终结者》和《前任玛奇纳》这样的电影。随着我对当今人工智能的现状以及围绕其潜在未来后果的各种理论了解得越来越多,我对涉足该领域变得越来越感兴趣。

在加州大学伯克利分校的研究生学习期间,我在那里学习数据科学和机器学习,我越来越意识到人工智能即将产生的社会影响,以及我们社会的大多数成员,特别是那些在服务水平低下的社区的成员,面对这种影响时是如何毫无准备。具有讽刺意味的是,服务水平低下的社区无法获得比更有特权的社区更多的人工智能教育资源,但却最容易受到自动化的负面影响,包括失业。作为一名移民,他的父亲从事过各种劳动工作——出租车司机、拖车司机和家禽饲养者——作为一名科技工作者,我有机会看到围栏的两面,并发现双方之间的差异令人深感不安。

2017 年,我为任何人创立了人工智能,以帮助白领社区和服务不足的社区之间建立知识桥梁,了解他们对人工智能的理解。

你为什么认为让更广泛的公众了解人工智能很重要?简单地说,越多的人理解人工智能的基本原理,我们在塑造技术轨迹的讨论中就会听到越多的声音。重要的是,我们听到的声音来自各行各业,以便我们的集体声音尽可能具有包容性。

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

图片由哈龙·乔德里提供

A: 你为任何人创办 A.I .时面临的最大挑战是什么,你是如何克服的? H: 对我们来说,最大的挑战是(坦率地说,仍然是)说服那些为大部分得不到充分服务的学生提供服务的学校了解对人工智能教育的迫切需求。这些学校有一系列独特的挑战,很难偏离他们既定的课程。

根据我们对人工智能的观察,对于任何人来说,阻止这些学校教授人工智能的两个最大障碍是 1)时间和 2)人工智能知识。我们减少这些限制的方法是尽可能容易地让非技术人员在短时间内教授人工智能的基础知识。在运营的头几年,这意味着在不到一个小时的时间里开发一个涵盖人工智能基础知识的 AI 101 演示,并免费前往学校举办研讨会。

“我们的目标是确保每个人都对人工智能和自动化技术有一个基本的了解,在这个任务完成之前,我们不会放慢脚步。”哈龙·乔德里

现在,我们的重点是通过我们的向任何人教授人工智能工具包来扩展我们的人工智能 101 演示的交付,该工具包旨在使教育工作者能够在不到一个小时的时间内向其他人教授我们的人工智能 101 演示——不需要事先了解人工智能。除了这种“横向方法”,我们还采取了一种“纵向方法”,即在我们的 AI 101 基础上创建研讨会,例如特定行业的研讨会。

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

图片由哈龙·乔德里提供

任何人的人工智能旨在“为个人提供知识和技能,以跟上这个不断变化的世界”。任何人的人工智能如何实现这一使命,与 2017 年你首次成立该组织时相比,你实现这一目标的方法有什么变化?人工智能经常被认为是一个模糊的话题,我们努力改变这种情况,让更多的人感到有权表达他们的想法和意见,以帮助塑造技术的未来。

我们已经创建了几个渠道,通过这些渠道,我们的观众可以接触到人工智能的世界,包括我们的入门研讨会、我们的双周简讯、我们的播客以及其他等等。

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

图片由哈龙·乔德里提供

**答:**对于其他有志于发展职业生涯并在行业中产生积极社会影响的数据科学家,你有什么建议?
H: 我给数据科学家(以及一般的科技工作者)的最大建议是,尽你所能意识到你的工作对代表性不足的社区的影响。作为技术人员,你比普通人更有权力和特权去影响变化。如果你有能力的话,你可以也应该放大那些被忽视的人的声音。

我们的读者怎样才能和人工智能扯上关系呢?你可以申请成为人工智能的志愿者

通过面对面的人工智能基础研讨会接触到 1,500 名学生,超过 50,000 名与会者参加了他们的虚拟研讨会,A.I. For Anyone 正在引领人工智能扫盲的民主化。人工智能不仅仅是人工智能教育的可靠来源,它还为任何人铺平了在技术时代走向更公平、更无障碍的世界的道路。

[1]来自 A.I. For Anyone 网站的数字和统计数据https://aiforanyone.org/
【2】https://aiforanyone.org/about-us/
【3】https://www . LinkedIn . com/pulse/dire-need-ai-education-haroon-choudery/

特别感谢 Haroon Choudery 让我在这个系列中采访他,也非常感谢 TDS 编辑团队对这个项目的支持。

你认识一位鼓舞人心的技术专家,你希望他出现在这个系列中吗?你是否正在从事任何你希望我写的很酷的数据科学和技术项目?欢迎给我发电子邮件,向 angelamarieteng@gmail.com 寻求意见和建议。感谢阅读!

参考文献:

“(9)对人工智能教育的迫切需求| LinkedIn。”n.d .于 2020 年 6 月 13 日进入。https://www . LinkedIn . com/pulse/dire-need-ai-education-haroon-choudery/。

"草根人工智能非营利组织在疫情向 30,000 名观众提供虚拟工作室|新闻专线."n.d .于 2020 年 6 月 13 日进入。https://www . news wire . com/news/草根-ai-非营利-delives-virtual-workshop-to-30000-viewers-21135771?_ ga = 2.40633573.676169680.1588000445-525467245.1587748007&_ GAC = 1.19205772.1588000451 . eaiaikobchmivpkr 0 fki 6 qivxtsch0 q 5 alaeaayasaaegj 93 VD _ BwE。

"认识一下人工智能公司的联合创始人哈龙·乔德利吧."n.d .于 2020 年 6 月 13 日进入。https://medium . com/@ haroonchoudery/get-to-know haroon-choudery-a-I-for-any one 联合创始人-abb6bb9ff4df。

“家——任何人的人工智能。”n.d .于 2020 年 6 月 13 日进入。https://aiforanyone.org/.

“关于我们——任何人的人工智能。”n.d .于 2020 年 6 月 13 日进入。https://aiforanyone.org/about-us/.

“人工智能革命来了。让员工为此做好准备是企业的责任——CNNn.d .于 2020 年 6 月 13 日进入。https://www . CNN . com/2019/05/30/perspectives/ai-business-jobs/index . html

哈利·波特与深度学习实验

原文:https://towardsdatascience.com/harry-potter-and-the-deep-learning-experiment-7b312d4b03c0?source=collection_archive---------44-----------------------

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

对于每个字符,模型查找嵌入,以嵌入作为输入运行 GRU 一个时间步长,并应用密集层来生成预测下一个字符的对数似然的逻辑。

三年前(那时教 RNNs 生成文本很酷),我有了用哈利波特的书训练张量流模型的想法。这个项目在我的清单上,它在追逐我。

这个周末我终于做到了,还做了一个简单的 Streamlit 应用程序供你玩模型:https://share . Streamlit . io/santiviquez/Harry-Potter-rnn/app . py

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

简化应用程序。代号:https://github.com/santiviquez/harry-potter-rnn

一些生成的文本

哈利坐在了哈利读书时去看的楼梯旁边。

“很抱歉,你的血腥,男爵先生,斯内普的课就在你的脸颊上,波特,否则我不会比达力更糟糕。达力去过几次图书馆;他吞下了许多刚刚结束的新问题。

让我来吧!不要害怕!别进入我们的第一周。再见。”

弗雷德和乔治·韦斯莱第一次试图阻止格兰芬多,这件事一直像弗农姨父一样困扰着他。他很难信守诺言。他默默地递过来。他一定不想告诉哈利?”

哈利听到了小铜币的声音,猫头鹰猛扑过来,把报纸掉在海格的身上,海格扑在报纸上,在他半信半疑伏地魔会回来的时候,设法通过了考试。

“什么是巫师决斗?”哈利和罗恩说。

正如你所看到的,大多数句子都没有意义,但它们都是由计算机生成的,这是令人印象深刻的部分。

这不就是把文字重新编排一下吗?

没有。让我们看一个学习过程的例子来理解为什么。

这些是模型生成的一些文本。

时期 1: 在第一时期(在整个数据集上的完全训练),我们看到看起来只是随机的字母和字符。

sngns yiiy I rad yit se ke sery Ro, "udGct touveid. samtd ccift, the. fpe gincy lindos ys Towe feeng beunat 
)X h so-int rines Hufons nsmtheis anmin f oideyhend wrratt hit le therf arerre he fo ke thomecAg voutud unfed fow suk rond thet 
macughilg wares thirstof hy youMl hed folh,

akfdjaf


sdjkfaksfkla

“kajdsfkjasfka”

`fkgksjdfkjsfkjsdfsd`

sngns yiiy I rad yit se ke sery Ro, "udGct touveid. samtd ccift, the. fpe gincy lindos ys Towe feeng beunat
)X h so-int rines Hufons nsmtheis anmin f oideyhend wrratt hit le therf arerre he fo ke thomecAg voutud unfed fow suk rond thet
macughilg wares thirstof hy youMl hed folh,


` ` akjshfkjlahfkjhd

akjshfdjkadsf `'

**纪元二:**和以前差不多。

“Mald sined ro fastrong orryfe frourd hot’dilg trimt wa thin ware ne bamly oue ntho feringseps thag catkirgen tu hime baicf sait yoveece way yonerbyedene nomt thaney an’thing ve fuba carpouflit Serofy,” saided one whizciof Harr wiole, I it the pie pevainigrofle pors


在这里,我们看到了一些进步。它正在学习如何创建段落,它还学习了如何正确拼写罗恩,而且它几乎做到了赫敏。另一个有趣的事实是,它知道每个段落都需要以句号结尾。

daven lack a grivert He mad eets plaiced. The inares, ruther Inard in brigt tuffing a to kinares**.**"

"Haw do get brousl purny to seize whis with hem looking by. We’s if ge**.**

"Haryy, you, wande – recatbladred got Herwione, and Harry ando, him some wich nover Durn Ron. Ho said abeary own exard to ke to nextsen, mowned megrmings**.**


**Epoch 10:** 它**学会了拼斯内普、哈利、达力和赫敏!**

Harry fast roy winged and same forward that Snape heard fat looked at all. Small not about is but he didn’t makber, wh they furged him.

"It’s going to lim, I’ll never thought that Curse for dong tone ach ins other, could poney. Harry flocked Dudley this if he soll that Hermione had be before wouldn’t meville. 'veryto his rrom – and he stop its head. I’ve reed Lonnem. Snape was gonew like Harry’s gettid himmered in elor without hair.


注意,在第二段中,它学会了如何正确使用引号(正字法)。

Neville had been hand stretching to watch as Harry sped straight at Snape – she didn’t even noticed in tim again. After burning all the letters, he was made difficult by Fathers s had been waiting noise and the sheets a hote there, with right dewild!"**“But what’s only shop.”**Harry nodded, but stopped quickly, because it made different time was protected wherever he went.


所以它基本上试图复制 J.K .罗琳的写作风格和基调。

# 这是如何工作的

理解这是如何工作的最好资源之一是安德烈·卡帕西 2015 年的博客文章[。我将冒昧地使用他的一个例子。](https://karpathy.github.io/2015/05/21/rnn-effectiveness/)

假设我们的整个词汇由四个字母组成: **h** 、 **e** 、 **l** 、 **o** 。我们把文本分成长度=4 的块,我们想在序列“hello”上训练我们的 RNN。

在这种情况下,我们的输入序列是“hell ”,目标序列是“ello”。因此,给定最初只有一个单独的“h”的上下文,模型将猜测下一个单词可能是“e ”,然后给定前两个字母是“h”和“e”的上下文,模型将猜测第三个字母是“l ”,依此类推。

前面所有字母之间的关系有助于预测下一个字母。RNN 记住每个序列的所有这些关系。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c39647b2af5f38842497233ee6c2501f.png)

[https://karpathy.github.io/2015/05/21/rnn-effectiveness/](https://karpathy.github.io/2015/05/21/rnn-effectiveness/)

要了解更多关于 RNNs 的信息,我真心推荐 Karpathy 的博客文章,如果你想建立自己的教程,这个 [TensorFlow 2 教程](https://www.tensorflow.org/tutorials/text/text_generation)是一个很好的资源。

【1】:[https://www.tensorflow.org/tutorials/text/text_generation](https://www.tensorflow.org/tutorials/text/text_generation)

我想告诉你,我推出了一个数据科学问答游戏,通常会在面试中出现问题和答案。想了解更多关于这个 [**在 twitter 上关注我**](https://twitter.com/santiviquez) 。

# 《哈利·波特》系列丛书和同人小说——词汇分析

> 原文:<https://towardsdatascience.com/harry-potter-books-fanfiction-an-analysis-of-words-cfa29ee28d1a?source=collection_archive---------74----------------------->

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/0a79450ce67f113235f86172f12a1f00.png)

# 背景

5 月 28 日,[r/dataisbeautiful](https://www.reddit.com/r/dataisbeautiful/comments/gs4me1/oc_word_cloud_comparison_between_user_comments_on/)上的一个帖子启发我自己学习如何制作文字云。作为一个超级哈利波特迷,我要用的数据是显而易见的。使用这些书似乎太简单了,所以我决定从 Fanfiction.net 的[搜集 250 个故事,并根据这些数据制作一个单词云。我发布了](http://fanfiction.net/)[我在 r/dataisbeautiful](https://www.reddit.com/r/dataisbeautiful/comments/gtxzx8/oc_frequently_occurring_words_in_top_250_harry/) 上的第一次尝试,基于我收到的反馈,我决定写这篇博客。

[完整的源代码(数据文件&输出文件除外)可在此处获得](https://github.com/haideralipunjabi/harrypotter-analysis)

# 尝试 1

我可以采用许多方法来准备数据。由于我的网速慢且不可靠,我决定先下载故事,然后在本地文件上进行处理。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/15c00a6509081a38f507e0a57092bf4e.png)

## 刮痧同人小说

我使用简单的 Python + BeautifulSoup 组合从[Fanfiction.net](http://fanfiction.net/)那里收集故事。我根据他们最喜欢的数量对故事进行了分类,并筛选出超过 10 万字的故事。([链接到网址](https://www.fanfiction.net/book/Harry-Potter/?&srt=4&r=10&len=100&p=1))。我刮了前 10 页,(每页有 25 个故事),结果是 250 个故事。我总共花了 10 个小时(第一天 7 个小时,第二天 3 个小时)才把所有的故事都写完。

## 处理数据

从[原始帖子](https://www.reddit.com/r/dataisbeautiful/comments/gs4me1/oc_word_cloud_comparison_between_user_comments_on/)中得到启示,我使用 nltk 对故事进行了标记,并从 nltk 英语停用词语料库中删除了常用词。这是我第一次尝试这样做,最初每个故事花了 3-4 分钟。经过一些优化后,我能够将每个故事的时间减少到 1-2 分钟。我和一个朋友谈了这个问题,他建议我试试多处理。添加多处理后,我有了在两个 CPU 上分配负载的想法(我的笔记本电脑和一个 Raspberry Pi 4B)。我把剧本和 25%的故事复制到 Pi,开始工作。

*附加提示:* [*屏幕*](https://www.geeksforgeeks.org/screen-command-in-linux-with-examples/) *是通过 SSH 做长时间工作的好工具*

我花了一个小时来处理。如果我需要删除更多的单词,我不想再次进行处理,所以我决定将词频数据存储到 json 文件中。(对未来很有帮助)

## 制造单词云

我看了一下 [wordcloud Python 包](https://github.com/amueller/word_cloud),从它的例子中复制代码生成 wordcloud。

为了制作蒙版图片,我从网上下载了一些图片,用 Inkscape 修复。

## 反馈

在 Reddit & Twitter 上发布了第一次尝试后,我收到了很多反馈。其中常见的问题是为什么达芙妮更频繁,为什么罗恩更少(我稍后会回答这两个问题),建议删除更多的单词,更多地关注与哈利波特相关的单词,并显示一些其他的可视化,特别是比较书籍和同人小说的可视化。

# 尝试 2

## 查找更多停用字词

在我的第一次尝试中,我使用了 nltk 英语停用词语料库,它只有 179 个单词。我搜索了一个更大的列表,最终使用了一个定制的 20,000 个最常用单词列表,来自[Google-10000-English repository](https://github.com/first20hours/google-10000-english)。定制是什么?我不得不从 20k 列表中删除一些单词(如魔法、魔法、魔杖、结界、吸血鬼等)和一些名字(哈利、罗恩、弗雷德、亚瑟等),这样它们就不会从我的分析中删除。将第一次尝试的处理结果存储到 json 文件中,使我避免了再花一个小时进行处理。我只是从每个数据文件中删除了必要的键。

## 哈利·波特系列丛书

我还从网上的某个地方下载了这 7 本书的文本版本,对它们进行了一些清理,并应用了与同人小说故事相同的过程来生成它们的数据。利用这些数据,我能够比较同人小说和佳能小说中一些单词的出现。既然我有了数据和代码,我决定也制作它们相应的单词云。

# 尝试 2 的可视化

## 前 250 位同人小说中的高频词

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e7d0e07fecfb1b163e73799134247dd8.png)

## 每本书或每个故事中单词的平均出现频率

同人小说中出现频率最高的 20 个单词

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ce20e87ebdb49f8409d024e3a4d1a0e1.png)

《哈利·波特》系列中出现频率最高的 20 个单词(不包括同人小说中的前 20 个)

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/77ac29b5ceba0c26b4b884806b0c8c50.png)

# **重要结果**

**达芙妮是谁?为什么她在同人小说里这么受欢迎?**

> 赫敏的名字被叫到。她颤抖着和安东尼·戈德斯坦、格雷戈里·高尔、以及 ***达芙妮·格林格拉斯*** *一起离开了密室。已经测试过的学生后来没有回来,所以哈利和罗恩不知道赫敏做得怎么样。*
> 
> *- >哈利波特与凤凰社*

达芙妮·格林格拉斯在佳能中几乎不存在,对同人小说作家来说是一张白纸。在正典和大多数同人小说中,她是阿斯托利亚·格林格拉斯(另一个几乎不存在的实体)的妹妹,后来成为德拉科·马尔福的妻子。在同人小说中,她通常是斯莱特林的一员,因为她的野心&狡猾&而不是因为她是一个纯血统的超级怪物。她的家人被描绘成浅色或灰色,支持“波特勋爵”。她是独立哈利故事中很受欢迎的一对。

她是一个性格方面的空白,这对于那些想写一个 OC 而不想明确提及的作家来说是一个福音。

[解释达芙妮·格林格拉斯及其受欢迎程度的视频](https://www.youtube.com/watch?v=4mSD-GAmz1I)

## 罗恩怎么了?

罗恩几乎是达芙妮的对立面。JKR 把罗恩写得如此漂亮,以至于许多同人小说作家都写不出一个好的罗恩。在佳能,罗恩是有缺陷的,但也非常有趣,勇敢和忠于他的朋友。在同人小说中,尤其是哈利与正典非常不同的地方(独立、超能力、哈利波特等),哈利通常会忽略罗恩(如果在霍格沃茨之前分开的话),或者作者大量抨击罗恩,以证明哈利破坏他们的友谊是正当的。

# 额外的可视化

## 7 本佳能书籍:

**魔法石**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e4dbce7e9e33f6aa87eb5fde6b8438b0.png)

我试着用 9 又 3/4 英寸的图像。奇洛和拉环这个词在本书中出现频率很高,在以后的书中会失去频率。

**密室**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e05cbf756da37fd1fb13d2804a5b3353.png)

我用了自由精灵多比的照片。像多比、洛克哈特(我讨厌那个家伙)、聚合汁、蛇佬腔、曼德拉草、泥巴种这样的词会在这本书里出现。

**阿兹卡班的囚犯**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/132c79592417cd1d67a2cb232bded7e9.png)

我使用了尖头叉子的形象(詹姆斯的活点昵称,和阿尼马格斯的形式。哈利的守护神)这本书。像鲁邦、小天狼星、小矮星、摄魂怪、克鲁克山、守护神这样的词开始出现。

**火焰杯**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/71b2159f809b8b0960ba48f22eb6bef7.png)

我试着用三强奖杯的图像。像塞德里克、布斯巴顿、克劳奇、德姆斯特朗这样的词开始出现。

**凤凰社**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/cb578fcba3aa1008f043f7fc746bd1b1.png)

试图用凤凰的形象。乌姆里奇在这本书里很受欢迎。

**混血王子**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2b5d4dad2303c25b35059f0cc78f0633.png)

我在这本书里使用了混血王子的图像。除了通常的,斯拉格霍恩是本书中最常见的词。

**死亡圣器**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/191b95edb8853af5ac84c7e140b665e1.png)

为此,我使用了死亡圣器的图像。你会看到“魔杖”因为“老魔杖”而变得非常常用。圣器,斗篷,魔杖制造者出现。还有,拉环又回来了。

# 未来计划

我打算在未来刮 AO3 做一些更多的分析。我也可能从其他流行书籍中创造一些其他的单词云。

# 参考:

1.  [wordcloud Python 包](https://dev.to/haideralipunjabi/harry-potter-books-fanfiction-an-analysis-of-words-1hi7)
2.  [nltk](https://www.nltk.org/)
3.  [r/HPFanfiction](https://www.reddit.com/r/HPfanfiction)
4.  斯内普,斯内普,西弗勒斯·斯内普——音乐视频

[在我的博客上读这篇文章](https://blog.haideralipunjabi.com/posts/harry-potter-books-fanfiction-an-analysis-of-words/)

# 人工智能的进步已经嘎然而止了吗?

> 原文:<https://towardsdatascience.com/has-artificial-intelligence-progress-ground-to-a-screeching-halt-babd1a580f66?source=collection_archive---------18----------------------->

## 还有希望让它重新加速吗?

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d617a25bf48aa98cb9c0bbbb3483bcbf.png)

[https://images.app.goo.gl/4VCmrSEiri3LkGbVA](https://images.app.goo.gl/4VCmrSEiri3LkGbVA)

我们刚刚进入 2020 年,这个世界看起来并不像拥有飞行汽车和机器人女佣的杰森一家。随着周围所有关于人工智能接管我们的生活,用机器人取代我们的谈论和炒作,我们应该都失业了,无家可归了,但我们没有。

为什么?

根据 OpenAI 的一项研究,人工智能训练中使用的计算能力每 3.4 个月翻一倍。这是一个巨大的,几乎不可能的加速度,标准级数是不习惯的。

计算中使用的一个概念称为摩尔定律,它估计计算能力每两年翻一番,上述计算产生的结果是摩尔定律的七倍。

**七次!!!**

OpenAI 认为,人工智能需要将计算能力提高 30 万倍才能利用这项技术。这种趋势是不可持续的,人工智能的进步正因此受到打击。研究表明,计算能力越强,人工智能系统的性能就越好。

由于计算能力的实际限制,人工智能的发展受到了阻碍。OpenAI 指出,简单的物理学将限制用于驱动和训练人工智能系统的芯片的潜在效率。

那么,这是否意味着人工智能将很快在某个时候完全停止发展?也许除非研究人员发现绕过这一限制的新方法。下面我们来看看几个潜在的突破性发现。

> “这种发展速度是不可持续的,如果你看看顶级实验,每年的成本都会上涨 10 倍。现在,一项实验可能要 7 位数,但不会达到 9 或 10 位数,这是不可能的,没人能负担得起。”詹姆斯·派森提,脸书人工智能的负责人。

# 量子计算

所有的计算机都依靠一种基本的能力来存储和处理单个比特的信息。这些位是使用 0 或 1 编码的长字符串。量子计算机使用更小的量子比特。它们基于一种叫做叠加的原理运行,这种原理允许同时处于多种状态。

那么,这对 AI 有什么影响呢?

标准计算机可以使用 0 和 1 来执行计算,而量子计算机的优势是通过叠加使用 0、1 和量子位来同时进行计算。

所有的大玩家都在利用量子计算的力量,他们相信这是解决当前人工智能局限性的未来。谷歌甚至宣布,它已经实现了“量子优势”,开发了一种能够解决标准计算机需要 10,000 多年才能完成的计算的量子处理器。

亚马逊宣布了一项提供量子计算服务的计划,类似于它提供亚马逊网络服务的方式。

这两家公司都可能代表着人工智能克服当前限制和能力的潜在进展。有朝一日,人们可能会在人工智能机器中发展出像真人一样思考、感受和行为的能力。诚然,我们离人类的这种反应还很远,但这并非不可能。

# 元学习

这个概念最初是由唐纳德·b·莫德斯利在 1979 年描述为一个过程,在这个过程中,学习者意识到并越来越多地控制他们已经内化的感知、探究、学习和成长的习惯。

换句话说,学习者学习他们如何学习。他们适应新环境,并通过一些培训实例学习新技能。实现这一点的三种最常见的方法是:

1.学习有效的距离度量。(基于公制)

2.使用带有外部或内部存储器的循环网络(基于模型)

3.显式优化模型参数以实现快速学习。(基于优化)

适应过程发生在测试过程中,但是对新任务配置的暴露是有限的。适应的模型在学会如何学习后,在运行多次后将完成新的任务。

任务可以是任何明确定义的机器学习问题,包括监督学习和强化学习。

一个好的元学习模型应该在各种学习任务上进行训练,并在任务分配上进行优化以获得最佳性能。每个任务都与包含特征向量和真实标签的数据集相关联。

# 结论

人工智能在进步方面开始放缓,需要一种新的方式来保持跳跃式增长。缺乏足够的计算能力是人工智能受到阻碍的主要原因之一。脸书人工智能负责人 Jerome Pesenti 告诉《连线》杂志,深度学习在可以扩大规模并给予更多操作空间时效果最佳。他还理论说,人工智能和机器学习的发展即将‘碰壁’。

我们之前讨论的两种有前途的技术被视为解决这个问题的最佳方案。量子计算将增加计算能力,比标准计算机能进行更多的计算。元学习将通过自学新技能或快速适应新环境来使人工智能变得更聪明。这些潜在突破中的任何一个都将改变人类的游戏规则。我们只能等着看哪一种能够被开发出来,并提供最好的机会来解决世界上最大的问题。

# 对数据科学的兴趣已经达到顶峰了吗?

> 原文:<https://towardsdatascience.com/has-interest-in-data-science-peaked-already-437648d7f408?source=collection_archive---------65----------------------->

## 数据科学相关主题的 10 年搜索兴趣趋势分析:增长最快的领域、增长模式和相关性。

自从 2009 年我用谷歌趋势预测我的国家的全国选举结果以来,我对人们可以从谷歌趋势中获得的洞察力非常着迷,这一预测比所有令人尊敬的民调都要准确得多。仅仅工作了一个小时,我就发表了一个预测,它比盖洛普和其他人花费更多数量级的资源产生的预测更符合观察到的结果。

我现在再次召唤谷歌趋势的力量,通过使用过去十年的搜索兴趣趋势作为代理,来了解数据科学领域的情况。这些数据用于检查以下问题:

*   自 2010 年以来,人们对数据科学的兴趣增长有多快?
*   数据科学中发展最快的子领域是什么?
*   兴趣已经见顶了吗?领域已经停滞了吗?
*   时间线上的关键转折点是什么?
*   对一个子领域的兴趣是否与其他子领域或对数据科学的一般兴趣相关联,或者它们或多或少是独立的?

如果这些听起来像是你想了解更多的问题,请继续读下去。分析中的子领域/子主题如下:数据科学、大数据、人工智能、深度学习、机器学习、强化学习、人工神经网络、商业分析、异常检测、A/B 测试(*详见技术说明 1*)。

# 总体趋势和相对兴趣

首先是土地的基本情况。由于 Google Trends 只允许同时比较 5 个术语,我将 10 个主题中的 9 个分成两个,将它们分组,这样趋势就可见了。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/dedb39a9bf0ff53a48ce3e2676acb0ca.png)

**图 1** ( [数据来源](https://trends.google.com/trends/explore?date=2010-05-05%202020-06-05&q=Artificial%20intelligence,%2Fm%2F0jt3_q3,%2Fm%2F01hyh_,%2Fm%2F0bs2j8q,%2Fm%2F0h1fn8h))

有几个观点是显而易见的。早在 2010 年至 2011 年,对**“人工神经网络”**主题(未显示)的兴趣高于图表中显示的所有五个主题,但它早在 2012 年就被取代,现在与**“人工智能”**的兴趣水平相同。对“人工智能”的兴趣,在**“深度学习”**面前,也逐渐被其余所有人超越,除了这个街区的最新小子。**‘大数据’**最早成为一个东西是在 2011 年。它在四年后的 2015 年达到顶峰,但现在处于下降趋势,并被**“机器学习”**(自 2017 年起)和**“数据科学”**(自 2019 年起)超越。值得注意的是,对“数据科学”和“深度学习”的兴趣在 7 年前几乎不存在,因为它们只是在 2013-2014 年才开始受到关注。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/cb42324b2070e61519c0b51cc24b174a.png)

**图 2 (** [数据源](https://trends.google.com/trends/explore?date=2010-05-05%202020-06-05&q=%2Fm%2F02q3c56,A%2FB%20testing,Reinforcement%20learning,%2Fm%2F026vnz3) **)**

在图 2 所示的相对兴趣较低的层中,事情远没有那么疯狂。“业务分析”、“a/b 测试”和“异常检测”都显示出或多或少的稳定增长。“强化学习”在这个群体中是一个温和的异常值,因为它似乎遵循“机器学习”的增长趋势。

**在整个 10 年期间**“机器学习”和“大数据”是最受欢迎的,但到了 2020 年,“数据科学”已经取代“大数据”位居第二。

# 2010-2020 年增长最快的数据科学术语

下面的图 3 结合了所有 10 个主题,以检查随时间推移的增长率(单击查看完整尺寸)。与前两个图不同的是,这个图中的趋势并没有进行相互比较,以便对增长率进行比较。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/51daf0724bea7dace5af713f4cc0ac1a.png)

**图 3**

总的趋势很明显——人们的兴趣全面增长,一些子领域比其他领域增长更快。值得注意的是,即使是非常相关的副主题也在不同的时间点出现,并在整个时间序列中显示出非常不同的增长率。

进一步分析后,有两个子领域脱颖而出。所有十个术语相对于 2010 年 6 月的**增长率**的比较(下图)显示,到目前为止**增长最快的是术语**、【数据科学】和【深度学习】**。**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8b0603d691d9dd6e6c9cca64a03a83d5.png)

**图 4**

如果我们将峰值与起点进行比较,这种增长甚至更令人吃惊:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c68dc5756e6265a67616bbc2c7935913.png)

**图 5**

这当然部分是由于它们的起点非常低,这两个术语在 2010 年不存在,不仅相对于它们的峰值,而且相对于分析中的所有其他术语也是如此。当我们考虑到它们出现在地图上*(也见图 8)* 的时间有多晚时,这些术语也是**增长最快的**。无论是由于更容易获得的大数据,还是由于使高科技工具的访问民主化的软件的激增,还是由于来自上面的自动化压力,对深度学习和数据科学的兴趣在过去十年中迅速增长,甚至与其他高增长主题相比也有很大差距。

# 我们对数据科学的兴趣达到顶峰了吗?

对搜索兴趣增长趋势的研究将有助于回答这个问题。粗略分类为**极端增长**区域(超过四倍增长)和**高增长**区域,结果如下两张图:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/cd88e223d8da35d569afcb51b303e833.png)

**图 6**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c2eb7db0260a23a53f75e2ea38144993.png)

**图 7**

图 6 显示了“大数据”在 2011 年至 2013 年的惊人增长后,人们的兴趣如何下降。其他术语已经几年没有增长了,只有“商业分析”和“数据科学”看起来可能会有更大的增长。然而,两者都经历了 2020 年 2 月的峰值和随后的显著下降。有理由问这是否是对数据科学的兴趣高峰,如果是,我们是否会看到兴趣在这些水平上保持一段时间,或者它是否会像“大数据”一样进入缓慢下降。

图 8 显示了“数据科学”和“深度学习”的另一个明显的爆炸式增长,甚至相对于其他非常高的增长术语。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/f0c822a5b805e0aa71483755f5e68ed1.png)

**图 8**

这个数字表明,近年来人们对“深度学习”的兴趣缺乏增长。同样显而易见的是“数据科学”快速增长趋势的中断。基于这些数据,我的结论是**“是的,我们很可能已经到达顶峰】**。

# 数据科学子领域的相关性如何?

当我检查趋势线时,我发现它们显示的相关性比我预期的要小得多,因为这些搜索词在直觉上是紧密相关的。一些领域比其他领域发展更快,而且时间也不同。

我决定运行一个相关性分析来更正式地检查这些关系或缺乏这些关系。使用一阶差分对原始搜索兴趣数据进行去趋势化,得到一个平稳序列。最初,我使用皮尔逊相关系数,并注意到一些系数在 0.6-0.7 范围内。经过进一步的检查,这些被证明主要是由于离群值。由于这种关系也可能是非线性的,我决定使用肯德尔的τ等级系数,而不是皮尔逊的。这些方法对异常值更具鲁棒性,可以捕捉任何类型的单调关系,而不仅仅是线性关系(*见技术说明 2* )。肯德尔的 tau 有点不太强大。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4efbcf765fa01c78b3e1816959ec83c9.png)

相关性是使用[这个相关系数计算器](https://www.gigacalculator.com/calculators/correlation-coefficient-calculator.php)计算的,我已经编码了它,它也提供了附带的统计数据。许多相关性的 p 值非常小,95%的置信区间非常窄,表明真正的关系。

由此产生的相关性矩阵表明,不同主题的搜索兴趣并不像人们预期的那样密切相关。**最大相关性为 0.56,介于“深度学习”和“机器学习”之间**。其他几个在 0.4-0.5 范围内,但大多数更低。

似乎**“机器学习”与所有其他搜索主题关联度最高**,而“商业分析”关联度最低。“数据科学”显示了全面的正相关性,但与“机器学习”相比,这些相关性略弱。对“人工智能”的搜索兴趣与其他人的相关性较低,对“强化学习”的兴趣也是如此。其余的显示系数大多在 0.2-0.4 范围内。

# 外卖食品

在过去十年中,数据科学主题显示出令人印象深刻的兴趣增长。“数据科学”和“深度学习”尤其在 2010 年至 2020 年间呈现出惊人的增长水平。在短短的几年时间里,它们从几乎不存在到成为搜索兴趣方面的领先主题。

也就是说,似乎对大多数数据科学主题的兴趣已经达到顶峰。对一些人来说,高峰早在 2015 年,而对另一些人来说,则更早。虽然我们可能会在 2020 年的剩余时间里看到复苏,但 2013 年建立的“数据科学”快速增长的趋势肯定会被打破。

相关性分析发现,人们对大多数子领域的兴趣与最高相关系数约为 0.5 的相关程度一般。这表明数据科学领域非常多样化,每个子领域或多或少都有自己的生命,有自己的辉煌和衰落时期。

*技术说明:*

1.  这种比较基于可用的研究领域和主题,以及 Google Trends 没有相应主题或研究领域的三个搜索词。这一选择是在检查了搜索词和相应的研究领域或主题的数据在趋势和相对兴趣方面没有显著差异后做出的。
2.  如果您不熟悉肯德尔系数及其与其他相关系数的关系,[请查看此表](https://www.gigacalculator.com/calculators/correlation-coefficient-calculator.php#pearsonvsspearmanvskendall)以及下页的 tau 系数公式和解释。

# 美国的进步达到顶峰了吗?

> 原文:<https://towardsdatascience.com/has-progress-in-america-peaked-9421f2e10a56?source=collection_archive---------56----------------------->

## 衡量过去一个世纪身体、个人和国家的发展

我最近看到了《纽约时报》发表的一篇引人注目的数据可视化文章。作者试图证明一个观点,即男子速度滑冰的表现已经达到顶峰,更广泛地说,在其他奥运会项目中也是如此。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/dd26b2ac6038e2fec7cef5d3051e9e3b.png)

来源:[纽约时报](https://www.nytimes.com/interactive/2018/02/10/opinion/this-is-peak-olympics.html)

这让我思考……这一发现仅仅在纯物理指标上成立,还是在其他领域也成立?我们哪里接近了进步的极限,哪里还有成长的空间?

一个困难的问题是如何衡量进展——什么是正确的衡量标准?作为一个社会,我们(或我们应该)重视什么,以至于认为这一指标的增长是进步?按季度来看,GDP 被视为衡量美国经济增长的指标,但我们应该只从金融角度来衡量自己吗?

这些指标还需要有充足的历史数据,并以一致的尺度进行衡量(例如,国家统计数据中的财富或人均通胀调整)。几经周折后,三个总的进度指标及其相关数据点是:

**国家发展**

*   *生产率*(每小时实际产量)
*   *财富*(2010 年人均国内生产总值美元)
*   *幸福感* (人类发展指数)
*   *健康*(每 10 万人口年龄调整死亡率);

**个人发展**

*   *智力*(平均。完成学校教育的年数)
*   *财富*(2018 年 CPI 调整后的家庭收入中位数,美元)
*   *幸福感*(自我报告的幸福感)
*   *健康*(预期寿命);

**身体发育**

*   *实力*(奥运铅球)
*   *速度*(奥运百米冲刺)
*   *耐力*(波士顿马拉松获胜英里数)
*   *爆发力*(奥运跳远)

除了身体发育之外,这些指标只关注美国,我们假设美国参加的奥运会的身体发育趋势代表了美国。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ef196386f133a41a232c47e452c41499.png)

[Tableau 仪表盘](https://public.tableau.com/profile/jordan8097#!/vizhome/ProgressDashboard/Progress)

数据显示,12 个指标中有 7 个(~60%)已经见顶(以显著放缓或停止的历史积极势头来衡量)。有趣的是,达到峰值的指标主要是个人的。在 7 个稳定指标中,6 个是个人或身体发展指标,只有 1 个是国家统计指标。亲自查看[这个 Tableau 仪表盘](https://public.tableau.com/profile/jordan8097#!/vizhome/ProgressDashboard/Progress)中的数据,让我知道你的想法。

# 物理显影

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/58d29bdaadd4564b5c8a63bf924a7b32.png)

[奥运数据来源](https://www.kaggle.com/jayrav13/olympic-track-field-results);[波斯顿马拉松](https://en.wikipedia.org/wiki/List_of_winners_of_the_Boston_Marathon)

身体发育旨在衡量我们是否看到顶级运动员的力量和速度持续增长。我们比以前更强更快了吗?我们有更好的耐力和爆发力吗?

> 百米短跑冠军是<1% faster in 2016 than 1968\. Between 1920 and 1968 — the same length of time — there was an 8% improvement.

Most physical metrics reached their peak between 1970–1980, as shown by the light blue bar in the above graph. While the 100-Meter Dash had two record performances in 2008 and 2012, the winner in 2016 was only 0.09 seconds, or 1%, faster than the winner in 1968\. For comparison, the winner in 1968 was ~8% faster than the winner in 1920, a similar 48-year time span.

The Long-Jump gold medal winner in 1980 reached a distance of 8.54 meters; the Gold medal winning distance in 2016 was 8.38 meters, a decrease of ~2%. In the Boston Marathon, once the 5-minute mile was eclipsed, little additional progress has been made since 1980\. Strength, as measured by the Shot Put, remains the only area that has continued to progress after a brief slump from 1980–2004.

# Personal Development

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/b8c13ae0e8e32e2c96bc6c151609364d.png)

Source for [教育](https://www.census.gov/topics/education/educational-attainment/data.html);[HH 收入中位数](https://www.census.gov/data/tables/time-series/demo/income-poverty/historical-income-households.html);[自我报告的幸福感](https://gssdataexplorer.norc.org/trends/Gender%20&%20Marriage?measure=happy);[预期寿命](https://data.oecd.org/healthstat/life-expectancy-at-birth.htm)

个人发展衡量一个国家的每个人是否在进步。接受教育和完成教育的人数是否在增加?人们挣得更多吗?他们更快乐,活得更久吗?

> 与 1999-2008 年相比,2008-2017 年完成教育的增长率下降了 50%以上。

大衰退前后,一些指标出现了有趣的拐点。从 1950 年到 2008 年,以预期寿命衡量的健康水平稳步增长,但自那以后一直顽固地停留在略低于 79 岁。

同样,受教育年限在 2008 年达到 13 年后,仅增加了 0.2 年;在前十年,这一数字增加了 0.5 岁。

GSS 的一项调查显示,受访者自称“非常幸福”或“非常幸福”,这一比例从 1972 年的 83%上升到 1990 年的 92%;此后再也没有回到那个水平,2018 年是 87%。

家庭收入经历了一个坎坷但稳定的上升轨迹。这一数字在经济衰退期间有所下降,但一直达到更高的峰值。

# 国家发展

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/1ba0e9a11a30dcdbaa3c832593e1ac63.png)

来源为[每小时实际产出](https://fred.stlouisfed.org/series/OPHNFB?utm_source=series_page&utm_medium=related_content&utm_term=related_resources&utm_campaign=categories)、[人均国内生产总值](https://fred.stlouisfed.org/series/NYGDPPCAPKDUSA)、[人类发展指数](https://ourworldindata.org/human-development-index)、[年龄调整死亡率](https://www.healthsystemtracker.org/brief/measuring-the-quality-of-healthcare-in-the-u-s/)

国家发展是衡量国家总体上是否进步的一种方式。人们在生产更多的商品吗?这个国家正在增加财富和改善公共卫生吗?人们的生活水平正在提高吗?

自 1950 年以来,美国在这一领域持续发展,几乎没有放缓。每小时实际产出、人均 GDP 和人类发展指数(旨在通过健康、教育和生活水平衡量人类发展的指数)都出现了稳步持续的上升。

唯一变平的指标是年龄调整死亡率,这表明我们可能正在达到当前医学促进更长寿、更健康生活的上限。

尽管个人的进步指标停滞不前,但整个国家仍保持着活力和增长。

我们已经调查了美国是否——以及在哪里——达到顶峰,但是一个没有答案的问题仍然存在。缺乏增长通常被认为是负面的——是吗?如果人类可以用 9.5 秒而不是 9.81 秒跑完 100 米,这是不是推动了人类的进步?

总的来说,美国人比以往任何时候都更健康、更富有、更长寿、生活水平更高。数据不可否认地表明这是一个事实,即使在过去几十年里进步是渐进的。

已经达到顶峰或正在达到那个水平的领域是不会阻碍我们作为一个社会的界限。平均而言,13 年以上的教育是一项了不起的成就,代表着自 1950 年以来增加了 5 年的教育。我们不应该强迫每个人都去读学位课程;这表明我们现在让普通公民从高中毕业,让他们选择自己的下一条道路。

那么,美国已经见顶了吗?和大多数数据一样,答案是肯定和否定的。个人进步指标在很大程度上已经达到了一个平台期,但这个平台期是在大多数美国人受过教育、身体健康、财务稳定的情况下出现的。

我希望听到您对判断进度的正确指标的反馈,以及您对仪表盘中数据的[解读。](https://public.tableau.com/profile/jordan8097#!/vizhome/ProgressDashboard/Progress)

# 使用 Matplotlib 地理图、条形图和折线图探索新冠肺炎的 NYC 311 投诉数据

> 原文:<https://towardsdatascience.com/has-quarantine-made-you-hate-your-loud-neighbors-these-charts-certainly-imply-it-c760e999a04b?source=collection_archive---------68----------------------->

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e2492dcbfc4a5459ac0a066df0bcc66e.png)

2020 年 2 月至 5 月的投诉

## 数据新闻

## 看起来隔离区让我们很多人讨厌我们的邻居!

从 3 月到 5 月的纽约市 311 投诉数据表明,隔离让我们有更多的时间生邻居的气——同时,我们中的许多人通过播放音乐来保持理智。

如果你不知道什么是 311 电话,你可以在这里阅读。从消防栓漏水到吵闹的邻居,你可以打电话投诉或通知城市几乎任何事情。

在将数据读入 Python 后,我从数据透视表开始,然后是条形图比较。

pivot = df.pivot_table(index=“Descriptor”, columns = “Borough”, values = “Unique Key”, aggfunc = “count”)
pivot = pivot.sort_values(by=[‘BRONX’],ascending=False)
pivot.iloc[:10,:5].plot(kind=“bar”, figsize=(10,10)).set(title=“Number of Complaints by Type and Borough”, ylabel = “Count”)


以下是 2019 年 1 月至 2020 年 5 月各区最常见的投诉:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/46d3e376e0c1b50c73c0542c6d54cd18.png)

对于那些喜欢更多的数据空间视图的人,我创建了一个地图。这只是地图图像顶部的散点图,使用`BBox`匹配边界。

descriptors = [“Loud Music/Party”, “Loud Talking”,“Social Distancing”,“Banging/Pounding”]
plot_df = df[df[“Descriptor”].isin(descriptors)]BBox = ((df.Longitude.min(), df.Longitude.max(),
df.Latitude.min(), df.Latitude.max()))#map from openstreetmap
ruh_m = plt.imread(r’C:\Users\Andrew\Documents\Python Scripts\Medium Charts\NYC Open Data\StreetMap.png’)

fig, ax = plt.subplots(figsize = (10,10))
sns.scatterplot(x = plot_df[“Longitude”], y = plot_df[“Latitude”]
, hue = plot_df[“Descriptor”], alpha = 0.2, ax = ax,zorder = 10,
size = 0.1)
ax.set_title(‘Plotting Complaint Data on NYC Map’)
ax.set_xlim(BBox[0],BBox[1])
ax.set_ylim(BBox[2],BBox[3])
ax.imshow(ruh_m, zorder=0, extent = BBox, aspect= ‘auto’)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/57f4c88e6d96ab60b17ce445985cb0e2.png)

底图来自 [OpenStreetData](https://www.openstreetmap.org/export#map=11/40.7048/-73.9744)

同样的想法,但使用趋势线,显示每个区的需求:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4df3c5da768df0fa2d9dace3ba4f6a1a.png)

我使用 7 天移动平均线来平滑大多数图表上的线条

这条趋势线实际上非常接近苹果的移动数据,然而,由于我们无法直接与 2019 年进行比较,我们无法得出任何结论。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3c070e25f051e490f313e750c3cd50b6.png)

[https://www.apple.com/covid19/mobility](https://www.apple.com/covid19/mobility)

下面我们可以看到自纽约市开始隔离以来的最高投诉-这肯定是周期性的,但仍高于 2019 年!

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/f132ae6600ce91797fe1372587819c89.png)

有趣的是,随着流动性的增加,社交距离电话减少了

我马上想到这是因为我们都呆在家里,所以我希望人们拨打 311 的时间分布更加均匀。

以下是 3 月份之前按投诉类型划分的来电趋势:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8bec82d689fc73089619d6c5d6ded6b6.png)

这是同一个图表,但使用的是 3 月到 5 月的数据:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/9523cd497a1fe067550cc09b99b97005.png)

它似乎保持大致相同的形状,但是从中午到午夜有更多的呼叫开始。我对此的解释是,人们通常在中午 10 点左右醒来,可能是听着邻居的音乐。

那么现在谁更喜欢聚会呢?

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/935dc5c9380d4cea7b790505ee5cf8b5.png)

仅 2020 年 3 月至 5 月的数据

不过,这可能是因为大多数人已经离开了曼哈顿和布鲁克林的部分地区——所以我对这张图表持保留态度。

在结束之前,让我们看一下我想探究这些数据的主要原因,看看现在与隔离前相比,服务请求是否需要更长的时间。

为了创建“关闭时间”列,我减去了原始数据集中的“关闭”和“创建”日期列。

df[“time to close out”] = df[“Closed (Date Only)”] - df[“Created (Date Only)”]
df = df[pd.notnull(df[“time to close out”])]
df[“time to close out”] = df[“time to close out”].dt.dayspivot = df.pivot_table(index=“Created (Date Only)”,
columns = “Borough”, values = “time to close out”, aggfunc = np.mean)
pivot = pivot.rolling(7).mean()
pivot.iloc[:,:5].plot(kind=“line”, figsize=(10,10)).set(title=“Days to Close Out Complaint”, ylabel = “Days”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ea48aec621c3cae58820dd290aefe49d.png)

令我惊讶的是,自从去年 9 月达到峰值后,解决投诉的时间一直在稳步减少。我们可以看到 3 月初有一点点增长,但很快就下降了。

按一天中的小时检查结算时间会给出以下两个图表:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/dca7672b542a9dbfff1bcea40789de79.png)

在隔离之前,不知道史坦顿岛凌晨 3 点会发生什么

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2678f5e82a45d6d371d74083c717054a.png)

3 月至 5 月期间

同样,趋势变化不大。我相信那是好事!

这篇文章引起你的共鸣了吗?如果是,你是打 311 的人还是吹音乐的人?

*(如果想自己探索数据,可以从* [*这里*](https://data.cityofnewyork.us/Social-Services/311-Service-Requests-from-2010-to-Present/erm2-nwe9) *导出 csv)。要创建这些图表,请查看我的*[*GitHub repo*](https://github.com/andrewhong5297/NYC_Open_Data)*。数据列比我在这里选择的要多得多!)*

# 招聘不是一直都是断的吗?

> 原文:<https://towardsdatascience.com/hasnt-hiring-always-been-broken-91a2adfb721c?source=collection_archive---------33----------------------->

## 以及为什么新的人工智能招聘创业公司会失败

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/85c4171ac147e3d7139ba647001c54aa.png)

承蒙[thinknum.com](https://media.thinknum.com/articles/massive-increase-in-demand-for-data-science-jobs-in-2019/)

四年前,我加入了一家名为 Jobr 的小型创业公司,该公司被称为“就业引爆器”。你可以注册,上传你的简历,然后开始刷推荐给你的工作。向右滑动应用,向左滑动通过。我最初是一名机器学习工程师,负责提高用户申请工作的数量,因为这直接影响到我们从外部工作平台和合作伙伴那里赚了多少钱。

由于多种原因,这被证明是具有挑战性的。一个是人们喜欢不上传简历,而期待得到精心调整和推荐的工作。他们会在 app store 评论中抱怨类似于*我正在攻读计算语言学硕士学位,你为什么给我看咖啡师的工作?*另一个原因是用户要么选择性很高,要么根本没有选择性。我们的许多用户,如果有机会**像对待他们的 Tinder 选择一样对待他们的求职,会不断向右滑动,申请数千个职位**。我们称它们为*刷卡轰炸机*,因为讽刺的是,它们为我们带来了大部分收入,但质量却很差。没有人想要一个同时申请该市 2000 份其他工作的候选人。

这最终让 Jobr 陷入了困境。通过降低我们申请的质量,刷单炸弹淹没了我们的工作伙伴(他们按申请付费),结果质量很差。一个合作伙伴在意识到质量下降了多少后,第二个月就减少了 70%的预算。**应用程序的质量和数量成反比**,我们能做的不多。我们会尽量推荐足够多的高质量申请,这样工作伙伴就不会拒绝我们,但仍会尽量增加申请数量以增加收入。

这种*质 vs 量*的关系很能代表更广阔的就业市场。许多工作从来不会缺少数量,而是缺少高质量的申请人。但是到底什么是“优质”申请人呢?这是一个困扰我们的问题。

在某些情况下,这很容易。如果你是一名卡车司机,申请一份卡车司机的工作,那绝对是质量问题。但是,如果你是一名卡车司机,申请一份行政助理的工作,那么…..那很棘手。从技术上讲,行政助理是一个入门级的工作,但质量可能取决于该职位是否接受其他过去的行政助理。

我现在明白了**大多数工作质量衡量完全是扯淡**不管有多少新的时尚招聘/招聘初创公司吹捧人工智能将如何彻底改变公司的招聘流程。例如,在 Jobr,我们的工作伙伴不能就质量衡量标准达成一致。一位合伙人告诉我们,某个月我们的高质量申请人比例是 30%,而另一位合伙人会说同样的申请人比例是 15%。

但是让我们继续深入下去。比方说,一家公司有一个很棒的招聘人员,他可以非常准确地从简历中判断出谁会通过面试。你经历了面试过程,但昨晚没有睡好,也许你分心了,因为你的孩子因为向别人脸上吐痰而被学校停学,你的面试官决定那天他们想问你关于神经网络的知识,尽管他们过去的六个月都在使数据库符合 GDPR 标准。现在你的申请突然被标记为不合格。

但是,让我们开玩笑说,你通过了面试,你的公司正在使用一个新的闪亮的人力资源分析软件来衡量高质量的表现。现在是你的季度评估,你觉得你的经理只是…有点忘记你了?你认为你的经理对你团队中的每个人都给出了完全客观的绩效评估,但是你的经理确实对你的同事笑得更多一些。昨天你发誓你听到他们花了一半的时间一对一地谈论他们上周末在酒吧的恶作剧。有没有可能你的经理给出的评价更多的是**他们有多喜欢或不喜欢某个人,而不是他们的表现有多好**?!有没有可能是你的经理自己的工作表现更多地**取决于主管有多喜欢他们**而不是收入增加,以便不将你的团队下个季度的预算减半?

我们可以深入探究,但最终,我认为招聘流程被打破这句话之所以流行是有原因的。因为漏斗的每一步都有可能因人的偏见而出错,最终会影响许多我们无法控制的事情。未来,人工智能是否真的可以检查和测量人类推理的个性和细微差别,理解我们的动机和公司的内部运作,以正确解决完美的系统,我不完全确定。

所以下次如果你想知道为什么你没有得到那份工作,也许可以归咎于人性。

# 感谢阅读!

如果你喜欢我的作品并想了解更多…

*   如果你对这篇文章有什么看法,或者想知道你的公司是如何招聘数据科学人才的,你可以在这里给我发电子邮件。
*   查看 [**面试查询博客**](https://www.interviewquery.com/blog) ,我们在这里发布数据科学指南和面试技巧。
*   成为第一批订阅[我的新 **YouTube 频道**](https://www.youtube.com/channel/UCcQx1UnmorvmSEZef4X7-6g?view_as=subscriber) **的人之一。**

# 让一个机器人在你空闲的工作空间出没

> 原文:<https://towardsdatascience.com/have-a-bot-haunt-your-slack-workspace-1aa333bb1873?source=collection_archive---------59----------------------->

## 用 Python 快速创建你的自动化 Slack 机器人

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ea9594b468715da3191e3aa4f9e3a100.png)

照片由 [**斯科特·韦布**](https://www.pexels.com/@scottwebb?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels) 发自 [**Pexels**](https://www.pexels.com/photo/conceptual-creativity-design-display-430205/?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels)

在本文中,我们将看到如何为 [Slack](https://slack.com) 编写简单的 bot,并安排它定期运行。由于一些测试可能是必要的,我建议在本教程中创建一个虚拟的松弛工作空间。

# 为您的宽松工作空间添加一个 web 挂钩

我们首先需要配置一个 web 钩子来与我们的 Slack 工作空间通信。进入[这个网址](https://my.slack.com/services/new/incoming-webhook/),选择你的频道,点击添加一个网页挂钩。本教程我选择发帖到`#random`频道。配置的其余部分可以保持不变,因此您可以保存它。

复制你的网页挂钩网址,其形式应该是[https://hooks.slack.com/services/SOME_GIBBERISH_CODE.](https://hooks.slack.com/services/SOME_GIBBERISH_CODE.)

# 在本地运行 bot

让我们在本地测试我们刚刚创建的 web 钩子的连接。我们将使用 python 库 [slackweb](https://github.com/satoshi03/slack-python-webhook) 。代码很简单。我们会把这个放在`slackbot.py`里。

将`HOOK_URL`的内容替换为从上一步复制的钩子 URL。然后运行代码,检查是否有效;您应该在`#random`中看到一条来自您的程序的消息。上面代码的第一行指定了要运行的 python 解释器的位置,如果文件包含 unicode 字符,如日语汉字或法语é,à等,则应该使用第二行。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/9df3c3badab20ac1f404cf7e0fafa3f7.png)

# 安排节目

你可以决定安排程序在你自己的电脑上运行,但是如果你想让它在你的电脑关机时也能运行,我们需要一个网络服务器。 [PythonAnywhere](https://www.pythonanywhere.com/) 为开发目的提供免费的服务器空间和 python 环境。因此,让我们创建一个帐户,并前往我们的 [PythonAnywhere 仪表板](https://www.pythonanywhere.com/dashboard/)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/7781349874e512fd2a1548115e74d1d5.png)

转到*文件*选项卡,将您的文件`slackbot.py`上传到您的目录`/home/your_username/`。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/bcfc4ac6797a54d01b656309c8c50bfb.png)

然后,让我们安装依赖项。打开一个 bash 终端并运行`pip3 install --user slackweb`。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4d4d35d7c43ff062cd11bc548140e26c.png)

在同一个终端内,我们可以检查一切是否正常。运行`python3 slackbot.py`,查看该消息是否再次出现在#random channel。

调度在*任务*选项卡中完成。通过指定运行的频率和命令来创建任务:`/home/adamoudad/slackbot.py`。您可以在创建任务时看到任务的截止日期,大概是一个月。对于免费计划,PythonAnywhere 要求您每月至少登录一次,以使您的计划任务保持有效。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d5fd66b766406f682c5ffe68dd73159d.png)

# 结论

就是这样!你让你的机器人在网上运行。它会萦绕在你松弛的工作空间,直到时间的尽头…真诚地。

*原载于 2020 年 5 月 21 日*[*https://adamoudad . github . io*](https://adamoudad.github.io/posts/python-slack-bot/)*。*

# 所有的科学家都成为数据科学家了吗?

> 原文:<https://towardsdatascience.com/have-all-scientists-become-data-scientists-b6536d38ced1?source=collection_archive---------62----------------------->

## 计算如何革新了几乎所有的应用科学。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/702ed17cbcbe8704a50d7c6566d000aa.png)

几天前,我在观看白宫的一次演讲时,黛布拉·比尔克斯博士走上台,展示了一种正在传播的新型病毒的信息。我记得当她指着她的图表说“看看这个置信区间”时,我笑了,我知道一般人**完全不知道什么是置信区间**。这对我来说很幽默,虽然我的女朋友不知道她在说什么,但她看着我,肯定这确实是统计数据。

虽然这可能对我来说有点有趣,但它也让我的大脑工作起来——加上我最近对生物信息学的兴趣,我真的开始问这个问题了…

> 所有的科学家都成为数据科学家了吗?

# 计算和科学

为了理解为什么所有的科学家都可能以这样或那样的方式成为数据科学家,我们需要理解计算机对科学的影响有多大。典型的科学包括记录结果,我们当然称之为数据,然后比较和测试这些结果,以识别控制的变化。这可能很简单,只要在一个数据框架中分离出当天下午吃了泡菜而死亡的人,并进行独立的 t 检验,以观察吃泡菜的人也自发死亡的统计意义。

也许这是一个不好的例子——因为它可能会被驳回,因为我们可以假设吃泡菜不太可能杀死你,但重点仍然是一样的。计算机特别擅长的一件事是存储数据并利用这些数据进行计算,比如 t 检验。考虑到这一点,很容易理解为什么计算机被用于科学这么久了。计算机和科学就像面包和黄油或花生酱和果冻一样,计算可以让两小时的数学工作迅速变成二十分钟的数学工作。考虑一下在纸上找到一组 300 个元素的观察值的平均值需要多长时间。首先,你需要把它们加起来,这需要用算盘、计算器(从技术上来说是一台计算机)或者在一张纸上手工完成——哎呀!

很容易理解为什么计算机将人类带入了一场巨大的科学运动。几乎很难想象自二战以来,世界各地的生活发生了多大的变化,如果你仔细想想,这大约与计算机在人类生活中发挥作用的时间相同。

因此,不用说,计算机使计算和数据管理和处理比没有它要容易得多。因此,世界上大多数科学家已经在通过对他们收集的数据进行编程来进行他们所有的研究。虽然这肯定是统计学在科学中的应用,以及计算机在统计学中的应用,但这并不一定意味着这些科学家就是数据科学家。

# 数据可视化

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3601105504e7d2beac3055b9cdfca11a.png)

数据科学的很大一部分是数据分析和测试。科学家也使用这种方法,我发现生物信息学中的过程实际上与典型的数据科学过程相同。最大的区别是我读取的数据类型,数据存储的格式,以及我如何可视化和交流数据以及我对数据的发现(假设数据是基因组,而不是数字或类别。)

由于这是数据科学中如此巨大的一部分,它也是所有科学中普遍存在的一个巨大部分可能会令人惊讶。随之而来的是一些共同点。统计学。统计学是从各种数据中得出结论的非常重要的工具。很难从 30 万条观察数据中得出任何推论。利用统计学,我们可以利用我们观察到的信息得出有根据的结论,并检验我们的假设。这变得更加容易,而且几乎是由计算机实现的。如前所述,如果没有计算机为你管理,管理大量的数据是相当困难的。所以在某种程度上,我们现在进行的许多统计都是因为计算才成为可能的。

# 机器学习

通常用来区分数据科学家和任何其他科学家的区别是从机器学习模型中得出结论和准确预测的能力。机器学习模型是使用统计数据来自动推断不存在的观察值的算法。

然而,似乎数据科学变得越主流,这样做的工具也变得越主流。随着这一点,机器学习的概念本身也随之改变。越来越多的科学家似乎将机器学习作为他们武器库中的另一种工具,而不认为自己是数据科学家。

回到我举的白宫的例子,黛布拉·比克斯博士,安东尼·福奇——他们一直在遵循**模型**来预测疫情将会发生什么。这些模型当然是定义完全相同的模型;它们被用来预测不存在的观察结果。在这种情况下,他们按日期预测死亡和病例。

# 结论

我认为对于那些参与机器学习的人来说,这可能是一件有趣且发人深省的事情。既然机器学习已经成为科学的主流,那么所有的科学基本上都已经成为数据科学了吗?我认为答案绝对是肯定的,但我好奇的是这给数据科学家们自己留下了什么。如果所有科学家都是数据科学家,那么所有数据科学家都是科学家吗?我认为最大的区别是,通常数据科学家被用来解决企业问题,或将模型应用于更一般化的数据,而不是专门的基因组学和生物信息学。总的来说,这的确是一件有趣的事情。

# 电子表格的时代结束了吗?

> 原文:<https://towardsdatascience.com/have-spreadsheets-got-a-future-9b7ad23648b8?source=collection_archive---------22----------------------->

## [现实世界中的数据科学](https://towardsdatascience.com/data-science-in-the-real-world/home)

## 为什么现代数据分析工具仍然难以竞争。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/adb8dd5561a1a6ec8638b42e9ea35be5.png)

[图片来源](http://www.pngfind.com)

人们说我们应该抛弃像微软 Excel 和[这样的电子表格应用程序,使用更先进的数据分析工具](/jupyter-is-the-new-excel-a7a22f2fc13a)。像 Python 这样的开源编程语言对于日常用户来说是容易理解的,并且比以前的语言更容易学习。像 Jupyter Notebook 这样的工具正在彻底改变我们编写和使用代码的方式。微软的用户网站上甚至有一个帖子,要求对“ [Python 作为 Excel 脚本语言](https://excel.uservoice.com/forums/304921-excel-for-windows-desktop-application/suggestions/10549005-python-as-an-excel-scripting-language?tracking_code=83722f91dbb6e5829f30e05e925c197d)”的想法发表评论(它获得了 6300 张投票和许多评论)。

在本文中,我试图阐明使电子表格作为通用数据分析工具对如此多的用户如此流行和有效的基本特性。对我来说,它可以归结为三个属性:

1.  电子表格以数据为中心
2.  电子表格在视觉上很直观,就像一张纸
3.  电子表格为您管理计算图表

为了说明这些想法,我比较了电子表格方法和使用编程语言来完成一个简单的任务。

最后,我概述了当前电子表格应用程序和现代编程工具(如 Jupyter 笔记本)的缺点,并推测什么可能会弥合这两种范式之间的差距。

我每天都用 Python 为客户做数据分析。在那之前,我用了 20 多年的 Excel。现在我已经精通 Python 和它的[数据科学库](https://scipy.org),我发现我比以前更有效率,能够更自信地实现更强大的分析技术。我真的只用 Excel 和客户分享数据和最终结果。

所以我发现自己在想“电子表格死了吗?”如果没有,“为什么不呢?”

我的第一反应是将电子表格扔进计算历史的垃圾桶——我花了太多时间纠结于复杂得可笑的公式,追踪损坏的单元格引用或试图恢复损坏的文件。然而,一旦我开始更深入地思考电子表格的本质,我开始意识到它具有编程语言所缺乏的固有特性。

# 电子表格是以数据为中心的

电子表格向我们展示的是数据,而不是数据背后的计算。

我们举一个很简单的例子。这是我们每个人都需要做的事情。想象一下,我们刚从公路旅行回来,我们需要弄清楚谁欠谁多少钱。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/18942db195559b2c7122665f1c9cc8b3.png)

Microsoft Excel 电子表格

这个例子非常直观,不需要解释。当我们既是数据的发起者,也是最终消费者时,我们已经理解了分析的目的,并且通常我们可以通过查看数据和结果来猜测计算是如何进行的。在这种情况下,你可以说“数据不言自明”

我喜欢 Excel 的另一个特性是,你可以用鼠标选择多个单元格,并查看常见的统计数据,如总和和平均值。

然而没有公式是可见的——我们必须点击单元格才能看到它们背后的计算。没有声明变量名。我们只是将每个数据点放在不同的单元格中,按照对我们有意义的方式排列,然后用计算和单元格引用将单元格连接起来。从视图中完全看不到计算。我认为这是电子表格如此有用和如此受欢迎的一个原因;我们知道我们的数据,我们知道它代表什么,我们喜欢看到它。

相比之下,我们大多数人都不喜欢盯着电脑代码看。编程语言是基于文本和线性的。下面是 Python 中的等价旅行费用计算。

import pandas as pd# Trip expenses
data = {
‘Food’: [38.15, 0, 109.75],
‘Car’: [139, 0, 0],
‘Fuel’: [25.08, 0, 0],
‘Tickets’: [0, 134, 0],
‘Other’: [95, 0, 250]
}
index = [‘Diane’, ‘Kelly’, ‘John’]
df = pd.DataFrame(data, index=index)# Calculate amount owing
df[‘Total Paid’] = df.sum(axis=1)
average_cost = df[‘Total Paid’].mean()
df[‘Owing’] = average_cost - df[‘Total Paid’]
print(df)


这会产生:

Food Car Fuel Tickets Other Total Paid Owing
Diane 38.15 139 25.08 0 95 297.23 -33.57
Kelly 0.00 0 0.00 134 0 134.00 129.66
John 109.75 0 0.00 0 250 359.75 -96.09


该代码使计算过程和计算方法显而易见,但从数据的角度来看,它更不透明。我们使用标签来引用数据,但是数据只有在打印出来后才真正可见。

中间变量包含哪些值?看到你需要一个交互式编程环境。例如,Python 有一个[解释器](https://docs.python.org/3/tutorial/interpreter.html),它允许你检查变量并一次执行一小段代码。

如果您刚刚运行了上面的脚本,您可以使用解释器对结果进行一些分析。

df[‘Total Paid’].idxmax()
‘John’
df.loc[‘John’]
Food 109.75
Car 0.00
Fuel 0.00
Tickets 0.00
Other 250.00
Total Paid 359.75
Owing -96.09
Name: John, dtype: float64


现代编程语言通过提供交互式环境使数据更容易访问,您可以在交互式环境中探索和可视化数据。

# 编程语言是面向对象的

如果你对编程有所了解,你可以很容易地破译代码做什么。每个数据对象都被赋予一个名称,并有一个定义的类型或结构。编程语言有大量的对象类型和方法,并允许导入外部包来提供额外的功能。

在上面的示例代码中,我使用了一个名为 [dataframe](https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html#dataframe) 的对象,它是专门为处理二维数据计算而设计的。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/b773bdda3a915947b9942e6858f2fd5a.png)

数据帧结构

各种“适合用途”的对象结构使得计算机代码健壮、强大且计算效率高。

为了克服早期只有行和列的电子表格的一些限制,微软在 Excel 中添加了[表](https://support.office.com/en-us/article/overview-of-excel-tables-7ab0bb7d-3a9e-4b56-a3c9-6c94334e492c)和其他数据结构,以便更容易进行更复杂的数据分析——类似于计算机语言的数据结构。

这是上面的同一个电子表格,但是使用了 Excel 中内置的表格格式和[结构化引用](https://support.office.com/en-us/article/using-structured-references-with-excel-tables-f5ed2452-2337-4f71-bed3-c8ae6d2b276e)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4b9d935efb9bfe41922f57acf71416e1.png)

table 对象具有引用其元素的特殊语法。代替

=SUM(C4:G4)


我们现在可以写:

=SUM(Table1[@[Food]:[Other]])


这更直观,如果我们对表进行更改,也不太可能破坏(符号“@”表示“来自当前行”)。

Python 中的对等词是:

df.loc[‘Diane’, ‘Food’:‘Other’].sum()


# 电子表格就像纸张

我认为我们喜欢电子表格的一个原因是它类似于好的旧纸张。写在纸上给了我们控制力和可预测性。东西总是在你离开的地方。我的一个老朋友半开玩笑地称纸质笔记为他的“持久、灵活的存储系统”。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/fe8c92ba5f362d9ca7ce182e27014cd3.png)

图片来源:[迈克·格雷斯利 CEA 投资组合](https://sites.google.com/site/mikegresleyceaportfolio/)

尽管现在我们很少用纸做数字工作,但它有一种直觉上的吸引力。我认为这是因为我们在二维空间看世界(在将图像转换为三维空间之前)。在你面前的平面上,很容易看到所有东西的位置。即使区域太大而不能立刻查看,我们也记得我们把东西放在哪里,因为我们直观地建立了一个所有东西都在哪里的二维地图。(MS 工作簿上的选项卡提供了另一个维度,但它实际上只是一组带标签的电子表格。)

开发用户应用程序的程序员谈论“GUI”或图形用户界面。所有设计给人类使用的东西都需要一个用户界面。电子表格应用也不例外。事实上,电子表格实际上是一个 GUI。具有标准化功能的统一网格既是一个 GUI,同时也是一个构建系统,就像[乐高](https://www.lego.com)一样。

当您第一次开始处理电子表格时,它看起来相当简单,就像一张白纸。但是,一旦你学会了如何添加数据和公式,引用其他单元格并格式化它们,你就可以使用这个不可思议的多功能构建系统来创建一个难以想象的大量不同的应用程序。最终产品,一个为特定目的设计的电子表格,也可能是最终用户的图形用户界面。当然,这其中潜藏着危险,但我怀疑在绝大多数情况下,电子表格是由创建它们的同一批人使用的。开发者就是用户。所以开发环境就是用户界面是有意义的。

电子表格可以释放你的创造力,让你自由地按照我们自己的设想来构建东西。这是制作电子表格如此令人愉快的原因之一。它既是一个计算平台,也是一个用户界面,无论它是一个简单的数据输入表单,一个格式良好的报告,还是一个漂亮的图表。

相比之下,计算机代码看起来很单调——你必须阅读变量名并浏览基于文本的代码。与电子表格不同,代码脚本是一维的,即线性布局。您可以指定每个命令的精确执行顺序。语法限制了可视化个性化代码的程度。

# 数据流编程

虽然您可能没有这样想过,但 Excel 在“幕后”构建了一个计算图,以便它能够以正确的顺序执行计算(我不太确定如何执行,但我假设它使用了某种[定向图](https://en.wikipedia.org/wiki/Directed_graph))。该图和创建它的过程是自动处理的,对用户来说是模糊的。您的工作只是定义数据以及它们之间的依赖关系。

什么是计算图?[计算图](https://www.youtube.com/watch?v=hCP1vGoCdYU)是描述输入数据和输出之间的函数关系的网络图。它们被用于机器学习应用中,许多复杂的计算被串联在一起。以下是旅行费用计算的计算图表。每个方框是一个数据项,箭头代表计算。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/09e60d77dde73e9aecdaa6a695bea739.png)

差旅费计算的计算图表

当你看一个电子表格时,计算图并不总是很明显,但是如果你逻辑地展示你的数据并且很好地标记它,它应该是容易想象的。Excel 中的“公式”菜单有一些很好的工具,可以通过绘制箭头来显示单元格之间的依赖关系,从而帮助使图形更加可见,但我认为它对更复杂的图形没有多大用处。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/08c5892de4af0b757b9495681b4c1e99.png)

在 Excel 中可视化依赖关系

[数据流编程](https://en.wikipedia.org/wiki/Dataflow_programming)完全不同于更常见的顺序或过程编程范例。作为数据分析师,我认为我们发现将计算视为图形或数据流模型比考虑一长串计算步骤更容易。这才是 excel 真正做 Excel 的地方!

当我们构建一个电子表格时,我们可能在头脑中有一些关于我们想要的计算图的想法,但是 Excel 让我们以一种非常灵活和流畅的方式来完成它。我们不需要从头开始,稍后我们可以轻松地断开和连接图形的不同部分(当然,直到您创建一个[循环引用](https://support.office.com/en-us/article/remove-or-allow-a-circular-reference-8540bd0f-6e97-4483-bcf7-1b49cd50d123),我确信我们都做过一两次)。

也许令人惊讶的是,当我们编写计算机代码时,没有内置的工具来自动处理计算图。这取决于你知道计算需要发生的顺序,如果你做错了,不会有任何警告。

例如,假设我们弄错了一项费用,我们需要更改它。我们可以这么做。

df.loc[‘John’, ‘Other’] = 25 # Correct value
df
Food Car Fuel Tickets Other Total Paid Owing
Diane 38.15 139 25.08 0 95 297.23 -33.57
Kelly 0.00 0 0.00 134 0 134.00 129.66
John 109.75 0 0.00 0 25 359.75 -96.09


对一个数据项进行了更正,但没有重新计算数据框中的其余值(因为它们会自动出现在电子表格中)。

应用程序开发人员当然不会犯这种错误——他们小心翼翼地按照正确的顺序编写代码,并且[手工编写特殊检查](https://github.com/billtubbs/pythonflow-demo/blob/master/pythonflow-demo.ipynb),以确保对输入数据的任何更改都会自动触发依赖于它的所有变量的重新计算。

根据我的经验,这意味着当你为数据分析编写代码时,你需要从一开始就非常仔细地考虑计算图,并相应地计划和组织你的代码。当你写一个程序时,你实际上是根据语句的编写顺序来决定计算图的。除非你非常擅长面向对象编程,否则如果你弄错了,以后要改变对象和关系会很麻烦。我们并不都是职业程序员,为什么计算机不能为我们做呢?有一些工具会有所帮助,比如 [d6tflow](https://github.com/d6t/d6tflow) 和这个[有趣的 Python 包](https://github.com/spotify/pythonflow/),但是这些都是专门的工具,不经常使用。

# 电子表格不可伸缩

在 Excel 中很难动态改变数据集的大小和维度。您必须手动插入或删除行和列。编程方法的最大优势在于,一旦您自动化了您的分析,就很容易对其进行扩展,并使其可配置用于各种不同规模的任务。

尽管调试可能需要更多的精力和时间,但是一旦您有了一个正常工作的计算机程序,它往往会更加健壮(不容易出现人为错误),可能会更加高效,并且可以扩展到 Excel 无法处理的更大的数据集。

此外,还有一系列工具和基于网络的服务可供使用,允许您借用和共享代码,协作和管理更改和版本更新。

# 两全其美

最好的两个世界将是一个互动的环境,我们可以创建工作流,并看到我们的数据在一个有吸引力的和直观的视觉格式。同时,我们希望强大的数据结构通过健壮的计算图中的计算操作绑定在一起。据我所知,我们还没有到那一步,尽管有一些有趣的发展,事情进展很快。

首先,像 Jupyter Notebook 这样的开源工具确实让我们这些非专业软件开发人员的编程变得更加友好。代码编写和执行的过程不再像过去那样不连贯,所以现在我们可以在同一个视图中单步执行代码、检查变量值和试验(调试)。下面的截屏显示了如何在 Jupyter 笔记本中编辑代码时查看代码旁边的数据。

Jupyter 笔记本中的代码和数据

但是计算图呢?遗憾的是,Jupyter notebook 没有提供一种方法来可视化数据对象之间的相互联系或控制它们的依赖性。事实上,一旦你开始按照 Jupyter 笔记本允许的非线性方式执行代码,Jupyter 笔记本就有[相当多的问题。](https://docs.google.com/presentation/d/1n2RlMdmv1p25Xy5thJUhkKGvjtV-dkAIsUXP-AL4ffI/edit#slide=id.g362da58057_0_1)

也许最有希望的方向是最近开发的商业智能(BI)应用程序,它提供了一种可视化的点击式数据处理方法,具有强大的数据工作流以及强大的数据分析和可视化功能。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/b441bf1d41c65d1719ee7dac7b48bec0.png)

图片来源:来自 [Tableau](/www.tableau.com) 的宣传视频

不胜枚举,我对其中几个(如 Tableau、TIBCO Spotfire、Microsoft Power BI)的经验有限,但它们都有一套全面的功能,涵盖从采集到报告和协作的整个数据流管道。许多还内置了强大的机器学习能力。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/37c5cef9ba38677055a8eb5ff2f1f098.png)

图片来源: [Tableau](https://www.tableau.com/about/blog/2018/8/new-tableau-prep-use-command-line-schedule-flows-plus-localized-user-experience)

这些工具中的一些现在已经将高级编程语言集成到他们的产品中。例如, [TIBCO Spotfire 自带了一个内置的 Python 环境](https://www.tibco.com/blog/2020/01/16/how-to-get-the-most-out-of-python-in-spotfire/),允许用户添加自己定制的 Python 代码。Tableau,有自己独特的[计算语言](https://help.tableau.com/current/pro/desktop/en-us/calculations_calculatedfields_formulas.htm),类似 Excel 公式。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/72fa600f1b4100063921503cc428cd4a.png)

图片来源: [Knime Analytics](https://www.knime.com/knime-software/knime-analytics-platform)

另一个受欢迎的平台 Looker 为他们决定[创造一种叫做 LookML](https://looker.com/blog/7-reasons-looker-built-a-new-language-for-data) 的新语言辩护,称现有的语言还没有准备好,并声称他们的语言更容易学习。我认为这是一个错误。学习任何新的编程语言都是一项巨大的投资,只有当这种语言被广泛使用并经得起时间的考验时,它才会有回报。Python、R 和 Java 等语言将在可预见的未来出现,它们可能是目前高级数据分析和机器学习的最佳语言(我认为 MATLAB 是亚军,它不是开源的,因此不太容易获得)。

我觉得这些强大的 BI 应用程序缺乏的是电子表格的简单、直观的感觉和它提供的创作自由。在使用复杂的内置功能之前,您需要与您的数据建立良好的连接,并拥有一个清晰、透明的工作环境,让您感觉可以控制,而不是不知所措。

# 结论

总的来说,我会说电子表格非常适合做标准数据分析任务的人和那些没有时间学习如何编码的人。它们让您可以快速浏览您的数据,并立即产生一些结果,而不必考虑太多。

对照表

像 Python 这样的编程语言功能强大,可以比电子表格更可靠地处理大量数据。如果你需要实现一个健壮、高效的数据处理管道,这个管道将被多次使用,并且必须被其他人所依赖,那么 Python(或者其他一些[高级编程语言](https://en.wikipedia.org/wiki/High-level_programming_language),比如 C#、R、Java 或者 MATLAB)可能是一个不错的选择。但是如果你以前没有编程的话,会有一个很大的学习曲线。

最后,商业 BI 工具(假设你可以使用)可能是弥合电子表格和手工编码的计算机程序之间差距的解决方案。但是我还没有见过既有电子表格的直观吸引力,又能使用像 Python 这样强大的高级编程语言的。

我认为我们仍然需要弄清楚什么是完美的工作环境。我们希望解决方案能够实现以下目标:

1.  像在纸上写字一样直观
2.  为数据提供透明的接口
3.  使数据结构可见并管理计算图
4.  自动扩展以适应不同大小的数据集
5.  允许使用行业标准数据分析工具和编程语言添加定制功能。

在我们有这个之前,我不认为电子表格的时代已经结束了。

# 入门指南

如果本文中的一些概念对您来说是新的,请查看这些教程和学习资源。

*   关于在 Excel 中使用结构化表格引用的 3 分钟视频教程[https://Excel jet . net/lessons/introduction-to-structured-references](https://exceljet.net/lessons/introduction-to-structured-references)
*   解释什么是计算图形的 3 分钟视频【https://www.youtube.com/watch?v=hCP1vGoCdYU T2
*   面向完全初学者的免费 Python 编程入门书【https://greenteapress.com/wp/think-python-2e/ 
*   熊猫 Python 库的 10 分钟介绍[https://Pandas . pydata . org/Pandas-docs/stable/getting _ started/10min . html](https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html)
*   关于 Python 数据分析的综合书籍可在线获得[https://jakevdp.github.io/PythonDataScienceHandbook/](https://jakevdp.github.io/PythonDataScienceHandbook/)

# 你听说过最优化问题吗?

> 原文:<https://towardsdatascience.com/have-you-heard-about-the-optimization-problem-a0bab74e26c?source=collection_archive---------54----------------------->

## 如果没有,这是问题的入门文章。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/feed3169d9ea2a6c99ccd22f0be2214e.png)

在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上 [engin akyurt](https://unsplash.com/@enginakyurt?utm_source=medium&utm_medium=referral) 拍摄的照片

# 介绍

作为一名数据科学家,有时我们需要创建一个脚本或机器学习模型来回答我们的问题。有时候,有很多方法可以解决我们的问题。举一个分类问题的例子;我们可以应用基于概率的模型、基于树的模型或基于线性的模型。最初,在 EDA 之后,我们会选择由数据填充的模型。现在,也许我们采用一个随机森林模型,并希望训练该模型。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/397a15013a86fce92f6bef2c26386971.png)

你们中的许多人会意识到有许多参数需要调整,就像旁边的图片一样。然后,您尝试参数的每个组合,直到找到适合您模型的**‘最佳’**参数,但这肯定会花费很长时间。

我刚才在上面的文章中解释的就是我们所说的**优化问题**。

形式上,我们可以将优化问题定义为

> "根据目标函数寻找最佳状态的问题."

我们所认为的状态是不同的,因为它取决于上下文。可能是

*   随机森林模型的参数;
*   棋盘上的国际象棋位置;
*   深度学习模型中的神经网络权重
*   地图上火车站的放置顺序。

这里重要的是,可能的状态有很多种,但我们要找到的是**【最佳】**解(或者用数学术语**目标函数**、**适应度函数**、**代价函数**,或者**损失函数**)。对于优化问题,我们希望最大化或最小化这个函数。

在最优化问题的情况下,因为我们比较每个状态以找到数学上的最佳函数,这意味着状态应该是一个**数值**值(或数值向量)。优化问题本身可以分为连续优化,或者取决于变量的离散优化。

# 数学例题

如果你想象有问题,让我用一个简单的数学函数来展示。想象一下,如果我们有一个如下的目标函数。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ce7515498edc27031d6fe4d7a4105bdc.png)

其中 x 是由状态组成的向量

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3feb78ab1077fe8d1d4f72d42ced6fdf.png)

现在,例如,我们有一个优化问题,我们希望最大化目标函数,或者换句话说,从函数中获得尽可能大的最高值。在上面的问题中,函数只能取 0 或 1 之间的值。现在,我们可以有很多 x 的组合,可能是 x = [0,0,0],或者 x = [0,1,1]等等。但是我们想最大化目标函数。也就是说,最优解应该是

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3e7b166ddf603268d58ab791de37ad2c.png)

其中 f(x)设为最优解的函数为 **f(x) = 3。**我刚才解释的是优化问题的一个例子,我们希望目标函数产生最大值。

在现实世界的问题中,等式永远不会那么简单。它通常涉及复杂功能和大量的状态组合。由于我们不能在合理的时间内优化目标函数,这就成了一个问题。

解决这个问题的一个方法是应用**随机优化算法**。顾名思义,我们不会遍历所有状态,而是从一个初始的“最佳”状态向量开始,然后随机生成一个新的状态向量(通常是当前“最佳”状态的邻居)。如果新状态更好,则新向量成为新的“最佳”状态向量。我们重复它,直到达到给定的最大重复次数。

# 实际应用——旅行推销员问题

旅行推销员问题(TSP)是一个优化问题,我们试图确定 n 个城市(或房子、车站等)的最短行程。你喜欢的任何类型),在同一点开始和结束,并且访问所有的位置一次。例如,我在下面的网格中收集了五个城市。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/7c4614efc4be0c47e0ba6c9cef52f0ac.png)

我希望销售人员在所有城市旅行一次,并且在同一个城市开始和结束。如果我们设置解向量 x = [0,1,2,3,4]并假设城市从 0 开始,那么推销员将像下面的网格一样旅行。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2ba902351e98b07ab03f485cc8a9cc27.png)

所走的路线似乎不是最佳路径。这就是我们试图找到最短路线或最优化问题的地方。

对于本文,我将使用一个名为 [mlrose](https://mlrose.readthedocs.io/en/stable/index.html) 的优化问题模块。如果要安装该模块,可以运行下面的代码。

#Installing using pip
pip install mlrose


使用 mlrose 解决优化问题包括三个步骤:

1.  定义一个适应度函数对象(我们喜欢最小化/最大化的函数)。
2.  定义一个优化问题对象(包含我们试图解决的优化问题的所有基本信息的对象)。
3.  运行随机优化算法。

首先,我们需要定义适应度函数对象。幸运的是,mlrose 已经有了用于定义适应度函数对象的`TravellingSales()`类。最初,`TravellingSales()`类需要所有城市的(x,y)坐标(或距离)。

import mlrose*# List of city coordinates*
coords = [(1, 0), (3, 2), (7, 7), (1, 4), (5, 2)]# Initialize fitness function object
fitness_coords = mlrose.TravellingSales(coords = coords)


启动适应度函数后,我们将定义优化问题对象。mlrose 模块已经将`TSPOpt()`作为优化问题对象。我们只需要通过输入几个参数来定义对象。在上面的例子中,我们想要解决长度为 5 的最小化问题。在这种情况下,我们将优化对象定义如下

# Define optimization problem object. length parameter is the number of the cities, fitness_fn is the fitness function, and we set maximize to false as we want the minimal distanceproblem = mlrose.TSPOpt(length = 5, fitness_fn = fitness_coords, maximize=False)


我们现在准备选择一个随机优化算法,并用它来解决我们的问题。随机优化算法是基于[进化算法](https://en.wikipedia.org/wiki/Evolutionary_algorithm),我不会深入解释此事,但 mlrose 模块中使用的参数就是基于此。在我们的示例中,我尝试将 mutation_prob 参数(只需将该参数视为基于当前最佳状态的状态变化率)设置为 0.2,将 max _ attemps(重复次数)设置为 100。

best_state, best_fitness = mlrose.genetic_alg(problem, mutation_prob = 0.2,max_attempts = 100, random_state = 2)print(‘Best State is:’)
print(best_state)print(‘Best Fitness (Total Distances) is:’)
print(best_fitness)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ce8ccfd397ac811a0145095c5e62b042.png)

我们可以看到算法找到的最佳状态是[1,0,3,2,4]。我还提出了显示我们所走的总距离的最佳适合度,因为我们在这个问题中最小化的是总距离(准确地说是欧几里德距离)。如果我们把它形象化,我们的销售人员会走下面的路线。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/6ab2c3ecade3e57eada72fc8abdde5a0.png)

仅此而已。我们已经将优化问题应用到旅行推销员问题中,并找到了推销员可能走过的最佳路线。这就是我们如何用最优化问题来解决我们的问题。

# 结论

优化问题是根据目标函数寻找最佳状态的问题。这种状态可以是任何东西,从机器学习模型参数到推销员的旅行路线。目标是最大化或最小化给定状态的目标函数。

# 如果您喜欢我的内容,并希望获得更多关于数据或数据科学家日常生活的深入知识,请考虑在此订阅我的[简讯。](https://cornellius.substack.com/welcome)

> 如果您没有订阅为中等会员,请考虑通过[我的推荐](https://cornelliusyudhawijaya.medium.com/membership)订阅。

# 你试过 VS 代码的 Pylance 吗?如果没有,下面是你应该这么做的原因。

> 原文:<https://towardsdatascience.com/have-you-tried-pylance-for-vs-code-if-not-heres-why-you-should-a8a7b5adc5f2?source=collection_archive---------5----------------------->

## PYTHON 开发| VISUAL STUDIO 代码

## 最新的 Python 语言服务器(来自微软)是一个巨大的生产力增强器。

如果你使用的是 [Python](https://www.python.org/) 和 [Visual Studio 代码](https://code.visualstudio.com/),那就帮自己一个忙:下载 [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) 扩展(预览版)并亲自试用。

# 什么是挂架?

[Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) 是对 [Visual Studio 代码](https://code.visualstudio.com/)的扩展。更具体地说,Pylance 是一个 Python 语言服务器——这意味着它提供了对智能感知、语法高亮、包导入解析和无数其他特性的增强,以改善 Python 语言的开发体验。

你可以在这里找到[功能的完整列表](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)。为了简单起见,我将根据我迄今为止对该扩展的体验,重点介绍三个最有用的特性。

# 自动进口(也就是更少的麻烦)

在 Python 中,理解如何正确地从内部和外部模块导入依赖关系对新手和专业人员都是一个挑战。

Pylance 扩展提供了一个特性,当您在环境中引用一个依赖项时,它会自动将导入添加到 Python 文件的顶部。它还会显示一个灯泡图标,根据场景建议添加或删除导入。

值得一提的是,您需要在 Python 环境中安装您所引用的模块,这样才能工作。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/9621ad000f59f55515032b6564f7d6ca.png)

下面是 Pylance 的一些功能的快速演示。请注意,依赖项是在第 2 行自动导入的,未使用的导入是灰色的,并且类和函数现在都有自己独特的颜色(分别是绿色和黄色)。

# 语义突出显示(也称为漂亮的颜色)

Pylance 的语义突出显示意味着类、函数、属性和其他 Python 对象类型在屏幕上以更加直观和易读的方式进行着色(即突出显示)。

直观演示比试图描述要容易得多,所以这里有一些截图…

## 禁用 Pylance 的代码高亮显示

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/fb42ce50cef54a5014e08918df12efb8.png)

导入、函数、类和变量都是白色的。理解上下文需要命名和大小写约定。

## 启用 Pylance 的代码高亮显示

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/05a8bf257d525185a6153cb048c97317.png)

模块和类是绿色的,函数是黄色的,变量是蓝色的。这使得代码一目了然,更容易理解。

# 类型检查(也就是更少的错误)

类型提示,或者为变量/函数/类等指定预期数据类型的实践。,对 Python 来说是相当新的。Python 不强制类型提示,所以在这一点上,它本质上只是文档的最佳实践。

然而,使用 Pylance,启用类型检查设置(见下文)将帮助您了解您的代码是否违反了任何记录的类型提示。类型检查有两种模式,基本模式和严格模式(在首选项中配置)。这个时候我会建议坚持基本设置。

{
“python.analysis.typeCheckingMode”: “basic”
}


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/fa3b26def2eb71b6b9f8bada6f141f0f.png)

Pylance 创建了两个红色的语法亮点——第一个告诉我,我正在将一个整数传递给一个需要字符串的函数参数,第二个告诉我,我的函数应该返回一个字符串,但却返回了一个整数。

# 结论

用于 [Visual Studio 代码](https://code.visualstudio.com/)的 [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance) 扩展仍在预览中。还需要做更多的工作来提高性能,扩展文档,并解决一些错误。然而,在我的经历中,这已经是一个很棒的扩展了。启用 Pylance 后,我当然不想回到 Python 的默认语言服务器。

我建议你自己尝试一下这个扩展,并随时留下你的想法!

# 使用 GitHub 动作自动构建您的 ML 模型

> 原文:<https://towardsdatascience.com/have-your-ml-models-built-automatically-using-github-actions-5caa03c6f571?source=collection_archive---------38----------------------->

## 如何在 Marketplace 上发布自定义 GitHub 动作,用于构建机器学习应用。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/fd96887acd1cef4a234b325e677e88e0.png)

大规模应用的手动任务(使用 Canva 设计)

> GitHub Actions 说:“给我数据集,我会为你建立模型!”!

你有没有想过有一个自动化的流水线,根据我们的需求训练我们的模型,并为我们提供结果?想象一下那会让你有什么感觉!现在,您可以选择创建一个管道,接受来自用户的数据集,并使用 GitHub 操作直接提供模型文件(pickle 文件)。

GitHub Actions 帮助我们自动化从代码提交到部署的任何软件开发工作流程。在这里,我们可以编写称为*动作*的单独任务,为我们完成特定的工作。在本文中,我将向您展示如何创建一个*动作*来在给定数据集时自动构建分类器模型。此外,该操作可以发布在 GitHub Marketplace 上,供其他人使用(使用我们的自定义操作)。

如果你是工作流和动作的新手,你可以访问我之前关于 [GitHub Actions](/github-actions-makes-one-click-to-deploy-feasible-for-ml-ci-cd-pipeline-61470ed3edbc) 的文章来获得一个简要的概述。

> 我们开始吧!

## 计划自定义操作

我们不想在设计工作流时出错,所以让我们用一个清单为我们的自定义操作制定一个计划。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/a82480c54e200f018d60da85a24deadd.png)

使用 Canva 设计

*   **Dockerfile —** 所有动作都需要一个 Dockerfile 来定义运行动作的容器环境。
*   **action.yml —** 这将为我们的操作定义输入、输出、入口点,以及其他细节,如操作名称、描述、作者姓名等。
*   **脚本—** 一个动作可能需要一个脚本来执行任务,在我们的例子中,导入数据集和训练模型就是任务。所以这里我们使用一个 python 脚本。
*   **README.md —** 这是可选的,但是如果我们想在市场上发布我们的行动,我们就需要它。README.md 文件有助于提供操作顺利运行所需的示例和变量。
*   **一个 GitHub 库—** 所有的动作代码都会保存在一个 GitHub 库中。

## Dockerfile 文件

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/0ac4e8370ab94b928847da3a614e72e3.png)

Dockerfile(作者照片)

我们需要一个操作将在其中运行的 Dockerfile 文件。安装了模型训练所需的必要依赖项,并在此定义了入口点。

## 设置 action.yml 文件以定义操作

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/fb5cc1c7ae47f123430d4c6d3b161354.png)

actions.yml 文件(作者提供照片)

正如我前面所说的,这个文件帮助我们定义动作的输入和输出。在我们的例子中,在模型被训练之后,我从用户那里获取输入进行分类。我们还将使用 actions.yml 文件在市场中用图标和颜色标记我们的行动。

## 用于训练模型的 Python 脚本

脚本是使动作执行任务的主要核心部分。在这里,我们可以使用环境变量、访问机密和任何事件数据。我们可以考虑使用 Python、Ruby、Java、C#编写脚本。

用于训练模型的 Python 脚本

在当前操作中,我们通过环境变量 **GITHUB_REPOSITORY 访问用户上传到 GitHub 存储库中的数据集。**一旦我们得到数据,输出变量被编码。我用 SVM 来分类。随着模型的构建,它将被存储在容器中以备后用。

> **注意:**这里我们假设数据集是干净的,没有丢失的值。对于不同的任务,脚本可以是不同的,您可以相应地定制它。我们还可以执行几项工作,如数据预处理、特征工程等。

一旦创建了所有必要的文件并上传到 GitHub,存储库应该如下所示。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/a76edbfb362113386ced40e4477f92d2.png)

GitHub 知识库(作者提供图片)

## 将行动发布到市场

GitHub 足够智能,可以检测 action.yml 文件,并询问我们是否要将该操作发布到 Marketplace。点击**发布草稿。**

> 在发布之前,请确保您已经为 GitHub 帐户启用了双因素身份验证。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/5e5fe69ffd74b4b5abe3c9748726102d.png)

发布行动(作者照片)

如果一切正常,可以看到上面的控制台。现在提供所需的详细信息,如主要类别、描述、标签名称等。如下图。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/43ee64e24c467f9a454076198ab5a544.png)

发布行动的其他详细信息(作者提供的照片)

填写完必要的详细信息**后,点击**发布发布**。**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e4850aefb334735d6a9880659a826c90.png)

行动发布(作者供图)

点击右上角的**市场**。

> TADAAA!!我们的行动已发布,现在出现在[市场上。](https://github.com/marketplace/actions/autom-ml-classifier-action)

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/9d0a3dbe7b83f6aacc5c4fa1100aeecc.png)

GitHub Marketplace 上的自动 ML 分类器操作(作者提供图片)

## 这个动作怎么用?

既然我们已经在市场上发布了*动作*,让我们看看如何在我们的工作流程中使用它。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2255de1887087f4c0de674a0919835c4.png)

使用自动 ML 分类器动作(作者照片)

当您点击**使用最新版本时,**将显示提示。我们需要复制代码并在我们的工作流程中使用它,如下所示。为了简单起见,我使用了虹膜数据集来训练模型并对花进行分类。我已经提供了测试模型的输入。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/eb7fd65a7d25ee3caa7f520ca1c53915.png)

工作流程(作者照片)

现在创建一个存储库并上传数据集来训练模型。数据集文件的名称必须是 **dataset.csv** (在我的例子中)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2ba0114090cc922640786983f0125d87.png)

GitHub 知识库(作者提供图片)

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/07d0c66364e1eb0442c105bbad63d414.png)

数据集格式(作者提供的照片)

现在到 GitHub 控制台上的**动作**,点击**自己设置一个工作流程。**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d8351cf27766e1d5206e04b7de79965a.png)

GitHub 操作部分(作者提供图片)

点击**开始提交,**给出提交信息(可选),点击**提交新文件。**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d7d953dbdf4a798d3d33e4e4a6b8f451.png)

提交工作流文件(作者照片)

一旦你点击**提交新文件,**工作流就开始了。转到 **Actions** ,您将找到与您之前给出的提交消息同名的工作流。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/5218e0363c2891fdd82f46187fcabb4a.png)

执行工作流程(作者提供照片)

单击工作流,您将看到控制台输出。对于给定的输入和模型精度,您可以看到模型的输出。在右上角,您可以点击**工件**,下载模型文件并在我们的本地机器上使用。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ffc982c5e3753b3bbe8301a8e8bcabaf.png)

控制台输出(作者提供照片)

该工作流在 **push** 事件时触发,即每当用户上传数据集或对数据集进行任何更改时,GitHub 动作— **Auto ML Classifier** 将为我们构建模型。当在本地机器上构建模型出现问题时,这个操作会很方便。此外,通过添加不同的阶段,可以测试模型并部署它,或者以不同的版本将应用程序交付给用户。

***自动 ML 分类器动作*** 的完整代码可以在 GitHub [这里](https://github.com/developers-cosmos/Auto-ML-Classifier)找到。

***测试动作*** 的完整代码可以在 GitHub [这里](https://github.com/RitheeshBaradwaj/Testing_GitHubAction)找到。

## 结论

在本文中,我们已经看到了如何创建一个 GitHub 动作,一旦数据集被提供,它就自动构建或训练一个机器学习模型。此外,创建的操作在文章中被发布到 **Marketplace** 。通过使用 GitHub Actions,我们可以实现完全成熟的**持续集成**和交付( **CI** / **CD** )功能,这些功能内置于服务中。

如果你有什么建议,我很乐意听听。我很快会带着另一个有趣的话题回来。在那之前,呆在家里,保持安全,继续探索!

如果想联系,**联系我上**[**LinkedIn**](https://www.linkedin.com/in/ritheesh-baradwaj-yellenki-8a6988173/)**。**

# 愉快地学习 CNN:适用于人类图像的狗品种预测示例

> 原文:<https://towardsdatascience.com/having-fun-learning-cnns-example-of-dog-breed-prediction-applicable-to-human-images-59b0700462b5?source=collection_archive---------39----------------------->

## 应用程序的核心算法,根据狗的品种对狗的图像进行分类,并在提供人的图像时输出最相似的品种。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2c1b867dcd2b1dcb8edcf75a12a4a5fa.png)

图 0:预期输出。

# 一.项目定义

## **项目概述**

这个项目旨在创建一个核心算法,根据狗的品种对狗的图像进行分类,这可以用作移动或网络应用的一部分。该应用程序应该提供一个有趣的用户体验,因为它不仅接受狗的图像,而且接受任何用户提供的图像作为输入。如果检测到狗,算法应该输出狗的品种预测。如果检测到人类,输出的应该是最像狗的品种!

## **问题陈述**

使用的分类器是卷积神经网络(CNN),它被称为最先进的图像分类。涉及以下步骤:

-预处理图像

-建立辅助功能,如人类探测器和狗探测器

-从头开始尝试构建 CNN 分类器

-使用迁移学习训练分类器

-预测和分析结果

在整个项目中,用于构建 CNN 架构的主要库是 Keras。

## **指标**

犬种分类器是一个多类分类问题,因此最相关的评价指标是准确性。准确度被定义为正确预测的数量与做出的预测的总数之比。值得注意的是,该模型将仅在狗图像上进行评估,尽管它将用于预测与人类图像最相似的狗品种。

# 二。分析

## **数据探索**

主数据集总共包含 8351 张狗的图片(Credit: [Udacity](https://github.com/udacity/dog-project) ),数量相当少。这些图片预先标注了 133 个犬种名称。数据集分为训练集、评估集和测试集,比例分别为 80%、10%和 10%。

这里展示了一些狗的图片:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/cb70adbcf458f94a94aa4425e9ed24a4.png)

图 1:数据集中狗图像的一些例子。数据集信用: [Udacity](https://github.com/udacity/dog-project)

很容易发现以下情况:

-图像大小不均匀,因此必须进行图像预处理。

-在一幅图像中可以有不止一只狗,因此分类模型的学习任务将更加复杂。

-图像提供有白色背景或彩色和不同背景,其中可以发现各种对象。

分类的任务是非常具有挑战性的,因为在一些犬种对之间存在最小的类间差异,即使是人也很难区分。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/81cb0e77e4f1e0da39b415b0e0d329d3.png)

图 2:模型能够区分布列塔尼和威尔士史宾格猎犬吗?。信用: [Udacity。](https://github.com/udacity/dog-project)

同时,由于高的类内变异,算法将不得不找出如何将不同颜色的狗分类为同一品种。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2808f69604f643721b8dbdad8f3d3f6c.png)

图 3:将黄色、巧克力色和黑色拉布拉多归类为同一品种很有挑战性。信用: [Udacity](https://github.com/udacity/dog-project) 。

此外,还提供了 13,233 幅人体图像的数据集。这将有助于测试人类检测器的功能以及最终算法的输出。

## **数据可视化**

下图显示了每类训练图像的分布。可见品类之间是不平衡的。频率最高的类大约是训练集大小的 1.2%,而频率最低的类大约低 3 倍(训练集大小的 0.4%)。这种不平衡问题可能会导致过度拟合,而模型可能更适合常见的犬种。

然而,这种不平衡并不严重,就像有些班级图像很少一样。事实上,就绝对数量而言,每类图像的数量大约在 26 到 80 之间。这不会阻止模型学习并以一定的准确度输出预测。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/76243afcc6a39a42c8490d406a6040df.png)

图 4:训练狗图像分布不均衡。

# 三。方法学

## **数据预处理**

由 Keras 构建的 CNN 需要具有形状(nb_samples,rows,column,channels)的 4D 输入张量,其中 nb_samples 对应于图像的总数,rows,column 和 channels 分别对应于每个图像的行数、列数和通道数。

从上面可以看出,输入图像需要预处理。图像预处理函数以彩色图像文件路径作为输入,加载图像,将其调整为 224x224 像素的正方形图像,将其转换为数组,最后输出适合 Keras 模型的 4D 张量。为了加快训练过程,每个图像都被重新缩放:每个像素在被馈送到模型之前被除以 255。

## **助手功能**

为了检测输入图像包含人还是狗的图像,建立了两个辅助函数:第一个用于人脸检测,第二个用于狗的检测。

人类检测器使用 OpenCV 实现的[基于 Haar 特征的级联分类器](http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html)来检测图像中的人脸。在预训练模型被下载之后,人体检测器功能接受图像作为输入,并将其转换为灰度。根据在输入图像中是否检测到人脸,它输出一个布尔值。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8e1c7b7d4137a1aa30a5830e1ec42ce5.png)

图 5:人体探测器。

人脸检测器功能已经在 100 幅人类图像和 100 幅狗图像上分别以 100%和 89%的准确率进行了测试。值得注意的是,在由算法检测到人脸的 11 幅狗图像中,有一幅具有清晰的人脸,两幅具有人体存在。尽管它在狗的图像上表现得并不完美,但它的准确性仍然是可以接受的。

同样,dog detector 使用的是 [Resnet50](http://ethereon.github.io/netscope/#/gist/db945b393d40bfa26006) 模型,该模型已经在 [ImageNet](http://www.image-net.org/) 上进行了预训练,这是一个来自 [1000 个类别](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)的+1000 万图像数据集。虽然 Resnet50 模型预测 ImageNet 上的可用类别之一,但我们的狗检测器有一个附加功能:它检查预测的类别是否对应于狗类别,如果是,则返回 True,否则返回 False。

就准确性而言,它在人和狗的图像上都表现完美。没有人的图像被检测为具有狗,并且 100%的狗图像具有检测到的狗。

## **实现**

实施过程可以分为两个主要步骤:

1.从头开始构建 CNN 模型

2.利用迁移学习获得更好的绩效

第一阶段旨在试验不同的 Keras 基本模型。这一步应该很好地反映了如何在下一阶段调整预训练模型。

当从头开始构建 CNN 时,主要思想是增加整个层的频道数量,同时减少层的长度和宽度。

为了能够快速测试性能,我构建了具有三到五个 2D 卷积层的小型架构。三种不同的模型进行了基准测试:

-第一个使用 3 个卷积层和 3 个填充层,随后是 2 个全连接层;

-第二个使用 5 个卷积层和 5 个填充层,然后是 2 个全连接层。

-第三个使用 5 个卷积层和 5 个填充层,然后是 3 个全连接层。

在每种情况下,密集层都配备了脱扣,以防止过度拟合。最终输出层配备了 softmax 功能。

对于第一个 2D 卷积层,我选择 16 作为信道数量,因为这是一个合理的数量,它将在各层中增加 2 倍。

为了保持图像边缘附近像素处的输入值,选择相同的填充而不是有效的填充。

Relu 激活被选择在 2D 卷积层,因为它在训练 CNN 模型的性能上的声誉。

在整个 CNN 中使用步长为 1 的 3×3 内核大小,以便捕捉每个像素的输入。这是由一些品种的高类内变异引起的,因此必须提取任何以狗的模式为特征的值。与 5x5 或 7x7 内核大小相比,这种内核大小还有助于减少参数数量。例如:对于第二个模型,3x3 内核大小的网络有 2616157 个参数要训练,而 5x5 CNN 有 3051101 个,7x7 CNN 有 3703517 个参数。

对于池图层,选择大小为 3、步幅为 2 的重叠最大池,以便提取邻近邻域中的主要特征值。这种选择是基于这样一个事实,即存在具有最小类间差异的犬种对,因此必须提取任何不同的特征值。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/bf80c4bfbfc1d49d8d56e3617bde0c05.png)

图 6:从零开始构建 CNN,你需要的只是 Zen。在 [Unsplash](https://unsplash.com/photos/MD6E2Sv__iA) 归功于 MartinSanchez。

在第二阶段,迁移学习用于提高准确性和减少训练时间。预训练的 [VGG-16](https://neurohive.io/en/popular-networks/vgg16/) 被导入,它的最后卷积输出被馈送到我们的模型。模型中添加了一个全局平均池层和一个具有 133 个节点的全连接层。

## **精致**

如上面实施部分所实验,使用迁移学习有助于提高模型准确性。但是,为了获得更高的性能并使算法更高效,有必要对模型进行微调。

导入了 Resnet50 模型的预计算功能,并向模型中添加了几个附加层:一个全局最大池层,后面是两个带有 dropout 的全连接层。最大池允许检测噪声,所以我认为它应该在类间有一些最小变化的地方表现良好。为了防止过度拟合,在两个致密层中加入了脱扣。

请注意,全局最大池层的输出有 2048 个神经元。它们被馈送到配备有 ReLU 激活功能的第一密集层,以便过滤出前 500 个相关输出。这些输出然后被送入第二个密集层“投票”,与 softmax 激活功能,最大概率的标签。

Layer (type) Output Shape Param #=global_max_pooling2d_1 (Glob (None, 2048) 0_________________________________________________________________dropout_12 (Dropout) (None, 2048) 0_________________________________________________________________dense_13 (Dense) (None, 500) 1024500_________________________________________________________________dropout_13 (Dropout) (None, 500) 0_________________________________________________________________dense_14 (Dense) (None, 133) 66633=Total params: 1,091,133Trainable params: 1,091,133Non-trainable params: 0


与之前的实验模型一样,我继续使用分类交叉熵损失和 RMSProp 作为优化器,因为它们工作得很好。

然后,具有最高精确度的模型被用于创建最终算法,该算法接受文件路径作为输入,并且首先确定是否有狗、人或者两者都没有。如果检测到狗或人,它应该分别返回预测的狗品种或最相似的狗品种。如果两者都没有检测到,将显示一条错误消息。这就是早先构建的助手功能(人脸检测器和狗检测器)发挥作用的地方。

# 四。结果

## **模型评估和验证**

每个模型被训练 20 个时期。验证集用于评估模型,并检查验证损失是否减少。如果是这种情况,模型权重用一个检查指针保存,稍后将被加载用于测试。

从零开始构建的三个模型分别报告了 7.65%、14.35%和 17.10%的准确率。从这个基准测试中,我们可以得出结论,更多的卷积层和更多的全连接层有助于提高模型精度。当添加更深的层时,在图像的边缘和形状已经被较浅的层检测到之后,该模型能够捕获高级特征。

使用 VGG 16 网络的迁移学习在测试集上报告了 42.34%的准确率。这一结果与上述分析一致,因为 VGG-16 有多达 16 层,特别是在超过 1000 万张图像上进行了预训练。

结合预训练的 Resnet50 模型和定制架构的最终模型达到了 80.14%的良好准确率。然后用它来构建最终的算法。

为了验证这种算法的鲁棒性,使用我的个人电脑中的输入图像进行了几次检查。当输入两幅猫的图像时,该模型给出正确答案,并准确预测 3/4 的狗品种。请注意,它正确地预测了布列塔尼,这是一个具有挑战性的品种。对于人类图像,结果是相当令人信服的,然而,这是应用程序的有趣部分,没有应用准确性度量。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/969a1705fdbeb11b6e308f7bae42a744.png)

图 7:模型正确预测了秋田犬。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/6d27cd61b10b3ddd2ff5118af5bb2b87.png)

图 8:马耳他人?

## **正当理由**

从零开始然后从上述部分迁移学习模型的实验表明,预训练模型对于提高模型精度非常好,但是为了达到可接受的和有效的性能,需要根据这里的具体问题进行微调。如前所述,狗的品种分类是很有挑战性的,因为数据集很大,类间的差异很小,类内的差异也很大。

使用从大数据集学习的预训练模型允许算法快速获得瓶颈特征,并且几个附加层有助于为狗品种分类任务定制它。请注意,仅添加一个密集层可能不足以获得可接受的性能(基于预训练的 VGG-16 模型的实验)。这个观察可以为下一部分的改进反思打开一个好的思路。

# 动词 (verb 的缩写)结论

## **倒影**

总而言之,该项目已经通过了以下步骤:

-问题概述和陈述

-导入数据集、浏览数据和预处理输入图像

-为最终算法构建辅助函数

-构建不同的 CNN 架构并对分类器进行基准测试

-选择最终模型,并将其集成到最终算法中

-评估和验证算法的鲁棒性

最具挑战性和最有趣的部分是从零开始构建模型。看到特定分类任务的困难,即使要求是 1%,从 0 开始创建一个给出最低精度的东西也不容易。这一部分需要我寻找文件和研究论文,但也是我学到最多的地方。在深度 CNN 中,没有比建立和实验我自己的模型更好的理解方式了。最后,结果比我预期的要好得多。

## **改进**

为了提高模型性能,有几条途径值得考虑:

*   使用更多完全连接的层:从零开始构建模型,更密集的层可能会提高模型的准确性。
*   执行数据收集或数据扩充:数据集非常小,而且类别不平衡。收集额外的图像和/或为低频率的类创建变换图像可能是个好主意。
*   为了配合有趣的用户体验目标的应用程序,这将是一个伟大的实现猫探测器,然后训练模型,以便它将输出最相似的狗!

希望你喜欢阅读这篇长文。觉得有用就拍手!

这篇博文是 [Udacity 的数据科学家 Nanodegree](https://www.udacity.com/course/data-scientist-nanodegree--nd025) Capstone 项目的一部分。完整的 Python 代码可以在这个 [GitHub repo](https://github.com/ngthianhphuong/deep-learning-dog-breed-classification) 上找到。

## 参考资料:

-亚历克斯·克里日夫斯基、伊利亚·苏茨基弗和杰弗里·e·辛顿。[“使用深度卷积神经网络的 ImageNet 分类”](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) NIPS 2012

- Quora: [在 CNN](https://www.quora.com/How-does-pooling-control-overfitting-in-CNN)) 中 pooling 是如何控制过拟合的?

- Quora: [卷积神经网络(CNN)中池化的动机是什么?](https://www.quora.com/What-is-the-motivation-for-pooling-in-convolutional-neural-networks-CNN)

# 动力不足的 A/B 测试有问题吗?试着控制你的可变性。

> 原文:<https://towardsdatascience.com/having-issues-with-under-powered-a-b-tests-try-controlling-your-variability-903748f0aefd?source=collection_archive---------23----------------------->

## 提高 A/B 测试能力的方差缩减技术概述

在研究生院,我参加了一个关于强化学习行为的会议,特别是关于实验室老鼠和实验的主题。会谈结果中让我印象深刻的一点是,实验条件几乎没有变化。这些实验中的大鼠是近亲繁殖的,具有相同的基因组成,因此任何变异都是由于没有正确控制环境(例如,在运送到实验室的过程中,大鼠意外受到刺激)或实际实验治疗引起的异常。因此,鉴于研究人员能够控制实验室老鼠的基因构成和生长环境,他们能够进行置信区间和误差线概念毫无意义的实验。这是在进行实验时控制可变性的一个极端例子,是我们大多数人在实践中无法承受的。

如果你上一门基础统计学课程,控制方差的话题很可能会出现几次。例如,你可能知道设计一个受试者内部的实验比设计一个受试者之间的实验更好。你可能还会了解到,许多想要探索基因-环境相互作用影响的纵向研究特别关注双生子研究。在更高级的课程中,你可能会学到线性混合效应模型,以及如何对实验中随机效应引起的一些方差进行建模,或者如何在进行分层抽样时对实验设计的层次性质进行建模。所有这些主题都集中在同一个问题上:如何建模和控制你的可变性,这样你就可以确保你的研究能够检测到一个真实的效果。

在进行功效分析时,您会很快了解到,您的实验功效与您在研究中的 N 个受试者的平方根成反比,这意味着它根本没有很好地成比例!因为实验包括测试可能比现状更糟糕的条件,所以依靠群体规模作为参数来增加你的力量变得非常不切实际。相反,为了增加你的能力,你有另外两个选择:1)想出更好的实验,有更大的效果大小,或者 2)想出一个方法,在不增加用户数量的情况下,减少实验中的方差。这篇文章将关注与后者相关的具体技术,并展示如何将可用流量增加一倍,甚至三倍,以进行实验。

# **技术 1:线性模型协变量调整**

控制方差最常见的选择是将非治疗效应指定为线性模型中的协变量(如果您使用 LMM 模型变量,您也可以将这些指定为随机效应)。例如,让我们假设我正在尝试估计用户多快可以完成他们的纳税。而且,假设我们有两种应用格式,我们认为我们开发的新格式比旧格式好。当我们设计实验时,我们将用户随机分为两组:新用户和老用户。此外,让我们假设我们为每个用户收集关于他们收入的信息,并且我们预计高收入的个人需要更长的时间来报税。数据结构看起来是这样的:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ec0be6e454e81e8d6761a19d38c628b2.png)

在我们的例子中,应用程序类型是治疗效果,分钟是结果,收入是我们有幸测量的协变量。请注意,这里我们假设所有启动报税应用程序的用户最终都会完成它。如果不是这种情况,你就必须在实验任务执行之前收集现有的协变量。我们方程的一般形式变成这样:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ac768520e2edee1fb37cd1b5922e4d0d.png)

*   y 代表目标结果(分钟)
*   z 是治疗变量(应用类型)
*   **X** 是协变量的矩阵(我们只有收入,所以是向量)
*   δ我们试图估计的效果大小(新的应用程序格式快了多少)
*   **θ** 和θ_0 是截距和协变量的参数

让我们假设我们有以下条件:

*   每组 100 名用户
*   预计起飞时间为 2 分钟。换句话说,我们想设计一个足够强大的实验来检测 2 分钟的改善。

如果我们仅对治疗效果进行简单的 OLS,我们会得到以下结果(注意,这些结果等同于样本间 t 检验)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d28fd993df3cd7c01b5c092935bbcf8b.png)

这些结果来自一次运行,所以信息不多。如果我们引导我们的实验,我们应该期望我们的效果看起来像这样:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4de62e6e6f64d3ee234c4dd3cd629fa6.png)

蓝线代表预期的效果大小。橙色线是没有效果的时候。

我们可以立即注意到,在我们的许多自举实验中,当它存在时,我们未能检测到它。当我们将收入作为协变量加入模型时会发生什么?下图显示,将收入作为协变量有助于减少方差,从而提高实验的功效。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d1019854e52db0864d1411b09d01883b.png)

虽然这可能是个好消息,但在实践中,我发现由于需要满足许多假设,正确构建线性模型非常具有挑战性。例如,如果结果数据不是线性的,协变量可能不会在输出变量的范围内均匀地减少方差。例如,我模拟的收入和分钟数之间的实际关系不是线性的,但是 OLS 模型中指定的公式并不知道这一点。这将导致一些地方的方差被低估,而另一些地方的方差被高估,从而使得出相关结论变得更加困难。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ed5c516d01d8616aca7fda229450ae23.png)

# **技术 2:使用预实验数据的受控实验(CUPED)**

控制方差的另一种选择在[邓等人的论文中描述。al (2013)](https://www.exp-platform.com/Documents/2013-02-CUPED-ImprovingSensitivityOfControlledExperiments.pdf) 简称 CUPED。他们从蒙特卡罗模拟中使用的控制协变量中借用了这一思想。在这种方法中,我们可以注意到以下关系:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/90a219f770d1da81091b18415a2075b7.png)

Y_hat 表示 E(Y)的无偏估计量。给定适当的θ,θE(X) + θE(X)应该相互抵消,因为我们假设在实验处理之前,组间协变量的影响是相同的。这个等式基本上是说,这个新的控制变量结果具有与实际结果相同的期望值。接下来,我们计算控制变量的方差。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/f436606bb3de9d7107800e95f4478064.png)

方差方程允许我们看到,当θ如下时,无偏控制变量的方差将最小化:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2eabe7c2676c3f9a6b779a0bf6974dff.png)

所有这些都可以用几行非常简单的代码来编写:

结果如下:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/6b5fe7d1711be9e6f175b382dab1b6e7.png)

在我们的实验设置中,CUPED 的表现与线性协变量法大致相同。这种方法非常优雅,尽管当有多个协变量时,它的表现如何还不完全清楚。如果我们有多个相关的协变量,我们将不得不生成这些协变量的一维汇总,这可能会导致信息的丢失。此外,仍然需要保持结果和协变量之间的线性假设。

# **技巧 3:非参数模型协变量调整**

这项技术在某种程度上是技术 1 的延续。这不是我在其他地方完全探索和看到的技术,所以欢迎建议。您可以注意到,到目前为止,我们所做的只是使用不同的方法测量方差,然后对总方差进行调整。自然的问题是,既然现实世界中有以下场景,我们为什么要使用参数模型来实现这一点:

*   我们可以有多个协变量
*   我们可以有协变量之间的相互作用
*   我们可以有非线性数据
*   我们可以有缺失数据的协变量

我们知道非参数模型在减少数据偏差方面会更好,所以我试验的一种技术是用随机森林模型代替 OLS 模型。为了获得无偏的预测,我所做的唯一改变是使用我的模型中的袋外分数。请参见下面的代码片段。

自举实验的输出可以在下面找到:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/bc0b743b489387140c5a6ea57f7cb1e9.png)

使用随机森林模型来消除由协变量引起的方差似乎确实有效,尽管效果比其他方法稍小。我的直觉表明,这可能是因为 OOB 估计包含大量的方差,因为样本量非常小(两组总共 200 个观察值),所以很难建立非参数模型来很好地概括他们的 OOB 分数。

# **结果汇总**

我的实验设置有点琐碎,因为我选择了一个与结果高度相关的协变量。正因为如此,我们将看到大量的方差减少。具体来说,我在方差减少和 0.8 幂的主体要求中看到了以下内容(我使用自举方差的平均值进行幂计算)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/1b303f39ce40d323de871e4a690e05a7.png)

# 结论和警告

在数据驱动的组织中,以最小化流量需求的方式执行实验至关重要。我上面描述的任何一种方法都可以用来在拥有相同流量的情况下有效地将实验数量增加一倍或两倍。尽管如此,每种方法都需要知道协变量相对于实验结果的表现,当可用的实验数据太少,并且模型无法用于正确消除方差时,一些方法可能不起作用。

# 他死了,她糟透了

> 原文:<https://towardsdatascience.com/he-dies-she-sucks-b4a8ac18cb73?source=collection_archive---------52----------------------->

## Spotify 上歌曲的性别和语言分析

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/bcf45ea039c7923c74c0bb70cf40983d.png)

埃里克·诺帕宁在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片

他死了。她很好。他跑了。她在吮吸。

在娱乐界,男人和女人被描绘得非常不同。他们说话的方式,他们是如何被描绘的,以及他们如何相互影响,都是由性别决定的。

一个突出的例子与[大屏幕](https://pudding.cool/2017/08/screen-direction/)有关。早在 2017 年,Julia Silge、Russell Goldenberg、Amber Thomas 和 Hanah Anderson 就按性别对 2000 多个好莱坞剧本进行了舞台指导。他们发现,女性更有可能被指示依偎、傻笑和尖叫,而男性则更有可能被指示系皮带、飞奔和嚎叫。

这种差异,无论是在舞台上还是在舞台之外,都有意无意地塑造了人们的观点,往往强化了刻板印象和现有的权力结构。鉴于这种暗示的重要性,我决定对歌词进行类似的分析。

为此,我使用了 Spotify top 200 列表,其中包含了自 2017 年以来每天播放量最高的 200 首歌曲。我使用 Genius API 获得了超过 90%的这些歌曲的歌词,并且我手动获得了超过 95%的艺术家的性别(大约 3%的乐队既有男性也有女性)。

我想探索的歌曲的第一个方面是“她”和“他”的相对使用的表现。起初,我惊讶地发现“她”这个词比“他”用得更频繁。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/dafbb86fb6c428e3a3a80c872549473e.png)

作者图片

鉴于媒体和娱乐界经常出现男性过多的问题,我本以为会出现均等,甚至是不相称地使用“他”这个词。

然而,这一发现在歌曲的背景下是合理的,歌曲通常将浪漫和欲望集中在异性身上。我们实际上可以在数据中很清楚地看到这一点:男性更有可能使用“她”这个词(80%的时间),而女性使用它的时间不到一半(47%)。

这似乎是因为“她”这个词的使用频率要高得多,因为在前 200 名艺术家中,男性占了绝大多数。自 2017 年以来,名单上只有 16%的艺术家是女性。这就是男性在媒体中的过度表现抬头的地方。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2b5f30ccc83bd9f18dbb691e63575afd.png)

作者图片

然而,我的兴趣并不是揭示流行音乐中男性过多的现象。相反,我想看看歌曲本身是如何描写男人和女人的。为此,我把注意力集中在“他”和“她”后面的单词上

如果不删除所谓的“[停用词](https://nlp.stanford.edu/IR-book/html/htmledition/dropping-common-terms-stop-words-1.html)”就绝对这么做,是没有意义的。像*得了*、*得了*、*表示*这样的词在“他”和“她”这两个词都占据了榜单。

去掉这些没有信息的文字后,一个更有趣的画面出现了。像*告诉*、*离开*和*死去*这样的词对“他”来说是最常见的,分别占与“他”相关的词的 3.5%、2%和 2%。*爱*、*坏*、*告诉*排在首位的为“她”(4%、3%、2.5%)。

这本身就很有趣。然而,一个更有见地的方法是西尔奇首创的:查看相对可能性。例如,如果单词*死亡*在歌曲中出现在“他”旁边 3 次,在“她”旁边 1 次,我们会说“*他死亡*”比“*她死亡*”多 3 倍

这样做证明了我从哪里得到这个标题的灵感:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8651ed19430d62778bcdbcd4006879c1.png)

作者图片

与女性相比,男性死亡、说话或死亡的几率是女性的 32 倍。他们也更有可能睡觉、跑步和做爱。另一方面,女性变坏、做爱和恋爱的可能性是男性的 16 倍。他们也更有可能吮吸/被吮吸,骑,并呼吁。

其他性别代词也是如此。比如“他”之前的话一般都比较暴力(*射*、*杀*、*爆*),而“她”之前的话一般都是性或者跟钱有关的(*买了*、 *f*cked* 、*摸*)。有一些明显的例外。例如,“*夸他*”出现在歌曲中的可能性是“*夸她*”的 32 倍左右,而“*打她*”出现的可能性是“*打他*”的 10 倍以上。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c312f330fb5efb1992e7888f99141d40.png)

作者图片

“他的”和“她”的情况类似然而,与其他男性代词相关的词相比,歌曲中“他的”后面的词不那么暴力,占有欲更强(*金钱、时间、嘘)*),女性代词再次变得性欲超强,像 *p*ssy* 、*膝盖*、*舌头*,甚至*脚趾*这样的词高居榜首。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/d5c678faf6d573c16b0c9e077df574fa.png)

作者图片

这样的发现几乎不需要分析。正如大多数人所料,女性被性别化,而男性要么被描述为更暴力,要么更有可能遭受暴力。

数据中一个有趣的问题是,这些相对可能性对于男性和女性艺术家有什么不同。

不出所料,考虑到前 200 名中男性的普遍存在,关注他们主要反映了总体发现。也就是说,值得指出的是,当只看男歌手的歌曲时,女性变得更加性感,男性变得更加 T2 化。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/57cbee7d83da03b330e1059e5b9e7075.png)

作者图片

这与女艺术家截然不同。像*死*和*死*这样的词对“他”来说消失了,像*吸*和*骑在*上的词对“她”来说消失了取而代之的是对男性而言的*甜蜜*和*睡眠*以及对女性而言的*不好*和*炫耀*等词汇。换句话说,女性不太可能将自己性感化,也不太可能将男性与暴力联系在一起。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8fb8bd366be9e84aea02b139a09e9fc5.png)

作者图片

最终,我的发现是微妙的。的确,在流行音乐中,女性与肉体和性联系在一起,而男性则与暴力和财产联系在一起。然而,艺术家性别之间存在异质性。排名靠前的发现是由男性推动的,他们目前在排名前 200 的艺术家中占了绝大多数。另一方面,女性对男性和女性同胞的唱功非常不同:不那么暴力,也不那么性感。

事实上,所有这些都导致了与西尔格得出的结论相似的结论——如果当女性艺术家开始在 200 强名单中占据更大比例的艺术家份额,我们可能会看到男性死亡和女性吮吸的歌曲越来越少,而男性付出和女性滴下的歌曲越来越多。

# 基于 Hopenet 的头部姿态估计

> 原文:<https://towardsdatascience.com/head-pose-estimation-with-hopenet-5e62ace254d5?source=collection_archive---------29----------------------->

## 一种直接估计头部姿态的深度学习方法。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/0e17647e00092eb508d07f6fba4c7d20.png)

Hopenet 展示了艾德·希兰演唱的歌曲“[大声说出想法](https://youtu.be/f6Cswdm601A)”。

# 一.动机

在计算机视觉领域有许多有趣的研究。我们已经看到了物体检测、人脸检测、面部识别、光学字符识别(OCR)等许多方面的惊人进步。在学习人脸检测的时候,我遇到了一个关于头部姿态估计的研究领域。在这篇文章中,我想与你分享我所学到的东西。更具体地说,我将从讨论头部姿态估计开始。然后,我将讨论一种由 Nataniel Ruiz、Eunji Chong 和 James M. Rehg 介绍的深度学习方法,称为 Hopenet。

> **免责声明:**本文假设你已经熟悉深度学习中的 CNN 概念。

# 二。头部姿态估计

## 什么是头部姿态估计?

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c7cb26c3e4124448b67a12ee58a1ae74.png)

图 1:说明三个欧拉角的图表。

顾名思义,计算机视觉中的头部姿态估计研究侧重于预测图像中的人类头部姿态。更具体地说,它涉及人类头部欧拉角的预测。欧拉角由三个值组成:偏航、俯仰和滚动。这三个值描述了对象在 3D 空间中的旋转。通过准确预测这三个值,我们可以计算出人的头部朝向哪个方向。拥有一台能够计算出人类头部朝向哪个方向的计算机提供了许多有用的应用。例如,它可以用来绘制 3D 对象,以匹配人类头部的方向,类似于抖音,Snapchat 和 Instagram 过滤器中看到的那些。此外,它还可以用于自动驾驶汽车,以跟踪驾驶员是否专注于道路。

> **注:**你可以参考这个由 Udacity 提供的 Youtube [视频](https://youtu.be/q0jgqeS_ACM)进行欧拉角的互动讲解。

## 用来估计头部姿势的不同技术有哪些?

> **注意:**头部姿态估计中的许多方法假设面部检测作为初步步骤。首先,检测人脸,然后才能估计头部姿态。

有两种主要的方法用于估计头部姿态。一种方法包括估计面部标志的中间步骤。面部标志然后被映射到人类头部的 3D 模型上。将创建的 3D 界标与相机的信息(如图像中的焦距、失真和光学中心)相结合,可以使用数学公式来计算人类头部的偏航、俯仰和滚动值(Mallick,2016)。然而,这种方法有一些缺点。根据 Ruiz,Chong 和 Rehg (2018),这种方法的性能严重依赖于面部标志预测的性能、3D 头部模型的代表性以及用于完成估计的数学模型。

另一种方法是直接预测偏航、俯仰和滚动值,而不必首先估计面部标志。这就是 Hopenet 的创建者所采取的方法。通过跳过面部标志估计步骤,这种方法有可能变得更鲁棒、更快速、更准确(Ruiz,Chong 和 Rehg,2018)。Ruiz,Chong & Rehg (2018)的工作并不是这种方法的唯一尝试。剑桥大学的一个团队也提供了这种头部姿态估计的直接方法(杨,牟,张,,Gunes 和 Robinson,2015)。Ruiz、Chong 和 Rehg(2018)的工作与其他尝试的主要区别在于使用了一个多重损失函数,这将在下面讨论。

# 三。希望网

> **注:**Hopenet 的创建者慷慨地开源了他们在 PyTorch 中的实现,你可以在这里找到。本文中显示的代码片段是我自己在 Keras 中的实现。我尽我所能根据自己的理解重新创作了他们的作品。虽然我无法复制 Nataniel、Eunji 和 James 的论文中显示的完全相同的结果,但我相信这些代码片段对您创建自己的“从头”实现他们的工作是有用的。此外,我决定不解释 Hopenet 的培训过程,因为我认为这篇文章已经为你如何进行培训提供了一个清晰的指导方针。

## 网络架构

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/9c666163de48a66efc017a23539f79b3.png)

图 Hopenet 架构的简图。

Hopenet 的架构由两个主要部分组成:一个主干网络和三个使用 softmax 激活的全连接层(每个欧拉角一个)。三个完全连接的层共享同一个主干网络。请务必注意,来自完全连接层的每个欧拉角的输出不是单个值。相反,它是一个大小为 *num_bins* 的向量,这是您必须设置的网络的超参数。所以,如果你决定选择 *num_bins* 作为 *n* ,那么将会有三个输出向量,它们的大小都是 *n* 。角度的输出向量中的值表示该角度落入该条柱的概率。在他们的论文中,创造者展示了两种不同主干网络的性能:ResNet50 和 AlexNet。他们已经证明,与 AlexNet 相比,使用 ResNet50 作为主干网络会产生更好的结果。即使在他们的论文中,Hopenet 的创建者仅使用 AlexNet 和 ResNet50 作为主干层,也可以使用任何其他 CNN(Ruiz,Chong,& Rehg,2018)。

下面是用 ResNet50 作为主干层重新创建 Hopenet 网络的代码片段。值得注意的是,与 AlexNet 相比,ResNet50 的训练时间要长得多,因为它是一个更大的网络。

以 ResNet50 为骨干网构建 Hopenet。注意,偏航、俯仰和滚转有三种不同的损失计算。

> **注:** [这里的](https://github.com/OverEuro/deep-head-pose-lite)是 Hopenet 的开源实现,使用 ShuffleNet 作为主干网络。

## 多损失损失函数

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ddcda5465679ddd8eb18881de1c761f9.png)

图 2: Hopenet 的多损损失函数。从我的理解来说,alpha 是用来强调回归损失值的变化。

每个欧拉角有三个不同的全连接层,可以分别优化每个角度的损耗(Ruiz,Chong & Reh,2018)。每个角度的损失由两部分组成:分类损失和回归损失。创建者使用交叉熵作为分类损失,使用均方误差作为回归损失。根据 Ruiz、Chong 和 Rehg (2018 年):

*这种方法背后的思想是,通过执行 bin 分类,我们使用非常稳定的 softmax 层和交叉熵,因此网络学习以稳健的方式预测姿态的邻域。通过三个交叉熵损失(每个欧拉角一个),我们有三个信号反向传播到网络中以改善学习……然后我们向网络添加一个回归损失,即均方误差损失,以改善细粒度预测。* (Ruiz,Chong,& Rehg,2018,第 3 页)

下面的代码显示了如何为每个欧拉角定义损失函数。

Hopenet 的多重损失计算。

# 动词 (verb 的缩写)结论

最后,我希望这篇文章能帮助你理解头部姿态估计领域的一些关键概念,并让你了解 Hopenet。也就是说,我也希望这篇文章能激发你对头部姿态估计的兴趣,并促使你对这个主题进行进一步的研究。

*喜欢这篇文章并想表达你的支持?关注我或给我买咖啡*

[![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/69716627feab2505c60838bbd29241a9.png)](http://buymeacoffee.com/socretlee)

# 参考

Mallick,S. (2016 年 9 月 26 日)。*基于 OpenCV 和 Dlib 的头部姿态估计。*学习 OpenCV。检索自[https://www . learnopencv . com/head-pose-estimation-using-opencv-and-dlib](https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/)

Ruiz,Chong,e . Rehg,m . j .(2018 年)。无需关键点的细粒度头部姿态估计。*IEEE 计算机视觉和模式识别会议(CVPR)研讨会,2018 年,第 2074–2083 页*。从 https://arxiv.org/abs/1710.00925[取回](https://arxiv.org/abs/1710.00925)

杨,h,牟,w,张,y,,I,Gunes,h .,& Robinson,P. (2015)。头部姿态估计辅助的人脸对齐。从 https://arxiv.org/abs/1507.03148[取回](https://arxiv.org/abs/1507.03148)

魏,J. (2019)。 *AlexNet:挑战 CNN 的架构*。走向数据科学。检索自[https://towards data science . com/Alex net-the-architecture-that-challenged-CNNs-e406d 5297951](/alexnet-the-architecture-that-challenged-cnns-e406d5297951)

# 变压器模型中的头部修剪!

> 原文:<https://towardsdatascience.com/head-pruning-in-transformer-models-ec222ca9ece7?source=collection_archive---------22----------------------->

## 在这篇文章中,我们将研究如何在像伯特这样的变形金刚模型中修剪注意力。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/6e3f1e3181d893792d61ef05648302a5.png)

阿瑟尼·托古列夫在 [Unsplash](https://unsplash.com/s/photos/transformer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) 上的照片

概述:

*   **本文背景作品**。
*   **注意力头**和**的重要性为什么需要修剪**。
*   **识别重要头部**及其**头部**功能**。**
*   **如何修剪头部?**
*   修剪如何影响 **BLEU 分数**。
*   **用于分析的剪枝**

# 背景工作

简单回顾一下,这是基本的变压器模型

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/7ac296d30e46201322613b6d40ef08c3.png)

变压器的模型架构,(图片来源:图 1 和图 2 来自[)你所需要的就是注意力](http://papers.nips.cc/paper/7181-attention-is-all-you-need.pdf)

从上图可以看出,变压器有**三种**注意力实现方式,分别是:
-多头注意力**编码器**、
- **屏蔽**多头注意力**解码器**、
-多头注意力**编码器-解码器**

每个 MHA 由几个**缩放的点积**注意力头的**串联**组成,这些注意力头在**并行**中运行,不像递归网络,这就是为什么注意力比几乎所有的 rnn 都好。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/cc5b502dbc7c67793ea4d9cd26ddfcff.png)

每个头是**查询的注意函数,键和值**带有可训练参数 **(Wᵢᵩ、Wᵢᵏ、Wᵢᵛ)** 。

# 注意力集中的重要性

**MHA** 的所有 **3 种**都以不同的方式发挥着特定的重要作用。

*   **编码器 MHA** 包含自我关注层,这里所有的参数即查询、键和值都来自同一个地方,在这种情况下,是先前的编码器或输入向量序列。
*   **解码器屏蔽 MHA** 屏蔽掉该特定字之后的所有字,这表明解码器中的每个位置都基于序列的**先前输入**,该**模仿**序列中的**编码器-解码器机制来对递归**模型进行排序。
*   在**编码器-解码器 MHA** ,**查询**来自被屏蔽的 MHA 的向量,然后将其与来自顶部编码器的**密钥和值**向量组合。这种整体结构允许基于先前的输入产生有效的结果。

自我关注在 MHA 是变压器的关键组成部分,因为 MHAs 依赖于关注头,对他们来说准确是很重要的,依赖于**多个头可以提高**效率达 **1 BLEU** 分数。

# 为什么修剪?

在 [***论文***](https://arxiv.org/pdf/1905.09418.pdf) **,**中作出了令人惊讶的观察,即使在正常训练模型(具有所有头部)之后,许多头部可以在**测试时间**被**移除**,并且它将**不会显著影响 BLEU** 分数,事实上,在一些情况下移除少量头部导致 BLEU 分数提高。

# 识别重要负责人

为了从 MHA 中检测重要的头,为了去除不太重要的头,我们可以使用许多方法,如头的**或**逐层相关性传播(LRP)** 。**

**![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/c9651c52b789669987b421247dda0845.png)**

**图片来源:图 1 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)**

****置信度**是一种比 LRP 相对简单的方法**,它包含了其**最大注意力权重**的平均值,其中平均值是对用于评估的一组句子取的,它是翻译的一个重要**考虑因素。**

**从这个图中可以看到,几乎**模特 80%** 的注意力都给了**单令牌头**。**

**LRP 比“信心”更可靠。这有助于找到头部**网络**中头部的**相对贡献**。**

**![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3fa2f1f6b0a7d41fc465c51e2bcadbca.png)**

**图片来源:图 1 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)**

****置信度和 LRP 都用于**检测重要头部**,从上图可以看出,LRP 和置信度显示的结果几乎相同。那么,现在我们知道了哪些头部是重要的,让我们来看看它们的作用。****

# ****头部功能****

****在变形金刚的 MHA 中,每个头部都在影响模型产生的翻译中发挥作用,这些是头部可能执行的功能:****

*   ******位置**:在此,头部指向**附近的令牌**,下图中以紫色显示。****
*   ******句法**:指向句子中的**特定关系**,以绿色显示****
*   ******生僻字**:此处指向最不常用的**或生僻字**,以橙色显示。****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2fc5a23166e191d4d7ee2c79741ab926.png)****

****图片来源:图 1 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)****

****从这些头函数中,很明显**某些头**比其他头更准确地检测和学习**句法关系。******

****这也支持了一个假设,即编码器确实支持句子中一定量的**句法歧义消除**。****

# ****如何修剪头部?****

****在原始变压器中,正如我们在背景工作中看到的,MHA 由下式给出:****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2c2dab3edf48321b27733765cea4fab3.png)****

****为了去除不太重要的磁头,我们通过使用特定的门 g **ᵢ** 来修改等式:****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4095747accb6ee5b9cf3082ca546859f.png)****

****其中 g **ᵢ** 在 **{0,1}** 之间,如果 g **ᵢ** 为 1,那么在拼接时我们考虑**的所有注意力**否则如果 g **ᵢ** 为 0,那么我们就**修剪**它。****

****因此, **gᵢ是一个可学习的参数**,并且独立于输入序列,因为我们想要为此修剪头部,我们理想地将 **L0 正则化**应用到标量门 g **ᵢ** 。 **L0 范数**等于非零组件的数量,并强制模型移除不太重要的头。****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/f73b1ca8651bae7b82eded7b081aab7b.png)****

****重要头部的模型聚合(图片来源:来自[头部故事](https://lena-voita.github.io/posts/acl19_heads.html)的莉娜·沃伊塔)****

****这个模型得到收敛,最后,头部被完全移除或者保持打开,这意味着我们只使用所有注意力头部的子集。****

# ****BLEU 评分****

****移除头部后,让我们看看它如何影响模型的 BLEU 分数,从下图中可以看到,当将模型从 **48 个头部压缩到 10 个头部时,BLEU 分数**几乎没有下降 0.25** **BLEU** 。******

**![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/a18d263d937b8d7d15f3388b6758263b.png)**

**图片来源:图 7 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)**

**这篇[论文](https://arxiv.org/pdf/1905.09418.pdf)展示了在两个数据集**【WMT】**和 **OpenSubtitle** 上执行的头部修剪。如上图所示,BLEU 分数根据使用的注意力头部来标注。**

**令人惊讶的是,在 WMT 数据集的情况下,在移除几个头部后,我们可以看到 BLEU 分数的**增量**,当我们将头部从 5 个减少到 1 个时,BLEU 分数**急剧减少**。这些观察结果表明,我们只需要**几个头(5–10)**就可以用基本模型取得有竞争力的结果。**

# **用于分析的修剪**

**变压器由三个 mha 组成,如背景工作中所述。这些 MHA 是:
(a)编码器 **的多头注意(MHAs】屏蔽**解码器 **的多头注意** (c)编码器-解码器**的多头注意****

****所有这些 MHA 包含了多个头部的连接。头部修剪可以发生在这些 mha 中的任何一个。据观察,模型**更倾向于首先修剪编码器**自关注头,而**编码器-解码器 MHA** 在两个数据集之间似乎是**重要的**。显然,没有编码器-解码器 MHA 翻译任务是不可能的。如下图所示,在这两种情况下,不太重要的磁头都来自编码器 MHA。****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/4f9b91d7340f05eb8f4248648e11dc0c.png)****

****图片来源:图 9 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)****

****另一个观察结果是,MHA 的头部功能即使在修剪后仍然保留。当修剪 5-6 个头以下的模型时,由于头的数量较少,只有**几个头**必须执行**几个功能**然后它们也被保留。****

****![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/2c7deb63f1f27fcf85cb7dd188a4d6fe.png)****

****图片来源:图 8 来自[分析多头自我关注](https://arxiv.org/pdf/1905.09418.pdf)****

****我希望这篇文章增加了你对 MHA 和修剪头部更好的效率的了解。****

# ****参考****

*   ****人头的故事:([贴](https://lena-voita.github.io/posts/acl19_heads.html))****
*   ****分析多头自我关注:([原文)](https://arxiv.org/pdf/1905.09418.pdf)****
*   ****十六个头真的比一个好吗?:([原文)](https://arxiv.org/pdf/1905.10650.pdf)****
*   ****关注就是你需要的全部:([原文](https://arxiv.org/pdf/1706.03762.pdf))****

> *****感谢阅读,您可以在*[*LinkedIn*](http://linkedin.com/in/gauravghati/)*[*Twitter*](https://twitter.com/GauravGhati/)*或我的* [*作品集*](http://gauravghati.world/) 上与我联系*****

# 标题文章分析和自然语言处理

> 原文:<https://towardsdatascience.com/headlines-articles-analysis-and-nlp-4013a66dbac?source=collection_archive---------24----------------------->

## 使用 NLP 查看 2020 年 1 月至 7 月《纽约时报》文章标题中提到最多的单词。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/e8989ab4127f7309722749f2282baa35.png)

图 1——由[威利·海德尔巴赫](https://pixabay.com/pt/users/wilhei-883152/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=705667)在 [Pixabay](https://pixabay.com/pt/?utm_source=link-attribution&utm_medium=referral&utm_campaign=image&utm_content=705667) 上拍摄的图像

据世卫组织介绍,2020 年 12 月 31 日,中国武汉首次报道了冠状病毒。2020 年 3 月 11 日,世卫组织宣布乔维德为疫情。新冠肺炎相关的时间表可以在[这里](https://www.who.int/news-room/detail/29-06-2020-covidtimeline)查看。

可以想象,从 2020 年 1 月到 7 月,**冠状病毒*、*** **病毒、**和**疫情**这几个词被引用的次数最多。但是在同一时期有多少其他的相关呢?我们如何分析它们?

为了回答这些问题,我选择了一个来源和两个工具:

-来源:**纽约时报**报纸选取 2020 年 1 月至 7 月的文章标题。
-工具:自然语言工具包( **NLTK** ),一个用于处理自然语言处理的 **Python** 库( **NLP** ),以及 **Tableau** ,一个可视化分析平台。

## **获得报纸头条**

首先,我需要创建一个包含报纸标题的数据库。在一些方法中,我选择了纽约时报,因为他们的文章很重要,他们在疫情的报道,因为纽约是世界上受影响最大的城市之一,还因为它的文章搜索 API。

**API**(*应用编程接口*)可用于编程访问纽约时报数据。首先,有必要创建一个 API 键,用它可以搜索自 1851 年以来的文件、畅销书列表、电影评论等等。你可以看到这个网站[这里](https://developer.nytimes.com)。

我创建了我的 API 键,我的目标是获得指定时间段的标题,这样,我创建了如下所示的数据库:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/ebc37c62e9e224f281dbc935ebaf06fd.png)

图 2—作者提供的图片。标题文章数据库

上图显示了截至 7 月 31 日的数据库中的前几行。

## 自然语言处理

> "自然语言处理(NLP)是使用计算机理解人类语言的领域."

*摘自:阿鲁姆甘,拉杰什;Shanmugamani,Rajalingappaa。“用 Python 实际操作自然语言处理。*

自然语言处理是对语言处理的研究。使用 NLP 的一些应用:

*   搜索
*   分析情绪
*   识别命名实体
*   翻译文本
*   检测垃圾邮件

## NLTK

**自然语言工具包** (NLTK)是一个 Python 库,用于处理自然语言处理(NLP)任务,如分割单词或短语,以执行高级任务,如解析和文本分类。

在这项工作中,NLTK 被用来分割报纸文章标题中的单词,然后检查哪些是最常用的。

以下代码是针对一月份描述的,同样的原则也适用于其他月份。要访问所有代码,你可以访问 GitHub 上的[我的资源库](https://github.com/ssilvacris/coffee-and-code/blob/master/newspaper_nlp.ipynb)。

## 库和数据集

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import nltkmonths_df = pd.read_csv(‘months.csv’, parse_dates=True, index_col=’date’)

months_df.info()


## 安装 NLTK 模块

nltk.download()


## 探索性数据分析

我需要分析和整理所有的标题。首先,我将把每个标题连接成一个字符串。然后,字符串将被拆分成一个列表,其中每个单词都是一个列表项。

join the strings of every row

sentences_jan = jan_df[‘headline’].str.cat(sep = ‘’)


## 标记化

从短语中提取关键短语用于研究应用是自然语言处理的应用之一,最小的文本单位是单词。我使用函数 *word_tokenizer()* 到根据标点符号(如空格和逗号)将句子分割成单词。

from nltk.tokenize import word_tokenize
tok_jan = word_tokenize(sentences_jan)


## 删除标点符号和停用字词

标点符号将只是符号化的噪音已被删除。然后是那些从头条上删除的:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/f6a908e1f736dfc0a7770051ab9b53f0.png)

停用词去除是 NLP 应用程序常用的预处理步骤,用于去除英语中的常用词,如 *it* 、 *is* 、 *he* 等。我还过滤了所有长度大于 3 的单词。

import string
string.punctuationtok_jan = [char for char in tok_jan if char not in string.punctuation]from nltk.corpus import stopwords

remove stopwords

stop = stopwords.words(‘english’)
tok_jan = [token for token in tok_jan if token not in stop]# remove words less than three letters
tok_jan = [word for word in tok_jan if len(word) >= 3]


去掉标点和停用词后,列表只剩下 **27209** **词** (token)。对于下一个情节,选择了前 100 个被引用最多的词。

## **查看每月被引用最多的词**

我们可以生成一个单词云,根据单词的大小直观地显示标题中最常用的单词。

!pip install WordCloud
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
from PIL import Imageplt.figure(figsize=(20,20))wc = WordCloud(max_font_size=50, max_words=100, background_color=”white”)
wordcloud_jan = wc.generate_from_text(‘ ‘.join(tok_jan))plt.imshow(wordcloud_jan, interpolation=”bilinear”)
plt.axis(“off”)
plt.show()


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/8f4cb14e08dd4ad604fe555183cb9bfa.png)

图 3 —作者提供的图片。一月到六月的词云

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2020/raw/master/docs/img/3fc4a9cbefd54c14dfce8a3dd3a164a2.png)

图 4 —作者提供的图片。七月的文字云

这样,我们可以很快看到哪些单词在这七个月中出现的频率增加了。

## 获得单词的频率分布

对于下一个情节,选择了前 50 个被引用最多的词。

import operator
freq_dis_jan={}
for tok in tok_jan:
if tok in freq_dis_jan:
freq_dis_jan[tok]+= 1
else:
freq_dis_jan[tok]=1

We want to sort this dictionary on values ( freq in this case )sorted_freq_jan = sorted(freq_dis_jan.items(), key=operator.itemgetter(1), reverse=True)

print(sorted_freq_jan[:25])
plt.figure(figsize=(10, 5))
Freq_dist_nltk=nltk.FreqDist(tok_feb)
Freq_dist_nltk.plot(50, cumulative=False)


![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgitee.com%2FOpenDocCN%2Ftowardsdatascience-blog-zh-2020%2Fraw%2Fmaster%2Fdocs%2Fimg%2Fcd05268b03fd84dee76b39a0b91501d8.png&pos_id=img-t93OO6pL-1728576920619)

图 5—作者提供的图片。一月至六月的词频分布

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgitee.com%2FOpenDocCN%2Ftowardsdatascience-blog-zh-2020%2Fraw%2Fmaster%2Fdocs%2Fimg%2F492b371ac0981ecc8d786a12a93d547f.png&pos_id=img-32FKwuG8-1728576920619)

图 6 —七月词的频率分布

## 词语关联性的变化

为了以动态的方式查看单词引用数在几个月内的变化,我使用了数据可视化软件 **Tableau** 。
有一些噪音,比如“新”这个词,没有包含在停用词列表中。所以我把它从单词列表中删除,并创建了一个动画图表。接下来的情节,选择了前 23 个被引用最多的词。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fgitee.com%2FOpenDocCN%2Ftowardsdatascience-blog-zh-2020%2Fraw%2Fmaster%2Fdocs%2Fimg%2F33b52d8e617193d6082d241052136094.png&pos_id=img-v6GpQTHD-1728576920619)

图 7—作者提供的图片。图表动画

请注意“ ***冠状病毒****这个词在 2 月(275 年)到 3 月(811 年)世卫组织建立疫情期间出现了大量的头条引用。*

*另一个观察是,乔治·弗洛伊德于 5 月下旬去世后,单词“*”在 6 月成为第二名。”***【Floyd】***也出现在 6 月份的第一份名单中。**

**最后,随着美国总统大选的临近,我们可以看到“ ***川普*** ”这个词在 7 月变得越来越重要。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值