TowardsDataScience-博客中文翻译-2016-2018-三-

龙哥盟 / 2024-10-13 / 原文

TowardsDataScience 博客中文翻译 2016~2018(三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

主成分分析的一站式商店

原文:https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c?source=collection_archive---------0-----------------------

在我为研究生统计理论课程使用的教材的开头,作者(乔治·卡塞拉和罗杰·伯杰)在序言中解释了他们为什么选择编写一本教材:

W 当有人发现你在写教科书时,他们会问你两个问题中的一个或两个。第一个是“你为什么要写书?第二个问题是“你的书和外面的有什么不同?“第一个问题相当容易回答。你正在写一本书,因为你对现有的文本不完全满意。”

我在这里应用作者的逻辑。主成分分析(PCA)是统计学和数据科学领域中需要理解的一项重要技术……但是,当我为我的大会的学生们组织课程时,我发现网上的资源过于专业,没有完全满足我们的需求,并且/或者提供了相互矛盾的信息。可以肯定地说,我对现有的文本并不完全满意。

因此,我想把 PCA 的“什么”、“何时”、“如何”和“为什么”以及一些有助于进一步解释这个主题的资源链接放在一起。具体来说,我想介绍这种方法的基本原理、幕后的数学、一些最佳实践以及这种方法的潜在缺点。

虽然我想让 PCA 尽可能容易理解,但是我们将要讨论的算法是非常技术性的。熟悉以下部分或全部内容会使本文和 PCA 作为一种方法更容易理解:矩阵运算/线性代数(矩阵乘法、矩阵转置、矩阵求逆、矩阵分解、特征向量/特征值)和统计学/机器学习(标准化、方差、协方差、独立性、线性回归、特征选择)。我在整篇文章中嵌入了这些主题的插图的链接,但希望这些是一个提醒,而不是通读文章的必读内容。

什么是 PCA?

假设你想预测美国 2017 年的国内生产总值(GDP)是多少。你有很多可用的信息:2017 年第一季度的美国 GDP,2016 年全年的美国 GDP,2015 年等等。你有任何公开的经济指标,如失业率、通货膨胀率等等。你有 2010 年的美国人口普查数据,估计每个行业中有多少美国人工作,以及在每次人口普查之间更新这些估计的美国社区调查数据。你知道每个政党有多少名众议员和参议员。你可以收集股票价格数据,一年中发生的首次公开募股的数量,以及有多少 CEO似乎正在准备竞选公职。尽管有大量的变量需要考虑,但这个只是触及了表面

TL;DR——你有很多变量要考虑。

如果你以前处理过很多变量,你就会知道这会带来问题。你了解每个变量之间的关系吗?您是否有太多的变量,以至于您的模型可能会过度适应您的数据,或者您可能会违反您正在使用的任何建模策略的假设?

你可能会问这样一个问题,“我如何把我收集的所有变量集中在其中的几个上?”用专业术语来说,你想要“减少你的特征空间的维数”通过减少特征空间的维度,您需要考虑的变量之间的关系更少,并且您不太可能过度拟合您的模型。(注意:这并不立即意味着过度拟合等。不再令人担忧,但我们正朝着正确的方向前进!)

不出所料, 降维 特征空间的 维度 称为 降维 。”有许多方法可以实现降维,但这些技术大多属于以下两类之一:

  • 特征消除
  • 特征抽出

特征消除顾名思义:我们通过消除特征来减少特征空间。在上面的 GDP 例子中,除了我们认为最能预测美国国内生产总值的三个变量之外,我们可能会放弃所有变量,而不是考虑每一个变量。特征消除方法的优点包括简单性和维护变量的可解释性。

然而,作为一个缺点,你不能从你丢弃的变量中获得任何信息。如果我们只使用去年的国内生产总值、根据最新的美国社区调查数据,制造业就业人口的比例以及失业率来预测今年的国内生产总值,我们就错过了任何可能对我们的模型有所贡献的变量。通过消除功能,我们也完全消除了这些变量可能带来的任何好处。

特征提取,不过,不会碰到这个问题。假设我们有十个独立变量。在特征提取中,我们创建十个“新”独立变量,其中每个“新”独立变量是十个“旧”独立变量的组合。然而,我们以特定的方式创建这些新的自变量,并根据它们预测因变量的程度对这些新变量进行排序。

你可能会说,“降维在哪里发挥作用?”好吧,我们保留尽可能多的新的独立变量,但我们放弃了“最不重要的”因为我们根据新变量对因变量的预测程度对它们进行了排序,所以我们知道哪个变量最重要,哪个最不重要。但是——这就是问题所在——因为这些新的独立变量是旧变量的组合,所以我们仍然保留旧变量中最有价值的部分,即使我们放弃了一个或多个“新”变量!

主成分分析是一种用于特征提取的技术——因此它以一种特定的方式组合我们的输入变量,然后我们可以丢弃“最不重要”的变量,同时仍然保留所有变量中最有价值的部分!作为一个额外的好处,PCA 后的每个“新”变量都是相互独立的。这是一个好处,因为线性模型的假设要求我们的独立变量彼此独立。如果我们决定用这些“新”变量拟合一个线性回归模型(见下面的“主成分回归”),这个假设必然会得到满足。

什么时候应该使用 PCA?

  1. 您是否希望减少变量的数量,但却无法确定可以完全不考虑的变量?
  2. 你想确保你的变量是相互独立的吗?
  3. 你愿意让你的自变量变得更难解释吗?

如果你对这三个问题的回答都是肯定的,那么 PCA 是一个很好的方法。如果你对问题 3 的回答是“否”,你不应该使用五氯苯甲醚。

PCA 是如何工作的?

之后的部分讨论了为什么 PCA 有效,但是在进入算法之前提供一个简短的总结可能对上下文有帮助:

  • 我们要计算一个矩阵,这个矩阵总结了变量之间的关系。
  • 然后我们将这个矩阵分解成两个独立的部分:方向和大小。然后,我们可以了解数据的“方向”及其“大小”(或者每个方向有多“重要”)。下面的截图,来自 setosa.io applet ,显示了该数据中的两个主要方向:“红色方向”和“绿色方向”在这种情况下,“红色方向”是更重要的一个。我们稍后会讨论为什么会出现这种情况,但是考虑到这些点是如何排列的,你能看出为什么“红色方向”看起来比“绿色方向”更重要吗?(提示:拟合该数据的最佳拟合线会是什么样子?)

Our original data in the xy-plane. (Source.)

  • 我们将转换我们的原始数据,以符合这些重要的方向(这是我们的原始变量的组合)。下面的截图(同样来自 setosa.io )是与上面相同的精确数据,但是进行了转换,使得 x -和y-轴现在是“红色方向”和“绿色方向”。这里的最佳拟合线是什么样的?

Our original data transformed by PCA. (Source.)

  • 虽然这里的可视化示例是二维的(因此我们有两个“方向”),但请考虑我们的数据有更多维的情况。通过识别哪些“方向”是最“重要”的,我们可以通过丢弃“最不重要”的“方向”来压缩或投影我们的数据到一个更小的空间通过将我们的数据投影到一个更小的空间,我们减少了特征空间的维度…但是因为我们已经在这些不同的“方向”上转换了我们的数据,我们已经确保在我们的模型中保留所有原始变量!

在这里,我通过一个算法进行主成分分析。我尽量避免太专业,但是不可能忽略这里的细节,所以我的目标是尽可能清晰地介绍事情。在下一节中,我们将更深入地了解该算法为什么会起作用。

在开始之前,您应该用 n 行和可能的 p+1 列来组织表格数据,其中一列对应于您的因变量(通常表示为 Y )和 p 列,其中每一列对应于一个自变量(其矩阵通常表示为 X )。

  1. 如果一个 Y 变量存在,并且是你的数据的一部分,那么把你的数据分成X ,如上定义——我们将主要使用 X 。(注意:如果没有 Y 的列,没关系——跳到下一点!)
  2. 取独立变量矩阵 X ,对于每一列,从每一项中减去该列的平均值。(这确保了每一列的平均值为零。)
  3. 决定是否标准化。给定 X 的列,是方差较高的特征比方差较低的特征更重要,还是特征的重要性与方差无关?(在这种情况下,重要性意味着该特征预测 Y 的好坏。)如果特征的重要性独立于特征的方差,那么将一列中的每个观察值除以该列的标准差。(这与步骤 2 相结合,标准化 X 的每一列,以确保每一列都有平均值 0 和标准偏差 1。)调用居中的(也可能是标准化的)矩阵 Z
  4. 取矩阵 Z ,转置它,将转置后的矩阵乘以 Z 。(从数学上来说,我们将把它写成zz。)得到的矩阵就是 Z 的协方差矩阵,最多一个常数。
  5. (这可能是最难的一步——请继续关注我。)计算zz的特征向量及其对应的特征值。这在大多数计算包中都很容易做到——事实上,我们将zz的特征分解zz分解为 PDP ⁻,其中 P D 对角线上的特征值会关联到 P 中对应的列——即 D 的第一个元素是λ₁,对应的特征向量是 P 的第一列。这适用于中的所有元素以及 P 中它们对应的特征向量。我们总是能够以这种方式计算出 PDP ⁻。(额外收获:对于感兴趣的人,我们总是可以用这种方式计算 PDP ⁻,因为zz是一个对称,半正定矩阵。)**
  6. 取特征值λ₁,λ₂,…,λ p ,从大到小排序。这样做,相应地对 P 中的特征向量进行排序。(例如,如果λ₂是最大特征值,则取第二列 P 放在第一列位置。)取决于计算包,这可以自动完成。把这个特征向量排序后的矩阵叫做 P 。( P 的列应该与 P 的列相同,但顺序可能不同。注意,这些特征向量是相互独立的。**
  7. 计算Z *=ZP 。这个新矩阵, Z ****,是 X 的中心化/标准化版本,但是现在每个观察是原始变量的组合,其中权重由特征向量确定。另外,因为我们在 P 中的特征向量是彼此独立的,所以 Z* 的每一列也是彼此独立的!****

An example from setosa.io where we transform five data points using PCA. The left graph is our original data X; the right graph would be our transformed data Z.***

请注意此图中的两点:

  • 这两个图表显示了完全相同的数据,但右边的图表反映了原始数据的转换,因此我们的轴现在是主要组成部分。
  • 在这两幅图中,主成分相互垂直。事实上,每一个主成分总是与每一个其他主成分****(也就是官方的数学术语,表示垂直)(不信我?尝试破解小程序!)****

因为我们的主成分彼此正交,所以它们在统计上彼此线性无关…这就是为什么我们的 Z 列彼此线性无关!*

8.最后,我们需要决定保留多少特性,放弃多少特性。有三种常见的方法来确定这一点,下面讨论并给出一个明确的示例:

  • 方法一:我们任意选择想要保留多少维度。也许我想用二维来直观地表现事物,所以我可能只保留两个特征。这取决于用例,对于我应该选择多少特性没有硬性规定。
  • 方法 2 :计算每个特性的方差比例(下面简要说明),选择一个阈值,并添加特性,直到达到该阈值。(例如,如果您想要解释您的模型可能解释的 80%的总可变性,则添加具有最大解释方差比例的要素,直到您的解释方差比例达到或超过 80%。)
  • 方法三:这个和方法二密切相关。计算每个特征的解释方差比例,根据解释方差比例对特征进行排序,并绘制保留更多特征时解释方差的累积比例。(该图被称为碎石图,如下所示。)通过识别添加新特征相对于先前特征具有显著差异下降的点,并选择直到该点的特征,可以挑选包括多少特征。(我称之为“找到肘部”方法,因为查看碎石图中的“弯曲”或“肘部”可以确定所解释的方差比例中出现最大下降的位置。)

因为每个特征值大致就是它对应的特征向量的重要性,所以解释的方差比例就是你保留的特征的特征值之和除以所有特征的特征值之和。

Scree Plot for Genetic Data. (Source.)

考虑一下这个基因数据的 scree 图。(来源:此处。)红线表示由每个特征解释的方差的比例,其计算方法是将该主成分的特征值除以所有特征值的总和。仅包含主成分 1 解释的方差比例为λ₁/(λ₁ + λ₂ + … + λ p ),约为 23%。仅包含主成分 2 解释的方差比例为λ₂/(λ₁ + λ₂ + … + λ p ),约为 19%。

同时包含主成分 1 和主成分 2 解释的方差比例为(λ₁ + λ₂)/(λ₁ + λ₂ + … + λ p ),约为 42%。这就是黄线出现的地方;黄线表示方差的累积比例,如果您包括到该点为止的所有主成分。例如,PC2 上方的黄点表示包含主成分 1 和 2 将解释模型中总方差的约 42%。

现在我们来看一些例子:

  • 方法 1:我们任意选择一些主要成分。假设我想在我的模型中保留五个主要组件。在上面的遗传数据案例中,这五个主成分解释了通过包括所有 13 个主成分可以解释的总可变性的大约 66%。
  • 方法 2:假设我想包含足够的主成分来解释全部 13 个主成分所解释的 90%的总可变性。在上面的遗传数据案例中,我将包括前 10 个主成分,并从中去掉最后三个变量。**
  • 方法 3:在这里,我们要“找到肘部”在上面的碎石图中,我们看到主成分 2 和主成分 3 之间解释的可变性比例有很大下降。在这种情况下,我们可能会包括前两个特性,并放弃其余的特性。正如你所看到的,这种方法有点主观,因为“肘”没有数学上精确的定义,在这种情况下,我们将包括一个模型,它只能解释大约 42%的总可变性。

(注意:一些 scree 图将在 Y 轴上具有特征向量的大小,而不是方差的比例。这导致等效的结果,但是需要用户手动计算方差的比例。 这里可以看到 的例子。)

一旦我们删除了我们想要删除的转换变量,我们就完成了!那是 PCA。

但是,就像,为什么 PCA 会起作用?

虽然 PCA 是一种非常技术性的方法,依赖于深入的线性代数算法,但当你考虑它时,它是一种相对直观的方法。

  • 首先,协方差矩阵zz是一个矩阵,包含对 Z 中的每个变量如何与 Z 中的每个其他变量相关的估计。理解一个变量如何与另一个变量相关联是非常重要的。******
  • 第二,特征值和特征向量很重要。特征向量代表方向。想象一下在多维散点图上绘制数据。那么你可以把一个单独的特征向量想象成你的散点图中的一个特定的“方向”。特征值代表数量或重要性。更大的特征值与更重要的方向相关。
  • 最后,我们假设特定方向上更多的可变性与解释因变量的行为相关。大量可变性通常表示信号,而少量可变性通常表示噪声。因此,在一个特定的方向上有越多的可变性,从理论上来说,表明我们想要检测一些重要的东西。( setosa.io PCA applet 是处理数据并说服自己为什么有意义的好方法。)

因此,PCA 是一种集合了以下内容的方法:

  1. 衡量每个变量如何相互关联。(协方差矩阵。)
  2. 我们的数据分散的方向。(特征向量。)
  3. 这些不同方向的相对重要性。(特征值。)

主成分分析结合了我们的预测,并允许我们放弃相对不重要的特征向量。

PCA 有扩展吗?

是的,在有限的篇幅内我无法一一讲述。我最常看到的一个是主成分回归,我们将未变换的 Y 回归到我们没有丢弃的的子集上。(这就是 Z 列独立性的来源;通过 YZ 的回归,我们知道自变量所要求的独立性必然会得到满足。然而,我们仍然需要检查我们的其他假设。)****

我见过的另一个常见变体是内核 PCA 。

结论

我希望这篇文章对你有帮助!查看下面的一些资源,以获得关于 PCA 的更深入的讨论。让我知道你的想法,尤其是如果有改进的建议。

我听说这篇文章的中文翻译已经在这里提供了。(谢谢, Jakukyo 弗列尔!)

我非常感谢我的朋友里蒂卡·巴斯克尔、约瑟夫·尼尔森和科里·史密斯的建议和编辑。你应该看看媒体上的 Ritika 和 Joseph 他们的帖子比我的有趣多了。(科里太专注于不让自己的博士研究被抢先发表,以至于没有媒体报道。)

我还想给 setosa.io 小程序一个巨大的 h/t,为其直观形象的展示 PCA。****

编辑:感谢迈克尔·马修斯注意到上面第 7 步中的公式中的一个错别字。他正确地指出了z =ZP ,而不是zp 。也感谢 Chienlung Cheung 注意到上面步骤 8 中的另一个错别字,并注意到我在一行中将“特征向量”和“特征值”混为一谈。*

你应该查看的资源:

这是我用来编译这篇 PCA 文章的资源列表,也是我通常认为有助于理解 PCA 的其他资源。如果你知道有什么资源可以加入到这个列表中,请留下你的评论,我会添加进去的。

非学术文章和资源

  • Setosa.io 的 PCA 小程序。(一个小程序,允许您可视化什么是主成分以及您的数据如何影响主成分。)
  • 对 PCA 算法和算法本身构建模块的半学术性演练。
  • 这个 StackExchange 问题的顶级答案,一言以蔽之,杰出。
  • 讨论五氯苯甲醚是否有参数假设的交叉验证问答。(剧透:PCA 本身是非参数方法,但使用 PCA 后的回归或假设检验可能需要参数假设。)
  • 如果没有维基百科的链接,资源列表就很难完整,对吗?(尽管维基百科是唾手可得的果实,但它在页面底部有一个额外链接和资源的可靠列表。)

编码资源

  • sk learn 库中 PCA 的 Python 文档。(此链接包含例子!)
  • PCA 对 AnalyticsVidhya 的解释。(此链接包含 Python 和 r。)
  • 用 Python 实现 PCA有几个很酷的情节。
  • R 中实现 PCA 的方法比较。

学术教科书和文章

  • 统计学习导论,第 6 版,作者:詹姆斯、威滕、哈斯蒂和蒂布希拉尼。(第 6.3、6.7 和 10.2 章详细介绍了五氯苯甲醚。这本书假设了线性回归的知识,但总的来说还是很容易理解的。)
  • 宾州州立大学 STAT 505 (应用多元统计分析)课程笔记。(我发现宾夕法尼亚州立大学的在线统计课程笔记令人难以置信,这里的 PCA 部分特别有帮助。)
  • 线性代数及其应用,第四版,作者 David Lay。(第 7.5 章介绍了五氯苯甲醚。)
  • 谷歌研究院的黄邦贤·施伦斯教授的主成分分析教程。
  • 卡耐基梅隆大学的科斯马·沙立兹撰写的关于主成分分析的章节草稿。
  • 来自的 g 应用预测模型中关于数据预处理的一章包括对主成分分析的介绍性讨论(带视觉效果!)第 3.3 节。(h/t to Jay Lucas 求推荐!)
  • 统计学习的要素,第 10 版,作者 Hastie、Tibshirani 和 Friedman。(第 3.5、14.5 和 18.6 章详细介绍了五氯苯甲醚。这本书假设了线性回归、矩阵代数和微积分的知识,比统计学习介绍更具技术性,但这两本书遵循相同作者的相似结构。)**

次要资源

  • 线性代数本质 YouTube 系列(包括一个与 PCA 特别相关的特征向量和特征值的视频;h/t to Tim Book 让我意识到这个不可思议的资源。)

Matt Brems 是一名数据科学家,经营着数据科学咨询公司 BetaVector。他还是 DataRobot 数据科学产品&战略的高级经理。他解决了计算机视觉、金融、教育、消费品和政治领域的问题。他获得了大会颁发的 2019 年度‘杰出教师’奖。他在俄亥俄州获得了统计学硕士学位。Brems 是无国界统计组织的志愿者,目前在他们的执行委员会担任副主席。

你可以通过电子邮件或推特联系他。

好奇如何成为一名数据科学家?聆听网飞数据科学家的观点

原文:https://towardsdatascience.com/a-peek-into-a-netflix-data-scientists-day-66bf3dacabb9?source=collection_archive---------5-----------------------

Photo by Franki Chamaki on Unsplash

数据科学是一个如此模糊的术语。对一些人来说,这意味着数据分析;对一些人来说,它是机器学习的同义词;其他人认为它有数据工程的味道。可能的职责范围很广,不同公司甚至同一公司的团队之间存在细微的差异,这使得身份难以确定。实际上,你必须与 X 公司的数据科学家交谈,才能了解 X 公司如何看待数据科学。网飞组织的第三次 WiBD 研讨会的重点是数据科学,这是我们所有人了解网飞方面的故事的绝佳机会。感谢 Becky 领导本次研讨会,感谢网飞的 WiBD 团队使本次系列研讨会成为可能。

对于那些读过我之前关于第一期和第二期的故事的人来说,你可能知道我写这篇文章是为了向全世界分享来自硅谷的知识和见解。信息的不对称是一个不幸的现实,阻碍了许多人对数据科学和数据工程职业的追求。越多的人着手解决这个棘手的问题,我们就能越快解决它!这促使我加入了 HasBrain,这是一家教育社会企业,致力于弥合这一信息鸿沟,并帮助所有有意愿学习的人找到一条通往数据科学和数据工程的道路。

数据科学项目

“A group of people brainstorming over a laptop and sheets of paper” by Štefan Štefančík on Unsplash

当我在麻省理工学院上分析边缘课程时(你可以在 edX 上找到在线等效内容),我一直在想真实世界的数据科学项目会有什么不同。我希望当时有人给我看 Becky 的数据科学项目 Arc。这是一个美丽的总结。

第一步:从理解业务问题开始

Becky 在下面的幻灯片中分享了问题清单。她就如何定义成功发出号召。当你问关于一个好的概念证明的问题时,你需要从一个简单的模型作为基准开始,并且从增量改进的角度来看你的模型的价值。否则,您将陷入不得不解释 75%的准确率是否足够好的境地。拥有物理学博士学位的贝基还提到,学者们总是要检查最后 20%以确保它是防水的;但是在这个行业中,你很少在获得大部分价值后去走最后一英里。对于正在考虑转型成为数据科学家的博士生来说,这可能是值得注意的事情。

第二步:制定技术方案

除了下面幻灯片中介绍的细节,Becky 还强调了沟通和站在利益相关者的角度考虑问题的重要性。机器学习误差指标可能不是你的利益相关者最关心的事情。将业务目标转化为优化问题能力至关重要。

找出别人用过的技术可以节省一次时间,因为不用重新发明轮子。现有的监督学习技术,如预测建模或分类,都有很好的记录。然而,在相对更高级和专业的机器学习领域,如 NLP 和图像分类,不断有新的论文发表,提供新的技术。因此,这些领域的数据科学家的黄金标准行为将包括及时了解最新和最好的研究论文。

第三步:创建一个概念证明- >重复/验证,直到你成功或决定不能完成- >将结果反馈给利益相关者

如果您对数据科学家使用的工作流和工具/库有任何疑问,Becky 对她在项目 arc 中“做项目”部分的详细描述会非常有帮助。

第四步:生产模型

如果你听说过某些数据科学家谈论需要学习编写生产级代码,他们可能是需要独立生产模型而不是交给机器学习工程师或软件工程师的人。

模型的生产化本质上意味着你不能停留在获取和展示模型输出上。你的输出是产品的一部分,将改变实际的用户体验。您的代码将成为更大的产品代码库的一部分。例如,如果您正在对用户是否会在未来两周内流失进行分类。标签搅动的预测类中的用户可能会看到与预测类标签不搅动的组不同的 UI。实际上,您为其他团队创建了一个 API 来调用您的模型并获得模型输出。您可能需要重构代码;只要 API 不中断,终端用户体验无缝,您就可以不断升级模型。

Becky 自学了她工作中的软件工程方面:模块化她的代码以获得可重复性并提高算法效率。有时,她可能涉及软件工程师/数据工程团队。除了工作的复杂性之外,这个决定还取决于服务级别协议。例如,如果您的 API 需要一直运行,可能需要更广泛的代码审查或软件工程团队的直接参与。

沟通和解决问题

在经历了数据科学课程之后,Becky 分享了更多关于有效沟通和解决问题技巧的重要性。向非技术利益相关者解释复杂的数据科学概念的能力对于让他们接受你的项目至关重要。她物理学博士的背景帮助她发展了将复杂问题分解成小块并用一个解决方案解决每个问题的能力。同样,她分解了利益相关者的高层次问题,并确定了数据科学项目可以提供价值的地方。

在获得作为数据科学家的直接工作经验之前,任何人都不容易接触到这部分工作;包括 Kaggle 项目在内的大多数实践项目都是从一个明确定义的数据科学问题开始的。Becky 提到,这些软技能来自经验,可以从建设性的反馈中学习。她还阅读创业书籍,以熟悉常见的商业概念和行话。此外,许多其他经验丰富的数据科学家建议我,如果你想进一步发展商业敏锐性,可以阅读产品管理方面的书籍和文章。

动手练习

与之前的研讨会类似,我们以动手练习结束了会议。这是一个非常初学者友好的项目,使用 WDI 数据预测创业成本。如果你是机器学习的新手,或者刚刚完成一些关于监督学习的基础在线课程,这将是一个很好的额外练习。

回到前面的问题解决和沟通,Becky 提出了一个商业问题“在不同的国家创业有多难?”并为她的项目定义了一个目标——预测在不同国家创业的成本。如果这是一个真正的工作项目,我想她需要与她的利益相关者就创业的预测成本如何成为创业难易程度整体评估决策的一部分达成一致。

希望这个总结对你有所帮助。祝所有数据科学爱好者好运!再次感谢网飞团队的慷慨分享!演示幻灯片和视频录像也可供感兴趣的人使用。

我们的团队已经走访了硅谷顶级科技公司的 30 多名数据科学家。我计划继续分享这些对话中的宝贵见解。同时,如果你有任何问题,请随时给我发电子邮件。敬请期待!

如果你正在考虑建立你的作品集数据项目,并希望与有相似目标的学习伙伴虚拟联系以保持动力,请点击这里查看我们的新计划:www.boringppl.com

使用时尚 MNIST 的谷歌汽车视觉的性能基准

原文:https://towardsdatascience.com/a-performance-benchmark-of-google-automl-vision-using-fashion-mnist-a9bf8fc1c74f?source=collection_archive---------11-----------------------

Actual footage of Google AutoML Vision at work.

Google AutoML Vision 是谷歌最先进的云服务,能够完全自动地从零开始构建图像识别的深度学习模型。在这篇文章中,Google AutoML Vision 用于在 Zalando Fashion-MNIST 数据集上建立图像分类模型,这是经典 MNIST 数据集的最新变体,与数字 MNIST 相比,它被认为更难学习 ML 模型。

在基准测试期间,AutoML Vision 训练模式包括“免费”(0 美元,计算时间限制为 1 小时)和“付费”(大约。480 美元,24 小时计算时间)并进行评估:

因此,free AutoML 模型在计算时间约为 100 秒的测试集上获得了 96.4%的宏 AUC 和 88.9%的准确度分数。30 分钟(提前停止)。付费 AutoML 模型在测试集上实现了 98.5%的宏观 AUC,准确率为 93.9%。

介绍

最近,人们对自动机器学习解决方案的兴趣越来越大。像 H2O 无人驾驶 AI 或数据机器人这样的产品,仅举几个例子,其目标是企业客户,并继续进入专业数据科学团队和环境。对于许多用例来说,AutoML 解决方案可以显著地加快时间-2 模型周期,因此允许更快的模型迭代和部署(并且实际上开始在生产中节省/赚钱)。

自动化机器学习解决方案将在未来 3-5 年内彻底改变数据科学和 ML 领域。因此,如今许多需要相应的人工输入或专业知识的人工智能模型或应用将可能由人工智能/人工智能模型本身部分或完全自动化。很可能,这也将导致对“经典”数据科学概况的总体需求下降,而更有利于将模型投入生产的与工程和运营相关的数据科学角色。

自动机器学习快速进步的一个最近的例子是深度学习图像识别模型的开发。不久前,建立一个图像分类器是一个非常具有挑战性的任务,只有少数人能够做到。由于计算、方法和软件的进步,障碍已经大大降低,以至于你可以用 10 行 Python 代码用 Keras 建立你的第一个深度学习模型,并获得“okayish”结果。

毫无疑问,在不久的将来,仍然会有许多 ML 应用和案例不能(完全)自动化。这些情况可能会更复杂,因为基本的 ML 任务,如将分类器拟合到简单的数据集,可以并将很容易地由机器自动化。

在这一点上,第一次尝试进入机器学习自动化的方向。谷歌和其他公司正在投资汽车研究和产品开发。市场上最早的专业自动化 ML 产品之一是 Google AutoML Vision。

谷歌自动视觉

Google AutoML Vision(目前处于测试阶段)是 Google 的云服务,用于图像分类任务的自动化机器学习。使用 AutoML Vision,您可以在没有任何编码、神经网络或任何知识的情况下训练和评估深度学习模型。

AutoML Vision 在 Google Cloud 中运行,可以基于图形用户界面使用,也可以通过 REST、命令行或 Python 使用。AutoML Vision 实现了来自神经架构搜索(NAS)的策略,这是当前深度学习研究中备受关注的科学领域。NAS 基于另一个模型,通常是神经网络或强化学习模型,正在设计旨在解决机器学习任务的神经网络的架构的思想。NAS 研究的基石是 Zoph 等人的论文。(2017) 以及 Pham 等人(2018) 。后者也已经在 Python 包 autokeras (目前处于预发布阶段)中实现,并使神经架构搜索在具有单个 GPU 的桌面计算机上变得可行,而不是在 Zoph 等人使用的 500 个 GPU 上。

算法能够发现神经网络架构的想法似乎非常有前途,但是由于计算约束,这仍然是一种限制(我希望你不介意我将 500–1000 GPU 集群视为计算约束)。但是,神经架构搜索在上市前的产品中究竟有多好呢?

基准

在下面的部分中,Google AutoML vision 用于基于时尚 MNIST 数据集构建图像识别模型。

资料组

时尚-MNIST 数据集被认为是传统 MNIST 数据集的“替代物”,已经被欧洲在线时尚巨头 Zalando 的研究部门开源(查看时尚-MNIST GitHub repo 和Zalando research 网站)。它包含 10 个不同服装类别(上衣、裤子、鞋子等)的 60,000 个训练图像和 10,000 个测试图像。).就像在 MNIST 一样,每个图像都是 28×28 的灰度图像。它与训练图像和测试图像具有相同的图像大小和结构。以下是数据集中的一些示例:

时尚 MNIST 的制作者认为,如今传统的 MNIST 数据集是一个太简单的任务,无法解决——即使简单的卷积神经网络在测试集上也能达到 99%以上的准确率,而经典的 ML 算法很容易达到 97%以上。出于这样或那样的原因,时尚 MNIST 诞生了。

Fashion-MNIST repo 包含加载数据的帮助函数以及一些用于基准测试和测试模型的脚本。此外,回购协议上的数据有一个清晰的可视化效果。克隆完成后,您可以使用一个简单的 Python 函数(查看下一节中的代码)导入时尚 MNIST 数据,并开始构建您的模型。

使用谷歌自动视觉

准备数据

AutoML 提供了两种数据摄取方式:(1)上传包含不同文件夹中的训练图像的 zip 文件,对应于各自的标签,或者(2)上传包含 Goolge 云存储(GS)文件路径、标签和可选的用于训练、验证和测试集的数据分区的 CSV 文件。我决定使用 CSV 文件,因为您可以定义数据分区(标记名为 TRAIN、VALIDATION 和 TEST ),以便保持对实验的控制。下面是需要上传到 AutoML Vision 的 CSV 文件的所需结构(没有标题!).

+------------+------------------------------------+---------------+
| partition  | filepath                           | label         |
+------------+------------------------------------+---------------+
| TRAIN      | gs://bucket/folder/image_0.jpg     | 0             |
| TRAIN      | gs://bucket/folder/image_1.jpg     | 2             |
| ...        | ...                                | ...           |
| VALIDATION | gs://bucket/folder/image_50001.jpg | 3             |
| VALIDATION | gs://bucket/folder/image_50002.jpg | 4             |
| ...        | ...                                | ...           |
| TEST       | gs://bucket/folder/image_60001.jpg | 7             |
| TEST       | gs://bucket/folder/image_60002.jpg | 1             |
| ...        | ...                                | ...           |
+------------+------------------------------------+---------------+

就像 MNIST 一样,时尚 MNIST 数据包含各个图像的像素值。为了实际上传图像文件,我开发了一个简短的 python 脚本,负责图像的创建、导出和上传到 GCP。该脚本遍历时尚 MNIST 数据集的每一行,导出图像并上传到 Google 云存储桶中。

import os
import gzip
import numpy as np
import pandas as pd
from google.cloud import storage
from keras.preprocessing.image import array_to_imgdef load_mnist(path, kind='train'):
    """Load MNIST data from `path`"""
    labels_path = os.path.join(path,
                               '%s-labels-idx1-ubyte.gz'
                               % kind)
    images_path = os.path.join(path,
                               '%s-images-idx3-ubyte.gz'
                               % kind)with gzip.open(labels_path, 'rb') as lbpath:
        labels = np.frombuffer(lbpath.read(), dtype=np.uint8,
                               offset=8)with gzip.open(images_path, 'rb') as imgpath:
        images = np.frombuffer(imgpath.read(), dtype=np.uint8,
                               offset=16).reshape(len(labels), 784)return images, labels# Import training data
X_train, y_train = load_mnist(path='data', kind='train')
X_test, y_test = load_mnist(path='data', kind='t10k')# Split validation data
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=10000)# Dataset placeholder
files = pd.DataFrame({'part': np.concatenate([
                                   np.repeat('TRAIN', 50000),
                                   np.repeat('VALIDATION', 10000),
                                   np.repeat('TEST', 10000)
                              ]),
                      'file': np.repeat('file', 70000),
                      'label': np.repeat('label', 70000)})# Stack training and test data into single arrays
X_data = np.vstack([X_train, X_valid, X_test])
y_data = np.concatenate([y_train, y_valid, y_test])# GS path
gs_path = 'gs://secret/fashionmnist'# Storgae client
storage_client = storage.Client.from_service_account_json(json_credentials_path='secret.json')
bucket = storage_client.get_bucket('secret-bucket')# Fill matrix
for i, x in enumerate(X_data):
    # Console print
    if i % 1000 == 0:
        print('Uploading image {image}'.format(image=i))
    # Reshape and export image
    img = array_to_img(x=x.reshape(28, 28, 1))
    img.save(fp='fashionmnist' + '/' + 'image_' + str(i) + '.jpg')
    # Add info to data frame
    files.iloc[i, 1] = gs_path + '/' + 'image_' + str(i) + '.jpg'
    files.iloc[i, 2] = y_data[i]
    # Upload to GCP
    blob = bucket.blob('fashionmnist/' + 'image_' + str(i) + '.jpg')
    blob.upload_from_filename('fashionmnist/' + 'image_' + str(i) + '.jpg')
    # Delete image file
    os.remove('fashionmnist/' + 'image_' + str(i) + '.jpg')# Export CSV file
files.to_csv(path_or_buf='fashionmnist.csv', header=False, index=False)

函数load_mnist来自时尚 MNIST 知识库,将训练和测试数组导入 Python。导入训练集后,使用来自sklean.model_selectiontrain_test_split对 10,000 个样本进行采样和存储,作为验证数据。然后,训练、验证和测试数组被堆叠到X_data中,以便有一个对象进行迭代。占位符DataFrame被初始化以存储 AutoML Vision 所需的信息(分区、文件路径和标签)。storage from google.cloud使用一个服务帐户 json 文件连接到 GCP(当然,我不会在这里分享)。最后,主流程开始,遍历X_data,为每一行生成一个图像,保存到磁盘,上传到 GCP,删除不再需要的图像。最后,我将导出的 CSV 文件上传到项目的 Google 云存储桶中。

进入 AutoML

AutoML Vision 目前处于测试阶段,这意味着您必须在试用之前申请。由于我和我的同事目前正在为我们的一个客户探索自动机器学习在计算机视觉项目中的使用,我已经可以通过 GCP 控制台访问 AutoML Vision。

此时,开始屏幕看起来相当不起眼。你可以通过点击“开始使用 AutoML”或阅读文档开始,这是目前为止非常基本但信息丰富的,特别是当你不熟悉基本的机器学习概念时,如训练-测试-分割、过拟合、精确/召回等。

开始后,Google AutoML 会将您带到数据集对话框,这是通向最终 AutoML 模型的第一步。到目前为止,这里没有报告。稍后,您将在这里找到所有导入的数据集。

生成数据集

点击“+新建数据集”后,AutoML 会将您带到“创建数据集”对话框。如前所述,可以使用两种不同的方法添加新数据集,如下图所示。

我已经从我的计算机上传了图像,以及包含 GS 文件路径、分区信息以及相应标签的 CSV 文件到 GS bucket 中。为了将数据集添加到 AutoML Vision,您必须指定包含图像 GS-filepaths 等的 CSV 文件的文件路径。

在“创建数据集”对话框中,如果每个图像有多个标签,您还可以启用多标签分类,这也是一个非常有用的功能。点击“创建数据集”后,AutoML 遍历提供的文件名,并为建模构建数据集。到底是做什么的,既不可见也没有记录。这个导入过程可能需要一段时间,所以它向你展示了时髦的“霹雳游侠”进度条。

导入完成后,您将收到一封来自 GCP 的电子邮件,通知您数据集的导入已完成。我发现这很有帮助,因为你不必一直开着浏览器窗口盯着进度条。

这封邮件看起来有点奇怪,但嘿,它仍然是测试版…

训练模型

回到 AutoML。构建数据集后,首先看到的是导入的图像。在这个例子中,图像有点像素化,因为它们的分辨率只有 28×28。您可以使用左侧的导航栏浏览不同的标签,也可以手动添加标签到目前为止尚未标记的图像。此外,如果你的图片没有附带任何标签,你可以申请人工标签服务。此外,如果您需要添加类别等,您可以创建新的标签。

现在让我们严肃起来。进入“训练”对话框后,AutoML 会通知您标签的频率分布。它建议每个类的最小数量为\(n=100\)标签(我觉得这个数量很低)。此外,它似乎向您显示了整个数据集的频率(一起训练、验证和测试)。我认为,在这一点上,按数据划分的分组频率图会提供更多信息。

单击“开始培训”会将您带到一个弹出窗口,您可以在其中定义模型名称并分配您愿意投资的培训预算(计算时间/金钱)。您可以选择“1 计算小时”,whis 每月免费提供 10 个型号,或者“24 计算小时(更高质量)”,价格大约为。480 美元(1 小时的自动计算需要 20 美元。然而,如果架构搜索收敛于更早的点,你将只支付到目前为止所消耗的计算时间,我认为这是合理和公平的。最后,还可以选择自定义培训时间,例如 5 小时。

在这个实验中,我尝试了两个版本,AutoML 的“免费”版本,但我也“全押”并选择了 24 小时选项,以实现可能的最佳模式(“付费模式”)。让我们看看,您可以从 480 美元的尖端 AutoML 解决方案中获得什么。点击“开始训练”后,熟悉的骑士屏幕出现,告诉你,你可以关闭浏览器窗口,让 AutoML 做剩下的事情。奈斯。

结果和评价

首先,我们从免费模式开始。大约花了。30 分钟的训练,似乎很快就找到了解决方案。我不确定 AutoML 在评估收敛标准时到底做了什么,但免费和付费模型之间似乎有所不同,因为免费模型已经收敛了大约 30 分钟的计算,而付费模型没有。

免费模型的整体模型指标看起来相当不错。在宏类 1 精度为 90.9%和召回率为 87.7%的测试集上,平均精度为 96.4%。时尚-MNIST 数据集上的当前精度基准为 96.7%(wrn 40–4 8.9M 参数),其次为 96.3%(WRN-28–10+随机擦除),而低预算模型的精度仅为 89.0%。因此,免费的 AutoML 模式与当前的时尚 MNIST 基准相去甚远。下面,你会发现免费模型的指标截图。

付费模型的模型度量看起来要好得多。该方法在测试集上的平均准确率为 98.5%,一级精度为 95.0%,召回率为 92.8%,准确率为 93.9%。这些结果接近当前的基准,但是,没有我希望的那么接近。下面,你会发现付费模型的指标截图。

“评估”选项卡还显示了更详细的指标,如精度/召回曲线以及分别影响模型指标的分类临界值滑块。在这一页的底部,你会发现混淆矩阵,以及正确和错误分类的例子的相对频率。此外,您可以检查每个类的假阳性和假阴性的图像(如果您想了解您的模型为什么以及何时出错,这非常有帮助)。总体而言,模型评估功能有限,但用户友好。作为一个更深入的用户,当然,我希望看到更多的先进功能,但考虑到目标群体和发展状况,我认为这是相当不错的。

预言;预测;预告

拟合和评估模型后,您可以使用几种方法来预测新图像。首先,您可以使用 AutoML 用户界面从本地机器上传新图像。对于没有经验的用户来说,这是一个将他们的模型应用到新图像并获得预测的好方法。对于高级用户和开发人员,AutoML vision 通过 GCP 上的 API 公开模型,同时负责后台的所有技术基础设施。一个简单的 Python 脚本展示了 API 的基本用法:

import sys
from google.cloud import automl_v1beta1# Define client from service account json
client = automl_v1beta1.PredictionServiceClient.from_service_account_json(filename='secret.json')# Endpoint
name = 'projects/automl-XXX/locations/us-central1/models/ICNXXXXXXX'# Import a single image
with open('image_10.jpg', 'rb') as ff:
    img = ff.read()# Define payload
payload = {'image': {'image_bytes': img}}# Prediction
request = client.predict(name=name, payload=payload, params={})
print(request)# Console output
payload {
  classification {
    score: 0.9356002807617188
  }
  display_name: "a_0"
}

作为第三种方法,如果您想使用完整的 nerdcore,也可以将 API 放在命令行中。我认为,自动化的 API 公开是一个很好的特性,因为它让你可以将你的模型集成到各种脚本和应用程序中。此外,当您想要在生产环境中同时将模型扩展到数百或数千个 API 请求时,Google 会处理所有的细节问题。

结论和展望

简而言之,即使免费模型在测试集上也取得了相当好的结果,因为投入到模型中的实际时间只是手动构建模型所需时间的一小部分。付费模式取得了明显更好的结果,但是成本为 480 美元。显然,付费服务的目标是数据科学专业人士和公司。

AutoML Vision 只是来到谷歌云的一系列新 AutoML 应用的一部分(查看这些来自谷歌 Next 18 的公告),进一步塑造了该平台在机器学习和人工智能方向的定位。

就我个人而言,我相信自动化机器学习解决方案将继续进入专业数据科学项目和应用。借助自动化机器学习,您可以(1)为您的定制解决方案建立基准模型,(2)更快地迭代使用案例和数据产品,以及(3)更快地到达您实际开始在生产中利用数据赚钱的时间点。

结束语

如果你对我的故事有任何意见或问题,欢迎在下面评论!我将尝试回答这些问题。此外,请随意使用我的代码或在您选择的社交平台上与您的同行分享这个故事。如果你想保持联系,请在 LinkedIn 或 Twitter 上关注我。

请确保您也查看了棒极了的 STATWORX 博客,了解更多有趣的数据科学、ML 和 AI 内容,这些内容直接来自我们在德国法兰克福的办公室!

如果你对更多像这样的优质内容感兴趣,请加入我的邮件列表,不断为你带来新的数据科学、机器学习和人工智能阅读,并把我和我的团队发送到你的收件箱!

我希望你喜欢我的故事,我真的很喜欢写它。感谢您的宝贵时间!

原载于 2018 年 8 月 20 日www.statworx.com

数据分析的哲学视角:探索对错问题

原文:https://towardsdatascience.com/a-philosophical-look-at-data-analytics-exploring-questions-of-right-and-wrong-42c78d2ba3cb?source=collection_archive---------11-----------------------

“通过收集和出售私人生活的详细记录来赚钱的企业曾被直白地描述为‘监控公司’。他们将品牌重塑为‘社交媒体’,这是自美国陆军部成为国防部以来最成功的一次欺骗。”

最近,我偶然看到了爱德华·斯诺登的上述引文,这让我不禁思考,尤其是在围绕剑桥分析——脸书争议以及如何使用个人数据的对错展开激烈辩论的背景下。作为一名从业者,我想到的问题本质上是非常现实的,它们可以归结为一件事——当涉及到个人数据的使用时,我们如何开始划清界限?有许多相互关联的方面需要结合起来看,所以让我稍微分解一下。

(1)房间里的大肥象:数据隐私

首先,“数据隐私”与“数据分析/使用”有很大不同。进行这种区分是至关重要的,特别是因为当前关于使用数据的许多讨论几乎总是交替使用它们。

那么区别在哪里呢?

  • 数据隐私特指不同类型数据的所有权和控制权,尤其是个人的个人数据。您可以将您的数据视为您的财产。因此,您将面临数据或财产被窃取或通过其他强制手段(如监控)窃取的风险。
  • 另一方面,数据分析只处理数据可用后发生的事情——谁在使用数据,他们如何使用数据,他们使用数据的目的是什么?它不关心这些数据是通过正当手段还是不正当手段获得的。

显然,假设这两者没有联系是过于简单的。但我想说的是,他们周围的不良行为是相互独立的。例如,您可以通过公平的方式(不违反数据隐私协议)获得数据,然后将它用于可疑的目的。类似地,你可以偷偷摸摸地获取数据,不理会数据隐私,但将它用于完全无害的分析。

回到最近的争论,我认为最大的错误发生在数据隐私本身。关于个人、他们的偏好和行为的敏感数据没有受到像脸书这样的人的保护,而这种脆弱性被挖掘这些数据的人所利用。这是一个非常黑白分明的犯罪,没有太多灰色,不像数据使用的许多其他方面。这里有几点需要注意:

  • 仅仅因为像脸书这样的公司发布数据隐私条款,就期望数据得到保护,这是天真的。公司有责任确保有严密的控制措施,不允许未经授权访问这些数据。
  • 此外,在我看来,围绕像脸书这样的平台上的数据漏洞的愤怒有点过分了。几乎每个人都知道风险,包括把数据放在那里的人,即使他们没有完全理解可能的后果。我确信剑桥分析公司的违规事件不是唯一发生过的!

有什么解决办法?像大多数其他法律问题一样,这可能需要结合更严格、更明确和更好理解的法律,以及消费者对风险的更好理解。人们会对他们放在那里的东西变得更聪明。就像即使法律禁止入室盗窃,人们仍然锁着他们的房子。

这个数据激增的世界仍然太新了。事情还在发展。控件也会。

(2)【暗示】【影响】&【操纵】之间界限模糊

对我来说,这是一个需要更多自省的方面,并引发了一些关于什么是可接受的,什么是不可接受的问题。数据可以用来建立许多推论。这些推论反过来可以用来确定什么是真正触动任何特定人心弦的最佳方式。

几个世纪以来,广告商一直在这样做——当然,他们是为群体而不是个人做的,但他们确实试图按下正确的按钮,让这些目标个人沿着他们自己可能选择或可能没有选择的道路前进。

换句话说,当一个有大众吸引力的名人代言一个可乐品牌,让我选择这个品牌而不是另一个时,我是不是被操纵了?直到现在还没有人认真提出这个问题。那么,为什么会突然出现一股利用数据分析操纵人们的需求和选择的热潮呢?

当然,如果想要的结果是通过歪曲或谎言来实现的,那就大错特错了。然而,如果数据只是用来确定哪条信息最能引起谁的共鸣,那么为什么这就应该被认为是错误的呢?

(3)领域的问题——一些比另一些更神圣吗?

另一件我一直难以接受的事情是剑桥分析公司的工作影响了政治结果这一事实引发的愤怒。这当然是真的,但我不明白的是,为什么它会变得如此重要。

多年来,公司一直在分析数据(包括个人数据),并利用它做出许多商业决策,包括客户定位,但直到现在,没有人提出质疑。相反,有一场比赛,看谁做得更好,更便宜,更有效。现在,突然之间,因为客户定位是围绕政治候选人进行的,而不是品牌 A 对品牌 B,为什么同样的数据分析,使用同样的方法,变成了每个人都害怕的怪物?

你可能会说,政治选择不应该基于数据驱动的针对个人的目标,而应该仅仅基于候选人的选举平台。当然可以。但同样的推理可以扩展到任何事情——个人应该根据银行的产品和服务选择 A 银行还是 B 银行,而不是根据银行的定向广告。为什么它在政治上是错误的,而在银行、零售品牌、航空公司、保险公司和电信公司上却不是呢?

不要误解我——我并不想评论在政治中使用有针对性的数据分析是对还是错。我只是说规则至少需要有一定的一致性。

我很难在这里下结论,因为我仍在试图对这些方面做出决定,即使我继续在影响客户反应以最大化业务影响的领域工作,我从未认为这在道德上是错误的。

也许我们正处于十字路口,我们必须确定如何从这里前进。数据分析和人工智能等事物的力量毋庸置疑,但也许是时候建立一些边界和划定一些界限了——作为个人、企业、政治和监管者。

对错问题几乎总是个人理解和选择的问题。因此,我很想听听那些读到这篇文章的人,他们认为什么是可以接受的,他们认为界限应该划在哪里。

(注意:脸书和加州的争议还有很多其他方面,比如俄罗斯的影响、对广告商的控制、假新闻等等。—但上述文章仅涉及数据隐私和目标问题)

一种带张量流的拾波线发生器

原文:https://towardsdatascience.com/a-pickup-line-generator-with-tensorflow-7e1f9eee8516?source=collection_archive---------3-----------------------

生成、保存和部署基于 Tensorflow 的拾音线生成器。你可以在这里看到演示*和* 这里看到代码

A pickup line from the pickup line generator

几个月前我看到一篇文章,说有人创造了一个搭讪生成器。由于我刚刚开始进入深度学习的世界,我一直在考虑一些有趣的项目,这些项目至少可以在我学习的时候为我提供娱乐。一个可怕的搭讪发电机听起来像魔术。

  1. 数据

这些数据是从一些网站上手工收集的,这些网站看起来从 90 年代以来就没有更新过。我搜了大约 20 个这样的网站,你可以想象,搭讪的质量很低,而且大多数都很下流。

我必须清理一些奇怪的字符,重复的,并删除新的行,因为每个搭讪行的长度大约是一个四年级学生的句子。我把所有的行都放到一个文件中,瞧,训练数据!

4。型号

现在困难的部分总是以少于 100 行的完全陌生的代码结束,这些代码在被充分哄骗时会产生魔力。我发现点蜡烛和重复咒语很有帮助。

我找到了谷歌的马丁·戈纳的一个讲座,他在没有博士学位的情况下做了一个关于深度学习的演讲。那里有一部分他训练一个 RNN 人创作莎士比亚戏剧。这听起来像是一个把美好的东西变得粗糙的黄金机会。

Model structure

3。训练

我开始在莎士比亚数据集上训练,最初几个纪元(20-40)进行得很好,之后准确率停滞在 50%左右,输出很好,但不是很好。

在确保模型输出是合理的之后,我接着在我自己的数据集上进行训练。起初,我训练了 10 个时期,以了解在给定小数据集的情况下,模型会落在哪里。同样,结果是好的,但不是伟大的。作为一项实验,我训练了 200 个奇怪的纪元,直到精确度非常高,但模型开始输出它以前见过的线条。经典的过度合身。

我把结果给我的一个朋友看,他建议我先在一个更大的英语会话数据集上训练它,然后再在搭讪数据上重新训练顶层。他的说法是,“在学会如何搭讪之前,它必须学会如何说英语”。很自然地,我开始寻找一种方法来清理 Twitter。

Twitter 数据的预处理包括提取“@提及”和链接。每条推文都在文件中的一行,我把它分成几十个更小的文件,以便于检查。

有了大约 1 GB 的 tweets,我再次开始重新训练,结果发现迭代次数达到了 3.5 亿次。

An explosion and a lesson on learning rates.

究竟是什么?我向我的朋友(在这一点上,我应该承认他是卡内基梅隆大学的博士)展示了新的结果,他说我的学习速度需要在训练过程中改变。这将防止精确度突然下降,甚至可能有助于提高精确度。

每 10 个时期,我将学习率乘以 0.1。最初的学习率是标准的 0.001。在第 10 个时期下降到 0.0001,等等。

虽然这确实有所帮助,但它仍然徘徊在 60%左右,但没有大幅下降。很明显,网络可能不够大,无法获得更高的准确性,但使用 Twitter 数据上训练的模型的权重,开始对搭讪数据进行第二轮训练似乎足够合理。

仅仅 10 个时期后,模型的准确性突然增加到大约 70%,并且结果中拼写错误的单词少得多。拾取线的质量类似于拾取线数据的结构,但是不经常重复来自数据本身的片段。厉害!

The accuracy does not crash. Notice at ~18M steps, the slightly steeper drop in loss. That’s the learning rate decrement!

4。保存和部署

保存和部署一个用于生产的模型是这个项目的主要焦点。在 Tensorflow Serving 上已经做了大量的工作,但如果我能弄清楚如何将它用于这个特定的模型,我会被诅咒的。为模型提供服务要求您以特定的方式保存它,包括您将如何查询它以及它应该基于该查询输出什么。网站上有一些简单的教程,展示了如何部署 MNIST 模型,介绍了如何部署基于图像的预测器。我想很快做一个对象检测项目,所以教程会有所帮助,但对于这个模型,拾取线是通过向网络输入一个字符串并让它预测下一个字符来创建的。这可能会永远持续下去,并且必须做一些工作来创建一条单独的搭讪线。经过几个小时的挣扎,我暂时屈服了。

就部署 Tensorflow 模型的简单工具而言,仍有许多需要改进的地方,但 Tensorflow 团队似乎已经解决了困难的部分。

我决定采用简单的方法,生成数千条搭讪语句,并把它们存入数据库。这不是一个优雅的解决方案,但它确实有效,并且有 30,000 个左右使你不太可能看到同一行两次。有时候简单的方法就足够了。如果有一个简单的解决方案,只需要 1/10 的时间,就没有必要过度设计。

机器学习的实用开端

原文:https://towardsdatascience.com/a-practical-start-to-machine-learning-421b0e8d5b2a?source=collection_archive---------10-----------------------

Photo by João Silveira on Unsplash

入门

在企业创新实验室工作教会了我很多东西,其中最值得一提的是每四个月教一次新学生应用机器学习的基础知识。最重要的是教没有机器学习(ML)经验的学生如何将这项技术应用到他们工作的各个方面。虽然我不会说我已经完善了这一技能,但我已经参加了三个学期的这个周期,我对在 1-2 周内教授学生应用机器学习的原则有了更好的理解。

有趣的是,我发现许多完成在线课程或学习神经网络数学的学生仍然会在特征工程、数据挖掘甚至加载通用数据方面苦苦挣扎。通过在我们的空间里教一些学生,我发现下面的资源是我最想推荐的,我觉得值得分享。

端到端的例子

虽然机器学习目前是一个热门话题,但许多开发人员不知道如何实际使用它。我发现最好通过一个简单的端到端机器学习示例,让学生对预处理、特征工程、训练和评估有基本的了解。

Painting by Willy Stöwer

我最喜欢的机器学习“Hello World”教程是泰坦尼克号数据集(尽管有点病态)。从这个数据集中,你可以学习训练一个模型来预测一名乘客是否会在泰坦尼克号的事故中幸存。我用来指导学生的文件可以在这里找到。我发现最好用 Jupyter 笔记本、熊猫、Scikit-Learn 和 Numpy 进行一些练习。

我喜欢这个数据集作为介绍的原因是因为您将学习重要的 ML 基础知识,例如读取 CSV 文件,删除包含空条目和不相关列的行,将性别字段从文本转换为二进制,以及对分类字段执行一次性编码。通过一步一步地看这个例子,你可以用一个容易理解的问题来涵盖许多不同的特性工程实践。

看书

一旦你体验了简单的机器学习管道是什么样子,我建议你读一点书,学习一些基础知识。 Aurélien Géron 的书, 用 Scikit-Learn 和 TensorFlow 动手进行机器学习,在我看来是开始了解应用机器学习的最好方式。我通常让学生阅读前几章,或者一直读到张量流部分。这本书最棒的地方在于,它附带了 Jupyter 笔记本,里面有所有的例子,所以你可以在阅读过程中调整和使用它们的代码。我还喜欢他们在第 2 章中直接切入端到端解决方案解决方案,这让工程师们可以非常轻松地快速上手。

摆弄一些代码

既然您已经了解了机器学习背后的一些理论,那么是时候探索不同类型的实现和用例了。然而,我们中的一些只关注阅读的人可能很难跳到代码中并用不同的数据实现解决方案。

为了找到数千个不同数据集、方法、实现和机器学习解决方案的例子,我求助于 Kaggle 。它拥有大量无价的知识,包括各个领域数百个高质量的数据集。可能 Kaggle 最大的部分是内核。内核是其他用户解决问题的端到端代码,包括从读取数据集和清理到功能工程、培训和优化的一切。你甚至可以派生出其他用户的内核,并在他们的云上运行,给你一个探索真正解决方案的机会。

Kaggle 很棒,因为它给了你一个脱离玩具问题和简单数据的机会。它允许您处理更具挑战性和真实性的数据集,包括图像、原始和无组织的文本以及数字要素。休息一下,探索 Kaggle(甚至可能参加一些比赛)让你有机会学习其他 Kaggler 的应用解决方案,扩展你对机器学习解决方案背后的理论和数学的理解。

更深入

在探索了 Kaggle 上的一些内核之后,学习一些深度学习的基础和应用是至关重要的。我之所以建议跳过 Géron 书中的张量流部分,是因为我发现 Keras 更容易快速建立神经网络。Keras 是一个高级深度学习库,它依赖于 TensorFlow 或 Theano 作为后端来执行其计算。

幸运的是,我找到的关于学习应用深度学习的最好的书也是 Keras 的创始人,Fran ois Chollet!在他令人惊叹的书中, 用 Python 进行深度学习 他涵盖了深度学习概念、计算机视觉、自然语言处理以及问答等领域更高级的神经网络架构等等。这本书的另一个亮点是,因为 Chollet 自己写的,所以它教授了最佳实践、内置 API 和可以在 Keras 中使用的函数。这本书包含了许多我从未在在线课程或其他书中看到过的东西,我肯定会认为它是我查找 Keras 实现技巧的最佳资源之一。

包装东西

采取这些步骤只是更深入理解机器学习的开始,应该会给你信心和足够的背景来开始处理不同来源的数据。通过关注不同算法、资源和库的实现,更容易兴奋和学习并想继续学习。

只关注数学的选择可能很难转化为工作环境。我学到的一些最有用的东西是 Keras、Scikit-Learn 和 Pandas 内置的微妙功能,它们让我工作得更快。我学到的一些最酷的特征工程管道是从我通过 Kaggle 涉猎的竞赛解决方案中得到启发的。

有如此多的机器学习资源,这可能是压倒性的。我希望这个列表可以作为你深入机器学习的一个很好的起点。

自然语言处理实践指南(第一部分)——处理和理解文本

原文:https://towardsdatascience.com/a-practitioners-guide-to-natural-language-processing-part-i-processing-understanding-text-9f4abfd13e72?source=collection_archive---------0-----------------------

经过验证和测试的解决 NLP 任务的实践策略

介绍

非结构化数据,尤其是文本、图像和视频包含了丰富的信息。然而,由于处理和分析这些数据的固有复杂性,人们通常不会花费额外的时间和精力从结构化数据集冒险出来分析这些非结构化数据源,这可能是一座潜在的金矿。

自然语言处理(NLP)就是利用工具、技术和算法来处理和理解基于自然语言的数据,这些数据通常是非结构化的,如文本、语音等。在这一系列文章中,我们将探讨实践者和数据科学家可以用来从文本数据中提取有用见解的久经考验的策略、技术和工作流。我们还将讨论 NLP 的一些有用和有趣的用例。本文将通过教程和实践例子来介绍如何处理和理解文本数据。

本系列的大纲

这个系列的本质将是理论概念的混合,但重点是涵盖各种 NLP 问题的实践技术和策略。我们将在这一系列文章中涉及的一些主要领域包括。

  1. 处理&理解文本
  2. 特征工程&文本表示
  3. 文本数据的监督学习模型
  4. 文本数据的无监督学习模型
  5. 高级主题

随着本系列的进展,您可以随时提出更多的想法,我将很高兴涵盖我可能错过的一些内容。这些文章中有很多将展示在现实世界中行之有效的技巧和策略。

本文涵盖的内容

本文将通过实际例子详细介绍 NLP 的以下方面。

  1. 通过网络抓取进行数据检索
  2. 文本争论和预处理
  3. 词性标注
  4. 浅层解析
  5. 选区和依存解析
  6. 命名实体识别
  7. 情感和情绪分析

这应该给你一个如何开始分析文本语料库中的语法和语义的好主意。

动机

从形式上看,NLP 是计算机科学和人工智能的一个专门领域,其根源是计算语言学。它主要关注设计和构建应用程序和系统,使机器和人类使用的自然语言之间能够进行交互。因此,它往往被视为一个利基领域的工作。而人们通常更倾向于关注机器学习或统计学习。

当我开始钻研数据科学领域时,甚至连我都被对文本数据进行分析和建模的挑战所淹没。然而,作为一名数据科学家,多年来我一直在研究 NLP 的一些挑战性问题,我注意到了一些有趣的方面,包括可以用来解决各种问题的技术、策略和工作流。我在我的书 【用 Python 进行文本分析】 (我正在写这个的修订版)和 【用 Python 进行实用的机器学习】 中涉及了几个关于 NLP 的主题。

然而,基于我从我所有的读者那里收到的所有优秀的反馈(是的,你们都是了不起的人!),创作这一系列文章的主要目的和动机是与更多的人分享我的学习,这些人不能总是找到时间坐下来通读一本书,甚至可以在旅途中参考这些文章!因此,没有必要购买这些书籍来学习 NLP。

入门指南

在为本文构建内容和示例时,我在想,我是应该关注一个玩具数据集来更好地解释事情,还是应该关注数据科学数据集的主要来源之一的现有数据集。然后我想,为什么不建立一个端到端的教程,在那里我们抓取 web 来获得一些文本数据,并展示基于这些数据的示例!

我们将处理的源数据将是新闻文章,这些文章是我们从 shorts 中检索到的,该网站为我们提供 60 字的简短新闻文章,涉及各种各样的主题,他们甚至有一个应用程序!

[## 体育新闻,60 个单词!

编辑描述

inshorts.com](https://inshorts.com/)

在本文中,我们将使用来自科技、体育和世界新闻的文本数据。我将在下一节讲述如何从他们的网站上抓取和检索这些新闻文章的一些基础知识。

标准 NLP 工作流

我假设您知道 CRISP-DM 模型,这是执行任何数据科学项目的典型行业标准。通常,任何基于 NLP 的问题都可以通过一个有条理的工作流来解决,这个工作流有一系列的步骤。下图描述了主要步骤。

A high-level standard workflow for any NLP project

我们通常从文本文档的语料库开始,并遵循文本争论和预处理、解析和基本探索性数据分析的标准流程。基于最初的见解,我们通常使用相关的特征工程技术来表示文本。根据手头的问题,我们要么专注于建立预测的监督模型,要么专注于无监督模型,后者通常更专注于模式挖掘和分组。最后,我们与相关利益相关者或客户一起评估模型和整体成功标准,并部署最终模型以供将来使用。

抓取新闻文章进行数据检索

我们将通过利用 python 来检索新闻文章,来抓取网站。我们将关注科技、体育和世界事务方面的文章。我们将为每个类别检索一页的文章。下图描述了一个典型的新闻类别登录页面,该页面还突出显示了每篇文章文本内容的 HTML 部分。

The landing page for technology news articles and its corresponding HTML structure

因此,我们可以在上面提到的登录页面中看到包含每篇新闻文章的文本内容的特定 HTML 标签。我们将利用这些信息通过利用**BeautifulSoup****requests**库来提取新闻文章。让我们首先加载下列依赖项。

****import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os****%matplotlib inline****

我们现在将构建一个功能,该功能将利用**requests**从三个新闻类别的登录页面访问并获取 HTML 内容。然后,我们将使用**BeautifulSoup**来解析和提取每个类别中所有新闻文章的新闻标题和文章文本内容。我们通过访问特定的 HTML 标签和类来找到内容,它们就在那里(我在前面的图中描述了一个例子)。

很明显,我们提取新闻标题、文章文本和类别,并构建一个数据框架,其中每一行对应一篇特定的新闻文章。我们现在将调用这个函数并构建我们的数据集。

****news_df = build_dataset(seed_urls)
news_df.head(10)****

Our news dataset

现在,我们有了一个格式整齐的新闻文章数据集,您可以使用下面的代码快速检查新闻文章的总数。

****news_df.news_category.value_counts()****Output:
-------
world         25
sports        25
technology    24
Name: news_category, dtype: int64****

文本争论和预处理

清理和预处理文本数据通常涉及多个步骤。我已经在“用 Python 进行文本分析”的第三章 中详细介绍了文本预处理 (代码是开源的)。然而,在这一节中,我将强调一些在自然语言处理(NLP)管道中大量使用的最重要的步骤,我经常在我的 NLP 项目中使用它们。我们将利用相当多的**nltk****spacy**,它们都是 NLP 中最先进的库。通常一辆pip install <library>或者一辆conda install <library>就足够了。但是,如果您在加载spacy’s语言模型时遇到问题,请按照下面强调的步骤来解决这个问题(我在我的一个系统中遇到过这个问题)。

****# OPTIONAL: ONLY USE IF SPACY FAILS TO LOAD LANGUAGE MODEL**
# Use the following command to install spaCy> pip install -U spacyOR> conda install -c conda-forge spacy# Download the following language model and store it in disk
[https://github.com/explosion/spacy-models/releases/tag/en_core_web_md-2.0.0](https://github.com/explosion/spacy-models/releases/tag/en_core_web_md-2.0.0)# Link the same to spacy 
> python -m spacy link ./spacymodels/en_core_web_md-2.0.0/en_core_web_md en_coreLinking successful
    ./spacymodels/en_core_web_md-2.0.0/en_core_web_md --> ./Anaconda3/lib/site-packages/spacy/data/en_coreYou can now load the model via spacy.load('en_core')**

现在让我们加载文本预处理所需的依赖项。我们将从停用词中移除否定词,因为我们希望保留它们,因为它们可能有用,尤其是在情感分析期间

重要提示:很多人给我发消息说无法加载收缩模块。它不是一个标准的 python 模块。我们利用了我的存储库中的[*contractions.py*](https://github.com/dipanjanS/practical-machine-learning-with-python/blob/master/bonus%20content/nlp%20proven%20approach/contractions.py)文件中的一组标准缩写。请将它添加到运行代码的同一个目录中,否则它将不起作用。

******import spacy
import pandas as pd
import numpy as np
import nltk
from nltk.tokenize.toktok import ToktokTokenizer
import re
from bs4 import BeautifulSoup
from contractions import CONTRACTION_MAP
import unicodedata****nlp = spacy.load('en_core', parse=True, tag=True, entity=True)**
#nlp_vec = spacy.load('en_vecs', parse = True, tag=True, #entity=True)
**tokenizer = ToktokTokenizer()
stopword_list = nltk.corpus.stopwords.words('english')
stopword_list.remove('no')
stopword_list.remove('not')******

删除 HTML 标签

通常,非结构化的文本包含许多噪音,尤其是当您使用 web 或屏幕抓取等技术时。HTML 标签通常是对理解和分析文本没有多大价值的组件之一。

******'Some important text'******

从上面的输出可以明显看出,我们可以删除不必要的 HTML 标签,保留任何文档中有用的文本信息。

删除重音字符

通常,在任何文本语料库中,您可能会处理带重音的字符/字母,尤其是当您只想分析英语时。因此,我们需要确保这些字符被转换并标准化为 ASCII 字符。一个简单的例子——将转换成****

****'Some Accented text'****

前面的函数向我们展示了如何轻松地将重音字符转换为正常的英语字符,这有助于标准化我们语料库中的单词。

扩张收缩

缩写是单词或音节的缩写。在英语中,它们通常以书面或口头的形式存在。这些单词的缩短版本或缩写是通过删除特定的字母和声音来创建的。在英语缩写的情况下,它们通常是通过从单词中去掉一个元音而产生的。例如, 不要不要我要我要 。将每个缩写转换为其扩展的原始形式有助于文本标准化。

我们利用了我的库 的 中的[contractions.py](https://github.com/dipanjanS/practical-machine-learning-with-python/blob/master/bonus%20content/nlp%20proven%20approach/contractions.py)文件中的一组标准缩写。

****'You all cannot expand contractions I would think'****

我们可以从前面的输出中看到我们的函数是如何帮助扩展收缩的。有更好的方法吗?肯定!如果我们有足够多的例子,我们甚至可以训练一个深度学习模型,以获得更好的性能。

删除特殊字符

特殊字符和符号通常是非字母数字字符,甚至偶尔是数字字符(取决于问题),这增加了非结构化文本中的额外噪声。通常,可以使用简单的正则表达式(regexes)来删除它们。

****'Well this was fun What do you think '****

我一直在删除可选的数字,因为我们经常需要在预处理的文本中保留它们。

堵塞物

要理解词干,你需要了解词干代表什么。词干也被称为一个单词的 基本形式 ,我们可以通过在词干上附加词缀来创造新单词,这一过程称为词尾变化。考虑**字。可以在上面加上词缀,组成类似 的新词。在这种情况下,基字 就是词干。****

Word stem and its inflections (Source: Text Analytics with Python, Apress/Springer 2016)

该图显示了词干是如何出现在所有词形变化中的,因为词干构成了词缀构成每个词形变化的基础。从一个单词的屈折形式获得其基本形式的反向过程被称为。词干分析帮助我们将单词标准化为词根或词根,而不管它们的词形变化,这有助于许多应用,如分类或聚类文本,甚至在信息检索中。现在让我们来看看流行的波特梗!

***'My system keep crash hi crash yesterday, our crash daili'***

波特词干分析器基于其发明者马丁·波特博士开发的算法。最初,据说该算法总共有五个不同的阶段来减少词干的屈折,每个阶段都有自己的一套规则。

请注意,词干通常有一套固定的规则,因此,词根可能在词典上不正确。这意味着,词干单词可能在语义上不正确,可能不在字典中(从前面的输出中可以明显看出)。**

词汇化

词汇化与词干化非常相似,我们移除词缀以获得单词的基本形式。然而,这种情况下的基本形式被称为词根,而不是词干。区别在于, 词根总是字典上正确的词 (存在于字典中),但是词根可能不是这样。因此,词根,也被称为 词条 ,将一直存在于字典中。**nltk****spacy**都有优秀的旅鼠。我们将在这里使用**spacy**

***'My system keep crash ! his crash yesterday , ours crash daily'***

你可以看到单词的语义并没有受到影响,然而我们的文本仍然是标准化的。

一定要注意,词干化过程比词干化慢得多,因为当且仅当词条存在于词典中时,词根形式或词条是通过从单词中移除词缀而形成的。

删除停用词

意义不大或没有意义的词,尤其是当从文本构建有意义的特征时,被称为停用词或停用词。如果你在语料库中做一个简单的术语或词频,这些通常是出现频率最高的词。通常,这些可以是冠词、连词、介词等等。停用词的一些例子是an*** 等。*****

****', , stopwords , computer not'****

没有通用的停用词表,但是我们使用来自**nltk**的标准英语停用词表。您还可以根据需要添加自己的特定于领域的停用词。

将所有这些放在一起——构建一个文本规范化器

虽然我们肯定可以继续使用更多的技术,如纠正拼写、语法等,但现在让我们将我们所学的一切集中在一起,并将这些操作链接起来,以构建一个文本规范化器来预处理文本数据。

现在让我们将这个功能付诸实践吧!我们首先将新闻标题和新闻文章文本组合在一起,为每条新闻形成一个文档。然后,我们将对它们进行预处理。

****{'clean_text': 'us unveils world powerful supercomputer beat china us unveil world powerful supercomputer call summit beat previous record holder china sunway taihulight peak performance trillion calculation per second twice fast sunway taihulight capable trillion calculation per second summit server reportedly take size two tennis court',** **'full_text': "US unveils world's most powerful supercomputer, beats China. The US has unveiled the world's most powerful supercomputer called 'Summit', beating the previous record-holder China's Sunway TaihuLight. With a peak performance of 200,000 trillion calculations per second, it is over twice as fast as Sunway TaihuLight, which is capable of 93,000 trillion calculations per second. Summit has 4,608 servers, which reportedly take up the size of two tennis courts."}****

因此,您可以看到我们的文本预处理程序如何帮助我们预处理新闻文章!之后,如果需要,您可以将该数据集保存到磁盘,这样您就可以随时加载它以供将来分析。

****news_df.to_csv('news.csv', index=False, encoding='utf-8')****

理解语言语法和结构

对于任何语言来说,句法和结构通常是密切相关的,其中一套特定的规则、惯例和原则支配着单词组合成短语的方式;短语被组合成从句;从句被组合成句子。在这一部分,我们将专门讨论英语的语法和结构。在英语中,单词通常组合在一起形成其他组成单位。这些成分包括单词、短语、从句和句子。考虑到一个句子, “棕色的狐狸很快,他跳过了懒惰的狗” ,它是由一堆单词组成的,只看单词本身并不能告诉我们太多。

A bunch of unordered words don’t convey much information

关于语言的结构和语法的知识在许多领域都是有帮助的,例如文本处理、注释和进一步操作的解析,例如文本分类或摘要。下面提到了理解文本语法的典型解析技术。

  • 词性标注
  • 浅层解析或组块
  • 选区解析
  • 依存解析

我们将在随后的章节中研究所有这些技术。考虑到我们之前的例句 “棕色的狐狸很快,他跳过了懒惰的狗” ,如果我们使用基本的 POS 标签来注释它,它将看起来像下图。

POS tagging for a sentence

因此,一个句子通常遵循由以下部分组成的层次结构,

句子→从句→短语→单词

标注词性

词类(POS)是特定的词汇类别,单词根据它们的句法环境和角色被分配到这些词汇类别中。通常,单词可以归入以下主要类别之一。

  • N(oun): 通常指描绘某种物体或实体的词语,可能是有生命的,也可能是无生命的。一些例子是狐狸、狗、书等等。名词的词性标签符号是 N
  • V(erb) :动词是用来描述某些动作、状态或事件的词语。还有各种各样的子类,如助动词、自反动词和及物动词(等等)。一些典型的动词例子有跑、跳、读和写。动词的位置标记符号是 V
  • 形容词 :形容词是用来描述或修饰其他词的词,通常是名词和名词短语。短语“美丽的花”有名词“花”,它是用形容词“美丽的”( ADJ)来描述或限定的。形容词的位置标记符号是 ADJ
  • Adv(erb): 副词通常充当其他词的修饰语,包括名词、形容词、动词或其他副词。非常美丽的花这个短语有副词(ADV)非常,它修饰形容词(ADJ)美丽,表示花美丽的程度。副词的词性标签符号是 ADV

除了这四大类词类之外,在英语中还有其他频繁出现的词类。这些包括代词、介词、感叹词、连词、限定词等等。此外,每个像名词 ( N )这样的词性标签还可以进一步细分为像单数名词(NN)单数专有名词(NNP)复数名词 ( NNS )这样的类别。****

对词性标注进行分类和标注的过程称为词性标注词性标注。词性标签用于注释单词和描述它们的词性,这对于执行特定的分析非常有帮助,例如缩小名词的范围并查看哪些是最突出的,词义消歧和语法分析。我们将利用**nltk****spacy**,它们通常使用 Penn Treebank 符号 进行词性标注。****

POS tagging a news headline

我们可以看到,每个库都以自己的方式对待令牌,并为它们分配特定的标签。根据我们所看到的,**spacy**似乎比**nltk**做得稍好。

浅层解析或分块

根据我们前面描述的层次结构,词组构成短语。有五大类短语:

  • 名词短语(NP): 名词充当中心词的短语。名词短语充当动词的主语或宾语。
  • 动词短语(VP): 这些短语是以动词为中心词的词汇单位。通常,动词短语有两种形式。一种形式有动词成分以及其他实体,如名词、形容词或副词,作为宾语的一部分。
  • 形容词短语(ADJP):这些是以形容词为中心词的短语。它们的主要作用是描述或修饰句子中的名词和代词,它们可以放在名词或代词的前面或后面。
  • 副词短语(ADVP): 这些短语的作用像副词,因为副词在短语中充当中心词。副词短语用作名词、动词或副词本身的修饰语,提供进一步的细节来描述或限定它们。
  • 介词短语(PP): 这些短语通常包含一个介词作为中心词,以及其他词汇成分,如名词、代词等。这些就像形容词或副词描述其他单词或短语。

浅层解析,也称为轻型解析或组块,是一种流行的自然语言处理技术,它分析句子的结构,将其分解为最小的成分(即单词等标记),并将它们组合成更高级别的短语。这包括词性标签以及句子中的短语。

An example of shallow parsing depicting higher level phrase annotations

我们将利用**conll2000**语料库来训练我们的浅层解析器模型。这个语料库在**nltk**中提供了组块注释,我们将使用 10K 记录来训练我们的模型。一个带注释的句子示例描述如下。

****10900 48
(S
  Chancellor/NNP
  (PP of/IN)
  (NP the/DT Exchequer/NNP)
  (NP Nigel/NNP Lawson/NNP)
  (NP 's/POS restated/VBN commitment/NN)
  (PP to/TO)
  (NP a/DT firm/NN monetary/JJ policy/NN)
  (VP has/VBZ helped/VBN to/TO prevent/VB)
  (NP a/DT freefall/NN)
  (PP in/IN)
  (NP sterling/NN)
  (PP over/IN)
  (NP the/DT past/JJ week/NN)
  ./.)****

从前面的输出中,您可以看到我们的数据点是已经用短语和 POS 标签元数据进行了注释的句子,这将有助于训练我们的浅层解析器模型。我们将利用两个分块实用函数 tree2conlltags 来获取每个标记的单词、标记和块标记三元组,并利用 conlltags2tree 从这些标记三元组生成一个解析树。我们将使用这些函数来训练我们的解析器。下面是一个例子。

****[('Chancellor', 'NNP', 'O'),
 ('of', 'IN', 'B-PP'),
 ('the', 'DT', 'B-NP'),
 ('Exchequer', 'NNP', 'I-NP'),
 ('Nigel', 'NNP', 'B-NP'),
 ('Lawson', 'NNP', 'I-NP'),
 ("'s", 'POS', 'B-NP'),
 ('restated', 'VBN', 'I-NP'),
 ('commitment', 'NN', 'I-NP'),
 ('to', 'TO', 'B-PP'),
 ('a', 'DT', 'B-NP'),
 ('firm', 'NN', 'I-NP'),
 ('monetary', 'JJ', 'I-NP'),
 ('policy', 'NN', 'I-NP'),
 ('has', 'VBZ', 'B-VP'),
 ('helped', 'VBN', 'I-VP'),
 ('to', 'TO', 'I-VP'),
 ('prevent', 'VB', 'I-VP'),
 ('a', 'DT', 'B-NP'),
 ('freefall', 'NN', 'I-NP'),
 ('in', 'IN', 'B-PP'),
 ('sterling', 'NN', 'B-NP'),
 ('over', 'IN', 'B-PP'),
 ('the', 'DT', 'B-NP'),
 ('past', 'JJ', 'I-NP'),
 ('week', 'NN', 'I-NP'),
 ('.', '.', 'O')]****

块标签使用 IOB 格式。这个符号代表内部、外部和开始。标签前的 B 前缀表示它是块的开始,I 前缀表示它在块内。O 标记表示该令牌不属于任何块。如果后面有相同类型的后续标签,并且它们之间没有 O 标签,则总是使用 B 标签。

我们现在将定义一个函数**conll_tag_ chunks()**来从带有分块注释的句子中提取词性和分块标签,以及一个名为**combined_taggers()**的函数来训练多个带有后退标签的标签(例如,一元和二元标签)

我们现在将定义一个类**NGramTagChunker**,它将接受带标签的句子作为训练输入,获取它们的 (单词、词性标签、组块标签) WTC 三元组,并训练一个带有**UnigramTagger****BigramTagger**作为补偿标签。我们还将定义一个**parse()**函数来对新句子进行浅层解析

**UnigramTagger****BigramTagger****TrigramTagger**是继承自基类**NGramTagger**的类,基类本身继承自**ContextTagger**类,而**ContextTagger**类继承自**SequentialBackoffTagger**类。

我们将使用这个类在**conll2000**分块**train_data**上训练,并在**test_data**上评估模型性能

****ChunkParse score:
    IOB Accuracy:  90.0%%
    Precision:     82.1%%
    Recall:        86.3%%
    F-Measure:     84.1%%****

我们的分块模型获得了大约 90%的准确率,这是非常好的!现在让我们利用这个模型来浅层解析和分块我们之前使用的样本新闻标题, “美国推出世界上最强大的超级计算机,击败中国”。

****chunk_tree = ntc.parse(nltk_pos_tagged)
print(chunk_tree)****Output:
-------
(S
  (NP US/NNP)
  (VP unveils/VBZ world's/VBZ)
  (NP most/RBS powerful/JJ supercomputer,/JJ beats/NNS China/NNP))****

因此,您可以看到它在新闻文章中识别了两个名词短语(NP)和一个动词短语(VP)。每个单词的词性标签也是可见的。我们也可以用如下的树形图来形象化这一点。你可能需要安装ghostscript,以防**nltk**抛出错误。

Shallow parsed news headline

在对新闻标题进行浅层解析后,前面的输出给出了很好的结构感。

选区分析

基于成分的语法用于分析和确定句子的成分。这些语法可以用来根据句子成分的层次有序结构来模拟或表示句子的内部结构。每个词通常都属于特定的词汇范畴,并构成不同短语的中心词。这些短语是基于称为短语结构规则的规则形成的。**

短语结构规则 构成了选区语法的核心,因为它们讲述了支配句子中各种成分的层次和顺序的语法和规则。这些规则主要迎合两件事。

  • 他们决定用什么词来构成短语或成分。
  • 它们决定了我们需要如何排列这些成分。

短语结构规则的通称是 S → AB ,描绘出结构 S 由成分B 组成,排序为 A 后接 B 。虽然有几个规则(参考第 1 章,第 19 页:使用 Python 的文本分析,如果你想更深入地研究),但最重要的规则描述了如何划分一个句子或从句。短语结构规则将一个句子或从句的二元划分表示为 S → NP VP 其中 S 是句子或从句,它分为主语,由名词短语( NP 表示)和谓语,由动词短语( VP 表示)。****

可以基于这样的语法/规则来构建选区分析器,这些语法/规则通常作为上下文无关语法(CFG)或短语结构语法来共同使用。解析器将根据这些规则处理输入的句子,并帮助构建解析树。

An example of constituency parsing showing a nested hierarchical structure

我们将在这里使用**nltk****StanfordParser**来生成解析树。

先决条件:这里 下载斯坦福官方解析器,貌似效果还不错。你可以通过访问 这个网站 并查看发布历史部分来试用更高版本。下载后,将其解压缩到文件系统中的一个已知位置。一旦完成,您现在就可以使用来自**nltk**的解析器了,我们将很快对此进行探讨。****

斯坦福解析器一般使用 PCFG(概率上下文无关语法)解析器 。PCFG 是一种上下文无关的语法,它将概率与其每个产生式规则相关联。从 PCFG 生成解析树的概率就是用来生成解析树的各个产品的概率的乘积。

******(ROOT
  (SINV
    (S
      (NP (NNP US))
      (VP
        (VBZ unveils)
        (NP
          (NP (NN world) (POS 's))
          (ADJP (RBS most) (JJ powerful))
          (NN supercomputer))))
    (, ,)
    (VP (VBZ beats))
    (NP (NNP China))))******

我们可以看到新闻标题的选区解析树。让我们把它形象化,以便更好地理解结构。

******from IPython.display import display
display(result[0])******

Constituency parsed news headline

与浅层解析中的平面结构相比,我们可以看到前面输出中成分的嵌套层次结构。如果你想知道 SINV 是什么意思,它代表一个倒置的陈述句,即主语跟随时态动词或情态动词的句子。根据需要参考 Penn Treebank 参考 查找其他标签。**

依存句法分析

在依存分析中,我们尝试使用基于依存的语法来分析和推断结构和语义依存关系以及句子中标记之间的关系。依存语法背后的基本原理是,在语言的任何句子中,除了一个词之外,所有的词都与句子中的其他词有某种关系或依存关系。没有依存关系的词叫做句根。在大多数情况下,动词被当作句子的词根。所有其他的单词都使用连接直接或间接地连接到词根动词,这就是依存关系。**

考虑到我们的句子 “棕色的狐狸很快,他跳过了懒惰的狗” ,如果我们想为此绘制依存句法树,我们将有这样的结构

A dependency parse tree for a sentence

这些依赖关系都有自己的含义,是通用依赖类型列表的一部分。这在一篇原创论文中讨论过, 德马尔内菲等人 2014 年 的《普遍斯坦福依赖:跨语言类型学》。你可以在这里 查看依赖类型及其含义的详尽列表

如果我们观察其中的一些依赖关系,就不难理解它们。

  • 依存标签det非常直观——它表示名词中心语和限定词之间的限定词关系。通常,带有 POS 标签 DET 的单词也会有 det 依存标签关系。例子有**fox → the****dog → the********
  • 依存标签 amod 代表形容词修饰语,代表任何修饰名词意思的形容词。例子有**fox → brown****dog → lazy**
  • 依存标签 nsubj 代表在从句中充当主语或施事的实体。例子包括**is → fox****jumping → he**
  • 依存关系 ccconj 更多的是与并列连词连接的词语相关的联系。例子包括**is → and****is → jumping**
  • 依存标记 aux 表示从句中的助动词或次要动词。例子:**jumping → is**
  • 依存标签 acomp 代表形容词补语,在句子中充当动词的补语或宾语。例子:**is → quick**
  • 依存标签 prep 表示介词修饰语,通常修饰名词、动词、形容词或介词的意思。通常,这种表示法用于带有名词或名词短语补语的介词。举例:**jumping → over**
  • 依存标记 pobj 用来表示介词的宾语。这通常是句子中介词后面的名词短语的中心。例子:**over → dog**

Spacy 根据你使用的语言模型有两种类型的英语依存解析器,你可以在这里 找到更多细节 。基于语言模型,可以使用 通用依赖方案 或者 清晰样式依赖方案 现在 NLP4J 中也有了。我们现在将利用**spacy**并打印出新闻标题中每个标记的依赖关系。

***[]<---US[compound]--->[]
--------
['US']<---unveils[nsubj]--->['supercomputer', ',']
--------
[]<---world[poss]--->["'s"]
--------
[]<---'s[case]--->[]
--------
[]<---most[amod]--->[]
--------
[]<---powerful[compound]--->[]
--------
['world', 'most', 'powerful']<---supercomputer[appos]--->[]
--------
[]<---,[punct]--->[]
--------
['unveils']<---beats[ROOT]--->['China']
--------
[]<---China[dobj]--->[]
--------***

很明显,动词 beats 是词根,因为与其他标记相比,它没有任何其他依赖性。要了解每个注释的更多信息,您可以随时参考 清除依赖方案 。我们也可以用更好的方式来可视化上面的依赖关系。

News Headline dependency tree from SpaCy

您还可以利用**nltk****StanfordDependencyParser**来可视化和构建依赖树。我们展示了依赖树的原始形式和注释形式,如下所示。

***(beats (unveils US (supercomputer (world 's) (powerful most)))  
 China)***

Dependency Tree visualizations using nltk’s Stanford dependency parser

您可以注意到与我们之前获得的树的相似之处。注释有助于理解不同令牌之间的依赖类型。

命名实体识别

在任何文本文档中,都有代表特定实体的特定术语,这些术语提供更多信息,并具有独特的上下文。这些实体被称为命名实体,更具体地说,命名实体是指表示真实世界对象的术语,如人、地点、组织等,它们通常由专有名称表示。一种简单的方法是通过查看文本文档中的名词短语来找到它们。命名实体识别(NER),也称为实体分块/提取,是一种在信息提取中使用的流行技术,用于识别和分割命名实体,并根据各种预定义的类别对它们进行分类或归类。

SpaCy 拥有一些优秀的命名实体识别能力。让我们试着在我们的一篇样本新闻文章中使用它。

***[(US, 'GPE'), (China, 'GPE'), (US, 'GPE'), (China, 'GPE'), 
 (Sunway, 'ORG'), (TaihuLight, 'ORG'), (200,000, 'CARDINAL'), 
 (second, 'ORDINAL'), (Sunway, 'ORG'), (TaihuLight, 'ORG'), 
 (93,000, 'CARDINAL'), (4,608, 'CARDINAL'), (two, 'CARDINAL')]***

Visualizing named entities in a news article with spaCy

我们可以清楚地看到主要的命名实体已经被**spacy**识别。要更详细地了解每个命名实体的含义,您可以参考文档或查看下表。****

Named entity types

现在让我们找出新闻语料库中最常见的命名实体!为此,我们将使用以下代码构建一个包含所有命名实体及其类型的数据框架。

现在,我们可以转换和聚合该数据框,以找到出现次数最多的实体和类型。

Top named entities and types in our news corpus

你注意到什么有趣的事情了吗? ( 提示: 也许是川普和金仲翀之间所谓的峰会吧!)。我们还看到它正确地将“Messenger”识别为一种产品(来自脸书)。

我们还可以根据实体类型进行分组,以了解什么类型的实体在我们的新闻语料库中出现得最多。

Top named entity types in our news corpus

我们可以看到,人、地点和组织是提到最多的实体,但有趣的是,我们还有许多其他实体。

另一个不错的 NER 标签是可从**nltk**界面获得的**StanfordNERTagger**。为此,您需要安装 Java,然后下载斯坦福 NER 资源。将它们解压缩到您选择的位置(我在系统中使用了E:/stanford)。**

斯坦福的命名实体识别器 基于线性链条件随机场(CRF)序列模型的一种实现。遗憾的是这个模型只在 组织* 和 位置 类型的实例上训练。下面的代码可以作为一个标准的工作流程,帮助我们使用这个标签提取命名实体,并显示顶级命名实体及其类型(提取与**spacy**略有不同)。*****

Top named entities and types from Stanford NER on our news corpus

我们注意到非常相似的结果,尽管仅限于三种类型的命名实体。有趣的是,我们在各种运动中看到许多提到的几个人。

情感和情绪分析

情感分析可能是 NLP 最受欢迎的应用之一,有大量的教程、课程和应用程序专注于分析从公司调查到电影评论等不同数据集的情感。情感分析的关键方面是分析一个文本体,以理解它所表达的观点。通常,我们用一个正值或负值来量化这种情绪,称为总体情绪 往往从极性得分的符号推断为中性负*。*****

通常,情感分析对有主观背景的文本比对只有客观背景的文本效果更好。客观文本通常描述一些正常的陈述或事实,而不表达任何情绪、感受或心情。主观文本包含通常由具有典型情绪、情感和感觉的人表达的文本。情绪分析被广泛使用,尤其是作为社交媒体分析的一部分,用于任何领域,无论是商业、最近的电影还是产品发布,以了解人们对它的接受程度,以及他们根据自己的意见或,你猜对了,情绪对它的看法!

通常,对文本数据的情感分析可以在几个级别上进行计算,包括在单个句子级别、段落级别或者作为整体的整个文档。通常,情感是作为一个整体在文档上计算的,或者在计算了单个句子的情感之后进行一些聚合。有两种主要的情感分析方法。

  • 监督机器学习或深度学习方法
  • 无监督的基于词典的方法

对于第一种方法,我们通常需要预先标记的数据。因此,我们将关注第二种方法。关于情感分析的全面覆盖,请参考 第七章:分析影评情感 用 Python 进行实用机器学习,Springer\Apress,2018 。在这种情况下,我们没有标记良好的训练数据集的便利。因此,我们将需要使用无监督的技术来预测情感,通过使用知识库、本体、数据库和词典,它们具有详细的信息,专门为情感分析而策划和准备。词典是字典、词汇或一本单词书。在我们的例子中,词典是为分析情感而创建的特殊词典或词汇。这些词典中的大多数都有一个正负极性单词的列表,这些单词都有一些与之相关的分数,并且使用各种技术,如单词的位置、周围的单词、上下文、词性、短语等等,分数被分配给我们想要计算情感的文本文档。汇总这些分数后,我们得到最终的情感。

各种流行的词汇被用于情感分析,包括如下。

  • AFINN 词典
  • 刘冰词库
  • MPQA 主观性词汇
  • SentiWordNet
  • VADER 词典
  • 文本斑点词典

这不是可以用于情感分析的词汇的详尽列表,还有几个其他的词汇可以很容易地从互联网上获得。请随意查看这些链接并探索它们。我们将在这一部分讨论两种技术。

基于 AFINN 词典的情感分析

AFINN 词典 也许是最简单和最流行的词典之一,可以广泛用于情感分析。由 Finn RUP Nielsen 开发和策划,你可以在论文“一个新的新的:评估用于微博情感分析的单词列表”,ESWC 2011 研讨会的会议录中找到关于这个词汇的更多细节。词典的当前版本是 AFINN-en-165。txt 你可以在作者的 官方 GitHub 知识库 中找到这本词典,以及它以前的版本,包括AFINN-111。作者还在此基础上用 Python 创建了一个很好的包装器库,名为**afinn**,我们将使用它进行分析。****

下面的代码计算所有新闻文章的情绪,并显示每个新闻类别的一般情绪的汇总统计。

我们可以很好地了解不同新闻类别的总体情绪统计。貌似一般人气在 体育 很正,在 科技 相当负!现在让我们来看一些可视化。

Visualizing news sentiment polarity

我们可以看到,与相比,在 体育世界 中,情绪极性的传播要高得多,在那里,许多文章似乎都具有负极性。我们也可以将情感标签的频率可视化。**

Visualizing sentiment categories per news category

毫无疑问, 技术 的负面文章最多,而 世界 的正面文章最多。 体育 可能会有更多中性的文章,这是因为存在本质上更客观的文章(谈论体育赛事而不存在任何情绪或感觉)。下面就让我们深入探讨一下 科技 新闻最正反的情绪新闻文章。

看起来最负面的文章是关于最近在印度的智能手机骗局,最正面的文章是关于在自动驾驶班车上结婚的比赛。有意思!让我们对 世界 新闻做一个类似的分析。

有趣的是,特朗普同时出现在最积极和最消极的 世界 新闻文章中。请务必阅读这些文章,从更多的角度了解为什么模型选择了其中一个作为最负面的,而另一个作为最正面的(这并不奇怪!).

使用 TextBlob 进行情感分析

text blob是另一个用于轻松执行 NLP 任务的优秀开源库,包括 情感分析 。它也是一个 情感词典 (以 XML 文件的形式),它利用它来给出极性和主观性分数。通常,与 Afinn 相比,分数具有标准化的标度。 极性 分数在**[-1.0, 1.0]**范围内浮动。 主观**[0.0, 1.0]**范围内浮动,其中**0.0**非常客观**1.0**非常主观。现在让我们使用它来获取每篇新闻文章的情感极性和标签,并汇总每个新闻类别的汇总统计数据。****

貌似平均人气在 世界 最正,在 科技 最不正!然而,这些指标可能表明模型预测更多的文章是正面的。我们来看每个新闻类别的情绪频率分布。

Visualizing sentiment categories per news category

与我们之前的模型相比,这里的新闻类别中肯定有更多积极的文章。然而,看起来科技仍然有最多的负面文章和世界上最多的正面文章,这与我们之前的分析相似。让我们现在做一个对比分析,看看我们是否还能在 世界 新闻的最正面和最负面类别中获得类似的文章。

嗯,看来这里最负面的 世界 新闻文章比我们上次看到的还要压抑!最积极的文章仍然与我们在上一个模型中获得的相同。

最后,我们甚至可以在这两个模型之间评估和比较有多少预测是匹配的,有多少是不匹配的(通过利用分类中经常使用的混淆矩阵)。为此,我们利用我们漂亮的**model_evaluation_utils**模块。

Comparing sentiment predictions across models

在上表中, 【实际】 标签是来自 Afinn 情感分析器的预测,而 【预测】 标签是来自**TextBlob**的预测。看来我们之前的假设是正确的。**TextBlob**明确预测几篇中性阴性的文章为阳性。总的来说,大多数情绪预测似乎是匹配的,这很好!****

结论

这绝对是我的长篇文章之一!如果你正在读这篇文章,我真的很感谢你一直陪我读到这篇文章的结尾。这些例子应该让你很好地了解如何开始使用文本文档的语料库,以及用于文本检索、预处理、解析、理解结构、实体和情感的流行策略。在本系列的下一篇文章中,我们将通过实际例子介绍特征工程和表示技术。敬请期待!

本文使用的所有代码和数据集都可以从我的 GitHub 中访问

该代码也可作为 Jupyter 笔记本

我经常指导和帮助 跳板 的学生学习数据科学方面的基本技能。感谢 他们 帮我开发这个内容。如果你对学习数据科学的职业结构化道路感兴趣,一定要去看看 Springboard 的 DSC 训练营

**** [## 数据科学职业轨迹|跳板

数据科学职业跟踪是您进入数据科学职业的跳板。在线导师指导训练营,旨在获得…

www.springboard.com](https://www.springboard.com/workshops/data-science-career-track)

这些代码中有很多来自我在写书 “用 Python 进行文本分析” 期间所做的研究和工作。代码在 GitHub 上开源。 (Python 3.x 版将于今年年底推出!)

[## 使用 Python 进行文本分析——一种实用的现实方法,可以从以下方面获得可操作的见解…

使用 Python 从数据中获得有用的见解。您将学习基本和高级概念,包括文本和…

www.springer.com](https://www.springer.com/us/book/9781484223871)

《用 Python 进行实用的机器学习》 ,我的另一本书也详细涉及了文本分类和情感分析。为了您的方便,代码在 GitHub 上开源。

[## 使用 Python 的实用机器学习--构建真实世界的问题解决者指南…

掌握识别和解决复杂问题所需的基本技能与机器学习和深度学习在…

www.springer.com](https://www.springer.com/us/book/9781484232064)

如果你对我的文章或数据科学有任何反馈、评论或有趣的见解要分享,请随时通过我的 LinkedIn 社交媒体频道联系我。

[## Dipanjan Sarkar -数据科学家-英特尔公司| LinkedIn

查看 Dipanjan Sarkar 在世界最大的职业社区 LinkedIn 上的个人资料。Dipanjan 有 6 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/dipanzan/)

感谢 杜巴 编辑本文。****

PyTorch 实践指南

原文:https://towardsdatascience.com/a-practitioners-guide-to-pytorch-1d0f6a238040?source=collection_archive---------0-----------------------

几天前我开始使用 PyTorch。下面我概述了 PyTorch 的关键概念,以及一些我在接触这个框架时发现特别有用的观察结果(如果你没有意识到它们,这可能会导致很多挫折!)

词汇表

张量——(喜欢)一个 numpy.ndarray 但是可以住在 GPU 上。

变量——通过将张量自身包裹起来,使其成为计算的一部分。如果创建时 requires_grad = True,将在向后阶段计算梯度。

pytorch 如何工作

您可以通过写出它们来执行计算,就像这样:

Taking a dot product of x with w using the new Python 3.5 syntax. torch.cuda creates the tensor on the GPU.

一旦完成,您需要做的就是对结果调用#backward()。这将计算梯度,并且您将能够访问使用 requires_grad = True 创建的变量的梯度。

Accessing the gradient of w.

要记住的事情(否则有发疯的危险)

  1. 数据类型很重要! 如果把一个字节或者除以 50 会怎么样?如果你试图将 torch.exp(12)的结果存储在一个半张量中会怎样?实际上,这比乍看起来要简单得多,但确实需要一些思考。
  2. 如果能上溢或下溢,就会。 数值稳定性很重要——当存储在合成张量中时,除法能产生零吗?如果你试着把它记录下来呢?
    再一次——这没什么可详细说明的,但肯定是需要注意的。如果你想更深入地了解这一点,让我向你介绍终极,同时在这一问题上非常平易近人的来源。
  3. 渐变默认累加!我把最好的留到了最后——与我们现在要看的野生动物相比,上面两只是友好的吉娃娃!
    默认情况下,渐变会累积。你运行一次计算,你逆向运行——一切都很好。但是,对于第二次运行,渐变被添加到第一次操作的渐变中!这很重要,也很容易忘记,请看看我们之前的例子:

解决方案是在运行之间手动调零梯度。

最后但同样重要的是,我想推荐官方教程——不管你的经验水平如何,它们都是值得一去的好地方。

我希望这能对你有所帮助,并能省去我在开始学习 PyTorch 时所经历的一些挣扎。祝我们俩好运,因为我们将继续掌握这个令人惊叹的框架!

如果你觉得这篇文章很有趣并且想保持联系,你可以在 Twitter 上找到我 这里

一个生产就绪的多类文本分类器

原文:https://towardsdatascience.com/a-production-ready-multi-class-text-classifier-96490408757?source=collection_archive---------1-----------------------

在任何业务中,理解客户是成功的基本要素。用户的观点、查询和意见在传递用户观点方面起着重要作用。每个人现在都在试图使用一种叫做“自然语言处理”的新兴技术来收集这些嵌入式用户对产品或服务的看法。文本或句子分类是“自然语言处理”下一个非常热门且必要的问题。在这篇文章中,我们将介绍如何使用支持向量机构建一个生产就绪的多类文本分类器。

[## sambit 9238/机器学习

机器学习——它代表了机器学习在不同场景中的一些实现。

github.com](https://github.com/sambit9238/Machine-Learning/blob/master/question_topic_nlp.ipynb)

任何机器学习问题的第一步都是收集所有分析和预测所需的数据。这里,我们使用的数据集包含 5000 个客户查询和相应的问题主题。总共有 5 个独特的问题主题。因此,让我们首先导入所需的依赖项并加载数据集。

import pandas as pd
import numpy as np
#load data
df = pd.read_csv("question_topic.csv")

为了了解数据是如何存在的,让我们探索一下数据集中的 5 个随机观察值。

df.sample(5)

在继续之前,我们需要检查问题主题以及在数据集中出现的次数。

from collections import Counter
Counter(df["question_topic"])

每个职业出现的次数看起来还不错,尽管在职业中不平衡。现在,在进行特征分解之前,我们首先需要做一些预处理,比如去除数字等。因为它们无助于预测问题的上下文。

#pre-processing
import re 
def clean_str(string):
    """
    Tokenization/string cleaning for dataset
    Every dataset is lower cased except
    """
    string = re.sub(r"\n", "", string)    
    string = re.sub(r"\r", "", string) 
    string = re.sub(r"[0-9]", "digit", string)
    string = re.sub(r"\'", "", string)    
    string = re.sub(r"\"", "", string)    
    return string.strip().lower()
X = []
for i in range(df.shape[0]):
    X.append(clean_str(df.iloc[i][1]))
y = np.array(df["question_topic"])

现在,让我们对数据进行训练测试分割,开始建模。一般惯例是取 70%作为训练数据,30%作为测试数据。

#train test split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=5)

之后,训练测试分裂,我们应该开始设计分类器。因为输入是文本,我们首先需要将它们转换成数字向量,以输入到任何机器学习算法中。使用以下两种方法完成要素的矢量化。

CountVectorizer: 将评论转化为 token 计数矩阵。首先,它对文本进行标记,并根据每个标记出现的次数,创建一个稀疏矩阵。CountVectorizer 矩阵的计算:假设我们有三个不同的文档,包含以下句子。

“相机很棒”。

“相机太可怕了”。

“相机没问题”。

生成大小为 3*5 的矩阵,因为我们有 3 个文档和 5 个不同的特征。矩阵将看起来像:-

TF-IDF: 它的值代表一个词在语料库中对文档的重要性。TF-IDF 值与一个词在文档中的出现频率成正比。TF-IDF 值的计算:假设电影评论包含 100 个单词,其中单词 Awesome 出现了 5 次。Awesome 的项频率(即 TF)则为(5 / 100) = 0.05。同样,假设语料库中有 100 万条评论,单词 Awesome 在整个语料库中出现 1000 次,则逆文档频率(即 IDF)被计算为 log(1,000,000 / 1,000) = 3。因此,TF-IDF 值计算如下:0.05 * 3 = 0.15。

现在,数字向量作为支持向量机算法的输入给出。因为在文本情况下特征的数量通常很大,所以线性核通常表现最好。

这里的另一个挑战是多类分类。在支持向量机实现中,我们可以使用 OneVsRest 分类器概念。OneVsRest(或一对一对所有,OvA 或 OvR,一对一对所有,OAA)策略涉及每个类训练一个单一的分类器,该类的样本作为阳性样本,所有其他样本作为阴性样本。这种策略要求基本分类器为其决策产生一个实值置信度得分,而不仅仅是一个分类标签;单独的离散类别标签会导致模糊性,即针对单个样本预测多个类别。

为了使分类器设计生产就绪,我们可以创建一个上述所有这些过程的管道,从而使其更容易转移到其他系统。

#pipeline of feature engineering and model
model = Pipeline([(‘vectorizer’, CountVectorizer()),
 (‘tfidf’, TfidfTransformer()),
 (‘clf’, OneVsRestClassifier(LinearSVC(class_weight=”balanced”)))])
#the class_weight="balanced" option tries to remove the biasedness of model towards majority sample

对于使用的每一种机器学习算法,参数调整都起着重要的作用。已经观察到,通过设置适当的参数值,模型的性能合理地提高。我们可以使用网格搜索找到适合我们情况的参数,如下所示

#paramater selection
from sklearn.grid_search import GridSearchCV
parameters = {'vectorizer__ngram_range': [(1, 1), (1, 2),(2,2)],
               'tfidf__use_idf': (True, False)}
gs_clf_svm = GridSearchCV(model, parameters, n_jobs=-1)
gs_clf_svm = gs_clf_svm.fit(X, y)
print(gs_clf_svm.best_score_)
print(gs_clf_svm.best_params_)

所以,现在我们从网格搜索中得到合适的参数。是时候使用最合适的参数来准备最终的管道了。

#preparing the final pipeline using the selected parameters
model = Pipeline([('vectorizer', CountVectorizer(ngram_range=(1,2))),
    ('tfidf', TfidfTransformer(use_idf=True)),
    ('clf', OneVsRestClassifier(LinearSVC(class_weight="balanced")))])

然后,我们将使用训练数据和测试数据来拟合模型,以便对整体性能有一个总体了解。

#fit model with training data
model.fit(X_train, y_train)
#evaluation on test data
pred = model.predict(X_test)
from sklearn.metrics import confusion_matrix, accuracy_score
confusion_matrix(pred, y_test)

Confusion Matrix

否则,如果确信从网格搜索交叉验证获得的准确度分数,我们可以直接用全部数据拟合模型。

model.fit(X, y)

现在我们需要将准备模型保存在 pickle 文件中,以便可以在生产端部署它。python 中的 joblib 函数使它变得更容易。

from sklearn.externals import joblib
model = joblib.load('model_question_topic.pkl')

现在模型已经准备好并保存到文件系统中。对于模型部署,pickle 文件可以移动到生产站点,并将通过如下所示的输入进行调用

from sklearn.externals import joblib
model = joblib.load('model_question_topic.pkl')
question = input()
model.predict([question])[0]

提高文本分类器性能的更多技巧可以是:-

1 .消除低质量特征(单词)

2.有一个合适的停用词表

3.多样化你的训练语料库

4.使用词干化和词汇化

参考文献-

[## sk learn . pipeline . pipeline-sci kit-learn 0 . 19 . 1 文档

管道的目的是组装几个步骤,这些步骤可以在设置不同的…

scikit-learn.org](http://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html) [## 4.1.Pipeline 和 FeatureUnion:组合估算器-sci kit-了解 0.19.1 文档

可用于将多个评估器连接成一个。这很有用,因为在…中通常有固定的步骤顺序

scikit-learn.org](http://scikit-learn.org/stable/modules/pipeline.html) [## 使用文本数据-scikit-了解 0.19.1 文档

20 个新闻组数据集是大约 20,000 个新闻组文档的集合,这些文档(几乎)均匀地进行了分区…

scikit-learn.org](http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html)

用音乐投资(和获利)的量化方法

原文:https://towardsdatascience.com/a-quantitative-approach-to-investing-and-profiting-with-music-2537a1260c53?source=collection_archive---------13-----------------------

||简介||

大多数消费者和投资者都非常熟悉通过 Spotify 和 Apple Music 等服务获得的商业音乐的内容流方面,以及如何投资于它们(只需购买 \(SPOT* 或 *\)AAPL ),但制作方面呢?

我(作为一个不能连续两个小时不听好音乐的人)想结合我的一些兴趣,了解一个人如何投资音乐制作,以及在这个领域是否有一个独特的投资机会,可以快速获利?经过一番思考,我缩小了我的关注点,形成了以下研究问题:

是否有某些股票受到音乐输出(如歌曲、专辑等)的显著影响。)那我可以投资吗?如果是这样的话,我能预测哪些专辑/歌曲将会推动价格,从而在市场之前获得可观的回报吗?

答案是一个响亮的也许!

||概述||

在音乐界,有三个音乐制作的“霸主”:环球音乐集团、索尼音乐和华纳音乐集团。在这些群体中有唱片公司,它们是管理自己的艺术家和制作人的子集,负责寻找有前途的人才/为他们提供成功所需的资源(并为唱片公司/总体群体赚钱)。在这三家公司中,索尼音乐和华纳音乐集团的母公司大部分收入来自其他渠道(索尼音乐和华纳兄弟音乐占母公司收入的比例不到 3%)。环球音乐集团(UMG)是个例外——其母公司,一家名为维旺迪的意大利媒体集团,依靠 UMG 获得其总收入的 40%(另外 60%来自一家名为“Gameloft”的游戏公司和一家名为“Canal+”的体育频道)。这意味着 UMG 的任何音乐作品都会影响维旺迪股价的 40%,这足以形成一个可交易的信号。

这在我看来更有希望,进一步的研究显示 UMG 实际上拥有以下唱片公司:

XO,Interscope 记录,Def Jam 记录,Capitol 记录,和 Republic 记录。

签约这些团体的艺术家包括威肯、阿姆、坎耶·韦斯特、酷玩乐队、Jay-Z、蕾哈娜、李尔·韦恩、想象龙、OneRepublic 和魔力红——我永远不会想到所有这些著名的艺术家都在为同一家公司创造收入!

然后,我的目标是弄清楚这些艺术家(以及其他许多 UMG 签名者)发行的畅销专辑是否创造了一个积极的信号,可以用来明智地交易维旺迪的股票。

||数据||

我需要一种方法来找到 UMG 艺术家发行的专辑之间的共同点,因为如果每张专辑都与其他专辑不同,任何价格上涨都很可能与专辑本身无关。

我决定使用专辑认证(银,金,白金等。)、首周销量、曲目数量、专辑类型(单曲、汇编等。),以及发行日期,作为可以用来寻找相似性的潜在因素。我现在可以开始尝试将这些因素整合到一个数据集中。

威望迪的股票价格
我用雅虎财经为“威望迪股份有限公司”( $VIV)提取每日收盘价。PA ,但这并不符合我的目的,因为我想衡量一张专辑在特定时间窗口内发布的效果。我选择了专辑发行后的七个交易日(因为第一周的销售额是音乐行业的一个常见指标),并计算了滚动百分比变化。

专辑发布 我刮了 Genius.com 的“专辑发布时间表”得到了最近两年(2016,2017)的专辑滴滴和各自艺人的名单。

专辑信息
使用 Spotify Web API,我搜索了我在上一步中找到的每张专辑,并能够获得每张专辑的更多信息,具体来说,我能够提取专辑中的曲目数量、专辑类型(单曲、汇编等)。),以及它们的具体发布日期。

UMG 艺术家 我还从维基百科的一篇文章中搜集了一份 UMG 艺术家的名单,并将他们与上一步的数据进行交叉引用,以获得 118 张 UMG 专辑的名单,以及他们各自的艺术家和上述因素。

我最初的计划是从美国唱片工业协会(RIAA)收集认证数据,该协会拥有每张专辑的获奖数据(如果它获奖的话)。不幸的是,我提出了太多的 HTTP 请求,并因安全原因被锁定在网站之外,所以我不得不转向。

||分析||

专辑认证数据的缺乏迫使我求助于二元问题,即专辑发行是否使 Vivendi 的股价上涨了 3%以上(这是一个任意选择的数字,似乎具有统计学意义)。这个支点意味着我没有因素去尝试和预测股价变化了多少,只有它到底有没有变化。

我通过一种算法计算了 118 张专辑的日期,用 1 的 target 值标记了对 Vivendi 有重大影响的专辑(其余的用 0)。

在这个算法的最后,我发现在过去两年的 118 张专辑中,有张 UMG 的专辑在发行后的一周内可能使威望迪的股价上涨了至少 3%。

Factor data for all 118 album releases by UMG artists (includes target values of “0” for no significant impact and “1” for significant impact)

为了建立 3%的 VIV 增量之间的依赖关系。PA 和这些专辑,标记为“1”的专辑之间需要有一些共性从上面的图表来看,很容易说这些有影响力的专辑彼此之间没有什么共同点(至少就我所能得到的因素而言)。然而,最后一张图表是最有趣的,因为它表明拥有 10-15 首曲目的专辑最有可能导致价格上涨。其他图表显示,专辑在接近年初或年底发行时表现最佳,“专辑”的表现比“单曲”或“合辑”好得多(但这也可能是因为 118 张专辑中的大多数是专辑)。

||结论||

一句话,我的小实验得出了以下结论:

在某张专辑发行一周后,Vivendi 的股票价格上可能有可交易信号的证据,但进一步的工作是必要的,以确定如何确定该信号,或者它甚至是什么

也有一些潜在的变量可能扭曲了我的实验,例如 Vivendi 其他细分市场的表现(如 Gameloft 和 Canal+)。此外,我肯定有一个有限的数据集,因为 Genius.com 在 2016 年才开始他们的专辑发布日历。

118 张专辑中的 25 张可能就足以暗示出\(VIV。帕和 UMG 的专辑发行,但这种相关性取决于 25 张专辑,标志着超过 3%的增长。如果这 25 张专辑有一些共同点,就有可能区分出哪种专辑会导致\)VIV.PA 的飙升。

不幸的是,由于我能够提取的数据有限,我无法找出对威望迪股价产生重大影响的这些专辑之间更能说明问题的共同点。因此,尽管有轻微的证据表明这种相关性可能存在,但我不能断言这种相关性有多强。

所以,就像统计学中的大多数事情一样,

这个问题的真实答案唱了一首不为人知的曲子。

||后记||

我用 R 进行了这个实验,并使用了几个包,包括“ggplot2”(数据可视化)、“rvest”(web 抓取)和“httr”(HTTP 请求)。

我邀请你进行你自己的与这个主题相关的实验,并希望听到任何发现或进展!如果你喜欢这篇文章,请给它一些掌声,请继续关注 TDS 团队和我( Abhinav Raghunathan ),了解更多数据驱动的投资理念探索!

总统言论的快速下降,还是永久的暴跌?

原文:https://towardsdatascience.com/a-quick-dip-in-presidential-rhetoric-or-a-permanent-plunge-fda7f3cc2625?source=collection_archive---------12-----------------------

超过 130,000 份总统文件抄本的语言学分析

到首先,这个项目几乎完全归功于美国总统项目在记录和归档总统文稿方面所做的大量工作。我有兴趣看看总统的语言是如何随着时间的推移而变化的,以及是否有任何有趣的模式可以提取。我非常依赖 Hadley Wickham 的 rvest 软件包从美国总统项目的 html 源代码页面中抓取并阅读文字记录。总的来说,我使用的文件记录取自 1789 年 4 月 30 日(乔治·华盛顿的第一次就职演说)到 2018 年 9 月 21 日(概况介绍——唐纳德·j·特朗普总统获得资金来照顾我们的退伍军人,重建我们的军队,并投资于我们的基础设施),尽管对于这个项目,我决定只关注相对现代的总统(艾森豪威尔到特朗普),因为从 20 世纪中叶开始,每位总统的文件/记录的数量急剧增加:

To partially control for the increase in Presidential transcripts over time, Eisenhower was taken as the cutoff. For one thing, current Presidents are simply much more well-documented than those in the past; in addition, many older Presidents don’t have much in the way of verbal addresses (e.g., Taft and Harding had a lot of Executive Orders and Proclamations, but not many actual speeches).

其他分析已经研究了就职演说和其他更正式的演讲是如何随着时间的推移而变化的。我更感兴趣的是总统们在准备不充分的情况下用词的选择,所以我决定把我的大部分分析集中在总统的讲话上,我预测总统的讲话会更少排练,更少由演讲稿撰写人团队撰写,也许会更直接地衡量每位总统的基本词汇。因此,我提取了原始语音数据的一个子集,其中每个语音都包含单词“Remarks”(例如:“选举前夕的 Remarks”、“抵达德国时的 Remarks”、“参观明尼苏达州明尼阿波利斯州际公路 35W 大桥损坏后的 Remarks”),然后通过删除会话记录(“交流”、“通话”、“问答”等)来进一步细化数据集。).我还删除了不是来自现任/未来总统的文字记录(因此没有新闻秘书、副总统或初选候选人)。这给我留下了 19433 份抄本。

为了简单、直接地测量语言内容,我计算了每组评论的弗莱斯奇-金凯等级水平。这种方法通过一个考虑了句子长度和音节数的公式得出文档的近似美国等级阅读水平(更高等级→更复杂的语音)。因为音节计数是一个相当缓慢和乏味的过程(而且绝对不是无足轻重的),我还尝试缩短一些较长的演讲。我发现,从一些较长的转录中随机抽取 50 个句子,得到的 F-K 等级与整个文档的 F-K 等级高度相关,而计算只需要很少的时间。因此,用这种抽样方法来计算每份备注的 F-K 分数。由此得出的数据提供了一个有趣的(也是相当惊人的)总统语言随时间变化的图像:

Flesch-Kincaid reading grade level for each set of Presidential “remarks” plotted by the date of the remarks and colored by President. The timeline at the top provides a key of which party the President belonged to. Harry Truman is plotted at far left, though he was not a part of later analyses.

这个图中有几件事很突出(至少对我来说)。一个是肯尼迪-尼克松辩论期间令人难以置信的言论密度(尤其是对肯尼迪而言);另一个是总统之间相对明显的变化(除了福特和卡特);还有一个原因是,至少从罗纳德·里根开始,随着任期的进行,总统言论的等级倾向于降低(并且经常在下一任期开始时“重置”)。我不确定这到底是怎么回事:随着总统任期的延长,他们会变得更加自在/随和吗?学期开始时是否更需要正式的演讲?言论是不是一开始准备得更充分,然后就变得更像总统自己的(随意的)声音?他们在为选举做准备时是否有意识地降低自己的讲话水平?我不清楚,但这仍然是一个有趣的模式。

到更深入地查看数据,为了控制一些总统在整个任期内比其他总统发表更多言论的事实,我接下来只查看了他们每个任期头 600 天的言论(这大约是特朗普执政的天数)。

(Left) The average Flesch-Kincaid reading grade level for all “remarks” made by each President in the first 600 days of each term. (Right) All individual remarks made by Donald Trump are plotted in black, along with his running average (orange) and the running averages of the previous four Presidents (colored by party and weighted by relative recency in office).

随着时间的推移,弗莱什-金凯对总统言论的阅读水平明显下降,尽管这一趋势似乎对共和党总统比对民主党总统更为明显(在过去的四任总统中,民主党总统基本上保持了 10-11 年级的水平)。JFK 的阅读难度最高,紧随其后的是理查德·尼克松,这符合认为他们是博览群书的“知识分子”的观点。我还发现有趣的是,奥巴马在第一任期和第二任期之间的成绩变化最大,在第二任期内,他讲话的冗长程度明显下降。

更仔细地观察最近几任总统,我们也可以看到,特朗普没有任何迹象表明他回到了前任的水平;如果有什么不同的话,随着他任期的延长,他可能会更加偏离到一个更低的 F-K 等级水平。在执政的头 600 天里,他的言论从大约 8 级水平上升到大约 7 级水平,而前四任总统都很稳定。此外,通过绘制单个评论点,我认为很明显,这个滚动平均值并不是对潜在语言内容的不公平估计。看了几个例子后,我有自己的理论来解释为什么这个指标可能会下降:

The first 50 sentences of one set of remarks from Donald Trump, about four months into his term.

首先,特朗普总统倾向于重复自己,多次以略有不同的措辞重申同一想法。我在上面的文本中对这些分组进行了颜色编码,以突出它们,这不仅是基于相同单词的直接重复,也是基于相同想法的重复。偶尔,他似乎会偏离主题,如方框中所述,他从谈论帮助创建医疗改革立法的一群人转向谈论……他自己,以及他成为总统是多么令人惊讶。这种即兴创作也明显不同于演讲中更直接的部分,因为句子更短,单词更单音节(这有助于解释 Flesch-Kincaid 评分较低的原因)。当然,这只是一份示例记录,但我认为它提供了一些关于特朗普的言论与前几任总统的言论有何显著不同的见解。

为了获得每位总统的全部言论,我接下来计算了每位总统言论中使用的所有词语的 tf-idf 得分(使用 tidytext 包)。这提供了一个衡量每位总统比其他总统使用频率更高的词汇的方法,同时控制了所有总统使用词汇的总体频率。

特朗普被 tf-idf 顶上的三个字都是针对他的政治“敌人”:希拉里·克林顿和巴拉克·奥巴马,这相当不寻常。另外一位在前三名中提到政治对手的总统是 JFK,他的言论主要倾向于他上任前与尼克松的辩论(乔治·布什和吉米·卡特不在此列,对手分别排在第五和第四位最常用词)。值得注意的是,特朗普是自吉米·卡特以来唯一一位妻子的名字不在前 15 个单词中的总统;取而代之的是他女儿的名字伊万卡(考虑到正在进行的评论 对 他们的 关系,这真的对情况没有帮助)。同样值得注意的是:奥巴马显然大量使用了“人们”这个词;你可以清楚地看到 911 对乔治·w·布什言论的影响,他的大部分热门词汇都与中东和恐怖主义有关;里根的热门词汇中大约有一半是与金钱或经济相关的,比其他任何一位总统都多。我还对二元和三元语法(分别是两个和三个单词的序列)进行了同样的 tf-idf 量化。

从这些分析中还可以发现其他一些有趣的方面(至少对我来说)。首先,特朗普反复使用三个词的短语的可能性比他使用一个或两个词的短语的可能性小得多,这与之前发现的较低等级/较短的句子相吻合。总的来说,这些二元词和三元词提供了一个很好的窗口,让我们了解每位总统认为最重要的问题;我想象一下,如果大多数人只是简单地看到一组没有名字标签的这些克,那么说出它们来自哪个总统就相当容易了(尤其是特朗普的“假新闻”)。有一些证据表明,宗教,或者至少是基督教,在从里根开始的保守派总统中变得越来越重要(“上帝保佑”,“基于信仰的项目”)。在乔治 H.W 布什时代,医疗保健似乎已经成为最重要的问题,此后历届总统都不断提到它(“医疗保健”、“医疗保险改革”、“平价医疗”)。LBJ 对 JFK 遗产的依赖是非常突出的,JFK 在所有单词集中反复出现。然而,最让我惊讶的是,艾森豪威尔如何看起来比他的共和党继任者有更多的全球主义目标(“红十字会”、“新兴发展中国家”、“自由世界”、“和平”)。

总结——我认为,在总统言论相对一致的专业水平中,特朗普是否真的是一个暂时的异类,或者他是否只是延续了前任(共和党)总统的趋势,这种结论是不准确的。演讲能力对选民来说已经不重要了吗?现代共和党选民会更喜欢孤立主义、民族主义的特朗普,而不是更为全球乐观的艾森豪威尔吗?我更倾向于这样一种观点,即尽管特朗普落在了规范之外,但他只是继续朝着规范在过去几十年中一直在变化的同一方向前进。即便如此,也很有可能总统们只是越来越多地试图给选民们他们想听的东西。为此,如果选民决定他们更喜欢发表更有思想、更鼓舞人心的演讲的政治家,他们有能力改变这一点。

Power BI 中的地理信息快速指南

原文:https://towardsdatascience.com/a-quick-guide-to-geojsons-in-power-bi-f4736e76aa9d?source=collection_archive---------0-----------------------

将 GeoJSONs 转变为仪表盘

Washington, DC Crash Data Dashboard built using the Open Data DC API

任何城市都有丰富的安全数据——犯罪、交通违章、撞车等。—但是拥有数据本身并不总是等同于拥有信息。如果是的话,这个世界就不需要分析师了!

在多次收到为我们的客户执行交通安全分析的请求后,我承担了开发一个交互式工具的任务,该工具将使城市能够以一种轻松的方式探索自己的安全数据,使他们能够提取相关的安全相关信息和见解。

该工具的一个关键组成部分是能够为城市提供尽可能最新的交通事故数据,而不必在每次刷新时手动更新交通事故数据。我选择在 Power BI 中这样做,并使用 DC 的 Washington 作为该工具的原型。

首先,我需要找到我的数据。从过去的分析中,我知道 DC 的华盛顿州有一个非常令人印象深刻的开放数据设置,所以我无意中找到了那里并开始搜索。结果,他们正好有我需要的东西——一个包含所有车祸及其位置的数据集,由地区交通部维护。头奖。

接下来,获取数据。开放数据 DC 网站允许您下载 CSV、KML 和 shapefiles,但这些只是某个时间点的快照。创建这个工具的目的,在某种程度上,是为了构建一个产品,以取代我每个月左右在数据发生变化时执行相同分析的需要。幸运的是,DC 开放数据有一个 API。

如果你像我一样不熟悉 API 的整个世界,Petr Gaza ROV 的这篇文章非常容易理解,信息量也很大。

访问他们的 API 很简单,但是弄清楚如何在 Power BI 中利用这些数据对我来说是一次学习经历。我花了几个小时探索他们提供的不同 API,他们返回的数据,并在网上做了一些研究。在我的搜索过程中,我找不到任何能真正带领我完成从查找数据到将其加载到 Power BI 数据模型(尤其是 GeoJSON 文件)的过程的东西,所以我想我应该写一篇快速的文章,一步一步地介绍它。

Screenshot of the “Crashes in DC” API drop down menu. You da real MVP, Open Data DC.

开放数据 DC API 下拉菜单提供了几个 URL,您可以在这些 URL 上获得完整的碰撞数据集,但我将在本文中使用的是 GeoJSON 格式。在讨论连接到 API 的细节之前,我将花一点时间来讨论 GeoJSON 文件。

在今天的“了解你的文件类型”节目中

JSON 文件基于 JavaScript,以文本格式存储信息,这种格式非常容易被各种类型的程序解析。GeoJSON 文件本质上是相同的东西,但是它们存储的信息对应于地理数据。由于这个特定数据集的文件相当大,让我们快速查看一下 GeoJSON 文件的一般结构,以确定一旦我们将它加载到 Power BI 中,我们将需要提取哪些元素,而不是直接打开文件本身(此代码的扩展版本可以在 GeoJSON 维基百科页面这里找到):

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [102.0, 0.5]
      },
      **"properties": {
        "prop0": "value0"
      }**
    }

看起来有两个特征:“几何”和“属性”。可以肯定的是,几何图形包含用于可视化数据集的空间信息(在这种情况下是点的坐标对,但它们也可以是线或面边界)。Properties(上面代码中的粗体文本)包含每个记录的各种属性和值(在我们的例子中,这对应于每个崩溃的不同属性)。这里值得注意的是,通过浏览网站上的碰撞数据集,我们可以看到纬度和经度的特定字段,这些字段将属于属性功能,因此我们不必从几何功能中提取它们。

连接到 Power BI 中的 API

本节要求您在计算机上安装 Power BI Desktop。 免费下载,随便玩玩!

在 Power BI Desktop 中,单击顶部功能区上的“获取数据”按钮,然后从下拉菜单中选择“Web”。这将弹出一个对话框,您可以在其中粘贴来自开放数据 DC 网站的 GeoJSON 文件的 URL。

The data set looks pretty unimpressive, but has a pretty impressively complex name

导入数据集后,我们将通过单击功能区左上角“convert”选项卡下的“Into Table”按钮将其转换为表格。

回想一下我们之前对 GeoJSON 文件结构的探索,我们期望有两个特性:几何和属性,属性包含我们想要的每次崩溃的信息。为了达到这些目的,我们将执行以下步骤:

  • 将“名称”列向下筛选为“功能”
  • 通过单击“值”列标题右上角的两个箭头,枚举所有单独的崩溃记录,并选择“扩展到新行”
  • 再次单击“值”下拉菜单,选择“属性”功能

现在,您将得到如下所示的内容:

Tabular data set from the GeoJSON data source

我们快到了。我们已经使用过几次“价值”下拉菜单,但是…

再次单击“Value”列(现在名为 Value.properties)的下拉菜单后,美妙的事情发生了——我们找到了崩溃的属性。您可以选择保留哪些列或保留所有列,但是为了您自己的健康,请取消选择“使用原始列名作为前缀”框(否则数据集中的每一列都将以“Values.properties”开头)。

This is what your data should now look like. Nailed it.

您可能需要进行一些后续的列转换(日期字段转换,可以在下面的建议部分找到,或者将数值字段转换为实际的数字而不是文本),但是此时数据已经可以使用了!下面是我将 GeoJSON 文件中包含的一些最基本的数据放在一起的快速仪表板:

Crash dashboard (crashboard?) that is built on data pulled directly from the Open Data DC API

使用数据集的建议

  • 我建议创建一个转换后的“报告日期”列。GeoJSON 的报告日期格式如下:“YYYY-MM-DDTHH:MM:SS.000Z”。您可以通过使用以下代码在超级查询编辑器中添加自定义列来进行转换:
DateTime.FromText(Text.Start( [REPORTDATE], 19))
  • 将近 20 万起撞车事故映射为单独的点是非常没有意义的(没有双关语的意思),因为它可能会覆盖整个地区。此外,我使用的地图可视化工具(ArcGIS Maps for Power BI)只能绘制有限数量的点。由于这个原因,我建议只过滤相关日期的视觉效果,并使用热图作为地图主题。
  • 如果您想要发布包含这些数据的仪表板,不要忘记通过网关设置计划的刷新,以保持它是最新的!

就是这样!我们已经成功连接到一个 API,并将提供的 GeoJSON 文件转换为可用的 Power BI 数据集,该数据集可以定期刷新,无需在源更新时手动替换数据。

面向机器学习者的衍生品快速入门

原文:https://towardsdatascience.com/a-quick-introduction-to-derivatives-for-machine-learning-people-3cd913c5cf33?source=collection_archive---------11-----------------------

简介

如果你和我一样,你可能在生活中的很大一部分时间里都在使用衍生品,并学到了一些关于它们如何运作和表现的规则,但并没有真正理解它们的来源。作为孩子,我们很早就学习了一些规则,例如幂法则,我们知道 x 的导数是 2x ,它以更一般的形式变成了 dxᵃ/dx=axᵃ⁻ 。这在原则上是没问题的,因为所有的规则都可以很容易地记忆并在表格中查找。这样做的坏处当然是,你在使用一个你根本不理解的系统和形式主义。同样,如果你不是每天都在开发机器学习框架,这不一定是个问题,但是知道幕后发生了什么真的很好。我本人鄙视黑盒◼.为了更深入地研究这个问题,我将向你们展示它的基础。为了做到这一点,我们必须定义一个导数应该为你做什么。你知道吗?我相信你有,但万一你没有;

导数是对函数如何随着一个或多个变量的微小变化而变化的连续描述。

我们将从多方面来研究这一声明。例如

  • 小是什么意思?
  • 改变意味着什么?
  • 为什么是连续的?
  • 这有什么用?

我们开始吧!

全微分和偏导数

这些术语通常是许多人混淆的来源,因为它们有时被视为等同物,并且在许多情况下,它们似乎彼此无法区分。然而他们不是!让我们从定义偏导数开始,然后从这里继续到全导数。为此,我将使用一个虚函数 f(t,x,y) ,其中我们有三个变量 txy 。偏导数回答了一个变量小幅度变化(∂ x )时 f 如何变化(∂ f )的问题。在此设置中,所有其他变量都被假定为常量和静态变量。因此偏导数记为∂ f /∂ x 。为了展示当我们做这个操作时会发生什么,我们需要首先定义 f 为某物。假设它看起来像这个 f(t,x,y)=txy 4π/3顺便说一下,这是一个椭球体的体积。嗯,也许不是那么偶然..无论哪种方式,我都选择了不同于通常使用的参数化。在下图中,你可以从上到下从左到右分别看到一个球体、一个椭球体和一个椭球体。在我们的设置中,我们可以选择 t=a,x=b,y=c 作为尺寸。

By Ag2gaeh — Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45585493

这些几何空间的体积的偏导数就变成了∂f/∂x= 4π3ty这里我们应用了幂律。如您所见,tt和 yy没有被触及,因为我们假设它们是固定的。因此,在上图中,我们模拟了当 b 少量延伸或缩短时,体积会发生什么。这回答了我们的问题,如果他们真的独立于 x 。但是如果他们不是呢?在这种情况下,我们需要 f 相对于 x 的总导数,用 df/dx 表示,定义如下

你可以看到偏导数是总导数的一部分。为了便于说明,让我们将函数限制在 t=x 的情况下。那么导数会发生什么呢?之前的偏导数保持不变。但是我们需要计算的另外两项。第一部分变成(∂f/∂t) (dt/dx)=4π/3 ⋅ xy ⋅ 1,而最后一部分变成

因此现在我们得到了

通过在最后一步中添加术语并替换 t=x 。现在希望很明显,∂f/∂x≠df/dx 和你需要小心,在你做导数的时候,在你的变量之间陈述独立性之前。

等等!我听到你哭了,我们能不能在计算完偏导数后直接代入?事实上,你可以,你会得到一个相差 2 倍的东西,这可能是很大的。基本上你会得到以下的疯狂

这是因为我们通常追求的是全导数,而不是偏导数。然而,你当然可以在计算偏导数之前进行代入运算。这看起来会很好

我们再次达成一致。因此,在计算完之后,你不能在偏导数中插入依赖项!

作为差异的解释

让我们暂时回到全导数的定义上来。记得它看起来像这样

对于一个三变量函数 f(t,x,y) 。现在,如果我们把这个乘以 dx,我们会得到

它是函数 f 的微分视图的表达式。它指出, f 中非常小的变化可以定义为变量中小变化的加权和,其中权重是函数相对于相同变量的偏导数。我们可以这样概括一个函数 qM 变量

这是一种更简洁、更好的方式来看待它。快速明确地写出术语变得很乏味。另一方面,我们也得到一种简洁的方式来表示我们的全微分定义。再次坚持函数 q 和它的 M 变量。

δᵢₚ在任何地方都被定义为 1 ,除了在 i=p 的情况下,我们将其定义为 0 。我知道这不是很传统,但它是有效的,所以我将以这种方式使用 delta 函数。我这样做是因为

虽然是正确的,但并没有把重点放在,感兴趣的变量 xₚ的偏导数上,但这实际上是一个品味问题,对用法来说一点也不重要。

微积分的链式法则

在计算解析导数时,最常用的规则之一可能是链式法则。从数学上讲,它基本上表述如下

这看起来并不令人印象深刻,但不要让它的简单性欺骗了你。在梯度分析领域,它是无与伦比的主力。记住, g(x) 在这个设置中可以是任何东西。就此而言, x 也可以。因此,这条规则适用于与梯度有关的一切。

概率的链式法则

这里有一个关于命名的小注意事项。“链式法则”实际上也以“概率链式法则”或“一般乘积法则”的名义存在于概率中。我觉得后者更自然。无论如何,该规则规定如下

其中 p 是事件 xy 的概率函数。这个规则可以通过迭代这个规则进一步推广到 n 个变量。请参见以下示例:

你可能会被原谅,因为你认为在应用这个规则时,变量的顺序有点重要,但当然这并不重要,因为我们所做的只是将概率空间分割成更小的独立小块。因此,在一个更紧凑的格式中,我们可以这样表达这个一般规则

这里我们用了 n 个一般变量来表示我们的概率分布。现在谈谈我提出这个问题的原因。

概率的链式法则与微积分的链式法则无关。

所以记住,如果你听到有人说出“链式法则”时,一定要想到上下文,因为没有上下文,它是很模糊的。

为深度神经网络构建您自己的反向传播引擎

在这一节,我将带你通过一个简单的多层感知器和反向传播算法的衍生物。有许多方法可以得出这一点,但我将从误差最小化方法开始,该方法基本上描述了神经网络 f( x θ)与已知目标 y 的偏差的拟合。我们要解决的架构如下图所示,我们有两个隐藏层。为了简单起见,我们坚持这样做。我们也将只使用一个输出,而不是多个,但它很容易推广。

Illustration of a simple feed forward neural network with two layers.

我们不是用图形来表示我们的网络,而是用一种更正式的方式来表示,在这里,函数形式将以数学的方式来表述。基本上函数形式将是

其中粗体符号表示向量。φ(s)= 1/(1+exp(-a s))函数是带有超参数 a 的 sigmoid 激活函数,我们在本介绍中不会对其进行调整或关心。这里有一个小注意,忽略这里的参数是非常愚蠢的,因为它将从根本上改变这个网络的学习。我允许自己这么做的唯一原因是,这已经超出了本文的讨论范围。

为了训练神经网络,我们需要根据参数对我们看到的误差的影响程度来更新参数。对于数据点( x ₜ,yₜ).)的类似回归的问题,该误差可以这样定义

如果我们看倒数第二层,那么我们简单地根据下面的规则更新参数

对于每个新的数据点。这叫随机梯度下降( SGD )。你可以在很多地方读到这方面的很多内容,所以我在这里就不赘述了。只要说这个过程可以对每层中的每个参数重复就够了。因此,臭名昭著的反向传播算法只是一个应用,通过误差对参数的偏导数来更新参数。现在自己做偏导数,看看你能有多容易推导出来。你可以使用的一个小技巧是认识到 φ '(s)=φ(s)(1-φ(s)) 这里我使用了导数的素数符号。这里有一个很好的关于如何在数字上做这件事的教程。

带回家的信息

  • 全导数和偏导数是相关的,但有时根本不同。
  • 所有约束和变量替换必须在计算偏导数之前完成。
  • 偏导数忽略了隐含的依赖性。
  • 总导数考虑了所有的相关性。
  • 许多神奇的配方,像反向传播算法,通常来自于非常简单的想法,自己动手做确实是有指导意义和有用的。

最初发表于doktormike . github . io

神经算术逻辑单元快速介绍

原文:https://towardsdatascience.com/a-quick-introduction-to-neural-arithmetic-logic-units-288da7e259d7?source=collection_archive---------14-----------------------

(Credit: aitoff)

经典的神经网络非常灵活,但是它们不太适合某些任务。特别是一些算术运算,对神经网络来说是个挑战。这就是为什么 Trask 等人在他们的论文神经算术逻辑单元中介绍了两个新模块,这两个模块旨在很好地执行某些算术任务。在这篇博文中,我将描述本文旨在解决的问题,提出的解决方案,并讨论使用 PyTorch 的实现细节和结果再现。

所以你想学习恒等函数?

对于神经网络来说,这听起来是一个足够简单的任务,对吗?如果我们的测试集和我们的训练集在同一个范围内,那就是这样。然而,一旦我们的测试数据超出训练范围,大多数神经网络就会失败。这个失败揭示了一个令人不安的事实:理论上,多层感知器能够表示任何连续的函数,但架构、训练数据和学习时间表的选择将严重偏离 MLP 最终学习的函数。Trask 等人用下图有效地说明了这一失败:

Failure of MLPs to learn the identity function. (Credit: Trask et al)

为了克服这些限制,该论文建议使用两个新模块:神经累加器(NAC)和神经算术逻辑单元(NALU)。让我们看看它们是什么,以及它们背后的数学原理。

南汽和 NALU

先说 NAC:

NAC (Credit: Trask et al)

正如我们在上面看到的,NAC 类似于线性变换,但我们使用的权重矩阵是两个学习矩阵的结果,我们在将它们按元素相乘之前对其应用了tanhsigmoid:

为什么要这么麻烦?这如何帮助我们的网络正确地学习算术函数?让我们来看看下图:

tanh(x) * sigmoid(y)

我们可以看到权重向量的值偏向 0、1 和-1。这意味着 NAC 的输出是输入向量的加法和减法,而不是缩放。这允许 NAC 无限地堆叠在一起,并且仍然保持输入表示的一致缩放。这对于学习处理加减的算术运算显然是有帮助的,但对于乘除就不行了。

这就是 NALU 的用武之地:

NALU (Credit: Trask et al)

NALU 使用 NAC 作为子单元,并增加两个额外的信息流。第一个使用 NAC 在对数空间中操作,第二个用作学习门,计算标准 NAC 和对数空间 NAC 之间的加权和。这在理论上应该允许 NALU 学习诸如乘法和除法以及加法和减法之类的功能。

闲聊够了,让我们看看代码!

NAC 和 NALU 的实现相当简单。你可以看看 GitHub 回购,但我会在这里回顾重要的部分。首先,我们将从 NAC 开始:

class NAC(Module):    
  def __init__(self, n_in, n_out):
    super().__init__()
    self.W_hat = Parameter(torch.Tensor(n_out, n_in))
    self.M_hat = Parameter(torch.Tensor(n_out, n_in))
    self.reset_parameters() def reset_parameters(self):
    init.kaiming_uniform_(self.W_hat)         
    init.kaiming_uniform_(self.M_hat) def forward(self, input):
    weights = torch.tanh(self.W_hat) * torch.sigmoid(self.M_hat)
    return F.linear(input, weights)

代码应该是不言自明的。我们首先对 PyTorch 的Module进行子类化。在初始化步骤中,我们将两个学习到的矩阵W_hatM_hat定义为Parameters,并使用初始化对它们进行初始化。在向前的步骤中,在我们将W_hatM_hat相乘之前,我们通过tanhsigmoid传递它们。然后,我们获取生成的矩阵,并使用它和单元的输入执行线性变换。这就是你拥有的:一个全功能的 NAC 模块!

在我们转向 NALU 实现之前,重要的是要强调这样一个事实,即在上面的代码中只有两个学习过的矩阵。被传递到线性变换中的矩阵没有被训练,只是实际学习的矩阵W_hatM_hat的数学运算的结果。当 NALU 的论文第一次出现时,许多 PyTorch 实现将最终重量作为参数,这将它们的 NAC 变成简单的线性层。这些我称之为 FauxNALUs ,成为一项意外消融研究,我将在下一节讨论它们的意义。

在我们到达那里之前,我们仍然需要看一看 NALU 的实现:

class NALU(Module):    
  def __init__(self, n_in, n_out):
    super().__init__()        
    self.NAC = NAC(n_in, n_out)        
    self.G = Parameter(torch.Tensor(1, n_in))        
    self.eps = 1e-6        
    self.reset_parameters()          def reset_parameters(self):        
    init.kaiming_uniform_(self.G)          def forward(self, input):        
    g = torch.sigmoid(F.linear(input, self.G))        
    y1 = g * self.NAC(input)        
    y2 = (1 - g) * 
         torch.exp(self.NAC(torch.log(torch.abs(input) + self.eps)))
    return y1 + y2

我们首先定义 NAC 和学习门矩阵,并初始化它们。在前面的步骤中,我们首先通过对输入和门矩阵进行线性变换来计算门值G。然后,我们计算标准 NAC 输出和对数空间 NAC 输出,然后返回它们的加权和。值得注意的是,在计算 log-space NAC 时,我们需要向log函数传递一个小的 epsilon 值,以避免任何未定义的行为。

数学课时间到了

现在我们知道了 NALUs 背后的理论以及如何在 PyTorch 中实现它们,剩下的就是实际观察它们的运行了。我们将尝试使用基于 kevinzakka 的代码的脚本来重现论文中函数学习部分的结果,我已经修改了这些脚本,在这里加入了 FauxNALU 的代码。函数学习测试的想法是,我们将提供符合特定函数(加、减、除、平方根等)的随机生成的输入数据,然后测试我们的 MLP 是否能够正确地学习算术函数:

从这些结果中可以得出以下几点:

  • NAC 在加法和减法方面表现惊人,但在乘法、除法和幂函数方面表现糟糕。这是有意义的,因为当它必须学习其他函数时,使它强大的加法(没有输入的任意缩放)的同样的东西极大地限制了它。
  • 除了减法之外,NALU 在其他方面都表现得很好。鉴于 NACFauxNALU 在减法上表现良好,这表明 log gate 和 NAC 在减法用例中以某种方式相互干扰。
  • FauxNALU 的结果最有趣。它的表现与 None MLP(仅使用线性的那种)一样好,这表明学习门本身对学习这些功能没有帮助。在学习除法和平方根方面,NALU 决定性地击败了 T21,这表明对数空间 NAC 和标准 NAC 的结合真正发挥了作用。

就这些了,伙计们!

NAC 和 NALU 当然是有趣的模块,尽管他们在我们所研究的玩具问题上表现不一。只有时间和进一步的实验才能告诉我们这些专门的模块是否会成为机器学习实践者常规工具箱的一部分。有一件事是肯定的:我们可以通过巧妙定义权重矩阵和使用门来设计具有特定偏好的模块,这一想法将继续存在,我们将看到许多其他模块利用这一点。

感谢阅读!如有任何问题或建议,欢迎留言或推文 @AlexievValeri 。

机器学习中文本摘要的快速介绍

原文:https://towardsdatascience.com/a-quick-introduction-to-text-summarization-in-machine-learning-3d27ccf18a9f?source=collection_archive---------0-----------------------

文本摘要是指缩短长文本的技术。目的是创建一个连贯流畅的摘要,只包含文档中概述的要点。

自动文本摘要是机器学习和自然语言处理中的一个常见问题。

Skyhoshi 是一位拥有 13 年经验的美国机器学习专家,目前正在向人们传授他的技能,他说:“这项技术已被证明在快速准确地总结大量文本方面至关重要,如果没有机器,这可能会非常昂贵和耗时。”

机器学习模型通常被训练来理解文档,并在输出所需的摘要文本之前提取有用的信息。

文本摘要的需求是什么?

在现代技术创新的推动下,数据对于本世纪就像石油对于上个世纪一样重要。今天,我们的世界被大量数据的收集和传播所覆盖。

事实上,国际数据公司(IDC)预计,全球每年流通的数字数据总量将从 2013 年的 4.4 兆字节增长到 2025 年的 180 兆字节。数据真多啊!

随着如此大量的数据在数字空间中流通,需要开发机器学习算法,可以自动缩短较长的文本,并提供准确的摘要,可以流畅地传递预期的信息。

此外,应用文本摘要减少了阅读时间,加快了信息搜索的过程,并增加了适合某个区域的信息量。

自动摘要的主要方法有哪些?

在 NLP 中有两种主要的文本摘要方式:

  • 基于抽取的摘要

提取文本摘要技术包括从源文档中提取关键短语,并将它们组合成一个摘要。根据定义的度量进行提取,而不对文本进行任何更改。

这里有一个例子:

来源正文: 约瑟和玛丽 骑着驴去 参加 一年一度的 大事*耶路撒冷 。在城市里, 玛丽 出生 给一个孩子取名 耶稣 *

摘录概要: 约瑟和马利亚参加耶路撒冷的活动。玛丽亚出生耶稣。

正如你在上面看到的,粗体字已经被提取出来并连接在一起形成了一个摘要——尽管有时候这个摘要在语法上很奇怪。

  • 基于抽象的摘要

抽象技术需要解释和缩短源文档的一部分。当抽象应用于深度学习问题的文本摘要时,可以克服抽取方法的语法不一致性。

抽象文本摘要算法创建新的短语和句子,从原始文本中传递最有用的信息——就像人类一样。

因此,抽象比提取执行得更好。然而,进行摘要所需的文本摘要算法更难开发;这就是为什么提取的使用仍然流行。

这里有一个例子:

约瑟和马利亚来到耶稣诞生的耶路撒冷。

文本摘要算法是如何工作的?

通常,NLP 中的文本摘要被视为有监督的机器学习问题(基于提供的数据预测未来的结果)。

通常,使用基于抽取的方法来概括文本是如何工作的:

1.介绍一种从源文档中提取有价值的关键短语的方法。例如,您可以使用词性标记、单词序列或其他语言模式来识别关键短语。

2.收集带有肯定标记的关键短语的文本文档。关键短语应该与规定的提取技术兼容。为了提高准确性,您还可以创建带有负面标签的关键短语。

3.训练二进制机器学习分类器来进行文本摘要。您可以使用的一些功能包括:

  • 关键词的长度
  • 关键短语的频率
  • 关键短语中最常出现的词
  • 关键短语中的字符数

4.最后,在测试短语中,创建所有关键短语单词和句子,并对它们进行分类。

摘要

文本摘要是一个有趣的机器学习领域,越来越受到关注。随着该领域研究的继续,我们可以期待看到突破,这将有助于流畅和准确地缩短长文本文档。

你对这个激动人心的领域有什么想法?

请在下面分享你的评论。

NumPy 库快速介绍

原文:https://towardsdatascience.com/a-quick-introduction-to-the-numpy-library-6f61b7dee4db?source=collection_archive---------0-----------------------

在我的上一篇关于熊猫的博客文章之后,我想退一步写一篇关于 T2 熊猫图书馆的文章可能是个好主意。NumPy(Numerical Python 的缩写)是“用 Python 进行科学计算的基础包”,它是 Pandas、Matplotlib 和 Scikit-learn 构建的库。您可能会想“当我可以使用这些库时,使用 NumPy 有什么意义呢?”但是我认为 NumPy 经常被低估,如果使用得当,它可以成为 Python 中数值运算的一个非常强大的工具。

安装和入门

默认情况下,NumPy 没有附带 Python,所以需要安装它。正如我为熊猫安装所推荐的,获得 NumPy(以及大量其他软件包)的最简单方法是安装 Anaconda 。如果你不想安装所有这些软件包而只是安装 NumPy,你可以从这个页面下载你的操作系统版本。

下载并安装 NumPy 后,每当您想在 Python IDE ( 集成开发环境)中使用它时,如 Jupyter Notebook 或 Spyder (默认情况下,它们都附带了 Anaconda),您都需要导入它。提醒一下,导入一个库意味着把它加载到内存中,然后你就可以使用它了。要导入 NumPy,您需要编写以下代码:

import numpy as np

你已经准备好了!通常你会添加第二部分(“作为 np”),这样你就可以通过写“np.command”来使用 NumPy,而不是每次你想使用它时都必须写“numpy.command”。这不是一个巨大的差异,但嘿,每一个关键的中风计数!请记住,每当你开始一个新的 Jupyter 笔记本,Spyder 文件等,你需要这样做。

使用 NumPy

创建 NumPy 数组,加载和保存文件

NumPy 使用称为多维数组的 Python 对象。数组基本上是值的集合,它们有一个或多个维度。NumPy 数组数据结构也叫 ndarray ,是 n 维数组的简称。一维数组称为向量,二维数组称为矩阵。数据集通常以矩阵的形式构建,例如,用 NumPy 打开比用列表的列表打开要容易得多。

将列表转换成 NumPy 数组非常简单:

numpy_array = np.array(list)

打印/显示该数组将如下所示:

array([[  7.4  ,   0.7  ,   0\.   , ...,   0.56 ,   9.4  ,   5\.   ],
       [  7.8  ,   0.88 ,   0\.   , ...,   0.68 ,   9.8  ,   5\.   ],
       [  7.8  ,   0.76 ,   0.04 , ...,   0.65 ,   9.8  ,   5\.   ],
       ..., 
       [  6.3  ,   0.51 ,   0.13 , ...,   0.75 ,  11\.   ,   6\.   ],
       [  5.9  ,   0.645,   0.12 , ...,   0.71 ,  10.2  ,   5\.   ],
       [  6\.   ,   0.31 ,   0.47 , ...,   0.66 ,  11\.   ,   6\.   ]])

另一个选项是使用 np.genfromtxt() 函数打开一个 CSV 文件:

numpy_array **=** np**.**genfromtxt("file.csv", delimiter**=**";", skip_header**=**1)

括号内的参数是文件名(和路径,如果需要的话),分隔符设置为“;”为了确保正确解析,可以使用不同的字符进行解析(比如',');而 skip_header 设置为‘1’将使 csv 加载到没有标题行的数组中。如果您确实需要标题,可以不包含它(因为缺省值是零)。

还可以使用 np.savetxt()将 NumPy 数组保存到文件中。例如,np.savetxt('file.txt',arr,delimiter=' ')将保存到文本文件,而np.savetxt('file.csv',arr,delimiter=',')将保存到 CSV 文件。

另一个很酷的特性是能够创建不同的数组,比如随机数组:np.random.rand(3,4)将创建一个 0 到 1 之间的 3x4 随机数数组,而np.random.rand(7,6)*100将创建一个 0 到 100 之间的 7x6 随机数数组;你也可以用不同的方式定义数组的大小:np.random.randint(10,size=(3,2))用 0 到 9 之间的随机数创建一个 3x2 大小的数组。请记住,使用此语法时,最后一位数字(10)不包括在范围内。

也可以创建一个全 0 的数组:np.zeros(4,3)(全 0 的 4x3 数组)或 1np.ones((4))(1 的 4x1 数组);您可以使用命令np.full((3,2),8)创建一个由 8 个元素组成的 3x2 数组。当然,你可以改变每一个数字来得到你想要的数组。

工作和检查阵列

现在您已经加载了数组,您可以通过键入array.size来检查它的大小(元素的数量),并通过键入array.shape来检查它的形状(尺寸——行和列)。您可以使用array.dtype来获取数组的数据类型(浮点、整数等——参见 NumPy 文档),如果您需要转换数据类型,您可以使用array.astype(dtype)命令。如果您需要将 NumPy 数组转换成 Python 列表,也有一个命令可以完成这个任务:array.tolist()

索引和切片

索引和分割 NumPy 数组的工作方式与处理 Python 列表非常相似:array[5]将返回第 5 个索引中的元素,array[2,5]将返回索引[2][5]中的元素。您也可以选择前五个元素,例如,使用冒号(😃。array[0:5]将返回前五个元素(索引 0–4),而array[0:5,4]将返回第 4 列中的前五个元素。您可以使用array[:2]来获取从开始到索引 2(不包括索引 2)的元素,或者使用array[2:]从第二个索引返回到数组的末尾。array[:,1]将返回所有行中索引 1 处的元素。

给 NumPy 数组赋值也非常类似于在 Python 列表中这样做:array[1]=4将值 4 赋给索引 1 上的元素;您可以对多个值执行此操作:array[1,5]=10或者在赋值时使用切片:array[:,10]=10会将整个第 11 列更改为值 10。

分类和整形

array.sort()可用于对 NumPy 数组进行排序——您可以在括号内传递不同的参数来定义您想要排序的内容(例如,通过使用参数“order = string/list of string”)。参见文档中的更多示例。array.sort(axis=0)将对数组的特定轴——行或列进行排序。two_d_arr.flatten()将二维数组展平为一维数组。array.T将转置一个数组——意味着列将变成行,反之亦然。array.reshape(x,y)会将您的数组重新调整为您用 x 和 y 设置的大小。array.resize((x,y))会将数组形状更改为 x 和 y,并用零填充新值。

组合和拆分

您可以使用np.concatenate((array1,array2),axis=0)来组合两个 NumPy 数组——这将把数组 2 作为行添加到数组 1 的末尾,而np.concatenate((array1,array2),axis=1)将把数组 2 作为列添加到数组 1 的末尾。np.split(array,2)会将数组拆分成两个子数组,而np.hsplit(array,5)会在第 5 个索引处水平拆分数组。

添加和删除元素

当然,有一些命令可以在 NumPy 数组中添加和删除元素:

  • np.append(array,values)将值追加到数组末尾。
  • np.insert(array, 3, values)将在索引 3 之前将值插入数组
  • np.delete(array, 4, axis=0)将删除数组索引 4 上的行
  • np.delete(array, 5, axis=1)将删除数组索引 5 上的列

描述统计学

您可以使用 NumPy 方法获取 NumPy 数组的描述性统计信息:

  • np.mean(array,axis=0)将返回沿特定轴的平均值(0 或 1)
  • array.sum()将返回数组的总和
  • array.min()将返回数组的最小值
  • array.max(axis=0)将返回特定轴的最大值
  • np.var(array)将返回数组的方差
  • np.std(array,axis=1)将返回特定轴的标准偏差
  • array.corrcoef()将返回数组的相关系数
  • numpy.median(array)将返回数组元素的中值

和 NumPy 一起做数学

如果没有数字和数学运算,任何 NumPy 教程都是不完整的!让我们复习一下:

np.add(array ,1)将把数组中的每个元素加 1,np.add(array1,array2)将把数组 2 加到数组 1。对于np.subtract(), np.multiply(), np.divide() and np.power()也是如此——所有这些命令都将以与上述完全相同的方式工作。

您还可以让 NumPy 从数组中返回不同的值,比如:

  • np.sqrt(array)将返回数组中每个元素的平方根
  • np.sin(array)将返回数组中每个元素的正弦值
  • np.log(array)将返回数组中每个元素的自然对数
  • np.abs(arr)将返回数组中每个元素的绝对值
  • 如果数组具有相同的元素和形状,np.array_equal(arr1,arr2)将返回True

可以对数组中的不同值进行舍入:np.ceil(array)将向上舍入到最接近的整数,np.floor(array)将向下舍入到最接近的整数,np.round(array)将向下舍入到最接近的整数。

这只是你能用 NumPy 做什么的冰山一角!我真的希望这篇博客文章能帮助你看到使用 Python 处理数据的可能性和 NumPy 的强大之处。如果你喜欢这个教程,请随意查看我的熊猫教程(无耻地推销自己:-P)。一如既往的感谢您的阅读!我很感激任何评论、笔记、更正、问题或建议——如果你有什么想让我写的,请不要犹豫让我知道。下一篇博文再见!

“熊猫”Python 库快速介绍

原文:https://towardsdatascience.com/a-quick-introduction-to-the-pandas-python-library-f1b678f34673?source=collection_archive---------0-----------------------

Pandas are cute, but it’s a different kind of panda 😃

一些背景

大家好!今天我想写关于熊猫图书馆(链接到网站)。Pandas 代表“Python 数据分析库”。根据维基百科关于熊猫的页面,“这个名字来源于术语“面板数据”,计量经济学术语多维结构化数据集。”但我觉得这只是一个超级有用的 Python 库的可爱名字!

当谈到用 Python 分析数据时,Pandas 是一个相当大的游戏改变者,它是数据管理/争论中最受欢迎和广泛使用的工具之一。Pandas 是开源的,可以免费使用(在 BSD 许可下),它最初是由 Wes McKinney 编写的(这里有他的 GitHub 页面的链接)。

Pandas 的酷之处在于它获取数据(如 CSV 或 TSV 文件,或 SQL 数据库)并创建一个包含行和列的 Python 对象,称为数据框,它看起来非常类似于统计软件中的表格(例如 Excel 或 SPSS)。熟悉 R 的人也会看到 R 的相似之处)。与通过 for 循环或列表理解来使用列表和/或字典相比,这要容易得多(请随意查看我以前的一篇关于使用 Python 进行非常基本的数据分析的博客文章。用熊猫做我在那里做的事情会容易得多!).

安装和入门

为了“得到”熊猫,你需要安装它。您还需要 Python 3.5.3 及更高版本。作为安装的先决条件(将与 Python 3.6、3.7 或 3.8 一起工作),它还依赖于其他库(如 NumPy )并具有可选的依赖项(如用于绘图的 Matplotlib)。因此,我认为安装 Pandas 最简单的方法是通过一个包来安装它,比如 Anaconda 发行版,“一个用于数据分析和科学计算的跨平台发行版”你可以在那里下载 Windows、OS X 和 Linux 版本。如果您想以不同的方式安装,这些是的完整安装说明。

为了在您的 Python IDE ( 集成开发环境)中使用 Pandas,如 Jupyter Notebook 或 Spyder (两者都默认带有 Anaconda),您需要首先导入Pandas 库。导入一个库意味着把它加载到内存中,然后你就可以使用它了。为了导入 Pandas,您只需运行以下代码:

import pandas as pd 
import numpy as np 

通常你会添加第二部分(' as pd '),这样你就可以用' pd.command '来访问 Pandas,而不是每次需要使用它的时候都要写' pandas.command '。此外,您也可以导入 numpy,因为它对于使用 Python 进行科学计算是非常有用的库。现在熊猫可以使用了!请记住,您需要在每次启动新的 Jupyter 笔记本、Spyder 文件等时执行此操作。

和熊猫一起工作

用 Pandas 加载和保存数据

当您想要使用 Pandas 进行数据分析时,您通常会以三种不同的方式使用它:

  • 将 Python 的列表、字典或 Numpy 数组转换为 Pandas 数据框
  • 使用熊猫打开一个本地文件,通常是一个 CSV 文件,但也可以是一个分隔文本文件(如 TSV),Excel 等
  • 通过 URL 打开网站上的远程文件或数据库,如 CSV 或 JSONon,或者从 SQL 表/数据库中读取

每个选项都有不同的命令,但是当您打开一个文件时,它们看起来像这样:

pd.read_filetype()

正如我之前提到的,熊猫可以处理不同的文件类型,所以你可以用实际的文件类型(比如 CSV)替换“文件类型”。你应该在括号内给出路径、文件名等。在括号内,您还可以传递与如何打开文件相关的不同参数。有许多参数,为了了解它们,您必须阅读文档(例如,pd.read_csv() 的文档将包含您可以在这个 Pandas 命令中传递的所有参数)。

为了转换某个 Python 对象(字典、列表等),基本命令是:

pd.DataFrame()

在括号内,您可以指定创建数据框的对象。该命令也有不同的参数(可点击链接)。

您还可以将正在处理的数据框保存到不同类型的文件中(如 CSV、Excel、JSON 和 SQL 表)。一般的代码是:

df.to_filetype(filename)

查看和检查数据

现在您已经加载了数据,是时候看一看了。数据框看起来怎么样?运行数据框的名称会得到整个表,但是您也可以用df.head(n)得到前 n 行,或者用df.tail(n)得到后 n 行。df.shape会给你行数和列数。df.info()会给你索引、数据类型和内存信息。命令s.value_counts(dropna=False)将允许您查看一个系列(比如一列或几列)的唯一值和计数。一个非常有用的命令是df.describe(),它输入数字列的汇总统计数据。也可以获得整个数据帧或一系列(一列等)的统计数据:

  • df.mean()返回所有列的平均值
  • df.corr()返回数据帧中各列之间的相关性
  • df.count()返回每个数据框列中非空值的数量
  • df.max()返回每列中的最大值
  • df.min()返回每列中的最小值
  • df.median()返回每列的中值
  • df.std()返回每列的标准偏差

数据选择

与从列表或字典中选择值相比,在 Pandas 中选择您想要的数据要容易得多。您可以选择一列(df[col])并将带有标签 col 的列作为系列返回,或者选择几列(df[[col1, col2]])并将列作为新的 DataFrame 返回。您可以按位置(s.iloc[0])或按索引(s.loc['index_one'])进行选择。为了选择第一行,可以使用df.iloc[0,:],为了选择第一列的第一个元素,可以运行df.iloc[0,0]。这些也可以用在不同的组合中,所以我希望它能给你一个不同的选择和索引的概念。

筛选、排序和分组依据

您可以使用不同的条件来筛选列。例如,df[df[year] > 1984]将只给出大于 1984 年的列。您可以使用& (and)或| (or)向您的过滤添加不同的条件。这也被称为布尔过滤

可以使用df.sort_values(col1)对某一列中的值进行升序排序;并且还使用df.sort_values(col2,ascending=False)以降序排列。此外,可以使用df.sort_values([col1,col2],ascending=[True,False])按升序对值进行排序,然后按降序对值进行排序。

本节中的最后一个命令是 groupby。它包括根据某些标准将数据分组,独立地对每个组应用一个函数,并将结果组合成一个数据结构。df.groupby(col) 返回一列值的 groupby 对象,而df.groupby([col1,col2]) 返回多列值的 groupby 对象。

数据清理

数据清洗是数据分析中非常重要的一步。例如,我们总是通过运行检查空值的pd.isnull()来检查数据中的缺失值,并返回一个布尔数组(缺失值的数组为,非缺失值的数组为)。为了获得空值/缺失值的总和,运行pd.isnull().sum()pd.notnull()pd.isnull()相反。在你得到缺失值的列表后,你可以去掉它们,或者通过使用df.dropna()删除行或者df.dropna(axis=1)删除列来删除它们。另一种不同的方法是用其他值填充缺失值,方法是使用df.fillna(x)用 x 填充缺失值(您可以随意放置),或者使用s.fillna(s.mean())用平均值替换所有空值(平均值可以用统计部分的几乎任何函数替换)。

有时需要用不同的值替换值。例如,s.replace(1,'one') 将用'one'替换所有等于1的值。对于多个值也可以这样做:s.replace([1,3],['one','three']) 将用'one'替换所有的 1,用'three'替换3。您还可以通过运行:df.rename(columns={'old_name': 'new_ name'})来重命名特定的列,或者使用df.set_index('column_one')来更改数据框的索引。

加入/合并

最后一组基本 Pandas 命令用于连接或组合数据帧或行/列。这三个命令是:

  • df1.append(df2) —将df1中的行添加到df2的末尾(列应该相同)
  • df.concat([df1, df2],axis=1) —将df1中的列添加到df2的末尾(行应该相同)
  • df1.join(df2,on=col1,how='inner') — SQL 样式将df1中的列与df2中的列连接起来,其中col的行具有相同的值。怎么可能等于:'left''right''outer''inner'中的一个

这些是非常基本的 Pandas 命令,但我希望您能看到 Pandas 在数据分析方面有多么强大。这篇文章只是冰山一角——毕竟,整本书都可以(并且已经)写关于熊猫的数据分析。我也希望这篇文章让你感觉像拿着一个数据集,用熊猫来摆弄它!😃

一如既往,如果你有任何意见,笔记,建议或问题,请不要犹豫给我写信!感谢阅读:)我将以一张可爱的熊猫图片和一个问题结束,大熊猫和小熊猫你更喜欢哪一个???

下次见!

附言

如果你喜欢这个教程,请查看我的NumPy快速介绍!

快速浏览 100 位顶级风险投资家的名单

原文:https://towardsdatascience.com/a-quick-look-at-the-evolving-list-of-top-100-venture-capitalists-7064a8bf559a?source=collection_archive---------4-----------------------

《福布斯》每年都会发布一份 100 位风险投资家的“迈达斯排行榜”,列出全球顶尖的科技投资者。虽然对这份名单的含义有健康的批评,但任何过分美化的衡量也可能引发问题。我将只关注数据方面,而不是含义,并试图回答这些问题:

  • 每年名单上的新进者和退出者是谁?
  • 迈达斯·李斯特的典型特征是什么?
  • 与之相关的常见风投有哪些?
  • 哪些公司是由名单上的相同投资者投资的?

进化名单

平均每年,18%的 Midas lister 将在明年退出榜单,16%将是新进者(不在去年的榜单上),其余的将留在排名榜上。

2013/2017 don’t have complete prior/next year data for comparison. Click for detailed names

显然,排名越靠后,列表就越有可能发生变化。

人口统计

基于过去 4 年的数据和相对完整的生物数据,通过按年龄、国家和性别分类,我们得到了 Midas lister 大部分是 40 岁的美国人的照片。

与 Midas listers 相关的顶级风投和投资

num of times VCs are associated with Midas listers

这些是每年 Midas 排行榜上有显著交易的投资者。

由同一个迈达斯·李斯特投资的公司

这是我关于数据科学和视觉故事的# 100 日项目的第 68 天。我去度假了几天。完整代码在我的 github 上。感谢阅读。欢迎新主题的建议和反馈。

下面是什么?机器学习的核心是优化

原文:https://towardsdatascience.com/a-quick-overview-of-optimization-models-for-machine-learning-and-statistics-38e3a7d13138?source=collection_archive---------5-----------------------

优化是数据科学中几乎所有机器学习和统计技术的核心。我们讨论最流行的机器学习/统计建模方法背后的核心优化框架。

免责声明:本文中的许多方程和优化形式化,均来源于 佐治亚理工学院在线分析硕士(OMSA) 项目学习资料。我很自豪能继续这个优秀的在线硕士项目。你也可以在这里查看详情。

介绍

通常,数据科学(DS)和机器学习(ML)的新手会被建议尽可能地学习统计学和线性代数。对于 DS/ML 领域的成功职业生涯来说,这两个学科的坚实基础的效用是毋庸置疑的。然而,优化这个话题,虽然不太出名,但对任何数据科学和分析的严肃从业者来说都同样重要。

委婉地说,如果没有很好地理解这个话题,我们对数据驱动的文化和生活的现代世界观仍然是不完整的。

这是因为优化是每一个主要商业、社会、经济的核心,我敢说--个人决策,由个人、集体代表或智能机器和软件代理做出。

日常例子

你整天都在优化变量和基于你的个人决定,大多数时候甚至没有意识到这个过程—

  • 安排回复邮件的顺序
  • 切换到回家的新路线,以尽量减少交通问题
  • 努力挤出午餐和下午会议之间的最佳间隙,在办公区周围安静地散步

听起来很熟悉?在这里阅读有趣的插图…

[## 如何使用算法解决日常问题

借鉴计算机科学,优先级队列可以用来优化去杂货店的行程。插图…

mitsloan.mit.edu](http://mitsloan.mit.edu/newsroom/articles/how-to-use-algorithms-to-solve-everyday-problems/)

每一个看似个人的决定都可以用冷酷、困难的数学精确建模,以显示我们的大脑是一个惊人的优化器,整天解决这些计算复杂的问题!

但是,离开个人领域,现在谈谈关于数据科学的问题…

优化对数据科学有多重要?

极其重要。

基础科学、商业组织和工程企业长期以来一直在使用优化技术和方法。从这个意义上来说,几乎每一个工程产品都是优化问题的解的紧凑物理(或虚拟)形式。工程师经过专门培训,能够在资源有限的情况下工作,并从不完整或有噪声的数据或输入中产生足够好的解决方案(T2)。本质上,他们每天都在用计算机、半导体集成电路、熔炉或内燃机解决优化问题。

商业组织也是如此。事实上,在时间、预算、空间以及法律和道德界限的约束下,每个商业决策的目标都是最大化某种形式的收益(例如利润率或知识产权领导地位)。这些都是某种形式的优化问题或其他。

[## 成为数据驱动或灭亡:为什么你的公司需要一个数据战略,而不只是更多的数据人

在过去的 14 年里,我一直以这样或那样的方式处理数据。我一开始是做管理信息的…

towardsdatascience.com](/become-data-driven-or-perish-why-your-company-needs-a-data-strategy-and-not-just-more-data-people-aa5d435c2f9)

今天,几乎所有的业务和技术都受到数据科学和机器学习的出现所带来的新范式变化的影响。然而,这并没有改变这样一个事实:基本的自然资源和人力资源仍然是有限的。一天还有 24 小时。法律和道德界限不会很快消失。

人工智能或机器学习的先进技术可能能够以更快的速度引导企业走向更好的最优解决方案,但他们必须面对和解决与之前相同(或更复杂)的优化问题。大量的新数据将有助于这一过程,但随着时间的推移,人们的期望值也会提高。

举一个非常简单的例子,如果在过去,一个工程团队可以访问 1 GB 的数据,并可以以 10 美元的成本产生一个最佳解决方案,那么如果给我一个“更丰富”的 10 GB 数据集,他们将会把成本降低到 7 美元。不然大数据有什么意义?

Source: Timo Elliott’s Blog (https://timoelliott.com/blog/2017/06/from-understanding-big-data-to-monetizing-it.html)

因此,对于数据科学/机器学习从业者来说,对常用统计/机器学习算法所使用的优化框架的理论基础有充分的了解是至关重要的

  • 如何有效利用数据
  • 如何估算处理大型数据集的计算量
  • 如何避免局部极小,从复杂的多维空间中搜索到好的解。

在我关于数据科学的基本数学背景的文章中,我讨论了优化的作用和一些在线课程,你可以很好地掌握这个主题。在这里阅读。

[## 数据科学的基本数学——“为什么”和“如何”

数学是科学的基础。我们讨论了成为更好的数据科学家需要掌握的基本数学主题…

towardsdatascience.com](/essential-math-for-data-science-why-and-how-e88271367fbd)

优化的基本要素

任何优化问题都有三个基本要素-

  • 变量:这些是算法可以调整的自由参数
  • 约束:这些是参数(或其组合)必须落入的边界
  • 目标函数:这是算法驱动解决方案的一组目标。对于机器学习来说,这通常相当于最小化一些误差度量或者最大化一些效用函数。

本文的其余部分集中于一些基本的、广泛使用的统计模型和 ML 算法,并展示了具有上述元素的优化框架。

简单线性回归

此外,从两个角度来看,请注意回归中的以下区别:

正则线性回归

逻辑回归

支持向量机

时间序列分析—指数平滑

时间序列分析— ARIMA

K-表示聚类

深度学习/神经网络

大多数神经网络通过反向传播技术优化神经元之间连接的权重来工作。采用先进的优化方法以确保找到一个高收敛概率的好解。

Image source: Types of Optimization Algorithms used in Neural Networks and Ways to Optimize Gradient Descent

强化学习

RL 是任何现代人工智能代理/系统的核心。如果你听说过谷歌著名的 AlphaGo 程序,它在古代棋盘游戏围棋中击败了最好的人类冠军,你可以确信在所有这些“机器智能”背后有一些真正先进的优化技术。

[## 用 Q-Learning 从零开始解决 MDP 问题——黑客的深度强化学习(第 1 部分)

是时候学习价值函数、贝尔曼方程和 Q 学习了。你将利用所有的知识…

medium.com](https://medium.com/@curiousily/solving-an-mdp-with-q-learning-from-scratch-deep-reinforcement-learning-for-hackers-part-1-45d1d360c120)

稍微绕了一下——利用机器学习进行优化

可能会有令人兴奋的优化问题,使用机器学习作为前端来创建模型/目标函数,与其他方法相比,该函数可以更快地进行评估/计算。这当然不同于本文的主要讨论点。但还是展示了最优化和机器学习之间错综复杂的相互作用。

作为说明,优化框架中的更新公式(例如梯度下降)可以使用神经网络来代替复杂的函数。

[## 通过强化学习学习优化

自从我们去年发表了关于“学习优化”的文章后,优化程序学习领域得到了越来越多的关注…

bair.berkeley.edu](https://bair.berkeley.edu/blog/2017/09/12/learning-to-optimize-with-rl/)

这种方法的应用之一是在优化循环中用机器学习映射功能取代耗时的模拟模型,在优化循环中,成千上万的输入变量被输入到模拟模型中,我们希望以某种方式找到最佳模拟输出的优化参数集。这个想法如下图所示,

总结和其他方法

在本文中,我们讨论了优化在现代商业和工程企业中的一般作用,以及为什么了解优化对于数据科学变得至关重要。

我们展示了基本的优化模型,它是一些广泛流行的统计技术和机器学习算法的核心。

通过一些简单的搜索,你会在其他流行的 ML 方法的核心找到类似的优化框架,

  • 期望最大化
  • 深度学习/神经网络( 梯度下降如何工作 )
  • 遗传算法
  • 模拟退火

如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。此外,您可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。

[## Tirthajyoti Sarkar - Sr .首席工程师-半导体设计、人工智能、机器学习- ON…

查看 Tirthajyoti Sarkar 在世界上最大的职业社区 LinkedIn 上的个人资料。](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)

使用 Git 进行版本控制的快速入门

原文:https://towardsdatascience.com/a-quick-primer-to-version-control-using-git-3fbdbb123262?source=collection_archive---------3-----------------------

source: xkcd

版本控制是一种系统,它允许您跟踪一段时间内对代码所做的更改。因此,版本控制非常有用,因为:

  1. 您可以恢复到代码的特定“版本”
  2. 因为特定的变更和相关的贡献者被跟踪,所以在相同的工作上的协作是可能的

由于编码是数据科学不可或缺的一部分,因此使用版本控制来维护源代码和数据库是最佳实践。它还简化了协作项目。更改可以记录在存储库中:存储文件和对这些文件所做更改的记录的数据结构。

Git 是最流行的版本控制系统之一。它是一个分布式版本控制系统。变更不一定要提交到同一个中央存储库中,这将要求项目中的每个人访问该中央存储库并下载最新的代码以保存变更。取而代之的是,每个人都可以拥有自己的本地化存储库及其全部历史。

事实上,Git 是一个相当简单的工具,与 Github(在云上托管 Git 存储库)等服务相结合,有助于版本控制。

Git 基本步骤

确保你的机器上安装了Git。

所有后续命令都在终端上执行,您必须在项目目录中。

注意:将来所有需要用户指定输入的代码(比如特定的文件)都将以斜体显示。

add *filename*

上面的代码意味着您总是键入“add ”,但是您必须指定您想要添加的文件。

general overview of edit-stage-commit process. the rectangles delineate the ‘state’ of the file(s) in question. when the file is finally committed, we revert back to the unmodified state until we are ready to stage and commit more changes.

1.初始化 Git 储存库

要在项目目录中初始化 Git 存储库:

git init

这将在项目目录中创建一个. git 目录。

2.检查文件状态

要检查是否有任何文件已被修改但尚未提交,

git status 

这将返回存储库的当前状态,如下所示:

尚未“跟踪”(暂存和/或提交)的文件将在此处注明。如果所有文件都被跟踪,那么 Git 将会注意到没有什么需要提交的,工作树也是干净的。

2a。创建一个. gitignore 文件

答。gitignore file 对于确保包含敏感信息(如密码和个人 API 密钥)的文件不被跟踪非常重要。当您选择将存储库推送到云服务以便公开显示时,这一点尤其重要。来创建。gitignore 文件:

touch .gitignore

在。gitignore file,添加决定要忽略的文件的文件名或通用规则(详细定义见 Octocat )。gitignore 规则)。

最佳做法是将文件添加到。gitignore 在进行任何提交之前。将任何文件添加到。gitignore 将确保文件不会在 后续的 提交中被跟踪。该文件的任何先前提交仍将可用,并且该文件将需要从那些较旧的提交中移除。

3.暂存文件更改

您可以有选择地暂存已修改的文件,将它们添加到“暂存区”以准备提交。未添加到临时区域的已修改文件随后将不会被提交。这允许更细化和更具体的提交(例如:只对项目的 A 部分进行变更),这对将来的参考很有用。

#to stage specific modified files
git add *filename*#to stage all modified files
git add .

应当注意,记录当前分支的提交;这被认为是项目历史上的一个分支

4.提交文件更改

然后提交所有暂存文件,实质上是在特定时刻创建这些特定文件的“屏幕截图”。这有效地记录了对存储库的新变更。

git commit -m '*describe change(s) made here*' 

每次提交都必须有一条消息,描述所做的更改。这是用现在时完成的,最好是更具描述性的。这将有助于以后查看日志。

4a。使用过去的提交

检查过去的提交可能非常有用,无论是查看自那以后做了什么新的更改(潜在地识别新 bug 的来源),还是甚至回到以前的提交。

要显示所有提交的日志:

git log

这将返回一个提交日志,其中每个提交如下所示:

每个提交都有一个相关的描述(这就是为什么提交期间的描述很重要)、时间和提交 ID。头是指当前分支,在这种情况下,它是主分支。

要检查特定提交中所做的更改,请执行以下操作:

git show *commit-id*

提交 ID 也称为哈希(随机生成)。

要完全恢复到以前的提交:

git reset --hard *commit-id*

这实质上将返回到指定的提交(以及该特定提交处的文件);自该提交以来的所有更改都将丢失,并且头指向指定的提交。不包括“— hard”选项将导致软复位;所有更改将作为未分级的更改保留,并且头指向指定的提交。

在继续之前,描述分支很重要,这是 Git 的一个基本方面。

分支

source: Atlassian

一个分支 本质上是一个“新”目录,在你将那些变更合并到包含你所有源代码的主分支之前,你可以在这个目录上处理一个项目的特定部分或特性。

您总是开始的默认分支总是被称为主分支。主分支包含最新的可用源代码。始终假设主分支已经准备好进行部署。所有的试验和变化,无论大小,都是在以后要合并的其他分支上进行的。

基本步骤

要列出存储库中的所有分支:

git branch

要创建新分支:

git branch *new-branch-name*

这只会创建分支。要切换到特定分支并开始在其中工作:

git checkout *another-branch*

或者,如果您想要创建一个新分支并立即切换到它:

git checkout -b *new-branch-name*

合并分支

要合并两个分支(在本地存储库中),如特征分支和主分支:

1。确保您在接收分支上(主设备将从特征分支接收)

git checkout *master*

2。特征分支和主分支都必须是完全最新的,包括远程更改。

要提取并合并最近的远程更改:

git pull

3。将特征分支合并到主分支:

git merge *feature-branch*

4。删除现在不相关的特征分支

git branch -d *feature-branch*

使用 Github

确保您有一个 Github 帐户,并且您已经为您的项目创建了一个 Github 资源库。然后,您可以将本地回购推送到这个存储库。

或者,您可以克隆一个现有的存储库,这实质上是在您的机器上创建一个公共存储库的副本。

git clone *filepath*

克隆时,会自动创建到原始存储库的远程连接(称为“源”)。这允许您向前推和拉变更(到原始存储库和从原始存储库)。

Github 的主要用处是因为它加速了协作工作。项目的每个参与者都可以拥有自己的项目本地私有存储库,对本地存储库进行更改,并在以后将更改推送到公共存储库。他们可以做到这一切,而不必跟上公共存储库的变化。

README.md

自述文件是公共存储库不可或缺的一部分,因为它有助于描述项目、识别错误、列出依赖项等。对于数据科学项目的自述文件中应该包含哪些内容,RociosNG 提供了很好的指导。它通常被创建为 README.md。

通用 Git 工作流程

一般的 Git 工作流程是什么样子的?这将因团队和项目而异,但每个工作流都从存储在服务器上的公共存储库(通常是 Github)开始,并依赖于分支。要解释的最基本和最直接的 Git 工作流是集中式工作流。许多其他工作流只是集中式工作流的扩展。

集中式工作流依赖于单个公共存储库。

1.贡献者从 Github 克隆中央存储库,从而在他们的本地机器上创建存储库的副本。

git clone *repository*

2.然后,他们可以在他们的本地存储库上创建自己的分支,在那里他们可以在本地进行、暂存和提交他们的更改。

git checkout -b *branch*

3.然后,他们可以将这些(提交的)变更推送到 Github 上他们分支的远程版本(仍然与主远程分支分开)。

#ensure local version of master is up-to-date
git pull --rebase origin master#push to remote branch
git push origin *branch*

4.一旦贡献者准备好了,他们就可以为他们的远程分支提交一个拉请求。其他协作者可以检查这些更改,一旦这些更改被批准,这些更改就可以被合并到主远程分支。

如果有冲突,Git 将产生一个错误消息,冲突需要由贡献者来解决。一旦解决了冲突,就可以成功地推送更改。

解决冲突

因为贡献者正在对他们的本地存储库进行更改,一旦这些更改实际上被推送到中央存储库,他们的代码可能会与其他贡献者的代码冲突。

假设两个贡献者都在处理同一个文件,他们都以不同的方式修改了第 13 行。如果做了同样的改变,那么就不会有冲突了。如果更改不同,那么可能会出现冲突。通常 Git 会尝试以一种智能的方式组合变更,但是当它不能确定哪个变更应该被集成时(如果它们不能都被包含),那么冲突必须被手动解决。

1。从中央存储库中提取所有新的变更

git pull --rebase origin master

这将会把贡献者克隆的所有变更推到中央存储库。这将更新主分支。

通过包含 rebase 选项,在本地进行的提交被添加到新更新的主分支。这实质上将重写主分支的项目历史;所有本地提交现在都是其项目历史的一部分。

这将导致一个更干净的项目历史,没有分叉或者额外的合并提交。这样更便于日后参考。

2。解决冲突

重置基础将一次提交添加到主分支的项目历史中。当它这样做时,任何冲突也会出现。这使得解决冲突变得容易得多,因为它们可以在个案的基础上处理。

因为数据科学的特点是协作工作,这通常需要编码,所以学习和实践版本控制非常重要。我觉得讨论 Git 是最有用的,因为它是目前最流行的版本控制系统。应该注意的是,它不是唯一的版本控制系统。但是,至少了解版本控制和一些版本控制系统是很重要的。

这是对 Git 要点的一个非常广泛的概述。有关更深入的资源,请参见下文。

资源

  • 数据营
  • GitHowTo
  • Git 文档
  • 进一步 Git & Github 练习
  • 亚特兰蒂斯 Git 教程
  • Github 流程

关于运行一周编程工作体验的思考

原文:https://towardsdatascience.com/a-reflection-on-running-a-week-of-programming-work-experience-585eaeb6e4b4?source=collection_archive---------13-----------------------

我参与开发并指导了两个学生为期一周的工作经历,这两个学生的 A-level 考试正进行到一半(对于那些不住在英国的学生来说,这意味着他们还有一年就要高中毕业了)。这篇文章将记录我认为进展顺利的事情;而且,如果我有一台时间机器,还有什么可以改进的。

我在牛山做软件工程师。我们应用机器学习技术来自动化设备可靠性部门的流程。我们是一家小公司,但仍然设法在地球的两端都有软件团队——英国牛津;和澳大利亚的珀斯。

当我被告知我将指导两名有工作经验的学生时,我得到的唯一信息是:其中一名实习生对编程和我们的领域感兴趣;另一个对编程有点兴趣,但对我们的领域更感兴趣。另一个与我共同开发工作经验的人是牛山的技术总监,查理·迪布斯代尔。

这不是我第一次教编程。在我本科学位(计算机科学)的最后一年和博士学位(也是计算机科学)的前三年,我在各种课程中帮助了所有三年的本科生和硕士生。我真的很喜欢这些经历,能够和人们坐下来,解释概念,看到他们在他们理解的时候微笑,这太棒了。因此,管理这份工作经历将是继续我已经完成的教学的一个很好的方式。

我回想起十年前那一周的工作经历。虽然我很感激这个机会,但我并不觉得我学到了很多东西,也没有参与公司做的任何事情——这一点也不觉得个性化。每天我都有八个小时的时间来玩一些随机的新应用程序,没有设定目标,除此之外没有任何指导。这令人失望,因为那时我已经编程五年了,所以我期望我会做一些编程。因此,利用我自己工作经历中的缺点,结合我认为对这两名学生的职业生涯有益的其他经历,我制定了一些目标,希望与我指导的那些人一起实现:

  • 开发工作组合:他们和我们一起做的工作将能够放在 GitHub 存储库上,并成为对工作申请过程有用的编程组合的开始。
  • 参与公司的目标:虽然我们不能让他们用真实的数据在真实的系统上工作;他们所做的工作应该与公司的工程数据相关,而不仅仅是让他们跟随一个他们可以去任何地方的随机在线教程。
  • 事先与他们沟通,让他们知道自己将要做什么:这给了他们做任何准备的机会,如果他们愿意的话——就我个人而言,在开始工作之前,我会尽可能多地获取关于技术堆栈的信息,以便阅读。我发现这有助于减轻我的压力,也是购买更多编程书籍的绝佳借口。

带着这些目标,我们设计了本周的结构。它包括使用 Python(使用 Jupyter 笔记本)对一些与我们所在行业相关的模拟数据进行数据分析,并在周末结束时对他们所做的工作进行 15 分钟的演示。完整的任务集以及用于完成任务的数据在这里可用。

关于实习生的表现,我要讨论的是,他们表现出色,很高兴看到他们一起工作和演讲。这是为了匿名,也与本文无关。

A beautiful photo with a reflection (albeit not a personal reflection).

什么效果好

  • 这两个学生都完成了课程,现在他们每个人都有一个 GitHub 库来处理这项工作。
  • 学到了很多东西:他们都学到了很多编程知识(一个是从零开始,另一个有一些以前的知识)。我还教他们版本控制(Git 和 GitHub ),这让我意识到 Git 很难向以前没有使用过它的人解释。试图解释“git pull”和“git push ”,并告诉他们只接受“origin master”部分必须存在(否则我最终会掉进试图解释版本控制细节的兔子洞)。
  • 与这些人单独交谈,了解他们的生活计划——并试图用我仅有的一点生活经验给他们一点建议。
  • 他们看起来很享受,嗯,看起来很享受,这对我来说足够了!

有哪些可以改进的地方

  • 重点太放在编程上了。如前所述,其中一个人对工程方面的东西更感兴趣,所以更深入地研究这个领域会更好。尽管以我的计算机科学背景(以及近乎零的工程知识),很自然地,它最终会偏向于编程。潜在的,事先面试他们以了解他们想从工作经历中得到什么可能是有用的——然而,面试工作经历可能有点过头了。查理确实和这两个人聊了大约一个小时,虽然我没有亲眼目睹那次对话;但即便如此,1 小时相对于工作周的其余时间来说,仍然感觉不平衡。
  • 我自己从来没有完成过这些任务。我们生成了数据和任务,而没有实际测试它们。现在,这只是其中一个任务的一个小问题,但它给学生们造成了很大的混乱,让我有点尴尬。其中一项任务涉及在箱线图中总结数据,然而,数据有点缺乏,箱线图看起来不像典型的箱线图。这导致了混淆,认为代码是错误的,而实际上代码是正确的。这里得到的教训是:首先测试所有东西!
  • 演示时间:最初的计划是让他们单独工作,单独演示 15 分钟。他们最终做了一个联合演示,但我们仍然说 15 分钟。事后看来,我们应该在演示结束后分配更长的时间来思考和反馈,因为我们觉得他们的工作有更多的问题和学习点需要强调。
  • 代码回顾:这些任务使用了 Pandas 库,它们提供了一组丰富的数据操作函数,其中许多是学生手工实现的(计算平均值、中位数等)。其中一个甚至实现了数据的冒泡排序算法。如果能花些时间来概述熊猫的这些特征,那就太好了。虽然这肯定是在他们手动开发算法之后,因为我不确定单独加载数据帧和调用描述函数能学到多少东西。整整一周,我试图演示他们如何优化代码,但专门安排一个时间段可能更好。

结束语

总的来说,我和公司的其他人认为这是一个巨大的成功。我在这里更多地考虑缺陷,好像我们最终会再次运行它。我希望没有缺陷,它会完全顺利地进行(一个人可以做梦)。你从失败中学到的比从成功中学到的更多。

对我来说,我非常喜欢这样做,能够教人们投资组合并让他们从第一个投资组合开始是一种很棒的感觉。设计这门课程的一个潜在好处是,它可能是培训大学水平的实习生(无论能力水平如何,甚至可能是新员工)如何使用我们的代码库的一个良好开端——接受所有那些为模拟数据设计的任务,并将它们应用于真实系统中复杂得多的真实数据。

如果能听到其他运行类似工作经验计划的人的意见,以及你发现哪些是可行的,哪些是不可行的,那就太好了。请随时在这里或 LinkedIn 上联系我。欢迎评论和批评,尤其是对我的写作。

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

基于简历自动摘要的命名实体识别(NER)综述

原文:https://towardsdatascience.com/a-review-of-named-entity-recognition-ner-using-automatic-summarization-of-resumes-5248a75de175?source=collection_archive---------2-----------------------

了解什么是 NER,以及它是如何在行业中使用的,NER 的各种图书馆,使用 NER 进行简历汇总的代码演练。

这篇博客讲述了自然语言处理(NLP)和信息检索(IR)中的一个领域,称为命名实体识别,以及我们如何通过只提取姓名、教育背景、技能等主要实体来应用它自动生成简历摘要。

什么是命名实体识别?

命名实体识别 ( NER )(也称为实体识别实体分块实体提取)是信息提取的子任务,其寻求将文本中的命名实体定位并分类到预定义的类别中,例如人名、组织、位置、时间表达式、数量、货币值、百分比等。

已经创建了使用基于语言语法的技术以及诸如机器学习的统计模型的 NER 系统。手工制作的基于语法的系统通常可以获得更好的精度,但代价是较低的召回率和经验丰富的计算语言学家数月的工作。统计 NER 系统通常需要大量人工标注的训练数据。有人建议采用半监督方法来避免部分注释工作。

最先进的 NER 模型

斯帕西·NER 模型:

作为一个免费的开源库,spaCy 使得 Python 中的高级自然语言处理(NLP)变得更加简单。

spaCy 为 python 中的命名实体识别提供了一个非常有效的统计系统,它可以将标签分配给连续的标记组。它提供了一个默认模型,可以识别各种命名或数字实体,包括公司名称、位置、组织、产品名称等等。除了这些默认的实体之外,spaCy 还支持向实体识别模型中添加任意的类,方法是通过训练模型用更新的训练样本来更新它。

模型架构:

spaCy 中的统计模型是定制设计的,提供了速度和准确性的卓越性能组合。目前使用的架构尚未发布,但以下视频概述了该模型如何工作,主要关注 NER 模型。

斯坦福命名实体识别器:

斯坦福 NER 是一个命名实体识别器,用 Java 实现。它提供了一个默认的训练模型,用于识别主要实体,如组织、个人和位置。除此之外,还提供了针对不同语言和环境的各种模型。

模型架构:

斯坦福 NER 也被称为 CRF(条件随机场)分类器,因为线性链条件随机场(CRF)序列模型已经在软件中实现。我们可以为各种应用使用我们自己的标记数据集来训练我们自己的定制模型。

CRF 模型最初是由 Lafferty,McCallum 和 Pereira (2001) 首创的;详细易懂的介绍请参见萨顿和麦卡勒姆(2006) 或萨顿和麦卡勒姆(2010) 。

NER 模型的使用案例

命名实体识别在自然语言处理和信息检索领域有着广泛的应用。下面列举了几个这样的例子:

自动汇总简历:

各个公司的人力资源部门面临的一个关键挑战是评估一大堆简历以筛选候选人。为了增加他们的负担,申请人的简历经常被过分详细地填充,其中大部分信息与评估者寻求的无关。为了简化这一过程,通过我们的 NER 模型,我们可以快速评估简历,从而简化从一堆简历中筛选候选人的工作。

优化搜索引擎算法:

为了设计搜索引擎算法,更有效的方法是对文章运行一次 NER 模型,并永久存储与其相关的实体,而不是在数百万篇文章和网站中搜索输入的查询。然后,可以将搜索查询中的关键标签与和网站文章相关联的标签进行比较,以进行快速有效的搜索。

为推荐系统供电:

NER 可以用于开发推荐系统的算法,该算法可以自动过滤我们可能感兴趣的相关内容,并根据我们以前的行为相应地指导我们发现相关的和未访问的相关内容。这可以通过提取与我们的历史或先前活动中的内容相关联的实体,并将它们与分配给其他看不见的内容的标签进行比较,以过滤相关的内容来实现。

简化客户支持:

NER 可用于识别客户投诉和反馈中的相关实体,如产品规格、部门或公司分支机构的详细信息,以便对反馈进行相应分类,并转发给负责已识别产品的适当部门。

我们将在接下来的章节中详细描述使用 NER 模型的简历汇总。

简历汇总的 NER

数据集:

当然,手头的第一项任务是创建手动标注的训练数据来训练模型。为此,从一个在线招聘平台下载了 220 份简历。这些文件被上传到 Dataturks 在线注释工具,并进行手动注释。

该工具自动解析文档,允许我们创建感兴趣的重要实体的注释,并生成 JSON 格式的训练数据,每行包含文本语料库和注释。

数据集的快照如下所示:

以上由 220 份带注释的简历组成的数据集可以在这里找到。我们用 200 份简历数据训练模型,用 20 份简历数据进行测试。

使用 python 中的空间模型训练自定义模型:

数据集格式:

由 Dataturks 注释工具生成的 json 格式数据的一个示例提供给代码,如下所示:

训练模型:

我们使用 python 的 spaCy 模块来训练 NER 模型。spaCy 的模型是统计的,他们做出的每一个“决定”——例如,分配哪个词性标签,或者一个词是否是命名实体——都是一个预测。这一预测基于模型在训练期间看到的例子。

然后向模型显示未标记的文本,并进行预测。因为我们知道正确的答案,所以我们可以以计算训练样本和预期输出之间的差异的损失函数误差梯度的形式给出关于其预测的模型反馈。差异越大,梯度和模型更新就越显著。

当训练一个模型时,我们不仅仅希望它记住我们的例子——我们希望它能提出可以在其他例子中推广的理论。毕竟,我们不只是想让模型知道“亚马逊”的这个实例是一家公司——我们想让它知道,在像这样的的环境中,“亚马逊”最有可能是一家公司。为了调整准确性,我们分批处理我们的训练示例,并对[minibatch](https://spacy.io/api/top-level#util.minibatch)大小和辍学率进行实验。

当然,仅仅向一个模型展示一个例子是不够的。特别是如果你只有很少的例子,你会想要训练一个数量的迭代。在每次迭代中,训练数据会被打乱,以确保模型不会基于示例的顺序做出任何概括。

另一种改善学习结果的技术是设置一个退出率,一个随机“丢弃”个别特征和表示的速率。这使得模型更难记住训练数据。例如,0.25丢弃意味着每个特性或内部表示有 1/4 的可能性被丢弃。我们对模型进行 10 个时期的训练,并保持辍学率为 0.2。

下面是训练模型的代码片段:

[## data Turks-Engg/Entity-Recognition-In-Resumes-SpaCy

通过在 GitHub 上创建一个帐户,为简历中的实体识别空间开发做出贡献。

github.com](https://github.com/DataTurks-Engg/Entity-Recognition-In-Resumes-SpaCy)

spaCy 模型的结果和评估:

该模型在 20 份简历上进行了测试,预测的汇总简历被单独存储。每份简历的 txt 文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度分数、精确度、召回率和 f 分数。将每个实体的这些指标值相加并平均,以生成一个总分数,来评估由 20 份简历组成的测试数据上的模型。实体方面的评估结果如下所示。据观察,所获得的结果已经预测了值得称赞的准确性。

下面显示了通过我们的模型预测获得的一份来自 indeed.com 的员工的未公开简历的示例摘要:

Resume of an Accenture employee obtained from indeed.com

Summarized Resume as obtained in output

使用 Java 中的斯坦福 NER 模型来训练定制模型:

数据集格式:

用于训练的数据必须作为文本文件传递,以便每行包含一个单词-标签对,其中单词和标签标记由制表符空格“\t”分隔。对于一个文本文档,就像在我们的例子中,我们将文档标记为单词,并将每个单词和相关的标签添加到训练文件中。为了指示下一个文件的开始,我们在训练文件中添加一个空行。

以下是输入培训文件的示例:

注意:每个单词都必须包含一个标签。这里,对于我们不关心的单词,我们使用标签 0。

属性文件:

Stanford CoreNLP 需要一个属性文件,其中包含构建定制模型所需的参数。例如,我们可以定义提取学习特征的方法,等等。以下是属性文件的示例:

# location of the training file
trainFile = ./standford_train.txt
# location where you would like to save (serialize) your
# classifier; adding .gz at the end automatically gzips the file,
# making it smaller, and faster to load
serializeTo = ner-model.ser.gz# structure of your training file; this tells the classifier that
# the word is in column 0 and the correct answer is in column 1
map = word=0,answer=1# This specifies the order of the CRF: order 1 means that features
# apply at most to a class pair of previous class and current class
# or current class and next class.
maxLeft=1# these are the features we'd like to train with
# some are discussed below, the rest can be
# understood by looking at NERFeatureFactory
useClassFeature=true
useWord=true
# word character ngrams will be included up to length 6 as prefixes
# and suffixes only
useNGrams=true
noMidNGrams=true
maxNGramLeng=6
usePrev=true
useNext=true
useDisjunctive=true
useSequences=true
usePrevSequences=true
# the last 4 properties deal with word shape features
useTypeSeqs=true
useTypeSeqs2=true
useTypeySequences=true
#wordShape=chris2useLC
wordShape=none
#useBoundarySequences=true
#useNeighborNGrams=true
#useTaggySequences=true
#printFeatures=true
#saveFeatureIndexToDisk = true
#useObservedSequencesOnly = true
#useWordPairs = true

训练模型:

斯坦福 CoreNLP 的首席类是CRFClassifier,拥有实际模型。在 Github 存储库中提供的代码中,我们提供了使用训练数据和属性文件来训练模型的代码,并将模型保存到磁盘,以避免每次训练所耗费的时间。下次我们使用该模型对一个看不见的文档进行预测时,我们只需从磁盘加载训练好的模型,并使用它进行分类。

输出中的第一列包含输入标记,而第二列引用正确的标签,第三列是分类器预测的标签。

下面是训练模型并将其保存到磁盘的代码片段:

[## data Turks-Engg/Entity-Recognition-In-Resumes-Stanford ner

通过在 GitHub 上创建一个帐户,为 StanfordNER 的简历中的实体识别发展做出贡献。

github.com](https://github.com/DataTurks-Engg/Entity-Recognition-In-Resumes-StanfordNER/blob/master/StanfordCRFTagger.java)

斯坦福 NER 模型的结果和评估:

该模型在 20 份简历上进行了测试,预测的汇总简历被单独存储。每份简历的 txt 文件。

对于测试模型的每个简历,我们计算模型识别的每个实体的准确度分数、精确度、召回率和 f 分数。将每个实体的这些指标值相加并平均,以生成一个总分数,来评估由 20 份简历组成的测试数据上的模型。实体方面的评估结果如下所示。据观察,所获得的结果已经预测了值得称赞的准确性。

下面显示了通过我们的模型预测获得的一份来自 indeed.com 的员工的未公开简历的示例摘要:

A resume of an Accenture employee obtained from indeed.com

Summarized Resume as obtained in Output

斯帕西、斯坦福 NER 和最先进模型的比较;

现实世界简历文档中的绝大多数标记不是通常定义的实体名称的一部分,因此基线精度、召回率非常高,通常> 90%;按照这个逻辑,两个模型的实体精确召回值都相当不错。

从对模型的评估和观察到的结果来看,spaCy 在总结简历的任务上似乎优于斯坦福 NER。两种模型确定的实体的 F 分数审查如下:

这是标有 NER 实体的简历数据集。

用于训练 spaCy 模型的上述项目的 Python 代码可以在 github 存储库中的这里找到。

上述用于训练斯坦福 NER 模型的项目的 Java 代码可以在 GitHub 仓库的这里找到。

注意:这个博客是发表在 Dataturks 的 NER 博客的扩展版本。

英伟达 GTC 2018 大会综述——新 GPU、深度学习加速、数据增强、自动驾驶..

原文:https://towardsdatascience.com/a-review-of-nvidia-gtc-2018-conference-new-gpus-deep-learning-acceleration-data-augmentation-d6d4f638bcda?source=collection_archive---------4-----------------------

会议主题是“AI 与深度学习”。

NVIDIA DGX-2 Workstation, 10x faster than the DGX-1 released 6 months ago. Source.

在 NVIDIA GPU 技术大会上为期 4 天的精彩演讲、主题演讲、演示、海报和互动。作为一名对应用人工智能感兴趣的 HCI 研究人员,了解人工智能硬件(GPU)的进展是令人兴奋的,这些技术讲座涵盖了人工智能科学和人工智能的行业用例。这篇文章总结了我参加的会议主题和技术会议的笔记。

TLDR——一些亮点

  • NVIDIA AI 宣布了新的 GPU,并原生集成了他们的深度学习推理优化器(tensort)与 TensorFlow 。
  • 人们对构建模拟环境以测试自动驾驶汽车算法的兴趣越来越大。英伟达公布了一款自动驾驶平台。
  • 对于人工智能的许多现实应用,数据增强策略越来越重要。参见 Fatkun 插件采集训练图像,参见 imagaug 库进行图像增强。另请参见这篇关于 python/Tensorflow 中的数据扩充步骤的博文。
  • 生成性人工智能(GANs,进化算法)正在被探索用于 CAD 和游戏设计用例——艺术内容生成(人物,背景),内容重用等。
  • 研究人员正在探索人工智能在安全领域的应用——例如检测域生成算法。
  • 人工智能正被用于通过加速模拟来加速科学研究。

主题演讲 GPUs、图形应用、人工智能、自动驾驶的进步。

图形处理器

宣布了几款新的 GPU——Quadro gv 100(10,000 个内核)和 DGX 2 号工作站(2 PFlOPS,512GB HBM2,10Kw,350 磅)。从性能的角度来看,DGX 2 号比 6 个月前发布的 DGX 1 号快 10 倍。模型训练时间中的示例进一步展示了 GPU 进步对人工智能研究和实践的影响。

就在 5 年前,用2 GTX 580 训练 Alexnet 花了 6 天。今天,Alexnet 可以在 DGX-2 上进行 18 分钟的训练。相当大的进步!

主题演讲还强调了 GPU 现在如何实现运动图形的实时光线跟踪,以及以前在超级计算机上完成的工作现在如何能够在 DGX 工作站上高效地完成,其价格仅为功耗 空间 要求的一小部分。

医学成像超级计算平台

CLARA — NVIDIAs system to enable medical imaging. Source.

英伟达还提到了他们对医疗成像超级计算机的尝试——克拉拉。这个项目很有前景,因为它旨在利用人工智能/深度学习的进步来扩展现有医疗成像设备的能力。有一个有趣的视频,讲述了深度学习算法如何用于心脏的 3D 重建(心室大小、血流等细节),这些图像是基于 15 年前的超声波扫描仪捕捉的图像。点击这里了解更多关于克拉拉的信息。

自动驾驶,传感器融合

获取训练数据和设计算法融合来自自动驾驶所需的多个传感器的输入(传感器融合)是很难的。NVIDIA 提到了创建一个平台——NVIDIA DRIVE——来帮助解决这些问题的努力。对于自动驾驶汽车研究人员来说,这是个好消息。**

NVIDIA DRIVE 平台结合了深度学习、传感器融合和环绕视觉,以改变驾驶体验。它能够实时了解车辆周围发生的事情,在高清地图上精确定位自己,并规划安全的前进路径。该平台围绕多样化的冗余系统架构设计,旨在支持最高级别的汽车功能安全 ASIL-D。

还有一些其他的技术讲座,强调了对高质量模拟环境的需求,以训练/测试自动驾驶汽车算法。

张量流+张量

NVIDIA AI 也宣布原生 Itensort 与 Tensorflow 整合。NVIDIA TensorRT 是一款深度学习推理优化器和运行时,它通过基于 GPU 的平台的优化和高性能运行时来加速深度学习推理。如果您正在 NVIDIA GPUs 上运行 Tensorflow 应用程序,您现在可以添加一些代码行来自动启用 TensorRT 优化和加速!

技术会谈

下面是我参加的一些技术讲座。

温斯顿·许的数据增强策略[ 幻灯片

我发现这个演讲很有趣,因为它提供了关于如何满足监督深度学习的数据饥渴需求的实用建议。演讲者从数据的人工注释是一个昂贵的过程这一前提开始,并提出了他们在工作流程中使用的四种方法来解决这一问题。

网络抓取:从网站和社交网络中高效抓取标签数据的方法。
弱监督方法:给定一个由专家标记的小数据集,我们可以学习标记策略,并将其应用于标记更大的数据集。
数据转换:我们可以通过使用简单的线性转换生成额外的示例来扩充数据集,例如裁剪、移位、色偏、镜头失真、晕影、随机背景等。这种转换的库的例子是 imageAug 。
数据合成:我们可以生成纹理化的 CAD 模型作为训练数据,我们可以给数据添加特定的特征,例如给面部图像添加眼镜,以及使用 GANs 一起合成新的图像。

更多信息请点击此处查看主讲人的幻灯片。

司机睡意检测——英伟达的 Siddarth Varier

英伟达的研究人员展示了一些检测司机睡意的早期工作。作者训练了一个按比例缩小的 VGG16 模型,并使用从 3D 人脸模型生成的合成数据增加了他们的训练数据集。对于分类,它们依赖于在一段时间内预测的眼睛俯仰角。

生成人工智能

Autodesk 创成式设计:在这次演讲中,演讲者讨论了进化算法在生成 CAD 设计中的一些有趣的应用。给定一个设计挑战,目标通常是平衡成本(材料)和性能。为此,他们试验了生成候选设计的进化算法,同时优化成本/性能/制造方法等参数,并使用自动化压力测试(FEA 分析)作为反馈的一部分。给出了一个具体的例子,其中一个进化算法提出了一个摩托车的高性能(和不寻常的外观)部件。

人工智能颠覆游戏内容创作的未来——艾瑞克·里塞尔, Artomatix

Left — original: We can see a clear vertical and horizontal seam line running through the center of the image, Right — Artomatix output:The seam was intelligently repaired with new features that appear realistic. Source — Artomatix Blog.**

本次演讲的重点是如何将人工智能加速的工作流应用于媒体行业的各个方面(例如电影、视频游戏)。演示者透露,视频游戏行业在艺术内容生成上花费了 61%的预算——主要角色和背景。大部分工作包括手动工作流程。创造性或生成性人工智能提供了改善这一点的机会,涉及纹理合成、材料增强、杂交和风格转移等领域。这包括使艺术家能够用结构绘画的方法、基于示例的工作流(扫描现实世界的对象并利用人工智能进行改进)和摄影测量。人工智能还可以帮助回收旧内容,例如高清视频。给出了一个行业使用案例,宜家能够轻松扫描产品的 3D 模型,然后在网站上使用(研究表明,拥有 3D 模型可使网站销售额提高 20%)。查看主持人公司博客的更多详情。

生长生成模型 — Samuli Laine 等人 NVIDIA 的研究人员展示了一些关于如何使用生成对抗网络(GANs)生成高分辨率图像的有趣工作。他们的方法解决了 GANs(模式崩溃)的一个已知问题,加速并稳定了训练过程。关键思想是逐渐增加发生器和鉴别器:从低分辨率开始,随着训练的进行,增加新的层来模拟越来越精细的细节。他们强调了这项工作在为游戏和电影生成资产以及调节 GAN 以确定输出(例如男性或女性面孔)方面的潜力。更多细节可以在他们的论文中找到。

Examples of high resolution faces generated by their GAN. Paper.

网络防御——用机器智能对抗 DGAs

另一个有趣的话题是如何使用 ML 来解决一些安全问题——检测域生成算法。域生成算法 DGAs 是各种恶意软件家族中常见的算法,用于定期生成大量域名,这些域名可用作其命令和控制服务器的集合点。它们被黑客用来交流和从网络中窃取数据,旨在绕过传统的网络防御,并取得了极大的成功。他们引用了最近的一篇论文“深度网络在线 DGA 检测”。

看见 AI ,一款针对视障人士的 app—Anirudh Koul

微软研究院的 Anirudh Koul 的有趣演讲展示了他的团队如何为视障人士(VIP)开发 seeingAI 移动应用程序。

他注意到这一方向如何孕育创新,从而激发了应用程序的可访问性设计。例如,雷·库兹韦尔受一位盲人的启发,发明了一种阅读机器。格雷厄姆·贝尔也有类似的故事,他在研究助听器时发明了电话。

对残疾人来说是小众的东西明天将成为主流。

seeingAI 应用程序可以帮助 VIP 阅读文本、识别人物、场景、笔迹、文档、产品、货币、光源等。也许这项工作的创新之处在于 大部分这些功能都是在设备 上本地执行的。演示者分享了他们对这个项目体验的有趣想法。

  • 训练视觉模型:他们试验了几种方法来组合他们的数据集和 customvision.ai 来训练它。他们建议使用 Fatkun 插件来删除具有适当权限的数据。他们还讨论了为货币生成受控合成数据的实验——例如,采用货币、翻转、遮挡、添加背景等。这里的一个重要思想是确保模型不会仅仅通过看到非鉴别特征(例如,具有零的边缘)来学习预测音符..可以是 10 或 20 美元的钞票)。
  • 为用户体验而不是验证准确性挑选最佳模型。演示者提出了一个重要的观点,即高验证准确性可能不会很好地转化为良好的用户体验。例如,一个准确率为 95%但偶尔会将 100 美元的钞票标记为 10 美元的模型对一个准确率为 90%但不会犯这种错误的模型的吸引力要小得多。针对精度进行优化。在逐帧分析过程中,UX 还需要考虑何时发言。
  • 人们如何使用这款应用:一个盲人根据来自应用的信息——面部、情绪等——改变音调。一个盲人学校的老师,他有自己的电话,当学生进入教室时,他会通知他们。父母能够第一次阅读他们孩子的家庭作业或阅读圣诞信息。
    演讲者还指出,人们通过自我训练来理解人工智能的极限——它能做什么和不能做什么。

使用 ML 加速研究

有一些有趣的演示显示了机器学习如何通过以很少的时间和成本复制昂贵、耗时的模拟来加速科学发现。尤其是在物理科学领域,通常会有让科学家测试想法的模拟器,例如用于碰撞测试、化学反应、压力测试等的模拟器。这些模拟中的许多是复杂的、计算昂贵的(有时高达每年数十亿个 CPU 小时),并且可能需要几天或几周来完成单个模拟。这个想法是训练 ML 模型,学习这些模拟器中使用的过程并复制它们的功能——只需很少的时间和成本。Google Research 的相关工作已经展示了机器学习模型,与现有的预测有机分子属性的模拟器相比,这些模型同样准确并且更快 ( 300,000 倍)。在 GTC,也有一个类似的关于使用 GANs 改进高能物理模拟器的报告。**

用甘斯加速科学— 米凯拉·帕格尼尼

Accelerating Science with Generative Adversarial Networks: An Application to 3D Particle Showers in Multi-Layer Calorimeters. Paper here.

Michela Paganini 做了一个有趣的演讲,讲述了她如何应用 GANs 来模拟量热法——高能物理实验中计算量最大的模拟之一。虽然结果并不完美,但它们展示了一些前景,有可能加快研究周期。更多细节可在他们的 arxiv 论文中找到。

结论

这是一次非常有趣的会议。大会上有 900 多场会议,我在这里所涉及的只是很小的一部分。我发现的共同主题是各种数据增强策略的使用,人工智能的创造力,自动驾驶汽车的模拟环境,人工智能和安全,以及人工智能促进加速研究。

有反馈或意见吗?随时联系— twitter , linkedin 。

强化学习在医疗保健中的应用综述

原文:https://towardsdatascience.com/a-review-of-recent-reinforcment-learning-applications-to-healthcare-1f8357600407?source=collection_archive---------9-----------------------

让机器学习超越诊断,找到最佳治疗方法

Photo taken from Wang et al. KDD Video

机器学习在医疗保健领域的应用已经取得了许多重大成果。然而,这些研究大部分集中在诊断病情或预测结果,而不是明确的治疗上。虽然这些可以间接帮助治疗患者(例如,诊断是找到治疗方法的第一步),但在许多情况下,特别是在有许多可用治疗方案的情况下,为特定患者找出最佳治疗策略对人类决策者来说是一项挑战。虽然强化学习已经变得非常流行,但大多数论文都专注于将其应用于棋盘或视频游戏。RL 在学习这些(视频/棋盘游戏)环境中的最优策略方面表现很好,但是相对而言,在医疗保健等真实世界环境中尚未经过测试。RL 是实现这一目的的一个很好的候选,但是在实际工作中有许多障碍。

在本文中,我将概述一些最新的方法,以及将 RL 应用到医疗保健中存在的最大障碍。如果你对这个话题感兴趣,我将在 PyData Orono Meetup 上详细介绍几个模型,该会议将于本周三美国东部时间 7-9:30 在 Zoom 上播出。本文假设您对强化学习有基本的了解。如果你不知道,我建议你读一读关于数据科学的文章。

基本挑战:

  1. 对纯(或主要)观测数据的学习和评估

与 AlphaGo、Starcraft 或其他棋盘/视频游戏不同,我们无法模拟大量的场景,在这些场景中,代理人进行干预以学习最优策略。最重要的是,利用患者来训练 RL 算法是不道德的。此外,这将耗资巨大,可能需要数年才能完成。因此,有必要从观察史料中学习。在 RL 文献中,这被称为“政策外评估”。许多 RL 算法,如 Q-learning,“理论上”可以在偏离策略的上下文中有效地学习最优策略。然而,正如 Gottesman 等人在他们最近的文章中指出的那样,“在观察性健康设置中评估强化学习算法”,准确评估这些学习到的策略是棘手的。

在正常的 RL 环境中,为了评估一项政策,我们只需让代理人做出决策,然后根据结果计算平均奖励。然而,如上所述,由于道德和后勤方面的原因,这是不可能的。那么我们如何评价这些算法呢?截至目前还没有一个满意的答案。Gottesman 等人在他们的报告中详细描述了这一点,并陈述了可能的情况,但他们没有就使用哪种度量得出具体的结论。下面是常用指标的简要分类。在讨论个别论文时,我也会更详细地介绍。

  • 重要性抽样

Gottesman et al. *Note don’t confuse “weight” here with the weight of neural network. Here you can think of weight almost as a measure of similarity between the histories of the patient under the clinical policy versus what it would be under the learned policy.

为了简化数学术语,这种方法本质上涉及到寻找由医生制定的、匹配或几乎匹配所学政策的治疗方案。然后我们根据这些实际治疗的结果来计算奖励。这种方法的一个问题是,在许多情况下,“非零重要性权重”的实际数量非常小这意味着本质上,如果学习政策建议了医生永远不会做的治疗(或缺乏治疗),那么你将很难评估该政策,因为没有类似的历史,我们实际上有可以比较的结果。

戈特斯曼等人。艾尔。不要提供这个问题的解决方案。相反,他们指出,人们应该总是检查重要性权重的分布”,因为大多数人往往会坐在零附近。为此,Gottesman 指出“因此,我们应该确保用于评估政策的有效样本量足够大,以使我们的评估具有统计学意义。如上所述,将我们自己限制在与医生相似的政策范围内,也将有利于增加有效样本量。"

  • u 形曲线

Examples of the U-Curve from Gottesman et al.

这种方法侧重于比较学习策略和医生策略之间在结果方面的差异。这种评估方法本身也有问题,因为它很容易导致糟糕的政策看起来比临床医生的政策更好。该方法的核心是潜在的假设,即如果当政策推荐剂量和医生剂量匹配时,死亡率低,则政策一定是好的。然而,Gottesman 等人发现,由于数据中发现的差异,随机或无治疗策略看起来会优于医生的策略。

选择良好的评估指标很重要,因为在某些情况下,由于大多数接受治疗的患者具有不良结果,代理可能会学会将治疗与负面结果相关联。这是由于缺乏未治疗患者的数据。正如 Gottesman 等人关于脓毒症所述:

“我们观察到一种已有政策的趋势,即建议对非常高急性(SOFA 评分)的患者进行最低限度的治疗。从临床角度来看,这个建议没有什么意义,但从 RL 算法的角度来看是可以理解的。大多数 SOFA 评分高的患者接受积极的治疗,由于他们病情的严重性,这一亚群的死亡率也很高。在缺乏没有接受治疗的高急性患者的数据的情况下,RL 算法得出结论,尝试一些很少或从未进行的事情可能比已知结果不佳的治疗更好。第 4 页

这又回到了相关性不等于因果性的经典问题。虽然在这里很明显,这个模型在其他环境中有问题,但如果没有适当的评估,它可能更加微妙,不容易被发现。

2。部分可观察性

与医学中的许多游戏不同,我们几乎永远无法观察体内发生的一切。我们几乎可以每隔一段时间测量一次血压、体温、二氧化硫和其他简单的指标,但这些都是信号,并不是患者的真实情况。此外,有时我们可能在某些时间点有数据,但在其他时间点没有。例如,医生可能只在治疗肺炎病人的前后进行胸部 x 光检查。因此,模型必须在没有所有数据的情况下估计条件的状态。这是医疗保健中的一个难题,因为在每个时间点都有很多关于病人的未知信息。

奖励功能

在许多现实世界的问题中,找到一个好的奖励函数是具有挑战性的。医疗保健也不例外,因为通常很难找到一个奖励函数来平衡短期改善和整体长期成功。例如,在脓毒症的情况下,血压的周期性改善可能不会导致结果的改善。相比之下,最后只给出一个奖励(生存或死亡)意味着一个很长的序列,没有任何中间反馈给代理人。通常很难确定哪些行为(或不行为)导致了奖励或惩罚。

RL 渴望数据

几乎所有深度强化的重大突破都是基于多年的模拟数据。显然,当您可以通过模拟器轻松生成数据时,这就不是什么问题了。但是,正如我在以前的许多文章中所描述的那样,特定治疗的数据通常很少,这些数据需要付出巨大的努力来注释,并且由于 HIPPA 合规性和 PHI,医院/诊所对共享他们的数据非常谨慎。这为将深度 RL 应用于医疗保健带来了问题。

非平稳数据

医疗保健数据本质上是非静态和动态的。例如,患者可能会在不一致的时间间隔记录症状,并且一些患者会比其他人记录更多的生命体征。治疗目标也可能随着时间的推移而改变。虽然大多数论文关注的是降低整体死亡率,例如,如果患者的病情有所改善,关注点可能会转移到缩短住院时间或其他目标上。此外,病毒和感染本身可能会以训练数据中未观察到的动态方式快速变化和进化。

有趣的近期研究

既然我们已经解决了医疗保健中关于强化学习的一些最大挑战,让我们看看一些令人兴奋的论文以及他们如何(试图)克服这些挑战。

  • 深度强化治疗脓毒症

这篇文章是最早直接讨论深度强化学习在医疗保健问题中的应用的文章之一。在这篇文章中,作者使用了 MIMIC-III 数据集的脓毒症子集。他们选择将作用空间定义为由升压药和静脉注射液组成。他们将药物剂量分成四组,每组包含不同数量的药物。核心网络是具有独立价值流和优势流的双深度 Q 网络。基于测量器官衰竭的 SOFA 评分,奖励函数是临床激励的。为了评估,他们使用了戈特斯曼所谓的 U 型曲线。具体来说,他们将死亡率视为处方政策与实际政策之间剂量差异的函数。

  • 强化学习与行动衍生奖励化疗与临床试验给药方案选择

本文描述了一种通过强化学习寻找化疗患者最佳治疗策略的方法。本文还使用 Q-Learning 作为底层模型。对于一个行动空间,他们制定了一定数量的剂量给定的持续时间,代理人能够从中进行选择。剂量周期只能以专家确定的频率启动。在每个周期结束时计算转换状态。回报函数被定义为肿瘤直径的平均减少。使用模拟临床试验进行评估。目前还不清楚这些模拟是如何建立的,但这种类型的模拟通常包含病理和统计数据。

  • 用递归神经网络监督强化学习进行动态治疗推荐

本文将监督式 RL(通过演员评论方法)与 RNNs 一起用于学习整体治疗计划。这篇论文值得注意的是,它试图利用完整的 MIMIC-III 数据集,为所有患者提供治疗,而不仅仅是一个子集。该设置基本上包含三个主要组件:基于患者状态推荐药物的参与者、评估这些药物的价值以鼓励或阻止它们的批评家网络,以及用于通过总结历史观察来帮助克服部分可观察性问题的 LSTM。动作空间是 1,00 种确切的药物或 180 种药物类别。作者根据估计的住院死亡率来评估他们的方法。

  • 对医疗登记数据进行动态治疗方案的深度强化学习

Image from article detailing using RL to prevent GVHD (Graft Versus Host Disease).

这是一篇有趣的论文,旨在为各种动态治疗方案提供一个框架,而不像以前的论文那样局限于特定的个体类型。作者声明“提出的深度强化学习框架包含一个监督学习步骤,以预测最可能的专家行动;和深度强化学习步骤,以估计动态治疗方案的长期价值函数。”第一步是监督学习,以预测给定患者的一组可能的专家治疗方法,以预防移植物抗宿主病(GVHD),GVHD 是骨髓捐赠后的一种常见并发症,其中捐赠者的免疫细胞攻击宿主的细胞。第二步是 RL 步骤,代理人寻求将并发症的可能性降至最低。

还有一些其他的论文,由于篇幅原因,我就不赘述了,但仍然很有趣。

  • 一种鼓励糖尿病患者身体活动的强化学习系统

这是一篇完全不同的论文,它涉及使用 RL 来鼓励健康的习惯,而不是直接治疗。

  • 脓毒症患者个性化血糖控制的表征和强化学习

这是另一篇关于脓毒症和 RL 的论文。然而,它采用了一种稍微不同的方法,只关注血糖控制。

  • 从观测数据中学习最优策略

这实际上不是一篇强化学习的论文,不管它有多好。它侧重于反事实推理和使用领域对抗性神经网络。

结论

在医疗保健中应用强化技术仍然存在许多挑战。最困难和最突出的是在医疗保健场景中有效评估 RL 算法的问题。其他挑战涉及培训所需的数据量、数据的非平稳性以及数据仅部分可观察的事实。也就是说,有很多最近出现的文献可以帮助解决一些问题。如上所述,我打算在即将举行的 meetu p 会议上深入探讨其中的一些方法。此外,我希望复兴关于医疗保健机器学习的 Slack 频道,所以如果你感兴趣,请加入。

附加注释的参考文献

医疗保健领域的数字医生研讨会强化学习

这是一个非常好的演讲,由 MLHC 的组织者之一做的,关于将 RL 应用于 HIV 治疗。在这里,她以一种清晰明了的方式讨论了许多问题。

在不稳定和竞争环境中通过元学习进行持续适应

这篇论文与医疗保健无关,但我认为它提供了一个很好的框架来处理 MAML 的非固定问题(可能会出现)。此外,(只是直觉)我认为它可能对进化非常快的病毒和 RL 必须快速适应并基于少量数据的其他情况有用。

评估观察健康环境中的强化学习算法

我已经为这篇文章做了大量的采样,但是我认为如果你真的想理解评估,你应该通读这篇文章。

在企业中集成深度学习的路线图

原文:https://towardsdatascience.com/a-roadmap-for-integrating-deep-learning-in-an-enterprise-d99f9be233dd?source=collection_archive---------12-----------------------

未来今日研究所的第 11 份新兴技术年度报告称,深度学习将很快成为每个组织的隐形部分。该报告强调了计算能力的大幅增长和海量数据的可用性是企业内部更广泛采用深度学习的两个关键驱动因素。

Photo by Franck Veschi on Unsplash

所有这些似乎都与一个广泛的共识一致:今年人工智能将突破成为主流。也就是说,每个组织仍然需要一个战略路线图来实现智能自动化的未来,即利用自我开发的算法和系统实时、大规模地做出复杂决策的未来。像机器人流程自动化(RPA)这样的基础技术可以在使企业简化和加速深度学习和真正人工智能的旅程中发挥战略作用。

尽管 RPA 已被证明是一种变革性的技术,但它仍被视为一种工具,用于自动化企业内简单的、基于规则的、低复杂性的流程。不可否认 RPA 在成本、质量和生产率方面的影响,但它仍然普遍缺乏深度学习和人工智能的破坏性声誉。

但是,在人工智能采用和智能自动化的竞赛中,EY 全球首席数据分析官克里斯·马泽伊说,在 RPA 方面有一个“的特殊机会。正如马泽伊解释的那样,将人工智能的智能与 RPA 的运营效率结合起来,有助于加快新兴智能技术在企业中的应用步伐。

大多数进步的 RPA 解决方案已经整合了机器学习驱动的认知组件,这些组件提供了复杂的决策能力,超越了简单的基于规则的自动化。例如,智能自动化软件提供商 WorkFusion 的自动化工具包包括一个认知自动化系统,它与 RPA 一起工作,以自动化更复杂的判断活动,并不断从中学习。

像这样的下一代 RPA 解决方案旨在为企业集成智能自动化技术的紧急迭代提供基础。这些解决方案能够利用深度学习概念的力量,如深度神经网络和 NLP 来增强和提高他们的自我学习能力。

随着深度学习慢慢从研究机构进入主流,它也变得越来越容易获得。事实上,在未来三到五年内,易于使用的深度学习工具预计将成为打包的 SaaS 应用程序和特定功能库的。工具、框架和库的开源也有助于将概念主流化,并加速对深度学习的企业潜力的研究。今天,深度学习的先驱,如谷歌、 AWS 和微软都有开源的深度学习库、训练算法和神经网络模型,使企业更容易使用自己的数据进行深度学习实验。

即使深度学习成为主流— Gartner 预测到 2018 年,80%的数据科学家将在他们的工具包中拥有深度学习——在技术和数据专业知识方面,仍然存在与专门要求相关的挑战,需要解决。但尽管如此,企业将越来越难以忽视深度学习的颠覆性潜力,以解决目前超出传统自动化解决方案范围的复杂业务需求。

针对您的数据科学环境使用 Docker 的简短指南

原文:https://towardsdatascience.com/a-short-guide-to-using-docker-for-your-data-science-environment-912617b3603e?source=collection_archive---------6-----------------------

告别 OS 烦恼,向便携性问好!

Source : Docker + Jupyter teams

为什么

在新系统上开始工作/开始一项新工作或只是简单地分享您的工作,最耗时的部分之一是由于硬件/软件/安全策略等方面的差异而导致的可用工具的变化(或缺少工具)。容器化近年来兴起,作为一种现成的解决方案,可以解决各种应用程序的平台差异,从单用户开发环境(使用 docker 试用JetBrains工具)到高度分布式的生产环境(例如Google CloudDocker)。在本文中,我们将介绍 Docker 作为我们的容器服务,以及开始为数据科学构建定制开发平台所需的步骤。

就个人而言,我认为使用 docker 的最大优势之一就是能够在他人的系统上进行构建。如果一个已经存在的环境满足您的所有需求,您可以简单地从克隆它开始,或者,您可以使用您的 dockerfile 在它的基础上进行构建,使它对您的特定用例更加有用!

如何

让我们讨论几个场景:

方法 A:从您选择的 linux 发行版开始

假设您决定最好从头开始,即从您喜欢的 linux 发行版开始,安装适合您需要的所有软件。通过这种方式,您可以完全控制正在安装的每个软件,并且可以根据需要为每个工具安装特定的版本。这也可能给你最小的图像尺寸,因为你可以跳过任何你不需要的工具。下面显示了这种方法的几个示例 docker 文件:

*# Using ubuntu 18.04 as base imageFROM ubuntu:18.04
RUN apt-get install python3-pip python3-dev && \
    ln -s /usr/bin/python3 /usr/local/bin/python && \
    pip3 install — upgrade pip*

仅此而已。将它复制到一个空文件夹中的文件中,并使用 docker build 构建一个映像,以访问 ubuntu 中的基本 python3。

另一种构建映像的方法是使用 dockerhub 的官方 python 库。您可以使用 docker pull 命令克隆一个映像:

*docker pull python*

方法 B:使用已经安装了所有工具的可用映像

这就是我爱上使用 docker 进行日常工作的原因。Jupyter Docker Stacks 的工作人员已经创建了许多已经安装了不同工具的测试良好、功能齐全且随时可用的映像。从他们的文档中提取的依赖关系树如下所示:

Docker image tree by Jupyter Docker Stacks — Each child contains every tool in the parent image

使用这些图像或对它们稍加修改,对于大多数用例来说就足够了。要使用这些图像中的一个,只需使用“docker run”命令,如果图像不存在,它将被下载。

*docker run -p 8888:8888 jupyter/scipy-notebook*

-p 参数将您的系统端口 8888 镜像到 docker 镜像端口 8888,因此现在,您可以在本地浏览器中启动 jupyter 或 jupyterlab!如果您想以随机方式转发所有暴露的端口,请使用 -P 来代替。这些映像来自 Anaconda 的 python 发行版,正如我前面提到的,您可以从任何映像开始,通过使用 docker 文件并在本地构建来添加额外的工具。

对于我的使用,我已经将使用 Anaconda 的 Julia、Python27 和 Python36 环境添加到了all-spark-notebook映像中。

这个修改后的映像包含以下可从 Jupyter 访问的内核:

  1. 基本 python Jupyter 笔记本环境
  2. Python 3.6
  3. Python 2.7
  4. 斯卡拉
  5. 稀有
  6. 朱莉娅
  7. 火花
  8. Mesos 堆栈

我的图像储存库在 Github 的***上,你可以随意使用和修改。要使用此环境并为工作挂载本地目录,请使用以下命令运行它:*****

*****docker run -P -v "path_to_shared_local_directory":/home/jovyan/work/ -t cvbi/datascience-environment*****

上面的命令做了 3 个重要的步骤。下载并运行容器 cvbi/data science-environment
2。将所有暴露的容器端口转发到随机主机环境端口
3。挂载主机目录“path _ to _ shared _ local _ directory”以从位于 /home/jovyan/work/ 的容器中访问

运行完上述命令后,复制 jupyter 令牌并使用以下命令查看端口映射:

*****docker ps*****

打开您的浏览器访问上述端口,例如 localhost:32780,然后粘贴您的密钥来访问这个 Jupyter 环境。

注意:向映像添加软件意味着增加总的映像大小(显然是),所以在另一个映像上构建肯定会增加第一次运行的总下载大小。

模型选择的“简短”介绍

原文:https://towardsdatascience.com/a-short-introduction-to-model-selection-bb1bb9c73376?source=collection_archive---------4-----------------------

大数据和小数据下的超参数选择和算法选择综述

在这篇文章中,我将讨论构建好的(有监督的)机器学习模型的核心主题:模型选择。这并不是说模型选择是数据科学工作流程的核心,没有高质量的数据,模型构建就是一纸空文。然而,模型选择在建立良好的机器学习模型中起着至关重要的作用。

不同比例的模型选择

那么,模型选择是怎么回事呢?机器学习上下文中的模型选择可以具有不同的含义,对应于不同的抽象级别。

首先,我们可能有兴趣为选定的机器学习方法选择最佳的 超参数 。超参数是我们必须先验指定的学习方法本身的参数,即在模型拟合之前。相反, 模型参数 是作为拟合的结果而出现的参数1。例如,在逻辑回归模型中,正则化强度(以及正则化类型,如果有的话)是必须在拟合之前指定的超参数,而拟合模型的系数是模型参数。为模型找到正确的超参数对于模型在给定数据上的性能至关重要。

另一方面,我们可能希望从一组合格的机器学习方法中选择最佳的 学习方法 (以及它们相应的“最优”超参数)。在下文中,我们将此称为 算法选择 。对于手头的分类问题,我们可能想知道,例如,逻辑回归模型或随机森林分类器是否在给定的任务上产生最佳的分类性能。

“还有一件事”:模型评估

在深入研究模型选择的不同方法的细节以及何时使用它们之前,我们需要讨论“另一件事”: 模型评估 。模型评估旨在估计所选模型的泛化误差,即所选模型对未知数据的表现。显然,好的机器学习模型不仅对训练期间看到的数据表现良好(否则机器学习模型可以简单地记住训练数据),而且对看不见的数据也表现良好。因此,在将模型交付生产之前,我们应该相当确定模型的性能在面对新数据时不会降低。

但是 为什么 我们需要 模型选择和模型评估的区别吗? 原因是过拟合。如果我们用我们用来选择获胜模型的相同数据来估计我们选择的模型的泛化误差,我们将得到一个过于乐观的估计。为什么?
我们来做个思想实验。假设给你一组黑盒分类器,并指示你选择性能最好的分类器。所有的分类器都是无用的——它们输出 0 和 1 的(固定)序列。您评估了数据上的所有分类器,发现它们平均有 50%的正确率。偶然地,一个分类器在数据上比其他分类器表现得更好,比如说,差 8%。您将此性能作为分类器对未知数据的性能估计(即,作为泛化误差的估计)。你报告说你找到了一个比随机猜测更好的分类器。然而,如果你使用一个完全独立的测试集来估计泛化误差,你会很快发现这个骗局!为了避免这样的问题,我们需要完全独立的数据来估计模型的泛化误差。我们将在交叉验证的上下文中回到这一点。

如果数据不是问题

模型选择的推荐策略取决于可用的数据量。如果 有足够的数据 可用,我们可以将数据分成几个部分,每个部分服务于一个特殊的目的。例如,对于 超参数调整 ,我们可以将数据分成三组: 训练/验证/测试 。训练集用于训练与模型超参数的不同组合一样多的模型。然后在验证集上评估这些模型,并且在该验证集上具有最佳性能的模型被选为获胜模型。随后,使用选择的超参数集在训练+验证数据上重新训练该模型,并且使用测试集来估计泛化性能。如果这种泛化误差类似于验证误差,我们有理由相信该模型在看不见的数据上表现良好。最后,在将模型用于“生产”之前,我们根据完整数据(训练、验证&测试集)对其进行重新训练。
因为并非所有的数据都是平等的,所以没有关于数据应该如何分割的通用规则。典型的比例是 50%/25%/25%。无论如何,验证集应该足够大,以测量我们希望能够测量的性能差异:如果我们关心模型之间 0.1%的差异,我们的验证集必须不小于 1000 个样本,但 10000 个样本就足够了。

对于 算法选择 ,按照上面的推理,我们可以使用 几个训练/验证/测试集 ,每个算法一个三元组。由于这种方法对数据要求很高,我们将在下面讨论一种替代方法。

学习曲线,以及它们为什么有用

但是为什么要在模型选择/模型评估之后重新训练模型呢?答案最好用 学习曲线 来说明。在学习曲线中,模型在训练集和验证集上的性能被绘制为训练集大小的函数。 图 1 显示了一条典型的学习曲线:随着训练集规模的增大,训练得分(在训练集上的表现)降低,而验证得分同时增加。高训练分数和低验证分数同时指示模型过度拟合数据,即,对特定训练集样本适应得太好。随着训练集的增加,过度拟合会减少,验证分数会增加。
特别是对于数据饥渴的机器学习模型,在给定的训练集规模下,学习曲线可能尚未达到平稳状态,这意味着当向模型提供更多数据时,泛化误差可能仍会降低。因此,在估计测试集的泛化误差之前增加训练集(通过添加验证集)并在发布模型之前进一步利用测试集数据来拟合模型似乎是合理的。是否需要这种策略很大程度上取决于初始训练集大小的学习曲线的斜率。

Fig. 1: Example of a learning curve.

学习曲线进一步允许容易地说明(统计的) 偏差方差 的概念。在这种情况下,偏差是指错误的(例如,简化)模型假设,这可能导致模型对数据拟合不足。高偏差模型不能充分捕捉数据中存在的结构。另一方面,方差量化了当我们改变训练数据时模型变化的程度。高方差模型对训练数据的微小波动非常敏感,这会导致模型过度拟合。可以使用学习曲线来估计偏差和方差的量:如果训练分数稳定在高水平,而验证分数处于低水平,即,如果训练和验证分数之间存在大的差距,则模型表现出高方差,但是偏差低。相反,具有低方差但高偏差的模型是训练和验证分数都低但相似的模型。非常简单的模型是高偏差、低方差的,而随着模型复杂性的增加,它们变得低偏差、高方差。

模型复杂性的概念可用于创建有助于模型选择的度量。有一些措施明确处理拟合优度和模型简单性之间的这种权衡,例如(AIC)和 贝叶斯信息标准 (BIC)。两者都惩罚模型参数的数量,但奖励训练集的拟合优度,因此最佳模型是具有最低 AIC/BIC 的模型。BIC 对模型复杂性的惩罚力度更大,因此更青睐“错误更多”但更简单的模型。虽然这允许在没有验证集的情况下进行模型选择,但它可以严格地仅应用于参数线性的模型,即使它通常也适用于更一般的情况,例如用于一般的线性模型,如逻辑回归。关于更详细的讨论,参见例如参考文献。[2,3].

分而治之——但是要小心

贯穿以上讨论,我们隐含地假设训练、确认和测试集是从同一分布 中采样的 。如果不是这样,所有的估计都将是完全错误的。这就是为什么在建立模型之前必须确保数据的分布不受数据分区的影响。例如,假设您正在处理不平衡的数据,例如,一个二元目标的数据集只有 10%的情况是肯定的。例如,按照 50%/25%/25%的比例将数据随机分为训练/验证/测试集可能会导致 5%的阳性案例分布在训练集中,15%的阳性案例分布在验证测试集中&,这可能会严重影响算法性能估计。在这种情况下,您可能希望使用(如果您的学习方法需要,可能与过采样或欠采样技术相结合)进行划分。**

最后提醒一句:当处理任务是进行预测的时间序列数据时,必须通过沿着时间轴 拆分 数据来选择训练、验证和测试集。也就是说,“最老的”数据用于训练,最近的数据用于验证,最近的数据用于测试。随机抽样在这种情况下没有意义。****

如果你只有少量数据

但是如果我们只有小数据呢?这种情况下我们怎么做选型评估?模型评估不会改变。我们仍然需要一个测试集来估计最终选择的模型的泛化误差。因此,我们将数据分成两组,一组训练集和一组测试集。与之前的过程相比,我们使用训练集的方式发生了变化。

鱼与熊掌兼得:超参数选择的交叉验证

对于 超参数选择 ,我们可以使用K-折叠 交叉验证 (CV)。交叉验证的工作方式如下:

  1. 我们将训练集分成 K 个更小的集合。注意,关于不平衡数据的警告在这里也适用。
  2. 我们将每个 K 折痕留出一次,如图 图 2 所示。我们在剩余的 K-1 折叠上训练与模型超参数的不同组合一样多的模型,并计算保留折叠上的验证分数。
  3. 对于每组超参数,我们计算平均验证分数,并选择在保留验证集上具有最佳性能的超参数集。或者,我们可以应用“一个标准误差规则”[2],这意味着我们选择最节省的模型(具有最低复杂性的模型),其性能不超过最佳性能模型的标准误差。

随后,我们在全训练集上用选择的超参数集训练模型,并使用测试集估计泛化误差。最后,我们使用训练集和测试集的组合数据重新训练模型。

Fig. 2: Illustration of 5-fold cross-validation.

我们应该做多少次分裂,也就是说,我们应该如何选择 K ?不幸的是,没有免费的午餐,也就是说,没有一个答案总是最好的。如果我们选择 K=N 其中 N 是训练样本的数量,我们处理的是一种叫做 留一交叉验证 (LOOCV)的方法。这里的优点是,由于我们总是使用几乎全部数据进行训练,因此估计的预测性能是近似无偏的,这意味着预测误差的期望值和“真实”预测误差之间的差异非常小。然而,缺点是 LOOCV 的计算量很大,并且方差可能很高,这意味着我们的预测性能估计值可能会在其“真实”值附近剧烈波动。相比之下,如果我们选择 K=5K=10 ,我们预测性能估计的方差较低,但我们的估计可能过于悲观,因为我们仅使用 80–90%的可用数据进行训练(参见上面对学习曲线的讨论)。尽管如此,作为经验法则,推荐 10 倍(或 5 倍)CV[2]。

matryoshka 内部:算法选择的嵌套交叉验证

对于 算法选择 我们需要一个更精细的方法。这里, 嵌套交叉验证 就来帮忙了,如图 图 3 所示,工作原理如下:

  1. 我们将数据分成 K 个更小的集合(外层折叠)。
  2. 每一个 K 折叠我们留出一次。对于每种学习方法,我们然后在剩余的 K-1 折叠上执行K’-折叠 CV(按照上面的程序),其中我们做超参数选择。为简便起见,将具有 K 外折叠和K’内折叠的嵌套 CV 称为KxK’嵌套 CV。 KxK' 的典型值为 5x25x3
  3. 我们使用每个算法的最佳超参数集来估计其在保留折叠上的验证分数。
  4. 然后,我们计算在 K 折叠上的平均验证分数(以及标准偏差),并选择最佳执行算法
    。随后,我们使用完整训练集选择基于 CV 的最佳超参数集,并使用测试集估计泛化误差。

最后,我们使用训练集和测试集的组合数据重新训练模型。

Fig. 3: Illustration of 5x2 nested cross-validation.

嵌套交叉验证的复杂业务

如果我们 不使用在嵌套 CV 程序的内循环 中找到的“最佳”超参数,为什么我们 还要选择超参数?原因是在算法选择中,我们并不是真的对为特定数据样本(我们的训练集)找到最佳算法&对应的超参数集感兴趣。我们更希望算法能够很好地推广,并且如果我们使用稍微不同的数据进行训练,它不会从根本上改变[4]。我们想要一个稳定的算法,因为如果我们的算法不稳定,泛化估计是无用的,因为我们不知道如果算法遇到训练集中的不同数据点会发生什么。因此,如果在内部循环中发现的超参数是不同的,只要在保持集上的相应性能估计是相似的,我们就没有问题。如果它们是,那么不同的超参数很可能导致相似的模型,并且在完整的训练数据上训练算法将再次产生相似的(尽管希望略有改进)模型。

特征选择等预处理 呢?根据经验,监督预处理(包括数据标签)应该在(内部)CV 循环内完成[2]。相比之下,无监督的预处理,如缩放,可以在交叉验证之前完成。如果我们忽略这个建议,我们可能会得到一个过于乐观的性能估计,因为在所有训练数据的基础上选择了相关特征之后,为了验证的目的而搁置数据会在训练和验证之间引入依赖性。这与独立性的假设相矛盾,当我们使用数据进行验证时,独立性是隐含的。然而,通过在内部 CV 循环中进行预处理(如特征选择),我们可能会得到一个悲观的性能估计,因为预处理过程可能会在使用更多数据时得到改善。

当散文不够的时候

如果您想知道如何使用代码 实现这种略微繁琐的嵌套交叉验证过程 ,您可以在这里找到一个 示例(python jupyter notebook with scikit-learn)。

虽然到目前为止还不全面,但这篇文章涵盖了许多关于模型选择的重要概念和“最佳实践”。关于这个主题还有更多要说的,特别是关于模型选择的统计测试和用于估计性能估计的不确定性的基于采样的方法(例如 bootstrapping)。如果这篇文章只是让你开始,请参考参考文献。【1-3】供进一步阅读。

参考

1 机器学习中的模型评估、模型选择和算法选择Sebastian rasch ka。

[2] Hastie T .、Tibshirani R .和 Friedman J,《统计学习的要素》,美国纽约州纽约市:斯普林格纽约公司(2008 年)。

[3]Neptune . ai 博客上的机器学习中模型评估和选择的终极指南。

[4]参见 Stackexchange 讨论此处,此处此处,此处此处。

Python 中的自然语言处理简介

原文:https://towardsdatascience.com/a-short-introduction-to-nlp-in-python-with-spacy-d0aa819af3ad?source=collection_archive---------2-----------------------

自然语言处理(NLP)是数据科学最有趣的子领域之一,人们越来越期望数据科学家能够迅速找到涉及利用非结构化文本数据的解决方案。尽管如此,许多应用数据科学家(STEM 和社会科学背景)缺乏 NLP 经验。

在这篇文章中,我将探索一些基本的 NLP 概念,并展示如何使用 Python 中越来越流行的 spaCy 包来实现它们。这篇文章是为绝对的 NLP 初学者写的,但是需要具备 Python 知识。

你说是 spaCy?

spaCy 是 Matt Honnibal 在 Explosion AI 开发的“Python 中的工业强度 NLP”的一个相对较新的包。它的设计考虑到了应用数据科学家,这意味着它不会让用户在决定使用什么深奥的算法来执行常见任务时感到沉重,而且它的速度很快。非常快(在 Cython 中实现)。如果你熟悉 Python 数据科学栈,spaCy 就是你的 NLP 的numpy——它相当低级,但是非常直观和高性能。

那么,它能做什么呢?

spacy 为任何 NLP 项目中常用的任务提供一站式服务,包括:

  • 符号化
  • 引理满足
  • 词性标注
  • 实体识别
  • 依存句法分析
  • 句子识别
  • 单词到向量的转换
  • 许多方便的方法来清理和规范文本

我将提供其中一些特性的高级概述,并展示如何使用 spaCy 访问它们。

我们开始吧!

首先,我们加载 spaCy 的管道,按照惯例,它存储在一个名为nlp的变量中。声明这个变量需要几秒钟的时间,因为 spaCy 会预先加载它的模型和数据,以便以后节省时间。实际上,这很早就完成了一些繁重的工作,这样就不会在每次对数据应用nlp解析器时产生成本。请注意,这里我使用的是英语语言模型,但也有一个全功能的德语模型,跨几种语言实现了标记化(下面讨论)。

我们对样本文本调用 nlp 来创建一个Doc对象。Doc对象现在是文本本身、文本片段(Span对象)和文本元素(Token对象)的 NLP 任务的容器。值得注意的是,TokenSpan对象实际上没有数据。相反,它们包含指向包含在Doc对象中的数据的指针,并且被延迟评估(即,根据请求)。spaCy 的许多核心功能都是通过对Doc (n=33)、Span (n=29)和Token (n=78)对象的方法来访问的。

In[1]: import spacy 
...: nlp = spacy.load("en") 
...: doc = nlp("The big grey dog ate all of the chocolate, but fortunately he wasn't sick!")

标记化

标记化是许多 NLP 任务中的基础步骤。将文本标记化是将一段文本拆分成单词、符号、标点、空格和其他元素,从而创建“标记”的过程。一种简单的方法是在空格处拆分字符串:

In[2]: doc.text.split() 
...: Out[2]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate,', 'but', 'fortunately', 'he', "wasn't", 'sick!']

表面上,这看起来很好。但是,注意a)它忽略了标点符号,b)它没有拆分动词和副词(“was”、“n t”)。换句话说,它是幼稚的,它无法识别文本中帮助我们(和机器)理解其结构和意义的元素。让我们看看 SpaCy 是如何处理的:

In[3]: [token.orth_ for token in doc] 
...: Out[3]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', ',', 'but', 'fortunately', 'he', 'was', "n't", ' ', 'sick', '!']

这里我们访问 each token 的.orth_方法,该方法返回 token 的字符串表示而不是 SpaCy token 对象,这可能并不总是可取的,但值得注意。SpaCy 识别标点符号,并能够将这些标点符号从单词符号中分离出来。SpaCy 许多标记方法提供了处理文本的字符串和整数表示——带下划线后缀的方法返回字符串,不带下划线后缀的方法返回整数。例如:

In[4]: [(token, token.orth_, token.orth) for token in doc] 
...: Out[4]: [
(The, 'The', 517), 
(big, 'big', 742), 
(grey, 'grey', 4623), 
(dog, 'dog', 1175), 
(ate, 'ate', 3469), 
(all, 'all', 516), 
(of, 'of', 471), 
(the, 'the', 466), 
(chocolate, 'chocolate', 3593), 
(,, ',', 416), 
(but, 'but', 494), 
(fortunately, 'fortunately', 15520),
 (he, 'he', 514),
 (was, 'was', 491),
 (n't, "n't", 479),
 ( , ' ', 483), 
(sick, 'sick', 1698), 
(!, '!', 495)]

这里,我们在一个元组列表中返回 SpaCy 令牌、令牌的字符串表示和令牌的整数表示。

如果您希望避免返回标点符号或空白符号,SpaCy 为此提供了便利方法(以及许多其他常见的文本清理任务)—例如,要删除停用词,您可以调用.is_stop方法。

In[5]: [token.orth_ for token in doc if not token.is_punct | token.is_space] 
...: Out[5]: ['The', 'big', 'grey', 'dog', 'ate', 'all', 'of', 'the', 'chocolate', 'but', 'fortunately', 'he', 'was', "n't", 'sick']

很酷,对吧?

词汇化

与记号化相关的一个任务是引理满足。引理满足是将一个词简化为其基本形式的过程,如果你愿意,可以称之为其母词。一个词的不同用法往往有相同的词根意义。例如,practice, practised and practising本质上都是指同一个东西。人们常常希望将词义与其基本形式相似的词标准化。通过 SpaCy,我们可以用一个令牌的.lemma_方法访问每个单词的基本形式:

In[6]: practice = "practice practiced practicing" 
...: nlp_practice = nlp(practice) 
...: [word.lemma_ for word in nlp_practice] 
...: Out[6]: ['practice', 'practice', 'practice']

这为什么有用?一个直接的用例是机器学习,特别是文本分类。例如,在创建“单词包”之前对文本进行词条匹配可以避免单词重复,因此,允许模型建立跨多个文档的单词使用模式的更清晰的图像。

位置标记

词性标注是分配语法属性(如名词、动词、副词、形容词等)的过程。)到话。共享相同 POS 标签的单词倾向于遵循相似的句法结构,并且在基于规则的过程中是有用的。

例如,在一个事件的给定描述中,我们可能希望确定谁拥有什么。通过利用所有格,我们可以做到这一点(前提是文本语法正确!).SpaCy 使用了流行的 Penn Treebank POS 标签,参见https://www . ling . upenn . edu/courses/Fall _ 2003/ling 001/Penn _ tree bank _ POS . html。使用 SpaCy,您可以分别使用.pos_.tag_方法访问粗粒度和细粒度的 POS 标签。在这里,我访问细粒度的 POS 标记:

In[7]: doc2 = nlp("Conor's dog's toy was hidden under the man's sofa in the woman's house") 
...: 
pos_tags = [(i, i.tag_) for i in doc2] ...: 
pos_tags 
...: Out[7]: [(Conor, 'NNP'), ('s, 'POS'), (dog, 'NN'), ('s, 'POS'), (toy, 'NN'), (was, 'VBD'), (hidden, 'VBN'), (under, 'IN'), (the, 'DT'), (man, 'NN'), ('s, 'POS'), (sofa, 'NN'), (in, 'IN'), (the, 'DT'), (woman, 'NN'), ('s, 'POS'), (house, 'NN')]

我们可以看到“’s令牌被标记为POS。我们可以利用这个标签来提取所有者和他们所拥有的东西:

In[8]: owners_possessions = [] 
...: for i in pos_tags: 
    ...: if i[1] == "POS": ...: owner = i[0].nbor(-1) 
...:         possession = i[0].nbor(1) 
...:         owners_possessions.append((owner, possession)) ...: ...:         owners_possessions 
...: Out[8]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

这将返回所有者拥有元组的列表。如果你想在这方面表现得更好,你可以在一个清单 comprehenion 中这样做(我认为这样更好!):

In[9]: [(i[0].nbor(-1), i[0].nbor(+1)) for i in pos_tags if i[1] == "POS"] 
...: Out[9]: [(Conor, dog), (dog, toy), (man, sofa), (woman, house)]

这里我们使用每个令牌的.nbor方法,它返回一个令牌的相邻令牌。

实体识别

实体识别是将在文本中发现的命名实体分类到预定义的类别中的过程,例如人、地点、组织、日期等。spaCy 使用一种统计模型来对广泛的实体进行分类,包括人、事件、艺术品和国籍/宗教(完整列表请参见文档https://spaCy . io/docs/usage/entity-recognition)。.)

例如,让我们从巴拉克·奥巴马的维基百科条目中选取前两句话。我们将解析这个文本,然后使用Doc对象的.ents方法访问标识的实体。通过在Doc上调用这个方法,我们可以访问额外的Token方法,特别是.label_.label:

In[10]: wiki_obama = """Barack Obama is an American politician who served as ...: the 44th President of the United States from 2009 to 2017\. He is the first ...: African American to have served as president, ...: as well as the first born outside the contiguous United States.""" 
...: 
...: nlp_obama = nlp(wiki_obama) ...: [(i, i.label_, i.label) for i in nlp_obama.ents] 
...: Out[10]: [(Barack Obama, 'PERSON', 346), (American, 'NORP', 347), (the United States, 'GPE', 350), (2009 to 2017, 'DATE', 356), (first, 'ORDINAL', 361), (African, 'NORP', 347), (American, 'NORP', 347), (first, 'ORDINAL', 361), (United States, 'GPE', 350)]

您可以看到模型已经识别的实体,以及它们有多准确(在本例中)。人是不言自明的,NORP 是国家或宗教团体,GPE 识别地点(城市,国家等)。),DATE 表示特定的日期或日期范围,ORDINAL 表示代表某种顺序的单词或数字。

在我们讨论Doc方法的时候,有必要提一下 spaCy 的句子标识符。在 NLP 任务中,想要将文档分割成句子并不罕见。通过访问一个Doc's .sents方法,使用 SpaCy 很容易做到这一点:

In[11]: for ix, sent in enumerate(nlp_obama.sents, 1): 
...: print("Sentence number {}: {}".format(ix, sent)) 
...: 
Sentence number 1: Barack Obama is an American politician who served as the 44th President of the United States from 2009 to 2017\. Sentence number 2: He is the first African American to have served as president, as well as the first born outside the contiguous United States.

原载于 2017 年 3 月 17 日 dataflume.wordpress.com

一个简短实用的使用 Python 从网站上抓取数据的指南

原文:https://towardsdatascience.com/a-short-practical-how-to-guide-to-scrape-data-from-a-website-using-python-888373227d4f?source=collection_archive---------0-----------------------

读者注意:Python 代码在最后被共享

这个星期我不得不为一个客户刮一个网站。我意识到我做得如此自然和迅速,分享它会很有用,这样你也可以掌握这门艺术。【免责声明:本文展示了我的刮痧实践,如果你有更多相关实践请在评论中分享】

这个计划

  1. 确定你的目标:一个简单的 html 网站
  2. 用 Python 设计你的抓取方案
  3. 奔跑&让魔法发挥作用

How much time do you need to scrape a website? A practitioner would take ~10 minutes to prepare the Python script for a simple html website

第一部分:找到你的目标(一个网站)

在我的例子中,我需要从 SWIFT 代码(或法国 BIC 代码)中收集银行的名称。)http://bank-code.net/country/FRANCE-(FR).html网站有 4000 多个 SWIFT 代码和相关银行名称的列表。问题是他们每页只显示 15 个结果。浏览所有页面并一次复制粘贴 15 个结果是不可行的。刮擦对于这项任务来说很方便。

首先,使用 Chrome 的“inspect”选项来识别你需要获取的 html 部分。将鼠标移动到检查窗口(右侧)中的不同项目上,并跟踪代码突出显示的网站部分(左侧)。选择项目后,在检查窗口中,使用“复制/复制元素”并将 html 代码粘贴到 python 编码工具中。

On the right side is the Google Chrome’s “inspection window” you get when using right click / Inspect

在我的例子中,具有 15 个 SWIFT 代码的所需项目是一个“表”

第二部分:用 Python 设计你的抓取方案

a)刮去第一页

就这样,3 行代码,Python 就收到了网页。现在您需要正确解析 html 并检索所需的项目。

记住所需的 html:

它是一个“”元素,id 为“表 ID ”。它有一个 id 属性这一事实很棒,因为这个网页上没有其他 html 元素可以有这个 id。这意味着,如果我在 html 中查找这个 id,除了所需的元素之外,我找不到其他任何东西。它节省时间。

让我们用 Python 正确地做这件事

所以现在我们已经得到了想要的 html 元素。但是我们仍然需要获取 html 中的 SWIFT 代码,然后将其存储在 Python 中。我选择把它储存在熊猫体内。DataFrame 对象,但也可以仅使用列表列表。

要做到这一点,回到 Chrome 检查窗口,分析 html 树的结构,并注意到你必须去的元素。在我的例子中,所需的数据在“tbody”元素中。每个银行及其 SWIFT 代码包含在一个“tr”元素中,每个“tr”元素有多个“td”元素。“td”元素包含了我正在寻找的数据。

The html tree can be described as follows: table, tbody, tr, td

我用下面的代码做了一行:

b)准备自动化

现在我们已经抓取了第一个网页,我们需要思考如何抓取我们还没有看到的新网页。我的做法是复制人类行为:存储一页的结果,然后转到下一页。现在让我们专注于进入下一个网页。

页面底部有一个菜单,允许您进入 swift 代码表的特定页面。让我们检查一下检查器窗口中的“下一页”按钮。

The “>” symbol will lead us to the next page

这给出了以下 html 元素:

现在用 Python 获取 url 很简单:

我们就快到了。
到目前为止,我们已经:
-开发了一个页面的表格的抓取
-识别了下一个页面的 url 链接

我们只需要做一个循环,然后运行代码。我推荐以下两个最佳实践:

1.当你登陆一个新的网页时打印出来:了解你的代码处于进程的哪个阶段(抓取代码可能要运行几个小时)

2.定期保存结果:避免在出错时丢失所有刮到的数据

只要我不知道什么时候停止抓取,我就用惯用的“ while True: 语法进行循环。我打印出每一步的计数器值。我还将每个步骤的结果保存在一个 csv 文件中。这实际上会浪费时间,例如,更好的方法是每 10 或 20 步存储一次数据。但是我选择了快速实现。

代码是这样的:

完整代码(只有 26 行)可以在这里找到:https://github . com/Felix shop/mediu articles/blob/master/Scraping _ SWIFT _ codes _ Bank _ names . py

如果你喜欢这篇文章,考虑发送至少 50 个掌声:)

使用开源 Plotly“Dash”库的简短 Python 教程(第一部分)

原文:https://towardsdatascience.com/a-short-python-tutorial-using-the-open-source-plotly-dash-library-part-i-e59fb1f1a457?source=collection_archive---------4-----------------------

最近,我已经成为 Plotly 的“Dash”Python 库的主要粉丝,该库用于数据可视化项目。使用 Dash,可以创建漂亮的图形和数字,然后轻松地将它们作为轻量级 web 应用程序进行分发,而无需编写任何 HTML 或 Javascript 代码。我不认为说在未来 18 个月内,Dash 库将成为最重要的 Python 数据可视化库之一是夸张的——而且它都是开源的(麻省理工学院许可的)。

在最近的一个项目中,我一直在使用 Dash 的一些中级功能,并希望创建一些教程来分享我学到的一些东西。今天,我想重点学习如何在 Dash 中创建动态数据表(这里的是基于原始 Plotly 代码的)。在后续教程中,我们将了解更多高级功能,例如使用 Dash 回调函数来启用/禁用基础应用程序的某些组件。

出于本教程的目的,我们将使用 2011 年美国每个州的农业出口数据和第二个美国每个州的 2014 年人口数据集,这两个数据集都可以在 Github 上获得。

2011 US Agricultural Export Data

2014 Population by US State

假设我们想找出一种可视化每个州的牛肉、猪肉和家禽出口的方法(在后面的教程中,我们将查看出口数据与该州人口的交叉引用)。我们将一步一步地介绍应用程序的每个部分——如果你很着急,可以跳到最终产品的最后代码嵌入部分。

首先,我们需要导入必要的 Python 模块,然后加载数据。

重要提示:‘dash _ table _ experiments’尚未完全稳定,因此在安装 Dash 库时,默认情况下不包括它。要使用 pip 安装,只需在您激活的环境中键入:' pip install dash-table-experiments '。

接下来,我们需要定义应用程序的布局。我最近特别喜欢动态 Dash“数据表”,所以让我们使用下面的代码在布局中定义一个这样的表。

记下我们上面创建的组件的 id,因为接下来我们需要编写两个应用回调来启用表的动态属性。第一个回调等待用户点击子情节中的一个条,然后高亮显示表格中的那一行。相反,第二个回调基于用户在表中选择的行创建和更新条形图。在回调之后,我们将调用附加到外部 CSS 文件中以进行样式化,然后最终运行应用程序。

The finished app created using the Plotly “Dash” Python library

现在,如果我想找出最大的牛肉出口州,我可以很容易地对表进行排序,图表将动态更新。这并不令人惊讶,但我们可以很快看到德克萨斯州、内布拉斯加州和堪萨斯州是美国前三大牛肉生产地。

在下一个教程中,我们将看看如何使用更高级的回调来交叉引用农业数据和州人口数据。在此之前,这里是这个应用程序的最终代码!

使用开源 Plotly“Dash”库的简短 Python 教程(第二部分)

原文:https://towardsdatascience.com/a-short-python-tutorial-using-the-open-source-plotly-dash-library-part-ii-caddde82ee06?source=collection_archive---------5-----------------------

在上一篇教程中,我们使用 Python 的开源 Plotly“Dash”库创建了一个相当简单的数据仪表板。具体来说,我们研究了如何创建一个动态表来可视化美国各州的农产品出口。在数据科学项目中,我经常发现自己想要从多个数据库和用户输入标准中查询数据。我可以简单地加载我需要的所有数据,作为 Dash 应用程序的初始化步骤。然而,这是低效的,尤其是在涉及大量数据的情况下。我们如何修改现有的应用程序来做到这一点?请继续阅读…

为了举例,假设我们想要交叉引用美国各州的农业出口与该州的人口。显然,该州的人口数据集很小,但是想象一下这样一种情况:想要将数据交叉引用到该州发生的每个农业交易的时间序列。在这种情况下,让用户只在需要时运行查询会更有效。我们可以通过在应用程序中包含一个“运行查询”按钮来实现这一点,如果(且仅如果)从表中选择了一个州,则启用该按钮。

Mock-up of updated app with cross-referencing query function

首先,我们用 query 按钮更新我们的应用程序布局,并添加一个文本区域,在运行查询后,将在该区域中输出该州的人口。

很好,现在我们有了一个按钮和文本输出区域——但是我们如何合并逻辑呢?为此,我们需要为我们的应用程序创建两个新的回调。

我们的查询按钮现在可以在应用程序中通过选择表中的单个行来启用。单击“运行查询”后,该州的人口数将返回到文本框中!

App updated with query to cross-reference state population

完整应用程序的最终代码如下所示。敬请关注未来更多教程!

模糊时间序列的简短教程

原文:https://towardsdatascience.com/a-short-tutorial-on-fuzzy-time-series-dcc6d4eb1b15?source=collection_archive---------3-----------------------

介绍

时间序列分析和预测方法在工程、医学、经济、气象等许多领域都是不可缺少的。

有几种分析和预测的方法,从传统的和神圣的统计工具(ARMA,ARIMA,萨里玛,霍尔特-温特斯等),到新的计算智能工具(递归神经网络,LSTM,GRU 等)。没有完美的方法,也没有我在这里介绍的方法。但是模糊时间序列的一些关键特征使它成为一个吸引人的选择:

  • 可读性
  • 易处理
  • 简单
  • 可量测性

此后,我将假设你没有机器学习(侧重于模糊系统)和时间序列背景,我将提出这些领域的关键概念。然后将借助 pyFTS 库介绍模糊时间序列方法。走吧。

什么是模糊集?

Source

如果你已经知道模糊逻辑和模糊集,你可以继续下一节。这里介绍的只是非常入门的概念!

逻辑理论和经典数学将集合定义为二分法:每个元素都在集合之内或之外。没有中间点!元素的隶属度是一个布尔值,即集合{0,1}上的一个值,它给每个集合强加了严格且不可改变的边界。

这种二分法的思维方式对人类来说是不舒服的,因为无数的现实并非如此。当我们试图用严格的界限将人分类时会有困难,例如:体重= {瘦,苗条,胖},年龄= {儿童,青少年,青年,成人,老年人},身高= {低,中,高}。如果我们要描述一个至少在其中一个方面使用了这些概念的人,我们会发现这个人可能处于这两个值之间的中间类别。但是经典/刚性集合没有给我们这种灵活性。

扎德(1965)提出的模糊逻辑提出了一个对偶来代替这种二分法:某个元素在某些层次上可能属于也可能不属于同一个集合,这样隶属度就是区间[0,1]中的一个值。模糊集没有严格的界限,它们通常是重叠的,因此,使用前面的例子,我可以是中高和中等,或者 90%中等和 10%高。

给定 X ,一个数值变量,使得 x∈ℝ——例如一个高度度量——它的论域,缩写为 U ,是这个变量可以取值的范围,例如u =【min(x),max(x)】

A 语言变量 A 是数值变量 X 的值到一组单词/语言术语的转换(我们称之为模糊化)。每个单词/语言术语是一个模糊集∈,每个模糊集关联到一个函数 μ (mu 希腊文字母),这样μ:X→【0,1】(这意味着μ从 X 接收一个输入值,并在区间[0,1]返回一个输出值)。**

让我们回到数字变量高度,以厘米为单位。我们将 U = [20,220] 和语言变量γ定义为:

*= {*“非常小”、“小”、“矮”、“中”、“高”、“非常高” }

你明白我们在做什么吗?我们想停止处理 X 的数字数据,开始处理用γ表示的词汇,为此我们需要为每个集合映射 X 的值。

我们将把 U 分成 6 个重叠区间,每组度∈度一个区间。对于每个区间,我们关联一个μ°( X)函数。隶属函数有几种类型,但为了简化起见,我们将使用三角形隶属函数。三角形隶属函数可以定义为:

*def triangular(x, a, b, c):
    return max( min( (x-a)/(b-a), (c-x)/(c-b) ), 0 )*

其中 a、bca 在左边, b 在上边, c 为右点绘制三角形。当给定的输入值 x 等于 b 时,我们说它 100%在模糊集内(换句话说:它的隶属度等于 1)。另一方面,隶属度在区间【a】**【b】上从 0 线性增加到 1,在区间【b,c】上从 1 线性减少到 0。如果 x 小于 a ,或者大于 c ,我们说 x 完全在模糊集之外(int 换句话说:其隶属度等于 0)。

那么,对于语言变量来说,我们的集合会是什么样的呢?

假设一个人身高 163cm。对于变量°,中位数为 0.27,高度为 0.73,即:

μ_median(163) =三角形(163,90,130,175) = 0.2666666…

μ_high(163) =三角形(163,130,175,220) = 0.7333…

查看这里的代码!

ut 仅仅是一个巨大知识领域的开始。如果你想知道更多关于模糊逻辑和模糊系统的知识…

但是我们在这里讨论时间序列,对吗?所以说时间吧!

什么是时间序列?

如果你已经知道时间序列,你可以去下一节,这一节是非常入门的!

T ime 系列是代表一个(或多个)随机变量随时间变化的行为的数据集,其主要特点是该变量的连续记录不是相互独立的,对它们的分析必须考虑到收集的顺序。

根据 Ehlers (2009),“相邻的观察值是相关的,我们有兴趣对这种相关性进行分析和建模”。那是什么意思?为了预测时间序列的未来值,我使用同一序列的过去/滞后值。

一个简单的例子是自回归 AR(p)模型,其中 p 表示用于预测的滞后变量的数量。给定一个时间序列 X(t) ,其中 t 表示一个时刻,如果我们在预测中仅使用滞后,那么我们有一个 AR(1)模型,这将类似于 X(t) = α X(t-1) + ε ,其中 X(t-1) 是滞后值,α是通过统计方法调整的系数,ε表示噪声或随机误差如果我们想在预测中使用最后两个滞后,我们将有一个 AR(2)模型,类似于X(t)=α0X(t-1)+α1X(t-2)+ε。**

什么是滞后量,应该使用什么样的滞后?为了做到这一点,有必要研究时间序列的组成部分并分析它们的特性,使用诸如 ACF 和 PACF 的图表。通常时间序列在高层次上被建模(使用加法模型)为:

X(t) =C(t) + T(t) + S(t) + R(t)

Source

其中:

  • t 是时间指数;
  • X(t)是时间 t 时序列的点估计;
  • C(t)是周期性成分,可预见的短期/非常短期波动;
  • T(t)是趋势分量,表示序列的长期行为。一般趋势是增长/上升或减少/下降,否则就说数列没有趋势;
  • S(t)是季节性成分,是中长期的周期性波动。季节性因素的一个很好的例子是…猜猜看?一年四季!这些 4 个月的间隔有其自身的特点,并且每年重复一次——这使得这种季节性的任何变量都更容易预测。
  • R(t)是噪声分量,一个均值和方差恒定的随机值。这种随机噪声是不可预测的!

不是所有的时间序列都有趋势或季节性。一些数列被认为是平稳的,这意味着它们的平均值(或多或少)是恒定的。在非平稳序列中,平均值随时间变化。在同方差序列中,方差是常数,而在异方差序列中,方差是随时间变化的。总结:平稳和同方差时间序列“表现良好”且更容易预测,而非平稳和异方差时间序列要复杂得多。在后一种情况下,我们可以应用数学变换(如微分、Box-Cox 等)。)使级数平稳且齐次。

但是…模糊集在这个故事中起了什么作用?

什么是模糊时间序列?

Source

使用模糊集对时间序列进行建模和预测几乎是直觉地出现的,首先是基于模糊模型逼近函数的能力,但也基于使用语言变量的规则的可读性,这使得它们更易于专家和非专家分析。

宋(Song)和齐松(Chisson)在模糊时间序列方面做了开拓性工作,但我们在这里介绍陈(Chen)在 1996 年发表的《进化》。这个想法是将时间序列中的论域划分为区间/分区(模糊集),并学习每个区域如何表现(通过时间序列模式提取规则)。这些模型的规则告诉我们,随着时间的推移,当值从一个地方跳到另一个地方时,分区如何与自身相关联。换句话说:让我们创建一个语言变量来表示数字时间序列,这些区域将是我们变量的语言术语。

当我们创建一个语言变量来表示话语的范围时,我们创建了一个“词汇”,然后模糊化的系列由该词汇中的单词组成。这些单词——句子或短语——的顺序是我们需要学习的模式。

为了方便起见,我将模糊时间序列的方法论分为两个步骤:训练和预测。

培训程序

在本教程中,我们将使用模糊时间序列起源中的一个众所周知的时间序列:阿拉巴马大学的入学人数。你可以看到下面的数据:

1。话语论域 U 的定义
首先我们需要从训练数据中知道话语论域 U,比如
U =【min(X),max(X)】。通常我们将上下界外推 20%,作为安全余量。

2。创建语言变量γ(论域划分)
现在我们需要在几个重叠区间(又名划分)上划分 U,并为每个区间创建一个模糊集。区间数是模糊时间序列中最重要的参数之一,它将直接影响模型的精度。

除了分区的数量,我们分割 U 的方式也对准确性有很大的影响。此后,我们采用最简单的分区方法,网格分区,其中所有分区都具有相同的长度和格式。要了解其他分区方法,请点击此处。对于我们的示例数据,我们将使用 10 个分区的方案,这样语言变量就是= { A0,a 1,…,A9 }。**

3。模糊化
现在我们可以将 X(t) 的数值转化为语言变量γ的模糊值,产生模糊时间序列 F(t) 。提醒一下
上的模糊集是重叠的总是好的,因此对于每个 x ∈ X(t) 来说,它可能属于不止一个模糊集Ai∈16。在 Chen 的方法中,事情稍微简单一点:只选择最大隶属度模糊集。然而,在其他 FTS 方法中,所有的模糊值都被考虑。**

使用陈氏方法,我们的测试数据的模糊值将是 F(t) = { A1,A2,A2,A3,A4,A4,A4,A5,A5,A4,A4,A4,A4,A4,A4,A5,A7,A8,A8,A7 }。

4。创建时间模式
时间模式表示在模糊时间序列 F(t) 上顺序出现的两个模糊集,并且具有格式
先例→后果,其中先例表示在时间 t 上出现的模糊集,而后果表示在时间 t+1 后不久出现的模糊集。

对于前面的例子,生成的时间模式将是:
A1→A2,A2→A2,A2→A3,A3→A4,A4→A4,…,A8→A8,A8→A7

5。创建规则
我们的模型规则也有格式
先例→结果。鉴于先前生成的时间模式,我们将根据其先例对它们进行分组。我们的模型将为每个发现的独特先例包含一个规则,每个规则的结果将是具有相同先例的每个时间模式的所有结果的联合。

对于前面的例子,生成的规则将是:
A1 →A2
A2 →A2,A3
A3 →A4
A4 →A4,A5
A5 →A4,A5,A7
A7 →A8
A8 →A7,A8

Rule visualization

事实上,这套规则不符合 FTS 模式。它们描述了我们的时间序列如何表现,如果它足够稳定(表现良好),我们可以使用这个模型来预测时间的下一个值。

这样一个简单易读的模型还有另一个优点:

a)非常容易并行化/分布,这使得它对大数据非常有吸引力;

b)它非常容易更新,这使得它对频繁变化的数据非常有吸引力。

但是我们如何将这些规则用于预测呢?

预测程序

既然我们知道时间 tx(t) ∈ X(t) 的数值,我们现在要预测下一个瞬间, x(t + 1)

1。输入值模糊化 输入值 x(t) 将被转换成语言变量的模糊值,生成值 f(t) 。因为在训练过程中,只选择最相关的集合。**

对于示例数据,对于 t = 1992 ,该值为 x(t) = 18876 。模糊化 x(t) 最相关的集合是 A7,所以 f(t) = A7

2。寻找相容规则
寻找其先例等于 f(t) 的规则。规则的结果将是对 t + 1 的模糊预测,即 f(t + 1)

对于 f(t) = A7 ,我们有规则 A7 → A8 。那么 f(t + 1) = A8

3。现在你需要将 f(t + 1) 转换成一个数值。为此,我们使用质心方法,其中数值等于模糊集合的中心的平均值 f(t + 1) ,即 x(t+1) = n⁻ ∑ Ai ,对于 i = 0..n-1n 等于 f(t+1) 中的组数。

由于 f(t + 1) 只有一组,那么 x(t + 1) = 19366.46。

他展示的模型非常简单,而且我必须说,是过时的(它来自 1996 年!!!).但它是理解模糊时间序列如何工作的一个很好的指南。现在最精确的方法使用更多的滞后(这种方法仅使用 t-1 滞后)、规则中的权重(来自 Yu (2005)的工作)、优化器来寻找最佳的集合数、滞后等。在接下来的教程中,我们将深入研究更高级的模型。

上面解释的所有程序都可以在这台谷歌 Colab 笔记本上重现。

现在是时候去玩一会儿,把我们的手弄脏了!!!!😃

pyFTS 图书馆

pyFTS:Fuzzy Time Series for Python库是在巴西米纳斯吉拉斯联邦大学(UFMG)的 MINDS —机器智能和数据科学上开发的,面向学生、研究人员、数据科学家或希望利用模糊时间序列方法的人。PyFTS 是一个持续发展的项目,欢迎所有的贡献!

让我们了解一下这个图书馆的一些主要特点:

1。测试数据

在 pyFTS.data 包中有几个常见时间序列的数据集,如 TAIEX、纳斯达克、标准普尔 500、乘客等。每个数据集都有自己的特征,有些是单变量的,有些是多变量的,等等,但是所有的数据集基本上都有两个功能:

  • get_data() :返回单变量时间序列
  • get_dataset() :返回多元时间序列
**from pyFTS.data import Enrollmentstrain = Enrollments.get_data()**

2。数据转换

在 pyFTS.common.Transformations 包中,可以对预处理和/或后处理数据使用几种数据转换,这直接影响了论域的划分。

**from pyFTS.common import Transformations
tdiff = Transformations.Differential(1)**

3。分割者

在 pyFTS.partitioners 包中是话语划分器的领域。每个划分器都具有表示语言变量、创建话语论域及其模糊集的划分的功能。在所有这些函数中,至少需要两个构造函数参数:

  • 数据:(必填!)的列车数据;
  • npart :(强制!)要建立的模糊集的最小数量;
  • mf :将用于模糊集合的隶属函数,默认为三角函数(trimf)。各种隶属函数可以在 pyFTS.common.Membership 中找到;
  • 变换:如果系列中使用了任何变换,应在此处报告。
**from pyFTS.partitioners import Grid, Entropy, Util as pUtilfs = Grid.GridPartitioner(data=train, npart=20)print(fs)**

我们可以探索几种话语划分器宇宙的几种替代方案,每一种都有自己的特点和性能。

4。模糊时间序列方法

各种方法可以在包 pyFTS.models 中找到。所有方法都继承自类 common.fts.FTS 。对于最终用户来说,有两种主要的方法需要了解:

  • FTS.fit(data,partitioner=fs):根据关于参数数据的训练数据和已经由 fs 分割器构造的语言变量来训练模型。建议研究该功能的帮助,因为这里已经可以使用集群显示进行分布式训练。与 pySpark 兼容的版本也会尽快发布。
  • FTS.predict(data,type='point ',steps_ahead=1):它使用已经训练好的模型根据数据中包含的滞后进行预测。有三种可能的预测类型,由“类型”参数指示:“点”(默认)、“间隔”和“分布”。选择方法时应该小心,因为不是所有的方法都适用于所有这些类型。最后,' steps_ahead '参数表示预测范围,或者您希望预测向前多少步。
**from pyFTS.models import chenmodel = chen.ConventionalFTS(partitioner=fs)
model.fit(train)print(model)forecasts = model.predict(test)**

有几个型号需要探索,所以请看一下示例代码。

向前看——第二次会更好

在本教程的第二部分,我将讨论加权方法、高阶模型、多元模型和多步预测。我还应用这些模型来预测光伏能源。

第三部分讲区间和概率预测,非平稳性,概念漂移和时变模型。

一定要看完!

参考

陈希明。基于模糊时间序列的招生预测。模糊集与系统,第 81 卷,第 3 号,第 311-319 页,1996 年。网址:https://doi . org/10.1016/0165–0114(95)00220–0。Acess 于 2018 年 7 月 25 日。

Ehlers,r . s .anáLise de séries temporais巴拉那联邦大学统计局。网址:【http://conteudo.icmc.usp.br/pessoas/ehlers/stemp/stemp.pdf 。Acess 于 2018 年 7 月 25 日。

莫勒廷,托罗伊,C.M.C. 时间的分析。布吕歇尔,2004 年

Silva,P. C. L .等人pyFTS:Python 的模糊时间序列,4.0 版。网址:https://doi.org/10.5281/zenodo.597359。Acess 于 2018 年 7 月 25 日。

宋、羌;模糊时间序列及其模型。模糊集与系统,第 54 卷,第 3 号,第 269–277 页,1993 年。网址:https://doi . org/10.1016/0165-0114(93)90372-O。Acess 于 2018 年 7 月 25 日。

俞慧光,加权模糊时间序列模型在预测中的应用。物理 A:统计力学及其应用,第 349 卷,第 3 期,第 609–624 页,2005 年。网址:https://doi.org/10.1016/j.physa.2004.11.006。Acess 于 2018 年 7 月 25 日。****

洛杉矶扎德模糊集。信息与控制 8(3)338–353,1965 年。网址:https://doi . org/10.1016/s 0019-9958(65)90241-X。Acess 于 2018 年 7 月 25 日。

模糊时间序列的简短教程—第二部分

原文:https://towardsdatascience.com/a-short-tutorial-on-fuzzy-time-series-part-ii-with-an-case-study-on-solar-energy-bda362ecca6d?source=collection_archive---------4-----------------------

通过对太阳能的案例研究

在本教程的第一部分中,我简要解释了时间序列分析、模糊集以及什么是模糊时间序列 pyFTS,并简要介绍了 pyFTS 库。太棒了!我从世界各地的人们那里得到了反馈,我听到了他们提出的非常好的想法。但是,正如在每个介绍性研究中发生的那样,我们使用了非常简单的方法和数据,目的是促进对这种方法的总体理解。

但是现在,假设读者已经知道了所需的背景,我们可以稍微前进一点,玩一些更有用的东西。首先,我们将看到对偏差/方差概念的直观介绍,然后我们将了解一些最重要的 FTS 超参数及其对模型准确性的影响。最后,我们将采用一些 FTS 模型来模拟和预测太阳辐射时间序列,这对光伏能源预测很有用。

本教程的所有例子都可以在谷歌实验室,http://bit.ly/short_tutorial_colab2获得。随时联系,给 ou 反馈,提问。现在,让我们开始吧!

信号、噪声、偏差和方差

T 机器学习模型的训练是将信号从噪声中分离出来、将一般行为从局部特殊性和随机误差中分离出来的冲突。在每个估计器的训练中,偏差和方差之间,欠拟合和过拟合之间存在冲突。

给定一个数字时间序列 Y ,它的单个值 y(t)∈Y ,以及 y 的一个估计量,一个函数 ŷ(t+1) = f( y(t) )f目的是预测 Y 的最佳可能方式,使实际值 y(t) 与预测值 ŷ(t) 之间的差值 ε(t) 趋于零,或者换句话说对于ε(t)= y(t)**t→∞来说

直观地说,有偏估计量是指ε (t)的期望值不为零— E [ε (t)] ≠ 0 的估计量。偏差是正确值的系统“偏差”,请记住,估计值通常会与真实值有偏差,这是意料之中的,但平均而言,这些偏差应该趋于零。这种偏差是典型的欠拟合模型,当模型不能学习信号,我们感兴趣的时间序列的组成部分。

Source

另一方面,方差与模型的泛化能力有关,尤其是在训练阶段没有提供的数据。当模型开始学习不能很好地概括测试数据的训练样本的特异性时,高方差与过拟合有关。简而言之:模型学习了数据的噪声。

众所周知,完全消除偏差和方差的副作用是不可能的,最佳拟合是通过它们之间的平衡来实现的——这是估计模型的挑战。

模糊时间序列参数

Fonte

几个参数决定了 FTS 模型的最佳拟合,但主要的参数是分区和顺序。这两个参数占模型准确率的 90%(经验值)。

1.分割

分区由三个参数组成,这里根据它们的重要性列出:

1a)分区(或模糊集)的数量

这是对模型精度影响最大的参数。模糊集越多,对时间序列特征的捕捉就越精确。这里有一个陷阱:

  • 由于信号过度简化,太少的模糊集产生欠拟合;
  • 过多的模糊集会产生过拟合,使得模型开始学习数据上的噪声;

Several numbers of partition for the sine function

Accuracy of several partitionings for sine function

组数是一个必须进行基准测试的参数。在已经被区分的时间序列中,10 个分区是一个好的开始数字。在其他情况下,35 个分区是一个很好的数字。

1b)分区类型

有许多类型的分区,从网格分区(GridPartitioner)到分区器,网格分区中所有集合均匀分布并具有相同的格式,分区器中集合具有不同的大小,如基于熵的分区器和基于簇的分区器。这里我不会深入讨论这个问题,但是出于好奇在 PYFTS/notebooks 存储库中有几个分区类型的例子。

总是从网格划分开始,如果是这样的话,探索其他类型。

1c)隶属函数

这是一个对模型的准确性几乎没有实际影响的参数,但是根据具体情况,您可能有很好的理由使用高斯或梯形函数来代替默认的三角函数。

理由之一可能是参数的数量(高斯型使用 2,三角形使用 3,梯形使用 4),模型的易读性,甚至与过程和数据的性质相关的其他问题。

同样,我不会在这里深入讨论这个问题,看看 PYFTS/notebooks 存储库,了解更多细节。

2.命令

模型的阶是 FTS 的第二个最重要的参数,因为它们是自回归模型(使用滞后值来预测下一个模型)。序参数是模型的内存大小,或者说需要多少过去的信息来描述未来的事件。

为了确定这个参数,熟悉自相关函数的概念——ACF 是很重要的。ACF 不仅能够指示最重要滞后的顺序和索引。

2a)滞后(或订单)数量

顺序是模型使用的滞后量(过去的值)。这真的非常重要,并且取决于被建模的时间序列的类型。这里的问题是:我需要多少滞后来让模型学习时间模式、周期、季节性等等?看看 ACF,看看有多少是显著的滞后。

Model accuracy by order

然而,这里有一个陷阱:当模型使用更多的滞后时(特别是当分区数量很大的时候!)并且模型越大,学习和推理变得越慢。

根据我的经验,描述一个时间序列行为不超过 3 个滞后。但是当然一切都取决于数据。

2b)滞后指数

默认情况下,模型会按顺序选择最近的滞后。但是根据时间序列的季节性,这些可能不是最好的滞后。所以看看 ACF,看看哪个滞后指数是最重要的。

3.方法的类型

关于 FTS 方法的文献非常多样化,但有两个特征极其重要:

3a)有重量与无重量

权重增加了模型的准确性,平衡了模型规则中的哪些设置对预测更有影响。它们稍微降低了模型的可读性,但没什么大不了的。如果你必须选择,总是喜欢加权模型!

在下面的例子中,我们可以比较 HOFTS(无权重)、WHOFTS(规则的结果权重)和 PWFTS(规则的结果权重和先例权重):

3b)单变量与多变量

大多数时候,我们只有一个变量的时间序列——内生变量。其他时候,我们可以利用其他信息(外生变量)来辅助这个变量。

例如,通常与时间序列测量相关的日期,对于季节性数据(如社会、环境等)来说是非常有价值的信息。数据。

如果你有多变量数据,那么首先要知道变量之间是否存在相关性,所以使用相关矩阵来检查它。相关系数指向简单的线性关系,因此它不应该是您应该使用的唯一工具,交叉熵是一个很好的替代方法。

另一个提示:如果您有一个单变量时间序列,您可以通过创建一个多变量序列来丰富您的模型,其中其他变量是内生变量的转换。例如,您可以拥有一个包含原始(内生)变量和微分内生变量的多元序列,从而提供有关值的最近波动的额外信息。

案例研究:太阳辐射

是时候找点乐子了!请记住:所有代码和结果都可以在 http://bit.ly/short_tutorial_colab2 的 T2 获得。我将使用来自 SONDA——巴西国家环境数据组织系统的太阳辐射数据,特别是来自巴西利亚/DF 站的数据。辐射数据在“glo_avg”变量中,每天 24 小时每分钟采样,从 2013 年到 2014 年用于训练集,从 2015 年用于测试。

正如预期的那样,数据有点嘈杂,不太需要每分钟采样。我清理了数据,删除了其他变量(它们与我们的主变量相关性不是很大),只留下了日期和内生变量。下一步是减少数据量和清除噪音,我通过对系列的每小时平均值进行采样来完成。预处理后的数据可从地址https://data . world/petroniocandido/sonda-BSB-average-hourly获得。

直观上,太阳辐射有两个主要周期,日周期(太阳自转运动)和年周期(太阳平移运动)。影响这种预测的最大不确定性是天气和天空中是否有云。

Sample of the yearly cycle

Sample of the daily cycle

Autocorrelation function for the first 24 lags, correspondig for the previous 24 hours

适合各种口味的方法

正如一样,您已经知道 pyFTS 库中的方法在模型包中。然后我们将分析几个 FTS 模型在这个时间序列建模中的表现。在现实世界中,我们应该通过测试上述所有参数的众多组合来优化模型的超参数。在 pyFTS 中,我们可以使用超参数包,您可以在其中运行分布式网格搜索,这将在每个超参数的所有可能值之间生成笛卡尔乘积,并测试每个值。你也可以使用遗传算法(超参数。进化的或使用远视库。但让我们简单点,好吗?

我们将使用具有 35 个分区的网格方案(GridPartitioner)划分我们的内生变量,分为 5 个亚组,VL-非常低,L-低,M-中,H-高和 VH-非常高,每个亚组有 7 个水平。这种命名法将通过生成以下规则使模型更易于解释:

L6 L5→L6 M0 M1

这条规则可以理解为:

如果 y(t-1) 低(子级 5) y(t) 低(子级 6) 那么【t+1】将为低(子级 6) 中(子级 0)

根据所选择的规则(由于规则的先例的成员与输入值相关),去模糊化将把结果转换成数值(一个简单的方法是集合的加权平均)。

Grid partitioning of solar radiation time series

单变量方法

我们已经有了分区方案,所以让我们来研究一下方法。我们选择了带权重和不带权重的高阶方法(阶数> 1 ),所有方法都用 1 到 3 的阶数进行了测试。下面列出了生成规则的方法和示例:

  • 霍夫茨。HighOrderFTS :高阶失重法
L4,VL0 → VL0,VL1
L5,VL0 → VL0,VL1
  • hofts。weightedhigorderfts:高阶加权法,权重只在每个规则的后件上。
L4,VL0 → VL0 (0.5), VL1 (0.5)
L5,VL0 → VL0 (0.5), VL1 (0.5)
  • pwfts。probabilistic weighted FTS:高阶加权方法,其中概率权重基于每个规则的前件和后件。
(0.003) L0,VL1 → (0.876)VL0, (0.103)VL1, (0.015)VL2, (0.006)VL3, (0.001)VL4(0.003) L0,VL2 → (0.003)L0, (0.003)L1, (0.003)L2, (0.0)L3, (0.0)L4, (0.787)VL0, (0.164)VL1, (0.03)VL2, (0.002)VL3, (0.002)VL4, (0.005)VL5, (0.001)VL6

Performance sample of univariate models

多元方法

在pyft 上,多变量模型使用 Pandas 数据帧作为数据输入(单变量模型使用列表或 Numpy 数组),方法在 models.multivariate 包中。每个变量都有自己的分区方案和其他参数。您必须首先创建一个变量类型的对象,说明变量的名称、数据帧中的数据列和分割器。然后使用追加变量函数将外生和内生变量合并到模型中。内生变量必须在目标变量属性中设置。

from pyFTS.models.multivariate import common, variable, mvfts
from pyFTS.models.seasonal import partitioner as seasonal
from pyFTS.models.seasonal.common import DateTimesp = {'seasonality': DateTime.day_of_year , 'names': ['Jan','Feb','Mar','Apr','May','Jun','Jul', 'Aug','Sep','Oct','Nov','Dec']}month = variable.Variable("Month", data_label="data", partitioner=seasonal.TimeGridPartitioner, npart=12,data=train_mv, partitioner_specific=sp)radiation = variable.Variable("Radiation", data_label="glo_avg", alias='rad',partitioner=Grid.GridPartitioner, npart=35, data=train_mv)model = mvfts.MultivariateFTS()
model.append_variable(month)
model.append_variable(radiation)
model.target_variable = radiation
model.fit(train_mv)

除了我们的内生变量“glo_avg ”,我们将只使用“date”列,并从中提取两个外生变量:月份和小时。变量的划分如下所示:

Partitioning scheme by variable

你可能会问自己:为什么时间和月份会重叠?毕竟这是非常准确的信息!回答:那是模糊逻辑的家伙!我们假设相邻的事物相互影响并具有相似的行为,因此特定时间的规则也会受到相邻时间和月份的影响。

现在让我们来看看多元方法,并看看它们生成的规则示例:

  • mvft。MultivariateFTS :失重一阶法(order = 1);
Jan,8hs,VL0 → VL1,VL2,VL3,VL4,VL5
Jan,8hs,VL1 → VL1,VL2,VL3,VL4,VL5,L0,L1,L3,L4
  • wmvfts。Weighted multivariatedfts:加权一阶法;
Jan,8hs,VL0  → VL2 (0.353), VL1 (0.253), VL4 (0.147), VL3 (0.207), VL5 (0.04)Jan,8hs,VL1  → VL2 (0.276), VL3 (0.172), VL1 (0.198), VL5 (0.083), VL4 (0.151), VL6 (0.021), L0 (0.036), L4 (0.005), L1 (0.036), L2 (0.021)
  • 颗粒状。GranularWMVFTS :加权高阶法;
Jan11hsV3,Jan12hsL1  → Jan13hsVL6 (1.0)
Jan12hsL1,Jan13hsVL6  → Jan15hsVL3 (1.0)

对模型进行基准测试

显然,评估预测模型的主要标准是其准确性。我们将使用均方根误差(RMSE ),该值越低越好。但是另一个重要的标准是简约:简单的模型总是比复杂的模型更受欢迎。所以我们的目标是最小化 RMSE 和模型尺寸。让我们看看五个表现最好的模型:

预计多变量模型比单变量模型表现更好,毕竟,它们有更多的信息可以利用。但是请注意,最节省的模型是 PWFTS!

可能性不止于此。我们现在可以决定集合最好的模型(models . ensemble),或者使用非平稳模糊集(models . non stability)。但这是为了另一个机会!

扩大预测范围

当我们采用预测模型时,我们不仅对预测下一个值感兴趣,而且对预测这些值的序列感兴趣。这真的很酷,因为只要有一些滞后的信息,我们就可以对未来的许多步骤做出估计!对于太阳辐射预测的具体情况,我们将我们的预测范围设置为 48 小时。

对于 pyFTS 上的单变量模型,这非常简单,只需使用预测函数的提前步骤参数。该参数将在下一次 steps_ahead 迭代中反馈输入中的输出值。

forecasts = model.predict(input_data, steps_ahead=48)

对于多元模型,这有点棘手:我们不仅生成内生变量的值,还生成外生变量的值。由于这个值的生成取决于每个变量的性质,除了 steps_ahead 参数之外,生成器参数也是必需的,它是一个字典,必须包含每个 Pandas DataFrame 列的一个键,其值是 lambda 函数,接收变量的当前值并返回下一个值。在我们的示例中,这非常简单,因为外生变量的值是日期时间,要计算下一个值,我们只需在输入值上加一个小时:

generator = lambda x : pd.to_datetime(x) + pd.to_timedelta(1, unit='h')forecasts = model.predict(input_data, steps_ahead=48, 
              generators={'date': generator})

Forecasts for the next 48 hours, using the two best evaluated models

结论

现在,您已经对 FTS 和 pyFTS 库有了足够的了解,可以在您的个人项目中使用它们。当然,还有很多东西要谈!在下一个教程中,我们将讨论区间和概率预测、数据转换、非平稳和增量模型等。

如果您需要帮助、提出问题或给出反馈,请随时联系我们。回头见,伙计们!

用于 MNIST 数字识别的简单 2D CNN

原文:https://towardsdatascience.com/a-simple-2d-cnn-for-mnist-digit-recognition-a998dbc1e79a?source=collection_archive---------1-----------------------

卷积神经网络(CNN)是当前用于图像分类任务的最新架构。无论是面部识别、自动驾驶汽车还是物体检测,CNN 都在到处使用。在这篇文章中,我们使用 keras 和 tensorflow backend 为著名的 MNIST 数字识别任务设计了一个简单的二维卷积神经网络(CNN)模型。整个工作流程可以是:

  1. 准备数据
  2. 模型的建立和编译
  3. 训练和评估模型
  4. 将模型保存到磁盘以供重用

[## sambit 9238/深度学习

深度学习——深度学习技术在自然语言处理、计算机视觉等领域的实现。

github.com](https://github.com/sambit9238/Deep-Learning/blob/master/cnn_mnist.ipynb)

准备数据

这里使用的数据集是上面提到的 MNIST 数据集。 MNIST 数据库(修改后的国家标准技术研究院数据库)是一个手写数字(0 到 9)的大型数据库。该数据库包含 60,000 个训练图像和 10,000 个测试图像,每个图像的大小为 28×28。第一步是加载数据集,这可以通过 keras api 轻松完成。

import keras
from keras.datasets import mnist
#load mnist dataset
(X_train, y_train), (X_test, y_test) = mnist.load_data() #everytime loading data won't be so easy :)

这里,X_train 包含 60,000 个训练图像数据,每个数据的大小为 28×28,y_train 包含它们相应的标签。类似地,X_test 包含 10,000 个测试图像的数据,每个维度为 28x28,y_test 包含它们相应的标签。让我们可视化一些来自训练的数据,以更好地了解深度学习模型的目的。

import matplotlib.pyplot as plt
fig = plt.figure()
for i in range(9):
  plt.subplot(3,3,i+1)
  plt.tight_layout()
  plt.imshow(X_train[i], cmap='gray', interpolation='none')
  plt.title("Digit: {}".format(y_train[i]))
  plt.xticks([])
  plt.yticks([])
fig

如这里可以看到的,在左上角,“5”的图像存储为 X _ train[0 ], y _ train[0]包含标签“5”。我们的深度学习模型应该能够只获取手写图像,并预测实际书写的数字。

现在,为了准备数据,我们需要对图像进行一些处理,如调整图像大小、归一化像素值等。

#reshaping
#this assumes our data format
#For 3D data, "channels_last" assumes (conv_dim1, conv_dim2, conv_dim3, channels) while 
#"channels_first" assumes (channels, conv_dim1, conv_dim2, conv_dim3).
if k.image_data_format() == 'channels_first':
    X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
    X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
    X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)
#more reshaping
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape) #X_train shape: (60000, 28, 28, 1)

在对图像信息进行必要的处理后,标签数据即 y_train 和 y_test 需要转换成分类格式,如标签‘3’应转换成向量【0,0,0,1,0,0,0,0,0】用于建模。

import keras
#set number of categories
num_category = 10
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_category)
y_test = keras.utils.to_categorical(y_test, num_category)

模型的建立和编译

数据准备好输入模型后,我们需要定义模型的架构,并使用必要的优化函数、损失函数和性能指标对其进行编译。

此处遵循的架构是 2 个卷积层,然后分别是池层、全连接层和 softmax 层。对于不同类型的特征提取,在每个卷积层使用多个滤波器。一个直观的解释是,如果第一个过滤器有助于检测图像中的直线,第二个过滤器将有助于检测圆等等。对每一层的技术执行的解释将是即将到来的文章的一部分。为了更好地理解每一层,可以参考

在最大池和全连接层之后,在我们的模型中引入了丢弃作为正则化,以减少过拟合问题。

*##model building
model = Sequential()
#convolutional layer with rectified linear unit activation
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
#32 convolution filters used each of size 3x3
#again
model.add(Conv2D(64, (3, 3), activation='relu'))
#64 convolution filters used each of size 3x3
#choose the best features via pooling
model.add(MaxPooling2D(pool_size=(2, 2)))
#randomly turn neurons on and off to improve convergence
model.add(Dropout(0.25))
#flatten since too many dimensions, we only want a classification output
model.add(Flatten())
#fully connected to get all relevant data
model.add(Dense(128, activation='relu'))
#one more dropout for convergence' sake :) 
model.add(Dropout(0.5))
#output a softmax to squash the matrix into output probabilities
model.add(Dense(num_category, activation='softmax'))*

定义了模型的架构之后,就需要编译模型了。这里,我们使用分类交叉熵损失函数,因为它是一个多类分类问题。由于所有标签都具有相似的重量,因此我们更倾向于将准确性作为性能指标。称为 AdaDelta 的流行梯度下降技术用于优化模型参数。

*#Adaptive learning rate (adaDelta) is a popular form of gradient descent rivaled only by adam and adagrad
#categorical ce since we have multiple classes (10) 
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])*

训练和评估模型

在模型架构被定义和编译之后,模型需要用训练数据来训练,以便能够识别手写数字。因此,我们将用 X_train 和 y_train 来拟合模型。

*batch_size = 128
num_epoch = 10
#model training
model_log = model.fit(X_train, y_train,
          batch_size=batch_size,
          epochs=num_epoch,
          verbose=1,
          validation_data=(X_test, y_test))*

这里,一个时期意味着所有训练样本的一次向前和一次向后传递。批量意味着一次向前/向后传递中训练样本的数量。培训输出是:

现在需要根据性能来评估训练好的模型。

*score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score[0]) #Test loss: 0.0296396646054
print('Test accuracy:', score[1]) #Test accuracy: 0.9904*

测试准确度 99%以上意味着模型在预测方面训练有素。如果我们可视化整个训练日志,那么随着更多的历元数,训练和测试数据的模型的损失和准确性收敛,从而使模型稳定。

*import os
# plotting the metrics
fig = plt.figure()
plt.subplot(2,1,1)
plt.plot(model_log.history['acc'])
plt.plot(model_log.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='lower right')plt.subplot(2,1,2)
plt.plot(model_log.history['loss'])
plt.plot(model_log.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right')plt.tight_layout()fig*

将模型保存到磁盘以便重复使用

现在,训练好的模型需要序列化。模型的架构或结构将存储在 json 文件中,权重将以 hdf5 文件格式存储。

*#Save the model
# serialize model to JSON
model_digit_json = model.to_json()
with open("model_digit.json", "w") as json_file:
    json_file.write(model_digit_json)
# serialize weights to HDF5
model.save_weights("model_digit.h5")
print("Saved model to disk")*

因此,保存的模型可以在以后重用,或者很容易移植到其他环境中。在接下来的文章中,我们将看到如何在生产中部署这个经过训练的模型。

享受深度学习!

参考资料:

* [## 顺序模型指南- Keras 文件

Keras 顺序模型入门

keras.io](https://keras.io/getting-started/sequential-model-guide/) [## 用于视觉识别的 CS231n 卷积神经网络

斯坦福 CS231n 课程材料和笔记:视觉识别的卷积神经网络。

cs231n.github.io](http://cs231n.github.io/convolutional-networks/)*

对辛顿胶囊网络的简单而直观的解释

原文:https://towardsdatascience.com/a-simple-and-intuitive-explanation-of-hintons-capsule-networks-b59792ad46b1?source=collection_archive---------9-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

深度学习的复兴

早在 2012 年,机器学习领域发表的一篇论文将引发人工智能领域的复兴。该论文首次发表了使用深度卷积神经网络进行图像识别的研究。它打破了图像识别算法的所有记录。

从那时起,每个人都跳上了深度学习的列车,原因很简单:它一直在工作。事实上,在计算机视觉或自然语言处理中,还没有一个领域应用了深度学习,没有改善结果。研究人员也一直在尝试各种疯狂的配置,并将这些技术应用到许多新的应用中,这对人工智能来说确实是一个令人兴奋的时刻。

下图显示了其中的一些技术。像堆叠许多层、多个子网络、改变卷积大小和跳过连接都在提高精确度和推进研究方面发挥了作用。

A few of the many techniques developed for deep learning in computer vision

…那么有什么问题呢?

深度学习不会在任何地方都有效。

很明显,在过去的几年里,它在很多事情上都做得很好,但是当你使用一段时间后,它的一些缺陷和弱点就会显现出来。

深度学习的失败

卷积神经网络(CNN)的主要构件是卷积运算。在深度网络中,卷积(及其权重)的基本工作基本上是“检测”关键特征。当我们训练一个深度网络时,我们有效地调整了 CNN 卷积运算的权重,以检测图像中的某些特征或被其“激活”。

如果我们在人脸检测数据集上训练一个网络,那么网络中的一些卷积可能由眼睛触发,而其他卷积可能由耳朵触发。如果我们拥有组成一张脸的所有组成部分(或至少一定数量),如眼睛、耳朵、鼻子和嘴巴,那么我们的 CNN 会告诉我们它已经检测到一张脸,万岁!!

但不幸的是,CNN 的影响力仅限于此。让我们看看下面的例图,看看为什么。左边的人脸图像包含了上面提到的所有元素。CNN 很好地处理了这种情况:它看到了所有的组件,即卷积在所有正确的特征上激活。所以我们的网络说是的,那是一张脸!

An example of where a CNN would fail. Source

棘手的是,对于 CNN 来说,右边的图像也是一张脸。你说为什么?对一个网络来说,它拥有一张脸的所有特征。当应用卷积运算时,它们将在所有这些特征上被激活!

需要理解的一件重要事情是,较高级别的特征将较低级别的特征组合为加权和:在被传递到激活非线性之前,前一层的激活乘以后一层神经元的权重并相加。在这个信息流中,没有任何地方考虑到特征之间的关系。

因此,我们可以说CNN 的主要失败在于它们没有携带任何关于特征之间相对关系的信息。这只是 CNN 核心设计中的一个缺陷,因为它们是基于应用于标量值的基本卷积运算。

胶囊有什么帮助

Hinton 认为,为了正确地进行图像识别,保持图像特征之间的层次姿势关系是很重要的。胶囊引入了一种新的构建模块,可用于深度学习,以更好地对网络内部的这些关系进行建模。当这些关系建立到网络中时,它很容易理解它看到的东西只是它以前看到的东西的另一个视图,因为它不仅仅依赖于独立的特征;它现在把这些特征放在一起,形成一个更完整的“知识”表示。

这种更丰富的特征表现的关键是使用了矢量而不是缩放器。让我们回顾一下 CNN 中卷积的基本操作:矩阵乘法(即标量等待),全部相加,标量到标量映射(即激活函数)。以下是步骤:

  1. 标量输入标量的加权
  2. 加权输入的总和标量
  3. 标量到- 标量非线性

通过使用向量代替标量,可以简单地分解胶囊网络的变化:

  1. 输入矢量的矩阵乘法
  2. 输入矢量的标量加权
  3. 加权输入矢量的总和矢量
  4. 矢量 -to- 矢量非线性

Capsules vs traditional neurons

向量有帮助,因为它帮助我们编码更多的信息,而不仅仅是任何一种信息,相关相对信息。想象一下,不仅仅是特征的标量激活,我们认为它的向量包含类似于包含【可能性,方向,大小】的东西。最初的标量版本可能像左边的图一样工作;即使眼睛和嘴唇相对于面部来说很大(95%的可能性),它也能检测到面部!另一方面,胶囊由于其更丰富的矢量信息,看到特征的大小是不同的,因此输出检测面部的较低可能性!请特别注意图表中的分数,以便完全理解。

Left: How a regular CNN would detect facial features. Right: How a capsule network would detect features.

胶囊还有一个好处,就是能够用少得多的训练数据达到很好的准确度。等方差是对可以相互转化的物体的检测。直观上,胶囊检测到脸部向右旋转 20(或向左旋转 20),而不是意识到脸部匹配向右旋转 20 的变体。因此,由于胶囊具有诸如方向、大小等矢量信息,所以它可以在被训练时使用该信息来学习更丰富的特征表示。它不需要 50 个相同的旋转狗的例子;它只需要一个可以很容易转换的向量表示。通过迫使模型学习胶囊中的特征变体,我们可以用更少的训练数据更有效地推断可能的变体。

结论

凭借胶囊提供的丰富信息,它们显示出巨大的潜力,成为我们未来深度网络的主要驱动力。这种丰富性确实带来了新的挑战:更多的数字意味着更多的计算和更多的复杂性。无论如何,人工智能领域一个激动人心的新机遇已经开启。

喜欢学习?

在推特上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上与我联系!

简单且可扩展的分析管道

原文:https://towardsdatascience.com/a-simple-and-scalable-analytics-pipeline-53720b1dbd35?source=collection_archive---------2-----------------------

Source: https://www.flickr.com/photos/bilfinger/14074154115

收集关于应用程序使用和用户行为的数据,例如玩家在游戏中的进度,对于产品团队来说是无价的。通常,整个团队都致力于构建和维护数据管道,以收集和存储应用程序的跟踪数据。然而,随着许多新的无服务器工具的出现,构建用于收集应用程序使用数据的分析管道的障碍已经大大减少。Google 的 PubSub、DataFlow 和 BigQuery 等托管工具使小型团队能够建立可扩展到大量事件的分析管道,同时只需最低的运营开销。这篇文章描述了如何在谷歌云平台(GCP)上建立一个轻量级的分析管道,这个管道是完全管理的(无服务器的)并且可以自动扩展以满足需求。

我受到了谷歌用于手机游戏分析的参考架构的启发。这篇文章的目标是展示一个小团队可以构建和维护一个数据管道,它可以扩展到大型事件量,为数据科学任务提供一个数据湖,为分析团队提供一个查询环境,并具有对其他组件的可扩展性,如应用程序的实验框架。

我用来实现这条数据管道的核心技术是谷歌的数据流,它现在与 Apache Beam 库集成在一起。数据流任务定义了要在事件集合上执行的操作图,这些事件可以是流数据源。这篇文章展示了一个用 Java 实现的数据流任务,它将跟踪事件从 PubSub 主题传输到数据湖和 BigQuery。关于数据流及其概念的介绍可以在谷歌的文档中找到。虽然数据流任务是可移植的,但由于它们现在是基于 Apache Beam 的,这篇文章主要讨论如何将数据流与 GCP 上的其他托管服务结合使用,以构建一个简单、无服务器、可伸缩的数据管道。

My lightweight implementation of the GCP Reference Architecture for Analytics.

执行所有这些功能的数据管道相对简单。管道从 PubSub 读取消息,然后转换事件以实现持久性:管道的 BigQuery 部分将消息转换为 TableRow 对象并直接传输到 BigQuery,而管道的 AVRO 部分将事件批处理到离散的窗口中,然后将事件保存到 Google 存储中。操作图如下图所示。

The streaming pipeline deployed to Google Cloud

设置环境

构建数据管道的第一步是设置编译和部署项目所需的依赖项。我使用了以下 maven 依赖项来为向管道发送事件的跟踪 API 和处理事件的数据管道设置环境。

<!-- *Dependencies for the Tracking API* ->
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-pubsub</artifactId>
  <version>0.32.0-beta</version>
  </dependency>
</dependencies><!-- *Dependencies for the data pipeline* ->
<dependency>
  <groupId>com.google.cloud.dataflow</groupId>
  <artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
  <version>2.2.0</version>
</dependency>

我使用 Eclipse 来编写和编译本教程的代码,因为它是开源的。然而,其他 ide 如 IntelliJ 为部署和监控数据流任务提供了额外的特性。在将作业部署到 Google Cloud 之前,您需要为 PubSub 和 DataFlow 设置一个服务帐户。设置这些凭证超出了本文的范围,更多细节可以在 Google 文档中找到。

运行这个数据管道的另一个先决条件是在 GCP 上设置一个 PubSub 主题。我定义了一个 raw-events 主题,用于发布和消费数据管道的消息。关于创建 PubSub 主题的更多细节可在这里获得。

要部署这个数据管道,您需要用上面列出的 maven 依赖项设置一个 java 环境,设置一个 Google Cloud 项目并启用计费,在存储和 BigQuery 服务上启用计费,并创建一个用于发送和接收消息的 PubSub 主题。所有这些托管服务都要花钱,但有一个免费层可用于构建数据管道原型。

Sending events from a server to a PubSub topic

发布事件

为了构建可用的数据管道,构建封装发送事件数据细节的 API 是很有用的。跟踪 API 类提供了这一功能,并可用于将生成的事件数据发送到数据管道。下面的代码显示了发送事件的方法签名,并显示了如何生成示例数据。

/** Event Signature for the Tracking API 
public void sendEvent(String eventType, String eventVersion, HashMap<String, String> attributes);
*/// send a batch of events    
for (int i=0; i<10000; i++) { // generate event names      
  String eventType = Math.random() < 0.5 ? 
      "Session" : (Math.random() < 0.5 ? "Login" : "MatchStart"); // create attributes to send      
  HashMap<String, String> attributes = new HashMap<String,String>();
  attributes.put("userID", "" + (int)(Math.random()*10000));
  attributes.put("deviceType", Math.random() < 0.5 ? 
      "Android" : (Math.random() < 0.5 ? "iOS" : "Web")); // send the event      
  tracking.sendEvent(eventType, "V1", attributes);      
}

跟踪 API 建立一个到 PubSub 主题的连接,以 JSON 格式传递事件,并实现一个回调来通知传递失败。下面提供了用于发送事件的代码,它基于 Google 的 PubSub 示例,在这里提供。

// Setup a PubSub connection 
TopicName topicName = TopicName.of(projectID, topicID);
Publisher publisher = Publisher.newBuilder(topicName).build();// Specify an event to send
String event = {\"eventType\":\"session\",\"eventVersion\":\"1\"}";// Convert the event to bytes    
ByteString data = ByteString.copyFromUtf8(event.toString());//schedule a message to be published    
PubsubMessage pubsubMessage = 
  PubsubMessage.newBuilder().setData(data).build();// publish the message, and add this class as a callback listener
ApiFuture<String> future = publisher.publish(pubsubMessage);    ApiFutures.addCallback(future, this);

上面的代码使应用程序能够将事件发送到 PubSub 主题。下一步是在完全托管的环境中处理这些事件,该环境可以根据需要进行扩展以满足需求。

存储事件

数据管道的一个关键功能是让数据科学和分析团队可以使用测量的事件进行分析。用作端点的数据源应该具有低延迟,并且能够扩展到大量事件。本教程中定义的数据管道展示了如何将事件输出到 BigQuery 和数据湖,后者可用于支持大量分析业务用户。

Streaming event data from PubSub to DataFlow

这个数据管道的第一步是从 PubSub 主题中读取事件,并将获取的消息传递给数据流流程。DataFlow 提供了一个 PubSub 连接器,它支持将 PubSub 消息流式传输到其他 DataFlow 组件。下面的代码显示了如何实例化数据管道、指定流模式以及使用来自特定 PubSub 主题的消息。这个过程的输出是一组 PubSub 消息,可以存储起来供以后分析。

// set up pipeline options    
Options options = PipelineOptionsFactory.fromArgs(args)
  .withValidation().as(Options.class);    
options.setStreaming(true);    
Pipeline pipeline = Pipeline.create(options);// read game events from PubSub    
PCollection<PubsubMessage> events = pipeline
  .apply(PubsubIO.readMessages().fromTopic(topic));

我们希望存储事件的第一种方式是采用列格式,这种格式可用于构建数据湖。虽然这篇文章没有展示如何在下游 ETL 中利用这些文件,但是拥有一个数据湖是在需要修改数据库时维护数据集副本的好方法。数据湖提供了一种在由于模式变化或数据接收问题而需要时重新加载数据的方法。分配给该进程的数据管道部分如下所示。

Batching events to AVRO format and saving to Google Storage

对于 AVRO,我们不能使用直接分流的方法。在保存到平面文件之前,我们需要将事件分组到批处理中。在数据流中实现这一点的方法是应用窗口函数,将事件分组为固定的批次。下面的代码应用转换,将 PubSub 消息转换为 String 对象,以 5 分钟为间隔将消息分组,并将结果批量输出到 Google Storage 上的 AVRO 文件。

// AVRO output portion of the pipeline    
events
.apply("To String", ParDo.of(new DoFn<PubsubMessage, String>() {
  @ProcessElement        
  public void processElement(ProcessContext c) throws Exception {
    String message = new String(c.element().getPayload());
    c.output(message);        
  }      
}))// Batch events into 5 minute windows      
.apply("Batch Events", Window.<String>into(    
    FixedWindows.of(Duration.standardMinutes(5)))       
  .triggering(AfterWatermark.pastEndOfWindow())     
  .discardingFiredPanes()              
  .withAllowedLateness(Duration.standardMinutes(5))) // Save the events in ARVO format      
.apply("To AVRO", AvroIO.write(String.class)
  .to("gs://your_gs_bucket/avro/raw-events.avro")
  .withWindowedWrites() 
  .withNumShards(8)
  .withSuffix(".avro"));

总而言之,上面的代码将事件分批放入 5 分钟的窗口中,然后将事件导出到 Google Storage 上的 AVRO 文件中。

这部分数据管道的结果是谷歌存储上的 AVRO 文件的集合,可以用来建立一个数据湖。每隔 5 分钟就会生成一个新的 AVRO 输出,下游 ETL 可以将原始事件解析为经过处理的特定于事件的表模式。下图显示了 AVRO 文件的输出示例。

AVRO files saved to Google Storage

除了创建数据湖之外,我们还希望在查询环境中可以立即访问事件。DataFlow 提供了一个 BigQuery 连接器来实现这一功能,传输到这个端点的数据在短时间内就可以用于分析。下图显示了数据管道的这一部分。

Streaming events from DataFlow to BigQuery

数据管道将 PubSub 消息转换为 TableRow 对象,这些对象可以直接插入到 BigQuery 中。下面的代码由两个应用方法组成:数据转换和 IO 写入程序。转换步骤从 PubSub 读取消息有效负载,将消息解析为 JSON 对象,提取 eventTypeeventVersion 属性,并使用这些属性以及时间戳和消息有效负载创建 TableRow 对象。第二个 apply 方法告诉管道将记录写入 BigQuery,并将事件追加到现有表中。

// parse the PubSub events and create rows to insert into BigQuery    events.apply("To Table Rows", new 
  PTransform<PCollection<PubsubMessage>, PCollection<TableRow>>() { 
    public PCollection<TableRow> expand(
        PCollection<PubsubMessage> input) {       

      return input.apply("To Predictions", ParDo.of(new  
          DoFn<PubsubMessage, TableRow>() {    

    @ProcessElement          
    public void processElement(ProcessContext c) throws Exception {
      String message = new String(c.element().getPayload()); 

      // parse the json message for attributes
      JsonObject jsonObject = 
          new JsonParser().parse(message).getAsJsonObject();
      String eventType = jsonObject.get("eventType").getAsString();
      String eventVersion = jsonObject.
              get("eventVersion").getAsString();          
      String serverTime = dateFormat.format(new Date()); 

     // create and output the table row            
     TableRow record = new TableRow();            
     record.set("eventType", eventType);               
     record.set("eventVersion", eventVersion);          
     record.set("serverTime", serverTime);
     record.set("message", message);            
     c.output(record);          
  }}));      
}})

//stream the events to Big Query    
.apply("To BigQuery",BigQueryIO.writeTableRows()   
  .to(table)           
  .withSchema(schema)
  .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
  .withWriteDisposition(WriteDisposition.WRITE_APPEND));

总结一下上面的代码,从 PubSub 消费的每个消息都转换为带有时间戳的 TableRow 对象,然后流式传输到 BigQuery 进行存储。

数据管道的这一部分的结果是,事件将被流式传输到 BigQuery,并可在由 DataFlow 任务指定的输出表中进行分析。为了有效地将这些事件用于查询,您需要构建额外的 ETL 来创建具有模式化记录的已处理事件表,但现在已经有了用于存储跟踪事件的数据收集机制。

Game event records queried from the raw-events table in BigQuery

部署和自动扩展

使用 DataFlow,您可以在本地测试数据管道,或者部署到云中。如果在未指定其他属性的情况下运行代码示例,则数据管道将在本地计算机上执行。为了部署到云并利用此数据管道的自动缩放功能,您需要指定一个新的 runner 类作为运行时参数的一部分。为了运行数据管道,我使用了以下运行时参数:

--runner=org.apache.beam.runners.dataflow.DataflowRunner 
--jobName=game-analytics
--project=your_project_id 
--tempLocation=gs://temp-bucket

部署作业后,您应该会看到一条消息,说明作业已提交。然后您可以点击 DataFlow 控制台查看任务:

The steaming data pipeline running on Google Cloud

上面指定的运行时配置将不会默认为自动缩放配置。为了部署根据需求扩大规模的作业,您需要指定其他属性,例如:

--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=30

有关设置数据流任务以适应繁重工作负载条件的更多详细信息,请参见 Spotify 的这篇 Google 文章中的和这篇文章。下图显示了 DataFlow 如何根据需要进行扩展以满足需求。

An example of Dataflow auto scaling. The pipeline will scale up and down as necessary to match demand.

结论

现在有各种各样的工具可以用最少的努力为游戏或网络应用建立一个分析管道。使用托管资源使小型团队能够利用无服务器和自动扩展的基础架构,以最少的基础架构管理扩展到大量事件。您可以记录应用程序的所有相关数据,而不是使用数据供应商现成的数据收集解决方案。

这篇文章的目标是展示如何使用 GCP 堆栈建立数据湖和查询环境。虽然这里介绍的方法不能直接移植到其他云,但是用于实现该数据管道核心功能的 Apache Beam 库是可移植的,并且可以利用类似的工具在其他云提供商上构建可伸缩的数据管道。

该架构是对分析和数据科学团队有用的事件收集系统的最小实现。为了满足大多数分析团队的需求,需要将原始事件转换为经过处理的熟事件,以满足业务需求。这个讨论超出了本文的范围,但是分析基础现在应该已经到位,可以构建一个高效的数据平台。

Github 上提供了该示例管道的完整源代码:

[## BG Weber/游戏分析

游戏分析——游戏分析的全面管理管道

github.com](https://github.com/bgweber/GameAnalytics)

本·韦伯是意外收获数据的首席数据科学家,我们的任务是建立最准确和全面的净值模型。意外收获团队正在壮大,并正在招聘工程师和数据科学家。

用 Scikit-learn 实现机器学习中流水线的一个简单例子

原文:https://towardsdatascience.com/a-simple-example-of-pipeline-in-machine-learning-with-scikit-learn-e726ffbb6976?source=collection_archive---------0-----------------------

Akagiyama: (Image Source: Author)

今天的帖子将简短明了,我将带你看一个在 python 机器学习中使用管道的例子。我将使用其他一些重要的工具,如GridSearchCV等。,演示管道的实现,最后解释为什么管道在某些情况下确实是必要的。我们开始吧

根据 scikit-learn 对pipeline类的定义是

顺序应用变换列表和最终估计器。流水线的中间步骤必须实现 fit 和 transform 方法,而最终的估计器只需要实现 fit。

一旦我们开始在一个简单的数据集上实现 pipeline,上面的语句就更有意义了。这里我使用的是红酒数据集,,其中的“标签”是葡萄酒的质量,范围从 0 到 10。就数据预处理而言,这是一个相当简单的数据集,因为它没有缺失值。

import pandas as pd winedf = pd.read_csv('winequality-red.csv',sep=';')
# print winedf.isnull().sum() # check for missing dataprint winedf.head(3)>>> fixed ac.  volat. ac.  citric ac.  res. sugar chlorides  \
0     7.4       0.70         0.00             1.9   0.076   
1     7.8       0.88         0.00             2.6   0.098   
2     7.8       0.76         0.04             2.3   0.092free sulfur diox.  tot. sulfur diox.  dens.  pH  sulphates  \
0     11.0            34.0           0.9978  3.51       0.56   
1     25.0            67.0           0.9968  3.20       0.68   
2     15.0            54.0           0.9970  3.26       0.65 alcohol  quality  
0      9.4        5  
1      9.8        5  
2      9.8        5

我们总是可以用seaborn来检查相关图,或者我们可以用散点图来绘制一些特征,下面是两个这样的图..

Correlation between pH and Acidity (Image: Author)

正如预期的那样,与残糖和酸度相比,酸度和 pH 具有很高的负相关性。一旦我们熟悉并充分利用了数据集,让我们来讨论和实现管道。

顾名思义,*pipeline* 类允许将多个进程粘贴到一个 scikit-learn 估计器中。 *pipeline* 类有拟合、预测和评分方法,就像任何其他估计器一样(例如。LinearRegression)。

为了实现 pipeline,通常我们首先从数据集分离特征和标签。

X=winedf.drop(['quality'],axis=1)
Y=winedf['quality']

如果你仔细观察了pd.head(3)的输出,你会发现数据集的特性变化很大。正如我之前解释的,就像主成分分析一样,一些拟合算法需要缩放,这里我将使用一个这样的算法,称为 SVM(支持向量机)。关于 SVM 的更多理论,你可以查看我的其他帖子。

from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, GridSearchCV

这里我们使用StandardScaler,它从每个特征中减去平均值,然后缩放到单位方差。

现在,我们准备通过提供步骤列表来创建管道对象。我们的步骤是——标准标量和支持向量机。这些步骤是由转换器或估算器的名称和实例组成的元组列表。让我们来看看下面这段代码,以便澄清 -

steps = [('scaler', StandardScaler()), ('SVM', SVC())]from sklearn.pipeline import Pipeline
pipeline = Pipeline(steps) # define the pipeline object.

字符串(' scaler ',' SVM ')可以是任何东西,因为这些只是为了清楚地识别转换器或估计器的名称。我们可以用make_pipeline代替流水线,避免命名估计器或变换器。最后一步必须是元组列表中的估计器。

我们用一个random_state=30将数据集分为训练集和测试集。

X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.2, random_state=30, stratify=Y)

有必要使用 *stratify* 正如我之前提到的,标签是不平衡的,因为大部分葡萄酒质量属于 5、6 级。您可以使用 pandas value_counts()进行检查,它返回包含唯一值计数的对象。

print winedf['quality'].value_counts() >>> 5    681
    6    638
    7    199
    4     53
    8     18
    3     10

SVM 通常使用两个参数gamma,C进行优化。我已经在另一篇文章的中讨论了这些参数的影响,但是现在,让我们定义一个我们将在GridSearchCV中使用的参数网格。

parameteres = {'SVM__C':[0.001,0.1,10,100,10e5], 'SVM__gamma':[0.1,0.01]}

现在我们用管道实例化GridSearchCV对象,用 5 重交叉验证实例化参数空间。

grid = GridSearchCV(pipeline, param_grid=parameteres, cv=5)

我们可以用它来拟合训练数据集,并在测试数据集上测试算法。我们还可以找到最适合 SVM 的参数,如下所示

grid.fit(X_train, y_train)print "score = %3.2f" %(grid.score(X_test,y_test))print grid.best_params_>>> score = 0.60
    {'SVM__C': 100, 'SVM__gamma': 0.1}

由此,我们看到了一个有效地使用网格搜索流水线来测试支持向量机算法的例子。

在另一篇文章中,我已经详细讨论了如何应用 pipeline 和 GridSearchCV 以及如何为 SVM 绘制决策函数。你可以使用任何其他算法,如逻辑回归,而不是 SVM,来测试哪种学习算法最适合红酒数据集。为了在更真实的数据集上应用包括 GridSearchCV 在内的管道中的决策树算法,您可以查看 这篇文章

为什么选择管道:

我将用一个简单直观的解释来结束这篇文章,解释为什么管道有时是必要的。它有助于执行所需的应用步骤顺序,创建一个方便的工作流程,确保工作的可重复性。但是,管道中还有更多东西,因为我们使用了网格搜索交叉验证,我们可以更好地理解它。

上例中的管道对象是用StandardScalerSVM创建的。如果单独使用管道,那么对于StandardScaler,可以如下进行

scale = StandardScaler().fit(X_train)
X_train_scaled = scale.transform(X_train)
grid = GridSearchCV(SVC(), param_grid=parameteres, cv=5)
grid.fit(X_train_scaled, y_train)

这里我们看到了单独应用变压器和估计器的固有问题,其中估计器(SVM)的参数是使用GridSearchCV确定的。用于交叉验证的缩放特征被分成测试和训练文件夹,但是网格搜索内的测试文件夹已经包含关于训练集的信息,因为整个训练集(X_train)被用于标准化。更简单地说,当SVC.fit()使用交叉验证完成时,特性已经包括来自测试文件夹的信息,因为StandardScaler.fit()是在整个训练集上完成的。

人们可以通过使用管道绕过这种过分简化。使用管道,我们将StandardScaler()SVC()粘合在一起,这确保了在交叉验证期间StandardScaler仅适用于训练折叠,与用于SVC.fit()的折叠完全相似。安德烈亚斯·穆勒的书给出了上述描述的一个奇妙的图示。

1安德烈亚斯·穆勒、萨拉·圭多;用 Python 进行机器学习的介绍;PP-305–320;第一版;莱利·奥出版公司;亚马逊链接

你可以在 G itHub 中找到完整的代码。

干杯!保持坚强!!

如果你对更深入的基础机器学习概念感兴趣,可以考虑加盟 Medium 使用 我的链接 。你不用额外付钱,但我会得到一点佣金。感谢大家!!

初始网络版本的简单指南

原文:https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202?source=collection_archive---------0-----------------------

初始网络是 CNN 分类器发展的一个重要里程碑。在其出现之前(双关语),大多数流行的 CNN 只是将卷积层越叠越深,希望获得更好的性能。

Designing CNNs in a nutshell. Fun fact, this meme was referenced in the first inception net paper.

另一方面,初始网络是复杂的(大量工程)。它使用了很多技巧来提升性能;无论是速度还是准确度。它的不断演变导致了几个版本的网络的产生。流行的版本如下:

  • 盗梦空间 v1。
  • 盗梦空间 v2 和盗梦空间 v3。
  • 盗梦空间 v4 和盗梦空间-ResNet。

每个版本都是对前一个版本的迭代改进。了解这些升级可以帮助我们构建在速度和准确性上都得到优化的定制分类器。a̶l̶s̶o̶,̶̶d̶e̶p̶e̶n̶d̶i̶n̶g̶̶o̶n̶̶y̶o̶u̶r̶̶d̶a̶t̶a̶,̶̶a̶̶l̶o̶w̶e̶r̶̶v̶e̶r̶s̶i̶o̶n̶̶m̶a̶y̶̶a̶c̶t̶u̶a̶l̶l̶y̶̶w̶o̶r̶k̶̶b̶e̶t̶t̶e̶r̶.̶(编辑:删除了这句话,因为它相当投机;请忽略相同)

这篇博文旨在阐明盗梦空间网络的演变。

盗梦空间 v1

这是一切开始的地方。让我们分析一下它打算解决什么问题,以及它是如何解决的。(论文)

前提是:

  • 图像中的显著部分在尺寸上可以有极其大的变化。例如,一幅带有狗的图像可以是以下任意一种,如下所示。在每幅图像中,狗占据的区域是不同的。

From left: A dog occupying most of the image, a dog occupying a part of it, and a dog occupying very little space (Images obtained from Unsplash).

  • 由于信息位置的巨大变化,为卷积运算选择正确的内核大小变得困难。一个较大的内核优选用于更多全局分布的信息,一个较小的内核优选用于更多局部分布的信息。
  • 非常深的网络容易过拟合。也很难通过整个网络传递梯度更新。
  • 天真地叠加大型卷积运算计算量大

解决方案是:

为什么不让多尺寸的过滤器在同一水平面上运行?这个网络本质上会变得更宽一点,而不是更深一点。作者设计了 inception 模块来反映这一点。

下图是“幼稚”的初始模块。它对一个输入执行卷积,使用 3 个不同大小的滤波器 (1x1,3x3,5x5)。此外,最大汇集也被执行。输出被连接并发送到下一个初始模块。

The naive inception module. (Source: Inception v1)

如前所述,深度神经网络计算量很大。为了让它更便宜,作者通过在 3x3 和 5x5 卷积之前添加额外的 1x1 卷积来限制输入通道的数量。虽然增加一个额外的运算看起来可能违反直觉,但 1x1 卷积比 5x5 卷积便宜得多,而且输入通道数量的减少也有所帮助。但是,请注意,1x1 卷积是在 max pooling 层之后引入的,而不是之前。

Inception module with dimension reduction. (Source: Inception v1)

利用降维初始模块,构建了神经网络结构。这就是广为人知的 GoogLeNet (Inception v1)。该架构如下所示:

GoogLeNet. The orange box is the stem, which has some preliminary convolutions. The purple boxes are auxiliary classifiers. The wide parts are the inception modules. (Source: Inception v1)

GoogLeNet 有 9 个这样的线性堆叠的初始模块。它有 22 层深(27 层,包括池层)。它在最后一个 inception 模块的末尾使用全局平均池。

不用说,是一个挺的深度分类器。如同任何非常深的网络一样,它受到消失梯度问题的影响。

为了防止网络的中间部分淘汰,作者引入了两个辅助分类器(图中的紫色方框)。他们实际上将 softmax 应用于两个初始模块的输出,并计算了相同标签上的辅助损失总损失函数辅助损失实际损失的加权和。本文中使用的权重值为每个辅助损失 0.3。

# The total loss used by the inception net during training.
**total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2**

辅助损失不用多说,纯粹用于训练目的,推理时忽略。

盗梦空间 v2

盗梦 v2盗梦 v3 论文 中呈现。作者提出了许多提高精确度和降低计算复杂性的改进措施。Inception v2 探索了以下内容:

前提是:

  • 减少代表性瓶颈。直觉是,当卷积没有显著改变输入的维度时,神经网络表现得更好。过多地减少维度可能会导致信息丢失,这就是所谓的“表示瓶颈”
  • 使用智能因子分解方法,卷积可以在计算复杂性方面变得更有效。

解决方案是:

  • 将 5x5 卷积因式分解为两个 3x3 卷积运算,提高计算速度。虽然这看起来可能违反直觉,但 5x5 卷积比 3x3 卷积贵 2.78 倍。因此,堆叠两个 3×3 卷积实际上会导致性能的提升。下图对此进行了说明。

The left-most 5x5 convolution of the old inception module, is now represented as two 3x3 convolutions. (Source: Incpetion v2)

  • 此外,它们将滤波器尺寸 nxn卷积分解为 1xn 和 nx1 卷积的组合。例如,3×3 卷积相当于首先执行 1×3 卷积,然后对其输出执行 3×1 卷积。他们发现这种方法比单一的 3x3 卷积便宜 33%。下图对此进行了说明。

Here, put n=3 to obtain the equivalent of the previous image. The left-most 5x5 convolution can be represented as two 3x3 convolutions, which inturn are represented as 1x3 and 3x1 in series. (Source: Incpetion v2)

  • 模块中的滤波器组扩展(变得更宽而不是更深)以消除代表性瓶颈。如果模块做得更深,尺寸会过度减小,从而丢失信息。下图对此进行了说明。

Making the inception module wider. This type is equivalent to the module shown above. (Source: Incpetion v2)

  • 以上三个原则被用来构建三种不同类型的初始模块(让我们按照它们被介绍的顺序称它们为模块 A、BC )。这些名称是为了清楚起见而介绍的,而不是正式名称)。该架构如下所示:

Here, “figure 5” is module A, “figure 6” is module B and “figure 7” is module C. (Source: Incpetion v2)

盗梦空间 v3

前提

  • 作者注意到辅助分类器直到训练过程接近尾声时,准确率接近饱和,才发挥了很大作用。他们争辩说,他们的职能是调整,特别是如果他们有 BatchNorm 或 Dropout 操作。
  • 将调查在不大幅改变模块的情况下改进 Inception v2 的可能性。

解决方案

  • Inception Net v3 整合了上述针对 Inception v2 的所有升级,此外还使用了以下内容:
  1. RMSProp 优化器。
  2. 因子分解的 7x7 卷积。
  3. 辅助分类器中的 BatchNorm。
  4. 标注平滑(一种添加到损失公式中的正则化组件,用于防止网络对某个类过于自信。防止过度配合)。

初始版本 4

盗梦空间 v4盗梦空间-ResNet 论文 中有介绍。为了清楚起见,让我们在单独的部分中讨论它们。

前提

  • 使模块更加一致。作者还注意到一些模块比必要的模块更加复杂。这可以让我们通过添加更多这样的统一模块来提升性能。

解决方案

  • 盗梦空间 v4 的词干修改。这里的词干指的是在引入先启块之前执行的初始操作集。

The top image is the stem of Inception-ResNet v1. The bottom image is the stem of Inception v4 and Inception-ResNet v2. (Source: Inception v4)

  • 他们有三个主要的 inception 模块,命名为 A、B 和 C(与 Inception v2 不同,这些模块实际上命名为 A、B 和 C)。它们看起来非常类似于它们的 Inception v2(或者 v3)的对应物。

(From left) Inception modules A,B,C used in Inception v4. Note how similar they are to the Inception v2 (or v3) modules. (Source: Inception v4)

  • Inception v4 引入了专门的缩减块,用于改变网格的宽度和高度。早期版本没有明确的 reduction 块,但是功能已经实现。

(From Left) Reduction Block A (35x35 to 17x17 size reduction) and Reduction Block B (17x17 to 8x8 size reduction). Refer to the paper for the exact hyper-parameter setting (V,l,k). (Source: Inception v4)

Inception-ResNet v1 和 v2

受 ResNet 性能的启发,提出了一个混合初始模块。Inception ResNet 有两个子版本,即 v1 和 v2。在我们检查显著的特性之前,让我们看看这两个子版本之间的细微差别。

  • Inception-ResNet v1 的计算成本与 Inception v3 相似。
  • Inception-ResNet v2 的计算成本与 Inception v4 相似。
  • 它们有不同的词干,如 Inception v4 部分所示。
  • 两个子版本的模块 A、B、C减速块结构相同。唯一的差异超参数设置。在这一节中,我们将只关注结构。请参考论文以获得准确的超参数设置(图片来自 Inception-Resnet v1)。

前提

  • 引入剩余连接,将初始模块卷积运算的输出添加到输入中。

解决方案

  • 对于剩余加法来说,卷积后的输入和输出必须具有相同的维数。因此,我们在原始卷积后使用 1x1 卷积,以匹配深度大小(卷积后深度增加)。

(From left) Inception modules A,B,C in an Inception ResNet. Note how the pooling layer was replaced by the residual connection, and also the additional 1x1 convolution before addition. (Source: Inception v4)

  • 主要初始模块中的池化操作被替换为支持剩余的连接。但是,您仍然可以在归约块中找到这些工序。缩减块 A 与初始 v4 的缩减块相同。

(From Left) Reduction Block A (35x35 to 17x17 size reduction) and Reduction Block B (17x17 to 8x8 size reduction). Refer to the paper for the exact hyper-parameter setting (V,l,k). (Source: Inception v4)

  • 如果过滤器的数量超过 1000,在体系结构中具有较深残余单元的网络会导致网络“死亡”。因此,为了增加稳定性,作者将剩余激活值调整为大约 0.1 到 0.3。

Activations are scaled by a constant to prevent the network from dying. (Source: Inception v4)

  • 原论文没有使用求和后的 BatchNorm 在单个 GPU 上训练模型(在单个 GPU 上拟合整个模型)。
  • 据发现,Inception-ResNet 模型能够在较低的时期达到较高的精确度。
  • Inception v4 和 Inception-ResNet 的最终网络布局如下:

The top image is the layout of Inception v4. The bottom image is the layout of Inception-ResNet. (Source: Inception v4)

感谢您阅读本文!希望它能让你对盗梦空间网有所了解。如果是的话,请按拍手按钮!如果您有任何问题,可以通过社交媒体或电子邮件(bharathrajn98@gmail.com)联系我。

数据结构的简单介绍:第一部分——链表

原文:https://towardsdatascience.com/a-simple-introduction-to-data-structures-part-one-linked-lists-efbb13e9ad33?source=collection_archive---------3-----------------------

编程的世界总是在变化。而且变化很快。我们一直在寻找更好的方法来做我们正在做的事情。这是一件伟大的事情。迭代是一个非常强大的概念。

然而,在计算机科学世界中,有一些想法和结构是不变的。数据结构及其应用就是其中的一部分。

你可能会想,在所有事情中,这是每个程序员或软件工程师都会理解的,对吗?那你就错了。

我可以告诉你,大学毕业后,我肯定不知道何时以及为什么要使用一种数据结构而不是另一种,我发现,现在许多通过实践学习编程的程序员也不知道(代码训练营,让你动手的在线课程,从地下室构建软件)。

老实说,我记得我认为它们真的没有那么重要。我认为它们只在特殊情况下需要,可能是为公共框架或库编写的代码。

伙计,我错了。

了解如何有效地使用数据结构可以很容易地将优秀的开发人员与糟糕的开发人员区分开来。然而,对于一些很难理解这些抽象概念的人来说,真正掌握它们是很困难的。试着从头到尾阅读关于这个主题的事实上的书(“算法简介”——旁注:我知道它说的是“算法”,但它实际上涵盖了数据结构是如何构建的,以适应特定的算法)。

在那本书和许多其他类似的书中,你会发现许多数学证明和想法看起来非常理论化,并且它的抽象本质使得在实际开发软件时很难理解实际的用例。

那么一个程序员如果没有数学学位毕业该怎么办呢?

当许多开发人员第一次意识到数据结构的重要性时(在试图编写一个在几秒钟内处理数百万条记录的系统之后),他们经常会看到为斯坦福大学计算机科学学位的人编写的书籍或文章。

我希望这篇文章能够填补这个空白,并以更实用的方式解释数据结构。我希望人们从这篇文章中学到的是理解为什么我们有不同的数据结构,它们是什么,以及何时使用一个特定的数据结构。

这将是一个简单的介绍,所以我将介绍您 95%的时间会用到的数据结构,剩下的 5%留给您自己去发现。

让我们开始吧!

首先,我们需要定义什么是数据结构。好吧,一群聪明人已经抛出了许多复杂的听起来不错的定义,但是描述数据结构的最简单也是最准确的方式是说数据结构是在计算机中组织数据的一种特殊方式,以便它可以被有效地使用。仅此而已。这只是一种组织数据的方式,就像人类组织书架的方式一样。你要以一种方式来组织它们,使它们容易得到你想要的东西。

例如,继续使用书架类比,如果我想要能够快速地挑选出我拥有的以字母“T”或“B”或任何其他字母开头的所有书籍(假设有数百本),那么我会想要以一种使任务快速且容易执行的方式来组织这些书籍。在这个例子中,这意味着按字母顺序组织书籍。很简单。

然而,如果我使用书架的方式不同(比如我想找到所有与物理学科相关的书籍),那么我们很快就会发现这种书籍的组织方式是有问题的,会导致我在寻找我想要的书籍时效率非常低。

这里的解决方案是根据我们在最常见的场景中如何检索它们,以不同的方式组织书籍。在第二个场景中,我们可能已经决定根据主题来组织书架。这同样适用于数据结构以及你通常如何与它们交互。

让我们开始讨论组织数据的不同方式...又名公共数据结构的类型。为了开始这个有趣的话题,我们将从我最喜欢的数据结构之一开始...

链表:更复杂数据结构的构建块

链表是最简单和最常见的数据结构之一。它们也是一个很好的起点,因为链表是一种数据结构,许多其他数据结构在它们自己的结构中内部使用它。

理解链表将有助于你理解“指针”(一个值——通常以十六进制书写——代表另一个值的内存地址或一个值序列的开始)以及系统如何存储和访问内存。

为了使事情变得简单,我在概念上包含了一个链表的可视化表示。

让我们浏览一下上面的图片,然后我们将解释为什么以这种方式存储数据在某些情况下可能是个好主意,而在其他情况下可能是个坏主意。

首先,你可以看到图像上写着“开始”的地方。这就是所谓的链表的“头”。它只是起点,表示第一个“节点”在内存中的位置(本例中为地址 1000)。“1000”是指向下一个节点位置的指针。

我知道你在想什么。“什么是节点??"。至少这是我第一次读到链表时的想法。简单来说,“节点”就是一个有两个字段的对象。一个字段是“信息”字段(您可以在其中存储一些您关心的数据),另一个是指针字段。指针字段保存的只是下一个节点位置的地址位置。就是这样!这实际上简单得可笑,以至于很多人都想多了。

正如你在上面的图片中看到的,在我们到达内存地址 1000 之后,我们遇到了一个节点。在这个节点中,我们可以看到两个字段。在我们的例子中,保存“信息”的第一个字段是存储字符“A”。第二个字段(指针字段)将内存中的位置存储到下一个节点(内存位置 2000)。

接下来,我们跟随指针到内存位置 2000。一旦我们到达那里,我们会遇到第二个节点。如您所见,第二个节点的信息为“B ”,指针值为“3000”。这里没什么新鲜的!

最后,我们跟随指针值到内存位置(3000 ),来到另一个节点。这个节点和前面两个差不多。它的信息字段有一个值“C ”,但是正如您所看到的,它的指针字段什么也没有(或者为空)。这仅仅意味着我们已经到了列表的末尾。没有更多的指针可循!这个节点(作为最后一个节点)被称为“尾节点”。

那么是什么使得链表作为一种数据结构有价值,我们什么时候以及为什么会选择使用它呢?让我们接下来讨论这个问题。

链表的结构允许它拥有许多属性,这使得它不同于其他集合结构(比如我将在后面的文章中介绍的数组)。由于使用指针而不是连续的内存块,链表非常适合以下情况:

当您需要从列表中进行固定时间的插入/删除时(例如在实时计算中,时间的可预测性是绝对重要的)

当您不知道列表中会有多少项时。对于数组,如果数组变得太大,您可能需要重新声明和复制内存(同样,我将在以后的文章中更详细地介绍数组。)

当您不需要随机访问任何元素时

当您希望能够在列表中间插入项目时(例如优先级队列——我将在后面介绍的另一种数据结构)

然而,有时使用链表会非常低效,使用另一种集合数据结构(如数组)会更好。

在以下情况下不要使用链表:

当您需要对元素进行索引/随机访问时

当您提前知道数组中元素的数量以便可以为数组分配正确的内存量时

当你需要速度的时候。您可以对数组使用指针数学来访问每个元素,而您需要根据链表中每个元素的指针来查找节点,这可能会导致页面错误,从而影响性能。

当记忆成为问题时。填充数组比链表占用更少的内存。数组中的每个元素都只是数据。每个链表节点都需要数据以及一个(或多个)指向链表中其他元素的指针。

正如你所看到的,取决于你想做什么,链表可能是一个很好的数据结构,也可能是一个非常低效的数据结构。这一切都要追溯到理解每种数据结构的优缺点,并为工作选择正确的“工具”。

希望这是一个快速简单的介绍,说明了为什么学习数据结构是重要的,并阐明了链表何时以及为什么是数据结构的重要起点。

接下来,我将讨论数组、堆栈和队列。敬请期待!

如果你能想到任何更好的方法来解释链表,或者为什么理解数据结构很重要,请在评论中留下它们!

如果你喜欢这篇文章,请与他人分享!这是我能得到的最大的赞美。另外,如果你是技术爱好者,请订阅我的博客(jasonroell.com)。祝您愉快,继续学习!

一个简单的机器学习介绍

原文:https://towardsdatascience.com/a-simple-machine-learning-introduction-2f0f626966d7?source=collection_archive---------15-----------------------

当我开始学习机器学习时,我一直发现自己对自己在做什么感到困惑。在我看来,很清楚我需要编码什么,但我不明白这种编程方式与我以前开发的有什么不同。我困惑的原因是我对 ML(机器学习)的主要主题和它的基础缺乏了解。所以今天我要解释什么是机器学习的基本概念?它是用来做什么的?它的优点是什么?它有哪些应用?

机器学习是人工智能最受欢迎的分支之一。简单地说,ML 是计算机科学的一个研究领域,它研究一种特殊类型的算法,这种算法可以根据经验自动改进。换句话说,ML 算法与其他算法的不同之处在于,它们能够从我们提供给它们的数据中学习,这是 ML 如此有用的主要原因之一。在这项技术之前,软件工程师需要创建一长串规则,才能开发出能够响应我们需求的程序,但现在这种情况已经发生了变化,因为这些算法不再需要编写成千上万行代码,而是自己创建规则,以获得预期的输出。这将焦点从编码规则转移到了输入数据,使得复杂的问题相对更容易解决。

Photo by Franki Chamaki on Unsplash

这项新技术开启了一个充满可能性和优势的世界,但它的三个主要优势是:

1)它减少了编程时间。
既然这些新算法都是要自己学习规则的,开发者就不再需要对每条规则进行显式编码,现在我们只是让算法自己学习。这方面的一个简单例子是所有提出搜索、音乐或视频建议的算法。你可以花很长时间写下每个案例,如果有人喜欢某种音乐,那么就给另一个,或者你可以制定一个算法,学习每个用户的口味,然后根据以前的数据给出建议。

2)使产品更具可定制性和可扩展性。
回到音乐建议的例子,想象你花了几个月的时间为你当前的市场美国创造了这个算法,但是然后你想把自己扩展到另一个国家,在那里音乐品味不同,建议不再相关。然后,你需要为这个新位置创建一个新的算法,这可能需要很长时间,但如果你使用机器学习,你可以只添加来自这个国家的数据,软件将学习如何自己提出建议,这不仅更快,而且需要更少的努力。

ML 让我们有可能解决人类无法解决的复杂问题。
有很多问题人类根本找不到确切的一套规则来使其运转。这些问题中的大多数都包含数千个可能导致结果偏差的变量,这使得对所有可能的场景进行编码变得极其困难。机器学习算法在生物科学中非常有用,这项技术使我们能够更多地了解来自身体的信号,并能够像在机器人假体中一样绘制它们。

Photo by Franck V. on Unsplash

在机器学习中,有不同类型的算法,这些算法分为三大类:监督学习、非监督学习和强化学习。

监督学习是 ML 的一个分支,其中数据被标记,换句话说,你提供给模型的信息带有答案。在这种类型的算法中,软件通过对输出进行预测,然后将其与实际答案进行比较来学习。在这种比较之后,模型的参数被调整,这个过程被称为反向传播。(我将在下一篇文章中更深入地解释这个话题)重复这个过程,直到模型能够以可接受的精度进行预测。

无监督学习中,方法不同。在这种类型的算法中,数据是没有标记的,模型的目标是从数据的海洋中创建一些结构。这些类型的程序通常用于发现数据中的模式,这在商业智能中特别有用,它们利用这种模式发现能力来分析客户行为并利用这些模式。

在我看来强化学习是机器学习的一个非常特殊的分支,因为它非常接近人类通过试错来学习的方式。在这种类型的算法中,会创建一个性能函数来告诉模型它所做的是让它更接近目标还是让它走上另一条路。基于这个反馈,模型学习,然后做出另一个猜测,这继续发生,每个新的猜测都更好。这种类型的算法在游戏机器人中被大量使用,这些机器人一开始总是输,但渐渐地他们学会了如何在游戏中取得进展,直到他们可以比人类表现得更好。

如前所述,机器学习已经彻底改变了计算机软件的开发方式。这种算法的两个主要应用是自然语言处理(NLP)和计算机视觉。

自然语言处理是机器学习的一个分支,专注于让人机交互更加自然。在这里,模型的目标是在不需要某些命令的情况下理解人类想要表达的意思。这是最常用的语言翻译和聊天机器人。

另一边的计算机视觉正试图理解这个世界,就像我们用自己的眼睛一样。这个领域的重点是使计算机成为图像识别专家的算法。它可以从简单的算法如数字识别器到复杂的算法,如实时物体识别。

正如你所看到的,机器学习有很多应用,其中一些专注于科学,另一些专注于商业,还有一些只是娱乐,但所有这些都是有用的。这只是对这个主题的一个简单介绍,因为正如我们将在后面的文章中看到的,这个研究领域非常广泛,并且每天都在增长。

这篇文章是一系列文章的一部分,目的是为没有机器学习经验的人提供一条简单的道路。我将尽力以最简单的方式解释每个主题,同时保留该领域所有必要的主题。

使用虚拟足球数据预测球员表现的简单方法

原文:https://towardsdatascience.com/a-simple-method-to-predict-player-performance-using-fantasy-football-data-8b2d3adb3a1a?source=collection_archive---------3-----------------------

(注:根据意大利语版本,clicca qui )

这篇文章的目标是分析过去几年意甲梦幻足球(又名 Fantacalcio )的相关数据,并使用结果来预测下一个足球赛季的最佳球员。

大部分的文字将探索数据和可视化的球员的分数有见地的信息。最后一部分将展示一个简单的公式,可用于预测未来的表现。

数据

输入数据是从 Fantagazzetta 下载的,对应于为每个球员计算的季节性统计数据。它涵盖了过去 4 个赛季,从 2013 年至 2014 年至 2016 年至 2017 年。最相关的数据字段是每年的平均芬达分数:它表示玩家在所有游戏中获得的平均分数,并根据与特定事件(如进球、黄牌、红牌、助攻等)相关的奖金和惩罚进行调整。

在深入分析之前,我确保检查并清理了数据集。在这种情况下,我决定剔除上个赛季参加比赛少于 10 场或者芬达平均分数等于 0 的球员。前者的原因是为了尽量保持数据的“一致性”:比赛次数越高,他的平均得分就越准确。至于零分,它们似乎与没有参加运动的运动员有关,例如,因为他们被转移到不同的国家联盟。保罗·博格巴就是一个例子,他以创世界纪录的价格从尤文图斯转会到英超联赛的曼联。数据集中保存的球员总数是 265 人,每队大约 13 人,这听起来是一个相当合理的数字(一名首发 XI 加上两名替补)。

哪些玩家的趋势最好和最差?

让我们从数据集开始学习一些有趣的东西。有没有每年都在不断变好的选手?而又是谁反其道而行之,不断获得比上赛季更低的分数?

结果表明,芬达平均得分不断增加的运动员人数为 58 人,这相当于总人数 265 人中的大约 1/5(或每队 2 名运动员)。不出所料,绝对分数最高的都是进攻角色。
以下是关于这些结果的一些注释。

  • 上赛季的指挥官 埃丁代科在罗马的第二个赛季取得了令人印象深刻的年平均得分飙升,这可能是这位前曼城前锋在第一个赛季表现不佳后所没有预料到的。
  • 安德烈亚“伊尔盖洛”贝洛蒂已经成为夏季转会市场的热门人物:在 3 个赛季中得分从 6.4 跃升至 8.5 后,他的€100 米逃脱条款似乎并不那么疯狂。
  • Alejandro“El Papu”Gomez 是亚特兰大 B.C .向意甲积分榜 anEuropa 联赛惊人进军的球员之一。
  • “莫莫”萨拉赫自从第一次来到意大利后,他的速度给所有人留下了深刻的印象。他的得分不断上升的趋势表明,尤尔根·克洛普为他的球队的动态比赛增添了一名优秀的人才。
  • 有趣的是注意到一些守门员在这一套。Szczesny 的国际比赛经验有助于解释他的积极表现。多纳鲁马可能是目前最想要的门将,AC 米兰暂时能够留住他的神童。但最引人注目的名字是费德里科·马尔凯蒂和他的积极趋势,跨越了 4 年,而不是像提到的同事那样只有 2 年。

另一方面,得分不断下降的意甲足球运动员人数为 46 人。这些名字中的大多数都扮演着防守的角色,与之前展示的正好相反。

  • 排名倒数第三的意甲球员包括守门员比萨里、波萨维奇和拉曼纳。其中两人随队降级到乙级,这可能解释了糟糕的分数。
  • 卡洛斯·巴卡和马里奥·曼祖基奇是这个小组中绝对得分最高的球员。他们的得分下降几乎肯定与进球数量减少有关,因为哥伦比亚人的得分表现较差,克罗地亚人的角色也发生了变化。
  • 安东尼奥·坎德雷瓦的数据也不差,尽管这位意大利国民的平均得分在 4 年后首次低于 7.0。

意甲第一年和上一年有哪些球员的差距最好/最差?

这个问题与上一个问题类似,但在这种情况下,我想包括那些年度绩效趋势可能发生变化(即不持续上升/下降)的球员。这个想法是为了看看哪些球员在开始他们的意甲经历后变得更好(或更差)。

  • 前 10 名球员中有 3 名效力于 S.S. Napoli: Mertens、Insigne 和 Zieliński。
  • 倒数 3 名球员同样被列入负面趋势名单,即比扎里、波萨维奇和拉曼纳。
  • 一些负差异最大的人被认为是有才华的潜在客户,他们没有达到预期,例如迪斯特罗、克里斯坦特和伊图贝。

Top-10 players with best last-vs-first year score difference

Bottom-10 players with worst last-vs-first year score difference

哪些球员的职业生涯得分最好/最差?

一个球员职业生涯得分的一个很好的指标是他的年度芬达得分的平均值。不出所料,前 10 名和后 10 名分别包括前锋和门将。

Top-10 players with best career mean score

Top-10 players with worst career mean score

那么,哪些球员有可能成为 2017-2018 赛季意甲联赛的最佳球员呢?

这篇文章的最后一部分展示了一个简单的方法,利用前面几节收集的信息来预测球员下赛季的表现。

考虑到以下参数:

  • 第一季和最后一季的得分差异
  • 职业得分
  • 存在持续的正/负趋势
  • 在意甲踢球的年数
  • 上一季芬达的平均得分

一个简单的公式可以帮助估计每个球员在下一个赛季的表现。它只是计算以下加权和:

通过选择不同的权重,有可能给足球运动员职业生涯的特定方面或多或少的关联。

定义公式后,为每个球员计算 2017/2018 赛季的加权得分。然后,这些值按降序排列,以获得所需的排名。

所以最后,按角色划分的未来最佳球员名单(包括转投其他联盟的)如下。

守门员

  • 马尔凯蒂
  • 贝里萨
  • 拉斐尔
  • 布丰
  • 佩林

守军

  • 甘贝里尼
  • 安泰
  • 康蒂
  • 卡纳瓦罗
  • 里斯波利
  • 尖酸刻薄
  • 费莉佩
  • 库利巴利
  • 马西埃罗 a。
  • 博努奇

中场球员

  • 杰琳斯基
  • 奈英戈兰
  • 巴塞尔利
  • 贝纳西
  • 戈麦斯 a。
  • 哈姆西克
  • 马格纳内利
  • 费利佩·安德森
  • 佩罗蒂
  • 贝尔纳代斯基

向前

  • 贝洛蒂
  • 梅尔滕斯
  • 泽科
  • Insigne
  • 穆里尔(女子名)
  • 伊瓜因
  • 伊卡尔迪
  • 埃尔沙拉文
  • =salat[变体]
  • 博列洛

结论

这篇文章提供了一些关于意甲球员过去表现和相关预测的见解。
第一部分显示了一些有趣参数的存在,例如持续增加/减少的趋势以及上一个赛季和第一个赛季的得分差异。然后,这些参数被用来创建一个能够给出关于玩家预测分数的指示的公式。提供了一份按角色划分的下赛季最佳球员名单。

有关更多信息…

  • GitHub 资源库

一个简单的神经网络

原文:https://towardsdatascience.com/a-simple-neural-network-7067e10f1c0?source=collection_archive---------5-----------------------

虽然我最近完成了 Udacity 的深度学习纳米学位项目,但我对这个学科还相当陌生。为了进一步深造,我目前正在读一本关于这个主题的优秀书籍,安德鲁·特拉斯克的 探索深度学习 这篇博文的灵感直接来源于这本神奇的书。

那么,什么是神经网络?

神经网络是极其强大的参数模型,它使用矩阵和可微分函数的组合将输入数据转换为输出数据。—安德鲁·特拉斯克

换句话说,神经网络是对输入数据进行建模的一种方式,以便对该数据执行的数学函数产生有意义的结果。让我们深入研究并构建一个来了解更多信息。

def neural_network(input, weight):
    prediction = input * weight
    return prediction

这是最简单的神经网络。我们接受一个输入(真实世界的数据)和一个权重乘以输入,然后返回结果。例如,让我们说丹麦足球队在最后一场比赛中进了 3 个球。给定 0.2 的权重,我们可以用我们的神经网络预测丹麦有 60%的机会赢得他们的下一场比赛。

$ neural_network(3, 0.2)
$ => 0.6

但是我们如何找到我们的体重呢?

通过有监督的深度学习,我们可以用输入数据和实际结果来训练我们的模型,以确定权重。例如,如果我们有以下丹麦足球队的历史数据。

GOALS  |  WIN/LOSS
3      |  1
1      |  0
4      |  1

然后,我们可以告诉我们的网络从随机权重开始,计算获胜的可能性。将计算的预测值与实际的赢/输数进行比较,我们可以一遍又一遍地修改我们的权重,直到我们得到一个数字,当乘以我们的输入值(得分)时,得到一个最接近实际赢/输结果的数字。

所以,如果随机数一开始是 0.5,我们的预测将是

3 * 0.5 = 1.5
1 * 0.5 = 0.5
4 * 0.5 = 2

以此为起点,我们的网络对第一场比赛超估 50%,第二场超估 50%,最后一场超估 100%。现在有了这些信息,我们可以回过头来修改我们的权重,以减少我们预测结果的错误率。这就是线性回归的本质,本文不详细讨论。但这应该让你知道我们如何通过监督学习来确定权重,通过减少我们每次修改权重的错误率,并将我们的预测与我们的结果进行比较。

多端输入

在我让你为上述代码如何可能被用于驾驶自动驾驶汽车、翻译语言或赢得围棋比赛而挠头之前,让我们深入了解一个多输入神经网络。

如果我们有更多的数据来预测丹麦足球队是否会赢得下一场比赛,而不仅仅是进球数,会怎么样?假设我们知道目标的数量,他们当前的赢/输比率,以及他们拥有的粉丝数量。

Goals Scored  |  Win/Loss Ratio  |  No. Fans
3             |  0.6             |  30,000

有了更多的数据,我们可以组合多个输入来计算预测的加权和。

def neural_network(inputs, weights):
    output = 0
    for i in range(len(inputs)):
      output += (inputs[i] * weights[i])
    return output

用下面的权重取我们的 3 点输入数据,我们可以确定丹麦有 78%的可能赢得他们的下一场比赛。

weights = [0.2, 0.3, 0]
inputs  = [  3, 0.6, 30000]$ neural_network(inputs, weights)
$ => 0.78

注意,我们对应的粉丝数量权重为零。你可以想象,给定一组历史游戏数据,球迷的数量可能被证明对实际游戏没有什么影响,因此计算出的权重将接近于零。

积木

恭喜你!你刚刚学习了深度学习神经网络的基本构建模块之一。我们接收数据并对数据执行数学函数(在我们的例子中是乘法)来确定输出。有了更大的数据集,我们可以训练我们的网络来计算更准确的权重。在确定输出之前,我们还可以使用隐藏层来执行更多的功能。

想了解更多信息,我强烈推荐安德鲁·特拉斯克的 摸索深度学习 和观看西拉杰·拉瓦尔的 YouTube 频道。

构建神经网络的简单入门指南

原文:https://towardsdatascience.com/a-simple-starter-guide-to-build-a-neural-network-3c2cf07b8d7c?source=collection_archive---------2-----------------------

Photo by Alina Grubnyak on Unsplash

从今天开始,你将能够通过 PyTorch 编程并构建一个香草 前馈神经网络 (FNN)。以下是 https://github.com/yhuag/neural-network-lab FNN 的 python jupyter 代码库:

本指南作为基本的实践工作,引导您从头开始构建神经网络。大部分的数学概念和科学决策都被遗漏了。你可以在这方面做更多的研究。

入门指南

  1. 请确保您的计算机中安装了 Python 和 PyTorch:
  • Python 3.6 ( 安装)
  • PyTorch ( 安装

2.通过控制台上的命令检查 Python 安装的正确性:

python -V

输出应该是 Python 3.6.3 或更高版本

3.打开一个储存库(文件夹)并创建您的第一个神经网络文件:

mkdir fnn-tuto
cd fnn-tuto
touch fnn.py

开始写代码

以下所有代码都应写入 fnn.py 文件

进口 PyTorch

它会将 PyTorch 载入代码。太好了!良好的开端是成功的一半。

初始化超参数

超参数是预先设置的强有力的参数,不会随着神经网络的训练而更新。

下载 MNIST 数据集

MNIST 是一个巨大的数据库,有大量的手写数字(即 0 到 9)用于图像处理。

加载数据集

下载 MNIST 数据集后,我们将它们加载到我们的代码中。

注: 我们对 train_dataset 的加载过程进行了洗牌,使学习过程独立于数据顺序,但 test_loader 的顺序仍然是为了考察我们是否能处理输入的未指定偏序。

建立前馈神经网络

现在我们已经准备好了数据集。我们将开始构建神经网络。概念图如下所示:

FNN image retrieved from http://web.utk.edu/

前馈神经网络模型结构

FNN 包括两个完全连接的层(即 fc1 和 fc2)以及其间的一个非线性 ReLU 层。通常我们称这种结构为1-隐藏层 FNN ,不包括输出层(fc2)。

通过运行正向传递,输入图像(x)可以通过神经网络,并生成输出(out ),展示它属于 10 个类别中的每一个的受欢迎程度。例如,一个猫的形象对狗类可以有 0.8 的喜欢度,对飞机类可以有 0.3 的喜欢度。

实例化 FNN

我们现在根据我们的结构创建一个真正的 FNN。

net = Net(input_size, hidden_size, num_classes)

启用 GPU

注意: 你可以启用该行运行 GPU 上的代码

# net.cuda()    # You can comment out this line to disable GPU

选择损失函数和优化器

损失函数(标准)决定了输出如何与一个类进行比较,从而决定了神经网络的表现好坏。并且优化器选择一种方式来更新权重,以便收敛到该神经网络中的最佳权重。

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)

培训 FNN 模型

根据您的机器,此过程可能需要大约 3 到 5 分钟。详细的解释在下面的代码中作为注释(#)列出。

测试 FNN 模型

类似于训练神经网络,我们还需要加载一批测试图像并收集输出。不同之处在于:

  1. 无损失和重量计算
  2. 没有重量更新
  3. 具有正确的预测计算

保存训练好的 FNN 模型以备将来使用

我们将训练好的模型保存为一个 pickle 供以后加载和使用。

torch.save(net.state_dict(), ‘fnn_model.pkl’)

恭喜你。您已经完成了第一个前馈神经网络的构建!

下一步是什么

保存并关闭文件。开始在控制台运行文件:

python fnn.py

您将看到培训过程如下所示:

感谢你的时间,希望你喜欢这个教程。所有代码都可以在这里找到!

功劳:代码都是基于 yunjey 的 伟大的code base编写的。❤

一个简单的词义消歧应用程序

原文:https://towardsdatascience.com/a-simple-word-sense-disambiguation-application-3ca645c56357?source=collection_archive---------3-----------------------

词义消歧已经成为自然语言处理和机器学习领域的一个研究热点。词义消歧从根本上解决了因不同语境中词义不同而产生的歧义。

例如,考虑这两个句子。

" 银行 周六不接受现金. "

谓河水漫过堤岸。

第一句中的 银行 一词是指商业(金融)银行,第二句是指河岸。由此产生的模糊性对于机器来说很难检测和解决。检测歧义是第一个问题,解决它并显示正确的输出是第二个问题。这里,给出的代码是为了解决第二个问题。请随意投稿。

给我看看代码……

我们将使用的导入是,

自然语言工具包 (NLTK)库,是由普林斯顿大学开发的免费开源工具。这个库为我们的应用程序执行核心功能。它提供了训练数据集、Wordnet 语料库、各种标记器、词条分类器、词干分析器和标签器。

函数 simpleFilter 将给定的查询/句子作为输入,并返回一个经过词汇化的标记列表。词条化是指推导出词形正确的词根。在 词干化词干之间出现了一点混淆。然而,这两个词的味道不同。词干化通常指一种粗糙的启发式过程,即砍掉单词的词尾,希望在大多数时候都能正确实现这一目标,通常还包括去除派生词缀。词汇化通常是指通过使用词汇和词形分析来正确地做事情,通常旨在只去除屈折词尾,并返回单词的基本形式或词典形式,这就是所谓的 引理**

停用词,是一种语言中的高频词,对句子的主题没有多大作用。在英语中,这样的词包括,“一个”,“一个”,“of”,“to”等..我们去掉这些词,专注于我们的主题,以解决歧义。该函数应用于训练数据集以及用户输入。

接下来,我们执行相似性检查,function:similarity check,用于过滤第一个函数返回的句子标记。检查给定查询/句子标记和训练数据集标记之间的相似性。为此,从 wordnet 语料库中为每个单词加载同义词集。一个单词的深度和接近度是按照 0-1 的范围计算和返回的。这是解决模糊性的主要数据。你提供的数据越多,它就越准确。存储句子之间的标准化相似度。

synonymsCreator 是一个简单的函数,用于存储给定输入单词的同义词。这将用于存储给定数据集的同义词和查询标记。在对句子执行相似性检查时,还会考虑同义词。

一旦存储了相似性,我们就应用下一级过滤器,function:filtered sentence,对词干标记应用词条化,并再次删除停用词。在过滤后的句子列表中,我们现在存储单词及其同义词,以便进行更精确的匹配/相似性检查。接下来,我们把所有这些放在一起。

这里所做的是,应用程序被提供了两个数据集文件,第一个是cricketbat . txt,其中包含几个涉及板球运动中使用的蝙蝠的句子,第二个是vampire bat . txt,其中包含几个涉及哺乳动物鸟蝙蝠的句子。 sent1 存储 vampirebat.txt 文件中降低的案例字符串数据,sent2 存储 cricketbat.txt,sent3 存储用户查询。接下来,使用上述函数过滤句子并检查相似性。这种比较是标准化的,无论查询是指 板球球棒 还是 哺乳动物球棒,都会相应地给出输出。

这个程序给出非常准确的答案。它唯一不能处理的是否定句,比如“哪只蝙蝠是 而不是 用来打板球的”,“哪只蝙蝠是而不是 飞”等等。在这里随意贡献模块给它。

数据集和代码已经包含在库中。

神经网络导论

原文:https://towardsdatascience.com/a-soft-introduction-to-neural-networks-6986b5e3a127?source=collection_archive---------2-----------------------

在过去的几年里,神经网络已经成为机器学习的同义词。最近,我们已经能够制造神经网络,它可以产生栩栩如生的面孔,转移动态艺术风格,甚至可以按年“老化”一个人的照片。如果你想知道神经网络背后的直觉是如何工作的,但不知道从哪里开始,你来对地方了!

在本教程结束时,您应该能够理解神经网络工作的方式和原因。您还将仅使用 NumPy 从头开始创建一个非常简单的神经网络。线性代数/多元微积分和 Python 编程的经验是本教程的先决条件。

向前传球

任何一个神经网络的项目都是基于某个输入生成一个预测。这听起来非常模糊,但这是因为每个神经网络的任务略有不同,所以这个定义是一刀切的。输入的一些例子可以是三维张量形式的图像、属性的输入特征向量或字典嵌入的向量;输出的一些示例可能是预测的分类标签(分类)或预测的非离散值(回归)。

给我数据

我们举个简单的例子,让这个概念不那么模糊。我们有这个 16 个数据点的玩具数据集,每个数据点有四个特征和两个可能的类别标签 (0 或 1):

这是数据集的代码:

**import** numpy **as** np

X = np.array([[1, 1, 0, 1], [0, 1, 0, 1], [0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 1, 0], [1, 0, 1, 1], [0, 0, 0, 0], [1, 1, 1, 0], [0, 0, 1, 1], [1, 1, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [1, 1, 1, 1], [0, 1, 1, 1], [1, 0, 0, 1], [1, 0, 0, 1]])y = np.array([[0], [0], [0], [1], [1], [1], [0], [1], [1], [0], [1], [0], [1], [1], [0], [0]])

如您所见,类标签与第三个特性的值完全相同。我们希望网络能够准确地将要素转换为预测的类别标注概率,也就是说,输出应该具有两个可能类别的概率。如果我们的网络是准确的,我们将对正确的类有高的预测概率,对不正确的类有低的预测概率。

在我们继续之前,有一点很重要:我们不能用所有的 X 来训练我们的网络。这是因为我们期望我们的网络在它看到的数据上表现良好;我们真的很有兴趣看看它在还没有看到的数据上表现如何。我们想要两种类型的看不见的数据:一个是数据集,我们可以基于它定期评估我们的网络,称为验证集,另一个是数据集,它模拟“真实世界的数据”,我们只评估一次,称为测试集。其余用于训练的数据被称为训练集。下面是执行该分割的代码:

X_train = X[:8, :]
X_val = X[8:12, :]
X_test = X[12:16, :]

y_train = y[:8]
y_val = y[8:12]
y_test = y[12:16]

网络层

单词“ layers ”在机器学习的上下文中经常出现。说实话,它只不过是一种数学运算,经常涉及乘法权重矩阵和加法偏差向量

让我们只取其中一个数据点,它是一组四个特征值。我们希望将输入数据点(1×4 维的矩阵)转换为标签概率向量(1×2 维的向量)。为此,我们只需将输入乘以一个 4 乘 2 的权重矩阵。就是这样!不完全是这样,我们还在乘积中增加了一个 1 乘 2 的偏置向量,只是为了增加一个额外的学习参数。

代码如下:

W = np.random.randn(4, 2)
b = np.zeros(2)

linear_cache = {}
**def** linear(input):
    output = np.matmul(input, W) + b
    linear_cache[**"input"**] = input
    **return** output

(暂时不用担心缓存;这将在下一节中解释)

这种操作方式的一个非常酷的结果是,我们不需要只给图层一个数据点作为输入!如果我们取四个数据点,输入是 4 乘 4,输出是 4 乘 2(四组分类概率)。在训练时间使用的数据集子集被称为批次

概率最高的类是网络的猜测。太好了!除了网络会严重出错——毕竟所有的权重都是随机的!言简意赅地说:现在我们已经有了网络猜测,我们需要让它正确地猜测。**

向后传球

为了使网络的猜测更好,我们需要找到权重和偏差的“好”值,以便正确猜测的数量最大化。我们通过找到一个代表我们的猜测有多“错误”的标量值(称为损失值)并使用多元微积分将其最小化来做到这一点。

损失函数(或“取 L”)

在计算标量损失之前,我们希望将任意值的“概率”转换成适当的概率分布。我们通过对以下值计算 softmax 函数来实现这一点:

对于线性输出中的每个 f_j 值。为了得到标量损失值,计算正确类的交叉熵:

正确的类值 f_i。下面是代码:

**softmax_cache = {}
**def** softmax_cross_entropy(input, y):
    batch_size = input.shape[1]
    indeces = np.arange(batch_size)

    exp = np.exp(input)
    norm = (exp.T / np.sum(exp, axis=1)).T
    softmax_cache[**"norm"**], softmax_cache[**"y"**], softmax_cache[**"indeces"**] = norm, y, indeces

    losses = -np.log(norm[indeces, y])
    **return** np.sum(losses)/batch_size**

反向传播

我们现在的工作是最小化损失值,我们需要改变权重来做到这一点。我们利用链式法则的美丽来实现这一点。

我们举一个超级简单的例子来论证这个概念。我们来定义一个函数:L(x) = 3x + 2。下面是一个函数图:

我们想求 L 相对于 x 的导数。我们可以通过处理子函数处的每个图节点,求每个子函数处的偏导数,然后乘以引入的导数来实现:

我们来分析一下。L 对 L 的导数正好是 1。n + 2 的导数为 1;乘以 1(引入渐变)等于 1。导数 3n 是 3;乘以 1 等于 3。最后,n 的导数是 2n;乘以 3 是 6n。的确,我们知道 3x +2 的导数是 6x。通过递归使用链式法则求关于参数的导数称为反向传播。我们可以对复杂的神经网络做同样的事情,首先将网络绘制成图形:

现在,我们可以通过网络反向传播,找到关于权重和偏差的导数(当变量是非标量时,称为梯度):

通过该图的反向传播具有与上图相同的基本规则。然而,这里仍然有很多事情要做,所以让我们再来分析一下。第二个梯度是整个soft max/交叉熵函数的梯度;它基本上说明了导数与前向传递的 softmax 的输出相同,只是我们从正确的类中减去 1。梯度的推导不在本文的讨论范围内,但是你可以在这里阅读更多。此外,b 和 q 的维数不同,所以我们需要对一个维数求和,以确保维数匹配。最后,x^T 是输入矩阵 x 的转置。希望现在清楚了为什么我们需要缓存某些变量:在正向传递中使用/计算的一些值需要在反向传递中计算梯度。以下是向后传球的代码:

****def** softmax_cross_entropy_backward():
    norm, y, indeces = softmax_cache[**"norm"**], softmax_cache[**"y"**], softmax_cache[**"indeces"**]
    dloss = norm
    dloss[indeces, y] -= 1
    **return** dloss

**def** linear_backward(dout):
    input = linear_cache[**"input"**]
    dW = np.matmul(input.T, dout)
    db = np.sum(dout, axis=0)
    **return** dW, db**

更新规则

相对于参数的反向传播给出了最陡的变化方向。所以,如果我们向与相反的*方向移动,那么我们将减少函数值。向最陡下降方向移动的最简单算法称为梯度下降** — 将梯度乘以某个值α并从参数中减去它:***

乘性值α非常重要,因为如果它太大,我们可能会超过最小值,但如果它太小,我们可能永远不会收敛。我们在权重更新中采取的步长被称为学习率。学习率是一个超参数一个我们可以改变的值,以在我们训练的网络中产生不同的结果

请注意,在我们的训练制度的代码中,注释了“参数更新”一节:

***def** eval_accuracy(output, target):
    pred = np.argmax(output, axis=1)
    target = np.reshape(target, (target.shape[0]))
    correct = np.sum(pred == target)
    accuracy = correct / pred.shape[0] * 100
    **return** accuracy

*# Training regime* **for** i **in** range(4000):
    indeces = np.random.choice(X_train.shape[0], 4)
    batch = X_train[indeces, :]
    target = y_train[indeces]

    *# Forward Pass* linear_output = linear(batch)
    loss = softmax_cross_entropy(linear_output, target)

    *# Backward Pass* dloss = softmax_cross_entropy_backward()
    dW, db = linear_backward(dloss)

    *# Weight updates* W -= 1e-2 * dW
    b -= 1e-2 * db

    *# Evaluation* **if** (i+1) % 100 == 0:
        accuracy = eval_accuracy(linear_output, target)
        print (**"Training Accuracy: %f"** % accuracy)

    **if** (i+1) % 500 == 0:
        accuracy = eval_accuracy(linear(X_val), y_val)
        print(**"Validation Accuracy: %f"** % accuracy)

*# Test evaluation* accuracy = eval_accuracy(linear(X_test), y_test)
print(**"Test Accuracy: %f"** % accuracy)*

以下是全部代码的完整要点:

也可以在这里找到:https://gist . github . com/ShubhangDesai/72023174 E0 d 54 f 8 FB 60 ed 87 a 3 a 58 EC 7 c

就是这样!我们有一个非常简单的,一个隐藏层的神经网络,可以训练它在我们的玩具数据集上产生 100%的验证和测试准确性。

后续步骤

我们使用的层类型被称为线性全连接层。今年夏天,我将写更多关于其他类型的层和网络架构的文章,以及关于比玩具数据集更酷的应用程序的文章。小心那些东西!

有一些很棒的关于机器学习的在线课程是免费的。Coursera ML 课程当然是经典,但我也推荐斯坦福 CS 231n 的课程材料。这是一门硕士水平的课程,我有幸在上个季度修过;这是令人难以置信的教学和密集。

我还会推荐查看一些关于 TensorFlow 和 PyTorch 的初学者教程。它们是最受欢迎的开源深度学习库,理应如此。教程深入浅出,易于理解。

现在你已经有了神经网络的基础,你已经正式进入了一个令人兴奋的快速变化的领域。去,探索领域!我真的希望机器学习能激发你和我一样的敬畏和惊奇。

如果你喜欢这篇文章,请一定给我一个掌声,并关注我,在你的 feed 中看到我未来的文章!另外,看看我的 个人博客 ,关注我的 推特 了解更多我的想法。

佐治亚州不活跃选民的“激增”

原文:https://towardsdatascience.com/a-spike-of-inactive-voters-in-georgia-77babe0eab70?source=collection_archive---------20-----------------------

用 R 分析佐治亚州选民档案中不活跃的和被清除的选民

介绍

最近的中期选举引发了关于如何、何时以及为什么应该从选民登记文件中清除选民的讨论和辩论。被清除意味着一个选民已经从一个州的选民登记中被删除。乔治亚州当选州长、前州务卿布莱恩·肯普(Brian Kemp)在今年的中期选举中受到密切关注,他被指控在过去的几年里转移了数十万倾向于有色人种的选民。分析人士不仅发现从选民档案中除名的人数不成比例,而且这些选民中的许多人完全有资格,并且不知道他们被除名了。为了更好地了解删除选民的过程,我查看了 2017 年 9 月和 11 月的佐治亚州选民登记文件,以了解谁被删除,为什么被删除,何时被删除,以及这些选民是谁的种族。我对种族感兴趣,因为它经常是佐治亚州和全国关于选举权和选民压制的争论焦点。

工具和数据

对于这个项目,我使用的是 2017 年 9 月和 11 月的佐治亚州选民文件。为了分析数据,我将 R 与 R Studio 和一些有用的库一起使用。

library(tidyverse)
library(RColorBrewer)
library(lubridate)
library(ggpubr)
library(scales)

Tidyverse 是整理数据最有用的库。它让我能够轻松地对数据进行分类。例如,它提供了根据特定值的属性进行过滤或根据特定列进行分组的能力。这在我创建数据子集时非常有用。大多数其他库只是为了图形的美观。

为了整理数据,我创建了两个转换变量类型的函数——将字符类型转换为日期或数字类型——以及一个向量来帮助消除数据中不需要的和无用的列。

# We need to change our dates to Date types 
setAs("character","myDate", function(from) ymd(from))# We are only given birth year, so we need to convert that to their # age
setAs("character", "age", function(from) as.integer(2017 - as.numeric(from)))# We need to skip some columns that are not useful to us
# as well as read in the correct type for the column 
readcolumns <- c(rep("character", 3), rep("NULL", 9), rep("character", 2), "age", "myDate", rep("character", 2), rep("NULL",2), rep("character", 2), rep("NULL",25), rep("myDate", 4), "NULL", "character", "myDate", rep("NULL", 9))# Sept 2017 GA Voter File 
working.dir <- "C:/Users/Bradley/Desktop/Election Research/Georgia_Daily_VoterBase/"ga_voter.file <- paste(working.dir, "Georgia_Daily_VoterBase.txt", sep="")ga_voter.sept17 <- as.tibble(read.csv(ga_voter.file, header = TRUE, sep = "|", quote = "", dec = ".", colClasses = readcolumns, fill = TRUE, stringsAsFactors = FALSE))colnames(ga_voter.sept17)[6] <- "AGE"

为了使日期更容易处理,我创建了一个包装函数,它使用了来自 lubridate 库的 ymd()函数(year,month day)。此函数将日期列转换为日期类型。

佐治亚州的选民档案不包括年龄,而是出生年份。我创建了一个将出生年份转换成年龄的函数。我还把栏目名改成了“年龄”。我最终没有在这个项目中使用这个属性,但是它可能在将来的分析中有用。

我在 2017 年 11 月的佐治亚州选民文件上使用了所有相同的函数和“readcolumns”向量。

你可以在我的 github 上找到这个项目的所有代码。

分析

为了开始我的分析,我查看了 2017 年 9 月佐治亚州选民文件中的非活跃选民和他们的“日期改变”状态。在乔治亚州的选民档案中,“更改日期”类别是选举官员最后一次更新登记的日期。我决定查看非活跃选民的日期更改频率,因为如果大规模选民清洗开始,我预计会看到大量选民的状态在大群体中被更改为非活跃。这样做,我发现了三大“尖峰”:2015 年 8 月 8 日,2015 年 10 月 5 日,2017 年 8 月 9 日。

# All Inactive voters from the Sept 2017 voter file 
inactive.sept17 <- ga_voter.sept17 %>% filter(VOTER_STATUS == "I")

Figure 1: Frequency graph of dates changed among inactive voters.

为什么这么多注册在这些日期被改变?

这些峰值让我们深入了解佐治亚州的选民清洗过程。注册人数的大幅增加是因为佐治亚州在重大选举(中期选举和总统选举)结束的年份清理选民档案,这就是为什么日期相隔一年,但在一年中的同一时间。我发现这些尖峰仍然很有趣。在三个主要峰值中,我决定关注 2017 年 8 月 9 日,主要有两个原因:

  1. 我有 2017 年的其他选民文件,所以我有更多那一年的数据。
  2. 2017 年 8 月 8 日,司法部决定俄亥俄州大规模清洗选民的方法是可以接受的。佐治亚州使用与俄亥俄州相似的方法来清洗选民。

在整个分析中,我将 2017 年 8 月 9 日称为“尖峰”。

谁在秒杀?

首先,我想看看 2017 年 9 月选民文件中的选民比例。接下来,我想看看,在 2017 年 9 月的数据集中,所有不活跃的选民中,有多少人处于峰值。

# Inactive voters in the spike
inactive.spike <- inactive.sept17 %>% 
 filter(DATE_CHANGED == “2017–08–09”)# voters in spike / all inactive voters
spike_by_inactive <- nrow(inactive.spike) / nrow(inactive.sept17) * 100# voters in spike / all voters
spike_by_total <- nrow(inactive.spike) / nrow(ga_voter.sept17) * 100spike <- tibble(Voters = c('Of Total', 'Of Inactive'), 
                Percent = c(spike_by_total, spike_by_inactive))

Figure 2: Bar chart showing percent of voters in spike among total voters and total inactive voters.

该峰值包含 2017 年 9 月佐治亚州选民文件中所有选民的 2.1%和所有非活跃选民的 22.6%。因此,峰值包含数据集中的大部分非活跃投票者。

接下来,我查看了所有选民、非活跃选民和峰值内选民的种族分类。为了检查尖峰中任何潜在的成员比例失调,我在数据集中创建并可视化了三个群体子集:

  1. 穗中的选民
  2. 不活跃的选民
  3. 整个 2017 年 9 月选民档案的选民总数

利用这些子集,我按种族将他们分组。通过比较高峰和非活跃选民总数中的百分比与选民百分比,我可以检查一个群体在高峰或非活跃中的存在是否与他们在数据集中的总体代表性不相称。例如,如果一个群体在尖峰信号中所占的比例大于总比例,那么它就是不相称的。

# Total percent by race
total.race <- ga_voter.sept17 %>%
  group_by(RACE) %>%
  summarise(Total = n()/nrow(ga_voter.sept17) * 100) %>%
  arrange(desc(Total))
total.race# Spike percent by race
spike.race <- inactive.spike %>%
  group_by(RACE) %>%
  summarise(Spike = n()/nrow(inactive.spike) * 100) %>%
  arrange(desc(Spike))
spike.race# Inactive percent by race
inactive.race <- inactive.sept17 %>%
  group_by(RACE) %>%
  summarise(Inactive = n()/nrow(inactive.sept17) * 100) %>%
  arrange(desc(Inactive))
inactive.race# Make a table for all results to compare proportions
total_inactive <- merge(x = total.race, y = inactive.race, by = "RACE")
total_inactive_spike.1 <- merge(x = total_inactive, y = spike.race, by = "RACE") %>% 
  arrange(desc(Total))
format(total_inactive_spike.1, digits=1, nsmall=2)# Using gather, we can make the data more friendlier to work with in a graph
total_inactive_spike.2 <- total_inactive_spike.1 %>% 
  gather(Total, Inactive, Spike, key="Voters", value="Percent") %>%
  arrange(RACE)
format(total_inactive_spike.2, digits=1, nsmall=2)

Figure 3: Bar graph representing the racial breakdown of voters in the spike, total inactive voters, and total voters.

各组中白人占多数(斯派克占 54.7%;占非活跃选民总数的 52.5%;占总选民的 54.9%)。因为白人在总选民中占大多数,他们在高峰和非活跃选民总数中的代表性并不令人关注。对所有群体来说,这些百分比表明,在高峰和非活跃选民总数中的代表性是成比例的。为了扩展这个项目,我们可能会使用某种类型的分布测试来统计比较这些比例。

既然我们已经对选民档案有了一个全面的了解,我决定看看高峰时期的活动。对于这部分分析,我决定对三个不同的组重复上面的分析:

  1. 参加 2016 年大选投票的人
  2. 在高峰和 2017 年 11 月之间被清洗的人
  3. 在 2016 年大选中投票的人在高峰和 2017 年 11 月之间被移除

对于每个群体(如上所述),我检查了我之前创建的三个子群体中的每一个——(1)处于高峰的选民,(2)不活跃的选民,以及(3)整个 2017 年 9 月选民文件中的总选民。

第一组:参加 2016 年大选投票的人

为了查看在高峰期间投票的每个人,我采用了我最初的非活跃选民子集,并根据他们更改日期的高峰日期和他们上次投票日期的 2016 年选举日进行了过滤。我只选择了选举日,没有包括提前投票的选民,因为我找不到任何提前投票的人。

# Spike voted
spike.voted <- inactive.sept17 %>% 
  filter(DATE_CHANGED == "2017-08-09" & DATE_LAST_VOTED == "2016-11-08")voted_by_spike <- nrow(spike.voted) / nrow(inactive.spike) * 100voted_by_inactive <- nrow(spike.voted) / nrow(inactive.sept17) * 100voted_by_total <- nrow(spike.voted) / nrow(ga_voter.sept17) * 100voted <- tibble(Voted = c('Total', 'Inactive', 'In Spike'), 
                Percent = c(voted_by_total, voted_by_inactive,                  voted_by_spike))

Figure 4: Bar graph of 2016 General Election voters who are in the spike among all spike, inactive, and total voters.

我很惊讶(也有点怀疑)约 35%的 spike 在 2016 年选举日投了票。一个值得问的问题是,为什么 47931 名选举日选民在不到一年后变得不活跃?我们还应该记住,在总统选举一年后的 2017 年 9 月选民文件中,这个峰值占所有非活跃选民的 22.6%。

查看每个人口的种族分类,我重复了按种族分组的过程,创建了每个种族按其受尊重的人口所占百分比的表格,并合并了结果。

# Voted by race / all voted
voted_overall.race <- all.voted %>%
  group_by(RACE) %>%
  summarise(Total = n()/nrow(all.voted) * 100) %>%
  arrange(desc(Total))
voted_overall.race# Voted in spike by race / all voted in spike
voted_in_spike.race <- spike.voted %>%
  group_by(RACE) %>%
  summarise(Spike = n() / nrow(spike.voted) * 100) %>%
  arrange(desc(Spike))
voted_in_spike.race# Voted inactive by race / all voted inactive
voted_by_inactive.race <- inactive.voted %>%
  group_by(RACE) %>%
  summarise(Inactive = n() / nrow(inactive.voted) * 100) %>%
  arrange(desc(Inactive))
voted_by_inactive.race# Make a table for all results to compare proportions
overall_inactive <- merge(x = voted_overall.race, y = voted_by_inactive.race, by = "RACE")
overall_inactive_spike.1 <- merge(x = overall_inactive, y = voted_in_spike.race, by = "RACE") %>% 
  arrange(desc(Total))
format(overall_inactive_spike.1, digits=1, nsmall=2)# Using gather, we can make the data more friendlier to work with in a graph
overall_inactive_spike.2 <- overall_inactive_spike.1 %>% 
  gather(Total, Inactive, Spike, key="Voters", value="Percent") %>%
  arrange(RACE)
format(overall_inactive_spike.2, digits=1, nsmall=2)

Figure 5: Bar graph representing the racial breakdown of 2016 General Election day voters in the spike, total inactive voters, and total voters.

看起来,在总选民中,不活跃选民和活跃选民明显不成比例。我们可以看到这一点,因为当白人的比例从总数下降到不活跃和/或支持选民的比例时,黑人的比例却上升了。这一结果表明,白人在高峰和非活跃选民群体中的代表性低于他们的总体代表性,而黑人的情况正好相反——他们的代表性似乎不成比例。

第二组:在斯派克和 2017 年 11 月之间被清除的人

在看了投票的人之后,我的下一个问题是,一旦人们变得不活跃,他们会在多长时间内被移除?

我使用了 2017 年 11 月佐治亚州的选民文件,并在 2017 年 11 月的选民文件中寻找处于峰值但的人。这意味着在他们变得不活跃和 2017 年 11 月选民文件发布之间的某个时候,选民已经被清除。

# How many were purged from the entire voter file?
purged.all <- ga_voter.sept17 %>% filter(!(ga_voter.sept17$REGISTRATION_NUMBER %in% ga_voter.nov17$REGISTRATION_NUMBER))# How many were purged from the spike?
purged.spike <- inactive.spike %>% filter(!(inactive.spike$REGISTRATION_NUMBER %in% ga_voter.nov17$REGISTRATION_NUMBER))# How many were purged that were inactive?
purged.inactive <- inactive.sept17 %>% filter(!(inactive.sept17$REGISTRATION_NUMBER %in% ga_voter.nov17$REGISTRATION_NUMBER))purged_by_spike <- nrow(purged.spike) / nrow(inactive.spike) * 100purged_by_inactive <- nrow(purged.spike) / nrow(inactive.sept17) * 100purged_by_total <- nrow(purged.spike) / nrow(ga_voter.sept17) * 100purged <- tibble(Voters = c('Total', 'Inactive', 'In Spike'), 
                Percent = c(purged_by_total, purged_by_inactive, purged_by_spike))

Figure 6: Bar graph of spike voters who were removed between September and November 2017 in the spike, total inactive voters, and total voters.

不到 1%的尖峰被清除出选民档案。虽然这只是一个很小的百分比,但仍有 900 多人。

接下来,我研究了这个群体的种族划分——从峰值中清除了选民。

# Purged by race / all purged
purged_total.race <- purged.all %>%
  group_by(RACE) %>%
  summarise(Total = n() / nrow(purged.all) * 100) %>%
  arrange(desc(Total))
purged_total.race# Purged by race in spike / purged in spike
purged_by_spike.race <- purged.spike %>%
  group_by(RACE) %>%
  summarise(Spike = n() / nrow(purged.spike) * 100) %>%
  arrange(desc(Spike))
purged_by_spike.race# Purged by race inactive / all inactive
purged_by_inactive.race <- purged.inactive %>%
  group_by(RACE) %>%
  summarise(Inactive = n() / nrow(purged.inactive) * 100) %>%
  arrange(desc(Inactive))
purged_by_inactive.race# Make a table for all results to compare proportions
purged_inactive <- merge(x = purged_total.race, y = purged_by_inactive.race, by = "RACE")
purged_inactive_spike.1 <- merge(x = purged_inactive, y = purged_by_spike.race, by = "RACE") %>% 
  arrange(desc(Total))
format(purged_inactive_spike.1, digits=1, nsmall=2)# Using gather, we can make the data more friendlier to work with in a graph
purged_inactive_spike.2 <- purged_inactive_spike.1 %>% 
  gather(Total, Inactive, Spike, key="Voters", value="Percent") %>%
  arrange(RACE)
format(purged_inactive_spike.2, digits=1, nsmall=2)

Figure 7: Bar graph representation of racial breakdown of purged voters between September and November 2017 in the spike, total inactive voters, and total voters.

似乎在这些人当中,白人是最不成比例的。西班牙裔略不成比例。这似乎与大多数调查结果相矛盾,大多数调查结果认为,在佐治亚州的选民清洗中,有色人种比白人比例更高。为什么我在这里找不到这个?我将在我们下一次分析后讨论这一点。

第三组:在 2016 年大选中投票的人在高峰和 2017 年 11 月之间被移除

为了将所有事情联系起来,我的最后一个问题是,有多少被清除的选民在 2016 年选举日投票?我使用了我之前清除的选民子集,并根据上次投票日期(等于 2016 年 11 月 8 日)对其进行了过滤。

purged_all.voted <- purged.all %>%
  filter(DATE_LAST_VOTED == "2016-11-08")purged_inactive.voted <- purged.inactive %>%
  filter(DATE_LAST_VOTED == "2016-11-08")purged_spike.voted <- purged.spike %>%
  filter(DATE_LAST_VOTED == "2016-11-08")voted_purged_by_spike <- nrow(purged_spike.voted) / nrow(inactive.spike) * 100voted_purged_by_inactive <- nrow(purged_spike.voted) / nrow(inactive.sept17) * 100voted_purged_by_total <- nrow(purged_spike.voted) / nrow(ga_voter.sept17) * 100voted_and_purged <- tibble(Voters = c('Total', 'Inactive', 'In Spike'), Percent = c(voted_purged_by_total, voted_purged_by_inactive, voted_purged_by_spike))

Figure 8: Bar graph of spike voters who were purged and voted on 2016 election day in the spike, total inactive voters, and total voters.

我们已经减少了相当多的数据。如果 295 个选举日投票者是不活跃的(这包括尖峰中的 243 个选举日投票者),那么在选举中投票并被移除的剩余 8134 个投票者是谁?这些选民的身份是活跃的。8134 名选民是搬走了,还是死了,还是两者兼而有之?看看 2016 年 8,134 名被清洗的选举选民将是一件有趣的事情,可以从这个项目中抽出来做进一步的分析。现在,让我们来看看种族分类。

voted_purged_all.race <- purged_all.voted %>%
  group_by(RACE) %>%
  summarise(Total = n() / nrow(purged_all.voted) * 100) %>%
  arrange(desc(Total))
voted_purged_all.racevoted_purged_inactive.race <- purged_inactive.voted %>%
  group_by(RACE) %>%
  summarise(Inactive = n() / nrow(purged_inactive.voted) * 100) %>%
  arrange(desc(Inactive))
voted_purged_inactive.racevoted_purged_spike.race <- purged_spike.voted %>%
  group_by(RACE) %>%
  summarise(Spike = n() / nrow(purged_spike.voted) * 100) %>%
  arrange(desc(Spike))
voted_purged_spike.race# Make a table for all results to compare proportions
voted_purged_inactive <- merge(x = voted_purged_all.race, y = voted_purged_inactive.race, by = "RACE")
voted_purged_inactive.1 <- merge(x = voted_purged_inactive, y = voted_purged_spike.race, by = "RACE") %>% 
  arrange(desc(Total))
format(voted_purged_inactive.1, digits=2, nsmall=2)# Using gather, we can make the data more friendlier to work with in a graph
voted_purged_inactive.2 <- voted_purged_inactive.1 %>% 
  gather(Total, Inactive, Spike, key="Voters", value="Percent") %>%
  arrange(RACE)
format(voted_purged_inactive.2, digits=2, nsmall=2)

Figure 9: Bar graph representing the racial breakdown of purged 2016 election day voters between September and November 2017 in the spike, total inactive voters, and total voters.

这种比例失调似乎仍然对白人影响最大。它也影响未知种族的人,似乎也轻微影响亚洲人或太平洋岛民。

仍然突出的问题是,为什么白人在清洗和最近投票清洗的选民中所占比例过大,而不是像许多其他分析显示的那样在有色人种中所占比例过大?我的第一个假设是我没有足够的数据。我不应该只看两份不同的选民档案。另一个因素可能是我如何检查数据。我关注的是两个选民文件之间的子集,而不是一整年或几个月的选民文件。也许如果我只看几个月来被清洗的选民和选民档案,我可能会发现比例失调。

总结一下,我决定创建一个水平条形图,显示我们观察到的群体中的所有总人口— (1)选民文件中的每个人,(2)在 2016 年大选中投票的人,(3)在高峰和 2017 年 11 月之间被清洗的人,以及(4)在高峰和 2017 年 11 月之间参加 2016 年大选中投票的人

# Compare total populations of each group and overall
total_populations.1 <- tibble(Race = c("WH", "U", "OT", "HP", "BH", "AP", "AI"), Overall = total_inactive_spike.1$Total, Voted = total_inactive_spike.voted.1$Total, Purged = purged_inactive_spike.1$Total, Voted_And_Purged = voted_purged_inactive.1$Total)total_populations.1total_populations.2 <- total_populations.1 %>%
  gather(Overall, Voted, Purged, Voted_And_Purged, key = "Total_Type", value = "Percent") 
total_populations.2

Figure 10: Horizontal bar graph of total proportions of each subset — Everyone in the voter file, people who voted in on the 2016 General Election Day, people who were purged between September 2017 and November 2017, and people who were purged and voted.

Figure 11: Table representation of horizontal bar graph above.

挑战

在这个项目中,我最大的挑战是不要迷失在数据中。我相信我大大低估了分析数据时“下兔子洞”的容易程度。几乎在每一个转折点,似乎都有一个新的问题要问。在深入研究数据之前,我必须学会如何组织我的想法,并制定一个游戏计划。因此,简而言之,我花了很多时间编写最终没有出现在项目中的东西。

另一个挑战是试图弄清楚我想如何提问。因为我做了很多子集的子集的子集,有时计算我到底想看什么,我需要做什么才能看到它,以及如何可视化它变得令人不知所措。在深入研究数据并开始编码之前,这也是关键的一步。我最终在 Word 上创建了一个详细的大纲,将我的项目分成几个部分,并列出我需要计算的内容。幸运的是,分析是重复的,所以一旦我有了一些初始计算,我只需要正确地创建我的子集并应用关于子集的计算。

结论

在很大程度上,我不认为有什么突出的或致命的发现,但我确实相信这为进一步调查选民清洗以及他们如何在佐治亚州运作奠定了基础。这个项目的下一步将是使用更多的数据,并寻找一年中的整体清除。我相信这样做很可能会导致其他人发现的不相称的结果。我想采取的另一个步骤是对这个项目进行统计分析。我需要做更多的研究,了解需要使用哪些测试,以及如何正确地可视化结果。总而言之,对我个人来说,这是一次很棒的学习经历,学习 R 和它所有的功能非常令人兴奋。我计划继续对这个项目和其他相关项目做进一步的分析,为争取一个公平的民主做出贡献。

标准误差

原文:https://towardsdatascience.com/a-standard-error-450820b5822?source=collection_archive---------5-----------------------

我最近正在读一本畅销书,讲述概率在日常生活中的应用,作者是列纳德·蒙洛迪诺。它雄辩地追溯了测量不确定性的历史,计算随机事件的概率。精选名言:

我们生命的轮廓,就像蜡烛的火焰,不断被各种随机事件引导向新的方向,这些事件以及我们对它们的反应,决定了我们的命运。

这些计算得出的见解令人惊讶,也说明了人类对随机性的直觉有多离谱。例如,如果你玩加州彩票,你死在去当地彩票供应商的路上的可能性和你中奖的可能性一样大。当你考虑到这个结果时,这个游戏就不那么吸引人了。

在这段关于数学家伯努利和以他名字命名的分布的文章中,我发现了一个错误:

假设巴塞尔 60%的选民支持市长。你要调查多少人才能有 99.9%的机会发现市长的支持率在 58%到 62%之间——也就是说,结果的精确度在正负 2%以内?(假设,为了与伯努利一致,被调查的人是随机选择的,但有替换。换句话说,你可能不止一次地调查一个人。答案是 25,550 人,在伯努利的时代,这大约是巴塞尔的全部人口。伯努利没有忘记这个数字是不切实际的。

根据我的计算,你只需要调查 6446 人,而不是 25550 人。我使用二项式的 CDF 来寻找最小的 n,它给出了至少 0.999 的概率,估计值在 0.58 和 0.62 之间。下面是 R 中的一行程序,p=0.6,n=6446:

pbinom(天花板(n.62),n,p)-pbinom(地板(n.58),n,p)
1 0.9990067

求解 n 的更直接的方法是使用二项式均值的标准误差公式。下面的公式依赖于二项式的正态近似。我们想找到 n,使得区间等于[0.58,0.62]。

z_{𝛼/2}是标准正态分布的 1- 𝛼/2 分位数,其中𝛼是误差率,在本例中为 1–0.999 = . 001。求解 n 得到 6496.5,与之前计算的值相似。

如果对作者的 25550 人进行民调,那么 99.9%的区间就是 p 0.01,而不是 0.02。换句话说,在 25,550 人的调查中,99.9%的人会显示估计在 59%和 61%之间,而不是声称的 58%和 62%。

一本令人愉快的书中的一个小错误。

使用 Python、pandas、seaborn 和 scikit-learn 进行探索性数据分析的入门包

原文:https://towardsdatascience.com/a-starter-pack-to-exploratory-data-analysis-with-python-pandas-seaborn-and-scikit-learn-a77889485baf?source=collection_archive---------2-----------------------

我也是一个装满东西和小摆设的背包。你可能需要的任何东西我都在里面。—来自爱探险的朵拉的背包(来源)

探索性数据分析(EDA)是任何处理数据的人的谋生之道。随着信息每天增加 2.5 万亿字节( Forbes,2018 ),对高效 EDA 技术的需求空前高涨。

那么这场洪水来自哪里呢?有用信息的数量几乎肯定不会以这样的速度增长。当我们仔细观察时,我们会意识到这种增加的大部分是由噪声引起的。有如此多的假设需要检验,如此多的数据集需要挖掘,但客观事实的数量相对恒定。对于大多数数据科学家来说,他们的主要目标是能够区分信号和噪声,EDA 是实现这一目标的主要过程。

输入 EDA

在这篇文章中,我将介绍一个初学者包,使用流行的 Python 包:pandas、matplotlib、seaborn 和 scikit-learn 在 Titanic 数据集上执行 EDA。

代码参考可以参考我的 GitHub 库这里。

通信数据

一般来说,我们可视化数据有两个主要原因:

  • 理解(EDA)
  • 交流

在最后一部分,我将分享一些有用的仪表板指南,它们将帮助你清晰有效地传达你的分析结果。

大纲:

  1. 什么是数据
  2. 分类分析
  3. 定量分析
  4. 聚类
  5. 基于树的估计器的特征重要性
  6. 仪表板技术

1.什么是数据

首先,一些理论。“数据”一词在 1946 年首次用于表示“可传输和可存储的计算机信息”(来源)。在最高级别,术语数据可以大致分为两类:结构化非结构化。结构化数据是预定义的数据模型,通常驻留在具有固定模式的关系数据库或数据仓库中。常见的例子包括交易信息、客户信息和日期。另一方面,非结构化数据没有预定义的数据模型,只能在 NoSQL 数据库和数据湖中找到。示例包括图像、视频文件和音频文件。

在这篇文章中,我们将聚焦于结构化数据,在这里我将提出一个系统的方法来快速显示你的数据中潜在的统计数据。在结构化数据的保护伞下,我们可以进一步将它们分类为分类定量。对于分类数据,算术规则不适用。在分类家族中,我们有名义序数数据,而在数量家族中,我们有区间比率。重要的是,我们需要一些时间来清楚地定义和理解每个术语之间微妙而重要的差异,因为这将影响我们以后的分析和预处理技术。

4 Different types of Data

标称数据

“名义上的”这个名字来自拉丁语, nomen ,意思是名字。名义数据是由简单命名系统区分的对象。需要注意的一件重要事情是,名义数据也可能分配有数字。这可能会出现序数(定义如下),但他们不是。编号的标称数据仅用于获取和参考。一些例子包括:

  • 一组国家。
  • 钉在马拉松运动员身上的号码。

有序资料

顺序数据是指那些其顺序很重要的项目。更正式的说法是,它们在有序尺度上的相对位置为我们提供了意义。这可能表示优势或时间位置等..默认情况下,序数数据的顺序是通过给它们分配数字来定义的。然而,也可以适当地使用字母或其他顺序符号。一些例子包括:

  • 一场比赛的名次(第一、第二、第三)
  • 组织中的工资等级(助理,AVP,副总裁,SVP)。

区间数据

与顺序数据类似,间隔数据是沿着一个标尺测量的,其中每个对象的位置彼此之间的距离是等距的。这个独特的属性允许算术应用于它们。一个例子是

  • 华氏 78 度和 79 度之间的温度差与 45 度和 46 度相同。

比率数据

像区间数据一样,比率数据的差异是有意义的。比率数据有一个额外的特性,使对象的比率也有意义,那就是它们有一个真零点。零表示没有某个属性。所以当我们说某样东西没有重量时,我们的意思是那东西没有质量。一些例子包括:

  • 体重秤上人的重量

区间 vs 比率

区间和比值的区别只是一个没有真正的零点,而另一个有。举个例子可以很好地说明这一点:当我们说某样东西的温度是 0 华氏度时,并不意味着那东西没有热量。这一独特的性质使得诸如“华氏 80 度是华氏 40 度的两倍”之类的说法不成立。

回提纲

在我们深入研究其他部分之前,我想形式化一些概念,这样你就可以清楚地知道我们为什么要做下面显示的事情。

首先,我要说的是,快速显示数据摘要的最佳方式是通过 2D 图。尽管生活在 3D 空间世界中,人类发现很难感知第三维度,例如深度,更不用说 3D 图在 2D 屏幕上的投影。因此,在随后的章节中,您会看到我们仅使用条形图表示分类数据,使用箱线图表示定量数据,因为它们分别简洁地表达了数据分布。我们将只关注目标变量的单变量分析双变量分析。有关仪表板技术的更多详细信息,请参考本文的第 6 节。

我们将主要使用海洋生物和熊猫来完成这个任务。众所周知,统计是任何数据科学家的工具箱中必不可少的一部分,seaborn 允许快速轻松地使用 matplotlib 来漂亮地可视化您的数据统计。matplotlib 功能强大,但有时会变得复杂。Seaborn 提供了 matplotlib 的高级抽象,允许我们轻松地绘制有吸引力的统计图。为了更好地利用 seaborn,我们还需要熊猫,因为 seaborn 与熊猫的数据帧配合得最好。

此外,如果您想跟随编码,一定要下载数据并正确设置您的环境。您可以在自述文件中找到说明。我的 GitHub repo 中的 MD 文件。

说到这里,让我们开始动手吧!

2.分类分析

我们可以使用pd.read_csv()开始读取数据。通过对数据框执行.head(),我们可以快速查看数据的前 5 行。对于那些不熟悉 pandas 或数据框概念的人,我强烈建议花半天时间浏览以下资源:

  1. 熊猫文档
  2. 什么是数据帧?

其他有用的方法有.desribe().info(),前者会显示:

Output of .describe() method on a data frame

后者会显示:

Output of .info() method on a data frame

我们现在看到,

分类数据:

  • PassengerId,
  • 幸存了下来,
  • Pclass,
  • 姓名,
  • 性,
  • 票,
  • 小屋,
  • 登上了

而定性数据:

  • 年龄,
  • SibSp,
  • 炒熟,
  • 和票价

现在,有了这些知识和我们在第 1 节中学到的知识,让我们编写一个定制的帮助器函数,它可以用来处理大多数种类的分类数据(或者至少尝试这样做),并给出它们的快速摘要。我们将借助一些熊猫方法和 seaborn 的.countplot()方法来做这些。助手函数称为categorical_summarized,如下所示。

Helper Function #1: Categorical Data Summarizer

categorical_summarized所做的是接收一个数据帧,连同一些输入参数,并输出以下内容:

  1. 数字数据的计数、平均值、标准差、最小值、最大值和四分位数,或者非数字数据的计数、唯一性、顶级和顶级频率。
  2. 如果verbose设置为True,感兴趣列的分类频率
  3. 感兴趣的列的每个类的计数的条形图

让我们来谈谈输入参数。xy接受一个str类型,它对应于我们想要调查的感兴趣的列。将列名设置为x将创建一个条形图,x 轴显示不同的类,y 轴显示它们各自的计数。将感兴趣的列的名称设置为y将会翻转前面的图的轴,其中不同的类将位于 y 轴上,而 x 轴显示计数。通过将hue设置为目标变量,该函数将显示目标变量对相关列的依赖性。显示categorical_summarized用法的示例代码如下所示:

使用“分类总结”的一些例子

单变量分析

Using categorical_summarized on Survival Variable

将给出以下内容:

Output of categorical_summarized on Survival Variable

双变量分析

Using categorical_summarized on Gender Variable with hue set to Survived

将给出以下内容:

Output of categorical_summarized on Gender Variable with hue set to Survived

更多例子请参考 GitHub repo 中的Titanic.ipynb

回提纲

3.定量分析

现在,我们可以在技术上使用条形图来表示定量数据,但这通常会非常混乱(您可以尝试在Age列上使用categorical_summarized,您会看到一个由细箱组成的混乱图)。更简洁的方法是使用箱线图,它基于五个数字汇总显示分布:最小值、Q1、中值、第三季度和最大值。

下一个助手函数称为quantitative_summarized,定义如下:

Helper Function #2: Quantitative Data Summarizer

categorical_summarized类似,quantitative_summarized接收一个数据帧和一些输入参数,以输出潜在统计数据以及一个箱线图和群集图(如果swarm设置为true)。

quantitative_summarized可以接受一个定量变量和最多两个分类变量,其中定量变量必须分配给y,另外两个分类变量可以分别分配给xhue。显示用法的一些示例代码如下所示:

一些使用“定量 _ 概括”的例子

单变量分析

Using quantitative_summarized on Age Variable

将给出以下内容:

Output of quantitative_summarized on Age Variable

双变量分析

Using quantitative_summarized on Age Variable with x set to Survived

将给出以下内容:

Output of quantitative_summarized on Age Variable with x set to Survived

多变量分析

Using quantitative_summarized on Age Variable with x set to Survived and hue set to Pclass

将给出以下内容:

Output of quantitative_summarized on Age Variable with x set to Survived and hue set to Pclass

相关性分析

我们可以使用的另一个流行的定量分析是找出变量之间的相关性。相关性是理解数据集中变量之间关系的一种方式。对于任何一对变量:

  • 正相关:两个变量同向变化
  • 中性相关:变量的变化没有关系
  • 负相关:变量反向变化

皮尔逊相关系数通常用于总结两个样本变量之间线性关系的强度。这是两个变量之间的协方差的归一化,

Pearson’s Correlation Coefficient Formula

形象化的一个好方法是使用热图。我们首先丢弃分类变量,并用它们的模式填充剩余定量变量的缺失值。熊猫数据框架允许用.corr方法简单计算皮尔逊的 CC。代码可以在下面找到

Heatmap of Pearson’s CC for Quantitative Variables

这种可视化的一个好处是,我们不仅可以看到变量之间的关系,例如,Fare 和 Pclass 之间存在负的 Pearson CC,我们可以避免多重共线性现象的发生。

多重共线性会对广义线性模型(如逻辑回归)产生不利影响。当变量之间存在高度相关性,导致回归系数的估计不稳定时,就会出现这种情况。然而,如果你计划使用决策树作为你的预测器,那么你不需要担心这个。

关于共线性的有趣阅读可以在这里找到。

相关性有助于数据插补,相关变量可用于填充彼此的缺失值。相关性也可以表示因果关系的存在。也就是说,需要注意的是相关性并不意味着因果关系。

更多例子请参考 GitHub repo 中的Titanic.ipynb

回到大纲

4.使聚集

k 均值聚类

k-means 聚类属于划分聚类家族。在分区集群中,我们必须指定我们想要的集群数量, k 。这可以通过挑选如下所示的惯性图的“肘”点来完成。一个好的选择是 k ,它不是太大并且具有低惯性值。惯性是一种衡量群集质量的指标,它为我们提供了群集紧密程度的指标。

Inertia plot using K Means Clustering to select a suitable k value

当 K Means 计算特征之间的距离以决定随后的观察是否属于某个质心时,我们必须通过编码分类变量和填充缺失值来预处理我们的数据。下面显示了一个简单的预处理函数。

Function to preprocess the data to prepare for Clustering

既然我们已经处理了数据,我们必须执行特征缩放,以便可以比较跨特征计算的距离。这可以通过sklearn.preprocessing库轻松完成。代码实现请参考Titanic.ipynb。运行 k-means 算法后,我们设置 k = 2 ,我们可以绘制如下所示的变量。

Cluster red and blue plotted on Age and Survived Axes

层次凝聚聚类

对于这一小节,我将介绍另一种通过集群执行 EDA 的快速方法。凝聚聚类使用自下而上的方法,根据各个观察值之间的距离将它们迭代地连接在一起。我们将使用scipy.cluster.hierarchy包来执行链接,并使用树状图显示我们的结果。通过最近邻法计算两个聚类之间的距离。

Code to implement Hierarchical Agglomerative Clustering

Dendrogram of the Hierarchical Clustering of the Titanic Dataset

回提纲

5.基于树的估计器的特征重要性

执行 EDA 的另一种快速方法是通过基于树的估计器。决策树学习如何在最终输出预测的叶节点之前“最佳地”将数据集分割成更小的子集。这种分裂通常由一个杂质标准来定义,如基尼信息增益熵。因为这是一篇关于 EDA 而不是决策树的文章,所以我不会详细解释它们背后的数学原理,但是我会告诉你如何使用它们来更好地理解你的特性。更多细节你可以参考这篇写得很好的文章。

基于杂质标准,可以通过贪婪地挑选对最大信息增益有贡献的特征来构建树。为了说明这一点,我将使用scikit-learn库。

构建随机森林分类器

我们首先构建一个随机森林分类器。默认情况下,杂质标准设置为基尼系数。使用下面的代码,我们可以看到我们的 Titanic 数据集的相应特征的重要性。

Code to generate a Random Forest Classifier, train, and also plot the Feature Importance

让我们试试 XGBoost

另一种创建决策树集合的方法是通过 XGBoost,它是梯度增强框架家族的一部分。使用下面的代码,我们可以看到哪个相应的特性对我们的 XGBoost 是重要的。同样,默认情况下,杂质标准设置为基尼系数。

Code to generate an XGBoost Classifier, train, and also plot the Feature Importance

回提纲

6.仪表板技术

与信息图表不同,仪表板的创建是为了在单个屏幕上以干净、简洁的方式客观地显示重要信息,目的是通知而不是误导读者。通常,仪表板是利用我们的视觉感知能力来放大认知的数据表示。他们显示的信息是高质量的图形,所有人都能理解,不需要额外的信息来解释。

为了实现卓越的图形,必须遵守以下两个关键方面:

  1. 最大化数据:墨迹和最小化图表垃圾
  2. 具有高度的图形完整性

数据:墨水和图表垃圾

数据:墨水被定义为用于表示数据的墨水,而图表垃圾被定义为多余的、装饰性的或转移注意力的墨水。图表垃圾的例子有莫尔振动、网格和鸭子。为了实现这一点,我们利用我们的预先注意属性格式塔原则来引出可视化的模式。

Image showing the side of a man’s face, at the same time, the front of his face. An example to illustrate Figure & Ground

实现图形完整性

改编自:爱德华·塔夫特。(2001).定量信息的可视化显示,第二版,图形,有六个原则保证图形的完整性:

  1. 使数字的表示与数量成比例
  2. 使用清晰、详细、彻底的标签
  3. 显示数据变化,而不是设计变化
  4. 使用标准化单位,而不是标称值
  5. 描述少于或等于“n”个可变维度的“n”个数据维度
  6. 引用完整上下文中的数据

因此,我们避免使用饼状图或 3D 图或区域尺寸。条形图和箱线图是实现图形完整性的很好的例子,因为它们简单(每个人都可以毫不含糊地理解)而且强大。不要遗漏上下文也很重要,比如让轴显示以零为参考的定量数据。

Examples of Misleading Graphics with Poor Graphical Integrity

迄今为止, Tableau 可能是仪表板方面的行业领导者。他们采用了最佳的仪表板实践,还通过拖放为您完成了绘制图表的繁重工作。我强烈推荐任何对这个领域感兴趣的人来看看 Tableau。另一个新兴的开源项目叫做 Apache Superset ,它做的事情与 Tableau 类似。

回轮廓

结论

总而言之,做 EDA 有无数种方法。EDA 是整个数据科学过程的一部分,这个过程是高度迭代的。我在这篇文章中分享的是我在参加了一些数据科学黑客马拉松后学到的东西,我在 AI Singapore 担任数据科学家的时间,以及我在 MTech 课程中的项目。我坚信首先要建立一个坚实的基础,然后我们优化速度和性能,这也是我写这篇文章的动机。有了这组帮助函数,我和我的团队能够理解我们给定数据集的潜在统计数据,然后制定一个合理的策略,在半天的黑客攻击内构建一个分类器。

这篇文章并不是 EDA 的完整指南,而是一个入门包,让有抱负的数据科学家使用 Python、pandas、seaborn 和 scikit-learn 等开源工具开始他们的第一个数据科学项目。如果您有任何基于 Python 包的很酷的自定义函数,并且在 EDA 过程中对您有所帮助,请随时在下面留下您代码的评论。您还可以提交一个 pull 请求并贡献给helper.py文件。感谢阅读😄。我希望你带走了一些东西。

特别提及德里克 ,以及 钦扬 对本文进行校对并反馈改进意见

随时通过TwitterLinkedIn与我联系!****

如果你对我参与的其他项目感兴趣,欢迎访问我的GitHub**

想学习如何快速构建人体动作分类器?请查看我之前的帖子 这里

机器学习的故事:我们如何识别

原文:https://towardsdatascience.com/a-story-in-machine-learning-how-do-we-see-59db689e84b9?source=collection_archive---------3-----------------------

A star named Fomalhaut and its surrounding belt dust (also known as the eye of Sauron)

考虑一个场景:当你环游世界一半的时候,你走在这个新城市的市中心,欣赏着新的风景。突然,你的注意力集中在向你走来的人身上。当你们彼此越来越接近时,你的大脑开始识别零碎的东西;首先是眼睛,然后是微笑,走路,脸型。突然,它击中了你。是你十年未见的朋友!

我们如何看到?

我们如何识别物体和人?我们如何区分椅子和桌子?朋友换了发型,胖了或者瘦了,长大了,我们怎么区分?这种能力与大脑不储存确切的图像而是储存抽象图像的事实有关。椅子的定义不是存储为一个四条腿的棕色木质物体,有一个背面,而是一个从地面升起的物体,有一些支撑,适合一个人放置。它可能有也可能没有轮子,可能有也可能没有扶手,等等。此外,随着我们看到越来越多的椅子,这种抽象会随着时间而演变。事实上,我们倾向于将这些抽象概念及时投射回去,并根据新的信息改变我们对过去的记忆。

电脑怎么看?

类似地,通过抽象来识别对象的计算机系统。一个简单的方法是使用主成分分析(PCA)。我将使用模式识别中机器学习的第一个真实世界应用之一来说明这一点,即识别邮政编码。在这个简单的例子中,我将说明如何构建一个非常简单的系统来将手写数字转换成数字。下图显示了将要分析的一些手写数字的示例。帖子最后给出了数据集链接。

% Open and read the file
fileID = fopen('optdigits-orig.tra','r');
formatSpec = '%s';
data = textscan(fileID,formatSpec); data = char(data{1});% Define important parameters
nx = 32; ny = 32; nxny = nx*ny;
nNumbers = size(data,1)/ (nx + 1);% Initialize the output
trainingMatrix = zeros(nxny, nNumbers);
output = zeros(nNumbers, 1);% Subdevide data into images
for i = 1:nNumbers
    startingLocation = ((i-1)*(nx+1))+1;
    endingLocation = startingLocation + ny - 1; 
    outputLocation = endingLocation +1;
    trainingMatrix(:,i) = str2num(reshape(data (startingLocation:endingLocation, :), nxny, 1)); 
    output(i) = str2double(data(outputLocation, :));
end% Visualize some the images
figure('Color', 'White');
for i = 1:6
    subplot(2,3,i)
    imagesc(reshape(trainingMatrix(:,i),32,32));
    axis equal; axis tight;
    set(gca,'xTickLabel', [], 'yTickLabel', []);
    colormap gray; 
end

Examples of handwritten numbers from the dataset used here

一般过程如下:1)首先,获得具有正确数字表示的手写数字的大训练集,2)系统将使用 PCA 识别每个数字的模式,3)最后,模式将用于对新的手写数字进行预测。

提取模式(构建系统)

主成分在给定的数据集中寻找独立的方向,使得第一方向解释数据集的最大信息量,第二方向解释第二大信息量,等等。下图显示了一个二维数据集以及相应的第一和第二主成分的示例。请注意,第一个分量在数据中具有最大的方差。我不会在这篇文章中详细介绍五氯苯甲醚的工作原理,因为互联网上有很多网站都在讨论这个问题。如果你有任何问题,请在评论中提问,我会用这些信息更新帖子。

How principle componenet analysis works. Note that the first principle component captures more variations (i.e. the data range is longer in that direction)

对图像应用类似的分析,可以获得图像的主成分。下图显示了包含 1934 个手写数字的数据集的前几个主要组成部分。请注意,每个组件都由一个模式组成,该模式可以被视为训练数据集的所有数字的线性组合。

[PC,score,latent,tsquare] = pca(trainingMatrix’);
varianceAccounted = latent./sum(latent);figure(‘Color’, ‘White’);
for i = 1:12
 subplot(4,3,i)
 imagesc(reshape(PC(:,i),32,32))
 axis equal; axis tight;
 set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
 title([‘PC ‘ num2str(i) ‘ — Variance %: ‘ num2str(varianceAccounted(i)*100,’%10.1f’)]);
end

The first 12 (i.e., the most important 12) principle components (patterns) extracted from the handwritten number dataset

更重要的是,请注意,每个数字都可以被认为是这些主分量的线性分量。例如,数字 4(下图)可以认为是由第一个主成分的 0.3835 和第二个主成分的-5.9564 组成,以此类推。这些权重将用于识别新的手写数字。下图显示了使用前 30 个主成分重建的一个手写数字。

% Number index
numberIndex = 4;% Extract the number and its weights
realNumber = trainingMatrix(:,numberIndex);
scoreNumber = score(numberIndex,:);% Reconstruct the number with the first 30 PC
reconstructedNum = zeros(size(realNumber));
for i = 1:30
reconstructedNum = reconstructedNum + (PC(:,i) * scoreNumber(i));
end% Figure
figure(‘Color’, ‘White’);
subplot(1,2,1); imagesc(reshape(realNumber,32,32)); title(‘Original’);
axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
subplot(1,2,2); imagesc(reshape(reconstructedNum,32,32)); title(‘Reconstructed’);
axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
colormap gray;

An example of a handwritten number and its reconstruction using the first 30 principle components

预测新的手写数字(进行预测)

给定一个新的手写数字,可以使用 PCA 提取其中的模式。模式的权重可以与使用训练集构建的表进行比较。重量越接近某个数字,手写数字越有可能是那个数字。二次识别分析用于预测。事实上,我们可以使用权重来构建一个概率解。当然,在这个应用中,最可能的数字被认为是正确的解。但是,您可以考虑某些应用,在这些应用中,相对统一的概率解决方案将导致人工干预来决定最佳解决方案。

% Create Classifier
P = fitcdiscr(score(:,1:7),output’,’DiscrimType’,’pseudoQuadratic’);% Predict and Show
figure(‘Color’, ‘White’)
for i = 1:6
 subplot(2,3,i)
 randomImage = round(rand() * nNumbers);
 label = predict(P,score(randomImage,1:7));
 imagesc(reshape(trainingMatrix(:,randomImage),32,32))
 title([‘This is a ‘ num2str(label)]); colormap gray;
 axis equal; axis tight; set(gca,’xTickLabel’, [], ‘yTickLabel’, []);
end

Example of predicted solution for some handwritten numbers

结束语

我没有概述或使用的一件事是训练数据集与测试数据集的使用。实际上,我应该将数据集的一部分用于训练,另一部分用于测试。此外,在计算量大的数据集中,一些不太重要的主成分可能会被丢弃。我将在其他帖子中讨论这些问题。

我希望你现在明白了让计算机识别物体和人的一种方法。如今普遍使用的更精确的分类器依赖于更复杂的卷积神经网络。有一天我可能会写一篇关于这些的文章。

使用的数据和软件说明

Mathworks Matlab 2016b 在这篇文章中使用。然而,可以使用其他软件来执行相同的分析,包括 Octave(免费)、R(免费)、Wolfram Mathematica 和机器学习库,如 Tensor Flow 或 Microsoft Cognitive Toolkit。数据集是从加州大学欧文分校的机器学习和智能系统中心获得的(链接)。

用逻辑回归研究分类问题及对招生问题的理解

原文:https://towardsdatascience.com/a-study-of-classification-problems-using-logistic-regression-and-an-insight-to-the-admissions-ec69ddf93f36?source=collection_archive---------0-----------------------

摘要:

在我们的世界里,很多经常遇到的问题都是分类问题。我们经常在确定的价值观和对事物的僵化选择之间感到困惑。在本文中,我们将讨论一种使用机器学习有效解决简单分类问题的算法。此外,我们将分析一个假设的二元类问题,涉及基于入学考试成绩和本科成绩的研究生成绩。

简介:

监督学习是一种机器学习技术,其中我们将输入与给定数据集中的目标相关联。对于我们的最终产出,我们已经有了明确的直觉。我们大致有两种类型的监督学习问题,“回归”和“分类”。我们将在本文中讨论分类问题。分类问题是我们将输入数据分成不同类别的问题。所谓离散,我们指的是单独的类。
例如:想象一个基于研究生院招生的假设数据集,有三列。第一列是入学考试分数(输入 X1 ),第二列是 UG 考试(输入 X2 ),第三列是结果,录取/拒绝(目标 Y )。本文中使用的数据集片段如下所示。

Entrance Exam Score, UG Score, Outcome(Binary)

我们将目标类 Y 定义为二进制类。因此,我们将集合定义为, Y={0,1} 其中集合元素为:

0 表示拒绝(否定类),
1 表示接受(肯定类)

因此,这是一个分类问题。我们可以根据录取过程的结果将数据集分为两类。通常将数据集分解为离散类别的算法被定义为分类器。在这个例子中,因变量是二分的。在这种情况下,我们更喜欢逻辑回归。我们可以在 MATLAB/Octave 中绘制数据集的散点图,并观察下图:

Scatter plot of our dataset

涉及的激活功能和映射功能:

首先,考虑映射我们的输出和输入的函数,因此在计算平方误差函数时用于计算预测。让我们称那个函数为映射函数或假设函数, h(X) 。“假说”一词是出于各种历史原因而创造的。此外,术语“逻辑”是乙状结肠的同义词。因此,我们在该算法中使用具有“S 形曲线”的 Sigmoid 激活函数。通过我们的编程功能生成的曲线如下所示。

Sigmoid Activation Function

数学上,我们将函数定义为:

Sigmoid 函数还有其他几个数学特性。比如我们可以用函数本身来表示函数的导数。

这种 Sigmoid/Logistic 函数简化了优化过程中涉及的数学运算,是小规模分类问题的理想选择。使用 Sigmoid 函数,我们可以有效地限制我们的范围,以便它有效地表示概率。我们可以用数学方法将假设/映射函数表示为:

这本质上是一个非常基本的线性成本函数,只是它与一个 sigmoid 函数相结合。

我们的假设函数给出了任何给定事件发生概率的数值。我们可以将映射函数的范围定义为: 0≤h(X)≤1

成本函数直觉:

成本函数是一种数学函数,用于估计假设与输入集和目标集的匹配程度。从图形上看,我们知道一个更好的成本函数会更好地拟合我们给定的数据。它通常表示为参数的函数。在这种情况下,我们称之为 J(θ)
在这个算法中,我们使用了一个对数代价函数,它是从最大似然估计(M.S.E) 的原理中推导出来的,以确保我们得到的作为输出的函数是一个凸函数。

一个简单的直觉是认为代价函数中涉及的对数大致反作用于所涉及的 exp

正如克里斯托弗·毕晓普在他的著作中指出的那样,

“当我们假设我们的阳性和阴性训练样本来自两个不同的高斯聚类(不同的位置,但相同的协方差)时,我们可以开发一个完美的分类器。”

凸函数中的优化更容易,因为在曲线中更容易达到最小值并获得参数θ的最佳值。
然而,我们观察到,在我们对 J(θ)进行微分之后,我们得到了与线性回归方法相同的梯度函数。

然而,梯度值不是一回事,因为我们拥有不同的线性和逻辑回归映射函数。

Prototype code for a Cost Function

因此,使用参数向量θ和成本函数 J(θ),我们可以应用任何给定的优化算法来实现简单的决策边界。

优化参数:

现在,如果我们想要拟合参数(在本例中为θ),我们需要应用最小化(优化)算法。
我们可以采取简单的小步骤 ( )限制(θ)>0)达到我们给定的最小值,通常称为梯度下降,或者采用高级优化算法,如【BFGS】有限内存 BFGS 高级优化方法是 拟牛顿 方法的一部分,我们在其中计算黑森矩阵的优化值。L-BFGS 非常类似于 BFGS,除了它有更好的内存优化和更可扩展的算法。此外,当与梯度下降并置时,高级算法不容易出现反复试验的情况,因为不需要选择任意值的α(学习率)来获得更优的结果。Hessian 矩阵的数学符号如下所示:

通常,我们通过库应用高级优化。C++中用于应用高级优化算法的一个特殊库是 Eigen C++库。

然而,不同的库可能有不同的时间复杂度。不明智地选择一个库可能会降低我们算法的整体性能,并对我们的整个程序产生严重的影响。

因此,在使用优化方法有效地最小化我们的参数之后,我们可以绘制决策边界。因此,我们使用 MATLAB 的通用“fmin unc”来应用高级优化。在应用以θ和梯度值为参数的函数后,我们可以如下绘制决策边界:

Decision Boundary separating the data. In this case, a linear boundary fits better.

过度拟合曲线的概念:

过度拟合基本上是一种情况,其中我们的学习假设设法拟合数据集中的所有点,并产生很少或没有错误,但有一个重大缺陷。我们的算法无法预测新测试实例的离散类。
这个问题的解决方法:
我们可以惩罚某些参数(θ)来修复这个。我们在优化算法中增加了一个调节参数(λ),可以优化曲线。这个技术叫做正则化。因此,我们修改我们的成本函数和优化算法来惩罚参数并获得最佳拟合。

适合度:

拟合优度(G.O.F) 中,我们主要检查一个给定的模型是否被正确指定,以及它与统计观察值的拟合程度。通常有两种常用的方法来估计拟合优度。一个测试是著名的皮尔逊卡方测试,另一个测试是霍斯默和莱梅休测试。简单明了的皮尔逊卡方检验是一种更简单的技术,因此我们将讨论检验的直觉。

卡方(χ2)对于从给定数据集计算统计参数具有很高的数学准确性。此外,这个测试是渐近真实的。它的主要作用是计算数据集中每个观测值的频率。
因此,我们可以通过比较 p 值和分布值来计算统计 p 值。
我们还可以使用各种其他测试,如 Stukel 测试或信息矩阵测试来有效地测量逻辑回归的拟合度。

由于这是我关于机器学习的第一篇文章,我讨论了该领域的一个基本概念。在下一篇文章中,我将使用基于 U64 Bitboard 的国际象棋引擎来讨论 Alpha Beta 修剪。

参考资料:

  1. W.李少华,刘,“利用加权逻辑回归的正例与非正例学习”,大学,2003 年
  2. 刘,和 J .诺塞达尔,“关于大规模优化的有限记忆 BFGS 方法”-数学规划,1989-施普林格
  3. 马·巴比亚克,“所见不一定是所得:回归型模型中过度拟合的非技术性简要介绍”,《心身医学》,2004 年,《
  4. Andrew NG,“机器学习,斯坦福大学课程”。
  5. Paul D. Allison,“适合逻辑回归的度量”,-SAS 全球论坛,DC 华盛顿州,2014 年-statisticalhorizons.com
  6. Christopher M Bishop,“模式识别和机器学习”。

分析的成功/失败方法

原文:https://towardsdatascience.com/a-success-failure-method-for-analytics-54cbcfc8924?source=collection_archive---------8-----------------------

A bulls-eye may not be the best shot in darts

当确定业务的关键绩效指标(KPI)时,选择正确的成功衡量标准是有意义的。过去,我曾写过如何选择合适的衡量成功的标准。因为我做的大部分工作都是在网络领域,所以我们操作和做报告的原则或多或少是一样的。

唯一改变的是转化率……或者说成功的衡量标准。换句话说,网站建立的原因,网站的目的。因此,衡量成功的方法是有效的。

为新范例而设计

然而,如果正在构建的产品不是为 web 设计的,或者不是基于相同的原则,会发生什么呢?我们将如何着手确定指标和可操作的报告。

为此,我们必须去寻找我们需要分析的原因。

分析的目的

如果让我来定义我们在任何产品中使用分析的原因,那就是

  1. 识别胜利,庆祝胜利,并努力找到让我们赢得更多胜利的规则
  2. 找出失败,并找出解决这些失败的方法,以便我们能够改进

这种观点主要帮助我们做两件事,一件是找出并衡量好的方面,另一件是找出并剔除我们产品中不好的方面。

要做到这一点,我们需要能够表明成功或失败的指标(或 KPI)。

成功的衡量标准

成功衡量指标有助于确定明显的胜利,并在团队中庆祝这些胜利。这些也有助于找出过去对你有效的方法,以及如何重新创造这些成功。需要做的一件明确的事情(我已经艰难地学会了这一点)是,需要在更广泛的受众中分享成功或成功衡量标准,以给整个团队一种他们正在工作的目的感。

衡量成功的一个很好的标准是任务完成率,或者转化率,或者盈利能力。

失败的衡量

失败度量标准有助于识别特定活动中失败。这些也是帮助识别改进机会的指标。失败度量的测量应该帮助我们在当前的设计/产品中根除问题。我说根除,因为一旦你发现了失败,你就必须采取行动,确保失败不再发生。

衡量失败的一个例子是跳出率。

与成功的度量不同,失败的度量不能与大型团队共享。相反,我觉得(我想听听您的意见),当与正确的本地化团队沟通时,他们会更加有效。

这篇文章最初发表在大胖极客

Udacity A/B 测试课程总结

原文:https://towardsdatascience.com/a-summary-of-udacity-a-b-testing-course-9ecc32dedbb1?source=collection_archive---------0-----------------------

最近我在 Udacity 上完成了 Google 的 A/B 测试课程。这个课程被强烈推荐给想学习 A/B 测试的人。我认为写一份关于我所学的总结会非常有帮助,因为我的笔记非常详细,我也听到我的朋友抱怨说很难跟上老师。希望这个总结可以帮助更多的人。

本课程着重强调 A/B 测试的商业应用,而不是统计方面。然而,如果你想学习更多关于统计推断的知识,为 A/B 测试打下基础,我建议你找一本统计书或看几个视频,作为本课程的补充。

首先,我们为什么要做 A/B 测试

答案是测试消除了网站优化中的猜测,使基于数据的决策能够将商业对话从“我们认为”转变为“我们知道”通过测量变更对您的指标的影响,您可以确保每个变更都产生积极的结果。如今,公司对网页版本、个性化推荐和新功能进行 A/B 测试非常普遍。

我们能测试一切吗

不。有些情况我们不能通过 A/B 测试来分析。例如,如果您正在添加一个新的体验,并希望测试它,老用户可能会抵制新版本(厌恶改变),或者老用户可能都喜欢新的体验,那么测试集就具备了一切(新奇效果)。当谈到新的体验时,需要考虑两个问题:(1)你比较的基础是什么?(2)你需要多少时间让你的用户适应新的体验,这样你才能真正说出什么是稳定的体验,并做出稳健的决策?除了新的经验,长期效果也很难测试。例如,一个房屋租赁网站测试它的推荐效果,但是一个客户可能甚至在六个月内都不会回来,这很难通过 A/B 测试来衡量。如果是这种情况,我们该怎么办?

当 A/B 测试没有用时,我们可以:

  • 分析用户活动日志
  • 进行回顾性分析
  • 进行用户体验研究
  • 焦点小组和调查
  • 人类评估

那么,如何做 A/B 测试呢?

实际上,A/B 测试可以总结为以下 5 个步骤:

  1. 选择并描述评估你的实验的标准,例如,你关心什么,你想如何衡量效果
  2. 选择显著性水平(alpha)、统计功效(1-beta)和实际显著性水平。如果测试具有统计显著性,您确实希望启动变更
  3. 计算所需的样本量
  4. 为对照组/治疗组取样并进行测试
  5. 分析结果并得出有效的结论

在本 Udacity 课程中,这五个步骤将通过大量真实世界的示例进行详细解释:

步骤 1:为健全性检查和评估 选择和描述度量

我们为健全性检查选择的度量被称为不变度量。他们不应该受到实验的影响。它们不应该在对照组和治疗组之间发生变化。否则,实验设置是不正确的。

我们选择的评估指标用于衡量哪种变化更好。例如,我们可以使用每日活跃用户(DAU)来衡量用户参与度,使用点击率(CTR)来衡量网页上的按钮设计,等等。一般来说,你应该记住四类指标:

  • 总和与计数
  • 分布(平均值、中间值、百分位数)
  • 概率和比率(例如,点击率、点击率)
  • 比率:任何两个数字互相除

除了选择度量的类别,您还应该考虑灵敏度健壮性。你想要选择一个具有高灵敏度的指标,这意味着该指标可以拾取你所关心的变化。您还希望度量对于您不关心的变更是健壮的。这意味着当您不感兴趣的事情发生时,度量不会改变很多。如果一个指标太敏感,那么它就不够健壮,因此这两者之间需要一个平衡,你需要研究数据来找出使用哪个指标。

如何衡量灵敏度和鲁棒性?

  • 进行实验
  • 使用 A/A 测试查看指标是否有差异(如果有,则该指标不可靠)
  • 回顾性分析

第二步:选择显著性水平、统计功效和实际显著性水平

通常显著性水平为 0.05,功效设置为 0.8。实际显著性水平因每个单独的测试而异,它告诉你测试检测到多少变化,使你真的想发起变化。即使测试具有统计学意义,您也可能不想启动变更,因为您需要考虑变更的业务影响,考虑工程成本、客户支持或销售问题以及机会成本是否值得启动。

步骤 3:计算所需的样本量

概述:需要考虑度量标准的选择、转移单位的选择和人口的选择,因为它们都会影响度量标准的可变性。然后决定实验的规模。

  • 科目:测试的科目(分流单位*)是什么?也就是说,您将在哪些单元上运行测试并进行比较。转移的单位可以是基于事件的(例如页面视图)或匿名 id(例如 cookie id)或用户 ID。这些都是常用的分流单位。对于用户可见的更改,您希望使用 user_id 或 cookie 来度量更改。如果测量延迟变化,其他指标如事件级别转移可能就足够了。*
  • 人群:哪些受试者有资格参加测试?所有人?只有美国人?只有某些行业的人?
  • 如何缩小实验规模以更快完成实验?您可以增加显著性水平α,或降低功率(1-β),这意味着增加β,或更改转移的单位(如果最初它与分析单位不同)(分析单位:您的评估指标的分母)。

步骤 4:为对照组/治疗组取样并进行测试

要记住几件事:

  • 持续时间:什么时候跑最好?学生回大学?假期?周末对工作日?
  • 暴露:您希望将实验暴露在多大比例的流量中?建议是取一小部分,同时运行多个测试(不同的日子:周末、工作日、假日)。
  • 学习效应:当有新的变化时,开始时用户可能会反对变化或者大量使用变化。但是随着时间的推移,用户行为变得稳定,这就是所谓的平台期。衡量学习效果的关键是时间,但实际上你没有那么多时间来做决定。建议:在更小的用户群上运行,运行时间更长。

第五步:分析结果并得出结论

第一步,理智检查。

在分析结果之前,第一步是进行健全性检查——检查您的不变指标是否已经改变。如果您的健全性检查失败,请不要继续。相反,去分析为什么你的理智检查失败了。你可以选择:(1)回顾性分析,或者(2)研究是否有学习效应。

第二步,分析结果。

答:如果您有一个单独的评估指标,并且不重要:

第一轮:检查结果,看是否真的没有显著差异。例如,分解成不同的平台或一周中的某一天。这可能有助于你找出系统中的错误,也可能有助于你了解用户对你的实验的反应。

第二轮:用不同的方法交叉核对。例如,用参数假设检验与非参数符号检验进行比较。如果你的假设检验和符号检验不一致,你会怎么做?你应该以批判的眼光审视你的数据,因为你可能正遭受辛普森悖论(一个趋势出现在不同的数据组中,但当这些组被组合时就会消失或逆转)。辛普森悖论发生的原因可能是:(1)你的实验设置不正确;(2)变化对新用户和有经验用户的影响不同。

b .如果您同时测量多个指标

(1)一个潜在的问题是,你可能会偶然看到一个重要的结果。(看看这个 xkcd: significant

例如,您正在运行一个包含 20 个变量的测试,并分别测试每个假设:

P(一个显著结果)= 1p(无显著结果)

P(一个有效结果)= 1−(1−0.05)^20 = 0.64

很有可能你会偶然看到一个重要的结果!!幸运的是,有几种方法可以解决这个问题:

  • Bootstrap 并一次又一次地运行实验,如果偶然发生,显著性度量应该会消失。
  • Bonferroni 校正:将显著性水平 0.05 除以多重测试中的测试次数。假设您正在测量 20 个测试,那么您对该测试的显著性水平应该是 0.05/20 = 0.0025。Bonferroni 修正的问题是它太保守了。如果同时测试许多指标,可能没有一个是重要的。
  • 控制家族误差率(FWER) :任何指标显示假阳性的概率。
  • 控制错误发现率(FDR) : FDR = #假阳性/拒绝总数。

(2)另一个潜在的问题是,如果度量标准没有按照您想象的方向移动,该怎么办?例如,你预计 DAU 和用户使用你的应用的平均时间长度都会增加。然而,你观察到 DAU 减少,而平均时间长度增加。WTH??

你应该深入调查,找出原因。这也是为什么人们通常希望有一个 OEC(总体评价标准)。一个好的 OEC 给你一个短期和长期目标之间的平衡,或者不同指标之间的平衡。然而,你也需要记住,拥有 OEC 有助于你了解你的企业关心什么,以及你如何平衡停留时间和点击等指标,但它不会帮助你做出产品变更的决定。

最后一步,得出结论。

如果你从测试中获得了一个重要的结果,就会出现两个问题:你理解这个变化吗?您要启动变更吗?如果你的改变对一部分用户有正面影响,但对其他部分用户没有影响或有负面影响怎么办?你明白为什么吗??(例如,英文中的粗体字与中文中的粗体字具有不同的测试结果,因为粗体中文难以阅读)。

那么,我如何决定是否启动变更呢?

问自己几个问题:我是否有统计意义上和实践意义上的结果来证明这种改变?我是否了解这些变化对我们的用户体验产生了什么影响?最后一点,值得推出吗?

逮到你了

当你想在 A/B 测试后启动一个变更时,总是要做一个上升。因为您想知道对未受影响的用户是否有任何您在最初的实验中没有测试的附带影响。

当你加速变化时,你可能会看到效果变平。因此使得测试的效果不可重复。造成这种现象的原因有很多。

  1. 季节性效应:学生开始放暑假或返校时,社交网络平台用户行为发生很大变化。节假日对用户的购物行为影响很大。解决方案:使用保留方法,向除了一小组保留用户之外的所有人发起变更,并继续将他们的行为与控制组进行比较。
  2. 新奇效应变化厌恶*:群组分析可能会有帮助。*

经验教训

  1. 两次检查,三次检查你的实验设置是否正确。
  2. 不仅要考虑统计上的显著性,还要考虑业务影响。考虑工程成本、客户支持或销售问题、机会成本等。
  3. 如果你正在运行你的第一个有重大影响的实验,你可能想运行几个实验,并检查结果,看看你是否愿意启动它。

其他需要考虑的事情:实验的政治和伦理

实验涉及到真实的人,重要的是保护使用者并遵守伦理。然而,过去有许多有问题的实验例子。例如,历史上的塔斯基吉梅毒实验、米尔格拉姆实验和最近的脸书情感实验。为了以道德的方式进行 A/B 测试,有四个原则需要牢记:

1。风险:参与者面临什么风险?

主要门槛是风险是否超过“最小风险”。最小风险被定义为参与者在日常生活中可能遇到的伤害的概率和程度。所考虑的伤害包括身体、心理和情感、社会和经济问题。如果风险超过最小风险,则需要知情同意。

2。益处:研究结果的潜在益处是什么?

能够陈述完成研究的益处是很重要的。

3。选择:参与者还有什么其他选择?

在在线实验中,要考虑的问题是用户可能拥有的其他服务,以及在时间、金钱、信息等方面的转换成本。

4。隐私:参与者有什么隐私?

对于正在收集和存储的新数据,这些数据的敏感程度如何?处理这些数据的内部保护措施是什么?那么,对于那些数据,它将如何被使用,参与者的数据将如何被保护?如何保证参与者收集的用于研究的数据不会用于其他目的?

这个总结只是对课程内容的简要概述,如果你对 A/B 测试或准备面试感兴趣,我强烈建议你参加这个课程,并做期末项目。掌握一件事情的最有效的方法总是在实践中学习。

两个卷积的故事:图形神经网络的不同设计范例

原文:https://towardsdatascience.com/a-tale-of-two-convolutions-differing-design-paradigms-for-graph-neural-networks-8dadffa5b4b0?source=collection_archive---------7-----------------------

“图形”是自然语言中一个不如数学术语精确的术语:在日常用语中,图形通常可以用来表示绘图、图表或更普遍的数据可视化。然而,从严格的定量角度来看,“图”指的是一种非常特殊的数据结构,由(至少)一些 N 大小的节点集、一些边集以及可以附加到节点或边的属性组成。虽然某些类型的信息本质上类似于图表,但更多情况下,图表是一种有意选择的组织某种信息的方式,以便捕捉和强调数据元素之间的关系。

图形可以用来表示社会网络和家庭关系、网络流量和分子结构。但是当我们以图表的形式给出一个网络数据时,我们给了它一个归纳偏差来捕捉关系。机器学习中归纳偏差的思想是,即使一个模型可以访问相同的信息(来自统计内容,信息论 POV),优先考虑你的模型要学习的某些类型的模式可以帮助它更好地执行。这种情况的最简单形式见于老派模型正则化:下推系数的绝对值,产生更平滑的函数,并反映一种隐含的先验,即更平滑的函数更可能是真实的、可概括的函数,而尖锐、跳跃的函数更可能是过度拟合的。然而,如果这个先验是错误的,我们可能会把我们的模型引向错误的方向。

当我们设计一个专门处理图形的网络时,隐含地告诉它节点之间的关系是有意义的,前提是我们希望从图形中提取的信息包含在这些模式关系中,并且通过考虑它们可以最有效地提取。如果事实并非如此,那你就找错了地方。但如果是这样的话,你的先验关系作为模型的一个有用的概念,将大大缩小它的算法搜索空间。

卷积网络的目标是处理图像——一种复杂的结构化数据——并将它“消化”成一些压缩的特征集。一个图形网络有着相同的目标,除了它的目标是摄取和导出包含在一个图形中的有用的高级形式的信息。人们可能想问的关于图表的问题可能多种多样,如“这种分子结构是否可能作为治疗 X 疾病的药物”,或“这个社会图表中的 X 个人支持某个特定政党的可能性有多大”。在前一种情况下,我们想了解全图的一个性质。在后一种情况下,我们希望预测图中特定节点或边的属性。有些方法更适合这些目标中的一个或另一个。

这篇文章将给出两大类方法的高层次概述,这两大类方法用于赋予网络这种面向图形的归纳偏差。

根据数学定义,当构建操作员接收图表时,需要考虑一些属性:

  • 图可以有任意数量的节点
  • 每个节点可以有一个任意数量的邻居
  • 图中没有固有的空间或方向的概念;考虑一个图形节点的“左”或“右”邻居是不明智的,就像图像像素排列在规则的网格中一样。

这最后两点结合起来使得朴素卷积方法不可行——当每个节点具有任意数量的邻居,而不是相对于中心像素存在于固定位置的离散数量时,您不能应用对上、下、左、对角线等方向的邻居具有固定权重的滤波器。此外,没有一种定义明确的方式来沿着图形滑动(或“平移”)过滤器。

当试图理解图形处理时,一个重要的概念区别是

  • 一个问题,其中信息至少部分地包含在图本身的结构中,并且你希望提供给网络的每个例子可能具有不同的连接模式。这方面的一个例子是试图对不同的分子进行分类,每种分子都有不同的键结构。

When represented as a graph, atoms are seen as nodes with properties corresponding to element type, and edges with properties corresponding to bond type

  • 一个问题是图的连接结构在所有的例子中是固定的,但是图的各个部分的属性是不同的,定义了一个函数,它具有一些我们可能想要学习或匹配的特征。这种“定义在图上的函数”的想法,也就是你可以在同一个图上定义不同的函数,对于这篇文章和阅读任何关于图形分析的文章来说,都是一个需要理解的重要概念。这方面的一个例子可能是关于通过道路网络连接的一些城市中每一个城市的感染人数的信息,其中您想要了解疾病传播的速度:城市之间的道路连接不会因场景而异,只是每个城市的属性值会发生变化。你也可以认为图像是在相同(非常无聊)的像素图上定义的不同像素值函数,例如,左上的节点在它的右边和底部相连。

A road connectivity map of the United States

当比较不同的方法可以应用于哪种类型的问题时,记住这种区别是特别有用的。

对非常规卷积的探索

现代神经网络设计中的一项重大创新是卷积,这是一种专门的设计,用于以更具参数效率的方式处理图像,相对于简单的模型,它似乎具有有价值的归纳偏差。围绕图形网络的思维是围绕这个关键问题建立的:我们能对图形做同样的事情吗?我们能不能设计一种结构,利用卷积网络最有价值的属性,但以图形可以使用的方式。

该领域的两种主要方法都试图回答这个问题,即如何将卷积推广到图中,这两种方法都称自己为“图卷积”,但它们采用了完全不同的方法。第一个试图复制卷积的字面数学运算,而第二个只是对图像特定的卷积所扮演的角色进行启发性的观察,并试图重新创建它。

检查光谱

首先,完美主义者:他们通过问“在深层次的数学层面上,卷积是什么?我们如何在图形中复制它?”找到了答案。这个解释会偏离图表一段时间,但我保证它会回来的。

为了简化,神经网络中使用的卷积是广义卷积算子的特殊情况。(更多细节,请阅读我之前关于这个主题的文章。当我们大多数人想到卷积时,我们可能会想象在图像上移动的方形滤波器片。这种在原始数据的许多不同偏移量处计算相同模式的点积匹配的操作,通常需要在一个大的“循环矩阵”中在不同偏移量处多次重复您的模式,如下图所示,并将其乘以包含您的数据的向量(或矩阵,在图像上下文中)。

This is a matrix calculating a simple convolution over a 1D vector — each row of the vector is a copy of the filter, shifted by some amount. When we multiply it by the vector on the right (analogously, the data we’re matching against our filter), we get different activations at each offset, depending on the alignment where the data most closely matches the filter (dot products are higher when vectors are more similar)

但是,可以转换数据和过滤器,使每个过滤器都由一个简单的对角化矩阵表示(除了对角线上的值,其他都是零),然后乘以数据的转换版本。当你对数据进行傅立叶变换时,这种简化就会发生。傅立叶变换通常被认为是在函数的上下文中,并且(在很高的层次上),它们将任何函数表示为更简单的“频率”函数的加权组合;从解释数据的宽笔画模式的低频开始,到填充较小细节的高频结束。

在任何变换发生之前,一个连续函数完全可以用一个无限长的向量来表示,只需简单地指定每一点的值。(题外话:在卷积和傅立叶变换讨论函数运算的许多上下文中,更容易想象它发生在固定长度的向量上,然后只是想象自己,“那,但是无限”)。当转换到傅立叶空间时,在最差的情况下,您的函数可能仍然需要无限长的向量来正确表示,但向量的条目将表示构成函数的每个频率的幅度,对于更简单的函数,您可能只需查看频率加权向量的前 10 个条目,就能够捕捉到函数的良好近似。要对这一事实给出直观或数学上的解释可能太过分散注意力,但这是一个关于卷积的数学上的事实,即可以通过将一个信号(对角化)投影到傅立叶域,并将其乘以傅立叶域中的数据来计算算子。

I apologize that this is tiny, but, if you squint, you can see that the top matrix is an effective duplicate of the one above — offset versions of your filter in each row, multiplied by a matrix. The bottom version takes your Phi matrix (consisting of your Fourier basis vectors_ and left-applies it to both your original f vector, and also to a compressed version of your filters that only has values along the diagonal

光谱卷积的支持者认为,他们应该从以下角度处理事情:如果他们能够为一组数据找到傅立叶基,那么他们可以将权重和数据都投影到该基中,并且,通过这种定义途径,他们已经为自己获得了卷积,即使没有沿着图形移动(或“转换”)过滤器的明确能力。这组矩阵乘法的结果是一个 N 维向量,

好吧。因此,我们走上了这条有些曲折的道路,回到了数学上有效的卷积的另一种推导形式。这和图表有什么关系?那么,我们可以通过获取图的拉普拉斯的特征值来定义图的傅立叶基,拉普拉斯是一个矩阵,通过获取度矩阵 D(由每个节点的度沿对角线构成)并减去权重或捕捉所有边上的权重的邻接矩阵来构建。

拉普拉斯算子用于计算“图形梯度”,即根据每个相邻节点的权重,测量每个节点处的函数值相对于附近节点处的函数值改变了多少。当你计算拉普拉斯的特征向量时,你最终得到了图的傅立叶基,以及一种将图上定义的函数名义上投影到 N 维欧氏空间中定义的函数上的方法。这些轴也称为图的“谱”,因此得名“谱聚类”。作为一维投影,它们在概念上对应于沿图形捕捉最大距离的方向。默认情况下,将有与图节点一样多的特征向量,并且每个节点由沿着所有这些向量定义的轴的值来表示。注意,特征向量是图的连通性的表示,并且对于在该图顶部定义的函数是不可知的。这就是为什么我们可以在图上把不同的函数表示为沿着特征向量基的不同模式的值。

The eigenvectors/eigenfunctions corresponding to the largest eigenvalues. You can see that (a) is a gradient roughly going on a diagonal from top left to bottom right, which would be the single-dimensional compression that would do the best job of capturing distances along the graph. (b) is an axis roughly going roughly radially from the central urban area outward, which is the next-best single-dimensional representation taking (a) into account, and so on.

要通过这种方法计算谱卷积,首先需要计算图的完整 NxN 拉普拉斯特征向量矩阵,然后将每个滤波器以及数据本身乘以该矩阵。对于大型图形来说,这是非常计算密集型的,因为对于每个过滤器,它按 N 缩放。除了计算复杂性之外,谱卷积方法的一个显著缺点是它们只对学习固定图上的模式有用,并且不能有效地学习或考虑每个观察图具有不同连接结构的情况。这是因为每组计算出的特征值只适用于计算它的特定图形。

此外,谱卷积不是本地的(即,在围绕中心节点的邻居的小支持集上定义),而是对照图的全局连接结构来匹配模式。默认情况下,会使它们更加僵化,导致它们需要学习更多的参数。这个问题可以通过学习滤波器来解决,这些滤波器是每个特征向量的简单多项式变换,如本文所示,因为这些滤波器需要更少的参数,并且匹配更小、更局部化的模式。然而,事实仍然是谱卷积本身并没有被很好地设计为局部模式匹配器。

把话传下去

因此,谱卷积的优点是允许我们对图形进行数学上正确的卷积,但它们也有明显的实际缺点。

对于某些问题,所有这些缺点让我们回到了绘图板:考虑图像卷积的优点,以及如何用图形作为输入来复制它们。广义的消息传递神经网络(MPNN)试图模仿普通卷积的许多优点,但具有数学上不同的过程。

(作为题外话:我在这里将使用术语消息传递神经网络,这是本文首创的**,因为我认为它更清晰,更具描述性。然而,对于不同网络结构的不同分类法和命名约定,在文献中有一点地盘之争。* 最近的一篇论文 ,有点令人沮丧地将他们对本质上是 MPNNs 的分类简单地称为“图网络”,考虑到前面提到的谱图方法的存在,这实在是太宽泛了。*

提醒一下,我们需要图形计算具有的基本属性是:A)它可以对称地应用于每个节点,作为该节点属性的函数;B)它可以聚合任意数量邻居的信息

许多论文提出了基本相似的方法。每一个都有自己的稍微不同的这些成分的组合:一些被省略或简化作为手边领域的功能。最一般的骨架,其中大多数其他版本是特例,看起来像这样:

A figure from the DeepMind Graph Networks paper, illustrating the iterative procedure of edges pulling information from nodes, nodes pulling it in from edges, and then the global network attribute getting updated from both together.

  • 作为一个整体,节点、边和全球网络都具有向量值属性。你也可以潜在地有一个设置,其中所有这些都有属性向量和“隐藏”向量(a la RNNs ),给你自己一个更灵活地保存信息的方法,但目前,我们将坚持单属性向量模型。
  • 边属性通过计算它们的发送节点、它们的接收节点、全局属性和它们自己的过去值的某种变换来更新它们自己。注意,对于“接收节点属性”和“发送节点属性”,可以有特定的权重矩阵,因为给定的边只有一个发送者和接收者。
  • 节点属性基于其所有传入边邻居的聚合信息(以及全局属性值和其自身的过去值)进行自我更新。由于一个节点可以有任意多条边,这种聚合通常是通过最基本的输入大小不变的操作(求和)来完成的,但也可以使用类似基于内容的注意力加权来完成。
  • 最后,“全局属性”被计算为某种节点值的聚合——同样,可以是总和,可以是注意力,只要它对不同大小的输入起作用。
  • 现在,节点已经通过边从它们所有的相邻节点获取信息。如果这个过程重复很多次,那么信息将能够进行多次“跳跃”,并且每个节点将会拉入关于图的其余部分的更大范围的上下文信息。这与卷积堆栈中具有更宽感受域的后面的层相当。
  • 最终,在这个更新过程的一些迭代之后,您现在有了节点、边和全局属性,这些属性从图的其余部分收集了一些上下文

这种结构很有趣,因为它同时具有卷积结构和递归结构。它在启发式上类似于普通卷积,因为它在网络上的任何地方都使用相同的共享变换集,并且还因为它假设图上感兴趣的结构将是连续的,因此优先从邻居的同心圆中提取信息。这种逐渐扩大的感受野功能更接近于感受野逐层加宽的图像卷积网络。这里一个有趣的注意事项是,正如前面所暗示的:像这样的图形操作从根本上来说不如图像卷积灵活,因为它们从每个邻居那里同等地提取信息。你可以把它想象成一个离散的径向卷积,你可以根据距离远近,使用离散的距离单位从不同的点提取信息。

如果你假设不仅在图中的所有点,而且在扩散过程的后续迭代中使用相同的变换,该结构也开始看起来非常像一个循环网络。在这种情况下,你几乎可以把它想象成一个放射状的循环网络,向四面八方进行处理。在这种节点到节点信息扩散的高级框架内,您可以沿着这个范围定义许多网络子类型——每个“层”具有不同变换的网络,看起来更卷积,或者迭代地重新计算看起来更递归的相同变换;预测节点值、边缘值或全局值的模型。但是它们都使用相同的基本构件。

这些方法比谱卷积灵活得多,因为这种操作堆栈可以在不同的连接结构上执行,并且仍然给出一致的结果,如果您试图将一个图的函数投影到另一个图的拉普拉斯傅里叶基中,情况就不会如此。它们本身也是本地的,因为每次转换只接受来自邻居的信息。然而,这个堆栈在真正的数学意义上不是卷积,只是一组模仿卷积的一些优点的启发式操作。

将这些点连接起来

与图像相比,图形网络的设计仍处于其狂野西部的早期阶段:它的用途更加小众,并且它缺乏像 ImageNet 那样的标准化数据集。现代模型设计倾向于从现有领域大量借用,然后将这些直觉输入神经网络;图网络方法的研究人员似乎仍处于调查其他领域(光谱分析和消息传递算法)的这个阶段,试图看看在哪里可以找到有价值的见解。

虽然这可能是纯粹的叙述性放纵,但我很难不看到这篇文章中所展示的谱卷积的数学正确性和 MPNNs 的计算实用性之间的紧张关系,作为更广泛地举例说明机器学习中的紧张关系。这两种方法都试图推广卷积的成功,但一种是用数学家的证明和精度,另一种是用工程师的实用试探法。这两个工具包都是深度学习的组成部分,并以不同的方式提供信息。

从外部角度来看,虽然我欣赏谱卷积背后的聪明之处,但我认为 MPNNs 具有相当大的优势,特别是在处理非固定图问题时。

然而,仍然有很多问题,我希望在这个领域有更好的答案(或者,可能有答案,但我还没有找到)。

  • 与一些更简单的方法相比,这些方法在不同密度/稀疏度的图上表现如何?你可能会天真地认为,当你接近一个过于密集的图时,其中所有的东西都相互关联,特定于图的方法可能没有什么附加值。
  • 当你有有意义的权重信息时,与只有二进制邻居或没有关系相比,它们的效果如何?在这两种情况下,它们是否比基线方法更有优势?
  • 尝试这些或其他方法的最佳典型问题是什么?这里引用的许多论文更多地关注玩具问题,或者已经找到好的解决方案的问题(比如图像)。分子分析任务对我来说似乎是最有吸引力的,但我很想听听其他人的想法。

参考资料:

  • 快速、局部、光谱网络
  • 量子化学的信息传递神经网络
  • 来自 DeepMind 的近期图网论文
  • 对图形的傅立叶分析

哲学与文本挖掘的交叉

原文:https://towardsdatascience.com/a-text-mining-approach-to-philosophy-fb757b7e1c1f?source=collection_archive---------4-----------------------

运用 R 对著名哲学著作的深入分析

通过大数据课程学习 R 之后,我获得了提取有用信息并通过图表、聚类图或分层树创建有意义的可视化所需的基本工具和技术的实践培训。本课程的主要学习目标之一是对文本数据集样本进行文本挖掘。虽然我对深入了解这个主题充满希望,但概念的教授非常抽象,令人不安的是,导师只花了 14 节课中的两节来学习这个模块。情况不言自明。我们要完成这项繁重的任务,研究我们的项目要分析哪些文本。然而;对我个人来说,这种自由对我有利,因为我能够在课程结束时获得比预期更好的学习体验。

谈到这个过程,最初的第一周,我在谷歌上疯狂搜索,积累了大量有用的文本挖掘资源、现有的工作成果和“公开”的问题。一旦我对开始这个项目的材料感到满意,我不得不寻找一个文本数据集,它不仅激起了我的兴趣,而且是一个以前没有使用过的数据集。因此,作为我项目的一部分,我想评价我在某个时间点读过的文学作品,无论是作为我过去选择的课程的一部分,还是通过我在浏览互联网时对哲学的随机探索。这些书是描述性的,但涉及生活的不同方面。其他的涉及深奥的理论,意识形态和一系列的前提,我根本没有足够的时间去浏览它们。相反,为了让生活对我来说更容易,我主要关心的是理解每个哲学家试图在他们的著作中传达的要旨。因此,通过编写几行代码,我将能够借助一些引人注目的可视化效果来理解冗长的文字。

为了使这篇文章尽可能简洁易读,我只分析了 6 套不同的文本,这些文本是由著名的哲学家撰写的,他们的理论和思想具有历史意义,即:

  1. 《哲学原理》 —勒内·笛卡尔(译 Steve Harris查理·弗兰克,2003 年版出版)
  2. 《纯粹理性批判》 —伊曼纽尔·康德(J. M. D. Meiklejohn 译,2003 年版)
  3. 散文集:第一辑——拉尔夫·瓦尔多·爱默生(2001 年版)
  4. 《***宣言》 —卡尔·马克思、弗里德里希·恩格斯(由艾伦·路丁 & 吉姆·塔齐亚版 2005 年出版 )
  5. 《道德谱系学》 —弗里德里希·尼采(由霍勒斯·b·塞缪尔&j·m·肯尼迪译,奥斯卡·利维博士编辑,1913 年首次出版)
  6. 超越善恶——弗里德里希·尼采海伦·齐默恩译,2009 年出版

【注意最后两本书是同一作者写的。这是有意为我的评估做的]

找到提到的书籍并不是一项艰巨的任务,这主要归功于开放源代码库,尤其是古腾堡计划。该网站收集了 56,000 本上传的电子书,可供下载。为了提取有用的术语和关键见解,需要执行不同的统计或自然语言处理(NLP)程序,只有这样,我们才能产生我们谈到的可视化。我根据所采用的方法订购了不同的部分,如下所示:

  1. 用于关键词分析的词云创建
  2. 文本样本之间的相似性
  3. 所选文本中包含的最常重复的二元模型的词频和 TF-IDF 图,以了解单词等级
  4. 情感分析,以理解数据的上下文,并在给定文本之间建立关联。

第 0 节:数据导入和内务处理

从我的 R 程序开始,我通常使用下面的命令清理所有的全局和局部变量:

*rm(list=ls())*

一旦执行,你的代码将有一个新的开始。因为我们正在使用古腾堡计划,必须阅读。txt 文件导入到我们的变量中,我们将导入以下库来利用某些重要的函数:

*require(readtext)
require(gutenbergr)
require(quanteda)*

Quanteda 库是我对文本文件进行定量分析的首选库。用更专业的术语来说,它允许我创建语料库或文本“集合”,其中包括文档级变量和该集合中每个包含文本的元数据。Quanteda 还允许我绘制一个文档特征矩阵(简称 DFM ),它将用于创建所有看起来很酷的图,如下所示。

最后,为了导入数据,我们执行以下代码行:

*url  <- "[http://www.gutenberg.org/cache/epub/4391/pg4391.txt](http://www.gutenberg.org/cache/epub/4391/pg4391.txt)"
data <- texts(readtext(url))*

看起来很简单,对吧?让我们进入有趣的部分。

第一部分:文本中的关键词分析

在深入研究文本的关键字分析之前,我想在图 1a 中分享一段我的 Github 代码。这个代码块只允许我解析文本数据,并最终从中创建一个单词云。因为我们正在处理的文本可能包含拉丁字符(比如,, T20,T21),我们需要将它们转换成 ASCII 格式,这样我们就可以提取“可读”的结果。

Fig 1a: R Code for the function that allows word cloud creation using a text’s document feature matrix

接下来,我们必须删除多余的单词或标记,如停用词、符号、数字和标点符号。根据定义,停用词是任何给定文本中常见的词,如“a”、“the”、“in”等。我们从语料库中过滤出这组单词,这样它们就不会降低我们关键字分析的质量。第 4–6 行执行过滤过程。

在对语料库进行预处理之后,接下来我们将它转换成一个文档特征矩阵 (DFM),它决定了每个单词在给定文档中的出现频率。我们不会深入 DFM 是如何计算的细节,但我们应该知道的是,这个矩阵将被传递到神奇的单词云函数中,该函数绘制了图 1(b)、(c)和(d)中的彩色结果。

就单词等级而言,位于中间的单词(灰色的)是最常见的单词,而橙色和青色的单词是最不常用的单词,但这并不意味着它们不重要。

**

Fig 1b: Word Clouds based on Descartes’ Principles of Philosophy (left) and Immanuel Kant’s Critique of Pure Reason (right)

首先,我们将比较笛卡尔的《哲学原理》和康德的《纯粹理性批判》。作为典型的 17 和 18 世纪的作品,它们写于现代西方哲学全盛时期。在左云中,我们观察到笛卡尔重视单词'心灵'、身体'、'自然'和'事物',通过这些单词,他描述了所有具有心灵的生物都具有核心属性和能力来思考、策划想法和批判性地比较事物;因此,这句名言就存在了:

我思故我在。(我觉得;故我在。)

康德;然而,强调“原因”一词在右云中可见。因为他的书名是关于“理性”的争论,所以它是被重复次数最多的术语,这是绝对有意义的。除此之外,康德还提到了诸如“概念”、“经验”、“直觉”等术语,这些都是理解他的信仰的关键。我们也在云中看到“先验”这个词,它与康德开创的哲学运动或趋势有关;后来被拉尔夫·瓦尔多采纳,他的理论认为,为了理解现实的“本质”(用诸如“空间”、“时间”、“世界”这样的词作为自然的派生物),人们必须首先检查和分析支配着“经验的本质的推理过程。

**

Fig 1c: Word Clouds based on Nietzsche’s works: Beyond Good and Evil (left) and Morals of Genealogy (right)

如果我们要比较一个作者的两部作品,我们可以识别两个云之间的词语相似性。单词“人”在大多数哲学著作中占主导地位,尤其是在亚里士多德和柏拉图哲学中。即使在尼采关于道德主题的作品中,我们也可以假设这本书的主要症结是如何围绕着一个理想主义的概念,即一个人应该如何过一个'苦行僧真理和“爱”的生活。在这两本书里,尼采还批评了过去的哲学家,他们把邪恶的人和善良的人对立起来,这是作者试图反驳的。这是引号中提到的单词的基本上下文。

**

Fig 1d: Word Clouds based on Ralph Waldo’s “Essays-The First Series” (left) & Marx’s “The Communist Manifesto” (right)

遵循康德哲学的拉尔夫·瓦尔多;十九世纪的美国哲学家,是超验主义运动中反对灵性和理智主义的思想家之一。瓦尔多关于宇宙的信仰最好用“自然”和“灵魂”这两个词来代表,他认为这两个词是现实地认识真理的必要组成部分。

考虑到卡尔·马克思的著作,并将其与其他 5 部著作中的任何一部进行比较,就会发现明显的两极分化。术语是不同的,概念是革命性的,在这个意义上,很少有工作的迹象来自任何其他哲学文本。马克思的著作和其他著名思想家之间最有趣的区别是,前者有一种更集体的方法,而不是个人主义的方法。正如瓦尔多、尼采等人在谈论“人”一样,马克思更积极地关注整个社会,即“资产阶级”或“中产阶级”以及“无产阶级”或“工人阶级”,这些词构成了共产主义的基础。

第二部分:文本相似性

词云只是在定性分析时受到限制。我们需要利用某种数学模型,通过它我们可以在更深的层次上比较文本。r 使用各种统计模型计算文本相似性的方式非常简洁。在这个特定的场景中,我使用了扩展的 Jaccard 方法来计算下面的矩阵。

通过取每个集合中的属性(词)的有限集合来进行比较,在我们的情况下,该集合是哲学文本,然后将交集的总大小( )除以样本集合的并集的总大小(∩)。这是你现在需要知道的数学范围,但是我们将在以后的文章中触及计算文本相似矩阵的不同方法。

Fig 2a: Text Similarity Matrix based on the Extended Jaccard formula

直接观察,我们看到 1 以对角线方式出现,几乎像一个单位矩阵。这表明相似的命名文本彼此之间将具有 100%的相似性。此外,我们可以从这个图表中提取有趣的信息。查看图 2a 中的编号标签:

  1. 我们可以说,尼采关于道德的著作与笛卡尔的文本有大约 65%的相似性。通过这一点,我们可以假设尼采可能在他的章节中从法国哲学家那里获得了一些内容。
  2. 卡尔·马克思的作品是革命性的,因为它在所有其他作品中得分最低。盒子代表 6%的价值,认为马克思的著作与康德的《理性批判》最不相似。两部哲学著作之间基本上完全不相关的背景。
  3. 分别有大约 85%和大约 87%的显著指数分数,我们可以假设尼采的作品与拉尔夫·瓦尔多关于“人”的道德的哲学和思想有适度的共鸣。
  4. 比较尼采自己的作品,有巨大的相似性,部分原因是写作风格,章节间术语的共性。由于所讨论的术语不同,可能会出现 5%的微小差异。

第 3 部分:双图频率和 TF-IDF

关键词的频率可以提供关于特定哲学文本的一些重要信息。使用 R,我们可以估计给定文本中的总字数。考虑到整个文本中有多个多余的符号、标点符号和数字,估计总数更安全;因此,第一列中的波浪号(~)。

Fig 3a: Table that illustrates the total number of words and unique terms occurring in the texts

第二列表示每个文本中出现的唯一术语的总数。从这个专栏中,我们可以推测出英语的掌握程度和流利程度,Waldo 的作品以最高数量的独特单词名列榜首。这是有意义的,因为其他 5 本书最初是用德语或法语写的,后来被翻译了;同时,瓦尔多的作品已经是英文的了。

此外,我们可以通过使用双字母组合频率来进一步理解作品。二元模型是在某个文本中一起出现的两个连续单词或术语的组合。在图 3b 中,x 轴上的‘n’表示二元模型的计数。y 轴显示了每个文本中的前 10 个二元模型的列表。

Fig 3b: Frequency Plots of Bi-grams present in selected philosophical books

在给定的图表中,笛卡尔使用“有形物质”作为重复最多的二元组,这是哲学家试图证明的主要话题之一。这两个词还与其他可见的词集相互关联,如“扩展的物质”、“外部对象”,在某种意义上,它们试图描绘“人类思维”如何试图断言对象是真实的。

毫不奇怪,康德的论文热情地谈论着“纯粹理性”,图表以 400+的重复次数直接证明了这一点。因为康德的文本总共有 21000 字。从瓦尔多的文章中不能确定太多,因为诸如“人性”、“常识”这样的一组词在大多数哲学著作中普遍出现。在这些文本中,马克思的共产主义思想最为突出。不仅二元模型与其他 5 个讲座不同,所有的词组在马克思的宣言中都有很高的频率分布。

有趣的是,当我们考虑尼采的作品时,我们看到“禁欲理想”和“现代观念”分别是“道德谱系”和“超越善恶”中的两个主要二元对立。至少可以说,尼采的作品之间的联系是很有趣的,因为他提供了一个新的视角,关于其他古代哲学家如何遵循禁欲主义,作为一种最大化他们权力感的手段。同时,我们可以观察“理查德·瓦格纳”这个名字;一位德国音乐作曲家,出现在两个图表中。

继续讨论,我还创建了现有二元模型的 TF-IDF 图,这将为我们提供正在使用的单词的“排名”视图。TF-IDF 是词频-逆文档频率的缩写,这是另一种统计工具,旨在反映一个词对语料库中的文本文档有多重要。

Fig 3c: TF-IDF bi-gram plots of selected philosophical texts

为了理解这个图表,我们需要看一组经常出现的单词和另一组很少出现的单词。请注意,这组图表由几个停用词组成,如“the”、“of”、“to”和“a”,它们在计算术语频率(TF)时非常重要。现在,这些停用词旁边的词是计算逆文档频率(IDF)的兴趣来源。最后,我将把对生成的二元图的分析留给读者。

第 4 部分:情感分析

进入情感分析的最后一部分。r 有一个非常抽象的方式来进行这种类型的分析,有好有坏。这很好,因为希望从文本数据中快速生成信息的分析师可以编写几行代码并获得结果。对于那些渴望学习算法并以更高级的方式应用它的人来说,这是不好的。

Fig 4a: Word-Emotion analysis table using the NRC lexicon

查看图 4a 中的表格,我们使用 NRC 单词词典,该词典包括与两种情绪相关联的单词列表:积极情绪和消极情绪;以及 8 种基本情绪:愤怒、恐惧、期待、信任、惊讶、悲伤、快乐和厌恶。我们当然必须假设一个词在本质上可以是积极的,但表达的情感可能是消极的。例如,像“不高兴”或“不兴奋”这样的二元模型应该被认为是负面情绪,但是应该意识到 R 根本不能在一次迭代中确定所有这些关联。这是机器学习可以应用的实例之一,我们将在未来对此进行更多的研究。

该表格在其他方面非常容易理解,因为它说明了与特定情绪或情感相关联的单词总数。红色方框代表各行中最主要的情绪。

情感分析通常使用以研究者命名的不同词汇。对于下面的图形结果,我使用了 Bing 词典,其中的单词只分为积极情绪和消极情绪。与 2007 年的积极词汇相比,有 4782 个消极词汇。这意味着,当我们汇编结果时,预计击中负轨迹的概率更高。

朝着图 4b 中的图表前进,笛卡尔以相对积极的态度开始,随后是偶尔的抑郁。总的来说,表达的总体情绪是积极的。另一方面,康德的做法恰恰相反。他以一种消极的语气开始,可能是消极地抨击当时流行的“理性”概念。然后在他的评论结束时,康德把他的语气转变成一种更热切的语气。

**

Fig 4b: Sentiment Analysis for (a) Principles of Philosophy and (b) Critique of Pure Reason

在《超越善恶》中,积极情绪和消极情绪平均分布,而《道德谱系学》则更偏向于 y 轴的相反光谱,原因可能是尼采非常关注对抗人类中存在的“恶”。

**

Fig 4c: Sentiment Analysis for Friedrich Nietzche’s (a) Beyond Good and Evil and (b) Geneology of Morals

在拉尔夫·瓦尔多的论文中(用绿色图表突出显示),他演讲的中间部分明显倾向于积极的一面。仔细观察,瓦尔多散文的中间部分谈到了“爱”,因此我们可以证明这种激增是有道理的。而在马克思的短篇综述中,我们看到了更多的负面偏见。这可能是因为他讲话中咄咄逼人或令人恐惧的语气。

**

Fig 4d: Sentiment Analysis for (a) Essays — The First Series and (b) The Communist Manifesto

结论

有了这篇全面的文章,我们可以看到分析文本数据的现有可能性。凭借我对文学作品的喜爱,并将其与技术知识相结合,我能够创造出有趣的视觉效果,可以用各种方式来感知。我打算学习网上可用的高级工具包,如 D3.js、Plotly,并尝试使用可用的“开放”数据。在下一篇文章中,我可能会谈到脸书的数据,以及如何使用他们的表情符号反应来进行情感分析。

注意:文章中提到的所有工具都需要一定程度的编码经验。幸运的是,所有这些库都是以这样一种方式编写的,即通过一些努力,了解统计分析工具(如 Microsoft Excel、SPSS 或 Stata)的分析师可以创建有趣(且美观)的图表。所以,如果你想提高你的数据分析技能,试试这些工具吧。

Python 爱好者可以看看 NLTK ,它有大量的模型,可以使用科学、数学甚至公式来分析文本内容,其中可能还涉及一些机器学习。

引用的作品

1https://docs.quanteda.io/

[2]https://uc-r.github.io/word_relationships

[3]http://legacy.earlham.edu/~nksmith06/DescExpli.html

传播和分享知识。如果这篇文章激起了你的兴趣,如果你是个善良的人,给这篇文章一些掌声。关注我的个人资料,获取更多技术相关的文章。—哈姆扎

外星人飞船的文字描述

原文:https://towardsdatascience.com/a-textual-portrait-of-alien-spaceships-606f7e881bf6?source=collection_archive---------4-----------------------

根据国家不明飞行物报告中心在过去一个世纪收集的数据,我们可以从超过 80 万起报告的不明飞行物目击事件中拼凑出一些信息(颜色、形状、运动)——如果它们存在的话。

看起来如何

与通常描绘的银碟不同,记录指出了不同的颜色和形状组合:

color and shape

  • 红色橙色是最常见的颜色。它们经常以光球的形式出现或者发出这种颜色的光
  • 其他频繁联想的还有:绿火球银盘黑三角

它如何移动

通过提取动词,我们可以观察不同的速度、方向和运动模式——悬停与射击、出现与清漆、漂浮与下降、发光与脉动等,还可以结合颜色来查看它们。

how movement is described

除了像改变方向这样的运动(“三角形之字形。另一束光照在我们身上。其他人喷射到地平线”),人们还报告了 UFO 在颜色和形状上的变化(“金橙色的明亮的星星从天而降;变成扁平的黑色松软物体,落在树上然后飞走”)。该信息是通过结合依存分析和搜索相邻单词来提取的。

到目前为止,我们既不能证明也不能反驳目击者是否受了酒精的影响。

这是我关于数据科学和视觉故事的# 100 日项目的第 50 天。我的 github 上的全部代码。感谢阅读。欢迎新主题的建议和反馈。

《迈向数据科学》的感谢信

原文:https://towardsdatascience.com/a-thank-you-note-to-towards-data-science-58b714a824f8?source=collection_archive---------13-----------------------

数据科学并不容易,但多亏了许多像这样的关于数据科学的出版物现在更容易以一种简单的方式理解困难的概念。这篇文章是我感谢他们对这个领域和社会的贡献的方式。

数据科学,一种新的科学(或者是?)

数据科学是一个跨学科的领域,是一门与商业密切相关的新型科学。正如我在前所说,我认为数据科学使我们能够通过人工智能创造智能。

是的,我说这是一种“新”的科学,因为我认为这份出版物的名字就是我们正在做的事情,我们正走在一条让数据科学成为科学的道路上。我认为数据科学是一门科学是非常有用的,因为如果是这样的话,数据科学中的每个项目至少应该:

可复制:便于测试他人的工作和分析所必需的。

更多信息,请点击此处:

[## 数据科学的再现性危机

数据科学中的再现性是什么,我们为什么要关注它?

towardsdatascience.com](/data-sciences-reproducibility-crisis-b87792d88513) [## 走向再现性:平衡隐私和出版

在数据安全和研究公开之间的冲突中,会有金发姑娘的选择吗?

towardsdatascience.com](/toward-reproducibility-balancing-privacy-and-publication-77fee2366eee)

Falible: 数据科学和科学寻找的不是真理,他们寻找的是
知识,所以每个项目在未来都可以被替代或改进,没有
解是终极解。你可以在这里阅读和这里。

协作:数据科学家不是单独存在的,她/他需要一个团队,这个团队将使创造智能和解决方案成为可能。协作是科学的一大部分,数据科学也不应该例外。

[## 组建数据科学团队的最有效方式是什么?

从 2012 年到 2017 年,我有幸在 Coursera 从零开始建立数据和分析组织。在那之上…

towardsdatascience.com](/what-is-the-most-effective-way-to-structure-a-data-science-team-498041b88dae) [## 建立数据科学团队| Coursera

构建来自约翰霍普金斯大学的数据科学团队。数据科学是一项团队运动。作为一名数据科学高管…

www.coursera.org](https://www.coursera.org/learn/build-data-science-team)

创造性:数据科学家所做的大部分工作都是新的研究、新的方法或采用不同的解决方案,因此他们的环境应该非常有创造性,并且易于工作。创造力在科学中至关重要,是我们找到解决困难和复杂问题的唯一方法。

[## 创造力在数据科学中至关重要

数据科学可能不会被视为最具创造性的追求。您将大量数据添加到存储库中,并且您…

www.kdnuggets.com](https://www.kdnuggets.com/2017/02/creativity-is-crucial-data-science.html) [## 创造力在数据科学中的作用是什么?

回答(3 之 1):从我在这个领域非常有限的知识来看,创造力起着极其重要的作用。我会…

www.quora.com](https://www.quora.com/What-is-the-role-of-creativity-in-data-science)

遵从法规:现在有很多关于科学的法规,关于数据科学的法规不多,但将来会有更多。重要的是,我们正在构建的项目能够意识到这些不同类型的法规,以便我们能够创建一个干净的、可接受的问题解决方案。

[## GDPR 会让机器学习非法吗?

欧盟通用数据保护法规,即 GDPR,是数据隐私法规中最重要的变化…

www.kdnuggets.com](https://www.kdnuggets.com/2018/03/gdpr-machine-learning-illegal.html) [## '您的数据隐私已更新'-感谢您再次忽略它!

下雨了 GDPR 的电子邮件,为什么一个盲目的'我同意'是不行的

towardsdatascience.com](/your-data-privacy-was-updated-thanks-for-ignoring-it-yet-again-9f6d1d567997)

为什么数据科学这么难,同时又这么简单?

所以回到数据科学如何让我们通过人工智能创造智能这一点,我想说的是,数据科学既困难又简单。

我认为数据科学很难,因为你必须知道和理解所有的事情才能认为自己是一名数据科学家:阅读论文、书籍,知道如何编程,了解企业以及如何应用你的知识来解决他们的问题,等等。

与此同时,我认为这很容易,或者说有点容易,因为我们有一个充满活力的社区,人们试图互相帮助,分享思想和知识,分享经验和感受,他们成为数据科学家的过程,他们在工作中的表现如何,以及伟大的博客、出版物、网络研讨会、视频、信息、信息图和更多工具,这些工具使向数据科学的过渡变得更加容易。

因此,我要感谢编辑 TDS 团队、 Ludovic Benistant ,以及为这份令人惊叹的出版物做出贡献的作家和人们。我还要感谢媒体和媒体员工为我们创造了这个伟大的平台来分享想法、知识和经验。

我想以几个月前的一个想法来结束我的演讲,这个想法是最近由 T2 的克里斯蒂安·威利格提醒我的,对我来说,数据科学是我开始实现这个想法的主要方式之一:

你可以产生影响,你可以做你喜欢的事情来改变世界。

我们多次听说,改变事物或世界的运行方式是不可能的。你做什么都改变不了它,你只是这个巨大星球上的一只蚂蚁。

这不是真的。你可以改变世界。你可以让事情变得更好,你必须从改变你看待事物的方式开始。我为我自己、我的家人和我爱的人努力工作,如果有人生活得更好,我已经在做出改变。

然后你想得更大,我怎样才能让这个地方对我和其他人来说变得更好?我如何改进某个流程的完成方式?

找到你喜欢做的事情,对我来说是科学(物理)和数据科学。我喜欢这个领域。我希望分享我做的事情,我贡献的开源项目,我在雇佣我的公司的工作,以及我将在不久的将来做的事情,将使这个世界成为一个更好的生活场所。

相信你所做的,带着激情去做,倾听他人,努力工作,有时间陪伴家人,享受乐趣,相信你会改变世界。

以下是我在 TDS 上发表的文章,我希望你会喜欢,我希望在不久的将来能写更多的文章:

[## 如何获得一份数据科学家的工作?

大家好。这篇博客文章来自我最近在 LinkedIn 发表的三篇文章。这是第一部分、第二部分和第三部分。

towardsdatascience.com](/how-to-get-a-job-as-a-data-scientist-f417078fe13e) [## 我的深度学习之旅

在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…

towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317) [## 深度学习的 Skejul 会议

厌倦了试图与某人见面,却找不到日期或时间?我也是。

towardsdatascience.com](/skejul-meetings-with-deep-learning-5efab285b111) [## 获得数据科学家工作的两个方面

你是找工作的数据科学家吗?你是在找数据科学家的招聘人员吗?如果你回答是或否…

towardsdatascience.com](/the-two-sides-of-getting-a-job-as-a-data-scientist-a4571acc58bc) [## 深度学习的“怪异”介绍

有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。

towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0) [## 用数据科学创造智能

在这篇文章中,我将展示数据科学如何让我们通过人工智能创造智能。

towardsdatascience.com](/creating-intelligence-with-data-science-2fb9f697fc79) [## 使用 Apache Spark 进行深度学习—第 1 部分

第一部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。这一部分:什么是火花…

towardsdatascience.com](/deep-learning-with-apache-spark-part-1-6d397c16abd) [## 如何在你的电脑上使用 PySpark

我发现在您的本地上开始使用 Apache Spark(这里将重点介绍 PySpark)有点困难…

towardsdatascience.com](/how-to-use-pyspark-on-your-computer-9c7180075617) [## 超越敏捷数据科学

超越我的眼睛所看到的,是我应用于生活中每一个方面的东西。在本文中,我将展示如何…

towardsdatascience.com](/going-beyond-with-agile-data-science-fcff5aaa9f0c) [## 利用深度学习检测乳腺癌

乳腺癌是女性中最常见的侵袭性癌症,是女性癌症死亡的第二大原因,仅次于…

towardsdatascience.com](/detecting-breast-cancer-with-a-deep-learning-10a20ff229e7) [## 使用 Apache Spark 进行深度学习—第 2 部分

第二部分全面讨论了如何使用 Apache Spark 进行分布式深度学习。我将完全专注于…

towardsdatascience.com](/deep-learning-with-apache-spark-part-2-2a2938a36d35) [## DIY 深度学习项目

受阿克谢·巴哈杜尔伟大工作的启发,在这篇文章中你将看到一些应用计算机视觉和…

towardsdatascience.com](/diy-deep-learning-projects-c2e0fac3274f)

感谢一切:)

感谢阅读。希望你在这里发现了一些有趣的东西:)

如果您有任何问题,请在 twitter 上添加我:

[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特

Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…

twitter.com](https://twitter.com/FavioVaz)

和 LinkedIn:

[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn

查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…

linkedin.com](http://linkedin.com/in/faviovazquez/)

那里见:)

预测理论

原文:https://towardsdatascience.com/a-theory-of-prediction-10cb335cc3f2?source=collection_archive---------3-----------------------

回顾 信号与噪音 作者:张瀚银

《信号与噪音》可能是有史以来关于预测艺术的信息量最大的非技术性书籍。它概述了什么是最好的描述为内特西尔弗的“预测理论”。数据新闻网站 fivethirtyeight 的创建者 Silver 带领读者经历了一次不同领域的信息之旅,包括气象学、棒球、扑克、金融和政治,记录了要么严重失败,要么非常成功的估计,以及做出这些估计的预测者所采用的策略。成功和失败的预测都有很多东西可以教给我们,西尔弗从这些例子中提炼出了一个有凝聚力的信息:我们天生就不擅长预测,但通过采纳一些原则,我们可以改善我们的估计,并在个人和国家层面上受益。在我看来,这些原则属于三个规则:

  1. 像狐狸一样思考
  2. 像贝叶斯一样思考
  3. 像(篮球)射手一样思考

很难从它们的名称中了解这些规则,所以让我们依次浏览每一个规则。

像狐狸一样思考

在这本书的开头,西尔弗讲述了哲学家伊塞亚·柏林提出的刺猬和狐狸的对立观点。刺猬有一个大主意,而狐狸有许多小主意。每个人都倾向于站在一边或另一边:我们要么相信一个界限分明的黑白世界,要么相信一个没有任何事情是完全确定的灰色世界。每个观点都有自己的优点,但是当谈到预测时,狐狸会明显更成功。一只狐狸可以利用各种不同的来源,并假设不同的观点,但刺猬却被锁定在一条思路上。

这最好通过一个简单的例子与预测联系起来。假设我们在一个只有两个政党的国家(多么可笑的概念!),熊和老虎。我们正在与一位预测对手竞争,他试图在对即将到来的选举的预测上胜过他。无论谁赢了,都将在接下来的四年里出现在主要新闻频道。我们的对手是一只经典的刺猬;他的一个大想法是猛虎组织将在下一次选举中横扫所有对手。另一方面,我们做出了更像狐狸的理性决定。我们相信总体趋势确实有利于老虎,但我们愿意看看故事线可能不直截了当的个别比赛。当到了做出预测的时候,我们依次检查每场比赛,查看所有相关新闻,并对多次投票进行平均,以选出获胜者。我们的对手自信地为每场比赛挑选老虎,支持他的选择,断言他的世界观是不会错的。最终,我们轻松获胜,并有幸在接下来的四年里每天晚上出现在新闻中,因为我们愿意看到细微的差别,而我们的对手却被一个想法蒙蔽了双眼。

这可能是一个人为的例子,但它表明了采用简单的对/错世界观的危险。当你是一只刺猬,只有一个信念,比如老虎队会赢得所有的选举,你听到的每一条新信息都会证实你的信念。你会很高兴地把你所有的信心都放在支持老虎的论文上,而忽略任何相互矛盾的证据。同时,作为狐狸,我们没有偏见,愿意客观地评估每一个数据来源。刺猬们遭受着确认偏差的困扰,在那里他们操纵任何证据来符合他们的观点。狐狸能做出更准确的预测,因为它们愿意以开放的心态处理任何问题。在现实中,很难摆脱我们所有的先入为主的信念,但我们可以通过收集尽可能多的信息来源来对抗它们,就像 fivethirtyeight 在构建选举预测时所做的那样。

不幸的是,正如西尔弗指出的那样,在现实世界中,刺猬经常会被人用扩音器广播它们的信息。随着电视新闻和互联网分裂成两个政治派别,中间是一片巨大的无人区,仍然处于中间的人们被极端的狂热分子所淹没。当人们收听一个新闻频道时,他们并不是在寻找客观的报道,他们想听到自己的观点是正确的。当谈到预测时,他们宁愿听刺猬告诉他们,他们的“团队”将横扫立法部门,而不是听狐狸根据客观数据详细描述每场比赛的明智预测。因此,出现在电视和新闻中的大多数预测者是做出大胆预测的刺猬,而不是做出合理但不那么令人兴奋的预测的狐狸。尽管有证据表明那些做出更极端预测的人是最糟糕的预测者,他们却占据了大部分屏幕时间。尽管如此,这并不妨碍我们在日常生活中成为狐狸。为了像狐狸一样思考,我们需要抛弃我们先入为主的信念,从不同的来源收集信息,倾听争论的双方,并做出反映世界灰色本质的合理预测。

像贝叶斯一样思考

在你被“贝叶斯”的奇怪声音吓走之前,让我来解释一下:托马斯·贝叶斯是 18 世纪的一位统计学家和部长,他以制定基于新证据更新我们对世界的信念的方法而闻名。当我们处理任何新的预测问题时,我们首先需要形成对情况的初始估计,称为先验。假设我们想预测我们是否会在下一季度开始时获得晋升。已经过去一个月了,因为我们最近工作效率更高,而且与我们的经理关系也很好,所以我们可以把最初的几率定为 50%。贝叶斯定理(他的思想的正式版本)背后的思想是,当我们收集与问题相关的信息时,我们根据数据更新我们的第一个估计。如果我们的经理给我们发了一封赞扬我们工作的电子邮件,我们可能会把升职的可能性提高到 75%。随着事件发生的日期越来越近,如果我们把所有相关的信息都考虑进去,我们的预测应该会收敛到真实的概率上。证据的权重取决于它能在多大程度上降低我们的不确定性。每一步都要考虑先验信息,但是随着新信息(观察值)数量的增加,先验信息在预测中的权重会降低。我们的最终预测是初始估计和观测数据的组合。

在我们的日常生活中,我们无时无刻不在使用贝叶斯推理。当观看体育赛事时,我们在一开始就有一个最终结果是什么的想法,随着比赛的进行,我们更新这个估计,直到最后,我们可以 100%确定结果。同样,股票市场会因新闻而上涨或下跌,因为投资者认为这些信息揭示了一家公司的价值。贝叶斯的观点与所谓的频率主义者世界观形成对比,后者认为某件事情发生的几率仅仅基于过去数据中观察到的事件频率。当预测两周内 2018 年 1 月 21 日下雪的可能性时,这位常客会预测当天下雪的平均可能性,并坚持这一估计,直到出现问题的那一天。然而,作为一个贝叶斯,我们会做一个初步的预测,也许使用历史事件作为一个起点,然后根据新的信息随着时间的推移修改我们的估计。比平均温度更高的天气可能会降低我们预测的降雪概率,而一场从西面逼近的暴风雪会增加降雪概率。贝叶斯在做出预测方面自然处于优势,因为她会根据证据不断改变自己的信念。

贝叶斯思维的另一个重要方面是,预测被表达为一种概率,而不是一个是/否。虽然大多数人倾向于想要一个直接的答案,但我们生活在一个不确定的世界里,是或否是不完全可能的。任何预测都有不确定性,当有人预测股市明天会上涨时,他们掩盖了股市实际上有一个可能的取值范围。最有可能的情况可能是增加,但总有减少的可能。同样,用一系列数值或概率来回答预测问题可能不会让我们上新闻,但这将意味着我们平均来说更接近事实。负责任的数据科学家和预测者必须传达带有不确定性的结果。用一系列价值观来回答不应该被解释为缺乏信心,而是反映了世界的变化。

像(篮球)射手一样思考

做好任何事情的最佳方式是失败多次,然后做出调整。世界上最好的篮球射手大约有一半的时间会失败,但是他们不会因此而停止投篮。每次他们投篮不中,都会做些小调整,然后再投一次。虽然在某些领域反复失败可能很难(我们发明了飞机模拟器,让飞行员可以奢侈地失败不止一次,这很好),但在风险较小的情况下,这很容易实现,我们可以收到即时反馈。预测,至少在个人层面上,完全符合这些条件。我们可以非常容易地(并且安全地)预测一周后我们的体重,我们最喜欢的球队下一场比赛的比分,或者烹饪爆米花的最佳时间长度,而不会遭受可怕的后果。如果每个人都被要求达到完美的预测标准,世界将会严重缺乏气象学家。相反,每当我们错过目标时,我们会检查失败的原因,并做出我们认为对下次有帮助的调整。

任何人都可能经常失败,但这是关于检查和利用错误来提高我们的表现。众所周知,西尔弗的团队未能预测 2016 年的选举,之后,他们花了很长时间审视他们做错了什么。 Fivethirtyeight 不进行民意调查,但汇总了各种各样的数据,并根据历史表现对每个数据进行加权。就 2016 年而言,很明显民调系统性地偏向希拉里·克林顿,西尔弗和他的团队无疑会在下一轮选举中考虑到这一点。Silver 还记录了一个棒球模型,该模型做出了绝对荒谬的预测,经检查,这是由一个错误的字母引起的。如果创建者在失败后抛弃了模型,他们的开发时间就会被浪费,但是他们有智慧不断做出新的预测和错误来隔离问题。像射手一样思考包括不断重复射击-失误-调整-射击循环,在每次迭代中提高性能。

在噪音中失去信号

正如西尔弗在整本书中指出的,任何预测模型都有局限性。人类有一种倾向于看到不存在的模式,特别是在偶然关联的情况下。超级碗指标,根据哪个联盟赢得超级碗来预测股票市场的表现,在过去 50 年中有 40 年是正确的。然而,NFL 冠军得主并没有影响市场的宏观经济效应,这只是一种令人惊讶的相关性。此外,一些系统,比如天气,对初始条件极其敏感(这些属于混沌理论的有趣领域)。天气模拟开始时的一个微小变化会导致截然不同的预测,这就是为什么预测天气和气候是众所周知的困难。尽管如此,由于过去的多次失败,天气预报在过去的几十年里已经有了显著的进步。天气服务创造了数千亿美元的价值,因为风暴预警减少了风暴造成的损失,气候预测带来了更好的收成。虽然我们通常倾向于简单的模型,但有时我们需要一个庞大复杂的模型来进行准确的预测。

另一种预测失败的问题是样本外的情况。这些情况在我们的数据中从未出现过,因此几乎不可能预见到。考虑一个飞行员,他在晴朗的天气里从休斯顿到纽约飞行了 800 次,没有发生任何事故。在他的下一次航班上,一场巨大的飓风正在影响东海岸,航空公司必须决定是否取消他的航班。飞行员争辩说他以前从未坠毁过,因此在这次飞行中他不可能遇到麻烦。然而,这是一个样本外的情况,因为他以前的每次飞行都是在完美的条件下进行的。在这种情况下,谨慎的措施是停飞,因为不确定性太大了。日本对珍珠港的袭击通常被认为是一个样本外的事件,因为外国势力的大规模袭击从未发生在美国本土。尽管有迹象表明日本正在准备一场大规模的军事行动,但美国未能预测到这一事件。信号是有的,但被忽略了,因为像珍珠港这样的袭击以前从未发生过。

在这个盲目相信大数据和复杂模型的时代,西尔弗对只依赖统计数据的预测持必要的批判态度。根据他过去在棒球模型方面的经验,Silver 解释了为什么计算机本身常常不能捕捉到许多人类活动中的所有错综复杂之处。他发现,他自己的基于数字的模型表现不如那些利用人类直觉和数据建立的模型。同样,在计算机第一次击败最好的国际象棋选手后,人们预测人类在游戏中已经失去了所有的相关性。然而,随后的公开世界锦标赛允许任何人和计算机的组合进行比赛,由使用程序和了解游戏知识的人的团队赢得了。在大多数领域,领域知识加上计算机模型很可能会超越单独依靠其中任何一个的预测。

建议

我判断一本书的方法是,我是否能在五分钟的总结中获得所有相关信息,或者是否值得为了额外的见解而阅读整本书。在信号和噪音的情况下,我推荐通读整部作品。在这篇文章中,我概述了这本书的基本内容,但跳过了 Silver 用来阐述他的每一个观点的几乎所有真实世界的例子。这本书以直观的风格涵盖了许多统计概念,对于像预测这样看似学术的主题,可读性很强。任何渴望成为数据科学家或想怀疑地检验预测的人都应该阅读这份关于准确预测方法的资料性著作。

如何不使用机器学习模型

原文:https://towardsdatascience.com/a-thought-on-using-machine-learning-models-8b5a55b5fc1d?source=collection_archive---------21-----------------------

在我的培训课程中,在讨论常见的机器学习模型之后/期间,我通常会提出一个话题,即从这些模型中获得的见解的使用或模型在业务/组织流程中的实施。

例如,我们可以获得最准确的模型,它非常擅长“预测”哪些客户会对营销活动做出反应,但如果使用了错误的营销渠道或营销信息,该模型仍然无法为企业带来足够的价值。这就是为什么在我之前的帖子中,我推荐数据科学家去理解战略思维和发展商业敏锐度。

我发现自己在培训期间多次重复这个例子,所以我想我把它作为一篇博客文章,希望更多的数据科学家也能意识到思考如何使用模型是非常重要的。

教育中的机器学习

在我之前的工作中,我遇到过许多由数据科学的新生提出的项目。他们选择进行数据科学研究的“最热门”行业之一是教育。现在,我对教育有着浓厚的兴趣,因为我相信它是一种伟大的社会流动工具,并一直在研究如何改善教育,以对人们的生活产生重大而持久的影响。因此,在教育中使用机器学习的项目演示总是激起我的兴趣。

因此,其中一个项目着眼于使用机器学习模型对“有失败风险”和“能够通过这一年”的学生进行分类。如果你问我,我不怀疑这是机器学习模型在教育中的现有用法。我对演示团队将如何使用这个模型非常感兴趣,所以我问了这个问题,“那么一旦模型建立起来,你打算用它做什么?”

得到的回答是,“我们将使用该模型来确定谁有失败的风险,谁没有,一旦我们做到了这一点,我们将把我们的资源更多地集中在那些不会失败的人身上,确保他们以非常好的结果通过了考试。”下巴下垂

这个团队由刚接触数据科学的学生组成,我认为这是给他们上一堂关于模型用法的课的好机会。所以我继续说,“所以如果这个学生被模型归类为处于危险中,这意味着他/她将被剥夺任何成功和取得好成绩的资源?”

“是的!”回答回来了。所以我继续说,“如果我在使用这个模型,而你被归类为有失败风险,会发生什么?你认为我剥夺你的任何教学/学习资源公平吗?”沉默…

“你必须知道,通过在这里使用机器学习模型,它只是为我们提供了一个结果的概率,而不是 100%的保证。如果有人被“预测”有风险,那只是因为模型中的当前特征告诉我们这一点。生活更加复杂,因为除了数据中包含的因素之外,还有其他因素会影响结果,比如考试失败。”

继续说,“你可以提出的是,在建立相同模型的情况下,我们可以首先调查哪些因素会表明学生处于风险中,为什么会这样?其次,我们应该致力于设计一个好的计划来帮助那些有失败风险的学生,因为我们现在可以更好地识别他们。这可能会改善整个社会,培养出更多有生产力的社会成员,帮助更多的学生摆脱贫困。”

机器学习模型的使用

你可能会注意到,对于同一个模型,根据它的使用方式,我们可以帮助更多的人,也可以区别对待。我坚信构建模型只是数据科学项目的一小部分,知道如何特别合乎道德地使用模型也很重要。这就是我控制评分标准的项目的原因,我会在战略和实施方面给予很大一部分分数,不是在 IT 基础设施方面,而是在业务流程方面。

我希望读完这篇文章的读者能真正投入更多的思考,如何使用你的模型,并理解它对人们或客户的影响。构建“最佳”机器学习模型只是从我们的数据中获取价值的大图景的一小部分。

我希望这个博客对你有用。我希望所有读者有一个有趣的数据科学学习之旅,并访问我的其他博客文章和 LinkedIn 个人资料。

机器学习中的公平性教程

原文:https://towardsdatascience.com/a-tutorial-on-fairness-in-machine-learning-3ff8ba1040cb?source=collection_archive---------3-----------------------

摘要

这篇文章将是这个系列的第一篇文章。这个职位的目的是:

  1. 对 Fair ML 进行快速但相对全面的调查。
  2. 为对 Fair ML 感兴趣的各个层次的读者提供参考和资源。

内容基于:Solon Bacrocas 和 Moritz Hardt 在 NIPS2017 给出的关于公平的教程来自 CS 294:加州大学伯克利分校 Moritz Hardt 讲授的机器学习中的公平以及我自己对公平文献的理解。我强烈建议感兴趣的读者去看看链接的 NIPS 教程和课程网站。

目前的职位由六部分组成:

  1. 介绍
  2. 动机
  3. ML 中偏差的原因
  4. 公平的定义,包括公式,动机,例子和缺陷。
  5. 用于实现这些公平性定义的算法。
  6. 摘要

1.介绍

近年来,空气质量正在成为机器学习中最热门的话题之一。该领域的出版物激增(见图 1)。研究团体在这个领域投入了大量的努力。在 2018 年的 ICML 上,五篇最佳论文/亚军获奖论文中有两篇是关于公平性的。关于公平性也有新的会议/工作坊:FAT/ML2014 年开始,ACM FAT2018 年开始,fair ware2018 年开始。 arxiv 上每周都有几篇新上传的关于公平的论文。许多在理论和实践 ML 社区有声望的研究者已经参与了这个领域。

Fig1. The number of publications on fairness from 2011 to 2017

2.动机

第一个要问的问题是,我们为什么关心公平?主要动机是和我们自身利益高度相关。我们正处于这样一个时代,许多事情已经或正在被人工智能系统自动化。自动驾驶汽车已经指日可待,估计 5–10 年内会被广泛使用;雇主使用 ML 系统选择工作申请人;美国法院使用 COMPAS 算法进行累犯预测;Linked-in 使用 ML 对查询的求职者进行排名;亚马逊使用推荐系统来推荐商品,并决定商品在页面上出现的顺序。网飞使用推荐系统为每个用户呈现定制页面。机器学习系统已经成为我们日常生活中不可分割的一部分。随着越来越多的领域开始将人工智能集成到他们现有的实践/产品中,它们在不久的将来会变得更加广泛。

人工智能是好的,但它可能会被错误地使用。机器学习是应用最广泛的人工智能技术,它严重依赖数据。认为 AI 是绝对客观的,这是一种普遍的误解。人工智能只有在学习人类所教的东西的意义上才是客观的。人类提供的数据可能会有很大的偏差。2016 年发现,用于累犯预测的算法 COMPAS 对黑人产生的误报率远高于白人(见图 2, Larson et al. ProPublica,2016 )。

Fig2: The bias in COMPAS. (from Larson et al. ProPublica, 2016)

类似于 Linked-in 的求职平台 XING 被发现对不太合格的男性候选人的排名高于更合格的女性候选人(见图 3, Lahoti et al. 2018 )。

Fig3: The bias in the query for Brand Strategist from XING(from Lahoti et al. 2018).

分别由微软、Face++和 IBM 提供的公开可用的商业人脸识别在线服务被发现在肤色较暗的女性身上实现的准确率低得多(见图 4, Buolamwini 和 Gebru,2018 )。

Fig4: The bias in commercial face recognition services(Buolamwini and Gebru, 2018). DF, DM, LF, LM stand for: darker skin female, darker skin male, lighter skin female and lighter skim male. PPV, TPR, FPR stand for predictive positive value, true positive rate and false positive rate.

当应用程序涉及到人时,ML 中的偏见几乎无处不在,它已经损害了少数群体或历史上处于不利地位的群体的利益。不仅是少数群体的人,每个人都应该关心人工智能中的偏见。如果没人关心,下一个遭受偏见对待的人极有可能就是我们中的一员。

3.原因

有人会问:“是什么导致了 ML 系统中的偏差?”本质上,这种偏差来自于由于历史原因而存在于训练数据集中的人为偏差。以下是潜在原因的列表( Barocas 和 Selbst,2016 ):

偏斜样本:如果偶然发生一些初始偏差,这种偏差可能会随着时间的推移而加剧:未来的观察结果会证实预测,而做出与预测相矛盾的观察结果的机会会减少。一个例子是警方记录。犯罪记录只来自警察观察到的那些犯罪。警察局倾向于派遣更多的警察到最初发现犯罪率较高的地方,因此更有可能在这些地区记录犯罪。即使后来其他地区的人犯罪率更高,也有可能由于警方关注较少,警察部门仍然记录这些地区的犯罪率更低。使用以这种方式收集的数据训练的预测系统倾向于对警察较少的地区有积极的偏向。
污点例子:任何 ML 系统都保留着因人为偏差导致的旧数据中存在的偏差。例如,如果系统使用经理做出的雇用决定作为选择申请人的标签,而不是工作申请人的能力(大多数情况下,对于被拒绝的人来说,这种能力是观察不到的)。使用这些样本训练的系统将复制经理决策中存在的偏差(如果有的话)。另一个例子是,在谷歌新闻文章上训练的词嵌入“表现出令人不安的女性/男性性别刻板印象”,例如,“男人”和“计算机程序员”之间的关系与“女人”和“家庭主妇”之间的关系高度相似( Bolukbasi et al. 2016 )。
有限特征:为少数群体收集的特征信息可能较少或不可靠。如果来自少数群体的标签的可靠性比来自多数群体的标签的可靠性低得多,则由于这些噪声,系统对于少数群体的预测往往具有低得多的准确性。
样本大小差异:如果来自少数群体的训练数据比来自多数群体的数据少得多,那么就不太可能完美地模拟少数群体。
代理:即使敏感属性(被认为不应该用于任务的属性,例如种族/性别)不用于训练 ML 系统,也总是可以有其他特征作为敏感属性的代理(例如邻域)。如果包含这样的特征,偏差还是会发生。有时,很难确定相关功能是否与受保护的功能过于相关,以及我们是否应该将它包括在训练中。

它们可以归纳为以下三个问题:

  • 发现未被观察到的绩效差异:偏斜样本,有污点的例子
  • 应对观察到的绩效差异的样本:有限的特征、样本大小差异
  • 理解预测结果差异的原因:代理

4.公平的定义

一个自然的问题是“如何定义公平?”,具体来说,“我们如何制定公平,以便它可以在 ML 系统中考虑”。第一个想法是寻找法律支持,并检查是否有任何定义可以用来量化公平。许多国家的反歧视法律禁止基于敏感属性(如性别或种族)的不公平待遇(民权法案。1964 年民权法案,第七章,平等就业机会,1964 年。).这些法律通常使用两个不同的概念来评估决策过程的公平性( Barocas 和 Selbst,2016 ): 不同的待遇不同的影响。如果决策(部分)基于主体的敏感属性,则决策过程会受到完全不同的对待,如果其结果对具有某些敏感属性值的人(例如,女性、黑人)造成不相称的伤害(或好处),则会产生完全不同的影响。然而,这两个定义对于计算来说太抽象了。因此,在公平的数学公式上没有共识。

文献中已经提出了许多关于公平的定义(参见 Gajane 和 Pechenizkiy,2018 和维尔马和鲁宾,FairWare2018 )。然而,它们中的大部分是基于以下六点:

  • 没认识到
  • 人口均等
  • 均等的赔率
  • 预测汇率平价
  • 个体公平
  • 反事实公平

其中人口统计均等、均等优势和预测比率均等属于一个更大的类别,称为“群体公平”。

注:我选择使用的名字都是文献中比较流行的。这些定义没有统一的命名约定。

4.0 设置和符号

在本节中,为了简单起见,我们将只考虑具有单个敏感属性的二元分类问题。然而,该公式可以容易地扩展到具有多个敏感属性的其他任务(例如回归)。

想象一下预测是否雇佣一个申请人的问题:

  • X ∈ Rᵈ:量化的申请人特征(如教育程度、工作经验、大学平均绩点等。).
  • A ∈ {0,1}:二进制敏感属性(如多数/少数)。
  • C :=c(X,A) ∈ {0,1}:二进制预测器(例如,雇用/拒绝),它根据分数 R:=r(x,a) ∈ [0,1]做出决策。
  • Y ∈ {0,1}:目标变量(例如,候选人是否真正能够胜任该职位)。
  • 我们假设 X,A,Y 是从一个基本分布 D 生成的,即(X,A,Y) ~ D。

我们也用 P₀ [c] := P [c | A= 0]来表示。

最初,当我们不施加任何公平性约束时,我们针对精度进行优化,并且当 C(X,S)=Y ∀ (X,s,Y) ~ D 时达到最佳精度

4.1 不知晓

这只是意味着我们不应该将敏感属性作为特征包含在训练数据中。这个概念与不同的处理是一致的,它要求不使用敏感属性。

提法:

C=c(x,A) = c(X)

动机:

直观、易于使用和法律支持(区别对待)。

瑕疵:

基本限制是可能有许多高度相关的要素(例如邻域)作为敏感属性(例如种族)的代理。因此,仅仅删除敏感属性是远远不够的。

4.2 人口均等

人口统计均等,也称为独立性、统计均等,是最著名的公平标准之一。

配方:

c 独立于 A: P₀ [C = c] = P₁ [C = c] ∀ c ∈ {0,1}

在我们的例子中,这意味着两组申请人的录取率必须相等。在实践中,有两种放松这种平等的近似形式(假设组 1 是优势组,即当不考虑公平问题时具有更高的被雇用概率):

  • P₀ [C=1]/P₁ [C=1] ≥ 1-ϵ

当ϵ=p/100 ( Zafar 等人 AISTATS2017 )时,p%规则被定义为满足这个不等式。

  • |P₀ [C=1]-P₁ [C=1]| ≤ ϵ其中ϵ ∈ [0,1]。

动机:

  • 法律支持:"四五法则"规定任何弱势群体的入选率都低于入选率最高群体的五分之四。在我们的公式中,这相当于满足 80%法则。如果违反此规则,必须提供与工作相关或业务需要的理由。“业务必要性意味着使用该程序对于业务的安全和高效运营至关重要,并且没有实质上同样有效且负面影响较小的替代程序”(来源:负面影响分析/五分之四规则)。
  • 有一些论文认为,在短期内实施这些标准有利于在长期内建立弱势少数群体在劳动力市场上的声誉(胡和陈,WWW2018 )。

瑕疵:

  • 该定义忽略了 y 和 a 之间任何可能的相关性。特别是,当基本利率不同时,它排除了完美预测值 C=Y(即 P₀ [Y=1] ≠ P₁ [Y=1])
  • 懒惰:如果我们从一个群体中雇佣合格的人,从另一个群体中随机选择一些人,我们仍然可以实现人口统计上的平等。

4.3 扳平赔率

均等赔率,也叫分离,正率平价,最早是在 [Hardt,Price and Srebro,2016](http://Equality of Opportunity in Supervised Learning) 和 Zafar 等人 WWW2017 中提出的。

配方:

c 独立于 Y 上的条件:

p₀=p₁∀

一个较弱的概念是:

p₀=p₁

这被称为精确度奇偶校验。这种较弱概念的局限性在于,我们可以用一组的假阳性率来交换另一组的假阴性率。这种交易有时是不可取的(例如,交易拒绝来自组 1 (A=0)的(C=0)合格申请人(Y=1),而接受来自组 2 (A=1)的(C=1)不合格申请人(Y=0))。

在许多应用中(例如,招聘),人们更关心真实的正比率而不是真实的负比率,因此许多工作集中在以下放松的版本上:

P₀ [C = 1| Y = 1] = P₁

这被称为机会均等。

在我们的例子中,这就是说我们应该从每个组的合格部分中雇佣相同比例的人。

动机:

  • 最优性相容性:允许 C=Y。
  • 惩罚懒惰:它提供了在所有团队中统一减少错误的激励。

瑕疵:

这可能无助于缩小两个群体之间的差距。例如,假设 A 组有 100 名申请人,其中 58 人合格,而 B 组也有 100 名申请人,但其中只有 2 人合格。如果公司决定接受 30 名申请人,并满足机会均等,A 组将获得 29 份工作机会,而 b 组仅获得 1 份工作机会。如果工作是高薪工作,A 组往往有更好的生活条件,为他们的孩子提供更好的教育,从而使他们长大后有资格获得这样的高薪工作。随着时间的推移,A 组和 B 组之间的差距会有扩大的趋势。

4.4 预测汇率平价

预测汇率平价,也称为充分性,出现在 Zafar et al. WWW2017 (我不确定第一个涉及它的文献)。

提法:

y 独立于 C 上的条件:

P₀ [Y = y| C= c] = P₁ [Y = y| C= c] ∀ y,c ∈ {0,1}

这相当于满足了两者

P₀ [Y = 1| C= 1] = P₁ [Y = 1| C= 1]和

P₀ [Y = 0| C= 0] = P₁ [Y = 0| C= 0],

分别称为正预测奇偶校验负预测奇偶校验

在我们的例子中,这就是说,如果从预测算法(用于确定候选人的工作资格)返回的分数应该反映候选人做这项工作的实际能力。这与雇主的利益是一致的。

动机:

  • 最优性兼容性:C=Y 满足预测速率奇偶校验。
  • 假设接受(C=1),成功的机会均等(Y=1)。

瑕疵:

  • 这个缺陷类似于机会均等的缺陷:它可能无助于缩小两个群体之间的差距。推理和以前类似。

4.5 个人公平

个人公平是一个相对不同的概念。前面三个标准都是基于群体的,而个体公平,顾名思义,是基于个体的。这是由 Cynthia Dwork 等人于 2012 年在通过意识实现公平中首次提出的,是该领域最重要的基础性论文之一。个体公平的理念强调:相似的个体应该得到相似的对待。

配方:

表示 O 为可测空间,δ(O)为 O 上的分布空间。表示 M:X→δ(O)为将每个个体映射到结果分布的映射。则公式为:
D(M(X),M(X’)≤D(X,X’)

其中 x,X' ∈ Rᵈ是两个输入特征向量,d 和 d 分别是输入空间和输出空间上的两个度量函数。参见图 5 的图解。

Fig5: illustration of individual fairness

动机:

作为个体,我们倾向于更关心个体,而不是关注群体。此外,个体公平比任何群体公平都更精细:它对每对个体的待遇施加了限制。

瑕疵:

很难确定什么是合适的度量函数来测量两个输入的相似性( Kim et al. FATML2018 )。在我们的案例中,很难量化两个求职者之间的差异。假设有三个求职者,A,B 和 c。A 有学士学位和 1 年相关工作经验。b 具有硕士学位,1 年相关工作经验。c 有硕士学位,但没有相关工作经验。A 比 C 更接近 B 吗?如果是,增加多少?这个问题很难回答,因为我们不能同时拥有 A、B 和 C 的表现(我们不能同时雇佣这三个人)。否则,我们可以在一个叫做度量学习的领域应用技术。当敏感属性出现时,情况会变得更糟。在我们的度量函数中,我们是否应该以及如何计算组成员的差异?

4.6 反事实公平

反事实公平是在 Russell et al .,NIPS2017 中提出的。它为解释偏见的原因提供了一种可能的方法。

配方:

P[C_{A← 0}=c|X,A=a]=P[C_{A← 1}=c|X,A=a]

反事实值替换敏感属性的原始值。反事实值通过一些结构方程向因果图(见图 6 的例子)的“下游”传播。不是敏感属性后代的所有其他内容保持不变。

Fig6: some possible causal graphs

动机:由于许多相关的特性,4.1 远远不够。4.2–4.4 都是观察公平标准。它们不能用来寻找不公平现象的原因。4.5 在寻找合适的度量标准方面存在根本性的限制。反事实公平解决了所有这些问题。

反事实公平提供了一种检查仅替换敏感属性的可能影响的方法。它提供了一种通过因果图解释偏见影响的方法。图 6 显示了申请大学的几个可能的图表。请注意,当我们替换敏感属性时,与之相关的所有其他特性也会受到影响。在图 6 中,如果敏感属性(种族)改变,教育分数和工作分数也会改变。

瑕疵:

这个想法非常理想。在实践中,很难就因果图应该是什么样子达成共识,甚至更难决定使用哪些特征,即使我们有这样的图(如果我们消除所有相关的特征,我们可能会在准确性上遭受巨大损失)。

4.7 公平的不可能定理

事实证明,4.2–4.4 中的三个准则中的任何两个是互斥的,除非在非退化的情况下。

人口平价与预测利率平价

如果 A 依赖于 Y,那么要么人口统计平价成立,要么预测汇率平价成立,但不能两者都成立。

证明:

人口均等 VS 均等几率

如果 A 依赖于 Y,而 C 依赖于 Y,那么要么人口统计均等,要么机会均等,但不能两者都有。
证明:

均衡赔率 VS 预测汇率平价

假设(A,C,Y)的联合分布中的所有事件都有正概率。如果 A 依赖于 Y,则均衡赔率或预测率平价成立,但不能同时成立。
证明:(乏色曼定理 17.2)

文献主要集中在第三种情况的证明上。证明可以在 Chouldechova,2016 和 Kleinberg et al. 2016 中找到,后者给出了一个假设较弱的证明。

下面是一个说明第三种互斥的例子(均衡的赔率与预测的比率奇偶校验)。假设在没有任何公平性约束的情况下优化我们的分类器后,我们有以下结果和预测(见图 7)。我们对 a 组的预测都是正确的,但是对 b 组却有一个假阳性的错误。

Fig7: illustration of impossibility theorem(original)

因为我们想保持均等的机会,我们决定在 a 上也犯两个假阳性错误。现在,真正的正比率和真正的负比率是相等的:两者都有 1/2 和 1(见图 8)。

Fig8: illustration of impossibility theorem(equalized odds is preserved)

然而,尽管正预测奇偶校验也得以保留,但此设置违反了负预测奇偶校验。不可能在不牺牲均等优势/正预测奇偶性的情况下保持负预测奇偶性(见图 9)。

Fig9: illustration of impossibility theorem(PPV is satisfied but NPV is not)

COMPAS 辩论的本质类似于这个玩具例子。ProPublica 的主要指控是黑人被告面临更高的假阳性率,即它违反了机会平等,因此均等了赔率。Northpointe 的主要辩护是分数满足预测率平价。

4.7 公平性和准确性之间的权衡

对精确度施加上述约束的影响确实取决于数据集、所使用的公平性定义以及所使用的算法。然而,总的来说,公平会损害准确性,因为它将目标从准确性转移到准确性和公平上。因此,在现实中,应该进行权衡(见图 10 的说明)。

Fig10: trade-off between accuracy and demographic parity on a linear classification problem (Zafar et al. AISTATS2017)

5.公平算法

这里有许多算法声称有助于提高公平性。其中大多数分为三类:预处理、训练时优化和后处理。

5.1 预处理

想法是我们要学习一个新的表示 Z 这样它就去除了与敏感属性 A 相关的信息并且尽可能的保留了 X 的信息(泽梅尔等人 ICML2013 ,路易佐斯等人 ICLR2016 ,卢姆和约翰卓尔 2016 ,阿德勒等人 2016 ,卡尔蒙等人尼普斯 2017 ,下游任务(例如分类、回归、排序)因此可以使用“干净的”数据表示,从而产生保持人口统计均等和个体公平的结果(如果给出了适当的度量)。参见图 11 的图解。

Fig11: Illustration of preprocessing

示例:

下面的算法是 Zemel 等人在 ICML2013 中提出的。

注释(与原论文略有不同):
X ∈ R^{d× N}:训练数据。
Y:代表个体分类决策的二元随机变量。
X⁺:= {x∈ X | A = 1}:正的训练数据。z:一个多项式随机变量,其中 K ∈ Z⁺值中的每一个代表一个“原型”。与每个原型相关联的是在与个体 x 相同的空间中的向量 v_k。

其思想是将每个数据点 x 表示为 K 个原型的加权线性组合,以满足人口统计学上的奇偶性,并尽可能保持原始信息和准确性。损失函数反映了这一思想。

定义元素成为特定原型的概率的 softmax 版本

其中 d 是距离测量函数(例如 l₂距离)。在本文中,它被定义为一个加权 l₂距离函数:

定义 y_n 的预测,基于每个原型对 Y 的预测边缘化为:

总损失为:

其中,L_z 用于调整人口统计奇偶校验,L_x 是重建误差,L_y 用于计算预测损失。相关的 A_z、A_x、A_y 是平衡这些损耗的超参数。
在训练阶段,通过 L-BFGS 联合优化 v,w,α以最小化目标 L,超参数通过网格搜索来选择。必须注意,目标是非凸的,因此不能保证最优。

优点:

  • 预处理数据可用于任何下游任务。
  • 不需要修改分类器。
  • 测试时不需要访问敏感属性。

缺点:

  • 一般来说,预处理只能用于优化统计奇偶性或个体公平性(如果度量给定),因为它没有标签 y 的信息。
  • 在准确性和公平性度量的性能方面次于其他两种方法。

5.2 培训时的优化

最直观的想法是给现有的优化目标添加一个约束或正则项。大多数文学作品都属于这一类。此类方法可用于优化任何公平性定义( Calders 等人 2009 , Woodsworth 等人 2017 , Zafar 等人 AISTATS2017 , Zafar 等人 WWW2017 , Agarwal 等人 ICML2018 )。优化反事实公平性的方法也属于这一类( Russell et al .,NIPS2017 )。

示例:

下面的算法是在 Zafar 等人的 WWW2017 中提出的。

符号:
x ∈ Rᵈ:非敏感属性。
y ∈ {-1,1}:类标签。
\hat{y} ∈ {-1,1}:预测标签。
θ:要学习的参数。
L(θ):原凸损失。
d_θ (x):特征向量到决策边界的有符号距离。
f_θ (x):分类器函数。如果 dθ(x)≥0,fθ(x)= 1,否则为-1。
z ∈ {0,1}:敏感属性。

本文主要讨论以下三种公平性约束:

它们中的一个或全部三个可以作为约束添加到原始优化问题中。

应该注意的是,假阴性率的平等意味着真阳性率的平等,因此这意味着机会的平等。假阳性率相等意味着真阴性率相等。总的错误分类率的相等意味着分类率的相等,这是准确性的均等,均等优势的较弱的概念。这里我们以假阳性率(约束条件与机会均等相同)为例。它具有以下优化公式:

问题是约束使得优化变得难以处理。因此,该文件放宽了限制。它使用用户敏感属性之间的协方差以及用户特征向量和分类器决策边界之间的有符号距离作为代理来捕捉敏感属性和组级(条件)预测之间的关系:

放松后,公式现在变成:

其中协方差阈值 c ∈ R⁺控制遵守机会均等的程度。

这样的公式化仍然是非凸的,所以接下来我们将把这些约束转换成一个有纪律的凸凹规划(),它可以通过利用凸凹规划的最新进展来有效地解决(沈等 2016 )。
首先,我们可以将公平性约束重写为:

其中~表示“≥”或“≤”。为了简单起见,我们去掉常数 1/N。由于 z ∈ {0,1},我们可以将总和分成两项:

其中 D₀和 D₁分别是 d . s . t . z = 0 和 z=1 的子集。定义 N₀=|D₀|和 N₁=|D₁|,然后\overbar{z} = N_1/N。约束现在变成:

假设 g_θ在θ中是凸的(假设),这就产生了一个凸凹函数。因此,优化现在变成了:

这是一个针对任何凸损失 L(θ)的训练有素的凸-凹规划(DCCP),并且可以使用众所周知的试探法有效地求解,例如在沈等人 2016 中提出的试探法。

优点:

  • 在准确性和公平性方面表现良好。
  • 可以更灵活地选择准确性和公平性度量之间的权衡(这取决于具体的算法)。
  • 测试时不需要访问敏感属性。

缺点:

  • 此类别中的方法是特定于任务的。
  • 需要修改分类器,这在许多情况下可能是不可能的。

5.3 后处理

这种方法试图以满足公平性约束的方式编辑后验概率。它可以用来优化大多数公平定义(反事实公平除外)。基本思想是使用每个组的原始得分函数 R 来找到合适的阈值。作为预处理,分类器不需要重新训练/改变(费尔德曼 2015 ,哈特等人 NIPS2016 )。

例子(统计均等/机会均等):

下面的算法是在 Hardt 等人的 NIPS2016 中提出的。

给定一个分类器,我们可以为两组绘制相应的 ROC 曲线。接下来,我们可以根据 ROC 曲线找到阈值(参见图 12 的图示)。

Fig12: Finding the optimal equalized odds predictor (left), and equal opportunity predictor (right) (Hardt et al. NIPS2016)

均衡优势(真阳性率和假阳性率相等)仅在两组的 ROC 曲线相交时满足,如左图所示;机会均等,作为一个较弱的概念,可以通过采用阈值来满足,使得两组的真实阳性率相等,如右图所示。

优点:

  • 可应用于任何分类器之后。
  • 相对较好的性能,尤其是公平措施。
  • 不需要修改分类器。

缺点:

  • 要求测试时访问受保护的属性
  • 缺乏选择准确性-公平性权衡的灵活性。

5.4 实验

需要注意的是,本节实验结果来自 Agarwal et al. ICML2018 。他们的方法属于训练时优化的范畴。我没有介绍他们的方法,因为完全解释他们的方法和他们的方法提供的理论保证需要时间。我可能会在未来的一个单独的帖子中介绍他们的论文。

数据集:

以下四个数据集用于实验。除了 adult4 之外,所有数据集都有二进制保护属性,adult4 有两个敏感属性(性别、种族),因此有四个保护属性值(为简单起见,两个属性都被二进制化)。

成人收入数据集 ( Lichman,2013 )

  • 尺寸:48842 个示例
  • 任务:预测某人的年收入是否超过 5 万美元
  • 敏感属性:性别(男/女)或性别(男/女)和种族(白人/非白人)

ProPublica 的 COMPAS 累犯数据 ( Larson 等人 ProPublica,2016 )

  • 尺寸:7918 个示例
  • 任务:从某人的犯罪历史、入狱时间、人口统计数据和 COMPAS 风险评分预测累犯率
  • 敏感属性:种族(白/黑)

法学院招生委员会的全国纵向律师通道研究 ( 威格特曼,1998

  • 尺寸:20,649 个示例
  • 任务:预测某人最终通过律师考试
  • 敏感属性:种族(白/黑)

荷兰人口普查数据集 ( 荷兰中央统计局,2001 年)

  • 尺寸:60420 个示例
  • 任务:预测某人是否有声望的职业
  • 敏感属性:性别(男/女)

实验结果:

对几种方法的性能进行了比较,包括预处理( Kamiran 和 Calders,2012 提出的重新加权和重新标记方法)、训练时的优化( Agarwal 等人的 ICML2018 中的归约、网格和归约、后处理( Hardt 等人的 NIPS2016 )(见图 13)。

Fig13: Classification error versus constraint violation on test examples with respect to Demographic Parity(DP) and Equalized Odds(EO). The curves plot the Pareto frontiers of several methods. Markers correspond to the baselines. Vertical dashed lines are used to indicate the lowest constraint violations. (Agarwal et al. ICML2018)

结果表明,所有的方法都能够大大减少或消除差异,而对分类器精度没有太大影响(除了在荷兰人口普查数据集上)。对于人口统计均等,归约方法(属于训练时的优化)一致地实现最低的约束违反,优于或匹配基线。对于小的违规,后处理算法表现良好。重新加权和重新标记(属于预处理)是最差的。

5.5 讨论

实际上,毫无疑问,在准确性和公平性之间实现最佳平衡的方法是通过在训练时进行优化。然而,预处理和后处理方法能够在不修改分类器的情况下保持公平性。当我们没有能力修改分类器时,这样的特征是需要的。

必须指出的是,我们之前讨论的所有方法都需要在训练期间获得关于敏感组的信息。后处理方法甚至在测试时也需要它。当人们不公开他们的身份时,这可能是不可能的。最近在这方面开展了一项工作,在不知道敏感属性的情况下,使用稳健统计技术优化精确度奇偶校验( Hashimoto 等人,ICML2018 )。

6.摘要

  • 近年来,公平成为 ML 社区中一个非常热门的话题。
  • 公平很重要,因为它对每个人的利益都有影响。
  • 最大似然系统中的不公平性主要是由于训练数据中存在的人为偏差。
  • 对于(不)公平的“最佳”定义,目前还没有共识
  • 观察标准有助于发现歧视,但本身是不够的。因果观点可以帮助阐明问题,组织假设。
  • 除非在退化的情况下,否则三个组公平性定义中的任何两个不能同时实现人口统计均等、均等优势和预测率均等。
  • 准确性和公平性之间的权衡通常存在。
  • 有三种方法:预处理、训练时优化和后处理。各有利弊。
  • 大多数公平算法使用敏感属性来实现某些公平概念。然而,这种信息在现实中可能无法获得。

接下来是什么

在以后的文章中:我会考虑谈论超越二元分类的公平 ML,公平 ML 的最新进展,使用因果推理的反事实公平 ML,或者更详细的理论结果。

确认

感谢您的阅读!这是我在 Medium 上的第一篇帖子。错误和遗漏是非常可能的,所以请让我知道,我会尽快纠正他们!我将非常感谢你的支持。请激励我以后多写一些,质量更高的帖子。

使用 Tensorflow 和 Pytorch 计算骰子值的两阶段方法

原文:https://towardsdatascience.com/a-two-stage-stage-approach-to-counting-dice-values-with-tensorflow-and-pytorch-e5620e5fa0a3?source=collection_archive---------18-----------------------

在之前的博客中,我讨论了如何在 Tensorflow 中使用大约 400 张带注释的图像作为训练数据来构建 12 类骰子检测器。该模型的目标是检测 6、8、10 或 12 面骰子的骰子面的存在,然后确定面值。一旦完成,我就可以在屏幕上得到骰子的总价值。

这个模型在这项任务中表现不错,但有一个问题,要么不能识别骰子的面孔,要么对它检测到的面值进行了错误分类。在上一篇文章的最后,我提到了解决这个问题的另一种方法,即构建第一级对象检测器,专门检测骰子的正面,然后构建第二级 CNN,利用第一个模型的输出来确定数字。虽然这增加了培训和实现管道的复杂性,但我认为它可以提高整体性能。

我对潜在性能改进的推理是基于使用一个适合所有人的通用模型的优势,而不是将问题分解成更小的部分并构建专门针对特定任务的模型。在这种情况下,第一级对象检测器可以学习一般地识别骰子面,而不是单独地识别每种类型的骰子。这意味着从不同的角度看到骰子会有更多的机会,因为根据方向的不同,识别 8 面和 10 面骰子的正面会产生类似的问题。然后,在第二阶段,我可以应用大量的旋转和翻转来增加数据,这比我在之前构建的通用对象检测模型中能够增加的数据要多得多,以帮助它更好地识别骰子值,而不管方向如何。

New object detection model has a single class “dice_top” the boxes get passed to a backend ResNet model for classification.

gif of the same video from the previous blog rerun here. Two stage pipeline also gets a value of 20

Y 你可以在这里 找到 github 上的代码。脚本需要用作 tensorflow 对象检测库的一部分,我在不同的点修改了检测脚本以进行数据准备。这些是我用来给图片和视频做最后标记的,就像在帖子里看到的那样。

训练新的物体检测器

对于这个项目,我使用了我在以前的博客中使用的相同的数据集。对于对象检测模型,我只使用了 200 张图像,其中我调整了所有的边界框,使其标签为“dice_top ”,而不是数字 1-12。我是通过用 Labelimg 快速浏览 XML 并手动调整标签来做到这一点的。最初,我试图在从 XML 生成的 csv 中自动调整标签,但是在训练时遇到了奇怪的模型行为,所以我恢复了手动方法。

对于单个类,模型只需要运行一个小时左右,我就可以在一个很好的阈值停止它,而不是以前的模型需要 6 个小时左右。

在这个阶段,我能够评估新的对象检测模型与其前身相比表现如何。很快出现的情况是,它正在检测第一个模型漏掉的骰子。下面左边的图像是第一个模型的输出,而右边的图像是由新的单类检测器处理的同一图像。左边的 6 在新型号中被检测到,但在第一个型号中被忽略。

以下图片对中的类似故事。靠近顶部的 d8 未被第一个模型检测到,但被第二个模型检测到。

此外,两种模型都显示了 10 面骰子的弱点。在这种情况下,两个模型在检测角落中的蓝色 10 面骰子方面表现不佳,并且在这种情况下,第一个模型更彻底地失败了。

因此,虽然第一个模型在未能识别蓝色 10 面骰子的顶部方面做得更好,但我认为值得注意的是,新的单类检测器在一半的数据上进行训练,但在检测骰子方面比其前身做得更好。

既然新的骰子检测器已经就位,我就可以开始构建价值分类的第二阶段模型了。

为后端模型准备数据

更有趣的数据准备工作是为后端 CNN 获取数据。我知道我需要训练一个模型来识别骰子表面的数字,而不管它们的方向如何,所以我认为以随机垂直和水平翻转以及随机旋转的形式增加大量数据的 CNN 会有所帮助。我决定使用 Pytorch 后端模型,因为它提供了一个很好的简单管道来训练和部署它的模型(我也运行了太多的 Keras 模型,喜欢这种变化)。使用 Pytorch 的另一个原因是我喜欢使用 Pytorch,并且在我的其他博客中有关于这类问题的很好的代码基础。

因此,要将骰子顶端的图像放入我想要的文件夹结构中,我有几个选项。

  1. 手工裁剪每一类的几百张图片:显然很慢,而且不是最佳的。对我来说太多体力劳动了。
  2. 使用新的骰子顶端模型裁剪出所有的骰子顶端,然后将它们分类到文件夹中。这也需要做一些整理工作。在这一点上,我想你们都知道我要说什么。
  3. 使用我之前训练的 12 个类别对象检测器,根据预测的类别将图像分类到 12 个文件夹中,然后查看数据集以找到错误分类。

我选择了第三种方法,因为它对我来说需要较少的机械工作,而且我发现这是解决过去其他问题的一个聪明的方法。

为此,我所要做的就是修改我用来将边界框输出到图像上的脚本,以提供框坐标,这样我就可以对图像数组进行切片,只裁剪出图像中的骰子顶部。然后使用从边界框中预测的类别,我将图像分类到不同的文件夹中。这让我可以在几分钟内生成 2500 张左右的裁剪图像,而不是手工裁剪 2500 张图像所需要的时间…

接下来是打扫卫生。下面是 6s 文件夹的截图,其中有一些 9 隐藏在组合中。对于这些骰子,9 和 6 通常在底部附近标有线或点,对于没有标记的骰子,这意味着它是 6。

另一个有趣的类别是观察 1s 和 7s。

这也让我对我的 12 类对象检测模型产生的分类错误有了一个很好的感觉。根据不同的角度,你会看到 5s 被标记为 2s 或 6s,11s 或 12s 被标记为 10s、2s 或 1s,因为该型号很少接触这些数字。

一旦数据集被分类到 12 个文件夹中,我就准备扔几个 CNN 进去看看有什么效果。

训练 Pytorch CNN

有了数据集并按类分解到文件夹中,使用标准数据集和数据加载器函数来利用 pytorch CNN 管道就非常简单了。这里需要注意的一点是,我制作了一个包含 120 张图片的验证集(每个类 10 张)。我做了一个平衡的验证集,尽管值 1-6 有很大的不平衡,因为它们出现在所有的骰子上,而值 11 和 12 只出现在 d12s 上,所以它们出现得最少。

我发现,使用预先训练的 ResNet 模型效果相当好,我只是允许在几个时期内对权重进行微调。大约 15 个时期后,我用 ResNet 50 获得了 95%的验证集准确度,并发现将其增加到 ResNet 101 会将其准确度增加到 97%。我最终坚持使用 ResNet 101,因为目前模型的占地面积不是我的一个大问题。

把它们放在一起

现在我有了这两部分,我所要做的就是把它们放在一个管道中。第一阶段模型将检测骰子面并将这些骰子面馈送给第二模型用于分类。然后,基于后端模型的分类,我能够在屏幕上添加骰子值并显示它们。

这相对简单,需要初始化 Pytorch 模型,并添加额外的函数来预处理图像,将结果映射到它们的标签,并将结果相加。唯一恼人的部分是,我目前没有多 gpu 机器可用,当其中一些模型基于 Tensorflow 时,与多个模型一起工作会变得很烦人。

对于其他项目,我在同一个 GPU 上使用了多个基于 Pytorch 的大型模型,就像我的 Fate Grand Order 机器人一样。然而,我发现 Tensorflow 倾向于将所有可用的 GPU 资源分配给自己。因此,为了运行多个模型,我基本上是在任意给定的点上处理哪个是活动的,但是对于这个用例,我只是分配 Pytorch CNN 在我的 CPU 上运行。这减慢了评估的速度,但暂时是一个快速的解决方法。下一个技术购买可能是建立一个 GPU 集群,使这样的事情不那么烦人。

It gets the correct 20, but It shows some fluttering to thinking the 6 is a 9 which is a problem I found with the backend classifier that I will discuss more below.

比较这两种方法

当考虑这两种方法时,我认为主要的权衡是速度和准确性之间的权衡。

我可以在单个 GPU 上运行的第一种单一模型方法的评估速度比我的 GPU + CPU 方法快得多。然而,在两个 GPU 上运行第二个管道可能会最小化这种差异。

现在有趣的是,看看两者之间的表现。为此,我从训练集和验证集中拿出了 25 个例子,我想你可以称之为测试集,并对它们运行两个模型。为此,我只是看他们是否得到了正确的骰子总值,如果没有,我会记录他们犯的错误类型。

第一个模型得到了 25 个完全正确中的 8 个(32%) ,而两级管道得到了 25 个完全正确中的 16 个(64%) 。所以我写这篇博客的总体假设似乎是正确的,尽管两者都还有改进的空间。

第一个模型产生的错误通常是没有检测到某些骰子,或者是我上面提到的对某些数字的错误分类。常见的有 6s vs 9s,1s vs 7s,以及若干个 8s vs 3s vs 6s。下图中有 3 个骰子未被检测到,3 被归类为 6。

Image from the first single object detection model

两阶段流水线通过识别丢失的 3 个骰子并正确地对值为 41 的所有骰子面进行分类而胜过第一模型。

然而,第二个模型仍然有问题,在我看到的 25 个案例中,它的问题是没有正确检测 10 面骰子上的面孔(这两个模型都做得很差),然后将 6 误分类为 9。要解决这个问题,我必须检查以确保我在数据集的 6 和 9 文件夹中没有任何问题,然后如果这不能解决问题,那么用更多的 9 和 6 的图像增加数据。在这两种机制之间,我认为这将有助于解决许多问题。对于错误识别 10 面骰子上的面,我认为为该特定骰子添加更多数据将是有用的。

True value should be 41, but is off by 3. I think it comes down to the 6 sided die that does not have a marking on it. The fact that this is an issue makes me think I have some of those dice examples in both the 6 and 9 folders which poisons the training data.

最后的想法

因此,在这篇文章中,我展示了我将如何建立两个阶段的管道,我以前在我的第一篇骰子计数文章中提到过。此外,我很高兴地报告说,两阶段管道确实优于我的第一个模型,在检测骰子面和分类方面做得更好。对我来说,这是另一个构建良好的专门化模型执行通用方法的例子。为了更直观地了解这种方法的工作原理,我想到了我的武术背景。这可以用李小龙的一句话来概括。

我的个人版本是当我的第一位剑术大师告诉我,我应该“练习一种技术 1000 次才能理解它,10000 次才能掌握它”。

神经网络是相似的,因为它们通常采用成千上万的例子,以便收敛到一个好的解决方案,并学习识别特定的类别。因此,精简他们必须优化的东西可以让他们更好地优化特定的问题,并了解其来龙去脉。从技术角度来说,对于我的 12 类检测器,它可能只看到一个特定的骰子/骰子面几十次,并且必须学会基于这几个例子来定位和分类它。然而,单一类别检测器看到它的单一类别 2500 次。然后,第二阶段模型可能只看到每个类几十到几百次,但是它显著地增加了数据,从而极大地增加了它所拥有的有效训练数据的量。这使得它在分类时比基本的对象检测模型获得更多的经验。

这种额外的专门化增加了训练更多模型并在流水线中实现它们的复杂性。在这种情况下,两级流水线需要 2 个 GPU 来平稳运行,而不是单个模型只需要 1 个 GPU。从技术上来说,我可以试着不使用 tensor flow……因为在使用 Pytorch 之前,我已经一次运行了 3-4 个大型 ResNets。这种速度与精度权衡的价值在于,对于一个特定的任务,你需要什么样的精度与速度。

I had an extra gif, so here is some more dice rolling!

Y 你可以在 github 这里找到代码

教育人类和机器的统一工具

原文:https://towardsdatascience.com/a-unified-tool-for-the-education-of-humans-and-machines-63bd7d271e6f?source=collection_archive---------4-----------------------

这篇文章是关于让机器学习工具更容易使用。

但是,这并不是为了让外行观众看不懂,也不是为了给玩具问题创造玩具界面。

尽管人类和机器学习者之间存在许多差异,但每个人在机器学习的最关键方面都有丰富的经验——我们知道从经验中学习意味着什么。

事实上,我们如此沉浸在这个过程中,以至于在教别人的过程中,最大的挑战是记住我们自己是如何开始学习一些东西的。

这种元认知能力是一种珍贵且来之不易的技能,与教育工作者的工作尤其相关,但也是每个人日常与他人互动的关键组成部分。

http://bit.ly/2FK4uHR

当我们教我们的孩子骑自行车时,我们并不背诵精确的程序。我们演示,当他们接近动作时我们观察,然后我们将孩子的注意力引向任务中被忽略的方面。

机器学习工具应该帮助我们准确地为机器做这些事情,这样它们就可以反过来帮助我们执行太复杂而无法用传统代码表达的任务。

帮助我们提高这些元认知能力的工具不仅能帮助我们建造更有用的机器,还能帮助我们更好地了解自己,更有效地与世界打交道。

因此,当我说“可访问”时,我的意思是机器学习工具应该能够作为每个人通过经验学习和教学的先天能力的延伸。

机器学习是每个人的工具。

然而,就目前的形式而言,这一点显然并不明显。

目前,机器学习的探索需要编程技能、机器学习技术和基础数学的工作知识,甚至一些 DevOps 技能。综合来看,这些要求构成了很高的准入门槛。

第一代机器学习工具专注于帮助专业从业者在高粒度级别管理高性能管道。这些工具已经将机器学习的概念需求抽象到传统的编程结构中,尽管传统代码的演绎思维和机器学习系统的归纳思维之间存在固有的不一致。

http://bit.ly/2B0utc5

这些工具没有强调课程设计的技巧,也没有强调通过提炼和提出最有意义的元素来管理学习者对复杂概念的体验的过程。

在我的教学工作中,我发现学生的编程和数学背景往往不是他们如何利用机器学习进行应用创造性工作的最佳预测因素。在许多情况下,最吸引人的项目来自最清晰的作者和最细心的设计师。

这是因为让机器学习项目成功的很多因素都与学生对学习问题的表达有关——如何通过特定的数据呈现来展示特定的概念。

http://bit.ly/2FSx72D and http://bit.ly/2jDpcya

随着用于自动化架构和超参数搜索的机器学习算法和机制变得更加健壮,当前机器学习工作所必需的一些技能将变得不那么重要,而清楚地阐明学习问题的技能将变得更加重要。

理想情况下,下一代机器学习工具不仅可以帮助新手熟悉这些解决问题的机制。它还将帮助专家通过专门围绕机器学习思维设计的工具更有效地探索机器学习概念。

http://bit.ly/2g9Yv2A

传统上,编程语言被视为不同于交互式开发环境(ide)和在编写软件过程中起作用的其他工具。

这些描绘已经是计算中前图形时代的过时痕迹。

但是,在机器学习时代,它们将很快成为软件开发人员工作的严重障碍。

在 DeepMind、OpenAI、微软和其他公司为训练强化学习系统建立模拟环境的努力中,已经可以看到对更全面的编程环境的需求。

http://bit.ly/2Ip32t8

Jupyter notebooks、Matlab、Mathematica、Swift、Processing、Scratch 和 web 开发工具通过将编程从纯文本编辑器的局限转移到寻求适应软件开发的交互式和多媒体方面的更具凝聚力的环境中,帮助模糊了这些区别。

然而,还有很长的路要走。

明确地说,这不仅仅是让编程界面更容易被人类用户接受的问题,尽管这本身就是一个有价值的目标。

更广泛的必要性来自于这样一个事实,即机器学习正在迫使计算机程序走出黑暗的地下室,进入视觉、听觉和物理世界。

更深层次的通信机制不应该被附加到现有的接口上,也不应该被归入辅助库。它们必须被带到我们工具的中心。

更进一步,我们应该把机器学习带来的范式转变作为一个机会,重新思考软件开发过程的许多方面。

箔纸

我想给你们看一个我正在做的项目,作为如何将这些原则引入下一代机器学习工具的例子。

下面提到的一些元素已经实现,其他元素在路线图中。但是,出于本文的目的,我想讨论整个愿景。

Foil 是一个组合的机器学习和创造性编码平台、工具包和 IDE。

它试图在一个平台上关闭编程、机器学习和设计工具之间的环路,提供从新手到专家的无缝路径。

Foil 设想了一种多层次的方法,在这种方法中,专家可以直接使用较低级别的功能,但也可以将它们组合在一起,为经验较少的用户形成较高级别的功能。

随着用户获得专业知识,他们可以检查包含这些高级功能的组件,并开始使用低级组件,以及创建和共享他们自己的高级组合。

Foil 的专家模式大致相当于 Jupyter 笔记本等一些现有的机器学习开发环境,但努力在机器学习功能和一系列 GUI、scenegraph 和数据可视化功能之间提供更无缝的集成。

从工具制作的角度来看,这种模式是 Foil 自己的基于文本的编程语言提供的最细粒度功能与 Foil 在幕后利用的本机机器学习和创造性编码工具包之间的桥梁。它还创建了构建高级“中级”和“初级”模式工具的基础。

接下来,我想讨论如何通过构建机器学习模型和数据争论的构建块来实施这种多层方法。我还将介绍一个我称之为指令的概念,一种项目开发的对话式方法。最后,我将讨论这些组件如何与一组创造性的编码工具相关联。

机器学习构建模块

也许进入机器学习工作最令人生畏的事情是获得对某些数学运算在机械化归纳学习过程中所起作用的直觉的过程。

但是,我敢说,挑战不仅存在于数学门外汉。支持这种说法的一个证据是,从莱布尼茨第一次提到微积分中的链式法则到反向传播算法的出现,相隔了三百年。

也就是说,即使理解了底层的力学和数学工具,当应用于太复杂而不能心算的系统时,这些工具的特定应用并不总是显而易见地会产生有用的能力。

为了克服这一挑战,我们必须降低实验的门槛。

当然,没有引导的实验不太可能从零开始,研究出像现代神经架构这样复杂的结构。

相反,实验者可以从已知的机制出发,通过尝试将这些一般形式与最初激励实验者探索这一领域的项目想法联系起来,从而获得最大的成果。

当实验者试图学习的例子被专业实践者以模糊的方式编码时,这个过程就变得非常困难。

出于这个原因,我认为在呈现用于构建机器学习系统的架构组件时采用多层方法是很重要的。

为了帮助新手,该工具应该提供一组非常高级的构建模块,解决学习问题的基本类别。

在他或她的实验的早期阶段,用户不太可能需要更专门的构件。

因此,一个高级界面提供了对一系列可轻松定制的模板以及底层自动化的轻松访问,这将有助于用户理解该领域的问题解决方案,而不会妨碍他或她的早期探索。

该界面应提供构建模块及其组件属性的图形表示,以便在不需要外部参考资料的情况下促进实验,并使用户能够检查他们构建的系统的底层架构。

随着用户对机器学习的直觉和知识的增长,他们构思更新颖的架构和机制来处理现实世界问题的能力也将增长。

他们不应该被迫升级到一个完全不同的、更专业的工具。相反,该工具应该能够逐渐公开更高级的功能,并允许用户参与更细粒度的决策。

最终,高级用户会发现通过纯文本命令与工具交互是最方便的。在这里,用户也不应该被迫升级到一个完全不同的开发环境。

作为这些构件的扩展,该工具应该提供一个广泛的模型动物园和基础设施,使用户能够轻松地共享他们的模型。

Foil 设想了模型动物园中的三种模型。

指定和训练的模型可以从货架上取下,直接用于执行特定的机器学习任务,如图像识别。这些模型还应该附带简化迁移学习过程的挂钩。

其他模型将提供预先指定的架构,但未经培训,以便用户可以轻松地将它们与自己的数据集相结合。

最后,一组未指定和未训练的模型将提供一组通用的机器学习架构,可以在对他们的自定义数据集进行训练之前,根据用户自己的需求进行定制。

为了促进这一过程,该工具应该为本地或云中的培训模型提供无缝的工作流,而不需要丰富的 DevOps 知识。

数据操作构建模块

鉴于数据在构建机器学习系统中的首要地位,开发工具应该提供一组健壮的构建块,以促进数据的加载和操作。

虽然数组操作是计算机科学家执行的最常见的任务之一,但它往往是新手程序员最大的挫折之一。

即使对于经验丰富的开发人员来说,理解用于对复杂数据进行切片的特定代码也是耗时且乏味的。

取决于用户想要从数据中学习什么,或者她想要通过数据执行什么任务,如何分割数据和使用什么神经架构的问题是相互关联的考虑因素。

因此,数据操作组件与工具的架构构建块紧密结合是非常重要的。

在最高级别,该工具应该提供从一组文件或媒体流中选择示例的交互机制。

它应该为构建块提供图形界面,直观地展示传入数据将如何切片。

在稍低的层次上,该工具应该为一系列媒体格式以及常见的开源数据集提供数据加载器和常见的切片器类型。

在最低级别,该工具还应该为有经验的开发人员提供传统的机制,以编程方式访问文件系统和操作数值数组。

与架构组件非常相似,该工具应该为与其他用户共享定制数据集、切片器和加载器提供基础设施。

为了支持数据集维护,该工具应该提供一组可定制的监视器,自动检查文件目录或远程存储库的更新,并在更新发生时执行模型的自动重新训练。

最后,该工具应该在开发环境中提供流线型的机制,用于请求众包数据获取和清理。

指令

在传统的编程环境中,开发人员从几乎空白的状态开始,并且必须构想一组相互关联的抽象,以解决期望的编程行为的各种组件。

这种媒介的开放性是一件奇妙的事情。但是它要求开发人员自己决定每个组件之间的关系以及整体关系。

指令提供了一种机制,可以帮助开发人员在不强加任何特定抽象的情况下构建他们的思维。

从最基本的意义上来说,指令由一组小部件组成,这些小部件用于请求多媒体输入并向用户呈现多媒体输出。

指令的作者使用这些小部件组成一种决策树或引导过程,通过该过程,用户可以以最适合手头任务的方式对每个决策点做出响应。视觉信息可以视觉传达,文本信息可以文本传达。

当用户需要特定的数值时,可以呈现滑块,使得用户可以在特定的范围内进行实验,并看到其效果立即应用于上下文中。

Directives Zoo 不是提供一个预先确定的心智模型,而是为开发人员提供一系列针对各种组件问题的可能抽象。

或者,开发人员可以编写自己的指令。这个创建多模态决策树的过程推动用户通过一组决策点清晰地、有目的地进行思考。一旦定义了这些决策点,解决方案就在路上了,就像制定一个问题通常是回答它的一半工作。

作为一种众包设计模式,指令可以用来促进软件开发过程。但是它们也可以在面向用户的应用程序中使用,以便于与经过训练的机器学习模型或应用程序的其他功能进行交互。

从这个意义上说,指令模糊了编写和使用软件行为之间的区别。在编写软件的上下文中,它们通过将过程分解成更小的任务,帮助开发人员创建更易于管理的对话式体验。在面向用户的上下文中,它们为我们将与智能应用程序进行的多模态交互提供了一种更自然的格式。

指令可以显式地写成代码,也可以使用提出诸如“用户下一步应该做什么?”之类问题的指令生成指令来创建多么 meta!

还可以配置一个指令来提供用户响应的底层数据收集,以便输入学习决策树,非常类似于游戏 20 问题的数字版本。

这个特性为开源软件的共享带来了新的价值。如果一个开发人员选择共享一个指令,那么每当其他人使用它时,她的软件就会得到改进。

创造性编码

机器学习最大的好处之一是,它使我们能够超越键盘和鼠标的限制,通过机器越来越强的理解图像、音频流、视频等内容的能力,以越来越自然和直观的方式与机器交流。

这些媒体形式对于机器学习模型的训练以及我们随后与训练好的模型的交互都至关重要。

然而,当代编程工具提供的帮助很少。

组织大型多媒体数据集的艰巨任务留给了外部工具——需要开发人员通过操作系统、传统设计工具和特定代码来导航这一过程。

开发人员通常还必须拼凑大量第三方库,以便可视化培训指标,并生成用户界面和应用程序前端体验的其他方面。

为了提供集成的开发和部署工作流,并促进现代机器学习增强应用程序的生产,该工具必须直接在 development studio 中提供完整的创造性编码框架,包括 GUI、scenegraph 和数据可视化组件。

这些创造性的编码工具旨在以三种不同的方式帮助开发人员。

http://bit.ly/2FPKNhV

首先,通过提供用于操作和组织多媒体资产的图形界面、指令和编程挂钩,Foil 作为一种灵活的设计工具,用于在用于开发机器学习模型本身的相同环境中创建培训课程。

这一功能构成了 Foil 在促进“多媒体数据作为输入”方面的作用

http://bitly.com/2FIeFcG and http://bit.ly/2Isf1pJ

同样重要的是给予箔的作用,创造“多媒体输出”

创造性的编码框架使开发人员能够创建广泛的交互式、面向用户的应用程序,这些应用程序利用自定义或开源机器学习模型的智能行为。

对于一些机器学习应用程序来说,RESTful 服务和消息协议在独立系统之间搭建桥梁已经足够好了。

但是对于越来越多的高带宽应用,这种方法会产生技术瓶颈,阻碍创造性的探索。

http://bit.ly/2pevHbr and http://bit.ly/2FCYHAx

通过将一整套机器学习和前端开发工具集成到一个环境中,个人开发人员可以将目光投向广泛的高性能、支持机器学习的项目。

例如,姿势估计模型可用于提供对用户创建的游戏中的角色的类似 Kinect 的骨架控制,或者图像分割模型可用于用户创建的图像编辑工具中。

Photoshop and http://bit.ly/2paTN7O

最后,为了完成循环,开发人员可以通过建立 scenegraph 侦听器和其他在运行时捕获用户或实体行为的实时观察器,使用多媒体输出来生成新的输入训练数据。

例如,可以从用户行为历史中挖掘常见的使用模式,以便软件可以建议可能的后续步骤。

在包括 3D 物理模拟的应用中,场景图节点的行为可以用作强化学习模型或机器人项目的训练数据。

在箔环境中构建的应用程序应该可以轻松部署到桌面和移动系统、基于 web 或云的服务以及嵌入式物联网设备。

结论

当工具达到一定的成熟水平,使各种类型的用户能够开始通过计算机解决自己的需求时,最初的个人计算革命就开始了。

http://bit.ly/2Iz6Gkl

基于这个原因,我认为得出机器学习革命还没有真正开始的结论是合理的。

机器学习的真正前景在于工具,这些工具将使经验丰富的软件开发人员、小企业主和普通消费者能够看到机器学习可以帮助他们满足特定需求并帮助他们自己开发解决方案的方式。

就像之前的个人和移动电脑市场一样,这个市场将会非常巨大。

然而,这个市场还不存在,因为这些工具还没有进化到不言而喻的程度。

在不太遥远的未来,机器学习将帮助我们解决无数的问题,这些问题对于我们自己的生活来说太具体了,无法通过预先构建的服务的现成功能来解决。

它将帮助我们建立一个我们还无法想象的世界。

但是我们可以从想象这样的工具会是什么样子开始,以及我们如何使它们既有表现力又易于使用。

没有一种机制,没有一种方法或界面对每个用户或每个用例都是完美的。

也许唯一通用的解决方案是提供灵活性。在机器学习的时代,工具制造者的角色是一个翻译角色。该工具必须与人类和学习机器的经验性质相一致。

提供一些起点。鼓励实验。帮助人们构建他们的思维,让他们探索和遇到一些复杂的因素。当他们这样做时,提供一系列可能的解决方案。但最重要的是,要为他们提供基础设施,让他们能够开发自己的解决方案,并与他人分享。

让用户能够适应工具并被工具所适应——与工具一起成长。

如果你喜欢这篇文章,你可能也会喜欢我之前的相关文章,“在机器学习时代重新思考设计工具”

这篇文章基于我最近在 Google PAIR UX 研讨会上的一次演讲。

如果你想关注我在机器学习、人工智能、设计工具和编程语言方面的工作,请在 Medium @ Patrick 希伯伦或 Twitter @Patrick 希伯伦上关注我。我的主页还包括其他几种联系方式。

置信区间的(非常)友好的介绍

原文:https://towardsdatascience.com/a-very-friendly-introduction-to-confidence-intervals-9add126e714?source=collection_archive---------2-----------------------

今天我想谈谈统计学中的一个基本术语——置信区间,我想以一种非常友好的方式进行讨论,只讨论一般概念,没有太多花哨的统计学术语,并且使用 python!

虽然这个术语非常基础,但有时很难完全理解(对我来说)到底发生了什么,为什么我们需要它,什么时候我们应该使用它。

那我们开始吧。

假设你想知道美国有百分之多少的人喜欢足球。为了得到这个问题 100%正确的答案,你唯一能做的事情就是问每一个美国公民他们是否热爱足球。根据维基百科,美国有超过 3.25 亿人。与 3.25 亿人交谈并不实际,所以我们不得不考虑其他事情,我们必须通过问(少得多)的人来得到答案。

我们可以通过在美国随机抽样(与更少的人交谈)来做到这一点,并获得样本中热爱足球的人的百分比,但我们不会 100%相信这个数字是正确的,或者这个数字与真实答案有多远,所以,我们将试图实现的是获得一个区间,例如,对这个问题的一个可能的答案可能是:“我 95%相信美国热爱足球的人的百分比在 58%和 62%之间”。这就是置信区间这个名字的由来,我们有一个区间,我们对它有一些信心。

旁注:我们的样本将是随机的,这一点非常重要,我们不能只从我们居住的城市中选择 1000 人,因为那样就不能很好地代表整个美国人口。另一个糟糕的例子是,我们不能向 1000 个随机的人发送脸书消息,因为这样我们会得到一个美国脸书用户的代表,当然不是所有的美国公民都使用脸书。

假设我们有一个来自美国的 1000 人的随机样本,我们看到在这 1000 人中 63%的人热爱足球,我们可以对整个美国人口做出什么样的假设(推断)?

为了回答这个问题,我想让我们换个角度来看。假设我们知道(理论上)美国人的确切比例,假设是 65%,随机选择 1000 人,只有 63%的人会喜欢足球,这种可能性有多大?让我们使用 python 来探索这一点!

love_soccer_prop = 0.65  # Real percentage of people who love soccer
total_population = 325*10**6  # Total population in the U.S. (325M)num_people_love_soccer = int(total_population * love_soccer_prop)num_people_dont_love_soccer = int(total_population * (1 - love_soccer_prop))people_love_soccer = np.ones(num_of_people_who_love_soccer)people_dont_love_soccer = np.zeros(num_
people_dont_love_soccer)all_people = np.hstack([people_love_soccer, people_dont_love_soccer])print np.mean(all_people)# Output = 0.65000000000000002

在这段代码中,我创建了一个包含 3.25 亿人的 numpy 数组,如果他们中的每个人热爱足球,我就为他们存储一个数组,否则就存储零个数组。我们可以通过计算平均值来得到数组中 1 的百分比,实际上是 65%。

现在,让我们取几个样本,看看我们得到的百分比是多少:

for i in range(10):
    sample = np.random.choice(all_people, size=1000)
    print 'Sample', i, ':', np.mean(sample)# Output:
Sample 0 : 0.641
Sample 1 : 0.647
Sample 2 : 0.661
Sample 3 : 0.642
Sample 4 : 0.652
Sample 5 : 0.647
Sample 6 : 0.671
Sample 7 : 0.629
Sample 8 : 0.648
Sample 9 : 0.627

你可以看到我们得到了每个样本的不同值,但是直觉(和统计理论)表明大量样本的平均值应该非常接近真实的百分比。就这么办吧!让我们取许多样本,看看会发生什么:

values = []
for i in range(10000):
    sample = np.random.choice(all_people, size=1000)
    mean = np.mean(sample)
    values.append(mean)print np.mean(values)# Output = 0.64982259999999992

我们创建了 10K 样本,检查了每个样本中热爱足球的人的百分比,然后对他们进行平均,我们得到了 64.98%,这非常接近实际值 65%。让我们画出我们得到的所有值:

你在这里看到的是我们在所有样本中得到的所有值的直方图,这个直方图的一个非常好的特性是它非常类似于正态分布。正如我所说的,我不想在这里使用太多的统计术语,但我们可以说,如果我们多次(无限次)进行这个过程,我们将得到一个非常接近正态分布的直方图,我们可以知道这个分布的参数。更简单地说,我们将知道这个直方图的形状,所以我们将能够准确地说出有多少样本可以得到任何范围的值。

这里有一个例子,我们将运行这个模拟更多次(试图达到无穷大):

首先,我们可以看到直方图的中心(平均值)接近 65%,正如我们预期的那样,但我们可以通过查看直方图了解更多信息,例如,我们可以说一半的样本大于 65%,或者,我们可以说大约 25%大于 67%,甚至,我们可以说(大约)只有 2.5%的样本大于 68%。

在这一点上,许多人可能会问两个重要的问题,“我如何获取无限数量的样本?”以及“这对我有什么帮助?”。

让我们回到我们的例子,我们采取了 1000 人的样本,得到了 63%,我们想知道,1000 人的随机样本将有 63%的足球爱好者的机会是什么。使用这个直方图,我们可以说有(大约)25%的机会得到小于或等于 63%的值。理论告诉我们,我们实际上不需要做无限的样本,如果我们随机选择 1000 个人,其中只有 63%的人会喜欢足球。

边注#2:实际上,为了所有这些(找到值范围的机会),我们需要知道,或者至少估计,总体的标准偏差。因为我想让事情变得简单,所以我现在就离开它。

让我们回到现实和真正的问题,我不知道美国足球爱好者的实际比例。我只是拿了一个样本,得到了 63%,这对我有什么帮助?

所以我们不知道美国热爱足球的人的实际比例。我们所知道的是,如果我们取无限数量的样本,它会是这样的:

这里 μ 是总体均值(我们例子中足球爱好者的真实百分比),σ是总体的标准差。

如果我们知道这一点(并且我们知道标准偏差),我们就可以说,大约 64%的样本将落在红色区域,或者,在该图中,超过 95%的样本将落在绿色区域之外:

如果我们使用之前假设实际百分比为 65%的图,那么 95%的样本将落在 62%和 68%之间(±3)

当然,距离是对称的,所以如果样本百分比在实际百分比-3 和实际百分比+3 之间的 95%的时间内下降,那么实际百分比将是样本百分比-3 和样本百分比+3 之间的 95%的时间。

如果我们取一个样本,得到 63%,我们可以说我们 95%有信心,真实的百分比在 60% (63 -3)到 66% (63+3)之间。

这是置信区间,区间是 63+-3,置信度是 95%。

我希望置信区间现在更有意义,就像我之前说的,这个介绍遗漏了一些技术上但很重要的部分。有很多文章确实包含这些部分,我希望现在遵循它们会容易得多。

Jupyter 笔记本上一个非常简单的交互控件演示

原文:https://towardsdatascience.com/a-very-simple-demo-of-interactive-controls-on-jupyter-notebook-4429cf46aabd?source=collection_archive---------1-----------------------

当使用交互式小工具时,笔记本变得活跃起来。用户可以可视化和控制数据的变化。学习变成了一种身临其境的、有趣的体验。研究人员可以很容易地看到改变模型的输入如何影响结果。

Jupyter/IPython 项目对数据科学家如何快速测试和原型化他/她的想法并向同行和开源社区展示工作产生了最大程度的影响。这是一个非营利性的开源项目,诞生于 2014 年的 IPython 项目,该项目迅速发展,支持跨所有主要编程语言的交互式数据科学和科学计算。

Jupyter 允许数据科学家/分析师使用他/她选择的任何领先编程范例(Python、C++、R、Julia、Ruby、Lua、Haskell 等等)来处理复杂的数据集和测试模型。在其明显的简单性背后,Jupyter 提供了强大的渲染能力来生成漂亮的标记文本和清晰的图形,以使数据科学/机器学习项目充满活力。下面是 Jupyter 笔记本上写的整个基础集合代数教程的例子。

然而,当用户可以交互地控制模型的参数并(几乎)实时地看到效果时,学习和实验数据就变得真正身临其境了。Jupyter 中大多数常见的渲染都是静态的。不过有一个大功夫引入了名为ipywidgets的元素,在 Jupyter 笔记本上渲染出了有趣的交互控件。基于这些核心元素,一些 2D 和 3D 动态数据可视化项目(例如 bqplot 、 ipyleaflet )的规模和范围也在不断扩大。

在本文中,我将展示一个演示笔记本,其中包含一个最简单的交互式控件元素,以及如何将它集成到数据建模任务中,以动态可视化模型参数调整的影响。

idgets 是多事件的 python 对象,在浏览器中有一个表示,通常是像滑块、文本框等控件。,通过前端(HTML/Javascript)呈现通道。他们使用 Jupyter 的“comms”API,这是一种对称、异步、一次性的消息传递 API,允许程序员在前端和后端之间发送支持 JSON 的 blobs,并隐藏 web 服务器、ZMQ 和 web 套接字的复杂性。下面详细讨论。

安装小组件

安装 ipywidgets 有两种选择。它们略有不同,所以请注意区别。基本上,如果您使用 pip,您还必须在笔记本中启用 ipywidget 扩展,以便在下次启动笔记本时呈现它。您可以在您使用的任何虚拟环境中启用它,以便该扩展不会影响任何其他环境。

pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension

或者,您可以进行 Conda 安装(如果您使用 Anaconda),它会自动启用。

conda install -c conda-forge ipywidgets

使用交互对象/控件

interact函数(ipywidgets.interact)自动创建用户界面(UI)控件,用于交互式地浏览代码和数据。这是开始使用 IPython 小部件的最简单的方法。

除了interact,IPython 还提供了另一个函数interactive,当您想要重用生成的小部件或者访问绑定到 UI 控件的数据时,这个函数非常有用。注意,与interact不同,函数的返回值不会自动显示,但是你可以用IPython.display.display在函数内部显示一个值。

一个简单曲线拟合练习的演示代码

锅炉板代码可从我的 GitHub 库获得。请随意叉/下载并使用它。我们实际上是生成一个带有噪声的高斯数据,并借助交互式滑动条或下拉菜单控件来处理各种模型参数。在传递函数并使用 ipywidget.interactive()返回的对象呈现显示后,它看起来是这样的…

接下来,我们调用 Scipy 包中的曲线拟合优化函数,并将理想的高斯分布函数拟合到数据中。该代码准确地描述了如何从 ipywidget 对象中提取数据并将其传递给优化器。您可以使用各种模型参数,并查看优化器拟合/估计的参数如何随着噪声参数的改变而与理想值有所不同,只需向左或向右滑动控件

摘要

我们讨论了关于 IPython 小部件或交互式控件的一些基础知识,以及为什么它们可以将枯燥的数据科学代码笔记本变成有趣的、生动的文档。我们还展示了一个简单的演示代码来说明统计模型拟合练习中的想法。在未来,我们希望展示一些更酷的小部件在机器学习模型调整或深度学习超参数优化中的应用。

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果你使用下面的链接, ,我会收到你的一部分会员费,而不会对你产生额外的费用

[## 通过我的推荐链接加入 Medium—Tirthajyoti Sarkar

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@tirthajyoti/membership)

深度认知的视频漫游

原文:https://towardsdatascience.com/a-video-walkthrough-of-deep-cognition-fd0ca59d2f76?source=collection_archive---------9-----------------------

大家好!在本文中,我将与您分享几个视频,带您了解 Deep Cognition 的平台和深度学习工作室。我们将运行简单的模型作为例子,最后会有一个最终的惊喜。

深度学习是一个令人惊叹的领域,它帮助我们创建伟大的解决方案,解决数据科学世界中的难题。我在过去谈论过深度学习,以及它如何在你的工作流程中帮助你,特别是在计算机视觉和 NLP 问题上。

你可以在这里查看其中的一些:

[## 我的深度学习之旅

在这篇文章中,我将分享我如何研究深度学习并使用它来解决数据科学问题。这是一个…

towardsdatascience.com](/my-journey-into-deep-learning-c66e6ef2a317) [## 深度学习的 Skejul 会议

厌倦了试图与某人见面,却找不到日期或时间?我也是。

towardsdatascience.com](/skejul-meetings-with-deep-learning-5efab285b111) [## 深度学习的“怪异”介绍

有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。

towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0)

当你进入一个新的计算领域时,你应该学习的一件事是好的工具。工具让我们能够解决我们的问题,而不需要从一开始就花费数小时编写简单或复杂的代码。现在有几个深度学习的工具,在编码领域和视觉领域。

在过去,我曾谈论过 Deep Cognition,一家伟大的公司,和其他人一样,正在走上民主化人工智能和深度学习的道路。

通常我们做深度学习编程,学习新的 API,有些比其他的更难,有些真的很容易,比如 Keras,但是一个可视化的 API 来创建和部署深度学习解决方案怎么样?这是他们的承诺。

他们的平台, Deep Learning Studio 可作为云解决方案(【https://deepcognition.ai/cloud/】)桌面解决方案(【http://deepcognition.ai/desktop/】)使用,软件将在您的机器或企业解决方案(私有云或内部解决方案)上运行。桌面版允许你使用自己的计算机与 GPU 和硬件。而且都是免费的!

在接下来的部分中,我将带您了解创建帐户、进入和启动云应用程序、获取数据、创建项目然后创建模型、使用他们的 AutoML 解决方案以及部署模型的过程。

如需书面指南,请访问 Rajat 的博客:

[## 深度学习工作室让深度学习变得简单——完整指南

没有编程的深度学习可能吗?

towardsdatascience.com](/deep-learning-made-easy-with-deep-learning-studio-complete-guide-a5c5ae58a771)

我的是深度学习的简单介绍和一些信息:

[## 深度认知让深度学习变得简单

在过去的一个月里,我有幸见到了 DeepCognition.ai 的创始人

becominghuman.ai](https://becominghuman.ai/deep-learning-made-easy-with-deep-cognition-403fbe445351)

所以让我们开始吧!

创建帐户

在此输入:

[## Register - DeepCognition.ai

Deep Cognition 通过单点登录提供对云和桌面软件的免费访问。创建您的免费帐户…

deepcognition.ai](https://deepcognition.ai/register/)

要关注视频:)。

启动云应用程序

深度学习工作室概述

创建项目

摄取数据

使用预先存在的数据

使用可视化 API 创建模型

使用 AutoML 创建模型

为您的模型获取最佳超参数

训练您的模型

部署您的模型

所以你可以看到,使用 Deep Learning Studio,可以在几分钟内建立深度学习模型,并在几秒钟内部署。这种能力将使许多开发人员能够处理复杂的问题,而不用担心编码、API 等问题。

现在是最后的惊喜!如果你来了,我想你会感兴趣的。如果你想成为一名数据科学家,我的朋友 Matthew Dancho 为你提供了一个非常棒的课程。商业科学大学将带您了解整个商业数据科学流程,利用数据科学解决问题,使用机器学习创建交互式应用,并在组织内分发解决方案。

是的,我有优惠券代码!点击下方使用!

[## 商业数据科学(DS4B 201 / HR 201)

了解如何使用 H2O 自动机器学习和石灰黑盒模型解决现实世界中的员工流动问题…

大学.商业-科学. io](https://university.business-science.io/p/hr201-using-machine-learning-h2o-lime-to-predict-employee-turnover/?coupon_code=SAVE_15)

那里有一个很棒的课程,折扣很大!

如果您有疑问,请随时联系我:)

感谢你阅读这篇文章。希望你在这里发现了一些有趣的东西:)

如果您有任何问题,请在 twitter 上添加我:

[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特

Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…

twitter.com](https://twitter.com/FavioVaz)

和 LinkedIn:

[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn

查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…

linkedin.com](http://linkedin.com/in/faviovazquez/)

那里见:)

对英国数字 1 的直观分析:用数据弄脏自己

原文:https://towardsdatascience.com/a-visual-analysis-of-uk-number-1s-getting-down-and-dirty-with-data-a663cee021c4?source=collection_archive---------16-----------------------

本文重点介绍第一个计时器尝试收集和分析数据的过程。这是我最后一年项目概述的第二部分:对英国数字 1s 的视觉分析。

TL;DR:在数据清理上投入比你想象的更多的时间,即使这不一定是有趣的部分。

数据采集

这个项目使用的数据集由每首排名第一的歌曲的列表组成,表示标题、艺术家、首次排名第一的日期、排名第一持续了多少周、这些周是否连续、Spotify 曲目 ID 和 Spotify 音频功能。

为了创建这个数据集,我用一个 Python 脚本列出了每首排名第一的歌曲,这个脚本抓取了官方排行榜的网页。收集的数据(曲目标题、艺术家、日期)然后被输出为一个 JSON 文件。

我选择使用 Python 和 BeautifulSoup,因为我在以前的个人项目中使用过它们,认为它们会很合适。不幸的是,网页上使用的标记不是很好。表格没有类来区分它们和页面上其他类型的表格,表格标题也没有正确标记。这使得它比预期的更复杂,但仍然比手动将数据复制到 JSON 文件中更容易(或者更有趣)。

然后,我需要获取 JSON 文件中每个音轨的 Spotify 属性。鉴于要检索的曲目数量,我知道需要一个自动化的解决方案。

Spotify API 文档提供了一个从终端运行 curl 请求的示例,但是要对每首曲目执行此操作,需要一个脚本来格式化曲目标题和艺术家姓名,然后运行该命令。没有更多使用 curl 的经验,我没有信心这么做,所以我考虑用 Ruby 写。我最初的尝试是使用在线转换器将 curl 命令转换成 Ruby,但这导致了多个问题和无效响应。经过进一步研究,我发现了RSpotify——Spotify API 的 Ruby 包装器。

使用 RSpotify 需要使用客户端和密钥连接到 Spotify API。要创建这些应用程序,需要在 Spotify 开发者门户上注册。然而,如果不危及帐户的安全,就无法将密钥提交给 GitHub。因此,创建了一个单独的文件来存储密钥(被 git 忽略’),并将密钥导入到脚本中:

key = File.read(‘spotify_keys.json’)
data_hash = JSON.parse(file)
key = JSON.parse(key)RSpotify.authenticate(key[‘1’][‘client’], key[‘1’][‘secret’])

这意味着在线代码中没有键值的记录。

RSpotify 的Track.search功能允许搜索曲目标题和艺术家,并从 Spotify 检索歌曲 ID。假设第一个结果是最相关的,查询被限制为一个结果。曲目 ID 从查询结果中检索,并在 RSpotify GET 请求中用于检索歌曲的音频特性。这些随后被写出到一个 JSON 文件中,其中包含了音轨的详细信息。有一些曲目在查询 id 时没有返回结果,但可以使用 Google 找到。我添加了对这些歌曲的检查,以手动提供 id。然后,我随机选择了几首歌曲,以确保检索到了正确的数据。

然后,我开始分析我用 RStudio 收集的数据,找出任何有趣的模式和关系,以便在文章中强调。

创建播放列表

作为网络体验的一部分,用户可以关注与文章相关的 Spotify 播放列表。我通过编写一个节点脚本,利用 Spotify Web Api 节点库(包括一个可以轻松地将曲目添加到播放列表的功能)创建了这个节点。

由于要添加到播放列表中的歌曲数量,当脚本运行时,许多曲目都失败了。我将它调整为每隔几秒钟休眠一次,以免服务器过载,还输出了所有失败曲目的列表。然后脚本使用这个列表,向播放列表中添加更多的歌曲,并重新生成失败曲目的列表。

一旦创建了播放列表,我就可以看到与数据相对应的歌曲。很多歌曲都是不正确的。通过搜索“标题艺术家”,一些结果是以搜索标题命名的专辑中的曲目,而不是想要的曲目。其他的,如艾德·希兰的 Perfect 返回了一个封面,而不是已经到达第一名的版本(由艾德·希兰和碧昂斯而不是艾德·希兰)。此外,有超过 50 个卡拉 ok 版本的实例,而不是原始录音——这意味着他们的乐器评级将与实际曲目大相径庭。数据集需要重新创建。

重新创建数据集

我使用与播放列表生成器相同的 Spotify 库重写了 Node 中的数据收集脚本。当我进一步研究 Spotify API 时,我意识到你可以指定一个包含标题和艺术家的搜索。这给出了更准确的结果,但是大量的查询没有返回任何结果。其中一些是由于从官方图表网站上收集的数据中艺术家名字的拼写错误(例如,“Bobbie Gentry”被拼写成了“Bobby”)。我在发现这些问题时进行了修复,但很快意识到我应该在项目开始时花更多的时间清理数据。

许多丢失的数据是由于无法通过 Spotify API 获得曲目。例如,Slade 在 Spotify(英国)上只有 3 首歌曲,但他们有 6 首英国排名第一的歌曲。然而,当在谷歌上搜索“曲目、艺术家、spotify”(例如“因为我爱你 Slade Spotify”)时,会列出一个 Spotify 条目,但无法播放(我假设它在英国不可用)。这些在 URL 中有它们的关联 ID,这足以放入 API 并检索音频特性。结果,很多曲目被硬编码进了剧本。不是最好的解决方案,但它完成了工作。我很想现在就回去,看看是否能找到更好的解决方案。有 5 首歌曲根本不在 Spotify 的库中,这些已经被包括在整体数据中,但必须在网页的音频功能部分注明它们已被编辑。一旦数据集被重新创建,我使用 Excel 来检查重复的 id 或丢失的音频特征。

数据分析

现在我有了所有的数据,分析可以开始了。数据科学行业使用的工具种类繁多,从 ExcelSPSS 。我决定用 RStudio 对数据进行基本分析。

在这个项目之前,我没有在编程环境中做过任何数据分析。当我第一次想到这个项目的想法时,我还在 BBC 新闻部实习,所以我向数据新闻团队寻求帮助,以便对如何进行数据分析有一个基本的了解。午餐时,他们在 R 给我开了一个简短的非正式研讨会,向我展示了如何创建散点图,并寻找变量之间的统计意义,以确定是否有潜在的故事。

在进行数据分析时,应该考虑询问数据或测试假设的问题。我最喜欢的一个问题是“最适合跳舞的十年是什么?”。为了回答这个问题,我使用 ggplot2 创建了一个散点图,显示了十年和可跳舞性之间的关系。如下所示:

#uses ggplot2 to draw scatterplot + regression line
plot <- ggplot(all_tracks, aes(x = decade, y = danceability)) + geom_point(aes(colour = energy)) + geom_smooth(method=’lm’,formula=y~x)
plot

散点图显示,最适合跳舞的节点集中在 2010 年代,这意味着这是最适合跳舞的十年。你也可以看到图表显示了可跳舞性和十年之间的正相关关系。然后使用线性模型函数来观察这是否具有统计学意义。

my.model <- lm(decade ~ danceability, data = all_tracks)
summary(my.model)Call:
lm(formula = decade ~ danceability, data = all_tracks)
Residuals:
 Min 1Q Median 3Q Max 
-41.517 -14.480 0.775 15.205 40.518 

Coefficients:
 Estimate Std. Error t value Pr(>|t|) 
(Intercept) 1963.302 1.969 996.96 <2e-16 ***
danceability 34.920 3.191 10.94 <2e-16 ***
 — -
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ‘ 1

Residual standard error: 18.06 on 1317 degrees of freedom
Multiple R-squared: 0.08336, Adjusted R-squared: 0.08266 
F-statistic: 119.8 on 1 and 1317 DF, p-value: < 2.2e-16

可跳舞性和十年之间有很高的统计显著性,由非常接近 0 的 p 值(和旁边的三颗星)表示。这意味着十年对可跳舞性有积极的影响(所以平均来说,数字 1 随着时间的推移变得更适合跳舞)。

最初,我花时间调查关系是否具有统计学意义——这很有趣,但我对它的理解不足以在我的文章中进行讨论。我渴望了解更多关于数据分析的知识,但必须记住这主要是一个 web 开发项目,不要被数据消耗太多,不管我觉得它有多有趣。

随着更多的想法出现,我使用 StackOverflow 来确定如何询问数据。我的问题非常简单,比如如何根据特定变量对行进行分组并找出平均值,或者如何对某一列的结果进行排序。

当我不知道如何向谷歌表达我的问题时,我向 BBC 的一位数据记者朋友寻求帮助。一个例子是当我试图从数据集中识别独特的艺术家时。当艺术家合作时,数据中没有指示——艺术家甚至没有逗号分隔,这使得很难确定单个艺术家贡献了多少首歌曲。最后,我的解决方案是手动创建一个单个艺术家的列表,允许我识别每个艺术家出现的次数,给我他们贡献的曲目总数。最初,我试图用 R 来做这件事,但在多次尝试失败后,我意识到我可以只写一个节点脚本。虽然这要容易得多,但仍然需要几次尝试来完善剧本。最初,“ti”是最常见的 75 位艺术家,因为“TI”会出现在许多不同的词中。因此,我对它进行了改进,只对整个单词使用正则表达式。但是,结果仍然不完全准确,例如:

 ┌─────┬────────────────────┬────────────┬───────┐
         │ id  │ artist             │ weeks_at_1 │ count │
         ├─────┼────────────────────┼────────────┼───────┤
         │ 621 │ NICOLE             │      6     │   3   │
         │ 622 │ NICOLE KIDMAN      │      3     │   1   │
         │ 623 │ NICOLE SCHERZINGER │      1     │   1   │
         └─────┴────────────────────┴────────────┴───────┘

有一个艺人的名字叫妮可(她有一首单曲排名第一),但她的曲目也包括其他两位女性的歌曲。尽管肯定有更好的解决方案,但我最终还是手动修复了这个和其他实例。

随着我继续分析,我发现了更多的数据清理问题——比如贾斯汀比伯的'什么意思?‘拼起来有没有 a’?’。我发现了 OpenRefine,我用它来验证数据,这有助于确定一些类似的问题。
如果我在项目开始时投入足够的时间和精力清理数据,独特艺术家的问题可能会更快得到解决。解决这些问题后,我对自己创建的数据集更有信心了。

总的来说,我真的很喜欢研究这些数据,并且绝对花了比我应该花的更多的时间来玩这些数据。这使得用于设计和测试的时间比我最初计划的要少,这也无助于我的数据在分析阶段结束时需要彻底检查。

An attempt to visualise some of the data gathered using ggplot in R.

回到第一部分

高斯过程回归核的直观比较

原文:https://towardsdatascience.com/a-visual-comparison-of-gaussian-process-regression-kernels-8d47f2c9f63c?source=collection_archive---------2-----------------------

高斯过程回归是多元高斯分布的一种应用,它是一种强大的预测工具,用于高度非线性或不容易使用线性或多元回归建模的数据。高斯过程可以完全用#1 表示。平均值向量(由输入变量 x1、x2…xn 的数据定义)和#2。跨越(x1,x1),(x1,x2)… (xi,xj)的协方差矩阵。

Sklearn 库的 GPR 工具优化了协方差函数或内核函数,以使数据符合高斯过程。在拟合模型时,可以使用几个不同的核函数,每个核函数都具有独特的属性和特征。可以使用单个核函数,也可以使用核函数的数学和或乘积——可能性几乎是无限的!基于数据属性选择合适的核函数是建模过程中的关键决策。

本文不会深入探讨内核选择的细微差别,甚至不会讨论如何评估 GPR 的适用性。相反,我将提供一个简单的高斯过程回归的直观比较,每个回归都使用 Sklearn“内核”库中的四个流行的内核函数来拟合每月的温度数据。

每月的温度数据,作为 Kaggle 的气候变化:地球表面温度数据图书馆的一部分,是免费提供的,已经被删减,只包括了比利时这个国家从 1960 年到 2013 年以摄氏度为单位的月平均温度。我用四种不同的内核函数来拟合这些数据:

径向基函数

指数正弦平方

有理二次曲线

马特恩

下面提供的代码集首先评估每个内核的 fit+predict 运行时:

这是四个内核的预测值,叠加在温度数据上。Exp-Sine-Squared & Matérn 核比 RBF 或有理二次核更容易获得温度数据的周期性:

对于任何希望修改这些代码并将其用于自己的数据的人来说,请注意 Sklearn 的 GPR 工具集并没有优化这些内核函数中的所有参数,例如 Matérn 内核中的参数 nu。即使对于优化的参数,用户也应该考虑用什么样的起始值来初始化每个内核函数是有意义的,并首先将其反映为该代码中先前内核定义的一部分。

正如我前面提到的,高斯过程回归不必受单个核函数的限制。这段代码可以用来简单地计算不同的内核函数组合,或者求和或者相乘(或者两者兼有!).探索愉快!

[## Python_Projects/GPR_kernels.py

github.com](https://github.com/dasotelo/Python_Projects/blob/master/GPR_kernels.py)

神经网络的可视化介绍

原文:https://towardsdatascience.com/a-visual-introduction-to-neural-networks-68586b0b733b?source=collection_archive---------1-----------------------

更新:我已经添加了一个视频解释来直观地介绍神经网络,这里:https://www.youtube.com/watch?v=wgGezGnLTbY

神经网络有多种风格和类型,是目前分类问题的最新技术。卷积神经网络、递归神经网络和最近的生成对抗神经网络也被证明是非常有用的。像逻辑回归、SVM、决策树等方法也用于分类。然而,从这些过渡到神经网络的世界通常充满了抽象。
写这篇博客的目的是简化这些抽象概念。通过使用实验和图表,神经网络的工作是通过这个职位描述。人们可以期待它回答的一些问题是:

1.logistic 回归能做什么?
2。什么是逻辑回归不能做的?
3。我们如何从逻辑回归过渡到神经网络?
4。用神经网络改变决策界限
5。激活和其他超参数的变化如何影响神经网络的收敛

请务必阅读标题,以便更好地理解。

Sample classification problem to solve. We need a decision plane to separate red and blue points

Logistic Regression can solve this problem and give the decision plane as shown. The code for the solution is available here. Process of obtaining in the line is explained in the code

从上图中我们看到,逻辑回归可以根据颜色(红色和蓝色)对这些点进行分类。
我们来换个问题。下图中的问题是一个非线性问题,意味着我们不能在这种情况下使用一条线(一般为超平面)来简单地对点进行分类。我们还可以从下图中看到,逻辑回归无法解决这个问题,因为它试图用一条线将这些分开。

A non linear classification problem

Logistic Regression unable to solve the problem

逻辑回归可以被视为单层神经网络(具有 1 个神经元)并且“sigmoid”作为激活函数。让我们看看一个以‘乙状结肠’为激活和一个神经元的神经网络能否解决这个问题。这是使用 Python 的 Scikit-learn 库的 MLPClassifier 完成的,实现可以在这里找到。
下面三幅图描绘了一个基于单个神经元的神经元试图解决的问题。

mlp = MLPClassifier(hidden_layer_sizes=(1),max_iter=500000,activation=’logistic’,learning_rate_init=0.01)

mlp = MLPClassifier(hidden_layer_sizes=(1),max_iter=500000,activation=’identity’,learning_rate_init=0.01)

mlp = MLPClassifier(hidden_layer_sizes=(1),max_iter=500000,activation=’relu’,learning_rate_init=0.01)

我们观察到,基于单个神经元的神经网络如预期的那样给出了线性决策边界,而不管配置(激活函数、学习速率等)如何,该边界都不能解决非线性问题。让我们看看当我们使用两个神经元时会发生什么。

Non Linear problem with 1 layer and 2 neurons

我们观察到,现在我们得到了两个边界,并且分类的误差减少了(如通过正确类别中的点数来判断的)。可以解释为黄色区域的点为蓝色,其他区域为红色。该解仍然有一些误差,但是该解比单个神经元的情况具有更低的误差。我们还可以看到,每个神经元的两个决策边界在这里结合起来,以做出决策。让我们看看当我们将神经元的数量分别增加到 2、3、4、6、7 和 30 时会发生什么。(绘制决策边界的代码可以在这里找到)

Decision plane with 3 neurons : lower error than previous case.

Decision plane with 6 neurons. Perfect classification with 100 % accuracy. Model now has learnt to combine 6 decisions to form a final decision. Points in yellow region are classified as blue and rest are classified as red

Decision plane with 8 neurons

Decision plane with 30 neurons

我们观察到,随着神经元数量的增加,模型能够更准确地对这些点进行分类。决策边界是复杂的,因为它是各个决策边界的非线性组合(通过激活函数)。在抽象层次上,它可以被视为多个分类器以非线性方式组合来获取非线性决策平面。可以得出结论,当数据是非线性时,一层具有非线性激活函数的多个神经元可以对其进行分类。这个样本问题相当小。在更高维度和更复杂的问题的情况下,更复杂的架构可以发挥作用。
在上图中,使用了非线性激活函数,如“relu”。这是通过以非线性方式组合各种平面来引入“非线性”。让我们看看当我们使用线性激活函数时会发生什么

30 neurons with linear activation function

当使用另一个线性函数“Wx+b”组合时,线性激活函数最终再次给出线性决策平面。因此,神经网络必须具有非线性激活,否则增加层和神经元是没有意义的。
让我们看看一个模型如何收敛于一个 3 类分类问题和一层 6 个神经元。这里的 3 个类是深蓝色、浅蓝色和红色,找到的决策空间分别是黄色、蓝色和紫色。

Decision boundary of a non linear 3-class classification problem

现在让我们通过另一个问题来了解更多关于神经网络的功能。

问题和结果是从 Tensorflow playground 模拟的,tensor flow playground 是一个非常好的可视化神经网络工作方式的工具。

[## 张量流-神经网络游乐场

这是一种构建从数据中学习的计算机程序的技术。它非常松散地基于我们如何思考…

playground.tensorflow.org](http://playground.tensorflow.org)

A more complex non linear problem. We need to classify blue and orange points

1 neuron. As expected, only a linear boundary is available and classification is poor

Using 3 neurons. Now the boundary is curved. Classification is somewhat better but far from perfect. Average loss of 0.473 noted. Classification is judged by establishing that blue points must have a blue backgroundand orange must have a orange background

5 neurons used and test and train losses are 0.396 and 0.259. So we get a better classification . Model was allowed to run epochs till 1 minute

Using 5 neurons, classification improves further

8 neurons. A better and faster classification. The losses obtained after 1 minute are depicted

现在让我们将上面的情况与我们有多个层的情况进行比较。

We observe by using a 3 layer net with 4, 4, 2 neurons in each layer, we get a better and faster classification

上面显示,这个问题可以通过简单地增加一层中的神经元来解决,但是当使用多层时,它解决得更快。多层还使模型能够形成更高级别的特征(输入第一级特征并在其上进行处理)。这种行为的一个很好的例子可以在 CNN 的图像分类中找到,其中起始层找到基本的形状,如直线、曲线等,但后面的层找到这些形状之上的属性,如脸、手等。让我们通过另一个实验了解更多。上图使用“sigmoid”作为激活函数。众所周知,sigmoid 有一个梯度消失的问题。这意味着随着更多的图层出现,计算更新权重所需的梯度逐渐趋于零。“Relu”通常被推荐作为处理这个问题的激活函数。让我们重复上面的数字,但是这次用一个“relu”来验证这个事实

Non linear problem decision boundary using 3 layers (4,4,2 neurons respectively) and ‘relu’ as activation

很明显,使用 relu 几乎完美地解决了这个问题,并且只需要一半的时间。损失接近于零。此外,使用具有 8 个 relu 的 1 个图层不会获得相同的结果,因为多个图层正在利用它提取的更高级别要素属性。

这种实验的代码可以在这里找到。

添加 gif 动画来展示决策边界如何收敛

Animation depicting boundary formation with 3 layers and ‘relu’ activation

这个博客涵盖了神经网络的可视化方法。这是我第一次尝试写博客。请继续关注即将发布的与机器学习相关的其他主题和应用的帖子。如有任何问题/反馈,请随时联系我,shikharcic23@gmail.com 或

[## Shikhar Sharma |职业简介| LinkedIn

查看 Shikhar Sharma 在全球最大的职业社区 LinkedIn 上的个人资料。Shikhar 有 9 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/shikhar-sharma-b98078119/?ppe=1)

使用美国各州直观查看欠拟合和过拟合

原文:https://towardsdatascience.com/a-visual-look-at-under-and-overfitting-using-u-s-states-7fd0d8ade053?source=collection_archive---------6-----------------------

下装和过装是什么样子,如何避免。

The decision surface of a Gradient Boosting Classifier predicting U.S. states from state border data in the form of latitude and longitude coordinates. The opacity of the voronoi cell corresponds to the predicted probability of that cell (prediction confidence).

为什么要避免过度拟合

在训练预测模型时,需要牢记许多注意事项-数据如何生成的基本假设、独立变量之间的相关性、用于训练的数据份额等等。要验证的假设和要考虑的点因问题而异,但是从一个建模练习到下一个建模练习,仍然有一些关键的考虑事项。其中一个考虑因素是偏差-方差权衡。本文通过说明与模型欠拟合和过拟合概念相关的权衡来解释偏差-方差,通过在地理坐标平面上绘制模型的决策表面来直观地显示。

当模型不够复杂,无法捕捉训练数据中存在的关系时,该模型就是有偏差的。相比之下,当模型捕获了训练数据中存在的太多信息时,它会有很高的方差,从而导致根据测试数据做出的预测之间有很大的差异。与以最小化偏差和方差的方式训练的模型相比,具有过高偏差或方差的模型将表现出增加的预测误差。优化这种权衡的一种方法是通过了解模型是欠拟合还是过拟合——在根据测试或维持数据评估模型后,我们将这些术语与模型的性能联系起来。

A visual representation of underfitting, appropriate-fitting, and overfitting. Source: What is underfitting and overfitting in machine learning and how to deal with it.

欠拟合模型表现出很大的偏差。当拟合不足时,模型将无法捕捉训练数据中的重要关系,这些关系本可以用于进行预测。这种在建模过程中未能捕获相关信息的情况会导致较差的预测性能。当过度拟合模型时,模型在根据新的、看不见的数据预测输出时通常表现不佳。通常,由于模型过于复杂,未能验证维持数据的模型性能,或者在定型模型时未使用交叉验证,模型会过度拟合。类似于偏差-方差权衡,在训练预测模型时,最理想的是最小化欠拟合和过拟合,目标是找到两者之间的理想平衡。

本文通过根据美国人口普查局数据训练的模型绘制决策面,直观地说明了欠拟合和过拟合模型的影响,这些数据包含州边界的纬度和经度坐标以及相关的州标签(如加利福尼亚州、伊利诺伊州和田纳西州)。通过绘制适合该数据的模型的决策面,我们可以使用许多人熟悉的映射(48 个相邻的美国)直观地解释模型在欠拟合和过拟合情况下的行为。

数据

数据来自美国人口普查局。在其原始格式中,数据是一个单一的锁眼标记语言(KML)文件,其中包含美国各州边界的经度和纬度坐标。使用简单的 Python 脚本从 KML 文件中解析出必要的纬度、经度和标签(州)数据。

该数据集包含 11,192 个观察值。观察值的数量因州而异——加利福尼亚州有 467 个观察值,而罗德岛州只有 59 个(美国人口普查局不建议将这些数据用于任何严肃的地理空间或建模工作)。然而,数据足够丰富,可以使用探索性工具,并包含足够的信号,可以在给定一对纬度和经度坐标的情况下预测美国的州。然后,通过在地理坐标平面上绘制决策面,我们可以注意到欠拟合和过拟合模型之间的决策面差异。

请注意,我们只有美国每个州的边界坐标,而没有该数据在每个州边界内的坐标。这意味着我们的坐标和州标签在经纬度坐标平面上彼此靠近,因为它们可能共享一条边界(例如田纳西州和乔治亚州或爱达荷州和蒙大拿州)。这是基于树的模型应该能够利用的数据属性(树基于输入数据创建一系列分支)。对于除了边界坐标之外还包含每个州边界内的经纬度坐标的数据集,其他类型的模型会表现得更好。

欠拟合和过拟合以图形方式显示

下面,这里使用了一个随机森林分类器来说明欠拟合、过拟合以及介于两者之间的模型的决策面。在这些图中,构建的 voronoi 单元包括几个经纬度坐标和相关的预测状态,我们只使用最可能的状态进行可视化,或者对该单元进行着色和着色。通过给单元着色和加阴影,我们可以直观地解释模型对单元的预测及其对该预测的信心。

一个随机森林分类器只是一个决策树分类器的集合。基于树的分类器创建一系列作为参数的分支。例如,如果经度大于 36,那么它必须是更北的一个州,或者与阿肯色州在同一经度上。这些分支参数可以一直追踪到它们的终点,从而得到一个预测值。决策树可以学习关于我们坐标平面的规则(例如,田纳西州位于 34 度纬度以上),以用于预测给定坐标集的状态-决策树的架构非常适合于这种数据和问题。假设当提供一对经纬度坐标时,单个基于树的分类器在预测美国州时应该表现得相当好,那么随机森林分类器(决策树分类器的集合)应该提供比单个决策树分类器更好的泛化能力。

This graphic shows how the results from two decision trees are combined in a random forest model to produce a single decision surface with improved results over a single decision tree. Source: Towards Digital Staining using Imaging Mass Spectrometry and Random Forests — Technical Report

当拟合不足时,模型无法捕捉训练数据中的许多重要关系,这些关系包含解释或预测能力。在这个 underfit 示例中,数据按照约定分为训练集和测试集,使用训练数据来拟合模型,同时使用测试集来绘制决策面。更具体地说,我们使用坐标数据测试集的外部边界来生成一个预测点网格——这个网格生成我们的决策面。为了对第一个示例中的模型进行欠拟合,可用的信息量受到随机森林分类器中的两个参数的限制,这两个参数是叶节点中的最小样本数和树的最大深度,分别设置为 50 和 3。

The decision surface of a Random Forest Classifier that is underfit. Note the large, broad expansions of certain states and total lack of other states that should be present in the predictions. This model is failing to capture enough information from the training data to make good predictions.

这里的结果远非令人鼓舞。绘制决策表面向我们表明,该模型在预测适当的美国州方面表现不佳——根据该模型,美国有 15 个州,与 48 个相邻州的真实数量相差甚远。一些国家扩张到其边界以外的地区,而另一些国家则远远小于其应有的规模。这个模型偏向于训练数据。

我们来说明相反的情况。假设我们使用 all 数据进行训练和测试,同时还使用 scikit-learn 的随机森林分类器中的默认参数设置进行训练。

The decision surface of a Random Forest Classifier that is overfit. Note the improved result over underfitting but the presence of rough, jagged borders. This model is failing to generalize to new data and has difficulty minimizing variance in its predictions along borders.

结果是一个决策表面表示过度拟合模型的模型-该模型似乎预测了每个州的大致区域,但未能很好地限制它们并符合它们的实际边界。该模型具有由过度拟合引起的高方差。当模型过度拟合时,它们无法归纳出新的、以前看不到的数据。在这个例子中,通过使用用于训练和测试的所有数据,该模型被故意过度拟合。此外,允许叶节点中的最小样本数小到 1,深度大到 100,会导致模型进一步过度拟合。最终的可视化结果是一个决策表面,它说明了一个过度拟合模型-高方差表现为在更复杂的区域(边界)中的不准确预测,尽管模型已经在训练中看到了数据的每个先前示例。

对于既不欠拟合也不过拟合的随机森林分类器,决策面看起来像什么?使用 scikit-learn 的 GridSearchCV ,可以使用精度、召回率和 F-score 等验证指标,通过交叉验证执行网格搜索来确定要使用的最佳参数。GridSearchCV 可以帮助识别给定模型和规范、数据和度量的理想参数值。使用召回作为验证度量,适合该数据的随机森林分类器的最佳总体值具有分别设置为 30 和 200 的参数 min_samples_leafmax_depth

The decision surface of a Random Forest Classifier that is neither under nor overfit. This model does a better job at generalizing to new data than the overfit model (evident through improved border predictions), but captures more information than the underfit model.

上面的决策面是一个模型的结果,这个模型既不欠拟合也不过拟合(尽管还有相当大的改进空间)。该模型比欠拟合和过拟合模型更好地推广到新数据和预测状态边界,并在偏差和方差之间进行了理想的权衡。与欠拟合或过拟合模型相比,州边界更能代表其真实边界。

使用相同的参数,另一个基于树的模型的决策表面,一个梯度增强的树分类器,适合该数据,似乎显示出比随机森林分类器进一步的改进。

The decision surface of a Gradient Boosting Classifier using the same parameter values as our “best” Random Forest Classifier. Note on the Gradient Boosting Classifier’s improved ability to predict U.S. states using latitude and longitude coordinates.

梯度增强分类器比随机森林分类器产生更好的结果。通过对梯度增强分类器执行另一个具有交叉验证的网格搜索,或者检查其他方法(如解决类别不平衡或将经纬度坐标之外的其他信息合并到模型中),可以进一步改进此结果。

结论

理解偏差-方差权衡及其与欠拟合和过拟合的关系是任何监督建模问题的核心组成部分,这里显示的图只是探索这一概念的一种方式。

This animation shows how you can explore the decision surfaces shown in this article using the interactive visualization (linked below). Hover over voronoi cells to view classifications for U.S. state and the confidence in that classification (prediction).

您可以在这个交互式可视化中进一步探索模型的决策面。与这个项目相关的代码可以在这个 GitHub 库中找到,并且可以毫不费力地翻译成新的建模问题。

感谢阅读!

供稿人: 瓦伦蒂诺康斯坦蒂努 克里斯拉波特

卷积神经网络演练—超参数调整

原文:https://towardsdatascience.com/a-walkthrough-of-convolutional-neural-network-7f474f91d7bd?source=collection_archive---------3-----------------------

在多样的深度学习架构中,卷积神经网络(简称 convnets)以其在计算机视觉上前所未有的性能脱颖而出。这是一种受动物视觉皮层启发的人工神经网络,已成功应用于视觉识别任务。

在本文中,我将提供一个关于 convnet 的演练,如何调优超参数以及如何可视化隐藏的卷积层。

动机

首先,我们希望我们的计算机做什么?当我们看到一只猫在后院奔跑或睡在沙发上时,我们的大脑会下意识地认出它是一只猫。我们希望我们的计算机为我们做类似的事情,即把一幅图像作为输入,找出它的独特特征,并把图像标记为输出。这基本上是 convnet 能为我们做的。

什么是 convnet?

最基本的是,convnet 是一种特殊的神经网络,至少包含一个卷积层。典型的 convnet 结构获取图像,使其通过一系列卷积层、非线性激活层、汇集(下采样)和全连接层,以输出分类标签。

convnet 与常规神经网络的不同之处在于使用了卷积层。在常规的神经网络中,我们使用整个图像来训练网络。它对于简单的居中图像(例如居中的手写数字图像)工作良好,但是不能识别具有更复杂变化的图像(例如后院奔跑的猫)。有更多的隐藏层来学习抽象特征会有所帮助,但这相当不切实际,因为我们需要太多的神经元来训练和存储在内存中。

另一方面,convnet 通过首先寻找边缘、直线和曲线等低级特征来识别对象,然后通过一系列卷积层来建立更抽象的特征(例如什么使猫成为猫)。在卷积层的学习过程中,网络通过共享过滤器(或特征检测器)在图像的小区域上学习对象的各个部分,并将它们相加以构建抽象特征。共享滤波器的使用大大减少了实际的参数学习。convnet 还可以更好地概括复杂的图像识别,因为学习过的滤波器可以通过卷积层重新用于检测抽象特征。

超参数调谐

调整深度神经网络的超参数是困难的,因为训练深度神经网络很慢,并且有许多参数要配置。在这一部分中,我们简要地考察了 convnet 的超参数。

学习率

学习率控制优化算法中权重的更新量。我们可以使用固定学习率、逐渐递减学习率、基于动量的方法或自适应学习率,这取决于我们选择的优化器,如 SGD、Adam、Adagrad、AdaDelta 或 RMSProp。

时代数

时期数是整个训练集通过神经网络的次数。我们应该增加历元的数量,直到我们看到测试误差和训练误差之间的微小差距。

批量

在 convnet 的学习过程中,小批量通常是更可取的。16 到 128 的范围是测试的好选择。我们应该注意到,convnet 对批量大小很敏感。

激活功能

激活函数将非线性引入模型。通常情况下,整流器与 convnet 配合使用效果很好。其他的选择是 sigmoid,tanh 和其他激活函数,取决于任务。

隐藏层和单元的数量

通常最好增加更多的层,直到测试误差不再改善。代价是训练网络的计算代价很高。拥有少量的单元可能会导致拟合不足,而拥有更多的单元通过适当的正则化通常是无害的。

重量初始化

我们应该用小随机数初始化权重,以防止死神经元,但也不能太小,以避免零梯度。均匀分布通常效果很好。

转正辍学

为了避免深度神经网络中的过拟合,丢弃是一种优选的正则化技术。该方法简单地根据期望的概率删除神经网络中的单元。默认值 0.5 是一个很好的测试选择。

网格搜索或随机搜索

手动调整 hyperparameter 既痛苦又不切实际。有两种通用的方法来对搜索候选项进行采样。网格搜索彻底搜索给定值的所有参数组合。随机搜索从具有指定分布的参数空间中抽取给定数量的候选项。

为了更有效地实现网格搜索,最好在初始阶段从超参数值的粗略范围开始。对于较小数量的历元或较小的训练集,执行粗网格搜索也是有帮助的。下一阶段将对更多的时期或整个训练集执行窄搜索。

虽然网格搜索在许多机器学习算法中是有用的,但它在调整深度神经网络的超参数时效率不高。随着参数数量的增加,计算呈指数增长。已经发现,在深度神经网络的超参数调整中,随机搜索比网格搜索更有效(参见关于“超参数优化的随机搜索”的论文)。根据以前的经验,结合一些对超参数的手动调整也是有帮助的。

形象化

如果我们可以可视化卷积层,我们就可以更好地理解 convnet 如何学习功能。两种直接的方法是可视化激活和权重。随着训练的进行,激活通常看起来更加稀疏和局部化。如果对于许多不同的输入,激活具有暗像素,则由于高学习率,它可能指示失效的过滤器(零激活图)。

训练有素的网络通常有漂亮平滑的滤波器,没有任何噪声模式。在权重中观察到的噪声模式可能表明网络训练的时间不够长,或者正则化强度低,这可能导致过度拟合。

参考资料:

  • 伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔的深度学习
  • yo shua beng io 深度架构基于梯度训练的实用建议
  • 随机搜索超参数优化
  • 卷积神经网络:架构、卷积/池层
  • 理解和可视化卷积神经网络
  • 通过深度可视化理解神经网络
  • 理解卷积
  • 如何用 Keras 在 Python 中网格搜索深度学习模型的超参数

兄弟姐妹间的战争……第二部

原文:https://towardsdatascience.com/a-war-amongst-siblings-part-ii-9bf51636ceaf?source=collection_archive---------20-----------------------

卡牌游戏大战有可能无限期进行下去吗?

介绍

几个月前,我发表了一篇关于纸牌游戏战争的报道。如果你还没有读过,或者在这段漫长的插曲后需要复习,在继续之前去看看。这是一个快速阅读。

在不列颠哥伦比亚省度假时,我和姐姐凯莉一起玩了一个 T2 战争游戏。我们在停机时间玩了好几天都没有完成。凯利觉得这个游戏会永远继续下去,但我不相信这是可能的。我用 Python 写了一个模拟器来测试它。第一部分发现这确实是可能的——我模拟的游戏中有 1/3 是永无止境的。凯利获得了(并利用了)吹牛的权利。

这篇文章回顾了第一部分提出的关键问题:是什么让游戏永远继续下去?答案实际上比我预期的更有启发性。吹牛的权利甚至可能仍然是待价而沽。

达到稳定状态

我和妹妹玩的游戏,疯狂的来回摇摆。我们中的一个人会只拿到几张牌,但之后势头会逆转,在我们意识到之前,另一个人会成为筹码短缺的人。我认为永无止境的游戏会永远经历这样的循环。

我错了。如下图所示,永无止境的游戏最终会达到一种“稳定状态”。在稳定状态下,两个玩家轮流赢得一张牌的战斗,他们之间的牌的平衡基本上保持不变。

Game tracks showing the number of cards that Player A has as each game progresses. Each color represents a unique game. There are 10 games in this diagram, however several games settle into equivalent stable states and the tracks therefore obscure each other on the right side of the diagram.

我姐姐和我从来没有达到那种程度。也许我们过早的放弃了?尽管如此,我还是想更深入地探究稳定状态的动力学,以阐明为什么一个游戏会永无止境。

大约 85%的未完成游戏达到了一个稳定的状态,即使每个玩家只有 26 张牌。我选择了其中的一个游戏来感受它是如何运作的。我们感兴趣的游戏在开始时会来回跳动,但到了第 400 局,每个玩家都有 26 张牌,已经稳定下来。

当你从 400 号弯道前进时,有趣的事情发生了。事情很快开始感觉…奇怪的熟悉。我们以前来过这里吗?玩家在 400 回合的牌和他们在 452 回合的牌完全一样。我们又到了 504、556 等处。现在我们可以理解一个游戏是如何永无止境的——它只是陷入了一个循环!

A stable state game at turns 400, 426, and 452. Player A’s cards are on the left and Player B’s are on the right; the cards towards the bottom of the image are at the top of the players’ hands. Turn 400 and 452 are exactly the same; turn 426 is essentially symmetrical with the cards on the losing diagonals swapped.

为什么会卡在一个循环里?当我们并排看玩家的手时,我们可以观察到一个明显的模式。首先,请注意,当我们向下移动牌组时,大牌在玩家 A 和玩家 B 之间完美地交替出现。这是有道理的,因为我们知道玩家 A 和玩家 B 会轮流获胜。如果我们将手牌分成 4 张牌的区块(两张来自玩家 A,两张来自玩家 B),我们还可以看到,在每个区块中,输牌(在一条对角线上)比赢牌(在另一条对角线上)都低。

一个简化的 4 张牌游戏说明了这种结构的重要性。

Player A’s cards are on top and Player B’s are on bottom; decks are ordered from left (top of deck) to right (bottom of deck).

玩家 A 以一个 10 和一个 2 开始。玩家 B 以 4 和 6 开始。这个例子复制了我们在稳定状态游戏的每个方块中看到的结构,因为获胜的对角线(10 和 6)均匀地大于失败的对角线(4 和 2)。在前两局中,玩家 A 赢了玩家 B 的四张牌,但输了他的两张。又玩了两局后,玩家 A 赢回了他原来的两张牌,但失去了他从玩家 b 那里得到的四张牌。我们在这个四张牌的区块中建立了一个循环,玩家只需来回交换他们较少的牌。

让我们考虑第二个与第一个相同的例子,除了玩家 B 的第一张牌是 7。请注意,这个并不符合我们在稳定状态游戏中观察到的结构。原输对角线中的一张牌比赢对角线中的一张牌大。

在前两轮,玩家 A 赢了 B 的 7,输了他的 2。然而,游戏现在设置为结束,玩家 A 的 10 和 7 击败玩家 B 的 2 和 6。稳定状态结构的一个明显的小偏差会很快导致非常不同的结果。一个四张牌的方块,其中一条对角线上的两张牌都比另一条对角线上的两张牌大,将无限循环下去;任何其他安排都会导致解决。

这个小例子很容易推广到一个完整的游戏。26–26 稳定状态(85%的永无止境游戏)由 13 个相互堆叠的四张牌组成。每四张牌的方块在游戏每 52 回合循环时保持不变。15%未完成的游戏达到不均衡的稳定状态,一个玩家比另一个玩家有更多的牌。这些游戏的结构有点复杂,因为四张牌的方块不能保持完整,但在整个游戏中保持了一个等效的结构。在这两种情况下,永无止境的游戏会达到一种特定的卡片排列,从而导致动态平衡和循环游戏。

打破稳定状态

尽管有个名字,稳定状态实际上是相当脆弱的。

为了说明原因,我需要指出我的战争模拟器的一个简化假设和上面的小例子。每个游戏的游戏性都是完全确定的。换句话说,每场游戏在发牌后只有一种可能的结果,因为每一步都是 100%程序化的。在每一轮中,玩家 A 和玩家 B 打出他们手中最上面的牌,赢家拿起这些牌(假设没有平局)。玩家 A 的牌总是在玩家 B 的牌前面回到赢家手里。

在每个玩家使用哪张牌(每个玩家牌组中的顶牌)以及如何确定赢家(较高的牌)的规则中没有回旋的余地。这些步骤应该完全程序化。另一方面,规则并没有规定当纸牌回到赢家手中时的“正确”顺序。在我的模拟中,玩家 A 的牌总是放在赢家手中玩家 B 的牌之前。在现实生活中,你会期望变化。在某些回合中,玩家 A 的卡会先被拿走,而在其他回合中,玩家 B 的卡会先被拿走。

随机性被证明是稳定状态的克星。让我们重温一下四张卡的例子,看看为什么。如果我们改变游戏玩法,使得玩家 B 的牌在第一回合回到玩家 A 的面前,稳定状态模式被打破,游戏立即结束。

对完整游戏的影响同样引人注目。随机排列返回牌的顺序,赢家的手牌将未完成游戏的比例从 1/3 减少到 0。游戏也结束得更快。75%的带有随机元素的游戏在 500 回合内结束,而没有随机元素的游戏只有 14%。随机性使得稳定状态难以维持,永无止境的游戏实际上不存在。

这对于我的论点来说是个好消息!我们不再有证据表明战争游戏(如果它被逼真地模拟)可以永远继续下去。

我很乐意收工并宣布胜利。但是,违背我自己的最大利益,我要努力成为一个好科学家(也是一个好哥哥)。就像他们说的,没有证据并不是不存在的证据。如果我们想证明一个游戏不能无限期继续下去,我们需要更进一步。

无限中的一个

让我们戴上科学家的帽子,从一个思维实验开始。

以我们的四张卡为例。第一回合只有一个可能的赢家,玩家 A,因为十比二大。然而,就牌如何回到玩家 A 手中而言,有两种可能的结果。假设有 50%的几率玩家 A 的牌首先回到玩家 A 的手里,有 50%的几率玩家 B 的牌回到玩家 A 的手里。下一轮是同样的故事——只有一个可能的赢家,但有两种可能的结果。这意味着前两轮有 2 x 2 = 4 种可能的结果,这取决于每轮后先拿起哪张牌。

四个场景中的两个,第一个和最后一个,保留了我们熟悉的稳定状态结构,因为每个回合后都先拿起同一个玩家的牌。然而,其他人打破了稳定状态,导致游戏在四个回合结束。换句话说,游戏有 50%的概率在四个回合内结束。

让我们继续前两个阶段保持稳定状态结构的 50%的场景。再玩两局后,有 50%的几率那些场景的场景会打破稳定状态。所以,有 75%的概率(前 50%加上幸存的 50%的 50%)游戏会在六个回合内结束。每增加两轮后,可能性增加剩余概率的 50%,跳至 88.5%、94.25%、97.125%等。完成的可能性很快接近 100%。

为了证明这个游戏不能无限进行下去,我们需要完成的可能性实际上达到 100%。它会到达那里吗?虽然我们很快接近 100%的确定性,但总会有极小的机会,随机抽取的概率会以保持稳定状态结构的方式继续展开。我们不得不得出结论,尽管极不可能,但我们的小例子可能会无限期地继续下去。

这同样适用于完整的游戏。考虑到玩家 A 的牌在每一回合都有可能(尽管极其不太可能)首先“随机”回到赢家手中。这将使随机游戏的行为完全像原来的模拟。我们知道原始博弈可以无限期地进行下去,所以随机博弈也应该如此。可能还有其他方法来实现一个无限的游戏,尽管一个例子就足够了,我们不能说一个永无止境的游戏是不可能的。

我们可以说不太可能。无限中的一个不太可能。谁有吹牛的权利?我让你来判断。

最后的想法

我实际上写下了当我和 Kelly 决定放弃我们的游戏时的牌。根据随机弃牌模拟,我们的游戏在接下来的 300 回合中有 50%的可能性会结束,在接下来的 600 回合中有 75%的可能性会结束,在我们停止后的 900 回合中有 90%的可能性会结束。我们在比赛中还有很多时间。我认为编写一个 Python 模拟器仅仅是快了一点点。

感谢阅读!请在评论区分享你的想法、问题或反馈。

另外,我的战争模拟器代码和我用来分析的 Jupyter 笔记本见 Github 。模拟器是作为一个“战争”类编写的——我希望其他 Python 程序员能找到机会使用它。

创业数据科学家的一周生活

原文:https://towardsdatascience.com/a-week-in-the-life-of-a-startup-data-scientist-90aa00edaa48?source=collection_archive---------12-----------------------

没有细节遗漏

数据科学家是一个性感的,有点模糊的职位名称。

就像软件工程一样,没有一个放之四海而皆准的描述可以概括数据科学家所做的巨大差异。然而,初创公司往往表现出共同的价值观,特别是:

  1. 实验
  2. 学习
  3. 协作

这些共同的价值观体现在我们的工作中,并为我们的日程安排提供了指导节奏。

我目前在 SaaS 一家中型创业公司工作,是一个 3-4 人数据科学团队的一员。总共 200 人,大约 40 人每天写代码。

我将提供我的每日每周每月时间表的描述,以(希望)阐明科学家的生活可能需要哪些数据,以及我们的时间表如何与这些价值相联系。

这篇文章是为那些正在考虑从事类似工作的人准备的。我的目标是让你了解作为一名数据科学家,在一家类似规模的公司里应该做些什么,从而更好地判断它是否适合你。

每天地;天天地

以下是我一天中分配给各种活动的时间:

  • 更新(30 分钟):了解电子邮件、空闲时间等
  • 同步(30 分钟):每日团队会议——当前项目的更新,当天的计划。任何编写代码的人通常都会按照 scrum 方法论开一个每日例会,不管是否启动。
  • 工作(4-5 小时):集中精力,花时间收集数据、实验和/或培训模型。这是所有“数据科学”完成的地方。
  • 学习(1 小时):在线课程,维基百科 binge,youtube。学习是创业文化的一个至关重要的方面——投入时间跟上时代并扩展你的技能组合是很重要的。
  • 记录(15 分钟):找到一个好的停止点并记录进度。准确记录您处理过的数据并不重要,直到它变得重要。

如你所见,我每天至少花一点时间在这三个原则上。学习可以是任何事情——在一个在线课程中前进,一个你很好奇的一次性视频,或者向一个同行询问他们的专业领域。扩展数据科学技能集有很多方向,从掌握深度学习框架到数据工程方面等等。

然而,每周集中时间做一次专注的活动是有好处的。这让我们想到了每周一次的事情:

一周的

每周的活动集中在学习和合作上。

  • 头脑风暴会议(1 小时) —听取其他观点(销售、产品管理、客户成功)并一起头脑风暴解决问题。
  • 课堂(1 小时)——我们团队每周安排一小时一起学习新东西。比如 tensorflow 上的一门课。
  • 学习时间(3 小时)——对,专门用来学习和学习的时间。超级有用的取得一致的进步,在网上课堂和探索外国回购。
  • 知识分享(30 分钟)——专门分享我们正在研究的不同技术的技巧和诀窍的会议。

致力于混合通常不互动的团队的时间有助于我们洞察存在什么样的问题以及我们如何提供帮助——最终作为项目想法的发射台。

然而,有些活动是临时的,引导我们参加每月一次的聚会。

最后但并非最不重要的,偶尔的东西:

每月

以下是一些你至少每一两个月可以期待一次的事情:

  • Moonshots (1 小时)——你有过哪些疯狂、牛逼或大胆的数据科学项目想法?我们能把它们塑造成有用的东西吗?让我们弄清楚。
  • 项目回顾(1 小时)——你刚刚完成了一个项目?大家说说吧。哪些进展顺利,哪些可以改进,等等…
  • 团队回顾(30 分钟)——与项目回顾相同,但适用于我们的团队。
  • 圆桌会议(1 小时)——大家都在做什么?为什么激动人心?
  • 全员开发(1 小时)——公司深度更新,经理级项目更新。
  • 午餐和学习(30 分钟)——人们工作很酷。让每个人都了解新项目、系统架构和新技术的内部运作是有趣的(也是有用的),同时还能享受美食。

更罕见但重要的是,这些会议用于同步更大的开发组织,并确保我们一起更有效地前进。

总结了一下

科学家研究的数据因公司而异。然而,实验、跨团队沟通和学习文化的关键原则是任何创业公司不可或缺的。

我们的时间表反映了这些原则。的确,没有两件事是完全相同的——无论是我们正在做的事情、我们正在与谁合作,还是我们将如何实现这一目标。然而,我们相互交流、共同提高技能和尝试新想法的方式不会改变。

我希望这能对我们的工作有所启发,以及你能从类似的角色中得到什么。感谢阅读!

深度学习的“怪异”介绍

原文:https://towardsdatascience.com/a-weird-introduction-to-deep-learning-7828803693b0?source=collection_archive---------3-----------------------

有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。西班牙语版此处。

有关于深度学习的惊人介绍、课程和博文。我将在参考资料部分列出其中一些,但这是一种不同的介绍。

但是为什么奇怪呢?也许是因为它不会遵循深度学习帖子的“正常”结构,在那里,你从数学开始,然后进入论文,实施,然后到应用程序。

这将更接近我之前关于“我的深度学习之旅”的帖子,我认为讲一个故事比只是到处扔信息和公式更有帮助。让我们开始吧。

注意:这篇文章还有一个配套的网络研讨会。找到这里:

[## 网络研讨会- DeepCognition.ai

关于法维奥:物理学家和计算机工程师。拥有 UNAM 大学的物理学硕士学位。他在大…

deepcognition.ai](http://deepcognition.ai/resources/webinars/#intro-deep-learning)

为什么我要做这个介绍?

有时候,把你的想法写下来是很重要的。我倾向于说很多话,并出席一些演示和会议,这是我用一点点知识为大家做贡献的方式。

深度学习(DL)对于数据科学、人工智能、技术和我们现在的生活来说是一个如此重要的领域,它值得所有人的关注。请不要说深度学习只是在一张神经网上加了一层,仅此而已,神奇!没有。我希望读完这篇文章后,你对 DL 有一个不同的看法。

深度学习时间线

我只是基于几篇论文和其他时间线创建了这个时间线,目的是让每个人都看到深度学习不仅仅是神经网络。理论上确实有了进步,软件和硬件也有了改进,这是我们走到今天所必需的。如果你想要的话,就给我发短信,我会发给你的。(文末找到我的联系人)。

深度学习有什么怪异之处?

深度学习已经存在很长时间了。那么,为什么它在过去的 5-7 年里变得如此重要?

正如我之前所说,直到 2000 年代末,我们仍然缺乏一种可靠的方法来训练非常深度的神经网络。如今,随着几项简单但重要的理论和算法改进的发展,硬件(主要是 GPU,现在是 TPU)的进步,以及数据的指数级生成和积累,DL 自然而然地适应了这一缺失点,以改变我们进行机器学习的方式。

深度学习也是一个活跃的研究领域,没有什么是固定或封闭的,我们仍在寻找最佳模型、网络拓扑、优化其超参数的最佳方法等等。就像其他活跃的科学领域一样,很难跟上研究的步伐,但这并不是不可能的。

关于拓扑和机器学习的补充说明(Hofer 等人的具有拓扑签名的深度学习):

来自代数拓扑的方法最近才出现在机器学习社区中,最突出的是在术语拓扑数据分析(TDA)下。由于 TDA 使我们能够从数据中推断出相关的拓扑和几何信息,因此它可以为各种机器学习问题提供一种新颖且潜在有益的视角。

对我们来说幸运的是,有很多人通过像吴恩达 one 这样的课程、博客帖子等等来帮助理解和消化所有这些信息。

这对我来说很奇怪,或者说不常见,因为通常你必须等待一段时间(有时是几年)才能消化论文或研究期刊中的复杂信息。当然,大多数科学领域现在也很快从一篇论文变成一篇博客文章,告诉你你需要知道什么,但在我看来,DL 有不同的感觉。

深度学习和表征学习的突破

我们正在做一些非常令人兴奋的事情,该领域的大多数人都在说,深度学习论文中的最后一个想法(特别是神经网络或算法的新拓扑和配置,以改善它们的使用)是几十年来机器学习中最好的想法(记住,DL 是 ML 的一部分)。

到目前为止,我已经在这篇文章中多次使用了学习这个词。但是什么是学习呢?

在机器学习的上下文中,“学习”一词描述了一个自动搜索过程,以更好地表示您正在分析和研究的数据(请记住这一点,不是让计算机学习)。

对于这个领域来说,这是一个非常重要的词。别忘了这件事。什么是表示?这是一种看数据的方式

让我给你举个例子,假设我告诉你,我要你画一条线,把这个图的蓝色圆圈和绿色三角形分开:

Ian Goodfellow et al. (Deep Learning, 2016)

这个例子来自 Ian Goodfellow 等人(2016)的深度学习的书。

所以,如果你想用一句台词,作者是这么说的:

“…我们使用笛卡尔坐标表示一些数据,这是不可能的任务。”

如果我们记得线的概念,这是不可能的:

线是一个没有厚度的一维直线,向两个方向无限延伸。来自沃尔夫拉姆数学世界。

那么案子输了吗?实际上不是。如果我们找到一种方法,用不同的方式表示这个数据,在某种程度上我们可以画一条直线来区分数据的类型。这是几百年前数学教给我们的东西。在这种情况下,我们需要的是一个坐标转换,所以我们可以用一种我们可以画这条线的方式来绘制或表示这些数据。如果我们看一下极坐标变换,我们有解:

Ian Goodfellow et al. (Deep Learning, 2016)

就这样,现在我们可以画一条线:

因此,在这个简单的例子中,我们找到并选择了转换,以获得更好的手工表示。但是,如果我们创建一个系统,一个可以搜索不同表示(在这种情况下是坐标变化)的程序,然后找到一种方法来计算用这种新方法正确分类的类别的百分比,此时我们正在进行机器学习。

记住这一点非常重要,深度学习是使用不同类型的神经网络进行表示学习,并优化网络的超参数,以获得(学习)我们数据的最佳表示。

如果没有让我们达到深度学习当前状态的惊人突破,这是不可能的。这里我列举其中一些:

  1. 思路:反向传播。

通过反向传播错误学习表征 大卫·e·鲁梅尔哈特,杰弗里·e·辛顿&罗纳德·j·威廉姆斯。

Yann Lecun 的一个关于反向传播的理论框架。

2.思路:更好的初始化球网的参数。需要记住的是:初始化策略应该根据使用的激活函数来选择(下一步)。

[## 深度网络的权重初始化-深度学习的实践方面

这个课程会教你让深度学习很好工作的“魔法”。而不是深度学习过程…

www.coursera.org](https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/weight-initialization-for-deep-networks) [## 如何训练你的深度神经网络

为了有效地训练深度神经系统,深度学习中有一些特定的实践是非常值得推荐的。

rishy.github.io](http://rishy.github.io/ml/2017/01/05/how-to-train-your-dnn/) [## 用于视觉识别的 CS231n 卷积神经网络

斯坦福 CS231n 课程材料和笔记:视觉识别的卷积神经网络。

cs231n.github.io](http://cs231n.github.io/neural-networks-2/#init)

3.思路:更好的激活功能。这意味着,更快地逼近函数的更好方法导致更快的训练过程。

[## 理解神经网络中的激活函数

最近,我的一个同事问了我几个类似“为什么我们有这么多激活功能?”,“为什么是…

medium.com](https://medium.com/the-theory-of-everything/understanding-activation-functions-in-neural-networks-9491262884e0) [## 激活函数:神经网络

Sigmoid,tanh,Softmax,ReLU,Leaky ReLU 解释!!!

towardsdatascience.com](/activation-functions-neural-networks-1cbd9f8d91d6)

4.想法:退学。防止过度拟合的更好方法等等。

[## 为了学得更好而学得更少——在(深度)机器学习中辍学

在这篇文章中,我将主要讨论神经网络中的辍学概念,特别是深度网络,然后是…

medium.com](https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5)

辍学:防止神经网络过度拟合的简单方法,斯里瓦斯塔瓦、辛顿等人的一篇伟大论文。

5.思路:卷积神经网络(CNN)。

le Cun 等人将基于梯度的学习应用于文档识别

用深度卷积神经网络进行 ImageNet 分类Krizhevsky 等人。

6.思路:剩余网(ResNets)。

[## [1512.03385v1]图像识别的深度残差学习

摘要:越深的神经网络越难训练。我们提出了一个剩余学习框架,以减轻…

arxiv.org](https://arxiv.org/abs/1512.03385v1) [## [1608.02908]剩余网络的剩余网络:多级剩余网络

摘要:具有数百甚至数千层的残差网络家族支配着主要的图像识别任务…

arxiv.org](https://arxiv.org/abs/1608.02908)

7.思路:基于区域的 CNN。用于物体检测等。

[## [1311.2524v5]用于精确对象检测和语义分割的丰富特征层次

摘要:在 PASCAL VOC 数据集上测量的目标检测性能,在过去几年中已经稳定下来…

arxiv.org](https://arxiv.org/abs/1311.2524v5) [## [1703.06870]屏蔽 R-CNN

摘要:我们提出了一个概念上简单、灵活、通用的对象实例分割框架。我们的…

arxiv.org](https://arxiv.org/abs/1703.06870) [## Facebook 研究/检测

Detectron - FAIR 的对象检测研究平台,实现了 Mask R-CNN 和…

github.com](https://github.com/facebookresearch/Detectron)

8.思路:递归神经网络(RNNs)和 LSTMs。

[## 循环网络和 LSTMs 初学者指南

这篇文章的目的是给学习神经网络的学生一个关于神经网络功能的直觉

deeplearning4j.org](https://deeplearning4j.org/lstm.html) [## 了解 LSTM 网络——colah 的博客

这些循环使得循环神经网络看起来有点神秘。然而,如果你想得更多一点,事实证明…

colah.github.io](http://colah.github.io/posts/2015-08-Understanding-LSTMs/) [## 重复层- Keras 文档

input_length:输入序列的长度,为常数时指定。如果您是…则此参数是必需的

keras.io](https://keras.io/layers/recurrent/)

BTW:廖和 Poggio (2016)证明了 ResNets == RNNs,arXiv:1604.03640v1。

9.想法:生成对抗网络(GANs)。

[## [1406.2661v1]生成性对抗网络

摘要:我们提出了一个新的框架,通过一个对抗的过程来估计生成模型,其中我们…

arxiv.org](https://arxiv.org/abs/1406.2661v1) [## 纳舒里/甘斯-真棒-应用

gans-awesome-applications -令人敬畏的 GAN 应用和演示的精选列表

github.com](https://github.com/nashory/gans-awesome-applications)

10。想法:胶囊网络。

[## 什么是 CapsNet 或胶囊网络?

什么是胶囊网?什么是胶囊?CapsNet 比卷积神经网络(CNN)好吗?这篇文章是…

hackernoon.com](https://hackernoon.com/what-is-a-capsnet-or-capsule-network-2bfbe48769cc) [## 理解辛顿的胶囊网络。第一部分:直觉。

理解 Hinton 的胶囊网络系列的一部分:

medium.com](https://medium.com/ai³-theory-practice-business/understanding-hintons-capsule-networks-part-i-intuition-b4b559d1159b) [## 人工智能/胶囊网络

capsule-networks——NIPS 2017 论文《胶囊间动态路由》的 PyTorch 实现。

github.com](https://github.com/gram-ai/capsule-networks)

还有许多其他的,但我认为这些是真正重要的理论和算法突破,正在改变世界,并为 DL 革命提供了动力。

深度学习如何入门?

开始并不容易,但我会尽力指导你完成这个过程。查看这些资源,但是记住,这不仅仅是看视频和读论文,这是关于理解,编程,编码,失败,然后让它发生。

-1.学习 Python 和 R;)

  1. 吴恩达Coursera (你知道,他不需要介绍):

[## 深度学习| Coursera

来自 deeplearning.ai 的深度学习如果你想打入 ai,这个专精会帮你做到。深…

www.coursera.org](https://www.coursera.org/specializations/deep-learning)

Siraj Raval :他太棒了。他有能力用一种有趣而简单的方式来解释难以理解的概念。在他的 YouTube 频道上关注他。特别是这个播放列表:

—智能的数学:

—深度学习简介:

3.Fran ois Chollet的书:用 Python 进行深度学习(和 R):

[## 使用 Python 进行深度学习

我见过的对深度学习最清晰的解释...阅读是一种乐趣。

www.manning.com](https://www.manning.com/books/deep-learning-with-python) [## 用 R 进行深度学习

我见过的对深度学习最清晰的解释...阅读是一种乐趣。

www.manning.com](https://www.manning.com/books/deep-learning-with-r)

  1. IBM 认知类 :

[## 深度学习基础

关于这门课,上一堂速成课,学习内容是什么,以及如何学习更多。深度学习…

cognitiveclass.ai](https://cognitiveclass.ai/courses/introduction-deep-learning/) [## 使用 TensorFlow 进行深度学习

这个深度学习用 TensorFlow 的课程重点是 TensorFlow。如果你是深度学习的新手…

cognitiveclass.ai](https://cognitiveclass.ai/courses/deep-learning-tensorflow/)

  1. DataCamp :

[## Python 中的深度学习

深度学习是机器人等不同领域中最令人兴奋的能力背后的机器学习技术…

www.datacamp.com](https://www.datacamp.com/courses/deep-learning-in-python) [## keras:R 中的深度学习

正如你现在所知道的,机器学习是计算机科学(CS)中的一个子领域。那么,深度学习是…

www.datacamp.com](https://www.datacamp.com/community/tutorials/keras-r-deep-learning)

分布式深度学习

深度学习是数据科学家应该学习的最重要的工具和理论之一。我们非常幸运地看到了不起的人创造了专门用于 DL 任务的研究、软件、工具和硬件。

DL 的计算成本很高,尽管理论、软件和硬件都有所进步,但我们需要大数据和分布式机器学习的发展来提高性能和效率。伟大的人和公司正在为加入分布式框架(Spark)和 DL 库(TF 和 Keras)做出惊人的努力。

以下是一个概述:

  1. :深度学习管道(即将合并为 Spark)

**[## 概述-深度学习管道 0.2.0 文档

深度学习管道 0.2.0 文档主页

databricks.github.io](https://databricks.github.io/spark-deep-learning/site/index.html)**

2.Elephas:与 Keras & PySpark 合作的分布式 DL:

** [## maxpumperla/elevas

elephas -使用 Keras & Spark 的分布式深度学习

github.com](https://github.com/maxpumperla/elephas)

3。雅虎!Inc .:TensorFlowOnSpark:

[## 雅虎/tensorflownspark

TensorFlowOnSpark 将 TensorFlow 程序引入 Apache Spark 集群

github.com](https://github.com/yahoo/TensorFlowOnSpark)

4。CERN 分布式 Keras (Keras + Spark):

[## cerndb/dist-keras

dist-keras -分布式深度学习,重点是分布式训练,使用 keras 和 Apache Spark。

github.com](https://github.com/cerndb/dist-keras)

5。Qubole (教程 Keras + Spark):

[## 基于 Apache Spark | Qubole 的 Keras 分布式深度学习

深度学习已经被证明可以在不同的领域产生高效的机器学习模型。一些…

www.qubole.com](https://www.qubole.com/blog/distributed-deep-learning-keras-apache-spark/)

6。英特尔公司:BigDL(Apache Spark 分布式深度学习库)

[## 英特尔分析/BigDL

BigDL:Apache Spark 的分布式深度学习库

github.com](https://github.com/intel-analytics/BigDL)

7.张量流和星火上T5【谷歌】T6云:

[## 在 Google 云平台上使用 Apache Spark 和 tensor flow | Google Cloud 大数据和机器…

Apache Spark 和 TensorFlow 都是开源项目,在企业领域产生了重大影响…

cloud.google.com](https://cloud.google.com/blog/big-data/2017/11/using-apache-spark-with-tensorflow-on-google-cloud-platform)

通过深度学习完成任务

正如我之前说过的,这个领域最重要的时刻之一是 TensorFlow 的创建和开源。

TensorFlow 是一个使用数据流图进行数值计算的开源软件库。图中的节点表示数学运算,而图边表示它们之间通信的多维数据数组(张量)。

上图中你看到的是广义相对论中黎曼张量的张量操作。

数学上定义的张量,仅仅是在坐标变化下按照一定规则变换的数字或函数的数组。

但在机器学习和深度学习的范围内,张量是向量和矩阵向潜在的更高维度的推广。在内部,TensorFlow 将张量表示为基本数据类型的 n 维数组。

我们在 DL 中一直大量使用张量,但是你不需要成为它们的专家来使用它。你可能需要对它们有所了解,所以我在这里列出了一些好的资源:

[## 深度学习 101:揭开张量之谜

张量和新的机器学习工具,如 TensorFlow,是这些天的热门话题,尤其是在寻找…

www.kdnuggets.com](https://www.kdnuggets.com/2017/06/deep-learning-demystifying-tensors.html) [## 数学不好就学人工智能——P4——天象画报(有猫!)

如果你数学很差,欢迎来到学习人工智能的第四部分。如果您错过了第 1、2、3、5、6 和 7 部分,请务必检查它们…

hackernoon.com](https://hackernoon.com/learning-ai-if-you-suck-at-math-p4-tensors-illustrated-with-cats-27f0002c9b32)

在你检查完这些之后,我之前提到的突破以及像 TensorFlow 或 Keras 这样的编程框架(关于 Keras 的更多信息,请访问这里),现在我想你已经知道你需要理解和使用深度学习了。

但是到目前为止,我们用 DL 取得了什么成就呢?仅举几个例子(摘自 Franç ois Chollet 关于 DL 的书):

  • 接近人类水平的图像分类。
  • 接近人类水平的语音识别。
  • 接近人类水平的手写转录。
  • 改进的机器翻译。
  • 改进的文本到语音转换。
  • Google Now 或亚马逊 Alexa 等数字助手。
  • 接近人类水平的自动驾驶。
  • 谷歌、百度和必应使用的改进的广告定位。
  • 改进的网络搜索结果。
  • 回答自然语言问题。
  • 超人去玩。

还有更多。以下是 DL 的 30 个伟大而有趣的应用:

[## 深度学习的 30 个惊人应用

在过去的几年里,深度学习被应用于数百个问题,从计算机视觉到自然…

www.yaronhadad.com](http://www.yaronhadad.com/deep-learning-most-amazing-applications/)

思考深度学习的未来(用于编程或构建应用程序),我会重复我在其他帖子中说过的话。

我真的认为 GUI 和 AutoML 是用深度学习完成事情的不远的将来。不要误解我,我喜欢编码,但是我认为我们明年要写的代码数量会减少。

我们不能花这么多时间在世界范围内一遍又一遍地编写相同的东西,所以我认为这两个特性(GUI 和 AutoML)将帮助数据科学家提高生产率和解决更多的问题。

在简单的 GUI 中完成这些任务的最好的免费平台之一是 Deep Cognition 。它们简单的拖放界面可以帮助你轻松设计深度学习模型。深度学习工作室可以自动为你的定制数据集设计深度学习模型,这要归功于他们先进的 AutoML 功能,几乎只需一次点击。

在这里,您可以了解更多关于它们的信息:

[## 深度认知——今天就成为一个人工智能驱动的组织

无需编码即可设计、训练和部署深度学习模型。深度学习工作室简化并加速了…

deepcognition.ai](http://deepcognition.ai)

看看价格:哦,这是免费的:)

我的意思是,现在这个领域的发展速度之快令人惊讶,我们可以用简单的图形用户界面来与我在这篇文章中谈到的所有困难而有趣的概念进行交互。

我喜欢这个平台的一点是,你仍然可以通过命令行或他们的笔记本进行编码,与 TensorFlow,Keras,Caffe,MXNet 等交互,而无需安装任何东西。您同时拥有笔记本和 CLI!

我向他们和他们对社会的贡献脱帽致敬。

你可以免费或花很少的钱尝试深度学习的其他有趣应用有(其中一些在私人测试版上):

[## Skejul -简化未来...

如果是在未来,那就是在斯克尤尔...使用 Skejul 的上下文感知预测计算平台设置您的会议…

skejul.com](http://skejul.com) [## 视觉障碍者的视觉人工智能|会说话的相机应用程序

一个免费的应用程序,讲述你周围的世界。专为低视力群体,这个研究项目利用…

www.microsoft.com](https://www.microsoft.com/en-us/seeing-ai/) [## 对话流

对话式用户体验平台。

dialogflow.com](https://dialogflow.com)

感谢阅读这篇关于深度学习的怪异介绍。我希望它能帮助你在这个神奇的领域开始,或者只是发现一些新的东西。

如果您有任何问题,请在 LinkedIn 上添加我,我们将在那里聊天:

[## Favio Vázquez -数据科学家/工具经理 MX - BBVA 数据&分析| LinkedIn

查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 12 个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)**

对抗性自动编码器的向导指南:第 1 部分,自动编码器?

原文:https://towardsdatascience.com/a-wizards-guide-to-adversarial-autoencoders-part-1-autoencoder-d9a5f8795af4?source=collection_archive---------2-----------------------

“如果你知道如何使用 Tensorflow 编写代码来对 MNIST 数字进行分类,那么你就可以阅读这篇文章的其余部分,否则我强烈建议你浏览 Tensorflow 网站上的这篇文章

“我们现在知道,我们不需要任何新的重大突破来实现真正的人工智能。

这是完全,完全,荒谬的错误。正如我在前面的陈述中所说的:大多数人类和动物的学习是无监督的学习。如果智能是一块蛋糕,无监督学习就是蛋糕,监督学习就是蛋糕上的糖衣,强化学习就是蛋糕上的樱桃。

我们知道如何做糖霜和樱桃,但是我们不知道如何做蛋糕。在我们能够想到真正的人工智能之前,我们需要解决无监督学习的问题。这只是我们知道的一个障碍。那些我们不知道的呢?"

这是在 alpha go获胜后,脸书人工智能研究主任阎乐存(我知道,另一个是阎乐存)的一句话。

我们知道,卷积神经网络(CNN)或在某些情况下密集的全连接层(MLP——一些人喜欢称之为多层感知器)可以用来执行图像识别。但是,CNN(或 MLP)不能单独用于执行任务,如从图像中分离内容和风格,生成真实的图像(生成模型),使用非常小的标签集对图像进行分类或执行数据压缩(如压缩文件)。

这些任务中的每一个都可能需要它自己的架构和训练算法。但是,如果我们能够只使用一个架构来实现上述所有任务,这不是很酷吗?一个对抗性的自动编码器(以半监督方式训练的编码器)可以使用一种架构完成所有这些任务。

我们将构建一个对抗性的自动编码器,它可以压缩数据(以有损的方式压缩 MNIST 数字),分离数字的样式和内容(生成不同样式的数字),使用标记数据的一个小子集对它们进行分类,以获得高分类精度(仅使用 1000 个标记数字,大约 95%!)并且最后还充当生成模型(以生成看起来真实的假数字)。

在我们进入对抗性自动编码器的理论和实现部分之前,让我们后退一步,讨论一下自动编码器,看看一个简单的 tensorflow 实现。

Autoencoder Architecture

自动编码器是一种神经网络,它被训练以产生与其输入非常相似的输出(因此它基本上试图将其输入复制到其输出),并且由于它不需要任何目标(标签),所以它可以以无人监督的方式进行训练。

它有两个部分:

  1. 编码器: 它接收一个输入 x (这可以是图像、文字嵌入、视频或音频数据)并产生一个输出 h (其中 h 通常具有比 x 更低的维度)。例如,编码器可以接收大小为 100 x 100 的图像 x ,并产生大小为 100 x 1(可以是任何大小)的输出 h ( 也称为潜在代码)。在这种情况下,编码器只是压缩图像,这样它将占用更低的维度空间,这样我们现在可以看到 h (大小为 100 x 1)可以使用比直接存储图像 x 少 100 倍的内存来存储(这将导致一些数据丢失)。

我们来想一个像 WinRAR 这样的压缩软件(还在免费试用?)可用于压缩文件,以获得占用空间较少的 zip(或 rar,…)文件。自动编码器架构中的编码器执行类似的操作。

如果编码器由函数 q、表示,则

Encoder

2. 解码器: 它接收编码器 h 的输出,并试图在其输出端重建输入。继续编码器示例, h 现在的大小为 100 x 1,解码器尝试使用 h 恢复原始的 100 x 100 图像。我们将训练解码器从 h 中获取尽可能多的信息,以重建 x

所以,解码器的操作类似于对 WinRAR 执行解压缩。

如果函数 p 代表我们的解码器,则重建图像 x_ 为:

Decoder

只有当输入相关时(如来自同一域的图像),降维才有效。如果我们每次训练自动编码器时都传递完全随机的输入,那么它就会失败。因此,最终,给定一个输入,自动编码器可以产生更低维度的输出(在编码器处),非常类似于主成分分析( PCA )。由于我们在训练过程中不需要使用任何标签,这也是一个无人监管的模型。

但是,除了降维,自动编码器还能用来做什么呢?

  • 图像去噪其中可以使用有噪声的图像生成清晰无噪声的图像。

Denoising autoencoder example on handwritten digits. Source: https://www.doc.ic.ac.uk/~js4416/163/website/autoencoders/denoising.html

  • 语义哈希降维可以用来加快信息检索(我发现这很有趣!).
  • 最近,以对抗方式训练的自动编码器可以用作生成模型(我们将在后面更深入地讨论)。

我将这篇文章分为四个部分:

  • ****第 1 部分:自动编码器?

我们将从使用 Tensorflow 实现一个简单的自动编码器开始,并减少 MNIST(你肯定知道这个数据集是关于什么的)数据集图像的维数。

  • ****第二部分:用对抗性的自动编码器探索潜在空间。

我们将使用对抗学习对潜在代码(编码器的输出)引入约束。

  • ****第三部分:风格与内容的解开。

在这里,我们将使用相同的书写风格生成不同的图像。

  • ****第四部分:用 1000 个标签给 MNIST 分类。

我们将训练一个 AAE 来对 MNIST 数字进行分类,仅使用 1000 个带标签的输入就能获得大约 95%的准确率(令人印象深刻啊?).

让我们从了解我们需要实现的网络架构开始第一部分。

如前所述,自动编码器(AE)由编码器和解码器两部分组成,让我们从一个简单的密集全连接编码器架构开始:

Encoder Architecture

它包括一个具有 784 个神经元的输入层(因为我们已经将图像展平为一维),两组 1000 个 ReLU 激活的神经元形成隐藏层,一个由 2 个未激活的神经元组成的输出层提供潜在代码。

如果你只是想得到代码,请点击以下链接:

** [## naresh 1318/Adversarial _ 自动编码器

在 GitHub 上创建一个帐户,为 Adversarial_Autoencoder 的开发做出贡献。

github.com](https://github.com/Naresh1318/Adversarial_Autoencoder)

为了在 Tensorflow 中实现上述架构,我们将从一个dense()函数开始,该函数将帮助我们在给定输入x、输入处的神经元数量n1和输出处的神经元数量n2的情况下构建一个密集的全连接层。name参数用于设置variable_scope的名称。更多关于共享变量和使用变量作用域的内容可以在这里找到(我强烈推荐看一看)。

我使用了tf.get_variable()而不是tf.Variable()来创建权重和偏差变量,这样我们就可以在以后重用训练好的模型(单独使用编码器或解码器)来传递任何想要的值,并查看它们的输出。

接下来,我们将使用这个dense()函数来实现编码器架构。代码很简单,但是请注意,我们没有在输出中使用任何激活。

  • reuse 标志用于重用训练过的编码器架构。
  • 这里input_dim = 784, n_l1 = 1000, n_l2 = 1000, z_dim = 2

解码器以类似的方式实现,我们需要的架构是:

Decoder Architecture

我们将再次使用dense()函数来构建我们的解码器。然而,我对输出层使用了 sigmoid 激活,以确保输出值的范围在 0 和 1 之间(与我们的输入范围相同)。

  • z_dim = 2, n_l2 = 1000, n_l1 = 1000, input_dim = 784与编码器相同。

编码器输出可以像这样连接到解码器:

这就形成了与架构图所示完全相同的自动编码器架构。我们将通过占位符x_input(大小:batch_size,784)传递输入,将目标设置为与x_input相同,并将decoder_outputx_input进行比较。

使用的损失函数是均方误差(MSE ),其找到输入(x_input)和输出图像(decoder_output)中的像素之间的距离。我们称之为重建损失,因为我们的主要目的是在输出端重建输入。

Mean Squared Error

这只不过是输入和输出之间的平方差的平均值。这可以很容易地在 Tensorflow 中实现,如下所示:

我用过的优化器是 AdamOptimizer(随意尝试新的,我还没有在别人身上试验过),学习率为 0.01,beta1 为 0.9。它可在 Tensorflow 上直接获得,使用方法如下:

请注意,我们使用相同的损失函数通过编码器和解码器进行反向传播。(我可以使用minimize()方法下的var_list参数只改变编码器或解码器的权重。由于我没有提到任何,它默认为所有的可训练变量。)

最后,我们通过使用 100 的批量大小传入我们的 MNIST 图像并使用同样的 100 个图像作为目标来训练我们的模型。

github 上有完整的代码:

[## naresh 1318/Adversarial _ 自动编码器

在 GitHub 上创建一个帐户,为 Adversarial_Autoencoder 的开发做出贡献。

github.com](https://github.com/Naresh1318/Adversarial_Autoencoder/blob/master/autoencoder.py)

注意事项:

  • generate_image_grid()函数通过向经过训练的解码器传递一组数字来生成图像网格(这就是get_variable 派上用场的地方)。
  • 每次运行都会在以下位置生成所需的张量板文件:

./Results/<model>/<time_stamp_and_parameters>/Tensorboard

  • 训练日志存储在:

./Results/<model>/<time_stamp_and_parameters>/log/log.txt文件。

  • train标志设置为True以训练模型,或者将其设置为False以显示某些随机输入的解码器输出。

我已经训练了 200 个时期的模型,并显示了损失的变化和下面生成的图像:

Variation of reconstruction loss

重建损失正在减少,这正是我们所希望的。

Generated Images

请注意,解码器是如何通过移除输入 3 顶部的线条等小的不规则性来概括输出 3 的。

现在,如果我们只考虑经过训练的解码器,并传入一些随机数(我已经传入 0,0,因为我们只有一个 2-D 潜在代码)作为输入,我们应该得到一些正确的数字?

Decoder Output at (0, 0)

但这根本不能代表一个明确的数字(好吧,至少对我来说)。

其原因是因为编码器输出没有覆盖整个 2-D 潜在空间(在其输出分布中有很多间隙)。因此,如果我们在训练阶段输入编码器没有输入到解码器的值,我们会得到看起来很奇怪的输出图像。这可以通过在产生潜在代码时将编码器输出限制为具有随机分布(比如平均值为 0.0 且标准偏差为 2.0 的正态分布)来克服。这正是对抗性自动编码器所能做到的,我们将在第二部分中研究它的实现。

再看看封面图片!!

懂了吗?

希望你喜欢这篇关于自动编码器的短文。我会公开鼓励任何批评或建议来改进我的工作。

如果你认为这个内容值得分享点击❤️,我喜欢它发送给我的通知!!

→第 2 部分:用对抗性自动编码器探索潜在空间。**

敌对自动编码器向导指南:第 2 部分,探索敌对自动编码器的潜在空间。

原文:https://towardsdatascience.com/a-wizards-guide-to-adversarial-autoencoders-part-2-exploring-latent-space-with-adversarial-2d53a6f8a4f9?source=collection_archive---------1-----------------------

“这篇文章是 自动编码器向导:第 1 部分 的延续,如果你没有读过它,但熟悉自动编码器的基础知识,那么请继续。你需要了解一点概率论,可以在这里找到。”

第 1 部分:自动编码器?

我们省略了第 1 部分,将一个值(0,0)传递给我们训练过的解码器(在输入端有 2 个神经元),并找到它的输出。它看起来模糊不清,没有代表一个清晰的数字,让我们得出结论,编码器 h (也称为潜在代码)的输出在特定空间中分布不均匀。

因此,我们在这一部分的主要目标将是迫使编码器输出与给定的先验分布相匹配,这个要求的分布可以是正态(高斯)分布、均匀分布、伽玛分布…然后,这将导致潜在代码(编码器输出)在给定的先验分布上均匀分布,这将允许我们的解码器学习从先验到数据分布的映射(在我们的情况下是 MNIST 图像的分布)。

如果你完全不理解上面的段落。

假设你在上大学,并且选择了机器学习(我想不出其他课程:p)作为你的课程之一。现在,如果课程老师不提供教学大纲指南或参考书,你将为期末考试学习什么?(假设你的课没有帮助)。

如果你被问及 ML 的任何子领域的问题,你会怎么做?用你知道的东西化妆??

如果我们不将编码器输出限制为遵循某种分布,解码器就无法学习任何数字到图像的映射,就会发生这种情况。

但是,如果你有一份合适的教学大纲指南,你可以在考试前浏览一下材料,这样你就会对考试有所了解。

同样,如果我们迫使编码器输出遵循一个已知的分布,如高斯分布,那么它可以学习扩展潜在代码以覆盖整个分布,并学习无任何间隙的映射。

Good or Bad?

我们现在知道自动编码器有两个部分,每个部分执行完全相反的任务。

两个本性相似的人永远不可能单独相处,只有两个对立面才能和谐。

—拉姆·莫汉

用于从输入获得潜在代码(编码器输出)的编码器,其约束条件是潜在代码的尺寸应小于输入尺寸,其次是接收该潜在代码并尝试重建原始图像的解码器。

Autoencoder Block diagram

让我们看看当我们先前实现我们的自动编码器时,编码器输出是如何分布的(checkout part 1 ):

Encoder histogram and distribution

从分布图(向右)我们可以清楚地看到,我们的编码器的输出分布无处不在。最初,似乎分布集中在 0,大多数值为负。在训练的后期阶段,当与正样本相比时,负样本分布在远离 0 的地方(同样,如果我们再次运行实验,我们甚至可能得不到相同的分布)。这导致了编码器分布中的大量间隙,如果我们想将解码器用作生成模型,这不是一件好事。

但是,为什么在我们的编码器分配中,这些差距是一件坏事呢?

如果我们给一个训练有素的解码器一个落在这个间隙中的输入,那么它会给出看起来奇怪的图像,在输出端不代表数字(我知道,第三次)。

另一个重要的观察结果是,训练自动编码器给了我们具有相似图像的潜在代码(例如,全是 2 或 3..)在欧几里得空间中彼此远离。例如,这可能导致我们数据集中的所有 2 被映射到空间中的不同区域。我们希望通过将相似数字的图像保持在一起,使潜在代码具有有意义的表示。有些事情是这样的:

A good 2D distribution

不同颜色的区域代表一类图像,请注意相同颜色的区域是如何相互靠近的。

我们现在来看看可以解决上述一些问题的对抗性自动编码器。

对抗自动编码器与自动编码器非常相似,但是编码器以对抗的方式被训练,以迫使它输出所需的分布。

理解对抗性自动编码器(AAEs)需要生成性对抗性网络(GANs)的知识,我写了一篇关于 GANs 的文章,可以在这里找到:

* [## 甘斯·恩罗斯

“本文假设读者熟悉神经网络和张量流的使用。如果没有,我们请求您…

medium.com](https://medium.com/towards-data-science/gans-n-roses-c6652d513260)

如果您已经了解 GANs,这里有一个快速回顾(如果您记得接下来的两点,请随意跳过这一部分):

Discriminator

Generator

  • GANs 有两个神经网络,一个生成器和一个鉴别器。
  • 生成器,很好地生成假图像。我们训练鉴别器来区分数据集的真实图像和生成器生成的假图像。
  • 生成器最初会生成一些随机噪声(因为它的权重是随机的)。在训练我们的鉴别器来区分这种随机噪声和真实图像之后,我们将把我们的生成器连接到我们的鉴别器,并且仅通过具有鉴别器输出应该为 1 的约束的生成器进行反向传播(即,鉴别器应该将生成器的输出分类为真实图像)。
  • 我们将再次训练我们的鉴别器来区分来自我们的生成器的新的假图像和来自我们的数据库的真实图像。然后训练生成器生成更好的假图像。
  • 我们将继续这个过程,直到生成器变得非常擅长生成假图像,以至于鉴别器不再能够区分真实图像和假图像。
  • 最后,我们将剩下一个生成器,它可以产生看起来真实的假图像,给定一组随机的数字作为输入。*

这是一个对抗性自动编码器的框图:

AAE block diagram

  • x →输入图像
  • q(z/x) →编码器输出给定输入 x
  • z →潜码(假输入),z 由 q(z/x)得出
  • z' →具有所需分布的实际输入
  • p(x/z)→给定 z 的解码器输出
  • D() →鉴别器
  • x _→重建图像

同样,我们的主要目的是迫使编码器输出具有给定先验分布的值(这可以是正态分布,γ分布..分发)。我们将使用编码器(q(z/x))作为我们的生成器,鉴别器来判断样本是来自先前的分布(p(z))还是来自编码器(z)和解码器(p(x/z))的输出,以恢复原始输入图像。

为了理解这种架构如何用于在编码器输出上强加先验分布,让我们看一下如何训练 AAE。

训练 AAE 有两个阶段:

  • 重建阶段:

我们将训练编码器和解码器,以最小化重建损失(输入和解码器输出图像之间的均方误差,查看第 1 部分了解更多细节)。忘记鉴别器甚至存在于这个阶段(我已经将这个阶段不需要的部分变灰)。

Reconstruction Phase

像往常一样,我们将输入传递给编码器,编码器将给出我们的潜在代码,稍后,我们将把这个潜在代码传递给解码器,以取回输入图像。我们将反向传播编码器和解码器的权重,以便减少重建损失。

  • 正规化阶段:

在这一阶段,我们必须训练鉴别器和生成器(它只不过是我们的编码器)。忘了解码器的存在吧。

Training the discriminator

首先,我们训练鉴别器来分类编码器输出(z)和一些随机输入(z ',这将有我们需要的分布)。例如,随机输入可以正态分布,平均值为 0,标准偏差为 5。

因此,如果我们传入具有期望分布(真实值)的随机输入,鉴别器应该给我们输出 1,当我们传入编码器输出时,应该给我们输出 0(假值)。直观上,编码器输出和鉴别器的随机输入应该具有相同的大小。

下一步将是迫使编码器输出具有期望分布的潜在代码。为此,我们将把编码器输出作为输入连接到鉴频器:

我们将把鉴别器权重固定为它们当前的值(使它们不可跟踪),并在鉴别器输出端把目标值固定为 1。稍后,我们将图像传入编码器,并找到鉴别器输出,然后使用该输出来查找损失(交叉熵成本函数)。我们将仅通过编码器权重进行反向传播,这将导致编码器学习所需的分布,并产生具有该分布的输出(将鉴别器目标固定为 1 将导致编码器通过查看鉴别器权重来学习所需的分布)。

既然理论部分已经完成,让我们看看如何使用 tensorflow 实现它。

下面是第 2 部分的完整代码(它与我们在第 1 部分中讨论的内容非常相似):

* [## naresh 1318/Adversarial _ 自动编码器

对抗性自动编码器向导

github.com](https://github.com/Naresh1318/Adversarial_Autoencoder/blob/master/adversarial_autoencoder.py)

像往常一样,我们有帮手:

我没有改变编码器和解码器的架构:

Encoder Architecture

Decoder Architecture

这是鉴别器架构:

Discriminator Architecture

它类似于我们的编码器架构,输入形状是z_dim(实际上是batch_size, z_dim),输出形状是 1 ( batch_size, 1)。

注意,在分别为编码器、解码器和鉴别器定义密集层时,我使用了前缀e_d_dc_。使用这些符号有助于我们轻松收集要训练的重量:

我们现在知道训练 AAE 有两个部分,首先是重建阶段(我们将训练我们的自动编码器来重建输入)和正则化阶段(首先训练鉴别器,然后是编码器)。

我们将编码器输出连接到解码器输入,开始重建阶段:

我每次调用我们定义的架构时都使用tf.variable_scope(tf.get_variable_scope()),因为它允许我们在所有函数调用中共享权重(只有在reuse=True时才会发生)。

损失函数通常是均方误差(MSE),我们在第 1 部分中遇到过。

类似于我们在第 1 部分中所做的,优化器(它将更新权重以减少损失[希望如此])实现如下:

I couldn’t help it 😛

重建阶段到此结束,接下来我们进入正则化阶段:

我们将首先训练鉴别器来区分真实的分布样本和来自生成器(这里是编码器)的假样本。

  • real_distribution是一个占位符,我用它将所需分布的值传递给鉴别器(这将是我们真正的输入)。
  • encoder_output连接到鉴别器,鉴别器将为我们提供伪输入的鉴别器输出d_fake
  • 这里是reuse=True,因为我们希望在第二次调用中使用相同的鉴别器权重(如果没有指定,那么 tensorflow 会创建一组新的随机初始化的权重[但是因为我使用了get_variable()来创建权重,所以会出错])。

我用来训练鉴别器的损失函数是:

Cross entropy cost

这很容易在 tensorflow 中实现,如下所示:

下一步将是训练发电机(编码器)输出所需的分布。正如我们已经讨论过的,这需要将鉴别器的目标设置为 1,并将d_fake变量(连接到鉴别器的编码器【返回查看】)设置为 1。发电机损耗又是交叉熵代价函数。

为了在训练期间只更新所需的权重,我们需要将所有这些收集的权重传递给minimize()下的var_list参数。因此,我已经在它们的训练阶段传递了鉴别器变量(dc_var)和生成器(编码器)变量(en_var)。

我们差不多完成了,剩下的就是将我们的 MNIST 图像作为输入和目标,以及大小为batch_size, z_dim的随机数作为鉴别器的输入(这将形成所需的分布)。

训练部分可能看起来很吓人,但是盯着它看一会儿,你会发现它非常直观。

我在培训中使用的参数如下:

我用所需的分布训练了 300 个时期的模型,开始一个正态(高斯)分布,平均值为 0 和 5,作为它的标准分布。下面是编码器输出和所需的分布及其直方图:

编码器分布几乎与要求的分布相匹配,直方图显示其中心为零。很好,但是鉴别器呢,它的表现如何?

好消息是,鉴频器损耗正在增加(变得更糟),这告诉我们很难区分真假输入。

最后,由于我们有了z_dim=2 (2D 值),我们可以将属于所需分布的随机输入传递给我们训练过的解码器,并将其用作生成器(我知道,我一直将编码器称为生成器,因为它向鉴别器生成假输入,但由于解码器已经学会映射这些假输入以在其输出端获得数字,所以我们可以将我们的解码器称为生成器)。我以固定的间隔将(-10,-10)到(10,10)的值传递给解码器,并存储其输出。下面是数字的分布情况:

上图显示了一个清晰的数字聚类及其在我们探索解码器训练值时的转换。AAE 使编码器输出分布中的间隙变得更近,这允许我们将解码器用作发电机。

就是这样!。在下一部分中,我们将重点讨论如何使用 AAE 将图像风格与其内容分开。这很容易实现,因为我们已经完成了大部分相对困难的部分。*

希望你喜欢 AAEs 上的这篇文章。我会公开鼓励任何批评或建议来改进我的工作。

如果你认为这个内容值得分享点击❤️,我喜欢它发送给我的通知!!

← Part 1: Autoencoder?

→第 3 部分:风格与内容的解开。

对抗性自动编码器的向导指南:第 3 部分,风格和内容的分离。

原文:https://towardsdatascience.com/a-wizards-guide-to-adversarial-autoencoders-part-3-disentanglement-of-style-and-content-89262973a4d7?source=collection_archive---------2-----------------------

“如果你已经阅读了前两部分,你会觉得在实现这一部分时如鱼得水。”

←第二部分:用对抗性的自动编码器探索潜在空间。

第 1 部分和第 2 部分主要关注自动编码器和对抗性自动编码器的入门。我们从一个简单的 AE (vanilla one)开始,对其架构和训练算法进行了一些更改,最终得到了一个 AAE。这一部分延续了这一趋势,改变了 AAE 的建筑风格,同时在训练方式上做了小小的改变。

我已经在我的 repo 中创建了所有的 python 文件,这样一个零件所需的每一个文件都可以通过一些小的修改从先前的文件中获得。我建议您阅读这篇文章的理论部分,并尝试修改第 2 部分的代码来实现第 3 部分。

我们每个人都有自己独特的写作风格,无论是写信还是签名。我们书写某些字符的方式,我们经常用来造句的词语,甚至一个人在纸上施加的压力都是定义独特笔迹的特征。随着所有这些事情的发生,伪造笔迹会变得非常困难和昂贵。让我们尝试从 MNIST 数据集中学习写作风格,并使用它来输出具有相同风格的图像。我们将只关注写作风格,而不是句子的结构或作者的思维过程。

要清楚了解什么是风格和内容,请看下图:

Style and Content

每个文本都有相同的内容“自动编码器”,但风格不同。我们现在的任务是从图像中分离出风格(Myriad Pro,MV Boil,…)和内容。

理清各种特征在表征学习中非常重要(更多信息请点击这里)。

我们遇到的自动编码器和对抗性自动编码器都是以无监督的方式训练的(在训练期间没有使用任何标签)。使用来自图像的标签信息允许 AAE 专注于学习提取图像中的样式,而不考虑其内容。利用图像标签使它成为一个监督模型。

我们需要完成的架构与我们在第 2 部分中看到的非常相似。

AAE Architecture

这里,代替在解码器处直接使用潜在代码 z (编码器的输出)来恢复输入图像( x ),我们也传入图像标签( y )。现在,解码器的输入有两部分:

  • 来自编码器的潜在代码z
  • 图像标签的一个热表示(姑且称之为 y )。

我们像往常一样训练 AAE,只是对重建阶段做了一点修改:

  • 重建阶段:我们将输入图像传入编码器以获得潜在代码 z ,稍后,将潜在代码( z ,编码器的输出)和图像标签( y )组合以获得更大的列向量,然后将其馈送给我们的解码器。我们像往常一样训练 AE 以最小化重建损失。因为图像标签被馈送到解码器,所以编码器在训练期间学习图像的风格,并且解码器使用来自标签的内容信息和来自编码器的风格信息来重构输入图像。
  • 正规化阶段:与我们在第二部中看到的完全相似。

现在,让我们只是添加图像标签到我们的 AAE,并检查结果。

由于我们需要一个热图像标签,解码器架构将具有更大数量的输入神经元[10 + z_dim ] (10 因为我们有十个类,并且 z_dim 是编码器输出的大小,例如, z_dim 可以是 2)。

Decoder Architecture

现在是时候停止阅读并修改第 2 部分的代码了。稍后回来看看代码和结果。

改进的解码器架构:

我们还需要在培训期间输入图像标签,这非常简单:

我刚刚在调用mnist_train_next_batch()函数时用batch_y替换了_,并将这些标签用作y_input占位符的输入。

我用以下参数训练了 AE:

注意,我使用了z_dim=15而不是2,不像之前的实现,因为结果在视觉上是令人愉悦的。

与第 2 部分类似,我将先前高斯分布的标准偏差保持为 5.0,平均值为 0。

为了生成具有相同风格但不同字符的图像,我们将传递一个随机输入作为 z ( z_dim 在这种情况下是 15)并将一个热向量 y 更改为所需的值。在这里,我为 z 传入了 10 个随机值,并将 y 改为表示从 0 到 9 的数字:

看看generate_image_grid()的实现。

Style and content Disentanglement

作为健全性检查,让我们看看编码器输出分布,检查它是否仍然是我们想要的:

是的,这就完成了第 3 部分!

我们将再次建立在这一部分的基础上,使用有限数量的标签对图像进行分类,同时仍然理清风格和内容。

我已经减少了这篇文章的阅读时间,只是为了检查它是否会影响媒体上的阅读率😜。如果你觉得内容精简的短文更好,或者你有不同的看法,请在下面留下评论。

感谢您的阅读,我一直在寻找改进工作的方法。您的反馈(好的或坏的)将对我有巨大的帮助。祝您愉快!

对抗性自动编码器向导:第 4 部分,使用 1000 个标签对 MNIST 进行分类。

原文:https://towardsdatascience.com/a-wizards-guide-to-adversarial-autoencoders-part-4-classify-mnist-using-1000-labels-2ca08071f95?source=collection_archive---------2-----------------------

“我们将运用我们在前三部分学到的知识对 MNIST 进行分类。

我知道这听起来不怎么酷,难道我们不应该做些更酷的事情吗?”

和往常一样,如果你还没有读完之前的任何部分,或者想再看一遍,我可以帮你节省一些时间:

←第 1 部分: Autoencoder?

← Part 2: 用对抗性的自动编码器探索潜在空间。

← Part 3: 风格与内容的解开。

我们从一个自动编码器开始,将图像从一个较高的维度映射到一个较低的维度,通过以对抗的方式训练它来约束编码器输出所需的分布,最后从图像内容中分离出风格。最后,我们现在看一种使用 1000 个标记图像以半监督方式分类 MNIST 数字的方法。

还记得理解这个系列的前提条件吗?

是的,使用张量流对 MNIST 进行分类。

让我们测试一下,好吗?

但是,在此之前,让我告诉你(** 剧透警告 **)我们将使用编码器对 MNIST 数字进行分类,并作为稍后比较我们结果的参考,我们将构建一个与我们的编码器具有相同架构(不包括输出神经元)的分类器(我称之为基本 NN 分类器),并使用 1000 个标记图像以监督方式对其进行训练,并使用 10k 测试数据测试其准确性。

Basic NN Classifier

如果你已经到了这一步,你一定能够实现上述架构的专业人士,所以我将跳过它。但是,如果你被困在某个地方,看看下面的链接:

* [## naresh 1318/Adversarial _ 自动编码器

对抗性自动编码器向导

github.com](https://github.com/Naresh1318/Adversarial_Autoencoder/blob/master/basic_nn_classifier.py)

让我们看看用以下参数训练我们的基本 NN 分类器后的结果:

Accuracy variation

在大约 50 个时期之后,该模型似乎过拟合,因为测试精度已经饱和在 87%。请注意,该模型只显示了 1000 张标记图像,如果我们使用所有 50k 训练图像,我们可以获得更高的准确性。现在,我们的任务是使用同样的 1000 个标记图像来提高这种准确性。*

但是,我们如何使用我们的 AAE 作为分类器呢?

我们将同时提高分类的准确性,减少维度,并且只使用一个单一的模型来理清风格和内容(是的,我又在吹牛了)。这需要对我们以前的架构(第 3 部分中的架构)进行一些修改:

Semi-Supervised AAE Block Diagram

它类似于第 3 部分中的 AAE,但在顶部添加了另一个鉴别器( D_cat )并对编码器架构做了少量修改(它现在输出 yz )。编码器的输出可以分为两部分,分类()y)和潜码( z )。因为有 10 个标签,所以一个热向量( y )有 10 个值,并且像往常一样,取决于用户期望的潜在代码(z_dim)的大小。**

我们将需要在上强加一个分类分布(cat(10)),因为我们只是想要 10 个可能的输出神经元中的一个为提供给它的每个图像触发。鉴别器 D_cat 就是为了做到这一点,它与我们的生成器(编码器)一起以对抗的方式进行训练,以迫使编码器在 y 处产生一个热向量(我们仍然不能将编码器用作分类器,因为这些热向量都是随机值,因为现在的主要目的是在编码器处强制进行分类分布)。

像往常一样,我们将教会编码器使用上图所示的鉴别器_ gaussz 处产生高斯(或任何其他分布)分布。

大部分神奇的事情发生在训练阶段,我们将看看编码器如何被用作分类器。

使用 SGD(随机梯度下降)分三个阶段同时训练两个敌对网络:

  • 重建阶段 :

Reconstruction Phase

正如在第 2 部分和第 3 部分中看到的,我们关心的是减少重建损失,即输入和输出图像之间的均方误差。我们将仅通过编码器和解码器网络进行反向传播,以减少此阶段的重建损失。

  • 正规化阶段 :

Step 1

在正则化阶段,编码器输出 y 应该被限制为只产生分类分布,这可以用类似于我们在第 2 部分中所做的方式来完成。我们将首先训练鉴别器 D_cat 来区分真实分类样本(y’)和从生成器(编码器) y 获得的样本。我们可以通过将一幅图像传递给编码器来实现这一点,该编码器从编码器中产生 yz、暂且不提 z (我们稍后会用到它),从编码器中产生假的 y ,从分类中产生y’后来,鉴别器的权重是固定的(变得不可训练),目标设置为 1,编码器被训练来欺骗鉴别器。**

Step 2

类似地,为了在 z 上施加高斯分布,首先训练鉴别器 D_gauss ,然后是编码器,就像在第 2 部分中一样。

  • 半监督分类阶段

最后,我们将训练编码器通过传入一小批图像及其对应的一个热标签来对数字进行分类,以最小化交叉熵成本(同样,我们将忽略在 z 获得的任何内容)。在训练阶段,我们将只使用来自训练集的 1000 个标记图像,并使用所有 10k 测试集来了解我们的模型执行得有多好。

我认为代码比文字更清楚,这也是为什么我总是试图包含代码片段的原因之一。

要使用第 3 部分的代码构建一个半监督的对抗性自动编码器,我们需要做 3 个主要的修改(是的,也有一些微妙的变化,我已经在注释部分解释过了)。首先,作为编码器架构:

Encoder Architecture

:

  • latent_variable将是我们的z
  • cat_op是分类输出y
  • 我已经使用了一个if语句来测试supervised标志。它所做的只是检查supervised标志是否为False(当我们将编码器输出直接连接为解码器输入时,就会出现这种情况),并通过 softmax 函数传递逻辑值(从架构直接输出,不通过任何激活函数传递),以在输出端获得正确的分类分布。但是,当标志为True时,逻辑将直接用于以受监督的方式训练编码器模型。我这样做是为了在半监督训练阶段使用 tensorflow 上直接提供的softmax_cross_entropy_with_logits()

解码器架构与前一个相同:

Decoder Architecture

两个鉴别器具有相同的架构,只有输入维度发生了变化,这是第二个主要变化。

D_gauss and D_cat Architecture

最后,培训机制经历了一些变化,我在下面解释了这些变化:

我们将从构建 AE 的重建阶段开始:

随后是重建损失,因为它的优化器:

为了训练编码器和鉴别器架构,必须像第 2 部分和第 3 部分一样收集它们相应的权重:

首先涉及训练两个鉴别器( D_catD_gauss )的正则化阶段如下进行(我们仍然必须传递输入):

现在,为了训练生成器(编码器)输出在处的分类分布和在 z 、处的高斯分布,我们将运行这些神奇的行:

为了训练编码器进行分类,我已经将输入图像传递给训练过的编码器(reuse=True)还要注意的是supervised=True,它不使用 softmax 函数,而是将密集层输出传递给损失函数:

使用np.eye()生成需要真实分类分布的训练阶段,下面的代码为给定的历元数训练模型,在每个历元保存它,将损失、直方图和输出图像写入 tensorboard,并将结果(损失和分类精度)存储在./Results/Semi_Supervised/<folder_name>/log/log.txt:

使用以下参数训练 1000 个时期后:

精度图如下:

Accuracy Variations

我们甚至没有调优任何超参数就越过了 95%的准确率大关(我有点懒于这样做)。该模型使用在无监督训练阶段学习的特征来实现比其有监督的对应物更高的分类精度。这清楚地显示了无监督学习的应用潜力,我们可以在互联网上收集大量免费的未标记数据,并教会计算机从这些未标记图像中学习特征。

这是一个 AE 可以在无人监督的情况下学习的示例:

Visualizing the features learnt. Source: http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/

如果我们将编码器中每个输出神经元寻找的特征可视化,我们会得到类似于上图所示的可视化效果。一个输出神经元可能只有在输入端发现一个特定的边缘或轮廓时才会触发(关于这一点的更多信息可以在这里找到)。这些以非监督方式学习的特征可以在监督训练任务中使用,这正是我们在这一部分所做的。

作为一个健全的检查,让我们可视化输出分布和图像:

Distributions

Images from the decoder

唷!,实际分布和输出分布相匹配,并且输出图像看起来像是从 MNIST 数据集获得的图像。

所以,是的,我们完成了最后一部分!

感谢您的阅读!

我只是想让人们知道他们如何通过建立他们所知道的东西来实现东西,以及如何从一个简单的 AE 开始,我们可以在每一步做一些小的修改来创造一些有趣的东西。

我在暑假期间写了这个系列,以感受一个作家的经历,并欣赏他们通过什么来表达他们的思想或分享他们的知识,让世界了解。我相信只有当人们自己尝试做类似的事情时,他们才会开始钦佩别人的工作并真正理解它。

也就是说,如果你已经走了这么远,感谢你阅读我以前的帖子,并以一个👏。如果我犯了什么错误或者破坏了互联网,请让我知道。

摘要中使用的单词云

原文:https://towardsdatascience.com/a-word-cloud-of-words-used-in-abstract-1d07613770f?source=collection_archive---------9-----------------------

我真的很喜欢《抽象》——网飞的系列设计纪录片。这是那种让你不想被动消费和创造的内容。

我一直在 R 中玩文本分析,并决定应用我最近接触到的一些技术,创建一个包含节目中使用的所有单词的单词云。像所有数据科学项目一样,这个项目始于数据采集。网飞提供多种语言的字幕。每次你打开字幕或者改变语言,它都会下载。花了几分钟时间在 Chrome 中找到请求:

由于这部电视剧只有 8 集,我没有尝试自动下载每集的英文字幕,而是手动下载。

字幕以 TTML 格式提供。对于创建单词云,我只对文件中的文本内容感兴趣,对时间或字体数据不太感兴趣。因此,我没有尝试寻找一个专门的 TTML 处理库,而是编写了一个快速的 Python 脚本,将每个文件简单地视为另一个 XML 文件,并将每集的文本转储到一个制表符分隔的文件中:

episode script
1 [director] Part of this is I’m trying to figure out some of the...
2 [sea birds calling] [Tinker] I probably think about feet a lot ...
3 [Es] Over the last two decades of working, one of the things I'...
.
.
.

下一步是在 r 中读取这个文件。我使用了通用的read.csv,但它没有像预期的那样工作。

> d <- read.csv('~/proj/abstract.tsv', sep="\t")
> str(d)
'data.frame': 3 obs. of  2 variables:
 $ **episode: int  6 7 8**
 $ script : Factor w/ 3 levels "[Ilse] Some people think interior design is a look. In fact, It must be really fun buying furniture is somethin"| __truncated__,..: 2 3 1

数据框只有 3 行。它清楚地读取了整个文件,因为它从标题(剧集,剧本)中选择了列名,并得到了最后 3 行,但我很困惑为什么read.csv会跳过第 1-5 行。我试图将as.is=T参数传递给read.csv以防止它将字符串解释为因子,但这并不能阻止它跳过第 1–5 行。

'data.frame': 3 obs. of  2 variables:
 $ **episode: int  6 7 8**
 $ script : chr  "[Paula] I walk outside and I see typography everywhere. New York City is a city of signs. Sometimes things writ"| __truncated__ "[Platon] I'm not really a photographer at all. The camera is nothing more than a tool. Communication, simplicit"| __truncated__ "[Ilse] Some people think interior design is a look. In fact, It must be really fun buying furniture is somethin"| __truncated__

最终,我从data.table套餐中选择了fread,它非常管用:

> library(data.table)
> d <- fread('~/proj/abstract.tsv')
> str(d)
Classes ‘data.table’ and 'data.frame': 8 obs. of  2 variables:
 $ **episode: int  1 2 3 4 5 6 7 8**
 $ script : chr  "[director] Part of this is I'm trying to figure out some of the big picture things. How aesthetically to tell y"| __truncated__ "[sea birds calling] [Tinker] I probably think about feet a lot more than the average person. As a shoe designer"| __truncated__ "[Es] Over the last two decades of working, one of the things I've discovered is often things are made to fill v"| __truncated__ "[director] Is this going to be a slapstick comedy? Is it an action film? You know, let's have fun with it. -Yea"| __truncated__ ...
 - attr(*, ".internal.selfref")=<externalptr> 

下一步是将脚本分解成单词。tidytext包帮助我们做到了这一点(甚至更多):

> library(tidytext)
> words <- unnest_tokens(d, word, script)
> head(words)
   episode     word
1:       1 director
2:       1     part
3:       1       of
4:       1     this
5:       1       is
6:       1      i'm

让我们来数一数每个单词:

> library(dplyr)
> words %>% group_by(word) %>% summarise(count=n()) %>% arrange(desc(count))
# A tibble: 5,047 x 2
    word count
   <chr> <int>
 1   the  1863
 2   and  1262
 3     a  1217
 4    to  1170
 5     i  1135
 6    of   985
 7  that   878
 8    it   796
 9    in   681
10   you   681
# ... with 5,037 more rows

因此,正如您所料,我们在脚本中最常用的词大多是停用词。移除它们实际上非常简单:

> words <- words %>% **anti_join(stop_words)**
> words %>% group_by(word) %>% summarise(count=n()) %>% arrange(desc(count))
# A tibble: 4,496 x 2
      word count
     <chr> <int>
 1  people   157
 2  design   123
 3    time   110
 4   music   107
 5 playing    97
 6     car    66
 7    yeah    66
 8    feel    56
 9    idea    50
10   world    50
# ... with 4,486 more rows

现在引起我注意的是“音乐”这个词是第四个最常用的词。据我回忆,除了第三集有 Ev Devlin,这个系列没有太多关于音乐的内容。当我在文本编辑器中打开由 TTML 文件生成的标签限定的文件,并搜索“音乐”时,这个词出现频率如此之高的原因对我来说变得很清楚。字幕中提到了很多背景音乐,例如,我仅在第一集就发现了以下短语:

[电子音乐继续播放],[电子音乐结束],[不祥的音乐播放],[平静的音乐播放],[乐观的钢琴音乐播放],[爵士音乐播放],[电子音乐播放],[电子音乐继续],[编钟音乐播放],[平静的音乐播放],[平静的音乐继续],[编钟音乐播放],[乐观的音乐播放],[器乐播放]

我使用正则表达式从脚本中删除这些短语,并重复上面的步骤来获得单词及其计数:

> d$script <- gsub('\\[(?:\\w+\\s){0,3}music(?:\\s\\w+){0,3}\\]', "", d$script, perl=T)
> words <- unnest_tokens(d, word, script)
> words <- words %>% anti_join(stop_words)
> words %>% group_by(word) %>% summarise(count=n()) %>% arrange(desc(count))
> words
# A tibble: 4,485 x 2
     word count
    <chr> <int>
 1 people   157
 2 design   123
 3   time   110
 4    car    66
 5   yeah    66
 6   feel    56
 7   idea    50
 8  world    50
 9  ralph    49
10   love    48
# ... with 4,475 more rows

好多了。一旦我们有了单词和它们的数量,制作单词云就很容易了:

> library(wordcloud)
> words %>% count(word) %>% with(wordcloud(word, n, max.words=50, min.freq=5, color='purple4', random.order=F))

每集制作一个单词云同样简单:

> par(mfrow=c(2,4))
> colors <- c("blue","green4","green","gold","orange","orange3","red","red3")
> for (i in 1:8) {
    words %>% filter(episode == i) %>% count(word) %>% with(wordcloud(word, n, max.words=50, min.freq=5,color=colors[i],random.order=F))
}

这里还可以做更多的事情——例如,请注意,在廷克·哈特菲尔德的单词 cloud 中,单词 shoe 和 shoes 重复出现——我们可以在绘制单词 cloud 之前通过单数化这些单词来解决这个问题。

如果你对用 R 分析文本感兴趣,我强烈推荐用 R 进行文本挖掘:一种整洁的方法这本书。

更新:我发现了为什么read.csv跳过了前五行——文件中的大量引号与其默认的引用行为产生了不良影响。因此,如果您更愿意使用read.csv而不是fread,请将quote参数设置为空字符串:

d <- read.csv("~/proj/abstract.tsv", sep="\t", **quote=""**, as.is=T)

使用 Docker、Python 和 PostgreSQL 进行地理空间分析的工作环境

原文:https://towardsdatascience.com/a-working-environment-for-geospatial-analysis-with-docker-python-and-postgresql-670c2be58e0a?source=collection_archive---------5-----------------------

这是我寻找一个存储、处理和可视化地理空间数据的工作环境的简短版本。它涉及到一个在本地运行的 PostgreSQL 服务器,一个带有 GDAL 和带有 Python3 用作解释器的py charm Professional,一个本地安装的QGIS(非必需)。

目标

本文的重点是创建一个 Docker 映像,它可以用作工作环境。它可以被认为是一种扩展的 Python 虚拟环境,我们在其中安装 Python、它的包以及作为操作系统一部分的其他库。

My work environment on a Mac OSX. On the local host, I installed PostgreSQL and QGIS with Homebrew. For GDAL, Python3 and all its packages, I use a Docker container. PyCharm links all these pieces together under one single umbrella.

在这种特殊情况下,我的目标是:

  • 存储 PostgreSQL 数据库中的地理空间数据,并能够使用 Python 和 QGIS 进行查询;
  • 使用 ogr2ogr 和其他 GDAL 功能,能够读取、转换和写入各种地理空间格式;
  • 能够编写 Python 代码,并在 Python shell 中进行现场测试;
  • graph-tool进行图形分析。

参考文献

在下面由 Hamel Husain 撰写的精彩文章中,可以找到关于 Docker 的良好指南,以及为什么在数据科学项目中使用 Docker 是一种良好的做法。

** [## Docker 如何帮助您成为更高效的数据科学家

在过去的 5 年里,我听到了很多关于码头集装箱的传言。似乎我所有的软件工程…

towardsdatascience.com](/how-docker-can-help-you-become-a-more-effective-data-scientist-7fc048ef91d5)

我的部分解决方案基于他的教程,我建议你在继续之前先阅读它,尤其是如果你不熟悉 Docker 的话。

以 Python 包的形式出现,但更像是 C 库的 Python 包装器。在虚拟环境中安装是一件非常令人头疼的事情,而且几乎是不可能的。

编辑:graph-tool现在在homebrew上,这让生活变得更容易。如果想在虚拟环境中使用,一个办法是安装在系统的 Pyhton (2.7 或 3.5+)中,用virtualenv --systam-site-packages复制系统包,创建一个虚拟环境。

GDAL(地理空间数据抽象库)是一个栅格和矢量地理空间数据格式的翻译库。这是精通地理分析的工具箱中必不可少的元素。众所周知,设置起来很痛苦。

homebrew是 MacOS 的软件包管理器

鉴于这些前提,我想我会分享我的经验,把一切放在一起。你可以在我的 Github repo 里找到文件。

要求

我假设你在安装了[homebrew](https://brew.sh/)[docker 17.09](https://docs.docker.com/engine/installation/)的 Mac OSX 上。

你还应该了解 Docker(你可能不会在这里,否则……),能够使用终端,并知道 Ubuntu 外壳和apt-get的螺母和螺栓。

一个不幸的注意:只有专业版的 PyCharm 可以远程虚拟环境,因此 PyCharm 社区版(免费版)将无法与 Docker 一起工作。

我们要做什么

以下是本教程中的步骤:

  • brew安装 PostgreSQL 和 QGIS(实际上,QGIS 并不是严格必要的,它只是一个额外的好处)
  • 创建一个 Ubuntu 17.10 Docker 镜像(我将用斜体书写 Docker 领域特有的术语),用 Python3 安装一些有用的包和 GDAL 库(这一步可以定制为包含任何相关的 Python 包)。
  • 根据上面的图片打开一个交互式 Docker 容器并手动安装graph-tool来更进一步。
  • 将结果提交给 Docker 映像
  • 设置 PyCharm Professional 使用 Docker 映像作为解释器,并创建一个共享文件夹,以便能够从映像来回读取/写入数据。
  • 用 Postgresql 连接 Python。

你可以在这个 Github 仓库中找到本教程需要的一些文件。

有很多东西。让我们开始吧。

PostgreSQL 安装

有了homebrew,PostgreSQL 的安装相当容易。从系统终端:

$ brew install postgresql

安装后,使用以下命令启动服务器:

$ brew services start postgresql

检查状态:

$ brew services list

停止服务器:

$ brew services stop postgresql

在 Docker 中创建一个 Python 环境

第一步是创建一个 Docker 图像。从 Mac OSX 终端创建一个新目录:

$ mkdir MyDockerImages

输入目录:

$ cd myDockerImages

创建一个名为 Dockerfile 的文件:

$ touch Dockerfile

将以下内容复制粘贴到Dockerfile(解释见评论):

请注意目录/ds的创建:稍后将使用它在 Docker 映像主机(您的本地计算机)之间共享数据。

有了这个 Docker 文件,我们现在可以构建一个 Docker 映像:

$ docker build -t my_env -f ./Dockerfile ./

安装

安装graph-tool的详细说明可以在这里找到。

要安装的行graph-tool可能已经包含在 Dockerfile 文件中。但是由于在安装过程中可能会要求您从 bash shell 中输入一些信息,所以我没有找到比从通过交互运行 Docker 映像创建的 bash 中手动安装它更好的方法。

关键步骤是:

  • 添加一个. list 文件,链接到托管graph-tool的服务器,这样apt-get就知道在哪里寻找。
  • 根据安装说明中提供的公钥验证软件包。
  • 运行apt-get update并安装软件包。

使用选项-it交互运行容器:

$ docker run -it my_env

从容器内部看,Ubuntu bash 应该类似于:

root@539265d4463b

请注意@后面的数字,因为那是容器的 ID,我们将在几行中将其用作 CONTAINERID。在容器的 bash 中,键入:

Bash script for a Ubuntu Docker container to install graph-tool.

graph-tool现在已经安装好了,我们只需要提交对映像的更改,这样当我们关闭容器时它们就不会丢失:

$ docker commit -m "My note" -a "theAuthor" CONTAINERID my_env

用 PyCharm 连接一切

我的工作流程是大量的试验和错误,我经常测试短代码行,检查数据或一些 Python 元素的类型。为此,我需要一个混合的代码编辑器和交互式外壳。PyCharm 除了提供一种构建项目和文件夹的方法,还提供了一种在两者之间来回跳转的简单方法。

我们将使用我们命名为“my_env”的 Docker 映像作为 PyCharm 2017 Professional 中的一个项目的解释器,以便我们可以使用我们刚刚安装的所有包和功能。在这里你可以找到这个话题的官方文档。

打开 PyCharm 并创建一个新项目。请注意,由于当前 PyCharm 的限制,此时您不能直接添加 Docker 图像作为解释器,如这里的所解释的。我们需要首先使用一个系统解释器,然后改变它。我们先用系统解释器打开项目,然后进入 py charm/Preferences/Project/Project Interpreter,选择“添加远程”。

选择“Docker ”,并在下图中输入缺少的信息。

最后一步是创建一个链接,在主机(您的计算机)和 Docker 映像之间共享数据。这将允许我们读取/保存文件,如 csv、图像、图表等。从菜单“PyCharm/Preferences/Build,Execution,Deployment/”转到 Docker 并添加一个“路径映射”。

创建“路径映射”时,会要求您给出一个“虚拟机路径”,在我们的例子中是/ds(参见 Docker 文件,当我们创建 Docker 映像时),以及一个本地路径,这是您希望用来存储数据的项目数据文件夹。

将 Python 连接到 PostgreSQL

为了从 Docker 镜像连接到主机上的服务器,我们将使用 Mac 特定的 DNS 名称docker.for.mac.localhost,如这里的所解释的。其实在 Python 中把连接字符串中的' localhost '替换成' docker.for.mac.localhost '就够了。下面是一个使用psycopg2创建连接、运行简单查询并获取结果的例子:

PostgreSQL connection test in Python3.6.

奖励课程:QGIS 安装

对于 QGIS,我们首先需要将一些必需的包安装到系统 Python 中。从系统终端:

$ pip install psycopg2 requests future jinja2 pygments

如果要安装特定的支持,请检查软件包选项:

$ brew info qgis2

安装 QGIS 2.18(即将推出 3 版):

$ brew install qgis2

创建应用程序的符号链接,以便图标会出现在应用程序文件夹中:

$ ln -s /usr/local/Cellar/qgis2/2.18.14/QGIS.app /Applications

公开

我与 JetBrains 的 PyCharm 团队没有工作或任何联系,我实际上是一个付费用户。

请保持联系!

我很想听到你的评论,请联系: Twitter , Github , Linkedin 。**

大学毕业后作为数据科学家的一年:诚实的回顾

原文:https://towardsdatascience.com/a-year-as-a-data-scientist-right-after-college-an-honest-review-40509d07ca04?source=collection_archive---------0-----------------------

我大学毕业后开始从事数据科学家的工作已经有一年左右了。我带着很多不同的期望来到这里,以下是我的想法。

数据科学确实是一个回报丰厚的领域,并且有其利弊。鉴于我有限的经验和知识,我建议你对我的观点持保留态度。

简要背景

在进一步帮助你理解我来自哪里之前,我想简单介绍一下我的背景。

从学生时代起,我就喜欢做数学,并学会了基本编程。后来,我在孟买的 IIT 大学学习电子工程。毕业后,我加入了一家专门从事人工智能的咨询公司,在那里我为印度和欧洲的客户从事数据科学项目。

我必须说我仍处于学习的初级阶段。我有时确实会犯错误,我会想:这些年来我学到了什么?

我学得越多,就越发现自己懂得越少。-苏格拉底

观察/评论(未经验证的假设)

作为一名数据科学家,你不控制数据,你给它一个形状,以便它能更好地表达自己。

1.数据科学真的很有趣,如果…

数据科学是一份难得的工作,你可以一起做所有很酷的事情:数学、编码和研究。一份你可以在早上看研究论文,下午写下算法,晚上编码的工作。真的很好玩!几天前我去母校参观时,一个大三学生问我:我该如何描述我的工作经历?,到哪瞬间嘴里就冒出了回答:

这就像做作业获得报酬一样!

但是这里有一个问题:你必须做“一些”数学、编码和研究。你既不能离开它,也不能深入它。在某些情况下,您可能不需要阅读任何研究论文,您可以直接使用代码库并开始实现。考虑到时间限制,你唯一有机会深入了解的部分就是数据准备(以及要做的演示,如果有的话)。

如果你是一个热爱编码的人,并且想尽可能多地去做,那么数学会把你的脑袋咬掉。你将没有机会展示你的忍者编码技能。作为一个热爱代码的数据科学家,你只有两个选择:要么数学征服你,要么你征服它。如果你是一个喜欢解决复杂问题的数学爱好者,那么数据准备和单调的编程会让你厌烦得要死。我喜欢的类比是:

想象一下,如果有人给你一个订书机,并把你送到一个堆满文件的房间去订购和装订,你会有什么感觉?这就是数据清理过程的感觉。

有时您可能会觉得,如果其他人可以做数据准备工作,您就可以围绕它构建模型,但不幸或幸运的是,它并不这样工作。

有人可能会说,你不喜欢的东西只占工作的一小部分,但事实是,它往往会对你的工作产生不成比例的影响(阅读帕累托原则)。

维持数据科学的方法是在编码和数学/研究之间找到正确的平衡。最重要的是,在保持专注于获得结果的同时,欣赏你工作的不同方面。

此外,数据科学是一个不断发展的领域,没有明确的成功指南,需要大量的努力工作,不断学习,最重要的是忘记(你不知道什么时候“最好”会变成“最好”)。

总结一下:

  • 优点:数据科学让你同时处理许多有趣的东西:代码、数学、研究,有时还包括演示
  • 反对:数据科学可能不允许你深入研究它的任何一个方面

2.数据科学更多的是“商业”而不是“科学”

“名字里有什么?”一位智者问道。两个答复呼应:

  • “没什么。”哲学家说
  • “一切。”说,有一手

该行业的数据科学家不同于在欧洲粒子物理研究所或 ISRO 工作的科学家。数据科学家“实际”做的是应用科学技术为企业创造价值。数据科学家的工作不仅仅是找到最佳解决方案,而是找到易于解释和销售的解决方案。

在数据科学中,当遇到相互竞争的假设时,业务逻辑往往胜过科学逻辑。

人工智能的知识,尤其是它的子领域机器学习,足以让你起步,但不足以让你领先。

要在数据科学项目中脱颖而出,“科学”是不够的,您还需要了解经济学和市场营销,以完成您的工作并为企业创造价值。

3.数据科学家的工作很有影响力,但就像任何“其他”工作一样

作为一名数据科学家,你有“潜力”产生巨大的“影响”,但作为一名教师、软件工程师、记者或销售人员,你也有这样的“潜力”。

毫无疑问,数据科学正在改变我们的世界,但作为一名数据科学家,你可以发挥关键作用和“影响力”的领域很少。

数据科学作为一个谜在互联网上流传,以“改变”世界,但并不总是正确的。

此外,“影响”一词非常主观,有许多重要方面,例如:

  • 它有/创造了多少货币价值
  • 谁会受益最大
  • 你在其中的角色是多么独特和重要
  • 它自我延续到什么程度

你想要的那种“影响”,一个互联网正在谈论的,以及企业能为你提供的机会,可以是非常不同的。

如果你是一个聪明而雄心勃勃的人,进入数据科学领域是为了产生“影响”,请确保你“适合”该领域,并且你对影响的定义与该业务可以为你提供的影响一致。

4.当今的经济支配着数据科学

时至今日,数据科学家是一个“热门”工作,许多招聘人员定期联系你,看你是否愿意跳槽的情况并不少见。数据科学家在组织内受到很多尊重,薪酬丰厚。

如果金钱是你的主要动机,我不建议你成为一名数据科学家。

如果你只是为了钱而从事数据科学,请注意,同样的经济学迟早会让高薪消失。只有你对这个领域的兴趣才能让你坚持下去。

5.作为垫脚石的数据科学家的经验

作为一名数据科学家,可以帮助你为数据驱动的世界奠定坚实的基础,并更现实地评估人工智能相关技术的局限性和力量。

即使你选择远离动手工作,数据科学家的经验对你未来的努力也是有价值的。其中一些是:

  • 学术研究(硕士/博士/博士后/独立):数据科学家的大量时间都花在做实验、阅读科学论文和与同事讨论想法上。所有这些活动都可以证明是做研究的宝贵资产。

  • 初创公司:当然,你可以在人工智能初创公司从事技术工作,或者在成为数据科学家后创办自己的公司。但是,你也可以在人工智能初创公司中担任非技术角色,如销售、商业规划或金融。您的知识可以帮助您更好地理解并向客户销售产品,估计项目成本和需求,最重要的是不要觉得自己是局外人。在获得数据科学家的经验后,你可能会有各种各样的原因想从事非技术岗位的工作,其中一个原因可能是,你需要查看任何成功的科技公司的高管团队中定期编写代码的人数。

  • 政府和全球组织:政府越来越关注人工智能系统对社会的影响,以及如何最好地利用它们促进可持续发展。你可以利用你的数据科学家的经验来从事与人工智能政策相关的工作,这需要对人工智能有一个复杂的理解,以制定对社会最有利的政策和法规。

注意:这些是我的个人观点,你可能同意也可能不同意。我的意图不是写理想的数据科学家的工作是什么样子,或者“应该”如何进行数据科学,甚至不是描述谁是数据科学家。这些是我想分享的几个重要观点,是我在大学毕业后作为“数据科学家”工作一年时学到的。

你的经历可能与我上面描述的非常不同。我鼓励你在下面的评论中分享你的经历,或者单独写下来。对于想要深入挖掘数据科学的人来说,这将是很大的帮助。

如果你喜欢这篇文章,请关注我,获取更多关于人工智能、哲学和经济学的文章。

计算机视觉一年——第 1 部分,共 4 部分

原文:https://towardsdatascience.com/a-year-in-computer-vision-part-1-of-4-eaeb040b6f46?source=collection_archive---------1-----------------------

—第一部分:分类/定位、目标检测&目标跟踪

简介

计算机视觉通常指的是赋予机器视觉能力的科学学科,或者更生动地说,使机器能够从视觉上分析它们的环境和其中的刺激。这个过程通常涉及对一个图像、多个图像或视频的评估。英国机器视觉协会(BMVA)将计算机视觉定义为“,从单一图像或图像序列中自动提取、分析和理解有用信息。【1】

术语理解为视觉的其他机械定义提供了一个有趣的对比点,它用来展示计算机视觉领域的重要性和复杂性。仅仅通过视觉表现是无法真正理解我们的环境的。相反,视觉线索通过视神经传播到初级视觉皮层,并由大脑以高度风格化的方式进行解释。从这种感官信息中得出的解释包含了我们自然编程和主观体验的几乎全部,即进化如何让我们生存下来,以及我们一生中对世界的了解。

在这方面,视觉只与图像的传输有关,用于解释;而计算所述图像更类似于思维或认知,利用了大脑的多种能力。因此,许多人认为,计算机视觉是对视觉环境及其背景的真正理解,由于其跨领域的掌握,它为强人工智能的未来迭代铺平了道路。

然而,放下干草叉,因为我们仍然处于这个迷人领域的萌芽阶段。这篇文章旨在展示 2016 年最大的计算机视觉进步。并希望将这些进步建立在预期的近期社会互动和我们所知的生命终结的半开玩笑的预言的健康结合上。

虽然我们的作品总是写得尽可能容易理解,但由于主题的原因,这一特定作品中的部分有时可能是倾斜的。我们确实从头到尾提供了基本的定义,但是,这些仅仅传达了对关键概念的浅显理解。为了将我们的重点放在 2016 年的工作上,为了简洁起见,经常会有省略。

一个明显的遗漏与卷积神经网络(下文称为 CNN 或 ConvNets)的功能有关,卷积神经网络在计算机视觉领域中无处不在。AlexNet[2]在 2012 年的成功,一个让 ImageNet 竞争对手措手不及的 CNN 架构,证明是该领域事实上的革命的煽动者,许多研究人员采用基于神经网络的方法作为计算机视觉新时代“正常科学”的一部分。[3]

四年后,CNN 的变体仍然构成了视觉任务的新神经网络架构的主体,研究人员像乐高积木一样重建它们;开源信息和深度学习力量的有效证明。然而,对 CNN 的解释可以很容易地跨越几个帖子,最好留给那些在这个主题上有更深的专业知识和使复杂的东西可以理解的亲和力的人。

对于希望在继续之前快速了解基础知识的普通读者,我们推荐下面的前两个资源。对于那些希望更进一步的人,我们订购了以下资源来帮助他们:

深度神经网络如何看待你的#自拍Andrej Karpathy 是我们帮助人们理解 CNN 背后的应用和功能的最爱之一。[4]

Quora:“什么是卷积神经网络?”— 不缺很棒的链接和解释。特别适合那些没有事先了解。[5]

来自斯坦福大学的 CS231n:用于视觉识别的卷积神经网络是获得更多深度的优秀资源。[6]

深度学习 (Goodfellow,Bengio &库维尔,2016)在第九章中提供了 CNN 特性和功能的详细解释。该教材由作者以 HTML 格式免费提供。[7]

对于那些希望了解更多关于神经网络和深度学习的人,我们建议:

神经网络和深度学习(尼尔森,2017 年)是一本免费的在线教科书,它为读者提供了对神经网络和深度学习复杂性的真正直观的理解。即使只是完成了第一章,对于第一次接触的人来说,也能很好地阐明这篇文章的主题。[8]

作为一个整体,这部作品是不连贯和断断续续的,反映了作者的兴奋和精神,这是打算利用它,一节一节。使用我们自己的启发和判断来划分信息,这是一种必要的妥协,因为所介绍的大部分工作都受到跨领域的影响。

我们希望读者从我们在这里收集的信息中受益,不管他们以前有什么经验,都可以加深自己的知识。

来自我们所有的贡献者,

米槽

分类/本地化

当涉及图像时,分类的任务通常是指给整个图像分配一个标签,例如“猫”。假设这一点,则定位可以指找到对象在所述图像中的位置,通常由对象周围的某种形式的边界框的输出来表示。ImageNet[9]上当前的分类技术很可能已经超越了一群训练有素的人。[10]由于这个原因,我们更加重视博客的后续部分。

图 1: 计算机视觉任务

Source: Fei-Fei Li, Andrej Karpathy & Justin Johnson (2016) cs231n, Lecture 8 — Slide 8, Spatial Localization and Detection (01/02/2016). Available: http://cs231n.stanford.edu/slides/2016/winter1516_lecture8.pdf

然而,随着类别数量的增加,更大的数据集的引入[11]可能会在不久的将来为进展提供新的衡量标准。在这一点上,Keras 的创建者 Fran ois Chollet[12]已经将包括流行的 architecture Xception 在内的新技术应用于包含 17,000 个类别的超过 3.5 亿多标签图像的内部 google 数据集。[13,14]

图 2: 来自 ils vrc(2010–2016)的分类/本地化结果

Note: ImageNet Large Scale Visual Recognition Challenge (ILSVRC). The change in results from 2011–2012 resulting from the AlexNet submission. For a review of the challenge requirements relating to Classification and Localization see: http://www.image-net.org/challenges/LSVRC/2016/index#comp

来源:贾登(2016)。 ILSVRC2016 对象定位:简介,结果。幻灯片 2。可用:http://image-net . org/challenges/talks/2016/ils vrc 2016 _ 10 _ 09 _ cls loc . pdf

ImageNet LSVRC(2016)的有趣收获:

  • 场景分类是指给一幅图像贴上某种场景类别的标签的任务,比如“温室”、“体育场”、“大教堂”等。ImageNet 去年用 Places2[15]数据集的一个子集举行了一次场景分类挑战:用 365 个场景类别的 800 万幅图像进行训练。
    海康威视[16]凭借深度初始型网络和不太深的残差网络的组合,以 9%的前 5 名误差胜出。
  • Trimps-Soushen 以 2.99%的 top-5 分类误差和 7.71%的定位误差拿下 ImageNet 分类任务。该团队采用集成进行分类(对 Inception、Inception-Resnet、Resnet 和 Wide Residual Networks 模型的结果进行平均[17]),并基于标签使用更快的 R-CNN 进行定位。[18]数据集分布在 1000 个图像类中,有 120 万个图像作为训练数据。分割的测试数据进一步汇编了 10 万幅看不见的图像。
  • 脸书的 ResNeXt 以 3.03%的错误率位居第二,它使用了一种新的架构,扩展了原来的 ResNet 架构。[19]

目标检测

可以想象,物体检测的过程就是这样做的,检测图像中的物体。ILSVRC 2016[20]为对象检测提供的定义包括输出单个对象的边界框和标签。这不同于分类/定位任务,它将分类和定位应用于许多对象,而不仅仅是单个主要对象。

图 3 :以人脸为唯一类别的物体检测

Note: Picture is an example of face detection, Object Detection of a single class. The authors cite one of the persistent issues in Object Detection to be the detection of small objects. Using small faces as a test class they explore the role of scale invariance, image resolution, and contextual reasoning. Source: Hu and Ramanan (2016, p. 1)[21]

2016 年物体探测的主要趋势之一是向更快、更高效的探测系统转变。这在 YOLO、SSD 和 R-FCN 等方法中是显而易见的,这是朝着在整个图像上共享计算的方向发展。因此,区别于与快速/更快的 R-CNN 技术相关的昂贵的子网。这通常被称为“端到端培训/学习”,贯穿整篇文章。

基本原理通常是避免单独的算法孤立地关注它们各自的子问题,因为这通常会增加训练时间并降低网络精度。也就是说,这种网络的端到端适配通常发生在初始子网解决方案之后,因此是一种回顾性优化。然而,快速/更快的 R-CNN 技术仍然非常有效,并且仍然广泛用于对象检测。

  • SSD:单次多盒探测器【22】利用单个神经网络封装所有必要的计算,并消除了其他方法的昂贵提议生成。它实现了" 75.1%的 mAP,优于可比的更快的 R-CNN 模型(刘等,2016)。
  • 我们在 2016 年看到的最令人印象深刻的系统之一来自名为“ YOLO9000:更好、更快、更强”[23]的系统,它介绍了 YOLOv2 和 YOLO9000 检测系统。[24] YOLOv2 从 2015 年年中[25]起极大地改进了最初的 YOLO 模型,并能够在非常高的 FPS 下实现更好的结果(使用原始的 GTX 泰坦 X 在低分辨率图像上高达 90 FPS)。除了完成速度之外,在某些对象检测数据集上,该系统还优于具有 ResNet 和 SSD 的更快的 RCNN。
  • YOLO9000 实现了一种用于检测和分类的联合训练方法,将其预测能力扩展到可用的标记检测数据之外,即,它能够检测从未见过标记检测数据的对象。YOLO9000 模型提供了跨越 9000 多个类别的实时对象检测,缩小了分类和检测之间的数据集大小差距。更多细节、预训练模型和视频展示可点击此处获取。[26]

YOLOv2 Object Detection running on frames from James Bond with DragonForce

  • 用于对象检测的特征金字塔网络【27】来自 FAIR【28】,利用“深层卷积网络固有的多尺度、金字塔式层级结构,以边际额外成本构建特征金字塔,这意味着表现仍然强大,而不会影响速度或内存。林等人(2016)在 COCO 上实现了最先进的(以下简称)单一模型结果。[29]结合更快的 R-CNN 系统,击败了 2016 年获胜者取得的成绩。
  • R-FCN:通过基于区域的完全卷积网络进行物体检测【30】:这是另一种方法,通过使基于区域的检测器完全卷积并在整个图像上共享计算,避免在图像上应用昂贵的每区域子网络数百次。"我们的结果是在每幅图像 170 毫秒的测试时间速度下实现的,比更快的 R-CNN 同行快 2.5-20 倍"(戴等人,2016)。

图 4 :物体检测中的精度权衡

Note: Y-axis displays mAP (mean Average Precision) and the X-axis displays meta-architecture variability across each feature extractor (VGG, MobileNet…Inception ResNet V2). Additionally, mAP small, medium and large describe the average precision for small, medium and large objects, respectively. As such accuracy is “stratified by object size, meta-architecture and feature extractor” and “image resolution is fixed to 300”. While Faster R-CNN performs comparatively well in the above sample, it is worth noting that the meta-architecture is considerably slower than more recent approaches, such as R-FCN.

来源:黄等(2016 年第 9 期)[31]

黄等人(2016)[32]发表了一篇论文,对 R-FCN、SSD 和更快的 R-CNN 进行了深入的性能比较。由于围绕机器学习(ML)技术的准确比较的问题,我们想在这里指出产生标准化方法的优点。他们将这些架构视为“元架构”,因为它们可以与不同类型的特征提取器(如 ResNet 或 Inception)相结合。

作者通过改变元架构、特征提取器和图像分辨率来研究准确性和速度之间的权衡。例如,特征提取器的选择在元体系结构之间产生了很大的差异。

SqueezeDet[33]和 PVANet[34]的论文也证明了在保持实时商业应用(尤其是自动驾驶应用)所需精度的同时,使物体检测变得廉价和高效的趋势。而一家中国公司 DeepGlint 提供了一个很好的例子,即作为闭路电视集成的物体检测,尽管是以一种模糊的奥威尔方式:视频。[35]

DeepGlint Object Detection, Object Tracking and Face Recognition

ils vrc 和 COCO 检测挑战的结果

COCO36是另一个流行的图像数据集。然而,与 ImageNet 等替代方案相比,它相对更小,更精确,重点是在更广泛的场景理解背景下的对象识别。组织者举办了一年一度的目标检测、分割和关键点挑战赛。ILSVRC[37]和 COCO[38]检测挑战的检测结果如下:

ImageNet LSVRC 从图像中检测物体(DET): CUImage 66% meanAP。在 200 个物品类别中赢得了 109 个。

ImageNet LSVRC 视频对象检测(VID): NUIST 80.8%平均 AP

ImageNet LSVRC 从视频中检测目标并跟踪: CUvideo 55.8%平均 AP

COCO 2016 检测挑战赛(包围盒): G-RMI(谷歌)41.5% AP(比 2015 年冠军 MSRAVC 增加 4.2%绝对百分比)

在回顾 2016 年的检测结果时,ImageNet 表示,“MSRAVC 2015 为性能设立了非常高的标准[将 ResNets 引入竞争]。参赛选手在所有课程上的表现都有所提高。本地化在这两项挑战中都有很大提高。“小对象实例的高相对改进”(ImageNet,2016)。[39]

图 5 : ILSVRC 图像检测结果(2013–2016)

Note: ILSVRC Object Detection results from images (DET) (2013–2016). Source:ImageNet. 2016. [Online] Workshop Presentation, Slide 2. Available: http://image-net.org/challenges/talks/2016/ECCV2016_ilsvrc_coco_detection_segmentation.pdf

目标跟踪

指在给定场景中跟踪感兴趣的特定对象或多个对象的过程。传统上,它应用于视频和现实世界的交互中,在最初的物体检测之后进行观察;例如,这个过程对自动驾驶系统至关重要。

  • 用于目标跟踪的全卷积暹罗网络【40】将基本跟踪算法与暹罗网络相结合,端到端训练,实现 SOTA,并以超过实时的帧速率运行。本文试图解决传统在线学习方法缺乏丰富性的问题。
  • 使用深度回归网络学习以 100 FPS 进行跟踪【41】是另一篇试图通过在线训练方法改善现有问题的论文。作者制作了一种跟踪器,它利用前馈网络来学习围绕对象运动、外观和方向的一般关系,从而在没有在线训练的情况下有效地跟踪新对象。在标准跟踪基准上提供 SOTA,同时还管理“以 100 fps 的速度跟踪一般对象”(Held 等人,2016)。

GOTURN 视频(使用回归网络的通用对象跟踪)可用:视频【42】

  • 用于视觉跟踪的深度运动特征【43】融合手工制作的特征、深度 RGB/外观特征(来自 CNN)、深度运动特征(在光流图像上训练)实现 SOTA。虽然深度运动特征在动作识别和视频分类中很常见,但作者声称这是他们第一次用于视觉跟踪。该论文还因“计算机视觉和机器人视觉”主题获得了 2016 年 ICPR 最佳论文奖。

本文介绍了在检测跟踪框架中深度运动特征的影响的研究。我们进一步表明,手工制作,深 RGB 和深运动特征包含互补信息。据我们所知,我们是第一个提出融合外观信息和深度运动特征进行视觉跟踪的人。综合实验清楚地表明,我们的具有深度运动特征的融合方法优于仅依赖外观信息的标准方法。

  • 虚拟世界作为多对象跟踪分析的代理【44】解决了现有视频跟踪基准和数据集缺乏真实生活可变性的问题。该论文提出了一种用于真实世界克隆的新方法,该方法从零开始生成丰富的、虚拟的、合成的、照片般逼真的环境,具有全标签,克服了现有数据集中存在的一些无菌性。生成的图像自动标记有准确的地面实况,允许除对象检测/跟踪之外的一系列应用,例如深度和光流。
  • 使用全卷积网络的全局最优目标跟踪 [45]处理目标变化和遮挡,将这些作为目标跟踪中的两个根本限制。“我们提出的方法通过使用完全卷积网络解决了对象外观变化问题,并通过动态编程处理遮挡问题”(Lee 等人,2016)。**

在我们的网站上可以免费获得完整的出版物:www.themtank.org

我们鼓励读者通过我们自己的网站来查看这篇文章,因为我们包括嵌入的内容和简单的导航功能,使报告尽可能地动态。我们不通过我们的网站赚取收入,我们希望尽可能地让读者对我们的网站感兴趣和直观,所以我们衷心欢迎对我们的网站的任何反馈!

关注我们下期关于媒体的简介(第 2 部分,共 4 部分),以及即将到来的人工智能研究领域的内容。请随意将所有反馈和建议放在评论区,我们会尽快回复。或者,您可以通过以下方式直接联系我们:info@themtank.com

非常感谢,

M 坦克

按出现顺序排列的参考文献

全文可从以下网址获得:http://www . them tank . org/publications/a-year-in-computer-vision

1英国机器视觉协会(BMVA)。2016.什么是计算机视觉?【在线】可在:【http://www.bmva.org/visionoverview】T2【21/12/2016 访问】**

[2] Krizhevsky,a .,Sutskever,I .和 Hinton,G. E .,2012。使用深度卷积神经网络进行 ImageNet 分类, NIPS 2012:神经信息处理系统,内华达州太浩湖。可用:http://www . cs . Toronto . edu/~ kriz/imagenet _ class ification _ with _ deep _ 卷积. pdf

[3]库恩,T. S. 1962。科学革命的结构。第四版。美国:芝加哥大学出版社。**

[4]卡帕西,A. 2015。深度神经网络怎么看待你的#自拍。【博客】 安德烈·卡帕西博客。可用:http://karpathy.github.io/2015/10/25/selfie/【访问时间:21/12/2016】**

[5] Quora。2016.什么是卷积神经网络?【在线】可用:https://www . quora . com/What-is-a-convolutionary-neural-network【访问时间:21/12/2016】**

[6]斯坦福大学。2016.用于视觉识别的卷积神经网络。【在线】CS231n 。可用:http://cs231n.stanford.edu/【2016 . 12 . 21 访问】**

[7]古德费勒等人,2016 年。深度学习。麻省理工学院出版社。【在线】http://www.deeplearningbook.org/【访问时间:21/12/2016】注:第九章,卷积网络【可用:http://www.deeplearningbook.org/contents/convnets.html】**

[8]尼尔森,M. 2017。神经网络和深度学习。【在线】电子书。可用:http://neuralnetworksanddeeplearning.com/index.html【访问时间:2017 年 06 月 03 日】。**

[9] ImageNet 指的是计算机视觉的流行图像数据集。每年,参赛者都要参加一系列不同任务的竞赛,这些任务被称为 ImageNet 大规模视觉识别挑战(ILSVRC)。可用:http://image-net.org/challenges/LSVRC/2016/index

[10]参见 Andrej Karpathy 的“我在 ImageNet 上与 ConvNet 竞争时学到的东西”。这篇博客文章详细介绍了作者根据 ILSVRC 2014 数据集提供人类基准的旅程。错误率约为 5.1%,而当时最先进的 GoogLeNet 分类错误率为 6.8%。可用:http://karpathy . github . io/2014/09/02/what-I-learn-from-competing-against-a-convnet-on-imagenet/**

[11]参见本文后面的新数据集。

[12] Keras 是一个流行的基于神经网络的深度学习库:https://keras.io/

[13]乔莱,F. 2016。用于大规模图像分类的信息论标签嵌入。【在线】arXiv: 1607.05691 。可用:arXiv:1607.05691 v1**

[14]乔莱,F. 2016。例外:具有深度可分卷积的深度学习。【在线】 arXiv:1610.02357 。可用:arXiv:1610.02357 v2**

[15] Places2 数据集,可用细节:http://places2.csail.mit.edu/。另请参见新数据集部分。

[16]海康威视。2016.海康威视在 ImageNet 2016 挑战赛的场景分类中排名第 1。【在线】安全新闻台。可用:http://www . security news desk . com/海康威视-ranked-no-1-scene-class ification-imagenet-2016-challenge/【访问时间:20/03/2017】。**

[17]详见本出版物第四部分“剩余网络”。

[18]详情请见团队信息 Trimps-Soushen,来自:http://image-net.org/challenges/LSVRC/2016/results

[19]谢,s .,吉尔希克,r .,杜尔达,p .,涂,Z. &何,K. 2016。深度神经网络的聚合残差变换。【在线】 arXiv: 1611.05431 。可用:arXiv:1611.05431 v1**

[20] ImageNet 大规模视觉识别挑战赛(2016),第二部分,可用:http://image-net.org/challenges/LSVRC/2016/[访问日期:2016 年 11 月 22 日]

[21]胡与拉马南。2016.发现小脸。【在线】arXiv: 1612.04402。可用:arXiv:1612.04402 v1**

[22]刘等 2016。SSD:单次多盒探测器。【在线】arXiv: 1512.02325v5 。可用:arXiv:1512.02325 V5**

[23]法尔哈迪·雷德蒙,2016 年。YOLO9000:更好、更快、更强。【在线】arXiv: 1612.08242v1 。可用:arXiv:1612.08242 v1**

[24] YOLO 代表“你只看一次”。

[25]雷德蒙等人,2016 年。你只看一次:统一的,实时的物体检测。【在线】arXiv: 1506.02640 。可用:arXiv:1506.02640 V5**

[26]雷德蒙。2017.YOLO:实时物体检测。【网址】pjreddie.com可用:https://pjreddie.com/darknet/yolo/【访问时间:2017 年 01 月 03 日】。**

[27]林等 2016。用于目标检测的特征金字塔网络。【在线】arXiv: 1612.03144 。可用:arXiv:1612.03144 v1**

[28]脸书的人工智能研究

[29]上下文中的通用对象(COCO)图像数据集

[30]戴等 2016。R-FCN:通过基于区域的完全卷积网络的目标检测。【在线】arXiv: 1605.06409 。可用:arXiv:1605.06409 v2**

[31]黄等 2016。现代卷积目标探测器的速度/精度权衡【在线】arXiv: 1611.10012 。可用:arXiv:1611.10012 v1**

32 同上

[33]吴等 2016。SqueezeDet:用于自动驾驶实时目标检测的统一、小型、低功耗全卷积神经网络。【在线】arXiv: 1612.01051 。可用:arXiv:1612.01051 v2**

[34]洪等 2016。PVANet:用于实时对象检测的轻量级深度神经网络。【在线】arXiv: 1611.08588v2 。可用:arXiv:1611.08588 v2**

[35]迪格林官方。2016.格灵深瞳 CVPR2016。【在线】Youtube.com。可用:https://www.youtube.com/watch?v=xhp47v5OBXQ【访问时间:2017 年 01 月 03 日】。**

[36]可可——共同的共同对象。2016.【网址】可用:http://mscoco.org/【访问时间:2017 年 4 月 1 日】。**

[37] ILSRVC 的结果取自:ImageNet。2016.2016 年大规模视觉识别挑战赛。

**【网站】物体检测。可用:http://image-net.org/challenges/LSVRC/2016/results【访问时间:2017 年 4 月 1 日】。

[38] COCO 检测挑战结果取自:COCO-常见的常见对象。2016.检测排行榜【网站】mscoco.org。可用:http://mscoco.org/dataset/#detections-leaderboard【访问时间:2017 年 5 月 1 日】。**

[39] ImageNet。2016.[在线] 研讨会演示文稿,幻灯片 31。可用:http://image-net . org/challenges/talks/2016/eccv 2016 _ ils vrc _ coco _ detection _ segmentation . pdf【访问时间:06/01/2017】。

[40] Bertinetto 等人,2016 年。用于目标跟踪的全卷积暹罗网络。【在线】arXiv: 1606.09549 。可用:https://arxiv.org/abs/1606.09549v2**

**[41]赫尔德等人,2016 年。学习用深度回归网络以 100 FPS 跟踪。【在线】arXiv: 1604.01802 。可用:【https://arxiv.org/abs/1604.01802v2 ****

42 戴维·赫尔德。2016.GOTURN——一个神经网络跟踪器。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=kMhwXnLgT_I【访问时间:2017 年 3 月 3 日】。**

[43] Gladh 等人,2016 年。用于视觉跟踪的深度运动特征。【在线】arXiv: 1612.06615 。可用:arXiv:1612.06615 v1**

[44] Gaidon 等人,2016 年。虚拟世界作为多目标跟踪分析的代理。【在线】arXiv: 1605.06457 。可用:arXiv:1605.06457 v1**

[45] Lee 等人,2016 年。全卷积网络的全局最优目标跟踪。【在线】arXiv: 1612.08274 。可用:arXiv:1612.08274 v1**

计算机视觉一年——第 2 部分,共 4 部分

原文:https://towardsdatascience.com/a-year-in-computer-vision-part-2-of-4-893e18e12be0?source=collection_archive---------3-----------------------

—第二部分:细分、超分辨率/色彩/风格转换、动作识别

下面这篇文章摘自我们的研究团队最近编辑的关于计算机视觉领域的出版物。第一和第二部分目前可以通过我们的网站获得,其余部分(第三和第四部分)将在不久的将来发布。

未来几周将在我们的网站上免费提供完整的出版物,第 1-2 部分现在可以通过:【www.themtank.org】获得

我们鼓励读者通过我们自己的网站来查看这篇文章,因为我们包括嵌入的内容和简单的导航功能,使报告尽可能地动态。我们的网站不会给团队带来任何收入,只是为了让读者尽可能地感受到这些材料的吸引力和直观性。我们竭诚欢迎对演示的任何反馈!

请关注、分享和支持我们的工作,无论你喜欢的渠道是什么(请尽情鼓掌!).如有任何问题或想了解对未来作品的潜在贡献,请随时联系编辑:info@themtank.com

分割

计算机视觉的核心是分割过程,它将整个图像分成像素组,然后对这些像素组进行标记和分类。此外,语义分割更进一步,试图从语义上理解图像中每个像素的作用,例如,它是猫、汽车还是其他类型的类别?实例分割通过对不同的类实例进行分割,例如用三种不同的颜色标记三只不同的狗,从而进一步发展了这一点。这是目前自动驾驶技术套件中采用的大量计算机视觉应用之一。

也许,细分领域的一些最佳改进来自 FAIR,他们从 2015 年开始继续建立他们的 DeepMask 工作[46]。DeepMask 在对象上生成粗糙的“遮罩”,作为分割的初始形式。2016 年,Fair 推出了 SharpMask[47],它细化了 DeepMask 提供的‘masks’,纠正了细节的损失,改善了语义分割。除此之外,MultiPathNet[48]还识别每个掩膜所描绘的对象。

"要捕捉一般的物体形状,你必须对你正在看的东西有一个高层次的理解(深度蒙版),但是要精确地放置边界,你需要回顾低层次的特征,一直到像素(清晰度蒙版)。”—Piotr Dollar,2016。[49]

图 6: 展示公平技术的应用

Note: The above pictures demonstrate the segmentation techniques employed by FAIR. These include the application of DeepMask, SharpMask and MultiPathNet techniques which are applied in that order. This process allows accurate segmentation and classification in a variety of scenes. Source: Dollar (2016)[50]

视频传播网络【51】试图创建一个简单的模型,通过整个视频序列以及一些附加信息来传播在第一帧分配的精确对象遮罩。

2016 年,研究人员致力于寻找替代网络配置,以解决上述规模和本地化问题。DeepLab[52]就是这样一个例子,它为语义图像分割任务取得了令人鼓舞的结果。Khoreva 等人(2016 年)[53]基于 Deeplab 的早期工作(大约 2015 年),提出了一种弱监督训练方法,其结果与完全监督网络相当。

计算机视觉通过使用端到端网络进一步完善了有用信息的网络共享方法,减少了多个全方位分类子任务的计算需求。使用这种方法的两篇关键论文是:

  • 100 层提拉米苏【54】是一种全卷积 DenseNet,它以前馈方式将每一层与每一层连接起来。它还可以用更少的参数和训练/处理在多个基准数据集上实现 SOTA。
  • 全卷积实例感知语义分割【55】联合执行实例掩码预测和分类(两个子任务)。
    COCO 分段挑战冠军 MSRA。37.3% AP。
    从 2015 年 COCO 挑战赛 MSRAVC 绝对跃升 9.1%。

虽然用于实时语义分割的 DNN 架构 ENet【56】不属于这一类,但它确实证明了降低计算成本和为移动设备提供更多访问权限的商业价值。

我们的工作希望将尽可能多的这些进步与有形的公共应用联系起来。考虑到这一点,以下包含了 2016 年细分的一些最有趣的医疗保健应用;

  • 结肠镜图像腔内场景分割的基准【57】
  • 用于 MRI 皮质下分割的 3D 全卷积网络:一项大规模研究【58】
  • 使用去噪自动编码器的半监督学习用于脑部损伤检测和分割【59】
  • 三维超声图像分割综述【60】
  • 一种基于全卷积神经网络的结构化预测方法,用于视网膜血管分割【61】
  • 用于胶质母细胞瘤分割的三维卷积神经网络【62】

我们最喜欢的准医学分割应用之一是fusion net[63]——一种用于连接组学[64]中图像分割的深度完全残差卷积神经网络,以 SOTA 电子显微镜(EM)分割方法为基准。****

Semantic Segmentation applied to street views from a car

超高分辨率、风格转移和着色

并非所有的计算机视觉研究都是为了扩展机器的伪认知能力,通常,神经网络以及其他人工智能技术的虚构延展性有助于其他各种各样的新应用进入公共领域。去年在超分辨率、风格转换和色彩方面的进步占据了我们的空间。

超分辨率指的是从低分辨率图像估计高分辨率图像的过程,也是预测不同放大倍数下的图像特征,这是人类大脑几乎可以毫不费力地做到的事情。最初,超分辨率是通过双三次插值和最近邻等简单技术实现的。就商业应用而言,克服源自源质量的低分辨率限制和实现“CSI Miami”风格的图像增强的愿望推动了该领域的研究。以下是今年的一些进展及其潜在影响:

  • Neural Enhance【65】是 Alex J. Champandard 的创意,结合了四篇不同研究论文的方法来实现其超分辨率方法。

实时视频超分辨率在 2016 年也有两次值得注意的尝试;[66], [67]

  • RAISR: 谷歌的快速准确图像超分辨率[68]通过用低分辨率和高分辨率图像对训练过滤器,避免了神经网络方法的高成本内存和速度要求。RAISR 作为一个基于学习的框架,比竞争算法快两个数量级,并且与基于神经网络的方法相比,具有最小的内存需求。因此,超分辨率可扩展到个人设备。这里有个研究博客。[69]

图 7: 超分辨率 SRGAN 示例

Note: From left to right: bicubic interpolation (the objective worst performer for focus), Deep residual network optimised for MSE, deep residual generative adversarial network optimized for a loss more sensitive to human perception, original High Resolution (HR) image. Corresponding peak signal to noise ratio (PSNR) and structural similarity (SSIM) are shown in two brackets. [4 x upscaling] The reader may wish to zoom in on the middle two images (SRResNet and SRGAN) to see the difference between image smoothness vs more realistic fine details.
Source: Ledig et al. (2017) [70]

生成对抗网络(GANs)的使用代表了超分辨率的当前 SOTA:

  • SRGAN [71]使用经过训练的鉴别器网络来区分超分辨率和原始照片级逼真图像,在公共基准上从严重欠采样的图像中提供照片级逼真纹理。

从质量上来说,SRGAN 表现最好,尽管 SRResNet 在峰值信噪比(PSNR)度量方面表现最好,但 SRGAN 获得了更精细的纹理细节,并获得了最好的平均意见得分(MOS)。据我们所知,这是第一个能够推断出 4 倍放大因子的照片级自然图像的框架【72】所有之前的方法都无法在大的放大因子下恢复更精细的纹理细节。

  • 图像超分辨率的缓冲 MAP 推断【73】提出了一种使用卷积神经网络计算最大后验概率(MAP)推断的方法。然而,他们的研究提出了三种优化方法,目前 GANs 在真实图像数据上的表现都明显更好。

图 8 :尼库林&诺瓦克风格转移

Note: Transferring different styles to a photo of a cat (original top left).
Source: Nikulin & Novak (2016)

毫无疑问, Style Transfer 体现了神经网络的一种新用途,这种用途已经退入公共领域,特别是通过去年的 facebook 整合以及 Prisma [74]和 Artomatix [75]等公司。风格转移是一种更古老的技术,但在 2015 年随着艺术风格的神经算法的发表而转化为神经网络[76]。从那以后,风格转换的概念被 Nikulin 和 Novak [77]扩展,并应用于视频[78],这是计算机视觉中的常见进展。

图 9 :风格转移的进一步示例

Note: The top row (left to right) represent the artistic style which is transposed onto the original images which are displayed in the first column (Woman, Golden Gate Bridge and Meadow Environment). Using conditional instance normalisation a single style transfer network can capture 32 style simultaneously, five of which are displayed here. The full suite of images in available in the source paper’s appendix. This work will feature in the International Conference on Learning Representations (ICLR) 2017.
Source: Dumoulin et al. (2017, p. 2) [79]

一旦形象化,风格转移作为一个主题是相当直观的;拿一幅图像,想象它具有不同图像的风格特征。例如,以著名绘画或艺术家的风格。今年脸书发布了 Caffe2Go,[80]他们的深度学习系统集成到移动设备中。谷歌还发布了一些有趣的作品,试图融合多种风格来产生完全独特的图像风格:研究博客[81]和全文[82]。

除了移动集成,风格转移在游戏资产的创建中也有应用。我们团队的成员最近看了 Artomatix 的创始人兼首席技术官 Eric Risser 的演示,他讨论了该技术在游戏内容生成方面的新颖应用(纹理突变等)。)并因此极大地减少了传统纹理艺术家的工作。

着色是将单色图像转变为新的全彩色图像的过程。最初,这是由人们手工完成的,他们煞费苦心地选择颜色来代表每幅图像中的特定像素。2016 年,这一过程实现了自动化,同时保持了以人为中心的着色过程的真实感。虽然人类可能不能准确地表现给定场景的真实颜色,但是他们的真实世界知识允许以与图像和观看所述图像的另一个人一致的方式来应用颜色。

着色的过程很有趣,因为网络根据对物体位置、纹理和环境的理解为图像分配最可能的颜色,例如,它知道皮肤是粉红色的,天空是蓝色的。

在我们看来,今年最有影响力的三部作品如下:

  • 张等人发明了一种方法,能够在 32%的实验中成功愚弄人类。他们的方法堪比“着色图灵测试”[83]
  • Larsson 等人[84]使用深度学习进行直方图估计,使他们的图像着色系统完全自动化。
  • 最后,Lizuka、Simo-Serra 和 Ishikawa [85]展示了一个同样基于 CNN 的着色模型。这项工作超过了现有的 SOTA,我们[团队]觉得这项工作在质量上也是最好的,似乎是最现实的。图 10 提供了比较,但是图像取自 Lizuka 等人的文章。

图 10 :着色研究对比

Note: From top to bottom — column one contains the original monochrome image input which is subsequently colourised through various techniques. The remaining columns display the results generated by other prominent colourisation research in 2016. When viewed from left to right, these are Larsson et al. [84] 2016 (column two), Zhang et al. [83] 2016 (Column three), and Lizuka, Simo-Serra and Ishikawa. [85] 2016, also referred to as “ours” by the authors (Column four). The quality difference in colourisation is most evident in row three (from the top) which depicts a group of young boys. We believe Lizuka et al.’s work to be qualitatively superior (Column four). Source: Lizuka et al. 2016 [86]

此外,我们的架构可以处理任何分辨率的图像,不像大多数现有的基于 CNN 的方法。

在一项测试中,为了了解他们的色彩有多自然,用户从他们的模型中随机抽取一张图片,并被问及“你觉得这张图片看起来自然吗?”

他们的方法达到了 92.6%,基线达到了大约 70%,地面真实(实际的彩色照片)在 97.7%的时间里被认为是自然的。

动作识别

动作识别的任务指的是给定视频帧内动作的分类,以及最近的算法,该算法可以预测动作发生前仅给定几帧的交互的可能结果。在这方面,我们看到最近的研究试图将上下文嵌入算法决策,类似于计算机视觉的其他领域。这一领域的一些重要论文包括:

  • 动作识别的长期时间卷积【87】利用人类动作的时空结构,即特定的运动和持续时间,使用 CNN 变体正确识别动作。为了克服细胞神经网络对长期动作的次优时间建模,作者提出了一种具有长期时间卷积的神经网络(LTC-CNN)来提高动作识别的准确性。简而言之,LTCs 可以查看视频的更大部分来识别动作。他们的方法使用并扩展了 3D CNNs,“能够在更完整的时间尺度上表现动作”。

"我们报告了两个具有挑战性的人体动作识别基准 UCF101 (92.7%)和 HMDB51 (67.2%)的最新结果。**

  • 用于视频动作识别的时空残差网络 [88]将双流 CNN 的变体应用于动作识别任务,该网络结合了传统 CNN 方法和最近流行的残差网络(ResNets)的技术。双流方法的灵感来自视觉皮层功能的神经科学假设,即不同的路径识别物体的形状/颜色和运动。作者通过在两个 CNN 流之间注入剩余连接,结合了 ResNets 的分类优势。

"每个流最初独立执行视频识别,对于最终分类,softmax 分数通过后期融合进行组合。迄今为止,这种方法是将深度学习应用于动作识别的最有效方法,尤其是在训练数据有限的情况下。在我们的工作中,我们直接将图像转换为 3D 架构,并显示出比双流基线有很大提高的性能。”—在 UCF101 上为 94%,在 HMDB51 上为 70.6%。Feichtenhofer 等人对传统的改进密集轨迹(iDT)方法进行了改进,并通过使用这两种技术产生了更好的结果。**

  • 从未标记的视频中预测视觉表示【89】是一篇有趣的论文,尽管不是严格的动作分类。该计划预测的行动,很可能会发生给定一系列的视频帧前一秒钟的行动。该方法使用视觉表示,而不是逐像素分类,这意味着通过利用深度神经网络的特征学习属性,程序可以在没有标记数据的情况下运行[90]。

我们方法背后的关键思想是,我们可以训练深度网络来预测未来图像的视觉表现。视觉表示是一个有前途的预测目标,因为它们在比像素更高的语义级别上编码图像,但却是自动计算的。然后,我们将识别算法应用于我们预测的表示,以预测对象和动作。

Thumos 动作识别挑战赛的组织者发布了一篇论文,描述了过去几年中动作识别的一般方法。本文还概述了 2013 年至 2015 年的挑战、挑战的未来方向以及如何通过动作识别让计算机更全面地理解视频的想法。我们希望图莫斯行动认可挑战赛在(似乎)意外中断后于 2017 年回归。

跟随我们下期关于媒体的简介——第 3 部分,共 4 部分:走向对世界的 3D 理解。

请随意将所有反馈和建议放在评论区,我们会尽快回复。或者,您可以通过以下方式直接联系我们:info@themtank.com

完整版本可在:www.themtank.org/a-year-in-computer-vision获得

非常感谢,

M 坦克

按出现顺序排列的参考文献

[46]皮涅罗、科洛波特和多勒。2015.学习分割候选对象。【在线】arXiv: 1506.06204 。可用:arXiv:1506.06204 v2**

[47]皮涅罗等人,2016 年。学习细化对象段。【在线】arXiv: 1603.08695 。可用:arXiv:1603.08695 v2**

[48] Zagoruyko,S. 2016 年。用于目标检测的多路径网络。【在线】arXiv: 1604.02135v2. 可用:arXiv:1604.02135 v2**

[49]美元,第 2016 页。学习分段。【博客】交易会。可用:https://research.fb.com/learning-to-segment/**

[50]美元,第 2016 页。用 SharpMask 分割和细化图像。【在线】脸书码。可用:https://code . Facebook . com/posts/561187904071636/segmented-and-refining-images-with-sharp mask/**

[51] Jampani 等人,2016 年。视频传播网络。【在线】arXiv: 1612.05478 。可用:arXiv:1612.05478 v2**

[52]陈等,2016。DeepLab:使用深度卷积网络、阿特鲁卷积和全连接 CRF 的语义图像分割。【在线】arXiv: 1606.00915 。可用:arXiv:1606.00915 v1**

[53] Khoreva 等人,2016 年。简单易行:弱监督实例和语义分割。【在线】arXiv: 1603.07485v2. 可用:arXiv:1603.07485 v2**

[54]杰古等人,2016 年。一百层提拉米苏:用于语义分割的全卷积 DenseNets。【在线】arXiv: 1611.09326v2. 可用:arXiv:1611.09326 v2**

[55]李等 2016。完全卷积的实例感知语义分割。【在线】arXiv: 1611.07709v1 。可用:arXiv:1611.07709 v1**

[56] Paszke 等人,2016 年。ENet:一种用于实时语义分割的深度神经网络架构。【在线】arXiv: 1606.02147v1 。可用:arXiv:1606.02147 v1**

[57]巴斯克斯等人,2016 年。结肠镜图像腔内场景分割的基准。【在线】arXiv: 1612.00799 。可用:arXiv:1612.00799 v1**

[58] Dolz 等人,2016 年。MRI 皮质下分割的 3D 全卷积网络:一项大规模研究。【在线】arXiv: 1612.03925 。可用:arXiv:1612.03925 v1**

[59]亚历克斯等人,2017 年。使用去噪自动编码器的半监督学习用于脑损伤检测和分割。【在线】arXiv: 1611.08664 。可用:arXiv:1611.08664 v4**

[60]莫扎法里和李。2016.三维超声图像分割综述。【在线】arXiv: 1611.09811 。可用:arXiv:1611.09811 v1**

61 达斯古普塔和辛格。2016.基于全卷积神经网络的视网膜血管分割结构化预测方法。【在线】arXiv: 1611.02064 。可用:arXiv:1611.02064 v2**

[62]易等 2016。用于胶质母细胞瘤分割的三维卷积神经网络。【在线】arXiv: 1611.04534 。可用:arXiv:1611.04534 v1**

[63]全等 2016。FusionNet:用于连接组学中图像分割的深度全残差卷积神经网络。【在线】arXiv: 1612.05360 。可用:arXiv:1612.05360 v2**

[64]连接组学是指绘制生物神经系统内的所有连接,即神经元及其连接。

[65]尚标准,美国法学家委员会,2017 年。神经增强(2016 年 11 月 30 日最新提交)。【在线】Github 。可用:https://github.com/alexjc/neural-enhance【访问时间:2017 年 11 月 2 日】**

[66] Caballero 等人,2016 年。基于时空网络和运动补偿的实时视频超分辨率。【在线】arXiv: 1611.05250 。可用:arXiv:1611.05250 v1**

[67]石等,2016。使用有效的亚像素卷积神经网络的实时单幅图像和视频超分辨率。【在线】arXiv: 1609.05158 。可用:arXiv:1609.05158 v2**

[68]罗马诺等人,2016 年。RAISR:快速准确的图像超分辨率。【在线】arXiv: 1606.01299 。可用:arXiv:1606.01299 v3**

[69]米兰法尔,第 2016 页。增强!通过机器学习提高清晰图像。【博客】谷歌研究博客。可用:https://research . Google blog . com/2016/11/enhance-raisr-sharp-images-with-machine . html【访问时间:20/03/2017】。**

70 同上

[71]莱迪格等人,2017 年。使用生成对抗网络的照片级单幅图像超分辨率。【在线】arXiv: 1609.04802 。可用:arXiv:1609.04802 v3**

72 同上

[73]s nderby 等人,2016 年。图像超分辨率的缓冲 MAP 推理。【在线】arXiv: 1610.04490 。可用:arXiv:1610.04490 v1**

[74]普里斯马。2017.【网址】Prisma 。可用:https://prisma-ai.com/【访问时间:2017 年 01 月 04 日】。**

75 arto matix。2017.【网址】Artomatix 。可用:【https://services.artomatix.com/ 【访问时间:2017 年 1 月 4 日】。**

[76] Gatys 等人,2015 年。艺术风格的神经算法。【在线】arXiv: 1508.06576 。可用:arXiv:1508.06576 v2**

[77]尼库林&诺瓦克。2016.探索艺术风格的神经算法。【在线】arXiv: 1602.07188 。可用:arXiv:1602.07188 v2**

[78] Ruder 等人,2016 年。视频的艺术风格转换。【在线】arXiv: 1604.08610 。可用:arXiv:1604.08610 v2**

79 同上

[80]贾和瓦杰达。2016.在您的手掌中交付实时人工智能。【在线】脸书电码。可用:https://code . Facebook . com/posts/196146247499076/delivering-real-time-in-the-palm-of-your-hand/【访问时间:2017 年 1 月 20 日】。**

[81] Dumoulin 等人,2016 年。增压风格转移。【在线】谷歌研究博客。可用:https://research . Google blog . com/2016/10/supercing-style-transfer . html【访问时间:20/01/2017】。**

[82] Dumoulin 等人,2017 年。艺术风格的学术表现。【在线】arXiv: 1610.07629 。可用:arXiv:1610.07629 V5**

[83]张等,2016。彩色图像彩色化。【在线】arXiv: 1603.08511 。可用:arXiv:1603.08511 V5**

[84] Larsson 等人,2016 年。自动着色的学习表示。【在线】arXiv: 1603.06668 。可用:arXiv:1603.06668 v2**

**[85] Lizuka,Simo-Serra 和 Ishikawa。2016.要有色彩!:用于具有同时分类的自动图像彩色化的全局和局部图像先验的联合端到端学习。【在线】图形上的 ACM 事务(Proc。SIGGRAPH 的),35(4):110 。可用:【http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/en/ ****

86 同上

[87] Varol 等人,2016 年。动作识别的长时卷积。【在线】arXiv: 1604.04494 。可用:arXiv:1604.04494 v1**

[88] Feichtenhofer 等人,2016 年。用于视频动作识别的时空残差网络。【在线】arXiv: 1611.02155 。可用:arXiv:1611.02155 v1**

[89] Vondrick 等人,2016 年。预测来自未标记视频的视觉表示。【在线】arXiv: 1504.08023 。可用:arXiv:1504.08023 v2**

[90]康纳-西蒙斯,a .,戈登,R. 2016 年。教机器预测未来。【在线】麻省理工新闻。可用:https://news . MIT . edu/2016/teaching-machines-to-predict-the-future-0621【访问时间:03/02/2017】。**

[91] Idrees 等人,2016 年。“野外”视频动作识别的 THUMOS 挑战赛。【在线】arXiv: 1604.06182 。可用:arXiv:1604.06182 v1**

计算机视觉一年——第 3 部分,共 4 部分

原文:https://towardsdatascience.com/a-year-in-computer-vision-part-3-of-4-861216d71607?source=collection_archive---------5-----------------------

—第三部分:走向对世界的三维理解

下面这篇文章摘自我们的研究团队最近编辑的关于计算机视觉领域的出版物。第一、第二和第三部分目前可以通过我们的网站获得,剩下的第四部分将于下周一发布。

未来几周,完整的出版物将在我们的网站上免费提供,第 1-3 部分现在可通过:【www.themtank.org】获得

我们鼓励读者通过我们自己的网站来查看这篇文章,因为我们包括嵌入的内容和简单的导航功能,使报告尽可能地动态。我们的网站不会给团队带来任何收入,只是为了让读者尽可能地感受到这些材料的吸引力和直观性。我们竭诚欢迎对演示的任何反馈!

请关注、分享和支持我们的工作,无论你喜欢的渠道是什么(请尽情鼓掌!).如有任何问题或想了解对未来作品的潜在贡献,请随时联系编辑:info@themtank.com

介绍

计算机视觉的一个关键目标是从世界的 2D 观测中恢复潜在的 3D 结构。”—Rezende 等人(2016,第 1 页)[92]

如我们所见,在计算机视觉中,场景、物体和活动的分类,以及边界框和图像分割的输出是许多新研究的焦点。本质上,这些方法应用计算来获得图像的 2D 空间的“理解”。然而,批评者指出,3D 理解对于系统成功解释和导航真实世界是必不可少的。

例如,一个网络可以在一幅图像中找到一只猫,给它的所有像素着色,并将其归类为一只猫。但是,在猫的环境背景下,网络是否完全理解图像中的猫在哪里?

有人可能会说,计算机从上述任务中学到的关于 3D 世界的知识很少。与此相反,即使在检查 2D 图片时,人类也理解 3D 世界,即透视、遮挡、深度、场景中的对象如何相关等。将这些 3D 表示及其相关知识传授给人工系统代表了计算机视觉的下一个伟大前沿之一。这样想的一个主要原因是,一般来说;

场景的 2D 投影是组成场景的摄像机、灯光和对象的属性和位置的复杂函数。如果具有 3D 理解能力,代理可以从这种复杂性中抽象出来,形成稳定、清晰的表示,例如,在不同的光照条件下,或者在部分遮挡的情况下,识别出椅子是椅子,无论是从上面还是从侧面看。【93】

然而,3D 理解传统上面临几个障碍。第一个问题涉及“自身和正常遮挡”以及符合给定 2D 表示的大量 3D 形状。由于无法将相同结构的不同图像映射到相同的 3D 空间,以及在处理这些表示的多模态时,理解问题进一步复杂化[94]。最后,地面实况 3D 数据集传统上非常昂贵且难以获得,当与用于表示 3D 结构的不同方法结合时,可能导致训练限制。

我们认为在这一领域开展的工作值得关注。从未来 AGI 系统和机器人的早期理论应用,到增强、虚拟和混合现实中令人着迷的沉浸式应用,这些应用将在不久的将来影响我们的社会。我们谨慎地预测,由于利润丰厚的商业应用,计算机视觉领域将呈指数级增长,这意味着很快计算机可能会开始推理世界,而不仅仅是像素。

3D 对象

该第一部分是分散的,充当应用于用 3D 数据表示的对象的计算、从 2D 图像推断 3D 对象形状和姿态估计的总括;从 2D 图像确定物体的 3D 姿态的变换[95]。重建的过程也在下一节明确讨论它之前悄悄进行。但是,考虑到这几点,我们将展示在这一领域最让我们团队兴奋的工作:

  • OctNet:在高分辨率下学习深度 3D 表示 [96]延续了卷积网络的最新发展,卷积网络使用 3D 卷积对 3D 数据或体素(类似于 3D 像素)进行操作。OctNet 是“一种新颖的 3D 表示,它使具有高分辨率输入的深度学习变得易于处理”。作者通过“分析分辨率对几个 3D 任务的影响,包括 3D 对象分类、方向估计和点云标记”来测试 OctNet 表示这篇论文的主要贡献是利用了 3D 输入数据的稀疏性,从而能够更有效地利用内存和计算。
  • ObjectNet3D:用于 3D 对象识别的大规模数据库【97】——为 3D 对象识别提供数据库,呈现 100 个对象类别的 2D 图像和 3D 形状。我们数据库中[取自 ImageNet]的图像中的对象与[取自 ShapeNet 存储库]的 3D 形状对齐,这种对齐为每个 2D 对象提供了精确的 3D 姿势注释和最接近的 3D 形状注释。基线实验包括:区域建议生成、2D 目标检测、联合 2D 检测和三维目标姿态估计,以及基于图像的三维形状检索。
  • 3D-R2N2:单视图和多视图 3D 对象重建的统一方法【98】—使用来自任意视点的对象实例的单个或多个图像,以 3D 占据网格的形式创建对象的重建从对象的图像到 3D 形状的映射主要使用合成数据来学习,并且网络可以在不需要“任何图像注释或对象类别标签”的情况下进行训练和测试。该网络包括一个 2D-有线电视新闻网、一个三维卷积 LSTM(一种新创建的架构)和一个三维去卷积神经网络。这些不同的组件如何相互作用并被端到端地训练在一起,这是神经网络分层能力的完美例证。

****图 11:3D-r2n 2 功能示例

****Note: Images taken from Ebay (left) and an overview of the functionality of 3D-R2N2 (right). Source: Choy et al. (2016, p. 3) [99]

****来自来源的注释:我们[作者]希望重建的对象的一些样本图像——注意视图被一个大基线分开,对象的外观显示很少纹理和/或非朗伯的。(b)我们提出的 3D-R2N2 的概述:该网络将来自任意(未校准)视点的图像序列(或仅仅一个图像)作为输入(在该示例中,扶手椅的 3 个视图),并生成体素化的 3D 重建作为输出。随着网络看到对象的更多视图,重建被逐渐细化。

3D-R2N2 使用 ShapeNet 模型生成“渲染图像和体素化模型”,并在运动结构(SfM)和同步定位和映射(SLAM)方法通常失败的情况下促进 3D 对象重建:

我们的大量实验分析表明,我们的重建框架 I)优于单视图重建的最新方法,ii)在传统 SFM/SLAM 方法失败的情况下,能够实现对象的 3D 重建。

  • 从多个物体的 2D 视图进行的 3D 形状归纳【100】使用“投影生成对抗网络”(PRG ans),其训练深度生成模型,允许 3D 形状的精确表示,鉴别器仅显示 2D 图像。投影模块捕获 3D 表示,并在传递到鉴别器之前将它们转换成 2D 图像。通过迭代训练循环,生成器通过改进其生成的 3D 体素形状来改进投影。**

图 12 : PrGAN 架构段

Note from source: The PrGAN architecture for generating 2D images of shapes. A 3D voxel representation (323) and viewpoint are independently generated from the input z (201-d vector). The projection module renders the voxel shape from a given viewpoint (θ, φ) to create an image. The discriminator consists of 2D convolutional and pooling layers and aims to classify if the input image is generated or real.
Source: Gadhelha et al. (2016, p. 3) [101]

以这种方式,推理能力是通过无监督的环境学习的:

投影模块的添加使我们能够在学习阶段不使用任何 3D、视点信息或注释的情况下推断基本的 3D 形状分布。

此外,形状的内部表示可以插值,这意味着体素形状的离散共性允许从对象到对象的变换,例如从汽车到飞机。

  • 图像三维结构的无监督学习 [102]提出了一个完全无监督的生成模型,首次证明了“学习推断世界三维表示的可行性”。简而言之,DeepMind 团队提出了一个模型,该模型“学习 3D 结构的强大深度生成模型,并通过概率推理从 3D 和 2D 图像中恢复这些结构”,这意味着输入可以是 3D 和 2D。**

DeepMind 的强大生成模型运行在体积和基于网格的表示上。在 OpenGL 中使用基于网格的表示允许内置更多的知识,例如,光如何影响场景和使用的材料。使用基于 3D 网格的表示,并在循环中使用成熟的黑盒渲染器进行训练,可以学习物体的颜色、材料和纹理、灯光位置以及其他物体之间的相互作用[103]**

模型质量高,捕捉不确定性,并服从概率推理,允许在 3D 生成和模拟中的应用。该团队在 3D MNIST 和 ShapeNet 上实现了第一个 3D 密度建模的定量基准。这种方法表明,模型可以在 2D 图像上进行端到端的无监督训练,不需要地面真实的 3D 标签。

人体姿态估计和关键点检测

人体姿态估计试图找到人体部分的方向和配置。2D 人体姿态估计或关键点检测通常指的是定位人体的身体部位,例如找到膝盖、眼睛、脚等的 2D 位置。

然而,3D 姿态估计通过找到身体部位在 3D 空间中的方向而更进一步,然后可以执行形状估计/建模的可选步骤。在过去的几年里,这些子领域已经有了巨大的进步。

在竞争评估方面"COCO 2016 关键点挑战包括同时检测人和定位他们的关键点 "[104]。欧洲计算机视觉公约(ECCV) [105]提供了关于这些主题的更广泛的文献,但是我们想强调:**

  • 使用部分亲和场的实时多人 2D 姿态估计。[106]

这种方法以 60%的平均精度(AP)在首届 MSCOCO 2016 关键点挑战赛上创造了 SOTA 的表现,并在 ECCV 获得了最佳演示奖,视频:视频【107】

Realtime Multi-Person 2D Human Pose Estimation using Part Affinity Fields, CVPR 2017 Oral

  • 保持 SMPL:从单一图像自动估计三维人体姿态和形状【108】。该方法首先预测 2D 身体关节位置,然后使用另一个称为 SMPL 的模型来创建 3D 身体形状网格,这允许它理解 2D 姿势估计的 3D 方面。3D 网格能够捕捉姿态和形状,而以前的方法只能找到 2D 人的姿态。作者在这里提供了他们工作的精彩视频分析::视频 [109]

SMPLify: 3D Human Pose and Shape from a Single Image (ECCV 2016)

**我们描述了第一种从单幅无约束图像中自动估计人体的 3D 姿态及其 3D 形状的方法。我们估计了一个完整的 3D 网格,并显示仅 2D 关节就携带了惊人数量的关于身体形状的信息。这个问题很有挑战性,因为人体、关节、遮挡、服装、照明的复杂性,以及从 2D 推断 3D 的固有模糊性【110】。

重建

如前所述,前一节介绍了一些重建的例子,但一般侧重于对象,特别是它们的形状和姿态。虽然其中一些是技术上的重建,但是该领域本身包括许多不同类型的重建,例如场景重建、多视图和单视图重建、运动结构(SfM)、SLAM 等。此外,一些重建方法利用额外的(和多个)传感器和设备,例如事件或 RGB-D 相机,并且通常可以将多种技术分层以推动进展。

结果呢?整个场景可以无拘无束地重建,并随时间和空间而变化,例如,你自己和你的动作的高保真重建,实时更新。

如前所述,围绕 2D 图像到 3D 空间的映射仍然存在问题。以下论文介绍了大量创建高保真实时重建的方法:

  • Fusion4D:挑战场景的实时性能捕捉【111】转向计算机图形领域,然而,计算机视觉和图形之间的相互作用不能被夸大。作者的方法使用 RGB-D 和分割作为输入,以形成使用体素输出的实时多视图重建。****

图 13 :实时进给的融合 4D 实例

Note from source: “We present a new method for real-time high quality 4D (i.e. spatio-temporally coherent) performance capture, allowing for incremental non-rigid reconstruction from noisy input from multiple RGBD cameras. Our system demonstrates unprecedented reconstructions of challenging non-rigid sequences, at real-time rates, including robust handling of large frame-to-frame motions and topology changes.**

资料来源:窦等(2016 年第 1 期)[112]

Fusion4D 创建实时、高保真的体素表示,在虚拟现实、增强现实和远程呈现中具有令人印象深刻的应用。微软的这项工作很可能会给运动捕捉带来革命性的变化,很可能是在体育直播中。该技术在实时应用中的一个例子如下:视频 [113]

Fusion4D: Real-time Performance Capture of Challenging Scenes

关于微软网真/全息的惊人例子,请看这里:视频【114】

holoportation: virtual 3D teleportation in real-time (Microsoft Research)

  • 使用事件摄像机进行实时 3D 重建和 6 自由度跟踪【115】在 2016 年欧洲计算机视觉大会(ECCV)上获得最佳论文。作者提出了一种新的算法,能够使用单个事件摄像机实时跟踪 6D 运动和各种重建。

图 14 :实时三维重建示例

Note from source: Demonstrations in various settings of the different aspects of our joint estimation algorithm. (a) visualisation of the input event stream; (b) estimated gradient keyframes; © reconstructed intensity keyframes with super resolution and high dynamic range properties; (d) estimated depth maps; (e) semi-dense 3D point clouds. Source: Kim et al. (2016, p. 12) [116]

与传统摄像机相比,事件摄像机因其更短的延迟、更低的功耗和更高的动态范围而受到计算机视觉研究人员的青睐。事件摄像机输出的不是常规摄像机输出的帧序列,而是"一串异步尖峰,每个尖峰都有像素位置、符号和精确的定时,指示各个像素何时记录阈值对数强度变化。【117】**

有关事件摄像机功能、实时 3D 重建和 6 自由度跟踪的解释,请参见本文随附的视频:视频【118】

Real-Time 3D Reconstruction and 6-DoF Tracking with an Event Camera

当考虑到使用单个视点所涉及的实时图像渲染和深度估计时,这种方法令人难以置信:

我们提出了一种方法,该方法可以从单个手持事件摄像机执行实时 3D 重建,而无需额外的感测,并且在没有先验知识的非结构化场景中工作。

  • 用于单视图深度估计的无监督 CNN:拯救的几何学【119】提出了一种用于训练深度 CNN 的无监督方法,用于单视图深度预测,其结果可与使用监督方法的 SOTA 相比。用于单视图深度预测的传统深度 CNN 方法需要大量人工标记的数据,然而无监督方法通过消除这种必要性再次证明了它们的价值。作者通过使用立体声装备,以类似于自动编码器的方式训练网络,实现了这一点。****

其他未分类的 3D

  • im2 CAD【120】描述了将“图像转换为 CAD 模型”的过程,CAD 是指计算机辅助设计,这是一种用于为建筑描绘、工程、产品设计和许多其他领域创建 3D 场景的重要方法。

"给定一张房间的照片和一个大型家具 CAD 模型数据库,我们的目标是重建一个尽可能与照片中描绘的场景相似的场景,并由从数据库中提取的对象组成。**

作者介绍了一个自动系统,它“迭代优化对象的位置和比例”,以最佳匹配来自真实图像的输入。使用深度 CNN 训练的度量,渲染的场景对照原始图像进行验证。

图十五:im2 CAD 渲染卧室场景示例

Note : Left: input image. Right: Automatically created CAD model from input.
Note from source: The reconstruction results. In each example the left image is the real input image and the right image is the rendered 3D CAD model produced by IM2CAD.
Source: Izadinia et al. (2016, p. 10) [121]

为什么要在意 IM2CAD?作者解决的问题是劳伦斯·罗伯茨在 1963 年展示的技术的第一个有意义的进步之一,该技术允许使用已知对象数据库从照片中推断 3D 场景,尽管是在非常简单的线条画的情况下。

尽管罗伯特的方法很有远见,但半个多世纪以来对计算机视觉的后续研究仍然没有导致他的方法在现实图像和场景上可靠工作的实际扩展。”

作者介绍了该问题的一个变体,旨在使用从 3D 对象模型数据库中获取的对象来重建照片中的高保真场景。**

im2 CAD 背后的流程相当复杂,包括:

  • 一个完全卷积的网络,被端到端地训练以找到用于房间几何估计的几何特征。
  • 用于目标检测的快速 R-CNN。
  • 在图像中找到对象后,CAD 模型对准完成,以在 ShapeNet 存储库中找到与检测到的对象最接近的模型。例如,椅子的类型、给定的形状和近似的 3D 姿势。将每个 3D 模型渲染到 32 个视点,然后将其与在使用深度特征的对象检测中生成的边界框进行比较[122]。
  • 场景中的对象放置
  • 最后,场景优化通过优化渲染场景和输入图像的相机视图之间的视觉相似性来进一步改进对象的放置。

在这个领域,ShapeNet 再次证明了其价值:

"首先,我们利用 ShapeNet,它包含数百万个物体的 3D 模型,包括数千种不同的椅子、桌子和其他家居用品。这个数据集是 3D 场景理解研究的游戏改变者,也是我们工作的关键。**

  • 学习视频中的运动模式【123】提出使用合成视频序列来教导网络,以解决独立于摄像机运动确定物体运动的问题。“我们方法的核心是一个完全卷积的网络,它完全从合成视频序列及其真实光流和运动分割中学习。“作者在名为 DAVIS、【124】的新运动对象分割数据集以及 Berkeley 运动分割数据集上测试了他们的方法,并在两个数据集上实现了 SOTA。**
  • 深度图像单应性估计【125】来自 Magic Leap 团队,这是一家秘密的美国初创公司,从事计算机视觉和混合现实领域的工作。作者将单应性估计的任务重新分类为“一个学习问题”,并提出了形成“单应性网络的两种深度 CNN 架构:直接估计实值单应性参数的回归网络,以及产生量化单应性分布的分类网络。****

术语单应来自射影几何,指的是一种将一个平面映射到另一个平面的变换。从一对图像中估计 2D 单应性是计算机视觉中的一项基本任务,也是单目 SLAM 系统的重要组成部分**

作者还提供了一种从现有的真实图像数据集(如 MS-COCO)中产生“看似无限的数据集”的方法,这抵消了更深层网络的一些数据需求。他们设法通过将随机投影变换应用于大型图像数据集来创建几乎无限数量的标记训练样本。****

  • gvnn:几何计算机视觉的神经网络库【126】为 Torch 引入了一个新的神经网络库,Torch 是一个流行的机器学习计算框架。Gvnn 旨在“弥合经典几何计算机视觉和深度学习之间的差距”。gvnn 库允许开发者将几何能力添加到他们现有的网络和训练方法中。

在这项工作中,我们构建了最初在空间变换网络中提出的 2D 变换层,并提供了各种新颖的扩展来执行几何计算机视觉中经常使用的几何变换。

**“这开启了 3D 几何变换的学习不变性在位置识别、端到端视觉里程计、深度估计和通过针对图像重建误差的参数变换的扭曲的无监督学习中的应用。

3D 求和与 SLAM

在本节中,我们将在 3D 理解领域大展拳脚,主要关注姿态估计、重建、深度估计和单应性。但是有更多的优秀作品我们不会提及,因为我们受到数量的限制。因此,我们希望为读者提供一个有价值的起点,这绝不是绝对的。

大部分突出的作品可以归入几何视觉,这通常涉及直接从图像测量现实世界的量,如距离、形状、面积和体积。我们的启发是,基于识别的任务更多地关注更高层次的语义信息,而不是几何视觉中的典型应用。然而,我们经常发现 3D 理解的这些不同领域有着千丝万缕的联系。

最大的几何问题之一是同时定位和映射(SLAM),研究人员正在考虑 SLAM 是否会成为深度学习解决的下一个问题。对深度学习的所谓“普遍性”持怀疑态度的人有很多,他们指出 SLAM 作为一种算法的重要性和功能性:

"视觉 SLAM 算法能够在追踪摄像机位置和方向的同时,构建 3D 世界地图。【127】SLAM 方法的几何估计部分目前不适合深度学习方法,端到端学习仍然不太可能。SLAM 代表了机器人学中最重要的算法之一,并且是根据来自计算机视觉领域的大量输入而设计的。这项技术已经在谷歌地图、自动驾驶汽车、谷歌 Tango [128]等增强现实设备甚至火星车等应用中找到了自己的位置。**

也就是说,托马斯·马利西维茨提供了一些杰出研究人员在这个问题上的轶事聚合意见,他们同意“语义对于构建更大更好的 SLAM 系统是必要的。【129】这潜在地展示了深度学习在 SLAM 领域的未来应用前景。**

我们联系了 Plink and Pointy 的联合创始人马克·卡明斯(Mark Cummins),他向我们提供了他对这个问题的想法。Mark 在牛津大学获得了大满贯技术的博士学位:

"SLAM 的核心几何估计部分通过当前的方法得到了很好的解决,但是高级语义和低级系统组件都可以从深度学习中受益。具体来说:**

深度学习可以极大地提高地图语义的质量,即超越姿态或点云,全面理解地图中不同种类的对象或区域。这对于许多应用程序来说更加强大,并且也有助于一般的健壮性(例如通过更好地处理动态对象和环境变化)。

在较低的水平上,许多组件可能通过深度学习得到改进。明显的候选是位置识别/循环闭合检测/重新定位,稀疏 SLAM 方法的更好的点描述符等

总体而言,SLAM 解算器的结构可能保持不变,但组件有所改进。可以想象用深度学习做一些全新的事情,比如完全抛弃几何图形,拥有一个更加基于识别的导航系统。但对于目标是精确几何地图的系统来说,SLAM 中的深度学习可能更多地是改善组件,而不是做一些全新的事情。

综上所述,我们认为 SLAM 不太可能被深度学习完全取代。然而,随着时间的推移,这两种方法完全有可能相互补充。如果你希望了解更多关于 SLAM 及其当前 SOTA 的信息,我们全心全意地推荐 Tomasz Malisiewicz 的博客:实时 SLAM 和深度学习 vs SLAM 的未来 [130]

更新:2018 年 1-5 月。我们之前所说的可能与最近的一些研究略有矛盾,例如:

  • 从密集 3D 流中学习具有密集 3D 映射的单目视觉里程计
  • 主动神经定位
  • 利用基于注意力的递归网络进行全局姿态估计
  • 学习在没有地图的城市中导航

跟随我们下期关于媒体的简介——第 4 部分,共 4 部分:ConvNet 架构、数据集、不可组合的附加内容。

请随意将所有反馈和建议放在评论区,我们会尽快回复。或者,您可以通过以下方式直接联系我们:info@themtank.com

完整版本可在:www.themtank.org/a-year-in-computer-vision获得

非常感谢,

M 坦克

按出现顺序排列的参考文献

[92] Rezende 等人,2016 年。图像三维结构的无监督学习。【在线】arXiv: 1607.00662 。可用:arXiv:1607.00662 v1**

93 同上

94 同上

[95]姿态估计可以仅指对象的方向,或者指 3D 空间中的方向和位置。

[96]里格勒等人,2016 年。OctNet:学习高分辨率的深度 3D 表示。【在线】arXiv: 1611.05009 。可用:arXiv:1611.05009 v3**

[97]向等,2016。ObjectNet3D:用于 3D 对象识别的大规模数据库。【在线】斯坦福大学(cvgl.stanford.edu)计算机视觉和几何实验室。来自:http://cvgl.stanford.edu/projects/objectnet3d/**

[98] Choy 等人,2016 年。3D-R2N2:单视图和多视图三维物体重建的统一方法。【在线】arXiv: 1604.00449 。可用:arXiv:1604.00449 v1**

【99】同上

[100] Gadelha 等人,2016 年。从多个物体的 2D 视图归纳三维形状。【在线】arXiv: 1612.058272 。可用:arXiv:1612.05872 v1**

101 同上

[102] Rezende 等人,2016 年。图像三维结构的无监督学习。【在线】arXiv: 1607.00662 。可用:arXiv:1607.00662 v1**

[103]科尔耶,2017 年。图像三维结构的无监督学习。【博客】晨报。可用:https://blog . acolyer . org/2017/01/05/unsupervised-learning-of-3d-structure-from-images/【访问时间:2017 年 4 月 3 日】。**

[104]可可。2016.欢迎参加 COCO 2016 关键点挑战赛!【网上常见】常见的对象(mscoco.org)。可用:http://mscoco.org/dataset/#keypoints-challenge2016【访问时间:27/01/2017】。**

105 ECCV。2016.网页。【在线】欧洲计算机视觉公约(【www.eccv2016.org】)。可用:http://www.eccv2016.org/main-conference/【访问时间:26/01/2017】。****

[106]曹等,2016。使用局部相似场的实时多人 2D 姿态估计。【在线】arXiv: 161108050 。可用:arXiv:1611.08050 v1**

[107]曹哲。2016.使用部分亲和场的实时多人 2D 人体姿态估计,CVPR 2017 口头。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=pW6nZXeWlGM【访问时间:2017 年 04 月 03 日】。**

[108] Bogo 等人,2016 年。保持 SMPL:从单幅图像自动估计三维人体姿态和形状。【在线】arXiv: 1607.08128 。可用:arXiv:1607.08128 v1**

109 迈克尔·布莱克。2016.SMPLify:从单幅图像中获得 3D 人体姿势和形状(ECCV 2016)。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=eUnZ2rjxGaE【访问时间:2017 年 04 月 03 日】。**

110 同上

[111]窦等,2016。Fusion4D:挑战场景的实时性能捕捉。【在线】SamehKhamis.com。可用:http://www.samehkhamis.com/dou-siggraph2016.pdf**

112 同上

113 微软研究院。2016.Fusion4D:挑战场景的实时性能捕捉。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=2dkcJ1YhYw4&feature = youtu . be【访问时间:04/03/2017】。**

114 I3D 过去的项目。2016.全息传送:实时虚拟三维传送(微软研究院)。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=7d59O6cfaM0&feature = youtu . be【访问时间:03/03/2017】。**

[115] Kim 等人,2016 年。用事件摄像机进行实时三维重建和六自由度跟踪。【在线】伦敦帝国理工学院计算机系(www . doc . IC . AC . uk)。可用:https://www . doc . IC . AC . uk/~ ajd/Publications/Kim _ et al _ ECC v2016 . pdf****

116 同上

[117] Kim 等人,2014 年。用事件摄像机同时进行镶嵌和跟踪。【在线】伦敦帝国理工学院计算机系(www . doc . IC . AC . uk)。可用:https://www . doc . IC . AC . uk/~ ajd/Publications/Kim _ et al _ bmvc 2014 . pdf****

[118]汉姆·金。2017.事件的实时三维重建和六自由度跟踪。【在线】YouTube.com。可用:https://www.youtube.com/watch?v=yHLyhdMSw7w【访问时间:2017 年 3 月 3 日】。**

[119]加尔格等人,2016 年。用于单视图深度估计的无监督 CNN:几何学拯救。【在线】arXiv: 1603.04992 。可用:arXiv:1603.04992 v2**

[120] Izadinia 等人,2016 年。IM2CAD。【在线】arXiv: 1608.05137 。可用:arXiv:1608.05137 v1**

121 同上

[122]然而更多的神经网络溢出

[123] Tokmakov 等人,2016 年。学习视频中的运动模式。【在线】arXiv: 1612.07217 。可用:arXiv:1612.07217 v1**

124 戴维斯。2017.戴维斯:密集注释的视频分割。【网站】戴维斯挑战赛。可用:http://davischallenge.org/【访问时间:27/03/2017】。**

[125]迪通等人,2016 年。深度图像单应性估计。【在线】arXiv: 1606.03798 。可用:arXiv:1606.03798 v1**

[126] Handa 等人,2016 年。几何计算机视觉的神经网络库。【在线】arXiv: 1607.07405 。可用:arXiv:1607.07405 v3**

127 马利西维茨。2016.实时 SLAM 和深度学习 vs SLAM 的未来。【博客】Tombone 的计算机视觉博客。可用:http://www . computer vision blog . com/2016/01/why-slam-matters-future-of-real-time . html【访问时间:01/03/2017】。**

[128]谷歌。2017.探戈。【网址】get.google.com。可用:https://get.google.com/tango/【访问时间:23/03/2017】。**

129 同上

130 马利西维茨。2016.实时 SLAM 和深度学习 vs SLAM 的未来。【博客】Tombone 的计算机视觉博客。可用:http://www . computer vision blog . com/2016/01/why-slam-matters-future-of-real-time . html【访问时间:01/03/2017】。**

计算机视觉一年——第 4 部分,共 4 部分

原文:https://towardsdatascience.com/a-year-in-computer-vision-part-4-of-4-515c61d41a00?source=collection_archive---------10-----------------------

—第四部分:ConvNet 架构、数据集、不可分组的附加内容

下面这篇文章摘自我们的研究团队最近编辑的关于计算机视觉领域的出版物。所有零件现在都可以通过我们的网站以及媒体上的第 1 部分、第 2 部分和第 3 部分获得。

现在可以通过www.themtank.org在我们的网站上免费获得完整的出版物

我们鼓励读者通过我们自己的网站查看这篇文章,因为我们包括嵌入的内容和简单的导航功能,使报告尽可能动态。我们的网站不会给团队带来任何收入,只是为了让读者尽可能地感受到这些材料的吸引力和直观性。我们竭诚欢迎对演示的任何反馈!

请关注、分享和支持我们的工作,无论你喜欢的渠道是什么(请尽情鼓掌!).如有任何问题或想了解对未来作品的潜在贡献,请随时联系编辑:info@themtank.com

第四部分:ConvNet 架构、数据集、不可分组的附加内容

ConvNet 架构

ConvNet 架构最近在计算机视觉之外发现了许多新颖的应用,其中一些将在我们即将出版的出版物中介绍。然而,它们继续在计算机视觉中占据显著地位,架构的进步为本文中提到的许多应用和任务提供了速度、精度和训练方面的改进。

因此,ConvNet 架构对整个计算机视觉至关重要。以下是 2016 年一些值得注意的 ConvNet 架构,其中许多架构都是从 ResNets 最近的成功中获得灵感的。

  • Inception-v4、Inception-ResNet 和剩余连接对学习的影响【131】—呈现 Inception v4,这是一个新的 Inception 架构,从 2015 年底开始建立在 Inception v2 和 v3 的基础上。[132]该论文还提供了使用剩余连接来训练初始网络以及一些剩余-初始混合网络的分析。
  • 密集连接的卷积网络【133】或“DenseNets”直接从 ResNets 的身份/跳跃连接中获得灵感。该方法将这一概念扩展到 ConvNets,使每一层以前馈方式连接到每一层,共享来自先前层的特征地图作为输入,从而创建密集网络。

DenseNets 有几个引人注目的优点:它们缓解了消失梯度问题,加强了特征传播,鼓励特征重用,并大大减少了参数的数量。[134]

图 16:dense net 架构示例

Note: A 5-layer dense block with a growth rate of k = 4. Each layer takes all preceding feature-maps as input. Source: Huang et al. (2016)[135]

在 CIFAR-10、CIFAR-100、SVHN 和 ImageNet 上对模型进行了评估;它在很多方面都达到了 SOTA。令人印象深刻的是,DenseNets 实现了这些结果,同时使用更少的内存和降低的计算要求。有多个实现(Keras,Tensorflow 等)这里。[136]

  • FractalNet 无残差超深度神经网络【137】—利用不同长度的交互子路径,没有直通或残差连接,而是使用滤波器和非线性变换来改变内部信号。

FractalNets 将多个平行层序列与不同数量的卷积块重复组合,以获得较大的标称深度,同时在网络中保持许多短路径。[138]

该网络在 CIFAR 和 ImageNet 上实现了 SOTA 性能,同时展示了一些附加属性。例如,他们对残差在极深网络的成功中的作用提出了质疑,同时也提供了对通过各种子网深度获得的答案的本质的洞察。

  • ****让我们保持简单:使用简单的架构来超越更深层次的架构【139】专注于创建一个简化的母架构。该架构在“CIFAR10/100、MNIST 和 SVHN 等数据集上实现了 SOTA 结果,或与现有方法相当,只需简单或无需数据扩充”。我们认为他们的原话是对这一动机的最好描述:

在这项工作中,我们提出了一个非常简单的 13 层完全卷积网络架构,对新功能的依赖最小,其性能优于几乎所有更深层的架构,参数减少了 2 到 25 倍。我们的架构可以成为许多场景的非常好的候选,尤其是在嵌入式设备中的应用。”

“可以使用深度压缩等方法对其进行进一步压缩,从而大幅降低其内存消耗。我们有意尝试创建一个对最近提出的新功能依赖最小的母架构,以展示一个精心制作但简单的卷积架构的有效性,该架构随后可以通过文献中介绍的现有或新方法进行增强。【140】

以下是一些补充 ConvNet 架构的附加技术:

  • Swapout:学习深度架构的集合 [141]概括了丢弃和随机深度方法,以防止特定层和跨网络层的单元的共同适应。集成训练方法从包括“丢失、随机深度和剩余架构”的多个架构中采样。Swapout 在 CIFAR-10 和 CIFAR-100 上的表现优于相同网络结构的 ResNets,可以归类为一种正则化技术。**
  • SqueezeNet【142】认为,更小的 dnn 提供了各种好处,从更少的计算负担训练到更容易的信息传输和对存储或处理能力有限的设备的操作。SqueezeNet 是一个小型 DNN 架构,它实现了“AlexNet 级别的准确性,使用模型压缩技术显著降低了参数和内存需求,使其比 AlexNet 小 510 倍。”

传统上,校正线性单元(ReLU)是所有神经网络的主要激活函数。然而,这里有一些最近的选择:

  • 串接整流线性单元(CRelu)【143】
  • 指数线性单位(ELUs)【144】从 2015 年收盘
  • 参数指数线性单元(PELU)【145】

向等方差转换

ConvNets 具有平移不变性,这意味着它们可以识别图像多个部分中的相同特征。然而,典型的 CNN 并不是旋转不变的——这意味着如果一个特征或整个图像被旋转,那么网络的性能就会受到影响。通常,ConvNets 通过数据扩充(例如,在训练期间有目的地以小的随机量旋转图像)来学习(某种程度上)处理旋转不变性。这意味着网络获得轻微的旋转不变属性,而无需将旋转不变性特别设计到网络中。这意味着旋转不变性在使用当前技术的网络中受到根本限制。这与人类有一个有趣的相似之处,人类通常在识别颠倒的字符方面表现更差,尽管机器没有理由遭受这种限制。

下面的论文解决了旋转不变变换。虽然每种方法都有新颖之处,但它们都通过更有效地使用参数来提高旋转不变性,从而最终实现全局旋转等变:

  • 谐波 CNN【146】用‘圆谐波’代替常规 CNN 滤波器。
  • 分组等变卷积网络(G-CNNs)【147】使用 G-卷积,这是一种新型层,与常规卷积层相比,享有更高程度的权重共享,并在不增加参数数量的情况下增加网络的表达能力。**
  • 利用卷积神经网络中的循环对称性【148】将四种操作呈现为层,这些层增强神经网络层以部分增加旋转等方差。****
  • 可控 CNN【149】Cohen 和 Welling 在他们对 G-CNNs 所做工作的基础上,证明了“可控架构”在 CIFARs 上优于剩余和密集网络。它们还提供了不变性问题的简明概述:****

为了提高机器学习方法的统计效率,许多人寻求学习不变表示。然而,在深度学习中,中间层不应该完全不变,因为局部特征的相对姿态必须为进一步的层保留。因此,人们会想到 等变 的概念:如果网络产生的表示在输入的变换下以可预测的线性方式变换,则网络是等变的。换句话说,等变网络产生可操纵的表示。可操控性使得不仅可以在每个位置(如在标准卷积层中)应用过滤器,还可以在每个姿势中应用过滤器,从而允许增加参数共享。107

剩余网络

图 17:CIFAR 数据集上的测试错误率

Note: Yellow highlight indicates that these papers feature within this piece. Pre-resnet refers to “Identity Mappings in Deep Residual Networks” (see following section). Furthermore, while not included in the table we believe that Learning Identity Mappings with Residual Gates” produced some of the lowest error rates of 2016 with 3.65% and 18.27% on CIFAR-10 and CIFAR-100, respectively.**

资料来源:阿卜迪和纳哈万迪(2016 年,第 6 页)[150]

继微软的 ResNet[151]取得成功之后,剩余网络及其变体在 2016 年变得非常受欢迎,现在有许多开源版本和预训练模型可用。2015 年,ResNet 在 ImageNet 的检测、定位和分类任务以及 COCO 的检测和分割挑战中获得第一名。虽然关于深度的问题仍然很多,但 ResNets 对消失梯度问题的处理为“深度增加产生高级抽象”哲学提供了更多动力,这种哲学支撑着目前的许多深度学习。**

ResNets 通常被认为是较浅网络的集合,它通过运行与其卷积层平行的快捷连接,在某种程度上抵消了深度神经网络(DNNs)的分层性质。这些快捷方式或 跳过连接 通过允许梯度在整个网络层中更容易地反向传播,减轻了与 DNNs 相关联的消失/爆炸梯度问题。更多信息,这里有一个 Quora 线程可用。[152]

剩余学习、理论和改进

  • 广泛的剩余网络【153】现在是一种极其常见的 ResNet 方法。作者对 ResNet 块的体系结构进行了实验研究,并通过增加网络的宽度和减少网络的深度来改善剩余网络的性能,从而缓解了特征重用问题。这种方法在多个基准上产生了新的 SOTA,包括在 CIFAR-10 和 CIFAR-100 上分别为 3.89%和 18.3%。作者表明,16 层深宽的 ResNet 在准确性和效率方面与许多其他 ResNet(包括 1000 层网络)一样好,甚至更好。
  • 具有随机深度的深度网络 [154]本质上是将丢弃应用于整个神经元层,而不是单个神经元束。"我们从非常深的网络开始,但在训练过程中,对于每个小批量,随机丢弃一个子集的层,并用身份函数绕过它们。“随机深度允许更快的训练和更好的准确性,即使训练网络超过 1200 层。**
  • 利用剩余门学习身份映射【155】—“通过使用标量参数来控制每个门,我们提供了一种仅通过优化一个参数来学习身份映射的方法。“作者使用这些门控结果来改善深度模型的优化,同时提供‘对全层移除的高容忍度’,使得 90%的性能在随机显著移除后保持不变。使用宽门控结果,该模型在 CIFAR- 10 和 CIFAR-100 上分别实现了 3.65%和 18.27%的误差。**
  • 剩余网络的行为类似于相对较浅的网络的集合【156】——剩余网络可以被视为许多路径的集合,这些路径并不强烈依赖于彼此,因此强化了集合行为的概念。此外,剩余路径在长度上有所不同,短路径在训练过程中会产生梯度,而较深的路径在此阶段不会产生梯度。****
  • 深度剩余网络中的身份映射 [157]是对原 Resnet 作者、何、、任、的改进。标识映射显示为允许“当用作跳过连接和添加后激活时,在任何 ResNet 块之间传播前向和后向信号”。该方法在 CIFAR-10 (4.62%误差)和 CIFAR-100 上使用 1001 层 ResNet,在 ImageNet 上使用 200 层 ResNet,改进了推广、训练和结果"
  • 多重残差网络:提高残差网络的速度和准确性 [158]再次倡导 ResNet 的整体行为,并支持对 ResNet 架构采用更广泛、更深入的方法。所提出的多残差网络增加了残差块中残差函数的数量。“精度提高后,CIFAR-10 和 CIFAR-100 的误差分别为 3.73%和 19.45%。图 17 中的表格摘自本文,考虑到 2017 年迄今所做的工作,有更多最新版本可用。**

其他剩余理论和改进 虽然这是一个相对较新的概念,但目前有相当多的工作是围绕剩余理论创建的。以下是我们希望向感兴趣的读者强调的一些额外的理论和改进:

  • 高速公路和剩余网络学习展开迭代估计【159】
  • 残差网络的残差网络:多级残差网络【160】
  • Resnet 中的 Resnet:一般化剩余架构【161】
  • 更宽或更深:重新审视用于视觉识别的 ResNet 模型【162】
  • 弥合剩余学习、递归神经网络和视觉皮层之间的差距【163】
  • 卷积剩余记忆网络【164】
  • 深度学习中的身份问题【165】
  • 具有指数线性单元的深度残差网络【166】
  • 深度网络的加权残差【167】

数据集

丰富的数据集对于机器学习的所有方面的重要性不能被夸大。因此,我们认为包含该领域中一些最大的进步是谨慎的。套用 Kaggle 的联合创始人兼首席技术官 Ben Hamner 的话,“一个新的数据集可以让一千篇论文繁荣发展”,[168]也就是说,数据的可用性可以促进新的方法,也可以为以前无效的技术注入新的活力。

2016 年,ImageNet[169]、上下文中的公共对象(COCO)[170]、CIFARs[171]和 MNIST[172]等传统数据集加入了大量新条目。我们还注意到,图形技术的进步刺激了合成数据集的兴起。合成数据集是人工神经网络(ann)的大数据需求的一个有趣的解决方案。为了简洁起见,我们选择了(主观上)最重要的 2016 年数据集:**

  • 地点 2【173】是一个场景分类数据集,即任务是给一幅图像标注一个场景类别,如“体育场”、“公园”等。虽然预测模型和图像理解无疑将通过 Places2 数据集得到改善,但根据该数据集训练的网络的一个有趣发现是,在学习对场景进行分类的过程中,网络学会了在没有明确学习的情况下检测其中的对象。例如,卧室里有床,水槽可以在厨房和浴室里。这意味着对象本身是场景分类的抽象层次中的较低级特征。

图 18:scene net RGB-D 的示例

Note: Examples taken from SceneNet RGB-D, a dataset with 5M Photorealistic Images of Synthetic Indoor Trajectories with Ground Truth. The photo (a) is rendered through computer graphics with available ground truth for specific tasks from (b) to (e). Creation of synthetic datasets should aid the process of domain adaptation. Synthetic datasets are somewhat pointless if the knowledge learned from them cannot be applied to the real world. This is where domain adaptation comes in, which refers to this transfer learning process of moving knowledge from one domain to another, e.g. from synthetic to real-world environments. Domain adaptation has recently been improving very rapidly again highlighting the recent efforts in transfer learning. Columns © vs (d) show the difference between instance and semantic/class segmentation.

资料来源:麦科马克等人(2017)[174]

  • SceneNet RGB-D【175】—该合成数据集扩展了原始 scene net 数据集,并为场景理解问题(如语义分割、实例分割和对象检测)以及几何计算机视觉问题(如光流、深度估计、相机姿态估计和 3D 重建)提供了像素级的真实情况。数据集通过提供像素完美的表示来细化所选的环境。****
  • cm places【176】是麻省理工学院的跨模态场景数据集。任务是识别自然图像之外的许多不同模态的场景,并在此过程中有希望跨模态传递该知识。一些模态是:真实、剪贴画、草图、空间文本(与对象的空间位置相对应的文字)和自然语言描述。本文还讨论了如何用交叉模态卷积神经网络处理这类问题的方法。

图 19 : CMPlaces 跨模态场景表示

Note: Taken from the CMPlaces paper showing two examples, bedrooms and kindergarten classrooms, across different modalities. Conventional Neural Network approaches learn representations that don’t transfer well across modalities and this paper attempts to generate a shared representation “agnostic of modality”.

资料来源 : Aytar 等人(2016)[177]

在 CMPlaces 中,我们看到明确提到迁移学习、领域不变表示、领域适应和多模态学习,所有这些都有助于进一步展示当前计算机视觉研究的趋势。作者专注于试图找到“领域/模态独立表示”,这可能对应于人类从中得出统一表示的更高级抽象。例如,以“猫”的各种形态为例,人类在书写中看到“猫”这个词,在速写本中画出一幅画,在现实世界中看到一幅图像,或者在讲话中提到,但我们仍然在这些形态之上的更高层次上抽象出相同的统一表示。**

**“人类能够独立地利用他们感知的知识和经验,机器的类似能力将使检索和识别方面的一些重要应用成为可能”

  • MS-Cele b-1M【178】包含一百万个名人的图像,在面部识别的训练集中有一千万个训练图像。
  • 开放图像【179】由谷歌公司提供,包含大约 900 万个带有多个标签的图像的 URL,这是对典型的单标签图像的巨大改进。开放图像涵盖 6000 个类别,比 ImageNet 之前提供的 1000 个类别(较少关注犬科动物)有了很大的改进,应该证明对机器学习社区是不可或缺的。
  • YouTube-8M【180】也是谷歌提供的 800 万个视频网址,50 万小时的视频,4800 个课程,平均。每个视频 1.8 个标签。标签的一些例子是:“艺术&娱乐”、“购物”和“宠物&动物”。视频数据集更难以标记和收集,因此该数据集提供了巨大的价值。****

也就是说,图像理解方面的进步,如分割、对象分类和检测,已经将视频理解带到了研究的前沿。然而,在这个数据集发布之前,现实世界中可用的视频数据集的种类和规模都非常缺乏。此外,该数据集最近刚刚更新,[181]今年,谷歌与 Kaggle 联合举办了一场视频理解比赛,作为 2017 年 CVPR 的一部分。[182]

关于 YouTube-8M 的一般信息:此处【183】

无法组合的额外项目和有趣的趋势

当这个作品接近尾声时,我们感叹我们不得不在这样的限制下创作它。事实上,计算机视觉的领域太过广阔,无法涵盖任何真实的、有意义的深度,因此出现了许多疏漏。不幸的是,其中一个遗漏是几乎所有不使用神经网络的东西。我们知道在 NNs 之外有很好的工作,我们承认我们自己的偏见,但是我们认为目前的动力在于这些方法,并且我们对纳入材料的主观选择主要基于从整个研究社区收到的接收(结果不言自明)。

我们还要强调的是,在上述主题中还有数百篇其他论文,这些主题并不是权威的,而是希望鼓励感兴趣的人沿着我们提供的入口进一步阅读。因此,这最后一节是对我们喜欢的一些其他应用程序、我们希望强调的趋势以及我们希望向读者提出的理由的总括。

应用/用例

  • 脸书的盲人应用程序[184]和百度的硬件。[185]
  • 情感检测结合了面部检测和语义分析,发展迅速。目前有 20 多个可用的 API。[186]
  • 从航空影像中提取道路,[187]从航空地图和人口密度地图中进行土地利用分类。[188]
  • Amazon Go 通过展示无队列购物体验进一步提升了计算机视觉的形象,[189]尽管目前仍存在一些功能问题。[190]
  • 对于自动驾驶汽车,有大量的工作正在进行,而我们基本上没有触及。然而,对于那些希望深入研究总体市场趋势的人来说,Moritz Mueller-Freitag 有一篇关于德国汽车行业和自动驾驶汽车影响的 200 亿神经元的优秀文章。[191]
  • 其他感兴趣的领域:图像检索/搜索,[192]手势识别,修复和面部重建。
  • 围绕医学中的数字成像和通信(DICOM)以及其他医学应用,尤其是与成像相关的应用,有大量的工作要做。例如,已经存在(并且仍然存在)许多 Kaggle 检测竞赛(肺癌、宫颈癌),其中一些具有大量金钱激励,在这些竞赛中,算法试图在所讨论的分类/检测任务中胜过专家。

然而,当改进这些算法的错误率的工作继续进行时,它们作为医疗从业者的工具的价值越来越明显。当我们考虑到通过将人工智能系统【193】与医学专家相结合而实现的乳腺癌检测性能改善时,这一点尤为引人注目。[194]在这种情况下,机器人-人类共生产生的准确度远远大于其各部分的总和,达到 99.5%。

这只是深度学习/机器学习社区目前正在追求的医疗应用洪流的一个例子。我们团队中一些愤世嫉俗的成员开玩笑地将这些尝试视为一种手段,以迎合社会对人工智能研究作为一种无处不在的慈善力量的想法。但是,只要这项技术有助于医疗保健行业,并且是以安全和慎重的方式引入的,我们就全心全意地欢迎这种进步。

硬件/市场

  • 机器人视觉/机器视觉(独立领域)的增长市场和物联网的潜在目标市场。我们个人最喜欢的是一个农民的儿子使用深度学习、覆盆子 Pi 和 TensorFlow 在日本根据独特的生产者启发式质量(如形状、大小和颜色)对黄瓜进行分类。[195]这大大减少了他母亲在挑选黄瓜上花费的时间。
  • 计算需求的缩减和向移动设备迁移的趋势是显而易见的,但同时也伴随着急剧的硬件加速。很快,我们将到处看到口袋大小的 CNN 和视觉处理单元(vpu)。例如,Movidius Myriad2 用于谷歌的 Tango 和无人机项目。[196]

m ovidius Fathom stick[197]也使用了 Myriad2 的技术,允许用户将 SOTA 计算机视觉性能添加到消费设备中。Fathom 棒具有 USB 棒的物理属性,它将神经网络的能力带到了几乎任何设备上:棒上的大脑。

  • 使用非可见光的传感器和系统。例子包括雷达、热成像相机、超光谱成像、声纳、磁共振成像等。
  • 降低激光雷达的成本,它使用光和雷达来测量距离,并提供许多优于普通 RGB 相机的优势。目前有许多价格低于 500 美元的激光雷达设备。
  • Hololens 和几乎无数的其他增强现实耳机[198]进入市场。
  • 谷歌的探戈项目【199】代表了 SLAM 的下一个重大商业化。Tango 是一个增强现实计算平台,包括新颖的软件和硬件。Tango 允许在不使用 GPS 或其他外部信息的情况下检测移动设备相对于世界的位置,同时以 3D 方式绘制设备周围的区域。

企业合作伙伴联想在 2016 年向市场推出了价格实惠的 Tango 手机,使数百名开发者开始为该平台创建应用程序。Tango 采用了以下软件技术:运动跟踪、区域学习和深度感知。

更新 2019 年 10 月 : 谷歌的 Tango 怎么了?

基于即将出版的出版物的遗漏

在机器学习和人工智能中,计算机视觉技术和其他领域之间也有相当多且越来越多的重叠。这些其他领域和混合用例是 M Tank 即将发布的出版物的主题,与本文的全部内容一样,我们基于自己的启发对内容进行了划分。

例如,我们决定将两个完整的计算机视觉任务,图像字幕和视觉问答,与视觉语音识别一起放在我们即将推出的 NLP 作品中,因为涉及到 CV 和 NLP 的结合。而将生成模型应用于图像则是我们在生成模型方面的工作。这些未来作品中包括的例子有:

  • 唇读:2016 年,我们看到了 LipNet[200]等程序在唇读方面的巨大进步,这些程序将计算机视觉和 NLP 结合到视觉语音识别中。
  • 应用于图像的生成模型将成为我们对自回归模型(PixelRNN、PixelCNN、ByteNet、VPN、WaveNet)、生成对抗网络(GANs)、变分自动编码器之间激烈斗争的描述的一部分,正如你在此阶段所预期的,所有这些模型的变体、组合和混合体。*

*免责声明:监测组希望指出,他们不宽恕任何形式的网络对网络(非)暴力,并且同情向生殖性非对话网络(枪支)发展的运动。【201】

在最后一部分,我们将提供一些总结性的评论,并对我们发现的一些趋势进行概括。我们希望我们能够足够全面地展示计算机视觉领域的大致位置和近期发展方向的鸟瞰图。我们还要特别提请注意,我们的工作不涵盖 2017 年 1 月至 8 月。研究产出的快速增长意味着大部分工作可能已经过时;我们鼓励读者去看看,看看是否适合自己。但这种快速增长也带来了有利可图的机会,因为计算机视觉硬件和软件市场预计到 2022 年将达到 486 亿美元。

图 20 :应用市场计算机视觉收入【202】

Note: Estimation of Computer Vision revenue by application market spanning the period from 2015–2022. The largest growth is forecasted to come from applications within the automotive, consumer, robotics and machine vision sectors.
Source: Tractica (2016)[203]

结论

最后,我们想强调在我们的研究回顾过程中反复出现的一些趋势和反复出现的主题。首先,我们想提请注意机器学习研究社区对优化的贪婪追求。这在准确率的逐年变化中最为明显,尤其是在准确率的年内变化中。我们想强调这一点,过一会儿再回到这一点。

错误率并不是唯一狂热优化的参数,研究人员正在努力提高速度、效率,甚至是以全新的方式推广到其他任务和问题的算法能力。我们敏锐地意识到,随着一次性学习、生成模型、迁移学习以及最近的进化学习等方法的出现,研究开始崭露头角,我们认为这些研究原则正在逐渐对最佳表现工作的方法产生更大的影响。

虽然最后一点毫无疑问是对这一趋势的赞扬,而不是诋毁,但人们不禁将注意力投向人工通用智能(非常)遥远的幽灵,无论是否值得思考。我们绝不是危言耸听,我们只是希望向专家和外行人强调,这种担忧来自这里,来自计算机视觉和其他人工智能子领域已经显而易见的惊人进展。只有通过关于这些进步及其总体影响的教育,才能恰当地表达公众的关切。这可能会反过来平息媒体情绪的力量和人工智能中的错误信息。

我们选择关注一年时间表有两个原因。第一个因素与正在制作的作品数量有关。即使对于非常关注该领域的人来说,随着出版物数量呈指数级增长,跟上研究的步伐也变得越来越困难。第二个让我们回到年内变化的观点。

通过对一年的进展进行快照,读者可以开始理解目前的研究进度。我们在如此短的时间内看到了一个又一个的改善,但是为什么呢?研究人员已经培育了一个全球社区,在这个社区中,基于以前的方法(架构、元架构、技术、想法、技巧、古怪的黑客、结果等)进行构建。),以及基础设施(像 Keras、TensorFlow 和 PyTorch、GPU 等库。),不仅是鼓励,也是庆祝。一个以开源为主的社区,鲜有相似之处,它不断吸引新的研究人员,其技术被经济学、物理学和无数其他领域重新引用。

对于那些还没有注意到的人来说,重要的是要理解,在已经疯狂的不同声音的合唱中,宣告对这项技术的真实性质的神圣洞察力,至少有一致意见;一致认为这项技术将以令人兴奋的新方式改变世界。然而,对于这些变化将在什么时间展开,仍然存在很多分歧。

在我们能够准确模拟这些进展之前,我们将继续尽最大努力提供信息。通过这个资源,我们希望迎合人工智能经验的范围,从研究人员到任何只想获得计算机视觉和人工智能基础的人。我们的项目希望以此为开源革命增加一些价值,这场革命在一生的技术之下悄然进行。

非常感谢,

M 坦克

请随意将所有反馈和建议放在评论区,我们会尽快回复。或者,您可以通过以下方式直接联系我们:info@themtank.com

完整版本可在:www.themtank.org/a-year-in-computer-vision获得

按出现顺序排列的参考文献

[131] Szegedy 等人,2016 年。Inception-v4,Inception-ResNet 和剩余连接对学习的影响。【在线】arXiv: 1602.07261 。可用:arXiv:1602.07261 v2**

[132] Szegedy 等人,2015 年。重新思考计算机视觉的初始架构。【在线】arXiv: 1512.00567 。可用:arXiv:1512.00567 v3**

[133]黄等,2016。密集连接的卷积网络。【在线】arXiv: 1608.06993 。可用:arXiv:1608.06993 v3**

134 同上

135 同上

[136]刘庄 13。2017.密集连接卷积网络的代码。【在线】github.com。可用:https://github.com/liuzhuang13/DenseNet【访问时间:2017 年 03 月 04 日】。**

[137] Larsson 等人,2016 年。FractalNet:无残差超深度神经网络。【在线】arXiv: 1605.07648 。可用:arXiv:1605.07648 v2**

[138]黄等,2016 年。密集连接的卷积网络。【在线】arXiv: 1608.06993 。可用:arXiv:1608.06993 v3,pg。1.**

[139] Hossein HasanPour 等人,2016 年让我们保持简单:使用简单的架构来超越更深层次的架构。【在线】arXiv: 1608.06037 。可用:arXiv:1608.06037 v3**

140 同上

[141] Singh 等人,2016 年。Swapout:学习深层架构的合奏。【在线】arXiv: 1605.06465 。可用:arXiv:1605.06465 v1**

[142] Iandola 等人,2016 年。SqueezeNet: AlexNet 级精度,参数少 50 倍<0.5MB model size. 【在线】arXiv: 1602.07360 。可用:arXiv:1602.07360 v4

[143]尚等,2016。通过级联校正线性单元理解和改进卷积神经网络。【在线】arXiv: 1603.05201 。可用:arXiv:1603.05201 v2**

[144] Clevert 等人,2016 年。通过指数线性单元(ELUs)进行快速准确的深度网络学习。【在线】arXiv: 1511.07289 。可用:arXiv:1511.07289 V5**

[145] Trottier 等人,2016 年。深度卷积神经网络的参数指数线性单元。【在线】arXiv: 1605.09332 。可用:arXiv:1605.09332 v3**

[146]沃拉尔等人,2016 年。谐波网络:深度平移和旋转等值。【在线】arXiv: 1612.04642 。可用:arXiv:1612.04642 v1**

[147]科恩&韦林。2016.群等变卷积网络。【在线】arXiv: 1602.07576 。可用:arXiv:1602.07576 v3**

[148] Dieleman 等人,2016 年。利用卷积神经网络中的循环对称性。【在线】arXiv: 1602.02660 。可用:arXiv:1602.02660 v2**

[149]科恩&韦林。2016.可操纵 CNN。【在线】arXiv: 1612.08498 。可用:arXiv:1612.08498 v1**

[150] Abdi,m .,Nahavandi,S. 2016 年。多重残差网络:提高残差网络的速度和精度。【在线】arXiv: 1609.05672 。可用:arXiv:1609.05672 v3**

[151]何等,2015。用于图像识别的深度残差学习。【在线】arXiv: 1512.03385 。可用:arXiv:1512.03385 v1**

[152] Quora。2017.深度剩余网络的直观解释是什么?【网站】www.quora.com。可用:https://www . quora . com/What-a-intuitive-an-explain-of-Deep-Residual-Networks【访问时间:2017 年 03 月 04 日】。**

[153] Zagoruyko,s .和 Komodakis,N. 2017。广泛的剩余网络。【在线】arXiv: 1605.07146 。可用:arXiv:1605.07146 v3**

[154]黄等,2016。具有随机深度的深度网络。【在线】arXiv: 1603.09382 。可用:arXiv:1603.09382 v3**

[155] Savarese 等人,2016 年。用剩余门学习身份映射。【在线】arXiv: 1611.01260 。可用:arXiv:1611.01260 v2**

156 韦特、威尔伯和贝隆吉。2016.剩余网络的行为类似于相对较浅的网络的集合。【在线】arXiv: 1605.06431 。可用:arXiv:1605.06431 v2**

[157]他在阿尔 2016.深剩余网络中的身份映射。【在线】arXiv: 1603.05027 。可用:arXiv:1603.05027 v3**

[158] Abdi,m .,Nahavandi,S. 2016。多重残差网络:提高残差网络的速度和精度。【在线】arXiv: 1609.05672 。可用:arXiv:1609.05672 v3**

[159] Greff 等人,2017 年。公路和残差网络学习展开迭代估计。【在线】arXiv: 1612。07771 。可用:arXiv:1612.07771 v3**

160 阿布迪和纳哈万迪。2017.多重残差网络:提高残差网络的速度和精度。【在线】1609.05672 。可用:arXiv:1609.05672 v4**

[161] Targ 等人,2016 年。概化剩余架构。【在线】arXiv: 1603.08029 。可用:arXiv:1603.08029 v1**

[162]吴等,2016。更广还是更深:重新审视视觉识别的 ResNet 模型。【在线】arXiv: 1611.10080 。可用:arXiv:1611.10080 v1**

[163]廖和波焦。2016.弥合剩余学习、递归神经网络和视觉皮层之间的差距。【在线】arXiv: 1604.03640 。可用:arXiv:1604.03640 v1**

164 莫尼斯和帕尔。2016.卷积剩余记忆网络。【在线】arXiv: 1606.05262 。可用:arXiv:1606.05262 v3**

[165]哈特和马。2016.身份在深度学习中很重要。【在线】arXiv: 1611.04231 。可用:arXiv:1611.04231 v2**

[166] Shah 等人,2016 年。具有指数线性单位的深度剩余网络。【在线】arXiv: 1604.04112 。可用:arXiv:1604.04112 v4**

[167]沈、曾。2016.甚深网络的加权残差。【在线】arXiv: 1605.08831 。可用:arXiv:1605.08831 v1**

168 本·哈姆纳。2016.推特状态。【在线】推特。可用:https://twitter.com/benhamner/status/789909204832227329**

169 ImageNet。2017.主页。【在线】可用:http://image-net.org/index【访问时间:2017 年 04 月 01 日】**

[170]可可。2017.公共主页中的公共对象。【在线】可用:http://mscoco.org/【访问时间:2017 年 04 月 01 日】**

171 CIFARs。2017.CIFAR-10 数据集。【在线】可用:https://www.cs.toronto.edu/~kriz/cifar.html【访问时间:2017 年 04 月 01 日】**

172 MNIST。2017.MNIST 手写数字数据库。【在线】可用:http://yann.lecun.com/exdb/mnist/【访问时间:2017 年 04 月 01 日】**

[173]周等,2016。地点 2。【在线】可用:http://places2.csail.mit.edu/【访问时间:2017 年 06 月 01 日】**

174 同上

[175]麦科马克等人,2017 年。SceneNet RGB-D:具有地面真实性的合成室内轨迹的 5M 照片级真实感图像。【在线】arXiv: 1612.05079 v3。可用:arXiv:1612.05079 v3**

[176] Aytar 等人,2016 年。跨模态场景网络。【在线】arXiv: 1610.09003 。可用:arXiv:1610.09003 v1**

177 同上

[178]郭等,2016。MS-Celeb-1M:大规模人脸识别的数据集和基准。【在线】arXiv: 1607.08221 。可用:arXiv:1607.08221 v1**

[179]开放图像。2017.打开图像数据集。【在线】Github 。可用:【https://github.com/openimages/dataset 【访问时间:2017 年 8 月 1 日】**

[180] Abu-El-Haija 等人,2016 年。YouTube-8M:大规模视频分类基准。【在线】arXiv: 1609.08675 。可用:arXiv:1609.08675 v1**

[181]纳采夫,第 2017 页。更新的 YouTube-8M、视频理解挑战和 CVPR 研讨会。我的天啊。。【在线】谷歌研究博客。可用:https://research . Google blog . com/2017/02/an-updated-YouTube-8m-video . html【访问时间:26/02/2017】。**

[182] YouTube-8M。2017.CVPR 17 年关于 YouTube 的研讨会-8M 大规模视频理解。【在线】谷歌研究。可用:https://research.google.com/youtube8m/workshop.html【访问时间:26/02/2017】。**

[183]谷歌。2017.YouTube-8M 数据集。【在线】research.google.com。可用:https://research.google.com/youtube8m/【访问时间:2017 年 04 月 03 日】。**

[184]吴、皮克和。2016.使用人工智能帮助盲人“看见”脸书。【在线】脸书编辑部。可用:http://news room . FB . com/news/2016/04/using-artificial-intelligence-to-help-blind-people-see-Facebook/【访问时间:2017 年 02 月 03 日】。**

[185]梅斯。2016.人工智能终于进入了我们的日常世界。【在线】连线。可用:https://www . wired . com/2016/01/2015-was-the-year-ai-finally-entry-the-daily-world/【访问时间:2017 年 02 月 03 日】。**

[186]多尔费尔德。2015.20 多个情感识别 API 会让你印象深刻,并关注。【在线】北欧 API。可用:http://nordicapis . com/20-emotion-recognition-APIs-that-leave-you-impressed-and-concerned/【访问时间:2017 年 02 月 03 日】。**

[187]约翰逊,2016 年。trail behind/deep osm-使用 OpenStreetMap 功能和卫星图像训练深度学习网络。【在线】Github.com。可用:【https://github.com/trailbehind/DeepOSM 【访问时间:29/03/2017】。**

188 格罗和蒂埃克。2016.用更好的地图连接世界。【在线】脸书电码。可用:https://code . Facebook . com/posts/1676452492623525/connecting-the-world with-better-maps/【访问时间:2017 年 02 月 03 日】。**

[189]亚马逊。2017.常见问题— Amazon Go。【网址】Amazon.com。可用:https://www.amazon.com/b?node=16008589011【访问时间:29/03/2017】。**

[190]雷辛格特区,2017 年。亚马逊的免收银商店可能很容易被攻破。【在线】财富科技。可用:http://fortune.com/2017/03/28/amazon-go-cashier-free-store/【访问时间:29/03/2017】。**

[191]穆勒-弗莱塔格,M. 2017 年。德国在车轮上睡着了?[博客]两百亿神经元——Medium.com。可用:https://medium . com/twenty bn/Germany-sleep-at-the-wheel-d 800445 d6da 2**

[192]戈多等人,2016 年。深度图像检索:学习图像搜索的全局表示。【在线】arXiv: 1604.01325 。可用:arXiv:1604.01325 v2**

[193]王等,2016。用于识别转移性乳腺癌的深度学习。【在线】arXiv: 1606.05718 。可用:arXiv:1606.05718 v1**

[194]罗森菲尔德,J. 2016。人工智能实现了接近人类的乳腺癌检测。【在线】Mentalfloss.com。可用:http://mental loss . com/article/82415/ai-achieves-near-human-detection-breast-cancer【访问时间:27/03/2017】。**

[195]佐藤,K. 2016 年。一个日本黄瓜农民如何使用深度学习和 TensorFlow。【博客】谷歌云平台。可用:https://cloud . Google . com/blog/big-data/2016/08/how-a-Japanese-cucumber-farmer-is-use-deep-learning-and-tensor flow**

[196]班纳吉,第 2016 页。VPUs 的崛起:给机器眼睛。【在线】 www.digit.in 。可用:http://www . digit . in/general/the-rise-of-vpus-giving-eyes-to-machines-29561 . html【访问时间:22/03/2017。**

197m ovidius。2017.嵌入式神经网络计算框架。【在线】Movidius.com。可用:https://www . m ovidius . com/solutions/machine-vision-algorithms/machine-learning【访问时间:03/03/2017】。**

[198] Dzyre,N. 2016。你可以买到的 10 款即将上市的增强现实和智能眼镜。【博客】 洪家。可用:http://www . hongkiat . com/blog/augmented-reality-smart-glasses/【访问时间:2017 年 3 月 3 日】。**

[199]谷歌。2017.探戈。【网址】get.google.com。可用:https://get.google.com/tango/【访问时间:23/03/2017】。**

[200] Assael 等人,2016 年。LipNet:端到端的句子级唇读。【在线】arXiv: 1611.01599 。可用: arXiv:1611.01599v2**

[201] Albanie 等人,2017 年。制止 GAN 暴力:生成性非通用网络。【在线】arXiv: 1703.02528 。可用:arXiv:1703.02528 v1**

[202] Tractica。2016.到 2022 年,计算机视觉硬件和软件市场将达到 486 亿美元。【网址】【www.tractica.com】。可用:https://www . tractica . com/news room/press-releases/computer-vision-hardware-and-software-market-to-reach-4860 亿-by-2022/ 【访问日期:2017 年 12 月 3 日】。**

203 同上

马尔可夫链蒙特卡罗方法的零数学介绍

原文:https://towardsdatascience.com/a-zero-math-introduction-to-markov-chain-monte-carlo-methods-dcba889e0c50?source=collection_archive---------0-----------------------

对于我们中的许多人来说,贝叶斯统计充其量是巫毒魔法,或者说是完全主观的胡说八道。在贝叶斯方法的商标中,马尔可夫链蒙特卡罗方法尤其神秘。它们肯定是数学密集型和计算昂贵的过程,但是它们背后的基本推理,就像数据科学中的许多其他东西一样,可以变得直观。这是我在这里的目标。

那么,什么是马尔可夫链蒙特卡罗(MCMC)方法呢?简短的回答是:

MCMC 方法用于通过概率空间中的随机采样来近似感兴趣参数的后验分布。

在这篇文章中,我将解释这个简短的答案,没有任何数学。

首先,一些术语。感兴趣的参数只是一些概括我们感兴趣的现象的数字。一般来说,我们用统计学来估计参数。例如,如果我们想了解成年人的身高,我们感兴趣的参数可能是以英寸为单位的平均身高。一个 分布 是我们参数的每一个可能值以及我们观察每一个的可能性的数学表示。最著名的例子是钟形曲线:

Courtesy M. W. Toews

贝叶斯 的统计方式中,分布有另外的解释。贝叶斯不仅仅表示参数的值以及每个值是真实值的可能性,而是认为分布描述了我们对参数的信念。因此,上面的钟形曲线表明,我们非常确定参数值非常接近于零,但我们认为真实值在一定程度上高于或低于该值的可能性是相等的。

碰巧的是,人类的身高确实遵循一条正态曲线,所以假设我们认为人类平均身高的真实值遵循一条钟形曲线,如下所示:

很明显,拥有这张图所代表的信念的人多年来一直生活在巨人中间,因为据他们所知,最有可能的平均成年人身高是 6 英尺 2 英寸”(但他们无论如何都不是超级自信)。

让我们想象一下,这个人去收集一些数据,他们观察了一系列 5 英尺到 6 英尺之间的人。我们可以用下面的数据,以及另一条显示人类平均身高的正态曲线来解释这些数据:**

在贝叶斯统计中,代表我们对一个参数的信念的分布被称为**,因为它捕捉了我们在看到任何数据之前的信念。 似然分布 通过表示一系列参数值以及每个参数解释我们正在观察的数据的似然性,总结了观察到的数据告诉我们的内容。估计使似然分布最大化的参数值只是在回答这个问题:什么参数值最有可能观察到我们已经观察到的数据?在没有先验信念的情况下,我们可能会止步于此。****

然而,贝叶斯分析的关键是结合先验和似然分布来确定 后验分布 。这告诉我们,考虑到我们先前的信念,哪些参数值最大化了我们观察特定数据的机会。在我们的例子中,后验分布看起来像这样:

上图中,红线代表后验分布。你可以把它看作是先验分布和似然分布的一种平均值。由于先验分布更短且更分散,它代表了一组对人类平均身高真实值“不太确定”的信念。同时,似然性汇总了相对较窄范围内的数据,因此它代表了对真实参数值的“更有把握”的猜测。

当先验似然性被结合时,数据(由似然性表示)支配了在巨人中长大的假设个体的微弱先验信念。尽管那个人仍然相信人类的平均身高比数据告诉他的要稍微高一些,但是他基本上被数据说服了。

在两条钟形曲线的情况下,求解后验分布是非常容易的。有一个简单的等式可以将两者结合起来。但是如果我们的先验分布和似然分布不那么好呢?有时,使用不具有方便形状的分布来模拟我们的数据或我们先前的信念是最准确的。如果我们的可能性最好用一个双峰分布来表示,并且出于某种原因,我们想要解释一些非常古怪的先验分布,那会怎么样呢?我通过手绘一个难看的先验分布,想象了下面的场景:

Visualizations rendered in Matplotlib, enhanced using MS Paint

如前所述,存在某种后验分布,其给出了每个参数值的可能性。但是很难看出它可能是什么样子,也不可能通过分析来解决。输入 MCMC 方法。

MCMC 方法允许我们在不能直接计算的情况下估计后验分布的形状。回想一下,MCMC 代表马尔可夫链蒙特卡罗方法。为了理解它们是如何工作的,我将首先介绍蒙特卡罗模拟,然后讨论马尔可夫链。

蒙特卡罗模拟只是一种通过重复生成随机数来估计固定参数的方法。通过获取生成的随机数并对其进行一些计算,蒙特卡罗模拟提供了一个参数的近似值,而直接计算它是不可能的或极其昂贵的。

假设我们想要估计下列圆的面积:

因为圆在一个边长为 10 英寸的正方形内,所以面积可以很容易地计算为 78.5 平方英寸。然而,相反,我们可以在正方形内随机下降 20 个点。然后我们计算落在圆内的点的比例,并乘以正方形的面积。这个数字是圆的面积的一个很好的近似值。

因为 20 个点中有 15 个点位于圆内,所以看起来圆大约有 75 平方英寸。对于只有 20 个随机点的蒙特卡洛模拟来说,这还不算太坏。

现在,假设我们想要计算由蝙蝠侠方程绘制的形状的面积:

这是一个我们从未学过方程式的形状!因此,找到蝙蝠信号的区域是非常困难的。然而,通过在包含该形状的矩形内随机放置点,蒙特卡罗模拟可以很容易地提供该区域的近似值!

蒙特卡洛模拟不仅用于估算复杂形状的面积。通过生成大量的随机数,它们可以用来模拟非常复杂的过程。在实践中,它们被用来预测天气,或者估计赢得选举的概率。

理解 MCMC 方法的第二个要素是马尔可夫链。这些只是概率上相互关联的事件序列。每个事件都来自一组结果,每个结果根据一组固定的概率决定下一个发生的结果。

马尔可夫链的一个重要特征是它们是 无记忆 :你预测下一个事件可能需要的一切在当前状态下都是可用的,了解事件的历史不会产生新的信息。像 Chutes and Ladders 这样的游戏展现了这种无记忆性,或者说 Markov Property, 但是现实世界中很少有事情是这样运作的。然而,马尔可夫链是理解世界的强有力的方法。

在 19 世纪,钟形曲线被视为自然界中的一种常见模式。(例如,我们已经注意到,人类的身高遵循钟形曲线。)高尔顿板模拟重复随机事件的平均值,通过将弹珠扔过装有钉子的板,再现弹珠分布的正态曲线:

俄罗斯数学家和神学家 Pavel Nekrasov认为钟形曲线,以及更普遍的大数定律,仅仅是儿童游戏和琐碎谜题的产物,其中每个事件都是完全独立的。他认为现实世界中相互依赖的事件,如人类行为,并不符合良好的数学模式或分布。

Markov 链就是以 Andrey Markov 命名的,他试图证明非独立事件也可能符合模式。他最著名的一个例子需要从一部俄罗斯诗歌作品中数出数千个双字对。利用这些配对,他计算了每个字符的条件概率。也就是说,给定前面的某个字母或空格,下一个字母很有可能是 A、T 或空格。利用这些概率,Markov 能够模拟任意长的字符序列。这是一个马尔可夫链。虽然最初的几个字符很大程度上是由起始字符的选择决定的,但 Markov 表明,从长远来看,字符的分布形成了一种模式。因此,即使是相互依赖的事件,如果它们服从固定的概率,也符合平均值。

举个更有用的例子,想象你住在一个有五个房间的房子里。你有卧室、浴室、客厅、餐厅和厨房。让我们收集一些数据,假设在任何给定的时间点你在哪个房间,我们只需要知道你接下来可能会进入哪个房间。例如,如果你在厨房,你有 30%的机会呆在厨房,30%的机会进入餐厅,20%的机会进入客厅,10%的机会进入浴室,10%的机会进入卧室。使用每个房间的一组概率,我们可以构建一个预测链,预测你接下来可能会住哪个房间。

如果我们想预测某人在厨房呆了一会儿后会在家里的什么地方,那么预测几个州之外的地方可能会有用。但是由于我们的预测只是基于对一个人在房子里的位置的观察,所以有理由认为它们不会很好。举例来说,如果有人从卧室去了浴室,他们更有可能直接回到卧室,而不是从厨房出来。所以马尔可夫性质通常不适用于现实世界。

然而,运行马尔可夫链数千次迭代,确实能给出你可能在哪个房间的长期预测。更重要的是,这个预测完全不受这个人从哪个房间开始的影响!直觉上,这是有意义的:为了模拟和描述他们长期可能在哪里,或者一般的,某人在某个时间点在房子的哪里并不重要。因此,马尔可夫链,这似乎是一种在几个时期内模拟随机变量的不合理方式,可以用来计算该变量的长期趋势,如果我们理解控制其行为的概率的话。**

有了蒙特卡罗模拟和马尔可夫链的一些知识,我希望 MCMC 方法如何工作的无数学的解释是非常直观的。

回想一下,我们试图估计我们感兴趣的参数,人类平均身高的后验分布:

I am not a visualization expert, nor apparently am I any good at keeping my example within the bounds of common sense: my example of the posterior distribution seriously overestimates average human height.

我们知道后验分布在我们的先验分布和我们的似然分布的范围内的某个地方,但是不管什么原因,我们不能直接计算它。使用 MCMC 方法,我们将有效地从后验分布中抽取样本,然后计算统计数据,比如抽取样本的平均值。

首先,MCMC 方法选择一个随机参数值来考虑。模拟将继续生成随机值(这是蒙特卡罗部分),但要遵守一些规则来确定什么是好的参数值。诀窍是,对于一对参数值,在给定我们先前的信念的情况下,通过计算每个值解释数据的可能性,可以计算出哪个是更好的参数值。如果一个随机产生的参数值比上一个更好,就以好多少决定的一定概率加入到参数值链中(这是马尔可夫链部分)。

为了直观地解释这一点,让我们回忆一下在某一特定值的分布高度代表观察到该值的概率。因此,我们可以认为我们的参数值(x 轴)展示了高概率和低概率区域,显示在 y 轴上。对于单个参数,MCMC 方法从沿 x 轴随机采样开始:

Red points are random parameter samples

由于随机样本受制于固定的概率,它们往往会在一段时间后收敛于我们感兴趣的参数的最高概率区域:

Blue points just represent random samples after an arbitrary point in time, when convergence is expected to have occurred. Note: I’m stacking point vertically purely for illustrative purposes.

在收敛发生后,MCMC 采样产生一组点,这些点是来自后验分布的样本。在这些点周围画一个直方图,然后计算你喜欢的任何统计数据:

根据 MCMC 模拟生成的样本集计算的任何统计数据都是我们对真实后验分布统计数据的最佳猜测。

MCMC 方法还可以用来估计多个参数的后验分布(比如,人的身高和体重)。对于 n 个参数,在 n 维空间中存在高概率区域,其中某些参数值集合更好地解释观察到的数据。因此,我认为 MCMC 方法是在一个概率空间内随机抽样,以逼近后验分布。

回想一下“什么是马尔可夫链蒙特卡罗方法?”这个问题的简短回答这里又是一个 TL;博士:

MCMC 方法用于通过概率空间中的随机采样来近似感兴趣参数的后验分布。

我希望我已经解释了这个简短的答案,为什么你会使用 MCMC 方法,以及它们是如何工作的。这篇文章的灵感来自于我在 DC 的大会数据科学沉浸式课程中的一次演讲。那次演讲的目的是向非技术观众解释马尔可夫链蒙特卡罗方法,我在这里也试图这样做。如果你认为这个解释在某些方面不切实际,或者如果它可以变得更直观,请留下评论。

现实生活中的 AB 测试

原文:https://towardsdatascience.com/ab-testing-in-real-life-9b490b3c50d1?source=collection_archive---------11-----------------------

一个甜蜜的实验故事

你喜欢烘焙,你的几个朋友都称赞你做的蛋糕好吃。最近,你一直在修补一些想法,将你的南瓜香料纸杯蛋糕带到一个全新的水平。但是你不确定你心目中的哪些改进会在你的朋友中成功或失败。

谢天谢地,你已经听说了的 A/B 测试。

在 A/B 测试中,您运行两个随机实验,测试两个变量 A 和 B,也称为对照和实验。这项技术被广泛用于微调移动和网络应用程序中的客户体验,因为它有助于根据用户与产品的交互方式做出商业决策。

一个常见的例子是测试网站用户界面的微小变化,目的是增加注册用户的数量。

例如,一个测试可以是创建一个比当前网站稍大的注册按钮。你将运行你的变种(更大的注册按钮),对网站的当前版本,也称为控制版本。在运行测试并比较了每个版本的转换率之后,您可以检查拥有一个更大的按钮是否对注册人数有任何影响。我们可以运行不同类型的测试,例如,改变图像,复制或网站的信息架构。

如果与控制版本相比,新版本的注册人数更高,那么您已经找到了一种既能改善网站体验又能提升业务的方法。然而,仅仅增加注册人数是不够的。你需要确保你的结果有足够的统计学意义。换句话说,你需要确保你的测试是以一种注册人数不会偶然增加的方式设计的。

你也可以将 A/B 测试应用到你的纸杯蛋糕实验中!

你可以将使用你的“旧”食谱烘焙的纸杯蛋糕作为对照,并将其与使用相同食谱但添加了少许柠檬皮的纸杯蛋糕进行比较,即实验、,并观察你的朋友们对此的反应。

我如何实际测试哪种配方最好?

为了测试添加柠檬皮的效果,你会把用原始配方烘焙的纸杯蛋糕交给一组朋友,而另一组拿到新配方。为了确保没有人有偏见,每个朋友都被随机分配到他们的小组。

为了以更具分析性的方式收集他们的意见,你可以让两组朋友回答一个问题。例如,你可以问

  • 你会再吃一个同批次的纸杯蛋糕吗?

用这些简单的是/否问题,你的每一个朋友最多能给纸杯蛋糕加一分。结合你所有朋友的分数,你可以用这些数据点来比较两组,看看柠檬皮的味道是否比原来的味道更好。

A/B 测试的一个非常重要的方面是你应该一次只测试一个变体。如果你在同一个实验中引入了多种变化,你就不能把结果归因于某个特定的变化。

最后,如果柠檬皮食谱在你的朋友中更受欢迎,它将成为你的首选蛋糕食谱。

试验设计

最后,你将进行一项统计测试,以确定在纸杯蛋糕中加入柠檬皮是否真的有所改善。

在开始烘烤两批纸杯蛋糕之前,你需要准备好你的食谱和 A/B 测试清单。

A/B 测试清单

  1. 你想回答什么问题?

你可以把这个想成“我的假设是什么?”

无效假设是原味纸杯蛋糕和柠檬皮纸杯蛋糕的总分没有区别。它被称为零假设,因为它假设添加柠檬皮对人们是否喜欢这些纸杯蛋糕没有影响。

另一个假设是,想要第二个柠檬皮纸杯蛋糕的朋友数量比想要第二个用原始配方烘焙的纸杯蛋糕的朋友数量多。

2。你如何评价这个实验?

决定你的新食谱是否更受欢迎的是知道你的朋友是否会吃更多你的纸杯蛋糕。

你的衡量标准是有多少朋友愿意再吃一个同批次的纸杯蛋糕。如果越来越多的柠檬皮小组的朋友声称第二,这意味着在你的食谱中加入柠檬皮会使它更受欢迎。

3。想要的效果是什么?

在新配方中加入柠檬皮的情况下,加入这种新成分的影响微乎其微。

如果你要加入一种更贵的成分,比如每磅大约 100 美元的块菌,你可能会希望观察到结果有一定程度的改善,以证明金钱投资的合理性。通过在你的食谱中加入一种更昂贵的成分,这会让你对你正在做的投资更有信心。

4。实验需要多少人?

如果你给你的两个朋友打电话,让其中一个朋友吃柠檬皮纸杯蛋糕,另一个朋友吃用原始配方烘焙的纸杯蛋糕,你不会对你的测试有最大的信心。

为了弄清楚你需要邀请多少朋友来参加你的纸杯蛋糕品尝测试,你需要提前做一些决定

  • 检验的统计功效
  • 显著性水平
  • 效果大小
  • 基线度量

统计功效

统计功效是正确拒绝零假设的概率。你也可以把它解释为当有所述效果被观察时观察到效果的可能性,也就是说,当柠檬皮的食谱实际上比原始食谱更受你朋友的欢迎时。

在文献中,你可能会看到功率被定义为1-β、,因为它与产生所谓的第二类误差成反比,通常称为β。第二类错误是在应该拒绝零假设时失败的概率。

当你设计一个高功效的实验时,你就降低了犯第二类错误的可能性。

实验的统计功效通常设定为 80%。

显著性水平

显著性水平是你用来确保你的测试是以一种结果不是偶然得到的方式设计的。最常用的值是 1%和 5%。这些分别对应于 90%和 95%的置信区间。

效果大小和基线指标

如上所述,效果大小将帮助您确定您希望看到的测试结果的变化量。为了做到这一点,我们必须把它建立在我们今天所观察到的基础上。

这意味着你需要知道我们的基线度量是什么,也就是你用来评估测试功效的度量的当前值。

我们已经定义了,我们将使用朋友的数量作为测试成功的衡量标准,这些朋友想要从同一批中得到第二个纸杯蛋糕。

所以,如果今天尝过你的纸杯蛋糕的人中有 50%想吃第二个,你知道你的基线指标是 0.5。有鉴于此,你知道你的实验有多大的改进空间。例如,假设您的基线度量是 95%。

有了这些信息你就知道了

  • 你的食谱已经很成功了😀
  • 几乎没有改进的空间(5%),这可能证明运行更多测试来微调配方的努力是正确的,也可能不正确。
  • 作为你测试的结果,你不能期望和改进大于 5%!这似乎是显而易见的,但在评估结果时,这是一个很好的检查。

准备好所有的东西后,你可以使用在线计算器或者使用 R 统计语言来确定你需要招募的朋友数量(样本大小)来品尝每一种食谱。

Using R to calculate the sample size

在我们的纸杯蛋糕实验中,我们需要 45 个朋友来尝试每一种食谱,假设我们的基线为 50% (p1),预期效果大小为 25% (p2 = p1+效果大小),显著性水平为 5%。

您还会注意到,我添加了备选项=单侧,这是因为将运行单侧统计测试。那是因为我们的另一个假设是想要第二个柠檬皮纸杯蛋糕的朋友数量比想要第二个用原始配方烘焙的纸杯蛋糕的朋友数量多

4。实验应该持续多长时间?

在我们的纸杯蛋糕食谱示例中,这并不一定适用。除非我们在你的许多朋友都在节食的时候运行它,他们的行为会与预期的大相径庭。

然而,在像提高注册转化率的实验这样的商业场景中,实验的持续时间非常重要。你需要考虑网站访问的趋势和季节性,选择一个足够宽的时间范围,这样它们就不会干扰实验。

例如,如果你在网上销售产品,你可能不应该在黑色星期五这一周进行实验,因为我们知道用户更有可能在不同的网站上寻找最佳交易。或者,如果你销售户外产品,并且你知道,从历史上看,七月是你表现最好的月份,你可能也应该避免在那个月进行测试。即使你可以利用较高的网站访问量,这些客户可能会非常渴望得到他们所有的露营装备,不管你做了什么改变,他们都会购买。

你让你的 90 个朋友尝试你的食谱。

在吃了原始配方纸杯蛋糕的朋友中,有 25 人想再吃一个同一批次的,相比之下,吃了柠檬皮纸杯蛋糕的朋友中有 32 人想再吃一个。

为了比较两组的结果,弄清楚加入柠檬皮是否真的有改善,你需要回到假设上来。零假设假设添加柠檬皮对人们是否喜欢这些纸杯蛋糕没有影响。

“d-hat”是两组朋友的结果之差。

另一个假设是,吃第二个柠檬皮纸杯蛋糕的朋友比吃第二个用原始配方烘焙的纸杯蛋糕的朋友多。

更多的朋友喜欢柠檬皮纸杯蛋糕。这是偶然的吗?

为了确定这些结果是否只是偶然,我们需要计算两组结果差异的置信区间。这个区间将让我们了解两组之间的差异值的范围。

因此,我们需要计算混合概率,这只是一种混淆的说法,即我们正在组合我们将要比较的两个样本的概率。

计算置信区间的最后一块是标准误差。它估计所获得的结果会有多大的变化,即样本分布中的值会有多广。

在这种情况下,我们将计算一个合并标准误差,它结合了两个样本的标准误差。

最后,我们的假设看起来像这样

因为我们选择了 5%的显著性水平,因此 95%的置信区间,我们将这 5%归因于钟形曲线两个尾部之间的机会。我们假设数据的分布是正态的。

然后,我们使用一个互补的累积 Z 分数表来查找 Z 统计值对应于 0.025 的值。

Part of the complementary cumulative Z-scores Table

那就是 1.96!这就是为什么我们在定义中有它的替代假设。为了拒绝零假设,我们想要证明观察到的差异大于某个值周围的某个区间,该值是指 5%的结果是由于偶然。因此,使用 z 分数和标准误差。

回到主要问题:柠檬皮纸杯蛋糕更受欢迎吗?

用所有的片段来计算另一个假设

一切都表明我们可以拒绝零假设。每组估计概率之间的差值大于我们不等式的右边。那么,是的,柠檬皮纸杯蛋糕在你的朋友中更受欢迎。

但是,柠檬皮食谱应该成为你的首选蛋糕食谱吗?

你还记得我们决定我们想要看到的最小效果至少是 25%吗?它现在会帮助我们!

基于我们选择的显著性水平(5%),我们可以定义我们的置信区间

当我们选择最小效应时,我们是说,我们希望至少看到,控制测试和实验测试结果之间的差异。

然而,如果我们看看置信区间,我们可以看到,这并不能完全保证我们会看到这么大的差异。即使置信区间包括 0.25 的最小效应(25%),我们也从区间的下限看到,存在最小效应不被保证的情况。因为它的值远低于 0.25。

结论

事实上,柠檬皮纸杯蛋糕在你的朋友中更受欢迎。

如果调整这一配方成本更高,或者需要更多的时间和人力来整合到当前配方中,建议保留原始配方。因为你可能不会像你希望的那样,在你的朋友中多受 25%的欢迎。

如果它相对便宜,并且在烘焙过程中不涉及太多的工作,那么它值得成为你的首选食谱。因为从测试来看,更多的人在吃了第一个蛋糕后,还想吃第二个柠檬皮蛋糕,这有可能比原来的配方好 25%。

感谢阅读!

关于谨慎选择你的优化算法

原文:https://towardsdatascience.com/about-choosing-your-optimization-algorithm-carefully-d5d3b721071d?source=collection_archive---------3-----------------------

为什么模拟很重要?首先,我们需要它,因为许多现象(我甚至可以说是所有有趣的现象)无法用一个封闭的数学表达式来封装,而这基本上是你可以用笔和纸或数学软件来完成的。听起来很抽象?好的,那么让我给你举个例子,为什么我们需要模拟。假设你的工作是做优化,你有一个变量,你要做的就是在这个变量的定义范围内找到一个点,这个点给你一个最佳解。比方说,我们想算出煮肉酱面的最佳时间,以获得完美的味道。现在肉酱面可以从 0 分钟煮到 1200 分钟,这是一个非常宽的范围。也就是说,我们有一种方法来评估肉酱面是否完美,给定它被烹饪的分钟数。我们姑且称这个神奇的评价函数 f( t )。现在关于 f 的恼人的事情是,我们只能在给定一个 t 的情况下评估它,我们不知道它一般是什么样子。因此,我们必须搜索 t 来寻找给出完美味道的值。

由于这个原因,我们必须搜索整个空间,即模拟功能,直到我们对它的样子有一个清晰的概念。这里展示的景观只是一维问题中的一个例子。现在想象你有 D 个维度,你把每个维度分成 M 个部分。你可以很快意识到,这个空间随着维度的数量呈指数增长,这是一个讨厌的等式。这基本上意味着,如果你把 10 个变量分成 10 份,你将有 10 个⁰=10 十亿个可能的解来搜索。你觉得 100 亿听起来可以吗?嗯,也许是吧。但是接下来让我用计算时间来代替。假设你有一个相当复杂的评估函数,每秒只能评估 1000 个点。这意味着你将不得不在电脑上花费((1010)/1000)/3600)/24𐅽116 天的模拟时间来搜索这个景观。更糟糕的是,您可能需要搜索的大多数变量或参数很少能分解成 10 个有效部分。更常见的情况是,参数和变量本质上是连续的,这在原则上意味着“部分”的数量是无限的。出于各种实际原因,这可能意味着每个维度都需要数百个部件,产生了((((10010)/1000)/3600)/24)/360𐅽3.2)十亿年的计算时间。这几乎和我们的星球一样古老,我们的星球现在已经有 45 亿岁了。我们不能等那么久!

幸运的是,今天大多数计算机可以同时计算超过 2000 亿次运算,这意味着即使我们天真的计算也可以归结为((()10010)/200000000000)/3600)/24)/360𐅽16 年。这反过来意味着,如果你能把分裂的数目减少到 40 个,那么你就能在((((4010)/200000000000)/3600))𐅽14.5 时间)内搜索整个景观。事实证明,科学让我们有能力以非暴力的方式搜索风景,这意味着我们不必评估我们将空间切割成的所有点。我们可以评估梯度,也可以将函数拟合到指导空间探索的数据中。这一切都可以归结为,事实上,我们可以使用先进的方法在一天内搜索数百个变量和参数。我们现在将研究其中的一些方法!

我们想通过调整烹饪时间来优化肉酱面的质量。正如我们在上面看到的,这不是一个很好的优化函数,这使得它在鲁棒性和避免局部最大值的能力方面非常适合硬核测试算法。

由于有许多优化方法和算法,我将尝试对最常见的和我喜欢使用的方法和算法进行基准测试。这不是一个详尽的列表,可能还有更多值得添加的,但这是我知道的列表。希望它能引导你选择前进。

我们将要研究的算法主要是在 NLopt 中实现的,除了模拟退火来自于 R 中的标准 optim 函数。无论哪种方式,算法列表都是:

  • 模拟退火
  • 改进的随机排序进化策略( ISRES
  • 通过线性逼近进行约束优化( COBYLA )
  • 通过二次逼近的界限优化( BOBYQA
  • 低存储 Broyden–Fletcher–gold farb–Shanno 算法( LBFGS )
  • 扩充拉格朗日算法( AUGLAG )
  • 内尔德-米德单纯形法
  • 序列二次规划( SLSQP )

由于一些算法(甚至大部分算法)可能严重依赖于初始值和起始点,因此我们对所有算法运行 500 优化,并采用随机起始点。每个算法在每次迭代中接收相同的起点。因此,每个算法开始在 500 个不同的位置进行优化。在我看来这是个公平的安排。

那我们来看结果。下面你会看到 500 次试验中每个算法找到的最佳肉酱面质量的方框和须状图。毫无疑问,一切都很好。然而,增广拉格朗日,模拟退火和 BFGS 是迄今为止最差的。他们也是最不一致的人。这基本上意味着它们对局部极大值非常敏感,无法正确探索整个景观。这并不奇怪,因为它们是基于梯度信息的。不管是不是二阶,它仍然是梯度信息,而且我的朋友本质上总是局部的。

不同算法的优化都去哪里了?让我们做一个散点图,一探究竟!实线是我们最初的博洛尼亚函数,我们希望根据参数时序 t 对其进行优化。

实际上看起来很糟糕。尤其是对于许多基于梯度的方法,因为它们陷入局部最大值或 0 梯度区域。他们中的大多数人只能在某些时候找到正确的解决方案。这与盒须图一致。然而,我要说的是,它实际上比情节中出现的更糟。只是为了说明你得到了多少糟糕的优化,看看下面的图,我们抖动了方块上的点。

那么,博洛尼亚优化的平均结果是什么呢?为了了解这一点,我们将使用稳健的统计数据来确保我们确实选择了经过优化的值。在这种情况下,稳健统计将是中值。现在我们来说明不同算法得出的平均烹饪时间。为了好玩,我们也将向您展示平均结果。只是为了你的教育乐趣。

Performance of the different optimization algorithms!

上面的表格非常清楚。从优化的角度来看,平均、中值、最坏和最好情况的结果都很清楚。这里唯一的潜在问题是时间。进化算法是出了名的慢。所以你可以自己尝试一下,看看是否会得到类似的结果。

推理快乐!

最初发表于doktormike . github . io

关于那些过于喜欢聚合的管理者

原文:https://towardsdatascience.com/about-managers-who-love-aggregations-a-bit-too-much-84ff8333104c?source=collection_archive---------6-----------------------

MS Excel is a dangerous lover | Image source: Pixabay

这是一个关于太喜欢聚合的公司的故事。数据驱动的决策似乎是管理中的新圣杯,但是数字总是可信的吗?在精通数据的企业中,什么是关键:人、合适的技术,还是——剧透——是更基本的东西?这些问题在新经济中变得尤为紧迫,因为未能接受数据可能会成为主要的增长障碍,甚至更糟,成为企业的死刑。

商业本能

最近,我和一个朋友一起吃午饭,他的工作是管理销售人员。我喜欢我们与工作有关的谈话:它们促使我从管理的角度看待问题,这与我通常的顾问视角截然不同。

我的朋友告诉我,他的一位同事更喜欢相信自己的直觉,而不是数字。

“哦,亲爱的,”我听到自己说。我能感觉到这位数据科学仙女又开始秃顶了。

但他的观点远非疯狂。他说,在像他的公司这样的全球性公司里,你看到的报告可能误导多于帮助。经理们经常处理总数:总销售额、预算或雇佣人数。这些数字本身就脱离了背景。当一次销售的总销售额超过一个级别时,允许这些小事件发生的条件就被抛弃了。除了地区、产品或销售人员等典型的描述符之外,很少有已知的细节。信息太少,无法全面阐述基本策略,什么有效,什么无效。管理层被认为是在这种高度概括的商业视野中运作的。

我们的经理认为总数太脱离上下文,不可信。有了这样的概括水平,就很容易通过数字撒谎,或者掩盖谎言。对她来说,跟着直觉做决定和其他策略一样有效。可悲的是,我觉得我背叛了我的工作原则,于是我同意了。她并没有犯根本性的错误;相反,她看穿了一个看似合法的系统的不稳定基础。

当总数增加时

我和我的朋友一致认为这种策略是不可持续的。Zara 在对话中提到:“这些家伙真的知道如何使用他们的数据。”

Zara 是一家非常成功的全球性公司。Zara 重新设计了他们的业务,以更快地响应市场:趋势,生产和交货方式。使这一战略奏效的关键因素之一是摆脱中央计划的收藏。Zara 意识到,除了 Zara 中国,他们的西班牙分公司还迎合其他客户的需求。市场差异是重组组织背后的力量。结果,决策权被分配给了各个地方实体。区域管理层只需担心自己的市场,因此它对变化的反应变得比任何中央机构都更快、更相关、更敏捷。Zara 欣赏市场多样性;一个单一的全球集合不会适合所有人。

我恍然大悟:真正的问题不是分析能做什么或不能做什么,而是它如何被企业应用。在我朋友的职业生涯中,经理们不信任商业智能,而他所钦佩的公司却全心全意地信奉商业智能。理论上,分析是做出明智决策的关键因素,但对一些组织来说,这显然适得其反。这些公司看到了主要趋势,但却忽略了所收集数据的多面性。

科技是罪魁祸首吗?我们都知道相反的情况:今天,经典分析与可视化工具和数据处理引擎的复杂性相结合,为我们提供了对数据的前所未有的访问。商业智能在多维信息分析中蓬勃发展:从不同角度查看数据是其构建原则。一个角度可以是回顾区域层面的销售,并与某个时刻进行比较:我们上个月在法国销售了多少?与去年同月相比有所增加吗?一个更复杂的角度是查看一个区域内各地区的数据分布,以了解不同地理位置之间购买行为的差异。另一种分析是研究买家的人口统计数据,将其与已知的一般人口和竞争对手的基数(在法律允许的范围内)进行比较。正式名称为“切片和切块”,自从商业智能系统出现以来,它就一直是商业智能系统的一个特征。

Happy sleeping seals are an excellent illustration of a successful aggregation | Image source: Ernie Witham

潜在的游戏规则改变者,分析被普遍滥用。商业智能报告可能是精心制作的,但只有少数人理解。经理们可能会欣赏分析的价值,但他们没有接受过处理数据的培训,也无法提出正确的问题来挑战别人的产品。结果,这项技术被曲解、误用,或者充其量只是用来支持某人的直觉。分析,无论多么聪明,都不是灵丹妙药——除非商业文化改变,否则根本不是灵丹妙药。

问题是系统性的。许多企业的现实是决策权高度集中。这些少数决策者经营的是扁平化的业务:分析为他们提供了正确的数据,但在详细描述其构成要素方面却不透明。一旦高层决定了战略,数据就会反馈给低层管理人员。自上而下的沟通让人们站在管理层的角度,但没有权力总结自己的观点。因此,他们根据别人的观点做决定,或者作为前面提到的经理,他们拒绝无关的数据,凭直觉行事。这种商业文化未能授权优秀的决策者根据可用数据采取行动。该系统旨在扼杀敏捷性和放弃上下文。

数据驱动的决策是管理中的新流行语,但是如果系统不允许改变,数据应该如何驱动改变呢?

数据驱动的决策修补

世界上充满了这样的例子:公司如此热爱聚合,以至于不再关注销售点发生的事情。这些公司中有许多是全球性的。它们受益于规模经济、技术壁垒,以及可能的极少竞争,这些都让它们对客户听不到声音。

所谓的“客户关怀”是商业无知的头号例子。大多数服务提供商(移动网络是最主要的例子)允许客户只处理一线支持。有大批受过训练的人会告诉你“这是他们能做的一切”,或者“这是公司的政策”。他们很少能提供比谷歌搜索更多的帮助,但你会得到一种你被倾听的印象。如果他们不能解决你的问题或提高你的报价,那么你就把你的不满带回家:这个案例甚至没有被记录。管理层不知道你。公司从不改变。然而,他们的总销售额仍然显示盈利。

大数据似乎已经开始改变现状。客户锁定,即不太可能更换服务提供商,已被视为业务增长的巨大障碍。据说获得一个新客户是昂贵的,因为它需要把这个人从竞争中抢走。留住客户的成本相对较低,因为他/她已经和我们在一起了,但回到第一点,失去一个客户的成本非常高。许多公司利用大数据来识别潜在的搅动者并阻止损失。人们的行为被分析:他们如何使用服务,他们如何支付,他们的朋友是否在使用服务?这显然比报告更上一层楼,但这只是延续了做生意的老一套方式。没有努力改变公司。不满意的客户的识别和可能发生在客户关怀层面的解决方案被延迟和处理,如果有的话。这是数据驱动的决策修补,而不是决策。

摘要

商业文化需要经历一场根本性的变革,成为数据驱动的。不是新的工具、更多的数据或拥有博士学位的员工会让这种变化发生。一个系统,一个程序,或者一个机器人,被设计成最合理,最有能力,最防失败的,只有在它运行的环境允许的情况下才被付诸行动。分析已经存在很多年了,但它们继续被滥用,因为它们所支持的商业模式本质上是不兼容的。按照设计,集中管理的组织阻碍变革;现在是决策变得更加民主和分布式的时候了,数据也是如此。

— — — — — — — — —本文原载于数据漫游。

如果你喜欢这篇文章,请务必查看我的上一篇文章,在这篇文章中,我寻找难以捉摸的数据科学家,并且在 Twitter 上关注我的更新!

关于走向数据科学

原文:https://towardsdatascience.com/about-towards-data-science-d691af11cc2f?source=collection_archive---------9-----------------------

最后更新于 2022 年 11 月

我们努力呈现我们的读者乐于阅读的写得好、内容丰富的文章。

Photo by Ian Schneider on Unsplash

东方数据科学公司是一家在加拿大注册的公司。通过使用 Medium,我们为成千上万的人提供了一个交流思想和扩展我们对数据科学的理解的平台。

媒介生态系统

“你在其他地方找不到的想法和观点。”

对人而不是广告的强调使得媒体独一无二。它不仅有助于作家展示他们的原创思想,而且还为广大读者提供了一个清晰的阅读体验。

媒介生态系统保持清晰透明,具有用户友好的服务条款和简单的规则可供所有人使用。作家受到更好的保护,因为他们控制着他们作品的许可证。

此外,2017 年,Medium 推出了互联网的第一个开放付费墙。这种付费墙使创作者能够从相信想法和创意值得付费的读者群体中赚钱。我们很高兴成为其中的一员!

我们于 2016 年 10 月加入 Medium 充满活力的社区。起初,我们的目标只是收集好的帖子,并将其分发给更广泛的受众。仅仅几个月后,我们很高兴地看到,我们有一个非常快速增长的观众和许多新的贡献者。

今天,我们与超过 4 名编辑和 15 名志愿编辑(编辑助理)一起工作,为我们的观众准备最精彩的内容。我们使用 Medium 的私人笔记向我们的贡献者提供定制的反馈。这使我们能够在社交媒体上推广我们的最新文章,而不会增加使用其他平台时可能遇到的复杂性。

Photo by Rodion Kutsaev

令人印象深刻的贡献者

Medium 生态系统的成功吸引了越来越多渴望分享重要事物的独特声音。2017 年 2 月,Medium 首席执行官 Ev Williams 报告称,每周有超过 5 万名作家在 Medium 上发表文章。这个惊人的数字还在增长。更好的是,Medium 是一个面向所有人的平台,这意味着你可以找到来自世界各地的作者——他们是专业的,也是新手。

这个令人印象深刻的作者社区提升了我们的追随者,推动了数据科学的早期发展,并继续成为我们仍然存在的原因。2020 年 1 月,我们统计了全球各地的数千名作者,我们很高兴每天都能收到你们这么多的新投稿。

人们出于各种原因加入,无论是为了接触更广泛的受众,获得重要的反馈还是在我们的社区内建立专业网络。其他人喜欢和我们一起出版,因为他们仍然是他们原创作品的唯一所有者。无论我们的作者是选择每周一次、每月几次还是一年几次与我们一起发表,他们都做出了独特的贡献,成就了今天的我们。

例如, Jonny Brooks-Bartlett 发表了几篇关于概率的文章。 Susan Li 与数据科学社区分享了她最新的代码和教程。乔治·赛义夫解释了不同类型的聚类算法以及其他一些概念。

自从我们开始以来,我们对收到的帖子的质量感到惊讶。我们可以感受到努力工作和愿意分享一些重要的东西。我们很荣幸能够帮助和支持我们的贡献者传达他们的信息。

虽然我们允许独立作者根据我们的 规则和指南 发布文章和视频,但我们不认可每个作者的贡献。

Some of our most-read articles

目的和价值

我们的目的

“走向数据科学”最初是一个辅助项目,旨在帮助数据科学和机器学习社区共享概念、想法和代码。

现在是一个国际化的团队,我们日以继夜的工作在这个平台上分享的内容。每天,我们都会审查提交的内容,并向众多作者提供反馈。最重要的是,我们总是致力于新的项目,以帮助我们的贡献者达到我们的观众。

对于我们所做的一切,我们都尽可能地让社区参与进来。

我们的目标是呈现我们的读者乐于阅读的写得好、内容丰富的文章。最终,我们希望让世界变得更美好。我们相信共享和开发数据相关知识是实现这一目标的关键部分,因此我们努力为我们的社区带来价值。

“我们相信,数据相关知识对于让世界变得更美好至关重要。”

一路上我们做的一些选择

随着我们的出版物逐年增长,我们必须决定分享我们贡献者内容的最佳方式。以下是几个重要的例子:

被托管在介质上。我们很早就决定在 Medium 上进行托管,我们很高兴这样做了。Medium 是一个很棒的平台。它提供了速度,安全性,一个智能手机应用程序,它允许评论,亮点,笔记等等。

我们也理解 Medium 不允许广告。广告正在损害许多平台的声誉,我们不希望商家能够付费让他们的产品出现在你的眼前。它扰乱和破坏思想的交流。我们的作者可以选择他们是否想要付费,我们相信这个平台提供的系统鼓励更高质量的内容。

成长与学习。2016 年,我们开始作为一个开放的出版物,我们接受了我们收到的大部分投稿。我们只是很高兴开始与数据科学社区联系,分享想法和代码。随着我们的受众和责任的增加,我们努力提高 TDS 的质量。从那以后,我们发布了指南、规则和条款,并扩大了我们的编辑团队。我们不断努力,尽一切可能提高我们出版物的质量。

请注意,我们不一定赞同或同意我们成千上万的贡献者写的内容。当我们认为有可能引发有价值的讨论时,我们也会偶尔发表有争议的观点。我们知道看待一个问题有很多方式,我们鼓励我们的作者从不同寻常的角度来看待问题。我们渴望引发明智的讨论,我们喜欢读者们恭敬地提出自己的见解、解决方案和想法。

话虽如此,我们也是人。我们会犯错误,我们偶尔会错过我们发表的文章中的错误。如果你觉得你发现了违反 Medium 标准的东西,Medium 让你可以很容易地举报任何违反其规则的帖子和用户。我们还让我们的社区可以轻松地注册投诉,我们欢迎您的反馈和关注。

将最好、最独特的重要内容进行优先排序:我们在 TDS 所做的部分工作是决定哪些帖子比其他帖子获得更多曝光。我们决定在我们的出版物上刊登哪些文章,以及在我们的社交媒体渠道上分享多长时间和哪些文章。我们花时间试图找到最好的、最独特的、最重要的内容来分享和展示。

当我们使用术语“重要”时,我们指的是关键信息和未被充分表达的想法。例如,我们经常比其他文章更长时间地发布关于机器学习模型的公平性、偏见、安全性和可解释性的特殊帖子,因为我们希望确保尽可能多的人在我们的社区中看到和阅读它们。

我们创建了一个 集合,致力于我们认为我们的社区应该了解更多关于 的内容,并发布了我们认为有价值的帖子。如果你想投稿,你可以在这里找到更多信息。

我们的价值观

保持乐观:有时候,抗议的最好方式就是提出一些新的东西。我们帮助那些试图展示和分享新想法的人。我们提供的新想法和分享的知识越多,我们就能越快地解决紧迫的问题。

关注改进:因为我们关注长期,所以我们总是寻求实现可管理的渐进改进。我们一直希望赢得并建立读者的信任!

心存感激:没有媒体,或者没有我们的社区,我们永远不可能存在。我们感谢所有让这一切成为可能的人。我们特别感谢我们的作者、编辑同事以及其他在这一过程中帮助过我们的人。

Photo by Jason Ng on Unsplash

土地确认函

TDS 是一份拥有全球读者和分布式编辑团队的出版物。我们公司在加拿大注册成立,注册办公地址在通常被称为“多伦多”的地方,这里是许多民族的传统领地,包括在这片土地上生活了 10,000 多年的密西沙加人、阿尼什纳人、齐佩瓦人、豪德诺索尼人和休伦-文达人。今天,这个聚会场所仍然是来自海龟岛的许多土著人的家园,我们承认我们作为非土著定居者在被盗土地上的地位。使用和参与土地确认函是承认该地区土著人民自古以来的持久存在和复原力的一种方式。它们也提醒我们,我们都要对这些关系负责,没有人可以免于追求和解和联盟。

我们对公平和公正的承诺超越了我们的地理位置和历史。TDS 是一份专注于数据科学和相邻领域的出版物,我们承认现代统计和计算的起源往往与优生学、种族主义和暴力行为密不可分。在我们的工作中,我们不仅努力承认这段历史,还积极倡导将数据科学作为反对歧视、偏见和边缘化的力量的声音和研究。

News and Milestones ✨

没有我们的编辑同事,我们的工作是不可能的。自从我们在 2017 年 10 月开始招聘以来,他们已经提高了在“走向数据科学”上发布的内容的质量。我们现在有一个善良、负责的团队,渴望学习、帮助和理解作者的想法。

像许多自下而上的运动一样,走向数据科学也是与朋友、家人和决定不求回报地提供帮助的人一起建立的。我们感谢他们和你所做的一切。

你可以在这里联系我们。

建模中的抽象与现实

原文:https://towardsdatascience.com/abstraction-and-reality-in-model-building-9a82015bf49c?source=collection_archive---------6-----------------------

我怀着病态的兴趣阅读了 N. N .塔勒布的最新长篇大论。

一方面,这是一种政治咆哮,关于他有强烈观点的问题。但是,与此同时,它也是对我们如何概念化的问题,建立模型,处理数据,并采取行动的评论。我不太关心前者,但我显然对后者着迷,所以这篇文章关注后者。

塔勒布不太在乎过于“学术”和“一维”的思维,这种思维将失败归咎于事后的“不确定性”,而没有“参与游戏”。这同时也是一种合理和不公平的批评。学术思维的全部意义恰恰在于,他们与游戏无关,他们能够冷静地审视问题,而不会过多地考虑对他们有什么好处,从而蒙蔽了他们的判断。(从这个意义上说,塔勒布所批评的政策制定者的问题是他们没有参与这场游戏吗?从某种意义上说,他们在这场游戏中有很多利益——如果他们“赢”了,他们会得到很多——但从另一种意义上说,如果他们失败了,他们不会失去很多。这似乎是“游戏中的皮肤”的最糟糕的形式,不幸的是,似乎每个人都想要。)为了能够清晰地看到感兴趣的特征,即使以现实主义为代价,建立模型的全部目的是故意过度简化,用 Weisberg 的话说,就是通过加入“故意的无知”。如果处理得当,事实上非常希望模型是“学术的”和“一维的”

真正的问题在于把模型看得太重,而不知道或不关心在构建它们时所采取的步骤,尤其是在游戏中使用了错误的皮肤时。然而,从某种意义上说,这些遗漏是自然的。我们雇佣专家来用最简单的术语告诉我们答案,而不是告诉我们事情很复杂,因为所有的警告都需要解释。我们希望利用模型来最大化收益和最小化风险,即在游戏中最大化错误的皮肤。这些不是失败,而是被设计的!

在我看来,唯一的长期解决办法是更广泛地传播更深层次的科学素养,理解科学理论的局限性。如果你愿意,科学之所以伟大,是因为科学家努力理解它在何时何地错得有多离谱,而不是因为他们无条件地相信它是正确的。如果处理得当,科学是一种尽量减少错误的努力。工程是尽量减少某些错误的努力。但是这两者都是建立在这样一个前提上的,即总会有错误,并且意识到会发生错误——诚实的科学和工程应该把这些认知放在最前面和最中心。

但是,当面对一个只对答案而不是问题感兴趣的市场,诚实和夸张的答案难以理清时,好的科学能占上风吗?斯蒂格利茨和格罗斯曼认为,一个完全信息的价格体系瓦解了其自身的内在矛盾,因为价格是可以自由观察到的,而搜索真实信息的成本很高。有用的信息一旦被使用,就会迅速反映在价格上,从而否定私人信息的价值——这一过程在今天比以往任何时候都要快。因此,以成本学习有用的东西的激励变成了愚蠢的浪费,而盲目跟随市场的羊群则变得明智——直到羊群集体跳下悬崖。但是,如果这种可能性足够小(希望如此),从众是更明智的做法——尤其是因为从众产生了大量行为良好的数据。同样的逻辑在许多其他环境中盛行,包括思想的市场——如果复杂的模型提供的收益很少,因为它们暗示的灾难是非常罕见的,为什么要麻烦呢?事实上,要不是我们在中期内(可能)永远不会看到的灾难,这些灾难可能不会产生足够大的 n 来进行有用的分析,我们甚至能区分好的复杂模型和坏的模型吗?

其含义似乎发人深省:简单但只有“相当好”的模型总是会比复杂和“非常好”的模型卖得更好,这些模型对于它们自己的好模型来说几乎无法区分。由于模型的一种彼得原理,偶尔会有灾难发生——它们被用在高于其效用的环境中,市场低估了罕见的风险。成熟的工程专业通过建立集体声誉的过度保险规范来管理风险——即使一座给定的桥梁可能不会那么容易倒塌,但在如此多的桥梁中,如果安全边际不是特别大,一些桥梁将在某处倒塌,对土木工程专业产生有害影响。或许这是一个值得效仿的模式。

PS。“大数据”带来的重要附加值是,数据的总体集合越大,可以用来帮助验证更好、更复杂的模型的小子集就越大。这增加了对数据的需求结构,无论是好的科学还是坏的科学。我们需要仔细考虑模型,并询问需要什么样的额外数据来验证模型的哪些方面。这可能需要 A/B 测试,或者只是将注意力集中在无需实验就能收集到的数据子集上。但是简单的更大的数据不是答案:你想要检查模型的哪些方面,你需要什么样的数据?但这需要的不仅仅是围绕大故事的简单故事讲述。你需要细微的差别,来理解为什么一些数据比仅仅有更多的数据更有价值。

从学术界到数据科学

原文:https://towardsdatascience.com/academia-to-data-science-91558063aa9e?source=collection_archive---------2-----------------------

我作为一名数据科学家已经工作了一年多,但在此之前,我在学术界担任博士后研究员。自从我转型以来,我的一些朋友问我关于我的工业数据科学之旅。他们中的许多人正在考虑离开学术界,数据科学是一个有吸引力的选择。虽然,我在数据科学领域的这一年有起有落,但我不后悔我的决定,我肯定会推荐它。然而,这种转变并不完全简单。这对于许多人来说是不同的,所以我写这篇文章,希望它能帮助那些仍然不知道如何实现这一飞跃的人。

我应该提到,我的经历是从一个具有学术研究背景的人的角度出发的,我经常使用数据科学技术方面通常使用的许多工具和技术。这意味着我不必真的从零开始,做许多过渡课程。然而,如果你觉得我的经历与你无关,你还是很幸运的。玫瑰花蕾安乌里。写了一篇关于她进入数据科学的之旅的精彩文章。这是一个非常成功的故事,值得一读。

我在学术界有什么问题?

当我在 2012 年开始攻读博士学位时,我并不确定自己以后想做什么,但我认为我最有可能留在学术界,成为一名教授(可能是应用数学或类似的专业)。学术界吸引人的一些因素,尤其是科学和数学,包括:

  • 目标很明确。为了人类的利益,我们都想更多地了解我们周围的世界。这与工业相反,工业的目标是赚更多的钱。如果你在工业部门工作,你会被出卖的。
  • 每个人都会在完美的协作中工作,我们希望其他人都好,因为我们有共同的目标。相比之下,创意在工业界是保密的,因为你需要自私才能赚钱。
  • 完成工作不会有太大的压力,因为学术严谨是最重要的。因此,你总是知道你在做尽可能最佳的工作。

Me looking through a microscope for protein crystals that I grew. This photo was taken back in March 2015

哦,我是多么失望啊!以上都不是完全真实的。我觉得学术界的大多数问题都源于发表或灭亡文化,但那是另一篇博客文章的主题。

除了意识到我对上述的幻灭,还有其他原因让我想离开学术界。

  • 我对我在生物学应用中使用的软件工具和算法越来越感兴趣,这是我所在领域的核心。
  • 我希望有一天能有一个家庭,而学术界的短期合同的性质与家庭生活不相容。
  • 我想在晚上和周末放松一下(在学术界,在正常工作时间之外工作是很常见的)。

我交谈过的许多早期学者都经历了我上面提到的同样的问题,所以我知道我不是唯一有这些观点的人。

我让学术界听起来很糟糕。事情没有我想象的那么糟糕,事实上我的研究小组棒极了。我有很好的同事和很棒的导师,但问题是我不会在我整个学术生涯中都在这样一个令人惊叹的团队中。

我是怎么出来的?

在我博士期间,我在阅读卡尔曼滤波器时遇到了“机器学习”和“数据科学”这两个术语,因为我在做一些工作时需要用到它们。特别是数据科学,这是我第一次遇到一个似乎集中在我喜欢的学术领域的领域;复杂的算法和很酷的技术(数据科学还有很多,但这是我当时关心的)。

随着时间的推移,我阅读了大量关于数据科学的书籍,并发现我已经使用了相当多的常用数据科学工具:我已经使用 Github 好几年了。我精通一些编程语言,包括 Python(我不使用 R,但我以前用过一次,如果我真的需要,我觉得我可以学习它)。我也有做回归、优化和贝叶斯推理等方法的经验。

尽管知道所有这些,我仍然觉得没有资格做数据科学。当你在网上读到数据科学和机器学习的时候,你会感到不知所措。似乎每天都有新的算法或技术需要你去了解,如果你不知道,那么你已经是这个领域的恐龙了。这不是真的,但它肯定会有这种感觉。

提升我的技能

我参加了一些在线课程来提高我的数据科学技能,但我觉得我学得不够快。幸运的是,我在 Twitter 上看到了 ASI 数据科学训练营。然而,申请截止日期不太合适,我觉得科学到数据科学 (S2DS)训练营更适合我。

关于我在 S2DS 训练营的经历,我将把细节留到更全面的帖子中,但简而言之,我学到了一些非常重要的东西。其中最重要的一点是,我已经具备了成为一名初级数据科学家所需的技能。我不需要精通每一种新的复杂算法,也不需要成为最新高性能计算工具的专家。另一件重要的事情是,数据科学家是一个非常广泛且定义不清的工作角色,因此找到合适的工作需要大量的研究。

找到工作

在完成我的博士学位和学位后,我开始找工作。花了大约 3 个月的时间最终找到了一份工作,在此期间,我发现传统的求职方法(向我没有联系的公司发送简历)对我来说不太管用。我很幸运,组织 S2DS 训练营的公司 Pivigo ,也组织了商业分析和数据科学会议,并邀请我介绍我在训练营中所做的工作。我现在的雇主当时在观众席上,剩下的就是历史了。我还得到了另一位雇主的第二份工作邀请,那晚他也在观众席上。

那么我会给出什么建议呢?

我已经写了一篇博文,专门讲述了我在求职过程中所学到的东西,所以我不会在这里重点讲述获得数据科学工作的那个方面。相反,这里是我对准备阶段的建议,即当你考虑进入数据科学领域,但在正式申请之前,你应该做些什么。

  • 与数据科学家交谈。了解他们做什么,并发现数据科学是否适合您。伸出手去。人们总是乐于谈论他们自己和他们的工作;)但最重要的是,它可能对你的职业决策有所帮助。有人在 LinkedIn 上突然联系我,希望进入数据科学领域。几个星期后,我们面对面共进午餐,我给他一些建议。现在,他在谷歌 deep mind 的资助下攻读数据科学硕士学位。
  • 多读书! 玫瑰花蕾安乌里。说的也是。你永远不会知道太多。你知道的越多,你的处境就越好。当申请的时候,你将能够做出更明智的决定来帮助你。
  • 开始学习使用工具。如果你不懂编程语言,那就去学一门。例如,我通过在 it 领域实现我的博士工作来强迫自己学习 Python(和其他语言)。如果你需要学习如何使用特定的工具,比如 Git/Github,云计算等等。然后想办法把它融入到你现在的工作中。或者如果你有时间的话,你可以做些兼职。网上有很多资源可以帮助你开始,如果你找不到人,就去问。例如,如果有人要求我写一篇关于某事的博客,我会非常高兴,因为我喜欢知道我的成果会对别人有用。
  • 展示你的知识为你的项目公开 Github 库。在 Medium 上写博客(我真的很爱 Medium)。它允许雇主或招聘人员搜索你。或者更好的是,雇主可以在考虑你的申请时搜索你,并查看你的工作来支持你的简历。当我们招聘的时候,我在浏览简历,我记得有一个候选人的个人博客的内容给我留下了深刻的印象。因此,他答应来和我们面谈。
  • 开始建立你的人际网络。去数据科学聚会和人们交谈。在 LinkedIn 上联系人们。就像他们说的重要的不是你知道什么,而是你认识谁如果你和合适的人接触,你永远不知道会发生什么。

非常感谢您的阅读,我希望这是有用的。

从学术界到数据科学:正在进行的工作

原文:https://towardsdatascience.com/academia-to-data-science-a-work-in-progress-23515d20872c?source=collection_archive---------5-----------------------

“A tiny sprout growing in fine sand casting long shadow” by Evan Kirby on Unsplash

大约一年前,我终于忍气吞声,下定决心,大学生活不适合我。这来之不易。在做出决定之前的几年里,我在探索其他职业和试图说服自己在神经科学实验室做博士后是正确的道路之间摇摆不定。这是一场斗争,一方面,我觉得自己感兴趣的问题类型已经改变,另一方面,我担心跳槽意味着我浪费了过去 3-4 年的职业生涯。最后,我接受了这样一个事实:无论我做出什么样的决定都是好的。重要的是承诺并坚持到底。

在某种程度上,离开学术界去从事数据科学似乎是一个自然的下一步(尽管是替代的)。自从上大学以来,我花了很多时间对促使人类和其他动物做它们所做的事情的外部和生物因素感兴趣。然而,最近,我对在更大范围内测量人类行为的想法产生了兴趣,并实际上利用这种洞察力来影响决策。虽然这在学术界似乎是一个艰难的问题,但它本质上是许多数据科学职位的工作描述。

自从决定离开学术界以来,我发现了一些有用的途径和建议,还有一些我可能不需要的。有些事情我认为我做得很好,有些事情我并不特别自豪。有些资源花了我很长时间才找到,我希望我能早点找到。这篇文章收集了一些关于这方面的漫谈,目的是传递给任何感兴趣的人。

在开始之前,有一件事我显然需要澄清:我仍在完成我的博士学位,因此无法用任何具体的成功措施来支持以下任何建议。对于数据科学职位的面试或求职,我也不能给出任何见解。如果人们觉得这篇文章有用,并且我在未来成功地完成了转变,我会很乐意在以后发表这些经历和更多。

秘诀 1:下定决心

正如我之前讨论的,我花了很长时间才决定离开学术界。有很多原因可以解释为什么你会这样。可能是你害怕让你的导师和同事失望。或者,像许多人一样,你发现进入一个你知之甚少的领域是令人生畏的。不管原因是什么,有一点是肯定的:

你打电话的时间拖得越久,一旦你最终成功转型到数据科学,你的时间就越少。

秘诀 2:一点一点来

学习获得数据科学工作所需的一切可能会非常令人生畏,尤其是如果你是从零开始的话。你需要用 python/R 进行分析(ew Matlab -参见这个 twitter 线程),你需要了解 SQL(尽管基本上没有理由在研究实验室环境中使用它),你需要温习你的统计数据,你可能想要掌握一些机器学习甚至一些深度学习。你可以每天花几个小时疯狂地试图学会所有的东西,结果却筋疲力尽并放弃了,因为它妨碍了工作。或者,你可以试试这个:

设定一个超低的标准,目标是在大多数日子里做最少的̶̶e̶v̶e̶r̶y̶̶

有一堆心理学/神经科学的文献我不会引用(主要是因为我很懒,Charles Duhigg 在他的书习惯中总结得更好,你应该相信我,我是一名神经科学家)说为了养成习惯,你应该设定小的日常目标。实际上,当你完成了今天的目标后,你会有成就感,这增强了你明天再做一次的愿望。而且,很多时候你最终会超出你的目标,因为最困难的部分是克服激活障碍。如果你坚持这样做,你会在几周/几个月后回顾过去,并且想“我想我现在知道 python 了,不是吗?”。

我发现有一些资源可以很好地适应这种策略,如下所示:

  • www。如果你是从零开始,并且想从 Python、SQL、Git 等学习一切,这是很棒的
  • Coursera 上的任何数据科学课程,特别是吴恩达的机器学习课程和深度学习专业
  • 3blue1brown 线性代数精粹温习一些数学知识。还有微积分和神经网络。

这对于这种学习策略非常有用的原因是,这些材料被拼接成 10-20 分钟的视频或练习,对于一些小目标来说是完美的。还有一个有趣的注意:我设定的目标是为这篇文章写一段话,但是我陷入了一些漫无边际的话题。

技巧 3:屈服于你的罪恶快感

在我决定学习数据科学交易工具后,一些奇怪的事情开始发生。我的公寓开始积累关于 python、SQL、特征工程、深度学习的技术书籍。出于某种奇怪的原因,我甚至发现自己把这些书放在背包里上下班;我绝对没有看。我买下了每一本书,打算坐下来从头到尾读上几个小时。直到今天,我还没有完整地读完其中的一本。我曾经对此感到有点内疚(现在也是)。但是后来我发现我做错了什么。我试图阅读这些书,但我从书中学到的知识并没有立即派上用场。结果,我会觉得自己对刚刚读过的东西有了很好的理解,但这很快就变成了一种模糊的熟悉感。解决这种奇怪行为的方法是把书放在一边,开始一个新项目,目标是解决一个我感兴趣但鉴于我的技能组合可能难以解决的问题。不出所料,我经常在分析中遇到障碍,因为我不知道如何去做。然后我会意识到,“废话,我有一本书,可能可以教我如何做到这一点”。这将导致我狼吞虎咽地阅读整个章节,试图找出如何解决我的问题。所以我的建议是:

去吧,屈服于你买那本奥莱利新书 的罪恶感吧(如果你有钱的话)但是一旦你收到钱,就把它放在一边,开始一个项目。

我桌子上积灰最多的三本书:

  • aurélien géRon使用 Scikit-Learn 和 TensorFlow 进行机器实践学习
  • 杰克·范德普拉斯的《Python 数据科学手册》
  • 机器学习的特征工程Alice Zheng

未完待续……

如果上面的一些内容描绘了一幅研究生生活的灰暗画面,那不是我的本意。研究生生活的某些方面我不喜欢,但有些事情我几乎肯定会怀念。因此,有很多理由离开学术界,但也有同样多的理由留下来。此外,虽然不久前可能不是这种情况,但我相信甚至可能会有一些情况,你可能想进入学术界,并打算在短期工作后离开。为了不使这成为一个不合理的冗长的文本墙,也许我会把这些留到另一篇文章中。

欢迎在下面留下任何评论或反馈。如果这看起来对任何人有用,我更愿意再写一篇。另外,在 twitter 上关注我吧,这样我就不会觉得自己在发微博了。

最后一个临别的想法:如果你担心离开学术界,因为你认为这样做是失败的,我鼓励你看看下面的图表,并查看一下 这个 twitter 帖子,寻找一些好的感觉

Where will a biology PhD take you by Jessica Polka

学术生态系统被破坏了,我们应该如何恢复它

原文:https://towardsdatascience.com/academic-ecosystem-is-damaged-heres-how-we-should-restore-it-b038f81c367b?source=collection_archive---------3-----------------------

我在伦敦大学学院(University College London)攻读组织心理学硕士学位时,意识到学术界的生态系统遭到了破坏,而目前我们没有采取多少措施来恢复它。

这一切都是从我了解 p-hacking 和复制危机开始的。P-hacking 基本上意味着有选择地分析数据,只报告支持假设的结果。在一项对 2000 多名心理学家的调查中,哈佛商学院的莱斯利·约翰发现,超过 50%的心理学家在检验结果的重要性后才决定是否收集更多的数据,这样他们就可以等到假设得到证实。

调查还发现,大约 10%的研究心理学家参与了数据伪造,超过一半的人参与了欺诈行为,例如报告结果具有统计学意义,而实际上并不具有统计学意义,或者在查看了两种不同的数据分析技术的结果后,在两种技术之间做出决定,并选择更有利的技术。

John, L.K., Loewenstein, G. & Prelec, D. (2012). Measuring the Prevalence of Questionable Research Practices With Incentives for Truth Telling, Psychological Science, 23(5), 524–532.

虽然 p-hacking 本身并不是一种欺诈,但它会导致发布误导性的研究结果。如果心理学和其他社会科学的研究被定期复制,P-hacking 就不会是这样一个大问题。如果研究小组 A 在数据中发现了一个有趣的模式,而研究小组 B,按照完全相同的程序,没有发现,科学会在某种程度上自我修正。不幸的是,没有进行许多复制。

Open Science Collaboration. (2015). Estimating the reproducibility of psychological science. Science, 349(6251)

2015 年,Brian Nosek 和他的同事在科学上发表了一项出色的研究,调查了 100 项发表在主要期刊上的认知和社会心理学研究。这些研究中只有 39 项被成功复制。虽然所谓的“复制危机”是心理学的热门话题,但遭受痛苦的不仅仅是心理学。2011 年,制药公司拜耳检查了 67 份药物发现出版物,报告称其中四分之三是错误的。

更糟糕的是,在科学不端行为的光谱中,还有科学欺诈。以荷兰蒂尔堡大学的 Diederik Stapel 教授为例,他伪造了至少 55 篇论文的数据,这些论文的主题包括人类的刻板印象或歧视倾向。

大海捞针

从历史上看,大多数社会科学都是关于数据收集的。了解个人、群体、国家或地区行为所需的信息需要数年时间来收集。现在情况不再是这样了。据估计到 2020 年,世界上每个人每秒将产生大约 1.7 兆字节的数据。如果今天我们偶尔无法利用一些现有的数据源,通常不是因为缺乏数据,而是因为隐私问题、缺少数据共享协议或计算能力不足。

有趣的是,在这个数据丰富的时代,大多数社会科学家继续一次收集一个实验参与者的实验数据。然而不幸的是,这些研究中的大多数都不能很好地概括。即使收集了数据,我们也不能确定它是否能告诉我们一些受过白人教育的大学生的行为,他们倾向于参与大多数实验,或者我们多样化的世界。

不久前,我读了一本关于约会的书,作者是克里斯蒂安·鲁德尔,《数据专栏》。书中的大部分观点来自美国最大的约会网站“OkCupid ”,反映了在该网站注册的人们的真实行为。有人可能会争辩说,这些发现仍然只适用于实际使用交友网站的人,但就洞察力而言,1000 万使用交友网站的美国人仍然比研究人员容易接触到的一小部分白人中产阶级大学生样本的研究要重要得多。

以斯坦福大学的 Geoff Cohen 完成的一项典型实验研究为例。2003 年和 2006 年,他和他的团队与 158 名黑人七年级学生一起工作。他们中的一半被随机选择写一些对他们来说重要的事情,另一半写一些不重要的事情。这个练习只持续了 15 分钟,但那些写下自己价值观的人在学期结束时,他们的 GPA 增加了 0.3 分,缩小了他们和白人同龄人之间 40%的学术差距。根据作者的说法,这个简单的练习打破了许多黑人学生经历的恶性心理循环。有证据表明,黑人学生担心他们在学校表现不佳的负面刻板印象,这种担心造成了如此大的压力,以至于他们最终表现不佳。通过让孩子们写下他们的价值观,作者认为已经在心理上给他们注射了对抗这种刻板印象威胁的疫苗。

然而,158 名学生并不是一个大样本。因此,当加州大学欧文分校的保罗·汉塞尔曼试图用更大的样本重复两次研究结果时,他首先发现 GPA 仅增加 0.065 的影响要弱得多,然后发现写作练习根本没有影响。

破碎的激励

学术界的许多问题是系统性的,因为对在大学工作的人的激励被打破了。一些学术结构和过程,如专业协会和期刊出版可以追溯到 17 世纪,但它们对现代社会的适用性值得怀疑。我在伦敦大学学院读心理学的时候,多次听说出版物是科学的“货币”。

然而,在一些国家,出版物和现金之间的类比被发挥到了极致。为了了解中国的现金出版制度,来自武汉大学的全伟和他的同事调查了中国排名前 100 的大学提供的财政激励,并从数据中挖掘出有趣的趋势。他们发现,2016 年,在顶级科学期刊上发表一篇论文的平均报酬几乎是 44,000 美元,最高报酬是 165,000 美元。尽管从绝对值来看,这些数字相当可观,但需要注意的是,在研究期间,中国大学教授的平均工资仅为 8600 美元。

Quan, W., Chen, B., & Shu, F. (2017). Publish or impoverish: An investigation of the monetary reward system of science in China (1999–2016). Aslib Journal of Information Management

发表论文的动机在增加,但期刊对新奇、性感发现的渴望也在增加。因此,值得点击诱饵的发现偶尔会导致编辑忽略方法上的缺陷。此外,目前的制度不鼓励复制。根据定义,复制(或事实上未能复制)的研究并不新颖,因此通常会被拒绝(所谓的“文件抽屉”问题)。

https://www.nature.com/news/replication-studies-bad-copy-1.10634

臭名昭著的 Diederik Stapel 在至少 55 篇论文中伪造了数据,他认为公众没有意识到学术科学正在变成一门生意。在接受《纽约时报》采访时,Stapel 认为“科学当然是关于发现,关于挖掘发现真相。但这也是沟通、说服、营销。我是一名推销员。我在路上。人们带着他们的谈话在路上。用同样的话。这就像一个马戏团。”

更糟糕的是,学术界的竞争越来越激烈。博士的产生已经远远超过了对讲师的需求。根据 Andrew Hacker 和 Claudia Dreifus 的说法,从 2005 年到 2009 年,仅美国就培养了超过 10 万名博士学位持有者,但同期只有 1.6 万个新教授职位出现。在这样一个竞争激烈的环境中,网络和游说在科学事业中扮演着至关重要的角色。然而,擅长玩弄体制的学者不一定能做出最高标准的研究。

弥合学术与实践之间的鸿沟

到我大学毕业的时候,这句话我一定听过至少一千遍了。很多学术做了很大的研究却不说从业者的语言。换句话说,他们无法解释他们进行的研究如何解决现实生活中的问题。另一方面,从业者通常无法获得学者拥有的许多工具和数据。因此,他们经常试图重新发明轮子,浪费资源。当然,某些杂志和博客会定期向非学术受众介绍和解释一些最新的研究,但这往往是个例外,而不是常规。

在我大学四年级的时候,我参加了一个公开讲座,主讲人是一位著名的学者,也是一位研究界和实践者之间更紧密合作的倡导者。我震惊地得知,科学发现平均需要九年时间才能付诸实践。虽然没有太多的科学应用到实践中,但实践世界中的大多数决策都没有任何证据支持。例如,根据奥巴马政府的彼得·奥斯泽格和布什政府的约翰·布里奇兰的说法,每 100 美元的政府支出中只有不到 1 美元有最基本的证据支持。

这并不是说学术研究的唯一目的是为决策者或其他从业者服务。然而,当从业者不听、不听或不理解学者们在说什么,而学者们继续进行由于样本量小、研究实践有问题或彻头彻尾的欺诈而难以概括的研究时,双输局面就不可避免了。

走向解决

今天,我们比以往任何时候都更需要科学和基于证据的政策。如果科学家逐渐选择接受点击诱饵和推销术的后现代意识形态,而不是致力于寻求真理、科学和道德完整性,我们就有大麻烦了。

在这个后真理政治的时代,必须确保每一份科学出版物的严谨性和质量,投资于科学教育和科学界与实践者之间更好的沟通,并重新设计有缺陷的激励矩阵,促进数量和新颖性而不是质量。大学也应该承认他们的机构责任。目前在大多数高等教育机构中根深蒂固的“出版或灭亡”的心态威胁着学术追求和知识探索的基础。在某种程度上,科学需要回到它辉煌的黎明,那时理解世界是如何工作的,并把它传达给其他人是它的主要的,也可能是唯一的目的。

我们还需要创造一种文化,促进复制和其他一些年来广泛讨论的良好做法。研究生应该得到奖励,因为他们以这种方式完成了复制,发展了他们的技能,同时也确保了发表的研究可以很好地复制。论文应该要求对研究、数据和任何其他相关材料进行登记,这对于决定学术论文的质量是很重要的。应该提供更好的方法和统计知识培训,作为各级大学教育的一部分。应该提倡跨学科研究。应该鼓励从业者和学术界建立有意义的伙伴关系,让学术界减少对政府资助的依赖,从实践中获取数据,而不是从难以概括的小样本中收集数据。

从错误中学习的意愿,谨慎的测试和对方法选择的质疑应该是科学的基础。不幸的是,今天许多学者被急功近利所驱使,经常试图跳过这些关键步骤。这种心态只会加强公众对科学的怀疑和某些犬儒主义,并破坏对共同现实的信念。在这样一个世界里,人们很自然地把自己关在回音室里,给他们觉得不愉快的科学发现贴上偏见、不可靠或纯属伪造的标签。讽刺的是,有时他们可能是对的。

使用分布式 SGD 加速深度学习—概述

原文:https://towardsdatascience.com/accelerating-deep-learning-using-distributed-sgd-an-overview-e66c4aee1a0c?source=collection_archive---------11-----------------------

训练神经网络既困难又耗时。通常,训练运行需要几天甚至几周时间才能收敛。这对参与人工智能技术研发的公司来说,阻碍了创新,耗费了大量资金。出于这个原因,最近许多脑力投入到提高神经网络训练速度,特别是使用平行化。

随机梯度下降(SGD)及其多个变体(如 RMSProp 或 Adam)是深度学习最流行的训练算法。由于它们的迭代性质,这些算法本质上是串行的。通常,唯一发生的并行化是卷积神经网络(CNN)中的像素并行化或小批量并行化。然而,小批量的大小也是网络准确性的关键参数,因此不能随意改变。此外,小批量的大小受到计算机内存(如果算法在 GPU 上运行,则为 GPU 内存)的强烈限制。由于这些原因,我们需要一个快速稳定的解决方案,在多个独立节点(计算机)上并行训练,以实现更高的加速比。能够做到这一点也将对开发成本产生巨大影响,因为大型商用集群(一堆普通 PC)通常比少数配备定制硬件(如 GPU 或 FPGAs)的高度专业化计算机便宜得多。此外,可扩展性将不再是一个问题,具有动态硬件扩展的按需培训将成为现实。

多年来,已经发明了针对该问题的多种解决方案。在这篇文章中,我将详细介绍一些最有前途的对普通 SGD 的修改,并尝试解释这些修改背后的基本原理。

锁定更新(同步 SGD)

跨多个 CPU 或节点并行化 SGD 的最简单解决方案是让每个节点读取当前参数值,使用一批数据计算梯度,锁定参数并更新它们。在伪代码中:

parallel for (batch of data):
   Acquire lock on current parameters
   Read current parameters
   Calculate the gradient w.r.t. the batch and update parameters
   Release lock
end

这种更新的问题是获取锁通常比计算梯度花费更长的时间。因此,同步成为一个主要的瓶颈,并行化是无效的。因此,必须设计替代方案。

疯狂奔跑:野猪!算法

Hogwild 算法()Recht,Benjamin,et al .〈hog wild:一种并行化随机梯度下降的无锁方法〉。神经信息处理系统进展。2011. )是并行化 SGD 的早期尝试之一。它是由威斯康星大学的研究人员在 2011 年发明的。Hogwild 的工作原理可以简单地解释为:它就像上面的代码,只是没有锁。在伪代码中:

parallel for (batch or sample of data):
   Read current parameters
   Calculate the gradient w.r.t. the batch and update parameters
end

虽然这可能不明显,但 Hogwild 的作者能够从数学上证明这是有意义的,至少在一些学习环境中是如此。算法的主要假设是参数更新是稀疏的。这意味着大多数更新只更新一组稀疏的参数。在这种情况下,Hogwild 能够实现与串行版本几乎相同的收敛速度。

倾盆大雨新加坡元

Downpour SGD architecture (credit: paper)

倾盆大雨 SGD ( 迪安,杰弗里,等《大规模分布式深度网络》神经信息处理系统进展。2012. )是由谷歌的研究人员发明的,作为他们的 DistBelief 框架(TensorFlow 的前身)的一部分,其变体仍在今天的分布式 TensorFlow 框架中使用。它利用多个模型副本,每个副本基于一小部分数据计算更新(数据并行性)。计算之后,更新被发送到中央参数服务器。参数服务器本身被分成多个节点,每个节点保存和更新参数的一个小的子集(模型并行性)。到目前为止,这种并行化方案非常流行,尤其是因为它是 TensorFlow 中的内置特性。然而,该方案的收敛性受到以下事实的影响模型复制品彼此不共享参数(权重)或更新。这意味着它们的参数总是可以不同。

Speedups of Downpour SGD for different models (credit: paper)

使用大型迷你批处理的分布式深度学习

分布式深度学习中的一个普遍问题是需要在计算网格的节点之间传输数据(梯度,参数更新)。这增加了开销,进而降低了整个计算的速度,即使使用高速网络通信也是如此。如果使用同步 SGD 等算法,即使速度极快的 100Gbit 以太网或 InfiniBand 连接也会成为瓶颈。

具体来说,在数据并行学习中,迷你批处理被拆分到多个节点上。每个计算节点(GPU 或机器)计算一个小批次的梯度。然后必须对这些梯度求和,并且必须计算新的权重并在节点间传播。这个过程可能非常慢,因为梯度的数量通常等于参数的数量。深度神经网络通常包含 32 位精度的数百万个参数,需要在每个更新步骤中进行交换。

本质上,有两种方法可以减少训练的通信开销: (i)增加小批量大小(从而减少更新频率)和(ii)减少每次更新在计算节点之间交换的数据量。在这一节中,我们将重点关注(I ),在下一节中,我们将研究(ii)。

在最近的一篇论文中()Goyal,Priya 等人“精确,大型迷你批处理 SGD:在 1 小时内训练 imagenet”arXiv 预印本 arXiv:1706.02677 (2017)。 )由来自 FAIR(脸书人工智能研究院)的研究人员,作者使用超大型迷你批次,仅用 1 小时训练 ImageNet。使用大型微型电池可以防止节点之间频繁的内存传输(交换梯度)。直观上,这种方法使学习快速而准确(达到一定的小批量),但正如我们将看到的,它也在训练阶段早期引入了一些必须处理的收敛问题。

让我们首先检查梯度下降的两种边缘情况:随机梯度下降和批量梯度下降。SGD 对提供给网络的每个学习样本执行权重更新,而不是对整个训练数据集执行权重更新,从而使得学习过程有噪声,并允许梯度下降避开学习函数的可能的浅最小值。SGD 遵循更新公式:

在每个更新步骤中随机选择 i (来自数据集的样本)。

SGD 的随机性质类似于模拟退火(SA)和其他随机优化算法,如遗传算法(GA)。

Batch gradient descent vs. SGD (credit: wikidocs.net)

光谱的另一端是批量梯度下降 (BGD)算法。BGD 对所有训练样本的误差求和,并且每个时期执行一次权重更新。BGD 的公式与 SGD 的公式几乎相同,不同之处在于,现在我们在执行梯度更新之前对所有样本的损失进行求和:

从数学角度来看, i (训练数据集)上的和使得学习过程非常稳定,但也非常严格,经常收敛于局部最小值。对于较大的训练数据集,批处理梯度下降比 SGD 表现更差,通常会导致过拟合。

如今最常用的梯度下降版本(也是每个主要深度学习框架中实现的版本)似乎是 minibatch SGD (mSGD),这是 BGD 的稳定性和 SGD 的噪声之间的折衷。在 mSGD 中,的重量更新在每个迷你批次执行一次。迷你批次大小是另一个需要优化的超参数。迷你批次越大,需要的更新越少,因此学习速度更快。这尤其适用于数据分布式并行学习,其中需要在节点之间交换的每个梯度都增加了计算时间。另一方面,由于工艺的低随机性,使小批量过大通常会导致性能变差和过度拟合。

公平文件在很大程度上依赖于这样一个事实,即性能随微型批次大小的恶化是高度非线性的,对于大范围的微型批次大小保持不变(ResNet-50 高达 8192),然后对于更大的微型批次迅速恶化。因此,研究人员首先表明,我们可以通过选择大的迷你批次大小来显著加快学习速度,同时保持类似的准确性。此外,研究表明,我们可以合理使用的最大 minibatch 大小不依赖于训练数据集的大小,至少在许多计算机视觉任务中是如此 :

ImageNet top-1 validation error vs. mini-batch size used for training (credit: FAIR)

然而,在论文中,研究人员清楚地表明,为了使用非常大的小批量来训练神经网络,我们必须根据小批量的大小来微调学习速率。事实证明,我们可以经常使用这个简单的经验法则:

当小批量乘以 k 时,将学习率乘以 k。

文中还讨论了动量等超参数。不受影响,因为它们的最佳值似乎在很大程度上与微型批次的大小无关。

即使选择了合适的学习率,训练也可能在训练的初始阶段出现分歧。这是因为在这个阶段,权重可能会快速变化,训练误差很容易出现峰值。为了解决这个问题,本文建议使用一种渐进预热策略。这种策略最初只使用一个节点,直到训练稳定下来,可以使用更多的节点。此外,学习速率可以从非常小的数η逐渐上升到η’= kη,其中 k 与小批量大小成比例,如线性缩放规则所规定的。

该论文还提出,通过考虑单个迷你批次的变化统计,批次标准化是加速训练的有效工具。因此,批次标准化统计不应在整个批次上计算,而应仅在单个工人上计算。同样,这减少了通信开销。

1 位随机梯度下降

微软认知工具包(CNTK)实现了 SGD 的另一种变体:1 位 SGD()Seide,Frank 等人,“1 位随机梯度下降及其对语音 dnns 的数据并行分布式训练的应用。”国际言语交流协会第十五届年会。2014. )。

在论文中,作者建议将每个梯度的数据交换量减少到一位。因此,交换的关于梯度的唯一信息是它是上升还是下降。自然,这种极其粗糙的量化对训练的收敛有深远的影响,并且不能单独使用。然而,这也是本文的重点,如果量化误差被添加到下一个小批次的梯度中,不会显著影响计算:

在此, Q 描述量化, G 梯度更新, G_quant 是量化梯度, N 是小批大小,δ是量化误差。这种形式的量化梯度更新构成了作者所谓的延迟更新:它确保即使我们交换截断的信息,我们也能跟踪我们由此引起的错误,并能在后续更新中纠正它。这样,最终可以恢复完全的准确性(在多次更新之后)。

实验数据表明,该技术对于全连接网络(例如用于语音处理的网络)工作得非常好,并且以仅少量损失准确度为代价提供了相当大的加速。你可以查一下报纸上的具体数字。然而,可以实现的加速和准确性似乎也严重依赖于特定的网络架构。此外,使用 SGD 的修改会对结果产生不同的影响。例如,在量化后应用 AdaGrad 提高了精度,而在量化前应用 AdaGrad 会使精度变差。

关于 1 位 SGD 的好处是它很容易在 CNTK 框架中使用。你可以在这里下载带 1 位 SGD 的 CNTK。它可以在 Windows 和 Linux 以及 mac OS 上运行(使用 Docker)。

走哪条路?

此时要提出的问题是:如果有多个计算节点可用,应该使用哪种算法来加速神经网络训练?答案是,这在很大程度上取决于您正在使用的网络架构。通常,在该研究领域发表的论文仅使用一个或几个特定的、尽管非常广泛使用的神经网络来评估结果(例如,在 FAIR 论文中,它是 ResNet-50,包括其作为 R-CNN 的修改)。使用其他神经网络体系结构(如递归网络体系结构(RNNs ))时,该方法是否同样有效,这一点并不明显。此外,并非所有上述算法都适用于所有情况。例如,只有当节点间的通信时间远远超过每个节点的计算时间时,1 位 SGD 才能提供有效的加速。这又取决于网络中参数的数量(例如,ResNet 通常比 VGG 具有更少的参数)。

作为一般规则,必须接受的是,这些解决方案中的大部分(除了同步 SGD)修改训练过程以实现并行性,并接受作为结果的小的准确性冲击。如果这个打击不是太极端,加速带来的好处通常会超过它。最终,你将不得不决定为了速度的提高而牺牲准确性是否值得。一种折衷的可能性是在开发阶段使用高度并行,在最终训练阶段在单个节点上训练算法。

使用 R 和 Python 从 Twitter API 访问数据

原文:https://towardsdatascience.com/access-data-from-twitter-api-using-r-and-or-python-b8ac342d3efe?source=collection_archive---------3-----------------------

NOTE: There is an updated version of this tutorial that goes over setting up the Twitter Developer Account and the tweepy library (Python) [here](/how-to-access-data-from-the-twitter-api-using-tweepy-python-e2d9e4d54978).

使用 Twitter API 应该是一件简单的事情,但是有时图片和简单的代码可以为您节省额外的 5 分钟。我之前报道过如何使用 R 从 Twitter API 中访问数据,但该流程自 2018 年 7 月起发生了变化。

Things changed in July 2018

这篇文章首先讲述了如何设置你的 Twitter 开发者账户,然后讲述了如何使用 R 和 Python 搜索 tweets。

设置 Twitter 开发者账户和应用

1-)如果您还没有 twitter 帐户,请创建一个。

2-) 申请一个 twitter 开发者账号。

This was made necessary as of July 2018

3-)如果您没有与 twitter 关联的电话号码,请输入电话号码。

4-)添加帐户详细信息。点击继续。

5-)用你自己的话描述你正在建造的东西。点击继续。

6-)提交申请。

7-)检查与您的 twitter 相关的电子邮件,然后点击确认您的电子邮件。

8-)在欢迎屏幕上,点击创建应用程序。

9-)填写您的应用程序详细信息,然后点击创建(在页面底部)。请确保不要尝试使用已被占用的 appName。

Make sure to make an App name that is not already taken

查看开发者条款并点击创建。

10-)首先,点击密钥和令牌。其次,单击“创建”以获取访问令牌和访问令牌密码。

将您的 API 密钥、API 秘密密钥、访问令牌和访问令牌秘密保存在安全的地方。我应该指出,你不应该试图复制我的钥匙,因为我在本教程后重新生成它们。

Twitter API

稀有

如果你想用 R,可以用 twitteR(确保你先安装安装 twitteR 包)。twitteR 是一个 R 包,它提供了对 Twitter API 的访问。支持 API 的大部分功能,偏向于在数据分析中比日常交互更有用的 API 调用。如果您想了解更多关于如何根据您的各种需求使用软件包的信息,请阅读用户简介。下面的代码使用 Twitter 搜索 API。

#install.packages("twitteR")library(twitteR) 
# Change consumer_key, consume_secret, access_token, and 
# access_secret based on your own keys
consumer_key <- ""
consumer_secret <-""
access_token <- ""
access_secret <- "" setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)
tw = searchTwitter('@GalarnykMichael', n = 25)
d = twListToDF(tw)

As of when this tutorial was written, the standard search API searches against a sampling of recent Tweets published in the past 7 days. Part of the ‘public’ set of APIs. https://developer.twitter.com/en/docs/tweets/search/overview

计算机编程语言

下面的代码使用 python-twitter 包(可以使用pip install python-twitter安装)进行搜索。你可以在这里学习如何制作自己的查询。

import twitter"""
Change ACCESS_TOKEN, ACCESS_SECRET, CONSUMER_KEY and CONSUMER_SECRET
to your own. """ACCESS_TOKEN = ''
ACCESS_SECRET = ''
CONSUMER_KEY = ''
CONSUMER_SECRET = ''t = twitter.Api(consumer_key=CONSUMER_KEY,
                consumer_secret=CONSUMER_SECRET,
                access_token_key=ACCESS_TOKEN,
                access_token_secret=ACCESS_SECRET)results = t.GetSearch(raw_query="q=from%3AGalarnykMichael&src=typd")

As of when this tutorial was written, the standard search API searches against a sampling of recent Tweets published in the past 7 days. Part of the ‘public’ set of APIs. https://developer.twitter.com/en/docs/tweets/search/overview

结论

本教程是关于让您开始使用 Twitter API 的。如果您对本教程有任何问题或想法,请在下面的评论中或通过 Twitter 联系我们。如果你想学习如何使用 Pandas、Matplotlib 或 Seaborn 库,请考虑参加我的数据可视化 LinkedIn 学习课程。

使用 R 从 Github API 访问数据

原文:https://towardsdatascience.com/accessing-data-from-github-api-using-r-3633fb62cb08?source=collection_archive---------0-----------------------

FAccessing Data from Github API using R

使用 Github API 对于获取关于现有存储库的信息以及创建新的存储库非常有用。这篇文章讲述了如何使用 r 从 Github API 读取数据。

  1. 通过以下链接向 Github 注册一个新应用: githubDevLink

2.点击注册新的应用程序。

Click on Register a New Applicatoin

3.填写页面。【http://github.com】的将为的主页网址工作。授权回调 URL 可以是 http://localhost:1410 。给应用程序命名。下图使用了 Coursera_John_Hopkins,这将影响第 5 步后面的代码。完成后,点击注册应用

Filling out Register a New Application

4.点击注册申请后,会出现一个类似下图的页面。

Make sure you copy your Client ID and Client Secret

5.使用下面的代码。根据客户端 ID、客户端机密和应用程序名称修改 appname、key 和 secret。

如果您有任何问题,请告诉我!你可以在这里或者 youtube 上发表评论(如果可以的话请订阅)!

准确性悖论

原文:https://towardsdatascience.com/accuracy-paradox-897a69e2dd9b?source=collection_archive---------0-----------------------

Beware of what lies beneath — wiki image

“如果你对机器学习一无所知,你肯定知道准确性悖论”——阿金库勒·艾伦

我写了关于车型评测 I ,如果你还没有查看,你应该。

什么是准确性悖论?

准确性被定义为没有错误或失误。例如,一条信息是准确的,如果它 恰好 代表了正在讨论的内容。

悖论是一种看似与常识相矛盾或相反的陈述,但也许是真实的。

你有没有想过“忽略所有规则”这句话……本身就是一条规则——嗯!一个悖论

在机器学习行话中,准确率是分类系统中正确性的比例。

也就是说,如果我们有一个垃圾邮件检测系统,我们收到的 5 封邮件中,有 4 封被模型 X 归类为垃圾邮件,而这些邮件确实是垃圾邮件。我们会说 X 型有 80%的准确性,也就是说,你可以在 80%的时间里依赖 X 型。

Accuracy of Model X = 4/5 * 100 = 80%

那么,什么是准确性悖论呢?我们稍后会谈到这一点,但首先让我们考虑一个案例研究作为例子。

个案研究

霍金斯医院软件团队(Will,Dustin,Mike 和 Lucas)建立了一个用于诊断女性乳腺癌的分类模型。在给定的人群中研究了 1000 名妇女的样本,其中 100 名患有乳腺癌,其余 900 名没有乳腺癌。Hawkins 软件团队基于该数据集训练了他们的模型。他们将数据集分成 70/30 的训练/测试集。

精确度非常高,他们部署了这个模型。

唉!部署后几个月,一些被医院诊断为“没有乳腺癌”的女性开始出现乳腺癌症状。

这怎么可能?

这引起了一系列问题和全体人民的恐惧。随着越来越多病人开始出现乳腺癌症状,霍金斯医院不得不对此采取措施。

他们决定聘请机器学习专家 Bob 来帮助他们了解他们的软件团队出了什么问题,因为该模型的准确率约为 90%。

霍金斯模型概述

通过分割数据集,我们有

训练集:

*No Breast cancer = 70/100 * 900 = 630
Breast cancer= 70/100 * 100 = 70*

测试设置:

*No Breast cancer = 30/100 * 900 = 270
Breast cancer= 30/100 * 100 = 30*

为了让鲍勃解释他们的模型是如何得出错误预测的,他引入了两个假设,以其中一位女性乔伊斯为例——鲍勃开始解释如下,

比方说,我们有一个假设 H,乔伊斯患的是乳房疼痛而不是乳腺癌,但是另一个假设 Ho (与第一个假设相反)说乔伊斯患的是乳腺癌。

如果假设 Ho 为真(阳性)——乳腺癌

else 假设 Ho 为假(阴性)——无乳腺癌

下表显示了如果这个其他假设 Ho 为真或不为真会发生什么。

This is called confusion matrix — i hope it’s not confusing.

其中:

  • TP =真阳性
  • FP =假阳性
  • FN =假阴性
  • TN =真阴性

霍金斯模型的预测结果

在用 70%的数据集训练他们的模型后,Hawkins 科学家用剩余的 30%数据测试了这个模型,以评估模型的准确性。他们的模型在 300 个预测中有 270 个是正确的。

Hawkins Accuracy = 270 / 300 = 0.9

这看起来是一个相当令人信服的模型,准确率高达 90%,为什么它会失败呢?

解开谜团

Bob 重新评估了他们的模型,下面是详细分析:

Number of women **with** breast cancer and classified as **no** breast cancer (FN) = 30Number of women with breast cancer and classified as breast cancer(TP) = 0Number of women without breast cancer and classified as **no** breast cancer (TN) = 270Number of women **without** breast cancer and classified as breast cancer (FP) = 

Bob 用下面的混淆矩阵表表示了这一点。

confusion matrix for Hawkins Model

总而言之,

霍金斯模型正确将 270 名未患乳腺癌的女性分类为【无乳腺癌】,而错误将 30 名患乳腺癌的女性分类为【无乳腺癌】。

我们给霍金斯模型 300 个问题,它答对了 270 个。该模型得分为 270/300——因此,我们可以说该模型通过了优秀测试,对吗?但是做到了吗?

Bob 注意到模型已经方便地将所有测试数据分类为“无乳腺癌”

鲍勃计算出这个模型的准确性,它总是正确的 90%。

Accuracy = (TP + TN) / (TP+TN+FP+FN)
Accuracy = (0 + 270) / (0 + 270 + 0 + 30)= 0.90
Accuracy in % = 90%

鲍勃注意到一个模式,没有一个“乳腺癌”数据被正确标注。鲍勃作为专家走得更远,他决定看看模型在精度召回方面做得如何。

鲍勃心想,如果这些患有乳腺癌的人中没有一个被诊断为“患有乳腺癌”,那么这个模型就不是精确的模型,也不会回忆起除了“没有乳腺癌”之外的任何事情。

他用下面的精确和回忆公式证明了这一点

Precision = TP / (TP + FP)
Precision = 0 / (0 + 0) = 0
Precision in % = 0%Recall = TP / (TP + FN)
Recall = 0 / (0 + 30) = 0
Recall in % = 0%

这意味着,这个模型将总是把传递给它的任何数据归类为“没有乳腺癌”。

这解释了为什么一些病人表现出乳腺癌的症状。

霍金斯模式根本行不通。

鲍勃破解了它,霍金斯模型是一个狄摩高根(骗局)。

鲍勃提出了一个稍加修改的模型,他想让他们明白他所说的他们的模型是狄摩高根的意思。

鲍勃的模型

在用 70%的数据集训练了他的模型之后,Bob 接着用剩下的 30%的数据测试了模型以评估模型。与 Hawkins 不同,Bob 的软件团队不依赖准确性作为评估其模型的唯一标准。

下面是鲍勃的模型的结果;

Number of women **with** breast cancer and classified as **no** breast cancer (FN) = 10Number of women with breast cancer and classified as breast cancer(TP) = 20Number of women without breast cancer and classified as **no** breast cancer (TN) = 200Number of women **without** breast cancer and classified as breast cancer (FP) = 70

confusion matrix for Bob’s Model

显然,Bob 的模型犯了一些错误,因为它惊吓了 70 名没有患乳腺癌的完全健康的人。* *鲍勃心里想,认为自己得了乳腺癌而没有得,不是比认为自己没有得乳腺癌却得了更好吗?

鲍勃的模型评估

Accuracy = (TP + TN) / (TP + TN + FP + FN)
Accuracy = (20 + 200) / (20 + 200 + 10 + 70) = 0.733
Accuracy in % = 73.3%

Hawkins 的软件团队内部出现了问题,Bob 怎么可能告诉他们他的模型(准确率为 73%)比他们的模型(准确率为 90%)更好。)

Bob 进一步计算了他的新模型的精确度和召回率

Precision = TP / (TP + FP)
Precision = 20 / (20 + 70) = 0.222
Precision in % = 22.2%Recall = TP / (TP + FN)
Recall = 20/ (20 + 10) = 0.67
Recall in % = 67%

虽然 Bob 的模型假设总共有 90 名女性而不是 30 名女性患有癌症,但它预测乳腺癌的正确率为 22.2%,而 Hawkins 模型的精确度为 0。

此外,在 30 名实际患有乳腺癌的女性中,Bob 的模型能够在 67%的时间内正确回忆起某人患有乳腺癌,而 Hawkins 的模型则没有回忆。

在这之后,Bob 能够让团队相信他的模型比他们目前拥有的要好。

达斯汀问,但是准确性的差异呢?

鲍勃回答说:这是一个悖论。

准确性悖论

预测分析的准确性悖论指出,具有给定准确性水平的预测模型可能比具有更高准确性的模型具有更大的预测能力。

分解这个,

具有给定精确度水平的预测模型(73% — Bob 的模型)可能比具有更高精确度的模型(90% —Hawkins 模型)具有更大的预测能力(更高的精确度和召回率)

这就是为什么它被称为悖论的原因,因为直觉上,你会认为精度更高的模型是最好的模型,但精度悖论告诉我们,有时情况并非如此。

因此,对于某些系统(如 Hawkins)来说,精确度和召回率比“良好的精确度”更好,因此使用适当的指标来评估您的模型是很重要的。

大脑鲍勃,拯救了世界!

值得注意的是,交易误报可能会带来非常致命的代价,正如tweetypsych在评论部分指出的那样。

虽然搜索引擎模型可能会有一些假阳性,但乳腺癌模型不应该,因为这可能会导致完全健康的人被引入残酷的治疗或更糟。

—所有角色的灵感都来自‘陌生的事物’。所有的人物和故事都是虚构的。

外部链接

  1. http://www . statistics show to . com/probability-and-statistics/null-hypothesis/
  2. 【https://en.wikipedia.org/wiki/Accuracy_paradox
  3. https://en.wikipedia.org/wiki/Confusion_matrix
  4. https://towards data science . com/model-evaluation-I-precision-and-recall-166 DDB 257 c7b
  5. https://en.wikipedia.org/wiki/Base_rate

准确度、精密度、召回率还是 F1?

原文:https://towardsdatascience.com/accuracy-precision-recall-or-f1-331fb37c5cb9?source=collection_archive---------0-----------------------

Which metrics to choose?

当我与寻求将数据科学实施到他们的流程中的组织交谈时,他们经常会问这样一个问题:“我如何获得最准确的模型?”。我进一步问道,“你试图用这个模型解决什么样的业务挑战?”我会得到困惑的表情,因为我提出的问题并没有真正回答他们的问题。然后,在我们开始探索准确性是否是我们应该从中选择“最佳”模型的最重要和最终的模型度量标准之前,我需要解释为什么我会问这个问题。

因此,我想在这篇博文中解释一下,准确性不一定是科学家们追求的唯一模型指标,也包括对其他指标的简单解释。

首先,让我们看看下面的混淆矩阵。模型的精确度是多少?

很容易,你会注意到这个模型的准确率非常非常高,达到 99.9%!!哇!你中了头奖和圣杯(尖叫着在房间里跑来跑去,在空中挥舞拳头几次)!

但是…(你知道这是迟早的事,对吗?)如果我提到这里的阳性实际上是一个生病的人,他携带着一种可以快速传播的病毒,会怎么样?还是这里的阳性代表诈骗案?或者这里的阳性代表恐怖分子,模型说它不是恐怖分子?你明白了。在我提出的这三种情况下,错误分类的实际阳性(或假阴性)的成本非常高。

好了,现在您意识到在选择最佳模型时,准确性并不是最重要的模型指标……接下来呢?

精度和召回

让我介绍两个新的度量标准(如果你还没有听说过,如果你听说过,也许只是迁就我一下,继续读下去?😄)

所以如果你查看维基百科,你会发现计算精度和召回的公式如下:

我放在这里做进一步解释。

让我把混淆矩阵和它的组成部分放在这里。

精密

太好了!现在让我们先来看看精度。

你注意到分母是什么?分母其实是预测的总正!所以公式变成了

True Positive + False Positive = Total Predicted Positive

您可以立即看到,Precision 会讨论您的模型在那些预测的正值中有多精确,有多少是实际的正值。

当假阳性的代价很高时,精度是确定的好的量度。例如,垃圾邮件检测。在垃圾邮件检测中,误报意味着非垃圾邮件(实际为阴性)被识别为垃圾邮件(预测的垃圾邮件)。如果垃圾邮件检测模型的精度不高,电子邮件用户可能会丢失重要的电子邮件。

召回

所以让我们用同样的逻辑来回忆。回忆一下召回是如何计算的。

True Positive + False Negative = Actual Positive

这就对了。因此,Recall 实际上计算了我们的模型通过将其标记为阳性(真阳性)而捕获的实际阳性数量。应用同样的理解,我们知道当存在与假阴性相关联的高成本时,召回将是我们用来选择我们的最佳模型的模型度量。

例如在欺诈检测或病人检测中。如果欺诈性交易(实际为正)被预测为非欺诈性交易(预测为负),那么对银行来说,后果可能非常糟糕。

类似地,在病人检测中。如果一个生病的病人(实际为阳性)通过测试并被预测为没有生病(预测为阴性)。如果疾病是传染性的,与假阴性相关的成本将会非常高。

F1 分数

现在,如果你阅读大量关于精度和召回率的其他文献,你就不能回避另一个指标,F1,它是精度和召回率的函数。看维基百科,公式如下:

当你想在精确度和召回率之间寻求平衡时,F1 分数是需要的。对…那么 F1 的分数和准确性有什么区别呢?我们之前已经看到,准确性在很大程度上取决于大量真阴性,在大多数商业环境中,我们并不太关注这些真阴性,而假阴性和假阳性通常会产生商业成本(有形和无形),因此,如果我们需要在精确度和召回率之间寻求平衡,并且存在不均匀的类别分布(大量实际阴性),F1 分数可能是更好的衡量标准。

我希望这个解释能帮助那些开始研究数据科学和研究分类问题的人,准确性并不总是选择最佳模型的标准。

注:考虑注册我的时事通讯或前往我的网站了解最新消息。

祝所有读者有一个愉快的数据科学学习之旅。

ACM 请求:第一次公开和可重复的锦标赛,以共同设计帕累托有效的深度学习(速度、准确性、能量、规模、成本)

原文:https://towardsdatascience.com/acm-request-1st-open-and-reproducible-tournament-to-co-design-pareto-efficient-deep-learning-ea8e5a13d777?source=collection_archive---------6-----------------------

第一届可再生的高质量系统锦标赛(ReQuEST)将在 ASP los’18(ACM 编程语言和操作系统架构支持会议,这是一个跨计算机架构和硬件、编程语言和编译器、操作系统和网络的多学科系统研究的首要论坛)上首次亮相。

ReQuEST 由领先的大学联盟(Washington、Cornell、Toronto、Cambridge、EPFL)和 cTuning 基金会组织,旨在提供一个开源锦标赛框架、一个通用的实验方法和一个开放的存储库,用于对整个软件/硬件堆栈中广泛的现实世界应用程序、模型和库的质量与效率进行持续评估和多目标优化。

ReQuEST 将使用已建立的工件评估方法以及在领先的 ACM/IEEE 会议上验证的集体知识框架来重现结果,在实时仪表板上显示结果,并与社区共享工件。优秀作品将在相关研讨会上展示,并在 ACM 数字图书馆中发表。为了获胜,参赛作品的结果不一定要位于帕累托边界,因为参赛作品也可以因其原创性、可再现性、适应性、可扩展性、可移植性、易用性等而受到称赞。

第一个请求竞赛将专注于图像识别的深度学习,其雄心勃勃的长期目标是建立一个可移植和可定制的“即插即用”AI/ML 算法的公共存储库,这些算法在从物联网到超级计算机的不同数据集、模型和平台上进行了优化(参见现场演示)。正如我们的行业顾问委员会所建议的那样,未来的竞争将考虑其他新兴工作负载。

欲了解更多信息,请访问http://cKnowledge.org/request

通过机器学习消除声学噪声

原文:https://towardsdatascience.com/acoustic-noise-cancellation-by-machine-learning-4144af497661?source=collection_archive---------1-----------------------

用 TensorFlow 制作的 DIY 噪声消除系统原型。

Image by TheDigitalArtist on Pixabay

在这篇文章中,我描述了我如何通过自己的神经网络建立一个主动噪声消除系统。我刚刚得到了我要分享的第一个结果,但是这个系统看起来像一堆脚本、二进制文件、电线、声卡、麦克风和耳机,所以我还不打算公布任何来源。可能以后吧。

使用 Tensorflow、ALSA、C++ & SIMD 和 Python 的 Pet 项目

在过去的一年里,我一直在构建一个基于人工神经网络的声学噪声消除系统。我是在业余时间做的,所以这就是为什么一个相对小的实验花了这么长时间。我建立的系统是一个概念验证,它显示了神经网络作为噪声消除器的一致性。

我对 ML 最近在像神经风格转移这样的图像处理方面的成就印象深刻。我想:“如果我们用重复的音频噪声模式来教 RNN,以便通过 ANC 来抑制它,会怎么样?”我之前已经在 DSP 上为一些雷达的东西实现了感知器,所以我不担心在实时软件中实现神经网络的必要性。虽然我以前没有和 tensorflow 和 gpu 打过交道,但我渴望用它们做点什么。到目前为止,在我看来,这是一次有趣的旅行,最后我取得了一些成果,并获得了许多开发人员的乐趣。

Artificial Brain Denoising

为什么我们需要 ML 来抑制噪声?

现代 ANC 系统成功地抑制了飞机中的平稳噪声。常见的方法包括自适应滤波器,如 LMS 或 RLS 。这种方法的主要缺陷是,它们的核心只是 FIR 滤波器,其系数是不断调整的,并且它仅在几千个样本后才适合噪声。这意味着自适应滤波器开始重新适应环境噪声的每一个变化,即使它在几秒钟前听到了那个模式。由于神经网络能够适应内部结构非常复杂的信号,因此在 ANC 中使用 ML 方法可以提高其性能。

ANC 中的 NN 用于预测在黑噪声与麦克风位置的噪声相遇的时刻的噪声样本值。

我认为室外的噪音,比如大声的排气系统或洗碗机,从广义上来说不是静止的,而是相当重复的,可以相对容易地被神经网络学习到。

测试设置

我的宠物项目作为经典的噪音消除耳机,除了麦克风位于耳罩内。测试设置看起来简单明了:

我没有把麦克风放在外面(像所有降噪耳机一样),因为我想在更广泛的情况下解决 ANC 问题。这种设置让我可以轻松地根据房间或汽车环境调整代码,因为所有情况下的结构看起来都是一样的。

软件布局

该软件由三个进程组成:

  • C++程序进行实时信号处理,
  • 管理者是用 tensorflow 教 NN 的 Python 脚本,
  • 学习者是另一个管理整个过程的 Python 脚本。

管理器脚本通过 gprc 与他人通信。

DIY mic-preamp and my old and dirty audio-technica ATH-910PRO

麦克风前置放大器和耳机连接到声卡,声卡通过 USB 连接到装有 Linux Mint 17 的笔记本电脑。

麦克风测量噪声和黑噪声的组合。然后 C++程序做以下事情:

  1. 读取样本,
  2. 分离外部噪声和来自耳机的反信号,
  3. 将噪声样本传递到神经网络的前馈通道以获得黑噪声样本,
  4. 将 NN 产生的黑噪声样本回放到耳机,
  5. 通过管理器脚本将噪声样本传输到学习器脚本,从管理器获取新的神经网络系数。

我站在离耳机几米远的地方,用手机播放噪音。这种结构成功抑制了不同的噪音模式,甚至是像一束束鼻窦这样的非平稳信号,可以用手随意打开和关闭。

内部细节

输入声音以 48 kHz、16 位宽采样。它被代码向下采样 8x 倍,并被转发到分离器。

需要分离器将外部噪声与输入样本隔离,就好像没有信号反馈到耳机一样。

感知器是我自己用 C++实现的,为了满足实时处理的要求,内置了 SIMD 指令。感知器由两个隐藏层组成:

  • 输入层 tanh[304 x 64]采用之前隔离的外部噪声的最后 304 个样本。
  • 中间层 tanh[64 x 64]。
  • 输出图层是线性的[64 x 1]。

这是一个相对较小的网络,能够管理最近 304 个样本的范围。它实现简单,只需 30-60 秒就能学会。我要把它升级成某种递归变体,我已经在 Jupyter 笔记本上检查了 RNN 模型适应一些复杂声音的能力。它看起来很有希望,但需要更多的时间来收敛。希望以后写一篇关于这个笔记本的帖子。

输出信号被上采样 8 倍并发送给耳机。

与此同时,该程序正在向 python 脚本发送大量外部噪声样本,该脚本不断调整感知器的权重以适应新测量的噪声模式,并将其发送回 c++程序。我在带有 GPU 的虚拟机中的云中运行这个 python 脚本。顺便说一句,我发现 Paperspace 是最适合 ML 实验的!下面是我的推荐链接。

结果

这是一些展示已有成果的图表。这个数据是来自 C++程序的一个日志,现在还没有客观的测量。然而,我试着把这个耳机戴在头上,它看起来就像剧情显示的那样工作。

条款

黑噪声是送到麦克风的信号。

纯噪声是被分离器隔离的外部噪声。

转换到麦克风输入端的黑噪声是分离器分离出的信号的剩余部分。

samples_in 是麦克风测得的原始声音样本(当然是 8 倍下采样)。

下面是感知器如何感知输入并开始操作的示意图。

Single sine-wave @ 880 Hz

Multiple sine-waves and longer period of time.

激活功能

原文:https://towardsdatascience.com/activation-functions-b63185778794?source=collection_archive---------5-----------------------

那么,为什么我们的神经网络中需要激活函数呢?

欢迎来到我的第一篇帖子!我是一名数据科学家,也是媒体博客的积极读者。现在,我正计划使用 Medium blog 来记录我在学习深度学习方面的旅程,并通过我一直在从事的项目来分享我的经验。希望通过分享我对这些主题的看法,我也可以从 Medium 上奇妙的数据科学/深度学习社区中学习!我很想听到你对我第一篇文章的反馈。说到这里,让我们开始吧…

神经网络如何学习的基本思想是——我们有一些输入数据,我们将其输入网络,然后我们逐层执行一系列线性操作,并得出一个输出。对于特定层的一个简单情况是,我们将输入乘以权重,添加偏差并应用激活函数,然后将输出传递给下一层。我们不断重复这个过程,直到我们到达最后一层。最终值是我们的输出。然后,我们计算“计算输出”和“真实输出”之间的误差,然后计算该误差相对于每层参数的偏导数,并相应地不断更新参数!

神经网络被称为通用函数逼近器。神经网络的主要潜在目标是学习复杂的非线性函数。如果我们在多层神经网络中不应用任何非线性,我们只是试图使用线性超平面来分离类别。正如我们所知,在现实世界中没有什么是线性的!

Source: Google

同样,假设我们执行如上所述的简单线性运算,即:将输入乘以权重,加上偏差,并对到达神经元的所有输入求和。在某些情况下,上面导出的输出可能会取较大的值。当这个输出被输入到下一层时,它们可以被转换成更大的值,使得计算变得不可控。这是激活函数发挥主要作用的地方,即把一个实数压缩到一个固定的区间(例如在-1 和 1 之间)。

让我们看看不同类型的激活函数以及它们之间的比较:

乙状结肠:

sigmoid 激活函数具有数学形式“sig(z) = 1/ (1 + e^-z)`.正如我们所看到的,它基本上接受一个实数值作为输入,并在 0 和 1 之间压缩它。它也经常被称为挤压功能。其目的是在输入空间中引入非线性。非线性是我们摇摆的地方,网络学习捕捉复杂的关系。从上面的数学表示可以看出,通过 sigmoid 函数的大负数变成 0,大正数变成 1。由于这一特性,sigmoid 函数通常有一个非常好的解释,即神经元的放电频率;从根本不触发(0)到以假定的最大频率完全饱和触发(1)。然而,随着时间的推移,由于以下两个主要缺点,sigmoid 激活函数变得不太流行:

  • 杀伤梯度:
    乙状结肠神经元在边界上饱和,因此这些区域的局部梯度几乎为零。为了让您更直观地理解这一点,请考虑 sigmoid 函数的输入为+15 和-15。sigmoid 函数的导数是‘SIG(z)*(1—SIG(z))’。如上所述,大的正值被挤压在 1 附近,大的负值被挤压在 0 附近。因此,有效地使局部梯度接近 0。结果,在反向传播期间,该梯度被乘以最终目标函数的该神经元输出的梯度,因此它将有效地“杀死”梯度,并且没有信号将通过神经元流向其权重。此外,我们必须注意初始化 sigmoid 神经元的权重以避免饱和,因为如果初始权重太大,那么大多数神经元将会饱和,因此网络将很难学习。
  • 非零中心输出:
    输出总是在 0 和 1 之间,这意味着应用 sigmoid 后的输出总是正的,因此,在梯度下降期间,反向传播期间权重的梯度将总是正的或负的,这取决于神经元的输出。结果,梯度更新在不同的方向上走得太远,这使得优化更加困难。

python 实现类似于:

import numpy as npdef sigmoid(z):
 return 1 / (1 + np.exp(-z))

谭:

Source: Google

双曲正切激活函数的数学形式为“双曲正切(z)=(ez-e-z)/(ez+e-z)`.)它基本上是一个移位的乙状结肠神经元。它基本上接受一个实数值,并在-1 和+1 之间压缩它。类似于乙状结肠神经元,它在大的正值和负值时饱和。然而,它的输出总是以零为中心,这是有帮助的,因为网络后面层中的神经元将接收以零为中心的输入。因此,在实践中,双曲正切激活函数在 sigmoid 上的隐藏层中是优选的。

 import numpy as npdef tanh(z):
 return np.tanh(z) 

ReLU:

Source: Google

ReLU 或整流线性单位表示为“ReLU(z) = max(0,z)”。它基本上将输入阈值设置为零,即 ReLU 神经元输入中的所有负值都设置为零。最近,它变得流行起来,因为发现与 Sigmoid 或 Tanh 激活函数相比,它大大加速了随机梯度下降的收敛。为了直观起见,梯度可以是 0 或 1,具体取决于输入的符号。让我们讨论一下 ReLU 的一些优点:

  • 激活的稀疏性 :
    正如我们上面所研究的,ReLU 和 Tanh 激活函数几乎总是在神经网络中被激发,导致几乎所有的激活都在计算网络的最终输出时被处理。这当然是件好事,但前提是我们的网络很小,或者我们有无限的计算能力。想象一下,我们有一个非常深的神经网络,其中有许多神经元,理想情况下,我们希望只有一部分神经元激活,并对网络的最终输出做出贡献,因此,我们希望网络中的一部分神经元是被动的。ReLU 给了我们这个好处。因此,由于 ReLU 的特性,有可能 50%的神经元给出 0 次激活,从而导致更少的神经元触发,结果网络变得更轻,我们可以更快地计算输出。

然而,它有一个缺点,即所谓的神经元死亡问题。

  • 死亡神经元:
    ReLU 单位在训练过程中可以很脆弱,可以“死亡”。也就是说,如果单元最初没有被激活,那么在反向传播期间零梯度流过它们。因此,“死亡”的神经元将停止响应输出误差的变化,因此,在反向传播期间,参数将永远不会更新。但是,有一些概念,如 Leaky ReLU,可以用来克服这个问题。此外,适当设置学习速率可以防止神经元死亡。
import numpy as npdef relu(z):
 return z * (z > 0)

泄漏的 ReLU:

Source: Google

漏 ReLU 只是传统 ReLU 函数的扩展。正如我们看到的,对于小于 0 的值,梯度为 0,这导致这些区域中的“死亡神经元”。为了解决这个问题,Leaky ReLU 就派上了用场。也就是说,我们不是将小于 0 的值定义为 0,而是将负值定义为输入的一个小的线性组合。常用的小值是 0.01。它表示为 LeakyReLU(z) = max(0.01 * z,z)。通过做一点小小的改变,漏 ReLU 的思想可以被进一步扩展。我们可以学习乘数,并将其作为我们过程中的一个附加超参数,而不是将“z”乘以一个常数。这就是所谓的参数 ReLU。在实践中,相信这比泄漏 ReLU 执行得更好。

import numpy as npdef leaky_relu(z):
 return np.maximum(0.01 * z, z)

感谢您的阅读。在这篇文章中,我试图放下我对一些最常用的激活函数的理解,为什么我们首先使用它们,以及应该使用哪种激活函数。不断寒心,不断创新!

杂项:

如果你在数据科学或深度学习领域工作,如果你认为有合作的机会,请不要犹豫。我正在寻找全职机会,并愿意讨论。

参考资料:

【2】:【http://www.deeplearningbook.org/

神经网络中的激活函数

原文:https://towardsdatascience.com/activation-functions-in-neural-networks-83ff7f46a6bd?source=collection_archive---------8-----------------------

动机、使用案例、优势和局限性

TL; 博士这篇文章讨论了深度学习和神经网络中使用的各种线性和非线性激活函数。我们还将研究每个函数在不同情况下的表现,每个函数的优缺点,然后以最后一个激活函数结束,该函数的表现优于自然语言处理应用程序中讨论的函数。

介绍

继续神经网络的话题。今天我们将讨论什么是激活函数,并尝试理解其基本概念。我们深入研究了这些函数的线性和非线性版本,并探索了它们在哪些方面表现最佳,在哪些方面表现不佳。

在我们继续讨论什么是激活功能之前,让我们先回顾一下神经网络是如何运作的。因此,神经网络是模拟大脑工作方式的人工神经元的复杂网络。他们接受输入参数及其相关权重和偏差,然后我们计算“激活”神经元的加权和。我们的激活函数决定哪些神经元将把值推进到下一层。它是如何工作的,是我们接下来将要看到的。

基本概念

在前向传播步骤中,我们的人工神经元接收来自不同参数或特征的输入。理想情况下,每个输入都有自己的值或权重和偏差,这些值或权重和偏差可以显示导致最终预测值发生变化的相互依赖性。这是一种被称为互动效应的现象。

一个很好的例子是在糖尿病患者数据集上尝试回归模型。目标是根据一个人的体重和身高来预测他是否有患糖尿病的风险。一些体重表明,如果一个人的身高比一个健康指数相对较高的人矮,那么他患糖尿病的风险更大。当然还有其他我们目前没有考虑的参数。我们说身高和体重之间有交互作用。

激活函数考虑了不同参数中的相互作用效应,并进行转换,然后决定哪个神经元将值向前传递到下一层。

线性函数

我们从最简单的函数开始。线性功能f(z) 的值与 z 的值成比例增加。输入值是层中神经元的权重和偏差的加权和。线性函数解决了二进制阶跃函数仅报告值 0 和 1 的问题。

Fig 1: Performance of Linear or Identity Activation Function

函数的输出不受任何范围的限制;也就是说, f(z) 的值可以从中得出,这不一定是一个问题,因为我们可以通过取 com 之后触发的神经元的最大值来进入下一层或最后一层。除此之外,线性激活函数有其一系列缺点,例如:

  • 我们观察到函数的导数是一个常数。这意味着存在恒定的梯度下降,因为与 z 值无关。
  • 我们的模型不是真正的学习,因为它没有改进误差项,这是神经网络的全部要点。
  • 由于激活是线性的,嵌套在 2 或 N 个具有相同功能的隐藏层中不会有实际效果。N 层基本上可以压缩成一层。

我们看到这个函数不适合处理复杂的。因此,为了解决这个问题,我们使用非线性函数来使我们的模型能够迭代学习。

Sigmoid 函数

Sigmoid 函数将一个值作为输入,并输出另一个介于 0 和 1 之间的值。当构建神经网络模型时,它是非线性的并且易于操作。这个函数的优点是在不同的 z 值上连续可微分,并且具有固定的输出范围。

Fig 2: Performance of Sigmoid Activation Function

通过观察,我们看到 f(z) 的值以非常慢的速率增加。数学上的原因是,随着 z (在 x 轴上)增加,e 指数-z 的值变得无穷小,并且 f(z) 的值在某个点变得等于 1。换句话说,这个函数容易受到我们在上一讲中讨论的消失梯度问题的影响。高层次的问题是,利用 sigmoid 激活的模型(我们的慢学习者和处于实验阶段的学习者)将生成具有较低准确性的预测值。

当我们的神经网络中有多个隐藏层时,这个函数会出现另一个问题。我们通过这个激活函数得到的所有值都是正的,sigmoid 在 0-1 范围内产生不同大小的值,因此很难优化。

除了缺点,我们确实看到 sigmoid 函数特别是在二进制分类模型中作为输出层的一部分使用,以捕捉从 0 到 1 的概率。在大多数情况下,我们通常会遇到涉及多个类的问题,对于这样的模型,我们使用 Softmax 函数(这个函数的细节在之前的讲座中有进一步的解释)。

Tanh 函数

双曲正切函数是 sigmoid 函数的修改版或放大版。我们在 Sigmoid 中看到的是 f(z) 的值有界在 0 和 1 之间;然而,在 Tanh 的情况下,值被限制在-1 和 1 之间。

从某种意义上说,这很简单,我们能够得到不同符号的值,这有助于我们确定在下一层要考虑哪些分数,忽略哪些分数。但是,该函数仍然存在 sigmoid 函数中出现的梯度消失问题。该模型在+2 和-2 范围之外以指数方式变慢。除了在这个狭窄的范围内,梯度的变化非常小。

Fig 3: Performance of Tanh Activation Function

关于双曲正切函数和 sigmoid 函数的最后一点,双曲正切函数的梯度或导数比 Sigmoid 函数更陡,我们可以在下面的图 4 中观察到。我们选择使用 Sigmoid 还是 Tanh 实际上取决于问题陈述对梯度的要求。

Fig 4: Comparision of Sigmoid and Tanh Activation Function

校正线性单位函数

整流线性单元或简称 ReLU 将被认为是深度学习模型中最常用的激活函数。如果接收到任何负输入,该函数简单地输出值 0,但是对于任何正值 z,,它像线性函数一样返回该值。所以可以写成 f(z)=max(0,z)

Fig 5: Performance of ReLU Activation Function

然而,应该注意,ReLU 函数仍然是非线性的,因此我们能够反向传播误差,并且具有多层神经元。这个功能很快被采用,因为 ReLU 解决了乙状结肠和 Tanh 面临的几个问题:

  • ReLU 函数在其跨越所有负数的范围的一半上具有 0 的导数。对于正输入,导数为 1。因此,我们已经纠正了“消失”梯度问题。
  • 一次只有少数神经元被激活,使得网络变得稀疏,从而变得高效(我们将会看到稀疏并不总是一件好事)
  • 与 Sigmoid 和 Tanh 相比,它在计算上是经济的。

尽管 ReLU 是比其它非线性替代物更好的激活函数,但是它有自己的一系列限制和缺点:

  • 该函数遇到了垂死的 ReLU 问题——对于对应于形成 y = 0 线的 z < 0, the gradient will be 0 because of which the weights will not get adjusted during the gradient descent in backpropagation. That means, such neurons will stop responding to variations in error/input, so the output network becomes passive due to added sparsity.
  • It is best used in between the input and output layers, more specifically within hidden

As a final note on ReLU, there is a way to counter the dying ReLU problem by using a modified version of the function called the ‘Leaky’ ReLU. To put it briefly, we take the z < 0 值的激活,通过添加小的非零恒定梯度α(通常,α=0.01)将其转换成非水平直线。所以我们对于z0 的新公式是 f(z) = αz

为了获得更多的信息,我已经附上了关于 Leaky ReLU 的研究论文:https://arxiv.org/abs/1502.01852

额外收获:非线性立方体激活功能

有一个有趣的激活功能应用于词性标注,它比文章中提到的所有其他功能都要好。曼宁和陈(2014)的论文提出了一种学习神经网络分类器的新方法,用于自然语言处理的贪婪的、基于转换的依存解析器。他们引入了由 z 表示的非线性立方函数,这在下面的隐藏层的方程中被进一步阐述:

Fig 6: Cube Activation function that takes weights of the words, tags, and labels along with its bias.

上面的等式表示输入单元的加权和,在这种情况下,输入单元是单词、标签和标记嵌入加上相关联的偏差。然后,总和的 3 次方被用来计算该迭代的输出值。

这个特定激活功能的性能可以在下面的图表中看到。这不是成比例的,但我们可以确定,在这种情况下,随着学习以指数速率( z )进行,误差项减少了。

Fig 7: Performance of Cube (z³) Activation Function

该论文在实验中是彻底的,其中该模型与其他最先进的模型进行了严格的测试,并且为了快速得出激活函数之间关于性能的比较,我们观察到:

非线性立方体> ReLU > Tanh > Sigmoid

为了更好地了解这个模型是如何运行的,我在下面附上了曼宁论文的链接。

一个使用神经网络的快速准确的依存句法分析器:【https://cs.stanford.edu/~danqi/papers/emnlp2014.pdf】T3

结论

我们学习了在 ML 模型中使用的许多激活函数。对于研究人员来说,这些函数用于比较在给定问题陈述的情况下什么是最好的。对于选择特定的激活功能,没有严格的规则。然而,这取决于模型的架构、超参数和我们试图捕捉的特征。理想情况下,我们在基本模型上使用 ReLU 函数,但是如果我们不能达到最佳结果,我们也可以尝试其他函数。

最后一点,请随意评论您自己设计的非线性激活函数版本、高级概述以及它在什么情况下性能最佳。

传播和分享知识。如果这篇文章激起了你的兴趣,请鼓掌,因为它总是激励我写出更多的信息内容。更多数据科技相关帖子关注我 这里
我在
Linkedin上也有空,偶尔tweet也有空。😃

神经网络中的激活函数

原文:https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6?source=collection_archive---------0-----------------------

Sigmoid,tanh,Softmax,ReLU,Leaky ReLU 解释!!!

什么是激活功能?

它只是一个东西函数,你用它来得到 node 的输出。它也被称为传递函数

为什么我们在神经网络中使用激活函数?

它用于确定神经网络的输出,如是或否。它将结果值映射到 0 到 1 或-1 到 1 等之间。(取决于功能)。

激活功能基本上可以分为两种类型

  1. 线性激活函数
  2. 非线性激活函数

仅供参考:备忘单如下。

线性或身份激活功能

如你所见,这个函数是一条直线或线性的。因此,函数的输出将不会被限制在任何范围之间。

Fig: Linear Activation Function

方程式: f(x) = x

范围:(-无穷大到无穷大)

它对输入神经网络的通常数据的复杂性或各种参数没有帮助。

非线性激活功能

非线性激活函数是最常用的激活函数。非线性有助于使图表看起来像这样

Fig: Non-linear Activation Function

这使得模型很容易概括或适应各种数据,并区分输出。

需要理解非线性函数的主要术语有:

导数或微分:y 轴的变化与 x 轴的变化。它也被称为斜坡。

单调函数:要么完全非增,要么完全非减的函数。

非线性激活函数主要根据它们的范围或曲线来划分

1。乙状结肠或逻辑激活功能

Sigmoid 函数曲线看起来像 S 形。

Fig: Sigmoid Function

我们之所以用 sigmoid 函数,主要是因为它存在于 (0 到 1)之间。因此,它特别适用于我们必须预测概率作为输出的模型。由于任何事情的概率只存在于 0 和 1 之间, sigmoid 是正确的选择。

该函数是可微的。这意味着,我们可以在任意两点找到 s 形曲线的斜率。

函数是单调的,但函数的导数不是。

逻辑 sigmoid 函数会导致神经网络在训练时停滞不前。

softmax 函数是一个更通用的逻辑激活函数,用于多类分类。

2。双曲正切或双曲正切激活函数

tanh 也像逻辑 s 形但更好。双曲正切函数的范围是从(-1 到 1)。tanh 也是 s 形的(s 形)。

Fig: tanh v/s Logistic Sigmoid

优点是负输入将被映射为强负输入,而零输入将被映射到双曲正切图中的零附近。

函数是可微的

函数是单调的,而它的导数不是单调的

双曲正切函数主要用于两类之间的分类。

双曲正切和逻辑 sigmoid 激活函数都用于前馈网络。

3。ReLU(整流线性单元)激活功能

ReLU 是目前世界上使用最多的激活函数。因为,它被用于几乎所有的卷积神经网络或深度学习。

Fig: ReLU v/s Logistic Sigmoid

正如你所看到的,ReLU 是半整流(从底部)。当 z 小于零时 f(z)为零,当 z 大于或等于零时 f(z)等于 z。

范围:【0 到无穷大】

函数及其导数都是 单调

但问题是,所有的负值立即变为零,这降低了模型根据数据进行适当拟合或训练的能力。这意味着给予 ReLU 激活函数的任何负输入都会在图形中立即将值变成零,这反过来会通过不适当地映射负值来影响结果图形。

4。泄漏的 ReLU

这是解决濒临死亡的 ReLU 问题的一次尝试

Fig : ReLU v/s Leaky ReLU

你能看到漏洞吗?😆

泄漏有助于增加 ReLU 功能的范围。通常情况下, a 的值在 0.01 左右。

a 不为 0.01 时,称为随机化 ReLU

因此,泄漏 ReLU 的范围为(-无穷大到无穷大)。

泄漏和随机化 ReLU 函数本质上都是单调的。同样,它们的导数在性质上也是单调的。

为什么要用导数/微分?

更新曲线时,根据坡度在中知道向哪个方向改变或更新曲线多少。这就是为什么我们在机器学习和深度学习的几乎每个部分都使用微分。

Fig: Activation Function Cheetsheet

Fig: Derivative of Activation Functions

乐意帮忙。支持我。

If you liked it

所以,跟着我上中、 LinkedIn 看看类似的帖子。

任何评论或者如果你有任何问题,写在评论里。

鼓掌吧!分享一下!跟我来。

你会喜欢的以前的故事:

[## “TensorFlow”里的“Tensor”是什么鬼?

我不知道…

hackernoon.com](https://hackernoon.com/what-the-hell-is-tensor-in-tensorflow-e40dbf0253ee) [## 纪元与批量大小与迭代次数

了解您的代码…

towardsdatascience.com](/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9) [## 蒙特卡罗树搜索

每个数据科学爱好者的 MCTS

towardsdatascience.com](/monte-carlo-tree-search-158a917a8baa) [## 强化学习中的政策网络与价值网络

在强化学习中,代理在他们的环境中采取随机决策,并学习选择正确的决策…

towardsdatascience.com](/policy-networks-vs-value-networks-in-reinforcement-learning-da2776056ad2) [## TensorFlow 图像识别 Python API 教程

在带有 Inception-v3 的 CPU 上(以秒为单位)

towardsdatascience.com](/tensorflow-image-recognition-python-api-e35f7d412a70) [## 如何使用 Python 发送电子邮件

使用 Flask 设计专业邮件!

medium.com](https://medium.com/@sagarsharma4244/how-to-send-emails-using-python-4293dacc57d9)

主动学习 MNIST——节省标签

原文:https://towardsdatascience.com/active-learning-on-mnist-saving-on-labeling-f3971994c7ba?source=collection_archive---------13-----------------------

标记数据的聪明方法是从决策边界开始

主动学习是一种半监督技术,允许通过从学习过程(损失)的角度选择最重要的样本来标记较少的数据。在数据量大且标记率高的情况下,它会对项目成本产生巨大影响。例如,对象检测和 NLP-NER 问题。
文章基于以下代码: 主动学习 MNIST

实验数据

*#load 4000 of MNIST data for train and 400 for testing*
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_full = x_train[:4000] / 255
y_full = y_train[:4000]
x_test = x_test[:400] /255
y_test = y_test[:400]
x_full.shape, y_full.shape, x_test.shape, y_test.shape

plt.imshow(x_full[3999])

<matplotlib.image.AxesImage at 0x7f59087e5978>

我将使用 MNIST 数据集的子集,这是 6 万张带标签的数字图片和 10K 测试样本。为了更快地训练,训练需要 4000 个样本(图片),测试需要 400 个样本(神经网络在训练过程中永远看不到)。为了标准化,我将灰度图像点除以 255。

模型、培训和标签流程

*#build computation graph*
x = tf.placeholder(tf.float32, [**None**, 28, 28])
x_flat = tf.reshape(x, [-1, 28 * 28])
y_ = tf.placeholder(tf.int32, [**None**])
W = tf.Variable(tf.zeros([28 * 28, 10]), tf.float32)
b = tf.Variable(tf.zeros([10]), tf.float32)
y = tf.matmul(x_flat, W) + b
y_sm = tf.nn.softmax(y)
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_, logits=y))
train = tf.train.AdamOptimizer(0.1).minimize(loss)
accuracy = tf.reduce_mean(tf.cast(tf.equal(y_, tf.cast(tf.argmax(y, 1), tf.int32)), tf.float32))

作为一个框架,我们可以使用 TensorFlow 计算图来构建十个神经元(每个数字)。w 和 b 是神经元的权重。softmax 输出 y_sm 将有助于数字的概率(置信度)。损失将是预测和标记数据之间典型的“软最大化”交叉熵。优化器的选择是一个流行的 Adam,学习率几乎是默认的— 0.1。作为一个主要的衡量标准,我将使用测试数据集的准确性。

**def** reset():
    *'''Initialize data sets and session'''*
    **global** x_labeled, y_labeled, x_unlabeled, y_unlabeled
    x_labeled = x_full[:0]
    y_labeled = y_full[:0]
    x_unlabeled = x_full
    y_unlabeled = y_full
    tf.global_variables_initializer().run()
    tf.local_variables_initializer().run() 

**def** fit():
    *'''Train current labeled dataset until overfit.'''*
    trial_count = 10
    acc = sess.run(accuracy, feed_dict={x:x_test, y_:y_test})
    weights = sess.run([W, b])
    **while** trial_count > 0:
        sess.run(train, feed_dict={x:x_labeled, y_:y_labeled})
        acc_new = sess.run(accuracy, feed_dict={x:x_test, y_:y_test})
        **if** acc_new <= acc:
            trial_count -= 1
        **else**:
            trial_count = 10
            weights = sess.run([W, b])
            acc = acc_new

    sess.run([W.assign(weights[0]), b.assign(weights[1])])    
    acc = sess.run(accuracy, feed_dict={x:x_test, y_:y_test})
    print('Labels:', x_labeled.shape[0], '**\t**Accuracy:', acc)

**def** label_manually(n):
    *'''Human powered labeling (actually copying from the prelabeled MNIST dataset).'''*
    **global** x_labeled, y_labeled, x_unlabeled, y_unlabeled
    x_labeled = np.concatenate([x_labeled, x_unlabeled[:n]])
    y_labeled = np.concatenate([y_labeled, y_unlabeled[:n]])
    x_unlabeled = x_unlabeled[n:]
    y_unlabeled = y_unlabeled[n:]

这里我定义了这三个过程,以便更方便地编码。
reset() —清空已标记的数据集,将所有数据放入未标记的数据集中,并重置会话变量

fit() —运行训练,试图达到最佳准确度。如果在前十次尝试中没有提高,训练将在最后一次最佳结果时停止。我们不能使用任何大量的训练时期,因为模型往往很快过拟合或需要一个密集的 L2 正则化。

label_manually() —这是对人工数据标注的模拟。实际上,我们从已经标注的 MNIST 数据集中获取标注。

地面实况; 真值(机器学习)

*#train full dataset of 1000*
reset()
label_manually(4000)
fit()

如果我们足够幸运,有足够的资源来标记整个数据集,我们将获得 92.25%的准确率。

使聚集

*#apply clustering*
kmeans = tf.contrib.factorization.KMeansClustering(10, use_mini_batch=**False**)
kmeans.train(**lambda**: tf.train.limit_epochs(x_full.reshape(4000, 784).astype(np.float32), 10))

centers = kmeans.cluster_centers().reshape([10, 28, 28])
plt.imshow(np.concatenate([centers[i] **for** i **in** range(10)], axis=1))

<matplotlib.image.AxesImage at 0x7f58d033a860>

在这里,我尝试使用 k-means 聚类来找到一组数字,并使用这些信息进行自动标记。我运行 Tensorflow 聚类估计器,然后可视化得到的十个质心。如你所见,结果远非完美——数字“9”出现了三次,有时与“8”和“3”混在一起。

随机标记

*#try to run on random 400*
reset()
label_manually(400)
fit()

让我们尝试只标记 10%的数据(400 个样本),我们将获得 83.75%的准确性,这与 92.25%的基本事实相差甚远。

主动学习

*#now try to run on 10*
reset()
label_manually(10)
fit()

*#pass unlabeled rest 3990 through the early model*
res = sess.run(y_sm, feed_dict={x:x_unlabeled})
*#find less confident samples*
pmax = np.amax(res, axis=1)
pidx = np.argsort(pmax)
*#sort the unlabeled corpus on the confidency*
x_unlabeled = x_unlabeled[pidx]
y_unlabeled = y_unlabeled[pidx]
plt.plot(pmax[pidx])

[<matplotlib.lines.Line2D at 0x7f58d0192f28>]

现在我们将使用主动学习来标记相同的 10%的数据(400 个样本)。为此,我们从 10 个样本中抽取一批样本,并训练一个非常原始的模型。然后,我们将剩余的数据(3990 个样本)通过该模型,并评估最大 softmax 输出。这将显示所选类是正确答案的概率(换句话说,神经网络的置信度)。排序后,我们可以在图上看到置信度的分布从 20%到 100%不等。这个想法是从信心不足的样品中选择下一批进行标记。

*#do the same in a loop for 400 samples*
**for** i  **in** range(39):
    label_manually(10)
    fit()

    res = sess.run(y_sm, feed_dict={x:x_unlabeled})
    pmax = np.amax(res, axis=1)
    pidx = np.argsort(pmax)
    x_unlabeled = x_unlabeled[pidx]
    y_unlabeled = y_unlabeled[pidx]

在对 40 个批次的 10 个样品运行这样的程序后,我们可以看到最终的准确度几乎是 90%。这远远超过在随机标记数据的情况下达到的 83.75%。

如何处理剩余的未标记数据

*#pass rest unlabeled data through the model and try to autolabel*
res = sess.run(y_sm, feed_dict={x:x_unlabeled})
y_autolabeled = res.argmax(axis=1)
x_labeled = np.concatenate([x_labeled, x_unlabeled])
y_labeled = np.concatenate([y_labeled, y_autolabeled])
*#train on 400 labeled by active learning and 3600 stochasticly autolabeled data*
fit()

传统的方法是通过现有模型运行数据集的其余部分,并自动标记数据。然后,在训练过程中推动它可能有助于更好地调整模型。然而在我们的例子中,它并没有给我们带来任何更好的结果。

我的方法是做同样的事情,但是,如同在主动学习中一样,考虑到信心:

*#pass rest of unlabeled (3600) data trough the model for automatic labeling and show most confident samples*
res = sess.run(y_sm, feed_dict={x:x_unlabeled})
y_autolabeled = res.argmax(axis=1)
pmax = np.amax(res, axis=1)
pidx = np.argsort(pmax)
*#sort by confidency*
x_unlabeled = x_unlabeled[pidx]
y_autolabeled = y_autolabeled[pidx]
plt.plot(pmax[pidx])

[<matplotlib.lines.Line2D at 0x7f58cf918fd0>]

*#automatically label 10 most confident sample and train for it*
x_labeled = np.concatenate([x_labeled, x_unlabeled[-10:]])
y_labeled = np.concatenate([y_labeled, y_autolabeled[-10:]])
x_unlabeled = x_unlabeled[:-10]
fit()

在这里,我们通过模型评估运行剩余的未标记数据,我们仍然可以看到剩余样本的置信度不同。因此,想法是采取一批十个最有信心的样本,并训练模型。

*#run rest of unlabelled samples starting from most confident*
**for** i **in** range(359):
    res = sess.run(y_sm, feed_dict={x:x_unlabeled})
    y_autolabeled = res.argmax(axis=1)
    pmax = np.amax(res, axis=1)
    pidx = np.argsort(pmax)
    x_unlabeled = x_unlabeled[pidx]
    y_autolabeled = y_autolabeled[pidx]
    x_labeled = np.concatenate([x_labeled, x_unlabeled[-10:]])
    y_labeled = np.concatenate([y_labeled, y_autolabeled[-10:]])
    x_unlabeled = x_unlabeled[:-10]
    fit()

这个过程需要一些时间,并给我们额外的 0.8%的准确性。

结果

实验准确率
4000 个样本 92.25%
400 个随机样本 83.75%
400 个主动学习样本 89.75%
+自动标注 90.50%

结论

当然,这种方法有其缺点,如计算资源的大量使用,以及数据标记与早期模型评估混合需要特殊过程的事实。此外,出于测试目的,数据也需要被标记。但是,如果标签的成本很高(特别是对于 NLP、CV 项目),这种方法可以节省大量资源,并推动更好的项目结果。

附言(同 postscript);警官(police sergeant)

如果你有私人问题,请在 Linkedin 或脸书联系我,我有时会在那里发布关于人工智能的简短新闻和想法。

我要感谢我的同事们亚历克斯·西姆基夫、米科拉·科兹连科、沃洛季米尔·森德茨基、维亚奇·博西和纳扎尔·萨维琴科富有成效的讨论、合作和有益的建议,以及整个 MindCraft.ai 团队的持续支持。
Andy Bosyi,
mind craft . ai 首席执行官
信息技术&数据科学

主动学习教程

原文:https://towardsdatascience.com/active-learning-tutorial-57c3398e34d?source=collection_archive---------0-----------------------

如今,我们接触到大量未标记的数据,这些数据要么来自互联网,要么来自其他来源,如学术界或商界。由于未标记的数据相对容易获得且标记昂贵,公司通常雇佣一名专家或几名员工来标记数据1。考虑以下情况,一家数据驱动的医疗公司有大量 MRI 扫描,他们需要雇用一名专家来帮助他们解释这些扫描。公司资源有限,他们无法解释或标记所有数据;这就是他们决定使用主动学习(AL)的原因。人工智能的承诺是,通过迭代增加我们精心选择的标记数据的大小,有可能实现与使用完全监督的数据集相似(或更好[2])的性能,而成本或时间只是标记所有数据所需的一小部分。就标记数据量而言,AL 被认为是一种半监督方法,介于无监督和完全监督之间,即,对于无监督数据,我们使用 0%标记样本,而对于完全监督,我们使用 100%标记样本。因此,使用多少数据或者模型需要多少性能的决策依赖于资源管理决策,换句话说,它可以是业务决策。

Shanghai early morning pollution — ori cohen 2017

AL 有三种场景:
1。成员查询合成,即将生成的样本发送给 oracle 进行标记。
2。基于流的选择性采样,即每个样本都被单独考虑——在我们的例子中是标签查询或拒绝。类似于在线学习,数据不被保存,没有关于数据分布的假设,因此它可以适应变化。
3。基于池的采样,即从未标记的数据池中选择样本用于标记[3]。
在本教程中,我们使用第三种场景。

下面的伪算法表示学习过程,如代码中所写的,用于基于池的采样:
1 .将数据分成一个“池”和一个测试集
2。从初始训练集的池中选择“k”个样本并标记它们,剩余的数据将成为验证集
3。将所有集合
4 标准化。使用具有平衡权重的训练集训练模型。
5。使用经过训练的模型和验证集,获得每个样本的概率。
6。将训练好的模型与测试集一起使用,获得性能度量。
7。根据每个样本的概率,选择“k”个最具信息性的样本,即模型对其标签最不确定的样本。
8。将这些“k”个样本从验证集移动到训练集,并查询它们的标签。
9。所有数据集的逆归一化
10。根据停止标准停止,否则转到 3。

往前走之前有几点需要注意:
1。所选算法的全监督性能通常是上限,因此建议尝试几种算法。
2。在我们从验证集中移除样本后,所有集合的归一化必须被反转并再次归一化,因为我们的样本分布在新的验证和新的训练集中均发生了变化。
3。样本选择函数依赖于来自训练模型的测试样本概率,因此我们只能使用提供样本概率的算法。
4。“k”是一个超参数

我们在 AL 方法中最重要的工具是样本选择功能,这是我们影响学习过程的唯一点,使用正确的方法至关重要。这个领域是一个热门的研究课题,有许多研究提出竞争选择函数。
在本教程中,我提出了四个已知的选择函数。随机选择—我们从验证集中选择“k”个随机样本。
2。熵选择—我们选择具有最高熵的“k”个样本。
3。边际选择—我们选择两个最高类别概率之间差异最小的“k”个样本,即模型对单个类别非常确定的样本的数值较高,而类别概率非常相似的样本的数值较低。

这里提供的代码在选择各种学习算法和选择函数方面利用了模块化架构,并且可以用作其他模型-函数比较的基础。

我们比较了几种学习算法,如线性核支持向量机(SVM)、随机森林(RF)和逻辑回归(LOG)。每个算法都使用所有的“k”=[10,25,50,125,250]的选择函数来执行,总共累积了 80 次实验。由于某些算法和选择函数的随机性质,建议在代码中重复运行实验,以便计算出具有统计意义的结果。然而,运行时间很长,我选择对(模型、函数、k)的每个组合只运行一次实验。

下面是对代码及其类架构的解释。

我们首先下载我们的数据,并根据 MNIST 已知的 60K/10K 分割定义,将其分割为训练和测试。稍后,该列车组将被拆分以进行训练和验证。

我们创建了一个模块化的类表示,“BaseModel”是类架构的一个基础模型,你可以实现新的模型,并且可以互换使用它们,或者与所有其他模型一起使用。我们当前的实现包括 SVM、逻辑回归、随机森林和梯度推进。

我们的“TrainModel”类接受先前定义的学习算法之一,使用训练集进行训练,并从测试集中获取性能测量。

我们创建一个模块化的选择函数类表示,“BaseSelectionFunction”是各种样本选择方法的基类。使用这种架构,您可以实现新的选择方法,并使用它们来补充或代替以前的方法,以达到实验的目的。我们当前的实现包括随机选择、熵选择、边际抽样选择和最小标准差选择。

我们有一个类,用于使用[0,1]范围内的最小最大值缩放器进行归一化。

最初,我们希望从未标记的数据池中随机抽样,这是使用 random.choice 完成的,没有替换。

这是根据引言中描述的算法启动主动学习过程的主类。简而言之,我们选择“k”个随机样本,训练模型,选择信息最丰富的样本,从验证集中移除,查询它们的标签,并使用这些样本重新训练,直到达到停止标准。

在脚本的主要部分,我们下载数据,分为训练验证和测试,我们通过迭代所有的训练算法 X 所有的选择函数 X 范围[10,25,50,125,250]内所有可能的 k 来运行实验。准确性结果保存在字典中,并在模型完成训练后立即保存到一个独特的文件中,这在使用 Google Colaboratory 时至关重要,因为它往往会不时断开连接。我们还将我们的培训限制在最多 500 个查询样本。

独立地,我们使用 60K-10K 的训练测试分割训练了几个模型,结果表明 RF、SVM 和 LOG 的上限是 97。, 94.和 92.47。

下图显示随机森林分类器与边缘选择方法配对,k=10 是最佳配置。

对于前面提到的停止条件和超参数,性能最好的模型是随机森林算法!

A comparison of accuracy between a fully supervised & active-learning approaches, comparing random-forest, SVM and logistic regression, using all sampling methods and K=[10,25,50,125,250]. The y-axis represents the accuracy and the x-axis the amount of samples in each iteration.

我们进一步看到,最佳采样函数是边缘采样!

A comparison of accuracy between a fully supervised & active-learning approaches, using a random-forest classifier, all sampling methods and K=[10,25,50,125,250]. The y-axis represents the accuracy and the x-axis the amount of samples in each iteration.

最后,k=10 是最佳选择参数。

A comparison of accuracy between a fully supervised & active-learning approaches, using a random-forest classifier, Margin-Sampling and K=[10,25,50,125,250]. The y-axis represents the accuracy and the x-axis the amount of samples in each iteration.

我们已经看到,通过使用主动学习方法,我们可以使用一小部分标记数据,与完全监督的方法相比,可以获得非常接近的准确性。事实上,如果您选择使用 1000 个样本,准确率甚至会攀升到约 95%。此外,非常有趣的是,作为一种样本选择方法,边际抽样试探法优于熵。最后,我希望这篇教程对你有所启发,你可以考虑在你的下一次学习中使用这种方法。

我要感谢 Moshe Hadad 对 PEP8 的宝贵评论和 Shay Zweig 的校对和评论。

Ori Cohen 在机器学习、脑机接口和神经生物学领域获得了计算机科学博士学位。

参考资料:

1 Shay Yehezkel,高维统计过程控制与应用,理学硕士论文。

[2] Ilhan、Hamza Osman 和 Mehmet Fatih Amasyali。 主动学习作为提高准确率的一种方式 。”国际计算机理论与工程杂志 6,第 6 期(2014): 460。

[3] Stefan Hosein 主动学习:好奇 AI 算法

使用智能手机的活动识别—机器学习应用

原文:https://towardsdatascience.com/activity-recognition-using-smartphones-machine-learning-application-a10e7b5578f9?source=collection_archive---------3-----------------------

“white building with data has a better idea text signage” by Franki Chamaki on Unsplash

当我第一次开始探索机器学习时,我阅读了大量的文章和研究论文。我最初发现的一篇论文涉及使用机器学习对活动进行分类。尽管当时实现似乎是一个遥不可及的目标,但我还是被这个应用程序吸引住了。从那天起,我获得了一些经验,我相信今天我可以应用我的机器学习知识来识别现在的活动。

对于数据集,我从 Kaggle 竞赛中选择了training.csvtest.csv文件。我在这个项目中使用了一个 Jupyter 笔记本,在我的活动识别中使用了机器学习报告。

顺便提一下,现在通过谷歌数据集搜索在线查找数据集变得容易多了。这是我找到这个项目数据集的地方。

因此,在这篇文章中,我将解释我在这个项目中采取的步骤,以及我如何使用机器学习以超过 96%的准确率对活动进行分类。分叉存储库,打开笔记本,开始吧。

导入库

在这个项目中,我们将需要许多存储库。

  1. numpy 和 pandas: numpy 使我们能够高效地使用数组。Pandas 用于读取数据集文件并将其作为 dataframe 导入,data frame 类似于包含行和列的表。
  2. matplotlib: matplotlib 是一个高度可定制的包,它有一个子包pyplot,可以让我们绘制图表、柱状图、饼状图等等。我们可以选择添加图例、轴标题、改变线条粗细等。cm包(colormap)允许我们为图表获取颜色。
  3. sklearn: 这个机器学习库包括许多已经内置的机器学习算法,其中某些参数设置为默认参数,因此它们开箱即用。

如果你注意到了,我加了一行%matplotlib inline。这将 matplotlib 的后端更改为 Jupyter 笔记本,因此,所有绘图现在都将显示在 Jupyter 笔记本本身中。

在这个项目中,我使用了四种算法,即支持向量分类器作为SVC,逻辑回归作为LogisticRegression,K 近邻分类器作为KNeighborsClassifier,随机森林分类器作为RandomForestClassifier。为了计算精度,我导入了accuracy_score

了解数据集

Person walking up the stairs

首先我们将使用read_csv()方法将训练和测试文件导入笔记本,并保存在变量training_datatesting_data中。

我们使用shape方法来寻找数据集的大小。其结果是输出为(rows, columns)。训练数据集中有 7352 行和 563 列,测试数据集中有 2947 行和 563 列。我们必须确保数据集没有任何空值。我们使用isnull().values.any()来检查是否有单元格是空的。我们打印输出,看到输出是False,意味着没有空值。所以,我们可以继续。

我们可以使用head(5)方法来获得训练数据的前 5 行。我们看到有 563 列,最后一列为活动,它将作为我们的标签。在剩下的专栏中,subject 对于我们的机器学习应用程序没有特别的用途,因为我们想要探索活动,而不是谁执行了它。我们可以删除该列,剩下的 561 列将成为我们的功能。测试数据也是如此。

按照惯例,小写字母y充当标签集,大写字母X充当特征集。因此,这些名称是y_trainX_trainy_testX_test。我们将在机器学习分析中使用这些变量。

可视化数据集

处理数据的关键之一是确保所有类的大小大致相等。这是必不可少的,这样机器学习算法就不会偏向任何一个类。

让我们借助一个例子来理解这一点。比方说,数据集包含 30 项活动,其份额百分比各不相同。数据集包含 99%的活动 1 数据和 1%的其余活动数据。在这种情况下,机器学习将永远不会学习关于数据的任何模式。它会认为 100 个案例中有 99 个案例的活动是活动 1。因此,它将总是输出 Activity 1,而不考虑任何数据,并且仍然可以达到 99%的准确率。这种模型是不正确的,因此必须确保不同数据类别的份额大致相等。

我们首先在count_of_each_activity变量中获得每种类型活动的记录数。value_counts()给出计数,np.array将其转换成一个数组。计数按活动名称的字母顺序显示。

unique()y_train给了我们独特的价值观。我们必须对其进行排序,以便它们与上面收集的计数值保持一致。rcParams帮助我们为我们的图表定义某些样式。我们使用figure.figsize定义图形大小,使用font.size定义字体大小。

我们现在已经为饼图准备好了数据。pie()方法创建饼图。第一个参数是每个活动的计数,第二个参数是由labels表示的相应活动名称,第三个参数autopct计算每个活动的百分比。

Pie chart for share of each activity in dataset

观察上面的饼图,您可以看到每项活动的份额几乎相等。数据集的格式非常好,可以直接使用。

接下来,我观察 datatset 中的读数类型。如果您查看列标题,您会发现这些列要么有文本Acc来指代加速度计读数,要么有文本Gyro来指代陀螺仪值,要么两者都没有来指代所有其他值。

我首先遍历列名,检查它们是否包含“Acc”或“Gyro”。基于变量值,我使用pyplot子包的bar()方法绘制了一个条形图。第一个参数是 X 轴标签,第二个参数是 Y 轴值的数组,color参数分别为三个条形定义了颜色红色蓝色绿色。我再次为这个条形图定义了图形大小和字体大小。

Bar plot of column types

检查某项活动

为了更好地了解数据,我知道我必须看一看这些活动。因此,我决定尝试探索更多关于“站立”的活动。

这是我开始之前知道的所有信息:

  1. 该数据集具有 30 个人的活动记录,并且一些个人进行了站立活动。
  2. 收集到的数据会连续记录每个人,尤其是每个活动。这意味着任何给定活动的记录实际上都是时间序列。
  3. 每个记录中有许多特征,但是我不能一次包含所有的特征,因为这可能会使数据的理解更加困难。

根据我所掌握的信息,我决定绘制一个线图,显示在一段时间内执行站立活动的所有人的特征。我把这个特征作为 X 和平均重力之间的角度,除了由于人为误差造成的微小变化,这个角度应该保持不变。

“man standing on road” by Anthony Tori on Unsplash

我首先从数据集中选择所有“活动”标签为“站立”的行,并将其存储在standing_activity中。这里,我们必须确保我们重置了索引。这是必要的,因为当我们选择上面的行时,被删除的行确实被删除了,但是其余行的索引没有改变,它们不再是连续的。

为每个个体收集的数据是连续的时间序列,并以相同的速率记录。因此,每次主题改变时,我可以简单地从0开始为每个活动分配时间值。对于每个主题,持续活动记录将以时间值0开始,并以1递增,直到前一行的主题与当前行的主题相匹配。我将所有的时间序列存储在变量time_series中,并使用 pandas 方法DataFrame()将其转换为数据帧,然后存储在变量time_series_df中。最后,我使用 pandas concatenate()方法将记录和时间序列变量组合在一起。axis = 1告诉该方法组合两个数据帧,并将它们作为列追加。

np.zeros()创建一个由零组成的 numpy 数组,其大小等于括号内的数字。对于一个数据帧,如果我们在括号内分别使用01,在shape的末尾添加一个方括号有助于我们获得行或列。

现在,当数据准备好被绘制时,我使用 matplotlib 的cm子包通过rainbow方法获得一个颜色列表。

然后,我遍历standing_activity_df中的主题列表。我使用rcParams指定图形的大小。在绘图方法中,第一个参数是 X 轴值,在我们的例子中是Time列。第二列是 Y 轴值,所以我输入了angle(X, gravityMean)值。颜色在c中定义,主题编号设置为label,线条宽度在linewidth中设置为 4。然后,我指定绘图的 X 轴标签、Y 轴标签和标题。legend()方法在图上显示图例。

Angle between X and mean Gravity v/s Time graph

如果我们仔细观察图表,我们可以看到平均每条线在 0.2–0.3 值的最大范围之间转换。这确实是预期的行为,因为微小的变化可能是由微小的人为错误造成的。

将活动分类

现在是我们过程中的最后一步,实际使用机器学习算法并进行分类。

我们创建一个大小为 4 的零数组来存储每个算法的精度。我们将在创建条形图时使用它。

accuracy_scores = np.zeros(4)

每一个的过程都是一样的,因为我将使用各种参数的默认值。让我们借助支持向量分类器来理解一下。首先,我把算法的名字写成 imported SVC()。随后是fit()方法,该方法根据提供的数据对算法进行建模。我输入参数作为训练数据,因此,X_trainy_train

接下来,我使用predict()方法预测测试数据X_test的输出,并将其存储在prediction变量中。然后我使用accuracy_score函数来计算精度,它将第一个参数作为真值,第二个参数作为预测值。我把它乘以 100 转换成百分比。我们对每个算法都执行相同的步骤。

从上面的输出值可以看出,逻辑回归算法表现最好,准确率超过 96%。我们也可以将输出可视化为条形图。

Classifiers accuracy bars

结论

在本文中,我讨论了活动识别,从数据集绘制了可视化效果,并使用机器学习算法对活动进行分类。从结果来看, Logistic 回归的准确率最高。

我希望你喜欢我的作品。从未来的角度来看,您可以尝试其他算法,或者选择不同的参数值来进一步提高精度。请随时分享你的想法和想法。

利用 Catboost 和 LightGBM 进行广告需求预测

原文:https://towardsdatascience.com/ad-demand-forecast-with-catboost-lightgbm-819e5073cd3e?source=collection_archive---------11-----------------------

Photo credit: Pixabay

预测在线分类广告的需求,特征工程

Avito.ru 是一个俄罗斯分类广告网站,有出售一般商品、工作、房地产、个人、出售汽车和服务等板块。

它是俄罗斯最受欢迎的分类广告网站,也是仅次于 Craigslist 和中国网站 58.com 的世界第三大分类广告网站。2016 年 12 月,它的独立月访问量超过 3500 万。平均而言,Avito.ru 的用户每天发布超过 500,000 条新广告,整体广告约为 3,000 万个活跃列表。

我们希望帮助 Avito.ru 根据在线广告的特征(如类别、标题、图像、上下文(发布的地理位置)以及在类似上下文中对类似广告的历史需求)来预测对在线广告的需求。有了这些信息,Avito 可以通知卖家如何最好地优化他们的列表,并提供一些他们实际上应该期望收到多少兴趣的指示。

数据

训练数据包含以下特征:

  • item_id -广告 id。
  • user_id -用户 id。
  • region——公元地区。
  • city - Ad 城。
  • parent_category_name-Avito 广告模型分类的顶级广告类别。
  • category_name-Avito 广告模型分类的精细颗粒广告类别。
  • 【Avito 广告模型的可选参数。
  • 【Avito 广告模型的可选参数。
  • 【Avito 广告模型的可选参数。
  • title -广告标题。
  • description -广告描述。
  • price -广告价格。
  • item_seq_number -用户的广告序列号。
  • activation_date -投放广告的日期。
  • user_type -用户类型。
  • image -图像的 Id 代码。绑定到 train_jpg 中的 jpg 文件。不是每个广告都有图像。
  • image_top_1 - Avito 对图像的分类代码。
  • deal_probability -目标变量。这是一个广告实际卖出东西的可能性。这个特性的值可以是从零到一的任意浮点数。
df = pd.read_csv('train_avito.csv', parse_dates = ['activation_date'])
df.head()

Figure 1

由于deal_probability是我们的目标变量,我们想更详细地研究它。

import seaborn as sns
import matplotlib.pyplot as plt
pd.set_option('display.float_format', '{:.2f}'.format)
plt.figure(figsize = (10, 4))
n, bins, patches = plt.hist(df['deal_probability'], 100, facecolor='blue', alpha=0.75)
plt.xlabel('Ad price')
plt.xlim(0, 1)
plt.title('Histogram of deal probability')
plt.show();

Figure 2

plt.figure(figsize = (10, 4))
plt.scatter(range(df.shape[0]), np.sort(df['deal_probability'].values))
plt.xlabel('index')
plt.ylabel('deal probability')
plt.title("Deal Probability Distribution")
plt.show();

Figure 3

几乎一百万个广告的概率为 0,这意味着它没有卖出任何东西,很少有广告的概率为 1,这意味着它确实卖出了一些东西。其他广告的概率在 0 到 1 之间。

CatBoost

由 Yandex 研究人员和工程师开发的 CatBoost 是一种在决策树上使用梯度推进的机器学习算法。它是一个开源库。听了很多关于 CatBoost 的好东西,我们应该试一试。

特征工程

缺失值

以下是要素中缺失值的数量。

null_value_stats = df.isnull().sum()
null_value_stats[null_value_stats != 0]

Figure 4

我们决定用-999 来填充这些缺失值,通过从它们的分布中填充缺失值,模型将能够很容易地区分它们并将其考虑在内。

df.fillna(-999, inplace=True)

日期时间特征

在删除此列之前,我们使用原始的activation_date列创建了几个新的日期时间特性。

df['year'] = df['activation_date'].dt.year
df['day_of_year'] = df['activation_date'].dt.dayofyear
df['weekday'] = f['activation_date'].dt.weekday
df['week_of_year'] = df['activation_date'].dt.week
df['day_of_month'] = df['activation_date'].dt.day
df['quarter'] = df['activation_date'].dt.quarterdf.drop('activation_date', axis=1, inplace=True)

我们的特征有不同的类型——一些是数字的,一些是分类的,还有一些是文本的,比如titledescription,我们可以把这些文本特征当作分类特征。

categorical = ['item_id', 'user_id', 'region', 'city', 'parent_category_name', 'category_name', 'param_1', 'param_2', 'param_3', 'title', 'description', 'item_seq_number', 'user_type', 'image', 'image_top_1']

我们不需要对分类特征进行编码。CatBoost 支持数字和分类特征。然而,我们确实需要确定分类特征指数。

X = df.drop('deal_probability', axis=1)
y = df.deal_probabilitydef column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols, query_cols, sorter=sidx)]categorical_features_indices = column_index(X, categorical)

CatBoost 模型训练

X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42)model=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')
model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_valid, y_valid),plot=True);

Figure 6

一个基本模型给出了一个公平的解决方案,训练和测试误差几乎是同步的。我们将尝试调整模型参数和功能来改善结果。

CatBoost 模型调整

  • iterations是解决机器学习问题时可以建立的最大树数。
  • learning_rate用于减少梯度步长。
  • depth是树的深度。使用 CPU 时,最大为 16 的任何整数。
  • 我们用公制计算 RMSE。
  • bagging_temperature定义贝叶斯自举的设置,值越高,装袋越积极。我们不希望它太高。
  • 我们将使用过拟合检测器,因此,如果发生过拟合,CatBoost 可以在训练参数指示之前停止训练。过拟合检测器的类型是“Iter”。
  • metric_period是计算目标和指标值的迭代频率。
  • od_wait,认为模型过拟合,从具有最优度量值的迭代开始,在指定的迭代次数(100)后停止训练。
  • eval_set是用于过拟合检测器、最佳迭代选择和监控指标变化的验证数据集。
  • use_best_model=True如果输入了一个验证集(定义了eval_set参数),并且该集中至少有一个对象的标签值与其他不同。

CatBoost.py

Figure 7

CatBoost 功能重要性

fea_imp = pd.DataFrame({'imp': model.feature_importances_, 'col': X.columns})
fea_imp = fea_imp.sort_values(['imp', 'col'], ascending=[True, False]).iloc[-30:]
fea_imp.plot(kind='barh', x='col', y='imp', figsize=(10, 7), legend=None)
plt.title('CatBoost - Feature Importance')
plt.ylabel('Features')
plt.xlabel('Importance');

Figure 8

CatBoost 功能重要性排名的结果显示,属性“价格”对交易概率的影响最大。另一方面,日期时间特征对交易概率的影响很小。

LightGBM

LightGBM 是一个基于决策树算法的快速、分布式、高性能梯度提升框架。它隶属于微软的 DMTK 项目。

我们将训练一个 LightGBM 模型来预测交易概率。我们将经历与训练 CatBoost 模型时相似的特征工程过程,此外,我们还将对分类特征进行编码。

特征工程

lightGBM_feature_engineering.py

将数据转换为 LightGBM 数据集格式。这是 LightGBM 培训的必修内容。

X_train, X_valid, y_train, y_valid = train_test_split(
    X, y, test_size=0.25, random_state=42)

# LightGBM dataset formatting 
lgtrain = lgb.Dataset(X_train, y_train,
                feature_name=feature_names,
                categorical_feature = categorical)
lgvalid = lgb.Dataset(X_valid, y_valid,
                feature_name=feature_names,
                categorical_feature = categorical)

LightGBM 模型训练

  • num_leaves是控制树模型复杂度的主要参数。当试图调整num_leaves时,我们应该让它小于2^(max_depth) (225)。
  • 我们使用max_depth来限制深树的生长。
  • 为了更精确,我们用大的num_iterations代替小的learning_rate
  • 为了加快训练速度和处理过拟合,我们设置了feature_fraction=0.6,即在训练每棵树之前选择 60%的特征。
  • Set verbosity = -1,eval set 上的 eval metric 在每个详细增强阶段打印。
  • early_stopping_rounds = 500,模型将进行训练,直到验证分数停止提高。验证分数需要至少每 500 轮提高一次才能继续训练。
  • verbose_eval = 500,每 500 个升压阶段打印一个评估指标。

lightGBM_model_training.py

Figure 8

LightGBM 功能重要性

fig, ax = plt.subplots(figsize=(10, 7))
lgb.plot_importance(lgb_clf, max_num_features=30, ax=ax)
plt.title("LightGBM - Feature Importance");

Figure 9

看到价格仍然处于最高水平并不奇怪。有趣的是,在 lightGBM 模型中,item_seq_number对交易概率的影响最大,但在 CatBoost 模型中,它仅是第 12 个特征。

今天就到这里, Jupyter 笔记本可以在 Github 上找到。新年快乐

参考:卡格尔

傻瓜 Adaboost:将数学(及其方程)分解成简单的术语

原文:https://towardsdatascience.com/adaboost-for-dummies-breaking-down-the-math-and-its-equations-into-simple-terms-87f439757dcf?source=collection_archive---------2-----------------------

Learning machines is a long walk up the stairs. But we can shorten the path. (Photo by Gabriel Izgi on Unsplash)

Adaboost 是 Adaptive Boosting 的缩写,是一种机器学习方法,在概念上容易理解,但在数学上不太容易掌握。部分原因是由于方程和公式没有被分解成简单的术语,用基本的数学作为方程的演示。本文旨在通过 Adaboost 实现这一目标,将数据科学领域的新手作为主要目标受众。

有许多精彩的讲座、视频和论文有效而简洁地解释了 Adaboost 背后的概念。简而言之,这种想法是为分类器和数据点(样本)设置权重,迫使分类器专注于难以正确分类的观察值。该过程按顺序完成,因为随着算法迭代的进行,在每一步都调整两个权重。这就是 Adaboost 被称为顺序集成方法的原因——集成是指一种结合几个模型以提高最终预测性能的学习类型。

这一概念很容易理解,但是一旦我们试图更深入地理解支持这一概念的数学,我们就会面对许多具有类似景象的文章和讲座:

对于那些没有数学学术背景的人和/或非数学类型的人来说,随着最近的机器学习热潮,现在正在学习数据科学,光是符号就显得非常令人生畏。本文旨在通过分解符号和公式,并使用简单的数学来解释 Adaboost 的工作原理,从而消除混淆和恐惧。

基本术语

首先,让我们复习一些基本术语。

增强:结合许多弱(简单)学习者来创建高度准确的预测。

弱学习者:产生比随机猜测略好的预测的分类器。随机猜测相当于 50%,像抛硬币一样。熟悉信息论,尤其是香农熵概念的人对此会很熟悉。

假设:我们的分类器,也就是我们的机器学习算法用来逼近未知函数的函数,目标(真实)函数,它模拟输入值 x 和输出值 y 之间的关系。

Adaboost:第一个实用的 boosting 算法,由 Freund 和 Schapire (1995)发明。它基于 Vapnik 和 Chervonekis 的想法,即一个经过训练的分类器要在其预测中有效和准确,它应该满足以下三个条件:

1)应该在“足够”的训练样本上训练分类器

2)它应该通过产生低训练误差来提供对这些例子的良好拟合

3)它应该简单(因为简单的模型比过于复杂的模型更好)

解释 Adaboost,一步一步来

让我们回顾一下迭代公式,将每一步的每一个符号分解成一个粒度级别,以便于理解。

1) 给定(x1,y1),…..,(x_m,y_m)其中 x_i ∈ X,y_i ∈ {-1,+1}

有用的符号

∑:"元素"

{}:设置

ex: 如果 A = {1,2,3,7},2 ∈ A

(x_1,y_1):第一个训练样本,(x_m,y_m) =第 m 个训练样本

既然我们已经记下了所有的符号,我们可以将公式的第一部分读作:

“给定包含 m 个样本的训练集,其中所有 X 个输入是总集 X 的元素,y 个输出是仅包含两个值的集的元素,-1(负类)和 1(正类)…”

2)初始化:对于 i = 1,…,m,D1(I)= 1/m

这里,D =样本的权重,i =第 I 个训练样本。在其他论文中,D 将被写成 w。因此,下一个语句是:

“…将样本的所有权重初始化为 1 除以训练样本数…”

3)对于 t=1,…,T:

*使用分布式 Dt 训练弱学习者。

*得到弱假设 h_t: X -> {-1,+1}

*目标:选择加权误差低的 h_t:

ε = Pr_i~Dt [h_t(xi)不等于 y_i]

*选择α_t = 1/2 * ln(1-ε / ε)

*更新,对于 i = 1,…,m:

Dt+1(I)= Dt(I)exp(-αt * y _ I * h _ t(x _ I)/Zt

有用的符号

Pr =概率

假设/分类器

ε =模型的最小错误分类误差

α =分类器的重量

exp =欧拉方程 e: 2.71828

Zt =归一化因子,用于确保权重代表真实分布

有了这些符号,我们可以阅读下一部分:

对于 t=1 到 T 个分类器,使其适合训练数据(其中每个预测为-1 或 1),并选择加权分类错误最低的分类器

正式计算 ε 的公式如下:

让我们来分解这个特定的模型。

有用的符号

σ=总和

如果分类错误,y_i 不等于 h_j = 1,如果分类正确,y _ I 不等于 0

重量指数=重量

因此,公式为:“误差等于错误分类率的总和,其中训练样本 I 和 y_i 的权重不等于我们的预测 h_j(如果错误分类,则等于 1,如果正确分类,则等于 0)。”

让我们用简单的数学来理解这个公式。假设有 4 个不同的样本,权重分别为 0.5、0.2、0.1 和 0.04。想象一下,我们的分类器 h 预测值为 1,1,-1 和-1,但实际输出值 y 为-1,1,-1,1。

预测时间:1 1 月 1 日

实际值:-1 1 -1 1

重量:0.5 0.2 0.1 0.04

1 或 0: 1 0 0 1

这导致错误分类率的以下计算:

误分类率/误差=(0.5 * 1+0.2 * 0+0.1 * 0+0.04 * 1)/(0.5+0.2+0.1+0.04)

误差= 0.64285714285

接下来,通过公式 1/2 * ln(1- error / error)为分类器选择权重α。

在这里,简单的数学可能比语言解释得更清楚。例如,假设我们有 0.30,0.70,0.5 的误差。

我们的分类器权重计算如下:

ε = 0.3

α = 1/2 * ln(1- 0.3 / 0.3) = 0.42365

ε = 0.7

α = 1/2 * ln(1- 0.7 / 0.7) = -0.42365

ε = 0.5

α = 1/2 * ln(1- 0.5 / 0.5) = 0

注意三个有趣的观察结果:1)准确度高于 50%的分类器导致该分类器的正权重(换句话说,如果ε < = 0.5) ,则 α >为 0),2)准确度为 50%的分类器为 0,因此对最终预测没有贡献,以及 3)误差 0.3 和 0.7 导致符号相反的分类器权重。

现在是等式中非常重要的部分:更新每个样本的权重。我在上面提到过,更新的重点是迫使分类器专注于难以正确分类的观察值。这是通过在迭代后用增加的权重更新错误分类的案例来实现的。增加权重将使我们的学习算法在下一次迭代中更加关注这些观察结果。相反,在下一次迭代中,正确分类的案例将接收到降低的权重,并减少我们的分类器的注意力。

再一次,用简单的数字作为示范,信息吸收是没有痛苦的。让我们用上面 0.3 的误差率代入公式。请记住,我们正在寻找低加权误差。换句话说,我们不应该使用 0.5 及以上的错误率。在低错误率的情况下,让我们检查当案例被错误分类时和当案例被正确分类时会发生什么。

misclassified

correctly classified

现在你知道了!在不正确分类的情况下,exp 项变得大于 1,而在正确分类的情况下,exp 项变得小于 1。因此,不正确的分类将获得更高的权重,促使我们的分类器在下一次迭代中更加关注它们,而正确分类的相反情况将导致相反的结果。

我们继续这种迭代,直到 a)实现低训练误差,或者 b)已经添加了预设数量的弱学习者(这是在我们控制之下的参数)。然后,我们通过将每个分类器的加权预测相加得到最终预测。

摘要

我们已经看到了 Adaboost 是如何通过分解公式中的每一个符号在粒度级别上工作的。然后,我们应用简单的数学来理解公式的每个组成部分是如何工作的。这种通过分解的部分来处理公式的实践对于理解机器学习算法是一种有用的实践。

Adam——深度学习优化的最新趋势。

原文:https://towardsdatascience.com/adam-latest-trends-in-deep-learning-optimization-6be9a291375c?source=collection_archive---------1-----------------------

Adam 1是一种自适应学习率优化算法,专门为训练深度神经网络而设计。Adam 于 2014 年首次发布,在深度学习实践者的一个非常著名的会议上亮相— ICLR 2015 。该论文包含一些非常有前途的图表,显示了在训练速度方面的巨大性能增益。然而,过了一段时间,人们开始注意到,在某些情况下,亚当实际上找到了比随机梯度下降更差的解决方案。已经做了很多研究来解决亚当的问题。

该算法利用自适应学习速率方法的能力来为每个参数找到单独的学习速率。它还具有 Adagrad [10]和 RMSprop [11]的优点,Adagrad[10]在具有稀疏梯度的设置中工作得非常好,但在神经网络的非凸优化中很困难,rms prop[11]解决了 Adagrad 的一些问题,并且在在线设置中工作得非常好。根据Andrej Karpathy的文章《机器学习趋势一瞥】, Adam 的受欢迎程度呈指数增长。

在这篇文章中,我首先介绍了在原始论文中提出的 Adam 算法,然后介绍了围绕它的最新研究,展示了这些算法在某些领域不如经典 SGD 的一些潜在原因,并提供了几种解决方案,缩小了 SGD 和 Adam 之间的差距。

圣经》和《古兰经》传统中)亚当(人类第一人的名字

Adam 可以看作是 RMSprop 和带动量的随机梯度下降的组合。它使用平方梯度来缩放学习速率,如 RMSprop,并通过使用梯度的移动平均值而不是梯度本身来利用动量,如 SGD 使用动量。让我们仔细看看它是如何工作的。

Adam 是一种自适应学习率方法,这意味着它计算不同参数的个人学习率。它的名字来源于自适应矩估计,之所以这么叫是因为 Adam 使用梯度的一阶和二阶矩的估计来适应神经网络的每个权重的学习速率。现在,什么是瞬间?随机变量的 n 阶矩定义为该变量的期望值的 n 次方。更正式地说:

m — moment, X -random variable.

第一次理解这个想法可能相当困难,所以如果你不能完全理解,你仍然应该继续,你将能够理解算法是如何工作的。注意,神经网络成本函数的梯度可以被认为是随机变量,因为它通常在一些小的随机批数据上评估。一阶矩是均值,二阶矩是无中心方差(意思是我们在方差计算的时候不减去均值)。我们稍后会看到如何使用这些值,现在,我们必须决定如何得到它们。为了估计力矩,Adam 利用指数移动平均值,根据当前小批量评估的梯度进行计算:

Moving averages of gradient and squared gradient.

其中,m 和 v 是移动平均值,g 是当前小批量的梯度,β是新引入的算法超参数。它们分别有非常好的默认值 0.9 和 0.999。几乎没有人会改变这些价值观。移动平均的向量在第一次迭代时被初始化为零。

要了解这些值如何与第一个等式中定义的时刻相关,让我们看看移动平均线的预期值。由于 m 和 v 是一阶矩和二阶矩的估计值,我们希望具有以下性质:

估计量的期望值应该等于我们试图估计的参数,碰巧的是,在我们的例子中,参数也是期望值。如果这些性质成立,这将意味着,我们有无偏估计量。(要了解更多关于不同估计量的统计特性,请参考伊恩·古德费勒的深度学习书籍,第 5 章关于机器学习基础知识)。现在,我们将看到这些对我们的移动平均线不成立。因为我们用零初始化平均值,所以估计量偏向于零。让我们证明对于 m(对于 v 的证明是类似的)。为了证明这一点,我们需要用公式计算 m 的第一个梯度。让我们尝试展开 m 的几个值,看看我们要使用的模式:

正如你所看到的,我们把 m 的值扩大得越多,梯度的第一个值对整体值的贡献就越小,因为它们会乘以越来越小的β。捕捉到这种模式,我们可以改写均线的公式:

现在,让我们看看 m 的期望值,看看它与真正的一阶矩有什么关系,这样我们就可以校正两者的差异:

Bias correction for the first momentum estimator

在第一行中,我们使用移动平均的新公式来展开 m。接下来,我们用 g[t]来近似 g[i]。现在我们可以把它从 sum 中取出来,因为它现在不依赖于 I,因为正在进行逼近,所以误差 C 出现在公式中。在最后一行中,我们只使用了有限几何级数求和的公式。从这个等式中我们应该注意两件事。

  1. 我们有偏倚的估计量。这不仅仅适用于 Adam,同样适用于算法,使用移动平均线(SGD with momentum,RMSprop 等)。).
  2. 除非是训练的乞求,否则不会有太大的作用,因为β的 t 次方的值很快就趋向于零。

现在我们需要修正估计量,使期望值是我们想要的。这一步通常被称为偏差校正。我们的估计量的最终公式如下:

Bias corrected estimators for the first and second moments.

剩下要做的唯一事情就是使用这些移动平均值来分别衡量每个参数的学习率。在 Adam 中完成的方式非常简单,要执行权重更新,我们执行以下操作:

其中 w 是模型权重,eta(看起来像字母 n)是步长(它可以取决于迭代)。就这样,这就是亚当的更新规则。对于一些人来说,用代码来理解这些概念可能更容易,所以下面是 Adam 在 python 中的可能实现:

在 Adam 上有两个小的变化,我在实践中没有看到太多,但它们在主要的深度学习框架中实现了,所以有必要简要地提到它们。

第一个名为 Adamax 是 Adam 的作者在同一篇论文中介绍的。Adamax 的想法是将值 v 视为单个当前和过去梯度的 L2 范数。我们可以将其推广到 Lp 更新规则,但对于 p 的大值,它会变得非常不稳定。但如果我们使用L-无穷范数的特例,它会产生一个令人惊讶的稳定且性能良好的算法。以下是如何用 python 实现 Adamax:

第二个有点难懂,叫做那达慕【6】。《那达慕》由蒂莫西·多扎特在《将内斯特罗夫的动力融入亚当》一文中发表。顾名思义,这个想法是用内斯特罗夫动量项来表示第一条移动平均线。让我们来看看 SGD 的更新规则:

SGD with momentum update rule

如上图,更新规则相当于在动量向量方向上走一步,然后在梯度方向上走一步。但是动量步长不依赖于当前的梯度,所以在计算梯度之前,我们可以通过用动量步长更新参数来获得更高质量的梯度步长方向。为此,我们对更新进行了如下修改:

f — loss function to optimize.

所以,对于内斯特罗夫加速动量,我们首先在之前累积的梯度方向上做一个大的跳跃,然后测量我们结束的梯度,做一个修正。从 cs231n 的课堂笔记中可以看到一个很好的形象化的例子:

sourec: cs231n lecture notes.

同样的方法可以纳入亚当,通过改变第一移动平均线到内斯特罗夫加速动量。这里可以应用一个计算技巧:代替更新参数以产生动量步长并再次变回来,我们可以通过仅应用时间步长 t + 1 的动量步长一次来实现相同的效果,在先前时间步长 t 而不是 t + 1 的更新期间。使用此技巧,Nadam 的实现可能如下所示:

亚当的属性

这里我列出了亚当的一些特性,为了证明这些特性是正确的,请参考这篇论文。

  1. Adam 在每次迭代中采用的实际步长近似受限于步长超参数。这一特性增加了对先前非直观学习率超参数的直观理解。
  2. Adam 更新规则的步长对于梯度的大小是不变的,这在穿过具有微小梯度的区域(例如鞍点或峡谷)时很有帮助。在这些领域,SGD 很难快速浏览。
  3. Adam 的设计结合了 Adagrad 和 RMSprop 的优点,前者适用于稀疏渐变,后者适用于在线设置。拥有这两者使我们能够将 Adam 用于更广泛的任务。Adam 也可以看做是 RMSprop 和 SGD 与 momentum 的结合。

亚当的问题

当亚当第一次被介绍时,人们对它的力量感到非常兴奋。论文中包含了一些非常乐观的图表,显示了在训练速度方面取得的巨大成绩:

source: original Adam paper

然后,Nadam paper 展示了显示更好结果的图表:

source: Nadam paper

然而,过了一段时间后,人们开始注意到,尽管训练时间很长,但 Adam 在一些领域并没有收敛到最优解,因此对于一些任务(如在流行的 CIFAR 数据集上的图像分类),最先进的结果仍然只能通过应用 SGD with momentum 来实现。不止是威尔逊等人。al [9]在他们的论文“自适应梯度方法在机器学习中的边际价值”中表明,当在一组不同的深度学习任务上进行测试时,自适应方法(如亚当或阿达德尔塔)的泛化能力不如 SGD,这阻碍了人们使用流行的优化算法。自那以后,人们做了大量的研究来分析 Adam 的不良概括,试图让它缩小与 SGD 的差距。

Nitish Shirish Keskar 和 Richard Socher 在他们的论文“通过从 Adam 切换到 SGD 来提高泛化性能”[5]中也表明,通过在训练期间切换到 SGD,他们能够获得比单独使用 Adam 更好的泛化能力。他们提出了一个简单的解决方案,使用了一个非常简单的想法。他们已经注意到,在训练的早期阶段,亚当仍然比 SGD 表现更好,但后来学习饱和了。他们提出了一个简单的策略,他们称之为 SWATS ,其中他们开始用 Adam 训练深度神经网络,但当某些标准达到时,就切换到 SGD。他们成功取得了与 SGD 相当的成绩。

论亚当的收敛性

找出 Adam 的问题在于分析它的收敛性。作者在他们最初的论文中证明了 Adam 在凸集上收敛到全局最小值,然而,后来几篇论文发现他们的证明包含一些错误。Block et。al [7]声称他们在最初的收敛分析中发现了错误,但仍然证明了该算法收敛,并在他们的论文中提供了证明。谷歌员工最近的另一篇文章在 ICLR 2018 上发表,甚至获得了最佳论文奖。为了深入他们的论文,我应该首先描述 Adam 作者用来证明它收敛于凸函数的框架。

2003 年 Martin Zinkevich 介绍了在线凸规划问题[8]。在所呈现的设置中,我们有一系列凸函数 c1、c2 等(在深度学习优化的情况下,在第 I 个小批量中执行的损失函数)。在每个时间戳 t 中解决问题(Adam)的算法选择点 xt,然后接收当前时间戳的损失函数 c。这种设置转化为许多现实世界的问题,例如阅读论文的介绍。为了理解算法工作得有多好,T 轮后算法的后悔值定义如下:

Regret of the algorithm in the online convex programming

其中 R 是遗憾,c 是关于第 t 个小批量的损失函数,w 是模型参数(权重)的向量,w 星是权重向量的最优值。我们的目标是证明算法的后悔是 R(T) = O(T)或更小,这意味着平均起来模型收敛到一个最优解。Martin Zinkevich 在他的论文中使用凸函数的性质证明了梯度下降在这种情况下收敛到最优解:

Well-known property of convex functions.

相同的方法和框架使用 Adam 作者来证明他们的算法收敛到最优解。Reddi 等人[3]在他们的证明中发现了几个错误,主要错误出现在 Adam 和 Improving Adam 的收敛证明论文中:

其中 V 被定义为一个抽象函数,它对每个算法不同的参数的学习速率进行缩放。对于 Adam,它是过去平方梯度的移动平均值,对于 Adagrad,它是所有过去和当前梯度的总和,对于 SGD,它只是 1。作者发现,为了证明有效,这个值必须是正的。很容易看出,对于 SGD 和 Adagrad,它总是正的,然而,对于 Adam(或 RMSprop),V 的值可以出乎意料地起作用。他们还提出了一个亚当未能收敛的例子:

Adam fails on this sequence

对于这个序列,很容易看出最优解是 x = -1,然而,作者如何显示,亚当收敛到 x = 1 的高度次优值。该算法每 3 步获得一次大的梯度 C,而在另外 2 步中,它观察梯度-1,这使算法朝错误的方向移动。由于步长值通常会随着时间的推移而减小,因此他们提出了保持最大值 V 的解决方案,并使用它来代替移动平均值来更新参数。由此产生的算法被称为 Amsgrad。我们可以用这个我创作的小本子来证实他们的实验,它展示了不同的算法收敛于上面定义的函数序列。

Amsgrad without bias correction

它对现实世界数据的实际应用有多大帮助?可悲的是,我还没有看到一个案例比亚当更有助于获得更好的结果。在的 Filip Korzeniowski 在他的帖子中描述了 Amsgrad 的实验,该实验显示了与 Adam 相似的结果。西尔万·古格和杰瑞米·霍华德在他们的文章中显示,在他们的实验中,Amsgrad 实际上比亚当表现得更差。该论文的一些评论者还指出,问题可能不在于 Adam 本身,而在于我在上面描述的用于收敛分析的框架,该框架不允许太多的超参数调整。

亚当的体重下降

Ilya Loshchilov 和 Frank Hutter 的论文“修正 Adam 中的权重衰减正则化”[4]实际上对 Adam 有帮助。这篇论文包含了很多对亚当和体重衰减的贡献和见解。首先,他们表明,尽管普遍认为 L2 正则化不同于权重衰减,尽管它对于随机梯度下降是等价的。1988 年引入重量衰减的方式是:

其中 lambda 是要调整的权重衰减超参数。我稍微改变了一下符号,以便和文章的其余部分保持一致。如上所述,当进行权重更新时,权重衰减应用于最后一步,惩罚大的权重。SGD 的传统实现方式是通过 L2 正则化,我们修改成本函数以包含权重向量的 L2 范数:

历史上,随机梯度下降方法继承了这种实现权重衰减正则化的方式,Adam 也是如此。然而,L2 正则化并不等同于亚当的权重衰减。当使用 L2 正则化时,我们用于大权重的罚值通过过去和当前平方梯度的移动平均来缩放,因此具有大的典型梯度幅度的权重通过比其他权重更小的相对量来正则化。相比之下,权重衰减通过相同的因子来调整所有权重。要对 Adam 使用权重衰减,我们需要修改更新规则,如下所示:

Adam update rule with weight decay

已经显示了这些类型的正则化对于 Adam 是不同的,作者继续显示了它们的工作情况。论文中的图表很好地显示了结果的差异:

The Top-1 test error of ResNet on CIFAR-10 measured after 100 epochs

这些图表显示了学习率和正则化方法之间的关系。颜色代表这对超参数的测试误差的高低。正如我们在上面可以看到的,不仅 Adam 与重量衰减得到更低的测试误差,它实际上有助于解耦学习率和正则化超参数。在左图中,我们可以看到,如果我们改变参数,比如学习率,那么为了再次达到最佳点,我们还需要改变 L2 因子,这表明这两个参数是相互依赖的。这种依赖性导致超参数调整有时是一项非常困难的任务。在右图中,我们可以看到,只要我们保持在某个参数的最佳值范围内,我们就可以独立地改变另一个参数。

该论文作者的另一项贡献表明,用于权重衰减的最佳值实际上取决于训练期间的迭代次数。为了解决这个问题,他们提出了一个简单的自适应公式来设置重量衰减:

其中 B 是批量大小,B 是每个时期的训练点总数,T 是时期总数。这将使用新的 lambda 归一化参数来替换 lambda 超参数 lambda。

作者甚至没有就此停止,在修复体重衰减后,他们试图将学习率计划与新版 Adam 的热重启一起应用。热重启对随机梯度下降有很大帮助,我在我的帖子中谈到了更多关于提高学习率的方法。但是之前亚当落后 SGD 很多。随着新的体重下降,亚当在重新开始时取得了更好的成绩,但仍然不如 SGDR。

第二代亚当

张等人提出了另一种修正亚当的尝试,这种尝试我在实践中并不多见。al 在他们的论文“规范化的方向保持亚当”[2]。这篇论文注意到了 Adam 的两个问题,这两个问题可能会导致更糟糕的概括:

  1. SGD 的更新存在于历史梯度的跨度中,而 Adam 则不是这样。在已经提到的论文[9]中也观察到了这种差异。
  2. 第二,虽然 Adam 参数更新的幅度对于梯度的缩放是不变的,但是更新对同一整体网络函数的影响仍然随着参数的幅度而变化。

为了解决这些问题,作者提出了他们称之为规范化方向保持亚当的算法。算法以下列方式调整亚当。首先,不是估计每个单独参数的平均梯度幅度,而是估计梯度向量的平均平方 L2 范数。因为现在 V 是标量值,M 是与 W 方向相同的向量,所以更新的方向是 M 的负方向,因此在 W 的历史梯度的跨度内。对于第二种情况,在使用梯度之前,算法将其投影到单位球上,然后在更新之后,权重通过它们的范数被归一化。更多细节请关注他们的论文。

结论

Adam 绝对是深度学习的最佳优化算法之一,其受欢迎程度增长非常快。虽然人们已经注意到在某些领域使用 Adam 的一些问题,但研究人员仍在继续努力寻找解决方案,使 Adam 的结果与 SGD 的结果不相上下。

参考

  1. 迪德里克·p·金马和吉米·巴雷。亚当:一种随机优化的方法。2014.arXiv:1412.6980v9
  2. 张子君等人归一化保向亚当。2017.arXiv:1709.04546v2
  3. 萨尚克·雷迪,萨延·卡莱,桑基夫·库马尔。论亚当的趋同与超越。2018.
  4. 伊利亚·洛希洛夫,弗兰克·赫特。修正 Adam 中的权重衰减正则化。2017.arXiv:1711.05101v2
  5. 尼提什·希里什·凯斯卡尔,理查德·索彻。通过从 Adam 切换到 SGD 来提高泛化性能。2017 arXiv:1712.07628v1
  6. 蒂莫西·多扎特。将内斯特罗夫的动力融入亚当。2016.
  7. 塞巴斯蒂安·博克,约瑟夫·戈波尔德,马丁·韦奥。ADAM 优化器收敛证明的改进。2018.arXiv:1804.10587v1
  8. 马丁·津克维奇。在线凸规划和广义无穷小梯度上升。2003.
  9. 阿希娅·c·威尔逊,丽贝卡·鲁洛夫斯,米切尔·斯特恩,内森·斯雷布罗,本杰明·雷希特。机器学习中自适应梯度方法的边际价值。2017.arXiv:1705.08292v2
  10. 约翰·杜奇,埃拉德·哈赞,约拉姆·辛格。在线学习和随机优化的自适应次梯度方法。机器学习研究杂志,12:2121–2159,2011。
  11. 提门·提勒曼和杰弗里·辛顿。讲座 6.5-rmsprop: 将梯度除以其最近震级的移动平均值。COURSERA:用于机器学习的神经网络,4(2):26–31,2012。

坚定不移。

原文:https://towardsdatascience.com/adamant-3d87e8d98b83?source=collection_archive---------6-----------------------

又见面了。我的互联网昨天莫名其妙地出了问题,我没有机会写一点我的一个启示!在过去的几天里,我一直在为这个项目收集数据,我发现了一种使用预测分析的新方法。这对我来说不一定是新的,但有时当你开始做一个项目时,你可以如此坚定地坚持一种方式,以至于你忘记了一个项目有许多角度需要解决。

以上是一个片段 CSV 文件,我创建了包括每个场馆的功能。目前,我们正在试验每项功能,以及它们预测客户偏好的能力。回到启示,在过去的几天里,我一直在从每个场馆的网站和每个不同的社交媒体页面提取信息(客户评论、评级和评论)。一些特征是你的典型特征——场地类型、氛围、菜单风格、位置等等——但后来我决定找点乐子。

神奇宝贝

我的第一个“为了好玩”的测试是在附近的 Pok 和 mon stops 和顾客去那个地方的可能性之间的相关性。它可能有也可能没有任何显著的相关性或商业价值,但是,如果这个特性吸引客户的可能性微乎其微,我会测试一下。我知道我又要遵循统计学的黄金法则"相关性并不意味着因果关系,"然而,这是一个有趣的项目,如果它带回了任何有价值的东西,我会与你们所有人分享(我想我刚刚打破了另一条黄金法则…得克萨斯州的规则是说 ya 'll 而不是 you all…whatev)。

相似性测试

好了,回到正题。因此,对于我给定的集合,我将执行余弦相似性/相似性分析测试(类似于亚马逊和网飞向我们推荐类似产品的做法)。然而,在我开始之前,我必须扩展我的数据集,包括那些还没有被访问过的场馆,以便创建一个排名系统,并查看哪些企业在与已经签约的场馆的相似性方面排名最佳。

机器学习

我最初的方法是使用离散变量对不同的场馆进行分类——签约的和未签约的——然后检查这是否是一个很好的预测器/指示器,如果一个场馆是否会与in choices 做生意。

学校的领导团队有一个理论,强大的社交媒体存在等同于理想的工作场所;给出这些信息后,我还会运行一个逻辑回归(LogReg)来测试这个假设的有效性。我已经将我的数据集按照已经签约的和潜在的地点(我的训练和测试数据集)进行了划分。从那里开始,我将在训练集上使用我与社交媒体相关的功能,并计算酒吧是否会签名。

网页抓取

网络抓取将允许我提取评论并建立一个文本分析器,以真正了解客户体验并区分每个场馆的优势。我使用图书馆 BeautifulSoup ,一个去图书馆,从不同的网站提取内容。下面是第一步,在我进入实质部分之前。马上我就能看到大多数的评论都与早餐的选择有关。下一步是进一步分析其余的评论,并根据这些信息做出明智而恰当的决定。

结论

我知道我没有对我的方法做太多的详细说明,主要是因为我将为每种不同的方法写个人博客,并进一步详细说明。目前,这是总体计划。在一个小的创业公司工作很辛苦,但是非常有益。它挑战了我,让我用我所有的知识从不同的角度来处理每一项任务。我掌握的信息越多,领导团队对他们的业务就越有信心。我将在接下来的几天内回来,并带来项目的最新进展。

自适应认证和机器学习

原文:https://towardsdatascience.com/adaptive-authentication-and-machine-learning-1b460ae53d84?source=collection_archive---------2-----------------------

“我们打个比方:你家的前门有一个把手,很容易转动就能进出。它有一把安全锁,”Nuro Secure Messaging 的联合创始人 Omri Sigelman 说。"你加的锁越多,开门就越费力."

如今,随着技术时代的发展,在保持高安全性标准的同时确保用户工作效率的双重挑战已经成为一个相当关键的挑战。尽管对安全性的关注并不一定会损害可用性,但人们仍在努力实现这样的动机。

自适应身份验证的概念在传统的身份验证控制框架中充满了复杂性,并消除了用户工作效率的障碍。在认证控制过程中加入额外的风险因素(如位置、网络类型或操作系统)的效率低下,使得传统框架越来越过时。

简单地说,自适应身份认证是一种可以配置和部署双因素身份认证或多因素身份认证的方式。这是一种根据用户的风险状况和倾向选择正确的身份认证因素的方法,用于根据具体情况调整身份认证类型。

Adaptive Authentication 的功能非常强大,可以识别相关的风险级别,并在现实场景中提供适当的身份验证级别。与可能对可用性、安全性、效率和合规性造成负面影响的“一刀切”等标准不同,Adaptive Authentication 在另一方面避免了低风险活动变得过于费力或高风险活动变得过于容易。

简而言之,这种非静态身份验证方法采用请求访问系统的代理的概况来确定与该交易相关的风险概况。之后,风险状况将用于确定挑战的复杂性。如前所述,这种方法适用于为高风险档案提供经受更强挑战的可行性的情况,而静态用户名/密码对于低风险档案可能就足够了。

当谈到在工业环境中实现自适应认证时,很明显,已经采用了不同的方法来实现自适应认证过程的不同变体。然而,考虑到手头问题的性质,基于机器学习的模型可以被识别为实现的有效机制。

OneLogin 已经采用这种实现方法来迎合他们“可用性驱动安全性”的动机。他们的自适应身份验证使用机器学习来确定是否提示用户进行多因素身份验证。为了使流程更加突出,它使用广泛的输入来计算风险分值,并为给定情况确定最合适的安全措施。以下是 OneLogin 在其基于机器学习的自适应身份验证模型中使用的输入类型的概述。

在 OneLogin 的 Adaptive Authentication 模型中,将根据将获得的风险分值执行以下操作。

很明显,通过这种基于机器学习的自适应身份认证模型,OneLogin 为其客户提供了无缝、安全的用户体验,可以跟上当今不断发展的安全风险。

在传统的环境中,很明显,当涉及到安全研究和安全系统开发时,人的因素和可用性问题被经验性地忽略了。在安全性和可用性之间总是有一个重要的权衡。然而,这种争论在商业系统中不会持续太久,因为在现代,一切都同等重要。这就是为什么像 Adaptive Authentication 这样的方法需要进入身份和访问管理领域的原因。

参考

  1. https://www . onelog in . com/product/multi-factor-authentic ation

2.https://news . hitb . org/content/RSA-更新-自适应-认证-解决方案-高级-威胁

3。https://www . onelog in . com/blog/what-is-adaptive-authentic ation

自适应元启发式智能粒子(AMI-P)

原文:https://towardsdatascience.com/adaptive-meta-heuristically-intelligent-particle-ami-p-4badd123b3a2?source=collection_archive---------8-----------------------

Red Stars — Track of best solutions. Blue Star — AMI-Particle

AMI 粒子

AMI-P 是我新发现的优化方法。AMI 粒子使用单个粒子迭代地搜索全局最优,该单个粒子智能地学习并适应凸和非凸 n 维搜索空间。

如下所示,AMI-P 在单峰和多峰目标函数中都收敛到全局最优。这项研究部分是因为我发现了一个数学恒等式。这个恒等式通过在目标函数的可行搜索空间内请求自适应 n 维旋转,赋予了 AMI 粒子探索和开发的平衡。

AMI 粒子的一个独特但值得注意的特征是它不含导数;因此,AMI-P 是无梯度的。这允许 AMI 粒子在相对于维度的线性时间中在更高维度中收敛。动画性能部分下面是 100,000- & 1,000,000 维单峰和多峰函数的性能结果。

下面显示的所有结果都是使用 Matlab 在 MacBook Pro 上运行 200 次后的最差性能。这些对于应用数学领域来说是非常有希望的结果。数学优化方法是 人工智能(神经网络)、力学、分子工程、土木工程、运筹学、地球物理学、控制工程、电气工程以及最后但并非最不重要的经济学和金融学中的关键因素。

粒子动画表演

对于每个测试函数,使用 Matlab 生成二维动画性能图。动画显示了粒子探索搜索空间,同时保持‘吸引’到它学习利用的区域。

粒子每次收敛到全局最优小于~ 0.1/s;然而,出于演示的目的,我放慢了动画 gif 的速度。

动画图下方是针对球体RastriginGriewank 函数的 100,000 维和 1,000,000 维测试中的 AMI-Particle 性能结果。

粒子-球函数

https://www.sfu.ca/~ssurjano/griewank.html

AMI Particle Sphere Test — 2-D where xi ∈ [-100, 100], for all i = 1, …, D (100 epochs)

AMI 粒子— Rastrigin 函数

https://www.sfu.ca/~ssurjano/rastr.html

AMI Particle Rastrigin Test — 2-D where xi ∈ [-5.12, 5.12], for all i = 1, …, D (100 epochs)

AMI-Particle — 格里万克函数

https://www.sfu.ca/~ssurjano/griewank.html

AMI Particle Griewank Test — 2-D where xi ∈ [-600, 600], for all i = 1, …, D (250 epochs)

粒子——戈尔茨坦价格函数

https://www.sfu.ca/~ssurjano/goldpr.html

AMI Particle Goldstein-Price Test — 2-D where xi ∈ [-2, 2], for all i = 1, 2 (300 epochs)

AMI 粒子——维度测试

10 万维收敛测试

AMI-Particle 100,000-d Sphere Test — Worst-Case Performance Results of 200 Runs (~ 3/s)

AMI-Particle 100,00-d Rastrigin Test — Worst-Case Performance Results of 200 Runs (~ 3/s)

AMI-Particle 100,000-d Griewank Test — Worst-Case Performance Results of 200 Runs (~3/s)

1,000,000 维收敛测试

AMI-Particle 1,000,000-d Sphere Test — Worst-Case Performance Results of 200 Runs (~ 9/s)

AMI-Particle 1,000,000-d Rastrigin Test — Worst-Case Performance Results of 200 Runs (~ 9/s)

AMI-Particle 1,000,000-d Griewank Test — Worst-Case Performance Results of 200 Runs (~ 9/s)

下一步是什么?

随着使用不同的数学优化方法解决的过多现实世界问题的增加,自适应元启发式智能粒子方法的有希望的结果激励着我继续我的研究。我相信这种方法可以大幅提高性能,并减少人工智能深度学习中神经网络所需的计算资源。

使用 CustomVision.ai 和 Microsoft bot Framework 为您的聊天机器人添加图像识别功能

原文:https://towardsdatascience.com/add-image-recognition-to-your-chatbot-with-customvision-ai-and-microsoft-bot-framework-d0f8b30dba50?source=collection_archive---------6-----------------------

在我之前的博客文章中,我已经分享了关于如何使用 CustomVision.ai 创建自定义图像分类器。一旦您能够使用自定义视觉创建图像分类器,您可能会尝试将图像分类器添加到您的应用程序中,如手机、网络或聊天机器人。

在本教程中,我将向你展示如何使用你的自定义视觉图像分类器,到你的使用 Node.js 的聊天机器人。

设置您的聊天机器人

我们要做的第一步是使用微软机器人框架创建我们的聊天机器人。

  1. 为你的聊天机器人创建一个项目文件夹
  2. 在您的终端中执行npm init来创建package.json
  3. 安装将用于项目npm i --save botbuilder restify的节点模块
  4. 在您的项目文件夹中创建一个app.js

在你的app.js文件中,添加我们聊天机器人工作所需的初始代码。

获取自定义视觉的预测 API 端点

下一步将是获得自定义视觉的预测 API 端点,我们稍后将用于我们的聊天机器人。(注意:这里假设您已经在 Custom Vision 中创建和训练了您的分类器)

  1. 前往https://www . custom vision . ai
  2. 选择您已经创建或想要使用的项目
  3. 转到“性能”选项卡
  4. 点击“预测 URL”
  5. 记下“图像文件”端点 URL 和“预测关键字”

使用自定义视觉的预测 API 到我们的聊天机器人

一旦您做好了一切准备,我们现在将使用来自自定义视觉的预测 API 到我们的聊天机器人。

让我们的聊天机器人读取图像附件

这里我们需要做的第一件事是通过编程使我们的聊天机器人能够读取来自用户的图像附件。

  1. 在中创建一个utils.js文件,我们将在其中包含读取图像附件的实现
  2. 运行npm i needle --save
  3. 实现utils.js的代码

4.将utils.js代码导入app.js

5.向bot.dialog()添加一些测试代码,看看我们的聊天机器人现在是否可以确定它是否从用户那里接收到图像附件

现在你可以在你的 Bot 框架模拟器上测试它,它至少应该是这样的:

创建一个使用自定义视觉预测 API 的服务

既然我们的聊天机器人可以确定用户是否发送了图像附件,那么下一步就是将来自用户的图像附件发送到定制的视觉预测 API。

  1. 在聊天机器人的项目文件夹中创建customVisionService.js文件
  2. 运行npm i request-promise --save
  3. 执行customVisionService.js的代码

4.导入并使用customVisionService.js到你的app.js

现在,您可以在您的 bot 框架模拟器上再次测试这一点,并尝试向您的 Bot 发送一个图像附件,看看它将如何工作。

非常简单明了,对吗?如果想看完整个项目做参考,可以查看 GitHub 库这里。

给深度学习增加不确定性

原文:https://towardsdatascience.com/adding-uncertainty-to-deep-learning-ecc2401f2013?source=collection_archive---------0-----------------------

如何使用 Edward 和 TensorFlow 构建深度学习模型的预测区间

统计建模和机器学习之间的区别日益模糊。他们都从数据中学习并预测结果。主要的区别似乎来自于不确定性估计的存在。不确定性估计允许假设检验,尽管通常以可伸缩性为代价。

机器学习=统计建模-不确定性+数据

理想情况下,我们通过向机器学习添加不确定性来融合两个世界的优点。最近在变分推理( VI )和深度学习( DL )方面的发展使这成为可能(也叫 贝叶斯深度学习 )。VI 的好处在于,它可以很好地随数据大小伸缩,并且很好地适应允许模型合成和随机优化的 DL 框架。

向模型添加不确定性的一个额外好处是,它促进了 基于模型的机器学习 。在机器学习中,预测的结果是你的模型的基础。如果结果没有达到标准,策略就是“向问题扔数据”,或者“向问题扔模型”,直到满意为止。在基于模型(或贝叶斯)的机器学习中,您被迫指定数据和参数的概率分布。想法是首先明确地指定模型,然后检查结果(比点估计更丰富的分布)。

贝叶斯线性回归

这是一个给简单的线性回归模型增加不确定性的例子。简单的线性回归预测标签 Y 给定数据 X 权重 w.

Y = w * X

目标是通过最小化损失函数找到未知参数 w 的值。

(Y - w * X)

让我们把这个转换成一个概率。如果假设 Y 为高斯分布,则上述等价于最大化以下相对于 w 的数据似然:

p(Y | X,w)

到目前为止,这是传统的机器学习。要给你的体重估计增加不确定性,并将其转化为贝叶斯问题,只需在原始模型上附加一个先验分布即可。

p(Y | X,w) * p(w)

请注意,这相当于通过贝叶斯规则反演原始机器学习问题的概率:

p(w | X,Y) = p(Y | X,w) * p(w) /常数

给定数据的权重的概率( w )就是我们对于不确定性区间所需要的。这是重量 w后验分布

尽管添加先验在概念上很简单,但计算通常很难;也就是说,常数是一个很大的、不好的积分。

蒙特卡罗积分

概率分布的积分近似值通常是通过抽样来完成的。对分布进行采样和平均将得到期望值的近似值(也称为蒙特卡罗积分)。所以让我们把积分问题重新表述成一个期望问题。

上面的常数从数据和权重之间的联合分布中整合出权重。

常数= ∫ p(x,w) dw

要将其重新表述为期望值,引入另一个分布, q ,并根据 q 取期望值。

∫ p(x,w) q(w) / q(w) dw = E[ p(x,w) / q(w) ]

我们选择一个 q 分布,这样就很容易从中取样。从 q 中抽取一串 w ,取样本平均值得到期望值。

E[ p(x,w) / q(w) ] ≈样本均值[ p(x,w) / q(w) ]

这个想法我们以后会用到变分推理。

变分推理

变分推理的思路是,你可以引入一个变分分布, q ,带变分参数, v ,把它变成一个优化问题。分布 q 将近似于后验分布。

q(w | v) ≈ p(w | X,Y)

这两个分布需要接近,一个自然的方法将最小化它们之间的差异。通常使用 Kullback-Leibler 散度( KL 散度)作为差分(或变分)函数。

KL[q || p] = E[ log (q / p) ]

KL 散度可以分解为数据分布和证据下界( ELBO )。

KL[q || p] =常数- ELBO

常量可以忽略,因为它不依赖于 q 。直觉上, qp 的分母相互抵消,剩下 ELBO。现在我们只需要在 ELBO 上进行优化。

ELBO 只是具有变化分布的原始模型(在这里详细计算)。

ELBO = E[ log p(Y | X,w)*p(w) - log q(w | v) ]

为了获得对 q 的期望值,使用蒙特卡罗积分(取样并取平均值)。

在深度学习中,通常使用随机优化来估计权重。对于每个小批,我们取损失函数的平均值来获得梯度的随机估计。类似地,任何具有自动微分的 DL 框架都可以将 ELBO 估计为损失函数。唯一的区别是你从 q 中取样,平均值将是期望值的一个很好的估计,然后是梯度。

构建预测间隔的代码示例

让我们对一些生成的数据运行贝叶斯简单线性回归示例。以下内容也适用于 DL 模型,因为它们只是简单的线性回归。我们使用一个名为 Edward (基于 TensorFlow )的贝叶斯深度学习库来构建模型。

Gist 上有完整的代码。

第一步是定义权重的先验分布。

weight = ed.models.Normal(mu=tf.zeros(1), sigma=tf.ones(1))

在深度学习中,weight将是点估计。在贝叶斯 DL 中,weight是一个分布,它的后验概率由下面的变分分布来近似。

qw_mu = tf.get_variable(tf.random_normal([1]))
qw_sigma = tf.nn.softplus(tf.get_variable(tf.random_normal([1]))
qweight = ed.models.Normal(mu=qw_mu, sigma=qw_sigma)

注意,变化参数qw_muqw_sigma是估计的,而weight不是。从qweight采样将给出weight的后验不确定性区间(假设方差参数固定)。

我们将线性回归定义为预测模型。任何 DL 型号都可以替代。

nn_mean = weight * x + bias

数据似然性的构造类似于先验分布(假设方差参数固定)。

nn = ed.models.Normal(mu=nn_mean, sigma=tf.ones(1))

ELBO 度量取决于数据似然性和先验。数据似然性由标签数据绑定。每个先验分布必须由变分分布约束(假设变分分布之间是独立的)。

latent_vars = {weight: qweight, bias: qbias}
data = {nn: y}

运行推理优化很容易,因为:

inference = ed.KLqp(latent_vars, data)
inference.run()

为了提取不确定性区间,我们直接对变分分布qweight进行采样。这里,前两个矩是在采样 100 次后提取的。

mean_, var_ = tf.nn.moments(qweight.sample(100))

我们还可以将不确定性区间添加到预测中(也称为后验预测区间)。这可以通过复制模型并用所有后验概率替换先验来完成(本质上是在对数据进行训练之后更新模型)。

nn_post = ed.copy(nn, dict_swap={weight: qweight.mean(), bias: qbias.mean()})

再次运行图表 100 次,我们得到预测的不确定性区间。

mean_, var_ = tf.nn.moments(nn_post.sample(100), feed_dict={x: data})

现在我们有了整个分布,假设检验就容易了。

tf.reduce_mean(nn_post.sample(100) > labels)

但是等等,还有更多,辍学间隔!

如果完全贝叶斯是一个太多的投资,不确定性区间可以计算从神经网络通过辍学层。

机器学习模型的正则化和贝叶斯模型中的先验分布之间有很强的联系。例如,经常使用的 L2 正则化本质上是高斯先验(更多细节在此)。

Dropout 是一种根据伯努利分布随机清除神经元的技术。这可以通过 KL 散度标准下的高斯过程来近似(这里有更多细节,因为我不确定数学上的)。

在实践中,这意味着我们在漏失层打开的情况下运行模型 100 次,并查看结果分布。

# keep the dropout during test time
mc_post = [sess.run(nn, feed_dict={x: data}) for _ in range(100)]

mc_post的样本均值是估计值。对于不确定性区间,我们简单地计算样本方差加上以下反精度项:

def _tau_inv(keep_prob, N, l2=0.005, lambda_=0.00001):
    tau = keep_prob * l2 / (2\. * N * lambda_)
    return 1\. / tau

这给了我们原则上的不确定性区间,而不需要太多投资。

np.var(mc_post) + _tau_inv(0.5, 100)

摘要

要获得不确定性区间,您可以:

  1. 在模型中加入一个先验,通过变分推理逼近后验,然后从后验中取样
  2. 运行现有模型很多次,并打开丢弃层

混合解决方案是在感兴趣的特定参数上增加不确定性。在自然语言建模中,这可能只是将单词嵌入作为潜在变量。

AddressNet:如何使用递归神经网络构建一个健壮的街道地址解析器

原文:https://towardsdatascience.com/addressnet-how-to-build-a-robust-street-address-parser-using-a-recurrent-neural-network-518d97b9aebd?source=collection_archive---------5-----------------------

Australian Postage stamps, image by author

街道地址是复杂的野兽;它们被设计成对我们人类来说是系统的和明确的,但对机器来说却是一场灾难。事实上,你将为谷歌的每 1000 次地址查询支付5 美元,澳大利亚邮政将为你提供一批经过认证的“解决方案提供商”,同时还为那些预先分拣邮件并为其贴上条形码的人(即做艰苦工作的人)提供折扣。

维护结构化地址数据的价值超出了过去的邮资。将地址简化为地理坐标(地理编码)的能力可以为一些看似简单的问题提供答案,比如“我在哪里的销售额最高?”,但不需要太多的想象力就能看出如何从一个人的位置得出各种各样的关联,例如公共卫生部门的(我目前工作的行业)。

当然,从一开始就以结构化的方式收集这些信息是有意义的,但是如果您有一个手动输入且未经验证的地址记录的遗留数据集,该怎么办呢?如果你在 StackOverflow 上问…的无辜的问题

寻找一种快速而简单的方法将澳大利亚的街道地址解析成各个部分:
3A/45 Jindabyne Rd, Oakleigh, VIC 3166

…您将很快被告知"您将获得完全无用的数据",然后您将看到一个类似于的正则表达式:

(?P<Unit_Number>\d*)\s*[\/,\,]\s*(?P<Street_Number>\d*)\s*(?P<Street_Name>[a-zA-Z\s]*),?\s*(?P<State>NSW|ACT|NT|QLD|SA|TAS|VIC|WA)\s*(?P<Post_Code>\d{4})| (?P<street_number>\d*)\s*(?P<street_name>[a-zA-Z\s]*),?\s*(?P<state>NSW|ACT|NT|QLD|SA|TAS|VIC|WA)\s*(?P<post_code>\d{4})

对复杂和无情的正则表达式感到沮丧和悲伤,你会偷偷溜走,在 instagram 上查找#ferrets,因为这才是互联网的真正目的。

我是来告诉你不要难过的。我的意思是,观察雪貂;毕竟他们很可爱…我不想剥夺你的可爱。但是一旦你完成了,回来。我将向您展示如何构建自己的地址解析机器。

遵循传统的神经网络命名法[Thing]+Net 的 address Net 是一个漂亮的模型,它通过给地址的位标上22 个可能组成部分中的任何一个来整理它们,并且基于GNAF 数据库。这是我在 TensorFlow 上花了大约一周时间研究的成果(也让我自己从机器学习的间隙中解脱出来)——我确信一个更有才华的人可以在更短的时间内完成这个(现在的孩子们)。

TL;dr:如果你想要一个 Python API 来分割你的澳大利亚街道地址,试试吧。

>>> from addressnet.predict import predict_one
>>> print(predict_one("3A/45 Jindabyne Rd, Oakleigh, VIC 3166"))
{'flat_number': '3', 'flat_number_suffix': 'A', 'number_first': '45', 'street_name': 'JINDABYNE', 'street_type': 'ROAD', 'locality_name': 'OAKLEIGH', 'state': 'VICTORIA', 'postcode': '3166'}

嘣。

那么这个诡计是如何运作的呢?很抱歉,我不能公正地对待这个理论;许多比我更聪明的人在这些话题上写了很多。因此,我将从较高的层面解释 AddressNet 中使用的过程,并链接到我最喜欢的作者,他们优雅的解释不值得在此复制。

address net 模型的核心是一个递归神经网络 (RNN),它们非常擅长模拟序列数据(在这种情况下,是一系列字母)。这种神经网络通常用图表表示为:

A typical representation of RNNs (left and right are equivalent)

在上图中, x 是输入数据序列中的一项, y 是某个目标的估计或输出。左边的环形箭头,以及右边同样标有“ h ”的水平箭头,代表一种“隐藏状态”每个输入都有下标( t -1、 tt +1 等)。)指示特定序列元素起源的点,这通常被称为“时间步长”(尽管这通常不是字面意义上的时间,而是通过元素的“定向行进”)。中间的大 ol’圆形斑点包含产生 y s 和 h s 的所有矩阵运算,但是一定要注意每个斑点都是相同的;完全相同的内部参数被应用于每个输入的 hx ,从而使它们重复

【推荐阅读:递归神经网络的不合理有效性

RNNs 的工作方式可以简单地解释如下:对于序列中的每一项数据,使用前一步的隐藏状态以某种方式对其进行转换,以估计目标输出,同时更新隐藏状态以移交给下一步。这种神秘的隐藏状态可以被认为是“扫描序列时收集的知识”,它的功能是一种记忆。RNN 体系结构的许多变体都围绕着如何管理隐藏状态,最常见的类型是 LSTM 和 GRU 类型的 rnn(address net 使用 GRU 类型的 RNN)。

【推荐阅读:了解 LSTM 网络;了解 GRU 网络

能够将序列中较早的信息向前传递是 RNNs 的关键优势。例如,在自然语言处理中,诸如复数和性别之类的语法概念以及相应的词的变化经常是远距离链接的。想象一下,一个 RNN 被设计用来识别不恰当的动词形式;一个简单的语法检查器,如果你愿意:

A hypothetical NLP RNN to detect grammar issues. Long distance dependencies highlight the importance of “memory”

每个 x 代表句子的一个单词,如果没有错误,每个 y 产生 0,如果有错误,产生 1。这里,动词“is”实际上应该是“are ”,因为名词“diagrams”是复数。保留先前元素的一些记忆的能力允许这个假设的网络生成被框定为“的结果鉴于我到目前为止所看到的,当前元素是错误的概率是多少?”

RNN 可以扩展为多层(每一步的输出作为另一个 RNN 的输入输入),它们也可以与一个等效的 RNN 配对,其中水平箭头处于相反的方向,向后传递隐藏状态,有效地查看“未来”以了解“过去”后者被称为双向 RNN。

【推荐阅读:双向递归神经网络 / PDF

AddressNet 基于每个字符使用多层双向 RNN。双向性是特别重要的:考虑一下地址“10 24–26 高街路,芒特韦弗利”给每个角色分配一个类别,而对于第一个角色来说,仅仅向前看几乎是不可能的!是的,可能单位/平号是最常出现的第一个字,可能整体来说单位比单机多,所以我们可能统计上有机会,但真的只是瞎猜。类似地,在没有任何预见未来的能力的情况下,“街道”很可能是指街道的类型…但是当我们遇到“道路”时,才发现我们犯了一个错误,这个名称实际上是“道路”类型的“高街”在 AddressNet 实现中,与上面的图表不同的一点是,AddressNet RNN 的输出不是直接的预测,而是向前和向后传递连接在一起,并通过最终的“完全连接”神经网络-这些是标准的教科书网络,在谷歌图像搜索中排名第一。如果你想了解这个网络的具体实现,请查看这部分代码。

但是人物首先是怎么表现出来的呢?什么的‘A’?我们如何将字母“A”塞进这个神奇的数学包中呢?在神经网络中有两种主要的方法可以表示文本数据:“一键”向量方法和密集的“嵌入向量”方法。前者由一个和我们的词汇一样长的向量组成(可以是一系列单词、字符,甚至是表情符号🤷‍♀️),在对应于我们的字典中的项目的索引处包含“1 ”,在其他地方包含“0 ”,而嵌入向量方法是通过任意长(但通常比词汇表短得多)的向量来实现的,该向量具有由模型学习的参数;也就是说,即使是表象本身也随着我们的训练而优化。历史上,嵌入向量已经被用于导出语义单词关系,但是这里我只是将它们用于降维(并且我通常喜欢优化输入参数的想法)。AddressNet 使用嵌入方法,每个字符有八个单位的短向量。

【推荐阅读: TensorFlow docs ,以及任何关于单词嵌入的东西(例如米科洛夫的 word2vec 论文)】

我们来谈谈训练数据。唉,我过去没有——现在也没有——任何标记过的、精选过的真实地址数据。相反,我的方法是综合生成尽可能多的随机排列(在某些情况下几乎无法理解),这些排列仍然在合理的范围内。有代码的大杂烩,可以被破译以理解我屠杀 GNAF 数据集的精确方式,但本质上代码为 GNAF 数据集中的每条记录做出以下决定:

  1. 保留还是放弃郊区?
  2. 保持还是放弃状态?
  3. 缩写州名?(例如将“维多利亚”改为“维克”)
  4. 保留还是删除邮政编码?
  5. 保留还是放弃街道号码?
  6. 简称街道类型?(例如将“道路”改为“道路”)
  7. 保留还是删除单位类型?
  8. 把等级数转换成序数或基数词?(例如,将“1”更改为“1st”或“first”)

然后,这些组件以一种特殊的方式被打乱(例如,将州和邮政编码之类的东西放在靠近末尾的地方),然后每个组件都受到一些随机破坏,这有点像人类可能犯的错别字。错别字包括:

  1. 字符替换(使用键盘上邻近的字符)
  2. 删除
  3. 调换
  4. 复制

最后,使用一些随机分隔符将每个组件缝合在一起。这些可能是空格、破折号、斜线或句号(取决于地址的部分)。

但是为什么呢?有两个原因:首先,这些很可能会在现实世界中发生,模型应该足够健壮来处理这些。其次,这种额外的噪声旨在作为一种正则化的形式,正则化是一个术语,指的是降低模型过度拟合可能性的方法。

正确地改变和破坏数据是当务之急!在开发这个模型的时候,我敏锐地意识到我没有测试数据;我无法通过先验的方式知道这个模型在现实世界中的表现如何。理想情况下,我会有一个从手动输入的地址完全标记的测试集,但我只是一个人在业余项目工作。因此,对我来说,关键是要确保输入数据中有如此多的可变性,以至于模型复杂性不能开始“学习噪音”训练有素的模型的经验表明,我击中了目标,但我会喜欢你,读者,给它一个机会,让我知道它如何进行。我知道,我知道,没有测试数据是我的耻辱😔。

准备好试试了吗?我敢肯定你说是。只是皮普安装它,看看你怎么想:https://github.com/jasonrig/address-net

欢迎投稿、反馈、指正和建议。如果你在自己的项目中使用 AddressNet,或者对其进行修改,请告诉我。希望您的地址数据永远不需要正则表达式。🙏

调整 Python 与熊猫合并的价格以适应通货膨胀

原文:https://towardsdatascience.com/adjusting-prices-for-inflation-in-pandas-daaaa782cd89?source=collection_archive---------5-----------------------

几年来,我管理着一家小型初创投资基金。虽然华尔街分析师在分析公司时通常只回顾一两年,但我经常会追溯到 20 年或 30 年前。我甚至会偶尔翻阅上世纪 50 年代、20 年代或罕见的 19 世纪的经济和价格数据,以便更好地理解市场周期。然而,当你进行这种深度长期历史分析时,你会遇到一个问题: 名义价格可能非常具有欺骗性

以谷物价格为例。我们有谷物生产者价格指数追溯到 1926 年 1 月,当时该指数在 20 世纪 20 年代的繁荣时期为 37.9。2018 年 4 月,同一指数为 151.5。因此,在 92 年的时间框架内,谷物价格上涨了 4 倍。如果我们从 1933 年大萧条的底部开始衡量(当时指数为 11.0),价格已经上涨了 15 倍!

这是一张非常容易误导人的图片,仅仅从上面的图表很难看出这一点。一旦我们对通货膨胀进行调整,我们就会得到下面这张看起来完全不同的图表。

随着时间的推移,谷物价格不仅没有上涨,实际上还在下跌。经 CPI 通胀调整后,如今的谷物价格比 1926 年低了 71%。今天的价格甚至比大萧条时期的低点低 24%。

随着时间的推移,谷物变得越来越便宜,实际农产品价格的下降缓解了世界大部分地区的贫困状况。你可能从来没有通过简单地看顶部图表中的名义价格而获得这种洞察力。你必须根据通胀进行调整,才能获得这种视角。

美国的通货膨胀

在过去的一个世纪里,美国的通货膨胀出现了戏剧性的循环。在第二次世界大战中,通货膨胀率飙升至 10.5%。到 1953 年,通货膨胀率一路下降到 0.8%。1980 年,通货膨胀率高达 13.5%,之后美联储对其进行了打击。2005 年,官方 CPI 通胀率为 3.4%,但美国最大的 20 个大都市区的房价却上涨了 14%!2017 年,通胀相对温和,为 2.0%(但随着劳动力和投入成本继续上升,通胀开始再次回升)。

通货膨胀调整让你对实际价格有更好的理解。这个分析可以很有见地。事实上,我最成功的投资论文之一围绕着考察日本资产泡沫期间经通胀调整的铜价,并将其与 2000 年代末/2000 年代初的铜价泡沫进行比较。

然而,如果你在一个熊猫数据框架中工作,通货膨胀调整在 Python 中似乎是一个棘手的问题。您可能有数千行“数据点”,其日期分散在数据框的整个范围内。然而,通货膨胀数据往往是连续月度数据的形式。你如何将两者联系起来?

寻找你的消息来源

首先要说的是来源。你用什么数据来调整通货膨胀?你在哪里找到通货膨胀的数据?

并不总是有一个“正确”的答案,但是如果你住在美国或者正在处理美国的价格数据,那么美联储经济数据(通常缩写为“FRED”)应该是你的首选来源之一。有几十种通货膨胀衡量方法,但我最常用的一种叫做“ CPIAUCNS ”。这个通胀数据集可以一直追溯到 1913 年,这就是为什么它往往是我最喜欢的长期分析。

还有许多其他数据集。例如,如果你正在查看明尼阿波利斯的房价数据,你可能更喜欢查看房价指数,如全交易房价指数或 Case-Shiller 明尼阿波利斯房价指数。然而,通常情况下,CPI 的某个变量就是你要用的指数。

设置您的索引

CPI 通胀指数和房价指数已经以某种方式进行了指数化,但是你可能需要重新对数据进行指数化以适应你自己的目的。例如,如果您的通货膨胀数据在 1982 年 1 月的指数为 100,而您的数据集处理的是 2004 年到 2017 年的数据,您可能希望根据 2004 年的价格(开始)或 2017 年的价格(结束)来索引您的数据。

我们可以用 Excel 或者 Python 来做这个。诚然,我发现在 Excel 中调整数据通常更容易,但如果我们有一个特别大的数据集,Python 可能是一个更好的选择。

在 Python 中,我们可以通过加载通胀数据并为“指数乘数”创建一个新列来实现这一点。然后,我们只需将名义价格乘以“指数乘数”。

# load inflation data
inflation = pd.read_excel(‘inflation_data.xls’, sheetname=’Data’)# create index multiplier
inflation[‘CPI_Multiplier’] = inflation[‘CPI’].iloc[-1] / inflation[‘CPI’]

注意在这个例子中,我使用最后一个数据值来创建指数,因此价格将被索引到今天的价格。如果我们使用第一个数据点基于开始的起始点进行索引,我们将选择第一个值而不是最后一个值。

现在我们有了一个调整价格的指数。我们需要合并两个数据集来执行操作。

匹配日期

然而,在我们合并之前,我们必须处理这个练习中最棘手的部分:日期。日期可能是编程中的一大难题。有几种方法可以处理它们。

在最近的数据集中,我发现月份和年份在不同的列中,如下例所示。

Month Year
01    2008
04    2012
09    2016

同时,我的通货膨胀数据上的日期被识别为 yyyy/mm/dd 格式,如下所示:

Date          CPI_Multiplier
2008/01/01    1.000
2008/02/01    1.003
2008/03/01    1.005
2008/04/01    1.011

两者如何对齐?

答案有很多,但我创建了一个“日”列,并将其赋值为 1(以匹配通货膨胀数据中的日期),并使用 pd.to_datetime 在原始数据集中创建一个“日期”列。

# load data set
df = pd.read_excel('training_data.xlsx')# create new day column for 'day'
df['day'] = 1#create new dataframe to store date info
new_df = df[['year', 'month', 'day']]# create new column 'Date' in original data w/ datetime conversion
df['Date'] = pd.to_datetime(new_df)

在 Pandas 中,pd.to_datetime()是一个强大的工具,但是您必须让您的数据恰到好处地工作。

合并数据

最后,我们加载膨胀数据,并使用 pd.merge 来合并两个数据帧。“how”参数指定联接的类型。在这种情况下,我将“df”(我的主数据集)设置为第一个参数,将“inflation”(通货膨胀数据)设置为第二个参数,并使用“left”连接在“Date”进行合并。

# merge dataframe
df = pd.merge(df, inflation, how='left', on='Date')

现在,有了合并的数据框架,创建索引就很容易了。

df[‘CPIAdjPrice’] = df[‘SalePrice’] * df[‘CPI_Multiplier’] 

维奥拉。我们现在可以看到实际价格了!

结论

在长期数据序列中,通货膨胀调整对理解数据至关重要。通过使用名义价格,它也可以使预测变得更加棘手。

通货膨胀调整可以用于观察商品价格或零售价格,但也可以与住房价格指数一起使用,以调整动荡市场中的住房价格。这样,我们可以将“市场波动”和“通货膨胀”作为预测模型的一部分。

高级数据扩充策略

原文:https://towardsdatascience.com/advanced-data-augmentation-strategies-383226cd11ba?source=collection_archive---------14-----------------------

深度学习模型热爱数据。除了向深度学习模型添加更多的训练数据,没有更好的方法来快速提升你的深度学习模型的性能。

然而,收集和标注数据可能非常耗时且昂贵。因此,许多深度学习研究人员对数据增强技术感兴趣,以便为这些庞大的数据饥渴模型综合添加训练数据。

对于图像数据,有许多经典的/易于实现的数据扩充方法。最流行的方法之一是水平翻转图像。水平翻转图像、裁剪图像同时保留图像中的感兴趣对象以及增加颜色空间是最常用的经典数据扩充方法,这些方法很可能会提高最终模型的性能。

许多图像处理功能,如平移、剪切、旋转等。可用作经典的数据扩充功能。您还可以使用随机区域锐化、弹性变换、随机擦除图像的补丁等等来增加数据和创建新的训练实例。

在许多研究中,这些经典增强已被证明能够提高图像数据的性能。也有新的方法正在研究,似乎很有前途。这些方法包括对抗训练、生成对抗网络、风格转移以及使用强化学习来搜索增强可能性的空间。

对抗训练

对抗性训练是深度学习中一个非常令人兴奋的话题。对抗训练是生成对抗网络的基础,但它们也可以用于学习噪声增强,这可能有助于模型表现得更好。在对抗训练中,一个模型对实例进行分类,另一个模型获取实例并向其添加噪声,以试图欺骗另一个分类器。然后,分类模型为这个对立模型提供损失函数,使得它可以优化自身以产生更好的噪声。添加通过对抗性训练产生的图像可能有助于模型学习更强大的不受噪声失真影响的特征。

生成对抗网络

生成对抗网络是深度学习中最热门的话题之一。通过使用生成器网络将噪声向量映射到宽度 x 高度 x 颜色通道图像张量,该模型能够生成看起来像原始训练图像的图像。这种方法的主要问题是很难用 GANs 产生高分辨率的输出图像。在 MNIST(28 x 28 x 1)、CIFAR-10 (32x32x3)数据和 DCGAN(添加到生成器网络的深度卷积层)上,使用 GANs 进行数据扩充已被证明是有效的,并产生了(64x64x3)图像。产生比这更高分辨率的输出需要非常复杂的网络和技术。

MNIST ‘3’ I was able to make using a DCGAN with Python/Keras

神经类型转移

神经类型转移是深度学习中另一个令人难以置信的令人兴奋的话题。通过卷积神经网络的过程,这些网络能够惊人地将风格与内容分开。样式表示被格式化为“gram matrix ”,并且由此导出损失函数,以将一个图像的样式转移到另一个图像,同时保留内容。这可以产生诸如使普通图片看起来像是文森特·范·高夫所画的效果。风格增强在数据增强中是一个相当新的主题,但是我希望随着对这个主题的研究越来越多,它会做得越来越好。

Neural Style Transfer

离散空间搜索的强化学习

对于所有这些进行数据扩充的潜在方法,很难找到最佳组合。传统上,这种可能性树可以通过深度或广度优先搜索来天真地探索,一旦达到期望的性能就停止。然而,随着围绕深度强化学习的所有兴奋,已经有一些研究探索学习增强策略的可能性。这样做也是希望这些数据扩充策略能够在图像数据域中推广。

Discrete Space Search Illustration

结论

总之,所有这些的目的是尝试向我们的训练集添加数据,从而产生更好的深度学习模型。在深度学习研究的广度中,存在许多进行数据增强的创造性方法。数据扩充的研究对于构建更好的模型和创建系统非常重要,这样您就不必收集大量的训练数据来获得可靠的统计模型。感谢您的阅读!

CShorten

Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对计算机视觉、深度学习和软件工程感兴趣。

高级 DQNs:用深度强化学习玩吃豆人

原文:https://towardsdatascience.com/advanced-dqns-playing-pac-man-with-deep-reinforcement-learning-3ffbd99e0814?source=collection_archive---------3-----------------------

art by Yojama

2013 年,DeepMind 发布了第一个版本的 Deep Q-Network (DQN),这是一个能够在许多经典的 Atari 2600 游戏上表现出人类水平的计算机程序。就像人类一样,算法根据它对屏幕的视觉进行游戏。从零开始,它发现了让它满足(在许多情况下,超过)人类基准的游戏策略。在此后的几年里,研究人员做出了许多改进,超级充电性能和解决游戏的速度比以往任何时候都快。我们一直致力于在 Keras(开源、高度可访问的机器学习框架)中实现这些进步,在这篇文章中,我们将详细介绍它们如何工作以及如何使用它们来掌握 Pac-man 女士。

强化学习简介

DQN,以及类似的算法如 AlphaGo 和 TRPO,都属于机器学习的子集强化学习 (RL)的范畴。在强化学习中,一个主体存在于一个环境中,并寻求某种回报的最大化。它采取行动,改变环境,并给予环境与改变相关的回报。然后,它查看自己的新状态,并决定下一个动作,无休止地重复这个过程,或者直到环境终止。这个决策循环更正式地称为马尔可夫决策过程 (MDP)。

很容易看出像《吃豆人》这样的雅达利游戏是如何融入 MDP 框架的。玩家看着游戏屏幕,从不同的按钮和操纵杆位置中进行选择,以增加他们的分数。但这种简单性可能隐藏了一项艰巨的任务,任何玩过视频游戏的人可能都认为这是理所当然的,这是一个根据几乎无限的像素组合之一做出即时决定的过程,这些像素组合可以在任何给定的时间显示在屏幕上,而且是你以前不太可能遇到的。如果这还不够困难的话,视频游戏在技术上是部分可观察的 MDPs,在这个意义上,你被迫基于游戏的间接表示(屏幕)而不是代码/内存本身做出选择,隐藏了一些你需要做出完全知情决定的信息。幸运的是,像吃豆人这样的视频游戏确实提供了两个有用的简化:帧速率和控制器。有限数量的按钮和操纵杆位置让我们可以将观察空间映射到离散和可管理的行动空间,当你意识到它不需要连续完成时,这种心理功能会进一步简化,因为你只能在每一帧按下一个按钮(大多数 RL 代理会更进一步,每 3 或 4 帧才做出新的决定)。接下来的挑战是困难但可定义的:我们如何利用我们玩游戏的经验做出增加分数的决策,并将决策过程推广到我们从未经历过的新位置?

深度 Q 网络的基础知识

dqn 利用神经网络令人难以置信的成功来解决这一挑战。该架构可以分为两部分。首先,一系列卷积层学会检测游戏输入屏幕越来越抽象的特征(我们稍后将详细讨论这是如何工作的以及它学会检测什么)。然后,密集分类器将当前观察中存在的那些特征的集合映射到输出层,对于控制器上的每个按钮组合有一个节点。

Neural network schematic from DeepMind’s 2015 paper

这些输出值是代理在采取行动时对预期回报的最佳预测。这种“状态到预测奖励”的方法被称为基于值的学习,并以行动值函数 Q( s,a )为中心,表示在状态 s,中采取行动 a 的总价值,它是未来奖励 r 的总和,通过贴现因子γ进行调整,指示代理预期计划未来多远。最优策略被写成:

也就是说,在每一步中,我们都在采取导致最高奖励分数的行动。一旦我们可以计算出这些 Q 值,这就非常简单了,但是当然我们的 Pac-man 代理不能真正看到未来,也不能给每个可能的状态分配一个唯一的 Q 值。这就是深度学习的用武之地。通过将像素图像映射到 Q 值,我们的神经网络充当了 Q 函数逼近器,因此尽管它看不到未来,但通过足够的训练,它可以学会预测未来。

该训练是使用上述损失函数的梯度下降来完成的,该损失函数是时间差的变化。这可以被认为是“真实”或目标 Q 值和我们当前对它们的估计之间的差异,其中目标值是即时奖励加上我们在下一个状态将采取的行动的 Q 值。当然,这个值也是由我们的网络计算出来的,但由于它至少可以访问第一个奖励项,所以整体表达式本质上更准确。即便如此,这在数学上绝对等同于试图击中移动目标,因为真实值是由我们正在训练的同一个网络计算的。这是监督学习(机器学习的另一个子集,包括图像分类和情感分析等任务)和强化学习之间的巨大差异。监督学习使用带标签的数据集,这意味着目标值由人类手动设置,并假设是准确和不变的。强化学习创建它自己的、不断变化的数据集,这既是因为网络生成它自己的目标值,也是因为网络的动作选择直接影响它将到达其环境中的哪个状态,因此它必须学习什么。为了帮助管理,我们实际上采取了两个额外的稳定措施。首先,我们复制神经网络,使用第二个副本或目标网络来生成目标值,使用原始网络或在线网络来生成估计值。只有在线网络被训练,但是我们经常把它的权重复制到目标网络,用更优化的参数刷新它。第二,我们使用一种叫做体验缓冲的东西。缓冲区是我们的代理过去经历的数据集,其中经历被定义为( s,a,r,t,s' ),其中 s,ar 保持它们先前的定义, t 是一个布尔值,它让代理知道这是否是该事件的最终状态,而 s' 表示当代理采取行动时跟随 s 的状态您会注意到一个经验条目包含了计算损失函数所需的所有变量。因此,代理不是在玩吃豆人游戏时学习,实际上只是根据它已经学习的东西在屏幕上移动吃豆人,而是将所有这些经验添加到缓冲区中。然后,我们可以从存储中获取经验,并将其回放给代理,以便它可以从中学习,并在未来采取更好的行动。这在概念上类似于人类重放记忆以便从中学习,这个过程被恰当地命名为经验重放。最重要的是,它确保代理从它的整个历史中学习(或者至少是在我们开始覆盖最老的数据之前我们实际上可以存储的尽可能多的历史),而不是从它最近的轨迹中学习。

值得注意的是,这些架构决策将 DQN 归类为非策略、无模型算法无模型,因为它学习预测与位置相关联的值,但不试图建立其环境的内部工作的模型,以便预测它将看到的下一个状态,以及无策略,因为它的训练样本是由它自己的过去版本生成的(因此是它的决策策略的过去版本)。

还有一个更重要的细节需要回避,那就是探索问题。在 Markov agents 内部,关于冒险探索新想法和利用已知事物哪个更好的争论从未停止过。想象一下,如果算法总是按下它认为会导致最高奖励的按钮,会发生什么?它很可能每一次都做同样的动作,从不尝试其他任何事情,因此永远不会进一步学习和提高。例如,它可能在第一次尝试时就知道从起始区域向右走可以得到几分,然后不管有多少鬼魂或墙壁挡在它的路上,它都继续向右走;它从未尝试过向左走,因此没有办法准确估计这样做会产生的回报。最初的 DQN 以一种武断但惊人有效的方式解决了这个问题。我们将变量ε初始化为 1.0。对于每一步,我们都会生成一个介于 0 和 1 之间的随机数。如果这个数字小于ε,我们完全随机地采取一个行动,不管代理人对这个行动的 Q 值说了什么。因为ε是 1,我们 100%的时间都这样做。但是随着训练的进行,我们将ε降低到 0.1 左右,这意味着我们在 90%的时间里采取最佳行动,而在另外 10%的时间里探索一个新的随机方向。有趣的是,我们在实践中从未让 epsilon 达到 0(即使在测试/评估期间,我们通常使用. 05);这确保了吃豆人女士永远不会被困在角落里或无限期停止移动。这种方法被称为ε贪婪。

既然我们已经进入了实验/代码,现在可能是时候提及所有这些结果(包括所有训练模型的权重文件),以及生成它们的脚本可以在这个项目的 GitHub repo 上找到。DQN 算法的内部工作是在开源库 keras-rl 中实现的。然而,在我们一直在研究并将在下面描述的更高级的技术被批准合并到主版本中之前,可能还需要一段时间。与此同时,您可以在我们的论坛上访问它们。

关于 dqn(以及一般的 RL 算法)需要知道的是,它们的采样效率很低,训练成本也很高。DQN 文献中的标准方法是进行 2 亿次框架训练。这相当于在一个 P4000 GPU 上进行大约 930 小时的人类速度游戏或大约 20 天的训练(至少对于我们将看到的最终 DQN 版本来说)。我们没有足够的资源为算法的每个版本完成这样的事情。相反,我们选择对 1000 万帧进行这些比较实验(足以突出差异),并训练我们最终表现最好的代理进行更长的 4000 万步运行。

这样一来,是时候看看我们所描述的算法是如何执行手头的任务的了。

香草 DQN 挑战吃豆人小姐

在培训期间监控和分析代理成功的一个有效方法是在每集结束时绘制其累积奖励。

奖励函数与游戏中的分数成比例(但不等于,实际上比游戏中的分数小得多),所以它本身并不意味着什么。然而,代理显然能够学习一些关于游戏的知识,以便随着时间的推移不断改进。还要注意投资回报的递减,就像任何学习曲线一样——人类或机器。

让我们来看看一些游戏,看看它是如何做的。

令人惊讶的是,代理已经学会了在迷宫中导航。当仍然有密集的口袋需要收集时,它甚至可以很好地清理大面积区域。然而,它很难找到回到溜走的孤独的几个点的路,每当它发现自己被困在两个口袋中间,必须决定先去哪一个时,它似乎都彻底崩溃了(像在 0:29)。当鬼魂变得脆弱时,它似乎也不会主动追捕它们,只会在收集迷宫每个角落的所有点的过程中偶然触发这种行为。

双 Q 学习

2015 年, van Hasselt 等人将双 q 学习应用于 DQN,这一修改提高了一些游戏的性能。请注意,在上面的损失函数中,我们使用目标网络来计算下一个状态中每个动作的 q 值,并选择我们想要采取的动作(最高的一个)。事实证明,这可能导致一些高估问题,特别是当目标网络和在线网络之间的差异导致它们在给定相同状态的情况下推荐完全不同的动作时(与 q 值略有不同的相同动作相反)。为了解决这个问题,我们取消了目标网络确定最佳行动的责任;它只是生成 Q 值,我们让在线模型决定使用哪一个。更正式地说,双 DQN 根据以下公式生成目标值:

决斗建筑

RL 理论的一个重要细节是,Q 函数实际上可以分解为两个独立项的总和:价值函数 V( s ),它表示处于当前状态的价值,以及优势函数 A( s,a ),它表示每个动作的相对重要性,并有助于确保代理采取可能的最佳动作,即使该选择可能不会对游戏分数产生任何直接影响。

2016 年,王等人发表了决斗网络架构,将神经网络分成两个流,共享一个卷积基,每个流用于估计一个函数。

Vanilla DQN architecture (top) vs. Dueling DQN (bottom). Dueling estimates the action and value functions separately, before combining them to arrive at the overall Q function.

上面架构示意图中的绿色箭头代表我们用来组合它们的方法。不幸的是,天真的解决方案(将 A( s,a )添加到 V( s ))是无效的,因为网络没有被激励来独立地优化 V 和 A,因此我们根本不能保证这些就是它正在学习的。相反,我们使用另一种方法:

其中αβ分别代表优势流和价值流的参数。现在网络可以使用其所选动作的知识将优势函数推至 0,使得 Q( s,a )近似等于 V( s )。

优先体验回放

当人们回顾过去,从我们的错误中学习时,我们会优化过程,把时间花在最需要的地方。当你期中考试不及格,决定期末考试要做得更好时,你会去专门检查你做错的问题;你不会浏览页面或者只是检查 3 的偶数倍。到目前为止,我们的代理一直从重放缓冲区中均匀随机地进行采样。在《吃豆人》的上下文中,这意味着我们的代理人在没有敌人的直道上滑行的情况比它进入三面都有幽灵的四向交叉路口、选择错误并付出代价的情况多得多。但是,如果它能从自己最错误的经历中吸取教训,那会怎么样呢?

Schaul 等人在 2016 年的论文中提出了一个解决方案,被称为优先化体验回放 (PER)。在 PER 中,我们使用一个额外的数据结构来记录每个转换的优先级。然后按照优先顺序对经验进行抽样:

其中 alpha 是一个超参数,表示我们希望这个采样偏差有多大。优先级本身只是代理上一次在该经验上训练时的时间差异误差。通过这种方式,我们的代理更有可能从最不准确的预测中学习,消除其故障点,并且通常更加高效。

还有重要性采样权重的细节,这是为了补偿这样一个事实,即我们现在有意提供网络数据,这将导致异常大的梯度更新。

这些重要性权重由一个超参数 beta、控制,该参数控制我们想要补偿它们的力度。该β值通常在整个运行过程中保持稳定,从初始化的~ 0.6 上升到 1.0(完全补偿)。即便如此,每个装备的代理倾向于使用较低的学习率(通常大约 0.25 倍)来防止灾难性崩溃。

优先双人决斗 vs 吃豆人

虽然这三个改进中的每一个都可以单独做出重大改进,但它们的伟大之处在于它们可以存在于同一个算法中,有点牵强地称为优先双决斗 DQN (PDD)。这是学习曲线,与我们之前的版本相对照:

虽然在最初几千集的繁重探索阶段,他们的表现同样不佳,但 PDD 在 2k 集时开始脱离。虽然这种差距似乎很难区分,但游戏视频讲述了一个更好的故事:

新增加的功能使我们的代理人能够有明确意图地寻找孤立的破折号——不再在迷宫中随机徘徊。它似乎还把在角落里捡起能量丸和获得更高的奖励联系起来,很可能是因为偶然遇到鬼魂,一旦这种行为使他们变得脆弱。有趣的是,它并没有完全取消这种策略,因为它通常会直接进入迷宫的每个角落,甚至不会等待其无敌过期,也不会针对逃跑的鬼魂,而一个有经验的人类玩家可能会在可怕的情况下保留这些能力,或者至少将它们间隔开,以最大化它们的效果。

用于探索的嘈杂网络

之前,我们谈到了勘探和开采之间的争论,以及有点武断的解决方案,称为 epsilon Q greedy。这种方法的问题是它依赖于预定的超参数。我们怎么知道我们需要多少探索来解决一个像吃豆人女士这样的游戏?找出答案的唯一真正方法是测试一大堆不同的值,这是一个耗时且昂贵的过程。如果智能体能够学会控制其探索,就像它学会控制其决策的其余部分一样——通过梯度下降——那就好得多了。2017 年, Fortunato 等人发布了让这成为可能的解决方案:嘈杂的网络。

因为我们正常计算 Q 值,但是对我们的动作选择进行随机化(添加噪声),所以εQ 贪婪方法属于动作空间噪声探索方法的范畴。在有噪声的网络中,我们将噪声注入到神经网络本身的权重中(参数空间)。因此,代理将始终如一地推荐它不“打算”采取的行动,确保探索,并且我们可以仅基于最高 Q 值输出来做出行动决策。

The difference between action and parameter space noise, from a very similar technique released by Open AI around the same time.

具体而言,噪声网络用噪声密集层替换模型中的密集分类器,由以下操作定义:

其中除了ε项之外,所有参数都是可学习的,ε项是在每个训练和推断步骤之前使用分解的高斯噪声生成的。然后,代理可以学习操纵其他变量,特别是两个变量,但它可以按照环境的要求,不受我们的干扰。为了说明这一点,我们可以绘制一段时间内的平均西格玛权重图。这是 1000 万步训练跑的结果,我们稍后会详细介绍:

因为噪声注入是按元素乘以该项,所以代理可以通过将 sigma 设置为 0 来学习忽略噪声。有趣的是,这种方法倾向于自然降至 0 以上,就像我们设计 epsilon 计划一样——确保在培训期间至少有一定程度的探索。

N 步 TD

我们要做的最后一个改进是在我们的损失函数中引入一个新项,这有助于代理人更接近理论上的累积折扣奖励。基本上,这:

变成了这样:

为了效仿这一点:

其中 n 是通常设置为 3 或 5 的超参数。这里的想法是通过从转换序列中引导来提高目标精度,这是一种位于时间差异中间的方法- >蒙特卡罗谱。你可以在这本教科书的第七章的中读到更多这方面的内容。

最终结果

同样,这些变化最好的部分是我们可以将它们堆叠到同一个超级充电算法中,大概称为 NoisyNet N 步优先化双决斗深度 Q 网络,这真的很棒。去年年底,当 DeepMind 在此基础上增加了一个东西时,他们开始将其称为“彩虹”,要么是因为他们在整个名称堆叠问题上认输,要么是因为一群博士坐在会议室里看着这张图表上的颜色,在创造力上出现了不幸的失误:

from Rainbow: Combining Improvements in Deep Reinforcement Learning

需要说明的是,这个额外的特性是distribution RL,其中代理学习预测每个动作的奖励分配。我们希望将来回到这个问题上来。

这是我们最终的 DQN 变体的学习曲线,根据之前的迭代绘制:

这最后几个扩展对提高整体性能和样品效率大有帮助——线对线地战胜了前两个版本。最后提醒一下:1000 万步并不足以对 dqn 的整体性能做出任何明确的评价。然而,我们引用/实现的所有论文都显示了在更长的时间范围内推断的类似结果,我们更短的实验表明,即使在更易管理的训练运行中,层次结构也是成立的。

我们让 NoisyNstepPDD 总共运行了 4000 万步。现在让我们看看它是怎么玩的。

我们现在一直在清理第一关,并在幽灵之间进行严密的机动,同时有目的地向左侧破折号导航,并充分利用屏幕两侧的捷径出口。最常见的死亡原因是遇到看不见的鬼魂,这是雅达利严格的精灵渲染限制造成的“小故障”。

DQN“看到”了什么?

玩 Atari 的 dqn 在卷积神经网络* (CNN)的帮助下理解屏幕,这是一系列卷积层,学会从一堆像素值中检测相关的游戏信息。不幸的是,我们没有给它直接从游戏屏幕学习的机会——计算资源需要一些捷径。相反,我们通过将原始尺寸缩小到更易于管理的 84 x 84 并转换为灰度来预处理原始输入。*

What we would see (left) vs. what our agent sees (right)

当然,这并不意味着我们丢弃了可能有用的颜色信息。例如,《吃豆人》中的每个彩色幽灵都有自己的人工智能,专业玩家可以利用这些差异来预测它们的去向,但我们的代理人不太可能区分它们。这样做是为了切断 RGB 图像的两个通道,从而大大减轻 CNN 的负担。还要注意,调整大小操作甚至设法删除了重影开始框左右两边的点的位置;幸运的是,这些通常是在吃豆人女士移动到迷宫的任何一边时偶然发现的。这些预处理步骤是 Atari RL 领域的一个非常标准的实践,所以我们决定在这里继续它们,即使它们没有针对这个特定的游戏进行优化。

我们用 4 个最近的帧的堆栈来填充现在空的第三维;这让代理了解每个精灵的速度和方向。

The stack of frames that makes up one complete input.

在上面的例子中,代理知道它正逆时针绕过一个拐角,并且知道一个水果最近出现并正在远离它。一堆帧也增加了对精灵闪烁效果的一些保护,因为假设每个幽灵至少每 4 帧渲染一次(这似乎并不总是如此)。

我们所有的实现都使用 DeepMind 从 2015 年开始的 CNN 架构,由三层组成。第一个学会识别 32 个低级特征。从概念上讲,我们可能期望一个特征通道跟踪剩余的点,一个跟踪鬼魂,另一个跟踪玩家,等等。通过访问该层的输出,并将其激活放置在输入堆栈中最近的帧上,我们可以了解他们实际上可能正在学习什么。可能我们发现的最令人惊讶的事情是我们经纪人的幽灵和球员追踪系统;我们的特工没有使用一个频道持续监视幽灵,而使用另一个频道来获得 Pac-man 女士在迷宫中的位置,而是学会了一种按委员会排列的雷达方法,其中一个频道可能一次跟踪一个幽灵,甚至根据画面切换幽灵。

Ghost-busting by committee: the agent uses an ensemble of feature channels to determine the position of the game’s sprites. Bright white spots indicate areas of high activation. The maze background is added for context.

在这个例子中,通道 13 和 16 似乎跟踪单个幽灵,而通道 22 跟踪玩家,通道 1 一次看到多个精灵。该系统远非完美,因为似乎没有一个特征地图来拾取中心开始区附近的幽灵。这个幽灵很可能会在未来的一帧中被识别出来,而代理人在任何一集的成功似乎都与这些“盲点”持续的时间有关。

尽管人类很难将这些特征概念化,但还有其他渠道可以获得非常具体的特征:

The agent has learned a number of well-defined features that are difficult to conceptualize and vary by frame. In this case, 29 and 0 might both be looking at the player; 28 and 11 are anyone’s guess.

更没用的是总噪音通道,40 米后仍有令人失望的数量。随着训练的继续,这可能会变得清晰,嘈杂的通道变窄,从上面看起来更像 11 和 28,而 11 和 28 本身可能会发展成更有用的表示。

High-noise activations

CNN 的伟大之处在于,随着你深入网络,它们的特征变得越来越抽象。我们可以在第三个也是最后一个卷积层的输出上使用 gradient-ascent 来生成类激活图,指示图像的哪些部分对代理的决策贡献最大。这种技术与跟踪玩视频游戏或看电影的人的眼球运动/注意力有一些相似之处。结果揭示了一个人类玩家可能认识到的决策过程。

The class activation map for the agent’s decision.

在这里,位于(20,30)的代理正来到一个十字路口,需要决定下一步去哪里。热图显示代理人的注意力集中在屏幕的左侧,并且非常紧密地聚集在剩余的点的路径周围。它还注意到(25,40)和中上部的鬼影,以及最右侧的小点群。它最终决定向右和向上,这相当于在这两个方向之间对角推动 Atari 操纵杆。有趣的是,与四个标准方向相比,我们的代理似乎更喜欢这些中间输入,这可能是因为迷宫的墙壁通常会使其中一个方向无效,所以同时尝试两个方向会更有效。也可能是因为这让吃豆人女士能够在没有完美画面输入的情况下绕过急转弯(游戏迫使她向右,直到第一帧没有墙在头顶上,然后通常让她向上),这是一个有用的策略,因为代理人每 4 帧只能做一次决定。

在这个例子中,从第一级的末尾,我们得到了一些经验证据,证明了我们第一次添加 PER 时所怀疑的东西——代理能够找出孤立的点。它知道从左边的三个幽灵那里是安全的,并且只关注最后剩下的点。

虽然他们的决策策略在表面上可能是相似的,但重要的是要记住,DQN 不像人类那样处理信息。它学习识别某些像素组是“好”还是“不好”。它避不了鬼,因为它连鬼是什么都不知道;它学会避免矩阵中的数字串,这些数字串与过去给它带来负面回报的数字串相似。一个人可以依靠过去的经验和外界的概念(“鬼是坏的,我应该跑”),DQN 什么都没有。最近的研究已经显示了这可以带来多大的优势,以及它可能是 RL 算法学习进度缓慢的一个重要原因。借用那篇论文中的一个图表,想象一下如果一个游戏看起来像这样,玩起来会有多困难:

这是怎么回事?我在控制什么?目标是什么?找到答案的唯一方法是尝试一些事情,看看会发生什么。欢迎来到你电脑看到的世界。

它将何去何从?

尽管 DQN 很伟大,但它仍有改进的空间和拓展的方向。首先,它学得非常慢。已经有很多关于快速启动 RL 算法的工作,使用来自模仿和少量学习的技术。直觉告诉我们,记忆机制也有优化的空间;我们已经根据重要性进行了抽样,但我们可以使用类似的指标来决定哪些体验应该保存,哪些应该覆盖。自 2015 年发布以来,广泛使用且我们在本文中保持不变的卷积架构基本上停滞不前;计算机视觉领域的最新进展会提高我们的特工理解周围环境的能力吗?此外,DQN 还得从头开始学习每一款新游戏;如果它可以从不同但相似的任务中获取知识,比如另一款基于迷宫的雅达利游戏《巫师世界》,并将其中一部分转移到《吃豆人》中,会怎么样?这将把我们从复制人类的表现带到复制人类的学习过程——利用一生的持续学习来应对全新的挑战。

——————

杰克·格雷斯比与扎比·优素福共同撰写

弗吉尼亚大学骑士机器学习

www.cavml.com

【2018 年 6 月

R 中的高级图像处理

原文:https://towardsdatascience.com/advanced-image-processing-in-r-210618ab128a?source=collection_archive---------2-----------------------

‘ImageMagick’是著名的开源库之一,可用于编辑和操作不同类型的图像(光栅&矢量图像)。是一个绑定到“ImageMagick”的 R 包,用于在 R 中进行高级图像处理,作者是耶鲁安·奥姆斯。

magick 支持 png、jpeg、tiff 等多种常见图像格式,以及旋转、缩放、裁剪、修剪、模糊、翻转、注释等操作。

这篇文章旨在帮助你开始使用magick来处理、编辑和操作 R 中的图像,这些图像可以是从文件格式转换(例如,png 到 jpeg)到注释 R 图形输出的任何内容。

magick可用在曲柄上,也可用在 ropensci 的 github 上。

#installing magick package from CRAN
install.packages('magick') 
#from Github ropensci library - note: requires RTools
devtools::install_github('ropensci/magick')

让我们加载库,用image_read()从互联网上读取我们的第一张图片

#Loading magick package
library(magick)#reading a png image frink image
frink <- image_read("https://jeroen.github.io/images/frink.png")
#reading a jpg image ex-President Barack Obama from Wikipedia
obama <- image_read('https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/President_Barack_Obama.jpg/800px-President_Barack_Obama.jpg')

确保你已经安装了一个更新版本的curl包,可以成功读取上面提到的图像。

我们可以通过image_info()获得读取图像的基本细节

#image details
image_info(obama)
image_info(frink)
image_info(obama)
  format width height colorspace filesize
1   JPEG   800    999       sRGB   151770image_info(frink)
format width height colorspace filesize
1    PNG   220    445       sRGB    73494

与 RStudio 通信,magick允许您在 RStudio 查看器窗格中打印/显示图像。

#displaying the image
print(obama)

无论你是一名网络开发人员,还是正在制作一套幻灯片,图像文件格式转换都是我们最终要做的操作之一,这实际上是使用magickimage_write()的一行程序。

#Rendering JPG image into SVG
image_write(obama, path = 'obama.svg', format = 'svg')

下面是我们从维基百科读到的奥巴马图片的 PNG 格式:

但是你可能会想,“嘿!这只是基本的图像处理。你没说这是高级的吗?”是的,随着好消息而来的是先进的东西,即magick支持管道%>%操作器。

这是我们将要做的:

#Applying Charcoal effect to Obama's image 
#and compositing it with frink's image
#and finally annotating it with a text
image_charcoal(obama) %>% 
  image_composite(frink)  %>%
  image_annotate("CONFIDENTIAL", size = 50, color = "red", boxcolor = "pink",
                 degrees = 30, location = "+100+100") %>%
  image_rotate(30) %>%
  image_write('obama_with_frink.png','png')

给出以下输出:

输出图像看起来如何?很有艺术感不是吗?)!

但这并不是科学家每天都想做的事情,相反,我们玩的是图,大多数时候想注释 R 图形输出,这里是你如何用magickimage_annotate()做到这一点

library(ggplot2)
img <- image_graph(600, 400, res = 96)
p <- ggplot(iris) + geom_point(aes(Sepal.Length,Petal.Length))
print(p)
dev.off()
img %>% image_annotate("CONFIDENTIAL", size = 50, color = "red", boxcolor = "pink",
                       degrees = 30, location = "+100+100")  %>%
  image_write('conf_ggplot.png','png')

给出此输出图像:

这只是对magick所能做的事情的一瞥。从字面上看,在 magick 中还有很多魔法。亲自尝试一下,并在评论中分享你的想法。这里使用的代码可以在我的 github 上找到。如果你对用 Python 建立深度学习的专业知识感兴趣,可以看看这个 Datacamp 课程。

参考文献:

1.Magick Ropensci2。 Magick CRAN 文档
3。奥巴马形象功劳
4。 Frink Image Credit

使用计算机视觉技术的自动车辆的高级车道检测

原文:https://towardsdatascience.com/advanced-lane-detection-for-autonomous-vehicles-using-computer-vision-techniques-f229e4245e41?source=collection_archive---------2-----------------------

在早期的 项目 中,我使用 Canny 和 Hough 变换分别检测颜色强度和置信度的变化,以检测车道线。该项目使用基于早期技术的高级技术,通过使用不同颜色空间和梯度的阈值、滑动窗口技术、扭曲透视变换和多项式拟合来检测车道线。如果你只对最终结果感兴趣,请跳转至 视频 。关于详细的讨论,请继续阅读。

实现本项目目标的一系列步骤如下:

  1. 计算摄像机校准矩阵和失真系数。

2.对原始图像应用失真校正。

3.使用颜色变换、渐变等。,以创建阈值化的二进制图像。

4.应用透视变换生成图像的“鸟瞰图”。

5.检测车道像素并拟合以找到车道边界。

6.确定车道的曲率和车辆相对于中心的位置。

7.将检测到的车道边界扭曲回原始图像,并显示车道曲率和车辆位置的数值估计。

让我们更深入地研究上面的每一个步骤,以详细理解这个过程。

  1. 计算摄像机校准矩阵和失真系数。

所有的相机都使用镜头,镜头的一个问题是它们有一些径向失真。为了消除这种失真,我在棋盘图像上使用 OpenCV 函数来计算正确的相机矩阵和失真系数。这可以通过找到图像内的内角并使用该信息来消除图像失真来实现。图 1 显示了左边的棋盘图像和右边检测到的该图像内的内角。

Fig 1. Calculating the camera matrix and distortion coefficients by detecting inside corners in a chessboard image (Source: Udacity)

失真矩阵用于消除校准图像的失真,并证明校准是正确的。图 2 中所示的示例显示了应用校准以消除棋盘图像失真后的前/后结果。

Fig 2. Before and after results of un-distorting a chessboard image (Source: Udacity)

2。对原始图像应用失真校正。

在步骤 1 中收集的相机校准数据可以应用于原始图像,以应用失真校正。图 3 中显示了一个示例图像。与棋盘图像相比,可能更难看出对原始图像应用扭曲校正的效果,但是如果您更靠近图像的右侧进行比较,当您查看应用扭曲校正时沿着树木轻微裁剪的白色汽车时,这种效果会变得更加明显。

Fig 3. Before and after results of un-distorting an example image (Source: Udacity)

3。使用颜色变换、渐变等。,以创建阈值化的二进制图像。

这一步骤背后的想法是创建一个图像处理管道,其中车道线可以被算法清楚地识别。通过尝试不同的渐变、阈值和色彩空间,有许多不同的方法可以找到解决方案。我在几幅不同的图像上试验了这些技术,并结合使用了阈值、色彩空间和渐变。我决定采用以下组合来创建我的图像处理管道:HLS 颜色空间中的 S 通道阈值和 HSV 颜色空间中的 V 通道阈值,以及检测车道线的梯度。图 4 示出了最终二进制阈值图像的例子,其中车道线清晰可见。

Fig 4. Before and after results of applying gradients and thresholds to generate a binary thresholded image (Source: Udacity)

4。应用透视变换生成图像的“鸟瞰图”。

图像具有透视性,这使得图像中的车道线看起来像是在远处会聚,即使它们彼此平行。当该透视被移除时,更容易检测车道线的曲率。这可以通过将图像转换为 2D 鸟瞰图来实现,其中车道线总是彼此平行。由于我们只对车道线感兴趣,我在原始未失真的图像上选择了四个点,并将透视转换为鸟瞰图,如下图 5 所示。

Fig 5. Region of interest perspective warped to generate a Bird’s-eye view (Source: Udacity)

5。检测车道像素并拟合以找到车道边界。

要检测车道线,有多种不同的方法。我使用了卷积,它是两个独立信号的乘积之和:窗口模板和像素图像的垂直切片。我使用了一个滑动窗口的方法来应用卷积,这将最大化每个窗口中的热点像素的数量。窗口模板在图像上从左向右滑动,任何重叠值相加在一起,产生卷积信号。卷积信号的峰值是像素重叠最高的地方,并且是车道标志最可能的位置。已经使用了多种方法来识别经矫正的二进制图像中的车道线像素。左线和右线已经被识别并用曲线多项式函数拟合。图 6 中示出了具有用滑动窗口方法和多项式拟合重叠识别的线像素的示例图像。

Fig 6. Sliding window fit results (Source: Udacity)

6。确定车道的曲率和车辆相对于汽车中心的位置。

我测量了车道线的位置,并估计了道路弯曲的程度,以及车辆相对于车道中心的位置。我假设摄像机安装在汽车的中央。

7 .。将检测到的车道边界扭曲回原始图像,并显示车道曲率和车辆位置的数值估计。

来自校正图像的拟合已经被扭曲回到原始图像上,并且被标绘以识别车道边界。图 7 展示了车道边界被正确识别并扭曲回到原始图像。图 8 中示出了具有车道、曲率和距中心的位置的示例图像。

Fig 7. Lane line boundaries warped back onto original image (Source: Udacity)

Fig 8. Detected lane lines overlapped on to the original image along with curvature radius and position of the car (Source: Udacity)

上述过程应用于视频的每一帧,关键步骤的最终结果显示在不同的帧中:

概要:

这种解决方案在正常照明条件下工作良好。然而,它需要改进以解决不同的用例。可以改进的一个例子是车道的一部分是新铺设的,而车道的另一部分是旧铺设的道路,颜色不同。在由于阳光直射而导致摄像机出现眩光的情况下,以及在车道线看起来被冲刷而使其更难检测的其他高对比度情况下,该算法也需要改进。这些类型的情况可以通过动态调整图像的对比度来解决,以确保图像中的车道线不会被洗掉,并确保该算法在所有照明条件下都具有良好的动态范围。在道路弯曲且有坡度的情况下,很难正确地扭曲图像,这可能会给算法带来问题。这个问题也可以通过为每个图像帧创建动态感兴趣区域来解决。这些是我以后需要探索的一些事情,以现有算法为基础,使其对于不同的用例都是健壮的。

如果你对技术细节感兴趣,可以查看我的 Github 资源库。

参考:所有的图片和视频都来自 Udacity,作为他们 SD 汽车纳米学位项目的一部分。原始图像上的增强信息是由我生成的,这是我开发的代码的输出。

使用 SQL 进行高级查询,节省您的时间

原文:https://towardsdatascience.com/advanced-queries-with-sql-that-will-save-your-time-48a45b7ca2e3?source=collection_archive---------8-----------------------

Photo by Kalen Emsley on Unsplash

是的,SQL 仍然存在

在处理电信数据的这些年里,我的代码片段文件夹收集了很多可重用的例子。它不是关于“从表 1 中选择”,我说的是查找和处理或删除重复值,从同一表内的每组数据中选择前 N 个值,在组内重排记录,但保持组排序,查找最长的左匹配,将数字扩展 N 位等等。

今天,我想分享这些片段,并解释它是如何工作的。我使用 Microsoft SQL Server,并在查询中使用 T-SQL,但我确信有可能找到其他 DBMS 的替代方案。如果没有,请联系我,我们会一起努力找到它🙂

在这篇文章中,我准备了一张表格,上面是用假号码和真实国家打来的假电话,所以如果你试图重复同样的交易,那是行不通的😀(好吧,除了英国,他们真的有+44 国家代码,但我不确定我用的号码是否存在)

处理重复

从表中只选择唯一值的最快、最简单的方法是使用 DISTINCT 关键字

SELECT DISTINCT *
FROM [test].[dbo].[12162018_FakeCalls]

通过指示我们想要检索的列,我们可以只根据数字和国家选择唯一的值。

SELECT DISTINCT NumberFrom, CountryFrom, NumberTo, CountryTo
FROM [test].[dbo].[12162018_FakeCalls]

但是我们丢失了来自其他列的信息。

我们还可以通过 GROUP BY、HAVING 和 COUNT(*)找到重复项

SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, count(*) as dups
FROM [test].[dbo].[12162018_FakeCalls]
GROUP BY NumberFrom, CountryFrom, NumberTo, CountryTo
HAVING COUNT(*) > 1
ORDER BY dups desc

我知道,在 SQL 数据库中不应该出现重复,你应该使用唯一的 id,约束和索引。但是有时候你只是执行一些测试,或者第一次做一些计算,做一些实验——副本就出现了。或者您的记录有不同的 id,尽管您知道应该删除其中的一个。在这些情况下你会怎么做?很久以前,我在 stackoverflow 上发现了这个解决方案,保存了下来,从那时起,我每天至少使用它几次(重复是很常见的,具体取决于工作)。WITH statement 和 ROW_NUMBER()是我的救星。

WITH CTE AS
( 
SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, Duration, id, RN = ROW_NUMBER()OVER(PARTITION BY NumberFrom, CountryFrom, NumberTo, CountryTo ORDER BY CountryFrom) 
FROM #t
)
SELECT * 
FROM CTE WHERE RN > 1

我已经将原始数据复制到临时表#t 中,因为删除后“撤销”不起作用,呵🙂我们看到了与 GROUP BY 相同的结果,尽管所有列都是如此。现在,我们可以在这里执行删除,并根据我们对重复的定义删除所有重复值。

WITH CTE AS
( 
SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, Duration, id, RN = ROW_NUMBER()OVER(PARTITION BY NumberFrom, CountryFrom, NumberTo, CountryTo ORDER BY CountryFrom) 
FROM #t
)
DELETE FROM CTE 
WHERE RN > 1;SELECT *
FROM #t

在这种情况下,PARTITION BY 将作为重复定义,例如,通过 ORDER BY,我们可以删除持续时间较短/较长的呼叫,或开始时间较早/较晚的呼叫,或者您在其他列中可能发现的任何情况。请注意,ORDER BY 子句在这里是必须的,所以如果您没有任何特定的排序条件,只需在那里输入任何字段。

选择组内的前 N 条记录

我相信你已经知道怎么做了:d .是的,再用 ROW_NUMBER()。该函数将对我们的数据进行分区,并为一个组中的每条记录分配一个编号,因此我们只需指定我们想要选择前 N 名中的哪个范围:前 10 名?— RN = 3 且 RN

让我们只选择拨打电话的国家组(‘country from’)中名称以相同字母开头的前 2 名记录,并按组内持续时间对值进行排序。(我已经将相同的数据插入临时表 3 次,以便更好地查看差异)

WITH CTE AS
( 
SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, Duration, id, RN = ROW_NUMBER()OVER(PARTITION BY LEFT(CountryFrom,1) ORDER BY Duration ASC) 
FROM #t
)
SELECT *
FROM CTE;

看看德国和希腊是如何被归为一类,而爱尔兰和意大利又是如何被归为另一类。并仅选择每个组中第二个记录:

WITH CTE AS
( 
SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, Duration, id, RN = ROW_NUMBER()OVER(PARTITION BY LEFT(CountryFrom,1) ORDER BY Duration ASC) 
FROM #t)
SELECT * 
FROM CTE
WHERE RN = 2;

在组内随机播放记录

实际上,这种技术在任何情况下都可以用来混洗记录,不仅是在组内,而且因为我们已经开始使用 groups、ROW_NUMBER 和语句,所以我决定让它稍微复杂一点。我不知道在你生命中的任何一个时期,你是否需要在一个团队中洗牌,但是如果出现这种情况,你知道如何去做。同样,这是我日常工作的一部分,我知道这是一项罕见的任务:)所以回到查询。我们将使用相同的分组条件,为了进行混排,将组合使用函数 ABS() —用于获取作为参数传递的数字的绝对值的函数,CHECKSUM() —返回通过表行或表达式列表计算的校验和值的函数,以及 NEWID() —创建 uniqueidentifier 类型的唯一值。阅读时,你可能会想——管它呢?但我告诉你,它起作用了。看:

WITH CTE AS
( 
SELECT NumberFrom, CountryFrom, NumberTo, CountryTo, CallStarted, Duration, id, RN = ROW_NUMBER()OVER(PARTITION BY LEFT(CountryFrom,1) ORDER BY ABS(CHECKSUM(NewId())) % 1000000 DESC) 
FROM [test].[dbo].[12162018_FakeCalls]
)
SELECT * 
FROM CTE;

对于少量数据来说,这可能不是那么明显,但是最令人兴奋的是,每次运行这个查询时,它都会重新排序。所以在第二次运行后:

你可能注意到了,波兰是第一个记录,西班牙是第二个。

今天到此为止。关于 ROW_NUMBER()的一些提示对我的工作很有帮助,我希望对其他人也有帮助。

尽管它不包括机器学习、人工智能、图像识别、模型调整、深度神经网络或数据科学领域出现的任何其他花哨术语,但使用 SQL 处理数据仍然是数据科学的一部分。仍然有许多数据专业人员使用这种语言和关系数据库。伙计们,别忘了我们的根。

感谢你的阅读,保持冷静,专业,祝你有美好的一天。

原载于 2018 年 12 月 16 日【sergilehkyi.com4 种不同语言(EN、es、UA、RU)

超越 DQN/A3C:高级强化学习综述

原文:https://towardsdatascience.com/advanced-reinforcement-learning-6d769f529eb3?source=collection_archive---------3-----------------------

我最喜欢深度强化学习的一点是,与监督学习不同,它真的真的不想工作。用神经网络解决计算机视觉问题可能会让你达到 80%的目标。在 RL 问题上扔一个神经网络可能会在你面前炸掉一些东西——而且每次你尝试的时候它都会以不同的方式炸掉。

RL 中的许多最大挑战围绕着两个问题:我们如何有效地与环境互动(例如探索与开发,样本效率),以及我们如何有效地从经验中学习(例如长期信用分配,稀疏的奖励信号)。在这篇文章中,我想探索深度 RL 研究中试图解决这些挑战的几个最新方向,并与人类认知进行特别优雅的类比。我特别想谈谈:

  • 分层 RL,
  • 记忆和预测建模,以及
  • 结合无模型和基于模型的方法。

这篇文章将首先快速回顾两个典型的深度 RL 算法——DQN 和 A3C——为我们提供一些直观的参考,然后深入研究一些最近的论文和上述类别中的突破。

审查:DQN 和 A3C/A2C

免责声明:我假设你对 RL 有一些基本的了解(因此不会提供关于这两种算法的深入教程),但是即使你不是 100%了解它们是如何工作的,这篇文章的其余部分仍然是可以访问的。

DeepMind 的 DQN (deep Q-network) 是将深度学习应用于 RL 的首批突破性成功之一。它使用神经网络来学习经典 Atari 游戏(如 Pong 和 Breakout)的 Q 函数,允许模型直接从原始像素输入到动作。

在算法上,DQN 直接借鉴了经典的 Q 学习技术。在 Q 学习中,状态-动作对的 Q 值或“质量”是通过基于经验的迭代更新来估计的。本质上,随着我们在一个状态中采取的每一个动作,我们可以使用我们收到的即时奖励和我们的状态的价值估计来更新我们的原始状态-动作对的价值估计:

训练 DQN 包括最小化时间差异误差或 TD 误差的 MSE(均方误差),如上所示。DQN 为深度神经网络调整 Q 学习所采用的两个关键策略是:

  • 体验重放,其中每个状态/动作转换元组(s,a,r,s’)被存储在存储器“重放”缓冲器中,并被随机采样以训练网络,允许训练数据的重复使用和连续轨迹样本的去相关;和
  • 使用单独的目标网络(上述等式中的 Q_hat 部分)来稳定训练,因此 TD 误差不是根据训练网络中不断变化的目标来计算的,而是根据由大部分固定的网络生成的稳定目标来计算的。

随后,DeepMind 的 A3C(异步优势演员评论家)和 OpenAI 的同步变体 A2C,推广了一种非常成功的基于深度学习的方法演员评论家方法

行动者-批评家方法结合了政策梯度方法学习价值函数。对于 DQN,我们只有学习价值函数——Q 函数——我们遵循的“政策”只是在每一步采取最大化 Q 值的行动。对于 A3C,就像其他的 actor-critic 方法一样,我们学习两种不同的功能:策略(或“actor”)和价值(即“critic”)。该策略基于采取该行动的当前估计的优势来调整行动概率,并且价值函数基于通过遵循该策略收集的经验和奖励来更新该优势:

从上面的更新中我们可以看到,价值网络学习了一个基线状态值V(s _ I;θ_v) 我们可以用它来比较我们当前的回报估计 R,以获得“优势”,策略网络通过经典的增强算法基于该优势来调整行动的对数概率。

A3C 的真正贡献来自它的并行和异步架构:多个参与者-学习者被分派到环境的不同实例中;它们都与环境交互并收集经验,并将它们的梯度更新异步地推送到一个中心“目标网络”(一个从 DQN 借鉴来的想法)。后来,OpenAI 向 A2C 展示了异步性实际上并不会提高性能,事实上还会降低采样效率。不幸的是,这些架构的细节超出了本文的范围,但是如果分布式代理让你兴奋,就像它们让我兴奋一样,请确保你查看了 DeepMind 的IMPALA——对于扩大学习非常有用的设计范例。

DQN 和 A3C/A2C 都可以是强大的基线代理,但当面对更复杂的任务、严重的部分可观测性和/或行动与相关奖励信号之间的长时间延迟时,他们往往会受到影响。因此,RL 研究的整个子领域已经出现来解决这些问题。让我们进入一些好的东西:)。

分层强化学习

分层 RL 是一类强化学习方法,它从多层策略中学习,每层策略负责在不同的时间和行为抽象级别进行控制。最低级别的策略负责输出环境动作,而较高级别的策略可以自由地操作更抽象的目标和更长的时间范围。

为什么这如此吸引人?首先,在认知方面,研究长期以来认为人类和动物的行为是由等级结构支撑的。这在日常生活中是很直观的:当我决定做饭时(顺便说一下,基本上从来没有,但为了便于讨论,让我们假设我是一个负责任的人),我能够将这项任务分成更简单的子任务:切菜、煮意大利面等。没有忘记我做饭的首要目标;我甚至能够交换子任务,例如煮饭而不是做意大利面,来完成同样的目标。这暗示了现实世界任务中固有的层级组合性,其中简单的原子动作可以被串在一起、重复和组合以完成复杂的工作。近年来,研究甚至发现了 HRL 成分和前额叶皮层内特定神经结构之间的直接联系。

在技术研发方面,HRL 特别有吸引力,因为它有助于解决我在第二个问题中提到的两个最大的挑战,即如何有效地从经验中学习:长期信用分配稀疏的奖励信号。在 HRL,因为低级策略根据高级策略分配的任务从内在奖励中学习,所以尽管奖励很少,原子任务仍然可以被学习。此外,由高级策略开发的时间抽象使我们的模型能够处理时间扩展体验上的信用分配。

那么它是如何工作的呢?有许多不同的方法来实现 HRL。Google Brain 最近的一篇论文采用了一种特别干净简单的方法,并为数据高效训练引入了一些不错的非政策修正。他们的模型叫做 HIRO。

μ_hi is the high-level policy, which outputs “goal states” for the low-level policy to reach. μ_lo, the low-level policy, outputs environment actions in an attempt to reach that goal state observation.

想法是这样的:我们有两层政策。高级策略被训练以最大化环境回报 r。每 c 时间步,高级策略采样一个新的动作,这是低级策略要达到的“目标状态”。低级策略被训练来采取环境动作,这些环境动作将产生类似于给定目标状态的状态观察。

考虑一个简单的例子:假设我们正在训练一个机器人按照一定的顺序堆叠彩色立方体。如果任务成功完成,我们最终只能获得一个+1 的奖励,而在所有其他时间点,奖励为 0。直觉上,高层策略负责提出需要完成的子目标:也许它输出的第一个目标状态是“观察你面前的红色立方体;下一个可能是“观察红色立方体旁边的蓝色立方体;然后“观察红色立方体上的蓝色立方体。”低级策略在环境中摸索,直到它提出产生这些观察所必需的动作序列,例如,拿起蓝色立方体并将其移动到红色立方体之上。

HIRO 使用 DDPG (深度确定性策略梯度)训练目标的变体来训练低级策略,其内在回报被参数化为当前观察和目标观察之间的距离:

DDPG 是另一个开创性的深度 RL 算法,它将 DQN 的思想扩展到了连续的动作空间。这是另一种行动者-批评者方法,它使用政策梯度来优化政策,但不是像 A3C 那样根据优势来优化政策,而是根据 Q 值来优化政策。因此,在 HIRO,最小化的 DDPG 邻近误差变成:

同时,为了使用非策略经验,用非策略修正训练高级策略。想法是这样的:为了提高样本效率,我们希望使用某种形式的重放缓冲区,比如 DQN。然而,旧的经验不能直接用于训练高层政策。这是因为低级策略在不断学习和变化,所以即使我们以与旧经验相同的目标为条件,我们的低级策略现在也可能表现出不同的动作/转换。HIRO 提出的政策外纠正是追溯性地改变政策外经验中的目标,以最大化观察到的行动顺序的可能性。换句话说,如果重放经验表明旧代理采取了动作( x,y,z )以达到目标 g ,我们发现目标 将使当前代理最有可能采取那些相同的动作( x,y,z ),即最大化动作序列的对数概率:

高层次的政策随后被训练成 DDPG 版本的行动、新目标和环境回报。

HIRO 当然不是接近 HRL 的唯一途径。封建网络是一个更早的相关工作,它使用一个习得的“目标”表示,而不是原始的状态观察。事实上,研究中的许多变化源于学习有用的低级子政策的不同方法;许多论文使用了辅助或“代理”奖励,还有一些论文尝试了预训练或多任务训练。与 HIRO 不同,这些方法中的许多需要一定程度的手工工程或领域知识,这固有地限制了通用性。另一个最近探索的选择是使用基于人口的训练(PBT) ,另一个我个人很喜欢的算法。本质上,内部奖励被视为额外的超参数,PBT 在训练过程中学习这些超参数在“进化”人群中的最优进化。

HRL 现在是一个非常受欢迎的研究领域,很容易与其他技术相结合(查看这篇论文结合 HRL 和模仿学习)。然而,就其核心而言,这只是一个真正直观的想法。它是可扩展的,具有神经解剖学的相似性,并解决了 RL 中的一系列基本问题。就像其他优秀的 RL 一样,训练起来会很棘手。

记忆和注意力

现在让我们谈谈解决长期信用分配和稀疏奖励信号问题的其他一些方法。具体来说,我们来说说最明显的方式:让代理人真正擅长记忆事物

深度学习中的记忆总是很有趣,因为尽管研究人员可能会尝试(事实上,他们也确实在尝试),但很少有架构能打败一个调整良好的 LSTM。然而,人类的记忆并不像 LSTM 那样工作;当我们处理日常生活中的任务时,我们回忆并关注特定的、与环境相关的记忆,除此之外别无其他。当我回到家,开车去当地的杂货店时,我用的是过去 100 次驾驶这条路线的记忆,而不是如何从卡姆登镇到伦敦皮卡迪利广场的记忆——即使这些记忆在最近的经历中是新鲜的。从这个意义上来说,我们的记忆看起来几乎可以通过上下文来查询:根据我在哪里和我在做什么,我的大脑知道哪些记忆对我有用。

在深度学习中,这是外部的、基于键值的内存存储背后的驱动论点。这个想法并不新鲜;神经图灵机,我读过的第一篇也是最喜欢的论文之一,用一个可微分的外部存储器来增强神经网络,可通过向量值的“读”和“写”头访问特定位置。我们可以很容易地想象这被扩展到 RL,在任何给定的时间步,一个代理被给予与其当前状态相关的环境观察记忆。这正是最近的 MERLIN 架构的延伸。

MERLIN 有两个组件:一个基于记忆的预测器(MBP) 和一个策略网络。MBP 负责将观察值压缩成有用的低维“状态变量”,直接存储到键值存储矩阵中。它还负责将相关内存传递给策略,策略使用这些内存和当前状态来输出操作。

这个架构看起来可能有点复杂,但是请记住,策略只是一个经常性的净输出操作,MBP 实际上只做 3 件事:

  • 将观察结果压缩成有用的状态变量 z_t 以传递给策略,
  • 将 z_t 写入存储矩阵,以及
  • 获取其他有用的记忆传递给政策。

流水线看起来像这样:输入观察首先被编码,然后通过 MLP 馈送,其输出被添加到下一个状态变量上的先验分布,以产生后验分布。这个后验分布以所有先前的动作/观察以及这个新的观察为条件,然后被采样以产生状态变量 z_t。接下来,z_t 被馈入 MBP 的 LSTM,其输出用于更新先验,并通过向量值“读密钥”和“写密钥”从存储器读取/写入,这两者都是作为 LSTM 隐藏状态的线性函数产生的。最后,在下游,策略网利用来自内存的 z_t 和 read 输出来产生一个动作。

一个关键的细节是,为了确保状态表示是有用的,MBP 也被训练来从当前状态 z_t 预测奖励,因此学习到的表示与手头的任务相关。

梅林的训练有点复杂;由于 MBP 的目的是作为一个有用的“世界模型”,一个棘手的目标,它被训练来优化变分下限(VLB)损失。(如果你对 VLB 不熟悉,我发现这篇文章相当有用,但你真的不需要它来理解梅林)。VLB 的损失有两个组成部分:

  1. 下一个状态变量的先验概率分布和后验概率分布之间的KL-散度,其中后验概率还取决于新的观测值。最小化这个 KL 确保这个新的状态变量与先前的观察/动作一致。
  2. 状态变量的重建损失,其中我们试图重现输入观察(如图像、先前动作等。)并基于状态变量预测奖励。如果这种损失很小,我们已经找到了一个状态变量,它是观察的精确表示,并且对于产生给予高回报的行动是有用的。

这是我们最后的 VLB 损失,第一项是重建,第二项是 KL 散度:

政策网络的损失是我们上面讨论的 A3C 的政策梯度损失的一个稍微花哨的版本;它使用一种称为广义优势估计算法的算法,其细节超出了本文的范围(但可以在 MERLIN 论文的附录的第 4.4 节中找到),但它看起来类似于下面显示的标准政策梯度更新:

一旦经过训练,MERLIN 应该能够通过状态表示和记忆对世界进行预测建模,并且它的策略应该能够利用这些预测来采取有用的行动。

梅林并不是唯一一个使用外部记忆存储的深度 RL 作品——早在 2016 年,研究人员就已经在 MQN 或记忆 Q 网络中应用这一想法,以解决《我的世界》的迷宫——但这种使用记忆作为世界预测模型的概念有一些独特的神经科学牵引力。另一个 Medium post 在探索这个想法方面做了很好的工作,所以我不会在这里重复,但关键的论点是,我们的大脑很可能不像大多数神经网络所解释的那样,充当“输入-输出”机器。相反,它的功能是预测引擎,我们对世界的感知实际上只是大脑对我们感官输入原因的最佳猜测。神经科学家阿米尔·塞斯很好地总结了赫尔曼·赫尔姆霍茨 19 世纪的理论:

大脑被锁在一个骨质头骨里。它接收到的都是模棱两可、嘈杂的感官信号,只与世界上的物体间接相关。因此,感知必须是一个推理过程,在这个过程中,不确定的感官信号与之前对世界的期望或“信念”相结合,形成大脑对这些感官信号原因的最佳假设。

梅林基于记忆的预测器旨在实现预测推理的这一目的。它对观察结果进行编码,并将它们与内部先验结合起来,以生成一个“状态变量”,该变量捕获输入的一些表示(或原因),并将这些状态存储在长期记忆中,以便代理可以在以后对它们采取行动。

代理人、世界模型和想象力

有趣的是,大脑作为预测引擎的概念实际上将我们带回了我们想要探索的第一个 RL 问题:我们如何有效地从环境中学习?毕竟,如果我们不直接从观察到行动,我们应该如何最好地与我们周围的世界互动和学习?

传统上在 RL 中,我们既可以进行无模型学习,也可以进行基于模型的学习。在无模型 RL 中,我们学习将原始环境观察直接映射到值或动作。在基于模型的 RL 中,我们首先学习基于原始观察的环境的转换模型,然后使用该模型来选择动作。

The outside circle depicts model-based RL; the “direct RL” loop depicts model-free RL

能够基于一个模型进行计划比在无模型学习中必须从纯粹的试错中工作要高效得多。然而,学习一个好的模型通常是非常困难的,并且由于模型的不完善而产生的复合误差通常会导致代理的不良性能。出于这个原因,deep RL 的很多早期成功(比如 DQN 和 A3C)都是无模型的。

也就是说,早在 1990 年的 Dyna 算法中,无模型和基于模型的 RL 之间的界限就已经模糊了,在该算法中,学习的模型被用来生成模拟的经验,以帮助训练无模型策略。现在在 2018 年,一种新的“想象力增强的代理”算法被引入,直接结合了这两种方法。

想象增强代理(I2A) 中,最终策略是无模型组件和基于模型组件的函数。基于模型的组件被称为代理对世界的“想象”,由代理内部学习的模型推出的想象轨迹组成。然而,关键是基于模型的组件在末端也有一个编码器,它聚集想象的轨迹并由解释,使代理能够在必要时学会忽略它的想象。从这个意义上说,如果代理发现它的内部模型正在投射无用和不准确的轨迹,它可以学习忽略该模型,继续使用它的无模型手臂。

上图描述了 I2A 的工作方式。观察首先被传递给无模型和基于模型的组件。在基于模型的组件中, n 不同的轨迹是基于在当前状态下可能采取的 n 种可能的动作而“想象”出来的。这些轨迹是通过将动作和状态输入到内部环境模型中,转换到新的想象状态,在该状态下采取最大的下一个动作等等而获得的。经过提炼的想象策略(通过交叉熵损失与最终策略保持相似)选择下一步行动。在一些固定的 k 步骤之后,这些轨迹被编码和聚集在一起,并与无模型组件的输出一起被馈送到策略网络中。至关重要的是,编码允许政策以最有用的方式解释想象的轨迹——适当时忽略它们,提取可用的非奖励相关信息,等等。

该策略通过标准策略梯度损失与优势进行训练,类似于 A3C 和 MERLIN,因此现在看起来应该很熟悉:

此外,在实际策略和内部模型的假想策略之间添加了策略提取损失,以确保假想策略选择与当前代理类似的动作:

I2A 优于许多基准,包括 MCTS(蒙特卡罗树搜索)规划算法。它还能够在实验中表现良好,其中其基于模型的组件被有意限制为做出较差的预测,这表明它能够在必要时权衡模型的使用以支持无模型方法。有趣的是,具有较差内部模型的 I2A 实际上最终略微优于具有良好模型的 I2A,作者将其归因于随机初始化或最终提供某种形式的正则化的嘈杂内部模型,但这肯定是进一步研究的领域。

无论如何,I2A 是迷人的,因为在某些方面,它也正是我们在这个世界上的行为方式。我们总是根据我们所处环境的一些心理模型来规划和预测未来,但我们也倾向于意识到我们的心理模型可能完全不准确——尤其是当我们处于我们从未见过的新环境或情况下。在这种情况下,我们通过试错法进行,就像无模型方法一样,但我们也使用这种新的体验来更新我们的内部心理模型。

现在有很多工作在结合基于模型和无模型的方法。Berkeley AI 提出了一个时间差异模型(TDM) ,它也有一个非常有趣的前提。这个想法是让代理设置更多的时间抽象目标,即“在 k 时间步骤中处于 X 状态”,并学习那些长期模型转换,同时最大化每个 k 步骤中收集的奖励。这让我们在行动的无模型探索和基于模型的高层次目标规划之间实现了平稳过渡——如果你仔细想想,这有点让我们回到了分层 RL 中的直觉。

所有这些研究论文都专注于同一个目标:实现与无模型方法相同(或更好)的性能,并具有与基于模型的方法相同的样本效率。

结论

深度 RL 模型真的很难训练。但由于这一困难,我们被迫提出了一系列令人难以置信的策略、方法和算法,以利用深度学习的力量解决经典(和一些非经典)控制问题。

这篇文章是对 deep RL 的一个非常、非常不完整的调查——有很多研究我还没有涉及,还有更多我甚至不知道。然而,希望这种在记忆、层次和想象力方面的零星研究方向提供了一瞥,让我们可以开始解决该领域中一些反复出现的挑战和瓶颈。如果你认为我错过了一些重要的东西,我可能是——让我在评论中知道是什么吧。:)同时,祝 RL 黑客快乐!

使用 Python、Matplotlib 和 Seaborn 实现高级体育可视化

原文:https://towardsdatascience.com/advanced-sports-visualization-with-pandas-matplotlib-and-seaborn-9c16df80a81b?source=collection_archive---------7-----------------------

如何从最具竞争力的游戏中获得有价值的见解的详细教程

Photo by Lukas Blazek on Unsplash

“一张照片的最大价值在于它能迫使我们注意到我们从未想过会看到的东西。”

你已经在新闻中看到了这一切:媒体大肆宣传体育分析时代的到来,商业广告描绘了像袖珍计算器这样的大数据工具,专家使用多维相机收集体育运动员每一滴汗水的细节**输入你童年时代的英雄名字:L .梅西、勒布朗·詹姆斯、汤姆·布拉迪等 * *并将他们的表现提高 10 倍。

虽然显然我们还没有完全实现,但体育分析已经在帮助球队做出决策方面取得了很大进展,这些决策传统上是由“直觉”感觉或对过去传统的坚持做出的,如选择哪些球员、交易、发展、教练以及使用哪种系统。

在这篇博客文章中,我不会开发一种算法来预测托特纳姆有多大可能(不太可能)进入英超前四,或者如何为 2018 年建立一支完美的喷气机队。相反,我将介绍一些可视化技术,这将有助于我们准备引人注目和有见地的图表,以吸引你的体育爱好者同伴。

注意:

  • 尽管我的例子只限于足球和 FIFA 世界杯,但这些技巧适用于任何运动和比赛。
  • 你可以在这里找到这个教程的所有源代码。

Details of all shots France team attempted across their 7-match World Cup campaign. You will be able to create this visualization by the end of this tutorial. Original image of Mbappe is by adi-149 via DevianArt

1.获取数据:

坏消息:这通常是最难的部分

虽然你可以毫无困难地收集体育赛事的统计数据(足球比赛中的进球,篮球比赛中的投球,等等。),通常很难找到一场特定足球比赛或网球比赛的详细、详细的数据集。跟踪球场上的球员,尤其是像足球或篮球这样的高节奏、高强度的运动,是一项艰巨的任务,尽管利润非常丰厚。SportVu 或 Opta Sports 等公司通过向团队、体育咨询公司或研究中心出售这些备受追捧的信息来赚钱。

“每场比赛,我们都有三个人使用[……]球场图形上的实时视频:一个人观看主队比赛,另一个人观看客场比赛,第三个人基本上是一名数据检查员。”

—西蒙·巴努布,Opta 营销总监

我们的无名英雄

最近,Statsbomb 宣布公开发布了最近三个足球联赛的每场比赛的详细比赛,第二精确的数据集:国家女子足球联盟(美国),英国足球协会女子超级联赛(英格兰),以及 2018 年国际足联世界杯。你可以免费访问他们的数据集这里。

数据集都是 json 格式的,所以您需要将原始数据集解析成一种关系格式,以便于检索和操作。

json_normalize() 是一个非常方便的工具,因为它可以自动将 json 结构“规范化”成扁平的关系结构。

在本教程中,我们将专注于 2018 年国际足联世界杯。我鼓励您在开始分析之前阅读数据集的文档。毕竟,理解你的数据是最重要的。

2。画足球场:

首先,让我们用 Matplotlib 画一个简单的足球场。

这看起来很多,但是让我们一行一行地解开 draw_pitch() 函数。该函数接受一个 ax 参数,它是 Matplotlib 中 add_subplot() 函数的输出。然后,它添加几个具有预定义尺寸的对象来重新创建一个足球场的图像,包括中心圆、罚球区、6 码框和球场中的弧线。一旦我们定义了这个函数,我们调用与标准 Matplotlib 一起的图形函数如下:

A nice football pitch constructed with no more than rectangles, circles and arcs

3.使用通道图和热图提升您的可视化程度:

2018 FIFA 世界杯最震撼的瞬间是什么?

Image by Дмитрий Садовников via Wikipedia

有许多竞争者,但很少有人能打败当时的卫冕冠军德国队被韩国队淘汰出世界杯的那一刻。有痛苦,有眼泪,当然,也有批评。令人清醒的失败的后果是德国 10 号人物梅苏特·厄齐尔的离开,他承担了几乎所有的责任,既因为他的表现,也因为他在世界杯前与土耳其总统埃尔多安的会晤。听听拜仁主席乌利·赫内斯对厄齐尔说了些什么:

“他多年来一直在玩 s游戏,现在他和他的 s表演隐藏在这张照片之外。”

但是,他有那么坏吗?

让我们看看他在广受批评的对阵韩国的比赛中的表现。我想绘制一张热图和传球图来捕捉他在 90 分钟内的表现,并评估他对德国队进攻端的影响(无论是积极的还是消极的)。

先来一张过关图

我们加载 json 文件,并在 Panda 中进行一些基本的数据清理,以获得一个只包含梅苏特·厄齐尔路过事件的数据集。

What our condensed dataset looks like. You can extract more information: pass_complete_status, etc.

这个数据集非常有意义,也就是说,人们可以发现厄齐尔在比赛中尝试了多达 95 次传球,其中有 7 次非常犀利,这对于一名攻击型中场来说是非常令人印象深刻的,或者说他在比赛中把球传给托尼·克罗斯(19 次)和马尔科·罗伊斯(18 次)。就通行证地图而言,我们只关心通行证的开始和结束位置

下面的代码允许我们将传球作为箭头覆盖到我们的球场上

Looks pretty good but we can do even better. I will come back to how a little tweak can make this plot a lot more informative

用热图追踪活跃区

俱乐部内部和媒体分析师使用足球热图来说明球员所在的区域。它们实际上是玩家位置的平滑散点图,可以很好地显示玩家在球场不同位置的效率。虽然可能会有一些关于它们有多大用处的争论(它们不会告诉你动作/运动是好是坏!),它们通常非常具有美感和吸引力,因此很受欢迎。

现在,如果我们回到梅苏特·厄齐尔,他面临的一个主要批评是低覆盖率,因为我们很少看到他发起铲球或争抢控球权,因此,正如他们所说的,“低水平的工作率”。

但事实真的是这样吗?

让我们在 Matplotlib 上使用 Seaborn 绘制一个热图,以可视化梅苏特厄齐尔在德国与韩国比赛的 90 分钟内的参与。代码的语法非常简单。我们使用 kdeplot,它将绘制厄齐尔位置的散射点的核密度估计。

哇!!!那看起来非常…反气候。毕竟,图表想要告诉你什么?我看到了一些坐标,显然这些轮廓图似乎表明厄齐尔在颜色较深的区域更活跃。

我们还能做得更好吗?

是的,答案是我们可以结合(1)球场,(2)传球图和(3)热图,以便对厄齐尔在比赛中的表现有一个更全面的看法

Notice that I also color the passes differently, as the blue arrows indicate passes made in the first half, and the red arrows second half

现在我们可以更全面地了解梅苏特·厄齐尔在比赛中的表现。一些即时的观察结果:

  • 他几乎只防守对手的半场,所以对他缺乏防守心态的批评不是完全没有根据的。但问题是,他是否有望以 1 比 1 获胜,并作为凸轮回收球?
  • 他在下半场更多的向前和直接传球,与上半场更多的保守和向后传球形成对比。可能有两个原因:(1)下半场德国队内部有一种普遍的紧迫感(2)引进马里奥·戈麦斯作为中锋确实为厄齐尔的关键传球提供了一个出口,因为我们看到总共有 6 次传球直接传入禁区,是他在上半场的三倍。

我发现有趣的是蒂莫·韦尔纳的传球路线,他开始是德国队的单前锋,然后在下半场的大部分时间里与马里奥·戈麦斯搭档。

令人惊讶的是,他在两边花了很多时间,而你会认为中锋在 18 码区占据了更多的空间。这部分解释了德国进攻线在比赛中的无效性,因为他们的前锋线(Werner,Reus,Goretzka,然后是 Muller,Gómez)挤在边路,但未能在禁区内占据空间,从而为厄齐尔和 Kroos 等组织者提供了很少的出口将球送入 18 码禁区。

4。测试你的技能:法国远程努力的案例

我的一个朋友非常确信,法国世界杯成功的关键是他们不懈地试图用远射打破防线。想想本杰明·帕瓦尔在四分之一决赛中对阿根廷的那个精彩进球

我们可以再次尝试想象法国队的所有射门,以确定他们的大多数进球是来自禁区外还是禁区内?

如果我只是按照到目前为止显示的方法,这就是我得到的

Shot taken by France team during the World Cup campaign

这很好。但是,我们可以做更多的工作,使可视化更有吸引力和洞察力。具体来说,我做了两个小调整:

(1)由于我们只关注镜头,这些镜头都是在球场的一侧记录的,所以我将只画出球场的右半边

(2)由于我们只关心射击的起点,我们可以扔掉箭头,只把射击想象成散点图,其中 x,y 是尝试射击的位置。

现在看起来好多了。我们可以马上看到,法国队在禁区内的射门次数和他们在禁区外的射门次数一样多。虽然在一定程度上,这确实支持了法国队比平时付出更多远射努力的论点,因为我们预计禁区外的射门密度会低得多。无论如何,看起来很有趣的是,短期和长期的努力看起来是一样的客观。

在我的 Jupyter 笔记本中,你还可以找到更多的技术,比如叠加密度图和将图像包含到你的可视化中。再多几行代码,您就可以轻松地生成这样的可视化效果:

你可以在这里找到本教程的所有源代码

本项目使用的数据由 Statsbomb 发布,并在此向公众公开

使用 react-vis 实现高级可视化

原文:https://towardsdatascience.com/advanced-visualization-with-react-vis-efc5c6667b4?source=collection_archive---------4-----------------------

使用 Voronois、单程渲染和画布组件获得惊人的用户体验

所以你已经开始用 react-vis 做一些数据可视化,你已经建立了一些你自己的图表,也许你已经读过shyanovska Nataliia的精彩介绍用 react-vis 做数据可视化,或者甚至可能建立了一个仪表板。是时候学习一些处理更大数据量和更复杂 UI 交互的技术了。在这篇文章的过程中,我们将看到如何使用单程渲染,画布部件,去抖动状态更新,和 Voronois。系好安全带,这将是一次疯狂的旅程!

首先,您可以使用 create-react-app 设置 scaffold a new app,然后在终端中运行

npm install react-vis --save
# we will also be using a few additional libraries 
# so install these too
npm install --save d3-fetch d3-scale d3-scale-chromatic debounce simplify-js

也就是说,我为我的应用程序使用了稍微不同的配置,你可以在这里查看(以及整篇文章的代码)。

获取和准备数据

学习如何做任何事情的一个传统技巧是模仿大师,这篇文章也不例外。我们将探索纽约时报 2016 年的可视化“斯蒂芬库里的 3 分记录”。

[## 斯蒂芬·库里的 3 分记录:超出图表

这张图表有 752 行——每一行代表一名 NBA 球员,他们在每场比赛中的三分球命中率都排在前 20 位

www.nytimes.com](https://www.nytimes.com/interactive/2016/04/16/upshot/stephen-curry-golden-state-warriors-3-pointers.html)

在这个可视化中有很多事情正在发生!每一行显示了一个特定的球员在特定的赛季中投中三分球的次数。这个信息可以通过一个动态的鼠标指针来访问,鼠标指针同时会突出显示特定的玩家年份,并提供一个工具提示来准确描述用户所停留的行。

我们的第一步将是获取数据。令人愉快的是,NYT 为这篇文章提供了 CSV 格式的数据,所以我们可以很容易地通过查看 chrome 中的网络选项卡来获取这些数据,如下所示。下载完数据文件后,将它放在应用程序中的某个地方,我将它放在一个名为 data 的文件夹下,并将其命名为“nyt-rip.csv”。

Capturing the CSV data that we will be using for our visualization by watching the network tab on Chrome. Refreshing the page triggers a lot of network calls, we then filter the network history to only CSV’s, and save the relevant file by double clicking it.

这个 csv 的格式有点不方便,它有球员 id、球员姓名、年份以及本赛季每场比赛的三次投掷次数等列。让我们把它整理成一种更容易使用的格式:

const nonNumericRows = {
  player: true,
  pname: true,
  year: true
};// reformats input csv so that each row 
// has details about the corresponding player
// and an array of points describing that players record
export function cleanData(data) {
  return data.map(row => {
    // extract all of the columns for 
    // this row that update that players score
    const gameData = Object.keys(row)
      .filter(key => !nonNumericRows[key] && row[key] !== 'NA')
      .map((key, x) => ({x, y: Number(row[key])})); // return a formatted object to manipulate
    return {
      player: row.player,
      pname: row.pname,
      year: row.year,
      height: gameData[gameData.length - 1],
      gameData
    };
  });
}

太好了,现在我们有了一种机制来以可用的方式格式化我们的数据。在我们编写实用函数的同时,让我们也编写一个来获取数据域:

export function getDataDomain(data) {
  const {min, max} = data.reduce((acc, player) => {
    return player.gameData.reduce((mem, row) => {
      return {
        min: Math.min(mem.min, row.y),
        max: Math.max(mem.max, row.y)
      };
    }, acc);}, {min: Infinity, max: -Infinity});
  return [min, max];
}

将这两个函数放入 utils.js 文件中,我们就可以开始比赛了。

第一种天真的方法

为了给我们随后的优化做好准备,我们先来看一个简单的方法。在我们的数据集中有 750 个球员年,所以我们只有 750 个系列。当我们悬停在它们上方时,让我们重新绘制线条并突出显示选中的线条。相当合理!这里有一个简单实现的完整过程,之后我将详细介绍并描述每个部分:

哦,一下子这么多!但是如果把它分成几块就很容易处理了。当我们的组件准备好挂载时,它做的第一件事是通过 d3-fetch csv 函数调用数据,然后我们清理数据并将其保存到状态,以便在不久的将来接收。

componentWillMount() {
    csv('data/nyt-rip.csv')
      .then(data => this.setState({
        data: cleanData(data),
        loading: false
      }));
  }

如果数据还没有被加载,我们通过拒绝尝试渲染我们的组件来开始我们的渲染功能,而只是返回一个加载消息(尽管你可以很容易地给 show 一个旋转器或者使用像 placeloader 这样的花哨东西)。接下来,我们使用上一节中的 getDataDomain 函数构建一个由 d3-scale-chromatic 支持的色标。在本文中,我们主要感兴趣的是重建原始 NYT 可视化的感觉(而不是确切的外观),所以这里我们使用了不同的色标,并放弃了一些额外的图表装饰。

const {loading, highlightSeries, data} = this.state;
if (loading) {
  return <div><h1>LOADING</h1></div>;
}const dataDomain = getDataDomain(data);
const domainScale = scaleLinear().domain(dataDomain).range([1, 0]);
const colorScale = val => interpolateWarm(domainScale(val));

最后,我们来看图表的实际渲染。我们首先查看所有的数据行,为每个数据行创建一个 LineSeries,并定义一个基本的交互技术。接下来,我们添加一个 LabelSeries 来突出显示沿 y 轴和 x 轴的某些点,并使用特殊格式来匹配 NYT 图形给出的标签。

<XYPlot {...layout}>
  {data.map((player, idx) => {
    const playerHighlightString = `${player.pname}-${player.year}`;
    return (
      <LineSeries
        key={idx}
        strokeWidth="4"
        curve="curveStepBefore"
        data={player.gameData}
        onSeriesMouseOver={() => 
            this.setState({highlightSeries: playerHighlightString})}
        onSeriesMouseOut={() => 
            this.setState({highlightSeries: null})}
        stroke={
          playerHighlightString === highlightSeries ? 'black' :
           colorScale(player.gameData[player.gameData.length - 1].y)
        }
        />);
  })}
  <LabelSeries
    data={data.filter(row => labelMap[`${row.pname}-${row.year}`])}
    style={{fontSize: '10px', fontFamily: 'sans-serif'}}
    getY={d => d.gameData[d.gameData.length - 1].y}
    getX={d => 82}
    labelAnchorX="start"
    getLabel={d => 
      `${d.pname} - ${d.gameData[d.gameData.length - 1].y}`}/>
  <XAxis
    style={{ticks: {fontSize: '10px', fontFamily: 'sans-serif'}}}
    tickFormat={d => 
       !d ? '1st game' : (!(d % 10) ? `${d}th` : '')}/>
</XYPlot>

敏锐的读者会注意到,我们使用了两个常量,它们是从一个单独的 constants.js 文件中导入的,为了逻辑上的方便,将它们提取出来:

export const desiredLabels = [
  {pname: 'Brian Taylor', year: 1980},
  {pname: 'Mike Bratz', year: 1981},
  {pname: 'Don Buse', year: 1982},
  {pname: 'Mike Dunleavy', year: 1983},
  {pname: 'Larry Bird', year: 1986},
  {pname: 'Danny Ainge', year: 1988},
  {pname: 'Michael Adams', year: 1989},
  {pname: 'Michael Adams', year: 1990},
  {pname: 'Vernon Maxwell', year: 1991},
  {pname: 'Vernon Maxwell', year: 1992},
  {pname: 'Dan Majerle', year: 1994},
  {pname: 'John Starks', year: 1995},
  {pname: 'Dennis Scott', year: 1996},
  {pname: 'Reggie Miller', year: 1997},
  {pname: 'Dee Brown', year: 1999},
  {pname: 'Gary Payton', year: 2000},
  {pname: 'Antoine Walker', year: 2001},
  {pname: 'Jason Richardson', year: 2008},
  {pname: 'Stephen Curry', year: 2013},
  {pname: 'Stephen Curry', year: 2014},
  {pname: 'Stephen Curry', year: 2015},
  {pname: 'Stephen Curry', year: 2016}
];export const layout = {
  height: 1000,
  width: 800,
  margin: {left: 20, right: 200, bottom: 100, top: 20}
};export const NUMBER_OF_GAMES = 82;
export const MAX_NUMBER_OF_THREE_POINTERS = 405;

综上所述,这看起来像是:

相当酷!然而,响应性不是很好,当我们接近它们时,线条不会突出显示,浏览器明显出现滞后。这种策略也阻止了我们在边上添加工具提示(虽然我们可以这样做,但是当我们悬停在不同的元素上时会有很多抖动)。一定有更好的办法!

更好的建筑

到目前为止,我们一直在使用 SVG 线渲染我们的系列。虽然这种方法很容易推断 UI 的状态,但每次都重新绘制所有的线条确实效率很低。这是因为每一行都被建模为一个非常详细的 DOM 节点,这对浏览器来说非常重要。为了减轻这一重量,我们可以使用内置的 react-vis 帆布系列 LineSeriesCanvas。Canvas 的渲染速度往往比 SVG 快得多,但在 DOM 中没有相同的详细表示,这意味着任何交互都必须手工完成。显然,将这个新的系列放到我们天真的解决方案中会使整个页面更快,但是我们会失去我们的动态交互性。

为了解决这个问题,我们将图表分成两个部分,一个处理交互性,另一个处理其他所有的事情。这是由 React 只为已经更新的组件执行渲染功能的想法所激发的。

The organization of our chart component after breaking out the interactive parts into a separate component

通过这个架构,我们将有一个组件来呈现画布线条,还有一个组件来呈现高亮线条和高亮工具提示。从而有效地将快速渲染的元素与昂贵或耗时渲染的元素分开。布局的一些伪代码:

<div className="relative">
  <NonInteractiveParts />
  <InteractiveParts />
</div>

我们希望这些组件看起来是一个漂亮的图表,所以我们给了交互部分 css 属性

position: absolute;
top: 0;

这允许交互部分“位于”非交互属性之上,从而完成外观。

静态部分

我们现在真的有所进展了。注意到图表的静态部分与我们在简单方法中的非常相似;只是一个装着一些系列的容器。为了简洁起见,我们可以将上面演示的根组件和画布部件合并成一个组件,因为它们中的每一个都只呈现一次。

这个新部件与我们的第一个非常相似。我们的 mounting 步骤做了一些额外的工作来促进交互组件的呈现——稍后会详细介绍——并调用我们即将成为交互组件的。但是除此之外,没有太大的变化!

互动部分

酷的东西来了。我们在上面看到,我们在 componentWillMount 步骤中额外准备了一些数据,以便为交互式组件做好准备,让我们看一下更详细的情况:

componentWillMount() {
    csv('data/nyt-rip.csv')
      .then(data => {
        const updatedData = cleanData(data);
        const playerYearMap = updatedData.reduce((acc, row) => {
          const {pname, year, gameData} = row;
          acc[`${pname}-${year}`] = gameData[gameData.length - 1].y;
          return acc;
        }, {}); const playerMap = updatedData.reduce((acc, row) => {
          acc[`${row.pname}-${row.year}`] = row;
          return acc;
        }, {});
        this.setState({
          data: updatedData,
          loading: false,
          allPoints: buildVoronoiPoints(updatedData),
          playerYearMap,
          playerMap
        });
      });
  }

我们清理的数据和以前一样,吱吱作响,很好用。接下来,我们引入一个名为 playerYearMap 的新变量,这个对象的键等于球员年唯一标识符,值等于每个球员达到的三分的最大分数。这将用于简化标签和工具提示的定位。类似地,我们引入一个 playerMap,它也有球员年份标识符作为键,但这次是整行作为值。这将允许当我们将鼠标放在事物上时快速/持续地查找行。

最后一个新变量称为 allPoints,由一个名为 buildVoronoiPoints 的函数生成。我想知道那会是什么?这是函数(它存在于 utils 中):

export function buildVoronoiPoints(data) {
  return data.reduce((acc, {player, pname, year, gameData}) => {
    return acc.concat({
      player,
      pname,
      year,
      x: 41,
      y: gameData[gameData.length - 1].y
    });
  }, []);
}

这将为每个球员在该球员最大三分点数的“高度”区域的中心创建一个单点。我们可以用它来创建一个 Voronoi 图。Voronoi 是空间平面分割,使得形成点的集合,其中每个点包含在其自己的单元内。我们保证每个点将与其他点隔离。这个属性对鼠标悬停有很大的影响,因此用户一次只能将鼠标悬停在一个点上。

A colored in voronoi diagram, source wikipedia

我们正在模仿在最初的 NYT 图形中发现的鼠标悬停设置,在那里飞机被分成带状,这样当你上下移动鼠标时,当前选择的玩家年份会改变,当你左右移动鼠标时,它保持不变。我们可以通过使用 Voronoi 和我们之前特别构建的所有点来重建这种行为。一旦实现,voronoi 单元的布局将如下所示:

(When we’re done we will remove the stroke attribute from the Voronoi cells shown here, that way our user is none the wiser about our mouse over technique 😉)

相当酷!现在我们已经准备好查看交互式组件的代码了。

就像我们天真的方法一样,让我们一次看一个有趣的部分。让我们从房间里的大象开始:

<Voronoi
            extent={[
              [0, y(MAX_NUMBER_OF_THREE_POINTERS)], 
              [width, height - margin.bottom]
            ]}
            nodes={allPoints}
            polygonStyle={{
              // UNCOMMENT BELOW TO SEE VORNOI
              stroke: 'rgba(0, 0, 0, .2)'
            }}
            onHover={row => {
              const player = playerMap[`${row.pname}-${row.year}`];
              if (!player) {
                this.setState({
                  highlightSeries: null,
                  highlightTip: null
                });
                return;
              }
              this.debouncedSetState({
                highlightSeries: player.gameData,
                highlightTip: {
                  y: player.gameData[player.gameData.length - 1].y,
                  name: row.pname
                }
              });
            }}
            x={d => x(d.x)}
            y={d => y(d.y)}
            />

这个无害的组件接受一个点列表,并直接在 dom 中构建一个 voronoi 图。与 react-vis 中的其他组件相比,它的属性签名有点不正常(您需要提供一个刻度,范围),所以要小心!在这个组件中值得注意的另一件事是使用了 debouncedSetState 函数,正如您从上面所注意到的,我们必须通过以下方式来定义它:

componentWillMount() {
    this.debouncedSetState = debounce(newState =>
      this.setState(newState), 40);
  }

该函数利用了称为去抖的 lodash 函数,该函数防止函数被调用超过特定频率(在本例中为每 40 ms 一次)。防止这种类型的超快速状态改变对我们是有利的,因为我们不希望每次用户做出很小的动作就导致状态改变。这将导致抖动和不必要的重绘!为了掩盖这一点点延迟,我们通过在 LineSeries 上包含动画道具来添加动画。

综上所述,我们得到:

Our pan-ultimate draft of the visualization

模一些小的造型触摸,就是这样!它运行平稳,准确地再现了在原始可视化中发现的交互。相当酷!

还有一点

我们已经很好地模拟了最初的 NYT 可视化的功能,但是现在我们想知道:我们能做得更好吗?他们展示的鼠标悬停功能是合理的,但是它有点笨拙,因为重叠,阻止你将鼠标悬停在每个玩家身上。如果我们能以一种明智的和有效的方式来简化它,我们会很高兴。这个问题的答案,而且,如果我们真的是诚实的,大多数问题,是使我们的 Voronoi 更加细致入微。

一个简单的膝跳是为每个数据点建模创建 Voronoi 单元。虽然这样做是完全可能的,但是会产生大量的细胞。如果在 750 名玩家的赛季中有 82 场比赛,那将是 61,500 个不同的单元!根据一般经验,浏览器最多只能处理几千个 SVG 元素,所以我们需要更加聪明。

一个强大的解决方案是通过简化我们的每一行来开发数据集的简化模型。令人愉快的是,有大量关于线条简化的工作,比如非常优秀的 Vladimir Agafonkin/monner 的 simplify-js 库。许多这类工作的出现是因为制图员对保存海岸线和其他不规则地理实体的粗糙边缘的简化形状感兴趣。但是我们会把它用在不同的地方。

mourner’s simplify-js demo page, simplifying complex lines.

我们将简化每个球员的年线,这样我们就可以得到他们的线的要点,没有太多的细节。我们通过在 utils 文件中添加另一项内容来让 simplify-js 处理我们的数据,从而执行了这个想法:

const betterThanCurryLine = simplify(stephCurryRecord, 0.5)
    .map(({x, y}) =>
        ({x, y: y + 20, pname: 'Stephen Curry', year: 2016}));const SIMPLICATION = 3;
export function buildVoronoiPointsWithSimplification(data) {
  return data.reduce((acc, {player, pname, year, gameData}) => {
    return acc.concat(
      simplify(gameData, SIMPLICATION).map(({x, y}) => ({player, pname, year, x, y}))
    );
  }, betterThanCurryLine);
}

作为视觉化主义者,我们的第一个冲动是想看看这些简化是什么样子,瞧:

Visualization of the simplification of our model in preparation for a modest robust voronoi strategy (left) compared to the unsimplified data (right). On the left we that there is an (comparatively) jagged line above all of the others, this line is used to specially tune the character of the resulting voronoi. Curry’s record breaking trajectory plays a big role in the user’s experience of this chart, so it is necessary to provide some extra polish to make sure interactions with that line really shine.

有了所有这些东西,我们终于可以看到最终的 voronoi 图了。请看:

The user experience of using our line-simplified voronoi technique (left), and a visualization of what’s going on under the hood (right).

结论

在这篇文章中,我们看到了如何使用 react-vis 重建出版物质量的交互式数据图形。这涉及到使用各种各样的交互式可视化技术,包括画布渲染、单程渲染、去抖动、Voronois 和线简化,作为追踪线系列的机制。并不是每个可视化都需要这么多的优化和高级技术,但是我们知道很多关于我们的数据和目标行为,所以我们能够按照我们想要的方式进行调整。

在构建我们的可视化时,我们大量使用了 react-vis 的一些特性,但是本文中讨论的思想适用于任何基于 web 的可视化框架。你可以很容易地用普通的 d3 、符号或者任何其他可用的可视化工具来实现这些技术。

如果你想看上下文中的代码,看看这个报告。如需更多高级示例,请查看 react-vis 文档的图表部分或我的一些个人作品,比如这个的,或者这个的,或者甚至是这个的。

快乐观想!

少数镜头学习的进展:一次有指导的旅行

原文:https://towardsdatascience.com/advances-in-few-shot-learning-a-guided-tour-36bc10a68b77?source=collection_archive---------3-----------------------

Source: https://worldarchery.org/sites/default/files/news/images/main/Arrows-in-Target-Gator-Cup.jpg

少数镜头学习是目前机器学习的一个令人兴奋的领域。深度神经网络从大量数据集中提取复杂统计数据和学习高级特征的能力已经得到证明。然而,当前的深度学习方法存在样本效率低下的问题,这与人类的感知形成了鲜明对比——即使是孩子也能在看到一张图片后认出长颈鹿。微调预先训练的模型是实现高采样效率的一种流行策略,但这是一种事后手段。机器学习能做得更好吗?

少投学习旨在解决这些问题。在这篇文章中,我将通过深入研究三篇前沿论文来探索一些近期在少投学习方面的进展:

  1. 匹配网络:可微分的最近邻分类器
  2. 原型网络:学习原型表征
  3. 模型不可知的元学习:学习微调

我将从简单解释 n-shot,k-way 分类任务开始,这些任务是少投学习的事实上的基准。

我已经在一个 Github 资源库 中转载了这些论文的主要结果。你可以查看 这篇文章 来了解我实施这项研究的经历。

n 镜头,k 路任务

一个算法执行少镜头学习的能力通常通过它在 n 镜头、k 路任务上的性能来衡量。它们的运行方式如下:

  1. 给模型一个查询样本,该样本属于一个新的、以前未见过的类
  2. 也给出了一个支持集, S ,由 n 个例子组成,每个例子来自 k 个不同的看不见的类
  3. 然后,该算法必须确定查询样本属于哪个支持集类

A 1-shot, 20-way task from the Omniglot dataset. The query sample is in top-center.

匹配网络

Vinyals et al.

虽然之前有很多关于深度学习的少量方法的研究,但 Matching Networks 是第一个对 n-shot,k-way 任务进行训练和测试的。这种方法的吸引力很简单——对相同的任务进行训练和评估,让我们以端到端的方式优化目标任务。诸如暹罗网络的早期方法使用成对验证损失来执行度量学习,然后在单独的阶段使用学习的度量空间来执行最近邻分类。这不是最佳的,因为初始嵌入函数被训练成在不同的任务上最大化性能!然而,匹配网络将嵌入和分类结合起来,形成端到端的可微分最近邻 分类器。

匹配网络首先将高维样本嵌入到低维空间中,然后执行由下面的等式描述的最近邻分类的一般化形式。

Equation (1) from Matching Networks

这意味着模型的预测 y^ 是支持集的标签 y_i 的加权和,其中权重是查询示例 x^和支持集样本 x_i 之间的成对相似性函数 a(x^,x_i】。该等式中的标签 y_i 是独热编码的标签向量。

注意,如果我们选择 a(x^,x_i) 作为与查询样本最接近的 k 个样本的 1/k ,否则我们恢复 k 最近邻算法。需要注意的关键点是,如果注意函数 a(x^,x_i) 是可微的,那么匹配网络是端到端可微的。

作者选择嵌入空间中简单的 softmax over cosine 相似度作为他们的注意函数 a(x,x_i)。他们用于少数镜头图像分类问题的嵌入函数是 CNN,它当然是可微分的,因此使得注意力和匹配网络完全可微分!这意味着用典型方法(如随机梯度下降法)端到端地拟合整个模型是很简单的。

Attention function used in the Matching Networks paper

在上面的等式中,c 表示余弦相似度,函数 fg 分别是查询和支持集样本的嵌入函数。对该等式的另一种解释是,支持集是一种记忆形式,并且在看到新样本时,网络通过从该记忆中检索具有相似内容的样本的标签来生成预测。

有趣的是,支持集和查询集嵌入函数 fg 不同的可能性是开放的,以便给予模型更多的灵活性。事实上,Vinyals 等人正是这样做的,并引入了全语境嵌入或简称为 FCE 的概念。

他们认为嵌入函数的短视本质是一个弱点,因为支持集 x_i 的每个元素被 g(x_i) 以独立于其余支持集和查询样本的方式嵌入。他们建议嵌入函数 f(x^)g(x_i) 应该采用更一般的形式 f(x^,S)g(x_i,S) 其中 S 是支撑集。这背后的原因是,如果两个支持集项目非常接近,例如,我们正在执行狗品种之间的细粒度分类,我们应该改变样本嵌入的方式,以增加这些样本的可分辨性。

在实践中,作者使用 LSTM 来计算支持的 FCE,然后注意使用另一个 LSTM 来修改查询样本的嵌入。这带来了可观的性能提升,但代价是引入了更多的计算,并且对支持集的任意排序也稍显乏味。

总之,这是一篇非常新颖的论文,它发展了完全可微神经邻居算法的思想。

原型网络

Class prototypes c_i and query sample x.

在原型网络中,Snell 等人以类原型的形式应用了引人注目的归纳偏差,以实现令人印象深刻的少数镜头性能——在没有 FCE 复杂性的情况下超过了匹配网络。作出的关键假设是存在嵌入,其中来自每个类别的样本围绕单个原型表示聚集,该原型表示简单地是单个样本的平均值。这个想法简化了 n > 1 的情况下的 n 镜头分类,因为分类是通过取最接近的类原型的标签来简单地执行的。

Equation (1) from Prototypical Networks — calculating class prototypes. S_k is the support set belonging to class k and f_phi is the embedding function.

本文的另一个贡献是在度量学习中使用欧几里德距离超过余弦距离的有说服力的理论论证,这也证明了使用类均值作为原型表示的合理性。关键是要认识到平方欧几里得距离(而不是余弦距离)是一种特殊的距离函数,称为 Bregman 散度

考虑寻找一簇点的质心的聚类问题,使得质心和所有其他点之间的总距离最小化。已经证明如果你的距离函数是一个 Bregman 散度(比如平方欧几里德距离),那么满足这个条件的质心就是聚类的平均值——然而余弦距离不是这种情况!当将一组点表示为单个点时,该质心是使信息损失最小的点。

这种直觉得到了实验的支持,因为作者发现,通过从余弦到欧几里德距离的交换,质子和他们自己的匹配网络的实现都得到了全面的改善。

原型网络也服从于零触发学习,人们可以简单地直接从类的高级描述中学习类原型,比如带标签的属性或自然语言描述。一旦你做到了这一点,你就有可能把新的图片归类为一个特定的类别,而不必看那个类别的图片。在他们的实验中,他们只根据颜色、形状和羽毛图案等属性对鸟类图像进行零拍摄物种分类。

我非常喜欢这篇文章,因为它在本文中所有方法的典型基准测试中实现了最高的性能,同时也非常优雅,最容易复制。干得好斯内尔等人!

模型不可知的元学习(MAML)

芬恩等人采取了一种非常不同的方法来进行少量学习,通过学习一种可以快速适应新任务的网络初始化——这是一种形式的元学习或学习到学习。这种元学习的最终结果是一个模型,它可以在一个新任务上达到高性能,只需一个简单的常规梯度下降步骤。这种方法的高明之处在于,它不仅可以用于监督回归和分类问题,还可以用于使用任何可微分模型的强化学习!

Figure 1 from Model-Agnostic Meta-Learning. Theta represents the weights of the meta-learner. Gradient L_i are the losses for tasks, i, in a meta-batch and the starred theta_i are the optimal weights for each task.

MAML 不像大多数深度学习算法那样在批量样本上学习,而是在批量任务上学习,也称为元批量。对于元批处理中的每个任务,我们首先使用基本元学习者的权重初始化一个新的“快速模型”。然后,我们计算梯度,从而根据从该任务中抽取的样本更新参数,并更新快速模型的权重,即,对快速模型的权重执行典型的小批量随机梯度下降。

The weight update due to a single task T_i. Alpha is a learning rate hyperparameter.

在参数更新之后,我们从相同的任务中采样一些更多的看不见的样本,并计算元学习者的更新权重(又名快速模型)在任务中的损失。最后一步是通过从更新后的权重中获取损失总和的梯度来更新元学习器的权重。这个实际上是取梯度的梯度,因此是二阶更新——MAML 算法通过展开的训练过程进行微分。

Weight update for meta-learner. Beta is a learning rate hyperparameter and p(T) is the distribution of tasks.

这是关键的一步,因为这意味着我们在梯度步骤后优化基础车型的性能,也就是说,我们在优化快速简单的梯度下降。这样做的结果是,元学习者可以通过梯度下降在小至每类一个例子的数据集上进行训练,而不会过度拟合。

来自 OpenAI 的一篇后续论文提供了一些有价值的直觉,解释了为什么使用梯度更新的泰勒展开可以工作。他们得出的结论是,MAML 不仅最小化了任务分布的期望损失,而且最大化了同一任务的梯度更新之间的期望内积。因此,它是优化批次之间的一般化

Results of a Taylor expansion analysis from “On First-Order Meta-Learning Algorithms” by Nichol et al.

上述方程组显示了 MAML 梯度的期望,一阶简化的 MAML (FOMAML)和爬虫,一阶元学习算法在同一篇论文中介绍。 AvgGrad 项代表任务损失,而 AvgGradInner 项代表概括项。注意,对于学习速率中的领先顺序α,所有算法都执行非常相似的更新,其中二阶 MAML 将最高权重放在一般化项上。

也许 MAML 的唯一缺点是二阶更新,因为计算损失的二阶导数是非常内存和计算密集型的。然而,一阶简化(例如 FOMAML 和爬虫)产生非常相似的性能,这暗示二阶更新可以用更新权重上的梯度来近似。

然而,高计算要求与模型不可知的元学习是一篇出色的论文,为机器学习开辟了令人兴奋的新道路这一事实无关。

少数镜头学习领域正在取得快速进展,尽管仍有许多有待学习,但我相信该领域的研究人员将继续缩小机器和人类在少数镜头学习这一挑战性任务上的表现之间的差距。我希望你喜欢阅读这篇文章。

我已经在一个 Github 资源库 中转载了这些论文的主要成果。如果你已经有了足够的概念,并且想要一些有趣的技术细节和代码,你可以查看 这篇文章 来了解我实施这项研究的经验。

少数镜头学习的进展:在 PyTorch 中再现结果

原文:https://towardsdatascience.com/advances-in-few-shot-learning-reproducing-results-in-pytorch-aba70dee541d?source=collection_archive---------5-----------------------

少镜头学习是机器学习的一个令人兴奋的领域,旨在缩小机器和人类在从少量样本中学习的挑战性任务中的差距。在我的上一篇文章中,我提供了三篇前沿论文的高度概括——我假设你已经读过,已经熟悉这些论文,或者你自己正在复制它们。

在这篇文章中,我将向您介绍我在 Omniglot 和 miniImageNet 数据集上复制这些论文的结果的经验,包括路上的一些陷阱和绊脚石。每篇论文都有自己的章节,在其中我提供了一个 Github gist 和 PyTorch 代码来对论文描述的模型执行单个参数更新。要训练模型,只需将该函数放入训练数据的循环中。为了简洁起见,省略了数据集处理等不太有趣的细节。

再现性非常重要,它是任何声称是科学的领域的基础。这让我相信,机器学习中代码共享和开源的盛行确实令人钦佩。虽然仅发布代码是不可复制的(因为可能存在实现错误),但它向公众开放了研究人员的方法,更重要的是加速了该领域其他人的研究。鉴于此,我要感谢这些论文的作者分享他们的代码,以及任何其他开源他们实现的人。

【https://github.com/oscarknagg/few-shot】请查看我在 的 Github 回购

Things don’t always go to plan. Just see this training curve of a failed MAML implementation for example!

数据集

有两个图像数据集用于评估少镜头学习算法。第一个是 Omniglot 数据集,它包含 20 张图片,每张图片包含来自 50 个字母表的大约 1600 个字符。这些影像通常为 28x28 灰度,这也是该数据集通常被称为 MNIST 转置的原因之一。

Samples from the Omniglot dataset.

第二个是 miniImageNet 数据集,它是 ImageNet 的一个子集,旨在成为一个更具挑战性的基准,而不像完整的 ImageNet 数据集那样繁琐。miniImageNet 由 60,000 张 84x84 的 RGB 图像组成,每类 600 张图像。

Samples from the miniImageNet dataset before taking center crop and resizing to 84x84

在这两种情况下,训练集和验证集中的类是不相交的。我没有使用与原始论文相同的培训和验证拆分,因为我的目标是不要将它们复制到最后一分钟的细节。

匹配网络

在匹配网络中,Vinyals 等人引入了一种完全可微分的最近邻分类器的概念,这种分类器既经过训练又经过了少量任务的测试。

匹配网络算法可以总结如下:

  1. 首先,使用编码器网络(本例中为 4 层 CNN)嵌入所有样本(查询和支持集)。这是由 model.encode()执行的(第 41 行)。
  2. 可选地计算完整的上下文嵌入(FCE)。考虑到支持集,LSTM 将原始嵌入作为输入,并输出修改的嵌入。这是由 model.f()和 model.g()执行的(第 62 和 67 行)。
  3. 计算查询样本和支持集之间的成对距离,并使用 softmax 进行归一化(第 69 到 77 行)
  4. 通过用标准化的距离对支持集标签进行加权平均来计算预测(第 83–89 行)

一些需要注意的事项:

  • 在这个例子中, x 张量首先包含支持集样本,然后是查询。对于 Omniglot,它将具有 shape (n_support + n_query,1,28,28)
  • 前一篇文章中的数学是针对一个查询样本的,但实际上匹配网络是用一批大小为 q_queries * k_way 的查询样本训练的

我无法使用余弦距离复制这篇论文的结果,但当使用 l2 距离时却成功了。我相信这是因为余弦距离被限制在-1 和 1 之间,这就限制了注意力函数( a(x^,x_i) 下面)可以指向支持集中的特定样本的数量。由于余弦距离是有界的 a(x^,x_i) 永远不会接近 1!在 5 路分类的情况下, a(x^,x_i) 的最大可能值是exp(1)/(exp(1)+4 * exp(-1))≈0.65。当使用余弦距离时,这导致非常慢的收敛。

我认为有可能使用余弦距离来重现结果,或者使用更长的训练时间,更好的超参数,或者像余弦距离乘以常数因子这样的启发式方法。鉴于距离的选择不是论文的关键,使用 l2 距离的结果非常好,我决定省去调试工作。

原型网络

在原型网络中,Snell 等人使用由 Bregman 发散理论激发的引人注目的归纳偏差来实现令人印象深刻的少数镜头性能。

原型网络算法可以总结如下:

  1. 嵌入所有查询和支持示例(第 36 行)
  2. 计算类原型,取每个类嵌入的平均值(第 48 行)
  3. 预测是查询样本和类原型之间距离的软最大值(第 63 行)

我发现这篇论文非常容易复制,因为作者提供了全套的超参数。因此,在 Omniglot 基准测试中,我可以轻松地实现大约 0.2%的性能,在 miniImageNet 基准测试中,可以实现几%的性能,而不需要我自己进行任何调整。

元不可知元学习(MAML)

在中,MAML 芬恩等人介绍了一种强大且广泛适用的元学习算法,来学习一种能够快速适应新任务的网络初始化。在本文的三篇文章中,这篇文章是最难也是最值得复制的。

MAML 算法可以总结如下:

  1. 对于元批量任务中的每个 n-shot 任务,使用基本模型的权重创建一个新模型,也就是元学习者(第 79 行)
  2. 通过随机梯度下降,使用任务中样本的损失更新新模型的权重(第 81–92 行)
  3. 计算同一任务中更多数据的更新模型的损失(第 94-97 行)
  4. 如果执行一阶 MAML,用来自第 3 部分的损失梯度更新元学习器权重。如果执行二阶 MAML,计算该损失相对于原始权重的导数(第 110+行)

PyTorch 最大的吸引力在于它的亲笔签名系统。这是一段神奇的代码,记录了对火炬的操作。Tensor 对象,动态构建这些操作的有向无环图。反向传播就像调用一样简单。在最终结果上倒退()。为了计算和应用元学习者的参数更新,我不得不学习更多关于这个系统的知识,现在我将与你分享。

一阶 MAML —梯度交换

通常,在 PyTorch 中训练模型时,您会创建一个与特定模型的参数相关联的优化器对象。

from torch.optim import Adam
opt = Adam(model.parameters(), lr=0.001)

当调用 opt.step() 时,优化器读取模型参数的梯度,并计算这些参数的更新。然而,在一阶 MAML 中,我们将使用一个模型(快速权重)计算梯度,并将更新应用于不同的模型,即元学习者。

对此的解决方案是以 torch 的形式使用 PyTorch 的一个未充分利用的功能。Tensor.register_hook(钩子)。注册一个钩子函数到一个张量,这个钩子函数将在计算这个张量的梯度时被调用。对于元学习器中的每个参数张量,我注册了一个钩子,该钩子简单地将梯度替换为快速权重上的相应梯度(gist 中的第 111–129 行)。这意味着当 opt.step() 被调用时,快速模型的梯度将用于根据需要更新元学习器权重。

二阶 MAML-亲笔签名的问题

当我第一次尝试实现 MAML 时,我实例化了一个新的模型对象(torch.nn.Module 的子类)并将它的权重值设置为元学习者的权重。然而,这使得不可能执行二阶 MAML,因为在火炬的眼中,快速模型的权重与元学习者的权重是分离的。这意味着当我调用optimizer . step()(要点中的第 140 行)时,元学习者权重的自动签名图是空的,没有执行更新。

# This didn't work, meta_learner weights remain unchanged
meta_learner = ModelClass()
opt = Adam(meta_learner.parameters(), lr=0.001)task_losses = []
for x, y in meta_batch:
    fast_model = ModelClass()
    # torch.autograd loses reference here!
    copy_weights(from=meta_learner, to=fast_model)
    task_losses.append(update_with_batch(x, y))meta_batch_loss = torch.stack(task_losses).mean()
meta_batch_loss.backward()
opt.step()

这个问题的解决方案是 functional_forward() (第 17 行),这是一个有点笨拙的方法,它使用 torch.nn.functional 手动执行与模型类相同的操作(卷积、最大池等)。这也意味着我必须手动执行快速模型的参数更新。其结果是torch . autograded知道将梯度反向传播到元学习者的原始权重。这导致了一个惊人的大签名图。

PyTorch autograd graph for 1st order MAML (left) and 2nd order MAML (right) with one inner training step. You can probably see why 2nd order MAML has much higher memory requirements!

然而,二阶 MAML 是一个比这更棘手的野兽。当我第一次写我的二阶 MAML 实现时,我认为我第一次尝试就奇迹般地完成了所有的工作。至少没有例外,对吗?只有在运行了全套 Omniglot 和 miniImageNet 实验后,我才开始怀疑我的工作——结果与一阶 MAML 太相似了。这是一种典型的无声 ML 错误,它不会导致异常,只会在模型的最终表现中显现出来。

因此,我决定全力以赴,编写一个单元测试,以确认我确实在执行二阶更新。声明:本着真正的测试驱动开发的精神,我应该在运行任何实验之前编写这个测试。事实证明我并不完美😛。

我决定进行的测试是在一个虚拟模型上运行 meta_gradient_step 函数,并手动解析自动签名的图,计算两次反向操作的次数。这样,我可以绝对肯定,我正在执行二阶更新时,需要的。相反,我能够测试我的一阶 MAML 实现只执行一阶更新,没有双重反向操作。

我最终找到了没有在内部训练循环中应用 create_graph 参数的错误(第 86 行)。然而,我保留了查询样本上的损失的签名图(第 97 行),但是这不足以执行二阶更新,因为展开的训练图没有被创建。

训练时间相当长(5 路 5 次拍摄的 miniImageNet 实验超过 24 小时),但最终我相当成功地再现了结果。

我希望你能从这次技术性的深潜中学到一些有用的东西。如果你有任何问题,请在评论中告诉我。

如果您想深入了解,请查看在【https://github.com/oscarknagg/few-shot】的完整实现

大(乱)数据中的冒险:通过客户同理心赢得机器学习工作的工具

原文:https://towardsdatascience.com/adventures-in-big-mess-of-data-tools-for-winning-machine-learning-work-through-customer-empathy-3f859f055536?source=collection_archive---------18-----------------------

Image from Pixabay

数据挑战

数据被比作石油,因为它是机器学习模型的“燃料”。就像发动机一样,算法依赖于燃料输送系统和大量经过适当提炼的燃料来工作。如果燃料没有经过适当的提炼,它就会分解(曾经意外地将柴油泵入无铅油箱吗?)或燃油管路是否损坏。类似地,机器学习模型需要一个适当的系统来传递经过适当清理和准备的数据。

内燃机并不是简单地一次燃烧掉油箱里的所有燃料,而是在每一个给定的时刻吸入运行机器所需的燃料,直到没有剩余的燃料。发动机的效率越高,用同样多的燃料就能做更多的事情。同样,我们应该尽最大努力创造尽可能高效的算法。通常,这意味着改进数据架构和数据本身要付出与模型所需一样多或更多的努力。

假设你是一家人工智能产品和/或服务公司。你有一个由数据科学家、工程师和架构师组成的精英团队来构建算法、数据管道和数据仓库。您甚至拥有主题专业知识来帮助告知产品的使用案例,从而让您的客户生活得更好和/或增加他们的销售额。你没有的是[可用]数据。

数据科学和人工智能领域的专家哀叹道,缺乏高质量的数据是这个领域面临的一个紧迫的挑战。为了训练和测试你的模型,你可以从(某些)网站搜集数据,寻找公共数据集,甚至创建一个合成数据集。但是这些选择可能会因为许多原因而失败:

  • 公共数据集可能缺少解决问题所需的功能
  • 在许多网站上,抓取数据经常受到限制
  • 收集的数据可能无法组成一个完整的数据集
  • 你的团队可能不知道如何产生合成数据
  • 创造完全模拟现实的合成数据可能是不可能的

通常,客户拥有您正在寻找的数据。有时候也没那么糟糕。大多数时候,都很糟糕。几乎都是无标签的。它总是需要数据管理来为你的机器学习模型做准备。让您的工作更加复杂的是,客户可能会出于各种原因拒绝共享数据(即使有保密协议),其中最重要的是他们认为自己的数据很有价值。

这很有可能。但是还没有人真正知道。您和客户都需要回答的问题是,“我们如何知道数据的价值,以及解决方案的价值?”

如果数据就像石油,只有在土地被勘测后,钻探才有价值。如果你想钻探石油,你肯定会在安装钻机之前首先考虑当地的环境。同样,AI 公司应该了解一个客户的环境。技术和进步是公司愿景的一部分,还是对新流程和变革有相当大的阻力?目前存在什么样的依赖和架构?如果环境看起来适合人工智能,那么你就采集数据样本。

客户经常要求看看我们能用他们的一小部分数据做些什么。例如,他们可能会提供一个从客户关系管理(CRM)平台查询的几个月的表。这是一个很好的学习机会:

  • 数据的状态
  • 数据的特征*
  • 客户对自己数据的理解
  • 客户用来获取和访问其数据的过程
  • 他们存储数据的位置和方式
  • 您的客户如何为最终用户服务

如果您客户的数据看起来有足够的功能,并且在数据仓库中得到很好的维护,那么您将有可能继续讨论能够带来最大价值的人工智能用例(更多信息请参见“为客户带来效用和乐趣的工具”)。

俗话说“一知半解是件危险的事”。我在这里强调“小”,因为一个更大的整体的一部分可能是欺骗性的。当客户提供数据样本时,会出现一些挑战,例如:

  • 客户不知道人工智能能做什么
  • 客户不了解其“原样”数据的局限性
  • *数据可能被错误地查询,给出了可用于分析的要素的不完整图像
  • 他们必须使他们的过程现代化,否则人工智能将根本无法帮助他们

在我与中型企业合作的经验中,数据样本的分析常常需要回到最初的工作环境(特别是数据收集和存储方法)。

那么,你如何管理期望,同时让客户对机器学习的力量感到兴奋呢?

面向客户的数据科学家可以将这部分工作视为获取正确数据的“床边方式”。一个有用的方法是向他们展示哪些数据现在可能有用,以及你从这些数据中学到了什么。然后展示如果他们调整方法可以做些什么。你越能分解检修遗留系统的过程,就越好。

坏例子:“买贵的,训练大家用。”

更好的例子:“从你的数据中,我们发现这个部门可能有一种让事情变得缓慢的趋势。为了进一步调查,我们需要收集尽可能多的与这一趋势相关的数据。你有 XYZ 特征的数据吗?这就是它们如何帮助我们做出更好的预测。它们可能存储在另一个系统上。如果是这样的话,这就是整合它们所需要的,而且成本可能会很高。您是否考虑过更新您的存储和收集方法?要不要我帮你联系几个合作伙伴?”

为客户服务和取悦客户的工具(阅读:不仅仅是 UX 团队的工作!)

当谈到人工智能解决方案时,大多数客户希望在给出数据样本后立即看到一系列令人印象深刻的见解。因此,传达可以对数据(在其当前状态下)做什么,同时从您的客户那里了解应该做什么可能会特别困难。**

假设你还没有见到你的客户本人。给你的只是企业名称和一个小的数据集。你将很快被安排与他们谈论人工智能能为他们做什么。

对于任何声称以解决方案为导向的公司来说,一个潜在的危险是“金锤”,或者试图用同一种工具解决所有问题的倾向。最好是花时间评估情况,考虑解决问题的各种选择,即使我们大多数时候最终使用的是我们最熟悉的工具。

通过对公司业务和用户的深入了解,表现出为客户服务的真诚愿望。记住一般的想法,分析数据样本。在这第一步中,你的目标应该是利用你所拥有的数据找到尽可能多的用例。你拥有的数据越丰富,你可能发现的模式就越多,机会也就越多。就当是用数据头脑风暴吧。

呈现这种数据集思广益会议的一种方式是修改经典的“特性和优点”两栏表,这是一种基本的营销工具。单独来看,“特性和优点”很好地展示了您可以构建什么以及为什么要构建,但是它并没有说明如何构建。

改编显示了什么是可能的(特性),它提供了什么好处(好处),并添加了一个解释是什么需要使它发生(我们需要什么)。

客户将通过一系列“痛点”来讨论人工智能用例,然后面临的挑战是找出:(1)您的公司是否能够足够好地理解这些“痛点”来解决它们,以及(2)数据/架构是否足以支持解决方案。

如果您在对话中列出可以利用这些数据完成的事情,您就可以洞察哪些对客户来说是最有用的,同时告知他们可能没有意识到的其他用例。此外,通过展示“我们需要什么”,你向客户提供了关于需要什么来提炼他们的数据以推动每个人工智能解决方案的宝贵信息。

客户同理心不仅仅是推动机器学习模型,而是看什么真正有利于公司。以客户为中心的人工智能公司识别所有帮助客户变得更好的机会(包括那些人工智能公司可能不起作用的情况):

  • 人工智能机会——您的人工智能公司在这方面表现出色。
  • 数据机会—客户可能不会立即为您的解决方案做好准备,但这是向客户展示如何改善其数据状态的绝佳机会。如果他们工作得很快,你已经把他们变成了未来的一个可行的线索。(你认为他们会先给谁打电话?)
  • 流程机会——如果你是一家人工智能产品/服务公司,你可能没有这方面的内部专业知识。准备好提供指导,告诉他们在这个过程中可以去哪里工作。顺利移交给合作伙伴的奖励积分。

人工智能团队必须表现出和 UX 团队一样的关注,提供具有最大效用和客户满意度的解决方案。它需要理解顾客的需求,创造性地仔细思考下一步的正确行动。像定制的“功能和优势”图表这样的工具,以及快速高效的数据样本分析系统,让你的人工智能解决方案感觉像是白手套体验,而不是争论一大堆数据。

针对强化学习代理的对抗性攻击

原文:https://towardsdatascience.com/adversarial-attacks-against-reinforcement-learning-agents-512f7703ad0f?source=collection_archive---------17-----------------------

TWiML Talk 119

在这一集里,我和谷歌大脑的研究人员科学家伊恩·古德菲勒以及加州大学伯克利分校 EECS 系的博士生黄裕景一起讨论他们在《对神经网络政策的对抗性攻击》一文中的工作。

订阅:iTunes/SoundCloud/Google Play/Stitcher/RSS

如果你是这里的一名普通听众,你可能听说过敌对攻击,并见过基于深度学习的物体检测器的例子,例如,通过向图像中注入一些察觉不到的噪声,长颈鹿实际上是一辆校车。嗯,桑迪和伊恩的论文位于对抗性攻击和强化学习的交汇点,这是我们在播客中讨论了很多的另一个领域。在他们的论文中,他们描述了对抗性攻击如何在强化学习中有效地针对神经网络策略。Sandy 向我们概述了这篇论文,包括改变单个像素值如何影响训练来玩 Atari 游戏的模型的性能。我们还涵盖了许多有趣的主题,分别涉及对抗性攻击和学习力,以及一些相关领域,如等级奖励函数和迁移学习。这是一次很棒的谈话,我真的很高兴能带给你!

TWiML 在线会议更新

我想向本周早些时候参加 TWiML 在线聚会的每一个人大声欢呼。在我们的社区部分,我们就冷冻大脑(如果你错过了那家初创公司的公告,你可能不知道我在说什么)、医疗保健领域的 ML 和 AI 等问题进行了非常有趣和广泛的讨论。社区成员尼古拉斯·teague,‏在 twitter 上使用了 @NicT ,他也简要介绍了他的文章“一个蹒跚学步的孩子学会说话”,在这篇文章中,他探索了机器学习中不同模式之间的联系。最后,衷心感谢 Sean Devlin,他对深度强化学习和 Google DeepMind 在该领域的开创性论文进行了深入探讨。查看下个月在 twimlai.com/meetup聚会的视频记录和细节。

和我一起参加人工智能峰会

你是一名需要在企业中广泛的机器学习和人工智能机会上变得聪明的 IT、技术或业务领导者吗?或者,也许你组织中的某个人可以从这方面的提升中受益?(或者,也许你会从他们的升级中受益!)如果这听起来像你或你认识的人,你可能会对我即将举行的人工智能峰会感兴趣。

把这个活动想象成一个为期两天的机器学习和人工智能的技术 MBA。你会清楚地了解:

机器学习和深度学习如何工作(不需要数学知识)
如何在您的组织中识别机器学习和深度学习机会
如何理解和利用计算机视觉和自然语言处理等技术
如何管理和标记数据以利用 ML 和 AI
以及如何建立 AI 优先的文化,并在您的业务中实施 AI。

你将对整个人工智能和人工智能领域正在发生的事情有一个知情的观点,并将能够自信地与你的同事、客户和合作伙伴讨论机器学习和人工智能。我对这次活动和演讲者感到非常兴奋,你们将有机会向他们学习。欲了解更多信息,请访问twimlai.com/aisummit,如有疑问,请随时联系我。

关于伊恩

  • 伊恩在 LinkedIn 上
  • 伊恩在推特上
  • 伊恩的个人主页

关于桑迪

  • 桑迪在领英上
  • 加州大学伯克利分校的桑迪

采访中提到

  • 论文——对神经网络策略的对抗性攻击
  • 论文——探究可转移的示例
  • VGGNet
  • 纸— BADnet
  • NPM 图书馆的故事
  • 悬赏黑客
  • 黑斑羚— DeepMind
  • 论文—等级奖励—深度思维
  • 论文—鲁棒对抗性强化学习
  • 古德哈特定律
  • 在这里报名参加人工智能大会!
  • 查看@ShirinGlander 的伟大 TWiML 草图!
  • TWiML 呈现:系列页面
  • TWiML 事件页面
  • TWiML Meetup
  • TWiML 简讯

“稍后再谈”作者 Lee Rosevere 经 CC 4.0 授权

原载于 2018 年 3 月 15 日【twimlai.com

深度学习中的对立例子

原文:https://towardsdatascience.com/adversarial-examples-in-deep-learning-be0b08a94953?source=collection_archive---------1-----------------------

这篇文章将包含与我在上次深度学习会议上的演讲基本相同的信息。我觉得随着越来越多的领域开始在关键系统中使用深度学习,让人们意识到神经网络如何被愚弄以产生奇怪和潜在危险的行为是很重要的。这篇文章的目标不是尽可能精确和详尽,而是让你对对立的例子有一个基本的了解,并希望让你对现代深度学习的一个问题敏感起来。

这篇博文和更多关于机器学习安全的信息可以在以下地址获得:【mlsecurity.ai/blog。

在开始这篇文章之前,我还想提一下,我不是做这项工作的研究人员的一部分。我只是一个非常好奇的人,来自 fast.ai MOOC,对深度学习充满热情。

首先,什么是对立的例子?

一个相反的例子是输入数据的样本,该样本已经被非常轻微地修改,其修改方式旨在导致机器学习对其进行错误分类。

一个例子应该有助于巩固这个想法。

An image classified as “suit” by the VGG16 neural network (left), a perturbation created specifically using the image on the left (middle) and the resulting perturbed image classified as a wig (right).

在这个图中,我们可以看到扰动图像(最右边)的分类显然是荒谬的。我们还可以注意到,原始图像和修改后的图像之间的差异非常微小

有了像“加州终于为真正的无人驾驶汽车做好准备了”或“五角大楼的‘终结者难题’:会自己杀人的机器人”这样的文章,应用对抗性的例子并不难找到……

在这篇文章中,我将首先解释这些图像是如何被创造出来的,然后讨论已经发表的主要观点。更多细节和更严谨的信息,请参考参考的研究论文。

首先,快速提醒一下梯度下降。梯度下降是一种优化算法,用于寻找可微函数的局部最小值。

A curve and a tangent to this curve.

在左图中,你可以看到一条简单的曲线。假设我们想要找到一个局部最小值(一个 x 的值,其中 f(x) 是局部最小值)。

梯度下降包括以下步骤:首先为 x,选择一个初始值,然后根据 x 计算 f 的导数f’,并为我们的初始猜测进行评估。 f'(x) 是曲线在 x 处切线的斜率根据这个斜率的符号,我们就知道是要增加还是减少 x 才能使 f(x) 减少。在左边的例子中,斜率是负的,所以我们应该增加 x 的值,使 f(x) 减小。由于切线是曲线在微小邻域内的良好近似,应用于 x 的值变化非常小,以确保我们不会跳得太远。

现在,我们可以使用这种算法来训练机器学习模型。

A set of data points and a linear model initialized randomly.

假设我们有一组点,我们想找到一条线,它是这些值的合理近似值。

我们的机器学习模型将是直线 y = ax + b ,模型参数将是 ab

现在使用梯度下降,我们要定义一个函数,我们要找到一个局部最小值。这是我们的损失函数

这个损失取一个数据点 x ,它对应的值 y 和模型参数 ab 。损失是真实值 yax + b,我们模型的预测的平方差。实际值和预测值之间的差异越大,损失函数值就越大。凭直觉,我们选择平方运算来惩罚真实值和预测值之间的大差异,而不是小差异。

现在我们根据模型 ab 的参数计算我们的函数 L 的导数。

如前所述,我们可以用每个数据点 (x,y)ab 的当前值来评估该导数,这将给出损失函数切线的斜率,并使用这些斜率来更新 ab ,以便最小化l

好的,这很酷,但这不是我们要如何产生对立的例子…

事实上,这正是我们要做的。假设现在模型是固定的(你不能改变 ab ,你想增加损失的价值。唯一需要修改的是数据点 (x,y) 。由于修改 y s 实际上没有意义,我们将修改 xs。

我们可以用随机值代替 x,损失值会增加很多,但这并不微妙,特别是,对于绘制数据点的人来说,这是非常明显的。为了使我们的变化不被观察者明显察觉,我们将根据 x. 计算损失函数的导数

现在,就像以前一样,我们可以在我们的数据点上计算这个导数,获得切线的斜率,并相应地少量更新 x 值。损失将会增加,并且由于我们正在少量修改所有点,我们的扰动将很难被检测到。

嗯,这是一个非常简单的模型,我们刚刚弄乱了,深度学习要复杂得多…

你猜怎么着?不是的。我们刚刚做的一切在深度学习的世界里都有直接的对等物。当我们训练神经网络来分类图像时,损失函数通常是分类交叉熵,模型参数是网络的权重,输入是图像的像素值。

对抗样本生成的基本算法,称为快速梯度符号法(来自本文),正是我上面描述的。让我们解释一下,并在一个例子上运行它。

x 为原图像, yx 的类, θ 为网络的权值, L(θ,x,y) 为用于训练网络的损失函数。

首先,我们根据输入像素计算损失函数的梯度。∇算子是一种简洁的数学方法,它根据函数的许多参数来计算函数的导数。你可以把它想象成一个形状矩阵【宽度,高度,通道】,包含切线的斜率。

和以前一样,我们只对斜率的符号感兴趣,以了解我们是想增加还是减少像素值。我们将这些符号乘以一个非常小的值 ε ,以确保我们不会在损失函数表面上走得太远,并且扰动是察觉不到的。这将是我们的摄动

我们的最终图像就是我们添加了扰动 η的原始图像。

让我们在一个例子上运行它:

FGSM applied to an image. The original is classified as ‘king penguin’ with 100% confidence and the perturbed one is classified as ‘tripod’ with 71% confidence.

能够使用目标模型计算梯度的攻击系列被称为白盒攻击

现在你可以告诉我,我刚才提出的攻击并不真实,因为你不太可能获得自动驾驶汽车上损失函数的梯度。研究人员想到了完全相同的事情,在的这篇论文中,他们找到了一种处理方法。

在更现实的情况下,您可能想要攻击只能访问其输出的系统。这样做的问题是,你将无法再应用 FGSM 算法,因为你将无法访问网络本身。

提出的解决方案是训练新的神经网络M’来解决与目标模型 M 相同的分类任务。然后,当M’被训练后,使用 FGSM 使用它来生成对立样本(我们现在可以这样做,因为它是我们自己的网络),并要求 M 对它们进行分类。

他们发现 M 会经常错误分类使用M’生成的对立样本。此外,如果我们无法获得针对M’的适当训练集,我们可以使用 M 预测作为真值来构建一个训练集。作者称之为合成输入。这是他们文章的节选,在文章中他们描述了他们对他们无法访问的 MetaMind 网络的攻击:

“在标记了 6400 个合成输入来训练我们的替代品(比 MetaMind 使用的训练集小一个数量级)后,我们发现他们的 DNN 对用我们的替代品制作的敌对例子的错误分类率为 84.24%”。

这种攻击被称为黑盒攻击,因为你把目标模型看成一个黑盒。

因此,即使攻击者没有访问模型内部的权限,他仍然可以产生对抗性的样本来欺骗它,但是这种攻击环境也是不现实的。在真实场景中,攻击者不被允许提供自己的图像文件,神经网络会将相机照片作为输入。这就是本文的作者试图解决的问题。

他们注意到,当你打印已经用足够高的 ε 生成的对立样本,然后对该打印进行拍照并分类时,神经网络仍然在相当大的时间里被愚弄。作者录制了一段视频来展示他们的成果:

Adversarial example in the physical world.

“我们使用手机摄像头拍摄的图像作为 Inception v3 图像分类神经网络的输入。我们表明,在这样的设置中,使用原始网络制作的敌对图像的很大一部分被错误分类为 ,即使当通过摄像机 输入分类器时也是如此。”

既然现实环境中的潜在攻击似乎是合理的,那么让我们回顾一些防御策略。

当试图为对立的例子辩护时,想到的第一个想法通常是生成大量的例子,并以这些图像和正确的类为目标在网络上运行更多的训练通道。这种策略被称为对抗性训练

虽然这种策略提高了对 FGSM 攻击的鲁棒性,但它有多个缺点:

  • 它无助于对抗更复杂的白盒攻击,如 RAND+FGSM ,正如文章中所解释的,我们不能用它来对抗训练网络。
  • 它也无助于对抗黑盒攻击。

这最后一点很令人惊讶,但却是真实的,在许多情况下都观察到了。这种行为的原因在本文中探讨。正当我写这篇文章时,我们不知道如何完美地进行适当的白盒防御。正如作者指出的那样,经过对抗性训练的网络仍然容易受到黑盒攻击,这一事实在介绍新防御策略的文章中往往没有考虑到。

虽然白盒防御似乎是一个困难的问题,但攻击者可以访问模型权重的假设是很大的。在这篇论文中,研究人员试图创造出对黑盒攻击具有鲁棒性的网络。

由于经过对抗训练的网络仍然容易受到黑盒攻击,作者提出了集合对抗训练,这是一种策略,它包括使用来自其他模型集合(通常为 2 到 5 个)的修改样本来对抗训练一个模型。例如,他们训练一个模型,使用其他 5 个预训练模型制作的对立例子对 MNIST 数字进行分类。对于黑盒攻击,错误率从对抗训练模型的 15.5%到整体对抗训练模型的 3.9%。

这种算法是迄今为止黑盒防御中最好的。

作为对辩护部分的总结,我将引用 I. Goodfellow 和 N. Papernot 的一篇博文:

“到目前为止,大多数针对对抗性例子的防御措施都没有很好地发挥作用,但那些发挥作用的措施却没有适应性。这意味着这就像他们在玩打地鼠游戏:他们关闭一些漏洞,但让其他漏洞保持开放。”

我希望你喜欢阅读这篇博文。如果你注意到任何拼写或数学错误,不要犹豫留下评论。

敌对预测网络

原文:https://towardsdatascience.com/adversarial-predictive-networks-3aa7026d53d2?source=collection_archive---------3-----------------------

作者:Lukasz Burzawa、Abhishek Chaurasia 和 Eugenio culrciello

我们想测试像 [CortexNet](https://engineering.purdue.edu/elab/CortexNet/) 这样的预测性神经网络将从同时训练中受益的想法:

1-预测视频中的未来帧

2-使用对抗性训练来区分视频中的真实帧和网络生成的帧

我们称之为对抗性预测训练。这个想法是改进 CortexNet 的能力,在更多的未标记数据上进行预训练,然后只使用少量的标记数据。

我们以这种方式修改了我们的新型神经网络:

我们添加了一个分类器 C 来预测伪生成帧和真实生成帧。我们的网络鉴别器或编码器 D 类似于标准的多层神经网络,因此我们将分类器 C 放置在所有绿色层之后。蓝色生成层或解码器层对于重建未来的图像或表示是有用的。更详细的是这里。

为了进行培训,我们采用以下步骤:

1-我们训练网络来预测下一帧,就像在常规的 [CortexNet](https://engineering.purdue.edu/elab/CortexNet/) 中一样

2-一旦网络可以生成合适的未来帧,我们训练分类器 C 来预测输入是真实的下一帧还是生成的下一帧

我们在每个训练步骤中按顺序运行步骤 1、2。

这些是 G 和 D 模块的详细信息:

D, G blocks in detail

我们在 conv 和 ReLU 之间使用批量标准化。

结果:使用 KTH 数据集,我们用上述对抗性预测方法对网络进行预训练,然后通过冻结生成器的网络,使用 10%的数据来训练分类器 C。

CASE 1

CASE 2

案例 1 :我们用 10%的数据训练整个网络。我们得到了 60.43%的最高测试准确率

案例 2 :我们对 100%的数据使用了对抗性预测训练(假/真,也预测下一帧),然后对 10%的数据进行了网络微调。我们得到了 53.33%的最高测试准确率

CASE 3

案例 3 :我们只对 100%的数据使用预测训练(预测下一帧,作为原始 CortexNet),然后对 10%的数据微调网络。我们得到了最高 71.98%的测试准确率

结论:如你所见,我们期望案例 2案例 3 更好。但这并没有发生: (53 对 71% —案例 2 对 3)。我们的结论是,对抗性预测训练在训练关于假/真分类的分类器和整个网络的预测能力之间产生冲突。

对 33%(62%对 79% —案例 2 对 3)和 50% (71%对 81% —案例 2 对 3)的数据进行预训练,而不是只对 10%的数据进行预训练,并没有改变这种情况,而且使用更多的数据无论如何都无法达到对未标记数据进行预训练的目的…

关于作者

我在硬件和软件方面都有将近 20 年的神经网络经验(一个罕见的组合)。在这里看关于我:媒介、网页、学者、 LinkedIn 等等…

捐款

如果你觉得这篇文章有用,请考虑捐赠来支持更多的教程和博客。任何贡献都能有所作为!

在数据科学领域找工作的建议:在就业市场学到的 10 个教训

原文:https://towardsdatascience.com/advice-for-getting-a-job-in-data-science-10-lessons-learned-whilst-on-the-job-market-f305f4c9033d?source=collection_archive---------6-----------------------

这是我计划撰写的一系列帖子的第一篇,我希望这些帖子能够帮助其他人做出正确的决定,在数据科学领域找到一份工作。在任何领域就业都有许多因素,其中许多因素都是主观的,所以要努力从多种渠道获取意见。不可避免地会有人,其中一些会比我更有经验,会不同意我的一些观点。尽管如此,我还是希望我的建议对许多人有用,因为大部分建议都来自个人经验。

第一篇文章实际上来自我在 2017 年 1 月为一家名为 Pivigo 的公司写的一篇博文。它描述了我在 2016 年 9 月完成 Pivigo 的数据科学训练营“科学到数据科学”(S2DS)后,在找工作时学到的东西。我将在未来的帖子中写一篇关于我在 S2DS 上的时间的文章,但简而言之,我强烈推荐它,如果你想了解更多关于数据科学训练营计划的信息,请查看他们的网站:【www.s2ds.org】T2

总之,我说够了。以下是我去年一月的博客(最初贴在这里)。

原始帖子

参加 S2DS 研讨会的最大好处之一是增加了我的就业能力。我脑子里盘旋着许多问题:S2DS 毕业后的就业率是多少?找工作需要多长时间?这是得到数据科学工作的最好方法吗?……………….这样的例子不胜枚举。然而,不可避免的一个方面,我没有问太多细节,是实际的求职。

就业市场可能是一个令人望而生畏且无情的地方,尤其是当你第一次去那里的时候。对许多人来说,找工作是职业生涯中最糟糕的部分。但它可以塑造性格,教会你很多关于自己的事情,最重要的是,当你最终找到一份合适的工作时,它会给你带来难以置信的回报。是啊!当你找到合适的工作。

我对就业市场的尝试持续了 3 个月,在这段时间里,我有了许多与找工作相关的典型经历;拒绝、挫折、压力等。这不是一件容易的事情。看着别人在很棒的地方找到工作,我的自尊心也受到了一定程度的打击,因为我想“为什么不是我呢?我真的不够好吗?”

然而,并非一切都像看上去那么糟糕。我没有失业。我在牛津大学有一个博士后的职位,在我找到工作之前,我一直没有时间。通过我在 S2DS 建立的联系,我有一个很大的支持网络,我似乎总是有至少一个面试机会。在这种时候,关注积极的一面绝对是个好主意。总的来说,我意识到我其实很幸运。

考虑到这些,我想分享一些我在寻找合适的数据科学工作时学到的经验。我希望这能帮助那些正在寻找或将要开始寻找数据科学(或实际上任何)领域工作的人。我还必须加上一个强制性的“这份清单绝非详尽无遗”限定词。

我们开始吧:

1)网络!!!我知道人们说这很重要,但让我这么说吧:我申请的每家公司都拒绝了我,其中只有一家通知了我。然而,我收到的四份工作邀请中的三份,一份来自一位朋友的推荐,另外两份是在雇主找到我之后,因为他们看到我在一次聚会上做 S2DS 演示。这就是第一课的原因!

更新你的 LinkedIn 个人资料
雇主会看的。甚至在我上 S2DS 数据科学课程的时候,在我提出任何申请之前,在我认为我正式进入市场之前,雇主们就在寻找。因此,请确保您的在线个人资料/状态是最新且合适的。如果你没有名片,这是一个不错的选择。

3)了解你想要的角色类型
数据科学是一个非常宽泛的术语,用于涵盖多种角色。人们往往希望更适合业务分析师或软件工程师的工作规范被贴上“数据科学家”的标签。知道你想成为什么样的“数据科学家”将有助于你筛选出你不喜欢的工作规范,并让你在面试中提出更具体的问题。

准备你想问的问题招聘人员和雇主通常会在谈话或面试结束时问你是否有问题要问。准备好问题向面试官表明你感兴趣。相信我,当你只能说“对不起,我现在没有任何问题要问你”的时候,感觉很垃圾

脸皮厚一点在得到你想要的工作之前,你可能要花很多时间,而且在得到你想要的工作之前,你可能要经历很多拒绝。别往心里去。找出你可以改进的地方,然后继续前进。就业市场可能是无情的。

诚实在简历和面试中保持诚实会让生活变得容易得多。当你知道雇主对你的实际经验感兴趣时,你可以更放松地去参加面试。他们似乎也能接受自我意识,理解我的局限所在。

7)不要低估自己
从技术上来说,你很可能已经够资格成为一名数据科学家,因此你需要像数据科学家一样重视自己。我的第一份工作来自一家公司,该公司给我提供了一个职位,工资低于数据科学家的市场价值,他们将让我参加一个研究生计划,因为我被认为缺乏经验。两个月过去了,我得到了一个数据科学家的职位,这个职位的市场价值比我这个级别的数据科学家高。这也超过了任何招聘人员所说的我应该重视的程度。不要妄自菲薄!

做好坦率提问的准备他们来了。“你期望的薪水是多少?”,“你对我们公司有什么顾虑?”“是什么让你选择我们而不是其他公司?”第一个问题是每个给我工作机会的公司都会问我的。当我处于幸运(但有时令人沮丧)的情况下,其他公司知道我有多个工作机会时,其他人也问了这个问题。你应该准备好知道你对这些问题的答案,尤其是你想如何处理薪水的问题。

从你信任的中立人士那里获得建议
很多人在给你建议的时候都会有特定的目的(脑海中浮现出招聘者)或者偏见。我经历过这种情况,当我收到多份邀请,不同的人就最终担任哪个角色提出相互矛盾的建议。从几个我真正信任的人那里得到中立的建议真的很有帮助。

10)做出明智的决定
这非常重要。当我决定接受哪份工作时,情况尤其如此。在做出决定之前,我需要确保我已经和每家公司的相关人员谈过了(我几乎没有和一家公司谈过就做出了决定,但幸运的是被我信任的人说服了)。我还发现,在做出任何最终决定之前,与中立的人交谈会有所帮助。

现在,我可以说“我去过那里,做过那件事,穿过 t 恤衫”,并将在新的一年开始我作为数据科学家的新角色。随着新篇章的开始,不可避免地会有新的经历和更多的教训需要学习。放马过来。

找数据科学工作的建议:简历

原文:https://towardsdatascience.com/advice-for-getting-a-job-in-data-science-the-cv-c5b8ec6bebc?source=collection_archive---------5-----------------------

一份出色的简历可能会让你获得面试机会。一份不好的简历会被扔掉!

这就是简历的重要性。通常这是雇主对你的第一印象,所以不要想让它变好,你的目标是让它变得出众。

现在,我远不是写简历的专家。如果我说我的求职成功率高于平均水平,那我是在撒谎。此外,网上已经有几篇文章对如何写简历给出了很好的指导和建议。事实上,我读过的对数据科学简历提出建议的最好的文章之一是由皇家邮政高级分析和数据科学主管本·迪亚斯写的,题为“招聘经理在数据科学家的简历中寻找什么?”

那么,我为什么要费心写一篇关于简历建议的帖子呢?

几个月前,我被要求浏览简历,并帮助筛选公司数据科学职位的面试候选人。这对我来说非常有见地。我看到了一些非常突出的东西,有正面的也有负面的。所以我想根据我从那次经历中学到的东西给你一些建议。

1.不要低估自己

记住,你是为了正确的理由而努力脱颖而出。当雇主看你的简历时,通常不是孤立的。他们看过很多简历,所以你会被拿来和其他人比较,有些人不怕夸大一点来让自己脱颖而出。雇主的任务是筛选出那些夸大事实的人。然而,如果要在一个简历夸大的候选人和一个简历低估自己的候选人之间做出选择,我可能会把赌注押在简历夸大的候选人身上。

让我们明确一点,我不是说你应该在简历上撒谎,但是不要使用让雇主有理由认为你没有实际上那么好的语言。

例如,假设你已经完成了一些在线数据科学课程,并且你已经用 Python 编程 6 个月了。你不太可能成为世界一流的 Python 程序员。但这并不意味着你应该在简历中注明你是“Python 初学者”。

Python 初学者是什么水平?是不知道如何编写 for 循环的人,还是对 Scikit-learn 中的机器学习知之甚少的人?我认为它们是不同程度的暴露。使用 Scikit-learn 的人可能可以浏览机器学习包生态系统,但 for-loop 初学者可能甚至没有见过终端/命令窗口。你永远不知道雇主会如何解释“初学者”。

所以请记住,你不必夸大你的技能,但是不要使用低于你的技能水平的语言。不要低估自己。

2.关注价值

作为一名数据科学家,很容易高估算法的重要性。关于如何实现各种 ML 模型和解决不同问题的新神经网络架构的教程不计其数,似乎每周都会出现。但事实是,模型只是造就优秀数据科学家的一小部分。最终,你必须表明你理解并关心商业价值。

我记得曾经看过一份候选人的简历,据说他有超过 10 年的数据科学经验。简历中充斥着数据科学术语。这位候选人使用了各种算法来完成工作项目,并获得了非常好的评估指标分数。太好了。但是在任何地方都没有提到商业附加值。这个项目产生了多少额外收入?对于 90%的分类准确率,效率提高了多少?我可以继续。

你简历上关于某个特定项目的分数应该是这样的:“我使用了 X 技术,获得了 Y 分数,并转化为 Z 值”。

如果你不能将模型性能的输出与附加的商业价值联系起来,那么你将失去巨大的印象分。

注意:如果你正在申请你的第一份工作,那么这不是一个很大的问题,但是如果你现在已经在工业界工作,那么你需要考虑你目前的项目如何提供商业价值,如何增加你的简历对未来雇主的吸引力。

记住关注价值。

3.展示自己

显然,简历应该是一个关于你和你的技能的光辉故事,但这是 2018 年的人!你可以超越你的简历。您可能有一个展示您的数据科学技能的博客,或者您可能有展示您进行精彩演示的视频。至少你应该在 GitHub 上有几个项目,以显示你有一个体面的技术能力的基础水平。你的简历中应该有所有这些东西的链接。不能保证雇主会看它,但是你给了他们选择权。谁知道呢,如果他们真的看了,你可能会给他们留下深刻印象。这就是我看过的一份简历的情况。

其中一个候选人链接了他们的博客,所以我决定去看看。我在那里看到了一些很棒的文章,其中一篇是关于我不熟悉的话题。我可以立即看出这位候选人有很好的技术知识和良好的书面沟通技巧,所以我建议这位候选人应该被选中参加面试(当然,简历的其他部分也必须很好)。

所以不要害怕,展示自己

4。陈述你的相关技能…..早期

当你看一份工作说明书时,他们几乎总会有一部分是关于【期望技能】或其他类似的内容。这听起来可能很明显,但这些技能应该与你在简历中写的技能相匹配(你不必匹配所有的技能,在许多情况下,即使 50%也可以)。所以确保你在简历中陈述了这些技能。

我个人喜欢简历中的“技术技能”部分,因为它很容易查看和浏览列表,以了解候选人拥有什么技能,而无需试图挖掘大量的项目工作。虽然有些人不同意这一点。挺主观的。

但是无论你决定做什么,确保这些技能能在你简历的第一部分找到。

大约 6 个月前,我看了一个朋友的简历,他是一名博士后研究员。我已经知道他们具备初级数据科学家所需的基本技能,但是,他们的简历并没有说明这一点。我不得不翻到简历的第二页,才找到相关的技能。雇主不可能有那么大的耐心。那份简历很可能在任何人接触到相关部分之前就已经被许多公司扔掉了。

所以记得在早期陈述你的相关技能。

5.让很多人阅读你的简历

让我这么说吧:

如果你是唯一看过你简历的人,那么这是一份糟糕的简历!

也许这种说法有点苛刻,但我这样说是有充分理由的。简历不是为你设计的,而是为别人设计的——雇主。所以,即使你喜欢你的简历,你需要喜欢的人也可能不喜欢。

从几个信任的人那里获得反馈。不要害怕听到批评。它发生了。你的简历在初稿中不太可能是完美的。在寄出之前展示给别人看将会改善它,最重要的是,增加你获得面试的机会。

我自己的简历被我的三个朋友评论过,那是从我找到现在的工作开始的。有些人对应该如何写有非常不同的意见(一个人认为应该是 1 页,另一个人说如果我溢出到 3 页也没关系),所以我不得不管理我挑选的内容,但总的来说,反馈极大地改善了我的简历。

所以在你让很多人阅读你的简历之前,不要发出你的简历。

和往常一样,这并不是制作简历技巧的详尽清单,但这些是我在浏览候选人简历时注意到的。我希望这对你有所帮助。如果您有任何其他提示、意见或问题,请随时在下面留言。

感谢阅读。

ART + AI —使用(Tensorflow 和 TPUs)生成非洲面具

原文:https://towardsdatascience.com/african-masks-gans-tpu-9a6b0cf3105c?source=collection_archive---------11-----------------------

容易吗?需要多少数据?数据质量会影响结果吗?甘人学到了什么?

African Masks generated using a DCGAN model.

2018 年 8 月,我有机会参加了 2018 深度学习 Indaba ,在这里 Google 慷慨地向所有参与者提供了 TPUs (v2)的访问权限!我最终花了一些时间来熟悉在 TPUs 上运行 ML 实验,并开始训练 GAN 基于我一直在管理的自定义数据集生成图像——非洲掩模数据集。TPUs 提供了一些强大的计算能力(与高端 GPU不相上下),能够快速完成训练实验。访问 TPU 使我能够探索一些与训练 gan 相关的问题——例如,多少数据是足够的数据?图像大小如何影响生成的输出?数据质量有多重要(例如,整理数据集的努力?)生成的样本有多新颖?等等。在这篇文章中,我提供了我训练 GAN 的步骤、结果和有趣的观察。

想尝试使用生成的图像进行交互式演示,并探索它们与训练数据集中的图像的相似性吗?试玩在这里。有机会使用 TPU,并希望根据您的客户数据培训 GAN?本项目使用的代码在 GitHub 上,包括训练好的模型用于生成遮罩。

Web demo interface allows you view generated images and most similar from the dataset based on features extracted from a VGG network (block1_pool and block5_pool).

TPUs 上的张量流

要在 TPUs 上运行 TensorFlow 代码,最重要的部分是使用 TPU 版本的设计相当好的估算器 API。估计器封装了训练循环的以下方面:训练、评估、预测、服务输出。在很大程度上,使用该 API 编写的 Tensorflow 代码(顺便说一句,keras 模型可以很容易地转换为估算器 API)可以通过用 TPU 估算器替换常规估算器在 TPU 上运行。更好的是,tpuEstimator 将在 CPU 和 GPU 上工作(您应该设置 use_tpu 标志),允许在部署到 TPU 集群之前在本地机器上进行简单的测试。

TPUEstimator 处理在 TPU 设备上运行的许多细节,比如为每个内核复制输入和模型,以及定期返回主机运行钩子。

幸运的是,我不必从头开始实现 DCGANs,因为 Tensorflow 确实提供了一些样本代码。然而,该示例支持 32px 图像(cifar 数据集)的生成,我的主要任务是扩展该模型以支持大图像尺寸(64px,128px),类似于使用 artDCGAN 所做的工作。这主要是通过扩展(增加层)DCGAN 模型中的生成器和鉴别器来实现的。这里最棘手的部分是确保大小的一致性,即确保每一层或功能的输入/输出与预期的形状和大小相匹配。

生成对抗网络

GANs 是深度神经网络的一种形式,对于密度估计特别有用。gan 是生成性的,因为它们学习一个分布(训练图像数据集)并且能够生成位于该分布内的“新颖”样本。它们是对抗性的,因为它们被构造为一个游戏,其中两个神经网络(生成器 G 和鉴别器 D )竞争——G学习生成假图像(通过估计图像数据分布),而 D 学习区分真实和假图像(图像来自分布或来自的概率

随着游戏的进行, G 学会创造 D 无法从真实图像中分辨出来的“令人信服”的图像。期望 G 学习数据中的所有显著“模式”,并在生成新图像时涵盖所有这些模式。例如,在 Cifar10 数据集上训练的 GAN 应生成所有 10 个类别(汽车、卡车、飞机等)的图像。该研究领域的进展集中在为两个网络寻找良好的自我评估标准(损失函数)、解决几个已知问题的更好的架构(例如,一个网络压倒另一个网络、无法学习数据分布的所有“模式】)、生成逼真/高分辨率图像等。

对于这个项目,使用无条件 DCGAN1或深度卷积 GAN 架构,其架构选择使其在训练期间保持稳定。Tensorflow 提供了使用 TPUs 训练 DCGAN (CIFAR,MNIST)的示例代码,该代码针对本实验进行了扩展。

数据准备和培训

对于这个项目,我使用了非洲面具数据集——一组手动管理的描绘非洲面具的 ~9300 图像(我仍在管理这个数据集,但计划很快发布)。

这个数据集的目标是为探索人工智能和非洲艺术的交集提供额外的资源。

需要注意的一点是,该数据集包含不同“模式”的图像(即许多不同形状、纹理等的遮罩),而不是像 CelebA 这样定义良好的数据集,它只包含有限变化的人脸。看看 GAN 如何尝试从这个数据集学习模式以及它对这些模式的解释将会很有趣。我们的目标不是生成一个完美逼真的面具(这是最近 GAN 作品的一个共同目标),而是更多地观察编码在生成的 GAN 中的任何创造性或艺术性的元素。

TPU 培训

对于训练,第一步是调整裁剪每张图像,然后转换为 TFrecords 。用于此的脚本在项目的 Github repo 中提供。虽然我们不关心无条件 gan 的标签,但是脚本使用目录名作为标签(类似于 torch visionimage folder)。

两个版本的 DCGAN 模型被训练以分别生成 64px 和 128px 图像。这包括更改输入函数以反映新的输入大小,然后扩展模型(向 D 和 G 添加层)以匹配 64px 和 128px 代。两个模型的其他参数基本相似——训练步数:15k,批量:1024,固定噪声维数:100,学习率:0.0002(对于 D 和 G)。

一些有趣的观察

64px 与 128px 一代

与 128 像素模式相比,在 64px 模式下生成的图像提供了更好的多样性。虽然 128px 图像的质量明显更高,但它们似乎存在部分模型崩溃的问题。这可能是由于数据集不足以训练如此大的模型(我也为 128px 模型试验了更长的训练时间,但这没有帮助)。

LEFT: 128px images generated using a DCGAN, fixed noise vector (dim=100), 15k steps, batch size 1024. Notice how several “modes” appear to emerge within the generated masks (highlighted with same color). While this may be as a result of the sample size. However this does not occur to the same degree when generating 64px images using similar training parameters. RIGHT: 64px images generated using a fixed noise vector (dim=100) 15k steps, batch size 1024. These results show more diversity compared to the 128px images.

多少数据才算足够的数据?

我发现在实践中,一个低至 2k -3k 图像的数据集会生成某种形式的“结果”。为了进一步探索数据集大小如何影响生成的结果,我提取了掩膜数据集(3k 图像,64px)的随机样本,并训练了一个模型。这里的主要观察结果是,局部“模式崩溃”(这个问题在这里有很好的解释)的发生率更高,并且生成的图像的多样性降低。下面的屏幕截图包含从使用相同参数训练的两个模型生成的图像,但是使用 3k 数据集和完整的 9k 数据集。其他研究项目(见这里)似乎训练 GANs 在 6k 和 9k 图像之间有不错的结果。到目前为止,我的直觉是,对于具有某种程度相关性的数据集,GAN 能够从大约 6k-9k 图像开始学习有趣的模式。随着我进行更多的实验,我将更新这一部分。

64px images generated with similar models but left uses a 3k dataset and right uses the full 9k images in the dataset. Images generated using the 3k image dataset shows lower diversity with several similar/repeated images (highlighted).

有噪声的数据集重要吗?

管理数据集可能很乏味。初始图像搜索结果可能包含不可用的数据(例如,图片的图片、草图、2D 图像、标记为遮罩的无关图像等)。这就提出了一些相关问题——噪声图像的存在如何影响 GAN 产生的图像质量。为了探索这一点,我使用 13k 图像(来自网络搜索的未整理结果)训练了一个模型,并将结果与我手动整理的 9k 图像进行了视觉比较。

64px images generated with similar models but left uses a 3k dataset and right uses the full 9k images in the dataset. Images generated using the 3k image dataset shows lower diversity with several similar/repeated images (highlighted).

在我的例子中,似乎有额外的图像(大约 3k,整个数据集的 20%)没有被策划,并没有完全阻止生成器探索数据中有趣的模式(左上图)。然而,有一些随机的图像(用红色突出显示)明显没有非洲面具的预期纹理或图案。为了进一步探索这个问题,我收集了 29k 张“茶杯”图片的数据集,并训练了一个模型。下图显示了结果(训练至 25k 步和 32k 步)。虽然有一些看起来特别有趣的图像,但仍然不清楚我们是否会通过管理数据集做得更好。

思考:如果你的目标不是“完美”地表示数据集中的模式,那么手工处理图像不会给你带来更多的价值。

Teacups generated from an “uncurated” dataset (29k) of teacups. LEFT: Trained to 25k steps. RIGHT: Trained to 32k steps.

甘人学到了什么?

这可能是这个实验中最有趣的方面。它聚焦于一个经过充分研究的问题“GAN 实际上学习什么?”,但更多的是从定性的角度。一种方法是观察生成的图像和数据集中的图像之间的相似性。在他们的论文中,Karras 等人[2]使用这些图像之间的像素的 L1 距离来计算这一点。这种方法被批评为过于简单(没有利用任何图像内容的知识)。为了计算相似性,使用预训练的 CNN ( [VGG16](http:// VGG16) ,Simonyan 和 Zisserman 2016)作为特征提取器。然后计算相似性,作为生成的图像和训练数据集中的图像之间的余弦距离的度量。

def compute_cosine_distance_matrix(feat, feat_matrix): cosine_dist_matrix = scipy.spatial.distance.cdist( feat_matrix, feat.reshape(1, -1), 'cosine').reshape(-1, 1) return 1 - cosine_dist_matrix

我尝试使用 VGG 的各种maxpool图层提取特征进行相似性计算,发现早期和后期图层在识别视觉上看起来相似的图像方面表现最佳。我创建了一个演示,它根据 VGG 网络中两个层(早期层和后期层(block5_pool))的特征,显示了每个生成图像的数据集中前 24 个最相似的图像。

An interface that displays images similar to the generated images from the GAN. Similarity is computed as cosine distance of features extracted from layers of a pretrained CNN (VGG). Qualitative inspection suggests using an features from an early layer (block1_pool) finds images with similar low level features (color, pixels, texture), while later layers find images with similar high level features (shapes and and objects) etc. Check out the demo on this here — https://victordibia.github.io/cocoafrica/#masks

初步结果显示,GAN 生成的图像与数据集中它们最近的亲戚非常不同。没有明显的副本。这种解释是主观的,受限于生成图像的模糊性质,鼓励读者观看演示以形成更好的意见。

对生成图像的交互式检查还提供了查看数据集中一些有趣模式的机会。一些包括具有特定侧向取向的面具、具有毛发或毛发状突起的面具、长方形面具。相似性信息也可以是一种(弱监督的)技术,用于管理图像数据集,启用数据集的特定“模式”并发现异常值即坏图像。

Some of the images generated by the GAN are similar to some observable “modes” within the mask dataset. Some of these modes might reflect artistic style and origins of the masks themselves (yet to be explored).

摘要

  • 与 TPU 一起工作比我最初想象的要容易。Estimator API 设计得非常好(封装了训练循环);已阅读并遵循现有评估程序 API 代码。对于已经熟悉估计器(或其他支持标准化训练 NN 训练循环的框架)的个人来说,完成工作将会很容易。
  • 在这个项目中,一个麻烦的部分是对我的数据转换脚本(从原始图像到训练中摄取的 TFrecords)进行故障排除。我扩展了示例 DCGAN 代码,它碰巧期望一个形状为【通道,高度,宽度】的图像张量,而不是我更习惯的【高度,宽度,通道】。这并没有抛出任何错误——只是意味着我运行的前 30 个左右的实验产生了绝对嘈杂的废话。TFrecords 非常优秀有很多原因——然而,如果 Tensorflow 能够更好地标准化这一过程,它将会非常有用(不确定 TF 是否已经有了类似 torchvision imageFolder 的东西)。

提示:为了确保万无一失,要经常检查你的 TFrecords 中进出的东西。

  • 组装一个干净的数据集是实际使用 GANs 进行有意义的艺术探索的一个非常重要的部分。这为支持数据集管理的工具提供了一个案例——可能以半监督的方式,我们标记一个小样本,在这个样本上训练一个模型,并使用它来“管理”其余的数据。
  • 甘斯可以用于艺术探索。在这种情况下,虽然一些生成的图像不是完整的蒙版,但它们擅长捕捉非洲艺术的纹理感觉。例如,我给一位同事看,他们提到生成的图像具有“部落感觉”。
  • GANs 领域的许多现有工作集中于生成“真实”图像。虽然这非常有用(事实上,这是 GANs 等应用程序所希望的,因为超分辨率),但了解 有多少来自训练数据的 信息被合并, 它们如何被组合 以生成新图像,以及这些图像是否真的新颖也很重要。定性检验实验(真实世界数据集)可以提供这方面的见解。
  • 预训练模型作为这些检查/相似性实验的特征提取器工作良好(与像素中的简单 L1 距离相反 Karras 等人 2017 年[2])。早期的图层允许我们根据线条和纹理等低级特征来检查相似性,而后期的图层则侧重于形状等高级特征。

后续步骤

在做这个项目的时候,我确实对 GANs 有所了解;非常感谢谷歌使 TPU 可用。一如既往,未来工作的机会数不胜数。我正在考虑的一些方法包括——扩展非洲面具数据集,用条件化的 GANs 做实验(学到的特征如何与艺术属性相对应?)和其他用于真实/更高分辨率图像生成的架构。

知道下一步该做什么吗?你可以随时联系 Twitter、T2、Github 或 T4 的 Linkedin。

参考

1 A .拉德福德,l .梅斯,s .钦塔拉,“深度卷积生成对抗网络的无监督表示学习”,arxiv 1511.06434【cs】,第 1–16 页,2016。

[2] T. Karras、T. Aila、S. Laine 和 J. Lehtinen,“为提高质量、稳定性和变化性而逐步种植 gan”, CoRR ,第 abs/1710.1 卷,2017 年 10 月。

聚合和分组

原文:https://towardsdatascience.com/aggregation-and-grouping-66396f26dd95?source=collection_archive---------6-----------------------

GSoC:在 Pharo 中实现数据框架

这是 Pharo DataFrame中聚合和分组的第一个实现。它仅涵盖基本功能,例如按相应大小的另一个系列的值对数据框或系列进行分组,然后将聚合函数应用于分组的数据结构。

在接下来的迭代中,该功能将根据目标用户场景进行扩展。实现也很有可能发展成更加优化的东西。

什么是 DataFrame?

数据框是一种类似电子表格的表格数据结构,它提供了一个用于切割、清理和分析数据的 API。在 Pharo 中实现数据帧是我今年谷歌代码之夏项目的一部分。您可以在这个库中找到代码:https://github.com/PolyMathOrg/DataFrame,并使用下面的 Metacello 脚本将其加载到您的映像中:

Metacello new
  baseline: 'DataFrame';
  repository: 'github://PolyMathOrg/DataFrame';
  load.

如果您想了解更多关于 DataFrame 项目的信息,请查阅文档并遵循您可以在资源库中找到的教程。文档仍在开发中,所以如果你找不到问题的答案,请随时给我写信:olk.zaytsev@gmail.com

拆分-应用-合并

分割-应用-组合是一种策略,你把一个大问题分解成可管理的小块,独立地处理每一块,然后把所有的小块组合起来。

数据聚合和分组允许我们为显示或分析创建汇总,例如,在计算平均值或创建计数或总和表时。这是一个遵循分割-应用-组合策略的过程:

  1. 根据某些标准将数据分组
  2. 将该函数独立应用于每个组
  3. 将结果组合成一个数据结构

履行

在这一节中,我将解释聚合和分组功能目前是如何实现的。如果您对这些细节不感兴趣,可以跳过这一部分,跳到下一部分。

考虑以下发送到firstSeries对象的消息:

firstSeries groupBy: secondSeries.

收到这个消息后,firstSeries创建了一个对象DataSeriesGrouped,它根据secondSeries的值将firstSeries分割成一系列子序列。然后,子系列的集合被存储为DataSeries(名为groups的实例变量)的对象,其键等于secondSeries的唯一值,值存储firstSeries的子系列,对应于这些唯一值中的每一个。

当一个groupBy:消息的接收者是一个DataFrame时,它创建一个DataFrameGrouped的实例,该实例以类似于DataSeriesGroup的方式分割数据,除了groups系列的值是子数据帧,而不是子系列。换句话说,groups是一个DataSeries,其关键字对应于数据帧分组所依据的系列的唯一值(secondSeries),并且groups的每个值存储一个较小的数据帧,该数据帧具有由数字指定的行,其中secondSeries的值等于groups的对应关键字。如果数据框按其中一列进行分组,则在分组之前,该列将从数据框中排除。这样我们避免了数据重复,因为相同的值将作为groups变量的关键字存储。

DataSeriesGrouped的情况下,每个子序列将被聚合成一个标量,所有这些标量将被组合成一个新的DataSeries。至于DataFrameGrouped,它会将块应用于每个子数据帧的每一列,并将结果标量矩阵作为新的DataFrame返回。

聚合是通过apply:消息完成的。它将一个块作为参数,并将其应用于 groups 系列的每个值,并将结果组合成一个新的数据结构。对于一些常用的聚合函数,如maxminaverage等。,DataGrouped提供更短的消息。在这个迭代中,所有这些消息都只是方便的快捷方式

average
   ^ self apply: [ :each | each average ].

但是在将来,这些消息将包含相应聚合的优化实现,因为这些函数的时间和内存效率非常重要。

用法示例

在这一节中,我将提供一些简单的示例,例如按另一个系列的值对一个系列进行分组,按一个系列的值对一个数据框进行分组,最后我将展示如何将聚合函数应用于分组后的数据。

餐馆小费数据集

我将把我的例子建立在餐馆小费的数据集上。它最初出现在 Bryant & Smith 1995 年关于商业统计的文章中。您可以在这个 GitHub 资源库中获得一个带有 tipping 数据集的 CSV 文件:https://GitHub . com/wesm/pydata-book/blob/master/ch08/tips . CSV。

让我们使用fromCSV:方法将数据读入DataFrame

tips := DataFrame fromCSV: '/path/to/tips.csv'.

快速了解存储在数据框中的数据集的最简单的方法是查看其标题-前 5 行(tips head)

 |  total_bill  tip    sex     smoker  day  time    size
--+------------------------------------------------------
1 |  16.99       1.01   Female  No      Sun  Dinner  2
2 |  10.34       1.66   Male    No      Sun  Dinner  3
3 |  21.01       3.5    Male    No      Sun  Dinner  3
4 |  23.68       3.31   Male    No      Sun  Dinner  2
5 |  24.59       3.61   Female  No      Sun  Dinner  4

我们可以看到,tipping 数据集有 2 个定量变量:total_billtip,5 个分类变量:sexsmokerdaytimesize。在下面提供的例子中,我们将只根据分类变量对数据结构进行分组。从技术上来说,也可以通过数量变量进行分组,但在大多数情况下,这种分组不是很有用(更不用说它在教程中看起来不太好)。

分组系列

应用groupBy操作符的最简单的例子是将一个系列的值按照另一个相同大小的值进行分组。

bill := tips column: #total_bill.
sex := tips column: #sex.bill groupBy: sex.

这个查询的结果将是一个对象DataSeriesGrouped,它将bill分成两个系列,映射到sex系列的‘Male’‘Female’值。

Female  (16.99 24.59 35.26 14.83 ... 18.78)
Male    (10.34 21.01 23.68 25.29 ... 17.82)

由于大多数情况下我们需要对属于单个数据框的两列序列进行分组,因此有一个方便的快捷方式:

tips group: #total_bill by: #sex.

分组数据框

除了上面演示的对其列进行分组的快捷方式之外,DataFrame还提供了一种通过其中一列对自身进行分组的方法。

tips groupBy: #smoker

该查询的结果将是一个对象DataFrameGrouped,存储两个独立的数据帧——一个针对所有吸烟者,一个针对非吸烟者。smoker列将从这些数据框中排除,因为它的值将作为键存储在DataFrameGrouped对象中,吸烟者和非吸烟者的单独分组将允许我们在需要时完全重建smoker列。

聚集分组数据

聚合函数将一个序列作为输入,并返回一个汇总该序列值的标量值。这些是统计函数:minmaxaveragestdev等。,像sumcount等很多功能。

一旦数据被分组,我们就可以对组成的组应用聚合函数,并接收汇总初始数据的组合数据结构

grouped := tips group: #total_bill by: #day.
grouped apply: [ :each | each average round: 2].

因为我们是按照另一列对DataFrame的一列进行分组,所以结果将是一个DataSeries的对象

a DataSeries
Sun   21.41
Sat   20.44
Thur  17.68
Fri   17.15

如前所述,DataGrouped提供了一些常用聚合函数的快捷方式,如minmaxaveragesumcount等。目前它们只是快捷方式,但以后它们将实现应用速度更快的优化聚合(对于像 tipping 这样的小数据集,速度不是一个严重的问题)

grouped min.
grouped max.
grouped average.

一旦数据帧被分组到一个对象DataFrameGrouped中,我们也可以对这个对象应用一个聚合函数。DataFrameGrouped 实现 apply:消息的方式是将函数应用于每个子数据帧的每一列,从而产生标量值。这些标量然后被组合成一个新的数据帧。

(tips groupBy: #sex) count.

此查询的结果将是一个数据框,其中包含每一列的非空单元格的数量,对应于“男性”和“女性”行

 | total_bill  tip  smoker  day  time  size
-------+-----------------------------------------
Female | 87          87   87      87   87    87
Male   | 157         157  157     157  157   157

资源

  1. McKinney Wes,用于数据分析的 Python,O'Reilly Media,Inc .,2012 年
  2. 哈德利·威克姆(2011)。数据分析的分离-应用-组合策略。统计软件杂志,40(1),1–29。网址 http://www.jstatsoft.org/v40/i01/。
  3. https://pandas.pydata.org/pandas-docs/stable/groupby.html
  4. https://www . PostgreSQL . org/docs/9.5/static/tutorial-agg . html
  5. https://github . com/wesm/pydata-book/blob/master/ch08/tips . CSV

最佳敏捷:在金融机构中构建人工智能产品🏦

原文:https://towardsdatascience.com/agile-at-its-best-building-ai-products-in-financial-institutions-6a808dce8f67?source=collection_archive---------12-----------------------

敏捷文化的核心在初创公司和小公司中非常流行,但由于传统的业务结构或企业文化,在大型组织中就不那么流行了。这是金融机构邀请咨询公司提供数字产品的几个原因之一。然而,随着人工智能(AI)的兴起,这种在金融领域流行的商业模式需要重新审视。趋势科技引入了不同性质的软件产品。

"先进的分析解决方案可以模仿领域知识,做出决策,并消耗内部数据。在当前的金融形势下,这类产品很难外包出去。这一点随着 AI 产品在金融的部署越来越明显。因此,经历过这种情况的企业正在发展自己的人工智能能力,以便在内部提供这种产品。”

…因此,让我们开始通过构建敏捷的人工智能产品来打破孤岛!

#金融机构如何引领这场变革?🦈

T 他的转变可以通过重新思考业务管理数据战略招聘流程来完成,以允许这种颠覆性解决方案的内部开发&部署。然后,敏捷文化可以通过构建一个又一个产品而有机地成长。此外,几乎每个人工智能产品开发都需要一个采用不同技术的项目。这很可能是由于人工智能领域突破性研究的快速发展造成的。这将使研究和工业应用之间的差距比通常情况下显得更大。

“人工智能产品开发需要组织内部的即时转型变化。这可以通过创建独特的运营模式来实现。这些模型将建立开发团队,并给予他们技术选择的自由。然后,团队可以通过每个敏捷项目解决当前组织的痛点。

…对于任何大型组织来说,这都是一项极具挑战性的任务

#如何创建构建 AI 产品的运营模式?🍹

最好的方法是将敏捷软件开发的基础知识(T21)和商业管理(T25)定制成开发团队的精益运营模式。这种定制应该努力允许团队在构建 AI 产品时灵活地驱动转型性的变化。这是一个为特定项目量身定制的迭代过程。它有选择地将开发团队放在一起,并设置他们的边界。

“引入合适的人,建立一个适合他们工作风格和人工智能产品的数字化工作环境。分 3 步做这件事;1通过“精明的”团队招募[2]组建“产品驱动的”团队,[3]能够在“轻量级”项目模型下执行任务。这可以通过专注于满足您的定制需求的特性来充分发挥敏捷和管理的优势。”

…请记住,只有当每个人齐心协力时,敏捷团队才能有效地交付产品&他们的界限被定义为使团队能够做出正确的决策,而不是限制团队的创新

1精明的团队招聘😜

T 为产品驱动型团队雇佣顶尖人才&技能从简化当前的招聘流程开始。这需要放弃任何冗长、低效、过度勤奋的流程,进行更明智的招聘。这也应该重视招聘经理的时间,这样他们可以更好地评估任何缺失的专业知识。最后,它是关于如何快速地使面试具体化,以防止领域专家流失到竞争中。

1 🏠内部招聘 - >寻找领域知识 专家渴望改变的初级团队成员

…也可以浏览定量分析师和金融/研究分析师的人才库。有时可能会有其他人才,但不要试图寻找传统的管理工作(敏捷文化的对立面)。

2🏙外部招聘 - >寻找在人工智能计算科学敏捷软件开发方面有原型开发&生产颠覆性解决方案经验的专家

🤓只进行 1 到 2 轮面试 - >只进行一次文化契合度面试&如有必要,再进行一次技术知识面试

🏋如果你真的需要测试候选人的知识,给他们布置一个任务,但是这个任务必须代表他们被雇佣的实际工作(这样他们就可以评估他们是否喜欢这个工作)

🤠在见候选人之前做好你的尽职调查,了解他们的技能(他们的工作信息通常可以在网上找到,因为他们是他们领域的专家)

🛋 面试时要放松 - >让应聘者谈论他们的工作&和他们讨论你目前面临的挑战,看看他们是否感兴趣,以及他们会如何处理这个问题

👐非常具体地说明你要招聘的工作 - >公开地与求职者交流他们未来的工作,明确你招聘的人是否具备目前所缺乏的技能,因为没有哪个领域的专家愿意在一个其他人无法胜任的地方工作(他们会发现面试官是否在假装理解工作)

🦊评估面试时要精明 - >在面试后召集团队,根据候选人对当前&未来团队目标的回答,客观地评判他们的技能,这将防止雇佣比现有技能更差的人

🏎利用试用期 - >给新员工一个机会在试用期证明他们的工作,如果需要不同的人,可以重新开始(找到一个替代者应该不难,因为这个精明的招聘已经到位了)

…没有必要让应聘者为难,因为面试永远无法模拟实际的工作环境或员工的决定。此外,任何面试官都不可能独自客观地判断应聘者的技能(应聘者是公认的领域专家)。因此,在现场面试中不要问一般性的问题或进行测试!这将会阻碍你的才华,暴露出你在展示你招聘的理想工作时的无能。

[2]产品驱动型团队🚀

一个开发团队可以遵循特定的组件(如下所列)来专注于交付人工智能产品。这样的产品通常是在短时间内和具有挑战性的环境中开发出来的,因此团队成员应该以敏捷的方式一起工作。这将消除任何无意义的工作,因为敏捷中的工作赋予每项任务以意义。尽管如此,重要的是所有成员都意识到敏捷文化可以积极地促进他们的职业道路,甚至是他们的工作快乐。例如,它可以让他们找到自己喜欢的工作,学习新技能,或者获得交付人工智能产品的出色经验。如果这样的团队已经成立,那么就要通过帮助他们找到最佳状态并给他们探索的自由来提高他们的表现。

1 🎳团队结构 - > 4 到 10 名通才,他们具备领域知识 e、计算科学、人工智能敏捷 软件开发

…技能和团队成员数量的适当平衡取决于项目。但成员需要提供跨职能的专业知识,以保持团队的精干和协作。团队还需要拥有优秀领域知识的成员来实现特定领域的解决方案。否则,人工智能产品将永远无法在部署的地方发挥其商业价值。

2🧠团队心态 - >每个团队成员都必须具备一定的个人素质来交付敏捷产品

🏅不要成为一个追逐头衔的人 - >成为一个实际的贡献者&帮助其他成员发现和发展他们的潜力

🎭不要做戏剧女王 - >做一个透明的&问责成员

📓不要推动个人议程 - >要有团队愿景&产品目标

🔬不要微观管理 - >相信你的团队,把手拿开&看着

🌟不要满足于目前的技能组合 - >跟上研究和行业发展的步伐&跨领域发展其他技能,获得 T 型技能或更好的技能

…在组建团队时,很难找到满足上述个人素质的人,但这在团队互动中会出现。团队成员是那些在团队会议上透明地讨论他们的问题,而不是和他们喜欢的成员讨论的人(这会制造不必要的戏剧性事件)。此外,由于轻量级项目模型的工作透明性,不想做贡献的成员很容易被发现。

3📅团队会议 - >关于计划工作已完成工作障碍其他问题的简短每日会议,最多 15 分钟

…高绩效团队召开涵盖上述 4 点的会议,并尽可能邀请业务利益相关方参加。它有助于工作的执行并带来友谊,从而使每个人都可以畅所欲言(这在只有传统的 1 对 1 时是不可能发生的)。

44🎬团队凝聚力 - >评估团队的检查点&如果一些成员不能适应敏捷文化,调整团队

…识别团队虐待者并采取行动。敏捷项目简短有趣,但同时也让人精疲力尽。成功的团队拥有无私的球员,他们能做出贡献并愿意学习。所以,在这个项目中,没有任何一个只想随大流的人(猪和鸡)的位置。

[3]轻量级项目模型⛵️

项目模型指导产品驱动团队如何在软件开发中执行他们的工作。它有一些核心部分(如下所列),应该总是在一定程度上得到解决。这取决于项目、团队产品环境产品开发&推出。此外,将模型做得尽可能轻便以对企业有不言自明的好处也是至关重要的。一旦就位,就需要每个团队成员带头讲述他们的工作成果。

1 🖥 技术 - >统一当前使用软件的视图&用开发特定产品所需的技术栈丰富它

2📖工作描述 - >使用叙述来描述整个项目中的任何类型的工作,例如,为每个工作任务编写一个简单的用户故事

3👀工作可访问性 - >让每个团队成员都可以使用工作,例如使用软件仓库来存储工作( GitHubBitbucket ,…)

4 🌱项目生命周期 - >跟踪&通过敏捷委员会展示产品开发的工作进度,并提供一个知识共享的场所,企业可以从任何设备访问,例如使用您选择的敏捷项目管理工具( Asana、GitLab、JIRAConfluence、……)

5t34】🧬项目框架 - >选择&将适合项目需求的敏捷方法的特性结合到自己的项目框架中

…以前没有敏捷经验的团队可能会使用经典的 Scrum 作为大型项目的项目框架,并使用极限编程(XP)作为小型项目,例如解决方案原型/概念验证

#结论👩‍🏫

“在金融领域率先采用机器学习的时代已经过去了。街上的公牛正在敏捷文化上奔跑,并建立这样的人工智能能力。因此,引入的运营模式是金融机构建立自身人工智能能力的绝佳机会。他们甚至可以用它来参与进一步的研发活动。这最终应该会让人工智能研究更接近金融应用。”

我们已经为在金融机构建立产品驱动的人工智能团队的运营模式建立了标准。希望它能帮助读者在他们的工作场所为这种看似难以捉摸的技术的内部开发铺平道路。这可能会立即导致中断,但引入工作透明度、协作和绩效将带来长期的好处。总体而言,它调整了敏捷软件开发的商业模式,以在金融领域提供更多人工智能应用。

🍰这有助于金融机构更轻松地部署外部人工智能解决方案,金融机构将随时准备在这方面发挥带头作用

✌️ 它让金融机构减少了对外部人工智能解决方案的依赖,这迫使外部公司/咨询公司改进他们的产品

#进一步推荐阅读📚

  • 敏捷软件开发的基础知识
  • 流行敏捷框架对比
  • 挑战通才数据科学团队
  • 承担猪&鸡的商业寓言
  • 承担现代管理

敏捷数据科学——反思

原文:https://towardsdatascience.com/agile-data-science-rethink-d57c4d70f382?source=collection_archive---------30-----------------------

重新审视数据科学团队内部的敏捷实践

Agile to Success within Data Science

如今,敏捷在软件开发中变得非常有名。数据科学是另一个趋势学科,越来越多的公司试图建立并从中受益。

Scrum as 方法论试图以小增量的方式帮助构建一个好的软件。将敏捷软件方法应用于数据科学的尝试很多,但结果大多不尽如人意。

基于我的经验、阅读和最近参加麦吉尔大学的 SCRUM 培训,我试图讨论:

  • 为什么敏捷的 scrum 框架不适合数据科学项目
  • 遵循数据科学原则的敏捷概念
  • 来自框架的改编
  • 数据产品环境中的最小可行产品

为什么敏捷过程(特别是 Scrum)不适用于数据科学?

敏捷软件的目标是交付生产软件,而数据科学则是提供可操作的见解

为了提供可操作的见解,作为数据科学家,我们需要根据假设进行迭代实验,这是由上次实验产生的不确定性结果,而工程使用已知的科学和工程技术来构建线性时间表。

因此,在数据科学项目中,我们通常在发现上比在工程上花费更多的时间,并且由于科学/数据的性质,花费的时间总是不确定的。

敏捷概念仍然适用于数据科学项目

敏捷软件开发的好处:迭代/增量,可交付的产品,持续的重新评估(客户/开发)。

《敏捷数据科学 2.0》的作者 Russell Jurney 简短地说:

敏捷数据科学流程的目标是记录、促进和指导探索性数据分析,以发现并遵循通往引人注目的分析产品的关键路径。

在此,我尝试对数据科学学科的敏捷宣言做一个分析:

  • 个人和互动流程和工具:分享是强制性的,因为团队是由不同的学科(DS、DE、Business)组成的,我们需要在团队内部以及与客户之间进行有效的沟通。
  • 工作软件综合文档:全栈数据科学家应该能够同时创建并交付概念验证应用以发布见解并收集反馈。
  • 客户协作合同谈判:作为数据科学团队,我们需要定期和频繁地沟通,在整个项目过程中与客户讨论发现,而不是交付一次就有好的结果。因此问题是How can we make the intermediate discovery understandable by customers?
  • 根据计划应对变化:这已经在数据科学中发生,随着我们进一步揭示数据本身,进一步分析的计划将在试错的基础上相应地改变。

在分析了敏捷宣言之后,事实上数据科学可以让敏捷的概念受益:

为了在不确定和动荡的环境中取得成功,创造和应对变化的能力。

打破规则并适应

数据科学项目有可能继承敏捷软件开发。我们需要勇敢地打破规则来解决第一部分的问题。

总的来说,我们应该牢记敏捷的概念(迭代、增量和持续),由于研究的不确定性,我们无法将这些直接转化为时间约束冲刺和基于点的任务。

但是,由于不确定性,数据准备是唯一的例外。因此,我们应该将数据准备部分从 SCRUM sprint 中分离出来,特别是我们知道我们非常依赖其他资源或者数据非常脏,并且预处理可能涉及团队外部的交互。

然后,Scrum 方法论应该作为管理数据科学项目的项目管理框架。实际上:

  • Sprint:一个灵活的 2-4 周的时间盒,当我们应该重新排序时,根据最新的发现重新安排未来的优先次序。
  • 冲刺规划:我们评估已知的数据发现,并在需要时对冲刺级规划进行适当的更改(例如切换方法、调整完成的预计时间、更改范围等)。
  • 每日 Scrum(站立):我们应该分享团队基于数据的最新发现的知识,并利用这些时间对短期任务进行快速调整(如切换数据源、请求领域知识专家、更改算法等)。
  • 冲刺评审:我们应该在与团队一起进行项目期间放弃评审,除非我们达到了某个里程碑。我们使用评估来展示业务/产品并与之同步,但仅限于领导层。
  • 冲刺回顾:我们应该在项目期间放弃回顾,除了当我们完成项目的时候。

最小可行产品(MVP)

敏捷还有一个 MVP 的概念。那么什么是数据科学项目环境中的 MVP 呢?

看情况。在团队内部,MVP 可以作为第一次尝试的基线模型,或者在jupyter notebookrmarkdown notebook中展示的见解。但是对于业务或工程,它应该是一个的中等性能模型,能够工作并提供可接受的结果(例如,推荐系统应该提供不会损害最终用户体验的推荐),或者显示在仪表板中的洞察力需要与业务保持一致。

原载于 2018 年 12 月 31 日https://Ricky king . github . io

敏捷评估:错过的机会和错过的期限

原文:https://towardsdatascience.com/agile-estimation-missed-opportunity-and-missed-deadlines-37f0097175db?source=collection_archive---------23-----------------------

为什么这些公司关心他们的开发项目何时完成?显然,为了更快地从项目中获益。这可能是销售或利润的增加,也可能是成本的降低。我们称之为错过的机会,它有美元的成本。

计算错过的机会比计算投资回报率更容易、更直接,更重要的是,误导性更小。想想看,软件项目的实际投资回报率比预计的要低多少倍?使用错过的机会计算也有助于您确定项目的优先级。

在这本笔记本中,我们将根据团队在一次迭代中可以完成的故事点数量,尝试估计单个项目错失机会的概率分布。正如在前面的故事中所讨论的,我们将使用对数正态分布来估计项目速度。

import numpy as np
from scipy.stats import lognorm
data=np.array([14, 12,  7, 14, 13])
shape, loc, scale = lognorm.fit(data, floc=0)

在这里,我们获取了关于团队过去迭代的信息(分别是 14、12、7、14、13 个故事点),并使其符合对数正态分布。我们感兴趣的问题是:给定数量的故事点(在这个例子中是 70 个)需要多少次迭代。同样,我们使用对数正态分布的奇妙性质,即逆也是对数正态的,具有相同的参数和逆参数

***num_points = 70
dist_iterations = lognorm(shape, loc, num_points/scale)
print(f'Mean: {dist_iterations.mean()}')
print(f'Median {dist_iterations.median()}')
print(f'Standard deviation {dist_iterations.std()}')Mean: 6.219638285087961
Median 6.011776848254893
Standard deviation 1.6496339740439272#We plot the distribution
%matplotlib inline
import matplotlib.pyplot as plt
def plot_dist(frozen, low=0, high=14):
    fig, ax = plt.subplots(1, 1)
    x = np.linspace(low, high, 100)
    ax.plot(x, frozen.pdf(x), 'r-', lw=5, alpha=0.6, label='lognorm pdf')
plot_dist(dist_iterations);***

所以我们看到我们有很好的机会在 7 次迭代内完成它,但是也有可能需要 12 次迭代!让我们说,由于错过了机会,业务在每次迭代中损失了 10,000 美元。那么错过的机会分布如下:

***missed_opportunity_per_iteration = 10000
missed_opportunity = lognorm(shape, loc, num_points/scale*missed_opportunity_per_iteration)
print(f'Mean: {missed_opportunity.mean()}')
print(f'Median {missed_opportunity.median()}')
print(f'Standard deviation {missed_opportunity.std()}')
plot_dist(missed_opportunity, 0, 140000);Mean: 62196.382850879614
Median 60117.768482548934
Standard deviation 16496.33974043927***

正如我们所看到的,我们有各种动机来更快地完成项目,以使曲线向左移动。也许我们增加更多的开发人员来提高速度?我们可能还想缩小范围,以减少故事点的数量。

最后,不管一些敏捷理论家怎么说,企业设置最后期限是有原因的。当一个软件项目完成后,企业必须做 UAT,接触一些客户,请他们提供反馈,等等。企业也希望提前对此进行规划,因为关闭活动有固定成本,如果项目不能按时交付,这将增加项目成本。我们称之为延迟成本。

如果错过的机会成本为零,那么为了避免延迟成本,我们计划尽可能晚的结束活动。但是如果非零,那么两个成本之间就会有权衡。因此,如果 C 是结束成本, Co 是错过的机会成本, N 是实际迭代次数,是计划迭代次数,那么总成本将是:**

我们需要在 M 上最小化这个成本 我们可以对 M 求导。注意,那个P(N>M)就是所谓的生存函数,或者说1CDF,其中 CDF 是累积密度函数。生存函数的导数是负概率密度函数。因此, M 的最佳值由下式定义:

在这个例子中,我们猜测延迟成本是 95,000 美元

**#We solve the equation numerically:
from scipy.optimize import *
delay_cost = 95000
def to_optimize(m):
    return missed_opportunity_per_iteration - delay_cost*dist_iterations.pdf(m)
roots = newton_krylov(to_optimize, 8.0)
float(roots)7.994986056462073**

这向我们表明,即使团队很可能在六个迭代中完成项目,但是由于延迟的高成本,最好在八个迭代之后安排关闭活动。

在实践中,迭代中充满了所谓的“松弛”,即低优先级的故事,当所有高优先级的故事都完成时,团队就会这样做。如果团队确实在六个迭代中完成了,那么它就可以处理松弛的故事或者解决技术债务。

你可以在这里找到这篇文章的笔记本。

敏捷评估:第二部分

原文:https://towardsdatascience.com/agile-estimation-part-ii-80bba09b9fc1?source=collection_archive---------13-----------------------

在我的前一个笔记本中,我建议使用泊松分布来估计每次迭代的故事点数,即项目速度。这是一个相当简单的分布,它有一个突出的性质:泊松分布的随机变量之和的分布也遵循泊松分布,其中一个参数是各个参数之和。这意味着项目速度是单个开发人员速度的总和,就像你直觉上假设的那样!

但是,泊松分布存在问题。如果你看它的 PDF,

PMF of Poisson Distribution

你看,它只有一个参数 λ 。而且方差也是 λ ,等于均值。这就产生了一个问题,我如何区分好的估计量和差的估计量。例如,如果我使用随机数量的故事点来估计每个用户故事,最终我将得到与一个人相同的方差,这个人的估计是准确的。

另一个问题是泊松分布假设故事点的持续时间服从指数分布,其众数为 0。所以这意味着一个用户故事很可能需要 0 小时来完成?我相信项目经理听到这个会很高兴的。

但是,如果您从估计每个故事点的持续时间开始,您将不得不选择一个众数大于零的分布。我曾经使用正态分布来估计一个故事点的持续时间,但是我注意到,对于一些开发人员来说,方差是如此之高,以至于左边的尾巴将会进入负的区域(任务将会花费负的时间来完成!).所以我必须选择一个支持 x∈[0,∞]的分布。

我可以选择一个非常流行的伽马分布,但是更好的选择是对数正态分布。

PDF of log-normal distribution

这种分布的最佳特性是逆分布也是对数正态分布,具有相同的参数 σ 和反向参数μ。这意味着,如果故事持续时间是对数正态分布,那么项目速度也是对数正态分布!

我们将使用与上一个笔记本中相同的示例

**import** **numpy** **as** **np**
**from** **scipy.stats** **import** lognorm
data=np.array([14, 12,  7, 14, 13])
shape, loc, scale = lognorm.fit(data, floc=0)
fitted = lognorm(shape, loc, scale)
print(f'Mean: {fitted.mean()}')
print(f'Standard deviation {fitted.std()}')
print(f'95**% c**onfidence: {fitted.ppf(0.05)}')Mean: 12.046405137951629
Standard deviation 3.195066701596986
95% confidence: 7.582961342994959*#Let's plot it*
%**matplotlib** inline
**import** **matplotlib.pyplot** **as** **plt**
**def** plot_dist(frozen):
    fig, ax = plt.subplots(1, 1)
    x = np.linspace(5, 22, 100)
    ax.plot(x, frozen.pdf(x), 'r-', lw=5, alpha=0.6, label='lognorm pdf')
plot_dist(fitted);

所以答案接近泊松分布给出的答案。让我们试着找另一个团队,他们可能有更低的速度,但是更可靠的估计:

data=np.array([10, 11,  12, 10, 11])
shape, loc, scale = lognorm.fit(data, floc=0)
fitted = lognorm(shape, loc, scale)
print(f'Mean: {fitted.mean()}')
print(f'Standard deviation {fitted.std()}')
print(f'95**% c**onfidence: {fitted.ppf(0.05)}')Mean: 10.799871930716652
Standard deviation 0.7427443647589952
95% confidence: 9.62328932436764plot_dist(fitted);

我们看到,即使这个团队的速度低于第一个团队,如果经理要求你有 95%的信心,你可以选择第二个团队,因为它可以在迭代中可靠地完成更多的故事点。

这里可以找到笔记本。

农业技术 2.0——机器的崛起

原文:https://towardsdatascience.com/agtech-2-0-rise-of-the-machines-118aad57e778?source=collection_archive---------7-----------------------

Case IH Magnum Autonomous Concept Tractor

最近媒体上有很多关于自动驾驶汽车和人工智能(AI)等新技术的谈论。这让人想起阿诺德·施瓦辛格在《终结者》中的形象,“天网”扮演反派,因为它变得有自我意识,并命令机器反抗人类。

幸运的是,这些新兴技术的现实实际上比好莱坞暗示的要光明得多。农业是一个人工智能和自主设备可以增加巨大的经济和环境价值的行业,以帮助养活世界上不断增长的人口。

农业行业涌现出越来越多的颠覆性公司,它们正在开发传感器、机器自动化和数据科学等新技术。例子包括土壤湿度传感器,如提高灌溉效率的 CropX。使用无人驾驶飞行器(UAV)监测作物健康和生长阶段的能力,如 AgEagle 。最近,我们已经看到自动驾驶拖拉机的出现,如 CNH Industrial 所展示的。

将所有这些颠覆性传感器和硬件技术结合在一起的粘合剂是数据科学。预测软件平台的一个全新的产品部分,如 AgDNA 现在已经上市,并且正在快速发展。总的来说,这种新一代农业技术被称为农业技术 2.0,它们将共同改变粮食种植的方式。

问题

耕作是艰难的。技术可以提供帮助。

大规模的商业农业就像经营一个大工厂——只是在户外!是的,这个作物生产“工厂”暴露在自然环境中,没有墙壁或屋顶,它有间歇性的电力供应(阳光、降雨),劳动力短缺(农村地区),收入波动(商品价格),并且假设作物一直存活到成熟,每年只支付一次工资。

正是天气、土壤类型、产量和收入的这种程度的可变性,使得农业具有难以置信的风险。事实上,没有两个季节是相同的,这意味着从一个季节到下一个季节的决策充满了不确定性。

今天的技术及其产生的基础数据将改变未来农场决策的方式。从一个季节到下一个季节,高分辨率数据和有关种植系统所有方面的信息的可用性意味着农民将有能力根据对历史结果的深入分析做出计算决策。

数据科学

在寒冷的气候下,世界上许多农民一年只能种植一种作物。因此,在他的职业生涯中,农民可能只有 40 次“做对”的机会。这给错误留下了很小的空间。

农业技术 2.0 将为种植者创造公平的竞争环境。田间传感器现在全天候向大数据算法传输数据,大数据算法不断处理信息,并提供实时见解,帮助种植者做出明智的决策。

展望未来,没有数据,这只是一种看法。

有几个关键因素将 AgTech 2.0 软件平台与传统的精准农业桌面工具区分开来。新一代软件平台包含以下属性,以便在 AgTech 2.0 级别上竞争:

-基于云的集中式数据

-与支持互联网的传感器实时连接

-与所有主要品牌设备的互操作性

-自动化大数据处理能力

-具有预测洞察力的算法

解决方案

AgTech 2.0 正在将农业从依赖人类生成的数据转移到自动化机器生成的连续数据流。也就是说,农业从来不缺数据。自 20 世纪 90 年代中期以来,联合收割机一直在记录产量。然而,直到现在,土壤、气候、植物健康、灌溉和管理实践等其他关键输入才以数字形式随时可用并实时传输。

AgTech 2.0 下一代平台使用实时真实数据为预测模型提供信息,这些预测模型可以根据从历史结果中得出的模式和结果生成预测和见解。种植者或农学家仍将决定需要做什么。但有了这种新型工具,它就成为一个高度明智的决策,降低生产风险和增加经济回报的可能性更大。

真实世界的例子

AgDNA 等公司的目标是在种植者知道该问什么问题之前提供答案。

目标是在小问题变成大问题之前解决它们。如前所述,农业中的误差幅度很小。这个季节早期的问题会限制植物的生长潜力,严重影响收获后的产量。

在 AgTech 2.0 硬件平台不断传输高分辨率数据的同时,其软件平台也在分析这种实时传输,以找到提高产量或降低运营成本的见解。

举个例子,一辆拖拉机穿过田野去种玉米。今天,这种拖拉机基本上是自动驾驶的,使用 GPS 定位在田间精确导航。

用于驾驶拖拉机的测量级 GPS 数据也可用于构建田地的 3d 高程模型。一旦知道了油田的地形,智能软件平台就可以识别出洼地。这些是田地中的低洼地区,在暴雨期间没有排水能力。

知道了这些低气压区的存在,软件就能计算出如果田地降雨量高于平均水平,某些疾病可能会发生的可能性。通过分析数十万英亩类似排水问题的历史结果,大数据软件可以确定整个田地或特定洼地中各种农艺问题的概率。

有了这些信息,系统可以向农民或农学家推荐一个处方进行评估。然后可以根据经济回报决定是否施用最佳量的杀真菌剂来防止疾病仅在低洼地区爆发还是在整个田地中爆发。

此外,当作物收获时,可以将所得的产量数据与 3d 高程图进行比较。如果排水不良和低产之间的关联概率很高,那么可以根据成本效益分析做出是否纠正问题的经济决策。这种级别的信息为种植者提供了商业案例和财务建议,因此他们可以确定是否愿意在未来的生长季节纠正排水问题,以增加利润。

这只是许多使用案例中的一个例子,在这些案例中,可以自动捕获和分析数据,以确定是否存在提高盈利能力和管理整个农业运营风险的经济机会。

农业科技 2.0 的未来

农业科技 2.0 运动将快速加速。大量资本投资正从私人投资者、风险资本家和主要原始设备制造商和投入物制造商流入该部门。短期的挑战不是技术,而是不同制造商之间缺乏数据标准和兼容性。

一些关键的颠覆性技术包括:

无人机

无人机目前面临的挑战包括发射所需的时间、有限的飞行时间和数据的自动化处理。随着时间的推移,这些问题将被克服,无人机将像一个超级本地卫星系统一样为每个农场提供高分辨率数据。

传感器

新的拖拉机、喷雾机和收割机已经包含数百个传感器,向云提供农艺和操作见解。未来,传感器将走出驾驶室,进入田间,提供针对每株植物的实时土壤和作物健康信息。

机器自动化

无人驾驶机械将成为常态。这并不是说每一项操作都将是自主的,而是像喷洒这样的低效率活动将是自动化的。此外,它们将由较小的电动车辆进行,这些车辆仅在杂草出现(或预测到)时喷洒,以确保最低的成本和最低的环境影响。

数据科学

与大多数行业一样,上述所有硬件解决方案都将商品化,价格是一个关键的购买因素。真正的价值在于从资本设备和最终数据中最大化经济价值的底层算法。

这是一个激动人心的农业时代。任何有前途的程序员、工程师或科学家都会被建议探索精准农业作为职业道路。对于我们这些已经在农业技术领域的人来说,我们有责任确保我们提供切实可行的解决方案,为种植者解决现实世界的问题。AgTech 2.0 是要遵循的路线图。

希望我们不会很快看到阿尼的天网战士占领农场。我们将看到新一代 AgTech 2.0 硬件和软件解决方案在农场中的应用,帮助种植者做出重要决策,并提高其运营的盈利能力和可持续性。

AI 101:揭开预测数据分析的神秘面纱

原文:https://towardsdatascience.com/ai-101-demystifying-predictive-data-analytics-c4ecc50f6662?source=collection_archive---------12-----------------------

除非你在过去几年一直生活在岩石下,否则你很有可能会经常遇到预测分析。这是每个人都在谈论的水晶球。虽然谈话中充斥着老生常谈,但当有人稍微深入一点,迫使一个人后退时,这可能会有点令人生畏。即使不是每个人都可以成为数据科学家,了解数据分析领域的关键概念是如何工作的也很重要,只要能够确保我们能够利用它们来满足我们的个人或业务目标。相信我的话,没那么复杂!

什么是预测分析?

简单来说就是利用历史数据来预测一个未来状态的过程。这种未来状态可能指的是趋势之类的东西(“某只股票可能会走向哪里?”)和行为属性(“特定客户可能会购买什么?”).换句话说,预测分析是用来预测在给定环境下可能发生的事情。

“预测”是如何工作的?

预测分析的基础是可以对大多数事物进行“建模”的想法。这种想法的基础是假设数据参数之间存在因果关系,即当一些数据参数改变时(原因),其他数据参数也会相应改变(效果)。

让我们回到一些基础数学来进一步理解这一点。你会回想起自变量和因变量函数的使用。在上面的陈述中,“原因”是自变量,“结果”是因变量。最简单的形式是:

我们举个简单的例子,说我们的函数是: y = 2 + 3 x

所以对于每一个 x 的值,我们都会有一个由函数定义的对应的值 y

有了上面的信息,当 x 的值改变时,很容易“预测”yy**的未来值——我们的简单函数类似于预测模型!

让我们介绍一些复杂性

底线是,所有的预测模型本质上都是一个类似于上图的函数。然而,并不是所有的功能都如此简单。复杂之处在于函数本身。实际上,我们的预测模型的功能更可能是这样的:

上面的函数说明了什么?我们的因变量(即 y )基于多个自变量(即 a、b、c、d、e、… )。

让我们举一些使用案例来让这更真实一点:

上述所有例子中的共同线索——实际上是所有预测建模问题陈述中的共同线索——是通过因变量和多个自变量之间的函数建立因果关系。

预测的类型

虽然预测函数中的变量可以有多种形式,但了解这三大类别对于理解预测分析的可能性是很有用的。让我们以贷款违约为例来理解可以做出的不同类型的预测:

  • 预测非量化结果:客户会违约吗(是/否)?
  • 预测发生的可能性:客户违约的概率有多大?
  • 预测有形价值:客户违约的实际金额是多少?

再次,冒着重复我自己的风险,以上三个问题都可以通过不同类型的函数来回答,因变量随着预测的类型而变化。

简单介绍一下预测建模方法

正如我上面所说的,任何预测模型的核心是识别与自变量和因变量相关的函数。这样做的过程、方法、途径就是专家介入的地方。这些功能通常非常复杂,需要统计和数据科学方面的复杂知识。

无需深入建模技术的所有细节,了解另一个方面是很有用的——预测分析技术分为两大类:

  • 回归技术:回归模型的重点是尝试使用不同的方法建立因变量和自变量之间的函数,然后使用该函数预测值。
  • 机器学习技术 : ML 技术用在钉住底层数学方程或函数非常复杂的地方。相反,机器被用来查看大型数据集(训练数据),并使用它们来预测值。基本的螺母和螺栓保持不变(即,机器确实为自己创建了某种函数,即使是模糊的),只是它不太适合函数方程。

预测分析如今无处不在,企业正利用它来销售更多产品、制造更好的产品、降低风险、了解客户行为等。我们更有效、更准确地做这件事的能力在不断提高,尽管基本前提没有改变。

人工智能 101,第一部分:关于预测模型你需要知道什么

原文:https://towardsdatascience.com/ai-101-part-i-what-you-need-to-know-about-predictive-models-67258587f7a6?source=collection_archive---------2-----------------------

虽然预测分析和人工智能是当今销售和营销专业的大话题,但当你试图找出如何开始使用这些依赖数据的解决方案时,可能会感到令人生畏。尽管大多数营销人员可能实际上不会自己构建任何数据模型,但下一波走向市场的专业人员对如何使用数据解决业务问题形成坚实的理解是至关重要的。在这一系列文章中,我将一篇一篇地分解围绕这些技术的关键概念,并在预测建模的引擎盖下提供一个有帮助的外观。

准备尝试人工智能的商界人士应该首先缩小范围,学习预测建模的基础知识——这是用机器有效取代人类功能所需的基础技术之一。人工智能解决方案使用这种先进的数据科学来处理、理解、翻译和解释所有的数据,并将其意义解析为可视化和可操作的输出。

让我们来探讨构建预测模型的四个主要阶段:

1)数据采集

在构建预测模型时,第一步是收集所有的输入或数据源。毫无疑问,销售和营销团队正在获取大量数据。然而,在许多情况下,营销人员收集的数据只有他们关心,对销售来说可能没有价值、没有洞察力或可操作性(反之亦然)。不管怎样,鉴于被动营销渠道、低障碍免费试用等的大量采用。,大多数企业正在大规模收集有关其前景的大量数据——其中大部分可用于为更智能的预测模型提供信息。

2)数据准备

在挖掘所有这些数据之前,重要的是先退后一步,弄清楚你试图用人工智能解决什么样的业务问题,这将有助于你优先考虑你的数据准备任务。现实情况是,数据不完整和不干净是非常常见的(无法避免数据输入带来的人为错误),因此数据准备对人工智能的未来至关重要。如果您愿意,您的数据应该被适当地清理,以便您可以在数据采集阶段正常化典型误差,并最终产生一个合理的模型。只有这样,预测分析才能回答您的具体问题,并推动您想要的行动。准备数据的一些常见方法包括丰富(引入外部信号以补充当前记录)、垃圾邮件分析和标题规范化——请在我的下一篇文章中继续关注这些技术。

3)建模

一旦你理解了你想要解决的机器学习问题,建立模型的下一步就是采用数据科学方法,如分类或回归。分类又称概率估计,用于预测每个个体属于一个小的类集合中的哪一个。例如,你可能会问“在 X 公司的客户中,谁最有可能回应这个提议?”那么将有两类:“不回应”或“回应”。"

另一方面,回归(或价值估计)用于预测每个个体的某个变量的数值。查看历史数据,您可能会生成一个模型来估计特定于每个人的特定变量,例如“该客户将使用多少服务?”这两种技术以及许多其他技术都可以提供模型输出,推动销售和营销中强大的人工智能和预测分析用例。

4)输出

例如,销售团队可以通过使用预测模型来改进他们筛选和优先考虑呼入销售线索和基于客户的拓展策略的方式,从而实现重大的绩效管理改进。有了指示哪些销售线索看起来最像公司的理想客户的分数输出,销售人员可以自信地将时间集中在可能购买的潜在客户身上。此外,团队可以使用人工智能更周到地路由他们的线索——根据每个线索的潜在价值,要么通过 SDR 进行拓展和发展,要么通过客户经理进行更积极的跟进,要么通过自动化培养计划。当一个老领导开始表现得像顾客时,预测行为模型也可以提醒销售人员。通过观察营销自动化和网络分析系统中的参与模式,您可以确定被忽视的线索何时可能接近转化阈值。这有助于销售代表找到“重新觉醒”的合格客户和联系人,然后触发数据驱动的工作流,在正确的时间用正确的信息进行更积极的跟进。

人工智能的另一个有价值的用例是提高营销效率。有了正确的客户情报,营销团队可以优化转化,尽可能提高漏斗效率。此外,由于预测分析输出可提供关于营销活动质量的即时反馈,因此他们可以轻松地实时计算关键绩效指标,而不是等待销售周期结束。在量化关键营销绩效指标时,如每条有效线索的成本、平均线索质量、渠道支出比率等,准确的预测也会增加价值。通过使用这些 KPI 来审视传统的虚荣心指标,并确定表现最佳的活动和内容,营销人员可以更深入地了解哪些计划可以吸引最高质量的潜在客户,推动更大的交易,并加快交易速度。

如果你希望你的模型产生统计上准确的预测,那么模型构建过程的这四个步骤中的每一个都很重要,而且随着人工智能从人类手中接管越来越多的日常任务,这些阶段变得越来越重要。没有人希望错过真正的收入,只是因为 AI 在确定外向潜在客户名单或撰写销售外联电子邮件的内容时犯了不必要的错误。

AI 101:了解客户流失管理

原文:https://towardsdatascience.com/ai-101-understanding-customer-churn-management-514416c17643?source=collection_archive---------1-----------------------

请考虑贝恩公司进行的一项研究中的以下事实:

获得一个新客户的成本可能比留住一个客户的成本高 700%。

仅仅提高 5%的客户保持率就能增加 25%到 95%的利润。

这些是相当重要的数字。因此,客户维系是企业最重要的目标之一,这是显而易见的。保留下来的客户也更有可能参与进来,对追加销售和交叉销售更加开放。

从历史上看,客户流失通常只是一个利益衡量指标,企业对此无能为力。由于根据该指标的定义来衡量客户流失是被动的,而不是主动的,大多数企业能够做的就是试图确定是什么推动了客户流失数字,并调整这些因素。

然而,今天的情况大不相同。如今,公司有能力捕捉客户参与度多个属性的数据点。复杂的人工智能和数据分析技术的出现进一步帮助利用这些丰富的数据,以更加有效的方式解决客户流失问题。如今,大多数公司,尤其是 B2C 领域的公司,都设计了具体的计划来解决客户流失问题。因此,了解它的各个方面是很重要的。

什么是流失?

流失——或客户流失——简单地定义为特定时期内客户流失的数量或百分比,扣除该时期内新获得的客户。换句话说,该指标跟踪您在吸引客户方面的成功与否。

对“流失客户”的解释有几个需要考虑的细微差别:

  • “绝对”与“假定”客户流失:在某些情况下,客户主动终止与您的关系(例如,银行账户持有人关闭账户),而在其他情况下,他们可能只是停止与您合作,即使在纸面上他们的状态没有变化(例如,客户停止从她过去经常购买的零售商处购买)。
  • 客户流失定义的时间段因行业而异:对于一家电信公司,如果一个客户一个月没有使用你的网络,你可能会认为她“流失”了。另一方面,对于航空公司来说——因为雇佣频率通常较低——定义自然减员的时间段可能是 6 个月或 12 个月。
  • “反应性”与“预期性”客户流失:客户流失有两种截然不同的方式。客户有时会对特定的负面事件或经历做出反应,导致他们离开你的企业,这通常被称为“反应性”流失。例如,信用卡客户可能会因为意外的费用、不满意的客户服务体验、经历冗长的争议解决过程等事件而却步。另一方面,有时脱离是逐渐的,并且不一定由任何特定的触发器驱动。这是“预期的”或“无声的”客户流失。由于显而易见的原因,后者更难管理。

机器或人工智能驱动的方法如何帮助管理客户流失?

流失管理的核心在于能够识别潜在流失者的早期预警信号。如果我足够早地知道某个特定的客户可能会离开我的公司,我就可以采取积极的措施来阻止它的发生。这就是分析可以发挥变革作用的地方。让我们来看看其中的几个方面。

  • 确定已知负面触发因素及其影响之间的关系:研究负面客户体验的历史数据以及不同类型的客户对这些负面体验的反应,有助于开发一个稳健的模型来预测反应性流失。然后,这可以用于跟踪当前客户正在经历的类似触发事件,以确定他们可能会如何反应。那些由于一次或多次负面经历而被确定为可能流失的人可以走上康复之路。(注意:在包含内部触发器的同时也包含外部触发器,这一点很重要,尽管获取数据可能会更加困难。外部触发因素通常包括竞争对手的行为,如竞争对手的大幅降价、忠诚度计划的变化、收购动机等。)
  • 根据过去了解衰落行为:历史数据也可用于预测非触发驱动的损耗。根据对当前客户的 360 度评估,将当前客户与流失的历史客户进行对比,有助于预测高风险客户。换句话说,如果我表现出的参与行为类似于已经淡出的老客户,那么我很可能会走上类似的道路。这些行为可能是减少我购买的类别数量、减少我的购买频率、减少我的忠诚度积分兑换等。
  • 识别高风险群体:还可以使用决策树模型等工具将客户群划分为不同的行为特征,从而识别具有高流失风险的细分或群体。让我们考虑一个电信行业案例来说明这一点——细分树可能会显示,加入不到一年且 70%以上的支出用于数据服务的客户的流失率比平均水平高十倍。或者年龄小于 25 岁并且在过去 12 个月中有超过 7 个月延迟支付账单的客户的流失率比平均值高 7 倍。然后,这些群体可以被挑选出来作为高风险群体,属于这些群体的客户可以得到适当的对待。

小心误报

有效的流失管理的一个重要问题是流失预测模型中的高误报率。误报会对任何解决客户流失的计划产生严重的不利影响,因为它们会增加计划的成本。简而言之——你实际上是在花大价钱试图留住那些不会因为这些高风险的假阳性预测而真正面临离开你的风险的客户。在预期流失预测的情况下,这些假阳性通常会高于 50%。下图显示了使用逻辑模型进行流失预测的典型假阳性率曲线。

Image 1: False Positive Rate by Decile

一般来说,可以采取一些步骤来提高假阳性率。就数据类型而言,增加数据点的数量就是这样一个步骤(例如,用客户体验数据、营销活动数据等丰富交易数据。)和数据量(例如使用数据的月数)。解决假阳性的另一个潜在方法是利用模型异构性来提高性能。这可以通过选择对特定预测可能最有效的不同模型(例如,SVM、神经网络、RBM、协同过滤)并将它们组合在一起以优化整体性能来实现。

客户流失管理需要哪些数据?

正如任何处理客户行为的用例一样,可以利用的数据越多,效果就越好。对客户与您的业务接触的所有方面有一个 360 度的视图将使您有一个整体的方法。下图提供了一些可以纳入的关键数据集。

Image 2: Potential Data-sets to Build a 360-Degree View of Customers

投资回报率最重要的问题

仅仅识别高交易风险的客户是不够的。全面的客户流失管理需要在此基础上确定最佳行动方案,以解决单个客户层面的流失风险。幸运的是,人工智能和数据分析在这里也有巨大的价值。有三个关键步骤可以有效地处理可能的搅动者。

  • 确定客户吸引力:每个客户对企业都有不同的价值。因此,第一步是找出每个客户对你有多重要,这样你就可以把你的治疗费用集中在对你有最高终身价值的客户身上。顾客吸引力可以建模为消费、收入、票价、钱包大小、频率和其他衍生消费模式的函数。
  • 确定顾客对治疗清单的敏感度:下一步是确定对每个人最有效的治疗策略。治疗策略通常包括两个因素——他们对哪种运动或干预反应最好,以及他们对什么沟通渠道反应最好。

Image 3: Sample of Customer Sensitivity Matrix

  • 测试和学习反馈循环:最后,即使在你弄清楚谁是你最有价值的处于风险中的客户,以及什么样的策略可能最有效地重新吸引他们之后,拥有一个灵活的操作流程也是至关重要的,它可以让你快速地从你给他们的报价和他们的反应中学习。这个反馈循环将不断地调整模型,以进一步提高性能。

Image 4: Customer Treatment Framework

识别和补救处于风险中的客户具有巨大的商业利益。有可能实施一系列解决方案来实现这一目标。

有现成的客户流失预测工具可以让企业以自助方式运营。这方面的挑战通常是这些模型的有效性,因为它们在很大程度上依赖于一种一刀切的方法。另一方面,企业可以选择构建内部专用的数据科学功能,用于多种用例,客户流失就是其中之一。这通常需要大量的前期投资和持续投资,并不总是对所有组织都可行。它通常也有更长的上市时间。

介于这两个极端之间的解决方案,将世界一流的外部专业知识与内部业务知识结合起来,往往是解决客户流失问题的最有效方式。

人工智能在采购中的应用:三步之旅

原文:https://towardsdatascience.com/ai-adoption-in-procurement-3-step-journey-1a9426992586?source=collection_archive---------4-----------------------

3-Step Journey of AI Adoption within Procurement

每个人都想节省和减少他们的支出,包括各行各业各种规模的公司。然而,试图在一家公司的支出池中找到节省的资金通常就像大海捞针一样。当然,也有一些唾手可得的果实,但它们很快就会被消耗掉,这就给采购团队留下了寻找不断更新的节约途径的繁重任务。在之前的一篇文章中,我谈到了这是一个需要解决的复杂问题,以及人工智能在应对相关挑战中可以发挥的作用。

仔细看看人工智能可以改变游戏规则的具体方面,对于理解它在采购环境中的更广泛价值很重要。在采购领域使用人工智能和分析可以被认为是一个三步走的旅程。

第一步:建立强大的数据基础:一个组织的支出数据充满了问题——它通常分布在多个不协调的 ERP 和其他系统中;它有不同的格式、结构和术语;它经常有缺失的信息;即使是现有的信息也很少是可靠的,随着时间的推移,会出现许多人工输入错误。因此,大多数采购从业者都认为,创建一个强大的支出数据基础的任务极具挑战性。

这就是人工智能元素可以出手相救的地方。重要的是要记住,仅仅将各种数据源缝合在一起的解决方案是远远不够的——将它们整合在一起是问题的最小部分。人工智能驱动的支出分析将超越 it 许多步骤,以确保数据不仅跨来源全面捆绑在一起,而且得到清理和丰富。关键浓缩步骤包括以下内容:

  • 持续的数据审计,以检查并标记不完整和不一致的数据
  • 基于文本和自然语言处理(NLP)的项目、供应商等领域聚类。确保可用于分析的信息得到简化
  • 准确的支出分类,确保数百万行交易中的每一行都正确而细致地标记到它们所涉及的项目上

数据基础可能是实现有效采购计划的最关键的方面。正如他们所说——你不知道的,你无法控制。没有准确的数据基础,采购根本不知道谁在什么地方花了多少钱,为什么要花!

第二步: 寻找美元美元:一旦强大的数据基础到位,世界就唾手可得了!拥有正确的数据是成功的一半。下一步是找出这些数据中隐藏的节约和机会。考虑到典型采购数据的规模和复杂性,手工处理效率很低。人工智能和领域专业知识的结合可以大大提高任务的成效。

植根于采购知识的算法可以不断解析公司的支出数据,并识别机会领域。这些领域将跨越不同的杠杆,所有这些都需要不同类型的分析和相应的算法。一些例子:

  • 价格差异:在购买的成千上万的 SKU 中,确定不同供应商收取的不同单价的存在和程度。确保这是一个苹果对苹果的比较是关键。一旦确定了节约,捕获就变得快速而简单。
  • 营运资本优化:这可能是最容易实现的节约,但如果没有先进的分析工具,几乎不可能实现。哪里过早付款?同一个供应商在哪里有多个付款条件?你在哪里错过了提前付款的折扣?这些是人工智能驱动的系统可以为你提供的一些问题。
  • 合同合规:采购团队花费大量时间和精力来确保与供应商签订有效的合同。但是一旦合同签订,跟踪合规性就完全是另外一回事了!你的机器军队也可以部署在这里。利用分析有助于将合同和费率卡与交易数据联系在一起,并主动标记任何不合规的情况—从超额收费到未履行承诺的 SLA,以及介于两者之间的任何情况。
  • 欺诈和异常检测:我敢打赌,如果大多数采购团队能够及时发现欺诈或异常交易,而不是事后追溯,他们会非常高兴,因为到那时可能很难采取纠正措施。再说一次——在你的工具箱里有了人工智能——这马上就可以实现了!

第三步:预测分析:最后,一旦您有了数据基础,并且能够发现隐藏在it 中的节约,就可以开始下一步的旅程,即利用高级预测建模技术来解决复杂的采购任务,包括:

  • 请求预报
  • 存货管理
  • 物流规划
  • 采购价格分析

上述三个步骤中的一部分可能通过一次性的手动计划在一定程度上是可行的(尽管我可以向您保证,这将导致大量的心痛,因为要花费大量的时间来处理数据!).然而,做好这件事的关键是能够以可持续和可扩展的方式坚持做下去。这正是数据科学可以发挥巨大作用的地方。

不幸的是,采购部门在采用新技术方面往往落后。然而,随着人工智能在一个组织的许多方面的扩散,它没有理由在这个问题上保持中立。无论是从底线影响还是从采购职能如何促进组织更大目标的整体效率来看,收益都是巨大的。

人工智能辅助眼睛:一个计算机视觉系统,提醒操作员戴上安全眼镜

原文:https://towardsdatascience.com/ai-aids-eyes-a-computer-vision-system-to-remind-operators-to-wear-safety-glasses-ba0a1fe51b0?source=collection_archive---------22-----------------------

演示

这是该系统的演示。

当系统检测到有人拿起电钻时,它会自动发出安全眼镜警告。为了表示安全眼镜警告的存在,在演示视频中,RGB 图像的边框是红色的。

当系统检测到没有钻头被拾起时,它不会发出任何安全眼镜警告。为了表示没有安全眼镜警告,在演示视频中,RGB 图像的边框是绿色的。

如演示视频所示,计算机视觉系统成功检测到操作员是否拿起了钻头。

Demo

五金器具

我用木材(来自家得宝)形成一个支撑结构。然后,我在支撑结构上安装了一个微软 XBOX 360 Kinect 传感器(来自亚马逊),以监控地面上的活动。

Hardware

分割

下面示出了由 RGB 图像、深度图像和提取的对象的图像组成的示例。

RGB image, depth image and the image of the segmented object for classification

对于计算机视觉算法来说,仅从 RGB 图像来确定操作者的手是否拿着钻头是具有挑战性的。但是,有了深度信息,问题就简单了。

我的分割算法将 RGB 图像上像素的颜色设置为黑色,如果其对应的深度在预定义的范围之外。这使我能够分割被拾取的对象。

分类

我通过分别拍摄自己手持电钻/挥舞双手来收集数据。

然后,我使用迁移学习技术来调整一个 VGG 神经网络,该网络是使用 ImageNet 预先训练的。但是结果并不好。也许提取的图像与 ImageNet 中的自然图像不相似。

因此,我从头开始使用提取的图像来训练卷积神经网络。结果还算不错。在验证集上,分类器的准确率约为 95%。

该模型的一个片段如下所示。

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K# dimensions of our images.
img_width, img_height = 120, 120train_data_dir = '/home/kakitone/Desktop/kinect/data/train4/'
validation_data_dir = '/home/kakitone/Desktop/kinect/data/test4/'
nb_train_samples = 2000
nb_validation_samples = 1000
epochs = 5
batch_size = 8if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
else:
    input_shape = (img_width, img_height, 3)model = Sequential()
model.add(Conv2D(4, (3, 3), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(8, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(16, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1\. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)# this is the augmentation configuration we will use for testing:
# only rescaling
test_datagen = ImageDataGenerator(rescale=1\. / 255)train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

最后的话

2000

每天大约有 2000 名美国工人因工作导致眼部受伤,需要接受治疗。

60%

近 60% 受伤工人在事故发生时没有佩戴护目镜,或者佩戴了不适合工作的护目镜。

安全应该永远放在第一位。每当我听到涉及电动工具的事故,我的心就沉了下去。我希望这篇文章可以提高人们的意识,即人工智能可以为我们提供额外的保护。

做东西开心,注意安全!

艾:从育儿角度的解释

原文:https://towardsdatascience.com/ai-an-explanation-from-a-parenting-perspective-59d0a7d53f29?source=collection_archive---------10-----------------------

https://parentzone.org.uk/files/artificial-intelligence-21678351920jpg

人工智能(AI) 这个术语每天都在媒体上出现,在普通人群中引发兴奋和恐惧,包括终结者接管世界的流行陈词滥调。我想借此机会,在许多人都熟悉的背景下,简明地尝试为一般人群解释人工智能,为人父母。

我是两个小男孩的骄傲的父亲,一个两岁,另一个七个月。我对数据科学ML(机器学习)AI 世界的涉足早于我作为父亲的经历,所以当我和妻子开始研究如何抚养孩子时,我对儿童学习和人工智能领域的相似之处感到惊讶。

人工智能不是凭空神奇地创造出来的东西,它是必须经过训练的东西,在可预见的未来,必须由人类来训练。机器可以进行三种主要类型的学习,称为监督非监督强化。为了这个类比的目的,我将在监督学习的环境中进行描述。我们也不会在本文中讨论数据准备领域,尽管它在人工智能世界中非常重要,并且通常构成了数据科学家的大部分工作。

建立模型—获取数据并训练

训练机器或孩子最重要的第一步是获取数据。为了训练计算机理解基本的形状和颜色,我首先需要尽可能多地获取标记数据的例子,比如数千幅不同大小和颜色的三角形图像,并将这些图像标记为三角形 T21。

我会对其他的形状做同样的处理,比如方形圆形等等。为了理解颜色,我可能会得到数以千计的形状图像,这些图像标有特定的颜色蓝色绿色红色。我还可以获得数以千计带有形状和颜色标签的图像(蓝色圆圈绿色方块红色方块)。

本次培训的目标是建立一个模型,,它只是机器用来确定未来场景中的形状和颜色。不进入不同的训练算法的技术细节,损失函数,参数,超参数等可以使用,让我们只说,训练和测试发生在许多迭代,直到我们达到一个点,我们相信我们的模型将执行和推广在这些未来的形状和颜色的真实世界场景中非常好。如果你想知道的概括是什么,我们稍后会讲到。

为了教或“训练”我们的儿子学习形状和颜色,我会坐下来和他一起翻阅一本书,指着一个绿色的正方形说“正方形”或“绿色”。我可能会指着一个绿色圆圈,然后是绿色三角形,在这两种情况下都说“绿色”。实际上,我是在为他标记数据,就像机器在受监督的 ML 中必须标记数据一样。

我和妻子会对他重复这个过程很多次。随着时间的推移,我们会注意到逐渐增加的改进,直到我们相信他已经理解了这个概念,并建立了他自己的内部模型来应用于未来的形状和颜色识别任务。

这个学习过程是一个极其重要的概念。如果我和妻子只是给我们的儿子书本/图片,而没有花时间为他“贴标签”,他在成长过程中除了能够视觉识别它们并知道它们在某种程度上是相关的之外,对什么是颜色或形状没有任何概念。这个概念被称为无监督学习,因为我们的儿子不会被赋予任何标签,但能够将事物抽象和聚集在一起。

你可以想象,遵循这个策略会让我们的儿子在现实世界中成功的概率很低。机器也是如此。在没有任何人类交互(包括由人类编写的自动化软件)的情况下训练的 AI 在训练前“标记”数据,在现实世界中的成功概率也很低。使用无监督学习的最新技术很有前途,但在动态和不受控制的环境中仍然表现不佳。

准确但有偏差

在非学术的人工智能世界中,一个经常被忽视的重要概念是偏见。解释这一点的简单方法是用种族主义的概念。基于最近的媒体事件,我相信每个人都很清楚这个话题和围绕它的争议。

个人生来就不是种族主义者。这是通过接触不同的种族主义“训练数据”而学到的东西,无论是来自家庭、朋友、媒体还是其他一些特定的环境事件。这就产生了他们看待世界的偏见或特定视角。

Bias vs Variance — https://prateekvjoshi.files.wordpress.com/2015/10/3-bulls-eye.png

一台机器也不例外。用带有严重偏见的数据训练的人工智能系统在试图执行任务时总是会带着这种偏见,并将提供偏向于它被训练的观点的结果。因此,系统可能能够提供非常精确的结果,并且可变性很低,但是这些模型在现实世界场景中的有用性就成问题了。

如果它不能概括,它就没有用

构建任何模型最重要的部分是它在真实世界环境中很好地概括了。我们最近给儿子买了一套塑料玩具工具。它有锤子、螺丝刀、扳手、钉子和螺丝钉。我们玩了几次,最初向他展示了一切是如何工作的,他似乎很喜欢玩它。在几天的时间里,我们挂了一些画,我用锤子在不同的地方做了一些其他的工作,我们的儿子在一旁专注地看着。我承认,对我来说,可能有比锤子更好的工具选择,但尽管如此,它还是随手可得。

此后不久,我注意到我的儿子开始用他的玩具锤子做一切与修理有关的事情。我正在修理的婴儿门的零件,他会用他的锤子敲,当他看着墙上的画时,他会敲墙。甚至当我们在玩的时候,他也会用锤子修理他“假设”坏了的玩具车或玩具角色。基于我们提供的关于锤子做了什么的培训的有限背景,他形成了一个关于如何处理它的内部模型。因此,他的模型不会很好地概括在现实世界环境中修复事物。

在 ML 世界中,这种缺乏通用性通常是由过度拟合一个模型造成的。发生这种情况是因为模型被训练为基于某个损失函数最小化误差,并且使得模型被构建为精确地符合训练数据。

Overfitting — https://www.analyticsvidhya.com/wp-content/uploads/2015/02/underfitting-overfitting.png

在我们儿子的例子中,他过度拟合他的内部模型以从我们向他展示的关于修理东西实际是什么的有限数据中提供最佳结果。因为训练数据只是真实世界数据的一个很小的子集,所以这些不可概括的模型最终在真实世界的场景中提供很差的结果。数据科学家和工程师使用了许多技术来克服这个问题,但不幸的是,这仍然是人工智能商业化世界中的一个现实问题,也是许多应用程序在发布后不能很好工作的原因。

注意事项

上面使用的我们儿子的学习和机器学习之间的类比是为了让复杂的人工智能领域的事情更容易理解,即使学习和抽象的确切机制非常不同。我们将在以后的文章中讨论这个问题。

人类如何学习和推理是一个极其复杂的问题,研究人员仍然不能完全确定人类大脑的机制。机器可以非常快速地处理事情,但缺乏人类的抽象能力,这就是为什么复制人类智能是一项非常复杂的任务,我们仍然离它很远。现在还不需要担心终结者。

人工智能和创造世界上最棒的巧克力饼干

原文:https://towardsdatascience.com/ai-and-creating-the-worlds-ultimate-chocolate-chip-cookies-f8c688fe3f98?source=collection_archive---------7-----------------------

由 JD

作为一个自称巧克力狂的人,我依赖大量的巧克力来度过我的日子,我最喜欢的递送系统是巧克力饼干。我总是在寻找烘烤我最喜欢的食物的新方法,但网上有这么多食谱,每一个都声称它们是“最好的”——我该如何选择?我没有挑选一个,而是决定应用一些数据科学和机器学习技术来组合几个“最佳”食谱,以制作“终极”食谱。

数据

通常情况下,这个项目最困难的部分是获取和清理数据。使用我最喜欢的语言 Python(以及 BeautifulSoup),我尽可能多地搜集了 allrecipes.com 的巧克力曲奇食谱(所有的食谱最终都阻止了我,因为我发送了很多请求:(但我仍然得到了 30 个食谱!吸吧)。由于烘烤巧克力曲奇的程序保持相对稳定,不考虑配料,我只关注配料的成分而不是过程。只需将配料放入碗中搅拌即可。对于每一个食谱,我解析 html,然后一遍又一遍地擦洗数据,给我一个配料列表和它们各自的尺寸。由此,我将每个食谱编码为 n 维空间中的归一化向量,其中 n 是所有食谱中独特成分的数量。例如,配方:

1 cup butter, softened
1 cup white sugar
1 cup packed brown sugar
2 eggs
1 teaspoon vanilla extract
2 cups all-purpose flour
2 1/2 cups rolled oats
1/2 teaspoon salt
1 teaspoon baking powder
1 teaspoon baking soda
2 cups semisweet chocolate chips
4 ounces milk chocolate, grated
1 1/2 cups chopped walnuts

可能看起来像向量:

0.102564102564 ,
0.0512820512821 ,
0.0512820512821 ,
0.0512820512821 ,
0.0512820512821 ,
0.102564102564 ,
0.205128205128 ,
0.0512820512821 ,
0.102564102564 ,
0.025641025641 ,
0.102564102564 ,
0.0512820512821 ,
0.0512820512821 ,

实际上,我们的向量会更稀疏,也就是说,对于任何不在给定食谱中的语料成分,它们都是零,但你明白这一点。

终于!数据已经从粗糙和肮脏变成了数字化和干净。让乐趣开始吧!

探索性分析

当试图将食谱组合在一起以做出更好的食谱时,想到的一种技术是聚类,这种技术 99%的情况下意味着 K-Means。我想使用聚类中心来创建新的食谱,聚类中心将来自几个食谱的信息结合在一起。K-Means 易于理解和实现,但困难的一步是选择 K,即聚类数。如果你看一个像下面这样的二维图,通常很容易看到集群的数量。

但是当你有 4 维数据时,如何挑选最佳的聚类数呢?5?68?70?就饼干而言,这部分既是科学也是艺术。我们想要一套多样化的食谱,但我们不希望食谱过于接近原来的食谱。为了解决这个问题,我转向了一种稍微不同的聚类类型,叫做层次聚类。这种方法随着聚类大小变得越来越小来查看聚类之间的距离。最终的可视化效果非常棒:

由此我们可以立即看出,配方指数 1 和 22(可能还有 24、0 和 7)有一些异常值。让我们看看这些食谱是什么样的:

Recipe Index 1:
3 egg whites
3/4 cups semisweet chocolate chips
4 and 1/4 tablespoons unsweetened cocoa powder
1 and 1/2 teaspoons vanilla extract
3/4 cups white sugarRecipe Index 22:
1 cup butter
2 and 1/4 cups chocolate cake mix
4 eggs
2 cups semisweet chocolate chips

谁会用巧克力蛋糕粉做饼干??!!???这并不需要一个巧克力饼干爱好者看到这里的问题。这些食谱是离群值,或者我应该说是“说谎者”,聚类算法当场抓住了它们。如果我们忽略这些装腔作势的人,似乎有三组数据,给或拿:

三个集群似乎是一个很好的数字!现在我们可以继续运行 K-Means。有了使用模型中心作为食谱基础的想法,我们可以应用向量到文本的功能来获得这些新的人工智能生成的食谱的文本描述。这个函数获取一个向量,并将其放大,使数字具有合理的大小,并四舍五入到最接近的 1/4——这样,我们的食谱中就有 2 1/2 杯面粉,而不是 2.469 杯。现在,我们来看看 AI 大厨今天煮了什么!:

食谱#1:“矮胖子”

1 and 1/2 cups all-purpose flour
1/4 teaspoons baking powder
3/4 teaspoons baking soda
1/4 cups butter
1 egg
1/4 egg yolk
1/4 teaspoons ground cinnamon
1/4 large egg
1/4 cups macadamia nuts
1/2 cups packed brown sugar
1/2 teaspoons salt
1 and 1/4 cups semisweet chocolate chips
1/4 cups sifted all-purpose flour
1/4 cups unsalted butter
1 tablespoons vanilla extract
1/2 cups white sugar

嗯,这道菜需要很多不同种类的黄油和比例奇怪的鸡蛋。文本清洗没有考虑到成分名称的细微差别,所以“黄油”和“无盐黄油”被分开了。还有,谁用 1/4 蛋黄?不过,总的来说,这个食谱看起来还不错!配料的调制看起来很合理,甚至还包括一点肉桂!

食谱#2:“含糖燕麦”

1 and 1/2 cups all-purpose flour
3/4 teaspoons baking soda
1/2 cups butter
1 and 1/2 eggs
1/4 cups packed brown sugar
1/4 cups packed light brown sugar
1/4 cups quick-cooking oats
1/4 cups rolled oats
1/2 teaspoons salt
1  cups semisweet chocolate chips
1  tablespoons vanilla extract
1/4 cups water
1/4 cups white chocolate chips
1/2 cups white sugar

啊,是的,这有一个伟大的食谱你需要的一切:糖,巧克力,和更多的糖。这里又出现了成分名称不同的问题。也许在未来的版本中,我会加入一个特性,如果成分的名字相似,就把它们组合在一起,也许会使用 DP 算法,但那是另外一个故事了。

食谱#3:“极简主义者”

3/4 cups all-purpose flour
3/4 teaspoons baking powder
4 cups butter
1/4 cups confectioners' sugar
1 and 1/4 eggs
1/4 teaspoons salt
1 and 1/4 cups semisweet chocolate chips
3/4 tablespoons vanilla extract
3/4 cups white sugar

在创造的三个食谱中,这个是我最喜欢的!它有一个合理的成分组成,确保包括必需品(尽管我会注意到,你永远不会在你的饼干里有足够的巧克力片)。

最后的想法

使用 K-Means 算法来选择配料和它们的比例,对于食物和饮料来说效果很好,在这些食物和饮料中,组合配料的方法相对简单。然而,对于步骤顺序很重要的食品,必须使用更复杂的算法。但那是以后的事了。

人工智能及其对人类的影响

原文:https://towardsdatascience.com/ai-and-its-impact-on-humanity-924dde308274?source=collection_archive---------3-----------------------

一旦围绕它的神话被驱散,人工智能的未来可能是光明的

随着围绕人工智能的道德担忧不断上升,人们往往不承认一件事——我们要对我们驯服的人负责。几十年来,对解决人工智能之谜的永无止境的渴望一直困扰着科学家。第一个开始质疑机器能否思考的计算机科学家是艾伦·图灵——当时通用计算机刚刚开始制造。后来,在 1956 年,约翰·麦卡锡创造了人工智能这个术语,开启了人们开始与机器建立关系的时代,在这个时代,人们教机器如何学习和思考。

由于人工智能的快速发展,今天发现未来同样令人兴奋和恐惧。从作为一种理论,人工智能发展到研究,然后进入实验,今天,我们可以见证机器学习如何影响广泛的工作流程——从数字到人类劳动。

人工智能的开发越来越多,这可以用它对过程自动化的巨大价值来解释,而它最近的流行是由它的商业潜力引起的。在过去的几年里,人工智能不是逐渐发展的,而是呈指数级增长——这是与机器人相关的另一个恐惧原因。在短短几年的时间里,它已经从改善网络搜索发展到可以在所有行业使用的机器和产品,这要归功于深度学习——编程和认知科学的结合。

深度学习允许机器自己学习,例如,如果机器重复显示一个苹果的图像,它最终会学习这个苹果是什么。然而,目的不是让机器像人类一样思考,而是比它们更好更快。

据《财富》杂志报道,微软和谷歌已经在图像识别方面击败了最优秀的人类,而中国公司百度则在两种语言的识别方面超越了人类。当企业开始意识到人工智能迄今为止的无限能力时,他们已经用它来促进生产,开发新产品,并解决人类无法解决的问题。但是,如果发展继续以同样的速度进行,人们和他们的工作的位置在哪里?

即使 AI 还远远没有学会许多科幻电影中预测的令人恐惧的自我意识,但机器仍然可以在就业市场上与人类竞争。在制造业和农业领域,智能机器被用作人类劳动的更具生产力和效率的替代品。此外,有人预计机器人技术将很快发展到“智力劳动”也可能被取代的地步。

在当今的商业和经济环境中,合规性是公司需要谨慎对待的义务之一。富国银行最近的丑闻及其企业文化和管理失败可能会鼓励其他人质疑员工的可靠性。法规遵从性通常需要对交易进行大量艰苦而繁琐的筛选,在这种情况下,出错会导致严重的后果。为了避免麻烦,企业已经开始使用配备了自然语言处理系统的机器,这些机器能够在所有相关的商业领域取代与合规性相关的“知识”工作。

由于人工智能不是逐步发展的,机器学习往往也有冬天和干旱,因为在 2010 年代开始蓬勃发展之前,突破只是偶尔发生。斯坦福大学试图评估 2030 年人工智能的状态,并得出结论,人工智能不太可能提供改变生活的产品或威胁人类。因此,除了享受当前机器学习的进步,深度学习爱好者和企业需要小心他们的希望和期望,因为人工智能可能只是低于预期。尽管相关立法对人工智能现状的监管很重要,即使它不会很快毁灭地球。

人工智能的社会和伦理影响仍将震撼世界。这项技术正处于十字路口,要么继续造福社会,要么走向危害社会的道路。从政府的角度来看,人工智能的愿景和理解因国而异,有些人更愿意等待改变生活的进步,而另一些人已经做好了准备。英国决定采取后一种方向,因为伦敦是世界上最大的科技中心之一,人工智能的发展非常活跃。

英国科学技术委员会最近准备了一份关于人工智能和机器人的报告,成员们彻底讨论了它在不久的将来的社会影响。政府承认,技术将会扰乱人们的生活和工作方式,所以当局试图了解它会在多大程度上发生。报告说:“虽然我们还不能准确预见这场‘第四次工业革命’将如何发展,但我们知道生产率和效率的提高、新的服务和就业机会以及对现有角色的支持的改善已经在望,同时可能会失去一些成熟的职业。”。它的亮点包括必要时提高或重新提高国家的技能,以最大限度地减少技术带来的潜在危害。建议是在艾伦图灵研究所建立一个人工智能常设委员会,以检查人工智能发展的社会,伦理和法律影响。

对新技术的恐惧通常来自于缺乏透明度和对该主题的了解。为了避免社会上的进一步恐吓,特别是在失业方面,应该提供有关发展、倡议和研究结果的信息来教育社会。普华永道英国的人工智能负责人 Rob McCargow 与我们分享了这种接触不应局限于某些国家,因此人们和企业可以从全球机器人领域的成就中受益:“到目前为止,技术部门和高等教育机构已经将人工智能创新和标准掌握在自己手中。这是让政府参与的正确方向上的第一步。我们需要确保所有各方共同制定必要的法规,以构建可信、透明的人工智能系统来支持未来的经济增长 1。“制定正确的标准对于利用人工智能造福人类至关重要——人工智能不考虑国际边界,因此我们需要一个一致的全球监管方法。”

与电影中不同的是,技术还没有对它的任何行为和影响负责,所以引导和指挥人工智能是人的权力。

人工智能和机器学习:从培训走向教育

原文:https://towardsdatascience.com/ai-and-machine-learning-moving-from-training-to-education-3cadaab6683a?source=collection_archive---------14-----------------------

关于人工智能是否会达到或超过人类智能的争论一直在进行。随着人工智能、机器学习(ML)和深度学习(DL)的最新进展,这种情况肯定会加剧,一些人认为当前的技术已经能够为人工智能铺平道路(AGI)。你可以不时地听到或读到这样的争论,这有时会造成尴尬的局面,即使是在该领域最著名和最有声望的研究人员之间。

虽然受到人工智能梦想的推动,但大多数情况下,人工智能的应用并不关注实现 AGI,而是关注人类自己努力解决的问题。例如,寻找难以被人眼观察到或者难以被人脑转换成易处理的数学、模型和代码的模式。也许正是这些需求推动了框架的发展,这些框架并没有让人类智能转移到机器中,而是对其进行了补充。

过去 10-15 年的最新发展实现了亿亿级数据的可用性,加上可以有效存储和处理这些数据的硬件,为深度学习革命铺平了道路,这在 20 年前可能没有这么好的影响。但随后出现了宣传,随之而来的是大肆宣传。突然间,几乎所有人,包括那些分不清 AI 和 ML/DL 区别的人,都在赶时髦。有些人在寻找问题的解决方案,但没有真正理解什么工具最适合他们的目的,其他人在推销自己或他们的解决方案,但没有结合任何针对手头问题的见解。

在大肆宣传和营销的过程中,人们(人数最多,专业知识最少)有了这样的想法,也许人工智能已经达到了一个点,你可以向 ML/DL 算法提供大量数据和 wola!,你会在黑盒子的另一端找到你的解决方案。该算法将发现并生成所有见解,识别模式,区分相关性和因果关系,确定现实世界的联系和影响,并提供最佳的潜在诊断或预测。

作为一个来自统计分析领域的人,我可以说一组重要的 ML 算法是已经存在了相当一段时间的统计数学技术,尽管根据应用和专业领域在味道和命名上有所不同。这确实是该领域许多专家和从业者的观点。在我的研究中,重点是使用人类智能来识别有用的见解,并将对潜在现象的理解转化为计算机模型,“指导”算法如何找到或预测可靠和有用的信息。

相比之下,ML/DL 技术与三种不同的策略一起工作,都希望算法能够自己开发某种程度的理解。有了监督学习,你本质上只是告诉算法什么是现实世界中带标签的训练集。使用强化学习,当它出错时,你试图纠正它的行为。无监督学习的第三个领域,即机器能够在没有干预的情况下进行自我训练的领域,是进展最有限的领域。这三个策略可能不足以让我们接近 AGI。

不去深究什么是智能,或者我们人类甚至不了解自己的智能,更不用说在机器中复制它;让我们考虑一个非常基本的例子,通过相关性应该很容易证明一个观点。

假设你有幸生了第一个孩子。我们都知道婴儿有很强的观察和学习能力。几个月后,你的宝宝会开始注意,你可以指导(或监督)他可以把什么放进嘴里,什么不能。这是几个月来的好策略。在最初的几年里,你会让你的宝宝爬行、行走、跑来跑去、触摸、观察、闻和品尝东西,同时你会强化积极和良好的行为,纠正不良行为。但过了一段时间,这还不够。世界太大,无法探索,生活太复杂,无法用最少的帮助来解决,所以你最终不得不考虑学校!

伴随着学校而来的是教育,这个过程虽然漫长而令人厌倦,但至少在孩子发育成熟之前是不可替代的。为了确保最好的结果,你把你的孩子送到一所好学校,因为你希望孩子的心智、知识和技能得到最好的发展。但是如果学校不是很好呢?如果有同一个拥有高中文凭的老师教数学、历史、艺术、文学、科学、编程等等,会怎么样?你认为这种学校有助于你的孩子深入了解他/她将要生活的世界,还是有一个在各自学科领域有专门老师的学校?

这基本上是(大多数)人正在努力做的事情。首先,使用相同的 ML/DL 算法,没有上下文和修改来定制特定的应用程序,并期望最终产生神奇的结果。第二,开发的算法和框架大部分是训练的方法,而不是教育的方法。如果这不是我们让孩子们(他们无疑比他们的成年同伴聪明得多)学习和超越的方法,那么我们怎么能把这种方法用于计算机并期望他们开发任何类型的智力呢?

计算机和机器正处于学习和实现任何智能水平的初级阶段。这将需要多种技术来训练和教育他们,就像我们教育我们的年轻人一样。这个过程没有捷径,也不需要任何捷径。任何不受快速销售和利润驱动的事情只会导致次优的表现、风险和失望。那些意识到这一点的人已经在研究上投入了数十亿美元,这必将带来长期回报。

无论你站在人工智能辩论的哪一边,我们都应该能够同意,我们还没有取得很大成就。当前的发展无疑是重大的,但庆祝活动不应导致进一步努力开发更好的(也许是全新的)框架,使下一次范式转变成为可能。

人工智能和预测分析:未来会怎样?

原文:https://towardsdatascience.com/ai-and-predictive-analytics-what-does-the-future-hold-1806fd734c0f?source=collection_archive---------3-----------------------

人工智能和预测分析的进步将产生超越商业技术能力的影响。组织将在技能、实施等方面面临新的挑战。营销人员如何为变化做准备?

在这个系列中,我们已经看到了分析行业的进化过程如何自然地导致人工智能(AI)的集成,以创建准确的预测模型。

在第一篇文章中,我们探索了由技术进步驱动的人工智能和预测分析作为营销工具的潜力,这些技术进步已经从基于规则的自动化转向更接近感知的东西。我们随处可见这样的例子,从谷歌的 Waze 这样的应用程序,到金融欺诈保护和亚马逊上的个性化推荐。

该系列的第二篇文章基于这项技术的具体用例,展示了使用机器学习和人工智能来预测消费者行为和创造更好的业务成果的各种各样的业务。这些机会现在对所有公司开放,但抓住它们比仅仅购买一些新软件更复杂。

我们系列的第三篇也是最后一篇文章将关注预测分析的未来以及行业面临的挑战。

实施挑战

尽管如此强大的商业工具不可避免地会被大量采用,但现实要比这微妙得多。高管们希望做出更智能、更快速的决策,但在将业务转型为人工智能驱动的预测分析模型时,在数据、人员和技术的平衡方面存在某种高空绳索表演。

实施这一技术需要企业意识形态的转变,而不仅仅是资本投资,在数据分析方面从头开始的员工培训也是必不可少的。

此时,管理层对其组织的数字专业知识的信心似乎正在下降。普华永道最近的数字智商调查显示,高管们对团队能力的信心有所下降:

专业水平没有下降;这个行业变化太快,员工跟不上。

因此,如果人工智能驱动的预测分析要在首席信息官/CMO 的工具箱中占据核心位置,需要克服一些重大障碍。

在预测分析系列的最后一部分,我们将概述该行业未来面临的一些挑战,然后讨论企业现在可以开始实施的解决方案。

数据质量

在 Protoviti 最近对高管进行的一项调查中,数据被列为公司内广泛采用预测分析的最大障碍。质量是用来给“数据”这样模糊的术语增加特异性的最重要的修饰词之一。

在我们决定如何应对如此巨大的挑战之前,甚至“质量”也需要一些进一步的定义。

高质量的数据在格式上是一致的(即使是在大范围内),反映了它所描述的真实世界的情况,并且能够进行可靠的、可重复的研究。

我们可以以 2010 年至 2014 年从滑铁卢出发的火车数据集为例,该数据集包含跨时间框架的间隙,并使用不一致的命名约定。人类在这样的数据集中挣扎,但是我们可以适应,甚至从其他地方获取数据。人工智能根本无法处理这样不完整的数据,因为它只能处理输入系统的数据。

世界上最好的人工智能技术只能利用我们提供的数据,因此企业意识到这些潜在的陷阱并知道如何避免它们至关重要。更多的数据通常意味着人工智能驱动的预测分析的结果更好,但它必须是正确的数据,才能回答你旨在解决的业务问题。

拥有合适的团队是开始这条道路的好方法。

招聘和培训合适的技能

预测分析技术越来越复杂,但行业内的知识水平不一定同步发展。

凯捷的一份报告发现,77%的公司认为缺乏合适的技能是成功数字化转型的最大障碍:

一份 ClickZ 报告更深入地确定了最需要的技能领域,与它们在组织内当前的复杂程度相比。

毫不奇怪,分析被列为最重要的技能,因为它在每个营销职能中都有潜在的用途。将分析视为技能差距最大的领域,这或许会更令人惊讶。

分析包括各种技术和数据调查类型。今天进行的大多数分析工作要么属于描述性的(发生了什么?)或者探索性的(为什么会发生?).

尽管操作未来预测分析系统背后的技术所需的技能水平可能会随着时间的推移而降低,但企业仍然需要确保其员工在投资一些新的、令人兴奋的人工智能系统之前,拥有数据分析的详细知识。

幸运的是,只要企业愿意投资,就有充足的资源和资格来帮助这种培训。理论和实践都应被视为这一培训的基本组成部分。

在分析:如何用智慧取胜一文中,作者认为应该在大公司中建立卓越分析中心,由部门主管向首席技术官报告:

这种方法的目的是为分析提供一个明确定义的基础,其专家可以在此基础上教授组织内的其他人。

然而,我们可以从另一个角度来看这个问题。并非营销团队中的每个人都需要了解分析平台的内部运作才能从中受益。随着这些平台变得依赖机器学习来创建预测模型,这一点变得越来越真实。

不管怎样:广泛的知识基础仍然是必不可少的。如果不能提出正确的问题,或者不知道技术能够做什么(以及不能够做什么),那么输出就不符合目的。

因此,越来越多的人认为文科背景将成为统计学家和工程师越来越重要的补充。提出正确的问题作为假设的框架,然后调查结果的能力将是必不可少的,向高级利益相关者提出这些问题所需的软技能也是必不可少的。

本质上,如今需要一个村庄来获得正确的分析。但是,确保您的数据质量符合目的,并且您的分析团队拥有平衡的技能组合是一个很好的开始。

数据管理

当今时代不缺乏数据,随着物联网(IoT)设备继续进入世界各地的家庭,数据量只会增加。

每个公司都有潜在的利润丰厚的专有和第三方数据来源。基于云的解决方案可以远程存储大量数据,在一定程度上回答了数据应该保存在哪里的问题。

然而,即使企业使用像 Hadoop 这样的数据仓库,信息仍然需要转移到分析平台,并通过统计模型转化为见解。

对于许多企业来说,如何确保分析平台和人工智能系统跟上步伐仍然是一个难题。

数据管理还面临其他挑战,从数据挖掘到存储,最终将信息转化为有用的见解。

乔治·华盛顿大学和美利坚大学的科学家在 2013 年发表了一篇名为《大数据:前进中的问题和挑战》的论文,总结了这些潜在的问题:

随着欧盟 GDPR 法规的即将出台,这些问题比以往任何时候都更加重要。企业有责任确保所有数据符合当地法律,并安全处置不符合法律的数据。

如果有一件事是肯定的,我们不能让 AI 来做这些决定。人工智能预测模型将评估提交给它们的任何历史数据,如果一家公司后来发现错误的数据被输入其人工智能分析平台,它得出的任何结论都将被裁定无效。

追溯如此复杂计算的步骤并调试任何不需要的变量将被证明是一项不可能的任务。因此,任何计划将大数据输入基于人工智能的预测模型的企业都应该谨慎对待他们的数据源。

有责任

这一类别是一系列次要但仍然重要的挑战的总称。

人工智能和预测分析在医疗保健等行业中有着明确定义的重要角色。 80% 的医院领导认为这一领域“重要”,原因显而易见。任何能够发现与疾病相关的历史模式并预测其未来行为的工具在该领域都将被证明是非常宝贵的。

当应用于市场营销时,情况就不那么明朗了。毫无疑问,我们都可以从基于过去的准确预测中受益。事实上,这适用于整个社会。

然而,有一种观点认为,预测建模在一个依靠新想法蓬勃发展的行业中有一些局限性。复杂的人工智能系统和预测模型的诱惑是放弃控制,坚持我们知道将继续带来增长的东西。

此外,预测分析可以成为自我实现的预言。我们看到某个信息、产品或受众群预计会以更高的速度转化,因此我们转移预算以利用这一点。

如果预测成真了,那是因为预测准确,还是因为我们采取了行动使其准确?

最后,我们应该考虑人类创造力在这一过程中的作用。正如我们在关于人工智能驱动的内容创作的文章中所讨论的,人类创新和设计新的创造性解决方案的能力是人工智能还不能完全掌握的。因此,我们需要利用技术解放我们的团队,充分利用他们的能力来制定长期战略。

与任何人工智能技术一样,成功的最关键因素之一是人们在最大限度地利用他们所掌握的工具方面所扮演的角色。具体来看预测分析,这意味着确保高质量数据、最佳技术和有能力了解技术局限性的人之间的正确平衡。

最初发表于T5【www.clickz.com】

人工智能和隐私的未来

原文:https://towardsdatascience.com/ai-and-the-future-of-privacy-3d5f6552a7c4?source=collection_archive---------1-----------------------

隐私的基本定义是,为了限制他人对我们行为的影响,有权将自己或关于自己的信息隐藏起来。隐私历来被认为是行使言论自由、结社自由和选择自由等人权的先决条件。

在信息时代,隐私取决于我们控制我们的数据如何被存储、修改和在不同方之间交换的能力。

近几十年来,随着先进的基于互联网的数据挖掘技术的出现,隐私已经成为一个相关的社会问题。经常利用这些技术的社会行为者,如政府机构和企业,现在能够识别、描述和直接影响人们的生活,而无需他们的同意。随着日益复杂的人工智能系统的出现,这些隐私问题只会加剧。

人工智能带来的是收集、分析和组合来自不同来源的大量数据的能力,从而提高了使用这项技术的社会行为者的信息收集能力。人工智能对隐私的潜在影响是巨大的,这就是为什么必须提高对这些问题的认识。

要了解更多关于人工智能如何塑造隐私辩论的信息,可以考虑阅读我关于这个主题的简短指南,你可以在下面找到。

人工智能如何损害隐私

首先,让人工智能在信息收集中有吸引力的是三件事:速度、规模和自动化。人工智能进行计算的速度已经超过了人类分析师的能力,而且还可以通过添加更多硬件来任意提高。

人工智能还天生擅长利用大型数据集进行分析,并且可以说是在合理的时间内处理大数据的唯一方式。最后,人工智能可以在没有监督的情况下执行指定的任务,这大大提高了分析效率。人工智能的这些特征使其能够以多种不同的方式影响隐私:

数据开发

从智能家电到计算机应用,众多消费产品往往具有一些特性,使其容易被人工智能利用。更糟糕的是,人们经常不知道他们的软件和设备产生、处理或共享了多少数据。随着我们在日常生活中越来越依赖数字技术,剥削的可能性只会增加。

识别和跟踪

人工智能可以用于在多种设备上识别、跟踪和监控个人,无论他们是在工作中、在家里还是在公共场所。这意味着,即使你的个人数据一旦成为大型数据集的一部分就被匿名化,人工智能也可以根据来自其他设备的推断取消这些数据的匿名化。这模糊了个人数据和非个人数据之间的区别,而这种区别必须根据现行法律予以保留。

语音和面部识别

语音识别和面部识别是人工智能越来越擅长的两种识别方法。这些方法有可能严重危及公共领域的匿名性。例如,执法机构可以使用面部识别和语音识别来查找个人,而没有可能的原因或合理的怀疑,从而绕过他们原本必须维护的法律程序。

预言;预测;预告

AI 可以利用复杂的机器学习算法,从非敏感形式的数据中推断或预测敏感信息。例如,某人的键盘打字模式可以用来推断他们的情绪状态,如紧张、自信、悲伤和焦虑。更令人担忧的是,一个人的政治观点、种族身份、性取向甚至整体健康状况也可以通过活动日志、位置数据和类似指标等数据来确定。

压型

人工智能不仅仅局限于执行信息收集任务。它还可以使用信息作为输入,用于对人进行排序、评分、分类、评估和排名。这通常是在没有被分类的人的任何同意的情况下进行的,他们通常没有能力影响或挑战这些任务的结果。中国的社会评分系统就是一个例子,说明这些信息如何被用来限制获得信贷、就业、住房或社会服务。

如何保护自己的隐私

隐私受到如此关注的原因之一是,人们对可以用来保护隐私的措施不够了解。为了澄清这个问题,我列出了一些任何人都可以采取的步骤,以减少他们的在线足迹,从而增加对数据挖掘尝试的阻力。

浏览匿名网络

互联网用户可以选择使用 Tor、I2P 或 Freenet 等匿名网络来保护自己的隐私。这些网络支持端到端加密,这意味着你发送和接收的数据不会被窃听。

使用开源网络浏览器

您选择的网络浏览器是保护您隐私的另一个重要因素。Firefox 等开源浏览器可以免费接受安全漏洞审计,这使得它们比 Chrome 等专有浏览器更受欢迎。

使用开源操作系统

苹果和微软等操作系统制造商有各种后门,他们可以利用这些后门未经许可收集数据。规避这个问题的一个方法是使用众多免费开源 Linux 发行版中的一个。

使用安卓手机

现代智能手机在设计上存在隐私风险。硬件制造商和应用程序开发人员都需要您的数据来提供手机的预期功能,但代价是失去对数据使用方式的控制。安卓手机比微软和苹果手机更安全,这得益于它们的开源软件,但它们仍然存在隐私风险。

结论

人工智能等数字技术已经对我们生活的许多领域做出了重大贡献。通过使用这些工具,我们能够收集和分析的大量信息使我们能够解决以前没有解决方案的社会弊病。

不幸的是,这些技术也可以被各种社会行为者用来对付我们,从个人到公司,到政府机构。我们失去隐私只是人工智能等技术如何损害我们的一个例子。然而,如果我们设法正确理解这些技术,以及它们对我们日常生活的影响,我们将获得保护自己免受那些恶意使用它们的人利用的手段。

人工智能和操作系统

原文:https://towardsdatascience.com/ai-and-the-operating-system-4282edd3a930?source=collection_archive---------2-----------------------

令我震惊的是,当我想到人工智能并审视已经可用的技术时,我会相信,我们比通常认为的更接近模糊人类和机器之间的界限。

不需要一开始就研究人工智能的复杂性,一个简单的思维实验就能揭示我对这个问题的想法。

接下来,我会问一些问题…“一个人能不能…

  1. 多任务?
  2. 识别语音?
  3. 说话,讲笑话?
  4. 管理和记忆大量信息?
  5. 认识人?
  6. 检测并战胜病毒?
  7. 把工作外包给别人?
  8. 对触摸有感觉和反应?
  9. 监控和优化他们自己的表现?
  10. 去睡觉?
  11. 专心听,尤其是听到被叫的名字?
  12. 在内部和外部搜索信息来帮助自己?
  13. 乐于助人?
  14. 写和读书面信息?
  15. 提醒人们?
  16. 传递别人的信息?
  17. 承担持续改进?
  18. 伸手求助?

当然,这些问题的答案都是肯定的。

无需过多拟人化,简单回顾一下当今最先进的计算机操作系统(OS)就会发现,它们已经可以或多或少地做到上述所有功能。例如,如果没有其他原因,只是为了测试技术水平,对我的 Windows 10 机器说“嘿,Cortana…给我讲个笑话”,并对足够的响应感到高兴,这让我感到非常高兴。

如果你不知道任何更好的东西,你会看着现代消费者操作系统,并认为,“人工智能已经在这里了”。

当然,更深入的分析可能会将操作系统的每一项功能都简化为一个更大的“巧妙技巧”包的一部分,而根本不是“人工”智能的例证。

在我看来,这种对操作系统中的智能的“简化”观点只是“简单化”的,并没有把构成整体组成部分的具体化智能放在眼里。语音识别不仅仅是一个简单的技巧。

分析师和评论家很快指出,一个操作系统目前无法显示所谓的 AGI,或人工通用智能;即“能够成功完成人类可以完成的任何智力任务的机器的智能”。

这样的批评是有根据的。的确,当前的操作系统不能也不会显示 AGI。他们所展示的是我称之为应用专业智能的混合体。每一个人工智能,例如多任务处理,在累积的整体中扮演着自己的角色,累积起来就构成了一个展现非凡智能的机制。

可以想象一个展示 AGI 的操作系统,而不需要构建它。电影《她的》探索了一个展示 AGI 的人工智能,我们在电影的结尾感到疑惑,“我们会想要一个展示 AGI 的操作系统吗?”主角的操作系统已经超出了它原来的主人,开始了“她”自己的(人工)生活之旅。

我个人认为,AGI 是一个崇高的追求,但可能不太适合纳入操作系统。我们期望操作系统是功能性的、有用的,并且,我认为,服从于我们的意志。有鉴于此,我觉得现在甚至在 AGI 的操作系统建成之前,就有必要问这样一个问题,“一个不可预测的、不像人类一样容易犯判断错误的操作系统,对我有什么可能的用处?”,“我想要一个可能会和我争论的 OS 吗?”“我想要一个选择性地不服从我的命令的操作系统,因为它‘认为’它知道得更好吗?”。

人工智能的探索者提出了一个更深层次的问题,那就是我们是否想要或需要一个花时间设计更聪明的人工智能的 AGI?不难想象,一个展示 AGI 的操作系统,如果任其自生自灭,将会启动自己的项目……其中一个项目就是用一个更高功能的人工智能取代自己。

作为一个消费者操作系统的潜在客户,这听起来对我来说一点用都没有。

在过去的一年半时间里,已经有很多关于机器学习和神经网络的其他应用的文章,包括人工智能在游戏中击败人类、围棋和扑克等相当明显的“胜利”;但我不相信人工智能的未来在于模仿人脑某些部分的神经网络。

我相信人工智能,尤其是在操作系统中,将会包含大量的人工智能,其中任何一个人工智能都可能是经过训练的“学习机器”的结果。也就是说,如果机器学习的输出是一个可以很好地玩围棋的神经网络,那么它只是一个适合更大的人工智能/AGI 的人工智能,如果你愿意的话,是一个“学习机器”。

例如,一旦一个人学会了如何系鞋带,这个表面上的“程序”将伴随这个人的余生(希望如此),并且很少(如果有的话)需要修改(或继续“学习”)这个过程。因此,人工智能“系鞋带”成为智能或人工智能/AGI 的武器库的一部分。

大多数人工智能是机器学习的结果还是硬编码的结果还有待观察,但我相信基于人工智能的操作系统将展示两种形式智能行为的同等部分。

人工智能和操作系统

有一点似乎很清楚,开发消费者操作系统的公司正在尽可能多地将实用的专业智能集成到操作系统中,并且认为这对人们有帮助。

一个可以给我讲笑话,通过语音为我安排提醒的 OS 的前景让我感到温暖;我期待着看到操作系统与家庭智能物体集成的好处。

我认为研究必须集中在操作系统拥有一个人工智能库来解决特定任务的地方(就像现代操作系统已经做的那样),以及那些人工智能最适合基于人的需求而不是人工智能本身来真正帮助人的模型的地方。

我希望这篇文章读起来令人愉快。时间允许的话,我会继续思考 AI 和操作系统。

这一系列中的第二部分可见于:
“我”的概念。人工智能与操作系统第二部分

— — — — — — — — — — — — — — — —

人工智能应用:采购的挑战和机遇

原文:https://towardsdatascience.com/ai-applications-evolving-challenges-and-opportunities-for-procurement-982f8acb0674?source=collection_archive---------8-----------------------

毫无疑问,人工智能在采购领域的应用是当务之急。众所周知,大多数组织中的采购职能仍然处于数据科学和人工智能采用的曲线上。不幸的是,随着采购背景的迅速变化,时间已经不多了。采购领导者正处于风口浪尖,为了保持相关性,他们必须迅速采取措施,拥抱前沿的想法、工具和技术(其中许多都基于数据科学和人工智能)。

在当今世界,采购面临着前所未有的变化,这种变化是由商业环境的快速转变所驱动的。

(1)日益增加的复杂性:过去十年,企业转型的速度令人难以置信。它不缺少工业革命期间发生的那种变化。采购也没有不受这些变化的影响。

随着公司变得越来越全球化,地理界限变得越来越模糊。他们的供应商正在经历类似的演变,进一步增加了复杂性——即使是最小的公司,买方和供应商的网络也很快成为一个错综复杂的网络。除此之外,新的购买模式、外包和采购职能集中化的趋势也变得越来越复杂,这就形成了一个复杂的内部关系的大熔炉,如今没有一个采购组织能够幸免。

(2)改变对供应商风险的看法:曾经有一段时间,采购专业人员可以巧妙地量化和衡量与任何供应商相关的风险,并将其纳入他们的采购战略。随着技术和全球化的到来,“风险”的定义正在发生变化。地缘政治风险不再局限于一个国家——印度的问题很可能会影响你在菲律宾的供应商。同样,货币风险也是相关的。技术正以一种必须跟踪技术主导的风险的速度使企业变得过时。不胜枚举!

(3)内部变革的步伐:当今的组织需要非常敏捷,以确保在技术革命的背景下保持活力。他们想出做生意的新方法。他们进入新的市场。他们推出新型产品或服务。他们经常重组自己。他们参加越来越多的并购活动。所有这一切都以令人眩晕的速度发生。想象一下采购部门的惊愕,他们不仅需要跟上这些变化,还需要以可持续和可扩展的方式做到这一点!

(4)激光聚焦成本节约:在过去十年左右的时间里,随着几轮经济起伏周期的结束,企业开始变得更加强硬,更加关注成本。专注于收入增长的执念已经被承认在成本控制方面也需要积极进取所取代。这就把采购作为公司的战略齿轮摆在了中心位置——他们有非常严格的节约目标。

这些变化无疑将采购组织推到了聚光灯下。他们不再是公司等级制度中被忽视的表亲。虽然这是采购从业者值得庆祝的原因,但这也意味着他们需要齐心协力,确保他们发展技能,采用工具和技术,使他们能够达到对他们的要求。

为了让采购团队脱颖而出,并为他们的组织提供引人注目的商业价值,他们需要关注一些必需品:

  • 数据驱动决策:从历史上看,采购更多的是管理供应商关系,并通过定期的供应商讨论和谈判来节省成本。然而,现在已经不是这样了。采购部门现在需要做更多的工作来持续提供底线影响。能够做到这一点的一个关键驱动因素是 利用数据来推动关键决策
  • 自动化:流程工作流经历了跨职能的巨大变化,从内部管理到外包,再到日益自动化。需要专注于采购中的自动化——不仅仅是为了节约成本,也是为了带来更多的效率。理解并采用人工智能驱动的技术来实现这一点将是关键。这也意味着采购专业人员需要重塑自我,才能保持相关性。
  • 物联网:物联网已经从一个新的流行词迅速变成无处不在,采购职能可以利用它的力量来提供变革性的价值。拥抱物联网将为采购部门提供实时跟踪公司内购买、存储和使用的一切的能力。对这些丰富数据的访问与有效的数据分析策略相结合,将使 it 部门能够以前所未有的效率管理他们的采购和供应链。
  • 用户体验:大多数公司的采购功能都处于新模式的门槛。It 不再仅仅被视为支持功能,而是其用户(即组织内的业务购买者)的关键利益相关者。专注于为他们的用户群体提供差异化的价值现在是大公司采购的一个重要目标。更顺畅的购买过程、更快的周转时间、更好的信息访问、更多的选择等等。只是传递这些的一些方式。同样,人工智能驱动的技术和预测分析可以提供实现这一目标的必要手段。

Hackett Group 最近的一项研究显示,绝大多数(79%)采购高管认为,提高他们利用分析的能力在未来几年至关重要。

我相信我们正处于采购新时代的开端。我知道我在这里听起来有点矫情,但这确实是事实。对于采购专业人士来说,这既是一个警钟,也是一个巨大的机会。