TowardsDataScience 博客中文翻译 2019(三百三十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

2019 年机器翻译峰会印象、总结和笔记-第二部分

原文:https://towardsdatascience.com/machine-translation-summit-2019-impressions-summary-and-notes-part-ii-2d7acce804ec?source=collection_archive---------32-----------------------

这是最近在都柏林举行的机器翻译会议之后,我撰写的文章的第二部分。

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

Machine translation enthusiasts overran Dublin’s DCU campus for a week.

点击这里查看我的第一部分帖子中的介绍、会议摘要以及第 1-3 天会议的笔记。

让我们直接进入会议内容的其余部分。

会议第 4 天——研究讲座

“NMT 建筑的内在近邻分析”

by gha der&MonzT8【论文在此】

目前还不清楚 NMT 编码器在隐藏状态表示中实际捕捉到了什么样的语言信息。早期的工作通过观察这些向量中的信息是否可以用于各种句法分类任务(例如,预测语态、时态和词性)来研究 NMT 模型的隐藏状态。在这里,作者也检查编码器隐藏状态,但是通过检查隐藏状态和单词嵌入之间的相似性来直接进行,而不是通过使用它们作为分类器的输入来间接进行。

一个特别有趣的话题是——一个单词的编码器隐藏状态与其原始输入嵌入有何不同?据推测,与输入嵌入相比,编码器隐藏状态捕获了更多的上下文信息。但是这个额外的上下文信息到底是什么,对于 rnn 和 tnn/Transformers 有什么不同吗?除了输入嵌入已经获取的信息之外,还获得了哪些额外的信息?为了回答这些问题,本文使用最近邻方法来比较隐藏状态词表示和输入词嵌入。

该技术的核心是获取单词的隐藏状态表示,并计算 n 个最近邻单词的列表。然后,检查最近邻列表与以下内容的重叠程度:

  1. 基于相应单词嵌入的单词最近邻列表
  2. 由 WordNet 词汇数据库记录的同义词和相关词的列表

从他们的论文中找到邻居列表的例子:

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

作者表明,单词的隐藏状态表示与它们的输入表示非常不同——大多数隐藏状态邻居列表没有被基于嵌入的列表覆盖。然而,隐藏状态确实捕捉了更多的 WordNet 关系。

最后,作者进行了实验来比较在 RNN 和 TNN 编码器的隐藏状态中发现的信息。发现的主要见解是:

  • 转换器隐藏状态更好地捕捉词汇语义(词义)
  • 而 RNN 隐藏状态更擅长捕捉句法相似性(语法)
  • 具体来说,RNN 模型中的反向递归层学习更多的词汇和语义信息…
  • …而 RNN 模型中的前向递归层学习更多长距离的上下文信息。

“通过蒸馏使用高噪声并行数据改进 NMT”

蒙兹。 【论文在此】

众所周知,NMT 渴望数据,比老牌的 SMT 更甚。但是平行语料库很难找到,并且通常在大小、语言和领域方面受到限制。另一方面,从多语言新闻门户等资源中获取自动对齐的语料库相对容易。流行的 Paracrawl 和 ISI 语料库就是这种情况。但是当然,这样的数据集会有很多噪音,噪音的主要来源通常是错位的句子——有时是完全错位的句子,有时是错位的或未翻译的句子片段。其他常见错误包括不正确的语言用法、未翻译的句子以及非语言字符的用法。

NMT 能从这些低质量的短信中获益吗?在 WMT 已经表明,虽然将嘈杂的语料库添加到干净的语料库实际上可以帮助 SMT 系统,但是在 NMT 系统中,这可能导致质量骤降。因此,与“仅干净数据”相比,即使在“干净和有噪声的组合数据”上训练也会降低性能。NMT 不仅数据饥渴,而且数据敏感。

作者提出了一种 蒸馏 策略,当与高质量并行语料库( 干净数据 )结合使用时,利用额外的低质量双文本( 可比数据 )而不进行任何过滤。在这种方法中,他们首先培养一个 NMT 教师模型 上的高质量、干净的数据而已。教师模型然后指导在干净和有噪声/可比数据的组合上训练的最终 学生模型 的训练。

这个想法是基于 Hinton 提出的 知识升华 框架,其中更小的、压缩的 学生网络 使用来自大型 教师网络 的监督来训练。学生的目标是在数据集上模拟教师网络的输出分布,通常是通过最小化两个分布之间的交叉熵或 KL-divergence 损失。使用对数似然损失来训练教师模型,并且在 KL 发散损失 上训练学生模型——使用超参数来平衡两个损失。总结一下——在知识升华中,学生学会了用更少的参数模仿老师的表现。

结果表明,对于两种语言对(阿拉伯语-英语和汉语-英语),所提出的知识提取策略优于语料库过滤和回译替换。

“利用课程学习改进 NMT 的指代消解”

作者斯托扬诺夫斯基&弗雷泽 【论文在此】

指代消解,或者代词消解,就是弄清楚代词指的是什么的问题——例如,在句子*“猫去冰箱是因为它饿了”*中,“它”指的是什么?是猫饿了,还是冰箱?这些类型的问题对人类来说很容易,但对计算机来说很难。出色地完成这一解析任务对于代词的正确翻译至关重要。尽管上下文感知模型显示代词翻译(以及其他语篇层面的现象)有所改进,但仍有进步空间。

为了提高上下文感知 NMT 中的回指/代词解析,作者建议使用课程学习,这是一种模仿人类学习的渐进性质的学习类型:你从“更容易”的问题开始,随着表现的改善逐渐增加复杂性。这种方法可以导致更快的收敛,并且已经发现在有限的训练数据条件下是有帮助的。在回指解析的情况下,训练从“训练轮”开始——提供了模型可能需要的所有信息来整理代词指代,关系变得明确。这些金标准标注的代词被称为 甲骨文 。随着时间的推移,隐藏越来越多的 oracle 信息会增加任务的难度。

作者发现,尽管基线模型在测试时可以获得完全相同的信息,但使用课程学习来训练上下文感知的 NMT 模型可以提高代词的分辨率。使用针对不同话语现象的神谕可以使这种课程方法得到更广泛的应用。

“用合成数据改善美国手语识别”

作者金&奥尼尔-布朗 【论文在此】

该项目通过开发手语和口语之间的机器翻译系统,解决了(聋人)手语者和非手语者之间的实时通信需求,而无需使用人工翻译。这是一项多模态任务,因为手语是视觉的,而不是基于文本的。

该项目的核心是构建一个 自动化手语识别器模型 (ASLR),它可以识别不同手势背后的语义意图。手语非常复杂——从手的位置、眉毛的动作、肩膀的抬起、一般的姿势和其他细微的动作都与手语的含义有关。这意味着身体上的几乎所有东西都需要被处理和识别。此外,识别系统必须对签名者中存在的自然变化具有鲁棒性,无论是在给定的个人中还是在不同的人之间。

作者使用的设置是用于 3D 视频捕捉的 Kinect 和用于特征提取的 Kinect SDK。他们使用预训练的 OpenPose 模型进行身体姿势检测,生成骨骼化的 25 点身体姿势和 20 点手部位置,并使用预训练的 DeepHand 模型进行手部位置识别。

建立这样一个系统的一个关键挑战是它的资源非常少——获取训练数据既困难又昂贵。作者最初试图使用 GANs 生成合成数据,但他们会得到非常奇怪的三只手人的图像,这不是很有用。他们发现,基于每一帧 2D 操作的不同经典图像增强/数据合成技术——如移位、倾斜、旋转、模糊和对比度变化——是有帮助的。有趣的是,系统性能并没有随着更多的合成数据而单调增加,而是更加呈 U 形。

“话语感知神经机器翻译”

作者龙跃论文此处;这是最佳论文奖获得者]

NMT 做得相当不错,但仍有很长的路要走——它确实不如人工翻译。但是为什么呢?部分原因可能是 NMT 通常在单个句子层面进行翻译,而不是在语篇层面。正常文本中的句子通常具有连通性的属性(例如回指、共指),并且通过向 NMT 馈送独立的句子来忽略这些依赖性会忽略这些有用的属性,并且会降低 NMT 质量。

论文探讨的问题之一是如何将 文档级上下文 包含在 NMT 中。一种方法是使用分级编码器——它有两级循环网络,在句子级和文档级,以获得概括跨句子上下文的向量,然后可以输入 NMT 系统。探索了整合这种全球背景信息的三种方法:

  • 使用跨句子上下文作为初始化状态。也许以上下文感知的初始状态开始模型会改进 NMT。
  • 使用它作为附加功能来增强 NMT 解码器。这种方法类似于人类翻译人员在翻译句子的困难部分时有时会回头看单词。
  • 使用带有门控机制的上下文向量。很可能上下文中的信息并不总是有用的。也许门控机制会有用,因为它可以过滤掉一些噪音,并动态地决定何时使用以及使用多少上下文信息。

简而言之——上下文信息通常有助于 NMT。

本文还探讨了零回指翻译,这种现象存在于汉语和日语等亲降语言中,在这种语言中,代词可以完全省略,以使句子更加紧凑,但仍然可以理解,因为代词的身份可以从上下文中推断出来。人们发现,使用零代名词将这些省略的信息重新整合到句子中,可以提高几个百分点的性能。

演讲最后列出了几个开放性问题:首先,仅仅通过增加数据可以解决多少话语问题?更多的数据缓解了大多数问题,所以也许这就是我们真正需要的。第二,话语知识在 NMT 建筑中是如何传递的?这是另一个棘手的神经网络内部状态问题。

会议第 4 天—海报

这一天剩下的时间专门用于海报会议。

“控制 MT 输出的读数水平”

作者马尔基西奥等人 【论文在此】

在某些情况下,您可能希望手动控制 MT 输出的某些风格方面。受控制机器翻译输出的正式或礼貌水平的工作的启发,本文提出了一种控制机器翻译输出的复杂性或阅读水平的技术。如果机器翻译输出是为儿童或语言学习者设计的,那么低复杂度输出(简单词汇、简单句子结构)将是有用的,而较高复杂度输出(具有高级词汇和句法结构的简明语言)将更适合于正式的商业环境。

作者提出了两种控制可读性的方法:**

  1. ****标记。这种标记方法类似于礼貌论文。首先,作者观察到译文的可读性倾向于模仿训练集中目标句子的可读性。鉴于这种观察,他们将训练数据分为“简单”和“复杂”子集(可读性是使用预先存在的度量标准计算的,如 Flesch-Kincaid 分数)。也保留了“中等”复杂性的例子来改进训练。接下来,训练语料库中的源端句子根据其目标端句子的阅读水平进行标记——即,在源端大小的训练句子的末尾添加一个短文本标记,该标记与目标端句子的复杂性类别相匹配。这个想法是变形金刚的注意力机制应该学会在解码时注意这个标签。最后,在测试时,给测试源句子附加一个“简单”或“复杂”标记就足以指定输出的阅读水平!
  2. ****调整变压器架构。第二种方法通过使用一个联合编码器和两个单独的解码器改变了标准编码器-解码器架构,低复杂度和高复杂度模型各一个。在训练期间,编码器总是随着样本的输入而被训练,但是有一个开关来控制哪个解码器被训练,这取决于是需要简单的还是复杂的输出。

这两种方法通常都工作得很好,但与数据标记方法相比,双解码器方法往往会产生更独特的对比结果,这意味着简单的翻译变得更简单,复杂的翻译变得更复杂。

“金融服务业中的机器翻译:案例研究”

由努恩齐亚蒂尼 【论文在此】

这张关于金融领域机器翻译实施的海报是由 Welocalize 的同事 Mara Nunziatini 展示的,该作品涵盖了在受监管的服务行业中使用机器翻译所面临的技术和实践挑战。本文描述了从试验阶段到生产的过程,以及这种转变如何影响后期编辑、供应商和公司本身。

“用于机器翻译的记忆增强神经网络”

由科利尔&蜜蜂 【博文在此】

记忆增强神经网络 (MANNs)类似于我们的标准 RNNs,不同之处在于它们将计算与记忆分开——内部模型记忆(像它的隐藏状态一样)存储在实际模型的外部,在一组文件中。有趣的是,以前的研究表明,MANNs 有时比 RNNs 学习得更快,概括得更好,但在实践中,它们很少用于像 MT 这样的现实世界任务。在这里,作者通过受 MANNs 启发的附加功能扩展了经典的注意力编码器-解码器。作者有一篇写得很好的博客文章,详细介绍了他们的工作(链接)。

“呼吁谨慎选择子字合并操作”

作者丁等 【此处论文】

NMT 模型从根本上受限于它们的词汇规模——它们只能理解输入单词并生成有用的输出单词,如果它们在它的词汇中的话。这使得传统的基于单词的 NMT 容易受到【OOV】问题的影响,在这种情况下,它不知道如何处理未知的输入单词,当然也不能产生新的单词。处理 OOV 问题的一种常见方法是在子单词级别表示单词,这是有意义的,因为许多单词是更常见的子单词的组合。这浓缩了词汇表,允许潜在的新词生成,并且在形态学上有意义。**

给定一个语料库,决定一组子词的最常见算法是(BPE)字节对编码,它连续合并语料库中最常见的字节对,直到达到一定数量的合并。问题是 BPE 合并数参数在许多 NMT 项目中没有得到太多关注,大多数论文默认使用 16k 或 32k BPE 合并操作。本文论证了使用此参数的次优值可能会导致模型成本高达 4 个 BLEU 点,并强调了在构建 NMT 模型时需要处理这一重要的额外超参数,以进行显式优化。**

会议第 5 天——研究讲座

“在神经和统计机器翻译中流利地识别不适当的输出”

作者马丁代尔等人 【论文在此】

在评价翻译质量时,两个核心概念是翻译 流畅 和翻译 充分。流利指的是母语人士对译文的接受程度或流利程度,包括良好的语法和正确的拼写。恰当性指的是译文在源句中捕捉到预期意思的程度。关于 NMT,你首先要了解的一件事是,与它基于统计的前身(SMT)相比,它更经常地产生非常流畅和听起来自然的翻译,而不一定是足够的或相关的。SMT 的情况正好相反。识别“流利不充分”的句子是本文的重点。虽然它们不经常出现,因此不会严重影响表现得分,但在某些领域,流利性不足的输出是非常危险的,流利性可能会使用户更容易相信翻译并被误导。

第一步是找出问题的范围,并能够预测它何时发生。为了预测流利程度,一种常见的方法是使用语言模型,通过句子概率(稍微修改一下,以突出非常罕见的单词的影响)对文本的语法进行评分。为了预测充分性,显而易见的工具是 BLEU 分数。但是 BLEU 也包含了一个流畅性的因素,所以如果你看到一个低的 BLEU 分数,并不能立即清楚流畅性或充分性是问题所在。作者为 BLEU 增加了一个 向量包句子相似度得分 ,它可以有效地捕捉机器翻译输出中信息丢失或出现幻觉的情况。这些为机器翻译输出提供了多组数字分数,但是由于您实际上需要两组二进制标签——流利与不流利以及适当与不适当——您需要根据参考翻译来设置阈值以生成标签。

作者发现,对于类似的质量,SMT 模型的流畅不充分预测比 NMT 少。总的来说,这是一个非常罕见的问题——在他们的实验中,最多只有 2%的翻译出现错误。但是,我们仍然应该关心这个具体问题,因为它似乎是 NMT 的一个固有特点,我们可能无法彻底根除它。此外,您可能并不总是有更多的数据可以扔给模型,在这种情况下,这些错误的比率会更高。罕见的错误也可能是危险的——如果您处理数百万个翻译请求,您仍然会遇到成千上万个这样的错误。最后,罕见的错误可能本质上更危险,因为当它们出现时,用户不会警觉或怀疑。

如何进一步降低这些错误的发生率?通过普遍提高模型质量,例如通过添加更多的训练数据或进行领域适应:随着 BLEU 分数的提高,NMT 系统中的流畅性错误率显著下降。提高训练数据和测试数据之间的相似性尤为重要。最后,改进我们识别这些错误的方法也是一个有希望的方向,因为如果我们能够准确地识别它们,就有可能在 NMT 模型的未来迭代中明确地训练它们。

“用于翻译成形态丰富的语言的字符感知解码器”

作者 Renduchintala 等人 【此处论文】

第一个翻译系统开始使用 单词级表示——模型的输入是整个单词,输出也是在单词级生成的。另一个极端是 字符级表示 ,其中模型只处理字符。这是有帮助的,因为对于字符,您需要处理的词汇要少得多,而且您可以获得更快的 softmax 计算,但是大的缺点是您必须建模更长的序列(因为每个字符都被视为一个单独的标记)。当然,文字中有信息,因为人类将字符排列成文字,而只有字符的表示法会丢失所有这些信息。一种流行的中间解决方案是在子词级别表示文本,这种技术因字节对编码而流行。

在这里,作者探索了 字符感知表示 ,一种结合字符级特征和单词级嵌入的中间解决方案。已经有工作将这个概念应用到源大小的单词嵌入层,但是令人惊讶的是,在目标端没有发现类似的增益。如果能成功地将字符意识扩展到目标方,那就太好了,因为翻译模型将能够根据需要生成他们以前从未见过的新单词。

天真地从单词嵌入切换到 charCNN 特性只会破坏性能(26 到 12 BLEU),但补救措施是组合的组合嵌入方法——您有正常的单词嵌入,并通过门控机制将它们与 charCNN 嵌入组合,这给了您稍高的 BLEU。形态学丰富的语言的性能提高是可以理解的。

“NMT 的后期编辑生产力:对银行和金融领域速度和质量的实证评估”

作者刘勃利等 【论文在此】

这是一项关于翻译生产率的实践研究,涉及一家中型银行 Migrosbank,该银行最近决定采用 NMT。作者进行了一项生产力和质量评估研究,以评估通过使用 NMT 和后期编辑(PE)与仅使用翻译记忆库(TMs)相比,译者的生产力是否更高。

为什么要进行另一项关于后期编辑生产力的研究?之前有很多关于体育及其如何影响质量和生产力的工作,但在这项工作中:

  • 它们涵盖了一个新的领域,银行和金融(关于融资和投资的文本)
  • 他们着眼于德-法和德-意的翻译,而之前的研究主要集中在英语的翻译上
  • 他们在正常的工作环境中使用真正的专业翻译作为实验对象,而不是翻译学生
  • 评估如果翻译人员也有翻译记忆库可供使用会发生什么,这在现实世界中是很常见的情况,并且会极大地影响生产率和质量

因此,这项工作试图更接近地模拟翻译人员在工业中面临的真实情况。

在比较 4 名专业内部翻译人员的纯翻译和编辑后条件时,结果显示:

  • 后期编辑的方法更快,并且它产生大致相同或稍好的翻译质量。
  • 与仅使用翻译模式的场景相比,使用翻译和后期编辑的德语-法语快 60%,德语-意大利语快 10%。
  • 根据大学讲师对翻译质量的评分,翻译质量基本相同。他们看不出明显的区别。
  • 使用机器翻译可以让翻译团队在内部承担更多的总翻译工作量——在引入 NMT 软件后达到 60%,而在引入软件前只有 40%。外包需求的减少意味着企业可以节省更多成本。

所以度量标准看起来不错,但是翻译人员对使用 MT 感觉如何呢?在这里,他们没有给出任何负面的反馈,也没有对 MT 产生明显的抵触情绪,但这种印象是否完全可靠就不好说了。

其他注意事项:

  • 有一些研究表明,编辑高度模糊的匹配(之前翻译的数据中非常相似的字符串)比编辑后的机器翻译更有效。
  • WMT 会议最近的结果表明,随着机器翻译质量越来越好,像 BLEU,METEOR,ter 这样的自动评分变得越来越不可靠。因此,也许翻译时间是一个更好的衡量标准。它也更容易为非专家所理解。

“后编辑腔:一种恶化的翻译腔”

由托拉尔 【论文在此】

在翻译中,人工翻译越来越多地对机器翻译输出进行后期编辑,而不是从头开始翻译。这是因为相关的生产率提高,以及同等或更好的质量(就误差而言)。然而,后期编辑(PE)的翻译与从零开始(HT)的人工翻译会有质的不同吗?这篇演讲探讨了这个有争议的话题。

前提是,我们可能期望这两种风格的翻译在理论上产生不同的结果。使用 PE,翻译者被机器翻译的输出所引导,所以 PE 应该包含某种机器翻译的足迹。因为足迹在那里,我们知道机器翻译的问题,那么我们可以得出结论,应该优先选择人工翻译。然而,在实践中,研究报告表明 PE 的质量与 HT 相当,甚至更好。但是质量到底是什么?它通常以错误的数量来衡量…但这就是质量的全部吗?

  • 一项研究表明,后期编辑翻译中的术语更接近纯机器翻译,而不是人工翻译。
  • 另一项研究表明,对等翻译中的词汇变化比人工翻译中的词汇变化小,这可能是因为机器翻译系统选择最常用的术语作为最佳翻译。
  • …但另一项研究发现,不可能区分对等翻译和对等翻译(无论是人类法官还是分类员)。

所以模式还不清楚。这项研究检查了 3 个以前出版的系统,SMT/RBMT,RNNs 和 TNNs,因为不同系统的输出之上的后期编辑可能会导致不同的翻译模式。

