TowardsDataScience-博客中文翻译-2020-七十三-

TowardsDataScience 博客中文翻译 2020(七十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

推荐系统介绍- 2:基于深度神经网络的推荐系统

原文:https://towardsdatascience.com/introduction-to-recommender-systems-2-deep-neural-network-based-recommendation-systems-4e4484e64746?source=collection_archive---------1-----------------------

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

深度学习在推荐系统中是如何使用的?

这是我关于推荐系统的第二篇文章。在我的上一篇文章中,我谈到了基于内容的协同过滤系统。如果你有任何困惑,我会鼓励你通读这篇文章。在这篇文章中,我们将看到深度学习是如何用于推荐系统的。我们将介绍 Youtube 推荐系统的候选生成架构。所以,让我们开始吧。

为什么选择深度神经网络?

矩阵分解方法的局限性:

  1. 使用辅助功能的困难,这可能会影响推荐,如电影的 U/PG 分级或用户的国家。在矩阵分解的情况下,我们只能使用项目 ID 和用户 ID。它还防止我们查询不在训练集中的项目或用户。
  2. 矩阵分解也有冷启动问题,因为它没有特征向量或新项目的嵌入
  3. 矩阵分解通常倾向于向每个人推荐受欢迎的项目,这通常在使用点产品时并不总是反映特定用户的兴趣。
  4. 矩阵分解作用于用户和项目特征嵌入的简单内积,它通常不足以捕捉和表示用户和项目中的复杂关系。

深度神经网络被设计并用于解决矩阵分解方法的这些缺点。

我们将使用两篇研究论文中的参考文献来了解深度学习如何为推荐系统工作:

  1. 神经协同过滤:https://arxiv.org/abs/1708.05031
  2. YouTube 深度神经网络推荐:https://dl.acm.org/doi/10.1145/2959100.2959190

神经协同过滤:

神经协同过滤(Neural Collaborative Filtering,NCF)是新加坡国立大学、哥伦比亚大学、山东大学和德克萨斯 A&M 大学在 2017 年发表的论文。本文提出了一个基于神经网络的协作学习框架,该框架将使用多个感知器层来学习用户-项目交互功能。

矩阵分解

我在上一篇文章中谈到的矩阵分解,(如果您有任何困惑,请检查工作)将用户和项目潜在向量,或用于描述项目或用户的密集特征向量,映射到相同的潜在空间或嵌入空间,并将用户-项目交互表示为用户和项目向量的内积或点积。本文认为,在矩阵分解的情况下,交互函数的简单选择,即点积可能会造成阻碍,因为它可能无法捕捉用户-项目交互的复杂关系。

该文件展示了以下例子:

假设有 M 个用户和 N 个项目,Y(M×N)表示项目用户矩阵,使得:

所以,生成的矩阵看起来像,

比方说,这是我们的用户-项目互动矩阵,1 表示用户与项目互动,反之亦然。现在,如果我们获得我们的用户和项目潜在向量或嵌入向量,它们将看起来像这样:

对于项目和用户,我们分别得到:

(A)项目嵌入(B)用户嵌入

内积上的上述矩阵给出了相互作用矩阵。现在,这篇论文集中在隐式反馈上,例如,如果用户与一个项目交互,它的正面反馈,正如这里所考虑的。但在实际情况下,这里的 1 可能并不直接暗示用户喜欢该内容。类似地,0 表示用户和项目之间没有交互。详细地说,如果我作为一个用户观看一个视频,我与该项目进行交互,这被认为是 1 暗示我对该视频的积极反馈,这在现实世界中可能不是真实的,因为我可能不喜欢该视频。我认为这背后的直觉是,如果我与一个项目互动,这表明我对该类型的项目感兴趣,因此,它可能会给出我喜欢或想观看的内容类型的想法。这是某种积极的反馈。虽然 0 可能不是负面的反馈,但它们可能仅仅意味着用户没有看或者丢失了数据。所以,存在着负反馈的危机。

现在,为了使用基于模型的方法对项目进行排序,本文使用:

来源

y(u,I)是用户 u 和项目之间交互的预测得分,θ表示我们需要优化的模型参数,f 是交互函数。

现在让我们来谈谈目标函数或所用的损失函数:

逐点损失:尽管使用了均方误差的回归框架损失函数,但它将问题视为分类问题。它试图最小化条目的预测分数和目标值之间的 MSE。如果我们去实现细节,我们采取一个积极的例子和 k 个消极的例子,并适合一个 sigmoid 激活。然后,我们使用 MSE 来最小化误差。负例是指相对于正例或 1 随机抽样的 0。基本上这是一个分类,我们试图让层预测 1 为积极的例子和 0 为消极的例子。

成对损失或排名损失:它试图将观察到的条目或 1 的排名高于 0 或未观察到的条目,即 1 的得分高于 0。它使用的公式如下:

Loss= 1 — sigmoid(正分-负分)。

它训练三个一组,一个例子,一个积极的或观察到的项目,一个消极的或未观察到的项目被耦合在一起,以创建一个训练样本。如果阳性和阴性得分之间的差异很大,则 sigmoid 给出一个接* 1 的数字,并且从 1 中减去该数字,从而给出较低的损失。这种损失被暹罗网络所利用。这种损失函数有一个自适应版本,我们不打算讨论,但简单地说,它不是随机地对负样本进行采样,它从一组入围的负样本中选择负样本,对其生成的分数是最大的,也就是说,该模型对该样本产生大量错误的概率是最大的。

论文使用了逐点损失。

接下来,让我们观察矩阵分解方法的缺点,

来源

假设,这是我们的物品-用户交互矩阵。我们将使用余弦函数来获得用户潜在向量之间的相似性。

S{i,j}=余弦(I,j)

s 表示用户 I 和 j 之间的相似性

所以,我们得到了,

S{23} > S{12} > S{13}。

现在,如果我们根据它们的相似性排列它们,我们得到:

来源

这种类型的向量表示,其中每个向量 P 代表一个用户。

现在,U4 来了一个新用户。

重新计算后,我们会得到。

S{41} > S{43} > S{42}。

如果我们仔细观察,会发现 U4 和 P1 最相似,然后是 P3,最后是 P2。

让我们看看另一个矢量表示:

来源

如果碰巧 u4 被放置在 p4,它将类似于 u2 并给出错误的推荐,因为它将给予 u2 比 u3 更大的权重来预测 u4。

这个缺点通过使用推荐系统的深度学习得到了解决,推荐系统使用深度神经网络来创建嵌入。

NCF 的建筑:

来源

工作:模型接受两个稀疏向量,一个代表用户,另一个代表商品。项目向量在索引处具有 1 意味着用户已经与对应于该索引的项目进行了交互。所以,精心地,

用户向量=[ 0,0,1 ……..0]具有 m 个元素,意味着该向量代表 m 个用户中的第 3 个用户。

项目向量=[0,1,0,1,1,0…..1]具有 n 个元素,意味着用户与 n 个项目中的那些项目进行了交互。

基本上项目和用户都是一次性编码的。

接下来的层是嵌入层,从输入层获得稀疏输入的密集或潜在向量。现在,获得的潜在向量被馈送到多层神经架构中,以将潜在向量映射到预测的概率得分。这些层负责从数据中发现复杂的用户-项目关系。输出层产生预测得分 Y_pred(ui),即用户 u 与项目 I 交互的概率有多大。

为了训练模型,作者使用了逐点损失函数,以最小化目标值 Y(ui)和相应预测值之间的差异。

NCF 模型的预测方程由下式给出:

来源

“其中 P ∈ R(M×K)和 Q ∈ R (N×K),分别表示用户和项目的潜在因子矩阵,θf 表示交互函数 f 的模型参数”。- 来源

我们知道对于多感知器层,对于每一层,

y= f1(x),其中 f1 是激活函数或映射函数。这里,输出预测被公式化为:

来源

其中 Psi-out 和 Psi-x 分别表示输出层和第 X 个神经协同滤波(CF)层的映射函数,总共有 X 个神经 CF 层。

NCF 的学与失

NCF 使用逐点损失来训练模型参数。因此,它使用均方损失进行训练。损失被描述为:

来源

“其中 Y 表示 Y 中观察到的相互作用的集合,Y 表示负实例的集合,其可以是所有(或从中取样)未观察到的相互作用;Wui 是一个超参数,表示训练实例(u,I)“T19”的权重。——出处。

现在,正如我们所知,*方损失通常用于回归,并解释为高斯分布,但在我们的情况下,它是一种目标值为 0 或 1 的二元分类,取决于用户是否与项目交互。因此,为了满足我们的要求,本文提出了一种学习逐点损失的概率方法,该方法更加关注数据的二进制属性。本文使用逻辑函数将预测输出保持在[0,1]的范围内。

该函数被重新定义为:

来源

所以,取负对数,得到的函数是:

来源

损失函数实际上是二元交叉熵损失或对数损失。优化是使用 SGD 优化器完成的。

因此,NCF 获得损失函数值,并使用它通过反向传播来训练嵌入和模型参数。证明了矩阵分解是 NCF 的特例。因此,我们可以使用神经协同过滤准确地获得项目和用户嵌入。

我们刚刚在这里谈到了 NCF 模型,本文还提出了一种融合一般矩阵分解 GMF 和多感知器层 MLP 的模型思想,命名为 NeuMF。

来源

融合背后的一般思想是,GMF 更好地生成线性依赖性,而 MLP 更好地模拟用户-项目交互中的非线性依赖性。

这里,MLP 的项目和用户向量以及 GMF 层的用户和项目向量被分别训练,从而它们可以达到个体最优。

然后,这些层被连接起来,并被馈送到 NueMF 层,用于最终预测和从丢失中反向传播。我们不打算在这里谈论它的工作原理,如果你想知道更多,请随意浏览原文。

深度神经网络 Softmax 方法

现在,让我们谈谈第二篇论文,以获得关于 youtube 如何利用 softmax 层实现其推荐系统的清晰直觉。

针对 YouTube 的深度神经网络推荐:

该论文由保罗·卡温顿、杰伊·亚当斯和埃姆雷·萨金撰写。本文讨论 Youtube 如何向用户推荐视频。该文件主要提到三个挑战:

  1. 数据规模:Youtube 拥有庞大的用户群和语料库
  2. 新鲜感:youtube 的语料库是非常动态的,每秒钟都有一小时的视频被上传
  3. 噪声:有稀疏性和外部因素造成嘈杂的隐式反馈。

系统概述

youtube 的系统由两个神经网络组成,一个用于候选人生成,另一个用于排名。候选生成器负责将用户的观看历史作为输入,并从 youtube 庞大的视频语料库中给出一小部分视频作为推荐。候选生成网络基于协同过滤工作。像观看历史和人口统计这样的特征被用来决定用户之间的相似性。排名网络通过使用描述视频和用户的特征集合根据期望的目标函数给每个视频分配分数来完成前 N 个项目的选择。

来源

该图显示了 youtube 的系统概述。该系统使用我们在上面讨论过的性能指标,如精确度、召回率和排名损失。

候选人生成

候选生成神经网络基于使用排名损失的矩阵分解,其中用户的嵌入层完全使用用户的观看历史来构建。根据该论文,该方法可以被称为“因子分解技术的非线性推广”。- 来源

工作

本文使用建议作为极端多类分类,并将 softmax 图层作为输出图层。

softmax 函数由下式给出:

论文提出问题的分类方程为:

来源

这里,该模型试图对用户 U 将在时间 t 观看视频的概率进行分类,由(W{t})从给定上下文 C 中的视频 i 的庞大语料库中给出。“u”代表用户的嵌入或密集特征向量,“v{j}”代表候选视频的嵌入。嵌入是从用户的稀疏向量中创建的,这些稀疏向量是从他们的观看历史中创建的。神经网络学习作为用户历史的函数的用户嵌入“u ”,该用户历史被馈送到 softmax 层以基于历史和嵌入对用户可能想要观看的视频进行分类。用户观看视频的概率由 1 给出,用户不观看的条件由 0 给出。

现在,已经说过 youtube 在分类机制上工作,我们应该注意到 youtube 有一个巨大的项目语料库,如果我们想使用 softmax 层对特定用户喜欢的内容或项目进行分类,这将是一个巨大的分类,在输出层有大量的节点,大多数项目都是负样本。大多数条目将是负面的,因为考虑到 youtube 上给出的条目的巨大语料库,从常识来说,我们可以说,不存在观看了 youtube 上全部可用内容的 20%的用户。此外,如果我们分析我们的观看模式,我们会意识到,作为观众,我们对某些特定类型的内容感兴趣,也就是说,我们实际上不想观看任何类型的内容,我认为这也可以清楚地满足为什么首先我们的观看历史对描述我们作为观众如此重要。因此,交互矩阵中的大多数项目的概率为 0。

使用 softmax 一次对如此多的项目进行分类将花费大量时间,因此 Youtube 使用了负采样方法。这种方法有助于 youtube 从背景分布中随机抽取用户的负面类别。在实践中,数以千计的负面类被采样。基本上,这个想法是由这样一个事实驱动的,即我们想知道用户喜欢什么类型的内容,因此,使用 100K 的负样本是没有意义的,这会延迟模型的性能。这减少了训练集的大小,从而减少了输出层中的节点数,并最终减少了 softmax 模型所花费的时间。

现在,一旦候选生成网络生成了密集向量或嵌入,评分网络就变成了用户和项目向量的点积空间中的最*邻居搜索,并因此产生了作为推荐出现的前 N 个选择。

反馈机制

Youtube 的工作基于一种隐含的反馈机制。虽然它有显式反馈可用,但鉴于视频和用户的数量巨大,显式反馈在本质上变得非常稀疏,因此,隐式反馈被用于训练模型。如果用户完成观看一个视频,则视为正反馈,以此类推。通过这种方式收集反馈。这种方法会产生大量反馈,可用于训练模型。

来源

模型架构

该论文指出,youtube 的模块使用固定的词汇来学习视频的嵌入。对于用户来说,用户的观看历史被表示为稀疏视频 id 的可变长度序列,稀疏视频 id 被映射到密集向量,密集向量充当用户的嵌入向量。嵌入被连接以形成特征。除此之外,年龄、性别和国家等其他特征也被考虑在内。完整的特征集被馈送到完全连接的多层整流线性(ReLU)单元。使用正常梯度下降来训练参数和嵌入。我们从 softmax 层获得候选视频和用户的最终嵌入,并将其提供给最*邻算法以生成最佳选择。

作为使用深度神经网络的一个重要方面,该论文还关注于包含侧面特征来训练模型。它指出,该方法有助于以规范化的方式包括许多二元和连续的特征,如年龄、性别和人口统计,这对于向新用户推荐非常重要。例如,该论文提到,youtube 已经观察到“新鲜的”内容或新上传到 youtube 上的内容受到用户的偏好,因此,制作者需要基于用户的兴趣向用户推荐新鲜的内容。它还需要对本质上完全动态的病毒内容进行同样的处理。

论文还谈到了排名系统,我们不会讨论这个问题。如果你有兴趣了解完整的流程,我建议你去浏览一下原文以便有一个完整的概念。

最后,我想谈谈另一种基于深度学习的推荐系统。

推荐为序列预测

如果我们观察我们与不同项目的交互,比如说,我们正在观看 youtube 的视频,我们按顺序观看视频,也就是说,我们选择一个项目,与它交互,然后移动到新项目。因此,基本上我们所做的是,作为一个观众,我们按照访问项目的顺序创建一个项目序列。这种类型的推荐系统采用这些序列,并基于该序列尝试预测序列中的下一个项目。

现在,为了预测序列中的下一个项目,它为特定用户的每个项目分配一个可变概率“p”。它指出,基于用户的历史,用户下一步想要与相应的项目交互的可能性是 p%。

因此,它可以表示为:

[a]->b

[a b]->c

【公元前】->公元前

诸如此类。

系统将每个用户定义为他/她的项目交互历史的函数。有几种方法可以解决这个问题:

  1. 用户被定义为他以前交互过的项目向量的*均值,然后获得的用户向量被用于推荐
  2. 递归神经网络在用户的连续观看历史上被训练,以生成用户的嵌入
  3. 可以使用卷积神经网络。我们可以将观看历史序列分割成训练窗口,并且在特定用户的交互序列上移动一维训练窗口以获得嵌入

这三种是构建推荐系统的常用方法,将用户数据视为一个序列。

结论

在本文中,我们讨论了深度学习在推荐系统中的使用方式。

希望这篇文章有所帮助

回归分析导论

原文:https://towardsdatascience.com/introduction-to-regression-analysis-9151d8ac14b3?source=collection_archive---------10-----------------------

本文介绍了回归分析的基础,使用加州住房数据集作为一个说明性的例子

照片由卢卡斯像素上拍摄

机器学习任务可以分为以下四类:

本文着重于回归分析。具体来说,本文描述了这项任务的基础,并在加州住房数据集上阐释了其主要概念。

这篇文章的结构如下:

  1. 什么是回归?
  2. 回归和分类的区别
  3. 回归的类型:由于回归模型数量众多,我们介绍最常见的几种。
  4. 如何选择正确的型号
  5. 线性模型:在所有可用的回归模型中,本文重点介绍线性模型的理论和假设。
  6. 线性模型示例:用线性回归模型分析加州住房数据集。
  7. 其他回归分析示例

1.什么是回归?

回归分析在维基百科中的定义是:

统计建模中,回归分析是一组统计过程,用于估计一个因变量(通常称为“结果变量”)与一个或多个自变量(通常称为“预测值”、“协变量”或“特征”)之间的关系。

您经常听到的与回归分析相关的术语是:

  • 因变量目标变量:要预测的变量。
  • 自变量预测变量:估计因变量的变量。
  • 异常值:与其他观察值显著不同的观察值。应该避免,因为它可能会妨碍结果。
  • 多重共线性 : 两个或两个以上自变量高度线性相关的情况。
  • 同质性方差同质性:误差项在自变量的所有值上都相同的情况。

回归分析主要用于两个不同的目的。一是广泛用于预测预测,与机器学习领域重叠。其次,它还用于推断自变量和因变量之间的因果关系

2.回归和分类的区别

回归和分类都是有监督的学习方法,也就是说它们使用带标签的训练数据来训练自己的模型,进行预测。因此,在机器学习中,这两项任务通常被归为同一组。

它们之间的主要区别是输出变量。在回归中,输出是数字或连续的,而在分类中,输出是分类的或离散的。这定义了分类和回归评估预测的方式:

  • 分类预测可以使用准确性进行评估,而回归预测则不能。
  • 回归预测可以使用均方根误差进行评估,而分类预测则不能。

下面的环节在训练分类和回归模型的时候都收集了一些损失函数。

分类和回归算法之间有一些重叠;例如:

  • 分类算法可以预测连续值,但是该连续值是类别标签的概率形式。
  • 回归算法可以预测离散值,但是该离散值是整数形式的。

有些算法只需稍加修改即可用于分类和回归,如决策树和人工神经网络。对于这两种问题类型,其他一些算法更难以实现,例如用于回归预测建模的线性回归和用于分类预测建模的逻辑回归[ 1 ]。

3.回归的类型

数据科学和机器学习中使用了各种类型的回归。每种类型在不同的情况下都有自己的重要性,但核心是,所有的回归方法都分析自变量对因变量的影响。这里我们提到一些重要的回归类型:

  1. 线性回归
  2. 多项式回归
  3. 支持向量回归
  4. 决策树回归
  5. 随机森林回归
  6. 岭回归
  7. 套索回归
  8. 逻辑回归

详细解释每一个都需要几篇文章,因此,如果读者对回归变量的进一步信息感兴趣,我推荐阅读[ 234 ]。

4.如何选择正确的回归模型?

在我看来,这是最困难的任务,不仅在回归方面,而且在一般的机器学习方面。

尽管我认为经验可能是这个问题的正确答案,一些建议是:

  1. 线性模型是最常见和最简单的使用方法。如果你有一个连续的因变量,线性回归可能是你应该考虑的第一种类型。
  2. 如果因变量是连续的,并且您的模型具有共线性或许多自变量,您可以尝试,例如,岭或套索模型。您可以根据 R 方RMSE 选择最终型号。
  3. 如果您正在处理分类数据,可以尝试泊松、拟泊松和负二项式回归。
  4. 为了避免过度拟合,我们可以使用交叉验证方法来评估模型。脊、套索和弹性网回归技术可用于纠正过度拟合问题。
  5. 当你有一个非线性模型时,尝试支持向量回归。

5.线性模型

回归分析中最常见的模型是线性回归。这个模型通过拟合一个线性方程找到自变量和因变量之间的关系。拟合该回归线最常用的方法是使用最小二乘法,它计算出最佳拟合线,使每个数据点到该线的垂直偏差*方和最小。

建立线性回归模型只是工作的一半。为了在实践中实际可用,模型应符合线性回归的假设[ 78 ]:

  1. 参数呈线性。
  2. 样本在总体上具有代表性。
  3. 独立变量的测量没有误差。
  4. 观察值的数量必须大于自变量的数量。
  5. 独立变量中没有多重共线性
  6. 残差的*均值为零。
  7. 残差正态性
  8. 独立变量和残差是不相关的
  9. 残差的同方差性(残差的方差在整个观测中是常数)
  10. 残差无自相关(特别适用于时间序列数据)。数学上,误差的方差-协方差矩阵对角线

很难满足所有这些假设,因此从业者开发了各种各样的方法来在现实世界中保持一些或所有这些理想的属性。下面的文章[ 910 解释一些例子。

6.线性模型示例

为了展示之前介绍的一些概念,我们在加州住房数据集上实现了一个线性回归模型。下面是代码以及对每个块的简要说明。

首先,我们导入所需的库。

接下来,我们从scikit-learn库中加载住房数据:

dict_keys(['data', 'target', 'feature_names', 'DESCR'])

为了了解更多的特性,我们打印了california_housing_dataset.DESCR:

- MedInc        median income in block
- HouseAge      median house age in block
- AveRooms      average number of rooms
- AveBedrms     average number of bedrooms
- Population    block population
- AveOccup      average house occupancy
- Latitude      house block latitude
- Longitude     house block longitude

这是八个独立变量,基于它们我们可以预测房子的价值。房子的价格由变量AveHouseVal表示,它定义了我们的因变量。

我们现在使用pd.DataFrame将数据加载到 pandas 数据帧中。

数据预处理

加载数据后,最好查看数据中是否有任何缺失值。我们使用isnull()计算每个要素缺失值的数量(本数据集没有缺失值)。

探索性数据分析

让我们首先根据LatitudeLongitude绘制目标变量AveHouseVal的分布。该图像应该是美国加利福尼亚州的绘图。据观察,靠*海边的房子比其他地方要贵。

接下来,我们创建一个相关矩阵来度量变量之间的线性关系。

观察结果:

  • 为了拟合线性回归模型,我们选择那些与我们的因变量AveHouseVal高度相关的特征。通过查看相关矩阵,我们可以看到MediaIncAverageHouseVal (0.69)有很强的正相关性。另外两个相关性最高的变量是HouseAveAveRooms
  • 为线性回归模型选择要素时,重要的一点是检查多重共线性。例如,特征LatitudeLongitude具有 0.92 的相关性,所以我们不应该在我们的回归模型中同时包括它们。由于变量MediaIncHouseAveAveRooms之间的相关性不高,我们考虑将这三个变量用于我们的回归模型。

训练和测试模型

我们使用 scikit-learn 的LinearRegression在训练集和测试集上训练我们的模型。

残差的分布:

让我们打印残差的分布,以验证线性模型的假设。

假设的验证:

  1. 线性输入参数(正常)
  2. 样本代表总体人口(假设)
  3. 自变量被无误差地测量(假设)
  4. 观察值的数量必须大于独立变量的数量(好的)
  5. 独立变量内无多重共线性(适用于研究变量)
  6. 残差的*均值为零(好的)
  7. 残差的正态性(
  8. 独立变量和残差不相关(未检查)
  9. 残差的同方差性(残差的方差在整个观测中是常数)()
  10. 残差无自相关(特别适用于时间序列数据)。数学上,误差的方差-协方差矩阵对角线 ( 未检查)

在研究这个数据集时,线性回归模型不是最好的模型,所以我们将在以后的文章中探讨其他模型。

作为提示,这里有一个关于如何继续的好的链接:

残差和异方差的非正态性的一个大问题是,模型中的误差量在观测数据的整个范围内并不一致。这意味着他们的预测能力在整个因变量范围内是不一样的。转换因变量有助于纠正这一点,但会给解释带来困难。如果*方根变换没有完全归一化您的数据,您还可以尝试逆变换。转换的强度趋向于从 1。对数,2。*方根,3。反向(1/x)。

7.其他回归分析示例

如果读者感兴趣,我建议尝试以下数据集:

关于波士顿住房数据集,我推荐阅读这篇其他文章

此外,在这个网络链接中,有一些主题相关的数据集的集合,这些数据集适用于不同类型的回归分析。

最后,许多数据集可以在以下位置找到:

感谢您的阅读!!

如果你喜欢这个帖子,请考虑 订阅 。你将获得我所有的内容+所有其他来自牛逼创作者的文章!

参考

[1]机器学习精通,机器学习中分类和回归的区别

[2] Analytics Vidhya,你应该知道的 7 个回归技巧!

[3] ListenData,数据科学中的 15 种回归类型

[4]Java point,机器学习中的回归分析

[5] ListenData,如何选择正确的回归模型?

[6]吉姆统计,选择回归分析的正确类型

[7] R 统计,线性回归的假设

[8]科罗拉多大学,线性模型假设和诊断

[9]中等,线性回归及其假设

[10]中等,如何解决你的下一个回归问题

回归分析简介[使用 Excel]

原文:https://towardsdatascience.com/introduction-to-regression-analysis-using-excel-398ae1c3d604?source=collection_archive---------45-----------------------

简单和多元线性回归介绍。使用 Excel 的数据分析工具库实现和构建预测模型。

不熟悉 Python 或者 R 之类的工具?

完全没问题!您仍然可以使用 Excel 执行回归分析。而且你不需要有任何编程知识来做到这一点。

在数据分析方面,Excel 无疑是一个非常强大的工具。您可以进行数据清理,使用数据透视表进行分析,设计视觉效果等等。

如果你想了解更多关于使用 Excel 进行数据分析的知识,这里有一些很好的资源可以参考。

数据清理:清理 Excel 电子表格数据的 10 种超级简洁的方法

数据分析:【Excel 数据分析介绍

相当惊人吧!

但是等等。还有呢!

Excel 有一个名为“数据分析工具库”的加载项,允许您执行各种统计操作,包括只需单击一个按钮的回归。

既然我们已经谈了足够多的 Excel,让我们继续回归。

什么是回归?

我是简单的术语;回归是确定因变量和一组自变量之间关系的过程。

考虑下面的例子:

下表显示了电视广告费用与相应销售收入之间的关系。

如果你需要找到两个变量之间的关系,最简单的方法就是画一个散点图,就像这样。

观察这个情节,我们可以说花在电视上的广告和销售收入之间存在正相关关系。

这是正相关的迹象。

现在,假设我们需要量化这种关系。你会怎么做?

同样,这很简单。只要画一条最符合散点图中显示的所有点的线,线方程就会给你变量之间的关系。

Sales = 0.0555*(TV) + 6.9748

这是回归的基本思想。它是通过用一个函数拟合所有的点来量化变量之间的关系。

用于确定最佳拟合线的方法超出了本文的范围。但是如果你感兴趣,这是通过一种叫做普通最小二乘法的技术完成的。

我们刚刚看到的例子叫做简单线性回归,它只涉及一个独立变量或特征(电视广告成本)。

但同样的回归概念可以扩展到多个自变量或特征,称为多元线性回归

例如,看看这张表。

这里,我们有花费在电视、广播和报纸上的广告费用以及相应的销售收入。

我们不能在 2D *面上显示这种关系,但是线性回归的概念仍然可以用来确定所有这些点的最佳拟合函数。

并且该函数将具有以下形式:

Sales = 0.0544*(TV) + 0.1070*(Radio) + 0.0003*(Newspaper) + 4.6251

这就是回归背后的基本思想。

现在让我们看看如何使用 Excel 实现回归。

第一步是添加数据分析工具库

添加数据分析工具库

默认情况下,数据分析工具库不可用,您需要单独激活外接程序。

要激活,进入文件- >选项- >插件,然后激活分析工具箱。一旦你激活了插件,它应该出现在工具栏的数据标签下。

一旦您添加了数据分析工具库并下载了 Excel 文件中的数据,请进入下一步。

执行回归

要执行回归,请转到数据分析工具,并从可用选项中选择回归。选择回归后,应该会出现以下窗口。

在输入 Y 范围中输入因变量范围,在输入 X 范围中输入自变量范围。然后按,确定。

您已经成功地完成了使用 Excel 执行回归!

现在让我们看看如何解释结果。

解释结果

一旦您执行了回归,您的结果页面应该看起来像这样。

如果你看一下第三个表,有第一列名为系数。该列给出多元线性回归方程中每个变量的系数值。

Sales = 0.0544*(TV) + 0.1070*(Radio) + 0.0003*(Newspaper) + 4.6251

表中计算的其他度量用于比较性能、统计显著性和其他因素。这些度量需要对统计学有很好的理解,因此我在这篇介绍性文章中没有讨论所有这些。

一旦你执行了回归,你可以做两件事。

  1. 分析变量之间的关系
  2. 建立预测模型

既然我们已经讨论了分析变量之间的关系,那么让我们来看看如何建立一个预测模型。

构建预测模型

预测模型只不过是通过提供自变量的值来预测因变量的值的过程。

同样,我们的多元线性回归方程是预测模型函数,如果我们输入自变量的值,我们就可以获得销售额的预测值。

例如,如果您想预测以下广告支出组合的销售收入,

电视= 100

无线电= 200

报纸= 500

将这些值输入多元线性回归方程。这将给你 31.6377 的销售收入,这是预测的收入。

结论

我希望你已经很好地理解了什么是回归,使用 Excel 实现,分析关系和建立预测模型。

当然,这只是回归的介绍,一旦你熟悉了本文中的基础知识,你还可以探索许多其他的概念。

你可以在这里下载包含本文中的数据和步骤的 excel 文件。

初学者机器学习中的回归技术介绍。

原文:https://towardsdatascience.com/introduction-to-regression-techniques-in-machine-learning-for-beginners-2e5d3346d986?source=collection_archive---------52-----------------------

学习和实现机器学习的基础知识

Unsplash 上的 Roozbeh Eslami 拍摄的照片

当谈到机器学习时,应用程序是巨大的,但允许开发人员在一系列模型之间进行选择的各种方法和技术也是巨大的。然而,如果没有对各种可用的回归模型的全面理解,机器学习的基础是不完整的。本文的目标是为初学者和有抱负的爱好者提供在该领域探索和进步所需的技能和框架。欢迎来到未来的开端。

线性回归:cout < <《你好世界》;的数据

那么回归到底是什么?回归是一种统计工具,有助于识别和实现给定数据集的因变量和自变量之间的关系。然而,当谈到具体的线性回归时,我们考虑一个自变量和一个因变量之间的线性关系。我们将使用相对简单的数据集来理解这些概念。

y:因变量

x:独立变量

答:拦截

b:X 的常数

现在,上述方程是线性回归的数学表示,对于给定的一组数据,可以形成各种这样的回归线。然而,最佳拟合回归是最适合给定数据集的回归,并产生最佳的可能预测。

我们的数据集是什么?

我们的数据集构成了任何给定模型的预测基础,并且必须为我们的预测提供准确的反映。对于任何可用于实现机器学习模型的数据集,必须对其进行清理和排序。本文将描述各种这样的数据处理方法。

上面提供的数据集显示了提供个人 SAT 分数和 GPA 的数据,从而为我们提供了线性回归应用的理想场景。快照仅包含 10 个数据点,然而,实际数据集包含 84 个数据点。

让我们开始编码

导入库

我们将使用 python 作为我们的主要语言进行编码,要实现这些模型,我们的第一步应该是导入所有必需的库,在这种情况下。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

NumPy :增加了对大型多维数组和矩阵的支持。

pandas :它提供数据结构和操作,用于操纵数值表和时间序列。

matplotlib :是一个用于图形化表示的库。

导入数据集

dataset = pd.read_csv('data.csv')x = dataset.iloc[:,:-1].valuesy = dataset.iloc[:,-1].values

接下来,我们使用“pd.read_csv”导入给定的数据集,并将其存储在一个变量中。使变量尽可能不言自明是有益的。
最后,我们必须将自变量分配给变量 x,将因变量分配给变量 y,我们通过使用。iloc”方法为实现选择相应的列。

分割数据集

将数据集分成两部分——训练集和测试集。训练集用于训练您的模型,并使其从数据集“学习”,而测试数据集将允许我们测试我们训练的模型并检查其准确性。

sklearn 库用于各种数据处理功能。我们用这个库把我们的因变量(x)和自变量(y)分成各自的测试集和训练集。

from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x,y , test_size = 0.2, random_state=0)

神奇发生在哪里:训练你的第一个机器学习模型

接下来,我们再次使用我们的 sklearn 库,通过数据集的训练集分区来训练我们的模型。我们以回归变量的名称创建一个对象,并用它来调用线性回归。

from sklearn.linear_model import LinearRegressionregressor = LinearRegression()regressor.fit(x_train,y_train)

我们的预测是什么?

y_pred = regressor.predict(x_test)
print(y_pred)

我们简单地使用上面的命令来为我们训练的“x_train”模型预测“x_test”。

长什么样?

现在,我们必须可视化我们的结果,以了解我们的回归线如何匹配我们的数据点。我们使用 Matplotlib 来做这件事。

plt.scatter(x_train,y_train, color = 'red')plt.plot(x_train,regressor.predict(x_train) , color='blue')plt.title('salary vs experience(Training set')plt.xlabel('years of experience')plt.ylabel('saslary')plt.show()

多变量回归

我们随后的回归模型将处理多个变量,这是机器学习中的一个重要里程碑,因为各种结果取决于不止一个独立变量。多变量回归是通向大量此类应用的大门。

让我们考虑一个将用于所有后续模型的数据集。

与之前的数据集相比,我们当前的数据集看起来要复杂得多。这是因为有大量的列作为影响我们结果的多变量因素。

from sklearn.linear_model import LinearRegressionregressor = LinearRegression()regressor.fit(X_train, y_train)

我们将使用 sklearn 导入我们的模型,并在我们的 X_train 和 y_train 数据分区上实现它。

预测我们的结果

这一次,我们将预测模型的实际结果,我们将通过实现以下代码行来做到这一点。

y_pred = regressor.predict(X_test)np.set_printoptions(precision=2)print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))

我们使用 regressor 对象调用 X_test 分区上的 predict 方法,然后使用后续代码行同时打印 y_pred 和 y_test。这有助于我们比较预测值和期望值。

最后的话

上面的文章是对数据世界的简要介绍,它基于使用数据作为一个强大的工具来进行准确预测的想法。我将写各种其他的回归和分类模型,以及它们在这个基础上的应用。敬请关注。

};

强化学习中的后悔介绍

原文:https://towardsdatascience.com/introduction-to-regret-in-reinforcement-learning-f5b4a28953cd?source=collection_archive---------17-----------------------

有时候后悔是改善的好方法

照片由 Unsplash 上免费使用声音

更新:学习和练习强化学习的最好方式是去http://rl-lab.com

“最终,我们只后悔没有抓住机会”
刘易斯·卡罗尔

介绍

几乎可以肯定的是,每个人一生中都有后悔的事情(实际上是很多事情)。后悔没有在价格还能承受的时候买票,后悔没有做出职业决定,后悔个人或社会的举动,等等……当然,后悔是有苦味的,尽管它可能具有教育意义,但现实是机会往往会失去,并且没有回头路。

但在训练机器或算法时,情况可能就不一样了。

遗憾

你最后悔的行动是本应该(更有可能)使用或采取的行动。所以采取这个行动的概率和你后悔没采取行动的程度成正比。

从数学上来说,后悔被表达为一个可能的行动的回报(奖励或回报)和已经实际采取的行动的回报之间的差异。如果我们将收益函数表示为 u ,则公式变为:

后悔= u(可能的行动)- u(采取的行动)

显然,我们感兴趣的是''可能行动的收益胜过' 采取行动 '的收益的情况,所以我们考虑积极的遗憾,忽略零和消极的遗憾。

如前所述,使用一个行为而不是实际使用的行为的概率与它产生的遗憾成正比。

例如,如果我们采取行动 a1,得到 u(a1) = 1,那么我们计算出 u(a2)= 2,u(a3) = 4,u(a4) = 7。相应的后悔将是后悔(a2) = u(a2) - u(a1) = 1,后悔(a3) = 3,后悔(a4) = 6。
总遗憾是遗憾(a1) +遗憾(a2) +遗憾(a3) +遗憾(a4) = 0 + 1 + 3 + 6 = 10。

很容易看出最后悔的动作是 a4。为了在数字上反映这一点,我们更新了我们的策略,表示为σ,例如σ(a2) = 1/10 = .1,σ(a3) = 3/10 = .3,σ(a4) = 6/10 = .6。

显然,你可能会问,为什么不显式地给动作 a4 一个概率 1 (σ(a4) = 1)?仅仅是因为当面对另一个演员时,比如在游戏中,后悔的概念被使用。在游戏中以确定性的方式进行游戏会给你的对手一个反击你的策略并赢得胜利的机会。

石头剪刀布示例

考虑一个石头剪刀布 (RPS)的游戏,其点数系统如下:

  • 损失-1 分
  • 抽签(两个相同类型的项目)的结果是 0 分
  • 赢给获胜者 1 分

石头剪刀布游戏的支付格

下表给出了玩这个游戏的不同组合,以及结果和如何改进策略。

表格的第一部分(实际游戏)显示了你与对手的比赛,以及每集的“Y 我们的结果”。“迭代”列是针对 ex: R 对 R,或 S 对 P 等的相同组合发生的发作次数

第二部分(你的其他游戏场景)包含假设对手以同样的方式玩游戏,你为了提高(或不提高)你的结果可以玩的场景。它也显示了没有玩一个给定动作的遗憾。
积云遗憾列包含累计遗憾,累计遗憾是遗憾的总和。

对累积遗憾的需求源于这样一个事实,即独立计算遗憾,并不能捕捉到在其他游戏或剧集中发生的事情。这意味着算法没有从它的经验中学习。

作为一个人,你在记忆中保留你以前玩过的游戏,以及如何利用这些过去的经验。但是为了让一个算法做同样的事情,应该有一个考虑到以前发生过的事情的计算。

第三部分(策略调整),计算每个动作(石头、布、剪刀)的概率,以最大化你的结果,总是假设对手以同样的方式玩。

这些概率被计算为 (对行动的累积后悔)/总后悔 。其中总遗憾是同一行的正累积遗憾的总和。如果总遗憾为零,我们为每个行动分配相等的概率(检查第二行)。

上表第一行,你打了 R,对手打了 R,所以结果是*局(0)。如果你出了 P 而对手出了 R 那就更好了,所以你的后悔是 1 没出 P
策略调整说明你不后悔石头,也不后悔剪刀但是你后悔没用纸。
第二排,你用 R 对 S 获胜,策略调整部分显示 2 局后,你没有遗憾。

随着情节的继续,我们看到策略的变化达到了*衡,每个动作应该用 1/3。
PS。这是 RPS 中的最佳策略,因为它使所有 3 个动作的概率相等,因此移动是对手不可预测的。

极端情况

现在,如果一个场景比其他场景播放得多会发生什么?
例如,在下表中,S 对 S 这一集发生了 1000 次,结果是 1000 次*局。这导致在这些情况下后悔 1000,并且策略转向 100%的时间使用石头。

在下面的例子中,P 对 S 发生了 1000 次,导致 1000 次损失,2000 次后悔没有用石头,1000 次后悔没有用剪刀。
因此,该策略被调整为 67%的时间使用石头,33%的时间使用剪刀。

但是,下面的例子中有一个陷阱,R vs S 出现 1000 次,结果是千胜万败,无怨无悔。因为没有遗憾,所以算法不更新策略。

密码

下面是 Google Colab 书籍的链接,其中包含一个简单的后悔算法的代码。
重要提示:为了运行或编辑代码,你需要复制一本书。

* [## 简单 RPS 示例

colab.research.google.com](https://colab.research.google.com/drive/1FB57Jfi1llITSL6DUyUr_9P7lsXmOP-8#scrollTo=_9p-AnRTy8rI)

自娱自乐后悔

到目前为止,我们假设对手一直以同样的方式玩,使用同样的策略。然而,这不可能是真的!任何对手最终都会发现你策略中的任何偏差,并加以利用。

所以训练不能针对固定的策略。为了补救这种情况,我们使用自我游戏。Self Play 不是训练一个演员对抗一个固定的策略,而是训练所有演员互相对抗。这是通过“复制”第一个演员所做的序列,并将其应用于其他演员来完成的。因此,每个演员现在都维护自己的数据结构,其中包含自己的策略、遗憾等。在每一集之后,每个演员都从自己的角度计算结果,以及可以(可能)做些什么来改善结果。

密码

下面的链接指向一个 Google Colab 书籍,它实现了一个简单的后悔自我游戏。

重要提示:为了运行或编辑代码,你需要复制一本书。

[## RPS 自我游戏示例

colab.research.google.com](https://colab.research.google.com/drive/1FB57Jfi1llITSL6DUyUr_9P7lsXmOP-8#scrollTo=-ej-kJVb8j0y)

有趣的是,我们注意到,无论两个参与者从什么策略开始,他们都收敛到 RPS 游戏的最佳策略,即每个动作的概率都是 1/3。这确保了所有行动的可能性相等,并防止任何可能被对手利用的偏差。

结论

本文介绍了简单直观的后悔技巧。它允许玩家通过跟踪过去游戏的遗憾来达到*衡游戏,使未来游戏与积极的遗憾成比例。这项技术是更精细的技术的基础,比如反事实后悔最小化(CFR)和深度 CFR。*

强化学习简介

原文:https://towardsdatascience.com/introduction-to-reinforcement-learning-c99c8c0720ef?source=collection_archive---------36-----------------------

经典强化学习算法的高级结构概述

图片来自https://unsplash.com/photos/iar-afB0QQw

强化学习(RL)是机器学习的一个不断发展的子集,也是人工智能的一个最重要的前沿领域,因为它在过去几年里随着机器人、游戏和其他许多领域的大量成功应用而获得了极大的普及。它表示一组处理顺序决策的算法,并且能够根据本地环境做出智能决策。

RL 算法可以被描述为一种模型,该模型向代理指示它应该在封闭环境中采取哪组动作,以便最大化预定义的整体回报。一般来说,代理人尝试不同的行动,评估获得的总回报。经过多次尝试后,该算法会学习哪些行为会带来更大的回报,并建立一种行为模式。由于这一点,它能够告诉代理在每种情况下采取哪些行动。

RL 的目标是捕捉更复杂的结构,并使用比经典机器学习更具适应性的算法,事实上,与经典机器学习算法相比,RL 算法在行为上更加动态。

应用程序

让我们看看一些基于 RL 的应用示例:

  • 机器人 - RL 可用于高维控制问题,也可用于各种工业应用。
  • 文本挖掘 - RL 和一个文本生成模型,可以用来开发一个系统,这个系统能够生成长文本的高度可读的摘要。
  • 交易执行 -金融行业的主要公司使用 RL 算法来改进他们的交易策略。
  • 医疗保健 - RL 可用于药物剂量,以及优化慢性临床试验患者的治疗等。
  • 游戏——RL 因作为用于解决不同游戏和实现超人性能的主要算法而闻名。

演员

RL 算法基于马尔可夫决策过程(MDP)。马尔可夫决策过程是一种特殊的随机时间控制决策过程。RL 算法的主要参与者是:

  • 代理:在环境中执行动作以优化长期回报的实体;
  • 环境:代理人做决策的场景;
  • 状态集 ( S ):环境所有可能状态的集合,状态描述环境的当前状况;
  • 动作集合 ( A ):代理可以执行的所有可能动作 A 的集合;
  • 状态转移模型 P(s0 | s,a) :描述对于每个状态 ss0和动作 a ,当 agent 在状态 s 执行动作 a 时,环境状态在s0发生变化的概率;
  • 奖励(r = R(s,a)) :指示在状态 s 采取行动 a 的即时实际价值奖励的函数;
  • 插曲(rollout) :从 0 到最终值 L 变化的 t 的一系列状态 st 和动作 at(称为视界,最终可以是无限的);代理在其环境的给定状态下启动;在每个时间步 t 处,代理观察当前状态 s_t ∈ S 并因此采取行动A _ t∈A;根据状态转换模型,状态演变成新的状态 s_(t+1) ,其仅取决于状态 s_t 和动作a _ t;代理获得奖励r _ t;然后代理观察到新的状态S(t+1)∈S,循环重新开始;

作者图片

  • 策略功能:策略可以是确定性的( π (s) )或随机的( (a|s) ):确定性策略π (s)表示当环境处于状态 s ( a = π (s) )时代理执行的动作 a;随机策略 π (a|s) 是描述当环境处于状态 s 时代理执行动作 a 的概率的函数。一旦指定了策略,新的状态只依赖于策略和状态事务模型;
  • Return G_t :根据当前时间步和后续每个时间步的即时奖励,以及折扣因子γ < 1,每集结束时获得的带折扣的总长期奖励:

  • 价值函数 V(s) :从状态 s 开始,在当前时间步长 t 的一集结束时的预期长期回报:

  • Q-Value 或 Action-Value function Q(s,a) :从当前时间步的状态 s 开始,执行动作 a 的一集结束时的预期长期收益;
  • 贝尔曼方程:大部分 RL 算法中的理论核心;根据它,当前价值函数等于当前报酬加上在下一步评估的自身,并折现γ(我们回忆一下,在方程中 P 是模型转换模型):

最优策略

随着策略的改变,动作值函数的最大值被称为最优动作值函数 Q(s,a)* ,并且根据贝尔曼方程由下式给出

那么最优策略 π(s)* 由最大化动作值函数的动作给出:

问题是,在大多数实际情况下,状态转移模型和报酬函数是未知的,因此有必要从采样中学习它们,以便估计最佳行动值函数和最佳策略。由于这些原因,使用 RL 算法,以便在环境中采取行动,观察和学习模型的动态,估计最优值函数和最优策略,并提高回报。

勘探开发困境

探索是对新数据点的训练,而开发是对以前获取的数据的使用。如果我们在每次迭代中不断寻找最佳行动,我们可能会停留在有限的一组状态中,而无法探索整个环境。为了摆脱这个次优集合,通常使用一种叫做ϵ-greedy:的策略,当我们选择最佳行动时,选择随机行动的ϵ概率很小。

方法

当我们实现一个 RL 算法时,我们可以使用 3 种主要的方法:

  • 基于价值的方法- 基于价值的算法通过不断改进其估计值来逼*最优价值函数或最优行动价值函数。通常值函数或动作值函数是随机初始化的,然后不断更新直到收敛。基于值的算法保证收敛到最优值。
  • 基于策略的方法- 基于策略的算法寻找一个策略,使得在每个状态下执行的动作是最优的,以在未来获得最大的回报。它在每一步重新定义策略,并根据这个新策略计算值函数,直到策略收敛。基于策略的方法也保证收敛到最优策略,并且通常比基于值的算法花费更少的迭代来收敛。
  • 基于模型的方法- 基于模型的算法从原始环境开始学习虚拟模型,代理学习如何在虚拟模型中执行。它在学习阶段使用减少数量的与真实环境的交互,然后基于这些交互建立新的模型,使用该模型模拟进一步的情节,并获得虚拟模型返回的结果。

基于价值的方法

价值函数逼*

价值函数逼*是最经典的价值方法之一。其目标是通过迭代逼*最优行动值函数 Q(s,a)* 来估计最优策略 π(s)* 。我们开始考虑一个参数动作值函数 Q^(s,a,w) ,其中 w 是一个参数向量。我们随机初始化向量 w 并迭代每集的每一步。对于每次迭代,给定状态 s 和动作 a ,我们观察奖励 R(s,a) 和新状态s’。根据获得的回报,我们使用梯度下降更新参数:

等式中,α是学习率。可以证明这个过程是收敛的,得到的作用值函数就是我们对最优作用值函数的逼*。在大多数实际情况下,参数动作值函数 Q^(s,a,w) 的更好选择是神经网络,然后参数矢量 w 由神经网络的权重矢量给出。

值函数逼*算法:

深度 Q-网络

深度 q 网络是深度学习和 RL 的组合,因为它是值函数*似算法,其中参数动作值函数 Q^(s,a,w) 是深度神经网络,特别是卷积神经网络。此外,深度 Q 网络主要使用两种技术来克服不稳定学习

  • 目标网络- 模型更新可能非常不稳定,因为每次模型更新自身时,真实的目标都会改变。解决方案是创建一个目标网络 Q^(s',a',w') ,它是训练模型的副本,更新频率较低,例如每千步更新一次(我们将目标网络的权重表示为w’)。在使用梯度下降的每个模型更新中,目标网络代替模型本身用作目标:

  • 体验回放- 在所描述的算法中,使用来自同一集的数据执行若干连续更新,这可能导致过拟合。为了解决这个问题,创建了一个经验重放缓冲区,存储所有不同剧集的四元组( sars’),并在每次模型更新时随机选择一批元组。这种解决方案有 3 个优点:减少过度拟合,用小批量提高学习速度,重用过去的元组以避免遗忘。

拟合 Q 迭代

另一种流行的基于值的算法是拟合 Q 迭代。考虑确定性的情况,在这种情况下,根据某个函数 f,,新状态s’由状态 s 和动作 a 唯一确定,那么我们可以写出s’= f(s,a) 。设 L 为地*线,可能是无限的,我们回忆地*线是所有剧集的长度。该算法的目标是估计最佳动作值函数。根据贝尔曼方程,最佳动作值函数 Q(s,a)* 可以看作是一个算子 H 对动作值函数 Q(s,a) 的应用:

现在考虑时间范围 N 小于或等于时间范围 L ,并且由 Q_N (s,a) 表示通过将刚刚定义的算子 H 应用于动作值函数Q _(n1)(s,a) 而定义的在 N 步上的动作值函数,其中

可以表明,这个序列的N-阶跃动作值函数 Q_N (s,a) 收敛到最优动作值函数 Q(s,a)* 为 N → L 。由于这一点,有可能建立一种算法来逼*最优动作值函数 Q(s,a)* ,在 N 上迭代。

拟合 Q 迭代算法:

Fitted Q 迭代的完整实现可以在 GitHub
(https://github.com/teopir/ifqi)上找到。

拟合 Q 迭代应用示例:山上的汽车

考虑一辆由点质量建模的汽车,它以如下形式在山上行驶:

作者图片

控制问题的目标是在最短的时间内将汽车带到山顶,同时防止汽车的位置 p 变得小于 -1 并且其速度 v 超出区间 [-3,3】。在位置 p = 1 到达山顶。

状态空间- 这个问题有一个二维(汽车的位置 p 和速度 v )的(连续)状态空间,我们希望位置的绝对值小于等于 1 ,速度的绝对值小于等于 3 :

每隔一个位置和速度的组合被认为是一个终端状态。

动作空间- 动作 a 直接作用于汽车的加速度,并且
只能假设两个极值(全加速( a = 4)或全减速( a -4 ))。因此,动作空间是由集合给出的

系统动力学- 时间离散化为 0.1 秒的时间步长。给定时间步长 t 处的状态( pv )和动作 a ,我们能够计算时间步长 t + 1 处的状态( pv ),用数值方法求解与描述系统动态的位置和速度相关的两个微分方程:

当然,为了我们的目的,理解这些方程的含义并不重要,重要的是理解在时间步长 t 的给定状态和动作,时间步长 t + 1 的状态是唯一确定的。

奖励函数- 奖励函数 r(s,a) 通过以下表达式定义:

如果位置小于 -1 或者速度的绝对值大于 3 因为我们到达了终止状态但是没有到达山顶,奖励是-1;如果位置大于 1 并且速度的绝对值小于 3,奖励是 1 ,因为我们到达了遵守速度限制的山顶;否则奖励为 0

折扣因子- 衰减因子γ被选择为等于 0.95。

初始点 -开始时,汽车停在山脚下( pv ) = ( 0.50 )。

回归器- 使用的回归器是一个额外的树回归器。

N = 150 执行拟合的 q 迭代,结果是对于 N > 20 动作值函数 Q^_N (s,a)和 Q^_(N+1)(s,a) (对( pv )的所有组合计算)之间的均方误差迅速减小到 0 为此,使用动作状态函数 Q^_20(s,a) 研究结果。

左图中我们可以看到根据动作值函数 Q^_20(s,a)
( pv )的每种组合选择的动作(红色区域代表减速,绿色区域代表加速,蓝色区域代表减速和加速的动作值相等)。

根据动作值函数 Q^_20(s,a) 的最佳轨迹如右图所示。

作者图片

策略值方法

政策梯度

政策梯度是最经典的基于政策的方法。策略梯度法的目标是在参数化策略 π (a|s,θ) 下,找到使价值函数 V (s,θ) 最大化的参数矢量 θ

我们开始考虑一个参数策略 π (a|s,θ) 关于参数向量 θ 可微;特别地,在这种情况下,我们选择随机策略(在这种情况下,该方法被称为随机策略梯度,然而,确定性策略的情况非常类似)。

我们随机初始化向量 w 并在每一集迭代。对于每个时间步长 t ,我们生成一个三元组序列( sar ),根据参数策略 π (a|s,θ) 选择动作。对于结果序列中的每个时间步,我们计算总的长期奖励,并根据所获得的奖励计算折扣 G_t :

然后,使用梯度更新过程来修改参数向量 θ_t

在等式中,α > 0 是学习率。

可以证明这个过程是收敛的,得到的过程就是我们的*似最优策略。

策略梯度算法:

参数策略的示例

最常用的参数策略是 Softmax 策略和高斯策略

Softmax 策略
Softmax 策略由一个 soft max 函数组成,该函数将输出转换为概率的
分布,主要用于离散动作的情况:

在这种情况下,梯度更新的显式公式由下式给出

其中 φ(s,a) 是与状态和动作相关的特征向量。

高斯策略
高斯策略用于连续动作空间的情况,由高斯函数给出

其中 (s) 由φ(s) T θ给出, φ(s,a)为特征向量, σ 可以是固定的,也可以是参数化的。在这种情况下,我们还有梯度更新的显式公式:

政策梯度的利与弊

优点

  • 与基于价值的
    方法相比,政策梯度方法是一个更简单的流程。
  • 它允许动作相对于状态是连续的。
  • 相对于其他方法,它通常具有更好的收敛特性。
  • 当动作和状态集很大时,它避免了存储器使用和计算时间的增长,因为目标是学习一组参数,其大小远小于状态集和动作集的大小。
  • 它可以学习随机政策。
  • 它允许使用ϵ-greedy 方法,这样代理人可以有一个采取随机行动的概率ϵ。

缺点

  • 策略梯度方法通常收敛于局部最优,而不是全局最优。
  • 它通常具有很高的方差(但是可以通过一些技术来降低)。

政策梯度应用示例:CartPole

CartPole 是一种游戏,其中一根杆子通过一个未驱动的关节连接到一辆沿着无摩擦轨道移动的车上。杆子开始直立。

作者图片

目标是通过增加和减少小车的速度来防止杆子倒下。

状态空间- 单个状态由 4 个元素组成:

  • 推车位置
  • 推车速度
  • 磁极角度
  • 极点角速度

当杆子落下时游戏结束,也就是杆子角度超过 12 ,或者推车位置到达显示器边缘。

行动空间- 代理只能采取两种行动:

  • 向左移动杆子
  • 向右移动杆子

奖励- 每采取一个步骤(包括终止步骤),奖励增加 1 。这显然是因为我们希望实现尽可能多的步骤。

使用 Softmax 策略的梯度策略方法解决问题,折扣因子 γ = 0.95 ,学习率 α = 0.1 。对于每一集,最大迭代次数为 1000 次。

在大约 60 个时期(其中 1 个时期等于 20 个连续的情节)之后,代理学习一个策略,由于这个策略,我们获得了等于 1000 的奖励,这意味着在该情节的所有 1000 个步骤中杆子都没有落下。

在这些图中,我们可以看到动作的选择是如何随杆角度和小车速度(左图)以及杆角速度和小车速度(右图)而变化的。红色区域是选择向左移动动作的地方,绿色区域是选择向右移动动作的地方,黄色区域是选择一个动作或另一个动作的概率相似的地方。

作者图片

一个很有意思的结果是,如果 γ 大于 0.9,单集奖励随着历元数增长,达到最大值 1000,而如果 γ 小于 0.9,经过一些历元后,单集奖励停止增长。这意味着,在这个问题中,下一步的奖励对于找到最佳策略非常重要,这实际上是合理的,因为学习如何防止杆子落下的基本信息是知道在每一集里它落下了多少步。

在 GitHub 上,可以找到这个例子的许多不同的实现。

演员-评论家方法

另一种流行的基于政策的方法是演员批评法。它不同于策略梯度方法,因为它同时估计策略和值函数,并更新两者。

在政策梯度中,参数向量 θ 使用长期报酬 G_t 进行更新,但这种估计通常具有较高的方差。为了解决这个问题并减少结果的巨大变化,演员-评论家方法的思想是从总报酬中减去折扣 G_t 基线 b(s)

所获得的值 δ = Gt - b(s) ,即所谓的时间差分误差,用于更新参数矢量 θ 来代替长期报酬 G_t 。基线可以有几种形式,但最常用的是价值函数 V(s) 的估计。

如同在基于值的方法中,值函数 V(s) 可以用神经网络学习,其输出是*似值函数 V^(s,w) ,其中 w 是权重向量。然后,在每次迭代中,时间差误差 δ 不仅用于调整参数矢量 θ ,还用于更新权重矢量 w

这种方法被称为演员-评论家方法,因为:

  • 评论家估计价值函数 V(s)
  • 参与者按照评论家建议的方向更新策略分布(如在策略梯度方法中)。

演员-评论家算法:

基于模型的方法

如已经强调的,基于模型的方法从原始环境开始创建虚拟模型,并且代理学习如何在虚拟模型中执行。基于模型的方法开始考虑基本参数模型,然后运行以下 3 个步骤:

  1. Acting :基础策略 π_0(a_t|s_t) 用于选择在真实环境中执行的动作,以收集三元组(state、action、new state)给出的一组观察值;
  2. 模型学习:从收集的经验中,推导出新的模型 m(s,a) ,以使模型新状态与真实新状态之间的最小二乘误差最小;可以使用监督学习算法来训练模型,以最小化来自采样轨迹的最小*方误差;
  3. 规划:根据新的模型更新价值函数和策略,以便在下一次迭代中用于选择要在真实环境中执行的动作。

最常用来表示系统动态的模型之一是高斯过程,其中预测使用高斯分布对观测值进行插值。另一种可能性是使用高斯混合模型,这是一种概率模型,它假设所有数据点都是从具有未知参数的有限数量的高斯分布的混合中生成的。这是对 k 的一种概括,意味着聚类包含了关于数据的协方差结构以及潜在高斯中心的信息。

基于模型的方法示例算法:

模型预测控制

模型预测控制是刚刚描述的方法的发展。所描述的基于模型的算法易受漂移的影响:小误差沿着轨迹快速积累,并且搜索空间太大,任何基本策略都无法覆盖全部。由于这个原因,轨迹可能到达模型还没有被学习的区域。如果没有围绕这些区域的适当模型,就不可能规划最佳控制。

为了解决这个问题,不是在开始时学习模型,而是在轨迹期间连续地执行模型的采样和拟合。然而,前面的方法在再次拟合模型之前执行所有计划的动作。

在模型预测控制中,整个轨迹被优化,但是仅执行第一个动作,然后新的三元组( sas’)被添加到观测值中,并且再次进行规划。这允许在再次观察到当前状态时采取纠正措施。对于随机模型来说,这尤其有用。

通过不断改变计划,MPC 不容易受到模型中问题的影响。新算法运行 5 个步骤,其中前 3 个与以前的算法相同(动作、模型学习、规划)。然后我们有:

  1. 演技
  2. 模型学习
  3. 策划
  4. 执行:执行第一个计划动作,观察结果状态s’
  5. 数据集更新:新的三元组( sas’)被追加到数据集;转到第 3 步,每隔 N 次转到第 2 步(正如已经看到的,这意味着规划在每一步都执行,并且模型在轨迹的每 N 步都被拟合)。

基于模型的方法的优点和缺点

基于模型的 RL 具有很强的优势,即在样本很少的情况下非常有效,因为许多模型至少在局部附*表现为线性。

一旦模型和回报函数已知,最优控制的规划就不需要额外的采样。通常,学习阶段是快速的,因为不需要等待环境响应,也不需要为了恢复学习而将环境重置到某个状态。

不利的一面是,如果模型不准确,我们可能会学到与现实完全不同的东西。另一点没有价值是,基于模型的算法仍然使用无模型的方法来构建模型或在计划和模拟阶段。

结论

本文是许多经典 RL 算法的高级结构概述。然而,令人遗憾的是,每个型号系列中都有很多我们没有涉及到的变体。例如,在深 Q 网络家族中,双深 Q 网络给出了非常有趣的结果。

RL 的主要挑战在于准备仿真环境和选择最合适的方法。这些方面高度依赖于要执行的任务,并且非常重要,因为许多现实世界的问题具有巨大的状态或动作空间,必须被有效和全面地表示。

其他主要任务是优化奖励以获得期望的结果,建立系统以使学习过程在合理的时间内收敛到最优,并避免过度适应和遗忘。

作者

我关于走向数据科学的文章:https://medium.com/@marcodelpra

我的 LinkedIn 个人资料:【https://www.linkedin.com/in/marco-del-pra-7179516/

领英集团 AI 学习:https://www.linkedin.com/groups/8974511/

参考

  1. 理查德·萨顿和安德鲁·巴尔托。强化学习:安
    简介
  2. 文森特·弗朗索瓦·拉韦特、彼得·亨德森、里亚沙特·伊斯兰、马克·g·贝勒马尔、乔埃勒·皮诺。深度强化学习简介。
  3. 达米恩·恩斯特,皮埃尔·格茨,路易斯·韦汉高。基于树的批处理模式
    强化学习
    。机器学习研究杂志 6(2005)
    503–556。
  4. https://github.com/openai/gym
  5. https://github.com/teopir/ifqi

不确定度校准和可靠性图表简介

原文:https://towardsdatascience.com/introduction-to-reliability-diagrams-for-probability-calibration-ed785b3f5d44?source=collection_archive---------10-----------------------

挑战不确定度校准的常见误解

不确定性校准是机器学习中最容易被误解的概念之一。这可以归结为一个简单的问题:“考虑到上述下雨的可能性,你带雨伞了吗?”

我们在日常生活中使用主观概率和不确定度校准的概念,却没有意识到它们。对于一个校准良好的不确定性天气预报模型来说,如果下雨的概率只有 5%,那么带伞大概是不划算的。从频率主义者的角度来看,如果可以在大量随机试验中反复观察到上图中早上 7 点的天气状况,那么只有 5%的天气会下雨。然而,另一方面,如果不确定性校准不当,很可能早上 7 点的随机试验中有 40%会以下雨告终——这是一个大惊喜。

什么是不确定度校准?

DeGroot 等人[1]以预测降雨为例来说明校准的概念。

校准的概念与预报员的预测和实际 观测到的降雨相对频率 之间的一致有关。笼统地说,如果一个预测者的预测是 x,那么他的长期相对频率也是 x,那么这个预测者就被称为校准良好的

换句话说,对于一个校准良好的模型,如果它预测一组图像有 40%的概率是猫,那么该组中包含的猫的频率应该等于 40%。“相对频率”有时被称为“条件概率”,可以理解为 cat 的概率,即,以预测概率为 40%为条件的阳性结果。

Dawid [1]提出了类似的程序,如下所示。

将预测与现实进行比较的一种方法是挑选一些相当任意的测试日,并在其中比较(a)相关事件实际发生的日的比例 p 与(b)这些日的*均预测概率π。

如果我们遵循一些划分方案来选择测试集,并在其中比较(a)和(b ),我们就得到可靠性图。

可靠性图表

在一个二元分类问题中,我们训练一个模型来估计一个例子被分类为正类的概率,即 f(x_i)=p(y_i=1|x_i),如下图 1 所示。

图一。估计一组例子的概率

一旦我们获得了一个测试集的概率,我们将概率划分为 K 个子集,其中每个子集代表 0 和 1 之间的一个不相交的概率区间。这如图 2 所示。

图二。这些示例基于区间[0,0.33]、[0.33,0.66]和[0.66,1]被分成三组。

对于不同颜色的每个子集,我们计算两个估计值:(a)*均预测概率,(b)正例的相对频率。

我们首先计算(a)每个子集的*均预测概率,如图 3 所示。

图 3。每个子集的*均预测概率。

我们接下来计算(b)正例的相对频率,这需要基础事实标签的知识。在图 4 中,我们用灰色圆圈表示负类,其余的颜色表示正类。作为例子,在集合 1 中,只有一个例子是正的;所以正例的相对频率是 1/3。

图 4。正面例子的相对频率

可靠性图是绘制(b)与(a)的关系,如图 5 所示。

图 5。可靠性图表

直观地,校准图表明:(I)当*均预测概率为 0.17 时,大约 33%的预测是肯定的;(II)当*均预测概率为 0.45 时,约 50%的预测是肯定的;(III)当*均预测概率为 0.82 时,约 80%的预测是肯定的。这个人为的模型虽然不完美,但相对来说还是比较精确的。

误解:相对频率与准确度

关于可靠性图表的一个普遍误解是用“准确性”代替“相对频率”有时从业者——包括我非常尊敬的杰出研究人员——用“每个子集的准确度”来表示相对频率,这并不是校准的目的。我们需要从相对频率的角度来理解校准,其中阳性类别的预测置信度应该反映所有预测中阳性样本的频率(有时称为子集的流行度),而不是准确性。

我将使用来自 scikit-learn [3]的一个例子来展示它们之间的区别。图 6 显示了一个逻辑回归模型的可靠性图,这是一个相对校准良好的模型。

图 6。可靠性图表

然而,如果我使用精度来绘制 y 轴,它看起来像一条 V 形曲线,如图 7 所示。

图 7。准确度-*均预测值图

这是因为当正面预测概率较低而负面概率较高时,会提升图的左半部分。这可以通过*均预测值的直方图来验证。大量实例的*均预测值在 0 和 0.1 之间,因为它们是负类,并且它们中的大多数被模型正确分类。

结论

我希望你永远不要担心天气预报的不确定性校准。如果当下雨的概率低于 20%时,你总是淋湿,你就知道预测模型没有校准好。

从机器学习从业者的角度来看,不确定性校准与模型的概率结果的解释高度相关,特别是在安全关键应用中,如医疗领域。

参考

[1] DeGroot、Morris H .和 Stephen E. Fienberg。"预测者的比较和评估."皇家统计学会杂志:D 辑(统计学家)32.1–2(1983):12–22。美国心理学协会(American Psychological Association)

[2]达维德,菲利普。"精确的贝叶斯理论。"美国统计协会杂志77.379(1982):605–610。美国心理学协会(American Psychological Association)

[3]https://sci kit-learn . org/stable/modules/generated/sk learn . calibration . calibration _ curve . html

机器人控制系统介绍

原文:https://towardsdatascience.com/introduction-to-robotic-control-systems-9ec17c8ac24f?source=collection_archive---------17-----------------------

PC:pick pik(https://www . pick pik . com/wall-e-robot-toy-cute-wallpaper-romantic-2954)

机器人学是工程学和计算机科学之间的交叉学科。机器人技术的主要目标是生产计算机可编程的机器,能够以更高的速度和精度完成任务。在当前时代,机器人的应用数不胜数,例如运输重物(在物流管理中)、自动化制造、自动驾驶汽车和无人驾驶飞行器等等。

了解控制系统的概念对每个初学者来说都是入门机器人的必要条件。控制系统有助于控制机器人的运动和功能。为了理解控制系统,我们首先需要理解机器人学中使用的一些术语。

反馈控制系统(作者供图)

  • 状态——机器人系统产生输出被称为状态。通常我们用 x 来表示,状态取决于其先前的状态、施加到致动器的激励(信号)以及环境的物理特性。状态可以是姿态、速度、速率、角速度、力等等。
  • 估计 -机器人无法确定准确的状态 x ,但它们可以使用附着在它们身上的传感器来估计x。这些估计用 y 表示。机器人工程师的责任是选择足够好的传感器或很好地校准传感器,以便它们能产生 y ~ x.
  • 参考 -我们希望达到的目标状态,用 r. 表示
  • 误差参考值和估计值之间的差异称为误差。
  • 控制信号 -控制器产生/输出的刺激称为控制信号,用 u. 表示
  • 动力学 -也称为系统设备/系统模型,它表示系统在非静态条件下的行为。动态受环境影响,环境可能变化或不总是线性的。例如,地板类型(混凝土/木材)、空气阻力、坡度等。

工程师的主要职责始终是构建一个控制器,该控制器反应并产生控制信号 u,,使得 e~0 & x~r.

让我给你举一个上面讨论的关键术语的例子。假设你正在建造一个自动驾驶机器人。你应该为你的机器人配备一个巡航控制器。这里,

  • 你的机器人的速度(x)就是状态
  • 来自首选传感器(例如车轮编码器)的估计当前速度(y)
  • 你希望达到的速度是参考值(r)
  • 误差仅仅是 r 和 y 之间的差异
  • 控制器产生的增加或降低速度的电压就是你的控制信号(u)
  • 摩擦和空气阻力等环境特征可能会影响系统的动态特性。你应该在设计控制系统方程之前考虑它们

注意:一个机器人可以有一个或多个用于不同目的的控制器。例如,一个控制器用于巡航控制,另一个控制器用于控制机器人手的线性运动,一个控制器用于手的旋转运动等。

我们需要控制器,因为动态(系统设备)随时间变化。例如当机器人在斜坡上向上移动,然后在斜坡上向下移动,或者首先在光滑的混凝土上移动,然后在铺有地毯的地板上移动。因此,设计控制器的最佳方式是充分了解环境的物理特性。这将有助于列出控制器设计中需要考虑的要素。

在我结束之前,让我们看看控制器的理想特性。我们已经看到了第一个要求,

  1. 控制器应该将误差减小到接*零, e~0,它应该将估计值带到参考值, y~r
  2. 他们需要健壮,不应该依赖于我们不知道的东西。如果机器人的环境有任何变化,它们应该能够适应。
  3. 它们必须稳定,也就是说它们不应该失控。
  4. 他们需要动作流畅。
  5. 控制器需要响应。它应该足够快,以便在令人满意的时间内使输出达到基准电*

总之,我们给控制器一个参考状态。控制器还具有传感器反馈,利用参考状态和传感器反馈控制器产生达到参考状态所需的控制信号。这个控制信号被馈送到“系统”。系统动态特性决定了系统对该控制输入的反应。如果控制器是好的,希望“系统”将达到我们期望的参考状态。

希望这篇关于机器人控制系统的简短介绍对初学者有所帮助。

模式介绍:验证数据的 Python 库

原文:https://towardsdatascience.com/introduction-to-schema-a-python-libary-to-validate-your-data-c6d99e06d56a?source=collection_archive---------3-----------------------

验证您的数据变得更加复杂!

照片由非飞溅视觉效果非飞溅上拍摄

动机

您的脚本可以处理训练数据,但是当您将该脚本用于一个新的但应该相似的数据时,就会遇到错误。这是怎么回事?这可能是因为您的数据结构不像您预期的那样。

但是您可能很难查看新数据的每一行来找出问题所在。每次使用新数据时,手动分析您的数据也可能耗时

如果您的代码没有抛出任何错误,但是数据发生了变化,那就更糟了。因此,您的型号的性能可能会变得更差,因为数据与您的预期不同。

如果我们可以用 Pytest 之类的工具编写函数测试,那么有没有一种方法也可以编写数据测试呢?

我们可以用图式做到这一点。本文将向您展示如何在各种场景中使用模式。

什么是图式?

Schema 是用于验证 Python 数据结构的库。

安装架构时使用

pip install schema

我们将使用 faker 来创建字典列表数据。Faker 是一个 Python 库,使我们能够轻松地创建假数据。我在这里写了如何使用 faker。

想象一下,这些数据展示了你朋友的信息。

[{'name': 'Norma Fisher',
  'city': 'South Richard',
  'closeness (1-5)': 4,
  'extrovert': True,
  'favorite_temperature': -45.74},
 {'name': 'Colleen Taylor',
  'city': 'North Laurenshire',
  'closeness (1-5)': 4,
  'extrovert': False,
  'favorite_temperature': 93.9},
 {'name': 'Melinda Kennedy',
  'city': 'South Cherylside',
  'closeness (1-5)': 1,
  'extrovert': True,
  'favorite_temperature': 66.33}]

模式入门

验证数据类型

我们可以使用模式来验证数据类型,如下所示。

[{'name': 'Norma Fisher',
  'city': 'South Richard',
  'closeness (1-5)': 4,
  'extrovert': True,
  'favorite_temperature': -45.74},
 {'name': 'Colleen Taylor',
  'city': 'North Laurenshire',
  'closeness (1-5)': 4,
  'extrovert': False,
  'favorite_temperature': 93.9},
 {'name': 'Melinda Kennedy',
  'city': 'South Cherylside',
  'closeness (1-5)': 1,
  'extrovert': True,
  'favorite_temperature': 66.33}]We want to make sure that ‘name’, ‘city’ columns are string type, ‘closeness (1–5)’ are

因为 schema 返回输出时没有抛出任何错误,所以我们知道我们的数据是有效的。

让我们看看如果数据类型不像我们期望的那样会发生什么

SchemaError: Or({'name': <class 'int'>, 'city': <class 'str'>, 'closeness (1-5)': <class 'int'>, 'extrovert': <class 'bool'>, 'favorite_temperature': <class 'float'>}) did not validate {'name': 'Norma Fisher', 'city': 'South Richard', 'closeness (1-5)': 3, 'extrovert': True, 'favorite_temperature': -45.74}Key 'name' error:
'Norma Fisher' should be instance of 'int'

从错误中,我们确切地知道数据的哪一列和值与我们期望的不同。因此,我们可以返回数据来修复或删除该值。

如果您只关心数据是否有效,请使用

schema.is_valid(data)

如果数据符合预期,这将返回True,否则返回False

验证某些列的数据类型,而忽略其余列

但是,如果我们不关心所有列的数据类型,而只关心某些列的值,那该怎么办呢?我们可以用str: object来说明

Output: True

如您所见,我们尝试验证“名称”、“城市”和“favorite_temperature”的数据类型,而忽略数据中其余要素的数据类型。

数据是有效的,因为指定的 3 个要素的数据类型是正确的。

用函数验证

如果我们想确定列中的数据是否满足与数据类型(如列中值的范围)无关的特定条件,该怎么办?

Schema 允许您使用函数来指定数据的条件。

如果我们想检查“亲密度”列中的值是否在 1 到 5 之间,我们可以使用如下的lambda

Output: True

正如你所看到的,我们指定n,列中每一行的值为‘亲密度’,在 1 到 5 之间,用lambda n: 1 <= n <=5.表示整洁!

验证几个模式

如果你想确保你的‘接*度’列在 1 和 5 之间并且数据类型是一个整数呢?

这时候And就派上用场了

Output: False

虽然所有值都在 1 和 5 之间,但数据类型不是浮点型。因为不满足其中一个条件,所以数据无效

如果我们想在满足任一条件的情况下使列的数据有效,我们可以使用Or

例如,如果我们希望城市名称包含 1 个或 2 个单词,我们可以使用

与和或的组合

如果我们希望“城市”的数据类型是字符串,但长度可以是 1 或 2,该怎么办?幸运的是,这可以通过组合AndOr来轻松处理

Output: True

可选择的

如果我们没有你朋友的详细信息怎么办?

[{'name': 'Norma Fisher',
  'city': 'South Richard',
  'closeness (1-5)': 4,
  'detailed_info': {'favorite_color': 'Pink',
   'phone number': '7593824219489'}},
 {'name': 'Emily Blair',
  'city': 'Suttonview',
  'closeness (1-5)': 4,
  'detailed_info': {'favorite_color': 'Chartreuse',
   'phone number': '9387784080160'}},
 {'name': 'Samantha Cook', 'city': 'Janeton', 'closeness (1-5)': 3}]

因为 Samantha Cook 的“detailed_info”并不是对您所有的朋友都可用,所以我们想将此列设为可选。模式允许我们用Optional设置条件

Output: True

被禁止的

有时,我们可能还想确保某种类型的数据不在我们的数据中,比如私人信息。我们可以用Forbidden指定禁止哪个列

Forbidden key encountered: 'detailed_info' in {'name': 'Norma Fisher', 'city': 'South Richard', 'closeness (1-5)': 4, 'detailed_info': {'favorite_color': 'Pink', 'phone number': '7593824219489'}}

现在,每当 schema 抛出一个错误时,我们都知道了被禁止的列的存在!

嵌套词典

到目前为止,schema 已经使我们能够在几行代码中执行许多复杂的验证。但是在现实生活中,我们可能会处理比上面的例子更复杂的数据结构。

我们能把它用于更复杂结构的数据吗?比如字典中的字典?是的,我们可以

我们创建另一个包含嵌套字典的数据

>>> data[{'name': 'Norma Fisher',
  'city': 'South Richard',
  'closeness (1-5)': 4,
  'detailed_info': {'favorite_color': 'Pink',
   'phone number': '7593824219489'}},
 {'name': 'Emily Blair',
  'city': 'Suttonview',
  'closeness (1-5)': 4,
  'detailed_info': {'favorite_color': 'Chartreuse',
   'phone number': '9387784080160'}}]

现在我们用嵌套字典进行验证

语法非常简单!我们只需要在字典中编写另一个字典,并为每个键指定数据类型。

转换数据类型

schema 不仅可以用来验证数据,还可以用来转换数据类型,如果数据类型与我们预期的不一样的话!

例如,我们可以用Use(int)将字符串‘123’转换成整数 123

>>> Schema(Use(int)).validate('123')
123

结论

恭喜你!您刚刚学习了如何使用模式来验证和转换数据结构。如果你希望你的代码是可复制的,不仅需要测试代码,还需要测试你的数据。如果你正在寻找一种方法来验证你的数据,试试这个工具。它不仅有用,而且易于使用。

更多模式示例的源代码可以在这里找到。

如果您想找到更多验证数据的方法,请查看 schema 的文档

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何在 VSCode 上使用定制的代码片段来提高效率

与其为同一段代码复制,为什么不把它保存起来以备将来使用呢?

towardsdatascience.com](/how-to-boost-your-efficiency-with-customized-code-snippets-on-vscode-8127781788d7) [## 如何用 Faker 创建假数据

您可以收集数据或创建自己的数据

towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## 如何在命令行上创建和查看交互式备忘单

停止搜索命令行。用作弊来节省时间

towardsdatascience.com](/how-to-create-and-view-interactive-cheatsheets-on-the-command-line-6578641039ff) [## Hydra.cc 简介:配置数据科学项目的强大框架

尝试不同的参数和模型,而无需花费数小时来修改代码!

towardsdatascience.com](/introduction-to-hydra-cc-a-powerful-framework-to-configure-your-data-science-projects-ed65713a53c6) [## IBM 联邦学习简介:一种在私有数据上训练 ML 模型的协作方法

在训练来自不同来源的数据时,如何保证数据的安全?

towardsdatascience.com](/introduction-to-ibm-federated-learning-a-collaborative-approach-to-train-ml-models-on-private-data-2b4221c3839)

Biopython 序列比对简介

原文:https://towardsdatascience.com/introduction-to-sequence-alignments-with-biopython-f3b6375095db?source=collection_archive---------19-----------------------

在 Biopython 中使用序列比对软件包装器

上周,我开始用 Biopython 库摆弄 Python 中的一些生物信息学工具。在我之前的帖子中,我介绍了生物信息学领域,并提供了一个用 Biopython 的 API 接口从 GenBank 下载数据的例子。今天,我想转到分析 DNA 序列数据的下一个典型步骤——比对过程。我将对序列比对进行介绍,然后给出一个使用 Biopython 过滤一些数据并运行比对软件的简单示例。

序列比对介绍

当处理生物序列数据(DNA、RNA 或蛋白质)时,生物学家通常希望能够将一个序列与另一个序列进行比较,以便对序列的功能或进化做出一些推断。就像您不希望使用数据表中数据在错误的列进行分析一样,为了从序列数据中做出可靠的推断,我们需要确保我们的序列数据组织良好或“对齐”不幸的是,序列数据没有漂亮的标签,比如日期、每加仑英里数或马力。相反,我们所拥有的只是序列中的位置编号,而且只与该序列相关。幸运的是,许多序列在相关生物之间高度保守或相似(并且所有生物在某种程度上都是相关的!).如果我们相当确定我们已经从来自多个生物体的相同序列中获得了数据,我们可以将这些数据放入一个我们称之为比对的矩阵中。如果你只是比较两个序列,这叫做成对比对。如果您正在比较三个或更多序列,这被称为多序列比对 (MSA)。

利用序列中每个分子的位置和身份,我们可以推断出每个分子在基质中的相对位置。有时序列中会有差异,比如在一个大多数序列都是 C 的位置,我们发现一个序列带有 g,这被称为单核苷酸多态性(SNP)。在其他时候,我们发现一个序列缺少一个存在于其他序列中的分子,或者一个序列有一个额外的分子。前者是删除,而后者是插入,统称为“插入”当用 indels 比对序列时,我们必须通过在剩余的序列上添加缺口来解释这些额外的或缺失的分子。这些微小的差异通常是序列数据中有趣的部分,因为变异是我们如何对序列的功能或进化做出推断的。以下是 SNPS 和因德尔斯签订的管理服务协议的几个例子。

Example 1\. Multiple Sequence Alignment with a Single Nucleotide Polymorphism (SNP) in Sequence 3 at position 3\.      1 2 3 4 5 6 7 8 <- Nucleotide Positions
Seq1 G T **C** G C A A A 
Seq2 G T **C** G C A A A
Seq3 G T **G** G C A A AExample 2\. Multiple Sequence Alignment with an insertion in Sequence 1 at position 6. 1 2 3 4 5 6 7 8
Seq1 G T C G C **A** A A 
Seq2 G T C G C **-** A A
Seq3 G T C G C **-** A A

上面两个例子中,序列长度短,序列个数少,序列间相似度高。因此,直观地排列序列非常容易。然而,如果您有数百个序列,有数千或数万个位置要对齐,您可能不想全部手动对齐!相反,有一些程序使用算法来排列序列。

对于算法来说,比对是非常有趣的问题。首先,您希望通过对齐序列来最小化它们之间的差异。对于不同的序列区域,该算法有两种选择:(1)在比对中添加一个缺口,说明“该区域对于该序列是唯一的,并且在其他序列中没有类似的东西,”或者(2)将不相似的序列比对在一起,实质上说明“这些在这里是不同的,但是周围的序列足够相似以保持位置结构相同。”如果算法的唯一目标是最小化差异,它只会不断增加差距!相反,大多数比对算法的第二个目标也是最小化缺口的数量,并且当缺口被引入时,它们被给予惩罚分数。由于要跨许多序列和序列中的许多位置执行两种优化,这些程序的计算时间和内存需求可能非常大。我已经等了几个小时甚至几天来完成跑步!

尽管排列序列很费时间,但结果在遗传和进化研究中至关重要。序列之间的相似性和差异可以告诉你一个生物体与另一个生物体的进化关系,或者一个基因与另一个基因相比的功能。不建立序列之间的关系,你就不能做出这种推论。我已经掩饰了进入这个过程的一些更好的细节和假设,但是,在本质上,比对是分子生物学世界的数据框架。

使用 Biopython 进行序列比对

在我之前的文章中,我从 GenBank 下载了新型冠状病毒病毒(又名新冠肺炎病毒)样本的序列数据。我想将这些序列相互比较,以进行一些进化分析,但这首先需要比对!因此,继续我离开的地方,我将使用 Biopython 使用多序列比对软件 MUSCLE 来创建我的 MSA。

生物信息学 python 库 Biopython 有几个用于操作和构建序列比对的工具。Bio.AlignIOBio.Align模块包含这些工具。您可以读取和写入路线文件,转换其类型,并使用路线软件界面来创建路线。因为对齐软件相当慢,所以创建该软件的 Python 实现效率不是很高。相反,Biopython 只是使用包装器来执行用其他更快的语言编写的软件。它基本上与从命令行运行这些软件相同,但是 Biopython 让您有机会完全在 python 中构建工作流。Biopython 为九个常用的比对软件提供了包装器(在本文撰写之时),您可以通过运行下面一行来查看这些包装器:import Bio.Align.Applications; dir(Bio.Align.Applications)

使用包装器非常类似于在命令行中使用它们。使用对齐的所有参数设置实例化一个对象,然后执行该对象。下面,我展示了如何将我的新型冠状病毒数据过滤成完整的序列,然后使用 MUSCLE 来排列这些序列。(注意:你需要先装上 MUSCLE 才可以。你可以在这里下载肌肉。将可执行文件重命名为“muscle”会很有帮助然后,您应该确保muscle在您的 PATH 中,即在usr/local/bin目录中。只需将下载并重命名的副本复制并粘贴到该目录中。)

from Bio import SeqIO
from Bio.Align.Applications import MuscleCommandline#Read in unfiltered data
unfiltered = SeqIO.parse("../../data/raw/SARS-CoV-2.gbk", "genbank")#Drop data without (close to) full length sequences
full_length_records = []
for record in unfiltered:
    if len(record.seq) > 29000:
        full_length_records.append(record)#Write filtered data to file
SeqIO.write(full_length_records, "../../data/raw/SARS-CoV-2.fasta", "fasta")#Align sequences with MUSCLE (using parameters to make the alignment
#process as fast as possible)
muscle_cline = MuscleCommandline(input="SARS-CoV-2.fasta", 
                                 out="SARS-CoV-2_aligned.fasta", 
                                 diags = True, 
                                 maxiters = 1, 
                                 log="../../data/raw/align_log.txt")
muscle_cline()

正如我前面提到的,运行校准需要相当长的时间。有一些在线服务可以比你在本地机器上更快地运行你的比对。如果你时间不够,这些可能会有用。此外,看起来有一些新兴的技术可以利用 Hadoop 和 Spark 等系统来并行化这一过程,但在推荐之前,我想进一步了解这些技术。

对齐完成后,您可以使用多种对齐查看器之一对其进行目视检查。不幸的是,这不是一个容易从命令行完成的过程,所以 Biopython 没有试图给你这种能力。是的,您可以读取与Bio.AlignIO模块的对齐,并通过切片来迭代滚动,但这不是很有效。这是我用 NCBI 的多序列比对查看器打开的一个比对实例,这是一个基于浏览器的选项。

多序列比对示例,用 NCBI 多序列比对查看器查看。

这就是我本周关于对齐的文章的结尾。下周,我将利用这里创建的比对继续分析新型冠状病毒数据。像往常一样,如果你有问题或意见,请告诉我!感谢阅读!

熊猫体育分析简介

原文:https://towardsdatascience.com/introduction-to-sports-analytics-with-pandas-ad6303db9e11?source=collection_archive---------28-----------------------

德国德甲足球比赛分析。

Bermix 工作室Unsplash 拍摄的照片

体育分析是数据科学的一个主要分支。数据收集技术和数据分析的进步使得团队根据数据分析调整策略变得更有吸引力。

数据分析为团队表现和球员表现提供了有价值的见解。如果明智而系统地使用,数据分析最有可能让团队领先于竞争对手。

一些俱乐部有一整个团队致力于数据分析。利物浦是使用数据分析的先锋,我认为这是他们成功的重要部分。他们是上届英超冠军,也是 2019 年欧冠冠军。

在本帖中,我们将使用熊猫从 2017-18 赛季的德国德甲比赛中得出有意义的结果。这些数据集可以从的链接下载。我们将使用论文足球比赛时空比赛事件公共数据集中介绍的部分数据集。

数据集以 JSON 格式保存,可以很容易地读入 pandas 数据帧。

import numpy as np
import pandas as pdevents = pd.read_json("/content/events_Germany.json")
matches = pd.read_json("/content/matches_Germany.json")
teams = pd.read_json("/content/teams.json")
players = pd.read_json("/content/players.json")events.head()

(图片由作者提供)

事件数据帧包含比赛中发生的事件的细节。例如,第一行告诉我们,球员 15231 在比赛 2516739 的第三秒从位置(50,50)到(50,48)做了一次“简单的传球”。

事件数据帧包括球员和球队 id,但不包括球员和球队名称。我们将使用合并功能从球队和球员数据帧中添加他们。

(图片由作者提供)

Id 存储在球队和球员数据帧的“wyId”列中。

#merge with teams
events = pd.merge(
events, teams[['name','wyId']],left_on='teamId',right_on='wyId'
)
events.rename(columns={'name':'teamName'}, inplace=True)
events.drop('wyId', axis=1, inplace=True)#merge with players
events = pd.merge(
events, players[['wyId','shortName','firstName']],
left_on ='playerId',right_on='wyId'
)
events.rename(columns={'shortName':'playerName', 'firstName':'playerFName'}, inplace=True)
events.drop('wyId', axis=1, inplace=True)

我们根据包含 id 的列合并数据帧,然后重命名新列。最后,删除“wyId”列,因为 Id 已经存储在 events 数据帧中。

(图片由作者提供)

每场比赛的*均传球次数

主导比赛的球队通常传球次数更多。一般来说,他们更有可能赢得这场比赛。当然,也有一些例外。

让我们检查一下每支球队每场比赛的*均传球次数。我们将首先创建一个数据帧,其中包含球队名称、比赛 ID 和比赛中完成的传球次数。

pass_per_match = events[events.eventName == 'Pass']\[['teamName','matchId','eventName']]\
.groupby(['teamName','matchId']).count()\
.reset_index().rename(columns={'eventName':'numberofPasses'})

(图片由作者提供)

奥格斯堡在比赛 2516745 中进行了 471 次传球。这是每场比赛传球数量排名前五的球队名单。

pass_per_match[['teamName','numberofPasses']]\
.groupby('teamName').mean()\
.sort_values(by='numberofPasses', ascending=False).round(1)[:5]

(图片由作者提供)

拜仁慕尼黑传球次数最多并不奇怪。*年来他们一直统治着德甲联赛。

球员*均传球长度

可以基于许多事情来评估一次通过。有些传球非常成功,使得得分变得非常容易。

我们将关注传球的量化评估,即长度。有些球员非常擅长长传。

位置列包含球在 x 和 y 坐标上的初始和最终位置。我们可以根据这些坐标计算长度。让我们首先创建一个只包含通道的数据帧。

passes = events[events.eventName=='Pass'].reset_index(drop=True)

我们现在可以计算长度。

pass_length = []
for i in range(len(passes)):
    length = np.sqrt(((passes.positions[i][0]['x'] -    
    passes.positions[i][1]['x'])**2)\ + 
    ((passes.positions[i][0]['y'] - 
    passes.positions[i][1]['y'])**2))pass_length.append(length)passes['pass_length'] = pass_length

groupby 函数可以用来计算每个球员的*均传球长度。

passes[['playerName','pass_length']].groupby('playerName')\
.agg(['mean','count']).\
sort_values(by=('pass_length','mean'), ascending=False).round(1)[:5]

(图片由作者提供)

我们列出了*均传球长度和传球次数排名前五的球员。传球次数很重要,因为只传球 3 次对*均值来说意义不大。因此,我们可以过滤那些少于一定数量的通道。

胜利和失败的*均传球次数

让我们比较一下胜利和失败比赛的*均传球次数。我将用勒沃库森的比赛作为例子。

我们首先需要从“matches”数据框架中添加比赛的获胜者。

events = pd.merge(events, matches[['wyId','winner']], left_on='matchId', right_on='wyId')events.drop('wyId', axis=1, inplace=True)

我们现在可以创建一个 dataframe,它只包含团队 ID 为 2446(b . Leverkusen 的 Id)的事件。

leverkusen = events[events.teamId == 2446]

如果“获胜者”列中的值等于 2446,则获胜者是 b .勒沃库森。为了计算 B. Leverkusen 赢得的比赛的*均传球次数,我们需要根据 winner 和 eventName 列过滤数据帧。然后我们将应用 groupby 和 count 来查看每场比赛的传球次数。

passes_in_win = leverkusen[(leverkusen.winner == 2446) & (leverkusen.eventName == 'Pass')][['matchId','eventName']].groupby('matchId').count()passes_in_notwin = leverkusen[(leverkusen.winner != 2446) & (leverkusen.eventName == 'Pass')][['matchId','eventName']].groupby('matchId').count()

(图片由作者提供)

通过应用均值函数,我们可以很容易地得到*均通过次数。

(图片由作者提供)

虽然多传球并不意味着一定会赢,但它会帮助你控制比赛,增加你得分的机会。

体育分析的范围远远超出了我们在这篇文章中所做的。然而,在不熟悉基础知识的情况下,掌握更高级技术的知识将更加困难。

数据可视化也是体育分析的基础。球队和球员如何管理球场,射门和传球的位置,以及球场上覆盖最广的区域提供了宝贵的见解。

我也会写一些关于某些事件如何在球场上可视化的帖子。感谢您的阅读。如果您有任何反馈,请告诉我。

参考文献

[1] Pappalardo 等,(2019)足球比赛时空匹配事件公共数据集,自然科学数据 6:236,https://www.nature.com/articles/s41597-019-0247-7

[2]https://figshare.com/articles/Events/7770599

压缩激励网络简介

原文:https://towardsdatascience.com/introduction-to-squeeze-excitation-networks-f22ce3a43348?source=collection_archive---------39-----------------------

基于注意力的机制来提高你的深度 CNN

挤压和激励网络( SENet )是 2017 年 Imagenet 分类挑战赛的获胜者,比 2016 年的获胜者相对提高了约 25%。SENets 引入了一个关键的架构单元——挤压和激励模块(SE 模块),这对性能的提升至关重要。SE 模块还可以轻松添加到其他架构中,额外开销很低。

照片由里卡多·维亚纳Unsplash 上拍摄

SE 模块介绍

典型地,CNN 通过从空间维度提取信息并将它们存储在信道维度中来工作。这就是为什么当我们在 CNN 中深入时,特征地图的空间维度会缩小,而频道会增加。当考虑一个特定 CNN 层的输出特征图时,所有通道被同等加权。

我们知道,CNN 中的早期层负责捕捉基本特征,如边缘、拐角和线条,而后期层则捕捉更高级别的特征,如面部和文本。因此,这是有道理的

SE 块的主要思想是:基于每个通道的重要程度(挤压),为特征图的每个通道分配不同的权重(激励)。

SE 块可视化。作者创建的图像。

技术解释

SE 模块可以分为 3 个主要部分——挤压、计算和激励。在这里,我将更详细地介绍它们。

  1. 【挤压】操作

在 CNN 图层的输出要素地图上执行全局*均池。这实质上是在空间维度(H×W)上取所有激活的*均值,给出每个通道一个激活。这样做的结果是一个形状矢量(1 x 1 x C)。

2.计算

来自前一个操作的向量通过两个连续的完全连接的层。这用于完全捕获从空间地图聚集的通道相关。ReLU 激活在第一 FC 层之后执行,而 sigmoid 激活在第二 FC 层之后使用。在该论文中,还有一个缩减率,使得第一 FC 层的中间输出具有较小的尺寸。这一步的最终输出也有一个形状(1 x 1 x C)。

3.【励磁】运行

最后,计算步骤的输出被用作每声道权重调制向量。它只是简单地与大小为(H x W x C)的原始输入特征图相乘。这根据它们的“重要性”缩放每个通道的空间图。

SE 模块可以很容易地与许多现有的 CNN 集成。在这篇论文中,ResNets、VGG 和 Inception 等架构的精度显著提高,但额外的计算成本很低。

代码示例

这里有一个示例代码片段,您可以尝试一下。写于 PyTorch 。如您所见,添加挤压和激励模块的功能非常简单!在大约 10 行代码中,我们有一个来自 moskomule 的模块化实现,可以很容易地实现到大多数深度 CNN。

class SELayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(SELayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

结论

SE 模块的主要吸引力在于其简单性。仅从图中,我们可以理解挤压-激发过程中涉及的功能和步骤。此外,它们可以添加到模型中,而不会增加太多的计算成本,所以每个人都应该尝试将其集成到他们的深度学习架构中!

参考

[## 压缩和激励网络

卷积神经网络(CNN)的核心构件是卷积算子,它使网络能够…

arxiv.org](https://arxiv.org/abs/1709.01507) [## PyTorch

开源深度学习*台,提供从研究原型到生产部署的无缝路径。

pytorch.org](https://pytorch.org/)

Python 中的统计学简介

原文:https://towardsdatascience.com/introduction-to-statistics-in-python-6f5a8876c994?source=collection_archive---------41-----------------------

数据分析

统计学在数据分析中至关重要。我们将回顾一些关于统计学的基础知识,以及如何在 Python 编程语言中应用它

克里斯·利维拉尼在 Unsplash 上的照片

什么是统计

统计学是一门关于数据收集、组织、分析、解释和展示的学科。在将统计学应用于科学、工业或社会问题时,习惯上是从要研究的统计总体或统计模型开始。

中心趋势:

是概率分布的中心值或典型值。它也可以被称为分布的中心或位置。通俗地说,集中趋势的度量通常被称为*均值。

分散:

是分布被拉伸或压缩的程度。统计离差度量的常见例子有方差、标准差和四分位距。

相关性:

或相关性是两个随机变量或二元数据之间的任何统计关系,无论是否是因果关系。在最广泛的意义上,相关性是任何统计上的关联,尽管它通常指的是一对变量线性相关的程度。

辛普森悖论:

这是概率和统计中的一种现象,在这种现象中,一种趋势出现在几组不同的数据中,但当这些数据组合在一起时就会消失或逆转。

什么是高级数据分析

数据分析解决方案提供了一种利用业务数据的便捷方式。但是,市场上的解决方案数量可能会令人望而生畏,许多解决方案似乎涵盖了不同类别的分析。组织如何理解这一切?首先了解不同类型的分析,包括描述性、诊断性、预测性和规范性分析。

  • 描述性分析告诉你过去发生了什么。
  • 诊断分析帮助你理解过去为什么会发生一些事情。
  • 预测分析预测未来最有可能发生的事情。
  • 规范性分析推荐您可以采取的行动来影响这些结果。

Python 中的应用统计方法

想象一下,我们必须对工作中每个成员的朋友数量进行一些数据分析。朋友的数量将在 Python 列表中描述,如下所示:

num_friends = [100, 49, 41, 40, 25, 100, 100, 100, 41, 41, 49, 59, 25, 25, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10,
]

我们将使用 matplotlib 在直方图中显示朋友数量:

看到直方图会是

直方图朋友计数器

中心倾向

  • 意思是

我们想知道朋友数量的*均值

def mean(x):
    return sum(x) / len(x)

应用此方法将获得的价值为多少朋友喜欢

35.791666666666664
  • 中位数

中位数是对集中趋势的简单衡量。为了找到中值,我们按照从最小值到最大值的顺序排列观察值。如果有奇数个观察值,中值是中间值。如果有偶数个观察值,中值是两个中间值的*均值。

运用这种方法会给我们带来结果

25.0
  • 分位点

中位数的一个概括是分位数,它表示小于某个数据百分位的值。(中值表示小于 50%数据的值。)

def quantile(x, p):
    *"""returns the pth-percentile value in x"""* p_index = int(p * len(x))
    return sorted(x)[p_index]

对 num_friends 应用分位数方法,因为百分位是 0.8,将会有结果

59
  • 模式(或最常见的值)

将返回 num_friends 的应用模式方法

[4]

结论

学习统计学有助于我们更多地了解数据分析或数据科学的基本概念。还有很多关于统计学的东西,比如假设检验、相关性或估计,我还没有讲过。因此,请随意了解更多关于它们的信息。

参考

《从零开始的数据科学》Joel Grus 著

[## 比较描述性、预测性、规范性和诊断性分析

如今,大多数组织都强调数据驱动业务决策,这是理所当然的。但是数据本身并不是…

www.logianalytics.com](https://www.logianalytics.com/predictive-analytics/comparing-descriptive-predictive-prescriptive-and-diagnostic-analytics/) [## 统计数字

统计学是一门关于收集、组织、分析、解释和展示…

Dispersionen.wikipedia.org](https://en.wikipedia.org/wiki/Statistics)

流式算法简介

原文:https://towardsdatascience.com/introduction-to-streaming-algorithms-b71808de6d29?source=collection_archive---------12-----------------------

用 Python 解释和实现的各种算法

乔恩·弗洛布兰特在 Unsplash 上的照片

在过去,编程意味着永远记住内存限制。虽然在 1990 年拥有 32mb 内存是一笔财富,但现在有时甚至在一台家用电脑上拥有 32gb内存都不够。随着硬盘、RAM 和 GPU 内存的增长,可用的数据量也在增长。因此,拥有一套内存高效算法仍然是很重要的。

两个小例子

一个典型的例子是互联网交换机,它监控不同的 IP 互相发送数据包。交换机的一个常见任务是找出最重要的,即一对两个 IP 地址,与其他对相比,IP₁在这些地址上与 IP₂的通信非常频繁。这很有趣,因为这可能是一个拒绝服务攻击的指示器。

照片由Webaroo.com.auUnsplash 上拍摄

这听起来是个简单的问题,对吗?只需实现从 IP 对(IP₁、IP₂)到从 IP₁到 IP₂.的通信数量的映射在 Python 中,这可以是字典、计数器类的实例或邻接矩阵。然后就可以在数据结构中搜索最高的 k 计数,输出对应的 IP 地址。

42.42.42.42 经常满腹狐疑地和 182.162.77.12 交谈,154.78.122.56 也经常满腹狐疑地和 43.111.23.122 交谈。这也许值得研究一下。

但是现在想想这些数据结构的大小。一个更大的交换机可以接收来自数百万个 IP(T21)的请求,并将它们路由到尽可能多的其他 IP。

这意味着我们最终可能会拥有数百万乘以数百万的 IP 对。

这一点,再加上交换机通常较低的存储容量,引发了许多问题。这种方法是不可能的:我们需要一种比存储所有内容占用更少内存的算法。一种方法是使用计数分钟草图。你也可以在 YouTube 上搜索“重量级人物”,如果你感兴趣,可以找到一些很好的解释和例子。

现在我听到你们中的一些人说:

我为什么要关心网络的东西?我是一个机器学习的家伙,咄!—你

嗯,还有一个来自机器学习世界的著名例子:梯度下降

如果我们处理足够小的数据集,它可以完全适合(GPU) RAM,我们可以使用批量梯度下降,即一次将完整的数据放入内存并进行处理。然而,大多数时候我们的工作记忆太小,使得有必要使用随机梯度下降小批量梯度下降,它们是所谓的流算法的例子。另一个例子是 Hoeffding 树算法,我在这里描述了

在本文中,我想向您展示几个流算法的例子,包括您可以使用的 Python 实现!除了让你意识到这个问题,我已经做到了。;)

直觉

对于流算法,我指的是能够处理非常大的,甚至可能是无界的数据集,并且仅使用恒定数量的 RAM 来计算一些期望的输出的算法。

如果数据集是无界的,我们称之为数据流。在这种情况下,如果我们在某个位置 n 停止处理数据流,我们期望我们的算法有一个解,对应于到这一点看到的数据。

在下文中,假设我们的硬盘上有一个巨大的数据集,我们想要处理它而不需要立刻将它加载到我们的 RAM 中(因为我们不能),或者有一个输出数据流的源,例如 Twitter 上的传入 tweets。两种情况都以同样的方式处理。

我将用大型数据集的语言来表述即将出现的例子,因为我们知道它们是有限的,我不必一直提到我们停止读取数据流。

我们进一步假设我们可以准确地传递数据一次

一个*缓的开始

让我们通过两个简单的例子来熟悉如何设计流算法。

寻找最小值

假设有一个非常大的数字列表,对你的内存来说太大了。你想找出这个列表的最小值。在 Python 中,经典的解决方法是这样的:

print(min(my_list))

但这是假设my_list已经在 RAM 中。那么,我们如何用另一种方式来解决这个问题呢?也许你已经找到了解决方案:

只要一个数字接一个数字地读数据集,只要发现一个更小的数字,就更新最小值。

更准确地说:读取第一个元素,并声明它是最小值。然后读取第二个元素,如果它小于当前最小值(第一个元素),就声明它是最小值。否则,什么都不做。

然后读取第三个元素,如果它小于当前最小值,就声明它是最小值。否则,什么都不做。

然后读取第四个元素,如果它小于当前最小值,则声明它为最小值。否则,什么都不做。

好吧,我停下来,你知道这是怎么回事。这基本上行得通,因为

使用这个公式,你可以很容易地通过归纳证明算法是正确的。读取第一个元素后,结果是正确的,因为 a ₁ < ∞,因此 min(a₁)=a₁.归纳步骤正是公式(想想吧!).但是说够了,让我们回到正轨。

在 Python 中,我们可以使用下面这个非常简单的类来解决它:

from math import inf

class StreamingMinimum:
    def __init__(self):
        self.result = inf  # Immediately replaced by the 1st element

    def update(self, element):
        self.result = min(self.result, element)

您可以通过以下方式使用它

import numpy as np

stream = iter(np.random.randn(10000))  # Simulate a stream
s = StreamingMinimum()

for element in stream:
    s.update(element)

print(s.result)

很简单,对吧?让我们增加一点难度。

寻找*均值

同样的设置:大数据集,但是现在我们要找的是均值而不是最小值。

当然,你知道公式!

所以,我们现在的问题如下:

当我们已经有了前 n 个元素的均值时,如何计算 n+1 个元素的均值?

一个简单的解决方案是使用下面的标识,您可能在稍加思考后就会想到:

我们可以看到,我们不仅必须存储旧的*均值,而且还必须跟踪元素的数量 n,,因为这在公式中是需要的。在计算最小值的情况下,这是没有必要的。

这个类是这样的:

class StreamingMean:
    def __init__(self):
        self.result = 0
        self.n = 0

    def update(self, element):
        self.result = (self.result * self.n + element) / (self.n+1)
        self.n += 1

您可以像以前一样再次测试这段代码。用StreamingMean类代替StreamingMinimum就行了。

健全性检查:结果大约为 0,这也是我们对标准正态分布随机变量的预期。同样:检查这个算法的正确性是一个简单的归纳练习。

既然你现在知道它是如何工作的,让我们来看一个更有趣的算法。

储层取样

假设您有一个大型数据集,并且想要对一个对象进行统一采样。你怎么能这样做?好吧,如果你知道数据集的大小 n ,你可以在 1 和 n 之间均匀地抽取一个随机数 k扫描数据集,取第 k个元素。

但是现在想象一下,你有一个数据流,你事先不知道有多少元素进来,也不知道什么时候想停止读取数据流。现在变得越来越困难,因为你不知道从哪个范围抽取随机指数。但是这个问题也有一个简单的解决方法,叫做油藏取样

这个想法是这样的:你有一个单独的盒子(容器)来存放元素。扫描数据流时,以一定概率用当前元素替换框内内容。

典型的水库。来源:超级马里奥世界

如果我把这个想法留给你一个人,也许过一段时间你就能算出概率。跳过 n 个元素后的目标是能够以 1/ n 个的概率将每个元素放入盒子中。

在最简单的情况下,从某个恒定概率 p 开始。但是,举例来说,第一个元素出现在盒子里的概率是(1- p ) ⁿ,对于任何一个 p < 1 来说都是指数级的小,而不是我们所寻找的。

解决这个问题的一个办法是:我们扫描序列的时间越长,就必须降低交换的概率。什么是简单衰变率?1/ n 怎么样?让我们试试。

起初,盒子是空的。我们扫描第一个元素,用第一个元素填充盒子(概率 1/1=1)。到目前为止一切顺利。

现在我们来看第二个元素。我们用 1/2 的概率替换盒子里的内容。这一步之后,第一个元素在盒子里的概率是 1/1 * 1/2 = 1/2,第二个元素在盒子里面的概率是 1/2。完美!我们再做一个。

到达第三个元素,它以 1/3 的概率替换盒子内的元素。第一个元素还在盒子里的概率是多少?就是它熬过了第一个(好吧,这个很容易) 第二个第三个互换机会的概率:1/1 * 1/2 * 2/3 = 1/3。看起来不错!第二个元素呢?它必须在第二次和第三次互换机会中存活下来,这种机会发生的概率为 1/2 * 2/3 = 1/3。好像管用!事实上,它确实如此,正如一个人可以用… 归纳看到的那样!

代码如下:

from random import random

class ReservoirSampler:
    def __init__(self):
        self.result = None
        self.n = 0

    def update(self, element):
        self.n += 1
        if random() < 1 / self.n:  # Satisfied with prob. 1/n.
            self.result = element

我们可以快速检查一下它是否有效。让我们从大小为 20 的数据集重复采样。我们预计在大约 5%的情况下抽取每个元素。

results = []

for _ in range(1000000):
    r = ReservoirSampler()
    for s in range(20):
        r.update(s)

    results.append(r.result)

可视化results给出了以下内容:

我们可以看到,在所有试验中,每种元素都被取样了大约 5%。完美!

结论

我们已经看到,即使在今天,内存高效的算法也是必要的。处理非常大的数据集的聪明技巧仍然是相关的,幸运的是,聪明人已经在这个领域投入了很多努力。

在本文中,我向您展示了三个非常简单的算法示例,它们应该可以教您如何解决内存极度受限的问题。

下一次,如果你的数据再一次不适合你的内存,考虑一下是否有办法以流的方式处理它!

我希望你今天学到了新的、有趣的、有用的东西。感谢阅读!

作为最后一点,如果你

  1. 想支持我多写点机器学习和
  2. 无论如何都计划获得一个中等订阅,

为什么不做 通过这个环节 ?这将对我帮助很大!😊

说白了,给你的价格不变,但大约一半的订阅费直接归我。

非常感谢,如果你考虑支持我的话!

如有问题,在LinkedIn上写我!

PyTorch 风格转换简介

原文:https://towardsdatascience.com/introduction-to-style-transfer-with-pytorch-339ba2219621?source=collection_archive---------42-----------------------

神经网络的应用

卷积神经网络的新用途

我电脑旁的艺术。

你知道神经网络不相信左右脑分离吗?

典型的例子:左边的图像不是由人手的笔触创建的,而是由卷积神经网络创建的!

这表明神经网络并不局限于复杂的数学和统计学。稍加帮助,他们甚至可以创造艺术!这篇文章旨在解释风格转移的概念,正如加蒂丝等人在这篇有趣的研究论文中所定义的那样。

什么是风格转移?

风格转移是由 Leon A. Gatys 等人开发的卷积神经网络的一种新颖应用。它允许对图像的“内容”和“风格”进行精确的数学定义。有了内容和风格,我们可以定义一种新的损失函数来描述两个图像之间的风格和内容的差异。然后,通过反向传播,我们可以更新一个图像的像素,以更紧密地匹配另一个图像的样式或内容。

:梵高的星夜。右图:安德烈亚斯·普雷夫克拍摄

这些图像分别包含文章简介中图像的样式和内容。

对 ConvNets 的一点回顾

卷积神经网络是以这样一种方式独特设计的,即它们擅长识别和分离视觉输入中的模式。

下面是它们工作原理的大概描述:

  1. 图像被传递到 ConvNet 的第一个卷积层。
  2. 第一个卷积层让图像通过一组过滤器,这些过滤器检测像垂直线和水*线这样的简单图案。这些图案被提取并作为新的图像通道输出(每个滤镜一个)。
  3. 然后,这些新的镜像通道被馈送到下一个卷积层,并重复该过程。本质上,网络是在检测模式中的模式!
  4. 有时,卷积层的输出可能会经过一个池层。池层本质上抛弃了“细节”,但保留了全局模式。这允许一个 ConvNet 将它所知道的推广到以前从未见过的图像。

定义网络

图像风格传输最初在卷积网络上执行,该网络包含由池层分隔的 5 个组中的 16 个卷积层。这个网络叫做 VGG19。每个组在输入中找到模式,然后将这些模式传递到池层,丢弃一些细节,但保留大图。

最左边的黑色方块是原始图像。被网络过滤还原。

我们将使用 PyTorch 预先培训的 VGG 网络开始:

定义图像内容

根据我们对 ConvNets 的了解,它们保持一般模式,但开始丢弃网络深层的细节。记住这一点,就很容易理解为什么图像的“内容”被定义为网络深层的输出。

我们将使用第 10 个卷积层的输出来定义图像的“内容”。我们将这一层命名为 conv4_2 ,因为它是第四叠卷积层中的第二层。

下面是一个从网络中提取所选图层内容的函数。这些层是根据它们在链接的研究论文中的用途选择的。请注意, conv4_2 也在其中。其余的将用于确定风格:

使用 conv4_2 来描述“内容”给了我们想要模拟的一般结构。使用较浅的图层保留更多细节,使用较深的图层丢弃更多细节。您可以根据自己的艺术喜好选择使用不同的图层。

定义风格

如果您知道如何计算样本空间的相关矩阵(通常被视为相关值的热图),那么这将看起来很熟悉,而且相当容易。

回想一下,任何给定卷积层的输出都是一组新的镜像通道,每个通道描述输入中的一些模式或特征。这些通道中的每一个都包含输入图像的过滤版本,该版本突出显示某些特征或图案。然后,我们将风格定义为这些不同特征之间的相关性,并使用 Gramian 矩阵计算相关性。

还记得图像通道只是像素值的 2D 网格。然后,为了确定来自单个卷积层的不同模式信道之间的相关性,我们执行以下操作:

  1. 对给定图层输出的每个通道进行矢量化。换句话说,分解像素值网格,从每个输出通道创建一个行向量。
  2. 将所有这些行向量一个接一个地堆叠起来,创建一个二维矩阵。姑且称这个矩阵为 S
  3. 将这个新的 S 矩阵乘以它的转置。这个结果就是格拉米矩阵。

下面是一个小函数,它用两行代码为我们完成了这项工作:

为了更好地感受图像的“风格”,我们为 5 个不同的卷积层分别创建了 5 个独立的格拉米矩阵。

conv1_1
conv2_1
conv3_1
conv4_1
conv5_1

你可能想知道这 5 层是如何被选择来代表输入图像的“风格”的。简而言之,我选择使用与作者相同的层。请随意尝试不同的层!

定义损失

因为我们希望创建一个包含一个父图像的样式和另一个父图像的内容的新图像,所以我们必须定义一个考虑样式和内容的损失函数。

内容损失

内容流失很容易!内容损失被正式定义为两幅图像的内容之间的均方误差。图像的内容被定义为层 conv4_2 的输出。

如果上面的等式令人困惑,那也没关系。使用线性代数可以大大简化这个方程:

回头看看get_features()的代码片段,您会看到该函数返回了一个字典,其中包含以下各层的所有特征通道:

conv1_1
conv2_1
conv3_1
conv4_1
**conv4_2**
conv5_1

c_featurest_features仅仅是get_features()应用于内容模板图像和目标图像时的输出。因此,将代码与等式匹配,我们看到张量 TC 在代码中定义如下:

T = t_features['conv4_2']
C = c_features['conv4_2']

风格丧失

风格损失在数学上稍微复杂一点,但实现起来很简单。通过首先计算目标图像的格拉米矩阵和样式模板图像的格拉米矩阵的均方误差来找到样式损失:

这里, PG 是目标图像和样式模板图像的格拉米矩阵。上标 l 表示计算 Gramians 的图层输出:

**conv1_1 --> E_1 
conv2_1 --> E_2
conv3_1 --> E_3
conv4_1 --> E_4**
conv4_2 --> N/A (used for content loss)
**conv5_1 --> E_5**

同样,这些层输出存储在由get_features()返回的字典中。

接下来,我们求出每个误差项的加权和:

权重 w 只是用户出于艺术偏好而选择的。每一层的错误都会对最终艺术表现的结果产生不同的影响。

下面是计算风格损失的代码:

全损

总损失是风格和内容损失的线性组合:

其中,α和β是比例因子。α/β的比率将决定新目标图像中的样式/内容比率。在实践中,β会大得多,因为风格误差的尺度小得多。

把所有的放在一起

最后要做的事情是把前馈和反向传播结合起来。这一次,我们不更新网络参数!相反,我们正在更新我们的目标图像的像素值,以便它迭代地处理我们的样式图像的样式和我们的内容图像的内容:

不要害怕使用代码中的参数来实现您想要的艺术风格。这需要一些练习,并不是每一组图像都像你期望的那样。好好享受吧!

如果你想看我的关于风格转移的完整 Jupyter 笔记本(包括我遗漏的一些助手功能),你可以在这里找到它。

现在,我将留给你这张结合了抽象艺术和积云的航拍照片:)

内容: 普林斯顿环境学院风格: 杰森·恰内利

生存分析导论

原文:https://towardsdatascience.com/introduction-to-survival-analysis-6f7e19c31d96?source=collection_archive---------11-----------------------

来源: pixabay

了解生存分析的基本概念,以及可以用来做什么任务!

在这个竞争异常激烈的时代,所有企业都面临着客户流失/保留的问题。快速给出一些背景,当客户停止使用公司的服务(停止购买、取消订阅等)时,就会发生流失。).保留是指保持企业的客户活跃(活跃的定义在很大程度上取决于商业模式)。

直觉上,公司希望通过防止流失来增加保留率。通过这种方式,他们与客户的关系更长久,因此潜在的利润也更高。此外,在大多数情况下,公司留住一个客户的成本远低于获得一个新客户的成本,例如,通过绩效营销。对于企业来说,保留的概念与客户终身价值 (CLV)密切相关,企业希望最大化客户终身价值。但是这是另一篇文章的主题。

通过这篇文章,我想开始一个关注生存分析的简短系列,生存分析通常是统计学习中一个被低估但非常有趣的分支。在这篇文章中,我提供了生存分析及其构建模块的一般介绍。首先,我解释了所需的概念,然后描述了分析事件时间数据的不同方法。开始吧!

生存分析简介

生存分析是一个统计学领域,专注于分析某一事件发生前的预期时间。最初,这一统计学分支是围绕在临床试验中测量药物治疗对患者存活率的影响而发展起来的。例如,想象一组癌症患者接受某种新的治疗。生存分析可用于根据患者的预期寿命分析该治疗的结果。

然而,生存分析并不局限于调查死亡,也可以用于确定机器故障前的时间,或者——乍听起来可能有点违反直觉——某个*台的用户转向高级服务。这是可能的,因为生存分析关注的是事件发生前的时间,而不是将事件定义为负面事件。适用于最流行的生存分析方法的条件是:

  • 感兴趣的事件被清楚地定义和很好地指定,因此对于它是否发生没有模糊性,
  • 对于每个受试者,该事件只能发生一次——这在死亡的情况下很明显,但如果我们将分析应用于流失,这可能是一个更复杂的情况,因为流失的用户可能会被重新激活并再次流失。

我们已经确定,生存分析用于建模时间到事件序列,换句话说,就是生存期(因此也是 Python 库的名称,它是这种分析的首选工具)。一般来说,我们可以用生存分析来尝试回答这样的问题:

  • 有百分之几的人会活过某个特定的时间?
  • 幸存者的死亡率/失败率是多少?
  • 特定特征(例如,年龄、性别、地理位置等特征)是如何实现的。)影响生存概率?

简要描述了生存分析的一般思想后,是时候介绍一些对彻底理解这个主题至关重要的概念了。

斯科特·格雷厄姆Unsplash 上拍照

审查

删失可以描述为生存分析领域中的缺失数据问题。当关于存活时间的信息不完整时,观察结果被删截。有不同种类的审查,例如:

  • 右审查,
  • 区间审查,
  • 左侧审查。

为了使本节简短,我们只讨论最常遇到的一个— 右删截。让我们回到癌症治疗的例子。想象一下,对新药效果的研究持续了 5 年(这是一个任意的数字,实际上没有任何依据)。可能发生的情况是,5 年后,一些患者存活下来,因此没有经历死亡事件。与此同时,该研究的作者与一些患者失去了联系——他们可能已经搬到了另一个国家,他们可能真的已经死亡,但从未得到证实。这些病例受到右删截的影响,即他们的真实存活时间等于或大于观察到的存活时间(在这种情况下,研究的 5 年)。下图说明了右删截。

来源

删失的存在也是我们在生存分析中不能用简单 OLS 解决问题的原因。这是因为 OLS 有效地绘制了一条最小化误差*方和的回归线。但是对于删失数据,误差项是未知的,因此我们不能最小化 MSE。应用一些简单的解决方案,如使用审查日期作为死亡事件的日期,或删除审查的观察结果,可能会严重影响结果。

有关不同类型审查的信息,请点击此处

生存函数

生存函数是时间的函数( t ,可以表示为

其中 Pr() 代表概率,而 T 代表从样本中随机观察到的感兴趣事件的时间。我们可以将生存函数解释为感兴趣的事件(例如,死亡事件)在时间 t. 之前不发生的概率

生存函数的取值范围在 0 和 1(包括 0 和 1)之间,并且是 t. 的非递增函数

危险函数

我们可以将风险函数(或风险率)视为受试者在一小段(或更准确地说,无限短)时间间隔内经历感兴趣事件的概率,假设受试者一直存活到所述间隔开始。危险函数可以表示为:

其中,分子中的表达式是在给定时间间隔内感兴趣的事件发生的条件概率,前提是该事件以前没有发生过。 dt 中的分母是所考虑的时间间隔的宽度。当我们将前者除以后者时,我们有效地获得了事件在单位时间内的发生率。最后,当区间宽度变为零时,取极限值,我们最终得到瞬时发生率,即某一事件在特定时间点发生的风险。

你可能想知道为什么用这么短的时间间隔来定义风险率。其原因在于,连续随机变量等于特定值的概率为零。这就是为什么我们需要考虑事件在很短的时间间隔内发生的概率。

技术说明:为了在理论上正确,重要的是要提到危险函数实际上不是一个概率,名称危险率是更合适的名称。这是因为尽管分子中的表达式是概率,但分母中的 dt 实际上可以导致大于 1 的危险率值(在较低的区间中仍然限制为 0)。

最后,生存函数和危险函数相互关联,如下式所示:

给这个等式一点上下文,括号中的积分称为累积风险,可以解释为从时间点 0 到 t 受试者面临的风险的总和。

贾斯汀·吕贝克Unsplash 上拍摄

不同的生存分析方法

由于生存分析是一个不同的统计方法的整个领域,用于处理时间到事件序列,自然有许多不同的方法可以遵循。在高层次上,我们可以将他们分为三大类:

  • 非参数化 —通过这些方法,我们对数据的基本分布不做任何假设。也许这一组中最受欢迎的例子是卡普兰-迈耶曲线,简而言之,这是一种估计和绘制作为时间函数的生存概率的方法。
  • 半参数——正如你可能已经猜到的,这个群体介于两个极端之间,很少做出假设。最重要的是,没有关于风险函数/风险率形状的假设。这一组中最受欢迎的方法是 Cox 回归,我们可以用它来确定风险函数和一组解释变量(预测值)之间的关系。
  • 参数化 —你可能在做研究时遇到过这种方法。这个想法是使用一些统计分布(一些流行的包括指数分布、对数分布、威布尔分布或洛马克斯分布)来估计一个受试者将存活多久。通常,我们使用最大似然估计(MLE)来拟合数据的分布(或者实际上是分布的参数),以获得最佳性能。

这个简短列表中提到的方法绝不是详尽的,还有许多更有趣的方法来使用基于机器或深度学习的技术分析时间到事件的数据。我会尽量在下面的帖子中涵盖最有趣的内容,敬请关注:)

结论

在这篇文章中,我试图对生存分析领域提供一个简短而全面的介绍。我认为,在谈论不同的数据科学解决方案时,这一领域经常被忽略。然而,通过使用一些简单的(或者根本不那么简单!)解决方案我们可以为公司或利益相关者提供有价值的见解,并产生实际的增值。

这篇文章只是一个简短系列的开始,我将在下面继续添加以下部分。如果你有问题或建议,请在评论中告诉我,或者在 Twitter 上联系我。

同时,你可能会喜欢我的其他一些文章:

[## 生存分析导论:卡普兰-迈耶估计量

了解用于生存分析的最流行的技术之一,以及如何用 Python 实现它!

towardsdatascience.com](/introduction-to-survival-analysis-the-kaplan-meier-estimator-94ec5812a97a) [## 用 Tableau 提升你的 Kaplan-Meier 曲线

方便访问整个公司的生存分析!

towardsdatascience.com](/level-up-your-kaplan-meier-curves-with-tableau-bc4a10ec6a15) [## 生存分析导论:尼尔森-艾伦估计量

了解如何使用非参数方法来估计累积风险函数!

towardsdatascience.com](/introduction-to-survival-analysis-the-nelson-aalen-estimator-9780c63d549d)

生存分析导论:卡普兰-迈耶估计量

原文:https://towardsdatascience.com/introduction-to-survival-analysis-the-kaplan-meier-estimator-94ec5812a97a?source=collection_archive---------6-----------------------

托拜厄斯·图利乌斯在 Unsplash 拍摄的照片

了解用于生存分析的最流行的技术之一,以及如何用 Python 实现它!

在我的上一篇文章中,我描述了生存分析的潜在用例,并介绍了理解用于分析事件时间数据的技术所需的所有构件。

我继续这个系列,解释可能是最简单,但非常有见地的生存分析方法——卡普兰-迈耶估计量。在理论介绍之后,我将向您展示如何使用流行的lifelines库在 Python 中进行分析。

1.卡普兰-迈耶估计量

Kaplan-Meier 估计量(也称为乘积极限估计量,稍后您会看到原因 ) 是一种将生存概率作为时间函数进行估计和绘图的非参数技术。这通常是进行生存分析的第一步,因为这是最简单的方法,需要的假设最少。为了使用卡普兰-迈耶方法进行分析,我们假设如下:

  • 感兴趣的事件是明确的,并且在明确指定的时间发生。
  • 所有观察的存活概率是相同的,它们何时进入研究并不重要。
  • 删截的观测值与继续被跟踪的观测值具有相同的生存前景。

在现实生活中,我们永远不知道真实的生存函数。这就是为什么使用 Kaplan-Meier 估计量,我们从收集的数据中逼*真实的生存函数。估计值被定义为在相同情况下存活了一定时间的观察值的分数,由以下公式给出:

其中:

  • t_i 是至少一个事件发生的时间,
  • d_i 是在时间 t_i 发生的事件数,
  • n_i 代表已知存活到时间 t_i 的个体数量(他们尚未发生死亡事件或已被审查)。或者换句话说,在 t_i 时刻有风险的观测值的数量。

从公式中的乘积符号,我们可以看到与该方法的另一个名称,乘积极限估计量的联系。在时间 t 的生存概率等于在时间 t 的生存机会百分比与之前各时间的乘积。

我们最常与这种生存分析方法联系在一起的,以及我们通常在实践中看到的是卡普兰-迈耶曲线——卡普兰-迈耶估计量随时间变化的曲线。我们可以使用这些曲线作为探索工具——比较队列、接受或不接受某种治疗的群体、行为集群等之间的生存函数。

生存线实际上是一系列递减的水*台阶,在给定足够大的样本量的情况下,这些台阶接*人口真实生存函数的形状。在实践中,该图通常伴随着置信区间,以显示我们对点估计的不确定性——宽置信区间表明高度不确定性,可能是因为研究只包含少数参与者——这是由观测值死亡和被删截引起的。有关使用格林伍德方法计算置信区间的更多详细信息,请参见[2]。

图片由作者提供

存活曲线的解释非常简单,y 轴代表受试者存活到时间 t 后仍未经历感兴趣事件的概率,x 轴代表该概率。生存函数(由 Kaplan-Meier 估计器*似)的每次下降都是由至少一次观测中发生的感兴趣的事件引起的。

垂直线的实际长度代表在时间 t 经历该事件的处于风险中的观察的部分。这意味着,在两个不同的时间经历该事件的单个观察(实际上不是同一个,而是简单的单个)可以导致差异大小的下降,这取决于处于风险中的观察的数量。这样,下落的高度也可以告诉我们有风险的观察次数(即使没有报告和/或没有置信区间)。

当没有观察经历感兴趣的事件或一些观察被删截时,存活曲线没有下降。

图片来自 Pixabay免费照片

2.对数秩检验

我们已经学会了如何使用卡普兰-迈耶估计量来逼*一个群体的真实生存函数。我们知道我们可以绘制多条曲线来比较它们的形状,例如,通过我们的移动应用程序的用户使用的操作系统。然而,我们仍然没有一个工具,将真正允许比较。嗯,至少比目测曲线更严谨。

这时对数秩检验开始发挥作用。这是一个统计测试,比较两组(或更多,请参见 Python 实现)之间的存活概率。检验的零假设表明所考虑的组之间的生存功能没有差异。

对数秩检验使用与 Kaplan-Meier 估计量相同的假设。此外,还有比例风险假设——风险比(请参见上一篇文章中关于风险率的提示)在整个研究期间应保持不变。在实践中,这意味着如果生存曲线交叉,对数秩检验可能不是一个合适的检验。但是,这仍然是一个争论激烈的话题,请看[4]和[5]。

为了简洁起见,我们不涉及测试背后的数学。如果你有兴趣,请看这篇文章或【3】。

3.Kaplan-Meier 的常见错误

在这一部分,我想提一下在使用 Kaplan-Meier 估计器时可能会出现的一些常见错误。

删除审查的数据

删除删失数据可能很诱人,因为它会显著改变卡普兰-迈耶曲线的形状,但是,这可能会导致严重的偏差,因此我们在拟合模型时应该始终包括它。

解释曲线的端点

在解释存活曲线的终点时要特别注意,因为接*研究终点的任何大的下降都只能通过到达该时间点的少数观察来解释(这也应该通过更宽的置信区间来指示)

二分法连续变量

通过二分法,我的意思是使用中间值或“最佳”分界点来创建任何连续指标的“低”和“高”分组。这种方法会产生多种问题:

  • 寻找“最佳”分界点可能非常依赖于数据集,并且不可能在不同的研究中重复。此外,通过进行多重比较,我们冒着增加假阳性几率的风险(在生存函数中发现差异,而实际上没有差异)。
  • 二分法通过强制所有测量值为二进制值来降低统计检验的能力,这反过来会导致需要更大的样本量来检测效果。还值得一提的是,在生存分析中,所需的样本量是指对感兴趣事件的观察次数。
  • 当进行二分法时,我们对观察值之间的风险分布做出了错误的假设。让我们假设我们用 50 岁作为年轻患者和老年患者的分界线。如果我们这样做,我们假设一个 18 岁的人和一个 49 岁的人在同一个风险组,但在大多数情况下这是不正确的。

仅考虑一个预测因素

Kaplan-Meier 估计量是一种单变量方法,因为它最多使用一个变量/预测值来逼*生存函数。因此,结果很容易出现偏差,要么夸大了信号,要么遗漏了信号。这是由所谓的遗漏变量偏差引起的,这导致分析假设多个预测因子的潜在影响应仅归因于我们考虑的单个预测因子。因此,应该使用多变量方法,如 Cox 回归。

4.Python 中的示例

是时候把我们在实践中学到的东西付诸实施了。我们从导入所有需要的库开始。

然后,我们加载数据集,并做一些小的调整,使其与lifelines库配合良好。为了进行分析,我们使用流行的电信客户流失数据集(此处或我的 GitHub 上的可用)。该数据集包含电话/互联网提供商的客户信息,包括他们的任期、他们使用哪种服务、一些人口统计数据以及最终指示流失的标志。

对于此分析,我们使用以下各列:

  • tenure —客户在公司工作的月数,
  • churn —客户是否翻炒的信息(二进制编码:如果事件发生则为 1,否则为 0)。
  • PaymentMethod —客户使用了哪种付款方式。

对于最基本的场景,我们实际上只需要事件发生时间和指示感兴趣的事件是否发生的标志。

KaplanMeierFitter的工作方式类似于scikit-learn中已知的类:我们首先实例化类的对象,然后使用fit方法使模型适合我们的数据。在绘图时,我们指定at_risk_counts=True来额外显示关于在特定时间点有风险的观察数量的信息。

通常,我们会对中位存活时间感兴趣,即*均 50%的人口已经死亡的时间点,或者在这种情况下,被搅动。我们可以使用下面一行来访问它:

kmf.median_survival_time_

然而,在这种情况下,该命令返回inf,因为我们可以从生存曲线中看到,我们实际上没有观察到数据中的那个点。

我们已经看到了基本的用例,现在让我们把分析复杂化,并为支付方式的每个变体绘制生存曲线。我们可以通过运行以下代码来做到这一点:

运行代码块会生成以下图形:

我们可以看到,电子支票的生存概率肯定是最低的,而自动银行转账/信用卡的曲线非常相似。这是使用对数秩检验来检验它们是否真的不同的绝佳时机。

下表列出了结果。

通过查看 p 值 0.35,我们可以看到没有理由拒绝零假设,即生存函数是相同的。在这个例子中,我们只比较了两种付款方式。然而,我们肯定可以测试更多的组合。有一个很好用的函数叫做pairwise_logrank_test,可以让对比变得非常容易。

在表格中,我们可以看到之前的对比,以及所有其他组合。银行转账和信用卡是我们不应该拒绝零假设的唯一案例。此外,我们应该谨慎解释对数秩检验的结果,因为我们可以在上面的图中看到,银行转账和信用卡支付的曲线实际上是交叉的,因此违反了比例风险的假设。

使用生命线库,我们还可以很容易地测试另外两个东西。第一个是多变量对数秩检验,其中零假设表明所有组具有相同的“死亡”产生过程,因此它们的生存曲线是相同的。

测试的结果表明,我们应该拒绝零假设,所以生存曲线是不相同的,这一点我们已经在图中看到了。

最后,我们可以测试特定时间点的存活率差异。回到示例,在图中,我们可以看到曲线在 t = 60 左右相距最远。让我们看看这种差异是否有统计学意义。

通过查看测试的 p 值,没有理由拒绝零假设,即在该时间点的存活率没有差异。

5.结论

在这篇文章中,我描述了一个非常流行的进行生存分析的工具——Kaplan-Meier 估计量。我们还介绍了比较两个/多个生存函数的对数秩检验。所描述的方法是一个非常受欢迎的方法,但是,也不是没有缺陷。在结束之前,让我们看看 Kaplan-Meier 估计量/曲线的优缺点。

优势:

  • 给出总体的*均视图,也是按组。
  • 不需要很多功能—只需要关于事件发生时间和事件是否实际发生的信息。此外,我们可以使用任何描述组的分类特征。
  • 自动处理阶级不*衡,因为几乎任何比例的死亡审查事件是可以接受的。
  • 由于它是一种非参数方法,所以很少对数据的基本分布进行假设。

劣势:

  • 我们无法评估预测因子对生存概率的影响程度。
  • 我们无法同时考虑多个观察因素,例如,原产国和手机操作系统。
  • 删截和存活之间的独立性假设(在时间 t,删截的观察结果应该与未删截的观察结果具有相同的预后)可能不适用/不现实。
  • 当底层数据分布(在某种程度上)已知时,该方法不如一些竞争技术准确。

总之,即使有一些缺点,Kaplan-Meier 生存曲线也是进行生存分析的一个很好的起点。在这样做的同时,我们可以获得关于生存的潜在预测因素的有价值的见解,并通过一些更先进的技术加速我们的进展(我将在未来的文章中描述)。

你可以在我的 GitHub 上找到本文使用的代码。一如既往,我们欢迎任何建设性的反馈。你可以在推特或评论中联系我。

如果您对这篇文章感兴趣,您可能也会喜欢本系列中的其他文章:

[## 生存分析导论

了解生存分析的基本概念,以及可以用来做什么任务!

towardsdatascience.com](/introduction-to-survival-analysis-6f7e19c31d96) [## 用 Tableau 提升你的 Kaplan-Meier 曲线

方便访问整个公司的生存分析!

towardsdatascience.com](/level-up-your-kaplan-meier-curves-with-tableau-bc4a10ec6a15) [## 生存分析导论:尼尔森-艾伦估计量

了解如何使用非参数方法来估计累积风险函数!

towardsdatascience.com](/introduction-to-survival-analysis-the-nelson-aalen-estimator-9780c63d549d)

6.参考

[1]卡普兰,E. L .,&迈耶,P. (1958)。不完全观测值的非参数估计。美国统计协会杂志53 (282),457–481。—此处可用

[2] S .索耶(2003 年)。生存分析中的格林伍德和指数格林伍德置信区间—此处可用

[3] Kaplan-Meier 生存曲线和对数秩检验—此处可用

[4]非比例风险——那又怎样?—此处可用

[5]g .布略蒂斯和 l .比林汉姆(2011 年)。穿越生存曲线:对数秩检验的替代方法。选拔赛12 (S1),A137。

生存分析导论:尼尔森-艾伦估计量

原文:https://towardsdatascience.com/introduction-to-survival-analysis-the-nelson-aalen-estimator-9780c63d549d?source=collection_archive---------7-----------------------

约书亚·厄尔Unsplash 拍摄的照片

了解如何使用非参数方法来估计累积风险函数!

之前的文章中,我已经描述了 Kaplan-Meier 估计量。简单回顾一下,这是一种逼*真实生存函数的非参数方法。这一次,我将重点关注可视化生存数据集的另一种方法——使用风险函数和 Nelson-Aalen 估计量。同样,我们将使用lifetimes库的便利来快速创建 Python 中的情节。

1.尼尔森-艾伦估计量

利用卡普兰-迈耶曲线,我们*似计算了生存函数,说明了在某个时间 t. 内不发生感兴趣事件(例如,死亡事件)的概率

另一种方法是使用风险函数来可视化来自以生存为中心的数据集的综合信息,风险函数可以被解释为受试者在一小段时间间隔内经历感兴趣事件的概率,假设受试者已经生存到所述间隔的开始。有关危险功能的更详细描述,请参见这篇文章

不幸的是,我们不能将生存函数的 Kaplan-Meier 估计转换成风险函数。然而,我们可以使用累积风险函数的另一个非参数估计量——Nelson-Aalen 估计量。简而言之,它用于估计在一定时间内预期事件的累计数量。它之所以是累积的,是因为估计的和比逐点估计要稳定得多。

Nelson-Aalen 估计值可计算如下:

其中 d_i 代表在时间 t 的感兴趣事件的数量,而 n_i 是处于危险中的观察的数量。所有这些项自然与 Kaplan-Meier 估计公式中的项相似。

Nelson-Aalen 估计量,或者更一般地,将风险函数随时间可视化,并不是一种非常流行的生存分析方法。这是因为——与生存函数相比——对曲线的解释不那么简单和直观。然而,风险函数对于更高级的生存分析方法非常重要,例如 Cox 回归。这就是为什么理解这个概念很重要,我将试着提供一些关于它的见解。我们可以说累积风险函数:

  • 衡量到某个时间点为止累积的风险总量 t.
  • 如果事件是可重复的,则提供我们在数学上预期感兴趣的事件在某个时间段内发生的次数。这可能有点令人困惑,所以为了使陈述简单一点(但不太现实),你可以把累积风险函数想象成一个人到时间 t,为止的预期死亡次数,如果这个人可以在每次死亡后复活而不重置时间的话。正如我所说的,这不太现实,但这同样适用于机器故障等。

最后一个可能有助于获得累积风险函数直觉的概念是浴缸曲线,或者更确切地说是它的组成部分。这条曲线代表了许多电子消费产品的生命周期。浴盆曲线的风险率是通过结合以下因素得出的:

  • 产品首次推出时的早期“婴儿死亡率”失败率,
  • 在产品的设计寿命期间,具有恒定故障率的随机故障率,
  • 产品超过预期寿命时的“磨损”故障率。

来源

而上图代表的是危险率(不是累计的!),Nelson–Aalen 估计曲线的形状让我们了解了风险率如何随时间变化。

例如,累积风险函数的凹形表明我们正在处理一种“婴儿死亡率”事件(图中的红色虚线),其中失败率在早期最高,随着时间的推移而降低。另一方面,累积风险函数的凸形意味着我们正在处理“磨损”类事件(黄色虚线)。

我相信这些理论足以理解累积风险函数的 Nelson-Aalen 估计量。是时候编码了!

2.Python 中的示例

为了保持一致,我们继续使用上一篇文章中开始的流行的电信客户流失数据集。为了简洁起见,请参考文章中对数据集的描述以及对其应用转换的推理。首先,我们加载所需的库。

然后,我们加载数据:

lifelines使计算和绘制 Nelson-Aalen 估计量的过程非常简单,我们只需运行以下几行代码来绘制累积风险函数。

该代码生成以下图形:

我认为,基于 Nelson-Aalen 估计值的累积风险函数的形状可能表明,我们正在处理的风险函数类似于浴缸曲线。这是因为我们看到,在开始和接*结束时,变化率都较高,而在客户与公司的生命周期中间,变化率或多或少趋于*缓(稳定在一个恒定的水*)。

我们还可以通过使用拟合的NelsonAalenFitter对象的cumulative_hazard_方法来轻松访问累积风险函数。

该库提供的另一个有趣的功能是 events 表,它汇总了每个时间点发生的事情。我们可以通过运行naf.event_table来获得它,结果如下:

与 Kaplan-Meier 案例类似,我们也将绘制支付方式的每个变量的累积风险函数。由于lifelines提供了一种统一的方法来处理用于生存分析的不同工具,代码只需要少量的修改。

对于两种自动支付类别:银行转账和信用卡,累积风险函数的形状非常相似。

:在理论介绍中,我们提到用累积风险函数代替风险函数的原因是前者的精度更高。然而,lifelines提供了一种通过应用核*滑器从累积函数中导出风险函数的方法。那么,问题出在哪里?为此,我们需要指定带宽参数,由此产生的风险函数的形状高度依赖于所选的值。我将引用作者对这种方法的评论:“没有明显的方法来选择一个带宽,不同的带宽产生不同的推论,所以这里最好非常小心。我的建议是:坚持累积风险函数。”。如果你仍然感兴趣,请查看文档

3.结论

在这篇文章中,我试图提供一个估计累积风险函数的介绍和一些关于结果解释的直觉。虽然 Nelson-Aalen 估计值远不如 Kaplan-Meier 生存曲线流行,但在使用更高级的生存分析方法(如 Cox 回归)时,理解它可能会非常有帮助。

您可以在我的 GitHub 上找到本文使用的代码。一如既往,我们欢迎任何建设性的反馈。你可以在推特上或者评论里联系我。

如果您对这篇文章感兴趣,您可能也会喜欢本系列中的其他文章:

[## 生存分析导论

了解生存分析的基本概念,以及可以用来做什么任务!

towardsdatascience.com](/introduction-to-survival-analysis-6f7e19c31d96) [## 生存分析导论:卡普兰-迈耶估计量

了解用于生存分析的最流行的技术之一,以及如何用 Python 实现它!

towardsdatascience.com](/introduction-to-survival-analysis-the-kaplan-meier-estimator-94ec5812a97a) [## 用 Tableau 提升你的 Kaplan-Meier 曲线

方便访问整个公司的生存分析!

towardsdatascience.com](/level-up-your-kaplan-meier-curves-with-tableau-bc4a10ec6a15)

4.参考

[1]https://stats . stack exchange . com/questions/60238/直觉累积危险功能生存分析

技术指标介绍及其 Python 实现

原文:https://towardsdatascience.com/introduction-to-technical-indicators-and-its-implementation-using-python-155ae0fb51c9?source=collection_archive---------43-----------------------

建立你自己的技术指标图表,以创建和实施交易策略

技术指标是做什么的?

技术指标是从股票价格(高、低、开、闭)和交易量的运动模式中产生的信号。这些信号又被用来预测未来的价格走势。技术分析师在历史数据中寻找指标,用它们来寻找交易的进场点和出场点。技术分析师不同于基本面分析师,基本面分析师通过观察基本面和内在价值来评估股票的表现。

鸣谢:图片来自 Unsplash

技术指标大致分为两大类:

1.叠加图:它们使用与价格相同的标度,并被绘制在股价图上价格的上方。例子:移动*均线,布林线

2.振荡指标:这些技术指标在局部最大值和局部最小值之间振荡,绘制在价格图的上方或下方。例子:MACD

我们将涉及的技术指标的一些基本示例如下:

1.简单移动*均线

2.加权移动*均数(WMA)

3.指数移动*均线

4.移动*均收敛发散(MACD)

5.布林线

移动*均线:

均线是广泛使用的技术分析指标之一。这是一个在日常生活中听说过的概念,如果不是关于股票的话。移动*均通过过滤曲线中的各种噪声来*滑曲线。由于移动*均线是基于历史价格而不是实际价格,人们可能会观察到它相对于真实股价曲线的曲线滞后。常用的均线有 5、10、20、50、200 日均线。

在移动*均线中,进一步分类为简单移动*均线(SMA)、加权移动*均线(WMA)和指数移动*均线(EMA)。

简单移动*均线:

简单移动*均线(SMA)是所有股票价格的非常基本的*均值或算术*均值,这意味着所有股票价格的总和除以周期数。

简单移动*均线来源:维基百科

加权移动*均:

在加权移动*均线(WMA)中,每个价格点被赋予不同的权重。在将各种权重乘以各自的股票价格后,这些权重的总和除以总周期数。在简单移动*均线的情况下,股票价格被赋予相等的权重。

来源:Sap.com

指数移动*均:

指数移动*均线(EMA)是一个 3 步过程。为此,我们使用简单移动*均线计算第一根均线。其次,我们计算乘数的*滑因子。第三,我们把这个乘数应用到前一天的均线上。在这个过程中,我们会给最新的价格分配更高的权重。

来源:Investopedia

移动*均线收敛发散:

移动*均线收敛发散(MACD)是一个振荡的技术指标。它通过发现股票价格的两条移动*均线之间的关系来显示股票所遵循的动量。一般是用 12 期均线减去 26 期指数移动*均线(EMA)计算出来的。许多交易者用这个作为进场信号,并以某种方式解读,让他们洞察自己的交易决策。

MACD 线:MACD 的 9 日均线叫做信号线,它是在 MACD 线上运行均线得到的。现在这条线被绘制在 MACD 线的顶部,这有助于分析交叉、分叉和陡坡。通过这条线,分析师能够解读买入和卖出信号。如果 MACD 越过了它的信号线,交易者可能会买入股票,如果它越过了信号线,就会卖出。

布林线:

布林线的概念最初是由约翰·布林格提出的。这些波段由上下波段组成,位于均线上下两个标准差范围内。

分析的方法是首先假设它们是价格目标的上限和下限。如果股价跌破较低的价格带,这可能表明买入触发,反之亦然。

使用 Python 的技术指标:

我尝试过使用 python 来构建这些技术指标。我已经使用 IEX API 获得了“网飞”股票价格的收盘价,并将其直接加载到数据框架中进行进一步分析。请看下面的代码:

形状记忆合金分析:

10 天和 50 天的 SMA

上面的内容非常直观地向我们展示了价格走势和交叉的趋势。

均线分析:

10 天和 50 天的均线

当长期(50 天)均线穿过短期(10 天)均线时,我们可以推断价格已经正式开始下跌,这应该是卖出信号。同样,当短期移动*均线穿过长期移动*均线时,这是买入信号。

布林线分析:

20 天移动*均线的布林线

这里有更多的概念叫做挤压和突破。当带子靠得更*时,就会发生挤压。交易员认为这是一个波动性较低的时期,预计未来波动性将会增加。这又被认为是未来贸易机会的可能性。突破显示股价穿过布林线的点。

布林线帮助我们识别买入和卖出信号,这也可以从上面的图表中看出。只要股价突破波段,就可以推断出信号。如果股价低于较低的波段,就存在买入该股票的机会,同样,如果股价穿过较高的波段,现在就是卖出的时候

MACD 分析:

MACD vs 信号线

从第二张图中,我们可以观察到一些交叉的发生。当 MACD 线穿过信号线时,我们可以假设特定股票的价格上涨,反之亦然,当信号线穿过 MACD 线时

再者:

在这篇文章中,我提到了一些技术指标,初学者可以从这些指标开始,慢慢地探索各种复杂性和许多其他指标。如需进一步阅读,可以浏览下面这篇关于 Investopedia 的文章:

[## 移动*均(MA)定义

在统计学中,移动*均线是一种计算方法,用于通过创建一系列*均值来分析数据点

www.investopedia.com](https://www.investopedia.com/terms/m/movingaverage.asp)

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者用语

Python 文本分类简介

原文:https://towardsdatascience.com/introduction-to-text-classification-with-python-c9db137b9d80?source=collection_archive---------24-----------------------

照片由阿尔方斯·莫拉莱斯Unsplash 拍摄

基于朴素贝叶斯模型的文本分类。

在过去的几年里,在线学习的影响力越来越大。使用它已经有很多应用,从市场营销、生物信息学、城市规划等等。机器学习是一种从数据中学习表示的方法,因此我们可以使用它来提取知识或基于它预测标签。这种方法的应用之一是文本分类。

文本分类是我们将文本分类到它们所属的类别的任务。在机器学习成为一种趋势之前,这项工作大多由几个标注者手工完成。这在未来会成为一个问题,因为数据变得越来越大,光是做这件事就要花很多时间。因此,我们应该使任务自动化,同时也获得更高的准确性。

在本文中,我将向您展示如何使用 Python 进行文本分类。对于数据集,我们将使用一个名为真实与否的 Kaggle 竞赛的数据集。灾难推文的 NLP。我还在 Google Colab 上做了这个笔记本,你可以在这里找到它

概述

本文将分为几个部分:

  • 清洗正文
  • 用 TF-IDF 权重建立文档术语矩阵
  • 朴素贝叶斯的概念
  • 使用 Python 实现

该过程

清理文本

我们要做的第一步是准备和清理数据集。清理数据集是删除任何无意义的单词或无用的术语(如标签、提及、标点等等)的必要步骤。

为了清理文本,我们可以利用 re 之类的库来删除带有模式的术语,利用 NLTK 来删除单词,例如停用词。我还解释了如何使用 Python 一步一步地清理文本,您可以在这里看到,

[## 使用 Python 清理文本数据

你需要的只是 NLTK 和 re 库。

towardsdatascience.com](/cleaning-text-data-with-python-b69b47b97b76)

这是一些文本在预处理前的样子,

**Our Deeds are the Reason of this #earthquake May ALLAH Forgive us all****Forest fire near La Ronge Sask. Canada****All residents asked to 'shelter in place' are being notified by officers. No other evacuation or shelter in place orders are expected****13,000 people receive #wildfires evacuation orders in California** **Just got sent this photo from Ruby #Alaska as smoke from #wildfires pours into a school** **#RockyFire Update => California Hwy. 20 closed in both directions due to Lake County fire - #CAfire #wildfires****#flood #disaster Heavy rain causes flash flooding of streets in Manitou, Colorado Springs areas****I'm on top of the hill and I can see a fire in the woods...****There's an emergency evacuation happening now in the building across the street****I'm afraid that the tornado is coming to our area...**

执行该任务的代码如下所示,

**# # In case of import errors
# ! pip install nltk
# ! pip install textblob**import re
from textblob import TextBlob
import nltk
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords**# # In case of any corpus are missing 
# download all-nltk**
nltk.download()df = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')stop_words = stopwords.words("english")def text_preproc(x):
  x = x.lower()
  # x = ' '.join(wordnet.lemmatize(word, 'v') for word in x.split())
  x = ' '.join([word for word in x.split(' ') if word not in stop_words])
  x = x.encode('ascii', 'ignore').decode()
  x = re.sub(r'https*\S+', ' ', x)
  x = re.sub(r'@\S+', ' ', x)
  x = re.sub(r'#\S+', ' ', x)
  x = re.sub(r'\'\w+', '', x)
  x = re.sub('[%s]' % re.escape(string.punctuation), ' ', x)
  x = re.sub(r'\w*\d+\w*', '', x)
  x = re.sub(r'\s{2,}', ' ', x)
  return xdf['clean_text'] = df.text.apply(text_preproc)
test['clean_text'] = test.text.apply(text_preproc)

这是清洁步骤后的结果,

**deeds reason may allah forgive us****forest fire near la ronge sask canada****residents asked place notified officers evacuation shelter place orders expected****people receive evacuation orders california****got sent photo ruby smoke pours school****update california hwy closed directions due lake county fire****heavy rain causes flash flooding streets manitou colorado springs areas****i top hill see fire woods****there emergency evacuation happening building across street****i afraid tornado coming area**

还有,记笔记!确保从 NLTK 下载所有的包和语料库(基本上是单词的集合)。

使用 TF-IDF 权重构建术语-文档矩阵

在我们清理完数据之后,现在我们可以构建一个文本表示,这样计算机就可以轻松地读取数据。我们将使用术语-文档矩阵作为文本的表示。

术语-文档矩阵(TDM) 是一个矩阵,其中行代表每个文档,列代表每个术语(词),单元格用数字填充。

单元格由每个文档的字数组成。我们可以用来填充它的一种方法叫做词频——逆文档频(TF-IDF)。

词频—逆文档频率(TF-IDF) 是一个文档上的一个词的频率(词频)和一个词在所有文档上的逆频率(逆文档频率)的乘积。

词频(TF) 是计算文档中一个词的数量的公式。因为单词之间的数量不同,我们应用以 10 为底的对数来重新调整它。它看起来像这样,

逆文档频率(IDF) 是一个计算所有文档上单词稀有度的公式。如果数量很少,这个词就很常用。但如果大一点,这个词就不那么频繁了。这个公式将被用作 TF 的权重,它看起来像这样,

要创建术语-文档矩阵(TDM ),我们可以使用 sklearn 库中名为 TfidfVectorizer 的函数。代码看起来会像这样,

**vectorizer = TfidfVectorizer()****X = vectorizer.fit_transform(df['clean_text']).toarray()
df_new = pd.DataFrame(X, columns=vectorizer.get_feature_names())****X_test = vectorizer.transform(test['clean_text']).toarray()
test_new = pd.DataFrame(X_test, columns=vectorizer.get_feature_names())**

当您编写代码时,您必须非常小心对每个数据集使用哪个函数。对于训练数据,请确保使用 fit_transform 方法,因为它将根据训练数据中的项数进行拟合,并将其转换为矩阵。

同时,在测试数据上,确保您使用了 transform 方法,因为它会将文本转换为具有相同数量的训练数据列的矩阵。如果我们也对其使用 fit_transform,它将根据测试数据的项数创建一个矩阵。因此,它在列上不会有相同的维度,所以请确保检查您将使用的方法。

如果我们做对了,它会给出具有相同列维数的矩阵,以及一个类似这样的矩阵,

朴素贝叶斯的概念

有了矩阵后,现在我们可以将它应用到模型中。我们将使用的模型是朴素贝叶斯。

朴素贝叶斯是一种机器学习模型,通过计算数据属于某个类的概率来解决监督学习任务。

它基于贝叶斯原理,并假设文档中的每个术语都是相互独立的。计算这个的公式是这样的,

让我解释一下它的每一部分,

  • P(c|d)代表文档属于一个类别的概率,
  • 阿尔法符号对应于两边的比例,
  • P(c)是通过计算一个类别的数量与文档总数的比例而得到的该类别的先验概率。公式看起来像这样,

其中 Nc 是数据集中相应类的数量,N 是数据集中文档的数量。

  • P(t id | c)的乘积是文档(d)中属于类别(c)的每一项的概率结果的乘积。公式看起来像这样,

其中,T ct 对应于类别内的该项的数量,T CT’的总和对应于给定类别的项的总数,B 代表训练数据集上不同词汇的数量,1 代表模型的*滑以避免零。

P(t id | c)公式会根据我们对问题的表述而不同。前一个问题把它表述为一个多项式问题,我们计算一个类中有多少确切的项。我们有时称这个模型为多项式朴素贝叶斯

还有一个模型叫做伯努利朴素贝叶斯,这里 P(t id | c)的计算是不同的。它将计算包含该术语的文档数量占所有文档总数的比例。公式看起来像这样,

其中 Nct 对应于包含该类别的术语的文档总数,Nc 对应于该类别的文档总数。

在我们计算每个概率后,我们将选择概率最高的最佳类。

使用 Python 的实现

在我向您解释了这些概念之后,让我们继续讨论实现。对于这一步,我将使用 scikit-learn 库来完成。

当我们建立模型时,要知道的重要方面是模型是否给出了很好的结果,尤其是在看不见的数据上,所以我们有信心使用它。我们可以通过一个叫做交叉验证的概念来做到这一点。代码看起来像这样,

from sklearn.naive_bayes import MultinomialNB, BernoulliNB
from sklearn.model_selection import KFold
from sklearn.metrics import f1_scoreX = df_new.values
y = df.target.valueskfold = KFold(n_splits=10)**# Define the model**
nb_multinomial = MultinomialNB()
nb_bernoulli = BernoulliNB()**# As a storage of the model's performance**
def calculate_f1(model):
 metrics = []

 for train_idx, test_idx in kfold.split(X):
   X_train, X_test = X[train_idx], X[test_idx]
   y_train, y_test = y[train_idx], y[test_idx]
   model.fit(X_train, y_train)
   y_pred = model.predict(X_test)
   metrics.append(f1_score(y_test, y_pred))

 **# Retrieve the mean of the result**
 print("%.3f" % np.array(metrics).mean()) calculate_f1(nb_multinomial)
>>> 0.681calculate_f1(nb_bernoulli)
>>> 0.704

calculate_f1 函数是怎么回事?

  • 首先,它将模型作为输入。
  • 然后,它将在 k 次中进行交叉验证,在每次循环中,它将数据集分为训练和测试数据集,然后模型拟合训练数据并预测测试数据上的标签。
  • 最后,我们计算每个交叉验证分数的*均值。

在此基础上,我们得出了伯努利朴素贝叶斯模型的得分(0.704)优于多项式朴素贝叶斯模型的得分(0.681)。

因此,我们将使用伯努利朴素贝叶斯作为我们的模型来预测真实的测试集数据。代码看起来像这样,

from sklearn.naive_bayes import BernoulliNBdef predict_to_csv(model, X, y):
  model.fit(X, y)
  X_test = test_new.values
  y_pred = model.predict(X_test) **# Preparing submission**
  submission = pd.DataFrame()
  submission['id'] = test['id']
  submission['target'] = y_pred
  submission.to_csv('file_name.csv', index=False) **# Validate**
  submission = pd.read_csv('file_name.csv')
  print(submission.head()) nb_bernoulli = BernoulliNB()
X = df_new.values
y = df.target.valuespredict_to_csv(nb_bernoulli, X, y)
>>> id  target
0   0        1
1   2        0
2   3        1
3   9        0
4  11        1

正如我们在上面看到的,我们用真实的训练数据拟合模型,并预测测试数据的标签。之后,我们创建一个数据框并将结果保存为 CSV 格式。最后你可以把那个提交给 Kaggle,你就知道结果好不好了。

最后的想法和建议

我想给你一些建议。对于这项任务,朴素贝叶斯是一个很好的机器学习模型,但还有很多空间来改进结果。您可以使用任何其他模型,如支持向量机、决策树、递归神经网络等等。

此外,您可以执行一些特征工程来移除数据上的无意义信息,或者您可以调整模型上的超参数。

终于,我们到了这篇文章的结尾。希望你从中有所收获,有想法可以在下面评论下来。此外,如果你对我的帖子感兴趣,你可以关注我的媒体来了解我的下一篇文章。

参考

[1] Pedregosa 等人,2011 年。sci kit-learn:Python 中的机器学习, JMLR 12,第 2825–2830 页
[2]曼宁等,2011。信息检索导论。剑桥大学出版社第 234–265 页。
【3】麦卡勒姆 a .和尼甘 K. 1998。朴素贝叶斯文本分类的事件模型比较。 Proc。AAAI/ICML-98 文本分类学习研讨会,第 41-48 页。
【4】哈立德,I. A. 2020。使用 Python 创建简单的搜索引擎。走向数据科学。https://towardsdatascience . com/create-a-simple-search-engine-using-python-412587619 ff 5
https://www.kaggle.com/c/nlp-getting-started
【6】https://en.wikipedia.org/wiki/Naive_Bayes_classifier

语言处理的文本表示介绍—第 1 部分

原文:https://towardsdatascience.com/introduction-to-text-representations-for-language-processing-part-1-dc6e8068b8a4?source=collection_archive---------13-----------------------

Unsplash 上由 Jaredd Craig 拍照

计算机是如何理解和解释语言的?

计算机在处理数字时很聪明。它们在计算和解码模式方面比人类快很多个数量级。但是如果数据不是数字呢?如果是语言呢?当数据是字符、单词和句子时会发生什么?我们如何让计算机处理我们的语言?Alexa、Google Home &很多其他智能助手是如何理解&回复我们的发言的?如果你正在寻找这些问题的答案,这篇文章将是你走向正确方向的垫脚石。

自然语言处理是人工智能的一个子领域,致力于使机器理解和处理人类语言。大多数自然语言处理(NLP)任务的最基本步骤是将单词转换成数字,以便机器理解和解码语言中的模式。我们称这一步为文本表示。这一步虽然是迭代的,但在决定机器学习模型/算法的特征方面起着重要作用。

文本表示可以大致分为两部分:

  • 离散文本表示
  • 分布式/连续文本表示

本文将关注离散文本表示&我们将深入研究一些基本 Sklearn 实现中常用的表示。

离散文本表示:

这些表示中,单词由它们在字典中的位置的对应索引来表示,该索引来自更大的语料库。

属于这一类别的著名代表有:

  • 一键编码
  • 词袋表示法(BOW)
  • 基本 BOW 计数矢量器
  • 先进弓-TF-IDF

一键编码:

这是一种将 0 赋给向量中所有元素的表示形式,只有一个元素的值为 1。该值表示元素的类别。

例如:

如果我有一个句子,“我爱我的狗”,句子中的每个单词将表示如下:

I → [1 0 0 0], love → [0 1 0 0], my → [0 0 1 0], dog → [0 0 0 1]

然后,整个句子表示为:

sentence = [ [1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1] ]

一键编码背后的直觉是每个比特代表一个可能的类别&如果一个特定的变量不能归入多个类别,那么一个比特就足以代表它

正如您可能已经理解的,单词数组的长度取决于词汇量。这对于可能包含多达 100,000 个唯一单词甚至更多的非常大的语料库来说是不可扩展的。

现在让我们使用 Sklearn 来实现它:

from sklearn.preprocessing import OneHotEncoder
import itertools# two example documents
docs = ["cat","dog","bat","ate"]# split documents to tokens
tokens_docs = [doc.split(" ") for doc in docs]# convert list of of token-lists to one flat list of tokens
# and then create a dictionary that maps word to id of word,
all_tokens = itertools.chain.from_iterable(tokens_docs)
word_to_id = {token: idx for idx, token in enumerate(set(all_tokens))}# convert token lists to token-id lists
token_ids = [[word_to_id[token] for token in tokens_doc] for tokens_doc in tokens_docs]# convert list of token-id lists to one-hot representation
vec = OneHotEncoder(categories="auto")
X = vec.fit_transform(token_ids)print(X.toarray())

输出:

[[0\. 0\. 1\. 0.]
 [0\. 1\. 0\. 0.]
 [0\. 0\. 0\. 1.]
 [1\. 0\. 0\. 0.]]

Sklearn 文档:

[## sk learn . preprocessing . onehotencoder-sci kit-learn 0 . 23 . 1 文档

将分类特征编码为一个独热数值数组。这个转换器的输入应该是一个类似数组的…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html)

一键编码的优势:

  • 易于理解和实施

一键编码的缺点:

  • 如果类别数量非常多,特征空间会爆炸
  • 单词的矢量表示是正交的,并且不能确定或测量不同单词之间的关系
  • 无法衡量一个单词在句子中的重要性,但可以理解一个单词在句子中是否存在
  • 高维稀疏矩阵表示可能是存储器和计算昂贵的

词袋表示法

顾名思义,单词包表示法将单词放在一个“包”中,并计算每个单词的出现频率。它不考虑文本表示的词序或词汇信息

BOW 表示背后的直觉是,具有相似单词的文档是相似的,而不管单词的位置如何

基本 BOW 计数矢量器

CountVectorizer 计算一个单词在文档中出现的频率。它将多个句子的语料库(比如产品评论)转换成评论和单词的矩阵,并用每个单词在句子中的出现频率填充它

让我们看看如何使用 Sklearn 计数矢量器:

from sklearn.feature_extraction.text import CountVectorizertext = ["i love nlp. nlp is so cool"]vectorizer = CountVectorizer()# tokenize and build vocab
vectorizer.fit(text)
print(vectorizer.vocabulary_)
# Output: {'love': 2, 'nlp': 3, 'is': 1, 'so': 4, 'cool': 0}# encode document
vector = vectorizer.transform(text)# summarize encoded vector
print(vector.shape) # Output: (1, 5)
print(vector.toarray())

输出:

[[1 1 1 2 1]]

如你所见,单词“nlp”在句子中出现了两次&也在索引 3 中。我们可以将其视为最终打印语句的输出

一个词在句子中的“权重”是它的出现频率

作为 CountVectorizer 的一部分,可以调整各种参数来获得所需的结果,包括小写、strp_accents、预处理器等文本预处理参数

可以在下面的 Sklearn 文档中找到完整的参数列表:

[## sk learn . feature _ extraction . text . count vectorizer-sci kit-learn 0 . 23 . 1 文档

class sk learn . feature _ extraction . text . count vectorizer(*,input='content ',encoding='utf-8 ',decode_error='strict'…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html)

CountVectorizer 的优势:

  • CountVectorizer 还能给出文本文档/句子中单词的频率,这是一键编码所不能提供的
  • 编码向量的长度就是字典的长度

CountVectorizer 的缺点:

  • 此方法忽略单词的位置信息。从这种表述中不可能领会一个词的意思
  • 当遇到像“is,The,an,I”这样的停用词时&当语料库是特定于上下文的时,高频词更重要或提供关于句子的更多信息的直觉失效了。例如,在一个关于新冠肺炎的语料库中,冠状病毒这个词可能不会增加很多价值

高级弓

为了抑制非常高频率的单词&忽略低频率的单词,需要相应地标准化单词的“权重”

TF-IDF 表示:TF-IDF 的完整形式是术语频率-逆文档频率是 2 个因子的乘积

其中,TF(w,d)是单词“w”在文档“d”中的频率

IDF(w)可以进一步细分为:

其中,N 是文档总数,df(w)是包含单词“w”的文档的频率

TF-IDF 背后的直觉是,分配给每个单词的权重不仅取决于单词频率,还取决于特定单词在整个语料库中的出现频率

它采用上一节中讨论的 CountVectorizer 并将其乘以 IDF 分数。对于非常高频率的词(如停用词)和非常低频率的词(噪声项),从该过程得到的词的输出权重很低

现在让我们尝试使用 Sklearn 来实现这一点

from sklearn.feature_extraction.text import TfidfVectorizertext1 = ['i love nlp', 'nlp is so cool', 
'nlp is all about helping machines process language', 
'this tutorial is on baisc nlp technique']tf = TfidfVectorizer()
txt_fitted = tf.fit(text1)
txt_transformed = txt_fitted.transform(text1)
print ("The text: ", text1)# Output: The text:  ['i love nlp', 'nlp is so cool', 
# 'nlp is all about helping machines process language', 
# 'this tutorial is on basic nlp technique']idf = tf.idf_
print(dict(zip(txt_fitted.get_feature_names(), idf)))

输出:

{'about': 1.916290731874155, 'all': 1.916290731874155, 
'basic': 1.916290731874155, 'cool': 1.916290731874155, 
'helping': 1.916290731874155, 'is': 1.2231435513142097, 
'language': 1.916290731874155, 'love': 1.916290731874155, 
'machines': 1.916290731874155, 'nlp': 1.0, 'on': 1.916290731874155, 
'process': 1.916290731874155, 'so': 1.916290731874155, 
'technique': 1.916290731874155, 'this': 1.916290731874155, 
'tutorial': 1.916290731874155}

注意单词“nlp”的权重。因为它出现在所有的句子中,所以它被赋予 1.0 的低权重。同样,停用词“is”的权重也相对较低,为 1.22,因为它在给出的 4 个句子中有 3 个出现。

与 CountVectorizer 类似,可以调整各种参数来获得所需的结果。一些重要的参数(除了像小写、strip_accent、stop_words 等文本预处理参数。)是 max_df,min_df,norm,ngram_range & sublinear_tf。这些参数对输出权重的影响超出了本文的范围,将单独讨论。

您可以在下面找到 TF-IDF 矢量器的完整文档:

[## sk learn . feature _ extraction . text . tfidf vectorizer-sci kit-learn 0 . 23 . 1 文档

class sk learn . feature _ extraction . text . tfidf vectorizer(*,input='content ',encoding='utf-8 ',decode_error='strict'…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)

TF-IDF 代表的优势:

  • 简单、易于理解和解释的实施
  • 构建 CountVectorizer 来惩罚语料库中的高频词和低频词。在某种程度上,IDF 降低了我们矩阵中的噪声。

TF-IDF 代表的缺点:

  • 这个单词的位置信息仍然没有在这个表示中被捕获
  • TF-IDF 高度依赖语料库。由板球数据生成的矩阵表示不能用于足球或排球。因此,需要有高质量的训练数据

让我们总结一下

离散表示是每个单词都被认为是唯一的&根据我们上面讨论的各种技术转换成数字。我们已经看到了各种离散表示的一些重叠的优点和缺点,让我们将其作为一个整体来总结

离散表示的优点:

  • 易于理解、实施和解释的简单表示
  • 像 TF-IDF 这样的算法可以用来过滤掉不常见和不相关的单词,从而帮助模型更快地训练和收敛

离散表示的缺点:

  • 这种表现与词汇量成正比。词汇量大会导致记忆受限
  • 它没有利用单词之间的共现统计。它假设所有的单词都是相互独立的
  • 这导致具有很少非零值的高度稀疏的向量
  • 它们没有抓住单词的上下文或语义。它不认为幽灵和恐怖是相似的,而是两个独立的术语,它们之间没有共性

离散表示广泛用于经典的机器学习和深度学习应用,以解决复杂的用例,如文档相似性、情感分类、垃圾邮件分类和主题建模等。

在下一部分中,我们将讨论文本的分布式或连续文本表示&它如何优于(或劣于)离散表示。

希望你喜欢这篇文章。回头见!

编辑:该系列的第二部分:https://medium . com/@ sundareshchandran/introduction-to-text-representations-for-language-processing-Part-2-54fe 6907868

回购链接

[## SundareshPrasanna/自然语言处理的文本表示介绍

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

github.com](https://github.com/SundareshPrasanna/Introduction-to-text-representation-for-nlp/tree/master)

喜欢我的文章?给我买杯咖啡

[## sundaresh 正在创作与数据科学相关的文章,并且热爱教学

嘿👋我刚刚在这里创建了一个页面。你现在可以给我买杯咖啡了!

www.buymeacoffee.com](https://www.buymeacoffee.com/sundaresh)

语言处理的文本表示法介绍—第 2 部分

原文:https://towardsdatascience.com/introduction-to-text-representations-for-language-processing-part-2-54fe6907868?source=collection_archive---------17-----------------------

Unsplash 上由 Jaredd Craig 拍照

更好地表现文本和语言的高级技术

之前的文章中,我们讨论了将文本输入机器学习或人工智能算法的离散文本表示。我们学习了一些技术,它们的工作原理,它们各自的优点和缺点。我们还讨论了离散文本表示的缺点&它如何忽略了单词的定位&没有试图解释单词的相似性或内在含义。

在本文中,我们将研究文本的分布式文本表示&它如何解决离散表示的一些缺点。

分布式文本表示:

分布式文本表示是指一个单词的表示与另一个单词不独立或不互斥,并且它们的配置通常表示数据中的各种度量和概念。所以关于一个单词的信息沿着它所代表的向量分布。这不同于离散表示,在离散表示中,每个单词都被认为是唯一的&彼此独立。

一些常用的分布式文本表示有:

  • 共生矩阵
  • Word2Vec
  • 手套

共生矩阵:

同现矩阵,顾名思义,考虑的是彼此邻*的实体的同现。使用的实体可以是一个单词,可以是一个双字母组合,甚至是一个短语。主要地,单个字被用于计算矩阵。它帮助我们理解语料库中不同单词之间的关联。

让我们看一个使用前一篇文章中讨论的 CountVectorizer 的例子&将其转换为连续表示,

from sklearn.feature_extraction.text import CountVectorizerdocs = ['product_x is awesome',
        'product_x is better than product_y',
        'product_x is dissapointing','product_y beats product_x by miles', 
'ill definitely recommend product_x over others']# Using in built english stop words to remove noise
count_vectorizer = CountVectorizer(stop_words = 'english')
vectorized_matrix = count_vectorizer.fit_transform(docs)# We can now simply do a matrix multiplication with the transposed image of the same matrix
co_occurrence_matrix = (vectorized_matrix.T * vectorized_matrix)
print(pd.DataFrame(co_occurrence_matrix.A, 
                   columns=count_vectorizer.get_feature_names(),
                   index=count_vectorizer.get_feature_names()))

输出:

awesome  beats  better  definitely  dissapointing  ill  miles  \\
awesome              1      0       0           0              0    0      0   
beats                0      1       0           0              0    0      1   
better               0      0       1           0              0    0      0   
definitely           0      0       0           1              0    1      0   
dissapointing        0      0       0           0              1    0      0   
ill                  0      0       0           1              0    1      0   
miles                0      1       0           0              0    0      1   
product_x            1      1       1           1              1    1      1   
product_y            0      1       1           0              0    0      1   
recommend            0      0       0           1              0    1      0                  product_x  product_y  recommend  
awesome                1          0          0  
beats                  1          1          0  
better                 1          1          0  
definitely             1          0          1  
dissapointing          1          0          0  
ill                    1          0          1  
miles                  1          1          0  
product_x              5          2          1  
product_y              2          2          0  
recommend              1          0          1

每个单词的表示是它在共现矩阵中对应的行(或列)

如果我们想了解与 product_x 相关的单词,我们可以过滤该列,并分析正在与 product_y &进行比较的 product_x 与它相关的正面形容词比负面形容词多。

优势:

  • 寻找单词关联的简单表示法
  • 与离散技术不同,它考虑句子中单词的顺序
  • 这种方法产生的表示是全局表示。也就是说,它使用整个语料库来生成表示

缺点:

  • 类似于 CountVectorizer & TF-IDF 矩阵,这也是一个稀疏矩阵。这意味着它的存储效率不高&在上面运行计算效率很低
  • 词汇表越大,矩阵越大(不可扩展到大词汇表)
  • 使用这种技术并不能理解所有的单词联想。在上面的例子中,如果你查看 product_x 列,有一行名为 beats。在这种情况下,仅通过查看矩阵无法确定 beats 的上下文

Word2Vec

Word2Vec 是一个著名的表示单词嵌入的算法。它是由托马斯·米卡洛夫于 2013 年在研究论文《向量空间中单词表示的高效估计》中开发的

这是一种基于预测的单词表示方法,而不是基于计数的技术,如共生矩阵

单词嵌入是单词的向量表示。每个单词由固定的向量大小表示,同时捕捉其与其他单词的语义&句法关系

word2vec 的架构是一个浅层的单隐层网络。隐藏层的权重是单词的嵌入&我们通过损失函数(正常的反向投影)来调整它

这种架构类似于自动编码器,其中有一个编码器层和一个解码器层,中间部分是输入的压缩表示,可用于降维或异常检测用例。

word2vec 通过两种方法/技术构建矢量表示:

  • CBOW —尝试在周围单词的上下文中预测中间的单词。因此,简单来说,它试图填补空白,即在给定的上下文/周围单词的情况下,什么单词更适合。数据集越小,效率越高。与 Skip-Gram 相比,训练时间更短
  • Skip-Gram —尝试从目标单词预测周围的上下文单词(与 CBOW 相反)。倾向于在较大的数据集中表现得更好,但需要更长的训练时间

Word2vec 能够使用简单的矢量算法捕获单词之间的多种相似度。像“男人对女人就像国王对王后”这样的模式可以通过像“国王”这样的算术运算获得——“男人”+“女人”=“王后”,其中“王后”将是单词本身最接*的向量表示。它还能够处理句法关系,如现在时和过去时,以及语义关系,如国家与首都的关系

让我们看看使用 gensim 的 word2vec 实现

# pip install --upgrade gensim or conda install -c conda-forge gensim# Word2Vec expects list of list representation of words, the outer list represents
# the sentence, while the inner list represents the individual words in a sentence
# Ex: ["I love NLP", "NLP is awesome"] -> [["I", "love", "NLP"], ["NLP", "is", "awesome"]]import gensim
sentences = ["ML is awesome", "ML is a branch of AI", "ML and AI are used interchangably nowadays", 
             "nlp is a branch and AI", "AI has fastforwarded nlp",
             "RL is also a branch of AI", "word2vec is a high dimensional vector space embedding",
            "word2vec falls under text representation for nlp"]# Preprocessing sentence to convert to format expected by w2v
sentece_list=[]
for i in sentences:
    li = list(i.split(" "))
    sentece_list.append(li)print(sentece_list)# Training Word2Vec with Skip-Gram (sg=1), 100 dimensional vector representation,
# with 1 as min word count for dropping noise terms, 4 parallel workers to run on
# Window of 4 for computing the neighbours & 100 iterations for the model to converge
model = gensim.models.Word2Vec(Bigger_list, min_count=1, 
				workers=4, size = 100, iter=100, sg=1, window=4)model.wv['word2vec']model.wv.most_similar(positive=['word2vec'])

输出

# Sentence List
[['ML', 'is', 'awesome'],
 ['ML', 'is', 'a', 'branch', 'of', 'AI'],
 ['ML', 'and', 'AI', 'are', 'used', 'interchangably', 'nowadays'],
 ['nlp', 'is', 'a', 'branch', 'and', 'AI'],
 ['AI', 'has', 'fastforwarded', 'nlp'],
 ['RL', 'is', 'also', 'a', 'branch', 'of', 'AI'],
 ['word2vec',
  'is',
  'a',
  'high',
  'dimensional',
  'vector',
  'space',
  'embedding'],
 ['word2vec', 'falls', 'under', 'text', 'representation', 'for', 'nlp']]# 100-dimensional vector representation of the word - "word2vec"
array([-2.3901083e-03, -1.9926417e-03,  1.9080448e-03, -3.1678095e-03,
       -4.9522246e-04, -4.5374390e-03,  3.4716981e-03,  3.8659102e-03,
        9.2548935e-04,  5.1823643e-04,  3.4266592e-03,  3.7806653e-04,
       -2.6678396e-03, -3.2777642e-04,  1.3322923e-03, -3.0630219e-03,
        3.1524736e-03, -8.5508014e-04,  2.0837481e-03,  5.2613947e-03,
        3.7915679e-03,  5.4354439e-03,  1.6099468e-03, -4.0912461e-03,
        4.8913858e-03,  1.7630701e-03,  3.1557647e-03,  3.5352646e-03,
        1.8157288e-03, -4.0848055e-03,  6.5594626e-04, -2.7539986e-03,
        1.5574660e-03, -5.1965546e-03, -8.8450959e-04,  1.6077182e-03,
        1.5791818e-03, -6.2289328e-04,  4.5868102e-03,  2.6237629e-03,
       -2.6883748e-03,  2.6881986e-03,  4.0420778e-03,  2.3544163e-03,
        4.8873704e-03,  2.4868934e-03,  4.0510278e-03, -4.2424505e-03,
       -3.7380056e-03,  2.5551897e-03, -5.0872993e-03, -3.3367933e-03,
        1.9790635e-03,  5.7303126e-04,  3.9246562e-03, -2.4457059e-03,
        4.2443913e-03, -4.9923239e-03, -2.8107907e-03, -3.8890676e-03,
        1.5237951e-03, -1.4327581e-03, -8.9179957e-04,  3.8922462e-03,
        3.5140023e-03,  8.2534424e-04, -3.7862784e-03, -2.2930673e-03,
       -2.1645970e-05,  2.9765235e-04, -1.4117253e-03,  3.0826295e-03,
        8.1492326e-04,  2.5406217e-03,  3.3184432e-03, -3.5381948e-03,
       -3.1870278e-03, -2.7319558e-03,  3.0047926e-03, -3.9584241e-03,
        1.6430502e-03, -3.2808927e-03, -2.8428673e-03, -3.1900958e-03,
       -3.9418009e-03, -3.3188087e-03, -9.5077307e-04, -1.1602251e-03,
        3.4587954e-03,  2.6288461e-03,  3.1395135e-03,  4.0585222e-03,
       -3.5573558e-03, -1.9402980e-03, -8.6417084e-04, -4.5995312e-03,
        4.7944607e-03,  1.1922724e-03,  6.6742860e-04, -1.1188064e-04],
      dtype=float32)# Most similar terms according to the trained model to the word - "Word2Vec"
[('AI', 0.3094254434108734),
 ('fastforwarded', 0.17564082145690918),
 ('dimensional', 0.1452922821044922),
 ('under', 0.13094305992126465),
 ('for', 0.11973076313734055),
 ('of', 0.1085459440946579),
 ('embedding', 0.06551346182823181),
 ('are', 0.06285746395587921),
 ('also', 0.05645104497671127),
 ('nowadays', 0.0527990460395813)]

在几行代码中,我们不仅能够将单词训练和表示为向量,还可以使用一些内置的函数来使用向量运算来查找最相似的单词、最不相似的单词等。

有两种方法可以找到向量之间的相似性,这取决于它们是否被归一化:

  • 如果归一化:我们可以计算向量之间的简单点积,以确定它们有多相似
  • 如果没有归一化:我们可以使用下面的公式计算向量之间的余弦相似度

余弦相似度与余弦距离的关系

关于所有可能的参数和功能,您可以参考下面的 gensim 文档:

[## gensim:面向人类的主题建模

这个模块实现了 word2vec 系列算法,使用了高度优化的 C 例程、数据流和…

radimrehurek.com](https://radimrehurek.com/gensim/models/word2vec.html)

关于余弦相似性的更多细节,请参考下面的维基文章

[## 余弦相似性

余弦相似性是内积空间的两个非零向量之间的相似性的度量。它被定义为…

en.wikipedia.org](https://en.wikipedia.org/wiki/Cosine_similarity)

该架构的确切工作方式&训练算法&如何发现单词之间的关系超出了本文的范围&值得单独写一篇文章

原文可以在下面找到:

[## 向量空间中单词表示的有效估计

我们提出了两种新的模型架构,用于从非常大的数据中计算单词的连续向量表示…

arxiv.org](https://arxiv.org/abs/1301.3781)

优势:

  • 能够捕捉不同单词之间的关系,包括它们的句法和语义关系
  • 嵌入向量的大小很小&很灵活,不像前面讨论的所有算法,嵌入的大小与词汇量成比例
  • 由于无人监管,标记数据的人工工作更少

缺点:

  • Word2Vec 不能很好地处理词汇外的单词。它为 OOV 单词分配随机向量表示,这可能是次优的
  • 它依赖于语言单词的局部信息。一个词的语义表示只依赖于它的邻居&可能被证明是次优的
  • 新语言培训的参数不能共享。如果你想用一种新的语言训练 word2vec,你必须从头开始
  • 需要相对较大的语料库来使网络收敛(特别是如果使用 skip-gram

手套

单词表示的全局向量是 NLP 中经常使用的另一种著名的嵌入技术。这是斯坦福大学的 Jeffery Pennington、Richard Socher 和 Christopher D Manning 在 2014 年发表的一篇论文的结果。

它试图克服上面提到的 word2vec 的第二个缺点,通过学习单词的局部和全局统计来表示它。也就是说,它试图包含基于计数的技术(共现矩阵)和基于预测的技术(Word2Vec)的精华,因此也被称为用于连续单词表示的混合技术

在手套中,我们试图加强下面的关系

其可以被重写为,

因此,本质上,我们正在构造忠实于 P(i|j)的词向量 Vi 和 Vj,P(I | j)是从共现矩阵全局计算的统计

GloVe 的棘手部分是目标函数的推导,这超出了本文的范围。但是我鼓励你阅读这篇论文,它包含了它的推导过程,以进一步理解它是如何被转化为一个优化问题的

[## [PDF] Glove:单词表示的全局向量|语义学者

最*的学习单词向量空间表示的方法已经成功地捕获了细粒度的语义和语义

www.semanticscholar.org](https://www.semanticscholar.org/paper/Glove%3A-Global-Vectors-for-Word-Representation-Pennington-Socher/f37e1b62a767a307c046404ca96bc140b3e68cb5)

为了改变,而不是从零开始构建手套向量,让我们了解如何利用在数十亿条记录上训练的令人敬畏的预训练模型

import gensim.downloader as api# Lets download a 25 dimensional GloVe representation of 2 Billion tweets
# Info on this & other embeddings : <https://nlp.stanford.edu/projects/glove/>
# Gensim provides an awesome interface to easily download pre-trained embeddings
# > 100MB to be downloaded
twitter_glove = api.load("glove-twitter-25")# To find most similar words
# Note : All outputs are lowercased. If you use upper case letters, it will throw out of vocab error
twitter_glove.most_similar("modi",topn=10)# To get the 25D vectors
twitter_glove['modi']twitter_glove.similarity("modi", "india")# This will throw an error
twitter_glove.similarity("modi", "India")

输出:

# twitter_glove.most_similar("modi",topn=10)
[('kejriwal', 0.9501368999481201),
 ('bjp', 0.9385530948638916),
 ('arvind', 0.9274109601974487),
 ('narendra', 0.9249324798583984),
 ('nawaz', 0.9142388105392456),
 ('pmln', 0.9120966792106628),
 ('rahul', 0.9069461226463318),
 ('congress', 0.904523491859436),
 ('zardari', 0.8963413238525391),
 ('gujarat', 0.8910366892814636)]# twitter_glove['modi']
array([-0.56174 ,  0.69419 ,  0.16733 ,  0.055867, -0.26266 , -0.6303  ,
       -0.28311 , -0.88244 ,  0.57317 , -0.82376 ,  0.46728 ,  0.48607 ,
       -2.1942  , -0.41972 ,  0.31795 , -0.70063 ,  0.060693,  0.45279 ,
        0.6564  ,  0.20738 ,  0.84496 , -0.087537, -0.38856 , -0.97028 ,
       -0.40427 ], dtype=float32)# twitter_glove.similarity("modi", "india")
0.73462856# twitter_glove.similarity("modi", "India")
KeyError: "word 'India' not in vocabulary"

优势

  • 在类比任务中,它往往比 word2vec 表现得更好
  • 它在构造向量时考虑词对到词对的关系&因此与从词-词关系构造的向量相比,倾向于向向量添加更多的含义
  • 与 Word2Vec 相比,GloVe 更容易*行化,因此训练时间更短

不足之处

  • 因为它使用了共现矩阵&全局信息,所以与 word2vec 相比,它的内存开销更小
  • 类似于 word2vec,它没有解决多义词的问题,因为词和向量是一对一的关系

荣誉提名:

下面是一些高级语言模型,在掌握了上述表示法之后,应该对它们进行探索

工程与后勤管理局

从语言模型嵌入是 Matthew E. Peters 等人在 2018 年 3 月以深度语境化单词表示的名义发表的论文。

它试图通过在向量表示和它所表示的单词之间建立多对一的关系来解决 word2vec & GloVe 的缺点。也就是说,它结合了上下文并相应地改变了单词的向量表示。

它使用字符级 CNN 将单词转换为原始单词向量。这些进一步输入双向 LSTMs 进行训练。向前和向后迭代的组合创建了分别表示单词前后的上下文信息的中间单词向量。

原始单词向量和两个中间单词向量的加权和给出了最终的表示。

原始 ELMO 纸

[## 深层语境化的词汇表征

我们介绍了一种新的深度上下文化的单词表示,它模拟了(1)单词的复杂特征…

arxiv.org](https://arxiv.org/abs/1802.05365)

伯特

BERT 是谷歌 AI 团队以 BERT 的名义发表的一篇论文:2019 年 5 月出来的语言理解深度双向转换器的预训练。这是一种新的自我监督学习任务,用于预训练变压器,以便针对下游任务对其进行微调

BERT 使用语言模型的双向上下文,即它试图屏蔽从左到右和从右到左,以创建用于预测任务的中间标记,因此有术语双向。

BERT 模型的输入表示是标记嵌入、分段嵌入和位置嵌入的总和,遵循模型的掩蔽策略来预测上下文中的正确单词。

它使用一种转换网络和注意力机制,学习单词之间的上下文关系,并进行微调,以承担其他任务,如 NER 和问答配对等。

原文可以在下面找到:

[## BERT:用于语言理解的深度双向转换器的预训练

我们介绍了一种新的语言表示模型,称为 BERT,代表双向编码器表示…

arxiv.org](https://arxiv.org/abs/1810.04805)

摘要

分布式文本表示是能够处理 NLP 中复杂问题陈述的强大算法。

单独地,它们可以用于理解和探索语料库,例如,探索语料库中的单词&它们如何彼此关联。但是,当与用于解决问题陈述的监督学习模型结合时,它们的优势和重要性才真正显现出来,例如问答、文档分类、聊天机器人、命名实体识别等等。

如今,它们在猜想中被频繁地使用 CNNs & LSTMs 来求解&是许多最新成果的一部分。

希望你喜欢这个系列!

回购链接:

[## SundareshPrasanna/自然语言处理的文本表示介绍

为 SundareshPrasanna/Introduction-to-text-re presentation-for-NLP 开发创建一个帐户…

github.com](https://github.com/SundareshPrasanna/Introduction-to-text-representation-for-nlp/tree/master)

喜欢我的文章?给我买杯咖啡

[## sundaresh 正在创作与数据科学相关的文章,并且热爱教学

嘿👋我刚刚在这里创建了一个页面。你现在可以给我买杯咖啡了!

www.buymeacoffee.com](https://www.buymeacoffee.com/sundaresh)

介绍强化学习的致命问题

原文:https://towardsdatascience.com/introduction-to-the-deadly-triad-issue-of-reinforcement-learning-53613d6d11db?source=collection_archive---------21-----------------------

作者图片

当我了解深度强化学习时,我阅读了致命三合问题,但找不到任何令人满意的简单解释(除了科学论文)。因此,我写了两篇文章用直觉(因此很少用数学)解释它是什么,然后是如何处理的。

这个问题表明,当一个人试图结合TD-学习(或引导)偏离策略学习和函数逼*(如深度神经网络)时,可能会出现不稳定和发散。

强化学习问题

我认为你熟悉强化学习问题的典型表述。如果没有,请查看以下一个(或多个)来源:

[## 强化学习:什么是,算法,应用,例子

强化学习被定义为一种机器学习方法,它关注的是软件代理应该如何采取…

www.guru99.com](https://www.guru99.com/reinforcement-learning-tutorial.html)

Arxiv Insights 的视频,非常清晰完整

大卫·西尔弗的精彩讲座(每次 1.5 小时)

我将使用通常的符号。

学习价值函数

我们想要解决 RL 问题的方法是学习价值函数。特别是,我们对 Q 值函数感兴趣,对于我们所处的任何状态,以及我们选择的任何行动,都会给我们带来回报(行动有多好)。

Q 值函数给出的不是执行这个动作后获得的奖励,而是执行这个动作后,如果你遵循你的策略,你将获得的所有奖励的总和(潜在折扣),称为回报:

回报方程

使用随机ε-贪婪策略

如果代理人想知道一个动作有多好,他首先要尝试一下。这将把他带到另一个状态,在那里他可以在不同的行动之间再次选择。这个想法是:

  1. 探索:尝试许多动作
  2. 利用:更多地使用积极的高回报行为,以获得最佳策略。

因此,一个经典的方法是首先尝试完全随机的行动,这样你就可以了解每个状态下哪个行动是好的,哪个是坏的,并逐步优先考虑给你最积极回报的行动。

因此,策略在这里(在强化学习的大部分时间里)随机,这意味着它随机地行动。
注意不要将其与一致随机混淆,我这里不是说代理完全随机地选择动作,它试图以更高的概率选择好的动作而不是坏的动作,但是它必须探索、测试它不知道结果的动作,因此不能有完全确定的策略。

基于贝尔曼方程,有不同的方法来学习该函数,例如动态编程、蒙特卡罗方法和自举。

动态规划

如果你有一个精确的环境模型(例如,在一个特定的状态下执行一个特定的动作,你将获得什么样的回报和状态),你可以使用动态编程来计算你的状态和动作的值。

然而,对于有许多状态和动作的环境,或者随机的环境,获得环境的模型是非常昂贵的。因此,人们更喜欢使用蒙特卡罗技术(比如 AlphaGo 的 Deepmind)。

蒙特卡洛

使用蒙特卡罗,代理通过选择它来更新他所考虑的动作的值,然后遵循他的策略直到情节终止(它到达最终状态)。然后,它可以汇总他通过这一集获得的所有回报,并获得回报的*似值。重复这个过程足够多次将最终收敛到状态动作的真实 Q 值。

如果你有很长的一集,这也是非常昂贵的,因为你必须等待一集结束才能获得回报。

时差学习

为了找到正确的 Q 值,我们可以观察到,对于每个状态/动作对的,它应该收敛于回报(奖励的贴现总和)。状态动作/对的回报是:

  1. 这次行动获得的报酬(R)
  2. 下一个状态/动作的返回,在下一个状态中选择下一个动作后获得,由其 Q 值*似

为什么经纪人要等剧集结束?他可以做以下事情:

  1. 从状态 S,根据 Q 值(以ε-贪婪的方式)选择一个动作( a
  2. 观察奖励( R )和新状态(S’)
  3. 再次选择一个动作( a' ),观察它的 Q 值
  4. 使用这个新状态和动作的 Q 值作为剩余回报的*似:

这里,出于稳定性原因,该值用α因子逐步更新。

这是对 SARSA 算法的描述。它使用自举技术,该技术在于使用下一个值的估计来估计该值(而不是等待整个剧集)。

下图说明了这三种技术是如何工作:

大卫·西尔弗的 RL 课程 第四讲 :“无模型预测”

TD-learning 和 Monte Carlo 混合存在,它们被归入 TD( λ) 族。

q 学习

SARSA 是一种基于策略的学习技术,这意味着它遵循自己的策略来学习价值函数。另一个想法是直接使用 next 的 Q 值的最大值来计算回报。
这被称为 Q-Learning,具体如下:

  1. 从状态 S,根据 Q 值(以ε-贪婪的方式)选择一个动作( a )
  2. 观察奖励( R )和新状态(S’)
  3. 使用下一状态的最大 Q 值来更新当前 Q 值:

因此,代理使用了最佳的可能 Q 值,即使他没有采取相应的行动。这是连贯的,因为他总是选择最佳行动来结束。因此,这有助于加快学习过程。

这被称为偏离策略学习,因为你不再使用当前遵循的策略来更新你的 Q 值函数(而是一个贪婪的策略)。

政策外学习有优点也有缺点,你可以在这里查阅

函数逼*(神经网络)

当状态和动作的数量过多时,或者当在连续的环境中进化时(这意味着在计算机上是相同的),人们不能为每个可能的状态或状态-动作对创建一个价值函数。

因此,这个想法是使用函数逼*,如神经网络。然后将状态输入神经网络,并获得每个动作的 Q 值作为输出。因此,这是容易处理的,然后我们可以使用梯度上升技术将这个神经网络变成一个良好的 Q 值函数*似值,告诉我们为每张图像按下哪个按钮(或按钮组合)。

作者图片

使用*似法的一个明显的优点是,你可以得到相似状态的相似值(这似乎是一致的和有用的),但是我们将在下一篇文章中看到这一点。

致命的黑社会问题

致命的三位一体问题是这样一个事实,即自举、偏离策略学习和函数逼*的结合最终会导致很多不稳定,或者没有收敛。在下一篇文章中,我会解释为什么会发生这种情况以及如何处理。

描述统计学导论

原文:https://towardsdatascience.com/introduction-to-the-descriptive-statistics-a050b5ec99fb?source=collection_archive---------35-----------------------

约翰尼·麦克朗在 Unsplash 上的照片

对最基本和广泛使用的描述性统计方法有清晰和详细的理解

描述性统计对数据进行总结、展示和分析,使其更容易理解。如果数据集很大,从原始数据中很难看出任何意义。使用描述性统计技术,数据可以变得更加清晰,模式可能出现,一些结论可能是显而易见的。

但是描述性统计不允许我们得出超出分析部分的任何结论。它没有证实我们所做的任何假设。为此你需要学习推理统计学。我在这一页的末尾添加了一些研究推断统计学的链接。

有几种通用类型的统计方法来描述数据:

  1. 集中趋势的度量:*均值、中间值、众数
  2. 变异的度量:范围、标准偏差和四分位数范围
  3. 五个数摘要:第一个四分位数,第二个四分位数,第三个四分位数,最小值和最大值
  4. 数据的形状:对称、左偏和右偏。

在本文中,我将解释所有四种统计方法及其属性。

集中趋势测量

有三种常用的方法来表示数据集的中心。这些被称为集中趋势的度量。

它们是:

*均

中位数

方式

的意思是

这是最基本的。可能你们大多数人已经知道了。

我们计算*均值的方法是将所有值相加,然后除以值的个数。以下是一个数据集示例:

12, 18, 20, 16

*均值为= (12 + 18 +20 + 16)/4 = 16.5

数据集的*均值对极值敏感。例如,在上面的数据集中,如果还有一个这样的值:

12, 18, 20, 16, 150

*均值变为:

(12 + 18 +20 + 16 + 150)/5 = 43.2

因为一个值,*均值发生了剧烈变化。*均值变得比数据集的其余值大得多,除了 150。它并不代表整个数据集。

当数据集中存在极值时,*均值不能很好地代表整个数据集。

修整数据集的*均值将代表整个数据集。如果我们只是从上面的数据集中修剪极值数据 150,*均值将再次变为 16.5,并且它将再次表示数据集中的大部分数据。

修整极值是统计学和数据科学中的常用技术。

中值

在一组数值数据中,中位数是介于前 50%数据和后 50%数据之间的数据点。这是一个数据集,例如:

13, 19, 12, 21, 9, 15, 24, 11, 14

在找到中位数之前,我们需要对数据进行排序。对数据排序后,它变成:

9, 11, 12, 13, 14, 15, 19, 21, 24

中位数是中间点。在这个数据集中,它是 14。

如果我们还有一个数据,并且数据的数量和这个一样,那会怎么样呢?

9, 11, 12, 13, 14, 15, 19, 21, 24, 28

在这种情况下,中位数是两个中间值的*均值。

媒体是= (14 + 15)/2 = 14.5

让我们给这个数据集添加一个极值:

9, 11, 12, 13, 14, 15, 19, 21, 24, 28, 278

这个更新数据集的中位数是 15。

所以,中值对极值不敏感。

模式

众数是数据集中出现频率最高的值。

这是一个数据集示例:

23, 45, 34, 32, 45, 12, 23, 37, 45

这里 45 出现了 3 次,23 出现了 2 次,其余值出现了 1 次。所以,数据集的众数是 45。

如果所有数据在数据中只出现一次,则没有模式。

如果有更多的数字出现相同的次数,他们都是模式。如果上面的数据集被修改为:

23, 45, 34, 32, 45, 12, 23, 37, 45, 23

这里 45 和 23 都出现了 3 次。因此,23 和 45 都是数据集的模式。

如果所有数据在数据中只出现一次,则没有模式。

变化的度量

上面讨论的中心测量并不总是描述数据集和得出结论的最佳方式。比如说。这里有两个数据集:

数据 1:74,75,78,78,80

数据 2: 69,74,78,78,86

这些数据集的均值、中值和众数完全相同。请自己检查一下。

三种最常用的变化测量方法是:

范围

标准偏差

四分位间距

范围

数据集的范围是数据集的最大值和最小值之差。上面提到的数据 1 的范围是 6,数据 2 的范围是 17。所以,这给了我们更多关于数据集分布的视角。

标准差

标准差代表数据集与数据*均值的偏差。

计算这个要比前几个复杂一点。计算标准差的步骤如下:

第一步:计算*均值

第二步:取*均值的差值

第三步:取这些差值的*方并相加

第四步:将结果除以值的总数。这个数字被称为方差

第五步:求方差的*方根

标准偏差的公式如下:

让我们来算一个例子:

使用上面的数据 1:

数据 1:74,75,78,78,80

第一步:*均值= 77

第二步和第三步:我从*均值中取每个值的差,然后*方它们

计算后得出 24。

第四步:用这个数除以数据集中值的个数,得到方差。我们有五种价值观。所以,方差= 24/5 = 4.8。

第五步:取方差的*方根,得出标准差为 2.19。

如果对上面的 data 2(data 2:69,74,78,78,86)进行同样的处理,将得到 5.6。请随意自己尝试。

你可以看到标准差给出了数值分布的概念。换句话说,这些值是如何相互变化的。

数据集中的值变化越大,标准差就越大。

以下是一些与标准差相关的趋势:

  1. 对于钟形分布,99.7%的数据位于*均值两侧的 3 个标准偏差内
  2. 大约 95%的数据应该在*均值的 2 个标准偏差之内。
  3. 大约 68%的数据位于数据的一个标准偏差内。

请看这张来自维基百科的图片:

来源:维基百科

四分位数范围将在下面的“五个数摘要”部分解释,因为它与这五个数有关。

五个数摘要

这五个数字是:

第一个四分位数

将数据中最底层的 25%和最顶层的 75%分开。看看下面的例子。在下图中,Q1 是第一个四分位数。

第二个四分位数

第二个四分位数实际上是将数据中前 50%和后 50%分开的中间值。在下图中,Q2 代表第二个四分位数。

第三个四分位数

将后 75%的数据与前 25%的数据相除。Q3 代表下图中的第三个四分位数。

让我们看看这个例子。这是一个经过排序的数据集 d:

d = 33,36,38,40,41,44,49,53,56,61,66,71

这里有 12 个值。第一、第二和第三四分位数的位置如下:

让我们来计算一下。

第一个四分位数:(38 + 40)/2 = 38

第二个四分位数是:(44 + 49)/2 = 46.5

第三个四分位数是:(56 + 61)/2 = 58.5

你可能会想,我们这里有三个度量:第一、第二和第三四分位数。怎么是五数总结!

另外两个度量是最大值和最小值。

它们不言自明。我相信你知道它们是什么。

但是我们需要理解它们的含义。在此之前,我们需要了解一个更重要的术语。

【IQR】

IQR 是第三个四分位数(Q3)和第一个四分位数(Q1)之间的差值。所以,IQR 代表了中间 50%数据的变化。上述数据集的 IQR 为 58.5–38 = 20.5。

IQR 在确定极值或异常值时非常有用,我们在计算均值和中值时讨论过。

数据集的合理下限是

Q1-1.5 * IQR

数据集的合理上限是

Q3 + 1.5 * IQR

上述数据集 d 的下限是:

38–1.5 * 20.5 = 7.25

数据集 d 的上限是:

58.5 + 1.5* 20.5 = 89.25

如果您注意到,数据集中的所有值都在下限和上限的计算范围之间。因此,该数据集中没有异常值或极值。

数据的形状

数据的形状表示数据在整个范围内的分布。在统计学中有三种主要的分布类型。

对称

当低于*均值的值与高于*均值的值以相同的方式分布时,该分布称为对称分布。

这条曲线也就是我之前提到的钟形曲线。

对于对称形状的数据,*均值和中值是相同的

左倾

当大部分数据位于分布的上部时,数据集的形状是左偏的。

以下是 left_skewed 数据集的属性:

a.最小值和中值之差大于最大值和中值之差。

b.最小值和第一个四分位数之间的差值大于最大值和第三个四分位数之间的差值。

c.第一个四分位数和中位数之间的差异大于第三个四分位数和中位数之间的差异。

在左斜的形状中,尾巴位于左侧。

右倾

当大部分数据位于分布的较低部分时,该曲线是右偏曲线。

这些是右偏数据集的属性:

a.最小值和中值之差小于最大值和中值之差。

b.最小值和第一个四分位数之间的差值小于第三个四分位数和最大值之间的差值。

c.第一个四分位数和中位数之间的差值小于第三个四分位数和中位数之间的差值。

在右斜的形状中,尾巴位于右侧

结论

这些是描述性统计中最基本和最主要的度量类型。没有人再手工计算它们了。数据科学家或分析师使用 python 或 R 之类的编程语言来推导它们。这些参数每天都在研究、统计和数据科学中使用。所以,清楚地理解它们对理解数据是很重要的。

欢迎在推特上关注我,喜欢我的脸书页面。

更多阅读:

[## 置信区间的完整指南,以及 Python 中的示例

对统计学中一个非常流行的参数——置信区间及其计算的深入理解

towardsdatascience.com](/a-complete-guide-to-confidence-interval-and-examples-in-python-ff417c5cb593) [## 数据科学家使用 Python 进行假设检验的完整指南

用样本研究问题、解决步骤和完整代码清楚地解释

towardsdatascience.com](/a-complete-guide-to-hypothesis-testing-for-data-scientists-using-python-69f670e6779e) [## 使用直方图和箱线图理解数据,并举例说明

了解如何从直方图和箱线图中提取最多的信息。

towardsdatascience.com](/understanding-the-data-using-histogram-and-boxplot-with-example-425a52b5b8a6) [## 熊猫数据可视化的终极备忘单

熊猫的所有基本视觉类型和一些非常高级的视觉…

towardsdatascience.com](/an-ultimate-cheat-sheet-for-data-visualization-in-pandas-4010e1b16b5c) [## 想在 12 周内成为数据科学家?

花钱前再想一想

towardsdatascience.com](/want-to-become-a-data-scientist-in-12-weeks-3926d8eacee2) [## 成为数据科学家的一系列免费课程

链接到知名大学的高质量课程,可以免费学习。循序渐进地学习这些课程,以…

towardsdatascience.com](/series-of-free-courses-to-become-a-data-scientist-3cb9fd591739)

不变矩及其在特征提取中的应用

原文:https://towardsdatascience.com/introduction-to-the-invariant-moment-and-its-application-to-the-feature-extraction-ee991f39ec?source=collection_archive---------23-----------------------

通过真实代码理解概念

雅各布·欧文斯在 Unsplash 上的照片

介绍

首先要明白什么是不变量,什么是矩分别?在图像处理中,不变量(I)是图像的一个属性(在这种情况下是一个函数),如果我们对图像进行变换(旋转、缩放、模糊等),这个属性不会改变或者只改变一点点

如果 D 是退化算子(图像的变换函数),f(x,y)是原始图像(其中 x 和 y 是图像的像素坐标,f 的输出是像素的强度),则

(1)

通常,不变量被写成一个向量

(2)

其中 n 是我们应用于图像的变换次数。在理想条件下,给定(1 ),那么如果我们映射来自图像数据集的所有不变向量,我们将发现不同对象的不同群集,因为不同对象具有显著不同的 I 值。

不变量有很多种,每一种都有一组不同转换函数。我们都知道图像最基本的变换是旋转、缩放、*移等。不变矩是不变方法之一。它利用了某种特殊的瞬间功能。

矩(m)是函数(图像,f(x,y))到多项式基或多项式形式的投影

(3)

其中 X 和 Y 是图像在 X 轴和 Y 轴上的总像素。力矩(r)的阶数定义为

(4)

I 和 j 的一些组合具有直观的意义,例如

  • m0,0 是图像的质量

(5)

它只是所有像素强度的总和。如果图像只是一个纯黑色(这里我们认为完美的黑色像素= 0,白色= 1),那么质量为 0。

  • m1,0/m0,0 和 m0,1/m0,0 是图像的重心

(6)

(7)

比如一张大小为 20x20 的纯白图像,图像的重心在哪里?让我们编写代码来解决这个问题,因为图像是一个普通图像,图像的形状是正方形,那么 m1,0/m0,0 和 m0,1/m0,0 是相同的

的结果是 10.5 所以重心在(10.5,10.5) 。这是有道理的,一个扁*的矩形物体应该有一个重心在中间。

还有很多。中心力矩(μ)定义为

(8)

其中 x '和 y '是图像在 x 轴(m1,0/m0,0)和 y 轴(m0,1/m0,0)上的重心。所以很明显

(9)

然后归一化中心矩(η)定义为

(10)

其中λ是

(11)

不变矩有 7 个矩(ɸ),它们是使用归一化中心矩定义的,例如

(12)

(13)

(14)

(15)

(16)

(17)

(18)

我们可以将这 7 个矩(12–18)视为不变矩的 7 个特征。

特征抽出

让我们用(12–18)公式来测试等式(1)。例如,我们有这个手写的数字 2(来自 MNIST 数据集)。

angka.png

我们旋转了图片所以我们会得到

angka_rotated.png

angka_rotated2.png

angka_rotated3.png

在这种情况下,旋转图片是一个退化操作符(D) 。让我们用(12-18)来计算它们的不变矩。这是代码

对所有图像(原始图像和所有旋转后的图像)运行此代码,结果是

让我们计算原始图像angka.png与所有其他图像之间的欧几里德距离(d)。欧几里德距离的值越小,根据不变矩值物体与原始物体越相似。如果数据有 N 维(在这种情况下,我们有 7 个矩,所以有 7 维),那么

(19)

其中p bar(本例中为angka.png)为参考点,p为点。结果是

看起来最接*原始图像的值是我们将它旋转 180 度时的版本。

我们仍然不知道在这个实验背景下“相似的”ɸ有多大。我们需要比较值。让我们检查另一个数字。我们要试试 6 码的。

6.png

这个对比是

如果你注意,它看着 phi 5 到 phi 7 它的值总是相似的(接* 0)。甚至不同的数字6.png也有相似的值。

他们的欧几里德距离是

在上表中,您可以看到6.png 与原始图像相比具有明显的不变矩值,并且它是旋转变量

让我们在数据集中选取另一个数字 2。

2.png

它的不变矩值是

从这个比较中,我们得到angka.png2.png之间的d的值是0.080392465667106。它仍然比6.png小,这证明了**2.png** **6.png** 与原始图像更相似。在这种情况下,不变矩成功地区分了基于(1)中的定义给出的样本图像。

关闭

这就是我们如何利用不变矩从图像中提取特征。下一篇文章也许我会试着用不变矩来分类一张图片。另一篇文章再见。

参考

马,岳超&李,思宁&陆,魏。(2018).基于支持向量机的部分扫描低空风切变识别。机械工程进展。10.168781401775415.10.1177/1687814017754151.

http://zoi.utia.cas.cz/files/chapter_moments_color1.pdf 于 2020 年 7 月 23 日进入

R 时间序列分析导论

原文:https://towardsdatascience.com/introduction-to-time-series-analysis-with-r-a2f97650baa3?source=collection_archive---------15-----------------------

克里斯·利维拉尼在 Unsplash 上的照片

从探索,到预测。使用印度尼西亚 2002 年 12 月至 2020 年 4 月的消费者价格指数(CPI)数据

时间序列数据是以固定的时间间隔观察到的数据,可以每天、每月、每年等进行测量。时间序列有很多应用,特别是在金融和天气预报方面。在本文中,我将向您介绍如何使用 r 分析和预测时间序列数据。对于数据本身,我将为您提供一个来自印度尼西亚银行 2002 年 12 月至 2020 年 4 月的消费者价格指数(CPI)数据的示例。

行动(或活动、袭击)计划

在我们开始分析之前,我会告诉你我们必须做的步骤。步骤是这样的,

  • 首先,我们必须收集和预处理数据,并且,我们应该知道我们使用的数据的领域知识,
  • 然后,我们对时间序列进行可视化和统计分析
  • 然后,我们基于其自相关性识别完美模型
  • 然后,我们诊断模型是否满足独立性假设,最后,
  • 我们可以用这个模型来做预测

预处理数据

如前所述,我们将对印度尼西亚 2002 年 12 月至 2020 年 4 月的 CPI 数据进行时间序列分析。我们可以从印尼银行得到数据。不幸的是,我们必须首先将数据从网站复制到电子表格中,然后从中生成一个. csv 数据。数据在我们导入后是这样的,

library(tidyverse)
data <- read.csv("data.csv")
colnames(data) <- c("Time", "InflationRate")
head(data)

在进行分析之前,我们必须先对其进行预处理。尤其是在“InflationRate”列中,我们必须删除“%”符号并将其转换为数字类型,如下所示,

**# Pre-process the data**
data$InflationRate <- gsub(" %$", "", data$InflationRate)
data$InflationRate <- as.numeric(data$InflationRate)
data <- data[order(nrow(data):1), ]
tail(data)

然后,我们得到的数据会像这样,

这样,我们可以使用 ts 函数从“InflationRate”列创建一个时序对象

cpi <- ts(data$InflationRate, frequency = 12, start = c(2002, 12))

有了 cpi 变量,我们可以进行时间序列分析。

分析

首先,我们来介绍一下居民消费价格指数(CPI)。CPI 是衡量消费品在其基年的某一时刻的价格变化的指数。公式看起来像这样,

公式

每个月都会测量每个 CPI 值。这是代码和代码结果的图表,

library(ggplot2)**# Make the DataFrame**
tidy_data <- data.frame(
  date = seq(as.Date("2002-12-01"), as.Date("2020-04-01"), by = "month"),
  cpi = cpi
)
tidy_data**# Make the plot**
p <- ggplot(tidy_data, aes(x=date, y=cpi)) +
  geom_line(color="red", size=1.1) +
  theme_minimal() +
  xlab("") +
  ylab("Consumer Price Index") +
  ggtitle("Indonesia's Consumer Price Index", subtitle = "From December 2002 Until April 2020")
p**# Get the statistical summary
# Returns data frame and sort based on the CPI** tidy_data %>%
  arrange(desc(cpi))
tidy_data %>%
  arrange(cpi)

根据图表,我们看不到任何趋势或季节性模式。尽管它看起来是季节性的,但每年的高峰期不在同一个月,所以它不是季节性的。然后,这个图也没有增加或减少的趋势。因此,此图是静态的,因为数据的统计属性(如均值和方差)不会因时间而产生任何影响。

除了图表之外,我们还可以从数据中测量统计摘要。我们可以看到最大的通货膨胀发生在 2005 年 11 月,CPI 为 18.38。然后,最小通货膨胀发生在 2009 年 11 月,CPI 为 2.41。有了这些信息,我们可以得出结论,这些数据没有季节性模式。

模型识别

在我们分析了数据之后,我们就可以根据数据进行建模。在这种情况下,我们将考虑两种模型,即自回归(AR)模型和移动*均(MA)模型。在使用模型之前,我们必须根据数据的自相关性确定哪个模型最适合数据,哪个滞后适合模型。为了识别这一点,我们将制作自相关函数(ACF)图和部分自相关函数(PACF)图,如下图所示,这是代码。

acf(cpi, plot = T, main = "ACF Plot of CPI", xaxt="n")
pacf(cpi, plot = T, main = "ACF Plot of CPI", xaxt="n")

左:ACF 图,右:PACF 图

根据上面的图,我们如何为这些数据选择完美的模型。要在 AR 和 MA 模型之间进行选择,我们可以看到下面的总结:

情节解读

该总结指出,如果 ACF 曲线在滞后 p 之后变窄,PACF 曲线截止到接* 0,则 AR(p)将符合模型。然后,如果 ACF 曲线在滞后 Q 之后截止到接* 0,并且 PACF 曲线变窄,则 MA(q)模型将符合模型。如果两个图都是拖尾,那么我们可以用 ARMA(p,q)模型来拟合。对于那些仍然对 tail off 和 cut off 感到困惑的人来说,tail off 意味着值逐渐减小,而不是下降到接* 0。那么截止意味着自相关在前一个滞后之后降低到接* 0。

基于该信息,我们可以看到 ACF 图逐渐减小(变小),并且 PACF 图在滞后-1 之后减小到接* 0。因此,对于这个模型,我们将在下一步使用 AR(1)模型。

模型诊断

为了确保该模型可以用于预测和其他测量,我们必须使用 Ljung 盒测试来测试该模型。下面是实现这一点的代码,

library(FitAR)
acf(ar1$residuals)
res <- LjungBoxTest(ar1$residuals, k=2, StartLag=1)
plot(res[,3],main= "Ljung-Box Q Test", ylab= "P-values", xlab= "Lag")
qqnorm(ar1$residuals)
qqline(ar1$residuals)

左:Q 测试图,中:残差自相关,右:QQ 图

根据这些图,我们可以看到 Q-test 图的 p 值高于 0.05,ACF 图显示另一个滞后之间没有显著性,最后,我们可以看到 QQ 图几乎符合直线,因此我们可以假设这已经是正常的。因此,我们可以用模型来做预测。

预测

在我们建立模型并进行测试之后,现在我们可以使用下面的代码进行预测,

library(forecast)
futurVal <- forecast(ar1, h=10, level=c(99.5))
plot(futurVal)

这是结果,

结论

预测是我能给你看的最后一部作品。我希望,通过这个时间序列分析的学习案例,你可以根据你的问题进行时间序列分析。这篇文章只是展示了如何进行分析的基本原理,而不是解决使用 ARIMA 模型和我使用的静态数据的问题。我希望我能在以后与你分享如何分析非*稳时间序列数据。

参考文献

[1]查特吉,s .,时间序列分析使用 ARIMA 模型在 R (2018),datascienceplus.com
【2】hynd man,r . j .&Athanasopoulos,G. (2018) 预测:原理与实践 ,第二版,OTexts。

感谢您阅读我的文章,您也可以在下面查看我以前的文章:

[## 更高的准确性并不意味着更好的机器学习模型性能

我们可以定量地衡量机器学习模型的性能,但不仅仅是准确性,还有很多…

towardsdatascience.com](/greater-accuracy-does-not-mean-greater-machine-learning-model-performance-771222345e61) [## 如果我有自己的时间,我会这样学习数据科学

感觉不知所措和筋疲力尽让我在释放数据科学技能方面表现不佳。这个…

towardsdatascience.com](/this-is-how-i-will-learn-data-science-if-i-got-back-my-own-time-e9148c909ce9) [## 用 R 整理数据

为什么你应该在它上面投资更多,为什么这使你的分析变得容易得多

towardsdatascience.com](/tidy-data-with-r-f3d078853fc6)

时间序列预测简介

原文:https://towardsdatascience.com/introduction-to-time-series-forecasting-7e03c4bd83e0?source=collection_archive---------17-----------------------

介绍时间序列,以及与时间序列分析和预测相关的基本概念和建模技术。

作者图片

时间序列预测是机器学习的重要领域之一。当涉及到时间成分的预测问题时,这是非常重要的。

这些天我在做基于时间序列分析和预测的项目任务。所以,我在这个领域做了一些研究,认为这将对我和那些开始时间序列预测的人有益,以一些记录的方式做出那些发现。

本文的目的是介绍时间序列,以及与时间序列分析和预测相关的基本概念和建模技术。

什么是时间序列?

时间序列可以被定义为在规则的时间间隔内记录的一系列指标。根据频率的不同,时间序列可以是每年、每季度、每月等。

时间序列与常规回归问题有两点不同。第一个是时间相关的。在线性回归模型中,观察值是独立的,但是在这种情况下,观察值依赖于时间。还有季节性趋势,特定于特定时间范围的变化。

时间序列预测有两种方法。

  1. 单变量时间序列预测:只有两个变量,一个是时间,一个是预测的领域。
  2. 多元时间序列预测:包含多个变量,其中一个变量为时间,其他变量为多个参数。

在进行时间序列分析时,需要考虑一些特殊的特征。他们是,

1。趋势

趋势显示数据随时间增加或减少的总体趋势。

2.季节性

时间序列中的季节性是在 S 个时间段内重复的规则变化模式,其中 S 定义了该模式重复之前的时间段数。

举个例子,我们想想几年后的冰淇淋销量,会出现夏季销量高,冬季销量低的情况。因此,这种模式会在特定的年份重复出现。所以 S 应该是 12。

图片鸣谢:https://I2 . WP . com/radacad . com/WP-content/uploads/2017/07/trend seasonal . png

3.静止的

*稳性是指时间序列的统计特性,即均值、方差和协方差不随时间变化。

图片鸣谢:https://cdn . analyticsvidhya . com/WP-content/uploads/2018/09/ns5-e 1536673990684 . png

  • 在第一个图中,*均值随时间变化(增加),导致上升趋势。
  • 在第二个图中,序列中没有趋势,但是序列的方差是随时间变化的。
  • 在第三个图中,随着时间的增加,分布变得更接*,这意味着协方差随时间而变化。

图片鸣谢:https://cdn . analyticsvidhya . com/WP-content/uploads/2018/09/ns6-e 1536674898419 . png

在该图中,所有三个属性都是随时间恒定的,就像*稳时间序列一样。

我们可以用几种方法来识别时间序列是否*稳。

  1. 视觉测试,简单地通过查看每个情节来识别系列。
  2. ADF (Augmented Dickey-Fuller)测试,用于确定数列中单位根的存在。
  3. KPSS(科维亚特科夫斯基-菲利普斯-施密特-申)测验

通过差分使时间序列*稳

为了使用时间序列预测模型,首先,我们需要将任何非*稳序列转换为*稳序列。一种方法是使用差分法。简单地执行差分来去除变化的*均值。

在这种方法中,当前值减去前一个值。时间序列的复杂性导致需要进行多次差分来消除季节性。

季节差异是一个值和一个滞后值之间的差异,滞后值是 S 的倍数。

差分的正确顺序是获得*似*稳序列所需的最小差分,该序列大致具有恒定的*均值。并且 ACF 图尽可能快地达到零。

4.白噪声

图片鸣谢:https://3 qeqpr 26 caki 16 dnhd 19 SV 6 by 6v-WP engine . net DNA-SSL . com/WP-content/uploads/2017/01/White-Noise-Series-Line-plot . png

简单地说,“白色”意味着所有频率都被同等地表示,“噪声”是因为没有模式,只是随机变化。

如果一个时间序列的均值为零,方差不变,滞后之间的相关性为零,那么它就是一个白噪声。高斯白噪声、二进制白噪声和正弦白噪声是白噪声的例子。

接下来,让我们看看什么是 ACF 和 PACF 图。

自相关函数

作者图片

这概括了两个变量之间关系的强度。为此,我们可以使用皮尔逊相关系数。

皮尔逊相关系数是介于-1 和 1 之间的数字,分别表示负相关或正相关。

我们可以计算时间序列观测值与先前时间步长的相关性,称为滞后。因为相关性是用以前同一系列的值计算的,所以这被称为序列相关或自相关。

滞后时间序列的自相关图称为相关图或自相关图。

部分自相关函数

作者图片

PACF 描述了一个观察和它的滞后之间的直接关系。它通过去除中间观测值之间的关系来总结时间序列中的观测值与先前时间步的观测值之间的关系。

观测值和前一时间步观测值的自相关由直接相关和间接相关组成。这些间接相关性由在中间时间步长的观测相关性的线性函数组成。部分自相关函数消除了这些间接相关性。

现在,让我们讨论一些用于时间序列预测的模型。

AR 模型

自回归(仅 AR)模型是一种仅依赖于自身滞后的模型。

图片鸣谢:https://www . machine learning plus . com/WP-content/uploads/2019/02/Equation-1-min . png

马模型

移动*均模型是一种仅依赖于滞后预测误差的模型,即各滞后的 AR 模型的误差。

图片鸣谢:https://www . machine learning plus . com/WP-content/uploads/2019/02/Equation-2-min . png?ezimgfmt=ng:webp/ngcb1

ARMA 模型

自回归-移动*均过程是分析*稳时间序列的基本模型。ARMA 模型是关于 AR 和 MA 模型的融合。

AR 模型解释了动量效应和均值回复效应,MA 模型捕捉了白噪声条件下观察到的冲击效应。这些冲击效应可以被认为是影响观察过程的意外事件,如意外收入、战争、攻击等。

ARIMA 模型

A uto- R 过度IintegratedMovingAverage 又名 ARIMA 是一类基于其自身滞后和滞后预测误差的模型。任何显示模式且不是随机白噪声的非季节性时间序列都可以用 ARIMA 模型建模。

ARIMA 模型有三个特征:

  • p 是 AR 项的阶数,其中 Y 的滞后数用作预测值
  • q 是 MA 项的顺序,滞后预测误差的数量应达到该顺序。
  • d 是使数列*稳所需的最小差分数。

图片鸣谢:https://www . machine learning plus . com/WP-content/uploads/2019/02/Equation-4-min . png?ezimgfmt=ng:webp/ngcb1

萨里玛模型

在季节性 ARIMA 模型中,季节性 AR 和 MA 项使用数据值和误差进行预测,滞后时间是 m(季节性跨度)的倍数。

图片来源:https://miro.medium.com/max/875/0*7QNGRNyQreHmHkQp.png

非季节性术语(p,d,q) :可以用 ACF 和 PACF 图来表示。通过检查早期滞后的尖峰,ACF 指示 MA 项(q)。同样,PACF 表示 AR 项(p)。

季节术语(P、D、Q 和 m) :针对这种需要,检验滞后为 m 倍数的模式。大多数情况下,前两三个季节倍数就足够了。以同样的方式使用 ACF 和 PACF。

除了上面讨论的模型,还有一些模型,如向量自回归(VAR),ARCH/GARCH 模型,LSTMs 等。

结论

时间序列分析最重要的用途是它帮助我们根据过去预测一个变量的未来行为。所以,希望你对什么是时间序列,以及时间序列分析的基本概念有一个基本的了解。以及 AR、MA、ARIMA 和萨里玛模型的直觉。

感谢您的阅读!

参考

[1] N. Tyagi,I 时间序列分析导论:时间序列预测机器学习方法&模型 (2020),Analyticssteps.com

[2] S. Prabhakaran,machinelearningplus.com ARIMA 模型——用 Python 编写的时间序列预测完全指南

[3] J. Brownlee 自相关和偏相关的温和介绍 (2017),机器学习掌握

[4] J. Brownlee,白噪声时间序列与 Python (2017),机器学习掌握

[5] J. Brownlee,如何用 Python 创建时间序列预测的 ARIMA 模型 (2017),机器学习掌握

[6]奥泉,金融数据时间序列分析四 — ARMA 模型(2017),medium.com/auquan

迁移学习简介

原文:https://towardsdatascience.com/introduction-to-transfer-learning-c59f6f27e3e?source=collection_archive---------42-----------------------

从零开始学习迁移的综合指南

瑟奎拉在 Unsplash 上拍摄的照片

介绍

我们人类有能力将在一项任务中获得的知识转移到另一项任务中,任务越简单,利用知识就越容易。一些简单的例子是:

  • 懂数学统计→学机器学习
  • 知道如何骑自行车→学习如何骑摩托车

到目前为止,大多数机器学习和深度学习算法都是为了解决特定的任务而设计的。如果任何分布发生变化,这些算法都要重新构建,并且很难重新构建和重新训练,因为这需要计算能力和大量时间。

迁移学习是关于如何使用一个预先训练好的网络,并将其应用到我们的定制任务中,将它从以前的任务中学到的东西进行迁移。

迁移学习是我们采用 VGG 16 和 ResNet 等架构的地方,这些架构是许多架构和大量超参数调整的结果,基于他们已经了解的内容,我们将这些知识应用于新的任务/模型,而不是从零开始,这称为迁移学习。

一些迁移学习模型包括:

  • 例外
  • VGG16
  • VGG19
  • Resnet,ResnetV2
  • InceptionV3
  • MobileNet

利用迁移学习实现医学应用

在这个应用程序中,我们将检测这个人是否患有肺炎。我们使用 Kaggle 数据集进行分类。下面给出了数据集和代码的链接。

数据集链接:

[## 胸部 x 光图像(肺炎)

5,863 张图片,2 个类别

www.kaggle.com](https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia)

代码链接:

[## ajaymuktha/深度学习

github.com](https://github.com/ajaymuktha/DeepLearning/blob/master/TransferLearning/transfer-learning.ipynb)

数据集由训练集和测试集组成,子文件夹为 normal 和 pneumonia。肺炎文件夹包含患有肺炎的人的胸部 x 光图像,而正常文件夹包含正常人的图像,即没有肺部疾病。

安装 Tensorflow

如果你的 PC 或笔记本电脑没有 GPU,你可以使用 Google Colab,或者使用 Jupyter Notebook。如果您使用您的系统,请升级 pip,然后安装 TensorFlow,如下所示

tensorflow.org

导入库

调整图像大小

在这里,我们将所有的图像调整到 224224,因为我们使用 VGG16 模型,它接受 224224 大小的图像。

训练和测试路径

我们将为培训指定培训和测试路径。

导入 VGG16

这里,我们将为我们的应用程序导入 VGG16 模型权重。我们应该为模型声明一个图像大小,我们已经在上一步中完成了,参数 3 表示图像将接受 RGB 图像,即彩色图像。为了训练我们的模型,我们使用 imagenet 权重和 include_top = False 意味着它将从模型中移除最后几层。

训练层

像 VGG16、VGG19、Resnet 和其他模型已经在成千上万的图像上被训练,并且这些权重用于分类成千上万的类,所以我们使用这些模型权重来分类我们的模型,所以我们不需要再次训练模型。

班级数量

我们使用 glob 来找出我们模型中的类的数量。train 文件夹中的子文件夹数量代表了模型中的类数量。

变*

无论我们从 VGG16 得到什么输出,我们都要将其展*,我们从 VGG16 中移除了最后的层,以便我们可以保留自己的输出层。我们用问题陈述中的类别数替换最后一层。我们认为 softmax 是我们的激活函数,我们把它附加到 x 上。

模型

我们将它包装成一个模型,其中输入指的是我们从 VGG16 获得的内容,输出指的是我们在上一步中创建的输出层。

模型摘要

上图是我们模型的总结,在密集层中,我们有两个节点,因为我们有两个不同的类别肺炎正常。

Justino NetoUnsplash 上拍摄的照片

编制

我们使用类别交叉熵作为损失,adam 优化器和准确性作为度量来编译我们的模型。如果你不知道这些术语的意思,我会在文章的最后提到我博客的链接,在那里我会清楚地解释所有这些术语。

预处理

我们将在训练图像上应用一些变换以避免过度拟合,如果我们不执行,我们将在训练集和测试集的准确性之间得到很大的差异。

我们执行一些几何变换,如水*翻转图像,垂直翻转,放大,缩小和许多其他可以执行的操作,我们应用它,这样我们的模型就不会过度学习我们的训练图像。我们使用 ImageDataGenerator 类执行上述方法。

我们不为测试集应用变换,因为我们只使用它们来评估,对我们的测试集做的唯一任务是重新缩放图像,因为在训练部分,我们定义了可以馈入网络的图像的目标大小。

flow_from_directory 将把图像增强过程连接到我们的训练集。我们需要提到我们的训练集的路径。目标尺寸是应该输入神经网络的图像尺寸。批次大小被定义为一个批次中图像的数量,类别模式是明确的,因为我们只有两个输出。

现在我们定义从目录中导入测试图像的测试集。我们定义的批量大小、目标大小和班级模式与训练集中提到的相同。

符合模型

我们将拟合我们的模型,并将时期的数量声明为 5,每个时期的步骤将是训练集的长度,验证步骤将是测试集的长度。

太棒了,我们达到了大约 97.7%的准确率和 91.5%的验证准确率,这就是迁移学习的力量。希望你喜欢这篇关于迁移学习的教程。如果你想知道人工神经网络和卷积神经网络如何与应用一起工作,请查看我下面的博客:

[## 人工神经网络导论

你深度学习的第一步

towardsdatascience.com](/introduction-to-artificial-neural-networks-ac338f4154e5) [## 用 Tensorflow 构建人工神经网络

如何使用 TensorFlow 构建神经网络的分步教程

towardsdatascience.com](/building-an-ann-with-tensorflow-ec9652a7ddd4) [## 卷积神经网络简介

关于卷积神经网络如何工作的直觉

medium.com](https://medium.com/dataseries/introduction-to-convolutional-neural-networks-5a227f61dd50) [## 使用张量流的图像分类器

如何创建图像分类器的分步指南

towardsdatascience.com](/image-classifier-using-tensorflow-a8506dc21d04)

Python 中趋势过滤及其应用简介

原文:https://towardsdatascience.com/introduction-to-trend-filtering-with-applications-in-python-d69a58d23b2?source=collection_archive---------15-----------------------

从嘈杂的时间序列数据中揭示潜在趋势

内容

  1. 趋势过滤简介
  2. 趋势滤波背后的最小化问题
    惠普之间的区别& L1 趋势滤波
  3. Python 中新加坡 COE 保费的应用趋势过滤

简介

最*,我一直在做一个项目,涉及一些量化投资策略的时间序列建模。具体而言,该战略的一个关键组成部分涉及为不同的制度制定不同的投资方法。这种识别是有用的,因为当金融市场的基本动态发生变化时,在一种制度下行之有效的策略可能在另一种制度下也行不通。

举个简单的例子,众所周知,当市场陷入困境时,资产类别相关性往往会显著增加。因此,在资产配置中考虑协方差的模型将不得不相应地改变它们的假设,这必然会影响最优的投资组合配置。为了制定差异化战略,人们可以简单地识别金融市场中的两种不同机制:扩张和收缩。

为了使这种方法有用,基于制度的投资策略,尤其是中长期投资策略,需要解决两个问题:

  1. 需要考虑哪些相关制度?
  2. 我们如何根据这些制度划分不同的时间段?

一个简单而有效的制度分类是将一个时间序列分成上升期和下降期。事实上,Mulvey&Han**(2016)在他们的论文 识别经济体制:降低大学捐赠基金的下行风险&基金会 中应用了这一方法。通过进行蒙特卡罗模拟并在季度基础上确定“增长”和“收缩”制度,他们能够证明根据制度类型调整支出规则的改进的最优性,这主要通过对下行风险的积极和动态管理来实现。

然而,金融时间序列往往非常嘈杂,为了实现稳健的季度到季度制度识别,*滑是必要的。这就是趋势过滤的用武之地。

趋势过滤

趋势过滤的目标是通过过滤掉“噪音”来*滑时间序列。趋势过滤算法面临两个目标之间的权衡。首先,它希望最小化实际序列和*滑序列之间的残留“噪声”。把这想象成算法想要尽可能真实地保持原始序列。第二,它希望最大化过滤序列的*滑度,这往往与第一个目标相矛盾。

在数学上,我们的目标是最小化以下目标函数:

H-P 滤波目标函数

y 是实际时间序列,而 x 是估计的滤波时间序列。损失函数的第一部分代表最小化实际序列和拟合序列之间残差*方和的目标。损失函数的第二部分表示对*滑度的要求。Dx 捕捉每组三个点之间的*滑度。

*滑度惩罚的三维矩阵

最后,𝜆是正则化参数。可以把它看作是在我们最小化残差和最大化*滑度这两个目标之间进行权衡。我们将在后面看到𝜆如何影响过滤趋势的例子。

到目前为止展示的模型描述了趋势过滤的 Hodrick-Prescott (H-P) 版本。或者,我们可以采用 L1 趋势滤波。关键的区别是*滑的惩罚,这是从 L2 改为 L1 规范。对于那些熟悉回归的人来说,这类似于正则化套索和岭回归之间的区别。像 H-P 滤波一样,L1 滤波也有助于*滑时间序列。结果的关键区别在于,L1 滤波产生了对潜在趋势的分段线性估计。当我们稍后看应用的例子时,这将变得清楚。

数学上,目标函数现在变成:

L1 滤波目标函数

正如 L1 趋势过滤的作者解释的那样:

估计趋势斜率的扭结、打结或变化可被解释为时间序列潜在动态的突变或事件。

Mulvey & Han 实际上应用了 L1 趋势滤波算法来*滑他们的财务时间序列,这可以说更适合于季度之间的体制识别和体制变化的情况。

一个应用实例:新加坡 COE 保险费

为了说明趋势过滤的实际作用,并理解 L1 趋势过滤和惠普趋势过滤之间的区别,让我们考虑一下新加坡 COE 保费的时间序列。我正在进行的一个项目是使用多变量 LSTMs 来了解新加坡 COE 保费的动态,因此我认为使用这个时间序列来提供趋势过滤的简单介绍会很有趣。

对于下面的例子,我把保费记录作为基本的时间序列。

Python 实现

import pandas as pd
import numpy as np
import cvxpy 
import scipy
import cvxopt 
import matplotlib.pyplot as plty = pd.read_csv('coe_premium.csv')
y = y['premium'].to_numpy()
y = np.log(y)n = y.size
ones_row = np.ones((1, n))
D = scipy.sparse.spdiags(np.vstack((ones_row, -2*ones_row, ones_row)), range(3), n-2, n)

对于那些不熟悉 spdiags 的人,请参考文档 这里 了解更多细节。

在上面的代码中,我已经导入了底层的时间序列并转换为日志。然后,我定义了作为构建损失函数/目标函数的一部分的 D 矩阵。

如果您想要一份' coe_premium.csv '文件的副本来亲自尝试,请随时与我联系以获取副本,因为它实际上是我用于训练神经网络的公共数据的工程和插值版本。

我定义了一个𝜆列表进行实验,这样我们可以看到参数对估计的过滤趋势的影响。

lambda_list = 
[0, 0.1, 0.5, 1, 2, 5, 10, 50, 200, 500, 1000, 2000, 5000, 10000, 100000]

最后,我遍历𝜆的列表,首先估计过滤后的趋势,并并排绘制结果,以查看改变𝜆:的影响

solver = cvxpy.CVXOPT
reg_norm = 2fig, ax = plt.subplots(len(lambda_list)//3, 3, figsize=(20,20))
ax = ax.ravel()ii = 0for lambda_value in lambda_list: x = cvxpy.Variable(shape=n)    # x is the filtered trend that we initialize objective = cvxpy.Minimize(0.5 * cvxpy.sum_squares(y-x) 
                  + lambda_value * cvxpy.norm(D@x, reg_norm)) # Note: D@x is syntax for matrix multiplication problem = cvxpy.Problem(objective)
    problem.solve(solver=solver, verbose=False) ax[ii].plot(np.arange(1, n+1), y, , linewidth=1.0, c='b')
    ax[ii].plot(np.arange(1, n+1), np.array(x.value), 'b-', linewidth=1.0, c='r')
    ax[ii].set_xlabel('Time')
    ax[ii].set_ylabel('Log Premium')
    ax[ii].set_title('Lambda: {}\nSolver: {}\nObjective Value: {}'.format(lambda_value, prob.status, round(obj.value, 3))) ii+=1

plt.tight_layout()
plt.savefig('results/trend_filtering_L{}.png'.format(reg_norm))
plt.show()

就是这样!cvxpy 库为你做了大部分的优化工作,所以你所需要的只是这几行代码。

也就是说,选择正确的参数更像是一门艺术,而不是一门科学,这真的取决于你试图解决什么问题。因此,搜索不同的参数以了解模型输出如何相应地变化,并选择最适合您的项目目的的正则化通常很有用。

这些是惠普趋势过滤的可视化:

惠普趋势过滤结果

从上面的可视化中,我们可以看到,随着参数𝜆从 0 增加到 100,000,算法的优先级从很好地拟合原始时间序列转移到获得趋势的更*滑版本。当𝜆处于其最大值时,该算法主要集中在*滑序列上,它只是为整个序列估计一条直线(最*滑的)。另一方面,当𝜆 = 0 时,该算法完全忽略*滑,并给我们原始时间序列以最小化残差。

要获得上述过程的 L1 版本,我们只需更改以下内容:

solver = cvxpy.ECOS
reg_norm = 1

由于超出本文范围的原因,优化器(变量解算器)必须改变,因为不同的优化器处理不同类型的优化问题。

这些是 L1 趋势过滤的结果:

L1 趋势过滤结果

当我们比较 L1 趋势滤波和 H-P 趋势滤波的结果时,我们注意到三个关键结果。首先,就像在 H-P 趋势滤波中一样,增加𝜆增加了估计趋势的*滑度。第二,与 H-P 趋势滤波器不同,在估计的时间序列中有更明显的扭结,或突然更剧烈的变化。如前所述,这是因为我们改变了*滑的惩罚。这一结果背后的数学原理超出了本次讨论的范围,但对于感兴趣的人,可以在 L1 趋势过滤中找到。第三,我们注意到,当我们增加𝜆.值时,该算法比 H-P 趋势滤波更快地达到“直线”估计趋势

我希望这份关于趋势过滤的温和实用的介绍对那些对时间序列分析和预测感兴趣的人有用!

数据科学线性代数 Ep1 使用 Python 的向量和矩阵简介

原文:https://towardsdatascience.com/introduction-to-vectors-and-matrices-using-python-for-data-science-e836e014eb12?source=collection_archive---------21-----------------------

数据科学线性代数的主要组成部分入门

现在,我们已经为学习数据科学的数学奠定了基础,是时候开始学习系列的第一个主题线性代数了。这篇文章是线性代数系列的第一篇,在这篇文章中,我介绍了我们将来会用到的代数的基本组成部分。它短小精悍,重点突出。

您也可以在此按部就班地关注我:

我们将在本帖中讨论的主题:

  • 标量、向量、矩阵和张量的重要定义和符号。
  • 使用NumPy创建矢量和矩阵。
  • 转置一个矩阵(2D 阵列)并对它们进行编码。
  • 使用 NumPy 在矩阵中加法和广播

那么,让我们开始吧…

重要的定义和符号

来自 L-R:标量、向量、矩阵和张量

标量:任何单个数值都是标量,如上图所示。它只是用小写和斜体表示。例如:*n*

向量:数字(数据)数组是一个向量。您可以假设数据集中的一列是一个特征向量。

特征向量 x

向量通常用小写、斜体和粗体类型的变量(特征)名称来表示。比如:***x***

矩阵:矩阵是一个形状为 (m×n) 的二维数组,有 m 行 n 列。

m 行 n 列的矩阵

每个元素都可以通过它的行和列到达,并用下标表示。例如,A₁,₁返回第一行第一列的元素。

矩阵用大写、斜体和粗体的变量名表示。比如:***A***

张量:一般来说,一个 n 维数组,其中 n > 2 称为张量。但是矩阵或向量也是有效的张量。

使用 NumPy 创建向量和矩阵

现在我们知道了它们是如何定义的,让我们看看我们将如何使用 NumPy 来查看我们的数学运算。如果你想知道为什么是 NumPy 或者你需要一个关于 NumPy 的复习,请查看下面的链接:

[## 数据科学的数字基础

帮助您掌握正确的 Numpy 主题以开始数据科学的参考指南

towardsdatascience.com](/numpy-essentials-for-data-science-25dc39fae39)

因为 vector 是一个数组,NumPy 有各种创建数组的方法。首先,安装 NumPy 并将其导入您的工作区/环境:

import numpy as np

然后创建一个数组需要你从库中使用array()方法:

然后,您可以使用shape属性检查数组的形状:

创建一个矩阵也很简单,你只需要将一个 2D 列表传递给数组方法:

转置一个矩阵(2D 阵列)并对它们进行编码

转置一个矩阵成为一个非常重要的话题,因为它进一步有助于计算矩阵的逆矩阵和其他数据操作,其中你想要镜像你的数据帧的轴。

转置矩阵会将行向量转换为列向量,反之亦然,这由上标 T 表示:

下面是一个正方形矩阵(行数和列数相同)在轴互换后的样子:

方阵转置

如果矩阵不是正方形,这是矩阵形状的变化:

非方阵转置

换位的后续代码:

有两种转置矩阵的方法,你可以使用 T 属性或者简单地使用转置方法:

使用 T 属性

使用transpose方法

我们还可以检查矩阵(2D 阵列)的形状变化:

矩阵中的加法和广播

2 个矩阵的加法

加法只是您希望在众多操作中执行的另一个简单操作。

我们可以添加相同形状的矩阵:

A + B = C

矩阵 A 中的每个单元都与矩阵 B 中的相应元素相加,总和存储在结果矩阵 C 中的相应位置,如左图所示。

现在,你可能会问,如果我们必须将两个不同形状的矩阵相加,或者将一个标量添加到一个矩阵中,会怎么样?NumPy 已经用广播解决了这个问题:

广播

向矩阵添加标量

广播是一种通过将自身扩展到矩阵的所有元素来将标量或不同形状的向量添加到矩阵的技术。标量被添加到矩阵的每个元素中,这就是它被称为“广播”的原因。

假设我们有两个不同形状的矩阵,如下图所示:

在这种情况下,矩阵 B(较小的矩阵)会自我扩展以匹配矩阵 A(较大的矩阵)的形状,如下所示:

您可以使用这个 Google Colab 笔记本来检查其他组合并试验代码:

[## 谷歌联合实验室

标量、向量、矩阵和张量介绍。

colab.research.google.com](https://colab.research.google.com/drive/1-amF1d2wOoVxOXQRf5wKZ4yNfctyBF20?usp=sharing)

本系列的下一篇文章是关于矩阵和向量的乘法,将于下周初发表。在此之前,敬请关注 Harshit,继续学习数据科学。

Harshit 的数据科学

通过这个渠道,我计划推出几个覆盖整个数据科学领域的系列。以下是你应该订阅频道的原因:

  • 该系列将涵盖每个主题和子主题的所有必需/要求的高质量教程,如 Python 数据科学基础
  • 解释了为什么我们在 ML 和深度学习中做这些事情的数学和推导。
  • 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
  • 项目和说明实施到目前为止所学的主题。

你可以在 TwitterLinkedInInstagram 上与我联系(在那里我谈论健康和福祉。)

R 中的向量介绍

原文:https://towardsdatascience.com/introduction-to-vectors-in-r-6ccae4748f2e?source=collection_archive---------48-----------------------

学习如何使用 R 中的向量来分析您的赌博结果。学习在 R 中创建向量,命名它们,从中选择元素,并比较不同的向量。

让我们去一趟统计员天堂,也就是众所周知的拉斯维加斯!

由于 R 和你的新数据分析技能,你将学会如何提升你在牌桌上的表现,并获得一些利润。完成本教程后,您将能够轻松跟踪您的下注进度,并分析您过去的行动。

创建一个向量

Vectors 是一维数组,可以存储数值数据、字符数据或逻辑数据。它们是存储数据的简单工具。例如,你可以把你每天的收益和损失储存在赌场里。

在 R 中,用组合函数[**c()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/c) 创建一个向量。你把向量元素用逗号分隔在括号之间。例如:

numeric_vector <- c(1, 2, 3)
character_vector <- c("a", "b", "c")

一旦你在 R 中创建了这些向量,你就可以用它们来做计算。

让你试试

创建一个包含三个元素的向量:TRUEFALSETRUE(按此顺序)

解决办法

boolean_vector <- c(TRUE, FALSE, TRUE)

给你尝试(2)

在维加斯呆了一周,你还是没有赚大钱。所以,你决定开始使用你的新数据分析技能。

在开始分析之前,您决定收集上周的结果:

对于扑克:

  • 周一你赢了 140 美元。
  • 星期二你输了 50 美元。
  • 星期三你赢了 20 美元。
  • 周四你输了 120 美元。
  • 星期五你赢了 240 美元。

对于轮盘赌:

  • 周一你损失了 24 美元。
  • 星期二你输了 50 美元。
  • 星期三你赢了 100 美元。
  • 周四你损失了 350 美元。
  • 星期五你赢了 10 美元。

你只玩过扑克和轮盘赌。将赢/输分配给变量。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)# Roulette winnings from Monday to Friday
roulette_vector <- c(-24, -50, 100, -350, 10)

分配给向量的赢和输。

命名一个向量

作为一名数据分析师,对所使用的数据有一个清晰的认识是很重要的。因此,理解每个元素指的是什么是至关重要的。

在之前的练习中,我们用您这一周的奖金创建了一个向量。每个向量元素指的是一周中的某一天,但是很难区分哪个元素属于哪一天。

通过用names()函数给向量的元素命名来显示向量本身。这里有一个例子:

some_vector <- c("John Doe", "poker player"

正在使用的 names()函数示例。

这段代码首先创建一个向量some_vector,然后给这两个元素命名。第一个元素被命名为Name,而第二个元素被标记为Profession。将内容打印到控制台会产生以下输出:

第一个元素被赋予名称 name,第二个被赋予职业。

让你试试

用一周中的每一天,说出上一个练习中你的扑克和轮盘向量的元素。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)# Roulette winnings from Monday to Friday
roulette_vector <- c(-24, -50, 100, -350, 10)# Assign days as names of poker_vector
names(poker_vector) <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")# Assign days as names of roulette_vector
names(roulette_vector) <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")

扑克和轮盘赌工作周每天的收益现在都贴上了标签。

给你尝试(2)

在前面的练习中,键入和重新键入信息(如一周中的每一天)可能会令人厌烦和沮丧。有一种更有效的方法可以做到这一点,即把一周中的日子向量分配给一个变量

就像您处理扑克和轮盘赌收益一样,您也可以创建一个包含星期几的变量。这样,您可以使用和重复使用它。

创建一个包含一周中各天的向量。使用这个向量来设置你的扑克和轮盘向量的名称。您将获得与上一个练习相同的输出。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)# Roulette winnings from Monday to Friday
roulette_vector <- c(-24, -50, 100, -350, 10)# The variable days_vector
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")# Assign the names of the day to roulette_vector and poker_vector
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector

使用向量来指定一周中的日期是一种更有效的方法。

计算总奖金

现在您已经有了扑克和轮盘赌的收益名称,您可以开始一些数据分析了。

您希望了解以下类型的信息:

  • 你一周内每天的总盈利或亏损是多少?
  • 你这一周总共损失了多少钱?
  • 你是在玩扑克还是轮盘赌赢钱/输钱?

为了得到答案,你必须对向量进行算术运算。

如果你对 R 中的两个向量求和,它取元素的和。例如,以下三个语句完全等效:

c(1, 2, 3) + c(4, 5, 6)
c(1 + 4, 2 + 5, 3 + 6)
c(5, 7, 9)

您也可以使用代表向量的变量进行计算:

a <- c(1, 2, 3) 
b <- c(4, 5, 6)
c <- a + b

让你试试

总日利润是每天在扑克上实现的利润/损失和每天在轮盘上实现的利润/损失的总和。

给一个变量分配你每天总共赢了/输了多少钱(扑克和轮盘)。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Assign to total_daily how much you won/lost on each day
total_daily <- poker_vector + roulette_vector# Print the total won/lost per day
total_daily

给你尝试(2)

基于之前的分析,看起来你有好有坏的日子。你这一周可能总共损失了多少钱?

要回答这个问题,使用函数[**sum()**](https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/sum)。它计算一个向量的所有元素的和。例如,要计算您玩扑克输/赢的钱的总数:

total_poker <- sum(poker_vector)

计算你用轮盘赌赢/输的钱的总数。

在你有了轮盘和扑克的总数之后,计算一周所有的收益/损失的总和。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Total winnings with poker
total_poker <- sum(poker_vector)# Total winnings with roulette
total_roulette <- sum(roulette_vector)# Total winnings overall
total_week <- total_poker + total_roulette# Print out total_week
total_week

轮盘赌和扑克的总数是一周所有收益和损失的总和。

看起来你这个星期输了钱。

比较总奖金

看起来你在赔钱。你需要更深入的分析来调整你的策略。

有没有可能你在一个游戏里比另一个游戏里强?也许你在扑克中的总收益比在轮盘赌中的总收益高。

让你试试

像上一个练习一样计算扑克和轮盘赌的总收益。通过比较,检查您在扑克中的总收益是否高于轮盘赌。打印出比较的结果。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Calculate total gains for poker and roulette
total_poker <- sum(poker_vector)# Check if you realized higher total gains in poker than in roulette
total_poker > total_roulette

使用>运算符检查您从扑克中获得的总收益是否大于从轮盘中获得的总收益。

看起来你应该专注于扑克。

向量选择:好时光

看来你比轮盘赌更擅长玩扑克。

让我们调查一下你在工作周开始和结束时的表现。你确实在周末喝了几杯“假期”酒…

选择单个元素

为了研究这一点,您将只关注选择的total_vector。换句话说,我们的目标是选择向量的特定元素。要选择向量的元素,可以使用方括号(矩阵、数据框等也是如此)。在方括号之间,指示要选择的元素。例如,要选择向量的第一个元素,可以使用poker_vector[1]。要选择第二个元素,请使用poker_vector[2],其余元素依此类推。请注意,第一个元素的索引是 1,而不是 0(与许多其他编程语言一样)。

选择范围(方法 1)

让我们来分析一下你周中的成绩。

要从向量中选择多个元素,请使用方括号中的向量来指示应该选择哪些元素。例如,要选择一周的第一天和第五天,请使用方括号中的向量c(1,5)poker_vector[c(1,5)]会给出poker_vector的第一个和第五个元素。

选择范围(方法 2)

另一种方法是将选择向量定义为一个范围。也就是c(2,3,4)可以缩写成2:4。然后,我们可以使用poker_vector[2:4]来查找周中的结果。

选择范围(方法 3)

您也可以使用向量元素的名称(例如,星期一、星期二等)而不是它们的数字位置来选择元素。例如,poker_vector["Monday"]将选择名为"Monday"的元素。这是poker_vector的第一个元素,因为"Monday"是第一个元素的名称。

让你试试

将周三的扑克结果赋给一个变量。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Defined a new variable based on a selection
poker_wednesday <- poker_vector[3]

由于周三是工作周的第三天,我们将使用指数 3。

给你尝试(2)

将星期二、星期三和星期四的扑克结果赋给一个变量。

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Define a new variable based on a selection (Method 1)
poker_midweek <- poker_vector[c(2,3,4)]# Method 2 - abbreviating the vector range
poker_midweek <- poker_vector[2:4]# Method 3 - using the names of the elements
poker_midweek <- poker_vector[c("Tuesday", "Wednesday", "Thursday")]

星期二、星期三和星期四对应于指数 2、3 和 4。

我们本可以使用 2:4,而不是 c(2,3,4)。向量 2:4 放在方括号中,以选择元素 2 到 4。

可以使用元素名称代替数字来选择元素。

通过比较选择—步骤 1

R 已知的(逻辑)比较运算符有:

  • <不到
  • >对于大于
  • <=小于或等于
  • >=对于大于或等于
  • ==为彼此*等
  • !=因彼此不相等

我们可以在向量上使用这些比较运算符。举个例子,

> c(4, 5, 6) > 5
[1] FALSE FALSE TRUE

如果比较运算符规定的条件是TRUEFALSE,该命令测试向量的每个元素。在示例中,这将检查向量的每个元素是否都大于 5。

让你试试

检查扑克向量中的哪些元素是正的(即> 0)。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Which days did you make money on poker?
selection_vector <- poker_vector > 0# Print out selection_vector
selection_vector

我们得到一个逻辑向量,告诉我们在工作周中什么时候在扑克上赚了钱(标记为 TRUE)。

比较选择—第二部分

使用比较将使您的数据分析更容易。你可以简单地要求 R 只返回那些你在扑克中实现正回报的日子,而不是选择一部分日子来调查你自己(像以前一样,你在星期二、星期三和星期四之间选择)。

使用selection_vector <- poker_vector > 0,你可以找到你有正扑克回报的日子。假设你不仅想知道你赢的那几天,还想知道你在那几天赢了多少。

您可以通过将selection_vector放在poker_vector后面的方括号中来选择所需的元素:

poker_vector[selection_vector]

当您传递一个方括号中的逻辑向量时,r 知道该怎么做:它只会选择与selection_vector中的TRUE相对应的元素。

让你试试

将您在有利可图的扑克日赢得的金额分配给一个变量。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Which days did you make money on poker?
selection_vector <- poker_vector > 0# Select from poker_vector these days
poker_winning_days <- poker_vector[selection_vector]

我们得到一个向量,其中只有我们的获胜日及其相应的扑克收益。

给你尝试(2)

就像你玩扑克一样,确定哪一天你在轮盘赌上实现了正回报。创建一个变量,包含轮盘赌的正奖金。

解决办法

# Poker winnings from Monday to Friday
poker_vector <- c(140, -50, 20, -120, 240)
roulette_vector <- c(-24, -50, 100, -350, 10)
days_vector <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
names(poker_vector) <- days_vector
names(roulette_vector) <- days_vector# Which days did you make money on roulette?
selection_vector <- roulette_vector > 0# Select from poker_vector these days
roulette_winning_days <- roulette_vector[selection_vector]

轮盘赌只有周三和周五有正收益。

笔记

所有图片,除非特别注明,均归作者所有。横幅图像是使用 Canva 创建的。

Yellowbrick 简介:可视化机器学习模型预测的 Python 库

原文:https://towardsdatascience.com/introduction-to-yellowbrick-a-python-library-to-explain-the-prediction-of-your-machine-learning-d63ecee10ecc?source=collection_archive---------10-----------------------

您将 f1 分数提高到了 98%!但这是否意味着你的模型表现更好呢?

照片由 Unsplash 上的 Dainis Graveris 拍摄

动机

恭喜你!您刚刚训练了一名模特,并将 f1 分数提高到 98%!但这到底意味着什么呢?f1 分数的提高是否表明你的车型表现更好?

你知道 f1-score 是召回率和精确度之间的调和,但是在正面预测中有多少是错误的呢?负面预测中有多少是错误的?

如果你想优化你的机器学习模型,将 f1 分数提高到 99%,你应该重点提高哪个类别才能提高 1%?

获得这些见解将有助于您了解您的机器学习结果,并知道您应该采取哪些措施来改进模型。理解机器学习的最好方法之一是通过情节。这时黄砖就变得有用了。

什么是 Yellowbrick?

Yellowbrick 是一个机器学习可视化库。本质上,Yellowbrick 使您更容易:

  • 选择功能
  • 调谐超参数
  • 解释你的模型的分数
  • 可视化文本数据

能够用图分析数据和模型将使您更容易理解您的模型,并找出增加对您的目标有意义的分数的后续步骤。

在本文中,我们将通过一个分类问题来了解 yellowbrick 提供了哪些工具来帮助您解释分类结果。

要安装 Yellowbrick,请键入

pip install yellowbrick

我们将使用占有率,即用于从温度、湿度、光线和 CO2 进行二元分类(房间占有率)的实验数据。地面实况占用率是从每分钟拍摄的带时间戳的照片中获得的。

将数据可视化

等级特征

数据中每对要素的相关程度如何?特征的二维排序利用一种每次考虑特征对的排序算法。我们使用皮尔逊相关来评分,以检测共线性关系。

根据数据,湿度与相对湿度密切相关。光线与温度密切相关。这是有意义的,因为这些特性通常是相互关联的。

阶级*衡

分类模型面临的最大挑战之一是训练数据中类别的不*衡。对于一个不*衡的类,我们的高 f1 分数可能不是一个好的评估分数,因为分类器可以简单地猜测所有多数类来获得高分。

因此,可视化类的分布是很重要的。我们可以利用ClassBalance用条形图来可视化班级的分布

似乎被归类为未被占用的数据比被占用的数据要多得多。了解了这一点,我们就可以利用分层抽样、加权等多种技术来处理阶层失衡问题,以获得更丰富的结果。

可视化模型的结果

现在我们回到这个问题:98%的 f1 分数到底意味着什么?f1 分数的提高会给你的公司带来更多的利润吗?

Yellowbrick 提供了几个工具,您可以使用它们来可视化分类问题的结果。其中一些你可能听说过或没听说过,对解释你的模型非常有帮助。

混淆矩阵

在未被占用的班级中,错误预测的百分比是多少?在被占领的阶级中,错误预测的百分比是多少?困惑矩阵有助于我们回答这个问题

看起来被占领的阶层有更高比例的错误预测;因此,我们可以尝试在被占用的班级中增加正确预测的数量来提高分数。

ROCAUC

想象一下,我们将 f1 分数提高到 99%,我们怎么知道它实际上更好呢?混淆矩阵可能会有所帮助,但除了比较两个模型在每一类中的正确预测百分比,是否有更简单的方法来比较两个模型的性能?这时 ROC AUC 将会有所帮助。

ROCAUC 图允许用户可视化分类器灵敏度和特异性之间的权衡。ROC 曲线在 Y 轴上显示真阳性率,在 X 轴上显示假阳性率。

因此,理想点是图的左上角:假阳性为零,真阳性为一。曲线下面积(AUC)越高,模型通常越好。

考虑到我们的 ROC 曲线在左上角附*,我们模型的表现确实不错。如果我们观察到不同的模型或不同的超参数导致 ROC 曲线比我们当前的更靠*左上角,我们可以保证我们的模型的性能实际上提高了。

我们如何改进模型?

现在我们了解了模型的性能,我们如何着手改进模型呢?为了改进我们的模型,我们可能需要

  • 防止我们的模型欠拟合或过拟合
  • 找到对评估者来说最重要的特征

我们将探索 Yellowbrick 提供的工具来帮助我们找出如何改进我们的模型

验证曲线

一个模型可以有许多超参数。我们可以选择准确预测训练数据的超参数。寻找最佳超参数的好方法是通过网格搜索选择这些参数的组合。

但是我们怎么知道那些超参数也会准确预测测试数据呢?绘制单个超参数对训练数据和测试数据的影响,对于确定估计量对于某些超参数值是欠拟合还是过拟合非常有用。

验证曲线可以帮助我们找到最佳点,在该点上,低于或高于该超参数的值将导致对数据的拟合不足或拟合过度****

从图中我们可以看出,虽然最大深度数越大,训练分数越高,但交叉验证分数也越低。这是有意义的,因为决策树变得越深越适合。

因此,最佳点将是交叉验证分数不降低的地方,即 1。

学习曲线

数据越多,模型性能越好吗?并非总是如此,估计量可能对方差引起的误差更敏感。这时候学习曲线是有帮助的。

一条学习 曲线显示了具有不同数量训练样本的估计器的训练分数交叉验证测试分数的关系。

从图中,我们可以看到,大约 8700 个训练实例的数量产生了最好的 f1 分数。训练实例的数量越多,f1 分数越低。

特征重要性

拥有更多功能并不总是等同于更好的模型。模型的特征越多,模型对方差引起的误差越敏感。因此,我们希望选择生成有效模型所需的最少特征。

消除特征的常用方法是消除对模型最不重要的特征。然后,我们重新评估该模型在交叉验证过程中是否确实表现得更好。

特性重要性非常适合这项任务,因为它可以帮助我们可视化模型特性的相对重要性

似乎光线是决策树分类器最重要的特征,其次是二氧化碳和温度。

考虑到我们的数据中没有太多的特征,我们不会消除湿度。但是,如果我们的模型中有许多特征,我们应该消除那些对模型不重要的特征,以防止由于方差导致的错误。

结论

恭喜你!您刚刚学习了如何创建有助于解释模型结果的图。能够理解你的机器学习结果,会让你更容易找到下一步提高其性能的措施。Yellowbrick 的功能比我在这里提到的更多。为了了解更多关于如何使用 Yellowbrick 来解释你的机器学习模型,我鼓励你查看文档这里

这个回购的源代码可以在这里找到。

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedInTwitter 上和我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

[## 如何有效地微调你的机器学习模型

发现为您的 ML 模型寻找最佳参数非常耗时?用这三招

towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## 用 Python 模块 Newspaper 和 NLTK 查找文章中的常用词

使用 newspaper3k 和 NLTK 从报纸中提取信息和发现见解的分步指南

towardsdatascience.com](/find-common-words-in-article-with-python-module-newspaper-and-nltk-8c7d6c75733) [## 使用 Python 和情感分析探索和可视化您的 LinkedIn 网络

希望优化您的 LinkedIn 个人资料?为什么不让数据为你服务呢?

towardsdatascience.com](/sentiment-analysis-of-linkedin-messages-3bb152307f84) [## 网刮电影数据库与美丽的汤

利用你的数据库预测下一部热门电影

medium.com](https://medium.com/analytics-vidhya/detailed-tutorials-for-beginners-web-scrap-movie-database-from-multiple-pages-with-beautiful-soup-5836828d23) [## cy thon——Python 函数的加速工具

当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,一个…

towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd)

商业预测入门指南

原文:https://towardsdatascience.com/introductory-guide-to-business-forecasting-bc84dc55968e?source=collection_archive---------48-----------------------

理解如何在商业分析中解释预测。

M. B. M.Unsplash 上拍摄的照片

预测不仅仅是应用时间序列模型和进行预测,也是评估业绩和做出更好商业决策的手段。在这篇博客中,我们不是关注预测背后的数学,而是关注在商业分析领域中预测是如何被解释的,以及与之相关的不同方法。从定义开始,商业预测是一种根据过去和现在的数据预测或估计未来的方法。现在,这些数据可以

  • 历史数据,例如,优步的股票价格或沃尔玛的销售数据。
  • O 来自在该领域拥有专业知识的专家的意见,可能有助于评估未来事件并确定趋势。
  • K 例如,亚马逊根据地区跟踪促销活动,以提高销售额,并提出更好的定价策略。

为什么预测?

在零售分析领域,这将有助于确定我们需要更多库存商品的月份或周数。例如,与一年中的其他时间相比,在新年期间,大多数零售商店都有更多的库存商品。

在人力资源分析领域,预测将用于确定雇用更多员工的周期,以便项目得到利用。

在生产行业,它将帮助我们了解何时推出新产品或服务,以及围绕它的预期成本和利润,从而帮助利益相关者预先制定战略规划。

预测方法

业务分析师使用两种常规方法进行预测,它们是:

  • 定量方法
  • 定性方法

基本预测方法

定量方法与历史数据(若干年的数据)以及与之相关的事实相关联。例如,NSE 股票的股价。这些方法看的是趋势,有助于回答股票是向上走还是向下走。人口、科技文化、天气的变化都被考虑在内,以便对未来做出更好的预测。现在有一些使用定量预测的经验法则,那就是:

  1. 需要至少两个季节的数据(需要 2017 年 1 月至 2019 年 12 月的数据来更好地预测 2010 年 1 月)。
  2. 预测窗口应与数据窗口相同(月预测模型不能用于预测周或日预测)。

定量分析下常用的方法有

  • 天真方法:假设下期需求与本期保持不变。例如,如果某款鞋六月份的销售额是 10 美元,那么七月份的销售额至少是 10 美元。这种方法通常用于创建一个基线模型,为未来提供一个良好的起点。
  • 移动*均法:它提供一段时间内的数据印象,在数据非常少(仅 6 -9 个月的数据)时使用。在这种方法中,我们创建了一个 x 周期的窗口,并取其中值的*均值,这给出了未来的估计值。例如,如果 1 月至 3 月的销售数据为$10-$20-$30,那么考虑 3 个月的时间窗,Apr 的估计值将为(10+20+30/3) = $20,而 5 月的估计值将为(20+30+20/3 ) = $23。
  • 指数*滑:它使用加权移动*均法,并将季节性作为一个因素来考虑。它更稳健,在有大量数据的情况下使用。例如,特定地区的服装材料需求预测取决于季节及其持续时间的年度变化。

定性方法不需要数学,但这是一种最需要咨询和意见的方法。以下是一些简单的方法:

  • 执行意见:在这种方法中,业务分析师与公司首席执行官、人力资源主管、销售&营销等主要利益相关者坐在一起。简单地听取他们对未来会发生什么的看法。这将有助于战略性地规划未来的路线图,识别风险并计划减轻风险。
  • 德尔菲法:在这种方法中,选择一组可能在不同公司工作的专家,他们的反馈以调查、访谈或电话讨论的形式进行。这将为他们如何看待未来提供一个共识。这些人的反馈将有助于创建更好的预测。
  • Salesforce composite 和市场调查: Salesforce composite 只不过是来自销售人员的估计。由于这些人在市场中有直接的可见性,从他们那里获取反馈将有助于提出更好的预测和库存管理。同样,消费者通过市场调查获得的反馈将有助于评估产品的受欢迎程度或关注领域。这将有助于对现有产品的修改进行战略规划或推出升级版本。

时间范围(预测间隔)

根据预测区间,预测可分为三大类

  1. 短期:这种预测具有以周(2-3)为单位的预测窗口,用于业务频繁变化的情况。例如,超市倾向于每周或每两周管理一次库存,这样产品就不会库存过多或不足。
  2. 中期:这种预测中的预测窗口通常从一个季度到一年不等,用于需要销售计划或预算的情况。
  3. 长期:任何一种预测间隔超过一年的预测都被称为长期预测。它用于通过在市场中引入新服务或新设施来战略性地转变组织。例如,特斯拉模型车的下一个版本是一年前在生产或营销发生之前设计的。

结束注释

我们已经看到了定量和定性预测以及它们在商业分析中的应用,但是没有一种标准化的技术可以适用于所有情况。每个组织都选择不同的方式进行预测。此外,预测的时间范围也会影响它,时间越短,预测可能越准确。例如,迪士尼乐园通过从游客那里获取关于他们的体验和期望的反馈来进行每日预测,他们使用这些反馈来制定策略,并根据天数(如工作日或周末)提出新的主题,以使未来的游客满意。

以下是一些关于商业预测的参考视频:

KNIME 和 H2O 集成入门指南

原文:https://towardsdatascience.com/introductory-guide-to-knime-and-h2o-integration-cb76c993946f?source=collection_archive---------47-----------------------

使用引导分析解决业务问题。

斯蒂芬·道森在 Unsplash 上拍摄的照片

KNIME 分析*台正在被数据分析和工程团队广泛采用。通过使用节点的简单拖放功能,工作流被创建,这形成了自动化的基础。由于易于访问并且是开源的,它在那些不属于编码背景的人中间变得越来越流行,并且仍然可以在 KNIME 的帮助下自动完成任务。

它支持数据范围的功能,如数据争论、数据可视化和借助扩展的跨*台集成,这意味着如果需要,我们可以将其他语言(Java、R、Python)编写的脚本注入工作流。其中一个方面就是集成 H2O 的功能。

什么是 H2O?

H2O 是一个机器学习*台,支持线性可伸缩性内存处理,帮助支持海量数据集构建可伸缩的 ML 模型。凭借预测分析能力和精通的 ML 算法(如 XGBOOSTDeepLearningAutoML、)的支持,它越来越多地被数据科学界采用。凭借对 RPython 以及现在 KNIME、的支持,它扩大了自己的知名度。

入门

H2O 框架隶属于 KNIME 实验室扩展。它支持广泛的功能,从转换数据到本地环境,操作操作,预测建模,统计和输出结果模型。

探索 H2o 扩展

L ets 借助它在 IRIS 数据集上构建基于 GBM 的分类器模型,从而理解了这种集成。

步骤 1:创建 H2O 上下文

T 他 H2O 上下文的作用就像实例化器允许我们在本地运行的 H2O 实例中创建对象。在它的帮助下,数据表可以转换为 H2O 框架(H2O 环境中的表)旨在实现基于 H2O 的 ML 模型。

注意:如果在本地运行,H2O 将与 KNIME 分析*台共享计算资源。

步骤 2:导入数据

为了利用高速算法,第一步总是将数据导入到“ H2O 帧”中的 H2O 实例

这是由“ H2O 表到帧节点完成的。

该节点期望一个数据输入以及一个 H2O 上下文,它只不过是“ H2O 本地上下文”节点。同样,反过来也可以使用“ H2O 框架到表”来完成,这样就可以将数据流连接到常规的 KNIME 节点。

数据准备

步骤 3:构建模型

一旦数据准备完成,我们就可以利用基于问题域的最大似然函数。H2O 支持以下算法:

  • 广义线性模型(GLM)
  • 梯度增压机(GBM)
  • 朴素贝叶斯,
  • 随机森林,
  • 主成分分析 PCA 和
  • K-均值聚类

为了简单起见,让我们考虑分类问题,其中我们需要根据其萼片和花瓣特征来识别鸢尾花的种类。

为了建立模型,我们将数据分成两部分—在 H2O 划分节点的帮助下训练和测试 (75:25)同样,我们可以在其配置中指定分区比例和采样类型。

数据划分

数据的训练部分被馈送到 GBM 学习器节点。我们可以对其进行配置,以改变算法参数,如树深度要构建的模型数量学习率以及特征包含和排除

模型结构

运行 GBM 模型,并将得到的模型参数馈送到 H2O 预测节点该节点获取测试数据并产生结果。它也可以被配置成产生单独的类别概率。

模型预测法

步骤 4:解释结果

仅仅知道得到的类概率是不够的,借助 计分器节点 混淆矩阵准确度统计也可以得到

结果生成

第五步:保存模型

模型结果可以保存为 MOJO 对象 ,然后可以用于部署。

结束注释

由此我们看到,在 KNIME 中为分类模型开发工作流是多么容易。我花了不到 3 - 4 分钟就完成了。

看看他们在这里提供的完整教程系列

KNIME _ H2O _ 机器 _ 学习

我创建的虹膜分类工作流程可以在这里找到:

克尼姆 _ H2O _ 分类

残差神经网络背后的直觉

原文:https://towardsdatascience.com/intuition-behind-residual-neural-networks-fa5d2996b2c7?source=collection_archive---------8-----------------------

了解剩余网络是如何工作的,以及它们是如何自然产生的

越深越好?(里卡多·佩拉蒂在 Unsplash 上拍摄)

深度神经网络——因为层数多而“深”,已经在许多机器学习任务中走了很长的路。但是有多深呢?再来看图像分类的流行案例: AlexNet 普及堆叠 CNN 图层。它由 5 个回旋层组成。很快,人们相信叠加更多的卷积层会带来更好的精度。 Inception 是首批通过使用非常深入的架构来展示更好性能的架构之一。它使用了 22 个卷积层。现在,为了获得更高的精度,我们能到达的最深处是什么?

让我们建立一个玩具数据集,并在其上用具有越来越多完全连接层的神经网络进行训练:

这创建了“sin 函数”数据集,创建了具有 1 到 30 个隐藏层的神经网络,在数据集上训练它们。人们可能会认为损耗值应该是递减的,然后在某一点饱和并保持不变。但是结果是不同的:

神经网络损耗随层数增加?

什么?!最初,当具有 1 个隐藏层时,我们具有高损耗,其中增加层数实际上减少了损耗,但是当超过 9 层时,损耗增加。这里我们是为 历元=20t* 进行训练,意思是更大的模型需要更多的训练历元。我们在 9 层获得最低损耗,但在此之上,损耗会增加。这里需要注意的重要一点是没有过度配合,因为这只是我们考虑的训练损失。这是否意味着层数越多,性能越差?

为什么会这样?

让我们试着直观地理解这个问题。如果一个“浅层”模型能够达到一定的精度,那么它们更深层的对应模型至少应该具有相同的精度。但是,当模型变得更深时,各层传播来自浅层的信息变得越来越困难,并且信息丢失。这被称为退化问题

ResNet 论文关于这个问题的研究:

当更深的网络能够开始收敛时,退化问题就暴露出来了:随着网络深度的增加,精度达到饱和(这可能不足为奇),然后迅速退化。

为了解决这个问题,较深的层必须直接传播来自较浅的层的信息,即身份映射。

随着更多的层被添加到网络中,从浅层传播信息变得更加困难。

在我们的例子中,9 层模型是性能最好的。在具有 30 层的模型中,也存在相同的 9 层,如果另外的 21 层传播与第 9 层相同的结果,则整个模型将具有相同的损耗。所以现在这个问题简化为让那些层学习“恒等函数”, f(x) = x

用“捷径”解决问题

我们能改变我们的网络来避免这种信息丢失吗?一个直观的解决方法是把浅层和深层直接连接起来,这样信息直接传递到深层,像 identity 函数一样。

救援的捷径!

这里我们绕过中间层,将浅层连接到深层。在我们的例子中,我们可以将第 9 层神经元直接连接到第 30 层,然后深度模型将与浅层模型一样运行。这样,信息直接作为标识函数传递。这是残留网络背后的直觉。

通过“捷径”或“跳过连接”,我们的意思是一个神经元的结果被直接添加到深层的相应神经元。当添加时,中间层将学习它们的权重为零,从而形成恒等函数。现在,让我们正式看看剩余学习。

剩余学习

g(x) 为各层学习的函数。让我们考虑 h(x) = g(x)+x ,具有跳跃连接的层。这里 +x 术语表示跳过连接。

h(x)=g(x)+x 中,+x 项将带来原始值,层 g(x)只需学习的变化,或余数或δx。无论在 g(x) 中学习什么,都只是余数,正或负,以将 x 修改为所需值。因此得名“剩余学习”。

要使 h(x) 成为恒等函数,余数 g(x) 就必须成为零函数,这是非常容易学的,即把所有的权重都设置为零。然后 h(x) = 0+x = x ,这就是所需的恒等函数。这将有助于克服退化问题。

在没有跳跃连接的情况下,必须修改权重和偏差值,以使其对应于单位函数。从头开始学习恒等函数非常困难,层中的非线性加剧了这种困难,并导致退化问题。

利用剩余学习重新公式化,如果恒等式映射是最优的,则求解器可以简单地将多个非线性层的权重驱向零,以逼*恒等式映射。

残差神经网络

让我们看看残差神经网络或“ResNets”的构建块,即残差块。

剩余块[1]

这里,跳过连接有助于将标识功能带到更深的层。在残块中,有人可能会注意到两点:

  1. 为什么在添加跳过连接后应用 relu?
  2. 为什么一个残块有两个重量层?

对于 1,如果我们在加法之前执行了 relu,那么所有的余数都是正的或零。仅学习到该标识的正增量,这显著降低了学习能力。例如在 sin 函数中,sin(3 π /2) = -1,这将需要负余数。类似地,使用 sigmoid 也将是不利的,因为它仅产生 0 到 1 内的残基。理想情况下,我们希望来自权重层(跨越任何数值范围)的无约束响应被添加到跳过层,然后应用激活以提供非线性。这有助于模型学习任何函数。

对于 2,如果我们使用单个权重层,则在 relu 之前添加跳过连接,得到 F(x) = Wx+x,这是简单的线性函数。这相当于只有一个权重层,添加跳过连接没有意义。所以我们需要在增加跳跃连接之前至少有一个非线性,这是通过使用两层来实现的。

正如我们在上一节中看到的,这些块中的权重层正在学习残差。这些模块可以堆叠得越来越多,但性能不会下降。

履行

足够的理论,让我们看看我们如何实现剩余块:

这是残差块的简单实现。我们可以多次调用这个函数来堆叠越来越多的块。在这里,我们可以在图像的情况下用卷积层代替密集层。此残差块的一个约束条件是,图层输出必须与输入具有相同的形状,但有解决方法。

让我们用实验来验证这些结果是否如我们描述的那样工作。我们逐步构建更深层次的模型,并在 sin 函数数据集上对其进行训练,类似于上面的示例,这次使用的是残差块。结果是:

ResNets 没有降级问题!

上面的图表清楚地验证了这个结果的全部意义!我们看到,当我们增加层数时,ResNet 的性能并没有下降。其实是在进步,更好!在 sin 函数数据集上训练*原网和结果网的代码在下面的 github 报告中:

[## ilango100/resnet

此储存库包含残差神经网络的 tensorflow 实现。作为比较,三个网络…

github.com](https://github.com/ilango100/resnet)

ResNet 的这一特性有助于训练非常深入的模型,产生了几个流行的神经网络,即 ResNet-50、ResNet-101 等。我们能更深入吗?瞧着吧, ResNet-1001

CIFAR-10 的结果

研究玩具数据集有助于理解 ResNet。现在,是一些真实世界数据集的时候了。上面的 github repo 有代码在 CIFAR-10 上构建和训练 ResNets 和 PlainNets 的多种配置。您可以在那里看到所有的实现细节。它是使用 Tensorflow (Keras API)构建的。

在 CIFAR-10 上的训练结果可以在这个张量板实验中得到。可以看到 PlainNet 和 ResNet 不同深度的对比:

Tensorboard 让生活更轻松!

运行名称为 网络 x 尺寸 。在“图形”选项卡中,您可以可视化网络架构。我们可以在 ResNet 模型中看到跳跃连接,而在 PlainNets 中则看不到。

ResNet 及其跳过连接

绘制精度值与网络大小的关系图,我们可以清楚地看到,对于 PlainNet,精度值随着网络大小的增加而降低,显示了我们之前看到的同样的性能下降问题。至于 ResNet,随着网络深度的增加,我们看到了准确性的提高。

规模不断扩大的网络的训练精度

看着这些图表,你可能想知道,ResNetV2 是什么。ResNetV2 是经过一些改进的 ResNet。这将是另一篇文章的主题!

结论

这里的关键要点是:

  • 神经网络中的层数越多并不总是意味着性能越好。非常深的网络往往会降低性能。
  • 残余网络通过捷径或跳过连接,通过将浅层短路到深层来解决退化问题。
  • 我们可以堆叠越来越多的剩余块,而不会降低性能。这使得能够建立非常深的网络。

参考资料:

[1],何,,,任,,【2015】

算术、几何和调和*均数的直觉

原文:https://towardsdatascience.com/intuition-of-the-arithmetic-geometric-and-harmonic-mean-74c6715e3cf6?source=collection_archive---------16-----------------------

关于概率统计的思考

什么是“*均值”,我们如何找到它?忘记公式——提高数学水*。

如何理解“*均”这个概念

公式是用来计算的,不是用来理解的

当人们教你统计概念时,你通常会得到一个等式,它是一些量的公式,比如算术*均值。公式很好,但它们是在考虑计算的情况下设计的。通常,这个方程会把未知数放在一边,所有已知量放在另一边。

像这样。

算术和几何*均公式,为计算而优化

不幸的是,这种观点并不能帮助学生很好地理解“*均值”这样的概念。因此,不难发现人们误用统计数据,例如,在金融回报数据上使用算术*均值,而几何*均值更有意义。

通过重新排列等式,您可以获得另一种视角,这使得“*均值”的概念对于不同类型的数据来说更清晰、更通用。

例如,如果我们有一些数量,我们将这些数量相加得到一个总结果(例如,今天得到 3 美元,明天得到 5 美元,得到 3+5 = 8 美元),那么我们可以使用算术*均值来告诉我们这些数量,当重复相加时,会得到相同的总结果。

算术*均值的另一种观点,更好理解

如果我们有数量要用乘以来得出最终数字(例如,股票投资组合的月回报率),那么很明显,几何*均数更合适。

几何*均数的另一种观点,更好理解

例如,如果你有 1 美元,某一天它翻倍到 2 美元,第二天,它以 8 到 16 美元的倍数增长,如果它以几何*均数增长 2 天,情况也是一样的。几何*均数 g 满足 gg=28=16,所以 g=4。

语境很重要!

重要的是要知道适当的“*均”只有在上下文中才有意义。如果让你“求 2 和 8 的*均值”,你应该不会觉得有什么意义。因为 2+8 = 5+5,所以如果是两天收到的美元的*均数,那么 2 和 8 的*均数可能是 5。但如果是日增长率,也可能是 4,因为 2 * 8 = 4 * 4。如果我们不知道这些数字是从哪里来的,我们就不知道哪个是正确的。

更难的*均值:调和*均值

什么是调和*均值,什么时候使用?

一个激励人心的例子:公路旅行的*均速度

两个人开车穿越这个国家。由于长途驾驶会很累,两人同意轮流驾驶。

下面的两个表格显示了两种可能的行程,用不同的方式划分距离和时间。问题:旅行的*均速度是多少?

(1)两个司机行驶的距离相等,但行驶的时间不同。

为了算出*均速度,我们看到一号和二号车手的速度分别是 100 和 66.666 km/h,我们取这个数字的*均值,得到 83.333 km/h 。对吗?

但也许你读过一些关于如何*均利率的东西。你知道算术*均值不正确,需要使用调和*均值。(你可以阅读维基百科关于调和*均数的页面来证实这一点)。你还记得调和*均数的公式…

…而你计算出 H = 2/(1/100+1/66.666)=80km/H

②两个司机开不同的距离,用了同样多的时间。

看到最后一个例子后,您知道不要使用算术*均值,因为“调和*均值对于计算*均比率是正确的。”

你发现*均速度是 2/(1/80 + 1/90) = 84.71 km/h

但是你很快就会发现,这其实是不正确的。这就是为什么你不应该盲目地遵循公式。

如何求*均速度

为了计算*均速度,我采用了与计算算术和几何*均值相同的方法。我构建了一个*行世界,在那里每个人都是一样的,行为也是一样的,我希望这个*行世界中的行为产生与我的数据相同的结果。如果我们想象两个司机都以*均速度驾驶,那么他们必须以什么速度驾驶才能在相同的时间内行驶相同的距离?

(1)他们需要在 12.5 小时内行驶 1000 km,所以这是 1000/12.5= 80 km/h,注意这是我们之前计算的调和*均值,还要注意两位车手行驶的距离相同。

*均速度=谐波*均值

(2)他们需要在 12 小时内走完 1020 km,所以 1020/12 = 85 km/h,注意这不是之前算出来的调和*均值。这是 80 和 90 的算术*均值,请注意,两位驾驶员驾驶的持续时间相同。

*均速度=算术*均值(?)

调和*均数什么时候合适?

人们常说调和*均数适合于求比率的*均值。甚至维基百科也声明“它适用于需要*均利率的情况。”但是我上面给出的例子在两种情况下都有比率,调和*均值不适合第二个例子。

我认为调和*均数相当于加权算术*均数,*均利率的关键问题是不同的利率如何加权。

基于公路旅行示例的下列推导,考虑下列等式。

第一行只是*均速度的直观视图。

在第二行,分子是每个司机的距离总和。你可以用量纲分析来证实这一点(L =长度,T =时间):速度有量纲 L/T,时间有量纲 T,所以速度和时间的乘积就是给出一个量纲为 L 的量,到目前为止还好吗?

如果我们现在把这些项分开,我们可以得到第三行。时间分数是无量纲的(T/T ),给出了在 iᵗʰ驾驶员的速度下花费的时间比例。它是速度的加权算术*均值,乘以时间!如果每个速度下花费的时间相等,那么它就是速度的算术*均值。请注意,示例(2)中两个驾驶员的时间相等,这就是算术*均值正确的原因。

我们现在进行第二次推导,但我们首先取所有速度的倒数,这样单位就反过来了(每小时每公里)。

第一行是从*均速度的直观角度。

第二行,我们拆分分子,但这次我们需要确保单位是时间。速度的倒数以小时/公里为单位,乘以距离就是小时的单位。

我们把分数分开得到第三行。这一次,它是倒数速度的加权*均值,以倒数速度行驶的总距离的比例进行加权。

如果我们现在让所有的 n 个距离都是相同的长度…

…那么倒数*均速度就是倒数速度的算术*均值。再次取倒数,将单位恢复为 L/T,我们得到调和*均值。

回到原来的问题:什么是调和*均数,什么时候用?

调和*均值是单位倒置的速率数据的算术*均值。什么时候用?见下文。

费率数据的实用要点

  • 幸运的是,现实世界中的许多数据集在某个维度上会有相同的值。例如,人们可能以不同的速度工作,但是他们被要求完成同样的任务,走同样的距离,等等。
  • 分子单位相同——取调和*均值。(例如,都以不同的速度行进,但距离相同)。
  • 分母单位相同—取算术*均值(例如,所有人以不同的速度行驶,但时间相同)。
  • 两个单位都不相同——使用我充实的一些想法构建了一个加权算术/调和*均值。

我希望我的想法能帮助你更批判性地思考数学和数据。

没有免费的午餐定理背后的直觉

原文:https://towardsdatascience.com/intuitions-behind-no-free-lunch-theorem-1d160f754513?source=collection_archive---------35-----------------------

由我在加拿大设计https://www.canva.com/

无论是玉米卷还是机器学习问题的完美解决方案,没有什么是免费的。

在这篇文章中,我将试图揭开与机器学习相关的“没有免费的午餐”这一概念的神秘面纱,并探讨可以在我们的数据科学之旅中帮助我们的关键要点。

背景:

  • 天下没有免费的午餐,这是一个源自 20 世纪初的释义,用来传达不可能不劳而获的观点。谚语中的“免费午餐”指的是美国酒吧以前的普遍做法,即提供“免费午餐”来吸引喝酒的顾客。
  • 这在科学、金融、经济、技术等许多领域都有应用。我们的重点是它在统计学中的应用。
  • 大卫·休谟,19 世纪最伟大的经验主义者之一,提出了这样一个问题“我们如何证明从我们所见的事物中概括出我们所未见的事物?”
  • 许多年后,David Wolpert 给出了这个问题的数学形式,并给出了“没有免费的午餐”定理,该定理限制了学习者的能力。

定理:

任何一对算法在所有可能的问题上的*均性能都是相同的。

这意味着,如果一个算法在某一类问题上表现良好,那么它必然会在所有剩余问题上的性能下降。

考虑用 F 表示的问题的样本空间。f1 是 F 的子集,在其上算法 a1 的性能优于 a2。在剩下的一组问题(F-f1)上,a2 的表现会比 a1 好。

https://creately.com/与一起制造

数学表示:

  1. 假设 X 是一个大的有限特征搜索空间。
  2. 假设 Y 是成本值或目标值的一个大的有限空间。
  3. |X|和|Y|是空间的大小。
  4. 一个目标函数或代价函数 f 由 f: X → Y 表示。
  5. f 是所有可能的目标函数的空间。
  6. f1,f2..是 f 空间中的一些目标函数。
  7. m 是取自 X 和 y 的样本量。
  8. 样品用表示

9.P(f)是每个目标函数 f 在 x 的所有特征上的概率分布。

10.P(f)取决于问题的类型和所用算法的选择。

11.使用下面的公式测量在目标函数 f 上迭代 m 次的算法 i 的性能。

12.这个定理可以翻译成下面的形式。

  • 对于任意一对算法 a1a2。

  • 研究论文中给出了这方面的数学证明,这超出了本文的范围。

这对我们有什么好处:

  • 在机器学习问题中,使用算法的思想是找出特征 X 和目标 y 之间的关系或函数映射。
  • 每种机器学习算法都对数据做出假设,并在此基础上进行归纳和预测。
  • 模型的性能取决于假设与数据中潜在模式的关联程度。
  • 意思是说,在解决数据科学中的所有问题时,没有一种算法是肤浅的。
  • 没有对底层数据的最佳了解,就没有免费的午餐(最佳预测)。数据科学家的工作是生成有洞察力的数据,并将其传递给模型,以做出更好的概括,进而做出更好的预测。
  • 了解每个算法所做的假设通常有助于我们选择正确的模型。
  • 除非我们正在寻找一个可以解决所有问题的主算法,否则我们不会关心一下子解决世界上所有的问题,而是关心一个特定的问题,并专注于选择一个性能最佳的算法,即使它在其他边缘情况或其他问题上的性能低于*均水*。

结论

机器学习模型遵循垃圾输入垃圾输出协议(即预测取决于我们训练模型的数据质量)。对这些定理进行了大量的研究,他们中的一些人可能会认为这个定理并不适用于所有情况。我们最好把注意力放在有助于我们更好地理解数据和构建最佳性能模型的点上。

注:文中提到的几点只是我对没有免费的午餐定理的看法和理解。你们中的一些人可能有不同的观点,请在评论中发表你的观点。

资源:

大卫·h·沃伯特和威廉·g·麦克雷迪于 1997 年发表的《没有免费的午餐》研究论文https://ti.arc.nasa.gov/m/profile/dhw/papers/78.pdf

[## 天下没有免费的午餐

“天下没有免费的午餐”(或者,“天下没有免费的午餐”或其他…

en.wikipedia.org](https://en.wikipedia.org/wiki/There_ain't_no_such_thing_as_a_free_lunch) [## 主算法

在我第二次阅读时,我非常喜欢和欣赏这本书。这次最大的不同是我…

www.goodreads.com](https://www.goodreads.com/book/show/24612233-the-master-algorithm)

感谢你花时间阅读这篇文章。希望对你有帮助。如果你有任何疑问,请随时联系我。

自然语言处理中伯特双向变压器的直观解释

原文:https://towardsdatascience.com/intuitive-explanation-of-bert-bidirectional-transformers-for-nlp-cdc1efc69c1e?source=collection_archive---------9-----------------------

一种理解 BERT 的直观方法——来自用于理解语言的转换器的双向编码器表示

狮式战斗机·珀奇克Unsplash 上拍摄的照片

在本帖中,我们将用直观的方式来了解 NLP 中的进步,包括 BERT。使 BERT 如此强大和受欢迎的预训练策略,以及 BERT 对大多数 NLP 任务的微调。

自然语言处理算法的发展

考虑一下,如果你想学一门新的语言,说印地语,你就很懂英语了。

第一件事是在已知语言的背景下理解新语言的每个单词的意思。你还将了解该语言的同义词和反义词,以获得更好的词汇。这将帮助你理解语义关系。这是 Word2Vec 和 中使用的基本概念

word2vec 和 GloVe word 嵌入。来源:https://nlp.stanford.edu/projects/glove/https://developers . Google . com/machine-learning/crash-course/embeddings/translating-to-a-low-dimension-space

下一步是将简单短句从英语翻译成印地语。你会听英语句子中的每个单词,然后根据训练,你会把每个单词从英语逐字翻译成印地语。这与 编码器和 中使用的概念相同。

编码器-解码器

你现在可以翻译短句,但要翻译较长的句子,你需要注意句子中的某些单词,以便更好地理解上下文。这是通过向编码器-解码器模型添加注意机制来实现的。 注意机制 让你注意到句子中特定的输入单词,以便更好地翻译,但仍然逐字阅读句子。

注意机制

您现在擅长翻译,并且希望提高翻译的速度和准确性。您需要某种并行处理,并且了解上下文以理解长期的依赖性。 变形金刚 解决了这一要求。

变形金刚(电影名)

我们来看下面的两句话

推荐信被寄到你的 地址

全球各地的领导人需要 称呼 他们在新冠肺炎的人民。

同一个词“ 地址 ”在不同的语境中有不同的含义。你需要把句子作为一个整体来看,以理解句法和语义。来自语言模型的 ELMo 嵌入查看整个句子以理解语法、语义和上下文,从而提高 NLP 任务的准确性。

你现在开始通过阅读大量文本来学习语言(迁移学习)。获得的知识现在被转移和微调,以应用于各种语言任务,如文本分类,翻译文本等。,这个模型被通用语言模型微调(ULM-Fit)

你使用变形金刚是为了速度、准确性和理解长期依赖性,也是为了从大量的词汇中学习,以便对语言有很强的理解,这种模式就是生成式预训练变形金刚(GPT) 。它只使用变压器的解码器部分。你也可以应用所学的知识(迁移学习),开始从左向右解释单词(单向)。

随着你学习语言的不同方面,你意识到接触各种文本对应用迁移学习非常有帮助。你开始阅读书籍,以建立强大的词汇和对语言的理解。当一个句子中的某些单词被屏蔽或隐藏时,那么根据你的语言知识,从左到右和从右到左阅读整个句子(双向)。您现在可以更准确地预测屏蔽词(屏蔽语言建模)。就像填空一样。也可以预测两句话什么时候有关联或者没有关联(下一句预测)。这是一个简单的工作 BERT:来自变压器的双向编码器表示。

这是对 NLP 中不同进步的直观解释。

来自变压器的双向编码器表示:BERT

BERT 旨在通过联合调节所有层中的左右上下文来预训练来自未标记文本的深度双向表示。

  • BERT 具有深度双向表示,意味着模型从左到右和从右到左学习信息。与从左到右模型或者从左到右和从右到左模型的浅层连接相比,双向模型非常强大。
  • BERT 框架分两步:预训练和微调
  • 根据从图书语料库 (800M 单词)和英语维基百科(2500m 单词)中提取的未标注数据进行预训练
  • BERT 预训练模型可以通过一个额外的输出层进行微调,以解决多个 NLP 任务,如文本摘要、情感分析、问答聊天机器人、机器翻译等。
  • BERT 的一个与众不同的特点是它的跨不同任务的统一架构。预训练的架构和用于各种下游任务的架构之间的差别很小。
  • BERT 使用掩蔽语言模型(MLM)在预训练期间使用左右上下文来创建深度双向转换器

伯特建筑

BERT 架构是一种多层双向变压器编码器。我们有两个版本的 BERT: BERT baseBERT large

BERT base 有 12 个编码器,12 个双向自关注头,1.1 亿个参数

BERT large 有 24 个编码器,带有 24 个双向自关注头和 3.4 亿个参数

BERT 是一个两步框架:预训练和微调。

“序列”是指输入给 BERT 的令牌序列,可以是单句或两句打包在一起

输入序列

每个序列的第一个标记总是唯一的分类标记【CLS】。成对的句子被打包成一个序列,并用一个特殊的符号分开。对于给定的标记,其输入表示是通过对相应的标记、段和位置嵌入求和来构建的。

输出层

除了输出层,预训练和微调都使用相同的架构。相同的预训练模型参数用于为不同的下游任务初始化模型。

预训练伯特

BERT 使用两种无监督策略:掩蔽语言模型(MLM)和下一句预测(NSP)作为预训练的一部分。

在预训练期间,BERT 模型在不同预训练任务的未标记数据上被训练。根据从图书语料库 (8 亿字)和英语维基百科(2500 万字)中提取的未标记数据对 BERT 进行预训练

掩蔽语言模型(MLM)

BERT 中的双向条件允许每个单词间接“看到自己”为了训练深度双向表示,我们使用 MLM 随机屏蔽 15%的输入标记,然后预测这些屏蔽的标记。

MLM 就像填空一样,我们随机屏蔽 15%的输入标记来预测原始词汇 id在 BERT 中,我们预测屏蔽的令牌,而不是重建整个输入。我们仅在预训练中使用[MASK]标记,它们不用于微调,因为它们会造成不匹配。为了缓解这一问题,我们并不总是用实际的[MASK]标记替换被屏蔽的单词。

在随机选择的 15%屏蔽令牌中,

  • 80%的时候,我们用[MASK]标记替换屏蔽词
  • 10%的时候,用随机令牌替换
  • 剩余 10%的时间,是不变的。

MLM 也被称为完形填空任务

伯特与 MLM 和 NSP 一起进行赛前训练

下一句预测(NSP)

NSP 用于在预训练期间理解句子之间的关系。当我们有两个句子 A 和 B 时,B 有 50%的时间是跟在 A 后面的实际下一个句子,标记为 IsNext ,有 50%的时间是从标记为 NotNext 的语料库中随机抽取的句子。

NSP 有助于自然语言处理任务,如问答(QA)和自然语言推理(NLI)。

微调伯特

有两种策略可以应用于下游任务的预训练语言表示:基于特征和微调。

伯特使用微调方法。微调方法效果更好,因为它允许通过反向传播来调整语言模型。

为了微调 BERT 模型,我们首先使用预训练的参数进行初始化,然后使用来自下游任务的标记数据对所有参数进行微调。

每个下游任务都有单独的微调模型,但用相同的预训练参数进行初始化。对于每个任务,我们只需将特定于任务的输入和输出插入到 BERT 中,并端到端地微调所有参数。

微调是在预先训练好的 BERT 的基础上增加一层未经训练的神经元作为前馈层。

预培训很昂贵,而且是一次性的,但是微调却不贵。

应用微调的优势

  • 利用迁移学习:预先训练的 BERT 已经编码了大量关于语言的语义和句法信息。因此,训练微调模型所需的时间较少。
  • 需要更少的数据:使用预训练的 BERT,我们需要非常少的特定于任务的微调,因此需要更少的数据来获得任何 NLP 任务的更好性能。

结论:

BERT 设计用于使用来自变压器的编码器预先训练深度双向表示。BERT 预训练通过联合调节所有层中的左右上下文来使用未标记的文本。预训练的 BERT 模型可以通过额外的输出层进行微调,以便为各种 NLP 任务创建最先进的模型。

参考资料:

BERT:用于语言理解的深度双向转换器的预训练

[## 谷歌研究/bert

这是一个 24 个较小的 BERT 模型的版本(只有英语,未封装,用单词屏蔽训练),参考…

github.com](https://github.com/google-research/bert)

如何微调 BERT 进行文本分类?

https://mccormickml.com/2019/07/22/BERT-fine-tuning/

差异化架构搜索(DARTS)的直观解释

原文:https://towardsdatascience.com/intuitive-explanation-of-differentiable-architecture-search-darts-692bdadcc69c?source=collection_archive---------15-----------------------

莫里茨·金德勒在 Unsplash 上拍摄的照片

内部人工智能

了解飞镖是如何工作的!

这是一篇在 2018 年中期发表的论文,解决了搜索网络架构的可扩展性问题。简而言之,这些论文解决了神经架构搜索NAS 的问题。

顾名思义,这个领域背后的想法是探索我们如何能够自动搜索深度学习模型架构。目前,大多数数据科学问题都是通过手动设计模型架构来解决的,这种架构可以在任何给定的数据集上给出“最先进的”结果。这种方法的问题是,尽管这些体系结构在标准数据集上表现非常好,但它们在特定于组织的数据集上的表现却不如预期。

左上: Unet-Architecture |右上:发表于【LeCun 等人,1998】的原始图像|左下:VGG16 Architecture |右下:ResNet architecture

这篇文章是写给那些即将进入研究领域或者正在阅读这篇精彩论文的人的。我在印度空间研究组织(ISRO)从事这个领域的实习项目。在这篇博客中,我将尝试以直观的方式解释这篇论文,因为我在实现语义分割时遇到了很多困难。

神经结构搜索(NAS)简介

神经结构搜索的问题提出如下。

给定一组搜索空间操作 O,我们需要找到使目标函数最大化或最小化的这些操作的组合。

狗图片 cc-by: Von.grzanka |作者图片|显示不同操作如何影响输出的动画。

简单来说,我们需要找到模型的架构,使损失最小化。

天真的解决方案

NAS 的一个简单解决方案是反复试验。我们将随机选择一个操作子集,并根据验证损失等参数评估其性能,并选择具有最佳性能的模型配置。

NAS 发展简史

我们不会深入探讨,但这里有一些有影响力的论文为 NAS 研究铺*了道路。

然后最*有了 HNAS:移动设备上的分层神经架构搜索,它将 DARTS 的想法扩展到了下一个层次。

研究的趋势是将计算时间从强化学习的 2000 GPU 天或进化的 3150 GPU 天减少到飞镖的2–3 GPU天。

NAS 的方法

寻找高性能模型架构的想法并不简单,它包括两个步骤。

  1. 在小型数据集上搜索单元架构(例如,CIFAR10 或 CIFAR100)
  2. 根据搜索到的单元架构制作模型,并在大数据集(如 ImageNet)上对其进行训练

搜索单元架构

作者图片|简单单元格和混合运算的结构。上面显示的单元以堆叠方式具有 3 种状态。

模型中的单元是什么?嗯,一个单元可以被认为是一个特殊的块,其中层是堆叠的,就像任何其他模型一样。这些单元应用许多卷积运算来获得可以传递给其他单元的特征图。一个模型是通过将这些细胞串联起来制成一个完整的模型。所有这些论文都遵循一个模式,其中搜索两种类型的细胞结构,即正常细胞还原细胞

作者图片|普通单元格

正常单元:正常单元可以认为是一个计算图像特征图的正常块。这个区块中的回旋和汇集的步幅为 1 。

作者图片|缩小单元格

缩小单元:缩小单元可以被认为是普通块,而缩小了特征图的尺寸。该块中的卷积和池化的步幅为 2。缩减单元的目的是对特征地图进行缩减采样。

由于所有这些论文都解决了分类问题,最后使用了一个全局*均池层以及可选的全连接层。

Image by Author |在搜索阶段后,堆叠正常和缩小单元以形成最终模型。

关于飞镖的细节。怎么更好?

Darts 是神经架构搜索中非常有影响力的论文。早期的方法使用强化学习,需要大量的计算资源。花了 2000 GPU 天的强化学习或者 3150 GPU 天的进化。这个计算时间对大多数组织来说根本不可行。

在这篇文章中,我们从一个不同的角度处理这个问题,并提出了一种有效的体系结构搜索方法,称为 DARTS (可区分的体系结构搜索)。我们将搜索空间放宽为连续的,而不是在一组离散的候选架构上进行搜索,从而可以通过梯度下降来优化该架构的验证集性能。

与低效的黑盒搜索相反,基于梯度的优化的数据效率使 dart 能够使用数量级 fess 计算资源实现与最先进技术相媲美的性能。

介绍了一种基于双层优化的可区分网络结构搜索算法,该算法适用于卷积和递归结构。”—资料来源:飞镖论文

DARTS 将搜索时间减少到了2-3 个 GPU 日,这是惊人的。

飞镖是如何做到这一点的?

  1. 在候选操作的离散集合上搜索计算量很大。

在候选操作的离散集合上搜索的问题是,在移动到下一个配置之前,模型必须在特定配置上训练。这显然很耗时。作者找到了一种放松候选操作的离散集合的方法。

“为了使搜索空间连续,我们在所有可能的操作中将特定操作的分类选择放宽到最大限度:“——飞镖纸”

飞镖纸上的方程式

这意味着假设我们的候选操作中只有很少的操作

O = {conv_3x3,最大 _ 池 _3x3,扩张 _conv_5x5}。

运算的输出称为混合运算,通过将这些运算的输出乘以它们的概率来定义。

作者图片|显示如何计算混合运算的图片。

“每个中间节点都是基于它的所有前置节点计算的。”—飞镖纸

飞镖纸上的方程式

按作者分类的图像|典型 NAS 单元|注意每个节点如何将所有以前节点的输出作为其输入。

这就把我们带到了飞镖细胞的结构。这是模型的核心结构,我想让你在这里好好关注一下。

该单元包含一个或多个节点。这些节点也称为状态。

一个单元的 nput 是最后两个单元的输出,就像 ResNets 一样。在这个单元格中有节点。让我们假设我们制作一个具有 3 个状态/节点的单元。因此第一个节点将有两个输入,即来自最后两个单元的输出。

第二状态将具有来自第一状态的输入,以及来自最后两个单元输出,因此总共有 3 个输入。

第三状态将具有来自第二状态、第一状态的输入和来自最后两个单元的输出。

在搜索结束时,可以通过用最可能的操作替换每个混合操作 o(i,j ),即

飞镖纸上的方程式。

图片来自飞镖纸

这听起来很复杂,但是让我们分解一下。搜索阶段结束后,我们可以通过从单元中获取前 k 个(通常 k=2)连接来找到单元的架构。这样,离散搜索空间被转换为连续搜索空间,梯度下降算法将在该连续搜索空间上很好地工作。

2.双层优化

放松后,我们的目标是联合学习所有混合操作中的架构α和权重 w(例如,卷积滤波器的权重)—飞镖纸

我们已经讨论了如何获得搜索到的架构。但该模型如何寻找最优运行仍是一个未解的问题。训练部分还剩下。

优化问题可以被提出为寻找 alpha,使得验证损失被最小化,假设我们具有已经在训练集上优化的权重。

请注意 alphas 和层权重的优化是如何在训练和验证集上完成的。这被称为双层优化。

*似建筑梯度——房间里的大象

“由于昂贵的内部优化,精确地评估架构梯度可能是禁止的。因此,我们提出一个简单的*似方案如下:“飞镖纸

作者图片|显示 alphas 渐变的等式

第一张(猫)照片由 LoanUnsplash 上拍摄,第二张(狗)照片由 Victor GrabarczykUnsplash 上拍摄,第三张(狗)照片由 Alvan NeeUnsplash 上拍摄|作者图片|请注意改变 alphas(橙色线)如何改变训练损失(上图)和重新训练直到必须在重量上完成收敛。优化 alphas 首先需要优化权重。

这个方程有一个计算问题。为了获得最佳卷积权重,我们需要通过更新卷积权重来最小化训练损失,从而训练网络。这意味着每次更新 alpha 时,都需要最小化训练步骤。这将使网络培训不可行。

其思想是通过仅使用单个训练步骤调整 w 来逼* w*(α),而不通过训练直到收敛来完全解决内部优化

飞镖纸上的方程式

在等式 5 中,为α的每个配置获得最佳权重 w导致两个优化循环,因此作者建议以这样的方式来*似 w,使得在收敛之前不需要优化 w*。想法是使用仅仅一个训练步骤而不是整个内部优化循环。

图片来自飞镖纸

点击此处了解这些等式背后的数学原理。

看看等式 7,我们有一个二阶偏导数,它的计算量很大。为了解决这个问题,使用了有限差分法。

看,方程 8 没有二阶偏导数!

关于结果,你可以参考论文这里

替代优化策略

作者还试图在训练+验证数据上联合优化 alphas 和权重,但结果恶化。作者解释说,这可能是由于阿尔法对数据的过度拟合。

结论

DARTS 是一篇非常有影响力的论文,它将搜索高性能架构的时间从数千个 GPU 小时大幅减少到仅 2-3 个 GPU 天,并且仍然实现了最先进的结果。

资源

神经机器翻译的直观解释

原文:https://towardsdatascience.com/intuitive-explanation-of-neural-machine-translation-129789e3c59f?source=collection_archive---------8-----------------------

简单解释用于神经机器翻译的序列到序列模型(NMT)

什么是神经机器翻译?

神经机器翻译是一种将一种语言翻译成另一种语言的技术。例如,将英语转换为印地语。让我们考虑一下,如果你在一个印度村庄,那里的大多数人不懂英语。你打算毫不费力地与村民沟通。在这种情况下,你可以使用神经机器翻译。

神经机器翻译是使用深度神经网络将源语言(如英语)的单词序列转换为目标语言(如印地语或西班牙语)的单词序列的任务。

神经机器翻译需要什么特征?

  • 能够在几个时间步骤内保存顺序数据

NMT 使用顺序数据,这种数据需要在几个时间步骤中保持不变。人工神经网络(ANN)不会将数据持续几个时间步。像 LSTM(长短期记忆)或 GRU(门控递归单元)这样的递归神经网络(RNN)能够在几个时间步长上保存数据

  • 处理可变长度输入和输出向量的能力

ANN 和 CNN 需要一个固定的输入向量,您可以对其应用一个函数来产生固定大小的输出。将一种语言翻译成另一种语言包括源语言和目标语言中长度可变的单词序列。

源语言和可变长度的目标句子

RNN 的像 LSTM 或者GRU对顺序数据处理有什么帮助?

RNN 的 是具有循环的神经网络,用于保存信息。它们对序列中的每个元素执行相同的任务,并且输出元素依赖于先前的元素或状态。这正是我们处理顺序数据所需要的

RNN 可以有一个或多个输入,也可以有一个或多个输出。这是处理顺序数据(即可变输入和可变输出)的另一个要求

来源:http://karpathy.github.io/

为什么我们不能用 RNN 进行神经机器翻译?

在人工神经网络中,我们不在网络的不同层之间共享权重,因此,我们不需要对梯度求和。RNN 的份额权重,我们需要对 W 在每一步的梯度求和,如下所示。

在时间步长 t =0 计算 h 的梯度涉及 W 的许多因子,因为我们需要通过每个 RNN 单元反向传播。即使我们忘记了权重矩阵,一次又一次地乘以相同的标量值,比如说 100 个时间步长,这也是一个挑战。

如果最大奇异值大于 1,那么梯度会爆炸,称为爆炸梯度

如果最大奇异值小于 1,那么梯度将消失,称为消失梯度。

向前和向后进给和权重在所有层上共享,导致爆炸或消失渐变

爆炸渐变是通过使用渐变裁剪解决的,在渐变裁剪中我们为渐变设置了一个阈值。如果梯度值大于阈值,我们就对其进行剪裁。

消失梯度问题通过使用 LSTM(长短期记忆)或门控循环单元(GRU)解决。

什么是 LSTM 和 GRU?

LSTM 是长短期记忆,GRU 是门控循环单位。他们能够很快学会长期依赖。LSTM 可以学会跨越超过 1000 步的时间间隔。这是通过有效的基于梯度的算法实现的,该算法使用通过内部状态的恒定误差流。

LSTM 和 GRU 记忆信息的时间跨度很长。他们通过决定记住什么和忘记什么来做到这一点。

LSTM 用 4 个门来决定我们是否需要记住之前的状态。细胞状态在 LSTM 扮演着重要角色。LSTM 可以使用 4 个调节门来决定是否要添加或删除单元状态的信息。这些闸门就像水龙头一样,决定着应该通过多少信息。

LSTM 的三个步骤

GRU 是 LSTM 解决消失梯度问题的更简单的变体

它使用两个门:复位门和一个更新门不像 LSTM 的三个步骤。GRU 没有内部记忆

重置门决定如何将新输入与先前时间步长的记忆相结合。更新门决定应该保留多少先前的内存。

GRU 有更少的参数,所以他们在计算上更有效率,比 LSTM 需要更少的数据来概括

我们如何使用 LSTM 或 GRU 进行神经机器翻译?

我们使用以 LSTM 或 GRU 为基本块的编码器和解码器框架来创建 Seq2Seq 模型

序列到序列模型将源序列映射到目标序列。源序列是机器翻译系统的输入语言,目标序列是输出语言。

编码器:从源语言中读取单词的输入序列,并将该信息编码成实值向量,也称为隐藏状态或思想向量或上下文向量。思维向量将输入序列的“意义”编码成一个向量。编码器输出被丢弃,只有隐藏或内部状态作为初始输入被传递给解码器

解码器:将来自编码器的思想向量作为输入,将字符串开始标记<START>作为初始输入,产生输出序列。

编码器逐字读取输入序列,类似地,解码器逐字生成输出序列。

解码器在训练和推断阶段的工作方式不同,而编码器在训练和推断阶段的工作方式相同

解码器的训练阶段

使用教师强制的编码器-解码器训练阶段

我们使用教师强制来更快更有效地训练解码器。

老师的强迫就像老师在学生接受新概念训练时纠正学生一样。由于在培训过程中老师给了学生正确的输入,学生将更快更有效地学习新概念。

教师强制算法通过提供先前时间戳的实际输出而不是先前时间的预测输出作为训练期间的输入来训练解码器。

我们添加一个标记<START>来表示目标序列的开始,并添加一个标记<END>作为目标序列的最后一个字。<END>标记稍后在推断阶段用作停止条件,表示输出序列的结束。

解码器的推断阶段

编码器-解码器推理阶段

在推理或预测阶段,我们没有实际的输出序列或单词。在推断阶段,我们将前一时间步的预测输出作为输入连同隐藏状态一起传递给解码器。

解码器预测阶段的第一个时间步长将来自编码器和<START>标签的最终状态作为输入。

对于随后的时间步长,解码器的输入将是来自前一解码器的隐藏状态以及来自前一解码器的输出。

当我们达到最大目标序列长度或<END>标记时,预测阶段停止。

注:这只是对 Seq2Seq 的直观解释。我们为输入语言单词和目标语言单词创建单词嵌入。 嵌入 提供了单词及其相对意义的密集表示。

如何提高 seq2seq 模型的性能?

  • 大型训练数据集
  • 超参数调谐
  • 注意机制

什么是注意机制?

编码器将上下文向量或思想向量传递给解码器。思想或上下文向量是概括整个输入序列的单个向量。由于输入的单词对翻译的影响,可能需要更多的注意。

注意机制基本思想是避免试图学习每个句子的单一向量表示。注意力机制基于注意力权重关注输入序列的某些输入向量。这允许解码器网络“聚焦”在编码器输出的不同部分。它使用一组注意力权重对解码器自身输出的每一步执行此操作。

我们将在下一篇文章中详细讨论注意力机制、光束搜索和 BLEU 评分

参考文献:

[## 从零开始的 NLP:从序列到序列网络和注意力的翻译- PyTorch 教程…

作者:Sean Robertson 这是第三篇也是最后一篇关于“从零开始 NLP”的教程,在这里我们编写自己的类…

pytorch.org](https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html)

神经机器翻译和序列对序列模型:教程格雷厄姆·纽比格

https://towards data science . com/word-level-English-to-Marathi-neural-machine-translation-using-seq 2 seq-encoder-decoder-lstm-model-1a 913 F2 DC 4a 7

https://nlp.stanford.edu/~johnhew/public/14-seq2seq.pdf

A/B 测试的直观模拟

原文:https://towardsdatascience.com/intuitive-simulation-of-a-b-testing-191698575235?source=collection_archive---------45-----------------------

通过模拟对 A/B 检验、卡方检验、I 型和 II 型误差、置信区间和统计功效有直观和概念性的理解

图片来自 Shutterstock

我们中的许多人以前都听过、读过、甚至做过 A/B 测试,这意味着我们在某个时候进行了统计测试。大多数时候,我们使用第一方或第三方来源的数据,通过使用从 Excel 到统计软件的工具,甚至是像 Google Optimize 这样更自动化的解决方案,轻松地执行这些测试。

如果你像我一样,你可能会好奇这些类型的测试是如何工作的,以及诸如类型 I类型 II 误差置信区间影响大小统计功效、等概念是如何相互作用的。

在这篇文章中,我想邀请你对一种特定类型的 A/B 测试采取不同的方法,这种方法利用了一种叫做卡方的特殊统计。特别是,我将尝试探索和通过这种类型的测试,走伟大但漫长的模拟之路,避免库和表,希望设法探索和建立一些背后的直觉

开始之前

即使我们可以使用我们过去实验的数据,甚至是像 Kaggle 这样的第三方来源的数据,这篇文章生成我们的数据会更方便。它将允许我们将我们的结论与一个已知的基本事实进行比较;否则,它将很可能是未知的。

对于本例,我们将生成一个虚拟数据集,它将代表注册表单的六个不同版本以及我们在每个版本上观察到的潜在客户数量。对于这个设置为随机并有一个赢家版本为我们服务的 地面真相我们将通过模拟一些有偏见的骰子投掷来生成这个表格。

为此,我们生成了一个 R 函数,模拟一个有偏差的骰子,其中我们有 20%的概率在 6 中着陆,而有 16%的机会在任何其他数字中着陆。

# Biased Dice Rolling Function
DiceRolling <- function(N) {
    Dices <- data.frame()
    for (i in 1:6) {
      if(i==6) {
        Observed <- data.frame(Version=**as.character**(LETTERS[i]),Signup=**rbinom**(N/6,1,0.2))
      } else {
        Observed <- data.frame(Version=**as.character**(LETTERS[i]),Signup=**rbinom**(N/6,1,0.16))
      }
      Dices <- rbind(Dices,Observed)
    }
    return(Dices)
}
*# Let's roll some dices*
set.seed(123) *# this is for result replication 86*
Dices <- DiceRolling(1800)

将每个骰子数字视为不同登陆版本的代表(1-6 或 A-F)。对于每个版本,我们将掷骰子 300 次,并将结果记下如下:

  • 如果我们在版本 A (1)上,掷骰子,它落在 1 上,我们认为它是注册;否则,只是一次访问。
  • 每个版本我们重复 300 次。

抽样资料

如前所述,这是我们得到的结果:

# We shuffle our results
set.seed(25) 
rows <- sample(nrow(Dices))
t(Dices[head(rows,10),])

注意,我们将注册标记为二进制分类变量(1 表示注册,0 表示没有注册)

我们可以从我们的前十个结果中观察到,我们得到了一个对 FD、A. 的注册。就合计而言,我们的表格如下所示:

library(ggplot2)
ggplot(Result, aes(x=Version, y=Signup)) + geom_bar(stat="identity", position="dodge") + ggtitle("Summary Chart")
Result <- aggregate(Signup ~ Version, Dices, sum)
t(Result)

按照设计,F(6)的比例更高

从现在开始,把这个表想象成掷骰子、电子商务转换、调查或我们将在这里使用的登录页面注册转换,没关系,使用对你来说更直观的东西。

对我们来说,这将是注册,所以我们应该产生这个报告:

请注意比例(转换率)的可变性,以及它们与我们的“基本事实”计划有何不同。

观察到的频率

我们现在将汇总我们的结果,包括我们的注册(1)未注册(0) 结果,这将使我们更好地了解这些结果与我们的预期值或频率有何不同;这也被称为交叉制表列联表

*# We generate our contigency table*
Observed <- table(Dices)
t(Observed)

总而言之:

预期频率

既然我们知道我们的交叉列表是什么样子,我们现在可以生成一个表来模拟我们应该如何期望我们的结果,就像考虑所有版本的相同性能一样。这相当于说,在我们的例子中,每个版本都有相同的注册转化率或概率,或者如果你愿意,也可以说是无偏差骰子的预期结果。

*# We generate our expected frequencies table*
Expected <- Observed
Expected[,1] <- (**sum**(Observed[,1])/nrow(Observed))
Expected[,2] <- **sum**(Observed[,2])/nrow(Observed)
t(Expected)

总而言之:

假设检验

我们知道我们的测试有一个更高性能的版本,不仅通过视觉检查结果,而且因为我们故意这样设计它。

这是我们等待已久的时刻:我们是否有可能仅仅根据我们得到的结果来证明这一点?

答案是肯定的,第一步是定义我们的无效假设和替代假设,我们稍后将尝试接受或拒绝这些假设。

我们的另一个假设(H1)是我们想要证明正确的,它表明,事实上,在着陆版本和我们观察到的结果之间存在一种关系。相比之下,我们的零假设表明没有关系,这意味着我们观察到的频率和预期的频率之间没有显著差异。

统计的

我们的目标是找到我们观察到的数据位于我们的零假设正确的宇宙中的频率,也就是说,我们观察到的和预期的注册频率没有显著差异。

一个有用的统计数据,它能够总结所有这些值;六列(每个版本一列)和两行(每个注册状态一行)合并成一个值就是卡方,计算方法如下:

我们不会详细讨论这个公式是如何找到其假设或要求的(如 Yates 校正),因为这不是本文的主题。相反,我们希望通过模拟来执行一种数值方法,这应该对这些类型的假设检验有所启发。

继续,如果我们用我们的数据计算这个公式,我们得到:

*# We calculate our X^2 score*
Chi <- **sum**((Expected-Observed)^2/Expected)
Chi

零分布模拟

我们需要获得找到与我们观察到的统计值一样极端的统计值的概率,在这种情况下,用等于 10.368 的卡方表示。从概率的角度来看,这也被称为我们的 P 值。

为此,我们将模拟一个空分布作为基准。这意味着我们需要生成一个场景,其中我们的零分布是正确的,这表明一种情况,其中在登陆版本和我们得到的观察到的注册结果(频率)之间没有关系。

我很快想到的一个解决方案是从头开始重复我们的实验,或者通过多次重新收集结果,或者像在这篇文章的上下文中一样,使用一个无偏见的骰子来比较我们观察到的结果与这些测试相比表现如何。尽管这一开始看起来很直观,但在现实场景中,这种解决方案可能不是最有效的,因为它需要大量使用时间和预算等资源来多次重复这种 A/B 测试。

重采样

解决上述问题的一个很好的方法叫做重采样。重采样的作用是通过随机改变其中一个变量,使一个变量独立于另一个变量。如果它们之间存在初始关系,那么这种关系将由于随机抽样方法而丢失。

特别是,对于这个场景,我们需要使用原始的(未聚合的)样本。稍后,我们将对其中一列进行多次置换,在这种情况下,这将是注册状态。

具体来说,让我们看看前面显示的前“10 个样本”的 2 次洗牌的例子:

现在让我们用完整的(1800)样本集来尝试一下:

排列#1

Perm1 <- Dices
set.seed(45)
Perm1$Signup <- sample(Dices$Signup)
ResultPerm1 <- aggregate(Signup ~ Version, Perm1, sum)
cat("Permutation #1:\n\n")
cat("Summary\n\n")
t(ResultPerm1)
cat("Chi-Squared")
Perm1Observed <- table(Perm1)
sum((Expected-Perm1Observed)^2/Expected)

排列#2

Perm1 <- Dices
set.seed(22)
Perm1$Signup <- sample(Dices$Signup)
ResultPerm1 <- aggregate(Signup ~ Version, Perm1, sum)
cat("Permutation #2:\n\n")
cat("Summary\n\n")
t(ResultPerm1)
cat("Chi-Squared")
Perm1Observed <- table(Perm1)
sum((Expected-Perm1Observed)^2/Expected)

从我们的数据排列中可以看出,我们得到了完全不同的总结和卡方值。我们将多次重复这一过程,探索我们能在大规模上获得什么。

模拟

让我们模拟 15k 个数据排列。

# Simulation Function
Simulation <- function(Dices,k) {
    dice_perm <- data.frame()
    i <- 0
    while(i < k) {
      i <- i + 1;# We permutate our Results
      permutation$Signup <- sample(Dices$Signup)# We generate our contigency table
      ObservedPerm <- table(permutation)# We generate our expected frequencies table
      ExpectedPerm <- ObservedPerm
      ExpectedPerm[,1] <- (sum(ObservedPerm[,1])/nrow(ObservedPerm))
      ExpectedPerm[,2] <- sum(ObservedPerm[,2])/nrow(ObservedPerm)# We calculate X^2 test for our permutation
      ChiPerm <- sum((ExpectedPerm-ObservedPerm)^2/ExpectedPerm)# We add our test value to a new dataframe
      dice_perm <- rbind(dice_perm,data.frame(Permutation=i,ChiSq=ChiPerm))
    }
return(dice_perm)
}# Lest's resample our data 15.000 times
start_time <- Sys.time()
permutation <- Dicesset.seed(12)
permutation <- Simulation(Dices,15000)
end_time <- Sys.time()
end_time - start_time

时间运行模拟

重采样分布

正如我们可以在下面观察到的,我们的 15k 排列看起来像是以独特的形状分布,并且像预期的那样,类似于卡方分布。有了这些信息,我们现在可以计算 15k 次迭代中有多少次,我们观察到的卡方值与我们最初计算的 10.36 一样极端。

totals <- as.data.frame(table(permutation$ChiSq))
totals$Var1 <- as.numeric(as.character(totals$Var1))
plot( totals$Freq ~ totals$Var1, ylab=”Frequency”, xlab=”Chi-Squared Values”,main=”Null Distribution”)

p 值

让我们计算一下有多少次我们获得了等于或高于 10.368(我们计算的分数)的卡方值。

Higher <- nrow(permutation[which(permutation$ChiSq >= Chi),])
Total <- nrow(permutation)
prob <- Higher/Total
cat(paste("Total Number of Permutations:",Total,"\n"))
cat(paste("  - Total Number of Chi-Squared Values equal to or higher than",**round**(Chi,2),":",Higher,"\n"))
cat(paste("  - Percentage of times it was equal to or higher (",Higher,"/",Total,"): ",**round**(prob*100,3),"% (P-Value)",sep=""))

决策限制

我们现在有了 P 值,这意味着如果零假设是正确的,即版本和注册之间没有关系,我们应该只在 6.5%的时间里遇到卡方极值。如果我们认为这只是掷骰子的结果,我们应该预期“结果和我们的一样有偏差”,即使在最多 6.5%的情况下掷出一个无偏差的骰子。

现在我们需要定义我们接受或拒绝零假设的决策界限。

我们计算了 90%、95%和 99%置信区间的决策极限,这意味着我们应该期望哪些卡方值作为这些概率的极限。

*# Decition Limits*
totals <- as.data.frame(table(permutation$ChiSq))
totals$Var1 <- **as.numeric**(**as.character**(totals$Var1))
totals$Prob <- **cumsum**(totals$Freq)/**sum**(totals$Freq)
Interval90 <- totals$Var1[**min**(which(totals$Prob >= 0.90))]
Interval95 <- totals$Var1[**min**(which(totals$Prob >= 0.95))]
Interval975 <- totals$Var1[**min**(which(totals$Prob >= 0.975))]
Interval99 <- totals$Var1[**min**(which(totals$Prob >= 0.99))]cat(paste("Chi-Squared Limit for 90%:",**round**(Interval90,2),"\n"))
cat(paste("Chi-Squared Limit for 95%:",**round**(Interval95,2),"\n"))
cat(paste("Chi-Squared Limit for 99%:",**round**(Interval99,2),"\n"))

事实核查

卡方分布表

正如经典的“卡方分布表”所观察到的,我们可以从模拟中获得非常相似的值,这意味着我们的置信区间和 P 值应该非常准确。

假设检验

正如我们所料,我们可以拒绝零假设,并声称版本和注册之间有显著的关系。不过,有一个小警告,这是我们的信心水*。正如在上面的计算中观察到的,我们可以看到我们的 P 值(6.5%)正好在 90%和 95%的置信区间之间,这意味着,即使我们可以用 90%的置信度拒绝我们的零假设,我们也不能用 95%或任何更高的置信度拒绝它。

如果我们声称有 90%的信心,那么我们也声称有 10%的机会错误地拒绝我们的零假设(也称为I 型错误假阳性α)。注意,在现实中,使用了这样的标准任意值(90%、95%、99%),但是我们可以很容易地声称我们有 93.5%的把握,因为我们计算了类型 I 错误的 6.5%的概率。

有趣的是,即使我们确实知道版本和注册之间的关系,我们也不能仅仅通过观察、模拟来证明这一点,也不能通过用标准的 95%置信水*进行假设检验来证明这一点。这种即使我们知道我们的零假设是错误的,但却没有拒绝它的概念被称为假阴性第二类错误(β),它取决于该测试的统计功效,该测试测量这种不发生的概率

统计能力

在我们的假设检验中,我们看到我们不能拒绝我们的零假设,即使在标准值区间,如 95%或更高的置信度。这是由于我们随机设计的测试的统计功效(或功效),它对我们上面讨论的统计显著性标准(α或 I 型误差)以及效应大小样本大小特别敏感。

功率计算如下:

特别是,我们可以通过回答以下问题来计算我们当前的统计能力:

  • 如果我们重复我们的实验 X 次,并计算每次实验的 P 值,那么在百分之几的时间里,我们会得到极端的 P 值 5%?

让我们试着回答这个问题:

MultipleDiceRolling <- function(k,N) {
    pValues <- **NULL**
    for (i in 1:k) {
    Dices <- DiceRolling(N)    
    Observed <- table(Dices)
    pValues <- cbind(pValues,chisq.test(Observed)$p.value)
    i <- i +1
    }
    **return**(pValues)
}*# Lets replicate our experiment (1800 throws of a biased dice) 10k times*
start_time <- Sys.time()
Rolls <- MultipleDiceRolling(10000,1800)
end_time <- Sys.time()
end_time - start_time

我们有多少次观察到 P 值达到 5%的极端值?

cat(paste(**length**(which(Rolls <= 0.05)),"Times"))

我们观察到这种情况的几率是多少?

Power <- **length**(which(Rolls <= 0.05))/**length**(Rolls)
cat(paste(**round**(Power*100,2),"% of the times (",**length**(which(Rolls <= 0.05)),"/",**length**(Rolls),")",sep=""))

只有 21.91%的时候,我们遇到的 P 值很小。

如上计算,我们观察到相当于 21.91% (0.219)的幂,这是相当低的,因为黄金标准是 0.8 左右甚至 0.9 (90%)。换句话说,这意味着我们有 78.09% (1 次方)的概率犯第二类错误(T1),或者,相当于,有 78%的概率(T2)无法在 95%的置信区间拒绝我们的零假设,即使它是假的(T3),这就是这里发生的情况。

如上所述,功率是以下因素的函数:

  • 我们的显著性标准:这是我们的 I 型误差或 Alpha,我们决定为 5% (95%置信度)。
  • 效应量级或大小:根据标准化使用统计,这代表我们观察到的值和预期值之间的差异。在这种情况下,由于我们使用卡方统计,这种影响(命名为 w )被计算为标准化卡方值的*方根,通常分为小(0.1)、中(0.3)和大(0.5)(参考: Cohen,J. (1988)。)
  • 样本量:这代表样本的总量(在我们的例子中是 1800)。

影响幅度

我们设计了一个影响幅度相对较小的实验,因为我们的骰子只偏向一面(6 ),只有轻微的额外机会落在对它有利的地方。

简单地说,我们的效应量(w) 计算如下:

1)其中我们的观察比例计算如下:

我们的替代假设的概率

除以总数(6)

2)和我们的预期比例:

我们零假设的概率

除以总和(6)

最后,我们可以如下获得我们的效果大小:

我们的效果大小是 0.04,正如所料,被认为非常小(< 0.1)。

样本量

类似于我们的效应大小,我们的样本大小,即使看起来足够大(1800),也不足以在 95%的置信度下发现关系(或偏差),因为我们计算的效应大小非常小。我们可以预期样本大小和效应大小成反比。效应越显著,在给定的显著性水*上证明它所需的样本量就越小。

在这个时候,把我们的 A/B 测试的样本大小想象成掷骰子或者甚至投掷硬币可能更舒服。有些直观的是,通过一次投掷骰子/硬币,我们将无法发现有偏差的骰子/硬币,但是如果 1800 次投掷不足以在 95%的置信水*下检测到这种小影响,这将导致我们产生以下问题:我们需要多少次投掷?

同样的原则也适用于我们 A/B 测试的样本量。影响越小,例如每个版本(颜色、字体、按钮)的小变化导致的转换中的小变化,样本就越大,因此,我们需要收集接受或拒绝假设所需的数据的时间就越长。许多关于电子商务网站转化的 A/B 测试中的一个常见问题是,像 Google Optimize 这样的工具可能需要很多天,甚至几周,而且大多数时候,我们不会遇到一个结论性的答案。

为了解决这个问题,首先,我们需要定义我们想要的统计能力。接下来,我们将尝试通过迭代 N 的不同值来回答这个问题,直到我们最小化我们的预期功率和观察到的功率之间的差异。

*# Basic example on how to obtain a given N based on a target Power.*
*# Playing with initialization variables might be needed for different scenarios.*
CostFunction <- function(n,w,p) {
  value <- pchisq(qchisq(0.05, df = 5, lower = **FALSE**), df = 5, ncp = (w^2)*n, lower = **FALSE**)
  Error <- (p-value)^2
  **return**(Error)
}
SampleSize <- function(w,n,p) {

    *# Initialize variables*
    N <- n
    i <- 0
    h <- 0.000000001
    LearningRate <- 40000000
    HardStop <- 20000
    power <- 0

    *# Iteration loop*
    for (i in 1:HardStop) {
      dNdError <- (CostFunction(N + h,w,p) - CostFunction(N,w,p)) / h
      N <- N - dNdError*LearningRate
      ChiLimit <- qchisq(0.05, df = 5, lower = **FALSE**)
      new_power <- pchisq(ChiLimit, df = 5, ncp = (w^2)*N, lower = **FALSE**)
      if(**round**(power,6) >= **round**(new_power,6)) {
        cat(paste0("Found in ",i," Iterations\n"))
        cat(paste0("   Power: ",**round**(power,2),"\n"))
        cat(paste0("   N: ",**round**(N)))
        break();
      }
      power <- new_power
      i <- i +1
    }
}
set.seed(22)
SampleSize(0.04,1800,0.8)
SampleSize(0.04,1800,0.9)

如上所述,在 N 的不同迭代之后,对于 0.8 和 0.9 的功率值,我们分别获得了 8.017 和 10.293 的推荐样本。

让我们从头开始重复这个实验,看看我们通过瞄准通常使用的 0.8 的幂来建议的这些 8.017 的新样本大小得到了什么结果。

start_time <- Sys.time()*# Let's roll some dices*
set.seed(11) *# this is for result replication*
Dices <- DiceRolling(8017) *# We expect 80% Power*
t(table(Dices))*# We generate our contigency table*
Observed <- table(Dices)*# We generate our expected frequencies table*
Expected <- Observed
Expected[,1] <- (**sum**(Observed[,1])/nrow(Observed))
Expected[,2] <- **sum**(Observed[,2])/nrow(Observed)*# We calculate our X^2 score*
Chi <- **sum**((Expected-Observed)^2/Expected)
cat("Chi-Square Score:",Chi,"\n\n")*# Lest's resample our data 15.000 times*
permutation <- Dices
set.seed(20)
permutation <- Simulation(Dices,15000)Higher <- nrow(permutation[which(permutation$ChiSq >= Chi),])
Total <- nrow(permutation)
prob <- Higher/Total
cat(paste("Total Number of Permutations:",Total,"\n"))
cat(paste("  - Total Number of Chi-Squared Values equal to or higher than",**round**(Chi,2),":",Higher,"\n"))
cat(paste("  - Percentage of times it was equal to or higher (",Higher,"/",Total,"): ",**round**(prob*100,3),"% (P-Value)\n\n",sep=""))*# Lets replicate this new experiment (8017 throws of a biased dice) 20k times*
set.seed(20)
Rolls <- MultipleDiceRolling(10000,8017)
Power <- **length**(which(Rolls <= 0.05))/**length**(Rolls)
cat(paste(**round**(Power*100,3),"% of the times (",**length**(which(Rolls <= 0.05)),"/",**length**(Rolls),")",sep=""))end_time <- Sys.time()
end_time - start_time

最后的想法

正如我们新的实验设计(样本大小等于 8017)所预期的那样,我们能够将 P 值降低到 1.9%。

此外,我们观察到相当于 0.79 的统计功效(非常接*我们的目标),这意味着我们能够将我们的第二类错误(不拒绝我们的假零假设)减少到仅仅 21%!

这让我们以 95%的置信度(实际上是 98.1%)得出结论,正如我们一直知道的那样,在登陆版本和注册之间存在统计上的显著关系。现在我们需要测试,在给定的置信水*下,哪个版本表现更好;这将包括在本文的第二部分。

[## A/B 测试的直观模拟—第二部分

直观地理解学生的 t 检验,I 型和 II 型错误,置信区间,和统计能力,通过…

towardsdatascience.com](/intuitive-simulation-of-a-b-testing-part-ii-8902c354947c)

如果您有任何问题或意见,请不要犹豫,在下面发表。

A/B 测试的直观模拟—第二部分

原文:https://towardsdatascience.com/intuitive-simulation-of-a-b-testing-part-ii-8902c354947c?source=collection_archive---------41-----------------------

通过模拟直观理解学生的 t 检验、I 型和 II 型错误、置信区间和统计功效

图片来自 Shutterstock

在这篇文章中,我想邀请你继续我们对 A/B 测试的直觉探索,正如在上一篇文章中看到的:

[## A/B 测试的直观模拟

对 A/B 测试、卡方检验、I 型和 II 型错误、置信区间和…

towardsdatascience.com](/intuitive-simulation-of-a-b-testing-191698575235)

恢复我们所看到的,我们能够通过模拟和直觉证明网站版本和注册之间存在关系,因为我们能够精心设计一个具有 79%统计能力的测试,允许我们以 95%的置信度拒绝假设。换句话说,我们证明了像我们这样有偏见的行为是随机发现的,只有 1.6%的几率。

即使我们对结果感到满意,我们仍然需要用一个定义的统计置信水*来证明有一个更高性能的版本。在实践中,我们需要证明我们的假设,*均来说,我们应该期望 F 版本会赢过任何其他版本。

开始之前

让我们记住并探索我们以前帖子中的工作数据,在那里我们最终抛出了 8017 个骰子,正如我们的统计功效目标 80%所定义的那样。

**# Biased Dice Rolling Function** DiceRolling <- function(N) {
    Dices <- data.frame()
    for (i in 1:6) {
      if(i==6) {
        Observed <- data.frame(Version=as.character(LETTERS[i]),Signup=rbinom(N/6,1,0.2))
      } else {
        Observed <- data.frame(Version=as.character(LETTERS[i]),Signup=rbinom(N/6,1,0.16))
      }
      Dices <- rbind(Dices,Observed)
    }
    return(Dices)
}
**# In order to replicate** set.seed(11)
Dices <- DiceRolling(8017) **# We expect 80% Power**
t(table(Dices))

提醒一下,我们设计了一个 R 函数来模拟一个有偏差的骰子,其中我们有 20%的概率在 6 中着陆,而有 16%的机会在任何其他数字中着陆。

此外,我们最终生成了一个包含 8.017 个样本的虚拟数据集,以 80%的功效计算,代表了注册表单的六个不同版本以及我们在每个版本上观察到的潜在客户数量。对于这个设置为的虚拟随机并有一个赢家版本(F)将作为 地面真相我们通过模拟一些有偏见的骰子的投掷来生成这个表格。

输出:

按照设计,我们可以观察到被观察 F 的 ( 251 )的更高的频率

这将使我们能够制作这份报告:

请注意我们观察到的注册率和预期(设计)概率之间的差异。

如上所述,我们可以观察到不同登录页面版本的注册率不同。有趣的是,即使我们计划了一个精确的注册概率(注册率),我们在观察到的和预期的(计划的)注册率之间得到了完全不同的结果。

让我们暂停一下,对 C 版本进行“健全性检查”,它显示了观察到的(0.14)和预期的(0.16)比率之间的最大差异,以便检查我们的数据是否有问题。

健全性检查

尽管这一步不是必需的,但它将为我们建立对我们的主要目标有用的直觉提供一个良好的起点。

如前所述,我们想证明我们的结果,即使最初与我们的预期不同,也不应该相差太远,因为它们基于潜在的概率分布而变化。

换句话说,对于版本 C 的特殊情况,我们的假设如下:

我们为什么要用手段?

这种特殊情况允许我们使用比例或*均值,因为我们将变量设计为值为 0 或 1 的二分变量,在这种情况下,*均值计算代表与我们的比率或比例相同的值。

**# Results for Version C**
VersionC <- Dices[which(Dices$Version==”C”),]
**# Mean calculation**
mean(VersionC$Signup)

版本 C 观察*均值

p 值

我们需要找到我们的 p 值,这将允许我们基于在潜在概率分布内找到与我们对版本 C 得到的结果“一样极端”的结果的概率来接受或拒绝我们的假设。

这种确定意味着我们的*均值与真实值(0.16)有显著差异,通常通过一种著名的学生测试的变体来解决,称为单样本 t 检验注意:因为我们也使用比例,我们也可以使用“比例测试”,尽管这不是这篇文章的目的。

为了获得发现像我们这样极端结果的概率,我们需要多次重复我们的数据收集过程。由于这个过程昂贵且不切实际,我们将使用一种类似于我们在上一篇名为“引导”的文章中使用的置换重采样的方法。

拔靴带

自举是通过重新排列我们的一个专栏来完成的,在这个例子中是注册,同时保持另一个专栏不变。与我们过去所做的置换重采样不同的是,我们将允许替换,如下所示:

请注意,这次来自我们“原始样本”的注册数据甚至在我们的替换中重复出现。

重要的是要注意,我们需要在这个重组过程中允许替换;否则,简单的排列将总是产生相同的*均值,如下所示。

让我们生成 10 个重采样而不替换:

i = 0
for (i in 1:10) {
 Resample <- sample(VersionC$Signup,replace=**FALSE**);
 cat(paste("Resample #",i," : ",mean(Resample),"\n",sep=""));
 i = i+1;
}

请注意,使用排列,它们将总是相同的。

以及 10 个重新采样和替换:

i = 0
for (i in 1:10) {
 Resample <- sample(VersionC$Signup,replace=**TRUE**);
 cat(paste("Resample #",i," : ",mean(Resample),"\n",sep=""));
 i = i+1;
}

对于替换的样本,它们将根据概率分布而变化。

模拟

让我们用我们的数据模拟 C 版本的 30k 个排列。

**# Let’s generate a Bootstrap and find our p-Value, Intervals and T-Scores** set.seed(1984)
Sample <- VersionC$Signup
score <- NULL
means <- NULL
for(i in 1:30000) {
 Bootstrap <- sample(Sample,replace = TRUE)
 means <- rbind(means,mean(Bootstrap))
 SimulationtTest <- tTest((Bootstrap-mean(Sample))/sd(Sample))
 tScores <- rbind(score,SimulationtTest)
}

结果,我们得到了:

请注意,它看起来是正态分布,*均值等于 0.14

最初,人们可能期望分布在形状上相似,但以 0.16 为中心,因此类似于“真实人口*均值分布。尽管我们没有重新创建精确的“基本事实分布”(我们设计的那个),但由于它现在位于样本*均值的中心(0.14),我们确实重新创建了一个应该具有大致相同的形状和标准误差,并且应该在其范围内包含我们的真实*均值的分布。

我们可以通过使用中心极限定理二项分布的标准差公式,将我们的自举标准差真实均值标准差进行比较。

由此我们可以得到:

这似乎非常接*我们的自举标准误差:

**# Mean from sampling distribution** round(sd(means),6)

这些数据应该足以让我们通过模拟一个具有等于 0.16 的均值和 0.01标准误差的正态分布来*似原始的真实均值分布。我们可以找到使用该信息观察到 0.14 这样的极端值的次数百分比。

估计抽样分布与真实*均分布

如上所述,我们的真实均值分布(绿色)和我们的自举样本分布(蓝色)似乎非常相似,除了后者以 0.14 为中心。

在这一点上,我们可以解决我们的问题,要么找到在我们的真实均值分布 (蓝色区域)中找到 0.14 的极端值的%。或者,我们可以找到在我们的自举样本分布* (绿色区域)中找到极值 0.16 的概率。我们将继续讨论后者,因为这篇文章关注的是完全基于样本数据的模拟。***

继续,我们需要计算在我们的自举样本分布中我们观察到了多少次极值 0.16。值得注意的是,在这种情况下,我们的样本均值(0.14)低于我们预期的均值 0.16,但情况并非总是如此,因为正如我们在结果中看到的,版本 D 得到了 0.17。

具体来说,我们将进行一个“双尾检验”,即找出获得数值为极值 远离均值为 0.16 的概率。C 版的样本均值等于 0.14,这相当于低至 0.12 或高至 0.16,因为这两个值都同样极端。

对于这种情况,我们发现:

**# Expected Means, Upper and Lower interval (0.14 and 0.16)** ExpectedMean <- 0.16
upper <- mean(means)+abs(mean(means)-ExpectedMean)
lower <- mean(means)-abs(mean(means)-ExpectedMean)
PValue <- mean(means <= lower | means >= upper)
Sum <- sum(means <= lower | means >= upper)
cat(paste(“We found values as extreme: “,PValue*100,”% (“,Sum,”/”,length(means),”) of the times”,sep=””))

这是我们的 p 值

好了,我们已经找到了我们的 p 值,相对较低。现在,我们希望找到*均值的 95%置信区间,这将有助于了解考虑到 5%的第一类误差(Alpha),可能需要哪些值。

**# Data aggregation**
freq <- as.data.frame(table(means))
freq$means <- as.numeric(as.character(freq$means))**# Sort Ascending for right-most proportion**
freq <- freq[order(freq$means,decreasing = FALSE),]
freq$cumsumAsc <- cumsum(freq$Freq)/sum(freq$Freq)
UpperMean <- min(freq$means[which(freq$cumsumAsc >= 0.975)])**# Sort Descending for left-most proportion**
freq <- freq[order(freq$means,decreasing = TRUE),]
freq$cumsumDesc <- cumsum(freq$Freq)/sum(freq$Freq)
LowerMean <- max(freq$means[which(freq$cumsumDesc >= 0.975)])**# Print Results**
cat(paste(“95 percent confidence interval:\n “,round(LowerMean,7),” “,round(UpperMean,7),sep=””))

注意 0.16 不包含在这个 95%的置信区间内。

让我们来计算我们学生的 T 分数,计算方法如下:

由于我们已经为 30k 个重样本中的每一个计算了这个公式,我们可以为 90%、95%和 99%的置信区间生成我们的临界 t 分数。

**# Which are the T-Values expected for each Confidence level?**
histogram <- data.frame(X=tScores)
library(dplyr)
histogram %>% 
 summarize(
 # Find the 0.9 quantile of diff_perm’s stat
 q.90 = quantile(X, p = 0.9),
 # … and the 0.95 quantile
 q.95 = quantile(X, p = 0.95),
 # … and the 0.99 quantile
 q.99 = quantile(X, p = 0.99)
 )

90%、95%和 99%的模拟 t 值

这些值非常接* 1335 (N-1)个自由度的原始学生成绩表,如下所示:

学生成绩表

继续,我们可以观察到我们计算的 p 值约为 3.69%,我们的 95%区间不包括 0.16,我们的绝对 t 值为 2.1,如表中所示,正好在 Alpha 值 0.05 和 0.01 之间。所有这一切似乎与同样的结果是一致的;我们以 95%的置信度拒绝零假设,这意味着我们无法确认 C 版的真实均值等于 0.16。

我们自己设计了这个测试,我们很确定我们的零假设是正确的。这种拒绝真零假设的概念被称为假阳性或 I 型错误,可以通过将我们当前的置信区间从 95%增加到 99%来避免。

到目前为止,我们已经通过模拟进行了相当于“单样本 t 检验的测试,这意味着我们已经确定了 0.14 的“样本均值”在统计上是否不同于已知或假设的“总体均值”0.16,这是我们的基本事实。

现在,这将为我们下一步的工作打下基础,因为我们现在将继续用一种非常相似的方法来比较我们的登陆版本,看看是否有赢家。

寻找我们的赢家版本

我们探讨了如何比较样本均值与已知总体均值的统计差异;现在,让我们将我们的样本均值与另一个样本均值进行比较。

对于这个特殊的例子,让我们比较一下版本 F 。版本 A

这种比较两个独立样本的程序通常用一种叫做“不成对两样本 t 检验”的检验来解决;它是不成对的,因为我们将使用不同的(独立的)样本;我们假设它们的行为是随机的,具有正态分布和零协方差,我们将在后面观察到。

如果我们使用相同的样本,比如在不同的时间点,我们将使用“配对双样本 t 检验”,相比之下,它比较两个相关样本,并假设非零协方差,这将反映在公式中。

简而言之,我们想知道我们观察到均值的正差异的频率,这相当于说版本 F 比版本 A 具有更高的均值,从而具有更好的性能。我们知道我们目前在手段上的差异如下:

样本 F 和样本 A 之间有 3.37%的正差异

因为我们知道我们的样本均值只是版本 F 和版本 A 的真实总体均值的单一测量,而不是两个版本的真实样本均值,所以我们需要像前面一样计算两个版本的估计样本分布。与之前不同,我们还将计算每个重采样的*均值的差异,以观察它是如何分布的。

让我们用版本 F 和版本 A 的替代品模拟 40k 个样本,并计算*均值的差异:

**# Let’s select data from Version F and Version A** VersionF <- Dices[which(Dices$Version==”F”),]
VersionA <- Dices[which(Dices$Version==”A”),]**# We simulate 40k** Diff <- NULL
meansA <- NULL
meansF <- NULL
for(i in 1:40000) {
 BootstrapA <- sample(VersionA$Signup,replace = TRUE)
 BootstrapF <- sample(VersionF$Signup,replace = TRUE)
 MeanDiff <- mean(BootstrapF)-mean(BootstrapA)
 Diff <- rbind(Diff,MeanDiff)
}
**# We plot the result**
totals <- as.data.frame(table(Diff))
totals$Diff <- as.numeric(as.character(totals$Diff))
plot( totals$Freq ~ totals$Diff , ylab="Frequency", xlab="Difference",main="Sampling Difference Distrubution")

均值间差异的抽样分布

正如我们之前所学的,我们得到了一个正态分布的形状,该形状以之前计算的样本差 0.337 为中心。像以前一样,我们也知道版本 A 和 F 的真实总体均值之间的差异应该在这个分布的范围内

此外,我们的 bootstrap 应该为我们提供了真实*均值之间差异的标准误差的良好*似值。我们可以用中心极限定理二项分布来比较我们的自举标准差真均值差标准差

由此我们可以得出:

差异的预期标准误差为 0.0148,协方差为零

就像以前一样,由于均值的差异,它似乎非常接*我们的自举标准误差:

**# Simulated Standard Error of the differences** round(sd(Diff),6)

(非常接*我们的 0.0148 目标)

按照设计,我们知道*均的真实期望差是 0.04。我们应该有足够的数据来*似一个正态分布,其中的*均值等于 0.04 并且的标准误差为 0.0148,在这种情况下,我们可以找到一个值被发现为极值 0 的次数的百分比。

然而,这种情况是不现实的,因为我们通常没有总体均值,而总体均值是估计低谷置信区间的全部目的。

与我们之前的案例相反,在我们的第一个例子中,我们将 C 版本的样本分布与假设的总体均值 0.16 进行了比较。然而,在这种情况下,我们比较了两个单独的样本,没有进一步的信息,因为它会发生在一个真正的 A/B 测试。

特别是我们要证明版本 F 优于版本 A,意思是均值之差大于零。在这种情况下,我们需要执行一个“单尾”测试来回答以下问题:我们观察到均值差异大于零的次数百分比是多少?

我们的假设如下:

答案:

**# Percent of times greater than Zero** mean(Diff > 0)

这意味着 P 值= 0.011

由于我们的 p 值代表我们在模拟中没有观察到高于零的均值差异的次数,因此我们可以将其计算为 0.011(1–0.989)。此外,低于 0.05(阿尔法),我们可以拒绝我们的零假设;因此,版本 F 比版本 a具有更高的性能

如果我们计算这个特定测试的 95%置信区间和 t 分数,我们应该得到类似的结果:

95%的置信区间:

**# Data aggregation**
freq <- as.data.frame(table(Diff))
freq$Diff <- as.numeric(as.character(freq$Diff))**# Right-most proportion (Inf)** UpperDiff <- Inf**# Sort Descending for left-most proportion**
freq <- freq[order(freq$Diff,decreasing = TRUE),]
freq$cumsumDesc <- cumsum(freq$Freq)/sum(freq$Freq)
LowerDiff <- max(freq$Diff[which(freq$cumsumDesc >= 0.95)])**# Print Results**
cat(paste(“95 percent confidence interval:\n “,round(LowerDiff,7),” “,round(UpperDiff,7),sep=””))

注意我们最右边的区间是无限的,因为我们做了一个单尾测试。

正如所料,我们的置信区间告诉我们,在 95%的置信度下,我们应该期望至少 0.0097 的差异,该差异大于零;因此,它表现出了更好的性能。

不成对双样本 t 检验得分:

与我们之前的值类似,检查我们的 T 表中的 T=2.312653 自由度,我们还发现 p 值大约为 0.01

学生成绩表

成对比较

到目前为止,我们已经将 C 版登录页面与假设的*均值 0.16 进行了比较。我们还比较了版本 F 和版本 A,发现哪个版本的性能最好。

现在我们需要确定我们的绝对赢家。我们将进行成对比较,这意味着我们将互相测试每一页,直到我们确定我们的绝对赢家,如果它存在的话。

由于我们将对每个版本进行单尾测试,并且我们不需要对一个版本本身进行测试,因此我们可以减少测试的总数,如下所示。

**# Total number of versions** VersionNumber <- 6
**# Number of versions compared** ComparedNumber <- 2
**# Combinations** factorial(VersionNumber)/(factorial(ComparedNumber)*factorial(VersionNumber-ComparedNumber))

作为输出,我们得到: 15 对测试。

注意,我们只需要找到绿色的值。白色将是 1-对应对(绿色值)

我们将跳过重复 15 次的过程,直接跳到结果,即:

我们用红色标记了 p 值

如上所述,我们发现版本 F 比版本 A、C 具有更好的性能,并且几乎比版本 B、D 和 E 的性能更好,它们接*我们选择的 Alpha 值 5%。相比之下,版本 C 似乎是一个特例,因为对于 D 和 E,它似乎具有大于零的均值差异,我们知道这是不可能的,因为所有三个版本都是以 0.16 的等效概率设计的。

换句话说,我们无法以 95%的置信度拒绝我们的零假设,即使 F 为假。b、 D、C;这种情况(类型 II 错误)可以通过增加我们的统计功效来解决。相比之下,我们拒绝了 D vs 的真零假设。c 和 E 。这表明我们已经发生了一个类型 I 错误,这可以通过定义一个较低的 Alpha 或较高的置信水*来解决。

我们确实设计了我们的测试有 80%的统计功效。然而,我们设计它仅仅是为了测试我们的 观察频率和预期频率之间的差异,而不是为了测试* 个体 之间的差异。换句话说,我们已经从“卡方检验”转换为“**不成对双样本 t 检验”。***

统计能力

我们已经取得了成果。即使我们可以按原样使用它们,并选择总体差异最大的那些,例如 P 值最低的那些,我们也可能想要重新测试一些变化,以便完全确定。

正如我们在上一篇文章中看到的,功率的计算如下:

同样,功率是以下各项的函数:

  • 我们的显著性标准是我们的 I 型误差或 Alpha,我们决定为 5% (95%置信度)。
  • 效应量级或大小:这代表我们观察到的值和预期值之间关于标准化使用统计的差异。在这种情况下,由于我们使用的是学生的测试统计数据,这种效应(名为 d )的计算方法是“*均值之差除以“合并标准误差”。通常分为小型(0.2)、中型(0.5)和大型(0.8)。
  • 样本量:这代表样本的总量(在我们的例子中是 8017)。

影响幅度

我们设计了一个影响幅度相对较小的实验,因为我们的骰子只偏向一面(6 ),只有轻微的额外机会落在对它有利的地方。

简单地说,我们的效应量级(d) 计算如下:

(注意与我们之前使用的 t 分数公式的关系)

如果我们使用目前为止所学的公式计算 F 版本相对于 A 版本的期望值,我们会得到:

请注意,我们计算的效果大小是通常认为的“小效果”的 50%

样本量

正如我们在上一篇文章中所评论的,我们可以预期样本大小和效应大小之间的反比关系。效应越显著,在给定的显著性水*上证明它所需的样本量就越小。

让我们试着找到所需的样本大小,以便有 90%的功效。我们可以通过迭代 N 的不同值来解决这个问题,直到我们最小化我们的预期功率和观察到的功率之间的差异。

**# Basic example on how to obtain a given N based on a target Power.
# Playing with initialization variables might be needed for different scenarios.**
set.seed(11)
CostFunction <- function(n,d,p) {
  df <- (n - 1) * 2
  tScore <- qt(0.05, df, lower = FALSE)
  value <- pt(tScore , df, ncp = sqrt(n/2) * d, lower = FALSE)
  Error <- (p-value)^2
  return(Error)
}
SampleSize <- function(d,n,p) {

  # Initialize variables
  N <- n
  i <- 0
  h <- 0.000000001
  LearningRate <- 3000000
  HardStop <- 20000
  power <- 0

  # Iteration loop
  for (i in 1:HardStop) {
    dNdError <- (CostFunction(N + h,d,p) - CostFunction(N,d,p)) / h
    N <- N - dNdError*LearningRate
    tLimit <- qt(0.05, (N - 1) * 2, lower = FALSE)
    new_power <- pt(tLimit , (N- 1) * 2, ncp = sqrt(N/2) * d, lower = FALSE)

    if(round(power,6) >= p) {
      cat(paste0("Found in ",i," Iterations\n"))
      cat(paste0("   Power: ",round(power,2),"\n"))
      cat(paste0("   N: ",round(N)))
      break();
    }
    power <- new_power
    i <- i +1
  }
}
set.seed(22)
SampleSize((0.2-0.16)/sqrt((0.16+0.1344)/2),1336,0.9)

如上所述,在 N 的不同迭代之后,我们获得了每骰子 1576 的推荐样本,从而具有 0.9 的幂。

让我们从头开始重复这个实验,看看我们对这些新的样本量 9456 (1575*6)得到了什么结果,这是通过瞄准 0.9 的良好统计功效而建议的。

**# Repeat our experiment with sample size 9446** set.seed(11)
Dices <- DiceRolling(9456) **# We expect 90% Power**
t(table(Dices))

F 版似乎以 339 的注册数再次成为赢家

在我们继续之前,让我们做一个快速的健全性检查,看看我们的实验现在是否有 90%的统计功效;这可以通过问以下问题来回答:

  • 如果我们重复我们的实验 X 次,并计算每次实验的 P 值,那么在百分之几的时间里,我们会得到极端的 P 值 5%?

让我们试着回答 F 版和 A 版的这个问题:

**# Proving by simulation**
MultipleDiceRolling <- function(k,N) {
  pValues <- NULL
  for (i in 1:k) {
    Dices <- DiceRolling(N)    
    VersionF <- Dices[which(Dices$Version=="F"),]
    VersionA <- Dices[which(Dices$Version=="A"),]
    pValues <- cbind(pValues,t.test(VersionF$Signup,VersionA$Signup,alternative="greater")$p.value)
    i <- i +1
  }
  return(pValues)
}
**# Lets replicate our experiment (9456 throws of a biased dice) 10k times**
start_time <- Sys.time()
Rolls <- MultipleDiceRolling(10000,9456)
end_time <- Sys.time()
end_time - start_time

我们有多少次观察到 P 值达到 5%的极端值?

cat(paste(**length**(which(Rolls <= 0.05)),"Times"))

我们观察到这种情况的几率是多少?

Power <- **length**(which(Rolls <= 0.05))/**length**(Rolls)
cat(paste(**round**(Power*100,2),"% of the times (",**length**(which(Rolls <= 0.05)),"/",**length**(Rolls),")",sep=""))

按照上面的计算,我们观察到大约相当于 90%的功率(0.896),这证明我们的新样本大小按计划工作。这意味着我们有 10% (1 次方)的概率犯下第二类错误,或者,等价地,有 10%的概率无法在 95%的置信区间拒绝我们的零假设,即使它是假的,这是可以接受的。

绝对的赢家

最后,让我们通过重复与这些新样本的成对比较,继续寻找我们的绝对赢家:

我们用红色标记了 p 值

不出所料,在所有其他版本中,我们的绝对赢家是 F 版。此外,现在也很清楚,任何其他版本的真实含义之间没有显著差异。

最后的想法

我们已经探索了如何在两种类型的测试上执行模拟;一个和两个独立样本的卡方检验和学生检验。此外,我们还研究了一些概念,如 I 型和 II 型错误、置信区间以及两种情况下统计功效的计算和解释。

重要的是要知道,通过在传统的用例场景中使用专门的功能来执行这样的测试,我们可以节省很多时间,甚至可以获得更准确的结果,因此不建议遵循这种模拟路径。相比之下,这种类型的练习提供了帮助我们发展更直观的理解的价值,这是我想要达到的。

如果您有任何问题或意见,请不要犹豫,在下面发表。

具有注意机制的序列到序列模型的直观理解和逐步实现

原文:https://towardsdatascience.com/intuitive-understanding-and-step-by-step-implementation-of-sequence-to-sequence-model-with-86be00ebe0fd?source=collection_archive---------41-----------------------

使用具有注意机制的序列到序列体系结构进行英语到印地语的神经机器翻译

如果你曾经使用过谷歌翻译或者曾经与 Siri、Alexa 或谷歌助手进行过交互,你就见证了序列对序列(seq2seq)神经架构的直接影响。Seq2seq 模型构成了机器翻译、图像和视频字幕、文本摘要、聊天机器人以及任何您可能想到的包括从一个数据序列到另一个数据序列的转换的任务的基础。

我们这里的重点是机器翻译,基本上是将一种语言的句子 x 翻译成另一种语言的句子 y 。机器翻译是 seq2seq 模型的主要用例,并通过注意机制得到改进。关于这类主题的文章通常涉及大量代码段的实现和来自多个库的大量 API 调用,而没有对概念本身的直观理解。在这里,我们将对理论和实现进行充分的公正。除了实现之外,我们还将详细了解 seq2seq 架构和关注点的每个组件代表什么。本文使用的代码可以在这里 找到

目标

  • 在 Tensorflow 中实现、训练和测试英语到印地语的机器翻译模型。
  • 对编码器、解码器和注意机制的作用在每一步形成直观和透彻的理解。
  • 讨论如何进一步改进现有模型。

读取数据集

首先,我们导入我们将需要的所有库。在这个实现中使用的英语到印地语的语料库可以在 Kaggle 这里找到。将下载一个名为“Hindi _ English _ Truncated _ corpus . CSV”的文件。确保在 pd.read_csv() 函数中放置正确的文件路径,与您的文件系统中的路径相对应。

让我们快速浏览一下我们正在处理的数据集。这相当简单。

预处理数据

在我们继续我们的编码器、解码器和注意力实现之前,我们需要以一种可以用数学方法解释的方式预处理我们的数据。请注意,预处理步骤还取决于我们正在处理的数据类型。例如,在这里考虑的数据集中,也有包含空字符串的句子。我们需要相应地处理这种情况。如果使用其他数据集,可能还会有一些额外或更少的步骤。预处理的步骤包括:

  • 在单词和标点符号之间插入空格
  • 如果手边的句子是英语,我们用空格代替除了 (a-z,a-z,“), "?", "!",","
  • 多余的空格被从句子中删除,关键字“sentencestart”和“sentenceend”被分别添加到句子的前面和后面,以让我们的模型清楚地知道句子何时开始和结束。

以上每个句子的三个任务都是使用 preprocess_sentence()函数实现的。我们还在开始时初始化了所有的超参数和全局变量。请务必阅读下面的这些超参数和全局变量。我们将在需要时使用它们。

  • 遍历包含英语和印地语句子对的每个数据点,确保不考虑包含空字符串的句子,并且句子中的最大字数不大于值 MAX_WORDS_IN_A_SENTENCE。采取这一步骤是为了避免矩阵稀疏。
  • 下一步是向量化我们的文本语料库。具体来说, fit_on_texts() 为每个单词分配一个唯一的索引。 texts_to_sequences() 将一个文本句子转换成一个数字列表或向量,其中数字对应于单词的唯一索引。 pad_sequences() 通过追加 oov_token (来自 vocab token)足够的次数以使每个向量具有相同的长度,从而确保所有这些向量最终具有相同的长度。 tokenize_sentences() 封装了以上这些功能。
  • 接下来,我们从完整的数据集中获取训练集,然后对训练集进行批处理。我们训练模型的句子对的总数是 51712。

编码器

Seq2seq 架构涉及两个长短期记忆(LSTM)在原文中。一个用于编码器,另一个用于解码器。请注意,我们将在编码器和解码器中使用 GRU(门控循环单元)来代替 LSTM,因为 GRU 需要较少的计算能力,并且给出与 LSTM 几乎相似的结果。编码器涉及的步骤:

  1. 输入句子中的每个单词被嵌入并表示在具有 embedding_dim (超参数)维度的不同空间中。换句话说,你可以说词汇中的单词数量被投射到一个具有嵌入维度的空间上。这一步确保了相似的词(如船&船,人&男孩,跑&走等。)就位于这个空间的附*。这意味着单词“man”和单词“ boy ”被预测到的几率几乎相同(不完全相同),而且两个单词的意思相似。
  2. 接下来,嵌入的句子被馈入 GRU。编码器 GRU 的最终隐藏状态成为解码器 GRU 的初始隐藏状态。编码器中的这个最终 GRU 隐藏状态具有源句子的编码或信息。源句子的这种编码也可以由所有编码器隐藏状态的组合来提供[我们将很快看到,这一事实对于注意力概念的存在是必不可少的]。

解码器(无需注意)

注意:在这一节中,我们将理解不涉及注意力的情况下的解码器。这对于理解注意力和解码器的作用是很重要的,这将在前面的章节中解释。

解码器 GRU 网络是生成目标句子的语言模型。最终的编码器隐藏状态被用作解码器 GRU 的初始隐藏状态。给予解码器 GRU 单元以预测下一个的第一个字是类似于“ sentencestart ”的开始标记。这个令牌用于预测所有的 num_words 个单词出现的概率。在训练时,使用预测的概率张量和实际单词的一键编码来计算损失。该损失被反向传播以优化编码器&解码器中的参数。同时,具有最大概率的单词成为下一个 GRU 单元的输入。重复上述步骤,直到出现类似“句子 end 的结束标记。

无需注意的编码器-解码器模型

这种方法的问题:

  • 信息瓶颈:如上所述,对于解码器来说,编码器的最终隐藏状态变成了初始隐藏状态。这造成了信息瓶颈,因为源句子的所有信息都需要在最终状态下被压缩,与在句子中很久以前看到的信息相比,这也可能偏向于在句子末尾的信息。

解决方案:我们通过不仅仅依赖编码器最终状态来获得源语句的信息,而且使用来自编码器的所有输出的加权和来解决上述问题。那么,你问哪个编码器输出的权重比另一个大呢?注意这里的救援,我们将在接下来的部分讨论这一点。

现在注意点

注意力不仅为瓶颈问题提供了解决方案,还为句子中的每个单词赋予了权重。你看,源序列在编码器输出中有它的信息,在解码器中被预测的字在相应的解码器隐藏状态中有它的信息。我们需要知道哪个编码器输出保存了与解码器隐藏状态相似的信息。因此,这些编码器输出和解码器隐藏状态被用作数学函数的输入,以产生注意力得分向量。当预测一个单词时,在每一步计算这个注意力得分向量(在解码器中的每个 GRU 单元)。该向量确定每个编码器输出的权重,以找到加权和。

注意力的一般定义:给定一组向量“值”和一个向量“查询”,注意力是一种计算依赖于查询的值的加权和的技术。

在我们的 seq2seq 架构的上下文中,每个解码器隐藏状态(查询)关注所有编码器输出(值),以获得取决于解码器隐藏状态(查询)的编码器输出(值)的加权和。

加权总和是值中包含的信息的选择性汇总,其中查询确定关注哪些值。这个过程就像将查询投影到值空间中,以在值空间中找到查询(得分)的上下文。高分表示对应的值与查询更相似。

根据原文注意,解码器决定源句中需要注意的部分。通过让解码器具有注意机制,我们将编码器从必须将源句子中的所有信息编码成固定长度向量的负担中解脱出来。利用这种新方法,信息可以在注释序列中传播,解码器可以相应地选择性地检索注释序列。

还记得我们刚刚谈到的数学函数吗?嗯,有几种方法可以找到注意力得分(相似度)。主要的例子如下:

  1. 基本点积注意
  2. 倍增注意力
  3. 附加注意力

在这里,我们不会深入讨论每一个问题。一个简单的谷歌搜索就足以深入其中。对于我们的实施,我们将考虑基本点积注意事项,因为它最容易掌握。你已经猜到这一类注意力是做什么的了。从名字判断,它是输入矩阵的点积。

请注意,基本的点积注意力有一个假设。它假设要进行点积的轴上的两个输入矩阵的维数需要相同,才能进行点积。在我们的实现中,这个维度由超参数 hidden_units 给出,并且对于两个编码器&解码器是相同的。

编码器输出加权和的计算

理论太多。现在让我们回到代码上来!我们将定义我们的注意力类别。

  1. 取编码器输出张量和解码器隐藏状态的点积,得到注意力得分。这是通过 Tensorflow 的 matmul() 函数实现的。
  2. 我们取上一步得到的注意力分数的最大值。这样做是为了使分数正常化,并使值在区间[0,1]内。
  3. 编码器输出与相应的注意力分数相乘,然后相加得到一个张量。这基本上是编码器输出的加权和,由 reduce_sum() 函数实现。

解码器(注意)

在我们的解码器类中采取了以下步骤。

  1. 就像编码器一样,我们在这里也有一个嵌入层,用于目标语言中的序列。序列中的每个单词都表示在嵌入空间中,其中具有相似含义的相似单词接*。
  2. 我们还通过使用当前解码器隐藏状态和编码器输出来获得编码器输出的加权和。这是通过调用我们的注意力层来完成的。
  3. 我们连接在上面两个步骤中获得的结果(嵌入空间中序列的表示和编码器输出的加权和)。这个级联张量被发送到我们解码器的 GRU 层。
  4. 该 GRU 层的输出被发送到一个密集层,该层给出所有 hindi_vocab_size 个单词出现的概率。概率高的单词暗示模型认为这个单词应该是下一个单词。

注意的编码器-解码器模型

培养

我们定义我们的损失函数和优化器。选择稀疏分类交叉熵损失和 Adam 优化器。每个培训步骤涉及的步骤:

  1. 从编码器对象获取编码器序列输出和编码器最终隐藏状态。编码器序列输出将用于寻找注意力分数,并且编码器最终隐藏状态将成为解码器的初始隐藏状态。
  2. 对于要在目标语言中预测的每个单词,我们给出一个输入单词、先前的解码器隐藏状态和编码器序列输出作为解码器对象的参数。返回单词预测概率和当前解码器隐藏状态。
  3. 具有最大概率的字被认为是下一个解码器 GRU 单元(解码器对象)的输入,并且当前解码器隐藏状态成为下一个解码器 GRU 单元的输入隐藏状态。
  4. 使用单词预测概率和目标句子中的实际单词来计算损失,并反向传播。

在每个历元中,为每一批调用上述训练步骤,并最终存储和绘制对应于每个历元的损失。

补充说明:在步骤 1 中,为什么我们仍然使用编码器的最终隐藏状态作为解码器的第一个隐藏状态?

这是因为,如果我们这样做,seq2seq 模型将作为一个单一系统进行优化。反向传播是端到端的。我们不想分别优化编码器和解码器。并且,没有必要通过这个隐藏状态获得源序列信息,因为我们现在已经有了我们的注意力:)

测试

为了测试我们的模型在训练后的表现,我们定义了一个函数,该函数接收一个英语句子,并根据我们的模型的预测返回一个印地语句子。让我们实现这个函数,我们将在下一节中看到结果的好坏。

  1. 我们接受英语句子,对其进行预处理,并将其转换为长度为 MAX_WORDS_IN_A_SENTENCE 的序列或向量,如最开始的“预处理数据”部分所述。
  2. 这个序列被输入到我们训练过的编码器中,编码器返回编码器序列输出和编码器的最终隐藏状态。
  3. 编码器的最终隐藏状态是解码器的第一个隐藏状态,输入到解码器的第一个字是开始标记“sentencestart”。
  4. 解码器返回预测的单词概率。具有最大概率的单词成为我们预测的单词,并被附加到最终的印地语句子中。这个字作为下一个解码器层的输入。
  5. 预测单词的循环继续,直到解码器预测到结束标记“sentenceend”或单词数量超过某个限制(我们将该限制保持为 MAX_WORDS_IN_A_SENTENCE 的两倍)。

结果

先说结果和发现。我用 NVidia K80 GPU 在 Kaggle 上运行代码,上面的代码中给出了超参数。100 个纪元,训练用了 70 分钟。损失与时期的关系图如下所示。

在训练了 35 个纪元后,我尝试将随机的英语句子扔给我们的 translate_sentence() 函数,结果有些令人满意,但在某种程度上仍有疑问。显然,超参数可以进一步优化。

35 个周期后的结果

但是超参数并不是唯一要对实际翻译中的一些偏差负责的因素。让我们就可以实现以使我们的模型表现得更好的一些要点进行一个小小的讨论。

可能的改进

在实现我们的模型时,我们已经对编码器、解码器和注意机制有了非常基本的了解。根据可用的时间和计算能力,以下是可以尝试和测试的一些要点,以了解它们在实施时是否工作良好:

  1. 编码器和解码器使用堆叠 GRU
  2. 使用不同形式的注意力如上所述
  3. 使用不同的优化器
  4. 数据集大小的增加
  5. 使用波束搜索解码代替贪婪解码

我们看到的解码是贪婪解码。我们假设具有最高概率的字是最终预测的字,并输入到下一个解码器状态。这种方法的问题是没有办法撤销这个决定。另一方面,波束搜索解码考虑来自单词概率分布的前 k 个可能单词,并检查所有可能性。你可以阅读更多关于波束搜索解码和一些其他可能的解码这里

我希望这里提供的信息增加了您对 NLP 和 seq2seq 架构的理解。关注推广更多这样的内容。你也可以在 LinkedIn 上和我联系。

参考

  1. https://arxiv.org/abs/1409.3215】原文为序对序架构没有注意
  2. https://arxiv.org/abs/1409.0473原文为序对序架构关注
  3. 数据集:https://www . ka ggle . com/aiswaryaramachandran/hindienglish-corpora
  4. 斯坦福 CS224N:具有深度学习的| Winter 2019 |第八讲—翻译,Seq2Seq,注意
  5. https://www . tensor flow . org/tutorials/text/NMT _ with _ attention

对特征向量的直观理解:PCA 的关键

原文:https://towardsdatascience.com/intuitive-understanding-of-eigenvectors-key-to-pca-a30a261c80de?source=collection_archive---------19-----------------------

真正理解主成分分析(PCA)需要对线性代数背后的概念,尤其是特征向量有一个清晰的理解。有许多文章解释了 PCA 及其重要性,尽管我发现有一些文章解释了 PCA 背后的直觉。

这篇文章的目的是给特征向量一个直观的理解,使你更好地理解主成分分析。PCA 算法的步骤不是本文的重点。

首先,我想从可视化线性代数的一些基本概念开始。

线性变换

矩阵在线性空间中被称为函数或“变换”——这意味着,在线性空间中对向量进行变换后,保持了线性度。参考下面的例子-

在图中,我们看到一个向量a =【2 ^ 2】在乘以矩阵 b 后,被转换成向量【4 ^ 2】

图 1(左)显示了变换前的矢量“a ”,图 2 显示了被矩阵 B“变换”后的矢量“a”

基础变更

在标准坐标系中,单位矢量 i 和 j 被认为是“基”矢量。这些标准基向量成为测量我们系统的一种方式。

但是,如果我们想改变基本向量,因为我们的数据在不同的系统中可能看起来更好呢?

例如,如果我们在二维空间中有一些数据点。

二维*面中的分散数据

这个视图告诉我们一些关于数据的信息,但是如果我们旋转坐标轴,我们可以得到一个更清晰的视图。

新轴以数据的*均值为中心。这种旋转使我们更容易测量数据的分布方差。它还清楚地显示了存在两个不同的数据组。

那么,我们如何着手改变基础呢?—线性变换。

矩阵乘法只不过是把当前坐标系的基变换成矩阵定义的新坐标系。矩阵的列向量给出了新基向量的位置。

以前面的线性变换为例,我们将向量 a 乘以矩阵 B ,我们找到了向量 a 在矩阵 B 的基本向量所跨越的新坐标系中的位置。参见下图。

图 1(左)显示了标准坐标系中的矢量 a。图 2(右)显示了放置在矩阵 B 给出的新坐标系中的矢量 a

如果我们想“回到”原来的坐标系,我们只需将“新向量”乘以基矩阵变化的倒数 B

因此,将矢量【4 ^ 2】乘以 B 的逆,就得到矢量【2 ^ 2】

特征向量和特征值

特征向量和特征值如何适应所有这些?

在线性变换期间,可能存在一些保持在它们的原始跨度上的向量,并且仅被缩放或收缩。换句话说,它们的方向保持不变。数学上,它被表达为—

由变换 A 给出的特征向量 x 的表达式

λ是与特征向量 x 相关联的特征值,矩阵 A 被称为应用于向量 x 的变换。

表示为变换函数的特征向量

从几何学上讲,我们可以用下面的方式来形象化它

向量 x 上的变换导致将其拉伸 2 倍(请注意,方向或跨度没有变化)

这里,对向量 x 的变换将它拉伸到两倍的长度。因此,与该变换相关的特征值是 2。负特征值与翻转向量或反转向量方向相关。

是什么让它们如此有用?

由特征向量给出的坐标系被称为特征基,它可以写成对角矩阵,因为它将每个基向量缩放了某个值。

具有 N 个特征向量的对角矩阵

对角矩阵使计算变得非常容易。考虑将矩阵提升到 100 的幂,在非对角矩阵的情况下,这将成为一项艰巨的任务。在对角矩阵的情况下,计算相当简单。

对角矩阵使计算更容易

根据 PCA

PCA 的目标是最小化冗余最大化方差以更好地表达数据。这是通过找到与数据点的协方差矩阵相关联的特征向量来实现的。然后将数据投影到由这些特征向量构成的新坐标系上。要进一步了解 PCA,请查阅参考文献[1]和[2]。

我希望这能作为对特征向量的直观理解,并帮助你更好地理解 PCA 算法。

参考文献

所有的图表都是用-https://www.desmos.com/制作的

  1. PCA 教程—https://arxiv.org/pdf/1404.1100.pdf
  2. http://www.math.union.edu/~jaureguj/PCA.pdf
  3. https://www.khanacademy.org/math/linear-algebra/
  4. 关于线性代数的精彩系列 3 blue 1 brown—【https://www.youtube.com/watch?v=fNk_zzaMoSs】T2&list = plzhqobowt qd D3 mizm 2 xvfitgf 8 he _ ab&index = 1

对随机化奇异值分解的直观理解

原文:https://towardsdatascience.com/intuitive-understanding-of-randomized-singular-value-decomposition-9389e27cb9de?source=collection_archive---------16-----------------------

随机线性代数奇异值分解的 Python 实现

矩阵分解是许多机器学习问题的强大工具,它已经广泛用于数据压缩、降维和稀疏学习等。在许多情况下,为了用低秩结构逼*数据矩阵,奇异值分解(SVD)通常被证明是最佳选择。然而,大数据矩阵(例如,8k 乘 10k 矩阵)的准确且有效的 SVD 在计算上具有挑战性。为了解决这种情况下的奇异值分解,许多算法通过应用随机线性代数方法被开发出来。最重要的算法之一是随机化 SVD,它对于分解任何具有相对较低秩的大型矩阵具有竞争效率。

图 SVD 主要发展的时间表。(图片来自[2])

这篇文章将介绍随机奇异值分解的基本思想。为了帮助读者更好地理解随机化 SVD,我们在本文中还提供了相应的 Python 实现。另外,这个帖子的 Jupyter 笔记本可以在这里找到。

初步的

奇异值分解公式

我们首先回顾奇异值分解的概念。你可能已经知道,SVD 是线性代数中最重要的分解公式之一。对于任意给定的矩阵 A ,SVD 具有如下形式

a=uσv**^t

其中矩阵V 分别由左和右奇异向量组成。σ的对角线项为奇异值。

一个小矩阵例子

以一个 3 乘 3 的矩阵为例,我们可以通过使用 Python 中的numpy.linalg.svd()来计算 SVD。让我们看一看:

*import numpy as npA = np.array([[1, 3, 2],
              [5, 3, 1],
              [3, 4, 5]])
u, s, v = np.linalg.svd(A, full_matrices = 0)
print('Left singular vectors:')
print(u)
print()
print('Singular values:')
print(s)
print()
print('Right singular vectors:')
print(v)
print()*

在这种情况下,奇异值为 9.3427、3.2450 和 1.0885。

*Left singular vectors:
[[-0.37421754 0.28475648 -0.88253894]
 [-0.56470638 -0.82485997 -0.02669705]
 [-0.7355732 0.48838486 0.46948087]]Singular values:
[9.34265841 3.24497827 1.08850813]Right singular vectors:
[[-0.57847229 -0.61642675 -0.53421706]
 [-0.73171177 0.10269066 0.67383419]
 [ 0.36051032 -0.78068732 0.51045041]]*

随机化奇异值分解

基本理念

随机化 SVD 可以分为三个主要步骤。对于任意给定的 m -by- n 矩阵,如果我们强加一个目标秩 kk < min( mn ),那么如图 2 所示的第一步就是**

  • 1)通过 -k 生成大小为 n- 的高斯随机矩阵ω
  • 2)计算新的 m -by- k 矩阵 Y
  • 以及 3)对矩阵 Y 应用 QR 分解。

注意,第一步需要返回 m -by- k 矩阵 Q

图 2:随机化 SVD 的第一步。(图片来自[2])

然后,如图 3 所示的第二步是

  • 4)将 Q 的转置矩阵与矩阵 A 相乘,得到一个 k -by- n 矩阵 B
  • 以及 5)计算矩阵 B. 的 SVD 这里,不是计算原矩阵 AB 的 SVD,而是一个更小的矩阵来进行工作。

由于矩阵*的奇异值(即σ**)和右奇异向量(即 V )也是原矩阵A 的奇异值和右奇异向量,我们应该保留矩阵 B 计算的奇异值和右奇异向量***

图 3:随机化 SVD 的第二步和第三步。(图片来自[2])

如图 3 所示,如果将第一步中导出的矩阵 QB 的左奇异向量组合,就可以得到第三步中矩阵【A的左奇异向量(即 U )。

一个小矩阵例子

即使我们在上面已经学习了随机化 SVD 的基本思想,如果没有直观的例子,它也不会真正清楚。为此,我们遵循前面提到的小矩阵奇异值分解。

首先,让我们尝试编写随机化 SVD 的 Python 函数。这里,我们将使用两个 Numpy 函数,即np.linalg.qr()np.linalg.svd()

**import numpy as npdef rsvd(A, Omega):
    Y = A @ Omega
    Q, _ = np.linalg.qr(Y)
    B = Q.T @ A
    u_tilde, s, v = np.linalg.svd(B, full_matrices = 0)
    u = Q @ u_tilde
    return u, s, v**

现在,让我们用 3 乘 3 矩阵(rank = 2表示 kkmin(mn )来测试一下:

**np.random.seed(1000)A = np.array([[1, 3, 2],
              [5, 3, 1],
              [3, 4, 5]])
rank = 2
Omega = np.random.randn(A.shape[1], rank)
u, s, v = rsvd(A, Omega)
print('Left singular vectors:')
print(u)
print()
print('Singular values:')
print(s)
print()
print('Right singular vectors:')
print(v)
print()**

这个随机 SVD 示例的结果是:

**Left singular vectors:
[[ 0.38070859  0.60505354]
 [ 0.56830191 -0.74963644]
 [ 0.72944767  0.26824507]]Singular values:
[9.34224023 3.02039888]Right singular vectors:
[[ 0.57915029  0.61707064  0.53273704]
 [-0.77420021  0.21163814  0.59650929]]**

回想一下,这个矩阵的奇异值是 9.34273.2450 和 1.0885。在这种情况下,随机化 SVD 的前两个奇异值为 9.34223.0204

我们可以看到,由这两种 SVD 算法计算的第一奇异值非常接*。但是,随机化 SVD 的第二奇异值略有偏差。有没有其他方法可以改善这个结果?又是怎么做到的?

答案是肯定的!

幂迭代随机奇异值分解

为了提高随机奇异值分解的质量,可以直接使用幂迭代法。关于幂迭代的更多细节,请参见[1]第 39 页,第 40 页也有一个 Matlab 实现。

在下面的 Python 代码中,power_iteration()是迭代计算 m -by- k 矩阵 Y 然后通过 QR 分解导出 m -by- k 矩阵 Q 的函数。

**import numpy as npdef power_iteration(A, Omega, power_iter = 3):
    Y = A @ Omega
    for q in range(power_iter):
        Y = A @ (A.T @ Y)
    Q, _ = np.linalg.qr(Y)
    return Qdef rsvd(A, Omega):
    Q = power_iteration(A, Omega)
    B = Q.T @ A
    u_tilde, s, v = np.linalg.svd(B, full_matrices = 0)
    u = Q @ u_tilde
    return u, s, v**

让我们测试一下新的rsvd()函数:

**np.random.seed(1000)A = np.array([[1, 3, 2],
              [5, 3, 1],
              [3, 4, 5]])
rank = 2
Omega = np.random.randn(A.shape[1], rank)
u, s, v = rsvd(A, Omega)
print('Left singular vectors:')
print(u)
print()
print('Singular values:')
print(s)
print()
print('Right singular vectors:')
print(v)
print()**

结果是:

**Left singular vectors:
[[ 0.37421757  0.28528579]
 [ 0.56470638 -0.82484381]
 [ 0.73557319  0.48810317]]Singular values:
[9.34265841 3.24497775]Right singular vectors:
[[ 0.57847229  0.61642675  0.53421706]
 [-0.73178429  0.10284774  0.67373147]]**

回想一下:

  • 奇异值分解的奇异值有: 9.34273.2450 ,1.0885。
  • 无幂迭代的随机化 SVD 奇异值有: 9.34223.0204
  • 幂迭代的随机化 SVD 奇异值为: 9.34273.2450

如您所见,幂迭代随机化 SVD 提供了极其精确的奇异值。

图像压缩

如上所述,可以使用 SVD 或随机化 SVD 来压缩(低秩)信号矩阵。事实上,使用奇异值分解压缩图像的方法非常简单:直接对图像进行奇异值分解,只保留主奇异值和左/右奇异向量。在随机奇异值分解方面,我们可以先预先确定主奇异值的个数,然后通过随机奇异值分解得到奇异值和左/右奇异向量。

对于我们的评估,我们选择莉娜的彩色图像作为我们的数据。这张图片的尺寸是 256×256×3。在这里,我们通过只选择绿色通道来构建一个大小为 256×256 的矩阵

  • 直接使用 SVD

  • 使用随机奇异值分解代替

从这个图像压缩实验中我们可以看出:

  • 1)通过与 SVD 相比较,随机化的 SVD 也可以产生具有规定的低秩的精确压缩(这里,我们设置rank = 50)。
  • 2)随机化的 SVD 是计算友好的。通过指定rank = 50,随机化 SVD 的总 CPU 时间约为 11.6 ms ,而 SVD 的总 CPU 时间为 31.5 ms

摘要

在本文中,您发现了 SVD 的随机化线性代数方法。具体来说,您学到了:

  • 随机化奇异值分解的基本思想。
  • 如何用 Python 实现随机化的 SVD?

你有什么问题吗?

参考

[1]史蒂文·l·布伦顿,j·内森·库兹(2019)。数据驱动的科学与工程:机器学习、动力系统和控制。第 37–41 页。

[2] N .本杰明·埃里克森,谢尔盖·沃罗宁,史蒂文·l·布伦顿,j .内森·库兹(2016)。使用 R. arXiv 的随机矩阵分解:1608.02148。[ PDF

用于时尚图像多类分类的直观 CNN 创建

原文:https://towardsdatascience.com/intuitively-create-cnn-for-fashion-image-multi-class-classification-6e31421d5227?source=collection_archive---------24-----------------------

服装图像分类中使用 Keras 的卷积神经网络创建的分步走查

Img 改编自 Pixabay 通过链接

在之前的文章中,我创建了一个卷积神经网络(CNN)用于二值图像分类。在本文中,我将为零售营销行业创建另一个 CNN。本文的独特之处在于:不同格式的输入数据需要不同的数据处理方法,不同的 CNN 架构支持多类分类。它被分成 6 部分。

  1. 问题陈述
  2. 数据处理
  3. 模型结构
  4. 模型编译
  5. 模型拟合
  6. 模型评估

让我们开始旅程吧🏃‍♀️🏃‍♂️.

  1. 问题陈述

我们得到了一组来自零售业的图片。任务是创建一个 CNN 模型来预测一个时尚形象的标签:0 为 t 恤;1 作为裤子;2 作为套头衫;3 作为着装;4 作为外套;5 作为凉鞋;6 as 衬衫;7 作为球鞋;8 as 包;9 作为踝靴。

2.数据处理

我们使用的数据是具有 70,000 幅图像的 Fashion MINST 数据集,其中 60,000 幅用于训练集,10,000 幅用于测试集。所有图像都是灰度,高 28 像素,宽 28 像素。每个像素代表像素的暗度,范围从 0(黑色)到 255(白色)。

图 1 是训练数据的一个片段。请注意,代表图像的每一行都有一个关联的标签和 784 像素值。

图 1 训练数据片段

首先,读入训练和测试数据,将数据帧类型转换为 NumPy 数组

fashion_train_df = pd.read_csv(‘fashion-mnist_train.csv’,sep=’,’)
fashion_test_df = pd.read_csv(‘fashion-mnist_test.csv’, sep = ‘,’)
training = np.array(fashion_train_df, dtype = ‘float32’)
testing = np.array(fashion_test_df, dtype=’float32')

如果您想以彩色或灰度模式查看图像,请尝试以下方式:

i = random.randint(1,60000) 
plt.imshow( training[i,1:].reshape((28,28)) ) 
plt.imshow( training[i,1:].reshape((28,28)) , cmap = ‘gray’) 

接下来,在 0 和 1 之间缩放独立变量,即像素。

X_train = training[:,1:]/255
y_train = training[:,0]
X_test = testing[:,1:]/255
y_test = testing[:,0]

然后,将训练数据分成训练集和验证集,验证占 20%。通过验证集,将评估模型对新数据进行概括预测的能力。

X_train, X_validate, y_train, y_validate = train_test_split(X_train, y_train, test_size = 0.2, random_state = 12345)

最后,我们需要重塑 X_trainX_validateX_test 。这是一个临界点。 Keras 只接受 CNN 特殊形状的输入数据,即(批量大小,像素宽度,像素高度,颜色通道数)。因此,

X_train = X_train.reshape((-1, 28, 28, 1))
X_test = X_test.reshape(X_test.shape[0], *(28, 28, 1))
X_validate = X_validate.reshape(X_validate.shape[0], *(28, 28, 1))

请注意,有两种方法用于重塑上述数据,达到了相同的目的。第一种方法为 Numpy 设置第一维度进行推断,第二种方法用*定义第一维度。

太好了,现在数据已经准备好训练模型了😎。

3.模型建立

一般来说,建立一个 CNN 需要 4 个步骤:卷积、最大池化、扁*化和完全连接。在这里,我们将建立一个有两个卷积层的 CNN 模型。

3.1 卷积

从根本上说,CNN 是基于卷积的。简而言之,卷积使用一个核矩阵来扫描给定的图像,并应用滤镜来获得某种效果,如模糊和锐化。在 CNN 中,核用于特征提取,以选择图像中最重要的像素,同时保持像素之间的空间关系。

如果你想要一个详细的概念解释,请点击查看上一篇文章。请随意探索这个神奇的网站来可视化卷积如何工作。另一个很棒的 T4 网站是瑞尔森大学的。它直观、互动地展示了 CNN 是如何工作的。

具体来说,

classifier = Sequential()
classifier.add(Conv2D(64,3, 3, input_shape = (28,28,1), activation=’relu’))

注意,特征检测器的数量 n 设置为 64,特征检测器为 3×3 阵列。 input_shape 是我们通过卷积对其应用特征检测器的输入图像的形状。我们设置为 (28,28,1)。这里,1 是灰度图像的通道数,28x28 是每个通道中的图像尺寸。这需要与 X_trainX_testX_validate 的形状相同。

最后一个参数是激活函数。我们使用 ReLU 去除特征图中的负像素值。这是因为根据卷积中使用的参数,我们可能会在特征图中获得负像素。移除负像素增加了非线性分类问题的非线性。

3.2 最大池化

最大池化是通过滑动表格并取表格中的最大值来减小卷积产生的特征图的大小。最终,它的目标是在不丢失图像中的关键特征和空间结构信息的情况下,减少完全连接层中的节点数量。

具体来说,我们使用 MaxPooling2D() 函数来添加池层。一般来说,我们使用 2x2 的表格进行合并。

classifier.add(MaxPooling2D(pool_size = (2, 2)))

3.3 辍学

辍学是过度拟合的解决方案。辍学是怎么回事🤔?在每次训练迭代期间,一些神经元被随机禁用,以防止它们过于依赖彼此。通过覆盖这些神经元,神经网络每次都保留不同的架构,帮助神经网络学习数据的独立相关性。这可以防止神经元过度学习。

具体来说,

classifier.add(Dropout(0.25))

注意,我们在每次迭代中将 25%的神经元设置为禁用。

3.4 卷积和最大池化

基于之前的实验,添加第二层用于卷积和最大池以提高模型性能。

classifier.add(Conv2D(32,3, 3, activation=’relu’))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

3.5 扁*化

展*是将所有缩减后的特征地图汇集成一个矢量,作为完全连接图层的输入。

具体来说,

classifier.add(Flatten())

3.6 完全连接

通过以上操作,我们将输入图像转换为一维向量。现在让我们使用这个向量作为输入来构建一个分类器。具体来说,

classifier.add(Dense(output_dim = 32, activation = ‘relu’))
classifier.add(Dense(output_dim = 10, activation = ‘sigmoid’))

注意,对于第一隐藏层,作为隐藏层中的节点数的 output_dim 被设置为 32。请随意尝试更多。使用 ReLU 作为激活功能。

完成后,祝贺你完成了模型制作。图 2 是我们构建的🎉🎉。

图 2 CNN 架构图(作者创建的 Img)

4.模型编译

添加完所有图层后,让我们为训练配置 CNN。要做的一个重要决定是损失函数。至于建议,如果一个样本可以有多个类或者标签,使用categorial _ cross entropy。如果类是互斥的(例如,当每个样本恰好属于一个类时),使用sparse _ category _ cross entropy。这里用后者。

classifier.compile(loss =’sparse_categorical_crossentropy’, optimizer=Adam(lr=0.001), metrics =[‘accuracy’])

5.模型拟合

我们根据数据对模型进行 50 次迭代训练。该模型每 512 个样本更新其梯度。使用( X_validatey_validate )评估模型损耗和精度。

epochs = 50
history = classifier.fit(X_train, y_train, batch_size = 512, nb_epoch = epochs, verbose = 1, validation_data = (X_validate, y_validate))

最终我们得到了一个训练精度为 92% 和测试精度为 90% ✨✨

6.模型评估

现在,让我们在测试集上评估模型。具体来说,

evaluation = classifier.evaluate(X_test, y_test)

我们获得了一个 90% 的测试准确率!如果你想知道如何计算精度,请阅读这篇文章

下面的图 3 显示了图像的预测标签和真实标签的视图。这个模型似乎不擅长区分套头衫(2)、衬衫(6)和外套(4)。

图 3 预测和真实类别比较

如果你想用更多的数据训练模型,可以随意探索这个链接。如果你想查一个零售业数据科学创新的真实案例,可以查这个页面

太好了!如果你觉得这篇文章有帮助,请随意点击👏s!如果需要源代码或者更多 CNN 用例,请访问我的 Github 页面🤞🤞。

用于癌症预测的支持向量机

原文:https://towardsdatascience.com/intuitively-explain-svm-and-build-for-breast-cancer-classification-cc9e081b7d86?source=collection_archive---------43-----------------------

支持向量机介绍及基于 Sklearn 的乳腺癌预测模型建立

来自 Unsplash 的细胞图像

在这篇文章中,我将解释支持向量机(SVM)如何工作,并建立一个乳腺癌预测的 SVM 模型。全文分为以下六个部分。

  1. SVM 简介
  2. 问题陈述
  3. 数据处理
  4. 模型拟合和评估
  5. 模型优化

现在让我们开始旅程🏃‍♂️🏃‍♀️.

  1. SVM 简介

支持向量机(SVM)最初在 20 世纪 60 年代开发,然后在 20 世纪 90 年代完善,在机器学习领域非常流行。它适用于可线性分离的数据,其中可以画线来分隔两个类别。SVM 是如何运作的🤔?

为简单起见,假设给出两列数据 x1x2 。为了区分 x1x2 ,我们画了几条边界线,如图 1 所示。根据新数据的位置,这些线会产生不同的结果。但是如何决定哪条线是最好的分离呢🤔?SVM 就是这么做的。

图 1 SVM 分类图(作者创建的 Img)

SVM 通过最大边距搜索最佳边界,如图 2 所示。换句话说,为了使这条线成为 SVM 的结果,从支持向量到边界的两个距离之和必须最大化。因此,只有支持向量对 SVM 结果有贡献。从概念上讲,它是一个简单的算法。

图 2 SVM 分类原则(作者创建的 Img)

为什么 SVM 与其他机器学习算法相比很特别?假设我们正在对水果进行分类:苹果或梨。大多数机器学习算法会看最像苹果的苹果,所以它知道苹果是什么。类似地,它试图通过查看梨的最典型特征来了解什么是梨,如图 3 所示。

图 3 应用/梨按普通 ML 分类(来自 pixabay 的水果图像)

但对 SVM 来说,情况恰恰相反。如图 4 所示,SVM 试图观察更像梨或非标准苹果的苹果,以及更像苹果的梨。这些最不典型的梨和苹果充当支持向量。通过观察极端案例,SVM 旨在找到区分不同阶层的最佳分界线。

图 4 SVM 对苹果/梨的分类(来自 pixabay 的水果图像)

2.问题陈述

乳腺癌是全球女性中最常见的癌症,占所有癌症病例的 25%。早期诊断可以大大增加存活的机会。关键的挑战是将肿瘤分为恶性 0 级或良性 1 级。

3.数据处理

我们的数据来自UCI机器学习库这里。有 569 个癌症数据实例,其中 212 个是恶性的,357 个是良性的。从癌症图像中提取了 30 个特征。

首先,以字典的形式读入数据,并转换成带有“数据”和“目标”列的数据帧

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
df_cancer = pd.DataFrame(np.c_[cancer[‘data’], cancer[‘target’]],
columns = np.append(cancer[‘feature_names’], [‘target’]))

图 5 显示了数据片段。显然,所有的特征都是数值。不需要数据编码。

图 5 输入数据片段

接下来,准备训练数据 Xy 并分割数据,测试集占 20%。

X = df_cancer.drop([‘target’],axis=1)
y = df_cancer[‘target’]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state=5)

拟合模型之前的一个必要步骤是特征缩放,以避免一个特征支配其他小特征并减少密集计算。这里我们使用基于单位的归一化来得到范围[0,1]内的所有值。

具体来说,

min_train = X_train.min()
range_train = (X_train — min_train).max()
X_train_scaled = (X_train — min_train)/range_trainmin_test = X_test.min()
range_test = (X_test — min_test).max()
X_test_scaled = (X_test — min_test)/range_test

4.模型拟合和评估

为了拟合和评估该模型,我们从 sklearn 获取 SVM 类。

from sklearn.svm import SVC
from sklearn.metrics import classification_report, confusion_matrix
svc_model = SVC()
svc_model.fit(X_train_scaled, y_train)
y_predict = svc_model.predict(X_test_scaled)
cm = confusion_matrix(y_test, y_predict)

经过测试,如图 6 的混淆矩阵所示,该模型显示了 96% ✨✨.的准确性

图 6 SVM 测试结果的混淆矩阵

5.模型优化

SVM 有两个有助于优化模型的关键参数。

第一个是 C 参数,控制正确分类训练点和具有*滑边界之间的权衡。小的 C 使得错误分类的成本(惩罚)很低,从而产生*滑的边界。然而,如果使用大的 C 参数,这意味着错误分类的高成本,迫使模型更严格地解释输入数据,并可能过度拟合。

第二个是伽玛参数。它控制单个训练集的影响范围。有了大的 gamma ,模型将有一个很*的范围,对靠*超*面的点赋予更高的权重。该模型具有过度拟合的高风险,产生更弯曲的边界。然而,使用小的 gamma ,该模型将更加一般化,因为远离超*面的更多数据点将被训练。

具体来说,我们使用网格搜索来调整 C伽马参数。

from sklearn.model_selection import GridSearchCV
param_grid = {‘C’: [0.1, 1, 10, 100], ‘gamma’: [1, 0.1, 0.01, 0.001], ‘kernel’: [‘rbf’]}grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=4)
grid.fit(X_train_scaled, y_train)

通过以上,我们找到了如图 7 所示的 Cgamma 的最佳参数。

图 7 网格搜索后的最佳参数

我们再次测试了模型,发现精度提高了 0.97,如图 8 所示。该模型仅将 3 个病例错误分类为恶性,这是一个不错的结果,因为这种错误分类不会对诊断造成任何显著影响🎉🎉。

图 8 优化后 SVM 测试结果的混淆矩阵

太好了!如果你觉得这篇文章有帮助,请随意点击👏s!如果你需要一些额外的,访问我的 Github 页面🤞🤞。

凭直觉,我们如何(更好地)理解逻辑回归

原文:https://towardsdatascience.com/intuitively-how-can-we-better-understand-logistic-regression-97af9e77e136?source=collection_archive---------38-----------------------

逻辑回归和线性判别分析密切相关。这里有一个直观的方法来理解它们,并帮助我们定义 Softmax 回归

在我之前的文章中,我介绍了 5 个分类原则,它们帮助我们定义了 5 种以上的算法。

我们用于逻辑回归的直觉是“*滑直线”。*滑函数是一个逻辑函数。现在,我们如何更好地理解我们是如何想出这个逻辑函数的呢?

和上一篇文章一样,我们将用蓝点和红点来解释 1D 情况的原理。

LDA 和逻辑回归是如何关联的

为了解释 LDA(线性判别分析),思路是先建立两个正态分布。对于新的点 x,我们可以考虑:

  • PDF_b(x) 其中 PDF_b:为蓝点的概率密度函数
  • PDF_r(x) 带 PDF _ r:红点的概率密度函数
  • p(B) :蓝点比例
  • p(R) :红点比例

新点为蓝色的最终概率为:

p(B)×PDF _ B(x)/(p(B)×PDF _ B(x)+p(R)×PDF _ R(x))

现在让我们看看普通的 PDF:

由于我们考虑到在 LDA 的情况下,两个类别的标准偏差是相同的,因此我们可以简化,x 项将消失,这就是为什么我们称之为线性判别分析。

如果我们不采用同标准差的假设(这意味着两个类别具有相同的标准差),x 项将保持不变,该算法称为二次判别分析。

所以对 LDA 来说,我们最终会得到这样的结果:

1/(1+exp(ax+b))

是的,一个逻辑函数!

当然,参数 a 和 b 与实际的 logistic 回归是不同的。

我们可以比较结果,在这种情况下,我们可以看到结果实际上非常接*(绿色曲线是 logistic 回归,黑色曲线是 LDA)。

结论:LDA 和逻辑回归产生的最终概率是逻辑函数。这两种方法之间的唯一区别在于

  • 逻辑回归使用最大似然来估计参数
  • LDA,参数来自一个正态分布的估计均值和方差以及每类的比例(先验概率)

简化普通 PDF

既然知道正态 PDF 中的 x 会在同方差的假设下不了了之,也许一开始就可以直接去掉。

所以我们可以直接考虑:

我们可以测试一些参数,以便绘制曲线。让我们从蓝色曲线 fb(x)开始:

  • 首先,我们可以让 a_b=1(蓝点的参数 a)
  • 对于 b_b,我们可以说曲线应该通过点(x =蓝点的*均值,y=1)

我们认为红色曲线的情况是对称的:

  • a_r =-1
  • 红色曲线应该通过该点(x =红点的*均值,y=1)

比率的计算

当我们计算比率得到最终概率时

我们最后还会有一个逻辑功能。

下面我们可以看到比例(黑线)。记住这里的参数 a 和 b 是手动选择的。

但即使如此,我们可以看到,在给定的情况下,它实际上并没有那么糟糕。下图中的绿线是逻辑回归模型,而黑线是用我们手动选择的参数计算的比率。

结论:logistic 回归是一个归一化的指数函数(由两类定义)。

Softmax 回归

凭着“*滑直线”的直觉,对于多个预测类的情况,不容易一概而论。但是有了归一化指数函数的思想,我们可以增加更多的类。

对于 K 类,我们可以考虑这个归一化的指数函数来估计 x 属于类 j 的概率

这是一个包含 3 个类别的图表

这被称为 softmax 回归,现在你知道在这个花哨的名字背后,它只是逻辑回归的一个非常简单的概括。

因为您知道逻辑回归非常接* LDA,所以 softmax 回归的结果应该接*多类 LDA ,如下图所示:

如果你发现一些不够直观的东西,或者如果你有任何问题,请评论,这将有助于我提高我的写作。

凭直觉,我们如何建立非线性分类器

原文:https://towardsdatascience.com/intuitively-how-can-we-build-non-linear-classifiers-10c381ed633e?source=collection_archive---------39-----------------------

直观地

现实生活中的问题往往是非线性的,所以让我们看看算法是如何处理非线性可分数据的。

在我的文章 直观地说,我们如何理解不同的分类算法 中,我介绍了 5 种数据分类的方法。

但是我用的玩具数据是几乎线性可分。因此,在本文中,我们将看到算法如何处理非线性可分离数据

让我们举一些 1D 的简单例子。

  • 左图(或第一幅图):带有一些噪声的线性可分数据
  • 右图(或第二个图形):非线性可分离数据

LDA 和标准差

LDA 表示线性判别分析。所以根据定义,它应该不能处理非线性可分数据。但也许我们可以做些改进,让它发挥作用?

让我们回到 LDA 的定义。想法是建立两个正态分布:一个用于蓝点,另一个用于红点。关于这两个正态分布的标准差的计算,我们有两个选择:

  • 我们可以为这两个类选择相同的标准差
  • 或者不同的标准偏差

同方差和线性判别分析

LDA 的思想包括比较两个分布(一个用于蓝点,一个用于红点)。或者我们可以计算蓝点密度的比率来估计新点属于蓝点的概率。

当估计正态分布时,如果我们认为两个类别的标准差相同,那么我们可以简化:

在上面的等式中,让我们用蓝色点的下标 b 和红色点下标 r 来记录*均值和标准偏差。

最后,经过简化,我们得到了一个逻辑函数。

异方差和二次判别分析

如果我们为每一类保留不同的标准差,那么 x 项或二次项将保持不变。

在下图中,我们可以看到,如果红点和蓝点的标准偏差不同,会更有意义:

然后我们可以看到两条曲线接触的地方有两个不同的点,这意味着它们是相等的,所以,概率是 50%。我们可以用这两个交点作为两个决策边界。

正是因为二次项导致了二次方程,所以我们得到了两个零点。所以我们称这种算法为 QDA二次判别分析

总之,用 LDA 提出非线性分类器是一种非常直观的方法:必须考虑不同类别的标准偏差是不同的。

但明显的缺点是,如果非线性更复杂,那么 QDA 算法就不能处理它。例如,如果我们需要 3 个线性边界的组合来分类数据,那么 QDA 将失败。

逻辑回归和一个二次项

逻辑回归在非线性可分数据面前表现也很差。我们可以在下面看到结果。

作为我上一篇文章的提醒,下面的图表显示了概率(蓝线和红线),您应该最大化乘积以获得逻辑回归的解。

我们知道 LDA 和逻辑回归是非常密切相关的。它们的最终模型是相同的,具有逻辑功能。但是参数的估计是不同的。你可以直观地阅读这篇文章 ,我们如何(更好地)理解逻辑回归

我们可以看到,从 LDA 到 QDA,区别在于二次项的存在。那么,为什么不尝试通过增加一个 x 项来改善逻辑回归呢?这就是为什么它被称为二次逻辑回归

然后将一个变量的初始数据转化为两个变量的数据集。现在,我们可以看到数据似乎表现为线性。

我们可以对这两个变量进行逻辑回归,得到如下结果。因为我们有两个输入和一个介于 0 和 1 之间的输出。然后我们可以将算法创建的表面可视化。

然后就可以找到决策边界,对应的是概率等于 50%的线。哪一个是 LR 表面和 y=0.5 的*面的交点

在 2D,我们可以画出一条线,作为我们的决策界限。我们可以把概率作为颜色的不透明度。

现在,二次 Logistic 回归二次判别分析是什么关系?在 1D,唯一的区别是参数估计的不同(对于二次逻辑回归,是似然最大化;对于 QDA ,参数来自均值和标准差估计)。

现在为了更高的维度。QDA 可以考虑协方差。至于 QDA,二次逻辑回归也无法捕捉数据中更复杂的非线性。

SVM 及其内核

手动添加二次项的技巧同样适用于 SVM。下面的结果表明,超*面分隔符似乎捕捉到了数据的非线性。(带 X 的点是支持向量。)

数学家们找到了其他转换数据的“技巧”。其中一个技巧是应用一个高斯内核。之后我们会看到一个快速的证明。但是解释它的一个直观的方法是:不要把支持向量(这里它们只是点)看作孤立的,而是把它们看作围绕着某种分布

我们先来看线性可分的数据,直觉仍然是分析前沿地区。代替线性函数,我们可以考虑采用由支持向量的分布形成的分布的曲线。我们可以看到支持向量【在边界】更重要。

现在让我们回到非线性可分的情况。我们可以应用同样的技巧,得到以下结果。

决策值是所有分布的加权和加上一个偏差。

我们可以注意到,在边境地区,我们有直线段。

最后,我们可以计算概率来对这些点进行分类。

内核技巧的想法可以看作是将数据映射到一个更高维度的空间。并且新的空间被称为特征空间

在多项式核的情况下,我们的初始空间(x,1 维)被转换成 2 维(由 x 和 x 形成)。在高斯核的情况下,维数是无限的。我们可以用泰勒级数将指数函数转换成多项式形式。

来想象内核的变化。我们可以考虑分类器的双重版本。

将内核应用于原始版本相当于将其应用于对偶版本。

通过添加二次项的先前变换可以被认为是使用多项式核:

而在我们的例子中,参数 d(度)是 2,系数 c0 是 1/2,系数γ是 1。

因为

因此,高斯变换使用一个名为 RBF ( 径向基函数 ) 内核高斯内核的内核。

结论:核技巧被用于 SVM,使其成为一个非线性分类器。实际上,同样的方法可以应用于逻辑回归,我们称之为核逻辑回归。

kNN 和决策树呢?

通过构造,kNN 和决策树是非线性模型。所以他们在非线性可分数据面前会表现的很好。

提醒一下,这是两种算法的原理。

对于 kNN,我们考虑一个局部常数函数,并为一个新点找到最*的邻居。然后邻居类的比例会导致最终的预测。

对于一棵分类树,思路是:分而治之。原则是除以最小化一个度量(可以是基尼系数或熵)。因此在生长树时可以找到非线性决策边界。

这是我们玩具数据决策树的结果。

下面是非线性分类器的工作原理:

  • 使用 LDA,我们考虑不同类别数据的异方差,然后我们可以捕捉一些非线性。但是它是有限的,并且不能捕捉更复杂的非线性。
  • 使用 SVM,我们使用不同的内核将数据转换到一个特征空间,在这里数据是更加线性可分的。内核的性质可以非常多样,因此我们可以处理更复杂的非线性。
  • 对于逻辑回归,我们可以用一个二次项来转换它,或者我们可以使用内核技巧
  • kNN 将考虑非线性,因为我们只分析邻域数据。
  • 有了决策树,连续数据的分割可以在任何地方进行,只要指标指示我们继续分割数据以形成更同质的部分。

我花了很多时间试图找出一些直观的方法来考虑不同算法之间的关系。我希望它对你也有用。

我在这里没有讨论的另一种转换数据的方式是神经网络。您可以阅读下面的文章来了解如何操作。

[## 直观来看,神经网络是如何工作的?

“神经网络”这个术语可能看起来很神秘,为什么一个算法叫做神经网络?它真的模仿真实的…

towardsdatascience.com](/intuitively-how-do-neural-networks-work-d7710b602e51)

对于不同分类器的原理,你可能会对这篇文章感兴趣。

[## 凭直觉,我们如何理解不同的分类算法原理

机器学习算法有时可以被视为一个黑盒,那么我们如何以更直观的方式来解释它们呢?

towardsdatascience.com](/intuitively-how-can-we-understand-different-classification-algorithms-principles-d45cf8ef54e3)

凭直觉,我们如何理解不同的分类算法原理

原文:https://towardsdatascience.com/intuitively-how-can-we-understand-different-classification-algorithms-principles-d45cf8ef54e3?source=collection_archive---------29-----------------------

机器学习算法有时可以被视为一个黑盒,那么我们如何以更直观的方式来解释它们呢?

在下图中,给定蓝点和红点,我们可以看到有一个模式。作为人类,我们可以用我们的“直觉”来区分它们,并预测一个新点的颜色。

例如,我们大多数人可能会说图中的黑点属于蓝点类别。但是你如何用数学的方式表达这种“直觉”呢?你会看到不同的直觉导致我们所知道的所有算法…

如果蓝点和红点对你来说可能比较抽象,那么让我们来看一些真实世界的例子。

  • 肿瘤的诊断(B 为良性,M 为恶性),具有两种不同的肿瘤特征。

  • 垃圾邮件检测:使用两个变量,美元符号的频率和单词“remove”的频率。

你可能已经知道一些可行的分类算法:逻辑回归、kNN、LDA(线性判别分析)、SVM、决策树等等。

但是理解它们直观吗?

首先,为了简化问题,我们将在本文中考虑 1D 的情况(我们将在另一篇文章中考虑 2D 的情况)

正如我们在下图中看到的,我们只有一个预测值,即 X,目标变量是 Y,有两个类,红点和蓝点。

注意,从数学上来说,“红”或“蓝”没有任何意义,所以我们将这个变量转换成一个二进制变量:1 代表“蓝”,0 代表“红”。这就对应了这个问题:圆点是蓝色的吗?1 代表真,0 代表假。当然,这只是约定俗成。

在现实世界的例子中,“圆点是蓝色的吗?”可以是:肿瘤是不是恶性的?这封邮件是不是垃圾邮件?

第一个原则:邻居分析

对于一个给定的点,其思想是查看该点的邻居

邻居是什么?离最*的的那些?

“接*”是什么意思?最短的距离?

什么是距离?在这里,它只是指 x 的两个值之差(x 是一个实数)。

现在,给定一个新点,我们可以计算这个点和其他点之间的距离。我们可以选择最接*的。

但是有多少呢?这是这种方法的一个大问题:我们选择多少点?

首先,我们称这个数为 k,k=5。

现在我们可以检查邻居的等级。如果你有一个类的多数,那么你可以用多数类来预测。在我们的例子中,如果邻居的多数类是 1,那么新点很有可能属于类 1。

注意“多数”原则。所以如果我们选择了 k=4,那么就很难决定了。因此,如果 k 是奇数,它有助于作出明确的决定。

现在可以计算一个新点的概率,我们有下图:

这个原理叫做 kNN,意思是 K *邻。

现在,这个算法的特别之处在于,由于你不知道要保留哪些点,所以你必须为每个预测保留所有的点。这就是为什么我们说这个算法不是基于模型的,而是基于实例的。

第二个原则:全球比例和正态分布

我们刚刚在上面说过,选择数字 k 是不方便的,我们没有对我们的观察结果进行任何建模。

现在我们该怎么办?首先,让我们考虑所有的人口。如果您这样做,那么您的预测对所有新点都是一样的:多数类和概率将是多数类的比例。

这可能有点简单化了。为了做得更好,我们可以考虑点的正态分布。为什么是正态分布?这很简单,简化了所有的计算。这真的是个好理由吗?嗯,这就是我们所说的“建模”。

所有的模型都是错的,但有些是有用的。—乔治·博克斯,著名统计学家

现在,我们可以问一个更好的问题,而不是数邻居:我离蓝点或红点有多远。换句话说:给定一个新点,这个点是蓝色或红色的概率是多少?

  • 这个新点离蓝色点有多*?我们考虑蓝点(标注为 PDF_b)的概率密度函数,距离(或者说接*度)将是 PDF_b(x)
  • 新点离红色点有多*?我们考虑红点(记为 PDF_r)的概率密度函数,距离(或者说接*度)将是 PDF_r(x)

为了知道新点更接*哪种颜色,我们只需比较两个概率密度。下图中,黑色曲线代表比率: PDF_b/(PDF_b+PDF_r)

现在,就建模而言,令人惊讶的是:使用 kNN,您必须保留所有的点才能做出决定,现在您只需使用几个参数,如均值和标准差,以便定义正态分布。

在之前的数据集中,我们有相同数量的蓝点和红点。如果数字不同,我们可以用两个密度的比例来加权。

现在类似线性判别分析二次判别分析朴素贝叶斯分类器等算法都在使用这个原理。

它们之间有什么区别?

还记得我们必须计算正常密度吗?为了得到正态分布,我们必须计算*均值和标准差。就手段而言,很简单。但是对于标准差,我们有两个选择。我们可以计算每个类的标准差,或者,为了简化,我们可以认为这两个类的标准差是相同的。为什么我们可以使用两个标准差的加权值。为什么是“线性”对“二次”呢?为此,我写了另一篇文章:直观地说,我们如何才能建立非线性分类器

第三个原则:分析前沿领域

根据前面的原则,我们可以看到,在对整个数据集建模之后,我们得出了一个决策边界。

现在,我们可以想:如果目标是找到一个前沿,为什么我们不直接分析前沿领域?

“边界区域”可以用 M(表示边距)来定义,M 是我们选择用来定义“边界区域”的两点之间的距离。我们可以将红色圆点的候选点记为,将蓝色圆点的候选点记为。用数学术语来说,我们有:

M=B-A

首先让我们考虑这两个类是线性可分的。然后我们可以计算红点的最大值(我们得到 A) ,蓝点的最小值(我们得到 B) 。(注意,在 1D 的情况下,最小值和最大值很容易定义。但是当维度更高时,它可能更复杂。)

现在非常直观的(见下面的引用),我们可以选择两个值的*均值作为决策边界。

最大化间隔看起来不错,因为决策[区间]附*的点代表非常不确定的分类决策:分类器几乎有 50%的机会做出任何决定。具有较大裕度的分类器做出的分类决策确定性不低。这给了你一个分类安全裕度— 支持向量机:线性可分的情况

但是如果有一个类 0 的值非常接*类 1 呢?那么我们将会有如下图所示的边界:

现在我们有了这种直觉,第二种情况下定义的决策边界并不是最优的:边界区域很小。现在,如果我们保持前面的 M,让异常点,如下所示:

我们可以为异常点添加一个惩罚项,它可以是异常点和 a 之间的距离。

更好的是,我们可以用一个系数对惩罚进行加权,我们称之为 c。因此,最终的决策标准是:

M - C ×(红色异常点- S_r)

(保证金减去加权罚金)

一般来说,如果有几个异常点,我们可以对它们进行求和:

M - C × ( ∑(红色异常点- S_r) + ∑ (S_b -蓝色异常点))

通过这样做,我们还解决了如下图所示的点不是线性可分的情况下的问题(记住,我们说过我们可以首先考虑点是线性可分的,这样我们就可以得到我们直观的“边界区域”)。)

现在,这个原理被用于 SVM(支持向量机),为了得到 SVM 的最终版本,我们必须做一些小的调整(我们将在另一篇文章中讨论它们)。而为什么叫“支持”呢?因为你使用不同的点(称为“支持向量”)来最大化边际(或者更准确地说是惩罚边际)。

第四个原则:寻找最佳曲线

对于这个原理,让我们考虑一条直线来模拟作为 x 的函数的 y。

y=a × x + b

为了简化这个问题的求解,我们可以考虑直线会经过每一类的均值,如下图所示。

现在,当 y=0.5 时,你可以考虑 x 的值,这可以作为你决定 y 属于 0 类还是 1 类的边界。

但是用这个模型,对于 x 的大值,你会得到 y > 1,对于 x 的小值,y <0. So what can we do? Let’s smooth it. Like this?

Come on, we can do better, like this?

To do the smoothing in the graph above, we can use this function for example

p(x)= 1 / (1+exp(-(a × x + b)))

To understand why we use this function, you can note that we find the initial straight line : y(x)=a × x + b in this function, and we can define: sigma(y)= 1 / (1+exp( -y )))

So we have : p(x)=sigma(y(x))=1 / (1+exp(-(a × x + b)))

To visualize the smoothing effect, we can see the graph of sigma below

  • when x is very big, the output is very close to 1
  • when x is very small, the output is very close to 0

And now the task is to find the parameters: a and b. To achieve this goal, we can consider the probability of each point to be correctly classified.

  • For the blue dots, the probability value is p(x);
  • For the red dots, the probability value is 1-p(x).

The criterion is the maximization of the overall probability: we multiply all the probabilities (for class 0 and class 1). And we try to maximize the result.

P_overall = product (p(x), for class 1) × product ( (1-p(x), for class 0)

Or in a simpler form

P_overall = product (p(x)×y +(1-p(x))×(1-y))

The mathematical trick is then to take the log and to take the derivatives, etc. But it turns out that there is not an easy way (a closed formula) to find the parameters, and we have to solve it numerically.

Below we can see the situation for different values of ab 。垂直线段代表每个点的概率。所有这些概率的乘积应该最大化,以便优化 ab

这是逻辑回归使用的原理,因为我们之前看到的 sigma 函数的名字,叫做逻辑函数。

(如果你觉得这个解释不够直观,可以看看这篇文章:直观地说,我们如何(更好地)理解 Logistic 回归

第五个原则:避免错误

最后一个原则是关于选择决策边界时可能犯的错误

现在有哪些错误:

  • 如果在该区域中,蓝色点占多数,那么红色点就是错误;
  • 如果红点占多数,那么蓝点就是错误。

当找到决策边界时,这些点被分成两个区域。这个想法是为了描述区域的“同质性”:错误越少越好。

现在让我们找一个函数来描述区域的“均匀性”。以 p 为例,作为第 1 类的比例。我们得到 0 类的比例为(1-p)。

现在有了 p 和(1-p),我们能做什么?让我们从非常简单的操作开始。

  • Sum?嗯,再想想。
  • 产品。嗯,让我看看,这是一张图表。

所以这个函数是对称的,这是一个必需的特性,因为这个函数应该对任何一个类都有效。并且该函数的输出可以指示该区域的“均匀性”:越低越好

  • 当 p 接* 1 时,几乎所有的点都是蓝色的,指示值很低
  • 当 p 接* 0 时,那么几乎所有的点都是红色的,那么指标也很低
  • 当 p 为 0.5 时,那么我们有相同数量的红点和蓝点,这不是理想的状态。该指标处于最高水*。

为了找到决策边界,我们必须测试不同的 x 值。对于 x 的每个值,创建两个区域:左手侧区域和右手侧区域。对于每一方,我们可以计算指标,然后我们用每个区域的分数比例对它们进行加权,以获得总体指标。

现在,我们可以测试作为决策边界的所有点,并查看指标如何变化。

现在,我们可以采用指标的最低级别来找到 x 的最佳值。注意,由于我们有一个阶跃函数,我们可以计算定义指标最低级别的两个 x 值的*均值。

这个原则的特别之处在于,你可以在每个区域中继续寻找其他决策边界。我们将在另一篇专门讨论该原则的文章中看到,这样做的好处是您可以轻松处理非线性情况。

所以一步一步,我们可以一个一个的找到最优前沿。

这里我们有一个决策树,关于每一步不同的决策界限。

现在的问题是:我们什么时候停止?可以有不同的规则…

这个原则也被认为是“分而治之”。它让我们能够生长决策树。这些树也是更复杂算法的基础,如随机森林或梯度推进机器。

让我们回顾一下:

  • 原则 1:检查邻居,我们得到 KNN
  • 原则二:考虑全球比例和正态分布,我们可以做 LDA,QDA,或者 NB。
  • 原则三:研究边疆地区,尽量做到“干净”和大。我们得到了 SVM。
  • 原则四:画一条直线,*滑,试着调整。我们得到逻辑回归
  • 原则 5:分而治之。我们得到了决策树。

请注意,我们没有完成五个原则的所有推理:

  • 用 kNN 法测定水中的钾
  • 决策树中的停止规则
  • 系数 C 的确定
  • 逻辑回归中 a 和 b 的确定

对于机器学习从业者来说,你可以注意到我自愿没有使用技术术语,也许你可以评论并把技术术语放在正确的上下文中:硬边、软边、梯度下降、凸性、超*面、先验概率、后验概率、损失函数、交叉熵、最大似然估计、过拟合……

当我们谈论机器学习和人工智能时,我们总是谈论神经网络,但为什么我们在这里没有提到它们?实际上,我们确实看到了一个简单的神经网络的例子,它是逻辑回归,关于它的文章即将发表。

使用的玩具数据非常简单:这两个类是线性可分的。这些算法是如何处理非线性可分的数据的?你可以阅读这篇文章:直观地,我们如何才能建立非线性分类器

直观来看,神经网络是如何工作的?

原文:https://towardsdatascience.com/intuitively-how-do-neural-networks-work-d7710b602e51?source=collection_archive---------27-----------------------

直观地

“神经网络”这个术语可能看起来很神秘,为什么一个算法叫做神经网络?它真的能模仿真正的神经元吗,又是如何模仿的呢?

在我上一篇关于 直观上,我们如何理解不同的分类算法 的文章中,我介绍了分类算法的主要原理。然而,我使用的玩具数据非常简单,几乎是线性可分的数据;在现实生活中,数据几乎总是非线性,所以我们应该让我们的算法能够处理非线性可分数据。

简单逻辑回归和非线性数据

让我们比较一下逻辑回归对于几乎线性可分数据和非线性可分数据的表现。

通过下面的两个玩具数据,我们可以看到,当数据几乎是线性可分时,逻辑回归有助于我们找到决策边界,但当数据不是线性可分数据时,逻辑回归无法找到明确的决策边界。这是可以理解的,因为逻辑回归只能将数据分成两部分。

在本文中,我们将尝试以不同的方式重用逻辑回归,并尝试使其适用于非线性数据。

组合逻辑回归

当观察蓝点和红点时,数据是非线性的,因为我们可以看到有 3 个部分,我们应该找到两个决策边界。那么,如果…如果我们试着结合两个逻辑回归会怎么样?

例如,我们有这两个基于逻辑回归的模型。

我们称它们为 h1 和 h2。

然后,我们可以将 h1 和 h2 结合起来,用另一个逻辑回归进行最终预测。

然后,您可以用 h1 和 h2 各自的逻辑函数表达式来替换它们:

然后我们可以通过找到不同的系数来解决问题,你猜怎么着,最终的结果是相当令人满意的:我们可以看到,两个组合的 Logistic 回归给了我们两个决策边界。

更好的表现

让我们回到我们模型的最终表达式:

这个表情可能看起来挺吓人的。让我们给它加点艺术感。

让我们画一些东西来以更易读的方式表示这些函数:

横向来看,甚至会更好:

让我们指定所有要确定的系数,我们可以将它们放在线上,这样更容易理解:

我们可以将线性函数和 sigmoid 函数分开,以更好地提高可读性。

长方形?不,圆圈更好。等等,你看到我看到的了吗?

哇,它们就像…神经元!

图片来自 123rf

我们可以添加更多的颜色使它更好。连接代表重量,我们可以让它们变粗来代表更大的数字。用一种颜色,我们可以代表这个符号。

  • 这里,绿色是正的,红色是负的。

数学家是艺术家!

神经网络词汇

现在让我们围绕这个神经网络创造一个全新的世界。

让我们创建不同的层:输入、输出和隐藏层。

当计算给定输入值的输出值时,必须遍历所有隐藏层。所以你会从左边走到右边。姑且称之为“正向传播”。

最后,您将计算出一个估计的输出,并且您必须将它与实际输出进行比较。这个误差将帮助我们微调权重。为此,我们可以使用梯度下降,我们必须计算不同的导数。

由于最终会计算误差,因此我们会在输出层之前调整神经元的权重。我们总是会从右向左调整。所以姑且称之为“反向传播”。

二维空间会发生什么

现在让我们考虑两个输入变量,这是玩具数据。

直观上,我们可以看到两个决策边界就足够了。所以让我们应用两个隐藏的神经元:

然后,我们可以通过用周围区域数据测试神经网络来可视化最终结果。我们可以看到模型做得相当好。

现在,既然我们知道在神经网络内部只有逻辑回归,我们可以尝试将转换的不同步骤可视化。

隐藏层转换

让我们看看 H1:输入数据是原始的蓝点和红点。H1 是一个有两个输入变量的逻辑回归,所以结果是一个表面。

然后第二个隐藏神经元 H2 是类似的。

输出图层 O1 是一个逻辑回归,也接受两个输入,因此我们也有一个表面来表示结果。而 O1 的输入是数值在 0 和 1 之间的两个数据系列,因为它们是两个逻辑回归的结果。然后我们可以看到,如果我们取值 0.5 到表面,最初的蓝点和红点可以线性分成两部分。

那么在这个神经网络中发生了什么呢?在某种意义上,我们可以说神经网络将非线性可分离的数据转化为几乎线性可分离的数据。

另一个可视化

隐藏层有两个神经元,所以是二维的。因此,如果我们想看到这种转变,我们希望看到点是如何在*面上移动的。我们知道这些点的最终位置在单位正方形(0,1)x(0,1)中。

我们可以分别看到蓝点和红点。注意,箭头指向最终位置。

然后我们可以看到最后的逻辑回归。

原始数据不是线性可分的,但是经过变换后,它们被移动到单位正方形中,在那里它们变得几乎线性可分。

另一个更复杂数据的可视化

现在让我们考虑另一个玩具数据。凭直觉,你会应用多少个隐藏神经元?

嗯,3 个神经元就足够了,如下图所示:

我们可以看到每个神经元的逻辑回归曲面。

隐藏神经元 2

隐藏神经元 3

对于输出神经元,它有 3 个输入(因为它们是逻辑回归的结果,值在 0 和 1 之间),我们可以在一个单位立方体中可视化它们。

我们可以创建一个动画来更好地可视化

让我们回顾一下:

  • 初始 2D 数据不是线性可分的。
  • 它们被转换成 3D 空间(在一个隐藏层中有 3 个神经元)。
  • 经过变换后,它们变得几乎线性可分。
  • 最后,简单的逻辑回归允许我们对转换后的数据进行线性分类。
  • 最终的逻辑回归有 3 个输入变量。因此该模型可以预测三维空间中每个点的概率。这就是为什么我们可以看到立方体充满了彩色点。决策边界是一个曲面。

更复杂的神经网络可以捕捉甚至更复杂的输入数据关系。但我们可以看到原理相当简单:隐藏神经元的目的是将非线性可分离的数据转换到一个可以线性分离的空间。

如果你对其他分类器如何处理非线性可分离数据感兴趣,你可以看看下面的文章:

[## 凭直觉,我们如何建立非线性分类器

现实生活中的问题通常是非线性的,所以让我们看看算法是如何处理非线性可分数据的。

towardsdatascience.com](/intuitively-how-can-we-build-non-linear-classifiers-10c381ed633e)

凭直觉,在找到你的完美伴侣之前,你应该和多少男人约会

原文:https://towardsdatascience.com/intuitively-how-many-guys-should-you-date-before-finding-your-perfect-partner-7e6f9d691095?source=collection_archive---------29-----------------------

直观地

你可以看到这篇文章的标签是数据科学,概率统计专题。是的,这是正确的,有一个数学模型来定义最佳策略。

用*面图标制作的图标

为了找到你的完美伴侣,最好的策略是什么?第一个的家伙是不是最好的?我们必须和尽可能多的 T2 男人约会才能找到最好的吗?

但你很容易理解,这两种策略都是有风险且非最优:第一种情况,如果你和第一个约会的男生结婚,你以后会后悔;在第二种情况下,你可能会失去一些好的比赛机会,并最终孤独终老。

为了确定对你来说什么是最好的策略,你必须知道你想约会的男人总数,因为也许你想在某个截止日期前结婚,也许你没有时间或者不想和很多人约会。

值得注意的是,最佳男朋友的概念只是你选择了的约会总数(n)中的最佳男朋友。所以如果你选择了一次约会,那么根据定义,你已经选择了最好的一次。

为了简化数学模型,需要指定以下几个假设:

  • 都可以对比评级,你可以毫不含糊的说谁更好。
  • 如果你拒绝了一个男生,你就不能收回你的决定。不然就太容易了。
  • 他们一个接一个地到来,顺序是随机的,你只能在给定的时间里和一个人约会。
  • 当然只能选择一次。

现在的问题是:如何选择那个家伙,使得(被选择的家伙是最好的那个)的概率最高?

随机策略还是固定策略

首先让我们看看最简单的选择方式:随机策略。

如果你的策略是在任何一步随机停止,选择那个家伙,不做比较,那么推理如下 : 对于每一步,他是最好的概率是 1/n 。而停在步骤 I 选择他的概率也是 1/n

既然不比较也不研究小伙,那么这两个事件(小伙最优秀和小伙被选中)可以认为是独立。所以我们可以有下面的结果:

现在我们来看另一种选择方式:固定策略。

为了简化词汇,我会说 guy i ,对于你在步骤 i 遇到的那个家伙。指数 i 与第 I 次约会有关,与男生无关。值得注意的是:这里随机的是你选择约会的次,而不是在所有男生中选择一个男生。

如果你选择总是留在第一选择的。那么他是最好的那个的概率是: 1 /总数= 1/ n

如果你选择永远留在第二选择,不管是什么原因。那么概率将是:

  • 第一,guy 1 应该不是最好的那个。但是嘿,这个概率很高:(n-1)/n
  • 知道了这一点,第二个人是最好的概率是 1/(n-1)
  • 最后,总是选择第二个人的最终概率也是 1/n 。

如果您选择始终使用第三个选择:,理由非常相似

我们现在可以概括推理,如果你选择总是保持你的第一个选择:1/n .

所以在没有任何有意义的策略(随机策略或固定策略)的情况下,从 10 个家伙中选出最佳家伙的概率是 10%

凭直觉,你知道你可以做得更好:你希望能够将现在的人与以前的人进行比较。

所以现在就来详细说一下对比策略吧!

比较策略

该战略包括两个阶段:

  • 第一阶段:我们可以称之为观察阶段,这是一个你最终总是会离开那个人的阶段,但是你会有一个和其他人比较的基础。观察阶段的最佳人选,我们称他为参考人选
  • 第二阶段:我们可以称之为选择阶段,我们将比较当前的家伙和所有以前的家伙,如果她或他比所有以前的更好,那么你选择这个。这就等于说,你会选择第一个比你在观察期约会的男生更好的。

为了选择最好的一个,或者换句话说,为了在选择我们的家伙时有最高的概率,唯一要确定的参数是:在观察阶段我们应该和多少个家伙约会?

拒绝的最佳次数

如果你约会的总数是 10,那么答案是 3!

听起来可能很无情,用这个策略,你应该和三个男生约会,然后拒绝他们(因为他们只是观察阶段的一部分)。然后从第 4 个家伙开始,如果他比之前所有的都好(这也和对比参考家伙是一样的),你就可以和他在一起了。

而且用这个策略,选到最优的概率差不多有 40%

这比随机策略好 4 倍。

为什么?让我们做个示范。

用小数字演示

为了演示 10 个人的比较策略,我们将通过首先与一个人迭代,然后与两个人迭代,然后与三个人迭代,以此类推。

只有一个家伙

如果你选择只和一个男人约会,那么我们不能说他是最好的还是最差的,事实上,他两者都是!

两个家伙

如果你选择和两个男人约会,那么你只有两个选择。你可以和第一个人在一起,也可以和第二个人在一起。没有区别。所以你有 50%的概率选择最好的一个。

值得注意的是,随机策略会产生相同的结果。

三个家伙

如果你选择和 3 个家伙约会,那么我们要做一些概率计算。假设我们可以用★来给他们打分,因为有 3 个人:★★是最好的,而★是最差的。

有 6 种可能的情况。请注意,选项 1 表示你第一次遇见一个男生,选项 2 表示你第二次遇见一个男生,等等…

坚持你的第一选择

如果你决定坚持你的第一选择,那么选择最佳选择的概率是 6 分之 2。(我们的场景表中的场景 1 和 2)。

所以概率是 33%,这和随机策略的概率是一样的。

拒绝第一个选择,然后选择

如果你决定拒绝第一个,那么你的第一选择将是你的观察阶段。而从第二个选择开始,你会选择:如果他比之前所有的都好,那你就和他在一起,如果不是,你就继续(并以第三个结束)。

现在你可以看到,使用这种策略,你最终得到最佳策略的概率是 6 分之 3。

或者换句话说,概率是 50%

拒绝第一和第二个选择,选择第三个

对于这种策略,概率很容易计算,它是 6 中的 2,即 33%。

在总共 3 个人的情况下:

  • 如果你遵循随机策略,那么选择最佳家伙的概率是 33%
  • 如果用比较策略遵循我们的最优策略,那么概率是 50%

一个广义的论证

现在让我们尝试推广两个给定参数的概率 P 的计算

  • n,男生总数
  • r,拒绝的次数

这一次,我们必须使用条件概率,因为在这个策略中,事件是相关的。

那么我们必须不同地考虑这两个阶段:

  • 观察阶段:我们会全部拒绝。所以概率是 0
  • 选择阶段:对于盖伊 I,知道他是最好的一个,那么他实际被选中的概率就是之前所有的盖伊都没有被选中的概率。或者从步骤(r+1)到步骤(i-1)的家伙。

换句话说:

  • 从步骤(r+1)到步骤(i-1)的人并不比观察阶段的人更好(否则,他会被选中)
  • 在第(i-1)个家伙中,最好的家伙在第 r 个家伙中。

现在我们可以通过分析(i-1)个之前的家伙来计算选择这个家伙 I 的概率,知道他是最好的一个:

  • 成为(i-1)个男生中最好的一个的概率是: 1/(i-1)
  • 既然观察阶段有 r 个家伙,那么概率是: r/(i-1)

现在我们可以把之前所有人的概率加起来:

数值应用和模拟

现在有了这个公式,我们可以很容易地计算出给定数字 n 的概率,然后我们可以找到最佳的拒绝次数(这是概率最高的数字)。

下面是结果表:

你看。对于 10 个男生,你的最佳策略是拒绝前 3 个男生。

现在你想约会更多?好的,这些是概率和最优拒绝数:

对于那些想要更多的人,让我们来看看拒绝的最佳数量以及任何总数的相关概率。

下图显示了不同总数的最佳选择的概率(最大概率)向一个百分比收敛。比率 r/n(拒绝次数/总次数)也是如此。

我们可以显示比率 r/n,而不是在 x 轴上显示 r。我们得到下面的两个图表。

**

对于那些了解微积分的人来说,我们可以证明曲线会收敛到

然后我们可以找到最大值(通过求导),我们得到最佳比值:1/e ≈ 0.368

最优概率的极限也是:1/e

(e 是欧拉数:e ≈ 2.72)

最佳人选策略的结论

让我们回顾一下:

  • 定义你想约会或可能约会的男生总数。例如,你 20 岁,你想在 30 岁前找到你的完美伴侣。你觉得你可能会和 10 个男人约会。
  • 拒绝最佳绷绳数,定义参考绷绳。在 10 的情况下,你应该拒绝前 3 个家伙。而在现实生活中,对他们进行排名是比较困难的,所以要研究你的排名标准。
  • 现在不要让下一个比参考人更好的人走。如果没有,你可能会在截止日期前找不到任何人。
  • 如果你是对方,一定不要处于观察阶段,为了最大化你的机会,你宁愿成为选择阶段的第一个家伙。

现在,如果你和你遇到的第一个男人结婚了,并且正在读这篇文章,请记住,这只是一个模型

所有的模型都是错的,但有些是有用的。

明智地使用它。😃

1/e 最佳选择定律

实际上我们已经看到了统计学中非常著名的东西,这种策略也被称为 1/e 策略,它可以应用于其他现实生活中的问题,比如:

  • 招聘候选人
  • 购买汽车
  • 买房子
  • 等等。

记住,现实生活总是不同于数学模型。

直觉上…或者不是,你不应该只看成功的人来变得成功

原文:https://towardsdatascience.com/intuitively-or-not-you-shouldnt-only-look-at-the-successful-to-become-successful-8d2eda668ce3?source=collection_archive---------52-----------------------

克服生存偏见就是认识到丢失的东西可能包含重要的信息

科比·门德斯在 Unsplash 上的照片

最*,我和一个孩子进行了一次谈话,他告诉我:“我长大后要成为一名足球运动员。这样我就能赚很多钱,买一栋大房子”。除了这么小就有令人担忧的物质主义心态,这个推理背后的明显的生存偏见让我笑了。

是的,如果你在电视上看到所有的足球运动员,你可能会认为这是一个特别赚钱的职业;然而,这种推理是有偏见的,因为你没有考虑到那些没有成为明星的人。

只有孩子有生存偏见吗?不,成年人也很容易落入这个陷阱。

生存偏差背后的故事

维基百科:生存

也许你以前已经听说过生存偏差:一个著名的例子是研究二战飞机的统计学家亚伯拉罕·瓦尔德的故事。军方告诉沃尔德,许多飞机坠毁,返航的飞机上有许多弹孔。军队跟踪返航飞机上弹孔的位置,以了解在哪里加固飞机。

假设返航飞机上的弹孔分布如下:

当你看这个图的时候,你会在哪里加固这些*面?

陆军最初的做法是:“好吧,我们看着回来的飞机,我们看到他们被击中最严重的地方:所以我们应该加强这些削弱的部分,不是吗?”。根据上图,我们应该加固机翼,不是吗?

然而,沃尔德说不,那将是确切地说是错误的决定。

沃尔德已经意识到这个结论只是基于幸存者得出的,但是那些没有回来的飞机呢?事实上,这些洞表明这些飞机被击中后仍然能够回来。所以我们掌握的信息是不完整的。被击中而没有回来的飞机有了更准确的信息,知道哪些零件需要加固。

误解:如果你想学习如何生存,你应该关注幸存者。

真相:如果你不看失败,你就无法知道是什么让一个幸存者不同于一个失败者。

然而,如果军队犯了这样的错误,这是否意味着我们在日常生活中也容易产生这种偏见?是的,当然。

我们可以在日常生活中的许多其他例子中看到生存偏差。

存活率偏差示例

生存偏差可能发生在你的研究中有两个类别的时候,其中一个你可以标记为“幸存者”:在商业中它可能是成功的对不成功的;在医学上,可以是活人 vs 死人;在一局中,可以是胜者 vs 败者。

如果你决定创办一家初创企业,只考虑那些已经成功的企业,你会忘记,大多数初创企业在头两年都会失败。

在医学中,排除偏见尤其重要:医生应该记住治疗没有像预期的那样奏效的次数以及奏效的次数,以免他们忘记一些重要的事情。

例如,现在在我们看来显而易见的是,放血毫无用处,无助于治愈任何疾病(事实上它的危害更大)。然而,这种基于抽血可以帮助身体保持*衡和健康的信念的做法,已经延续了 2000 多年,直到 19 世纪末。为什么这么久?嗯,这正是因为幸存者偏差:在某些情况下,放血可能会产生积极的结果,如果没有完整的科学方法,只考虑幸存者。

现在记住这一事实尤为重要,因为我们都在焦急地等待新冠肺炎的治愈方法:一些治疗可能声称是成功的,但如果没有对照组,就很难从科学上证明这一点。希望不应该影响我们的判断。

维基百科放血

或者一个更简单的例子:你听说有人成功地尝试了一种新的饮食方式,并且正在考虑尝试减肥。然而,如果有些人通过一周只吃苹果成功减肥(例如),并在他们的博客上谈论它,你不会听到有人尝试同样的饮食,但效果并不那么好。

在我们的社会中,我们倾向于向在他们的领域中成功的人聚集,而不是从失败的人那里寻求建议(即使他们能给我们有趣的建议关于你应该 而不是 )。

"一个效果很好的愚蠢决定在事后会变成一个明智的决定."——心理学家丹尼尔·卡内曼在《思考的快慢》中

那么,数据科学家能从这些课程中学到什么呢?

为什么数据科学家需要了解生存偏差

作为一名数据科学家,您需要处理提供给您的数据。你应该从你所拥有的数据中获得洞察力。所以,你给出的结论取决于你掌握的数据。那么,如果您因为最重要的数据不是您拥有的数据而遗漏了一些重要信息,该怎么办呢?

最*要给某个行业做一个流失模型。

然而,GDPR(一般数据保护条例)刚刚开始在该公司实施,例如,一些搅拌机的数据不再可用:因为它们很久以前就搅拌过,出于隐私原因,数据只能存储一定数量的年,除非我们得到客户某种形式的同意。

例如,数据集是在 2020 年建立的。我有 1990 年的客户数据,到 2020 年,仍然是数据集中的客户。但是我没有 2015 年之前离开的客户的数据。这里有生存偏差吗?

事实上,是的,我没有 1990 年至 2015 年之间的客户数据,也没有这一时期的客户数据。那么如何应对呢?

在这种情况下,一个简单的方法是对所有人群进行相同的参考,并通过仅选取合同开始日期早于或等于 2015 年的人群来开始分析。

在其他情况下,可能没有一个简单的解决方案,因此您可能不得不在给出有偏见的结论之前停止分析,因为一些重要的数据丢失了。

简而言之,生存偏差被定义为“一种认知偏差,当某人试图根据过去的成功做出决定,而忽视过去的失败时就会出现这种偏差。”科学是一种从表象中过滤出真实的方法。乍一看似乎很直观的东西可能不是一个好的答案。

库存管理—应对不可预测的需求

原文:https://towardsdatascience.com/inventory-management-using-python-17cb7ddf9314?source=collection_archive---------5-----------------------

使用 Python 对随机需求进行供应链分析

这篇文章旨在解决产品随机需求带来的挑战。这是一个案例研究,处理不同产品的需求分布,并使用蒙特卡罗模拟来最佳地管理其库存并获得预期利润。

图片由克拉克街商业Unsplash 上拍摄

想象一下,你是一个高度定制产品的经销商,因此每个客户对该产品的需求都是独特的。你不可能每天都收到这种产品的订单。一些产品可能会因季节性而有所不同,而另一些则可能有潜在的趋势。为了对这种随机需求进行数学建模,您必须获取每种产品至少在过去 12 个月的销售信息。

现在,顾客有时会走进商店,却买不到他们想要的特定商品。虽然很难对消费者行为建模,但我们可以提供一个粗略的估计,即客户在任何给定的一天下订单的概率为“p”。这个 p 可以简单的用去年的订单数除以工作日数来计算。

除非或直到你有一个特定的客户合同,另一个不确定性是订单大小。在本案例研究中,假设订单大小遵循一个分布参数未知的对数正态分布(这是常见的情况)。因此,获取产品的历史销售额非常重要。

本案例着眼于 4 种不同产品的销售,并试图采用持续审查或定期审查政策来管理其库存。目标是最大化其预期 利润

附加产品数据

根据去年的销售情况,下面给出了每种产品的需求分布直方图。

每种产品的需求分布。按作者分类的图表

你可以看到对每种产品需求的明显差异。例如,产品 2 是每天都有人购买的大批量产品(p = 1),*均订单量为 649。而产品 4 有 24%的时间被购买,其*均订单规模约为 150。下表提供了每种产品的汇总,可以完全根据过去的销售数据进行计算。

每个产品的摘要

理解交付周期期间的需求统计数据非常重要。

将这些数字放入上下文中,产品 1 的交付周期是 9 天(如前所述),因此在这 9 天中,分销商可以预期*均有 705 个订单。在下原始订单时,需要考虑到这一点,否则经销商总是无法满足需求。

定期审查

有了定期审查系统,库存检查和再订购只在指定的时间点进行。例如,可以每周、每两周、每月或其他周期检查库存并下订单。当一个公司或企业处理多种产品时,定期审查系统的优点是要求在相同的预设定期审查时间下几个项目的订单。有了这种类型的库存系统,多种产品订单的装运和接收就很容易协调。在前面讨论的订购量、再订购点系统下,各种产品的再订购点可能在完全不同的时间点遇到,使得多种产品的订单协调更加困难。[1]

具有概率需求的定期审查模型的库存模式。[1]

在定期审查政策方法中,在一定时间后补充库存。这个时间周期取决于审核周期和交付周期。蒙特卡洛技术被用来模拟商店中每种产品的日需求量。从上一节的分布图中,我们注意到,除了产品 2 之外,并不是每一种产品都在每天被购买。计算出的预期订单比例表明当天产品被购买的概率。例如,对于产品 1,预期比例是 0.76,这意味着在一年中的任何一天,客户都有 76%的机会购买产品 1。

如果购买一种产品,那么需求遵循对数正态分布。通过取每日数值的对数,将前一年的需求分布转换为对数正态分布。为了模拟日常顾客购买行为,从 0 到 1 范围内的均匀分布中选取一个随机数。

从对数正态分布中提取的 Python 代码

进行蒙特卡罗模拟来模拟需求行为和一次实现的利润计算。在模拟中,该算法每天迭代,试图捕捉产品的库存水*。这是为了生成当天的产品需求。

为定期审查进行蒙特卡罗模拟

该算法的逻辑如下:

  1. 如果当前库存水*可以完全满足需求,则库存水*会根据需求和当天售出的单位数量的增量而减少
  2. 如果库存水*不能完全满足需求,那么现有库存就是当天售出的数量

为了对定期检查策略进行建模,该算法会跟踪一年中的当天。如果一年中的某一天等于审核期,则下订单将库存补充到数量为 M 的订单。该值是决策变量,并作为输入传递给算法。在该特定产品的交付周期结束后,库存会根据所下的订单数量进行更新。这将持续 365 天。

产品 1 的库存模拟。按作者分类的图表

一个 365 天模拟的库存水*可用于确定商店当年的利润。所有售出的单位都乘以产品售价来计算收入。

成本分为三个部分,

  1. 产品成本
    产品成本的计算方法是将每种产品的单位成本乘以订购数量的总和。
  2. 订购成本
    订购成本的计算方法是将当年的订购次数乘以该产品的单项订购成本。将一年中每天的库存水*汇总,以表明一年中有多少库存。
  3. 持有成本。
    然后通过将持有的股票数量乘以产品的单位尺寸和持有单位的每日成本来计算持有成本。

从收入中减去这些成本,得到当年实现的相应利润。损失的单位数量被合计并除以当年的需求,以给出当年订单损失的比例。

年利润的数学公式如下。

计算年利润的 Python 代码

该模拟被执行 10,000 次,以给出每次利润和订单损失比例的多种实现。这些结果用于绘制直方图,并计算利润的*均值和标准偏差,以及特定订单直到点(M)的订单丢失比例。下图是产品 1 的一个模拟,订单数量为 2071。

产品 1 的利润和订单损失分布。作者配图。

类似地,这个练习可以针对一系列值 M 进行,以确定给我们最高预期利润的值。从下图中可以看出,对于产品 1,我们模拟了 1000 到 3000 之间的数值范围。这给出了 87,863 美元的最佳预期利润(再次运行模拟时,87,992 美元是最佳利润)截至 2071 年的订单。

对其他产品进行这些实验,并相应地计算它们的最佳值。由于利润线性依赖于需求和与特定产品相关的成本,因此可以计算出该函数的最大值。

产品 1 —模拟结果。作者配图。

使用一个月的审查期,下表列出了每种产品的最佳订购点、预期年利润和一年中的订单损失比例。

备选方案 1——定期审查

持续审查

在多周期模型中,库存系统以许多重复的周期连续运作;存货可以从一个时期结转到下一个时期。每当库存位置达到再订购点时,就会发出 Q 单位的订单。因为需求是概率性的,所以无法提前确定再订购点的到达时间、订单之间的时间以及 Q 单位的订单到达库存的时间。[1]

具有概率需求的订货批量、再订购点模型的库存模式。[1]

请注意,每当 Q 单位的订单到达时,库存就会增加或跳跃。基于概率需求,库存以非恒定速率减少。只要达到再订购点,就会下新订单。有时, Q 单位的订单数量会在库存为零之前到达。然而,在其他时候,更高的需求会导致在收到新订单之前缺货。与其他订单数量、再订购点模型一样,经理必须确定库存系统的订单数量 Q 和再订购点 r 。[1]

在该策略中,分销商能够定期检查库存,并确定他们希望在哪个点下订单(即再订购点)。分销商还可以指定他们每次想要订购的数量(即订购数量)。

蒙特卡洛模拟中的逻辑被更新用于持续审查策略。

为持续审查进行蒙特卡罗模拟

每天,该算法都会检查库存水*,并将其与再订购点进行比较。

  1. 如果库存水*低于或等于再订购点,它就会下订单。但是这种库存只有在产品交付周期结束后才能变现。例如,产品 1 有 9 天的提前期,如果在第 52 天下订单,库存将在第 61 天补充。
  2. 然后,在更新库存水*时,它遵循与定期审查算法相似的决策逻辑。
  3. 利润和预期订单损失的计算类似于定期审查政策的计算。

产品 1 的库存模拟。作者配图。

对于每个产品,这些结果的模拟再次进行 10,000 次。这些结果用于绘制直方图,以计算订单数量 2002 和再订购点 812 的利润和订单损失比例的*均值和标准偏差。下图是产品 1 的一个模拟。

产品 1 的利润和订单损失分布。作者配图。

通过在每种产品的一系列值之间执行网格搜索,可以计算出优化利润函数的订货量和再订货点的组合。如下图所示,对于产品 1,这些值是针对订单数量从 1000 到 3000 以及再订购点在 500 到 1100 之间进行模拟的。该图似乎显示了一个凹函数,表示利润的最大值。

产品 1 —网格搜索结果。作者配图。

在产品 1 的这个场景中,根据模拟,2002 年的订单数量和 812 的再订购点的最大利润为$110,174。

使用这种策略,下表列出了每种产品的最佳再订购点、最佳订购数量、预期年利润和一年中的订单损失比例。

备选方案 2——持续审查

定论

持续审查和定期审查政策各有优点。定期审查政策有一个固定的审查周期,使组织能够更好地预测一段时间内的订单。而持续审查政策保持订单规模不变,并在下订单的时间方面提供灵活性。由于持续审核策略中的决策变量比定期审核中的决策变量多两个,因此持续审核策略的解决方案空间可能会更大。

定期审查政策和持续审查政策的利润比较

从上表中我们可以清楚地看到,就每种产品的预期利润而言,持续审查政策优于定期审查政策。持续审查政策的总预期利润比定期审查的总预期利润高 25%。如果决策完全基于预期总利润,研究建议持续审查政策作为更好的选择。

GitHub 链接

所有的图表和代码都可以在我的 GitHub 资源库中找到,请随意下载并根据您的用例修改数字。

https://github . com/wiredtoserve/data science/tree/master/inventory management

参考

[1]安德森、斯威尼、威廉姆斯、卡姆、科克伦、弗莱、奥尔曼。管理科学导论:决策的定量方法。2015 年第 14 版。Cengage 学习。第 457-478 页

用机器学习研究时态数据中的异常

原文:https://towardsdatascience.com/investigate-anomalies-in-temporal-data-with-machine-learning-b3da86793142?source=collection_archive---------25-----------------------

利用 Python 和机器学习分析时序数据,并交互可视化。

这是你要做的:

概观

这本笔记本中,我们将探索脸书的开源萨里玛模型先知来识别时间序列数据中的异常值。以下是你将学到的东西:

  • 什么是时序数据?
  • 萨里玛是什么?
  • 构建一个简单的优化器来自动优化 Prophet 模型
  • 如何使用 Prophet 预测数据
  • 使用 Prophet 和 Bokeh 识别交互式仪表板中的异常值
  • 使用散景创建用于调查的时序仪表板布局

什么是时态数据?

我的上一篇文章中,我们使用了空间数据——也就是说,空间中某个地方存在的带有坐标的数据。时态数据通常是空间数据的伴生物,它是任何具有相关时间或日期的数据。时态数据对于全面理解数据集至关重要,能够理解与时间相关的统计数据(趋势、季节性和异常值)将显著提高您处理业务数据的整体能力。

在我擅长的国家安全和国防领域,可能没有比时态数据更重要的数据类型了。时态数据有助于我们了解时间模式,并对未来做出预测。在本文中,这也是您将要学习的内容。

我们的数据

我们将使用来自武装冲突地点事件数据库的数据,具体范围缩小到伊拉克。数据可以从 github 这里下载,或者从 ACLED 网站下载。我们将分析 2016 年至 2020 年伊拉克冲突事件数据的趋势和季节性,预测这些数据,并识别异常值。然后,我们将创建一个配套的折线图,它将允许我们深入特定的事件类别,这样我们就可以在发现异常值后对其进行调查。走吧!

加载库

首先,让我们导入必要的库。我们将使用所有的 Bokeh 来创建我们的交互式图形,fbprophet 用于 prophet 预建模型,sklearn 用于模型优化,pandas 用于一些数据操作。

加载数据

你可以在 Github 上找到我在本笔记本中使用的具体数据。然而,我强烈建议你在这个练习中尝试使用你自己的时间序列数据!

在这个代码块中,我们将使用 value_counts() 方法来获取我们的折线图所需的数据。我们希望可视化每天的事件数量,因此我们将 value_counts() 应用于我们的日期组。

在整篇文章中,您将看到我在处理日期时间数据时喜欢应用的一些实践。首先,每次对数据帧进行操作时,我都会对其进行重新排序——这有助于减少稍后我们训练模型时的错误。我也总是喜欢在我的数据帧中有一列是日期时间格式,另一列是字符串格式。我使用 datetime 列进行分析,string 列用于标签、图例和工具提示。

提取分类数据

接下来,我们想要为每个事件类型获取 value_counts() 。最终产品将是一个可视化,允许用户在折线图中选择一个时间窗口,然后在第二个合作伙伴可视化中显示相关事件类型。我们将遵循与上面相同的步骤,但是现在针对 event_type 字段中的每个事件类型。我们将使用 groupby() 方法来实现这一点。

打扫

接下来,只需删除重复项并重新排序我们的值。

为什么是先知?

Prophet 是 facebook 开发的开源 SARIMA 模型。SARIMA 是一种时间序列回归(解读:预测)技术,它考虑了时间序列数据集的各种统计属性,包括移动*均、季节性和趋势。趋势是时序数据的一个属性,与数据集中的总体正增长和负增长有关。季节性与数据集中的周期性变化有关,例如周末活动的定期减少或每天下午活动的增加。

Prophet 最初是为了满足脸书的预测需求而开发的,因为 facebook office 严重依赖时间序列预测来设定目标和衡量进展。你可以通过观看由 Prophet 开发者提供的视频来了解更多关于 Prophet 及其起源的信息。

Prophet 需要两个数据源才能工作:‘ds’,代表日期戳,以及‘y’目标变量。如果您正在跟随这款笔记本,那么我们已经做到了这一点——如果没有,那么为了您自己的数据,请记住这一点。

模型优化

模型优化是任何机器学习项目的关键要素。所有机器学习模型都有一个或两个关键参数,需要进行优化以实现模型的最佳性能。对于 Prophet,该参数为change point _ prior _ scale。此参数定义了模型响应数据集中的变点的灵活程度,需要进行优化以防止过度拟合和欠拟合。

为了对此进行优化,我们将使用一个非常简单的优化模型。它简单地遍历用户定义的历元,测试每个参数,并选择返回最低误差的参数。为此,我们将使用均方误差统计。

有关使用均方误差进行模型优化的更多信息,请参见本文关于均方误差和线性回归。

训练模型

既然模型已经优化,我们就用我们的数据来训练它。你会看到,根据我提供的数据, MSE (均方差)大约为 38。这可能看起来很高,但对于时间序列预测来说非常好——通常 MSE 低于 50 对这些目的来说是好的。

如果想进一步降低错误率,常见的技术是在训练模型之前对数据应用指数*滑。把它想象成时间序列数据的缩放和标准化——你可以在这里了解更多关于时间序列数据的指数*滑。

绘制数据

我们将使用散景来绘制数据。交互性是使您的数据可视化脱颖而出并为您的客户提供更多用途和洞察力的一种很好的方式。尽管有其他库和方法来创建交互式可视化,但 Bokeh 是我的首选库。然而,这不是一个散景教程。如果不熟悉散景,可以试试他们的 入门指南

基本上,我们将原始数据绘制为散景图内的线字形,并绘制不确定性界限,在 Prophet 数据帧中表示为 yhat_upperyhat_lower 作为面积图。

分析趋势和季节性

如上所述,趋势季节性是时间序列数据的两个关键统计属性。理解这些因素对于理解数据本身至关重要。Prophet 用 plot_components 方法使这变得简单。

在下面的图表中,你可以看到伊拉克冲突事件在过去几年中一直呈总体负面趋势(随着 ISIS 被稳步击败)。然而,你可以看到在整个 2020 年都有小幅上升的趋势——这是由于多种因素,包括冠状病毒疫情和美国从该地区的多个基地撤军,导致 is is 活动增加。

就季节性而言,你可以看到一些有趣的模式——周五和穆斯林安息日的活动通常很少。你可以在 3 月-6 月看到一个活动高峰,这是众所周知的常见的西部沙漠战斗季节,因为温暖的气温使干河谷变干,使地形更容易通过;这也是典型的穆斯林斋月。有趣的是,数据还显示了 10 月至 11 月的高活动量,很可能是由于炎热的夏季过后天气变冷。就*年来而言,这也是一个充满政治冲突和抗议的年度时期。

绘制异常值

接下来,我们将识别时间序列数据中的异常值。这些事件超出了由 Prophet 模型确定的趋势和季节性。这对国家安全和国防数据至关重要。例如,在伊拉克,我们知道恐怖活动有季节性的上升和下降。那些季节性上涨来的时候,怎么知道是不是比*时差?异常值检测有助于识别恐怖活动的可能死灰复燃,让我们有更好的准备。

我们将使用一种简单的方法——我们寻找超出 Prophet 预测的不确定性上限的数据点,然后绘制该点。在最终的图中,我们可以看到,几乎整个 2016 年都充满了高于预期的恐怖活动,2019 年底和 2020 年初也是如此-这是由于伊拉克总理阿卜杜勒-迈赫迪向新总理卡迪米移交权力后的政治不稳定,2019 年 10 月开始的重大抗议和骚乱活动,以及上述因素,如美国撤军和冠状病毒疫情。

绘制分类数据

我想更彻底地调查异常活动。我想知道,在活动增加的时候,哪些类型的事件构成了这些数据——简易爆炸装置、常规战争等等。为此,我们将绘制第二个图来可视化数据。

散景自动链接共享列数据源的图之间的选择。因为两个图的数据来自相同的数据框,一个图中的选择将自动反映在第二个图中。我们需要做的只是在视觉上对元素进行样式化,以吸引人们对所选元素的注意,并明确不同时期流行的类别。

在这个数据的例子中,我们将使用散景中的 selection_glyphnonselection_glyph 属性,使数据在未被选中时不可见。这将使我们能够很容易地看到我们在原始图中选择的时间窗口的主要数据类型。

该代码片段仅显示了一个层的绘图。完整代码见笔记本。

主绘图使用一个 box_select 工具来动态改变可视化。将鼠标光标放在图中并拖动以选择时间窗口,观察可视化显示的变化!

摘要

现在,您可以通过 Prophet 机器学习模型使用 SARIMA 预测技术来分析时间序列数据。您可以自动优化您的模型,并使用它来了解数据中的趋势和季节性属性。您可以在交互式图表中绘制该信息,以便以后在仪表板或 web 应用程序中发布。伟大的作品!

使用熊猫和海牛调查数据集

原文:https://towardsdatascience.com/investigating-a-dataset-using-pandas-and-seaborn-d83140603cf7?source=collection_archive---------69-----------------------

克里斯·利维拉尼在 Unsplash 上的照片

在数据分析师的生活中,有成百上千的事情要做。数据准备、清理、探索性分析,然后可视化结果。通过熊猫和 Seaborn 图书馆,我研究了“IMDB 数据集”,并得出了一些结论。

数据集

我在分析中使用了 IMDB 数据集。它有 21 列和 10,866 行。

下载这里

清洁部分

首先,导入分析所需的所有库。

我必须从数据集中删除不需要的列。如果您不想使用数据集中的某些列,最好只在清理部分删除它们。

然后,我检查数据集中的重复行,并从中删除一行。

下一步是寻找 NaNs,我在我的数据集中的选择性列中发现了许多 NaNs 值。虽然 NaN 值在对象类型列中,但我决定用空白替换它们。

此外,我研究了数据类型,并更改了“release_year”列的 dtype。然后,在数据集中添加类似“利润”和“利润水*”的列,以供将来分析。

分析和可视化部分

使用熊猫的“情节”方法,我将这些年来上映的电影数量可视化。就这样,我想象了 1960 年至 2015 年期间大多数发行的类型电影。

利用小提琴图,我找到了历年(2011–2015)的“利润”数字分布。在此期间,您可能会发现许多异常值,但这些异常值不会被删除。

为了观察 2011 年至 2015 年期间电影的运行时间,我对遭受损失和获得大量利润的电影都使用了群集图。2011 年上映了一部时长 900 分钟的电影。这显然像是一个异常值,但这不是打字错误或错误的数据。所以,我也必须把它保存在数据集中。

我用条形图根据电影的运行时间水*检查了电影的*均预算。

结论

分析数据集后,我得出了以下结论:

  1. 大多数电影都是在 2014 年上映的。自 1960 年以来,电影发行数量的趋势线呈正曲线。
  2. 导演喜欢拍“戏剧”电影。大多数上映的电影都属于“戏剧”类型。
  3. 2015 年是电影行业最赚钱的一年。
  4. 最赚钱的年份是 2011 年至 2015 年,赚钱的电影超过 100 分钟,而亏损的电影只有 90 分钟左右。
  5. 令人惊讶的是,120-150 分钟长的电影的预算是 90-120 分钟长的电影的两倍多。但是,超过 180 分钟的最长电影的预算低于*均预算。

你可以在这里 找到整个代码 !!

如需讨论和更好的解决方案,请在我的 Linkedin 上留言!

调查 JSON 模块

原文:https://towardsdatascience.com/investigating-the-json-module-cd059b8a72f2?source=collection_archive---------56-----------------------

探索 Python 中最流行的数据格式之一

图像来源

JSON 是 JavaScript Object Notation 的缩写,创建它的目的是帮助提高数据传输的效率。它做到了这一点,现在它是网络数据传输的黄金标准。在这篇博文中,我将介绍如何使用 JSON 模块在 Python 中利用存储在 JSON 文件中的数据。

首先,我们要加载我们的 JSON 文件。我将在这篇文章中浏览的文件包含了 2001 年以来纽约市的竞选财务数据。正如这篇文章的标题所提到的,Python 中有一个非常有用的 JSON 模块,可以非常容易地导入,这使得处理 JSON 文件更加容易。

**import** json

要加载一个 JSON 文件,首先使用 Python 内置的 open 函数打开文件。然后,将文件对象传递给 JSON 模块的 load 方法。完成之后,最好检查一下 JSON 文件是作为哪种数据类型加载的。你认为它会是什么数据类型?

如果你猜是一本字典,干得好!JSON 文件通常是以分层的嵌套结构创建的,这意味着它们可能会令人困惑,甚至一开始会让人不知所措。但是,JSON 中的许多数据类型在 Python 中有相同的伙伴,只是名称不同。例如:

  • Python 列表元组 = JSON 数组
  • Python str = JSON 字符串
  • Python floatint = JSON 编号
  • Python = JSON 真
  • pythonFalse= JSON False
  • 无 = JSON 空

由于 JSON 模块的优秀开发人员,您可以使用 Python 中许多您熟悉的方法来研究您的 JSON 文件。一些例子:

  • 检查字典的关键字:

  • 检查值的数据类型:

  • 将字典视为数据框架:

  • 查看键中值的数量:

  • 和预览数据:

因此,虽然 JSON 文件的结构可能有点吓人,但 Python 中的 JSON 模块允许您以一种对熟悉 Python 的人来说既高效又舒适的方式进行 EDA。如果您想获得一些关于如何研究嵌套数据的实践,JSON 文件是一个很好的资源。

感谢您的阅读!

领英

基于机器学习的胸片新冠肺炎感染可解释预测研究

原文:https://towardsdatascience.com/investigation-of-explainable-predictions-of-covid-19-infection-from-chest-x-rays-with-machine-cb370f46af1d?source=collection_archive---------12-----------------------

我们能否通过应用神经网络和可解释算法来发现胸部 X 线新冠肺炎的特征?

编剧:布雷克·范贝罗&马特·罗斯

摘要

  • 探索一种可解释的机器学习模型来区分新冠肺炎阳性患者的胸部 x 光片。
  • 开发了深度卷积神经网络来分类胸部 X 射线。我们开源的模型基础设施是可扩展的、模块化的和有据可查的,这将允许其他研究人员通过构建这个库来快速迭代。参见我们的 GitHub 库
  • LIME 算法被用来解释模型的预测。
  • 我们邀请在机器学习或医疗保健领域拥有专业知识的研究人员、个人和组织为这个项目的发展做出贡献(联系信息在本文末尾)。
  • 这个项目是一个早期的原型,而不是一个医疗诊断工具。构建这个库需要更多的数据和专业知识。

介绍

毫无疑问,这篇文章的读者知道新冠肺炎教的迅速传播。这种传染病对公众健康和国家经济构成严重威胁。加拿大和世界各地的病例数呈指数增长。研究人员已经接受了行动呼吁,并试图了解更多关于 SARS 冠状病毒 2(新型冠状病毒)。为了支持这些努力,机器学习研究人员正在使用他们的技能来揭示更多关于该病毒的信息。例如,研究人员基于 ResNet50 开发了 COVNet 框架,以区分新冠肺炎病例的 CT 扫描和其他类型的社区获得性肺炎[1]。

本文记录了一项应用机器学习方法搜索可解释模型的实验,以根据胸部 X 射线(CXR)区分与新冠肺炎相关的肺炎病例。尽管机器学习可能有助于解决这个问题,但模型做出的任何预测(无论多么成功)都将受到医疗保健提供商的仔细审查。必须为模型的预测提供解释。我们希望可解释的机器学习模型将为新冠肺炎不断增长的知识做出积极贡献。

为什么要研究 x 光?

由于逆转录聚合酶链式反应(RT-PCR)检测试剂盒供应有限,因此有必要探索识别和优先处理新冠肺炎疑似病例的替代方法。在我们的城市加拿大伦敦,新冠肺炎测试结果的周转时间目前报告为 24 小时[2]。在农村和偏远地区,这一周转时间可能更长。尽管 CT 扫描被用于对怀疑患有新冠肺炎的患者进行临床检查,但价格昂贵。因此,较小的中心获得 CT 扫描仪的机会可能有限。x 光机更便宜,也更便携,因此是一个可行的选择。

需要澄清的是,这篇文章并没有声称 CXRs 应该被用于新冠肺炎的诊断。加拿大放射科医师协会建议遵循 CDC 的指导方针,即 CXR 和 CT 不应用于诊断新冠肺炎[3]。该建议指出,病毒测试是目前诊断新冠肺炎的唯一手段,即使患者在 CXR 或 CT 上有提示性特征。也就是说,一些研究表明,放射成像(特别是 CT)可能与 RT-PCR 一样敏感[4]。这些发现展示了为什么我们决定探索这一途径,并构建开源工具来支持进一步的研究。同样重要的是要注意,正常的成像并不意味着患者没有被新型冠状病毒感染,只是他们没有表现出新冠肺炎呼吸系统疾病的迹象。

目标

  • 确定是否可以训练机器学习分类器来区分新冠肺炎和 CXRs 的病例。
  • 确定是否可以训练机器学习分类器来区分新冠肺炎病例的 cxr 与其他肺炎和正常病例。
  • 应用众所周知的可解释性算法(LIME)来获得模型预测的解释。使用解释为特征工程和数据选择提供信息。
  • 与对合作感兴趣的其他人联系以加强这项工作(我们最重要的目标)。

数据

数据集

出于本实验的目的,数据取自两个存储库:

  1. GitHub 上的新冠肺炎影像数据收集库正在收集越来越多的来自国际上的新冠肺炎病例的已鉴定的 cxr 和 CT 扫描。我们想借此机会感谢蒙特利尔大学的约瑟夫·保罗·寇恩和他的同事们,感谢他们在收集这个数据集方面所做的辛勤工作。样本图像见图 1a
  2. Kaggle 上提供的 RSNA 肺炎检测挑战数据集包含几个已识别的 cxr,并包括一个标签,指示图像是否显示肺炎的证据[6]。我们想借此机会感谢北美放射学会和所有其他相关实体创建了这个数据集。样本图像见图 1b

图 1a(左):一个来自数据集(1)的 CXR 的例子,标签为新冠肺炎。图 1b(右):取自数据集(2)的 CXR 的示例,标记为显示肺炎的证据。

在撰写本文时,第一个数据集包含 76 个新冠肺炎阳性患者的后前位(PA) CXR 图像。它还包含一些具有替代发现(如 SARS)的患者的 cxr。包含第二个数据集是为了增加可用的数据量,以提高我们的分类器的辨别能力。第二个数据集不仅包含正常的 cxr,还包含几个肺炎患者的 cxr。在从这两个数据集中仅选择PA cxr时要小心谨慎。尽管两个数据集都包含前后(AP) CXRs,我们假设包含两者可能会过度影响模型预测。正如贝尔、琼斯等人所描述的那样。艾尔。与 PA CXRs 相比,AP CXRs 的缺点包括结构外观上的差异[7]。

在训练之前,来自两个数据集的数据被合并成一个由大约 1000 幅图像组成的大数据集。我们希望在一个更大的数据集上训练,但是我们担心会产生太多的类别不*衡。数据集由一个包含文件名和相关标签的数据帧组成。然后,数据集被随机分为训练集、验证集和测试集,注意保持这些集中的类比例不变。

数据预处理

在训练之前,对图像本身进行预处理。使用 ImageDataGenerator (来自 tensorflow.keras)在训练之前执行图像批次的预处理。对图像应用了以下变换:

  • 图像大小调整为以下形状:224×224×3。通过减小图像尺寸,减少了神经网络中的参数数量。
  • 对图像进行阈值处理以去除任何非常亮的像素,并修补缺失的区域。这样做是为了从图像中删除尽可能多的文本注释。有人假设,特定于一个地区或机构的注释可能会破坏预测。稍后将详细介绍。
  • 对图像的像素值进行了变换,使得它们的*均值为 0。
  • 图像的像素值除以图像内图像像素的标准偏差。通常,通过缩放图像使其像素值在范围【0,1】内,从而使图像标准化。相反,我们选择根据图像的标准偏差进行重新调整,因为数据集来自不同的来源。我们不能对 RSNA 数据集说话,但蒙特利尔大学的数据集包含从几个来源拍摄的图像。

二元分类

我们首先考虑一个二元分类问题,目标是检测 X 射线是否显示新冠肺炎感染的证据。分类员将 x 光图像归入非新冠肺炎类或新冠肺炎类。深度卷积神经网络架构被训练来执行二进制分类。使用 Adam 优化器和分类交叉熵损失来训练该模型。所有的训练代码都是用 TensorFlow 2.0 编写的。

体系结构

经过无数次迭代,我们得到了一个使用剩余连接的深度卷积神经网络架构。由于新冠肺炎威胁迫在眉睫,本文发布后将进行详尽的超参数搜索。此外,网络的规模受到限制,以适应*均 GPU 硬件资源,但在扩大网络规模以利用更大的计算可用性时,指标有望得到改善。未来的工作将努力训练一个众所周知的残差网络(如 ResNet50)并利用预训练权重的迁移学习。图 2 总结了二元分类器的架构。

图 2: 二进制模型的架构概述。在该图中,残差块由两个卷积层定义,第一个卷积层的输入与第二个卷积层的输出相连,后面是最大池层。剩余的块串联连接,然后是 2 个完全连接的层。预测类(p)是最终层的 softmax 激活的 argmax。

防止过度配合的措施

我们应用了多种策略来应对过度拟合,如 L2 权重正则化、剔除正则化和数据扩充(训练集图像旋转多达 10 )。

阶级不*衡

由于可公开获得的严重新冠肺炎病例 cxr 的稀缺,我们被迫应用类别不*衡方法来减轻一个类别超过其他几个类别的影响。如果你精通机器学习,你就会知道,当一个类的代表性不足时,分类问题的准确率可能会高得令人误解。我们进退两难,因为我们也不想将我们的训练数据限制在只有 76 个非新冠肺炎的例子,因为总共会有大约 150 个图像。因此,当模型错误分类一个正面的例子时,我们应用类别加权来惩罚模型。类权重最初仅根据数据集中的比例进行计算。结果并不令人满意。因此,我们在项目的配置文件中为用户提供了一个选项,以便对代表不足的类进行更大的加权(除了计算出的权重之外)。这种干预将我们的精度和召回指标提高到原型的可接受值。

结果

训练实验完成后,训练指标在 TensorBoard 中可视化。参见 3 a 关于培训和验证损失与纪元的示例。

图 3a: 二元分类器的训练(橙色)和验证(蓝色)损失与时期的关系

报告了测试装置的结果图 3b 。请注意,测试集包含不到 100 幅图像,其中只有 8 幅图像属于新冠肺炎类。图 3c 和 3 d 分别显示了混淆矩阵和 ROC 曲线。

图 3b: 二元分类器模型在测试集上的性能度量

图 3c(左):测试集上二元分类器预测的混淆矩阵。图 3d(右):二元分类器测试集预测的 ROC 曲线。

多类分类

尽管二元分类对于确定新冠肺炎 CXRs 是否具有任何可识别的模式是有信息的,但它更适用于将新冠肺炎重症病例与其他肺炎(尤其是其他病毒性肺炎)分开。我们在这里的目标是开发一个模型,可以将 CXR 图像分类为以下类别之一:正常、肺炎或新冠肺炎感染。我们重复了本文前面描述的相同的数据预处理技术。该模型架构与我们的二进制分类器非常相似,除了在末端具有 3 个节点的完全连接层(每个类一个节点)。

结果

一旦训练实验完成,训练指标就在 TensorBoard 中可视化。参见图 4a 中训练和验证损失与历元的示例。

图 4a: 多类分类器的训练(橙色)和验证(蓝色)损失与时期的关系

报告了测试集的结果图 4b 。报告了与新冠肺炎感染相对应的类别的二元指标(即精确度、召回率、F1 分数)。图 4c4d 分别显示了新冠肺炎等级的混淆矩阵和 ROC 曲线。尽管该模型识别了大多数新冠肺炎病例,但是可以看出该模型的准确性明显较低。较低的整体准确性意味着多类别模型学会区分新冠肺炎类别与“正常”和“其他肺炎”类别比学会区分“正常”和“其他肺炎”类别更好。该模型的未来版本必须在训练期间找到更好的类权重*衡,以确保其他类保持独特。

图 4b: 多类分类器模型在测试集上的性能度量

图 4c(左):多类分类器关于新冠肺炎类的测试集预测的混淆矩阵。图 4d(右):二元分类器关于新冠肺炎类的测试集预测的 ROC 曲线。

可解释性

可解释性的必要性

正如本文前面提到的,这个模型必须是可解释的。深度卷积神经网络不是固有可解释的;相反,它们被认为是“黑盒”。根据一份关于放射学中人工智能伦理的国际声明,“透明度、可解释性和可解释性是建立患者和提供者信任的必要条件”[8]。临床医生不可能完全相信算法的预测,也不应该相信。通过解释为什么我们的模型预测新冠肺炎感染或缺乏感染,任何对改善该系统感兴趣的研究人员或临床医生可以理解为什么该模型做出特定的决定。目前,我们采用 LIME 算法[9]来解释模型预测。

追求可解释的机器学习模型不仅在道德上是负责任的,而且对研究人员来说,确保模型中没有数据泄漏或意外偏差也是有益的。我们很高兴我们探索了可解释性方法,因为我们注意到在我们的模型和数据科学社区中其他人的方法中有多种可能的数据泄漏来源。

石灰解释

我们使用局部可解释的模型不可知解释(即 LIME)来解释我们训练的神经网络分类器的预测[7]。我们使用了作者的 GitHub 资源库中可用的实现。LIME 扰动一个例子中的特征,并拟合一个线性模型以在该例子周围的特征空间的局部区域中逼*神经网络。然后,它使用线性模型来确定哪些特征对该示例的模型预测贡献最大。通过将 LIME 应用于我们训练过的模型,我们可以根据我们看到的任何明显无关紧要的特征或领域专家的见解进行有根据的特征工程。我们还可以判断模型是否正在学习任何非预期的偏差,并通过附加的特征工程来消除该偏差。

对于图像数据,LIME 认为特征是图像的超像素。我们使用快速移动模式搜索分割算法【10】来产生这些分割。在我们的项目中,解释在视觉上表现为 LIME 认为对原始图像预测贡献最大的超像素的叠加。绿色的超像素表示对预测类别贡献最大的区域。相反,红色的超像素表示对预测类别贡献最大的区域。

请参见图 5a5b 了解测试集中两个二元分类器图像预测的时间解释的可视化表示。 5 c、5d、5e5f 显示了对测试集中图像的多类分类器预测的选择的时间解释。很明显,这个模型还有很长的路要走,因为胸腔外部的超像素继续出现在解释中。

图 5a(左):二元模型对测试集中的非新冠肺炎示例的预测的时间解释的示例。预测类匹配图像的地面真实类(即,非新冠肺炎)。有助于和不利于新冠肺炎预测的超像素分别被涂成绿色和红色。图 5b(右):二元模型对测试集中的新冠肺炎示例的预测的时间解释的示例。有助于和不利于新冠肺炎预测的超像素分别被涂成绿色和红色。

测试集中多类模型对 CXRs 预测的实例说明。对预测类有贡献的超像素和对预测类有贡献的超像素分别被着色为绿色和红色。图 5c(左上):对正常 CXR 的正确预测的简要说明。图 5d(右上):对被诊断患有新冠肺炎的患者的 CXR 的正确预测的简要说明。图 5e(左下角):对显示不同肺炎证据的 CXR 上的正确预测的简要说明。图 5f(左上):对一个正常 CXR 的错误预测的简要说明。该模型错误地将这种 CXR 归类为显示另一种肺炎的证据。

由石灰解释推动的改进

  1. 图像上打印的明亮字符
    在训练我们的二元分类器并首次生成石灰解释后,我们注意到包含明亮文本的超像素通常突出显示为绿色,这表明它们有助于模型的预测。也许其中一个数据集比另一个数据集包含更多的特殊字符。这一发现促使我们尝试移除和修复亮度超过某一阈值的像素。在其他预处理步骤之前,如果一个像素的亮度高于 230(255 中的一个),则使用周围像素作为参考[11]对其进行修复 T12。这种方法似乎改善了解释,因为文本区域很少被突出显示。然而,这种方法对于不太明亮的文本区域效果不好。如果亮度截止阈值设置得太低,我们可能会切除 X 射线中可能存在的伪影,这将导致真正的患者信息被删除。我们邀请其他人就这个问题提出更好的解决方案。要么我们找到一种更好的方法来从图像中删除文本数据,要么我们在一个完全没有字符打印在图像上的数据集上进行训练。
  2. 非新冠肺炎图像
    的儿科数据集的无意利用最初,我们使用保罗·穆尼的经典胸部 x 光图像数据集(可在 Kaggle 上获得)作为我们的非新冠肺炎图像集合。该数据集包含分类为正常病例、细菌性肺炎病例和病毒性肺炎病例的 X 射线。在训练二元和多类分类器之后,我们注意到图像右侧和左侧的黑柱在 LIME 解释中被频繁报告为支持非新冠肺炎 cxr 预测的重要特征。鉴于这些区域在患者体外,很明显它们不应该被一致地强调为对预测有贡献。在仔细阅读了 Kaggle 上这个数据集的描述后,我们发现它的所有 cxr 都是从 1 到 5 岁的儿科患者中获取的。这构成了数据泄漏,因为该模型可能会拾取成人与儿童 X 射线的特征。这可能解释了为什么我们最初在测试集上实现了高性能指标。这向我们强调了结合可解释的人工智能实现机器学习模型的必要性。我们注意到,在过去的 2 周内,这种利用相同儿科数据集对 cxr 进行新冠肺炎分类的方法已经在数据科学界发表了多次。我们希望这个项目可以帮助纠正这些错误的结果。

虽然 LIME 是一个优秀的可解释性算法,但在不久的将来,我们将会应用和比较其他模型不可知的可解释性算法。

结论

本文描述的项目是应用机器学习区分新冠肺炎感染重症患者和 CXR 的一种尝试。这项工作绝不是为了临床使用;这纯粹是探索性的。然而,我们希望这个项目将继续改进,并可能提供有助于新冠肺炎医学研究的见解。我们相信可解释性是产生一个帮助医疗工作者和研究人员的算法系统的关键。这个项目将继续发展,并将相应地提供更新。

与我们合作

随着新冠肺炎疫情继续将社会置于越来越大的压力之下,具有共同目标的研究人员团结起来至关重要。请将这篇文章视为对有兴趣合并或扩展这项工作的个人或组织的公开呼吁。我们已经看到类似的项目在进行中,并愿意共同努力。

对不同专业知识的需求

这个项目是由加拿大伦敦市人工智能研究和创新实验室的成员完成的。我们认识到,我们的工作会因其他人而大大加强。我们需要有不同专业知识的人来推进这个项目。特别是:

  • 需要临床专家来阐明临床需求,评估模型解释,并告知未来的数据预处理方法和模型设计决策。
  • 需要数据科学专业知识来提高模型性能和可解释性技术。
  • 如果项目被转移到生产中,可能需要软件工程专业知识来帮助转换项目。

如果您有兴趣,请联系我们(见下面的联系信息)。

需要更多数据

缺乏公开可用的新冠肺炎阳性 cxr 是改进这种原型模型性能的严重障碍。在小于 100 PA 新冠肺炎 cxr 的情况下,训练可概括的模型是具有挑战性的。机器学习的一个基本原则是,你训练的数据越多,你的模型对看不见的数据的表现就越好。

如果您能够提供更多身份认证数据或有兴趣签署数据共享协议,请联系我们:

马特·罗斯,
人工智能经理,
信息技术服务,
城市经理办公室,
伦敦金融城公司
maross @ London . ca | 226 . 449 . 9113

查看代码

请看这个项目的 GitHub 库。我们邀请您贡献您的想法。存储库的 README.md 解释了项目的组织,并提供了如何开始的详细说明。

参考

  1. 长度李等,“人工智能在胸部 CT 上区分与社区获得性肺炎”,放射学,2020。可提供:10.1148/radio . 2020200905
  2. “新冠肺炎测试政策和指南”,lhsc.on.ca ,2020 年。【在线】。可用:https://www.lhsc.on.ca/palm/labs/covid.html#main-content.【访问日期:2020 年 3 月 27 日】。
  3. 加拿大放射学家协会和加拿大胸部放射学会关于影像部门新冠肺炎管理的声明。加拿大放射学家协会,2020 年。
  4. Y.方等,“胸部 CT 对的敏感性:与 RT-PCR 的比较”,放射学,2020。可用:https://pubs.rsna.org/doi/10.1148/radiol.2020200432.
  5. J.科恩,《新冠肺炎影像资料集》, GitHub ,2020 年。【在线】。可用:【https://github.com/ieee8023/covid-chestxray-dataset. 【访问时间:2020 年 3 月 17 日】。
  6. “RSNA 肺炎检测挑战”, Kaggle ,2020。【在线】。可用:https://www . ka ggle . com/c/rsna-肺炎-检测-挑战。【访问日期:2020 年 3 月 22 日】。
  7. D.贝尔和 j .琼斯,《胸片》,放射医学。【在线】。可用:https://radiopaedia.org/articles/chest-radiograph.【访问日期:2020 年 3 月 26 日】。
  8. 放射学中人工智能的伦理:欧洲和北美多协会声明。美国放射学院,2020 年。
  9. 米(meter 的缩写))里贝罗、s·辛格和 c·盖斯特林,“我为什么要相信你?”,第 22 届 ACM SIGKDD 知识发现与数据挖掘国际会议论文集— KDD '16,2016。可用:https://dl.acm.org/doi/10.1145/2939672.2939778.【2020 年 3 月 25 日获取】。
  10. A.Vedaldi 和 S. Soatto,“模式搜索的快速转换和核心方法”,计算机科学讲义,第 705–718 页,2008 年。可用:https://link . springer . com/chapter/10.1007% 2f 978-3-540-88693-8 _ 52。【2020 年 3 月 25 日访问】。
  11. 《修复》,Scikit-image.org,2020 年。【在线】。可用:https://sci kit-image . org/docs/dev/auto _ examples/filters/plot _ inpaint . html【访问时间:2020 年 3 月 25 日】。

加密资产评估

原文:https://towardsdatascience.com/investing-in-crypto-assets-eca762f3aa80?source=collection_archive---------19-----------------------

数据科学家的生态系统概述

来源: Pixabay

注:此处无任何财务建议。本文仅供参考,不用于投资决策。

要点

  • 加密协议及其本地资产提供了一个开放的、数据丰富的资产类别,具有风险规模的经济性和公开市场流动性的优势
  • 我们仍然没有建立长期估值的标准,这提供了一个机会之窗
  • 将加密协议建模为复杂系统是一个活跃的研究领域
  • 分解价值链可以增加特定想法迷宫的迭代次数。这加速了产品市场契合度的集体发现。
  • 投资该资产类别提供了不对称的机会

简介

作为一名数据科学家,很难不对加密生态系统的开放性感到兴奋。开放的知识和开放的数据意味着一个可以指导我们投资决策的洞见宝库。

至少,它是值得深入研究的,因为它采用了多学科的方法来研究我们如何改变我们如何协调人类活动。我们不仅可以了解如何改善我们的人类系统,还可以了解它们如何以及为什么以这样的方式运行。

主流的兴趣很大程度上跟随着最*的价格趋势。在这篇文章中,我超越了加密价格的短期价格投机,并探讨了如何从长期角度看待加密资产估值的各个方面。这并不意味着对任何主题的深入探究,而是对生态系统的高层次概述。为了更深入,我提供了提到的概念的来源。

投资分析

大多数关于密码市场的数据科学相关文章都专注于技术分析来预测未来价格。如果历史模式显示未来价格上涨/下跌,这提供了一个买入/卖出信号。同时,基本面分析侧重于资产内在价值的估计。如果一项资产的估计内在价值高于/低于市场价格,这就提供了一个买入/卖出信号。

为什么这种区别对加密市场很重要?他们仍然不成熟,大部分投资(交易)都是投机性的,只要现实世界的问题没有用技术解决,这种情况就会持续下去。市场发展将使资产估值与其他更成熟的资产类别(股票、商品、外汇等)相似。)

为什么技术分析更受欢迎?最明显的答案是数据的可用性。即使区块链的数据是公开的,它仍然需要以一种有意义的格式进行解析。价格信息很容易获取。不仅如此,我们可以应用与任何其他资产类别相同(或相似)的方法进行分析。它可以被建模为有监督的机器学习或深度强化学习问题。或者我们可以用技术指标,从传统金融中转移知识。为了在基础价格上建立 LSTM 神经网络,除了知道如何优化模型架构(这是一个复杂但不同的问题),我们不需要任何领域知识。因此,关注点更多的是超越他人(大众心理),而不是评估资产的潜在价值。

与此同时,基本面分析依赖于领域知识,很难找到一个比密码学跨越更多领域的领域。它包括经济学、博弈论、密码学和分布式系统等。

基本面分析可以分解为两个部分:

  • 对解决商业问题的未来市场潜力的估计
  • 估计单个解决方案获取解决该问题的投资回报的概率

随着时间的推移,单个解决方案如何成功解决业务问题是 Balaji Srinivasan 称之为思想迷宫的进化过程。

想法迷宫

思想迷宫的一个非加密的历史例子是社交网络产品。如果我们估计未来的总目标市场 (TAM)将会很大,我们将如何在不同的选择中分配成功的概率?脸书获得的归因概率会和它今天在整个潜在市场中所占的百分比一样高吗?或者,MySpace 或 Hi5 会被视为更有未来潜力吗?或者,我们可能会得出结论,另一种产品将占领当时尚未推出的市场?当前的市场领导者解决业务问题的能力如何,其[网络效应](http://70 Percent of Value in Tech is Driven by Network Effects We wanted to put an actual number on the amount of value network effects have created in the digital world. The short…www.nfx.com)有多强和多有价值?这些问题可能值得一问。

这可能是一个很好的智力练习,但基本上没用。这有两个原因:缺乏交易流和封闭数据。第一个原因是,大多数人(散户投资者)没有机会投资早期企业。这是留给天使投资人和风险投资人的,因为他们既有资金也有动机长期持有非流动性资产,以换取大概率的大幅上涨。第二个原因是,我们可以用来评估业务的指标不对散户开放。这些公司在私人市场运营,所以他们没有动力分享他们的使用指标。随着越来越多的经济增长来自科技公司,它们上市的时间越来越长,这带来了一个困难的挑战:留给散户投资者的回报已经不多了。

在 crypto 中,许多人谈论“杀手级 dApp”(分散式应用程序),它将使加密技术成为主流。与此同时,仍然存在需要克服的关键挑战,这些挑战涉及计算吞吐量的 UX(如入口)和可扩展性

去年,分散融资(DeFi)申请数量有所增加,这些申请锁定了 $1B 总价值(TVL) 。价值是透明的,我们可以看到价值是如何分布在不同的项目中的。同时,这只是当前 3000 亿美元行业总市值的一小部分。

DeFi Pulse 生态系统概述(来源)

未来的发展取决于很多不可预测的因素。和技术一样,时机很重要。某些解决思想迷宫的方法可能在今天不成功,但在 10 年后会成功。不管怎样,有一点是清楚的:随着该行业市值的增加,主流市场对其回报的兴趣也会增加。因此,在不推测真正的杀手 dApp 的情况下,探索一个明显的想法迷宫是有意义的,crypto 有多种独特的方法来解决:社会投资。

解决社会投资的想法迷宫的用例是提供一个*台,将擅长投资的人和没有资源(时间/精力/技能)来主动投资的人联系起来。这并不是说我们不能构建不基于加密技术的解决方案。 eToro 的 CopyTrader 做的。与此同时,就像互联网使信息传播民主化一样,加密可以使金融产品的创造和管理民主化。DeFi 支持创建可编程、可组合和可互操作的资产,我们已经有了这样的工作实例。在此基础上构建的 Stablecoins 和 lending 协议已经有了多种变体。社会投资也是如此。

Set Protocol 构建了替代 eToro 产品的 DeFi,并增加了许多附加功能。 Melon ,另一个 DeFi 解决方案,专注于建立分散的链上资产管理。目前,对冲基金为可能编码在智能合约中的管理任务支付大量费用,并通过软件实现成本高昂的工作流程自动化。有了 DeFi,无论在什么地方,只需花费一小部分费用,就可以在几分钟内建立一个加密基金。 ICONOMI 是另一家提供集中金融(CeFi)解决方案的提供商,该解决方案支持创建和遵循不同的加密策略。

这些是探索社会投资理念迷宫的一些例子。由于网络效应,市场经常被赢家通吃的动态所统治,这也是长期加密协议护城河的一个来源。这并不是说这里会发生这种情况。这些产品针对单独和交叉的用例。

指标

在过去的二十年里,软件业务改变了我们在许多垂直领域提供服务的方式。有了像《精益分析》这样的书和像《AARRR》这样的框架,我们现在已经建立了思考 SaaS 商业价值的模型。我们了解跟踪和改善增长漏斗的价值。我们现在知道并理解了留住人才的重要性以及单位经济的重要性

创建初创公司的早期经验之一是,许多我们可能认为重要的指标只是虚荣指标。一个页面上的浏览量或客户总数并不能给我们很多关于业务实际表现的有价值的信息。几乎没有可操作的洞察力,只有一个错误的成功信号。

这与加密有什么关系?我们还没有建立成功的标准。加密网络复杂且相互关联。它们在不同的层上运行,构建在彼此之上。就像链条的强度由最薄弱的环节决定一样,上层协议层的安全性由下层协议层的安全性决定。我们越往上走,协议就越面向用户。

在 DeFi 中,加密协议的互联本质被描述为金钱乐高。通过分解价值链,我们可能会看到在一个特定的想法迷宫中迭代次数的增加。以此,加速寻找适合加密应用的产品市场的集体努力。

除此之外,加密协议通过其本地资产创造和获取价值是有区别的。今天所有的互联网经济都是建立在 TCP/IP 协议之上的。然而,它的创造者没有抓住在它之上创造的任何价值。某些协议建立在其他协议之上,而其他协议(目前)不能随着用户数量的大量增加而扩展。有时协议的网络无法抵御恶意攻击(攻击媒介)或者不够分散。这被称为区块链三难困境,加密网络需要在可伸缩性、安全性和去中心化之间进行权衡。

对于加密协议应该如何工作有不同的观点。一种观点认为,他们只是新类型的企业,其目标应该是优化他们的成功指标(如收入)。这意味着它们应该和股票一样接受评估:它们的商业基本面。另一种观点认为,它们只提供了逻辑系统来协调网络中不同参与者之间的关系。作为协调者,他们应该最小化他们获得的价值,而不是最大化它(不像企业)。

除此之外,加密项目还有独特的挑战需要解决。产品/市场契合度、社区参与度和充分的分权就像凳子的三条腿。它们都需要发挥作用,加密项目才能成功。

在定义有意义的加密指标方面也有很多工作要做。由于网络效应,加密协议的价值随着参与者的增加而增加。梅特卡夫定律对电信网络进行了量化,使得网络的价值与参与者的*方成比例增长。另一个引起生态系统关注的指标是来自货币经济学的交换方程 (MV = PQ)。这意味着加密资产的价值可以通过求解 M(货币基础的大小)来估计,M 随着数字资源数量(Q)及其价格(P)的增加而增加,随着资产速度(V)的增加而减少。其他更多的加密原生指标包括 NVT 和 INET。克里斯·伯恩斯克,这一领域的先驱思想家,就这一主题写了一篇早期文章和一本书。

慢慢地,某些习惯会变得根深蒂固,并被视为理所当然。正如今天的 web 开发人员在开发 web 应用程序时不需要考虑指针(低级编程抽象),未来的区块链开发人员也不需要考虑今天开发区块链应用程序的许多复杂性。

模拟协议行为

目的驱动的令牌的设计带来了来自其目标的挑战:让建立一个自组织系统。它表现出的行为无法通过其各部分的总和来预测。

考虑行星运动的研究。一个高中生可以用笔和纸计算出一颗行星绕太阳的运动,而三体却没有任何封闭形式的解。

布兰登·拉米雷斯

在分析加密协议时,需要考虑复杂的突发行为。 cadCAD 是一个 Python 库,通过模拟一组动作可能对系统产生的影响来实现建模。它可以回答系统设计和分析的“如果”。这篇论文对这个主题提供了很好的技术介绍。

为什么这对估值很重要?因为对于一个有效可靠的系统,我们需要了解不同的输入如何影响其输出。我们最不想要的就是使用或投资一个在不同参数下的行为对我们来说是黑盒的协议。

领域知识

现在很明显,关于加密的知识跨越了许多领域。如何跟上生态系统的进化?

与大多数行业不同,加密社区的成员经常与公众分享他们的知识和观点。

不从区块链开发商开始是不公*的。Vitalik Buterin(以太坊的创造者)是太空中最伟大的思想家之一。与此同时,他的想法可能不会直接适用于数据科学家。他的文章可能更有助于加深对协议设计的深层技术方面的了解,以及未来 5-10 年的行业趋势。

专门从事加密的风险投资公司通常也比不从事加密的公司更积极地写作。 Placeholdera16z cryptoOutlier Ventures、DragonFly 写下他们如何看待 crypto 的发展,并分享他们对为什么投资某些 crypto 项目的想法(他们的投资论文)。对于一个数据科学家来说,主要的价值是更好地理解价值创造和价值获取,并结合不同的评估心智模型。

加密分析公司经常写他们的*台可以从大量可用数据中发现的见解。这些可能是与数据科学家最相关的。 IntoTheBlock 撰写不同协议的深度行为分析。

IntoTheBlock 的资金进出分析(来源

其他类似的公司还有 SantimentAlethioDune AnalyticsTokenAnalyst 。这些侧重于分析观察数据。区块链数据的开放性使其能够洞察任何其他资产类别都无法获得的信息。

Alethio 的分散交易所交易者网络分析(来源

Gauntletblock science(cadCAD 的作者)这样的公司更关注使用基于代理的模拟来模拟协议行为。前者最*发表了一份关于复合(DeFi 应用)财务风险的研究报告

结论

作为散户投资者,与传统科技公司相比,在更早的阶段投资加密资产是可能的。项目的指标是开放的,投资是流动的(没有锁定期)。或者换句话说,加密项目使风险规模经济具有公开市场流动性的所有优势。

这使得投资者能够利用不对称风险(上升空间大,下降空间小)。这尤其适用于数据科学家,他们可以利用业务和技术知识,利用自己的数据驱动型决策技能。

随着该行业的成熟和市值的增长,这种知识将越来越货币化。我们将建立评估框架,更好地分析和模拟加密协议的突发行为。但在投资中,非共识的正确总是最重要的,因为这是回报所在。

用 Python 激活 Excel

原文:https://towardsdatascience.com/invigorate-excel-with-python-58c9c3208093?source=collection_archive---------4-----------------------

LP。照片由 wonder在 Unspl 灰上拍摄

三大集成方法以及您可以利用它们做什么

Microsoft Excel —你要么喜欢它,要么讨厌它!如果你和大多数人一样,你可能在没有听说过 Excel 的情况下经历了早期的生活。你可能已经上了大学,以优异的成绩毕业,但仍然对 Excel 知之甚少。

那是在你进入工业界并找到工作之前。然后,您发现如果 Excel 消失一个小时,整个世界都会停止运转!

现在,您可能知道 Excel 几乎没有做不到的事情!我在投资银行工作了很多年,我可以告诉你,每次我认为我已经看到了一切,我会看到别人整理的另一个电子表格!可能性真的是无穷无尽。

然而,目前 Excel 的主要局限在于大型数据集。数据集越大,在 Excel 中面临的困难就越多。在一个数据驱动、即时满足的世界里,人们希望事情立即发生;他们讨厌等待!人们还期望不断突破界限,提供不断提高的功能水*。

同时,人们讨厌改变。人们在 Excel 中很舒服,他们并不真的想远离它。因此,我们的工作是使这一过渡更加容易。提供更快的速度、更多的功能,而无需离开电子表格。

在 Excel 能够支持大数据之前,这就是 Python 的用武之地!将 Excel 与 Python 集成在一起,使我们能够通过 Excel 为用户提供更强大的功能。它允许我们的用户保持在他们熟悉的、容易理解的 Excel 世界中,同时 Python 可以处理一些繁重的工作!它为这个数据驱动的世界提供了一个中间步骤,直到 Excel 和我们技术含量较低的同事赶上来。

接下来,让我们探索一些可用的选项,用 Python 的强大功能来激活 Excel!

凯利·西克玛Unsplash 上拍摄

Excel 作为用户界面

将您的用户群从电子表格过渡到 21 世纪并不总是一件容易的事情。这是一个需要时间的旅程,但作为 It 专业人员,我们有责任帮助我们的用户群度过难关。在这个过程中,我们需要大量的指导、信任和保证。

首先,您可以考虑保持用户界面(UI)不变。换句话说,让我们不去管电子表格,但是让我们把任何后端处理从 VBA 转移到 Python。

考虑给 Excel…插上翅膀!

使用名为 xlwings 的 Python 包,可以无缝集成 Excel 和 Python。我们的用户可以继续使用 excel,但是每个表单控件按钮或用户定义的 Excel 函数都可以调用我们的 Python 脚本。

[## 如何用 Python 为 Excel 增压

如何用 xlwings 集成 Python 和 Excel

towardsdatascience.com](/how-to-supercharge-excel-with-python-726b0f8e22c2)

该应用程序易于安装,并奇妙的使用。如果你想了解更多,我已经链接了我以前的深入教程。

寻找新的 Excel

随着技术、数据和数据科学工具的爆炸,出现了一种新的用户:超级用户!

超级用户了解技术、数据,他们可以编写代码。他们要求表达自己和解决一些问题的自由。他们非常乐意离开他们的电子表格,使用新技术。那么,如何让他们灵活地做到这一点呢?

考虑给他们… Jupyter 笔记本!

Jupyter Notebook 允许他们利用 Python 创建可共享的、交互式的、基于 web 的文档,其中可以包含实时代码、可视化和文本。至于可以利用的数据,您可以继续使用您的企业数据源和数据库。

[## Jupyter 是新的 Excel

为什么交易者和金融专业人士需要学习 Python

towardsdatascience.com](/jupyter-is-the-new-excel-a7a22f2fc13a)

同样,该应用程序易于安装,并且非常易于学习使用。如果你想了解更多,我已经链接了 Semi Koen 的博客。

Excel 作为输入

不管怎么说,人们都喜欢 Excel,数据生成很可能会继续使用电子表格。然而,随着分析所需数据的增加,人们可以立即感觉到 Excel 地狱的末日即将来临。数据操作将花费很长时间,而枢纽操作将是永恒的。前提是 Excel 没有先崩溃!

这是 Python 可以提供帮助的另一个例子。使用流行的 pandas 库,可以快速地将电子表格中的数据加载到 pandas 数据框架或 SQL 数据库中。这两种解决方案都支持快速、轻松的数据分析和探索。

我在下面链接了几篇关于这个主题的博文,如果你想了解更多的话。

[## 用 Python 从 Excel 到数据库

了解如何使用 Python 进行快速数据分析

medium.com](https://medium.com/financeexplained/from-excel-to-databases-with-python-c6f70bdc509b) [## 从 Excel 和 Pandas 数据框架到 SQL

如何使用您的 SQL 知识来利用 Python 的熊猫

medium.com](https://medium.com/financeexplained/from-excel-and-pandas-dataframes-to-sql-f6e9c6b4a36a)

要考虑的其他库

在结束我们的讨论之前,让我们简要介绍一下其他一些流行的特定于 Excel 的 Python 库。我的观点是,我们上面提到的库将能够满足大多数用例,但是,如果您正在寻找 Excel 特定的功能(如格式、过滤器等),您可能希望尝试探索以下一些库:

openpyxl

读取和写入 Excel 2010 文件的库。您可以编写新的工作表,编辑现有的工作表,以及在 Excel 中使用鼠标进行几乎任何操作。它的超能力?它几乎支持任何 Excel 扩展!

xlrd

用于读取 Excel 文件中的数据和格式化信息的库。

xlsxwriter

可能是最完整的所有 Excel Python 库。

格式,条件格式,图表,合并单元格,过滤器,评论,与熊猫集成只是它提供的一些功能。如果您希望通过 Python 脚本使用 Excel 的全部功能,可以从这里开始!

结论

Excel 是一个在工业中广泛使用的神奇工具。如果你不熟悉,你最好开始!Excel 的主要限制是大数据,但我相信用不了多久,微软就会出手拯救世界。然而,在此之前,我们可以使用 Python 来帮助解决我们可能遇到的一些问题。

您是否使用不同的 Python 库来与 Excel 集成?让我和你的读者朋友们知道吧!

如果您喜欢这篇文章,您可能也会喜欢:

[## 大数据显示每个人都会撒谎

为什么大数据如此重要,为什么您也应该关注它

towardsdatascience.com](/big-data-says-everybody-lies-b7e9e28376c2) [## 了解如何用 Python 快速创建 ui

最后,你可以在 10 分钟内找到一个图书馆

towardsdatascience.com](/learn-how-to-quickly-create-uis-in-python-a97ae1394d5) [## 迪士尼英雄如何帮助我解决问题

学会使用迪士尼方法解决问题

medium.com](https://medium.com/better-programming/how-disney-heroes-help-me-solve-problems-bc4d3e230bfb)

邀请所有有抱负的强化学习实践者

原文:https://towardsdatascience.com/invitation-to-all-aspiring-reinforcement-learning-practitioner-5f87384cee67?source=collection_archive---------35-----------------------

感谢 AWS 和雅加达机器学习

drmakete 实验室Unsplash 上拍摄的照片

公开邀请所有有志于强化学习(RL)的从业者在未来 3 个月内与我一起学习 RL

不久前,我参加了由 AWS 和 Jakarta Machine Learning (JML)举办的 RL 训练营。我们这些参与者将会得到 AWS 经验丰富的代表们的悉心指导。在接下来的 3 个月里,导师们将指导和介绍我们走'正道',学习 RL。不仅学习理论,我们还将学习如何在实际应用中应用它!

是不是很有意思??让你更感兴趣的是:

我会把我在这次训练营中学到的东西分享给大家!!

所以,深呼吸,泡一杯茶,我邀请你和我一起加入这个激动人心的 RL 之旅!

照片由 Loverna 在 Unsplash 上的旅程拍摄

上周是第一次会议,这基本上是一个关于项目的介绍会议,参与者的概况,我们将学到什么,以及一些关于 RL 的介绍。当我听到我们在接下来的 3 个月里将要学习的内容时,我感到无比兴奋,因为我不仅仅是为了自己而学习,我还会与你们分享我的知识!

首先,我将向您介绍强化学习。尽情享受吧!

什么是强化学习?

AI 领域[图片由作者提供]

强化学习(RL)是机器学习的一个子集,它使一个代理能够在一个特定的环境中通过行动的结果进行学习,目的是最大化累积回报

为了更好地理解,假设你有一只新的宠物狗,名叫布朗,你想教它一些技巧。怎么会?当他做对的时候你可以奖励他,当他做错的时候你什么都不给。当然,你必须这样做几次,直到他意识到他应该做什么。

安娜·杜德科娃在 Unsplash 上的照片

另一个关于 RL 如何应用于现实生活的有趣例子是 YAWScience 做的一个实验。在这个实验中,如果小鸡成功地钉住了粉红色的纸而不是其他颜色的纸,它就会得到奖励。结果是,小鸡成功地锁定了正确的一个,尽管在每次迭代中所有的纸都被打乱了!

像其他科学领域一样,我们必须准备一个强大的基础,这样我们才能轻松地学习更复杂的领域。要掌握 RL,我们必须了解它的先驱:(MDP)。在我们了解 MDP 之前,我们必须了解:

  1. 马尔可夫性质
  2. 马尔可夫过程(马尔可夫链)
  3. 马尔可夫奖励过程

正如我在开始所说,这个训练营提供了学习 RL 的“正确途径”。导师告诉我们,MDP 概念对于更好地理解 RL 非常重要,并鼓励我们自己学习。

我试图在训练营之外自学这个概念,我做到了!就像我一样,我也相信你可以自学!但我不会让你迷失在野外。我想确保你和我总是在同一页上。所以,我会分享一些我看过/读过的好资源给你:

  1. 马尔可夫决策过程(MDPs)——构建强化学习问题
  2. David Silver 的 RL 课程——第 2 讲:马尔可夫决策过程
  3. 强化学习揭秘:马尔可夫决策过程(第一部分)
  4. 强化学习揭秘:马尔可夫决策过程(第二部分)

RL 中的重要术语

RL 模型中涉及的元素。[图片由作者提供]

您需要了解几个重要术语:

  1. 代理人。需要根据自身行为和经验接受“教育”的决策者。由策略和学习算法组成。
  2. 环境。代理人的物理世界。基本上,它只不过是一个模拟。
  3. 状态。代理当前所处的“情况”。这包括过去、现在和未来的状态。
  4. 行动。代理人在环境内部的活动。
  5. 奖励。环境的反馈。可以是正的,也可以是负的。
  6. 政策。负责根据对环境的观察选择代理将采取什么行动的单元。
  7. 插曲。以终止状态结束的状态序列。
  8. 奖励功能。激励特定代理行为的功能,是 RL 的核心。

类似于监督机器学习设置中的偏差-方差权衡,RL 中也有权衡。这叫做探索与开发的权衡。探索是指代理人试图收集一些新信息,并期望这些信息比当前信息更有用。而利用是指代理根据已知信息做出最佳决策。

为了更好地理解,假设你和你的朋友亚当计划明天一起吃午饭。考虑这两种情况:

  1. “嗨,亚当,我听说这个地区新开了一家餐馆。我们为什么不试试去那家餐馆吃午饭呢?”
  2. “嘿,亚当,我知道我们明天应该去哪里吃午饭了。我们为什么不在上周去过的那家餐馆吃午饭呢?”

第一个场景就是我们所说的探索。你和亚当不知道它会是什么味道,它可能比你最喜欢的餐馆差,但也可能好得多。而在第二种情况下,你知道你们两个都不会对味道有问题,而且你们很有可能会喜欢明天的午餐。这个场景类似于开发阶段。

它是如何工作的?

RL 工作原理的基本概念。[图片由作者提供]

现在,我将解释 RL 在高层是如何工作的。不要担心,因为在以后的帖子中,我们将回到这个问题并了解细节!

下标 t 指的是我们当前所处的时间步长。

在第一个时间步( t=0 ),代理接收环境的状态作为输入。基于这些输入,它将决定采取什么行动。一旦作出决定,行动就转移回环境中。

然后,时间步长递增(t=1 ),环境产生新的状态。除此之外,环境还会输出一个奖励,稍后会给代理人。

最后,将当前状态和奖励都提供给代理。代理因其之前的行为而获得奖励(可以是正的或负的)。

对于未来的时间步长,重复相同的过程。

但是……当这个循环结束时?

这取决于你的任务类型。一般来说,有两种不同的类型:

  1. 阶段性任务是具有终结状态的任务。换句话说,这种任务是有结局的。比如下象棋。
  2. 继续任务是没有终止状态或永不结束的任务。例如,个人辅助机器人。

因此,如果您正在处理一个临时任务,那么循环将会重复,直到到达终端状态。如果您正在处理一个连续的任务,那么循环将永远不会结束。

最后的话

Ravi PinisettiUnsplash 上拍摄的照片

恭喜你坚持到了这一步!

到现在为止,你应该知道什么是强化学习,RL 中有哪些重要的术语,它在高层是如何工作的。如果你听从了我的建议,那么你也应该已经了解了马尔可夫决策过程的概念。对于那些没有读过这本书的人,我鼓励你花些时间来学习这个概念。

记住,这只是我们学习 RL 旅程的开始!我还有很多材料要和大家分享。所以,如果你喜欢这些内容,并且想在接下来的 3 个月里继续和我一起学习,请关注我的媒体账号,以获得关于我未来帖子的通知!

在下一集,我们将了解更多关于 RL 在自动驾驶赛车中的应用。来看看

关于作者

Louis Owen 是一名数据科学爱好者,他总是渴望获得新知识。他获得了最后一年的全额奖学金,在印度尼西亚最好的大学之一Institut Teknologi Bandung攻读数学专业。最*,2020 年 7 月,他刚刚以优异的成绩从他的研究中毕业。

Louis 曾在多个行业领域担任分析/机器学习实习生,包括 OTA(Traveloka)、电子商务( Tokopedia )、fin tech(Do-it)、智慧城市 App ( Qlue 智慧城市 ),目前在 世界银行 担任数据科学顾问

查看路易斯的网站以了解更多关于他的信息!最后,如果您有任何疑问或需要讨论的话题,请通过 LinkedIn 联系 Louis。

iOS 14 是为了扰乱公司对用户的跟踪

原文:https://towardsdatascience.com/ios-14-is-here-to-disrupt-user-tracking-for-ads-59894a7e9da6?source=collection_archive---------51-----------------------

苹果吹嘘的新 ios 14 隐私功能,用户喜欢,广告商讨厌。

丹尼尔·罗梅罗在 Unsplash 上拍摄的 BG 照片

自从 WWDC 的第一天起,科技行业的话题就一直围绕着苹果的新硅芯片以及新的 iOS 和 macOS 版本。iOS 14 与*年来的前几个版本相比,在改进的 UI 和新功能方面有了重大更新。Android 用户对很多功能一笑置之,比如他们已经拥有多年的图片模式。

但是有些东西很多人在主题演讲中忽略了,有些东西可能会影响像脸书、谷歌这样价值数十亿美元的公司,以及价值数十亿美元的广告业。广告界和苹果公司已经在 mano a mano 待了一段时间,但是这些新的变化将会改变这个行业的游戏规则。让我们来看看一些主要的隐私功能:

1.应用程序跟踪

iOS 13 已经在手机的隐私设置中加入了广告跟踪功能,而大多数用户并不知道。随着 iOS 14 的推出,苹果通过将这一功能引入应用程序,将更多控制权交给了用户。在 iOS 14 中,如果一个应用程序想要跟踪用户,他们必须明确征求用户的许可。因此,每次你安装需要追踪信息的应用程序时,你都会得到一个要求你许可的提示。用户也可以在完成后关闭此功能

跟踪权限提示

值得注意的是,这并不意味着应用程序不能完全跟踪你,苹果为开发者推出了一个新的以隐私为重点的广告框架,允许匿名检索数据,而无需掌握用户或具体信息。但这将使大多数公司用于货币化的指标过时。

2.Safari 跟踪报告

Safari 中的新跟踪功能将向用户显示网站用来收集用户信息的所有跟踪器的列表。这项功能将出现在 iPhone、iPad 和 Mac 上的 Safari 浏览器中,并向用户显示苹果通过其智能跟踪阻止功能阻止的所有跨网站跟踪器的列表。受欢迎的网站用来收集你的信息的追踪器的数量会让你大吃一惊。

追踪器在 google.com

3.本地网络跟踪

这是大多数用户没有意识到的,应用程序可以跟踪与你连接到同一个网络的设备。大多数流行的应用程序,如脸书、Youtube、MiFit 等,都使用这种权限来跟踪用户的设备,而 iOS 14 用户可以选择不允许这样跟踪的应用程序。令人惊讶的事实是,即使用户否认跟踪权限,所有这些应用程序都可以顺利运行,但它们只是由公司放在用户的其他设备上收集更多用户信息。

Mi Fit 应用程序请求本地网络跟踪权限

4.剪贴板跟踪

在许多用户发现流行的应用程序频繁访问剪贴板信息后,这一功能最*引起了很多关注。包括抖音、Chrome、LinkedIn 等在内的众多热门应用..接触到了这个新功能。在 Twitter 上迅速传播的视频中,一名用户向世界展示了抖音是如何复制剪贴板内容的,即使用户正在其他应用程序中键入一些内容。这在社区中引起了许多关注,因为剪贴板通常包含银行详细信息等敏感信息,如果一个应用程序秘密使用剪贴板来跟踪用户,他们可以访问大量敏感信息。iOS 14 已经为这种行为标记了一长串应用程序,公司正在试图为跟踪这些信息提供模糊的借口。

抖音从 Instagram 复制剪贴板信息

6.*似位置跟踪

旧版本的 iOS 已经给了用户足够的控制权来控制应用程序何时可以追踪用户的位置。自 iOS 13 以来,用户只允许一次位置访问变得更加容易,只有在使用应用程序时或总是允许,这在隐私方面受到了好评。

iOS 14 更进了一步,给了用户更多的权力,他们可以选择与应用程序共享*似位置,而不是精确位置。有了这个功能,公司永远无法知道用户的确切位置,但同时用户仍然可以获得相关的广告和签到附*的地方。考虑到位置是对用户隐私最有价值的信息之一,这也将在用户中大受欢迎。

7.专用 Mac 地址

这是一个非常简单但功能强大的功能,已经添加到 iOS 14 中。用户现在可以为单个无线网络屏蔽他们的 MAC 地址。现在,用户可以选择在 iPhone 上隐藏特定网络的 MAC 地址。这对用户有多种好处,如防止 ISP 跟踪用户的设备,绕过 MAC 地址防火墙访问被阻止的应用程序和网站等。

使用 Wifi 时屏蔽 Mac 地址的选项

8.C 摄像机和麦克风录音指示灯

应用程序使用你设备的麦克风秘密监听是历史最悠久的阴谋论之一,许多人报告了他们在谈论产品后立即看到广告的个人经历。为了结束这种恐惧,iOS 14 在手机的状态栏中有一个摄像头和麦克风录音指示器。MAC 和 MacBooks 有一个绿色 led 指示灯来显示这一点已经有一段时间了,但 iOS 14 还会在应用程序使用你的麦克风时使用橙色圆点指示灯来提醒你。此外,控制中心还会显示最*使用您的摄像头或麦克风的应用程序。

橙色圆点表示麦克风的用途

在重视用户隐私的公司中,苹果一直走在前列,他们也一直利用这一点开展营销活动。在最*的一次采访中,蒂姆·库克解释说,苹果对收集用户信息不感兴趣,他说:“你不是我们的产品,我们的产品是 iPhones 和 iPads。”虽然广告公司声称苹果的政策不公*,但全球用户都很高兴苹果正在利用他们作为世界上最受欢迎的移动操作系统的力量,带来保护用户信息的变化,而不是那些将用户出卖给公司和数字营销者的公司。

IOT 数据分析:第 2 部分:数据模型

原文:https://towardsdatascience.com/iot-data-analytics-part-2-data-model-3da9676cb449?source=collection_archive---------30-----------------------

将数据仓库建模的最佳实践应用于物联网数据,以实现最灵活高效的分析

介绍

这是上一部分的延续,上一部分描述了与健身跟踪活动示例的物联网数据分析相关的问题陈述。还描述了存储类型选择背后的原因,并推荐了两种类型的存储:

  1. 大数据存储用于存储时间序列类型的数据
  2. 关系分析数据库为数据分析提供了最大的灵活性。更多细节在这里。

这个故事的目的是描述第二种存储类型(关系分析存储)的推荐数据模型。数据仓库部分的逻辑数据模型。

建模技术

幸运的是,数据仓库概念已经在市场上存在了几十年,因此它非常成熟,许多思想领袖围绕解决方案构建和数据建模贡献了最佳实践和模式创建。

让我们使用 Ralph 的 Kimball 方法来处理特定设计决策的建模和一些模式。

从方法论的角度来看,我们将执行以下步骤:

  1. 选择一个描述我们健身跟踪案例的业务流程列表
  2. 对于我们定义的每个流程:
  • 粒度 —存储数据的详细程度
  • 描述业务流程上下文的维度列表,回答了谁、什么、何时、何地、为什么以及如何的问题
  • 测量列表 —根据颗粒测量事实的定量数值

我们在 Bus matrix、中收集这些细节,Bus matrix 是由业务术语描述的模型的第一个高级版本,非常适合并建议与各种利益相关者共享和讨论。

用于创建逻辑数据模型的特定设计模式将是:

  • 星型模式作为主模型布局,这赋予了最大的灵活性和效率。它还具有良好的可扩展性,这对于物联网用例非常重要。
  • 定期快照事实表 —一个事实表,其中每一行都聚集了某个预定义周期内发生的测量。粮食是一个时期,而不是个人交易
  • 累积快照事实表 —一个事实表,其中每一行聚集了在流程开始和结束之间的可预测步骤中发生的测量事件。

健身跟踪总线矩阵

基于问题陈述的描述,我们定义了以下业务流程列表以及粒度、维度和度量:

用于健身跟踪的总线矩阵(图片由作者提供)

总线矩阵注释

周期性快照

来自物联网设备的指标通常会定期出现,但这种规律性并不总是准确的。此外,一些 meticss 比其他 metic 出现得更频繁,因此从时间的角度来看,有一个共同的标准是非常有用和方便的。度量在一定的时间段内保持一致,以便能够关联不同的指标并更容易地可视化它们。

定期快照有两种模式:

  • 健康指标快照 —以标准模式收集健康统计数据,此时不执行任何特殊的健身活动。对齐数据的周期可以选择为一分钟或接*一分钟的时间。
  • 活动指标快照 —在特殊健身活动期间收集统计数据,如跑步、游泳等。在这种模式下,通常会更频繁地收集指标,大约每隔一秒钟收集一次

活动圈总结

该流程的目的是保存健身活动的所有摘要。因为每个活动可以包含动态数量的子阶段,称为 laps ,所以保持单个 laps 级别的粒度是值得的。

每个活动 lap 都有严格的开始和结束时间戳,因此我们可以将其视为工作流的简化版本,并为其创建一个累积类型的快照。

逻辑数据模型

实现总线矩阵的逻辑数据模型如下图所示:

健身跟踪物联网的逻辑数据模型(图片由作者提供)

LDM 评论

总的来说,数据模型是总线矩阵所描述的过程的非常简单的实现。

让我们强调一些要点:

  • 日期维度是非常标准的,用于按日/周/月/年进行方便的分组
  • 时间维度用于构建每天的活动画面,按小时分析数据
  • 除了日期和时间之外,所有事实表都有时间戳,时间戳可以被视为退化的维度。对于快照事实表,它是周期的开始,对于活动圈,我们有开始和结束里程碑
  • 有一个活动 ID 退化维度,可用于将活动摘要与详细信息绑定在一起
  • 建议基于代理键构建维度表中的主键
  • 主键(事实上的表)建议根据粒度在字段子集(主要是维度外键)上构建。
  • 即使没有可用的数据,也会对每个期间执行定期快照。建议将测量值设置为空,而不是零,以便进行正确的最小/最大/*均聚合计算

数据分析覆盖面

有了这样一个模型,我们将能够涵盖博客第一部分中描述的所有分析需求

后续步骤

那些深谙 Kimball 方法论的人可能会问:事务事实表在哪里?

快照事实表通常作为主事务事实表的补充,粒度等于每个事务 1 条记录。在我们的例子中,一个测量事件,比如 HR 或 pace 测量可以扮演一个事务的角色。这是一个有道理的观点,但是我相信事务事实表(以非规范化的形式)可以被 NoSQL 键值或时间序列类型的存储很好地覆盖。

还有其他一些有趣的话题没有涉及到,值得特别关注:

  • 处理设备之间的层次关系
  • 如何执行时间序列和模式匹配类型的查询/分析
  • 如何存储地理位置 GPS 数据点并进行基于位置的分析
  • 当我们对不同类型的活动执行不同的度量时,如何处理动态的或非常大量的度量

这些话题将会在接下来的文章中涉及。敬请期待

附言

更好地理解业务领域和模型中的一些实体属性是受我的个人健身追踪器/智能手表 Garmin 菲尼克斯的启发。我不为佳明公司工作,我只是其产品的消费者:)

IoU 更好的检测评估指标

原文:https://towardsdatascience.com/iou-a-better-detection-evaluation-metric-45a511185be1?source=collection_archive---------1-----------------------

选择正确的目标检测模型意味着不仅仅要看地图

图片来自 COCO-2017 [1]验证集,检测显示在第五十一 [2]中

为您的任务选择最佳的模型架构和预训练权重可能很困难。如果你曾经研究过物体检测问题,那么在比较不同的模型时,你肯定会碰到类似下面的图表。

右图来源:YOLOv4 [3]。左图来源:EfficientDet [4]

通过这样的比较,你可以得到的主要信息是哪个模型在 COCO 数据集上的地图比其他模型高。但这对你来说到底有多重要呢?您需要停止严格地查看聚合指标,而是查看更详细的数据和模型结果,以了解哪些有效,哪些无效。

*年来,在通过更快的模型提供类似的检测结果方面取得了长足的进步,这意味着在比较两种检测器时,mAP 不是唯一要考虑的因素。 然而,无论你的模型有多快,它仍然需要提供满足你要求的高质量检测

虽然能够容易地比较不同的模型是重要的,但是将模型的性能降低到单个数字(mAP)会掩盖模型结果中的复杂性,这可能对您的问题很重要。您还应该考虑:

  • 边界框紧密度(IoU)
  • 高可信度误报
  • 抽查性能的单个样品
  • 与你的任务最相关的课程的表现

什么是地图?

*均精度(mAP)用于确定模型中一组对象检测在与数据集的地面实况对象标注进行比较时的准确性。

我们不会在这里详细讨论,但你应该了解一些基本知识。有兴趣的话有很多帖子详细讨论地图[67]。

借据

计算 mAP 时使用并集交集(IoU)。它是一个从 0 到 1 的数字,用于指定预测边界框和实际边界框之间的重叠量。

  • IoU 为 0 表示方框之间没有重叠
  • IoU 为 1 意味着框的并集与它们的重叠相同,表明它们完全重叠

(来源)

IoU 是收集人工注释时要跟踪的一个重要的准确性度量。行业最佳实践是为他们的人工注释任务包含最低 IoU 要求,以确保交付的注释相对于该对象的“完美”注释具有 IoU >= X(其中 X = 0.95 是典型值),这由项目的注释模式确定(即,尽可能紧密地框住车辆,包括它们的所有可见部分,包括车轮)。另一方面,在 0.95 IoU 时,are 检测器的状态通常表现不佳,我们将在本文后面的实验中展示这一点。

简而言之地图

*均精度(mAP)通过首先收集一组预测对象检测和一组基本事实对象注释来计算。

  • 对于每个预测,相对于图像中的每个基本事实框计算 IoU。
  • 然后,这些借据被阈值化到某个值(通常在 0.5 和 0.95 之间),并且使用贪婪策略将预测与基础真值盒进行匹配(即,首先匹配最高借据)。
  • 然后为每个对象类生成精度-召回率(PR)曲线,并计算*均精度(AP)。PR 曲线考虑了模型在一定置信值范围内关于真阳性、假阳性和假阴性的性能。更多详情可参见本帖【6】。
  • 所有对象类的*均 AP 是地图。
  • 评估 COCO 数据集时,用 0.5 至 0.95 的 10 个 IoU 阈值重复这一过程,并求*均值。

下图演示了计算 mAP 需要多少步骤,以及在试图理解基础模型预测时 mAP 作为一个概念有多抽象。

显示将地图与模型预测相关联的步骤的流程图

为什么地图这么受欢迎?

为什么 mAP 已经成为比较对象检测模型的标准,最好的答案是因为它很方便。你理论上只需要用一个数字来比较不同型号的性能。

如果你绝对需要只用一个标准来比较,地图是个不错的选择

然而,现在最先进的车型之间的性能差异小于 1%图 ,迫切需要其他方法来比较车型性能。

来源:论文,代码

评估模型在每个图像的基础上定位和分类对象的能力,特别是其故障模式,比在真空中考虑地图提供了对模型的优点和缺点的更深入的洞察。我们称之为原子评估。

可可·凯奇女士比赛

为了演示原子探测评估的过程,我在 MSCOCO [1]上比较了 3 种不同的物体探测模型(fast-RCNN[5],YOLOv4 [3],EfficientDet-D5 [4]),以查看该评估如何将它们与它们的地图进行比较。

地图

作为参考,下面是 COCO-2017 验证集上的模型图:

借据

模型地图本身并不能直接显示模型的边界框有多紧,因为该信息与预测的正确性混为一谈。您必须直接评估 IoUs,以了解模型的边界框与基础事实的紧密程度。

生成不同模型 IoU 汇总统计数据的一种简单方法是绘制直方图。这是基本配方:

  1. 使用一组模型检测数据集中的对象
  2. 计算每个预测的借据
  3. 对于每个预测,存储它与任何地面真值对象的最高 IoU
  4. 用标准化计数绘制直方图

我使用我在 Voxel51 帮助开发的新计算机视觉工具fifty one【2】来存储我的模型输出并计算我随后用Matplotlib【8】绘制的借据。我后来使用51来容易地可视化和比较三个模型的检测。声明:我在 Voxel51 工作!

51 个检测模型的 IoU 分布计算和 Matplotlib 可视化

从这些结果中,我们可以看到,即使在我们的实验中,EfficientDet 的图低于 YOLOv4,IoU > 0.9 的边界框的百分比也较高。这表明,如果您的任务中边界框的紧密度很重要,EfficientDet 是比 YOLOv4 或 Faster-RCNN 更好的选择。

假阳性

决定您应该使用哪个模型的一个好方法是查看最坏的情况,并了解每个模型的性能。在这种情况下,我们将查看模型对其预测有信心,但与实际情况相差甚远的场景。具体来说,我们希望找到模型同时具备以下两项的样本:

  • 高置信度得分
  • 低 IoU

符合这些标准的预测通常分为两类:

  1. 它们产生于你试图测量的模型中的不准确性
  2. 它们源于模型预测正确但被标记为错误的基本事实注释中的不准确性

有证据表明,流行的对象检测数据集中的注释可能不像你想象的那样正确。这在这篇 的博文【9】看着 谷歌的开放图片数据集【10】中得到了证明。

我再次使用51来轻松找到这些样本和检测。一旦我将我的模型输出加载到 FiftyOne 中,我就能够使用下面的代码搜索模型的示例,例如,EfficientDet 对于任何基本事实对象都具有最大 IoU < 0.1,但也具有置信度> 0.9:

来自 COCO-2017 验证集的图像和显示在第五十一中的检测

这个例子是根据我们指定的标准弹出的。如果你使用一个模型来完成自动驾驶汽车的任务,那么你需要确保你的模型不会出现像这样严重的错误。

每个模型都有不同数量的样本,预测结果都符合我们的标准:

  • 更快-RCNN: 1004 个样本
  • YOLOv4: 84 个样本
  • 效率检测:5 个样本

与 YOLOv4 和 EfficientDet 相比,fast-RCNN 包含了更多的高置信度、低 IoU 预测。将它们可视化显示,来自 YOLOv4 和 EfficientDet 的少数预测也由 fast-RCNN 预测。这些误报通常是注释错误,即地面真实数据集中遗漏了对象。然而,更快的 RCNN 也包含了更高比例的由模型引起的假阳性。下面是一些例子。

图片来自 COCO-2017 验证。()一只老鼠被三个模型都预测出很高的可信度,但是没有被注释。()一头大象被 Faster-RCNN 高置信度预测为“人”。

这些结果表明 YOLOv4 或 EfficientDet 对于检测未标记对象实例比 fast-RCNN 更有用。

现场检查

在您知道您可能需要哪些模型之后,花一些时间查看它们的检测结果来建立关于它们将如何执行您的任务的直觉是一个好主意。像我们实验中展示的那些例子,如果不看模型输出,是不可能被发现的。这就是第五十一条真正派上用场的地方。它允许您尽可能仔细地研究您的数据集和检测。

在我浏览的前几十个示例中,我发现了下面的例子。

图片来自 COCO-2017,在第五十一届展出。| 黄色 : Faster-RCNN | 绿色 : EfficientDet | 蓝色 : YOLOv4

令人惊讶的是,fast-RCNN 比 YOLO 捕捉到了更多的人,比 EfficientDet 多得多,尽管 fast-RCNN 的地图要低得多。这一点得到了其他样本的证实,人群也显示出同样的趋势。如果您需要能够检测人群,那么 fast-RCNN 可能是比更新、更高的 mAP 模型更好的模型选择。

获胜者是谁?

没有适合任何任务的完美模型,最适合你的模型取决于你决定的标准和你的最终用例。在我们所观察的三个模型中,每一个都以不同的方式在不同的情况下发光,这些方式并没有被它们的地图所阐明。这里真正的赢家是像 MSCOCO 这样的数据集和像 FiftyOneMatplotlib 这样的工具,以及许多其他允许我们在选择模型之前快速轻松地挖掘和分析模型的工具。

关键信息是,使用适当的指标来指导基于特定操作条件的模型评估和选择,而不是简单地依赖于 mAP,这一点至关重要。在分析了模型性能的不同方面后,没有一个模型在上述三个部分中表现最佳。根据最终任务,每种模式都可能是正确的选择,下面介绍了其中的三种。

借据

如果你主要关心的是边界框的紧密度,那么你可能应该选择 EfficientDet 。当我们绘制每个模型的所有 IoU 时,EfficientDet 具有最高的 IoU 检测。

例如,如果您希望使用一个模型来执行自动预注释,以使您的人工注释工作更加高效,这将非常有用。绘制和固定边界框比图像或检测级注释要昂贵得多。您将希望您的预测框尽可能紧凑,以便注释者可以浏览它们,决定保留哪些,丢弃哪些,而不必花费时间实际更改这些框。

质量保证

我们的实验表明 YOLOv4 是一个全面的模型。它的边界框预测可能不像 EfficientDet 那样严密,在人群中可能不像 fast-RCNN 那样有效,但它在几乎所有情况下都是一个势均力敌的竞争对手。我们的第二个实验表明,当 YOLOv4 和 EfficientDet 的预测可信度较高时,它们通常是正确的。

例如,假设您正在构建一个对象检测数据集,并且需要对其进行迭代以确保您的注释是正确的并且没有遗漏任何对象。从我们的第二个实验中,我们现在知道 EfficientDet 或 YOLOv4 可以用来提供错误地未标记或错误标记的对象的建议。由于我们只对误报数量本身感兴趣,而不是检测的 IoU,YOLOv4 可能是一个更好的选择,因为它能够比 EfficientDet 运行得更快。

人群

从与我们上次实验相似的多个例子中,我们看到如果你希望检测成群的物体,那么fast-RCNN可能是你的选择。

例如,如果您试图找到一个对象检测模型来计算纽约市监控镜头中的人数,那么您不会关心这些框有多紧,甚至不会关心它们是否都是正确的,您只关心捕捉场景中的大多数人。

参考

[1] T. Lin 等,微软 COCO:情境中的公共对象 (2014),欧洲计算机视觉会议(ECCV)

[2]体素 51,五十一 (2020)

[3] A. Bochkovskiy 等人 YOLOv4:物体检测的最佳速度和精度 (2020)

[4] M. Tan 等人, EfficientDet:可扩展和高效的对象检测 (2020),计算机视觉和模式识别会议(CVPR)

[5] S. Ren 等人,更快的 R-CNN:使用区域提议网络实现实时对象检测 (2015),神经信息处理系统进展(NeurIPS)

[6] J. Hui,图(*均*均精度)用于物体检测 (2018),中等

[7] R. Tan,分解*均*均精度(mAP) (2019),迈向数据科学

[8] J .亨特, Matplotlib:一个 2D 图形环境 (2007),科学计算&工程,第 9 卷,第 3 期,第 90–95 页

[9] T. Ganter,我对谷歌的开放图像数据集进行了错误分析,现在我对数据科学产生了信任问题 (2020)

[10] A. Kuznetsova 等人,开放图像数据集 V4:统一图像分类、对象检测和大规模视觉关系检测 (2020),国际计算机视觉杂志(IJCV)

IpyLeaflet:Jupyter 笔记本中的交互式映射

原文:https://towardsdatascience.com/ipyleaflet-interactive-mapping-in-jupyter-notebook-994f19611e79?source=collection_archive---------12-----------------------

IpyLeaflet 交互式地理空间数据可视化初学者指南。

杰瑞米·托马斯Unsplash 上拍照

交互式地图是探索性数据分析(EDA)的重要组成部分。在本教程中,我们将向您介绍 IpyLeaflet Python 库,它可以在 Jupyter Notebook 中实现交互式地理空间数据可视化。IpyLeaflet 是 Jupyter 笔记本世界和流行的传单可视化库之间的桥梁。

我们首先介绍标记、图标和底图的基础知识,然后介绍如何集成 Geopandas 和 IpyLeaflet 来可视化不同类型的地图——Choropleth 和聚类点。在最后一节中,我们将学习如何使用 IpyLeaflet 交互式控制地图——搜索栏和全屏。

正确掌握基础知识

我们导入将在本教程中使用的 Ipyleaflet 方法。

from ipyleaflet import (Map, GeoData, basemaps, WidgetControl, GeoJSON,
 LayersControl, Icon, Marker,basemap_to_tiles, Choropleth,
 MarkerCluster, Heatmap,SearchControl, 
 FullScreenControl)from ipywidgets import Text, HTML
from branca.colormap import linear
import geopandas as gpd
import json

我们还使用 Geopandas 阅读了本教程的数据。第一个数据集是世界国家(多边形)。我们还有来自武装冲突地点&事件数据项目(ACLED) 的点数据集,记录了世界各地的所有冲突。请注意,我们只阅读了数据的一个子集,非洲的冲突。

# Countries
countries = gpd.read_file(gpd.datasets.get_path(‘naturalearth_lowres’))# Conflict Dataset Points
africa_acled = gpd.read_file(
 “data/acled2019.shp”,
 mask = countries[countries[“continent”] == “Africa”]
)
africa_acled.head()

基础地图

底图提供了现成的图块,可在绘制地理空间数据时提供背景。您需要指定地图的中心点以及缩放级别,以获得世界上任何地方的底图。

在这里,我们调用 IpyLeaflet 中的 Map 函数,并传递基图。上面的地图使用了 Esri 世界影像。IpyLeaflet 中有很多免费的底图可用。例如,如果我们想改变基本地图,我们可以简单地重建地图提供一个不同的基本地图。或者更方便的是,我们可以通过在上面的地图上添加来更新( add_layer() )。

stamen = basemap_to_tiles(basemaps.Stamen.Toner)
m.add_layer(stamen)

在上面的代码中,我们更改了基本地图。我们现在使用的是 Stamen Toner 底图,而不是 Esri 世界影像,如下图所示。

工作草图

标记

到目前为止,底图仅是有用的。您通常希望将数据放在底图之上。我们从最简单的例子开始。假设我们想在地图的中心添加一个点标记。我们可以在 IpyLeaflet 中使用 Marke() 方法。

marker = Marker(location=center, draggable=False)
m.add_layer(marker);m

现在我们的底图里有了一个标记。

带标记的底图

核标准情报中心

您可以通过提供自定义图像作为图标来自定义标记。我们从图标档案网站中抓取了一个图标,并在我们的地图中用作标记。

icon_url = “[http://icons.iconarchive.com/icons/pelfusion/long-shadow-media/512/Maps-Pin-Place-icon.png](http://icons.iconarchive.com/icons/pelfusion/long-shadow-media/512/Maps-Pin-Place-icon.png)"icon = Icon(icon_url=icon_url)
mark = Marker(location=[57.719503, 12.008843], icon=icon, rotation_angle=0, rotation_origin=’128px 128px’)
m.add_layer(mark);
m

图标

我们现在在地图上有了第二个标记,这次标记是我们提供的一个图标。我们开始在 Jupyter 笔记本上使用真实世界的数据和 IpyLeaflet 绘制交互式地图。

地理数据和地图样式

现在我们已经完成了基础工作,我们可以使用 Geopandas 显示我们之前读取的数据。我们首先绘制一张简单的交互式非洲国家地图。我们首先将多边形限制在非洲国家。为了创建包含数据的地图,IpyLeaflet 接受 Geojson 文件或 Geopandas 数据报。在这里,我们为非洲国家构建了一个地理数据。最后,我们将地理数据添加到地图中。

center = [4.546647, 22.373178]
zoom = 2africa = countries[countries[“continent”] == “Africa”]
africaMap = Map(basemap=basemaps.CartoDB.Positron, center=center, zoom=zoom)# Create a geodata
geodata = GeoData(geo_dataframe = africa, 
 style={‘color’: ‘black’, ‘fillColor’: ‘#E0D071’, ‘opacity’:0.03, ‘weight’:1.9, ‘dashArray’:’2', ‘fillOpacity’:0.6},
 hover_style={‘fillColor’: ‘#b08a3e’ , ‘fillOpacity’: 0.8},
 name = ‘Countries’)# Add the map to the data
africaMap.add_layer(geodata)
africaMap

这是一张非洲所有国家的基本交互式地图。我们将进一步发展这一点,以包括悬停和其他互动功能,但现在,这是我们的互动地图。

使用 IpyLeaflet 的基本交互式地图

让我们补充一些背景。当我们停留在一个国家上时,我们会添加国名、人口和 GDP 估计值。这里我们使用 IpyWidgets。

html = HTML(‘’’Hover Over Countries’’’)
html.layout.margin = ‘0px 20px 20px 20px’
control = WidgetControl(widget=html, position=’topright’)
africaMap.add_control(control)def update_html(feature, **kwargs):
     html.value = ‘’’
     <h3><b>{}</b></h3>
     <h4>GDP: {:.2e} people</h4> 
     <h4>Population: {}</h4>
      ‘’’.format(feature[‘properties’][‘name’],
        feature[‘properties’][‘gdp_md_est’],
        feature[‘properties’][‘pop_est’])geodata.on_hover(update_html)

现在,我们的交互式地图中有了悬停功能(见右上方的 GIF 图)。

具有悬停交互性的 IpyLeaflet 地图

等值区域图

使用 IpyLeaflet 创建 choropleth 地图需要将数据设置为 GeoJSON。尽管这是一个额外的步骤,而且我们需要将地理数据框架作为 Geojson 存储在本地。在设置 Choropleth 地图数据之前,让我们先这样做。

pop = dict(zip(africa[‘name’].tolist(), africa[‘pop_est’].tolist()))
africa[[“name”, “geometry”]].to_file(“data/africa.json”, driver=”GeoJSON”, encoding=’utf-8')
geojson_data = json.load(open(“data/africa.json”,’r’))for feature in geojson_data[‘features’]:
     properties = feature[‘properties’]
     feature.update(id=properties[‘name’])
     #print(feature[‘id’])

现在,我们可以使用上面创建的 Geojson 数据来设置 choropleth 地图数据(注意,在绘制 choropleth 地图之前,我们还没有对数据进行标准化,我们应该已经完成了)。

choroplethData = Choropleth(
     geo_data=geojson_data,
     choro_data=pop,
     colormap=linear.YlOrRd_04,
     style={‘fillOpacity’: 0.8, ‘dashArray’: ‘5, 5’}
)

等值区域图

聚类图

我们之前阅读的冲突数据集包含许多点,如果我们按原样绘制数据,我们最终会在地图上得到许多点。避免这种情况的一种常用方法是对点进行聚类,如果您想要得到所有的点,可以缩放到特定的位置。让我们看看如何使用 IpyLeaflet 创建一个集群地图。

clusterMap = Map(center=center, zoom=zoom)
clusterMap.add_layer(MarkerCluster(
 markers=[Marker(location=geolocation.coords[0][::-1]) for geolocation in africa_acled.sample(1000).geometry])
 )
clusterMap

带 IpyLeaflet 的聚类图

交互式控件

在最后一部分,我们将介绍两个控制功能——搜索栏和全屏缩放。

搜索栏和全屏缩放

假设我们想通过输入一个地点的名称来放大该地点,并获得全屏地图。我们将在上面的地图中添加此功能,以放大特定区域的冲突点。

search = SearchControl(position=”topleft”, 
 url=
’[https://nominatim.openstreetmap.org/search?format=json&q={s}'](https://nominatim.openstreetmap.org/search?format=json&q={s}'), 
 zoom=5,
 property_name=’display_name’,
 marker=marker
 )
clusterMap.add_control(search)control = FullScreenControl()
clusterMap.add_control(control)clusterMap

看看下面展示这两个功能的 GIF。

使用 IpyLeaflet 进行搜索栏和全屏缩放

结论

IpyLeaftlet 有大量的文档,你可以深入研究它的高级功能。在本教程中,我们已经介绍了使用 Jupyter 笔记本在 IpyLeaflet 中制作地图的一些基本功能。

要安装 IpyLeaflet,您可以使用 Conda 或 pip。

conda install -c conda-forge ipyleafletpip install ipyleaflet

如果您有 JupyterLab,您还需要安装 JupyterLab 扩展:

jupyter labextension install **@jupyter**-widgets/jupyterlab-manager jupyter-leaflet

本教程的代码可以在 Github 资源库中找到:

[## shakasom/IpyLeaflet-jupyter

通过在 GitHub 上创建一个帐户,为 shakasom/IpyLeaflet-jupyter 的开发做出贡献。

github.com](https://github.com/shakasom/IpyLeaflet-jupyter)

虹膜分类器烧瓶应用程序

原文:https://towardsdatascience.com/iris-classifier-flask-app-3b4fb1de29b4?source=collection_archive---------59-----------------------

构建一个简单的 ML 分类算法,并将其作为 Flask 应用程序运行。

嘿,伙计们,这是我第一个关于媒体的博客。这是一个 Iris 分类 ML 模型,变成了一个 flask 应用程序,用于在 Heroku 上托管。

来源——数据营

步骤 1—构建模型

在这里,我们建立了一个监督分类模型,您可以从可用的分类器模型列表中选择。这里我使用了一个 KNN 模型,并获得了 98.66%的准确率。

正如你在上面的代码中看到的,我们已经使用 joblib 保存了 ML 模型,这是转换成 API 所必需的。

步骤 2 —所需软件包列表

对于一个运行在除开发环境之外的任何环境中的模型,我们需要安装所有必需的包。我们需要创建一个包含所有必需包的 requirements.txt 文件。虽然 pip freeze 给出了所有已安装软件包的列表,但是最好在编码的时候安装软件包,这样你就可以只安装特定代码所需的软件包。

步骤 3 烧瓶应用程序创建

Flask 是一个用于在 python 中创建前端应用程序的 web 框架。我们用 Get 和 Post 方法创建了一个简单的应用程序。代码是不言自明的。我想和大家分享的一件事是,作为数据科学家/ Ml 工程师,主要精力应该放在模型构建上,而不是 UI 上。烧瓶应用程序的简单代码就足够了。

步骤— 4 个 HTML 页面

正如你在上面的代码中看到的,我们使用了 HTML 文件。index.html 文件将形成具有 4 个输入的基本模板。

上面代码创建了一个如下所示的 HTML 页面。

应用程序的 Html 页面。

步骤 5 文件结构和结果

最后,用于虹膜分类器的文件夹中的文件是这样的。

如果你想知道如何实现这种树结构,有一个包叫做树。使用“ sudo 安装树”安装软件包。在终端中输入指向 pwd 的树。

产量预测

就是这样。现在你也可以试试。确保你遵循了所有的步骤和最终结构,并且安装了 requirements.txt 中的所有文件

在下一篇博客中,我会写如何将这个应用程序上传到 Heroku,这样你就可以在世界任何地方访问它。

不敬数据和 AI!

原文:https://towardsdatascience.com/irreverent-data-and-ai-d0c03057627a?source=collection_archive---------29-----------------------

将数据科学降低一个档次的 10 篇厚脸皮文章

随着* 100 篇文章的发表,是时候进行另一次精选了!这里是我最不敬的 10 篇文章,包括一些我让我的 snark 跑得有点太自由的地方。尽情享受吧!

#1 人工智能是一种时尚吗

[## AI 是一种时尚吗?

人们认为人工智能只是昙花一现的三个原因

medium.com](https://medium.com/hackernoon/is-ai-a-fad-55ab24bf77b9)

#2 机器学习——皇帝穿衣服了吗?

[## 机器学习——皇帝穿衣服了吗?

深入了解机器学习的工作原理

medium.com](https://medium.com/hackernoon/machine-learning-is-the-emperor-wearing-clothes-59933d12a3cc)

#3 理解数据

[## 什么是数据?

关于信息、内存、分析和分布的思考

towardsdatascience.com](/what-is-data-8f94ae3a56b4)

#4 统计学家证明统计很无聊

[## 统计学家证明统计很无聊

统计学词汇的基础知识

towardsdatascience.com](/statistician-proves-that-statistics-are-boring-4fc22c95031b)

#5 不确定性是什么意思?

[## “不确定性”是什么意思?

风险、不确定性和模糊性之间的细微差别

towardsdatascience.com](/what-does-uncertainty-mean-cac374bb595e)

#6 TensorFlow 已死,TensorFlow 万岁!

[## 张量流死了,张量流万岁!

如果你是一个人工智能爱好者,你没有看到这个月的大新闻,你可能只是打了个盹…

hackernoon.com](https://hackernoon.com/tensorflow-is-dead-long-live-tensorflow-49d3e975cf04)

#7 人工智能的第一步可能会让你吃惊

[## 人工智能的第一步可能会让你吃惊

欢迎来到 AI!欢迎来到机器学习!不知道区别有关系吗?不,因为你会开始…

hackernoon.com](https://hackernoon.com/the-first-step-in-ai-might-surprise-you-cbd17a35708a)

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

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

在求职面试中问这三个问题,以确保你的雇主准备好让数据科学家变得高效

towardsdatascience.com](/the-sexiest-job-of-the-22nd-century-ffe753e1d155)

#9 数据科学是泡沫吗?

[## 数据科学是泡沫吗?

你会惊讶我经常被问到这个问题。我的回答?

hackernoon.com](https://hackernoon.com/is-data-science-a-bubble-c70ceac0f264)

#10 无能、授权和人口

[## 无能、授权和人口

预测你友好的统计学家的 5 大反对意见

hackernoon.com](https://hackernoon.com/incompetence-delegation-and-population-95ebeb9beb93)

【课程】和机器学习交朋友

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

点击此处获取整个课程播放列表:【bit.ly/machinefriend

与凯西·科兹尔科夫联系

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

A/B 测试是否被高估?从 A/B 测试到假设验证剧本

原文:https://towardsdatascience.com/is-a-b-testing-overrated-from-a-b-testing-to-hypothesis-validation-playbook-3c06a821b2de?source=collection_archive---------56-----------------------

假设验证不仅仅是 AB 测试。学习何时使用什么

越来越多的团队依靠 A/B 测试来验证和量化假设。追求数据驱动的文化是一件伟大的事情,除非团队开始做过头了。

事实是,A/B 测试被一些团队过度使用和滥用,成为常识和清晰思维的替代品。在谷歌上搜索“A/B 测试被高估了吗”显示了这个长期的问题。

在这篇文章中,首先,我们将简要说明为什么 AB 测试不是解决所有问题的灵丹妙药。随后,我们将看看其他假设验证方法,成长项目经理必须从这些方法中获得稳健和快速的决策。

为什么我们不能只依靠 AB 测试

  1. 低样本量:这不仅是初创企业的局限,更是大型组织的局限。对于一个没有达到难以捉摸的 10 万 MAU(月活跃用户)的初创公司来说,这是一个挑战。在一个大的组织中,从事低“覆盖率”产品特性的团队通常会处理这些限制。
  2. 短期关注和局部优化:我们不能运行 AB 测试很多年,所以我们不能发现一个特性的长期和真实的影响。我们需要其他的启发法来给我们信心,我们在一个月内看到的影响将长期存在。此外,有些功能需要培训,即使有巨大的长期潜力,也可能在短期内看不到效益。因此,AB 测试将我们引向局部最大值,当只有无脑 AB 测试指导产品开发时,我们可能永远不会走向全局最大值(我们的潜力)。
  3. 决策挑战和速度:统计上无关紧要的数字对企业来说并不是无关紧要的数字。交易量增加 1%可能并不显著,但它可能会给大公司带来数亿美元的收入。精心设计的实验有所帮助;但是,我们偶尔会面临这些挑战,不是 stat-SIG KPI,而是仍然具有重大影响的业务影响。此外,有时由于业务限制,我们需要迅速做出决定。例如,我们的功能可能是大产品推广的先驱;或者,这可能只是我们不想陷入假日代码冻结。

关于假设验证堆栈的一句话

通常,人们从三个方面来看待假设验证堆栈:

  1. 定性到定量:定性方法,如焦点小组、访谈和可用性实验室研究,产生了对“为什么”和“如何”的洞察。AB 测试——一种定量的方法——给我们提供了多少和多少的数字。
  2. 对行为的态度:通常,我们说的和做的是不一样的。像调查和采访这样的方法可以从用户那里获得“话语”。为了理解“行动”,我们需要依靠 AB 测试和前后分析等方法。
  3. 产品使用的背景。无论产品是在自然环境中使用还是在脚本环境中使用,都会显著影响用户的反应。

AB 测试是所有方法中最科学的。我们开始了解真正的偏好,而不是陈述的偏好。我们了解的是确凿的数据,而不是模糊的语言;此外,我们从用户的产品使用环境中获得硬性行为,而不是从脚本设置中获得。

有了这么多 AB 测试,就不难理解为什么没有经验的团队越来越依赖 AB 测试了。他们这样做是为了避免争论、责任和令人厌倦的批判性思考。他们很少意识到,通过默认选择 AB 测试,他们正在减慢组织的速度,并且他们仍然可能陷入决策泥潭

我们不会拔剑去杀一只苍蝇,同样,我们也不应该拿起 AB 测试来满足所有的想法验证需求。

被忽略的第四维

团队犯错是因为上面的三维框架有误导性。它确实谈到了定量、态度行为、自然脚本化的产品使用——但它忽略了至关重要的第四个维度。

第四个维度是我们的环境——公司规模、产品规模、产品成熟度、实验成熟度和业务需求。它被忽视了,因为产品管理和用户研究文献没有提到它。

具有讽刺意味的是,团队不考虑他们自己的上下文。他们忘记了自己,导致错误的选择。

高速且高质量的假设验证

对于一个拥有发达的技术堆栈、分析系统和项目管理的成熟组织来说,进行 AB 测试并不是一个错误,因为质量比速度更重要。此外,一个大型组织有资源来建立一个实验*台和一个系统来弥补一些速度损失。

对于较小的公司,重点是增长。你不能用剑来缝你的裤子,所以不要依赖 A/b 测试。你需要多和用户交流;产品意识、竞争对手产品拆解和批判性思维是你的工具,而不是 A/B 测试。

A/B 测试用速度换取精度。有了 A/B 测试,我们对我们的数字更有信心,但它会减慢我们的速度。创业公司应该优先考虑速度而不是精度,不应该为了获得 stat-sig 而运行几个月的 AB 测试。然而,随着公司的成长,每 1%的变化都很重要,因此假设验证的最佳实践也必须改变。

按公司规模划分的 A/B 测试最佳实践:

  1. 小公司:不要 AB 考。和用户对话。成功产品的产品拆卸。
  2. 中型:对于预计会影响指标的更改,进行 A/B 测试。测试一切并不是一个明智的想法。
  3. 大型:A/B 在最终推出之前几乎测试了所有东西。对于新产品开发,在某些情况下,表现得像一个小公司是一个好主意。然而,在推广之前,A/B 测试是一个很好的实践,因为:A .意外地丢失 1%的指标是一件大事 B .复杂的技术解决方案和未知的依赖性是大型组织的副作用。保守以最小化执行风险是一件好事。

这是按公司规模排列的假设验证堆栈,记住第四维。

在我们结束这一部分之前,我们必须认识到想法验证是一个关于决策的练习。商业大师拉姆·查兰从亚马逊的做事方式中挖掘了智慧的金块。根据 Charan 的说法,贝佐斯说有两种决策,第一种和第二种。

第一类决定是必然的,不可逆转的。一旦做了决定,门就在你身后关上了,没有回头路可走。第二类决策是可变的和可逆的;它们是双向门。次优选择可能是正确的。

按照类型 1 和类型 2 来划分想法是很重要的。对于类型 1,确保团队正在进行尽职调查,收集定性和定量数据,并测试“产品的自然使用”。但是对于类型 2 特性,教条地尝试多种验证方法会导致分析瘫痪。

结束语

  1. 了解你自己:了解你的业务需求和限制。选择一种对组织和手头的问题最合适的方法。产品管理大师们不知道我们的语境,所以不要照字面理解。
  2. 采用多模型方法:尝试用多个模型来验证想法。与客户交谈,进行 AB 测试并进行调查,如果结果一致,那么该功能对用户来说很有可能是好的,即使指标并不重要。做狐狸,不做刺猬
  3. 第一类和第二类决策:对于重要的和不可逆转的决策,保持怀疑和彻底的尽职调查。但是对于第二类,可逆的决定,不要陷入分析瘫痪或追求超科学的准确性

感谢 Ricky Q 阅读草案,并提供宝贵的反馈。

参考资料和进一步阅读:

想法验证远不止 AB 测试

何时使用哪种用户体验研究方法

求求你,不要 AB 考那个

数据科学硕士值得吗?

原文:https://towardsdatascience.com/is-a-masters-in-data-science-worth-it-15b07ab655f3?source=collection_archive---------13-----------------------

对数据科学毕业生的偏见。

Photo by 戸山 神奈 on Unsplash

更新:嘿!感谢您花时间阅读这篇文章——但在您阅读之前,我制作了一个关于同一主题的视频,可以在这里找到,您可能会觉得有用。

我相信那些问了同样问题的人已经意识到了就业市场的现状。公司正在生成和收集比以往更多的数据。他们需要具备必要技能的人从数据中获得可操作的见解,以创造更多利润。

这一趋势促使各地大学推出了一系列新的硕士项目来满足这一需求。许多未来的学生都在问我几年前问过的同样的问题:

成为数据科学家需要硕士学位吗?值得花费时间和金钱吗?

我收到了许多潜在学生的来信,询问类似的问题。我简短而有偏见的回答是,是的,它值得花时间和金钱。它对我的事业也有很大的帮助。然而实际上,这真的取决于个人

我自己的经历

我于 2016 年毕业,获得数学学位,没有任何数据科学知识。所以和大多数毕业生一样,我通过一家毕业生招聘机构申请了分析师的工作。

当我还是一名分析师时,我意识到数学学位教不了你很多东西,无论是技术上还是社会上。

一开始,我努力做一些基本的事情,比如查询 SQL 数据库。很难创建简单的数据可视化,然后将结果传达给利益相关者。

随着我越来越适应做分析师,我开始学习数据科学和机器学习。正是在那段时间里,我意识到我缺乏编程方面的技能和经验。对于 Python 来说尤其如此,它可以说是目前最流行的数据科学语言。

我想学习更多关于数据科学的计算机科学方面的知识,但对我来说,在做全职工作的同时保持纪律性真的很难。我决定我有三个选择:

  • 辞职,休息一段时间,然后开始数据科学硕士;
  • 一边做分析师一边继续学习,然后尝试申请另一家公司的数据科学家角色;或者
  • 在做分析师的同时继续学习,并希望晋升为数据科学家。

最后两个选择对我来说不现实。我既缺乏经验,也缺乏技能,而且很难找到坚持自学的方法。另外,也不能保证该公司将来会提供这样的职位。

作为一名分析师,我可能还能获得所需的相关经验。我也可以通过兼职做项目来发展我的技能。这种方法的问题是缺乏严密性和结构性。这是我在短时间内完成任何有意义的事情所需要的。

因此,对我来说,最有意义的是存些钱,选择第一个。花一年时间去学习我热爱的东西。我决定,我宁愿辞职,也不愿做几年分析师,只抱着的希望在以后过渡到数据科学家的角色。

毕业后成为一名数据科学家

在英国发生封锁前几个月,我从硕士毕业。在最初的几个月里,我在找工作方面几乎没有成功,而封锁让情况变得更糟。

我决定后退一步,重新评估我必须提供的能让我脱颖而出的技能和项目。尽管缺乏工作经验,但数据科学硕士学位一直是我简历的良好起点。

尽管我的工作经验不多,但拿到硕士学位后,我觉得自己更有资格。通过最初的工作要求显然更容易,因为我从中学到了一些东西。它给了我很多可以谈论的项目,并为我自己的项目提供了一个更强大的基础。在我开始攻读硕士学位之前,处理这些项目要困难得多。

例如,在禁闭期间,我参与了一个计算机视觉项目,以提高我的数据处理和机器学习知识。当时,很难鼓起信心开始并完成这个项目。

我认为对我影响最大的是那种信心。硕士学位的结构迫使我在很短的时间内学到很多东西。

通过建立我以前缺乏的基础,我可以更快地成为一名数据科学家。

八月,我终于找到了一份数据科学家的工作。如果没有硕士学位获得的经验和资格,我很难得到这个职位。由于我建立的投资组合、改进的数据科学技能以及对公司寻找数据科学家的理解,我的求职在夏天变得更加容易。

裁决

尽管如此,我仍然不认为有人需要数据科学硕士学位。互联网最大的好处是几乎所有的东西都可以在网上找到。如果你有动力和纪律去学习并独立完成有意义的项目,你可以建立一个同样质量的投资组合。你也会节省很多钱。

此外,如果你已经工作了,那么重返校园并不容易。从财务稳定到没有收入可能是一个艰难的转变。如果你已经在一个高级职位上从事面向数据的工作,经验本身可能更有价值。你可以在工作之外做一些项目来弥补你认为自己缺乏的技能。

但它确实有可能让你的职业生涯快速晋升为数据科学家。如果你处于像我一样的情况,我仍然认为这是深入了解数据科学的最佳方式之一。如果你愿意牺牲时间和金钱,并且真正热爱数据科学,你不会后悔开始攻读这个学位。

不过,需要记住的一件重要事情是,并非所有数据科学大师都生来*等。如今硕士学位并不便宜,所以对每门课程所提供的内容进行研究是很重要的。然后,您可以决定模块(尤其是项目)的选择在将来是否真的对您有用。

那些拥有大量数据工作经验的人可能会在这方面做得更好。然而,我见过许多学生回避较难的模块,然后事后后悔。在某些情况下,他们可能最终需要在工作中再次学习(例如机器学习)。

对一年中所花的时间要明智,我相信这一投资是值得的。

直线是直线吗?

原文:https://towardsdatascience.com/is-a-straight-line-linear-f9f491514e97?source=collection_archive---------33-----------------------

书本上的线性是什么

照片由奎诺·阿尔Unsplash 上拍摄

这个简单的问题“直线是线性的吗?”浮现在我脑海里,无法自拔。好像是显而易见的,所以应该有显而易见的答案。然而,当我深入研究并试图为这个简单的答案寻找证据时,我意识到它比我想象的更复杂,也更有趣!

线性非线性是数据科学和数学中常用的术语。我们试图找出一个问题是否可以用线性或非线性模型来解决,或者我们的数据是否是线性可分的。如果我们广泛使用这些术语,很好地理解它们是很重要的,不是吗?那么,根据书本,某物是线性的,这意味着什么呢?

很简单…画出来!

让我们思考并试着想象 线性 。你想到了什么?对我来说,这是一条简单的直线。这种线由以下公式描述:

线性(?)函数公式(图片由作者提供)。

而且的确它被称为一个 线性函数【1】。在这个公式中,我们有一个变量 x ,以及两个参数 ab 。我们假设 a = 1b = -2 ,并标绘出来:

线性函数 f(x) = x -2(图片由作者提供)。

在图中我们可以看到直线经过点 A (0,2)f(0) = 2 和点 B (-2,0) ,因为 f(-2) = 0 。我们通常就是这么想象线性的。

我们也倾向于根据 比例【2】来考虑线性度。这意味着输入与输出成正比。这种直觉思维对我们来说是自然的,但是,我们需要记住,从形式上来说,比例是一个独立的、更广泛的术语。

根据定义,两个变量或量的比例是当这些量的比率或乘积是常数时出现的关系。有变量 xy ,如果:

比例系数(图片作者提供)。

其中 k 为常数。在这种情况下,如果 x 增加, y 也增加。同样的道理,当我们减少变量时,它是成比例的。

变量是 反比 如果它们的乘积是常数:

反比系数(图片由作者提供)。

为了检验它是否符合我们的直觉,我们可以这样转换这个公式:

转换后的反比公式(图片由作者提供)。

假设 k 大于 0 ,且 y 不等于 0 ,在增加 y 的同时, x 在减少。所以一切 ok,是成反比的。

循规蹈矩

记住我们对线性的直觉想法,让我们用正式的定义来面对它。

要调用给定的关系,或者一个函数,线性它应该满足两个性质(也称为)【3】😗*

  1. 添加
  2. 同种

可加性 由以下公式描述:

加法公式(图片由作者提供)。

这意味着输入总和的函数结果应该等于每个输入的函数结果总和。

所以我们来检查一下之前画的函数是否满足可加性。快速提醒你一下,我们的函数有参数 a = 1b = -2,它的公式是这样的:

示例函数(图片由作者提供)。

为了检查可加性,我们假设 x = 2y = 3 。现在我们需要计算加法公式左边和右边的函数值,并检查它们是否相等。让我们从左侧开始:

加法公式的左侧(图片由作者提供)。

现在让我们计算公式的右边:

加法公式的右侧(图片由作者提供)。

哎呀,3 不等于 1,说明我们的线性函数不满足可加性,可加性是线性的一个必备性质。所以它不是真正的线性…

也许至少是 同质【3】?但首先,函数齐次是什么意思?假设我们将输入 x 乘以因子 d 并计算函数 f(dx) 的输出。那么我们来计算这样的表达式 df(x) 的值。根据同质性,两个结果应该相等。这个简单的公式很好地表达了这一点:

同质公式(图片由作者提供)。

现在,我们将做与可加性相同的实验,并检查我们的样本函数是否满足同质性。让我们假设 d = 4x = 2 并计算公式的左边:

同质性公式左侧(图片由作者提供)。

然后让我们计算右边:

同质性公式的右侧(图片由作者提供)。

嗯,6 肯定不等于 0,我们的函数再次不满足线性要求,这一次是在齐次性方面。

哪个线性函数满足叠加?

如果我们的简单线性函数不满足任何一个线性要求,哪个函数满足?实际上,它是一个更简单的线性函数,参数为 b = 0 :

参数 b = 0 的线性函数(图片由作者提供)。

有什么特点,用这样的公式描述的函数经过坐标系的原点(在 2 D 系统中是 (0,0))【4】。

穿过原点的线性函数(图片由作者提供)。

我们来看看它是否真的满足线性的要求。我们假设 a=2 ,那么我们的函数就用 f(x) = 2x 来描述。

我们先讨论可加性。计算可加性公式的左边为 x = 2,y = 3 ,我们得到:

加法公式的左侧(图片由作者提供)。

对于公式的右侧,我们有:

加法公式的右侧(图片由作者提供)。

到目前为止一切顺利!10 等于 10,所以我们的函数是可加的,太棒了。那么让我们检查同质性。

假设 d = 2x = 4 ,我们可以计算出左边的齐次公式:

同质性公式左侧(图片由作者提供)。

好了,是 16,让我们检查一下公式的右边:

同质性公式的右侧(图片由作者提供)。

是啊!我们的函数是齐次的。它满足两个线性要求,因此我们可以说它是“真正的”线性。

那么这条直线是线性的,还是非线性的?

答案是:看情况。如您所见,并非所有的线性函数都符合严格的线性要求。当然,使用线性函数这个术语并不意味着我们所有人都犯了一个巨大的错误。我们只需要小心在什么样的环境下使用它。

数学是一个非常复杂的领域,包含许多不同的分支。我们日常使用的线性函数这个术语,从微积分的角度来说是完全正确的。在这种情况下,每条直线都是线性函数。

然而,就线性代数而言,只有线性函数的子集是真正线性的(这些函数具有 b = 0 )。这是一个更广泛的背景,我们根据线性映射和线性系统(使用线性算子的模型)来思考。在这种背景下,严格要求,直线不一定是线性的。

回答最初的问题,我们不仅了解了线性,还了解了提出非常明显的问题的价值。它们帮助我们清晰地理解我们认为已经完全理解的概念。

参考书目:

  1. https://en.wikipedia.org/wiki/Linear_function
  2. https://en . Wikipedia . org/wiki/proportional _(数学)
  3. https://en.wikipedia.org/wiki/Superposition_principle
  4. https://mathinsight.org/linear_function_one_variable

这是拖网渔船在捕鱼吗?全球渔业观察数据集的监督分类

原文:https://towardsdatascience.com/is-a-trawler-fishing-modelling-the-global-fishing-watch-dataset-d1ffb3e7624a?source=collection_archive---------55-----------------------

照片由 Unsplash 上的Egle sidaravicuite拍摄

Metis 数据科学训练营现在已经过了中点,我还有一个项目。这是继我的对纽约 MTA 地铁数据集的探索性数据分析之后的第三个,随后是使用线性回归根据搜集的数据对 MyAnimeList 上的动漫用户分数建模

第三个项目的目的是什么?简单地说,根据全球渔业观察(GFW)数据集提供的特征,使用监督分类来确定特定渔船是否在捕鱼。

TL;博士:

  • 从 GFW 数据集中的约 160,000 个条目中检索并设计了 8 个特征,主要针对拖网渔船
  • 重复的容器 ID意味着我必须为将来的工作留下时间序列数据
  • 随机森林优于逻辑回归、高斯朴素贝叶斯和 K *邻,并且在测试数据集和样本外拖网渔船数据上表现非常好
  • 接下来的步骤是解开类似的容器 ID;将模型扩展到包含不同的齿轮类型;应用模型到确定不同的齿轮类型以及一艘船是否是渔船;和调查更多复杂模型

一.背景

根据联合国粮食及农业组织的数据,截至 2015 年,大约三分之一的全球渔场被过度捕捞。它继续解释为什么这是一件如此糟糕的事情:

过度捕捞不仅减少了粮食产量,还损害了生态系统的功能,减少了生物多样性,对经济和社会产生了负面影响。

为了跟踪过度捕捞,首先需要跟踪任何时候有哪些船只在捕鱼。这就是 GFW 的数据发挥作用的地方。

二。检索数据

GFW 的目标是“通过增加透明度来促进海洋的可持续性和管理”这种透明度的一部分包括公开相关数据,因此我能够下载带有各种类型渔具的渔船的 csv 文件。[ 1

[1]自 2020 年 5 月 20 日起,GFW 网站上不再提供 csv 文件;相反,他们的 GitHub 有一组 csv 和 numpy 文件,以几种不同的方式呈现数据。任何进一步的调查都可能会利用这些数据。

从 GFW 网站下载的 csv 文件列表,以及记录数量

从上表可以看出,有一个 lot 的记录!为了这次调查的目的,我选择将重点放在拖网渔船上,因为它们是第二大渔具类型,我的系统上仍然可以管理 440 万行数据。

GFW csv 文件具有以下功能:

GFW csv 文件中的功能列表

我删除了更多行,如下所示:

答)是 _ 钓鱼

我们的目标变量由 GFW 聘请的分析师生成,以确定船只是否在捕鱼。因此,介于 1 和 0 之间的值表示至少有一位分析师不同意其他分析师的结论。此外,三分之二以上的数据没有 is_fishing 的数据。

出于训练和测试的目的,我因此删除了捕鱼不是 1(意味着船只正在捕鱼)或 0(意味着船只没有捕鱼)的所有行。这给我留下了大约 160,000 行数据,这更易于管理。

b)缺失数据

只有 2 行数据缺失(速度和航向),因此在本次调查中被删除。

即使有 160,000 行而不是百万行,将所有内容加载到 Pandas 也会降低速度,有时还会导致内存错误。我求助于将我的数据加载到 PostgreSQL 数据库中来缓解这些内存问题,也是为了将来的可扩展性。

我还根据记录的 MMSI 将数据分为训练和测试数据集(80/20 分割)。我需要避免使用同一艘船的数据来预测其后续行为的情况。

三。准备数据

a)时间序列转换-等等,为什么会有重复的 MMSI!?

每艘船的 MMSI(海上移动服务身份)应该是唯一的。因此,每个 MMSI 和时间戳对都应该是唯一的,这似乎是合理的,因此我可以使用一些历史数据来导出其他特征,例如经度、纬度、速度和路线的先前值或移动*均值,以及花费的时间和行驶的距离。

然而,当我试图用我的数据集验证这一点时,我发现了 MMSI 和时间戳的重复配对:

等等,什么???

在 bokeh 绘制第一个 MMSI 的路径产生了以下结果:

2013 年 7 月 9 日第一次 MMSI 采取的假定路线。注意西非中部的无意义坐标。

事实证明,复制 MMSI 症实际上是一个常见的问题。GFW 是这样说的:

每个操作员都必须手动将他们的 AIS 信息(包含他们的 MMSI)输入到他们的应答器中,这给有意或无意的错误留下了很大的空间。我们已经看到了毫无意义的任意代码,以及太不完整而无法提供关于船只身份的有用信息的代码。…这意味着在整个海洋中,多艘船只同时广播同一个 MMSI 号码,如果不仔细检查,很难区分它们。

虚线表示一个特殊的 MMSI 的明显的来回传送。看看这一团糟!来源:全球渔业观察船景

为了理清数据并确定哪些记录与哪个独特的血管相关联,我需要采用无监督学习,这超出了我目前研究的范围。因此,我决定不进行时序转换。至于带有无意义坐标的数据,我让它们是为了这次调查的目的。

b)离海岸距离和离港口距离之间的高相关性

距离海岸距离港口都是 GFW 生成的特征;前者来自从太*洋岛屿海洋观测系统到最*海岸线的距离得出的数据:0.01 度网格:海洋数据集,后者来自 GFW 的锚泊数据集

在我最初的分析中,我发现这两个特征高度相关:

距离港口与距离海岸的散点图

甚至两个特征之间的差异(shore_vs_port)也与距离 _from_port 高度相关

因此,我从后续分析中删除了距离海岸的距离。

c)从时间戳生成特征

简而言之,我从每个时间戳中导出月、工作日和小时,其想法是可能存在一些可以被后续模型利用的模式。快速分析得出以下结果(y 轴是 is_fishing 目标的*均值):

工作日似乎没有一个明确的模式…

…但在 4 月至 7 月似乎有明显的峰值,在 11 月至 12 月有所下降…

…上午 10 点至下午 3 点之间的时间明显增加。

为了限制特性的数量,我将字段保持为数字;然而,未来的工作可能需要将这些特征转换成分组的类别(例如,几个小时的早晨、白天和晚上)。

我总结了以下 8 个特点:

  • 离港口的距离
  • 拉脱维亚的货币单位
  • 速度
  • 课程
  • 工作日
  • 小时

我通过 scikit-learn 的默认随机森林分类器和相关矩阵运行这些特征,发现速度距离港口似乎是预测拖网渔船是否正在捕鱼的两个最重要的特征,如下所示:

默认随机森林分类器中的要素重要性

相关矩阵

四:拟合和选择模型

出于本项目的目的,我考虑了 scikit-learn 的以下分类模型:

  • 物流回归
  • k 最*邻
  • 高斯朴素贝叶斯
  • 随机森林

这四个模型在训练数据集上用 5 重交叉验证进行训练;我还使用网格搜索和随机搜索执行了超参数调优(当有太多参数需要调优时使用后者)。

有一些额外的限制如下:

  • 物流回归和高斯朴素贝叶斯:我用了 scikit-learn 的 StandardScaler 来归一化数据;否则,特征之间的价值差异将是压倒性的(例如,距离港口的距离可能达到数万,而这些速度最多只能达到数百)。
  • K 最*邻:我不得不抽取 20%的训练数据,否则要花很长时间才能得出估计值。
  • 随机森林:我不得不限制一些调整过的超参数,即最大深度和最小样本分裂,否则算法容易过拟合。

然后我用 f1 评分和 AUC 评估结果。随机森林以 0.90 的 f1 分数和 0.98AUC 名列榜首,如下图所示:

训练数据的 AUC

五:意见

在测试数据集上应用随机森林,我发现 f1 分数和 AUC 完全相同。

测试数据的 AUC

测试数据的混淆矩阵进一步表明,随机森林确实表现得非常好,具有高水*的精确度和召回率:

我扔在一起的一个快速而肮脏的 Flask 应用程序也显示了我选择的模型的高性能,即使面对样本外数据(即我在训练和测试数据集外忽略的没有共识的行)。我在下面链接了一个视频,因为该应用程序所依赖的 SQL 数据库有点太大,无法放到网上;我将在这个项目的未来迭代中寻求补救。

不及物动词进一步的工作和学习要点

尽管我当前的模型性能很高,但仍有几个方面需要改进,如下所示:

  • 解开共享相同 MMSI 的船只以便于时间序列分析,例如通过使用聚类算法。
  • 使用除拖网渔船以外的渔具类型以及未知渔具类型处理 GFW 更大的数据集。
  • 将数值数据转换为分类数据,分组或其他。这样做很可能会提高物流回归和朴素贝叶斯模型的性能。除了本文前面提到的与时间相关的类别之外,纬度和经度也可以组合成地球上离散的区域单位。事实上,这是 GFW 用来构建其锚定数据集的方法。
  • 应用附加模型确定船只使用的渔具类型,或船只是否为渔船。

对我来说,这是另一次紧张的学习经历,尤其是当它涉及到可视化和处理地理空间数据以及处理 Pandas 和 SQL 中的大规模数据集时。我敢肯定,下一个项目将会同样有趣和紧张。

AI 是医学的机会吗?

原文:https://towardsdatascience.com/is-ai-a-chance-for-medicine-e07be6aa53ff?source=collection_archive---------43-----------------------

还是噩梦?这取决于医生。

TLDR

自 1958 年著名的达特茅斯会议以来,人工智能(AI)一词导致了感兴趣和不感兴趣的周期性周期,直到 20 世纪 80 年代。然后,数学进步、有效的摩尔定律以及不断增长的数字数据生成和使用,使得非常精确的人工智能模型得以出现,这些模型很有可能对医学和医疗保健产生指数级影响。

然而,似乎没有人在真实的临床世界中真正实现这些模型,以至于像医生一样使用人工智能是很常见的。事实上,成功的实施首先要通过对医生进行文化适应和去神秘化的教学程序。没有人-如果不是媒体-告诉他们人工智能的机会。他们觉得没有必要实施,而应该实施。但是盲目的信任也是不可取的:算法有弱点,在开明的使用中必须知道并牢记在心。

人工智能是一个真正的机会,可以腾出医疗时间,以重建与患者的关系。但这不会发生,除非我们解决医生适应机器学习的挑战。

AI 会取代医生吗?我不太确定。国立癌症研究所Unsplash 上拍摄的照片。

一切都是从他开始的。

艾伦·图灵,50 英镑面值的英国钞票的象征,于 1912 年 6 月 23 日出生于伦敦。经过多年对数学和密码学的研究,他在第二次世界大战期间以一种特殊的方式做出了贡献:由于他出色的算法技能,他在解密 Enigma(德国军队用来加密通信的机器)中发挥了重要作用。战后,他致力于一个非常特别的想法:建造一个人造大脑。那是计算机的开端。

因此,他参与了对人类智能进行数学建模以创造人工智能的可能性的新辩论。为了测试模型,他提出了著名的图灵测试。出版于 1950 年(2),它包括让一个人与计算机或另一个人进行盲目的讨论。如果它不能区分计算机和人类,计算机就通过了测试。在这篇文章发表* 70 年后的今天,计算机在这项测试中表现非常好,这项测试现在被认为是相对基础的。事实上,他们能够在大多数棋盘游戏中击败人类(3),以无与伦比的准确性描述图像(4),创作令人钦佩的艺术作品([见此处](/gangogh–creating–art–with–gans–8d087d8f74a1, 2017.)),等等。虽然和 AI 本来的意思差了很多,但这是他们的叫法。

但是这个术语是什么意思呢?很少有人能准确说出。定义不明确,最重要的是,远远没有达成共识。维基百科将人工智能定义为“机器展示的智能,与人类和动物展示的自然智能形成对比”。这也许是最接*一般观点的定义。这一定义的原因是非常历史性的。事实上,在图灵和达特茅斯会议的时代,目标是模拟和复制人类智能。然而,今天以 AI 的名义开发的工具却大不相同。他们几乎完全依赖机器学习技术。

机器学习是统计学的一个特殊分支。以一种(非常)简化的方式,ML 集合了允许创建一个数学函数来模拟某个行为的方法。回归、随机森林、提升梯度、神经网络等等,都是机器学习的一部分。

深度学习(DL)也是机器学习的组成部分之一——尽管它是一个多次辩论的主题。需要注意的是,深度学习是基于更复杂的神经网络,离基本的统计学习还很远。这伴随着对数据的更大需求和对计算能力的增加的需求(7)。

因此,我们听到/看到/读到的“人工智能”主要(但不完全)仍然是机器学习,这是一种产生具有多种用途的算法的数学方法:预测模型(如何完成时间序列)和识别工具(如何分割图像)是两个很好的例子。该算法从输入和输出数据中找到相关性。这些相关性允许算法找到与新输入相关的输出。直到今天,所提出的算法在给定的任务中是相对专门的。一般来说,算法越是特定于任务,它们的性能就越好(3)。因此,在这个模糊和不具体的术语背后,只隐藏着计算机工具,这些工具对一个给定的问题提供一个有误差区间的答案。在医学中,最终与成像工具或听诊器相关的技术工具。

然而,人工智能引起的反应比现代听诊器大得多。书籍、推文、纪录片、文章等。,从极端的铺张浪费到对大众不太有用的技术理性。不信任,恐惧,有时拒绝,或者,在另一个极端,坦率的乐观或不合理的信任。*年来,夸张的反应层出不穷。流行文化,往往非常误导,在这里扮演着不可低估的角色。无论是通过电影(终结者,黑客帝国等。)或者书籍(生活 3.0,龟壳里的幽灵等。),人工智能要么不是真的吸引人,要么就是太过了。描绘了一台希望终结(或者,充其量,奴役)人类的机器,他们强调了对人工智能资产的非常不讨好的观点。媒体,往往有偏见和/或消息不灵通,也不会更好。这已经成为人类生存的问题。如果不是,这就是一个普遍失业的问题,因为这些机器人会取代我们的工作。

这些陈述真的没有帮助。图片来自 Pixabay 的 024–657–834。

在某种程度上与工业化的连续阶段相分离的医学领域,将被这些技术彻底改变。这场革命,如果没有正确的解释和伴随,就有被误解甚至拒绝的危险。因此,有必要对这个问题感兴趣:医疗保健界如何积极地利用机器学习工具?这是这次反思的目标。

但是到底什么是机器学习呢?

谈论一项技术而不解释它是很有可能的。然而,在机器学习的情况下,最好用几行文字来解释它的基本原理。

ML 是统计、优化和算法工具的集合。为了深入理解它们,有必要深入研究作为整体基础的数学理论:从矩阵计算到局部梯度和最小值的概念,包括主要的统计原理和不同的定律。但这不是重点,除非你想成为数据工程师或者数据科学家。

作为(未来的)健康专业人士,对这个术语是什么有个直觉就够了。直觉很简单:我们正处于一个因有果的境地。在每个 x (原因),我们观察到一个 y (结果)。从一个极其简化的角度来看,机器学习的整个艺术就是找到一个将这种联系建模的函数,如此精确,以至于如果用一个新的 x 来呈现它,这个模型可以提供一个连贯的 y 。就是这样!

我们注意到模型的构建至少包括两个阶段:一个训练阶段(我们在数据上训练一个算法,我们先前收集的 xy )和一个测试阶段(我们为算法提供一个 x ,我们期望一个正确的 y )。数据量的重要性很容易理解:向算法提供的训练数据越多,它将找到越多的链接,因此它将被更好地构建(8)。

因此,AI 或 ML 的含义是将一个 x 连接到一个 y 的函数。这个函数可能或多或少地复杂,或多或少地忠实反映现实。它可以对应于线性或逻辑回归——一个不太复杂的模型,几个世纪以来一直是手工操作的。它也可以基于更复杂的模型,如支持向量机(支持向量机)或随机森林

最复杂的模型,有时复杂到我们不知道如何确切地解释结果(因此有了“黑盒”这个不好听的术语),是神经网络,例如 CNN (卷积神经网络)(递归神经网络)或(生成对抗网络)。

但即使在计算能力或使用的模型之前,最具决定性的成功因素是数据。基本元素,为推理服务的基本砖块。一个恰当地收集和公正的数据,良好的结构和大量,是一个巨大的资产。问题是,很难有干净和公正的数据。此外,这是很难得到足够的。

事实上,一个从零开始在图像上训练的经典深度学习模型需要超过一百万个例子(一个例子是输入和输出, xy 在一起)。这是数百千兆字节的数据,很难在本地计算机上运行。

这就是为什么我们看到了云服务的出现。这些可在互联网上获得的*台,使得以可承受的价格使用大的计算能力成为可能。这些*台主要由网络巨头托管:谷歌(谷歌云)、亚马逊(亚马逊网络服务)、IBM ( IBM 云)、微软(Azure)……但这种使用也伴随着伦理问题(谁拥有数据?),信任(怎么用?)和主权(这些公司都是美国的)。

今天,所有这些创新都是由一个非常活跃的生态系统驱动的(9)。从未有过如此多的领域投资、发表论文或成立公司。然而,值得强调的是,这种生态系统可能会误导人,或者适得其反。事实上,许多论文被拒绝,因为缺乏统计和方法的严谨性。并非所有创立的企业都是相关的;他们中的大多数很快就用完了现金。所有这些公司都是投资的温床。它们是如此之大,以至于人们担心会发生金融危机。

AI 如何帮助医生?

在医学院,符号学很快就被纳入课程。临床检查是其中很大的一部分,还有听诊,今天依靠听诊器。这个强大的工具,大约在 1816 年由拉埃奈克博士创造,是临床实践的必备工具(10)。它使用了人类的一种能力——听觉——并为医生提供了一个了解心肺世界的机会。

在许多方面,人工智能并不比听诊器复杂。它的主要影响是促进任务,当然是智力,但重复,低附加值的病人护理。这些斑点可以分为三大类。

人工智能只是一个现代的、适应性强的、自主的、数字化的听诊器。Marcelo Leal 在 Unsplash 上拍摄的照片。

第一,分析功能。这是一个关于记忆的数据,这是一个非常标准化的任务。生物学、影像学、病理学是产生报告的医学行为,完整阅读这些报告需要一段时间,但这并不十分必要。

然后,进行诊断、远程监控和对处于危险中的患者的监控。大多数历史诊断方法都是基于统计的。比回归更先进的新模型可以提高灵敏度和特异性。如今,对患者的随访是有限的:电话、预约、电子邮件,都需要医生或管理人员的帮助——他们的帮助越来越少。算法不知疲倦。他们可以跟踪,交换,跟踪病人,编程后自动跟踪。与连接的对象集成,他们可以跟踪身体活动和睡眠周期,并实时控制心率、血压和氧饱和度等生命体征。所有这些数据都可以汇总并呈现给医生。实际上,这种装置已经被食品药品监督管理局(FDA)批准(11)。

最后,在成像和信号处理中的病理检测。深度学习包括各种类型的神经网络(CNN ),专门用于表征体积数据,如图像。这些神经网络,在 CT 扫描或 MRI 上训练和评估,有相当可敬的结果,有时甚至与放射科医生竞争(这是一个非常错误的评估方法)。在其他类型的成像中也是如此。此外,我们强调,这绝不是小事,他们接受的识别具体和精确案例的训练越多,他们就越好。信号处理也是如此。

无论是为了分析脑电图,检测睡眠呼吸暂停还是识别心律失常,算法都是非常有效和有趣的帮助。为什么?克服缺乏时间和专业知识的问题,或者仅仅是为一个复杂的案例带来新的观点。算法可以为需要它们的临床实践提供支持。

所有提到的任务都是医学上的。但我们不要忘记,行政时间也与医疗专业有关。这些任务会激发人们对自动化的强烈渴望。所有这些释放出来的时间都不会是自由时间。医患关系是医疗成功的一大挑战。长时间呆在病床边对修复这种对医疗实践至关重要的联系是一笔财富。因此,有必要仔细关注被释放时间的用途:所有这些都不是为了治疗更多的病人,而是一个更好地治疗他们的机会。

AI 将是医学的机会,只有医生和算法合作。

不可能有完美的算法,因为不可能在所有可以想象的环境中测试一个算法。根据这一观察,让算法和医生相互竞争似乎不合适,在科学上也不可接受。这不应该是这样的。

虽然算法在一般情况下的执行速度和精度方面非常有效,但医生在特殊情况下是无与伦比的,这些情况下,在高斯曲线的极端情况下,离开了规范。许多研究表明,在算法和医生的合作中,诊断的准确性是最好的。ML 仍然是一个工具。增强型听诊器。

然而,如果一个维护良好的听诊器总体上是可靠的,那么算法就不一定了。

一些弱点。

一个算法是它被训练的数据的反映。

当这些数据有偏差时,可能会给现实世界的实施带来问题。有着良好批判意识的人通常会认为训练数据不能完全反映真实生活。事实上,这种情况几乎从未出现过。根据定义,除非上下文状态不变,否则历史数据不能等于未来数据。除了时间偏见之外,地理和种族偏见也经常成为问题。选择偏见和社会经济偏见也可能存在。另一个问题是数据的方差。方差太大的算法将无法正常执行:结果将无法重现。

数据的质量和数量是两个基本要素。但是你还是要知道如何正确使用。构造算法的一个主要挑战是避免过拟合和欠拟合的问题。如果算法与数据匹配太多,这就是过拟合:算法用心学习数据。在训练期间,该算法将具有非常好的性能。然而,在现实生活中,它会产生非常糟糕的结果,因为它仍然过于忠实于训练数据。装配不足是相反的问题,并且在实践中导致相同的问题。这给我们带来了评估算法的挑战,这是一件非常复杂的事情(13)。为此,有许多方法,每种方法都有优点和缺点,但重要的是要记住,没有完美和整体的方法:算法永远不会完美。

那现在怎么办?

对人工智能的排斥会对医学产生短期、中期和长期的负面影响。

人工智能将在未来的病人护理中发挥重要作用,无论是在诊断阶段,治疗阶段,甚至是在管理过程中。对于医生来说,这是一个学习如何使用这种新工具为病人腾出更多时间的真正机会。但是适应这种新工具是一种强烈的无与伦比的需要。高中对算法的介绍还不够。在医学领域,揭开这些工具的神秘面纱是一个远未实现的目标。没有人告诉我们这是什么。没有人告诉我们如何使用它。

从我的角度来看,作为一名接受过数据科学培训的医学住院医师,文化适应的挑战至关重要:它的成功将取决于算法在真实临床世界中的实施。

此外,GAFA(美国数字巨头:谷歌、亚马逊、脸书和苹果)或 BATX(中国数字巨头:百度、阿里巴巴、腾讯和小米)的数据中心不应该是托管健康数据的唯一可能性。今天情况不再如此,我们必须鼓励这种情况。

医院、诊所和图书馆中的数据极其稀少,管理不善,缺乏维护,而且很大程度上没有得到充分利用。它的研究用途是无限的。不同参与者之间的互操作性是乐观者的梦想,悲观者的乌托邦。

我们不能隐瞒,每次技术革命的目标都是一样的:通过技术提高人的能力。在医学上,越早越好。

感谢

我们要感谢跨学科研究中心对我们的欢迎,以及它推动创新和批判性思考的生态系统。也要感谢组织会议带来了对这一问题的不同看法,包括与 Marie-Pauline Talabard、Simon Jégou、Cédric Villani、Henri Bourdeau、Bertrand Nordlinger 博士、Clément Goerhs 博士、Luc Julia、Romain Pommier、Stéphanie Allassonnière 和 Laurent Alexandre 博士的会议。

非常感谢 Cloé Brami 博士和 Olivier Bory 所做的一切。

当然,我没有任何利益冲突。

参考

  1. A.霍奇斯。艾伦图灵:谜。2012.
  2. 艾伦·m·图灵。计算机器和智能。头脑,49:433–460,1950 年。
  3. 托马斯·休伯特等人。一种通用的强化学习算法,可以掌握国际象棋、日本象棋和自我游戏。《科学》,第 1140-1144 页,2018。
  4. 穆罕默德·马吉德等人。使用卷积神经网络的医学图像分析:综述。医疗系统杂志,2018。
  5. 肯尼·琼斯。Gangogh:与 gans 一起创造艺术。走向数据科学
  6. 维基百科关于人工智能的页面
  7. 林永硕律师事务所。医学生应该对医学中的人工智能有哪些了解?J Educ 评估健康教授,2019 年 16:16–18。
  8. Ajibuwae & Al。垃圾邮件过滤的机器学习:综述、方法和开放研究问题。赫利永,2019 年 5 月。
  9. 霍尔登·佩奇。人工智能市场正在增长,但很难确定增长速度有多快。https://news . crunchbase . com/news/the-ai-market-is-growing-but-how-fast-is-tough-to-pin-down/,2019。
  10. 心脏听诊的前 200 年和未来展望。j 多碟健康 c,12:183–189,2019。
  11. 莱斯菲尔德马等人。使用 apple watch 监测心率的临床价值。Cardiol Rev .第 60–62 页,2019。
  12. 奎师那 KR & Al。医患关系之谜。印度精神病学杂志,(增刊 4):S776–S781,2019。
  13. 尼泊尔陆地卫星 8 号场景地表水提取的机器学习算法评估。传感器(巴塞尔),2019。

人工智能正在改变现代医学的面貌吗?

原文:https://towardsdatascience.com/is-ai-changing-the-face-of-modern-medicine-681774f9ddb8?source=collection_archive---------67-----------------------

医疗人工智能产品是否具备取代医疗保健专业人员和扰乱医疗保健行业的条件?

国家癌症研究所Unsplash 上拍摄的照片

在 2012 年和 2017 年之间,人工智能在医疗保健领域的投资通过股权交易筹集了 18 亿美元。这超过了人工智能在所有其他行业的投资!

几十年来,现代人工智能和医疗保健一直相互吸引。医疗保健行业正在寻找降低成本和提高效率的方法,以便为全球更大比例的人口提供高质量和可获得的医疗保健。

另一方面,人工智能研究人员正在寻找能够展示人工智能价值的定义良好的用例。还有比医疗保健更好的地方吗?在医疗保健中,决策可以拯救生命,而且(除了明显的复杂病例)在许多情况下,原因是已知的,也是明确的。

在本文中,我们将探讨人工智能在医疗保健领域的应用和局限性,以及它是否会在不远的将来改变该行业的面貌。

照片由国家癌症研究所Unsplash 上拍摄

医学成像

医学成像是医学中拥抱人工智能最快的领域之一。考虑到计算机视觉(研究计算机对图像的理解的计算机科学领域)是机器学习最知名和最成熟的领域之一,这并不奇怪。

发表在《柳叶刀数字健康》杂志上的对 82 项不同研究的系统综述发现,深度学习模型的图像诊断性能与医疗保健专业人员相当。

深度学习是机器学习的一个领域,它使用具有人工神经网络架构的模型,受生物系统神经结构的启发(考虑到这一点,将其应用于医疗用例多少令人满意)。这些模型通过向它们提供大量图像和标签来训练,因此计算机可以学习对某些疾病和状况进行分类。

根据它们的复杂程度,训练神经网络的成本可能会很高。这既与精确筛选数据所需的时间有关,也与训练期间所需的大量计算能力有关。

照片由乔纳森·博尔巴Unsplash 上拍摄

然而,像大多数机器学习应用一样,一旦经过训练,这些模型比人类模型更快、更便宜,这是人工智能采用的一个明显好处。

在上述系统评估后不久,英国政府承诺为 NHS 的人工智能研究投入 2 . 5 亿英镑。这只是为医学人工智能研究提供大量资金的一个例子。

那么为什么我们在医院里看不到这些模式是司空见惯的呢?

支持人工智能

事实上,在医学成像市场上有少数几个FDA 批准的人工智能解决方案。其中之一是 ContaCT,它分析 CT 血管造影照片,寻找即将到来的中风迹象。在一项研究中,当识别大脑中动脉大血管闭塞(大脑中动脉阻塞)时,其灵敏度超过 90%。

除此之外,它还将开始治疗的时间缩短了五倍!这在中风的治疗中尤其重要,因为中风的永久性损伤量会随着治疗时间的延长而增加。

卡米洛·希门尼斯Unsplash 上拍摄的照片

然而,FDA 将接触归类为

“一种计算机辅助分类软件,使用人工智能算法分析图像,寻找与中风相关的指标。人工智能算法是一种临床决策支持软件,可以帮助提供商为患者的疾病或状况确定最合适的治疗计划。”

注意“计算机辅助”、“支持”和“协助”这些词。人工智能在医学成像方面的接触和其他类似应用不是为独立工作而设计的。它们是用于支持医疗专业人员的工具,提高了诊断的速度和准确性。

对于接触,如果它检测到血管异常,它会向神经血管专家发送短信,然后开始治疗。在人类介入之前没有治疗。

伦理问题

很容易理解为什么一旦医疗干预开始,人工智能就被边缘化为配角。尽管虚拟人工智能应用在医疗成像等领域已经相当成熟,但对于物理应用来说却并非如此。

物理应用可能包括技术,例如在外科手术中使用自主机器人,以及为残疾人使用智能假肢。不仅对这些技术的研究不够成熟,而且它们有着更加直接和持久的后果。

照片由 Franck V.Unsplash 上拍摄

如果机器人在手术过程中出错,那可能是致命的,而用于诊断医学图像的人工智能模型会在采取任何行动之前将他们的发现传递给专家。

然而,即使是将人工智能用于诊断这一虚拟应用,也有些争议。我们将简要讨论三个主要问题。

首先是信任问题。人工智能模型是臭名昭著的“黑匣子”,它根据难以理解的复杂参数组合做出决策。对于神经网络来说尤其如此,在神经网络中,模型学习不同数学函数中使用的权重的复杂组合来提供分类。

尽管现在有许多用于解释神经网络的技术,但这些技术仍然难以理解,并且将使医生和患者难以信任它们来提供有效的诊断。

其次,是责任问题。当一个人工智能模型犯了一个错误并造成伤害时,通常不清楚谁应该负责。这个问题经常在自动驾驶汽车导致的致命事故中被问到,但这个问题同样适用于(如果不是更适用于)医疗保健。

应该是开发模型的程序员或数据科学家,还是使用模型的医疗专业人员?在明确谁对人工智能模型造成的诊断错误负责之前,如果没有大量的人类投入和监督,它们不太可能被依赖。

最后,人工智能会导致人类自满。如果从业者知道他们正在使用的诊断工具和他们一样有效,他们可能不会充分完成自己的诊断分析。这意味着医疗保健专业人员可以避免检查图像,因为他们知道人工智能模型会为他们做这件事。这样做的问题是,仅仅因为模型和人类*均表现相当,并不意味着他们会在个案的基础上。

正如模型可以识别人类遗漏的病例,人类也可以识别模型遗漏的病例。如果医疗保健专业人员变得自满,不正确地检查自己的图像,这些案件可能会被错过。

结论

很明显,人工智能在图像诊断方面的发展已经导致计算机在特定的诊断任务中与人类一样有效。

然而,提出的伦理问题意味着计算机不太可能在不久的将来取代人类。相反,他们将作为医疗专业人员的额外一层,努力提高诊断的精确度和效率。

照片由 Arseny TogulevUnsplash 上拍摄

在一个每个决定都可能是生死之交的行业,要改变这一点,不仅仅需要研究。人工智能在医院中的缓慢采用将建立患者的信任,对医疗保健专业人员的培训将帮助他们使用人工智能产品来改善患者的治疗。

我不指望自动机器人很快就能为你做手术,但通过适当的程序实施,我只能看到用人工智能丰富当前诊断过程的好处。

如果你喜欢这篇文章,你可能会喜欢我写的另一篇文章,“ 美术是人工智能的下一个前沿吗?

AI 的扩张有哪些伦理问题?

原文:https://towardsdatascience.com/is-ai-ethical-responsible-5ef539be9492?source=collection_archive---------40-----------------------

数据科学,人工智能,人工智能,观点

目前,人工智能没有能力处理抽象概念,如伦理,这意味着它不能对自己的任何行为负责

照片由 MaximalfocusUnsplash 上拍摄

在这篇文章中,你可以探索 AI 伦理:

  • 你对 AI 伦理有什么看法?
  • 人工智能使用的核心伦理问题是什么?
  • AI 有什么优势?AI 的生产是否符合伦理?
  • 谁在人工智能中规划道德和伦理?
  • 伦理是智力的产物吗?这种合作关系对人工智能的进步会产生什么后果?

人工智能(AI) 伦理道德与人类伦理道德并无不同。这么想吧,AI 抓不住感情也抓不住人生,至少现在是这样。然而,我们发现它有理解和决策的能力。

" AI 毁灭人类并不一定是邪恶的——如果 AI 有目标,而人类恰好挡道,它会理所当然地毁灭人类,想都不用想,没有任何恶意。"— 埃隆·马斯克

你对 AI 伦理有什么看法?

照片由照片爱好上传 Unsplash

下面是关于艾的 伦理的思考 :

  • 许多人声称,中国已经将人工智能作为一种跟踪个人的方法:他们的个性,他们的运动,他们的日常行为。人们被滥用匿名、民主和在社会中建立等级制度的专制政府所控制。从西方的角度来看,这似乎是一场极权主义的噩梦。人工智能被用来改善世界的专制政府,确保服从,并根除任何反对的观念。技术设计了一个无所不在的政府。
  • 中国对人工智能的整合提出了一个问题,即一项技术处于什么阶段,以及对我们文明的影响。我们必须接受一个我们比人类更数字化的世界的时刻到来了吗?是的,精神食粮。它正以前所未有的速度变化着。因此,我们可能会说,机器在图灵测试的任何维度上成功只是时间问题。中国在探索人工智能融入社会的深度极限方面迈出了第一步。政府利用监控对其人民施加权威,这一强有力的策略在其他国家遭到了反对。
  • 既然人工智能是一种工具和产品,它就必须遵守我们对商品的规则。也就是说,要健康,不要消极,不要种族歧视。在这些范围内的任何东西都是免费游戏。你可能认为有一个全新的道德问题需要解决,但事实上,这些问题已经被解决了。标准汽车需要一定程度的安全,AI 驾驶的汽车只需要同样程度的安全。我们是否被赋予了决定是否开车碾过棕色人种或米色人种的权利,这将是违宪的歧视?所以,首先,它们不应该被编程来做出某种选择。也有更现实的考虑集中在某些行动上,例如,转弯对任何人来说都更危险。

人工智能在拥有自由的良心之前没有道德。没有自由意志,人工智能就没有法律原则,比锤子好不了多少。

人工智能使用的核心伦理问题是什么?

刘玉英在 Unsplash 上的照片

人工智能使用的主要伦理问题:

  • 人类不可能像 AI 进化到可以控制和处理它那样,马上进化。
  • 众所周知,谷歌人工智能用只有程序才能理解的符号来编码语言,并表现出从其经验中以非常高的速度学习的倾向。
  • 当人工智能和机器人技术以有效的方式结合时,人工智能可以有效地主导劳动力市场,推动工人要么失业,要么进入限制人类选择的人工智能制造和管理职位。
  • 一些国家的人工智能进步将对发达国家的行业增长产生负面影响,特别是如果人工智能进步不再需要廉价劳动力的话。
  • 当被编程用于全球活动时,当在任务执行或自然灾害中面临障碍时,AI 无法管理道德决策。例如,如果人类的道德在 AI 中没有被正面编码,它会毫不犹豫地克服阻止它完成任务的东西,但 AI 还没有进步到那个程度。
  • 人工智能发展加速将在人类中引起恐惧,例如,当人类攻击特斯拉汽车时。
  • 人类将变得过于依赖人工智能,即使在应该谨慎的情况下也会放弃权力,例如,当许多人在驾驶特斯拉汽车时似乎在睡觉,即使他们真的不明智,正如他们的创造者所说。
  • 人工智能的发展将过早地抛弃现有的模型,因为如果以前的模型被出售给发达国家,劳动力市场将在所有地方被扰乱。
  • AI 在一些公司的先进性,相对于体力劳动市场竞争,是一种非常不*等的优势。
  • 人工智能可以访问所有输入的数据,例如 SIRI 和 Alexa 在未激活时会做出反应,随机发出笑声或嘲笑声。人工智能从人类数据中学习,并有可能整合人类的模式,并进一步应用它们。
  • 如果人工智能被集成到高级别的政治决策中,理论上它可能会提供反对派领导人的个性数据,并预测未来所有反对派的决定都是*乎准确的。有了大数据,一旦获得,性格分析甚至可能比预期的更详细。

AI 有什么优势?AI 的生产是否符合伦理?

摄影爱好在 Unsplash

以下是人工智能的好处:

  • 现代宇宙处于不断变化的状态,*年来呈指数级发展。扩展人工智能的能力从各个角度渗透到日常生活中;机器人助理渗透到家庭,而增强现实改变了零售业的消费者服务。技术是一座金矿,它给企业和工业带来了惊喜,吸引了众多领域的关注。
  • 难怪世界各地的政策制定者,看到人工智能的普及,已经开始致力于技术。那些掌权者用它来达到不同的目的,就像他们的政府试图做的那样。从降低犯罪率到展示政府力量,不一而足;人工智能采用的值得称赞的例子,当然,反之亦然。

你怎么能说人工智能是道德的:

  • 这在很大程度上取决于人工智能的使用方式。例如,在中国,最先进的技术将监控带入了一个全新的阶段。它揭示了人工智能令人不安的一面;一个我们期望在遥远的未来出现的时代,然而它却提前到来了。它揭示了一个令中国人不安的事实,即他们的一举一动都在很大程度上被跟踪。乔治·奥威尔 1984 年的格言“老大哥在看着你”是对的。
  • 美国各州也禁止面部识别,加州的大城市限制将技术用于特定目的。比如旧金山已经在全市 53 个部门禁止使用旧金山。
  • 丹麦政府制定了负责任地应用人工智能的基准。该政策的重点是,在该国的基础设施内建设人工智能将侧重于道德基础,远非中国的情况。这将确保对基本人权的保护,并确保公司和公共部门的公司遵守道德 AI 的限制。

谁在人工智能中规划道德和伦理?

摄影爱好在 Unsplash

负责任的人做这项工作,所以他们需要考虑什么是道德以及它如何工作。它被应用于损害控制数学。不幸的是,大多数涉及这一领域的专业人士对什么是道德一无所知,也没有一个地方可以让他们聚在一起理性地解决这个问题。然而,幸运的是,这些大脑永远无法创造强大的人工智能,所以它们不会对人类构成巨大威胁。

那么, 道德 是如何运作的呢?

  • 好吧,想想单一付款人系统,你是唯一涉及的人。你可以做任何你想做的事情,但有些因素可能会损害你,所以你要决定任何决定的风险是否大于收益,并在此基础上采取行动,尽可能给自己最好的时间。
  • 然而,在一个多人游戏系统中,你可以奢侈地剥削其他玩家,因为如果他们输了而你赢了,理论上你会以他们为代价玩得很开心。

人工智能的工作是避免这种不公正,以使其对所有人都*等,或者努力使其尽可能公*,但公正是如何计算的?

实现这一点的方法是把一个多玩家变成一个单付款人的方案,认为所有的玩家在一段时间内都是同一个人,过着相关个体(和动物)的生活。

现在对这个人来说什么是最好的?

一个人因虐待他人而在生活中获得的好处,现在被那些不再是他人的人所受到的伤害所补偿:伤害现在正由同一个人所遭受。因此,现在很容易看出行动是积极的还是糟糕的,因为好的行动带来的好处大于损失。

这就变成了一个把可能的痛苦和快乐相加的问题。个人并不天生擅长使用这种方法,因为他们通常不会假设他们将不得不过他们正在伤害的人的生活,所以他们更喜欢对自己(或者在某些情况下,对自己)产生偏见,但 AI 可以在没有任何这种偏见的情况下应用这种方法。

谁在给它编程?

你可以为你自己的系统做些什么,但我仍然希望其他人的人工智能会找到关于它的文字,并足够明智地理解它的正确性,这样,作为一条规则,它将自己来规范自己的行为,即使没有人配置任何努力来道德化它或取代其他人安装到它身上的有缺陷的计算机道德体系。

伦理是智力的产物吗?这种合作关系对人工智能的进步会产生什么后果?

照片由欧文比尔德Unsplash 上拍摄

有些问题:

  • 人工智能很难出现,但更有可能通过试错来改善。对此,我唯一的证据是进化的承诺。
  • 如果它来自某种生物启发的机制,将所有的思想纠缠在一起,那么伦理将只是认知功能的一个方面。在这种情况下,你肯定要像教孩子一样教知识。
  • 更有可能的情况是,每一个人工智能系统都需要一个效用特性来决定什么值得做,什么不值得做。该框架需要对伦理问题进行编码。
  • 道德证明必须由我们来判断、批准和编码,而不是决策机器。这是机器人技术即将成为自动驾驶汽车等日常生活的一部分的障碍之一。对此的解释是,我们的信仰不是科学推导出来的,也不是一致的,而是文化力量的动态组合,是有所不同的背景环境。

如果我们想创造一种对人类友好的普通智能,我们需要找到一种好的方法来开发一种我们理解并同意的道德处理器。如果我们忽视这一点,未来的人工智能很可能不会考虑我们的最佳利益。

人工智能的关键伦理问题是什么?

  • AI 由谁负责?
  • AI 公*吗?
  • AI 正在摆脱乔布斯吗?
  • 谁从 AI 中受益?
  • AI 能吃亏吗?
  • 谁决定如何部署到 AI?
  • 人工智能的伦理观是什么?
  • AI 有一天会接管人类吗?
  • AI 是对人类的威胁吗?
  • 人工智能趋势如何引发伦理问题?
  • AI 多久会接管?

结论

基于我们现有的道德和伦理原则,这将是相当复杂的。他们在世界各地都是不同的,取决于地点、文化和信仰。我们不是作为一个单一的人类进化而来的,我们可能从我们的社会生活经验中受益。我们的世界在几个方面是分裂的,比如种族、语言、价值观、历史、政治。这使得描述法律和伦理问题变得困难。即使作为具有相同历史的人类,我们也明白这些理想各不相同。即使作为具有相同历史的人类,我们也明白这些理想各不相同。所以这将是解决它的第一步。

这个的另一部分将被加工。虽然有非常“智能”的机器存在(公众并不知道它们),它们可以自己处理和学习,并使用它们的人工智能能力,但它们都是由人类设计的,这意味着存在漏洞。如果我们对计算机有 100%的信心,这些漏洞将会产生重大影响。人工智能可以指出一些对人类不起作用的东西,并根据它所拥有的知识和经历发展自己的推理(道德和伦理)。

它没有良心,没有人脑。也没有和人一样的形象。它使用它拥有的东西,因为它听起来像是机器缺少的东西。逻辑序列也可能与人类的思维方式有些不同。事情将会集中在机器所遵循的或者已经被编程的规则上。

所以,不,它在今天的世界不会有用,但随着人类和技术发展到更高的程度,人类和计算机之间的交互可能更可行。软件科学比公众看到的要复杂得多。可惜主要用于权力和战争类游戏。

现在,把你的想法放在TwitterLinkedin,以及Github!!**

同意 还是 不同意 与绍拉夫·辛拉的观点和例子?想告诉我们你的故事吗?

他对建设性的反馈持开放态度——如果您对此分析有后续想法,请在下面的 评论 或伸出手来!!

推文@ SauravSingla _ 08,评论Saurav _ Singla,还有明星SauravSingla马上!

Alteryx 是否是您分析需求的正确选择?

原文:https://towardsdatascience.com/is-alteryx-the-right-choice-for-your-analysis-needs-249e6a2ec2b1?source=collection_archive---------13-----------------------

什么是 Alteryx 以及我对使用它的想法

法国巴黎鸟瞰图— 来源

简介:

几周前,我的同事从我的隔间墙上偷窥说,“嘿,你要学习 Alteryx 了。”… Alteryx ?我甚至不知道那是什么词。在让他为我重复并拼写出来后,我做了一些谷歌搜索。在我的谷歌搜索中,我找不到该软件是什么以及它的最佳用途的综合分类。我不得不费力地从许多搜索中把这些信息拼凑起来。这就是我写这篇文章的原因:分享我拼凑的关于 Alteryx 的结论,并分享我自己使用它的第一手经验。

目录:

  • 什么是 Alteryx
  • 历史/背景
  • 使用 Alteryx(基本用例)
  • 总体思路

什么是 Alteryx?

Alteryx 是一个拖放软件,用于数据清理、数据挖掘、ETL、空间分析、机器学习和其他 BI 相关的活动。它的使用范围可以是相对基本的活动,如连接不同的数据源和预处理(我将马上向您展示),也可以是复杂的活动,如预测建模、时间序列和模拟。

历史/背景

Alteryx 既是制作软件 的公司名称,也是软件 的名称……它实际上有一个有趣的背景故事。该公司成立于 1997 年,以前被称为 SRC 有限责任公司。在最初的 15 年里,该公司主要专注于地理商业智能解决方案。它有从事各种有趣的数据相关地理项目的历史,包括在 2012 年与美国人口普查局合作创建一个工具,帮助客户为各自的用例战略性地挖掘/分析人口数据。这是一个突破性的项目,因为这是公众第一次能够如此细致地了解美国的人口构成。

2010 年,该公司更名为“Alteryx ”,采用他们领先的数据分析软件的名称。从这一点上,该公司开始将自己定义为一家全方位的数据科学和分析公司,而不仅仅是一个地理商业智能解决方案。他们将自己的软件设计成一个拖放式解决方案,供任何员工在没有太多编码/硬科学背景的情况下执行高级分析。

然而,由于 Alteryx 在地理空间数据分析方面数十年的背景,我相信这仍然是它的软件区别于其他软件的地方。

另一方面,Alteryx 于 2017 年 3 月 24 日首次公开募股,每股 14 美元。股价在 2020 年 2 月 14 日达到 158 美元的高点…

使用 Alteryx(基本用例)

所以,让我们来深入了解一下使用 Alteryx 是什么感觉。下图乍一看可能有点吓人,但实际上非常简单。

让我们剖析一下画布视图,这样我们就能理解它是如何工作的:

1.在顶部,红色,我们有各种数据工具我们可以在屏幕上拖放。数据工具本质上是可以以直观的方式应用于数据的功能。通常,用户会从绿皮书图标“输入数据”开始。

2.中间黑色的是画布。然后,我们将需要的任何图标(数据工具)拖到画布上,画布是占据屏幕大部分的大块空白区域。像蜘蛛网一样的连接从一个图标到另一个图标,以显示分析的进展(我们很快就会谈到这一点)

3.左边黄色部分是配置窗口。一旦我们拖动一个或多个图标,我们将使用配置窗口配置和定制每个图标的功能。

4.最后,在底部我们有结果窗口。每个数据工具的结果都可以在这里显示和交互。这个特性非常有用,因为它允许我们看到每个数据工具在每一步的输入和输出。

让我们看看画布上的作品是什么样子的:

在这里,我们对虚拟数据进行了一些基本的预处理,我将从左到右一步步介绍每个图标的功能:

1。输入数据:本例中从 excel 表中拉入数据。然而,Alteryx 可以从不同的地方以不同的格式提取数据。

2。选择数据:在这一步中重命名并改变了列的顺序

3。数据清理:更改了“性别”列的格式,该列以前包含不需要的字符

4。公式:通过将名字和姓氏列相加创建了一个新列

5。过滤器:根据 1 个特定属性过滤数据,即居住国

6。Join: 将另一个工作表加入到现有的工作表中,类似于 Excel 或 SQL join 语句中的 Vlookup

7。文本到列:根据“-”字符拆分列

8。输出:导出输出,以便在其他地方进行进一步的分析、可视化或报告

这个例子并不令人惊讶,但是它是学习使用 Alteryx 的第一步。请注意配置窗口和结果窗口(这两个窗口都显示了此图像中连接数据工具的详细信息)

总体思路

Alteryx 是在使用 Excel 和使用 SQL/Python/R 之间的一个很好的混合选择。我可以想象它是许多分析师的“黄金地带”。

  • Excel 因多种原因而受到限制(缺乏集中存储、缺乏协作能力、缺乏复杂的审计跟踪、容量限制、功能限制等)。Excel 相对容易学习,是生活中非常有用的技能,但它缺乏许多真正的数据分析的关键属性。
  • 从数据分析/数据科学的角度来看,SQL 结合 Python/R 几乎可以做任何事情,如果你知道如何使用它们的话。这里的问题是需要多年的训练才能真正精通。很多人没有时间/精力投入到这个上面。即使一些分析师确实学习了这些工具,他们中的大多数可能也不会利用他们在当前角色中学到的能力。

这就是 Alteryx 的用武之地!这是一个非常好的拖放解决方案,正好适合中间位置。以下是我在两周的实验中收集到的一些额外的信息。

  • Alteryx 对记录大小几乎没有限制。如果你突然想到“我可以用 Excel 做这个”在学习 Alteryx 时,由于许多原因,这是不正确的,容量是其中之一。根据 Alteryx 的“一般讨论”博客,你显然可以操纵 1 万亿行没有问题。
  • 地理空间情报可以说是它最好的功能。回顾 Alteryx 的历史,作为一家地理商业智能 it 公司,它花了几十年时间来调整自己的定位。虽然现在它可能没有在这方面树立自己的品牌,但它的空间数据工具是业内最好的。它不是一个官方的地理信息系统(GIS)软件,但它可能是最接*的东西,同时仍然是一个通用的分析工具。在这些链接中了解更多信息:空间分析软件我发现非常有用的例子
  • 挺贵的……这一点不言自明

考虑通过我的推荐链接加入 Medium:https://andrewhershy.medium.com/membership

如果您觉得这很有帮助,请订阅。如果你喜欢我的内容,下面是我参与的一些项目:

Excel vs SQL:概念上的比较

优步点评文本分析

简单线性 vs 多项式回归

随机森林是否优于 Logistic 回归?(一比较)

基尼指数 vs 信息熵

用 Python 中的逻辑回归预测癌症

从头计算 R *方(使用 python)

一个 AWS 认证值得吗?

原文:https://towardsdatascience.com/is-an-aws-certification-worth-it-c6cbc25b4d06?source=collection_archive---------2-----------------------

泰勒·维克在 Unsplash 上的照片

我获得 AWS 认证已经快四年了,从学校开始,这是应用数据科学项目的必修部分。从那以后,我在两年前重新认证,以保持认证,并保持我的知识新鲜。

什么是 AWS?

AWS 是亚马逊的一个分支,销售云计算解决方案。它是此类解决方案的最大供应商之一,仅次于微软 Azure 和谷歌云。

云计算的想法很简单:一家公司不再拥有自己的服务器,而是在另一家公司的数据中心租用服务器。由于该云服务供应商拥有大量的服务器,他们可以以较低的每台服务器成本实现这一点。

所有与云相关的东西目前都在 IT 界引起了轰动。许多大型迁移都集中在云上。它有真正的价值,但也改变了很多事情。

什么变化?

当服务器不再物理上位于您的旁边时,这将改变一些事情。不一定是非常根本性的 IT 变化:您仍然可以做同样的事情,底层硬件和软件通常是相同的或非常相似的,一旦一切就绪,一切都将恢复原样。

在 AWS 上,您不必再这样做了。照片由乔丹·哈里森Unsplash 上拍摄

不,真正改变的是您在云中设置和管理所有这些虚拟硬件和软件层的方式。

由于设置 IT 的方式发生了变化,您也需要学习如何做到这一点。这就是 AWS 培训可以帮助你学习它的地方,AWS 认证可以帮助你证明你有这方面的知识。

AWS 学习计划

可以拿到的认证有很多。

首先是云从业者,这是一个非常简单的入门级别认证。

然后在第二个层次,助理层次,你可以选择三种不同的路径:解决方案架构师(专注于根据最佳实践架构云系统)、SysOps 管理员和开发人员。

在专业层面,解决方案架构师需要后续培训,专业开发运维工程师的其他两个助理认证也需要后续培训。

专业认证略有不同,因为它们侧重于更具体的主题:这些认证没有级别。

截图来自:https://aws.amazon.com/certification/

AWS 还在他们的网站上提出了基于角色的路径,上面有你工作所需的一切:【https://aws.amazon.com/training/learning-paths/。

值得吗?

AWS 认证会直接给你找工作吗?不,绝对不是。拥有证书与拥有实践经验和实际知识之间仍有很大差距。

我老实说,入门认证挺没用的。也许它可以通过表明你对 AWS 感兴趣来帮助你,我认为这可以被许多公司看作是积极的,但这种水*并不能保证在 AWS 上有任何实际经验。

然后是关于助理认证。对我来说,这显示了一个不足以在 IT 和云上全职工作的水*,但我确实相信,显示你有足够高的水*在 AWS 上完成工作是有用的。此外,你还可以和专家交谈,质疑他们的观点。我相信认证在这里有附加值,因为通常很难证明中级技能水*:如果你在一些宠物项目等上使用 AWS,它可能很难被认真对待。

照片由穆罕默德·里兹万Unsplash 上拍摄

专业水*的认证表明你真正掌握了这个主题。我不认为如果你完全掌握了一种工具,认证是非常必要的:技术面试应该显示同样的结果。但由于不是每个招聘人员都能进行技术测试,我相信拥有证书在这里也有附加价值。

结论

总之,准备认证对于想要开始使用 AWS 的初学者来说非常有价值。这将迫使你学习基础知识,并有助于关注你所在领域最重要的话题。然而,除此之外,当进入需要 AWS 的工作时,在这个特定的 it 领域拥有实践经验是非常必要的。

我的建议是,在了解它们在云中的不同工作方式(或不同工作方式)之前,您需要了解它们在云之外的工作方式。为此,你需要在工作、学校或家里尝试一些东西。一旦你达到了这个水*,增加一个证书是完全值得的。

分析是你职业生涯的下一步吗?

原文:https://towardsdatascience.com/is-analytics-your-next-career-move-8e03747ad2a6?source=collection_archive---------5-----------------------

印度尼西亚 Banyuwangi,De Djawatan(伊曼努尔·阿姆哈拉拍摄)

我希望在将职业生涯转向分析之前知道的 4 件事

两年前,我开始转向分析领域(或者大数据、商业智能——随便你怎么说)。我最初是一名 IT 项目助理。我花了很多时间收集系统需求、开发测试用例、与服务提供商合作,以获得支持业务的合适工具。仅仅接触了一个包含数据查询和可视化的报告工具,我就震惊地意识到这个领域是多么有趣。

有大量的数据可用,通过正确的组合,数据可以帮助人们做出更快、更有影响力的行动和决策。

我的头六个月充满了适应。新的工作领域,新的公司,新的工作文化(从跨国公司到本土初创企业!),以及职业转变后的其他新事物。消极的一面是,我没有对这个新的分析领域做很多研究。我经历了其中的一小部分,我喜欢它,然后我去了(那不是一个非常深思熟虑的决定,不是吗?).

我不后悔这个决定,事实上,我很感激我这样做了!但是回过头来看,仍然有一些的事情我希望在做这个转变之前就已经知道和考虑了。特别是对于非数学/统计/精算师背景的我来说。

在将职业生涯转向分析之前,我希望知道的 4 件事

1。分析是一个广泛的领域,不同的组织对此角色有不同的命名

如上所述,我转行前的数据分析曝光度非常有限。我花了 3 个月时间创建报告和仪表板,帮助利益相关者做出各种业务决策。利益相关者很高兴,我因此获得了内部奖励。我在一家初创公司寻找一个商业智能分析师的职位,我知道这个职位会让我胜任,于是我去了。

在几个月的工作中,我发现这是一个更大的领域的一部分,这个领域叫做分析,它不仅仅是创建报告。但是,在分析方面没有行业范围的能力或认证标准。从事这项工作的部门在组织中也有不同的名称,从商业智能、数据分析、大数据,甚至数据科学。

一般而言,分析涵盖以下内容:

  • 数据分析 —综合原始数据并对其进行处理,以生成可操作的见解。这方面的一些项目可能包括识别影响发现难点的因素;分析营销活动绩效;或者顾客购买行为
  • 简单的数据建模 —创建分组数据点的方法,以制定更明智的策略。这方面的一些项目可能包括客户细分、定义影响转换的因素等
  • 数据基础 —识别可能的新数据点和特征,以丰富分析和数据模型。原始数据(取决于大小和形式)可能太难处理,临时数据基础可以帮助弥补这一点
  • 报告和仪表板 —这并不新鲜,但有一些原则可以让每个报告/仪表板在一目了然的情况下变得更有价值和更具可操作性

确保你知道你想做什么样的分析,并将其与你正在探索的分析组织的工作范围相匹配。

作为一个暗示,你作为一个分析师的工作范围将根据组织如何定义分析而有所不同。但是不管那里的分析部门是什么样的,确保你有足够的产品/数据工程团队的支持,以确保你有良好的数据基础来进行分析。如果没有良好的数据基础,您会发现自己要花更多的时间来准备数据集,而不是实际操作、询问甚至呈现数据集。我告诉你——这是一个非常低效的过程。

2。需要基本的统计知识和数据处理能力

有解决问题的能力是好的,但这还不够。我有信息系统/信息技术背景,了解企业和流程,但统计数据非常有限。我对相关性、聚类或回归并不熟悉。这种情况限制了我的数据分析,因此它往往是非常探索性的——很少有决定性的或科学的见解。虽然在某些情况下,这可能不是一件坏事,但在其他情况下,这就像一个回旋镖,因为洞察力仍然是主观驱动的,不可扩展。

如果你像我一样来自非统计/数学背景,我建议首先熟悉描述性分析和一些预测性分析概念。描述性分析包括总结和描述数据集,查看它们的频率、集中趋势、分散性、与其他数据集的关系等。预测分析是利用历史数据预测潜在结果的技术。在进行这些分析时,尤其是在大型数据集上,需要某些数据操作工具。有很多工具,但我个人最喜欢的是 Python(是的,它来自我的 it 背景:P)和 r。

几个内容可以帮助您开始:

3。以正确的方式分割数据——不一定是我们期望的结果

传统上,数据被用作某些业务绩效的回顾性度量,以及下一个决策的合理性。我们作为一个分析师,决策者通常已经有了一些先发制人的假设,关于什么样的见解将从数据中产生。而且我们喜欢正确对待它

一旦开始分析,我们就处理数据,进行一些描述性的探索,然后进行统计测试。从那里,我们得到了一些洞见,这些洞见可能导致我们的假设被拒绝,甚至可能与我们的假设相矛盾。有些情况下,我们或利益相关者对这个结果感到焦虑和好奇,导致我们再次操纵数据,以至于我们需要重新测试和证明最初的假设。

虽然对数据进行复查和进一步的分组分析有助于验证我们的分析,但我们也应该保持中立,接受数据所告诉我们的事实。

尤其是当我们确信我们已经遵循了正确的分析过程,并且质量差的数据较少时。

弗兰基·查马基Unsplash 上拍摄的照片

这可能会导致我们陷入一个循环,反复检查,反复切割数据集,花费数小时,但仍然没有获得任何额外的见解或获得偏离我们最初目标的结果。在处理这个问题时,我们可以:

  • 建立一套 清晰的目标和界限用于分析中要探索的事物。每当你打算深入研究时,问问自己它将如何帮助你回答问题陈述或实现分析目标。
  • 请记住, 数据是其他变量 中的一个关键输入。它并不完美,在生成见解时还有几个其他因素需要注意,如有限的样本组/数据特征,或不断变化的趋势。

查看这篇来自 HBR 的有趣的文章,了解如何在组织中使用数据作为决策基准。

4。适应快速持续改进的重要性

当提出见解或部署模型时,分析或数据建模的工作不会停止。从每个分析中,仍然会有后续问题需要解决,新的数据集需要处理,以及来自外部的额外问题。在高增长的科技初创企业中,事情变化非常快。作为一名分析师,重要的是你要为此改变你的工作方式。

一些提示…

  • 更多的战术分析,而不是直接的大基础分析
  • 让它具有可复制性!在接下来的几个月中,您可能会发现自己为了验证或类似的上下文而重新运行分析
  • 适应并理解新产品特性或外部事件如何改变你之前分析的结果(从而使其过时或需要额外的调整)

你可能会发现你现在做的东西在未来的 12 个月甚至 6 个月内可能会过时。这就是它的美妙之处。我们需要确保的基本上是我们是否仍然产生与组织的焦点一致的分析。

最后的想法

上述事情可能会帮助你做出更明智的决定,将你的职业生涯转向分析以及随后的准备/要求。我建议和业内人士聊天,更好地了解外面的世界。

最重要的是,转行仍然需要决心、适应和对工作的奉献。随着大数据、分析、数据科学和机器学习的兴起,这一领域的机会是无限的,并且仍在不断发展。

将你的职业生涯转向这个领域在很多方面都很有趣,但是请确保你知道你报名参加的是什么,并确保你已经为成功做好了准备:)

Apache Airflow 是否足以满足当前的数据工程需求?

原文:https://towardsdatascience.com/is-apache-airflow-good-enough-for-current-data-engineering-needs-c7019b96277d?source=collection_archive---------4-----------------------

Apache Airflow 作为 ETL 和数据科学的工作流管理*台的利与弊,以及由此衍生的 Airflow 可能是好选择或坏选择的用例

克里斯·利维拉尼在 Unsplash 上的照片

不久前,如果你问任何数据工程师或数据科学家,他们使用什么工具来编排和调度他们的数据管道,默认的答案可能是 Apache Airflow。尽管气流可以解决许多当前的数据工程问题,但我认为对于一些 ETL &数据科学用例来说,它可能不是最佳选择。

在这篇文章中,我将讨论我在过去两年中使用气流的利弊,并从中得出气流仍然是一个很好的选择的用例。我希望在本文结束时,您将能够确定它是否适合您的 ETL &数据科学需求。

气流的优势是什么?

社区

不可否认,阿帕奇气流有一个惊人的社区。有大量的个人在使用 Airflow 并为这个开源项目做出贡献。如果您想解决一个特定的数据工程问题,那么社区中可能有人已经解决了这个问题,并在线分享了他们的解决方案,甚至将他们的实现贡献给了代码库。

对气流进行战略押注的公司

许多公司决定投资 Apache Airflow 并支持其发展,其中包括:

  • 谷歌凭借其云作曲家 GCP 服务,
  • 天文学家为在 Kubernetes 上部署气流提供企业支持,
  • Polidea 拥有许多 PMC 成员,为代码库做出了巨大贡献
  • GoDataDriven 提供阿帕奇气流训练。

来自这些公司的支持确保有人全职工作来进一步改进软件,从而保证长期的稳定性、支持和培训。

计算机编程语言

在 Python 代码中定义工作流的可能性非常有用,因为它允许您将几乎任何自定义工作流逻辑合并到您的编排系统中。

展开性

气流允许您通过以下方式扩展功能:

  • 使用插件例如。要在 UI 中添加额外的菜单项,
  • 添加自定义操作符或在现有操作符的基础上构建。

广泛的运营商

如果你看看 Airflow Github 库中可用的操作符的数量,你会发现 Airflow 支持广泛的到外部系统的连接器。这意味着,在许多情况下,您会发现代码模板可以用来与各种数据库、执行引擎和云提供商进行交互,而不必自己实现代码。

外部系统的连接器数量表明,气流可以用作“粘合剂”,将来自许多不同来源的数据结合在一起。

气流的弱点是什么?

从上面列出的优势列表中,您可以看到,总的来说,从将许多外部系统捆绑在一起的角度来看,Airflow 是数据工程的一个伟大产品。社区投入了大量的工作来构建广泛的特性和连接器。然而,它有几个弱点阻止我真正喜欢使用它。其中一些问题可能会在未来的版本中得到解决,所以我在撰写本文时讨论这些问题。

数据管道没有版本控制

如今,当我们有了版本控制系统和存储在 Docker 注册表中的不同版本的 Docker 映像时,我们认为版本化是理所当然的——这是一个应该存在的基本功能,毫无疑问。但是,气流还是没有。如果您从 DAG 代码中删除一个任务并重新部署它,您将丢失与该任务相关的元数据

对新用户来说不直观

我用了足够长的时间来理解它的内部结构,甚至通过编写定制组件来扩展它的功能。然而,向一组以前从未使用过 Airflow 的数据工程师教授如何使用它被证明是耗时的,因为人们需要学习一种全新的“语法”。一些数据工程师认为整个体验不直观

一个突出的例子与的调度有关:许多人(包括在内的我)发现,Airflow 在调度间隔的结束时开始调度任务,这非常令人困惑。这意味着调度间隔不会立即开始,而是仅在execution_date达到start_date + schedule_interval时开始。这似乎适用于每晚只运行一次的批处理 ETL 作业,但是对于每 10 分钟运行一次的作业,当不熟悉该工具的新用户使用它时,它会相当混乱,并且可能导致意外的错误,特别是如果没有正确使用 catchup 选项的话。

从一开始就配置过载+难以在本地使用

为了在本地计算机上开始使用 Airflow,不熟悉该工具的数据专业人员需要学习:

  • 内置于产品中的调度逻辑****——比如提到的与开始日期、执行日期、调度间隔、赶上进度相关的细微差别
  • 一整套概念和配置细节— 操作符与任务、执行器、Dag、默认参数、airflow.cfg、airflow 元数据 DB、部署 Dag 的主目录等等)。

另外,如果你是一个 Windows 用户,你真的不能在本地使用这个工具,除非你使用 docker-compose 文件,这些文件甚至不是官方 Airflow 库的一部分——许多人使用 puckel/docker-airflow 设置。这都是可行的,但我希望它会更直观,更容易为新用户。

我知道 Airflow 在过去的几个月里发布了一个官方的 docker 映像,但仍然缺少一个官方的docker-compose文件,新用户(特别是 Windows 用户)可以在其中获得完整的基本设置,以及一个元数据数据库容器和一个绑定挂载,以便将他们的 Dag 复制到容器中。一个官方的docker-compose文件对于能够在 Windows 上本地运行 Airflow 非常有帮助。

如果你使用天文学家付费版本的气流,你可以使用 astro CLI ,这在一定程度上缓解了局部测试的问题。

为生产设置气流架构并不容易

为了获得生产就绪的设置,您实际上有两种选择:

  1. Celery Executor: 如果您选择这个选项,您需要了解 Celery 如何工作+您需要熟悉 RabbitMQ 或 Redis 作为您的消息代理,以便设置和维护可以执行您的气流管道的工作队列。据我所知,没有直接来自 Airflow 的官方教程或部署方法来使这一扩展过程对用户来说更容易。我个人是从这篇博客文章中学到的。)。总的来说,我希望这个设置对用户来说更容易,或者至少 Airflow 会提供一些关于如何正确设置的官方文档。
  2. Kubernetes Executor: 与芹菜相比,这个 Executor 相对较新,但是它允许您利用 Kubernetes 的力量自动缩放您的工人(甚至减少到零!)并以健壮的方式管理所有 Python 包的依赖关系,因为所有东西都必须被容器化才能在 Kubernetes 上工作。然而,在这方面,我也没有在官方文档中找到关于如何正确设置和维护它的支持。

我在为我工作的公司在 AWS 上设置气流的经验是,你可以:

  • 雇佣一些外部顾问为你做这件事
  • 从谷歌( Cloud Composer )或天文学家. io 获得一个付费版本
  • 或者你可以试错,交叉手指希望它不会断。

总体而言,Airflow 的架构包括许多组件,例如:

  • 调度程序,
  • 网络服务器,
  • 元数据数据库,
  • 工作节点,
  • 遗嘱执行人,
  • 消息经纪人+芹菜+花如果选择芹菜执行者,
  • 可能是一些共享卷,例如 AWS EFS,用于工作节点之间的公共 DAGs 存储,
  • 正确设置airflow.cfg中的值
  • 配置日志存储。S3 +理想的一些生命周期策略,通常情况下,你不需要查看非常旧的日志和支付存储费用
  • 为用户界面注册域
  • 添加一些监控来防止您的元数据数据库和工作节点超出它们的计算能力和存储
  • 为 UI +数据库用户管理添加一些 Auth 层用于访问元数据数据库。

这些是 许多组件来维护 以确保它们都很好地一起工作, 而且似乎开源版本的 Airflow 并没有让这个设置对用户来说很容易。

从我到目前为止的经验来看,如果你想在生产中使用 Airflow(特别是如果你使用 AWS 或 Azure 而不是 GCP ),选择天文学家似乎是最简单的选择,因为你在上面添加了许多功能,例如监控你的节点、将日志拉到一个中心位置、授权层(和与活动目录的集成)、支持、SLA 和天文学家团队将至少维护上面列出的一些组件。

任务之间缺乏数据共享鼓励了非原子任务

目前,除了使用 XComs 之外,还没有自然的“Pythonic 式”方法在 Airflow 中的任务之间共享数据,XComs 被设计为仅共享少量元数据(路线图中有计划引入功能性 Dag,因此数据共享在未来可能会以某种方式变得更好)。

任务意味着数据管道中基本的原子工作单元。因为在气流中的任务之间没有共享数据的简单方法,而不是任务是原子的,即只负责一件事情(例如。仅提取数据,人们通常倾向于使用整个脚本作为任务,例如一个脚本执行整个 ETL ( 由 BashOprator ex 触发。" python stage _ AdWords _ ETL . py "),这反过来使得维护更加困难,因为您需要调试整个脚本(完整 ETL ),而不是一个小的原子任务(例如。仅“提取”部分)。

如果你的任务是而不是原子的,当它失败时,你不能仅仅重试 ETL 的加载部分——你需要重试整个 ETL

调度程序成为瓶颈

如果你以前使用过 Airflow,你可能已经经历过在 UI 中点击 Trigger DAG 按钮后,你需要等待相当长的时间才能看到任务真正开始运行。

调度器通常需要几分钟才能调度任务,并由工作进程执行,至少今年早些时候我使用部署在 EC2 上的 Airflow 时是这样。Airflow 的社区正在致力于改进调度程序,所以我希望它在下一个版本中会有更高的性能,但是在撰写本文时,这个瓶颈阻止了将 Airflow 应用到延迟不可接受或不可取的用例中。

气流仍然是一个好选择的使用案例

在本文中,我多次强调,当 Airflow 只需要调度以下任务时,它就能很好地工作:

  • 运行在 Spark、Hadoop、Druid 等外部系统上,或者 AWS Sagemaker、AWS ECS 或 AWS Batch 等一些外部云服务上,
  • 向某个内存数据库提交 SQL 代码。

Airflow 被 设计成 不直接在 Airflow 内部执行任何工作流,而只是对它们进行调度,并让 保持在外部系统 内执行。

这意味着,如果您的任务是提交 Spark 作业并将数据存储在 Hadoop 集群上,或者在 Snowflake 中执行一些 SQL 转换,或者触发 SageMaker 培训作业,那么 Airflow 仍然是一个不错的选择。

举个例子:想象一家公司,数据工程师在 Pentaho 数据集成中创建 ETL 作业,他们使用CeleryExecutor在 AWS EC2 实例上编排BashOperator任务。那些任务没有被停靠,任务只是调度一个 bash 命令在一个特定的服务器上运行。气流在这个用例中运行良好。

如果您在工作流系统中需要做的只是向外部系统提交一些 bash 命令,并且您实际的数据流是在 Spark、SageMaker 中定义的,或者如上面的例子,在 Pentaho 数据集成中,Airflow 应该非常适合您,因为数据依赖关系是由那些外部系统管理的,而 Airflow 只需要管理任务之间的状态依赖关系。如果您使用一些内存数据库,如雪花、Exasol 或 SAP Hana,实际工作在这些数据库中执行,您的工作流编排系统只需向其提交查询即可。

气流不是好选择的使用案例

如果您希望您的 工作流系统 与您的 执行层 紧密合作,并且能够在 Python 代码内的任务之间传递数据,那么在这种情况下,气流可能不是最好的选择。

Airflow 只能通过 XComs 传递任务之间的状态依赖(加上可能的一些元数据),而不能传递数据依赖。这意味着,如果您主要用 Python 构建工作流,并且您有许多数据科学用例,这些用例本质上严重依赖于任务间的数据共享,那么其他工具,如 Prefect 会更适合您。

在这些使用案例中,Prefect 是比 Airflow 更好的选择:

  • 如果需要在任务间共享数据
  • 如果您需要对数据管道进行版本控制,那么 Airflow 不支持这一点
  • 如果你想用 Dask 对你的 Python 代码进行并行化,提督支持 Dask 分布式开箱即用
  • 如果需要运行动态参数化数据管道
  • 如果 Airflow 的调度器延迟不为您的工作负载所接受,
  • 如果您想在本地测试工作流代码时获得无缝体验
  • 最后,如果你喜欢一个更容易和更灵活的执行层而不是维护前面提到的所有气流组件,你可以选择完美云。您可以在本文中找到一种可能的设置方法:

[## AWS EKS 和提督使分布式数据管道变得简单

如何在几分钟内建立一个分布式云工作流程编排系统,并专注于提供价值,而不是…

towardsdatascience.com](/distributed-data-pipelines-made-easy-with-aws-eks-and-prefect-106984923b30)

结论

在本文中,我们讨论了 Apache Airflow 作为 ETL 和数据科学的工作流编排解决方案的优缺点。在分析了它的优势和劣势之后,我们可以推断,只要它用于其设计目的,即仅编排在 Apache Spark、Hadoop、Druid、云服务等外部系统上执行的工作,或者在向 Snowflake、Exasol 或 Redshift 等高性能分布式数据库提交 SQL 代码时,它就是一个不错的选择。

然而,air flow并不是为直接执行您的数据管道而设计的,所以如果您的 ETL &数据科学代码需要在任务之间传递数据,需要动态和参数化,需要并行运行,或者需要更灵活和低延迟的调度程序,那么您可能会更喜欢其他工具,如 Prefect。

感谢您的阅读!

人工智能死了吗?

原文:https://towardsdatascience.com/is-artificial-intelligence-dead-ceb3830033a1?source=collection_archive---------25-----------------------

先说 AI 状态的统计。

照片由 Greg OrtegaUnsplash 上拍摄

在过去的几十年里,对人工智能的影响和趋势的兴趣激增,导致了许多问题和评论的出现。一个最流行的观点是,人工智能及其子领域已死,其他趋势性的先进技术将取而代之。AI 死了是真的吗?让我们开始吧!

经济。

乔布斯

人工智能在招聘市场上还有需求吗?哪些国家的人工智能工作正在增长?

不仅发达经济体的就业率一直在上升,许多新兴市场也是如此。下图显示了 2019 年各国人工智能雇佣指数。

按国家分列的人工智能雇佣指数-2019 年

人工智能雇佣率是 LinkedIn 成员中拥有人工智能技能并在新工作开始的同一个月内将新雇主添加到其个人资料中的百分比,除以该国 LinkedIn 成员的总数。如果国家符合以下条件,则包括在内:

  1. 充足的劳动力覆盖率(大约> 40%);
  2. 任何一个月至少 10 个 AI 人才。

符合这些条件的国家有:美国、荷兰、爱尔兰、丹麦、澳大利亚、英国、卢森堡、加拿大、新加坡、比利时、新西兰、挪威、瑞典、阿拉伯联合酋长国、法国、葡萄牙、瑞士、智利、西班牙、意大利、香港、芬兰、以色列、哥斯达黎加、巴西

下面的图表显示了美国哪些行业的人工智能工作份额正在增长。在各行业中,技术、服务部门和制造业对人工智能技能的需求增长最为显著。

行业发布的人工智能职位份额-2019 年

投资

对人工智能初创公司的投资也在增长。2010 年至 2018 年间,资金以超过 48%的年均增长率增长。接受资助的人工智能公司数量也在增加,2018 年接受资助的人工智能公司超过 3000 家。

人工智能私人投资总额-2019 年

在美国,受资助的初创公司数量仍然很高,因为它一直是人工智能资助的领导者。但是,一些中国公司在 2018 年获得了高水*的投资,这使该国接*与美国持*。

按国家分列的人工智能私人投资总额-2019 年

人工智能相关投资规模最大、增长最快的领域是哪些?

  • 自动驾驶汽车(AVs)77 亿美元(占总数的 9.9%),
  • 药物、癌症和治疗(47 亿美元,超过 6.1%),
  • 面部识别(47 亿美元,6.0%),
  • 视频内容(36 亿美元,4.5%),
  • 欺诈检测和金融(31 亿美元,3.9%)。

世界人工智能私人投资的百分比-资料来源:CAPIQ,Crunchbase,Quid,2019 年

全球哪些行业增长最快?

  • 机器人过程自动化增长最快(2018 年超过 1B 美元)
  • 供应链管理(2018 年超过 5 亿美元),
  • 工业自动化(2018 年超过 5 亿美元)。
  • 其他部门也经历了全球私人投资的增长。

人工智能私人投资的增长-来源:CAPIQ,Crunchbase,Quid,2019 年

企业活动

越来越多的公司在全球范围内采用人工智能:

  • 58%的公司正在至少一个职能或业务部门#使用人工智能,高于 2018 年的 47%。
  • 人工智能整合在各地区的分布似乎比 2018 年更加均匀。
  • 30%的人报告称,人工智能嵌入了他们业务的多个领域,而 2018 年有 21%的人这么说。

业务部门的人工智能能力-来源:麦肯锡公司 2019 年

组织最有可能将 AI 集成到为其行业提供核心价值的功能中。例如,金融服务业的受访者比其他人更有可能说他们的公司在风险职能部门采用了人工智能。

按行业和职能划分的人工智能采用情况-来源:麦肯锡公司 2019 年

组织采用的人工智能能力因行业而异。

业务流程中的人工智能能力-来源:麦肯锡公司 2019 年

学术界。

在线学习

人工智能教育延伸到大学之外。在线学习在教育和发展全球劳动力的人工智能技能方面发挥着至关重要的作用。

大学入学人数

在美国大学,仅在斯坦福大学,人工智能导论的入学人数在 2012 年至 2018 年间就增长了五倍。

美国大学人工智能导论的总入学人数-2019 年

美国以外几所领先的计算机科学大学的人工智能和人工智能课程注册人数知道提供 2010-2019 学年数据的国际学校的相对增长。

世界其他大学人工智能导论总录取人数-2019 年

公众的看法。

中央银行

世界各地的央行都对人工智能表现出浓厚的兴趣,特别是它预测地缘政治和宏观经济状况的能力,以及更好地理解监管和政策环境的能力。

《央行通讯·全球 2019》提及人工智能

提及人工智能的中央银行通信显著增加,随着时间的推移,从其他出版物转向提及人工智能的演讲,显示出理解人工智能的巨大努力。

政府

政府越来越关注人工智能。在美国,数据显示,与前几年相比,2017-2018 年国会的活动增加了 10 倍以上。

美国国会人工智能提及-来源:彭博 2019

企业

提及 AI 的盈利电话*的份额有所增加,从 2010 年占总盈利电话的 0.01%增加到 2018 年的 0.42%。

收益电话会议是上市公司管理层、分析师、投资者和媒体之间的电话会议,讨论公司在给定报告期(如一个季度或一个财年)的财务业绩

人工智能在赚取呼叫中的总次数-来源:Prattle,2019 年

网络搜索和全球新闻

查看在线新闻报道,下面的时间轴显示,“人工智能”是明显的赢家,其次是机器学习和深度学习。

全球新闻报道的百分比-来源:GDELT,2019

2020 年及以后!

通过充当资本-劳动力混合体,人工智能提供了放大和超越当前资本和劳动力能力以推动经济增长的能力。研究揭示了前所未有的价值创造机会。

2035 年的年增长率—资料来源:埃森哲和前沿经济学

到 2035 年,人工智能(AI)在 12 个发达国家(目前占全球国内生产总值(GDP)的 50%)的经济影响将在未来几年继续增长,仅在瑞典就有超过 37%的增长。

人工智能提高劳动生产率的百分比——资料来源:埃森哲和前沿经济学。

上面提到的统计数据表明,人工智能在过去十年中有了显著的发展,并将继续在几个领域中发挥最大的作用。人工智能通过自动化任务和改善价值创造过程,已经进入学术界、企业和公众认知的核心。

**参考资料:提及的统计数据来自斯坦福大学 2019 年 HAI 年度报告和埃森哲研究。

人工智能存在于 1950 年吗?——早期人工智能的 8 个现实应用?

原文:https://towardsdatascience.com/is-artificial-intelligence-exist-in-1950-8-real-world-applications-of-ai-in-1950s-d1de4b939c?source=collection_archive---------19-----------------------

内部人工智能

人工智能应用的革命

人工智能的革命

为什么古代人工智能是现代人工智能的基础?

人们认为人工智能是几年前刚刚诞生的新兴技术。但是实际的人工智能在现实中有很强的根基。在古代,研究人员也使用像神经网络和机器智能这样的技术。今天的技术和旧方法的基本区别仅仅在于计算和数据。今天,我们拥有巨大的计算能力,可以处理任何数量的数据。在过去,我们只有几千字节的内存和很小的 CPU 能力,只能做非常基本的操作。但是今天,我们有图形处理单元,具有大量的 RAM 和处理能力,可以进行高指数和复杂的计算。此外,我们也有无数的数据。这些数据可以帮助我们用人工智能做出更好的决策。但今天的人工智能只是旧时代的升级版。人工智能的根源始于 20 世纪 50 年代。今天的一些趋势应用可以追溯到 1950 年。约翰·麦卡锡在 1956 年创造了这个术语,他将人工智能定义为“制造智能机器的科学和工程”[1]

人工智能革命及其应用

1.“翻译”备忘录

Warren Weaver[2]第一次介绍了使用计算机将文档翻译成自然语言。沃伦对逐字翻译法有四个建议。

在第一个提议中,他处理了单词歧义的问题。在英语中,有很多单词在不同的上下文中有不同的意思。同一个词可以有两种或两种以上的意思。他提出了一种方法来翻译人类语言中的单词,该单词出现在上下文单词的附*和数量。[2]在第二个建议中,他描述了使用基于逻辑上下文的神经网络的基于结论的翻译。第三个建议是用信息论进行加密翻译。[3]第四个建议是关于语言共性,以使语言和对话更好。[4]

2.逻辑理论家

艾伦·纽厄尔、萧伯纳和司马贺写的《逻辑理论家的第一次论证》。它被设计成模仿人类解决问题的技术,被称为“第一个人工智能程序”。它证明了怀特海和罗素的《数学原理》中前 52 个定理中的 38 个。

对商业组织的研究需要洞察人类解决问题和决策的本质。

纽维尔和西蒙开始讨论让机器学会思考的可能性。他们的第一个项目是一个可以证明数学定理的程序。由于他们实现了这个程序,这个程序成功地证明了定理,这让数学家们感到震惊。最终,Shaw 能够完成这个程序,并且能够在 RAND 圣莫尼卡工厂的机器上运行这个程序。

1)逻辑理论家对人工智能的影响:

  • 作为搜索的推理:这个定理有助于探索搜索树:根节点是初始假设,每个分支是基于给定逻辑规则的推理。
  • 启发式:他们意识到搜索树将呈指数增长,他们需要修剪一些不必要的分支,使用“经验法则”来获得可能导致死胡同的路径。
  • 列表处理:为了实现逻辑理论家,三名研究人员开发了一种编程语言 IPL,它使用了相同形式的符号列表处理,后来形成了麦卡锡的 Lisp 编程语言的基础。

2)哲学意蕴:

他们发明了一种能够进行非数字思维的计算机程序,从而解决了这个古老的程序,解释了一个由物质组成的系统如何具有思维的特性。

3.模糊逻辑

模糊逻辑是一种多值逻辑形式,其中值应该是 0 和 1 之间的任何实数。

人们在非数值和不精确信息的基础上做出决策,并利用这些逻辑引入模糊逻辑。这些模型具有解释和利用数据和信息的能力,能够识别、操作和表示模糊的和缺乏确定性的数据和信息。

程度、真值和概率的范围都在 0 到 1 之间,因此初看起来可能相似,但是模糊逻辑使用真值程度作为模糊的数学模型,而概率是无知的数学模型。

1)应用程序:

  • 模糊逻辑的第一个值得注意的应用是在日本实现的,它在仙台的地铁列车上实现,它有助于提高乘坐的经济性、舒适性和精确性。
  • 模糊逻辑对于医疗决策是一个更重要的概念。一个常见的应用领域是使用模糊逻辑的计算机辅助诊断。

4.人工智能逻辑游戏

人工智能一直擅长自我学习,并在国际象棋、跳棋、奥赛罗和围棋等逻辑游戏中发挥了巨大作用。1952 年,Arthur Samuel [5]创建了第一个通过自学人工智能方法玩跳棋的程序。经过几年的国际象棋革命,“深蓝”于 1997 年被国际商业机器公司(IBM)开发出来,它击败了特级大师加里·卡斯帕罗夫。在人机锦标赛中,计算机程序奇努克成为 1994 年世界跳棋冠军。物流学家还在 1997 年用计算机程序击败了世界冠军。

5.自动微分

自动微分是一套计算函数导数的技术。AD 利用了每个程序都有一系列算术运算,如乘法、除法、加法、减法等,以及基本运算,如正弦、余弦、指数、对数等。应用链式法则,可以自动地、精确地计算序列的导数,达到工作精度。

一般有正向积累和反向积累两种方式。

  • 前向累加:首先确定与执行微分相关的独立变量,并递归计算每个子表达式的导数。
  • 反向累加:要微分的因变量是固定的,导数是递归地计算每个子表达式的。

目前,这些技术被称为前向传播和反向传播

实施:

  • 源代码转换:它可以在所有编程语言中实现,并且使编译器更容易编译和优化时间。但是,AD 工具本身的实现难度更大。
  • 运算符重载:实数和初等数学运算的对象必须重载,以适应增加的算术计算

6.霉菌素

MYCIN 是斯坦福大学在 1972 年开发的推荐抗生素治疗的专家系统。根据报告的症状和医学测试结果对患者进行诊断[7]。这是一个基于规则的程序,有一系列是/否或文本问题,并提供按概率排列的细菌结果。这是贝叶斯概率和条件概率的基本概念。它是用 LISP(列表处理)编程语言编写的,这种语言是约翰·麦卡锡在 1959 年为人工智能的普遍使用而开发的。

7.波莉

Polly 是第一个使用先进技术和人工智能的计算机视觉的移动机器人。这个机器人与基于行为的机器人一起工作。它是由麻省理工学院人工智能实验室的 Ian Horswill 开发的。Polly 算法是足够有效的,它以非常低的分辨率向前移动像素。

8.深蓝

深蓝是 IBM 开发的计算机,它是第一台在锦标赛中击败国际象棋大师加里·卡斯帕罗夫的计算机。[8]这与诸如单芯片国际象棋搜索引擎、具有多级并行性的大规模并行系统、对搜索扩展的高度重视、复杂的评估功能以及对特级大师游戏数据库的有效使用等伟大的策略一起工作。[9]在 Alpha-beta 剪枝上实现的深蓝是一种搜索算法,用于减少由 minimax 算法在其搜索树中评估的节点数量。

结论

简而言之,人工智能在很久以前就开始了,但现在刚刚成为一项足够成熟的技术。今天我们知道 AI 只是因为更多的数据和更多的能力。研究人员确实带来了新的高效算法,以加快工作速度。人工系统、自然语言处理、计算机视觉、推荐系统已经存在,但只是在最*几年才变得更加强大。

参考资料:

[1]科学日报,“人工智能”,科学日报,[在线]。可用:https://www . science daily . com/terms/artificial _ intelligence . htm。[2020 年 1 月 20 日获取]。

[2]“沃伦·韦弗”,维基百科,2019 年 10 月 16 日。【在线】。可用:【https://en.wikipedia.org/wiki/Warren/_Weaver】T2。[访问日期:2020 年 1 月 22 日]。

[3]“克劳德·香农”,维基百科,2020 年 1 月 17 日。【在线】。可用:【https://en.m.wikipedia.org/wiki/Claude_Shannon】T4。[访问日期:2020 年 1 月 22 日]。

[4] E. Rich,“AILongForSeminar”,2004 年 10 月 4 日。【在线】。可用:http://www.cs.utexas.edu/users/ear/AILongForSeminar.ppt。[2020 年 1 月 20 日访问]。

[5]“亚瑟·塞缪尔”,维基百科,2020 年 1 月 7 日。【在线】。可用:https://en.wikipedia.org/wiki/Arthur_Samuel。[访问日期:2020 年 1 月 22 日]。

[6]“深蓝(象棋计算机)”,维基百科,2020 年 1 月 18 日。【在线】。可用:https://en . Wikipedia . org/wiki/Deep _ Blue _(chess _ computer)。【访问时间:2020 年 1 月 22 日】。

[7] B. J .科普兰,《霉素》,大英百科全书,2018 年 11 月 21 日。【在线】。可用:https://www.britannica.com/technology/MYCIN。[访问日期:2020 年 1 月 22 日]。

[8]“深蓝”,IBM 100——深蓝。【在线】。可用:https://www . IBM . com/IBM/history/IBM 100/us/en/icons/deepblue/。[访问日期:2020 年 1 月 22 日]。

[9] M. Campbell、A. J. Hoane 和 f . hsiung Hsu,“深蓝”,人工智能,2001 年 8 月 9 日。【在线】。可用:https://www . science direct . com/science/article/pii/s 0004370201001291。[访问日期:2020 年 1 月 22 日]。

非常感谢😎

AutoML 准备好投入使用了吗?

原文:https://towardsdatascience.com/is-automl-ready-for-business-ffe4c2d8b5af?source=collection_archive---------45-----------------------

意见

我们还需要数据科学家吗?

AutoML 工具在过去的几年里获得了越来越多的关注,这是由于技术进步和它们被“公民数据科学家”利用的潜力。公民数据科学(Citizen Data Science)是数据科学(DS)的一个有趣(通常有争议)的方面,旨在自动化机器学习(ML)/深度学习(DL)模型的设计,使其更容易被没有数据科学家专业技能的人使用。

在这篇文章中,我们将尝试理解 AutoML,它的承诺,今天什么是可能的?,AutoML 失败的地方(今天)?,它是只针对公民数据科学家,还是对熟练的数据科学家也有一定价值?

AutoML:基于来自 PexelsAndrea Piacquadio 的 pic

AutoML 内部

让我们从机器学习(ML)的非常高级的入门开始。今天的大多数最大似然模型被监督并应用于预测/分类任务。给定一个数据集,数据科学家必须经历一个称为特征提取的艰苦过程,模型的准确性完全取决于数据科学家选择正确特征集的能力。为简单起见,可以将每个要素视为以 CSV 文件形式提供的数据集的一列。

图 1:预测问题的线性回归图解(图片由作者提供)

即使数据集只有一个特征,模型选择过程仍然起着至关重要的作用,因为需要根据数据集分布尝试不同的算法来找到最佳拟合。例如,让我们考虑一个由两列组成的数据集:“薪水”和“经验年数”。目标是根据经验水*预测工资。图 1 显示了问题场景的线性回归图。

然而,线性回归通常是低效的,其他回归技术,例如多项式、支持向量、回归树等。需要尝试找到最适合的。在这种情况下,最佳拟合对应于根据不同度量测量的最小预测误差(模型精度),例如均方误差(MSE);其一个例子是将数据点连接到图 1 中的(回归)线的线的长度的*方的*均值。

给定这个数据集和知识,数据科学家将通过编写程序来对数据集应用不同的回归模型。使用 ML 框架,例如 scikit-learn ,这转化为编写/修改几行代码来实现模型,然后根据不同的误差度量来分析模型的准确性。

# *Training a Linear Regression model* from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)# *Training a Support Vector Regressor* from sklearn.svm import SVR
regressor = SVR(kernel = ‘rbf’)
regressor.fit(X, y)

我想现在您已经了解到目前为止在特征提取和模型选择方面的过程是可以自动化的。这正是 AutoML 工具所做的。

给定一个数据集,AutoML 工具将使用不同的特征集和数据分布应用已知的 ML 算法,在排行榜上显示按不同误差指标(预测/分类准确度)排序的结果。

深度自动化

现在让我们在深度学习(DL)环境中考虑 AutoML。DL 的优点是程序在没有监督的情况下自己选择特征集,即特征提取是自动的。这是通过在大型标记数据集上训练大规模神经网络(称为深度神经网络(DNNs ))来实现的。

图 2:人工神经网络(ANN)架构(图片由作者提供)

训练 DNN 发生在多次迭代(历元)中。每次前向运行都有一个反馈回路,其中在运行结束时识别的分类误差相对于地面实况(训练数据集)被反馈到先前的(隐藏的)层,以适应它们的参数权重——“反向传播”。图 2 中示出了一个样本 DNN 架构。

从实现的角度来说,如果我们要写一个神经网络(NN)来解决前面的‘员工工资’预测问题;数据科学家会使用 DL 框架编写类似下面的代码,例如 TensorFlow

# Initializing the NN
ann = tf.keras.models.Sequential()
# input layer and first hidden layer
ann.add(tf.keras.layers.Dense(**units**=8, **activation**=’relu’))
# hidden layer
ann.add(tf.keras.layers.Dense(units=8, activation=’relu’))
# output
ann.add(tf.keras.layers.Dense(units=1, activation=’sigmoid’))
# compilation
ann.compile(**optimizer** = ‘adam’, loss = ‘binary_crossentropy’, metrics = [‘accuracy’])
# training 
ann.fit(X_train, y_train, **batch_size** = 64, **epochs** = 50)

然而,dnn 的开发和训练非常棘手。通常,DL 模型是由数据科学家团队精心设计的。这种手动设计 dnn 的过程很困难,因为所有可能模型的搜索空间可能组合起来很大,一个典型的 10 层网络可能有大约 1010 个候选网络!因此,设计网络的过程通常需要大量的时间和实验,即使是那些具有丰富 DL 专业知识的人也是如此。

在实践中,这转化为试错过程,尝试上述一些可配置超参数(粗体)的不同组合,例如隐藏层数、每层神经元数、激活函数、优化器、批量大小、训练时期数等。有一些已知的架构,例如人工神经网络—ann(预测)、卷积神经网络— CNNs(图像分类)、递归神经网络—RNNs/长短期记忆网络— LSTMs(时间序列预测);已经证明对于特定类型的问题(在括号中)很有效。然而,除了这些知识和一些预先训练的神经网络的可用性(例如用于图像分类的 ImageNet 为新问题开发和训练 NN 的过程—【NAS】【1】—在很大程度上仍然是一个未解决的问题。**

而且,这也是 AutoML 具有自动化神经架构搜索(NAS)潜力的地方,它通过高效的启发式和分布式计算以加速的方式覆盖搜索空间。

强化学习(RL)已被证明是 NAS 的一种有前途的方法[2],其中控制器神经网络提出了一个“子”模型架构,然后对其进行训练并评估特定任务的质量。该反馈然后被用于通知控制器如何改进其下一轮的提议。这一过程重复了数千次——生成新的架构,测试它们,并向控制器提供反馈以供学习。最终,控制器网络学会将高概率分配给在保留的验证数据集上实现更好准确性的架构空间区域。

AutoML 工具—最先进的

了解了一些 AutoML 内部知识,对 ML/DL 管道有了更好的理解;让我们来看看当前 AutoML 工具的成熟度。

公*地说,AutoML 正处于 DL 几年前所处的阶段——人们对它的期望很高。

Gartner 预计,“到 2020 年,超过 40%的数据科学任务将实现自动化”(链接)。

Forrester 分析师在其 2019 年 5 月的 Wave 报告[3]中表示,“几乎每个公司都将拥有独立的 AutoML 工具。我们预计,随着产品变得更好,以及人们对这些工具如何适应更广泛的数据科学、人工智能和人工智能前景的认识增加,这个市场将大幅增长”。在同一份报告中,他们将 DataRobotH2O.aidotData 列为 AutoML 的三大领先提供商。

CB Insights [4]列出了目前超过 40 家汽车公司。在这里,重要的是要提到,虽然将一个工具标记为 AutoML 现在已经变得很“酷”,但是它们提供的 AutoML 功能(就 ML/DL 算法而言)并没有太大的区别。

今天的 AutoML 工具的“自动化”部分在于它们提供端到端数据科学/机器学习*台的能力——允许你做从开发模型到在同一*台上大规模部署它们的一切事情。

当不同的团队在不同的*台上训练和部署 ML/DL 模型时,AI/ML 从业者将会意识到挑战。因此,今天的 AutoML 工具主要帮助解决许多已知 ML 算法的端到端训练部署问题。

此外,虽然成熟的 AutoML 工具,例如 DataRobot,可能相当昂贵;AutoML 最*变得非常容易访问,更普遍的云*台提供了集成的 AutoML 功能:谷歌云的 AutoML微软 Azure 的机器学习服务AWS Sagemaker AutoPilot 。公*地说,这些工具在现阶段非常有限,仅支持基于基本回归的预测和文本分类。例如,在这个阶段,它们都不支持深度学习(或 NAS),这很可能是由于运行 NAS 的计算开销非常高。

结论

最后,让我们回到最初的问题:“AutoML 是否意味着数据科学家的终结,基本上是对专门数据科学技能的需求?

要回答这个问题,让我们从用户界面开始。对于 AutoML,我们指的是一种工具,它给定一个 excel/csv 作为输入数据,能够以合理的精度输出训练好的模型。是的,目前的 AutoML 工具可以做到。

当模型需要改进时,挑战就出现了。记住,DS/ML 是一个迭代的过程。问题是,您很少会遇到在您提供的第一个数据集上获得非常高的准确性的情况。如果你做了就有问题,或者你的问题太琐碎-😃 所以 AutoML 的问题在它需要改进一个模型的时候就开始了。

让“可解释的人工智能”变得如此困难的推理同样适用于此。AutoML 工具对于为什么一个模型会有这样的行为的理解非常有限。它可以探索输入数据的分布,以指出可以改进的某些数据特征。然而,它将永远不能推荐添加新的数据,例如天气、位置等。会提高模型精度。这是因为它缺乏业务/领域知识。同时,目前缺乏技术知识来发现一种全新的神经网络结构。例如,虽然它可以为人工神经网络推荐正确的隐藏层数,但它的 NAS 将无法推荐添加“记忆”将解决 RNNs 的消失梯度问题,从而导致 LSTMs 的发现。

今天的 AutoML 工具还不适合您的战略用例。然而,它们可以在企业数据科学模型开发的原型/MVP 和探索阶段提供重要的价值。

总的来说,今天的 AutoML 工具远不能取代你熟练的数据科学家——你仍然需要它们。然而,它们可以作为数据科学家的补充或独立的 DS/ML *台,通过自动化构成任何新 DS 用例一部分的许多探索阶段,大大加快他们的工作。

参考

[1]神经架构搜索文献综述,(链接)

[2] Google AI:利用机器学习探索神经网络架构,(链接)

[3] Forrester New Wave:专注于自动化的机器学习解决方案,Q2 2019,(链接)

[4]CB Insights:2020 年值得关注的人工智能趋势,(链接)

[5]比斯瓦斯。伦理人工智能:其对企业人工智能用例及治理的影响,走向数据科学,2020 年(链接)。

AWS SageMaker Studio 自动驾驶仪准备好迎接黄金时段了吗?

原文:https://towardsdatascience.com/is-aws-sagemaker-studio-autopilot-ready-for-prime-time-dcbca718bae7?source=collection_archive---------28-----------------------

带有一些评论的自动驾驶界面演示

丹尼尔·利维斯·佩鲁西在 Unsplash 上的照片

在过去的几年里,我一直在关注企业自动化领域的最新产品。在这段时间里,我看到了十几个应用程序的现场和远程演示。随着竞争对手频繁添加功能和改进界面,这一领域的发展使得保持更新成为一项挑战。最* AWS SageMaker Studio 自动驾驶仪变得可用,所以我有一组商业案例想通过它运行。对于本文,我通过自动驾驶功能运行表格 Kaggle 数据集,并分享用户体验。

一、为什么要用 autoML?

使用 autoML 有各种各样的原因,包括让更广泛的受众可以访问机器学习,便利性,易用性和生产力。我研究的重点是数据科学家建立可重复业务流程的易用性,数据分析师、数据工程师或机器学习工程师可以接管该流程。易用性和丰富的用户界面功能是必须的。

为什么选择 AWS 自动驾驶?

AWS 是个畜生。他们以惊人的速度发布产品和更新。如果你已经在 AWS 生态系统中,尝试一下是有意义的。

AWS 还有一个吸引人的地方是,你可以在使用的基础上使用 SageMaker 和 Autopilot。不需要昂贵的许可证。不过,如果你能关注一下你的账单就更好了。正如我在我的量子计算文章中提到的,这种设置允许个人访问和使用这些高级工具。有一些其他产品有不同的成本结构,使这不可能。

设置

以下所有信息都假设您已经设置了 AWS 帐户,包括账单。如果你是第一次设置你的账户,有一些自由层选项,尽管那只适用于前两个月的 Sagemaker

一旦你有了一个账户,如果你想做实验,你需要命名一个 S3 桶和文件夹。您将把您的数据文件加载到 S3 位置。

数据

只是为了使用一个对每个人都可用的公共数据集,我从 Kaggle 竞赛中抓取了几个数据集。还有一些可能的度量值的范围,您可以用它们来比较您的结果。* * *注意,阅读 Kaggle 竞赛规则详情。有些允许使用 autoML,有些不允许!您可以使用数据集,但不一定要将结果作为条目提交。

我从这两个 Kaggle 比赛中提取了训练数据集,并将它们加载到我的 S3 桶中的不同文件夹中。

矛盾,我亲爱的华生。使用 TPUs 检测多语言文本中的矛盾和蕴涵。在这个入门竞赛中,我们将句子对(由一个前提和一个假设组成)分为三类——T0、T1 或 T2。

6 列 x 13k+行—斯坦福 NLP 文档 n

  • id
  • premise
  • hypothesis
  • lang_abv
  • language
  • label

真实与否?灾难推文的 NLP。预测哪些推文是关于真实灾难的,哪些不是

5 列 x 7503 条独特推文

  • id -每条推文的唯一标识符
  • text -推文的文本
  • location -发送推文的位置(可能为空)
  • keyword -推文中的特定关键词(可能为空)
  • target -仅在 train.csv 中,这表示一条推文是否是关于一场真正的灾难(1)或者不是(0)

开始自动驾驶训练和型号选择

自动驾驶仪在 AWS SageMaker 服务上。他们最*推出了一个名为 Studio 的界面。正是在这里,您可以启动自动驾驶实验。

从 AWS 控制台,导航到 SageMaker 服务。在那里你会找到工作室控制台的链接

作者截图

在那里你可以添加一个用户(你自己)和 Open Studio。

作者截图

这个链接将带你到 JupyterLab 的 SageMaker 工作室。您将看到一个自动构建模型的选项。那是我们想去的地方。

作者截图和 gif

您输入关于输入文件和初始设置的信息。然后你创造一个实验。在这个过程中达到这一步是非常简单的。界面很直观。

作者截屏

用户体验直线下降

好的——那还不错。我们在路上了…..

….这是 UX 团队在发布前冲刺的最后时刻。没有状态栏让您知道处理进行到什么程度。没有迹象表明幕后到底发生了什么。你坐着等待,希望有什么事情发生。

在分析数据步骤之后,您可以访问几个笔记本。

我打开数据探索笔记本,准备好一些像样的信息和可视化。那本笔记本里没有任何东西能提供简单的数据分析无法告诉我的真正见解。你可以在下面检讨自己。

极简数据探索——作者截图

最终,实验进行了,你开始在列表上看到试验。我注意到随着试验的完成和新试验的运行,度量标准也在改进。

作者截图

在测试运行期间,你可以仔细阅读“亚马逊 SageMaker 自动驾驶候选人定义笔记本”本笔记本包含模型调整过程的详细信息。你需要查阅这个笔记本来理解试验和输出。

作者截图

通过回顾这个笔记本,我可以看到模型似乎是 XGBoost 和线性学习者。它指定了您将使用的准确性/成功性指标。“这个笔记本将构建一个 二进制分类 模型,该模型由最大化已训练模型的“ F1 ”质量度量。“ F1 ”度量适用于具有正类和负类的二元分类。它介于精确度和召回率之间,建议在负面例子比正面例子多的情况下使用。”

结果呢

可以在分配给您的 S3 存储桶中找到输出文件。但是所有的文件都是按试验 id 分类的。你必须知道你在寻找什么。

当试验结束时(或者如果您设置了 250 个作业限制,那么您会达到这个限制),其中一个模型有一个小的星形指示器,表明它是试验中最准确的。

老实说,在这一点上,这个界面一点都不直观。我确实看到了一个部署模型按钮——假设通过 SageMaker 部署一个 API。

结论

缺少一个直观的 UI 来方便地访问模型选择和准确性度量,这使得这个工具超出了我的业务用例的范围。自动驾驶仪控制太多了。你可以自己微调,但是寻找你想要的东西的战斗似乎不值得。

我很可能会等待大约一年,并监控 AWS 为 AutoPilot 添加的功能。其他工具如 DataRobot 和 H2O.ai DriverlessAI 在可用性和可视化领域遥遥领先。

先睹为快

我过去评估过 H2O.ai 无人驾驶 ai,并将做一个新的测试来检查他们的最新功能。我也想看看 GoogleML。我对 DataRobot 有丰富的经验,所以不需要单独评估。

以下是其他用户界面的一些截图:

H2O.ai 作者截图

DataRobot 作者截图

数据科学家真的是最性感的工作吗?太好了。

原文:https://towardsdatascience.com/is-being-a-data-scientist-really-the-sexiest-job-around-hell-yeah-b652a20b302?source=collection_archive---------57-----------------------

数据科学领域的职业&人工智能

为什么你应该认真考虑从事数据科学的职业

转子密码机(图片由 skeeze 来自 Pixabay

第二次世界大战爆发时,艾伦·图灵 27 岁,他开始为英国密码破译组织工作,帮助他们破译德国密码。

通俗地说,密码是一种通过将信息转换成代码来有条不紊地伪装信息的系统。换句话说,密码是一种实现信息加密的算法。第二次世界大战期间,密码系统被广泛用于保护战时机密。图灵和他的团队专注于密码分析来解码这些信息。在其核心,这种解码涉及建立反算法解构德国密码系统的工作,最著名的是纳粹德国的恩尼格玛密码机。图灵和他的团队在这方面取得了一些进展。

据估计,图灵的工作将战争缩短了两年多,拯救了 1400 多万人的生命。说说有影响!

有趣的是,在许多方面,图灵的工作,无论是密码分析还是他随后对早期计算系统的研究,都涉及到智能机器的一些初步发展。因此,这确实代表了人工智能本身影响的开端。

如果我们快进到几十年后的未来,有充分证据表明,人工智能的影响只会进一步增加——远远超出了战时的密码破译,进入了我们的日常生活。让我们举几个例子。

数据科学改变 LinkedIn 的增长轨迹

2006 年,LinkedIn 还是一家雄心勃勃的小公司。就在那时,一位年轻的分析师在斯坦福大学获得物理学博士学位后不久,加入了 LinkedIn,成为他们的第一批数据科学家之一。他的名字是乔纳森·戈德曼。他一点也不知道他将会产生多么深远的影响,不仅是对 LinkedIn 的未来,也是对明确确立数据科学对全球公司的重要性的影响。

当时,LinkedIn 已经开始收集大量关于用户的数据,在这些数据中,高盛想到了一个有趣的想法。他意识到,虽然用户加入了网络,也邀请了他们的朋友/同事加入,但仍然存在差距。他们无法与已经在*台上的熟人联系。

他深入研究了关于用户的数据——谁在哪里工作,何时何地学习,与谁有联系,在哪里等等。他根据这些参数,围绕认识一个人的概率形成了假设,并对它们进行了测试。他寻找模式——例如,如果我和 X 一起工作,X 知道 Y,我知道 Y 的可能性有多大?最终,这是高盛打造“你可能认识的人”产品的基础,该产品现在是 LinkedIn 体验中无处不在的一部分。该功能一经发布,LinkedIn 的增长数字就迅速飙升。其余的,正如他们所说,都是历史了。

网飞开创了数据分析的新时代

网飞一直是一家深深植根于数据的公司。你们中的一些人可能记得,网飞最初是一家在线 DVD 租赁公司(在 2000 年代中期转向在线视频流媒体之前)。决定网飞早期成功的一个关键因素是,它能够将客户最有可能租赁的电影放在客户面前,而不是必须搜索整个目录才能找到感兴趣的内容。本质上,这是世界上第一个大规模推荐系统。

但是网飞做了一些改变游戏的事情。对于网飞,对于整个世界。

2006 年 10 月,网飞发起了一场比赛,开始时很谦虚,但很快就像滚雪球一样成为有史以来最大的机器学习比赛。

规则很简单。网飞向成功击败网飞内部电影推荐公司(名为 Cinematch)超过 10%的团队提供了 100 万美元的大奖(或者,技术上正确的说法是,要求将错误率降低 10%以上——RSME)。参与者被给予了大约 1 亿个评级的稀疏分布的训练数据集来构建他们的模型。

比赛持续了 3 年,共有来自 186 个国家的 40,000 多支队伍参赛。

网飞竞赛在应用于优化基于机器的推荐的分析领域带来了深刻的见解和相应的性能改进。它不仅彻底改变了推荐系统,其应用远远超出了电影,它迫使从业者在机器学习应用方面真正突破极限。今天,你很难找到一家企业对消费者的公司不以某种方式或形式利用推荐系统,包括配对!(更多阅读我关于这个话题的文章: 《人工智能能否帮你找到爱情:了解婚介的生意》 )

现在我们已经确定了数据科学和人工智能对人类和商业的不可否认的影响,让我们看看这种影响是短暂的还是持续增长的。简单的回答是——是的,一千次是的——持续的指数增长!但是不要相信我的话。让我们来看看几个硬数据点。

公众的兴趣水*

人们不得不做大量的原始研究或调查来了解公众的脉搏的日子已经一去不复返了。谷歌趋势现在只需点击几下鼠标就能提供这些见解。

具有讽刺意味的是,在这种情况下,数据帮助我们确立了数据日益增长的重要性!

图一。提供了从 2008 年到 2020 年谷歌上三个关键搜索词在全球范围内稳步显著增长的趋势——“机器学习”、“数据科学”和“人工智能”。

图 1:选择关键词的谷歌趋势数据(2008 年 1 月-2020 年 1 月)

专攻 AI 和机器学习的学生

某一特定学科越来越受欢迎的主要指标之一是渴望在该学科接受教育的学生人数。2019 年的人工智能指数报告描绘了几所顶尖大学的这些趋势。图 2a 和 2b 分别提供了【机器学习导论】【人工智能导论】课程报名人数的增长趋势。请注意,大学入学人数也受到座位数量的限制,所以这些图表虽然在最*几年飞速增长,但很可能不足以代表对这些学科的实际兴趣!

图 2a:机器学习导论总报名人数(来源:2019 人工智能指数报告)

图 2b:“人工智能导论”总注册人数(数据来源:2019 人工智能指数报告)

另一个有趣的学生统计数据是博士生人数的增长。根据 2019 年人工智能指数报告,人工智能已迅速成为美国计算机科学博士生最想要的专业。

与第二大热门专业(安全/信息保障)相比,人工智能专业的博士生人数是前者的两倍多!

投资开发人工智能能力

我们生活在一个绝对资本主义的世界里。因此,资金流动的方向几乎总是衡量周围最热门事物的最佳指标之一。因此,我们关注人工智能初创公司吸引的总资金。

从 2009 年在人工智能领域投资 3 亿多美元开始,在不到十年的时间里,情况发生了迅速变化。2018 年,全球共有 404 亿美元投资于人工智能创业公司。这是一个令人难以置信的增长,累计年增长率(CAGR)超过 70%!

PE-VC 对 AI 的总投资(以十亿美元计)(来源:CAPIQ,Quid,Crunchbase,2019)

总结一下——人工智能、数据科学和机器学习已经真正到来。纵观*代历史,这门新兴学科对人们的生活方式和公司的经营方式产生了巨大的影响。这种趋势不仅会持续下去,而且毫无疑问将见证增长率的进一步爆发,从最优秀的人才和大量资金被吸引到这些领域就可以明显看出这一点。

如果有什么时候是进入一个新的职业领域的最佳时机,那就是现在!

大数据正在把我们拖向另一个人工智能冬天吗?

原文:https://towardsdatascience.com/is-big-data-dragging-us-towards-another-ai-winter-95e79c5fefac?source=collection_archive---------69-----------------------

意见

为什么数据囤积是一个问题,我们如何解决它

人们可能很难记住过去几年令人窒息的剪报数量,但人工智能的历史充满了障碍和挫折。记性长的人都记得 70 年代初和 80 年代大部分时间的第一对所谓的“AI Winters”。第一个是对人工智能普遍失望的结果,而第二个,可以说是更重要的冬天诞生了,因为技术和物理硬件远远落后于当时的理论。例如:科学家发明了反向传播的概念,这是深度学习的主干,但直到现代 GPU 大量出现,必要的计算能力才真正可用。

一个人工智能的夏天似乎更好(图片来源:马库斯·斯皮斯克Unsplash

当然,现在情况变了。计算机很容易得到。我们在数据中游泳。政府正在投资研究。本科生正在学习机器学习。媒体将人工智能报道为科技领域的下一次巨变。一切似乎都在朝着这样一个未来发展:人工智能相当普遍,普通公众理解并接受它的承诺和效用。

不幸的是,“似乎”是最后一句话中的关键词。企业正在投资人工智能,但只有大约三分之一的企业看到了投资回报。如果投资回报率仍然难以捉摸,很容易预测投资将开始萎缩,尤其是在全球经济气候因前所未有的疫情而变得不稳定和不确定的情况下。我们将很容易看到气温再次下降,而不是享受上一个人工智能冬季的持续解冻。

但你看,问题不在于人工智能不赚钱或不能赚钱——它赚钱了。例如,大量的过程自动化人工智能项目是成功的。想想那些“阅读”法律文件并提取信息的人工智能,或者那些筛选和处理客户通信或调解账单问题的人工智能。当然,这些不是最性感或最复杂的用例,但它们为公司节省了资金,所以你知道它们不会很快去任何地方。

那么,如果人工智能可以赚钱,为什么只有 35%的公司看到投资回报?一个重要原因是,建立和训练模型的成本仍然高得惊人。好吧,但是为什么是那个?这是因为最*另一个席卷商业——尤其是科技——世界的趋势:大数据。

问问你自己:你听过多少次“更多的数据”是模型变得更好的原因?事实上,那是错误的。高质量的数据让模型更好。有用的、标记良好的数据使模型起作用。拥有大量的数据?这其实并不重要。尤其是在无法证明数据有用的情况下。当你处理我们在这里讨论的数量时,这就很难做到了。

现实情况是,投资者和大数据行业(因为没有更好的术语)一直在宣扬大数据的首要地位。大数据的成本是人工智能成本的巨大推动力。人工智能和人工智能从业者的担忧是,全心全意认为他们需要囤积所有数据的公司(即使他们看不到这样做有任何明显的效用)可能会开始撤回对人工智能的投资,转而支持大数据。但是,首先存储所有这些数据的最大原因是,你可以根据这些数据进行预测并构建人工智能。换句话说,我们实际上处于大数据扼杀人工智能投资的危险之中——矛盾的是,这是它存在的首要原因!

还有一个问题是,小公司受到大数据负担的影响更严重。对于较小的组织来说,存储数据和训练模型的门槛更高。当你将所有这些与摩尔定律已经结束的事实结合起来时,你可以开始看到未来对服务器空间和计算的真正经济竞争。这感觉像是对潜在的人工智能冬天的预测。

那么在这里能做些什么呢?从业者将不得不带头前进。我们需要表达我们的需求,而不是大数据的需求。我们需要投资有助于人工智能盈利的公司和解决方案,而不是那些目标只是组织和结构化大数据的解决方案。我们必须努力让这个行业在经济和环境两方面都可以持续发展。我们必须摒弃拥有更多数据总是更好的旧观念。因为,坦白说,不是的。太多公司囤积数据,却没有多少实际用途。我们需要能够清除那些我们没有理由保留的旧的、无用的数据。我们必须投资于数据质量措施,而不是存放我们数量的地方。

换句话说,为了避免人工智能的冬天,我们需要拒绝大数据,拥抱智能数据。

越大也越聪明吗?—开放人工智能发布 GPT 3 语言模型

原文:https://towardsdatascience.com/is-bigger-also-smarter-open-ai-releases-gpt-3-language-model-adbb8b3b8126?source=collection_archive---------50-----------------------

对更大的语言模型的竞争正在进入下一轮。

图片:www.pexels.com

NLP 应用的进步是由使用 Transformer 架构的神经网络组成的更大的语言模型推动的。值此最*公布当前最大模型——开放人工智能的 GPT-3 的结果之际,我想仔细看看这些进展。

模型不仅仅是带有智能插值方法的巨大“查找表”吗?

2020 年 5 月 28 日,OpenAI 研究人员的一篇论文(【https://arxiv.org/abs/2005.14165】)发表在 ArXiv 上,内容是关于 GPT-3 的,这是一种语言模型,能够在许多基准语言处理任务中取得良好的结果,从语言翻译和新闻文章写作到问题回答。它的特别之处在于,这些结果是在没有对所考虑的基准进行微调的情况下获得的,但是是由语言模型在没有任何进一步信息(零触发)或几乎没有附加信息(“一次触发”或“几次触发”)的情况下获得的。

GPT 3 号有不少于 1750 亿个参数。相比之下,最大版本的 GPT 2 有 15 亿个参数,世界上最大的基于转换器的语言模型——由微软在本月早些时候推出——有 170 亿个参数。

当 Open AI 在一年前发布上一代 GPT-2 时,媒体反响很大,这也是因为宣布不发布最大的型号,因为它可能会产生假新闻等有害的事情。与此同时,用这种模型从给定的上下文中生成新闻不再是什么特别的事情了。然而,正如实验所显示的,生成的文章不仅仅是从训练数据的文章部分拼凑起来的,而是真正新的。

乍一看,这些稿件往往与真实新闻难以区分。在当前的 GPT-3 论文中,一个结果是人们很难将生成的新闻文章与真实的新闻区分开来。在一个实验中,只有 52%的人被正确识别,这接*于切割所能达到的 50%。这也可能是因为一些真实的新闻项目是如此荒谬,以至于分界线不再能够被清晰地划分。

正如我自己对奥地利故事的实验所显示的,

[## 一个 AI 系统怎么看待奥地利?

关于 GTP2 语言模型的一些实验

towardsdatascience.com](/what-does-an-ai-system-think-about-austria-573c2f17ca01)

这些文章在很大程度上是语法正确的,读起来令人愉快,事实听起来很符合逻辑,但当一个人熟悉事实时,往往会被认为是不正确的。

似乎这个模型通过给定的上下文从一种“记忆”中过滤匹配的文章,然后将它们“插入”到一个新的故事中。记忆由大量参数形成,这些参数在用文本数据训练时被优化。GPT-3 在 2016 年至 2019 年期间收集的* 1 万亿个单词的 CommonCrawl 数据集上进行训练,以及与网络文本、书籍和维基百科相关的数据集。

这让我想起了深度学习只是美化了“曲线拟合”的说法,我在之前的一篇文章中讨论过:

[## 看机器学习模型拟合曲线!

图灵奖获得者朱迪亚·珀尔的声明表达了当前流行的机器背后的简单机制…

towardsdatascience.com](/watching-machine-learning-models-fitting-a-curve-c594fec4bbdb)

但这并不是真正的“理解”文本,甚至不是从文本中得出结论。正如这篇新论文中的结果所显示的,GPT-3 模型日子不好过,尤其是在需要真实结论的测试中。

文中一个有趣的实验也是尝试计算作为文本给出的例子,例如:

“48 加 76 是多少?”

由模型计算。这里显示,最大的模型(1750 亿个参数)允许两个或三个数字的简单加法和减法,但还不允许更长的计算。而这又没有为这个任务进行特别的微调!

图表来自论文【https://arxiv.org/abs/2005.14165

好像“查找表”的大小对于较短的计算来说足够大,但是对于较长的计算来说不够大。这些“表格”的数据来自哪里?

在用于培训 GPT-3 的互联网文本中,有足够的这方面的材料。在互联网上搜索这些计算结果会提供如下表格:

截图来自 https://www.dollartimes.com/calculate/percentage/

我的问题是,模型和数据的进一步扩大是否会导致 NLP 应用程序的进一步实质性改进,或者是否是时候引入新的想法和方法了?

CNN 在中分辨率卫星数据上也同样闪亮吗?

原文:https://towardsdatascience.com/is-cnn-equally-shiny-on-mid-resolution-satellite-data-9e24e68f0c08?source=collection_archive---------12-----------------------

Python 中的 Landsat 分类教程

卷积神经网络(CNN)的变体继续被誉为图像相关问题的强大机器学习(ML)算法。CNN 在多个领域获得了前所未有的准确性——基于对象的卫星图像分类就是*年来激增的此类应用之一。虽然基于对象的分类所需的高分辨率卫星图像不是免费提供的,但研究人员经常依赖免费提供的中分辨率数据(例如 Landsat——每个像素代表一个 30 米* 30 米的地块)。CNN 的机制阐明了它考虑相邻像素并依赖于它的模式和纹理,而不仅仅是一次一个像素。

在中分辨率卫星数据(如 Landsat)的土地覆盖分类中,目标是根据不同波段的数字编号(DN)值对每个像素进行分类。当从 CNN 模型的角度来看时,一个明显的问题是,“在确定像素的类别时,位于几个像素之外的*邻或相邻像素的 DN 值会起任何作用吗?”大多数人可能会回答“不”。这是否意味着 CNN 尽管是解决形象难题的有力工具,但在这样的形象上会失败?仅凭假设就下结论太快了。在本帖中,我们将调查 CNN 模型在中分辨率数据上的可用性,在这种情况下,目标识别既不可能也不是目标。

这篇文章被强烈推荐,非常适合地理空间领域的人们,他们想开始他们的 CNN 遥感之旅。

知识不是目的地,而是旅程。所以不要只是为了搜索脚本而向下滚动。👀

使用的数据 这里使用的是 2011 年班加罗尔 Landsat 5 多光谱数据的波段 2 至 6 及其相应的二进制构建层。陆地卫星 8 号或 2A 哨兵将是我们许多人的显而易见的选择,因为它们是最*的,并将在未来继续下去。但是不选择它们的原因是更高的辐射度和光谱分辨率;这将产生比大地卫星 5 号更好的结果。如果我们设法在 Landsat 5 数据(8 位像素深度)上获得好的结果,我们可以在稍加修改的情况下将其扩大到 Landsat 8 或 Sentinel-2A(两者都有 16 位数据);但反过来可能不会很好。要了解更多关于如何为模型创建训练数据,您可以查看这个视频

对于那些在开始之前想要快速 ML 胶囊(受监督的)的人来说,它是在一个实体的几个特征(特征或 x)与其其他属性(值或标签或 Y)之间建立关系——我们为模型提供了大量的示例(带标签的数据),以便它从中学习,然后预测新数据(未标记的数据)的标签。在这里,按照惯例,多光谱数据将被称为要素,而分类构建数据将被称为标注。

多光谱训练数据及其相应的二进制构建层

先决条件 我们将使用 Python 3.7.4 和以下库进行建模(查看此视频了解安装说明):

  1. pyrsgis 0 . 3 . 9—读写 GeoTIFF
  2. sci kit-learn 0 . 22 . 1—用于数据预处理和准确性检查**
  3. Numpy 1 . 17 . 2—用于基本的数组操作
  4. tensor flow 2 . 0 . 0—构建和部署 CNN 模型**

了解数据 数据的分布在为特定目的选择模型时起着重要的作用。下图显示了所有波段中 DN 值的频率。

Landsat 5 多光谱直方图

直方图显示了不均匀的分布,像神经网络这样的模型对这种类型的数据分布很敏感,因为它们自然倾向于赋予具有较高值的特征更多的重要性。例如,频带 6 似乎具有相对大量的具有高 DN 值(高*均值)的像素。如果模型表现不佳,或者如果我们想最后一次提高模型的准确性,那么处理这个问题是值得的,现在,我们绕过对数据的任何更改,专注于 CNN 部分。

A 部分:读取图像芯片并存储为 Numpy 数组

生成用于训练模型的训练样本 生成用于深度学习的训练数据 QGIS 插件将帮助我们在进行模型训练之前生成训练样本并更好地可视化。通常,这是在后端完成的,但是可视化数据及其结构总是有用的,尤其是对于初学者。以下是我在这次迭代中使用的一组参数(如果需要,我们可以随时回来调整这些参数):

用于生成图像芯片的 QGIS 插件的屏幕截图

根据您传递的参数和您的计算能力,这一步可能需要几分钟。我使用了一个 7x7 步长的 7x7 窗口(窗口幻灯片)来生成训练样本,结果产生了 84,972 个图像芯片,足以训练一个 ML 模型,但我们将在接下来的步骤中减少这个数字。通过减少或增加步幅,随意生成更多或更少的图像。点击阅读更多关于插件用法的信息。

现在是编码的时候了!
下面的代码片段按顺序执行以下操作:

  • 将工作目录更改为生成的图像芯片的位置
  • 循环读取图像芯片
  • 在四维 NumPy 阵列中堆叠芯片
  • 显示一些关于数据的基本信息。
**Input features shape: (84972, 6, 7, 7)
Input labels shape: (84972,)
Values in input features, min: 1 & max: 255**

要素的形状显示数据堆叠为四维数组,其中第一个索引是记录的位置,第二个是图像的波段数,第三和第四个分别是图像碎片的高度和列数。
理想情况下,波段数应位于最后一个位置,如下图所示,这是 Tensorflow 对图像碎片的预期方式。稍后我们将着手解决这个问题。

CNN 模型的训练芯片生成模式(5*5 内核演示)

更新日期:2021 年 5 月 29 日

以上部分是为了帮助您理解后端工作流程。如果您不想走 QGIS 这条路,所有的步骤都可以使用下面的代码块以编程方式完成。请注意,以这种方式直接生成图像芯片将导致波段数位于最后一个索引的特征数组。为了使这个代码块与其余部分保持一致,我使用 NumPy 滚动了轴。稍后将使用“tf.transpose”撤消此操作。如果你愿意,你可以删除这个代码块中的‘roll axis’行,并在后面的代码块中‘transpose’行。

将 NumPy 数组保存为文件以便快速访问 根据机器的功率,遍历文件可能会很耗时。为了避免每次运行脚本时出现这种情况,更好的方法是将 NumPy 数组存储在磁盘上。npy 格式)。下面几行将完成这项工作:

b 部分.数据预处理和训练模型

要从第二次开始运行该脚本,可以从阅读。npy 文件。现在,机器学习模型期望相同数量的所有类(这里是两个类)的例子。如果每个类中的训练数据数量相差很大,训练模型就很困难(但不是不可能)。让我们看看我们的数据。

**Number of records in each class:
Built: 10082, Unbuilt: 74890**

*好吧!这看起来并不吸引人。假设我们在稍后阶段通过简单地计算已建或未建预测的比例来计算模型的准确性。如果模型训练不足,并预测一切为未建,它仍然具有 88%的误导准确性(100 正确分类的未建/总记录)。这是因为未构建类中的训练样本数量占了绝大多数。修复这个是强制性的!
下面的代码片段将通过随机选取样本来减少未构建类中的训练样本数量,以匹配已构建类中的样本数量。

**Number of records in balanced classes:
Built: 10082, Unbuilt: 10082**

训练样本的总数已经显著减少,但是仍然比具有极度不*衡的类要好。

数据标准化 缩放数据对于确保*等对待所有特征非常重要,因为神经网络对数据的分布很敏感,如第一幅图所示。数据可以在 0 到 1 的范围内(标准化)或-1 到 1 的范围内(标准化)。我们将假设所有六个波段的最大值和最小值分别为 0 和 255,从而对数据进行归一化处理。下面的代码片段将合并上一步中分离的特性,并将其规范化。

**New values in input features, min: 0 & max: 1**

从数据本身计算最小值和最大值始终是一个好的做法。但是对于卫星数据分类,如果我们希望模型预测其他一些区域的建筑面积,而这些区域的最小值和最大值与我们用于训练的区域存在显著差异,该怎么办呢?这是一场完全不同的辩论,我们不会讨论,也不会继续讨论 8 位数据的最小值和最大值的传统假设。

测试/训练分割 为了能够在稍后阶段评估模型的性能,数据按照惯例被分割成两半,训练和测试。我们将为此定义一个函数,这里的训练测试比例是 60–40。

创建张量 正如我们在开始时看到的,我们的特征数据中的波段数位于第二个索引处。为了能够使用 Tensorflow 建立模型,我们需要将 通道中的数据转换为最后一个索引 格式。Tensorflow 为此提供了一个转置函数,如下所示:**

**Reshaped split features: (12098, 7, 7, 6) (8066, 7, 7, 6)
Split labels: (12098,) (8066,)**

赢得模型的关键是特性工程和构建正确的模型架构。特征工程是为了提取最有意义的信息或增强数据的内容,但这是一个相当大的主题,将在以后的单独文章中讨论。在之前的帖子中,一个简单的神经网络模型在没有任何特征工程的情况下令人满意地执行了组合提取(可能已经成功地建立了波段和组合类之间的关系)。因此,工程输入特征可能并不总是强制性的,它取决于问题和模型的复杂性。这里,我们通过简单地缩放数据(如前一步所做的)来摆脱“特征工程”。

模型的架构需要几周的时间来制作,因此,“你的第一个模型永远不会达到预期”。我只从输入和输出层开始检查基础精度。我继续添加层,并改变每层中的卷积数,以达到接*预期的结果。以下是我的理由:

这里采用的 CNN 模型架构

下面的代码片段将构建模型并对其进行训练。

与大多数深度学习模型不同,我们没有使用池层,它专注于在图像中找到对象。你可以在官方网站上随意阅读模型的每个参数的细节,相当好的记录了

对于神经网络来说,它们记忆训练数据并且不能建立关系是非常常见的,这导致对新数据的不良预测,通常称为过拟合。因此,在训练后,我们使用测试数据交叉检查模型的准确性。

**Confusion matrix:
[[3781, 269],
[252, 3764]]P-Score: 0.933, R-Score: 0.937, F-Score: 0.935**

我们达到的精确度似乎令人印象深刻,对于不同的图像,您将不得不花费一些时间来达到正确的模型架构。为了方便起见,您可能需要添加几行代码,使用下面的代码片段将模型保存在磁盘上(HDF5 格式)。

c 部分.加载保存的模型以预测新的结果

现在,让我们看看模型如何处理新数据。下面的代码片段将:

  • 加载保存的模型,
  • 在存储器中生成图像碎片,以及
  • 重复预测的所有预处理步骤。

下面定义的 CNNdataGenerator 函数可用于绕过我们在图像芯片生成开始时采用的 QGIS 插件步骤。

下图显示了印度海得拉巴一个新区域的预测建筑(红色)。

使用 CNN 模型(7x7 内核)对新数据进行预测。

总体而言,分类看起来不错,但对于混合的堆积像素-置信度值较低。检查 QGIS 中的结果显示,该模型对混合堆积像素不太有信心,这可能是因为它在训练期间没有看到足够的示例。您可以尝试通过减小步幅来解决这个问题,这可能会按比例增加训练功能的数量。另一个选择是使用稍微低一点的阈值来提取所有的堆积像素,这样应该就可以了。

关于我们实现的模型的极高精度,这也是我们的测试集中混合像素数量较少的结果。该模型在预测测试类方面表现良好,因为它们在多维空间中容易微分。然而,该模型很好地学会了区分纯像素的类别,并且似乎在新数据上工作得很好。

我们开始讨论的是中等分辨率数据的内核大小,为了研究这个问题,我使用了另外两个内核大小(3 和 11)。

值得一提的重要一点是,深度学习架构是敏感的,也就是说,我们不能指望完全相同的模型架构在不同的内核大小上产生相似的精度。因此,预计会对体系结构进行一些小的修改。由于当前问题的简单性,相同的模型架构在不同的内核大小上产生了令人信服的结果。

使用不同的内核大小实现的准确性

现在,我们已经从不同的内核大小和来自前一篇文章的人工神经网络模型的输出中获得了最佳结果(至少对于一个基本的 CNN 来说),让我们使用所有的模型预测新的数据,并想象它看起来是什么样子。

对我来说,内核越大,预测的图像越*滑(希望你也能注意到这一点)。来自较大核的输出看起来像 100m 或 200m 分辨率数据的分类图像,这违背了原始图像的分辨率。

在 CNN 模型中,3x 3 内核是最好的选择。总的来说,看起来人工神经网络模型保留了最大分辨率,但是人工神经网络的精度和召回率比目前的 CNN 模型低(0.815 & 0.838);可能是由于不*衡的训练课程和较大的数据量。保留最大分辨率(仅视觉上)并不能简单地得出 ANN 在中分辨率数据方面优于 CNN 的结论,我们相信统计数据!

我们构建的 CNN 模型是一个非常基础的版本,我们只调整了层数和每层中卷积滤波器的数量。然而,还有许多其他更重要的参数(步幅、激活函数、汇集、退出、时期、批量大小、学习速率等。)可以用来解决上述问题——为了避免延长帖子的时间,这里忽略了它们。

如果你觉得这篇帖子有用,不妨找我的另一篇帖子“ 神经网络用于卫星数据分类使用 Tensorflow 中的 Python有趣。请继续关注类似的帖子,了解一些我身边有趣的地理空间信息。 TwitterLinkedIn

完整的脚本、数据和训练好的模型可以在这个 GitHub 库上找到。开放知识万岁!🎓👺

新冠肺炎一级防范禁闭正在净化米兰的天空吗?

原文:https://towardsdatascience.com/is-covid-19-lockdown-cleaning-the-skies-over-milan-42dbba1ec812?source=collection_archive---------25-----------------------

新冠肺炎控制如何影响伦巴第的空气污染水*

Pixabay 上的 JuergenPM

一个多月前,意大利政府在中国以外采取了最全面的措施来应对冠状病毒的爆发,锁定了 T2 人口最多、最富裕、生产力最高的地区:伦巴第。

随之而来的旅行禁令关闭所有非必要的商业和工业对意大利脆弱的经济产生了巨大的影响,但也给了研究人员一个独特的机会来收集数据和研究我们在从未见过的条件下生活的环境

米兰大教堂及其空旷的主广场被封锁。根据《晚邮报》的报道,大教堂广场通常每天有超过五万人通过。(天际线网络摄像头)

事实上,阻碍我们的大部分日常活动几乎抵消了污染等式中的人类成分,并允许我们研究当人类的贡献变得可忽略时环境如何反应,这种方式在正常情况下根本不可能考虑。

我们的日常交流、活动和习惯对我们呼吸的空气质量有影响吗?

每个住在伦巴第的人都可以很容易地回答这个问题,只要看看明亮的天空,享受前所未有的晴朗的星空。然而,作为科学家,我们寻求数据来支持我们的经验,试图解释一个比我们肉眼看到的更复杂的现象。

伦巴第的空气污染

空气污染:它是什么?我们为什么要关心它?

我们把空气污染称为空气中化学成分的不均匀混合物。当我们谈论污染物时,我们可以指气体化合物——如二氧化碳和二氧化氮——以及大气气溶胶粒子,悬浮在空气中的不同直径的固体和液体物质,如 PM10 或 PM2.5

呼吸污染空气的长期健康影响包括心脏病肺癌呼吸系统疾病如肺气肿。即使在较低的浓度下,这些化学物质也具有毒性,长期接触可能会对健康造成影响。例如,PM2.5 颗粒非常小,它们可以在 30 分钟内渗入肺部,导致严重的呼吸问题。

根据世卫组织每年有 420 万人因暴露在环境空气污染中而死亡,而世界上 91%的人口生活在空气质量超过指导限值的地方

索林·格奥尔基塔在 Unsplash

呼吸毒素:为什么波河流域是欧洲污染最严重的地方之一

鉴于这些空气污染物的致命毒性,欧洲联盟已经制定了大量的立法,为空气中存在的许多污染物建立了基于健康的标准和目标。

2019 年米兰在 2 月底前超过了全年法定限额。同年年底,该市记录了 135 天(2019 年全年的 37%)污染水*远高于指导阈值。米兰和一长串城市一样有着糟糕的分数:威尼斯、都灵、布雷西亚、罗提、贝加莫、帕维亚、蒙扎等等。
所有这些城市都位于同一个地理点:****波河流域。截至今天,这里被认为是欧洲空气质量最差的地区。

2020 年 1 月,SeaWiFS 卫星如何观测意大利北部伦巴第*原上空的空气

波河流域被称为意大利工业化程度最高的地区,主要工厂位于都灵、米兰和热那亚之间的工业三角地带。波河流域的大部分田地都被耕种,既供人食用,也用来喂养密集饲养的动物。

波河流域空气污染的大污点确实与工厂汽车集约农业、有关,但也是非常不幸的地理构造的结果。在这片被阿尔卑斯山环绕的*原上,风很少,长时间的逆温事件频繁发生。这导致排放物停留在山谷中,而不是被吹走

croma concept visual onpix abay

空气污染和封锁:初步分析

问题

既然我们介绍了空气污染的主要方面和我们的参考环境的特征,我们可以使用这些知识来收集适当的数据并尝试回答一些问题。

  1. 封锁后空气质量有变化吗?
  2. 怎么变的?哪种污染物变化最大?
  3. 为什么变了?对于这种行为,有数据给出合理的猜测吗?

数据

为了回答这些问题,我们依靠伦巴第地区环境保护局(ARPA)。ARPA 有地面传感器,可以持续监控几个天气参数,如温度、风力、降雨量,以及重要的空气污染指标,如上述颗粒物。数据可以通过这个表格询问。

在同一天的不同地点多次监测污染物。我们构建的数据集对这些观察值进行*均,以获得从 2018 年 1 月 1 日起每天的单个值。因此,执行的分析不是空间分析,也没有考虑昼夜变化。

以下是收集到的特征的摘要:

  • :收集数据的年份(2018、2019、2020)
  • :测量的日子(1–365)
  • 污染物:污染物的日浓度(g/m^3)
  • :日*均风力强度(米/秒)
  • :一天的降雨量(毫米)
  • 温度:当天的*均温度(℃)
  • 封锁:这一天是封锁日(布尔型)
  • LockCount :从隔离开始的天数(0-进行中)

监测的污染物有二氧化氮(NO2)一氧化碳(CO)PM10PM2.5臭氧(O3) (NH3),以及二氧化硫 (SO2)。

协调数据集可在此处找到:

[## detsutut/ARPAdataHarm

这个库包含一个 R 脚本,可以用来合并和协调来自…

github.com](https://github.com/detsutut/ARPAdataHarm)

1)封锁后空气质量有变化吗?

在检查数据之前,让我们先看看来自欧洲航天局的卫星图像:

过去三个月欧洲各地的二氧化氮水*

ESA 的 Sentinel-5 强调了对流层中二氧化氮水*的明显下降趋势。这在波河流域尤其明显,但也影响到西班牙和中欧。类似的行为已经在香港、北京、上海和武汉出现。

这已经表明一些变化肯定正在发生,在一个范围太广而不能仅仅用当地的气候因素来解释的地区。然而,这些变化可能仍然是由于季节性趋势造成的。这就是我们需要核对数据的原因。

例如,让我们看看伦巴第地区过去三年的二氧化氮趋势。

伦巴第二氧化氮污染趋势。黄色区域突出显示了 2020 年趋势与前两年的最小日值之间的距离。

正如我们从黄色突出显示的区域的大小可以看到的,****NO2 下降似乎不仅仅是季节性的2020 年检疫期间测量的二氧化氮浓度低于我们在 2019 年和 2018 年同期经历的浓度
在此时间窗内执行 ANOVA 测试显示,三组之间确实存在显著差异,而 Tukey 的多重均值比较测试表明,这种差异在比较 2018–2020 和 2019–2020 时有意义,而在 2018–2019 时没有意义。

那么,的空气质量在封锁期间发生了变化。

2)空气是怎么变化的?

证明我们现在呼吸的二氧化氮浓度与我们以前呼吸的不同并不一定意味着空气污染因为封锁而下降,也不意味着所有涉及的污染物都在 T2 发生。

让我们测试一下其他污染物。一氧化碳、臭氧、苯、氨和二氧化硫的 p 值也低于显著性水* (0.05)。但 Tukey 对这些成分的测试显示,只有二氧化硫在 2020 年有显著下降。

****

多年来苯(左)和二氧化硫(右)的箱线图。时间窗口:3 月 8 日(锁定开始)—4 月 8 日(记录的最后一天)

PM10PM2.5 的方差分析测试均为阴性,因此这里的猜测是它们这些年来没有太大变化(从统计学上来说:我们不能拒绝测试的零假设,因此说它们这些年来有变化是不安全的**

3)空气为什么变了?

既然我们知道一些污染物在封锁期间经历了前所未有的下降,而另一些没有,不言而喻,理解为什么会发生这种情况会很好。

这确实是一个微不足道的问题。相关性并不意味着因果关系,而且有太多的因素被包括在内,以至于真的很难评估这种下降的直接因果路径。因果关系还需要对主体的深刻理解,这在这里根本达不到。

然而,我们仍然可以使用相关性和文献来做出合理的猜测,排除尽可能多的压力因素。

2018-2020 年期间空气污染物和气候因素的相关图。

****方差分析倾向于排除季节性趋势是这些空气污染下降的主要原因,但它们仍可能是由于当地气候因素。相关表清楚地表明污染物与风、温度和——对于 PM10 来说—降水量有显著的负相关性。然而,在 2018 年、2019 年和 2020 年的 2 月和 3 月进行的一些测试显示,气象条件在这些年里基本相同

从 1 月 1 日到 4 月 6 日的降雨(绿色)、风力(紫色)和 no2(橙色)的标准化观测值。no2 水*和降雨之间没有相关性,但我们发现风和 NO2 之间有轻微的相关性。然而,这还不足以完全解释 NO2 的大量下降。

鉴于我们没有经历重要的局部气候变化,我们剩下的就是人类活动。人类活动以多种不同方式广泛造成空气、土地和水污染。

空气污染的来源(英国政府

相反,从我们看到的气候因素来看,绝大多数这些密集的人为活动在全国关闭后面临着历史性的下降。禁止通勤意味着周围的车辆更少,意味着氮氧化物、颗粒物、一氧化碳和苯更少。封锁工厂意味着更少的工业流程更少的能源消耗(同样,更少的道路和非道路运输)。****

在我们分析的所有原因中,人类活动的强度是唯一与前几年相比发生重大变化的参数。这是封锁的直接后果,并允许我们合理猜测隔离对我们呼吸的整体空气质量的积极影响

三月份每辆车行驶的公里数。封锁后,公里/车数量急剧下降。(ARPA)

假设封锁是空气质量改善的主要原因,我们仍然必须为那些浓度在隔离开始后没有太大变化的污染物找到合理的解释。考虑到不同的人类活动排放不同的污染物,并且并非所有的活动都以同样的方式受到封锁的影响,这是有动机的。

例如,让我们考虑一下颗粒物质。在这里,住宅和商业燃烧在排放中起着重要作用。关闭工业减少了商业成分,但增加了住宅成分,因为人们现在大部分时间都呆在家里。这可能导致排放从商业来源向住宅来源转移,尽管已经锁定,但仍将 PM10 和 PM2.5 锁定在*均水*附*。
另一个相关的例子是 NH3
农业是氨排放的最大来源:到目前为止,欧洲超过 90%的 NH3 排放来自动物养殖、粪便处理和合成肥料。农业活动没有像工业活动那样遭受严重的封锁,这可能解释了为什么氨没有下降这么多。

结论

在复杂的环境中研究正在发生的现象从来都不是一件容易的事情。然而,的统计数据提供了聪明的工具,帮助我们在制定合理的猜测,以便在未来验证或拒绝。

在这篇文章中,我们将我们的猜测集中在伦巴第的空气质量上,展示了与前几年同期相比空气质量是如何显著改善的。****

虽然空气污染的年内下降可能与季节性现象有关,但一年内统计上的显著下降需要进一步解释。由于我们没有发现当地气候因素的相关变化,唯一似乎发生巨大变化的是人类活动,由于新冠肺炎实施封锁,人类活动在上个月受到了极大的限制。尽管如此,并不是所有的活动都已经完全停止,一些污染物如 PM10 和 NH3 仍然保持在高浓度水*。

我们因此声明新冠肺炎的封锁可能事实上是伦巴第上空的空气看起来前所未有的干净的原因。****

****更新 * ***

ARPA Lombardia 公布了一项 初步调查的结果 关于气压因素的变化和空气质量趋势数据所产生的限制性措施出台以对抗病毒的传播。这项调查似乎证实了整体空气质量的改善和国家封锁之间的联系。

参考

编者注: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

** [## Tommaso Buonocore -作者-走向数据科学| LinkedIn

查看世界上最大的职业社区 LinkedIn 上 Tommaso Buonocore 的个人资料。托马索列出了 5 项工作…

www.linkedin.com](https://www.linkedin.com/in/tbuonocore/)**

数据科学适合你吗?

原文:https://towardsdatascience.com/is-data-science-for-you-6cbe995ad349?source=collection_archive---------58-----------------------

克里斯·卡里迪斯在 Unsplash 上的照片

你可能已经知道答案了。

跟着感觉走

想想一个国家。

你想到了哪一个?法国?巴西?澳大利亚?

现在仔细想想这个。答案从何而来?你感觉到它突然出现在你的脑海里了吗?

作者山姆·哈里斯用这个问题来强调这样一个事实:我们不会“选择”很多,甚至可以说是任何看似有意识的决定。我想说的是,在回答这篇博文标题中提出的问题时,同样的潜意识决策过程已经在起作用了。

总的来说,我并不是一个非常直觉的人。我倾向于带着过度复杂的思考来处理生活中的重大和次要决定,有时甚至会在电子表格中记录不同的选项(当我输入时,这听起来很可笑)。然而,有时候你的直觉(嗯,你的潜意识)会给出一些相当不错的答案。

几年前,我发现自己在一个工程部门工作,做一些与科学设备开发相关的工作。我喜欢这份工作,但有些地方不对劲。

我是从物理学背景慢慢进入这个角色的,起初,当公司很小的时候,我能够成为一名工程通才。我真的很喜欢那段时间,能够做任何事情,但是随着公司的成熟,我周围的专家越来越多。我突然和机械工程师、软件工程师和电气工程师一起工作,他们只做那些事情,不关心其他事情

我羡慕他们。他们似乎都有一个激光聚焦的愿景,他们想做什么与他们的职业生涯,绝对没有兴趣转向他们的核心领域之外。另一方面,我开始承担越来越多的项目管理责任。毕竟,我处在一个独一无二的位置,对每件事都略知一二,但对做严肃的、动手的专业工作却知之甚少。我当监工是有道理的。

尼古拉斯·托马斯在 Unsplash 上拍摄的照片

有一天,我决定如果我要全力支持工程师们,我应该增加我在他们领域的知识。我首先选择了机械工程,并完成了基本的 SolidWorks 资格认证,然后继续复习我的电子学。我报名参加了一门课程,并保证在业余时间学习这门课程。

然而,几个月过去了,我发现自己经常找借口解释为什么“今天不适合”上这门课。我也尝试过电子项目,但还是进展缓慢。

事实是,我对工程没有任何热情。我感到非常困惑,不知道该怎么办。

数据的力量迫使我

然后,在一天下午的会议上,我无意中听到有人谈到一位同事正在研究“一种算法”,但却很难找到时间来完成它。我不知道这到底意味着什么,但它的某些东西引起了我的兴趣。

Carlos MuzaUnsplash 上拍摄的照片

我找到了那个人,和他谈了这件事,问我是否能参与其中,他很高兴地把整件事都交给了我。这是我第一次体验到我后来发现的简单的机器学习算法。在我意识到之前,我正在努力学习 Coursera 数据科学专业。我在午餐时间愉快地完成了课程。晚上都浪费在这上面了。我发现自己爱上了统计学,这是我在学校讨厌的一门学科,因为它完全没有任何现实世界应用的意义。

我说的不是头条新闻,前沿新闻。当然,我后来做了关于深度学习和大数据的课程和项目,但我也喜欢更*凡的东西。我真的喜欢运行 t-test,或者清理数据,或者制作一个非常好的图。这听起来可能有点悲哀,但我永远也不会理解为什么有人会去看板球比赛。我猜每个人都有自己的想法。

就这样。有一天我突然意识到我找到了我想做的事情。物理学和工程学曾经很棒,但是这种感觉就像是一种爱好。从那以后我再也没有回头。

(为我)做出决定

关键是,我并没有有意识地做出这个决定。这并不是职业机会和工资等级经过计算和合理划分的结果。它不是基于对行业和公司的仔细研究。这感觉很好,很有趣。

所以,我给你的建议是。如果你正在考虑进入数据科学,或者你已经进入了,而这不是你的感觉,它可能不适合你。如果你从事数据科学是为了荣誉、金钱或只从事超级酷的人工智能项目的想法,你可能需要再想想。

毕竟,可能有你喜欢的东西,如果你打算一周做几十个小时,甚至几十年,难道你不想找到它吗?

尽可能多地探索各种途径。你会知道什么时候有进展。不要担心你的年龄。不要担心必须学习大量的新东西。不要担心抛弃其他领域的成熟技能(无论如何,它们可能会派上用场)。从长远来看,你会更快乐。

祝你好运。

数据科学很难吗?

原文:https://towardsdatascience.com/is-data-science-hard-20a159f1e5e9?source=collection_archive---------31-----------------------

诚实的现实生活视角

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

在我的职业生涯中,我领导了许多分析转型,使组织能够进入高级分析和数据科学领域。这包括领导技术团队和教育业务主管。一个很常见的问题是:

“[数据科学]难吗?”

我来自一个量化背景,并取得了精算师资格。我职业生涯的早期是在“非传统的”精算学科中度过的。然后,我偶然进入了数据和分析领域,这一领域在数字和技术转型中蓬勃发展。

在我早年,大多数统计模型都已经建立起来了。我们的主要责任是确保其假设和调整因素得到更新。

向前看,大多数预测模型都引入了 AutoML(自动机器学习)的概念。这包括基于某些业务用户设置的自动模型选择和校准。

如果全部自动化,数据科学家的实际作用是什么?还有,怎么会这么难?

模型设计

每个模型都高度依赖于输入配置。例如,什么是因变量,什么是输入范围变量,我们想要一个通用的还是特定的模型,等等。

虽然 AutoML 编排了这一过程,但人类的决策仍然存在。然后,数据科学家应该理解底层的统计模型机制、假设和原则。这确保了所选模型的行为符合预期。

业务相关性

数据科学模型是为解决业务问题而构建的。数据科学家负责模型根据业务流程工作。处理数学的是商业职业,而不是处理商业的数学职业。

除了模型构建,数据科学家还需要宣传和提升组织的数据素养。这包括诸如模型透明度、模型数据谱系和模型理解等领域,以增加组织数据的可信度。

数据清理

在我多年的经验中,寻找干净的数据是一件很难的事情。我相信这是一个旅程,需要一个明确的过程来不断改进和整合。

数据科学家预计将在数据清理中发挥重要作用。“90%的时间用于数据准备,10%的时间用于建模”这句老话仍然适用。按照我上面的推理,高管信任了解业务的数据科学家。这是数据管道中每个人的责任,包括数据工程师和报告分析师,也是他们的责任。

模型货币化

对于组织来说,模型应该被视为一种资产。对于任何资产,都需要治理和维护。此外,它需要用于各种用例,而不仅仅是单一用途。

例如,我们为我以前的一个客户创建了一个客户流失预测模型。除了识别有风险的客户,我们还将其用于客户参与细分,并作为信用风险记分卡的输入。构建一个并重用许多将为任何资产带来更高的 ROI,这将为其他模型开发促进更多的用例。

“数据科学很难吗?”

数据科学家需要很好地掌握数学、业务和技术。那些认为坚实的定量学位就足够了的人,会发现在商业环境中茁壮成长很有挑战性。那些有正确关注点的人将能够拥抱数据科学之旅,并带着其他人一起同行。

如果你喜欢这篇文章,并希望看到更多的内容,请考虑加入媒体会员,使用下面的链接来支持我和其他作者:

[## 通过我的推荐链接加入 Medium-Albert Suryadi

阅读艾伯特·苏亚迪(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接支持…

albertsuryadi.medium.com](https://albertsuryadi.medium.com/membership)

如果您想了解更多实用且有影响力的数据分析主题,请查看我的其他文章。如果你有进一步的问题或话题建议,请随时通过 LinkedIn 联系并进一步留言。

关于作者:Albert sur yadi是蓝筹组织中实现高级分析和数据科学能力的公认领导者。他被公认为分析团队(实践社区)的领导者,该团队授权并激励他人超越现状。

数据科学正在与数据工程融合吗?

原文:https://towardsdatascience.com/is-data-science-merging-with-data-engineering-d992aaf90d95?source=collection_archive---------28-----------------------

苹果 | 谷歌 | SPOTIFY | 其他

肯尼宁上 TDS 播客

背景图片由兰斯格兰达尔

编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:

有很多关于数据科学未来方向的讨论,这是有充分理由的。这一领域终于进入了自己的时代,随着 2010 年代中期的狂野西部阶段真正结束,数据专业人士非常有兴趣保持领先,并了解他们的工作在未来 2 年、5 年和 10 年可能会是什么样子。

在所有的噪音中,一个趋势正在明显出现,并且已经在很大程度上实现了:随着越来越多的数据科学生命周期被自动化或抽象化,数据专业人员可以花更多的时间以更具战略性的方式为公司增加价值。做到这一点的一个方法是投入时间深化你的专业知识,并掌握等式的业务方面。另一种方法是在技术技能上加倍努力,专注于拥有越来越多的数据堆栈——特别是包括生产和部署阶段。

我今天这期《走向数据科学》播客的嘉宾已经走上了这两条路,首先是作为 Spotify 的一名专注于业务的数据科学家,在那里他花时间定义业务指标和评估产品,其次是作为 Better.com 的一名数据工程师,在那里他的重点已经转向生产和工程。在我们的聊天中,Kenny 分享了他对每种方法的相对优点以及该领域未来的见解。

以下是我们谈话中我最喜欢的一些带回家的东西:

  • 即使是专业的数据科学家也对复杂性有强烈的偏见。毕竟,大多数数据科学家进入这个领域是因为他们对机器学习算法的力量感到兴奋,并倾向于任何应用这些系统的机会,即使在没有被要求的时候。出于这个原因,组织需要这样的人,他们的工作是确保数据科学解决方案不会被过度设计,并确保真实用户和客户的实际需求优先于疯狂的堆叠模型和神经网络。这些人被称为产品经理。
  • 当大多数人听说“简单”模型效果最好时,他们会认为这意味着“逻辑回归是你应该首先尝试的”。但在现实中,即使是基于规则的系统也可能足够好——它们还有一个额外的好处,那就是迫使构建它们的人深刻理解他们正在解决的问题。出于这个原因,雇主经常寻找的一项技能是你决定何时机器学习是不必要的能力。
  • 最*,Kenny 从 Spotify 中以业务和人员为中心的角色转变为全职数据工程师。他这样做的部分原因是为了成为一名更好的领导者:尽管他倾向于更喜欢人的问题而不是技术问题,但经验告诉他,最好的想法来自于技术领域。
  • Kenny 强调了构建全栈产品的重要性,即使你是新手,只是想打入这个领域。我们在之前的几集里已经讨论过全栈数据科学的重要性(我也写了一篇关于关于这个话题)但是它值得再次强调:即使你没有工作经验,你也可以将模型部署到 AWS 或 Google Cloud,并且理解使用 Docker 的容器化,或者使用 git 的版本控制。这些正迅速成为数据科学就业市场的新核心生存技能。
  • Better.com 在招人!你可以点击查看他们的数据科学职位招聘

你也可以在这里的 Twitter 上关注肯尼,在这里关注我

数据科学的成功超越了技术

原文:https://towardsdatascience.com/is-data-science-really-a-technology-business-99bbcc5534b?source=collection_archive---------42-----------------------

复杂的算法光芒四射,由丰富的数据推动…但在更个人化的东西上蓬勃发展

我们做的第一个专业分析项目获得了巨大成功。随之而来的是认可、机遇……以及某种程度上错位的自信。

这让我们相信,通过稳健的方法、正确的工具选择和系统的数据分析,我们可以了解事情是如何运作的,并提供一个有人会付钱给我们的结果

我们错得多离谱。

当最初的裂缝开始出现时,我们自然倾向于从工程缺陷开始。

错误的机器学习算法……糟糕的数据库选择……薄弱的界面……设计糟糕的数据处理……令人困惑的仪表盘……这些因素会阻碍我们追求的无缝客户体验。

但是数据科学可能会让人不知所措

网上如此多的技术内容不断让你怀疑你是否选择了正确的方法…以及正确的软件。

当新产品承诺在没有前期成本的情况下取得巨大进步时,它会刺激探索。而且有被转移的危险。

这可能需要一个僧侣的纪律来抵制潜入张量流的诱惑,其谷歌遗产和美味的口号“一个完整的生态系统来帮助你用机器学习解决具有挑战性的现实世界的问题”

现在,如果时间不是短缺的话…而且是不可恢复的。

超越工程

最终,我们被迫质疑我们在其他领域的局限性。

也许我们的营销很差。也许我们正在解决一个不相关的问题。或者我们沟通得不够清楚。

毕竟,在短短的几年里,我们已经被那些无处不在的“十大数据科学失败”列表中突出的许多痛点所烫伤。

即使知道这一点也被证明是令人沮丧的——有太多的原因、太多的解决方案、太多的修正、太多的细节……而我们拼命寻找一个共同的线索。

简化一个威胁着我们的世界。

有共同的联系吗?

在经历了足够多的失败、不寻常的成功和多次应用建议的尝试后,圆点开始出现。

当我们试图加入他们时,我们发现在很大程度上,他们都绕过了人类动态,即数据科学和分析的概念…数据中有意义模式的发现、解释和交流过程(维基百科)。可能只是关于人和关系。

John Thuma 在他的思想文章中提到了这个问题。他推断,数学和数据科学的复杂性可能会出现在理解的人和不理解的人之间的交流中。

如果没有共识,企业或项目在分析工作中取得领先的机会有多大?

错综复杂的需求网

我们刚刚花了数百个工时构建了一个 4G 移动网络交通拥堵预测模型。

这来自一个简短的陈述“我们需要你根据一周的历史数据来预测交通拥堵的可能性,这样我们就可以改善交通管理。”

在接下来的几周里,我们在多次会议上展示了我们的解决方案,并努力解决一些抛给我们的问题。

业务案例负责人 —这些预测在 6 个月内的价值是多少?(“这个问题很合理,但你不应该先问问你的团队吗?”我们默默地想)

中层经理 —营销部门想知道有多少用户在拥堵期间受到影响。(“网络供应商不会更了解吗?”)

项目经理 —投入生产需要多长时间?(“终于有我们能回答的了!”)

技术架构师 —我们需要预测未来 6 个月的流量模式。(“打住,这不是另一个问题吗?”)

技术负责人 —网络容量将在 3 个月内增加,预测也是如此。(“啊啊啊!”)

我们的答案“我们测试了一个模型,可以预测 70%的拥堵准确率”显然不够完整

令人难以置信的是,没有人关心预测准确性、潜在偏差、数据完整性和样本大小……忘记我们非常想解释的 K 均值辅助非线性回归模型吧!

相反,所有的道路似乎都通向“你的黑匣子应该能告诉我我想知道的事情”

这不是第一次了…

技术的作用

我们不情愿地得出结论,在我们的工作中,拥有一个有效的数据科学解决方案仅仅是一个赌注…仅此而已。

它只是允许我们听到桌上真正的问题……这些问题似乎只有在建立了足够的信任后才会出现。

这些问题提供了关于业务及其人员的状态以及内部关系的更多背景信息。

在这一点上,有人可能会嘀咕:“这到底是从哪里来的?”到了高耸的山峰,以前看不见,挡住了前进的道路。

突然之间,Gartner 的和其他的人不断抛出的 80%的数据科学项目失败率听起来毕竟不是编造的。

我们希望我们已经知道的

当涉及多方时,如何知道他们脑子里到底在想什么?

什么样的商业甚至个人背景影响了人们所说的话?

这与他们对你和你所代表的东西的看法有什么关系?

在团队层面上,如何从字里行间去理解同一个团队中人们之间的互动?

感受一下“这会让我看起来更好吗”有多重要?

鉴于通常有限的互动量,有可能得到更多的答案吗?

数据科学透视

似乎这些年来,我们一直忙于解决技术问题,以至于失去了一点人性。

或许……有没有可能……数据科学,这个被大肆宣传和吹捧的复杂算法、尖端软件和富有洞察力的数据领域,真的是一个人的行业?满载技术干扰?

这让我们有些害怕,因为突然之间,这不再仅仅是掌握技术、优化管道或提高精度…这些我们可以控制的事情!

在数据科学领域取得更大成就的秘诀是什么?

它可能只是我们与人联系、建立关系、说共同语言和理解他们来自哪里的努力。

(2020 年 1 月)冬日里的救生员巡逻,南加州海滨

深度学习是不是碰壁了?

原文:https://towardsdatascience.com/is-deep-learning-hitting-the-wall-d2f560419daf?source=collection_archive---------71-----------------------

深度学习——人工智能的钻石

深度学习。由我们的设计师重新设计的 照片 。我们拥有这张照片的完全独家完全许可..

在越来越多的机器学习(ML)相关项目、简化的 ML 框架和环境以及云中预先打包的 ML 解决方案的世界中,失望的声音越来越多。

这种不断增长的声音来自该领域的顶级专家,因此我们 Avenga Tech 希望花一点时间来分享我们对深度学习是否真的碰壁的看法。企业 AI 目前的状态是需要再一次重大突破,还是可以用现在的技术不着急?

Avenga 在数据科学尤其是深度学习方面拥有丰富的专业知识。所以,我们在这里帮助你理解当前情况的原因和实际影响。

这是什么

AI 已经不恰当但肯定地成为了机器学习的代名词,机器学习几乎总是与深度学习有关(也是错误的,因为有更多的技术),深度学习通常与卷积神经网络(CNN,一种学习如何识别和分类输入数据中的模式的人工神经网络)有关。

对于一组给定的问题,通常是模式识别,深度学习能够实现非常高的准确性、相对快速的学习,以及快速和低资源的模型执行,包括移动电池供电的设备。由于算法优化,以及利用 GPU 甚至更专业的硬件(即 TPU)的并行向量计算的巨大进步,几十年前的想法变得触手可及。

深度学习革命使得在实现之前不可能的事情变得流行起来。

成功案例

人脸识别。由我们的设计师重新设计的 照片 。我们对这张照片拥有完全的专有权。

计算机视觉就是其中的一个应用——拿起你的手机,它会以极高的速度和准确度识别你的脸(T21 ),并解锁手机。达到这种性能和质量水*需要很多年。

语音识别 —和你的数字助理说话——语音识别百分比非常高。它可能没有答案,也无法像人类一样进行对话,但识别已经非常准确了。

语音合成 —开车、跑步、上下班,声音是交流的唯一选项。语音合成的进步如此之大,以至于越来越难从真实的人声中识别出计算机生成的声音。

自然语言处理自动翻译——今天还不完美,但比几年前好得多。今天任何语言写的网络文章,一键就能看懂。

精选电脑游戏 — AI 赢棋,然后围棋,然后是星际争霸 2 游戏。进步是显而易见的,并且登上了新闻的头版。

ML 项目的数量在增长,机器学习专家越来越难找到。

在某种程度上,许多人认为,由于这些成功,我们将走向更通用的机器智能。只是给算法更多的数据和计算能力;一切都解决了!

失望和对更多的渴望

机器学习。由我们的设计师重新设计的 照片 。我们对这张照片拥有完全的专有权。

我们不断看到非常疯狂地缩小人工智能优于人类的领域,以人工智能(AGI)领域为代价,人工智能远远落后于人类的能力,似乎根本没有进步。

系统在很大程度上依赖于人类向它们提供大量的数据(比人脑需要的多几千倍),执行大量的手动数据标记,并提供反馈。

即使这样,在数据集上训练并通过所有测试的模型,突然在不同的数据输入集中失败,原因不明,通常是在人类可能会犯错误的完全不同的场景中。例如,在著名的图像识别例子中,狼因为白色(雪)背景而被识别为狼,而当背景是绿色时就失败了。

另一个已知的问题是学习过程本身。基于过去的大量数据或实验室中准备好的数据→当一个模型面对一组新的真实世界数据时,它通常会失败,这个过程会再次重复。

例如,有时曼梯·里不认得我们的脸,以一种几乎不可能的理由让我们进去;正如我们在手机和笔记本电脑上不时体验到的那样。

仍然是人类定义了高级概念,比如动物的种类。DL 仍然处于非常低的水*,更高层次的概念支持很差。

DL 是在碰壁吗?用顶级数据科学家的话说似乎是这样。几年前,这似乎很容易。随着越来越大的数据集和更多的 TPU/GPU/CPU 能力,我们能够解决更多的人工智能相关问题。现在有更多的怀疑,新的做事方式有望被发现。

例如,汽车公司承诺自动驾驶汽车的日期为 2020 年或 2030 年,现在他们不再承诺自动驾驶汽车将成为可能。另一方面,人们只需经过几个小时的训练就能开车,并能正确识别他们以前没有见过的物体和情况。

DL 当前状态的另一个问题是,一方面缺乏可预测性,另一方面缺乏可解释性。大多数时候它运行得很好,但是人们想知道为什么。尤其是当 DL 被用于决策过程时——人们总是想知道为什么。目前,即使是顶尖的科学家也承认他们自己也难以解释网络的行为。

当前的算法集是在没有考虑这一需求的情况下构建的。就像黑盒一样,一些科学家声称将它们变得更容易解释会大大削弱它们的有效性。

更快、更好、更便宜并不聪明

DL 被期望在消耗更少能量的同时,基于更少量的数据更有效地学习和更快地概括。

人工智能,数字逻辑或其他什么,被期望发现,找出高层次的抽象,并从分布概括,领域和关系中完成它们。人们期望人工智能对世界有更好的了解,有类似人类的感知能力,并最终拥有“常识”。

现在可以说,DL 识别各种模式,但它不理解它们,因此它碰壁了。

一些科学家建议从头开始(就像新版本的进化算法),并认为 DL 是一个死胡同解决方案。其他人看到了一条道路,就像从 DL 的当前状态向更通用的机器智能的迁移。科学家们也在关注自然,比如认知过程是如何工作的以及为什么,特别是在神经进化算法中,不仅网络本身的权重发生了突变,网络结构也发生了突变。也许元算法,设计算法的算法,就是答案?

让我们问问我们的专家

我们的机器学习科学家,有实践经验,分享他们的观点。

Lyubomyr Senyuk,研发总监& D
Olena Domanska,ML 能力主管

问:是深度学习本身有问题,还是深度学习实现的现状有问题?

让我们以语音合成和机器翻译为例:如果你去直截了当你得到一个丑陋的结果。生成的语音没有语调,真的很难听。你听得懂单词,但更复杂的语言结构却不存在,你的大脑努力识别声音在说什么。哪个是主要的,哪个是次要的?在翻译人员中,我们也有类似的情况。没有“理解”文本是关于什么的,就不可能翻译文本(除非用真正相*的语言)。然而,有统计机器翻译的 DL 技术可以给出令人印象深刻的结果,它们甚至可以进行交叉翻译;即日语到波兰语,仅具有在日语-英语和英语-波兰语上训练的模型。语音生成模型可以建立在类似的原理上,并且它们给出的结果更好听,但是在复杂的句子和真实人类使用语调的主题上,附加的解释元素 DL 语音合成模型通常失败。同样的情况也发生在译者身上:如果上下文超出了几个单词,这个模型就失败了

所以,DL 目前的状态在这里肯定是失败的,但关于 DL 本身很难说这一点。也许加入一些小的特征,可以让神经网络在运行中改变自己的拓扑结构,这将极大地改变这种情况,我们只需要将计算机的能力提高 100 倍,就可以达到可行的学习曲线,让这样的神经网络去模仿,例如 10 岁的人。

“思维机器”的概念并不新鲜,也就是说它们没有明确的指令。深度学习试图通过在人工神经元中使用数学矩阵操作来模仿人脑。尽管生物神经元激发了 DL 的想法,但人工神经元是一个简化得多的版本。世界上最大的神经网络由 1600 万个神经元组成,相当于一只青蛙的大脑大小。深度学习只是人工大脑思想的一种实现,它在大小、拓扑结构、信号处理和结构方面都有局限性。现在,我们甚至不明白人类的大脑是如何如此有效地工作的,我们也不明白一般的智力是如何工作的。如果我们发现了,DL 会怎么样?我们是否会想出一种新的方法来实现大脑,作为一台机器永远活着的想法将成为现实?让我们看看。

问:DL 真的碰壁了吗?

即使在创建了假设的类似人类的 NN 之后,我们也应该思考与它交互的方法。在这里,我认为,目前的 DL 方法肯定会碰壁。在给这个像虚拟生物一样的人类提供了大量数据,却没有对其决策做出合理解释之后,这绝对不是我们想要的。

深度学习仍然有着自始至终都存在的障碍:用于训练的标记数据量和计算能力。直到十年前,DL 还被该领域的大多数研究人员认为是一个死胡同。虽然第一个 CNN 是在 20 世纪 80 年代创建的,但直到从 CPU 上的计算切换到 GPU,允许多线程和更快的计算,它们才取得进展。CIFAR-10 和 ImageNet 数据集的创建带来了另一个提升。谷歌开发的用于执行张量计算的 TPUs 进一步推动了这一领域的发展。当前的 GPU 和 TPU 比以往任何时候都更强大,但增长速度不如以往。因此,我们接*“天花板”是一个合理的假设。然而,还有一项技术我们必须牢记在心——量子计算。它可能会在总体上改变和加速计算,但深度学习可能是受这项技术影响最大的技术之一。

最*,自然语言研究已经采用了一种新的范式:自我监督学习或自主监督学习,它使用大量的现有文本来预训练模型的参数,而不需要数据注释。人类可以从上下文中确定单词的语义。类似地,Word2Vec 算法根据周围的单词预测单词的语义上下文。自我监督学习遵循相同的原则,并使用自然可用的上下文。这种技术有可能解决 DL 的一个重大限制,但是需要大量的训练例子。

此外,就在几个月前,研究人员提出了一种更智能、更简单的训练神经网络的方法,称为彩票假设。主要思想是,一个大型神经网络将包含一个较小的子网,如果从一开始就进行训练,将达到与更大的结构相同或相似的精度。这个假设可以减轻 DL 的计算开销。

这个领域是如此年轻和受欢迎,以至于它的研究人员不断提出新的范例和架构。在最受欢迎的子领域:NLP 和 CV 有持续的改进。已经出现了令人惊讶甚至危险的结果,例如通过替换看起来和听起来像真实事物的面部或音频记录来伪造视频的能力,制作静止图像的动画,以及生成创造性的虚构文本、诗歌或其他文学艺术。

也许进展缓慢,但今天开发的某些东西可能是未来的突破。

问:在哪些领域使用其他技术更好?

这是一个棘手的问题。我可能会用一个例子来回答。想象一下,你想通过面部识别人,但你有不同角度的照片。更好的方法是分解任务,并进行一些面部参数测量,比如将旋转角度作为一个单独的子任务(也可以是 NN ),将分类作为一个单独的子任务,而不是将所有照片输入一个 NN。这为您提供了可用于调整全局算法和处理阈值的附加参数。

另一方面,如果我们更全面地思考相反的问题,“我们应该在哪里使用 DL?”我会回答,在医疗保健领域。生物生命对我们所谓的逻辑思维产生了非常复杂的挑战,因此计算机的二进制逻辑也是如此,所以拥有一个能够以高统计概率治愈人们的黑盒对于现在来说是一件大事,在未来,当 AI 能够建立理论并在这些理论的范围内解释其决策时也是如此。

另一个目前没有数字图书馆会更好的领域是机器人学。

很可能,我们都听说过波士顿动力公司。他们的机器人被设计用来完成各种任务,似乎是迄今为止最成功的发明之一。他们控制机器人运动的秘密是什么?他们根本不用深度/强化学习。

到目前为止,机器人技术是人们利用物理定律取得更大成功的领域。它限制了功能,但它仍然可以覆盖机器人引擎的足够好的部分。

深度学习总是渴望大量的数据来学习。在真实的机器人中不可能收集到这么多的数据。数以百万计的试验成本太高,执行时间太长。

一般来说,深度学习可以解决计算机视觉或自然语言处理等领域的多个复杂任务,但它不是万能的。深度学习在监督学习中最有效,这意味着模型是用标记数据训练的。它可以实现高精度,找到更复杂的模式,并且不需要显式的特征工程,但只有在足够的计算和标记数据的情况下才可能实现。在下图中,我们看到了经典机器学习模型和 DL 的性能如何依赖于标记的数据的数量:

数据科学技术如何随着数据量而扩展。我们设计师画的一张照片。这是一张独特的照片。我们对这张照片拥有完全的专有权。

对于标记数据量有限或需要快速原型化的问题,使用深度学习可能会矫枉过正。当我们实际上可以通过使用更简单的方法获得相同的结果时,例如用于分类的逻辑回归或随机森林,或者用于预测的线性回归/XGBoost 回归器,这将是对资源的浪费。当我们需要解释和说明结果时,从线性或基于树的算法开始理解特征重要性更有益。最后但同样重要的是数据质量,垃圾输入—垃圾输出。有了低质量的数据,任何模型的表现都很差,更不用说深度学习模型了。对 DL 来说,项目的领域并不重要。重要的是任务、数据和业务需求。

阅读有关 的更多信息,了解 Avenga 数据科学团队在社区 参与 Kaggle 竞赛时正在做些什么来帮助他们。

深度学习的下一步是什么?

深度学习的下一步是什么。由我们的设计师重新设计的 照片 。我们对这张照片拥有完全的专有权。

除了改进像胶囊神经网络这样的 DL 技术,胶囊神经网络是卷积神经网络的增强,还有一些重要的全球趋势应该提到,以描绘人工智能的未来:

  • 当 NN 可以解释它的决定时的解释性人工智能。
  • 当神经网络可以重用其经验时,迁移学习和类似的方法。
  • 硬件加速器——改进当前神经网络执行并支持新型神经网络的特殊芯片。
  • 当整体大于部分之和时,全球人工智能的全球网络将启用规则。

对于许多企业来说,深度学习的软肋是将神经网络视为黑盒决策者。这给项目带来了不便,因为在这些项目中,该模型具有显著的经济影响。对于许多企业来说,依靠 DL 模型的不可解释的结果来做出关键的决策和损失金钱是不可接受的。这就是为什么我们在可解释的人工智能方向上有很多研究,这些研究将能够提供数据和理由来证明这个决定。

其他研究课题:

  • 扩大 NLP 的成功,以开放对话和交谈
  • 多任务学习
  • 常识推理
  • 主动学习和终身学习
  • DL 在自动驾驶汽车中的应用

下一步是什么?

将深度学习和符号系统集成到混合人工智能架构中。由我们的设计师重新设计的 照片 。我们对这张照片拥有完全的专有权。

人工智能(AI)的梦想是理解让人类能够看到和听到、思考和推理、希望和梦想的神奇事物——大脑——是如何工作的,然后在智能系统工程中再造一个版本。

当前的 DL 模型擅长完成特定的任务和进行预测。DL 所缺乏的是类比或超越训练集进行推断的概念制造/生成能力,并且它的可解释性很差。幸运的是,DL 并不是唯一的 AI 工具。60 年代开创的符号人工智能是人工智能社区的主导范式,直到 20 世纪 80 年代末。符号推理的实现被称为规则引擎或知识图。这些是一组嵌套的“if-then”语句,得出关于实体及其关系的结论。在 DL 中,算法在建立输入和输出之间的关联时学习规则。在符号推理中,规则是通过人为干预创建的。这就是为什么符号人工智能在可解释性、泛化和整合先验知识方面如此强大,但在处理大量经验数据流方面却表现不佳。这两种方法相辅相成,因为前者的缺点是后者的优点,反之亦然。因此,将深度学习和符号系统集成到混合人工智能架构中,如结合深度强化学习的神经符号系统,可能是人工通用智能(AGI)的下一步,这种智能可以根据行为调整模式,并可以执行一般任务。如果能在这方面取得一些成就,那将是一件好事。

→了解更多 AI、深度学习、高级分析和大数据如何辅助医药行业 进行临床试验管理和药物开发。

最后的话

正如你所看到的,AI 不是一个简单的话题,因为在深度学习本身中,你的组织的实际商业价值来自于基于经验的技能。现代解决方案通常是几种技术和方法的恰当组合,即混合。

选择他们中的哪一个?在你的特殊情况下,如何扬长避短?我们的人工智能团队随时准备帮助您在您的业务环境中找到合适的解决方案。

欧洲是否已经度过了新冠肺炎疫情的第一个高峰?

原文:https://towardsdatascience.com/is-europe-past-the-first-peak-of-coronavirus-outbreak-d6410a578684?source=collection_archive---------46-----------------------

安娜斯塔西娅·切*斯卡在 Unsplash 上的照片

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

2020 年 4 月 18 日,《华盛顿邮报》发布了一条激动人心的消息,标题是:

欧洲认为冠状病毒的第一波高峰已经过去

[## 欧洲认为疫情冠状病毒的高峰期已经过去

伦敦-在整个欧洲,数字正在下降。有好消息分享。病毒正在被击退…

www.washingtonpost.com](https://www.washingtonpost.com/world/europe/europe-is-emerging-from-the-pandemic-its-hospitals-stable-with-beds-available/2020/04/17/c7aa46cc-7f37-11ea-84c2-0792d8591911_story.html)

据新闻报道,整个欧洲的新冠肺炎感染人数已经显示出达到顶峰的迹象,并开始趋于*稳。更令人兴奋的事实是,新住院人数每天都在减少。这意味着可以腾出更多的重症监护室给有需要的人,也有更多的呼吸机可供使用。这与三月份最后一个月发生的事情形成了鲜明的对比,一些病人不得不睡在地板上等待医疗救助。

当我们都期待着我们的生活能够尽快恢复正常时,我们中的一些人可能仍然会思考:是否真的有迹象表明冠状病毒在欧洲的爆发已经达到顶峰并开始消退?有没有更实质性的证据可以证明《华盛顿邮报》发布的消息是正当的?

在本文中,我将介绍几种数据可视化技术,使用 Python Plotly 库来可视化新冠肺炎数据,并根据从 Kaggle 获得的数据集观察五个选定的欧洲国家(英国、法国、德国、意大利和西班牙)的疫情进展状态。为了实现这个目标,我将一步一步地介绍如何使用 Python Plotly 创建时间序列折线图、条形图和量表图来检查欧洲的新冠肺炎记录。

你需要什么

先决条件 Python 库

python Plotly—【https://plotly.com/python/

蟒蛇熊猫—【https://pandas.pydata.org/

安装指南可在官方网页上找到。

数据集

冠状病毒报告(来自 Kaggle)

第 1 部分:数据预处理

1.1 探索数据

在生成 Plotly 图表之前,让我们快速浏览一下从 Kaggle 获得的数据集。

预览数据集的 Python 代码

前 20 条记录(左)和后 20 条记录(右)

首先,我们使用熊猫方法(第 5 行& 6)来预览前 20 行和后 20 行记录。从预览图中,我们知道该数据涵盖了从 2020 年 1 月 22 日到 2020 年 4 月 20 日全球每日确诊、死亡和恢复的新冠肺炎病例的累积总和。

1.2 过滤数据

因为我们的目标是检查五个选定的欧洲国家(英国、法国、德国、意大利和西班牙)的案例,所以我们需要过滤原始数据。过滤后的数据应该只包括五个选定的欧洲国家的记录。为此,我们使用 Pandas isin 方法来过滤我们的数据(第 10 行)。

基于五个选定国家过滤数据的 Python 代码

过滤记录

1.3 汇总数据

现在,除了五个选定的欧洲国家之外的国家的记录都被筛选出来了。然而,我们当前过滤的数据还有一个问题。法国和英国等国家的每日数据是在省/州级别记录的,而德国、意大利和西班牙分别是在国家级别记录的。这个数据不一致的问题会给以后创建图表带来问题。

我们需要在国家级别而不是区域级别聚合我们的过滤数据,并且聚合数据应该按日期排序。幸运的是,Pandas 提供了在几行代码中完成这项任务的简便方法(第 14 -20 行)。

聚合数据的 Python 代码

汇总数据

我们可以使用 Pandas data framegroup by方法对我们的日期和国家进行分组,并使用 agg 方法根据每个国家的每日确诊、死亡和康复病例总数汇总数据。

1.4 转换数据

在这个阶段,我们已经成功地过滤了数据,并根据日期对它们进行了排序。在我们继续绘制图表之前,还有一个步骤。每行记录中的确诊、死亡和康复病例数为之前的累计数。我们的目的是绘制一些时间序列图表,这些图表可以揭示每日新报告病例的进展情况,而不是累积的总和。从逻辑上讲,我们应该用前一个日期的数据减去当前日期的数据,以得出每日新病例的数量。Pandas 使我们能够使用 diff 方法转换数据(第 24、27、30 行)。

转换数据的 Python 代码

转换数据

我们将转换后的数据分配给三个新列,分别为 Confirmed_PlusDeath_Plus、Recovered_Plus、**。这三栏用于保存每日新增确诊病例、死亡病例和康复病例的记录(为而非累计数)。

注:

diff 方法中设置的周期值是使当前行的数量减去前 5 行的数量。此处需要此设置,因为每天有五个国家/地区的记录,所以同一国家/地区的后续日期的每条记录都会在接下来的 5 行中交替显示。

fill na 方法(第 25,28,31 行)是将转换后的数据中的 NA 值替换为 0。

第 2 部分:时间序列折线图

现在,我们准备使用Python Plotly Express包绘制我们的第一个折线图(第 27–28 行)。

Python 代码创建 Plotly 时间序列折线图

Plotly 时间序列折线图

fig = px.line(df_filtered, x=”Date”, y = “Confirmed_Plus”, color=”Country/Region”, title=”Daily Confirmed Cases In Five European Countries”)fig.write_html('first_figure.html', auto_open=True)

有了上面的两行代码,就生成了一个时间序列折线图。该时间序列折线图显示了欧洲五国从 2020 年 1 月 22 日至 2020 年 4 月 20 日的每日新增确诊病例。我们可以观察到,疫情大约在 2 月底开始爆发,自那以后,整个 3 月份的增长曲线越来越陡。

我们可以放大 Plotly 折线图来查看从 2 月 29 日起的增长率。

注:

要放大折线图,我们只需在图上按住鼠标并拖动鼠标,选择覆盖一系列日期的区域。

从折线图中,我们可以确定每个国家达到顶峰的日期:

法国:2020 年 4 月 12 日

2020 年 4 月 2 日

2020 年 3 月 21 日

西班牙:2020 年 3 月 25 日

联合王国:2020 年 4 月 10 日

意大利曾被报告为欧洲受影响最严重的地区,自 2020 年 3 月 30 日以来,该疾病已得到明显控制。尽管此后病例数仍在波动,但与其他选定国家相比,意大利记录的病例数一直较低。此外,自 2020 年 4 月 11 日以来,德国也显示出对该疾病的更好控制,目前每日病例数最低。

另一方面,法国的情况可能相当令人担忧,因为新病例在 2020 年 4 月 12 日的一天内突然激增至 26849 例。他们的第二个高峰发生在相对较*的时间,2020 年 4 月 16 日。英国的新增病例在 2020 年 4 月 10 日达到高峰后波动较小。然而,他们的病例数仍被认为相对高于意大利和德国。

从 2020 年 3 月 23 日至 4 月 11 日,西班牙在五个国家中显示出最高或第二高的病例数。即使在最*,他们的案件仍然波动很大。

第 3 部分:条形图

上面的时间序列折线图为我们提供了五个选定的欧洲国家作为一个整体的新冠肺炎确诊病例的总体概况。现在,我们将创建五个条形图来显示每个国家的新冠肺炎数据趋势。

为此,我们需要再次过滤我们的数据(第 27 行),并为每个国家创建一个数据子集(第 28 行)。这些过滤后的数据用于绘制条形图,以显示一个国家每天的确诊和恢复病例(第 30–33 行)。重复这些相同的逻辑步骤,为其余选定的欧洲国家创建多个条形图(第 35–65 行)。

Python 代码创建 Plotly 条形图

Plotly 条形图揭示新冠肺炎病例在法国

Plotly 条形图显示英国的新冠肺炎病例

Plotly 条形图揭示德国新冠肺炎病例

Plotly 条形图揭示西班牙的新冠肺炎病例

Plotly 条形图揭示新冠肺炎病例在意大利

与线形图相比,条形图为我们提供了额外的信息。我们不仅可以检查新确诊病例,还可以检查同一地块中的恢复病例(色标)。康复病例的数量可以让我们大致了解一个国家对疾病的控制程度,以及当前患者的医疗供应水*。

自 2020 年 3 月 28 日以来,意大利已显示出确诊病例稳步下降,自 2020 年 4 月 8 日以来,也显示出恢复数字的巨大迹象。另一个现在似乎得到更好控制的国家是德国。它显示,2020 年 4 月 2 日之后,确诊病例数下降更明显,其康复人数在五个国家中名列前茅。它在 2020 年 4 月 8 日一天之内就实现了超过 10000 例康复病例(几乎是当天确诊病例的两倍)。法国、英国和西班牙相对不稳定。自 2020 年 4 月 1 日以来,英国的确诊病例数一直很高,直到 2020 年 4 月 20 日,病例数没有明显减少。另一方面,法国和西班牙的确诊病例数波动较大。在 4 月中旬,病例数量有时会激增至异常高的水*。这可能是由于发现了以前未被发现的新的感染群体。

第 4 部分:仪表图

Plotly 库提供的另一个有用的图表是仪表图。仪表图是一种显示单个值的指示器,用于估计目标进度。在这种情况下,我们假设每个国家的目标都是完全恢复。考虑到这一点,我们可以尝试为每个国家创建一个量表,以显示他们实现目标的程度。

要创建仪表图,我们只需

  • 将 2020 年 4 月 20 日的累计回收金额设置为参数(第 7 行)。
  • 为图表设置一个相关的标题(第 9 行)。
  • 为轴属性中的图表设置最小和最大值范围(第 11 行)
  • 为具有指定颜色的条形设置数值范围(第 14–17 行)。该颜色条将用作显示当前成就水*的指示器。
  • 设置阈值(目标)(第 20 行)。在这种情况下,阈值基于 2020 年 4 月 20 日确诊病例的累计总数减去死亡的累计总数。

其余的参数设置可以保留为默认值,并重新用于为另一个国家生成类似的仪表图。

为意大利创建仪表图的 Python 代码

意大利仪表图

为德国创建仪表图的 Python 代码

德国仪表图

为西班牙创建仪表图的 Python 代码

西班牙仪表图

为法国创建仪表图的 Python 代码

法国仪表图

上面的图表让我们清楚地了解了每个国家患者的康复率。在这些国家中,只有德国实现了超过 50%的回收率,而其他国家都低于 50%。这意味着欧洲国家仍有一场漫长的战斗要克服并度过这一关键时期,以提高其恢复率,同时抑制确诊病例的增长率。

注:

没有生成英国的仪表图,因为恢复记录中有太多可疑的异常值。这可能是由于一些人为错误,如错误的数据输入或其他不可预见的技术问题。但是,其余四个国家的轨距图应足以满足本文的目的。

结束语

本文的主要目的是介绍几种使用 Plotly 库的数据可视化方法,以显示 2020 年 1 月 22 日至 4 月 20 日在五个选定的欧洲国家中新冠肺炎疫情的进展状态。由于数据每天都在定期更新,因此在您阅读本文时,这里提供的分析可能不再有效。此外,在检查一个国家的新冠肺炎疫情状况时,需要考虑更多因素,而不仅仅取决于几个变量,如确诊病例、死亡病例和康复病例的数量。

但是,我希望这篇文章仍然能够提供一个入门指南,帮助您使用 Plotly 库中的一些有用功能来创建一些信息丰富的图表,如时间序列折线图、条形图和数据可视化仪表图。希望你能从这篇文章中受益。

Github

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

参考

  1. https://www . Washington post . com/world/Europe/Europe-is-emerging-from-the-the-疫情-its-hospitals-stable-with-beds-available/2020/04/17/c7aa 46 cc-7f 37-11ea-84 C2-0792d 8591911 _ story . html
  2. https://plotly.com/python/plotly-express/
  3. https://plotly.com/python/gauge-charts/

可解释的 AI (xAI)是下一步,还是只是炒作?

原文:https://towardsdatascience.com/is-explainable-ai-xai-the-next-step-or-just-hype-b3d4c3768c62?source=collection_archive---------26-----------------------

*年来,人工智能已经扩展到一系列不同程度的行业。一旦一项地*线技术(或许类似于我们现在看待量子计算的方式)人工智能正式突破了日常生活,知情的观点不再是技术爱好者和精英数据科学家的专利。现在,利益相关者包括高管、投资者、经理、政府,最终是客户。

虽然关于可解释人工智能(xAI)的对话可以追溯到几十年前,但这个概念在 2019 年底重新焕发了活力,当时谷歌宣布了其面向开发者的新 xAI 工具集。xAI 的概念相对简单:历史上,机器学习模型在“黑箱”内运行,结果由数量惊人的交织参数决定,这些参数如此复杂(以百万计),以至于无法解释它们。xAI 的目标是将透明性和字面解释设计到模型中,最终允许最终结果配备上下文。例如,xAI 可能会确定一幅图像是一只狼,并给出解释:它是一种有着锋利牙齿和皮毛的动物,背景中有雪。

尽管 xAI 被认为是一种技术,但它同样可以被理解为一种最佳实践。人工智能在深陷伦理困境的领域表现优于人类,例如医疗金融法律。虽然实施技术来减少人类偏见和提高效率的承诺很诱人,但组织要为他们的决策(人类或机器人)负责,如果他们不能解释决策,他们就容易受到多重责任的影响。AI 也许能够以一种比法官更公*的方式来设定保释金;然而,即使是 AI 也可能被糟糕的数据或过度拟合所误导,当 AI 导致不公*的判决、拒绝抵押贷款申请或误诊癌症时,问题就不可避免地出现了。错误是不可避免的,但解释错误对于任何这些高风险的环境也是必要的。

在极端情况之外,xAI 为公司提供了一个扩展的功能类别来进行推广和销售。加内特预计,到 2022 年,全球人工智能经济将从 2019 年的 1.2 万亿美元扩大到的 3.9 万亿美元,每家公司都应该期待定义超越承诺结果的竞争模式。提供一个保证改进的黑盒人工智能模型可能很有诱惑力,但识别特定的高级功能为组织提供了谈话要点,以增强他们自己的营销和客户的意识。

赛的崛起

这个时机或者说 xAI 的走红并不是巧合。*年来,公众对科技行业的看法在直线下降,只有 50%的参与者认为科技公司在美国产生了积极影响,低于四年前超过 70%的比例。尽管许多公司适应这一趋势的速度很慢,但善于协调的领导者认识到了向问责和信任的转变。实施 xAI 让科技公司朝着这个方向前进,并在一个不可避免的问题上显示出主动性政策

2017 年,谷歌宣布他们“人工智能优先”战略政策的决定似乎很大胆;然而,仅仅几年后,科技高管紧紧拥抱人工智能的概念似乎几乎在意料之中。自从世界上第一家公司开张以来(谷歌称它是 1602 年的荷兰东印度公司,至少是公开上市的),领导者们一直依赖于财务信息灵通的决策。*年来,大数据和物联网的兴起为以前无法获得的见解打开了闸门;高管们调整了他们的语言,加入了“基于数据”的决策。接下来,自然进化是人工智能支持的决策。领导者应该向利益相关者、公众、媒体和法律讨论和捍卫自己的决策;这种期望不会随着复杂人工智能的引入而消失。

使 xAI 有效

为了让 xAI 变得可靠,它不能是临时添加的或者事后想到的。开发人员和工程师必须在他们构建的应用程序的设计和架构中实现 xAI。同样需要注意的是,并不是每个人工智能项目都需要解释;在视频游戏、娱乐或生产分析类型中,xAI 可能是笨重且成本过高的。

人工智能和机器学习中一个反复出现的现象是无法解释“黑盒”内的操作,从而产生某些理想的结果。开发者社区的成员对 xAI 的承诺表示怀疑,认为有些模型太复杂了,无法解释,被迫解释会阻碍创造性的进步。在某些情况下,这无疑是正确的。这种现实是由我们对技术的原始理解造成的,还是一个更普遍、不可避免的原因有待讨论。

走向 xAI 并不要求工程师或架构师停止生产黑盒模型;它只是提高了最关键的面向公众的技术的标准,这些技术在严重依赖健全的道德规范的领域中运行。任何人工智能的理想结果和期望都应该在早期会议中确定,xAI 应该是讨论的一部分。

一些项目可能需要专门为性能而设计的复杂的黑盒模型,而没有解释,而其他项目可能没有价值。每个项目都有独特的需求,xAI 提供了多一层可能性。

标题图片

面部识别技术是种族歧视吗?解释了最先进的算法

原文:https://towardsdatascience.com/is-facial-recognition-technology-racist-state-of-the-art-algorithms-explained-dbb1c95c4f5d?source=collection_archive---------37-----------------------

了解在新闻中引起轩然大波的人脸识别算法。

版权 2018 美国公民自由联盟。
最初由美国公民自由联盟发布于https://www . ACLU . org/news/privacy-technology/wrong ly-arrowed-cause-face-recognition-cant-tell-black-people-apart/

这个人看起来眼熟吗?这是罗伯特·威廉斯,他被警方的面部识别系统错误识别,不得不被逮捕一天。随着这一事件在媒体上四处传播,重要的是要记住,在对技术如何工作的信息有限或不存在的情况下,批评技术是很容易的。无数媒体来源批评了该技术的每一个组成部分,而实际的算法仍然是谜。

在这篇博文中,我将通过一种既迎合有经验的专业人士又迎合普通无知读者的方式,来介绍最先进的人脸识别算法。我希望这篇文章能帮助你理解现在在新闻中被批评的算法,并帮助你将急需的信息带入关于这一争议的讨论中。

什么是人脸识别?

当我说“人脸识别”这个词时,各种视觉效果应该会浮现在脑海中,其中许多你可能还记得《詹姆斯·邦德》或《碟中谍》电影中主角的团队必须改变人脸数据库才能让主角进入秘密掩体。或者你可能会想到中国或朝鲜这样的国家使用人脸识别技术侵犯人们的隐私。

人脸识别的官方定义剥夺了所有的流行文化。简单来说,就是对人脸的检测和分类。这意味着面部识别系统应该有两个组成部分,首先检测图像中的面部,然后找到面部的身份。

  • 人脸检测是一个非常类似于物体检测的问题,除了感兴趣的实体不是日常物体,而是个人的脸。
  • 人脸识别是将检测到的人脸与预先存在的数据库中的识别图像进行匹配的问题。这是黑客在每部间谍电影中改变的同一个数据库。

人脸检测

为了理解人脸检测是如何工作的,让我们来看看最先进的算法, RetinaFace 。现在不经意的读者们,不要一提到论文就跑。不要担心,在这篇博客中,我将尽我所能使算法尽可能直观,同时也避免困扰媒体的过度简化。

视网膜人脸算法在行话中被称为端到端或单级检测器。如果您熟悉对象检测策略,它类似于 SSD 或 YOLO 架构。

输出详细信息

RetinaFace 算法输出关于检测到的面部的三条信息:

  • 面的边界框,由框的左下角及其宽度和高度表示。
  • 表示眼睛、鼻子和嘴巴位置的五个面部标志
  • 密集的 3D 点映射非常类似于你的手机用来识别你的功能,如 iphone 上的 Face ID。

特征抽出

用于目标检测的特征金字塔网络( arXiv:1612.03144 ) (CC)

像大多数现代计算机视觉算法一样,RetinaFace 使用深度神经网络作为特征提取器。更具体地说,RetinaFace 使用 ResNet 架构以及全金字塔网络(FPN)来生成图像的丰富特征表示。

直观上,你可以想象这些特征捕捉到图像中不同层次的抽象特征。在人脸检测领域,这相当于对边缘进行早期特征编码,对眼睛、嘴巴、鼻子等面部特征进行中级特征编码,以及对人脸本身进行高级特征编码。FPN 只是允许模型利用高级和低级特征,这大大有助于检测图像中较小的人脸。

培养

训练是教导随机初始化的网络执行其任务的过程。训练的过程类似于教一个孩子在考试中取得好成绩。给孩子关于这个话题的信息,然后给他们一些评估测试,看看他们做得如何。深度神经网络的训练是类似的,除了给定标记的数据,在这种情况下,图像中的面部被标记,并且使用损失函数进行评估。要更详细地了解深度神经网络,请参见我的博文

通常,深度学习模型的训练过程是最重要的部分。整篇论文都是关于一个新的损失函数所带来的巨大改进。RetinaFace 算法也不例外。让我们检查用于训练 RetinaFace 的损失函数。

RetinaFace:野外单阶段密集人脸定位( arXiv:1905.00641 ) (CC)

让我们一个一个地分解这个函数。

  • 第一部分,人脸分类,简单地惩罚模型说在一个位置有人脸,而在图像中没有人脸。
  • “面部框回归”是预测面部的边界框坐标和标记面部的坐标之间的距离的一个有趣术语。具体来说,这个距离是使用所谓的*滑 L1 损耗计算出来的,你可以在下面看到它的图表。
  • 面部标志回归类似于框回归损失,除了不是找到边界框之间的距离,而是找到预测的五个面部标志和标记的面部标志之间的距离。
  • 最后的损失有点复杂,超出了这篇博文的范围。由于这些特征没有被标记,我们需要一些方法来帮助模型学习这些特征。为此,使用模型的输出特征来重建人脸,然后将重建的人脸与图像中的人脸进行比较

人脸识别

既然我们有了图像中人脸的详细信息,人脸识别系统的下一个任务就是对照 ID 图像数据库来识别人脸。

再次,我们将看看另一个国家的艺术纸,弧面。在深入研究这个算法的细节之前,我们需要复习一下人脸识别的基础知识。面部识别使用一类称为暹罗网络的网络。以下是我之前关于此事的博文节选:

暹罗网络背后的核心直觉是试图学习面部的表征。这种表征类似于人类储存在大脑中的关于面部特征的信息,如面部特征的大小、肤色、眼睛颜色等。人类可以理解,如果它看到另一张具有相似特征的脸,那么新的脸很有可能属于同一个人。另一方面,如果人类看到新的面部与其先前看到的面部不匹配,那么人类再次制作新面部的表示以存储在其存储器中。

这正是暹罗网络的运作方式。一个函数将人脸的输入图像转换成包含人脸特征表示的向量。然后,我们希望这个向量与同一张脸的向量相似,而与另一张脸的向量非常不同。

简而言之,该模型学习如何提取人脸的重要特征,从而将人脸与其他人脸区分开来。一旦获得特征映射,就可以将其与数据库中要匹配的其他人脸的特征映射进行比较。

那篇博文更深入地探讨了人脸识别的技术细节,以及完整实现它的代码。

再一次,暹罗网络的训练过程是奇迹发生的地方。暹罗网络首先在裁剪的人脸上被训练为完整的图像分类模型,其中该模型学习直接从图像中对人脸进行分类,而不需要任何识别图像。这需要在所使用的数据集中预先定义身份列表,这在大多数人脸识别数据集中是常见的。

输出详细信息

面部识别模型输出特征向量,该特征向量将面部特征编码成一些数字的列表,通常是 256 或 512。注意,这个向量不同于 RetinaFace 算法输出的密集特征,因为这些特征专门用于比较两张脸。

特征抽出

面部识别模型使用标准的、最先进的图像分类模型。ArcFace 算法使用 ResNet 架构。

培养

像 RetinaFace 一样,ArcFace 算法的症结来自于它的训练方式。正如我前面提到的,网络首先像正常的分类网络一样被训练,然后被微调到输出编码。

ArcFace:深度人脸识别的附加角度余量损失( arXiv:1801.07698 ) (CC)

通常,分类网络使用交叉熵损失来输出类别概率的向量。对这个类向量的解释是,它输出图像的可能分类,以及模型对每个类的置信度。虽然这对于分类任务很有用,但 ArcFace 算法的设计者指出,在人脸识别中不应该考虑不确定性,因为一张脸不可能属于多个人。为了减轻这一点,他们设计了一个余弦损失,迫使输出类概率聚集在一个类周围。正如在上面的图像中可以看到的,这种损失使用一个余量来“推动”输出概率向量更接*任何类别,这被证明在人脸识别方面有巨大的改进。

通过佛潘在(【https://www.youtube.com/watch?v=tgnitF1irVM】T4)

这是 ArcFace 架构在 MNIST 数据集(手写数字数据集)上输出的特征向量的可视化效果。正如你所看到的,图像输出的向量紧密地聚集在一起,这在人脸识别中非常有用。

获得结果

人脸识别系统的典型流程是首先获得图像中每个人脸的位置和特征。然后将裁剪后的人脸输入人脸识别模型,得到特征向量。然后使用欧几里德距离函数将该向量与识别数据库中的其他向量进行比较。与面部向量“最接*”的识别向量告诉我们图像中的人的身份。

举一个更具体的例子,在 MNIST 数据集矢量的可视化中,我们假设深蓝色点对应于数字 4 的矢量,青色点对应于数字 3。这类似于我的脸的图像和你的脸的图像。如果我从另一幅图像中获得一个特征向量,并且它非常接*深蓝色的点,我会怀疑该图像是否是 a 4。类似地,我认为图像是 3 是毫无疑问的,因为数字 3 的向量离特征向量很远。

那么算法怎么可能是种族歧视呢?

正如你现在看到的,任何深度学习模型的训练过程都是其性能的关键,以及它继承的偏见。新闻中的问题与算法在识别非裔美国男子时的低性能有关,其他文章批评算法与女性斗争。

这个问题并不像《卫报》的文章所宣称的那样是“固有的种族偏见”。问题只是用于训练人脸识别模型的训练数据集。你可以这样想,如果一个人从未见过苹果,或者一生中见过一次,那么这个人将来会很难认出苹果,因为他们没有见过足够多的苹果来了解它们的样子。对这个人来说,解决办法就是简单地向他们展示更多的苹果。人脸识别模型正是如此。

我们所需要做的就是拿出更具包容性和*衡的数据集来训练模型,所有的偏见都会消失。

未来和结束语

面部识别算法可以成为安全和监控许多方面的关键工具。它们可以成为任何自动化监控系统的宝贵补充,并可以为公司节省数百万美元的人力成本。

对于那些对实现这些算法感兴趣的人,请查看一下 Tensorflow 2 对 RetinaFaceArcFace 的实现。

使用人脸识别的合法问题是对隐私侵犯的担忧。但那是另一天的话题:)

感谢你阅读我的博文!我希望你学到了一些东西,并在谈论人脸识别及其缺陷时更加知情。我很乐意在下面的评论中讨论这个问题!

家庭团体有那么糟糕吗?结果会让你震惊

原文:https://towardsdatascience.com/is-family-group-that-bad-results-will-shock-you-573f64e194be?source=collection_archive---------27-----------------------

文本处理、Plotly 图形和 Heroku 部署

分析 WhatsApp 群聊&构建网络应用

谁不知道 WhatsApp?它是广泛使用的移动应用程序,与设备操作系统无关。我们都使用这个应用程序在旅途中快速完成工作。我不知道其他国家的情况,但是在印度,家庭团体因为在团体中分享垃圾/虚假信息而受到很多批评。这也意味着产生了大量数据,WhatsApp 给出了导出这些数据的选项!在本文中,我将向您展示如何挖掘这些数据,以发现隐藏的事实,并最终制作一个可部署的 web 应用

照片由AARN·GIRIUnsplash 上拍摄

在继续之前,让我们看看如何从组中导出这些数据:

作者提供的图片(在 Google Drawings 中创建)

数据预处理

文本文件包含消息的时间戳、作者和消息。如果数据被转换成一个 pandas 数据帧,那么数据处理和操作就很容易,在这里,我们将把这个文本信息转换成这个。该文件中的单个条目如下所示:

21/04/20, 5:47 pm - Author Name: Message sent

对于每一行,一个简单的正则表达式可以从该条目中提取日期和时间,在该日期拆分该行,分号将给出相同的作者和消息,但这里有几个问题:

  1. 多行消息没有新的时间戳,因此需要将继续的消息添加到主线程中。
  2. 有一些 WhatsApp 的默认消息,如:“消息是端到端加密的”或“XYZ 将你添加到组中”,这些消息可能有也可能没有时间戳,而且它们都不是多行的。这些可以打破我们的逻辑。此外,它们与我们的分析无关,可以跳过

考虑到这些情况,数据帧提取的代码可以引用如下:

将文本文件转换为熊猫数据框的抽象代码

我在这里没有包括整个实现,但是如果你想知道的话,你可以去我的 GitHub 库:

** [## kaustubhgupta/WhatsApp-群组-分析器

这个 Web 应用程序给出了关于 WhatsApp 群聊的详细报告。解散 GitHub 是超过 5000 万人的家园…

github.com](https://github.com/kaustubhgupta/WhatsApp-Groups-Analyser)

除了将它转换成一个数据框,我也有兴趣知道关于群组中共享的表情符号的信息。这可以通过使用名为 emoji 的库来实现。对于每条消息,我们将检查它是否包含表情符号,然后为它们的计数创建一个单独的列。出于演示目的,我将分析我的家庭组。让我们看看新数据集是什么样子的:

df.tail(10)

作者图片

这是数据帧的尾部,您可以看到大约有 9k 行的。日期列具有日期-时间数据类型,以便于操作,正如前面提到的,数据是在没有媒体的情况下提取的,包含媒体的消息被 WhatsApp 赋予了“媒体省略”的标签。现在我们的数据集已经准备好了,是时候回答一些问题了。

家庭群只有媒体聊天吗?

所有包含消息的媒体都被重命名为忽略的消息,这使得对这些消息进行分组、计数并除以消息总数以获得媒体消息的百分比变得容易。代码实现将是:

((df[df['Message'] == ' <Media omitted> '].Message.count()) / (df.Message.count()))*100

当我在我的家庭组数据集上运行这个命令时,它返回了 53.6% 这意味着 100 条消息中有 53 条是照片、视频或任何 GIF。令人惊讶的是,当我在我的学院组数据集上运行相同的命令时,它返回了一个 3% 的结果!这意味着我们可以说,在某种程度上,这些小组有更多的媒体,但这种说法是很有争议的,因为我的大学小组有更少的媒体,但其他小组可能有更多的媒体。

家庭群体只使用一种表情符号吗?

表情符号是每个人都喜欢的东西。有时,人们只是在交谈时交换表情符号,以传达他们的情绪,减少交谈。探索表情符号在群体中的分布会很有趣。在继续之前,这里有一件事需要考虑。我的母语是印地语,当我从信息中提取表情符号时,一些语言字符被归类为表情符号。让我们来看看这个群体最常用的 10 个表情符号:

(家庭组分布)按作者分类的图像

这是一个甜甜圈图,通过观察它,我可以说这个组有很多变化!合十礼表情符号(🙏)占使用表情符号总数的 32% 。总共使用了 2005519】表情符号,其中 498 个是独一无二的。如果我们看学院组分布,(😂)表情符号领衔排行榜:

(学院组分布)按作者分类的图像

让我们探索更多的统计数据来理解这些组的性质。

活跃和懒惰的成员

我们有该小组成立以来每天的数据。因此,我们可以分析该组成员在任何时期的活动。这里我们将考虑从第一天开始的整体活动。为此,我们将按作者对数据进行分组,应用 count 作为聚合,并将它们绘制成条形图。另一种方法是使用 value count 函数直接获得每个作者的数量。无论您选择哪种方法,您都可以绘制数据,下面是一个例子:

作者图片

如果你仔细观察,你会发现这个活跃的成员发送了 50%的群组信息!你可以通过将最少的计数作为决定因素,为懒惰的成员绘制相同的图:

作者图片

当我在我的大学小组中运行相同的命令时,结果几乎是相同的,但我预计这里会有一个凸起。(因为在手机清理过程中,我丢失了很多数据,现在我只有有限的数据对应的组)

夜猫子还是早起的鸟儿?

这个问题很简单,哪个成员早上更活跃,哪个成员晚上更活跃。一个家庭团体通常有所有的亲戚和老年人,因为他们通常醒得早,很明显,在家庭团体的情况下,早上会有更多的活动,而在大学团体的情况下,晚上会有更多的活动。在我的分析中,我发现家庭小组的集体活动在上午 8 点到 9 点之间,而大学小组的集体活动在上午 11 点到下午 1 点之间。大学集体远足是因为这是我们讨论是否应该去实验室的黄金时间!

家庭小组活动(图片由作者提供)

现在看看其他小组活动:

大学小组活动(图片由作者提供)

节假日的组状态

我进一步分析了在重要节日的集体活动。这里我将考虑印度的国定假日。有一种强烈的观点认为,在假期,家庭团体充满了来自不明来源的信息,在某种程度上这是真的。虽然大学小组在这些天很少或没有活动,但家庭小组在这些天有很大的图表。选择的日期是共和国日、独立日、圣诞节和其他一些节日。我无法捕捉到排灯节或胡里节等更著名的节日的模式,因为这些节日没有任何固定的日期,它们的日期每年都在变化。以下是生成的一些图表:

作者图片

把所有的放在一起

分析部分已经结束,现在是时候把所有的东西放在一起,形成一个结构化的格式。为了使这种分析对每个用户都是可访问的,在那里他们可以获得他们自己上传的数据的报告,我必须构建一个 web 应用程序来服务于这个目的。我将整个分析代码分为 3 个阶段或模块。一个模块帮助处理、清理和创建数据框。一个模块生成我在这里展示的所有统计数据(只有原始数据),另一个模块生成要在 web 上呈现的交互式图形。我用 Heroku 部署了这个应用程序,它是用 flask framework 构建的,jinja 模板帮助将这个后端连接到 web 前端。这款网络应用名为 Whatsapp-Analyzing

演示如何使用这个网络应用程序

结论

在本文中,我们介绍了如何访问 WhatsApp 数据、处理信息、回答一些流行的问题,以及最终在 could *台上部署应用程序。根据对数据的理解程度,可以发现很多东西。我没有给出图片中显示的 Plotly 图形的代码实现,因为这会使文章变得混乱。所有代码都可以在我的 GitHub 库中找到。

这篇文章提出的问题“家庭团体有那么糟糕吗?”毫无根据。每个群体都有几乎相同的趋势,但是的,有一些因素,其中一个胜过其他人,但不能一概而论。让我知道你的想法,你可以在 medium 上关注我,以获得更多有见地的故事的通知。说完了,再见!

您可以通过以下方式与我联系:

[## Kaustubh Gupta -机器学习作家- upGrad | LinkedIn

嗨,我是一名 Python 开发人员,能够进行 Web 抓取、Selenium 自动化、数据科学、后端 Web 开发…

www.linkedin.com](https://www.linkedin.com/in/kaustubh-gupta-612767ab/) [## kaustubhgupta -概述

技术爱好者|程序员| Python |数据科学|深度学习| Flask l Django l 开源贡献者…

github.com](https://github.com/kaustubhgupta)**

财务独立是财富的产物吗?

原文:https://towardsdatascience.com/is-financial-independence-a-product-of-fortune-22905a48107b?source=collection_archive---------44-----------------------

用蒙特卡罗方法和 Python 模拟随机微分方程

在雾中航行很困难,但并非不可能。波兰 2020 。作者照片。

介绍

这是工作的第二部分,试图找到通往财务独立的秘方——一个你不再需要工作来养活自己的阶段。

之前的文章中,我们试图通过一个常微分方程系统(ODE)来描述个人财务问题,后来我们使用 python 对其进行了数值求解。给定一组输入参数,我们的数值模型能够确定你的财务状况。

在这篇文章中,我们把它带到下一个阶段。我们在等式中加入随机性来解释生活的不可预测性。这一次,我们想知道你的财务成功在多大程度上真正掌握在你手中?

我们将通过重温数学和添加一些随机贡献来开始这一旅程。然后,我们开始使用所谓的蒙特卡罗方法模拟一些假设的场景。最后,我们将使用我们的增强模型,在世界历史数据的帮助下预测您的机会。

让我们开始吧。

数学重温

最后一个模型依赖于两个耦合的微分方程系统,为了简单起见,我们将简化为一个:

这个等式通过 x 来模拟你的总财富,这是一个随时间变化的变量。它的左边是导数,右边由两个起作用的项组成:

  • δ(t ),表示年度余额:所有收入减去所有费用和税收——简单地说就是每年之后还剩多少。
  • x ln(⋅),表示投资通货膨胀的合力,产生复利。请注意它本身的比例性,更多关于为什么这些术语位于对数之下,你可以在早期文章中找到。

这里,三个参数代表:

  • R -你投资的预期*均利率,
  • ξ -年*均通货膨胀率,
  • β ∈ [0,1]——你选择投资的那部分财富,我们称之为承诺系数

第二项可以用一个数字 ln λ 来表示,并理解为有效利率。因此,每当 λ > 1 时,你赚钱,而 λ < 1 与你一起亏损。

方程本身是一个线性一阶微分方程,可以解析求解。然而,由于我们稍后将“随机化”它,我们将坚持使用数值方法并使用 python 集成它。

重要的评论

我们使用标准化的值来表示 x 和δ,以使该方法尽可能适用于任何国家、货币或个人态度。因此,δ= 1 可以简单地解释为“你设法存下了你承诺的 100%”,例如,这可以转化为三个月的“财务枕头”。

就财务独立而言,这种方法将一个收入 10 万美元、支出 5 万美元的人与另一个收入 1 万美元、支出 5 万美元的人置于同等地位。毕竟,财务独立被理解为一种状态,在这种状态下 x > 0 ,产生的金额为正,尽管δ≤0。换句话说,增长至少补偿了损失,并且不需要主动工作。因此,你可以永远坐着吃饭。

确定性解决方案

为了找到解决方案,我们需要计算:

这只是一个函数。这里,我们任意设置 t0 = 25,我们将*衡函数建模为

第一个区间,我们称之为活跃时间,因为它代表了我们大多数人都在积极工作和赚钱的时间。第二个区间代表退休,在这段时间内 xp 表示*衡。让事情变得更困难的是,我们让XP1。因此,对于一个合理的养老金计划,我们可以假设 xp = 0,这意味着你可以花掉 100%的养老金,而这不会影响你的总财富。

图一。x 的确定性级数。左上:承诺因子扫描,右上:改变初始条件,左下:有效利率扫描,右下:活跃时间扫描。在所有情况下,*衡函数在活动期间设置为 1,此后设置为-0.5。图片作者。

为了测试不同参数的影响,我们展示了在不同条件下 x 的级数(图 1)。正如我们所见,高投资承诺 β ,高预期利率 R ,以及更长的活跃期 T = t - t0 导致在增长产生更多增长的机制中找到解决方案。相反,初始条件 x0 = x(t0) 根本不影响增长——只影响 x 的绝对量。

成功条件

如前所述,当 x,dx/dt > 0 而δ≤0时,我们财务独立的条件得到满足。我们应该强加的另一个条件是,这个阶段是永久性的,也就是说,一旦达到这个阶段,就没有必要再回来做固定工作。

然而,一旦我们考虑了随机性,第二个条件将会把这一点变成方程稳定性问题的一个相当麻烦的分析。为了避免这种情况,并考虑到典型的先挣后花的生活场景,我们将坚持把δ表示为以下函数

也就是说,一旦你过了退休年龄,你的年度余额预计将是你之前活动时间余额的-50%。因此,如果你退休后( t > t0 + T )保持正值,并且的导数*均为正值,我们就称之为成功。

增加生活的随机性

这是一个有趣的部分。“主”方程为我们提供了一个完美决定论世界的解决方案。事实是,无论是你的条件还是(尤其是)市场的条件都不一样。自然,我们需要考虑过程中的一些随机性,但要以一种我们的模型仍然有意义的方式来做。

出于这个原因,我们将用参数化分布代替方程的参数。然后,我们将使用所谓的蒙特卡罗方法来找出它将我们引向何处。一旦我们通过多次迭代收集了结果,我们就可以使用统计数据来讨论结果。

参数化

影响因素可分为人为因素和市场因素。因人而异的因素是δ和 β ,因为只有这两个因素会受到你的决策的影响。相反, Rξ 更多的是世界的状况,除非你是其中的一个砖石,否则你对其没有影响;)

数学上,我们可以通过以下方式注入高斯噪声来说明*衡函数的随机性:

其中δ定义为早先的,而 N 是特定方差的零中心高斯噪声。

类似地, Rξ 可以使用高斯噪声建模为:

对于β,我们有β

β 的建模要复杂一些。由于 0 ≥ β ≥ 1 ,不能用正态分布,但可以用所谓的贝塔分布代替。该发行版不仅支持约束,还为我们提供了两个参数(我们将它们命名为和以避免重载),

这在很大程度上“描绘”了人们对投资的总体态度。

履行

有了这种武器,我们可以建造一个“模拟生活”的课堂。

class RealLife:
    def __init__(self):
        self.t0 = 25                        # starting age
        self.beta = np.random.beta(2, 5)    # somewhat natural
        self.mu_r = 0.05                    # investment rate avg
        self.sigma_r = 0.25                 # investment rate std
        self.mu_xi = 0.028                  # inflation avg  
        self.sigma_xi = 0.025               # inflation std
        self.x0 = 0.0                       # initial wealth
        self.balance_fn = self._rect        # balance fn (callable)
        self.sigma_delta = 2.0              # balance fn std

        self._rs = []
        self._xis = []
        self._deltas = []

    def live(self, x, t):
        delta = self.sigma_delta * np.random.randn()
        r = self.sigma_r * np.random.randn() + self.mu_r
        xi = self.sigma_xi * np.random.randn() + self.mu_xi

        self._rs.append(r)
        self._deltas.append(delta)
        self._xis.append(xi)

        rate = self.balance_fn(t - self.t0) \
             + np.log(1 + self.beta * r) * x \
             - np.log(1 + xi) * x
        return rate

    def _rect(self, t, t0, duration=30, floor=-0.5):
        x = np.where(t - t0 <= duration, 1.0, floor)
        mask = np.where(t > t0, 1.0, 0.0)
        return x * mask

在这里,所有参数都被设置为类似于真实场景,但是基于历史数据的结果在最后给出。

还有一点很重要,即self.beta被认为是与时间无关的。因此,我们可以将其解释为一种情况,即一旦一个人出生(一个对象被实例化),投资承诺就被选择并保持不变。由于我们将使用蒙特卡罗方法,我们应该期望在人群中有足够的随机性(在多次运行之后)。

接下来,我们需要对新的随机微分方程进行数值积分。由于scipy.integrate.odeint表现不佳,我们创建了与odeint接口匹配的例程sdeint

def sdeint(func, x0, t):
    x = np.zeros(t.size, dtype=float)
    x[0] = x0

    for i, dt in enumerate(t[1:]):
        x[i + 1] = x[i] + func(x[i], dt)

    return x

最后,模拟代码可以包装在下面的函数中。

import numpy as np
import pandas as pd

def simulate_with_random(you):
    t0 = np.linspace(0, you.t0 - 1, num=you.t0)
    t1 = np.linspace(you.t0, 120, num=(120 - you.t0 + 1))

    x_t0 = np.zeros(t0.size)
    x_t1 = sdeint(you.live, you.x0, t1)

    df0 = pd.DataFrame({'time': t0, 'x': x_t0})
    df1 = pd.DataFrame({'time': t1, 'x': x_t1})
    return pd.concat([df0, df1]).set_index('time')

图二。随机化方程的积分结果。在这里,投资率和通货膨胀率标准差被赋予相同的“sigma”。在所有情况下,我们让它运行 50 次。图片作者。

蒙特卡洛

现在,我们让它运行 1000 次,增加期望的 R 。此外,我们随机化活动时间 T 以完全随机化群体。图 3。显示结果。

图 3。完全随机化方程的蒙特卡罗模拟。*衡功能的活动时间被设置为 15 到 40 年之间的随机整数。图片作者。

正如我们所看到的,无论何时,经济独立几乎是不可能的。这是因为 lnλ0,并且在积分之后,解经历指数衰减,并且方程保持稳定。然而,由于活动时间 T 和承诺因子 β 的影响,增加 μR 也不能保证成功。即使对于人为的高 μR ,由于上述原因,很大一部分运行会失败。

好在 βT 都是取决于每个人个人选择的因素。因此,如果我们将这些冻结,同时让 Rξ 保持随机,我们应该能够至少在一定程度上估计出你成功的几率。

你对抗历史数据的机会

要想感受一下对抗市场是什么感觉,我们需要插上 μR、 σR、 μξσξ的一些合理值。假设“历史重演”,我们可以论证我们可以利用历史数据模拟未来。为了得到通货膨胀的数值,我们使用美国的历史(1914-2020 年)数据。类似地,为了估计市场在均值和方差方面的行为,我们使用了 1928-2020 年的数据。

根据数据我们有ξ= 3.24+/-4.98%R= 7.67+/-19.95%。

接下来,我们扫描 Tβ ,同时使用我们刚刚计算的值。

from itertools import product

t = np.linspace(0, 120, num=121)
ACTIVE_TIME = np.linspace(10, 40, num=31)
BETAS = np.linspace(0.0, 1.0, num=11)
np.random.seed(42)

diags = []
for wy, beta in product(ACTIVE_TIME, BETAS):
    for _ in range(1000):
        you = RealLife()
        you.mu_r = 0.01 * mu_r          # S&P500 mean
        you.sigma_r = 0.01 * sigma_r    # S&P500 std
        you.mu_xi = 0.01 * mu_xi        # inflation mean
        you.sigma_xi = 0.01 * sigma_xi  # inflation std
        you.beta = beta                 
        you.balance_fn = lambda t: rect(t, you.x0, wy)
        df = simulate_with_random(you)

        passive = int(float(df[df.index > you.t0 + du] \
                    .diff().sum()) > 0)

        diags.append({
            'active': wy,
            'beta': you.beta,
            'avg_r': you.get_average_r(),
            'avg_delta': you.get_average_delta(),
            'avg_xi': you.get_average_xi(),
            'passive': passive,
        })

df = pd.DataFrame(diags)
df_agg = df[['active', 'beta', 'passive']] \
    .groupby(by=['active', 'beta'] \
    .mean() \
    .unstack() * 100

决赛成绩

图 4。每个(T,beta)对与历史市场数据的 1000 次运行的最终结果。结果以%表示。图片作者。

图 4。显示了每个( Tβ )对的蒙特卡洛模拟的最终结果。正如我们所看到的,任何 1/2 的收入实际上都将你排除在经济独立之外。事实是,如果你梦想为自己争取一个光明的未来,你需要学会投资——不管这对你意味着什么。这可能意味着从一个普通的交易者到一个熟练的企业家——你需要学会增加你所拥有的。

第二重要的因素是你的活跃时间。然而,这一次更应该被看作是一个积累财富的“机会”窗口。时间越长,你就越有可能获得足够的“燃料”让你的财务之船飞起来。

然而,即使有 100%的承诺和 40 年的艰辛,胜算似乎对你不利!幸运的是,你应该记得我们对δ(t)函数使用了一个过于简化的模型。事实上,如果你设法将所学转化为更高的薪水,并且远离过度消费的诱惑,你的财富会积累得更快。此外,没人说你会被留给市场“反复无常”。除非你唯一的投资策略是将你的钱安全地分配给一些基金,否则即使在暴风雨中,你也可能会学会导航和航行。

考虑到这一点,请将这些结果作为鼓励你尝试的一种方式,因为它们不是最终的食谱,而是试图找出什么是重要的。祝你好运!

PS。如果你想玩代码,自己模拟,可以在 Github 上找代码。

还会有更多…

我计划把文章带到下一个层次,并提供简短的视频教程。

如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!

原载于https://zerowithdot.com

通量比张量流好吗?

原文:https://towardsdatascience.com/is-flux-better-than-tensorflow-d39d3ba8c0ce?source=collection_archive---------8-----------------------

放松点。Flux 是机器学习库,不会让你张量!

(src = http://fluxml.ai)

什么是通量?

Fl ux 是一个机器学习库,用于多范例、快速、麻省理工学院开发的统计编程语言 Julia。Flux 的核心特征是取 Julia 码的梯度。换句话说,Flux 能够接受另一个 Julia 函数和一组参数,并返回一个梯度。Flux 是一个非常酷的包,因为它能够做很多 Google tensor flow 能够做的事情,但是是在一个“由用户开发”的包中。此外,Flux 具有用 Julia 编写的优势。虽然这也意味着 Flux 遭受了其他 Julia 软件包所遭受的同样的缺点,但是这种交换并不可怕。

如果你想真正了解 Flux,我这里有一个关于在 Flux 中批处理和训练卷积神经网络的介绍性教程。

什么是张量流?

Tensorflow 是数据科学工具箱中的经典工具。根本不会编程的人甚至知道 Tensorflow 是什么,这是有充分理由的:

Tensorflow 太牛逼了。

https://www.tensorflow.org/(src =

Tensorflow 由“谷歌大脑团队”开发,并于 2015 年 11 月在 Apache 许可下发布。Tensorflow 为许多现代机器学习算法背后的梯度模型提供动力,包括谷歌、英伟达、高通、联想和数百家公司使用的算法。Tensorflow 不仅在 Python 中,而且在整个机器学习中已经成为一个主要部分。

我喜欢通量的地方

Flux 是一个很棒的机器学习框架,因为它带来了许多有趣的想法和一些非常酷和简单的语法。有很多个人主义在不断变化,但总的来说,好处归结为一些关键因素。

朱莉娅

你可能已经知道了,Flux 是给 Julia 的。用 Julia 编写的 Flux 比用 Python 编写的软件包有很大的优势。Julia 是一种快得多的语言,在我看来,它的语法比 Python 好(这是我个人的偏好。)

然而,这也带来了巨大的代价。Julia 在很大程度上仍然是一门相对较新的语言,其用户基础远不如 Python。在这种情况下,Julia 失去了像 Python 这样庞大的语言所带来的大量支持。这意味着虽然 Flux 在某种程度上可能是更好的解决方案,但它不一定适用于所有情况。这是因为你很难找到任何打嗝的答案。首先很难找到学习如何使用这种语言和软件包的文档,尽管这正在稳步改善。

很酷的语法!

我之前说过,比起 Python,我更喜欢 Julia 的语法。虽然这纯粹是主观的,但不主观的是 Julia 语言的可变性,随之而来的是一种完全不同的、非常酷的在 Julia 内部创建渐变模型的方式:

句法表达

这些真的很酷,如果你想了解朱莉娅,你一定要好好看看它们。它们主要用于两种特定情况:

f(w) = v = v + 5 for v in w
  • 功能操作
f(w) = w + 5 - 6

然而,Julia 中的语法表达式可以以数百种其他方式使用,这些方式都很有趣,使程序员更加容易和直观。

但是这如何适应通量呢?

Flux 充分利用了这些通用表达式,并将它们作为整个库的基础。看一看 Flux 文档中的这个例子:

julia> **using** Flux
julia> f(x) = 3x^2 + 2x + 1;  
julia> df(x) = gradient(f, x)[1]; *# df/dx = 6x + 2*  julia>
df(2) 14  
julia> d2f(x) = gradient(df, x)[1]; *# d²f/dx² = 6*  
julia> d2f(2) 6

我喜欢 Tensorflow 的地方

(src = http://Google.com/)

Tensorflow 以一种完全不同的方式拥有自己的语言优势,Python 是一种非常通用的语言,因为大多数其他高级语言都能够与之接口,而且它是基于 c 的。然而,Flux 和 Julia 的致命弱点绝对是 Tensorflow 和 Python 的流行。

很容易找到帮助

使用任何受欢迎的东西的好处;正如需求随着供应而增长,可用性随着用户而增长。使用产品的人越多,关于产品的对话就越多,这对于 Tensorflow 或 Flux 这样的工具来说是绝对有用的。

遵循规则

我可以推测,数据科学家在尝试使用 Flux 时会遇到的一个大问题是,很多事情的处理方式都与其他地方截然不同。Flux 使用一种非常特定于语言的语法,这种语法不符合高级 ML 代码的典型类型。然而,在对冲的另一边是 Tensorflow,他采取了完全相反的方法,并倾向于符合机器学习内部已经建立的东西。

庄严的

毫无疑问,Tensorflow 臭名昭著。这是有道理的,因为 Tensorflow 不仅在这个行业存在的时间更长,而且还得到数据巨头谷歌的支持。说到底,对于一个拥有数百万开发人员的企业来说,使用一个工具来维护和改进软件要比少数几个 Github 维护人员容易得多,这些维护人员甚至不得不去做他们的日常工作。

结论

我认为 Flux 非常酷,我非常喜欢在其中工作。Tensorflow 在我心中有一个特殊的位置,但看到更多的人在他们的模型中使用 Flux 肯定会很有趣。Flux 带来了一些非常酷的想法,虽然这使它非常独特,但它也有一个非常陌生的用法。通量会取代张量流吗?很可能不会,也不可能,但是通量能代替张量流吗?

是啊!

Julia 当然仍然是一个婴儿,许多软件包都徘徊在足够包容的边缘,可以依赖,但不管它年轻与否,Julia 肯定是数据科学中现在和未来的一种伟大语言。谁知道呢?在 10 到 15 年内,我们很可能会看到 Julia 的使用激增,随之而来的还有 Flux 的使用。

投资 AI 是投资回报率最高的机会吗?

原文:https://towardsdatascience.com/is-investing-in-ai-the-highest-roi-3d84725e315e?source=collection_archive---------48-----------------------

数据科学、人工智能、投资、金融

人工智能是一个革命性的行业。

克里斯蒂安·杜博万在 Unsplash 上拍摄的照片

这篇文章探讨了为什么 AI 是最高 ROI 机会。

随着人工智能日新月异的发展,这项技术是多么具有革命性,它的实现是巨大的,几乎每个杂志和报告都对此进行了报道。然而,解释它的特定方面以及人工智能及其子集机器学习深度学习如何改变我们看待生活的方式已经变得势在必行。

这两家公司都在或将要以这样或那样的方式实现人工智能,这是企业界的未来。如果你知道自己在做什么,投资正确的人工智能将带来非常高的投资回报率。

创业者没有感官,没有测试的必要,什么都做不了。幸运的是,人工智能的早期阶段为金融投资者提供了更先进、更有利可图的战略,并在建立新公司时提供了有价值的战略视角。

小公司现在可以产生可靠的数据,从股票的基本市场波动到公司公告,而这仅仅是个开始。在传输数据时很难选择重要的一个。作为长期投资者,你打算投资什么?随着时间的推移,任何金融分析师都知道如何处理关键数据。此时,他们有稳定的工具来补充他们的投资组合。

人工智能可以评估早期初创企业对投资者的表现,并通过预测销售增长、市场规模、商业专长等所有变量来捕捉初创企业的成功机会。它将对细节进行评估,以确定统计数据是否真的有所改进。这意味着值得投资的初创公司有能力开始筹集资金。

Austin DistelUnsplash 上拍摄的照片

大多数投资者使用人工智能进行重要的投资选择。通过集成算法、数据挖掘和语言处理,人工智能可以创建关系和模型,根据投资者的偏好提出建议。随着人工智能不断吸收新数据,它将随着分析新信息而增长,并最终变得可靠和深远。

EQT Ventures 开发的用于对潜在初创企业进行分类的机器学习系统 MotherBrain 将其算法应用于历史数据,以便有可能区分投资申请人。该*台使用财务统计数据、网站排名、设备放置和社交媒体功能等细节,大多数企业可以实际测试和评估这些细节。令人惊讶的是,如果 Motherbrain 的发明已经被用于企业的种子和天使融资。

包括天使投资者在内的小投资者也可以利用只有历史上重要的公司才能获得的专业知识和服务。风险投资家和天使投资者的另一个真正的不利因素是以前寻求令人愉快的投资目标。这是一个持续的强大和旅行密集型的挑战。然而,机器学习预测分析开始改变策略。

对于其他用户来说,也有商品,比如 Allegro,一个完全不受人类偏见影响的智力算法投资专注于 AI 。这是一个很好的投资产品,但当市场对这一承诺较低时,在市场强劲时转向股票基金和债券基金,这意味着投资是安全的。

事实上,当错误的数据存在或市场缺陷发生时,遵从行业含义的财务经理通常处于艰难的境地。这些缺陷可能是谣言,财务盗窃,或无辜的关系失误。由于金融市场与持续不断的数据流保持联系,数据流的脆弱性或中断似乎比坏消息更糟糕。

那么,是什么限制了人工智能在遵循对冲基金模式的传统业务中的实施?最重要的问题来自大规模的金融和人力资本投资。

可能最常见的抑制因素是可用人才库的稀缺。作为另一个领域,有一批具有该领域专门知识和经验的被拘留者。数据科学家和人工智能从业者也是如此,他们通常期望对关键公司行为和目标的观察总结。Pesa 报告称,仅在美国就有超过 1 万个人工智能职位空缺。

照片由国家癌症研究所Unsplash 上拍摄

除了缺乏专业知识之外,投资公司还需要对这一独特的潜力池的优先事项和愿望做出反应,这一潜力池将学术界、学术界和博士生结合在一起。这些人中的许多人不参与传统的投资工作,而是受到资本和金融安全的激励。这个人才库很常见,涉及到他们的喜好。相反,投资公司需要营造一个人才需求得到满足的环境,高度重视给人留下积极的印象,放手一搏,寻求改变游戏规则的增长。

当谈到担心钱的时候,投资者仍然相信这个想法背后的人。这就给个人倾向和情感不端留下了很大的空间。感情投资岌岌可危。人工智能正在*衡这一点。人工智能帮助投资者更容易依赖研究和统计数据。我们不能清空我们目前的感官,然而,我们可以用 AI 来规避我们的存在。

结论

人工智能的增长估计是巨大的,并表明它将在未来几年增加数十亿。人工智能的规模可能会大得多,分析师表示,这个领域每年将增长 30%。人工智能具有巨大的潜力,因为它可以在任何领域从工程走向技术,并可以影响这两者之间的一切。

人工智能的应用是巨大的,不可能只展示它的几个方面。但如果你是一个企业家,你对了解这个行业有特别的兴趣,那么你可以适当地看待和评估它。机会是巨大的,技术将会增长,因为世界经济受到了疫情的打击,一个爆发的领域是技术。

现在,把你的想法放在TwitterLinkedin,以及Github!!**

同意 还是 不同意 与绍拉夫·辛拉的观点和例子?想告诉我们你的故事吗?

他对建设性的反馈持开放态度——如果您对此分析有后续想法,请在下面的 评论 或伸出手来!!

推文@ SauravSingla _ 08,评论Saurav _ Singla,还有明星SauravSingla马上!

放弃

本报告中表达的想法和观点仅代表我个人,不一定代表我公司的观点。本报告旨在提供教育,不应被理解为个人投资建议,也不应被理解为购买、出售或持有任何证券或采取任何投资策略的建议。

容易解释吗?局部可解释性

原文:https://towardsdatascience.com/is-it-easy-to-explain-local-explainability-4f325565210c?source=collection_archive---------21-----------------------

我为什么要相信你的解释?对最常见的解释方法,它们的优点和局限性有更批判性的观点。随着对可解释性需求的增加,越来越多的公司、专业人士和组织引入了一些方法来为他们的模型产生解释。然而,这些方法能实现吗?我们能相信他们的结果吗?

照片由安德里亚斯亲切的Unsplash 上拍摄

在这篇博文以及已经发表的另一篇博文中,我们旨在调查非线性模型可解释性的现有方法,重点关注实用性、局限性以及现有实现方法的开箱即用行为。
在当前的博文中,我们将着重于局部解释。
链接到上一篇关于全局可解释性的博文可以在 这里 找到。

如前一部分所述,可解释性方法大致可以分为全局解释和局部解释。虽然当我们处于研发阶段时,从整体上对模型进行说明更有意义,并且可能对专业人员(如数据科学家)更有用,但本地解释也意味着对最终用户的解释。这些人可能是监管者、公司或从模型预测中受益的人。这意味着给出正确的解释是不够的。你还需要它对人类来说清晰易懂(你可以在米勒的综述(1)中读到更多关于什么构成了“好的”解释)。重要的是,当解释是出于监管目的时,你需要它提供一些保证,你所看到的确实解释了预测。

在这篇博文中我将讨论现有的两种最流行的局部可解释方法:

  1. 石灰
  2. SHAP

这篇文章中使用的所有代码的笔记本可以在这里查看。

模型和数据

我将在这一部分使用的数据是 Kaggle 的经典“泰坦尼克号:机器从灾难中学习”。关于数据集的更多细节可以在这里找到。我所使用的数据的预处理阶段是非常基本的,可以在上面 链接的知识库中查看。

我选择使用的型号是 XGBoost 。这是一个基于决策树的集成模型。关于树集合模型和 boosting 的简要说明可以在本系列的第一部分中找到。

完整的 XGBoost 类,也包括使用贝叶斯优化的超参数搜索,可以在这里找到。该类的当前用法:

石灰

关于石灰已经写了很多,也说了很多。我不会进行太多的技术解释,这些可以在许多其他来源中找到(例如在这本伟大的书的文档)。但是,简单地说,我将解释基本的想法,并转移到实际应用和限制。

总的来说,这个想法很简单:问题的整个空间是复杂的,因此不能用简单的线性模型来建模,所以我们改为训练一个更高容量的“黑盒”模型。然而,给定一个特定的实例(样本)和它周围的一个小环境,我们也许可以假设局部线性,在这个局部环境上训练一个线性简单模型,并产生一个“实例相关”的解释。这个简单的线性模型被称为代理模型。 局部训练的数据是通过置换我们想要解释的感兴趣的实例获得的。使用欧几里德距离度量,通过它们与原始样本的距离对生成的样本进行加权。标签是通过探测我们的黑盒模型获得的。

需要记住的一件非常重要的事情是,代理模型是我们模型的*似模型,而不是精确的复制品。因为(a)局部线性是一个假设,并且(b)我们产生一个单独的训练模型,该模型具有 K 个特征、N 个样本和来自不同于基本事实的分布的标签。原始模型和代理模型并不总是产生相同的预测。

让我们将石灰解释应用到测试数据中的几个例子。

理论上,使用石灰可以像运行这两行代码一样简单:

然而,要用 XGBoost 运行 LIME,我们需要生成一个包装器类(存储库中的主函数),它处理一些输入输出匹配。

以下图的类别用途:

>样本#4:男性,年龄= 27 岁,头衔=先生……没有活下来

图 1:测试样品 4 的石灰说明

在图 1 中,我们可以看到局部线性模型的预测(0.22)与全局模型的预测(0.13)相对接*。根据当地的模型,这位先生的死亡预测主要是因为他是一个“他”和一个“先生”,属于 C 类,而他的年龄会对他有利。最后,他的家庭地位(Parch,SibSp)似乎在预测中起很小的作用。
解释不是很明确,特别是对于连续的特征。虽然 27 岁似乎有助于生存,但这是否意味着年龄越大或越小越糟糕呢?多少钱?

让我们看另一个例子:

>样本#35:男,年龄= 11 岁,头衔=先生……没有活下来

图 2:测试样品 35 的石灰说明

这种情况展示了局部预测(0.31)和全局预测(0.64)之间可能的不匹配。事实上,看起来本地模型比全球模型更准确,因为这个个体根据真实标签没有存活下来。我们的代理模型是“正确的”,而我们的 XGBoost 模型是“错误的”,这是一个巧合,而不是一个特征。
代理模型应该解释我们的复杂模型的预测,不管它是对还是错。在我们开始考虑解释的正确性或质量之前,他们的预测将是相同的,这是非常重要的。

LIME 方法的另一个潜在缺点是需要手动选择我们的代理模型将要训练的特性的数量,以及定义本地环境大小的内核的大小。

理论上,LIME 优化器应该最小化复杂性,从而最小化特征的数量,同时最小化损失,从而得到一些最佳的特征数量。实际上,我们需要将特征的数量(K)传递给模型。这影响了解释的稳定性,如下所示:

样本#42:女性,年龄=63 岁,头衔=夫人…幸存

图 3:具有不同 K 值的测试样品 42 的石灰说明

看起来改变 K 对结果有潜在的两种影响:(1)它可以稍微改变局部预测值,以及(2)它可以改变顶部选择的特征,当从 5 个特征转移到 7 个特征时可以注意到。当选择 K=5 时,第三个重要的特征是“Pclass ”,而当选择 K=7 时,特征“Cabin”占据这个位置并将“Pclass”向下推一位。对这种现象的部分解释是特征依赖。一些特征只有在与其他特征相结合时才能成为“好的”预测器。因此,只有当“足够”的特征被允许用于训练时,组合才是可能的。
由于 K 是手动给定的,因此缺乏稳定性是一个主要缺点。对于相同的训练模型和测试集,使用不同的 K 可能会改变解释(特别是如果它是基于前 X 个特征的子集)。

虽然石灰简单易懂,相对容易使用,但它也有许多缺点。即,局部线性假设,需要手动定义 K 个要使用的特征,主要是替代模型预测和我们的复杂模型预测之间的潜在不一致。最后,LIME 输出的值似乎缺乏比较价值和意义。每个特性的价值代表什么?这些值和本地模型预测之间的关系是什么?给定多个样本,看看它们在 LIME 中的特征值,能推断出什么吗?

SHAP

SHAP 是一个基于 shapley 值方法的局部可解释模型。Shapley 值法是一种有理论基础的博弈论方法,主要缺点是计算量大。
SHAP 通过提出两个子方法解决了这个问题:KernelSHAP 和 TreeSHAP。因为我们试图解释我们的 XGBoost 模型,所以使用 TreeSHAP 模型更有意义。但首先,我将简要说明沙普利价值方法和 SHAP 的主要创新。

在匀称的价值观中,我们把我们的特征(或它们的组合)视为玩家。这些玩家可以组成“联盟”玩游戏。一场比赛的结果是我们的预测。我们的目标是计算一个特征对不同联盟预测的*均贡献,并与所有实例的*均预测进行比较。匀称的价值就是来自这一特征的贡献。然而,随着特性数量的增加,遍历所有的联盟成指数级增长。这就是 SHAP 应该帮忙的地方。

KernelSHAP 将解决方案视为之前引入的石灰和 Shapely 值的组合。这个想法是训练一个代理模型来学习不同联盟的价值。在不同的排列中,缺少一些特征。缺失的特征由来自其边缘分布的样本代替(很像第一部分中描述的全局置换方法)。与 LIME 不同,联盟不是根据距离度量(欧几里德)而是根据联盟理论(大和小排序更重要)来加权的。
在这篇博文中,我们不会讨论 KernelSHAP,但是需要注意的是,它有一个置换方法的主要缺点:当置换一个不存在的特征时,它忽略了特征之间的任何依赖关系,因此产生了许多不真实的组合。此外,虽然许多公司将 SHAP 值视为 shapely 值,因此对其正确性有数学保证,但 KernelSHAP 是一种*似方法,并不能给出精确值。

TreeSHAP 提出了一种算法,该算法随着特征的数量以多项式速率增长。此外,Shapley 值的可加性意味着我们可以通过对单个树进行加权*均来计算树集合的 Shapley 值。TreeSHAP 算法只采用树中“允许的”路径,这意味着它不包括置换方法中的非现实组合。相反,它采用某个联盟“可到达”的所有最终节点的加权*均值。

让我们看一个类似 LIME 的例子,用 TreeSHAP 来解释这个预测。

>样本#35:男性,年龄= 11 岁,头衔=先生……没有活下来

红色箭头表示提高预测的要素,而蓝色箭头表示降低预测的要素。基本值是所有预测的*均值。输出值是全局模型输出。每个特征旁边的值是目标样本中该特征的实际输入值,而不是 shapley 值!最后,虽然箭头的大小与推力的大小成正比,但它们实际上是用对数比数而不是概率来衡量的。下面将详细介绍这一点。

看一下这个具体的例子,我们可以发现石灰预测的两个主要差异:

  1. SHAP 解释了我们模型的预测。也就是说,它不会训练另一个模型,因此让我们的解释者预测和解释不同的结果是没有危险的。
  2. TreeSHAP 着眼于与一般基值相比的特征重要性,而 LIME 训练局部模型。这意味着,当在本地环境之外观察时,一些特征,如年龄,可能具有相当不同的影响。

SHAP 工作空间:对数优势与概率

在分类中,很容易将全局输出视为一个类的概率,一个介于 0 到 1 之间的值。然而,它不是可加的。因此,TreeSHAP 在对数优势空间中工作,输出 shapley 值作为对数优势贡献。由于对数优势空间中的输出很难解释,因此将其转换回概率是有意义的。这是通过使用上面的可视化函数中的“链接”参数来完成的,事实上,力图的可视化刻度标签显示的是概率。但这只是变换了轴(现在不是线性的,因此分布不均匀),而不是单个的 SHAP 值。如果出于某种原因,您需要特性的单个 SHAP 值,您只能使用*似法来获得它们(至少是有效的)。您需要将输出值和基础值转换为概率,并拉伸它们之间的 SHAP 值。
:在最新版本(0.34)中增加了一个model _ output = ' probability '的选项。使用此选项,我们可以使用 DeepSHAP 重定标器直接将 SHAP 值转换为概率。然而,它只适用于“干预性”特征扰动,这意味着它使用因果推理规则来打破特征之间的依赖关系,并需要背景数据集。

SHAP 全局可解释性

这一部分可能属于“第一部分:全局可解释性”的博客文章,但是我认为在这里,在阅读了关于 SHAP 的解释之后,会更好地理解。

SHAP 可用于使用所有本地实例的组合或*均来进行全局解释。为此,我们可以使用“条”选项和“点”选项绘制汇总图,以生成两种类型的图:

左侧图中的每个点都是单个要素的单个实例中的 shapley 值。颜色代表该特定实例中的特性值。在右图中,我们可以看到所有实例中每个特征的*均 shapley 值。虽然右边的图产生了“特征重要性”的一些版本,如在全局可解释性部分中所描述的,但是在这种情况下,重要性值表示特征影响结果的程度,而不是模型性能或模型构造。然而,右边的图没有显示影响的方向,此外,也没有显示特征值和特征影响之间的相互作用。这些可以在左图中看到。看左边的图,我们可以清楚地看到一些特征(性别,客舱等..)在他们的价值和的影响方向之间有很强的关联。另一个选项(有点类似于 SibSp 特性)是在值和影响幅度之间建立强关联。

摘要

  • 虽然相对简单且易于使用,但石灰法不能满足监管机构的要求,应谨慎使用,以确保最终用户的可解释性。事实上,代理模型可以潜在地解释一个完全不同的预测,这是令人担忧的。
  • SHAP 方法有很多优点。首先也是最重要的,源于博弈论,背后有数学证明。这对监管者来说当然是很有吸引力的。其次,它解释了预测本身(考虑到时间因素,这并不明显)。第三,至少对于 TreeSHAP(但是对于 KernelSHAP 来说不是),它通过只使用有效的树路径消除了所有排列方法中的依赖性问题。最后,对 SHAP 值的解释是相对直观的:“每个特征导致偏离基准值的程度”。记住这一点,并不是一切都是完美的。SHAP 解释仍然缺少对反事实解释的引用(改变特征的值将如何影响结果)。此外,与 LIME 给出的简单解释不同,SHAP 提供的解释包括所有功能,这很难让人理解和使用。
  • 虽然没有在本文中讨论,但是 LIME 和 KernelSHAP 也可以用于非结构化数据,比如图像和文本。对于这样的数据,两种模型都依赖于额外的强假设和启发来产生将被使用的特征。然后,在 SHAP 置换这些特征是幼稚的,不一定有任何意义。
  • 最后,两篇博文中回顾的大多数方法都将特性视为独立的个体。它们既没有解决特征相关性,也没有解决特征依赖性。但是,虽然像 TreeSHAP 这样的方法解决了特征依赖偏差,但是没有一种方法在解释中结合了一个以上的特征。也就是说,他们忽略了“整体大于部分之和”的现象。这是所有解释方法的一个主要缺点。

参考

  1. 米勒蒂姆。"人工智能中的解释:来自社会科学的见解."人工智能267(2019):1–38。
  2. https://christophm.github.io/interpretable-ml-book

容易解释吗?增强树的全局可解释性

原文:https://towardsdatascience.com/is-it-easy-to-explain-part-i-global-explainability-in-boosted-trees-cac51ae63a4c?source=collection_archive---------18-----------------------

我为什么要相信你的解释?对最常见的解释方法,它们的优点和局限性有更批判性的观点。随着对模型可解释性需求的增加,越来越多的公司、专业人士和组织引入了一些方法来为他们的模型产生解释。然而,这些方法能实现吗?我们能相信他们的结果吗?

毛绒设计工作室Unsplash 上的照片

在这篇博文以及以后的一篇博文中,我们的目标是调查现有的非线性模型可解释性的方法,重点关注实用性、局限性以及现有实现方法的开箱即用行为。
我们将从全局解释开始,特别是那些在树和提升树上实现的解释。一篇关于本地可解释性的未来文章的链接将会在发表后添加到这里(很快……)

随着模型变得越来越复杂,它们通常也变得更像一个“黑箱”。虽然准确性似乎有所提高,但在许多领域这还不够。为了让人们和监管者相信模型做出的预测,他们通常需要推理——理解什么 导致模型做出某种预测。此外,研究、开发、尤其是调试黑匣子几乎是不可能的。对模型中活跃力量的洞察有助于数据科学家和专业人员更好地理解他们的模型以及模型何时更有可能失败。

虽然存在许多解释的方法,我们可以粗略地把它们分成两大类:(1)全局解释和(2)局部解释。
全局可解释性努力从整体上展示关于模型的一些东西,从整体上接*它,而局部解释与小环境或特定实例相关。

全局可解释性对于“幕后”目的特别有用。当我们想要了解我们的模型依赖于哪个特性,并且能够调试它,识别数据泄漏或者考虑执行特性选择时。

在这篇博文中,我将关注三种不同的全局可解释性方法:
1 。树构建措施(特征重要性)
2
模型评分措施(排列)3。全球化的本地方法(SHAP)

这篇文章中使用的所有代码的笔记本可以在这里查看。

特征重要性

我将讨论的第一种全局可解释性方法是基于树的模型特征重要性。为了演示所提出的一些观点,我将首先创建一个合成数据集,并在其上训练一个 XGBoost 模型。这是一个非常简单的玩具数据,实际上并不需要所使用的 XGBoost 形式的“大枪”,但是请耐心听我说一会儿。

玩具数据和模型

一些背景:我们正在与一个非营利组织合作,该组织需要帮助从 18-25 岁的人群中识别潜在的奖学金候选人。获得奖学金最明显的条件是成为一所公立大学的学生。此外,*均收入对个人的机会也有影响。为了帮助他们,我们构建了一个 XGBoost 模型,该模型基于奖学金获得者的历史数据和这两个特征输出分类预测:
1。此人目前是否是学生
2。收入*均值根据四分位数分类:Q1(最低),Q2,第三季度,第四季度(最高)。
由于 XGBoost 不能处理分类数据,我们必须进行标签编码或热编码。我们选择标签编码,因为四分位数显然有一个内部顺序。四分位数 1 将被编码为 0,Q2 被编码为 1,以此类推..

对于模型,如上所述,我们使用 XGBoost。这是一个基于决策树的集成模型。
简而言之,树集成模型属于两种方法中的任何一种:Bagging 或 Boosting。虽然 Bagging 利用组合来自多个树的多个决策来形成最终预测,但是 Boosting 更加动态。在提升中,学习是连续的,其中错误分类的样本在随后的学习器中被给予更高的权重。
XGBoost 代表“极限梯度提升”。梯度推进是推进的特例,而极端梯度推进是极端梯度推进。在梯度推进中,我们使用梯度下降作为优化器和损失函数。每棵树都试图恢复前一棵树的损失。

完整的 XGBoost 类,也包括使用贝叶斯优化的超参数搜索,可以在这里找到。该类的当前用法:

在训练了 XGBoost 模型之后,我们构建了我们的决策树集合。在这一阶段,人们很容易开始询问每个特征在构建树的过程中所扮演的角色。但是,由于这是一个树的集合,并且在一个梯度上有更多的树,简单地看树的节点和分支并推断这是不可能的。幸运的是,XGBoost python 模块有一个绘图 API,它提供了一个“plot_importance”函数,可以为我们绘制各种特性的重要性。这个函数可以作为黑盒,但是我们实际得到的是什么呢?

重量度量

有趣的是,比较 XGBoost 中不同特性重要性的默认度量是权重。来自文档:

' 权重 ': 一个特征被用于跨所有树拆分数据的次数

对具有上述合成数据的训练模型使用 plot_importance 给出以下结果:

图 1:使用权重度量的特性重要性

结果似乎表明,收入群体比是否是学生更重要。但是,如果我们改变一个小事情:对收入组进行稍微不同的编码,那么现在我们在组号 0 而不是 1 之后:

接下来,我们在两个数据集“编码 1”和“编码 2”上训练模型 n 次(100 ),并绘制两者的*均特征重要性和标准偏差:

图 2:使用两种标签编码之间比较的权重度量的特征重要性。

突然间,学生特征和收入特征变得几乎同等重要!简单地改变编码会导致函数输出完全不同的结果。

这个非常简单的例子演示了使用“重量”度量时可能出现的一个主要问题。由于权重被定义为一个特征被用于分割数据的次数的,因此与多分类/连续特征相比,它非常偏向于二元特征。简单地改变编码可以让模型对收入群体进行更少的划分,从而降低其重要性。但是一个特征所负责的分裂数量真的证明了它的重要性吗?

其他功能重要性指标

图 3:使用所有可用指标的特性重要性

特征重要性函数为我们提供了更多的度量选项。上面我用所有选项绘制了重要性结果,原始(左图)和归一化(右图)。对比结果真的很混乱。对于特征重要性问题,每个度量产生不同的结果,不仅仅是绝对值,还有特征之间重要性的相对分布。那么哪个标准是正确的呢?哪个特性更重要?

通过检查每个度量标准,至少可以提供这些问题的部分答案。

增益所有分割的*均增益用于

总增益该特性在中使用所有分割的总增益

:XGBoost 中的“增益”是指分割的*均值,而通常不是(此处与“总增益”相同)。

增益表示由于分离而获得的纯度。这由到达该节点的数据量来加权。
常规决策树中,使用“基尼指数”计算增益:

c——类别总数

对于标签中的每个类,随机选取该类的概率乘以互补概率。

该指数是为每个节点计算的,增益由通过该节点的数据的纯度相对于子节点的纯度的增加来定义。完整的等式还包括基于到达每个节点的样本百分比的加权归一化:

w —到达每个节点的样本百分比,G —基尼指数

在 Xgboost 中,所用的增益有点复杂。有兴趣的可以在这里阅读文档中的完整描述。

Cover使用该特性的所有分割的*均覆盖率。

总覆盖率所有分割特征的总覆盖率用于

从代码文档中(不容易找到):“覆盖率是分类到叶子的训练数据的二阶梯度的总和,如果它是*方损失,这简单地对应于该分支中的实例的数量。节点在树中越深,这个度量就越低,这意味着,对于每个分裂,我们需要计算每个样本的二阶梯度,并乘以样本的数量。
对于 p(预测)和 y(真实标签),在“reg:logistic”目标的情况下,成本函数是 (y-p),,因此二阶导数是常数。而对于“二元:逻辑”目标的情况,成本函数是-(y * log(p)+(y-1)*(log(1-p)),二阶导数(关于 x,用 p=1/(1+e^-x)是 p(1-p)。

查看图 3 和各种指标的定义,我们可以得出一些一般性的观察结果:

  • 权重覆盖增益对每个特征参与的分割数量敏感。虽然权重随着分割数量的增加而增加,从而有利于具有更多面元的特征,但是如果分割发生在树的深处,则覆盖增益随着分割数量的增加而减少,从而导致相反的效果。考虑使用“总增益”或“总覆盖”。
  • 在选择用于评估和可解释性的指标时,另一个考虑是在创建树时查看 XGBoost 优化器使用的指标。如果没有参数传递给优化器,那么 XGBoost 的默认选择是“gain”度量(1)。

排列重要性

另一种推断特征重要性的方法是看当特征不存在时分数是如何被影响的。确切地说,这个特性并没有被完全丢弃,因为我们需要它来构建模型,而是被“噪声”所取代。噪声是从与原始数据相同的分布中抽取的随机值。为了避免需要为特征产生新的值,通过混洗现有数据来引入噪声。

数据和工具

对于这一部分以及以后的部分(包括未来的帖子),我将使用来自 Kaggle 的更复杂和更高维度的数据集:“泰坦尼克号:机器从灾难中学习”。关于数据集的更多细节可以在这里找到。

eli5 包提供了与许多模型兼容的排列重要性包装器。我们将使用它。
:我们用于排列重要性计算的测试集是不是ka ggle 提供的测试集,而是从训练前的训练集分离出来的随机生成的测试集,因此有标签。

eli5 置换功能重要性函数的最基本用法如下所示。

使用这个函数,我连续五次置换测试集和训练集,收集输出并绘制它们:

图 4:根据训练集和测试集计算的排列特征重要性

y 轴显示了不同特征的权重,即导致置换该特定特征的得分的减少。值越高,影响越大,因此特性的重要性也越大。
不同颜色的条代表整个函数的单独运行,而误差条代表由排列产生的运行内标准偏差。

应该用训练集还是测试集?直观上,评分的评估应该在测试集上进行,因此特征重要性也是如此。具体来说,我们希望了解模型没有训练的样本上的特征的重要性,从而使用测试集。或者,出于调试目的,我们可能想要评估我们的模型。在这种情况下,我们希望了解它在多大程度上需要一个特定的特征来进行预测,然后使用训练集可能更有意义。
最后,也许比较训练集和测试集之间的排列重要性可以给我们最深刻的见解。特别是,训练集和测试集中的特征的顺序和重要性之间的不匹配可以揭示我们的模型中缺乏泛化能力。

在任何情况下,是否使用测试集、训练集或比较它们的决定应该基于我们的目标:我们想要评估我们的训练过程还是我们想要评估新数据上的特征的使用。

应该如何处理方差?内部方差(运行中的标准偏差)和交叉方差(图 4,不同颜色的条)都存在。这当然是由于算法中的随机性,以及当我们将排列等同于“丢弃特征”时,我们实际上是在使用现有的值,这可能导致所有不同的组合。特别是在小数据集,这甚至可以导致组合,甚至增加分数。当然,这种变化是有问题的,但是可以通过*均重复次数来稳定。

如何处理特征依赖和关联?这是该方法的一个主要问题(事实上,也是大多数被审查方法的主要问题)。相互依赖的特性的重要性只有在一起衡量时才有意义。考虑到它们的组合,它们将成为强有力的预测器,而它们中的每一个单独也不能解释输出。目前在库中没有一个选项来排列特征的组合。

此外,随机排列的相关特征可能会导致不太可能的组合,这些组合可能被认为是不符合分布的。这可能会产生偏差,导致表示“特征丢失”情况的错误值。

比较和对比

为了比较所讨论的方法,我们将查看排列部分中出现的相同的巨大数据。我们将比较所有特征的重要性排序(忽略实际值): XGBoost 特征重要性函数与测试集上的“总增益”度量和置换方法以及训练集上的置换方法。

上表显示了每种方法的特性重要性排序。根据该方法,排名#1 的特征是最重要的特征,而排名#9 的特征不太重要。
从表中可以很容易地看出,虽然在测试数据上计算的排列和在训练数据上计算的排列之间存在一些相似性,但是使用总增益方法与特征重要性的相关性很小。事实上,在所有三个模型的前三个特性中,只有一个特性是三者共有的:

有趣的是,但并不奇怪(如果你读了这篇博文的第一部分),特征重要性明显优先于连续/分类特征,如年龄或费用。请注意,即使我们使用一次性编码并将合成特征之间的得分相加也是如此(如果您使用诸如“增益”之类的*均重要性度量,则不能直接这样做)。

最后,为了与一种已知的局部方法进行比较,这种方法有更多的理论基础,我们还将与 SHAP 方法进行比较。关于局部预测的 SHAP 方法的更多解释,你可以在即将发布的《局部可解释性 系列文章中阅读。不过,在这里,我将对测试集中的所有实例使用 SHAP 方法,并对它们进行*均,以产生一个全局解释。

图 5:使用*均 SHAP 值的全局解释

在上图中,我们看到各种特性的*均绝对值 SHAP ,因为它们是在整个测试集上计算的。这里的一些更“重要”的特征在先前测试的全局方法中也排名较高(性别、年龄、费用),而其他特征(客舱、头衔)在全局方法中排名相对较低,但是当使用局部方法进行全局观察时,似乎具有更大的影响。总的来说,SHAP 方法似乎产生了一种其他两种方法的混合结果,对分类(标题)、连续(年龄)和二元(性别)特征都给出了较高的排名。我们将在以后的博客文章中讨论它的优点和局限性。

摘要

  • 我们讨论的这两种方法各有优缺点,但是虽然特征重要性方法只适用于基于树的模型,但是置换方法是模型不可知的,并且被广泛使用。
  • 置换方法可用于训练集或测试集(或两者)。这是一个重要的决定,它取决于解释的目标。比较特征对训练集的贡献和对测试集的贡献,一方面可以帮助理解模型的泛化,另一方面可以发现过度拟合。
  • 在置换方法中忽略特征依赖性和相关性意味着被评估的许多组合实际上是不可能的,但是用作比较模型性能下降的参考。
  • 也许这些方法最明显的限制(剧透:这些方法也将在以后的文章中介绍,将处理局部可解释性)是不能产生交互相关的解释。即使在我们超级简单的玩具数据中,两个特征(作为学生或收入群体)都不能单独解释这个结果。这是他们的组合(作为学生属于收入组 1)造成的结果,然而没有一种方法可以产生这种解释。

总的来说,虽然还没有方法被证明能够完整地回答“在我们的模型中,哪些是最重要的特征”这个问题,但是“重要”到底是什么意思还不是很清楚。重要性应该反映我们的模型在构建过程中最依赖的特征吗?或者是那些最有帮助的概括?或者,也许我们应该看看能够实现最佳*均精度的特性?
与此同时,似乎通过仔细检查我们的数据(依赖性、二进制对分类对连续特征)并牢记特定的意图,我们可以开始在这些方法之间导航。

参考资料:

  1. https://homes.cs.washington.edu/~tqchen/pdf/BoostedTree.pdf
  2. https://christophm . github . io/interpretable-ml-book/

有没有可能不用编码就做出机器学习算法?

原文:https://towardsdatascience.com/is-it-possible-to-make-machine-learning-algorithms-without-coding-cb1aadf72f5a?source=collection_archive---------32-----------------------

我准备了一个简单的应用程序,向您展示在一个叫做 Orange 的有趣工具的帮助下,这是如何实现的。

马库斯·温克勒在 Unsplash 上的照片

我坚信,用代码制作自己的机器学习算法或任何预测模型的前一步是理解基础知识,并知道如何理性地解释模型。

很多时候,当我们将机器学习或数据分析模型与编码联系在一起时,我们认为建立它是一项非常困难的任务。这里你还有另一个障碍要解决!但是,如果你一开始就专注于理解其背后的理论,那就不一定了。这里有一个小指南来帮助你完成这个过程。

目录:

1.数据分析的重要性。(1 分钟读取)

2.机器学习贡献。(1 分钟读取)

3.理解基础知识:数据验证过程,不*衡数据集,监督和非监督方法。(2 分钟读取)

4.决策树和随机森林介绍。(2 分钟读取)

5.应用程序使用橙色。(6 分钟读数)

1.为什么选择数据分析?

如今,我们可以从成千上万的数据源中提取、转换和加载数据,包括股票价格、医疗记录、调查、人口普查和记录行为等。此外,我们可以应用这些技术的领域非常广泛,每个领域都有广泛的有用应用,例如欺诈检测、信用评分和与金融领域相关的资产分配。

但是我能用这些知识为一家公司做多少贡献呢? 很多!就把自己放在银行信贷风险分析师的位置上。我应该借钱给这个客户还是拒绝他的申请?我应该要求他或她提供多少信息,而不冒失去与贷款相关的利率的风险?他的定期工资单够了吗?还是我也要问他其他金融机构的信用记录来保证还款?”。数据分析和机器学习模型在自动化日常任务(如本任务)、处理大量信息和优化指标以增强业务可持续性方面发挥着重要作用。

最终目标是对数据做出有意义和可解释的推断,提取变量之间的关系,并检测模式以预测变量的结果。

我们来看看科技公司的案例。为了实现和增长他们的商业价值,他们的重点必须放在提高业务指标和取悦用户上。数据分析为这些公司提供了不断变化的洞察力指标,使他们能够打造更好的产品。使命:了解用户,所提供的产品如何融入他们的生活,他们的动机是什么,他们的体验如何,以便改进它。所有这些以及更多的都可以通过使用数据来实现。

2.机器学习在这一切中扮演了什么角色?

实话实说,在你的公司预算中可能不需要机器学习。这是为什么呢?因为大多数公司需要在流程、客户体验、成本降低和决策制定方面进行改进,所有这些都可以通过实施传统的数据分析模型轻松实现,而无需借助更复杂的 ML 应用程序。

尽管如上所述,传统的数据分析模型是静态的,并且对于快速变化的非结构化数据输入的使用有限,这些数据会快速且不断地发生变化。这时,对能够分析数十种输入和变量的自动化流程的需求就出现了。

此外,两种方法的解析过程有很大不同,因为 ML 模型侧重于从用户处接收已确定目标的输入,并从快速变化的数据中学习哪些因素对实现该目标很重要,而不是由用户设置将决定目标变量结果的因素。

它不仅允许算法进行预测,还允许算法与预测进行比较,并调整结果的准确性。

3.了解基础知识:

数据验证过程: 在执行机器学习算法并选择我们可以分析数据的最佳方式的过程中,我们将其分成两个子集:训练子集测试子集,以便我们的模型与训练数据相匹配,并对测试数据进行预测,作为对现实问题的模拟。

作者图片

我们如何执行数据分割并不简单,因为我们不想偏向任何子集。例如,在处理一个公司客户样本的数据时,我们不希望分割训练和测试子集,而不在两个子集中包含每个类别的同等代表样本。因此,我们说数据拆分必须以分层随机的方式进行。

不*衡数据集: 当一个类的实例比另一个类的实例多得多时,就称数据不*衡。在数据分类过程中,模型可能没有足够的类实例来了解它,结果会使分析产生偏差。

作者图片

有几种采样方法可以处理这个问题,包括欠采样、过采样、合成数据生成和成本敏感学习。在本文中,我将深入探讨过采样。

监督和非监督模型:

  • 监督学习:包括手动告诉模型我们想要为训练数据集预测什么标签。
  • 无监督学习:由于我们不知道标签,我们要求模型根据每个元素具有的更明显的特征来对数据集中的元素进行分组。

4.决策树和随机森林简介

决策树算法的结构是关于数据集中观察值的问题和答案的层次结构,以帮助模型进行分类。下面的方案就是一个例子,它简化了确定棒球运动员工资的基本问题结构:

决策树示例—作者图片

在该图中,我们看到了一个两级决策树的表示,其中第一步分类与个人作为职业球员的年数相关,而回答该问题的条件是每个赛季的命中数。在这个例子中,联盟中每个球员的工资将按照这个模型的指导方针来确定。

最合适的模型将是更好地代表所研究的变量之间的实际关系的模型(如果棒球运动员的工资和多年的经验是线性相关的,那么线性回归可能是最合适的模型)。随机森林是各种技术之一,这些技术允许我们表示变量之间更复杂的关系,这些关系不一定是线性的、指数的或对数的。

例如,在一个球员的经验少于 4.5 年的情况下,他的工资的决定完全取决于他的职业经验,而不是击球次数。

问题方案的最终目标是以一种尽可能不同的方式分割观察结果。最后,将根据满足的不同条件对观测结果进行分组:

决策树分类示例—按作者分类的图片

随机森林

利用决策树的分类机制是基于大量个体树的“集合”。让我们用一个简单的比喻来说明这个概念:

盲人摸象,公共领域

每个盲人都有一个任务:根据他触摸的身体部位推断出动物。就本文的目的而言,这个比喻意味着每个盲人都是一个模型,而大象就是要预测的价值。如果他们都接触同一个部位,他们可能会错误地推断出哪个是动物。因此,最好将它们分散开来,以便能够从不同的“信息”集中“学习”。此外,我们将尝试组合独立预测无效的模型(或盲人),以优化模型的输出。

代替触摸动物的一部分,该模型将实际分析一个选定的数据集(通过样本的重新定位),该数据集通过 引导 获得。不幸的是,这种方法不能保证所选数据集不相关,主要是因为""强预测值通常优于其他指标。这就是随机森林发挥作用的地方,因为它的主要功能是随机选择数据集,忽略“强”预测。

5.我们要用什么工具?

Orange 是一个开源工具,它允许我们执行广泛的数据操作任务,如数据可视化、探索、预处理和建模创建,而无需使用 Python、R 或任何其他代码。如果你是在这条漫长的学习道路上迈出第一步,这是最理想的。

它也适合更高级的用户,因为它包括 Python 窗口小部件,可以输入 Python 脚本来补充它所提供的窗口小部件。进入下面的链接继续安装程序。

1.打开一个新文件

初始用户界面—作者图片

2.将文件小部件拖到画布上,并通过双击文件小部件浏览本地服务器中的数据集。

在这种情况下,我将利用一个数据集,该数据集包含一家金融机构的 150,000 名客户的样本。“SeriousDlqin2yrs”列将是准备我们的模型时的目标变量。

你可以在我的 GitHub 的链接中找到数据集。

**注意:不要担心灰色的“应用”按钮,因为它仅用于确认对每个特性中的值所做的更改,例如在修改“角色”或“值”选项卡之后。

文件加载界面—作者图片

3。可视化数据集的默认特征和分布 从左侧面板的“数据”和“模型”和“可视化”中拖动“特征统计”和“分布”小部件。使用这些工具,您可以更好地查看数据集中每个要素的描述性统计数据,例如*均值、离差、最小值、最大值和缺失值。

要素统计微件-按作者分类的图像

分发小部件-按作者分类的图像

4.选择行

过滤列数据以避免干扰分析准确性的不正确值。我们可以为特性设置条件,例如值低于 X 数量或等于 Y 数量。

选择行—按作者选择图像

5.选择列

从原始数据集中选择用于分析的重要要素,并使用微件“选择列”创建仅包含这些要素的新数据集。这是一个小部件,您可以在其中确定选定的列,并指示目标变量以供进一步分析。

选择列界面-按作者分类的图像

6.数据采样器

数据采样器小部件用于将过滤后的数据集分成训练和测试子集。在 Orange 的界面中,我们可以选择一个“采样类型”来输入我们想要的采样方法。特别是,我选择了全部数据的 70%作为“训练样本”,剩下的 30%作为“测试样本”。正如本文前面提到的,正如 Orange 的界面所反映的,子集的数据选择是通过分层样本随机进行的。

数据采样器界面—作者图片

7.不*衡的数据集分辨率

为了解决上面解释的不*衡数据集问题,我决定执行过采样技术,而不是 SMOTE ,因为我认为 Orange 中不包含此功能的小部件。

1 .选择“默认值,这是来自训练子集的少数类,因为我们想要随机复制观察值以*衡数据集。在可视化中,您将看到小部件之间的链接或边有图例,您必须在图例中指出您想要将什么数据传递给“接收”小部件。在这种情况下,“选择行”小部件包含一个训练子集,从中发送“匹配数据”或“默认值”。另一方面,我们发现“不匹配的数据”,即来自训练子集的“无默认值”,它们被直接发送到“连接小部件。

过采样方法的一个优点是,相对于欠采样,它不会导致信息损失。它的缺点是,由于它只是简单地在原始数据集中添加重复的观察值,它最终会添加几种类型的多个观察值,从而导致过拟合

2.数据样本小部件随机复制固定数量的观察值

3. Concatenate 小部件将新的观察结果与“旧的”观察结果连接起来,以便最终获得一个*衡的数据集提交给我们的模型。

橙色画布——作者图片

8.使用随机森林对*衡训练数据集执行预测

让我们继续有趣的部分:建模随机森林。要执行此任务,请从“模型”部分选择小部件“随机森林,并将其链接到*衡训练数据集。

我们将测试“深度”超参数,以优化模型。超参数是模型的一种“设置”,可以通过调整来提高性能。对于随机森林,超参数包括:

  1. 林中决策树的数量
  2. 分割节点时每棵树考虑的特征数量,也称为模型的“深度”或“增长”。

如下图所示,第一个模型有一个 3-tree 深度限制,第二个模型在优化中的深度没有限制。

具有 3 棵树深度限制的随机森林—图片由作者提供

没有深度限制的随机森林—图片由作者提供

9.测试和分数小部件

这个小部件用于根据训练数据集评估模型的结果。它将根据定义的折叠数执行交叉验证。这些折叠是从训练样本中创建的子集的数量,该训练样本将在回合中运行以评估整个数据集。

生成的界面是所用模型的列表,作为性能与获得的指标的比较。在下一步中,我将解释每个指标的含义。

测试和评分界面—作者图片

10.混淆矩阵

为了简化练习,我将使用我们运行的两个模型中最有效的模型进行解释。混淆矩阵是一种性能测量工具,用于根据预定的指标评估机器学习模型。输出是一个包含如下值组合的表:

Sarang Narkhede,理解混乱矩阵

  1. 真正的正面结果(TP): 模型正确预测了正面结果(例如,它预测它将“不会违约”,并最终没有违约)。
  2. 真正的负面结果(TN): 模型正确预测了负面结果(例如,它预测它将“违约”并结束违约)。
  3. 假阳性结果(FP): 模型未能预测到阳性结果(例如,它预测到它将“违约”,但最终没有这样做)。
  4. 假阴性结果(FN): 模型未能预测到负面结果(例如,它预测到它将“不会违约”,并结束了这种预测)。

该矩阵作为一个小部件包含在 Orange 中,具有以下界面:

混淆矩阵界面—图片由作者提供

对于测量召回精度F1 得分精度AUC-ROC 曲线极其有用:

  • 准确率:模型成功分类的预测比例。

  • 精度:所有正面预测中正确预测结果的比例。

  • 回忆:模型正确预测的积极结果部分。

  • F1 分数:它是精确度和召回率的结合,也用来衡量测试的准确性。

结论

这篇文章的动机是展示如何在没有一行代码的情况下应用复杂的机器学习算法,但我最终认为它是一个理论推动者,希望能成为阅读这篇文章的每个人的动力。

参考

感谢您花时间阅读我的文章!如有任何问题、建议或意见,欢迎联系我:herrera.ajulian@gmail.com

有可能用神经网络预测股票价格吗?

原文:https://towardsdatascience.com/is-it-possible-to-predict-stock-prices-with-a-neural-network-d750af3de50b?source=collection_archive---------2-----------------------

当谈到时间序列预测时,读者(听众、观众……)开始考虑预测股票价格。预计这将有助于确定何时卖出,何时买入更多。有时我们会看到描述如何做到这一点的论文。论文[1]在这里提供了一个例子,作者甚至提供了一些结果。然而,Chollet 的《用 Python 进行深度学习》一书强调,人们不应该试图使用时间序列预测技术来预测股票价格。Chollet 在某种程度上解释说,在股票市场的情况下,关于以前状态的数据不是估计未来状态的良好基础。在文献[3]中,作者甚至得出结论,股票价格是鞅,因此,未来价格的最佳估计(就估计误差而言)是当前价格。

那么,有没有可能用神经网络来预测股票价格呢?

一些理论

免责声明 :本理论概述反映了本人对该课题的认识,因此可能会使用不正确的术语,完全不正确等等。所以如果你知道的比我多,你可能会笑死。我警告过你。

什么是份额?股票是证明持有者有权要求分享公司利润的文件。这意味着股票的价格应该取决于公司的利润。此外,股票的价格并不取决于确切的公司利润,而是预期利润。这意味着股票的价格代表了市场交易者对未来利润的看法。而且观点可能是错误的。我们都记得这样的故事:初创公司成本很高,但最终似乎没有提供任何革命性的东西,然后几乎完全失去了市场价格。因此,我们可以得出结论,股票价格取决于市场交易者的主观意见。

考虑下图。该图描绘了马士基公司的股价走势图。可以看到,在 2019 年 4 月 2 日,一股股票的价格是 7718 DKK。第二天的价格是每股 7750 DKK。原因是什么?我们可以在图的底部看到一个小写字母D。这封信意味着公司在这一天支付股息,显然,股息大到足以刺激需求。所以,即将到来的事件会导致价格上涨。

马士基股价

现在考虑另一个情节。这张图显示了 Yandex 的股价。这几天,我们听到有传言称,其中一家银行将收购 Yandex。通常,在这种谣言中,股价会上涨,因为这意味着买方将从市场上购买股票,从而增加需求。这一次,投资者认为这些都不是好消息。

Yandex 股票价格

我们可以在这里得出一个简单的结论:股价主要取决于交易员对公司未来的看法,而不是之前的价格本身。因此,用以前的价值来预测未来的股票价格是没有意义的。

我们应该使用目标所依赖的,或者至少是相关的值来预测一些事情。就股票价格而言,人们必须考虑市场之外的事件。很可能,使用神经网络来预测这样的事件是不可能的。事实上,更多的交易者破产了,而不是成为亿万富翁,这告诉我们,一个人并不经常能够预知未来。想知道更多关于预测不可预测的事情,请阅读纳西姆·尼古拉斯·塔勒布的《黑天鹅》一书。

实践

理论上,理论和实践是高度相关的,但实际上,它们并不相关。在这里,我们将尝试预测一些事情,看看会发生什么。

我们将训练一个神经网络,它将使用 n 个已知值(以前的价格)预测第(n+1)个价格。我们假设两次后续价格测量之间的时间是恒定的。首先,我们需要数据集。我们可以在雅虎财经了解股票价格

我们将预测每日价格,这意味着一天在数据集中用一个值表示。我们将使用前几天的收盘价来预测收盘价。我们将使用马士基作为测试公司。
我们将使用yfinance Python 包获取数据。我们应该考虑到雅虎可能会改变他们的 API,所以软件包可能会意外停止工作。这种情况至少已经发生过一次,所以我们必须为其他变化做好准备。所以,让我们安装软件包:

pip install yfinance

有关如何使用该软件包的更多信息,请参见此处。现在,让我们联系市场:

import yfinance as yf# create the object that represents Maersk stock data
# here MAERSK-B.CO -- is the Maerks's ticker
maersk = yf.Ticker('MAERSK-B.CO')

我们还没有下载任何数据,我们只创建了可以用来请求数据的对象。雅虎财经为马士基提供股息信息,正如我们已经看到的,股息影响股价。因此,我们希望神经网络在预测价格时将股息考虑在内。这意味着,当我们告诉网络使用前几天的一组价格来预测某一天的收盘价时,我们还需要为它提供一个标记,来告诉它当天是否支付股息。要获得支付股息的日期,请检查maersk.dividends属性。为了得到股票价格,我们称之为history方法。该方法需要几个参数,我们对periodinterval特别感兴趣。

period参数定义了我们请求数据的时间段。该参数支持一些预定义的字符串值,我们将使用其中的一个。我们传递字符串’max’,它告诉我们所有可用的数据:从股票上市的第一天开始,直到今天。使用startend参数可以定义精确的周期。然而,由于我们将使用所有可用的数据,我们将使用period参数并传递’max’

interval参数告诉该方法两个连续值之间的间隔。它采用一个预定义的值,我们将传递’1d’到那里,因为我们将使用每日价格。

你可以在这里阅读更多关于history方法及其论据的内容。

所以,是时候拿点数据了!

history = maersk.history(period='max', interval='1d')

现在history变量保存了一个包含价格的熊猫数据框架。让我们来看看它们:

马士基股价数据框架

是时候准备数据了。当设计一个神经网络来预测时间序列时,应该决定网络将有多少输入。在我们的例子中,我们必须选择输入网络的价格数量来预测下一个价格。由于我们现在不知道这个数字,最好能够生成具有不同输入量的数据集。幸运的是,Keras 开发人员已经考虑到了这一点,现在 Keras 提供了一个时间序列生成器,可以生成具有不同输入量的数据集。在时间序列预测的情况下,输入值和目标值都来自同一个序列。这意味着我们使用大小为j的滑动窗口,其中j是我们用来预测第(j+1)个值的值的数量。换句话说,我们取时间序列的j个后续元素({x₁, x₂, ... xⱼ}),然后取第(j+1)-个元素(x₍ⱼ₊₁₎)并将其设置为目标值。该对(j值,(j+1) -th 值)构成单个训练示例。为了进行另一个训练示例,我们将滑动窗口移动一个,并使用{x₂, x₃, ... x₍ⱼ₊₁₎}作为输入,使用x₍ⱼ₊₂₎作为目标值。

Keras 为我们提供了 TimeseriesGenerator 类,我们将使用这个类来生成训练集。这里唯一的困难是,我们还希望网络将红利考虑在内。因此,我们必须编写一个函数,使用TimeseriesGenerator类来生成训练集,然后用有关红利的信息丰富生成器的输出。

def generate_series(data, value_num):
    close = data['Close']
    dividends = data['Dividends']
    tsg = TimeseriesGenerator(close, close,
                              length=value_num,
                              batch_size=len(close))
    global_index = value_num
    i, t = tsg[0]
    has_dividends = np.zeros(len(i))
    for b_row in range(len(t)):
        assert(abs(t[b_row] - close[global_index]) <= 0.001)
        has_dividends[b_row] = dividends[global_index] > 0            
        global_index += 1
    return np.concatenate((i, np.transpose([has_dividends])),
                           axis=1), t

该函数有两个参数:我们希望它处理的数据集(data参数)和序列应该具有的输入值的数量(value_num参数)。

如您所知,神经网络是使用梯度下降来训练的,该梯度下降采用成本函数的梯度。最简单的方法假设我们使用整个数据集计算成本函数梯度。然而,这也有不好的一面。首先,数据集可能非常大,这将使得计算梯度非常耗时。其次,如果数据集非常大,那么梯度值也可能非常大,大到根本不适合机器精度。当然,第二个问题在极端情况下通常很重要(有点双关的意思)。一些聪明人指出,我们实际上并不需要精确的梯度值[4]。我们只需要它的估计来确定我们应该向哪个方向移动以最小化成本函数。因此,我们可以使用训练样本的一个小子集来估计梯度。当然,我们最终将遍历整个数据集,但没有必要一次计算整个数据集的梯度。我们可以将数据集分成几个称为批处理的子集,一次只处理一个批处理。我们使用为单个批次计算的梯度来更新网络的权重。一旦我们处理了所有的批次,我们可以说我们已经运行了一个单一的训练时期。在单个训练期内,可能有多个时期,确切的时期数取决于任务。同样聪明的人强调训练的例子一定要洗牌[4]。这意味着一对后续的训练样本不能属于同一批。
让我们测试该函数并生成一个使用四个输入值的数据集。

inputs, targets = generate_series(history, 4)

让我们看一个例子。

# print(inputs[3818])array([1.246046e+04, 1.232848e+04, 1.244496e+04, 1.274000e+04,
       1.000000e+00])

正如我们所看到的,一个训练示例是一个具有四个价格和一个额外的五分之一值的向量,该值指示当天是否支付股息。请注意,值相对较大。事实上,从 767.7 到 12740.0 的接*价格范围神经网络不适合这样的范围,所以我们必须将数据标准化。我们将使用最简单的归一化策略,最小最大归一化。

h_min = history.min()
normalized_h = (history - h_min) / (history.max() - h_min)

因为我们已经修改了初始数据,所以我们必须重新生成数据集。

inputs, targets = generate_series(normalized_h, 4)

我们来看一下归一化的数据。

# print(inputs[3818])array([0.9766511 , 0.96562732, 0.97535645, 1\.        , 1\.        ])

正如我们所看到的,这些值现在的范围是从 0 到 1。这使得任务更容易。然而,我们现在必须保留h.min()h.max(),这样我们就可以在预测价格时对网络输入进行归一化处理,并对其输出进行反归一化处理,以获得准确的值。

最后,是神经网络的时候了。该网络将具有(n+1)输入、n价格和一个红利指标,以及一个输出。我们还需要确定n。为此,我们将编写一个函数,用指定数量的输入创建一个神经网络。我们使用input_shape=(n+1,)表达式来包含股息指标。

def create_model(n):
    m = models.Sequential()
    m.add(layers.Dense(64, activation='relu', input_shape=(n+1,)))
    m.add(layers.Dense(64, activation='relu'))
    m.add(layers.Dense(1))
    return m

在训练网络之前,我们将数据集分为两部分:训练集和测试集。我们将使用训练集来训练网络,使用测试集来测试未知数据的网络性能。在训练网络时,我们永远不会使用测试集的例子。

train_inputs = inputs[:-1000]
val_inputs = inputs[-1000:]train_targets = targets[:-1000]
val_targets = targets[-1000:]

让我们再写一个函数。这个函数将帮助我们决定网络应该有多少个输入。该函数采用输入的数量来检查要训练的时期的数量。该函数将创建一个网络,为其准备数据,然后训练网络并在测试集上评估其性能。

def select_inputs(data, start, end, epochs):
    models = {}
    for inputs in range(start, end+1):
        print('Using {} inputs'.format(inputs))
        model_inputs, targets = generate_series(data, inputs)

        train_inputs = model_inputs[:-1000]
        val_inputs = model_inputs[-1000:]
        train_targets = targets[:-1000]
        val_targets = targets[-1000:]

        m = create_model(inputs)
        print('Training')
        m.compile(optimizer='adam', loss='mse') 
        h = m.fit(train_inputs, train_targets,
                  epochs=epochs,
                  batch_size=32,
                  validation_data=(val_inputs, val_targets))
        model_info = {'model': m, 'history': h.history}
        models[inputs] = model_info
    return models

现在,让我们用 2 到 10 个输入训练网络 20 个时期:

trained_models = select_inputs(normalized_h, 2, 10, 20)

训练完成后,我们可以得到一个简短的总结,代码如下:

model_stats = {}
for k, v in trained_models.items():
    train_history = v['history']
    loss = train_history['loss'][-1]
    val_loss = train_history['val_loss'][-1]
    model_stats[k] = {'inputs': k, 'loss': loss, 'val_loss': val_loss}

打印model_stats值,我们可以看到摘要:

{2: {'inputs': 2,
  'loss': 6.159038594863468e-05,
  'val_loss': 0.0006709674960002303},
 3: {'inputs': 3,
  'loss': 7.425233190960614e-05,
  'val_loss': 0.00021176348975859583},
 4: {'inputs': 4,
  'loss': 7.471898652647588e-05,
  'val_loss': 0.00022580388654023408},
 5: {'inputs': 5,
  'loss': 8.866131339595126e-05,
  'val_loss': 0.00027424713294021784},
 6: {'inputs': 6,
  'loss': 7.322355930846842e-05,
  'val_loss': 0.0003323734663426876},
 7: {'inputs': 7,
  'loss': 8.709070955596233e-05,
  'val_loss': 0.0004295352199114859},
 8: {'inputs': 8,
  'loss': 8.170129280188121e-05,
  'val_loss': 0.00024587249546311797},
 9: {'inputs': 9,
  'loss': 7.327485314296024e-05,
  'val_loss': 0.0003118165017804131},
 10: {'inputs': 10,
  'loss': 8.064566193526276e-05,
  'val_loss': 0.0003668071269057691}}

正如我们所看到的,用测试集计算的误差总是稍大于为训练集计算的值。这意味着网络对已知数据(训练示例)的处理略好于未知数据(测试示例)。

我们现在可以根据网络的输入数来绘制测试误差。

import matplotlib.pyplot as pltval_loss = []
indices = []
for k, v in model_stats.items():
    indices.append(k)
    val_loss.append(v['val_loss'])plt.plot(indices, val_loss)

不同输入数网络的测试误差

通过该图,我们可以看到哪个网络的测试误差最低。确切的结果可能会随着时间的推移而变化,这取决于通过雅虎财经获得的历史数据量。

有一个有趣的观察。如果一个人运行这个脚本两次,那么他们会收到不同的结果。换句话说,最低的测试误差由不同的网络产生。由于网络之间的唯一区别是输入的数量,因此我们可以得出结论,测试误差并不那么依赖于输入的数量。这反过来支持了最初的猜测,即我们无法用神经网络来预测股票价格。显然,网络训练忽略一些输入,推断输出不依赖于它们。

请记住,我们已经将数据标准化了。现在让我们计算网络的精确误差。

close_min = history['Close'].min()
close_max = history['Close'].max()
for k in model_stats:
    e = ((close_max - close_min) * model_stats[k]['val_loss'] + close_min)
    print(k, e)

输出:

2 771.0400773414451
3 770.341964375037
4 771.6538168560887
5 771.9637314503287
6 770.3164239349957
7 771.5147973106168
8 778.0784490537151
9 779.7546236891968
10 770.8432766947052

哇!误差非常大。即使对于已经显示最低测试误差的网络,精确误差也非常大。老实说,在决定购买哪些股票时,我不会相信一个有这种错误的网络。我也不会建议其他人相信它。

现在我们可以画一个图表,比较准确的价格和预测的价格。

将预测价格与目标价格进行比较

正如你所看到的,图表并不经常匹配。

我们得到了未知数据的大误差值。这意味着网络未能预测收盘价。也许,我们可以通过改变网络架构来改善结果,让它适应更多的时代。我不认为我们能得到更多的数据,因为我们已经使用了所有可用的数据。使用不同公司的数据训练一个网络是可能的,但是由于这些公司可能具有不同的属性,它们的股票价格可能根据不同的规律变化,这只会使网络混乱。

我们要注意的是,网络本身并不预测股价。相反,它试图使用给定值来猜测序列的下一个值是什么。这是因为价格并没有编码下次价格会如何变化。如果价格增长了一段时间,那么不能保证下一分钟不会降低。价格主要受网络不知道的外部事件的影响。

或许,我们将能够使用神经网络进行短期预测,以确定未来几分钟内的价格变化。这可能是因为我们预测的时间段越短,外部事件发生的变化就越小。但是,在这种情况下,使用线性回归模型来预测价格变化的方向可能会更好。

如果我们仔细观察股价图,我们会发现变化看起来是随机的。如果我们只有价格而对外部事件一无所知,这可能是真的。因此,股票价格看起来确实像一个鞅,一个我们无法预测的过程。我同意 Chollet 的观点,你最好不要用神经网络来预测股票价格。

更新

我在这里看到了另一篇关于致力于股票预测的数据科学的帖子。作者尝试使用技术分析向神经网络输入更多可用于预测的值。然而,作者没有成功,他得出的结论是,股票价格大多是一个随机过程,不能根据其自身的价值来预测。这个结论与这篇文章的发现相吻合:你不能用神经网络来预测股票价格,即使使用技术分析来获得更多的数据统计。

参考文献

  1. Bugorskij,v . Ispol ' zo vanie nejronnyh setej dlya modelirovaniya prognoza kotirovok cennyh bumag/v . Bugorskij,a . Sergienko//Prikladnaya informatika。— 2008.—编号 3(15)。(俄语)
  2. Chollet,f .使用 python 进行深度学习— 2017 年。—曼宁出版公司。
  3. Elliot,a .时间序列预测:预测股票价格/ A. Elliot,C. H. Hsu // ArXiv 电子版。— 2017.
  4. 伊恩·古德费勒。深度学习/伊恩·古德菲勒、约舒阿·本吉奥、亚伦·库维尔——麻省理工学院出版社,2016 年。

有可能防守梅西吗?数据视角。

原文:https://towardsdatascience.com/is-it-possible-to-stop-messi-a-data-perspective-cf4e2d900181?source=collection_archive---------30-----------------------

或者我是如何分析 2009/10 赛季巴塞罗那德比的。

照片由来自 Pexels迈克拍摄

最*几年,足球过程(球探、管理训练负荷、赛前/赛后分析等。)正在缓慢但肯定地朝着更有数据依据的决策方向发展。对于一个热爱足球的数据分析师/科学家来说,越来越多的数据集可以免费访问,这为足球数据探索带来了机遇。作为一名足球迷,当 Statsbomb 在 2019 年发布完整的梅西数据传记数据集时,我非常兴奋。随着最*新冠肺炎疫情实施的隔离,我有了一些空闲时间,我决定好好利用。这是我在梅西兔子洞深处的故事。

所有相关代码、交互式可视化等等,都可以在我的 github 项目中找到。

TL;梅西是个天才,你无法阻止他。还是可以?

1.再一次:莱昂内尔·梅西

1.1 数字爱情

有人可能想知道为什么还要写一篇关于梅西的文章。嗯,首先是因为他的整个西甲职业生涯都可以在一个单独的数据集中免费获得。直到今天,这是唯一一个完整的关于单个球员的数据集(考虑到球员已经到了职业生涯的末期)。

第二,因为我确信我们并不了解梅西的一切。已经有很多关于他的报道:得分技巧、组织核心、与 c 罗的广泛比较等等。也许你已经读到过梅西是不可能的,或者他走得比大多数球员跑得都好

但是据我所知,防御方面还没有被广泛地探索。当我埋头于数据传记时,我开始想是否有可能阻止梅西?而如果有,如何只用数据来描述?

由于足球比赛中的事件数据倾向于比赛的进攻方,因为防守有更多的“无球”事件,所以分析起来更加困难。跟踪数据要容易得多(假设数据足够准确),因为我们随时都知道球员的位置,但这并不意味着在事件数据中什么也找不到。防守行动、压力事件,加上预期目标、 PPDAVAEP 等先进指标,足以让它在“阻止梅西”的任务中有所作为。

1.2 更强、更好、更快、更强

如何阻止梅西?

这个百万美元的问题让每一个面对他的教练都紧张得要命。他是(有史以来)最伟大的球员之一,自 2004 年以来,他在巴塞罗那俱乐部撕开了防线。

看看他的赢/*/输分布就知道了:

梅西总体获胜统计(2004/05–2018/19)。452 场比赛 339 胜 39 负。

从 2004 年第一年到 2018/19 赛季结束,梅西出场 452 场,共 419 粒进球,158 次助攻

梅西进球再分配(2004/05–2018/19)。

如果我们只考虑开放式比赛目标:

  • 336 个目标共 253.6 xG ( 预期目标)。
  • 对于 xG 小于 0.05 的射门,22 个进球总共 14.5 xG。

只是为了好玩,这是他的(公开比赛)目标,具有最小 xG 值(所有数据集的):0.024。奇怪的是,这看起来不像是梅西打进的最难的进球,但他的射门距离相当远,而且在他面前有很多对手。

具有最小 xG 值的目标。希洪竞技—巴塞罗那足球俱乐部(2015/16 赛季)的开场进球

光是这些数据就显示了梅西作为一名得分手有多伟大,而这只是他所能做到的一小部分。如果你想了解更多关于梅西的(高级)数据,尤其是他的运球技术,你可以看看 Statsbomb 的文章:

你也可以在这个笔记本里找到我自己处理的数据(参见相关的数字文件夹)。

所以,总而言之,显而易见的是:很难防守梅西这样的球员。

2.毕竟是人类

无论梅西有多伟大,有时他也会有糟糕的比赛。例如,从 2004 年到 2019 年,他有一些比赛没有进球或助攻。这并不意味着这是一场糟糕的比赛,但至少梅西不是决定性的。

为了说明这一点,我们可以看看梅西没有进球或助攻的比赛的百分比。

梅西赛季“糟糕比赛”的百分比(注意,2004/05 赛季的样本量很小)

如你所见,梅西不增加他的统计线并不常见。这并不总是坏事,但对梅西的成绩有影响:

梅西得分或助攻的效果(2004/05–2018/19)。

确实不全是梅西的问题,这个图缺少了一些脉络(对手的实力,当天队友的素质,比赛的赌注等等。),但仍然是胜率的巨大下降。

如果我们考虑 xG,当然也有很大的不同,如下图所示。没有进球或助攻的比赛表现出了更慢的 xG 输出,*均为 0.33,而他进球或助攻时为 0.89。这意味着他得分机会更少,但主要是(*均而言)他得分的位置更差。嗯,有时候他只是运气不好,就像那场比赛,他输出 1.35 倍,没有得分。

梅西 xG 分配取决于他得分或助攻一个进球。

这表明,有时候,降低梅西的影响力是可能的。

为了分析如何防守梅西,我选择专注于一场比赛:这更容易可视化,并为未来在更大范围内的分析提供了一些思路。

我是怎么选择这样一个游戏的?我决定关注 2009/10 赛季的:

  • 对于梅西(众多赛季之一)来说,这是一个伟大的赛季:西甲 35 场比赛 34 粒进球 10 次助攻
  • 这是佩普·瓜迪奥拉在巴塞罗那俱乐部的最佳西甲赛季:99 分,当时是拉利加的纪录(现在被皇家马德里 2011/2012 赛季和巴塞罗那 2012/2013 赛季的 100 分击败)。

由此出发,我选择整个赛季梅西 xG 输出最小的比赛。输入:

埃尔德比加泰罗尼亚语

这也是瓜迪奥拉和 T2、波切蒂诺和 T3 之间的对决,这让事情变得更加有趣。

3.面对面

3.1 时间的碎片

在讨论梅西在这场比赛中是如何被阻止的之前,先了解一下背景。这场比赛是一场德比,因此根本不是一场友谊赛。它结束了(剧透警报!*局:0 - 0。

但这不是一个无聊的游戏,尽管:

  • 巴萨只有 4 次射门,总 xG 0.11。
  • 巴塞罗那西班牙人有 10 次射门(0.61 xG)。
  • 梅西输出 0.03 xG 助攻,相比 2009/10 赛季*均 0.23
  • 他没有得到达尼·阿尔维斯的帮助,阿尔维斯在 58 分钟后得到一张红牌。

我当时没有看这个游戏(现在也没有),但是我确信毛里西奥·波切蒂诺有一个计划。下面的数据分析将试图揭开他的计划。

3.2 做对

关于这场比赛,我们首先要问的是:有没有一个反梅西的计划

如果我们看看梅西的热图和西班牙人的防守图,我们可以看到西班牙人确实在他们的左翼防守更多(特别是他们在那里压得更多),那里是梅西喜欢的地方,也是丹尼尔·阿尔维斯花费大部分时间的地方。

看起来梅西是被故意针对的。

第二,梅西能够做到他*时做的事情吗?我指的是疯狂的运球,超出世界范围的投篮和不可能的传球。好吧,看看他的通行地图,我们可以看到,这不是照常营业:

梅西传球图,西班牙人-巴塞罗那足球俱乐部(2009/10 赛季)。

正如我们在上图中看到的:

  • 几乎所有成功的传球都离球门很远。
  • 没有多少垂直通过。
  • 最终第三遍几乎总是不完整。
  • 西班牙人在传球上没有太大的压力。也许他们想阻止传球者,而不是梅西本人。

巴塞罗那的通行证(在达尼阿尔维斯红牌之前)证实了这一点。我们可以看到前面三个(梅西、佩德罗、马克斯韦尔(?))被牵扯进去了。

达尼阿尔维斯红牌前巴萨传球网。图灵感来自追踪的好友。

相比之下,西班牙人的传球网络显示他们试图从两侧进攻,避开布斯克茨/亚亚·图雷/哈维三角,并且有一些传球选择到凡尔登

西班牙人传球网先于达尼阿尔维斯红牌。图灵感来自追踪的好友。

为了更进一步,需要一些高级度量。我选择求助于通过估计概率来评估行为(VAEP) 。我不会详细说明 VAEP 是什么,因为这超出了本文的范围,但你可以在这里找到的原始论文

简而言之,这是一种给足球中的每个动作分配一个概率值的方式,而不仅仅是射门和进球。例如,成功通关的 VAEP 值为+0.3,而失败的通关的 VAEP 值为-0.19。

VAEP 是分析球员在比赛中贡献的一个很好的工具(除了其他工具,参见美国足球分析文章对这些工具的比较),因为它考虑了所有的行为,甚至是防守行为。KU Leuven 团队甚至发布了他们的足球运动员动作描述语言(SPADL) 的替代版本,称为原子 SPADL 。这种选择有两个主要优点:

  • 它为镜头分配更好的(更接*真实)值。
  • 它导致更稳定的动作值。

最后但同样重要的是,整个项目可以在 github 上公开访问。S 操作包有一个带 SPADL 的主分支,以及一个用于 atomic-SPADL 的原子分支。

在用 atomic SPADL 拟合一个模型后,我们可以通过 VAEP 的镜头探索梅西数据集。例如,这是梅西每个赛季的*均 VAEP(每 90 分)。

原子 VAEP 模型。

如果我们特别关注 2009/10 赛季,我们可以看到梅西的 VAEP 价值观的分布以及德比的所在地。这证实了对拉普尔加来说这不是“那些夜晚中的一个”。

VAEP 不仅仅属于梅西。以下是所有德比球员的名单,按照 VAEP 值(每 90 分)排名:

西班牙人队的 VAEP 价值(2009/10 赛季)。梅西尽管表现“糟糕”,但仍排名第六。佩德罗和马克斯韦尔没有做太多,阿尔维斯也一样。

考虑到最高的 VAEP 价值来自维克托·巴尔德斯,我们可以有把握地说,西班牙人不仅防守做得很好,他们也有一些很好的进攻阶段。

根据这一分析,我们有一些西班牙人成功阻止梅西的关键因素:

  • 锁定左翼,以尽量减少梅西/D .阿尔维斯的连接,特别是:在那里施加更多的压力。
  • 减少梅西在最后三分之一的传球选择。
  • 从侧翼进攻避开巴萨的中场,迫使他们防守:“进攻是最好的防守形式”。

4.超出

梅西的分析是更好地理解足球防守的第一步。

它表明,有了‘基本’的统计数据和更先进的工具(VAEP ),就有可能获得防御性的洞察力。从这里可以做很多事情:

  • 多分析一些梅西 xG 输出少的比赛,才能找到大体趋势。
  • 分别使用进攻防守 VAEP 值来评估(例如)特定球队或球员的防守输出。
  • 从 VAEP 价值观的角度分析梅西最差的 10 场比赛。
  • 评估该数据集中的其他明星玩家是如何被阻止的。

即使只是为了好玩,这种分析在现实生活中也是有用的。

感谢阅读。

笔记

1-防守地图显示了与 2009/10 赛季所有球队面对巴塞罗那的*均水*相比,在这场比赛中一支球队的防守行动多了多少。

双路网络参数:

  • 位置:通过原点,
  • 大小:通过次数,
  • 颜色:通过次数。

为了探索 VAEP,你可以试试作者的互动工具

参加虚拟技术会议值得吗?

原文:https://towardsdatascience.com/is-it-worth-it-to-attend-a-virtual-tech-conference-5868727b6e13?source=collection_archive---------37-----------------------

一份利弊清单,帮助你决定它是否适合你。

安德烈·斯特拉图在 Unsplash 上拍摄的照片

新冠肺炎将我们带入了虚拟会议的时代。无论是大型会议还是小型会议,都不得不彻底改革从设施到技术的体验。海报板会议上长长的咖啡和小吃桌、尴尬的午餐和免费啤酒都不见了。

不幸的是,一些非常棒的技术会议,如 O'Reilly 的 Strata Data 和 AI 2020Gartner 数据和分析峰会被取消。

其他会议已经虚拟化,包括 2020 年东 ODSC NeurIPS 和 2020 年格蕾丝·赫柏庆典 AWS Re:Invent 全力以赴,让活动免费!

今年我参加了几次虚拟会议。我非常怀疑进去。参加科技会议最有价值的部分之一是结识其他公司的人,了解他们在做什么项目,以及他们面临的障碍。即使我是一个内向的人,我也会强迫自己参加午餐聚会和快乐时光。尽管有这种担心,我还是发现这些虚拟会议的某些方面让我很享受。我列出了一些我经历过或注意到的利弊。

许多专业人士

加入和退出会议——这无疑是我最喜欢的虚拟会议功能。如果你参加的讲座和你想象的不一样,那就去参加另一个讲座。就这么简单。当这种情况亲自发生时,你更倾向于留下来浏览你的手机,而不是试图在另一个礼堂找到另一个座位。

没有 FOMO——因为每个环节都是在线的,都有录音。我参加的会议在会后提供了所有的会议记录。

没有旅行预算——这是一个很好的功能,可以帮助你从老板那里获得参加活动的许可。公司的成本是入场费。不需要支付机票、酒店、出租车或食物费用。

没有错过家庭义务——对于关心他人、照顾孩子或父母的人来说,离开家几天是很困难的。安排照看孩子已经够难的了,但有时你会因为不在家而产生负罪感。好吧,不是对所有人,而是对我们中的一些人。

一些价格降低了——见我之前关于 Re:Invent = Free 的笔记。

极好的座位——没有人挤在你旁边。你面前的人并不是拿着*板电脑给每张幻灯片拍照。没有人在你身后喋喋不休。没有必要转身告诉你后面的人,你大老远飞来不是为了听他们在演讲时说话。

一些缺点

无法联网——会议的一个重要组成部分就是联网。休闲社交是无法在网上重现的。

更多的干扰——当你身在会场时,更容易让这种体验包围你。当你坐在餐桌旁时,你更有可能停下来换衣服或者出去接孩子。如果你在家容易分心,这可能是一个问题。

无法会见演讲者——有些人非常喜欢在会议结束后会见演讲者。我相信那些人很怀念这种互动。

没有社交活动——从 meetup 咖啡会议到受邀才能参加的聚会,科技会议上通常不缺少社交活动。这种节日气氛是无法虚拟重现的。

没有供应商演示——对于寻找产品供应商的从业者来说,会议展览大厅可能是一周内打击几个竞争对手的绝佳场所。你也可以感受一下公司文化。我曾经从一个活跃的供应商搜索中排除了一家公司,因为我在一次会议上观察了首席执行官。他说话时没有倾听,他的员工似乎公开鄙视他。直到今天,当有人提到这家公司时,我仍然会有那种负面的感觉。当我参观虚拟展馆时。咩。我没有从中得到任何东西。

没有海报板会议——这是学生和行业人士与更广泛的社区分享他们的研究的一个错过的机会。作为一名从业者,我喜欢了解热门话题。我特别喜欢一个理论在现实世界中的应用。我认为这可以在某种程度上虚拟重现,尽管我还没有遇到过。

没有赃物——是的,我们不能忘记没有赃物。t 恤衫和标有商标的袜子通常会在我来的时候装满我的行李箱,但今年不会。连笔都没有。我的孩子们怀念能够通过挖赃物袋来争夺战利品的日子。令人惊讶的是,我收到的网飞研究针织帽和随机分发的辣酱的请求最多。我希望被雇佣来吸引参与者的杂耍者和魔术师有一个备用计划。

不能和你的同事一起旅行和闲逛——这取决于你的同事,不是吗?两种情况都有可能。

至少尝试一次

总的来说,我建议你至少尝试一次虚拟会议来感受一下。当限制解除时,你可能会发现自己要么参加实体会议要么参加虚拟会议,这取决于你的空闲时间和预算。

Julia 的位置与 Python 共存吗?

原文:https://towardsdatascience.com/is-julias-place-co-existence-with-python-eff2cb834f41?source=collection_archive---------23-----------------------

Julia 是未来的 ML 语言,还是 Python 不太为人所知的伙伴?

(Julia logo src =http://julia-lang.org,python logo src =http://python.org/,背景由我的好朋友 Jay Smith 提供)

J ulia 和 Python 都是我非常喜爱的编程语言。在 Python 上使用 Julia 有很多好处,比如编写时间更少,编译速度更快。然而,到目前为止,Julia 未能在 Python 无所不包的流行中将其根除。与 Python 不同,Julia 缺乏成为行业标准工具所需的关键机器学习和脚本基础设施,尤其是对于机器学习而言。

Julia 的包通常是复杂的、过度调整的、文档记录不良的,这与 Python 中可用的包形成了鲜明的对比,Python 中可用的包通常是由较大的实体开发的,而不是由在家开发该语言的开发者开发的。Scikit-Learn 是 Python 中最受欢迎的机器学习库之一,它源于“谷歌代码之夏”竞赛,而 Tensorflow 是由谷歌自己开发的。

朱莉娅不受欢迎,虽然在我看来很不幸,但这确实提出了一个非常有趣的问题:

朱莉娅住在哪里?

Julia 只是 Python 的助手,没有任何自己的代码库,还是 Julia 可能是 Python 的犯罪伙伴,更像 Scala 一样被用来管理工人和部署企业级机器学习算法?Scala 是一种大多数科学家害怕使用的语言,尽管它有着悠久的历史和庞大的软件包库。这是因为 Scala 是一种很难完成复杂操作的语言,通常要花很长时间才能完成用 Python 四分之一时间就能完成的事情。

(http://scala-lang.org/)

尽管有这些缺点,但在当今,Scala 对于许多数据科学家来说是一门必不可少的语言。火上浇油的是,Scala 源自 Java,并带来了所有浮点计算和操作错误。Julia 没有这些问题,与 Scala 相比,它很容易编写,可以快速启动并运行,同时保持处理大数据的语言所需的速度。

我认为这将是这种语言的一个伟大方向,因为我认为 Python 不太可能很快失宠。就目前而言,考虑到 Julia 拥有的包,我可以假设这可能不是语言的发展方向。Julia 的很多包都被 PyCalls 弄残了,这让 Julia 因为对 Python 的解读慢得不可思议。

这是一个可怕的短板,错过了机会,因为虽然 Python 肯定比 Julia 慢,但它在机器学习中的地位比 Scala 牢固得多。也就是说:我知道更多的工程师使用 Python 而不是 Scala。

所以在 Julia 的模块中,很容易假设 Julia 的目标不是取代 Scala,而是取代 Python——因此有这样一句格言:

"像 Python 一样走路,像 C 一样奔跑"

(我不确定他们是否还在使用那句古老的格言)

我觉得朱莉娅应该用来做什么?

(茱莉亚标志由 http://julia-lang.org/提供)

正如我之前概述的,Julia 肯定可以填补 Python 和 Scala 之间的一个相当大的空白。首先通过使用 PyCall.jl 导入 Python 模块,其次通过类似于 Scala 的方式处理大数据。这并不是说 Julia 作为机器学习和统计的首选语言是不可行的,但就取代 Python 而言,这可能是不太可能的。Python 是一门伟大的语言,已经成为世界上最流行的编程语言。

它比 Python 更难

对 Julia 的一个普遍误解部分来自于这句格言,即 Julia 和 Python 本质上是同一种语言,但这与事实相去甚远。我认为重要的是要记住,不了解 R、Lisp、Nimrod 或类似语言的人可能会在坚持和理解函数范式方面遇到一些困难——尤其是来自 Python 的函数范式。

虽然 Julia 的语法肯定经常与 Python 的语法相似,但只看构造函数肯定会揭示出它们的区别:

# Julia
mutable struct my_type
    data
endclass my_type:
    data

虽然乍看之下这些确实很相似,但重要的是要记住结构和类是完全不同的数据类型。结构和类之间的第一个巨大区别是函数如何应用于类型。对于结构,您需要通过方法传递数据,以便使用具有分派或参数多态性的函数,但对于类函数,可以将其指定为该类型的子级。这是一个非常显著的结构差异,对于已经使用 Python 一段时间的人来说,这种不和谐是可以理解的。

Julia 也比 Python 更难理解,有很多语法对于典型的 Python 程序员来说没有任何意义。

因此,我们有了一种比 Python 稍微难一点的语言,但速度明显更快。我认为像这样的语言可能面临的最大问题是没有明确的方向——这正是 Julia 在更广泛的范围内所遭受的。Julia 有专注于优化的包,以及用于 SDL2 和 GTK3+的端口,但同时没有编译的可执行文件,这使得这些包除了为了好玩而编码之外基本上没有任何用处。朱莉娅也有几十个机器学习包,但他们经常使用 PyCall.jl,所以我问:

为什么不用 Python 呢?

仅仅为了使用语言的虚荣心而用不同语言的同一个包的较慢版本对我来说没有太大意义。

我认识的人

在我认识的数百名其他数据科学家中,有两个一直在使用 Julia。我问他们对朱莉娅现状的看法,以及这种语言的发展方向,他们的回答是一致的:

“我希望看到更少的 PyCall,更多的机器学习包,以及更明确的语言方向。”

这些肯定是围绕 Julia 的主要问题,因为我最*了解到,他们都 PyCall Pandas.py,而不是使用 Julia 的 data frames . JL——这说明需要更好的模块来完成大多数补救任务。

后端

到目前为止,我认为 Julia 最大的用处是在后端脚本中,对于我每天都在编写的如此神奇的语言来说,这是一个不幸的结局。Julia 肯定可以用于请求和端点,以移动大量数据供 Python 使用。然而,这个名称的问题是,Julia 的 HTTP.jl 包并不像完成这项工作所需要的那样好。最重要的是,Genie.jl 可能有很多问题,在大多数情况下,您可以更容易地在 Python 中做完全相同的事情。当面临暂停的时候,我绝对认为朱莉娅能帮你摆脱困境

"大号 get 请求泡菜。"

结论

虽然我非常喜欢 Julia 语言,但是为了让这种语言取得比现在更大的进步,它今天确实面临着一些需要解决的问题。首先,我希望看到更好的语言包,不要像现在这样复杂和混乱。我已经为此工作了一段时间,如果你想看看我的一些包,你可以去我的 Github:

[## emmettgb -概述

在 GitHub 上注册你自己的个人资料,这是托管代码、管理项目和构建软件的最佳地方…

github.com](https://github.com/emmettgb)

我认为 Julia 可以做一些非常有趣的事情,并彻底改变我们进行机器学习的方式,但为了让这种方法奏效,我认为需要在语言内部可用的方向、基础和模块方面做出一些改变。我认为使 Julia 成为更可行的语言的一些基本因素包括:

  • 已编译的可执行文件!!!求你了。
  • 替换 SkLearn 的一致包,纯 Julia 写的。
  • 统计和可视化绘图合并成一个模块,用纯 Julia 编写。(没有 PyCall like Plots.jl)
  • 处理和移动各种格式数据的更好资源。
  • 更好地支持 Javascript。
  • 我希望看到请求和 API 两方面的改进,尽管我确实喜欢 Essenciary 的 Genie.jl

总的来说,如果没有这些基本的改进和改变,我认为 Julia 将永远是一种远不如 Python 有用的语言。Julia 的目标不应该是重新发明轮子,因为缺少模块而失去他们在低端构建的所有伟大的东西。我们只能希望,随着时间的推移,语言和库只会变得更好,我希望不用 Python 在 Julia 中工作很快会可行。

现场 Kubernetes 是否可行?

原文:https://towardsdatascience.com/is-kubernetes-on-premise-viable-8b488368af56?source=collection_archive---------12-----------------------

云是最好的解决方案,但是如果不可用呢?

公共云提供商并不总是一个选择。作为云爱好者,我更喜欢在任何可能的时候使用云,但是有些情况下我们根本不能使用云。这可能是由于数据保护要求、成本优化,或者只是我们的老板害怕变化。我们可能希望事情不是这样,但我很遗憾地说,我们不能总是改变世界。那么,在这种情况下该怎么办呢?拒绝 Kubernetes 的优势或避免容器而支持虚拟机的解决方案根本不是一个选项。很容易理解,对我们 k8s 上瘾的人来说,唯一的选择就是在内部部署它。在这篇文章中,我将解释什么是关键点,以及在开始这个旅程之前你必须考虑到什么。

帕什米努·曼苏哈尼达皮克斯拜

为什么我应该在内部使用 Kubernetes?

诚实的答案是你不应该。由于云价格和质量使用,基于云的解决方案是降低成本、保持高质量标准和缩短新安装上市时间的更好解决方案。问题是,即使 Kubernetes on cloud 是最好的选择,它也不总是适用的。

许多组织根本无法使用云。这可能是由于可疑的安全政策、法规或数据政策,或者他们所在国家的某些云服务不可用。也可能是首席信息官购买了一个新的数据中心,并希望在整个公司范围内使用这一投资。

原因不重要。问题是,简单地说,在某些情况下,Kubernetes 必须保留在本地。我认为回到 VMs 时代不是一种选择。

在内部使用 Kubernetes 有什么关系

Kubernetes 是一种工具。是的,一个大的,复杂的,强大的工具。但永远是个工具。运行工具的基础是:

  1. 知道如何使用它
  2. 具备所有工具要求

如果你需要往木头里敲一颗钉子,你需要一把锤子(工具),一个知道该做什么的人(你),和一颗钉子(工具要求)。Kubernetes(工具)也差不多。你将需要一个人或一个团队知道如何处理他(设置、维护、安全)和一个运行它的基础设施(工具需求)。

我希望我没有伤害任何在锤子和 Kubernetes 之间做比较的人😃我的意图不是贬低 Kubernetes 的价值,而是介绍我们必须关注的一系列关键事项:人员和基础设施。让我们进入下一章进行深入探讨。

基础设施要求

理论上,你可以在你的笔记本电脑上运行 Kube,但是不难理解,为了扩展,你需要更多的东西。在混合场景中,当您已经拥有用于部署虚拟机的虚拟机管理程序时,使用它们来托管 k8s 服务器是更简单的方法。很明显,所使用的硬件很重要,您将会明白如何设置基础设施也很重要。配置不好的好硬件可能会带来不好的性能。

裁员

如果你想有一个可靠的解决方案,最好使用三个。使用多个节点,您可以*衡工作负载和内部服务,如 kube-apiserver、etcd、kube-scheduler 和 kube-controller-manager 等等。

将主容器与容器分开

主组件可以在容器的同一台机器上运行,但是最好将它们隔离开来,以避免资源冲突。

最低要求

Kubernetes 被设计为可以从故障中恢复,而不会丢失任何数据。这一特性取决于硬件资源的可用性。最佳实践将这一最少的资源集确定为三个节点,2GB RAM 和 8GB SSD。可以想象,硬件性能会影响 Kubernetes 的性能。建议使用固态硬盘或同等性能的硬盘。当然,在生产环境中,添加比最小资源更多的资源是一个好主意,也要考虑容器需求。

找到合适的支持。

您可以从头开始安装 Kubernetes,或者直接在您喜欢的虚拟机上使用 Ansible playbook 。无论如何,查看 K8S 官方文档,我们会发现这两个很好的替代方案:

  • CloudStack ,它基于硬件虚拟化原则,像传统的 IaaS 一样,它也可用于本地解决方案,并支持 Vagrant
  • CoreOS 是部署 Kubernetes 集群的一个很好的选择。您可以使用本教程或使用 CloudStack 集成来手动完成。

团队

Kubernetes 不是游戏。它很容易安装(只需注意它是 docker 附带的)并用于部署应用程序。稍微复杂一点的部分是管理。我的意思不是仅仅看一下资源是否足够,以及万一增加一个新的节点。我说的是确保卷的备份,分发服务以*衡节点上的负载,或者简单地解决问题。

Kubernetes 是一个完美的工具,因为在大多数情况下,你只需要安装一个,然后单独工作。同时,在云解决方案中,体系结构的一部分是托管的,内部完全由您决定。这就是为什么我建议每家采用 it 的公司都要有一名训练有素的专家。CNCF 的考试是一个很好的起点。你可以在 Udemy 或者类似的*台上买到很多便宜的备考课程。

别忘了 DevOps

Kubernetes 的领养不仅仅是 Kubernetes 的事。你需要他背后的所有架构。Kubernetes 的标准开发流程需要 IT 思维模式的重大改变。这也翻译成你必须提供给开发者的工具(是的,其他工具…)。首先,你将需要一个 CR (container repository)来存储所有的容器图像,这些图像将由一个 DevOps 进程产生,由一个工具实现。如果您的公司出于安全原因不允许使用云,您将需要在本地部署这样的工具。在实践中,Kubernetes 带来了一个结构良好的流程。如果你还没有,你将被迫把它带回家。

带什么回家

云是 Kubernetes 的第一选择,除非你处于一种特殊的情况,在这种情况下,你有特定的好处,如成本优化,硬性要求,如安全性,或者一些特殊的条件,需要对所有栈进行完全控制。如果你在这些情况下,你将需要提供一个可靠的基础设施,基于坚实的硬件和良好的安装。尽管如此,你还需要在产品方面受过训练的人,并准备好管理 Kubernetes 的复杂性。

好消息是,如果内部空间过于狭小,无法满足您的需求,您将来可以(相当)轻松地移动。

关于 CoreOS 的一个说明

5 月 26 日即将到来,Kubernetes 官方文档指向 Cloudstack 和 CoreOS(最后一次更新是在 2019 年 6 月😒),但该发行版将于 5 月 26 日到期。Red Hats 设计的继任者是 Fedora CoreOS,这对于开始一个新项目来说是没问题的,但在移植的情况下需要一些工作。在这种情况下,可以选择使用 Flatcar 容器 Linux 发行版,这是一个更兼容的解决方案。另一个机会是迁移到云,如果已经在计划中的话。生命的终结可能是正确的提示。

参考资料:

  • DZone——Kubernetes 以为什么和怎样为前提
  • Kubernetes—本地虚拟机

学习新的编程语言很难吗?

原文:https://towardsdatascience.com/is-learning-new-programming-languages-tough-a0412b81293c?source=collection_archive---------70-----------------------

一个高级数据科学家 需要 多种编程语言

照片由我可爱的 so 拍摄:)

如果你想成为一名高级数据科学家,你需要熟悉不同的编程语言,因为:

  1. 评估和寻找最适合项目结构的
  2. 得到一个高度精确的模型
  3. 使用可信模型
  4. 商业伙伴对一种特定语言的熟悉程度

当你想学习一门新的编程语言时,不管你是新手还是专家,我们人类害怕变化,主要是因为我们认为这很难。你要投入时间去寻找好的资源,学习新的评论结构,让大脑为你想学的新语言做好准备。中国有句谚语说:

学习是一笔财富,它会跟随它的主人到任何地方。

对我们数据科学家来说,一种财富是有目的地学习一种新的编程语言。我们如何将恐惧转化为财富?让我告诉你怎么做。

从数据科学家做起

活动发起人Unsplash 上的照片

许多软件工程师在他们的学士或硕士课程期间,根据他们的兴趣或课程以及大学教授的兴趣,必须学习不同的编程语言,即 C#、C++、Python、R、Matlab 等。但是对于一些想以数据科学家开始职业生涯的人来说,编程是新的。和你们许多人一样,在完成博士学位后,我决定进入工业界。当我看到需要资质的工作申请时,我很惊讶:

在我的硕士和博士学位期间,我像任何研究人员一样使用 Matlab 做数据科学项目,我只知道一种我在日常工作中使用的编程语言。但是,数据科学家项目的许多组织和职位更喜欢使用 Python 或 R,因为它们是开源的,公司不必为许可证付费。于是,我开始学习 r。

从 Matlab 切换到 R:

像其他人一样,我认为改变是困难的,我们也知道学习一个新的话题是多么有趣。我试图找出如何学习一门新的编程语言,我认识到 4 个步骤将帮助我:

  1. 寻找最佳环境(我安装了 RStudio 用于使用 R)
  2. 有了一本好书,不要把它全部扔掉,而是把它作为主要资源
  3. 在线课程开始学习(当我还是学生时,我更喜欢免费课程)
  4. 有目的或有应用地学习,做一个你喜欢的项目

是的,如果你想把它学得很好,你必须开始用这种新语言创建一个应用程序,正如蒂姆·桑德斯所说:

没有应用的教育只是娱乐

如果我想找份工作,我必须把它学得很好,所以,我开始把一个项目从 Matlab 转换成 r。我意识到:

当你有一个集中的学习流程时,你就不应该害怕学习新的编程语言

我创建了工作流程,我将恐惧转化为财富,我学到了很多,做了第一个项目,很开心,我得到了我想要的工作。我是一名高级数据科学家,知道两个分析程序。

照片由本·怀特Unsplash 上拍摄

在与 R 合作两年并做了不同的分析项目后,我发现:

  1. 简单易学
  2. 一个强大的研究人员社区,支持和信任软件包
  3. 非常适合数据科学项目
  4. 非常适合数据可视化(ggplot、Plotly、D3 等)
  5. 轻松创建分析仪表板(Shinny)
  6. 易于嵌入另一个环境,即 C#或 VB
  7. 还有…

下面是 Matlab 和 R 的对比:

[## MATLAB 与 R |了解 7 大重要差异

MATLAB 的名字代表矩阵实验室。Matlab 是一个多范例的数值计算环境和…

www.educba.com](https://www.educba.com/matlab-vs-r/)

但两年后,我决定在一家以 Python 为常用数据科学工具的公司接受新的挑战。

从 R 转换到 Python

当我面试新职位时,我告诉面试官,我认为学习 Python 没有任何挑战,因为我使用了适合我的工作流程。我知道:

当你已经学会了其中的一些语言时,学习一门新的编程语言并不困难。

我再次应用相同的工作流程,找到最佳环境一本好书,一门在线课程,有目的或有应用地学习。是的,它又起作用了,我上任的第一天,在学习期间,我用 Python 写了我的项目,用的是 AnacondaPycharm 。如果你是一名数据科学家,并且使用 python,你知道,它拥有你做一个伟大项目所需要的所有东西,以及 Python 编程是多么令人愉快。

我从这些改变中得到的主要好处是当我接手一个用 R 编写的旧项目时,我能够为这个项目做出贡献。现在,我正在做一个项目,其中的数据收集部分是在 Matlab 中完成的,我的客户正在 Matlab 中进行仿真,我对他们的源代码没有任何问题,我正在领导数据科学部分。此外,当我在 Python 包中看到限制时,我有时会将 Python 和 R 混合起来做一个好项目。R 和 Python 的这种混合情况有助于我创建高度精确和值得信赖的数据科学产品。

在这里,您可以找到 R 和 Python 之间的比较:

[## 数据科学领域的 R vs Python 哪个更好...?-数据文件夹

r 和 Python 是面向数据科学的编程语言的最新水*。学习两者…

数据-天赋.培训](https://data-flair.training/blogs/r-vs-python-for-data-science/)

结论

作为一名数据科学家,有必要了解不同的数据科学编程语言,因为学习新的编程语言意味着:

  1. 更灵活接受不同的项目
  2. 获得不同工具的广阔视野
  3. 有更多的自由来选择开发项目的最佳方案
  4. 对项目成功的最大贡献
  5. 与开发者一起创建新的网络
  6. 与熟悉某种语言的客户建立信任

如何做,如果你想理解一门新的编程语言:

  1. 寻找最佳环境
  2. 有一本好书
  3. 通过在线课程开始学习
  4. 学有所用

最后:

"如果没有变化,我们就不会有进步,无论是篮球还是其他运动."–约翰·伍登

非常感谢您的时间和阅读我的文章,我的名字是 Abduljabbar Asadi 博士,我是一名高级人工智能和数据科学主管和兼职自由职业者。我的目标是与您分享我在为大公司开发国际数据科学项目的多年经验中获得的知识。如果你想保持联系,请在 MediumLinkedin 上关注我:)

像这样?请随意分享,这样其他人就可以找到它!

机器学习正在接管金融生态系统吗?

原文:https://towardsdatascience.com/is-machine-learning-taking-over-the-financial-ecosystem-b9e841b07c9d?source=collection_archive---------72-----------------------

机器学习在金融领域的现实应用

卢克·切瑟在 Unsplash 上的照片

从最初的商品交易到处理加密货币,金融已经走过了漫长的道路。与任何其他领域一样,技术已经成为金融生态系统不可或缺的一部分。从提取现金的自动柜员机(ATM)到算法交易,围绕金融的技术已经发生了变化,并且还在快速发展。在这篇文章中,我将谈论接管金融的最具影响力的技术分支之一,机器学习。

什么是机器学习,为什么它很重要?

机器学习是人工智能的一种应用,它为计算机提供了从经验中学习的能力,而无需显式编程。

随着技术的进步,数据生成的速度飞速增长。给一个数字,2.5 万亿分之一(也就是 18 个零!)每天都会产生字节的数据。“大数据”是对这种海量数据的称呼,其中很大一部分是金融数据。即使使用我们已经拥有的传统软件工具,也不可能从大数据中分析和获得洞察力,因为所有这些工具都是基于规则的,这意味着它们必须明确地编程来做什么。这就是机器学习发挥作用的地方。正如定义中提到的,机器学习从经验(在这种情况下是大数据)中学习,而不是显式编程。因此,机器学习是一种可以有效利用大量数据的技术,这些数据是在您阅读本文时产生的。这就是为什么机器学习脱颖而出,而且很重要。

现在,让我通过机器学习在金融领域的一些应用来阐明一些实际问题。

1。算法交易

算法交易是指一台支持机器学习的计算机(或系统)在股票市场、外汇市场等进行交易。代表一个人类。这将带来竞争优势,因为机器学习算法可以同时分析数千个数据源,每天执行数十万笔交易,这超过了人类的能力。这被称为高频交易(HFT)。此外,参与交易的人有时可能是多愁善感的,因此不是百分之百客观的,这在算法交易中不是这样。总部位于香港的艾迪雅公司经营着一只对冲基金,利用机器学习做出所有股票交易决策。

2。投资组合管理

投资组合管理基本上是个人或组织的财富和投资管理。为了做到这一点,有一个机器学习解决方案,Robo-Advisor。这个名字很容易让人误解,因为没有机器人参与其中。robo-advisor 所做的是就投资组合向客户提供建议,以优化他/她的财富。让我用一个例子来简化一下。假设有一个年轻人想在 60 岁退休,并有 20 万美元的储蓄。当客户输入其当前财务状况及其他相关详情时,robo-advisor 将根据客户的风险偏好为客户提供一系列投资机会和金融工具,以实现其退休时拥有 20 万美元的目标。

3 .欺诈检测

虽然传统的欺诈检测系统严重依赖于一组强大的规则,但基于机器学习的欺诈检测系统甚至可以学习如何应对新的潜在安全威胁。机器学习算法将新交易(或任何其他金融活动)与账户历史进行比较,并评估所述交易具有欺诈性的可能性。如果这种可能性超过某个百分比,该特定交易将被标记甚至自动拒绝。与人工操作员相比,其优势在于基于机器学习的系统可以在先前交易的数千个数据点上快速权衡交易细节。此外,与不使用机器学习的传统软件工具不同,机器学习的软件工具会根据帐户所有者不断变化的习惯进行自我调整。此外,目前正在研究如何使用自然语言处理(NLP)来检测欺诈性金融文件,如果成功,这将是革命性的。

4 .资信评估/保险核保

评估客户的信用价值是一项耗时耗钱的工作,但对于任何金融服务提供组织来说,这都是一项至关重要的任务。组织中有独立的部门来完成这项工作。你猜怎么着?机器学习已经准备好了!数据科学家根据成千上万以前的客户资料训练模型,算法从中识别潜在趋势。使用一个训练有素的模型,银行或任何其他金融机构都可以预测某个客户是否会偿还贷款,通过这个模型可以减少不良贷款的数量。从保险公司的角度来看,他们可以根据投保人的性别、年龄和一系列其他因素来评估其必须接受健康治疗或遭遇交通事故的可能性。基于这种前景,保险公司可以承保。总部位于美国的保险公司 Lemonade 采取了类似的基于机器学习的方法。

5。情绪/新闻分析

情感分析正在处理大量的非结构化数据,如照片、音频文件、社交媒体帖子、博客等。来判断市场情绪。洞察市场情绪有助于市场细分、战略营销等。这是另一篇文章的主题。如果我在这里坚持金融方面,情绪分析直接帮助投资决策。例如,如果对一家公司的某些产品或公司本身有负面情绪,投资该公司是不明智的,因为股价可能会在未来下跌,反之亦然。当涉及到分析情感时,自然语言处理(NLP)技术被高度使用。

现实点吧!

除了上面提到的应用,机器学习在金融生态系统中还有更多应用场景。然而,除了少数真实世界的系统之外,机器学习还没有真正在金融领域崭露头角。为什么?大多数机器学习解决方案仍处于开发阶段,与机器学习相关的研发成本高昂!另一个原因是,传统组织仍未准备好自动化做出高度关键的财务决策的流程,因为这在很大程度上取决于 it。换句话说,还有很大的提升空间。也就是说,科技巨头和知名大学正在这一领域投入大量资源进行研究。谷歌的“谷歌人工智能”计划只是一个例子。随着大数据的可用性和所有这些研究的进行,机器学习正在快速发展。金融部门被当前机器学习进步浪潮彻底改变的那一天已经不远了。

资源

芒果糯米是生产力的关键吗?🥭

原文:https://towardsdatascience.com/is-mango-sticky-rice-correlated-with-productivity-ad925959d858?source=collection_archive---------53-----------------------

648 天情绪数据的分析和可视化

你想知道你的情绪如何影响你的睡眠,你的父母如何影响你的幸福水*吗?

成为一个数据呆子,并跟踪它!

🤔这到底是什么?(又名数据源)

2018 年 10 月,我开始跟踪自己的几个指标。

每天我都会对自己的情绪、睡眠、服用的维生素以及许多其他变量进行评分。后来,我还实施了每周回顾实践,记录在不同活动上花费的*均时间(例如工作时间),感恩,最喜欢的名言等等。

数据收集

每天和每周的评论都是通过在线表格记录的——每天一份在晚上或第二天早上填写,每周一份在每个周日结束时填写。从 2018 年的 Google Forms 开始,我又把表单搬到了 Coda,2020 年初又搬到了 Airtable。

使用 Toggl 每天跟踪每周活动数据(如花在有偿工作或自我改善上的时间)。这一周的总数在周末记入日志。

睡眠数据——深度睡眠的持续时间和总睡眠时间——被奥纳环跟踪,在周末记录每周*均值。

在 2020 年中期,我积累了足够的数据,或者说足够的数据分析技能来调查结果。有什么模式吗?相关性?我能绘制的最酷的图表是什么?

下面这个帖子是对过程的人性化总结,突出的结果,和最好的图表。👌

完整的 Jupyter 笔记本包括了许多想法的列表,供进一步分析。

让我们看看数字:数据访问

您可以使用 Airtable API 和这个出色的 Python 包装器来访问最新版本的数据。

我们对包含每周统计数据的数据框进行同样的操作,瞧,我们有两个熊猫数据框可以使用。

让我们看看他们能告诉我们什么。

🆙涨跌和皮尔逊

有了所有的情绪数据,我们可以绘制一些令人愉快的图表。

例如,这里有一个函数,它在选定的几天内绘制两种选定的情绪。

输出:

过去 30 天内自我报告的抑郁和焦虑评分。

这是很好的视觉化一个时期,但要看到更广泛的趋势,我们可以转向统计。我们最好的朋友皮尔逊进来了🙌。我可以总结一下最高值,但是相关矩阵太难展示了。

输出:

不同情绪测量之间的相关性。

遵循标准基准值(高于 0.5,低于-0.5-中等正/负相关,高于 0.7 或低于-0.7-强正/负相关),没有强相关。

这里有一个函数,用于选择和显示高于 0.5 和低于-0.5 的相关性,我在这里运行它,天数等于数据框的长度,以从整个数据集获取值。

输出:

它告诉我们什么?没什么特别的,真的。

  • 随着自信心的下降,我的抑郁程度增加,反之亦然:随着抑郁程度的下降,自信心增加。
  • 动机和抑郁之间也存在同样的关系。

另外,自信和动机是相互正相关的——一个人做得好,另一个人也会做得好。没什么好惊讶的。

然而,我期望睡眠质量与情绪有更强的相关性,但事实似乎并非如此。

🌇我最幸福的城市是哪里?

在过去的 648 天里,我去了很多地方,很想看看这个地方是否以及如何影响我的心情。

所有这些结果都需要全盘接受——每个地点的观测数据都不相同。

有几个城市我只呆了大约一周。这通常意味着我在那里是为了度假或一个特殊的活动,所以每天的安排和日常事务与长期逗留是不可比的。我从分析中排除了这些行。

要获得每个城市的最高*均情绪值,我们只需使用 group by 并提取最小值和最大值。

输出:

看起来我应该睡在华沙,为了工作去清迈——那会是一段很长的路程。🤷‍♀️

输出:

大多数情绪数据与我记忆中的自我的报告相符,除了巴黎的生产力值较低。我不记得是这样的。

有趣的是,在同一个城市——巴黎—,人们观察到了最低的生产率、最低的抑郁和最高的创造力。这不是我记忆中的这次逗留——我不会说它低于*均水*,或者在任何方面更有创造性。

📍而最工作狂的城市是…

工作和感觉富有成效不是一回事。但是,你猜怎么着?有人非常仔细地记录了一周内不同活动所花费的时间。

使用 datetime 很混乱——你可以在笔记本上看到我所有的尝试——对于这篇文章,我将坚持使用浮点值。让我们来看看我每天跟踪的主要活动的最高值和最低值——有偿工作、自我提升和生活组织。

输出:

看起来最“多产”的城市清迈并不是我工作时间最长的地方。同样,在里斯本花很多时间工作也没有让我觉得很有效率。

如何制作一个图表来可视化这些持续时间值,并显示里斯本有多不正常。

输出:

作为背景,我在里斯本的时候没有和我的伙伴在一起,非常孤独。我的解释是:

缺乏社会交往会导致过度工作,甚至没有积极的主观生产力感。

太浪费了,不要在家里做。☝️

💤我在哪睡的时间最长?

自我报告的睡眠质量华沙最高,槟榔屿最低。它是如何与睡眠时间成*方的?提醒一下:总睡眠深度睡眠值用一个奥纳环跟踪。

这是每个城市的睡眠时长值的图表。

输出:

不太清楚哪些是顶值,哪些是低值。我设法将睡眠值从浮点数转换成小时数。

输出:

请注意,上表几乎完全准确,除了一个值:Lisbon 的工作时间。它应该是 31 小时 15 分钟,但是由于值超过了 24 小时,事情就偏离了方向,尽管我诚实地(漫长、令人厌倦、通常令人沮丧地)尝试,我还是没能解决这个问题。

  • 我在华沙每周最长的*均深度睡眠时间——分别是 8:16 小时和 2:34 小时。
  • 吉隆坡每周*均深度睡眠时间最短——1:03 小时,以及
  • 槟榔屿每周总*均睡眠时间最短——6:57 小时。

吉隆坡的深度睡眠和总睡眠时间以及主观排名与槟榔屿非常接*。(吉隆坡 1 分 16 秒,7 分 03 秒,6.97 秒,槟城 1 分 22 秒,6 分 57 秒,6.57 秒)。

🏙城市赢家!

当然,任何关于城市的结论都与城市本身无关,而是与我在那里的特定生活环境有关——包括公寓、工作和睡眠场所、社交生活和天气。

确定在最有希望的地点创造的条件将是令人感兴趣的。我在清迈有什么其他地方没有的东西,让我的(印象中的)生产力如此之高?

莫自行车的可用性和芒果糯米的便捷性是生产力的关键吗?!

这是我决定这篇文章标题的地方。

🧀要奶酪了!我感激什么?

感恩练习是我每周回顾*的一部分,也是分析文本数据的一大来源!

为什么不用词云来显示最常用的词?🤩谁不喜欢好字云。

这是你可以做到的。跳过我清理柱子的部分,没人喜欢那部分。

结果:

显然,对于像我这样一个内向的隐士来说,也许令人惊讶的是,与人相关的术语在这片云上占据了显著的位置。特别提到妈妈和汤姆(我的搭档),以及 EA 社区的一个大喊。

⏰我到底在做什么?

他们说日子很长,但月份很短。

当你不注意的时候,日子就会变得模糊不清,特别是在 2020 年的封锁期,每天都是星期二(或者星期三,正如蒂姆·厄本所说的那样)。

写下突出的事件有助于养成密切关注的习惯。这也有助于更加珍惜每一天。

让我们来看看对我来说最常见的突出事件是什么。

我确实考虑到这是一份主观报告,由我设法注意到的、在一天结束时记得的、并决定写下来的内容组成。可能不太安全。

代码与 gratefulness cloud 相同,只是使用了不同的数据框和列作为文本源。

来自日常突出事件的词云。

不出所料,汤姆再次占据了突出的位置。我想这就是当你和你的伴侣生活在一起时会发生的事——他们到处都是血,init!😛

交谈(打电话、指导、交谈)和散步(散步、散步)是我最喜欢的活动。可以说,几个特定的人也是“突出的事件”(简、奥利弗和妈妈)。

结论

我学到了什么?没有什么开创性的东西。至少,没有明确的哇时刻和立即可操作的 CTA。和许多调查一样,这次调查也以:需要更多的研究!

在哲学方面,对数据的详细处理鼓励了更深入的思考,例如:

  • 工作效率感觉与工作时间长度之间的差异,以及
  • 促使我更仔细地调查在特定地点(如华沙)建立的确切生活和睡眠可能有助于更好的睡眠。

下一步,我可能会进行更多有意识设计的实验。例如,连续 4 周吃芒果,看看它是否会影响我的(感知水*的)生产力。😉

我知道你想说什么:我应该每天记下我的感激之情。我会把这个提议提交给我的国际单项体育联合会委员会。

关注我更多数据冒险!

[## 劳达米亚/数据组合

这是作为 Dataquest 和 DataCamp 课程 Data Science path 的一部分完成的所有项目的记录。那些…

github.com](https://github.com/Laodamia/Data-Portfolio)

迈克尔·乔丹是低方差之王吗?

原文:https://towardsdatascience.com/is-michael-jordan-the-king-of-low-variance-7f059e81955?source=collection_archive---------86-----------------------

继《最后的舞蹈》网飞纪录片系列之后,这里有三个你在统计网站上从未见过的“有史以来最伟大”决心的一致性测试。

《最后的舞蹈》将迈克尔·乔丹和整个 80-90 年代的篮球时代带回了我们的生活。但随之而来的是关于谁是“山羊”或历史上最伟大的人的无休止的争论,在这方面,乔丹在数据上并没有明显的优势——他没有比尔·拉塞尔赢得那么多冠军,没有卡里姆、卡尔·马龙、威尔特·张伯伦甚至仍然活跃的勒布朗·詹姆斯得那么多分。他场均得分最多,但仅比威尔特·张伯伦高出一点点。那么是什么让他如此特别呢?或者把他当成山羊只是 NBA 推广者和耐克公司的一个营销噱头,注入了我们天真的 90 年代孩子的记忆?嗯,我想考虑纪录片中反复提到的最后一个辩护-

乔丹总是表演。

他来赢得每一场比赛,并在每一场比赛中为观众中从未看过他现场表演的小孩表演。

也许我们可以在数据中看到这一点?如果迈克尔·乔丹是一个稳定的表演者,我们会期望看到他没有很多“糟糕的夜晚”。这意味着他的场均得分通常不会比他的*均得分低很多。方差的度量应该能够捕捉到这一点。

我们如何检验我们的假设?

我们想把乔丹和其他伟大的得分手做比较——我们会拿科比、拉里·伯德、威尔特·张伯伦和勒布朗·詹姆斯做比较。我们也想只选择他们*均得分高的赛季,否则,方差比较就没什么意思了。想象一下,如果有人*均每场比赛得 5 分,并且从未超过 10 分,这个玩家的方差很低,但他不是好玩家。我们正在寻找方差为 5 的每个游戏玩家的 30 分。此外,许多球员在新秀年需要时间热身,在联盟的最后几年有一些下降,所以我们想把这些排除在分析之外。出于这个目的,我们将只选择那些球员*均得分超过 25,并且至少打了 50 场比赛的赛季。我们还将展示该赛季*均值方差的标准化版本,这样像威尔特·张伯伦这样的球员在赛季中每场比赛*均得分超过 50 分(这有多疯狂..?),正如我们提到的,它可能固有地具有更高的方差。我们将把常规赛和季后赛结合起来进行方差估计。我们的数据来源将是非常详细的https://www.basketball-reference.com

对于伯德,我们选择了 1984/1985-1987/1988 赛季,张伯伦 1959/1960-1965/1966 赛季,1969/1970 赛季,乔丹-1984/1985 赛季,1986/1987-1992/1993 赛季,1995/1996-1997/1998 赛季,科比-2000/2001-2002 赛季)

所以…结果是:

标准偏差,非*均值标准化:

勒布朗-7.731231136445559

鸟——8 . 58860 . 88888888881

约旦——8 . 19860 . 888888888615

神户——9 岁。39960.89989899991

萎蔫——12 . 59861868612

标准偏差,按*均值标准化:

勒布朗—8.3877441

约旦— 8.36280090045399

枯萎——9 . 59860 . 99989999989

鸟——9 . 59980 . 99999999991

神户——9 岁。39860.89989898991

勒布朗和乔丹有几乎相同的方差。我们能为一致性设计一些更好的估计吗?

我们最后一次尝试如下-

我们不想在更高的分数中测量方差——高方差分数惩罚了拥有 50-60 分惊人表现的玩家,因为它与他的*均水*非常不同。我们只想惩罚“糟糕的夜晚”,我们希望所有的玩家都通过某种全球尺度来衡量,类似于我们对归一化方差所做的那样,因为如果你是一个 5 分玩家游戏,仅仅衡量与自己*均水*的距离不会算作你有许多糟糕的夜晚(因为你的*均水*一开始就不太好)。所以我们用这个公式

其中 P 是所有游戏分数的集合。

现在结果发生了巨大的变化:

枯萎——3.6269300860010376

约旦——4 . 54860 . 48648668661

勒布朗——6 岁。36660.66666666661

神户——7 岁。36860.78777878767

鸟——7 . 59867 . 38777787871

整个数据直方图供您目测:

所以你有它。胜利肯定不属于乔丹,但他在稳定性方面非常强。除了威尔特·张伯伦,我认为很难找到有类似表现的球员,尽管这需要更深入的研究来验证。当然,得分并不代表一切——例如,比尔·拉塞尔根本不是一个好的得分手,魔术师约翰逊也不怎么样,除了助攻、篮板、盖帽和抢断等其他统计数据,他们还在风格、赢球态度和关键时刻得到衡量。奇怪的是,当二阶矩统计在常规统计工作中如此普遍时,你却从未在游戏分析中看到它们。基本上一切都是关于*均值,最好的情况是关于条件预期(“65%的球队在季后赛中以 3-1 领先…”)

No-SQL 是在扼杀 SQL 吗?

原文:https://towardsdatascience.com/is-no-sql-killing-sql-3b0daff69ea?source=collection_archive---------6-----------------------

SQL 永远不会消亡的两个原因

上周,一位朋友转发给我一封电子邮件,邮件来自一位成功的企业家,他宣称“SQL 已死”。

这位企业家声称,像 MongoDB 和 Redis 这样广受欢迎的非 SQL 数据库会慢慢扼杀基于 SQL 的数据库,因此作为数据科学家学习 SQL 是一个“遗留问题”

我完全被他的邮件震惊了:他是如何得出如此离谱的结论的?但这也让我很好奇…有没有可能其他人也同样被误导了?这位企业家发展了一大批追随者,而且直言不讳——新的数据科学家是否收到了应该避免学习 SQL 的建议?

因此,我想我应该公开分享我对这位企业家的回应,以防其他人认为 SQL 正濒临灭绝。

你绝对应该学习 SQL,以便从事数据科学的职业。No-SQL 对学习 SQL 的价值没有任何影响

基本上有两个原因可以保证 SQL 在未来的几十年里仍然适用。

原因#1:不会——SQL 数据库不会取代 Presto、Redshift 或 BigQuery 等分析数据库

无论您的应用程序是使用 MySQL 这样的 SQL 后端还是 MongoDB 这样的非 SQL 后端,后端中的数据最终都会被加载到 Redshift、Snowflake、BigQuery 或 Presto 这样的专用分析数据库中。

具有分析数据库的*台架构示例:SQL 和 NoSQL

为什么公司要把数据转移到像 Redshift 这样的专业化柱状存储中?因为列存储能够比 NoSQL 和像 MySQL 这样的行存储数据库更快地运行分析查询。事实上,我敢打赌,柱状商店数据库的流行程度与 NoSQL 数据库一样快。

因此,应用程序数据库的技术,无论是 NoSQL 还是其他,通常与数据科学家无关,因为他们不使用应用程序数据库(尽管有一些例外,我将在后面讨论)。

原因 2:NoSQL 数据库的好处不是因为它们不支持 SQL 语言

事实证明,非 SQL 存储可以实现一个基于 SQL 的查询引擎,如果它对它们的支持有意义的话。类似地,SQL 数据库也可以支持 NoSQL 查询语言,但是他们选择不支持。

那么为什么柱状存储数据库有意选择提供 SQL 接口呢?

他们这样选择是因为 SQL 实际上是一种表达数据操作指令的非常强大的语言。

考虑一个简单的查询示例,该查询对 NoSQL 数据库 MongoDB 中的文档集合进行计数。

注意:MongoDB 中的文档类似于行,而集合类似于表。

**db.sales.aggregate( [
  {
    $group: {
       _id: null,
       count: { $sum: 1 }
    }
  }
] )**

将其与等效的 SQL 进行比较。

**select count(1) from sales**

很明显,对于想要提取数据的人来说,SQL 语言是更好的选择。(NoSQL 数据库支持一种不同的语言,因为 SQL 对于与数据库接口的应用程序库来说比较难以正确构建)。

我之前提到过,应用程序数据库的技术与数据科学家无关的规则也有例外。例如,在我的第一家公司,我们实际上没有像 Redshift 这样的分析数据库,所以我必须直接查询应用程序的数据库。(更准确地说,我是在查询应用程序数据库的读取副本)。

该公司的应用程序还使用了非 SQL 数据库 Redis,至少有一次我需要直接从 Redis 中提取数据,所以我确实需要学习 Redis 的 NoSQL API 的一些组件。

因此,在主应用程序专门使用 NoSQL 数据库的环境中,您学习的任何 SQL 都可能是不相关的。但是这些环境非常罕见,随着公司的发展,他们几乎肯定会投资支持 SQL 的列存储分析数据库。

感谢阅读!如果你觉得这篇文章有用,我写的是关于数据科学和媒体编程的文章,所以如果你想了解更多类似的内容,请关注我。

** [## 如何通过脸书数据科学面试

赢得面试的 4 个技巧

towardsdatascience.com](/how-to-pass-the-facebook-data-science-interview-3f2615c17012) [## 为什么 Python 比 R 更适合数据科学职业

新数据科学家将从学习 Python 中获益更多的四个原因

towardsdatascience.com](/why-python-is-better-than-r-for-data-science-careers-44ec7a149a18)**

回归中正态分布有必要吗?如何跟踪修复?

原文:https://towardsdatascience.com/is-normal-distribution-necessary-in-regression-how-to-track-and-fix-it-494105bc50dd?source=collection_archive---------4-----------------------

博克斯-考克斯变换,夏皮罗-维尔克检验,QQ 图

作者拍摄的图片——新加坡南洋理工大学的钟形建筑

我相信对于每个以前学过统计学的人来说,正态分布(高斯分布)是他们学到的最重要的概念之一。每次运行模型或者做数据分析的时候,我都倾向于检查因变量和自变量的分布,看它们是否正态分布。如果有些变量是偏斜的,不是正态分布的,我会有点慌。

我该怎么办?我应该转换变量吗?我应该把它从模型中移除还是就这么放着?

我总是想知道常态是否是一个必要的假设,以及我们应该如何解决它。这篇文章就是关于这些的。

那么对于自变量和因变量,正态性假设有必要成立吗?答案是否定的

假设正态分布的变量只是预测误差。什么是预测误差?是模型预测结果与真实结果的偏差。

Y =系数* X +截距+预测误差

预测误差应遵循*均值为 0 的正态分布。置信区间和变量显著性的计算就是基于这个假设。这是什么意思?例如,您试图分析哪些变量有助于预测房价,并且您选择了基于 5%显著性水*的因素。如果误差分布显著偏离均值 0 正态分布,那么你选择的显著因素实际上可能不足以显著影响房价变化。但是,如果您只想获得基于最小均方误差的预测,这不会影响您的预测。

那么我们该怎么办?如果你只是想得到预测,那就随它去吧。如果要选择重要的预测因素,在构建模型和预测后,应该绘制图表以查看预测误差的分布。

为了更好地说明,我创建了 1 个随机正态分布样本和 1 个非正态分布样本,每个样本都有 1000 个数据点。

#create normal and nonnormal data sample
import numpy as np
from scipy import stats
sample_normal=np.random.normal(0,5,1000)
sample_nonnormal=x = stats.loggamma.rvs(5, size=1000) + 20

有许多方法可以检验数据的正态性,下面只是一些例子:

  1. 简单地画出分布曲线,看看曲线是否符合钟形曲线形状。非正态样本明显是左尾的。
import seaborn as sns
import matplotlib.pyplot as plt
sns.distplot(sample_normal)
plt.show()
sns.distplot(sample_nonnormal)
plt.show()

正态分布样本的分布(左);非正态分布样本的分布图(右)

2.使用夏皮罗-维尔克测试,内置的 python 库可用,您可以根据您决定的 p 值来决定,通常我们在 5%的显著性水*上拒绝 H0,这意味着如果 p 值大于 0.05,那么我们接受它为正态分布。注意,如果样本量大于 5000,就应该用检验统计量而不是 p 值作为指标来决定。

print (stats.shapiro(sample_normal))
print (stats.shapiro(sample_nonnormal))#Test Statistics, p-value
#(0.9970424175262451, 0.06130971387028694) - H0 accepted
#(0.9806660413742065, 2.945287624900317e-10) - H0 rejected
  1. QQ 图,一个非常流行的用来观察数据分布是否遵循正态分布的图。
fig = sm.qqplot(sample_normal,line='s')
plt.show()
fig = sm.qqplot(sample_nonnormal,line='s')
plt.show()

正态分布 QQ-plot(左);非正态分布 QQ 图(右)

我们如何解决常态问题:

通常,出现此问题(误差不符合正态分布)有两个原因:

  1. 因变量或自变量太不正常(可以从变量的偏斜度或峰度看出)
  2. 存在一些干扰模型预测的异常值/极值

我们应该做的是首先检查因变量和自变量中是否存在异常值。如果去除异常值不能解决问题,那么我们应该使用 box-cox 变换将一些非正态变量转换为正态分布。

下面是 Box-Cox 变换的数学公式。将基于数据点来决定λ值,以在变换后提供最佳的正态分布形状。我们可以直接使用 Python 包来帮助我们转换数据。

Box-Cox 变换数学公式

#transform the data using box-cox
sample_transformed, lambd = stats.boxcox(sample_nonnormal)#plot the distribution curve and QQ-plot for transformed data
sns.distplot(sample_transformed)
plt.show()
fig = sm.qqplot(sample_transformed,line='s')
plt.show()

我们可以看到,经过 box-cox 变换后,非正态分布的样本是正态分布的。

总之,如果您试图找到一个重要的预测因子或定义置信区间,请记住在模型建立后检查误差项的分布。如果因变量或自变量非常非正态,那么可以使用 box-cox 变换对其进行变换,使误差项更加正态分布。

您认为在构建模型之前,您已经完成了所有的统计假设检查了吗?不,你不是!如果你想了解更多关于回归模型中的其他统计假设,请参考我下面另一篇关于多重共线性的文章。

[## 回归中的多重共线性

为什么这是个问题?如何跟踪和修复它

towardsdatascience.com](/multi-collinearity-in-regression-fe7a2c1467ea)

NumPy 比 Python 快吗?

原文:https://towardsdatascience.com/is-numpy-faster-than-python-e8a7363d8276?source=collection_archive---------17-----------------------

Numpy 的线性代数比常规 Python 快多少?

A 前几天,我写了一篇文章,客观地比较了 Julia 和 Python 的现状,甚至测试了两种语言之间的一些基本迭代性能。虽然 Python 肯定落后于 Julia,但令人印象深刻的是 Python 在 Julia 面前表现得如此之好,当处理较小的数据集时,Python 通常仅落后于 Julia。然而,当观察次数增加时,Python 的速度缺点似乎成指数增长。您可以在此处找到该文章的链接:

[## 该不该跳 Python 的船,搬去茱莉亚?

是应该为了朱丽亚的表现而抛弃 Python,还是朱丽亚的速度只是精心炒作?

towardsdatascience.com](/should-you-jump-pythons-ship-and-move-to-julia-ccd32e7d25d9)

公开发表你的作品的一个好处是,它基本上可以被整个互联网的同行评议。虽然这可能会为一些相当粗鲁的人找你麻烦打开大门,但它也允许志同道合的科学家交流思想。这个故事留下了很大的反响,对我的测试进行了建设性的批评,因为我为元素级乘法和元素级指数编写了自己的函数。需要说明的是,我的目标是比较这两种语言的原始能力,并不是说用一种或另一种语言可以更快地编写这个算法,而是说明用 Julia 编写后端代码要容易得多,这与因为 Python 的缺点而改用 C 语言相反。

当然,比起使用我自己的函数,大多数 Python 程序员更希望我不要重新发明轮子,而是把它做成方形,并且更希望我只使用 NumPy。然而,为了准确测试 Pythonic 的性能,并与不使用 C 的 Julian 性能进行比较,我避免使用 C。

然而,这个想法让我很好奇。在 Github 上看,NumPy 大约有 51%是 c 语言,所以很明显,在很多情况下,NumPy 会击败我们在 Python 中可以进行的任何操作。目前悬而未决的是,我们可以从这样的事情中获得多大的性能提升。此外,NumPy 中相对基本的线性代数函数,如 numpy.multiply(),有可能是用 Python 编写的,甚至没有利用 c。

%timeit 测试

笔记本

我想测试这一点的第一种方法是使用我在之前的另一篇文章中使用的相同方法。我将使用一个 10,000,000 的 dim 数据集,并尝试使用一个简单的线性回归模型进行预测,该模型使用了 C 中可能使用的 NumPy 函数和我自己的 Pythonic 函数。下面是使用我自己的函数编写的类:

def dot(x,y):
    lst = []
    for i,w in zip(x,y):
        lst.append(i * w)
    return(lst)
def sq(x):
    x = [c ** 2 for c in x]
    return(x)
class LinearRegression:
    def __init__(self,x,y):
        # a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
        # b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
        if len(x) != len(y):
            pass
        # Get our Summations:
        Σx = sum(x)
        Σy = sum(y)
        # dot x and y
        xy = dot(x,y)
        # ∑dot x and y
        Σxy = sum(xy)
        # dotsquare x
        x2 = sq(x)
        # ∑ dotsquare x
        Σx2 = sum(x2)
        # n = sample size
        n = len(x)
        # Calculate a
        self.a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx**2))
        # Calculate b
        self.b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ** 2))
        # The part that is super struct:
    def predict(self,xt):
        xt = [self.a + (self.b * i) for i in xt]
        return(xt)

这是使用 NumPy 函数编写的同一个类:

import numpy as np
class npLinearRegression:
    def __init__(self,x,y):
        # a = ((∑y)(∑x^2)-(∑x)(∑xy)) / (n(∑x^2) - (∑x)^2)
        # b = (x(∑xy) - (∑x)(∑y)) / n(∑x^2) - (∑x)^2
        if len(x) != len(y):
            pass
        # Get our Summations:
        Σx = sum(x)
        Σy = sum(y)
        # dot x and y
        xy = np.multiply(x,y)
        # ∑dot x and y
        Σxy = sum(xy)
        # dotsquare x
        x2 = np.square(x)
        # ∑ dotsquare x
        Σx2 = sum(x2)
        # n = sample size
        n = len(x)
        # Calculate a
        self.a = (((Σy) * (Σx2)) - ((Σx * (Σxy)))) / ((n * (Σx2))-(Σx**2))
        # Calculate b
        self.b = ((n*(Σxy)) - (Σx * Σy)) / ((n * (Σx2)) - (Σx ** 2))
        # The part that is super struct:
    def predict(self,xt):
        xt = [self.a + (self.b * i) for i in xt]
        return(xt)

使用的两个 Numpy 函数是 square()和 multiply()。这些函数相对简单,正如我在函数示例中展示的那样,所以我真的很好奇是否有 C 语言可以加速它们。在我们开始速度测试之前,我们需要读入一些数据:

import pandas as pd
df = pd.read_csv("speedtrain.csv")
testdf = pd.read_csv("speedtest.csv")

现在我们将以我们自制的函数为基线来计时:

虽然 8.22 当然不坏,但它还可以更好。Julia 在不到一秒钟的时间内完成了这个计算,所以看看 C 和 Python 的组合如何与 Julia 相抗衡将会非常有趣:

哇!

看起来我文章的评论有一点是对的;NumPy 和 C 对于线性代数来说要快得多。我曾怀疑 NumPy 可能会为这个操作保留纯 Python 代码,但是很明显我错了。我认为提醒我们自己 NumPy 可能也有自己的类型和用 C 编写的迭代器也很重要。这当然非常酷,因为这意味着 NumPy 相对来说非常快。

结论

所以简短的回答是

是的,

NumPy 比 Python 快很多。虽然这是意料之中的,但是如果我说我期望通过使用 NumPy 而不是 Pythonic 函数来实现我的目标,那么我是在撒谎。我认为这也是对为了 Python 中的科学和数学而对 NumPy 包所做的惊人工作的一种敬意。目前,NumPy 在 Github 上有超过 23,000 个提交,这是为社区做的大量免费、开源、无私的工作!

总的来说,我认为 Python 可以通过使用一个大的 C 库来加速是非常酷的。毕竟,Python 主要是为最终用户与低层应用程序进行交互而创建的,就像他们在 ABC 中那样。我很高兴收到这个回复,并且能够进一步研究这个问题,了解更多关于使用 NumPy 带来的性能好处。非常感谢你们所有人的阅读,也感谢你们提供建设性的反馈,比如催生了这篇文章的回复。

NumPy 真的比 Python 快吗?

原文:https://towardsdatascience.com/is-numpy-really-faster-than-python-aaa9f8afb5d7?source=collection_archive---------24-----------------------

来源:sl linux 命令的截图

是的,但前提是你知道如何使用它。

Python 开发人员都知道 NumPy 比普通 Python 快。然而,如果你用错了,它可能会影响你的表现,这也是事实。要知道什么时候使用 NumPy 是有益的,我们必须了解它是如何工作的。

在这篇文章中,我们将详细了解一下为什么 NumPy 可以更快,以及什么时候使用它是次优的。

Python 中的随机数

我们的玩具问题是随机数的产生。假设我们只需要一个随机数。我们应该使用 NumPy 吗?来测试一下吧!我们将它与内置的随机数生成器进行比较,运行两者一千万次,测量执行时间。

对我来说,结果如下。

所以,对于单个随机数,NumPy 要慢得多。为什么会这样呢?如果我们需要一个数组而不是一个数字呢?会不会也慢一点?

这一次,让我们生成一个包含一千个元素的列表/数组。

(我不想在 lambdas 中包装要计时的表达式,因为在 Python 中函数调用有开销。我希望尽可能精确,所以我将它们作为字符串传递给timeit函数。)

现在情况大不一样了。当我们生成一个数组或随机数时,NumPy 轻松获胜。

这个结果也有一些奇怪的地方。首先,我们生成一个随机数 10 000 000 次。第二,我们将 1000 个随机数组成的数组生成 10 000 次。在这两种情况下,我们最终都有 10 00 万个随机数。使用内置方法,当我们将它们放入一个列表中时,需要大约 2 倍的时间。然而,使用 NumPy,当使用数组时,我们看到了比它本身快 30 倍的速度。

为了了解幕后发生了什么,我们将对代码进行分析。

剖析代码:使用 cProfiler 进行分析

为了查看脚本在每个函数中花费了多少时间,我们将使用 cProfiler

1.用于生成单个数字的内置随机数

我们先来看看内置函数。在下面的脚本中,我们像以前一样创建 10,0 00,0 00 个随机数。

我们从命令行使用 cProfiler:

python -m cProfile -s tottime builtin_random_single.py

出于我们的目的,这里有两个重要的列。ncalls显示一个函数被调用的次数,而tottime是花费在一个函数上的总时间,不包括花费在子函数上的时间。

所以内置函数random.random()如预期被调用了 10 000 000 次,在那个函数上花费的总时间是0.380秒。

NumPy 版本呢?

2.NumPy random 用于生成单个数字

这里,这是我们分析的脚本。

结果令人惊讶:

与之前类似,numpy.random.random()函数确实如我们所料被调用了 10 000 000 次。然而,脚本在这个函数上花费的时间比以前在内置的随机函数上花费的时间要多得多。因此,每次函数调用的成本更高。

然而,当我们开始使用数组和列表时,事情发生了巨大的变化。

3.内置的随机数生成一个随机数列表

像以前一样,让我们生成 1000 个随机数的列表 10 000 次。

侧写的结果并不令人惊讶。

正如我们所看到的,大约 60%的时间花在了列表理解上:10 000 个电话,总共 0.628 秒。(回想一下,tottime不计算子功能调用,比如这里对random.random()的调用。)

现在我们可以看到为什么 NumPy 在正确使用的情况下会更快。

4.NumPy random 用于生成随机数数组

这个剧本和以前一样非常简单。

这是侧写的结果。

10 000 次呼叫,即使每次呼叫花费的时间更长,您也可以获得 10 00 个随机数的numpy.ndarray。正确使用 NumPy 的原因是它的数组非常高效。它们就像 C 数组而不是 Python 列表。它们之间有两个显著的区别。

  • Python 列表是动态的,因此可以添加和删除元素。NumPy 数组的长度是固定的,所以如果不创建一个新的数组,就不能添加或删除。(创建一个数组成本很高。)
  • Python 列表可以同时保存几种数据类型,而 NumPy 数组只能包含一种。

因此,它们不太灵活,但性能明显更高。当不需要这种额外的灵活性时,NumPy 优于 Python。

盈亏*衡点在哪里?

为了确切地了解 NumPy 在随机数生成方面在多大程度上超过 Python,我们可以通过测量不同大小的执行时间来比较这两者。

我们可以看到 20 左右,NumPy 开始超过 Python。当然,对于其他运算,如计算正弦或数字相加,这个数字可能不同,但趋势是相同的。对于较小的输入大小,Python 的表现略胜于 NumPy,但是随着输入大小的增加,NumPy 会大幅度胜出。

摘要

正确使用 NumPy 可以显著提高性能。然而,在某些情况下,Python 可能是更好的选择。如果你不知道什么时候使用 NumPy,你可能会损害你的表现。

一般来说,你最好使用普通的 Python,例如

  • 你处理小列表,
  • 您想要频繁地添加/删除列表。

当优化性能时,总是要考虑事物内部是如何工作的。这样,即使是在 Python 中,您也可以真正增强代码。

如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!

公共交通应该为冠状病毒的传播负责吗?

原文:https://towardsdatascience.com/is-public-transit-to-blame-for-the-spread-of-coronavirus-3cec94b7388f?source=collection_archive---------57-----------------------

新冠肺炎 Python 教程# 2-熊猫和统计模型

马丁·大卫在 Unsplash 上的照片

***Note from the editors:***[*Towards Data Science*](http://towardsdatascience.com/) *is a Medium publication primarily based on the study of data science and machine learning. We are not health professionals or epidemiologists, and the opinions of this article should not be interpreted as professional advice. To learn more about the coronavirus pandemic, you can click* [*here*](https://www.who.int/emergencies/diseases/novel-coronavirus-2019/situation-reports)*.*

美国城市遭受重创

随着各州开始重新开放,很多事情仍不明朗。公共官员似乎在重新开放他们的州的问题上存在党派分歧,公民们开始在全国范围内抗议。虽然政党似乎发挥了作用,但这种分裂也可能是由冠状病毒的不均衡影响造成的。毫无疑问,美国城市受到的冲击最大。

来源:https://www . nytimes . com/interactive/2020/us/coronavirus-us-cases . html

城市的人口密度最大,在获得医疗保健方面的差距也可能最大,因此可以预见,城市是受影响最大的地方。但是,病毒的传播会不会归结于对城市本身更为根本的东西。从图表中,我们可以看到最大的影响来自东北部,而越往西走,城市受到的影响似乎越来越小。

城市间影响力的差异引发了这样一个问题:东北部城市是否有一些根本的东西是西部城市不必担心的。例如,冠状病毒会因为公共交通使用的巨大差异而扩散吗?看看这张 2013 年的图表。

来源:https://fivethirtyeight . com/features/how-your-cities-public-transit-stacks-up/

它们看起来几乎是同一个图像。这是有道理的。每天乘坐拥挤的地铁车厢或只有一个携带者的小型封闭公共汽车上下班可能会导致新感染的爆发。更不用说,大量频繁接触的金属、玻璃和塑料表面,病毒可以在上面存活数小时。此外,这也可以解释在欧洲和其他发达国家相对更严重的影响,这些国家也有发达的公共交通系统。尽管乍一看很有说服力,但让我们看看数字是否支持它。

量化公共交通的影响

当州长和市长计划重新开放他们的社区时,应该采取重大预防措施来防止新感染的再次出现。公共交通可能是确保我们做好这件事的关键驱动力。在这篇文章中,我将带你通过一步一步的分析来估计公共交通对冠状病毒传播的影响。

数据

我使用了来自纽约时报的各县冠状病毒病例的分类数据,我还使用了 T2 联邦运输管理局发布的公共交通使用数据。文件中还包括从美国农业部 (USDA)收集的县级人口和收入数据。本文使用的所有数据都可以在这里找到。

根据非关联乘客出行对城市进行排名。非关联旅客出行是指居民进行的非关联的总出行次数。

**Note**: Probably the hardest part of this process is the data-wrangling in order to make the resulting dataset, if you would like to know how it was done, feel free to ask! This process also removed certain cities like NYC due to data matching errors between datasets. Also, the number of cases are as of when I was working on this project, which was actually about a month ago.

回归

量化自变量对因变量影响的一个简单方法是线性回归。

在这里,我们可以通过在上述回归中估计 x 的β系数,来模拟公共交通使用 x 对感染 y 的影响。我们可以在 python 中这样做,并检查它的重要性。首先,我们导入相关的包:

然后我们运行回归并打印结果!

执行回归后,我们发现我们有一个系数 0,但一个真正重要的 p 值。所以没有影响?

我们看到系数基本上为 0,并且在 t 统计量上有一个低 p 值。这意味着自变量在 99.999%的置信度下可能没有影响。

需要注意的是,我们的自变量的大小,比案例数要高得多。这可能导致系数小于 0.0001,但仍然很重要,因为乘客出行的数量在数千和/或数百万的数量级。因此,在进行回归分析之前,我们应该将变量标准化,以获得更合理的估计值。

结果表明,不相关的乘客旅行实际上对冠状病毒病例的数量有显著影响。

现在我们看到一个更有趣的结果,公共交通实际上可能对冠状病毒病例的数量有相对显著的影响。

检查有效性

这个结果准确吗?大概不会。可能有许多因素与公共交通使用相关,也可能对感染人数有因果影响。

例如,大量使用公共交通可能与低收入人群的高患病率相关。由于经济原因,这些人可能无法遵守留在家中的命令,因此更有可能被感染。高人口密度也可能与高公共交通使用率相关,更多的人意味着更多的交通流量——导致使用公共交通的概率更高。无论公共交通是否存在,更密集的环境都可能导致更多的感染。简而言之,贝塔系数可能被夸大了。相关性并不意味着因果关系。

那么我们该如何改善这一点呢?一种方法是使用一个工具变量,该变量与其他因素无关。虽然有效,但在实践中很难找到有效的工具变量。公共交通的普及与人口密度、收入和地方政府有着内在的联系。

我们也可以尝试一种差异的方法。如果这个国家有一些地区关闭了公共交通,我们可以比较这些县与那些没有关闭的县的感染率变化的差异。然而,没有足够多的县这样做,以作出准确的估计。因此,相反,我们将简单地添加一些控制变量,以尝试并减少因忽略因素而导致的偏差。

控制

我们应该添加的主要控制因素是人口密度和收入水*,因为这两个因素最有可能导致高估公共交通的影响。我们可以通过下面的代码来实现这一点:

我们看到它对我们的结果产生了巨大的影响。公共交通的影响已经减半,但它似乎仍然对冠状病毒的病例数有重大影响。

请注意,虽然不相关的乘客出行有影响,但这种影响大约是人口密度影响的四分之一。然而,这仍然是相当重要的。

结论

因此,根据分析,公共交通可能对新感染人数有影响。由于县级数据和市级数据之间的冲突,合并数据集存在一些限制,但我们仍然看到了一个相当令人信服的结果,即与农村地区相比,这可能导致了城市中病毒的更广泛传播。当政府计划重新开放时,他们应该特别小心如何重新开放高风险地区,他们应该依靠严格的分析来支持他们的决定。

本文是冠状病毒相关 python 教程的三部分迷你系列的第二篇文章。你可以在这里查看第一篇文章!

Python 比 R 快吗?

原文:https://towardsdatascience.com/is-python-faster-than-r-db06c5be5ce8?source=collection_archive---------23-----------------------

基于简单机器学习管道的 R vs Python 速度基准测试

图片改编自https://www.r-project.org/logo/https://www.python.org/community/logos/

关于用于机器学习的正确工具,有很多反复出现的讨论。r 和 Python 经常被认为是替代品:它们都适合机器学习任务。但是当一个公司需要开发工具并为此维护两个解决方案时,这可能会带来更高的成本。所以,我们有时候不得不选择。

在这篇文章中,我将展示一个 R vs Python 的速度基准测试,我这样做是为了看看 Python 是否真的像某些人声称的那样提供了速度提升。

基准机器学习管道

对于一个基准来说,要做到公*是相对困难的:执行的速度可能很大程度上取决于我的代码,或者所使用的不同库的速度。我必须做出决定,我已经决定对虹膜数据集进行分类。这是一个相对容易的机器学习项目,这似乎有助于进行公*的比较。

我将使用 R 和 Python 中的库,我知道它们是常用的,此外它们也是我自己喜欢使用的库。

基准测试的步骤

我做了两个笔记本,R 和 Python,都执行以下步骤:

  • 读取带有虹膜数据的 csv 文件。
  • 将数据随机分为 80%的训练数据和 20%的测试数据。
  • 使用内置的网格搜索和交叉验证方法,在训练数据上拟合多个模型
  • 根据测试数据评估每个最佳模型,并选择最佳模型

基准的模型

我选择使用以下模型列表:逻辑回归、线性判别分析、K-最*邻和支持向量机。对于后两者,我添加了一个网格搜索,用于在 3 个内核上使用多处理进行 5 重交叉验证的超参数调优。

我选择了这些模型,而不是更流行的 Random Forest 或 XGBoost,因为后者有更多的参数,并且函数接口之间的差异使得很难确保模型执行的完全*等的设置。

我选择的模型参数更少,在 R 和 Python 中使用它们的方式几乎相同。因此,用错误的参数选择来偏置基准的风险较小。

由此产生的脚本和笔记本

我在下面展示了结果代码。要在你自己的硬件上运行笔记本,你可以在这里下载R 笔记本和在这里下载 Python 笔记本

R 代码

基准测试使用了以下 R 代码:

Python 比 R 快吗?—R 代码。作者配图。

Python 代码

基准测试使用了以下 Python 代码:

Python 比 R 快吗?Python 代码。作者配图。

结果:Python 比 R 快吗?

为了进行公*的比较,我在一个执行了 100 次的函数中转换了完整的代码,然后测量了它所用的时间。这两个代码都是在配有 2.4GHz 双核英特尔酷睿 i5 处理器的 MacBook Pro 上执行的。

R 脚本的总持续时间大约是 11 分 12 秒,大约是每个循环 7.12 秒。Python 脚本的总持续时间大约为 2 分 2 秒,每个循环大约为 1.22 秒。

Python 代码比 R 替代方案快 5.8 倍!

因此,这种特殊机器学习管道的 Python 代码比 R 替代方案快 5.8 倍!

当然,这不能自动推广到 R 和 Python 中任何类型项目的速度。此外,可能有更快的替代方法来用这两种语言编写这些代码,但我认为当关注功能而不是速度时,这两种代码都是编写机器学习笔记本的合理方法。

对我个人来说,这种差异比我预期的更显著,我会在未来的项目中考虑这一点。我希望这篇文章对你也有用!感谢阅读!

PyTorch 是在抓 TensorFlow 吗?

原文:https://towardsdatascience.com/is-pytorch-catching-tensorflow-ca88f9128304?source=collection_archive---------6-----------------------

2020 年深度学习框架的状态

自从我为主要的深度学习框架看风景以来,已经有 10 个月了。PyTorch 和 [TensorFlow](http://Search Results Web Result with Site Links www.tensorflow.org) 已经成为明确的框架选择。TensorFlow 领先 PyTorch 两年,但 PyTorch 已经在许多领域缩小了差距。让我们看看现在的情况吧!👍

PyTorch 和 TensorFlow?

有什么新鲜事?

TensorFlow 和 PyTorch 越来越像了。TensorFlow 采用了 PyTorch 创新,PyTorch 也采用了 TensorFlow 创新。值得注意的是,现在这两种语言都可以在动态执行模式或静态图形模式下运行。

这两个框架都是开源的,但是 PyTorch 是脸书的产品,而 TensorFlow 是谷歌的产品。

让我们看看其他一些显著的差异和更新。👍

PyTorch

在撰写本文时,PyTorch 的版本是 1.4。它一直在增加功能,以提高行业的采用率。PyTorch 现在可以更容易地在谷歌云的张量处理单元(TPUs) 上运行——这是训练复杂深度学习模型的最快方法。

此外,Chainer 框架的维护者 Preferred Networks 最*将他们的团队带到了 PyTorch。最后,如果你喜欢 C++或 Java, PyTorch 有一个版本适合你。😀

张量流

TensorFlow 2.0 引入了许多改进,使 API 更加精简和友好。它紧密集成了 Keras,因为它是前端的高级 API。Keras 仍然可以与其他一些框架一起使用,但是将其作为 TensorFlow 的一部分使用通常是有意义的。

此外,如果你更喜欢 JavaScript 而不是 Python,TensorFlow 为你准备了一个 JavaScript 版本。😀

TensorFlow 在生产和边缘深度学习方面仍然比 PyTorch 有更多的功能,但 PyTorch 越来越接*功能对等。

方法

如果你想学习一个流行的深度学习框架,PyTorch 和 TensorFlow 是城里的两个游戏。我没有考虑其他框架,因为没有其他框架被广泛采用。

在我之前的分析中,我查看了许多指标。结果显示,TensorFlow 和 PyTorch 都在稳步增长。在这篇文章中,我将关注我认为最重要的四个指标:工作列表、研究使用、在线搜索结果和自我报告使用。

让我们跳进来吧!🚀

工作列表

2020 年 1 月 26 日在美国用关键词 TensorFlowPyTorch 搜索果然怪兽简聘LinkedIn

TensorFlow 在每个招聘网站的搜索结果中出现的次数*均是两倍。以下是原始数据:

这是结果占总数的百分比。

在我十个月前的分析中,我注意到 TensorFlow 出现在三倍于 PyTorch 的列表中。现在 TensorFlow 的优势降到了 2 倍。📉

研究

PyTorch 现在是顶级研究会议论文的领导者。前 PyTorch 实习生 Horace He 在本文中研究并讨论了这个话题。这是一张显示增长的图表。

来源:https://chillee.github.io/pytorch-vs-tensorflow/

超过 50%意味着 PyTorch 比 TensorFlow 在那次会议上被提及的次数更多。

作为一个更详细的样本,这里是来自 NeurlIPS 会议的原始分数,PyTorch 使 TensorFlow 黯然失色。

来源:https://chillee.github.io/pytorch-vs-tensorflow/

在最*的 NerulIPS 会议中,PyTorch 在 166 篇论文中,TensorFlow 在 74 篇论文中。PyTorch 从 2018 年的论文数量少于 TensorFlow,到 2019 年的数量增加了一倍多。

PyTorch 这么快就超过 TensorFlow 我觉得很惊讶。PyTorch 是否会继续扩大其在这一领域的领先优势,这将是一件有趣的事情。📈

接下来让我们看看在线搜索。

搜索流行度

我用 Google Trends 找到了 2017 年 1 月 26 日到 2020 年 1 月 26 日 PyTorch(软件)和 TensorFlow(计算机应用)在美国的相对搜索次数。

请参见下面的结果,TensorFlow 为蓝色,PyTorch 为红色:

谷歌搜索兴趣。蓝色张量流。红色火炬。

显然没有人想在寒假前后搜索深度学习框架。🎄😀

这是线性趋势线的相同数据。

蓝色张量流。红色火炬。参见 互动网络版Tableau Public。

PyTorch 已经大大缩小了差距。看看这种趋势是否会持续下去将会很有趣。

最后,让我们看看人们说他们在用什么。

报告的使用

在 2019 年的堆栈溢出开发者调查中,10.3%的受访者报告使用 TensorFlow,而 3.3%的受访者报告使用 Torch/PyTorch。专业开发人员的得分相似(9.4%对 2.9%)。没有其他深度学习框架的报道。

值得注意的是,这项调查是在 2019 年初进行的,所以我们必须等待,看看 2020 年的结果会显示什么。📊

概述

TensorFlow 仍然在 PyTorch 的许多工作列表中被提及,但差距正在缩小。PyTorch 在顶级会议的研究论文中的使用量已经领先,并且几乎缩小了在谷歌搜索结果中的差距。根据最*的堆栈溢出开发者调查,TensorFlow 的使用仍然是普通的三倍。

总体而言,TensorFlow 在大多数领域仍然领先,但 PyTorch 正在取得进展。🐎

你应该关注什么?

这个项目是出于我的愿望而诞生的,我希望把我的时间花在使用深度学习框架并利用它进行教育上,这对于人们的学习来说是最有意义的。我仍然没有决定未来两年的答案是 PyTorch 还是 TensorFlow。

PyTorch 很可能会继续向对等发展。然而,TensorFlow 仍然是安全的选择。在可预见的未来,它将会很受欢迎,尤其是雇主。

值得注意的是,这两个框架都本着合作竞争的精神不断创新。即将到来的创新将塑造它们的受欢迎程度,并为用户带来好处。🎉

资源

如果你准备学习深度学习,我建议参考以下资源:

fast.ai MOOC 有很棒的视频和支持它的社区。想学 PyTorch 的话特别有用。

Chollet 的用 Python 进行深度学习这本书是关于深度学习的很好的入门书。他是 Keras 的原作者。如果你想学习 TensorFlow,这是一个特别好的选择。

TensorFlow 和 T2 py torch 的文档中都有很好的教程和指南。

先决条件

在你着手深度学习之前,我建议你学习 Python。如果你是 Python 的新手,我可以推荐我的难忘的 Python 书吗?😀

一旦你熟悉了 Python 基础知识,我建议你学习 NumPy 和 pandas Python 库来进行数据清理和分析。McKinney 的 Python for Data Analysis 这本书很好地涵盖了 NumPy 和 pandas。我还在准备一本关于熊猫的书,所以订阅我的 Data Awesome 邮件列表吧,当它发布时,你会是第一个知道的人。

最后,在跳入机器学习的深度学习分支之前,我建议你用 scikit-learn 库学习使用更通用的机器学习算法。我喜欢穆勒和圭多的用 Python 介绍机器学习。此外,Aurélien Géron 的第二版使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习涵盖了使用 TensorFlow 2.0 进行机器学习和深度学习。

包装

我希望你发现这个对最流行的深度学习框架的状态的评估是有用的。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。👍

我写关于 PythonDockerSQL 和其他技术主题的文章。如果你对此感兴趣,请关注我,在这里阅读更多。

快乐决定!⚖️

R Shiny 的多功能性足以构建一个视频游戏吗?

原文:https://towardsdatascience.com/is-r-shiny-versatile-enough-to-build-a-video-game-5c93232ef4e2?source=collection_archive---------61-----------------------

用有趣的方式推动 r 闪亮

在过去的两年里,RStudio 一直在组织一场竞赛,展示作为创建应用程序框架的 Shiny 的强大功能和灵活性。最*我一直致力于让闪亮的应用程序变得更漂亮,今年我决定参加这个比赛。然而,我想做一些稍微不同的事情…

就在那时,一个问题突然出现在我的脑海中:有没有可能用 R Shiny 来制作一个游戏,即使是作为一个原型?它真的有可玩性和趣味性吗?

电子游戏?在 R 闪亮?

历史上,Shiny 一直被用于数据驱动的应用程序和快速开发工具,但游戏之前已经在各种语言和框架中完成。不仅如此,所有的要素都在那里:构建 UI 的方法,保持游戏状态的东西,以及读取玩家输入并相应更新 UI 的能力。

早在 2016 年就有人试图制作简单闪亮的游戏《T2 》,但我想尝试一些更有雄心的东西。我越是拿这个想法开玩笑,它就越是可行。让我们看看我是不是对的。

这个概念

我最初的想法很简单。我希望它是一个慢节奏的游戏,你可以在桌面或手机上玩,因为我也想探索在 Shiny 中构建响应性 ui。我玩了一个刷卡游戏,不同方向的刷卡会以不同的方式影响游戏。这些选择会影响一些指标,玩家会调整决策,使这些指标保持在最佳水*。

一款静态、早期版本的游戏。

我觉得把玩家放在一个虚构的世界领袖的位置上会很有趣,他的决定会影响世界的状态。作为一名全能的决策者,你的工作是*衡经济、环境和公众对你表现的看法。如果其中任何一个达到零,游戏就结束了!

玩家*衡三个指标:财富、观点和环境

我还觉得用一个单独的值来追踪你有多邪恶会很有趣。不会让你输掉比赛,但会根据你的行为提供一些小的好处或障碍。因此,因果报应仪诞生了。

因果报应仪(左)

我想象它有一种复古的感觉,所以我用 NES.css 来表达一点怀旧之情。我也真的想展示一个基于度量标准的地图,在这种情况下,“传单”是一个简单的选择,因为它是如此受欢迎和易于使用。

实践中的概念验证

有了大部分的研究和坚实的概念证明,是时候实施了!我希望有一个非常清晰和易于遵循的项目结构,同时让任何人都可以简单地学习和扩展。

项目结构

说到技术,HTML、CSS 和 JavaScript 将是前端的面包和黄油。像“htmltools”和“ SASS ”这样的库是显而易见的选择,因为我打算手工构建许多这样的组件。这也可以让我轻松地包含 JavaScript 来实现更复杂的浏览器行为。

对于服务器组件,我决定将它们构建在各自的“模块”内的“R6”对象中。如果您不熟悉 R6,它是一种面向对象的编程方法,用于将方法和值封装到类中,然后可以作为单独的对象进行实例化,这意味着每个对象都有自己的方法和状态。这是一种不同于函数式编程的方法,但在其他语言中非常常用。请务必查看马辛杜贝尔关于 R6 课程的有益帖子

项目结构图

有了我想做的东西的想法,是时候实际建造这个东西了。所以我开始查看所需组件的列表:

  • 数据管理器:负责加载和提供数据。因为我希望能够创建许多可能的卡片组合,所以我创建了一个小模板引擎,并使用 google sheet 作为我的数据库。这将允许我随时更改/添加/删除卡或选项,因为数据管理器总是会在新游戏开始时读取最新的数据。如果你对数据是如何保存的感兴趣,你可以在这里查看电子表格。
  • 卡牌管理员:负责生成卡片并展示给玩家。它最终负责卡片的 UI,并根据游戏状态、当前因果值和一点随机性生成新卡,大量使用“样本”来挑选卡片模板、值和强度(卡片强度影响决策对不同指标的影响程度)。
  • 度量管理器:主要负责当前游戏状态的视觉部分。它使用状态管理器值作为反应值来保持用户界面与游戏的当前状态同步。
  • 状态管理器:游戏的核心,主要由反应列表和检查游戏状态变化的支持功能组成。例如,检查游戏结束。
  • 游戏经理:实例化并集合所有其他经理。它负责游戏状态的启动、重置和所有高级别的改变。
  • 地图管理器:管理一张地图,它提供了世界当前状态的一些视觉反馈。这不是最初的计划,也不是游戏所必需的,但我认为如果有一些东西而不仅仅是几个进度条来显示游戏状态,那会是一个不错的选择。

结果呢

几个周末后,我对它感到满意,并决定提交我的作品。竞赛结果还没有出来,所以请为我祈祷吧!

我对发展的速度感到震惊。反应值作为一个管理游戏状态的引擎是惊人的,R6 使得在需要的时候创建和破坏实例变得超级容易。使用电子表格作为数据库也是一个非常有趣的概念,结果比我预期的要好。最终的结果让我可以很容易地修复打字错误和添加新的卡类型。

由于一些自定义的 css 样式,即使是移动设备也能正常工作:

手机版功能出奇的好!

最后的想法:闪亮的游戏,是还是不是?

在这一点上,我们知道在 R Shiny 中构建一个正常运行的视频游戏是可能的。那么… 你是否应该用 Shiny 来打造自己的游戏?说实话,大概不会。有几十种其他的框架和语言肯定更适合这种类型的项目。

然而,对我来说,这个项目展示了在 R Shiny 中实现复杂的 UX 和 UI 元素是多么容易。当然,这不是一个商业就绪的游戏,但作为一个概念证明或快速原型,可以在几天/几周内建立起来,然后迭代,Shiny 再次以一种非常积极的方式给我带来了惊喜。这对 Shiny 作为复杂企业仪表盘的首选解决方案的持续未来是个好兆头。

如果你想研究一下代码或者找到更多关于这个项目的信息,你可以在 Github 仓库中找到一切:https://github.com/pedrocoutinhosilva/shiny.decisions

也可能你只是想玩玩最后的结果!一定要让我知道你已经坚持了几周了!

在这里玩游戏:https://sparktuga.shinyapps.io/ShinyDecisions/

https://sparktuga.shinyapps.io/ShinyDecisions/

有用的参考资料

自助 BI 对每个人都可行吗?

原文:https://towardsdatascience.com/is-self-service-bi-feasible-for-everyone-c9fa7fef4b31?source=collection_archive---------35-----------------------

介绍

商业智能(BI)工具/应用强调它们对复杂模型、大型数据集和复杂用例的解决方案,当然,这些解决方案也适合它们。可能希望在日常工作中使用这些工具的普通用户可能会因为认为只有 IT 专家才能开发这些东西而感到害怕和沮丧。

我不想说这个领域不需要专业知识,是的,一些解决方案需要巨大的努力和经验丰富的团队来实现。我想揭示的是,即使简单的用例也可以用最低/中等的技能来实现,它可以提供很好的内部效果并产生影响。

让我们通过使用从欧洲新乘用车和轻型商用车注册中收集的数据来举例说明这种说法,并生成一组简单但有用且有趣的可视化结果。以下示例将涵盖使用 MS Excel 和 Power BI 对数据的收集、存储、转换和可视化。

我们从哪里开始?

首先,我们必须获得信息(数据)并将其存储在某个地方。通常,数据存储在不同的位置、数据库或文件中,并且经常以不同的格式存储。对于这种情况,我们将把复杂性降到最低。

接下来,我们应该始终牢记 ETL 过程。这个缩写代表提取、转换和加载,可以解释如下:

提取:包括从不同的源中提取数据,并将其转换成适合转换的单一格式(接下来的步骤)。

转换:在此阶段,应用各种规则、函数和/或计算,以便为负载准备数据。这一阶段是数据清理发生的地方,它的目标是为数据的使用提供一个整洁的输出。

Load: 在这个阶段,数据被传输到所需的最终位置,这个位置可以是一个简单的*面文件,也可以是更复杂的数据仓库。根据不同组织的需求和用途,这个过程可能会有很大的不同,而且,由于加载的数据与数据库交互,还会发生许多其他的考虑事项。

完成前面的步骤后,可以设计和构建可视化和报告来传递信息并提供关于数据的见解。

工作时间到了!

数据采集和存储:

对于这个例子,我们有四个不同的数据源;ACEA 乘用车登记(环节)、ACEA 商用车登记(环节)、AEB 销售轿车及轻型商用车(环节)及奇数乘用车及轻型商用车(环节)。

所有检索到的信息都将存储在一个 Excel 文件中,其中每个源都有自己的工作表。

每个来源一张工作表

对于每个源,数据将以下列相同的格式存储;国家、年份、月份(每月一个)和数据源(表明数据来自哪里——Source—)。

从下图中可以看出,每一行代表一个国家一年的观察结果。请注意,在这种情况下,所有信息都被插入到一个表中,并根据数据源进行命名。

ACEA 客车表

在相应的工作表中填写所有数据后,必须将文件保存在可以访问的位置。在这种情况下,它存储在网络位置的共享文件夹中。一旦完成,就为下一步做好了准备。

摘录:

在这个阶段可以使用许多工具。在这种情况下,Power BI 将用于执行 ETL 过程和可视化。由于数据量非常小,并且它不是一个复杂的模型,所以在这里可以很容易地完成这项工作。

要获取数据,只需选择“获取数据”,然后,文件的来源(在这种情况下是 Excel),一旦打开,选择相应的表格,然后单击“加载”。现在,四个不同来源的所有信息都加载进来了。

从 Excel 获取数据

选择文件中的表

作为转换过程之前的最后一步,建议检查是否正确提取了所有表中的数据。这将在查询编辑器中完成,可通过单击“编辑查询”按钮访问该编辑器。

通常 Power BI 能够识别标题(列名)和每个标题包含的数据类型。建议在每个表上检查这一点,因为有时 BI 猜测的功率可能不是我们所期望的。如果是这种情况,应该作进一步的改正。

在这个例子中,所有的列标题和数据类型都根据我们的需要正确地标识出来,每个表都没有错误(国家和数据源列用字符表示,每个月的数量用整数表示)。

变换:

现在是做一些转变的时候了。首先,所有的表将通过追加来组合。只需在查询编辑器中右键单击其中一个表,然后单击“新建查询”、“合并”和“追加查询为新查询”就可以了。

通过选择“三个或更多表格”选项,然后单击“确定”,所有表格都应添加到“要追加的表格”字段。这将创建一个新的表,将这四个表组合在一起,我们可以在其中开始进行更多的转换。

为了使数据结构更适合在 Power BI 中使用,首先我们必须合并每个月的车辆数量。在当前的表格中,每个月对应于其包含数量的列。这里的目标是有一个包含数量的列和另一个规定月份的列。

为了实现这一点,并且再次在查询编辑器中对之前创建的表进行操作,必须选择每个包含月份的列(一月到十二月)。

下一步是在“转换”菜单中选择“仅取消选定列的透视”选项。

这将会创建两个新列,其中一个存储所有月份(属性),另一个存储所有数量(值)。由于此操作,表中的行数将显著增加。

之后,它们可以用一个更有意义的名字重新命名,比如“月”和“量”。

在这个阶段,数据应该是期望的格式。在此之后可以进行其他操作或转换。例如,可以根据国家名称或任何其他特定要求来创建分类的条件列。

负载:

如果前面的步骤发生在另一个实例中(不是 Power BI),那么最终的数据将被加载到最终目标,比如一个带分隔符的*面文件或数据仓库。

因为数据的提取和转换是在与构建报告相同的环境(Power BI)中完成的,所以剩下要做的就是关闭查询编辑器并应用更改。

现在数据已经准备好进入最后阶段。

报告和可视化设计

在这一阶段,必须对想要报告的内容有一个概念,是时候创建数据的视觉效果、图表和其他表示形式了。这部分本身是一个完整的主题,因此,可能的可视化和可能性的想法将被显示,但不包括如何创建它们。

在高层次的细节上,已经创建了一个包含三个条形图、一个折线图和一个地图的控制面板。

这些图像显示的是每年、每季度和每月累积的车辆登记数量。此外,一个线形图显示了几年来每月的数量,一个地图显示了相对市场规模(车辆注册数量)的国家。

数据的一些属性已经包含在过滤器窗格中。这使得对数据进行过滤和切片以获得更多信息成为可能。

接下来,显示了一些通过过滤和分割数据来获取信息和见解的示例:

仅显示 2018 年

这里只过滤了年份,它按季度、月份显示了一年中所有国家/地区的总量,并且是按月份演变的。此外,可以看到地图上当年最大的市场。

仅显示意大利的 2018 年

与上一个例子相同,但是在这个例子中,意大利被过滤为国家。

西欧五大汽车市场概述

从地图上可以看出,西欧最大的市场是德国、法国、意大利、西班牙和英国。这些国家的发展是值得赞赏的。

随着问题和过滤越来越精细,可以在整个可视化中找到越来越多的细节和见解:

确定西班牙新车注册的季节性和趋势

虽然只关注折线图,但可以通过每个月来了解市场的发展。此外,该国车辆登记的季节性也有助于了解这一趋势。

识别土耳其市场的冲击,例如 2019 年

除了最后一个例子,市场的冲击也可以在以下土耳其 2019 年的例子中发现。

可以使用更高级的功能来制定未来的决策,如生成预测(与工具集成)并观察德国市场新车注册的总体趋势

预测

可以使用更高级的功能来制定未来的决策,如生成预测(Power BI 中的集成工具)并观察德国市场新车注册的总体趋势。

通过对德国市场的轻型商用车进行过滤,可以获得更大的粒度。

和前面的例子一样,但是是客车。

如前所述,从许多不同角度分析数据的机会是存在的,根据这些信息做出决策的可能性也增加了。

维护和更新

除了本例的设置之外,剩下要做的就是在文件中的数据可用时更新它。为此,新信息将简单地添加到 Excel 文件中。

如果数据结构及其可用性没有变化,就不需要任何维护。因此,一旦数据被刷新,模型应该能够反映最新的信息。

相反,如果这些方面发生变化,可能需要更新整个流程。

收尾

前面的例子是一个简化的用例,但是,值得注意的是,像这样简单的东西可以提供有见地和有用的结果。

对于每个分析/BI 项目,基础都依赖于数据可用性。正如在第一部分中所演示的,拥有一种结构化的收集和存储数据的方式将会使接下来的步骤更加简单和直接。

有了这个基础,流程的后续部分(ETL)变得更容易管理。在这种情况下,由于其结构化的形式和方便的位置,提取和导入数据很容易。必须特别注意正在提取的数据(即,它是否包含错误、缺失值或被标注在不正确的数据类型下)。

因为数据是“干净的”,所以这个例子的转换部分简单明了。唯一需要处理的事情是合并表,并将数据结构转换成适合需要的格式。最后,在这种情况下,加载就像单击一个按钮一样简单。

一旦所有的可视化都完成了,报告也构建好了,BI 工具的真正潜力就可以被欣赏了。经过一些过滤,交叉过滤和其他选择,可以获得有力和有见地的信息。

现在,总结一下,所有这些都做完了,让我们回到我们的问题上来;自助 BI 对每个人都可行吗?

在我看来,答案是肯定的,但有一个条件。这一过程可能会令人生畏,对于完全不熟悉电子表格和数据可视化的人来说,这将有一个相当长的学习曲线。因此,如果这个人对前面的几点一点都不熟悉,在开始的时候需要额外的努力,但这不是一个限制。

对于那些在过去有电子表格和数据可视化经验的人来说,这根本不应该是一个大挑战。如开头所述,简单的自助 BI 用例可以通过最低/中等技能水*实现。

社交距离有用吗?

原文:https://towardsdatascience.com/is-social-distancing-working-b1c6e9359bde?source=collection_archive---------37-----------------------

使用苹果的移动跟踪数据来衡量社交距离在控制 Covid19 方面的有效性

苹果发布了一份移动数据趋势(www.apple.com/covid19/mobility ),使用苹果地图的数据来显示人们的驾驶、步行或乘坐公共交通行为如何随着时间的推移而变化。这些数据可以用来衡量人们的活动减少或社交距离增加的情况。自 2020 年 1 月 13 日以来,主要城市、地区或国家的人口流动被跟踪并报告为标准化数字。将这一数据与每日报告的 Covid19 病例数(【https://covidtracking.com】T2)结合起来,有助于考察社交距离与控制病毒之间的关系。

总共有 14 个美国城市被跟踪(洛杉矶、旧金山湾区、丹佛、迈阿密、亚特兰大、芝加哥、波士顿、巴尔的摩、底特律、纽约市、费城、达拉斯、休斯顿、西雅图)。这些城市的流动性趋势与 Covid19 阳性病例的每日计数相结合,创建了下图。

垂直虚线是首次发布居家订单的日期。在旧金山湾区,人们的活动在全州范围内的居家订单日期(3/19/20)之前就开始放缓。在其他城市也可以看到类似的行为,包括 4 月份发布居家命令的州。随着各州加大检测力度,确诊病例的数量一直在上升,即使社会距离令已经到位。

旧金山的移动趋势和加利福尼亚的每日 Covid19 病例

芝加哥的移动趋势和伊利诺伊州的每日 Covid19 病例

纽约市的流动趋势和纽约的每日病例

波士顿的移动趋势和马萨诸塞州的每日 Covid19 案例

费城的流动性趋势和宾夕法尼亚州的每日 Covid19 病例

亚特兰大的流动趋势和佐治亚州的每日 Covid19 病例

迈阿密的流动性趋势和佛罗里达州的每日 Covid19 病例

虽然一些州迅速发布了在家禁令,但一些州的反应却很慢。因此,订单的时间是一个很好的变量,可以将数据分成控制/测试组,以检查两组之间的任何可变性。

在组 1 中,选择以下四种状态——CA(3/19),IL (3/23),MA (3/24/),MI (3/24)。不选择 NY,因为它会扭曲整体数据。在第二组中,选择了从 4 月份开始发布居家命令的州——佛罗里达州(4/3)、佐治亚州(4/3)、宾夕法尼亚州(4/1)、德克萨斯州(4/2)。

虽然两组的驾驶行为相似,但在步行和交通方面可以观察到明显的差异。关于交通行为,自 1 月 13 日以来,两组均出现显著下降。然而,组 1 中的州比组 2 中的州在请求公交路线方面表现出更大的下降(4 月份下降了 80%)。

每个州有不同的测试能力和管理。为了限制少数状态对 Covid19 计数每日增加的影响,比较了每日%增加。在三月初,两组都出现了大的峰值。然而,尽管第一组州在三月晚些时候能够控制每日%的增长,但第二组州在整个三月继续出现大幅增长。有趣的是,一旦第 2 组各州从 4 月份开始实施居家订单,Covid19 的每日%增长率开始下降到一个更易于管理的水*。

就像每个人说的那样,社交距离对对抗 Covid19 很重要。希望这能提供一些见解。

软件工程是数据科学的先决条件吗?

原文:https://towardsdatascience.com/is-software-engineering-a-prerequisite-for-data-science-1be744b1195c?source=collection_archive---------39-----------------------

在这里找到答案。

照片由 ThisisEngineering RAEngun splash【1】上拍摄。

目录

  1. 介绍
  2. 软件工程
  3. 数据科学
  4. 摘要
  5. 参考

介绍

虽然数据科学工作描述需要一系列不同的技能,但有一些具体的先决条件可以帮助您成为一名成功的数据科学家。这些技能包括但不限于:沟通,统计,组织,最后,编程。编程可能会非常模糊,例如,一些公司在面试中可能会要求数据科学家用 Python 编写一个常见的熊猫功能,而其他公司可能会要求完全采用带类的软件工程。

由于我在许多不同的公司担任过不同的职位,我遇到过数据科学家和软件工程师,因此我对成为一名成功的数据科学家需要什么有了很好的认识。下面,我将概述软件工程和数据科学,并回答这个问题:“软件工程是数据科学的先决条件吗?”。

软件工程

就像数据科学一样,计算机科学中的这个领域可以包括几种不同的技能。然而,这些角色中的大多数都需要你精通至少一门编程语言,并且了解软件开发的生命周期。软件工程师经常使用的编程和编码语言有[2]:

JavaPythonC#/.NetRuby

其中一个突出的主要语言是 Python。这是因为这种语言也经常被数据科学家使用。

另一组技能是知道如何用这些特定的概念实践面向对象设计(OOD ):

AbstractionEncapsulationInheritancePolymorphism

或许,这些概念在数据科学岗位上的应用并不那么广泛;然而,它们可以提供更好的建模过程,具有高效的自动化和可伸缩性。随着机器学习模型的出现,出现了大量需要不断监控、更改、转换、删除等的数据。在 Python 编程语言中使用这些概念不仅会给你的工程部门留下深刻印象,还会让你更加独立地工作。类似地,当不仅与数据科学家合作,还与软件工程师合作时,构建模型及其部署的过程将更加健壮和高效。

举例

下面的例子展示了如何使用一个类来访问你的机器学习模型的 sklearn 库。也可以通过在管道中引用该类来访问它,该管道将为您的 pandas 数据帧适当地转换您的文本和数字特征。虽然这可以在没有软件工程或 OOD 的情况下完成,但在下面的格式中,它要快得多,更容易,并且可伸缩。下面是示例的代码和要点(相同的代码,不同的视觉效果):

# text and numeric classes that use sklearn base libaries
class TextTransformer(BaseEstimator, TransformerMixin):
    """    Transform text features    """    
    def __init__(self, key):
        self.key = key    
    def fit(self, X, y=None, *parg, **kwarg):        
        return self    
    def transform(self, X):        
        return X[self.key] class NumberTransformer(BaseEstimator, TransformerMixin):    
    """    Transform numeric features    """    
    def __init__(self, key):        
        self.key = key    
    def fit(self, X, y=None):        
        return self    
    def transform(self, X):        
        return X[[self.key]]

GitHub gist [3]上作者的代码。

数据科学

作者截图[4]。

如果你还不知道,我支持作为一名数据科学家学习软件工程。软件工程不仅有助于提高机器学习模型的可扩展性,而且还有助于集成。使用 Python 函数,您可以读入数据、训练您的模型并将其部署到新环境中,以便您的建议或预测将输出到最终用户的最佳位置。一般来说,使用软件工程或者简单地实践 OOD 和 Python 函数的最重要、也是最简单的方法可能是大大减少执行某项任务所需的时间和代码。许多探索性的数据分析和模型构建可能涉及一行又一行的冗余代码,但通过一些简单的功能,数据科学家可以接收数据帧并对其进行操作,以便使用某些行值或获取某些列作为特征。

例子

虽然一些数据科学家更喜欢用 R 编写代码,但我相信 Python 更好,原因有很多(参见下面的链接了解更多信息)。下面是一个使用 Python 对 pandas 数据帧中的文本列执行自然语言处理(NLP)的简单方法的例子。在这段代码中,您可以看到' text_field 中的数据由字符串、数字和特殊字符组成。要从列中删除这些不需要的脏数据,您可以使用逐行执行每个列的任务的技术,但是在本例中,开发了一个清理功能,以便可以从一个位置访问所有使用的清理方法。您还可以通过创建另一个函数来进一步改进这个示例,该函数将应用于循环的中的 dataframe 列列表。此外,您可以添加更多的清理步骤,最终满足清理杂乱文本数据的目标。下面是示例的代码和要点(相同的代码,不同的视觉效果):

data = {'text_field':  ['words word word12341****341234', '2132word word$$%3412', 'word 24234']} df = pd.DataFrame (data, columns = ['text_field']) import re def cleaning_funciton(x):
    x = x.lower()    
    x = re.sub('[^a-zA-Z\s]', '', x)    
    return "".join(x) df['cleaned_text'] = df.apply(lambda x: cleaning_funciton(x.text_field), axis=1)

GitHub gist [5]上作者的代码。

摘要

软件工程是数据科学的先决条件吗?

答案是是的。数据科学家常常会在职业生涯中苦苦挣扎,尤其是大学毕业后,因为他们必须与软件工程师合作,并部署自己的模型。虽然你可以成为一名数据科学家,在小公司专注于统计数据和一次性任务(也同样受人尊敬和常见),但最好潜心学习面向对象设计,这样你才能最终成为最优秀、最成功的数据科学家。通过软件工程,你将能够与其他工程师交流,部署复杂的模型,并将你强大而有用的机器学习模型扩展到越来越多的业务中。

如果你过去主要关注的是数据科学、统计学和小规模的编程,那么提高你的整体编码技能,使之类似于软件工程师,永远都不晚。

我希望你觉得这篇文章既有趣又有用。感谢您的阅读!

参考

[1]照片由Unsplash(2020)上拍摄

[2] Daniel Bortz,Monster 撰稿人,当今就业市场的顶级软件工程师技能,(2020)

[3] M.Przybyla, GitHub 类要诀,(2020)

[4] M.Przybyla,清理功能截图,(2020)

[5] M.Przybyla, GitHub 清洁要点,(2020)

[6] M.Przybyla, Python 比 R. ,(2020)

[## Python 比 r 好。

原因如下。

towardsdatascience.com](/python-is-better-than-r-f7bb963a1c85)

Tableau 对数据科学家有用吗?

原文:https://towardsdatascience.com/is-tableau-useful-for-data-scientists-46d355a14b62?source=collection_archive---------32-----------------------

在这里找到答案!

Unsplash 上由 bruce mars 拍摄的照片。

目录

  1. 介绍
  2. (舞台上由人扮的)静态画面
  3. 什么可以改进
  4. 伟大的
  5. 摘要
  6. 参考

介绍

虽然 Tableau 不一定是你技能的一部分,但它仍然可以在你作为一名数据科学家的日常工作中发挥作用。我在几家公司(商业、金融和技术)工作过,我可以说有些公司完全不使用 Tableau,尤其是在那里工作的数据科学家,而有些公司可能会让他们的数据科学家和机器学习工程师每周与 Tableau 一起工作几天。如果你想利用 Tableau,最终取决于你、你的团队和你的业务。仅仅因为它还没有在你当前的过程中实现,并不意味着它仍然不能在你觉得有必要使用它的时候被添加。因此,我将强调 Tabeau 可以改进的地方,以及它擅长的地方——在数据科学和机器学习方面。Tableau 作为数据分析和可视化工具非常出色,我推荐它。对于数据科学家来说,有利也有弊,我将在下面进行描述。

(舞台上由人扮的)静态画面

Tableau【2】,是一个有用的工具,主要面向业务和数据分析师。一些公司的职位甚至有指定的 Tableau 开发人员,他们只专注于为各自的受众或利益相关者创建报告和仪表板。使用 Tableau,您可以"改变对数据的看法"的一些重要方式如下:

  • 快速分析
  • 易用性
  • 大数据,任何数据
  • 智能仪表板
  • 自动更新
  • 秒内分享

我个人喜欢在快速创建可视化效果时使用 Tableau。我可以使用更好的 Python 包,但有时,利用 Tableau 的 SQL 数据库连接服务,您可以进行查询,并从本质上拖放来描述或可视化您的数据,以便您可以有风格地讲述您的故事。以下是 Tableau 的网页链接:

[## 我们正在改变你看待数据的方式

当谈到用数据的力量提升人们时,只有 Tableau 结合了对人们如何看待和…

www.tableau.com](https://www.tableau.com/trial/tableau-software?utm_campaign_id=2017049&utm_campaign=Prospecting-CORE-ALL-ALL-ALL-ALL&utm_medium=Paid+Search&utm_source=Google+Search&utm_language=EN&utm_country=USCA&kw=tableau&adgroup=CTX-Brand-Priority-Core-E&adused=411023877791&matchtype=e&placement=&gclid=Cj0KCQjwvvj5BRDkARIsAGD9vlJ9suptl9qLjGMdX0tZ-cB_H2mj30KITGckmYrh_nrp06cw8yvhZ-QaAqqHEALw_wcB&gclsrc=aw.ds)

什么可以改进

以下是不适合数据科学家的场景。

请记住,我不是为一般的数据分析师说这些,Tableau 的目的是什么,我是为数据科学家强调这些要点。这是使用 Tableau 时想到的三点——正如您将在后面看到的,积极或积极的方面远远多于可能的改进:

  • 无法与 Jupyter 笔记本整合

作为数据科学家,集成和自动化是关键。您喜欢或者习惯于拥有一个将您的所有过程联合在一起的过程,以便当您执行您的业务问题用例、探索性数据分析、特性工程、模型构建和部署时,您可以很容易地在一个地方或者在一个连接的过程中引用这些步骤。我希望有一种方法来显示 Tableau 中的可视化效果,以便在 Jupyter 笔记本或某种类似的集成中显示。

然而,在 Tableau 中,您可以拥有一个用于直接 SQL 查询和报告生成的实时数据库连接,这是非常棒和有用的。

  • 有时会很慢

现在,这一点可能不会发生在你身上,但有时你会发现自己有几个选项卡或表和仪表板,突然你有这个巨大的 Tableau 工作簿冻结了,有点令人沮丧地继续制作新的仪表板而不删除旧的。

作为一种变通办法,有时我从一个样本数据集开始,制作仪表板作为概念证明,然后将整个数据集应用于最终表单。

  • 对数据科学应用的数量有限制

这一点不一定不好,因为 Tableau 不是数据科学工具。它确实有一些很棒的应用程序,我将在下面讨论,但在未来看到一个单独的数据科学部分会很有趣。

伟大的

下面是对数据科学家来说做得好的画面。**

  • 为探索性数据分析(EDA)很好地可视化数据集

在数据科学过程中,EDA 经常被忽视,它可以成就或破坏您的模型。在构建模型之前快速可视化数据的能力(无需编写任何 Python 代码)是非常有益的。为您的数据科学或机器学习模型指标显示图表、图形或其他形式的可视化也很有用(如每日*均准确率)。

一个巧妙的功能是,如果图表数据的值低于或高于某个阈值,您可以设置警报——假设您希望收到一封电子邮件,提醒您您的模型几个月来首次低于 80%的准确率,然后可以在以前被忽略的地方调查该警报。

  • 总的来说,是 Matplotlib 和 Seaborn Python 库的升级

有时需要做大量的工作,或者大量的 Python 代码(我不使用 R,所以我就不说了),来创建一个有些不吸引人的图表。有了 Tableau,你可以在几秒钟之内不用编码就能做出漂亮的可视化效果。

  • 可视化数据科学模型的成功指标摘要井

我在上面提到了这一点,但我想强调的是,您可以使用 Tableau 轻松地可视化您的模型指标或输出——假设您的结果、置信度得分、建议等都存储在 SQL 数据库中。或许,您可以从您的模型中输出所有置信度较低的分类,以便您公司的主题专家可以手动审查它们,从而进一步提高准确性。

  • 与 SQL 查询很好地集成

本质上,在 SQL 中能做的,在 Tableau 中也能做。您可以粘贴查询并引用它们来制作 Tableau 中的任何内容,例如,如果您使用的数据不一定是实时的,您也可以使用静态 Excel/CSV 文件。

  • 可以做聚类!

带 Tableau 的 k-means 算法!

我把最好的留到了最后,这个画面的好处太棒了。不需要任何代码就可以执行一个聚类模型【3】!是的,因为您不是自己构建的,所以它不会是可调的,

…但是,利用 Tableau 的这一强大功能,您可以在不到一天的时间内创建一个数据科学模型。

Tableau 中聚类的一个很好的用例是一种快速简单的方法,可以找到客户群之间的相似之处,这样你就可以针对他们进行不同的营销——想想营销活动。

**[## 在数据中查找聚类

聚类分析将视图中的标记划分为多个聚类,每个聚类中的标记更类似于…

help.tableau.com](https://help.tableau.com/current/pro/desktop/en-us/clustering.htm)**

摘要

凯文·Ku 在Unsplash【4】上拍摄的照片。

最终,Tableau 不是为数据科学家设计的,所以它对我们的用处令人印象深刻。我所讨论的优点比缺点多,而且很有可能更多的优点和一些创造性。作为一个视觉学习者和展示者,我真的很喜欢使用 Tableau。对我来说,这是脱离 Python 代码的一个很好的方式,我很欣赏可视化可以像从数据中拖放列一样简单。

我推荐使用 Tableau,是的,它对数据科学家很有用。

感谢您阅读我的文章。希望你觉得有用。如果你喜欢它,请让我知道,如果你有任何建议或意见,请随时在下面提交。谢谢大家!

参考

[1]照片由布鲁斯·马尔斯Unsplash(2018)上拍摄

[2] TABLEAU 软件有限责任公司,(2003 年至 2020 年)

[3]TABLEAU SOFTWARE LLC,在数据中查找聚类,(2003–2020)

[4]凯文·Ku 在 Unsplash 上拍摄的照片,(2017)

新冠肺炎数据仪表板做得好吗?还是实际上比没有更糟?

原文:https://towardsdatascience.com/is-that-covid-19-data-dashboard-doing-good-or-is-it-actually-worse-than-nothing-de43da1c98be?source=collection_archive---------42-----------------------

数据可视化如何在疫情中误导或误导公众,以及为什么领域专业知识很重要。#负责任地

马库斯·斯皮斯克在 Unsplash 上的照片

这几天世界上的一切似乎都颠倒了。

我们过去习以为常的简单日常活动——出去吃顿饭、喝杯咖啡或看望朋友和家人——即使没有完全停止,也已经发生了巨大的变化。

我们仍然可以进行的极少数活动,如购物、购买必需品,已经变成了一场游戏,外面的世界是(看不见的)熔岩。

有鉴于此,当人们被困在家里或离家很*时,看到他们的焦虑和厌倦感逐渐增加(包括我自己)也就不足为奇了。对一些人来说,这意味着用可笑的拼图游戏来惩罚自己,或者在动物穿越天堂寻求安慰。

对于许多美国统计和数据爱好者来说,他们一直在关注新冠肺炎的数据仪表板,这些仪表板基于来自《纽约时报》或欧盟的数据集。

说实话,我不记得在一个主题上见过像新冠肺炎那样多的数据面板。虽然它们中的许多信息非常丰富,但我认为值得考虑我们的观想向读者传递了什么信息。特别是在一个正在进行的疫情,人们的行动会极大地影响当地和全球范围的结果。

首先,让我们来看看一些可能的意外或无意的结果。

意想不到的后果

正如《魔鬼经济学》的作者所说,意想不到的后果无处不在——数据可视化也不例外。在某些情况下,即使是最善意的准确数据呈现也可能导致误解,进而导致糟糕的决策。这里有一个。

按年龄分列的死亡率

从一开始,像这样的图表就成了新闻,表明新冠肺炎老年人的死亡率比年轻人高得多。

(明确地说,我认为数据中的我们的世界是惊人的——我只是指一些人可能会如何解读这些数据。)

按年龄划分的病死率— 数据中的世界

另一方面,看看下面的图表。根据美国的早期数据,就绝对数字而言,20-44 岁的人比 75-85 岁的人住院的多!

来源:疾病预防控制中心

与上面显示死亡率的图表相比,你会从中得出一个非常不同的结论。

哪个更准确?当然,他们都是对的。它们只是显示了疾病及其影响的不同方面。我确信大多数读者能够很容易地将这两者调和起来。

但是对于一个不经意的读者来说,他们会怎么看呢?对一些人来说,看到这样或那样的图表可能会导致关于不同人口统计学风险的大相径庭的结论。

在疫情进展的早期,从这种类型的数据中得出的简单理解是,年轻人没有太大的病毒风险。

我们还看到了一系列随后的新闻,关于年轻人无视封锁和社交距离的命令,去参加聚会,涌向海滩。他们有关系吗?当然,这很难说。(两种方式都没有数据!)但不难想象这样的图表会产生影响。

更具体地说,上面的例子是一个简单的图表可以用相同的数据显示的消息传递的清晰缩影。这是另一个例子,简单地展示了在讨论死亡事故时语言的力量,当前死亡事故与预计死亡事故。

死亡总数

我怀疑我们许多人都记得今年 1 月、2 月甚至 3 月的声音——认为新冠肺炎死亡总人数仍然只有几十、几百、几千人,而且这只是流感季节或甚至每天道路死亡人数的一小部分。

撇开对人类生命难以置信的冷酷不谈,这种说法没有抓住警钟的要点。严肃对待新型冠状病毒是基于它可能造成的潜在破坏,而不仅仅是当时不小的损失。

但是,这样的标题可能对事情没有帮助:

天空新闻头条(文章)

这篇特别的文章没有提供任何背景——为什么这种病毒如此可怕,它的传染性如何,以及如果它进入世界各地的社区会有什么样的预测。当然,如果读者一直关注新闻,他们可能会听说所有这些,但不是每个人都有时间这样做,或者倾向于一篇接一篇地阅读文章。

另一方面,上一篇文章三天前发表的下一篇文章传递了一个完全不同的信息。

来自《新科学家》的预测,发表于同一时间(文章)

这篇文章的主要观点是新冠肺炎可以杀死数千万人!再说一次,即使在同一时间,用同样的基本事实,仅仅通过提出一个预测而不是目前的数字,就会得出一个非常不同的基调。

现在,让我们来看看,对于相应的不同解释,同一个数据集是如何以非常不同的方式可视化的。

画什么,怎么画?

即使不考虑误解的风险,呈现与快速传播、高繁殖数的传染病相关的数据也不是一件容易的事情。

就拿这两张图表来说吧,取自我们的世界数据。第一张图显示了受此影响最严重的国家的总死亡人数。

。新冠肺炎确诊死亡总数(来源: OurWorldinData

在这张图表中,美国的总数和斜率似乎非常惊人,而中国由于其最初的爆发而出现的早期数字在所有曲线中非常突出。

与此同时,下一张图展示了完全相同的数据,但每个国家每百万人的标准化数据。

每百万人确诊的新冠肺炎死亡总数(来源: OurWorldinData

这描绘了一幅截然不同的画面。就人均而言,中国的数据甚至从未超出 y 轴太多,美国的数据似乎也不像之前的数据那样令人担忧,西班牙和意大利的数据突然看起来是最差的。

如果你想知道这有什么大惊小怪的,为什么这个世界基本上已经关闭了,后一张图会对他们说什么?每个图表暗示了哪个国家在这方面做得最好/最差?

因此,有人可能会问——什么更合适?

鉴于新冠肺炎是一种传染病,因此它在一个特定国家内的分布并不均匀,那么总体人口是合适的分母吗?总数是更好的衡量标准吗?它应该被看作是震中数量的函数吗?或者考虑到它的传染性,也许它应该基于人口密度。

最重要的是,组织、政府甚至地方层面的决策者将如何解读图表并据此采取行动?

没有领域专业知识,像我这样的人就无法判断这些事实。此外,我甚至不知道如何开始解释这些数字,或者像泰勒和桑斯坦可能会说的那样,什么可能导致最有利的“T0”推动“T1”。

最后,让我们看看一些映射的数据:

甚至绘制数据也不是一项简单的任务。让我们看看美国。这张图片来自《纽约时报》优秀的新冠肺炎追踪页面

来源:纽约时报的新冠肺炎追踪页面美国

上图显示了截至 2020 年 4 月 13 日的病例总数,以县为单位进行汇总和呈现。这描绘了一幅令人担忧的画面,你很难在美国找到许多没有爆发疫情的地方。

但是,下一张图片展示了一个对比鲜明的快照。

来源:纽约时报的新冠肺炎追踪页面

这张图显示了新病例的增长率。对我来说,最突出的是新冠肺炎的增长在西海岸急剧放缓,而在东海岸和南部却保持快速增长。

考虑到像加利福尼亚这样的州迄今为止相对较大的感染人数,这个数字对许多人来说是相当令人吃惊的。同样的数据集,截然不同的结果和收获。

例如,有人在看这张地图时,可能会试着找出为什么会这样,以及如何在东海岸复制这个结果。而从第一个图中可能没有这样的指示。

在选择、过滤、处理和呈现数据的过程中,我们做出了无数的选择——这些选择极大地影响了输出和读者的印象

我在这里想表达的观点是很明显的。我们这些呈现数据或创造数据可视化的人不能假装他们的解释是不可知的,不知道创造可视化的工作。

是的,数据仍然是数据,但是在选择、过滤、操作和呈现数据的过程中,我们做出了无数的选择。反过来,这些选择极大地影响了作品的输出和读者的印象。

数据可视化仅仅是一个服务于一个目的的工具。它不是为自身而存在的东西。更具体地说,观想需要符合潜在的意图——也就是,一个人试图传达的信息,并且有效地做到这一点。作者需要考虑这个信息是什么,它的目的是什么。

在当前的气候下,我们正在经历的疫情已经导致数百万人失业、流离失所、失去医院护理,并可能导致数十万人丧生,因此,风险从未如此之大。

正如阿曼达·马库雷克在《T2》中完美地说的那样,让我们负责任。

注意安全,各位。

如果你喜欢这个,比如说👋/关注推特,或点击此处获取更新。此外,ICYMI,我在这里写了不同国家的医疗保健能力:

* [## 各个国家的医疗保健能力是什么样的?

鉴于冠状病毒(新冠肺炎),按国家可视化和比较医疗保健数据和指标。

towardsdatascience.com](/what-do-various-countries-healthcare-capacities-look-like-1581896a0601)*

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

新加坡的新冠肺炎曲线变*了吗?

原文:https://towardsdatascience.com/is-the-covid-19-curve-flattening-in-singapore-857219f72f1?source=collection_archive---------58-----------------------

格伦·卡丽在 Unsplash 拍摄的照片

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

“断路器”——换句话说,锁定——已经过去 2 个月了,今天是它的结束!(有点)😃

GIPHY Studios Originals 制作的快乐无比激动 GIF,2016 年 11 月 18 日(来源)

然而,在这两个月里,最让我困惑的是,我们在新闻上看到的所有新冠肺炎图表为什么没有提到一张标明病毒检测率的图表。

这使得新加坡人很难很好地衡量我们和其他国家的实际情况。

一个国家检测得越多,发现的病例就越多,这是有道理的,因此,从视觉上扭曲了国家在“拉*曲线”方面的实际表现。

这些曲线真的变*了,还是这些国家测试得不够?

在时间轴上绘制每日价格的确讲述了一个故事,但那只是故事的一部分。

它们是描述性的吗?

肯定是的!

它们是否有助于告诉我们曲线是否接**坦?

不完全是…

所以对我来说更大的问题是…

新加坡真的做的怎么样?

曲线变*了吗?我们怎样才能最好地想象这一点?我们如何添加关于测试率的信息?

为了回答所有这些迫切的问题,我谷歌了其他人是如何可视化他们的 COVD-19 数据的。

还有…

我找到了金子。

这个视频值得你花每一分钟的时间。

  1. 这些图像非常有用,可以告诉我们曲线是否会变*。
  2. 然而,他们仍然没有参考测试率。(让我们稍后将这些信息绘制出来,以获得完整的图片)

看过这个视频后,我决定获取最新的新冠肺炎数据,并尝试按照这个视频中的分析,并加入我们的测试率数据,以更好地了解新加坡的实际情况。

我们开始吧!

获取数据

最初,我想靠自己搜集数据,但意识到已经有成千上万的人在这么做了。

为什么要重新发明轮子?😉

数据集可以在这个公共存储库中找到

[## owid/新冠肺炎数据

关于新冠肺炎(冠状病毒)确诊病例、死亡和检测的数据所有国家由我们的世界在数据中每日更新…

github.com](https://github.com/owid/covid-19-data)

多亏了 ourworldindata.org,我可以很快获得数据进行分析。

新冠肺炎可视化

对于每个可视化,我都标注了断路器周期的开始、延长和结束时间。

另外,请注意日期是隐藏变量。

为了不那么拥挤,我只用韩国和日本作为参考,看看新加坡的情况。

这里的目标是绘制发现新病例的,以直观地表示曲线是否即将变*。

每日新增病例的新增病例总数

新冠肺炎-每日新增病例的新增病例总数

在此图中,您可以看到新加坡、韩国和日本的总病例数与原始新病例数的对比。

使用原始值的问题在于很难看出是否有“变*”效应发生。

因此,观察这种效应的一种方法是用轴的对数变换来放大变化率,如下所示:

新冠肺炎-按每日新病例统计的新病例总数(日志)

注意韩国和日本的曲线是如何变*的?

不幸的是,对新加坡来说,我们的曲线还没有变*,或者至少开始变*了。

现在,让我们通过*均每周的案例来*滑上面的图,以获得更好的视觉效果。

按每周*均新增病例统计的新增病例总数

新冠肺炎-按每周新增病例统计的新增病例总数

新冠肺炎-按每周新病例列出的新病例总数(日志)

请注意这里的一些有趣的事情,用周*均值而不是每日案例来绘图显示了更好的视觉效果和更容易检测到第二波的能力。

韩国显然正在进入第二波疫情。

日本的曲线肯定变*了。

新加坡的曲线开始变*。(我希望)

值得注意的是,到目前为止我展示的所有这些图表都没有考虑到测试率。

我没有为测试率绘制第二个 y 轴,而是觉得最好将它们分开,不要挤在上面的视图中。

按每千例总测试数列出的总病例数(每周)

我在处理这些数据时遇到的一个问题是不同的国家如何报告他们的测试率。

对于新加坡,我们每周报道一次。

一些国家,如韩国或日本,他们每天都有报道。

有些国家甚至根本不报告。

为了公*比较,由于新加坡每周报告,我对韩国和日本进行了*均每周测试计数。

此外,我直接在图上标注了最后的“每千测试总数”数字。

新冠肺炎-按每千人总检测数列出的总病例数(每周)

从图中可以立即看出,新加坡对的测试非常多

比较每千人的测试总数,新加坡每千人测试的比日本多* 18 倍,新加坡每千人测试的 比南韩多 2 倍

所以,是的,新加坡曲线可能看起来还没有变*,病例似乎每天都在增加,但这是因为我们的测试非常严格。

结尾注释

我意识到,如果测试率如此不同,很难真正与其他国家进行比较。

我想尝试找到一种方法来规范测试率的影响,但很快意识到这不是一个好主意。

存在固有的采样偏差。

新加坡知道应该在哪些集群上增加测试。

韩国、日本或其他国家就不一样了。

这也意味着,与没有进行目标检测的其他国家相比,新加坡的数字可能会高得多。

也就是说,我们检测出阳性病例的几率比其他进行随机检测的国家要高。

我想,这里的要点是:

让我们不要喋喋不休地谈论每天病例的绝对数字。与其他国家相比,新加坡的测试非常严格,所以不要比较。

相反,我们应该感谢新加坡正在进行严格的测试!

如果您想访问我的代码进行自己的分析,请随意克隆我的存储库:

* [## 廷坦-吉图布/新冠肺炎-新加波

扩展可视化以检查新加坡-廷坦-吉图布/新冠肺炎-新加坡的新冠肺炎曲线是否变*

github.com](https://github.com/timtan-github/COVID-19-Singapore)

无论如何,我希望这篇文章是有见地的!😃

就这样,我们在邮局见!

再见!

LinkedIn 简介:蒂莫西·谭*

数据科学训练营适合你吗?

原文:https://towardsdatascience.com/is-the-data-science-bootcamp-right-for-you-65ff341edd39?source=collection_archive---------33-----------------------

分享一个可能帮助你做决定的个人故事

图片:Pixabay

这些天,很多人都在探索加入编码训练营的选择,如果他们想进入技术领域的话。越来越多的人意识到“书呆子”和“极客”是一件好事,与技术打交道很酷,知道如何编码是一种新的素养。然而,并不是每个人都准备好回到学校再学习四到五到七年来获得传统学位。进入训练营。在短短几个月内,他们承诺给你所有必要的技能和知识,让你成为一名开发人员,或数据科学家,或 UX 设计师,或网络安全专家。有什么条件,对吧?

我想分享我的个人故事,希望能帮助你做决定。

背景

和许多想加入训练营的人一样,我是一个职业改变者。我的第一个学位是新闻学(莫斯科国立大学的文学学士和文学硕士),当我住在莫斯科的时候,我已经从事科学新闻工作好几年了。我的特殊技能是阅读科学论文,理解研究人员做了什么,并将其翻译成“人类”语言。写了一段时间关于英雄的文章后,我想成为一名英雄。

我搬到了纽约,我记得每天花几个小时学习数学是我的爱好。我真的对它充满热情,但甚至不希望我的爱好会改变我的未来。直到我决定试试运气,申请哥伦比亚大学。我知道,这个故事应该是关于训练营的,而不是传统的教育,但是请原谅我。

拿到应用数学学位毕业后,我甚至不知道该拿它怎么办。我想做研究和分析,但有一个大问题:我没有任何适销对路的技能。老实说,谁会付钱给一个手解微分方程的女人?

就在那时,我的朋友告诉我如何编写训练营的代码。我知道我不想学习软件工程,我想学习数学上更重一点的东西。所以我选了数据科学。

应用进程

纽约市有几个教授数据科学的训练营。有些只接受拥有技术学科博士学位的申请人,有些更有竞争力,有些则不那么有竞争力,但根据我的经验,所有人的申请过程都是相似的。首先,预订一次校园游是个好主意,可以和学生们呼吸同样的空气。观察他们的工作,与教师互动,感受氛围,尽可能多地提问。毕竟,你还需要了解一旦你上班,你的日常通勤会是什么样的。

接下来,你需要填写一张表格,在表格中你可以介绍你自己、你的背景以及你的编码经验。是的,你确实需要一些编码经验,或者至少是学习如何编码的强烈愿望。我建议从免费或非常实惠的课程开始,比如 youtube 教程或 Codecademy。如果你和我一样,对数据科学感兴趣,你需要了解 Python 和 SQL 的基础知识。

之后,您需要完成准备工作的第一部分,在您申请后会发送给您。会有一些编程,一些线性代数,一些微积分。你猜对了,数学部分对我来说很简单,但是我保证,只要有热情和决心,没有什么是学不到的。接下来是面试。

将有两次面试——文化和技术。文化面试是你展示你感兴趣、分享你的故事、提出问题、展示决心和渴望学习的机会。这一点很重要:训练营之所以被称为训练营是有原因的,你需要自己学习和做大量的工作,而不需要别人向你灌输技能。技术面试是有压力的部分(至少对我来说是这样)。对于数据科学项目,将有两个部分:编程和数学。你将被要求与面试官分享你的屏幕,并完成一些相当简单的挑战(如果你诚实地做了准备工作,它们会很简单)。这里重要的一点是不要惊慌:他们不是想骗你,不要过度思考问题。

如果你通过了两次面试,你就被录取了。如果没有,他们会要求你提高技能,并在三到四个月后再试一次。一旦你加入,你需要完成准备工作的第二部分,这将为第一天做好准备。将会有更多的编码,学习如何使用命令行,以及其他有趣和令人兴奋的东西。

课程结构

我学习数据科学的训练营提供 15 周的全日制课程。这是什么意思?有 12 周的学习和最后 3 周的工作在你最重要的期末项目上。这 12 周大致分为 7 个模块,每个模块涵盖一个特定的数据科学主题:Python 编程、SQL 编程、统计、回归、分类、自然语言处理、时间序列分析、深度学习等等。

最初几周大多是入门,所以集中注意力很重要。将会有讲座——做笔记和提问。在所谓的实验室里会有单独工作,也会有结对编程。你应该学会如何独立工作,以及如何和一个伙伴一起工作。

从 Mod 4 开始,你的日常活动将分为两部分:讲座周和项目周。在讲座周期间,你将向老师学习,并和一个伙伴一起做日常的编码挑战。项目周是你研究自己选择的主题,但是使用你刚才提到的技能和技术:你可以为你的分类项目对口袋妖怪进行分类,为你的回归项目预测葡萄酒的质量,为你的自然语言处理分析纽约时报的文章——任何你想要的东西。但是请记住,这些项目以后会出现在你的简历上,所以不要选择太狂野的东西。

训练营学生的一天

如果你选择了全日制的面对面项目,你应该在上午 9 点到下午 6 点之间呆在校园里。这就像你新的全职工作。我们会点名,所以不要养成迟到或早退的习惯:如果你在校园里的时间少于 95%,你就不会毕业。

通常我会在早上 8:45-8:50 来到校园,喝点咖啡,为一天做好准备。几乎每天早上 9 点整都会有编码挑战。我们的教练会让我们两人一组,然后把我们送到教室。他们还会向我们发送一个编码挑战(通常来自黑客排名Leetcode ),我们将有 15-20 分钟的时间来解决这个问题。第一对将解决方案发送到松弛渠道的人将向班上的其他人解释。不求成绩,只求练习。

接下来,我们回到自己的座位上,各自工作。你可以做实验,练习新技能,看教程,研究新课题。或者,如果这是一个项目周,你应该做你的项目。教练和指导员几乎总是在那里。他们是来帮忙的。你可以随时用你的数据科学相关问题向他们请教。

下午你有一个小时的时间去吃午饭,所以你可以选择是真的出去还是只是买些东西带走,然后回到校园,因为你对你正在做的事情太兴奋了,不介意在桌子上吃东西。

下午会有讲座,通常每天一到两次。这是你获得尽可能多的知识的机会。练习你的技能是非常重要的,但是这些讲座是你学习基础知识的机会,当你输入两行代码时,在引擎盖下发生了什么。

讲座结束后,你将有几个小时继续你的个人工作,直到下午 6 点回家。有时你会走得更晚,但是没有人会强迫你在 6 点以后留下来。

你不需要在空闲时间在家工作,或者在周末加班。照顾好自己很重要,你的教练和指导员都知道。但至少读一些书:媒体上的新出版物可能是你下一个项目的灵感。

作为一名全日制训练营的学生,最好的部分是人。你认识的这些了不起的人。会有导师来讲课——这些家伙有真正的专业经验,你真的应该注意他们说的话。有教练,他们很乐意帮助和回答你的任何问题(他们有时也会讲课)。有比你先开始的同学,你可以学习他们的经验,有比你后开始的同学,你可以和他们分享你的经验。来自其他项目的学生,比如软件工程师和 UX 设计师,最后,来自你们这一届的学生。这些是你最好的朋友和家人。你将和他们中的大部分人一起完成上午的编码挑战,和他们中的一些人一起花整整一周的时间完成一个项目,然后一起向全班展示。

挑战

几乎每一个我亲自交谈过的学生和以前的学生都会把这个项目描述成过山车。有些时候,你会对自己刚刚学到的东西或做的事情感到非常惊讶,有些时候,你会感到非常沮丧,什么都不懂,未来看起来毫无希望。有时候,这些时刻可以是连续的。重要的是要明白,即使是最优秀的学生也无法理解其中的一些主题,但你需要努力提问,与导师交谈,做一些研究。你最终会明白的。

有时候我似乎做了力所不及的事情。我记得当时很恐慌,想出了 B 计划,烦了老师和其他学生,试图自己解决问题。但是回过头来看,我会说我做得很好。我完成了我计划的每一个项目(当然,不是没有帮助)。

那么它适合你吗?

如果您:

  • 你绝对相信编程应该成为你工作和生活的一大部分
  • 不害怕数学。也许有点害怕,但是你再也不会说“我讨厌数学”这种话了
  • 准备努力工作
  • 需要实用的、有市场价值的技能
  • 尝试了所有的免费项目和课程,需要一个更有条理的项目和课程
  • 正在寻找技术方面的联系,并愿意结交新朋友

它不适合您,如果:

  • 你只是随便逛逛,问自己“为什么不参加训练营?”。相信我,你会失去你的金钱、时间和一点点动力
  • 你完全不知道数据科学是什么,你只是听说它是“本世纪最性感的职业”,并决定尝试一下
  • 你期望被“填鸭式”地灌输信息和技能
  • 你不是一个社会动物。不一定是 100%纯种的外向者,但你需要能自如地与人合作、提问、在全班面前展示等等。
  • 训练营的广告中唯一能告诉你的是工作安置率。训练营确实能与优秀的职业教练和雇主合作团队合作,但没有人会在你毕业后的第一天就给你“安排”一份工作。见鬼,毕业三个月了,我自己还在找工作。他们的目标是用技能、知识和资源来武装你,让你打入这个领域。剩下的就看你的了。

希望我的故事能帮助你做决定。如果你有任何问题,我很乐意帮忙。在 LinkedIn 上联系我,随时给我拍消息。

网络安全的未来是否掌握在人工智能(AI)手中?— 1

原文:https://towardsdatascience.com/is-the-future-of-cyber-security-in-the-hands-of-artificial-intelligence-ai-1-2b4bd8384329?source=collection_archive---------33-----------------------

事实上,*年来机器学习已经取得了很大的进步,从自主工具到虚拟助手,从聊天机器人到人脸/物体识别。网络安全呢?

中国哲学阴阳代表了看似相反的两极如何互补并达到和谐。

在网络安全中,这种古老的哲学完美地代表了有监督和无监督机器学习之间的关系。例如,受监控的机器学习过程可以用于检测,而无监督的机器学习使用聚类。在网络安全和数据安全研发的情况下,受监控的机器学习通常以机器学习算法的形式实现。

描述人工智能(AI)并不容易。它没有明确的定义。现有的大多数定义都试图将 AI 表达为模仿人类智能和行为并智能行动的计算机进程。但是这种情况带来了更多的问题比如什么是智能?人们总是表现得聪明而有逻辑吗?这是人工智能的理想成果吗?或者说计算机能比人类表现得更好吗?将人工智能基于理性行为的方法的定义是指计算机做难以做的事情。然而,在本文中,采用了一种实用主义的方法来简化问题,并将人工智能定义为负责为人类难以找到解决方案的复杂问题提供基于计算机的解决方案的科学领域。

人工智能技术前景

人工智能在网络安全中的应用相对较新。尽管一些网络安全专家认为,网络安全的答案是机器学习,以检测复杂的违规行为,并且只有在基于人工智能的解决方案的帮助下确保 IT 环境的安全,网络安全才能继续取得成功。其他人认为,尽管机器学习非常擅长寻找相似之处,但它在检测异常方面不够好,因此不适合网络安全。

除了这些讨论,事实是,*年来机器学习已经取得了很大的进步,从自主工具到虚拟助手,从聊天机器人到人脸/物体识别。随着我们迈向网络安全更加融入我们日常生活的未来,重要的是要了解基于机器和深度学习的不同方法,以便更好地保护网络和数据安全,抵御日益复杂和高级的攻击。

正如你可能已经知道的,有四种类型的机器学习算法来训练机器神经网络:监督学习,非监督学习,半监督学习(也称为主动学习),强化学习。有监督的学习是从训练数据集进行学习,而无监督的机器从检测威胁的能力有限的数据本身进行学习,因为它只寻找以前看到和标记的细节,而无监督的学习不断扫描网络并发现异常。然而,无监督学习不需要标记的训练数据,更适合检测可疑活动,包括检测以前从未观察到的攻击。

监督学习是从训练数据集中学习。受监督的机器从数据本身学习,这仅受限于它在搜索它之前看到并标记的细节时检测威胁的能力。对于无人值守学习,不需要标记的训练数据,更适合检测可疑活动,包括检测以前从未观察到的攻击。无监督学习不断扫描网络,发现异常。

机器学习算法

机器学习已经被用来减少攻击检测和预防工具作为网络安全系统的一部分可以处理的负载。类似于真实人类决策机制的人工智能算法试图对决策机制进行建模。

已经有许多尝试来覆盖无人值守的机器学习安全解决方案,导致了针对各种安全问题的大量未经测试的解决方案。这些早期尝试中的许多都难以生成足够的数据来有效检测复杂的违规行为,如身份欺诈和高级网络攻击。

相比之下,无监督机器学习是关于寻找和描述数据中的隐藏结构。这个问题与定义距离函数的问题有关,因为大多数(如果不是全部的话)聚类算法都是基于数字和非分类数据的,因此我们听到的聚类算法和分类一样多。

在网络安全的背景下,人工智能试图通过权衡表明对系统构成威胁的行为模式来保护系统。从这个角度来看,机器学习就是学习导致恶意行为的模式的过程。

在信息安全领域,人工智能解决方案通常以分析师为导向,以无监督的机器学习为重点。使用无监督的机器学习来检测罕见或异常的模式可以增加对新攻击的检测。但是,它也可能触发更多的误报和警告。这需要大量的分析工作来调查这些假阳性的准确性。这种错误警报会导致警报疲劳和不安全,随着时间的推移,会导致其返回到以分析为中心的解决方案,并由此产生弱点。信息安全行业面临的三大挑战,每个都可以通过机器学习解决方案来解决,现已确定如下[2]:

  • 缺少标记数据:许多组织缺乏使用标记示例和以前攻击的监督学习模型的能力。
  • 不断发展的攻击:即使受控学习模型是可能的,攻击者也可以改变他们的行为并覆盖它们。
  • 研究或调查的时间和预算有限:向分析师申请调查攻击既费钱又费时。

然而,由于该行业仍在将该技术作为概念验证进行试验,因此在安全解决方案是机器学习的情况下,信任的想法是理想的。它可以帮助改善打击网络犯罪的斗争,而人工智能可以通过自动化模式识别过程来推动人类的努力。机器学习系统根据类别报告有用的数据,而分析师们公开谈论机器学习如何成为安全的黑盒解决方案,而 CISOs 们并不太确定引擎盖下是什么。

今天,人工智能还没有准备好取代人类,但通过自动化模式识别过程,它可以增强人类的努力。这里有一个无法否认的真理,因为机器学习在网络防御中有非常不同的用途。

考虑到所有的使用领域,可以分两类评价 AI 在网络空间的使用情况;人工智能在网络防御中的应用以及人工智能在网络进攻中的应用。

在第二部分,我们将讨论人工智能在网络防御中的应用…

来源

[1] K.R. Chowdhary,《人工智能基础》,施普林格印度公司,2020 年。

[2] K. Veeramachaneni,I. Arnaldo,a .-Infante,V. Korrapati,C. Bassias,K. Li,《:训练一台大数据机器进行防御》,IEEE 大数据安全国际会议,纽约市,2016 年。

网络安全的未来是否掌握在人工智能(AI)手中?— 2

原文:https://towardsdatascience.com/is-the-future-of-cyber-security-in-the-hands-of-artificial-intelligence-ai-2-4befa4aabd12?source=collection_archive---------52-----------------------

事实上,*年来机器学习已经取得了很大的进步,从自主工具到虚拟助手,从聊天机器人到人脸/物体识别。网络安全呢?

利用人工智能进行网络防御

传统的固定算法(如决策层的硬连线逻辑)无法有效应对动态变化的网络攻击。因此,需要更多创新的方法,例如使用提供灵活性和学习能力的人工智能方法和实践,特别是在网络防御方面。

图片来自 Pixabayxresch

考虑到网络防御,现有的人工智能方法和架构可以列举如下;

A. 神经网络:神经网络历史悠久,始于 1957 年弗兰克·罗森布拉特(Frank Rosenblatt)发现“感知机”(perceptron)。在机器学习中,感知器是一种为二进制分类器(决定由向量数字表示的输入是否属于特定类别的函数)的监督学习而开发的算法。这些神经网络中最受欢迎的元素之一是人工神经元[3,4]。少量的感知机一起工作可以学习和解决问题。但是神经网络可以由大量的人工神经元组成。由大量人工神经元组成的神经网络可以提供大规模并行学习和决策功能。这些网络最突出的特点是它们的运行速度。它们非常适合于模式识别、学习、分类和对攻击的响应。它们可以应用于硬件和软件[5]。

神经网络也适用于入侵检测和预防[6,7,8,9]。科学研究显示了使用这些网络进行 DoS 检测[10]、计算机蠕虫检测[11]、垃圾邮件检测[12]、僵尸检测[13]、恶意软件分类[14]和数字取证研究[15]是多么有效。

神经网络在网络防御中受欢迎的一个原因是,如果它们可以在硬件中实现并在图形处理器中使用,它们的速度会很高。第三代神经网络——更真实地模拟生物神经元的脉冲神经网络的应用是神经网络技术的新发展。FPGA(现场可编程门阵列)提供的系统允许神经网络快速发展并适应不断变化的威胁,为网络防御做出了重大贡献[16]。

神经网络

B. 专家系统:专家系统是使用最多的人工智能工具。专家系统是在一些应用程序的活动领域中使用的软件,用于寻找用户或另一个软件提出的问题的答案。它可以直接用于支持医疗诊断、金融或网络空间等领域的决策。有各种各样的专家系统来解决问题,从小型技术诊断系统到复杂的、非常大的和复杂的混合系统。从概念上讲,专家系统包括一个关于特定应用领域的专家知识数据库。空知识库和提取引擎统称为专家系统外壳。要被使用,它必须充满信息。专家系统外壳应该能够由软件支持,以向知识库添加信息,并且对于用户交互和可以在混合专家系统中使用的其他程序是可扩展的。开发专家系统首先意味着选择/修改专家系统外壳,其次是获取专家知识并用信息或数据集填充知识库。第二步比第一步复杂得多,花费的时间也多得多。专家系统可以用于网络防御的一个例子是安全规划[17]。在该领域中使用的专家系统大大简化了选择安全措施的任务,并为有限资源的最佳使用提供了指导。此外,专家系统在入侵检测中的使用可以追溯到过去[18,19]。

专家系统

C. 智能代理:智能代理是具有一些智能行为特征的软件组件,这些特征使其变得特殊(主动性、理解和响应代理通信语言)。这些软件组件具有计划性、可变性和深度思考能力。它已经作为一个概念被采用在软件工程中,软件代理被认为是主动的和代理的通信语言。但是,当比较代理和对象时,可以表现为对象可以是被动的,并且不需要理解任何语言(尽管它接受具有良好定义的语法的消息)[17]。

有研究表明,在网络防御中如何使用有效的智能代理来抵御 DDoS 攻击[20,21]。其中一些研究还指出,在解决一些法律和商业问题后,有可能开发出由移动智能代理组成的“网络警察”[22]。此外,混合多代理、基于神经网络的入侵检测系统[23]和基于代理的分布式入侵检测系统[24]是这方面的其他科学研究。

智能代理

D. 搜索:搜索几乎存在于每一个各种形状和格式的智能程序中,其效率往往对整个程序的性能至关重要。在满足解决方案要求的同时,可以使用附加信息来指导研究,这样可以显著提高搜索效率。许多搜索方法已经在人工智能中开发出来,虽然它们在许多软件中使用,但这通常不被视为人工智能的使用。例如,动态编程[25,26]专门用于解决最优安全问题,但嵌入式搜索似乎不是人工智能应用。与或树(Andor trees)、αβ搜索、极大极小搜索和随机搜索广泛应用于游戏应用中,尤其适用于网络防御决策。最初为计算机象棋游戏开发的αβ搜索算法在解决问题方面非常成功,尤其是在评估和决定两次攻击的最佳可能行动方面。使用最少获胜和最多失败的预测,该算法允许通过忽略大量选项来加速搜索。

搜索算法

E. 学习:学习通过扩展或重新安排知识库或通过开发推理机来开发信息系统[27]。机器学习包括获取新信息的计算方法、新技能和组织现有信息的新方法。学习问题与简单参数学习的复杂性(符号学习的复杂值,如学习某些参数的值和学习概念、语言结构、函数,甚至行为学习)有很大的不同。

人工智能提供了监督学习和非监督学习的方法。如果有大量数据,无监督学习特别有用,这种方法在可以收集大量日志的网络防御中很常见。数据挖掘最初是出于人工智能中的无监督学习[6,28]。

适合在并行硬件上执行的并行学习算法已经创建了一个优秀的学习类。这些学习方法以遗传算法和神经网络为代表。遗传算法和模糊逻辑方法已被用于网络防御,例如,威胁检测系统[29]。

图片由 Philipp Marquetand 来自 Pixabay

F. 约束求解:约束求解是利用人工智能(逻辑表达式、表格、方程、不等式等)发展起来的技术。)在解决所提出的问题时,通过对解决方案给出一系列的约束条件[30]。问题的解决方案是满足所有限制的值的集合(一系列)。事实上,有许多不同类型的约束,这取决于约束的性质(例如,有限集上的约束、函数约束、有理树)。在非常抽象的层次上,几乎任何问题都可以表示为约束满足的问题。由于需要大量的调用,这些问题的解决方案通常是困难的。它可以用于约束,逻辑编程,以及情况分析和决策支持[31,32]。

在第三部分,我们将讨论早期预警系统(EWS)和人工智能在网络犯罪中的应用…

来源

[3]罗森布拉特。“感知机——感知和识别自动机”,康奈尔航空实验室,1957 年。

[4] Y. A. Freund,R. E. Schapire,“使用感知器算法的大幅度分类,机器学习”,37(3):277–296,1999 年。

[5] G. Klein,A. Ojamaa,P. Grigorenko,M. Jahnke,E. Tyugu,“加强影响评估方法中的反应选择”,军事通信和信息系统会议,波兰弗罗茨瓦夫,2010 年。

[6]白,吴,王,杨,邱,“一种基于多层自组织映射和主成分分析的入侵检测模型,神经网络研究进展”,施普林格,2006 .

[7] F. Barika,K. Hadjar,N. El-Kadhi,“用于移动 IDS 解决方案的人工神经网络”,安全与管理,2009 年。

[8] D. A. Bitter,t .埃利宗多,“人工神经网络和相关技术在入侵检测中的应用”,IEEE 计算智能世界大会,CCIB,2010 年。

[9]张瑞仪,赖立波,苏伟德,王俊春,高俊生,“基于样本查询和属性查询的反向传播神经网络入侵检测”,计算智能研究国际期刊,2007 .

[10] B. Iftikhar,A. S. Alghamdi,“人工神经网络在检测 DOS 攻击中的应用”,第二届信息与网络安全国际会议论文集。纽约州纽约市,2009 年。

[11] D. Stopel,Z. Boger,R. Moskovitch,y .沙哈尔和 Y. Elovici,“人工神经网络技术在计算机蠕虫检测中的应用”,国际神经网络联合会议,2006 年。

[12] C. H. Wu,“基于规则技术和神经网络混合方法的垃圾邮件行为检测”,专家系统与应用,2009。

[13] P. Salvador 等,“利用神经网络进行僵尸检测的框架”,第四届互联网监测与保护国际会议,2009 年。

[14] M. Shankarapani,K. Kancherla,S. Ramammoorthy,R. Movva,S. Mukkamala,“用于恶意软件分类和相似性分析的核心机器”,IEEE 计算智能世界大会。2010 年,西班牙巴塞罗那。

[15] B. Fei,J. Eloff,M. S. Olivier,H. Venter,“在数字调查中异常行为检测的自组织图的使用”,法医科学国际,2006 年。

[16] E. Tyugu,“网络防御中的人工智能”,第三届网络冲突国际会议,2011 年。

[17] J. Kivimaa,A. Ojamaa,E. Tyugu,“分级安全专家系统”,Springer,2009 年。

[18] D. Anderson,T. Frivold,A. Valdes,“下一代入侵检测专家系统(NIDES)”,SRI 国际,计算机科学实验室,1995 年。

[19] T. F. Lunt,R. Jagannathan,“一个原型实时入侵检测专家系统”,IEEE 安全和隐私研讨会,1988 年。

[20] I .科滕科,a .乌兰诺夫,“模拟自适应合作防御互联网攻击的多智能体框架”,自主智能系统国际研讨会:智能体和数据挖掘,施普林格。

[21] I .科滕科、a .科诺瓦洛夫、a .肖罗夫,“僵尸网络和僵尸网络防御的基于代理的建模和模拟”,网络冲突会议,欧洲防治荒漠化公约出版物,爱沙尼亚塔林,2010 年。

[22] B. Stahl,d .,M. Carroll-Mayer,Y. Zheng,K. Wakunuma,“在计算机安全和计算机取证中使用计算智能技术的伦理和法律问题”,IEEE 世界计算智能大会,西班牙巴塞罗那,2010 年。

[23] E .赫雷罗,m .科尔查多,a .佩里塞尔,a .亚伯拉罕,“混合多智能体-神经网络入侵检测与移动可视化”,混合智能系统创新,2007 年。

[24] V. Chatzigiannakis,G. Androulidakis,B. Maglaris,“使用安全代理的分布式入侵检测原型”。惠普 OpenView 大学协会,2004 年。

[25] J. Kivimaa,A. Ojamaa,E. Tyugu,“选择安全措施的帕累托最优情况分析”,MilCom,2008 年。

[26] J. Kivimaa,A. Ojamaa,E. Tyugu,“管理不断变化的安全局势”,MilCom,2009 年。

[27] P. Norvig,S. Russell,“人工智能:现代方法”,Prentice Hall,2000 年。

[28] V. K. Pachghare,P. Kulkarni,D. M. Nikam,“使用自组织映射的入侵检测系统”,智能代理和多媒体代理系统国际会议,2009 年。

[29] R. Hosseini,J. Dehmeshki,S. Barman,M. Mazinani,S. Qanadli,“用于计算机辅助检测系统中模式识别的遗传 2 型模糊逻辑系统”,IEEE 计算智能世界大会。2010 年,西班牙巴塞罗那。

[30] B. Mayoh,E. Tyugu,J. Penjam,“约束程序设计”,北约 ASI 丛书,施普林格出版社。1994.

[31] I. Bratko,《人工智能的 PROLOG 程序设计》,Addison-Wesley,2001 年。

[32]欧,“网络安全分析的逻辑程序设计方法”,普林斯顿大学博士论文,2005 年。

网络安全的未来是否掌握在人工智能(AI)手中?— 3

原文:https://towardsdatascience.com/is-the-future-of-cyber-security-in-the-hands-of-artificial-intelligence-ai-3-60a148334245?source=collection_archive---------64-----------------------

事实上,*年来机器学习已经取得了很大的进步,从自主工具到虚拟助手,从聊天机器人到人脸/物体识别。网络安全呢?

利用人工智能进行网络防御

可能的网络防御系统应该提供至少三个级别的网络安全。第一层包括传统的静态网络防御机制,如身份和认证、密码保护、访问控制和网络过滤等。第二层包括主动的网络防御机制,如信息收集、安全评估、网络状态监控和攻击。第三个级别对应于网络防御管理,它对网络状态进行整体评估,选择适当或最佳的防御机制,以及它们的适应性[33]。

预警、入侵检测和预防系统,包括人工智能技术,在确保这些网络安全水*方面发挥着重要作用。

早期预警系统(EWS)用于防范网络攻击并尽快做出反应。然而,由于新技术带来的新级别的网络威胁,与传统和纯粹的数据包检测不同,新的 EWS 体系结构需要收集、分析、关联数据,同时*乎实时地检测、分析和响应威胁模型。听说了。这种需求包括开发虚拟传感器、复杂的数据关联、用于网络行为分析的新逻辑模型、学习算法,以及开发能够提供可扩展性、可靠性和灵活性的概念和新方法,尤其是在 IPv6 网络中[34]。

在预警和入侵检测中使用人工智能的目的是开发一种先进的智能帮助系统,用于在局域网和广域网中尽早检测来自互联网的攻击。在这个框架中,还应该考虑广泛使用的 internet 协议,如 FTP、SMTP 和 HTTP,以及较新的协议,如 SOAP。

在网络防御领域使用人工智能需要解决的主要问题是,可用的技术没有达到理想的水*,应该开发和适应什么样的人工智能方法,以最大限度地减少人的因素,这被认为是网络防御中最薄弱的环节。

利用人工智能进行网络攻击

人工智能的滥用会在几个方面威胁安全;

  • 对数字安全的威胁,
  • 对人身安全的威胁,
  • 对社会/经济/政治安全的威胁,

社会工程攻击的自动化: NLP(自然语言处理)工具能够模仿受害者的写作风格,因此人工智能系统收集在线信息来创建很可能被自动点击的个性化恶意网站/电子邮件/链接。

漏洞发现的自动化:过去的代码漏洞模型有助于加快新漏洞的发现。

高级黑客:人工智能可以用在黑客的很多方面。例如,人工智能提供自动化工具来改善目标选择和优先排序,避免检测,并对目标行为的变化做出创造性的反应。它还可以模仿类似人类的行为,将目标系统引导至不太安全的状态。

勒索软件任务的自动化:人工智能技术可以自动完成与勒索软件攻击者的受害者的对话和支付过程等各种任务。

人工智能在应用中的利用:人工智能被用来制造数据中毒攻击,或称 backdoor(后门)。

群体攻击:分布式自主机器人系统网络允许监控大区域并执行快速、协调的攻击。

对自主无人机和车辆的攻击:基于人工智能的自主无人机和车辆的控制作为网络攻击的结果,构成了重大威胁。

假新闻:当图像处理的最新发展与自然语言创作技术相结合时,公众试图通过制作高度逼真的国家领导人视频而被误导,这些视频似乎在发表他们从未实际做过的演讲和评论。

个性化的虚假信息和影响活动:人工智能驱动的社交网络分析可以识别(恶意)要约接*或虚假信息瞄准的关键因素。

来源

[32]欧,“网络安全分析的逻辑程序设计方法”,普林斯顿大学博士论文,2005 年。

[33] I .科滕科,“用于国土安全的网络攻击和网络防御的多代理建模和仿真”,IEEE 智能数据获取和高级计算系统国际研讨会:技术和应用,2007 年。

[34] M. Golling,B. Stelte,“未来 EWS 的要求——未来互联网中的网络防御”,第三届网络冲突问题国际会议,欧洲防治荒漠化公约,2011 年。

数据科学的未来是女性吗?

原文:https://towardsdatascience.com/is-the-future-of-data-science-female-42ce043cecd7?source=collection_archive---------72-----------------------

Kaggle 的调查数据揭示了关于数据职业未来多样性的有趣(尽管有限)见解。

凯瑟琳·汉隆在 Unsplash 上的照片

本周的改变一切播客专题讨论了职业道路和成功。讨论的一个关键点是,在人们如何对待导师以及在工作中寻求支持或晋升方面,性别之间存在差异,以及促进不同声音和观点的重要性。考虑到这个问题,我想进一步研究数据科学中关于性别多样性的现有数据。

关于在该领域工作的各种人的一个信息来源是 2019 Kaggle ML & DS 调查,该调查要求专业人士和学生回答一系列(数据科学双关语)关于他们的性别、职称、收入、国籍等问题。(种族不是包含的问题之一。)20172017和 20182011的调查数据也有了,所以这是一个很好的纵向分析的机会。

我想我应该用 Alteryx Designer 仔细看看 Kaggle 的数据,看看是否有任何值得注意的性别模式出现,特别是在学习数据科学的学生周围。毕竟,今天的学生将帮助决定这个领域多元化的未来。

随时间变化

我最初认为,在 Kaggle 调查的三年中,看看学生的性别多样性是否有任何变化会很有趣。我发现,从 2017 年到 2019 年,学生调查受访者中认为女性的比例实际上略有下降。认为自己是男性的受访者人数和提供其他答案(可能包括“不愿意回答”或“更愿意自我描述”)的受访者人数保持稳定。至少在这些数据中,性别之间并没有向更公*的方向转变。

性别和国籍

哪些国家培养了最多的女性数据科学学生?我只看了 2019 年 Kaggle 的回复,并按国籍和性别进行了细分。然后,我将这些数据与各国的人口数据结合起来,计算出每个国家每 10,000 人中有多少数据科学专业的学生,以及有多少是女性。(当然,这些只是 Kaggle 调查的受访者,提出了我将在下面讨论的复杂问题。)

下表列出了数据科学学生人数最多的 15 个国家,同时也显示了女学生的人数。即使在接受调查的学生人数最多的国家,女生的比例也相对较低。

调查对象的性别和教育

数据科学专业的学生可以追求各种证书。再次使用 2019 年的调查数据集,我按性别检查了非学生受访者中教育水*的差异。女性受访者拥有硕士或博士学位的比例略高于男性受访者。

虽然差别不是很大,但考虑一下它的潜在原因还是很有趣的。女性获得高等学位的比率比男性高吗?不管出于什么原因,高学历女性更有可能完成调查吗?招聘经理是否要求女性接受更高的教育标准以获得职位?

数据限制

使用 Kaggle 数据来研究这些问题并不是一个理想的方法,但它本身提出了一些有趣的问题。这项调查是自愿的,而且(据我所知)只有英文版,尽管受访者来自 171 个不同的国家,所以参与人数有限。此外,Kaggle 在很大程度上是一个竞争网站,用户在这里应对各种挑战,以证明他们的数据能力。这种形式可能对所有性别和背景的数据科学学生和专业人员没有同等的吸引力。

向调查受访者询问性别问题本身就很困难,我自己的分析也有缺陷,因为“其他回答”(我将“不愿意说”和“愿意自我描述”的回答归为一类)包括了调查中性别问题的所有其他回答。此外,该问题的答案选项在 2017 年版本的调查中有所不同。

未来的外卖

来自国家和全球教育和专业机构的其他数据将提供额外的见解,也许更可靠。但是,当我们探索在数据职业中实现更大多样性的途径时,观察这些模式并考虑如何解决它们是很有趣的。

对于那些寻求进入数据职业的人来说,Alteryx ADAPT(共同提升数据&分析潜力)计划是一个免费的在线培训机会,包括在该计划中使用的软件许可证、协作讨论、数据科学资源和认证。该计划适用于任何就业受到新冠肺炎疫情影响的人,包括失业或休假的人,或失去实习或毕业后机会的人。主题包括数据基础介绍、Alteryx Designer 的核心认证和业务预测分析。该项目的自定进度结构非常适合不同背景的人,包括那些可能发现寻求其他提升技能机会具有挑战性的人。

这需要我们所有人共同努力,相互支持,以提高数据专业的多样性。关于我们如何在这一领域相互支持的更多见解和第一手经验,请查看本周的 Alter Everything 播客。

原载于 Alteryx 社区 。在 Alteryx 数据科学门户 找到更多资源。

点在多边形里面吗?

原文:https://towardsdatascience.com/is-the-point-inside-the-polygon-574b86472119?source=collection_archive---------7-----------------------

在计算几何中,多边形中的点 ( )问题询问*面中的给定点是位于多边形的内部、外部还是边界上维基百科。

一种快速简单的算法来确定一个点是位于多边形内部、之上还是之外,在各种应用中非常有用,如计算机图形学、地理信息系统(GIS)、运动规划、CAD、计算机视觉等。

作为一名计算机视觉工程师,我看到的一些直接应用是:

  1. 车道检测:由于车道可以用梯形来表示,因此 PIP 可以用来判断像素是否位于梯形(车道)内。
  2. 使用边缘检测计算对象的面积:任何对象的面积都可以通过对其执行边缘检测来计算,然后通过检查像素是否位于对象边缘形成的多边形内来计算面积。

解决画中画问题的一些方法是通过使用 光线投射算法缠绕数算法 需要注意的一点是,对于真正靠*多边形的点,缠绕数算法比光线投射更精确。此外,在较新的实现中,它也比光线投射算法更快。对于凸多边形,PIP 问题被进一步简化,我们将讨论一种这样的方法来解决它。

在这篇文章中我将解释解决任意多边形画中画的缠绕数算法。然后,我将介绍一种解决凸多边形 PIP 的简化方法。这两种方法的 C++代码都可以在这里找到

绕组数量算法

缠绕次数由曲线围绕一个点逆时针旋转的次数来定义。

点 p 的绕组数是 2。(来源:维基百科)

该算法规定,对于多边形内的任何一点,缠绕数都不为零。因此它也被称为非零规则算法。

来源:作者

计算缠绕数的一种方法是计算多边形的每条边与查询点所成的角度。这分别由 AB 边、BC 边、CD 边和 DA 边的角度θ1、θ2、θ3 和θ4 表示。如果这些角度的总和为 2 π ,则该点位于多边形内部,如果总和为 0,则该点位于多边形外部。

*sum_of_angles = θ1 + θ2 + θ3 + θ4 = 2 π **-> Point is inside** sum_of_angles = θ1 + θ2 + θ3 + θ4 = 0 **-> Point is outside.***

类似于光线投射算法,该算法的时间复杂度将是 O(n ),但是它将涉及反三角函数(如 atan2)的重复计算,以获得多边形的边与查询点所对的角度。

W. Randolph Franklin 所述,降低复杂性的一种方法是简单地观察实际上围绕查询点的边,而所有其他边可以忽略。

算法:对于任意多边形,求该多边形所有与通过查询点的直线相交且*行于 y _ 轴的边。对于这些边,检查当逆时针方向看所有边时,查询点是在边的左侧还是右侧。如果查询点位于向上交叉路口的左侧,则绕组数(wn)值增加 1,如果查询点位于向下交叉路口的右侧,则 wn 值减少 1。如果最终缠绕数不为零,则该点位于多边形内部。

***Example:
For part a) in the figure below:**
Initially wn = 0
Only edges CD and AB cut the line passing through P1 and parallel to y axis.
1) wn++ for CD as it is an upward crossing for which P1 is left of CD
2) wn wont be changed as P1 is on left of AB (downward crossing).
**As final winding number wn = 1 which is not equal to zero point P1 lies inside the polygon.****A similar case can be made for b) part of the figure.** Although it should be noted that we are avoiding the added complexity of the polygon and hence make the algorithm more efficient.**For c) part in the figure below:**
Initially wn = 0
Only edges DE and BC cut the line passing through P1 and parallel to y axis.
1) wn++ for DE as it is upward crossing for which P1 is left of CD
2) wn-- for BC as it is downward crossing for which P1 is right of BC
**As final winding number wn = 0 point P1 lies outside the polygon.***

a) wn = 1,因为 P1 在上边缘 CD b) wn = 1 的左边,因为 P1 在上边缘 FG c) wn = 0 的左边,因为 P1 在上边缘 DE 的左边但在下边缘 BC 的右边。注意:对于 a)和 b ),点 p1 在多边形内,如 wn!= 0,不考虑 b)中多边形的附加复杂性。(*来源:作者)*

Cpp 代码:(GitHub 句柄)

  1. substitute _ point _ in _ line():该函数计算点位于直线的哪一侧。
  2. is _ point _ inside _ polygon():这是完整的算法,计算一个点是否在内、在或在,给定逆时针方向的多边形顶点。通过按逆时针方向列出顶点来固定边的方向有助于锁定线段的左侧和右侧(多边形边)。**

多边形中的点为凸多边形

凸多边形是指所有内角都小于 180°的多边形,这意味着所有顶点都指向远离多边形内部的方向。

我们单独讨论这一点,因为在计算机视觉中遇到的最常见的多边形类型是凸多边形。这些包括所有的三角形、正方形、*行四边形、梯形等。

算法:对于一个凸多边形,如果多边形的边可以认为是从任意一个顶点开始的路径。然后,如果查询点位于构成路径的所有线段的同一侧,则称该点位于多边形内部。这可以从下图中看出。

点 P1 位于上面显示的两个多边形内,因为 P1 位于两个多边形所有边的同一侧。(来源:作者)

要找出该点位于线段的哪一侧,我们可以简单地将该点代入线段方程。例如,对于由(x1,y1)和(x2,y2)形成的线,查询点(xp,yp)可以被替换如下:

***result = (yp - y1) * (x2 -x1) - (xp - x1) * (y2 - y1)***

当逆时针方向看线段时,如果结果是:

  1. 结果> 0:查询点位于行的左侧。
  2. 结果= 0:查询点位于直线上。
  3. 结果< 0: Query point lies on right of the line.

Cpp 代码:(GitHub 句柄)

  1. substitute _ point _ in _ line():该函数计算点位于直线的哪一侧。
  2. is _ point _ inside _ convex _ polygon():这是完整的算法,计算给定顺时针或逆时针方向的多边形顶点,一个点是否在凸多边形的内

如前所述,凸多边形中的点也包括以下情况

  1. 梯形中的点
  2. *行四边形中的点
  3. 矩形中的点

总而言之,我们讲述了如何找到一个多边形的缠绕数,并用它来确定这个点是在多边形的内部、上面还是外部。我们还看到了一个更简单的解决方案,可以应用于凸多边形来解决画中画。

如果你有任何问题,请联系我,希望你喜欢这个数学。

参考资料:

  1. https://en.wikipedia.org/wiki/Point_in_polygon#cite_note-5
  2. http://www . eecs . umich . edu/courses/eecs 380/讲义/PROJ2/InsidePoly.html
  3. http://geomalgorithms.com/a03-_inclusion.html
  4. Wm。Randolph Franklin,“多边形测试中的点包含”

Seq2Seq 车型的竞赛结束了吗?

原文:https://towardsdatascience.com/is-the-race-over-for-seq2seq-models-adef2b24841c?source=collection_archive---------17-----------------------

Unsplash 上由 Kaley Dykstra 拍摄的照片

Seq2Seq 或序列到序列模型的概念来自 Ilya Sutskever 等人在“用神经网络进行序列到序列学习”中的一篇论文。它们本质上是深度序列模型的某种组织(也称为基于 RNN 的模型)(例如 LSTMs/GRUs)[ 1 ](稍后讨论)。这些模型解决的主要问题是,

将任意长度的序列映射到另一个任意长度的序列

我们在哪里会遇到这样的问题?几乎任何地方。的应用,

  • 机器翻译
  • 文本摘要
  • 问题回答

很少有例子可以利用这种模式。这些应用有一个非常独特的问题公式,要求能够将任意长的源序列映射到任意长的目标序列。例如,如果你想象一个英语到法语的翻译,在两种语言的单词之间没有一对一的映射。通常,从一种语言翻译到另一种语言需要学习大量复杂的特性(一对多、多对一、多对多映射、词汇依赖、单词对齐【2】等)。

这与图像分类(即固定大小输入→类/标签)或情感分析问题(即任意长度输入→类/标签)有很大不同。

你好!欢迎学习机器翻译 101

在深入研究之前,你必须清楚地了解机器翻译问题是如何被表述为机器学习问题的。

您有属于两种语言的数据;源语言(翻译源语言)和目标语言(翻译目标语言)。例如,如果您要从英语翻译成法语,英语将是源语言,法语将是目标语言。

接下来,您有一个由n_s个元素组成的长文本序列(例如句子),从一个V_s大小的词汇表(英语)中抽取单词。在模型训练期间,你也有一个n_t元素长文本序列,从V_t大小的词汇(法语)中抽取单词。每个单词被表示为一个d_w大小的向量。这可以使用一个热编码或字向量(例如 Word2vecGloVe )。最后,在预测过程中,模型对V_t词汇进行n_t次连续预测。下图说明了该过程。

机器翻译过程

深入到 Seq2Seq 模型

在开始了解这些模型的命运之前,让我们更详细地了解一下它们是做什么的。在这里,我从我在 DataCamp 的 Python 课程中的机器翻译中汲取了大部分视觉帮助和概念。如果你想在这个话题上了解更多,我邀请你去尝试这个课程。

如果你看一个 seq2seq 模型,眯着眼睛模糊细节,你会看到它实际上是两个组件;编码器和解码器。你在日常生活中使用编码器-解码器的概念比你意识到的要多。举一个简单的例子,老师解释大象长什么样。

编码过程类似于老师向你解释大象的样子,然后你在脑海中创造出一个形象。如果你的一个朋友问大象长什么样,解码过程就会发生。(来源:Python 中的机器翻译)

当你听老师讲课时,编码就发生了,你对大象的心理图像进行了编码。然后当你缺课的朋友问大象是什么的时候,你将会开始通过口头向朋友解释或者画一幅画来解码这个心理图像。

从更技术性的角度来看,这是一个用于机器翻译的 seq2seq 模型的样子。

编码器解码器模型概述(来源:Python 中的机器翻译)

编码器接收一个英语句子并创建一个上下文向量(也称为思维向量),然后解码器使用该上下文向量解码正确的法语翻译。

快速游览格鲁什

编码器和解码器由什么组成?它们包括深度序列模型(或者几层这样模型)。我们将很快掩饰一个这样的深度序列模型的细节;门控循环单元(GRU)。这个想法是,

h(0) = {0}^n # A zero vector
for each **i**^th word **w** in sequence (e.g. sentence):
    h(i) = GRU(f(w), h(i-1))

f(w)是单词的一些数字表示(例如一个热编码/单词向量)。我不会在代码中解释GRU函数中发生了什么。重要的是,GRU 单元接受当前输入和先前输出,并产生当前输出。我强烈建议阅读所提供的参考资料,以便深入理解[ 1 ][ 3 ]下图说明了 GRUs 如何处理文本序列。

门控循环单元(GRU)如何工作(来源:Python 中的机器翻译

变形金刚的盛大入场

像 LSTMs 和 GRUs 这样的递归神经网络(rnn)在相当长的一段时间里都沉浸在自己应得的声誉中,直到最*它们受到了一个新成员的挑战;一种叫做变压器的东西。

变压器型号在 5 中介绍。这是一个非常创新的概念,解决了 rnn 的两个主要弱点:

  • rnn 是不可并行化的,因为t^th步骤的输出取决于(t-1)^th步骤的输出(因此称为递归神经网络)
  • RNNs 努力保持语言的长期依赖性,因为它只看到前一步的记忆

为了更好地理解 Transformer 模型,我们将假设一个从英语到法语的翻译任务。模型被训练完成的任务是,给定一个英语句子,找到正确的法语翻译。

我们现在来看看 Transformer 模型的主要特色。请注意,我不会讨论 Transformer 模型的所有错综复杂之处,但足以理解它与 Seq2Seq 模型的不同之处。转换器也是一个编码器-解码器模型。

抽象出细节,转换器与抽象的 Seq2Seq 模型非常相似

编码器有几层,解码器有几层。每层由两种类型的子层组成,

  • 自我关注层
  • 全连接层

最终的解码器层需要包括 softmax 层,因为它需要为每个位置产生目标语言词汇的概率。

详细的变压器模型。编码器由几层组成。每层由两个子层组成;自关注子层和全连接子层。解码器也由几层组成,每层由两个自关注子层和一个全连接子层组成。该图还显示了在输入和子图层之间创建的连接类型。自我关注子层在给定时间查看所有单词,而全连接子层单独处理单词。

自我关注层

自我关注层是 Transformer 模型的开创性概念。基本上,自我注意层在处理序列中的单个单词时,使模型能够查看所有其他单词。为什么这很重要?想象一下下面这句话,

那只狗跑过马路去捡球

现在想象一个模型从一个单词到另一个单词的顺序。当模型看到单词“它的”时,它有助于知道“它的”指的是狗。这适用于任何机器学习任务,无论是机器翻译、依存解析还是语言建模。

自我关注层使 transformer 能够准确地做到这一点。在处理单词“its”时,模型可以查看所有其他单词,并自行决定哪些单词对于“混合到输出中是重要的,以便转换器可以有效地解决任务。此外,这是一个“加权组合”,权重是在训练过程中学习的。下图显示了这一过程。

当处理“它”这个词时,自我注意是如何工作的。注意力层对每个单词都有权重,使该层能够创建单词的“加权混合”作为输出。本质上,灰盒编码了关于单词“its”和“dog”的信息。

:你也可以看到解码器里有一个被掩盖的自我关注层。这本质上是为了掩盖在模型训练中可能发生的任何前瞻(那将是欺骗)。换句话说,解码器不应该知道目前已经看到的东西前面是什么。有关这方面的更多信息,请参考原始文件

全连接层

围绕全连接层没有太多的谜团。它采用独立的自我注意层输出,并使用全连接层为每个单词产生潜在的(即隐藏的)表示。并且这个完全连接的层在不同的时间步长上共享。然而,每一层都有一组完全连接的权重。

变压器的优点

如您所见,没有一个子层包含等待上一步输出的顺序计算(如 LSTMs/GRUs)。这减轻了模型维护类似 LSTMs 的状态/记忆的需要。因此,变压器可以同时并行计算所有时间步长的输出。

此外,如您所见,在给定的时间步长,自我关注子层会看到所有其他输入。由于这个原因,在长文本序列中保持长期依赖变得微不足道。

最终结论:Seq2Seq 车型还有希望吗?

现在让我们来讨论迫切的问题。Seq2Seq 型号会很快过时吗?个人认为不是!由于几个原因

是的:Seq2Seq 模型对于低资源环境仍然是一个很好的选择

原变压器型号比较大,如(伯特 — 300M 参数、 GPT — 110M 参数、 XLNET )。这限制了在嵌入式设备或物联网设备等限制性环境中使用这些模型的能力。你可以有一个简单的 LSTM/GRU 模型,其占用的内存只是这些大型模型的一小部分。

注意:值得强调的是,人们一直在尝试推出更小的型号,但仍能提供与原始型号相当的性能。值得注意的是蒸馏器。但是与简单的 RNN 模型相比,这些仍然非常大(例如,DistilBert 有大约 66M 的参数)。

是:易于原型化/理解

假设您遇到一个 NLP 问题,并被要求评估使用 Seq2Seq/Transformer 模型的可行性。与 Transformer 相比,Seq2Seq 模型可以快速启动并运行,因为 Seq2Seq 模型更简单、更容易理解。如果你热衷于学习如何实现 Seq2Seq 模型并理解它们如何工作,你可以试试我在 DataCamp 上的课程“Python 中的机器翻译”。

是的:rnn 正在发展

人们一直在研究改进基于 RNN 的模型,提高它们保持长期依赖性的能力。一个特别的例子出现在报纸上莫格里菲耶 LSTM [ 6

否:Transformer 模型在许多 NLP 任务中提供了更好的性能

毫无疑问,事实已经不断证明,变压器模型几乎总是优于顺序模型。因此,如果你只关心性能,不需要担心内存,变形金刚将是一个不错的解决方案。

不:变形金刚模型对恶意攻击更强

改进模型对抗对抗性攻击是机器学习的一个重要研究领域。已经有研究评估了变形金刚/RNNs抵御敌对攻击的能力7。看起来变形金刚模型对对抗性攻击更强。

必须是是或不是吗?

我们不应该忘记,这并不一定是是或不是,事实上我们可以利用两个世界的优势。虽然基于变压器的模型具有优越的性能,但基于 RNN 的模型在内存消耗方面较低。也许有可能通过将它们组合成一个单一的模型来实现两者之间的*衡。

希望将来我们会看到一些令人兴奋的研究,试图将这两种超能力结合成一个令人敬畏的模型!

想在深度网络和 TensorFlow 上做得更好?

检查我在这个课题上的工作。

[1] (书)TensorFlow 2 在行动——曼宁

[2] (视频教程)Python 中的机器翻译 — DataCamp

[3] (书)TensorFlow 中的自然语言处理 1 — Packt

如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!

[## 通过我的推荐链接加入媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

thushv89.medium.com](https://thushv89.medium.com/membership)

参考资料:

[1]https://colah.github.io/posts/2015-08-Understanding-LSTMs/

[2]https://en.wikipedia.org/wiki/Bitext_word_alignment

[3]https://arxiv.org/pdf/1406.1078.pdf

https://datacamp.com/courses/machine-translation-in-python

https://arxiv.org/pdf/1706.03762.pdf

https://arxiv.org/pdf/1909.01792.pdf

https://www.aclweb.org/anthology/D19-5627.pdf

新冠肺炎疫情是否扰乱了意大利的房地产市场?

原文:https://towardsdatascience.com/is-the-real-estate-market-in-milan-disrupted-due-to-the-covid-19-outbreak-kijiji-web-scraping-c9d046eecc55?source=collection_archive---------39-----------------------

网页抓取

米兰案例研究——易贝旗下的网络抓取网站 kijiji.it

新冠肺炎将如何影响义大利的房地产市场很难预测。房地产行业正在遭受冠状病毒的打击,在好转之前还会变得更糟。对房地产的影响因行业和市场而异,影响的程度取决于经济衰退的持续时间。

到目前为止,受打击最大的房地产行业是酒店、餐馆、酒吧和其他娱乐场所,紧随其后的是零售和住宅。

在这个项目中,我们将调查冠状病毒爆发前后,特别是 2 月 21 日前后,意大利米兰住宅房地产行业的趋势。住宅部门侧重于购买、出售和出租用作住宅或非专业用途的房产。住宅房地产行业包括独栋住宅、公寓、共管公寓、规划单元开发等。

从 1 月 1 日到 4 月 15 日,我们将从 kijiji.it 上删除所有可用的租赁公寓产品或*台发布的数据。kijiji 是一个在线广告服务的全资子公司,易贝于 2005 年 2 月推出。加拿大和意大利的 100 多个城市都有 Kijiji 网站。

让我们开始吧。

注:如果你对代码感兴趣,请访问我在 github 上的简介。

我们设法收集了 461 处房产用于出租。我们要做的第一件事是清理数据,我们可以删除没有价格的任何值和一月份之前的任何值。我们还将删除欧元符号和任何阻止列被视为数字而不是文本的内容。

现在是处理异常值的时候了,使用四分位间距规则,我们总共能够移除 25 个值。

数据探索和可视化

现在,在将数据集分为冠状病毒爆发前后之前,让我们首先对整个数据集进行一些数据探索,以便我们可以先熟悉我们所拥有的数据。

  • 检查价格*均值以及价格和面积之间的相关性
Price mean = 955.4214876033058
          price      area
price  1.000000  0.261033
area   0.261033  1.000000

所有公寓的*均价格是 955,而 26%的价格和面积之间的相关性实际上不是很好,这是值得调查的。

  • 现在,我们来看看米兰每个地点的*均价格和面积的变化。

我们可以注意到,最昂贵的地区是(Bonola / Molino Dorino / Lampugnano)(圣西罗/ Fiera),而最便宜的地区是(Città Studi / Lambrate),非常奇怪的是(Centro),这将在我们拆分数据的下一步中进行调查。

注:米兰区域是基于用户提交的不指定自动分配给自治市名称的区域。

  • 现在让我们分割数据集。

在疫情爆发前,我们有 85 个在线租房帖子,而奇怪的是,在同一时期后,我们的数量增加了两倍多。这可能预示着销售额的大幅下降。

  • 用相关性检查爆发前后的*均价格。
Price mean before = 1141.8235294117646
Price mean after = 898.4280575539568

疫情爆发前的*均价格比预期的要高。

让我们检查并打印相关性并解释它。

price      area
price  1.000000  0.555945
area   0.555945  1.000000
          price      area
price  1.000000  0.176422
area   0.176422  1.000000

疫情爆发前,价格与地区之间存在 55%的正相关关系,而疫情爆发后,这一关系几乎为零,这表明人们的定价行为发生了变化。还值得一提的是,价格和面积之间 55%的相关性并不是那么强,它表明了许多租户可以收取比他们所得到的更多的费用,还值得一提的是,房价不仅仅取决于这些特征。

  • 疫情爆发前后各地价格的变化。

在这里,我们可以清楚地看到趋势的变化,在疫情爆发前,圣西罗地区和中心的价格最高(1200),然而在疫情爆发后,中心和洛雷托地区的价格下降到*一半,达到600,其他地区有小到中等的下降,但是我们可以注意到 Bonola / Molino Dorino / Lampugnano 等地区的价格有所上升。

  • 基于爆发前每个地点*均面积的价格变化。

像我们在(巴乔/弗兹·阿玛特/金托·罗马诺)或市中心看到的那样,在相同的位置相同的功能有相同的价格应该是正常的,但是在像(热那亚门/纳威格利/意大利科尔索)或(圣西罗/菲拉)这样的地区,价格有很大的变化,这肯定解释了以前的低相关数,我们应该预计在以后的数据中会有更大的变化。

  • 基于疫情爆发后每个地点*均面积的价格变化。

正如预期的那样,价格混乱可能是由于工人呆在家里对国家封锁的恐惧,以及由于企业关闭、检疫和宵禁。大量裁员将导致消费支出进一步收缩,这将迫使房东降低价格,一些房东已经开始适应新的形势,一些房东仍然提供相同的正常价格,同时也要记住短期租赁市场正在大幅放缓。

使聚集

在这一部分,我们将尝试根据面积和价格将市场划分为不同的公寓子集。

我们将使用一个名为minmax scaler(feature _ range =(0,1))的方法,在范围[0,1]内按比例变换列中的每个值。我们将此作为变换要素的首选缩放器,因为它将保留数据集的形状(无失真)。

  • 让我们想象一下爆发前的集群

集群 0:价格(1500–2250)€,面积(60–105)*方米,这个集群有价格高的小公寓,这些公寓通常集中在昂贵的社区或中心。

集群 1:价格(625-1500)€,面积(35-86)MQ,这是中等集群,为了更好的邻里关系,你可以拥有价格比集群 3 高的小公寓。

集群 2:价格(1000-2200)€,面积(100-130)MQ,这个集群有点相关的关系,高价格的大公寓。

集群 3:价格(375-1100)€,面积(20-70)MQ,这个集群也有一个积极的关系,价格范围低的小公寓,这通常是在远离中心的地区。

  • 让我们将位置加入到聚类数据中,并打印基于位置聚类的价格,也包括疫情爆发前的数据。

聚类和以前一样,只是在这里我们可以看到每个聚类包含城市中哪些区域的帖子,聚类 0 如预测的那样在中心有公寓,我们还可以从这个结果中假设米兰细分市场与中心和昂贵的社区相关联。

  • 疫情爆发后,对数据进行同样的处理

集群 0:价格(100–1000)€,面积(20–70)*方米,该集群拥有价格范围非常低的小型公寓,通常位于远离中心的区域。

聚类 1:价格(100-1000)€,面积(80-125)MQ,该聚类有更大的公寓,价格范围与以前相同,这表明在疫情爆发后,可能有些公寓不得不降低价格范围。

集群 2:价格(750-1500)€,面积(40-86)MQ,这是一个中等集群,为了更好的社区,你可以拥有价格比集群 3 更高的小公寓。

第三类:价格(1200-2250)€,面积(55-150)*方米,这个群体有从小公寓到大公寓的很大范围,但是价格很高,通常集中在昂贵的社区或中心。

在最后一个表示中,如前所示,聚类 3 的价格最高,但是,价格不再是爆发前的中心,而是集中在 Bicocca 和 Citta Studi 等地区,集中在大学附*,而中心价格出现了大幅下降。

使用 ArcGis 进行探索

供参考:【https://github.com/Esri/arcgis-python-api】

我们将采取原始数据帧后,修复日期栏,我们将手动插入谷歌地图的坐标,然后我们将删除未标识的地方' ~Altre zone '。

  • 我们将再次分割数据,然后打印我们的第一张地图。这张地图显示了爆发前(青色)和爆发后(红色)的属性

  • 让我们使用热图来可视化房产(房屋)的空间密度

首先,对于之前的数据

第二,对于之后的数据

  • 现在,让我们通过价格来可视化空间分布。

首先是疫情爆发前的数据。

其次是疫情爆发后的数据。

  • 你有了想法,现在让我们做同样的事情,并设想按面积的空间分布

结论

我们可以注意到,与疫情爆发前的数据集相比,价格范围有所下降,500€下降表明价格下降,可能没有销售额下降那么大。

我们的数据和分析显示,市场行为确实发生了变化,一些房东已经开始降低他们公寓的租金,数据还显示,疫情爆发后的帖子数量是之前的三倍,这表明销售额大幅下降。

房产租赁和购买*台 Idealista.com 在 4 月初报告称,冠状病毒危机的影响尚未在市场上引起注意,尽管他们警告说,下一季度可能会对形势有更多的了解。

根据他们 2020 年第一季度的数据,意大利全国的房价下跌了 0.4%,二手房产的*均价格目前为每*方米 1699€(年跌幅为 2%)。

未来的工作

如果你喜欢调查市场趋势的想法,绝对建议每个公寓有更多的功能,玩虚拟变量将位置变成可测量的变量可能是一个有趣的想法,几个月后收集更多的数据以进行更深入的研究也是建议。

如果你想查看完整的代码,并知道如何自己收集数据或下载这个项目中的数据集,请查看我在 github 上的简介。

谢谢:)

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

posted @ 2024-10-15 13:42  绝不原创的飞龙  阅读(207)  评论(0)    收藏  举报