总的来说,趋势是 PE 使 MT 看起来更像人类生成的目标语言,但不太达到人类的水平,最常见的排名是 HT>PE>MT,所以,后期编辑不能完全恢复 MT 和 HT 的差异,PE 翻译与 HT不同(无论是轻度后期编辑还是重度摄像后期编辑)。也就是说,对等翻译是:

  • 更简单,具有更低的词汇种类和词汇密度(其中 词汇密度 =内容词超过总词数);实词是非填充词,如名词、形容词、动词)
  • 长度比例更加标准化。Length ratio 是源/目标长度,以单词为单位;人类翻译在长度方面产生更多的可变性。
  • 似乎受到源语言句子的更多干扰。

在本研究中,人工翻译在质量上优于 PE。但是先前的工作已经表明 HT≥PE 中的错误数量,因此似乎我们在错误数量和翻译原则之间有一个折衷。在某些领域,PE 可能比 HT 更适合,比如技术内容,在这些领域,严格的准确性和误译可能比语言多样性更重要。有趣的是,语言多样性也是专家译者的一个标志(新手或非专家,例如 TED talks,倾向于更直译,而专家可能会引入更多的可变性)。

鉴于这些差异,考虑使用这些特征构建分类器来区分 PE/MT 和 ht 可能是有意义的。此外,也许如果你把这些信息给后期编辑,他们可能会随着时间的推移学会改进这些模式,并生成语言上更丰富的后期编辑。然而,如果 PE 的要点是生产率,这将受到负面影响。可能有办法应对语言多样性的 PE 冲击——例如,通过增加温度超参数,你可以从 NMT 模型中获得更多样化的翻译,从而导致 softmax 概率的更大传播。

“理解多语言神经网络模型中的句法和语义转移”

by Bisazza 【纸在此】

最近有很多关于语言和翻译的多语言神经模型的有趣工作。事实证明,在多种语言上训练单个模型是可能的,基本上不需要做任何特殊的事情(比如改变模型的架构)。例如,在多语言翻译中,模型工作所需的唯一变化是向源句子添加一个语言代码标记,告诉模型输入应该翻译成哪种语言。多语言对于低资源语言来说是一个非常有趣的途径,因为您可以使用一种语言对的并行数据来提升其他语言对的翻译性能。甚至有可能将这种技术用于 零镜头翻译 ,在这种情况下,您可以为没有数据的语言对生成翻译。

值得注意的是,与针对特定语言(针对语言模型)或语言对(针对翻译)训练的模型相比,针对多语言数据的训练有时会提高性能,这似乎表明这些多语言模型学会了跨语言共享某种知识或表示。在多语言的人类思维中,语言信息被储存在一起,并在所有层面(语音、句法、语义)进行跨语言的交互。这个演讲调查了类似的现象是否会发生在我们建立的神经多语言模型中。

为什么我们期望多语言 NMT 模型共享独立于语言的语言知识?主要的证据是,多语言模型有时(但神秘的是,并不总是)对性能有帮助,所以它们一定在做正确的事情。我们还知道,句法知识是由神经语言模型隐式捕获的(它们对什么是语法和什么不是语法有很好的理解,尽管这不是由模型显式编码的)——因此,也许还存在跨语言语法。

此外,理论上,只要有可能,多语言模型共享表示是经济的,因为拥有一些共享的隐藏层参数意味着它可以将其他参数用于其他任务。也有先前的工作,通过绘制不同语言句子向量的投影,显示了一些中间语言的证据,并显示句子组织成语义意义簇,而不管语言如何——相同句子翻译成不同语言的译文聚集在一起。这表明出现了独立于语言的意义,一种跨语言的意义空间。

真正发生了多少有意义的语言迁移?选项似乎是:

  • ****不转移或很少转移。该模型已经找到了一种方法来压缩它对不同语言的理解,但这里没有太多有意义的交互。
  • 浅转移。很大程度上独立系统的压缩,加上一些语言间的信息泄漏。如果是这样,共享的是什么样的信息?
  • 深度转移。该模型已经学习了类似数据驱动的国际语言或通用语法的东西。

为回答这些问题而进行的实验有:

  1. 多语言依存解析实验。

用 mBERT(BERT 的多语言版本,一种流行的基于深度转换器的双向语言模型,常用于迁移学习)探索跨语言解析器迁移。多语言 NLP 模型通常在一些下游任务中进行评估;在这里,作者检查了 mBERT 是否有助于基于图的依赖解析任务。结果表明,简单地将语言模型暴露给具有共享隐藏层参数的非并行语言混合,确实会导致共享的语法空间,并且性能的提升对于真正低资源的语言尤其有利。关于特定的语言对,有一些有趣的结果——语言对的关联性似乎没有像你预期的那样影响迁移学习。例如,即使训练语言包括相关语言朝鲜语,日语的表现仍然很差。

2。多语言远程协议实验。

跨语言互动在双语者中被广泛研究,有证据表明句法信息储存在一个共享的系统中。例如,有证据表明 句法启动——新接触一种语言中被动语态的双语受试者(L1),倾向于在他们的另一种语言中使用被动语态(L2)。也许我们的多语言模型做一些类似的事情。

用于研究这一点的探测任务是 远程协议 。一致涵盖了主谓一致、数量一致、性别一致等语言现象。例如,给出句子“在森林里迷路的男孩被找到了”,模型必须选择正确的形式来完成句子(在这种情况下,男孩们找到)。协议任务在两种类型的句子上运行:正常句子和没有语义线索的无意义句子(因此迁移学习将真正必须拾取语法信息,而不是使用语义作为拐杖)。

这里的问题是:接触辅助语言 L1 是否能提高相关目标语言 L2 的协议准确性?为了评估这一点,您首先在两种语言的混合上训练一个语言模型(助手 L1 +目标 L2),并在 L2 协议基准上测试。模型设置是一个 2 层 LSTM 模型,它是在维基百科语料库上训练的。此测试的最佳条件可能是 L1 和 L2 关系密切(例如,法语/意大利语),而 L2 资源不足。

有趣的是,结果显示在正常句子上有很小的收获,但在无意义的句子上没有收获,这表明纯粹的语法知识没有被显著地转移。因此,虽然 mBERT 改善了一些东西,但在控制实验中,当消除语义线索时,隐性语法知识的转移是有限的或没有。

这里需要进一步的实验,因为也许数据或模型很小,或者任务太复杂(“一致”涵盖了太多的现象)。也可以尝试不同的词汇或不同的训练方式(例如,先训练法语,然后意大利语;而不是同时)。

3。词性和依存分析树实验。

所以,看起来语法知识并没有在不同的语言之间转移……基本的句法范畴被共享了吗?

有人建议多语模型学习语际词性——如果你观察隐藏层激活的 tSNE 图,用不同词性(POS 名词、动词等。),你会看到根据词类标签和单词的语义的聚类,与语言无关。所以在某种程度上,看起来我们得到了跨语言的语义聚类和共享,但是如何最好地量化这种共享呢?

为了回答词性是否可以被相同的神经激活识别的问题,诊断词性分类器在 L1 上被训练,并且在 L2 上被测试(对于一些不同的语言对)。对于更高级的句法类别——依存标签,完成了类似的分类任务。词性和依存性标记数据取自通用依存性树库。

有趣的是,这也证明效果很差——这里没有太多转移的证据,更高级别的依赖信息根本没有被转移。也没有任何语言相关模式——法语-意大利语迁移比法语-俄语迁移更糟糕。因此,语言相关性并不意味着更好的迁移。此外,令人惊讶的是,你训练的输入语言的数量也不意味着更好的迁移。唯一积极的结果是,当目标是翻译成第三种语言(例如法语/意大利语-英语)时,有一些 POS 转移的证据。

因此,多语言模型的工作不够一致,我们也没有真正理解它们。这意味着它们还不是低资源语言的灵丹妙药。

在多语言模型中,还需要在(积极)迁移和(消极)干扰之间找到适当的平衡——在正常系统中建模良好的语言可能会因为其他语言的存在而开始恶化,因为模型不再有足够的能力来处理这种语言。

总的结论是,仅仅凭借用多语言数据训练我们当前的模型,没有真正的激励让模型学习任何深层意义上的共享。也许我们不应该检查一个模型是否共享一个表示空间,而是应该简单地强迫它这样做,或者以某种方式激励这个结果。也许我们可以做些什么来鼓励模型学习更深层次的共享表征,比如对迫使他们从不同语言学习多种东西的任务进行训练。在架构方面也有工作要做,可能涉及参数的元学习,即明确学习哪些参数应该和不应该在训练多语言模型时共享。

MachineHack,预测医生的咨询费黑客马拉松

原文:https://towardsdatascience.com/machinehack-predict-a-doctors-consultation-hackathon-20047849ee7b?source=collection_archive---------15-----------------------

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

MachineHack.com

最近我参加了一个在线机器学习黑客马拉松,它使用机器学习来预测印度医生的咨询价格。尽管我没有取得很好的预测/结果,但这是一次巩固过去几个月所学知识的学习机会。无论如何,对于那些不知道的人来说,我来自一个制药背景,正在通过自己的课程学习数据分析技能。如果你有兴趣涉足这一领域,请务必查看我的课程表这里

让我们直接进入黑客马拉松吧。这是一个相当小的数据集,有 5961 行和 7 个独特的特征。

  1. 医生的资格
  2. 医生多年的经验
  3. 医生简介
  4. 患者给出的评级
  5. 包含医生其他信息的 Miscellaeous _ Info
  6. 地点(医生所在地的地区和城市)
  7. 医生收取的费用(因变量)

首先,导入所有依赖项和数据集

import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OrdinalEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import make_scorerdf = pd.read_csv("Final_Train.csv")

查看数据以了解给出的信息

df.head()

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

显然,在任何建模过程之前,需要进行一些数据清理。让我们先来看看这个定型数据集中缺失值的数量。

round(df.isnull().sum()/len(df)*100,2)

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

上图显示了每列缺失值的百分比。我将单独处理这些缺失的值,所以现在只需记住这些值。

我总是喜欢先从最简单的任务开始,然后再处理更复杂的问题。这里的“Experience”列看起来很简单,因为它只需要从字符串中提取整数值。

# Extract years of experience
df["Experience"] = df["Experience"].str.split()
df["Experience"] = df["Experience"].str[0].astype("int")

第一行代码将字符串分割成一个列表,而第二行代码提取列表的第一个元素并将其转换成整数。

接下来,通过将城市和地区分开,可以很容易地处理“地点”列。

# Extract cities
df["Place"].fillna("Unknown,Unknown",inplace=True)
df["Place"] = df["Place"].str.split(",")
df["City"] = df["Place"].str[-1]
df["Place"] = df["Place"].str[0]

在提取之前,我用字符串‘Unknown,Unknown’替换了该列中所有缺失的值来表示它们。旁注,有时给缺失值一个单独的类是一个好主意,而不是依赖于缺失值插补技术,如均值/中值/众数。例如,在该数据集中,印度的一些地区可能在数据收集期间没有列出它们的位置,但是它们可能来自同一个地区。接下来,在’,‘处拆分字符串,并使用列表的最后一个元素创建一个新列’ City '。

转到“评级”列,记住该列有超过 50%的缺失值。在任何其他处理之前,我们必须处理丢失的值。

# Seperate Ratings into bins
df["Rating"].fillna("-99%",inplace=True)
df["Rating"] = df["Rating"].str[:-1].astype("int")bins = [-99,0,10,20,30,40,50,60,70,80,90,100]
labels = [i for i in range(11)]
df["Rating"] = pd.cut(df["Rating"],bins=bins,labels=labels,include_lowest=True)

缺失值被替换为-99%,以区分它们。然后,假设 91%的评级与 99%的评级没有显著差异,我将它们分组到大小为 10 的箱中。缺失值将属于 0 类,而 0-9%将属于 1 类,10-19%将属于 2 类,依此类推。df[“Rating”].value_counts().sort_index()显示分布情况。

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

对于“资格”栏,它包括医生的各种资格,没有任何标准化的报告方法。我首先进行常规的拆分,并尝试了解不同术语在本专栏中出现的频率。

# Extract relevant qualification
df["Qualification"]=df["Qualification"].str.split(",")
Qualification ={}
for x in df["Qualification"].values:
    for each in x:
        each = each.strip()
        if each in Qualification:
            Qualification[each]+=1
        else:
            Qualification[each]=1

说实话,现阶段我挺迷茫的。如果您查看Qualification字典,大部分限定条件在整个数据集中只出现了一次,一些术语实际上指的是类似的限定条件,但被单独计算。例如,有条目“MBA-医疗保健”和“MBA ”,我认为它们指的是同一个资格。这是非标准化数据输入或数据收集的问题,我相信数据科学家/分析师每天都会看到这一点。我决定采用最简单的方法,简单地确定出现次数最多的前 10 项资格。

most_qua = sorted(Qualification.items(),key=lambda x:x[1],reverse=True)[:10]
final_qua =[]
for tup in most_qua:
    final_qua.append(tup[0])for title in final_qua:
    df[title]=0

for x,y in zip(df["Qualification"].values,np.array([idx for idx in range(len(df))])):
    for q in x:
        q = q.strip()
        if q in final_qua:
            df[q][y] = 1df.drop("Qualification",axis=1,inplace=True)

最终结果是数据集中 10 个最高频率鉴定的虚拟变量。

现在是“简介”专栏。如果您记得的话,我们在这一列中没有任何缺失值。一个快速的value_counts() 检查产生了这个。

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

这真的很棒。因为整列只有 6 个类,所以 oneHotEncoding 应该可以完成这个任务。在此之前,对我们创建的“City”列的快速检查显示,它也包含少量的类(10)。然而,奇怪的事情突然出现了。

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

不知从哪里冒出了一个“e”条目,我猜这应该是个错误(错误的条目)。我发现问题发生在第 3980 行,于是我将该行的“城市”和“地点”列改为“未知”。

df["City"][3980] = "Unknown"
df["Place"][3980] = "Unknown"

最后的检查。

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

好多了。然后,通过只使用一行代码,我们将能够同时为‘Profile’和‘City’列生成虚拟变量。

# Get dummies
df = pd.get_dummies(df,columns=["City","Profile"],prefix=["City","Profile"])

最后,这里是“杂项信息”栏的简短预览

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

考虑到丢失值的百分比很高(43.95%),并且我找不到该列的任何相关性(我不是 NLP 专家),我决定放弃该列,直接删除它。当然不是最好的方法,但我现在会这么做。

df.drop("Miscellaneous_Info",axis=1,inplace=True)

一旦我们完成了数据预处理,下一步自然应该是数据可视化。注*有些人宁愿在建模前不看你的数据,以防止分析师引入任何偏见,而是看每个人自己的数据。

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

大多数人会认为医生的经验和他们收取的费用之间有某种联系。确实有,但可能不是我们期望的那样。平均费用随着经验的增加而增加,但在大约 25 年的经验时达到峰值,然后,平均费用随着经验的进一步增加而减少。

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

评级是另一个值得关注的有趣变量。如果您还记得,我们将评级分为大小为 10 的容器,包括最小值。例如,bin 5 将是 40–49%的等级,bin 10 将是 90–100%,bin 0 将只是数据集中缺失的值。如您所见,高评级与高收费并不相关(事实上,低收费可能是高评级的原因!),而收取的最高平均费用实际上为 30–60%。配色方案描述了每个箱子中的中间体验水平,深绿色代表较高的中间体验。bins 4 和 bin 5 中的平均经验分别为 27 年和 31 年,而 bin 10 中的平均经验只有 14 年,证明了医生在这些 bin 中收取更高费用的能力。

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

这里有很多东西需要解开。

  1. 不同城市的医生收费不同
  2. 对于大多数城市来说,每个城市内不同医生档案的分布是相似的
  3. 所有城市未知的条目实际上都是皮肤科医生!

之前我提到丢失的数据可能不是随机的,可能是由于数据收集过程,这是一个很好的例子。不知何故,一些城市的皮肤科医生没有记录他们的位置!

注意,所有的可视化都是在 Tableau 中完成的,因为我正在学习这个工具。您可以使用 python 或任何其他可视化工具。

最后,我们可以对我们的数据建模,可以做一些很酷的机器学习。我决定使用支持向量机来完成这项任务,因为它可以用于线性和非线性问题。少量的数据也不能保证使用神经网络。

在实现算法之前,我们必须对分类变量进行编码,并对其特征进行缩放。

X = df.drop("Fees",axis=1)
y = df["Fees"]# Encoding
enc = OrdinalEncoder()
X = enc.fit_transform(X)X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)# feature scaling
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)

正在实施 SVR …

# support vector machine 
from sklearn.svm import SVR
m = SVR(gamma="scale")
m.fit(scaler.transform(X_train),y_train)

基于 hackathon 站点,根据均方根对数误差(RMSLE)对提交的内容进行评估,更具体地说,1-RMSLE.

def score(y_pred,y):
    y_pred = np.log(y_pred)
    y = np.log(y)
    return 1 - ((np.sum((y_pred-y)**2))/len(y))**1/2# Prediction
y_pred = m.predict(scaler.transform(X_test))
score(y_pred,y_test)

我们对测试集的预测给了我们一个分数0.7733490738717279。如果你看一下排行榜,得分最高的是0.76162342。当然,我们的测试集不是用于排行榜的真实测试集,不具有可比性。但是它给了我们一个进一步优化的标准。

进行 GridSearchCV 是进行超参数调优的一个很好的方法,但是要注意计算能力,特别是对于像 SVM 这样不能很好伸缩的算法。

# Define own scorer
scorer = make_scorer(score,greater_is_better=True)# Hyperparameter tunning
parameters = {"C":[0.1,1,10],"kernel":["linear","rbf","poly"]}
reg = GridSearchCV(m,param_grid=parameters,scoring=scorer,n_jobs=-1,cv=5)reg.fit(X_train,y_train)

运行reg.best_params_给出了提供最佳得分的超参数组合。这种情况下最好的超参数是 C=10,kernel="rbf "。注*定义您自己的计分器以在 GridSearchCV 中使用,因此它使用计分矩阵进行优化。

最后。

y_pred_tuned = reg.predict(scaler.transform(X_test))
score(y_pred_tuned,y_test)

这里得到的分数是0.8034644306855361。略有改善,但仍然是改善。使用排行榜测试集,这意味着得分为0.72993077,排名 62/169(前 40 个百分点)

这就是了。机器学习竞赛的完整演练。为了取得更好的成绩,我还可以做更多的事情,做更多的功能工程,使用其他算法,但不幸的是,我没有在比赛结束前做到这一点。做这样的比赛有助于巩固你所学的知识,也是练习的好方法。除非你的目标是奖励,否则获胜往往并不重要,而这才是最有成就感的过程。

所有的代码都可以在我的 GitHub 这里找到。

通过实践学习的机器

原文:https://towardsdatascience.com/machines-that-learn-by-doing-92745ef18a81?source=collection_archive---------12-----------------------

强化学习与人工智能之路

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

Go Champion Lee Sedol (right) playing against AlphaGo in 2016 (source)

在我 25 岁左右的时候,我第一次学会了打网球。关于网球的事情是,一旦你开始,就很难让球落在球场的对面(而不是球场后面的树上)。诀窍是在击球的瞬间,大致垂直地握住球拍,并给予球足够的上旋力。经过几个小时的训练和与朋友的练习,我慢慢学会了如何在击球时将球拍调整到合适的角度。

我的大脑能够学习一项新的任务,打网球,主要是通过频繁的练习。它是怎么做到的?机器能做同样的事情吗?机器可以边做边学吗?

人工智能:机器如何学习

人工智能大致有两种不同的方法,研究人员称之为专业化通用方法。

例如,图像分类的最新进展就是高度专业化的人工智能形式。图像分类模型通常也非常复杂: AlexNet 例如,它在计算机视觉领域最有影响力的论文之一中提出,包含 6000 万个自由参数,需要用大量人类标记的训练数据进行调整。尽管这种系统可以在现实世界中得到有用的应用,但对标记训练数据的需求,以及专业化的程度,使它们在范围上受到了根本的限制:例如,一个经过训练可以区分猫和狗的人工智能系统,无法在 x 光胸片中检测出肺炎。不用说,这样一个系统甚至不知道这些概念是什么意思。称这样一个系统是智能的几乎有点言过其实。

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

Chest X-ray (left), overlayed with predicted pneumonia probability density map (right) (source)

通用人工智能是一种完全不同的方法。这里的想法是开发更简单,同时更通用的算法和方法,让机器在没有人类参与的情况下学习它们的环境。在我看来,强化学习领域是当今最有希望实现通用人工智能的方法之一。那是什么?

强化学习:学习做什么

强化学习意味着学习做什么:将情境映射到行动。如果这听起来很熟悉,那是因为这本质上是我们人类一直在做的事情。这种想法从根本上不同于监督和非监督机器学习。让我解释一下。

在监督学习中,机器本质上学会给出“正确”的答案:狗还是猫?肺炎还是没有肺炎?在无监督学习中,机器根据现有数据点的相似性(但没有标签)来学习数据的结构:例如,在你的数据库中有五种不同类型的客户,下面是他们的偏好和行为如何不同。强化学习不是做这两件事——它是学习在给定的情况下做什么。这是一种非常通用同时又非常强大的方法:它被设计成甚至可以在完全未知的领域工作。

从技术上讲,RL 问题被框定为所谓的马尔可夫决策过程,这基本上意味着有两个‘当事人’,代理环境。在任何给定的时间,环境都处于某种状态。代理执行改变其环境状态的动作,并获得回报,回报可以是积极的或消极的。代理人的目标是选择行动,以便在任何给定时间最大化他们未来总报酬的期望值。代理决定动作的逻辑被称为策略。强化学习问题中的主要挑战是代理人学习最优策略,这是将最大化未来回报期望的策略。

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

Illustration of a Markov decision process (source)

这都是高度理论化的,所以希望一些例子能阐明这个想法。以下是可以被公式化为强化学习问题的所有例子:

  • 收集空罐子的清洁机器人。
  • 电厂中控制核反应堆的系统。
  • 一个正在学习走路的机器人
  • 一种交易股票的系统,旨在实现利润最大化。
  • 学习下棋的机器,如国际象棋。

请注意,强化学习植根于心理学领域:政策与刺激反应的心理学概念有关,而奖励则对应于一种快乐或痛苦的形式。

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

Photo credit: Luca Baggio, Unsplash

探索与利用的权衡

强化学习的一个典型特征是存在着探索与利用的权衡:在同样的情况下,一个智能体是应该坚持一个已知回报的行为(利用),还是尝试一个新的行为以期获得更高的回报(探索)?

考虑所谓的多臂强盗问题:给定一个吃角子老虎机(环境),比方说,有 10 个臂,每个臂产生不同的、未知的支付金额(奖励)分布,你(代理人)如何决定玩哪个臂?一个被称为贪婪策略的策略是,总是在你过去看到最高回报的地方拉手臂。贪婪的策略纯粹是剥削。为了给你的策略注入一些探索,你可以以小概率(我们称之为ε)随机选择一只手臂:这种策略被称为ε-贪婪。

如果其他分支给出更高的回报,那么贪婪将帮助你找到它们,同时充分利用你已经找到的高回报分支。贪婪是解决探索与剥削两难的一种方式。如果收益随时间变化,这种偶尔随机探索的策略尤其重要。我们称这样的问题为非平稳的,它们通常是强化学习的标准。贪婪的策略可能会错过收益转移的时刻;epsilon-贪婪策略适应

在我继续之前,让我简单地指出,这里也有一个微妙的人生教训,简单地说就是这个:不时地尝试一些随机的事情。不要墨守成规,即使你的墨守成规有很好的回报。你永远不知道是否有别的东西可以给你更高的回报,你可能会通过一些随机的探索找到它。

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

Kasparov moving his first piece in the first game of the rematch against Deep Blue (source)

最优策略与计算可行性

原则上,给定无限的时间和计算能力,代理可以学习任何情况下的真正最优策略:这样的代理永远不会出错!

然而实际上,时间和计算能力都是有限的。因此,代理通常只能用逼近最优策略。例如,在游戏中,代理可以通过忽略很少发生的情况来加快计算速度:如果它很少发生或从不发生,为什么要费心去想如果发生了该怎么办?

1997 年,加里·卡斯帕罗夫决定与 IBM 的“深蓝”再赛一场(一年前他赢了一场与这台机器的比赛)。正如内特·西尔弗在《信号与噪音》一书中解释的那样,卡斯帕罗夫的策略是“将程序带出数据库,让它再次盲目飞行”。换句话说,他试图迫使游戏进入一种他可以预期深蓝没有学到最优策略的情况。这就是他在第一轮比赛中的第三步所做的,他忽略了对他的骑士的威胁,而是移动了一个棋子,这是一个非常不寻常的举动。西尔弗指出,棋盘的最终状态也很不寻常,在大师级比赛中只出现过一次。

比赛是怎么结束的?卡斯帕罗夫赢得了这一轮比赛,这可能是也可能不是因为他不寻常的举动迫使深蓝盲目飞行。坏消息是:这是卡斯帕罗夫赢得的最后一轮比赛。深蓝赢了这场比赛,这使得 1997 年成为艾征服国际象棋的一年。

向机器学习:传奇之举 37

让我们离开象棋的世界,进入围棋的世界。在具有历史意义的 2016 年 Deepmind 的 AlphaGo 与世界顶级围棋选手 Lee Sedol 的围棋比赛中,第二局发生了奇怪的事情。AlphaGo 先走 37 步看起来是个失误。评论员和专家不理解这一举动。Sedol 花了超过 15 分钟来决定一个回应。此前输给 AlphaGo 的欧洲围棋冠军范辉后来评论说:“(T2)这不是人的举动。我从未见过人类玩这一招。

第 37 步不是一个错误。人类不理解这步棋,仅仅是因为 AlphaGo 预见了那么多步棋。事实上,AlphaGo 赢得了比赛,以及整场比赛。它发现了一步人类从未想到过的棋,改变了当今最好的棋手对围棋的看法。

当然,围棋只是一种游戏——但诸如药物发现、疾病检测或灾难预测等问题呢?这里的信息是,人工智能有可能为我们指出新的、未经探索的解决方案,以解决我们从未想到的问题。

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

Photo credit: Mauro Mora, Unsplash

学习就是做人

所有的经历都被我们的新视野丰富地交织在一起,然后新的联系开始出现。城市人行道上流淌的雨水将教会钢琴家如何流动。一片随风轻飘的树叶会教会控制者如何放手。一只家猫会教我如何移动。所有的时刻都变成了每个时刻。—乔希·怀兹金,《学习的艺术》

在《学习的艺术》一书中,乔希·怀兹金讲述了他年轻时成为国际象棋冠军,后来成为武术冠军的经历。他解释了掌握象棋如何帮助他学习武术,反之亦然。建立联系,将一个主题的知识转移到另一个主题的能力,可能是我们拥有的最强大的技能之一,当然也是人工智能极难模仿的技能。

事实是,机器不善于将一项任务中的专业知识转移到另一项任务中。此外,他们没有直觉的概念,直觉在我们以前没有解决的任务中指导我们人类。即使强化学习领域迄今为止已经显示出极其有前途的结果,我相信这可能是我们在走向通用 AI 的旅程中需要克服的两个主要限制。

资源

  • 理查德·萨顿和安德鲁·巴尔托,强化学习
  • 内特·西尔弗,信号和噪音
  • 乔希·威茨金学习的艺术

MachineX:使用 NumPy 和 Pandas 进行数据清理

原文:https://towardsdatascience.com/machinex-data-cleaning-in-python-ad6fa5ca109e?source=collection_archive---------11-----------------------

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

在这篇博客中,我们将学习如何用 NumPy 和 Pandas 进行数据清理。

大多数数据科学家仅将 20%的时间用于实际数据分析,80%的时间用于查找、清理和重组海量数据,这是一种低效的数据策略。

数据科学家最初被雇佣的原因是开发算法和建立机器学习模型,而这些通常是他们最喜欢的工作部分。然而,在当今的大多数公司中,数据科学家 80%的宝贵时间都花在了查找、清理和重新组织海量数据上。

如果你刚刚进入这个领域或者计划在这个领域发展你的职业生涯,能够处理杂乱的数据是很重要的,无论这意味着缺少值、不一致的格式、畸形的记录还是无意义的离群值。

在本教程中,我们将使用 python 的 NumPy 和 Pandas 库来清理数据,并看看我们可以在多少方面使用它们。

数据集

我们正在使用一些常见的数据集来探索我们的知识,每个数据集都符合我们正在使用的清洗技术,因此您也可以下载自己的数据集并按照说明进行操作。

以下是我们将使用的不同数据集,您可以通过以下链接下载这些数据集,也可以从 githubRepo 直接下载:

  • BL-Flickr-Images-Book.csv —包含大英图书馆书籍信息的 csv 文件
  • university_towns.txt —包含美国各州大学城名称的文本文件
  • olympics.csv —总结所有国家参加夏季和冬季奥运会的 csv 文件

注意:我正在使用 Jupyter 笔记本,推荐使用。

让我们导入所需的模块并开始吧!

>>> import pandas as pd
>>> import numpy as np

现在,让我们在这两个模块的帮助下开始清理数据。我们导入这两个模块,并指定 pd 和 np 作为对象来使用它们。

删除数据帧中不需要的列

为了从数据帧中删除列,Pandas 使用了“ drop ”函数。Pandas 提供了一种使用[drop()](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html)函数从DataFrame中删除不需要的列或行的简便方法。让我们看一个简单的例子,我们从一个DataFrame中删除了一些列。让我们从 CSV 文件“BL-Flickr-Images-Book.csv”中创建一个DataFrame。在下面的例子中,我们传递了一个到pd.read_csv的相对路径,这意味着所有的数据集都在我们当前工作目录中名为Datasets的文件夹中:

>>> dataF = pd.read_csv('Datasets/BL-Flickr-Images-Book.csv')
>>> dataF.head()Identifier             Edition Statement      Place of Publication  \
0         206                           NaN                    London
1         216                           NaN  London; Virtue & Yorston
2         218                           NaN                    London
3         472                           NaN                    London
4         480  A new edition, revised, etc.                    LondonDate of Publication              Publisher  \
0         1879 [1878]       S. Tinsley & Co.
1                1868           Virtue & Co.
2                1869  Bradbury, Evans & Co.
3                1851          James Darling
4                1857   Wertheim & MacintoshTitle     Author  \
0                  Walter Forbes. [A novel.] By A. A      A. A.
1  All for Greed. [A novel. The dedication signed...  A., A. A.
2  Love the Avenger. By the author of “All for Gr...  A., A. A.
3  Welsh Sketches, chiefly ecclesiastical, to the...  A., E. S.
4  [The World in which I live, and my place in it...  A., E. S.Contributors  Corporate Author  \
0                               FORBES, Walter.               NaN
1  BLAZE DE BURY, Marie Pauline Rose - Baroness               NaN
2  BLAZE DE BURY, Marie Pauline Rose - Baroness               NaN
3                   Appleyard, Ernest Silvanus.               NaN
4                           BROOME, John Henry.               NaNCorporate Contributors Former owner  Engraver Issuance type  \
0                     NaN          NaN       NaN   monographic
1                     NaN          NaN       NaN   monographic
2                     NaN          NaN       NaN   monographic
3                     NaN          NaN       NaN   monographic
4                     NaN          NaN       NaN   monographicFlickr URL  \
0  http://www.flickr.com/photos/britishlibrary/ta...
1  http://www.flickr.com/photos/britishlibrary/ta...
2  http://www.flickr.com/photos/britishlibrary/ta...
3  http://www.flickr.com/photos/britishlibrary/ta...
4  [http://www.flickr.com/photos/britishlibrary/ta...](http://www.flickr.com/photos/britishlibrary/ta...)Shelfmarks
0    British Library HMNTS 12641.b.30.
1    British Library HMNTS 12626.cc.2.
2    British Library HMNTS 12625.dd.1.
3    British Library HMNTS 10369.bbb.15.
4    British Library HMNTS 9007.d.28.

当我们使用该方法查看前五个条目时,head()我们可以看到一些列提供了对图书馆有帮助的辅助信息,但并没有很好地描述书籍本身:Edition StatementCorporate AuthorCorporate ContributorsFormer ownerEngraverIssuance typeShelfmarks

删除列

我们可以通过以下方式删除这些列:

>>> data_to_drop = ['Edition Statement',
...            'Corporate Author',
...            'Corporate Contributors',
...            'Former owner',
...            'Engraver',
...            'Contributors',
...            'Issuance type',
...            'Shelfmarks']>>> dataF.drop(data_to_drop, inplace=True, axis=1)

上面,我们定义了一个列表,其中包含了我们想要删除的所有列的名称。接下来,我们调用对象上的drop()函数,将inplace参数作为True传入,将axis参数作为1传入。这告诉 Pandas 我们希望直接在我们的对象中进行更改,并且它应该在对象的列中寻找要删除的值。

当我们再次检查DataFrame时,我们会看到不需要的列已被删除:

>>> dataF.head()
   Identifier      Place of Publication Date of Publication  \
0         206                    London         1879 [1878]
1         216  London; Virtue & Yorston                1868
2         218                    London                1869
3         472                    London                1851
4         480                    London                1857Publisher                                              Title  \
0       S. Tinsley & Co.                  Walter Forbes. [A novel.] By A. A
1           Virtue & Co.  All for Greed. [A novel. The dedication signed...
2  Bradbury, Evans & Co.  Love the Avenger. By the author of “All for Gr...
3          James Darling  Welsh Sketches, chiefly ecclesiastical, to the...
4   Wertheim & Macintosh  [The World in which I live, and my place in it...Author                                         Flickr URL
0      A. A.  http://www.flickr.com/photos/britishlibrary/ta...
1  A., A. A.  http://www.flickr.com/photos/britishlibrary/ta...
2  A., A. A.  http://www.flickr.com/photos/britishlibrary/ta...
3  A., E. S.  http://www.flickr.com/photos/britishlibrary/ta...
4  A., E. S.  [http://www.flickr.com/photos/britishlibrary/ta...](http://www.flickr.com/photos/britishlibrary/ta...)

更改数据帧的索引

Pandas Index扩展了 NumPy 数组的功能,允许更多的切片和标记。在许多情况下,使用数据的唯一值标识字段作为索引是很有帮助的。

例如,在上一节使用的数据集中,可以预计当图书管理员搜索记录时,他们可能会输入一本书的唯一标识符(值在Identifier列中):

>>> dataF['Identifier'].is_unique
True

让我们使用set_index用这个列替换现有的索引:

>>> dataF = dataF.set_index('Identifier')
>>> dataF.head()
                Place of Publication Date of Publication  \
206                           London         1879 [1878]
216         London; Virtue & Yorston                1868
218                           London                1869
472                           London                1851
480                           London                1857Publisher  \
206              S. Tinsley & Co.
216                  Virtue & Co.
218         Bradbury, Evans & Co.
472                 James Darling
480          Wertheim & MacintoshTitle     Author  \
206                         Walter Forbes. [A novel.] By A. A      A. A.
216         All for Greed. [A novel. The dedication signed...  A., A. A.
218         Love the Avenger. By the author of “All for Gr...  A., A. A.
472         Welsh Sketches, chiefly ecclesiastical, to the...  A., E. S.
480         [The World in which I live, and my place in it...  A., E. S.Flickr URL
206         http://www.flickr.com/photos/britishlibrary/ta...
216         http://www.flickr.com/photos/britishlibrary/ta...
218         http://www.flickr.com/photos/britishlibrary/ta...
472         http://www.flickr.com/photos/britishlibrary/ta...
480         [http://www.flickr.com/photos/britishlibrary/ta...](http://www.flickr.com/photos/britishlibrary/ta...)

每个记录都可以用loc[]访问,它允许我们做基于标签的索引,这是一个行或记录的标签,不考虑它的位置:

>>> dataF.loc[206]
Place of Publication                                               London
Date of Publication                                           1879 [1878]
Publisher                                                S. Tinsley & Co.
Title                                   Walter Forbes. [A novel.] By A. A
Author                                                              A. A.
Flickr URL              http://www.flickr.com/photos/britishlibrary/ta...
Name: 206, dtype: object

换句话说,206 是索引的第一个标签。要通过位置访问它,我们可以使用iloc[0],它执行基于位置的索引。

整理数据中的字段

到目前为止,我们已经删除了不必要的列,并将DataFrame的索引改为更合理的内容。在这一节中,我们将清理特定的列,并将它们转换为统一的格式,以便更好地理解数据集并增强一致性。特别是,我们将清洁Date of PublicationPlace of Publication

经检查,目前所有的数据类型都是object dtype ,这大致类似于原生 Python 中的str

它封装了任何不能作为数字或分类数据的字段。这是有意义的,因为我们处理的数据最初是一堆杂乱的字符串:

>>> dataF.get_dtype_counts() 
object    6

强制使用数字值有意义的一个字段是出版日期,这样我们可以在以后进行计算:

>>> dataF.loc[1905:, 'Date of Publication'].head(10) 
Identifier 
1905           1888 
1929    1839, 38-54 
2836        [1897?] 
2854           1865 
2956        1860-63 
2957           1873 
3017           1866 
3131           1899 
4598           1814 
4884           1820 
Name: Date of Publication, dtype: object

一本书只能有一个出版日期。因此,我们需要做到以下几点:

  • 删除方括号中的多余日期:1879 [1878]
  • 将日期范围转换为它们的“开始日期”,如果有的话:1860–63;1839, 38–54
  • 完全去掉我们不确定的日期,用 NumPy 的NaN:【1897?]
  • 将字符串nan转换为 NumPy 的NaN

综合这些模式,我们实际上可以利用一个正则表达式来提取出版年份:

regex = r'^(\d{4})'

上面的正则表达式是查找一个字符串开头的任意四位数字。上面是一个原始字符串(意味着反斜杠不再是转义字符),这是正则表达式的标准做法。

\d代表任意数字,{4}重复此规则四次。^字符匹配一个字符串的开头,圆括号表示一个捕获组,这向 Pandas 发出信号,表明我们想要提取正则表达式的这一部分。(我们希望^避免[从管柱开始的情况。)

让我们看看在数据集上运行这个正则表达式会发生什么:

>>> extr = dataF['Date of Publication'].str.extract(r'^(\d{4})', expand=False) 
>>> extr.head() 
Identifier 
206    1879 
216    1868 
218    1869 
472    1851 
480    1857 
Name: Date of Publication, dtype: object

不熟悉 regex?你可以在 regex101.com查看上面的表达式,并在 Python 正则表达式 HOWTOMakeExpressions 阅读更多内容。

从技术上讲,这个列仍然有object dtype,但是我们可以很容易地用pd.to_numeric得到它的数字版本:

>>> dataF['Date of Publication'] = pd.to_numeric(extr) 
>>> dataF['Date of Publication'].dtype dtype('float64')

这导致大约十分之一的值丢失,对于现在能够对剩余的有效值进行计算来说,这是一个很小的代价:

>>> dataF['Date of Publication'].isnull().sum() / len(dataF) 0.11717147339205986

太好了!搞定了。!!!

使用 applymap 函数清理整个数据集

在某些情况下,将定制函数应用于数据帧的每个单元格或元素会很有帮助。Pandas .applymap()方法类似于内置的map()函数,只是将一个函数应用于DataFrame中的所有元素。

我们将从“university_towns.txt”文件中创建一个DataFrame:

>>> head Datasets/univerisity_towns.txt
Alabama[edit]
Auburn (Auburn University)[1]
Florence (University of North Alabama)
Jacksonville (Jacksonville State University)[2]
Livingston (University of West Alabama)[2]
Montevallo (University of Montevallo)[2]
Troy (Troy University)[2]
Tuscaloosa (University of Alabama, Stillman College, Shelton State)[3][4]
Tuskegee (Tuskegee University)[5]
Alaska[edit]

我们看到,我们有周期性的州名,后跟该州的大学城:StateA TownA1 TownA2 StateB TownB1 TownB2...。如果我们观察状态名在文件中的书写方式,我们会发现所有的状态名中都有“[edit]”子字符串。

我们可以通过创建一个 *(state, city)* 元组列表并将该列表包装在DataFrame中来利用这种模式

>>> university_towns = []
>>> with open('Datasets/university_towns.txt') as file:
...     for line in file:
...         if '[edit]' in line:
...             # Remember this `state` until the next is found
...             state = line
...         else:
...             # Otherwise, we have a city; keep `state` as last-seen
...             university_towns.append((state, line))>>> university_towns[:5]
[('Alabama[edit]\n', 'Auburn (Auburn University)[1]\n'),
 ('Alabama[edit]\n', 'Florence (University of North Alabama)\n'),
 ('Alabama[edit]\n', 'Jacksonville (Jacksonville State University)[2]\n'),
 ('Alabama[edit]\n', 'Livingston (University of West Alabama)[2]\n'),
 ('Alabama[edit]\n', 'Montevallo (University of Montevallo)[2]\n')]

我们可以将这个列表包装在一个 DataFrame 中,并将列设置为“State”和“RegionName”。Pandas 将获取列表中的每个元素,并将State设置为左边的值,将RegionName设置为右边的值。

>>> towns_dataF = pd.DataFrame(university_towns,
...                         columns=['State', 'RegionName'])>>> towns_dataF.head()
 State                                         RegionName
0  Alabama[edit]\n                    Auburn (Auburn University)[1]\n
1  Alabama[edit]\n           Florence (University of North Alabama)\n
2  Alabama[edit]\n  Jacksonville (Jacksonville State University)[2]\n
3  Alabama[edit]\n       Livingston (University of West Alabama)[2]\n
4  Alabama[edit]\n         Montevallo (University of Montevallo)[2]\n

applymap()

虽然我们可以在上面的 for 循环中清理这些字符串,但 Pandas 让它变得很容易。我们只需要州名和镇名,其他的都可以去掉。虽然我们可以在这里再次使用 Pandas 的.str()方法,但是我们也可以使用applymap()将 Python callable 映射到 DataFrame 的每个元素。

我们一直在使用术语元素,但是它到底是什么意思呢?考虑以下“玩具”数据帧:

0           1
0    Mock     Dataset
1  Python     Pandas
2    Real     Python
3   NumPy     Clean

在这个例子中,每个单元格(’ Mock ‘,’ Dataset ‘,’ Python ‘,’ Pandas '等)。)是一个元素。因此,applymap()将独立地对其中的每一个应用一个函数。让我们来定义这个函数:

>>> def get_citystate(item): 
...     if ' (' in item: 
...         return item[:item.find(' (')] 
...     elif '[' in item: 
...         return item[:item.find('[')] 
...     else: 
...         return item

Pandas 的.applymap()只有一个参数,它是应该应用于每个元素的函数(可调用的):

>>> towns_dataF =  towns_dataF.applymap(get_citystate)

首先,我们定义一个 Python 函数,它将来自DataFrame的一个元素作为它的参数。在函数内部,执行检查以确定元素中是否有([

函数根据检查相应地返回值。最后,在我们的对象上调用applymap()函数。现在数据框架更加整洁了:

>>> towns_dataF.head()      
State    RegionName 
0  Alabama        Auburn 
1  Alabama      Florence 
2  Alabama  Jacksonville 
3  Alabama    Livingston 
4  Alabama    Montevallo

方法applymap()从 DataFrame 中取出每个元素,将其传递给函数,原始值被返回值替换。就这么简单!

快乐学习!!!!!!!!!

请查看下面的链接,找到对您的 Python 数据科学之旅有所帮助的其他资源:

参考资料:
realPython.com
data quest . io

:原发布于->https://blog.knoldus.com/machine-x-data-cleaning-in-python/

MachineX:生成式对手网络(GAN)

原文:https://towardsdatascience.com/machinex-generative-adversary-networks-gan-5a9c198b7e87?source=collection_archive---------21-----------------------

在这篇博客中,我们将讨论 GAN(生成式对手网络)的基础知识以及它们实际上是如何工作的。

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

甘是一个喜欢创作的人,喜欢画肖像画或创作交响乐。这和其他深度学习领域相比是很难的。通过电脑或人来识别莫奈的画要比画一幅容易得多。但是它让我们更接近理解智能。GAN 将我们引向近年来撰写的数千篇 GAN 研究论文。在开发游戏时,我们雇佣许多制作艺术家来制作动画。有些任务是例行公事。通过将自动化应用于 GAN,我们可能有一天会专注于创造性方面,而不是每天重复例行任务。

为了理解它们是如何工作的,想象一个盲人伪造者试图创作大师画作的复制品。首先,他不知道一幅画应该是什么样子。

但是他碰巧有一个朋友,他对曾经画过的每一幅杰作都记忆犹新。

GAN 背后的原理是在 2014 年首次提出的。它描述了一个系统,该系统使两个人工智能系统(神经网络)相互对抗,以提高它们的结果质量。

介绍

生成对抗网络(GAN)是一种使用深度学习方法(如卷积神经网络)进行生成建模的方法。

生成建模是机器学习中的一项无监督学习任务。它包括自动发现和学习输入数据中的规律或模式。以便该模型可以用于生成或输出可能已经从原始数据集中提取的新示例。

GAN 是一种训练生成模型的聪明方法,它通过将问题框架化为具有两个子模型的监督学习问题:我们训练以生成新示例的生成器模型。鉴别器模型试图将示例分为真实的(来自域)或虚假的(生成的)。这两个模型在一个零和游戏中一起训练,对抗,直到鉴别器模型被愚弄了大约一半的时间,这意味着生成器模型正在生成似是而非的例子。

在讨论生成式对手网络之前,让我们先讨论一下生成式模型。所以,

什么是生成模型?

我们将回顾生成模型的思想,跨越有监督和无监督的学习范式,以及区别性和生成性建模。

一个典型的机器学习问题涉及到使用模型进行预测

这需要一个用于训练模型的训练数据集,该数据集由多个称为样本的示例组成,每个示例都具有输入变量( X )和输出类标签( y )。通过显示输入的示例,让模型预测输出,并修正模型以使输出更像预期的输出,来训练模型。

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

什么是生成性对抗网络?

GAN 模型架构包括两个子模型:用于生成新样本的生成器模型和用于分类的鉴别器模型。生成的例子是真实的,来自领域,还是伪造的,由生成器模型生成。

  • 发电机。用于从问题域中生成新的合理示例的模型。
  • 鉴别器。用于将示例分类为真实(来自域)或虚假(生成)的模型。

发电机模型

生成器模型将固定长度的随机向量作为输入,并在域中生成样本。

该向量是从高斯分布中随机抽取的,并且该向量用于生成过程的种子。在训练之后,这个多维向量空间中的点将对应于问题域中的点,形成数据分布的压缩表示。

这个向量空间被称为潜在空间,或者由潜在变量组成的向量空间。潜在变量,或隐藏变量,是那些对一个领域很重要但不能直接观察到的变量。

在训练之后,生成器模型被保留并用于生成新的样本。

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

鉴别器模型

鉴别器模型将来自领域的示例作为输入(真实的或生成的),并预测真实或虚假的二进制类别标签(生成的)。

真实的例子来自训练数据集。生成的示例由生成器模型输出。

鉴别器是一个正常的(也很容易理解的)分类模型。

在训练过程之后,鉴别器模型被丢弃,因为我们对生成器感兴趣。

有时,当生成器已经学会从问题领域的例子中有效地提取特征时,它可以被重新利用。一些或所有特征提取层可以用于使用相同或相似输入数据的迁移学习应用中。

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

GANs 是一个双人游戏

生成器和鉴别器这两个模型一起训练。生成器生成一批样本,这些样本与来自该领域的真实样本一起被提供给鉴别器,并被分类为真或假。

然后更新鉴别器,以便在下一轮中更好地鉴别真假样品,重要的是。基于生成的样本欺骗鉴别器的程度来更新生成器。

在这种情况下,零和意味着当鉴别器成功识别真假样本时。它被奖励或者不需要改变模型参数,而生成器由于对模型参数的大量更新而受到惩罚。

或者,当生成器欺骗鉴别器时,它被奖励,或者不需要改变模型参数,但是鉴别器被惩罚并且它的模型参数被更新。

在极限情况下,生成器每次都从输入域生成完美的副本,并且鉴别器无法辨别差异,并且在每种情况下都预测“不确定”(例如,50%的真假)。这只是一个理想化情况的例子;我们不需要达到这一点来获得一个有用的发电机模型。

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

为什么是生成性对抗网络?

在计算机视觉等领域使用深度学习方法的许多重大进步之一是一项名为数据增强的技术。

数据扩充会产生性能更好的模型,既提高了建模技能,又提供了正则化效果,减少了泛化错误。它的工作原理是从模型被训练的输入问题域中创建新的、人工的但似乎合理的例子。

在图像数据的情况下,这些技术是原始的,包括对训练数据集中现有图像的裁剪、翻转、缩放和其他简单变换。

成功的生成式建模为数据扩充提供了另一种可能更特定于领域的方法。事实上,数据扩充是生成式建模的简化版本,尽管很少这样描述。

GANs 对高维数据建模、处理缺失数据的成功能力,以及 GANs 提供多模态输出或多个似是而非答案的能力。

也许 GANs 最引人注目的应用是在需要生成新例子的任务的条件 GANs 中。在这里,Good fellow 指出了三个主要例子:

  • 图像超分辨率。生成输入图像的高分辨率版本的能力。
  • 创造艺术。伟大的新的艺术形象,素描,绘画,等等的能力。
  • 图像到图像的翻译。跨领域翻译照片的能力,例如从白天到夜晚、从夏天到冬天等等。

GAN 应用

  • 创造动漫人物

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

  • CycleGAN

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

  • 姿势引导的人物图像生成

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

我们将在下一部分更深入地讨论这些应用程序,敬请关注。

快乐学习!!!!

最初发布于 knoldus 博客:https://blog . knold us . com/machinex-generalized-attendant-networks-gan/

MachineX:使用 Keras 增强图像数据

原文:https://towardsdatascience.com/machinex-image-data-augmentation-using-keras-b459ef87cd22?source=collection_archive---------31-----------------------

在这篇博客中,我们将关注使用 Keras 的图像数据增强以及我们如何实现它。

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

问题

当我们处理图像分类项目时,用户给出的输入可能在许多方面有所不同,如点击图片时的角度、缩放和稳定性。所以我们应该训练我们的模型去接受和理解几乎所有类型的输入。

这可以通过为所有可能性训练模型来完成。但是当训练集大到 10000 张图片时,我们不能到处点击每个可能角度的相同训练图片!

这可以很容易地通过一种叫做图像数据扩充的技术来解决,这种技术拍摄一幅图像,将其转换并以我们指定的所有可能的形式保存。

图像增强介绍

图像增强是一种用于人工扩展数据集的技术。当我们得到一个只有很少数据样本的数据集时,这是很有帮助的。在深度学习的情况下,这种情况很糟糕,因为当我们在有限数量的数据样本上训练它时,模型往往会过度拟合。

通常用于增加数据样本计数的图像增强参数是缩放、剪切、旋转、预处理 _ 函数等。这些参数的使用导致在深度学习模型的训练期间生成具有这些属性的图像。使用图像增强生成的图像样本通常会导致现有数据样本集增加近 3 到 4 倍。

履行

让我们从导入所有必需的库开始:

pip install tensorflow
pip install scipy
pip install numpy
pip install h5py
pip install pyyaml
pip install keras

我们已经安装了scipynumpyh5pypyyaml,因为它们是keras所需的依赖项,而且由于 keras 工作在tensorflow后端,所以也需要安装它们。你可以在这里阅读更多关于 tensorflow 安装的信息。我们将使用keras进行图像增强。

让我们导入 keras 图像预处理。

from keras.preprocessing.image import ImageDataGenerator,img_to_array, load_img

这里,ImageDataGenerator用于指定我们将用来生成图像的参数,如旋转、缩放、宽度,稍后将会介绍更多的参数。img_to_array用于将给定的图像转换成一个 numpy 数组ImageDataGenerator使用,load_img将用于加载要修改的图像到我们的程序中。

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

参数:

我们在此使用ImageDataGenerator()指定生成图像的参数,解释如下:

**旋转 _ 范围:**旋转量

**宽度 _ 移动 _ 范围,高度 _ 移动 _ 范围:**宽度、高度的移动量

shear_range : 逆时针方向的剪切角度,以弧度表示

**缩放范围:**随机缩放的范围

horizontal_flip : 布尔型(真或假)。水平随机翻转输入

fill _ mode:{“常量”、“最近”、“反射”或“换行”}之一。根据给定的模式填充输入边界外的点

在指定参数并将它们存储在datagen变量中之后,我们开始导入我们的图像。

img = load_img('lion.jpg')

在这里,我使用的是狮子图像,你可以简单地使用你自己的样本图像。

x = img_to_array(img)  # creating a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape)  # converting to a Numpy array with shape (1, 3, 150, 150)

用于加载所需的图像,您可以使用任何您喜欢的图像,但我会推荐一张脸像猫、狗或人的图像!

接下来,我们使用img_to_array将图像转换成数字,在本例中,是一个 numpy 数组,它可以很容易地输入到我们的flow()函数中(不要担心,稍后会解释!).我们将转换后的 numpy 数组存储到一个变量x中。

然后,我们必须重塑 numpy 数组,添加另一个大小为 1 的参数。我们这样做是为了使它成为 4 阶而不是 3 阶的 numpy 数组,以容纳名为通道轴的参数。对于灰度数据,通道轴的值应为 1,对于 RGB 数据,通道轴的值应为 3。

这是我的输入图像(一只狮子):

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

输出:

现在我们已经有了表单输入,让我们开始产生一些输出。

i = 0
for batch in datagen.flow(x,save_to_dir='output', save_prefix='lion', save_format='jpeg'):
    i += 1
    if i > 20:
        break

我们在每次迭代中使用datatgen.flow()函数。我们给了x—输入图像的 numpy 数组、save_to_dir—保存输出的目录、save_prefix—图像名称的前缀和save_format—作为输入的图像格式。

这是我们输出图像的样子:

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

请注意,由于缩放、旋转、宽度或高度偏移等原因,每张图像都与其他图像略有不同。这将有助于您将要构建的模型识别大量图像,从而提高效率。

这是 keras 中图像增强的概述。

此外,请访问 Machinex 页面,了解更多相同的更新:

魔术:聚会遇上数据科学

原文:https://towardsdatascience.com/magic-the-gathering-meets-data-science-2a0367c724fe?source=collection_archive---------20-----------------------

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

When Wizards bans your favourite Angel card. Source: Pixabay.

魔术:多年来,聚会一直是我的爱好之一。其庞大的卡库和悠久的历史使其非常适合数据分析和机器学习。

如果你错过了我的前一篇文章,我将 K-Means 聚类(一种无监督学习技术)应用于一个魔术:收集我从 mtgtop8 收集的数据集。那篇文章解释了技术方面的问题,但没有涉及结果,因为我认为我的读者不会感兴趣。

由于许多人已经站起来表达他们的不同意见,我现在将向你们展示算法学到的一些东西。

这不会是我第一次也不会是最后一次说,无监督学习可能会对它所学的一切感到毛骨悚然,即使你知道它是如何工作的。

数据

我在这个项目中使用的数据集只包含了去年现代格式的专业套牌。我没有在这个分析中包括侧板。在这个 GitHub 项目中,我用于训练和可视化的所有工具和代码都是可用的。

如果你知道任何好的休闲套牌数据集,我很乐意在评论中知道。不然以后可能会刮一个。

在这个分析中,我看了 777 副不同的牌,总共包含 642 张不同的牌(算上地)。

结果呢

首先,我强烈建议您打开资源库,亲自尝试 Jupyter 笔记本,因为可能会有一些您感兴趣的见解,而我可能会遗漏。

也就是说,如果你想知道关于一张特定卡片的数据(假设它是竞争元的一部分,我们已经看到它足够小了),如果你在这里没有看到它,请在评论中问我!

现在,我们要问自己的第一个问题是…

每个魔法:聚集集群看起来像什么?

请记住,我们聚集了一副牌,而不是一张牌,所以我们希望每一组能大致代表一个原型,特别是在现代元中看到的一个。

首先:这里是每个集群的计数。也就是说,每张牌有多少张。

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

Quantity of decks that fell on each cluster after applying K-Means Clustering.

我们可以马上看到有两个特别小的集群,每个集群不到 30 副牌。让我们仔细看看。

每个集群上的卡

对于第 4 组,我得到了每副牌中出现次数最多的一组 40 张牌,然后找出它们的交集,看看它们有什么共同点。我对第 6 组重复了这一过程。

Cluster number 4:
{'Devoted Druid', 'Horizon Canopy', 'Ezuri, Renegade Leader', 'Forest', 'Elvish Archdruid', 'Pendelhaven', "Dwynen\\'s Elite", 'Llanowar Elves', 'Collected Company', 'Windswept Heath', 'Temple Garden', 'Westvale Abbey', 'Razorverge Thicket', 'Heritage Druid', 'Elvish Mystic', 'Nettle Sentinel','Eternal Witness', 'Cavern of Souls', 'Chord of Calling', 'Vizier of Remedies', 'Selfless Spirit'}Cluster number 6:
{'Funeral Charm', 'Liliana of the Veil', "Raven\\'s Crime", 'Fatal Push', 'Thoughtseize', 'Wrench Mind', 'Bloodstained Mire', 'Smallpox', 'Inquisition of Kozilek', 'Mutavault', 'Urborg, Tomb of Yawgmoth','Infernal Tutor', 'Swamp', 'The Rack', "Bontu\\'s Last Reckoning", 'Shrieking Affliction'}

看起来他们中的一个在玩绿色牌组,使用精灵和绿色土地,而另一个结合了碾磨和丢弃,像 Liliana 和 Kozilek 的宗教裁判。

这是上一个算法对所有集群的结果,看看你能否分辨出每个集群属于哪个原型。这也告诉我们当我得到数据时元的分布情况。

Cards that appear in all decks in a certain cluster.

如果你参加竞技比赛,对一个更近的数据集进行同样的分析甚至可能是有用的。

特定卡片

在这些名单中,有三张牌让我印象深刻:“变跳马”、“对科济莱克的审讯”和“拉诺瓦尔精灵”。我想知道它们是否在其他集群中更常见?我真的不知道 Mutavault 在竞技比赛中如此常见,我认为拉诺瓦尔精灵出现在甲板上告诉了我们一些关于它的事情。

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

Well, that’s a one-trick pony. Clearly one of the things characterizing Cluster number 4 is the presence of Llanowar Elves.

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

和往常一样,你可以为任何一张卡片生成这些图表,或者问我你是否对某一张卡片感兴趣。

多功能卡片

最后,我将定义一种新的卡片类别:一张卡片的多功能性将意味着多少不同的组包含至少一副使用它的牌。

诚然,我同意这个定义还可以再完善一点。例如,通过计算幻影而不仅仅是卡片是否在一副牌中。

然而,这种方式的结果是足够连贯的,所以我不认为它需要任何更多的调整。在过滤掉基本的地之后,这里列出了十大最通用的牌。

  1. 肢解
  2. 鬼节
  3. 废墟
  4. 灵魂洞穴
  5. 思维抓住
  6. Mutavault
  7. 神圣铸造厂
  8. 常去的地方
  9. 工程炸药
  10. 植物圣地

他们几乎就是你所期望的那种。然而,我很惊讶闪电没有入选。我不确定非基本地是否应该计算在内,但最后我还是把它们留了下来。

事实上,我不知道“工程炸药”是哪张牌,这证明我与超级玩家脱节了,也许我应该玩得更多,但这不是重点。

结论

正如我们所料,《魔法:聚会》是一个有趣的数据来源,我想我们都通过看到这一切学到了一些东西。

就我个人而言,我仍然很惊讶一点点被美化的线性代数可以了解所有关于竞争游戏的元。

如果它在休闲游戏中了解到原型,我会更惊讶,在休闲游戏中,套牌更加多样化,尽管我的直觉告诉我有足够多的集群,即使这样也应该被正确地表征。

你怎么想呢?你想看看其他的信息吗?你期望算法表现良好吗?最后,你认为还有哪些领域适合适当的数据分析,特别是使用其他无监督学习技术?

请让我在评论中知道任何或所有这些!

关注我 推特 获取更多文章、教程和分析。请考虑 以一份贡献支持我的网站和我的写作习惯

原载于 2019 年 4 月 5 日www . datastuff . tech

使用聊天机器人的主要好处

原文:https://towardsdatascience.com/main-benefits-of-using-a-chatbot-for-your-business-b4ad00f02fb?source=collection_archive---------15-----------------------

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

Facebook Messenger Chatbots are future of the internet marketing

我要告诉你关于未来的事——信使聊天机器人。什么是 Messenger Chatbot,为什么它对您的业务至关重要?基本上,它是一个数字助理,大多数时候是基于人工智能的,它有各种命令的方向,看起来像与你的客户进行自然的声音对话。

现在,您有机会自动与客户进行一对一的个性化对话。我只是想知道,如果你能让这个人确切地回答他们的问题,你会让他们购买的可能性有多大?

聊天机器人可以帮助客户找到关于公司提供的服务的信息,咨询他们的产品可用性,商店位置,进行预订或预定,评估客户对服务的体验以及更多不同的命令。你可以在 Slack、Facebook Messenger、Telegram、Text Messages、Hangouts 等任何主流聊天应用中采用这项技术。

例如,脸书信使聊天机器人的参与率是电子邮件营销的 10 到 80 倍,而如今新闻订阅上的有机帖子的可见性只有可怜的 1%。更重要的是,信使广告是最有利可图和最便宜的方式在互联网上获得线索!

根据全球网络指数统计,大约 75%的互联网用户使用一个或多个 messenger 平台。尽管研究表明,每个用户平均每月使用 24 个应用程序,但 80%的时间都花在 5-6 个应用程序上。在这篇博客中,我们将介绍开发聊天机器人作为工具的主要好处,无论你是小企业还是大企业,它都可以在内部和外部加强你与客户展位的关系。我们走吧!

为什么您应该根据您的业务定制它

**1。支持随时供货

众所周知,客户服务是成功的最重要因素。无论您的企业是在全球还是在当地,拥有全天候的客户服务和即时回答对您客户的满意度和购买意愿有着巨大的影响。当接线员试图给你接通客户服务中心时,大多数客户总是在等待,而聊天机器人对他们的命令百听不厌。

他们可以一年 365 天,一天 24 小时与观众一起工作。此功能可帮助组织处理更多任务,并节省时间来回答有关产品和服务的常见问题,无需客户等待。虽然聊天机器人在某些情况下不能取代真正的客户支持,但它可以补充这种支持,以便实际员工可以提供全面的服务,而不会让客户长时间等待而心情不好。

所有这些都可以大规模地免费提供给成千上万的潜在客户,而无需他们访问你的移动网站!如果你做得好,你可以通过聊天机器人把你的潜在客户从漏斗顶端拉到漏斗底端。您可以用 messenger chatbot 中的所有实现来替换网站体验。多酷啊。

2。管理可能性

您可以与客户保持联系,而不需要像真实商店中的销售人员那样通过实时协助亲自联系他们,从而提供交互式通信。一个良好的聊天机器人可以同时与数千人对话,回答他们的问题,提供特殊优惠券,限时促销或任何你想分享的东西。

企业能够在脸书等社交媒体平台上直接利用成熟的技术提供产品和服务。小而重要的事情,比如计划好的约会;检查你的电子邮件,为你提取数据,最重要的是向你的家人、朋友和客户提供会话更新,这些都是精确地完成的,几乎没有任何出错的机会。它将完全整合你的整个数字生活在一个地方,你可以很容易地访问和自动处理各种任务,没有时间。

他们与客户保持持续友好的联系,消除客户因陌生电话而产生的烦恼。这为推送通知和展示新产品和服务提供了有利的基础。像塔可钟和多米诺这样的公司已经在使用聊天机器人来安排包裹的递送。

3。低维护成本

实现一个全功能的聊天机器人比创建一个跨平台的应用程序或为每项任务雇佣员工要便宜和快捷得多。一个人只能同时应付一到两个人,甚至更多——这对员工来说是非常严峻的挑战。一年 365 天雇佣代理并增加资源来为客户提供基本的支持对公司来说太昂贵了。这不仅可以节省员工成本,还可以避免人为错误带来的问题。根据 Chatbots 杂志,实施虚拟代理可以帮助企业节省高达 30%的成本。

聊天机器人可以让公司节省资金,而且很容易改变以满足不同的需求,这取决于用户的应用。在它们建立的时候,保持它们更新的成本相对较低。根据行业研究,聊天机器人预计将在 5 年内处理 90%的客户查询。这意味着到 2022 年,预计他们将削减 80 亿美元的业务成本。

4。更高的参与度和销售额

让你的客户参与到你的品牌中来很重要,这也是为什么公司开始使用聊天机器人进行社交媒体营销的原因。通过社交媒体吸引客户可以帮助你增加高达 40%的销售额,而脸书在要求现有客户分享他们的积极体验方面成功率最高(根据研究,甚至 29%的人会这样做,并为你的企业带来新的前景)。

聊天机器人的灵活结构意味着将它们与其他渠道整合以提高参与度非常简单。一个简单的例子是与一个在线预订的顾客的对话。该机器人可以将客户带到在线购买页面,并与满意的客户达成交易。

它们可以被编程为自然的声音幽默,这可以使它们看起来更像人类。这让客户感到舒适,让他们对你的业务体验更加愉快。

没有假的电子邮件,假的名字或假的姓氏。通过 messenger 聊天机器人,您可以获得客户的所有真实信息。公司使用聊天机器人来获得客户洞察,从而主动与客户接触。电子邮件营销只有 3%的邮件打开率,而聊天机器人的得分超过 80%!正如我之前所写的,他们通过推送通知或新优惠来保持现有客户对感兴趣的品牌和产品的兴趣。

移动参与的重要性

另一件非常重要的事情是特别考虑手机。当谈到移动参与率时,这种类型的营销有能力完全改变游戏。看一下这些指标。这一点非常重要,因为这一趋势仍在继续,越来越多的人在移动设备上接触品牌,而不是在桌面上。

Facebook Messenger bot 体验完全针对移动设备进行了优化。Prime 用户在访问你的移动网站之前会得到他们需要的基本信息,这是非常重要的。你可以把所有与你的网站相关的不太友好的移动体验和不太好的转换率,通过聊天机器人为 FB messenger 平台重新配置/重新设计,让它工作得更好。

越来越多的脸书消息用户

这是按月用户(百万)统计的美国最受欢迎的移动通讯应用图表。截至 2017 年 9 月,全球 Facebook Messenger 的月活跃用户数达到 13 亿,预计到 2021 年,全球所有消息应用程序的用户数将达到 24.8 亿。想象一下,接触这些潜在客户的机会有多大。

CTR 高 14 倍

2016 年电子邮件营销基准研究显示,49%的邮件是通过移动阅读的,这表明用户在做一些事情的同时阅读通信的倾向。我们决定亲自通过 Facebook Messenger 的推送通知联系用户来测试和验证这一说法,打开率令人震惊。

我们使用 Messenger 聊天机器人和电子邮件向我们的客户发送了相同的活动。聊天机器人的结果比我们预期的要好:点击率(点击率)比通过电子邮件收到的点击率高 14 倍,这导致了整体活动绩效的提高。开放率为 84%。目前还没有其他营销渠道拥有如此高的参与度。

因此,我们相信在不久的将来,信使聊天机器人将变得比电子邮件营销更重要,也许有一天会完全取代它。Facebook Messenger 聊天机器人将成为品牌传播的未来。这些变化不仅会影响电子邮件平台,还会影响所有的交流方式。

Messengers Ad + chatbot =最便宜最高效的组合

你可以运行与智能聊天机器人相关联的 Facebook Messenger 广告活动,以达到任何社交媒体活动的最大目标。这个机器人可以自动发送一系列的文字信息、照片或视频来推销你的产品或服务。

通过与你的受众展开直接、一对一的聊天对话,你可以在个人层面创造超个性化的品牌体验。企业利用广告通过定位与其业务相关的潜在客户来开始对话。无论目标是产生线索、提高品牌或产品的知名度,还是推动销售,企业都可以定制 Messenger 中的对话来满足客户的特定需求——当他们点击广告时,他们将被发送到与您的机器人聊天。

来源:https://developers.facebook.com

用户可以询问关于您的位置或营业时间的问题,获得关于您的产品或服务的更多信息,提供反馈,预约等等——就像打一个令人沮丧的陌生电话,这是他们大多数人不想做的。脸书信使广告也有最便宜的每次点击价格,因此你有机会在一个数字领先杀手中连接两个最具成本效益和效率的广告渠道!

结论

聊天机器人正在改变在线用户体验,将用户从复杂的网站和带有结构化菜单的应用程序转移到一个简化的命令行界面,该界面可针对每个人进行调整。如果你的预算比 Google Adwords 少,那么这种方式会更有效,它很容易建立,只需要很少的维护,而且允许你用比其他渠道更少的钱来测试不同的营销信息。这种类型的广告和营销没有不奏效的地方。你一定要试试!

数据科学的主要课题和职业道路

原文:https://towardsdatascience.com/major-topics-and-career-paths-in-data-science-467a429e364e?source=collection_archive---------20-----------------------

数据科学(DS)可以总结为统计分析和编程技能的结合,用于分析大量数据集并提供有意义的预测和结果。这需要实施许多技能,如统计学、数据挖掘、回归、分类、预测建模和数据可视化等。

收集数据只是这一实践的开始,因为大多数未经适当过滤、分类和清理的原始数据都是无用的。许多数据需要数据科学家的输入来合并、删除、连接和剪切该数据集的特定部分,以便为特定的分析/建模进一步准备数据集。

当领先公司意识到大数据的重要性及其在决策或业务关系中应用成功战略的用途时,DS 成为当前就业市场的热门话题。对大数据工程和应用科学日益增长的需求促使许多行业雇佣数据科学家作为现代魔术师来预测结果并提供有意义的解释。

当前的数据科学家来自许多不同的背景,如金融、经济、环境科学、计算机科学、统计等。这种多样性和非传统背景可以使他们有一个创新的视角,并应用不同的解决问题的技能。虽然本文并不试图涵盖 DS 中所有相关的职业,但它将试图让当前的教育求职者和求职者熟悉 DS 中的不同领域,如下所示。

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

公共事务:

在这条职业道路上,数据科学家应用统计学和计算机科学技能为没有得到满足的社会商品创造有效的公共政策结果。这是通过政治调查设计、基础设施/智能城市/交通管理、活动数据解释、政府欺诈检测(例如逃税者)、教育系统管理、公共卫生/住房/执法数据分析等实现的。

商业分析:

业务分析基本上使用与 DS 相同的大数据应用程序,并实施这些应用程序来确定业务决策、识别弱点并在组织内应用实际变化,以改善关键绩效指标或其他增长指标。尽管数据和业务分析有着相同的目标,但后者涉及更多的决策、变更实施和沟通。

金融:

分析已经成为金融服务的核心。价格预测、将统计模型应用于股票市场走势、识别变化、衡量消费者终身价值和欺诈检测是数据科学家可以为金融服务提供商提供的众多优势之一。这导致做出实时决策,创建预测市场机会的交易算法,并基于历史数据和人工智能个性化客户关系。

计算机科学:

统计学可以被认为是一个进化和发展中的科学技术分支,是计算机科学和统计学的一个分支。然而,由于 DS 和 cs 中共享的技能和主题,数据科学家也可以使用这些技术的交叉点,并将数学和编码技能应用于许多 CS 领域,如数据库管理、科学计算和数据挖掘。在计算机视觉、人工智能和自然语言处理等主题中,有更多的生产级代码编写。这需要数据科学家有更多的编码背景。

网络安全:

许多网络安全提供商正在将 DS 功能添加到他们的底层系统中。基于分析模型和人工智能,对新旧威胁的响应变得动态,许多决策是自主做出的。通过 DS 技术,组织可以仔细检查数据并实施更好的入侵检测系统来防止欺诈和保护有价值的信息。

环境科学:

由于工业污染的无节制排放,全球变暖成为近年来的热门话题。环境数据科学家可以将建模和预测技术应用于许多不同的数据集,如污染物水平、水位上升和含盐量、大气值以及来自不同地质生态系统的地理空间数据。研究结果可应用于地理信息系统、气候学、环境监测项目的遥感和全球气候趋势。

国际经济关系:

DS 也可以用来提供对国际政治经济学、环境经济学、全球化进程和贸易/金融关系的深入理解。

微观经济学:

数据科学家可以将其技能应用于反垄断经济学和法规、分析计量经济学、公共和劳动经济学、经济实验和影响评估等领域。

生物技术:

生物技术可以定义为使用任何技术来分析/应用于活的有机体、生物系统或一般的医疗保健系统。许多生物技术公司正在雇用数据科学家,因为他们可以在医疗或非医疗领域提供许多不同的好处。基因组分析和下一代测序需要具有统计和编码知识的生物技术人员为特定研究应用和分析万亿字节的数据。此外,疫苗、副作用分析和微生物/疾病分类等药物发现都可以通过 DS 完成。

随着越来越多的企业开始依赖 DS,对能够收集、组织、解释和可视化数据的专家的需求将会增加。数据分析师和科学家在未来几年将会有很高的需求,该领域的不同职业将会产生应用于数据相关问题的不同技术和知识。

自然语言处理的主要趋势:前交叉韧带研究 20 年回顾

原文:https://towardsdatascience.com/major-trends-in-nlp-a-review-of-20-years-of-acl-research-56f5520d473?source=collection_archive---------7-----------------------

深入分析

计算语言学协会(ACL 2019)第 57 届年会本周在意大利佛罗伦萨开幕。我们借此机会回顾了动画 NLP 领域的主要研究趋势,并从商业角度阐述了一些影响。这篇文章是由过去 20 年中基于统计和自然语言处理的 ACL 论文分析支持的。

1.动机

与其他物种相比,自然语言是人类思维的主要特征之一。NLP 是当今科技讨论中的一个主要术语,它涉及计算机如何理解和生成语言。过去几十年中,自然语言处理的兴起得到了几项全球发展的支持——围绕人工智能的普遍宣传,深度学习领域的指数级进步以及可用文本数据数量的不断增加。但是嗡嗡声背后的实质是什么呢?事实上,NLP 是一个高度复杂的跨学科领域,由语言学、数学和计算机科学的高质量基础研究不断提供。ACL 会议将这些不同的角度汇集在一起。如下图所示,研究活动在过去几年里蓬勃发展:

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

图 1:各年在 ACL 会议上发表的论文数量

在下文中,我们总结了数据策略、算法、任务以及多语言 NLP 方面的一些核心趋势。该分析基于自 1998 年以来发表的 ACL 论文,这些论文使用 NLP 和机器学习领域的特定领域本体进行处理。

2.数据:解决瓶颈问题

免费提供的文本数据的数量呈指数级增长,这主要是由于 Web 内容的大规模生产。然而,这一庞大的数据体带来了一些关键挑战。第一,大数据本来就有噪音。想想石油和金属等自然资源——它们需要经过提炼和提纯的过程,才能用于最终产品。数据也是如此。一般来说,生产渠道越“民主”,数据就越脏——这意味着需要花费更多的精力来清理数据。例如,来自社交媒体的数据将需要更长的清洗管道。除此之外,你还需要处理大量的自我表达,比如微笑和不规则的标点符号,这些在更正式的场合,比如科学论文或法律合同中通常是不存在的。

另一个主要挑战是标记的数据瓶颈:严格来说,大多数最先进的算法都是受监督的。他们不仅需要有标签的数据,还需要有标签的大数据。这与深度学习家族的高级复杂算法尤其相关。正如儿童的大脑在学习母语之前首先需要最大的输入量一样,为了“深入”,算法首先需要大量的数据来包含语言的整体复杂性。

传统上,小规模的训练数据是手工标注的。然而,对大型数据集进行专门的手动注释会带来效率上的损失,这是很难接受的,尤其是在业务环境中。

有哪些可能的解决方案?一方面,在管理方面有一些增强,包括众包和培训数据即服务(TDaaS)。另一方面,在机器学习社区中也提出了一系列创建带注释数据集的自动变通方法。下图显示了一些趋势:

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

图 2:培训数据的创建和再利用方法的讨论(通过各年论文数量标准化的提及量)

很明显,在过去的五年中,T2 的预培训已经有了最大的增长。在预训练中,首先在大型通用数据集上训练模型,随后使用特定于任务的数据和目标进行调整。它的流行很大程度上是因为谷歌和脸书等公司正在向开源社区提供开箱即用的大型模型。特别是 Word2Vec、FastText 和 BERT 等预训练的单词嵌入允许 NLP 开发人员跳到下一个级别。迁移学习是跨不同任务重用模型的另一种方法。如果不能重用现有模型,可以利用少量已标记的数据来自动标记更大量的数据,就像在远距离弱监督中所做的那样——但是,请注意,这些方法通常会导致标记精度下降。

3.算法:深度学习中的一系列中断

在算法方面,近年来的研究主要集中在深度学习家族上:

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

图 3:深度学习算法的讨论(按各年论文数量标准化的提及量)

单词嵌入显然被占用了。Mikolov 等人(2013)介绍了单词嵌入的基本形式。单词嵌入背后的普遍语言学原则是分布相似性:一个单词可以通过它出现的上下文来表征。因此,作为人类,我们通常可以用合适的词,如“交易”或“合同”来完成句子“客户今天签署了 __”。单词嵌入允许自动完成这项工作,因此对于解决上下文感知问题的核心非常有效。

虽然最初的嵌入算法 word2vec 是基于统计的,并且没有考虑到诸如歧义、上下文敏感性和语言结构之类的生活复杂性,但是随后的方法已经用各种语言信息丰富了单词嵌入。顺便说一句,你不仅可以嵌入单词,还可以嵌入其他内容,如词义、句子和整个文档。

神经网络是深度学习的主力(参见 Goldberg 和 Hirst (2017)对 NLP 背景下基本架构的介绍)。卷积神经网络在过去几年中有所增长,而传统的递归神经网络(RNN) 的受欢迎程度正在下降。一方面,这是由于更高效的基于 RNN 的架构的可用性,如 LSTMGRU 。另一方面,Sutskever 等人(2014)在序列到序列 (seq2seq)模型中引入了一种新的、相当具有破坏性的顺序加工机制——注意。如果你使用谷歌翻译,你可能会注意到几年前翻译质量的飞跃——seq 2 seq 是罪魁祸首。虽然 seq2seq 仍然依赖于管道中的 RNNs,但从 2017 年开始的另一项重大进步, transformer 架构终于摆脱了递归,完全依赖于注意力机制(Vaswani et al. 2017)。

深度学习是一个充满活力和迷人的领域,但从应用的角度来看,它也可能相当令人生畏。当它出现时,请记住,大多数开发都是由大数据规模效率的提高、上下文感知以及对不同任务和语言的可扩展性所推动的。对于数学介绍,Young 等人(2018)对最先进的算法进行了出色的概述。

4.整合各种 NLP 任务

当我们观察特定的 NLP 任务时,如情感分析和命名实体识别,库存比底层算法稳定得多。多年来,从诸如句法分析和信息提取的词干提取的预处理任务到诸如情绪/情感分析和语义分析的面向语义的任务,已经有了梯度发展。这对应于 Cambria 等人(2014)描述的三条“全局”自然语言处理发展曲线——语法、语义和上下文感知。正如我们在上一节中看到的那样,第三条曲线——对更大环境的意识——已经成为新深度学习算法背后的主要驱动力之一。

从更普遍的角度来看,有一个有趣的趋势是任务不可知的研究。在第 2 节中,我们看到了现代数学方法的泛化能力是如何在迁移学习和预训练等场景中得到利用的。事实上,现代算法正在开发惊人的多任务能力——因此,手头特定任务的相关性降低了。下图显示了自 2006 年以来对特定 NLP 任务的讨论的总体下降趋势:

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

图 4:特定 NLP 任务的讨论量

5.多语研究札记

随着全球化的发展,走向国际成为企业发展的必要条件。传统上,英语是大多数 NLP 研究的起点,但是近年来对可扩展的多语言 NLP 系统的需求增加了。这种需求在研究界是如何体现的?将不同的语言视为我们观察同一个世界的不同镜头——它们共享许多属性,这一事实完全符合现代学习算法日益增强的抽象和概括能力。尽管如此,特定于语言的特性必须彻底解决,尤其是在预处理阶段。如下图所示,ACL 研究中涉及的语言多样性不断增加:

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

图 5:每年频繁使用的语言(>每种语言 10 次提及)

然而,正如在上一节中看到的 NLP 任务一样,一旦特定语言的差异被下一波算法抵消,我们可以期待一次整合。图 6 总结了最流行的语言。

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

图 ACL research 研究的语言

对其中一些语言来说,研究兴趣符合商业吸引力:英语、中文和西班牙语等语言汇集了大量可用数据、庞大的母语人口以及相应地理区域的巨大经济潜力。然而,大量的“小型”语言也表明,自然语言处理领域正在朝着理论上合理处理多语言和跨语言泛化的方向发展。

总结

在全球人工智能热潮的推动下,NLP 领域正在以新的方法和颠覆性的改进爆发。有一种向建模意义和上下文依赖的转变,这可能是人类语言中最普遍和最具挑战性的事实。现代算法的泛化能力允许跨不同任务、语言和数据集的有效扩展,从而显著加快 NLP 开发的 ROI 周期,并允许将 NLP 灵活高效地集成到各个业务场景中。

敬请关注 ACL 2019 的回顾和 NLP 趋势的更多更新!

参考

  • E.坎布里亚和 b .怀特(2014 年)。跳跃 NLP 曲线:自然语言处理研究综述【综述文章】。比较。智能。玛格。 9,2。
  • J.德夫林、m .魏、k .李和 k .图塔诺娃(2018)。BERT:用于语言理解的深度双向转换器的预训练。
  • Y.戈德堡和 g .赫斯特(2017)。自然语言处理中的神经网络方法。摩根&克莱普出版社。
  • T.Mikolov 等人(2013 年)。词和短语的分布式表示及其组合性。在第 26 届国际神经信息处理系统会议录 —第 2 卷(NIPS’13)。
  • R.Prabhavalkar、K. Rao、Kanishka、T. Sainath、B. Li、L. Johnson 和 N. Jaitly (2017 年)。语音识别中序列间模型的比较。939–943.10.21437*/散点*. 2017–233。
  • I. Sutskever、O. Vinyals 和 Q. V. Le (2014 年)。用神经网络进行序列间学习。第 27 届国际神经信息处理系统会议论文集 —第 2 卷(NIPS’14)。
  • A.Vaswani,N. Shazeer,N. Parmar,J. Uszkoreit,L. Jones,A. N. Gomez,凯泽和 I .波洛苏欣(2017)。你需要的只是关注。第 31 届国际神经信息处理系统会议论文集(NIPS’17)。
  • T.Young、D. Hazarika、s .茯苓和 E. Cambria (2018 年)。基于深度学习的自然语言处理的最新趋势。IEEE 计算智能杂志 —第 13 卷。

用 Python 做一个罗马皇帝掌权的柱状图

原文:https://towardsdatascience.com/make-a-bar-chart-about-roman-emperors-rise-to-power-with-python-7d94e4131243?source=collection_archive---------23-----------------------

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

作为一个古代史和 Python 编程的爱好者,当我偶然发现这个关于罗马皇帝的数据集时,我知道我必须做什么……用它来制作 Python 中的数据可视化!

浏览这些专栏,我决定绘制皇帝们掌权的不同方式。当然,你可能生来就是皇帝的儿子,但是“夺权”实际上有多少次奏效了呢?

欢迎和我一起编写代码,学习如何阅读 CSV 文件和用 Python 制作条形图!本教程将假设您了解基本的 Python 编程知识,但是即使没有这些知识,您也可以继续学习。

为了查看数据可视化,我将在 Spyder IDE 中编码,您可以下载它作为 Anaconda 发行版的一部分。你也可以在笔记本上写代码。

用熊猫读取 CSV 文件

你可以在这里查看关于罗马皇帝数据的 CSV 文件。这一切都在一个漂亮的数据表中进行了美化,隐藏了 CSV 的实际含义:逗号分隔的值。

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

So pretty!

如果您查看原始 CSV ,您将会看到所有数据被挤在一起,每一列仅由逗号分隔。呀!

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

Egads!

但实际上,CSV 是一种很好的文件类型。我们可以使用 Python 库 pandas 轻松读取 CSV 数据。

让我们从导入 pandas(这样我们就可以阅读这个 CSV)和 matplotlib 开始,matplotlib 是另一个允许我们生成一些出版物质量的数据可视化的库。

在代码的顶部,编写:

import pandas as pd
import matplotlib.pyplot as plt

使用简写pd来表示 pandas,使用plt来表示 matplotlib.pyplot 是相当标准的,这也为我们输入长库名省去了很多麻烦。

现在我们可以使用 pandas 来读取 CSV 文件:

df = pd.read_csv("[https://raw.githubusercontent.com/zonination/emperors/master/emperors.csv](https://raw.githubusercontent.com/zonination/emperors/master/emperors.csv)", encoding='latin-1')

是的,就是这么简单!好了,关于代码说几句:

  • 为什么我在df中调用我存储 CSV 的变量?df是一个很常见的用于 DataFrame 对象的变量名,这是 pandas 在读取 CSV 文件时创建的。
  • 那个encoding='latin-1'是怎么回事?当我第一次尝试读取这个 CSV 文件时,我得到了一个 UnicodeDecodeError。堆栈溢出建议我尝试用不同的编码读取文件,比如latin-1。瞧,电脑可以读取文件了!

看到变量中存储了什么总是好的。通过运行以下代码,我们可以看到数据框df的顶部和底部:

print(df.head())
print(df.tail())

你可以按下一个看起来像绿色的“播放”按钮来运行 Spyder 中的程序。

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

如果您可以在您的控制台中看到一些东西,看起来模糊地像一个带有索引号的数据表,那么您可能就在正确的轨道上!

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

In this printing of df.head(), you can only see the index and the last column, which credits a Reddit user for the data table. But, there are actually 16 columns!

将数据转换成字典

好的,我有 16 列数据。但是正如我之前提到的,我真正感兴趣的一个列是“上升”列。我想看看是生为皇帝的儿子更普遍,还是通过其他方式夺取权力更普遍。

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

Yeah, it starts out with a lot of “birthright,” but then things get interesting…

我最初认为我想做一个直方图,但是我从 Python Graph Gallery 中了解到,直方图只接受数字数据,并且只显示它的分布。另一方面,我有分类数据:不同的权力路径,比如“与生俱来的权力”和“夺取的权力”。我还需要计算第二个数字变量:有多少不同的皇帝以这种方式掌权。

有了一个分类变量和一个数值变量(待计算),我想做的是一个条形图

有了df["rise"],我可以访问通往权力之路的整个栏目,一个长长的列表,比如“与生俱来的权利,与生俱来的权利,参议院的任命,军队的任命”等等。我需要某种方法来计算出生权的数字,军队任命的数字等等。

幸运的是,pandas 通过一个value_counts()方法提供了这个功能。如果我调用列df["rise"]上的value_counts(),它会给我一个数字列表:到底有多少皇帝是通过世袭、任命元老院等等获得权力的。

此外,我可以调用value_counts()上的keys()来找出哪些数字对应于哪种成为皇帝的方法。

将此代码添加到您的中,以获得数字和相应的电源路径:

numbers = df["rise"].value_counts()
paths = df["rise"].value_counts().keys()

现在,我有了一个通往权力的独特路径的列表,以及对应于每条路径的数字。

当然,打印变量的值总是一个好主意,只是为了确保它们包含您认为它们包含的内容。

是时候制作条形图了!

用 matplotlib.pyplot 制作条形图

用 Python 做图的代码太简单了,感觉不可能是真的。但事实如此。

添加此代码,用 Python 生成皇帝死因的条形图:

plt.title("Roman Emperors' Paths to Power")
plt.ylabel("Number of Emperors")
plt.xlabel("Paths to Power")
plt.bar(paths, numbers)
plt.show()

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

简直令人惊讶(除了 x 轴上的一些压扁的文本——我们很快会处理这个问题)。您会注意到前三行代码只是添加了标题并标记了轴。所有繁重的工作都是通过调用第四行中的plt.bar()来完成的。最后一行只是显示图表。

在这里,我们可以看到“与生俱来”的门槛似乎比其他的更高…所以这可能是比“夺取政权”更可靠的成为皇帝的方式!

收尾

好,所以你实际上看不到 x 轴上的标签,因为它们都被挤在一起了。

幸运的是,您可以用这行代码旋转 x 轴上的标签:

plt.xticks(rotation=90)

在调用plt.show()之前一定要加进去。

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

最后,我们需要添加一些颜色。我们的可视化应该是引人注目的!

当你调用plt.bar()时,你也可以通过color参数指定你想要的颜色。例如,如果我写:

plt.bar(paths, numbers, color='mcbkyrg')

也就是说,我希望第一列是品红色(m),第二列是青色©,然后是蓝色(b),黑色(k),黄色(y),红色®和绿色(g)。然后顺序又开始了。(点击阅读 matplotlib 中关于颜色的更多信息。)

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

完美!

扩展ˌ扩张

要为您的条形图添加更多功能,或者获得创建新功能的灵感,请访问 Python Graph Gallery 查看条形图!

以数据科学为生,而不是用时间来换取金钱

原文:https://towardsdatascience.com/make-a-living-in-data-science-and-not-trading-time-for-money-d85e2a3e7603?source=collection_archive---------16-----------------------

单身创业者的 5 个产品创意

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

你为自己制定了一个计划。

你想在数据科学领域谋生。

那你为什么不申请一份数据科学的工作呢?现在有很多,因为我们都知道数据科学现在很热门。

你告诉我,你想创建一个有价值的、可重复的和可扩展的商业模式,你不想用时间来换取金钱。

我告诉你,你可以搜索正在寻找数据科学联合创始人的初创公司。再说一次,现在有很多机会。

你告诉我你不想那样。相反,你想要建立一个没有联合创始人和投资者的小型自举企业。

我认为你是一个梦想家,你的想法有点疯狂。然而,我越想越喜欢这个想法。

让我们集思广益,想出一些你作为一个个体创业者可以做的数据科学产品创意。

多么复杂的一个词。我们称之为 Solopreneur 。这个术语更难理解。

1.数据科学课程

让我们从最明显的想法开始。你可以在像 Udemy 这样的平台或者你的网站上提供数据科学课程。很多人现在已经在这么做了。

Matt Dancho 是这样做的一个很好的例子。我和他有联系,我喜欢 LinkedIn 上关于他的课程的帖子。

外面有很多课程;然而,细分市场总是有机会的。

2.机器学习模型的付费 API

你可以在特定领域的标记图像上训练一个奇特的神经网络。你发布一个 API,让用户为使用 API 付费。看起来比实际情况复杂。有很多免费的数据集可以用来训练模型。您可以组合不同数据集中的数据。如果你使用迁移学习技术,你甚至不需要很多数据。

3.市场分析

这里面有很多机会。 AirDna 为 Airbnb 的主人和想要投资 Airbnb 房产的人提供市场分析报告。他们还提供了一个定价引擎。

ViralLaunchJungleScout 为想要创办亚马逊 FBA 业务的人提供分析。

为什么不开始这样的事情呢?人们越来越受数据驱动,并且有许多平台。

优步的市场分析怎么样?

4.销售数据

对数据集有巨大的需求。你可以收集数据,并用亚马逊机械土耳其人(AMT)给这些数据贴上标签。然而,这比听起来更复杂,需要时间或/和金钱的投入。你也可能会因为收集属于他人知识产权的图片而遇到法律问题。

你可以用机器学习技术自动标注。要有创意!

5.数据新闻

你可以写数据故事文章并出售。你可以搜寻流行的东西,收集数据,写一篇可视化的文章,然后出售这些文章。

规模不大,但是一旦你出名了,你就能赚很多钱。

结论

数据科学产品对创业者来说是有机会的。

除了数据科学,你还需要其他技能,比如营销或销售,才能变得现实。

然而,如果你掌握了数据科学,你也会掌握这些技能。

我给自己写这个故事是为了集思广益,锻炼我的写作能力。 写这篇文章时,我想到的另一个想法是在媒体上创建一个新的出版物“数据科学 Solopreneur”。 你有更多的想法吗? 你有什么想法? 把你的评论发给我

原载于 2019 年 4 月 14 日https://jenslaufer.com

通过为这些开源项目做贡献来产生社会影响

原文:https://towardsdatascience.com/make-a-social-impact-by-contributing-to-these-open-source-projects-1d6d34e2b8b1?source=collection_archive---------11-----------------------

玩得开心,一路上帮助数百万人

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

Photo by Zac Durant on Unsplash

十月是庆祝开源软件的一个月,也被称为另一个标题 Hacktoberfest。

为了邀请其他人通过他们的工作产生影响, Ovio 策划了一个社会影响项目集供您参与。

这里有一个列表,列出了那些你可以用你的工作立即帮助和影响生活的项目。

开放式机器学习

这个知识库属于 OpenML,OpenML 是一个在线机器学习平台,用于共享和组织数据、机器学习算法和实验。

随着机器学习正在增强我们理解自然和建设更美好未来的能力,我们让研究、教育和工业领域的每个人都能够透明和轻松地使用它至关重要。

技术 : CSS,PHP,JavaScript

你可以看到一个开放问题的列表,这里的也标注为 hacktoberfest

自(动)调焦装置

这个存储库是一个使用数据科学和技术来解决一个重要问题的项目。

这个项目使用深度学习计算机视觉,根据图像中包含的动物来标记由运动激活的“相机陷阱”拍摄的图像。这项标记任务的精确模型可以解决野生动物保护工作的一个主要瓶颈。

科技 : Jupyter 笔记本

您可以在此处看到一个开放问题列表,您可以立即参与其中。

木卫四

这个存储库包含 Callisto 的源代码,这是一个关于性侵犯的在线报告系统。

幸存者,为了幸存者。Callisto 是一个非营利组织,它创造技术来检测职业性胁迫和性侵犯的惯犯。

技术 : Python

这里有一个列表列出了您可以参与的未决问题。

奥皮亚

Oppia 打算在世界各地教育工作者的帮助下,通过提供免费的高质量课程,为学生提供优质教育。

通过在世界各地教育工作者的帮助下创建一套免费、高质量、明显有效的课程,Oppia 旨在为学生提供高质量的教育,无论他们身在何处,也无论他们可以获得哪些传统资源。Oppia 的使命是帮助任何人以有效和愉快的方式学习他们想要的任何东西。

它有许多开放的问题,你可以开始作出贡献。

技术 : Python,TypeScript,HTML

您可以看到许多未决问题的列表,这些问题在这里也被标记为*。*

打开街道地图 iD

这个库属于 JavaScript 中的 OpenStreetMap 编辑器。

技术 : JavaScript,CSS

  • 故意简单。它让您在不破坏他人数据的情况下完成最基本的任务。
  • 它支持所有流行的现代桌面浏览器:Chrome、Firefox、Safari、Opera、Edge 和 IE11。
  • iD 还没有为移动浏览器设计,但这是我们希望添加的东西!
  • 用 d3.js 渲染数据

它有许多开放的问题,你可以做出贡献,你可以在这里看到。

签名

这个存储库属于 project SignDict,这是一个开放的手语词典,您可以在其中贡献其源代码,或者通过添加一个缺少的符号来贡献词典本身。

SignDict 认为沟通是开放社会的关键。为了增加聋人社区的融合,我们创建了一个生活字典,并邀请每个人都来参与。我们的使命:帮助彼此了解。

技术:药剂,HTML,Vue

它有许多未决的问题,其中许多被标为T21 黑客节,你可以对它做出贡献,你可以在这里看到。**

操作码

这个存储库是应用程序操作代码的前端。

技术 : JavaScript,CSS

我们 Operation Code 致力于为退伍军人和他们的家庭提供一条进入科技职业生涯的有效途径。我们直接与参议员、众议员和女议员合作,通过允许在新兵训练营编码中使用《退伍军人权利法案》,让退伍军人完全控制他们的未来。我们是致力于帮助退伍军人和家庭开始软件开发生涯的最大社区。

这个项目也有许多开放的问题,其中许多都有标签 hacktoberfest ,你可以在这里看到。

操作码资源

这是与编程和网络安全相关的学习资源的操作代码 API 的存储库。

技术 : Python

这里有一个列表,列出了许多你可以立即参与的未决问题。

操作码 Pybot

这个库代表操作码的官方 Slackbot。

技术 : Python

这里有一个列表,列出了许多你可以立即参与的开放性问题。

HOTOSM 网站

这个知识库是人道主义 OpenStreetMap 团队的网站。

HOT 是一个国际团队,致力于通过公开地图进行人道主义行动和社区发展。我们提供地图数据来革新灾害管理、降低风险,并为实现可持续发展目标做出贡献。HOT 通过提供培训、设备、知识交流和实地项目,使社区、非政府组织、国际组织和政府合作伙伴能够使用 OpenStreetMap 并为其做出贡献,以应对与当地相关的挑战。

技术 : HTML,CSS,JavaScript

这里有一个列表标有 hacktoberfest 的未决问题,您可以参与其中。

开放食品网络

这个知识库是关于开放食品网络项目的,它连接了供应商、经销商和消费者来交易当地的农产品。

开放食品网络是开放食品基金会的旗舰项目,旨在为公平和可持续的食品系统开发、积累和保护开源知识、代码、应用程序和平台。

这是一份列表中标记为 hacktoberfest 的未决问题,您可以参与其中。

开放式食品事实服务器

这个存储库属于开放的食品事实产品数据库,这是一个由每个人制作的食品产品数据库,为每个人服务。

开放食品事实是一个食品产品数据库,包括配料、过敏原、营养事实和我们可以在产品标签上找到的所有信息。

开放食品事实是一个非营利性的志愿者协会。像您这样的 25.000 多名贡献者已经添加了来自 150 个国家的 868.000 多件产品,他们使用我们的 Android、iPhone 或 Windows Phone 应用程序或他们的相机扫描条形码并上传产品图片和标签。

技术 : HTML,Perl

这个项目有许多未解决的问题,你可以在这里找到。

打开食品事实 iOS

这个存储库代表了用 Swift 编写的 iOS 开放食品事实的本地版本。

科技:雨燕

这里有一个列表,列出了许多你可以立即参与的未决问题。

开放食品事实机器人

这个库代表了用 Java 编写的 Android 开放食品事实的本地版本。

技术 : Java

这里有一个列表,列出了许多你可以立即参与的开放性问题。

尿布

这个存储库属于 Diaperbase,这是一个尿布库的库存系统。

该应用程序是一个库存管理系统,旨在尽可能直接和明确地解决尿布库的需求。尿布银行维持库存,接受捐赠和其他吸收尿布(和相关用品)的方式,并向社区伙伴组织分发。像任何非营利组织一样,他们也需要对这些数据进行报告,并拥有他们需要的日常运营信息。该应用程序旨在满足所有这些需求,并尽可能方便尿布库自身的一般操作(例如,通过使用条形码阅读器、秤称重、库存审计)。

技术 : Ruby,HTML,CSS,JavaScript

这里有一个列表,上面有许多被标为 hacktoberfest 的未决问题,你可以立即参与其中。

如果-我

这个存储库是一个开源应用程序,旨在用于与亲人分享健康经验。

if-me 是一个心理健康体验社区,鼓励人们与信任的盟友分享他们的个人故事。处理心理健康是我们之所以为人的原因。但对我们大多数人来说,很难公开自己的想法。

技术 : Ruby,JavaScript,HTML,CSS

这是一份列表中的未决问题,标记为 hacktoberfest ,您可以参与其中。

地形故事

该存储库属于应用程序,旨在使当地社区能够定位和映射他们自己关于对他们有重要意义或价值的地方的口头讲故事传统。

Terrastories 由 Mapbox 平台提供支持,设计为完全离线兼容,因此远程社区可以完全访问该应用程序,而无需互联网连接。

技术 : Ruby JavaScript,HTML,CSS,Dockerfile

这里有一个列表标为 hacktoberfest 的未决问题,你可以参与其中。

一切就绪

这个库是 AllReady 的源代码。

AllReady 是一个开源解决方案,侧重于提高当地社区人道主义和救灾组织开展备灾活动的意识、效率和影响。

技术 : C#,HTML

这里有一个列表,上面标有 hacktoberfest ,你可以参与其中。

讨论

这个 GitHub 存储库代表了 app Talk ,为记者提供了更好的评论体验。

网上评论都断了。我们的开源评论平台 Coral 重新思考了审核、评论显示和对话的功能,为围绕您的工作进行更安全、更智能的讨论创造了机会。

这里有一个列表标记为 hacktoberfest 的未决问题,您可以参与其中。

乌沙迪

Ushahidi 是一个用于信息收集、可视化和交互式制图的开源 web 应用程序。

我们是一家社会企业,为众多行业和公民社会提供软件和服务,以帮助改善自下而上的信息流。Ushahidi 在斯瓦希里语中翻译为“证词”,是在 2008 年肯尼亚大选后暴力事件后开发的暴力报告地图。我们相信,如果被边缘化的人能够容易地与那些旨在为他们服务的人沟通。Ushahidi 帮助您从以下来源收集信息:短信、Twitter、RSS 订阅源、电子邮件。它帮助你处理这些信息,分类,地理定位,并在地图上发布。

技术 : JavaScript,HTML

这里有一个列表标记为未完成的拉动式请求,您可以查看。

这是一个很长的列表,应该有希望提供各种各样的项目,您可以从中选择帮助。

您不必成为 Python 专家,也不必掌握某个特定的框架来通过这些存储库产生影响。你甚至可以邀请其他人也为他们做贡献。

跟我上 碎碎念

利用 3 个级别的数据分析做出更好的数据职业决策

原文:https://towardsdatascience.com/make-better-data-career-decisions-with-the-3-levels-of-data-analysis-cddc3b4cbd7a?source=collection_archive---------24-----------------------

如何评估未来雇主作为你数据职业的一部分?

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

更新:对复杂的分析前景感到困惑?查看我们的书: 《分析学设置指南》

几周前,我遇到了一个几年没见的初级软件工程师。我最后一次和他说话是在我(当时的)公司给了他一个职位——他最终拒绝了。“我想从事机器学习和数据方面的工作,”他当时曾说,“我认为另一家公司会给我更好的机会。”

当然,他是完全正确的。我以前的公司没有太多的数据能力;他不可能在我提供给他的角色中学到他想要的技能。但在我们最近的一次会面中,他告诉我,在另一家初创公司,他花了几年时间才进入“真正的”数据科学:“我们现在才开始建立一个数据部门,我正在从一般的软件工程转向数据科学。对此我真的很开心!”

数据团队职业不同于软件工程、产品管理或用户界面设计

他的经历中隐藏着一个有趣的事实,我认为值得在这里更详细地探讨。我朋友的经历反映了一个潜在的现实:数据团队的职业与软件工程、产品管理或用户界面设计的职业不同。它们之所以不同,是因为它们依赖于组织的周围环境,而后三类职业则不然。

在软件工程、产品管理和设计领域,工作要求大体相似。当然,服务公司中的软件工程与产品公司中的软件工程略有不同,但是总的来说,软件人员的职责非常相似。对于 UI/UX 设计师来说也是如此——对于产品经理来说则稍差一些——但是这些角色在很大程度上是围绕着相同类型的体验聚集在一起的。

与在数据团队中工作的数据分析师或数据科学家形成对比。根据他们所在团队的组织,他们的生活经历有很大的不同。某些公司要求他们的分析师进行适当的数据建模。其他人只处理自由形式的 SQL 查询,并在 Google sheets 中共享这些查询。一些幸运者执行机器学习和统计分析。但是还有一些人认为他们的数据分析师只不过是导出 SQL 和 Excel 的猴子。

那么,我们收到分析师写的博客文章,因为“缺乏影响力”而留下数据,这有什么好奇怪的呢?

为什么会这样呢?答案很明显:与软件工程师、产品经理或设计师不同,数据团队成员服务于内部用户,而不是外部用户。这意味着你的日常经历和学习机会在很大程度上取决于你所加入的组织。这意味着你不能假设所有的数据团队角色(在不同的公司)都是平等的。这意味着,就你的职业生涯而言,在你选择为组织工作之前,你必须培养评估组织数据成熟度的能力。

数据分析的三个层次

Emilie Schario 在 GitLab 发表了一篇关于三级数据分析的博文。公司存在于这些级别中的一个,它们必须从一个级别前进到下一个级别。这三个级别依次是:

  1. 汇报 —汇报是最底层。正如夏里奥所言:当你没有答案时,你永远不会放弃寻找事实。这一级别的示例问题有:“上周有多少新用户访问了我们的网站?”“这个月我们获得了多少线索?”有时,公司甚至达不到这一水平,因为他们缺乏系统收集业务数据的组织能力。其他时候,他们收集数据,但是他们不会花时间去关注它。报告是最底层的数据分析;如果你不收集数据,或者你没有使用数据的文化期望,你就不会根据事实做出决定。
  2. 洞察 —洞察是报告之上的下一级。如果说报道是收集事实并对其进行报道,那么洞察力就是理解事实之间的关系。通常情况下,只有当您将来自多个来源的数据结合起来时,洞察力才会显现出来。例如:本月取消订阅的新客户数量是一个报告指标。但是,如果我们将这些数据与销售 CRM 中的交易数据结合起来,我们可能会发现我们的目标市场是一个糟糕的细分市场。后一种观察是一种洞察力,可以导致销售和产品中的行为变化(“未来不要瞄准或服务于这个细分市场;我们不适合他们)。
  3. 预测 —洞察之后才是预测。正是在这个层次上,你开始看到复杂的技术,如统计分析和机器学习。这是有意义的:在你的组织越来越了解各种度量之间的关系之后,你可能开始做出明智的商业决策来推动你想要的结果。一个著名的例子是脸书发现,在头 10 天内添加至少 7 个好友的用户最有可能留下来。这一发现推动了脸书大量的产品决策,并最终导致他们赢得了社交媒体竞赛。只有在报告功能和洞察挖掘功能成为整个组织的第二天性之后,这种预测性发现才会出现。

我提供了沙里奥三个层次的快速总结,但我鼓励你阅读的完整帖子。然而,Schario 关注的是组织内的领导者,她继续讨论了沿着这三个层次前进的一些方法。

我对谈论那个不感兴趣。我的问题更简单:假设你是一名数据分析师,或者数据科学家。你在找下一份工作。很明显,你应该根据数据成熟度来选择组织——如果你想学习机器学习或使用回归模型,你应该选择“预测”层的公司;如果你想对商业决策产生巨大的影响,你希望在一家坚定地站在“洞察力”层面的公司工作。

你如何识别公司目前所处的水平?

(一种更复杂的形式是找出那些即将从一个层次过渡到另一个层次的公司,因为这是你获得最多学习机会的时候。更不用说,随着公司发展到新的水平,你还有机会在公司留下自己的印记。)

但是你是怎么做到的呢?你如何识别公司目前所处的水平?

头部伪题

你想问的是我称之为“T6”的假问题“T7”。假头是美式足球中的一个动作,球员把头转向一个方向,但却跑向另一个方向。假头问题是假装问一件事,但实际上是问另一件事的问题。

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

例如,如果你面试一家风险投资的创业公司,你可以问“告诉我过去一年你在公司经历的变化。”

对这个问题的一个可接受的回答是对公司成长方式的深思熟虑的回答。另一个很好的回答是“哇,当我想起这件事的时候,我真不敢相信我们做了多少/改变了多少/我们走了多远。”

一个令人担忧的答案是“老实说,差不多。”当风险投资资助的初创公司停滞不前时,它们就会死去,所以你可能想继续问一些关于公司近期历史的问题。

这是一个伪问题,因为很难猜测你真正想要的是什么。表面上,你是在询问关于公司生活的信息。你的面试官可能会认为你在试图衡量一种文化,或者你在试图评估在那里工作是什么样的。或者,他们可能认为你想感受一下公司的发展机会。当然,现实是你想要评估初创公司的增长率,因为这在物质上影响了你在那里的时间(和你的职业生涯)。

同样,当你提问来评估潜在雇主的数据成熟度时,你会希望提问的方式不会完全暴露你的意图。这里有一些建议,不过你显然应该针对你所在的具体行业来定制你的问题:

  1. **“你的数据堆栈是什么样的?”**这是一个显而易见的问题,但你要寻找的是告诉你公司目前属于哪个级别的信号。例如,处于“预测”层的公司可能会投入一些精力在服务器上托管 Jupyter 笔记本,而处于“洞察”层的公司则不会。最糟糕的情况是,您需要定期为业务用户手动导出 csv 文件,而这些业务用户在 Excel 中对这些文件进行分析。如果一家公司这样做的话,它离“报告”水平不会太远。
  2. **“销售或营销如何评估他们的表现?”**与公司的其他职能相比,公司的销售和营销通常更受数据驱动(如果公司没有销售职能,请将这个问题的主题替换为“客户获取”——即公司的哪个部门带来了新用户)。一个很好的答案是,如果“前端”销售、数据分析和“后端”产品/客户支持之间存在某种跨部门参与。请记住,如果不跨越多个数据源,就无法获得洞察力。如果公司纯粹在销售组织内部评估其销售漏斗,这意味着它最有可能在数据分析的报告级别,而不是更远。
  3. **“哪些部门使用数据团队的报告?”**这里的一个好答案是“许多”,每个都有具体的例子。这是比较少见的。一个不错的回答是,销售、营销和产品部门在做,但没有其他人真正关注分析;一个不好的回答是,销售人员在 Excel 中自行完成,而产品人员并没有真正将洞察发现视为一个重要的过程。

当然,在实践中,你要问的问题应该根据你所在行业的规范进行调整。在 Holistics,我们与亚洲公司以及西方公司合作,我们注意到西方公司总体上比东方公司更受数据驱动。一般来说,低利润率的公司比高利润率的公司更倾向于报告驱动型;科技公司往往比非科技公司更受数据驱动,美国公司比国外公司更受数据驱动。你的问题应该反映出你所在就业市场的基本现实。

但实际上,如果你应该从这篇文章中学到什么,那就是数据团队的职业生涯在很大程度上取决于你所在公司的现实。想学数据科学,挑一家做数据科学的公司;如果你想感觉自己作为一名分析师产生了影响,那就选择一家决策以数据为导向的公司。使用三个层次的数据分析来判断一个潜在的公司属于哪一层……在你开始为他们工作之前就这样做。一路顺风,祝你好运。

原文由 Cedric 发布,我的同事于 2019 年 12 月 22 日https://www . holistics . io

使用 AWS & Lambda (Python)通过 12 个步骤轻松获取数据

原文:https://towardsdatascience.com/make-data-acquisition-easy-with-aws-lambda-python-in-12-steps-33fe201d1bb4?source=collection_archive---------4-----------------------

告别复杂的 ETL 管道、SQL 数据库和其他复杂系统

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

本文将简要介绍 AWS Lambda 和构建一个完全无服务器的数据管道。这篇文章是为至少对 Python 有基本(我指的是基本)理解的人写的,但是你也可以是 AWS 的新手。我们将创建一个 AWS 帐户,然后有一个 Lambda 函数从 Craigslist 拉数据,并存储在 S3 桶为我们自动,每天。

**关于我:**数据科学家和爱好者,他不断尝试学习新技术,让我的生活更轻松。像数据科学社区中的许多人一样,我是自学的,没有统计学或 cs 背景。在前世,我是一名机械工程师,但那感觉像是很久以前的事了。这些年来,我对 Python 和 AWS 的掌握相当不错(我有一些认证),因为我总是从别人那里学到很多东西,所以我认为该轮到我为社区做贡献了。如果你觉得这篇文章有用,请随时在 LinkedIn 上与我联系,或者查看我的 Github 个人资料。

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

AWS Lambda — Your serveless swiss army knife!

什么是 Lambda

我经常会遇到“我编写了这个 Python 函数,需要它每天运行”的场景。您可以在您的机器上设置一个 Cron,但是如果您的计算机关闭了呢?另一个选择是转向云。用 AWS 做这件事的老方法是启动一个 EC2 实例,SSH 到其中,给它一个函数或者 docker 映像,在那里设置一个 Cron 作业,等等。还不算太糟,但是有点痛。此外,如果我只需要一些日常运行的东西,我真的需要一个 EC2 实例整天运行吗?输入 Lambda(是的,我知道您也可以为此使用 Batch,但这是一个 Lambda 教程)。

AWS 有很多服务,但也许我最喜欢的是 AWS Lambda。基本上,它让你专注于编写代码,而不是处理那些烦人的事情,比如 VPC、EC2 实例、MySQL 数据库等等。只要写一些 Python,把代码交给 Lambda,它就会在云端执行这些代码。更好的是,你可以用各种方式触发代码:每分钟,每天一次,当你把东西放进 S3 桶时,等等。Lambda 非常棒(而且便宜),很快成为我最常用的 AWS 服务。

我们将要做什么

在 12 个简单的步骤中,我们将建立一个 Lambda 函数,每天自动从 Craigslist 获取数据,并将数据存储在 S3(JSON)中。这只是一个例子,但是您可以使用本教程以您指定的时间间隔自动运行任何 Python 函数。诚然,这篇文章有点长,但我想确保它很容易复制,尤其是对初学者来说。如果您遇到了问题,请随时联系我,我们可以尝试调试它。最后要注意的是,这里的一切都应该在免费层内,所以不会花你一分钱。Lambda 每月给你一百万个免费请求,所以除非你打算每秒钟都解雇这个宝贝,否则你应该很棒。

第一步:创建一个免费的 AWS 账户

前往 https://aws.amazon.com 的,注册一个免费账户。请注意,您需要验证您的电话号码,但整个过程应该只需要几分钟。最后,选择“基本”计划,它将为你提供 12 个月的免费计算能力。

第二步:创建一个存储桶来存储我们的数据

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

Create An S3 Bucket

S3 桶是我们可以存储数据(或者更具体地说是对象数据)的地方。它基本上就像你电脑上的一个文件夹,但是在云中!进入服务>存储> S3,你将被带到 S3 启动画面。点击“创建存储桶”,给你的存储桶起个名字,然后选择离你最近的地区。我用桶来命名“我的超级甜桶”,你可以随意命名你的桶。只要知道桶名必须是全球唯一的,所以你不能有我的可怕的桶名。在给出名称和区域之后,只需使用所有的缺省值(单击 Next,直到创建了您的 bucket)。这将创建您的 bucket,并记下您对它的命名,因为我们稍后会用到它。

第三步:创建一个 Lambda 函数

现在我们有了一个存储来自 Lambda 的数据的桶,是时候创建我们的 Lambda 函数了。如果您将鼠标悬停在顶部的服务上,在计算下方,您会发现 Lambda。

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

Lambda is found under computer (common AWS Cloud Practitioner exam question)

因为你还没有制作 Lambda,你会看到一个闪屏,向你介绍 Lambda 的世界。点击“创建函数”按钮来创建您的 Lambda。

接下来,您将被要求命名您的函数,指定一种编程语言,并赋予它一个角色。

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

Create your Lambda function

先不说这个——什么是角色?亚马逊网络服务是一个巨大而神秘的怪兽,有很多事情在发生。值得注意的一点是,AWS 中的几乎所有东西都使用“最小权限”规则,基本上就是说,默认情况下,任何东西都没有访问任何东西的权限。例如,假设您在 AWS 网络中创建了一个名为 Bob 的用户。默认情况下,当 Bob 登录时,他不能访问任何 AWS 服务。鲍勃可以登录,但他不能使用 S3,EC2,Lambda 或其他任何东西。可怜的鲍勃。除非明确说明,否则不允许访问。总之,角色是一种以编程方式授予访问权限的方式。基本上,它会告诉 AWS“这是我的 Lambda 函数,我希望它能够访问 S3”。如果没有这个角色,你的 Lambda 函数将会像可怜的 Bob 一样无法访问。不要让你的 Lambda 像 Bob 一样。

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

Details for your Lambda function

不管怎样,你可以随意命名你的 Lambda 函数。我创造性地将我的名字命名为“pullCraigslistAds”。因为现在是 2019 年,我们是现代男女,我们将使用 Python 3.7,而不是任何 2.7 的废话。注意,Lambda 可以和许多其他编程语言一起使用,但是这里我们将使用 Python。现在权限可以设置为“创建一个具有基本 Lambda 权限的新角色”。我们将在教程的后面修正我们的角色。

第 4 步:为你的代码选择上传一个. zip 文件

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

Set your Lambda to take a Zip file

Lambda 的全部意义在于让它为我们执行一些代码。一旦你创建了 Lambda 函数,你会注意到浏览器中有一个代码编辑器。通常你可以直接在编辑器中写代码。然而,在本教程中,我们将使用一些外部(不是内置于 Python 中的)库,比如请求,我们将需要通过上传一个 zip 文件来做一些不同的事情。**如果你不需要导入任何不附带 Python 的库,你可以直接内联编写。如果您确实需要导入库,我们将需要 Zip 文件。**也就是说,Lambda 可以毫无问题地运行你的 Python 代码——但是如果你不需要 Pandas、Requests、Matplotlib 之类的库或者你用 Pip 安装的任何其他库呢?在本教程中,我们将使用 python-craigslist 库,所以我们使用“上传”。zip 文件”选项。

第五步:我们函数的代码

**注意:**如果你很急,想跳过一些步骤,你可以克隆 这个库 它会提供你需要交给 Lambda 的最终 Zip 文件。如果您只是复制回购,您可以跳到步骤 8。

如果你不是懒惰的,并且想要跟随,那么在你的机器上的任何地方创建一个新的文件夹,并将下面的代码保存到一个名为" lambda_function.py" 的文件中。

这是在做什么— 基本上它是在用一个叫做 craigslist 的 Python 库为我们抓取 craigslist。前几行导入我们的库。第 7 行是我们定义函数的地方,给出了事件上下文的输入。如果你想变得书呆子气,去看看 AWS 文档。在高层次上,事件传递关于触发器的函数元数据,而上下文传递运行时信息给函数。对于这个函数,我们不需要过多地使用它们,但是在本系列的下一部分,我们将需要使用事件。例如,如果我们在某个东西被放入 S3 桶时触发一个 Lambda,我们可以使用事件来获取文件名,这通常很方便。

无论如何,对于使用过 Python 的人来说,函数的其余部分相当简单:实例化我们的类,告诉它要拉取什么数据,并将其存储在某个 JSON 中。第 28 到 31 行是我们如何使用 Boto3 将数据发送到 S3 的。如果你从未使用过 Boto3,它是一个 Python SDK,或者简单地说就是你如何通过 Python 与 AWS 交互。Boto3 允许你把东西放到 S3,调用 Lambda,创建一个桶,等等。如果您想从 Python 脚本中使用 AWS 资源,那么 Boto3 就是您的答案。这里我们使用它的一个最基本的特性:输出到我们的 S3 桶。在第 29 行,您需要将 bucket 的名称更新为您在步骤 2 中命名的名称。作为参考,下面是我们函数中的一些样本数据,这些数据来自 Craigslist 上的一个公寓广告。

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

Sample data

最后要注意的是,这只是我们的样本代码,但这可能是任何东西。例如,它可以调用 API,将数据转储到 JSON,并将 JSON 存储在 NoSQL 数据库中。这里我们将 JSON 输出到一个 S3 桶,但这可能是很多事情。

步骤 6: Pip 安装我们的依赖项

Lambda 在云中为你运行 Python,但它的 Python 版本有什么?任何经常使用 Python 的人都高度依赖库,库是我们可以使用的开源预写代码块(“import pandas as pd”,有人吗)?举个例子,如果我导入请求,在我们的 Lambda 中会发生什么?

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

Import requests library to our Lambda function

**注意:**确保在点击测试之前保存你的函数,否则它将测试先前版本的代码而不包括请求。一个好的经验法则是总是保存你的 Lambda 函数,很容易忘记去做,然后你在调试过去的版本。

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

Fail! Lambda won’t come with external libraries

基本上我们的 Lambda 失败了,因为这个 Python 环境没有请求库。那么我们如何获得它(或任何库)?有几种方法,但这是我发现的最简单的方法。我们已经将我们的 lambda_function.py 文件保存在一个文件夹中。接下来,pip 将您依赖项安装到同一个文件夹中。回头看看我们的代码,我们唯一的依赖是 craigslist 库(json、datetime、os 和 boto3 是其他需要的库,它们都是内置的,所以 Lambda 已经有了它们)。直到最近,我都不知道你可以这样做来 pip 安装到你当前的目录,但是它工作得很好:

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

Pip install the packages to your current directory

这将把 python-craigslist(及其依赖项)和 lambda_function.py 一起安装到您的文件夹中

第七步:创建一个 Zip 文件

回想一下 AWS 上的 Lambda 函数,我们选择了上传 Zip 文件的选项。现在,我的朋友们,是时候制作上述 Zip 文件了!选择你的文件夹中的所有文件,并将其放入一个 zip 文件,命名为 lambda_function.zip。我使用 7zip,所以我只是突出显示所有文件和文件夹,右键单击,选择 7Zip 并将其添加到一个 Zip 文件中。然后我把它重命名为 lambda_function.zip。你的目录应该看起来像下面这样,尽管现在你只需要那个 zip 文件。

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

Your current directory after creating the Zip file

第 8 步:上传你的 Zip 文件到 Lambda

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

Time to upload our Zip file

首先,我能感觉到你对我使用 Windows 的评价,我不喜欢这样。无论如何,点击上传按钮,并选择您新创建的 zip 文件。完成后,点击右上角的“保存”按钮。这将把你的 lambda_function.py 带进内联编辑器,你的 lambda 环境现在将拥有你需要的所有库!同样,从现在开始,如果您需要对代码进行修改,您可以直接编辑它,而不必重新打包您的 zip 文件。您需要重新打包 zip 文件的唯一原因是您对另一个库有新的依赖。如果发生这种情况,请重复步骤 6-8。

步骤 9:创建你的环境变量

完全进入环境变量有点超出了这个已经很长的教程的范围,但是基本上你可以在 Lambda 中完成。如果你看看我们的代码,我们调用了一个环境变量“number_of_posts”,这是我们将拉多少帖子。让我们对 Craigslist 好一点,不要让他们的系统超载,所以只要把它设置成 5 或 10 这样低的值就行了。这就创建了一个环境变量,我们的代码在被调用时会得到这个变量。

第十步:设置你的超时值

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

Set your max compute time for Lambda to 3 minutes

即将到来的 AWS 开发人员助理考试问题!默认情况下,Lambda 允许 3 秒钟的执行时间。对于这个例子,时间根本不够。您可以在“基本设置”下更改该超时值。最多 15 分钟,但我们应该能在 3 分钟内离开。如果你很吝啬,把你的功能设置成拉很多广告,比如说 200 个,你会需要更多的时间。请注意,Lambda 向您收取内存和计算时间费用。

步骤 10:为你的 Lambda 函数添加权限

我敢肯定,在这一点上,这篇文章就像简·奥斯汀的小说一样冗长,但是回想一下我们创建 Lambda 函数的第 3 步。我让你知道我们需要给 Lambda 一些权限来把东西放进 S3 桶。我们现在已经到了那个时候。我们是这样做的(尽可能简洁):

  • 转到服务>安全、身份和合规性> IAM
  • 转到左侧导航栏上的角色

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

Select Roles

  • 单击创建角色
  • 在“选择将使用此角色的服务”下,选择 Lambda 并单击“下一步:权限”

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

Specify we are creating a role for Lambda

  • 现在您可以分配一个策略。从高层次上讲,策略就是如何授予权限。我们正在创建一个角色,为了让角色能够做任何事情,它需要附加一个定义权限的策略。也就是说,角色本身不授予任何权限。只有附加了策略,它才能访问资源。幸运的是,AWS 已经制定了一系列政策,所以在顶部搜索 S3 并选择“AmazonS3FullAccess”,单击复选框,然后单击下一步。

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

Click the checkbox next to AmazonS3FullAccess and click Next

  • 不要添加任何标签,点击前进(本教程很长,但标签允许您应用元数据)。
  • 在最后一步,我们命名我们的角色。我将把我的取名为 **LambdaS3AllAccess,**但是你可以随便给你的取名。单击“创建角色”按钮,我们就有了一个角色。
  • 回到你的 Lambda 函数。
  • 在“执行角色”下,选择您的新角色

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

Apply our spiffy new role to our Lambda function

  • 保存你的 Lambda 函数

步骤 11:测试你的函数

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

The default test should be fine, just give it a name

我们的 Lambda 终于可以接受测试了!那么,我们如何测试这篇文章是不是一派胡言,这些东西是否真的有用呢?幸运的是 Lambda 内置了一个测试函数!如果你看“保存”按钮的右边,有一个“测试”按钮。点击那个!它将要求您创建一个测试输入,但我们现在将跳过它,因为当我们只是从 API 中提取或抓取时不需要它。基本上,如果你的 Lambda 要响应某种类型的输入,你可以在这里给它一个测试输入。我们不需要它,我们只需要它运行,所以只要给它一个名称,然后单击“创建”来测试它。

现在您有了一个测试事件,再次单击“Test ”,您的函数应该运行了!如果神是好的,你应该看到一个巨大的绿色方块形式的正确执行的通用标志。

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

Success!

如果我们回想一下我们的函数正在做什么,它正在以 JSON blob 的形式向 S3 输出数据。因此,理论上,我们现在应该在我们的 S3 桶中有数据。

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

Data in S3 from Lambda!

如果你去你的 S3 桶,你现在应该有数据在那里!万岁。让我们进入最后一步:自动化!

第十二步:自动化!

Lambda 的美妙之处在于它可以以多种方式被触发或调用。你可以让 Lambda 函数在任何时候发生,当一个对象进入一个桶,当另一个 Lambda 执行时,或者在一个时间间隔。我们将在这里使用后者,并将其设置为基于时间间隔运行。转到函数顶部,选择“云观察事件”。这就是你如何设置一个标准的时间间隔事件来触发我们的 Lambda。

CloudWatch 有很多功能,但本质上它是一个获取 AWS 环境数据的监控工具。如果你想获得任何 AWS 认证,你需要了解 CloudWatch,因为它会出现在许多考试中。

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

Add a CloudWatch Event to Fire Your Lambda

下到最下面,保持为“创建新规则”。规则基本上就是控制事件何时触发的东西。我们将创造性地将其命名为“每日”,在描述中,因为创造性的汁液现在真的在流动,我们将说“每天跑一次”。选择“Schedule expression”并输入“rate(1 day)”作为值。注意,这既可以使用 rate()函数,也可以使用 Cron 调度程序。克朗是丑陋的,所以我要去与率,但使用任何浮动你的船。

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

Setting up your CloudWatch trigger

就是这样!点击“添加”将你的新规则应用到你的 Lambda 函数中,然后点击顶部的“保存”将其应用到你的 Lambda 函数中。你的 Lambda 函数现在将每天提取数据并将其转储到 S3!

总结

Lambda 对于只想获取数据的开发人员或数据科学家来说是非常棒的,因为没有 EC2,没有数据库,没有硬件或其他令人痛苦的东西。它让我们只需简单地编写代码,让 AWS 处理所有烦人的事情。在本教程中,我们创建了一个 Python 函数,可以在本地机器上运行,并使用 Lambda 将其设置为每天在 AWS 上自动运行一次。第一次你可能会觉得很慢,但是一旦你习惯了 Lambda,你就可以开始快速部署了。当你第一次使用 AWS 和 Lambda 时,可能会有点害怕,但请坚持使用它,因为它对数据科学家来说有很多用途,特别是轻松获取数据。正如我提到的,如果你觉得这篇文章有用,请随时在 LinkedIn 上与我联系,分享你对 Lambda 的用例。

让数据再次变得有趣

原文:https://towardsdatascience.com/make-data-fun-again-e2bf6fefe749?source=collection_archive---------30-----------------------

自从大学毕业后,我就一直从事数据工作,谢天谢地,我有幸能和优秀的人一起工作。工作一直很有趣,因为我周围的人一直都很真实。每个人都公开了自己的优点和缺点,以及他们的技术知识水平。

这导致了工作中一些有趣的时刻。当一名实习生在工作的第一个小时内成功合并了 250 个文件时,我们用他们最喜欢的巧克力向他们表示祝贺。当一位分析师编写了一个 5000 行的 Python 脚本,为我们节省了一个小时的日常工作时,我们吃了一顿延长的午餐来狂欢。当我们所有人成功地部署了一个用了一年多时间构建的 ETL 管道时,我们和客户一起庆祝了一整夜!

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

This is how Data Geeks celebrate right?

最近,我决定扩大我的数据极客网络。我开始参加当地的聚会,加入不同的在线社区,并在我的母校发表演讲。

来自社区的普遍意见让我意识到,我比自己想象的还要幸运。我一直在进行的很多对话似乎都包含了一连串空洞的问题和充斥着流行词汇的陈述。

这些对话让我担心数据科学的有趣程度,尤其是在这个领域持续增长的情况下。它甚至出现在我上周参加的 React vs 数据科学会议上。React 聚会有趣多了。

现在,这肯定是意料之中的。当一个领域从小众成长为主流,媒体称之为性感、火辣、华丽,并不是每个加入这个领域的人都是出于激情和热情。你甚至可以从 MBA 学生加入科技行业的比例中看出这一点,科技行业长期以来一直是极客和工程师的天堂。

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

PSA: I DID NOT MAKE THIS NOT PRETTY CHART!

但这并不意味着我们注定要空洞地互相建议,我们肯定需要最新的数据湖连接到使用 Alteryx 构建的红移来运行我们的 AI 超级代理。

我们可以做得更好。我们需要让处理数据再次变得有趣。我认为有一件事我们可以努力做到:真实性。

我说的真实性是什么意思?我的意思是对你的技术知识水平和你处理数据的动机非常开放。

我看到的最大的违反是人们吹嘘他们的技术知识水平。我们在一个领域工作,这个领域需要了解的事情非常多。几乎不可能知道所有的事情,也不可能知道任何正在出现的新事物。

这导致一些人津津有味地吐出他们在最新文章中读到的流行语,就好像他们已经使用该技术多年了。

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

What I found when I Googled buzzwords. Which is how people probably find buzzwords.

就在昨天,有人告诉我,他们正在研究一个人工智能模型,在 AWS 上有一个大规模的数据存储,这将真正彻底改变病人护理行业。当我追问他们细节时,我发现他们已经看过了一些 YouTube 视频,并且正在玩 Weka 中一个大约 5000 行的数据集,这个数据集存储在 S3 的一个 CSV 文件中。他们不知道不同的机器学习算法是什么,也不知道如何在结构化数据库中存储和处理数据。

现在,这个人正在做的事情绝对没有错,我们都必须从某个地方开始,但吹嘘扼杀了我们的谈话和乐趣。如果他们承认他们的知识范围,我们会继续保持良好的关系。我甚至会考虑帮助他们完成他们的项目。

你可能会认为这是我本周最糟糕的数据时刻。但是唉!上周末,在一次数据黑客马拉松上,一个随机的队友给了我一个击掌相庆的机会,当时我告诉他们我如何只用了 1/3 的变量就获得了比以前更高的准确性。最初我以为他们默认的击掌是跛行,但当我看到他们在烧烤排骨上击掌时,这个假设就被抛弃了!

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

How I Felt After Seeing the High Five Over the BBQ Ribs

现在,为了拥有一份工作和支付账单而想要或拥有一份工作绝对没有错。不是每个人都会充满激情,尤其是在一个现在触及每个领域和行业的领域。这没关系。

这也要归咎于我们当前的文化,这里有巨大的压力和期望,如果你对工作没有超级热情,那你就有内在的问题。

然而,我们应该尽可能真实地表达我们的激情。我们中仍有很多人热爱这项工作,当你知道谁可以分享这份热情,谁不能分享时,就更容易获得乐趣。

所以,请大家都同意公开我们知道多少,我们有多关心数据。我意识到这是一个很大的要求,特别是在一个这样做很不舒服的社会里,招聘人员不断要求在一项 5 年前的技术上有 10 年的经验。

但至少,我们可以真实地对待我们的数据极客同事,并希望再次让数据变得有趣:)

制造更少的模型

原文:https://towardsdatascience.com/make-fewer-models-51800960da6b?source=collection_archive---------26-----------------------

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

Humphrey Bogart holding the Maltese Falcoln, one of the most famous and expensive MacGuffins. A complete predicrive model may resemble the Maltese Falcon is more than one way.

最近,我的老板要求我们的团队对一个业务领域进行基准测试,以便当一个提议的业务计划被引入时,我们可以知道是否有真正的变化——在完全的 A/B 测试不切实际的情况下,一个替代的 A/B 测试。

当我着手收集数据时,一个想法开始形成。当我在处理数据的时候,为什么不完成这个问题的预测模型呢?总有一天会派上用场的……”

建模是我们大多数数据科学家想要做的事情。这是最初吸引人们进入数据科学的迷人之处。然而,一般来说,只要痛点已经消失,企业就无法区分真正的正面预测模型和电子表格中的经验法则。

没有人要求这个模型。没有人需要这个模型,但是数据就在那里。为什么不做点模特呢?

投机建模显然是有风险的,至少,构建一个没人感兴趣的模型,但是人们要求的模型呢?我们是否应该鼓励用户寻求成熟的预测模型,或者像负责任的医生对待寻求阿片类药物缓解中度疼痛的患者一样,我们是否应该鼓励用户寻找不那么激烈的解决方案?

预测模型如劳斯莱斯

预测模型是数据科学中的每个人都在努力的目标,它们是数据科学的劳斯莱斯,威望模型。当它们是合适的工具时,它们提供了一个全面的解决方案,这个解决方案是准确的,并且通常,如果已经在头脑中进行了建模,这个解决方案可以被解释并且已经说服了主题专家,这些专家可以说服其他用户相信它的可靠性。

然而,达到这一阶段可能是一个昂贵而漫长的过程。支持精确建模的数据清理和预处理通常非常耗时。如果数据清理步骤被克服,模型本身的原始结果对业务用户来说经常是不可用的。相反,您需要格式化结果以满足用户的需求,并围绕预测构建一个平台。

最后,为了达到生产,通常需要大量的软件工程工作,既要确保数据源保持足够准确和及时以提供给评分引擎,又要确保用户界面的每个部分都能正确工作。

实际上,用数据科学的术语来说,预测模型是一种“赌大,赢大”的方法——人们应该追求大胆的目标。但是,如果没有回报,或者如果问题模型不够大,不足以证明成功的预测模型所需的投资是合理的,该怎么办呢?

如果不是预测模型,是什么?

模特常常是麦高芬——一个来自电影的术语,阿尔弗雷德·希区柯克将其定义为“装置,噱头,如果你愿意的话……在骗子的故事中,它几乎总是项链。”也就是说,它是让角色开始追寻的东西——但他们是否找到它并不严格相关。最典型的例子可能是马里恩·克莱恩在《惊魂记》的开头偷的钱,这使她走上了诺曼·贝茨的道路,与真实的故事无关。

通常,数据科学、模型本身可能变得无关紧要,因为我们通过深入和系统地查看数据而发现的东西为企业提供了答案。在这种情况下,模型是一种麦高芬——寻找它是我们找到答案的方式,但它本身并没有很大的价值。

这本身不是问题。然而,如前所述,模型通常需要相当大的投入。更糟糕的是,在商业领域(但也包括生活的其他领域),花费相当大的努力往往意味着人们不愿意放弃对预测的追求,即使开发它的追求已经超过了它的有用目的。

最好找到一种方法来探索数据,不要声称最终输出的是一个预测模型。事实上,约翰·图基的经典文本探索性数据分析背后的原始动机的一个方面是相似的——提出方法来理解数据在说什么,而不开发正式的数学模型。

现实是,在投入设计预测模型和交付预测模型的系统之前,寻找理由在描述性统计和解释性分析上花费更长时间,往往会导致企业的问题在不需要模型的情况下得到解决。这可能是许多数据科学家抱怨他们花 90%的时间在“数据准备”上,而花 10%的时间在“建模”上的一个促成因素——在许多场景中,建模被证明是不必要的。

在商业生活中,期望管理通常是最重要的活动,设定一个项目可能产生模型的期望是有风险的。试图说服业务利益相关者模型可能是不必要的,有助于确保数据科学工作被视为识别和解决问题的廉价、无风险和有效的方式。

罗伯特·德格拉夫的书《管理你的数据科学项目》已经通过出版社出版。

在 Twitter 上关注罗伯特

制作令人难忘的数据科学项目

原文:https://towardsdatascience.com/make-memorable-data-science-projects-21885c36bec3?source=collection_archive---------27-----------------------

让您的项目脱颖而出,赢得数据科学经理的关注

数据科学就业市场竞争异常激烈。有许多合格的候选人,很难区分他们。对我来说,将最强的申请人与最弱的申请人分开的最简单的方法是通过查看他们的 github 或 kaggle 项目。

在你探索了为了得到一份数据科学工作你应该做的项目之后,是时候做一些修改来让它们真正流行起来了。

下面是一些可以让你的项目更上一层楼的方法。

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

让你的项目与众不同——项目应该从一个好故事开始。如果你有一个令人信服的理由来使用一个特定的数据集,这会引起我的注意。不要害怕在 github README 或 Kaggle 工作簿的顶部讲述您的项目故事。独特的项目也更难复制。不幸的是,我看到一些候选人未经认证就抄袭作品或整个项目。

收集自己的数据——从 kaggle.com 获得一组数据非常容易。我喜欢候选人使用替代方法获取数据。如果他们使用 API 或者从网站上抓取数据,这向我表明他们愿意投入时间来获得他们想要的信息。能够使用 API 和收集数据对于数据科学家来说是非常有价值的工具。当你为一个项目这样做时,你证明了他们有这些技能。

使用高级特征工程 —我们构建的模型只和输入其中的数据一样好。当你通过添加新功能或改进现有功能而变得富有创造性时,这是令人印象深刻的。我最常见的例子与地理空间数据有关。如果你有一个位置的纬度和经度,你可以找到它与另一个位置的距离。这个距离几乎总是比单个点更有用。

必要时减少要素-您想要使用的一些模型不能很好地处理稀疏性或多重共线性。如果您知道为什么以及何时使用 PCA 或其他特征缩减技术,这总是一个额外的收获。

建立集合模型——这些方法相当普遍;然而,它们通常会产生最好的结果。如果你还没有探索多种模式的结合,你就落后了。

将它们投入生产 —如果你为你的项目建立了一个 API 或网站,你就完成了一个端到端的分析。数据科学家可能拥有的最重要的技能之一是让他们的工作变得有用。通过让其他人也能接触到你的工作,你展示了它的实用性。

让它们对某人有价值 —为自己做一个项目是很棒的,但有时你可以用你的项目来帮助别人。也许你可以做一个分析,帮助你当地的非营利组织降低成本,或者帮助动物收容所提高收养率。像这样的项目有切实的成果和可衡量的、真实的结果。数据科学应该对现实世界产生影响,这些项目说明了这一点。

希望这些建议能提高你的工作质量,帮助你得到雇主的注意!

让你的数据处理代码在 5 分钟内飞起来

原文:https://towardsdatascience.com/make-your-data-processing-code-fly-in-5-minutes-c4998e6da094?source=collection_archive---------6-----------------------

在 10 行代码内释放计算机的全部能力

尽管数据科学家被称为 21 世纪“最性感”的工作,但数据处理是数据从业者日常工作的重要组成部分,既费力又不有趣。在大数据时代,数据处理更加耗时,轻松需要几十个小时才能完成。这既是一个挫折,也阻碍了项目的进展。因此,数据从业者愿意编写复杂的代码,只是为了一点点的性能提升。然而,加速数据处理并不难!在本文中,我将介绍一些简单直观的方法来减少几种常见数据处理工作的运行时间。

全力以赴

首先,现代 CPU 快如闪电。像英特尔 i7 系列这样的流行 CPU 可以轻松实现 3 GHz 时钟,并且至少有 4 个内核,这意味着它们应该能够在合理的时间内执行大多数数据处理任务。然而,CPU 经常处于饥饿状态,这意味着代码受到其他因素的限制,如 I/O 延迟(磁盘到 RAM、RAM 到缓存等)。因此,减少 I/O 延迟至关重要。

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

from David Jeppesen’s ‘Computer Latency at a Human Scale’

正如你所看到的,从硬盘(旋转磁盘)读取数据相当慢。因此,如果您的任务是 I/O 绑定的,您可以通过将数据读/写文件夹移动到 SSD 来提高其速度。

其次,如果操作是 CPU 受限的,我们将不得不更深入地挖掘并行机制。并行性可以充分利用 CPU 的潜力,让您付出的每一分钱都物有所值。Python 提供了各种各样的并行计算库,但不幸的是,其中大多数都需要大量的额外设置代码和对线程/进程/同步等的理解。 Dask 是一个库,它提供了并行计算,而无需向用户暴露并行配置的本质细节。我将向您展示在 Dask 的帮助下加速代码是多么容易。

系统配置

Dask 默认安装在 Anaconda Python 环境中。如果没有安装 dask,只需在终端中输入这一行代码

pip3 install dask 

建立一个本地集群(集群中的每个核心都是一个工作者)

# in python
from dask.distributed import Client
client = Client(scheduler = 'threads') # set up a local cluster
client # prints out the url to dask dashboard, which can be helpful

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

就是这样!你现在有几个工人供你支配。

容易加速的常见任务

a .文件格式转换

例 1:将 JSON 文件转换为 CSV

将 JSON 转换为 CSV 是 web 爬行中的常见任务。处理 JSON 文件的一种常见方法是:

file_list = os.listdir(base_dir)
json_list = [file  for file in file_list if file.endswith('.json')]
for file in json_list:
    inp = os.path.join(base_dir, file)
    out = os.path.join(base_dir, new_name)
    json_process(inp, out) # convert each json to a csv

但是,这种串行方法没有充分发挥机器的潜力。稍加修改,我们就能写出更好的代码:

file_list = os.listdir(base_dir)
json_list = [file  for file in file_list if file.endswith('.json')]
parallel_work = []
for file in json_list:
    inp = os.path.join(base_dir, file)
    out = os.path.join(base_dir, new_name)
    **parallel_work.append(dask.delayed(json_process)(inp, out))# lazy
dask.compute(*parallel_work) # make dask compute**

dask.delayed()是一个惰性信号,这意味着它不会执行函数(在本例中为 json_process ),除非被明确告知这样做。使用 delayed()的好处是系统会智能确定可并行化部分

例如,dask 可以在下面的操作中识别底层的任务依赖,然后同时处理尽可能多的操作(在本例中是 4 个任务)

def add(x,y):
    return x+y
def minus(x,y):
    return x-y;
x = 10
y = 1
result = dask.delayed(add)(x,y) * dask.delayed(minus)(x,y) +  dask.delayed(minus)(x,y)/dask.delayed(add)(x,y)
**result.visualize()# show task dependency**

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

task dependency graph generated by dask

基准:将 JSON 文件处理成 CSV 格式的 dataframe。

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

you can get the max speedup = # of cores

例 2:将 CSV 合并成一个大 CSV

数据从业者的另一个主要问题是合并 CSV。这是我在网上找到的一个代码:

#code 1
df = pd.read_csv(file)
for file in csv_list:
    a = pd.read_csv(os.path.join(base_dir, file))
    df = pd.concat([df,a])

这段代码的性能会很差,因为 pd.concat()是一个开销很大的函数。pd.concat(df1,df2)重新分配新的内存空间,并将两个数据帧都复制到新的数据帧中。上面的代码给你二次运行时间。

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

runtime analysis

更好的解决方案:

#code 2
df_list= []
for file in csv_list[1:]:
    df= pd.read_csv(os.path.join(base_dir, file))
    df_list.append(df)
df = pd.concat(my_list)

这段代码只复制数据帧一次,因此产生线性运行时间。我们不能显著改进这段代码,但是我们可以使用 dask 对它进行次线性改进。

#code 3 with dask
df_list =[]
for file in csv_list:
    df = dask.delayed(pd.read_csv)(os.path.join(base_dir, file))
    df_list.append(df)
df = dask.delayed(pd.concat)(df_list).compute)

基准

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

b .数据汇总

Dask 提供了几种数据结构,dask.dataframe 是其中之一。Dask.dataframe 允许用户将一个巨大的数据帧分成多个块,这允许内核之间的协作。要创建 dask.dataframe,只需:

from dask import dataframe as dd
**dd_df = dd.from_pandas(df, npartitions=6)**
dd_df.visualize()

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

dask dataframe visualization

Dask.dataframe 对象与 pandas dataframe 非常相似(许多命令完全相同)。举个例子,

# in pandas
df.groupby(['Feature1']).sum()
df['Feature1'].min()
df['Feature1'].rolling(10).mean()# in dask
dd_df.groupby('Feature1').sum().compute()
dd_df['Feature1'].min().compute()
dd_df['Feature1'].rolling(10).mean().compute()

基准测试:groupby()

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

重要的一点是:数据帧分区不是随机的工作;根据您拥有的内核数量对数据进行分区是一个好主意。太多的分区将不可避免地增加通信开销。

c .特征工程

特征工程是一个好模型的重要前提。尽可能对代码进行矢量化总是一个好主意。例如:

%timeit df['Feature3'] = df['Feature1'] **2
#47.3 ms ± 982 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['Feature3'] = df['Feature1'].apply(transformsform)
#2.62 s ± 47.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Pandas 基于 numpy 库,一个高性能的计算库,因此任何矢量化的操作都非常快。幸运的是,我们在 dask 中得到相同的 API:

dd_df['F1'] = dd_df['F1']**2 + dd_df['F2'] (lazy)

然而,并不是所有的作品都可以矢量化。例如:如果您的数据帧看起来像这样,并且您希望提取名字,您必须使用 apply()。

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

#you can't vectorize this
def operation(x):
    return x.split(':')[0]

因为矢量化的操作通常足够快,所以我将重点放在不可矢量化的操作上。

例 1:列变换

def operation(x):
#some un-vectorizable operations with process time M
return ydf['new'] = df.F1.apply(operation) # pandas
ddf['new'] = ddf.F1.apply(operation).compute(**scheduler ='processes'**) # dask

我将调度器设置为‘processes ’,因为这段代码完全由 operation()控制。在这种情况下,向其他进程发送数据以换取真正的并行性是合理的(每个进程在一个分区上工作)。参见 dask 提供的解释:

引用‘线程调度器……是轻量级的……它引入了非常少的任务开销(每个任务大约 50us 然而,由于 Python 的全局解释器锁(GIL),该调度器仅在您的计算由非 Python 代码主导时提供并行性。”

多处理调度程序…每一个任务及其所有的依赖项都被 运至 的一个局部流程,执行完毕,然后它们的结果被 运回 的主流程。这意味着它能够 绕过 GIL 的问题,甚至在纯 Python 代码占主导地位的计算上提供并行性

基准:

移动数据的成本很高,这就是为什么只有当您希望执行的操作比进程间通信成本更高时,使用进程调度程序才有帮助:

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

both n and theta play roles

正如你所看到的,大的 n 和大的θ可以使分母变小,从而使除法变大,这就是为什么我们想要大的 n 和θ。

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

operation time and the length of dataframes both matter

你要尽可能靠近右上角。另一方面,如果您的操作不需要那么长时间,或者您的数据帧很小,您可以只使用 pandas。

例 2:多特征工程

如果有多列需要处理,可以同时处理这些列:

#pandas
operation1(df.F1)
operation2(df.F2)
operation3(df.F3)#dask
a = dask.delayed(operation1)(df.F1)
b = dask.delayed(operation2)(df.F2)
c = dask.delayed(operation3)(df.F3)
work = [a,b,c]
result = dask.compute(*work)

基准测试:和前面的例子一样,操作时间和数据长度都很重要。

摘要

数据处理可能非常耗时,尤其是由单线程处理时。我已经说明了利用 dask 充分发挥计算机的能力是多么容易。当然,还有其他多处理/线程库,但我认为 dask 是帮助数据从业者入门的最简单快捷的工具。

现在去加速你的代码吧!

相关材料

Dask 网站:https://docs.dask.org/en/latest/why.html

深度 Dask 教程:https://github.com/dask/dask

达斯克概述:https://www.youtube.com/watch?v=ods97a5Pzw0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值