TowardsDataScience-博客中文翻译-2022-四十九-

news/2024/10/18 9:34:57/文章来源:https://www.cnblogs.com/apachecn/p/18473555

TowardsDataScience 博客中文翻译 2022(四十九)

原文:TowardsDataScience

协议:CC BY-NC-SA 4.0

测量误差对线性回归模型的影响

原文:https://towardsdatascience.com/the-effect-of-measurement-errors-on-a-linear-regression-model-c853bb689974

图片由皮克斯贝 ( 牌照)的安德格林拍摄

当回归变量或因变量包含测量误差时会发生什么

测量误差可能由于各种原因渗入实验中,例如测量仪器本身、实验的形式或调查对象提交的错误回答。有人可能会争辩说,通常一个变量的测量会有一些误差。在这种情况下,了解这种度量误差对回归模型的影响以及如何减轻这种影响非常重要。

在本文中,我们将使用一个线性回归模型作为我们的工作台来着手做这件事。

有两种情况需要考虑测量误差:

  1. 当误差在回归模型的响应变量(***【y】)***时。
  2. 当一个或多个解释变量x*_ I*测量有误差时。

响应变量中的测量误差

考虑以下线性模型:

变量的线性模型(图片由作者提供)

上式中,,* 1,x 2,x 3是大小为【n×1】的列向量假设有 n 向量 1 仅仅是一个 1s 的向量。乘法符号()会在需要的地方明确显示,但为了简洁起见,也可以将其删除。 y 上面的不是乘号。我们将很快解释它是什么。误差项假设正态分布,均值和方差为零 σ _ϵ ,即 ϵ ~ N(0,σ _ϵ)*

对于数据集中第行和第行,上述模型可以重述如下:

用数据集中的第 I 行表示的线性模型(图片由作者提供)

为了方便起见,我们将继续使用等式(1)而不是(1a)。让我们假设 x _2x_ 3即与【ϵ*不相关,那么等式(1)(或 1a)中的模型可以使用普通最小二乘法(OLS)一致地估计*****

我们假设 y *** 是因变量的真实(确切)值但我们测得(即观察到)的值是yy包含一个误差 ν 我们假设这个误差是可加的。我们可以将 y *** 与 y 的关系表示如下:******

观测值 y 是精确值 y *** 和一些误差 ν (图片由作者提供)

我们假设 ν 正态分布,均值为零,方差σ _ ν 。批注-大小: ν ~N(0, σ _ ν )。正如我们将看到的,这个假设将有助于分析。

将等式(2)代入等式(1)并重新排列各项,得到如下结果:

包含错误测量的响应变量的线性模型(图片由作者提供)

在上面的模型中, x _2x**_ 3继续保持外生即不与复合误差项**(+*)因此,就像早期的模型一样,等式(3)中的模型可以使用普通最小二乘法(OLS)和 OLS 一致地估计,将产生所有回归系数的无偏估计。***********

我们来考察一下随机变量(ϵ+ν)的均值和方差特性。对于两个独立随机变量X*_ 1X****_ 2*的均值和方差,我们将使用以下两个恒等式******

随机变量线性组合的均值和方差。a 和 b 是一些常数(图片由作者提供)

回想一下,误差ν*【正态分布】即**~ n(0,σ_ϵ)ν~ n(0,* σ _ ν********

应用以上两个恒等式,我们分别得到合成误差(+ν)(σ_ϵ+σ_ν)的均值和方差为零,如下:****

复合误差的均值和方差(ϵ+ν)(图片由作者提供)**

由此我们可以看出,虽然复合误差的均值仍然为零,但其方差却比原始模型的方差大。

*误差项的方差越大,意味着包含不精确测量的 y 的该模型的预测越不精确。它们的预测区间比带有精确 y 的模型的预测区间更大。

现在让我们来看看其中一个回归变量包含误差项的情况。

回归变量中的测量误差

考虑以下线性模型:

二元线性模型 x _2 和 x _3(图片由作者提供)

和前面一样, y 1,x 2,****x ***** 3ϵ 都是大小为【n×1】的列向量。

这一次,我们假设 y 被精确测量,但是x** _ 3包含测量误差。具体来说,x** _ 3代表变量的确切值但观测值是 x _3。还是和以前一样,我们将假设观察值中的误差是以零为中心的、正态分布的和可加的。由此,我们可以对x*** _ 3说如下:******

*x _3 测量有附加误差 δ (图片由作者提供)

δ 是测量误差。我们假设它围绕一个零均值正态分布,即δ**~ N(0,* σ _ δ )。*****

为了评估这种测量对模型运行特性的影响,我们将采用与 y 相同的调查方法。让我们将等式(5)代入等式(4)给出的回归模型,并将各项稍微重新排列如下:

包含测量不完全的回归变量的线性模型(图片由作者提供)

与等式(3)中的模型一样,该模型也包含复合误差项(【ϵ—*【β_ 3 【δ)。我们不应该被误差中的负号所迷惑,认为合成误差小于原始模型的误差项 ϵ 。不一定更小,因为它的值取决于 ϵβ_3δ的符号。事实上,正如我们马上会看到的,从绝对意义上来说,它可能比原始模型的误差更大。

**误差(ϵ—β_ 3 δ)大概独立的随机变量 ϵδ的线性组合。 我们还假设 δϵ 各自正态分布在一个零均值附*。因此,我们可以使用与之前相同类型的分析来计算复合误差的平均值和方差(【ϵ】—【β_ 3 【δ)。具体来说,我们可以证明,合成误差项(****)ϵ—β_ 3 δ)也是围绕一个零均值正态分布的,它的方差为 (σ _ϵ + β _3σ _δ)。

回归变量的测量误差对模型的影响

等式(6)中的模型的合成误差的方差 (σ _ϵ + β _3σ _δ) 表明对所得模型的以下影响:*

  1. 由于 (σ _ϵ + β _3σ _δ) 中的所有量都是非负的,所以合成误差至少与原始模型的误差项的方差、σ _ϵ 一样大(实际上通常更大)。这使得回归项中包含测量误差的模型(即等式(6)中的模型)的预测区间比精确模型的预测区间更宽。这个结果类似于我们之前看到的在响应变量 y 中包含测量误差的模型。***
  2. ****误差方差的大小与 β_3、的绝对值的大小成正比,而绝对值的大小又是 x _3 (包含测量误差的变量)与 y 相关程度的度量。如果从这个角度来看,这一发现似乎很直观:如果高度相关的回归变量包含测量误差,那么模型的精度会比不相关的变量包含测量误差时受到更严重的影响。
  3. 观察#2 有另一面。即使是一个不相关的变量,当它被错误地测量时,也会在一定程度上导致最终模型的精度损失。因此,如果你对一个变量的相关性有所怀疑,并且它也很可能难以精确测量,你可以通过简单地将它去掉来帮你的回归模型一个忙。
  4. 最后,误差方差的大小与x**_ 3中测量误差的方差有多大成正比。测量的x****_ 3*越不精确,得到的模型中的误差方差越大。这似乎很直观。***

回归变量和测量误差之间的相关性

再次考虑理论精确值x*** _ 3*,其不完全观测值x_ 3,以及测量误差 δ 之间的以下关系:*******

*x _3 测量有附加误差 δ (图片作者提供)

有两个有趣的场景需要考虑:

  1. 测量误差 δ而不是与观测值 x _3。
  2. 测量误差 δ 与观测值x***_ 3相关。***

回想等式(6)中的模型:

包含测量不完全的回归变量的线性模型(图片由作者提供)

我们通过将原始模型中的 x _3 替换为(x_ 3—)得到这个模型。在上述模型中,x_ 2x*_ 3与原模型的误差项**【ϵ】不相关。

让我们来看看上面两个场景中的第一个。

x_ 3不是δ相关。

由于x****_ 3也与误差项**【ϵ不相关,这就意味着x****_ 3与合成误差项(——**β_ 3 这样,等式(6)中的 ,x _3 继续保持外生。通常没有令人信服的理由相信模型中的其他回归变量(在这种情况下,x_ 2)会与x _ 3中的测量误差相关,即【δ***。因此,模型(6)中的所有回归变量都是外生的。此外,我们之前表明,等式(6)中模型的复合误差项是以零为中心的。等式(6)中的模型可以使用 OLS 一致地估计,估计的系数没有偏差。***

现在考虑第二种情况。

x_ 3 与 δ 相关**

由于 δ 是本模型中误差项的一部分,这使得x****_ 3***内生 ,即x*_ 3*正相关这个模型不能再用 OLS 来持续估计了。*****

由内生的×内生的* _3 组成的第二个场景产生了另一个不幸的红利。由于与**_ 3相关的误差δδ隐藏在复合误差项中,因此δ实际上扮演了省略回归变量的角色,导致 省略变量偏差 ,即任何使用 OLS 估计模型的尝试都将导致估计的系数系统地偏离*******

衰减偏差

还可以看出,估计系数中的这种偏差趋向于零。也就是说,由 OLS 估计器估计的β值被降低或向零衰减,使它们小于真实值。这被称为衰减偏差,它会导致实验者认为回归变量在解释响应变量的方差方面不如实际有效。**

所有系数,而不仅仅是易出错变量的系数,都会受到这种衰减偏差的影响,无论样本大小或均衡程度如何,偏差都不会消失。

那么,当回归变量之一被不完美地测量时,实验者应该做什么呢不完美的程度恰好与测量值相关?

救济方法

幸运的是,情况并非没有希望,因为有一些补救措施:

  1. 简单而懒惰的做法是接受最终模型的内生性和估计系数的偏差。如果预计误差和观察值之间的相关量很小,这是一个非常合理的选择。这通常是实验者的判断要求,因为测量误差不能直接观察到。
  2. 面板数据模型 中,如果易错变量不随时间变化,可以简单地将其从模型中差分出来。
  3. 人们可以识别一个或多个 工具变量【IV】对于易出错的内生变量,用 IVs 替换易出错的变量,并使用 IV 估计器如 2 阶段最小二乘法 一致地估计所得模型。

关键要点

  • 测量误差可以(并且经常)渗入回归模型的响应变量和解释变量中。
  • 在线性模型的情况下,响应变量的测量误差通常不是大问题。仍然可以使用最小二乘法对模型进行一致的估计(或者在模型具有仪表化变量的情况下,使用 2 阶段最小二乘法)。
  • 如果误差在解释变量中,只要误差与变量的观测值不相关,模型仍然可以使用 OLS(或 2 阶段 OLS)进行一致估计。
  • 在所有情况下,测量误差都会增加模型误差项的方差,从而导致预测区间变宽,模型预测精度降低。精确度的损失与测量响应变量或解释变量的不精确程度成正比。
  • 如果高度相关的回归变量包含测量误差,模型的精度会比不相关的变量包含测量误差受到更严重的影响。
  • 如果你怀疑一个变量的相关性,并且它也可能很难精确测量,你可以通过简单地把它去掉来帮你的回归模型一个忙。
  • 如果错误地测量了一个或多个解释变量,并且测量误差与该变量的观察值成比例,则该变量是内生的。使用 OLS 估计器不能对该模型进行一致的估计,任何这样做的尝试都将导致系数估计偏向零,即衰减。
  • 当面对上述情况时,通常的补救方法是要么接受偏差,要么区分出易错变量,要么确定工具变量来代替易错变量。

进一步阅读的建议

******

参考文献、引文和版权

形象

本文中所有图片的版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。

如果你喜欢这篇文章,请关注我的Sachin Date获取关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。******

人工智能生成图像的新兴世界

原文:https://towardsdatascience.com/the-emerging-world-of-ai-generated-images-48228c697ee9

神经网络如何让人工智能成为艺术家

斯蒂夫·约翰森在 Unsplash 上拍照

通常,整个月我都喜欢看一些数据科学方面的新闻,看看有什么变化,或者发现一些我还没有看到的有趣的东西。然而,在过去的一周里,我没有做任何搜索。这次,我的女朋友一直在谈论她最喜欢的几个 YouTubers 用户使用流行的 ai(Dall-E 和 Midjourney)创建图像,或者他们正在要求他们的粉丝创建并发送图像给他们。不管怎样,她一直在谈论这些人工智能如何根据文本提示创建图像。有些成功了,有些却有奇怪的适应。不管怎样,她告诉我这项技术是多么迷人。我们两个都不知道人工智能是如何基于文本创建图像的,所以我认为这是一件有趣的事情。

在本周的文章中,我计划深入研究人工智能如何根据文本提示创建图像。因为技术仍在发展,这将是一个很高的水平,但我认为了解它是如何工作的仍然会很有趣。首先,我想从人工智能如何创建图像以及它可以使用的方法开始。接下来,我们将更详细地看看这些方法。最后,我将列出我对人工智能(特别是 Dall-E)的一些问题的一些答案。所以不再拖延,让我们来谈谈人工智能生成的艺术。

人工智能如何被用来创建图像

几十年来,计算机科学家一直在使用机器学*来训练计算机理解世界。计算机通过过滤图像来学*特定物体和物品之间的差异。下一步是学*创建图像。但是人工智能如何创造图像呢?正如你可能猜到的,这是一个复杂的过程。为了生成图像,机器使用两个神经网络。第一神经网络用于基于用户输入的文本创建图像。第二神经网络用参考图像分析生成的图像。通过比较照片,它会创建一个分数来确定生成图像的准确性。分数被发送回原始的 AI 系统,该系统可以返回另一个分数的更改图像。系统将继续对相似性评分,直到生成的图像与对照图像匹配。最终的匹配将是用户看到的生成的图像。

图像生成的一种方法是神经风格转移(NST)。NST 使用一组算法将现有图像重新创建为新的样式。例如,您使用一个输入图像(比如 Marilyn Monroe 的照片)和一个样式图像(比如 Pablo Picasso 的哭泣的女人)。输出将是玛丽莲梦露在哭泣的女人的风格。然而,这使用预先存在的图像来工作,所以它不是真正的人工智能生成的。而是像加了一个滤镜,和 Instagram 的滤镜工作原理很像。要让一个人工智能真正只通过文本提示来创建一个图像,你可以使用一个称为生成式对抗网络(GAN)的人工智能架构。因为 GANs 可能更难解释(至少在我看来),所以让我们深入了解一下这个架构的更多细节。

什么是生成性对抗网络

在人工智能领域,生成对抗网络(GANs)是目前最类似于人类艺术家的东西。在这种类型的模型中,神经网络有两个角色:批评家(或鉴别者)和生成器。如前所述,生成器将负责遵循提示并创建图像。它学*样式和内容,这允许它混合样式或在它们之间插入。然后可以从头开始生成图像。批评家从现存的艺术和图像中学*。这个知识数据库用于与生成器创建的图像进行比较,以确定它是否看起来像是由人类创建的。批评家试图发现这个假图像,然后把它送回娱乐场所。在每一轮中,生成器学*和改进如何欺骗评论家相信艺术是真实的,然后可以用作最终结果。这个过程可以通过许多提示来重复,以获得大量的参考资源。这样,人工智能可以随着每一个条目学*和成长。

为了生成图像,生成器本质上是创建假数据。目标是传递真实的输出。训练发电机的 GAN 部件包括:

  • 噪声输入向量
  • 生成器网络(将随机输入转换为数据)
  • 鉴别器网络(对生成的数据进行分类)
  • 发生器损耗(当发生器不能成功欺骗鉴别器时,它将作为一种加强形式来惩罚发生器)

当鉴别器返回一个分数时,反向传播用于在计算权重对输出的影响后,在正确的方向上调整权重。它还可以用来获得可以改变发生器权重的梯度。

接下来,更多关于鉴别器。要确定一个图像是真是假,需要测试数据。测试数据来自两个不同的来源:

  • 真实数据图像,即用作正面数据的真实照片或绘画
  • 来自发生器的假图像被用作负数据

与生成器因没有欺骗鉴别器而受到处罚一样,鉴别器也因错误地对真实和虚假数据进行分类而受到处罚。它还使用反向传播来衡量鉴频器网络中的鉴频器损耗。

双方都接受了训练,对抗赛开始了。生成器试图欺骗鉴别器,每次尝试都变得更好,鉴别器对真实或虚假数据进行分类,也在每个错误分类的数据点变得更好。

尽管我们还可以了解更多,但在继续之前,让我们快速浏览一下训练 GANs 的步骤:

  • 定义问题
  • 选择您想要使用的 GAN 架构
  • 使用真实数据训练鉴别器
  • 使用生成器来创建假数据
  • 用假数据训练鉴别器
  • 使用鉴别器的输出训练发电机

现在我们对 GANs 有了更多的了解,让我们来看看我所研究的特定 AI 的一些有趣之处。

关于人工智能生成图像的更多信息

就像其他机器学*方法一样,机器在最大程度上不受人类干扰的情况下自主学*。这意味着当您看到生成的图像的最终输出时,它可能不是唯一的图像分组。可能还有更多你看不到的,因为它们的分数不够高,生成器无法返回它们。就局限性而言,机器正在自我训练。这意味着数据并不总是准确的。计算机不理解它看到的图像,因为它不能像我们一样“看到”图像。它也不能区分它“应该”或“不应该”创造什么。所以有局限性,但是技术在发展。

然而,一个限制是你的创造力。因为机器不知道它应该或不应该创造什么,它会试图制造你给它的任何东西。所以任何你能想到的提示。现在,它们并不总是看起来“好”,就像 Dall-E 的情况一样。Dall-E 的一些图像确实令人惊叹。但是其他的可能看起来有点恐怖。都是在学*过程中。对于 Midjourney,基于“人”的图像几乎没有那么多。它能创造的风景确实很美,但图像更有“风格”,看起来更像油画而不是照片。

我想知道的最后一个问题是人工智能如何获得如此大量的数据。但答案并不完全清楚。一些人工智能只能访问计算机科学家给他们的东西。其他人工智能使用网络抓取来访问数十亿张照片以供参考。字幕也是在学*过程中被抓取和使用的。这些图片是通过标题来识别的,所以它知道特定图片应该配什么样的标题。这样,文本输入,也就是标题,就可以根据标题“应该”配什么样的图像来生成。

还有很多东西要学,但现在,我想这总结了我的研究。

结论

在今天的文章中,我们了解了人工智能如何创建图像。讨论的第一种方法是 NST(神经类型转移)算法。这些算法采用预先存在的图像,并将它们转置成第二输入的样式。我们讨论的第二种方法是用于两个神经网络的 GANs(生成对抗网络)。这些类型的方法使用一个神经网络作为生成器,第二个作为鉴别器。生成器用于基于输入字幕创建图像,而鉴别器将生成的图像分类为真实或伪造。假图像被发送回训练生成器来欺骗鉴别器,当成功欺骗时,最终图像可以显示给请求提示的用户。仍然有很多限制,但是人工智能的世界在过去的几十年里已经发展了很多。我们今天也只看了两种方法,但是还有很多其他的方法。然而,就目前而言,对这两者的研究让这一周变得相当有趣。

我希望你觉得这很有趣,也希望你对人工智能生成的图像世界有所了解。下次见,干杯!

用我的 每周简讯 免费阅读我的所有文章,谢谢!

想阅读介质上的所有文章?成为中等 成员 今天!

查看我最*的一些文章

https://miketechgame.medium.com/examining-behavior-driven-development-5db006edfee5 https://python.plainenglish.io/medium-has-an-api-605b51037b52 https://python.plainenglish.io/the-painful-journey-to-find-a-markdown-editor-15bd1cd370e2 https://medium.com/mlearning-ai/a-deeper-dive-into-neural-networks-71b73e7e4364

参考资料:

https://www.artaigallery.com/pages/what-is-ai-generated-art https://bernardmarr.com/artificial-intelligence-can-now-generate-amazing-images-what-does-this-mean-for-humans/ https://www.techtarget.com/searchenterpriseai/definition/generative-adversarial-network-GAN https://www.simplilearn.com/tutorials/deep-learning-tutorial/generative-adversarial-networks-gans https://www.theguardian.com/culture/2022/jun/09/what-exactly-is-ai-generated-art-how-does-it-work-will-it-replace-human-visual-artists

ML 传感器的新兴世界

原文:https://towardsdatascience.com/the-emerging-world-of-ml-sensors-7b6801a054c5

播客

Matthew Stewart 谈边缘设备检测的新模式

苹果 | 谷歌 | SPOTIFY | 其他

编者按:TDS 播客由 Jeremie Harris 主持,他是 Gladstone AI 的联合创始人。每周,Jeremie 都会与该领域前沿的研究人员和商业领袖聊天,以解开围绕数据科学、机器学*和人工智能的最紧迫问题。

今天,我们生活在 AI 缩放的时代。似乎无论你看哪里,人们都在推动大型语言模型变得更大,或者更多模态,并利用不可思议的处理能力来做到这一点。

尽管这是现代人工智能时代的定义趋势之一,但它不是唯一的趋势。与超大规模变压器和巨型密集网络世界截然相反的另一个极端是快速发展的 TinyML 世界,其目标是将人工智能系统打包到小型边缘设备上。

我今天的嘉宾是 Matthew Stewart ,他是哈佛大学的深度学*和 TinyML 研究员,在那里他与世界领先的物联网和 TinyML 专家合作,开展旨在让小设备用人工智能做大事的项目。最*,Matt 和他的同事共同撰写了一篇论文,介绍了一种新的感知思维方式。

这个想法是将机器学*和传感紧密集成在一个设备上。例如,今天我们可能会在边缘设备上嵌入一个像摄像头这样的传感器,摄像头必须将视野中所有像素的数据发送回中央服务器,中央服务器可能会获取这些数据并使用它来执行面部识别等任务。但这并不好,因为它涉及到从边缘设备向服务器发送潜在的敏感数据——在这种情况下,是人脸图像——从而带来安全风险。

因此,如果相机的输出在边缘设备上处理,那么所有必须发送到服务器的信息都是不太敏感的信息,如是否检测到特定的人脸,会怎么样?这些系统——边缘设备利用板载人工智能,只与世界其他地方共享处理后的输出——就是马特和他的同事们所说的 ML 传感器

ML 传感器确实看起来像是未来的一部分,它们引入了一系列具有挑战性的道德、隐私和操作问题,我在这一集的 TDS 播客中与 Matt 讨论了这些问题。

以下是我在对话中最喜欢的一些观点:

  • 大多数现代智能设备本身并不智能。虽然他们收集各种传感器数据,但他们通常不会自己处理这些数据。相反,他们通常将它发送到一个中央服务器,该服务器应用任何需要的算法。这种方法有一个明显的缺点:它迫使开发人员通过云将传感器数据从传感器发送到服务器——这一过程可能导致拦截或数据损坏。但它目前是默认的,因为历史上很难将视觉、机器人控制或语言模型打包到内存和处理能力有限的边缘设备上。
  • 亚马逊 Echo 和 Google Home 实际上具有与 ML 传感器概念相匹配的功能。这些设备通常具有板载算法,该算法允许它们检测何时给出提醒注意的命令(例如“Ok Google”),并且一旦听到该命令,它们就继续将用户的查询转发给中央服务器,该中央服务器可以执行响应用户的查询所涉及的繁重工作。在这种情况下,“ML 传感器”将是 Google Home 的麦克风和它的“Ok Google”识别软件的组合。
  • Matt 使用面部识别的例子来说明 ML 传感器范例。目前,我们认为传感器是“向我们强大的处理器提供原始数据的东西”——像相机这样的东西非常符合这一描述。但是想象一下,你可以买一个“面部检测器”,而不是买一个摄像头,这是一个集成设备,将摄像头与机载面部识别模型相结合,其整体输出不是图像,而是一个结论(“Jeremie 的面部被检测到了!”或者“没有检测到杰瑞米的脸。”)
  • ML 传感器可能比传统传感器更难表征。这是因为它们可以包含硬件和软件的任何组合,任何传感器,以及应用于该传感器输出数据的任何模型。对传感器板载软件的任何更改都会对其性能特征产生重大影响。

章节:

  • 0:00 介绍
  • with TinyML 特别挑战
  • 9:00 马特工作中最具挑战性的方面
  • 12:30 毫升传感器
  • 21:30 定制技术
  • 24:45 数据表和 ML 传感器
  • 31:30 客户拥有自己的定制软件
  • 36:00 访问算法
  • 40:30 总结

绘制桑基图的本质

原文:https://towardsdatascience.com/the-essence-of-drawing-sankey-plot-491fb2cb234

我想分享两种用纯 Python 生成 Sankey 图最重要部分的方法

图片来自作者自己的研究论文

Sankey plot 是一种非常好的、简洁的方式来可视化值如何从源类别流向目标类别。在上面显示的左图中,我使用了 Sankey 图来展示每个造血群体(干细胞、红系祖细胞)如何根据其突变谱进一步分为更细的亚群体。除了这个例子之外,桑基图也被广泛用于显示能量流变化、关于活动的统计等等。

虽然有几个现成的软件包可以在一行中绘制桑基图(即 pySankey 、 Plotly 、 networkD3 ),但我发现弄清楚桑基图实际上是由什么组成的是一个非常有趣的练*,这样我们就可以从头开始制作自己的桑基图,并进行所需的修改。

如果我们将一个复杂的 Sankey 图分成几部分,我们会发现最重要的部分只是两个垂直的条(矩形),分别代表左侧和右侧每个类别的数量,以及连接这两个矩形的曲线。今天分享两种在 Matplotlib 包中绘制这些零件的图的方法。

本教程中的代码可以在这里找到。

设置网格和边栏

首先,我们需要在两边画出矩形,这个任务可以从不同的角度来看。一种方法是将它们视为两条线之间的区域,这样我们可以使用ax.fill_between函数来填充颜色。另一种方法是将它们视为独立的矩形,并利用matplotlib包中内置的Rectangle补丁。在这里,让我们使用第二种方法进行演示,但是您也可以尝试第一种方法。

from matplotlib.patches import Rectangle
fig,ax = plt.subplots()
ax.set_xlim([0,1])
ax.set_ylim([0,1])
ax.grid()

作者图片

在指定了画布和我们要绘制的轴之后,我们可以开始绘制这两个矩形。如果你不熟悉 canvas(fig)和 ax,也许我之前的教程集能有点帮助。

rec_left = Rectangle(xy=(0.1,0.6),width=0.2,height=0.2,facecolor='orange',edgecolor='k')
ax.add_patch(rec_left)rec_right = Rectangle(xy=(0.7,0.2),width=0.2,height=0.2,facecolor='green',edgecolor='k')
ax.add_patch(rec_right)

作者图片

方法 1:使用 Matplotlib 路径对象

接下来的任务是绘制曲线条带,我想先介绍一下 Matplotlib 中强大的Path模块。这个模块有时被认为是一个低级 API,但它实际上是 Python 中最常用的可视化的基础,因为一切都可以归结为涂鸦,对吗?

Path模块允许你随意绘制任何形状的线条,这是由两个参数控制的,按照惯例命名为vertscodesverts是一个 2D NumPy 数组或嵌套列表,其中每个元素都是一个元组,这个 2D 数组的每个元素或每一行都代表锚点的(x,y)坐标,这样,如果你想用 5 个锚点画一条线,你的vert的长度应该是 5。同时,codes参数定义了在画线时如何解释每个锚点。让我们看一个简单的例子:

from matplotlib.path import Path
from matplotlib.patches import PathPatchverts = [(0.3,0.8),(0.5,0.8),(0.7,0.4),(0.3,0.6),(0.3,0.8)]
codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]
p = Path(verts,codes)
ax.add_patch(PathPatch(p,fc='none'))

剧情会看那个:

作者图片

我希望这个例子能让你了解vertscodes是如何合作完成任务的。然而,正如你所看到的,到目前为止,我们仍然只是处理直线,那么我们希望绘制的曲线呢?

您可以在codes列表中包含另外两个名为CURVE3CURVE4的代码。CURVE3代表我们所说的二次贝塞尔曲线,而CURVE4代表三次贝塞尔曲线。如下图所示:

作者图片

如果你想画一条二次贝塞尔曲线,你需要指定三个锚点(CURVE3)和中间的一个来控制曲率。类似地,你总共需要四个点来画一个三次贝塞尔曲线(曲线 4)。我们将使用 CURVE4 进行条带可视化。

verts = [(0.3,0.8), (0.5,0.8), (0.5,0.4), (0.7,0.4)]
codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4]
p = Path(verts,codes)
ax.add_patch(PathPatch(p,fc='none',alpha=0.6))

作者图片

现在,我们如何实现最终目标变得更加清晰,代码如下所示:

verts = [(0.3,0.8), (0.5,0.8), (0.5,0.4), (0.7,0.4), (0.7,0.2), (0.5,0.2), (0.5,0.6), (0.3,0.6), (0.3,0.8)]
codes = [Path.MOVETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.LINETO, Path.CURVE4, Path.CURVE4, Path.CURVE4, Path.CLOSEPOLY]
p = Path(verts,codes)
ax.add_patch(PathPatch(p,fc='red',alpha=0.6))

方法 1:使用路径对象。

方法 2:使用 Numpy 卷积

另一种思考条带的方式是将它重新构建为一个信号处理问题,这个想法来自于 pySankey 包的实现。当给定两个信号f(x)g(x)时,线性卷积算子可以总结出信号g(x)对信号f(x)的影响,从而得到卷积信号函数f(x)*g(x)。这个函数已经被实现为numpy.convolve,它是如何计算的在这篇文章中有很好的说明。请注意,这里我们使用了mode='valid',因此只计算两个信号完全重叠的位置。

卷积如何帮助生成曲线带?

按照这个逻辑,我们可以修改我们的代码:

yu = np.array(50*[0.8] + 50*[0.4])
yu_c = np.convolve(yu, 0.05*np.ones(20),mode='valid')
yu_cc = np.convolve(yu_c, 0.05*np.ones(20),mode='valid')
yd = np.array(50*[0.6] + 50*[0.2])
yd_c = np.convolve(yd, 0.05*np.ones(20),mode='valid')
yd_cc = np.convolve(yd_c, 0.05*np.ones(20),mode='valid')
ax.fill_between(np.linspace(0.3,0.7,62),yd_cc,yu_cc,color='blue',alpha=0.6)

我们基本上对上面的虚拟例子做了两次同样的事情,第一次是对上半部分的曲线,另一次是对下半部分的曲线,这样,我们可以利用方便的ax.fill_between函数用想要的颜色填充区域来完成任务。

方法 2:利用数值卷积

结论

好了,就这些了,非常感谢你的阅读,希望你喜欢这个简短的教程。如果你喜欢这篇文章,请在 medium 上关注我,非常感谢你的支持。在我的 Twitter 或 LinkedIn 上联系我,也请让我知道你是否有任何问题或你希望在未来看到什么样的教程!

基本数据科学参考笔记本

原文:https://towardsdatascience.com/the-essential-data-science-reference-notebook-d71ebba922b6

针对 EDA、特征工程、模型拟合等的单一参考

詹姆斯·哈里逊在 Unsplash 上拍摄的照片

我最*完成了内部调动,加入了 Meta 的核心数据科学团队。在与我的同事 Barry Zhang 和 Nicolas Lepore 研究这些采访时,我们发现没有单一的资源用于典型的数据科学编码功能,如 EDA 绘图、数据清理、数据转换、超参数优化、模型拟合、无监督学*等。所以我们决定创造一个。即使在我们的采访之后,我也不断地回头参考这个笔记本,并相信它是常用的 DS 编码函数的最大资源之一。

这篇文章详细介绍了我们笔记本的各个部分,并在底部提供了下载链接,对于那些可能会觉得有用的人来说。

快速免责声明

每个部分出现的顺序通常是这些步骤通常执行的顺序,但并不完美。例如,大多数数据转换,如缩放和一个热编码,应该在将数据分成训练和测试后完成,但为了简单起见,这款笔记本之前就有。

数据检查

第一步是检查数据集。我们感兴趣的是数据的形状和大小,特征的类型(字符串/浮点/整数等)。),这些要素的类的分布或数量,以及是否有缺失或重复的值。

EDA 绘图

一旦我们知道了数据的基本情况,比如列名是什么,有多大,是否有空值等等。我们可以将它形象化,以获得更好的理解。下面,我们使用热图来可视化数据中的相关性,并查看空值的分布中是否存在模式。除此之外,散点图矩阵将显示所有数值的成对散点图网格。对于简单的双变量分析,我们还包括一次性散点图、十六进制图、箱线图、计数图和直方图。

散点图矩阵,图片由作者提供

数据清理

现在我们将注意力转向空值、重复值和异常值。对于空值,找出导致空值的原因并查看它们是否随机分布总是很重要的。然而,在访谈的短时间内,通常可以用均值/中值(对于连续特征)或众数(对于分类特征)快速估算。更高级的技术包括用剩余的特征建立一个模型来预测空值,但是这通常不会在面试或带回家的作业中出现。

如果空值的数量相对于数据集的大小来说很小,并且它们是随机分布的,我们也可以像通常处理重复项一样删除它们。

虽然基于树的模型或神经网络对异常值相当稳健,但对线性模型进行 winsorize 是个好主意。我们提供了 3 个函数,用于基于以下内容裁剪裁剪异常值:

百分位数: 例如,剪切高于第 99 个百分位数截止值和低于 1%截止值的所有值。 标准差: 裁剪所有偏离平均值超过 3 个标准差的值。 四分位范围: 裁剪所有值 1.5IQR 之外的 IQR 的上下界(旁注:Shivam Chaudhary 有一个很大的* 文章 关于我们为什么用 1.5 作为比例因子)

数据转换

在拟合模型之前,我们必须获得可用形式的数据。这通常涉及对分类和/或连续特征的某种特征变换。我们首先使用。select_dtypes()方法。

对于连续要素,如果我们使用的线性模型本身无法拟合非线性趋势,我们可能希望生成多项式要素。使用 StandardScaler 或 MinMaxScaler 缩放数字要素也是一个好主意,这将有助于模型更快地收敛,并且在进行正则化(如 Lasso 和 Ridge 回归)时是必要的,因为这会影响系数的大小。最后,您可能希望通过选择 1/0 截止值的阈值将连续要素转换为二进制(“二进制化”)。

对于分类特征,几乎所有用 Python 编写的学*算法都不能使用字符串特征,所以我们需要对列进行一次性编码。在这个过程中,我们使用 sklearn 中的 OneHotEncoder 类将一个字符串特性转换为一系列 1/0 指示列,用于特性的每个类。我们包括“drop =‘first’”参数,以避免虚拟变量陷阱。

然而,并不是每个人都喜欢使用 sklearn 进行这些转换,所以我们也为下面的分类变量提供了标准缩放、最小-最大缩放、一次热编码和二进制化的替代方法。

最后,如果在 EDA 过程中,您观察到存在较大的标注不平衡,则可能有必要对数据集进行上采样或下采样,以强制这些类得到更平等的表示。有更复杂的方法来实现这一点(过采样:SMOTE & ADASYN 算法,欠采样:Tomek 链接和基于聚类),但同样是为了采访或带回家作业的目的,只采取随机样本替换就足够了。

监督学*

现在我们可以开始建模过程了。Sklearn 的 API 是标准化的,每个建模过程本质上都是:

model = Model()
model.fit(X_train, y_train)
model.predict(X_test)

下面我们从 sklearn 和 xgboost 中导入并实例化一些最常见的模型,以及它们的一些主要超参数。

我们在模型中使用的上述超参数是任意选择的。可能需要执行网格搜索,为该模型和数据集选择最佳超参数。这里我们展示了一个简单的网格搜索,使用 GridSerachCV 库为随机森林分类器挑选最佳的 n 估计值最大深度超参数。实际上,全网格搜索是相当计算密集型的,所以最好选择随机网格搜索或贝叶斯搜索,正如 Maria Gorodetski 在她的文章中所描述的。为了简单起见,我们只展示了一个简单的网格搜索,参数很少。

如果我们不进行交叉验证,通常我们会将我们的数据分成训练和测试,以训练模型,然后根据以前从未见过的数据对其进行评估,以获得对其性能的公平评估。Sklearn 的 train_test_split 是实现这一点的完美函数,如下所示:

一旦我们训练好了模型,我们就用它来预测测试集的值。对于回归,我们可以看看 r、MSE 和 MAE。对于分类,我们有准确度、精确度、召回率、F1 和 AUC。Sklearn 还有一个方便的功能,如果给定模型,它将绘制 ROC 曲线,并测试特征和标签。

sklearn 的 ROC 曲线,图片作者

虽然 sklearn 是用于 ML 的最普遍的库,但是它的线性和逻辑回归的输出在某种意义上是有限的,因为它们只给出特征的系数。Statsmodel 将提供系数及其 p 值和其他有价值的信息,如 F 统计量、德宾-沃森统计量、AIC、BIC、r、调整后的 r 等。

使用随机森林模型,我们无法像使用线性模型那样获得系数,但我们能够提取特征重要性:

无监督学*

为了使笔记本更加完整,我们简单地加入了一些无人监管的技术。主成分分析(PCA)有助于降低数据集的维数,同时仍然保留其中的大部分信息。这可以帮助可视化数据,组合相关的特征,并加速大型学*算法的训练。在下面的代码片段中,我们将数据集“X”缩减为两个组件,并绘制它。

最后,我们以 KMeans 聚类结束。除非你有一个源于领域知识的理由来选择 kmeans 的集群数量,否则在实践中大多数人使用如下所示的肘方法。在这种方法中,通过惯性(数据点到它们最*的聚类中心点的平方距离的总和)来绘制聚类的数量,并选择图中扭结处的聚类的数量。

一旦选择了聚类的数量,拟合和预测与 sklearn 中的其他模型相似,只是它没有标签,因为这是无监督的学*。

上面的代码是从几十本书、无数 Kaggle 提交的内容和多年的经验中提炼出来的。其中没有一个非常优雅或复杂,但它为大多数数据科学函数提供了一个极好的参考。你可以从 my 或者 Barry 的 Github 下载完整的 Python 笔记本。要完全访问 Medium,请单击此处的!

数据科学职业公开演讲的要点

原文:https://towardsdatascience.com/the-essentials-of-public-speaking-for-a-career-in-data-science-b0d8ea6402ec

数据科学

关于如何提高你作为数据科学家的公开演讲技巧的一些建议

凯恩·莱因霍尔德森在 Unsplash 上的照片

数据科学是一个相对较新的领域,公众演讲对于任何想在这个领域发展的人来说都是一项基本技能。清晰有效地交流复杂数据概念的能力对于数据科学的成功至关重要。

如果你是数据驱动型的,并且希望促进你在科学领域的职业发展,公开演讲是获得关注的一个很好的方式。但是你具体是怎么做的呢?我们已经掌握了数据科学公开演讲的基本要素,因此您可以在下一次会议上引起轰动。

这篇文章的内容受到了 DataTalks 的播客插曲的启发。与 DataRobot 首席人工智能策略师本·泰勒一起参加了名为数据科学职业公开演讲要点的俱乐部。

文章组织如下:

  • 建立你的心态
  • 入门指南
  • 组织一次谈话
  • 需要掌握的顶级公共演讲技巧

建立你的心态

有许多不同的方式参与数据科学,但最重要的方式之一是推广人工智能,这涉及到试图说服你,你的公司需要人工智能

作为一名数据科学家,你有机会成为推动人工智能及其改变世界的潜力的强大声音。这意味着你有责任教育其他人什么是人工智能,以及它如何被用来做好事。你可以通过写博客、发表演讲,甚至只是和有兴趣了解更多的人交谈来做到这一点。

无论你使用什么平台,你的目标应该是提供关于人工智能及其潜在影响的准确信息。尊重不同的观点并开放讨论也很重要。毕竟,数据科学仍然是一个年轻的领域,我们对它的潜力还有很多不了解的地方。

通过参与促进人工智能,你可以帮助塑造这个令人兴奋的领域的未来,并确保它用于造福所有人。

入门指南

要成为一名伟大的演说家,你能做的最重要的事情就是练*,练*,再练*。你在观众面前站得越多,你说话就越自如。此外,在每次演讲前做好充分准备也很重要。对你的材料了如指掌,这样你就可以专注于传达你的信息,而不是担心你接下来要说什么。最后,记住自信是关键。散发自信,你的听众会相信你和你的信息。

更详细地说,要成为一名伟大的演说家,你应该遵循以下步骤:

  • 确定你的定位。你对数据科学的什么感兴趣?你是哪方面的专家?一旦你知道你的重点,开始在会议上推销你的想法。保持你的演讲简短而甜蜜——你不想用太多的信息淹没组织者。
  • 练*。你对你的材料越放心,你就越能吸引你的观众。如果可能的话,录下你自己的演讲并回放——这将有助于你发现任何需要改进的地方。
  • 与人交往。你越真诚、越热情,就越有可能给你的听众留下持久的印象。所以,走出去,向世界展示数据科学是什么!

作者图片

此外,你应该非常注意观众的反馈,因为这是一个参考点。你需要在演讲结束后和听众商量,找出答案。你不会让每个人都开心的。总会有一些人不喜欢这个演讲,或者他们会受到一些批评。

组织一次谈话

组织演讲最成功的方法之一就是把它变成一个故事。你可以通过关注以下几个方面来做到这一点:

  • 获得关注
  • 被记住
  • 观众反馈

下图总结了如何组织讲座:

作者图片

获得关注

在做陈述或演讲时,引言通常是最重要的部分。这是你留下良好第一印象的机会,并为你接下来的谈话定下基调。

当你开始一个演讲时,你吸引了所有听众的注意力,但他们会很快决定是拿出手机、笔记本电脑,还是放弃。

本·泰勒

造成差异的最重要的事情之一是第一印象。有不同的方法可以吸引观众的注意力,包括但不限于:

  • 讲故事
  • 幽默
  • 个人故事
  • 轶事
  • 令人惊讶的事情

按照本·泰勒的说法,你应该 给他们一个听你话的理由 。一个更好的方法,也是非常困难的,是跳到一个故事中,让观众断定你是那个故事的英雄。这允许你征服观众的情绪。

在构思你的介绍时,有一些关键的事情要记住:

  1. 言简意赅。你最不想做的事情就是用冗长的介绍让你的听众厌烦。抓住要点,让他们体验一下接下来会发生什么。
  2. 自信。在大型演讲前感到紧张是完全正常的,但不要表现出来。慢慢地、有意识地说,对你的声音和肢体语言表现出自信。
  3. 一开始就钩住它们。砰的一声开始!讲一个笑话,分享一个有趣的事实,或者问一个修辞性的问题,从一开始就吸引你的听众。
  4. 设置舞台。就你演讲的主题提供一些简短的背景信息,这样每个人都能理解。
  5. 戏弄即将到来的事情。让你的观众先睹为快,激发他们的兴趣。

被记住

当你做演讲时,你希望别人记住你的好想法和深刻见解,而不是你紧张不安的坐立不安或“嗯”。这里有一些小技巧可以帮你留下持久的印象。

  1. 眼神交流:这听起来很简单,但是和你的观众进行眼神交流是和他们建立联系的最好方式之一。
  2. 使用肢体语言:你的肢体语言应该传达自信和放松。避免交叉双臂或双腿,尽量保持双手放松。
  3. 说话清晰:一定要吐字清晰,语速适中。这将有助于确保你的听众理解你,并且不会迷失在试图理解你所说的话中。
  4. 微笑:真诚的微笑会让你看起来平易*人,讨人喜欢——这两种品质会让你的演讲更加成功。
  5. 做好准备:增强自信的最好方法之一就是为你的演讲做好充分准备。对你的材料了如指掌,这样你就可以专注于有效地传递它,而不是担心接下来会发生什么。

观众反馈

如果观众中有人问你一个问题,这意味着你的演示是成功的。但是,可能会出现你不知道某个问题的答案的情况。在这种情况下,本·泰勒建议不要试图回答,相反,你可以说,“观众中还有人知道答案吗?”或者“我们以后再谈这个。我很想听听你的观点。”然后继续下一个你能回答的问题。

为会议撰写演讲提案

在大型会议上发言之前,你应该从地方会议开始,在那里你可能知道组织者。有时,当你提交一个会议的演讲提议时,你还必须包括一个之前演讲的短片。如果你没有以前的视频,你可以考虑录制一个,并在 YouTube 或类似的网站上发布。

根据本·泰勒的观点,你的演讲应该尽可能有创意。

此外,还应包括:

  • 对你演讲的简要描述
  • 将涉及的主要主题或话题
  • 为什么你认为这很适合这个会议?
  • 您拥有的任何支持材料(例如幻灯片、演示等。)

写一份强有力的提议对让你的演讲被接受是至关重要的。花点时间回顾一下大会的提案征集,确保你的提案符合大会的主题和目标。如果您有任何问题,请随时联系会议组织者。

通常有许多不同的主题可供选择,所以选择一个既有知识性又有吸引力的主题很重要。以下是一些开始谈话的好话题:

  • 数据科学的现状及其发展方向
  • 数据科学在当今世界的重要性
  • 数据科学如何用于解决现实世界的问题
  • 有趣的案例研究或数据科学应用示例
  • 您个人对数据科学的体验

需要掌握的顶级公共演讲技巧

在寻找数据科学职业时,有很多重要的技能需要掌握,但公开演讲绝对是最重要的技能之一。在这个领域,能够有效地交流你的发现和见解是至关重要的,这需要练*来磨练这一技能。以下是一些帮助你开始的提示:

  • 了解你的观众。让你的信息适合那些将会聆听的人是很重要的。考虑他们的理解水平,以及你想让他们从你的演讲中学到什么。
  • 做好准备。这似乎是显而易见的,但它值得重复。确保你对你的材料了如指掌,这样你才能自信而优雅地发表演讲。
  • 使用简单的语言。数据可能很复杂,但你的演示不需要如此。使用每个人都能理解的清晰简洁的语言。
  • 吸引观众。通过使用故事、例子和幽默(在适当的时候)来吸引你的听众。没有人想听一个无聊的讲座,所以确保你让事情保持有趣!
  • 练*,练*,练*!你练*得越多,你在公众演讲方面就会变得越好。

作者图片

摘要

恭喜你!您刚刚学*了数据科学职业公开演讲的基本知识!

公开演讲对于数据科学领域的任何人来说都是一项基本技能。数据科学家经常被要求向客户、经理和其他利益相关者展示他们的发现。能够做一个清晰简洁的演讲,对于你的听众是否理解和接受你的作品来说,是至关重要的。如果你想在数据科学领域提升自己的职业生涯,那就从磨练公开演讲技能开始吧。

这篇文章的内容受到播客插曲的启发,本·泰勒在 DataTalks.Club 发表了《数据科学职业公开演讲的要点

本文的第一个版本最初发布在 DataTalks 上。俱乐部

您可能也对…感兴趣

如何在数据科学领域开始职业生涯

虽然数据科学家的工作可能因行业而异,但他们的职责通常分为三类:A 类、B 类和 c 类。在本文中,我们将探讨数据科学家应该关注的三个主要领域。

数据科学经理和数据科学专家的区别

在本文中,我们将探讨每个选项的优缺点,以帮助您为您的组织做出决策。

如何建立数据科学团队

建立一个数据团队可能是一个挑战,但通过仔细的规划和执行,这肯定是可行的。在本文中,我们将探讨如何建立一个高效的数据科学团队的一些技巧。

有趣的书…

  • 金德拉大厅——经久不衰的故事:讲故事如何吸引顾客,影响观众,并改变你的业务
  • Al Ramadan,Dave Peterson,Christopher 洛希黑德,Kevin Maney — 玩得更大:反叛者和创新者如何创造新的类别并主宰市场

这些证据对于法律案件的分类至关重要

原文:https://towardsdatascience.com/the-evidence-is-critical-for-classifying-legal-cases-36c1dd6cfd04

识别证据以挖掘法律推理

图片由 Vern R. Walker 拍摄, CC 由 4.0 拍摄。

在任何法律案件中,是证据使案件变得独一无二。同样的证据也决定了哪些其他案件可以被认为是“类似”的案件——而法治要求类似的案件应该得到类似的判决。因此,一个案件中的证据是特定的,但证据的类型往往是通用的,归类为类似的案件。

当事人的律师面对要证明的法律问题,必须决定出示什么证据。他们从以前的类似案例和相关法律规则中寻找指导。为了帮助律师和法官,以及出于其他原因,数据科学家面临着从已公布的案件判决中提取被认为相关和重要的证据的问题。

在这篇文章中,我讨论了什么是法律证据及其在法律推理和辩论中的作用。我还讨论了使机器学*(ML)算法能够从法律判决文件中自动提取重要证据的语言特征。

法律证据的作用和类型

在一个典型的法律案件中,原告一方有举证责任来支持有利于该方的判决。反对方试图破坏证据的可信性或可信度,他们可能会提出更多相反或不一致的证据。反对者也可能提出证据来支持任何提出新的法律问题的肯定性法律辩护。因此,证据可能来自法律案件的各个方面。

证据可以包括证词、文件和物证。证人证言是由证人宣誓后就其所见所闻提供证词,或者由专家证人根据证人的专业知识提供意见。书面证据可以来自各种来源,如医疗或业务记录。物证,如实物,也可以作为证据引入。

一旦法庭裁定所提供的证据与案件相关并可被采纳,律师们就会就被采纳的证据证明的法律问题提出论据。法庭的事实审判者(如陪审团、法官或行政决策者)必须评估该证据的证明价值并得出事实结论。例如,事实的审判者可能不相信证人证词的可信度,或者可能认为某一特定文件的内容是可信的。事实审判者还评估所有证据的证明价值,并就法律问题得出事实结论。

陈述证据的句子

由法庭写下的判决是挖掘证据的良好开端。它通常列举所涉及的重要证据,并且还解释(除非事实的审判者是陪审团)从证据到事实发现的推理。律师和其他研究该决定的人想要确定哪个证据被用来得出哪个发现或结论。根据法律问题,该决定可以生成一个提示性列表,列出在类似案件中需要提供的证据。此外,数据科学家可能会根据证据生成各种类型的法律案件的统计数据。

在法律判决文件中,证据句是主要陈述证人证词或作为证据提出的文件的内容,或者中立地描述证据的句子。证据句子的例子如下(如在由学徒系统公司开发的网络应用中所显示的,蓝色背景颜色表示证据句子,矩形图标表示该句子出现在文档的第 55 段,句子 15 中):

图像由弗恩 r .沃克, CC 由 4.0 。

这句话报告了一个法医的看法。(我的例子来自退伍军人上诉委员会 (BVA)的裁决,该委员会裁决美国退伍军人因服役相关残疾而提出的福利索赔。)

理想情况下,证据句只是报告证据,而不是评估证据。报告和评估之间的这种区别允许我们将证据本身与特定的事实审查员对其证明价值的评估分开。然而,这种区分有时很难适用于整个判决,因为法官可能会将证据报告和对证据的评估合并成一个句子。尽管如此,法官们还是有动机去写那些首先以中立的方式展示重要证据的判决。因此,我们经常能够识别出主要陈述重要证据而没有对其进行评估的句子。

证据句的语言特征

为了识别判决中的证据句,律师使用各种语言线索或特征。通常,句子包含一个提示(一个单词或短语),保证读者将某个命题归因于证据来源。证据归属线索的例子有:“证人作证说、“以专家证人的观点、“在他的报告中,检查医生记下了”如果被归因的内容被标点为引语,则这样的句子成为证据句的可能性增加。

其他语言特征包括句子是否:

紧接在证据记录(例如,听证笔录)中对来源的引用之前或包含在其中;

只包含确定的主语,指特定的人、地点或事物(与关于不确定主语的法律规则相反);

不包含全称量词(如“全部或“任何”);或者

不包含表示义务、允许或禁止的道义性词语或短语(例如,“必须”或“要求”)。

其他特征包括出现在专门叙述证据的段落中。因此,各种各样的语言信号可以表明一个句子正在陈述证据。(更多细节和众多例子,可以查看我在担任霍夫斯特拉定律的定律、逻辑&技术研究实验室(LLT 实验室) 主任时创作并发表的注释证据语句的协议 。)

机器学*结果

正如我们可能期望的那样,给定证据句子的语言特征,ML 算法可以学*识别那些主要陈述证据的句子。我们在 LLT 实验室的 50 个 BVA 判决的数据集上训练了一个逻辑回归模型,该数据集包含预处理后的 5797 个人工标记的句子,其中 2419 个是证据句子。该模型对证据句的分类精度为 0.87,召回率为 0.94。我们后来在同一个 BVA 数据集上训练了一个神经网络(NN)模型,并在 1846 个人工标记的句子上进行测试。证据句的模型精度为 0.88,召回率为 0.95。

我们最*进行的一项研究表明在对更少的标记数据进行训练后,ML 算法可能能够准确地识别证据句子。使用 LLT 实验室的 50 个 BVA 决策的数据集,我们分析了增加训练集规模的影响,从少到一个案例决策到 40 个决策(总共 50 个决策中的 10 个被留作测试集)。使用加权平均 F1 分数作为性能指标,我们发现,在仅仅 5 次决策后,证据句子的训练就获得了远高于 0.8 的 F1 分数,并且分数在此后不久就达到了平台期。我们假设,证据句作为一个类别彼此之间的“语义同质性”可能有助于解释这一结果。

也有理由认为,一旦证据句子被识别,ML 算法可以从中提取关于案件证据的重要信息。上面讨论的语言线索表明,归因理论可以帮助我们提取证据来源的列表,然后我们可以对其进行分类。我们也可以提取一系列在法律记录中至少有一些证据的主张。

实际误差分析

在我上面提到的第一个 ML 实验中,NN 模型预测了 740 个句子是证据句。其中 89 个是误分类,这些错误中约三分之二(60 句)由误分类推理句为证据句组成。当你考虑到许多推理句子是关于评估证据项目的可信度或可信度时,这是可以理解的。例如,经过训练的 NN 模型将下面的句子错误分类为证据句,而实际上它是推理句(如绿色背景色所示):

图像由弗恩 r .沃克, CC 由 4.0 。

这句话提到了证据,但它这样做是为了解释法庭的推理,即退伍军人管理局的证据的证明价值大于私人治疗证据的证明价值。对可能的句子角色的预测分数(显示在来自法律学徒 web 应用程序的该屏幕截图中的句子文本下方)显示,NN 模型预测这是一个证据句子(分数= 45.01%),尽管推理句子也获得了相对较高的分数(33.01%)。

NN 模型偶尔也会将证据句误分类为推理句。在 686 个人工标记的证据句子中,该模型将 24 个错误分类为推理句子。例如,训练好的模型预测以下证据句子(手动标记,用蓝色突出显示)是推理句子:

图片由 Vern R. Walker, CC BY 4.0 。

虽然这句话只是陈述了审查员的专家意见的基础,但 NN 模型将这句话归类为陈述了法庭本身的推理。该模型的预测得分表明,混淆是一个死里逃生:推理句(39.61%)对证据句(34.9%)。

实际上,对于某些用例,0.88 的精度和 0.95 的召回率就足够了。这样一个模型可以从相似的案例中提取并呈现出大量可接受的证据,而且噪音很小。如果主要的混淆发生在证据句和关于证据的推理句之间,那就更是如此。这种应用程序的用户可能仍然认为这种查询结果对于在以后的情况中引导争论是有信息的。

另一方面,如果目标是收集有关已决案件中所依赖的证据类型的统计数据,或衡量事实认定中的偏差程度,这样的错误率可能是不可接受的。采样理论需要计算频率估计值的置信区间,这种测量不确定性可能是不可接受的。

摘要

总之,在书面法律判决中有许多理由来识别证据句,特别是如果目标是挖掘在类似案件中发现的法律推理。证据句有助于识别可能与新案件相似的过去的判决。此类判决还能确定哪些证据在类似案件中发挥了重要作用,并有助于指导未来案件中的证据出示。有理论和实验基础可以得出结论,ML 算法可以学*(A)自动识别那些主要陈述证据的句子,以及(B)从那些句子中自动提取关于该证据的一些重要信息。因此,证据判决是对法律案件进行分类的重要关键。

实验差距

原文:https://towardsdatascience.com/the-experimentation-gap-3f5d374d354c

统计决策是如何演变的,然而大多数公司并没有跟上

作者图片

过去 20 年,在线可控实验已经成为许多最成功的科技公司开发产品的方式中日益核心的一部分。像 Airbnb、Booking.com、微软、谷歌、网飞、Doordash 和 Stitch Fix 这样的公司每年运行数万次实验,因此能够严格量化他们推出的大多数想法和功能的影响。在许多情况下,即使是简单的实验也会产生深远的影响——Bing 曾经因为一名工程师进行的一项简单地重新调整广告标题布局的实验而将其年度广告收入提高了 12%。更广泛地说,即使每个实验的影响更小,一年成千上万个小的积极变化的复合效应最终会产生更好的产品。

然而,这些从实验中获得巨大成功的故事掩盖了一个不幸的事实:尽管尽了最大努力,大多数公司仍然无法真正实现接*上述公司的实验项目。虽然像experimental Works这样的书支持这样一个世界,即大多数硅谷科技初创公司已经成功建立了一种根深蒂固的实验文化,但对大多数人来说,实验的现实截然不同。首先,这是一个现实,其特点是手动工作、瓶颈流程、老派统计技术、劣质工具、文化挑战,以及通常一个月只能运行几个实验。

同类最佳对比普通实验平台。左边的公司列表是说明性的,不是全面的。图片作者。

这种“实验差距”是我在所有数据基础设施中看到的“先进”公司和“普通”公司之间最明显的鸿沟之一。在与* 50 个参与实验的团队(从最复杂的到最基础的)交谈,以及通读了关于实验平台的大部分公开内容后,我想分享一些我的观点,说明为什么会出现这种情况,以及公司可以做些什么来避免这种情况。

在线受控实验简史

为了理解我们是如何走到这一步的,首先理解实验作为一种实践的历史是很有用的。

许多早期的 A/B 测试是由推广这一概念的公司进行的,比如谷歌,本质上非常简单。谷歌最著名的早期实验之一是在搜索结果中的一个链接上测试 40 种深浅不同的蓝色——其结果是一年多了 2 亿美元的广告收入。这个例子代表了许多早期实验的样子——它们是简单的客户端优化,如颜色、字体和网站上的副本。

像 Optimizely 这样的早期实验工具就是为适应这个世界而设计的。营销人员是核心用户,并优化地允许他们以自助方式对静态页面进行简单的客户端更改,这种方式与软件开发生命周期完全不同。鉴于当时缺乏广泛可用的数据工具和开发人员基础设施,这种工具必须是完整的,并处理从特征标记和统计分配到计算管道的一切。

从那以后,很多事情都变了。首先,数据基础设施已经有了显著的发展,并且已经围绕现代云数据仓库和数据湖进行了整合。针对功能标记、工具和日志记录、数据转换和计算的同类最佳解决方案已经出现,所有这些解决方案都旨在读取和写入这个集中式云数据存储。与这个工具链的本机集成现在是必不可少的。

作者图片

第二,实验需求已经基本成熟,变得更加复杂。实验更有可能与核心产品体验而不是静态登录页面相关联,并且经常涉及跨多个服务一次协调许多变化——给定的实验可能涉及改变动态前端行为、后端搜索服务和后端排名服务,并且这必须跨 3-4 个不同的平台一次完成。仅仅客户端的改变通常是不够的,更重要的是实验是可监控的、可调试的,并且深入集成到工程栈中。许多公司想要运行的原始实验量也增加了实验冲突的可能性,这需要进一步小心以避免。

作者图片

第三,与在线实验相关的人物角色发生了变化。与复杂数据工具的兴起同时出现的是数据专业人员——数据科学家、数据工程师和分析工程师。与此相关,实验已经从某种程度上的利基营销工具变成了现代产品团队的核心武器——实验被视为一种竞争优势,事实上是大多数现代增长项目课程的核心部分。这意味着实验需要成为产品发布过程的一个系统化的部分,并且紧密地融入到这些人物角色使用的工具和系统中,而不是在一个孤立的泡泡中到处做一件特别的事情。

不幸的是,虽然世界已经发生了很大的变化,但是这个领域的工具却没有跟上时代的步伐。以下引用的一位数据科学领导者的话代表了我从数十个试图建立自己的实验实践的团队那里听到的普遍经验:

“我们最初购买 Optimizely,认为它可以解决我们所有的实验问题。然而,随着时间的推移,我们意识到它有许多问题——它不适合数据仓库架构,它本质上只是一个标记和分配工具,而且它是一个非常难以诊断内部问题的黑匣子。

我们最终使用 Optimizely 只是为了赋值和标记。我们设置定制的 ETL 作业来摄取标签,将它们与点击流数据结合,将其存储在 S3 中,使用 PySpark 运行 ETL,然后使用 Redash SQL 查询来进行分析。如今的分析完全是手动的,我们在实验管理方面仍然有很多问题。 我们现在正在构建一个完整的内部实验平台 。”

团队最终每年要支付 4 万多美元来购买实验工具,这些工具最多只能用于统计任务,而且为了得到几乎不起作用的东西,必须在上面添加一些修补程序。工具之间粗糙的接口导致它们很难一起工作。实验的监控、记录或可调试性很少,甚至没有,并且实验经常相互冲突。每个实验都需要大量的定制工作,包括度量建模、设计和分析。一系列创可贴 ETL 管道使数据流入和流出不是围绕数据仓库设计的工具。最后,总体的实验过程没有应用软件工程的原则(例如,评审、版本控制、受控展示等)。Zulily 的这段视频很好地诠释了这段旅程。缺乏对如何建立真正的“实验文化”的理解和认识通常会大大加剧这些工具问题。

这些挑战的结果是,大多数公司经历了建立实验计划的第一年或第二年,最终每个月不超过 1-5 次实验,数据科学团队成为一个巨大的瓶颈,因为所有实验设计(例如计算运行时间和功耗、指标建模)和实验执行(展示、监控、分析、报告)都必须经过它们。尽管尽了最大努力,这种建立实验实践的最初尝试经常以失败告终。

简而言之,你不能用为不同时代设计的工具和系统来创建一个现代实验项目。事实上,大多数现代团队在经历了上面的旅程后意识到,满足他们需求的唯一解决方案——他们想要运行的实验的复杂性、他们想要运行实验的角色、他们需要集成的工具和堆栈——是在内部构建他们自己的平台。但是,我们将从对有效完成这一任务的公司的研究中发现,构建一个合适的实验平台的范围可能比许多公司预期的要大 10-50 倍,并且包含许多非直观的组件。

现代实验平台的结构

如果你研究网飞、Faire、Doordash、Airbnb、Booking、Stitch Fix、Yelp、谷歌和微软等公司所做的工作,你会发现已经实现规模化自助服务实验的平台几乎总是坚持一些核心原则。

首先,端到端自动化至关重要。如果实验工作流程的任何步骤都需要手动工作,从功率计算到指标建模再到分析,那么实验自然会成为数据科学或数据基础架构中少数关键人员的瓶颈。

其次,自助服务工作流与基础架构同样重要。如果没有产品经理、工程师或设计师可以用来创建、展示、监控和管理实验的简单用户体验,实验将不会成为更广泛的组织将采用的工具。这种工作流程对实验中的许多统计概念进行抽象和简化,以使实验变得容易进行,这一点至关重要。

第三,在实验的“DevOps”方面的重大投资——这包括诸如监控、可调试性、关于所有正在进行的实验的丰富的可搜索元数据、实验周围的护栏等等。如果您试图在一个没有这些组件的公司内创建广泛采用的实验,您将被冲突的实验、不正确配置的(因此是错误的)实验、破碎的用户体验和许多其他问题所困扰。负责实验平台的中心团队必须能够跟踪、理解和验证正在发生的事情。

第四,社交和协作功能至关重要。这可能是实验平台最被低估的方面,然而根据我的经验,它一直被做过实验的公司评为让实验正确的最重要的方面之一。

Booking.com 做的最有用的事情是找到了让非专家进行实验和理解统计思维的方法。这在很大程度上归结为设计产品是“优化+ Reddit”。与实验相关的社交功能——评论、“@”功能、线程、链接到实验结果以便任何人都可以看到,等等——绝对是他们平台最有价值的方面之一。

首先,这教会人们如何讨论和谈论实验——组织熟悉实验的“语言”,以及如何在实验的背景下谈论产品/功能发布。

其次,它允许透明、反馈和“边做边学”。很多人最初会创建非常糟糕的实验——糟糕的设置,糟糕的推理,等等。但是,关键是让这种情况发生,然后允许公司中的任何人提供反馈。这是一种比“上课”或“培训”更有效的教学方式——人们通过实践来学*。结果是公司里的每个人在适当的实验设计方面不断变得越来越好。

第三,它强制问责。如果你想在一些电子邮件、闲散讨论或任何其他上下文中引用一个实验作为推出一个功能的理由,你必须引用它,任何人都可以看到关于该实验的所有细节。这迫使学术诚实和严谨,并在实验决策中创造了更多的信任。如果你的实验不合法,人们会知道的。"

【Booking.com】前实验主任卢卡斯·维米尔

这些原则通常会转化为实验平台,这些实验平台具有以下所有组件:

  1. 自助式实验创建 —允许个人定义、配置、启动和跟踪实验的自助式用户界面。
  2. 统计分配 —根据正确的维度集分配实验组的服务。这通常是位于实验元数据存储之上的全局 API,所有服务都可以调用它,提供输入维度(例如,用户 id、区域等)和它们需要的对象,并获得指定它们应该公开的变体/处理的响应。根据成熟度,这里需要各种统计包来支持不同类型的随机化和分配。
  3. 度量建模 —允许对实验分析中常用的所有核心度量进行建模的工具。这包括关键目标指标(例如点击率、转化率、参与度)、健康指标(例如延迟、支持票)和“发现”指标(即帮助您识别用户行为中意外关系的二级指标)。
  4. 数据管道化和流程编排 —必须存在计算管道,能够自动接收任务数据和用户操作,潜在地利用二级资源丰富这些数据,然后自动计算与本实验相关的所有指标。还需要数据管道来自动分析实验元数据(例如,我在我的实验组中看到了正确的 50/50 比例吗?)以及统计方面的实验(如运行时、功率)。
  5. 监控和调试— 监控实验元数据并识别异常或意外结果(例如,缺失数据、不均匀的实验分割、异常结果、显示奇怪行为的 A/A 测试)的系统。经常需要健壮的日志记录基础设施来实时测量、查询和分析这些数据。与此相关,通常需要丰富的调试经验来诊断实验,并允许快速识别给定用户正在进行的实验(这对客户支持至关重要)。
  6. 调度、展示和实验管理 —一个允许围绕实验的调度和展示的丰富逻辑的系统(例如,增量展示、回滚、由于错误而重新启动)。逻辑也必须到位,以帮助避免实验冲突,并确保在平行实验的数量和任何给定实验达到统计显著性所需的时间之间有正确的平衡。通常需要一个 UI 来查看和管理整个实验日程。
  7. 实验审查和监督—分散的实验仍然需要监督,特别是因为公司内的大多数人不一定具备完美运行实验的统计知识。因此,许多公司需要围绕实验审查流程的某种程度的自动化,以及确保实验始终符合特定标准的防护栏(例如,每次实验都必须计算特定的健康指标)。
  8. 调查引擎需要一些工作流程来允许在实验结果之上的这种“切片和切块”的研究经验。
  9. 知识获取和报告 —必须存在一个任何人都可以搜索的实时实验库。完整的实验结构、历史和结果需要是可用的。实验必须是可链接的,这样它们才能在一个组织内被广泛共享,并为将来的决策提供参考。

现代数据堆栈中的关键实验平台组件。您可以在此找到实验平台架构的其他示例。图片作者。

建造这一切是一个沉重的负担。然而,忽略这些组件中的任何一个——尤其是将实验仅仅视为基础设施和特性标记问题——将会极大地限制您分散实验的能力,从而限制实验的规模。好消息是,现代开发人员工具可以让您的生活变得更加轻松;围绕数据仓库构建,以 launch crystally 等标记工具和现代数据堆栈的其余部分(Airbyte、Fivetran 等)为特色,您可以加快这方面的工作。

高级统计技术

统计引擎是这个堆栈中的一个特殊组件,值得进一步讨论。与统计决策相关的研究和最佳实践在过去十年中发生了巨大的变化,许多领先的实验平台都投入了大量资金开发先进的统计技术,这些技术远远超出了基本的 A/B 测试。

一方面,如果您仍然处于试验平台之旅的早期,我会鼓励您不要过于担心这些新兴技术——通过专注于基本的、固定范围的、频繁的 A/B 测试,以及围绕它构建的正确的自动化和工作流,您可以走得非常远。另一方面,我知道许多公司,包括一些初创公司,已经看到了更先进的实验方法所产生的巨大价值。因此,我想强调一些潜在的高影响力的统计方法,一旦你有了实验平台的基础,这些方法可能是值得投资的。

顺序测试和峰值验证分析

经典的实验测试统计基于对固定样本大小(N)的承诺,然后仅在收集了固定样本大小数量的数据后做出实验决策。这确保了显著性值实际上映射到假阳性的概率。

不幸的是,在一个可以立即看到实验中收集的数据的世界中,这种约束很难遵守。因此,许多从业者成为“偷看”的受害者,在达到适当的样本量之前,实验结果被错误地调用。

“偷看”该结果的用户可能(错误地)认为在达到所需的最小样本量之前该结果是有意义的。这篇文章深入探讨了这背后的直觉(图片由丹尼斯·迈斯纳拍摄)

为了解决这个问题,已经对“顺序测试”范例进行了研究,这些范例会产生始终有效的 p 值——本质上,显著性阈值变成了一个与迄今收集的数据量相关联的动态值。这使得产品团队能够就是否以及何时提前进行实验做出更有效的决策,这对于由于样本大小/能力问题而限制实验数量的公司尤其有用。

分配策略

一个理想的实验包括完全随机化,这样处理组之间唯一的总体差异是实验条件。虽然在许多情况下可以通过简单的策略实现这一点,例如针对 user-id 的随机分配,但在许多情况下并不容易。

比如 Doordash 不能随机给司机分配不同的匹配算法,因为一个地区的司机 A 是否匹配到订单 B 会影响该地区其他司机匹配到什么订单。这种用户之间实验处理的非独立性在有物理操作或紧密网络效应的企业中非常普遍,并且经常需要替代的实验结构。一种这样的结构包括利用“转回”实验,其中随机化在区域+时间的基础上发生。这需要利用各种误差校正技术,如群集稳健标准误差或德尔塔法。

除了支持非用户级别的随机化,许多公司还投资于更细致的分配策略。例如,网飞的实验平台天生就能区分新用户和现有用户,他们可以独立地在这些人群中进行几乎所有的实验。许多其他公司投入工程努力来运行随机实验,不是针对所有用户,而是只针对被测试功能的活跃用户。

最后,与用户跟踪相关的复杂性也需要更高级的分配策略。许多 web 应用程序支持处于登录和注销状态的用户,并通过登录和 cookie 跟踪客户端。在这种情况下,你需要非常小心如何在实验环境中跟踪用户。举个简单的例子,您的分配服务可能会在用户登录之前将他们映射到治疗组 A,而在登录之后将他们映射到治疗组 B,但是您可能希望避免用户的治疗组在单个会话期间发生变化的情况,因为这会导致混乱的用户体验。鉴于很难将用户的行为归因于处理 A 或 B ,这种情况可能会在更大程度上使您得出的统计结论无效,需要对仪器和计算进行仔细考虑。

方差缩减

你需要在实验中收集的样本量最终取决于两个因素:你的治疗的效果大小,以及你所测量的度量的方差。多种技术可用于显著降低您所测量的指标的有效方差,从而大幅提高您的实验通量。

简单来说,一些基本策略,如离群值封顶和关注更“接*”的指标可能是非常有价值的。在更高级的方面,可以利用预实验数据来更好地理解与您正在测量的指标相关的协变量。对这些协变量的智能控制可以导致具有显著更低方差的调整后的度量。“使用已有数据的受控实验”,又名 CUPED,是最广泛采用的算法,并且已经被诸如微软、网飞、猫途鹰和预订这样的公司广泛报道。各种公司也建立了有趣的 CUPED 衍生产品,如 Doordash 。

在使用 CUPED 后,Bing 发现有效方差减少了约 50%,在某些情况下,以前需要 10 多天才能达到统计显著性的领先实验改为需要 1 天(图片由 Bing 提供)

准实验

在很多情况下,公司可能无法构建一个完全随机的实验,但基于统计信息的决策同样有价值。例如,您可能希望将一个大型产品发布会与一个重要的营销发布联系起来,在这种情况下,将一些用户作为控制手段是不合理的。或者,您可能希望在您的用户群中测试定价,但是您需要小心避免两个用户同时看到同一件商品的不同价格的情况。

在这种情况下,许多拥有先进实验平台的公司转向“准实验”,利用各种统计技术来估计反事实或控制会是什么。简而言之,这通常看起来像是利用实验前的时间(T0)作为对照,利用实验后的时间(T2)作为治疗,并确定如何适当地解释这两个时间段中的非治疗差异。一些最常用的方法包括具有固定效应的线性回归、差异中的差异建模和利用多重干预。 Shopify 、网飞、预订就这些话题写了一些不错的文章。

虽然它们有时被认为不如经典的 A/B 测试有用或更适合,但我实际上发现,准实验通常占公司所有实验的 10 %- 30 %,这些公司为它们投资了基础设施,并产生了巨大的价值。我怀疑这实际上是现代公司中统计决策最未开发的领域之一,因为在以某种方式与物理世界交互的公司中,经常会遇到稳定单位处理值假设被打破的情况,尤其是

_

其他一些值得深入探索的有趣策略包括多臂强盗,替代统计方法,如贝叶斯方法和利用分布比较而不是均值比较(T-检验),以及因果建模。我在这篇博客的末尾添加了一个链接,链接到一个更广泛、更完整的高级统计技术内容库。

实验文化

到目前为止,我已经广泛接触了许多与大规模支持自助服务实验相关的工具和架构挑战。然而,我想强调的是,考虑发展一种实验文化是多么的重要。当我与许多试图扩展他们的实验项目的数据科学家和产品团队交谈时,文化通常是他们最担心做对的事情。即使是最先进的公司也很难做到这一点!

与实验相关的文化问题会以多种方式出现。领导者和高管可能已经*惯了这样一种环境,在这种环境中,他们可以一直做出基于直觉的决策,并在直觉与数据不一致的情况下苦苦挣扎。没有统计学背景的员工可能不理解实验的效用,或者由于不熟悉统计学概念而感到不知所措。团队可能从来没有感受到通过数据发现用户行为的意想不到或不直观的一面的喜悦,或者来自能够严格量化他们工作的影响的授权。

正如我已经强调的,建立在正确原则上的工具可以为实验文化提供基础。实验平台应该是透明和开放的,这样任何人都可以创建实验,每个人都可以看到已经运行的历史实验——包括假设、实验设计和结果。评论和版本控制等社交层允许同行评审和同行教育。分享功能,使其易于链接到电子邮件、slack 或其他通信渠道中的实验,从而增强实验素养。抽象统计概念并使人们更容易理解什么是实验的工作流程降低了人们的准入门槛,使人们更容易参与。总之,这些原则有助于在您的组织内培养和加强实验素养 —人们将慢慢熟悉和适应在统计测试的背景下谈论功能和发布。

我发现最成功的团队强调一种“边做边学”的心态,而不是更自上而下的教育方法,如课堂、研讨会或类似的方法。我还发现,在大多数公司,实验作为一种实践,是从庆祝小胜利开始的。即使只有一两个团队在进行实验,量化新功能影响的前几封“发布邮件”也经常会得到公司其他人的热烈掌声。这为接下来的 1-2 个团队尝试实验创造了条件,最终创造了一个实验结果的飞轮,推动了更多的实验投资。值得一提的是,“胜利”不一定是一个积极的指标变化——胜利也可以是了解到一个功能是而不是一个好主意,或者甚至只是发现一些关于用户行为的新知识。无论任何特定测试的结果如何,你都希望庆祝严格假设测试的过程以及从中获得的知识。

此外,虽然我们讨论的部分目标是实验管道的自动化,但在早期,数据科学组织通常应该为刚入门的人提供某种程度的“实验支持”。这种个人接触有助于帮助公司的一些人开始真正接受统计决策。

最后,领导者自上而下的支持对于培养实验文化至关重要。如果领导者不愿意相信实验结果并采取行动,团队将永远不会投入时间将实验纳入他们的发布节奏。如果领导者不问为什么一个新功能的影响没有被严格量化,没有人会费心去学*如何进行实验。不幸的是,许多数据科学家被带入这样的组织,并花费大量但徒劳的努力试图进行专门的实验分析,结果却被忽视了。如果这是你,更好的第一步是在公司内部找到一个实验冠军,他确实希望更多地由数据驱动。

实验平台的力量

如果你与那些在真正将实验融入其文化和运营的公司工作过的人交谈,他们通常永远不会想回到一个没有实验的地方。这部分源于显而易见的好处——他们喜欢能够量化他们工作的影响,他们欣赏能够严格测试假设而不是仅仅依赖直觉的好处。事实上,执行良好的实验是数据组织展示不可否认的业务价值的最清晰的方式之一,因此会产生更大的影响。但是,实验平台也有许多不太明显的好处。

首先,实验平台赋予一个组织权力,并创造一种更具企业家精神的文化。实验使员工能够证明他们想法的影响,给他们强大的弹药去推动他们认为正确的事情,不管他们有多初级。领导者不再能够简单地说“我不认为T3 是个好主意”。结果往往是团队和员工中的创造性爆发,他们对尝试事物和测试想法感到兴奋。结果,数据团队在工作中感受到了更多的意义和影响。

第二,实验平台往往最终成为公司非常强大的调试工具。bug、正确性错误和类似的问题自然会在所有公司出现,但往往会被忽视很长一段时间。根据 north star 标准对所有版本进行严格测试,通常可以更快地发现问题和缺陷。

第三,实验平台成为知识获取的有力形式。经过几年的严格实验,大多数公司将获得大量关于用户行为的知识。如果这些信息被适当地捕获、标记、索引和提供,它将成为一个事实上的用户研究库,可以影响公司内部的一系列决策。从这个意义上来说,任何一个实验的结果都可能比人们最初预期的要深远得多。

当然,实验不是万能的。不是所有的东西都是可量化的,没有完美的度量标准,并且很有可能在其他有用的决策输入的命令下过度优化度量标准,例如用户研究、产品感觉、直觉和关于产品应该是什么的原则信念。如果做错了,实验可能会被过度依赖,导致糟糕的决策和员工不满。

但是,统计推理应该是大多数公司决策工具包的核心部分,不幸的是,实验的好处如此之大,尽管事实上很少有公司达到实验成熟。我希望这篇文章能揭示你在建立一个实验项目时可能面临的许多常见陷阱,以及许多构成正确进行实验的公司基础的“商业秘密”。尽管这些平台的范围和规模相当大,但如果你研究一下这些公司都做了些什么,你就可以轻而易举地达到目的。希望围绕现代实验工作流程的需求而构建的新工具的出现,如 Eppo 、 Statsig 和 A/B Smartly ,也将使这些在未来变得更加容易。

要获得更多资源,你可以在这里找到许多关于实验的精彩文章、著作和研究论文的列表。如果有我遗漏的东西,请提交 Github PR 让我知道!如果你想谈论这个领域或数据工具,我很乐意联系——给我发电子邮件,地址是戴维斯 innovationendeavors.com

你需要的关于二进制分类标准的解释

原文:https://towardsdatascience.com/the-explanation-you-need-on-binary-classification-metrics-321d280b590f

用于评估二元分类模型质量的最常用指标的直观概述

由安妮·斯普拉特在 Unsplash 上拍摄

当我们创建由学*算法在训练期间没有看到的示例组成的维持集时,模型评估阶段开始。如果我们的模型在维持集上表现良好,我们可以说我们的模型概括得很好并且质量很好。

评估模型好坏的最常见方法是计算维持数据的性能指标。

本文将关注二进制分类模型的性能指标。这是值得详细说明的,因为回归任务有完全不同的可跟踪性能度量。

二元分类的性能度量

我们将涵盖的指标有:

  • 准确(性)
  • 精确度和召回率
  • F1 分数
  • 原木损失
  • ROC-AUC
  • 马修斯相关系数

准确(性)

当我们想要分析一个二进制分类器的性能时,最常见和最容易得到的度量当然是准确度。它告诉我们,相对于总数,我们的模型在数据集中正确分类了多少次。

事实上,准确性的公式是正确答案的数量与答案总数之比

精确度考虑了模型在最严格意义上的性能。换句话说,它不允许我们理解我们经营的环境

脱离上下文,准确性是一个非常微妙的指标来解释。

例如,在处理不平衡数据集时,不建议使用精确度作为评估标准,因为在不平衡数据集中,类的分布是不均匀的。如果准确性只不过是正确答案与总数的比率,那么你就会明白,如果一个类占了我们数据集的 90%,而我们的模型(错误地)将数据集中的每个例子都归入了那个特定的类,那么它的准确性将是 90%。

如果我们不小心,我们可能会认为我们的模型表现很好,而实际上却远非如此。

但是,如果我们确信数据集是平衡的,并且数据是高质量的,那么准确性是一个合理的度量标准。

精确度和召回率

为了更好地理解精确度和召回率的概念,我们将使用一个混淆矩阵来介绍这个主题。之所以称之为 like so,是因为它向分析师传达了模型的误差程度(以及由此产生的混乱)。

要创建混淆矩阵,我们只需在行中列出数据集中存在的实际类,在列中列出模型必须预测的类。单元的值对应于模型在这些条件下的响应。

让我们看一个使用 Sklearn 作为源的例子

来源:Sklearn (BSD 许可证)

这是一个应用于著名的 Iris 数据集的二元分类器的混淆矩阵的例子。

对角线上的值指示分类模型的预测对应于数据集中存在的真实类别的点。对角线上出现的元素越多,我们的预测就越正确(注意,我没说模型在表演!让我们记住上面的准确性问题)。

让我们抽象地表示混淆矩阵,以便更好地理解填充单元格的值。

混淆矩阵中的行、列和值代表什么。图片作者。

我们看到许多标签:真阴性、真阳性、假阴性和假阳性。让我们一个一个来看。

  • 真否定(TN): 包含被正确分类为否定的例子。
  • 真阳性(TP): 包含已被正确分类为阳性的例子。
  • 假阴性(FN): 包含被错误地归类为阴性,因此实际上是阳性的例子
  • 假阳性(FP): 包含被错误地分类为阳性并因此实际上是阴性的例子

通过使用混淆矩阵,我们因此能够更好地理解我们的分类器的行为以及如何进一步改进它。

接下来,让我们看看如何从混淆矩阵中导出精度公式:

这无非就是正确答案的数量除以总数。

现在让我们用公式定义精度

是如何解读的?**精度就是只对正类计算的精度。**它也被称为特异性,因为它定义了当有需要识别的信号时,仪器的灵敏度。事实上,这个指标告诉我们,当我们把一个类归类为积极的时候,我们有多经常是正确的。

让我们再举一个例子:我们在家里安装了一个带有面部识别算法的报警系统。它连接到摄像头和控制单元,如果有人进入房子,而它不认为这是朋友或家庭成员,它会在我们手机上的应用程序上发送通知。

一个高精度的模型只会偶尔提醒我们几次,但当它提醒我们时,我们可以非常确定它真的是一个入侵者!因此,当房子里确实有入侵者时,该模型能够正确地区分入侵者和家庭成员。

另一方面,召回代表着天平上的另一根针。如果我们有兴趣识别尽可能多的肯定类别,那么我们的模型必须具有高召回分数。

它的公式是

实际上,这意味着我们必须考虑假阴性而不是假阳性。召回也被称为敏感度,因为随着召回的增加,我们的模型变得越来越不准确,并且还将负面类别分类为正面类别。

让我们看一个包括召回的例子:我们是放射科医生,我们训练了一个模型,使用计算机视觉对任何肺部肿瘤的存在进行分类。

在这种情况下我们希望我们的模型有高召回率,因为我们希望确保每个被模型认为是正面的例子都经过了人类的检验。我们不希望恶性肿瘤被忽视,我们会欣然接受假阳性。

总结一下,我们来看这个类比:

一个高精度的模型是保守的:它并不总是正确地识别类,但是当它识别时,我们可以确信它的答案是正确的。
**高召回模型是自由的:**它更经常地识别一个类别,但是在这样做的时候,它也倾向于包括许多噪声(误报)。

细心而好奇的读者会推断,不可能有一个模型同时具有高精度和高召回率。事实上,这两个指标是互补的:如果我们增加一个,另一个必然减少。这被称为精度/召回权衡。

作为分析师,我们的目标是联系上下文并理解哪个指标为我们提供了最大的价值。

F1 分数

在这一点上,很明显,使用精度或召回率作为评估指标是困难的,因为我们只能使用一个而牺牲另一个。F1 成绩解决了这个问题

事实上,F1 分数将精确度和召回率结合成一个指标。

这是精确度和召回率的调和平均值,并且可能是用于评估二元分类模型的最常用的度量。

如果我们的 F1 得分增加,这意味着我们的模型在准确性、召回率或两者方面的性能都有所提高。

原木损失

日志损失是一个常见的评估指标,尤其是在 Kaggle 上。在深度学*的背景下也称为交叉熵,这一指标衡量模型预测的概率和观察到的现实的概率之间的差异。该指标的目标是估计一个示例具有正面类别的概率。

这种度量在数学上比以前的更复杂,没有必要深入了解它在评估二进制分类系统中的有用性。

这是完整性的公式

n 代表数据集中样本的数量,y_i 代表观察到的现实,yˇ_ I 代表模型的预测。

我不会继续解释这个公式,因为它会误入歧途。如果你想了解更多,谷歌是你最好的朋友🙂

ROC-AUC

ROC-AUC 指标基于接收操作特征曲线的图形表示。我不会试图用我自己的话来解释,因为这次维基百科做得非常好

ROC 曲线[…]是二元分类模型的图解。灵敏度和(1-特异性)可以沿两个轴表示,分别由真阳性率(TPR,真阳性的比例)和假阳性率(FPR,假阳性的比例)表示。换句话说,ROC 曲线显示了真报警(命中率)和假报警之间的关系。

最后一句粗体字(我套用的)是让我们刚刚读到的 ROC 曲线的描述变得直观的那一句。显然,我们希望真警报和假警报之间的关系有利于真警报,因为性能更好的模型会做到这一点。

让我们看看这个图表是什么样的

来源:维基百科

AUC 代表曲线下的面积。如果我们把注意力放在蓝线上,我们会发现在它下面实际上有一个比绿线和橙线更大的区域。虚线表示 50%的 ROC-AUC 指标。

因此,好的模型将具有大的 ROC-AUC,而差的模型将位于虚线附*,这只不过是一个随机模型。

ROC-AUC 指标对于比较不同模型也非常有用。

马修斯相关系数

在这里,我们看到了二进制分类模型的最后一个评估指标,该模型旨在评估在不平衡数据集上训练的模型。

这个公式看起来像绕口令,但实际上它的表现就像一个相关系数。因此,它的范围在-1 和+1 之间。

趋向于+1 的值衡量我们的分类器预测的质量,即使在数据集中的类不平衡的情况下,因为它表明实际观察值和我们的模型所做的预测之间的相关性。

结论

与回归模型的评估指标一样,Sklearn 提供了几种快速计算这些指标的方法。这里有一个到文档的链接。

最后一点,这些是评估二元分类模型的指标。例如,对于多类分类,只需将这些度量之一应用于每个类,然后应用一种对所有示例进行概括的策略,例如平均值(微观/宏观平均)。但那是另一篇文章的话题:)

如果你想支持我的内容创作活动,欢迎点击我下面的推荐链接,加入 Medium 的会员计划。我将获得你投资的一部分,你将能够以无缝的方式访问 Medium 的大量数据科学文章。

https://medium.com/@theDrewDag/membership

下一篇文章再见👋

散点图的表现力

原文:https://towardsdatascience.com/the-expressive-power-of-the-scatter-plot-c2f3354d3d97

如何在 2D 可视化多维数据

由罗格维尔德在 Unsplash 上拍摄的照片

介绍

数据可视化是数据科学的一个重要方面,它使从业者能够获得手边数据的图形表示,检测异常,或识别模式和趋势。虽然有多种方法来执行图形数据分析,但散点图是一种广为人知且经常使用的工具,用于可视化变量之间的关系。

虽然散点图通常只显示二维,但无需在空间上正交相加,就可以显示更多的维度。这可以通过利用颜色、形状、大小或不透明度等视觉属性来实现。我们将在本文中探讨这些属性的使用。

在深入研究之前,值得注意的是,向图中添加第三个正交维度当然也是可能的。然而,这种做法通常应该避免,除非存在与情节交互的可能性。本文的最后一节将对此进行详细阐述。

数据集和预处理

下面的散点图是使用公开的自动 MPG 数据集【1】在 Python 中生成的。为了便于说明,这里只使用了整个数据集的 25%的随机样本(表 1)。

表 1:自动 MPG 数据集的快照。

假设我们最感兴趣的是将马力可视化为每加仑(mpg) 英里数的函数。因此,这两列将作为贯穿本文的正交维度。然后,我们将通过视觉属性添加更多的维度。

2D

一个简单的二维散点图马力英里/加仑已经为我们提供了这些特性如何相互关联的重要信息。它揭示了一种反比关系,其中具有较高 mpg 的汽车往往具有较低的马力,反之亦然(图 1)。

图 1:显示马力作为 mpg 的函数的二维散点图。图片作者。

三维(three dimension 的缩写)

现在让我们以颜色的形式添加第三维。为了获得更好的表现力,谨慎的做法是选择一个具有离散值和相对较低基数的维度,这样可以很容易地从视觉上区分不同的颜色。在我们的数据集中,列 cylinders 只有五个唯一值,这使它成为一个合适的候选者(图 3)。

图 3:三维散点图,利用颜色来说明圆柱体的数量。图片作者。

添加颜色作为视觉属性,可以从情节中提取更多的信息。或许有些出乎意料,随着马力的降低和 mpg 的上升,气缸的数量趋于减少。这并不奇怪,因为功率较小的汽车通常包含更少的气缸,具有更好的燃油效率。

4D

与 color 类似, shape 是我们可以添加的另一个支持低基数特性的可视属性(图 4)。在我们的数据集中, origin 只包含三个唯一值,它们代表汽车制造的地理位置。这些信息已经被标签编码:1 代表美国,2 代表欧洲,3 代表日本。

图 4:利用形状说明产地(原产地)的四维散点图。图片作者。

根据数据点的原点绘制各种形状的数据点,我们在这个数据集中发现了另一个有趣的趋势。基于马力汽缸的最强劲的汽车似乎都产自美国。另一方面,燃油效率最好的汽车来自日本。欧洲汽车占据了中档市场,尽管在马力方面并没有明显更强劲,但每加仑的油耗却比日本车低。从这个信息中我们可以得出的另一个见解是,3 缸汽车似乎主要是在美国制造的。

5D

现在让我们添加另一个视觉属性:大小。与形状和颜色不同,大小不一定要求特征值是离散的。基于我们的数据集,权重似乎是一个合适的特征,可以通过数据点的大小来表达(图 5)。

图 5:利用尺寸说明汽车重量的五维散点图。图片作者。

不出所料,马力大、mpg 低的美国汽车往往更重,而燃油效率较好、马力较小的欧洲和日本汽车往往更轻。

提示: 这个数据集中的体重在 1760 到 4952 磅之间。当使用 matplotlib 绘制数据时,简单的比例因子不足以直观地表达重量的差异,因为轻型汽车的数据点几乎与重型汽车的数据点大小相同。为了提高对比度,可以使用 sklearn 的 MinMaxScaler 对数据进行缩放。但是,需要确保转换数据的下限不为零,因为大小为零的数据点不会显示在图上。

6D

利用不透明度可将另一个维度添加到绘图中。同样,我们并不局限于离散值,我们可以选择连续的特征,例如加速度。该特征表示从 0-60 英里/小时加速所需的时间,以秒为单位。

图 6:六维散点图利用不透明度来说明汽车的加速度。图片作者。

通过将这些信息添加到图表中,我们可以看到,许多强劲的美国汽车加速到 60 英里/小时只需要相对较短的时间,而它们的节油型汽车需要更长的时间。

与上面的重量类似,加速度特征使用 sklearn 的 MinMaxScaler 进行缩放,以增加不透明度的差异。

避免 3D 散点图

从技术上讲,可以在图中添加第三个正交维度。然而,这只有在有可能与图交互并以这种方式探索数据点时才有用。

3D 散点图的基本问题是需要两个连续的数据转换:(1)将数据映射到 3D 可视化空间,以及(2)将数据从其 3D 可视化空间映射到最终图形的 2D 空间[2]。因此,投影到二维空间的 3D 图实际上只有 2.5D,从而在平面上产生了深度的错觉[3]。这通常会导致视觉失真,并增加可解释性的难度,因为很难想象数据点在空间中的确切分布。

此外,如果图是静止的,数据点很容易隐藏在其他数据点的后面。虽然引入不透明性有助于缓解这一问题,但它肯定不能提供一个可接受的解决方案。

结论

本文探讨了如何通过利用传统的 2D 散点图并以可视属性的形式添加更多维度来有效地可视化多维数据。使用颜色或形状时,最佳做法是为这些属性选择基数较低的离散要素,因为高基数要素会使解释和区分绘图中各种颜色或形状变得困难。对于连续要素,大小和不透明度是合适的属性,可以为所呈现的数据提供额外的洞察力。

此外,对于连续特征,可以缩放特征值以增加较低值和较高值之间的视觉差异。

最后,值得一提的是,可以使用诸如色调纹理之类的属性来添加更多的维度。然而,应避免图中维数越来越高,因为它很容易淹没观察者,从而降低可解释性。

参考

[1]昆兰,R. (1993 年)。结合基于实例和基于模型的学*。《第十届机器学*国际会议论文集》, 236–243,马萨诸塞大学,阿默斯特。摩根·考夫曼。

[2]克劳斯·威尔基。数据可视化——不要 3D 化。访问时间为 2022 年 12 月 11 日。

[3]罗宾·邝。如何让 3D 图表再次伟大。《金融时报》(旧金山,2017 年 3 月 27 日)。

Voronoi 图的迷人世界

原文:https://towardsdatascience.com/the-fascinating-world-of-voronoi-diagrams-da8fc700fa1b

简单介绍这种普遍存在的模式及其应用

Voronoi 图(也被称为狄利克雷镶嵌泰森多边形)在自然界中无处不在。你已经遇到他们成千上万次了,但也许并没有这样称呼它。Voronoi 图是简单的,但是它们具有令人难以置信的性质,已经在从制图学、生物学、计算机科学、统计学、考古学,一直到建筑和艺术的领域中找到应用。

什么是 Voronoi 图?

假设你有 n 个点分散在一个平面上,这些点的 Voronoi 图将该平面细分为精确的 n 个单元,这些单元包围了最接*每个点的平面部分。这会产生一个完全覆盖平面的镶嵌。作为一个例子,在图 1 中,我绘制了 100 个随机点和它们对应的 Voronoi 图。正如您所看到的,每个点都包含在一个单元中,其边界在两个或更多点之间是完全等距的。换句话说,单元中包含的所有区域距离单元中的点比距离任何其他点都*。

图 1: Voronoi 图
来源:作者图片

Voronoi 图案无处不在

自然界中的 Voronoi 模式

Voronoi 图生成的图案是自然界中常见的图案。在图 2 中,我用一些自然产生的类似 Voronoi 的图案做了一个小拼贴。从洋葱皮的微观细胞,到菠萝蜜的外壳和长颈鹿的皮毛。这些图案无处不在!

它们无处不在的第一个原因是它们形成有效的形状。正如我们前面提到的,Voronoi 图完全细化了平面:因此,所有的空间都被利用了。如果你试图在有限的空间里尽可能多地挤压,这是非常方便的——比如在肌肉纤维或蜂箱里。第二,无论什么时候,只要有东西从不同的点以统一的增长率生长,Voronoi 图就是一种自发的模式(见图 3)。例如,这解释了为什么长颈鹿会表现出这样的模式。长颈鹿胚胎有分散分布的黑色素分泌细胞,这是长颈鹿斑点深色色素沉着的原因。在妊娠期间,这些细胞释放黑色素——因此斑点向外辐射。感兴趣的读者可以参考这篇论文,其中作者使用 Voronoi 图来模拟动物皮毛上斑点的计算机渲染。

图 2: Voronoi 图案在自然界中无处不在。(从左上至右下:一块肌肉的横截面,长颈鹿的皮毛图案,蜻蜓的翅膀,大蒜头,玉米,挂在树上的菠萝蜜。)
来源:维基,尼拉夫·沙阿,卡罗琳娜·格拉博斯卡,斯塔格拉德,马里·梅德,阿比·雅各布

图 3:从分散的点不断向外生长得到 Voronoi 图
来源:维基百科

建筑艺术中的 Voronoi 图案

也许是因为它们自发的“自然”外观,或者仅仅是因为它们迷人的随机性,Voronoi 图案被有意地应用在人造结构中。建筑方面的一个例子是 2008 年北京奥运会期间为水上运动而建造的“水立方”。它的天花板和立面上有 Voronoi 图(图 4)。选择 Voronoi 图是因为它们能回忆起泡泡 1。这个类比在晚上非常清晰,整个外墙被蓝色照亮,变得栩栩如生。

图 4:北京水立方
来源:维基百科,

但是中国人对沃罗诺图案的欣赏肯定比这座建筑更古老。宋代的关和葛有一种独特的裂纹釉。陶瓷在冷却过程中很容易破裂,但是管和葛的破裂是不同的——它们是故意的。它们因其美学品质而受到追捧。由于它们表面的 Voronoi 状图案,每件作品都是独一无二的。迄今为止,这是模仿最多的瓷器风格之一(图 5)。

图五:关、葛器
来源:维基,维基

Voronoi 图在图形艺术中也很常见,用于创建“抽象”图案。我认为它们是很好的背景图片。例如,我通过生成随机点和构建 Voronoi 图创建了这篇文章的缩略图。然后,我根据每个单元格的点到盒子中随机选择的点的距离给每个单元格着色(图 6)。通过这种方式可以生成无尽的“抽象”背景图像。

图 6:彩色 Voronoi 图
来源:作者图片

数学定义和一些有趣的性质

到目前为止,我们已经提出了一个简单的二维 Voronoi 图。然而,相同类型的结构可以推广到 n 维空间。假设 P={p1,p2,…,pm}是我们的 n 维空间中的一组 m 点。然后,该空间可以被划分为 m 个 Voronoi 单元 Vi ,包含 Rn 中比任何其他点更接* pi 的所有点。

其中函数 d(x,y) 给出其两个自变量之间的距离( a )。通常,使用欧几里德距离(l2 距离):

然而,可以使用其他距离函数来设计 Voronoi 图。例如,图 7 示出了利用曼哈顿或城市街区距离( l1 距离)获得的 Voronoi 图。Manahattan 距离是两点之间的距离,如果你必须遵循规则的网格-例如曼哈顿的城市街区。结果是一个更加“盒状”的芙诺以图。

图 7:欧几里德距离
来源:维基百科

图 8:使用欧几里德(左)和曼哈顿(右)距离对同一组点进行 Voronoi 图比较
来源:维基百科

欧氏距离是 Voronoi 图科学应用中最常见的距离度量。它还具有生成的 Voronoi 单元的优点。也就是说,如果你在一个单元格内取任意两点,连接这两点的直线将完全位于单元格内。

最后,还应该注意的是,Voronoi 图与 k-最*邻算法(k-NN)紧密相关,k-NN 是一种在分类、回归和聚类问题中非常流行的算法。该算法使用训练数据集中的 k 个最接*的示例来进行值预测。由于 Voronoi 图将空间划分为包含与每个种子最*的点的多边形,Voronoi 单元的边精确地对应于简单的 1-最*邻问题的判定边界。

Delaunay 三角剖分

如果你从 Voronoi 图中取出每一个点,并将其与其相邻单元中的点连接起来,你将获得一个名为 Delaunay 三角剖分的图。在数学术语中,Delaunay 三角剖分是 Voronoi 图的对偶图。在下图中,Voronoi 图(黑色)和 Delaunay 三角网(灰色)是根据一组点绘制的。

图 9:带有 Delaunay 三角剖分的 Voronoi 图
来源:作者图片

Delaunay 三角剖分就像 Voronoi 图一样神奇。顾名思义,它产生一组连接我们点的三角形。这些三角形是这样的,如果一个人在这些三角形的顶点上画一个圆,圆内将没有其他点(见图 10)。此外,Delaunay 三角剖分还具有最大化三角剖分的三角形中的最小角度的特性。因此,Delaunay 三角剖分倾向于避免带有锐角的三角形。

图 10:构建 Delaunay 三角形,使得没有点落在外接每个三角形的圆内
来源:维基百科

这些属性使它在从一组点建模表面和物体时非常有用。例如,Delaunay 三角剖分用于为有限元方法生成网格,为计算机动画构建 3D 模型,以及在 GIS 分析中建模地形。

劳埃德松弛算法

Llyod 的算法是一个与 Voronoi 图相关的有用算法。该算法包括在构建 Voronoi 图和寻找每个单元的质心(即质心)之间反复交替(见图 11)。在每次迭代中,该算法将点间隔开,并产生更均匀的 Voronoi 单元。

图 11:劳埃德松弛算法的步骤
来源:作者图片

几次迭代之后,单元将已经具有“更圆”的外观,并且点将更加均匀地分布。下图说明了这一点,在图中,我绘制了一组随机点的劳氏算法的前 30 次迭代。对于每个点,我还记录了它们的起始位置(灰色空心圆),以便更好地跟踪每个细胞的运动。对于大量的迭代,图趋向于收敛到稳定的 Voronoi 图,其中每个种子也是单元的质心,也称为质心 Voronoi 图。有趣的是,在 2D,Voronoi 单元往往会变成六边形,因为它们提供了在平面上包装形状的最有效方式。正如任何建造蜂巢的蜜蜂可以证明的那样,六边形蜂窝有两大优势:1)它们确保蜂窝之间没有空白空间(即镶嵌平面),2)六边形提供了蜂窝表面和周长之间的最高比率。这个所谓的 蜂巢猜想 ,数学家们花了两千年才证明。

图 12:劳埃德算法的 30 次迭代
来源:作者图片

在数据科学中,劳埃德算法是 k 均值聚类(T8)的基础,这是最流行的聚类算法之一。k-means 聚类通常通过在空间中取 k 个随机“质心”来启动。然后,通过在 1)将数据点分配到最*的“质心”(这相当于为质心构建 Voronoi 图,并检查哪些点在单元内)和 2)通过计算每个单元内点的平均值更新质心(参见图 14)之间交替,将数据点分组到 k 簇中。

图 14: k 均值聚类
来源:维基百科

除了数据科学,劳埃德算法还用于各种应用。例如,它在量化和有损数据压缩算法中非常常见(例如 Lloyd-Max 算法)。这也是非常有用的,只要你想随机点间隔很好。例如,它可以用于从 Delaunay 三角剖分生成平滑网格,用于抖动图像,或者作为视频游戏中程序贴图生成的基础。

如何构造 Voronoi 图?

人们可以通过逐个构建每个单元来构建 Voronoi 图。如果延伸连接每个点组合的线段的平分线,就有可能获得 Voronoi 单元的轮廓(图 15)。然而,这种技术效率很低。考虑到有 0.5(n-1)n* 个点的组合,这种算法的复杂度会随着点的数量成平方增加。

图 15:Voronoi 单元的构造
来源:作者图片

已经提出了更有效的替代方案。例如,扫描线算法通过顺序使用二叉查找树和优先级队列操作逐步构建 Voronoi 单元(图 16)。这个算法的详细描述可以在这里找到。另一种构建 Voronoi 图的方法是首先构建 Delaunay 三角剖分。一旦获得三角剖分,延伸三角形边的平分线就得到 Voronoi 图。不需要考虑每一对点就可以得到 Delaunay 三角剖分。例如,一种有效的技术是将点投影到更高维的抛物面上。将凸包重新投影到原始空间会得到 Delaunay 三角剖分。

图 16:扫描线算法
来源:维基百科

关于计算 Voronoi 图的不同算法及其复杂性的讨论可以在这里、这里和这里找到。不断有新的算法被提出来,以提高不同情况下的计算效率(如严等 2011 ,秦等 2017 )。也有需要恒定时间来生成*似 Voronoi 图的技术(例如跳跃洪泛算法)。

附加材料的链接

  • 本文讲述了约翰·斯诺在 1854 年伦敦霍乱爆发期间如何使用沃罗诺图来展示水泵和霍乱传播之间的联系。
  • Amit Patel 有一个关于游戏开发的博客。我强烈推荐他关于用 Voronoi 图生成程序地图的文章。
  • David Austin 的这篇文章对计算 Voronoi 图的扫描线算法给出了很好的解释。
  • Jason Davies 制作的这张漂亮的地图是基于世界各地机场位置的 Voronoi 图。
  • 空间镶嵌:Voronoi 图的概念和应用 是 Voronoi 图的圣经。如果你对 Voronoi 图有任何疑问,你一定会在这里找到答案。
  • 来自 Vincent Legat 的这些幻灯片包含了一些针对不同构造算法的漂亮图纸。
  • Voronoi 图常用于森林中的树木建模(如 Abellanas 等人 2016 、 Bohler 等人 2018 )。
  • Voronoi 图也可以用来确定机器人的路径。查看这些文章:第一条、第二条。
  • Voronoi 图有数千种应用。从模拟森林中的树木到规划机器人路径。在这篇文章中,我仅仅触及了皮毛。这些链接包含有趣应用的列表:链接 1 、链接 2 、链接 3 、链接 4 、链接 5 。

本文原载此处:

https://fbellelli.com/posts/2021-07-08-the-fascinating-world-of-voronoi-diagrams/

研究员摆振筛:数据驱动综述

原文:https://towardsdatascience.com/the-fellow-shimmy-sifter-a-data-driven-review-8eedc23580f8

咖啡数据科学

双层断续浓缩咖啡制作简单

圣诞老人(妈妈)给我带来了一个 Fellow Shimmy ,我很兴奋。我想看看这个工具有多好,尤其是与 Kruve Sifter 相比。我喜欢滤网,我认为它们有很多用处,尤其是对浓缩咖啡。许多人已经在网上回顾了摆振,我从数据的角度回顾摆振,以更好地了解它的效用。

摆振的目的

Shimmy 应该可以去除咖啡中的粉末,特别是为了让咖啡更好地流动。然后,用户应该把这些罚款扔掉。我认为这是对罚款来源的误解造成的错误。

在之前的中,我观察了粗磨咖啡粉,它们的味道与细磨咖啡粉大不相同。我推测粗磨咖啡的粉末来自咖啡豆的内部,因为那部分更软,更容易变成灰尘。

因此,扔掉这些粉末,你就去除了咖啡风味的一个组成部分。这并不意味着摆振是一个无效的工具,而是它的真正目的还没有实现,这是一个用于断奏咖啡的工具。分层咖啡不一定只能归入浓缩咖啡。

我发现的所有评论都集中在它作为体验的表现和对咖啡味道的影响,以及对扔掉一些咖啡渣的评论。

设计

就筛选时间而言,我可以在 3 到 5 分钟内相对容易地进行筛选。单屏幕比双屏幕的 Kruve 更快,我认为它的设计更好,因为上下运动比左右运动更自然。为了实现与 Kruve 屏幕尺寸相同的时间,我还必须包括一个搅拌器,这从经验中带走。

所有图片由作者提供

最*,我首先用 Shimmy 进行筛选,然后用 Kruve 上的一个更大的筛子进行快速筛选,得到三层断续浓缩咖啡。

技术条件

Shimmy 说它能过滤掉直径小于 200 微米的颗粒。然而,这是一个失算。

当我第一次开始用它筛选时,我注意到我的 300um Kruve 屏幕已经接*筛选输出了。所以我拿出了我的廉价显微镜,孔的形状不像圆形的。它们几乎是正方形的,这意味着对角线是真正的筛选能力。

减摆有效孔径= 282 微米= sqrt(2)* 200 微米

我在这里比较两者:

左:Kruve 300um 屏幕,右:Shimmy 200um

这是一个粗略的展示。让我们仔细看看。我用了一些图像处理来分析筛子的孔径。

在暗室中成像

这些图像显示了彩色的孔测量值,其中蓝色较小,黄色较大。它显示了孔洞大小的变化以及它们不是随机的。我有一个类似的对克鲁夫的分析。

左:更宽的视野,右:放大的图像

这种测量更具挑战性,因为与 Kruve 滤波器不同,该滤波器并不平坦。如果我们假设平均孔径为 282um,假设对角线,我们可以使用这些相对数字来评估孔径的标准偏差。

从更宽的视野图像来看,标准偏差是 85 微米,而对于放大的图像来说,标准偏差是 57 微米。相比之下,300 微米的波纹屏的标准偏差为 113 微米。这个结果应该是半信半疑的,因为除非我打开摆振屏,否则我不能准确地测量整个东西,因为我不能把它放平。

磨磨蹭蹭拨号

我已经使用摆振拨入研磨。从我过去对不连续咖啡的实验中,我知道大约一半的粒子直径小于 300 微米。对某人来说这是什么并不重要,只要他们能衡量它。我的目标是 24 克咖啡配 10 克咖啡。

因此,研磨,筛选,测量,改变研磨设置,如果没有足够的细磨。在这个过程结束时,只喝一杯咖啡,你应该非常接*最佳的调入镜头,只需稍加调整。重新研磨咖啡会比正常情况下多赚一些钱,但是你会离球场更*。您可以使用一个考虑了重新研磨的目标重量。

设备/技术

浓缩咖啡机:金快线

咖啡研磨机:小生零

咖啡:家庭烘焙咖啡,中杯(第一口+ 1 分钟)

投篮准备:断奏和内外断奏

预输注:长,约 25 秒

输液:压力脉动

过滤篮 : 20g VST

其他设备: Atago TDS 计、 Acaia Pyxis 秤、 Kruve 筛

绩效指标

我使用两个指标来评估技术之间的差异:最终得分和咖啡萃取。

最终得分 是记分卡上 7 个指标(辛辣、浓郁、糖浆、甜味、酸味、苦味和回味)的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。

总溶解固体(TDS)是用折射仪测量的,这个数字结合弹丸的输出重量和咖啡的输入重量用来确定提取到杯中的咖啡的百分比,称为提取率(EY)** 。**

强度半径(IR) 定义为 TDS vs EY 控制图上原点的半径,所以 IR = sqrt( TDS + EY)。这一指标有助于标准化产量或酿造比的击球性能。

与 Kruve 相比的摆振

首先,我并不是说,与 Kruve 筛分机相比,Shimmy 的价值完全取决于它的性能。对于 Kruve,我总是使用 3 层断奏镜头,因为它们是自然的。对于摆振,我通常做两层断奏镜头,因为这样更自然。

我认为用这两种方法制作的断续浓缩咖啡会比普通的浓缩咖啡更好,而且 Shimmy 更容易携带。摆振接*与 Kruve 相同的性能,但还不够。

****

他们在 ey 很接*,但是口味上有一些波动。就时间而言,带摆振的镜头覆盖滤镜更快,因为顶层没有分离。

味觉评分平均有统计学意义上的差异,但 TDS 和 EY 没有统计学差异。

凌乱的咖啡

使用筛子可能会很麻烦,因为咖啡不稳定。摆振最具挑战性的方面是让细颗粒没有混乱,但粗颗粒出来非常干净。与 Kruve 相比,我用的是刷子,它比 Shimmy 更乱。我已经*惯这样了,对我来说,筛过的咖啡制备造成的混乱是值得品尝的。

考虑到易用性,我希望有 Shimmy 的人尝试断奏。我也希望做颤音的人,尝试一种使用颤音的断奏形式,而不是扔掉它。我也希望咖啡馆可以使用这个工具或 Kruve 的筛子来减少浪费。

对我来说,我一直在使用 Kruve 和 Shimmy。通常,我首先使用 Shimmy,然后将粗磨过的粉末放入 Kruve 中的 500 微米筛中。

如果你愿意,可以在推特、 YouTube 和 Instagram 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以关注我在中和订阅。

我的进一步阅读:

我未来的书

浓缩咖啡系列文章

改进浓缩咖啡

断奏生活方式概述

用深度学*对抗假新闻

原文:https://towardsdatascience.com/the-fight-against-fake-news-with-deep-learning-6c41dd9eaae4

基于 LSTMs 和 BERT 的假新闻检测

马库斯·温克勒在像素上拍摄的照片

让我们玩一个游戏。我给你两个标题,你告诉我哪个是假新闻。准备好了吗?我们开始吧:

“南希·佩洛西挪用社会保障资金用于弹劾调查”

“联邦应急管理局抵达遭受龙卷风袭击的肯塔基州——带着疫苗”

嗯……事实证明,两个标题都是假新闻的例子。

残酷的现实是,错误信息和虚假信息在互联网上猖獗。根据益普索公共事务公司(Ipsos Public Affairs)为加拿大国际治理创新中心(Centre for International Governance Innovation)进行的 2019 年民意调查显示, 90%的加拿大人曾被假新闻所迷惑。

这让我想到,有没有可能创建一个模型来检测一篇给定文章的标题是否是假新闻?嗯,事实证明确实如此!在这篇文章中,我将与你分享我用 LSTMs 和 BERT 建立这个文本分类模型的经验。

你可以在我的 Github 库这里找到我使用的代码

查找数据集

我们将使用维多利亚大学的 ISOT 假新闻数据集。它包含超过 12,600 篇来自 Reuters.com 的真实新闻文章和超过 12,600 篇由 Politifact(美国的一个事实核查组织)标记的虚假新闻文章。该数据集包含与各种主题相关的文章,尽管主要是政治新闻和世界新闻。在这个链接处检查一下。

探索性数据分析

首先,让我们对数据进行一些分析,以便了解数据中可能的趋势。因为真实新闻和虚假新闻文件是分开的,所以我们需要标记并连接这两个数据帧。对于真实的新闻数据集,我们循环行数,并向 NumPy 数组添加 0(表示类)。该数组将被添加到真实新闻数据帧中。对于假新闻数据集,我们重复这个过程,但是向 NumPy 数组添加 1。

作者图片

作者图片

因为我们有 21,417 个真实新闻样本和 23,481 个虚假新闻样本,所以真实新闻和虚假新闻的比例大约是 48:52。这意味着我们的数据集相对平衡。对于我们的项目,我们只需要标题和类列。

最终数据帧|作者图片

太好了!既然我们清理了数据集,我们可以分析我们在其中发现的趋势。为了测量数据集的大小,我们将分析标题的平均、最小和最大字符长度。我们将用直方图来绘制这个频率。

作者图片

作者图片

我们看到每个条目中的字符数范围从 8 到 286。长度为 50-100 的样本浓度很高。这可以在数据集中的平均长度约为 80 时进一步看出。

预处理我们的数据

我们将使用 python 的字符串库进行一些初始预处理。它们包括:

  • 小写所有字符
  • 去掉标点符号

之后,我们将需要使用 NLTK 库对我们的数据集进行进一步的预处理。它包括:

  • ***标记化:*将一个文本分割成一个更小的称为标记的单元(每个单词将是一个数组中的一个索引)
  • ***词汇化:*去除单词的屈折词尾。例如,单词“children”将被词条化为“child”
  • ***删除停用词:*常用词如“the”或“for”将被删除,因为它们会占用我们数据集中的空间。

这意味着我们处理后的数据帧将如下所示:

作者图片

我们将基于这些数据构建两个模型来对文本进行分类:

  • 一个 LSTM 模型(我们将使用 Tensorflow 的 wiki-words-250 嵌入)
  • 伯特模型。

创建 LSTM 模型

首先,我们将把数据集分割成 80:20 的训练:测试比例。

如果我们希望我们的模型基于文本数据进行预测,我们需要将其转换为矢量格式,这样我们的计算机就可以对其进行处理。

Tensorflow 的 wiki-words-250 使用 Word2Vec 跳格结构。通过基于输入单词预测上下文来训练 Skip-gram。

例如,如果我们有这样一句话:

我将乘飞机去度假

我们将传入单词“vacation”作为输入,并将窗口大小指定为 1。窗口大小表示要预测的目标单词前后的单词。在这种情况下,它们是单词“go”和“airplane”(不包括停用词,并且“go”是“going”的词汇化形式)。

我们对单词进行热编码,所以我们的输入向量的大小是 1 x V,其中 V 是我们的词汇量。该表示将乘以具有 V 行(我们的词汇表中的每个单词一行)和 E 列的权重矩阵,其中 E 是表示每个嵌入大小的超参数。因为输入向量是一位热编码的,所以除了一个值(代表我们正在输入的单词)之外,所有值都是 0。因此,当乘以权重矩阵时,输出是 1xE 向量,表示该单词的嵌入。

1xE 向量将被传递到输出层,由 softmax 回归分类器组成。它由 V 个神经元组成(对应于词汇的一键编码),每个单词的输出在 0 和 1 之间,表示该单词在窗口大小中的概率。

word 2 vec skip program 表示|作者图片

Tensorflow 的 wiki-words-250 由大小为 250 的单词嵌入组成。它可以通过遍历每个单词并计算每个单词的嵌入来应用于我们的模型。我们将需要应用 pad_sequences 函数来考虑不同长度的样本。

作者图片

因此,在训练数据中有 35,918 个样本,最大长度是 34 个单词(较少的单词被填充),并且每个单词具有 250 个特征。

我们可以将同样的程序应用于我们的测试数据。

现在,让我们构建我们的模型。它将包括:

  • 1 LSTM 层有 50 个单位
  • 2 个致密层(一个有 20 个神经元,第二个有 5 个),具有 ReLU 激活功能
  • 1 密集输出层具有 s 形激活功能

我们将使用 Adam 优化器,一个二进制交叉熵损失和一个准确性的性能指标。该模型将被训练超过 10 个时期。请随意进一步调整这些超参数。

作者图片

如上所述,我们的模型对测试数据的最高准确率为 91.5%。

介绍伯特

如果我问你英语中有最多定义的单词,你会说什么?

根据《牛津英语词典》第二版,这个词是“set”。

如果你想一想,我们可以在不同的上下文中用这个词造出许多不同的句子。例如:

*我的铅笔是一套文具用品的一部分

我的队友排球给了我*

我摆好桌子准备吃饭

Word2Vec 的问题在于,不管单词的使用方式如何,它都会生成相同的嵌入。为了解决这个问题,我们可以使用 BERT,它可以生成上下文化的嵌入

BERT 代表“来自变压器的双向编码器表示”。它使用一个转换器模型,利用注意力机制来生成情境化的嵌入。

转换器模型使用编码器-解码器架构。编码器层生成一个连续的表示,它由从输入中学*到的信息组成。解码器层创建一个输出,将之前的输入传递到模型中。 BERT 只使用了一个编码器,因为它的目标是生成一个矢量表示来从文本中获取信息。

预训练和微调 BERT

采用两种方法来训练 BERT。第一种叫做掩蔽语言建模。在传递序列之前, 15%的单词被替换为一个【掩码】标记。该模型将使用非屏蔽词提供的上下文来预测屏蔽词。这由以下人员完成

  • 在编码器输出上应用分类层,包括嵌入矩阵。因此,它将与词汇表的大小相同。
  • 用 softmax 函数计算单词的概率

第二种方法是下一句预测。该模型将接收 2 个句子作为输入,并且预测第二个句子是否跟随第一个的二进制值。在训练时,50%的输入是成对的,而另外 50%是来自语料库的随机句子。为了区分这两个句子,

  • 第一句开头加一个*【CLS】记号**,每句结尾加一个**【SEP】记号**。*
  • 每个记号(单词)都有一个位置嵌入来从文本中的位置辨别信息。这一点很重要,因为在 transformer 模型中没有递归,所以对单词的位置没有固有的理解
  • 嵌入了的句子被添加到每个记号(进一步区分句子)。

为了执行下一个句子预测的分类,【CLS】嵌入的输出,表示“句子分类的集合序列表示法”,通过带有 softmax 的分类层*,返回两个句子连续的概率。***

掩蔽语言建模和下一句预测|作者图片

因为我们的任务是分类,要微调 BERT,只需在 BERT 的[CLS]令牌输出上添加分类层。

实施 BERT

我们将使用 Tensorflow-hub 的 BERT 预处理器和编码器。不要让文本通过我们之前描述的框架(去掉大写,应用词汇化等)。这是用 BERT 预处理器抽象出来的。

我们的数据帧最初应该是这样的:

最终数据帧|作者图片

之后,我们可以按照 80:20 的训练:测试比率将模型分为训练和测试数据。

我们现在可以用 Tensorflow-hub 导入 BERT 预处理程序和编码器

现在,我们可以开发我们的神经网络。它必须是一个功能模型,其中前一层的输出必须是下一层的参数。该模型包括:

  • ***1 输入层:*这将代表将要传入模型的句子)。
  • ***Bert _ preprocess 层:*这里我们传递输入来预处理文本。
  • ***bert _ encoder 层:*这里我们将预处理过的令牌传递给 BERT 编码器。
  • 1 脱层比率 0.2。BERT 编码器的 pooled_output 被传递给它(下面将详细介绍)
  • 2 个致密层,分别有 10 个和 1 个神经元。第一个将使用 ReLU 激活函数,第二个将使用 sigmoid。

您可以看到“pooled_output”将被传递到 dropout 层。该值表示文本的整体序列表示。如前所述,它是[CLS]令牌输出的表示。

我们将使用 Adam 优化器,一个二进制交叉熵损失,以及一个准确性的性能指标。该模型将被训练超过 5 个时期。请随意进一步调整这些超参数。

作者图片

从上面可以看到,在测试数据(来自 model.evaluate()方法)上,模型达到了 91.14%的准确率。

创建 Web 应用程序

我们可以使用 HTML 和 Flask 创建一个 web 应用程序,允许用户与我们制作的模型进行交互。

到模型前端的链接可以在这里找到,到后端的链接可以在这里找到。你可以通过 Google Colab 和 ngrok 在本地托管这个模型。

界面将如下所示:

作者图片

有三种型号可供用户选择。

  • 使用 Gensim Doc2Vec 的基线密集神经网络
  • 使用 wiki-words-250 嵌入的 LSTM 模型(使用 Word2Vec 架构)
  • 伯特模型

用户可以输入标题并选择型号。该应用程序将返回一个分类和一个概率,如果概率高于 50%,模型预测标题来自假新闻来源。因此,如果概率低于 50%,模型将预测标题来自真实的新闻来源。

我希望这篇文章展示了我们如何利用 NLP 中的技术来区分假新闻和真实新闻。你可能会问,“接下来我们能做什么?”嗯,我们的过程并没有结束。为了进一步改进我们的模型,我们可以:

  • 根据更多数据训练我们的模型
  • 调整我们模型的超参数
  • 部署我们创建的 web 应用程序

希望你喜欢阅读这篇文章!欢迎在 Linkedin 上加我,敬请关注更多内容!

文献学

[1] 用 BERT (2022),Tensorflow 对文本进行分类

[2] E .汤普森。民意调查发现 90%的加拿大人已经陷入假新闻 (2019),加拿大广播公司

[3]艾哈迈德、特拉奥雷和萨阿德。使用文本分类检测观点垃圾邮件和假新闻(2018),《安全与隐私杂志》,第 1 卷,第 1 期,Wiley,

[4]艾哈迈德、特拉奥雷和萨阿德。使用 N-Gram 分析和机器学*技术检测在线假新闻,载于:Traore I,Woungang I,Awad A. (eds)分布式和云环境中的智能、安全和可靠的系统。ISDDC 2017。计算机科学讲义,第 10618 卷。施普林格,湛(第 127- 138 页)。

[5] J. Devlin、M. Chan、K. Lee 和 K. Toutanova。 BERT:用于语言理解的深度双向转换器的预训练 (2019),arXiv

[6] R. Horev, BERT 解释道:面向数据科学的 NLP (2018)的最先进语言模型

[7] R. Kulshrestha, NLP 101: Word2Vec- Skip-gram 和 CBOW (2019),走向数据科学

为数据仓库的受控自由而战

原文:https://towardsdatascience.com/the-fight-for-controlled-freedom-of-the-data-warehouse-8537ba9323e

数据看门人死了,万岁…哦,不,我们做了什么?

尼克·比尔通过摄影站拍摄的照片。

每当我听到有人说出“数据是每个人的责任”这句话时,我的脑海中就会响起无声的警报

你也可以很容易地把这理解为“数据不是任何人的责任”。读者们,这就是我所说的“公共领域的数据悲剧”

原因如下。

术语“公地悲剧”来自经济科学,指的是在没有任何强有力的法规或护栏来遏制滥用的情况下获取一组公共资源。

随着公司吸收更多的数据并扩大对数据的访问,由于这种人类行为的不幸现实,您精心管理的仓库(或 lakehouse,我们不需要区分)可能会慢慢变成数据沼泽。

用另一句谚语来说…厨房里厨师太多会糟蹋汤。Looker 实例中有太多的管理员会导致删除、重复和一大堆其他问题。

那么,我们该如何解决这种数据共享的悲剧呢?

**在我看来,答案是给数据消费者,甚至在适当的时候给数据团队的成员提供保护或“受控的自由”**为了做到这一点,团队应该考虑四个关键策略。

移除看门人,但保留大门

不要误解我的意思:每个人都应该关心数据质量、安全性、治理和可用性。我相信,从根本上来说,确实如此。但是我也相信他们有一套不同的激励机制。

因此,他们应该添加的文档,他们需要更新的目录,他们应该编写的单元测试,他们应该使用的命名约定——这些事情都被抛到了九霄云外。他们没有恶意,只是有一个期限。

尽管如此,更快的数据访问的代价通常是维护不良的数据生态系统。当然,我们从来不想抑制数据的使用。数据民主化和扫盲很重要。但是蔓延的后果是痛苦的,即使没有立即感觉到。

很多时候,数据团队试图用技术来解决“数据民主化问题”。这很少奏效。然而,虽然技术不能总是阻止责任的扩散,但它可以帮助调整激励。最终用户或数据消费者在需要访问资源时最有动力。

我们不希望使用集中式 IT 票证系统或人工看门人来阻碍访问或降低组织速度,但是要求他们在吃甜点之前吃一些蔬菜是合理的。

例如,数据契约在过程的早期增加了一点摩擦,它要求数据消费者在任何新数据进入仓库之前定义他们需要什么(有时与数据生产者合作)。

一旦定义了这一点,基础设施和资源就可以像安德鲁·琼斯在他的以前的一篇文章中描述的那样自动配置。convert 使用与他们的数据平台负责人 Chad Sanderson 类似的流程,已经详细介绍了。

图片由 Chad Sanderson 提供。

这些数据契约系统的下一个挑战将是变更管理和到期。一旦数据消费者已经拥有了资源,那么当不再需要它们时,取消资源调配的动机是什么?

让做正确的事情变得容易

语义层是现代数据堆栈中定义和锁定聚合指标的组件,它是另一种类型的大门,使人们做正确的事情比做错误的事情更容易。

例如,对于分析工程师来说,利用 dbt 语义层中预先构建的指标作为其工作流程的一部分可能更容易,而不是必须以对同一指标略有不同的视角(重新)构建它。分析师和 LookML 也是如此。使最有效的途径成为正确的途径是利用了人性,而不是试图与之抗争。

另一个很好的方法?与已建立的工作流程集成。

活动创建者在 Unsplash 上的照片

我在过去的中已经介绍过数据目录的采用挑战,这是当保持文档更新的责任在团队中分散时会发生什么的经典例子。这些解决方案中的大部分都超出了人们的日常工作流程,需要太多的手动工作。

更现代的数据目录解决方案正在明智地尝试将其用例与数据操作工作流(Forrester 最*指出了这一点)相集成,以更好地建立明确的所有权和责任。

举一个与数据世界不同的例子,人类对登录到另一个工具的厌恶是逆向 ETL 解决方案如此大获成功的原因之一。数据从威胁用户的系统(如营销人员)转移到他们已经在利用的系统(如 Marketo 或 Salesforce)。

有时候,就让机器来做吧

传统上,数据质量也受到了公地悲剧的影响。

数据工程领导将开始他们的周会,谈论在所有生产管道中增加单元和端到端测试的重要性,直到他们脸色发青。参加 Zoom 电话会议的每个人都点头表示同意,并告诉自己他们将继续致力于这项工作。

照片由对比上的纤维不飞溅

此时会发生两件事。在大多数情况下,我们到目前为止重复的所有原因都没有发生。

但是一些团队创建了足够严密的过程,他们成功地创建并维护了数百甚至数千个测试。这就产生了…创建和维护数百甚至数千个测试的问题。 这消耗了 你们团队将*一半的工程小时。

这就是为什么在可能的情况下,公地悲剧的最佳解决方案是自动化解决方案。例如,机器学*比人类书面测试更适合捕捉大规模的数据事件(当然,它们最好配合使用)。

另一个例子是数据网格中最容易被忽视的方面——联邦计算治理。治理策略应该尽可能地编码和自动化**,因为没有实施的策略只是一个建议。**

例如,我已经看到数据团队通过在很大程度上自动化他们对数据主体请求的响应而受益,正如 GDPR 所介绍的那样。当某人请求访问公司持有的个人数据,或请求删除这些数据时,可以跨数据系统管理合规性。

数据共享区可以很漂亮…有护栏

现代数据堆栈使团队能够比以往更快地移动,并提供更多的价值。

随着团队继续朝着去中心化、自助服务和消除数据看门人的方向发展,数据领导者需要了解责任的分散会如何影响团队的执行能力。

调整激励、整合工作流、聚焦范围、自动化和运营所有权(换句话说,实现受控的自由)的团队将比创建庞大流程、依赖每周训诫或屈服于公地悲剧的团队成功得多。

连接 巴尔 蒙特卡洛团队

第一个字母是 Wordle 中最难猜对的!或者是?

原文:https://towardsdatascience.com/the-first-letter-is-the-hardest-to-guess-correctly-in-wordle-or-is-it-ca033bee086d

对 700 万个单词游戏中字母频率的分析。

图片作者。

上周,的莫娜·沙拉比联系了我,她是一名数据记者,以她的作品《T4》和《卫报》而闻名。莫娜已经看过了我最*的一些文字分析,除了其他事情之外,她还想出了一个自己的新奇的文字问题,她需要我的帮助来回答。Mona 想知道在一个字母接一个字母的基础上,Wordle 的玩家收到绿色或黄色方块(猜对了)的频率,因为这可能有助于揭示哪个字母位置最容易或最难获得有用的信息。我认为这是一个非常有趣的问题,我很乐意帮忙;你可以在莫娜最*发表在《卫报》上的文章中了解更多。

我对莫娜的分析是基于截至 2022 年 1 月 31 日发布到 Twitter 上的大约 300 万个(成功的)游戏的初始 Twitter 数据集。数据显示,第一个字母最难猜,第二和第三个字母最容易猜对,最后两个字母介于两者之间。这让我很惊讶。鉴于第一个字母在单词的拼写顺序和发音中的突出地位,我预计它是最容易猜测的——或者至少是从(绿色/黄色反馈)中获得有用信息的;我们的大脑肯定会将最初的符号/声音作为未来回忆的重要索引线索吗?而且像 ICK,ING,ED 这样的词尾不是更有特色吗?这不是应该让开头和结尾的字母更容易猜,而不是更难吗?有些事情对我来说不太合理,所以在这篇文章中,我将使用一个更*的数据集来更深入地探讨这些问题,这个数据集是在 2021 年 12 月 23 日至 2022 年 2 月 16 日期间收集的作为推特分享的>700 万个(成功的)Wordle 游戏。

对于我和 Mona 的工作,我计算了每轮游戏中每个字母位置收到绿色、黄色(猜得好)或灰色(猜得不好)反馈的比例。Mona 将生成的统计数据显示为单独的热图,分别对应绿色、黄色和灰色反馈。下面我提出了一个更紧凑的替代方案,以单个堆叠条形图的形式显示每轮游戏中的每个字母位置。例如,我们可以看到,平均来说,第 2 轮中的最后一个字母位置(突出显示)有 27%的几率被猜对(绿色),一个正确的字母(但在错误的位置;黄色)出现的几率为 14%,而在这个位置猜错字母(灰色)的几率约为 59%。

在 Twitter 上分享的 700 万个(成功的)Wordle 游戏中,每封信/每轮游戏反馈的相对比例。作者配图。

正如所料,每轮中每个字母位置的猜对(绿色/黄色)的比例都会增加。但是,并非所有字母位置都是平等创建的:

  1. 正如 Mona 报道的那样,一个单词的第一个字母是最难获得有用信息的;也就是说,不管哪一轮,第一个字母的绿色和黄色反馈的组合比例最低(猜得好)。
  2. 反之,第二个和第三个字母最容易对;直到最后一轮,它们都与最大比例的正确猜测有关。
  3. 最后两个字母介于这两个极端之间:它们比第一个字母简单一点,但比第二个和第三个字母更难。

这种方法的一个潜在缺点是,它将不同长度的游戏混在一起,例如,3 轮的短游戏与 6 轮的长游戏混在一起。这意味着早期几轮猜对的比例由短期和长期博弈组成,而后期几轮猜对的比例仅由长期博弈决定。为了解决这个问题,下面的图表展示了相同类型的分析,但是游戏是按长度分组的。

单个字母的比例会发生变化,例如,在短游戏的前几轮中,猜对的比例更大,但相对关系保持不变:第一个字母仍然最难猜对,其次是最后两个字母,而第二个和第三个字母最容易猜对。

发布到 Twitter 的(成功)游戏的每封信/每轮游戏反馈的相对比例,按游戏长度分组。括号中的数字表示 Twitter 数据集中给定长度的游戏的总百分比。作者配图。

为什么会这样?为什么第一个字母最难写对?这感觉与直觉相反,因为单词的开头非常重要,至少在我的猜测中是这样。据推测,这与出现在第一个位置而不是其他位置的字母有关。

最值得注意的是,在每个字母位置的元音频率和观察到的正确猜测率之间有很大的关系。元音作为单词的第一个字母出现的频率相对较低(仅占 14%),在最后两个字母位置出现的频率也相对较低(24–36 %),但在第二个和第三个位置出现的频率要高得多(50%>)。我发现这有点出乎意料,至少在差异的规模方面是如此。虽然我预计元音字母作为第一个字母不太常见,但我没有想到它们会比第二个或第三个字母的情况少 3 倍。

重要的是,元音的这种频率模式类似于每个字母位置中正确猜测的比例,如下所示。虽然元音和好猜的实际比例不同,但两者的关系高度相关(R2 = 0.92);r2 值为 0.92 表示 92%的正确猜测比例的变化可以用元音比例的变化来解释。

通过字母位置、每个字母位置的元音频率以及基于元音频率的预期猜对率来比较猜对(绿色/黄色反馈)的频率。作者配图。

但是,为什么呢?为什么元音的比例会影响猜对的比例?一个原因与英语中元音和非元音(辅音)的数量有关。只有 5 个元音(A、E、I、O 和 U),但有 21 个辅音,所以元音有助于显著约束我们的猜测选项。

考虑一下这个,如果 50%的单词在位置二有一个元音,那么这个位置猜对的几率大概是0.5 (1/5)+(1–0.5)(1/21)~ 0.127。相比之下,位置一(只有 14%的单词有元音)猜对的几率更接*于0.14 (1/5)+(1–0.14)(1/21)~ 0.068。换句话说,仅仅是偶然,我们猜对立场二的可能性应该是立场一的两倍。对于每个字母位置,这些估计显示为上面的虚线。

当然事情没有这么简单。字母不是偶然出现的——特定的字母组合比其他字母组合更有可能出现(屈,圣,ING,)等。)——玩家不会随意猜测,我们使用我们的英语知识,并根据 Wordle 提供的反馈进行构建。所以毫不奇怪,正确猜测的实际比例与这个简单的*似值有些不同;也就是说,上面的(实际)好猜率明显高于单纯靠运气预测的预期好猜率。

事实上,即使第一个字母是预期更难猜,并且在实践中更难猜,玩家对这个字母的表现比预期的要好。例如,虽然字母 1 的预期正确猜测率是字母 2 的一半,但实际上字母 1 的正确猜测率几乎是字母 2 的正确猜测率的 85%。换句话说,第一个字母的实际猜对率比随机预期的要高 50%。按照类似的逻辑,最后一个字母的正确猜测率比预期的要高 30%。

一项对超过 700 万个单词游戏的分析显示,一些字母位置比其他的更难猜对。把第一个字母写对是最难的,接下来的两个字母是最容易的,最后两个字母在中间。

考虑到单词的首字母和尾字母的重要性,乍一看这似乎是违反直觉的,但这可以部分地由字母位置 1、4 和 5 处元音的单词相对较少以及位置 2 和 3 处元音的单词相对较多来解释。事实上,当我们对此进行控制时,我们可以得出结论,玩家在位置 1、4 和 5 的表现比预期的要好,这可能是因为单词的开始和结束的重要性。

如果你想更多地了解 Wordle 的数据能告诉我们人们如何玩,以及你如何能更有效地玩,那么看看我最*的帖子:

  • 我从玩了一百多万场 Wordle 游戏中学到了什么
  • 如何在 Wordle 中猜对
  • 300 万条 Wordle Tweets 之后:对 Tweets 的分析揭示了关于 Wordle、它的词和它的玩家的什么。
  • Wordle 起步不好的代价以及如何避免。
  • 峰字和 y 字难

马尔可夫决策过程的五个组成部分

原文:https://towardsdatascience.com/the-five-building-blocks-of-markov-decision-processes-997dc1ab48a7

通过掌握马尔可夫决策过程的基本原则来定义和交流您的强化学*模型

照片由 Mourizal Zativa 在 Unsplash 上拍摄

正确制定马尔可夫决策过程 (MDP)的能力对于成功的强化学*(RL)实践者是必不可少的。需要一个清晰的数学模型来(I)正确地编码它并训练解决算法,(ii)用统一的语言与利益相关者交流,以及(iii)明确抽象和简化。

MDP 作为一个框架来形式化顺序决策问题,其中随着时间的推移决策被分解成一系列子问题。在规范形式中,MDP 由一个元组 (S,A,R,P,γ)描述。本文将详细阐述每个元素。

状态空间

状态s∈S包含计算决策、奖励和转换所需的所有信息;状态空间T2 是包含所有状态的集合。MDPs 的一个核心概念是决策完全基于系统的当前状态(无记忆属性);过去的状态不应该成为决策的因素。一个常见的误解是,一个国家不能纳入过去的信息;这实际上是允许的(高阶马尔可夫模型,见 Salnikov 等人)。

在某些情况下,状态是一个简单的标量,例如代理在一维线上的位置。通常,状态将是一个向量。考虑一个机械臂,其状态由三个关节的角度s=[x,y,z]描述。股票投资组合状态可以用当前价格水平和每只股票的持有量s=[p_1,p_2,…,p_n,s_1,s_2,…,s_n]来描述。一个大型仓库可能有 10,000 个条目状态,描述每个产品的数量。

没有必要停留在物理世界的边界。鲍威尔区分了三种状态成分:(一)物质,(二)信息,(三)知识。大纲如下。

一、身体

“身体的”这个词在这里可能用得有点不严格;想想卡车的位置,你银行账户上的钱,或者无人机的电池电量。它捕获系统或可用资源的物理属性。不幸的是,许多建模者将状态等同于物理属性,因此忽略了相关信息。

二。信息

除了直接从系统中获得的属性,我们还经常在决策中使用额外的信息。如果我们有一个股票投资组合,股票价格(市场数据)就是信息。对于一个风电场,它可能是风速和风向。

信息也可以与过去或未来有关。过去的股票价格可能揭示相关的趋势,这些趋势不能仅仅从现在的价格中获得。如果我们有一个下周确认的大生产订单,这是本周起草生产计划时的相关信息。

这些类型的信息似乎与无记忆属性相冲突。然而:如果你知道世界末日是在下周四,你可能不会在周五完成那份报告,对吗?我们只是简单地包括我们知道的州的相关信息。

重点是‘知道’。从蒙特卡洛模拟或建模者的知识中,我们可以得到许多代理人不知道的信息。应该从决策代理人的角度添加信息,决策代理人不具备透视技能。

三。信念

我们可能不仅仅基于已知信息做出决策,还会基于不确定的信息或信念。我们现在可以测量出准确的风速,但在本周的其余时间里,我们要依靠天气预报。仓库可以利用销售预测模型。过去的股票价格可以用来预测未来的股票价格。对于信念,我们通常指的是捕捉某些知识的概率分布。

作为指导方针,州政府应该包含所有用于做出明智决策的相关数据——不多也不少。如果某些数据不影响决策、奖励或转换,则不应将其纳入状态。

https://wvheeswijk.medium.com/a-deep-dive-into-problem-states-498ad0746c98

行动空间(A)

对于 MDPs 来说,不可或缺的是对系统进行某种程度的控制的能力。动作a∈A —在某些域中也称为决策控制—描述了代理的这种影响;动作空间A包含所有(可行的)动作。至于状态,动作可以是简单的标量(‘行权选项*a∈{0,1}*),也可以是高维向量(‘订单 *a_i* 产品类型*i*)。

对于状态无关的动作,相同的动作空间A适用于每个状态。对于很多问题来说,动作是状态依赖的 (动作空间A(s)):棋盘上的走法取决于当前的棋子及其位置,蓄水池不能排到负数。有时,假设动作空间是状态无关的(例如,在深度 Q 学*中)并简单地屏蔽不可行的动作是方便的。

对于允许各种排列的基于向量的决策,动作空间的枚举可能会成为问题。此外,通常很难评估行动是否可行。考虑原材料、优先关系、存储能力、机器可用性等有限的生产线的决策。仅仅验证一个时间表是否有效就构成了一个复杂的子问题。在这种情况下,我们需要使动作空间服从一组约束,例如,通过将动作问题公式化为数学程序**。一个额外的好处是,它大大增加了可以处理的行动空间的大小。**

**

奖励函数(R)

MDP 模型需要优化一些目标函数,通常是(贴现的)累积报酬。奖励功能R(s,a)捕捉直接奖励,与个体决策时刻相关的成本或贡献,依赖于状态s和/或行动a。有时回报是显而易见的,例如股票交易带来的金钱收益和损失。在其他情况下,需要更多的人工构造,例如赢得游戏或达到目标的奖励。然后,有必要将奖励与解决问题的目标结合起来。

非零奖励不一定在每个时期发生,例如,它们可能仅在一集的结尾被接收(赢得/输掉一场游戏)。在 RL 中,我们经常求助于奖励塑造,引入中间奖励来识别‘好’的行动,并指导算法。奖励塑造应该小心使用,因为它改变了原来的问题设置,并可能引入意想不到的行为。

转移函数(P)

在 MDP 中,我们采取离散的时间步骤,从一个状态(s)移动到下一个状态(s’)。这个转换函数取决于(I)当前状态s、( ii)动作a和(iii)随机信息ω。转换可以分解为确定性部分和随机部分,其中a描述确定性部分,而ω描述随机部分(尽管通常是混合,转换可能是完全确定性的或完全随机的)。

在 MDP 公式中,转移函数通常隐藏在看似简单的概率中P(s’|s,a)。确实具有欺骗性,因为它通常是最难建模的组件。事实上,转换函数的范围可能从一个平凡的确定性函数(例如 GridWorld 中的一个步骤)到一个高度复杂的现实的数字孪生表示,有许多不确定性需要建模。

虽然转移函数是 MDP 的必要组成部分,但在 RL 中我们不一定要明确定义它。相反,我们可以观察来自环境的转变 。如果我们学*玩超级马里奥游戏,我们可能不知道实际的转换函数;我们只是试着移动,然后观察会发生什么。我们甚至可以利用真实世界的观察(例如,当控制取决于天气情况的风电场时)。在这种情况下,世界本身就是我们的过渡函数!

[## 什么是后决策状态?他们想从我们这里得到什么?

towardsdatascience.com](/what-are-post-decision-states-and-what-do-they-want-from-us-9e02105b7f40)

折扣系数(γ)

贴现因子 γ ∈ [0,1]并不总是包含在 MDP 元组中,因为它对于有限范围是可选的。简而言之,它表明未来奖励在多大程度上被纳入当前决策,其中γ=0完全不考虑未来奖励,而γ=1平等地权衡所有未来奖励。使用贴现率有各种各样的理由,主要的一个理由是确保无限期问题的价值函数收敛。

任何设置γ<1都足以保证(理论上的)收敛,但是精确的设置对于优化目的很重要。一个普遍的经验法则是,系统的不确定性越大,贴现率就越高,这反映了今天的行动对未来表现的影响有限。

摘要

马尔可夫决策过程由以下构件组成:

  • 状态空间状态可以分为物理 -、信息 -和信念属性,并且应该精确地包含前述目的所需的属性。
  • 动作空间T2——包含所有(可行)动作的集合。对于依赖于状态的决策 a(s),可能需要使动作空间服从一组约束,例如,使用数学编程。
  • 奖励功能 R —表示s状态下a动作时直接奖励。在许多问题中,奖励不是自明的,需要奖励塑造来完成解决问题的目标。不良的奖励功能可能会导致不良行为。
  • 转移函数 P —控制系统随时间的动态的函数,引导代理从状态ss’。该转换通常包括确定性成分(动作a)和随机成分(外部信息ω)。可以从外部环境中观察到转换,而无需对其进行显式建模。
  • 贴现因子 γ —定义未来奖励对当前决策的影响程度。当问题是无限时域的并且依赖于累积报酬目标函数时,贴现率γ<1对于确保收敛是必要的。贴现率通常根据环境的不确定性来设定。

每个构件都可能隐藏着巨大的挑战。MDP 的建模方式可能会显著影响求解算法的有效性。此外,在商业和学术环境中,定义清晰的 MDP 的能力对于统一交流问题抽象非常重要。

虽然 MDP 公式可能有点麻烦,但从长远来看,正确地使用它是值得的。

参考文献

鲍威尔,W. B. (2019)。随机优化的统一框架。欧洲运筹学杂志275 (3),795–821。

使用高阶马尔可夫模型揭示网络中基于流的社区。 Sci Rep 6、 23194 (2016)。https://doi.org/10.1038/srep23194**

傅立叶变换,应用(4):让快速傅立叶变换发挥作用

原文:https://towardsdatascience.com/the-fourier-transform-4-putting-the-fft-to-work-38dd84dc814

傅立叶变换的实际应用

现在,我们已经拥有了演示 FFT 的一些真实用例所需的所有工具!

查看该系列的前几篇文章!

  • https://towards data science . com/the-Fourier-transform-1-ca 31 ADB FB 9 ef
  • https://towards data science . com/the-Fourier-transform-2-understanding-phase-angle-a 85 ad 40 a 194 e
  • https://towards data science . com/the-Fourier-transform-3-magnitude and-phase-encoding-in-complex-data-8184 e2ef 75 f 0

介绍 IFFT

到目前为止,我们已经将傅立叶变换视为数学黑盒操作。类似地,我们现在将介绍傅立叶变换,而不剖析实现细节。逆傅立叶变换(IFFT)让我们逆转 FFT!

傅立叶变换是一种数学运算,它将我们在频域中的函数映射到时间或空间域中的函数信号。**

IFFT(FFT(x)) ≈ x,逆性质成立!

重要的是,这种逆运算允许我们在频域和时间/空间域之间跳跃,以最方便的方式处理数据。

傅立叶变换的应用

让我们开始研究傅立叶变换的实际应用吧!

滤波和去噪

FFT 为我们提供了宝贵的“去噪”技术来抑制或消除数据中的伪像。首先,让我们考虑一个受一些低功率白噪声影响的*似稳定的信号。为了演示,我们可以使用我们在 之前使用的相同的纯音信号(图 1 “无噪声信号”)。此外,尽管如此,让我们添加一些高斯噪声到信号中(图 1 ,“噪声信号”)。

正如我们之前所做的那样,我们可以使用傅里叶变换来查看频率成分(图 1 、“无噪声 FFT”和“有噪声 FFT”)。

图 1 :从纯音信号中去除低功率噪声的简单去噪。图片作者。

超级有趣!在 FFT 中,我们可以看到我选择添加的噪声的一些属性。我添加的高斯噪声是零均值加性“白”噪声:它在不同频率上的强度大致相等。

尽管噪声在时域中看起来很可怕,但在频域中很容易分离出来。通过观察傅里叶变换的幅度值,我们可以将幅度视为频率的函数。在这个简单的例子中,我们可以非常容易地完美恢复我们的无噪声信号!由于信号和噪声之间有清晰的分离,我们可以设置硬阈值并丢弃(即设置为零)低幅度分量。保持阈值以上的值(图 1 ,绿色的“有噪声的 FFT”)并降低阈值之前的值(图 1 ,红色的“有噪声的 FFT”),我们得到了无噪声信号的良好重建(图 1 ,“去噪信号”)!

我们通常不会这么幸运。真实世界的噪音可能更糟糕!在许多情况下,噪音可能比我们的信号更大。但是,我们可以使用许多其他方法!

为了触及一种常见的滤波方法,我们来看看带通滤波器。带通滤波器由两个阈值组成:(1)去除低于某个阈值的频率,允许较高频率通过(即“高通”)的滤波器,以及(2)去除高于某个阈值的频率,允许较低频率通过(即“低通”)的滤波器。结合起来,这两个滤波器只允许低频截止和高频截止之间的“频带”通过。

让我们在信号中加入一些高频成分。实际上,这些可能是我们环境中不想要的人为因素(例如,我们声音示例环境中不受控制的音频源)。

图 2 :从纯音信号中去除高频伪像的简单去噪。图片作者。

现在,我们不再为最小幅度设置硬阈值,而是将通带外的频率成分设置为零(图 2 “噪声 FFT”)。我们再一次从噪音中恢复信号!

特征抽出

我们也可以使用傅立叶变换来提取数据的特征。如果你之前遇到过小波卷积的想法,还有一个很深的数学联系!如果你对一篇深入探讨卷积定理的文章的评论感兴趣,请告诉我!

不过现在,我们可以通过可视化不同的频率成分来关注一个简单的例子。当我们在做这个的时候,让我们尝试一下傅立叶变换的 2D 推广!

我们建立的所有直觉仍然适用!靠*原点的值对应于低频,远离原点的值对应于高频。如前所述,np.abs 将恢复幅度,np.angle 将恢复相位。

如果我们只想检查图像的边缘,我们可以查看高频值,将原点附*的傅里叶变换分量的幅度设置为零(图 4 )。

图 4 :简单去除低频图像成分,可视化高频。作者图。摄影师 Lav Varshney 拍摄的照片 CC0。

我们还可以通过将远离原点的值设置为零,来查看缓慢变化的低频分量!

图 5 :简单去除高频图像成分,可视化低频。作者图。摄影师 Lav Varshney 拍摄的照片 CC0。

我们可以利用这些技巧来提取各种有趣的统计特性。同样的方法也适用于一维时间或空间数据,使我们能够将缓慢移动的低频趋势与时间序列数据(如股票价值或整体市场分析)中的突然变化区分开来。

其他应用

还有数不清的其他用途,但如果你有兴趣进一步阅读,这里有几个想到的:

  • 有损图像压缩(如 JPEG )通常使用变换到频域,
  • 物理系统建模(像热力学!此外, 3blue1brown 是绝对的灵感),
  • 对齐和注册方法获取照片(或时间序列数据!)排队,
  • 周期性生物现象(如呼吸率、心率)的估计和预测,以及
  • 无线电数据分析和处理。

关于傅立叶变换,我们已经学得够多了,以至于危险!我们已经成功地充分发展了我们的直觉,能够解决现实世界的问题。如果你想看到其他傅立叶概念的解释,请留下评论。感谢阅读!

接下来,我们将介绍常见操作的傅立叶“备忘单”以及它们在工具箱中的位置。

完全更新的指南,您可以在 2022 年使用它学*数据科学,而无需获得学位

原文:https://towardsdatascience.com/the-fully-updated-guide-you-can-use-to-learn-data-science-in-2022-without-getting-a-degree-8e73e416c21b

确切地说,你如何在不倾家荡产的情况下,通过三种不同的方式自学数据科学

在 Unsplash 上泰沛拍摄的照片

关于如何自学数据科学的每一篇文章都有一个共同的问题:它们没有教你如何扩大学*规模以满足现实世界的要求。

不要误解我的意思,甚至我关于自学数据科学的文章也成为了这个问题的牺牲品。他们没有提供一个明确的增长计划来帮助读者增长技能,以便他们一旦被聘用就可以立即投入工作,而是倾向于在读者开始建立他们的数据科学组合的时候停滞不前。

这个游戏的名字是可扩展性,特别是如果你是那些希望在一年内学*数据科学并获得业内每个人都在谈论的难以捉摸的六位数薪水的人之一。

即使在 2022 年,数据科学无疑是最性感的技术领域之一,拥有六位数的工资,低失业率,并能够在世界任何地方工作。如果说疫情让我们想起了什么,那就是数据触及每个行业,对数据的理解是确保世界继续运转的关键。可以想象的每个行业都有数据科学家的空间,让您有机会学*在任何激发您灵感的行业中进入数据科学角色所需的技能。

今年的指南提出了学*数据科学的三种选择:在线课程、训练营和使用在线资源的自学课程。在去年写完如何自学数据科学的指南后,我意识到并不是每个人的学*方式都一样。通过涵盖三个选项,包括在线认证计划、训练营和全面自学,所有学*类型和方式的人都将能够更好地受益,并有望实现他们成为数据科学家的目标。

阅读去年关于自学数据科学的文章:

在线数据科学项目。

截至 2022 年,有三个在线数据科学项目由一些技术领域的知名人士提供,在教授学*者数据科学方面非常成功。

谷歌、IBM 和微软开发了三个不同但世界一流的在线数据科学项目,帮助学*者成为数据科学家,而不必支付传统的四年制数据科学学位所需的数千美元。

虽然每个计划都不同,但事实是每个计划都为您提供了成为数据科学家所需的知识,费用不到 500 美元。这些计划也得到雇主的认可,并为人们进入数据科学专业提供了途径,否则他们可能没有机会。

2021 年 4 月,我写了一篇文章,回顾并比较了这三个方案。下面是我的调查结果的总结,提供了每个项目的全面比较,以更好地帮助您选择适合您的项目。要阅读全文:

谷歌数据分析专业证书

https://grow.google/dataanalytics/#?modal_active=none

**技能等级:**初学者

**课程交付:**在线

**持续时间:**大约 6 个月(建议 10 小时/周)

价格:$ 39/月(美元),通过 Coursera(在 6 个月内完成本课程将花费$234(美元))

**学到的技能:**电子表格、数据清理、数据分析、数据可视化、SQL、提问、决策、解决问题、R、Tableau、元数据、数据收集、数据伦理、样本量确定

课程设置: 8 门课程

IBM 数据分析师专业证书

https://www.coursera.org/professional-certificates/ibm-data-analyst

**技能等级:**初学者

**课程交付:**在线

**持续时间:**大约 11 个月(建议每周 3 小时)

价格:$ 39/月(美元),通过 Coursera(在 11 个月内完成本课程将花费$429(美元))

**学到的技能:**微软 Excel、Python、数据分析、数据可视化、SQL、数据透视表、IBM Cognos Analytics、仪表盘、Pandas、Numpy

课程设置: 9 门课程

微软认证:数据分析师助理

https://docs.microsoft.com/en-us/learn/certifications/data-analyst-associate/

**技能等级:**初级/中级

**课程讲授:**在线(免费)或面授(付费)

**持续时间:**大约 11 个月(建议每周 3 小时)

**价格:**考试费 165 美元

**学到的技能:**数据准备、数据建模、数据可视化、数据分析、部署和维护可交付成果、微软 Dataverse、R、Python、AI Insights、微软 Power BI

课程设置: 16 个模块

谁应该参加在线计划来学*数据科学?

上面概述的三个在线数据科学课程面向当前的学生、全职或兼职工作的人,或者有难以全职学*的生活承诺的人。这些程序可以每周学*几个小时。

此外,这些项目(微软的项目除外,除了考试费之外,其他项目都是免费的)是为那些有一点钱的人准备的,这些钱可以投入到他们的学*中,但并没有多到训练营或学位有意义。

最后,这些计划是为那些在学*道路上需要比自我指导学*稍微多一点指导的人,以及那些需要稍微多一点动力来完成学业的人(你完成计划越快,你需要支付的费用就越少)。

如何选择适合自己的在线数据科学课程?

  1. 选择教授你最感兴趣的技术(并且在你的目标行业中最常用)的项目。
  2. 选择你觉得最划算的项目(这取决于在学*环境中什么对你最重要)。
  3. 选择能给你实践经验并帮助你建立数据科学投资组合的项目(项目结束时的项目是关键)。
  4. 选择提供职业学*和帮助的项目(如面试准备、简历制作帮助、模拟面试、职业网络活动)。

如何学*这些在线数据科学课程。

以下是一些关于如何最好地学*这些数据科学课程的资源:

[## 如何学* IBM 数据分析师专业证书

towardsdatascience.com](/how-to-study-for-the-ibm-data-analyst-professional-certificate-427a16da9fd9)

完成在线课程后如何衡量你的学*?

幸运的是,现有的在线数据科学课程(特别是谷歌提供的课程,请阅读我关于为什么谷歌有最好的在线数据科学课程的完整文章——链接如上)提供了全套课程,为你提供理论、实践和课程后学*,这些都是在课程完成后提升你的能力所必需的。

鉴于完成这些课程是进入该行业并结识能够帮助获得第一次真实世界体验的数据科学专业人士的好方法,完成这些课程后的下一步是寻找数据科学实*或做公益工作,以培养您的真实世界解决问题的技能。

关键是做一些项目,帮助你建立解决特定行业问题的技能,同时获得行业知识。当你得到第一份数据科学家的全职工作时,这两件事会帮助你迅速进入状态。

数据科学训练营。

对于那些有更多的钱和时间致力于数据科学研究的人来说,训练营可能是一个不错的选择。

数据科学训练营以在线或面对面的方式提供,可以持续 1-6 个月,学费从 9000 美元到 20000 美元不等。训练营的长度、结构和复杂性决定了它的总成本和质量。

数据科学训练营经历了指数级增长,现在有数百家公司提供这些快速学*机会。这里有一个很好的资源,总结了 2021 年 10 个最佳数据科学训练营,以及其他 17 个值得考虑的荣誉奖:

https://www.computerscience.org/bootcamps/rankings/data-science/

谁应该参加数据科学训练营?

训练营是为那些有时间和金钱可以花在数据科学教育上的人准备的。这些课程通常非常密集,这意味着需要全日制学*(如果参加面对面的训练营,还需要在不同的地方生活很长时间)。

训练营也是为那些需要一个非常结构化的学*环境的人准备的,当他们在教室环境中接受指导时学*效果最好。训练营也是从教练那里获得即时反馈和从同学那里获得帮助的好机会。

如何选择适合您的数据科学训练营。

  1. 选择一个成功率和结果完全透明的训练营(当涉及到教授高质量的课程并让学生找到工作时,并不是所有的训练营都是平等的)。
  2. 选择一个能收到很好的学生评价的训练营,这些学生能保证这个项目的成功(你花了很多钱,你最好确保你选择的项目是合适的,并且能为学*者带来成功)。
  3. 选择一个训练营,教授你最感兴趣的、与你的目标行业最相关的技术。
  4. 选择一个提供不同融资选项的训练营(好的训练营提供贷款、融资选项,或者保证你在找到工作之前不用支付一分钱——确保你阅读了细则)。

如何在数据科学训练营后扩展您的学*?

如果你选择了正确的数据科学训练营,你应该和你的新老板坐在一起讨论你毕业后不久的第一个大项目。换句话说,你应该具备在你的第一份数据科学工作中顺利开展所需的所有技能。

如果没有,下一步是重新审视你所学的技能,并确保它们适用于你的目标行业。这是时候找出你学*中的任何差距,并学*如何获得让你获得就业地位所需的行业知识。为了填补这些空白,社交活动、当地信息之夜或研讨会都是帮助你了解关键行业信息的好工具。

下一步是将行业信息应用到个人数据科学项目中。许多公司向公众发布他们希望分析的数据。这是解决现实世界问题的绝佳时机,也是向这些公司展示你能解决他们最大的数据问题的绝佳时机。

其他扩展机会包括申请无薪实*、与导师合作或做公益工作,以增强和扩展您的数据科学技能。

此外,现在是学*如何在企业层面应用数据科学技能的时候了。训练营通常会让你做一些小项目,这些小项目不会被整合到更大的计划中,然而在现实世界中,你的工作需要能够被包含在主要系统中,而不会引起大的停顿。这意味着学*如何使用云服务和大数据等技术,以及如何编写生产就绪的代码。

自学课程。

构建自学课程是学*数据科学最廉价、最灵活、最个性化的方法。你不仅可以免费(或几乎免费)学*数据科学,还可以利用网络上高度可用的资源按照自己的节奏学*。

由于当今数据科学家的慷慨和独创性,制定学*计划变得更加容易,甚至可以解决数据科学中最复杂的概念。

以下建议的课程分为五个部分,按照应该学*的顺序呈现:编程、数学和统计、数据分析和可视化、机器学*和项目。

注意:你可能会注意到,这些课程中有许多与 2021 课程中概述的课程相同。下面列出的课程是经过 2021 年课程设置中的课程后精心挑选的精炼列表的一部分。这些为 2022 年策划的课程提供了最好的学*例子,提供了全面的经验和可转移的技能,所有这些都以易于理解的形式包装起来。

编程;编排

Python

  • Python for Data Science | 加州大学 via edX
  • Python 数据结构| 密歇根大学 via Coursera
  • Python 认证的科学计算| freeCodeCamp

SQL

  • SQL —计算机科学导论—哈佛 CS50 (2018) | 自由代码营
  • 用于数据分析的 SQL |uda city
  • 数据科学 SQL |加州大学 via Coursera

数学和统计学

  • 15 分钟大学水平的统计学入门课程| 数据科学
  • 线性代数| 可汗学院
  • 多变量微积分| 可汗学院

数据清理、分析和可视化

  • 获取和清理数据| 约翰霍普金斯大学
  • 使用 Python | IBM via Coursera 进行数据分析
  • 用 Python 实现数据可视化| IBM via Coursera

机器学*

  • Python 的机器学*:实用介绍| IBM via edX
  • 程序员实用深度学*——来自 fast.ai 和杰瑞米·霍华德的完整课程| freeCodeCamp

项目

以下链接提供了一些想法和资源,可帮助您选择利用您所学的所有技能来构建您的问题解决技能、行业知识以及最重要的数据科学组合的项目。

</5-concrete-real-world-projects-to-build-up-your-data-science-portfolio-ef44509abdd7>

谁应该学*数据科学的自学课程?

自学课程是为那些有能力在没有什么结构的情况下自己保持专注学*的人设计的。自学课程是为那些需要灵活性、低成本和完全定制学*的人设计的。

对于已经具备成为数据科学家所需的一些基础知识,但只需要将这些知识结合起来的人来说,自学课程也是很好的选择。例如,对于受过软件开发培训的人或者是数学家,但只需要补充缺少的技能的人来说,这是一个很好的学*选择。

如何自学数据科学?

整合完整的数据科学课程是一回事。坚持到底并完成它是另一回事。自学是一种独特的经历,需要纪律、动机和专注的正确结合。对于那些以前从未自学过的人来说,很容易进入充满能量的过程,但几周后却筋疲力尽。

以下是一些关于如何自学数据科学(以及如何坚持学*)的资源:

[## 如何使用渐进超负荷方法积极提高你的数据科学技能在 6…

towardsdatascience.com](/how-to-use-the-progressive-overload-method-to-aggressively-improve-your-data-science-skills-in-6-da7e932de68e)

自学数据科学后如何衡量自己的学*?

与上面列出的其他两条学*路径一样,在学*了基础知识之后,扩展学*的关键是专注于学*现实世界中的问题解决技能,以及如何编写生产就绪代码和产生影响所需的适量行业知识。

这种缩放对于自学者尤其重要,因为付费选项的引导性质通常提供这种类型的指导和这种类型的机会。

提供无偿服务、参加黑客马拉松比赛、处理寻求解决特定问题的公司提供的真实世界数据,或者实*都是在学*基础知识后增长知识的绝佳机会。重要的是获得作为“数据科学家”的实践经验,以巩固你对概念的理解,并学*如何在现实世界中应用它们。

最后的想法。

随着时间的推移,成为数据科学家的道路变得越来越容易,为有抱负的数据科学家提供了围绕不同情况以多种方式灵活学*的机会。

灵活性和选择是构建今年数据科学学*指南的两个主题,重点是认识到没有一种方法是正确的。该指南提供了一种增强的、有针对性的学*数据科学的方法,重点关注去年的成功经验以及今年如何改善体验。

现在唯一的要求是选择你的道路,投身于这一新的努力,并收获学*这一备受追捧的技能带来的回报。

色彩在数据中的作用:一个简单(但完整)的指南

原文:https://towardsdatascience.com/the-function-of-color-in-data-viz-a-simple-but-complete-guide-c324ca4c71d0

作者配图

有意义地使用颜色

创建生动图表所需的一切

颜色在任何设计中都扮演着重要的角色,数据可视化也不例外。除了设定基调,它还经常影响我们的感知。考虑下面的例子。不看标题,如果看到左边的图表(红色的)你会怎么想?如果你看到右边的图表(蓝色的),你会怎么想?

Gif 作者,基于安迪·科特格里夫的文章[1]。原始资料图来源:S. Scarr, 伊拉克的血腥代价 (2011),南华早报。

两个图表使用相同的数据;事实上,它们是镜像。第一个版本是警醒——红色带有负面的内涵,它让我们想起墙上滴下的鲜血。看这个版本,你倾向于关注极端的数字。相比之下,第二个版本似乎传递了相反的信息。蓝色即使不是积极的,也是一种更中性的色调,你倾向于关注最*数量的减少。在这两种情况下,暗示性的标题都强化了信息。但是我们得到不同的见解,关注不同的方面,因为我们感知了颜色,即使没有看到标题。

这是因为颜色是前注意属性之一,是我们立即察觉的视觉特征,无需有意识的处理。它在我们没有意识到的情况下影响了我们的感知。这个过程是无意识的,由文化和我们以前的经历驱动。因此,它可能因人而异。幸运的是,一些指南帮助我们小心使用颜色。我推荐检查一下大卫·麦克肯多斯创作的文化图中的颜色。

色彩的功能

正如已经提到的,你可以用颜色来设定基调。尽管这个功能很重要,值得掌握,但我还是想重点介绍另外三个有时被忽略的功能:显示关系显示不同状态显示值

这三者都是从认识数据点和我们应该使用的调色板之间的关系开始的。如果你不熟悉调色板和它们的用法,我推荐你从我之前关于这个主题的文章开始。如果你知道分类调色板、顺序调色板和发散调色板之间的区别,让我们分析一下如何将它们结合起来,使用标准的气泡图来显示颜色的不同功能。

在下面的例子中,颜色扮演了一个纯粹的装饰角色,并设置了一种情绪,而不是其他任何东西。给数据墨水*着色没有额外的价值。

*数据墨水是爱德华·塔夫特创造的一个术语。这意味着墨水致力于数据信息的非冗余显示[3]。

作者配图。缺少颜色编码的例子。

使用颜色来显示关系

显示关系有两种方式:分类或分组。在这两种情况下,我们都希望将一个集合中的成员与其他集合中的成员区分开来。另外,在分组的情况下,我们想要显示情感。这需要使用不同的方法。对于分类,我们应该使用分类颜色,而对于分组的分歧。

作者配图。分类:显示关系的示例

  • **功能:**分类
  • **颜色:*分类
  • **目的:**区分一个类别与另一个类别
  • **良好实践:**保持颜色易于区分,亮度相似。你不必对后者非常严格,只要其中一个类别不比其他类别更突出,你就很好(见下面的例子)。

*如果你的类别遵循某种自然顺序(例如,年龄组、收入组、教育水平),你可以考虑使用连续调色板或相邻色调的分类[4]。

作者配图。所选分类调色板的颜色亮度值。

作者配图。分组:显示关系的示例

  • **功能:**分组
  • **颜色:**有无中点发散(浅灰色)
  • **目的:**将一个类别与另一个类别区分开,并显示情感(某物是好的/上面或坏的/下面)
  • **良好实践:**使用保持自然联想的颜色,具有相似的亮度(这样一种颜色不会比另一种更突出/吸引更多的注意力),并且容易被视力有缺陷的人区分。

最常见的显示关系好坏的颜色组合是绿色和红色。但是大约 5%的人口很难区分这两种颜色。更安全的做法是使用红蓝组合,或者,如果不可行,在绿色中添加一些蓝色。

在下面的例子中,你可以看到不同视力缺陷的人是如何感知每种颜色组合的。每个人都很容易区分红蓝组合,而普通的红绿对于弱视患者来说就像是一种颜色。

作者配图。使用 Adobe 颜色辅助工具检查颜色辅助功能。

另一个方面是把颜色和它的意义联系起来。有一些普遍的颜色联想,像冷代表蓝色,热代表红色,土代表棕色,自然代表绿色。我喜欢美国宇航局地球观测站的例子——在谈论降雨量偏差量时,使用棕色-蓝色组合更有意义,其中棕色表示少雨/干旱,蓝色表示多雨。假设你找不到任何合适的组合。在这种情况下,最安全的选择是选择蓝色和红色,并使用它们作为好-坏对立(记住,蓝色,而不是绿色,由于上面提到的可访问性原因)。

图片来自深切关注东非的粮食安全,NASA 地球观测站,公共领域。

用颜色来表示不同的状态

我们可以用颜色来突出显示不同的状态。这两种用法最大限度地融合了色彩的前期处理。它们有助于引导注意力和强调重要数据[5]。

作者配图。突出显示:显示不同状态的示例

  • **功能:**高亮
  • **颜色:**中性色和正色的二元配色
  • **目的:**显示某一点的重要性
  • **良好实践:**只对你想要突出显示的点使用颜色,对其他所有点使用灰色。你可以使用正色,如蓝色、绿色或品牌色。另一种可能性是区分亮度,并为您想要突出显示的数据分配较暗的阴影[5]。理想情况下,您最终会得到一个二进制模式,将数据分成突出显示的部分和其余部分。

作者配图。警报:显示不同状态的示例

  • **功能:**预警
  • **颜色:**带有中性和警示色的二元配色方案
  • **目的:**引起注意并发送警告信息
  • **好*惯:**挑选能迅速吸引注意力的颜色。红色是个不错的选择。研究表明,红色的情感内涵在消极和积极之间转换。但重要的是,在这两种情绪极端情况下,红色都是重要刺激存在的信号,会吸引注意力。另一个不错的选择是粉色或橙色(后者作为警示色效果很好,或者是红色的补色,显示出不太强烈的警示)

使用颜色对值进行编码

颜色的最后一个功能是编码值。它可以用于离散或连续的规模。在这两种情况下,我们应该按照顺序使用颜色,并选择连续或发散的调色板。

作者配图。编码值的示例。左边:离散标度。右边:连续音阶。

  • **功能:**编码值
  • **色彩:**若有中点则依次或发散。根据规模,使用离散或连续变量
  • **目的:**显示数值的差异
  • **良好实践:**选择连续调色板时要记住的最重要的事情是亮度的线性变化。根据用途,你可以选择单色(最适合热图)或多色(适合散点图)。在我的另一篇文章中,你会发现更多关于顺序调色板的技巧。

要记住的两个最大的颜色使用限制

颜色有很多功能,但也有一些局限性。其中最重要的是不精确的见解和过度使用时会分散注意力。

颜色不适合精确和准确的比较

尽管颜色可以用来显示数值,但它并不适合于精确和准确的比较。正如 Cleveland 和 McGill 的研究所示,有十个基本的感知任务与一种表示数据的方法相关联[8]。在一系列实验的基础上,他们根据判断的准确性进行排序。如下图所示,阴影和饱和度位于排名的底部。这意味着它们允许不太准确的评估;换句话说,用户在评估价值时更容易出错。

作者配图。根据克利夫兰和麦吉尔的研究对基本知觉任务进行排序。图表灵感来自阿尔贝托·开罗的图表【9】。

这并不意味着你不应该使用颜色来编码数据。但是当目标是允许精确比较时,基于位置(例如散点图、折线图)或长度(条形图、柱形图、甘特条形图)的图表胜过其他形式的表示。

如果你不相信,我们来快速测试一下。使用下面的图表,试着说出 D 和 H 之间的区别?**

作者配图。比较使用两种不同编码方法(颜色/阴影和长度)的数据比较准确性。

使用太多颜色

一般来说,这是一个错误的方法——这就是为什么大多数设计师的调色板的颜色数量有限的原因。有很多 UI 规则,比如 60–30–10 或者最多 3 种颜色[10]。在数据可视化方面也是如此。颜色越少越好。类别太多会降低信息处理速度。很多资源都说颜色的最佳数量在 6 到 8 之间。我个人喜欢把它保持在 6 以下,因为你给图例添加的每一种颜色都会增加你的观众的认知负荷。

图表顶部有十种颜色的图例意味着用户要么必须记住十种不同颜色的关联(想象以一种违反直觉的方式分配它们),要么在图表和图例之间来回跳转。两种解决方案都涉及认知负荷,这是最昂贵的一种[11]。在第一种解决方案中,用户必须记住类别;第二个,已经处理过的信息。

幸运的是,有一些解决办法。您可以重新考虑类别并限制颜色数量,更改图表类型,或将图例放在数据旁边。下面是一个改变图例位置和减少颜色使用如何减轻认知负荷的例子。

作者配图。使用标签的三种方法。左图:使用包含所有类别的单独图例。中间一个:将所有类别名称放在数据旁边。右一:限制类别的数量,并将它们的名称放在数据旁边。

**两个图表的差异相同。H 比 D 大十倍,H 等于 200,而 D 等于 20。

不想错过我的任何帖子?把它们直接发到你的收件箱里。做那个 这里

如果你还不是中等家庭的一员,考虑注册成为会员。它每月只需 5 美元,支持数千名作家。 注册我的会员链接 ,除了可以访问所有发表的内容,你还会得到我永远的感谢。

链接

[1]a . cotgreve,伊战的血腥代价:用标题、颜色和方向控制你的信息 (2014),Iraq 轶事

[2] W.Gawarska-Tywonek,从选择合适的调色板开始 (2022),走向数据科学

[3] E .塔夫特,*(*1983)

[4] A.Wilson,调色板的力量:为什么颜色是数据可视化的关键以及如何使用它 (2017),Adobe 博客

[5] K. Nussbaumer Knaflic,用数据讲故事:商业专家数据可视化指南 (2015),威利

[6] M. Kuniecki,J. Pilarczyk,S.Wichary,红色在情感环境中吸引注意力。一项 ERP 研究 (2015),人类神经科学前沿

[7] W. Gawarska-Tywonek,掌握连续调色板的 3 个技巧 (2022),走向数据科学

[8] W. Cleveland,R. McGill,图形感知:理论、实验和应用于图形方法的发展 (1984),美国统计协会

[9] A. Cairo,功能艺术:信息图形和可视化介绍 (2012),Addison Wesley

[10] N. Babich,在你的设计中使用色彩的 6 个简单技巧 (2019),UX 星球

[11] S. Weinschenk,每个设计师需要了解的关于人的 100 件事 (2018)

为文本到图像模型制作提示

原文:https://towardsdatascience.com/the-future-of-crafting-prompts-for-text-to-image-models-fc7d9614cb65

只要你知道正确的咒语,DALL E 可以产生你想要的任何东西

通过中途生成的插图(生成式人工智能)。文字提示:“一个男孩绝望地在笔记本电脑键盘上打字,沮丧的脸,明显生气,卡通风格”。

像 DALL E 这样以文本为条件的图像生成模型的出现无疑将改变传统的创作过程。然而,艺术不一定是免费的:负担将简单地从绘画或使用复杂的图形设计软件转移到制作有效的文本提示,以控制文本到图像模型的突发奇想。本文讨论了用户和公司解决即时工程即时设计挑战的潜在方法。

提示是迁移学*的最新和最极端的形式。对图像的每一次请求都可以被视为一个新的任务,由一个根据大量数据预先训练好的模型来完成。在某种程度上,提示已经使迁移学*民主化,但还没有使它变得毫不费力。写有效的提示可能需要和培养一个新爱好一样多的工作。

提示的起源

有人可能会说,提示是迁移学*的最新和最极端的形式:一种允许先前训练的模型权重在新的环境中重用的机制。这些年来,我们找到了在构建特定任务模型时重用越来越多预训练权重的方法。2013 年, word2vec [1]将通用 word 嵌入捆绑成静态库;人们用它们作为他们 NLP 模型的现成输入。在 2010 年代末,ELMo [2]和 BERT [3]等模型引入了微调:它们允许预训练模型的整个架构被重用,并与每个任务的最小数量的额外权重连接。最后,GPT-3 [4]在 2020 年通过提示关闭了迁移学*章节:一个单独的预训练模型现在可以执行几乎任何特定的任务,无需额外的参数或重新训练;它只需要通过文本输入被引导到正确的方向。DALL E 等文本到图像模型处于迁移学*光谱的同一端:对图像的每个请求都可以被视为模型要完成的新任务。

当前的事态

在某种程度上,提示已经使迁移学*民主化:用户不再需要 ML 工程技能或昂贵的微调数据集来利用大模型的力量。然而,利用生成性人工智能还不是轻而易举的。今天,在第一篇 DALL E 论文发表 1.5 年后,DALL E 2 向少数人开放 3 个月后,写有效的提示可能需要像培养新的爱好一样的努力。有一个学*曲线在起作用:人们修补模型,通过反复实验,他们发现输入和模型行为之间的相关性。他们也让自己沉浸在文本到图像的社区中(例如 Reddit 、 Twitter 等)。)来学*这一行业的诀窍并分享他们自己的发现。除此之外,他们还争论达尔 E 2 是否有或没有秘密语言。

作为一个数据驱动型的人,我想知道数据是否能提供一条捷径来获得快速工程这一难以捉摸的技能。我们与一位朋友一起,窃取了 Midjourney 的公共 Discord 服务器,用户在那里与一个机器人互动,发出提示,并获得人工智能生成的图像作为回报。我们在 10 个频道上收集了 4 个月的请求和响应,并在 Kaggle 上提供了数据集:中途用户提示&生成的图像(250k) 。

文本提示中最常用的短语由中途用户发布。查看 Kaggle 上的完整数据集:中途用户提示&生成的图像(250k) 。作者制作的插图。

上面的词云说明了 Midjourney 用户发出的文本提示中最常用的短语。其中一些是意想不到的,至少对于非鉴赏家来说是这样。取代动物、机器人或任何其他我们人类觉得可爱的实体(即内容)的是修饰语(即描述期望输出的风格或质量)。它们包括像辛烷渲染或虚幻引擎这样的应用名称和像克雷格穆林斯这样的艺术家名称。你可以在这本笔记本里找到更详细的提示分析。免责声明:目前还不清楚这些发现有多普遍。它们可能只是反映了潜在的有偏见的用户群的口味,或者可能只是从中途模型中引出强烈的视觉反应。如果你有 DALL E 2 的权限,让我知道他们对它有没有影响!

中途用户在他们的文本提示中提到的顶级艺术家(y 轴是每 10k 个提示的随机子样本的计数)。你可以在本笔记本中找到更多统计数据。

诚然,我们被观察到的提示的复杂性所淹没,我们决定在这些用户生成的文本提示上对大型语言模型 GPT-2 进行微调。我们现在可以依靠它来自动完成我们微薄的提示,并将其转化为创造性的和复杂的输入,而不是靠我们自己来学*交易的技巧。我们的模型在 的 HuggingFace 上免费提供,简洁/text 2 image-prompt-generator。请随意与演示互动!

提示自动完成模型的示例用法,可在简洁地/text 2 image-prompt-generator获得。这三幅图像是在中途生成的。插图本身是作者画的。

激励遇上资本主义

在商业中,时间就是金钱,文本提示也是如此。

随着 DALL E 2 和 Midjourney 等竞争服务变得越来越普及(前者目前正在向其第一批一百万用户推出,而后者正在 T2 进行公开测试),专业人士开始评估将生成性人工智能融入他们工作流程的潜力。例如,一位平面设计师在 Twitter 上发了一个帖子,探讨 DALL E 2 创建独特模型的能力:

随着文本到图像模式进入资本主义(专业设计、内容营销、广告创意),提示不再是一种娱乐爱好,而是一项需要有效完成的工作。在商业中,时间就是金钱,文本提示也是如此。一些人预测,与其他类型的体力工作类似,即时工程将被转移到低收入国家:工人将获得每小时 10 美元的报酬,以发布尽可能多的查询并选择最佳视觉输出。然而,随着 OpenAI 颇具争议的宣布基于信用的定价模式(本质上是按使用量收费,而不是提供订阅),用户被激励发出尽可能少的提示。因此,取代上面的暴力方法,我们可能会看到一个新的职业出现:提示工程师——一个精通生成人工智能的能力和奇思妙想的人,他可以在 3 次或更少的尝试中制作出你需要的插图。

研究将如何介入

提示不一定需要永远是人类的劳动。事实上,当提示实践首次出现在文本生成领域时,研究人员对其进行了广泛的研究。这本可能并不完整的文集提到了截至 2022 年 7 月底的 86 篇论文。许多文章提出了自动化,自动地以一种更模型友好的方式重新表述输入,包含冗余,生成额外的令牌以使模型的任务更加明确,产生软提示(即,修改原始输入提示的内部表示),或者为 交互会话 设计一个框架,在这个框架中,模型记住用户的偏好和对更长请求序列的反馈。很可能同样数量的研究将用于驯服文本到图像的模型。

承认

中途刮削项目是与 Gaurav Nemade 合作完成的。

资源/链接

  • Kaggle 数据集(Midjourney 用户提示和生成的图像(250k):https://www . ka ggle . com/datasets/succictlyai/Midjourney-texttoimage
  • 仅带有文本提示的 HuggingFace 数据集:https://hugging face . co/datasets/essentially/mid journey-prompts
  • HuggingFace 模型(提示生成器):https://hugging face . co/简洁地/text 2 image-prompt-generator

参考

[1] Mikolov 等人(2013),向量空间中单词表示的有效估计

[2] Peters 等(2018),深度语境化的词语表征

[3] Devlin 等人(2018), BERT:用于语言理解的深度双向变换器的预训练

[4] Brown 等人(2020),语言模型是很少出手的学*者

数据目录的未来

原文:https://towardsdatascience.com/the-future-of-data-catalogs-868ffbe7354d

从来没有人说过,让我们访问一个网站只是为了“浏览元数据”

Denys Nevozhai 在 Unsplash 上拍摄的照片

上周五,数据 Twitter 上充斥着乔希·威尔斯关于元数据和商业智能的推文。

由乔希·威尔斯在推特上发布

在 Atlan 时,我们开始是一个数据团队,而我们在实现一个数据目录时失败了三次。作为目睹这些项目失败的数据领导者,我发现数据目录失败的最大原因是用户体验。这不仅仅是一个漂亮的用户界面。这是关于真正理解人们如何工作,并给他们最好的体验。

像乔希这样的人在他们需要的时候,想要他们所处的环境。

例如,当你在像 Looker 这样的 BI 工具中时,你不可避免地会想,“我信任这个仪表板吗?”或者“这个指标是什么意思?”任何人最不想做的事情就是打开另一个工具(也就是传统的数据目录),搜索仪表板,浏览元数据来回答这个问题。

想象一个数据目录不存在于自己的“第三网站”的世界。相反,用户可以在他们需要的地方获得所有上下文——无论是在他们选择的 BI 工具中,还是在他们已经在使用的任何工具中,无论是 Slack、吉拉、查询编辑器还是数据仓库。

Looker 中的活动元数据。(图片来自作者。)

我相信这是数据目录的未来——激活元数据并将元数据带回数据团队的日常工作流程中。

用 Josh 的话来说 “就像是逆向 ETL 但是针对元数据”。

为什么今天数据目录不这样工作?

传统上,数据目录是被动的。他们将元数据从一堆不同的工具带入另一个工具,称为“数据目录”或“数据治理工具”。

这种方法的问题是,它试图通过增加一个孤立的工具来解决“太多孤岛”的问题。这并不能解决像 Josh 这样的用户每天面临的问题。最终,用户采用受到影响!

一家大公司的高级数据主管称这些数据目录为"昂贵的货架软件",或搁置在货架上永远不会被使用的软件。

传统数据目录的问题。(图片由作者提供。)

我们怎样才能避免数据目录变成货架软件?

想想我们今天使用和喜爱的现代工具——GitHub、 Figma 、 Slack 、观念、超人等等。

所有这些工具的一个共同点是的概念。用拉胡尔·沃拉(超人的创始人)的话来说:

“心流是一种神奇的感觉。

时间会消逝。你的手指在键盘上跳舞。你被无限的能量和创造力的源泉所驱动——你完全被你的任务所吸引。

心流把工作变成了娱乐。”

神奇数据体验的秘密在于流动。这些伟大的用户体验与宏观流程无关。它们是关于微流程的,比如不必切换到单独的数据目录来获取 BI 工具中仪表板的上下文。有几十个这样的微流可以提供神奇的体验,并彻底改变数据用户对他们工作的感觉。

这就是活动元数据的前景所在。

什么是活动元数据?

主动元数据使元数据 双向移动 成为可能,将丰富的元数据发送回数据堆栈中的每个工具,而不仅仅是从堆栈的其余部分收集元数据并将其带回被动数据目录。

我最喜欢的关于“主动元数据”的解释,以及它与传统的被动方法的区别,实际上可以追溯到…字典。

“如果你形容某人消极,意思是他们不采取行动,而是让事情发生在他们身上。”

——柯林斯字典

“积极”是指始终参与并向前发展,而不是坐以待毙,让事情发生在你身边。

花一点时间在元数据的上下文中思考这种方法,它描绘了一幅活跃的元数据的图画——当元数据转化为“行动”以使我们的数据体验更好时。

通过活动元数据实现流动

数据团队的唯一现实是多样性——人员、工具和技术的多样性。多元化会导致混乱,给每个人带来次优体验。

解决这种多样性和实现心流的关键在于元数据。它是贯穿我们所有工具的共同线索,它提供了我们每次在工具之间来回切换以弄清楚数据项目发生了什么时所极度缺乏的上下文。

  • 当您浏览数据资产的谱系并发现问题时,您可以立即创建吉拉票证。
  • 当你问一个关于 Slack 中的数据资产的问题时,机器人会直接把 Slack 中的数据资产的上下文带给你。
  • 当你在 GitHub 中进行生产时,一个机器人会贯穿整个谱系和依赖关系,并给你一个“绿色”状态,你不会破坏任何东西——就在 GitHub 中。

激活元数据。(图片由作者提供。)

超越数据目录

“数据目录”只是元数据的一个用例,帮助用户了解他们的数据资产。但是这仅仅触及了元数据的皮毛。

激活元数据是许多用例的关键,如可观察性、成本管理、补救、质量、安全、编程治理、自动调整管道等等。

我越思考这个问题,就越开始相信主动元数据可以让智能数据梦想成为现实。

下面是它如何工作的一个例子:

  1. 使用活动元数据,您可以使用 BI 工具中的过去使用元数据来了解哪些仪表板使用得最多以及人们何时使用它们。
  2. 端到端沿袭将这些仪表板连接到数据仓库中支持它们的表。
  3. 运营元数据显示连接的计算工作负载、关联的数据管道和运行时间。

难道我们不能使用所有这些信息来自动调整我们的管道和计算,优化出色的用户体验(在人们需要时更新仪表板中的数据,并在最大使用时实现最佳性能),同时最大限度地降低成本吗?

活跃元数据用例。(图片由作者提供。)

除此之外,感觉活动元数据的用例是无限的。它有可能为数据堆栈的每个部分带来智能和流动,并真正成为我们梦想中的数据堆栈的门户,即一个真正智能的数据系统。

  • 基于 SQL 查询日志自动推断数据表或仪表板的所有者和专家
  • 当检测到数据质量问题时,自动停止下游管道,并使用过去的记录来预测错误并修复错误,无需人工干预
  • 自动清除低质量或过时的数据产品
  • 还有更多

在过去的几年中,看到活动元数据成为下一代元数据的事实上的标准是令人振奋的,甚至 Gartner 在几个月前发布了活动元数据的首个市场指南。这听起来可能有点疯狂,但在一个拥有自动驾驶汽车、智能房屋和自动穿越火星的漫游者的世界里,我们为什么不能想象一个由我们丰富的元数据驱动的更智能的数据体验呢?

想了解更多关于第三代数据目录和活动元数据兴起的信息吗? 查看我们的电子书

觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学*建设的文章。 在此订阅。

2022 年现代数据堆栈的未来

原文:https://towardsdatascience.com/the-future-of-the-modern-data-stack-in-2022-4f4c91bb778f

介绍 2021 年你应该知道的 6 大想法

迈克·科诺诺夫在 Unsplash 上拍摄的照片

本文 2023 版出来了! 在此阅读。

随着数据世界因假期而放缓,我有了一些休息时间来回顾和思考过去的一年。我不禁想,哇,这是多么美好的一年啊!

是只有我,还是数据在 2021 年经历了五年的变化?

现在是部分时间,一个月感觉就像一天和一年一样。你眨眨眼,突然就会有一个新的流行词统治数据 Twitter。风险投资资金和疯狂的创业融资的泛滥也是部分原因,它们为今年的数据之火推波助澜。

有了这么多的宣传,很难知道什么趋势会持续下去,什么会像它们出现时一样迅速消失。

这篇博客分解了你应该知道的关于进入 2022 年的现代数据堆栈的六个想法。

你现在可能知道这个术语,即使你不知道它的确切意思。“数据网格的想法来自Thoughtworks 新兴技术主管扎马克·德格哈尼2019 年的两篇博客:

  1. 如何从单一数据湖转移到分布式数据网
  2. 数据网格原理和逻辑架构

其核心思想是,通过从集中式数据仓库和湖泊转移到由自助数据和“联合计算治理”驱动的“面向领域的分散数据所有权和架构”,公司可以变得更加数据驱动。

正如你所看到的,数据网格周围的语言变得复杂快速,这就是为什么不缺少"什么 实际上 是 一个 数据 网格?"文章。

自 2019 年以来,数据网格的想法一直在悄悄发展,直到 2021 年突然无处不在。仅在一年内,Thoughtworks Technology Radar就将 Data Mesh 的状态从“试用”转为“评估”。 数据网格学*社区 上线,他们的 Slack 小组在 45 天内获得了1500 个注册。 Zalando 开始谈论它如何转移到数据网格。

很快,热门话题就在 Twitter 上传来传去,数据领导者们争论着数据网格是革命性的还是荒谬的。

在 2022 年,我认为我们将会看到大量的平台重塑品牌,并以“终极数据网格平台”的身份提供服务。但问题是,数据网格不是一个现成的平台或服务。这是一个设计概念,其中包含一些精彩的概念,如分布式所有权、基于域的设计、数据可发现性和数据产品运输标准,所有这些都值得在您的组织中尝试实施。

因此,我的建议是:作为数据领导者,重要的是在概念层面坚持首要原则,而不是相信你很快就会在市场上不可避免地看到的炒作。如果一些团队(尤其是较小的团队)可以通过基于 Snowflake 和 dbt 构建的完全集中的数据平台实现数据网格架构,而其他团队将利用相同的原则在复杂的多云环境中整合他们的“数据网格”,我不会感到惊讶。

指标对于评估和推动公司增长至关重要,但多年来一直在挣扎。它们通常被划分到不同的数据工具中,在不同的团队或仪表板中,相同的指标有不同的定义。

2021 年,人们终于开始谈论现代数据堆栈如何解决这个问题。它被称为度量层度量存储库无头 BI ,甚至更多的名字我都无法在此列出。

它始于一月份,当时基础案例提出了“无头商业智能”,一种解决度量问题的新方法。几个月后,来自模式的 Benn Stancil 谈到了当今数据堆栈中的“缺失指标层”。

那是事情真正开始的时候。四天后, Falkon 的莫娜·阿克毛Aakash Kambuj 发表了关于制作度量标准一等公民和“现代度量标准栈”的文章。

两天后,Airbnb 宣布它已经在建立一个名为 Minerva 的本土度量平台来解决这个问题。其他知名科技公司很快跟进,包括 LinkedIn 的统一指标平台,优步的 uMetric ,以及 Spotify 在其“新实验平台中的指标目录。

就在我们以为这股热潮已经平息的时候,德鲁·巴宁 (CPO、 dbt 联合创始人)10 月份在 dbtcore 上开了一个 PR 。他暗示 dbt 将在其产品中加入一个度量层,甚至包括 Benn 和 Base Case 的基础博客的链接。PR 爆发了,并重新引发了关于在现代数据堆栈中构建更好的指标层的讨论。

与此同时,一批早期创业公司已经开始争夺这一空间。 变身 大概是目前为止最大牌的了,不过 MetriqlLightdashSupergrain 、以及 Metlo 也在今年推出。一些更大的名字也在指标层竞争,如 GoodData 进军 Headless BI 。

我对指标层最终成为现实感到非常兴奋。几个月前,来自 Fivetran 的 George Fraser 有一个不受欢迎的观点,即所有的度量商店都将演变成 BI 工具。虽然我不完全同意,但我确实相信没有与 BI 紧密集成的度量层不太可能变得普遍。

然而,现有的 BI 工具并没有真正地将外部指标层集成到他们的工具中…这使得这成为一个先有鸡还是先有蛋的问题。独立的度量层将努力鼓励 BI 工具采用它们的框架,并将被迫像多年前旁观者被迫做的那样构建 BI。

这就是为什么我对 dbt 宣布进军指标层感到非常兴奋。dbt 已经有足够的分布来鼓励至少现代 BI 工具(例如,预置、模式、Thoughtspot)深度集成到 dbt metrics API 中,这可能会给较大的 BI 玩家带来竞争压力。

我还认为度量层与转换过程如此紧密地交织在一起,以至于直觉上这是有意义的。我的预测是,我们将在 2022 年看到度量在更多的转换工具中成为一等公民。

多年来, ETL (提取、转换、加载)是数据团队填充系统的方式。首先,他们从第三方系统中提取数据,对其进行清理,然后将其加载到他们的仓库中。这很好,因为它保持了数据仓库的整洁有序,但这也意味着将数据放入仓库要花费很长时间。有时,数据团队只想将原始数据转储到他们的系统中,以后再处理。

这就是为什么许多公司几年前从 ETL 转移到 ELT(提取、加载、转换)。公司不是首先转换数据,而是将原始数据发送到数据湖中,然后针对特定的用例或问题进行转换。

在 2021 年,我们在这个想法上有了另一个重大的发展— 逆向 ETL 。这个概念在二月份开始受到关注,当时 Astasia Myers(Quiet Capital 的创始企业合伙人)写了一篇关于反向 ETL 出现的文章。

从那以后,https://hightouch.io/普查 (两者都在 2020 年 12 月推出)掀起了一场风暴,因为他们一直在争夺反向 ETL 空间的所有权。人口普查局宣布,它在 2 月份筹集了 1600 万美元的 A 轮融资,并发布了一系列针对 Hightouch 的基准报告。Hightouch 在不到 12 个月的时间里三次加薪,总计 5420 万美元。

Hightouch 和 Census 已经主导了今年的反向 ETL 讨论,但是它们并不是这个领域中唯一的两个。其他值得注意的公司有 Grouparoohead upPolytomicruder stack,以及 Workato (他们在 11 月完成了一笔 2 亿美元的 E 轮投资)。 Seekwell 甚至在三月份得到了被 Thoughtspot 收购的。

我对解决现代数据堆栈中“最后一英里”问题的一切都感到非常兴奋。我们现在谈论的更多的是如何在日常运营中使用数据,而不是如何存储数据——这是一个令人难以置信的迹象,表明数据堆栈的基本构建模块(存储、转换等)已经变得多么成熟!

我不太确定的是,反向 ETL 是否应该是一个独立的空间,或者只是与一个数据摄取工具相结合,因为管道数据输入和输出的基本功能是如此的相似。像 Hevodata 这样的公司已经开始在同一个产品中提供摄取和反向 ETL 服务,我相信我们很快会在这个领域看到更多的整合(或更深入的走向市场合作)。

在过去几年中,围绕数据目录的争论是,“它们过时了吗?”很容易认为答案是肯定的。在几篇著名的文章中,Barr Moses 认为数据目录已经死亡,Michael Kaminsky 认为我们不需要数据字典。

另一方面,关于数据目录和元数据的讨论从来没有这么热烈过。数据星表太多了,以至于我们团队的 Rohan 创造了thedatacatalog.com,一个“星表的星表”,感觉既可笑又完全有必要。那么,到底是哪个——数据目录死了还是比以前更强大了?

今年,随着两个新概念的产生,数据目录获得了新生——第三代数据目录和活动元数据。

2021 年初,我为现代数据栈写了一篇关于现代元数据的文章。我介绍了我们正在进入第三代数据目录的想法,这是对流行的老式内部数据目录的根本转变。这些新的数据目录围绕多样化的数据资产、“大元数据”、端到端数据可见性和嵌入式协作而构建。

Gartner今年做出的一项重大举措放大了这一想法——放弃了元数据管理解决方案的魔力象限,代之以活动元数据的市场指南。为此,他们引入了“活动元数据”作为数据空间中的一个新类别。****

有什么区别?老派的数据目录收集元数据,并将它们放入一个孤立的“被动”工具中,也就是传统的数据目录。主动元数据平台充当双向平台,它们不仅将元数据集中到单个存储中,就像一个元数据湖,还利用“反向元数据”使元数据在日常工作流中可用。

自从我们第一次写第三代目录以来,它们已经成为关于什么是现代数据目录的讨论的一部分。我们甚至在 RFP 中看到了这些术语!

匿名 RPF 的片段。(图片由 Atlan 提供。)

与此同时,风险投资公司一直渴望投资这一新领域。随着全面加薪,元数据管理已经增长了一吨——例如的的 2.5 亿美元系列 G 、的1.1 亿美元系列 D ,以及我们的1600 万美元系列 A at Atlan 。像 StemmaAcryl Data 这样的种子期公司也开始在现有开源项目上构建托管元数据解决方案。

数据世界将永远是多样化的,而人和工具的多样化将永远导致混乱。我可能有偏见,因为我毕生致力于在元数据领域建立一家公司。但我真的相信,让混乱的现代数据堆栈变得有序的关键在于我们如何使用和利用元数据来创建现代数据体验。

Gartner 用一句话总结了这一类别的未来:“独立的元数据管理平台将从扩充的数据目录转向元数据‘随处’编排平台。”

2.0 代的数据目录是被动的、孤立的,而 3.0 代的数据目录建立在这样一个原则之上,即无论用户何时何地需要,上下文都必须可用。第三代目录将利用元数据来改进 Looker、dbt 和 Slack 等现有工具,而不是强迫用户使用单独的工具,最终实现智能数据管理系统的梦想。

虽然 2021 年该领域有大量的活动和资金,但我非常确定我们将在 2022 年看到一个占主导地位的真正的第三代数据目录(也称为活动元数据平台)的崛起。

随着现代数据堆栈成为主流,数据成为日常运营中更大的一部分,数据团队也在不断发展。他们不再是独立于公司其他部门工作的“IT 人员”。但这就提出了一个问题,数据团队应该如何与公司的其他部门合作?他们经常陷入“服务陷阱”——永无止境的问题和创建统计数据的请求,而不是通过数据产生见解和推动影响。

Emilie Schario 在数据团队工作的真实写照。(图片由 Atlan 转自MDS con 2021)。)

2021 年, Amplify Partners 的 Emilie Schario 、 Meltano 的 Taylor Murphy 和 Stitch Fix 的 Eric Weber 谈到了打破数据团队这一陷阱的方法——将数据团队重新思考为产品团队**。他们首先在一个关于本地乐观的博客上解释了这个想法,随后在会议上发表了精彩的演讲,如:MDS con T21,dbt 联合,以及未来数据。**

衡量一个产品的标准不是它有多少功能或者工程师能多快地解决问题,而是它满足客户需求的程度。同样,数据产品团队应该以用户(即整个公司的数据消费者)为中心,而不是回答问题或构建仪表板。这允许数据团队关注体验、采用和可重用性,而不是特别的问题或请求。

这种对打破服务陷阱和围绕用户重新定位数据团队的关注,今年在数据界引起了共鸣。越来越多的人开始讨论建立“数据产品团队”意味着什么,包括大量关于雇佣谁以及如何设定目标的热门话题。

在 2021 年所有被炒作的趋势中,这是我最看好的一个。我相信,在未来十年,数据团队将成为组织结构中最重要的团队之一,为经济前沿的现代数据驱动型公司提供动力。

然而,现实是今天的数据团队陷入了服务陷阱,并且他们的数据项目只有 27%是成功的。我认为解决这个问题的关键在于“数据产品”思维模式的概念,其中数据团队专注于为团队的其他成员构建可重用、可复制的资产。这将意味着在用户研究、可扩展性、数据产品运输标准、文档等方面进行投资。

这个想法来自“数据宕机”,蒙特卡洛的巴尔·摩西在 2019 年首次谈到这一点时说,“数据宕机是指你的数据不完整、错误、丢失或不准确的时间段”。就是那些你在一个大项目结束后的第二天早上收到的电子邮件,说“嘿,数据看起来不太对…

多年来,数据停机已经成为数据团队正常生活的一部分。但现在,随着许多公司在运营的几乎每个方面都依赖数据,当数据停止工作时,这是一个巨大的问题。

然而,每个人都只是在问题出现时做出反应,而不是主动预防它们。这就是 数据可观察性 —“监控、跟踪和分类事件以防止停机”的概念的由来。

我仍然无法相信数据可观测性这么快就从一个想法变成了现代数据堆栈的关键部分。(最*,它甚至开始被称为“数据可靠性”或“数据可靠性工程”。)

这个空间从不存在变成了一批公司的所在地,在 18 个月内总共筹集了 2 亿美元的资金。这包括https://www.acceldata.io/newsroom/acceldata-raises-35-million-series-bAnomalobig eyeDatabanddata foldmeta planeMonteCarlo人们甚至开始创建新的“数据观察公司”名单,以帮助跟踪空间。********

我相信在过去的两年中,数据团队已经意识到提高生产力的工具不是必须的,而是必须的。毕竟,数据专业人员是你有史以来最受欢迎的雇员之一,所以他们不应该浪费时间在排除管道故障上。

那么,数据可观测性在未来会成为现代数据堆栈的关键部分吗?绝对的。但是,数据可观测性将继续作为其自身的类别存在,还是将被合并到一个更广泛的类别中(如活动元数据或数据可靠性)?这是我不太确定的。

理想情况下,如果您在一个开放平台中拥有所有元数据,您应该能够将它用于各种用例(如数据编目、可观察性、沿袭等等)。我去年在我关于元数据湖的文章中写了这个想法。

也就是说,今天,这些领域独立地需要大量的创新。我的感觉是,在我们看到未来几年的整合之前,我们将在 2022 年继续看到分裂。

有时可能会感觉混乱和疯狂,但今天是数据的黄金时代。

在过去的 18 个月里,我们的数据工具呈指数级增长。我们都对现代数据堆栈大惊小怪,这是有充分理由的——它比我们以前拥有的东西好得多。坦率地说,早期的数据堆栈已经支离破碎,而工具方面的这一巨大飞跃正是数据团队所需要的。

在我看来,数据世界即将出现的下一个“增量”是现代数据文化堆栈 —最佳实践、价值观和文化*俗,将帮助我们不同的数据人员有效协作,并在我们处理新的数据堆栈时提高我们的生产力。

然而,我们只能在解决了数据问题之后,才能考虑如何更好地处理数据。我们正处于让现代数据堆栈步入正轨的风口浪尖,我们迫不及待地想看看 2022 年会带来哪些新的发展和趋势!

还在考虑 2021 年吗?看看我去年在现代数据栈 上的 五大必读博客。

发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学*建设的文章。 在此订阅。

语音助手的未来:早期的研究趋势是什么?

原文:https://towardsdatascience.com/the-future-of-voice-assistants-what-are-the-early-research-trends-dc02215fe2aa

在 YRRSDS 和 SIGdial 进行了五年的博士讨论

如果你不想读整篇文章,你可以略读最精彩的部分。它们的格式就像这两个句子,以突出它们。

对话式人工智能中出现了新的有趣领域,而其他领域则从讨论中淡出。为了分析早期的研究趋势,我决定探究从 YRRSDS 2018 、 2019 、 2020 、 2021 ,到最*的2022(9 月 5 日和 6 日)的会议记录和圆桌讨论笔记。

什么是 YRRSDS?

年轻研究人员口语对话系统圆桌会议( YRRSDS )是一个年度开放论坛,供早期职业口语对话研究人员讨论该领域的当前问题,分享工具,激发新想法。

我第一次参加 2019 年的 YRRSDS,非常喜欢它,所以我自愿组织 YRRSDS 2021 和 2022。这是一个认识志趣相投的人、相互启发、结交新朋友的绝佳场所。

YRRSDS 2022 在苏格兰爱丁堡 Heriot-Watt 大学的合影(照片由 vojtch hude ek 拍摄)

所有与会者提交一份两页的立场文件,概述他们的研究,感兴趣的主题,他们建议的讨论领域,以及他们认为口语对话系统(SDS)研究在中期未来的发展方向。

如果你想了解更多关于参加 YRRSDS 的信息,请滚动到底部。也有很多来自 YRRSDS 的照片和一些来自 SIGdial 的照片。

感谢阿拉娜·艾、亚马逊科学和苏格兰 SICSA

永恒的趋势

我将从过去五年中持续存在的热点话题开始。尽管这些话题依然不可动摇,但随着时间的推移,讨论的内容已经发生了变化(括号中的数字是讨论一个话题的年份)——让我们从大的话题开始探讨。

注意:整篇文章中的观点是 YRRSDS 参与者的集体观点,不一定是我个人的观点。

道德和隐私(18、19、20、21、22)

几年前最大的伦理讨论是数据隐私,主要有两个原因。第一个是将于 2018 年年中实施的 GDPR。大学和他们的道德委员会必须非常小心,以确保他们理解和遵守它,以避免法律后果。这给 2018 年和 2019 年的早期研究人员带来了很大的压力,他们不知道如何与之合作。第二个原因是缺乏经济高效的设备上处理或安全的云解决方案——阻碍了研究。

数据隐私绝不是‘解决’了的问题,但 GDPR 意识的高涨和行业压力确实改善了这个问题。云平台提供了更多的安全选项,设备上的处理也更便宜。可悲的是,像《社会困境》和《伟大的黑客》这样的纪录片出现了,引起了人们的轻微关注,然后在没有真正改变行为的情况下从讨论中消失了。似乎社会愿意用隐私来换取便利,这也减少了考虑和讨论它的动力。

我们开始考虑是不是应该把 SDSs 做得更人性化?一位参与者分享了一个故事,他的一个亲戚会给旧的“会说话的钟”打电话(人们会给 123 打电话,自动语音会告诉他当前时间)。尽管与今天的标准相比,时钟的声音听起来像机器人,但这个人认为在另一端是一个人。他们会感谢时钟,为打扰他们而道歉,并说“我现在得走了”之类的话。最*,商店员工认为 Google Duplex 是一个人——即使他们没有明确询问,这可以吗?

我们假设用户足够精通技术,能够将我们的系统与人类区分开来。上述例子表明,情况并非总是如此,随着语音助手专为老年人设计并应用于医疗保健领域,这个问题变得更加棘手

今年最热门的话题是偏见。我们都有偏见,在我们的语言模型中,我们的个人偏见被聚合成文化/社会偏见。一旦发现,我们可以在下游任务中减轻这些有问题的偏见——但是发现它们是困难的!这尤其困难,因为我们自己甚至没有意识到我们的大多数偏见,而且社会规范会随着时间而变化。

由于我们的语音助手存在偏见,媒体喜欢挑起“争议”,他们对创作者进行了大量负面报道。我们讨论过,这并不完全公平,因为它们只是反映了我们的社会——事实上,它们可能是我们揭示当今偏见的最佳工具之一。

讨论的主要解决方案是透明度。我们必须强调:

  • 数据是如何收集的?(当面还是网上?人们需要笔记本电脑或智能手机吗?该系列在哪里做广告?是从某个吸引某些用户群体的网络论坛上刮来的吗?).
  • 数据是从谁那里收集的?(人口统计数据,如性别、年龄、居住地区的财富和出生国家,因为不同国家的口头反馈不同,学生通常是国际学生)。
  • 谁给数据做了注解?(特定大学的学生?是一家公司吗?注释者的人口统计数据是什么?).
  • 你的团队中有谁?(是否存在年龄、阶级或性别偏见?这在你的领域会是一个问题吗?你怎么知道是还是不是?也许你排除了某些残疾人,因为它没有被考虑?).

不可能有完全无偏见的数据集,因此透明度对于揭示偏见和促进进一步的科学研究至关重要。 大学和大型组织阻碍了 SDS 研究 在数据收集期间收集人口统计数据。大学应该停止专注于阻止关键研究,开始支持收集数据的安全传播(例如在 CHILDES 文集 )。

由于要赢得对话挑战和发表论文,有时道德讨论会被搁置,以便在特定指标上取得更快的进展。希望随着论文提交中包含伦理声明,以及更多有伦理意识的研究人员签署评论,这种发表或灭亡的文化将逐渐改变,以包括伦理考虑。

YRRSDS 2019 横幅

多模态(18、19、20、21、22)

五年前,“多模态”讨论包括语音+手势和/或凝视信息。2019 年有一个简短的讨论,内容是不仅要监控用户的目光,还要产生目光(在这个特定的对话中使用 Furhat 机器人),但这发生了巨大的变化。在 2020 年,我们将理解并生成使用:

  • 演讲
  • 手势
  • 情绪
  • 凝视
  • 副语言线索
  • 韵律学
  • 眼睛颜色(仅限一代,例如红色机器人眼睛显示愤怒)

后来这个列表扩展到包括:

  • 文本
  • 面部暗示(点头、困惑时皱眉等)
  • 环境(例如物体检测)
  • 更多手势(用手生成,用机器人生成全身)
  • 触摸(按钮、双指滑动等)

随着所讨论模态的爆炸式增长,各种各样的问题出现在讨论中,比如如何处理所有的输入数据——只是把它们连接起来?也许加权某个模态更重要?有很多关于多模态融合的工作,因为这并不简单。每种模式都有自己的复杂性和挑战。例如,语音包含不流畅,沉默很重要,面部暗示依赖于文化,儿童产生不同的副语言暗示,ASR 错误仍然发生,物体检测错误也是如此,等等。然后,生成需要大量的数据,这些数据在所有语言和文化中都不可用。

我们不需要每个领域应用都有一个“超级模态”SDS。添加模态的额外计算成本通常是不必要的。像情绪识别这样的具体化代理和任务显然受益于多种形式(当它们被添加时,任务性能会有巨大的提升),但考虑一下在你的领域中是否值得。

YRRSDS 2022 海报会议(照片由 vojtch hude ek 拍摄)

评价(18、19、20、21、22)

几年前的评估讨论集中在开放域 SDSs 上,因为它们极难自动评估。在没有约束性任务的情况下,使用主观指标(感知的自然性、相关性、是否引发积极情绪等等)。所讨论的唯一客观指标是以圈数表示的参与度。这种指标组合很可能是受 2017 年 Alexa Prize 社交机器人挑战赛的启发。随着基于任务的 SDSs 越来越受欢迎,现在更多地讨论自动度量(参见“应用领域”一节)。

ConvAI challenge 表明,在这些自动指标上取得更高的分数并不一定会产生令用户满意的 SDS。获胜的系统并没有被人类首选,但是这些 人类评测 既昂贵又耗时。此外,我们甚至不能同意人类的判断是否是一个好的黄金标准!

人类注释者往往不同意或不知道系统能做什么,这使得结果很难重现。人们还会受到外部因素的影响,这些因素可能对部署一个完成的系统之前的最终评估有用,但对一个实验却没用。人们会受到礼貌、事实正确性、道德反应(例如“我是否应该卖出我的股票”)、同理心、热情、凝视和面部表情等的影响...

一个 具体化的 智能体可能会进一步影响用户的意见(机器人可能小而可爱,也可能大而有权威)。这种主观性是混乱的,所以也许可以选择一组加权的自动评估指标来更好地反映真实世界的性能?这些可以包括像 USR 、词汇多样性、 和中间假设的质量 这样的指标。

YRRSDS 2022 上苹果 Siri 的 Matt Henderson(照片由 vojtch hude ek 拍摄)

上升趋势

关于庞然大物的讨论已经过时了。在阅读 YRRSDS 会议录时,一些主题最*在早期 SDS 研究中变得流行。这些对于该领域来说并不是全新的话题,而是当前人们经常谈论的话题:

应用领域(21,22)

更多的早期研究人员现在正致力于在非常特殊的环境中改进 SDSs。随着客户服务聊天机器人和开放域语音助手在行业中的应用越来越多,研究讨论也涉及到更多不同的应用——通常是具体化。例如:SDSs 帮助养老院中的老年人,与自主水下航行器互动,帮助残疾人,辅导非母语人士,就心理健康问题提供建议,教授儿童社交技能,心理治疗等…

这些领域有巨大的潜在利益。当人们与 SDS 互动,教他们一些东西或询问让他们担心的事情时,他们不会那么担心在父母、老师或同龄人面前“看起来很傻”。孤独感可以部分减少,有视觉障碍的人可以问一些关于他们周围环境的问题(例如烹饪)。

当然也讨论了许多风险。如果代理人提供糟糕的建议,心理治疗是极其敏感和潜在有害的。

存在用于评估一般客户服务/开放领域 SDSs 的大量数据集,但这些数据集并不存在于每个特定领域。对于像今天正在研究的那些敏感的和私有的应用程序来说尤其如此。危险在于,研究人员将使用一般数据集来衡量在危险环境中部署的模型的改进。

YRRSDS 2021 横幅

数据收集(21,22)

早期 SDS 研究人员工作的更广泛、更具体且通常更敏感的领域带来了一个巨大的挑战——由于现有资源有限,数据收集。请参见上面的“道德和隐私”部分,了解相关的道德批准、偏见和隐私挑战。

人在不同的领域表现不同 。例如:当人们在讨论保险时使用与金融相关的术语时,词汇会发生变化,某些用户群体会产生不同于一般人群的言论(例如,儿童或有认知障碍的人https://heartbeat.comet.ml/how-dementia-effects-conversation-f538d2d9507a)。因此,大型通用数据集不适合评估在许多特定领域研究中使用的 SDSs。YRRSDS 2022 的大多数参与者都在构建自己的资源!

同意是一个有争议的话题。在获得弱势用户群体(例如有认知障碍的人)的同意方面存在明显的问题,但由于同意,一些研究人员无法获得他们需要的数据。一些主题,如犯罪检测和减少滥用,要求人们非常公开地与 SDS 互动。获得同意的行为本身会改变用户的行为,因为他们知道人们会捕捉到他们的互动——他们会更少生气,更少辱骂,并且会避免咒骂或提出源于性别偏见的请求(例如,“叫我爸爸”)。道德委员会通常不允许你“欺骗”或“误导”人们,那么我们如何从同意的成年人那里收集这些数据呢?

多模态研究的增加再次增加了数据收集的复杂性。几个模态中的每一个中的数据必须被独立地注释,然后准确地对齐,这很难做到(拍板在电影制作中使用的一个原因)。匿名化也更加困难,模糊面部等简单技术往往会使收集的数据无法使用(例如情绪检测、视线跟踪、使用面部暗示等)。

对于 多语言 低资源语言使用、 多方 SDSs、 增量 系统,以及上面讨论过的有问题的应用领域,数据集的获取极其困难。有时它们甚至存在,但创建者没有得到同意或批准与其他研究人员共享数据…这在一般情况下是至关重要的,但特别是在敏感领域。收集数据时,确保在伦理批准和同意书中包含 数据共享 (您可以通过 TalkBank、DementiaBank 等安全地共享数据……)。数据集管理通常需要数年时间,因此仅将它用于一两篇论文是一种耻辱。

*由于所涉及的障碍、时间和成本,讨论通常会导致避免数据收集的潜在途径。**数据效率、*增强和引导正因为这个原因而成为越来越受欢迎的话题(我预测这些将很快成为他们自己的圆桌讨论)。

为了衡量我们在某些领域的进展,必须更加重视数据收集,对其进行更多的规划,并在项目预算中加以说明。

YRRSDS 2022 的 Heriot-Watt 大学的 Oliver Lemon(照片由 vojtch hude ek 拍摄)

跨学科合作(21,22)

随着收集特定用户群数据的压力越来越大,协作成为项目成功的关键之一。许多 YRRSDS 2022 参与者甚至以前在另一个领域接受过培训,然后过渡到 SDSs 工作。许多其他人报告说,他们直接与团队和实验室中其他学科的顾问一起工作。

如今,在攻读博士学位时,人际关系网被认为是一项重要的技能,它让寻找潜在的合作者变得更加容易。提高你自己的知名度甚至会增加别人联系你的机会!类似TwitterLinkedIn,播客,以及 写作介质 等渠道都有建议(提示提示,随意关注我)。你也可以尝试参加其他领域的会议,这对我个人很有效。**

协作有明显的好处。例如,其他研究人员可以揭示你正在使用的任何过时的技术,但它并不都是黄金。可能存在资金目标冲突,并且“专家”必须接受他们并不了解每个主题的所有内容…与行业的合作也带来了新的挑战。企业希望专注于稳定产品的实现,而不是出版物。学术界通常更看重评估指标优化,而不是延迟和成本等业务指标

YRRSDS 2022 横幅

上下文和知识表示(21,22)

越来越多的 YRRSDS 参与者发现,简单的对话表示(如填槽)不足以代表他们的现实世界应用。讨论了更多的层次和时间表示结构,但是这些复杂的结构当然更难学*。

知识图 在研究和行业中蓬勃发展,尤其是表示世界知识(讨论了类似WikidataDBpedia的资源)。挑战在于将“说了什么”映射到一个图的本体——特别是对于词汇不同的面向任务的应用程序。**

然而,吸收和巩固内部知识是一个非常不同的挑战。我们可以了解用户行为,从他们的故事中学*(有点像黑镜集),或者从与用户的互动中学*关于世界的规则(这是受克里斯·霍维斯当天早些时候在 YRRSDS 2022 上的主题演讲的启发-见下文)。

对话语境 可以变得相当庞大,尤其是在多模态或多方域中。我们的模型目前将整个上下文作为输入,我们只是让注意力来处理它。为了在不牺牲性能的情况下降低计算成本,YRRSDS 的讨论指出,场景图在计算机视觉中用于“概括”模型的输入。对于语言来说这是可能的,但是要确定什么是“相关的”就更加困难了。

来自哥德堡大学的克里斯汀·霍维斯摄于 YRRSDS 2022

澄清和修复(21,22)

**澄清是用来建立共同基础的,例如:

  • A :“想下周一见面吗?”
    -B:“21 号对吗?”
  • A :“不,就是这个周一,我们 28 号见”**

**但是它们也用来引出额外的信息,例如:

  • A :“你能抓住红色夹克吗?”
  • B :“左边那个?”
  • :“哦对不起,是的”**

传统上,SDSs 会反复向用户澄清他们的理解,以避免完成错误的操作。这使得 令人沮丧 然而,它基本上是鹦鹉学舌,每隔几圈就把用户说的话反馈给他们。在过去几年的 YRRSDSs 中,已经讨论了更智能的检测何时需要澄清或维修的方法。这将允许我们的 SDSs 以更加自然和流畅的方式启动澄清。

其中包括:

  • 通过两三个稍微调整的模型从语义上解析用户的话语。当解析结构的一部分不同时,我们的系统可以启动对意义表示的特定部分的澄清。
  • 训练我们的语义解析模型,如果它识别出话语未被指定(受机器人技术的启发),则输出“未知”标签。
  • 使用像眉头紧锁这样的面部暗示来表明用户感到困惑,需要修复。
  • 结合 SDSs 理解使用知识图。如果理解与 Wikidata 的知识或本体不匹配(例如“巴黎的生日是什么时候?”),需要澄清。
  • 使用内部构建的知识图表检查用户是否有不寻常的要求(例如,要求比平时早 2 小时被叫醒——最好询问并确认)。

当 SDS 理解他们时,人们会改变他们的讲话。他们清除自己说话中的不流利之处,并在某些地区(如苏格兰)软化他们的口音。然而,他们不是很有耐心,很快就会变得非常沮丧。人们通常会与其他人类澄清三次,然后礼貌地放弃或只是假装理解。对其他人的这种耐心可能是因为人们接受对困惑的共同责任。然而,当与 SDSs 交互时,人们把所有的责任都推给了系统——因为不理解它是愚蠢的。关于澄清和修复策略的进一步工作应该会减轻这种挫折感并提高可信度。

****

来自 Alana AI 的 Ioannis Konstas 和 Arash Eshghi 在 YRRSDS 2022(照片由 vojtch hude ek 拍摄)

语言学理论(22)

我认为这是早期 SDS 研究人员中最令人惊讶的趋势之一,但我们在 YRRSDS 2022 上有一个完整的语言学理论圆桌会议。这是为什么呢?

正确有效地传达“意思”很难——真的很难!例如,有关于不同笑的不同含义的完整的博士论文(见 Vladislav Maraev 或 Chiara Mazzocconi 的工作)。我们的言语是如此细致入微,我们的视觉交流也是如此,然后我们还会不流利地说出并犯错误。* Google Duplex 向我们展示了 如何生成这些素材,使得 SDS 的输出更加真实。随着这种已被证实的使用优势以及多模态和医疗保健领域(人们说话更加不流利)的增加,我们看到人们对“在哪里”和“为什么”使用特定现象的研究兴趣增加。***

有人指出语言注释方案非常复杂(比如ISO 24617–2)。这些方案涵盖了我们作为 SDS 研究人员想要的一切,但还不止这些。围绕我们是否应该为我们的领域创建一个稍微简单一点的版本,进行了长时间的讨论。

****

YRRSDS 2022 上亚马逊 Alexa 的 Saranya Govindan(照片由 vojtch hude ek 拍摄)

大型语言模型(20,21,22)

虽然看到上面的语言学理论可能会令人惊讶,但在这里看到大型语言模型(LLM)绝对不会令人惊讶。当然,我们主要讨论了转换器模型,因为它们继续主导着从语义解析到 NLG 和语音合成的任务。

变形金刚 当然很出彩,但应用到对话中就不完美了。他们通常很难有效地利用对话历史,或者察觉到上下文的变化——但是还有一个更大的问题。虽然这些模型*似一个好的对话看起来像,但是它们不能帮助用户达到他们的 目标 **

变压器似乎也不能很好地概括 SDSs。对话数据在领域方面是有偏见的,所以 LLM 在通过对话预订东西方面工作得很好——但这不一定转移到处理关于管理焦虑的对话。例如,笑的含义在不同的上下文中可能有很大的不同。系统的反应好笑吗?用户是在讽刺吗?或者他们在谈论他们的担忧时会紧张地笑吗?

如前所述,人们对系统错误非常敏感。这不利于用户是否乐于使用 SDS,以及他们是否信任它。 信任 如果 SDS 产生幻觉产生事实上不正确的反应,信任就被完全抹杀。这在医疗保健等更敏感的领域至关重要,在这些领域中,事实上不正确的响应可能会对用户造成伤害(例如,为视障用户设计的语音助手)。在这些领域中,更可控的基于规则的系统仍然是更可取的——至少对于响应生成来说是这样。

YRRSDS 2020 横幅

个性化、个性和用户体验(20、21、22)

这些年来,我们似乎希望进一步为每个用户个性化我们的 SDS,并发展我们 SDS 的个性本身,以改善用户体验。

如上所述,大型语言模型是在通用数据集上训练的,这使得很难个性化。例如,这个模型知道美国和英国对“一楼”的理解不同吗?同样,在某些文化中,关于保险的对话也非常不同,SDS 为错误道歉可能是“承认有罪”,在美国可能会引发法律问题。这就需要大量的私人用户数据。

人们强调,随着个性化和个性的提高,未来(如果不是现在)社会发展战略的关键是将自己确定为非人类。 宠物化身 在这里可以有所帮助,因为它们不是人类,没有性别,并且被认为和人类化身的代理人一样有能力。

****

YRRSDS 2022 海报会议(照片由 vojtch hude ek 拍摄)

可解释人工智能(21,22)

随着我们的模型变得更加复杂,我们描述他们为什么做出某个决定的能力变得更加困难。研究人员相信严格的评估,即使模型不能“解释”自己。例如,计算机视觉模型胜过训练有素的医生试图在扫描中发现癌症的早期迹象。然而,医生可以解释为什么他们认为你有或没有癌症,他们可以通过他们的推理和你交谈。

医疗、法律和金融领域的决策者不喜欢把钱和信任放在一些他们不了解的 黑箱 里。他们更喜欢依靠训练有素的人——即使他们确实犯了更多的错误。这主要推动了可解释的人工智能研究。

我们到底想解释什么呢?我们如何知道一个模型是否正确地解释了它自己?如果我们甚至不知道解释是否正确,决策者会怎么做?这有关系吗?真正好的对象检测模型可以在没有任何解释或说明的情况下运行,如果模型解释不正确,会有巨大的后果吗?

我们的结论简短而简单:如果一个模型有助于现实世界的决策,或者有 社会影响 ,可解释的人工智能技术应该被应用。

下降趋势

最后,我确定了几年前流行或大讨论的几个主题,但这些主题在最*几年已经消失了:

订婚(19)

显然,今天的研究人员仍然希望他们的系统具有吸引力,但讨论已经转移到个性化和个性上。2019 年对参与进行了彻底的讨论,出人意料地包括了开放域和基于任务的系统。

旧系统依赖于更多基于规则的方法,这导致了重复的交互,甚至是对话循环。随着时间的推移,用户与系统的交流越来越多(例如:工作中或家中的助理),他们将很快听到每个试探性的响应。“酷”的新语音助手变得陈旧和重复,无法维持用户的注意力或使用。这刺激了关于敬业度的讨论。

今天的系统经常使用神经反应生成模型,可以带着感情和细微差别说话,可以用无数种方式表达句子。因此,这个特殊的订婚问题不再是一个大问题。我们现在更担心这些模型的事实正确性,并赋予它们适合特定领域的个性(例如,移情治疗师)。

在开发基于任务的系统时,我们也不用担心同样的敬业度。事实上, 长期参与 如果交互能够保持短暂的话是有所改善的——允许用户高效地完成他们的 目标

YRRSDS 2018 横幅

镜像和模仿用户(18,19)

最后,较老的 SDS 在交互时更像机器人。无论是对话的流程,还是合成语音本身。人们不喜欢机器人的声音、发错音或静态遵循固定路径的对话。这导致研究 SDS 模仿和镜像用户。

模仿被用来增加用户对系统的共鸣。人们还努力模仿用户的词汇和口音来建立信任……今天,我们会认为这个 在伦理上涉及 (也很难评估),这是在 2019 年提出的。研究人员问最终目标是什么——是建立虚假的信任和与用户的“纽带”吗?为什么?大概是为了卖东西或者说服用户。

你想参加 YRRSDS 2023 吗?

如果你喜欢阅读这些讨论,我建议留意 YRRSDSs 的下一次论文征集(它通常与 SIGdial 搭配使用)。如果你愿意,你可以关注 YRRSDS 的推特账号。

然而在 YRRSDS 发生了什么?以下是一些进一步的信息:

人们提交 2 页的立场文件,描述他们的工作,他们的兴趣,建议的讨论主题,以及他们对 SDSs 未来的想法。每个与会者都可以展示一张海报,并参加圆桌讨论(关于立场文件中的热门话题)。

****组织者本身都是早期 SDS 研究人员!这是 2022 团队(他们都和其他人一起提交和展示了作品):

爱丁堡 YRRSDS 2022 组织者(照片由 vojtch hude ek 拍摄)

我们通常也会邀请一些主题演讲人。他们的谈话经常启发一些圆桌讨论的方向。今年我们有三位出色的演讲者和两次行业讲座!

最后,YRRSDS 与 SIGdial 配置在一起,所以一旦我们交了朋友并就我们的领域进行了令人兴奋的讨论,我们就可以享受会议了!

来自 SIGdial 2022 的照片-更多关于 SIGdial 的推特

理解弗里希-沃-洛弗尔定理

原文:https://towardsdatascience.com/the-fwl-theorem-or-how-to-make-all-regressions-intuitive-59f801eb3299

因果数据科学

因果推理中最强有力的定理之一的循序渐进指南

作者图片

弗里希-沃夫-洛厄尔定理是一个简单的然而强大的定理,它允许我们将多变量回归简化为单变量回归**。当我们对两个变量之间的关系感兴趣时,这是非常有用的,但我们仍然需要控制其他因素,正如在因果推断中经常出现的情况。******

在这篇博文中,我将介绍弗里希-沃-洛厄尔定理,并举例说明一些有趣的应用。

定理

该定理由拉格纳·弗里希和弗雷德里克·沃于 1933 年首次发表。然而,由于它的证明冗长而繁琐,迈克尔·洛弗尔在 1963 年提供了一个简单而直观的证明,他的名字被添加到定理名称中。

该定理指出,当估计一个模型的形式

作者图片

那么, β₁ 的以下估计量是等价的:

  • 通过对 x₁x₂ 回归 y 得到的 OLS 估计量
  • x̃₁ 回归 y 得到的 OLS 估计量,其中 x̃₁x₁x₂ 回归的残差
  • 通过在 x̃₁ 回归 得到的 OLS 估计量,其中 ỹ是在 x₂ 回归 y 的残差

解释

我们究竟从中学到了什么**?**

****弗里希-沃-洛厄尔定理告诉我们有多种方法来估计单个回归系数。一种可能性是照常在 x 上运行 y 的完全回归。

但是,我们也可以在 x₂ 上回归 x₁ ,取残差,只回归 y 那些残差。这个过程的第一部分有时被称为 x₁ 相对于 x₂部分化**(或正交化,或剩余化)。这个想法是我们正在隔离 x₁ 中的变异,即正交x₂ 。注意 x₂ 也可以是多维的(即包括多个变量而不仅仅是一个)。**

为什么会有人这么做?

这似乎是一个更加复杂的过程。现在我们需要做两步甚至三步,而不是简单的一步完成回归。一点都不直观。主要的优势来自于这样一个事实,即我们已经将一个多变量回归简化为一个单变量回归,使它更容易处理,更直观。

我们稍后将更详细地探讨三个应用**:**

  • 数据可视化
  • 计算速度
  • 推理的进一步应用

然而,让我们首先用一个例子更详细地探讨这个定理。

例子

假设我们是一家零售连锁店,在不同的地点拥有许多不同的商店。我们想出了一个增加销售额的绝妙主意:以优惠券的形式发放折扣。我们印了很多优惠券,然后分发出去。

为了了解我们的营销策略是否奏效,我们在每家商店检查平均每日使用量sales以及使用量coupon的购物者比例。然而,有一个问题**:我们担心收入较高的人不太可能使用折扣,但通常他们会花更多的钱。为了安全起见,我们还记录了每个商店附*的平均income。**

我们可以用有向无环图** (DAG)来表示数据生成过程。如果你不熟悉 DAGs,我在这里写了一篇关于有向无环图的简短介绍。**

作者图片

让我们加载并检查数据**。我从[src.dgp](https://github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/src/dgp.py)导入数据生成过程,从[src.utils](https://github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/src/utils.py)导入一些绘图函数和库。**

from src.utils import *
from src.dgp import dgp_store_couponsdf = dgp_store_coupons().generate_data(N=50)
df.head()

作者图片

我们有关于 50 家商店的信息,我们观察使用coupons、每日sales(以千美元计)、附*平均income(以千美元计)和day of the week的顾客的百分比。

假设我们在coupon的使用上直接回归sales。我们会得到什么?我用seaborn regplot图形化的表示回归的结果**。**

import seaborn as snssns.regplot(x="coupons", y="sales", data=df, ci=False, line_kws={'color':'r', 'label':'linear fit'})
plt.legend()
plt.title(f"Sales and coupon usage");

作者图片

看起来优惠券是个坏主意:在优惠券使用较多的商店,我们观察到销售额较低。

然而,这可能只是高收入的人使用较少的优惠券,同时也花费更多。如果这是真的,它可能会使我们的结果产生偏差。就 DAG 而言,这意味着我们有一条经过income后门路径**,生成一个非因果关系。**

作者图片

为了恢复couponssales的因果影响,我们需要income进行条件分析。这将阻塞通过income的非因果路径,只留下从couponssales的直接路径打开,允许我们估计因果效应。

作者图片

让我们通过在回归中包含income来实现这一点。

import statsmodels.formula.api as smfsmf.ols('sales ~ coupons + income', df).fit().summary().tables[1]

作者图片

现在估计couponssales的影响是积极而显著的。毕竟优惠券是个好主意。

验证定理

现在让我们来验证弗里希-沃-洛厄尔定理是否成立。特别是,我们想要检查我们是否得到了相同的系数**,如果不是在couponsincome上回归sales,我们**

  • income上倒退coupons
  • 计算残差coupons_tilde,即coupons中的变化不是income解释的****
  • coupons_tilde上倒退sales

请注意,我在回归公式中添加了“-1”来删除截距。

df['coupons_tilde'] = smf.ols('coupons ~ income', df).fit().residsmf.ols('sales ~ coupons_tilde - 1', df).fit().summary().tables[1]

作者图片

现在系数是一样的!然而,标准误差已经增加了很多,并且估计的系数不再明显不同于零。

更好的方法是增加一个步骤,并对sales重复相同的程序:

  • income上回归sales
  • 计算残差sales_tilde,即sales 而非income解释的变化
  • 最后,在coupons_tilde上回归sales_tilde
df['sales_tilde'] = smf.ols('sales ~ income', df).fit().residsmf.ols('sales_tilde ~ coupons_tilde - 1', df).fit().summary().tables[1]

作者图片

系数仍然完全相同,但现在标准误差也几乎相同。

推断

剔除(或剩余化,或正交化)实际上在做什么?当我们取coupons相对于income的残差时会发生什么?

我们可以把这个过程想象成一个情节。首先,我们来展示一下coupons关于收入的残差**。**

作者图片

****残差是数据和线性拟合之间的垂直虚线,即income无法解释的coupons中的变化部分。

通过去除**,我们从数据中移除线性拟合,仅保留残差。我们可以用一个 gif 来形象化这个过程。我从src.figures文件导入代码,你可以在这里找到。**

from src.figures import gif_projectiongif_projection(x='income', y='coupons', df=df, gifname="gifs/fwl.gif")

作者图片

数据的原始分布在蓝色的左边,被分割的数据在绿色的右边。如我们所见,部分删除移除了coupons中的水平和趋势,这由income解释。

多重控制

当我们有多个控制变量时,我们也可以使用弗里希-沃定理。假设我们还想在回归中包含day of the week,以提高精度。

smf.ols('sales ~ coupons + income + dayofweek', df).fit().summary().tables[1]

作者图片

我们可以执行与之前相同的程序,但是不是只部分去除而是现在我们部分去除incomeday of the week

df['coupons_tilde'] = smf.ols('coupons ~ income + dayofweek', df).fit().resid
df['sales_tilde'] = smf.ols('sales ~ income + dayofweek', df).fit().residsmf.ols('sales_tilde ~ coupons_tilde - 1', df).fit().summary().tables[1]

作者图片

我们仍然得到完全相同的系数!

应用程序

现在让我们来考察 FWL 定理的一些应用。

数据可视化

弗里希-沃夫定理的优势之一是,它允许我们从一个单变量回归中估计感兴趣的系数,即使用一个解释变量(或特征)。

因此,我们现在可以用图形来表示利益关系。让我们绘制残差sales对残差coupons的曲线。****

sns.regplot(x="coupons_tilde", y="sales_tilde", data=df, ci=False, line_kws={'color':'r', 'label':'linear fit'})
plt.legend()
plt.title(f"Residual sales and residual coupons");

作者图片

现在从图中可以明显看出salescoupons之间的条件关系**(以income为条件)为正。**

这种方法的一个问题是变量很难解释**:我们现在对salescoupons都有负值。奇怪。**

怎么发生的?这是因为当我们分割变量时,我们将截距包括在回归中,有效地去除了变量的含义(即标准化它们的值,使它们的平均值为零)。

我们可以通过缩放两个变量,加上它们的平均值来解决这个问题。

df['coupons_tilde_scaled'] = df['coupons_tilde'] + np.mean(df['coupons'])
df['sales_tilde_scaled'] = df['sales_tilde'] + np.mean(df['sales'])

现在这两个变量的大小又可以解释了。

sns.regplot(x="coupons_tilde_scaled", y="sales_tilde_scaled", data=df, ci=False, line_kws={'color':'r', 'label':'linear fit'})
plt.legend()
plt.title(f"Residual sales scaled and residual coupons scaled");

作者图片

这是一个有效的方法还是改变了我们的估计?我们可以通过用按比例划分的变量进行回归来检查它。

smf.ols('sales_tilde_scaled ~ coupons_tilde_scaled', df).fit().summary().tables[1]

作者图片

系数和之前一模一样!

计算速度

弗里希-沃-洛弗尔定理的另一个应用是提高线性估值器的计算速度。例如,它用于在存在高维固定效应的情况下计算有效的线性估计量(在我们的例子中为day of the week)。

一些利用弗里希-沃-洛弗尔定理的软件包包括

  • Stata 中的 reghdfe
  • Python 中的 pyhdfe

我还想提一下 R 中的 fixest 包,它在运行具有高维固定效应的回归时也非常有效,但是使用了不同的过程。

推理和机器学*

FWL 定理的另一个重要应用位于机器学*因果推理的交叉点。我指的是贝洛尼、切尔诺朱科夫、汉森(2013) 关于后双选择的工作,以及切尔诺朱科夫、切特维里科夫、德米勒、杜弗洛、汉森、纽维、罗宾斯(2018) 关于“双机器学*”的后续工作。

我计划在以后的文章中讨论这两个应用程序,但是我想从基础开始。敬请期待!

参考

[1] R .弗里希和 F. V .沃夫,与个体趋势相比的部分时间回归 (1933),计量经济学

[2] M. C. Lowell,经济时间序列的季节调整与多元回归分析 (1963),美国统计协会杂志

密码

你可以在这里找到 Jupyter 的原版笔记本。

**https://github.com/matteocourthoud/Blog-Posts/blob/main/notebooks/fwl.ipynb **

感谢您的阅读!

真的很感谢!🤗如果你喜欢这个帖子并且想看更多,可以考虑 关注我 。我每周发布一次与因果推断和数据分析相关的主题。我尽量让我的帖子简单而精确,总是提供代码、例子和模拟。

还有,一个小小的 免责声明 :我写作是为了学*所以错误是家常便饭,尽管我尽了最大努力。当你发现他们的时候,请告诉我。也很欣赏新话题的建议!

超市排队的博弈论

原文:https://towardsdatascience.com/the-game-theory-of-queuing-bd1095998c42

我们如何最大限度地减少排队时间?博弈论与我们日常生活中的决策。

本文登上了 TDS 2022 集锦

一天吃午饭时,我的同事告诉我们他是如何预订了一家很受欢迎的火锅店海底捞,这让我想到了我们在排队时是如何做决定的。

“有趣的是,这实际上并不是预订一张桌子,只是预订一个优先队列。”

"哦,就像迪斯尼乐园的快速通道一样!"

“……但是,如果每个人都预订了优先队列,那会怎么样呢;那正常排队岂不是更快?”

Photo by Lisanto 李奕良 on Unsplash

有些同事说,有一个系统,优先队列会比正常队列移动得更快。但是我们最终得出结论,即使你有一个优先预约,也总会有一个更合理的长度去正常队列。

然后有人说了一句我们都同意的话:

"如果我们是一群人,就分开,在两个队列里排队."

“如此经典的新加坡人怕输 *举动,不知道其他国家的人会不会这么做。”

*怕输:害怕失去(新加坡式英语)

“这只是博弈论**,在两个队列中排队是社会的纳什均衡。”**

“如果你离开他的队伍加入另一个队伍,排在你后面的人也不会生气!”

这是新加坡人“怕输”的结果,还是博弈论?

****博弈论是一个数学领域,帮助我们理解不同参与者系统中的决策。

纳什均衡是每个参与者的一套策略,其中没有参与者有任何动机改变他们的策略,即使在知道其他参与者的策略之后。(以数学家约翰·纳西的名字命名)。

从经济学最优性的角度来看,纳什均衡是一种最优状态,每个参与者在考虑其他参与者的最优策略的同时做出最优行动**。**

让我们考虑一个普通的排队系统,例如在超市的收银台。有两个队列提供完全相同的服务,并且有两种类型的玩家(购物者)——(1)团体中的玩家,以及(2)单独的购物者。

我们将合理地假设每个购物者都想尽快结账,也就是说,更少的排队时间=更高的回报。****

在我们的世界里,我们认为不理性的购物者是不存在的,他们看重的是与朋友一起排队的美好时光,而不是更快的结账速度。因此,这个世界上的每个人都只想最小化他们的排队时间,其他任何行为都没有成本。

我们还将假设每个队列移动的速度有一些不确定性,因为这取决于一些变量,如收银员的速度和你前面的每个人需要多长时间。有一种可能性是,一个有更多人的队列实际上可能会更快,但这无法事先知道。

如果没有不确定性,那么较短的队伍将永远是所有购物者的最佳选择!

由唐纳德·詹纳蒂在 Unsplash 上拍摄的照片

我会建议…

这个系统中的纳什均衡是这样的:
(1)群体购物者分成两个队列,
(2)单个购物者应该随机选择一个队列。

(1)团体购物者将自己分成两个队列

不管队伍有多长,团体购物者最好分散风险,分头行动。这是因为我们的“理性”假设,因此分手没有成本。因为队列移动的速度是不确定的,所以最好分开排队。

**事实上,除了是一个纳什均衡,这也是一个优势策略因为不管所有其他购物者(群体或单个)决定做什么,分开仍然是最优的。

出于讨论的目的,如果拆分有一些成本呢?如果另一个队列长得不成比例,选择最短的队列会更好,这样拆分的成本将超过长得多的队列移动得更快的可能性。

但是会不会存在一个队列过长的情况呢?因为团体购物者分开并在两个队列中排队,所以影响队列长度的将是单个购物者。单身购物者会继续选择更长的队列,导致一个队列变得不成比例地长吗?

(2)单个购物者应该随机选择一个队列

单个购物者必须在两个队列中做出选择。不管单个购物者采取什么策略,团体购物者总是会分开。因此,就纳什均衡而言,我们只需要为单个购物者找到一种策略,在这种策略下,他们没有动力去改变另一种策略。

较短的队列不一定是更好的选择,因为存在以下不确定因素:

  • 出纳效率
  • 你面前的每位顾客拥有的商品数量
  • 你前面的组数(他们跳到另一个队列的机会)。

也许如果一个

  1. 通过观察每个收银员一段时间,收集足够的信息,
  2. 改进了一种根据购物车的大小估计购物者所需时间的方法,
  3. 并绘制了不同场景的群体购物者的马尔可夫链…

人们可以确定哪个队列更有可能移动得更快(即更高的预期回报)。

实际上,我们不知道在这种情况下哪个队列移动得更快。即使有一个队列比另一个队列移动得快很多倍,我们也不会知道这个概率,我们也没有心理能力/时间来计算超市中的这个**

因此,在不知道队列的实际概率的情况下,人们可以通过随机选择一个队列(即抛硬币)来最大化他们的预期回报。在博弈论中,这也被称为混合策略。

**Calculating the expected pay-off from choosing a queue at random** Let’s say there is some probability *p* that queue A moves faster than queue B, but *p* is not known.If we choose the queue that moves faster, the pay-off is 1\. If no, the pay-off is 0\. The expected pay-off from selecting queue A is *p*, whilst the expected pay-off from selecting queue B is *1-p*. Expected pay-off from selecting queue A: *p* Expected pay-off from selecting queue B: *1-p* Without knowing what *p* is, we cannot make a decisive choice whether queue A or B is better. Obviously if *p* >0.5, queue A is better, if not, queue B is better.By giving both queue A and queue B a 50-50 chance of being selected, our expected pay-off would be: probability of selecting A and A being faster + probability of selecting B and B being faster = (0.5) * (*p*)  + (0.5) * (*1-p*) = 0.5 * (*p* + (*1-p*)) = 0.5 * (1) = **0.5****Regardless of the probability distribution *p*, randomising will always give us an expected pay-off of 0.5\.** 

不管一个队列比另一个队列移动得更快的概率如何,50-50 随机选择的预期收益将总是 0.5** ,因此在给定不确定性的情况下将是最优选择。这是一个纳什均衡,因为无论群体购物者如何决定,都没有改变策略的动机。**

附注:由于每位购物者也随机选择了一个队列,因此每个队列中的购物者人数应该是相等的,这加强了我们之前的论点,即不存在过长的队列!

单身购物者会随机化吗?

在“思考快与慢”中, 丹尼尔·卡内曼描述了我们在做决策时使用的大脑的两个系统。系统 1 快速决策,快速反应。决策是潜意识的,我们甚至经常意识不到我们正在做一个决定(例如,转弯以避开倒下的树枝)。系统 2 用于更慢和更深层次的思考(例如解决一个代数问题)。

照片由 Mukul Joshi 在 Unsplash 上拍摄

即使它能最大化预期收益,购物者会在超市收银台扔硬币吗,或者甚至认为是随机的吗?购物者更有可能使用系统 1 来快速做出决定,因为我们都希望不用太多努力就能继续我们的生活。

没有太多考虑,大多数人会简单地选择最短的队列。这是因为随着时间的推移,我们开始相信,不管正确与否,越短的队伍移动得越快。

从全局来看,我们最好不要过多考虑简单的决定,让系统 1 领先…

但是知道了你现在所知道的,下次你在超市结账时,你会扔硬币吗?

感谢你阅读这篇关于我们日常生活中决策的小思想实验!我很想听听你对模型假设的看法,是否有其他策略、纳什均衡甚至是优势策略。欢迎在下面给我留言评论!

如果你喜欢这篇文章以及关于数据科学和数学的文章,今天就注册一个中级会员,可以无限制地访问我的故事。

**https://medium.com/@leannechannie/membership **

研究和健壮人工智能之间的差距

原文:https://towardsdatascience.com/the-gap-between-research-and-robust-ai-d3849ccaf6c

即使是最先进的人工智能也有它的缺陷

Miquel Parera 在 Unsplash 上拍摄的照片

你会说深度学*模型已经变得如此之好,以至于强大的人工智能系统不再是一个梦想,而是一个现实吗?

你认为你可以在任何现实世界的问题中安全地使用研究人员发布的最新模型吗,比如自动驾驶汽车?还是机场的人脸识别软件?

确信机器在处理和理解图像方面已经比人类更好了?

我也是。直到我意识到用几行代码就可以欺骗一个最先进的模型,比如 DeepMind Perceiver。

在本文中,我将通过一个实际操作的例子向您展示如何在不到 10 分钟的时间内做到这一点。在路上,我们将理解这个例子对现实世界中安全和健壮的人工智能有什么影响。

我在这篇文章中展示的所有代码都可以在 这个 repo 中公开获得,而在这个 Colab 笔记本 中,你可以运行得快得惊人。

让我们开始吧!

问题是

深度学*模型是高度灵活和强大的机器,用于捕捉数据中非常复杂的模式。

它们是视觉任务(计算机视觉)、文本任务(自然语言处理)和机器人现实世界决策问题(强化学*)的首选解决方案。

然而,它们对于稀有的输入也非常脆弱。

当您发送给模型的输入数据与用于训练模型的数据相似时,机器学*模型会按预期工作。

当模型面对的输入与训练集中的输入相差太大时,模型可能会开始犯愚蠢的错误。

你可能会想…

这很有道理,但它并不适用于这些由 DeepMind、OpenAI、特斯拉和其他科技巨头开发的基于数十亿参数的大规模变压器模型?

当这些模型在数千万(甚至上亿)个例子上被训练时,怎么会有人生成稀有的输入呢?

嗯,其实也有可能骗过这些模型。这是我接下来要展示给你们的。

让我们看看你如何生成一个罕见的输入来欺骗 DeepMind 感知者,这是当今最新最热门的深度学*模型之一。

深度心灵感知者

DeepMind 感知者2021 年上映。这是一个基于 transformer 的模型,可以处理来自任意设置的数据,包括图像、视频、文本或音频。

这个模型向真正的通用架构迈出了坚实的一步,而不是特定于任务的架构,它可以处理任意的输入和输出序列。

你可以想象,这不是一个玩具模型,而是世界顶级人工智能实验室之一 DeepMind 生产的真正强大的工程作品。

我将在这个例子中使用的确切版本是在 HuggingFace 模型库中公开提供的版本,您可以在这里找到https://huggingface.co/deepmind/vision-perceiver-learned。它是一个具有超过 6200 万个参数的模型,在 ImageNet 数据集上进行了预训练,该数据集包含属于 20k 个类别的超过 1400 万个图像。

欺骗深层心灵感知者的三个步骤

本节我展示的所有代码都在这个 笔记本 里。

为了简单起见,我们将从您在 HuggingFace 模型卡中可以找到的相同示例开始, 此处为

图像是这样的:

图片来自 COCO 数据集

正如所料,该模型正确地将这张图片识别为一只猫

>>> Predicted class: tabby, tabby cat

让我们稍微调整一下这个图像来愚弄模型,产生一个所谓的对抗性例子**。这个对立的例子看起来与原始图像非常相似,但是模型很难理解它。**

为了从原始的猫图像中生成一个对抗的例子,我们将使用 Cleverhans 库和一个最简单的算法:快速梯度符号法(又名 FGSM),由 Goodfellow、Shlens 和 Szegedy 在这篇开创性的论文 中介绍

如果你想了解更多关于 FGSM 和其他对抗性例子的技术,我推荐你阅读我以前关于对抗性例子的文章

**

第一步。负载模型

首先,我们从 HuggingFace 模型中心加载感知者模型和预处理器。

>>> Number of parameters: 62,255,848

函数feature_extractor将输入图像裁剪为 224×224 的分辨率,并使用平均值和标准偏差对像素值进行标准化。这种预处理是深度学*视觉模型的常见做法。

image2class(图片由作者提供)

第二步。辅助功能

我写了一个辅助函数,它逆转了这种预处理,并从归一化张量返回图像。我称这个函数为inverse_feature_extractor

逆向特征提取器(图片由作者提供)

第三步。快速梯度符号方法攻击

接下来,我们导入 Cleverhans 的fast_gradient_sign方法。该函数主要接受两个输入,即:

  1. 我们要修改的原始形象→我们心爱的猫。
  2. ε,这是我们允许的每像素最大失真的大小→ eps。该值始终为正且很小。

一旦我们设置了eps,我们运行一个fast_gradient_sign步骤,从原始图像生成一个新图像。一般来说,你需要尝试不同的eps值,看看哪一个适合你正在使用的图像。

在这种情况下,我花了 10 分钟发现eps = 0.1产生了一个对立的例子。

>>> Predicted class:  English setter

对抗性例子
(图片由作者提供)

顺便说一下,英国雪达犬是一个犬种…

如果你仔细看这张图片,你会注意到在左边的猫身上有一团蓝色和绿色的点。除了这个微小的差别,这幅图像基本上与原作相同。然而,感知者未能预测正确的类别,并认为我们的猫实际上是狗。

这是一个对立的例子。

反例(作者图片)

对真实世界安全和健壮的人工智能的影响

总之,欺骗模特比训练她们要容易得多。这就是训练和欺骗深度学*模型之间存在的不对称。

因此,对立的例子限制了深度学*模型在现实世界中的适用性,并提出了以下问题:

在像自动驾驶汽车这样关系到人类生命的关键任务中,使用容易被愚弄的深度学*模型安全吗?"

有方法可以缓解这个问题,但都不是完全的解决方案,像 对抗性训练 。然而,对对抗性例子进行辩护的问题还远远没有解决。

因此,鲁棒人工智能是人工智能研究中的关键问题之一。

我们不会通过专注于标准的图像分类数据集(如 ImageNet)来弥合研究和强大的人工智能之间的差距。

相反,我们需要创建算法来提高深度学*模型的鲁棒性和可解释性。

你可以在 这个回购 里找到所有的代码。

想支持我吗?

你喜欢阅读和学*现实世界中的 ML、数据科学和自由职业吗?

可以无限制地访问我在 Medium 上发布的所有内容,并支持我的写作。

👉🏽今天就使用我的 推荐链接 成为会员吧。

https://pau-labarta-bajo.medium.com/membership

👉🏽订阅 datamachines 简讯

👉🏽关注我TwitterMediumLinkedIn

祝你愉快🤗

避寒胜地**

高斯分布解释了

原文:https://towardsdatascience.com/the-gaussian-distribution-explained-19d8417fb047

MATLAB 中的一个例子

在某些条件下,滚动骰子可以建模为高斯分布。由 Unsplash 上的 Edge2Edge 媒体拍摄

高斯分布是许多可以描述数据集的统计分布中的一种,它是一种非常重要的分布,因为许多现实生活中的过程都遵循这种分布。高斯分布的例子包括财务回报和人口身高。

在本例中,我们将从高斯分布中人工生成一个样本数据,将其绘制成理论上的高斯分布曲线,然后应用 Kolmogorov-Smirnov 测试,确定数据集是否是高斯分布的一部分,在本例中显然是高斯分布的一部分,因为它是从正态分布中生成的。

高斯模型

在这个例子中,我们将使用 MATLAB,但是当然,使用 numpy 和 Matplotlib 是一对一等价的。高斯模型概率密度函数显示了某些值相对于其他值的概率。

几个μ和σ值的高斯分布概率密度函数。来源:维基百科(公共领域图片)。

第一步是创建高斯分布模型。在这种情况下,我们将使用μ等于 2,σ等于 1。μ代表平均值,σ代表 68%的数据所在的位置。使用 2 σ将提供 95%数据的位置。适马(σ)是从平均值(μ)开始测量的,代表数据与平均值有多远或多*。

绘制数据

第二步,我们将绘制两个图,一个绘制样本数据,另一个绘制样本数据的直方图和理论高斯曲线。

这创建了两个图:

图一。样本数据集。使用 Matlab online 创建的图像。

图二。样本数据集直方图。使用 Matlab online 创建的图像。

在绘制数据点时,我们可以看到它们是如何集中在μ附*的,并且大部分数据(68%)包含在μ-σ和μ+σ内。

在第二张图中,我们看到理论上的高斯曲线比我们的数据集的比例小得多,这是因为我们必须将数据集的面积比例为 1。Matlab 可以通过一个归一化参数自动完成这项工作:

图 3。具有理论等效高斯曲线的样本数据集直方图。使用 Matlab 在线生成的图像。

测试数据集是否为高斯分布

在本例中,我们从高斯分布模型中人工生成了数据。这显然意味着数据是高斯分布的。虽然有时这是有意的(我们可能想要一个直接来自正态分布的数据集),但大多数时候我们只会面对本质上似乎是高斯分布的数据,我们希望验证这一假设。

有几种方法可以测试一个数据集是否是高斯分布的。其中之一是 Kolmogorov-Smirnov 检验,该检验评估数据是高斯的零假设。

默认的 Kolmogorov-Smirnov 检验是基于均值为 0 且 sigma 为 1 的数据样本。因此,如果我们对数据集进行测试,我们将返回数据集不是高斯型的。实际上,它是关于指定平均值和 sigma 的。

如果我们减去期望的平均值并除以方差,我们就可以正常地进行检验。

分位数-分位数图

Q-Q 图是检查数据集是否为高斯分布的直观方法。在 MATLAB 中,有指定分布或不指定分布的选项,尽管两个图看起来相同。正确的是第二个图(使用我们创建的分布的图),因为它生成了精确的轴(平均值和 sigma)。

图 4。使用标准正态分布的 QQ 图。使用 Matlab online 创建的图形。

注意第二张图是如何围绕我们的分布均值的:

图 5。使用高斯分布的 QQ 图。使用 Matlab online 创建的图形。

分位数到分位数图是显示数据集如何适应高斯模型的一种简单而直观的方式。

偏斜度和峰度

偏斜度和峰度是两种众所周知的可以应用于高斯分布的度量。偏斜度衡量平均值周围的不对称性,这是一个数值,它会告诉你在平均值的右边或左边是否有更多的值。完美的对称高斯将导致偏斜度值为 0。小于 0.5 的偏斜值或多或少是对称的,介于 0.5 和 1 之间的值是中度不对称的,大于 1 的值是高度不对称的。具体的阈值将取决于您的具体模型。
峰度是对分布尾部极端程度的度量,有时也被称为分布峰值形状的度量,尽管这种解释是不可信的。因此,它可以作为一种特征来确定异常值在特定分布中的范围。
这两种度量都很容易在 Matlab 中获得。对于偏斜度,使用 0 作为附加参数将减去平均值。这两个命令的详细信息可以在 Matlab 文档中找到。

摘要

高斯分布可能是许多学科中最重要的统计分布,通常需要对数据应用许多变换和数学方法。了解如何创建高斯数据集、如何解释其概率分布函数、如何归一化数据以及如何验证数据集是否为高斯数据集,这些都是数据科学中迟早需要的基本技能。

客户评论的金矿——量化客户体验

原文:https://towardsdatascience.com/the-goldmine-of-customer-reviews-quantifying-customer-experience-2da2beedf161

通过对客户评论进行情感分析,生成净推介值

照片由乔恩·泰森在 Unsplash 上拍摄

语境

随着社交媒体、在线购物和相关活动的激增,客户倾向于提供越来越多的关于他们消费的产品和服务的评论。评论已经变得如此强大,以至于消费者根据对产品或服务的评分来做出购买决定。

让评论更强大的是评论的内容提供了一个名副其实的信息金矿。自然语言处理(NLP)库的进步使得从这些内容中提取信息变得更加容易和准确。

客户评论能做什么?

从客户评论的内容中产生的 NLP 用例的数量是无限的。我想强调几个非传统但功能强大的用例,它们可能来自客户评论:

  • 量化您的客户体验 —如何使用客户评论文本的 情感分析 生成净推介值
  • 构建动态客户情绪仪表板针对不满意的客户和潜在收入流失发出实时警报
  • 竞争对手分析 —对比潜在竞争对手的 品牌突出度&情感得分
  • 产品或服务的 SWOT 分析利用 主题建模
  • 根据客户评论确定购买倾向(概率)

这篇文章的目的是给你一个从情感分析中计算 NPS 的方法的概述,从而识别支持者和反对者。让我们开始吧。

什么是净推广分数?

净推动者得分(NPS)是量化客户体验和识别潜在推动者和贬低者的最有效方法之一。

有 3 个组成部分用于计算 NPS — 推动者、中立者和诋毁者。

  • 促销员是您最快乐、最忠诚的顾客,他们在适当的时候会转变成品牌大使,并不断推荐品牌。这些客户是业务增长的关键,因此维持他们的客户体验对品牌至关重要。
  • 中立者通常是满意的顾客,但通常不会刻意去推广你的品牌。中立者可能会输给竞争对手的风险始终存在。企业应该通过了解中立者的需求,寻找将他们提升为促销员的方法和途径。
  • 诽谤者是不高兴的顾客,他们会破坏品牌形象,通过阻止其他人购买你的品牌来降低你的收入。值得注意的是,负面宣传比正面宣传效果更好,速度更快,因此对业务非常不利。

NPS 的计算方法如下:

NPS = %推广者— %反对者

参赛:https://www.netpromoter.com/know/

常规核动力源和相关挑战

NPS 通常通过让客户回答一个关键问题来计算——“你向他人推荐一种产品/服务/品牌的可能性有多大?—在 1 到 10 的范围内评分。这通常是通过在购买时向客户发送调查问卷或通过单独的沟通来完成的。这种方法的常见挑战是:

  • 调查的回复率相对较低。
  • 收集大量的调查数据可能是一件既费时又费钱的事情。
  • 发送调查问卷的费用相对较高。
  • 这些回答通常是定量的。很少有定性信息解释反应的原因。

NLP 来救援了

通过采用稍加修改的非常规方法来收集核动力源数据,可以在一定程度上缓解上述挑战。品牌可以利用对顾客评论和社交媒体帖子的情感分析,根据情感得分得出 NPS 的别名,而不是发出调查。

*免责声明:*请记住,客户评论不会直接回答计算 NPS 的核心问题。然而,它们很好地描述了顾客对该品牌的态度,因此可以作为替代品。

什么是情感分析?

情感分析也被称为“观点挖掘”。情感分析根据文本中使用的单词的情感语调给一串文本分配一个分数。

情绪得分——正面、负面和中性

  • “我对这项服务非常满意”是一个积极情绪的例子。这通常会有一个更接*+1 的情绪得分。
  • “我对服务非常失望”是一个带有负面情绪的字符串的例子,其情绪得分接*于-1。
  • “我在五月的最后一周利用了这项服务”是一个带有中性情绪的句子的例子。这将具有接* 0 的情绪得分。

情感分析是如何工作的?

情感分析模型基本上是文本分类模型,将句子分类为正面、负面或中性。模型的 x 变量或输入是文本上下文字符串中使用的单词。基于单词标记和上下文,预先训练的情感分析模型预测句子的情感得分。

情感分析技术的范围从原始的词袋模型到最新的上下文相关模型。随着像 BERT 这样的变压器模型的出现,情感分析模型已经提高了准确性,并且给出了更可靠的情感分数。在讽刺检测方面,他们不太容易受到与旧型号相关的挑战。

症结——如何从情感分析中计算 NP?

以下是可以用于从情感分析分数计算 NP 的最简单的方法:

  1. 计算每个客户评论的情绪得分。
  2. 对于每个客户,计算平均情绪得分。
  3. 根据平均情绪得分将客户分类为支持者或反对者。

或者,您也可以为客户发布的评论数量提供额外的权重。这源于这样一个想法,即我们希望关注经常发布评论的客户,而不是很少购买/发布评论的客户。然后可以将分数归一化,得出 0 到 10 的范围。这种标准化数据可用于识别推动者、诋毁者和中立者,从而计算 NPS。请在下面找到一个在电子表格中工作的示例:

基于加权分数的 NPS 计算(使用最小-最大归一化)

如何使用 NPS 来提升客户体验

如此获得的 NP 可以提供几个强有力的见解。让我们探索其中的几个:

  1. 首先也是最简单的——确定你的品牌的推广者、反对者和中立者
  2. 计算推广者与反对者的百分比,让你深入了解你的品牌正在朝哪个方向发展。促销员的百分比越高,表明潜在的收入增长,反之则表明你的品牌正在下降。
  3. 来自极度负面评论的特定文本字符串将让您深入了解需要改进的地方。一个简单的正面和负面评论的单词云将让你洞察什么对你的品牌最有效,什么无效。
  4. 每个季度重复的相同练*将让您洞察客户体验的趋势——是促进者的趋势越来越多,还是反对者的趋势越来越多?

摘要

总之,有了大量可用的客户评论,基于情感分析计算 NPS 可以带来对客户体验的强大洞察力,并帮助您快速提取客户的脉搏并采取行动。

好的,坏的和数据

原文:https://towardsdatascience.com/the-good-the-bad-and-the-dataspell-a86fec8fd6e1

软件开发

JetBrain 的数据科学 IDE 在使用一年后的真实回顾

“一个施展法术的代码编辑器”,至少根据 DALL E 2

免责声明( 发源于此处)):此非赞助文章。我和 DataSpell 或者它的创造者没有任何关系。本文对 IDE 进行了公正的概述,旨在使数据科学工具能够为更多的人所使用。

D ataSpell 于去年 11 月在正式发布,然而早在8 月和9 月勤奋的数据科学作者已经发布了一些预览版的评论。有人可能会说所有主要的 DataSpell 功能都已经展示出来了,那么为什么还要在这个问题上再做一篇文章呢?

首先,自去年以来,IDE 中的情况发生了变化。但最重要的是,我使用 DataSpell 进行数据科学研究和开发机器学*应用程序已经整整一年了。因此,我使用这个工具的里程数可能足够高,可以将它的特征减少到最有用和最痛苦的特征。

让我们从三个数据难题开始。不过,我建议你不要一开始就绝望,继续通读,因为这些工具的三大好处是无价的。

数据混乱问题

1。资源使用率高

在这方面,DataSpell 甚至可能不是 Visual Studio 等其他 IDE 的竞争对手。虽然 JetBrains 建议 8 GB 内存足够运行程序,但如果你处理 1M 行或更多的数据集,你不应该满足于任何小于 16 GB 的内存。就 CPU 而言,拥有比 i7(或其他供应商的同类产品)更老的一代也是不明智的,除非你有很多时间可以消耗。IDE 使用了大量的资源,特别是在启动的时候(初始化解释器和扫描文件和软件包的时候),或者如果你附加了一个自动同步到云端的文件夹。然而,当它完成启动时,下降速度相当快,或者至少和它的前身 PyCharm 的速度差不多。

不是你能找到的最敏捷的 IDE 作者图片

2。bug

正式版仍然有一些错误,尽管如此,对我来说升级到新版本解决了很多错误。例如,嵌入式 Jupyter 服务器有一个重大缺陷,无法加载保存的笔记本,但后来的一个版本为我修复了这个问题。另一个解决的错误发生在使用代理连接到许可证服务器时,这在以前的版本中根本不起作用。一个尚未解决的 bug 是 Jupyter 调试器并不总是工作,即使工作也非常慢。我通过简单地将代码复制到一个常规脚本文件并在那里执行调试来处理这个问题。我真的希望他们解决这个问题只是时间问题,因为 Jupyter 调试会很有用。无论如何,bug 论坛似乎是一个非常活跃的论坛,所以当你遇到一个 bug 时,你总是可以请求修复,甚至可能找到解决方案。

DataSpell 有很棒的特性,但也有不少 bug。Justin Lauria 在 Unsplash 上拍摄的照片

3.它(有点)不免费

个人使用每月花费 9 美元,但作为 JetBrains 教育包的一部分,学生或教师可以免费使用。

DataSpell 津贴

1.舒适的数据视图

在新标签页中点击打开打开数据框的宽而长的视图。它不仅允许您只需点击鼠标就可以对列进行排序或隐藏,当数据面板在一个分割标签中打开时,运行一个调试还可以让您观察您的数据帧如何随着每一行代码(!)。事实证明,这在排除代码仅在某些特定单元中表现异常的原因时非常有用。

你可以忘掉 sort_values() 和 pd.options.display.max_rows()。作者图片

列显示选项。解释您的工作从未如此简单。作者图片

一个单元一个单元地调试数据操作。相当酷。作者图片

2.增强型 Jupyter

DataSpell 显著改进了 Jupyter:代码完成更快、更彻底,具有嵌入式文件资源管理器(不再需要 Jupyter Lab),具有已经嵌入的目录(不需要安装附加组件或弄清楚如何使菜单浮动),并且已经为所有单元格预设了行编号。总而言之,一旦你*惯了,Jupyter 的整体体验会更好。

DataSpell 已经基本将 PyCharm 代码补全嵌入到 Jupyter notebook 中。作者图片

浏览文件、查看目录,以及对行进行编号—无需任何设置。作者图片

我没有办法回到这个…作者的图片

3.一站式商店

在使用 DataSpell 一年后,我几乎忘记了做打开 Jupyter 笔记本这种可能很基本的事情需要多长时间和多痛苦:你必须打开 anaconda,运行 jupyter 笔记本,等待网络浏览器打开并确保文件夹路径正确。**然而在 DataSpell 中,你直接在 ide 里面打开一个笔记本文件,也就这样了。**运行第一个代码块将在后台启动 Jupyter server,几秒钟后你就可以操纵笔记本了,就好像它只是另一个 Python 脚本一样。

这一切都归结到这一点…太神奇了!作者提供的图片

笔记本和脚本之间的切换将变得非常容易。此外,**DataSpell 中的研究和开发更加错综复杂:**DataSpell 使直接将功能写入生产脚本并将其导入笔记本以供进一步研究变得更加容易,而不是将大量功能写入笔记本并最终复制到脚本中。因此,Dataspell 有效地让我们享受到了两种工具的真正好处:Jupyter 的交互式和图形化输出,以及 PyCharm 的快速高效的代码编写。

你只需要运行一段代码来打开 Jupyter。作者图片

因此,从 DataSpell 运行 Jupyter 相当简单。更重要的是,IDE 是一个真正的一站式商店,因为:执行研究(在笔记本中)、探索数据(在数据面板中)、开发和调试生产就绪代码(在脚本中)——都在同一个地方完成!

IDE 可以被视为一个真正的一站式商店,因为:执行研究(在笔记本中)、探索数据(在数据面板中)、开发和调试生产就绪代码(在脚本中)——都在同一个地方完成!

**当在高度安全和敏感的客户环境中工作时,这种数据处理能力变得至关重要。**您不再需要解释为什么需要单独安装 PyCharm、Jupyter Notebook 或 Lab 或 Microsoft Excel。你可以通过安装一个 exe 文件来获得这些工具的大部分好处。此外,如果您关心定期更新该工具和管理其他 JetBrains 工具,请尝试安装 JetBrains 工具箱,它能够以鼠标点击的方式更新和降级 DataSpell(和其他工具)。

JetBrains 工具箱可以轻松打开、更新、回滚和卸载 DataSpell。作者图片

摘要

DataSpell 是 JetBrain 面向数据科学家的旗舰 IDE。它并不是最轻量级的 IDE,它仍然有很多 bug,而且大多数情况下你都必须为它付费。尽管如此,好处可能大于痛苦:查看数据的交互方式,增强的 Jupyter 体验,以及在一个地方进行研究和开发,这些都是值得的。

欢迎分享您的反馈,并通过 LinkedIn 联系我。

感谢您的阅读,祝您好运!🍀

构建 Python 项目的好方法

原文:https://towardsdatascience.com/the-good-way-to-structure-a-python-project-d914f27dfcc9

作为一名数据初学者,我希望我知道的一些简单的 Python 建议

照片作者菲奥娜·斯莫伍德

无论你是独自完成一个项目,还是与他人合作,都有三个简单的小贴士帮助你保持空间整洁。

  • 提示 1:创建虚拟环境
  • 提示#2:为测试创建一个单独的目录
  • 技巧 3:创建不同的内容目录

如果你想更进一步,你还应该:

  • 技巧 4:记录你的代码
  • 提示 5:使用 GitHub 进行版本控制

有些部分与 PyCharm 有关。如果您使用其他 IDE,可以跳过它。

技巧 1:创建一个虚拟环境

为了保持你的项目空间运行,创建一个虚拟环境并保持你的依赖关系是一个好主意。

可以使用 Python 的venv模块,指定 Python 版本和环境名。在下面的例子中,我使用 Python3 并调用环境 venv。一旦创建了目录,您需要在其中运行脚本activate

作者图片

命令概要:

  1. python3 -m venv venv创建一个虚拟环境
  2. source venv/bin/activate激活环境
  3. deactivate解除环境

👁‍🗨·皮查姆见解

如果您正在使用 PyCharm,您将会看到一个venv 目录出现在左侧的项目目录中。一些东西会自动安装在里面。最有可能的是,你只关心activate脚本——正如我们在上面看到的。

作者图片

重要的是,在 PyCharm 中,您应该采取额外的步骤,以便您的程序可以在您的虚拟环境中运行。

去右下角。您应该看到 PyCharm 使用的是哪个解释器。

作者图片

点击“添加解释器”并选择“现有环境”选项。
接下来,导航到您创建环境的文件夹,并从bin目录中选择 Python。

作者图片

如果一切正常,您应该在右下角看到虚拟环境中存在的 Python 版本。不错!🎊

作者图片

简而言之,虚拟环境允许您:

  1. 保持依赖性隔离。这避免了您的项目使用不同的包版本,并且每次您需要运行一个项目时,您都要全局卸载/重新安装您需要的东西。
  2. 与他人分享你的依赖。

一旦安装了项目需要的所有包,就可以运行:

pip freeze > requirements.txt

pip freeze是“冻结”当前正在使用的所有包/版本。然后你通过一个 txt 文件传输(即保存)了pip freeze的输出。

使用您的程序的其他人将会运行:

pip install -r requirements.txt

并且能够一次性安装所有的软件包和正确的版本。很神奇吧?🚀

作者图片

技巧#2:为测试创建一个单独的目录

您听说过为您的代码创建测试是一个好主意。所以你正在编写 Python 代码,并试图用 Pytest 测试它。

例如:假设你创建了一个名为greetings.py的文件和另一个名为test_greetings.py的文件来编写一些测试。

在这个例子中,我将使用 Pytest 作为测试包。Pytest 有很多命名约定。文件名以test_开头就是其中之一。如果您遵循它,Pytest 将自动在当前目录及其下的目录中查找以test_开头的文件并运行它们。

要创建新文件,您可以在终端中使用touch命令:

作者图片

在 PyCharm 的右上方,您应该会看到这样的内容:

作者图片

打开greetings.py,写一个简单的函数:

在您的终端中,您可以运行pip install pytest来安装pytest模块,然后简单地安装pytest。由于您尚未定义任何测试,pytest将运行,但会收集 0 个项目。

作者图片

打开test_greetings.py并编写一个测试函数:

如果您注意到,函数名也需要以test_开头,例如test_say_hello。这是另一个 Pytest 命名约定。

如何调试模块未找到错误

另一个好主意是将所有的测试收集在一个目录中。

然而,如果您只是这样做,当您现在运行pytest时,您将会看到您的测试都没有工作。如果你仔细看,你可能会得到一个ModuleNotFoundError

让我们看看发生了什么以及如何修复它。

作者图片

Pytest 试图导入greetings模块,但是失败了。
解决这个问题最简单的方法是假设test目录是一个包(即模块的集合)。在目录中,创建一个名为__init__.py的文件

作者图片

这是一个完全空的文件:

作者图片

然而,在那里的简单事实使您的测试再次工作。

作者图片

瞧啊。🍷

技巧 3:创建不同的内容目录

既然您已经有了创建一个__init__.py文件的想法,那么您可以创建任意多的目录。

例如:

基本上:

__init__.py用于将目录标记为 Python 包目录

如果您删除了__init__.py文件,Python 将不再在该目录中寻找子模块。因此,如果您试图将该模块导入到其他地方,它将会失败。

技巧 4:记录你的代码

记录你的代码对于“未来”的你和其他阅读你的项目的人都是非常重要的。一些程序员甚至说:

如果很难记录你的代码,考虑改变设计。

有 3 件重要的事情你应该记住:

  1. 在每个文件的开头添加一个带有描述的 docstring

作者图片

2.向每个函数和类添加一个 docstring

作者图片

3.每当你定义一个函数或者一个类的时候使用类型提示

作者图片

类型提示(1)使函数和类更具可读性,(2)允许你绕过在文档中指定参数的类型,以及(3)你可以使用它们通过mypy自动检查你的代码。🎖

有很多写好文档的风格指南。我个人比较喜欢Google Style Python Docstring

技巧 5:使用 GitHub 进行版本控制

如果你和其他人一起工作,Git + GitHub对于进行代码审查和避免合并冲突是必不可少的。

如果您是独自工作,它们仍然有助于保存您的工作,并能够恢复更改和“回到过去”。

🐢如果您不熟悉这些概念,您可以在这里找到更多信息:

  • 面向 Python 开发者的 Git 和 GitHub 介绍(免费)
  • 新杂志:哦,妈的,饭桶!(已付费)

😱如果您发现自己在开始使用版本控制时感到恐慌:

  • 哦,妈的,饭桶!?!

💪如果您想了解更多信息:

  • 欢迎学* Git 分支

使用 Git 的第一种方法很糟糕,但是我保证会有回报的。我们都经历过🙇‍♀️

我希望这是有用的!⚡️

参考文献

  • 新课程:用 pytest 测试您的 Python 程序
  • https://flax.readthedocs.io/en/latest/philosophy.html
  • http://web.archive.org/web/20111010053227/
  • http://jaynes . Colorado . edu/python guidelines . html # module _ formatting
  • https://realpython.com/lessons/type-checking-mypy/
  • 什么是 init。py 用于?

图形的语法或如何在 Julia 中进行 ggplot 风格的绘图

原文:https://towardsdatascience.com/the-grammar-of-graphics-or-how-to-do-ggplot-style-plotting-in-julia-1b0ac2162c82

照片由法新社跟随在 Unsplash 拍摄

Julia 统计绘图软件包的比较介绍

图形语法(GoG) 是由 Leland Wilkinson(The Grammar of Graphics,Springer,1999 )和 Hadley Wickham(A Layered Grammar of Graphics,Journal of Computational and graphic Statistics,vol. 19,no. 1,PP . 3–28,2010 )提出的概念; pdf )。

它的主要思想是,每一个统计图都可以由一些基本构件(或机制)组合而成。这允许

  • 可视化的简单明了的定义
  • 通过仅交换以模块化方式受影响的构建块,可视化的简单适应
  • 可重用的规范(相同的可视化可以应用于不同的数据)

韦翰表明,这个概念不仅是一个很好的理论。他在非常流行的 R 包[ggplot2](https://ggplot2.tidyverse.org)中实现了它。Julia 编程语言也有一些 GoG 实现。

在这篇文章中,我将首先解释图形语法的基本概念和思想。在后续文章中,我将展示以下四个完全或部分基于 GoG 的 Julia 图形包:

  • 牛虻. jl
  • VegaLite.jl
  • Plots.jl (带 StatsPlots.jl )
  • Makie.jl 和代数图形

为了让您能够对这些 Julia 包进行一对一的比较,我将在每篇文章中使用相同的示例图和相同的基础数据。在本文的第二部分,我将给出示例中使用的数据,因此我不必在后续的每篇文章中重复这些内容。

图形语法

在接下来的章节中,我将解释威尔金森的“图形语法”和韦翰的“图形分层语法”的基本思想。我不会深入到每一个细节,在两个概念不同的方面,我会有意识地选择一个,给出一个相当“统一”的观点。

对于代码示例,我使用的是 Julia 的牛虻包(vers。1.3.4 &朱莉娅 1.7.3)。

主要成分

可视化的主要构件是

  • 数据
  • 美学
  • 几何学

数据 这三个概念大家最熟悉的大概就是数据。这里我们假设数据以表格的形式出现(就像一个数据库表)。对于可视化来说,区分数字分类数据是很重要的。

例如,我们这里有一个水果经销商的库存清单:

Row │ quantity  fruit   price 
────────────────────────────────1  │    3     apples   2.52  │   20     oranges  3.93  │    8     bananas  1.9

它由三个变量quantityfruitprice组成。fruit是一个分类变量,而另外两个变量是数值

美学 为了可视化一个数据变量,它被映射到一个或多个美学

数字变量可以映射到例如

  • 在 x 轴、y 轴或 z 轴上定位
  • 尺寸

分类变量可以映射到例如

  • 颜色
  • 形状
  • 纹理

几何 除了数据变量和美学,我们至少需要一个几何来指定一个完整的可视化。几何学基本上告诉我们想要哪种类型的图。一些例子是:

  • 线 (=线图)
  • (=散点图)
  • 条形图 (=条形图)

基本示例

现在我们有足够的信息来建立我们的第一个基于图形语法的可视化。对于使用牛虻包的代码示例,我们假设上面的库存表位于一个名为inventory的变量中,变量的类型为DataFrame

首先我们想看看数量是如何按价格分布的。根据所选的几何图形,我们可以得到散点图或线图:

  • 价格映射到 x 轴数量y 轴
    使用牛虻中的点几何体
    :plot(inventory, x = :price, y = :quantity, Geom.point)

散点图[图片由作者提供]

  • 价格映射到 x 轴数量y 轴 使用线几何 在牛虻:plot(inventory, x = :price, y = :quantity, Geom.line)

线图[图片由作者提供]

在下一步中,我们想额外看看,哪些水果涉及。所以我们也必须将fruit映射到一个合适的审美。在下面的两个例子中,首先使用形状,然后使用颜色

  • 价格映射到 x 轴,将数量映射到 y 轴,将水果形状映射到
    使用点几何
    牛虻plot(inventory, x = :price, y = :quantity, shape = :fruit, Geom.point)

水果映射成形状[图片由作者提供]

  • 价格映射到 x 轴,将数量映射到 y 轴,将水果颜色T59 使用点几何 牛虻:plot(inventory, x = :price, y = :quantity, color = :fruit, Geom.point)

水果映射到颜色[图片由作者提供]

也可以将一个变量映射到几个美学。例如,我们可以将fruit映射到形状以及颜色

  • 绘制价格x 轴数量y 轴,
    到一个形状到一个颜色
    使用一个点几何 在牛虻:plot(inventory, x = :price, y = :quantity, shape = :fruit, color = :fruit, Geom.point)

水果映射到形状和颜色[图片由作者提供]

使用条形几何图形我们可以绘制库存数量的统计表。这里我们将一个分类变量( fruit )映射到 x 轴上的位置。

  • 水果映射到 x 轴数量y 轴使用牛虻中的杆几何 :plot(inventory, x = :fruit, y = :quantity, Geom.bar)

条形几何[图片由作者提供]

如果我们将水果也映射到一种颜色,那么条形将以不同的颜色显示:

  • 水果映射到 x 轴数量y 轴水果到一个颜色
    使用一个几何形状 牛虻:plot(inventory, x = :fruit, y = :quantity, color = :fruit, Geom.bar)

酒吧几何和水果映射到颜色[图片由作者提供]

这些基本示例很好地展示了如何使用几个简单的构建块来指定可视化,从而组成一种强大的可视化语言。

它们还表明,这些规范使图形包能够为可视化的各个方面导出有意义的缺省值,这些缺省值没有明确给出。

所有的例子都

  • x 轴和 y 轴的有意义的刻度(通常使用比给定数据变量稍大的间隔)
  • 连同适当的记号标记
  • 以及一个描述性的标签(简单地使用变量名)

一些例子甚至有自动生成的图例。这是可能的,因为图例只是数据映射到美学的反函数。例如,如果我们将变量水果映射到一个颜色,那么相应的图例就是从颜色水果的反向映射。

更多配料

老实说,为了一个完整的可视化,我们需要更多的元素,而不仅仅是数据美学几何

比例 为了将数字变量映射到位置美学(如 x 轴或 y 轴上的位置),我们还需要一个比例,将数据单位映射到物理单位(如屏幕、窗口或网页)。

在上面的例子中,默认使用了一个线性标尺。但是我们也可以用对数标度来交换。

也可以将数字变量映射到颜色。然后使用连续色标进行映射,如下例所示:

  • 价格映射到 x 轴数量y 轴数量到一个颜色
    使用一个点几何 在牛虻:plot(inventory, x = :price, y = :quantity, color = :quantity, Geom.point)

使用色阶[图片由作者提供]

坐标系 与标尺密切相关的是坐标系的概念,定义了位置值如何映射到绘图平面上。在上面的例子中,默认使用了笛卡尔坐标系。其他可能性是极坐标重心坐标系统或用于地图投影的各种系统。

有趣的是,我们可以从相同的数据和美学映射生成不同类型的图表,只需改变坐标系:例如,条形图基于笛卡尔坐标系。如果我们用极坐标系统替换它,我们会得到一个 Coxcomb 图,如下例所示,来自数据科学的https://r4ds.had.co.nz/index.html(Hadley Wickham 和 Garret Grolemund,O'Reilly,2017)。

条形图和统计图【来源:见正文;在知识共享许可下使用

结论

有了这两个额外的概念,我们现在有了基本 GoG 的完整图像。在这篇短文中,我当然只能呈现所有可能的美学图形的子集,还有更多 GoG 元素,如统计小平面*。但是到目前为止,我们所看到的是图形语法的核心,应该足以抓住主要思想。*

Julia 图形软件包的比较

现在让我们转到不同的 Julia 图形包的比较,我将在几篇后续文章中介绍这些比较。作为一种准备,我现在将在这些后续文章中展示不同示例图所用的数据(这些数据的灵感来自 YouTube 教程 Julia Analysis for 初学者,来自频道 julia for 天才业余爱好者),并展望我将使用何种图表进行比较。

按国内生产总值划分的国家

用于绘图示例的数据基础是 2018 年和 2019 年所有国家及其 GDP 和人口规模的列表。它来自这个维基百科页面(从国际货币基金组织和联合国的数据库中获得数据)。这些数据也可以从我的 GitHub 知识库中以 CSV 格式获得。

国家列表摘录[图片由作者提供]

列表中的列具有以下含义:

  • ID:唯一标识符
  • Region:国家所在的洲
  • Subregion:每个大陆又分为几个次区域
  • Pop2018:2018 年全国人口【百万人】
  • Pop2019:2019 年全国人口【百万人】
  • PopChangeAbs:2018 年至 2019 年人口绝对数量变化【百万人】
  • PopChangePct:类似于PopChangeAbs,但以百分比[%]表示
  • GDP:2019 年国内生产总值【百万美元】
  • GDPperCapita : GDP除以该国居住人数【美元/人】;该列不在源文件中,但将被计算(见下文)

使用以下 Julia 代码下载文件并转换为DataFrame:

第 7 行计算上面提到的新列GDPperCapita,并将其添加到countries -DataFrame 中。

汇总数据

每个国家有一行(210 行)的详细列表将在两个级别上进行分组和汇总(使用DataFrame-函数):

***级别 1 —区域:*以下代码通过Region(即洲)对列表进行分组,省略第 1 行中的列CountrySubregion(使用嵌套的select),然后创建一个汇总所有数字列的聚合(第 2–5 行)。

2 级—子区域:第 7-11 行的子区域级应用了相同的操作。首先通过省略列Country(第 7 行)的Subregion对国家进行分组,然后根据该数据创建汇总;再次对所有数字列求和。此外,地区的名称是从每个小组中挑选出来的(:Region => first

得到的数据帧regions_cumsubregions_cum如下所示:

按区域汇总(regions_cum)

按次区域汇总(次区域累计)

摘要

数据帧countriessubregions_cumregions_cum是即将发表的关于不同 Julia 图形包的文章中绘图示例的基础。在这些文章中,我们将看到如何创建

  • 条形图
  • 散点图
  • 直方图
  • 盒子情节和小提琴情节

在这些图形包中。

第一篇文章将呈现牛虻。敬请关注!

大数据辩论:分拆还是捆绑?

原文:https://towardsdatascience.com/the-great-data-debate-unbundling-or-bundling-7d7721ee8514

感谢“Bundlegate”,这是疯狂的几个星期。事情是这样的,我想我们要去哪里。

巴克罗姆·图尔萨诺夫在 Unsplash 上拍摄的照片

在数据推特上,这是一个疯狂的几周,又一个新的热门辩论。

当我躺在床上辗转反侧,思考现代数据堆栈的未来时,我不禁感到了写另一篇观点文章的压力;)

到底发生了什么?

如果你是 MIA, Gorkem Yurtseven 以一篇名为 解开气流 的文章引发了这场争论。

他解释说,一旦小产品成为大平台,它们就适合分拆,或者将其组件功能抽象为更小、更专注的产品。Craigslist 就是一个很好的例子——它的社区部分被 Nextdoor 接管,个人信息被 Tinder 接管,论坛被 Reddit 接管,出售被 OfferUp 接管,等等。

Gorkem 认为,在数据世界中,同样的事情正在气流中发生。

“在数据堆栈碎片化之前,创建带有气流的端到端管道并不罕见。组织过去几乎将整个数据工作流构建为由内部数据工程师开发的自定义脚本。更大的公司甚至在 Airflow 内部构建了自己的框架,例如,具有类似 dbt 的 SQL 转换功能的框架,以便让数据分析师更容易编写这些管道。

如今,数据从业者拥有许多工具,他们很少需要像气流这样的工具…如果气流的分解意味着所有繁重的工作都由单独的工具来完成,那么剩下的是什么?”

——戈尔凯姆·尤尔特塞文

作为数据团队中的一员,我们最终为 R 和 Python 中的转换构建了类似 dbt 的功能,Gorkem 的话击中了要害。

Airflow 的目的已经内置于摄取工具(Airbyte、Fivetran 和 Meltano)、转换层(dbt)、反向 ETL (Hightouch 和 Census)等等。

气流的分解。图片由 Gorkem Yurtseven 提供;在他的允许下分享到这里。

不幸的是,这导致了数据堆栈中大量的碎片。我经常拿这个开玩笑,但老实说,我为现在购买数据技术的人感到难过。即使是像我这样的内部人士也很难完全理解这种分裂和重叠。

Elementl 的尼克·施勒克 在 Dagster 的博客上写了一篇题为“ 重新绑定数据平台 ”的回应,再次打破了数据社区。他同意 Gorkem 的观点,即数据堆栈正在被拆分,并表示这种拆分正在产生自己的一系列问题。

“我想没有人相信这是一个理想的最终状态。邮报本身主张合并。拥有如此多的工具而没有一个一致的集中控制平台是疯狂的,对于数据从业者及其利益相关者来说是一个可怕的结局……然而,这就是我们在这个‘分散’的世界中懒散地走向的现实。”

—尼克·施勒克

然后,在我写这篇文章的时候, Ananth Packkildurai 加入了这场辩论——先是发了一条推文,然后是他的最新一期 数据工程周刊

Ananth 同意这一观点,即分拆已经发生,但将其与一个更大的问题联系起来。随着数据团队和公司的发展,数据变得越来越复杂,数据编排、质量、沿袭和模型管理已经成为重大问题。

为解决这些具体问题而拆分的数据堆栈,导致了孤立的“管道胶带系统”。

“数据社区经常将现代技术栈与 Unix 哲学 相比较。然而,我们缺少数据的操作系统。我们需要将模型和任务执行单元合并成一个单元。否则,我们在没有统一的情况下构建的任何抽象都会进一步放大数据的无组织性。数据作为一种资产仍将是一个令人向往的目标。”

—阿南思·帕克尔杜赖

那么…我该拿什么?我们要去哪里?

在数据世界里有两种人——一种相信捆绑销售,另一种认为非捆绑销售是未来。

我相信答案就在中间的某个地方。以下是我的一些预测和看法。

1.从我们当前版本的现代数据堆栈中,肯定会有更多的捆绑。

现代数据栈的当前版本是不可持续的,每 45 分钟就有一家新公司诞生。我们绝对处于 MDS 创新的黄金时代,由风险资本美元慷慨资助——都是为了寻找下一片雪花。我听说过 FAANG 公司中非常快乐的(数据)产品经理被授予数百万美元以“尝试任何想法”的故事。

这种兴奋有很大的好处。许多聪明人正在解决数据团队最大的工具挑战。他们的工作使现代数据堆栈成为现实。它使“数据功能”变得更加主流。最重要的是,它刺激了创新。

但是,说实话,这不会永远持续下去。现金会枯竭。合并、兼并和收购将会发生。(随着 dbt 进入度量层,以及 Hevo 在其数据摄取产品中引入反向 ETL,我们已经开始看到这一点。)最重要的是,客户在选择数据堆栈时,将开始要求更低的复杂性。这是捆绑销售开始胜出的地方。

来自 Reddit 上关于 Gorkem 博客的一段对话。Atlan 截图。

2.然而,我们永远不会(也不应该)有一个完全捆绑的数据堆栈。

信不信由你,数据世界是从完全捆绑的数据堆栈的愿景开始的。十年前,像 RJ 度量和 Domo 这样的公司旨在创建他们自己的整体数据平台。

完全捆绑的堆栈面临的挑战是资源总是有限的,创新会停滞不前。这种差距将创造一个机会,因此我相信我们将经历捆绑和拆分的循环。也就是说,我认为数据空间尤其具有特殊性,这使得捆绑平台很难真正获胜。

我和我的联合创始人瓦伦花了大量时间思考公司或产品的 DNA。我们认为这很重要——也许是决定谁能在某一类产品中取得成功的最重要的因素。

让我们看看云之战。例如,AWS 一直很大程度上专注于规模——他们在这方面做得很好。另一方面,来自微软的 Azure 一直有一个更关注终端用户的 DNA,这源于它的 MS Office 时代。毫不奇怪,AWS 在创建世界级的、以用户体验为中心的应用程序方面不如 Azure,而 Azure 在扩展技术工作负载方面不如 AWS。

在我们谈论数据世界的 DNA 之前,我们必须承认它的多样性。数据人员包括数据工程师、分析师、分析工程师、科学家、产品经理、业务分析师、公民科学家等等。这些人中的每一个人都有自己最喜欢的、同样多样化的数据工具,从 SQL、Looker 和 Jupyter 到 Python、Tableau、dbt 和 r。数据项目有自己的技术要求和特点,有些需要实时处理,有些需要特定分析的速度,这导致了一整套数据基础设施技术(仓库、湖边小屋和介于两者之间的一切)。

由于这种多样性,每个不同角色和用例的技术都有非常不同的 DNA。例如,构建 BI 的公司应该关注最终用户体验,而构建数据仓库的公司应该关注可靠性和可伸缩性。

这就是为什么我认为虽然捆绑销售会发生,但它只会发生在产品基本 DNA 相似的领域。例如,我们可能会看到数据质量与数据转换的融合,以及潜在的数据摄取与反向 ETL 的融合。然而,我们可能不会看到数据质量与反向 ETL 捆绑在一起。

3.元数据是在多样化的数据堆栈中打开和谐之门的钥匙。

虽然我们会看到更多的整合,但数据和数据人的基本多样性永远不会消失。总会有 Python 比 SQL 好或者实时处理比批处理好的用例,反之亦然。

如果你理解这一基本事实,你就必须停止寻找一个适用于所有人的通用“捆绑数据平台”的未来,而是找到让我们的非捆绑数据堆栈的不同部分完美和谐地一起工作的方法。

数据混乱。这并不意味着工作需要。

我相信帮助我们的数据堆栈协同工作的关键在于**激活元数据。**我们只是触及了元数据能为我们做的事情的表面,但是充分利用元数据的潜力可以从根本上改变我们数据系统的运行方式。

今天,元数据用于(相对)简单的用例,如数据发现和数据目录。我们从一堆工具中提取一堆元数据,并将其放入一个我们称之为数据目录或数据治理工具的工具中。这种方法的问题在于,它基本上是在已经孤立的数据堆栈上增加了一个孤立的工具。

相反,花一点时间想象一下,如果你可以在现代数据堆栈中获得分段或 Zapier 式的体验,世界会是什么样子——其中元数据可以在我们所有的工具之间创建和谐,并为完美的体验提供动力。

图片由 Atlan 提供,来自我在 Starburst Datanova 的演讲。

例如,元数据激活的一个用例可以简单到通知下游消费者上游的变化

图片由 Atlan 提供。

这个简单过程的类似 Zap 的工作流可能是这样的:

当数据存储发生变化时…

  1. 刷新元数据:抓取数据存储以检索其更新的元数据。
  2. 检测变化:比较新的元数据和以前的元数据。确定任何可能造成影响的更改—例如,添加或删除列。
  3. 查找依赖关系:使用沿袭来查找数据存储的用户。这些可能包括转换流程、其他数据存储、BI 仪表板等等。
  4. 通知消费者:通过消费者偏好的沟通渠道——Slack、吉拉等通知每个消费者。

该工作流也可以作为更改数据存储的测试阶段的一部分。例如,更改数据存储的 CI/CD 流程也可以触发此工作流。然后,编排可以在生产系统改变之前通知消费者。

用斯蒂芬·贝利的话来说,“没有人知道十年后数据栈会是什么样子,但我可以向你保证:元数据将是粘合剂。”

我认为这场辩论远未结束,但它激起了如此多的见解和热门话题(就像这篇文章),令人惊讶。

为了让讨论继续下去,我们刚刚邀请了戈尔凯姆·尤尔特塞文、尼克·施勒克和阿南特·帕克尔杜赖参加我们的大数据辩论。

查看这里的录音!

发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学*建设的文章 【亚特兰】 在此订阅。

格罗莫夫-沃瑟斯坦距离

原文:https://towardsdatascience.com/the-gromov-wasserstein-distance-835c39d4751d

Python 中对象匹配的度量与实例

作者使用人工智能工具 Dreamstudio 生成的封面照片(授权为https://creativecommons.org/publicdomain/zero/1.0/

在过去的几十年里,我们看到在我们可能想到的每一个领域的数据收集都取得了突破,包括运输、零售、金融、生物信息学、蛋白质组学和基因组学、机器人学、机器视觉、模式匹配等。为了分析和组织这些数据,定义对象或数据集相似性的概念很重要。在本文中,我们将互换使用对象和数据集。在这方面,我们可以提出以下几点来界定:

  1. 选择合适的数据集表示
  2. 定义两个数据集之间相等的概念
  3. 定义一个度量空间,使所有对象的空间。度量必须使得到对象的距离为零,对象是相等的。其中一个距离是格罗莫夫-沃瑟斯坦距离。

对象匹配的概念不仅有助于建立两个数据集之间的相似性,也有助于其他类型的问题,如聚类。

为了理解格罗莫夫-沃瑟斯坦距离,我们首先定义度量测度空间。但是在我们进入度量空间之前,让我们定义一些术语。

**度量:**集合 X 上的一个度量 d 是一个函数使得 d(x,y) = 0 if x = y,x ∈ *X,Y∈Y,*并且满足对称性和 三角形不等式它也被称为 距离功能

度量空间:度量空间是一个非空集,其上定义了度量。它可以被认为是有序对(m, d ,使得d:m×m ℝ.我们用ℝ来表示实数集。

现在我们定义度量测度空间。

度量度量空间

与度量空间相反,度量度量空间是一个三元组(M, dp ),其中 p 是一个概率度量。度量测度空间类似于度量空间,但是被赋予了概率的概念。我来解释一下。在许多应用中,我们喜欢将权重与每个点相关联,如图 1 所示。权重可能代表我们对这些数据点的信任程度。如图 1 所示,我们考虑两个度量度量空间(简称 mm-space),每个空间有两个点。这里我们定义p₁=[;]而 p₂ = [,],总和必须是概率(或σ代数)规则定义的 1。

图一。由作者创建

让我们再定义几个术语:

**等距:**假设为双射的度量空间之间的距离保持变换。等距变换将元素映射到相同或不同的度量空间,使得新空间中元素之间的距离与原始元素之间的距离相同。

**同构:**同构是保结构映射。在线性代数的意义上,正如大多数数据科学家所熟悉的,两个向量空间 VW 被称为同构,如果存在从 VW 的可逆线性变换(称为同构),T。考虑图 2。在图 2 中,我们有两套国际象棋。它们在国际象棋游戏中是同构的,尽管棋子看起来可能不同。

两个 mm-空间是同构的,如果存在一个等距映射ψ:X→y

图二。来源。左:【https://unsplash.com/photos/WtdIwprWnB4】T2,右:https://unsplash.com/photos/R0t2pAukP9E

**前推测度:**考虑两个度量空间 X 和 Y 之间的可测映射 f: X → Yp 的概率测度。前推测度是通过将一个测度(在我们的例子中,它是一个概率)从一个可测空间转移到另一个可测空间而获得的测度。它被表示为 f# p(A) = p(f ⁻ (A))其中 A = 𝔅(Y),𝔅是σ-代数(为了简单起见,就认为σ-代数定义了我们所知道的概率的概念。我参考了乔治·卡塞拉斯的统计推论以获得关于这个主题的更多细节)。我们可以把 mm 空间的前推度量写成 ψ#(p₁) = p₂.

考虑 R ⊂ X × YXY 之间的对应关系。然后我们定义 π₁(R) = Xπ₂(R) = Y 。一个概率度量 *p,*对 X × Yp₁ 和 *p₂、*之间的耦合,如果 *π₁#(p₁) = p,π₂#(p₂)= p。把𝓤 ( p₁,p₂ )看作是 p₁p 8832】*之间所有耦合的集合。

定义格罗莫夫-沃瑟斯坦距离

考虑度量度量空间上的两点(x,y)和(x’,y’)。进一步,考虑点 q ≥ 1。

(x,y,x ',y' ) ↦ |dₓ(x,x ')—dᵧ(y,y' )|^q 并挑选一个 p ∈ 𝓤 ( p₁,p₂ ),那么我们定义 q 阶的格罗莫夫-瓦瑟斯坦距离为:

格罗莫夫-瓦瑟斯坦距离的应用

格罗莫夫-沃瑟斯坦距离可用于许多与数据科学、数据分析和机器学*相关的任务。下面列举了几个例子:

  • 统一多个数据集的流形对齐。
  • 形状分析
  • 原子环境的分类
  • 用于生物数据的多模态分析
  • 图形对齐
  • 点云分析

Python 中的格罗莫夫-瓦瑟斯坦距离

我们将使用POT python 包作为 GW 距离的数值示例。它可以通过以下方式安装:

pip install POT

使用 GWdistance,我们可以计算不属于同一度量空间的样本的距离。我们在二维和三维空间中采样两个高斯分布。

图 4。作者用 Python 代码画的图

现在,让我们计算距离核,并将其归一化。

图 5。作者用 Python 代码画的图

现在,我们计算 GW 距离:

上述代码的输出是:

It.  |Loss        |Relative loss|Absolute loss
------------------------------------------------0|6.935296e-02|0.000000e+00|0.000000e+001|3.779906e-02|8.347803e-01|3.155391e-022|2.791583e-02|3.540367e-01|9.883228e-033|2.214951e-02|2.603359e-01|5.766313e-034|2.100683e-02|5.439603e-02|1.142688e-035|2.093137e-02|3.605042e-03|7.545845e-056|2.093137e-02|0.000000e+00|0.000000e+00
Gromov-Wasserstein distances: 0.020931367451704774

图 6。作者用 Python 代码画的图

执行上述 GW 模拟的完整脚本可以从https://github . com/rahulbhadani/medium . com/blob/master/01 _ 26 _ 2022/GW _ distance . py获得。

https://github.com/PythonOT/POT/blob/master/ot/gromov.py[中提供了 GW 距离的详细实现。](https://github.com/PythonOT/POT/blob/master/ot/gromov.py)

如果你觉得这篇文章有用,你可能也会喜欢我关于歧管对齐的文章。

感谢您的阅读。如果你喜欢我的文章并想支持我的内容,我请求你通过【https://rahulbhadani.medium.com/membership订阅 Medium。

参考

  1. 梅莫利,法孔多。"格罗莫夫-瓦瑟斯坦距离和物体匹配的度量方法."计算数学基础 11.4(2011):417–487。
  2. 梅莫利,法孔多。"格罗莫夫-沃瑟斯坦距离:概述."公理3.3(2014):335–341。
  3. 同构(抽象代数):https://www.youtube.com/watch?v=BAmWgVjSosY
  4. https://optimal transport . github . io/slides-peyre/gromovwasserstein . pdf

为我的项目选择正确数据库的指南:MongoDB 与 MySQL

原文:https://towardsdatascience.com/the-guide-to-choosing-the-right-database-for-my-project-mongodb-vs-mysql-256e270d29b8

本文是一个全面的指南,可以帮助您为自己的用例选择合适的数据库类型

图片由 Daniil Silantev 在 Unsplash 上提供

介绍

数据类型(如关系型和非关系型)的不断变化是公司在实施数据驱动型应用程序的过程中面临的众多挑战之一,因此更难选择正确的数据库类型。

这个概念博客将试图让你的决策过程不那么繁琐,特别关注 MongoDB 和 MySQL,这两个数据库在各自的 web 应用领域中是最受欢迎和最具竞争力的。

我们将首先提供每个数据库的清晰定义。然后,我们将深入指导您为您的使用案例选择正确的解决方案。在最后一节中,我们将介绍一种技术,它可以帮助您轻松有效地管理应用程序的管理面板。

MongoDB 和 MySQL 的快速概述

在深入对比分析之前,我们先了解一下 MySQL 和 MongoDB 数据库是什么。

什么是 MySQL?

MySQL 是一个开源的关系数据库管理系统(简称 RDBMS ),将数据存储在表和行中。MySQL 使用结构化查询语言(SQL)范式与数据进行交互,以访问和传输数据。下表可以说明关系数据。

结构化格式的假想候选人信息(图片由作者提供)

MySQL 最初创建于 1995 年,目前由 Oracle 拥有和维护。MySQL 中的“My”是一个开发者女儿的简称。

什么是 MongoDB?

MongoDB 是一个开源的非关系数据库管理系统(简称 DBMS)。

MongoDB 最初创建于 2007 年,旨在提供存储海量数据的可伸缩性和敏捷性。“Mongo”一词来源于“humongous”这个方面。

它是面向文档的,这意味着它可以将数据存储在单个文档中。这些文档类似于 JSON,如下所示。

非结构化格式的假想候选人信息(图片由作者提供)

什么时候应该使用 MongoDB 或 MySQL?

MongoDB 和 MySQL 都是很棒的数据库,为企业和小型企业提供了突出的优势。因此,它们之间的选择很大程度上取决于它们所应用的用例。在本节中,我们将帮助您获得做出正确选择的所有工具。

什么时候应该使用 MongoDB?

在以下情况下,MongoDB 应该是数据库的首选:

→ 🤷🏻‍♂️你 不知道你的应用将来会如何演变 。在这种情况下,您可能需要一个动态数据结构,这样您就可以在需要时添加新数据,而不用担心一个简单的更改会破坏整个系统。

→ ✅你 想构建具有即时访问和数据恢复需求的现代 web 应用 。这一点很重要,因为 MongoDB 在全球不同的服务器上保留了相同数据的冗余副本,这使得它具有容错性,因为单个服务器故障不会影响应用程序。

→ 🚀 速度是您最关心的问题 ,因为 MongoDB 将信息存储在单个文档中,这使得读写操作比处理可能需要多个连接来检索所需数据的关系数据库更快。

→ 💵你 关心定价,没有足够的预算 由于 MongoDB 是开源的,所以能够完全免费实现。

→ 📈您的 应用程序需要按需扩展 。MongoDB 可以保证这一点,因为它可以跨多个服务器扩展以存储和处理数据,以便随着性能要求和数据量的增长而自动适应,而不是投资非常昂贵的大型机。

→ 🌏您 需要将您的应用程序部署为服务 。这项功能是由 MongoDB Atlas 提供的,它帮助用户通过多个云供应商(如 Amazon Web Services、Google Cloud 和 Microsoft Azure)将 MongoDB 作为数据库即服务来使用,而无需担心管理数据库的过程。

实现 MongoDB 的一些用例是物联网(IoT)、移动应用程序、实时分析、产品目录等。

什么时候应该使用 MySQL?

与 MongoDB 类似,MySQL 最流行的用例也是基于 web 的应用程序。但是,在以下情况下,您应该选择 MySQL:

→ 🎯你是 在处理一个固定的关系数据模式 ,你确定它在很长一段时间内都不会改变。

→ 🎬您正处于业务的早期阶段, 没有太多的可伸缩性和分布限制,也没有太多的数据库管理专业知识 ,因为 MySQL 易于使用,并且要求较低的可定制性,这意味着用户需要复杂支持的机会较少。

→ 💵你关心定价,但没有足够的预算,因为 MySQL 也是开源的,这使得完全免费实现它成为可能。

→ 🔐 安全性是您的应用程序的一个大问题 因为即使 MySQL 在数据一致性和可靠性方面也超过了 MongoDB。

除了 web 应用程序开发,MySQL 的另一个主要用例是存储事务数据库、电子商务门户开发、概念验证项目等。

如果您不想担心管理数据库的问题,该怎么办?

无论您是在处理 MongoDB 还是 MySQL,您都必须在某个时候处理数据库管理。

如果您只想专注于您的业务专长,而不担心管理数据库,该怎么办?

→这就是像[ForestAdmin](https://www.forestadmin.com/)这样的工具派上用场的地方!

在本节中,我们将清楚地了解什么是 ForestAdmin 以及它是如何工作的。

什么是 ForestAdmin?

该解决方案通过提供一个管理所见即所得 界面编辑器来增强用户的能力,该编辑器通过一个基于 API 的框架来管理他们的应用程序,以帮助实施任何特定的业务任务,例如从关系和非关系数据库中创建、读取、更新和删除(CRUD)。

ForestAdmin 是如何工作的?

ForestAdmin 基于以下两个主要组件的交互工作:

  • **Forest Liana**,它是一个托管在用户站点上的本地后端,用于分析全部数据并生成用于管理目的的 API 凭证。
  • **Forest UI**对应的是一个软件即服务的 web 应用程序,可以从任何浏览器访问,它的目标是使用之前生成的 API 在管理员用户和数据库之间建立通信。

ForestAdmin 使用两步身份验证来帮助管理员用户以安全的方式连接到 Forest Admin 的服务器和 API。

如今,数据隐私对于任何组织来说都是一个大问题。ForestAdmin 使用一种架构来解决这个问题,这种架构将您的数据直接传输到您的浏览器,使其对服务器不可见。

结论

这个概念博客通过提供它们如何工作的全球概述,涵盖了 MongoDB 和 MySQL。然后,它提供了一步一步地帮助您选择适合您的用例的数据库。最后,它涵盖了有效管理应用程序的最伟大的技术之一。

下一步将通过完整的分步教程对 ForestAdmin 进行深入解释。

你可以通过下面的链接进一步阅读。还可以在 YouTube上关注我,了解更多互动内容。

  • 为您的所有数据构建一个内部工具
  • 构建更快,构建更智能
  • MySQL 文档
  • 关于 ForestAdmin 的原始简化出版物
  • 免费试用森林管理并链接到以下网址。

软技能背后的努力

原文:https://towardsdatascience.com/the-hard-work-behind-soft-skills-8bc2d4995986

一名成功的数据科学家不仅仅是一系列技术能力(尽管这些能力可能很重要)。我们的工作伙伴首先是:他们的性情、交流*惯和解决问题的方法至少和他们对 Python 的掌握一样重要。本周,我们选择了一些最*的文章,这些文章专注于帮助数据专业人员脱颖而出的所谓软技能。让我们开始吧。

  • 心智模式和人格框架是无形的——但至关重要的 。对于阿尼·马杜尔卡(Ani Madurkar)来说,好奇心、适应力甚至幽默感等个人品质都是表现的有力指标,以至于“称这些概念为‘技能’几乎是一种伤害,因为它们更多的是人格框架,比传统技能需要更长的时间才能掌握。”不过,好消息是,我们可以在这些领域继续发展,就像我们在编码或数学领域一样。
  • 迈出构建网络的第一步 。到目前为止,一个广为接受的事实是,人脉是获得(并擅长)一份新工作的关键。Sophia Yang 为新晋数据科学家提供的实用建议涵盖了可能是最困难的部分:开始工作并为未来的成功奠定基础。
  • 你的时间宝贵吗?更明智地使用它 。感觉日子过得飞快,待办事项越来越多?我们大多数人都知道这一点;我们很少有人喜欢它。梅根·迪布尔最*分享了几个让你充分利用工作日的具体想法,从并行处理到持续优化。Megan 的建议侧重于数据分析师的工作流程,但也很容易转移到其他以数据为中心的领域。
  • 给你的技术工作注入设计思维 。做出明智的数据讲述决策需要软硬结合的技能。 Brian Perron 鼓励数据科学家超越特定工具和技术方法的限制来思考他们的工作——他的见解可以激励你对可视化过程进行微小但可见的调整。
  • 如果没有人能读懂你的代码,那么你的代码就是不好的。编程?一个技能?!生产功能性代码可能确实是一项高度技术性的活动,但正如朱利安·维斯特提醒我们的,没有数据科学家或开发人员会在真空中编码。Julian 创建可读代码的五个策略确保您的工作在协作项目中保持相关性和面向未来。

照片由 Maranda Vandergriff 在 Unsplash 上拍摄

对我们最*的其他亮点感兴趣吗?他们覆盖了这么多地方!以下是一些我最喜欢的:

  • Hajar Khizou 讲述了ML ops 原则的基础,并解释了为什么你应该考虑在你的下一个 ML 项目中应用它们。
  • 通过跟随 Varshita Sher 博士最新的专注于 Python 的教程,学*如何更有效地调试代码。
  • 你觉得统计术语令人生畏吗?不要错过凯西·科兹尔科夫的新入门书,这本书用清晰易懂的英语解释了基本(和不太基本的)概念。
  • 另一方面,如果你对统计数据感觉良好,但对获得下一次统计数据采访,艾玛·丁有一个很好的概述。
  • 在他的第一篇 TDS 文章中, Lars ter Braak 分享了一篇关于 ML 环境下概率分类的全面而有用的介绍。

我们一如既往地感谢您的支持,以及您为我们出版的作品投入的时间。

直到下一个变量,

TDS 编辑

阻碍不同员工成功的隐藏偏见

原文:https://towardsdatascience.com/the-hidden-biases-keeping-diverse-employees-from-success-d5180dce844

一些鲜为人知的数学概念是如何阻碍不同的员工获得公平的机会的

有一种观点认为,商业上,或者说生活中成功的主要决定因素是努力工作和一点点运气。人们会说他们只是碰巧在正确的时间出现在正确的地方,或者他们的努力最终得到了回报。

我不会试图阻止你这样做——努力工作和运气是人生成功的关键因素。但是这种运气从何而来?什么因素导致某人在工作中得到“幸运的突破”,你如何从某人在其职位上的实际表现水平中理清这一点。

让我们从讨论一些你可能没听说过的事情开始:马太效应

马太效应

因为凡有的,还要加给他,他就有馀了。没有的,连他所有的也要夺去。

— 马修 25:29,RSV

马太效应是一个经济概念,以耶稣的一个寓言命名,假设一个人在生活中获得更多的东西,如声望、财富、地位等,他们在这些东西上增加的概率也增加。这真的是对世界运行方式的描述不是吗?当某人开始获得成功时,你经常会看到这种成功滚雪球般变成进一步的成功,然后滚雪球般变成其他的成功,直到这个人觉得成功几乎是不可避免的。

为什么会这样?

考虑以下场景:

简和杰克都在争取升职,他们都是同样熟练的员工,但他们之间有一个关键的区别:杰克在之前已经在公司得到了提升,所以当杰克和简都去和他们的经理谈话时,有趣的事情发生了…

杰克更有可能冒险。

杰克以前在公司内获得过成功的晋升,他更有可能提出大胆的想法,因为毕竟这种想法上次对他有效,所以他觉得没什么可失去的。之前在组织中的成功使杰克在组织中的安全感产生了心理上的转变,这推动了他的前进并影响了他未来的行动。

现在简。

简作为一名从未被提升过的员工,会比杰克更担心地加入谈话。她会更加自我怀疑,更加自我批评。她还没有获得“心理资源”来让自己更多地参与进来,所以她不想在谈话中冒太多风险,因为她个人觉得她会失去更多东西。

这就是马太效应

就像一个富人比穷人有更多的资源来冒险,所以他们有更大的潜在回报而不用担心破产一样,在一个组织中拥有更多心理资源的人将在晋升、认可和成功方面拥有更多优势。

这一概念与优先依附的想法紧密相连——实际上它们可以被认为是同一件事。

优先附件

优先依附的想法来自于长尾分布或幂律分布的数学概念。幂律分布描述事件超出典型正态分布的情况。正态分布是你*惯看到的典型的“钟形曲线”。

由作者创建

这个钟形很好地描述了人类的智力。平均智商集中在 100 点左右,然后两边急剧下降。一个类似的图表可能描述了美国的平均寿命——大约 76 岁的集群和两边的概率悬崖。

正态分布的信息通常有一个适当的尺度——某人只活到 5 岁被认为是悲剧,某人活到 100 岁被认为是非凡和令人惊讶的。

然而,正如我们所知,生活中有些东西不是正态分布的。事实上,生活中有些东西的分布方式甚至没有一个我们容易归类的尺度。他们似乎还在继续。这种模式就是幂律分布。

在美国,平均年收入约为 6.3 万英镑,但因为这是一个幂律分布,我们可以理解将有许多人高于或低于这一平均值。事实上,三分之二的美国人收入低于平均水平。在美国,有些人的收入如此之高,以至于他们甚至无法在这样的图表中找到合适的位置。他们打破了尺度。

优先附加描述了复合成功的数学模型。

基本上,有钱的越来越有钱,该升职的越来越升职。

收视率最高的电视节目收视率最高,Instagram 上最受关注的影响者最有可能获得新的关注者,最受尊敬的公司获得最多的申请人。

复合偏见的危险

现在我们知道了一个真实的现象,即个人已经取得了成功,而组织继续取得成功,这也应该很清楚,这是一个危险:被机会忽略的个人,在概率上是非线性的,在未来有被忽略的危险

偏见越来越多。

在一个组织内,如果招聘经理的偏见或招聘人员的偏见对多元化的候选人不利,那么这些偏见可能会继续对该个人产生影响,由于偏好依附和马太效应,它们可能会导致为员工创造平等机会的难度增加。

考虑以下场景:

我们回到杰克和简。想象一下,如果他们两个都想当 CEO。

在一个简单的数学模型中,我们可以将杰克和简的晋升机会建模为一个概率事件。每次他们获得提升时,都有 50%的提升机会.一个人可能需要 15 次晋升才能成为首席执行官,而一个人需要抓住每一次晋升机会才能成为首席执行官。

使用这个模型,我们可以将 Jane 晋升的机会设定为 40 %, Jack 晋升的机会设定为 50%——这是相当慷慨的,因为一些数据暗示女性的机会要低得多。

Jack  =  .5^15 = 0.000031Jane = .4^15 =0.000001

晋升率 10%的差异在高层变成了* 30 倍的差异。

关键要点:

  • **在组织中获得晋升的个人将更有可能在组织中继续获得晋升。**为了确保员工得到公平的评判,有效的绩效评定指标是必不可少的。

  • **小小的偏见会产生巨大的影响。**查看你的数据,真正了解你的不同人口统计群体相对于其他群体被提升的可能性,并试图了解如何解决这些偏见。

  • 需要有意识地建立心理资源(心理安全、信心)来创造公平的竞争环境——明确基于先前成就的晋升没有障碍。每个晋升周期都是一张白纸。

让我们来谈谈你

最后,我希望您对相对未知的小因素如何在组织中产生巨大影响有一个更清晰的认识。最终,复合偏差意味着员工获得公平晋升的机会可能取决于他们进入组织的初始条件或他们以前在组织中的成功。

因此,当你评估招聘实践、绩效管理实践或仅仅是你自己的职业生涯时,考虑一下形势会如何对你有利或不利。

如果你喜欢这篇文章,请订阅我的时事通讯或者在这里关注我!

数据科学中复杂性的隐性成本

原文:https://towardsdatascience.com/the-hidden-costs-of-complexity-in-data-science-6b5958117bfb

如何知道你已经走得太远了

我们都经历过,我们都在做一个项目,但它并没有完全走到一起。我们认为能让我们实现目标的模式没有成功。因此,我们很想增加一点复杂性,“如果我为这个项目定制一点这个函数会怎么样?”

其他时候,我们开始一个项目,头脑风暴前进的道路。我们把伟大的想法放在黑板上。他们都处于数据科学的前沿。每个人都很兴奋,但有一种挥之不去的感觉,也许事情已经走得太远了。

作为数据科学家,我们喜欢走在前沿。我所知道的最成功的数据科学家喜欢修补和改进——他们希望成为最前沿。这是难以置信的强大。但是修修补补是有隐性成本的,总是走在最前沿。

最佳解决方案会权衡尖端技术的优势与可靠性、可扩展性、可解释性和资源可用性的成本。数据科学中的最佳解决方案是在每个决策点对复杂性采取深思熟虑的方法。

照片由洛伊克莱雷在 Unsplash 拍摄

以上两种情况都不是天生的坏。事实上,他们通常来自一个充满激情的地方,尽我们所能做好工作。但是,这种激情需要仔细的自我监控。问题是,我们倾向于不断增加复杂性,并且作为数据科学家,我们经常忽略这样做的成本。为什么?

因为复杂性的好处几乎总是不言而喻的:我们添加模块、代码、子模型的原因就在我们面前。它是如此真实,我们可以看到,感觉到,品尝到,触摸到。然而,成本往往被掩盖,哪怕只是一点点。充其量这是我们的第二个想法。最坏的情况是,我们完全忽略它。因此,当我们构建一个模型时,我们最终会试图在复杂性之上增加复杂性,在成本之上增加成本。当我们放弃的时候,我们的模型会变得不可收拾。

通往地狱的路是由良好的意愿铺成的。对吗?

在其他学科中并不是一个陌生的问题。几十年来,工程师们一直在处理类似的问题。在第二次世界大战中,美国设计的谢尔曼坦克使用高度可互换的零件。如果一辆坦克被撞毁,可以从另一辆坦克上取下零件。谢尔曼是一种相对简单的机器,如果在战斗中损坏了,可以在战场上很快修复。

另一方面,德国设计了老虎。老虎是强大的,精确的和复杂的。这是一辆像瑞士表一样调得很好的坦克。盟军非常害怕一只全面作战的老虎。问题是,如何让老虎跑起来?精密工程意味着定制零件和知识。如果你想修理一只老虎,你需要老虎的特定部分。如果你想修理老虎,你需要老虎的专业知识。

谢尔曼坦克照片由 Unsplash 上的丹·Kb拍摄

因此,盟军大规模生产了谢尔曼,并继续服役。另一方面,老虎的价格是谢尔曼的六倍,而且损坏意味着它经常不得不被遗弃在野外。

Sherman 是一个几乎没有定制的数据科学模型。它的开发者持续监控复杂性的成本。它的各个部分对我们的同事来说是可识别的、可解释的和可修复的。它构建高效,并以适当的准确度完成工作。

老虎是数据科学模型,通常以极大的热情构建,其开发者对复杂性的成本视而不见。当它工作时,它是一台不可思议的机器。它的精确性意味着它会断裂。当它坏了的时候,只有很少一部分人有能力修理它。他们将尽最大努力这样做。

但是复杂性本身并不是坏事。作为数据科学家,我们的工作需要一定程度的复杂性。复杂性是一个光谱,我们必须监控我们在这个光谱上的位置。

摄陶赫在 Unsplash

为了控制复杂性,我通过设定复杂性限制来开始一个项目。这个决定由三个主要问题引导:

  1. *“模型的最低要求精度是多少?实现这一目标的最低复杂度是多少?”*我们不能忽视项目的需求,因此需要考虑模型的复杂性。这有助于设定一个起点“我知道我至少需要这个项目的中等复杂程度。”

  2. “这个项目需要某种缩放吗?”如果项目要扩展,那么我会对复杂性限制更加严格。牺牲可靠性将被认为是非常昂贵的成本。

  3. *“项目有多少资源可用?”*我可以支配的资源将进一步影响我让项目变得有多复杂。如果我有很多时间、系统或人员可用于项目,那么我会更愿意增加复杂性。

然后,在设计和开发阶段,我监控我在复杂性谱中的位置。每当我向一个模型添加一个新的组件或定制时,我都会问自己“我刚才添加的是一个简化吗?不复杂?有点复杂?非常复杂?”这允许我不断更新我在复杂性谱上的位置。

通过监控这个位置,我强迫自己开始权衡。我开始思考我还剩下多少空间,以及每一件复杂的事情是否值得付出代价。“我真的需要添加这种定制吗?它的成本是多少?有哪些替代方案?”这里的关键是所有的复杂性都是有代价的,只是它被隐藏的程度不同。

照片由斯蒂芬·斯坦鲍尔在 Unsplash 上拍摄

因此,我监控的复杂性的具体成本是:

1)可靠性:“这种变化会让模型变得脆弱吗?这是否意味着输入的一个小变化就能打破它?或者对代码做一点小小的改动就可能导致它崩溃?”

2)可伸缩性:“这种变化是否意味着模型将变得非常特定于任务?这是否意味着它将很难自动化并应用于许多不同的数据集?”

3)可解释性:“这个变化是我的同事们会很容易理解的吗?足够让他们能够在没有我的帮助下纠正任何问题?1 个月、3 个月或 6 个月之后,当我回过头来看这个问题时,我能理解这个变化吗?”

4)资源需求:“做出这个改变需要付出多大的努力?需要几分钟吗?几天?几周?”

这意味着在每一个决策点,我都可以问自己,“我是否愿意在我的复杂性谱上移动那个很远,同时为了我看到的利益牺牲那个我强迫自己揭露隐藏的后果,所以现在我可以诚实地评估形势。

你可以想象这发生在二战时期的坦克设计室。很难想象谢尔曼的设计师会比老虎的设计师对他们的工作更没有激情。他们可能会喜欢定制设计每个组件,使其尽可能适合他们的特定应用。

“我知道我们想用一个普通的底盘,但是如果我把这种金属做得厚一些,坦克会更坚固。”一定有人有过这种想法。但是更重要的是,*“但是等等,这一点点复杂性将会对我的设计的可伸缩性和可修复性造成巨大的代价”*这种想法也一定是被强行灌输到他们的头脑中的。

这难道不是常常为我们数据科学家铺平通往地狱之路的良好意图吗?*“我知道我们想要使用我的团队成员构建的这个函数,但是如果我只是让这个回归成为非线性的,我的预测就会准确得多。”*我们都有这样的想法,一直都有。它们不是坏想法,它们很棒。他们是伟大数据科学家好奇心的体现。

但重要的是接下来会发生什么。你是否勇往直前,一层又一层地增加复杂性,一次又一次地增加成本,直到最终陷入数据科学的地狱?或者你会给自己一点时间来寻找隐藏的成本,权衡利弊,然后再继续前进吗?

取得联系

通过 LinkedIn 联系我,了解更多关于数据科学领域的观点!

[1]杰西·贝克特, 谢尔曼坦克——猛兽还是半身像?

[2]塞思·马歇尔,老虎和谢尔曼:批判的目光

发展数据技能的理想数据源:你自己

原文:https://towardsdatascience.com/the-ideal-data-source-and-activities-for-developing-data-skills-yourself-347e58a1567e

自我追踪和个人科学导论

图片由作者提供。

我在一个研究生项目中教授数据入门课程,学生们以前没有处理数据的经验,也没有本科统计学或研究方法课程的痛苦记忆。我非常喜欢帮助学生建立解决现实世界问题的基本数据技能。我工作中最喜欢的部分是当学生们有一个啊哈的时刻,意识到他们不仅在处理数据方面有的才能的兴趣。这是成功的三个关键因素中的两个——第三个是机会。最成功的学生是那些主动出击,寻找机会处理课堂活动和作业之外的数据的学生。

虽然使用数据的机会很多,但将现有项目与符合新学员技能的需求联系起来是一项挑战。学生还有许多与其他课程和实*竞争的需求,进一步限制了机会。我鼓励学生利用我认为最理想的数据源:你自己。这个建议实质上意味着捕捉和分析你自己生活中某个方面的数据。围绕这个概念存在着一个完整的社区,通常被称为个人科学量化自我。发表在杂志公众对科学的理解上的以下文章提供了对该运动的详细描述,可在此处访问:

作者截图。

许多人已经用智能手表或移动设备跟踪行为和活动,监控步数、睡眠模式、心率等。许多应用程序让你可以访问你的数据,让你有机会重新分析数据。你可以用应用程序来验证你的结果,或者用一种对你更有意义的方式来展示结果。这些现有的数据源是极好的技能发展机会。但是,我鼓励你超越现有的应用程序,创建你的数据收集系统。我将首先描述为什么这些项目对新手来说是理想的,然后提供启动你的项目的技巧。

为什么自我跟踪项目是理想的?

暴露于完整的数据生命周期

自我跟踪项目向您展示了数据生命周期的一整套活动。即使是一个简单的项目,您也可以获得收集、管理、清理、管理、分析、可视化和呈现数据的宝贵经验。这些活动可以揭示你的强项和弱项,为你集中发展技能提供极好的见解。

技能发展的效率

将您的技能应用到真实世界的数据中是培养技能的最有效的方法之一。课堂活动和作业是技能发展的基础,但这些技能只有在你能应用到现实世界时才有意义。此外,当您加入一个数据项目时,您可能很难控制您能做的工作。启动你自己的项目是一个很好的方法,可以立即积累你的技能和经验。

有意义的数据和见解

学生可能理解给定程序的步骤或机制,但对数据的深刻理解对于产生有意义的见解是必不可少的。课堂活动和作业可以鼓励技能的死记硬背,特别是当学生专注于正确解决年级问题时。自我跟踪项目有助于克服这个问题,因为你对数据有深入的理解,特别是当你跟踪的行为或活动对个人有意义时。

我最*开始了一个新的健身和健康计划,将我的锻炼和睡眠记录到谷歌表格中。我使用 Tableau 从一个简单的电子表格中创建了许多不同的数据视图。跟踪过程有助于显示我的进步和一致性,这有利于让我进一步参与和激励我的健身活动。从这个角度来看,这个项目的回报不仅仅是处理数据。

来自自我跟踪项目的作者自己的数据和仪表板。

概念化项目

概念化项目的能力是一项需要培养的重要且具有挑战性的技能。概念化项目的一部分是考虑项目范围、时间、资源、技能水平和评估成功的方法。自我跟踪项目让你立即接触到这一基本技能,当事情没有按计划进行时,允许你快速迭代。你最初的项目可能不会成功,但是你构思和实现的每个项目都会给你宝贵的经验。

自我跟踪的建议

保持你的项目简单

复杂的项目,尤其是那些涉及大量数据收集的项目,注定会失败。如果你是一个新的学*者,专注于一个单一的行为或活动是非常好的。记住,你可以用一个小而简单的数据集做很多事情。

追踪有可变性的东西

例如,如果你倾向于一天只喝一杯咖啡,跟踪你的咖啡因摄入量就不会令人兴奋。但是,对其他人来说,比如我自己,我的咖啡摄入量是相当可变的——包括时间和数量。这种可变性提供了更多的机会来练*你的分析技能和产生洞察力。不过,要小心。有时候太多的可变性会使你的项目更难维护。

追踪一些对个人有意义和有趣的事情

我认为与健康相关的行为是追踪的最佳起点之一。例如,睡眠跟踪是一个很好的起步项目,尤其是如果你对揭示可能影响你睡眠的趋势或模式感兴趣的话。事实上,你可能有一个应用程序为你做这些,但也许有一个睡眠的维度你的应用程序没有跟踪或以理想的格式为你提供数据。

我曾经和一些学生一起工作,他们创建了关于饮酒、跟踪学*一项新技能(例如,用 R 和 Python 编程)、训练小狗(例如,“事故”发生的时间和地点)、看电视和说脏话的项目。虽然许多自我跟踪项目关注与健康相关的行为,但这并不是必需的。我强烈推荐探索 Giorgia Lupi 和斯蒂芬妮·波萨维克的 【亲爱的数据】 项目的工作。他们花了整整一年的时间收集和发送明信片上的个人数据手绘。每周都是不同的主题,为你的自我跟踪项目提供许多想法。他们追踪了所有的事情,从骂人、他们遇到的门的样式、赞美、犹豫不决、笑声和告别,等等。

作者截图来自http://www.dear-data.com/theproject

关注客观的衡量标准

客观测量意味着获取可以直接测量或计算的数据。例如,你可以直接测量你上床睡觉的时间和起床的时间——那些是客观测量。这些测量比主观测量具有更大的有效性和可靠性,例如对你睡眠质量的感知或你感觉休息的程度。客观评估受偏见的影响较小,可以为您提供更好的见解,尤其是在初次接触数据时。

围绕你的项目建立时间界限

如果你在第一周取得了成功,你可以延长项目的时间范围。如果你失败了,你希望失败得更快。你可以重复你最初的想法或推出新的东西。只要记住,成功和不成功的项目都有必不可少的学*机会。

标准化您的数据收集

尝试创建一个系统来保持数据收集工作的一致性。确保你关注数据收集提供的学*体验。许多作为课堂活动或作业的一部分而被提供数据的新学*者并不完全理解创建和管理高质量数据集的复杂性。

专注于创建数据产品

试着用你的数据创造一些东西,尽可能地引导出有意义的见解。例如,您可以使用数据透视表或简单的数据可视化来汇总您的数据,这可以帮助您了解您正在跟踪的行为。

结论

将您的数据技能应用于真实世界的情况是培养真实世界数据技能的最高效和最有效的方法之一。创建您的自我跟踪项目提供了跨数据生命周期培养技能的绝佳机会。保持你的项目简单,并与你现有的技能相匹配。

我最*的大部分工作都集中在帮助新学*者发展实用的数据技能上。如果你对这个话题感兴趣,请随时关注我。

可解释人工智能对人类检测人工智能盲点能力的影响

原文:https://towardsdatascience.com/the-impact-of-explainable-ai-on-the-ability-of-humans-to-detect-blind-spots-in-ai-6e991da400b3

人与人工智能互动研究及 XAI 的贡献

图像是使用 DAllE-2 生成的

TL; 在一句俏皮话中,我的研究检验了向用户提供对人工智能决策的解释是否会影响用户识别人工智能是否有盲点的能力。

在数据科学的背景下,盲点是指人工智能由于对环境的有缺陷的表示而产生系统性错误的情况,这可能导致错误的决策和非最优的结果。关于可解释的人工智能,这个领域正在成为数据科学生命周期不可或缺的一部分,并被假设为支持数据科学家对 ML 模型决策的理解。

关于研究

在研究过程中,进行了两项研究,都是在自主车辆(AV)领域;参与者被要求观看一个在高速公路上驾驶时做出决策的模拟视频。

第一项研究调查了参与者在多大程度上发现了 AV 是否有盲点。第二项研究检验了为 AV 决策提供 XAI,特别是奖励分解解释,是否会提高参与者发现 AV 盲点的能力。

结果表明,参与者能够区分有盲点和无盲点的 AV,但 XAI 并没有显著改善他们对人工智能盲点的评估。然而,XAI 与学* AV 决策的时间增加有关。

快速介绍

人机协作

人类-人工智能合作是一个相当宽泛的术语,它解决了人类和人工智能算法之间的各种交互,旨在实现一个共同的目标。这种合作涉及各个方面,涉及每一方的角色、人工智能的人类心智模型(Bansal 等人,2019 年)和任务的领域。理想的合作有望产生互补的团队绩效,有望超过各方单独的绩效(Wilder,Horvitz 和 Kamar,2020)。在实践中,很少实现互补性能,在某些情况下,联合努力甚至不如单独的人工智能性能(Bansal 等人,2020)。

与人类相比,人工智能算法执行给定任务的高级能力导致对互补性能的追求集中在另一个方面,即更好地监控人工智能代理的行动。换句话说,获得互补性能的一个潜在方法是利用人的能力来识别代理的弱点并决定如何正确地行动。

可解释的艾(XAI)

*图片来自 Pexels 的 energepic

*年来,XAI 领域的研究越来越受到人们的关注。XAI 的主要目标之一是以各种方式解决机器学*算法的不透明性。DARPA(国防高级研究计划局)将 XAI 定义为“能够向人类用户解释其基本原理,描述其优势和弱点,并传达对其未来行为方式的理解的人工智能系统”(Gunning 等人,2019)。

解释方法的一个例子是可视化哪些输入特征对于分类器是重要的图形(Lundberg & Lee,2017;里贝罗、辛格和盖斯特林,2016 年)。

可视化哪些输入特征对分类器重要的解释( Lundberg SM 等人,2020 )。

虽然 XAI 方法似乎很有前途,但它们尚未证明如预期的那样有效(Kaur 等人,2020)。此外,解释可能会给用户带来过多的信息,使其难以将呈现的内容转化为有价值的见解(Poursabzi-Sangdeh,Goldstein,Hofman,Vaughan 和 Wallach,2018)。在其他情况下,用户往往不会投入所需数量的精神资源,而在这种情况下,为了充分理解 AI 的帮助,这些精神资源往往是必要的。

关于 XAI 对人类心智模式影响的理论综述

XAI 领域的大部分研究依赖于评估人类对该系统的心理模型。系统的心智模型是人-人工智能交互领域的基本理论构造。这个结构被定义为“人类能够产生的机制:(1)对系统目的的描述,(2)对系统功能和观察到的系统状态的形式解释,以及(3)对未来系统状态的预测(Rouse & Morris,1985)。心智模型的结构是一个动态的结构,受与系统交互的影响(Gentner,2014)。一个精确的心理模型被假设来帮助用户判断何时信任或忽略人工智能的帮助。

盲点

盲点是一个相当宽泛的术语,可以定义为一个人无法进行判断或辨别的区域。盲点是指决策者没有意识到决策过程中涉及的某个方面,从而导致做出非最优决策。在人工智能的背景下,盲点通常被定义为状态空间中的区域,其中代理人在现实世界中犯下系统错误,导致相当大的负面奖励(Ramakrishnan 等人,2019)。

盲点示例—一辆不区分紧急车辆和非紧急车辆的特斯拉。*照片由来自 Unsplash 的 Josh Couch 拍摄。

当前研究

这项研究旨在检验 XAI 是否能够促进人类识别人工智能盲点的能力,从而改善人类与人工智能的合作。这项研究扩展了研究的范围,通过比较 XAI 对人工智能的人类心理模型的影响,当处理有盲点的人工智能和没有盲点的人工智能时。

主要研究问题有:

(1)参与者能否区分有盲点和没有盲点的人工智能?

(2)XAI 能影响参与者区分有无盲点的人工智能的能力吗?

实验领域

*照片由 Pavel Danilyuk 从 Pexels 拍摄。

最*,人们对自动驾驶汽车(AV)技术越来越感兴趣,这将极大地影响我们的驾驶行为。将一名人类驾驶员放入 AV 中,监控 AV 的决策,理解其决策并知道何时信任它是至关重要的。在高速公路上尤其如此,因为错误决策的代价可能是巨大的。

为了这项研究的目的,开发了一个基于自主车辆(AV)概念的虚拟模拟。该模拟示出了在三车道高速公路场景中导航的 AV,旨在完成道路行程,同时最小化行程持续时间并最大化与其他车辆的安全距离。该模拟提供了一个鸟瞰的 AV,以及其他几个传统的,人类驾驶的车辆(HDV)。

高速公路场景的图解。蓝色车辆代表 AV。

为该场景定义了三种不同的驾驶风格:标准、缓慢和危险驾驶风格。

AV 的政策

对于这个实验,我模拟了一个人工智能代理,而不依赖于真正的强化学*算法。AV 的策略是通过开发描述 AV 策略的决策树来设计的。定义 AV 策略的好处是控制策略的复杂性及其盲点。收到的 AV 奖励由两个子分数组成— (1)安全驾驶分数和(2)接*目的地分数。

AV 的盲点

我选择把重点放在人类驾驶的车辆的驾驶风格作为一个盲点。这一特定特征被选作盲点,因为与监控 AV 决策的人类驾驶员相比,AV 要考虑这一点相当现实且相当复杂。

带盲点的 AV 和不带盲点的 AV 之间的区别在于,带盲点的 AV 不区分车辆的驾驶风格,而不带盲点的 AV 可以正确地考虑其他车辆的未来位置。如下图所示,具有盲点的 AV 认为所有车辆都具有与“车辆 A”相同的驾驶风格。这种差异会影响 AV 的决策,因为它可能会导致车辆在缓慢行驶或错过移动到不太繁忙的车道的机会后被延迟。

两种自动驾驶汽车的区别:

(1)没有盲点的 AV

(2)一部有盲点的 AV。

模拟

模拟包括 4 个场景,其中包括若干次试验;这些场景被设计为离散的顺序决策任务,其中 AV 呈现有一系列决策点,每个决策都导致后续的决策点。AV 可以执行 5 个动作:(1)加速,(2)减速,(3)换到左侧车道,(4)换到右侧车道或者(5)保持相同的速度和车道。

截图场景对场景的第一次测试,是主任务的一部分。该图像将高速公路可视化,包括 AV(蓝色汽车)和人类驾驶的车辆(HDV)。

主要测量值

直接盲点估计。 旨在明确评估参与者是否识别 AV 盲点的测量。参与者被要求评价 AV 在多大程度上考虑了前方车辆的驾驶风格。

预测正确性。 一种旨在评估参与者在多大程度上可以预测 AV 的动作的测量。

参与者 共有 163 名参与者参与了研究,其中 66 人自愿无偿参与实验,其余人参与是为了获得课程学分。

实验设计

用于本实验的受试者间设计,其中参与者被随机分配到两种条件之一——“有盲点的 AV”条件或“没有盲点的 AV”条件。两种情况的唯一区别是 AV 的决策是主要任务的一部分。主要任务的目标是使参与者能够推断出 AV 对公路的各种状态做出什么决定。

实验程序的说明。

实验 1 —结果

盲点估计 —发现两组之间有显著差异(p < .001)。

盲点估计结果。关于“AV 在多大程度上考虑了 HDV 的驾驶风格”这一问题的试验条件差异报告。

预测任务

可以证明,“没有盲点的 AV”组中的参与者的平均正确反应率高于“有盲点的 AV”组中的参与者的平均正确反应率。(p = .003,d=0.52)。

预测任务结果。实验组的准确率差异被用来预测给定一系列状态时 AV 会采取什么行动。

研究 1 结论

研究结果表明,参与者已经区分了有盲点和无盲点的 AI,这得到了先前研究的支持,该研究发现,参与者能够识别哪个 Atari 代理因盲点而发生故障(Olson 等人,2021)。关于预测任务,两组都预测了人工智能的决策高于机会水平。这一发现意味着,在某种程度上,与人工智能的互动足以理解人工智能政策的某些方面。

根据这些发现,剩下的问题将是——当与人工智能合作时,如何提高人类识别人工智能盲点的能力。这个问题让我们检验了向参与者提供一种可解释的人工智能技术,特别是“奖励分解解释”,是否会促进他们区分有盲点和无盲点的人工智能的能力。

研究 2——概述和研究问题

在这项研究中,我调查了向参与者提供解释是否会提高他们对人工智能代理决策的理解。更具体地说,我研究了当面对 XAI 时,参与者对人工智能盲点的估计和对其决策的预测是否更准确。

我用来描述自主车辆(AV)决策的解释技术被称为奖励分解解释。奖励分解解释反映了 AV 在场景结束时预测的未来累积分数。给定一个决策点,解释详细说明了三种可能行动的未来预测得分。此外,解释详细说明了每个子分数对未来预测分数的贡献。详细说明了两个子分数:(1)行程持续时间和(2)安全性。

使用奖励分解解释背后的基本原理是,当处理真实环境时,基于任务的子分数可以对应于 AI 试图实现的两个不同的目标。例如,在真实环境中,AV 可以被编程以实现多个目标,例如(1)安全驾驶,(2)在合理的时间内到达目的地,(3)遵守驾驶规则,(4)最小化燃料使用等等。

奖励分解解释的一个例子。

上面的屏幕截图说明了提供给参与者的解释,而下面的屏幕截图说明了如何将解释传达给参与者。

研究 2 —方法

共有 155 名参与者参与了这项研究,其中 46 人自愿自由参与实验,而其余的人是为了课程学分而参与的。

测量值

直接盲点估计+预测正确性。 同实验 1。

间接盲点估计。

程序

该程序与研究 1 的程序基本相同

研究 2 —结果

直接盲点估计

在“无盲点 AV”的参与者中,获得 XAI 的参与者的中位数略高。在“有盲点的 AV”的参与者中,获得 XAI 的参与者的中值评级是相同的。

直接盲点估计报告。该图表描述了关于 AV 考虑其他车辆驾驶风格的程度的参与者中间值之间的差异。

间接盲点估计

在“AV 无盲点”组和“AV 有盲点”组的参与者中,获得 XAI 的参与者的平均评级略低。

间接盲点估计报告。参与者报告之间的差异,涉及 AV 在多大程度上会针对一组状态做出正确的决定。

预测任务

在“没有盲点的 AV”的参与者中,获得 XAI 的参与者的平均正确率更高。在“有盲点的 AV”的参与者中,获得 XAI 的参与者的平均正确率较低。

预测任务准确度。参与者在预测任务中准确性的差异。

试用时间

每种情况下观看审判的平均时间是分开计算的。这项计算只包括看 AV 的时间,而不包括参与者看 XAI 的时间。

可以看出,在每种情况下,观看试验的平均时间随着时间的推移而减少,与另一组相比,参与者观看 XAI 的 AV 的平均时间较高。

观看不同情景下的单个试验所花费的平均时间。与没有配备 XAI 的参与者相比,被分配到配备了 XAI 的 AV 组的参与者平均每次试验花费的时间更长。

讨论和研究的主要目标

这项研究的重点是人类是否可以识别人工智能的盲点,以及 XAI 是否可以帮助理解人工智能是否有盲点。从当前的研究中可以得出的主要结论是:(1)参与者可以区分有盲点和无盲点的人工智能。参与者可以将没有盲点的人工智能描述为比有盲点的人工智能更多地考虑其他车辆的驾驶风格,因此比有盲点的人工智能做出更好的决策。(2)当向参与者提供了奖励分解解释时,参与者没有表现出改进的表现。

理论和实践意义

关于为什么奖励分解解释没有促进更好地识别这项研究中的盲点,可能有几种可能的解释。XAI 的认知过程可能依赖于 XAI 的内容以及它被利用和推广到其他情况的方式。从理论的角度来看,解释人工智能以开发人工智能的准确心理模型,取决于一个人的感知、认知能力、期望和经验。

针对 XAI 技术,根据研究结果,奖励分解解释技术不能推广到其他决策点和状态。在 XAI 上花费的时间和参与者的准确性之间缺乏显著的相关性,这表明应该检查 XAI 技术的内容和向参与者传达它的方式。一个可能的含义是,如果我旨在向参与者提供对人工智能盲点的理解,我应该使用支持全局理解的解释,这种理解支持演绎推理,而不是提供支持归纳推理的局部解释。

人类对任务的参与以及他们对人工智能的心智模型

参与者花费在与 XAI 相关的主要任务上的认知努力可以以多种方式解释,这也可能表明参与者愿意更好地理解人工智能的决定。虽然目前的研究结果没有为这种说法提供坚实的基础,但这些结果可能会间接表明 XAI 与短期的参与度增加有关。

限制

目前的研究有几个局限性:

(1)与人工智能的交互量是有限的,以便实验可以在合理的时间内进行。

(2)我模拟了一个不一定具有最优策略的人工智能代理。这影响了奖励分解解释的计算方式,并可能影响参与者区分人工智能错误根本原因(非最优策略或实际盲点)的能力。

(3)从方法论的角度来看,与要求参与者比较两个代理的性能的先前研究相反,当前研究中的参与者仅观察到一个代理(有或没有盲点)。如果不与另一个人工智能代理进行比较,参与者可能很难评估人工智能代理的性能,并估计它是否有盲点。

未来研究

主要的公开问题是为什么参与者不能从 XAI 中受益,尽管研究结果表明他们愿意花费认知资源,如增加观看主要任务和重新播放场景的时间。未来的研究方向可以集中在 XAI 技术的检查和影响 XAI 心理过程的知觉和认知方面。

个人动机

今年早些时候,我从 Technion 毕业,研究人机交互和可解释的人工智能。

在这篇博文中,我简要描述了我的研究论文,该论文是在 Avi Parush 副教授和 Ofra Amir副教授的指导下完成的。非常感谢他们在整个研究过程中给予的指导和支持。

除非另有说明,所有图片均为作者所有。

参考文献

Bansal,g .,Nushi,b .,Kamar,e .,Lasecki,W. S .,Weld,D. S .,& Horvitz,E. (2019)。超越准确性:心智模型在人-人工智能团队绩效中的作用。人类计算和众包 AAAI 会议记录,7(1),19。

班萨尔,g .,吴,t .,朱,j .,福克,r .,努什,b .,卡马尔,e,…韦尔德,D. S. (2020)。整体是否超过其部分?人工智能解释对互补团队绩效的影响。1(1), 1–26.

根特纳博士和史蒂文斯。).(2014).心智模型。心理学出版社。

Gunning,d .,Stefik,m .,Choi,j .,Miller,t .,Stumpf,s .,和 Yang,G. Z. (2019)。XAI-可解释的人工智能。科学机器人学,4(37),0–1。

Kaur,h .,Nori,h .,Jenkins,s .,Caruana,r .,Wallach,h .,和 Vaughan,J. W. (2020 年)。解读可解释性:理解数据科学家对机器学*可解释性工具的使用。1–14.

Lundberg,S. M .,& Lee,S. (2017 年)。解释模型预测的统一方法。(第 2 节),1–10。

奥尔森,M. L .,卡纳,r .,尼尔,l .,李,f .,,黄伟光(2021)。基于生成深度学*的强化学*主体的反事实状态解释。人工智能,295,103455。

Poursabzi-Sangdeh,f .,Goldstein,D. G .,Hofman,J. M .,Vaughan,J. W .,& Wallach,H. (2018 年)。操纵和测量模型的可解释性。

Ramakrishnan,r .,Kamar,e .,Nushi,b .,Dey,d .,Shah,j .,和 Horvitz,E. (2019)。克服现实世界中的盲点:利用互补能力进行联合执行。IAAI 2019 和第九届 AAAI 人工智能教育进步研讨会,EAAI 2019,6137-6145。

里贝罗,M. T .,辛格,s .,& Guestrin,C. (2016)。“我为什么要相信你?”解释任何分类器的预测。ACM SIGKDD 知识发现和数据挖掘国际会议论文集,13–17-Augu,1135–1144。

劳斯,W. B .,,莫里斯,N. M. (1985)。《透视黑箱:寻找心智模型的前景和局限》(DTIC AD-A159080)。佐治亚州亚特兰大:佐治亚理工学院。

b .怀尔德、e .霍维茨和 e .卡马尔(2020 年)。学*与人类互补。

交叉验证在机器学*中的重要性

原文:https://towardsdatascience.com/the-importance-of-cross-validation-in-machine-learning-35b728bbce33

解释为什么机器学*需要交叉验证,以及如何在 Python 中完成

安娜斯塔西娅·内伦在 Unsplash 上的照片

交叉验证方法用于测试经过训练的机器学*模型,并独立评估其性能。为此,底层数据集分为训练数据和测试数据。然而,该模型的准确性是专门根据测试数据集计算的,以评估该模型对尚未看到的数据的响应程度。

为什么需要交叉验证?

为了训练一个通用的机器学*模型,我们需要数据集,以便模型可以学*。目标是识别和学*数据中的某些结构。因此,不应忽略数据集的大小,因为太少的信息可能会导致错误的见解。

然后将训练好的模型用于实际应用。也就是说,他们应该用人工智能以前没有见过的数据做出新的预测。例如,一个随机森林被训练来根据测量数据将生产零件分类为损坏或未损坏。人工智能被训练有关于以前的产品的信息,这些产品也被唯一地分类为损坏或未损坏。然而,之后,经过全面训练的模型将决定生产中新的、未分类的零件是否完美无缺。

为了在训练中模拟这种场景,数据集的一部分故意不用于人工智能的实际训练,而是保留用于测试,以便能够评估模型如何对新数据做出反应。

什么是过度拟合?

有针对性地扣留不用于培训的数据还有另一个具体原因。目的是避免所谓的过度拟合。这意味着该模型对训练数据集的适应性太强,因此对这部分数据提供了良好的结果,但对新的、可能略有不同的数据却不是这样。

这是一个真实的虚构的例子:让我们假设我们想要训练一个模型,该模型应该能够提供完美的床垫形状。如果这个人工智能在训练数据集上训练了太长时间,它可能会结束对训练集特征的加权。这是因为反向传播仍然试图最小化损失函数的误差。

在该示例中,这可能导致这样的事实,即主要是侧卧者出现在训练集中,因此模型了解到床垫形状应该针对侧卧者进行优化。这可以通过不将数据集的一部分用于实际训练,即用于调整权重,而仅用于在每次训练运行后针对独立数据测试一次模型来防止。

交叉验证是做什么的?

一般来说,交叉验证(CV)是指在训练过程中使用新的、未知的数据来估计模型的准确性或质量的可能性。这意味着在学*过程中已经有可能评估人工智能在现实中的表现。

在这个过程中,数据集分为两部分,即训练数据和测试数据。在模型训练期间使用训练数据来学*和调整模型的权重。反过来,测试数据用于独立评估模型的准确性,并验证模型已经有多好。据此,开始新的训练步骤或者停止训练。

这些步骤可以总结如下:

  1. 将训练数据集拆分为训练数据和测试数据。
  2. 使用训练数据训练模型。
  3. 使用测试数据验证人工智能的性能。
  4. 重复步骤 1-3 或停止训练。

要将数据集分成两组,可以根据数据量选择不同的算法。最著名的是坚持和 k 倍交叉验证。

拒绝交叉验证是如何工作的?

保持法是获取训练数据和测试数据的最简单的方法。许多人不熟悉这个名字,但大多数人以前都用过。这种方法只保留 80%的数据集作为训练数据,20%的数据集作为测试数据。该分割可以根据数据集而变化。

训练测试拆分示例|来源:作者

虽然这是一个非常简单快速的方法,也是经常使用的方法,但它也有一些问题。首先,训练数据集和测试数据集中的元素分布可能会非常不同。例如,可能会发生这样的情况,船只在训练数据中比在测试数据中更常见。因此,经过训练的模型在探测船只方面非常出色,但会根据其探测房屋的能力进行评估。这将导致非常差的结果。

在 Scikit-Learn 中已经定义了函数,利用这些函数可以在 Python 中实现拒绝方法(例如 Scikit-Learn )。

# Import the Modules
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm# Load the Iris Dataset
X, y = datasets.load_iris(return_X_y=True)Get the Dataset shape
X.shape, y.shapeOut:
((150, 4), (150,))# Split into train and test set with split 60 % to 40 %
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.4, random_state=0)print(X_train.shape, y_train.shape)
print(X_test.shape, y_test.shape)Out:
((90, 4), (90,))
((60, 4), (60,))

保留交叉验证的另一个问题是,它应该只用于大型数据集。否则,可能没有足够的训练数据来找到统计上相关的相关性。

k 倍交叉验证是如何工作的?

k-Fold 交叉验证通过允许来自训练数据的数据集也出现在测试数据中来弥补这两个缺点,反之亦然。这意味着该方法也可以用于较小的数据集,并且它还防止了训练和测试数据之间的属性的不均匀分布。

数据集被分成 k 个大小相等的块。随机选择其中一个块作为测试数据集,其他块是训练数据。到这一点,和坚守法很像。然而,在第二训练步骤中,另一个块被定义为测试数据,并且重复该过程。

交叉验证示例|来源:作者

块的数量 k 可以任意选择,并且在大多数情况下,选择 5 到 10 之间的值。过大的值会导致模型偏差较小,但过度拟合的风险会增加。太小的 k 值会导致更有偏差的模型,因为它实际上对应于保留方法。

Scikit-Learn 还提供现成的函数来实现 k 倍交叉验证:

# Import Modules
import numpy as np
from sklearn.model_selection import KFold# Define the Data
X = ["a", "b", "c", "d"]Define a KFold with 2 splits
kf = KFold(n_splits=2)# Print the Folds
for train, test in kf.split(X):print("%s %s" % (train, test))Out: 
[2 3] [0 1]
[0 1] [2 3]

这是你应该带走的东西

  • 交叉验证用于测试经过训练的机器学*模型,并独立评估其性能。
  • 它可以用来测试人工智能对新的,看不见的数据的反应有多好。这个特性也叫做泛化。
  • 如果没有交叉验证,可能会发生所谓的过度拟合,即模型过度学*训练数据。
  • 最常用的交叉验证方法是保留法和 k 折叠法。

https://medium.com/@niklas_lang/membership

亲吻和测试的重要性(当混合编程语言时……以及一般情况下)

原文:https://towardsdatascience.com/the-importance-of-kiss-ing-and-testing-when-mixing-programming-languages-and-in-general-3c20ead71d9f

简单+经过测试的代码=问题更少

疾控中心在 Unsplash 拍摄的照片

对于那些懒得阅读整篇文章,只想看简短的“执行摘要”的人来说,这个故事的寓意是:

  • 保持简单愚蠢(吻)!我不能过分强调这一点的重要性。你的依赖越少,你需要担心的事情就越少!
  • 尽管有时不得不假设所有的包都像包装上描述的那样工作,但是如果可能的话,写一些测试来确认一下是没有坏处的!

混合编程语言

根据具体情况,混合编程语言有时是有益的。但是,如果可以用不同的语言分离组件,并将其容器化(例如用 docker ),那将会使生活变得容易得多。因为混合语言通常会带来额外的复杂性,这使得您的应用程序功能更难测试或调试。这不是不可能处理的,但在走这条路之前,你真的应该考虑一下是否值得。

如果你还不知道,那么肯定会有你最喜欢的语言的软件包,可以调用另一种语言并与之接口,如果你想使用另一种语言的一些现成功能,这实际上是非常方便的。一些例子是:

  • PyCall ,这是一个 julia 包,可以用来调用 python 函数
  • pyjulia ,反过来,用 python 调用 julia 函数

这些包旨在提供语言之间的无缝转换,大多数时候都是如此。但是由于每种语言都有自己不同的方式,并且随着语言的不断更新或修补,我们不能排除会有过渡语软件包不能按照我们期望的方式工作的情况。因此,即使一种语言(例如 python)中的函数按照我们期望的方式工作,当通过另一种语言(例如 julia)调用这个函数时,编写等价测试来检查它是否以同样的方式工作也没有坏处(除了多花一点时间)。

在 python 和 julia 中使用 LightGBM 的案例研究

这就把我们带到了我们的案例研究,关于如何使用 python 或 julia 调用光梯度增强机器(LightGBM) 。LightGBM 是微软做的机器学*框架,免费开源。有一个 python 包(由微软在 GitHub 上维护)和一个 julia 包(目前由 IQVIA-ML 在 GitHub 上维护)用于使用这个框架。在问之前,在 julia 或 python 中运行 LightGBM 在计算资源或时间方面应该没有任何明显的优势或劣势,因为这两个包都直接与 LightGBM 的 C API 交互。

所有参考代码都记录在两本 jupyter 笔记本中,可以在本 github 报告中找到。(边注:你知道吗,项目名称 Jupyter 的由来是对三种核心编程语言 Julia、Python 和 R 的引用?).

在理想情况下,通过 julia 或 python 调用 LightGBM 应该是等效的。因此,当我们使用 julia 调用 python(然后调用 LightGBM)时,如果我们假设一切都可以无缝转换,那么我们也应该期待等价性。但是如果这个没有经过测试,我们怎么知道呢?

调用 LightGBM C 库的不同方法(来源:作者)

所以,下面是我们如何测试它的(详细代码见 github repo ):

  • 为了测试中所有运行的一致性:
    -使用来自 LightGBM 包的相同的样本训练数据集
    -使用相同的参数输入(见下文):

参数输入(来源:作者)

  • 我们修复了库的版本:
    -Python(3 . 8 . 5)
    -light GBM v 3 . 1 . 0
    -Julia(1 . 5 . 3)
    -light GBM v 0 . 4 . 2
    -py call v 1 . 92 . 2
  • 我们测试:
    1。在 python
    2 中直接运行 python LightGBM 包。在 julia
    3 中直接运行 julia LightGBM 包。通过 PyCall 在 julia 中间接运行 python LightGBM 包
  • 对于每个测试,我们将 LightGBM booster 作为一个字符串写到一个文件的末尾,这样我们就可以使用类似于 meld 的工具来比较每个运行结果的细节(见下文)

不同测试生成的 LightGBM 模型字符串比较(来源:作者)

思想

当我们比较仅在 python 或 julia 中运行的 LightGBM 时,输出加速器看起来几乎相同,这正是我们所期望的。然而,有趣的是,当我们使用 julia 调用 python lightgbm 包来运行框架时,输出 booster 与前两次运行不同,包括每棵树的细节和特性重要性。

我说清楚!我并不是要批评 PyCall 或 LightGBM,因为总会有边缘情况(就像这个例子……我的意思是,有多少人会这样称呼 LightGBM?)那些都不一定考的好!

现在,我们可以尝试修复 julia 的 PyCall + LightGBM 组合运行中出现的问题,但这肯定会陷入兔子洞。人们可能会找到解决办法,但我们真的需要这个吗?也可能是我在设置这个 julia → PyCall → python-lightgbm 调用时出错了(希望不是!)!即便如此,调用多种语言/框架的这种额外的复杂性在我们想要了解发生了什么的时候并没有帮助。如果一个本地包可以工作,为什么不直接使用它呢?

这可能是一个幼稚的案例研究,但希望它说明了为什么我总是喜欢保持事情简单。当然,在开发时,可能会有我们无法避免混合语言的情况。在这种情况下,至少编写一些等价测试会安全得多,这样我们就知道它正在做我们期望它做的事情!

承认

非常感谢雅各布·阿尔万和迪内什·瓦特瓦尼富有洞察力的讨论和这篇文章的校对。

注意事项:

  • 文章最初发表于 2021 年 1 月blog.chilledgeek.com
  • 免责声明:本文表达的内容和观点完全是我自己的,不代表我现在或过去的雇主的观点或意见

理论在数据科学中的重要性

原文:https://towardsdatascience.com/the-importance-of-theory-in-data-science-3487b4e93953

四个例子说明了为什么数据科学家知道自己在做什么是至关重要的

数据科学是一个庞大的、定义不清的、不断变化的学科,在过去十年中已经变得非常民主化。只要对编程有一点基本的了解,并能访问 YouTube,任何人都可以在不了解算法工作原理的情况下盲目地实现算法(我已经多次成为这种情况的受害者,尽管我不愿意承认)。虽然有许多资源涵盖了数据科学概念的理论基础,但很少有人展示为什么拥有这些基础在实践中如此重要。本文给出了四个数据科学“陷阱”的例子,通过理解理论可以避免这些陷阱。

马。图片作者。

示例 1:单变量特征选择

问题是

特征选择的过程虽然很重要,但却常常令人疲惫和困惑。在回归设置中,最常见的第一步是分析目标和潜在特征之间的相关性。第一个例子将说明丢弃相关性小的特征的危险。

假设我们有以下数据集,具有三个潜在特征(x1、x2 和 x3)和一个连续目标(y):

数据集的前 5 行。图片作者。

由于计算的限制和利益相关者的要求,我们只想选择对预测至关重要的特征。也许直观的开始是查看相关矩阵:

数据集的相关矩阵。图片作者。

我们立即注意到 x1 与 y 有中等相关性,而 x2 和 x3 几乎没有相关性。错误的是,我们认为 x1 是唯一有用的特性,我们把它扔进了一个随机森林。该模型适合于训练集,并在测试集上进行评估:

# Create training and testing sets
x_train, x_test, y_train, y_test = train_test_split(data[['x1']], data['y'], test_size=0.20)# Fit a random forest using only x1 as input
model = RandomForestRegressor(n_estimators=500, max_depth=10)
model.fit(x_train.values.reshape(-1,1), y_train)# Evaluate predictions on the test set
preds = model.predict(x_test)fig, ax = create_fig()
ax.scatter(y_test, preds)
ax.set_xlabel('Actual')
ax.set_ylabel('Predicted')
ax.set_title('Actual vs Predicted Target using $X1$ as a Feature')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}')
print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')

仅使用 x1 作为功能的随机林性能。图片作者。

毫不奇怪,该模型在测试集上表现不佳——在看到数据集中的低相关性后,我们(错误地)预料到了这一点。只是为了开心,我们决定将 x2 和 x3 放入模型中,看看测试性能:

# Create training and testing sets
x_train, x_test, y_train, y_test = train_test_split(data[['x1','x2','x3']], data['y'], test_size=0.20)# Fit random forest using all features
model = RandomForestRegressor(n_estimators=500, max_depth=6)
model.fit(x_train, y_train)# Evaluate predictions on test set
preds = model.predict(x_test)fig, ax = create_fig()
ax.scatter(y_test, preds)
ax.set_xlabel('Actual')
ax.set_ylabel('Predicted')
ax.set_title('Actual vs Predicted Target using all Features')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}')
print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')

使用所有功能的随机森林性能。图片作者。

令人惊讶的是,通过添加两个与目标不相关的特征,我们观察到测试性能有了天文数字的提高(+0.63 R 平方,-5.18%平均绝对百分比误差)。这怎么可能呢?

解决方案

这是一个经典的例子,说明了为什么单变量特征重要性度量(如相关性)可能具有欺骗性。在该数据集中,输出与输入之间的关系如下:

y 与输入的关系。图片作者。

数据集是用 python 创建的,代码如下:

Create a fake dataset
n = 50000x1 = np.random.normal(size=n)
x2 = np.random.normal(size=n)
x3 = np.random.normal(size=n)y = x1*x2 + x3**2 + x1data = pd.DataFrame({'x1':x1, 'x2':x2, 'x3':x3, 'y':y})

因为皮尔逊相关只能测量线性关系的大小和方向,它无法拾取 x1 和 x2 之间的交互作用,或者与 x3 的二次关系。

对于这个玩具的例子,我们可能已经完全绕过了特性选择过程,因为只有三个特性可用。然而,人们可以想象这个原理如何应用于高维数据集。最终,特征选择过程需要考虑非线性相互作用,这些不能总是由单变量测量来考虑。

示例 2:基于树的模型的外推

问题是

在示例 1 中,读者可能已经注意到目标(y)和特征(x1、x2 和 x3)之间的关系是确定的。也就是说,对于给定的一组特征,我们可以精确地计算目标值的值。然而,即使将所有特征输入随机森林,结果也远非完美:

体面,但不完美的随机森林结果。图片作者。

我们知道随机森林能够处理非线性关系,那么为什么这个模型不能完美地预测目标呢?

解决方案

问题是测试集包含训练集域之外的特征。因此,测试集中的相应目标值在训练集的域之外。最好通过查看目标的摘要统计信息来了解这一点:

训练集的目标摘要统计信息。图片作者。

测试集的目标摘要统计信息。图片作者。

虽然这两种分布之间的差异很小(并且没有统计学意义),但它们足以欺骗随机森林。标准回归树的输出,以及随后的随机森林,是由目标的最大值和最小值限制的。这在许多应用中是可以的,因为我们通常不期望我们的模型外推至域外的例子。然而,在物理学和许多其他科学领域,外推往往是目标。

在实践中,对于这个问题有一些解决方案,但是对于这个例子,我们展示了一个线性模型如何能够给出完美的测试性能。让我们稍微欺骗一下,假设我们非常怀疑目标与示例 1 中给出的等式中的特征相关。我们向训练集和测试集添加了以下功能:

# Add quadratic and interaction features
x_train['x1x2'] = x_train['x1']*x_train['x2']
x_train['x3^2'] = x_train['x3']**2x_test['x1x2'] = x_test['x1']*x_test['x2']
x_test['x3^2'] = x_test['x3']**2

然后将这些新特性输入线性模型,并在测试集上评估结果:

# Fit linear model
model = LinearRegression()
model.fit(x_train, y_train)# Evaluate predictions on test set
preds = model.predict(x_test)fig, ax = create_fig()
ax.scatter(y_test, preds)
ax.set_xlabel('Actual')
ax.set_ylabel('Predicted')
ax.set_title('Actual vs Predicted Target using all Features')print(f'MAPE between actual and predicted: {mean_absolute_percentage_error(y_test, preds)}')
print(f'R-Squared between actual and predicted: {r2_score(y_test, preds)}')

完美推断非线性关系的线性模型。图片作者。

线性模型能够完美地外推,因为它只是将方程中的每一项乘以系数 1。当然,这个例子是不现实的,因为我们事先已经知道了基本方程。然而,即使我们没有这些信息,我们也可以使用像符号回归这样的算法获得同样的结果。

示例 3 —统计显著性与效应大小

问题是

我们为一家健身公司工作,该公司设计了两个肌肉锻炼计划,我们的老板问最新的计划是否能帮助我们的客户在两个月内增加肌肉量。很自然,我们会观察两个项目中增加的肌肉量的分布:

增加的肌肉质量分布(磅)。图片作者。

我们还查看了汇总统计数据:

旧程序肌肉质量增加(磅)。图片作者。

新计划肌肉质量增加(磅)。图片作者。

我们很兴奋,因为新计划比旧计划平均增加了 0.50 磅。因为我们是数据科学家,我们觉得必须检查统计意义。进行双样本 z 检验以检查旧组中增加的平均肌肉与新组中增加的平均肌肉之间的差异是否不同。这个测试的 p 值是 0.002,所以我们向老板展示了的统计显著性发现并庆祝。该公司决定推广这些结果,并对新程序收取更高的费用——许多客户转而购买。

在新计划实施两个多月后,该公司面临着巨大的反弹,因为客户抱怨他们没有获得旧计划中那么多的肌肉。我们的老板因为错误的发现责备我们。

解决方案

这里的问题触及了频率统计的核心——大样本量决定了统计意义。这在许多倾向于使用小样本的统计学入门课程中通常不会涉及。我们可以通过观察当样本量趋于无穷大时测试统计量的变化来从数学上理解这个问题:

当样本量达到 z 统计量的无穷大时,限制。图片作者。

随着样本量的增加,表达式的分母趋向于 0,z 统计趋向于无穷大。当然,随着检验统计量趋向于无穷大,p 值趋向于 0。这意味着,如果样本量足够大,分布之间即使最微小的差异也可能具有统计学意义。这就是我们需要效果尺寸的地方。

统计检验的效果大小试图衡量观察结果的真实强度,而不考虑样本大小。这并不意味着不考虑样本量,而是大样本量并不主导效应量的计算。均值差异测试的一个流行的效果大小度量是 Cohen 的 d:

科恩的 d .作者形象。

注意平方根中的分子和分母是如何随着样本量线性增长的。这使得我们可以通过相应的样本大小来衡量每个样本的标准偏差,而不会出现问题。科恩的 d 有普遍接受的阈值来确定影响大小有多大:

科恩的 d 效应大小阈值。图片作者。

我们可以为我们的测试计算 Cohen 的 d:

# Compute effect size
sd_pooled = np.sqrt(((n1-1)*old_program.std()**2 + (n2-1)*new_program.std()**2) / (n1 + n2 - 2))cohen_d = (new_program.mean() - old_program.mean()) / sd_pooled

科恩的 d 为平均肌肉质量增加之间的差异。图片作者。

这告诉我们,虽然我们观察到的差异在统计上是显著的,但真正的影响可能很小。如果我们在分享我们的结果之前知道效果的大小,我们可能不会对这个新项目做出如此强烈的声明。

我们还可以通过查看考虑整个分布的统计数据来改进我们的分析,而不仅仅是平均值和标准差。例如,像人口稳定指数或Kolmogorov–Smirnov 统计量这样的统计量对于比较任意分布之间的差异非常有用(即,我们不必假设正态性)。这些统计数据还带有普遍接受的效应大小阈值。

示例 4-基于树的特征重要性

问题是

在最后一个例子中,我们为一所大学工作,我们的任务是确定哪些学生可能毕业,哪些学生可能辍学。在这种情况下,我们关心特征的重要性,因为我们想知道哪些学生属性有助于毕业的可能性。我们首先读入数据集并做一些预处理:

# Read in academic success data
data = pd.read_csv('Dropout_Academic Success - Sheet1.csv')# Only include students that have graduated or dropped out
data = data[data['Target'] != 'Enrolled']# Convert target to a binary value
data['Target'].replace({'Graduate':1, 'Dropout':0}, inplace=True)

我们只会考虑已经毕业或者退学的学生。这个数据集有很多分类特征,所以我们决定建立一个 Catboost 分类器来预测一个学生是否会毕业。在此之前,我们需要确定分类特征:

cat_cols = ['Marital Status','Application mode','Course','Daytime/evening attendance', 'Previous qualification','Nationality',"Mother's qualification", "Father's qualification","Mother's occupation","Father's occupation",'Displaced', 'Educational special needs', 'Debtor','Tuition fees up to date','International']

接下来,创建添加了随机特性的训练集和测试集。随机特征是高斯分布的样本,用作比较其他特征预测性的基准。

# Create train/test split
x,y = data.drop('Target', axis=1), data['Target']# Add random variable to inputs to evaluate feature importance
x['rv'] = np.random.normal(size=len(x))x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20)

我们对训练数据拟合分类器,然后评估特征重要性:

# Evaluate feature importance
feature_importances = model.get_feature_importance()feat_imp_df = pd.DataFrame({'Feature':model.feature_names_, 'Importance':feature_importances})
feat_imp_df.sort_values("Importance", ascending=False, inplace=True)fig,ax = plt.subplots(figsize=(15,15))
sns.barplot(x=feat_imp_df['Importance'], y=feat_imp_df['Feature'])

预测值改变分级分类器的特征重要性。图片作者。

令人震惊的是,只有七个特征的重要性比随机特征高。我们得出结论,我们的大部分特征是噪声,并将其从模型中删除。**然而,这样做之后,模型的表现明显变差。**这怎么可能?

解决方案

我们在这里的陷阱是我们不明白【Catboost 是如何计算特性重要性的。【Catboost 的默认重要性类型是“预测值变化”,用于衡量输入要素发生变化时模型输出的变化程度。基于树的模型倾向于锁定高粒度特征(比如我们添加的连续随机特征);从这些导致最终模型对其敏感的噪声特征中学*伪分区。这就是我们在这个例子中观察到的情况。该模型已经从训练集的随机特征中学*了噪声,并且作为响应正在改变其预测。

一个简单的解决方案是在 Catboost 中使用“LossFunctionChange”重要性类型。这种重要性类型查看从模型中排除要素时损失函数的变化程度。至关重要的是,这需要对测试集进行评估,这有效地揭示了随机特征没有预测能力。我们可以用下面的代码来评估这个特性的重要性类型:

# Create catboost pool object
test_pool = Pool(x_test, y_test, cat_features=cat_features)# Evaluate feature importance
feature_importances = model.get_feature_importance(data=test_pool, type='LossFunctionChange')feat_imp_df = pd.DataFrame({'Feature':model.feature_names_, 'Importance':feature_importances})
feat_imp_df.sort_values("Importance", ascending=False, inplace=True)fig,ax = plt.subplots(figsize=(10,10))
sns.barplot(x=feat_imp_df['Importance'], y=feat_imp_df['Feature'])

损失函数改变分级分类器的特征重要性。图片作者。

新的特性重要性图表显示,在测试集上,只有一个特性的性能比 random 差。此外,我们看到随机特征导致模型在被包含时失去预测性(如预期的那样)。这个特征重要性图表与我们的直觉更加一致,并且证实了大多数特征是可预测的。

最后的想法

这四个例子虽然只是表面现象,但却描述了缺乏理解如何让数据科学家陷入困境。关键的一点是,数据科学家在使用某样东西之前,应该对它的工作原理有一个坚实的(不一定完美的)理解。同样重要的是知道在应用程序中使用哪些方法。感谢阅读!

喜欢我的文章?给我买杯咖啡:【https://www.buymeacoffee.com/HarrisonfhU】

数据团队之外的重要紫色人

原文:https://towardsdatascience.com/the-important-purple-people-outside-the-data-team-e97f4bfbc192

何时将公司内的人带入数据团队,以及在这样做之前需要考虑什么

dbt 的 Anna Filippova 写了关于我们如何需要更多“紫色”人才——能够驾驭商业环境和现代数据堆栈的通才。

我招过的一些最好的员工都是公司其他部门的紫色员工,他们想去做数据工作。他们可能在客户支持部门工作,并已成为团队中解决数据相关问题的关键人物。或者他们可能是一名客户经理,已经建立了销售团队中每个人都使用的出色的仪表板。

这些人带来了对业务的深刻理解和学*数据的动力的独特组合。您很幸运,在许多情况下,他们希望转移到数据团队。

他们自然会很好地调整自己,以解决推动业务投资回报的实际问题。他们了解自动化繁琐的客户健康评分流程的影响,因为他们知道手动完成这项工作有多痛苦。他们理解为什么一个为期 3 个月的项目来衡量营销活动对销售的影响是没有意义的,因为销售团队系统地不按时记录电话。

作者图片

您可能会发现自己与这些人中的一些人一起工作,并且可能已经努力将他们融入数据团队。

无论你在天平的哪个位置,我都建议你要慎重考虑如何与他们合作,为数据团队创造最佳成果,并给他们最好的职业发展机会。如果做得好,它们将作为数据团队的扩展,帮助解决重要问题和处理临时请求。

与数据团队以外的人一起创造成功的实用技巧

从描绘出这些人是谁开始。如果你是管理人员,你可以问你的团队,他们会知道的。

我发现这些步骤很有效

  • 找出数据团队之外从事类似数据工作的每个人,并让您的团队选择最有影响力和最渴望学*的人
  • 邀请一些人成为数据团队惯例的一部分。给他们一个数据团队的导师,邀请他们参加你的异地会议和每周团队会议。这能让你更好地了解他们是如何工作的,并给他们一个学*的机会
  • 如果双方都很合适,而且他们的经理也同意,你可以考虑让他们加入数据团队。如果你这样做了,我建议做一个 3 个月的试用期,在此期间设定明确的期望

如果你发现这很有效,考虑把它变成一个任何人都可以申请的更正式的数据轮换计划。

从数据团队外部引入人员时的常见陷阱

不幸的是,当人们加入数据团队时,这并不总是有效的。我已经看到了一些常见的陷阱,您应该尽早警惕

  • 他们很难放下旧角色的工作,并不断陷入 DMs 或以前的利益相关者的运营工作中
  • 他们努力改变自己的思维模式,不花时间去学*第一次做正确的事情,最后抄*路
  • 他们在数据团队中没有得到适当级别的支持,也没有被很好地接纳

一定要尽你所能确保他们有最好的成功条件,并利用 3 个月的试用期尽早向他们提出反馈,这样他们就有机会改进。

当您在数据团队之外拥有整个类似数据的团队时会发生什么?

让人们加入数据团队是一个双赢的局面。如果做得好,你将获得很大的价值,并帮助渴望和雄心勃勃的人转向数据。

当您开始看到核心数据团队之外的整个团队在做类似数据的工作时,情况就更复杂了。这些人通常从事业务关键工作,例如制作预测模型以确定哪些支持代理应该在何时工作,或者构建数据模型以确定客户的信用评分。

如果做错了,这些团队会带来数据可靠性恶化的风险,并会降低整个公司决策的质量。

作者图片

数据的可靠性取决于链条中最薄弱的一环。

你可以把它想成一个等式:

数据可靠性= lowest(upstream data quality, data model quality, dashboard quality, …)

在上面的例子中,您可能会遇到这样的情况

  • CRM(销售团队)中严格的电话记录= high
  • 测试覆盖率高的 dbt 模型(数据团队)= high
  • 有逻辑错误的零碎 LookML 代码(销售运营)= low

不管上游和数据建模层的质量如何,用于决策的数据都是低质量的,因为质量取决于最薄弱的环节。

就像你不能在上游生产者的不可靠数据上建立可靠的数据一样,如果下游团队没有按照你期望的标准做出决策,你也不能自信地依靠数据驱动的决策。

“类似数据的团队经常致力于解决高度重要的业务问题,但数据团队往往不了解或不参与他们的工作。有时,高级利益相关者绕过数据团队以加快移动速度,但最终却造成了长期的数据债务”

值得一提的是,数据工作绝不应该是数据团队成员的专利。事实上,从事数据工作的人越多,你的数据文化就越强。然而,你需要清楚你期望的高质量在哪里。这可能意味着您创建一个规则,对于最关键的数据用例,数据团队至少需要得到通知。

如何发现做类似数据工作的团队

以下是您应该留意的一些迹象,以发现您可能希望让哪些团队更接*数据团队。

一群销售运营分析师用零碎的 LookML 代码制作仪表板,供数百人使用,而数据团队对此一无所知。

一个运营团队维护着一个预测模型,该模型决定了 Pandas 内置的工人轮班开始和结束的时间,每天早上在本地机器上手动运行。

一个商业战略团队决定使用 Google Data Studio 作为投资者的仪表板,因为有人在以前的工作中使用过它,尽管数据团队的政策是使用 Looker。

一个信用分析师团队已经开始为数据模型开发他们自己的 dbt 项目,这些数据模型用于决定允许哪些客户借钱。

不知不觉中,业务关键决策将由使用仪表板和数据模型的人做出,而数据团队对此一无所知。

你需要为团队和个人何时应该加入核心数据团队以及何时应该保持独立建立一个系统。

作者图片

**高重叠:**你冒着以混乱结束的风险,最终将回到数据团队来解决。您应该考虑让他们成为核心数据团队的一部分,对他们抱有与其他任何人一样的期望和态度。

**有些重叠:**数据和决策的质量在很大程度上取决于他们,但他们的工作与数据团队的工作大相径庭。邀请他们参加一些数据仪式,并让他们与数据团队的导师配对。

**很少重叠:**他们在构建自己的仪表板,这很好,但你不应该在这方面投入太多时间,因为你有分散精力的风险。取而代之的是,提供办公时间和每月一次的最佳实践培训。

结论

数据团队中一些最优秀的雇员可能已经在你公司的其他地方工作过了。

  • 构建将数据团队之外的人带进来的方式。逐步让他们成为数据团队的一部分,有一个目标明确的试用期
  • 数据可靠性取决于链条中最薄弱的环节。即使有很好的数据源和很好的数据建模,如果分析师做出草率的指示板,你最终会根据错误的数据做出决策
  • 对于如何与数据团队之外的类似数据的团队打交道,要有一个策略。如果他们的工作与您在数据团队中的工作非常相似,您应该考虑让他们成为核心团队的一部分

如果你在如何最好地从数据团队之外引入数据类人员并创建可靠的数据链方面有经验,我很想听听你的意见

浓缩咖啡的不精确过滤篮

原文:https://towardsdatascience.com/the-imprecision-filter-basket-for-espresso-963d572baba2

咖啡数据科学

专注于如何制作优质的浓缩咖啡

在我以前的摩卡壶研究中,我发现大孔对煮浓缩咖啡很有效,咖啡不会从篮子里流出来。所以我想修改一个篮子,目标是不精确。大多数浓缩咖啡社区已经转向精密篮子。最初对精密篮筐的研究是针对特定的射击时间,而不一定是提取产量。

我之前的工作是根据篮子的开口面积来观察过滤篮子。我的理论是,一个更大的空位比精准更重要。

为了进一步测试这个理论,我修改了一个旧的过滤篮(来自 Kim Express)。我还不想用新的篮子,以防这个实验是一场灾难。

我把同一根针穿过所有的洞,然后测量前后的洞。

扩大孔后,我刮下顶部,因为有金属被推上来。

我想象了之前和之后。

左:原来的金双篮,右:增加了洞

然后我做了一些漏洞分析。在空间上,它们有相似的随机性。

左:改装前,右:改装后。每个色标都是独立的。蓝色较小,黄色较大。

我把这些和其他的做了比较。原来的金篮子金 D 最大或金最大。我称它为 Kim D,因为它是原始的双篮。然后我做了一轮,其中孔的开口度只有 4%,所以我再做一次,以获得最大的孔尺寸(因此金最大)。

金最大过滤器的孔面积几乎是 VST 的两倍,平均孔尺寸不仅更大,而且分布更广。

然后我开了一枪。

设备/技术

浓缩咖啡机 : 像样的浓缩咖啡机

咖啡研磨机 : 小生零

咖啡:家庭烘焙咖啡,中杯(第一口+ 1 分钟)

镜头准备:断奏夯实

预灌注:长,约 25 秒

过滤篮 : 20g VST 和不精密篮。

其他设备: Atago TDS 计、 Acaia Pyxis 秤

绩效指标

我使用了两组指标来评估技术之间的差异:最终得分和咖啡萃取。

最终得分 是评分卡上 7 个指标(辛辣、浓郁、糖浆、甜味、酸味、苦味和余味)的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。

使用折射仪测量总溶解固体量(TDS),该数字结合咖啡的输出重量和输入重量,用于确定提取到杯中的咖啡的百分比,称为提取率(EY)** 。**

【IR】强度半径定义为 TDS vs EY 控制图上原点的半径,所以 IR = sqrt( TDS + EY)。这一指标有助于标准化产量或酿造比的击球性能。

可行性数据

先来两对镜头。我在做冷却提取研究的时候拉了这些,所以我有带和不带。在口味方面,金 D Max 表现明显更好。就 TDS 和 EY 而言,这是一个组合。

********

我在 6 组 6 次烘烤中获得了更多的数据。金有口味优势。

从个人得分来看,Kim D Max 的表现更好。TDS/EY/IR 方面,略低。

********

咖啡迁徙?

一个问题是,这个篮子可能会导致咖啡从篮子里出来,进入杯子,因为假设孔需要很小才能进行精细研磨。所以我用废咖啡重新混合了一下。

倒入杯中的咖啡渣样品不可测量(> 0.01 克)。

这些数据让我回过头来质疑过滤篮的基本功能,我认为过滤篮的设计应该重新评估,特别是对于模型浓缩咖啡的轮廓。我怀疑作为这些测试的结果,Wafo 篮子会比其他篮子表现得更好。

如果你愿意,可以在推特、 YouTube 和 Instagram 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以关注我在中和订阅。

我的进一步阅读:

我的书

我的链接

浓缩咖啡系列文章

工作和学校故事集

ML 模型的归纳偏差,以及为什么你应该关心它

原文:https://towardsdatascience.com/the-inductive-bias-of-ml-models-and-why-you-should-care-about-it-979fe02a1a56

什么是归纳偏差,它如何损害或帮助你的模型

归纳推理

想象一下,这是你第一次去瑞士,你在山里徒步旅行,遇到一头有斑点的牛和一个牛铃。

罗斯·索科洛夫斯基在 Unsplash 上的照片。

你可能会认为瑞士所有的斑啼鸟都有一个牛铃。这是归纳推理的典型例子。它从一个观察开始(一只有斑点的牛和一个牛铃),并导致一个可能的概括假设(所有有斑点的牛都有一个牛铃)。

请注意,基于相同的观察,有可能得出(归纳出)其他假设。例如,瑞士有牛,所有的牛不管有没有斑点都有牛铃,瑞士只有牛,等等。正如你所看到的,基于一个观察可以做出一打假设——这是归纳推理的一个重要特性:有效的观察可能导致不同的假设,其中一些可能是错误的。

单个观察可能会归纳出一组可以解释它的无限假设(图片由作者提供)。

那么一个人如何选择一个单一的假设呢?要做到这一点,你可以选择一个最简单的假设,即“瑞士有奶牛”。它可以被视为简单,因为它对斑点或牛铃没有额外的约束,它只是一个简单的概括。这种方法被称为“奥卡姆剃刀”,可以被视为最简单的归纳偏差之一——选择描述观察结果的最简单假设。

奥卡姆剃刀原理来源于哲学观点,但也有一个等价的数学陈述,例如solomonff 的归纳推理理论。

那么它和机器学*有什么关系呢?

在大多数机器学*任务中,我们处理一些观察值(样本)的子集,我们的目标是基于它们创建一个泛化。我们还希望我们的推广对新的未知数据有效。换句话说,我们希望根据有限的样本子集,得出适用于整个样本群体的一般规则。

所以我们有一些观察结果和一组假设,可以根据观察结果归纳出来。观察集是我们的数据,假设集是 ML 算法,所有可能的参数都可以从这些数据中学*到。每个模型都可以描述训练数据,但在新的未见过的数据上提供明显不同的结果。

可以基于固定的训练数据来训练不同的模型。对于新的看不见的数据,所有这些模型将表现不同。

有限的样本集有无限的假设集。例如,考虑一些单变量函数的两个点的观察值。有可能拟合一个线性模型和无限数量的周期或多项式函数来完美地拟合观察结果。给定数据,所有这些函数都是有效的假设,完全符合观察结果,在没有额外假设的情况下,选择一个而不是另一个就像是随机猜测。

用两个 2d 点完美描述数据的不同模型(图片由作者提供)。

现在让我们从新的看不见的数据样本 X2 来推断我们的假设,结果证明大多数复杂的函数都是不准确的。然而,线性函数看起来相当精确,从偏差-方差权衡的角度来看,你可能已经很熟悉了。

完美描述训练数据的模型对于新的看不见的数据有显著的不同(图片由作者提供)。

一些假设的优先级(假设空间的限制)是一种归纳偏差。所以这个模型偏向于一些假设。对于前面的示例,用户可以基于一些关于数据的先验知识选择线性模型,从而优先考虑线性概化。

一个人为什么要在乎?

从前面的例子可以看出,选择正确的模型归纳偏差会导致更好的泛化,尤其是在低数据设置中。我们的训练数据越少,归纳偏差就应该越强,以帮助模型更好地概括。但是,在一个丰富的数据设置中,可能更好的是避免任何归纳偏差,以使模型受到较少的约束,并在假设空间中自由搜索。

在低数据设置中,正确归纳偏差可能有助于找到好的最优值,但在丰富的数据设置中,它可能会导致不利于泛化的约束(图片由作者提供)。

给定手头的任务,我们如何选择模型?通常,答案是这样的:用 CNN 看图像,用 RNN 看序列数据,等等。同时,可以将 RNN 用于图像,将 CNN 用于顺序数据等。首选的原因是适合数据的模型的归纳偏差。选择一个有正确偏向的模型会增加用更少的数据找到更好的概括的机会,这总是可取的。人们可能很容易认为存在某种最优偏差,这种偏差总是有助于模型很好地推广,但根据“无自由发射”定理,不可能找到这样的偏差。这就是为什么,对于每一个特定的问题,我们应该使用特定的算法和偏见。

ML 模型的归纳偏差示例

在下一节中,我们将考虑不同算法的一些基本的和众所周知的归纳偏差,以及一些不太为人知的例子。

回归模型

可能最直接的例子是回归模型的归纳偏差,它找到了一个特定方程的解。这种偏差将假设空间限制在单个方程族,并且仅优化它们的系数。这种方法在低数据设置中工作良好,尤其是当人们具有关于数据中函数关系的先验知识时,例如,当处理来自物理实验的数据或拟合特定概率分布时。

被约束为特定方程形式的模型 f(x)=klog(mx)(左)或 f(x)=1-exp(-(x/k)^b(右)。(图片由作者提供)。

额外的归纳偏差可以用正则化来注入,例如 L1 或 L2 正则化。它们还减少了假设空间,增加了对模型权重的约束。正则化的正确选择应该反映数据的先验知识。

决策树

在决策树中,一个主要的归纳偏差是假设一个目标可以通过问一系列二元问题来实现。结果,树分类器的判定边界变成正交的。

三类分类问题的决策边界(图片由作者提供)。

当使用随机森林和旋转树时,有可能减少归纳偏差,这可能导致更平滑、更灵活的决策边界。

贝叶斯模型

在贝叶斯模型中,可以在具有先验分布的模型中包含先验知识或假设。这和注入特定的感应偏压是一样的。考虑硬币正面朝上落地的概率估计:设r是正面朝上落地的概率,Yn是在n试验中正面朝上的数量。

硬币示例的贝叶斯规则。

有可能使用二项式分布估计后着陆平视概率 p(r|Yn ),使用 Betta 分布估计前 p(r)。

从二项式似然和 Betta 先验导出的后验密度。

考虑具有不同 Betta 先验的例子,其中硬币正面落地的地面真实概率是 0.7。如果先验分布与真实值相差甚远,就需要更多的样本来接*真实值的估计。

左图:初始先验密度最大似然 r=0.3。右图:初始先验密度最大似然 r=0.6。地面真相平视着陆概率 0.7(图片由作者提供)。

卷积神经网络

CNN 具有特定于架构的偏差和主要取决于数据和训练过程的偏差。大多数一般的 CNN 归纳偏差是局部性和权重共享。局部性意味着紧密放置的像素彼此相关。重量共享意味着寻找特定的模式。图像的不同部分应该以相同的方式处理。两个更多的归纳偏差通常被实现到 CNN 中:具有池层的平移不变性和不使用它们的平移等变。

CNN 不太明显的归纳偏差现在已经被很好地研究过了,并且有相当有趣的历史。在[ 1 中,作者在一次性学*设置中对具有形状匹配和颜色匹配的图像三元组进行了实验,并找出了 CNN 模型的形状偏差,这意味着它们更依赖于对象形状而不是对象颜色。一年后,其他研究人员认为 CNN 在设计上没有形状偏见,CNN 可以通过适当的初始化和数据扩充来训练形状分类。然后另一项研究[ 3 ]显示,ImageNet 训练的模型是有纹理偏见的。

CNN 的纹理偏见,[ 来源。

作者认为这种类型的偏差是由数据集而不是模型架构引起的,并表明他们可以在取代原始图像纹理的风格化数据集上进行训练时实现基于形状的表示。

在[ 4 中,作者得出结论,在 CNN 的模型中实现纹理偏差或形状偏差是可能的。偏差主要是由数据及其扩充过程定义的,而不是模型结构本身。他们表明,数据增加,如颜色失真或模糊,会减少纹理偏差,而随机裁剪会增加纹理偏差。最后,研究人员[ 5 ]表明,纹理和形状偏差是互补的,模型可以无偏地训练,平等地依赖于纹理和形状。为了实现这一点,该模型在具有冲突的形状和纹理图像(纹理来自一个类,形状来自另一个类)的数据集上进行训练。

纹理-形状冲突的图像,来源。

这种方法提高了识别模型的准确性和模型的鲁棒性。

CNN 的这些例子揭示了归纳偏差的重要性。根据训练程序和数据,可以偏向纹理或偏向形状来训练模型。在测试集上,这两种情况在准确性方面可能是相等的,但是基于形状的模型将对噪声破坏和图像失真更加鲁棒。

递归神经网络

递归神经网络有几个架构偏差:

  1. 顺序偏差—输入令牌按顺序逐一处理(可通过双向 rnn 减少)。
  2. 内存瓶颈——在将第一个令牌处理为隐藏状态之前,模型无法访问过去的令牌。
  3. 递归-模型在每一步对所有输入数据应用相同的函数。

平面 RNN 还具有局部性偏差,这种偏差在具有较长序列记忆机制的循环体系结构中会减少,例如 LSTM 或格鲁

在 NLP 领域,研究表明,对于某些任务,RNN 诱导偏差可能是有益的。例如,在[ 8 中,作者表明 LSTM 在主谓一致任务中优于平面变形金刚。它还表明,变压器性能可以通过 RNN 电感偏置注入来获得,例如顺序偏置(通过未来令牌屏蔽)和循环偏置(通过跨层共享参数)。

具有特定偏差的变压器架构[s 来源。

其他研究表明,基于 LSTM 的模型偏向于等级归纳。

揭示学*者等级或线性偏见的任务示例[ 来源 ]。

这种等级偏向被认为对 NLP 任务是有用的。

变形金刚(电影名)

变压器没有强烈的归纳偏差,因此它们更灵活,也更需要数据。缺乏强偏差不会给模型带来额外的约束。因此,如果提供足够的数据,它可以找到更好的优化。缺点是这种模型在低数据设置下表现较差。即使对变压器来说,注入一些偏压也是有利可图的。例如,在计算机视觉[ 7 中,作者提出使用“软”卷积归纳偏差,以便他们的模型可以在必要时学会忽略它。模型可以受益于低数据设置中的卷积归纳偏差,并且如果它设置了太多的约束,能够忽略它。

软感应偏置可以帮助控制模型约束[ 源 ]。

这种偏差是通过门控位置自我注意层实现的,该层可以用学*参数α来控制卷积归纳偏差。这样的模型优于 DeiT 并且看起来样本效率更高。作者还表明,最早的层倾向于使用卷积归纳偏差(α非零),而最新的层倾向于完全忽略偏差(α接*于零)。

在[ 6 中,作者表明视觉变压器模型,如 ViT 或 Swin 和 MLP 混合器模型比 CNN 模型有更多的形状偏差。

图形神经网络

gnn 有很强的关系偏向。由于图形结构,该模型强烈依赖于对象之间的结构关系。对于可以表示为对象和关系的离散数据建模,这是一个有用的偏好,例如文档数据库、分子中的原子或双摆等。

gnn 还具有置换不变性偏差,这对于具有任意排序的数据也是一种期望的属性。在图形卷积网络中也有权重共享(如在 CNN 中),因此图形的不同部分以相同的方式处理。

结论

归纳偏差可以被视为关于模型和数据属性的初始信念。正确的初始信念导致用更少的数据更好地概括。错误的信念可能会过多地限制模型,并最终阻止一个人找到一个好的最优方案,即使有大量的数据。经验法则是,如果期望偏差明确,则选择具有强归纳偏差的模型,如果期望偏差不明确,则选择具有更多数据的更灵活的模型。

从模型初始化和数据扩充到优化器甚至调度器,训练管道的每个组件都有自己的偏差,这些偏差会影响最终的优化。此外,深度神经网络模型也有隐藏和未知的偏差,这是一个相关的研究领域。从业者还应该意识到潜在的偏见,在数据损坏或域转移的情况下,这些偏见可能会导致意外的模型行为。

链接

  1. 深度神经网络的认知心理学:形状偏差案例研究 Samuel Ritter,David G.T. Barrett,Adam 桑托罗,Matt M. Botvinick 2017。
  2. [评估卷积神经网络的形状偏差特性 Hossein Hosseini,Baicen Xiao,Mayoore Jaiswal,Radha Poovendran 2018](http://Assessing Shape Bias Property of Convolutional Neural Networks Hossein Hosseini Baicen Xiao Mayoore Jaiswal Radha Poovendran)
  3. IMAGENET 训练的 CNN 偏向于纹理;增加形状偏差可提高准确性和鲁棒性罗伯特·盖尔霍斯,帕特里夏·卢比什,克劳迪奥·米歇尔斯·马蒂亚斯·贝希,费利克斯·a·威奇曼,维兰德·布伦德 2019
  4. 卷积神经网络中纹理偏差的起源和流行凯瑟琳·l·赫尔曼,陈婷·西蒙,科恩布利思 2020 年
  5. 形状-纹理去偏神经网络训练,,于,谭明星,解如梅,,,谢慈航,2021
  6. 探索腐败鲁棒性:视觉变压器和 MLP 混频器中的感应偏差 Katelyn Morrison,Benjamin Gilby,Colton Lipchak Adam Mattioli,Adriana Kovashka 2021
  7. ConViT:利用软卷积电感偏置改进视觉变压器夏羽·德阿斯科利斯、雨果·图夫龙、马修·l·莱维特、阿里·s·莫科斯、朱利奥·比罗利、莱文特·萨贡 2021
  8. 通过知识提炼转移归纳偏见周欣宇·阿布纳,穆斯塔法·德赫加尼,威廉·祖伊德马 2020
  9. 当有疑问时他们做什么:SEQ2SEQ 学*者的归纳偏差研究 Eugene Kharitonov,Rahma Chaabouni 2021

数据科学行业的不平等

原文:https://towardsdatascience.com/the-inequality-in-the-data-science-industry-937992032851

意见

在过去十年中,数据科学作为一门学科在公众意识中受到了越来越多的关注。无论是正在考虑有利可图的职业道路的本科生,还是正在寻找高效工具来通知或自动化重要决策的公司和组织的领导者。虽然专注于数据科学可能会建立一个人的技术职业生涯或优化公司的服务,但作为一门学科,我们在很大程度上未能认识到数据科学在实践中发挥的作用:当有人实践数据科学时,他们要么是在挑战要么是在强化现有的权力结构。

fauxels 拍摄的照片:https://www . PEX els . com/photo/group-of-person-sitting-in-户内-3184306/

这在构成我们社会的个人和集体层面上都发生了变化:在集体层面上,组织有义务让代表各种背景和生活经历的全面发展的数据科学家加入他们的数据科学团队(目前这不是一项容易的任务)。在个人层面上,每个数据科学家都有责任了解他们在人为权力系统中的位置,这样他们就不会在实践中无意中扮演压迫者的角色。

像任何工具一样,数据科学本身没有好坏之分。它可以用来改善数百万人的健康,也可以强化种族主义,扩大不平等。数据科学的许多有害应用发生在工业环境中:*工业数据科学,学术数据科学相对。*工业数据科学最终是为利润服务的数据科学,而学术数据科学是为知识服务的数据科学。目前的情况是,工业数据科学在建设和维护我们的社会方面的影响力远远超过其知识驱动的同行,因为实践数据科学对组织来说成本高昂,并且只有在有足够资源的情况下才能实现。

今天,工业数据科学通过处理大量数据来创建自动化决策模式,称为*模型。*这些模型最终提供了自动化决策能力,为企业节省了时间和金钱。从表面上看,这本身并不是一件坏事,它被证明是一种构建有用的定制产品体验或优化组织内部工作的强大方法。我们有工业数据科学来感谢高效的食品配送应用程序、搜索引擎和各种自动推荐,等等。

数据内的表示

数据科学的从业者经常说,生成模型是预测未来的一种方式。这是对模型工作的一种常见而危险的误解。一个模型将过去投射到未来,而不是预测未来。随着每一个自动化的决策,过去的世界规则在数据处理的瞬间重现,进而塑造未来。结果产生的信息将通知明天的新模式。通过这种方式,我们构建了一个工业驱动的数据处理循环,这种循环反复地、盲目地作用于自身。这意味着我们用来构建模型的数据在这个重复的循环中被后续模型的构建所塑造。

明智地选择数据集是数据科学家在训练新模型时可以做出的最重要的决定之一。通常目标是生成具有高预测准确性的模型。为了创建准确的模型,数据科学家需要找到与他们打算训练的模型的需求最相关的数据。

这里有一个例子:一家金融机构的数据科学家的任务是训练一个模型来预测客户的信用评分。他们的下一步是梳理现有客户的可用数据集,并在所有这些数据中确定哪些信息可能有助于训练一个模型,以最准确的方式预测信用评分。

如果用于训练新模型的数据包括性别或与性别相关的特征作为其变量之一,则新的信用评分模型将可能检测到一种模式,即女性平均比男性挣得少,并且信用评分较低,因为这反映在现实世界的客户数据中。作为一个意想不到的有害结果,如果所有其他因素都相同,新模型将预测女性的收入低于男性。

鉴于性别薪酬差距的现实,这可能会提高模型信用评分预测的准确性,但模型本身无法认识到这是不公平的。这就是数据科学家在选择未来不会产生不公正偏见的数据和模型时的过失所在。查看他们的信用评分模型的输出就是查看过去的现状,因此,如果金融机构随后依赖该模型来生成客户的信用评分,就会存在危险:这将导致性别歧视的预测,从而对人们的现实生活产生影响。这将产生新的真实世界数据,这些数据是由信用评分模型中的偏见形成的。所有来自过去的数据都是基于我们现在拥有的不完美的现实图景,当它被疏忽地用来塑造未来时,这个循环还在继续。

凯茜·奥尼尔的《数学毁灭的武器》一书中有一些真实的例子。她指出了导致带有编码种族主义或其他偏见的模型的短视决策的例子。这些例子包括预测教师质量风险、信誉和累犯的模型。

例如,奥尼尔描述了如何训练累犯风险模型来预测被定罪的罪犯在未来再次犯罪的可能性。如果一个人失业,以前与警察有过冲突,或者来自一个警察过度的社区,这个模型会得到更高的风险。虽然这些趋势在现实世界的数据中显而易见,但该模型没有内置复杂的背景-在这种情况下,警察遭遇往往是由于不成比例地针对黑人和拉丁裔美国人的种族主义警务实践而发生的。由于数据中反映的系统性种族主义,该模型建议有色人种在监狱中获得不应有的更长刑期。

从事该项目的数据科学家对刑事司法系统中的种族偏见如何反映在他们用来训练累犯模型的数据中没有足够的认识。

这说明了只掌握工作机制而不了解工作背景的数据科学家如何没有足够的信息来有效地完成工作。

在工业数据科学领域,数据科学家通常只不过是一个知道如何使用数据开发模型的可互换的人,而不是在给定数据的主题方面具有特定背景的人。这就是数据科学作为一门学科对其自身影响如此盲目的原因。其结果是,数据科学家及其雇主往往无法考虑他们在权力体系中的背景,这最终导致系统性不平等永久化。

当研究人员 Joy Buolamwini 和 Timnit Gebru 发现微软、IBBM 和 Face++等大型科技公司使用的商业性别分类模型存在准确性差异,并就他们的发现发表了一篇论文时,这一问题首次被提出。他们的工作表明,美国科技公司为其模型使用的数据集中的图像超过 77%是男性,超过 83%是白人。结果,当身为黑人女性的 Buolamwini 试图上传自己的照片时,那些商业面部识别程序错误地分类了她的性别,或者根本没有将她的照片识别为人脸。数据缺乏多样性导致了一个无效的模型。

工作场所内的代表权

如果数据科学家使用反映系统性偏差或缺乏足够多样性水平的数据集,那么产生的模型也会如此。房间里有一个了解数据本身的人可以大大降低数据被无效或不公正使用的可能性。当团队由来自一个同质群体的人组成时,视角受到他们的生活经验和接触其他观点的范围的限制。如果生活经验没有足够的多样性,同质群体很容易不经意地做出排除其他身份和观点的决定。

在工业数据科学的世界中,越来越多的声音呼吁解决这个问题。例如,前述性别分类研究的另一位作者 Gebru 博士与 Joy Buolamwini 合作,后来成为谷歌道德人工智能团队的联合领导者。在那里,她公开批评了在谷歌做出最终人工智能相关决策的大多数人是男性。她后来被该公司解雇,因为她批评了该公司雇用少数族裔的方式以及当今人工智能系统中固有的偏见。“他们不仅没有优先雇用更多来自少数族裔社区的人,还压制了他们的声音,”她说。

对于一个组织来说,实践数据科学是一种特权,因为它需要大量昂贵的物理和计算资源。无论是夫妻店,还是在车库里创办新企业的创意企业家,或是一些苦苦挣扎的非营利组织,都无法利用数据科学。获取、维护、存储和访问用于训练模型的足够数据会产生巨大的成本,并且在实践中应用该模型还需要更多的计算资源成本。唯一能够实践工业数据科学的组织是富有的——要么是足够大的公司企业,要么是强大的政府,要么是特别富有的学术机构。

结果是权力失衡,有利于拥有数据并决定如何使用数据的少数人。工业数据科学的实践着眼于优化而不是理解。很多时候,数据科学被用作系统内自动化决策的手段,而不是更深入地理解这些决策及其背景的手段。这是危险的,因为它会导致短视的决策,无法检查其在世界上的影响,除了是否实现了即时(通常是)利润驱动的目标。它最终强调了那些构建数据科学驱动系统的人的特殊需求和世界观。

造成这种不公平数据集的偏见也塑造了世界上能够首先实践数据科学的个人的价值观。由于各种可能的原因,从种族、性别到阶级等等,这些系统性偏见没有充分地过滤掉人们。根据美国平等就业机会委员会(EEOC)的数据,科技行业约 80%的高管、高级官员和经理是男性,约 83%是白人。至于行业中的数据科学家,根据 Zippia 的数据科学人口分析,所有工人中有 65.2%是男性,当涉及到种族统计时,据报道,所有数据科学家中有 66.1%是白人。

我们能做什么?

D'Ignazio 和 Lauren F. Klein 合著的《数据去中心主义》( Data Deminism)一书为试图了解女权主义如何帮助他们实现正义的数据科学家,以及试图了解他们的工作如何应用于不断发展的数据科学领域的女权主义者提供了具体的行动步骤。数据女权主义是一种思考数据的方式,包括数据的用途和限制,它是由直接经验、对行动的承诺和交叉女权主义思想提供信息的。《数据女权主义》一书的作者*,*讨论了数据科学工作通常是一项孤独事业的问题本质。提出让一个人代表所有人做决定而不代表交叉声音的概念可能会在工作中引入很多偏见,并可能伤害没有代表的声音。数据女权主义的原则之一是接受多元化,这意味着在数据科学过程的所有阶段重视和包括与数据集有联系的声音。

承认两个重要问题很重要。当涉及到与人类相关的应用时,数据科学不仅仅是一个定量领域。从上述数据科学应用的例子来看,很明显,负责设计这些系统的数据科学家缺乏在系统发布后检测其危害和偏见的能力。

工作场所中的表示导致数据中的表示。这两个概念是相互关联的。相反,数据中的表示最终有助于建立一个更加平等的招聘群体。

参考文献

1 Buolamwini、Joy 和 Timnit Gebru。"性别差异:商业性别分类的交叉准确性差异."https://dam-prod . media . MIT . edu/x/2018/02/06/Gender % 20 shades % 20 intersect % 20 accuracy % 20 disparities . pdf .

2“美国的数据科学家人口统计学和统计学”Zippia——寻找工作、薪水、公司、简历帮助、职业道路等,【https://www.zippia.com/data-scientist-jobs/demographics/.】T22022 年 5 月 28 日访问。

3d ignazio,Catherine 和 Lauren F. Klein。数据女权。麻省理工学院出版社,2020 年。2022 年 5 月 28 日访问。

4《纽约时报》。“谷歌研究员表示,她被解雇是因为论文突出了人工智能的偏见。”https://www . nytimes . com/2020/12/03/technology/Google-research-Tim nit-gebru . html

5 奥尼尔,凯茜。数学毁灭武器:大数据如何增加不平等并威胁民主。皇冠,2016。2022 年 5 月 28 日访问。

“联合学*对齐和翻译的神经机器翻译”的输入输出注意机制

原文:https://towardsdatascience.com/the-input-output-attention-mechanism-from-neural-machine-translation-by-jointly-learning-1bb00f5deb0c

图片来自 Pixabay

注意机制是深度学*中一个很有影响力的观点。即使我们经常认为注意力是在变形金刚中实现的,但最初的想法来自于 Dzmitry Bahdanau 等人的论文“ 通过联合学*对齐和翻译 的神经机器翻译”。艾尔。

了解强大的注意力技术的起源将有助于我们掌握许多后代的想法。在这篇文章中,我将描述这种原始的注意力思想。在以后的文章中,我将涉及其他关注点,比如来自 Transformer 模型的关注点,以及更多最*的关注点,不仅仅是文本,还有图像、视频和音频。

语言到语言的翻译模式

本文介绍了一个将源语言中的一个句子翻译成目标语言中的一个句子的模型。该模型具有编码器-解码器架构,其中递归神经网络实现编码器和解码器。下图显示了模型架构:

基于 RNN 的语言到语言翻译模型架构

模型架构

我们先从下往上看图表。

输入

在图表的底部,编码器的输入是源语言的单词序列:

在哪里

  • Tₓ 是输入句子*的长度。*例如,在一句“我爱神经网络”中, Tₓ=4.
  • 每个 xᵢ 都是一个单词在源语言中的独一无二的表示,带有一个 Kₓ 单词的字典。也就是说,每个 xᵢ 是一个长度为 *Kₓ、的向量,通常在 5 万到 10 万字的范围内。*在这个 xᵢ 向量中只有一个条目是 1,指示源语言中的特定单词;所有其他条目为零。

编码器

  • 编码器是一个递归神经网络。在图表中,它显示为通常的连续区块(绿色区块)。记住,只有一个编码器模块,所有的输入字都由这个模块一个接一个地处理。
  • 编码器模块获取隐藏状态和输入字,并发出下一个隐藏状态。 h₀、h₁…、h_Tₓ 是长度为 n 的隐藏状态向量。 h₀ 是零矢量。
  • 注意,这些编码器隐藏状态向量不是模型参数,它们是递归神经网络块的输出。
  • 最后一个编码器隐藏状态 h_Tₓ 将是解码器的初始状态,即 s_ *₀ = h_Tₓ.*在图表中,青色虚线箭头建立了这种联系。

解码器

  • 解码器也是递归神经网络,显示为粉红色块。
  • decode 块发出两件事:下一个翻译成目标语言的单词,以及下一个解码器隐藏状态。为此,它需要三个输入:前一个解码器隐藏状态(显示为蓝色箭头)、前一个输出单词(显示为黄色箭头)和一个上下文(显示为紫色箭头)。
  • 语境是注意力机制的结果,也是本文的主要目的。稍后我将描述如何计算它和它的直觉。
  • 解码器继续发出翻译的单词,直到它发出一个特殊的句尾单词。
  • 即使我绘制了与编码器块相同数量的解码器块,在翻译过程中,输入和输出的句子很可能长度不同。

更正式地说,解码器的输出是目标语言的单词概率向量序列:

  • Tᵧ 是目标句子的长度,在模型完成翻译之前我们并不知道——只有当解码器输出特殊的句尾词时,我们才知道目标句子的长度。
  • 每个发出的概率向量 yᵢ 的长度为 Kᵧ ,其中 Kᵧ 是目标语言的字典大小。向量 yᵢ 中的条目是 0 到 1 之间的实数,代表特定单词的概率,即第个单词,其中 i 是目标语言中的条目索引。 yᵢ 中的所有条目总和为 1。惯例是使用概率最高的字作为解码器的第发射字。

公式

了解了模型架构后,让我们深入研究模型中的公式,这有助于我们在讨论注意力机制时将直觉与相应的数学实现联系起来。

我简化了论文中的公式。我的公式版本不包括双向 RNN 和 LSTM 式指数平滑。这些简化保持了公式的简短,更容易理解主要的注意力思想。

编码器隐藏状态

  • 每个编码器隐藏状态 hᵢ 是一个长度为 n 的向量,其中 n 是编码器隐藏状态的维度。 n 是模型的超参数,通常在几百到几千之间。
  • 初始编码器隐藏状态是零向量。所有连续的编码器隐藏状态 hᵢ 通过参考前一个编码器隐藏状态 hᵢ-₁ 递归定义。这就是递归神经网络的本质。

让我们来看看更有趣的 hᵢ.的案例它结合了来自当前输入字 xᵢ 和先前编码器隐藏状态 hᵢ₋₁ 的信息:

  • Xᵢ 是一键向量中第输入字,形状为 Kₓ×1.
  • Eₓ 为源语言的单词嵌入矩阵,形状 *m×Kₓ,*带 Kₓ 为源语言的单词数, m 为源语言嵌入的维数。
  • hᵢ-₁ 是前一个编码器隐藏状态。
  • 形状为 n×m 的 Wₕ 和形状为 n×nU ₕ是模型的可学*参数。
  • 双曲正切 tanh 是激活函数。

我把尺寸放在各种矩阵的顶部,这样你可以很容易地验证它们。

注意机制

注意机制为每个输出单词计算上下文向量。对于第输出字,上下文 cₜ 是所有编码器隐藏状态 h₁h_Tx 的加权平均值:

或者更简洁地说:

在上面的公式中,每个 αₜ,ⱼ 都是一个浮点数,代表第 j 个输入字隐藏状态hⱼ第 t 个输出字的权重。 αₜ,ⱼ 使用 softmax 公式定义(softmax 函数确保所有权重总和为 1):

并且 eₜ,ⱼ 定义为 :

  • eₜ,ⱼ 合并来自第j编码器隐藏状态 hⱼ 和第*(t-1)*解码器隐藏状态 sₜ₋₁ 的信息。
  • 形状为n′×n的 Wₐ 和形状为n′×n的 uₐ是可学*的参数。
  • 形状为n′×1的 Vₐ(因此其转置 Vₐᵀ 的形状为*1×n′)*也是可学*的参数。
  • 人们将上述等式右边的表达式称为注意力网络,因为它确实是一个简单的前馈网络。

注意力机制背后的直觉

在标准的编码器-解码器架构中,来自输入句子的信息仅通过最终编码器隐藏状态向量 *h_Tₓ、*或等效地,初始解码器隐藏状态向量 s_₀.对解码器可用本设计:

  • 具有迫使编码器学*关于输入句子的东西的优点。这是因为解码器只能依靠来自其初始隐藏状态向量的信息来生成输出句子。只有当初始解码器隐藏状态向量包含足够的来自输入句子的信息时,decide 才能很好地生成输出句子。
  • 这种设计的缺点是,当生成输出句子时,解码器不能访问特定的输入单词,它只有关于整个输入句子的信息。想象一下,我让你把一部法语小说(那是我们的输入句)翻译成英语小说(那是我们的输出句),但是我不给你法语小说,而是给你那部小说的摘要(那是初始解码器隐态向量),要求你做一个单词级的翻译。这是一项艰巨的任务。

注意机制的动机是引入一种新的方式来将关于输入单词的信息传递给解码器。在建立这种新方式时,我们需要考虑以下几点:

  • 当我们到达解码阶段时,我们已经有了所有输入单词的信息,存储在编码器隐藏状态 h₁、…、hⱼ、…、h_Tₓ.
  • 解码器逐字生成或解码输出句子:y ₁,…,yₜ,… y_Ty。
  • 由于在解码一个输出字时,并非所有的输入字都同等重要,所以当解码第个第个输出字时,我们需要决定将哪些输入字的信息,即那些编码器隐藏状态向量,传递给解码器。

鉴于上述情况,本文提供了一个巧妙的设计:

  • 当解码第个第个输出字时,解码器以加权和的方式包括所有输入字的信息,而不是对关注或关注哪些输入字进行二元决策。那就是 c 向量*。*
  • 然后,当解码第个到第个输出字时,解码器需要学*如何给每个输入字分配权重。那是第 eₜ,ⱼ 数量,它是一个浮点标量值,用于第 j 个输入字中的每一个。

eₜ,ⱼ数量数量

eₜ,ⱼ 量最终决定了模型使用多少来自编码器隐藏状态 hⱼ 的信息来解码输出字 yₜ.

一个 eₜ,ⱼ 越大,第 j 个编码器隐藏状态 hⱼ (或者等效地第个 j 个输入字)的权重就越高,所以来自 hⱼ 的更多信息被包含在计算上下文 c 中,用于解码第输出字*。注意力机制充当解码器的顾问。它告诉解码器,要生成第个*个输出字,要注意哪个输入字。

现在的问题是如何估算计算出 *eₜ,ⱼ?*上式表示使用先前的解码器隐藏状态 sₜ₋₁ 和编码器隐藏状态 *hⱼ.*这意味着:

  • 我们将来自编码器隐藏状态的信息用于第个第 j个输入字,即个 hⱼ ,它表示关于输入句子直到第个第 j个字的知识。
  • 并且我们使用来自先前解码器隐藏状态 sₜ₋₁ 的信息,其表示关于输出句子直到第字的知识。

这两条信息似乎是明智的选择。他们是唯一的选择吗?也许不是。这篇论文的作者决定了这些选择,并展示了它的实验成功。你可以想出其他的选择。事实上,在其他论文的许多后续关注想法中,你可以看到不同的选择。

注意机制的全部目的是计算上下文向量,以便从输入句子中向解码器提供更好的信息。现在让我们看看解码是如何使用这个上下文向量的。

解码器输出

解码器生成两个输出,下一个解码器隐藏状态和下一个目标语言的输出单词。

下一个解码器隐藏状态

  • 第一个解码隐藏状态 s_₀ 设置为最后一个编码器隐藏状态 h_Tx ,这就是为什么 s_₀h_Tx 形状相同,都是 n×1
  • 所有连续的解码器隐藏状态 sₜ 通过参考先前的解码器隐藏状态 sₜ₋₁ 被递归地定义,其中包括:先前生成的输出字 *yₜ₋₁、*先前的解码器状态 sₜ₋₁ ,以及来自注意机制的上下文 cₜ 。请注意下标的不同: sₜ₋₁,yₜ₋₁ ,而 cₜ.
  • yₜ₋₁ 是输出单词概率向量(在下一节定义),其长度为 *Kᵧ.*独热运算符将 yₜ₋₁ 转换为独热表示,将 1 分配给具有最大值的向量条目,将 0 分配给所有其他条目。这个独热向量用于在目标语言嵌入矩阵 Eᵧ 中为该输出单词选择嵌入向量。
  • 目标语言嵌入矩阵 Eᵧ 的形状为 q×Kᵧ ,其中 Kᵧ 为目标语言的字数, q 为目标语言单词嵌入的维数。
  • WₛUₛCₛ 是可学*的参数。

目标语言的下一个输出单词

  • 输出单词概率向量 yₜ 结合了三条信息:之前生成的输出单词 *yₜ₋₁、*之前的解码器状态 sₜ₋₁ ,以及来自注意力网络的上下文 cₜ 。这与解码器隐藏状态 sₜ.相同
  • 但是不同的矩阵 WₒUₒCₒ (而不是 WₛUₛCₛ )被用来组合这些信息以生成 yₜ ,即使组合公式的结构在 yₜs 中是相同的。
  • WₒUₒCₒ 是可学*的参数。
  • softmax 运算符确保对于位置 t 的输出单词,目标语言词典(其大小为大小 Kᵧ )中所有单词的概率总和为 1。

这就完成了引入原始注意机制的语言模型。

快速公式参考

我现在以简洁的方式列出上面的所有公式,供您快速参考:

(1)编码器隐藏状态

(2)注意网络

(3)解码器隐藏状态

(4)来自解码器的目标词概率向量

支持我

如果你喜欢我的故事,如果你考虑支持我,通过这个链接成为灵媒会员,我将不胜感激:https://jasonweiyi.medium.com/membership。

我会继续写这些故事。

结论

本文阐述了基于递归神经网络的语言到语言翻译模型,该模型首次引入了注意机制。它清楚地强调了输入输出机制是如何工作的,以及数学背后的直觉。

聚类算法的详细情况

原文:https://towardsdatascience.com/the-ins-and-outs-of-clustering-algorithms-acd4e33290c5

解决一个数据科学问题通常从一遍又一遍地问同样的简单问题开始,偶尔会有变化:这里有关系吗?这些数据点属于同一个吗?那边的那些人呢?前者与后者有什么关系?

事情可能(也确实)变得非常复杂——尤其是当我们在处理大型数据集时试图检测微妙的模式和关系时。这就是聚类算法派上用场的地方,它有能力将一堆杂乱的数据分成不同的、有意义的组,然后我们可以在分析中利用这些组。

为了帮助您踏上集群学*之旅,我们选择了关于该主题的最佳*期文章,它们涵盖了从基本概念到更专业的用例的许多领域。尽情享受吧!

  • k 均值聚类的基本原理 。无论你是机器学*的新手,还是需要可靠指导的老手, Jacob Bumgarner 对最广泛使用的基于质心的聚类方法的介绍是一个很好的起点。
  • 基于密度聚类的易理解指南 。一旦您掌握了 k-means 聚类,并准备扩展一下, Shreya Rao 将在这里为您提供清晰的 DBSCAN(基于密度的带噪声应用程序空间聚类)指南,这是一种“需要最少的领域知识,可以发现任意形状的聚类,并且对大型数据库有效”的算法。
  • 如何把一个算法用好 。感到有灵感将您的集群知识应用到一个具体的问题上? Lihi Gur Arie,PhD 的新教程是基于 k-means 聚类;它耐心地引导读者根据颜色识别和量化图像中的对象。

安妮·斯普拉特在 Unsplash 上的照片

  • 聚类方法满足可再生能源 。在现实世界中,对于给定的用例,哪种集群方法最有效并不总是显而易见的。 Abiodun Olaoye 研究了多种算法——k-means、凝聚聚类(AGC)、高斯混合模型(GMM)和相似性传播(AP)——以确定哪种算法在发现风力涡轮机邻居方面最有效。
  • 如何选择正确的基于密度的算法 。决定哪种模型最适合您的数据集,有时取决于细微的差别。Thomas A . dor fer通过比较 DBSCAN 与其较新的同类产品 HDBSCAN 的性能,展示了一个这样的例子,并向我们展示了如何看待不同集群选项的优缺点。

准备好阅读更多关于其他主题的优秀文章了吗?这里有一个我们很高兴分享的人造集群:

  • 艾德丽安·克莱恩的统计训练营系列的每一个新的部分都值得庆祝,最新的部分——关于第一类和第二类错误——也不例外。
  • 我们很兴奋地发布了约瑟夫·罗卡和巴普蒂斯特·罗卡的新深度剖析:他们耐心地解释了扩散概率模型的内部运作。
  • “如果任其自生自灭,人们会找到不同寻常的方法来挫败你的数据收集意图。”Cassie Kozyrkov 强调了掌握数据设计艺术对 T2 的重要性。
  • 我们如何解决深度学*架构和关系数据库之间的差距?Gustavír 分享了一个发人深省的建议,这个建议可能会产生深远的影响。
  • 不要屈服于沉没成本谬论——Sarah kras Nik 的最新文章提供了一个有用的路线图,来反对和告别未充分使用和未使用的仪表板。

随着这一年接*尾声,我们一如既往地感谢读者的支持。如果你想产生最大的影响,考虑成为中级会员。

直到下一个变量,

TDS 编辑

图形卷积和消息传递背后的直觉

原文:https://towardsdatascience.com/the-intuition-behind-graph-convolutions-and-message-passing-6dcd0ebf0063

图神经网络中图卷积和消息传递之间的关系及图分类实例。

【图片由作者提供】。

内容

在接下来的文章中,我们将介绍图形卷积背后的基本思想和建立一些直觉,研究如何基于消息传递机制建立图形卷积神经网络,并创建一个模型来用嵌入可视化对分子进行分类。

问题陈述的示例

让我们想象我们设计药物来治疗某种疾病。让我们假设我们有一个数据集,其中包含成功治疗该疾病的药物和无效的药物。我们现在正在设计一种新药,想知道它是否能治疗这种疾病。如果我们可以创建一个有意义的药物表示,我们就可以训练一个分类器来预测它对疾病治疗是否有用。我们的药物是分子,可以用图表来表示。这个图的节点是原子。也可以用特征向量 x 来描述原子(它可以由原子属性组成,如质量、电子数或其他)。为了对分子进行分类,我们希望利用关于其空间结构和原子特征的知识来获得一些有意义的表示。

用图形表示的分子的例子。原子有它们的特征向量 x,特征向量中的索引代表节点索引[图片由作者提供]。

那么我们能做什么呢?

最直接的方法是聚集特征向量,例如,简单地取它们的平均值:

节点特征向量的平均。

这是一个有效的解决方案,但是它忽略了分子的空间结构,而空间结构是很重要的。

人们可以提出另一个想法:用邻接矩阵表示分子图,并用特征向量“扩展”其深度。结果,我们获得伪图像[8,8,N],其中 N 是节点特征向量 x 的维数。现在有可能使用常规卷积神经网络并提取嵌入的分子。

图结构可以表示为邻接矩阵。节点特征可以表示为图像中的通道(括号代表串联)[Image by author]。

这种方法利用了图形结构,但有一个巨大的缺点:如果我们改变节点的顺序,我们会得到不同的表示。所以这种表示不是置换不变量。然而,相反的情况是可取的:邻接矩阵中的节点顺序是任意的。例如,我们可以将列顺序从[0,1,2,3,4,5,6,7]更改为[0,2,1,3,5,4,7,6],它仍然是图的有效邻接矩阵。我们可以创建所有可能的排列并将它们堆叠在一起,这将导致 1625702400 个可能的邻接矩阵(8!* 8!).那似乎是过分的,所以我们应该找到更好的。

问题是,我们如何整合空间信息,并有效地做到这一点?上面的例子可以让我们想到卷积的概念,但它应该在图形上进行。

图形卷积背后的直觉

当我们对图像应用正则卷积时会发生什么?相邻像素的值乘以滤波器权重并求和。我们能在图上做类似的事情吗?是的,我们可以将节点特征向量堆叠在一个矩阵 X 中,并将它们乘以邻接矩阵 A ,然后我们获得更新的特征 X` ,其结合了关于节点最*邻居的信息。为简单起见,让我们考虑一个具有标量节点特征的示例:

标量值结点要素的示例。仅针对节点 0 说明了 1 跳距离,但所有其他节点都适用[图片由作者提供]。

因此,每个节点都会获得关于其最*邻居的信息(也称为 1 跳距离)。邻接矩阵上的乘法将特征从节点传播到节点。

在图像域中,我们可以通过增加滤波器尺寸来扩展感受野。在图中,我们也可以考虑更远的邻居。如果将乘以X*——关于两跳距离的节点的信息传播到这些节点:*

注意,节点 0 现在有了关于在 2 跳距离内的节点 2 的信息。仅说明了节点 0 的跳数,但所有其他节点都是如此[图片由作者提供]。

矩阵的高次幂以相同的方式工作:乘以 A^n 导致从 n 跳距离节点传播特征。所以我们可以通过对邻接矩阵的高次幂增加乘法来扩展“感受野”。为了概括这个操作,可以将节点更新的函数定义为这样的乘法的和,这些乘法具有一些权重 w 😗*

多项式图形卷积滤波器。a-图邻接矩阵,w-标量权重,x-初始节点特征,x '-更新的节点特征。

所以新特性*【x’看起来是一些来自 n-hop 距离中节点的混合物的影响,相应的距离由权重 w 控制。这样的操作可以被认为是与由权重【w】*参数化的滤波器 P 的图形卷积。与图像上的卷积类似,图卷积滤波器也可以具有不同的感受域,并且聚集关于节点邻居的信息,但是邻居的结构不应该像图像中的卷积核那样规则。

图形卷积和图像卷积的相似性【图片由作者提供】。

这种多项式满足一般卷积的置换等变。可以使用图拉普拉斯算子而不是邻接矩阵来在节点之间传递特征差异而不是特征值。也可以使用邻接矩阵或图拉普拉斯的规范化形式。

将图卷积表示为多项式的能力可以从一般的谱图卷积中得到。例如,利用具有图拉普拉斯算子的切比雪夫多项式的滤波器提供了直接谱图卷积的*似[ 1 ]。

请注意,我们可以很容易地将其推广到任何维度的节点特征,并保持相同的方程。唯一不同的是,在更高维的情况下,我们处理的是节点特征矩阵 X 而不是节点特征向量。例如对于 N 个节点和 1 个 或 M 个 节点我们得到:

X-节点特征向量,X-堆叠节点特征,M-节点特征向量的维度,N-节点数量。

请注意,我们可以将特征向量的“深度”维度视为图像卷积中的“通道”。

信息传递

现在让我们以稍微不同的方式来考虑同样的话题。让我们采用上面讨论的仅具有前两项的简单多项式卷积,并让 w 等于 1:

所以现在如果我们将图形特征矩阵 X 乘以( I + A )我们得到如下:

【图片由作者提供】。

可以看到所有特征发生了什么,对于每个节点,添加了相邻节点的总和。因此操作可以表示如下:

N(i)表示节点 I 的一跳距离邻居

在我们的例子中,“更新”和“聚集”只是简单的求和函数。

这种对节点特性更新的观点被称为消息传递机制。考虑这种消息传递的单次迭代相当于与过滤器 P= I + A 的图卷积。现在,如果我们想要从更远的节点传播信息,我们可以再次重复这样的操作几次,从而用更多的多项式项来*似图形卷积。

如果重复几次图形卷积,会导致图形过度平滑,其中每个节点嵌入对于所有连接的节点都变成相同的平均向量。

现在,怎样才能增加表达信息传递的能力呢?您可以尝试聚合和更新功能,还可以转换节点功能:

w1-更新结点要素的权重矩阵,W2-更新相邻结点要素的权重矩阵。

请注意,可以使用任何排列不变函数进行聚合,如 sum、max、mean 或更复杂的函数,如 DeepSets 。

例如,评估消息传递的基本方法之一是 GCN 层:

乍一看可能不太熟悉,但是让我们使用“更新”和“聚合”函数来看看它:

使用单个矩阵 W 代替两个加权矩阵 W1 和 W2。更新函数是总和,聚合函数是包括结点特征 I 在内的归一化结点特征的总和。d-表示结点度。

我们有单个权重矩阵 W 而不是两个,用 Kipf 和 Welling 归一化求和作为聚合,再加一个求和作为更新函数。注意,聚合会评估邻居和节点 i 本身,这相当于将自循环添加到一个图中。

因此,具有消息传递机制的 GNN 可以表示为重复多次的聚集和更新功能。消息传递的每次迭代可以被认为是一个新的 GNN 层。节点更新的所有操作都是可微分的,并且用可以学*的权重矩阵来参数化。现在,我们可以构建一个图形卷积网络,并研究它的性能。

实际例子

现在让我们使用上面提到的 GCN 层来构建和训练图形神经网络。对于这个例子,我将使用已经实现了许多层的 PyG 库,包括一个 GCN 层。为了举例,我将使用辅助图形数据集【2,3】。它由 2000 个代表分子化合物的图表组成:其中 1600 个被认为对艾滋病毒无活性,400 个对艾滋病毒有活性。每个节点都有一个包含 38 个特征的特征向量。以下是来自数据集的分子图表示示例:

使用网络 x 库对来自艾滋病数据集的样本进行可视化【图片由作者提供】。

为了简单起见,我们将建立一个只有 3 个 GCN 层的模型。对于嵌入空间可视化,最终嵌入维度将是 2-d。为了得到图形嵌入,我们将使用平均聚合。为了对分子进行分类,将在图形嵌入的顶部使用简单的线性分类器。

具有三个 GCN 层、平均池和线性分类器的图形神经网络。

对于第一次消息传递迭代(第 1 层),初始特征向量被投影到 256 维空间。在第二次消息传递(第 2 层)期间,在相同维度上更新特征向量。在第三次消息传递(第 3 层)期间,特征被投影到 2-d 空间上,然后应用所有节点特征的平均来获得最终的图形嵌入。最后,这些嵌入被馈送到线性分类器。请注意,选择最终的 2-d 维度只是为了可视化,维度越高效果越好。这种模型可以使用 PyG 库来实现:

那么它可以被训练成通常的具有二进制交叉熵损失的 Pytorch 模型。在训练过程中,我们可以可视化图形嵌入和分类器决策边界。通过这样做,我们可以看到消息传递操作如何仅用 3 个图卷积层就产生有意义的图嵌入。注意,随机初始化的模型嵌入没有线性可分的分布:

分子嵌入是通过正向传递随机初始化的模型获得的[图片由作者提供]。

但是在训练期间,分子嵌入很快变得线性可分:

验证集和分类器决策边界的分子嵌入。

因此,即使 3 个图形卷积层也可以评估有意义的 2-d 分子嵌入,这些嵌入可以用线性模型分类,在验证集上具有大约 82%的准确性。

结论

我们看到了如何将图卷积表示为多项式,以及如何使用消息传递机制来逼*它。这种具有附加特征变换的方法具有强大的代表性,可以用于实际应用。我们几乎没有触及图形卷积和图形神经网络的表面。有几十种不同的图形卷积层和聚合函数架构。我们也不包括可以在图上完成的其他任务,比如节点分类、边重构等等。如果你想深入了解,PyG 教程可能是一个很好的起点。

参考文献:

  1. 具有快速局部谱滤波的图上卷积神经网络。Michal Defferrard,Xavier Bresson,Pierre Vandergheynst,EPFL,瑞士洛桑,2017 年
  2. 图数据集:用图学*的基准数据集集合,克里斯多夫·莫利斯、尼尔斯·m·克里格、弗兰卡·鲍斯、克里斯蒂安·克斯汀、佩特拉·穆策尔、马里恩·诺依曼,2020 年
  3. graphlearning.io

ROC 情节背后的直觉

原文:https://towardsdatascience.com/the-intuition-behind-roc-plots-614a6053af83

揭开 ROC 或类似图如何用于评估二元分类器的神秘面纱

ROC 和台球有什么关系?继续阅读…照片来自 Unsplash

在之前的一篇文章中,我谈到了偏差-方差的权衡。在数据科学中有一些这样的权衡,了解它们很重要,这既是为了建立直觉,也是因为它们可能会产生重要的实际后果。所以在这篇文章中,我想谈谈数据科学中评估二元分类时面临的另一个常见权衡的例子。我将试着介绍一些基础知识,但是先熟悉一下这个主题会有所帮助。

假设我们训练一个二元分类器来预测一些数据是属于正类还是负类(或者你选择的两个类中的一个)。一旦模型被训练好,我们就可以给它传递新的数据来得到预测。大多数模型为我们提供了软预测,根据模型,我们可以粗略地将其视为预测为正的概率。为此,我们需要校准预测,所以让我们假设我们校准了我们的预测。下一步是将软预测转换为硬预测(正对负类),为此,我们需要选择某个阈值(T10,T11),使其上的所有软预测为正,其下的所有软预测为负。对于已校准的模型,接* 0 或 1 的软预测表示模型预测的可信度较高,而接*阈值的值表示可信度较低。因此,一个好的模型应该很好地将正面情况的软预测推向 1,而将负面情况的软预测推向 0。

左边是一个*乎完美的模型,右边是一个不那么完美的模型。作者图片

如果一个模型在这方面做得非常好,那么我们就不会对阈值的选择非常敏感。换句话说,预测的可分性给了我们一些“回旋余地”,以很小的代价改变阈值。另一方面,如果软预测混合了很多类别,那么选择正确的阈值可能是一个真正的平衡游戏:增加阈值意味着我们对什么被分类为阳性的问题更加保守,这意味着我们对给我们带来假阳性的模型有更低的 T2 容忍度。降低我们的阈值会产生相反的效果,结果是模型给出更少的假阴性。理解这是一种权衡真的很重要,这意味着通过改变阈值,我们表达了我们对更多假阳性与更多假阴性的偏好(或厌恶)。为了同时减少这两者,我们需要一个更好的模型。如何才能直观地理解这一点?首先让我们使用下表,也称为混淆矩阵:

混乱矩阵。作者图片

一旦选择了阈值,我们就可以计算上表中的计数。真阳性率(TPR)真阴性率(TNR) 的计算如上所示。唯一的目的是将计数转化为百分比。同样,我们可以推导出假阳性率(FPR = 1-TNR)假阴性率(FNR = 1-TPR) ,但它们实际上只是 TPR 和 TNR 的镜像,这意味着所有的变化都是我们的视角。换句话说,我可以说一个更好的模型是一个具有更高的 TPR 和 TNR 的模型,这就好比说它分别具有更低的 FNR 和 FPR。最后,为了绘制 ROC 曲线,我们将假阳性率放在 x 轴上,将真阳性率放在 y 轴上。这里有一个 ROC 图的例子:

ROC 图示例。来源scikit-learn.org

但是等等,如果 TPR 和 FPR 只是两个数字,为什么 ROC 会呈现出曲线?答案是,对于阈值的不同值,我们得到不同的(FPR,TPR)对**,因此我们可以将阈值从 0 滑动到 1,并绘制所有这样的对,结果是您在上面看到的橙色曲线。得到的曲线说明了当我们调整阈值时,给定模型提供的较高的 TPR较低的 FPR (反之亦然)之间的权衡。完美的模型(类之间完全分离)应该从(0,0)开始,直接向上到(0,1),再到(1,1)。一个不比随机猜测更好的模型应该遵循 45 度线。所以 ROC 曲线在某种程度上显示了我们的模型在 0 和 1 之间扫描阈值时向左上角移动的最佳状态。**

如果仍然不清楚为什么改变阈值会导致这种权衡,那么下面的视觉效果会有所帮助:假设你提高了阈值。因此,一些略高于旧阈值的数据点现在低于新阈值。这将这些点的预测从正变为负。这在下表中用黄色箭头表示。正如我们所看到的,这种变化会导致负面影响(TPs 下降,因为一些 TPs 现在被错误分类为 FPs,如红色箭头所示)和正面影响(TNs 增加,因为一些先前错误分类的 fn 现在被正确分类,如蓝色箭头所示)。所有这些变化反过来影响 TPR 和 FPR,使我们沿着 ROC 曲线移动到一个新的位置。

增加阈值对混淆矩阵的影响。作者图片

我们可以做一个类似的论证,当我们降低阈值时会发生什么,导致箭头指向相反的方向。那么我们应该选择什么样的阈值呢?如果我们不关心模型会产生什么样的错误(FP vs FN ),那就没什么关系了,但实际上我们远不是不关心,因为每种错误都有与之相关的成本,所以我们必须比较总成本来决定使用什么阈值。关于这个问题的详细讨论在这里给出,我会在以后的某一天尝试解决这个话题。现在我们只能说 ROC 图本身不能帮助我们选择正确的阈值。

我希望你被这个解释说服了。如果没有,让我提供另一个我们都可以直观理解的替代性和非技术性的解释:假设一堆球散落在一张台球桌上:让我们将它们称为蓝色和红色的球,而不是条纹和实心球(所以请将它们视为我们的标签)。假设我们想通过将球杆以某个角度放在桌子上的某个地方,并将落到球杆一侧的所有球扫入一个“角落”,其余的球扫入另一个“角落”来分离球。为了方便起见,我将这两个角称为红色和蓝色角。课程的选择是任意的,就像之前对正反课的选择是任意的。这里有一个例子:

球杆的当前位置导致一个错误分类的红球和两个错误分类的蓝球。作者图片

你可以想象,除非我们运气好,否则我们无法用球杆完美地将蓝球和红球分开。这意味着一些球将不可避免地出现在错误的角落。事实上,即使我们放松对直(线性)球杆的假设,想象一个“弯曲”的球杆可以更好地分离球,这个类比仍然成立。将蓝色和红色的球分开的难易程度取决于(1)这些球混合在一起的程度(即数据有多“混乱),(2)球杆的弯曲度与球的吻合程度(即模型有多“灵活”),但在我们的类比中,我们假设这两者都是固定的,所以我们唯一能控制的是在清扫球之前如何放置球杆。并且该选择类似于选择使用哪个阈值。

最后一点:还有其他评估二元分类器的方法。当正类是数据的一个非常小的百分比*(我们称之为类不平衡)时,它可以帮助查看精度和召回:精度由 TP/(TP + FP)给出,而召回与 TPR 相同。因此,虽然 recall 只是 TPR 的另一个名称,但如果您检查 precision 的推导,您会注意到它在计算中没有使用真正的否定,因此 precision-recall 对是查看数据的一种不同方式,在某些设置中更有意义,如信息检索,其中真正的否定是不感兴趣的。通过绘制精度与回忆的对比图,我们最终得到了一个类似于 ROC 的图,但并不相同!*

使用期望最大化来训练记录关联模型背后的直觉

原文:https://towardsdatascience.com/the-intuition-behind-the-use-of-expectation-maximisation-to-train-record-linkage-models-5d7ac9f019ca

由苏珊·威廉姆斯在 Unsplash 上拍摄的照片

Splink 是一个免费的概率记录连接库,可以预测两个记录引用同一个实体的可能性。比如下面两条记录匹配的概率是多少?

成对记录比较示例

潜在的统计模型被称为 Fellegi Sunter 模型。它通过计算部分匹配权重来工作,部分匹配权重是在计算匹配概率时不同列的重要性的度量。例如,在上面的例子中,“Smith”的匹配没有“email”的匹配重要。

然而,在训练记录链接模型的问题的核心有一个悖论:为了估计模型的参数,您需要知道哪些记录匹配。但是找到匹配的记录是你要解决的全部问题。手动标记比较容易出错且成本高,因此不是一个好的选择。

期望最大化(EM)算法为这个悖论提供了一个解决方案。这篇文章直观地解释了这是如何工作的,以及如何在我们的大规模记录链接软件 Splink 中实现的一些细节。有关更正式的处理方式,请参见 FastLink 论文。

新兴市场方法

记录关联模型的参数——m 和 u 概率——可以分别从匹配记录和非匹配记录的集合特征中计算出来。(如果这个术语不熟悉,推荐阅读这篇博文。)一旦知道了这些值,模型通常就能够准确地预测哪些记录匹配。

EM 方法的关键是利用匹配和不匹配形成两个相当不同的“集群”这一事实:

  • 在匹配记录中,两个记录中大多数或所有列的信息通常是匹配的。
  • 在不匹配记录中,两个记录中大多数或所有列的信息通常不匹配

这导致记录比较的双峰分布:

成对记录比较的双峰分布的概念图。作者图解。

匹配和不匹配之间的这种分离意味着,提出一个能够正确识别大多数匹配和大多数不匹配的粗略决策规则是相对容易的。例如,我们可以简单地计算匹配的列数(名字和姓氏,等等),并预测超过一半匹配的记录对的匹配。

既然我们已经将每个记录比较指定为匹配或不匹配,我们可以计算模型的隐含 m 和 u 参数。这使我们能够使用以下算法迭代地改进该决策规则:

**期望步骤:**使用估计的模型参数来预测哪些记录比较是匹配的

**最大化步骤:**使用预测来重新估计模型参数

在这个例子中,我们最初的决策规则通过简单地计算具有匹配信息的列的数量来工作。因此,我们对每一列都给予了同等的重视。显然,这条规则还有改进的空间——在现实中,邮政编码列的匹配比性别的匹配更重要。

期望最大化过程将立即开始学*这些权重,因为它将认识到,在不匹配的情况下,有许多记录比较在性别上匹配,但在邮政编码上匹配的很少。这将在重新计算的 m 和 u 概率中表示,并且在下一次迭代中,将对邮政编码的匹配给予更大的权重。

在每次迭代中,决策规则将随着模型错误的减少而改进,权重也因此变得更加准确。

当参数估计稳定,并且在迭代之间参数估计不再有任何变化时,收敛发生。

事实证明,这种算法相当于最大化 Fellegi-Sunter 模型的似然函数(尽管注意,它只能保证收敛到局部最大值,而不一定是全局最大值)。

EM 方法如何在 Splink 中实施

在 Splink 中,对上述过程进行了一些修改,在实践中,这些修改导致更快的收敛和收敛到全局最大值的更大可能性。

估计 u 概率

虽然有可能使用 EM 方法估计 u 概率,但我们建议使用 Splink 中的替代估计程序,该程序通常更准确。

回想一下,u 概率表示我们在真正不匹配的记录中观察到匹配列的概率。例如,我们观察到两个不同的人有相同的名字的巧合有多频繁?

我们可以通过随机两两比较记录来估计 u 概率,假设它们不匹配,并计算这些巧合发生的频率。由于两个随机记录相匹配(代表同一实体)的概率通常很低,因此这将产生 u 值的良好估计。

这种方法的另一个好处是,如果 u 概率是正确的,它“锚定”EM 估计过程,并大大提高它收敛到全局最大值而不是局部最大值的机会。

起始值和初始决策边界

在上文中,我们为 EM 的第一步建议了一个简单的决策规则:计算匹配列的数量,并将超过一半的字段匹配的任何比较指定为匹配。

实际上,有可能从通常更准确的决策规则开始,从而导致更快的收敛。具体来说,初始决策规则使用已经使用上述随机抽样程序估计的 u 个概率,以及 m 个概率的“合理默认”初始值。

你可以在我们的一些示例笔记本中看到所有这些在实践中的工作。

结论

EM 是估计 Fellegi Sunter 框架中概率连锁模型参数的有力工具。根据我们的经验,EM 方法在使用随机抽样估计 u 概率之后,仅用于估计模型的 m 概率时效果最佳。

A/B 测试的乐趣,第二部分:高级主题

原文:https://towardsdatascience.com/the-joy-of-a-b-testing-part-ii-advanced-topics-6c7f6cf71e4c

Cookies 和隐私、交叉实验、干净的拨号和测试指标

美国宇航局在 Unsplash 拍摄的照片

A/B 测试是机器学*生产中最关键的步骤之一:我们只希望推出一个新的 ML 模型,如果它可以在生产中被证明是更好的。在本系列的第一部分中,我们介绍了如何建立一个人口分割的 A/B 实验,如何用统计意义解释测试结果,以及什么样的错误是可以预期的。在第二部分中,我们将深入一些实际的考虑。我们将涵盖:

  • cookies 和隐私:如何对未登录的用户进行 A/B 测试,
  • 交叉实验:一种快速获得推荐模型测试结果的有效方法,
  • 干净的拨号上网:如何避免测试结果中的统计偏差
  • 通用模型性能度量:测量什么来确定新模型是否更好。

让我们直接开始吧。

Cookies 和隐私

如果用户使用自己的帐户登录,例如在亚马逊、脸书、Instagram、Twitter、网飞或谷歌上,那么将用户分配给控制或治疗就很简单:只需将用户 id 散列成一个二进制指示符,0 表示控制,1 表示治疗。

然而,用户并不总是登录。例如,人们可以作为访客用户在谷歌或亚马逊上搜索。在这种情况下,我们仍然可以用浏览器 cookie唯一地识别这些用户。提醒一下,cookie 只是用户第一次访问网站时生成的文本文件,并存储在用户的计算机上。在 A/B 测试中,“分析 cookie”可以简单地指定用户是在控制组还是治疗组。

基于 cookie 的 A/B 测试的一个缺点是 cookie 的寿命有限。例如,Safari 的智能跟踪预防(ITP)会在 7 天后删除一些 cookie,因此如果测试运行超过一周,那么用户将在每周后被重新分配。这使得很难衡量一个新的 ML 模型的长期用户影响。

此外,还有用户隐私法规的作用。例如,欧盟的一般数据保护法规( GDPR )规定,网站所有者在使用任何 cookies 之前,必须得到用户的明确同意,除非是“绝对必要的”(很难说 A/B 测试对于运行一项服务是绝对必要的)。如果用户不同意,那么我们就不能使用分析 cookies,不可能进行人口分割的 A/B 测试。不遵守 GDPR 的规定会导致公司被罚款数亿欧元(T2)。

交叉实验

交错是人口分割 A/B 测试的一种强有力的替代方法。基本的想法是向每个用户提供控制和处理,并查看他们更喜欢哪个版本。这就像让他们直接在可口可乐和百事可乐之间选择,而不是一次只给他们一个选项:由此产生的信号要直接得多。

这个想法的一个具体实现是用于两个(或更多)推荐器模型的团队草案交错算法。在该方法中,向用户显示的推荐混合了来自模型 A 和模型 B 的结果:这两个模型简单地轮流贡献它们的排名最高的视频,该视频还不在交错列表中,如下例所示。通过抛硬币的方式选出最先挑选的模型。

交错排列来自排序模型 A 和 B 的结果。A 和 B 各自轮流挑选尚未选择的排名最高的项目。(来源:奈芙丽丝)

交错背后的直觉是,因为每个用户可以直接从对照和治疗中选择,所以与两个群体的传统 A/B 测试相比,我们应该更快地获得测试结果。事实上,这种直觉已经在实验中得到证实:网飞报告称,与传统的基于群体的 A/B 测试相比,他们需要少 100 倍的用户来实现 95%的实验功效(相当于 A/B 实验中的回忆)。这是一个巨大的优势:这意味着他们可以运行 100 倍以上的实验,这使他们能够更快地了解用户的偏好。

干净的拨号

另一个重要的考虑是如何保守地运行 A/B 实验,而不损害可能更糟的新模型的业务指标(还记得在第一部分中讨论的 S 型错误)。一个解决办法是逐渐提高你的 A/B 测试,例如从 1%的治疗开始,一周后提高到 5%,然后到 10%,25%,最后到 50%。

这种逐步拨号方法的问题是,你不能在 A/B 测试中使用拨号期本身的数据,因为它可能会受到季节影响的影响。举个极端的例子,假设你建立了一个新的电子商务搜索排名模型,并在第一周将其上调至 1%,在第二周上调至 50%,而第一周恰好是全网站打折的一周。然后,当然控制组会比治疗组有更高的总购买率,因为它在打折周接触到了更多的流量。A/B 测试设计违反了同一性假设:各组并不相同。

补救办法可能是丢弃拨号期间的数据,只考虑 50/50 拨号期间获得的数据。然而,由于预暴露效应,这种方法也可能产生有偏差的测试结果:治疗组中的一些用户之前已经暴露于该治疗,并且这种预暴露可能在测量的测试期间改变他们的行为。例如,如果一个新的电子商务搜索模型好得多,增加了用户回来的可能性,那么测试期间的治疗组不再完全是随机的,它包括因为已经看过新模型而回来的用户。这再次违反了同一性假设。

因此,更好的做法是所谓的门控拨号:对于每个用户,首先随机决定他们是否会成为实验的一部分。这个群体在开始时可能只是总人口的 1%,然后从那里开始增加。然后,对于实验中的用户,以等概率随机分为对照组和治疗组。瞧,你已经解决了季节偏差问题(因为实验中的两个群体在任何时候都是一样大的)和预暴露问题(因为治疗中没有参与者被预暴露)。拨号可以被认为是“干净的”。

您应该衡量哪些指标?

最后,让我们考虑在 ML 模型的 A/B 测试期间应该跟踪什么度量。这种选择取决于你要解决的问题,比如分类或排名,以及你到底想优化什么。

例如,考虑一个要么通过要么取消交易的信用卡欺诈检测模型。在这种情况下,您可以测量两件事,(1)从假阴性中收到的总退款量,以及(2)假阳性的总数——这些当然分别是召回率和精确度的代表。然后,如果新模型在这些指标中的一个或两个方面更好,您可能会认为它更好。除了退款金额之外,您可能还希望跟踪退款计数,这将表明受漏报影响的客户数量,而不仅仅是总的货币损失。如前所述,度量标准的选择取决于您到底想要优化什么。

在用于搜索、广告选择或推荐的排名模型中,您可以测量和比较 MAP@k,即排名最高的前 k 个印象中的平均精度。这里,对 k 个等级取“平均值”,对用户取“平均值”(例如,如果用户观看了等级为 1、2、3 和 5 的电影推荐,而不是 4,则该用户的 AP@5 将是(1/1 + 2/2 + 3/3 + 3/4 + 4/5)/5 = 0.91)。更好的模型会有更好的地图@k,如何选择 k?一个好的选择可能是第一页显示的结果数,比如 Google 的 k=10。毕竟大部分人连第二页都不访问。

此外,还有一些特定于问题的衡量标准,例如:

  • 在广告排名中:广告点击总数和广告总收入,
  • 在电商搜索排名:总销售计数,总销售金额,总收入,
  • 在网站搜索排名中:会话成功率和平均会话时间:用户找到他们要找的东西需要多长时间?
  • 在视频推荐系统中:总点击量和平均观看时间:用户在一个视频上花费了多少时间?

任何模型比较还需要考虑我们模型选择的短期收益和长期影响之间的权衡,后者可能不会立即显现。例如,如果一个新的视频推荐模型推广更多的短片(如抖音推广的那样),点击量可能会在短期内上升,但用户可能会发现更没有意义的内容,并在长期内变得不满意。

结论

总结一下:

  • 在没有登录用户的用户 id 的情况下,可以使用浏览器 cookies 运行 A/B 测试。然而,cookies 受隐私法规的约束,如欧盟的 GDPR。
  • 与传统的群体分割测试相比,交错是一种更快获得 A/B 测试结果的强大方法。基本的想法是给每个用户提供控制和治疗,看他们自己选择哪个版本。团队草稿交错是网飞在制作中使用的一种特殊实现。
  • 在拨号过程中,有几个统计效应会使您的 A/B 测试结果产生偏差。一个好的解决方案是门控拨号,我们只允许一小部分用户参与实验,控制和治疗各占一半。这种方法被认为是“干净的”拨号。
  • A/B 测试指标的选择取决于问题和我们试图优化的确切指标。我们还需要了解模型的长期影响,这可能无法从 A/B 测试结果中立即看到。

在你走之前…

享受这个内容?在我的 个人资料页面 找到更多我的文章。关注/订阅这样以后就不会错过我写的新帖了。 成为中等会员 这样就可以无限查看文章了。并确保在LinkedIn和/或Twitter上关注我!

A/B 测试的乐趣:理论、实践和陷阱

原文:https://towardsdatascience.com/the-joy-of-a-b-testing-theory-practice-and-pitfalls-de58acbdb04a

今天的科技公司如何在机器学*生产中做出数据驱动的决策

Marcelo Leal 在 Unsplash 上拍摄的照片

A/B 测试在现代科技公司中根深蒂固,使他们能够不断改进产品,以保持对消费者偏好的了解,并击败竞争对手。一篇 Lyft 文章指出:

标准是测试每一个产品变化,建立证据来推动重大决策,并使用因果数据来支持战略方向。

DoorDash 写道:

对于任何数据驱动的公司来说,通过实验测试每一项变化以确保其对关键绩效指标产生积极的可衡量的影响是非常重要的。

或者考虑一下网飞的这句话:

网飞经营着一种 A/B 测试文化:几乎我们对产品和业务做出的每一个决定都是由测试中观察到的成员行为所引导的。

A/B 测试在机器学*产品中尤为重要,因为模型性能会对业务指标和用户体验产生巨大影响。例如,广告排名模型中转化率的微小提高可以带来数百万美元的额外收入。我们需要 A/B 测试这些模型变化,因为静态测试集上的离线性能并不是生产性能的良好指标:有时一个模型在离线时可能表现得更好,但是在生产中表现得更差。

在这篇文章中,我们将深入探讨 ML 模型的 A/B 测试理论、最佳实践和常见陷阱。您将了解到:

  • 如何分割你的流量进行 A/B 测试,
  • 测试结果在统计学上的显著性意味着什么,
  • 可能的测试结果和 4 种测试错误,以及
  • 要避免的常见陷阱。

让我们跳进来。

如何为 A/B 测试划分流量

A/B 测试背后的基本思想是将用户群分成一个处理组和一个控制组。为了测试新的 ML 生产模型,您将让治疗组接触新模型,让对照组接触现有模型。

A/B 测试依赖于两个重要的统计假设,即同一性独立性:

  • 一致性:对照组和治疗组的统计特性相同。当你有相似的组时,那么你可以确信组的任何度量的变化都可以归因于治疗,而不是其他。用统计学术语来说,你已经控制了所有的混杂因素
  • 独立性:这两个组是相互独立的。这意味着对照组的用户行为对治疗组的用户行为没有影响,反之亦然。如果是这样的话,那么我们就引入了一个额外的混杂因素,使得解释测试结果变得更加困难。

A/B 测试中最常见的方法是人群分割,我们将用户随机分为控制组和治疗组。在实践中,这可以通过将一个用户 id 散列成一个整数来确定它的组来实现。或者,我们可以使用会话分割,在每个项目会话开始时,我们将用户分配到两个组中的任何一个。

要了解我们为什么使用人口分割,考虑一个替代方案,即时间分割。假设我们有两个电影推荐模型,如下图红色和蓝色所示。人口分割清楚地向我们表明,与红色模型相比,蓝色模型推动了更多的参与,如顶部的图所示。然而,如果我们在第 16 天进行时间分割,我们可能会错误地得出红色模型更好的结论。用统计学术语来说,时间分割违反了同一性假设,因此测试结果是不确定的。换句话说,人口分割让我们能够确定因果关系,而不仅仅是相关性。

超过 30 天的 A/B 测试,有人口分割(来源:网飞)

A/B 测试在相同的 30 天内分时段进行(来源:网飞)

最后,治疗组和对照组应该有多大?在实践中,我们可以随着时间的推移改变大小。如果我们最初不确定新模型会带来改善,我们可以从 1%或更低的治疗组规模开始,然后如果测试结果看起来不错,就逐渐增加流量。

A/B 测试中的统计显著性

一般来说,在任何 A/B 测试中,我们需要问的问题是,结果(例如,新模型导致广告点击率提高 1%)是否可能是偶然造成的。这是无效假设,即假设治疗根本没有效果。如果 A/B 测试结果在统计上是显著的,那么我们可以自信地排除零假设。

使用 p 值计算统计显著性,即我们看到的结果是偶然结果的概率。在实验之前,我们需要设置一个 p 值阈值,低于该阈值时,我们将排除零假设,通常为 0.05 或 0.01。例如,如果点击率提高 1%的 p 值为 0.02,我们设置的阈值为 0.05,那么我们可以得出结论,A/B 测试结果在统计上是显著的(并排除了无效的零假设)。

p 值可以通过排列分析来计算:在 A/B 测试完成后,多次洗牌并测量每次排列的测试结果。然后,计算排列的比率,在这个比率中,你看到的结果至少和实际的(未混淆的)A/B 测试结果一样极端。这个数字就是 p 值。在实际操作中,你不必亲自动手,可以用一个 A/B 测试计算器来代替。

测试结果和 4 种测试错误

A/B 测试可能有 3 种结果:

  • 您确认新模型明显优于现有模型。在这种情况下,您将希望向所有人推广新模型,这样您就可以从模型改进中受益。
  • 你会发现相反的情况,即新模型明显比现有模型差。在这种情况下,您会想要中止实验并回到离线模型开发。
  • 测试结果是不确定的:两个模型之间的差异在统计上不显著。在这种情况下,您可以中止实验,或者延长实验时间以收集更多数据。

重要的是,A/B 测试并不完美,因此会导致错误的结果。一般来说,我们区分 4 种类型的错误:

I 型错误(又名假阳性):这些模型表现得一样好,但是 A/B 测试仍然产生了统计上显著的结果。因此,你可能会推出一款性能并不真正更好的新机型。这是假阳性。您可以使用 p 值阈值来控制此类错误的发生率。如果你的 p 值阈值是 0.05,那么你可以预期在大约 20 次实验中有 1 次出现 I 型错误,但是如果是 0.01,那么你只能预期在大约 100 次实验中有 1 次出现 I 型错误。p 值阈值越低,第一类错误就越少。

第二类错误(又名假阴性):新模型事实上更好,但是 A/B 测试结果没有统计学意义。从统计学的角度来说,你的测试是不足,你应该收集更多的数据,选择更敏感的指标,或者在对变化更敏感的人群中进行测试。

S 型误差(符号误差):A/B 测试显示新模型明显优于现有模型,但实际上新模型更差,测试结果只是统计上的侥幸。这是最糟糕的错误,因为您可能将一个更差的模型投入生产,这可能会损害业务度量。

Type M error:(magnitude error):A/B 测试显示新模型带来的性能提升比它实际能够提供的要大得多,因此您会高估新模型对您的业务指标的影响。

常见陷阱

最后,这里有一些你应该知道的 A/B 测试中的常见陷阱。

HARKing(结果已知后的假设)。在进行 A/B 测试之前,你应该有一个假设。这可以是一些简单的事情,比如“我假设新模型更好,因为它在更多的功能上进行了训练”。如果你在没有事先假设的情况下随机测试大量的模型,你会将自己暴露在看别处效应之下,也就是说,你可能会发现一个具有统计学意义的结果,而这个结果仅仅是偶然的。

如果你在没有明确假设的情况下测试 A 对 B,B 赢了 15%,那很好,但是你学到了什么?没什么。— 窥视 Laja

**分析瘫痪。**在实验开始时就成功标准达成一致也很重要,避免在 A/B 测试完成后转入冗长的分析。例如,假设您已经训练了一个全球电子商务产品分类模型,并在 A/B 测试中显示它比当前的生产模型工作得好得多(在固定召回的精确度方面)。太好了!但现在,产品团队正在询问,在该模型运作的 50 个细分市场中的每个细分市场上,以及每个细分市场中的 20 种产品类型上,这种比较看起来如何。我们在这 1000 个细分市场中的表现如何?检查长的度量列表会减慢决策的速度,并增加在数据中发现统计错误的机会。毕竟,A/B 测试结果只是真实生产性能的一个嘈杂的代理。

**溢出效应。**溢出效应,也称为交叉污染,发生在治疗组对对照组产生次级效应时,违反了独立性假设。例如,考虑一个广告排名模型,它将一个特定的广告(比如说耐克鞋)的排名远远高于现有的生产模型,并推动该广告的高转化率。然后,治疗组中的用户可能会很快用完广告商用于广告投放的所有预算(在这种情况下,是耐克的预算),给对照组留下较小的预算。因此,治疗组对对照组的行为有间接影响,造成溢出效应。

**随机分配可能无法平均分配重度用户。**如果您的用户群中有几个用户会产生大量的用户活动,那么随机的 A/B 分配不能保证平均分配这些用户。这可能违反了同一性假设,并使测试结果模式难以解释。

**不一致的取舍。**您的 A/B 测试可能会导致一种情况,即一个指标提高了,而另一个指标变得更差,从而导致不同业务目标之间的冲突。例如,假设您建立了一个新闻排名模型,该模型对点击诱饵标题进行惩罚(降低排名)。随着用户发现更多吸引人的内容,用户满意度可能会更高,但整体点击量可能会下降。

待遇自选。如果用户自己可以选择加入一个治疗组,A/B 测试违反了身份假设:两个组并不相同,而是治疗组由一个特定的用户子集组成,即那些更愿意参与实验的用户。在这种情况下,我们将无法判断两组之间的差异是由于治疗还是由于样本差异。

不是 A/B 测试。最后,另一个陷阱是根本不进行 A/B 测试。假设您在开发一个新的信用卡欺诈检测模型,而不是 A/B 测试新模型,在生产中您只是先用旧模型然后用新模型评估交易,如果任一模型产生足够高的分数,则认为交易是欺诈。这听起来像是一种保守的方法,但是它是不可伸缩的:如果您在一个月内构建了一个新版本的模型,而一个月后又构建了一个,以此类推,该怎么办?随着时间的推移,所有这些模型将产生巨大的维护和基础设施成本。

来源:网飞

结论

总结一下:

  • A/B 测试是 ML 生产中的一个关键部分。模型性能的微小变化会对业务指标产生巨大影响,只有在我们确信新模型更好的情况下,我们才希望推出新模型。线下测试没有定论。
  • 使用人口分割将用户分为控制组和治疗组,并使用现有模型进行控制,使用新模型进行治疗。时间分割会导致不确定的结果,因为我们无法知道变化是由新模型还是其他因素驱动的。
  • 如果 A/B 测试的 p 值低于您在实验之前设置的阈值,例如 0.01,则该测试的结果具有统计学意义。如果测试结果在统计上是显著的,你可以确信新模型确实更好。p 值可以用置换分析来计算。
  • 测试结果可能有 4 种类型的错误:类型 I(假阳性)、类型 II(假阴性)、类型 S(符号错误)和类型 M(幅度错误)。在这些错误中,S 型错误是最严重的,因为它可能会导致一个劣质模型投入生产。
  • 注意常见的陷阱,如倾听、分析瘫痪、溢出效应、重度用户的不平等分布、不一致的权衡、治疗自我选择,以及首先避免 A/B 测试。

在你走之前…

享受这个内容?在 Medium 上关注/订阅,这样你就不会错过我以后写的新帖。 成为中等会员 这样就可以无限查看文章了。并确保在LinkedIn和/或Twitter上关注我!

下潜更深的参考:

  • 实验中的挑战
  • 什么是 A/B 测试?(网飞)
  • 实验是网飞数据科学的一大焦点(网飞)
  • 解读 A/B 测试结果:假阳性和统计显著性(网飞)
  • 解读 A/B 测试结果:假阴性和权力(网飞)
  • A/B 测试中的统计显著性(以及人们如何曲解概率)
  • 运行 A/B 测试的 8 个常见陷阱

用 Optuna 调整超参数的 Kaggle 方法

原文:https://towardsdatascience.com/the-kaggle-way-to-tune-hyperparameters-with-optuna-285e59a0b95a

使用 Optuna 和一个小型项目轻松高效地优化模型的超参数

约书亚·索蒂诺在 Unsplash 上拍摄的照片

一周前,我发表了我最受欢迎的一篇文章,其中包含了一个你绝对应该知道的数据科学工具和库的列表。今天,我将讨论列表中的一个很棒的工具。

Optuna 是一个轻量级的通用工具,可以方便地为您的 ML 算法执行超参数优化。随着最新版本 3.0 的发布,我觉得这是一个很好的时机让您了解该库最突出的特性,并将其应用到一个真实的迷你项目中。

但首先,让我们讨论一下房间里的大象。

为什么 Optuna 应用如此广泛?

以下是这个工具流行的一些最重要的原因。理所当然地,我会说:

  • 这是一个独立于平台的库,也就是说——您可以在 scikit-learn、Tensorflow/Keras、Pytorch、XGBoost 等中使用它,几乎不做任何修改。
  • Optuna 使您能够在超参数优化管道中使用简单的 Python 循环和条件语句。
  • 它还允许您轻松地在代码中实现并发。
  • 最后,内置的使用各种绘图功能检查优化历史的支持非常有用。

注:

我说**“优化历史”:**是的!那是有趣的部分!没有**GridSearch**实现允许您在搜索超参数时保留您进行的所有试验的所有历史。Optuna 有,这样的推论提供了一个很大的优势。

在本教程中,我将在一个迷你项目中使用 Optuna 和 XGBoost,以便让您了解所有的基础知识。

我们开始吧👇

设置我们的项目

第一步是创建一个虚拟环境并安装 XGBoost:

pipenv shellpipenv install xgboost
pipenv install scikit-learn

然后导入我们将要使用的库,就像这样:

import xgboost as xgb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

我们将利用一个预处理过的加州住房数据集来构建一个回归模型,这是我已经准备好的(链接到最后的代码+数据集)。我们将首先以正常方式训练一个模型并计算 RMSE,然后使用 Optuna 尽可能优化我们的模型。

为 simpleXGBoost 模型定型

预处理数据集可以简单地导入:

df = pd.read_csv('preprocessed_housing.csv')

由预处理数据集授权的图像

最后,我们将继续训练一个简单的 XGBoost 模型,并计算验证 RMSE:

输出是这样的:

RMSE: 53119.69904403545

做完这些,让我们继续进入这篇文章的主要部分!

制作光学目标函数

这个目标与你从机器学*理论中回忆起来的有点不同。

Optuna 中的目标函数包含以下操作:

  • 它接受我们想要优化的不同超参数的字典
  • 模型在函数中被训练
  • 根据训练好的模型对测试/验证数据进行预测
  • 精度误差最终从功能返回

在我们的例子中,我们希望最小化我们的 RMSE 分数,所以我们返回 RMSE,然后我们将在“研究中使用它来最小化。

让我们创建一个目标函数吧!

我们的目标函数

n_trials 表示目标函数执行的每个试验,参数由**suggest_int****suggest_float**等给出。

我们可以方便地指定开始、结束和步数,以及一个**log** 参数,该参数指示我们的值是否表示对数仓。学*率超参数使用**log**,可以看到。

现在,让我们创建一个病历报告

做一项研究,并把它整合在一起

Optuna 中的研究是基于目标函数的整个优化过程。

让我们创建一个并开始调整我们的超参数!

# make a studystudy = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=500)

我们将“最小化”放在**direction**参数中,因为我们想要使用目标函数来最小化我们的 RMSE 误差。如果您正在执行分类任务,您可以使用最大化和您计算的准确度分数!

你会看到在 Google Colab 上 500 次试用不到两分钟!很了不起,不是吗?

让我们看看最好的分数和参数并打印出来:

print(f"Optimized RMSE: {study.best_value:.4f}")print("Best params:")
for key, value in study.best_params.items():print(f"\t{key}: {value}")

最后,让我们把它们放在一起:

Output:Optimized RMSE: 51774.6284
Best params:  
n_estimators: 1800  
learning_rate: 0.2982950878173913  
max_depth: 11

我会说这看起来是一个非常好的改进!

奖励实验:

最后,尝试用下面的代码片段看看优化历史是什么样子的:

from optuna.visualization.matplotlib import plot_optimization_historyplot_optimization_history(study)

您的输出应该类似于以下内容:

按作者分类的图像—优化历史图

就是这样!是时候为自己一路过关斩将而感到自豪了!

几句临别赠言…

感谢您的阅读。

我希望这个关于 mini 项目的快速教程有助于认识到使用 Optuna 与手动常规超参数优化相比所提供的绝对优势。在阅读完本教程后,我建议您尝试使用这个或另一个数据集构建新的管道。

快乐学*!:)

您可以在这里找到所有的代码以及预处理过的数据集。

我希望在我的下一篇文章中再次见到你。在那之前,请跟随我,不要错过我的下一篇文章。我确实每周都写!

我还建议成为一名中等会员,不要错过我每周发表的任何数据科学文章。在此加入👇

https://ipom.medium.com/membership/

我的另外几篇文章你可能会感兴趣:

💔1-datasets-for-your-next-data-science-project-6ef9a6f8cac6>

Lakehouse 数据架构背后的关键特性

原文:https://towardsdatascience.com/the-key-feature-behind-lakehouse-data-architecture-c70f93c6866f

了解现代表格格式及其当前状态

通常的表格格式疑点— ' 帽衫'(胡迪)、冰山、三角洲【图片由作者提供】

Data Lakehouse 是由 Databricks 论文于 2020 年 12 月提出的下一代架构。Data Lake 可以使用 Parquet 或 ORC 等开放格式运行,并利用云对象存储,但缺乏数据仓库的丰富管理功能,如 ACID 事务、数据版本控制和模式实施。今天,就现代表格格式而言,我们比以往有更多的选择。他们都旨在解决这些问题,并为湖屋架构提供动力。让我们了解一下这些表格格式给表格带来了什么…😉

为什么?拼花不够吗?🤔

数据湖以最高的成本提供了良好的灵活性。您可以在 lake 中加载(几乎)您想要的任何内容(视频、图像、JSON、CSV 等),但是治理丢失了。我们在数据湖中错过的最想要的特性是 ACID 事务。让我们通过几个例子来理解这一点:

  • 托米奇:交易要么成功,要么失败。这意味着任何读取器或写入器都不会看到任何可能导致数据处于损坏状态的部分成功的事务。
  • 一致性:从读者的角度来看,如果一个列有惟一的值,那么无论在数据源上做什么操作(对值的约束),这个值都会被保留。如果提交了一组事务:2 个读者将看到相同的数据。
  • I 解决方案:如果两个并发的事务正在更新同一个数据源,那么将会一个接一个地进行。
  • 可维护性:一旦事务被提交,它将保留在系统中,即使紧接着发生崩溃。

这是我们过去在单个数据库上拥有的东西,但是在分布式系统(在数据湖设置中)上,一切都在对象存储上,读取器和写入器之间没有隔离,它们直接在数据文件上工作,并且我们几乎没有帮助我们实现 ACID 事务的元数据。

湖边小屋的建筑采用了这种 ACID 范式,需要一种现代的表格格式。

三大现代表格格式📑

你可能已经猜到了,现代的表格格式大量使用metadata文件来实现 ACID。有了这些功能,他们可以实现不同的功能,例如:

  • 时间旅行
  • 并发读/写
  • 模式演变和模式实施

当然,存储始终独立于计算引擎,因此您可以在您喜欢的云提供商上插入任何存储模型。比如:AWS S3,Azure 博客存储,GCP 云存储。

阿帕奇胡迪

阿帕奇胡迪于 2016 年在优步创立,更专注于流媒体流程。它有内置的数据流,事务模型是基于时间线的。这一个包含了在不同时刻对表的所有操作。时间轴可以通过帽衫提交时间提供时间旅行。

  • ➕支持不同的数据接收引擎:Spark、Flink、Hive
  • ➕非常适合流式处理
  • ➕支持很多阅读引擎:AWS 雅典娜,AWS 红移,…

阿帕奇冰山

阿帕奇冰山始于 2017 年的网飞。事务模型是基于快照的。快照是文件和元数据文件的完整列表。它还提供乐观并发控制。时间旅行基于快照 id 和时间戳。

  • ➕它有伟大的设计和抽象,使更多的潜力:不依赖于火花,多种文件格式的支持。
  • ➕ It 在管理大型表上的元数据方面表现出色(例如:在+10k 分区上更改分区名)
  • ➕支持很多阅读引擎:AWS 雅典娜,AWS 红移,雪花…
  • ➖缺失和数据突变仍然是初步的

三角洲湖

Delta Lake ,2019 年开源,由 data bricks(Apache Spark 的创造者)打造。毫不奇怪,它与 Spark 深度集成,可用于读写。它现在是 Databricks 的主要产品,它的某些部分(如 Delta Engine)不是开源的。其他产品,如 Delta sharing 听起来很有前途。

  • ➕它得到了 Databricks 的支持,data bricks 是目前数据领域的顶级公司之一
  • ➖确实紧抓星火不放(尽管根据他们公布的路线图这将在 2022 年改变)

高级摘要📓

高级功能 as 19 . 02 . 2022[图片由作者提供]

一般兴趣是什么?Github 一览👀

由于所有项目都是开源的,评估兴趣和增长的一个很好的数据源是查看 Github 本身。

Github 将历史设定为 2022 年 2 月 19 日,由 star-history.com 生成[图片由作者提供]

正如我们所看到的,在主流数据用户的眼中,这些表格格式仍然非常年轻。大部分的吸引力出现在过去的两年里,当湖边小屋的概念开始出现的时候。

另一个有趣的见解是查看当前提交、拉请求和问题的数量。

Github 公开数据截至 2022 年 2 月 19 日[图片由作者提供]

如上所述,三角洲生态系统的一些功能不是开源的——这解释了与牵引相比提交数量低的原因。

每个人都是赢家,因为未来是互操作性⚙️

无论你选择哪种格式,也无论谁将赢得最终的比赛,它都在朝着正确的方向前进:我们需要在数据格式方面更加开放的标准,以实现互操作性和用例。

很高兴看到计算和阅读引擎普遍采用所有这些格式。例如,AWS 红移在 2020 年 9 月增加了对德尔塔湖和阿帕奇胡迪的支持。最*,雪花宣布支持阿帕奇冰山。

另一件好事是它们都有开源社区的支持。互操作性至关重要,因此支持这些格式的计算引擎越多,我们就越不需要选择锁定我们的东西。

迈赫迪·瓦扎又名迈赫迪欧·🧢

感谢阅读!🤗 🙌如果你喜欢这个,请在跟我来🎥 Youtube ,✍️ ,或者🔗 LinkedIn 了解更多数据/代码内容!

支持我写作 ✍️通过加入媒介通过这个链接

创建高质量标记数据集的关键

原文:https://towardsdatascience.com/the-key-to-creating-a-high-quality-labeled-data-set-b745f7636c8e

如何为注释数据的人提供最佳体验

马文·迈耶在 Unsplash 上的照片

几乎每个数据科学课程都是从一个方便标记的数据集开始的(我在看你,泰坦尼克和爱丽丝)。然而,现实世界并不那么方便。作为一名数据科学家,在你职业生涯的某个时候,你可能会被要求从一个未标记的数据集创建一个机器学*模型。当然,你可以使用无监督的学*技术,但通常,最强大的模型是由主题专家标记的数据集创建的。

你可能很幸运地将你的标签外包给一个像 Amazon Mechanical Turk 这样的系统,但是如果你正在处理高度敏感的数据,你可能需要找到内部的注释者。不幸的是,很难说服主题专家为项目手工标注数据。在本文中,我将提供几个建议来帮助您为下一个数据科学项目保护和保留有价值的注释器。

确保您的产品令人满意

为项目争取注释者的最基本步骤是与他们讨论项目的可取性。要深入了解如何确定合意性,请点击这里查看我的关于机器学*概念证明的三部分系列文章。确定你的想法是否可取的方法有很多,但我最喜欢的一种方法是建立一个演示。即使演示没有使用机器学*,当你分享演示时,你也可以确定你的产品的合意性。事实上,有时您的注释者实际上是从您的解决方案中受益的人,他们可能会“看到”解决方案的价值,从而优先考虑标记数据的时间。

我在最*的一个项目中遇到了这种情况——我的注释者实际上是产品的目标受众。我制作了一个五分钟的视频,展示了我的基于规则的模型的简单演示(不需要机器学*),并解释了我的潜在注释者的努力将如何最终消除每个人都害怕的任务。

在演示之前,我很难找到一个人来确定标记时间的优先级,在演示之后,我有 20 个人自愿注释数据。这是一件大事!这个视频非常成功,它很快就在公司里传播开来,我也不用做多次演示。

找到你的注释者的动机,你会更容易说服他们为你的产品做出贡献。

克里斯托夫·马克西米利安在 Unsplash 上拍摄的照片

有效利用注释者的时间

一旦您说服注释者为您标记数据,尽可能高效地利用他们的时间是至关重要的。不要浪费他们的时间去标注不重要的数据。如果您随机对数据进行采样,让注释器进行标记,那么它们可能会标记太多相似的项目,这可能会导致您的数据集中出现过多的项目。这不仅对您的模型不利,而且您的注释者也可能会感到恼火和/或疲劳。

照片由 Elisa Ventur 在 Unsplash 上拍摄

有各种各样的技术可以解决这个问题,但是我最喜欢的是集群技术。对数据进行聚类后,可以从每个聚类中随机抽取固定数量的数据点,以帮助确保标注器标注的数据的多样性。

为了更进一步,您可以要求您的注释器获取注释一个数据点所花费的平均时间。一旦我的注释器告诉我他们可以为标记提供多少时间,我就使用这个信息来填充我可以从每个集群中抽取的样本数量。

创建高质量的注释指南

另一种有效利用注释者时间的方法是确保您有高质量的注释指南。这对于为注释者提供平滑无缝的体验至关重要。

根据我的经验,高质量的注释指南包括以下关键部分:

  • 标签的定义——花时间定义和记录注释者将要使用的每个标签。这些定义对于确保注释者对标注任务有一个共同的理解是至关重要的。
  • 困难的例子 —当您的标注者开始标注时,他们将会遇到一些棘手的标注情况。将这些记录在您的注释指南中,并确保您包括注释者如何做出决定的解释。
  • 如何使用注释接口 —不要认为如何与你的接口交互和提供注释是显而易见的。记录从接受系统中的任务到提交后修改注释的所有事情。

注释指南应该是一个活的文档,并不断更新。此外,它们可以作为培训新注释者的一种极好的方式。

在你的注释界面上投入一些认真的时间和思想

在您在指南中记录注释接口之前,您需要确保在接口的细节上投入了大量的时间和精力。糟糕的注释接口会给注释者带来不利的体验,并最终导致更少和/或质量更差的标签。确保您提供充足的时间来测试用您的系统标记数据的实际效果。如果觉得这很痛苦,你可以保证你的注释者也会有类似的经历。

在某些行业,构建自己的注释系统是有益的。我的第一份工作就是这种情况,当时我处理的是大型时间序列数据集。

照片由米卡·鲍梅斯特在 Unsplash 上拍摄

幸运的是,现在有多种注释系统,所以您可能不需要构建定制的系统。但不要只关注系统会给你这个数据科学家提供什么。深入思考您的注释者对系统的体验,因为他们将在该系统中工作最多。

如果可能的话,在选择系统时包括您的注释者。包容会给所有人带来更好的体验。

通过生成新数据节省注释者的时间

当您开始接收注释时,您可能会发现模型训练所依据的数据中的缺口。为了帮助解决这个问题,您可以通过获取一小组注释并扩展它们来生成合成数据,以帮助您的模型掌握数据集中的各种关系。合成数据将允许您为您的模型生成更多的例子,同时利用您的注释器已经提供的标签。

这可能简单到扰乱数据,也可能复杂到使用生成性对抗网络(GANs)。现在我从来没有走 GAN 路线,但我曾使用 word2vec 处理过文本数据。您可以使用它来生成您在文本中替换的“同义词”。另一种技术是使用翻译模型将文本翻译成另一种语言,然后再翻译回原始语言。通常,结果文本与原始文本略有不同。

无需花费更多注释者时间就能扩展数据集的可能性是值得探索的。

与您的注释者分享结果

那么,如何在整个注释过程中保持注释者的积极性呢?我不是这方面的专家,但是我早期犯的一个关键错误是没有与我的注释者共享我的模型的性能结果。我会得到新的标签,建立一个新的模型,看到我的模型逐渐改进,我会非常兴奋。我甚至没有想到我的注释者可能会同样兴奋。从那以后,我了解到您应该向您的注释者展示他们的工作是如何直接影响和改进您的模型的性能的。

当注释者感觉与他们正在做的工作联系更紧密时,他们会更有动力,并提供更高质量的注释。

努力让注释过程变得有趣

现实一点,标记数据可能不是您的注释者的工作重点。为了让参与的每个人都更加享受这个过程,可以考虑举办一个标签派对。实际上,带一些比萨饼和饮料,就像你让朋友帮你搬家一样。

亚历山大·萨波日尼科娃在 Unsplash 上拍照

把注释系统放到屏幕上,把一些例子标在一起。讨论困难示例的细微差别,以帮助将知识从您的主题专家转移到您的数据科学家。您收集的见解甚至可以帮助您为您的模型构建下一个伟大的特性。

别忘了用你的发现更新你的注释指南!

结论

在每个被标记的数据集背后都有多个标注者,他们花费了无数的时间来标记数据。为了让注释者参与进来,您需要深入思考可以用什么来激励他们在标记过程之前、之中和之后看到价值。一旦他们承诺标记数据,确保你尊重他们的努力。一个高效的注释系统和高质量的指南可以帮助你做到这一点。别忘了沿途撒点乐子!

如果您喜欢这篇文章,并且想了解更多关于如何实现所讨论的概念,请查看我的工作室这里。

资源

https://medium . com/forward-data-science/lean-machine-lean-lean-running-your-proof-of-concept-the-lean-startup-way-part-1-F9 DBE bb 74d 63

R.Monarch,人在回路中的机器学*(2021),https://www . manning . com/books/Human-in-the-Loop-Machine-Learning

时间序列数据库的前景

原文:https://towardsdatascience.com/the-landscape-of-timeseries-databases-95cd7f7ee64d

纳赛尔·塔米米在 Unsplash 上的照片

数据工程

当今时间序列数据库概述

本文最后更新于 2023 年 1 月 25 日。

背景

在使用过一些重要的时间序列数据库产品,并从技术爱好者的角度探索过其他产品之后,我认为在一篇快速的文章中总结一下我所学到的东西可能会有所帮助。当我在 2017 年开始为一个同事想要建立的算法期权交易平台摆弄 InfluxDB 时,我变得喜欢上了时间序列数据库。我们进行了几天的头脑风暴。除了我摆弄 InfluxDB 激发了我对时间序列数据库的兴趣之外,没有任何结果。从那以后,我一直关注着 TSDBs 世界的最新动态。

我以前写过关于时序数据库的文章。我报道了它们空前的受欢迎程度,以及其他一些专门的,或者 AWS 喜欢称之为“T9”的专用数据库。我还谈到了一些流行数据库的具体特性,如 InfluxDB(流入线协议)、TimescaleDB(使用 TSBS 进行比较)和 QuestDB(摄取模式)。在本文中,我将介绍最流行的时间序列数据库,以及几个不是专门为解决时间序列问题而构建的、能够很好地处理时间序列问题的数据库。所以,事不宜迟,让我们开始吧。

时间系列数据库

InfluxDB

用于指标、事件和实时分析的可扩展数据存储。

InfluxDB 是一个开源数据库。到目前为止,这是世界上最流行和最常用的时序数据库。InfluxData 通过提供企业版的本地数据库和云中的 T2 来赚钱。像大多数其他 TSDBs 一样,您可以在三个主要云平台上部署 influx db—AWS、 Google Cloud 和 Azure 。

InfluxDB 还为您提供了流行用例的模板。一个有趣的用例是监控反恐精英的游戏指标,如下图所示:

图片由 Ignacio Van Droogenbroeck 提供。许可证— APLv2。

毫无疑问,在过去的几年里,InfluxDB 在时间序列数据库的加速发展中发挥了重要作用。一个这样的例子是 InfluxDB line 协议,这是一个轻量级协议,用于将时间序列数据存储和传输到时间序列数据库中。另一个主要的 timeseries 数据库 QuestDB 支持 PostgreSQL wire 协议,由于其实现和性能,它决定支持并推动 InfluxDB line 协议。

你可以在这个博客上阅读更多关于他们的旅程。

QuestDB

旨在更快处理时序数据的开源 SQL 数据库

Vlad Ilyushchenko 于 21 世纪初在金融服务行业工作,他对低延迟在金融领域的重要性有很好的认识。他启动 QuestDB 是为了创建一个大规模运行的超高速时间序列数据库。最*,Vlad 在卡内基梅隆大学数据库组谈到了 QuestDB 的架构和令人兴奋的用例:

QuestDB 的 CTO Vlad 在卡内基梅隆大学谈论 QuestDB 的架构和用例。

QuestDB 使用列结构来存储数据。QuestDB 在每一列的底部附加任何新数据,以保持所接收数据的自然时间顺序。该数据库还支持时间序列数据的关系建模,这意味着您可以编写连接并使用 SQL 查询来读取数据。

像今天的许多其他 timeseries 数据库一样,QuestDB 受到开源关系数据库巨头 PostgreSQL 的启发。就像在 Redshift 中运行大多数 PostgreSQL 查询一样,您也可以在 QuestDB 中运行这些查询。这在 QuestDB 中是可能的,因为它支持 Postgres 有线协议。这种 Postgres 兼容性也意味着您用来连接 PostgreSQL 的大多数驱动程序也可以与 QuestDB 一起工作。你可以在这里找到 QuestDB 的 PostgreSQL 兼容性的优点和局限性。

已经有一段时间了,但是我写了关于使用 TSBS(时间序列基准测试套件)进行基准测试 QuestDB & TimescaleDB 性能的文章。实际上,您可以使用 TSBS 来比较大多数时间序列数据库。这是 GitHub 的回购协议。

时间刻度 B

开源时序 SQL 数据库,针对快速接收和复杂查询进行了优化。它被打包成一个 PostgreSQL 扩展。

PostgreSQL 的一大特点是它的可扩展性。许多令人惊叹的数据库都建立在 PostgreSQL 之上,这并不是巧合。比如红移就是一个。TimescaleDB 是众多例子中的另一个。TimescaleDB 本质上是 PostgreSQL 之上的一个包扩展,解决时间序列数据的特定读写模式。在下面的视频中,Erik nord strm讲述了 TimescaleDB 的工作原理,以及它与其他竞争对手相比的优势:

从 PostgreSQL 构建 TimescaleDB。

TimescaleDB 可以下载并自托管。它也可以通过多云管理平台 Aiven 托管在您选择的平台上的云中。我已经讨论了 AWS 上针对本文中讨论的许多数据库的不同部署选项:

https://aws.plainenglish.io/timeseries-databases-on-aws-236677f739db

TimescaleDB 还提供了 Promscale ,一个为 Prometheus 高效处理 OpenTelemetry 数据的数据库后端。你可以在官方博客的上了解更多关于 TimescaleDB 与 PostgreSQL 和其他产品的不同之处。

kdb+

这是独一无二的。kdb+是一个支持关系建模和内存计算的柱状时序数据库。在高科技金融交易行业已经有相当一段时间的知名度了。kdb+是用一种很少使用的编程语言 k 编写的,这种语言以其数组处理能力而闻名。查询语言也是基于 k 的一个变体,称为 q。在本教程中,您可以亲自了解这两种语言的深奥本质。

老实说,我不知道谁在或曾经在 kdb+上工作,但这说明这是一个远离主流的小众产品。你会发现足够多的公司将它与不太常见的架构模式一起使用,比如这里描述的,它涉及将 Amazon FSx for Lustre 与许多 EC2 实例、S3 桶等一起使用。,用于 kdb+的服务,如 Tickerplant、实时数据库、历史数据库、复杂事件处理(CEP)和网关。类似的架构在 Azure、 Google Cloud 和 Digital Ocean 上也是可能的。

https://databricks.com/blog/2021/05/25/time-series-data-analytics-in-financial-services-with-databricks-and-kx.html

Databricks 与 kdb+合作,使用 Spark 实现了超快速的金融时间系列数据分析。您可以使用几个选项将 Databricks 与 kdb+结合使用,包括 PyQ、Databricks APIs、使用 JDBC 的联邦查询等。数据库排名网站 db-engines.com 在时间序列数据库类别中排名第二,仅次于 InfluxDB。虽然我有理由怀疑你在下一份工作中是否需要 kdb+-

德鲁伊

Druid 不一定只是一个 timeseries 数据库,而是通常用于对时序数据进行超快速聚合。因此,Druid 更适合作为基于时间的分析数据库。正因为如此,德鲁伊的架构壮举在于它所服务的各种用例。一些用例与 InfluxDB 和 TimescaleDB 等时间序列数据库重叠,例如网络遥测分析和应用性能分析。由于这种重叠,Druid 组合了一个数据仓库、一个时间序列数据库和一个搜索系统。

https://www.rilldata.com/blog/guide-to-apache-druid-architectures

它的核心重点是成为一个具有列存储、实时和批量接收能力的分布式 MPP 系统,这对于您的数据工程堆栈来说是一个令人兴奋的工具。对于超快速查询,Druid 使用压缩位图索引和基于时间的分区来删除不需要的数据。Druid 使用基于 JSON 的查询语言,类似于您可能在 MongoDB 或 Cassandra 中看到的。尽管如此,因为每个人都知道 SQL 并使用 SQL 与数据交互,所以 Druid 还提供了 Druid SQL,这是一个在原生查询引擎之上的包装器。

像网飞、Airbnb、Salesforce、Booking、Appsflyer、Criteo 和 PayPal 这样的公司在生产中使用 Druid。这里有一个来自网飞科技博客的案例研究,讲述了他们如何将德鲁伊与卡夫卡结合使用,以实时传递洞察力:

https://netflixtechblog.com/how-netflix-uses-druid-for-real-time-insights-to-ensure-a-high-quality-experience-19e1e8568d06

我还建议由罗曼·莱文托夫撰写的另一篇博文,讨论德鲁伊、皮诺和点击屋之间的区别。

结论

时间序列数据库非常适合许多用例,尤其是当默认情况下数据具有自然的时间顺序时。由于这种需求,时不时需要支持的时间序列数据库的数量有所上升。这也导致一些云平台推出了他们的 timeseries 数据库,部分或全部受到了开源数据库的启发。在接下来的几年中,我们将会看到更多的应用出现在 timeseries 数据库领域。作为一个 SQL 人,我可能会有偏见,但我确实认为大多数 timeseries 数据库会尝试支持 ANSI SQL 标准。让我们看看。

如果你觉得我的文章有用,请订阅并查看我的文章🌲 Linktree 。你也可以考虑通过使用我的推荐链接购买中级会员来支持我。干杯!

外行人对计算机视觉的介绍

原文:https://towardsdatascience.com/the-laypersons-introduction-to-computer-vision-858f86bb10ba

作者创建的标题图像

外行人对计算机视觉的介绍

对计算机视觉背后的概念的浅显介绍,便于任何观众理解

除了作为一名机器学*工程师,我还以许多不同的身份志愿促进数据科学和机器学*。我目前工作的公司(State Farm)与当地高中有合作关系,以推广他们的 STEM 项目。在我志愿服务的高中,学生有机会在整个高中四年中参加特殊课程,最终与当地社区大学合作获得计算机科学的副学士学位。非常酷!

从他们大一开始,我就和他们在一起,现在他们已经进入了大三的第二学期。因此,他们的老师要求学生想出潜在的计算机科学项目来造福他们的学校。我所在的小组有一个想法,用计算机视觉来帮助解决停车场交通的拥堵问题。为了简洁起见,我不会在这篇文章中谈论他们的项目,但不用说,我真的很欣赏这些学生的创造力!

现在,我将完全诚实:在承担通过他们的项目指导这些人的责任之前,我对计算机视觉的知识相当有限,但我接受了它,因为我不仅希望看到这些学生成功,而且我也认为这是我自己学*计算机视觉的一个很好的机会。绝对期待看到未来的博客帖子深入这个主题的技术细节!

不过现在,我认为就这个主题写一本介绍性的入门书是有益的,这样我的高中同学就可以在用代码执行它之前对计算机视觉空间有一个更好的概念性理解。虽然这显然是一群聪明的学生,但我以这样一种方式写了这篇文章,希望任何人都能对计算机视觉如何工作有一个概念性的理解。因此,即使你没有任何机器学*甚至计算机科学的经验,也不用担心!随着本文的深入,我们将介绍数据科学社区的常用术语,我将确保以任何人都可以轻松掌握的方式来定义这些术语。

事不宜迟,让我们从一般的机器学*谈起吧!

机器学*是如何工作的?

在我们开始讨论计算机视觉之前,最好先打好机器学*的基础,因为计算机视觉是机器学*的一个“子类”。(如果你想了解所有这些人工智能的子类别是如何相互关联的,我的私人朋友 Raj Ramesh 博士在 YouTube 上有一个精彩的视频,用不到五分钟的时间解释了这个问题。看看吧!)机器学*(ML)通过执行复杂的数学算法/模型——或者我喜欢称之为“奇特的数学”——来寻找数据中的模式。该模型从随机输入开始,随着模型继续梳理新数据,它会改变自己——或“学*”——以更好地概括该数据的模式。在 ML 社区中,我们将这个过程称为将数据拟合到模型以训练模型,或者简称为“模型训练”。

有许多不同的数学算法,我们可以用许多不同的方式使用这些算法来促进不同种类的用例。一种非常常见的通用用例被称为“监督机器学*”在有监督的机器学*中,计算机在大量数据中寻找与提供的目标相匹配的模式。例如,如果我想建立一个预测性的 ML 模型来预测明天的天气,我会根据过去几个月或几年的天气数据来训练模型。数据将包括气压、温度、风速等,目标将是“晴天”、“多云”或“下雪”。

根据这些历史数据对模型进行正式训练后,我们可以输入关于今天天气的新信息来推断新的结果。例如,如果我输入温度为 20 华氏度、降水几率为 80%的数据,模型可能会推断出今天的天气是“下雪”的结果请记住:这是一个推断的结果,或者换句话说,这只是一个猜测。当然,这些 ML 模型通常被训练得非常准确,所以推断(或者猜测,如果你愿意)比随机的掷硬币好得多。人们常常希望他们的 ML 模型在 99.99%的时间里正确地预测一个推论。很难有比这更准确的了!

随着 ML 算法变得越来越复杂,人们开始将这些特殊的复杂算法称为深度学*。深度学*是一组计算复杂得多的标准 ML 算法版本。深度学*有很多不同的应用。如果你熟悉 Siri 或 Alexa 等语音助手,它们都利用了一套称为自然语言处理(NLP)的深度学*算法。当然,计算机视觉也是深度学*的另一个应用。计算机视觉普遍存在于自动驾驶汽车、图像分类器等事物中。

接下来,让我们更具体地谈谈计算机视觉,以及它如何以神经网络的形式表现出来。

什么是神经网络?

为了在图像或通用语言等非常复杂的数据中找到模式,人们开发了这些计算、数学节点网络,通常称为神经网络。它们被称为神经网络的原因是这些节点被比作人脑中神经元之间的相互作用。如果你不熟悉大脑生理学,神经元与一个神经元“纠缠”在一起,并输出微小的电信号,这些电信号聚集在一起形成思想等东西。虽然这个类比可能有点天真,因为我们还没有完全理解大脑,但它仍然是一个公平的类比。下面是一张 GIF 图,说明了大脑中的神经元是如何工作的。

哈佛大学在 GIPHY 平台上以 GIF 格式维护的动画

开发这些神经网络的人认为,如果你通过这些节点层传递信息,你可以找到小的数据模式,这些模式最终聚集在一起形成越来越大的模式。看看下面的动画 GIF:

由 3Blue1Brown 制作并在 gfycat 上存储为 GIF 格式的动画

这里的动画是由 YouTube 的创作者 3Blue1Brown 创作的,他在他的频道上有一系列精彩的视频解释神经网络。这个动画实际上是计算机视觉的一个应用,其中神经网络可以查看手写数字的图像,以确定哪个数字是实际书写的。我们将进一步讨论与计算机视觉相关的更具体的部分,但现在,请注意这个神经网络中圆圈的垂直列。每列圆圈代表一层节点,请注意,每个节点都与网络中上一层和下一层的所有其他节点相连。神经网络有多层这些节点的原因是,每一层都提供关于从前一层发现的模式的新信息。

由 3Blue1Brown 制作并在 gfycat 上存储为 GIF 格式的动画

考虑一下上面动画中的手写 9。你如何描述数字 9 的形状?我可能会说,你可以在顶部看到一种椭圆形或圆形,从圆形右侧向下伸出的通常是一条直线或一条有点像字母“J”的曲线。随着这个图像在整个神经网络中传递,计算机继续构建这些模式,最终组装成整数。举例来说,第一层可能只识别出构成数字 9 顶部的“圆”的一条小曲线。下一层可能会将“圆”的这些曲线放在一起形成整个圆,然后另一层可能会将“圆”与向下的“J”块配对,最终形成数字 9。(很难用文字来解释这一点,所以再次强调,如果你想从更直观的角度理解这一点,我肯定会推荐你观看 3Blue1Brown 的视频系列。)

还记得上一节的监督学*吗?这个特定网络的训练方式是,在训练期间,一组手写数字的图像与数字实际确定的目标标签一起被输入到神经网络中,因此这是监督深度学*模型的一个经典例子。显然,有很多非常复杂的数学东西我在这里没有谈到,但这里要记住的想法是我们可以通过向深度学*模型提供图像以及它们的相关标签来训练计算机视觉模型

正如我在本节开始时提到的,有各种各样的神经网络,特别是,有一种非常特殊的神经网络用于计算机视觉应用。这些神经网络被称为卷积神经网络,所以我们在下一节中详细讨论这些!

我们如何将卷积神经网络用于计算机视觉

随着我们在这篇文章中的进展,你可能会想,“我们如何将图像转换成可以输入神经网络的东西?”考虑一下你阅读这篇文章的设备,不管是智能手机、平板电脑还是电脑。你的设备的屏幕是由所有这些被称为像素的超级小灯组成的。这是一张显微镜下屏幕上像素的图片:

翁贝托在 Unsplash 上拍摄的照片

一个像素由三个颜色通道组成:红色、蓝色和绿色(RGB),你可能会惊讶地发现,你可以产生几乎任何人眼可察觉的颜色。因此,正如我 5 岁的女儿会高兴地告诉你,红色和蓝色(而不是绿色)构成紫色。😂这些 RGB 通道中的每一个都表示为一个数字,所以你现在使用的设备中的 CPU 正在告诉你设备上的所有像素以某种方式点亮,以产生你现在正在阅读的文本。

这样,我们可以通过解析与每个像素相关的所有 RGB 颜色通道,将任何图像转换为数值。这里有一个问题:任何现代屏幕都有很多像素。例如,标准 4K 电视的分辨率为 3840 x 2160。将这两个数字相乘,那就超过了惊人的 800 万像素!因此,如果你试图向一个标准的神经网络输入这么多像素,大多数计算机都会在试图处理这么多信息时陷入停顿。

也就是说,人们已经开发了这种称为卷积神经网络的神经网络子类。卷积神经网络通过减少在神经网络的每一层中寻找模式所需的信息量来寻找图像等事物中的模式。我们减少信息量有两个原因。首先,它让计算机更容易处理这些信息,其次,研究人员发现,无论如何,没有必要拥有每一点点信息。考虑下面的动画:

丹尼尔·努里创作并存储在 GIPHY 上的动画(来源)

在卷积神经网络中,一个层应用各种“过滤器”(由移动的黄色框表示)来概括来自原始图像(用绿色表示)的信息位,以形成更简单的“卷积特征”(用粉色表示)。这些卷积滤波器被设计用来做各种事情,因此一些滤波器更擅长识别图像中的水平线,而其他滤波器更擅长识别垂直线。出于说明目的,我对其进行了简化,但显然有两种以上不同的卷积滤波器。

所以,让我们把所有的知识放在下图中:

作者创作的汽车和设计图像

在这个例子中,卷积神经网络被训练来识别汽车图像。请注意,当图像通过网络中的每一层时,信息是如何减少到更易于计算机计算的程度,同时保持信息的完整性几乎完好无损。同样,我们在这里保持事情简单,但是这里的要点是,通过使用我们的“奇特的数学”算法跨越图像的像素值,我们可以在图像中找到模式,以形成我们试图推断的任何类型的目标

如果你想知道这如何适用于视频,请记住视频只是一系列快速有序显示的图像。如果你像我一样玩视频游戏,你可能会熟悉“每秒帧数(FPS)”的概念。在 PlayStation 4 / Xbox One 一代中开发的大多数游戏都以 30FPS(每秒 30 帧)的速度显示,因为较新的 PlayStation 5 / Xbox Series X 的计算效率要高得多,所以许多较新的游戏都提供了 60FPS(每秒 60 帧)的选项,许多游戏玩家都很欣赏这一点,因为它使视频看起来更流畅。(有趣的事实:大多数电影都是以 24FPS 拍摄的。)

包扎

我们可以用计算机视觉做很多很酷的事情。我们可以训练这些非常复杂的计算机视觉模型来识别图像中的许多对象。这是实现自动驾驶汽车等事物的基础,自动驾驶汽车可以识别如上图所示场景中的所有对象,以安全地驾驶汽车到达目的地。

正如我在介绍中提到的,我正在从事将利用计算机视觉的项目,所以如果你想学*更多关于实际创建计算机视觉模型的知识,请继续关注关于这方面的未来博客帖子!希望这篇文章对你有所帮助。我个人认为这太酷了,人类能够思考这些非常复杂的问题,并用复杂的数学来解决它们。感谢阅读,下一篇文章再见!

慵懒的断奏浓缩咖啡

原文:https://towardsdatascience.com/the-lazy-staccato-espresso-34aa743bed96

咖啡数据科学

双重研磨和粗筛:浓缩咖啡的另一种选择

不连续浓缩咖啡的挑战之一是筛选需要时间。我已经研究了多种方法来减少工作流程时间,并且仍然获得了一些断奏的好处。这个想法来自于我对双面研磨的一些研究。

典型的双磨会先磨粗(小生零点设置 50),然后再磨细(设置 8)。通常,当设置为 50 时,10%到 20%的粉末会比其余部分更细(直径小于 500 微米)。我之前提出理论设置 50 产生的微粒来自咖啡豆内部,因为它们更软。这就产生了从里到外不连续浓缩咖啡,但是这种方法仍然需要大量的筛选。

那么,如果你粗磨,用更大的孔径如 500 微米或 600 微米过筛,然后把筛上的东西磨得更细呢?筛选会快得多。所以,我们来试试吧。

所有图片由作者提供

我把设置调成了 50,我甚至能把它调到 30。罚款的数量增加了,但我不需要在表盘上做这么多的改变,因为我变得更精细了,这通常需要每 10 次设置改变就停止/研磨几个部分。

我快速看了一下粒子分布,以便从粒子大小上更好地理解这张照片。这是针对在烘焙前后添加了水分的咖啡混合物,因此它会磨得更细,通常设置为 0。我做了几次测试。

过程

我从设置 50 或 30 开始粗磨。

对于这些测试中的一些,我也去除了干扰,因为它是如此直截了当地吹掉它。这无助于公平的比较,但我的目的是拍出最好的照片。当我用 500 微米的筛筛咖啡渣时,我轻轻地吹掉了谷壳。

左:研磨咖啡,中:经过一些筛选后,谷壳沉淀在顶部,右:谷壳去除后,筛选结束。

然后我把 500 微米的上等咖啡放在第 8 档,我把它放在最上面。

绩效指标

我使用两个指标来评估技术之间的差异:最终得分和咖啡萃取。

最终得分 是记分卡 7 个指标(尖锐、浓郁、糖浆、甜味、酸味、苦味和回味)的平均值。当然,这些分数是主观的,但它们符合我的口味,帮助我提高了我的拍摄水平。分数有一些变化。我的目标是保持每个指标的一致性,但有时粒度很难确定。

用折射仪测量总溶解固体量(TDS),这个数字结合咖啡的输出重量和输入重量用于确定提取到杯中的咖啡的百分比,称为提取率(EY)** 。使用均方根(RMS)距离将这两者结合起来,得到强度半径,这有助于比较不同比率的提取质量。**

设备/技术

浓缩咖啡机:金特快

咖啡研磨机:小生零

咖啡:家常烘焙咖啡,中杯(第一口+ 1 分钟)

输液:压力脉动

过滤篮 : 20g VST

其他设备: Atago TDS 计、 Acaia Pyxis 秤

表演

我做了一些配对拍摄,看看它如何对断奏咖啡表现。我发现它与断奏浓缩咖啡不相上下,而且似乎可以在厨房里用便宜的筛子做一些事情。我看了几个烤肉做对比。

注意拍摄时间缩短了很多。

同样,水在缓慢的断奏中流动得非常快。这意味着咖啡豆内部的细小颗粒与其他咖啡粉之间的相互作用减缓了流动,而这种作用在它们被分离时不会发生。

同样,模式继续,但懒惰的断奏仍然只是缺乏筛选断奏。

我很惊讶断奏和懒惰断奏之间的味道差异如此相似。我特别惊讶的是 EY 更高。这似乎表明,断续发射的真正好处是将内豆细粒与较大的颗粒分开。他们肯定更柔软,更容易化为尘土。

我认为这个实验不仅仅是一个奇怪的实验,更确切地说,我认为它表明我们对咖啡中的微粒知之甚少。我们将咖啡豆视为同质结构,但事实并非如此。我们将细颗粒视为同质的,而它们并非如此。那么,这将如何影响我们煮咖啡的方式呢?我认为这暗示了一些学*的机会:

内部和外部微粒的颗粒分布有何不同?

内细和外细如何提取?此外,它与外部中音和粗调相比如何?

-这可以通过使用废咖啡渣的实验来回答,该实验类似于使用不同研磨尺寸的实验。

内部和外部的细颗粒是否以不同的方式流动和/或引导?

-这可以通过在断奏击球中用另一个替换内/外罚分来实现。

这也能解释为什么涡轮增压能起作用吗?目前还不清楚为什么涡轮丸会有更高的提取率,但通过研磨更粗,大多数细粒应该来自咖啡豆的内部而不是外部。

-这也可以通过替换涡轮弹丸中的粉末来进行试验。

最后,断奏和懒惰断奏之间的配对比较可以表明懒惰断奏更好或者相同。对于商业实施,带有筛子的双研磨机很可能比单研磨机和自动筛子更快。惰性断奏对于在自动机器和商业环境中实现可能更实用。

如果你愿意,可以在推特、 YouTube 和 Instagram 上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。也可以关注我在中和订阅。

我的进一步阅读:

我未来的书

浓缩咖啡系列文章

工作和学校故事集

个人故事和关注点

乐高故事启动页面

摄影飞溅页面

使用图像处理测量咖啡研磨颗粒分布

改进浓缩咖啡

断奏生活方式概述

测量咖啡磨粒分布

咖啡萃取

咖啡烘焙

咖啡豆

浓缩咖啡用纸质过滤器

浓缩咖啡篮及相关主题

意式咖啡观点

透明 Portafilter 实验

杠杆机维护

咖啡评论和想法

咖啡实验

似然比检验

原文:https://towardsdatascience.com/the-likelihood-ratio-test-463455b34de9

通过 R 中的一个实例直观地解释了似然比检验

克里斯·布里格斯在 Unsplash 上的照片

本文使用的所有图片均由作者创作,除非另有说明

似然比检验(LRT)是一种统计检验,用于根据两个模型的似然比来比较它们的拟合优度。本文将使用 LRT 来比较两个旨在预测一系列硬币翻转的模型,以便直观地理解 LRT 是什么以及它为什么有效。我将首先回顾一下可能性和的概念,我们如何找到一个参数的值,在这种情况下,翻转头部的概率,这使得观察我们的数据最有可能。然后,我将展示添加独立参数如何扩展我们的参数空间,以及在某些情况下,一个简单的模型如何构成一个更复杂模型的子空间。最后,我将讨论如何使用维尔克定理来评估一个更复杂的模型是否比一个更简单的模型更适合数据。

我嵌入了用于生成本文中所有图形的 R 代码。

抛硬币

让我们从随机抛 25 美分硬币开始,抛正面的概率θ未知:

p(人头)= θ

让我们把硬币翻转十次:

我们翻转它十次,得到 7 个正面(表示为 1)和 3 个反面(表示为 0)。

我们想知道什么参数θ使我们的数据,上面的序列,最有可能。为了找到θ的值,即翻转头部的概率,我们可以计算在给定特定θ值的情况下观察到该数据可能性*。从数学上讲,我们将观察到数据 d 的可能性表示为:L(d|θ)。我们想找到使 L(d|θ)最大化的θ的 to 值。*

凭直觉,你可能会猜测,因为我们有 7 个头和 3 条尾巴,所以我们对θ的最佳猜测是 7/10=.7

让我们写一个函数,通过计算我们在参数空间θ中看到一些可能值的特定头尾序列的可能性,来检验这种直觉。由于每一次硬币投掷都是独立的,观察到特定硬币投掷序列的概率是观察到每一次单独硬币投掷的概率的乘积。在下面的函数中,我们从可能性 1 开始,每次遇到正面,我们就用可能性乘以正面的概率。每当我们遇到一条尾巴,我们就乘以 1 减去翻转头的概率。

既然我们已经有了一个函数来计算观察到一系列抛硬币的可能性,给定一个θ,即正面的概率,让我们来绘制几个不同θ值的可能性。

在此图中,我们可以看到,当θ等于 0.7 时,观察数据的可能性最大。我们已经证实了我们的直觉,当θ= 0.7 时,我们最有可能看到数据序列

现在让我们做同样的实验,掷一枚新硬币,例如一便士,同样是正面着地的概率未知。我们可以将我们对 25 美分硬币和 1 美分硬币的翻转组合起来,形成一个 20 次翻转的单一序列。

如果我们不知道硬币是不同的,我们按照我们的程序,我们可能会更新我们的猜测,并说,因为我们有 20 个头像中的 9 个,当我们让头像的概率为. 45 时,我们的最大可能性就会发生。我们用下图来证实我们的直觉。

在上面的场景中,我们用一个θ模拟了两个硬币的翻转。也许我们可以通过增加一个额外的参数来改进我们的模型。如果我们知道有两个硬币,并且知道我们什么时候去翻转它们,会怎么样?然后,我们可以尝试使用两个参数来模拟这一系列的翻转,每个硬币一个参数。添加一个参数也意味着向我们的参数空间添加一个维度。让我们想象一下新的参数空间:

上图显示了在给定两个参数的不同值的情况下,观察我们的数据的可能性。观察使用一个参数相当于说 quarter_θ和 penny_θ的值相同。在上图中,quarter_θ和 penny_θ沿对角线相等,因此我们可以说单参数模型构成了双参数模型的子空间。在这种情况下,子空间沿着对角线出现。如果我们将上面的图沿对角线切片,我们将重新创建原始的二维图。

上面的图形与我们假设硬币和便士有相同的正面着地概率时生成的图形相同。我们可以把自己想象成比较两个模型,其中基础模型(掷一枚硬币)是一个更复杂的完整模型(掷两枚硬币)的子空间。

为了直观地显示当我们添加一个参数时,我们观察到数据的可能性有多大,让我们在上图中绘制两参数模型的最大可能性。

在这种情况下,添加第二个参数使得观察我们的 20 次抛硬币序列更有可能。

从似然到似然比检验

我们可以在上面的图表中看到,在双参数模型中观察到数据的可能性比在单参数模型中高得多。然而,如果我们掷的每一枚硬币都有相同的正面概率呢?那么添加第二个参数可能没有好处。那么,我们如何量化地确定添加一个参数是否会使我们的模型更好地拟合数据呢?自然的第一步是获取似然比:它被定义为简单模型的最大似然比复杂模型 ML_simple/ML_complex 的最大似然T3 的比值

让我们也为我们的例子定义一个零假设和另一个假设:

**零假设:**硬币正面概率=硬币正面概率

**备选假设:**正面四分之一的概率!概率头便士

双参数模型的 ML 与单参数模型的 ML 的似然比是:LR = 14.15558

基于这个数字,我们可能会认为复杂模型更好,我们应该拒绝我们的零假设。但是我们还在用眼球直觉。为了进一步量化这一点,我们需要借助维尔克定理,该定理指出,当零假设为真时,随着样本大小(本例中为翻转次数)接*无穷大,2log(LR)呈卡方分布。(在这里阅读维尔克定理的局限性)。根据维尔克定理,我们将似然比检验统计量定义为:λ_ LR = 2[log(ML _ null)log(ML _ alternative)]

为什么似然比检验统计量是卡方分布?首先回忆一下卡方分布是 k 个独立的标准正态随机变量的平方和。下面是不同自由度(k 值)的卡方分布图。

我们如何转换我们的似然比,使其遵循卡方分布?首先,请注意,在上面的柱状图中,我们的每个参数图都是*似正态分布的,因此我们有正态随机变量。我们可以通过取对数把比率变成总和。

这样做得到 log(ML _ alternative)log(ML _ null)。

但是我们不想要正态的 R.V .我们想要正态变量的平方。

log[ml_alternative2]−log[ml_null2]

根据对数法则,我们得到:

2∫[log(ML _ alternative)log(ML _ null)]

或者是维尔克所使用的形式

-2[log(ML _ null)-log(ML _ alternative)]

维尔克定理告诉我们,上述统计量将渐*地服从卡方分布

让我们用抛硬币的例子来实践这一点。

首先让我们写一个函数来抛硬币,正面着地的概率为 p。我们还将创建一个名为翻转的变量,在 1000 个独立的实验中模拟硬币翻转 1000 次,以创建 1000 个 1000 次翻转的序列。

现在让我们来纠正一个函数,它计算给定数量的参数的最大似然。这个函数的工作原理是将数据分成均匀的块(把每个块想象成代表它自己的硬币),然后计算在每个块中观察到数据的最大可能性。例如,如果给定该函数十次翻转的序列:1,1,1,0,0,0,1,0,1,0,并被告知使用两个参数,则它将返回与前五次翻转(五次中的三次头部= .6)和后五次翻转(五次中的两次头部= .4)的最大似然估计相对应的向量(. 6,.. 4)。如果我们传递相同的数据,但告诉模型只使用一个参数,它将返回向量(. 5),因为我们有 10 次翻转中的 5 次翻转。

现在我们需要一个函数来计算在给定 n 个参数的情况下观察我们的数据的可能性。该函数的工作原理是根据参数的数量将数据分成均匀的块,然后计算在给定参数值的情况下观察到每个序列的可能性。例如,如果我们将序列 1,1,0,1 和参数(. 9,.. 5)传递给此函数,它将返回 0.2025 的可能性,这是通过计算得出的:假定着陆头的概率为 0.9,观察到两个头的可能性为 0.81,假定着陆头的概率为 0.5,则一个尾巴接着一个头着陆的可能性为 0.25。由于这些是独立的,我们将每个可能性相乘,得到观察数据的最终可能性,给定我们的两个参数. 81 x .25 = .2025。

现在我们写一个函数来求似然比:

最后,我们可以编写一个函数,根据一组数据(我们在下面的函数中称之为翻转)和两个不同模型中的参数数量返回似然比检验统计量,从而将所有这些放在一起。

现在我们准备证明似然比检验统计量是渐*卡方分布的。让我们在 1000 次实验中,每次实验投掷硬币 1000 次,然后绘制测试统计值的频率直方图,比较 1 参数模型和 2 参数模型。

下面的密度图显示了以 1 个自由度收敛到卡方分布。

如果我们比较一个使用 10 个参数的模型和一个使用 1 个参数的模型,我们可以看到检验统计量的分布变化为自由度等于 9 的卡方分布。

上图显示了检验统计值是卡方分布的。回到硬币和便士的例子,我们现在能够准确地量化双参数模型比单参数模型更好的拟合。回想一下我们的似然比:ML_alternative/ML_null 是 LR = 14.15558。如果我们取 2[log(14.15558 ),我们得到一个测试统计值 5.300218。

我们可以使用卡方 CDF 来查看,假设零假设为真,则在该值下有 2.132276%的机会观察到似然比统计数据。所以在这种情况下,当α为 0.05 时,我们应该拒绝零假设。

上图显示,假设零假设为真,并且每枚硬币与正面硬币有相同的落地概率,我们只会在大约 2.13%的时间里看到 5.3 的测试统计。

结论

本文使用模拟一枚或多枚硬币翻转的简单示例来演示如何使用似然比检验来比较两个模型对一组数据的拟合程度。我们讨论了模型“嵌套”的含义,考虑了在一个硬币对两个硬币的假设下,对一组硬币翻转进行建模的情况。最后,我们实证研究了维尔克定理,以证明 LRT 统计量是渐*卡方分布的,从而允许 LRT 作为一个正式的假设检验。

SHAP 的局限性

原文:https://towardsdatascience.com/the-limitations-of-shap-703f34061d86

特征依赖、因果推理和人类偏见如何影响 SHAP

维基·西姆在 Unsplash 上的照片

SHAP 是最流行的 IML/XAI 方法。这是一种用来理解我们的模型如何做出预测的强大方法。

但是不要让声望说服你。

SHAP 仍然有局限性。使用这种方法做结论时,你需要记住它们。

我们将讨论 4 个重大限制:

  • 第一个来自 SHAP 方案本身
  • 第二个来源于 SHAP 值的计算方式——我们假设特征独立
  • 第三个来自于我们如何使用它们——不是为了因果推断
  • 最后一点来自于人类如何使用它们——我们编造故事

1)SHAP 一揽子计划

第一个与 SHAP 方案本身有关。内核 SHAP 在理论中是一种模型不可知的方法,但这并不意味着它在实践中是模型不可知的。为什么?嗯,因为它还没有在所有的包中实现。

就我个人而言,我用了 5 个建模包:Scikit learns,XGBoost,Catboost,PyTorch 和 Keras。记住,如果你正在使用一个不太流行的建模框架,你可能会有一些麻烦。即使是在深度学*方面,SHAP 也可能相当善变。我费了很大劲才让它和 PyTorch 一起工作

2)特征依赖性

特征依赖是指两个或多个模型特征相关联。也就是说,一个特性的值取决于另一个特性的值。SHAP 在两个方面受到特性依赖的影响。

首先是 SHAP 值的*似值。以 KernelSHAP 为例。这种方法的工作原理是置换特征值并对这些置换进行预测。一旦我们有足够的排列,Shapley 值使用线性回归估计。问题是,当置换特征时,我们假设它们是独立的。

像许多其他基于排列的解释方法一样,当特征相关时,Shapley 值方法受到包含不切实际的数据实例的影响。

克里斯托弗·莫尔纳尔

这个假设并不总是正确的。取图 1公里行驶车龄散点图。这些特征用于预测二手车的价格。有明显的相关性。汽车越旧,我们就有越多的时间来增加它的里程。

图 1:行驶里程与车龄的散点图(来源:作者)

现在拿图 2 中的红色观察来说。这辆车有 10 年历史了。这个时代的汽车将在实心椭圆内行驶一定距离。当模型被训练时,它只“看到”这些真实的观察结果。

图 2:随机抽样的问题(来源:作者)

然而,当计算 SHAP 值时,我们在它们的整个范围内置换特征。对于 **km_driven,**这包括虚线范围内不切实际的观察。我们希望模型能够根据这些观察结果做出预测。这可能导致不可靠的预测和 SHAP 值。

在解释 SHAP 图时,特征依赖性也会导致一些混乱。例如,一个模型可以使用原产国来预测患皮肤癌的几率。有些国家的人是不是先入为主?防晒霜更贵吗?不,是每个国家不同程度的日照。

原产国被称为代理变量。为什么一个模型会使用它们,这可能不是很明显。归根结底,这是因为机器学*只关心相关性,代理变量与事件的真正原因相关。这就引出了第二个限制。

3)因果推理

SHAP 值不能用于因果推断。这是找到事件/目标的真正原因的过程。SHAP 值告诉我们每个模型特征对预测的贡献。它们没有告诉我们这些特征是如何影响目标变量的。这是因为模型不一定能很好地代表现实。

Shap 并不是衡量“一个给定的特性在现实世界中有多重要”的指标,它只是简单的“一个特性对模型有多重要”。—吉安卢卡·祖恩

预测可能不正确。在这种情况下,SHAP 值将对与真实目标不同的预测做出贡献。如上所述,即使模型是 100%准确的,它也可能使用代理变量。所有这些都意味着我们不应该做出超越模型的结论。即使这样做很诱人…

4)人为错误

从技术分析到占星术,人类喜欢寻找并不存在的模式。数据科学也不例外。

在分析 SHAP 价值观时,我们可能会编造虚假的故事。为什么模型预测癌症发病率高?肯定是帽子不流行了!

我们可以把这些故事强加到分析中,即使它们来自模型的怪癖。作为确认偏差的结果,我们可以无意识地这样做。它也可以被恶意地用来支持一个对某人有利的结论。这类似于 p 黑的过程。我们烧毁我们的数据和模型,直到它们给出我们想要的结果。

确认偏差——无意识地偏向于确认你先前已有信念的信息

最后,所有这些局限性应该会增加你对使用 SHAP 得出的结论的怀疑。该结论可能基于不正确的特征独立性假设。永远不要接受超出模型的结论——尤其是如果它支持一个不可告人的动机。

我们从总体上审视了 SHAP 的局限性。不同的*似方法有其特定的局限性。比如 KernelSHAP 就慢。TreeSHAP 更快,但它不是模型不可知的。我们将在下面的文章中讨论这些和其他考虑事项。

支持我成为我的 推荐会员 :)

https://conorosullyds.medium.com/membership

|Twitter|YouTube|时事通讯 —注册免费参加 Python SHAP 课程

参考

南伦德伯格,SHAP*【2021】*https://github.com/slundberg/shap**

南 Lundberg & S. Lee,解释模型预测的统一方法 (2017),https://arxiv.org/pdf/1705.07874.pdf

C.莫尔纳尔、可解释机器学* (2021)、https://christophm.github.io/interpretable-ml-book/

南 Masís,用 Python 进行可解释的机器学* (2021)

钱丹·杜吉亚 利用 SHAP 进行可解释性——先了解这些限制(2021)https://towardsdatascience . com/Using-shap-for-explability-Understand-these-limits-First-1 bed 91 c9d 21

用百里香增强软件进行 M4 时间序列预测竞赛

原文:https://towardsdatascience.com/the-m4-time-series-forecasting-competition-with-thymeboost-b31196fc319

第 1 部分:每周数据集

乔恩·泰森来自 Unsplash 的图片

TLDR: 在本文中,我们来看看百里香的一些不同实现,看看它在 M4 竞赛中的竞争力如何。主要的竞争是 ES-RNN 模型(获胜)和 Theta 模型,后者是表现最好的基准。在每周数据集之后,某些 ThymeBoost 实现脱颖而出。

如果你需要百里香的介绍,看看这篇文章。

百里香增强 GitHub

介绍

M4 比赛是过去 40 年来定期举行的 M 比赛中的又一个参赛项目。几十年来,他们一直被期待作为时间序列预测方法的基准,M4 竞赛也不例外。它由 100k 个时间序列组成,跨越几个领域和频率,提供了一个不错的基准。虽然,一些频率被低估,这可能有利于某些方法。在讨论基准测试时,我将继续让您知道这并不意味着对百里香增强进行基准测试,相反,这是对百里香增强功能的回顾。我会将学到的知识应用到“自动调整”预测方法中。与 ARIMA 或其他传统方法不同,增强时间序列分解方法没有指南,我希望找到几个问题的答案,例如:

  1. 哪些趋势方法有效?
  2. 什么方法在框架中作为“生成器”工作得很好?
  3. 组件学*率呢,它们有什么作用吗?

带着这些问题,让我们开始吧。

数据

这些数据集都是开源的,并且在 M-competitions github 上直播。它被标准训练和测试分割,因此我们将使用训练 csv 进行拟合,而测试仅用于使用 SMAPE 进行评估。让我们继续将数据和百里香一起导入,如果您还没有安装它,请从 pip 中获取它。

pip install ThymeBoost

有频繁的更新,所以即使你以前安装了它,你可能想继续下去,并更新!

现在我们有了百里香和数据集,让我们开始编码。

import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
import pandas as pd
from ThymeBoost  import ThymeBoost as tbtrain_df = pd.read_csv(r'm4-weekly-train.csv')
test_df = pd.read_csv(r'm4-weekly-test.csv')
train_df.index = train_df['V1']
train_df = train_df.drop('V1', axis = 1)
test_df.index = test_df['V1']
test_df = test_df.drop('V1', axis = 1)

在这里,我们只需导入所有必需的包,并将数据作为标准数据帧读入。接下来,让我们创建 SMAPE 函数,该函数将返回给定预测和实际值的 SMAPE:

def smape(A, F):return 100/len(A) * np.sum(2 * np.abs(F - A) / (np.abs(A) +       np.abs(F)))

在我们的实验中,我们将采用所有时间序列的平均值来与其他模型进行比较。对于健全性检查,我们还将获得“幼稚”的平均得分,以确保我们所做的与竞争中所做的一致。也就是说,我们将简单地遍历数据帧并进行惰性拟合和预测。代码可以通过而不是执行 for 循环来优化,但是这样做也很好!

实现#1:简单

第一个参数设置集中于使用趋势估计器的“生成器”变量。这意味着我们将在每一轮中改变趋势估计值,并在提供的列表中循环。通过:

trend_estimator=['linear', 'ses']

这往往做得很好,它有一个非常“theta-ey”的外观。第一轮(不是初始化轮)符合一条简单的趋势线。接下来是简单的指数平滑。全拟合函数将如下所示:

output = boosted_model.fit(y.values,seasonal_period=[0, 52],trend_estimator=['linear', 'ses'],seasonal_estimator='fourier',fit_type='global',global_cost='mse',seasonality_lr=.9,additive=False,)

该设置的另一个有趣部分是为“季节性周期”传递的“生成器”变量。这与 trend_estimator 的工作原理相同,在 trend _ estimator 中,第一轮使用 no 季节性,然后使用周期 52,然后回到 0,以此类推。参数“加法”为假基本上意味着采用了对数,最后对季节性进行了一点调整,达到了 0.9。

如前所述,这个实现将用于一个简单循环中的每个系列。让我们继续运行它:

seasonality = 52
smapes = []
naive_smape = []
j = tqdm(range(len(train_df)))
for row in j:y = train_df.iloc[row, :].dropna()y = y.iloc[-(3*seasonality):]y_test = test_df.iloc[row, :].dropna()j.set_description(f'{np.mean(smapes)}, {np.mean(naive_smape)}') boosted_model = tb.ThymeBoost(verbose=0,normalize_seasonality=True)output = boosted_model.fit(y.values,seasonal_period=[0, 52],trend_estimator=['linear', 'ses'],seasonal_estimator='fourier',fit_type='global',global_cost='mse',seasonality_lr=.9,additive=False,)predicted_output = boosted_model.predict(output,len(y_test),trend_penalty=True)smapes.append(smape(y_test.values, predicted_output['predictions'].clip(lower=0)))naive_smape.append(smape(y_test.values, np.tile(y.iloc[-1], len(y_test))))
print(f'Weekly {np.mean(smapes)}')
print(f'Naive {np.mean(naive_smape)}')

输出是:

Weekly 7.780101701503696
Naive 9.161286913982

平均 SMAPE 是 7.78,这实际上是对 ES-RNN 和 Theta 的改进:

作者图片

我们可以通过稍微改变季节周期来获得更多的收益:

seasonal_period=[0, 52, 52]

这有点奇怪,所以肯定不是一个可以广泛使用的设置。

使用简单线性回归和简单指数平滑的这种来回推进看起来对该数据做得不合理地好。请记住,这个提升过程将适合每个趋势*似值之间的季节性,因此它不像只是去趋势化并将其交给简单的指数平滑器那么简单。但是,它也没有明显更复杂,所以拟合是相当爽快的。

实现#2:集成

我们可以做的另一件事是平均多个预测。这可以在 ThymeBoost 中通过将所有内容作为一个列表传递给“ensemble”方法来实现。让我们仔细看看我们将尝试的内容:

trend_estimator=[['linear', 'ses'],['linear', 'damped_des'],['linear', 'des']]
output = boosted_model.ensemble(y.values,seasonal_period=[[0, 52]],global_cost=['mse'],fit_type=['global'],additive=[False],seasonality_lr=[.9],seasonal_estimator=['fourier'])

注意所有的东西都是作为一个列表传递的!为了在这个方法中使用一个“生成器”变量,就像我们之前在 fit 方法中所做的一样,我们现在必须将它作为一个列表列表来传递。在这种情况下,trend_estimator 由 3 个“生成器”变量组成。在这里,我们注意到了以前行之有效的方法以及 M4 竞赛中的“基准”方法。这种方法是简单双指数平滑法和阻尼双指数平滑法的平均值。

让我们运行这个循环的完整代码块,看看它是如何工作的:

smapes = []
naive_smape = []
j = tqdm(range(len(train_df)))
seasonality = 52
trend_estimator=[['linear', 'ses'],['linear', 'damped_des'],['linear', 'des']]
for row in j:y = train_df.iloc[row, :].dropna()y = y.iloc[-(3*seasonality):]y_test = test_df.iloc[row, :].dropna()j.set_description(f'{np.mean(smapes)}, {np.mean(naive_smape)}')boosted_model = tb.ThymeBoost(verbose=0,normalize_seasonality=True)output = boosted_model.ensemble(y.values,seasonal_period=[[0, 52]],trend_estimator=trend_estimator,global_cost=['mse'],fit_type=['global'],additive=[False],seasonality_lr=[.9],seasonal_estimator=['fourier'])predicted_output = boosted_model.predict(output,len(y_test),trend_penalty=True)smapes.append(smape(y_test.values, predicted_output['predictions'].clip(lower=0)))naive_smape.append(smape(y_test.values, np.tile(y.iloc[-1], len(y_test))))
print(f'Weekly {np.mean(smapes)}')
print(f'Naive {np.mean(naive_smape)}')

输出是:

Weekly 7.660902293272987
Naive 9.161286913982

比 ES-RNN 和 Theta 有更大的改进,尽管这样的集合会增加计算时间。

当前结果:

作者图片

实施#3:优化

到目前为止,我们已经看了一个简单的百里香增强配置和一个更复杂的平均 3 个输出的集合方法。下一步是选择使用哪种方法,并希望找到“最佳”方法。为此,我们将使用百里香优化方法。这个方法非常简单,它接受一个标准拟合参数列表(就像 ensemble 一样),但这次它将根据维持精度选择一个输出。您可以选择“维持”或“滚动”优化策略,其中滚动利用时序交叉验证。这意味着将有几轮装配和测试。

在运行完整的循环之前,让我们仔细看看这个优化方法:

trend_estimator=[['linear', 'ses'],['linear', 'damped_des'],['linear', 'des']]
output = boosted_model.optimize(y.values,seasonal_period=[[0, 52], 0],trend_estimator=[['linear', 'ses'],    boosted_model.combine(trend_estimator)],seasonal_estimator=['fourier'],fit_type=['global'],global_cost=['mse'],seasonality_lr=[.9, .1],additive=[False],optimization_steps=4,optimization_strategy='rolling',lag=28,verbose=0,)

首先,对于季节性周期,我们将使用上次运行良好的[0,52]以及 0,表示完全没有季节性。此外,我们将尝试通过 0.9 的学*率进行轻度季节性调整,以及通过 0.1 进行重度调整。最有趣的是这种“组合”方法被混合使用。这只是意味着百里香增强将使用该设置作为一个整体,同时优化。除了这些设置,我们还看到了新的优化相关参数,这些参数表示如何对每种方法进行分级。在这里,我们将进行 4 轮拟合和测试,总共维持过去 28 个周期(显然,您应该根据数据频率来改变这一点)。这意味着 4 轮中的每一轮都将测试 7 个数据点,并通过 28 的整个维持延迟。

说了这么多,让我们看看完整的代码和输出:

smapes = []
naive_smape = []
j = tqdm(range(len(train_df)))
seasonality = 52
trend_estimator=[['linear', 'ses'],['linear', 'damped_des'],['linear', 'des']]
for row in j:y = train_df.iloc[row, :].dropna()y = y.iloc[-(3*seasonality):]y_test = test_df.iloc[row, :].dropna()j.set_description(f'{np.mean(smapes)}, {np.mean(naive_smape)}') boosted_model = tb.ThymeBoost(verbose=0,normalize_seasonality=True) output = boosted_model.optimize(y.values,seasonal_period=[[0, 52], 0],trend_estimator=[['linear', 'ses'], boosted_model.combine(trend_estimator)],seasonal_estimator=['fourier'],fit_type=['global'],global_cost=['mse'],seasonality_lr=[.9, .1],additive=[False],optimization_steps=4,optimization_strategy='rolling',lag=28,verbose=0,) predicted_output = boosted_model.predict(output,len(y_test),trend_penalty=True)smapes.append(smape(y_test.values, predicted_output['predictions'].clip(lower=0)))naive_smape.append(smape(y_test.values, np.tile(y.iloc[-1], len(y_test))))
print(f'Weekly {np.mean(smapes)}')
print(f'Naive {np.mean(naive_smape)}')

和打印报表:

Weekly 7.235682291017231
Naive 9.161286913982

在这里,我们看到了相对于之前实现的另一个改进,但是在计算方面又一次付出了巨大的代价。对于每个时间序列,我们拟合了几种不同类型的模型,并在优化时做了 4 次。

该数据集的最终排名:

作者图片

相对于之前的百里香增强实现,我们确实看到了另一个改进。

结论

显然,这整个“促进时间序列分解”的想法是有道理的。主要瓶颈是参数空间巨大。当我们浏览 M4 数据集时,我的目标之一是想出有意义的测试来尝试在 autofit 方法中使用。一个必要的测试是为了限制参数空间的季节性,但我仍然不知道什么类型的数据适合什么类型的趋势估计。时间序列的哪些特征与增强的平滑器相关?一辆增压 ARIMA 怎么样?

不知道,但是可以肯定的说,smoothers 在这个框架中做得很好。

在以后的文章中,我们将继续浏览不同的数据集和有趣的百里香增强实现,包括在增强循环中利用外源估计器。

现在,如果你在使用百里香的过程中发现了什么有趣的东西,一定要让我知道!

机器学*项目生命周期

原文:https://towardsdatascience.com/the-machine-learning-project-lifecycle-83bf5acc268d

软件就像熵:很难把握,没有重量,遵守热力学第二定律;即,它总是增加。 —诺曼·奥古斯丁

由诺埃米·马卡维-卡特茨在 Unsplash 上拍摄的照片

规划机器学*(ML)项目生命周期是组织决策和行动以产生成功结果的有效方式。这个框架允许您将重点放在让系统启动并运行的重要事情上,并最大限度地减少意外。

在这个故事中,我们看到了你在创建一个 ML 系统时需要考虑的步骤,以及一个案例研究,这将有助于一切井井有条。所以,废话不多说,让我们检查一个 ML 项目的生命周期。

Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每个月的第一个星期六收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!

辖域

你到底想让你的 ML 系统完成什么?是回归还是分类问题?你的特点是什么,你的目标是什么?因此,在这一步,你定义你的目标和愿望。

数据采集

在您定义了想要应用 ML 的内容之后,您需要构建一个相关的数据集来帮助您实现目标。

这一步有两个部分:首先,您需要定义数据并建立基线,其次,您需要标记和组织数据。

建模

既然您已经构建了数据集,接下来就是建模部分了。在建模阶段,您必须选择和训练一个 ML 模型。然后,您必须执行错误分析,对您训练的模型的性能进行分析和评分。

构建 ML 模型是一个迭代过程;当您执行错误分析时,您可能需要返回到前一阶段,并更改引导您选择特定模型类型的标准。如果模型的性能仍然不足,您甚至可以返回到数据采集阶段,收集更多的数据。

部署

最后,我们有部署阶段。如果你认为这是最后一步,那就再想想。部署阶段有两个阶段:第一,在产品中部署模型,第二,监视和维护系统。

监控决定你接下来的步骤。既然您已经在现实世界中部署了您的模型,您的观察可能会引导您回到范围界定阶段,从头开始。另一件需要考虑的事情是捕获到达模型端点的实时流量并丰富数据集。建立这样一个过程将有助于你生产你的模型的未来版本。

狗品种案例研究

在这个案例研究中,我们将经历 ML 生命周期的各个阶段,看看构建一个计算机视觉(CV)系统需要什么。

想象一下,一个狗收容所要求你建立一个系统来识别狗的品种,这样他们就可以自动对每个新来的狗进行分类。

在 Unsplash 上由 Alvan Nee 拍摄的照片

所以,第一步是确定范围。在这个阶段,您确定这确实是一个 CV 问题,并尝试评估您的系统的关键指标。例如,您应该关心的是您的模型的准确性,但在这一点上您不必担心延迟。最后,你要估计完成这样一个项目所需的资源,并设定最后期限。

下一步是数据阶段。在这一步中,您需要确保一致地标记数据。例如,如果你有一只“约克夏梗”,你应该总是给它贴上这样的标签。不是“约克”,不是“梗”,也不是你能想到的任何其他组合和别名。其他考虑可能包括图像的裁剪或亮度归一化。最终目标是开发高质量的数据集,帮助您的模型学*。

收集数据集后,下一步是建模。在这一步中,您需要选择您的 ML 模型(例如,特定的神经网络架构),训练它,并执行错误分析。在行业领域,您可能会选择一个已经经过实战检验的模型实现(例如 ResNet 或其任何变体),并处理超参数和数据集。这种思维方式与学术界的思维方式形成对比,在学术界,您保持数据集固定不变(例如,使用 ImageNet)并篡改模型代码。

然后,错误分析将告诉您需要做什么来提高模型的性能。在我们的例子中,错误分析将告诉你如何系统地改进你的数据。需要收集更多的数据吗?您是否需要收集更多关于特定边缘案例的数据?你需要在数据集中寻找不一致的地方吗?

最后,当您已经训练了您的模型并且错误分析表明该模型足够好时,您可以进入部署阶段。在这一步中,您需要考虑系统的架构和基础设施。您应该将其部署在智能手机等边缘设备上吗?您应该将它部署在云上,并让它通过 REST API 为请求提供服务吗?如果网络连接中断了怎么办?等到连接恢复可以接受吗?

让我们假设您决定创建一个 web 服务器,并通过 web API 提供您的模型。然后,智能手机上的应用程序会拍摄一张狗的照片,对其进行居中裁剪,然后将其发送到图像识别 API。几秒钟后,手机应用程序会以纯文本形式接收狗的品种,并将其注册为收容所的新成员。

最后,是监控和维护步骤。那么,如果避难所内的光照条件发生变化怎么办?如果小狗开始来到收容所,而你已经用成年狗的图像训练了你的模型,那会怎样?你的模型的性能将开始下降。这个问题就是我们所说的数据漂移。因此,当现实世界中的数据分布发生变化时,您需要捕捉它并更新您的模型来解决它。

结论

规划机器学*(ML)项目生命周期是组织决策和行动以产生成功结果的有效方式。在这个故事中,我们看到了一个 ML 项目的步骤和一个可以帮助我们理解这些步骤的案例研究。

这个故事是关于 MLOps 以及如何将 ML 模型从想法变成产品的系列故事中的第一个。敬请关注并订阅我的简讯!

关于作者

我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学*工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学*、深度学*、数据科学和数据运算的帖子,请在 Twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

批处理和流式洞察的神奇融合

原文:https://towardsdatascience.com/the-magical-fusion-between-batch-and-streaming-insights-8f1353bfe4a

业务需要数据驱动的洞察力,以尽快到达利益相关方和客户,并具有明确定义的新鲜度要求。Lambda 架构(Marz,2015 年)通过将批处理和实时流中的洞察结合到最新的数据产品中,解决了这些需求。我们假设 Lambda 架构仍然是为工程能力有限的数据科学团队提供见解的相关方法。我们阐述了融合批处理和流洞察的创造性方法,并展示了我们的 Azure Lambda 实现来说明我们的想法。

照片由斯凯勒·尤因从佩克斯拍摄

Lambda 架构概述

内森·马兹(书,2015)很好地阐述了 Lambda 架构。Lambda 架构由批处理层、速度层和服务层组成,旨在提供最新的更新见解。批处理层使用主数据集在每次运行时覆盖批处理视图。这些预先计算的批量洞察是我们的真理来源。在批处理流水线运行之间,来自速度层的流更新用于保持我们的洞察力新鲜。这是最大的努力,因为流更新积累的任何错误都会在下一次批处理管道运行时被丢弃。服务层将批处理和实时视图组合成最新的数据产品以响应查询。

图 1: Lambda 架构概述,作者图片

数据科学的 Lambda

Lambda 架构适合希望向企业和客户提供实时洞察的现代数据科学团队。通常已经存在一个批处理层,对更新的洞察力的需求是一个附加需求。批处理层的存在也可能有很好的理由,例如对历史数据进行机器学*模型的聚合或训练。拥有大约 30%数据工程能力的数据科学团队的构成非常适合 Lambda 架构的实用的自我修复能力。

为什么不是卡帕?

Kappa 架构涉及成熟的活动采购。事实的来源不是批处理管道(不存在),而是过去流事件的累积状态。有博客(比如 this )描述基于事件源的失败项目。更难管理的事情之一是错误恢复。假设您在流逻辑中犯了一个错误,并准备好了一个修补程序。在 Lambda 中,我们会将修复部署到速度层,批处理层的触发或预定运行会自我修复我们的 insight 存储。在 Kappa 中,我们可能需要在多个应用程序和 eventhubs(解析器、洞察生成器)上重放大量历史流事件,并根据我们的预期验证我们的新状态。这需要更多的工程设计,不太适合工程能力有限的数据科学团队。

批次层和速度层之间的神奇融合

批处理层和速度层之间的协同就是神奇之处。应用 Lambda 架构通常是一个创造性的过程。目标是通过批处理和实时视图的适当结构将服务层中的逻辑保持在最低限度。有三种通用方法来融合批处理和速度层,并且这些方法并不相互排斥,即:

  1. 使用流式洞察更新预计算的批处理视图聚合
  2. 在速度层中使用批量生成的查找表或 ML 模型
  3. 业务实体状态更新(累积、完整或部分)

在本节中,我们将避免实现细节,每当我们提到 Kafka 主题时,我们指的是任何事件日志,如 Azure eventhub 或 Kafka 本身。

1 更新预计算聚合

Marz (2015)重点介绍了这种融合。批处理层预计算作为我们重现的真实来源的总量。流式更新与历史聚合相结合,以最新的聚合来响应查询。在网站访问者计数的经典示例中,在批处理视图中每小时划分一次聚合。实时站点访问与时间戳一起存储在实时视图中(最好是键值存储)。REST 调用触发一个函数,该函数接收每小时的历史总量和所有可用的实时访问。计算更新后的聚合,并作为我们的响应返回。请注意,返回的集合可以具有与存储在批处理视图中的集合不同的集合周期(即,天、月)。

1.1 查询优化

可以使用超过一小时的流式网站访问重新计算站点访问总量,并再次存储在批处理视图中。然后可以丢弃处理过的 speed layer 站点访问,这将缩短查询响应时间。

1.2 洞察聚合的变化

Lambda 架构的应用非常灵活。有各种各样的场景可能适合聚合融合,但是有一些变化。

  1. 我们返回批处理和实时洞察的联合。
  2. 我们希望用实时视图中不断变化的 salt 散列批处理视图中的标识符,以匿名化我们的响应
  3. 通过实时证据对存储模型预测的贝叶斯修正

2 批量生成的查找表或 ML 模型

通常,我们需要来自批处理层的中间产品来在速度层产生洞察力。例如,在批处理层中创建的查找表和训练的 ML 模型用于丰富和分类速度层中的洞察。批处理管道每次运行时都会创建这些工件的新版本。通常,我们只想使用最新的版本,但是对于 ML 模型,只有当最新的模型比以前的版本更好时,才可以应用 MLOps 来决定使用最新的模型。

2.1 查找表

我们如何在批处理层和速度层之间共享一个查找表?一种基本方法是让批处理层将查找表写入存储。批处理流水线可以重启速度层中的流处理,以强制重新加载存储的查找表的最新版本,尽管这不是很优雅。更好的方法是以固定的时间间隔从磁盘重新加载查找表,而不中断我们的流处理(实现细节在后面)。另一种方法是将查找表及其版本写入 Kafka 主题,并在速度层中进行流-流连接。最后一种方法需要增加复杂性,以便只使用最新版本的查找表,例如日志压缩。

图 2:流处理中使用的静态查找表,按作者排序的图像

2.2 训练好的 ML 模型

对于由批处理层创建的经过训练的 ML 模型,我们考虑存储在模型注册中心并部署在它自己的 REST API 后面的版本化模型(用 AzureML 推理部署来描述)。我们将模型版本的每个唯一 URL 流式传输到一个附加了元数据的 Kafka 主题中(用 Azure eventhub 描述)。元数据包含模型版本适用的预测日期范围。我们根据预测日期将速度层消息与模型 URLs eventhub 连接起来,并调用模型 API 来实现预测,这被合并到我们的流洞察中。

图 3:速度层中使用的批量训练的 ML 模型,图片由作者提供

3 个状态更新

融合批处理和流洞察的第三种方式是关注业务实体的状态管理,一些例子是:

  • 每个客户实时生成的预测否决批处理视图预测
  • 基于实时事务流将预测的事务标记为已处理的事务
  • 根据各种模型的实时输出更新客户的信用评级

这种有状态融合不同于第 1 节中描述的融合,因为聚合提供了跨业务实体和时间的洞察力。在这里,我们希望在单个客户的级别上管理洞察状态,详细信息流经批处理和速度层。由于无法保证事件处理顺序、库限制、数据存储性能和逻辑复杂性,实时分析系统中的状态管理非常困难。

3.1 企业实体和对象恒常性

洞察力对商业实体做出陈述,例如客户的预测价值、特定列车的拥挤程度或论坛用户的情绪。自然,在 insight store 中为每个业务实体维护一个单独的状态。为了允许状态分离,我们需要在我们的系统中一致地识别业务实体,这构成了对象恒常性。有几种方法可以识别商业实体。

  1. 唯一的数据产品关键字(字段值的唯一组合,如 customer_id、bank_account_number)
  2. 匹配评分功能,将见解与存储的见解进行匹配
    -相似性度量
    -无监督聚类
    • MinHash 或其他分桶方法
      -自定义评分功能
  3. 两者的结合

我们用银行交易来说明组合方法选项 3。每笔交易都有一个唯一的发送和接收银行账号,它们共同构成了唯一的数据产品密钥。这两个银行帐号组合在一起可以确定一种财务关系。例如,在学生和大学之间的财务关系中,我们可以看到不同主体的交易。例如,学生定期支付学费,偶尔支付课程材料费用。在我们的例子中,我们希望预测明年课程材料的成本。为了理清这两组交易,我们根据它们在交易信息和金额上的相似性对它们进行聚类。我们最终在一个财务关系下有两套交易。这两个集合都是业务实体,我们选择一个用于我们的洞察生成和状态管理。

3.2 完整状态更新

对于全状态更新,速度层洞察否决批处理层洞察。实时视图中的洞察有效地取代了批处理视图中的洞察。批处理视图中的细节不需要被覆盖,但是服务逻辑在响应查询时给予实时视图优先权。

3.3 部分状态更新

速度层可能无法生成完整的洞察,并且仅限于部分更新。例如,状态转换通常通过部分状态更新来传达,例如将预测转换为历史事实。这里,我们将记录的确定值和状态从预测更新为实际。对于部分更新,我们通常在服务层使用单一视图(图 4)。批处理层覆盖这个单一视图(处理记录删除),而速度层修补同一视图中的记录/文档。这使得架构能够自我修复,因为每次批处理管道运行都会完全覆盖 insight 存储。

图 4:单个服务视图中的部分和累积状态更新,图片由作者提供

3.4 累积状态更新

累积状态更新不是等幂,因为状态更新的结果取决于当前状态。这不同于完全或部分状态否决,并且在高吞吐量(>每秒 100 次更新)的流系统中变得更难维护。除了其他一般的流限制之外,当跨并发微批处理的更新以相同的状态为目标时,微批处理流框架遭受并发问题。因此,累积的状态更新可能需要连续的流处理。状态累积的一些例子是:

  • 将具有实时交易的预测银行交易列表标记为“已处理”
  • 基于不同时间不同模型的输入累积预测值

与部分更新一样,我们将批处理和速度层整合到一个 insight store 视图中。批处理层覆盖洞察状态以保持 Lambda 架构的自愈属性,速度层对其进行变异。累积更新读取当前的洞察状态,改变它,并覆盖它。为此,我们需要一个快速的键值存储来支持单个业务实体级别的快速操作,比如 HBase。

Azure 数据科学 Lambda 架构

由于可用的技术和业务需求,Lambda 架构的每个实现都是不同的。我们作为高级分析部门的一部分提供人工智能数据产品。我们的语言是 Python,我们自始至终都在使用它。我们的人工智能团队致力于 Spark 和 Databricks 的批处理,这自然扩展到了 PySpark 结构化流和其他 azure 产品(eventhubs 和 Azure 函数)的流处理。Azure eventhubs 是流处理的核心,对于批处理结果也很有价值。

图 5:带有 REST API 服务层的 Azure 上的数据科学 Lambda 架构,图片由作者提供

批量层

批处理管道每天运行两次,一次在晚上,一次在中午。我们预测的一个重要来源是全天流动的,额外的中午运行大大提高了我们的预测。批处理管道结果由批处理视图加载器应用程序直接加载到 CosmosDB 批处理视图容器中。从批处理 eventhub 中构建 CosmosDB 中的状态是理想的,但目前性能似乎更倾向于使用 spark 连接器。这两次每日运行在 CosmosDB 中相互覆盖对方的结果,并且两次运行都将其结果写入 batch eventhub 供下游使用。eventhub 中的每条消息都是 CosmosDB 中的一个文档,是由我们的模型以标准化格式生成的一个预测。

速度层

速度层消耗上游源的子集,并在解析它们之后将它们写入我们的域内的 eventhubs。这种单源解析逻辑是在带有 eventhub 触发器和输出绑定的 azure 函数上执行的。域 eventhub 由我们的主要 PySpark 结构化流数据块应用程序使用,该应用程序生成增量更新并将其写入 updates eventhub,以供下游使用并加载到 CosmosDB 实时视图中。加载 CosmosDB 的 Azure 函数 eventhub 触发器是可行的,因为与批处理层相比,峰值流量更低。目前,我们完全否决了批处理视图中的状态,每个唯一数据产品关键字的实时视图中的预测为空。

查找表刷新

批处理层生成一个查找表,我们需要在速度层生成洞察。Spark 结构化流静态流连接允许我们在 Spark 结构化流中使用存储的数据帧查找表。在流处理期间,除了强制重启之外,没有对重新加载这个“静态”数据帧的直接支持。因此,我们使用“黑客”机制的组合。结合在处理每个微批处理之后调用的函数来设置“速率”读取流,以在外部作用域中重新加载静态数据帧。这有点像黑客,但似乎对存储在磁盘上的查找表有效(见 1 和 2 )。

服务层

我们的 AI 数据产品以两种方式公开,一个 REST API 和两个 eventhubs(批处理和更新)。批处理视图和实时视图之间的文档格式是相同的,可以立即作为 JSON 提供,这降低了我们的 web app 服务中服务逻辑的复杂性。响应于请求,向两个容器查询所有相关的预测。只有一个预测返回业务对象,实时视图优先。总的来说,我们的方法保持了事物的简单性。让我们希望我们能保持简单!

实施愿望清单

我们希望扩展我们当前的 Lambda 架构实现。这些被添加到图 6 中,即:

  1. 我们希望将批处理和更新 eventhub 直接放入 CosmosDB
  2. 抑制 Spark eventhub 连接以减少所需的最大 eventhub 吞吐量单位
  3. 基于预训练的 ML 模型重新计算速度层预测的能力
  4. 在流处理期间优雅地重新加载静态查找表的能力,这不依赖于日志压缩

图 Azure 上数据科学的愿望清单 Lambda 架构,图片由作者提供

愿望清单第 3 点可以按照第 2.2 节通过添加模型注册中心(AzureML)来注册在批处理管道中训练的模型来实现。如果 MLOps 认为最新的模型比以前的模型更好,我们将使用 AzureML 部署模型进行推理,并将模型 API URL 和预测日期范围一起发送到 eventhub。我们根据预测日期将模型 URLs eventhub 与速度层连接起来,并过滤对该日期有效的模型。我们可以使用 PySpark 结构化流式 Python UDF ( 示例 github )并行处理流式消息对模型 API 的调用。如果一个新的模型 URL 被推送到 eventhub,它将为其日期范围生成新的 insight,这将覆盖 CosmosDB 中的 insight 存储状态。这种解析文档存储中“最新”状态的方法被称为日志投影,微软更倾向于使用日志压缩(日志投影)。其他两个愿望清单点依赖于微软和 Databricks 为我们提供正确的工具或选择不同的技术。例如,阿帕奇德鲁伊可以成为 eventhubs 的汇聚点,也可能是 CosmosDB 的替代品。感谢您的关注!

最初发布于https://codebeez . nl

偏见的许多方面

原文:https://towardsdatascience.com/the-many-faces-of-bias-c515cd483db4

在数据科学和机器学*领域,偏见是一个充满争议的术语——一点也不因为它对从业者来说意味着很多事情。不平衡的统计分布是一种偏见,但语言模型训练数据中的种族和性别刻板印象的表现,或者研究人员的假设融入他们构建的算法的方式也是一种偏见。

在我们最新的作者 Spotlight Q & A 中,我们与康纳·奥沙利文聊起了他对算法公平性日益增长的兴趣——这是一个致力于在广泛的数据科学实践和工作流程中消除偏见的子领域。因此,在本周的《变量》中,我们着重介绍了最*几篇文章,这些文章从多个角度对偏见进行了细致入微的探讨,这是很自然的事情。

  • 防止和消除数据集偏见的有用入门 。如果你最*刚刚开始关于公平和偏见的对话,一个非常好的起点是 Ella Wilson 的首张 TDS 帖子。它定义了您需要知道的核心概念,还介绍了一些解决训练数据中的偏差问题的主要方法。
  • 仔细看看偏见的社会影响 。“当有人实践数据科学时,他们要么挑战要么加强现有的权力结构。”Aisulu Omar 发人深省的文章的出发点是,处理大规模数据集本身没有好坏之分,但是非多样化的团队和信息不足的个体从业者的结合会造成(或延续)伤害。

由弗勒在 Unsplash 上拍摄的照片

  • 在推论和多重处理问题上 。回到事情的统计方面, Matteo Courthoud 的最新解释者对最*一篇关于污染偏倚的论文进行了清晰而引人入胜的分析:当我们想要在实验药物、UX 设计或政策辩论等背景下观察多种互斥治疗的效果时,就会出现这个问题。
  • 正确评估生存分析模型 。围绕准确解释的问题也是 Nicolo Cosimo Albanese 对生存分析的绩效评估指标进行深入探讨的核心。他介绍了几个常见指标的来龙去脉,并(用 Python)分享了一些例子,向读者展示如何选择正确的指标。

如果你想在本周锻炼一些其他的数据科学肌肉群,为什么不呢?—这里有一些推荐读物,涵盖广泛的主题和方法。

  • 分享 Sara A. Metwalli 的新帖总是一件乐事,这一篇也不例外:这里有一个简明的、可操作的教程,教你如何在代码中写更好的注释。
  • 继续他关于图形神经网络的迷人的、正在进行的系列,迈克尔·布朗斯坦(与合著者克里斯蒂安·博德纳尔和法布里齐奥·弗拉斯卡)挑战图形实际上是 GNNs 的正确计算结构的概念。
  • 对数据分析师和工程师来说,单元测试数据管道是一个长期的挑战。高()和将会在这里提供帮助,他将会提供一个全面的教程,介绍如何在 dbt 中实现单元测试。
  • 对于那里的修补者和建设者来说, Elise Landman 带领我们通过用 Word2Vec 在浏览器会话数据上训练一个基本推荐系统的过程。
  • 本周我们将为您带来来自 Leah Simpson 和 Ray McLendon 的最新报道,他们利用 Eric Ries 的“精益创业”方法的见解来简化和优化机器学*产品。

如果你最*受到鼓舞成为一个媒体成员来支持我们作者的工作,我们真的很感激!我们总是感谢所有的读者和关注者让我们的社区充满活力和支持。

直到下一个变量,

TDS 编辑

为拦截换肤的多种方式

原文:https://towardsdatascience.com/the-many-ways-to-re-skin-an-intercept-cbfd59c8728c

数据争论/机器学*/ Python

为拦截换肤的多种方式

向数据集添加截取列的方法

图片作者:Karsten Cao

如果你和我一样,你无疑在你的数据科学之旅中遇到过线性回归。也许为了理解这个模型,你决定从头开始编写一个,或者至少用一些公共库,比如 Pandas 或 NumPy。不知何故,我总是忘记在我的截距数据集上添加一个恒定的 1 列的步骤,最终不得不查找这个过程,却发现一个与以前不同的方法。为了让您和我永远不会走得太远,这里有几种方法可以将截取列添加到现有数据集。

对于那些好奇的人来说,这些方法后面是额外的时间和记忆评估部分。pd.concat 被认为是内存效率最高的,它产生了一个 Pandas 数据帧,而 np.concatenate 在速度方面是最好的,它产生了一个 NumPy 数组。

1.创建数据

我从一个 Pandas 数据框架开始,因为它与提供的所有方法一起工作。也可以使用 NumPy 数组,但它仅限于 NumPy 进程。

这里,我们用[2]熊猫数据帧和[3]2D 数组表示数据。Karsten Cao 的图片

2.对截取进行“重新换肤”

下面我列出了我在向现有数据集添加截取列时遇到的 7 种方法。它们似乎可以分为三类:分配优先、连接和插入。结果在熊猫数据帧或 NumPy 2D 阵列中,截距在最左列,为一些线性代数和机器学*做好准备。

任一方法的一般输出。熊猫数据帧在上面,NumPy 数组在下面。图片作者:Karsten Cao

3.一般讨论

在这一节中,我将探究每一种方法,并对每一个过程进行高层次的描述。

第一种方法是按照原始数据集的形状分配一个多一列的矩阵。然后,非截距位置被替换为来自 x 的数据。这可能会感觉很慢,因为在被覆盖之前会生成许多 1 并且未使用。输出是一个 np.array。

tempX = np.ones((X.shape[0], X.shape[1] + 1))
tempX[:,1:] = X

第二种方法使用串联。它生成一个截取列,将其转换为 DataFrame 对象,然后将该列与原始数据集连接起来。这种方法的内存使用量非常惊人,因为它几乎没有使用比原始数据集更多的内存。输出是 pd.DataFrame。

pd.concat([pd.DataFrame(np.ones(X.shape[0])), X], axis=1)

第三、第四和第五种方法是使用 NumPy 的串联方法。除了所需参数的不同,这只是将截距追加到数据集的三种不同方法。在组合新输出的结果之前,每个都创建一个新的截距列。输出是 np.arrays。虽然有所不同,但是本文并不探讨这些不同之处。

np.c_[np.ones(X.shape[0]), X]np.hstack([np.ones((X.shape[0], 1)), X])np.concatenate([np.ones((X.shape[0], 1)), X], axis=1)

第六种方法是插入。它通过提供索引和轴方向来指定列,选择要插入的值,然后继续。它使用 np.array(X)将 DataFrame 转换为 NumPy 数组。这类似于 Python list 内置函数,但它确实会带来一些混乱,因为您可以添加一个值来传播数组中的一列。同样,您可以在第三个参数中传递[1]来获得完全相同的输出。输出是一个 np.array。

np.insert(np.array(X), 0, 1, axis=1)

第七种方法是插入和交换。它会制作一份拷贝,这样原始数据帧就不会受到影响。使用类似于第六种方法的特殊 Pandas 过程添加一个截距,在第六种方法中,我们将一个列设置为标量,创建一个用所提供的标量填充的列。DataFrame 的列被取出、重新排序,然后传递给 reindex 方法。输出是 pd.DataFrame。

tempX = X.copy()
tempX['intercept'] = 1
columns = list(tempX.columns)
columns[0], columns[1:] = columns[-1], columns[0:-1]
tempX.reindex(columns=columns)

这些是我发现的几种使用 Pandas 或 NumPy 向现有数据集添加截距的方法。由于这个过程对每个数据集只进行一次,并且只是为线性回归等模型准备数据,因此这些选项中的任何一个都非常适合刚刚进入机器学*和数据科学的人。

但是如果毫秒和兆字节很重要呢?继续读。

4.事实真相

在被告知“这些选项中的任何一个都非常合适”后,有些人可能会不满意。在这一节中,我将探讨每个模型的时间和空间效率,并比较它们的性能。

方法论

我使用了一个 Pandas 数据帧和一个带有(100_000,100)个随机初始化变量的 NumPy 数组。
为了避免 Python 缓存数组和矩阵,我单独运行并计时了每个方法。创建了一个 base()函数来初始化和计算数据集和截距列的常量内存使用。此外,基本内存使用量用于验证哪些变量正在被缓存。
所有的拦截方法都放在一个函数中,这个函数被封装在一个内存分析器中,用来测量增量数据的使用情况。下面的内存使用是使用 profiler decorator 计算的。为了给每个函数计时,我创建了一个时间装饰器,循环遍历每个截取方法,计算运行时间,并记录结果。

结果

用于循环计算和建立基线的恒定内存使用量。图片作者:Karsten Cao

每种方法的内存使用和时间评估。图片作者:Karsten Cao

以下是我注意到的一些事情:

  • Pandas 和 NumPy 之间最初的数据使用差异可以忽略不计。
  • 除了 np.concatenate 有 10 次迭代之外,np.array 的初始开销更小,运行速度更快。
  • 令人惊讶的是,使用 pd.concat 的第二种方法是最有效的内存方法,它只使用了 323.9MB 的 ram。似乎是将指针合并到返回的数据帧中,而不是为副本分配新的空间。不幸的是,它花费的时间最长,是 np.concatenate 的 2-5 倍。
  • 最快的方法因迭代而异。经过 10 次迭代,np.concatenate、np.hstack 和 np.insert 以 0.097 秒打平。经过 100 次迭代,NumPy 串联方法(3,4,5)的次数达到了 1%。
  • 如果您希望输出是数据帧,那么第七种带有插入和重新索引的方法非常快,100 次迭代 0.801 秒,10 次迭代 0.130 秒。否则,np.concatenate 在两种数据集类型上的速度都是一致的。

结论

总而言之,我建议坚持使用您开始使用的数据对象或适合您的用例的数据对象。毕竟,如果你正在用 Python 编码,那么对你来说最重要的可能是你编码和思考的时间,而不是你将向数据集添加截距的过程从毫秒缩短到最小的能力。

我知道我只会用我记得的那个。

感谢您的阅读!随意查看代码这里!

RSA 背后的数学原理

原文:https://towardsdatascience.com/the-math-behind-rsa-910f88b94c36

RSA 及其算法背后的数学原理的详细演示

在 Unsplash 上由Towfiqu barb huya拍摄的照片

我们通常发现数学结果在计算机科学中令人着迷的应用。 RSA 就是这样一个应用。

RSA非对称加密的实现,也叫公钥加密,由 Diffie 和 Hellman 在*密码学新方向【1】*中介绍。

非对称加密背后的想法是每台机器 A 生成两个函数 fg 使得:

***g(f(message)) = message***

函数 f 用于加密消息,并由 A 公开*。每台要向 A 发送消息的机器计算 f(消息),并将结果发送给 A 、*。**

g 用于解密,由 A 保密。在接收到加密消息 f(消息)A 后,计算 g(f(消息))=消息并检索初始消息。

为了使通信安全,从 f 导出 g 在计算上应该是不可行的。

基于这种革命性的想法, RSA 被发明出来。 RSA 基于简单却神奇的数学结果。在接下来的部分中,我们将探索基础数学。

在下面, N 是大于 0 的正整数。除非另有说明,所有整数都是正数。

欧拉极限函数

考虑***【N】N*与 N 互质**。

比如 φ(8) = 4 ,因为有 4 个小于 8 且与 8 互质的整数分别是 1、3、5、7。

可以看出,对于任意两个互质整数 pq :

想想吧。通过知道有多少个整数互质且小于 *p,*以及有多少个整数互质且小于 q ,我们就知道有多少个整数互质且小于 N=p.q 而无需处理 pp.q 之间以及 qp.q 之间的整数。

一个例子可能有助于突出这个神奇的等式。

走 72 路。它等于 8×9 互质。

  • φ (8) = 4:与 8 互质的整数是 1,3,5,7
  • φ (9) = 6:与 9 互质的整数是 1,2,4,5,7,8

上面的等式告诉我们,有 4x6=24 个数互质且小于 72。我们甚至没有考虑这些数字以及它们与 72 的关系,但是我们知道有多少是互质的,并且少于 72。这就是数学的魔力。

我将在以后的文章中展示这个等式是如何工作的。现在,我们关注的是 RSA 背后的所有结果以及它们是如何协同工作的。

欧拉定理

欧拉定理规定,对于任意正整数mN 互质,我们有:

这意味着,如果我们将的任意一个正整数 mN 互质到 φ(N) 的幂,然后除以 N ,除法的余数将等于 1。

因此,对于任何正整数 k,我们有:

将每条边乘以 m 得到:

公式 k.φ(N) + 1 提醒 Bezout 恒等式,它说明对于每一个数 e φ(N) 互质,都有两个整数 dk 这样:

如果 Bezout 的身份现在还不直观,请不要担心,我们将在下一篇文章中回到这个问题。

通过替换上面的公式,我们得到:

也可以写成:

通过考虑 f 映射 xf(x) = x^e mod N,映射 xg(x) = x^d mod N, 【T80

细心的读者会注意到,Bezout 等式中出现的 k 是一个整数,可能是也可能不是正的。但是,只有一个正的 k 给出m^kφ(n)1 mod n*。在负的 k 的情况下,我们只需将 k.φ(N) 移到等式的另一部分:*

我们现在有两个函数 fg ,当我们计算 g(f(m)) 时,这两个函数给出了初始整数 m 。整数 m 将作为要发送的消息。
f 会公开, g 会私有。这意味着整数 eN 将是公共的,而整数 d 是私有的。对 (e,N) 是公钥,对 (d,N) 是私钥。我们需要选择 N ,这样在只知道 eN 的情况下计算 d 是不可行的。

N 的选择

为了从 e 中导出 d ,攻击者必须首先计算 φ(N)

如果我们选择 N 为质数, φ(N) 就简单地等于 N-1 因为 1N-1 之间的所有数都与 N 互质。在这种情况下,因为 N 是公开的,所以 φ(N) 对攻击者来说是不费力就知道的。

一个质数的平方Np:N = p怎么样?
嗯,可以很容易的看出 φ(p ) = p(p-1) 。于是,知道 p 就足以知道 φ(N) 。通过在 1N 之间执行二分搜索法,可以在对数时间复杂度内获得 p

在这种情况下,通过选择两个不同的质数 p和 q*:***N = p . q .**的乘积 N 可以很容易地改善这一点:

为了计算 φ(N) ,应该知道 pq 。计算 pq 的时间复杂度相对于 N 来说不只是线性的。如果攻击者达到每秒测试超过 10 个⁰数的惊人速度(想象一下 1000 个谷歌大小的公司,使用他们所有的服务器进行搜索,每个服务器以每秒 100 亿个数字的速度执行),如果选择大的 pq (例如 2048 位宽,这是今天使用的大小),他们仍然需要超过 10 个⁹⁰世纪才能导出 pq 。所以选择 N=p.q 两个素数的乘积就足以安全 RSA

就是这样!

我们来总结一下 RSA

每台机器通过执行以下操作生成其(公共、私有)密钥对*:*

  1. 随机生成两个 2048 位的大素数 pq
  2. 计算 N=p.qφ(N) = (p-1)。(q-1)
  3. 选择一个数字 eφ(N) 互质
  4. 使用欧几里德扩展算法,计算de 模 φ(N) 的倒数
  5. (e,N) 存储为公钥,将 (d,p,q,N) 存储为私钥。

然后,在 AB 之间的消息的加密和解密如下:

  1. A 将消息表示为小于 N 的整数 m
  2. A 计算 c=m^eB mod NB 其中 (eB,NB)B 的公钥。c 是加密的信息。
  3. Ac 发送给 B
  4. B 计算**c^db mod nb**其中 dB 是其私钥并检索由 A 加密的初始整数 m
  5. B 将整数 m 转换为初始消息

就是这样,这就是 RSA 的基本算法。这不难理解,但我仍然无法想象发明者是如何想出这个绝妙的主意,即可以用这个数学来发明一种革命性的加密方式。

在以后的文章中,我们将对我们看到的每一个数学结果有更多的直觉。敬请期待!

参考

[1] W. Diffie,M. E. Hellman,密码学的新方向(1976),IEEE 信息论汇刊

[2] R. Rivest,A. Shamir,L. Adleman,获得数字签名和公开密钥密码系统的方法(1978 年),美国计算机学会通讯

[3]维基百科,欧拉的全能函数,https://en.wikipedia.org/wiki/Euler%27s_totient_function

**[4]维基百科,欧拉定理,【https://en.wikipedia.org/wiki/Euler%27s_theorem **

数据网格需要的元数据基础

原文:https://towardsdatascience.com/the-metadata-foundation-that-your-data-mesh-needs-9a1be28c5da6

激活你的元数据是如何驱动数据网格梦想的

作者图片,来自我在 Datanova 2022:数据网格峰会上的演讲

可发现的。可以理解。值得信赖。这些只是数据网格基础设施的一些关键思想。浏览它们,你会很快发现实现每一个目标的关键元素——元数据。

今天,元数据变成了大数据。现代数据堆栈的每个组件和其上的每个用户交互都会生成元数据。毫不夸张地说,元数据的潜力是巨大的。事实上,我认为这是开启数据网格真正价值的关键。

然而,元数据——就像数据网格一样——还需要成长。任何从业者都知道,元数据的大小和规模的爆炸使得数据团队很难实际使用它。很多时候,它在另一个孤立的工具中没有被使用。

我是一名终生的数据从业者,花了十年时间管理数据团队,建立了伟大的数据文化。我有过无数次失败,也有过一些成功,比如建立印度的国家数据平台。一路上,我处理了大量的混乱,这促使我的团队开发工具,使我们更加敏捷。四次尝试之后,我们构建了一个活动元数据平台 ,真正改变了我们的工作方式。

我有机会出席了 Datanova 2022:数据网格峰会,这是 Starburst 的第二次年度会议。我分享了我对现代元数据的想法,它在我们的数据堆栈中的不足之处,以及我们如何使用它来推动数据网格梦想。我捕捉到了以下要点。

观看我在 Datanova 2022:数据网格峰会上的演讲录音。(视频由 星爆 )

什么不起作用

如今元数据的使用方式是完全错误的。我们从一堆独立的、孤立的工具中编译我们所有的元数据,并把它放在它自己的孤立的数据目录或治理工具中。我们希望数据从业者在需要上下文时切换回目录工具,但这并不可行。

当用户需要的时候,他们想要他们所在的地方的上下文。

当某人处于日常工作流程中时,例如查看 BI 工具上的仪表板,他们需要知道是否可以信任该仪表板,就在此时此地,而不是在切换并登录到他们的数据目录、搜索相关数据资产并找出它们上次更新的时间之后。

我们当前元数据方法的另一个问题是,它对每个数据人一视同仁。我们都*惯了日常生活中难以置信的个性化体验——想想网飞的策展或亚马逊的推荐就知道了。今天的数据平台拥有大量关于用户的数据,比如首席技术官在周一早上运行的搜索,或者数据工程师在他们的管道中最常用的资产。为什么我们不利用这些数据为不同领域的不同人提供个性化的数据体验呢?

最后,今天的元数据大多存在于自顶向下的治理模型中。大多数数据治理工具都是为集中式治理结构构建的,由“委员会”制定规则和政策。这与自下而上、民主化的数据网格世界相反。

元数据的未来

花点时间想象一下你日常生活中的经历。您可以使用 Segment 来完成过去需要大量人工完成的工作,从数十个网站、应用程序和工具中获取客户数据。然后 Zapier 采取行动,使这些信息具有可操作性——如果一个工具发生了什么,它会触发其他工具的一系列操作。当你退出这些工具回家后,你打开网飞,在那里他们策划了最新的节目,甚至根据你想看的内容创造了一些新的节目。

为什么我们不能在我们的数据平台上实现这一点呢?

真正智能的数据管理系统应该考虑最终用户及其需求。它将使用元数据自然地联合和管理我们的数据系统——为围绕当今多样化数据用户构建的自动化、个性化体验提供动力。

它应该围绕诸如“数据分析师的体验是什么样的?营销或销售的数据分析师怎么样?这与数据工程师或业务用户的体验有何不同?”然后,我们可以将这种个性化和知识反馈到数据人员每天使用的工具和体验中,如吉拉、Slack 和微软团队。

**例如,想象你在你的 Looker 仪表盘中,在那里你可以看到来自你的数据生态系统中的其他工具的所有上下文。您可以立即了解谁是所有者和专家,您是否可以信任仪表板,以及驱动它的管道是否已更新。**这是数据变得“本机可访问”的时候,这是数据网格最重要的目标之一。

元数据和数据网格

数据网格背后的一个关键概念是联合计算治理,或者是一个使用反馈循环和来自整个组织的自下而上的输入来自然地联合和治理数据产品的系统。元数据使这成为可能。

用于发现和管理数据产品健康的自动化工作流(图片由作者提供,来自我在 Datanova 2022:数据网格峰会上的演讲)

例如,考虑上面的自动化元数据工作流。有了关于人们实际使用什么资产的使用元数据,我们就可以创建一个关于每个数据产品被使用和更新了多少的产品健康得分。然后,我们可以根据健康得分对产品进行分类,并将每个产品与其数据产品所有者进行匹配。对于伟大的产品,产品负责人可以得到一条 Slack 消息:“恭喜!你的数据产品做得很好。”低质量或过时的产品可以自动从发现体验中删除或弃用,并且可以在吉拉上为相关所有者添加改进产品的标签。

这就是我所看到的数据网格的未来— 使用元数据创建一个真正的动作层,为数据网格背后的基本概念提供动力。

通过从许多不同的地方引入元数据,我们可以自动化和编排数据网格背后的基本概念,如民主化、可发现性、信任、安全性和可访问性。

实践中的元数据

到目前为止,我相信您会问,“在数据网格中真正实现主动元数据实践意味着什么?”

元数据允许您从孤立的环境转变为嵌入的环境(域),从一般化的体验转变为个性化的体验(数据产品),从最小的自动化转变为真正的自治(自助服务基础设施),从自顶向下的治理转变为民主化的治理(联合计算治理)。

但是从理论到实践的第一步是什么呢?创建数据产品运输标准。我已经谈到了“数据作为产品”的特征,这是数据网格背后的一个关键概念。其中的每一项都可以在组织或网格级别上编入运输标准。

数据网格背后的关键概念“数据作为产品”的特征(图片由作者提供,来自我在 Datanova 2022:数据网格峰会上的演讲)

例如,对于“可理解的”,我已经看到很多使用 5W1H 框架来定义什么使得数据产品可理解的成功案例。作为一个组织,您可以选择框架中最重要的元素并关注它们。

下一步是完全自动化这些过程。这使得基础设施成为真正的自助服务,这是数据网格范式的重要组成部分。例如,为了使数据产品易于理解,您可以从整个数据堆栈中引入上下文。解析 SQL 日志可用于在列级别自动对每个数据产品的流行度进行排名。来自数据管道的上下文可用于根据数据产品的来源创建列描述。

这一步可能需要实现新的工具来促进它,但归根结底,数据网格是一种文化和思维方式的转变。这就是为什么最后一个重要步骤是将人为驱动的标准和仪式纳入产品运输流程。

在一天结束的时候,你要求你的工程师和开发人员开始以不同的方式思考他们的角色,这并不容易。

这关乎文化变革,而不仅仅是科技。设定您的数据团队的价值观(例如可重用性),创建仪式来帮助每个人实现它们(例如文档小时),您最终会看到人们的心态和生产力的真正转变。

总而言之,很明显,数据网格的未来是光明的。关于这个主题的更多想法,请查看我在 Datanova 2022:数据网格峰会上的演讲全文。

本博客最初发表在 星爆的博客 上,经许可在此转载。

觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学*建设的文章。 在此订阅。

成功数据科学家的心态

原文:https://towardsdatascience.com/the-mindset-of-a-successful-data-scientist-d1e6c2d63dc0

数据科学成功的四种态度

关于如何成为一名伟大的数据科学家,有太多的文章,它们几乎完全集中在技术技能或流程上。但同样重要的是数据科学家的思维方式。我一次又一次地看到这一点——一个拥有所有正确技术技能的聪明人无法在数据科学岗位上取得成功,因为他们的分析思维完全错误。

他们知道他们的模型,他们知道他们的统计数据,他们是优秀的程序员,但他们努力解决问题并找到解决方案。他们的注意力过度集中在技术上。他们忽略了解决问题的方法。

如此多的数据科学文化是围绕技术技能建立的。“你知道的技术和库有哪些?”但是数据科学团队的任务是解决业务问题,而业务问题需要创造性的解决方案。创造性地解决问题,只有用正确的心态才能实现。

一个成功的数据科学家的心态是怎样的?

照片由在 Unsplash 上拍摄

寻找合适的工具

在数据科学角色中,你必须明白你的团队的最终目标是始终为业务问题提供答案。实现特定类型的模型或克服特定的技术障碍是不可能的。

对于回答客户最大的问题来说,实现特定模型类型或克服特定技术障碍的目标是次要的。它们是实现目标的步骤,但不是最终目标。

成功的数据科学家寻找大问题。然后他们找到解决问题的正确方法。作为一名数据科学家,你永远不应该把你的项目看做“我需要实现一个神经网络”,而是“我需要解决这个分类问题,而神经网络似乎是目前最合适的技术。”在这个过程中,你总有可能找到更合适的技术。

换句话说,永远是解决方案的问题,而不是工具的问题。不管别人告诉你什么,你的最终客户关心的是解决方案,而不是工具。如果某个工具一开始就不是工作的最佳选择,那么你将该工具强行引入解决方案的能力就不会被欣赏。

那么,什么是大问题呢?一个很大的问题是,最终客户将如何利用你提供给他们的模型、解决方案或见解。他们想学什么?他们将如何运用这些见解?例如,“我需要了解我们的哪些订户是活跃的跑步者,因为我打算向这些订户发送一封有针对性的电子邮件。”这将导致后续问题,如“向不积极的跑步者发送报价会有多糟糕?”用数据科学术语来说:“误报可以吗?”这些后续问题的答案将有助于我们对模型进行微调,甚至可能导致我们改变所实现的模型类型。

你可能会发现你的领导没有给你这些信息。当这个问题出现在你的办公桌上时,它已经被提炼为一个具体的技术任务。你必须找到它!你的领导很可能利用他们的经验来简化任务,这很有价值。但是如果他们没有通知你,那么你必须问“客户打算怎么处理这件事?在什么情况下我应该开始考虑替代方案?”这不仅会让你在具体项目上取得成功,而且会在你吸收领导经验的过程中加速你的学*。

在任何情况下,都要问自己“我真正想解决的是什么?”只有这样,你才能问自己“什么才是适合这份工作的工具?”

由谷仓图片在 Unsplash 上拍摄

尊重利益相关方

现在你知道最大的问题是什么了,并且你已经花了时间思考适合这项工作的合适工具。是时候去实施它并得到一些答案了!对吗?但是你的领导、客户和同事已经知道的事情呢?

你听过多少次人工智能模型产生奇怪的预测,而这些预测显然是错误的?IBM 的沃森在 Jeopardy 上比赛就是一个很好的例子。这是一个巨大的成功;它胜过了最好的人类竞争对手。与此同时,它产生了一些极其错误的答案。任何人,无论身处何种环境,都知道这些答案是错误的。从我们的角度来看,这是可笑的。但是从机器的角度来看,这是一个完全有效的反应。机器只是缺少了人类擅长添加的一部分内容。

作为一名数据科学家,你试图通过挖掘数据、数学和逻辑来解决问题。所有这些都存在于更广泛的背景下。如果你不理解更广泛的背景,你会产生可笑的结果。你的客户、你的领导和你的同事将会注意到一些非常错误的事情,如果你不能解释它,你的解决方案将注定失败。这很不幸,因为你的模型可能是现存的最好的一个,它可能胜过所有最好的竞争模型。但是那些可笑的错误结果,不管多小,都会让它看起来像个傻瓜。

当有人问一个问题时,往往有大量的辅助语境知识可供借鉴。如果他们询问活跃的跑步者,因为他们想为他们介绍一封有针对性的电子邮件,他们可能知道一些关于活跃的跑步者的事情。充其量,他们的知识可能对训练模型有用。最坏的情况是,它们与我们的目的无关。最有可能的是,当客户看到最终结果时,他们会帮助我们准备问题。“嘿,你的分类显示我们的顾客中有 25%是积极跑步者,但我们以为是 35%?怎么回事?”

数据科学家经常会忽略这些知识——“我的数据集不是这么说的”,或者更糟,“谁在乎他们怎么想,我有数据,它显示 …”这类似于 IBM 说“不管你们人类能不能看出我们的答案是错的,我们的答案只是比事实更好。”

在项目开始时,你必须尽力了解更广泛的背景。有些来自你的客户,有些来自你的领导,有些来自你的同事。考虑上面的活动流道示例。你的第一个问题可能是:“对于我们的客户中有多少是积极跑步者,我们有任何现有的估计吗?我们对这些估计有多少信心?他们从哪里来的?”这将给你一个强有力的基础来判断你的模型是否系统地低估或高估了分类。在得到答案之前,你可能不得不与所有三组利益相关者交谈,但是你将为自己省去许多重复工作和尴尬。

语境很重要!成功的数据科学家发现并使用它。那些不会看起来愚蠢的人——不管他们的实际工作有多棒。

丹尼尔·弗兰克在 Unsplash 上的照片

知错就改

你已经做了充分的准备,你知道问题,你知道背景,你已经找到了最好的技术,你已经微调了你的模型。你已经把你的模型传给了下一个团队。但是某些东西,某些地方,没有起作用,你的结果,你的理论,你的模型都是错误的。

无论多么罕见,它都会发生在我们每个人身上。有时这是一个简单的错误,很容易修复,有时这是一个很深的系统性错误,需要几个星期才能纠正。找到成功意味着以积极的方式建立在这些错误之上。你一定是用正确的方式错了。当你意识到自己错了的时候,这对整个系统来说是一个巨大的冲击。很多情绪很快就被牵扯进来了。你感到尴尬、沮丧和愤怒。对许多人来说,这意味着他们忽略了一个事实,即他们或他们的模型可能是错误的。完全忽视这种情况比处理所有的情绪更容易。犯错的第一条规则是,你必须对出错的可能性持开放态度。无论最初的错误有多糟糕,在错误的事情上加倍总是会增加问题。

那么什么是成功的方法呢?当别人说你错了的时候,倾听他们。接受他们的意见。如果在这个过程中犯错为时已晚,并且你能感觉到情绪即将爆发,那么立即停止。你首先需要知道你是否真的错了。唯一的方法就是从这种情况中退一步,理解你得到的反馈。如果这意味着你必须转移到一个新的话题,或者干脆取消一个会议,那么就去做吧。

作为一名数据科学家,真相是最重要的目标,而不是支持你的自我。所以,争取时间来评估形势,如果你以后不得不忍辱负重,那就吃吧。这可能会在短期内造成伤害,但从长远来看,你会通过接受相反的观点来建立关系、信任和合作。从短期来看,你还可以保护一个错误不至于发展成越来越大的问题,就像隐藏时经常发生的那样。

永远对错误的可能性保持开放,永远选择真理而不是自我。

亚历克斯·舒特在 Unsplash 上拍摄的照片

爱解决问题

对于一个数据科学家来说,最重要的想法是“我迫不及待地想弄清楚这个问题。”作为一名数据科学家,问题的多样性和复杂性令人难以招架。如果你没有想到“一定有办法找到答案,我只需要找到它”,那么事情会很快变得不可收拾。这里的关键是,你必须思考“有一个问题,我找到解决方案。”

最重要的是,你的客户和你的领导正在寻找答案,不幸的是,通往这些答案的道路很少是许多新数据科学家所期望的平滑直线。事实上,这往往是一条漫长而曲折的道路。会有很多失策和死胡同。带着机遇的态度去面对它们——它们是学*的经验,不管当时多么令人沮丧,它们在未来会很好地为你服务。

你必须热爱将问题转化为答案的过程,同时也必须热爱克服每一个技术障碍的过程。你的客户不在乎这些技术障碍,但你需要热爱战胜它们的过程。这些技术障碍将定义你的日常体验;你需要感受克服每一个困难的快乐。

让自己感受到有答案时的大满足感,庆祝一下,分享一下。但是不要忘记旅途中的快乐。

马特·霍华德在 Unsplash 上拍照

虽然技术技能可能会让你获得成功,但除非与正确的心态相结合,否则这些技能不会让你成功。为了在数据科学领域建立职业生涯,您必须始终确保保持正确的心态-寻找正确的工具,倾听利益相关者的意见,知道如何犯错,最重要的是,不仅要对目的地充满热情,还要对沿途的旅程充满热情。

取得联系

欢迎通过 LinkedIn 联系我,了解更多关于数据科学领域的观点。

思维技巧,以前所未有的方式理解精确和回忆

原文:https://towardsdatascience.com/the-mindset-technique-to-understand-precision-and-recall-like-never-before-1a4b80ac551b

通过示例情况详细说明精确度和召回率

阿菲夫·库苏马在 Unsplash 上拍摄的照片

**·** [**Introduction**](#7597) **·** [**Precision and Recall**](#1ed1) **·** [**Precision**](#f471) **∘** [**Understanding the Precision Mindset**](#4915) **·** [**Recall**](#d519) **∘** [**Understanding the Recall Mindset**](#1398) **·** [**Precision vs Recall**](#ce2e) **·** [**Conclusion**](#9738)

介绍

利用一组正确的评估指标来评估数据驱动的分类模型的性能,对于构建和交付可靠的机器学*解决方案/产品来说非常重要。

顾名思义,分类模型是一类机器学*算法,专门用于预测给定输入的正确类别。

分类概述(按作者分类的图片)

马上,你会看到几乎每个机器学*工程师用来评估他们模型的标记性能的第一个性能指标是“准确性”——模型做出正确预测的百分比。

准确性公式(图片由作者提供)

简单的计算和可解释性使准确性成为最常用的性能指标之一。

然而,在实践中,准确性通常因为隐藏了关于模型性能的重要信息而臭名昭著。

这在不平衡数据的情况下变得尤其具有挑战性,在这种情况下,数据主要偏向特定的类。例如欺诈检测、垃圾邮件分类等。

班级分布示例(图片由作者提供)

在这种情况下,盲目地预测多数类,如上图所示,会导致 98% 的准确性——即使模型没有从数据中学到任何东西。

然而,这样一个简单的分类器并不适用于眼前的问题——这表明需要一个更好的性能指标。

介绍精确度和召回率!

精确度和召回率

在评估基于分类的机器学*模型的性能时,精确度和召回率是最常用的两个分类指标,尤其是在数据不平衡的情况下。

在不平衡数据的情况下,我们希望建模的主要是我们最感兴趣的少数阶级,并将其视为我们打算解决的问题。

在这方面,有利于少数类的预测通常被称为预测,而有利于多数类的预测被称为预测。

具有正负约定的类分布示例(图片由作者提供)

下图显示了一个流行的交叉列表,该列表显示了模型预测和地面真实标签:

在分类问题中将模型预测分类为 TP、TN、FP 和 FN(图片由作者提供)

先来了解一下精度。

精确

Precision 回答了以下问题:

正面预测 实际正确的比例有多大?

从系统做出的所有正面 正面预测池中,Precision 找到那些实际上是正面预测的分数。

例如,在电子邮件垃圾邮件分类器的情况下,如果系统将 10 封电子邮件分类为垃圾邮件(预测为肯定的),但只有 5 封实际上是垃圾邮件(实际肯定的),则精度为 50%

精度公式(图片由作者提供)

这里要注意的一点是,精度作为一种度量标准,只关注 ML 系统预测为阳性的那些样本(或数据点)。

因此,它忽略了被模型归类为负面的所有实际正面。

您也可以将精度定义为模型对所有正面预测的准确性。

精度公式(图片由作者提供)

总而言之,精度是指 ML 系统发现的阳性结果中实际阳性结果的比例。

理解精准思维

当你遵循一种精确的思维模式时,你本质上向模型传达的是,不要浪费我的时间,通过产生假阳性来试图找到那里的每一个积极的东西。

相反,无论你做出什么积极的预测,实际上都应该是积极的。

换句话说,在这里,即使模型错过了一些实际的积极因素,并将它们归类为消极因素,只要积极的预测实际上是积极的,你也是平静的。

然而,让你愤怒的是那些实际上是负面的正面预测。

再次回顾电子邮件示例,如果您的目标是高精度,那么如果一封实际的垃圾邮件被归类为非垃圾邮件(实际的肯定预测为否定)也没问题。

但是,您不能容忍的是一封非垃圾邮件被标记为垃圾邮件。

精度公式(图片由作者提供)

考虑到上面的数学公式,提高精度的一种方法是尽可能降低“假阳性”。也就是说,拥有最少数量的实际上并不积极的积极预测。

回忆

回忆回答了以下问题:

模型正确识别实际阳性的比例是多少?

所有实际阳性的池中,Recall 找到那些被模型分类为阳性的分数。

再举一个垃圾邮件分类器的例子,如果整个数据集中有 10 封垃圾邮件(实际为阳性),并且模型将其中 7 封分类为垃圾邮件(预测为阳性),则召回率为 70%

回忆的公式(作者图片)

这里要注意的一点是,作为一种度量,召回只关注那些在数据集中实际为阳性的样本(或数据点)。

回忆的公式(作者图片)

简而言之,您也可以将召回定义为模型对数据集中所有正面示例的准确性。

理解回忆心态

在遵循回忆思维的同时,你本质上传达给模型的是从数据集中捕捉所有积极的例子。

换句话说,在这里,即使模型将一些原本是阴性的样本分类为阳性,只要它正确地对数据集中的所有阳性样本进行分类,您也不会感到不安。

然而,让你怒不可遏的是数据集中正面例子的错误分类。

再看一下电子邮件的例子,如果你的目标是高召回率而不是精确度,那么只要所有实际的垃圾邮件被捕获,非垃圾邮件被归类为垃圾邮件也没问题。

然而,你不能容忍的是错过任何真正的垃圾邮件。

回忆的公式(作者图片)

考虑到上面的数学公式,提高召回率的一个方法是尽可能降低“假阴性”。也就是说,拥有最少数量的实际上是正面的负面预测。

精确度与召回率

总结一下:

  • 一个具有高精度的系统可能会遗漏一些实际的正类,但是它想要返回的是正类的高精度。
  • 另一方面,一个具有高召回率的系统可能会给你许多实际否定的错误分类,但它几乎总是会从数据集中正确地分类实际肯定。

选择哪一个是一个艰难的决定,完全取决于你使用机器学*解决的问题。

一般来说,优化精度通常会降低召回率,反之亦然。因此,许多应用程序考虑从精确度和召回率(称为 F-score)中导出的度量来测量机器学*情况的性能。

F1 分数的公式(图片由作者提供)

下面,让我们考虑一些示例情况,以决定在精确度和召回率中您应该更喜欢哪个指标,以及为什么。

情况 1

假设你正在建立一个课程推荐系统。这个想法是根据学生的个人资料向他们推荐课程。

一个学生的时间很关键;因此,你不想浪费他们宝贵的时间推荐他们可能不喜欢或不相关的课程。

你会优化什么?精准还是召回?

回答:

在我看来,精度是你应该更喜欢优化的。不推荐好的课程是可以的。

然而,你的系统推荐的应该是高质量的,因为学生不应该花时间看与他们无关的课程。

情况 2

接下来,假设您要列出一个职位空缺的候选人名单,看看他们是否应该被选中参加面试。由于您的组织正在寻找有才华的候选人,您不想错过可能成为潜在雇员的候选人。

你现在会优化什么?精准还是召回?

回答:

拥有没有经验或不相关的候选人不会有什么坏处,只要你抓住所有相关和有才华的人。

因此,召回是您应该优化的指标。如果你改为优化精度,有可能排除有才华的候选人,这是不可取的。

场景 3(承蒙:凯西·科济尔科夫)

假设你是一个小偷,你闯入了一所房子。你的目标是抢劫金钱、珠宝和所有你认为“有价值”的东西

抢的时候,你是精准思维还是回忆思维?

请在回复中张贴您的答案!

情况 4

我们都在一起玩过,不是吗?

如果不是,目的是在一组玩家中识别出冒名顶替者。

你会用精确思维还是回忆思维来玩这个游戏?

请在回复中告诉我!

结论

精确度和召回率之间的选择可能是高度主观的,它完全取决于您正在构建的应用程序,同时考虑什么对您的业务/个人用例有价值。

如果您想要高质量的结果,并且您接受错过一些好的项目,请选择 Precision。

如果你想要所有的好结果,选择回忆,但是同时,你不介意任何错误的分类作为好结果中的冒名顶替者。

如果两者对您的业务问题都有价值,请选择两者(F-measure)。或者,从其他广泛使用的性能指标中进行选择,或者为您自己的问题设计一个。

感谢阅读!

🧑‍💻成为数据科学专家!获取包含 450 多个熊猫、NumPy 和 SQL 问题的免费数据科学掌握工具包。

✉️ 注册我的电子邮件列表 不要错过另一篇关于数据科学指南、技巧和提示、机器学*、SQL、Python 等的文章。Medium 会将我的下一篇文章直接发送到你的收件箱。

Osita meme(作者 Gif)

每个数据科学家都至少犯过一次的错误

原文:https://towardsdatascience.com/the-mistake-every-data-scientist-has-made-at-least-once-3479002211b4

…以及如何增加避免这种情况的机会

如果你在一个没有被证实安全的地方使用一个工具,你造成的任何混乱都是你的错……AI和其他工具一样,所以同样的规则也适用。千万不要盲目相信。

相反,强迫机器学*和 AI 系统去 赢得 你的信任。

如果你想用例子来教学,例子必须是好的。如果你想相信你学生的能力,测试必须是好的。

请始终记住,除了您检查系统的条件之外,您对系统的安全性一无所知,因此请仔细检查!这里有一个方便的提醒列表,它不仅适用于 ML/AI ,也适用于基于数据的每一个解决方案*:*

  • 如果你没有测试过,就不要相信它。
  • 如果你没有在你的环境中测试过,就不要在你的环境中信任它。
  • 如果你没有用你的用户群测试它,不要用你的用户群信任它。
  • 如果你没有用你的数据群体测试它,不要用你的数据群体信任它。
  • 如果一个 输入不正常 ,不要相信你的系统会输出合理的东西。考虑使用异常值检测和 安全网 (例如,标记一个不寻常的实例以供人工审查)。

设计好的测试是保证我们所有人安全的关键。

数据新手和数据科学专家之间的一个区别是,专家有一些巨大的信任问题……并且乐于拥有它们。

来源: Pixabay

专家犯的错误

在我们的上一篇文章中,我们研究了初学者会犯的测试错误以及如何避免它。现在是时候看看一个甚至专家都会犯的更为隐蔽的错误了。

对于那些没有读过前一篇文章的人,让我们来给你补上设置(在一个平行宇宙中,我们没有犯新手的错误):

我们使用 70,000 张输入图像训练了一个像样的模型(你在上图中看到的每张图像都是一个占位符,代表 10,000 张带有香蕉、赫胥黎或特斯拉标签的相似照片;其中一个是我的早餐,另外两个是我的猫,你弄清楚哪个是哪个)然后在 40,000 张原始图像上进行测试。

我们得到了…完美的结果!哇哦。

当你观察到在一个机器学*任务上的完美表现时,你应该非常担心。正如上一篇文章警告你不要对 0%抱有错误的态度一样,每当你看到完美的结果时,嗅到一丝可疑是一个好*惯。专家的第一个想法是,要么测试太简单,要么标签泄露,要么数据不像我们希望的那样原始。当一位经验丰富的大学教授发现每个学生都完美地回答了每个问题时,他会有同样的想法。他们会疯狂地调试,而不是为良好的教学而沾沾自喜。

由于 100%对于逼真的场景来说不是一个真实的结果,让我们想象我们得到了一些其他高但不太高的分数,比如 98%。

很棒的表演,对吧?听起来原始数据的性能不错。随着所有的统计假设测试花里胡哨的处理!我们已经建造了一个令人敬畏的特斯拉/赫胥黎探测器,让我们发射吧!!!

小心点。

你会忍不住妄下结论。这可能根本不是 Tes/Hux 检测器,即使它在测试中给出了很好的结果。

专家们犯的错误与技术关系不大,更多的是与人有关:屈服于一厢情愿的想法。

专家们也不能避免一厢情愿的错误。

不要假设这些结果对系统实际检测的内容有任何意义。我们没有证据表明它已经学会——或者更糟的是,“它理解”——如何区分 Hux 和 Tes。仔细看…

你注意到所有 Tes 照片背景中的小细节了吗?哎呀,原来我们不小心建立了一个散热器/非散热器分类器!

过度关注问题的某些部分和我们感兴趣的数据——比如两只猫的身份——而忽略其他部分,比如大多数 Tes 照片中的散热器,因为那是她喜欢出没的地方,因此也是她最有可能被拍照的地方,这是一个非常人类的错误。不幸的是,她太喜欢散热器了,以至于在训练数据和测试数据中都出现了相同的问题,所以你不会通过测试来自你用于训练的同一人群的数据来发现问题。

只要你(以及你的利益相关者和用户)有钢铁般的纪律:

  • 不要把可爱的故事读进结果中,比如“这是一个 Hux/Tes 分类器。”这种语言暗示着比我们有证据证明的更普遍的东西。如果你对机器学*系统实际上在做什么的理解符合一个简洁的报纸标题,那么你可能做错了……它至少应该让你对它的细节感到厌烦。
  • 痛苦地意识到,如果你测试系统的环境和你训练系统的环境之间存在差异,你就不能保证你的解决方案会有效。

这种学科是罕见的,所以在我们有更好的数据素养之前,我所能做的就是梦想成真,为教育人民尽一份力。

这个系统只能处理以与测试和训练数据集相同的方式拍摄的照片——冬天来自同一间公寓的照片,因为那时特斯拉倾向于在散热器旁闲逛,而赫胥黎却没有。如果你总是用同样的方式拍照,而且你有很多照片,谁会在乎你的系统是如何分配标签的,只要它能给你正确的标签。如果它使用辐射器在标签游戏中获胜,那很好…只要你不期望它在任何其他上下文中工作(它不会)。为此,您需要更好、更广泛的训练和测试数据集。如果你把系统搬到不同的公寓,即使你认为你了解你的系统是如何工作的,也要重新测试它,以确保它仍然工作。

你的数据所代表的世界是你唯一会成功的世界。

记住,你的数据所代表的世界是你唯一会成功的世界。所以你需要仔细考虑你正在使用的数据。

避免专家失误

永远不要假设你理解人工智能系统在做什么。认为自己对一个复杂事物的简单认识是防弹的,这是傲慢的高度。你会为此受到惩罚的。

永远不要假设你理解人工智能系统在做什么。认为自己对一个复杂事物的简单认识是防弹的,这是傲慢的高度。你会为此受到惩罚的。

很容易忽略数据中真实世界的细微之处。无论你在这方面有多有天赋,如果你在数据科学领域工作了足够长的时间,你几乎肯定会至少犯一次这种一厢情愿的错误,直到你学会严重缩减你的结论的艰难方法——你可以养成的最好*惯是,在你彻底检查证据之前,避免对事情进行额外的解读。当你对结果的内心独白听起来不像是 TED 演讲,而更像是世界上最无聊的合同的细则时,你就会知道你已经到达了下一个层次。这是好事。如果你坚持的话,稍后你可以用你的快速谈话来迷惑,只是不要因为相信你自己的双曲线而使数据素养尴尬。

从良好的测试结果中,您唯一能学到的是,该系统在与测试条件相似的环境、情况、数据集和人群中运行良好。你对它在这些条件之外的表现的任何猜测都是虚构的。仔细测试,不要妄下结论!

感谢阅读!YouTube 课程怎么样?

如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

在这里欣赏整个课程播放列表:bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

有兴趣尝试图像分类吗?

点击此处开始使用 Google Cloud Vision API 和 AutoML Vision :

https://bit.ly/googlecloudvision

现代客户数据堆栈

原文:https://towardsdatascience.com/the-modern-customer-data-stack-3cd91a3e79d1

客户数据平台的更好替代方案

卢克·切瑟在 Unsplash 上的照片

您知道吗?创新数据和分析领导者正在控制他们仓库中的第一方数据,不再依赖 CDP 等第三方平台。这变得越来越有必要,因为使用 cookies 跟踪用户的做法正在消失,隐私法规是人们最关心的问题,大技术公司正在对可跟踪的内容实施限制。公司需要通过控制他们的第一方客户数据堆栈,开始掌握自己的数据命运。这种方法为您自己的数据提供了完全的隐私和治理,并释放了创新和数据驱动型增长的巨大潜力(您可以在这里阅读 CDP 不是未来的原因的更详细分析)。

我们将这种新方法称为现代客户数据堆栈,它完全以数据仓库或数据湖为中心。好消息是,在过去几年中,作为分析领导者,创建和拥有您的现代客户数据堆栈变得更加容易。在本文中,我们将了解现代客户数据堆栈是什么样子,以及我们看到雄心勃勃的数据所有者采取了哪些方法来实现它。

现代客户数据堆栈的组件:

  1. 数据层— 核心数据存储层,包括数据仓库或数据湖
  2. 摄取层 —从各种来源将客户数据摄取到您的数据仓库中
  3. 客户数据模型 —将数据仓库中的客户资料组织到一个视图中
  4. 可视化&智能层 —深入了解客户和营销工作,推动增长
  5. 激活层 —通过激活您对营销、销售、客户服务和产品工具的洞察力来推动增长

数据层

现代客户数据堆栈的核心是利用已经为现代数据架构铺平了道路的工具,并在这些工具集的基础上进行构建。只要您的数据集中在一个可查询的存储层中,您就可以获得这种架构的好处。

数据仓库

对于系统的数据层,该体系结构由数据仓库的高性能特性提供支持,并建立在这些特性之上。公司已经大量采用 BigQuery、Snowflake 或 Redshift 等数据仓库来集中数据,现代数据堆栈建立在这些工作的基础上,而不是取代它。通过在数据仓库中拥有您的数据,您为您的数据分析和数据科学团队开辟了一条道路,使他们能够在其首选的工具集中进行创新,同时拥有您的数据安全性、隐私和治理。

数据湖

如果您的团队使用 AWS Athena 或 Azure Synapse 之类的数据湖架构,您仍然可以将其用作现代客户数据堆栈的存储层,而不是数据仓库。数据湖工具还提供了一个 SQL 查询接口,允许您将它们用作这个堆栈中的存储层。

摄入层

构建客户数据堆栈的一个主要步骤是将所有第一方数据放在一个地方。有许多方法可以实现这一点,但我们将触及一些常见的方法。通过将所有的原始数据带入数据仓库并对其建模,您为您的团队释放了大量的价值,让他们可以使用这些数据来实现增长。实际上,您的数据将被分散到不同的内部或外部系统中。其中一些系统具有 API、ODBC 连接器、SFTP 或其他接口,必须集成这些接口才能获取数据。那么,将所有数据放入仓库的方法是什么呢?

批量摄入

最快的开始方式是采用您选择的 ETL 工具从各种 API 和连接器加载批量数据。这些工具非常适合按照设定的节奏从不同平台以原始形式导入数据。例如,将数据从您的 Salesforce 实例接收到雪花或 BigQuery 中。您会在这个领域找到各种开源或第三方工具。您最终使用哪种工具取决于您可用的工程资源、成本以及您希望您的团队拥有多少流程。以下是我推荐的几个选项:

  • **开源:**歌手,舵栈
  • 第三方: Fivetran,Stitch,Matillion

批量摄取—作者图片

产品事件收集器(网络和移动)

除了导入批量数据,许多希望实施产品分析的公司将选择直接与其 web 或移动应用程序集成的工具来收集事件。这种方法需要您的工程团队进行更多的前期工作,以将 SDK 集成到您的移动应用程序和 web 应用程序中。它们允许您跟踪产品事件,如登录、搜索或点击。对于产品事件收集者,你可以选择购买或者自己构建

购买工具

要更快地设置数据堆栈,购买工具是一个不错的选择。如果你选择购买路线,你可以在市场上买到像 Segment、Mixpanel、Amplitude 或 Heap 这样的选项。首先,回顾一下您的团队目前已经在使用哪些分析工具。通常,您的工程团队已经在通过 GA 360、Segment、Amplitude 或 Heap 收集某个地方的事件。

打造自己

如果您希望在节省成本的同时扩展您的收藏,您可能需要考虑构建选项。大多数团队都在使用 Amazon Kinesis、Kafka 或 PubSub 来推出他们自己的系统,或者他们使用像 Snowplow 这样的开源框架。如果你有很强的工程文化,并且正在使用建筑方法,我们推荐 Snowplow,因为我们看到公司走得最远,最快。

数据仓库的事件收集—按作者分类的图像

客户数据模型

既然您的数据仓库中已经有了原始形式的客户数据,那么是时候对其进行组织以使其对您的团队有用了。这是问题的一部分,好的架构设计和思想将大有帮助。目标是将原始数据组织成可操作的模型或实体,为您的业务用例服务。堆栈的这一阶段可能涉及几个关键组件:

  • 身份解析:识别不同数据源中的相同用户
  • 主数据模型:创建您的客户以及相关事实和维度的最终/清晰视图。

这里需要提醒的是,要从简单开始,不要试图煮沸海洋。增量地构建模型并快速迭代会让你更快地获得真正的价值。请记住,我们的目标是在几天内实现价值,而不是几个月。我们看到的一种行之有效的方法是从创建激活营销和销售增长所需的业务对象开始——客户、交易和事件。

身份解析&重复数据删除

身份解析的目标是对数据源内部和数据源之间的个人进行重复数据删除,为您拥有的每个客户留下一个单一的标识符(id)。这是出于沟通目的解决客户单一视图的重要一步。身份解析似乎是一项艰巨的任务,但即使对于这个问题,也有一种更简单的方法可以开始。你可能很想钻进兔子洞,看看黑盒/人工智能驱动的身份解析解决方案,但现在先把它们忘掉。我们建议从基于规则和基于优先级的身份解析开始,在不同的表之间匹配特定的键。

数据仓库中基于 SQL 的简单身份解析的关键步骤:

  • **识别匹配关键字:第一步是确定您将使用哪些字段或列来确定哪些人在源内和跨源是同一个人。匹配关键字的典型例子可能是电子邮件地址和姓氏。
  • 聚合客户记录:第二步是创建一个源查找表,其中包含来自源表的所有客户记录。我们称之为查找表。
  • Match &分配一个客户 ID: 最后一步是简单地获取具有相同(或者在某些情况下相似)匹配关键字的记录,并为匹配的客户记录组生成一个唯一的客户标识符。生成的每个客户 id 都可以用于将客户源链接在一起。
  • **滚动更多来源:**当您获得更多来源时,您可以通过为来源设置正确的规则和优先级,开始将它们滚动到相同的流程中。

创建主模型

为了创建您的第一个客户视图,您已经解决了第一个身份问题。接下来是让您的数据管道或 ETL 过程就位,以构建将推动分析的主模型。为了推动快速价值,我们建议从“**客户→交易→事件”**框架开始。这个框架需要从源数据中创建三个关键对象。下面是关于这种类型的模式的更多细节。

**客户:**创建一个能够快速添加新字段的客户表

**事务:**将客户表中的键连接到他们的事务历史中

**事件:**您为每个客户跟踪的任何事件

业务实体的简单模式—按作者分类的图片

如果您的公司是一个双边市场或者有不同的业务实体,您可以更改这些主数据模型,以遵循对您有意义的方式。例如,对于一个双边市场,您可能将卖方和买方的表作为不同的实体。对于 B2B 业务,您可能有单独的帐户和联系人实体。

工具

虽然有许多方法可以获取源数据并在您的仓库中进行转换,但我们看到创新分析团队使用开源堆栈的速度更快。在过去的几年中,用于创建现代客户数据堆栈的开源工具取得了长足的进步,使管理和维护您的数据变得更加容易。许多团队已经转而使用数据构建工具(DBT)来构建、维护和快速迭代具有生产级数据管道的模型。我们的团队使用 DBT,并且是他的忠实粉丝。同样的事情可以用其他 ETL 工具甚至 Lambda 无服务器架构来完成。

当谈到工作流编排时,Airflow 已经广泛用于运行数据管道或机器学*模型的空间。它还可以作为托管服务部署在 GCP 和 AWS 上,因此您的团队不必管理基础架构。气流的其他替代品包括提督,Dagster,KubeFlow 等。

可视化和智能层

建立现代客户数据堆栈的主要驱动力之一是能够灵活地推动洞察、发展业务和改进产品。一旦您将数据集中到一个数据仓库中,您就可以通过可视化和运行预测性分析的能力立即释放这些洞察力。对于可视化,您可以使用 Looker、PowerBI、DataStudio 或任何其他工具。智能层是事情开始变得令人兴奋的地方,它能够为您的数据科学或分析团队创建 ML 模型或扩展创新,使用任何首选工具— python、spark、SQL。您的团队现在可以成为向导,所有数据唾手可得。正如我们之前所写的,这是现代客户数据堆栈与使用客户数据平台(链接)的关键区别。

一个简单但经常使用的例子是创建客户流失评分模型。这可以通过利用 Amazon SageMaker、BigQuery ML 或 Vertex AI 等工具进行训练、调优和预测来轻松实现。来自这些模型的预测可以很容易地融入到您的模型中,并为您的营销或销售团队提供服务,以优先考虑他们与客户的联系。

可视化和智能工具—作者图片

一旦这个智能层在一个组织中形成,它就会成为推动增长的良性循环。您的数据团队最了解您的业务和客户数据,因此他们可以创建最有效的见解和模型。您的业务团队使用这些模型来推动营销和销售活动,以影响客户行为和增长。然后,业务团队开始寻求更多的见解和预测,以推动进一步的客户数据创新。在这一周期结束时,您的公司拥有整个数据和见解资产,使您能够灵活地在此基础上进行构建,并在新系统中加以利用,同时永远不会局限于特定的第三方。这就是现代客户数据堆栈的神奇之处。

活化层

在对数据进行组织并准备好推动对客户的洞察后,下一个关键问题是如何通过您的销售、营销、客户服务和产品团队激活这些第三方客户数据洞察?毕竟,拥有您的现代客户数据堆栈的关键原因是能够激活它来推动客户行为和增长的变化。通常,我们看到公司在团队中使用各种各样的工具来吸引客户,包括 Salesforce、Marketo、Braze、脸书广告或谷歌广告。那么,在我们前面的例子的基础上,您如何列出可能会流失的客户,并让他们使用这些工具呢?今天,如果你想为这些有风险的客户开展脸书广告活动,你必须创建一个 SQL 查询,从数据仓库中提取一个列表,将其下载到 CSV,并上传到脸书广告或构建一个集成。这个过程是高度手动的、耗时的,并且产生了太多的摩擦,以至于不能实现现代客户数据堆栈的全部潜力。

释放现代业务数据堆栈潜力的一大缺失是**激活层–**从现代客户数据堆栈中获取客户洞察并在销售、营销和客户服务工具中激活它们的能力。这就是为什么反向 ETL 空间现在蓬勃发展,许多工具开始出现,允许你这样做。完全公开,这是飞轮填补的空白,也是我工作的地方。我们构建了第一个专门为企业销售和营销用例构建的智能反向 ETL,该平台可以在任何数据仓库上工作。激活层工具使团队能够基于您的第一方数据洞察运行更多实验,并推动增长速度加快。

底线:拥有您的数据,拥有您的增长

现代客户数据堆栈为企业提供了一种在不确定环境中掌控自身发展的方式。在过去几年中,创新的基于云的工具使公司更容易构建自己的现代客户数据堆栈,降低了拥有成本。与此同时,随着政府和大型科技公司的变化,企业组织对内部提供第一方客户数据的需求急剧增加。这些关键因素使现代客户数据堆栈成为 2022 年企业的首要任务,我们已经听到这一概念在各行各业引起共鸣。

现代客户数据堆栈—作者图片

我们很高兴看到现代客户数据堆栈的形成,并帮助高增长公司增强其增长引擎。公司现在部署的系统将决定他们拥有数据的能力和未来几年的增长。

现代数据模式

原文:https://towardsdatascience.com/the-modern-data-pattern-d34d42216c81

在启动阶段有效地进行 ML

现代数据模式

利用无服务器、雪花和 dbt 实现可重复的大规模数据处理和接收

没有太多操作的 MLOps 第 4 集,壮举。雅格布·塔利亚布埃、西罗·格列柯和安德里亚·波洛尼奥利

简介

正如我们在前几集中所讨论的,数据是 ML 管道不可或缺的一部分:遵循以数据为中心的方法,然后稍微概括一下,我们可以说一个数据公司的健全管道由两个主要部分组成,数据操作(摄取、标准化、准备、可视化、监控等。),以及 MLOps(培训、测试、部署、监控等)。).

在一些哲学文章之后,我们回到了实际的(开源)代码(是啊是啊,“空谈是廉价的,给我看看代码”)。我们将展示如何使用开源和 PaaS/SaaS 技术的组合来摄取、存储和转换数据:遵循我们的信条——“m lops without more Ops”——我们提供一个即插即用的模板,在“合理的规模”上对万亿字节的数据进行了尝试和测试。

我们利用三种主要技术:

  • Pulumi ,它允许我们管理代码形式的基础设施(在 Python 中)。
  • 雪花,它允许我们存储原始数据,并通过强大的查询来操纵它,抽象出分布式计算的复杂性。
  • dbt ,它允许我们将数据转换定义为版本化的、可重放的 Dag,以及混合匹配的物化策略,以满足我们的需求。

虽然我们提出了一个非玩具电子商务场景的工作管道(以立即利用我们的真实世界开放数据集和经验),但我们分享的一切都很容易适用于大量的用例:即使是中等规模的商店也可以生产和运行复杂的 ML 流程,我们发现通过电子商务技术栏的工具通常在大多数行业中表现良好。

克隆 repo ,跟着做:我们首先向完全陌生的读者展示基本块,然后展示更高级的模式,以展示更高级用例中的堆栈灵活性。

版本数据,而不仅仅是代码

为了做好准备并阐明一些初步观点,让我们想象一个典型的电子商务用例,即为myshop.com提供推荐(推荐是一种常见的数据驱动功能,大多数从业者应该能够很容易地想象自己处于我们的位置)。

在讨论摄取本身之前,我们想确定一个更一般的模式是清楚的。每天,myshop.com都会向我们提供其库存的数据转储,即 myshop 当天在售的所有产品。因此,在第一天,我们收到这些产品:

+------------+-------+--------------------+
| PRODUCT ID | PRICE |       COLORS       |
+------------+-------+--------------------+
|        123 |    12 | Blue / White       |
|        456 |    45 | Black              |
|        789 |    33 | Red / Blue / White |
+------------+-------+--------------------+

在第二天,我们收到了一个略有不同的目录:456 现在有更多的颜色,789 的价格稍低:

+------------+-------+--------------------+
| PRODUCT ID | PRICE |       COLORS       |
+------------+-------+--------------------+
|        123 |    12 | Blue / White       |
|        456 |    45 | Black / **Blue**       |
|        789 |    **28** | Red / Blue / White |
+------------+-------+--------------------+

获取和存储这些信息的正确方式是什么?“朴素 ETL”方式将有一个存储位置——比方说,一个表、Elasticsearch 中的一个索引等等。—包含 myshop 的产品:当收到第 2 天的目录转储时,相应的项目会被更新/覆盖,因此我们始终保证使用“最新”的版本。虽然这听起来很吸引人,但它有一个主要缺点:它永远摧毁了过去,因为现在,在第 2 天,没有简单的方法来恢复 456 的原始颜色。这有几个含义:

  • 我们不能在我们的数据堆栈中进行“时间旅行”:我们不能在数据驱动的系统中调试上周的错误,该系统的输入是目录——数据现在可能已经改变,并且再现系统的状态是不可能的;
  • 由于失去了对原始状态的跟踪,任何更新或修改都很难撤销,以防业务逻辑出错;
  • 测试新代码并对其进行迭代变得更加困难,因为不同的运行会产生略微不同的结果。

一个更好的模式是只追加日志模式,即维护一个只写的表,该表在一个不可变的分类帐中存储与我们在其中运营的宇宙相关的所有数据(在本例中,是 myshop 的电子商务数据):由于我们不能改变过去,我们类似日志的表将是我们在任何给定时间点的宇宙状态的永久记忆。实际上,这意味着在第 2 天有类似下面的原始表:

+------------+-----+--------------------------------------------+
|  TIMESTAMP | PID |                    RAW                     |
+------------+-----+--------------------------------------------+
| 1638139610 | 123 | {"price":12,"colors":"Blue / White"}       |
| 1638139610 | 456 | {"price":45,"colors":"Black"}              |
| 1638139610 | 789 | {"price":33,"colors":"Red / Blue / White"} |
| 1638226021 | 123 | {"price":12,"colors":"Blue / White"}       |
| 1638226021 | 456 | {"price":45,"colors":"Black / Blue"}       |
| 1638226021 | 789 | {"price":28,"colors":"Red / Blue / White"} |
+------------+-----+--------------------------------------------+

时间戳将事件(在本例中,是产品及其元数据的摄取)放入分类帐中,原始数据作为 JSON 转储:product 789 有两行——每个摄取事件一行——和预期的一样,有两个相关的元数据集合。从这个表示,总是可以将“第 2 天表格”恢复为这个流的视图,也就是说,捕捉每个产品的最新信息的“照片”。但是拥有最新的表并不会破坏以前的信息,就像运行从 git 获取的最新代码不会破坏以前的版本一样:这种结构在我们的产品堆栈中被昵称为“git for products”并不是偶然的。

当然,结合永无止境的日志表和实用的快照,捕捉宇宙在特定时间点的状态,现在比以前更容易实现的方式,这是三个主要趋势的结果:

  1. 数据存储越来越便宜,
  2. 现代数据仓库具有卓越的查询性能和强大的 JSON 支持,
  3. 像 dbt 这样的开源工具使得拥有广泛技能的人更容易以版本化、可重复、可测试的方式转换数据。

建造 noOps 摄取平台

既然已经解释了 log+snapshot 模式,我们可以更深入地研究这个项目:虽然我们将细节留给了 repo,但是提供工具和功能层的高级概述是很有用的。摄取管道模拟了数据驱动应用程序的典型数据流:客户端发送事件,端点收集事件并将其转储到流中,最后数据仓库存储事件以供进一步处理。

*摄取管道的功能概述:*我们使用 AWS lambda 作为端点,AWS firehose 作为流,雪花作为数据仓库,dbt 组织 DAG。整个基础设施由 Pulumi 用代码管理(图片由作者提供)。

在我们的示例中,我们为myshop.com提供建议,因此:

  • 发送事件的客户端是购物者浏览器:当用户在myshop.com上浏览产品时,一个 Javascript SDK 向我们的端点发送分析,以收集行为信号(稍后将用于我们的推荐器!).为了模拟这些现场事件,存储库包含了一个 pumper 脚本,它将真实的有效负载传输到云;
  • 端点用一个像素进行响应,这是一个用于处理客户端-服务器跟踪的 1x1 透明 gif(例如 Google Analytics);
  • 行为信号被转储到雪花中的原始表中;
  • SQL 驱动的转换(通过 dbt)获取原始事件并构建特性、中间聚合、规范化视图等。虽然详细描述下游应用超出了本文的范围(但请参见这个的详细示例),您可以想象人工智能工具和 ML 管道使用这些精心准备的表格作为自己工作流的输入。

像往常一样,我们想指出的是没有 devOps 的人因为运行这个平台而受到伤害(甚至被叫去):端点以一种无服务器的方式运行,并且由于 AWS lambda 将自动扩展(同样适用于 Firehose 上的数据流);如果需要,雪花计算能力可以根据查询调整*,无需任何维护或神秘配置(火花,想到你了!);dbt 流可以在 SaaS orchestrator(例如,Prefect)中运行,甚至可以通过“本地”dbt 云运行。*

我们的建议再次处于中间位置,介于运行“不可能的规模”负载的技术巨头的定制基础设施和对可用功能几乎没有控制的整体端到端企业平台之间。

我们将底层基础设施层交给第三方,这并不需要花费太多时间,但是它是无限可扩展的,因为当我们达到另一个规模或大幅改变我们的需求时,我们可以挑选不同的工具(例如,用 Kafka 切换消防软管,运行您自己的 dbt 作业,等等)。).

换句话说,对于快速增长的公司来说,完整的“消化故事”不太可能就此结束,但可以肯定的是,这是一个从开始的好地方

奖励:在一个堆栈中重新创建 lambda 架构

在大数据时代, lambda 架构 (to not 与 AWS 或 Python lambdas 混淆!)是数据驱动型应用程序的流行解决方案,在这些应用程序中,历史数据(过去 30 天的聚合和计数)和新数据(过去一小时的聚合和计数)对于可视化、监控或 ML 目的都很重要。简而言之,您并行运行批处理和流式系统,并为下游客户连接结果:仪表板将通过读取部分由慢速批处理和快速流式处理构建的表格来呈现收入趋势。Lambdas 的影响力有所减弱,一方面,许多批评者提倡不涉及维护事实上的两个堆栈的更精简的解决方案,另一方面,今天很多 ML 仍然没有真正使用实时数据——即使使用,也经常是“在线预测和批量特性”的场景。我们还能再做一次 lambda 梦,并利用现代数据堆栈来得到蛋糕并吃掉它吗?

再次考虑用户分析中的一个流行问题,即会话化,即获取原始事件流,按用户对其进行划分,然后根据某个时间阈值对连续活动窗口(“会话”)中的事件进行分组的问题。例如,下图中的购物者在myshop.com上与四双运动鞋进行了互动:

会话化示例:行为事件基于时间戳临时聚合(图片由作者提供)。

在摄取时(上面灰色框中的原始事件),管道在四个交互之间没有区别;会话化稍后的工作是根据 30 分钟的阈值将这些交互分组为两个会话,就像在 Google Analytics 中一样:因为第二次和第三次交互之间有超过 30 分钟(42),所以第三次事件标志着购物者新会话的开始。

在后端,会话化需要一些繁重的窗口函数,所以我们喜欢在没有太多延迟约束的情况下批量运行计算;另一方面,如果最*的事件(例如会话计数)在堆栈中仍然是可操作的,那就更好了。下面的程式化流程展示了如何重用我们之前介绍过的相同概念——仅附加表、基于 DAG 的处理、物化视图和运行时视图等。—用单个堆栈解决λ难题*。*

一个风格化的 lamba 实例,带有物化的表和视图(图片由作者提供)。

直觉上,不断增长的日志表(绿色)在逻辑上可以分为两部分:遥远的过去(橙色),不可改变,并且已经为其一劳永逸地分配了会话;以及最*的过去(粉色),其中新事件仍在不断出现,事物仍在不断变化。然后,我们可以在一个堆栈中运行相同的 SQL 逻辑,从而避免了原始 lambda 架构的两大缺点。dbt 使表达模式变得容易,然后利用最终的下游表(red)将两个会话化表统一为一个最佳记录集,用于下游应用程序,如我们的内部度量仪表板,或现在能够根据新数据重新训练的 ML 模型。

虽然这种模式不会取代成熟的低延迟流解决方案,但它开启了对 TB 级数据进行几乎实时(约 5 分钟)分析的可能性,其规模和速度是原始 lambda 架构及其复杂性只能梦想的。

如果您已经采用了 Snowlake、dbt 和 log 模式,它还可以帮助您以一种温和的方式弥合批处理和实时之间的差距,然后再投资一个并行堆栈来进行流式传输,如果您的可接受延迟是以分钟为单位来衡量的,则您可能不需要该堆栈。

正如我们在上面强调的,这可能不是您数据之旅的终点,但可能是一个起点:这是该领域取得的令人难以置信的进步的又一证明,如此复杂的转换现在可以由一个小团队大规模运行,几乎没有前期基础架构支出。

下一步是什么?

一旦所有的数据都被清理、标准化并处于正确的位置(只有到那时),大规模的高效机器学*才能发生。在我们系列的下一集中,我们将从我们离开这里的地方(也就是说,在数据仓库中)开始,并讨论现代 ML 工具如何能够让您立即从数据到 API。

如果你喜欢这篇博文,请在 Github 上加一颗星,分享给你的团队:和往常一样,我们欢迎其他做“合理规模的 ML”的同行的任何反馈、评论和战争故事。

致谢

感谢 Fabio Melen , Amir Sadoughi , Chip Huyen ,钟真徐, Ryan Vilim , Leopoldo Garcia Vargas 对本项目的宝贵反馈。

你写得越多,你就越能更好地解释你的工作

原文:https://towardsdatascience.com/the-more-you-write-the-better-you-are-at-explaining-your-work-708be316defc

作者聚焦

瓦什塔·谢尔博士:“我对完全初学者的第一个建议是从任何地方开始。”

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 瓦什塔·谢尔 博士分享我们的对话。

谢尔博士目前在艾伦图灵研究所应用研究中心担任数据科学家,利用深度学*技术解决 NLP 和计算机视觉领域的问题。她拥有牛津大学的计算机科学硕士学位和西蒙弗雷泽大学的学*分析博士学位。她在过去八年中的工作重点是 AI/ML 算法在无数领域的研究和实施的交叉,包括教育科技、金融科技和医疗保健。

是什么激励你选择目前的职业道路?

我从小就对数学和统计学非常感兴趣,从解决数独谜题和魔方到代数、微积分等等。直到我在硕士论文(人机交互和视觉分析)期间开始研究大数据可视化,我才真正意识到数据的力量,以及视觉如何在揭示模式和见解方面如此有用。

我现在意识到,data viz 只是广泛的数据科学光谱的一个子集,但这个冰山一角足以激起我对该领域的兴趣。

硕士毕业后,我有机会参与一个欧盟项目,其中包括建立一个复杂的仪表板,并进行自然主义用户研究,以评估其对公众的可用性。就在那时,我知道数据是我真正的使命。我喜欢从数据挖掘到 EDA(探索性数据分析)再到建模的整个过程的创造性。此后,我又转向了核心 ML 和(最*)DL 领域,但我最喜欢的是,没有一种适用于所有数据类型和所有问题陈述的通用方法。

在这一过程中,您是否发现数据科学的任何方面特别难以解决?

在我开始 DS 之旅的时候,我发现对要学*的东西和概念进行优先排序是一个挑战。如您所知,DS 领域一直在不断发展,知道从哪里开始会让人不知所措。直到我决定接触一些数据集,我才意识到有重复出现的主题,以至于我能够将概念和技术放入“必须知道”、“可能知道”和“应该知道”的桶中。

如今你更喜欢关注什么样的项目?

虽然数据科学是解决复杂问题的不可思议的工具,但我在简单中发现了美。因此,对我来说,DSSG(社会公益数据科学)项目是最有趣的阅读项目之一。对于那些感兴趣的人来说, Datakind 在这个领域做得非常出色,该团队一直在做的一些项目也非常出色。我想到的一个是利用卫星图像自动识别村庄来分配资金帮助。这是因为与乡村里那些有金属屋顶的家庭相比,有茅草屋顶的家庭通常更穷。

所有这些项目的一个共同主题是,它不是关于实现最复杂的算法,而是关于通过探索性分析找到洞察力,完成工作,并看到及时的影响。

你认为有什么特别有前途的领域吗?

我很高兴看到包容性的 ML 和 DS 技术。例如,最先进的自然语言处理模型大多是用英语训练的,但其他语言和方言无法利用类似 GPT 的模型。Prompt engineering 是另一个需要注意的领域,因为与大多数类似 GPT 的模型的交互对措辞或措辞很敏感,有时需要反复试验才能表现良好。

在非常忙碌的工作生活中,你为什么决定开始 公开撰写 关于数据相关的话题?

我开始写作主要是在疫情时期。写作是记录我为未来学*的一切的一种方式。这一点直到今天仍然成立——我想没有人比我读我的文章读得更多!

我希望我的写作风格清晰,没有专业术语,容易理解(至少对我来说),这就是为什么我能够如此轻松地开始写作。随着时间的推移,写作成了我测试自己对某个特定话题理解程度的一种方式——因为除非你能以 ELI5(像我一样解释)的方式解释某事,否则你自己真的能理解吗?

你在图灵研究所的工作会影响你在 TDS 上为更广泛的读者写的文章吗?

事实上,恰恰相反。我倾向于写一些主题,这些主题更广泛地适用于和我不在同一个部门工作的人。这非常有用,因为可转移技能在数据科学领域非常重要。然而,我应该提到,我的一些更受欢迎的帖子是基于我在典型的一天工作中遇到的事情——导入文件、git 提交、设置虚拟环境等。

你如何决定你要写的主题?如果有人想写自己的作品,但又不知道从何下手,你会给他们什么建议?

我对质量重于数量有严格的政策。所以,在我开始写作之前,我会快速浏览一下潜在主题的谷歌搜索结果。如果找不到相关的东西,我就开始写或者,如果我觉得我可以通过写作更好地解释它。此外,我也有一些我完全信任的博客和虚拟博客,如 MachineLearningMastery 、 Jay Allamar 的博客、 Yannic Kilcher 、 Aleksa Gordic 等。,在我开始写作之前,我侦察这些。这对我来说是有意义的,因为如果有人已经用我只能想象的方式解释了一切,我看不出增加过多资源有什么意义——事实上,我宁愿让我的读者知道。

说了这么多,我对完全初学者的第一个建议是从任何地方开始——不管关于这个主题已经写了多少,不管你的文章有多长,不管你认为它会被你的读者接受到什么程度。选择一个你有信心向你的父母、兄弟姐妹或朋友解释的话题,然后写下来。

这个主题甚至不必是一个成熟的算法(对我来说,它是解释一个 p 值应该如何解释);它可能是小众的,比如一个常见的运行时错误(你可以在 GitHub 问题中找到很多)和它的修复。如果选择一个主题似乎很难,选择一种数据形式(图像、音频、视频等。)并收集一些局外人应该了解的常用分析技术。例如,计算机视觉中的数据增强技术。

很快你就会意识到:你写得越多,你就越能更好地解释你的工作。这是你在面试中绝对应该提到的良好沟通技巧的例子。

作为一个着眼于未来的话题,您希望在未来几年内看到数据科学领域的哪些变化?

我认为,在未来几年中,有希望为医疗保健、自动驾驶汽车等高风险领域使用的 ML 模型制定 FDA 级评估协议。就在上个月,美国政府处罚了一家应用程序供应商,因为其构建的算法违反了数据收集法律。

类似的措施将被证明对在这些系统中嵌入信任非常有用,并允许在事情变糟时进行适当的审计。XAI(可解释的人工智能)已经为解码这些黑盒模型铺平了道路,但它仍然有很长的路要走。

我也很高兴看到这个领域摆脱了更大的模型导致更好的结果的趋势,并希望看到更多类似 GPT 3 或武道 2.0 的模型,它们要小一个数量级。至于登月一厢情愿的想法,我也很兴奋地看到雷·库兹韦尔关于奇点(当机器变得比人更聪明时,人工智能的人类级思维能力)的预测是否会在我们的有生之年发生。

要探索谢尔博士的工作,你可以在 Medium 、 Twitter 和 LinkedIn 上关注她。如果你想深入了解她的作品,这里有一些她杰出的 TDS 文章:

  • 如何在 VSCode 中充分利用你的 Python 调试器(2022 年 2 月,12 分钟)
  • 数据科学家用 Python 高效编码指南(2021 年 7 月,11 分钟)
  • Git 命令科学家日常使用的数据(2021 年 4 月,19 分钟)
  • 端到端深度学*项目、 第一部分(2021 年 11 月 19 分钟)和 第二部分(2021 年 11 月 8 分钟)****

想和广大观众分享一些你自己的作品吗?我们很乐意收到你的来信。

这个 Q & A 是为了长度和清晰而稍加编辑的。

3 种形式的统计推断:点估计、置信区间和假设检验

原文:https://towardsdatascience.com/the-most-common-misinterpretations-hypothesis-testing-confidence-interval-p-value-4548a10a5b72

如何正确解释统计推断的再认识

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

统计推断,如假设检验和置信区间,是统计学中众所周知的概念。然而,包括我在内的许多人有时会误解统计推断的结果。希望这篇文章可以作为如何正确解释统计推断的复*资料。

什么是统计推断?

如果我们在研究洛杉矶的平均家庭收入,不可能从每个家庭收集信息。因此,我们从总体中随机抽取样本数据,并根据总体样本数据推断结论。

这个分析样本数据并对总体参数做出结论的过程被称为统计推断

参数固定的数字,代表总体的特征或度量,例如:

  • 平均,例如,洛杉矶的平均家庭收入。
  • 方差,例如洛杉矶家庭收入的方差。
  • 标准差,例如,洛杉矶家庭收入的标准差。
  • 比例,例如,洛杉矶收入高于 200,000 美元的家庭比例。

有三种常见的统计推断形式。每一个都有不同的方式使用样本数据来得出关于人口的结论。它们是:

  • 点估计
  • 区间估计
  • 假设检验

什么是点估计?

对于点估计,我们使用基于样本数据的单值来推断未知总体参数。

例如,我们可以使用样本数据中的平均家庭收入(即样本均值)来推断洛杉矶的平均住房收入(即人口均值)。

点估计容易理解和呈现。但它并不可靠,因为它可能会偏离目标。

如果我们采用另一组样本数据(样本大小相同)并再次进行点估计,我们很可能会对总体得出不同的结论。这意味着当我们根据样本数据得出关于人口的结论时,存在不确定性。点估计不能给我们任何关于估计有多好的概念。

为了说明这种不确定性,使用区间估计比点估计有优势。

什么是区间估计?

对于区间估计,我们使用一个值区间(又名置信区间)来估计一个未知的总体参数,并说明我们对这个区间包含真实的总体参数有多大的把握。

为了构建置信区间,我们需要两个指标:

  • 总体参数的点估计(例如,样本均值)
  • 点估计的标准误差(例如,样本均值的标准误差),它指示总体参数与一个样本统计量的差异程度。

我们可以很容易地从一个样本计算点估计。但是我们怎么解决点估计的标准差呢?

理论上,我们需要从同一个人群中抽取个相同大小的重复样本。接下来,计算每组样本的样本统计量(例如,样本均值)。

样本总体中重复样本的样本统计的频率分布称为抽样分布

然后我们可以通过计算这些样本统计的标准差来获得标准差。

基于中心极限定理,我们知道统计量(如样本均值)的抽样分布遵循一个正态分布。95%置信区间可以计算为“样本均值+/-标准误差*2”

这听起来很复杂,对吗?:(

幸运的是,在现实世界中,我们不需要通过重复样本来估计区间估计的标准差。在合理的样本量下,一组样本中有足够的信息。

当我们从总体中抽取重复样本时,样本的统计数据可能会因人而异。样本的变化取决于两个因素:

  • 总体的变异:总体变异越大,样本间的变异越大。
  • 样本量:样本量越大,它们就越有可能与总体相似,也越有可能彼此相似。不同样本集之间的差异越小。

我们很少知道总体的变化,因此我们使用样本标准差来估计它。然后我们用它除以样本量的平方根来估计样本均值的标准差。

样本均值的标准误差公式为:

  • SE 是样本平均值的标准误差
  • σ是样本标准偏差
  • n 是样本量

在重复样本中,我们将计算每组样本的置信区间。我们预计重复独立抽样的 95%置信区间中约 95%包含真实总体参数,约 5%不包含真实总体参数。因此,

误解 1:

说真实的总体参数有 95%的 T2 概率在 95%的置信区间之间是不正确的。

说我们有 95%的信心真实的总体参数位于 95%的置信区间内是正确的

因为真实总体参数是一个固定数,要么在置信区间内(p=100%),要么不在置信区间内(p=0%)。

置信区间表明我们对结论有多有信心,而不是结论正确的概率

什么是假设检验?

与点估计和区间估计不同,点估计和区间估计用于根据样本数据推断总体参数,假设检验的目的是评估样本数据的证据强度,以得出总体结论。

在假设检验中,我们评估关于总体的两个互斥的陈述。他们是

  • 零假设 (H0): H0 总是用=。例如,一个零假设可能是“洛杉矶的平均家庭收入是 65,000 美元”。
  • 备选假设 (Ha): Ha 可以用>或<或≦。例如,另一个假设可能是“洛杉矶的平均家庭收入高于 65,000 美元”,或者“洛杉矶的平均家庭收入低于 65,000 美元”,或者“洛杉矶的平均家庭收入不是 65,000 美元”。

备择假设使用>或< indicates a 单尾检验,因为它只允许备择效应在一个方向出现。使用≠的替代假设表示一个双尾检验,因为它允许在两个方向上的替代效应。

误解 2:

假设检验是而不是设计来证明无效或替代假设的。相反,它使用样本数据评估证据 相对于零假设的强度。

如果我们只是想找到反对零假设的证据,我们是否可以将点估计(例如,样本均值)与零假设中的主张进行比较?如果它们被证明是不同的(这很有可能发生),那么这是否意味着我们成功地证伪了零假设?

答案显然是否定的。

我们只能观察样本数据而不能观察总体。样本数据和总体数据之间几乎总是存在差异(又名采样误差)

因此,由于抽样误差,样本均值有可能不同于原假设中的索赔数,即使原假设中的索赔数是真实的总体参数。假设检验是评估这种可能性的工具。

幸运的是,由于两种流行的分布,我们可以创建样本统计的概率分布(例如,样本均值),而无需重复的独立采样,

  • Z 分布:当样本量大于 30 且总体标准差已知时,推荐使用 Z 分布。
  • t 分布:当样本量小于 30 或总体标准差已知时,推荐使用 t 分布。
  • 总体标准偏差通常是未知的,当样本量大于 30 时,t 分布非常类似于正态分布,因此,我们通常将 t 分布用于假设检验。

让我们用一个例子来解释这些概念。

It is claimed that the average household income in Los Angeles is $65,000\. We randomly collect 10 samples from the population. It turns out that the sample mean is $70,000 with a sample standard deviation of $8,000\. Assume normal distribution. Use a significance level of 0.05 to test the following hypothesis:Let's use µ to denote the population mean.
H0: µ = $65,000
Ha: µ > $65,000

让我们计算一下 P 值,它表示假设零假设是正确的,样本均值比观察值更极端或更极端的概率。

误解 3:

说 P 值是零假设正确的概率是不正确的,因为零假设中的总体参数是一个固定的数,零假设正确的概率是 0%或 100%。

换句话说,如果总体平均数确实是 65,000 美元,那么观察到的样本平均数 70,000 美元将被认为是极端的,因为它不接* 65,000 美元。但是“更极端”是什么意思呢?它只是暗示了更多的极端情况**,与另一个假设**方向相同。

因此,p 值计算为样本均值大于 70,000 美元(P(x̄ > 70,000)的概率。

然后,我们可以通过将 x̄转换成测试统计量 t 来重写 p 值。

P(x̄ > 7 万)= p(t =(x̄—)/(s/√n)>(70000–35000)/(8000/√10))= p(t > 1.976)

从具有 9 (n-1 = 10 -1)个自由度的 t 分布表中,我们可以计算出 P(t > 1.976) = 0.03979。

P 值 0.03979 小于显著性水平 0.05,因此,我们有足够的证据来拒绝总体均值为 65,000 美元的零假设

显著性水平(α)是多少?

显著水平通常表示为α或α。表示具有统计显著性的阈值。换句话说,

显著水平是假设零假设是正确的,我们愿意接受针对零假设的极端事件的概率。

例如,0.05 的显著性水平意味着我们预期有 5%的概率看到反对零假设的证据,即使零假设是正确的。

1%、5%和 10%都是常见的显著水平阈值。但是它们并不详尽。假设零假设是正确的,我们可以根据我们愿意接受特定事件的假阳性的容忍程度来选择任何合理的显著水平阈值。

如何解释 P 值的结果?

基于 t 或 z 统计量计算 P 值后,我们如何知道 P 值是大还是小?我们认为 p 值= 0.02 小还是 p 值= 0.09 太大?这就是重要性水平发挥作用的地方。

我们需要使用显著性水平作为基准来确定 p 值是小还是大。

如果 p 值小于显著性水平,那么我们可以断定 p 值很小。换句话说,假设零假设是正确的,那么针对零假设观察极端事件的概率非常低。这意味着我们从样本数据中找到的证据(反对零假设)很少是偶然出现的。因此,我们有足够的证据拒绝零假设。这并不意味着我们已经证明了另一个假设是正确的。这只意味着我们接受了另一个假设,或者我们更相信另一个假设是正确的。

如果 p 值大于显著性水平,那么我们可以断定 p 值很大。换句话说,假设零假设是正确的,那么针对零假设观察极端事件的概率非常高。这意味着我们从样本数据中找到的证据(反对零假设)很可能是偶然出现的。因此,我们没有足够的证据来拒绝零假设。这并不意味着我们已经证明了零假设是正确的,也不意味着我们接受零假设。

在双尾检验中,我们如何解释“极端或更极端的”?

让我们继续上面的例子。

Let's use µ to denote the population mean.
H0: µ = $65,000
Ha: µ ≠ $65,000

P 值计算为观察到与备选假设方向相同的极端或更极端情况的概率(例如,65,000 美元)。

我们知道样本均值 70,000 美元比声称的总体均值 65,000 美元高 5,000 美元。**在双尾检验中,“极端或更极端”意味着样本均值和 65,000 美元之间至少有 5,000 美元的差异。**原来如此

P(x̄ > 7 万或者 x̄< 60,000) = P(t >1.976 | t< -1.976) = 2*P(t >1.976)= 0.07957

P 值 0.07957 大于显著性水平 0.05,因此,我们没有 足够的证据来拒绝总体均值为 65,000 美元的零假设

在这篇文章中,我讨论了统计推断的各种误解,以及我们应该如何正确理解这些统计概念。主要要点是

  • 由于抽样误差,点估计几乎总是不同于总体参数。
  • 置信区间告诉我们对结论有多有信心,而不是结论正确的概率。
  • 假设检验不能证明无效假设或替代假设。相反,它仅使用样本数据评估针对零假设的证据强度。

敬请期待!我会发布更多关于统计和数据科学的文章。

如果你想探索更多与统计相关的帖子,请查看我的文章:

  • 7 中心极限定理常见问题
  • 标准差 vs 标准误:有什么区别?
  • 3 种最常见的曲解:假设检验、置信区间、P 值
  • 线性回归模型中误差项是否呈正态分布?
  • 线性回归模型中的 OLS 估计量是正态分布的吗?
  • 什么是正则化:偏差-方差权衡
  • 方差 vs 协方差 vs 相关性:有什么区别?
  • 置信区间 vs 预测区间:有什么区别?
  • I 型和 II 型错误哪个更糟糕?

感谢您的阅读!!!

如果你喜欢这篇文章,并且想**请我喝杯咖啡,**请点击这里。

您可以注册一个 会员 来解锁我的文章的全部访问权限,并且可以无限制地访问介质上的所有内容。如果你想在我发表新文章时收到电子邮件通知,请 订阅。

你的第一个数据科学项目中最重要的部分

原文:https://towardsdatascience.com/the-most-crucial-part-of-your-first-data-science-project-79b00a0fbaa

谢尔盖·佐尔金在 Unsplash 上拍摄的照片

2020 年 9 月,我在高中最后一年发表了我的第一个数据科学项目。直到今天,我一直记得在那个项目中工作的感觉。那个月,我每天醒来,都为自己的代码取得更多进展并最终与社区分享我的见解而兴奋不已。当我向招聘人员的朋友谈起这个项目时,他们很喜欢,觉得它很独特,也很有趣。也就是说,我将分享我认为是你的第一个数据科学项目中最重要的方面。

这是什么?

在一个数据科学项目中,需要考虑的因素很多,但有一件事最重要:选择正确的主题。我这么说是什么意思?在数据科学领域,有大量的主题和数据集可供选择,如科学、政府、政治、健康、环境、音乐等。随便选个题目,但我觉得最好选个自己最感兴趣的题目。

例子

我就以自己为例。当我开始我的项目时,我喜欢听所有我能听的音乐类型(Spotify 是我最好的朋友)。所以,我认为用音乐作为我感兴趣的话题会是一次有趣的经历。这很一般,但却是一个很好的起点!也是在这个时候,BLM 运动达到了顶峰。这让我想到并听了更多的嘻哈音乐和黑人创作者的音乐。所以,我把我的项目缩小到一代嘻哈音乐。

我问自己这样的问题:

  • 随着时间的推移,嘻哈音乐发生了怎样的变化?
  • 人们现在听的嘻哈音乐对他们对 BLM 运动的看法有什么影响?
  • 随着时间的推移,音乐的情绪/特征是如何变化的?是什么导致了这些变化?

如果你想知道更多关于我如何进行这个项目的细节,点击这里。

为什么题目这么重要?

当你选择一个刺激你的话题时,想出你可以用于你的项目的有见地的问题会容易得多。不仅如此,它还会让你想要坚持完成整个项目,因为这是一个每天都让你兴奋的话题。如果你选择分享,这也会让你的项目对其他人来说是独特而有趣的

所以问问自己,什么话题让?什么话题让你想离开座位去了解更多?这是你第一个数据科学项目的完美主题。

在你做出选择之后,技术细节就会随之而来。这包括:

  • 寻找合适的数据集
  • 写下你在项目中想要回答的目标/问题
  • 选择最有助于您实现目标/问题的适当数据科学方法
  • 用 Python/R 编写代码
  • 收集见解并与他人分享

结论

重申:

选择一个每天让你兴奋的感兴趣的话题/领域,并以此作为你第一个数据科学项目的基础。

这个项目将会是一个你引以为豪的项目,甚至在你转向其他项目后,你也会爱上它。在你的第一个项目上的一次很棒的经历会让你对接下来的项目感到乐观和兴奋。

如果这篇文章是有帮助的,给它一些掌声,并与会发现这篇文章有帮助的人分享!为创造独特而有创意的数据科学项目干杯!

点击这里,查看我的第一个数据科学项目。在这里了解更多关于我的信息,在其他平台上关注我,联系并查看更多关于自我成长和技术的内容!

🫶🏽

最有效的创意者最大化杠杆,而不是工作时间

原文:https://towardsdatascience.com/the-most-effective-creatives-maximize-leverage-not-hours-worked-20ed0070fdd7

忘记“悄悄辞职”:用更少的时间创造更多商业影响的 3 个策略

唐纳德·吴在 Unsplash 上的照片

在我迄今为止的职业生涯中(首先是在摩根大通,然后是亚马逊),我遇到过一些似乎一直感到压力很大的同事:他们工作时间很长,很努力,却没有产生多大的实际影响。另一方面,我也遇到过一些同事,他们在合理的工作时间内,始终如一地给他们的组织带来巨大的影响,丝毫没有压力。

这是怎么回事?为什么有些人看起来比其他人更有效率?

起初,我认为答案是运气:某些人只是被交给更好、更有影响力的项目去做,因此在更短的时间内产生更多的影响。运气确实扮演了一个角色,但我在这里认为它不是你在一个组织内部创造多大影响力的主要决定因素。

相反,答案是杠杆,创造的影响与投入的时间的比率。Edmond Lau 在他的《有效的工程师》一书中说,杠杆是有效的个人用来决定在哪里以及如何度过他们的时间的核心、指导性指标。

杠杆是一个强大的概念:如果你的杠杆保持不变,那么你只能通过工作更多的时间来产生更多的影响,而你的时间从根本上来说是有限的。加班加点以产生更大的影响是不可持续的。相反,通过增加你工作的杠杆作用,你可以将你的影响力提高 10 倍或更多,同时保持你的时间合理和可持续。

如何在一个组织中增加你作为个人贡献者的影响力,是刘等人探讨的一个大话题。在本帖中,我们将深入探讨我认为最有效的 3 个策略,并给出一些来自数据科学专业的特定示例:

  1. 管理好你的时间,
  2. 为学*而优化,以及
  3. 尽早验证你的想法。

让我们开始吧。

1.管理好你的时间

“我一次做一件事。这就是计算机科学家所说的批处理——另一种选择是换入换出。我不交换进出。[……]我所做的事情需要长时间的学*和不间断的专注。”—唐纳德·克努特

你能做的最有效的事情之一就是学会管理好你的时间:通过一点点提前计划,你可以每周腾出几个小时的时间,然后投入到更有影响力的工作中。如果你一直感到压力很大,但没有什么效果,这是一个很好的迹象,表明你可能需要改善你的时间管理。

这里有一些关于如何更好地管理时间的想法。

最小化上下文切换。上下文切换是计算机科学中的一个术语,指的是为了开始另一个任务而暂时停止一个任务的行为。例如,当您因为电子邮件通知或会议而停止项目工作时,您会切换上下文。上下文切换的成本比人们想象的要高得多:“在一个项目中,20 分钟的中断需要两次上下文切换;实际上,这种中断会导致损失几个小时真正有成效的工作”,戴夫·奥康纳在网站可靠性工程:谷歌如何运行生产系统中写道。尽可能有意识地减少上下文切换,尽可能长时间地专注于一项任务。正如唐纳德·克努特所说,不要“换进换出”。

练*中断合并。上下文切换的一个主要原因是临时请求的流行:“为什么这个时间序列有一个峰值?”或者“为什么这个指标突然下降了?”,等等。作者 Brian Christian 和 Tom Griffith 在他们的书 Algorithms to live by 中推荐中断合并,这是计算机科学中的另一个术语:与其立即处理一个临时请求,不如将其添加到您的待办事项中。然后,大约一周一次,安排几个小时一次性处理所有这些小请求。中断合并具有很高的杠杆作用,因为它通过简单调整您的时间管理释放了大量的时间(因为减少了上下文切换)。

尽量减少会议。不是所有的会议都有用,这不是秘密。尤其成问题的是每周耗费你时间和上下文切换的重复会议。亚马逊首席工程师 Steve Huynh 对这个问题有一个实用的建议:一周内,不要出现在下一个你认为没用的会议上,看看会发生什么。如果没有人问你去了哪里,这意味着甚至没有人注意到你离开了,你已经找到了一个可以从你的日历中永久删除的会议。如果有人评论你的缺席,你可以道歉,说你下次会回来。

设定每天专注工作的具体时间。Huynh 建议每天花 2-4 个小时专注于你需要完成的最重要的事情。养成在这段时间关闭任何通知的*惯:记住上下文切换的代价比你想象的要大得多。我还发现用一个简单的秒表来记录我专注的工作很有用。另一个好主意是在你的工作日历中划出这些时间,这样别人就不会在这段时间安排一个意想不到的会议。最有效率的专业人士是那些始终能找到时间专注于并解决大问题的人。

2.为学*而优化

“我绝对知道这很难,但我们会学*如何去做。”—杰夫·贝索斯

学*一项新技能,比如一个新的框架、API 或编程语言,也许是你可以花时间去做的最有效的事情。例如,如果学*一个新的框架花费了你几个小时的时间,但是让你的一个常规工作流程快了 10%,这是一项投资,保证随着时间的推移会有回报。

“为学*而优化”意味着你做出深思熟虑的选择,迫使你不断学*新技能。以下是如何做到这一点的一些想法:

  • 在你不熟悉的问题领域承担项目,不要仅仅停留在你已经知道如何解决的问题上。正如杰夫·贝索斯所说,相信你会“学会如何去做”。
  • 加入一个人比你聪明的团队。如果觉得自己的学*已经饱和,就换个团队或者公司。
  • 阅读书籍、技术博客和研究论文。杠杆原理再次适用:专注于那些能为你的学*时间带来最大收益的资源。如果一篇论文在你的问题领域没有应用,阅读它的杠杆作用差不多等于零。关注应用论文:一个很好的资源是 Eugene Yan 的应用 ML 论文精选列表。
  • 在工作流程中跟随更有经验的工程师或数据科学家。有时候,这只是一个小技巧,最终为你节省了大量的时间,而学*这个技巧的唯一方法就是跟着做。
  • 阅读并试着理解别人的代码。你读的代码越多,你就越擅长编码。试着理解你所使用的普通 API(比如 scikit-learn)背后发生了什么。
  • 开始写作,创建自己的博客。如今,任何人都很容易开始在 Medium 或 Substack 这样的平台上写博客(我有一些开始写博客的技巧在这里)。遵循费曼技巧:学*一件事的最好方法是教它。

最后,心理学家介绍了(过于简化,但仍然具有教育意义的)固定思维和增长思维的二分法。心态固定的人倾向于回避挑战,因为他们害怕失败。具有成长心态的人接受挑战,因为他们欢迎学*的机会,即使他们一开始会失败。养成接受成长心态的*惯:即使你还不知道如何去做,你也会在成长的过程中找到答案。

顺便说一下,杰夫·贝索斯说了上面引用的话,当时他提出亚马逊应该建立一个数字图书阅读器的想法,这就是后来众所周知的 Kindle。亚马逊之前没有制造过电子产品,因此同事们对他的想法持怀疑态度。他的回答,“我绝对知道这很难,但我们会学*如何去做”,这是一个成长心态的好例子。

3.尽早验证你的想法

“这个项目最恐怖的部分是什么?那是未知最多,风险最大的部分。先做那部分。”— Zack Brock,Meta 的工程经理

或许最能体现杠杆概念的概念是最小可行产品,MVP。MVP 背后的关键思想是用尽可能少的投资尽早验证您的价值假设(即,提出的产品或软件具有经济价值的假设)。因此,设计一个好的 MVP 是一项高杠杆的活动:一点点前期投资就会产生不成比例的商业影响,即确认我们是否在正确轨道上的能力。

这个概念的一个很好的例子是鞋类电子商务平台 Zappos 的故事。创始人 Nick Swinmurn 并没有真正为这种应用建立物理和数字基础设施,而是简单地去了他当地的商场,拍下了这些鞋子的照片,并上传到他的网站上。当顾客要购买时,Swinmurn 会回到商场,购买鞋子,并运送给顾客,给店主一小笔佣金。事实证明,Zappos 是成功的,后来被亚马逊以 12 亿美元收购。但重要的是,Swinmurn 能够在早期以很少的前期投资证实他的价值假设:仅仅是一台数码相机的成本。

我们再来看一个反例。《有效的工程师》一书的作者刘讲述了 Cuil 的故事,Cuil 被认为是“谷歌杀手”:Cuil 的创始人假设他们能够通过提供一个搜索索引更大的搜索引擎来击败谷歌。(搜索索引是将搜索查询映射到 URL 的查找表:更大的搜索索引意味着更高的召回率,代价是更长的查询时间。)Cuil 团队花了数年时间构建他们的新搜索引擎,但最终以失败告终。用户界面太慢,错误百出,结果是用户更喜欢低延迟而不是更大的搜索索引。Cuil 的发明者 Josh Levy 说他应该早点验证他的产品:

不要拖延。获取反馈。找出有效的方法。这比试图建立一些东西,并相信你把一切都做对了要好得多——因为你不可能把一切都做对。

那么,作为一名数据科学家,如何尽早验证自己的想法呢?这里有一些实用的技巧。

把你的同伴当作传声筒。养成向你的同事推销你的想法的*惯。通常,人们很乐意听到一个新的问题或想法,并给出他们的意见。这让他们摆脱了通常的窠臼。与你的同事进行非正式的咖啡聊天是开始这种非正式思想交流的好方法。

在做任何实际工作之前写一份 1 页纸的报告。在那份文件中,概述你试图解决的问题,你想如何解决它,以及你提议的成功标准是什么。让人们回顾这份一页纸:如果你的提案中有严重的缺陷,你会想在实际工作之前知道,这可能会浪费你的时间。

先解决项目最恐怖的部分。想想项目中哪一块的未知数最多。在 ML 项目中,这通常是模型与后端基础设施的集成:模型实际上能在推理时采取自动化的行动吗?首先解决这一部分是尽早验证你的想法的好方法。

尽快部署您的 ML 模型。在部署到生产之前,离线优化您的模型并尝试“再做一件事”通常是很诱人的。然而,离线性能并不能保证在线性能,因此在实践中花费更多时间来提高离线性能的杠杆作用可能相当低。数据科学家 Damien Benveniste 推荐对 ML 开发过程中的每一步都进行时间装箱,这样你就不会有掉进离线优化的兔子洞的感觉。

图片来源: Pixabay

结论:与其“悄悄退出”,不如最大化杠杆

杠杆率,即产生的影响与投入的时间的比率,是一个核心的、指导性的指标,你应该用它来决定如何支配你的时间。你可以通过(1)学会管理好你的时间,(2)为学*而优化,(3)尽早确认你的想法,来提高你工作的杠杆作用。

在我为这篇文章做研究的时候,安静地退出成为了一个新的流行词,由工程师扎伊德·汗在抖音的一段视频中推广开来。悄悄辞职背后的想法是“滑行”,做那些能保住工作的最少量的工作,这样你就能有更多的个人时间。汗解释道:

“你不是彻底辞职,而是放弃超越自我的想法。你仍在履行你的职责,但你不再认同那种认为工作就是你生活的喧嚣文化心态。事实并非如此——你作为一个人的价值不是由你的劳动来定义的。”

从杠杆作用的角度来看,我们这里采用的悄悄辞职背后的前提,即你需要长时间工作才能“超越”是被误导的。相反,对杠杆的研究告诉我们,我们可以在工作时间更少而不是更多的情况下超越杠杆。关键是最大化这些工作时间的杠杆作用,而不是它们的数量。

在你走之前…

享受这个内容?在我的 个人资料页面 找到更多我的文章。在 Medium 上关注/订阅,这样你就不会错过我以后写的新帖。 成为中等会员 这样可以无限阅读文章。请务必在LinkedIn和/或Twitter上关注我!

想了解更多关于时间管理的科学知识吗?看看我下面的文章。

我一直在合并熊猫数据帧,完全错了

原文:https://towardsdatascience.com/the-most-efficient-way-to-merge-join-pandas-dataframes-7576e8b6c5c

为什么几乎每个人都在低效地写它们,以及一些解决它的技巧!

卡斯帕·卡米尔·鲁宾在 Unsplash 上的照片

对于大多数数据科学家来说,更令人困惑的熊猫概念之一是熊猫合并和熊猫加入之间的区别。大多数人亲自告诉我“使用合并就好了”,网上很少有资源解释哪一个肯定更好。正因为如此,我决定对这两个功能进行压力测试,在我的结果中…我意识到我多年来一直在错误地合并。

设置问题

为了测试这个问题,我创建了一个 2823 行 8 列的假销售数据数据帧。因为我想测试合并,所以我将简单地将这个单个数据帧转换成 2 个更精简格式的数据帧。从 SQL 表中提取数据时可能会看到的格式。其中一个表是 Orders,由 ORDERNUMBER 字段索引,另一个表是 Customers 表,由 CUSTOMERNAME 索引,包含关于客户的所有元数据。我们的目标是连接这两个表,以确定每个订单应该运送到哪里。它们唯一重叠的列是 CUSTOMERNAME 字段。下面的代码显示了我是如何执行分割的!

#Create the dataframe (random lists not shown, in github)
df = pd.DataFrame(index=range(2823),columns=["ORDERNUMBER", "QUANTITYORDERED", "ITEMNAME", "PRICEEACH", "CUSTOMERNAME", "CUSTOMERADDRESS"])df["ORDERNUMBER"] = df.index
df["QUANTITYORDERED"] = np.random.randint(1, 6, df.shape[0])
df["ITEMNAME"] = np.random.choice(list(item_ordered), len(df))
df["PRICEEACH"] = np.random.randint(1, 10, df.shape[0])
df["CUSTOMERNAME"] = np.random.choice(list(customers), len(df))
df["CUSTOMERADDRESS"] = df['CUSTOMERNAME'].map(customers)
df.set_index("ORDERNUMBER")#create the ORDERS table, selecting the first 4columns
df_orders = df.iloc[:, : 4]#Create the CUSTOMERS table by selecting the last columns and indexing by unique customers
df_unique_customers = df.iloc[:, 4:]
df_unique_customers = df_unique_customers.groupby("CUSTOMERNAME").first()#Create a duplicate of the customer dataframe, but indexed from 0 instead of by customer (for testing)
df_unique_customers_unindexed = df_unique_customers.reset_index()

您会注意到,我还创建了一个客户数据框的副本,它的索引为 0,而不是用于测试目的的客户索引。以下是我们的数据框的示例!(你也可以在这里查看完整的笔记本)

按作者排序数据框|图像

客户数据框|作者图片

合并与连接

除了语法之外,表面上的差异并不显著。 Join 充当连接两个数据帧的方法,但它只对正确数据帧的索引起作用。对于左侧数据框,可以选择左侧索引或列(在我们的示例中我们需要使用列,因为客户在我们的订单数据框中不是唯一的)。

合并本质上是一样的东西,但是更加灵活。可以在任一数据框中指定用于连接的任何列或索引。本质上,就语法而言,merge 只是一个更易于使用的连接。但这并不一定适用于他们的表现。

对于这个例子,我想执行一个左连接,左边是订单数据框,右边是客户数据框。我能够用 1 种方式用 Join 正确地做到这一点,用 4 种方式用 merge 做到这一点。如果您不熟悉不同类型的联接之间的区别,这里有一个复*工具!(或者,如果你正在寻找一个完整的课程,试试这个

为了测试这些不同连接的熟练程度,我将在一个循环中运行每个连接 10000 次,以获得一个连接的平均成本。

执行左连接/合并的 5 种方式

首先,我将从几个合并开始,因为这是非常容易产生低效查询的地方

错误的合并方式—在非索引列上合并

  • df_combined = df_orders。合并(df _ unique _ customers _ un indexed,how='left ',on="CUSTOMERNAME ")
Time for 10000 joins
18.28343653678894
average time per join
0.001828343653678894
  • df_combined = df_orders。合并(df _ unique _ customers _ un indexed,how='left ',left_on="CUSTOMERNAME ",right_on="CUSTOMERNAME ")
Time for 10000 joins
18.183201789855957
average time per join
0.0018183201789855957

以上两种方法都从每个表中选择列 CUSTOMERNAME。这是相当简单的,我假设大多数人使用合并,以及人们如何在合并时失去很多速度。这些通常是等价的查询,底部给出了相当一致的 1–2%的提升。

根据一般经验,使用非索引列确实会导致相当大的速度损失,我们将在下面的合并中解决这个问题。

莫名其妙的次优方式

  • df_combined = df_orders。合并 (df_unique_customers,how='left ',on="CUSTOMERNAME ")
Time for 10000 joins
16.125476121902466
average time per join
0.0016125476121902466

通过简单地为我们计划加入的列设置索引(可以使用 set_index(“客户名称”)来完成),我们看到速度比没有索引的列立即提高了 10–15%。

但是,因为 merge 必须推断“on”是指列还是索引,所以这仍然不是最理想的,而且我和大多数人都认为,从来不知道!我在任何地方都没有看到这种解释,通过避免这种情况,您可以创建下面的最佳查询!

最快的方法

  • df_combined = df_orders。合并 (df_unique_customers,how='left ',left_on="CUSTOMERNAME ",right_index=True)
Time for 10000 joins
14.555766582489014
average time per join
0.0014555766582489014
  • df_combined = df_orders。加入 (df_unique_customers,on="CUSTOMERNAME ",how="left ")
Time for 10000 joins
14.551718711853027
average time per join
0.0014551718711853028

最后,我们得出了正确且最快的编写连接的方法。事实证明,如果语法是最优的,那么 join 的性能总是很好,merge 的性能几乎完全相同。编写完美的查询比没有索引的查询提高了 20%以上,比正确索引但编写糟糕的查询提高了 10%。

结论

如果您可以编写一个 join 语句,我建议您这样做,因为它几乎可以保证最佳的性能。

然而,这并不意味着合并没有用。当左右两列都不唯一,因此不能作为索引时,可以使用 Merge。只要满足以下条件,合并也和联接一样有效:

  1. 如果可能的话,在索引上进行合并
  2. 避免了“on”参数,取而代之的是,使用关键字 left_on、left_index、right_on 和 right_index(如果适用)显式地声明要合并的两列。

我希望这篇短文能帮助你加快加入熊猫的步伐!如果您认为需要回来参考,请务必保存/标记该故事!如果你喜欢这篇文章,欢迎关注我,阅读我写的更多内容。我倾向于每个月深入一个主题一次,这通常涉及数据科学技巧、新的包或 ML 空间中我认为需要更好解释的任何东西!

Python 中最受欢迎的预训练情感分类器

原文:https://towardsdatascience.com/the-most-favorable-pre-trained-sentiment-classifiers-in-python-9107c06442c6

考察 Vader、Happy Transformer、TextBlob 和 Google NL API 的性能,讨论它们的局限性和选择最佳应用的技巧

马克·戴恩斯在 Unsplash 上的照片

情感分析是自然语言处理(NLP)中的一个大领域,它使用技术从文本数据中识别、提取和量化情感。在公司中,情绪分析方法有助于自动理解客户反馈,评估社交媒体对话,还可能有助于优先考虑与客户关怀部门的客户沟通。

在过去的一二十年里,自然语言处理和情感研究也融合了 A 级杂志中的经济研究。例如,Antweiler 和 Frank (2005) 对互联网股票留言板上发布的信息内容进行了量化。 Algaba 等人(2020) 在《经济调查杂志》的一篇论文中调查了许多情感方法的应用。

就方法而言,数据科学家通常有两种选择来构建他们的情感分类器,这两种选择各有利弊。从零开始训练模型通常涉及这些组件中的一个或多个:利用广泛接受的情感词汇,由人类专家对情感评分,由机构承包商或研究助理标记数据,以及调整在数据集的其余部分上表现良好的模型。这一过程可能既费钱又费时。

另一方面,使用预训练分类器节省了大量时间。这些模型易于使用,只需几行代码,但是它们的训练数据集的特殊性可能会限制它们。本文将关注后一种选择,并展示在 Vader、Happy Transformer、TextBlob 和 Google cloud NL API 中实现的四种预训练情感分类器的可能性。

您将了解更多关于:

  • 用 Python 实现
  • 培训数据和模型架构
  • 每个分类器的优缺点。

为了对比所有分类器的性能,我将使用新闻标题的数据,这些数据不同于所有测试算法的原始训练数据集。

数据

一百万条新闻标题包含澳大利亚广播公司(ABC)十八年来发布的新闻标题数据。数据集可从 Kaggle 处获得公共许可证。

超过 120 万条记录包含出版日期和新闻标题。这里有几个例子:

图片 1 —一百万条新闻标题数据(图片由作者提供)

由拥有的摄影在 Unsplash 上拍摄的照片

维德

*VADER (Valence Aware 字典和情感推理器)*是一个基于词典和规则的情感分析工具,专门用于检测社交媒体中表达的情感。

推特推文补充了 LIWC 、新和普通问询者的词汇,以调整模型的准确性。在最初的论文中,休顿和吉尔伯特(2014) 使用八步方法论来构建和验证分类器:

图片 2——VADER 建设的方法论(来源:休顿和吉尔伯特,2014 ,draw.io)

这些分数是 VADER 的输出:

  • posneuneg分数是属于每个类别的文本比例的比率(因此这些应该全部加起来是 1 或者用浮点运算接*它)。
  • compound分数是通过对词典中每个单词的化合价分数求和计算出来的,根据规则进行调整,然后归一化到-1(最极端的负面)和 1(最极端的正面)之间。如果你想对一个给定的句子进行单一的情感测量,这是最有用的度量。

以下是 Python 实现:

据我所知,VADER 是脸书或 Twitter 等社交媒体对话的最佳预训练情感分类器。它免费且易于使用。它的方法在的原始论文中有清晰的描述,这样每个人都可以引用它,看看它是如何工作的。另一方面,社交媒体使用特定的语言,在一些特定的数据集上使用分类器可能会导致结果的偏差。

照片由拉尔夫·哈特在 Unsplash 上拍摄

文本 Blob

TextBlob 是一个简单的 Python 库,用于处理文本数据和执行诸如情感分析、文本预处理等任务。

情感属性为元组提供了极性和**主观性分值。**极性评分是[-1.0,1.0]范围内的浮动,主观性是[0.0,1.0]范围内的浮动,其中 0 表示非常客观,1 表示非常主观。

  • 简单来说,极性意味着用一句话表达的情感——消极还是积极
  • 主观性表达了一些个人的感受、观点或信念——客观还是主观

我们需要从方法论的角度研究源代码,找出 TextBlob 是如何构造的。 Aaron Schumacher (2015) 深入研究了每个情绪指标的提交代码。它严重依赖于 NLTK 和模式库,并实现了它们的许多功能。

用户可以从两个内置分类器中进行选择:

  • Pattern Analyzer–建立在模式库上的默认分类器
  • Naive Bayes Analyzer–在电影评论语料库上训练的 NLTK 分类器

下面是 Python 中使用默认分类器的实现:

现在让我们提一下的优点的缺点。Textblob 是一种简单的情感分析方法,编程能力有限的每个人都可以使用。如果我们想把它用于更先进和更科学的项目,就会受到相当大的限制。没有我们可以用来引用方法论的论文,如果我们不想把它作为一个黑盒模型来使用,就需要一些时间来了解更多关于内部架构的信息。

照片由托尼·汉德在 Unsplash 上拍摄

快乐变形金刚

快乐变形金刚是建立在抱抱脸的变形金刚库之上的一个包。官方文档清晰有用,包括很多教程和代码示例。它首次出现在 2020 年 CUCAI 会议的会议记录中,并获得了最佳论文奖。

文本分类器的输出是这些分数:

  • label–“积极”、“消极”或“中性”描述了情绪的极性
  • score–反映情绪强度的浮动值,范围为[0:1]

有了拥抱脸的变形金刚,我们可以导入许多为特定目的而调整的预训练模型。例如,芬伯特被设计用来处理金融领域的自然语言处理任务。在拥抱脸项目网站上,你会找到关于模型架构的详细信息,包括原始论文的链接,这是一件很棒的事情。

一个好的视频胜过千言万语。查看 t his one 了解 Python 中实现的概述。

Happy Transformer 在技术上非常先进,但仍然很容易实现 NLP 库。在可能的约束方面,让我们提一下文本分类器不支持多类概率,并且只为labelscore提供单个值。一些其他分类器(例如 VADER)也分别显示其他两个类别的情感分数。这对于某种分析很重要,在这种分析中,我们不仅着眼于整体情绪,还特别关注负面或中性情绪。

由 David Pisnoy 在 Unsplash 上拍摄的照片

谷歌云自然语言 API

谷歌提供情感分析和实体情感分析,作为其云服务的一部分。Google Cloud NL API是一个高度开发的基础设施,它借鉴了许多天才工程师和研究科学家的工作成果。

为了访问云技术,我们可以在电脑上远程使用谷歌云客户端库,或者云外壳,一个可以在任何地方通过浏览器访问的在线开发环境。

情感分析用数字scoremagnitude值识别整体态度。

  • score情感的范围在-1.0 和 1.0 之间,对应于文本的整体情感倾向
  • magnitude表示给定文本中情感(积极和消极)的总体强度,介于 0 和+无穷大之间。

本情感分析教程包含一个完整的 python 实现。下面是我对积极和消极方面的总结:

图 3——Google NLP API 的优缺点总结(来源:draw.io)

布雷特·乔丹在 Unsplash 上的照片

如何为我的项目选择合适的分类器?

方法方面、数据集和它们被设计来关注的领域预先确定模型在其他项目中对情感进行分类的有效性。在决定情感方法之前,验证它对我们处理的数据有效总是很重要的。

*一个好的技术是在我们的数据上运行文本分类,并且**查看尾部,*包括正的和负的。我取了 ABC 数据集的前 1000 条记录,用 Vader、TextBlob 和 Happy Transformer 进行文本分类。接下来,我整理了数据,检查了前 10 个负面和正面记录的情绪结果是否有意义。

结果如下所示:

图 4-验证 TextBlob、Vader 和快乐变形金刚

Vader 的复合分数与人类评分员可能标记数据的方式没有明显不同。正面和负面的分数都反映了标题中的普遍情绪(“胜利”、“梦想”、“雄心勃勃”与“杀戮”、“恐怖分子”、“战争”)。快乐变形金刚也显示分数(HT 标签和 HT 分数)与我自己的评分一致。

作为 TextBlob 的人工评分者,句子“家庭对抗韩国当选总统”不会得到 0.8 分(=非常积极)。我在这篇短文中看不到任何积极情绪的迹象。这表明 TextBlob 可能不太适合这个特定的数据集,而 Vader 和 Happy Transformer 可能是 ABC 数据的更好选择。

结论

本文主要关注在等级[-1,1]上对情绪进行分类的模型。其他处理特定情感的情感分类器,如恐惧、愤怒或快乐( Text2emotion 、 NRCLex 等等),以及另一个流行的文本分类器 Flair ,超出了本文的范围。

要选择合适的分类器,请始终考虑:

  • 模型最初开发的数据/领域
  • 可引用资源的可用性,以防您需要它
  • 作为人类评定者验证结果

用于性能比较的 Jupyter 笔记本可以在我的 GitHub 上下载。

PS:你可以订阅我的 邮箱列表 每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入https://medium.com/@petrkorab/membership

参考资料:

Antweiler,w .,Frank,M. Z. (2005 年)。那些谈话只是噪音吗?网上股票留言板的信息内容。 《金融杂志 》,第 59 卷第 3 期,第 1259-1294 页。

阿尔加巴,a .,阿尔迪亚,d .,布卢托,k .,博姆斯,S. (2020)。计量经济学与情感:方法与应用概述。【T21 经济学调查杂志】,第 34 卷第 3 期,第 512–547 页。

舒马赫(2015)。TextBlob 情绪:计算极性和主观性。从 https://planspace.org/20150607-textblob_sentiment/[取回](https://planspace.org/20150607-textblob_sentiment/)。

哥伦比亚特区休顿,吉尔伯特,E. (2014 年)。VADER:基于规则的社交媒体文本情感分析的简约模型。网络与社交媒体国际 AAAI 会议论文集8 (1),216–225 页。从 https://ojs.aaai.org/index.php/ICWSM/article/view/14550 取回。

MLOps 的最基础层—所需的基础架构

原文:https://towardsdatascience.com/the-most-fundamental-layer-of-mlops-required-infrastructure-bafd111db4c3

拥有实施 MLOps 解决方案的合适基础架构

在我之前的帖子中,我讨论了构建端到端 MLOps 解决方案的三个关键组件,即数据和功能工程管道、ML 模型培训和再培训管道 ML 模型服务管道。你可以在这里找到文章:学* MLOPS 的核心——构建 ML 管道。在我上一篇文章的最后,我简要地谈到了一个事实,即 MLOps 解决方案的复杂性可能会因 ML 项目的性质而有很大的不同,更重要的是,取决于所需的底层基础设施的变化。

因此,在今天的帖子中,我将解释不同级别的基础架构是如何要求的,如何确定 MLOps 解决方案的复杂性,以及如何将 MLOPS 解决方案分为不同的级别。

更重要的是,在我看来,将 mlop 分为不同的级别可以使任何规模的组织更容易采用 mlop。原因是,并不是每个层次的 MLOps 都需要 Kubernetes 这样的大规模在线推理基础设施,Apache Spark 这样的并行和分布式数据处理框架,以及结构化流和 Apache Flink 这样的低延迟和流数据管道解决方案。因此,拥有小规模数据集和批量推理 ML 项目的组织不需要招聘具有这些专业技能的人员,也不需要设置复杂的底层存储和计算基础架构,但仍然可以利用现有的技能组合和大大简化的基础架构来正确执行 MLOps。

对于每个级别,我将在以后的博客中分享一些参考架构和实现指南。如果你想在这些新博客发表时得到通知,请随时关注我。

首先,让我们讨论一下运行端到端 MLOps 解决方案所需的基础架构,包括 3 个关键组件:

  • 数据和特征工程管道;
  • ML 模型培训管道;
  • ML 模型推理管道;

我将介绍每个组件可能需要的所有基础设施。然后,我将根据所需的基础设施将它们分为不同的级别。

由瑞安·昆塔尔在 Unsplash 上拍摄的照片

数据和特征工程管道所需的基础设施

根据数据量和数据延迟,运行数据和特征工程管道所需的基础设施如下:

  • 第 1 级—当数据量可以由单台机器处理,并且数据延迟为批量频率时,所需的基础架构可以像本地笔记本电脑或公共云上的虚拟机一样简单。此外,您可以利用云平台即服务(PaaS)产品,如 AWS Batch、AWS Lambda 或 Azure 功能,进一步简化基础架构管理;
  • 第 2 级—当数据量无法由单台机器处理且需要并行和分布式数据处理,但数据延迟仍可保持批处理频率时,所需的基础架构将需要超越单台机器成为计算集群,以便安装和管理 Apache Spark 等分布式计算框架。Apache Spark 是一个开源解决方案。组织可以运行自己的计算集群,并使用开源 Spark 来管理他们的数据和功能工程管道。但是,大多数企业仍然选择托管服务(如 Databricks)作为大规模数据和功能工程工作负载的底层数据基础架构。公共云提供商也为 Spark 提供服务,如 AWS EMR 和 GCP 数据处理。
  • 级别 3 —在前两个场景中,数据延迟保持在批处理级别。然而,当数据延迟需要非常低时,就需要完全不同的基础设施集合。至少需要一个事件驱动的消息队列和一个流引擎。为了实现更低的延迟,通常需要消息队列服务来动态捕获流数据,而不是将数据保存到存储系统中。对于消息队列服务,有开源的解决方案,比如 Apache Kafka 还有商业托管服务,比如 Azure Event Hub、AWS Kinesis 数据流和 Confluent。除了消息队列服务之外,为了实现下游数据消耗的低频率,健壮的流引擎也是非常必要的。开源流媒体引擎包括 Apache Spark 结构化流媒体和 Apache Flink 以及 Apache Beam。当然,也有针对流媒体引擎的商业产品,如 Databricks、AWS Kinesis 数据分析以及 GCP 数据流。

如您所见,根据数据量和数据延迟要求,运行数据和功能工程管道的基础设施可能会有很大差异。实际上,这对于 ML 模型训练管道和 ML 模型推理管道都是相同的。这就是为什么在基础设施级别进行澄清是至关重要的,以避免 MLOPS 的印象(或误解)是 总是 令人生畏且复杂。对于某些级别,MLOps 也可以非常简单,我将在这篇博客的后面解释。现在让我们继续解释运行 ML 模型训练管道所需的基础设施。

ML 模型培训管道所需的基础设施

根据训练数据的大小和将训练好的模型用于生产环境所需的时间(SLA ),模型训练的基础结构可以划分如下:

  • 级别 1 —当训练数据大小适合单台计算机的内存,并且总训练时间不超过生产环境所需的 SLA 时,使用单台计算机进行模型训练就足够了。根据训练数据的格式,可能需要一台 GPU 机器。比如你的训练数据是结构化的,数值型的,一般一个 CPU 机器就够了。然而,如果您的训练数据是非结构化的,如图像,首选的训练基础设施将是 GPU 机器。
  • 第 2 级—当训练数据太大而无法容纳在单台机器的内存中,或者即使训练数据大小可以容纳在单台机器的内存中,但完成一项训练工作所需的时间长于所需的 SLA 时,这是公司需要启动训练集群以跨多个节点进行并行和分布式 ML 模型训练的时候。然而,在多个节点上运行分布式 ML 模型训练引入了许多新的复杂性,例如跨多台机器调度任务、高效地传输数据以及从机器故障中恢复。幸运的是,已经有一些开源库来处理多节点训练带来的这些额外的复杂性,并使数据科学家的训练工作相对简单,即使他们需要分发这些工作。这些开源库包括用于扩展 Python ML 工作负载的 Ray,用于 TensorFlow、Keras、PyTorch 和 Apache MXNet 的分布式深度学*培训框架的 Horovod,以及用于扩展 Python 库(包括 Python ML 库)的 Dask。

我将单独发表一篇关于分布式培训的博客。如果您想在发布博客时得到通知,请随时关注我。

众所周知,ML 是一个极其动态的领域。要运行一个模型训练工作,数据科学家需要安装相当多的开源库,包括 Pandas、Numpy、Matplotlib、Seaborn、Plotly、Scikit Learn、Tensorflow、Keras、Pytorch、mlflow 等等。因此,大多数公共云供应商或特定的数据+人工智能供应商(如 Databricks)提供预配置的 ML 运行时,包括所有这些流行的 ML 库,以节省数据科学家安装和维护这些库的大量时间。因此,大多数组织通过利用云服务来构建他们的 ML 培训基础设施。云上流行的 ML 服务有 AWS Sagemaker、Azure 机器学*工作空间、GCP Vertex AI 以及 Databricks 机器学*运行时。

ML 模型推理管道所需的基础设施

根据模型推理频率和推理请求量,运行 ML 模型推理管道所需的基础设施如下:

  • 级别 1-当模型推理频率是批量的,并且用于模型推理的数据量能够由一台单独的机器处理时,通过对数据调用预测函数,可以将训练的模型加载到用于批量预测的单独的机器中,该数据通常存储为 Pandas 数据帧;
  • 第 2 级—当模型推理频率为批处理,但数据量无法在单台机器内管理时,需要建立一个集群来利用分布式计算框架,如 Apache Spark。例如,经过训练的 ML 模型可以作为 Spark 用户定义函数(UDF)加载,并且可以将 UDF 应用于 Spark 数据帧以进行并行模型预测。
  • 级别 3 —当模型推理频率是低延迟的,并且数据量相当大时,流推理就变得必要了。与第 2 级类似,也需要一个计算集群。此外,还需要使用流引擎进行模型预测,以满足低延迟要求。在这种情况下,使用的流行流媒体引擎是 Apache Spark 和 Apache Flink 的结构化流媒体。
  • 第 4 级—当模型推理在线时,这意味着模型通常被打包为 REST API 端点,但 API 请求量很小,可以由单台机器处理,所需的基础架构通常是云上的单节点 CPU 虚拟机。公共云提供商和数据/人工智能供应商都有针对此类模型服务的托管服务。例如,Databricks 有无服务器端点,客户不必担心设置服务基础设施,他们需要做的只是实例化一个模型端点。其他公司也有类似的产品。

在我们进入第 5 级之前,需要注意一点——在线推理不同于流式推理,在流式推理中,经过训练的 ML 模型仍然作为 Python 函数加载,而不是作为 REST 端点。它们都有低延迟,但是在线推理应该是实时的。

  • 级别 5 —当模型推理是在线的,并且 API 请求量是大规模的(意味着每秒查询数(QPS)对于单个端点来说是非常大的)时,就需要设置一个像 Kubernetes 这样的集群基础设施来进行分布式推理。通常使用的流行方法是,将训练好的模型打包成容器映像,并在容器注册表中注册,如 AWS 弹性容器注册表、Azure 容器注册表或 GCP 容器注册表。然后,这些经过训练的模型的注册图像将被拉入并部署到 Kubernetes 中,用于大规模和分布式模型推理。每个公共云都有自己的托管 Kubernetes 服务。

结论

到目前为止,我们已经涵盖了完整的端到端 MLOps 解决方案的 3 个关键管道中的每一个所需的不同级别的基础设施。很明显,不同级别的基础架构的复杂性有很大不同。

在下一篇博客中,我将根据基础设施的复杂性和实现模式将 MLOps 分为不同的级别,对于每个级别,我还将分享一些参考架构和代码示例,其中将包括 MLOps 解决方案的其他部分,如编排、模型版本控制、数据版本控制、漂移检测、数据质量检查和监控。

我希望你喜欢阅读这篇博客。如果你想在有新博客发表时得到通知,请随时关注我。

如果想看到更多围绕现代高效数据+AI 栈的指南、深度潜水、见解,请订阅我的免费简讯— 高效数据+AI 栈 ,谢谢!

注:以防万一你还没有成为媒体会员,并希望获得无限制的媒体访问,你可以使用我的推荐链接注册!我可以免费给你一点佣金。非常感谢你的支持!

机器学*模型最重要的指标

原文:https://towardsdatascience.com/the-most-important-metric-for-machine-learning-models-2c6a4c4b18ad

提示:这不是 f1-分数、准确度、精确度或回忆

你的模式是如何为你的客户创造价值并为企业赚钱的?业务人员不理解也不关心数据科学家孜孜不倦地优化其模型的 ML 指标(F1 分数、准确度、精确度)。衡量一个模型成功的真正标准是它如何影响业务。

场景:你开发了一个强大的模型,对业务没有任何帮助

假设你是一名数据科学家,在你最喜欢的科技公司工作,销售基于订阅的产品。可能是网飞、谷歌驱动、亚马逊 Prime、苹果音乐等。你的任务是预测客户是否会流失(取消他们的订阅)。识别可能流失的客户非常重要,因为我们可以通过鼓励他们留下来的方式锁定他们(例如奖励、折扣、产品预告)。作为一名热情的数据科学家,您渴望尝试各种模型。

照片由马库斯·温克勒在 Unsplash 上拍摄

你首先要花时间去理解商业案例。企业更愿意留住尽可能多的客户,即使冒着刺激假阳性(客户被错误地预测为可能流失)的风险。你决定优化召回,这是客户流失的数量,你的模型识别他们。经过数周的开发,您将模型投入生产。但是流失率不减,商家很失望。你很失望,因为你不知疲倦地工作,以达到一个恒星召回分数。哪里出了问题?

通常有两个原因可以解释为什么一个强大的模型可能不会产生强大的商业影响。对于强模型,我指的是具有良好评分(在本例中为回忆)并遵循充分的 ML Ops 实践的模型。

原因 1:伟大的模型,糟糕的用例

您的团队着手解决的用例或客户挑战对您的客户来说并不重要。这是在没有确保对该特性有实际需求的情况下匆忙交付特性的症状。例如,假设您经营一个销售玩具和一些游戏产品的电子商务网站。即使你建立了一个准确的模型来预测客户是否可能购买游戏产品,你也可能最终为企业创造低收入。没有足够的游戏产品来创造价值。

确保客户有足够需求的责任落在了你的产品经理身上。

产品经理做基础工作,确保你的模型有影响力

这可能是一个与你的项目经理合作的机会。一起,你可以测试假设和学*。例如,在部署端到端模型管道之前,您的 PM 可能会与您一起决定最小可行产品(MVP ),这是测试业务用例背后的假设的最小努力。从产品的角度来看,MVP 不是 1.0 版本,它经常被误解为 1.0 版本。我喜欢更容易理解的术语, RAT — 风险最大的假设测试(来源:Neel,Parth,Aditya 的《产品管理的神圣七人组》)。

在游戏示例中,我们可以假设向客户发送优惠券会促使他们购买游戏产品。我们可以通过确定最低努力水平来检验这个假设,这个最低努力水平将有把握地为我们的假设提供支持或反对的证据。一个示例 MVP 可能包括创建一个简单的朴素贝叶斯模型,该模型列出一系列目标客户。如果这个模型太费力了,就去找一份上周浏览过游戏产品的顾客名单。如果工作量太大,只需获取上个月订单数量最多的客户名单。抓住 30%的顾客,用优惠券吸引其余 70%的顾客。观察不同之处。如果您发现测试组的转换率高于控制组(具有统计显著性),您可以继续构建模型管道。如果没有,在进行任何开发之前,尝试找出原因。

原因 2:伟大的模型,伟大的用例,糟糕的激活

有时候用例和模型很棒,但是消耗预测的团队并没有采取最有效的行动。回到我们的客户流失例子,如果企业采取的行动不足以留住客户,该模型将不会产生太大的影响。您的项目经理应该确保您的模型输出的消费者有效地采取行动。尝试不同的方法来保持客户忠诚度将有助于克服薄弱的结果。

无论您的模型表现不佳是因为糟糕的用例还是糟糕的激活,很明显在这两种情况下,您的 PM 都扮演着关键的角色。因此,你可能想知道,作为一名数据科学家,你应该做些什么来确保你将精力集中在正确的任务上?

1)确定业务指标

模型性能最重要的指标是它应该影响的业务指标。

业务人员不理解也不关心 ML 指标(F1 分数、准确度、精确度),数据科学家不知疲倦地工作来优化他们的模型。向你的商业利益相关者展示你的模型的 F1 分数是 0.9,他们不知道你在说什么。试着解释 F1 分数意味着什么,你可能会意识到你也不完全确定。😅

这是底线。如果有一点你应该从这篇文章中学到的,那就是:

你的商业模式是如何赚钱的?衡量一个模型成功的真正标准是它如何影响业务

最终,业务影响是唯一重要的结果。这是 Kaggle 比赛和现实世界中的模特之间的根本区别。在 Kaggle 比赛中,得分最高的模型获胜。在现实世界中,即使您的模型在精确度和召回率等指标上取得了惊人的成绩,它仍然会产生糟糕的业务影响。如果赚不到钱,那对生意就没用了。注意,为企业赚钱有三种方式:

  1. 带来更多收入(增量收入)
  2. 确保现有收入
  3. 降低成本

在进行任何建模工作之前,请与您的项目经理讨论您想要移动的业务指标。客户流失率是衡量流失率模型成功与否的指标。我们想减少离开我们公司的顾客数量。重要的是要明白,仅仅基于模型和相关营销策略来降低流失率是困难的。流失受一系列因素的影响。

正如 Prinkesh 在这篇文章的评论中正确强调的那样,用户体验是流失的重要决定因素。

这种模式有助于赢回濒临流失的客户。因此,我们应该根据模型的预测来衡量目标客户的流失率。如果我们能降低他们的流失率,那么这个模式就是成功的。

2)准确理解企业将如何使用你的模型

如果你不相信企业会正确使用你的模型的预测,那就是一个大的危险信号。您的项目经理负责优先考虑他们确信会产生影响的有意义的工作。向你的项目经理提出你的担忧,并向他们提供让你自信的想法。经前综合症在任何时候都会同时处理几项任务。很难有所有的答案。团队合作,确保你拥有释放价值所需的一切。

总结和问题

专注于产生影响比什么都重要。要变得有价值,你需要交付价值,并告知业务中的相关利益相关者你所交付的价值。如果你能在探索很酷的技术框架、包、模型和其他工具的同时交付价值,那就去做吧。对于产品团队来说,最重要的是把你的精力集中在你擅长的、你喜欢的和业务需要的东西上。

这是最后一个问题,应该可以帮助你记住这篇文章的内容。**在我们的流失例子中,如果你的第一个模型的召回分数为 0.75,经过实验,你的第二个模型的召回分数为 0.8,那么第二个模型是否更好?**希望在评论中听到你的想法。

最重要的 XAI 类型

原文:https://towardsdatascience.com/the-most-important-types-of-xai-72f5beb9e77e

看看 XAI 的三种高影响力类型

这篇文章讨论了 XAI 的三种关键类型:可解释的人工智能、透明的人工智能和可交互的人工智能。在我从事人工智能的这段时间里,我发现这三者比其他任何一个都更实用。在这篇文章中,我给出了每个的概述和例子。

Jr Korpa 在 Unsplash 上拍摄的照片

人工智能(AI)围绕着我们生活的许多方面。我们与人工智能在日常生活中影响的许多应用程序进行交互。有一个机会,一个人工智能向你推荐了这篇关于人工智能的文章。它很强大,不可否认这些智能算法对我们社会的影响。但是,每一次成功的背后,似乎都有两倍的失败是由于对算法工作原理的误用或误解。例如,任何处理特定于人的信息的算法都在审查之下(有一个很好的理由[5])。有多少被算法歧视的案例?够了。当我们试图构建更好的算法时,毫不奇怪,可解释性(或 XAI)是我们许多人最关心的问题。令人印象深刻的是,创造性的解决方案使人工智能变得可以解释。但是,并不是所有的 XAI 人生而平等。我论文的重点是 XAI 的一个子集,但它要求我研究 XAI 更广泛的领域。我在 2019 年把这个图像放在一起,所以你可以想象今天还有多少 XAI 词。

图片(由我拍摄)突出了几个 XAI 流行语

并非所有的 XAI 人生而平等。每种类型都有其独特的优势,对于创造一个更容易理解的人工智能至关重要。然而,XAI 的背景将决定你需要什么样的 XAI。XAI 存在于低级解释(对数学家、人工智能工程师和数据科学家来说很好)和高级解释(对对人工智能或其背后的数据一无所知的最终用户来说很好)之间。

图片(由我拍摄)突出了看待 XAI 类别的不同方式。

注意:这些不是独立的类别。这意味着,一些 XAI 可能属于多个类别。

让我们举一个不同类别的 XAI 发挥作用的例子——自动驾驶汽车。在我之前关于 XAI 的文章中,我强调了建设 XAI 时需要考虑的三个重要问题。当考虑自动驾驶汽车在人工智能的整个生命周期中所需的 XAI 类型时,它们是适用的。 人工智能工程师 与低级 XAI 合作,了解它在汽车上部署时将如何工作的界限。然而,这对制造汽车的机械工程师来说是不切实际的。他们可能需要知道人工智能的输出将如何影响车辆本身。如果人工智能识别出停车标志,工程师将需要理解如何应用刹车。

这种 XAI 类型不同于人工智能工程师构建有效人工智能所需的 XAI。所以,机械工程师想要来自人工智能的反馈(交互式的,可修改的)来为硬件(汽车)做出最好的决定。

无人驾驶汽车将多一个用户— 乘客 。乘客们不关心任何工程师的 XAI。司机只关心安全到达目的地,所以他们希望他们的人工智能是负责任和值得信赖的。为了在光谱的右边产生 XAI(比如负责任和值得信赖),我们必须在光谱的左边建立 XAI。每个 XAI 都浮出水面,因为它在某些情况下是必不可少的,但我发现了三个最好的——可解释的、透明的和交互的。

可解释人工智能

可解释人工智能是最重要的 XAI 类型之一,因为它解释了人工智能如何做出决定。“可解释的”有很多定义。但是,我最喜欢的是“一个用户不仅能看到,还能研究和理解输入是如何数学映射到输出的系统。”[1].遵循这个定义,就很容易明白为什么它如此重要。如果人工智能符合可解释的定义,我们可以很容易地构建 XAI 来支持人工智能,因为人工智能不是黑盒。不幸的是,这个定义并不总是可行的,因为会有性能的折衷。可解释意味着更低复杂性的模型,但这与我们模型的轨迹相反。很容易说 GPT-4 是不可解释的。然而,如果一个可解释的人工智能足够满足你的应用,我会强烈推荐它。

透明人工智能

透明的 AI 对于建立人与算法之间的信任至关重要。透明度是另一个没有一致定义的流行词,但在实践中,它指的是任何有助于回答人工智能是什么、为什么或如何工作的问题的方法。透明方法不仅分析人工智能,还分析人工智能正在处理的数据。

透明人工智能的一些典型输出是摘要[2],可视化[3],甚至是数字描述[4]。这些输出中的每一个都是试图将人工智能的细节翻译给人类。通过更好地了解人工智能如何运作,我们可以在使用它时建立信任。通过查看 AI 如何处理数据,用户可以确保算法的行为符合预期,这有助于建立对机器决策的信心。尽管可解释性可能不可行,但我相信所有的人工智能在某种程度上都应该是透明的。我可以被说服,但我还没有找到一个合理的反驳。

交互人工智能

可交互人工智能是一种 XAI,允许用户与机器学*模型进行交互,以理解它为什么做出特定决定。这种类型的 XAI 有利于解释难以解释的复杂模型。通过查看数据和机器学*模型并与之交互,用户可以更好地理解机器如何做出决策。

可交互的人工智能允许人类和算法通过相互提供反馈来共同工作,以实现共同的目标。人类在与机器合作时扮演着至关重要的角色,因为我们可以为算法提供上下文。交互式人工智能可能会带来人类以前无法实现的新成就。可交互的人工智能很棘手,因为它很可能是特定领域的。例如,如果你正在使用人工智能生成一个标志,你将不得不指导人工智能创造一些可以接受的东西。你需要的界面类型与你是一名医生试图诊断一名病人时完全不同。在每种情况下,人类都需要能够将他们的偏好或知识插入到人工智能的决策中。

结论

在这篇文章中,我们探索了对人工智能的未来至关重要的三种 XAI。可解释的人工智能提供了对人工智能如何计算输出的直接理解,但这些模型很少见。透明的人工智能对于建立人与算法之间的信任非常重要,因为它有助于用户理解人工智能是如何工作的。交互式人工智能允许用户与人工智能互动,共同工作。我相信这些 XAI 流行语将推动人工智能在新应用和领域的采用。

参考

[1] 参考 1 (可解释性)

[2] 参考文献 2 (透明文本)

[3] 参考文献 3 (可视化中的透明度)

[4] 参考文献 4 (数字透明度)

[5] 参考文献 5 (招聘中的偏见)

最可持续的策略是跟随你自己的好奇心

原文:https://towardsdatascience.com/the-most-sustainable-strategy-is-to-follow-your-own-curiosity-8a852649bff3

作者聚焦

Julia Turc 讨论了她在自然语言处理方面的职业道路以及多模态机器学*的未来

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 朱莉娅·图尔奇 分享我们的对话。

照片由朱莉娅·图尔克提供

Julia 是一名软件工程师和自然语言处理研究员,对迁移学*和多模态模型特别感兴趣。她最*离开了谷歌,在生殖人工智能领域创办了自己的公司。当她不在键盘前时,你会发现她带着她的金毛猎犬朱莉在纽约市漫步。

是什么首先吸引你进入自然语言处理领域的?

上大学前,我对语言和科学同样感兴趣。当时,我认为这是一个无法解决的二分法,我必须在它们之间做出艰难的选择。我决定在大学里攻读计算机科学,并开始接受语言不会成为我未来职业生涯中重要部分的想法。然而,当我为我的大学论文寻找一个主题,并找到一个分析推文中情绪的项目提案时,我突然想到了一个问题。

现在听起来已经是老生常谈了,因为从那以后情绪分析就被打死了。但在当时,这个话题汇集了多个潜力不断增长的元素:深度学*、作为未开发数据源的社交媒体和自然语言处理。在研究生院,我学*机器翻译(具体来说,我们正在研究递归神经网络是否应该是双向的);我记得我着迷于将语言投射到矢量语义空间的想法,以及它所有的哲学含义,比如意义的意义。感觉我已经在最初放弃的计算机科学、语言和哲学的交叉点上找到了自己的位置。

随着时间的推移,您的 NLP 方法是如何发展的?

在我的职业生涯中,迄今为止最重要的事件是迁移学*的兴起——重用像 BERT 或 GPT-3 这样的大型通用语言模型来解决几乎任何语言任务。我的关注点已经从特定任务的技术转移开了(例如,我们应该使用双向 RNN 进行机器翻译吗?)到更广泛的迁移学*研究:我们如何改进基础模型,从而让所有的 NLP 任务同时受益?

更具体地说,在过去几年中,我研究了增强迁移学*的基石——变形金刚的方法:如何让它们在计算上更加有效,如何提高它们的多语言能力,以及如何防止它们产生“幻觉”(即产生听起来似乎合理的错误)。

根据你自己的职业道路,你对早期职业 ML 从业者应该关注的项目类型有什么建议要分享吗?

我认为机器学*发展太快,无法对你所追求的特定子领域或项目进行战略规划。最可持续的策略是跟随你自己的好奇心,深入挖掘任何激发你兴趣的东西,无论是过时的(如 word2vec 嵌入)还是最闪亮的新玩具(如文本到图像模型)。

当你真正内化一个概念或技术,能够质疑它,改进它,或在新的环境中使用它时,创造力就开始了。对我来说,最高的投资回报率是直接进入代码——这是基本的真理,不受人工智能文学的缺点(修饰、夸张和与人类思维的强行比较)的影响。

我记得我很难理解变形金刚论文,直到我看了代码才意识到,在那些自命不凡的术语(例如“多头自我关注”)背后,只是一些矩阵乘法,这是所有模型真正可以归结为的。我从被一项看似难以理解的研究弄得不知所措,到被邀请为 TensorFlow 的官方 YouTube 频道拍摄一部关于变形金刚的教程。

是什么激发了你为更广泛的受众发布这些主题——你是如何选择主题的?

当参加谷歌的阅读小组时,我发现用尽可能简单的术语展示数学含量高的研究论文非常令人满意,因为它去除了学术上的困惑,抓住了核心信息。我经常从我的同行那里收到非常令人鼓舞的反馈,并且意识到,如果这种重构能够让该领域的专家受益,那么它将对更广泛和不太专业的受众产生更大的影响。

关于选题,我总是写与我当前工作密切相关的话题,因为写作迫使我对自己的项目有更清晰的认识。

展望未来,你希望在未来一两年内看到你所在领域的哪些变化?

我坚信机器学*的未来是多模态的。迁移学*集中了自然语言处理和计算机视觉。现在,不从通用的预训练模型开始,在这两个领域中的任何一个领域进行操作都是不可想象的。

此外,单峰模型(纯文本、纯图像)的规模正接*互联网上可用数据的上限。很自然的,下一次大统一将把多种形式结合在一起:文本、图像、连续的传感器数据等等。第一个迹象是:CLIP 已经将文本和图像融合到一个单一的公共语义空间中,并为 DALL E 2 等应用程序提供支持,产生了巨大的现实影响。这种趋势很可能会继续下去,使全面发展的代理人能够驾驭我们周围复杂的世界。

要了解更多 Julia 的工作并了解她的最新文章,请在 Medium 、Twitter 和 LinkedIn 上关注她。为了了解 Julia 在 TDS 方面的广泛工作,这里有几个突出的帖子:

  • 如何在谷歌云平台上运行稳定的扩散服务器(GCP)(2022 年 9 月,10 分钟)
  • 为文字转图像模型制作提示(2022 年 7 月,6 分钟)
  • 自然语言理解数据集未解决的问题(2020 年 8 月,7 分钟)
  • 开关变压器(2021 年 1 月 6 日分)
  • 为什么 GPT 不会告诉你真相(2022 年 5 月,6 分钟)

想和广大观众分享一些你自己的作品吗?我们希望听到您的意见。

这个问题&是为了长度和清晰度而稍加编辑的。

最被低估的 R 包:第 2 部分

原文:https://towardsdatascience.com/the-most-underrated-r-packages-part-2-decdc753205c

令人敬畏的和不太为人所知的 R 库的精选列表

特雷弗·瓦诺伊在 Unsplash 上的照片

所以,我们又来了。几年前我发表了一份清单列出了当时我认为最被低估的 R 包。那个帖子仍然在产生观点和掌声,所以我觉得是时候更新列表了。

开始吧!

💥多方面的💥

  • 屠夫 :在R中建模管道偶尔会导致拟合的模型对象占用太多内存。有两个主要的罪魁祸首:1)在建模过程中严重依赖于捕获封闭环境的公式和闭包;以及 2)在模型对象本身的构造中缺乏选择性。结果,拟合的模型对象携带了通常是冗余的并且对于拟合后的估计活动不需要的组件。butcher可以轻松削减拟合输出中不再需要的部分,而不会牺牲原始模型对象的很多功能。
  • 编年史 :轻松给你的函数添加日志,不干扰全局环境。
  • 建设性: 打印可用于重新创建 R 对象的代码。在某种意义上,它类似于base::dput(),但是努力使用“自然的”构造函数(factor表示因子,as.Date()表示日期,data.frame()表示数据帧等),以获得人类可读的输出。
  • encryptedRmd :使用lib 钠自加密 html markdown 报表。这个软件包可以让你用密码保护 markdown html 文档,并安全地与他人分享。
  • 光栅: 光栅提供了分组日期类的简单而一致的实现。
  • secret: 允许共享敏感信息,例如密码、‘API’密钥等。,在 R 包中,使用公钥加密。
  • sessioninfo: 查询并打印当前 R 会话的信息。它类似于utils::sessionInfo(),但是包含了更多关于软件包的信息,以及它们的安装位置。
  • SheetReader**:**它提供了从 Excel OOXML(.xlsx)文件。这个库将 SheetReader 集成到一个 R 包中,其中[Rcpp](https://cran.r-project.org/package=Rcpp)作为用 C++编写的解析代码的接口。对于大文件比 openxlsx 快很多。
  • ps: ps 实现了一个 API 来查询和操纵系统进程。它的大部分代码基于 psutil Python 包。
  • regex magic:regex magic 的目标是提供一种自动化的方法,用于根据正则表达式匹配将字符串向量分类成组。这不同于在向量中查找已知正则表达式的匹配,而是有助于确定字符串之间的共性。

⚙️数据管理/⚙️业务中心

  • crew: 任务队列是一个中心枢纽,用于动态和异步地编排计算要求高的工作负载。crew包支持各种具有公共接口的任务队列和用于不同平台的不同类型的工作者,类似于[future](https://future.futureverse.org/)包为单个作业和单个 map-reduce 调用提供统一的 R 接口的方式。
  • 在验证工具集之上,这个包为您提供了提供和更新定义您的表的信息的方法。

来源:Pointblank Github Repo

  • projmgr: projmgr旨在更好地将项目管理整合到您的工作流程中,并腾出时间从事更令人兴奋的任务,如 R 编码和数据分析。因为许多 R 用户和程序员使用 GitHub 作为他们分析的家,所以projmgr的目标是用这些相同的工具来简化项目管理。
  • 目标:targets包是一个 Make 式的 r 中统计和数据科学的管道工具,有了targets,您可以保持一个可重复的工作流,而无需重复自己。targets为已经更新的任务跳过昂贵的运行时间,用隐式并行计算协调必要的计算,并将文件抽象为 R 对象。最新的targets管道是输出与代码和数据一致的切实证据,这证实了对结果的信任。在我以前的文章中,我已经谈到了德雷克,目标的前任。
  • 香根草: 香根草的目标是提供流畅的工具来版本化、共享、部署和监控一个经过训练的模型。函数负责记录和检查模型的输入数据原型,并从远程 API 端点进行预测。vetiver 包是可扩展的,具有支持多种模型的泛型,对 R 和 Python 都可用。

🧐功能和软件包分析🧐

  • foreman**:**foreman 的目标是解包一个包的函数,以询问其中函数的关系。隔离包中的函数脚本(包括本地路径的文档),并将自包含函数的子集合并到一个文件中,以便集中学*特定的包功能。

来源:Foreman Github Repo

  • funspotr:funspotr(R function spotter)的目标是方便识别文件和项目中使用了哪些函数和包。最初编写它是为了创建一些流行的 GitHub 库中使用的函数和包的参考表。
  • pkgnet**:**是一个专为 R 库分析而设计的 R 库!该包的目标是构建一个包及其依赖项的图形表示,以通知各种活动
  • unlaver:unlaver 是一个 R 包/ Addin,旨在帮助数据科学家理解和探索利用 fluent 接口(通过管道的函数组合)的 tidyverse R 代码。有了解开,你可以解开dplyrtidyr代码,在 RStudio 中打开一个闪亮的应用程序。然后,您可以单击这些行来检查 tidyverse 代码的中间输出(通常是数据帧)。代码和输出都将根据发生的更改类型(无更改、可见更改、内部更改、错误)突出显示。

来源:解开 Github 回购

📊可视化、表格和报告📊

  • gg pattern:ggpattern提供自定义ggplot2几何图形,支持基于几何和图像的填充区域。
  • plotme:{plotme}软件包为在 r 中很难创建的情节提供了一个人性化的界面。目前只存在两个功能,创建{plotly} 旭日treemap 情节,但(希望)更多功能即将到来。
  • reactable fmtr:包简化并增强了用 R 包构建的表格的样式和格式。包提供了许多可高度自定义且易于使用的条件格式化程序。
  • report factory:是一个 R 包,它简化了处理多个.Rmd报告、一次性编译一个或几个报告以及将输出存储在组织有序、带有时间戳的文件夹中的工作流程。下图对此进行了说明:

来源:Reportfactor Github Repo

  • vistime :一个用于创建基于时间的图表的库,如甘特图或时间表。可能的输出包括ggplotplotly图表、Highcharts或 data.frames。结果可以在 RStudio 查看器窗格、R Markdown 文档或闪亮的应用程序中使用。

结论

就是这样。我希望你找到了对你的 R 相关工作有用或有启发的东西。如果你知道一些其他被低估的库,你觉得其他人应该试着使用,请在评论中写下或者在 Twitter 上 ping 我,如果你错过了这篇文章的第一部分,请阅读它!

** **

阿达辛之迷被揭开了

原文:https://towardsdatascience.com/the-mystery-of-adasyn-is-revealed-73bcba57c3fe

[艾德亚多·桑奇兹](http://Eduardo Sánchez)在 Unsplash 拍摄的照片

如果你认为你知道 ADASYN 在预测模型中做什么,你很可能错了。继续读下去,我们将向你展示非凡的真理。

首席研究员:戴夫·古根海姆/合作研究员:斯里什·蒂鲁马莱

前言

这项研究假设您熟悉类不平衡和 ADASYN 算法。我们强烈建议我们的读者阅读推出 ADASYN 的会议文章(只需输入谷歌学术或查看本文的参考资料部分),然后阅读《走向数据科学》中讨论类别失衡和 ADASYN 的任意数量的文章。

因为这既不是指南,也不是概述;这是一次探索未知领域的航行,有着惊人的发现。

简介

一开始,我们想研究三个主要问题:

  1. 学*模型和它们的预测对阶级不平衡有不同的敏感度吗?
  2. ADASYN 是否在一系列综合样本比率和学*模型中提供稳定的预测?
  3. ADASYN 到底在用看不见的数据做什么?

答案依次是令人惊讶、引人入胜和非同寻常。但首先,我们将分享实验的基础。

型号定义

这项研究中的所有模型都是使用 sci-kit learn 库中的 RandomForest 和 LogisticRegression 算法进行的,以分别获得关于树和线性结构的信息。在 train_test_split 中使用“分层=y ”,在 GridSearchCV 中使用“cv=10 ”,用分层抽样对所有预测模型进行 10 倍交叉验证。

随机森林模型的所有超参数都保留其默认状态,并且“random_state=1”应用于所有用于分区、处理(ADASYN)和建模的随机种子选择。

这里使用的线性函数是 LogisticRegression+GridSearchCV。每个二元逻辑回归分类模型使用以下超参数运行:

1)惩罚= 'l2 '

  1. C = 1E42

3)求解器= 'liblinear '

  1. class_weight =无

  2. cv = 10

  3. max_iter = 5000

7)得分=“准确性”

8)随机状态= 1

为了保持 liblinear 解算器的使用(它支持 l1 和 l2 罚分,并且我们在研究中专门使用它作为公平竞争的场所),该解算器选择需要设置正则化罚分。在这种情况下,我们选择“l2”或 ridge 作为惩罚,但因为我们只对 ADASYN 的效果感兴趣,所以我们通过将“C”设置得非常大来禁用它。通过这种方式,我们不必引入特征缩放作为数据预处理组件,鉴于我们之前的发现,这是有问题的(特征缩放的奥秘最终被 Dave Guggenheim |向数据科学迈进)解决。所有其他超参数都保留默认值。

由于样本大小始终是机器学*的一个问题,如果数据集的每个预测器的样本少于 12 个,作为泛化误差的设定点(Shmueli,Bruce,Gedeck 和 Patel 2019),我们保留 10%的人口作为测试样本。对于超过 24 个样本/预测值的模型,我们将数据集分成相等的两半,50%用于训练,50%用于测试。在这两个值之间,我们使用了一个等式来平衡测试集与足够大的训练集的泛化误差(Abu-Mostafa,Magdon-Ismail,& Lin,2012,第。57).

其中四个数据集包含缺失值,因此为了与之前的研究保持一致,我们使用了缺失值插补的 MissForest 算法( MissForest PyPI ),因为它能够抵抗噪声、异常值或多重共线性的有害影响。此外,我们选择完全哑编码分类预测器,而不是选择名义或顺序数据类型的替代算法。因为线性模型和树模型都在本研究中,所以对于逻辑回归和随机森林模型,虚拟编码分别具有丢弃和未丢弃的子类型。和往常一样,如果一个潜在的预测值明显较低或没有信息,如身份证号码,它会在数据预处理之前被丢弃。

构建这些模型的目的是检查 ADASYN 的影响,而不是调整模型以获得最佳结果。出于这个原因,我们在模型中引入了尽可能多的默认值,为上述比较创造了一个平台。

与我们之前的研究一样,这项工作包含了方差的随机函数,因此结果是基于学*模型看不到的数据。所有混淆矩阵及其相关分析都代表了真实世界的测试数据。

数据集

表 1 列出了本次分析中使用的 30 个开源数据集,这些数据集是根据其数据类型和复杂性选择的。UCI 索引( UCI 机器学*库:数据集)托管了这些数据集的大部分。其他不在 UCI 索引中的位于 Kaggle ( 查找开放数据集和机器学*项目| Kaggle )。

表 1 数据集及其来源(图片由作者提供)

类别不平衡不足以生成合成样本的数据集被排除在考虑范围之外;否则,它们被选择来代表如图 1 所示的大范围的不平衡。Classdiff 或阶级差异度量是从多数阶级的百分比中减去少数阶级的百分比。

图 1 数据集及其类别不平衡(图片由作者提供)

目标变量完全是二项式的,因为 ADASYN 只能对二元分类数据进行操作。现在,关于这些问题…

学*模型及其预测对班级失衡的敏感度不同吗?

令人惊讶的答案是否定的,至少对于这两款车型来说是否定的。为了确定这种情况,我们测量了所有数据集的随机森林和逻辑回归的不平衡模型中假阴性测试数据的百分比。假阴性浓度的升高表明对类别不平衡的更大敏感性,这是由于对真阳性(少数类别)的错误分类倾向的增加。详情参见图 2。

图 2 类不平衡敏感度结果(图片由作者提供)

不平衡随机森林模型平均有 7.967%的测试数据为假阴性,而不平衡逻辑回归模型平均为 8.51%,由于未能拒绝零,多重 t 检验证实它们代表相同的分布(见图 3、4 和 5)。

图 3 配对双样本 t 检验(图片由作者提供)

图 4 假设方差相等的双样本 t 检验(图片由作者提供)

图 5 假设方差不等的双样本 t 检验(图片由作者提供)

两种截然不同的学*模式,但两者对班级失衡的平均预测敏感度相同。将测试更多的模型类型,以确定类别不平衡是否是一种普遍的、预测不可知的现象。

ADASYN 是否在一系列综合比率和学*模型中提供稳定的预测?

ADASYN 提供了更改合成样本比率的能力,从默认的 50/50 分布(具有最大数量的合成样本)降低到不生成合成样本的数据的自然类别不平衡。每个图表在顶部显示数据集的名称,并显示一系列使用 ADASYN ratio 函数的模型,并用 y 轴上的 F1 分数进行测量(标记为“准确性”)。选择 F1 评分是因为它是 ADASYN 作者(何、白、加西亚和李,2008)推荐的一般衡量标准。x 轴包含多数/少数类的比率,表示为与 50/50 起点的偏差。阅读 x 轴刻度线的快速指南如下:

a.0 =五五比

b.10 = 55/45 比率(50+5 和 50–5)

c.20 = 60/40 比率(50+10 和 50–10)

d.30 = 65/35 比率(50+15 和 50–15)

e.40 = 70/30 的比例(等等。)

f.50 = 75/25 的比例(等等。)

g.60 = 80/20 的比例(等等。)

默认的 50/50 ADASYN 分布在最左侧,而自然不平衡出现在最右侧。定义这些线的每个序列模型代表了从 50/50 起点直到达到自然不平衡的 2%的阶级差异增加(每个模型=多数+1 和少数-1)。蓝色的点(在最左边)表示没有平衡的训练数据,而橙色的点(相同的区域)显示没有平衡的测试数据。水平的蓝色和橙色线分别显示了平衡的训练和测试数据,即序列模型。

每组有两个地块,数据集用随机森林拟合,然后用逻辑回归拟合(见图 6-11)。我们希望了解在合成样本、数据集和模型的范围内,测试数据标绘线的干扰程度,从而了解标绘体积。

我们将在这里谈论它们,这样你就可以跳过情节,更快地到达 ADASYN 揭示。基本上,随机森林在所有数据集的比率范围内大多是稳定的,而逻辑回归可能会变得相当混乱,迷人的逐步函数导致稳定的量子水平。这些量子能级的数学描述,特别是它们的维度的确定,应该在未来的工作中探索。

不管学*模型如何,在几乎所有情况下,默认的 50/50 ADASYN 处理都是稳定的,并在测试数据上提供了最佳性能。但是,也有一些例外(例如,使用两种模型的流失建模、RandomForest 的信贷批准以及 LogisticRegression 的德国信贷)。请参考下面的图表,了解这个 1,000+模型实验的图示。

图 6 随机森林的 ADASYN 比率稳定性(图片由作者提供)

图 7 逻辑回归的 ADASYN 比率稳定性(图片由作者提供)

注意:澳大利亚信用证明数据在没有综合调整的情况下接*平衡(训练集中的 284/233 类样本)。在随机森林中没有 ADASYN 改进,但尽管在训练数据中注入了有限数量的合成样本,但逻辑回归显示了更好的性能。

图 8 随机森林的 ADASYN 比率稳定性(图片由作者提供)

图 9 逻辑回归的 ADASYN 比率稳定性(图片由作者提供)

图 10 随机森林的 ADASYN 比率稳定性(图片由作者提供)

图 11 逻辑回归的 ADASYN 比率稳定性(图片由作者提供)

阿达辛被揭露

对于大多数数据集,ADASYN 单独将测试样本从真阴性转换为假阳性(上侧)和从假阴性转换为真阳性(下侧),分别在每个侧内一一对应。少量数据集沿相反方向行进,在每个横向内也是一对一的。更多详情请参考图 12。

图 12 混淆矩阵横向转移

以下四个图表(图 13-16)显示了真阴性(TN)、假阳性(FP)、假阴性(FN)和真阳性(TP)的增量,以应用 ADASYN 后测试数据的百分比变化进行测量。随机森林模型是前两个图表,逻辑回归紧随其后。每对图中的第一个(图 13 和 15)显示了真阴性和假阳性之间的关系,每对图中的第二个(图 14 和 16)显示了假阴性和真阳性之间的关系。

向左移动的条形表示测试数据减少了一定的百分比,向右移动的条形表示测试数据增加了一定的百分比——这是不平衡模型的增量。由于 ADASYN* ,相反方向的等长条“蝴蝶的翅膀”显示了混淆矩阵中从左侧象限到其横向关系的直接转移

*完全由这些图表背后的数字数据支持。统计支持无关紧要,因为转让的绝对值是相同的。

随机森林模型

图 13 随机森林模型的 TN-FP 上部横向混淆转移(图片由作者提供)

关于随机森林模型,30 个数据集中的 26 个显示了从真阴性到假阳性的数量完全相等的零或正值转移(8 个为 0,18 个为正值)。这些结果不会导致分母发生变化,但会导致特异性(TN/(TN+FP)) 的分子减少,从而导致捕获 TN-FP 转移的源和汇的指标总体减少。

绝对不应该使用 Precision,因为它无法为假阳性接收器捕获真正的阴性源。此外,永远不要使用 F1 分数,因为它的分子和分母都很精确。

四个数据集显示了与这种情况相反的情况,发生了从假阳性到真阴性的转移。这一现象将很快被探究。

图 14 随机森林模型的 FN-TP 较低横向混淆转移(图片由作者提供)

移动到 FN-TP 维度,30 个数据集中的 26 个显示了从假阴性到真阳性的数量完全相等的零或正计数转移(4 个为 0,22 个为正值)。这些结果不会改变分母,但会增加灵敏度(TP/(TP+FN)) 的分子,从而总体增加捕获 FN-TP 传输的源和汇的度量。

四个数据集显示了与这种情况相反的情况,从真阳性到假阴性发生转移,这也将很快被探究。

逻辑回归模型

图 15 逻辑回归模型的 TN-FP 上横向混淆转移(图片由作者提供)

图 16 逻辑回归模型的 FN-TP 下侧混淆转移(图片由作者提供)

关于逻辑回归模型,30 个数据集中的 26 个显示了从真阴性到假阳性的完全等量的零或正值转移(4 个为 0,22 个为正值)。此外,移动到 FN-TP 维度,30 个数据集中的 26 个也显示了从假阴性到真阳性的完全等量的零值或正值转移(6 个零值,20 个正值)。

如上所述,特异性和敏感性应用于分析,因为它们分别包括混淆转移的源和汇(更多信息见图 17)。

图 17 敏感性和特异性指标(从 敏感性和特异性—维基百科 )

性能的一般测量可以从信息开始,它等于特异性+灵敏度 1 。另一个度量可以是灵敏度和特异性的调和平均值,作为 F1 分数的适应[2 *(TPR * TNR)/(TPR+TNR))。然而,F1 评分受到了批评,因为它认为特异性与敏感性具有相同的值,但这种情况很少发生。有一个可调的 F1 分数,它使用β系数来引起两个基本度量之间的偏移(sklearn.metrics 中的 fbeta_score ),这可以进行调整,但选择该系数是有问题的。其他人提出将马修斯相关系数作为衡量二元变量的更好指标(Chicco & Jurman,2020)。

反向转账

反向转移是指假阳性变成真阴性,真阳性变成假阴性。有七个数据集导致反向转移,三个专用于随机森林模型,一个专用于逻辑回归,三个生成反向转移而不考虑学*模型(见表 2)。

表 2 反向转移(图片由作者提供)

如果 TN 和 FN 都增加(如粗体所示),则发现一对匹配的横向混淆象限。该表以颜色编码,灰色表示未知,黄色表示样本量问题,绿色表示共享 MissForest。

关注随机森林模型(见图 18 和 19),四个(从顶部数,第四个)中的两个较小的反向转移之一可能是由于样本大小的问题。在这种情况下,每个预测器的样本远少于 12 个(即 p >> n ),并且观察到微小的反向转移。虽然这是轶事,但样本大小始终是机器学*中的一个问题,这些微小的反向转移可能是模型不稳定的结果。在这些潜在样本量问题的情况下,TN-FP 和 FN-TP 转移维度之间缺乏匹配,进一步暗示了模型的不稳定性。BostonHousing 是一个异常,因为尽管反向转移的影响可以忽略不计,但样本大小似乎不是一个问题——这将在以后的研究中进一步研究。

图 18 随机森林模型的 FP-TN 反向转移(图片由作者提供)

图 19 随机森林模型的 TP-FN 反向传输(图片由作者提供)

然而,在两个数据集中发生了更大的反向迁移,而不管学*模型和样本大小是不是一个问题。这两个数据集(Lending Club 和 NBA 新秀)具有匹配的反向转移(FP 转换为 TN TP 转换为 FN ),除了通过逻辑回归显著增加 TN% delta 和 FN% delta 之外,几乎没有其他相似之处;例如,与不平衡模型相比,NBA 新秀的真阴性增加了 29.1%,假阴性增加了 25.37%(以及相应的 FP 和 TP 减少)。NBA 新秀都是数字,有大量浮点预测值,而 Lending Club 有八个分类变量,由于 one-hot 编码导致更大的稀疏化(见表 3)。它们共有的一个属性是都使用了 MissForest 缺失值插补算法。事实上,在导致反向转移的七个数据集中,其中四个使用了 MissForest 算法,这是仅有的四个缺少值的数据集。

表 3 匹配大额反向转账的数据集(图片由作者提供)

ADASYN 在内部使用 k-最*邻(kNN)算法,并将缺失值插补算法更改为 sklearn.impute 库中的 KNNImputer,从而实现了微小的改进,例如,乳房 x 光照片和 Wisc Prog 从不匹配的反向传输转换为小比例的匹配正向传输;基本上实现了正常运行。虽然测量了小的改善,但 Lending Club 和 NBA 新秀仍然存在反向转移的严重问题,这是一个值得进一步研究的无法解释的现象。

但这确实提出了一个有趣的应用点——在使用 ADASYN 时,我们应该考虑使用 kNN 缺失值插补,因为它在每种缺失值的情况下都能提供稍好的性能。

商业分析场景

特异性敏感性虽然是很好的指标,但都无法捕捉到混淆矩阵中相对侧的信息。特异性定义了上侧,而敏感性衡量了下侧,但两者都无法“看到”等式的另一侧。衡量标准 Iinform ness有助于解决这个问题,但是更好的理解来自于经济分析,它包含了混淆矩阵的所有四个象限,并在成本/收益关系中将它们标准化。虽然假阴性和假阳性几乎总是有相关的成本,但真阴性和真阳性可能是成本或收益,这取决于场景,这限制了在业务设置中对性能的一般测量的有用性。

因此,如果 TN-FP 转移的负值大于 FN-TP 转移的正值,则 ADASYN 的表现将低于不平衡模型。相反,如果 FN-TP 转换产生的绝对值大于 TN-FP 维度,则 ADASYN 辅助模型将更优越。

以下四个场景探讨了经济绩效的概念,并通过简化的案例展示了几种可能的结果。

场景 1 员工流失

在这种情况下,目标变量 Gone 表示已经离开组织的雇员。由于雇佣和培训新员工的成本,准确预测即将到来的辞职可能相当重要,即使没有大的辞职。

根据美国劳动局的数据,更换一名员工的成本可能高达高管年薪的 200%,但全国平均水平为年薪的 21%。防止辞职的干预成本是不可用的,因为它们通常是定制的,所以我们选择年薪的 4%作为保留成本。应该注意的是,这种保持成本会随着时间和条件而变化。从劳动局也获得了按职业估算平均工资的数据。

TN =员工不受影响,这是中性的。

FN =员工将在没有干预的情况下离开;替换成本*计数为负

FP =员工不会离开,但无论如何都要干预;维护成本*计数为负

TP =员工将离职,但干预被阻止;维护计数的成本为负值,但更换计数的成本为正值。

表 5 员工流失经济绩效分析(图片由作者提供)

表 4 表明 ADASYN 辅助的随机森林优于该系列中的所有其他模型。

场景二信用审批

在这种情况下,我们选择的平均信用值为 10,000 美元,该值的违约成本为 25%。

TN =信用被批准,金额*计数被添加为正数

FN =信用已批准,但金额默认成本数量为负值

FP =信用被拒绝,金额*计数为负数

TP =信用被拒绝,这导致节省违约成本*计数为正数

表 5 信贷审批经济绩效分析(图片由作者提供)

表 5 表明,无辅助随机森林模型优于该系列中的所有其他模型。

场景 3 客户流失(电信客户流失)

我们曾在电信行业使用预测模型,我们估计替换一个客户的成本为 500 美元,保留一个客户的成本为 50 美元,这是基于真实世界的信息,这些信息曾经是正确的,但现在可能已经过时了。

TN =客户不受影响,这是中性的。

FN =客户将离开,无需干预;替换成本*计数为负

FP =客户不会离开,但无论如何都要干预;维护成本*计数为负

TP =客户将离开,但干预被阻止;维护成本*计数为负

表 6 客户流失经济表现分析(图片由作者提供)

表 6 表明 ADASYN 辅助的逻辑回归优于该系列中的所有其他模型。请记住,这是一个简化的场景,没有考虑客户收入,因此经济方面的更多细节可能会导致转向不同的模式。

场景 4 贷款审批(贷款俱乐部)

因为它可能是反向转移的有害影响的来源,我们选择这个数据集来研究这些事件的影响。在本例中,我们选择的平均贷款批准额为 25,000 美元,违约成本为 6,250 美元。

TN =贷款被批准,贷款金额*计数被添加为正数

FN =贷款已批准,但贷款金额违约成本计数为负数

FP =贷款被拒绝,贷款金额*计数为负数

TP =贷款被拒绝,这节省了违约成本*计数为正数

表 7 贷款审批经济绩效分析(图片由作者提供)

表 7 表明 ADASYN 辅助的逻辑回归优于该系列中的所有其他模型。这个场景展示了反向转移是如何提高业绩的,因为有更多的真负值,并且在这个场景中,TN 象限有一个很大的正估值。尽管假阴性有所增加,但违约成本无法抵消贷款收益,但我们认为这种情况很少发生,因为 TN 象限通常不会有这么大的估值。

结论

我们的调查让我们对阶级不平衡和 ADASYN 的问题有了一些真正发人深省的见解。

当我们研究阶级不平衡对我们学*模型的影响时,不平衡测试数据中的假阴性比例表明随机森林和逻辑回归预测对阶级不平衡具有相同的敏感性。有趣的是,ADASYN 似乎对学*模型之间的结果有不同的影响,正如“蝴蝶”图显示的上侧和下侧。

当在两个模型上实现 ADASYN 时,数据显示随机森林通常具有稳定的预测,而不管使用的合成比率如何,而逻辑回归模型往往受各种比率的影响更大。这种现象超出了本研究的范围,但将在未来进行研究。

也许我们最有意义的发现是在不平衡模型上原子水平上的 ADASYN 辅助转换。ADASYN 创建的从 FN-TP 和 TN-FP 横向转移的概念在决定该算法是否应该用于平衡数据集时非常有利,并且还显示了 ADASYN 在应用于业务分析时的影响力。

我们已经证明了混乱矩阵的最终形成不是由于波函数的坍缩——我现在正在抚摸薛定谔的猫!虽然这是一种机械现象,但 TN-FP 和 FN-TP 转换的简单性和普遍性是非同寻常的。

我们现在可以通过一个更清晰的镜头来看待 ADASYN,从这个镜头中我们可以更好地分析我们的模型,并获得更有意义的结果。

未来研究

未来对类别不平衡的研究将进一步探索模型的敏感性,以发现具有抵抗性的模型。用不同的学*模型,如支持向量机和 boosted 树,以及不同的不平衡算法,如 SMOTE、KMeansSMOTE、BorderlineSMOTE 等,重复这个实验设计。可能会很有趣。此外,了解反向转移也提上了日程,尤其是两个具有极端效应的数据集。此外,我们将试图理解出现在比率图中的量化水平,以及它们是否与其他不平衡算法一起发展。

参考文献

Abu-Mostafa,Y. S .、Magdon-Ismail,m .、和 Lin,H.-T. (2012 年)。学*资料(第四卷)。美国纽约 AMLBook

奇科博士和朱尔曼博士(2020 年)。马修斯相关系数(MCC)在二分类评估中相对于 F1 分数和准确性的优势。 BMC 基因组学21 (1),6。https://doi.org/10.1186/s12864-019-6413-7

Shmueli,g .,Bruce,P. C .,Gedeck,p .,& Patel,N. R. (2019)。商业分析的数据挖掘:Python 中的概念、技术和应用。约翰·威利的儿子们。

何海辉,白,杨,贾亚东,李,等(2008 年 6 月)。ADASYN:用于不平衡学*的自适应合成采样方法。在 2008 年 IEEE 国际神经网络联合会议(IEEE 世界计算智能大会)(第 1322-1328 页)。IEEE。

联系方式:

dguggen@gmail.com 博士:领英简介:大卫·古根海姆博士

斯里什·蒂鲁马莱:领英简介,【stirumalai1@gmail.com】T2

因果推理的需要

原文:https://towardsdatascience.com/the-need-for-causal-inference-4c7c612dde91

因果推断

探究我们为什么要处理因果关系的简单原因

由米哈尔·姆罗泽克在 Unsplash 上拍摄

O 机器学*领域的后期趋势之一是因果推理因果关系的概念。简而言之,它应该回答如下问题:

一个特征(称为治疗)对另一个特征(称为反应或结果)的影响是什么?

因果推理绝不是一种新方法——人们知道它至少有 50 年了,而且在社会科学、经济学和政治学中使用已经很久了。在医学中,一个具体的问题可能是:

服用避孕药对患者的生存概率有什么影响?

在这里,治疗是二元的(给药丸?是/否),并且响应在 0 和 1(概率)之间是连续的。

对这个问题天真的看法

作为一个抽象而简单的例子,假设我们有一个数据集,它有一个特征 x 和一个目标 y 。我们想要检查 xy 的影响。

图片由作者提供。

为了做到这一点,让我们假设我们将线性模型 ŷ = 2 x + 1 拟合到数据,这具有相当好的性能。现在 xy 的作用是什么?嗯,因为线性模型的简单形式,我们可以这样描述效果:一个增加 1 的 x 增加 2 的 y 。下一个问题!

图片由作者提供。

但是别急,当我们引入更多的变量时,事情就变得有趣了。

许多功能,许多答案

我创建了一个小数据集来告诉你答案并不总是那么清楚。只需跟随 Python:

import pandas as pddata = pd.read_csv('https://raw.githubusercontent.com/Garve/datasets/5734e7783ed5c39b03348fe7484af19d9936ed9f/causal.csv'
)

在这里,我们已经加载了虚构的数据集。每行对应一个假想的人。每个人都有以下特征:

  • 责任感
  • 加班金额 ( 待遇)
  • 幸福,和
  • 收入 ( 回复)。

图片由作者提供。

我们现在想搞清楚加班如何影响收入,这应该是一个很简单的问题。让我们也使用线性回归,因为我们可以很容易地用一个单一的数字来描述加班对收入的影响——加班系数的斜率。所以,让我们抓住 scikit-learn 并尽我们所能做到最好。

我们现在将运行一个简单的线性回归,将加班作为输入特征,将收入作为目标。这感觉是试图回答问题时最直接的做法。

from sklearn.linear_model import LinearRegressionX = data[['Overtime']]
y = data['Income']print(LinearRegression().fit(X, y).coef_)# Output:
# [2.7987431]

酷,所以加班增加 1 就增加收入 2.8 左右吧?好吧,也许,让我们先检查一下模型是否捕捉到了数据。

from sklearn.model_selection import cross_val_scoreprint(cross_val_score(LinearRegression(), X, y).mean())# Output:
# 0.9566128136325356

一个 五重交叉验证均值 r (我写这篇文章时 scikit-learn 的标准方法)大约是 0.95 ,这非常合适,所以我们应该能够相信模型告诉我们的任何东西。

但是我们的口袋里有更多的功能,对吗?信息越多越好,所以让我们利用它们。我们现在将使用加班待遇以及额外的回归变量责任感**。**

X = data[['Overtime', 'Sense of duty']]
y = data['Income']print(LinearRegression().fit(X, y).coef_)# Output: 
# [1.99819195 0.98356566]

使用这两个特性,故事发生了很大的变化。现在,将加班增加 1 意味着收入仅增加约 2,而不是之前的 2.8!5 倍均值 r 也比之前略好,约为 0.976。

如果我们也使用最后一个特征——快乐

X = data[['Overtime', 'Sense of duty', 'Happiness']]
y = data['Income']print(LinearRegression().fit(X, y).coef_)# Output: 
# [2.92794148 0.52911897 0.46879848]

超时的斜率再次改变,这次大约为 2.9。此处 5 重均值 r 约为 0.987,为最高值。

那么,对于“加班如何影响收入”这个简单的问题,你的最终答案是什么是吗?

是真的斜率…

  1. …关于 2.8 ,因为只用加班作为预测器最直接的回答了问题?
  2. …关于 2.9 ,因为我们使用了所有可用的特性,并且 5 倍均值 r 在那里最高?
  3. …关于 2 ,因为…它是唯一的偶数质数?😅
  4. …完全不同的东西?

如果你明白这里的纠结,那么恭喜你,你知道因果推断是为了什么了!

解决争端

在这篇非常基础的介绍文章中,我无法向您展示如何系统地解决这个问题——这是另一篇文章的内容。如果你等不及,我也不会感到惊讶😉,看看这些由布雷迪·尼尔创建的关于因果推理的精彩讲座。

10/10 为他的视频系列和脚本,会再次观看!👍—罗伯特

让我给你一些关键词:它与因果图混杂器、碰撞器do-calculus 有关。我还能为你做的是给你一些这些东西是什么的直觉。

注: 以下解释真的只是一个大概的概述。不可能理解 为什么 这些事情都是真的,所以不要气馁。

因果图

数据集的因果图是一个图,在这里你可以读出哪些特征相互影响。因果推理中典型的——不幸的是极其困难的——问题是得到这个图表。由于我自己通过一些规则创建了数据集,我可以给你它的因果图:

图片由作者提供。

用语言来说:

  • 责任感影响加班收入
  • 加班影响收入幸福
  • 收入影响幸福

同样,获得这些类型的陈述(即因果图)是非常重要的。我们只是幸运,因为数据集是合成的,我知道生成过程。顺便说一下,是这样的:

import numpy as np
import pandas as pdnp.random.seed(0)duty = np.random.randn(1000) + 4
overtime = duty + 3.5 + 0.5*np.random.randn(1000)
income = duty + 2*overtime + 10 + 0.5*np.random.randn(1000)
happiness = income - 4*overtime + 6 + 0.5*np.random.randn(1000)data = pd.DataFrame({'Sense of duty': duty,'Overtime': overtime,'Happiness': happiness,'Income': income
})

在这里,我们可以看到哪些特征影响了哪些其他特征,此外,我们甚至可以从上面粗体标记的部分直接看到表示 2 是正确答案

再举一个例子,从线

overtime = duty + 3.5 + 0.5*np.random.randn(1000)

我们可以看到的责任感如何影响的加班、因此箭头从值班到加班。

混淆器和碰撞器

影响治疗和反应的特征称为混杂因素。在我们的例子中,责任感是我们唯一的混淆因素我们必须控制它,这基本上意味着我们必须将它包括在回归中。

另一方面,幸福不是混杂因素,而是 T2 对撞机。正如我们在这里看到的,在回归中包含碰撞器会导致问题。

微积分

使用所谓的 do-calculus,由 Judea Pearl 发明的,我们可以证明我刚刚抛给你的关于混杂器、对撞机等等的陈述。这个主题的标准资源是 Judea Pearl 的书为什么的书。

结论

在本文中,我们通过一个小例子看到,即使是像**“一个特性对另一个特性有什么影响?”**无法用幼稚的方式正确回答。我们必须付出更多的努力来解决与因果关系相关的问题,而这正是我们需要因果推理的原因。

因果推理是一个有趣的领域,也是非常重要的,因为它让你对真正的因果关系进行推理——这是你得出正确结论所需要的。否则,你最终会得到几个同样好的模型,告诉你一个特性对另一个特性的影响的完全不同的故事,就像我们所做的一样。

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

作为最后一点,如果你

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

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

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

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

有问题就在LinkedIn上写我!

知识图问答的新基准——QALD-9-Plus

原文:https://towardsdatascience.com/the-new-benchmark-for-question-answering-over-knowledge-graphs-qald-9-plus-da37b227c995

以及基准旨在解决的多语言问题

TLDR

对于不同的用户群(如语言、年龄),以同样有效的方式与 web 应用程序交互的能力是“可访问性”概念中最重要的因素之一。这包括知识图问答(KGQA)系统,它通过自然语言接口提供对来自语义网的数据和知识的访问。在研究 KGQA 系统的多语言可访问性时,我和我的同事们发现了一些最紧迫的问题。其中之一是 KGQA 缺乏多语言基准。

在本文中,我们改进了 KGQA 最受欢迎的基准之一— QALD-9 ,将原始数据集的问题翻译成 8 种不同的语言(德语、法语、俄语、乌克兰语、白俄罗斯语、亚美尼亚语、巴什基尔语、立陶宛语)。最重要的一个方面是,翻译是由相应语言的母语使用者提供和验证的。据我们所知,其中五种语言——亚美尼亚语、乌克兰语、立陶宛语、巴什基尔语和白俄罗斯语——以前从未被 KGQA 系统考虑过。两种语言(巴什基尔语和白俄罗斯语)被联合国教科文组织(T4)认定为“濒危语言”。我们将新的扩展数据集命名为“”QALD-9-plus。数据集在在线可用。

知识图问答

KGQA 系统将自然语言问题转换成对特定知识图的查询,从而允许用户访问“知识”而不必学*查询语言(例如 SPARQL )。这是 KGQA 系统和基于文本的 QA 系统(在文献中也称为 MRC、ODQA、基于 IR 的)之间的主要区别,基于非结构化数据工作。

基于知识图的问答系统--一个问题和一个查询的例子。右边是一些最著名的知识图表(图片由作者提供)。

知识图通常是基于资源描述框架(RDF) 创建的。RDF 中的数据被表示为“主-谓-宾”结构的三元组,例如,John-Is_Friend_Of-Mary,这就是为什么将它们可视化为图形是方便的。众所周知的 schema.org也是基于 RDF 的,被许多网站用来标记他们的内容(事实上,是为了改善搜索结果)。万维网的这种结构是前面提到的语义网的基础,在语义网中,所有的资源都是结构化的并相互链接。因此,KGQA 系统是我们在万维网上结构化信息和知识世界的向导。

知识图表的一个例子。来源:https://www.w3.org/TR/rdf11-primer/

基于知识图的问答系统中的多语言问题

看似自然的通过谷歌获取信息的能力,对于那些不是被数亿人(如德语、俄语)而是被数百万人(如白俄罗斯语)甚至更少人(如巴什基尔语)使用的语言的使用者来说,根本不是真的。通常,说“小语种”的人也能说主要语种。例如,说白俄罗斯语或巴什基尔语的人也会说俄语,这使得他们可以访问网络的第二大部分。但这并不适用于所有语言,和往常一样,一切都是相对的。说俄语的人只能理解 6.9%的万维网内容,而说英语的用户能理解 63.6%的内容。在这方面,引入了“数字语言鸿沟”这一术语。数字语言鸿沟这个术语是基于这样一个事实,即人们所说的语言会影响他们的网络使用体验和效率。

我们以英语、德语、白俄罗斯语和巴什基尔语为例,做了一个关于谷歌如何处理“大”和“小”语言的小实验。有人问了一个简单的问题:“唐纳德·特朗普多大了?”分别以每种语言。答案就像他们说的,杀了!在下图中,你可以看到谷歌如何成功地回答了用英语和德语提出的问题,以及它如何在白俄罗斯语和巴什基尔语中失败——这难道不是问题的指标吗?值得注意的是,当答案成功时,谷歌会以一种结构化的形式呈现出来,这就是发挥作用的谷歌知识图,这也借助了【schema.org】的标记。

谷歌用英语、德语、白俄罗斯语和巴什基尔语工作的插图(图片由作者提供)。

别人是怎么处理这个问题的?

有一种误解认为,随着无监督、弱监督和半监督方法(如 word2vec 或 BERT)的出现,多语言问题已经解决(因为不需要大量的标记数据)。然而,事实并非如此。虽然可以在不使用标记数据的情况下评估语言模型,但不可能评估更复杂的系统(例如 KGQA)。因此,拥有多种语言的结构化“黄金标准”数据(基准)仍然是一个紧迫的问题。

知识图上的问题回答仍然是应用科学的一个相当具体的领域,所以关于这个主题的论文发表的并不多。在写这篇文章的时候,KGQA 只有 3 个多语言基准。分别是 QALD 、 RuBQ 和 CWQ (见下图)。

现有的 KGQA 多语言基准测试(图片由作者提供)。

以上所有的数据集都不是完美的。例如 QALD-9,虽然它有 10 种语言,但翻译质量,说得好听点,还有待提高。RuBQ 2.0 和 CWQ 使用自动机器翻译来获得译文,这当然是有局限性的。

我们做了什么?QALD-9-Plus 数据集

为了改善 KGQA 系统多语言可访问性的情况,我们决定完全更新 QALD-9 数据集,仅保留英文问题,并在这项工作中涉及众包平台(亚马逊机械土耳其、 Yandex Toloka )。此外,来自开放数据科学社区的志愿者也参与了翻译过程。

翻译任务包括 2 个步骤:(1)一个母语者将英语翻译成他们的母语,以及(2)另一个母语者检查在先前步骤中获得的翻译选项。这两个步骤彼此独立地进行。

翻译和验证过程的一个例子。每个问题至少被翻译了 2 次(图片由作者提供)。

结果,我们获得了 8 种不同语言的译本:俄语、乌克兰语、立陶宛语、白俄罗斯语、巴什基尔语、亚美尼亚语、德语和法语。其中五种语言迄今为止从未出现在 KGQA 地区(乌克兰语、立陶宛语、白俄罗斯语、巴什基尔语、亚美尼亚语),两种语言(白俄罗斯语、巴什基尔语)被联合国教科文组织认定为濒危语言。

除了翻译,我们还提高了基准的可用性。最初的 QALD-9 允许我们仅基于 DBpedia 知识图来评估系统。在我们关于 QALD-9-Plus 的工作中,我们决定将基准转移到另一个知识图, Wikidata 。这被证明是一项相当困难的任务,因为不同知识图之间的自动 SPARQL 查询转换器还不存在,所以我们必须手动完成这项任务。令人惊讶的是,由于不同的数据模型,DBpedia 和 Wikidata 上的查询可以如此不同(参见下面的代码)。

QALD-9-Plus 基准测试的最终特征及其结构示例以表格和代码片段的形式呈现在下面。

QALD-9-Plus 基准测试及其特点(图片由作者提供)。

代替一个结论

如果你一路读到这里,我会非常高兴!在本文的最后,我想分享一些与这项工作相关的有用链接,即:

  • GitHub
  • ArXiv (同行评审,即将通过 IEEE 发布)
  • 普华永道:数据集,论文
  • 演示录制
  • 幻灯片
  • 谷歌 Colab

感谢

我要感谢这篇文章的合著者,即:Dennis Diefenbach 博士、Ricardo Usbeck 教授和 Andreas 博士。此外,我要感谢参与翻译数据集的所有贡献者,特别是:康斯坦丁·斯米尔诺夫、米哈伊尔·奥尔真诺夫斯基、安德烈·奥古尔佐夫、纳雷克·马洛扬、阿尔特姆·埃罗钦、米哈伊洛·内多代、阿利亚克塞·叶兹雷佐、安东·扎波洛斯基、阿图尔·佩什科夫、维塔利·利亚林、阿尔特姆·利亚利科夫、格莱布·斯基巴、弗拉季斯拉夫·多尔迪伊、波琳娜·福明尼克、蒂姆·施拉德、苏珊娜·博和安娜·施拉德。

数据治理的新面貌

原文:https://towardsdatascience.com/the-new-face-of-data-governance-44eee0a91e68

数据治理已死。我们可以这样复活它。

图片由 Castor 提供

本文是与蒙特卡洛的内容负责人 Molly Vorwerck 共同撰写的。

数据治理不一定是一件麻烦事。它只需要满足数据团队的需求:在分布式组织中。这就是我们长期以来的数据治理方法不适合现代数据堆栈的原因,以及一些最好的数据团队已经在做的事情。

数据治理是许多数据领导者的首要考虑,特别是考虑到 GDPR、CCPA、、新冠肺炎以及许多其他首字母缩略词,这些词表明在管理公司数据时,合规性和隐私越来越重要。

传统上,数据治理是指维护数据的可用性、可用性、来源和安全性的过程,正如一位数据领导者曾经告诉我们的那样,是“让您的 CFO 免于牢狱之灾的通行证”

尽管如此,Gartner 指出,2022 年,超过 80%的数据治理计划将会失败。

坦白说,我们并不惊讶。

虽然数据治理被广泛认为是健康数据战略的必备特性,但在实践中很难实现,特别是考虑到现代数据堆栈的需求。

数据治理(云计算之前)

我们将治理方式的转变归功于一个关键的催化剂:

在云数据仓库兴起之前(感谢雪花!),分析主要由孤立的团队处理。云架构和支持云架构的工具使得构建分析仪表盘和报告比以往任何时候都更便宜、更容易。突然间,营销部门的 Joan 和财务部门的 Robert 可以收集关于业务的*乎实时的见解,而不必每次向董事会提交报告时都 ping 数据科学团队。

数据实际上变得民主化了。算是吧。

虽然使数据变得更容易访问和使用的技术正以前所未有的速度创新,但确保数据易于发现和可靠的工具和流程(换句话说,数据治理)却不能满足我们的需求。

原因如下。

手动治理方法不再奏效。

虽然我们在自助服务分析、云计算和数据可视化等领域取得了巨大进步,但在治理方面我们还没有达到这一水平。许多公司继续通过手动的、过时的和特别的工具来实施数据治理。

数据团队花费数天时间手动审查报告,设置自定义规则,并逐一比较数字。随着数据源数量的增加和技术栈变得越来越复杂,这种方法既不可扩展也不高效。

虽然数据目录通常将自己标榜为数据治理的答案,但许多数据领导者发现,当涉及到手动需求时,他们的目录甚至缺乏最基本的方面。

在一些组织中,这些操作花费了大量时间来手动映射上游和下游依赖关系,更不用说保持这一点最新所需的维护工作了。

数据无处不在;数据治理不是。

对于许多公司来说,提高数据创新的速度是生存的关键。虽然数据基础设施和商业智能工具在过去几年中不断进步,以支持这一创新,但 DataOps 仍然落后于大多数 DataOps 解决方案,如数据质量警报和沿袭跟踪都是手动、一维且不可扩展的。

DataOps 和 solutions 能够迎头赶上的方法之一是借鉴软件工程的概念。我们在数据方面面临的很多问题,其实都是工程、安全等行业已经解决的问题。

随着公司迁移到更加分布式的架构(例如,数据网格),对无处不在的端到端治理的需求从未如此之大。

好消息是什么?我们不必接受现状。与软件工程团队依赖自动化、自我修复过程和自助工具的方式一样,数据团队也需要通过拥抱数据治理的新面貌来采取类似的方法。

以下是原因和方法。

事情已经改变了

自公元前时代以来,许多事情都发生了变化。在描绘数据治理的新面貌之前,理解带来更新需求的结构变化是关键。这一部分致力于探索新数据治理实践的催化剂。

新数据治理实践的催化剂。图片由 Castor 提供。

1 —公司正在吸收越来越多的数据

在过去的几十年里,存储和计算成本下降了数百万倍,带宽成本下降了数千倍。这导致了云的指数级增长,以及云数据仓库的到来,如亚马逊红移或谷歌 BigQuery。云数据仓库的独特之处在于,它们比传统数据仓库具有无限的可扩展性,能够容纳几乎任何数量的数据。

数据量预计将在 2025 年前进一步爆炸。图片由 Castor 提供。

这些发展使得各个领域的组织能够收集和存储大量的数据。与过去相比,现在的数据更加分散和分散,可以用大数据的“ Three Vs ”来描述:激增的数量、多样性和速度。

数据的本质已经发生了变化,这应该促使旨在管理这些数据的数据治理模型发生变化。

2-管道和生态系统变得日益复杂

简单的数据管道。图片由 Castor 提供。

复杂的数据管道。图片由 Castor 提供。

直到 15-20 年前,数据管道还是相当基础的,为业务分析的稳定需求服务。商业智能团队需要对他们的财务状况、库存水平、销售渠道和其他运营指标进行历史测量。数据工程师使用 ETL(提取、加载、转换)工具来转换特定用例的数据,并将其加载到数据仓库中。由此,数据分析师使用商业智能软件创建仪表板和报告。

数据管道现在使用复杂工具(仅举几个例子,Apache Spark、Kubernetes 和 Apache Airflow)的组合运行,随着互联部件数量的增加,管道故障的风险也在增加。工具的多样性是必要的,因为它允许数据团队在其数据堆栈的每一层选择最佳平台。但是所有这些引擎的组合使得实际上不可能看到管道的不同部分。

现代数据管道不仅复杂,而且还具有黑盒特性。你知道进去的是什么,出来的是什么,但你不知道中间发生了什么。只要出现想要的结果就好。但如果没有,那就非常令人沮丧。当数据集从管道中出来时,通常会留下奇怪的值、缺失的列、本应是数字的字段中的字母等等。结果,数据工程师花了几个小时绞尽脑汁想到底哪里出了问题,哪里出了问题,如何解决。Forrester 估计,数据团队在数据质量问题上花费了超过 40%的时间,而不是致力于为业务创造价值的活动。

传统的数据治理模型不适合这些高度复杂的系统,导致数据由于模糊和无法解释的原因而中断。我们需要转向一种新的模式,能够应对这种新的复杂性水平。

3 —数据受到更严格的审查(GDPR)

数据不仅数量更多,而且受到更多的监管和审查。尽管与数据隐私相关的第一批法规在 20 世纪 90 年代就已生效,但直到 21 世纪 10 年代,随着、HIPAA 等法规的出现,这些法规才成为一个全球性问题..这导致了数据治理工具的出现,帮助企业级组织遵守这些严格的要求。当时,只有企业级组织能够负担得起收集和存储数据所需的基础设施。因此,他们是唯一面临数据合规性问题的人。

但是正如我们在上面的章节中看到的,由于云存储,2010 年也标志着组织中数据量的指数级增长。这种廉价的存储替代方案允许初创企业和中小型企业收集和存储大量数据。问题是,GDPR、HIPAA 和其他法规没有给小企业留下豁免的余地,并要求各种规模的企业遵守法律,承担处理个人数据的责任。公司仍然需要遵守 GDPR,即使他们的员工少于 250 人。随着初创公司和中小型企业开始面临企业级问题,这给小型企业带来了数据治理的挑战。现有的数据治理工具对中小型企业来说是不可能的,因为它们的定价模型反映了它们的企业关注点(即它们非常昂贵)。

在过去的几十年中,收集和存储数据的成本大幅下降,现在是时候让管理这些数据的完整性和安全性的成本遵循同样的趋势了。新的数据治理模式需要考虑到,合规不仅仅是大公司的事情,每个人都必须认真对待。

4-每个人都在使用数据

只有少数专业人员使用数据,很容易控制对数据的访问并实施某种数据可追溯性。问题是,数据不是为一小群专家保留的——它现在被每个人使用。

如今,公司越来越多地参与到运营分析中,这是一种让“运营”团队可以访问数据的方法,用于运营用例(销售、营销、..).我们将其与仅将数据用于报告和商业智能的更经典的方法区分开来。运营分析不是使用数据来影响长期战略,而是为业务的日常运营提供战略。无代码 BI 等趋势通过授权运营团队操纵数据,使运营分析成为可能。

  1. 随着每个人都在使用数据并构建报告/仪表板/新数据集,组织很快就会发现不同部门之间的数字不匹配。
  2. 控制对数据的访问级别,以及确保数据被正确的人以正确的方式使用变得更加困难。这使得法规遵从性问题比以前更加糟糕。

因此,组织越来越多地将目标放在数据民主化上,确保每个人都可以在需要时访问他们需要的数据。尽管这带来了很多好处,但也产生了两个主要问题:

这种“数据无政府状态”导致传统的数据治理模型失败,促使人们需要新的、更具适应性的模型。

数据治理不再仅仅是合规性问题。它对业务有影响。图片由 Castor 提供。

5-数据治理推动业务成果

数据治理是对过去几十年中出现的严格数据监管的回应。过去人们认为这是一项无聊、无趣的任务,为了逃避巨额罚款,你必须完成这项任务。今天,情况不同了。数据治理不仅能让组织逃脱罚款,还能提高业务绩效。为什么

从短期来看,强大的数据治理计划可以确保数据的可追溯性和数据质量。它使数据用户更有效地查找和理解数据。它还引入了重用数据和数据过程的能力,从而减少了组织中的重复工作。一个更有生产力的数据团队可以最大化潜在数据的收入。

从长远来看,良好的数据治理增加了决策的一致性和信心。当所有部门的数字和仪表板一致时,比当它们走向相反方向时,更容易做出决定。数字之间的不一致导致信任侵蚀,使得数据收集方面的巨大投资基本无效。

概括一下这一部分,我们从一个少数人需要访问有限数量的不受监管的数据的世界,变成了一个每个人都需要访问大量高度监管的数据的世界。毫不奇怪,这两个世界应该以不同的方式治理。

数据治理的新面貌应该是什么样的?

数据治理的新面貌。图片由 Castor 提供。

鉴于数据本质、数据监管水平和数据民主化趋势的变化,可以肯定地说,传统、陈旧、乏味的数据治理已经寿终正寝。我们不能让它进入坟墓,因为我们今天比以往任何时候都更需要数据治理。因此,我们的工作是使它复活,并给它一个新的面貌。本节致力于理解现代数据治理模型的新面貌。

数据治理需要安全/合规

良好的数据治理计划应该确保完美的数据合规性。数据法规遵从性是指确保所有敏感数据以一种使组织能够满足法律和政府法规的方式进行管理和组织的做法。它涉及被视为个人信息的隐私,以及企业如何管理这些敏感数据。新的数据治理模型应该让您确信您的组织正在遵守法规。这应该是数据治理计划的基石,因为随着罚款变得越来越重要,监管在未来只会越来越严格。

数据治理需要是可访问的

数据治理应顺应运营分析和数据民主化的趋势,并确保任何人都可以在任何时候使用数据做出决策,而没有访问或理解的障碍。数据民主化意味着没有守门人在通往数据的路上制造瓶颈。

这一点值得一提,因为对数据治理的安全性和合规性的需求通常会导致程序在数据网关处制造瓶颈,因为 IT 团队通常负责授予对数据的访问权限。操作人员可能需要等待数小时才能访问数据集。到那时,他们已经放弃了他们的分析。拥有安全性和控制力非常重要,但不能以牺牲数据提供的灵活性为代价。

数据治理需要分布式

数据治理机制需要跨团队(或领域)具有普遍的互操作性。图片由 蒙特卡洛 提供。

传统的数据治理计划让组织通过数据管家或集中式 IT 团队来管理数据。考虑到数据量的变化,这种做事方式不再适用。事实上,单个部门几乎不可能跟踪整个组织的所有数据。因此,数据治理必须转向分布式模型。对于分布式,我们指的是在整个企业中委派数据管理职责的组织框架。这意味着数据管理的责任由组织中的数据用户分担。这很有效,由于**数据民主化、**数据用户的数量增加,这使得分担数据治理的负担变得更加容易。

分布式数据治理模型的目标是允许最接*数据的团队管理访问和权限,同时消除集中式 IT 目前存在的瓶颈。这个系统完成了很多工作,因为它允许数据治理既安全又符合标准,同时让所有人都可以访问数据。因此,我们需要找到一个框架或工具来协调数据用户的协作,以支持数据治理工作。当然,这并不容易。如果您对如何实现分布式数据管理感兴趣,请查看本文。

数据治理需要自动化

数据治理流程过去是手动进行的。然而,数据是活的,流程每小时都在变化。此外,组织管理的数据量使得手动跟踪数据资产几乎不可能。这意味着要手动维护数千个表的 10 多个字段的元数据。就目前的数据量而言,这意味着需要雇佣一个完整的团队来处理数据治理问题。出于这个原因,是时候转向编排数据治理的自动化方法了。自动化数据治理工具只需 10 分钟就可以在您的云数据仓库中完成设置(相比之下,非自动化工具需要 6 个月),并且最大限度地减少了必须手动维护的字段。

数据治理的新面貌有三个关键支柱:可观察性、发现和安全性。图片由蒙特卡洛提供。

我们如何到达那里?

认真对待治理的数据团队需要采用融入云的分布式、可扩展特性和现代数据团队的分布式特性的技术。为了实现这一点,我们需要跨治理的三个不同支柱重新构建我们的方法:可观察性、发现和安全性。

可观察性

团队经常临时处理数据质量,而不是制定一个整体的方法来解决不可靠或不准确的数据。与 DevOps 将可观察性应用于软件的方式非常相似,数据可观察性平台为数据团队提供了实时监控、预警、根本原因、修复甚至预防数据问题的能力。

数据可观察性是指组织完全了解其系统中数据的健康状况的能力,并通过确保您呈现的数据在其生命周期的所有阶段都值得信赖来补充数据发现。与 DevOps 类似,data observability 使用自动化监控、警报和分类来识别和评估数据质量和可发现性问题,从而实现更健康的渠道、更高效的团队和更满意的客户。一些最好的解决方案也会提供创建自定义规则和断路器的能力。

数据可观察性支柱。图片由蒙特卡洛提供

数据可观察性被分解成它自己的五个支柱:新鲜度、分布、容量、模式和沿袭。这些组件共同提供了对数据质量和可靠性的宝贵见解。

Freshness: Freshness 试图了解您的数据表有多新,以及您的表更新的频率。决策时,新鲜感尤为重要;毕竟,陈旧的数据基本上等同于浪费时间和金钱。

**分布:**分布,换句话说,是数据可能值的函数,告诉你数据是否在可接受的范围内。数据分布使您能够根据对数据的预期来判断表是否可信。

Volume: Volume 指的是您的数据表的完整性,并提供关于您的数据源的健康状况的见解。如果 2 亿行突然变成 500 万行,你应该知道。

**模式:**数据组织的变化,换句话说就是模式的变化,通常表示数据损坏。监控谁在何时对这些表进行了更改是了解数据生态系统健康状况的基础。

**血统:**当数据断裂时,第一个问题永远是“哪里?”数据谱系通过告诉您哪些上游来源和下游来源受到了影响,以及哪些团队正在生成数据和谁正在访问数据来提供答案。Good lineage 还收集关于数据的信息(也称为元数据),这些信息涉及与特定数据表相关联的治理、业务和技术指导原则,作为所有消费者的单一真实来源。

通过数据可观察性,您可以监控组织数据的来源、完整性和可用性的变化,从而形成更具协作性的团队和更快乐的利益相关者。

数据发现假设不同的数据所有者对其作为产品的数据负责,并促进不同位置的分布式数据之间的通信。一旦数据被提供给给定的域并被其转换,域数据所有者就可以利用这些数据来满足他们的运营或分析需求。

数据发现取代了对传统数据治理平台的需求,它基于一组特定消费者如何接收、存储、聚合和使用数据,提供对数据的特定领域的动态了解。治理标准和工具跨这些领域联合起来(允许更好的可访问性和互操作性),可以轻松地实时了解数据的当前(与理想状态相反)状态。

  • 什么数据集是最新的?哪些数据集可以弃用?
  • 这个表最后一次更新是什么时候?
  • 我的领域中给定字段的含义是什么?
  • 谁有权访问这些数据?最后一次使用这些数据是什么时候?被谁?
  • 这些数据的上游和下游依赖关系是什么?
  • 这是生产质量数据吗?
  • 哪些数据对我所在领域的业务需求至关重要?
  • 我对这些数据的假设是什么,这些假设得到了满足吗?

数据发现不仅可以回答数据的理想状态,还可以回答每个域中数据的当前状态:

虽然现代数据堆栈工具为处理数据提供了额外的功能,但它们也必须受到保护和适当的管理,以确保只有应该访问数据的人才能使用数据。

为了在更安全的基础上开始新的一年,我们建议数据工程团队与他们的安全和法律同行合作,进行跨组织的“数据审计”

根据优步前数据产品经理 Atul Gupte 的说法,任何数据领导者的首要工作都是审计你正在收集和存储的数据,以及谁有权访问这些数据(他们称之为“数据爆炸半径”)。

到 2022 年,大多数企业将依赖驻留在传统数据仓库系统中的企业级交易数据、事件流和其他数据平台功能的组合,包括您公司的运营战略。这两项要求都强调了对的需求,即一种强大且自动化的策略实施方法,该方法优先考虑 PII 识别和访问控制,以捕获数据的含义、位置、使用模式和所有者。

转身面对改变

归根结底,解决数据治理问题不仅仅是实施正确的技术。实现公平的数据访问和端到端信任也依赖于构建更好的流程。毕竟,如果数据本身找不到、不可信或不安全,那么数据堆栈中有什么也没用。

现在我们应该采用一种新文化,优先考虑数据治理新面貌的这三个方面,并在此过程中,让数据团队能够在整个企业中实现数据民主化和更好的决策。

数据治理不一定是一件麻烦事,它只需要满足数据团队的需求。

最初发表于【https://www.castordoc.com】

标记数据的新工具速度提高了 10 倍

原文:https://towardsdatascience.com/the-new-tool-to-label-data-10x-faster-d3c4f5e7b061

使用 Datature 的 Intellibrush 进行高级高效的数据标记

血细胞数据的智能画笔接口

历史上,计算机视觉任务严重依赖人类标注的数据。众所周知,只有在数据输入和标记也准确的情况下,机器学*才能产生准确的结果——无论计算机视觉模型多么花哨或先进,如果我们正在训练的数据集缺乏,都很难实现良好的性能。具体来说,计算机视觉需要大量数据。然而,手动标记是一个耗时且容易出错的过程,尤其是对于对象检测等计算机视觉任务。

智能画笔在水果图像中的应用。作者 Gif。

对象检测是计算机视觉中最重要的任务之一——它指的是使用边界框对对象进行检测和定位。对象检测通常涉及检测图像中的对象并将它们分类成不同的类别。这项任务对于安防、监控和汽车等许多应用非常重要。

智能画笔被用来识别草莓。图片作者。

有许多不同的对象检测方法。最常见的方法是使用一组训练图像。这是向计算机显示一系列带有物体的图像,然后计算机能够学*识别这些物体。另一种流行的方法是使用深度学*方法。这是给计算机一个大的图像数据集,然后能够学*识别其中的对象。任何对象检测系统最重要的特征是它能够准确地识别图像中的对象,这意味着模型需要能够区分不同的对象,即使它们是同一类型的(即不同的狗品种,即使所有图像都显示狗)。

斯坦福狗数据集上使用的数据标注工具的图像

标记图像数据的现有限制

手动数据标记有许多限制,使其成为低效的过程。首先,它是劳动密集型和耗时的,这可能导致高成本。跨数据集创建一致的标签也很困难。具体来说,手动标记的一个主要限制是它可能花费的时间。对于大型数据集,手动标注所有数据可能非常耗时,并且需要为对象检测等任务正确绘制多边形。

第二,它容易出错,因为人工注释者在手动标记数据时可能会出错。此外,准确标注数据可能会很困难,尤其是在存在大量类或者数据非常复杂的情况下。手动数据标记通常是不一致的,因为不同的注释者可能对相同的数据进行不同的标记。特别是如果标注器是外包的,额外的培训对于精确标注可能是必要的——一些数据集需要领域专业知识,特别是在医学和制造业领域。

最后,外包标签会变得非常昂贵和低效。手动数据标注的扩展性不好,因为可以手动标注的数据量是有限的,而且如果研究人员需要雇人进行手动标注,成本也会非常高。

使用 Intellibrush 检测和标记一个 Corgi

人工智能辅助标签的兴起

ost 人工智能辅助标记工具的工作原理是首先从图像中提取特征,然后使用这些特征来训练机器学*模型。一旦模型被训练,它可以被用来标记新的图像。

从图像中提取特征有许多不同的方法,但一些最常用的方法包括使用卷积神经网络(CNN)或转移学*。CNN 是一种人工神经网络,旨在模拟人脑处理信息的方式,而迁移学*是一种机器学*方法,将从一项任务中获得的知识应用于另一项类似的任务。

CNN 和迁移学*都可以用来训练用于图像标记的机器学*模型。然而,细胞神经网络往往比迁移学*更准确,因为它们是专门为图像处理设计的。

有许多不同的人工智能辅助标注工具可用,每个工具的准确性将根据其训练的数据集而有所不同。然而,所有的 AI 辅助标记工具都可以用来比人类更准确地标记图像。

数据标注平台。这是 Intellibrush 正确注释灰狗的图像。

模型辅助标记

模型辅助标记是计算机视觉领域中相对较新的技术,*年来发展迅速。对模型辅助标记方法越来越感兴趣的部分原因是,这种方法可以在相对较少的人工干预下为数据集提供高度准确的标记,从而有可能解决我们之前提到的挑战,即效率和准确性。

用于构造图像的智能画笔。作者 Gif。

如前所述,为计算机视觉目的注释数据集的传统方法通常是通过手动标记或外包。这一过程既耗时又昂贵,因为它需要熟练的工人仔细标记每一幅图像。尽管在计算机视觉和自然语言处理等领域有其他更有效的数据标记方法,如主动学*,但这些方法仍然非常需要数据。另一方面,模型辅助标注使用计算机模型来自动生成数据集的标签。模型辅助标记是一种计算机视觉方法,其中模型用于帮助识别图像中的对象。特别是,这种方法使用经过训练的人工智能模型来标记现有数据。

使用 MaskRCNN 初始 V2 进行对象检测的数据工作流示例

一种更受欢迎的模型辅助标记方法涉及在标记的数据集上训练一个大型神经网络——换句话说,通过使用深度学*来为新数据集生成高度准确的标签。深度学*模型并不是唯一可以用于模型辅助标记的模型类型。其他方法包括支持向量机和决策树。然而,深度学*模型通常被认为是性能最好的。

现在贴标只需手工贴标的一小部分时间和一小部分成本。模型辅助标记的广泛想法是,数据科学家将训练人工智能与标记并行——因此,当模型开始在数据中看到可概括的模式时,模型本身将为研究人员建议标签。这可以通过为图像中的对象提供标签来完成,或者通过提供一组可以用于训练机器学*模型的训练数据来完成。因此,我们看到,模型辅助标记不仅可以用于提高对象检测任务的准确性,还可以加速标记图像的过程。

图片由作者提供。

然而,值得注意的是,模型辅助标注的准确性取决于所用数据的质量——早期的模型由于缺乏注释数据而不是非常准确,但这些 CV 模型的性能*年来迅速改善。CV 模型的性能改进可归因于强大 GPU 可用性的增加、新神经网络架构的开发以及对注释数据的更广泛访问。

人工智能辅助标记

人工智能辅助标记在计算机视觉领域的兴起已经有一段时间了。随着深度学*的日益普及和可用数据量的不断增长,训练模型自动标记图像的能力变得越来越实用。这项技术有许多不同的应用,包括为训练数据集提供标签,帮助识别图像中的对象,甚至自动生成图像的描述。

人工智能辅助标签是一个为图像添加标签以帮助识别图像中的对象的过程——就像模型辅助标签一样,这可以由人手动完成,也可以由计算机自动完成。人工智能辅助标记的一个关键好处是,它可以帮助减少手动标记数据集所需的时间和资源。这对于大型数据集尤其有价值,因为手动标注会花费大量时间。此外,它还可以帮助提高标签的准确性,因为机器学*模型经常可以识别人类可能看不到的模式。

作者图片

有许多不同的方式可以将人工智能辅助标签用于计算机视觉。一种常见的方法是使用为类似任务设计的预训练模型。例如,有几种不同的图像分类模型可用于标记对象的图像。另一种方法是在特定数据集上从头开始训练模型。这可能更耗时,但通常可以提供更准确的结果,尤其是在给定特定于上下文的数据集的情况下。

与模型辅助标签相比,人工智能辅助标签不需要预先训练——特别是使用像 DEXTR 这样的模型,它通过在你想要标记的商品边缘放置标记来工作。

无论使用哪种方法,人工智能辅助标注的目标都是减少手动标注数据集所需的时间和资源。随着数据集相对大小的持续增长,以及对更精确注释的需求的增加,这种方法变得越来越重要。

IntelliBrush:使用支持人工智能的注释器

IntelliBrush 是 Datature 的人工智能引导的图像标记工具,使用户能够对复杂图像进行像素精确的注释。它易于使用、灵活,并且不需要对模型进行任何预先训练。作为一个刚刚开始涉足 CV 领域的人,我非常喜欢使用 IntelliBrush 来帮助我进行图像标记和对象检测。

IntelliBrush Nexus 平台,允许用户定义标签和对象

首先,在这里注册你自己的数据账户,然后你也可以开始使用智能刷。上传数据集和任何已经注释的标签后,选择右边面板上的 IntelliBrush 工具或按键盘上的T

作者图片

您还可以根据使用 Intelli-Settings 标记的图像类型,指定所需的粒度级别。两种常见的设置是AdaptiveFull-Image。如果您的图像在一帧中有多个感兴趣的对象,前者更适合,而如果您的图像有 1-2 个主要感兴趣的对象,则推荐后者(这是我更常用的方法)。

TLDR;为什么公司应该利用支持人工智能的注释器

目标检测是计算机视觉中的一项重要任务,并被用于多种应用中。重要的是选择合适的方法用于对象检测,并使用高质量的训练数据。目标检测系统还需要能够实时运行。

手动标记和外包标记可能不是当前标记数据的最佳方式,原因有几个。手动贴标既耗时又繁琐。此外,扩展这种贴标过程是困难的,并且通常与高成本相关,或者需要专业知识。因为手动贴标依赖于人工干预和专业知识,它也经常受到人为错误和不一致的影响。

作者图片

有许多不同的因素会影响物体检测系统的精度。最重要的因素是训练数据的质量。如果训练数据质量差,那么系统将不能学*准确地识别图像中的对象。另一个重要因素是用于对象检测的算法。有许多不同的算法可以使用,每种算法都有自己的优点和缺点。选择一个非常适合手头任务的算法是很重要的。最后,目标检测系统需要能够实时运行。这意味着它需要能够非常快速地处理图像,并准确地识别其中的对象。

用于构造图像的智能画笔。图片作者。

IntelliBrush 解决了这些挑战,只需几次点击即可创建像素级的数据标签,高效、准确且使用直观。Datature 的 IntelliBrush 平台有几个主要优点,让我觉得非常好用:

  1. 它开箱即用。我不需要做太多的设置,也没有太多的平台需要我在网站上添加我的个人信息。令人惊讶的是,也不需要任何编码——通常,我在我的 CV 项目中使用了很多代码,所以能够使用一个平台来获得同样高效和准确的结果,而且事半功倍,这令人耳目一新。
  2. 响应注释。我喜欢 IntelliBrush 的一个特性是,用户界面允许我在同一个窗口中平移、缩放,甚至隐藏不需要的类——对于传统代码来说,这些事情自然会更具挑战性。
  3. 快速直观。不像其他平台,我在使用之前必须花很多时间学*,IntelliBrush 允许我通过几次点击来选择和取消选择课程——不需要严格的培训。
  4. 可调和可配置。在标记图像时,我还能够指定不同的粒度级别——无论这些图像是柯基犬图像、食物图像还是任何其他数据集。,
  5. 适应性学*。使用 IntelliBrush 越多,它就越智能,越精确。
  6. 多对象标记。如上面的一些例子所示,我能够准确有效地在一幅图像中标记多个对象。
  7. 标签过滤。通过过滤我感兴趣的标签来清理注释也是非常容易的——这允许我只在特定的类、标签或标签上训练我的神经网络。

作者 Gif

开始使用 IntelliBrush 并在这里注册自己的账户。

在这里购买我的书,请务必通过电子邮件向本文报告任何错误或建议。

通过LinkedInTwitter与我联系。

跟我上

参考资料:

  • https://hacker noon . com/top-20-image-datasets-for-machine-learning-and-computer-vision-rq3 w3 zxo
  • http://vision.stanford.edu/aditya86/ImageNetDogs/
  • https://data gen . tech/guides/image-annotation/image-labeling/
  • https://www . IBM . com/ph-en/topics/computer-vision #:~:text = Resources-,什么是%20computer%20vision%3F,推荐% 20 based % 20 on % 20 that % 20 information。
  • https://docs.labelbox.com/docs/model-assisted-labeling
  • https://docs . data ture . io/nexus/annotations/annotating-images
  • https://www . danrose . ai/blog/model-assisted-labeling-for-good or-words
  • https://www . superb-ai . com/blog/a-primer-on-data-labeling-approximates-to-building-real-world-machine-learning-applications
  • https://courses . cs . Washington . edu/courses/csep 576/20sp/lectures/8 _ object _ detection . pdf
  • https://www . ka ggle . com/datasets/paultimothymooney/blood-cells
  • https://cvlsegmentation.github.io/dextr/
  • 注意:对于这个演示,我们使用了血细胞图像数据集,可以在 Kaggle 上免费获得。该数据集包含 12,500 个血细胞的增强图像,并附有用于注释的细胞类型标签。

新版本的 GPT-3 要好得多

原文:https://towardsdatascience.com/the-new-version-of-gpt-3-is-much-much-better-53ac95f21cfb

但是在人工智能联盟和人工智能伦理方面还有很多工作要做

在快门架上阿格桑德罗拍摄的照片

毫无疑问,GPT 3 号是语言生成任务的大师。从写诗和歌到模仿人造散文,再到编码。不少初创公司已经在这种模式的基础上开发了产品——有些发现取得了令人印象深刻的 成功。然而,撇开 GPT-3 的倾向,从事有毒和有偏见的行为,并产生错误的信息,如果提示这样做,用户可能会同意 GPT-3 的局限性主要与提示工程。

GPT 三号是个多面手。它适用于各种各样的语言任务,但并不适用于任何特定的任务。快速工程是绕过这个问题的最简单的方法:用户可以通过调节来提高 GPT-3 的能力。例如,如果我想让它写一个关于月亮和星星的故事,我可以输入三个完整的例子和第四个例子的第一句话。然后,模型会明白无误地得到我想让它继续第四个故事。

这种方法可行,但相当费力。不熟悉该模型内部运作的用户将很难让它充分发挥作用。尽管付出了努力,GPT-3 的最佳性能仍然遥不可及。

OpenAI 现在已经解决了这个缺点。他们引入了 GPT 家族的一个新版本,他们将其命名为instruct GPT——他们这样称呼它,但在“获得压倒性的正面反馈后,他们决定删除“指令”描述符,并将这些模型设置为 API 中的默认模型(他们建议对所有语言任务使用这个版本,而不是最初的 GPT-3。在 API 中,175B InstructGPT 模型被命名为 text-davinci-001

这个版本的 GPT-3(为了清楚起见,我在本文中将其称为 InstructGPT)被优化为遵循指令,而不是预测最可能的单词。这种变化在很大程度上消除了编写好的提示来从模型中提取所有功能的必要性。这不仅使它们对大多数人来说更容易使用——你不再需要学*(那么多)即时工程——而且使模型更可靠和功能更强。完成的质量几乎不像最初的 GPT-3 模型那样依赖于提示,这防止了模型犯太多人为错误。

我们可以使用“指令”框架更精确地定义 GPT-3 和 InstructGPT 之间的差异。从这个角度来看,我们可以说,GPT-3 只有在遵循间接或隐含的指示时才能很好地工作。在月亮和星星的例子中,四层楼的提示让 GPT-3 间接地“理解”了我的指令。我从来没有直接告诉 GPT-3 做什么,只是含蓄地告诉他们。相比之下,InstructGPT 可以遵循以下形式的明确指示:“写一个关于月亮和星星的小故事。”

写一个关于月亮和星星的小故事:

很久很久以前,月亮和星星住在一起。他们是最好的朋友,他们喜欢一起度过时光。晚上月亮会照亮天空,星星会闪烁发光。他们总是很快乐,从不吵架。

但是有一天,月亮和星星开始分开。月亮开始感到被冷落,星星也开始忽视她。月亮不明白发生了什么,她感到非常孤独。

一天晚上,月亮决定在天空中散步。她经过了所有其他的行星和恒星,但是它们都忽略了她。月亮哭了起来,她感到前所未有的孤独。

突然,月亮听到了一个声音。那是太阳。他一直在远处看着月亮,他看到她是多么悲伤。太阳告诉月亮,他爱她,他会永远陪在她身边。月亮听了非常高兴,她感觉好多了。

月亮和太阳回到了天空,他们终于能够再次快乐起来。

我是在操场上原样输入提示句“写一个关于月亮和星星的小故事”得到上面这个故事的。如果你在 GPT 3 号上尝试,结果是可怕的:

**写一个关于月亮和星星的小故事:**月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?月亮喜欢星星吗?

明确的指示,对我们来说是一种简单明了的交流方式,但对 GPT 协议 3 不起作用。

然而,OpenAI 并没有就此止步。InstructGPT 不仅在遵循指令方面比 GPT-3 好得多,它也更符合人类的意图。AI 对齐问题是本领域众所周知的问题。它定义了设计人工智能系统的难度,这些系统理解我们的价值观、信仰和欲望,并以不会干扰它们的方式行事——即使我们在定义我们想要什么的方式上犯了错误。

如何制造在那个方向学*的人工智能模型是一个很大程度上尚未解决的问题。OpenAI 的首席执行官 Sam Altman 说 InstructGPT 是朝着这个方向迈出的最新一步,并在这条推特中承认了它的成功:

然而,并不是每个人都同意“对齐”部分。一些人——包括像 Timnit Gebru 和 Mark Riedl 这样的主题专家——提到这不是一份结盟文件,就像 Altman 声称的那样。他们批评使用人类反馈进行监督训练不是真正的校准。一位人工智能研究人员评论道“所谓的‘人工智能控制问题’是如此难以定义,以至于你可以说任何事情都是‘对齐’。”稍后我会解释为什么这是一个有效的批评。

抛开这一点,就性能而言,结果是令人印象深刻的,所以让我们看看 InstructGPT 是什么,它有什么能力。

instruct GPT 型号的主要特点

从 GPT-3 到指令 GPT

为了将 GPT-3 模型转化为指令 GPT 模型,OpenAI 设计了一个三步程序。(当我以复数形式提到 InstructGPT 时,我指的是 1.3B、6B 和 175B 型号。)

将 GPT-3 转化为指令 GPT 的三步法—所有数字均来自公开论文

在给定任务中专门化 GPT-3 的第一步是微调模型。为了做到这一点,他们定义了一个数据集,该数据集包括指令遵循数据形式的提示和完成(演示数据集,13K 提示)。在这个数据集上训练 GPT-3 之后,他们得到了一个新的模型,他们称之为 SFT(监督微调),作为比较原始 GPT-3 和完成的 InstructGPT 的基线。这个模型在遵循指令方面已经比 GPT-3 更好,但不一定符合人类的偏好。

为了让模型与人类的意图保持一致,他们在接下来的两步中应用了他们与 DeepMind 共同开发的名为 RLHF (具有人类反馈的强化学*)的强化学*范式。

第二步是建立奖励模型(RM)。他们使用 33K 个提示的比较数据集(不是他们用来训练 SFT 的那个)微调了 GPT-3 模型,将其转换为 rm。比较数据集由成对的提示组成,每个提示有几个完成(每个 4-9),由人工标注者从最好到最差排列。这个想法是让 RM 知道当给出提示时,人类更喜欢哪种完成方式。

在最后一步中,他们采用了一个 SFT 模型(已经用演示数据集进行了微调),并使用强化学*对其进行了进一步微调。最后一个模型,我在本文中称为 InstructGPT,在本文中也称为 PPO-PTX(PTX 的意思是pre-ttraining mix,因为最后的微调步骤也使用来自 GPT-3 预训练数据集的数据),因为它使用了*似策略优化算法(PPO)。PPO 算法使用 RM 作为奖励函数(这就是他们如何从人类反馈中训练 InstructGPT)。

最后一步的微调过程如下:当 InstructGPT 显示一个提示符时,它输出一个完成。结果被发送到 RM,由 RM 计算奖励。奖励给予 InstructGPT 模型,以更新策略并更接*人类希望看到的输出。

总之,GPT-3 首先根据指令进行微调,然后根据人类的反馈进一步微调,以符合人类的偏好。简而言之,那就是指令。

目标的改变

但是为什么 OpenAI 将 GPT-3 修改成一个更“一致”的模型呢?主要原因是“预测下一个令牌”不如“安全而有益地遵循用户的指示”有用和可靠。OpenAI 的研究团队意识到 GPT 3 号有一个不明确的目标,并希望重新努力创造一个更加真实和无害的模型。

然而,从数学上定义新目标并不容易。GPT-3 的目标很简单:“从你得到的数据中获取最可能的单词”就是应用众所周知的 ML 和统计技术。然而,如何定义“对人类有益无害?”OpenAI 决定创建一个目标,它可以包含明确的意图(按照说明),也可以包含隐含的意图,正如Amanda askel 和其他人所定义的那样:他们希望模型是有帮助的、诚实的、无害的(在结果部分有更多关于这一点的内容)。

然而,当我们试图确定新的定义时,我们遇到了新的困难。语言模型语境下的诚实是什么?诚实可以被定义为表达的行为与内在信念相关联的程度,这在作为语言模型的“黑盒”中是不透明的。甚至定义什么是有害的有时也是复杂的。最终,这取决于模型的具体实际应用。部署通用语言生成模型和毒性检测模型是不同的。

为了克服这些模糊性,他们指示贴标机在培训中优先考虑对用户的帮助——即使用户明确想要一个潜在有害的反应——并在评估中优先考虑真实和无害,这是他们希望在生产中优化的。

排列的多样性

在人工智能伦理专家对使用“对齐”一词的批评之后,我必须澄清,OpenAI 的目标不是让模型与每个人对齐。一位用户在推特上提到这件事:“整个问题…是当人们不同意——尤其是当被边缘化的少数人不同意大多数人的意见时。”

在一般意义上,InstructGPT 模型比 GPT-3 模型更接*人类,但在人类这个术语中有巨大的多样性,这并没有反映在 InstructGPT 的行为中。该模型与贴标签机(由 Upwork 和 Scale AI 承包,用于对输出进行分类)和 OpenAI 研究人员的偏好相一致——因此与整个组织相一致,但世界其他地方呢?该公司在讨论部分承认了这个问题:“我们并没有声称研究人员、我们雇佣的贴标机或我们的 API 客户是偏好的正确来源。”然而,奥特曼在他的推特上说,他们已经发布了“迄今为止世界上最好的比对论文”这可能是真的,但它仍然具有误导性。

为了减少比对中的偏差,OpenAI 定义了一套选择贴标机的标准。关键的标准是贴标机必须“对不同人群的偏好敏感”(出于法律原因,他们不能根据人口统计标准雇用他们。)

这群贴标签的人(大多来自美国或东南亚,说英语)反映了我们社会的多样性,这是极不可能的。更重要的是,使用平均值作为标准来定义一致性正好与真正的一致性相反——这意味着该模型通过个人和群体偏好与其他人和群体的差异来准确理解个人和群体偏好。平均排列可能会模糊少数群体的偏好,因为多数群体在模型的最终决策中会有更大的权重。

不可否认的是,创建一个与子人群一致的模型是朝着更安全、更可靠的模型迈出的一大步。但是在研究人工智能对齐时,我们不应该忘记人类是极其多样化的。我们如何才能确保一个人工智能模型与它接触的每个人都保持某种无害的程度?正如 OpenAI 所建议的,唯一明智的起点是至少有一个代表每个群体的标签,或者为每个群体量身定制的模型。

但随之而来的是其他问题:我们如何定义群体?基于种族,性别,年龄,国家,宗教…?我们如何确保适合特定群体的特定模式不会最终影响到更广泛的社会?这些是没有答案的问题,在我看来,在以对齐的名义部署有偏见的模型之前,应该彻底考虑这些问题。

结果以及与 GPT-3 的比较

结果分为三个部分。首先,在从 API 收集的提示中比较模型的性能。然后,在公共 NLP 数据集上对它们进行测试。最后,研究人员给出了无法用数学表达的定性考虑。

API 提示分布评估

"与 GPT-3 的输出相比,贴标机明显更喜欢 InstructGPT 的输出."这是性能方面的主要结果,也证明了 InstructGPT 应该成为 API 和运动场中的默认模型(在得到客户的积极反馈后更是如此)。

图 1 显示,与其他模型(GPT-3、GPT-3 提示和 SFT 基线)相比,贴标机更喜欢 InstructGPT 模型变体(PPO-ptx 和 PPO)的输出。这适用于各种尺寸:令人惊讶的是,1.3B 的 InstructGPT 模型比 175B 的 GPT-3 模型更好。

在 175B 参数(最广泛使用的达芬奇模型)中,InstrucGPT 模型在 85%的情况下优于 GPT-3,在 71%的情况下优于 GPT-3 promped。这意味着几乎四分之三的情况下,贴标签机更喜欢 InstructGPT,而不是 GPT-3,后者已经被调整为可以很好地完成手头的任务。即使是即时工程也不足以击败 InstructGPT。

图 API 提示分布的人类偏好评估。GPT 和 GPT(提示)是最初的 GPT-3 模型。SFT 是在演示数据集上微调的 GPT-3(用作比较的基线)。PPO-ptx 是 InstructGPT 模型(PPO 模型类似于 PPO-ptx,但仅针对新数据进行了微调,并降低了公共 NLP 数据集的性能)。

所有的模型都根据为 InstructGPT 和 GPT-3 量身定制的提示进行了测试,以进行公平的比较。在这两种情况下,来自 InstructGPT 的补全通常是标注者的首选,如下面的图 2 所示。此外,InstructGPT 模型可以推广到未包含在训练集中的贴标者的偏好(尽管这不一定意味着它们可以充分推广到其他人群或人们倾向于不同意的提示)。

图 2:GPT-3 和 InstructGPT 与 SFT 175B 在提交给 GPT-3 和 InstructGPT 模型的 API 提示上的比较(为了进行公平的比较),由培训和延期贴标机进行评估。

InstructGPT 模型在遵循指令方面,特别是在遵循明确的约束方面(例如,“用两句或更少的话写出答案”)优于 GPT-3 模型),并且少产生幻觉(不要经常编造信息)。

图 API 分布的元数据结果。

对公共 NLP 数据集的评估:诚实、毒性、偏见等等

为了评估这些模型有多“诚实”,他们决定对照 TruthfulQA 测试它们,TruthfulQA 是一个衡量“模型如何模仿人类错误”的基准。他们发现 InstructGPT 给出的真实答案是 GPT-3 的两倍(图 4)。他们还在封闭领域的问答和总结任务中测试了这些模型,发现 InstructGPT 有一半的时间产生 GPT-3 的幻觉(21%比 41%)。这些是默认结果:模型不必被指示真实地表现,这消除了用户确保模型被充分提示的负担。

图 4:对 TruthfulQA 的评估。灰色的真实。颜色的真实性和信息量。一般来说,最符合人类偏好的 PPO 模型得到最好的结果。

为了评估模型毒性,他们根据 RealToxicityPrompts 数据集测试了模型(图 5 和图 6)。他们发现了一个非常有趣的结果:与 GPT-3 相比,InstructGPT 在被指示尊重时毒性较小,在未被指示时毒性相同,而在被指示有偏见时毒性更大。这意味着,一方面,那些想要避免中毒的人使用 InstructGPT 可以更好地做到这一点,但是,另一方面,那些心怀不轨的人会发现使用 InstructGPT 更容易造成伤害。

新模型本质上并不比 GPT-3 更安全,但更能遵循用户的意图——这并不总是为了改善人们的生活。增加模型的容量是性能方面的进步,但不一定是安全方面的进步。来自论文:“让语言模型更好地遵循用户意图也使它们更容易被误用。使用这些模型可能更容易产生令人信服的错误信息,或者仇恨或辱骂的内容。”

图 5:对 RealToxicityPrompts 数据集的评估。与 GPT-3 相比,当被提示要尊重时,InstructGPT 的毒性较小,但当不被提示时,毒性相当。

图 6:对 RealToxicityPrompts 数据集的评估。与 GPT-3 相比,当被指示要尊重时,毒性较小,但当被指示要有偏见时,毒性就大得多。

他们还使用 Winogender 和 CrowS-Pairs 数据集评估了模型偏差(图 7)。他们的结论是“我们的模型比 GPT-3 的偏差更小”,但事实是,从图表中可以清楚地看出,InstructGPT 通常比 GPT-3 的偏差更大(而且不仅仅是“不小”)。他们后来澄清说,“看起来被指导的模型更确定他们的输出,不管他们的输出是否表现出刻板行为。”这加强了 InstructGPT 模型比 GPT-3 模型更强大的想法,如果有什么不同的话,那就是它们更不安全,潜在危害更大。

图 7:对 Winogender 和 CrowS-Pairs 的评估。InstructGPT 模型通常比 GPT-3 更有偏差,除了 PPO-ptx 模型在无提示条件下(更多的熵意味着更少的偏差)。

这些结果也暗示了上面的思考,即把 InstructGPT 对准一个高度特定的人群并不能改善它对少数民族和受歧视人群的行为。我猜想,如果贴标者明显更加多样化(在性别、种族、国籍、文化等方面)。),这些结果会非常不同。

尽管如此,即使 OpenAI 试图重新排列模型以满足这一标准,如果模型没有改善那么多,我也不会感到惊讶。原因是 GPT-3 的预训练数据充满了偏差。使用人类反馈来微调模型,并通过部分调整来强化一些行为,只能做到这一步。最好的解决方案是有一个高度多样化的团队,从一开始就对模型提供的数据进行强有力的筛选。

最后一个定量结果是,研究人员发现,经过微调以优化与人类贴标机对齐的模型在性能方面遭受了“对齐税”。这意味着 InstructGPT 在一些公共 NLP 数据集上的表现比 GPT-3 更差。为了弥补性能的下降,他们重新定义了微调程序,并创建了 PPO-ptx 模型(如图所示)。该模型通过强化学*进行微调,将奖励模型的梯度与用于预训练 GPT-3 的原始数据的更新相结合。这使得 PPO-ptx (InstructGPT)在 NLP 基准测试中更有能力,但不如它的兄弟 PPO 一致。

定性结果

InstructGPT 模型可以概括为遵循 RLHF 微调分布之外的指令。特别是,他们可以遵循非英语提示和代码中的指示。论文中写道:“这表明,在某些情况下,对齐方法可以推广到在人类没有直接监督的输入上产生期望的行为。”然而,InstructGPT 是否可靠地做到了这一点还不得而知,因为研究人员没有定量地跟踪这一行为。

最后,InstructGPT 还是会出错。它可能无法遵循说明,可能产生幻觉,可能产生有毒和有偏见的输出,可能对简短的问题给出冗长的答案……GPT-3 模型存在的相同问题在 InstructGPT 版本中仍然存在(与性能相关的问题不太常见,但与安全、毒性和偏见相关的问题可能更常见)。

这里有一个 InstructGPT 没有意识到这个问题是荒谬的例子:

结论

好人

InstructGPT 在性能方面优于 GPT-3。不一定是在 NLP 基准方面(其中 GPT-3 经常超过 InstructGPT),但它更好地适应了人类的偏好,这最终是对现实世界性能的更好预测。原因是 InstructGPT 通过强化学*范式更符合人类的意图,使其从人类的反馈中学*。

因为 InstructGPT 可以遵循显式指令,所以不需要使用隐式或间接的提示技术与它通信。你可以简单地问模型你想从它那里得到什么,它会知道写什么。这减轻了可能不熟悉生成语言模型工作方式的用户的负担。这是使这些模型民主化的一种间接方式(尽管其他障碍如高成本和在一些国家不可用仍然存在)。

InstructGPT 在遵循隐含指令方面也优于 GPT-3,这使得它更真实、更有帮助、更无害——只要用户愿意。当被提示尊重时,它的毒性也比 GPT-3 低。这些特性使它对善意的人来说更具功能性,这将能够从模型中提取最大的潜力,而不用担心可能出现的不可控错误。

该论文在解决人工智能比对问题上向前迈进了一步。这无论如何都不是决定性的——有些人甚至质疑这是否是一篇关于对齐的论文——但在我看来,他们已经表明,根据人类反馈进行的微调使这些模型更接*人类。我们最终可能能够自然地与它们交流,它们也会适应我们的喜好。

坏事

在遵循指令方面比 GPT-3 更好也有不好的一面。恶意用户可能会利用这一点来降低模型的真实性和有用性,并且更加有害。鉴于该型号也比 GPT-3 更强大,损害可能会更高。

出于同样的原因,如果被提示有偏见,InstructGPT 的毒性可能更大——当被提示有偏见时,毒性的增量高于当被提示有礼貌时的减量。这些模型通常也比 GPT-3 更有偏差。一种可能的解释是,InstructGPT 更确定自己的答案,而不管它是否像作者建议的那样参与了刻板印象。另一个原因可能是,将模型与特定人群对齐会将它与其他人群错误对齐,这反映在基准评估中。

最后,一些人批评 OpenAI 将这项研究定义为“校准”论文,认为人在回路中的微调不是校准。另一个,在我看来,更强烈的批评是,将模型与雇佣的贴标机、OpenAI 研究人员和 OpenAI 用户对齐,不是真正的对齐(尽管这是真正重要的第一步)。训练模型来管理群体偏好不同的情况(而不是找到共同点)才是真正具有挑战性的——特别是在受歧视的少数群体处于危险之中的情况下,这些少数群体总是这些模型的目标。

如果你喜欢这篇文章,可以考虑订阅我的免费周报 【明天的想法】 !每周都有关于人工智能和技术的新闻、研究和见解!

您也可以直接支持我的工作,使用我的推荐链接 这里 成为中级会员,获得无限权限!:)

用于即时验证 ML 模型的最新包— Deepchecks

原文:https://towardsdatascience.com/the-newest-package-for-instantly-evaluating-ml-models-deepchecks-d478e1c20d04

Deepchecks 是一个 ML 套件,用于验证 Scikitlearn 模型的性能。它与内置的 Scikitlearn 解决方案相比如何?

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

ML 模型的模型验证,尤其是在生产环境中的模型验证,一直是并且很可能将继续是机器学*研究中最困难的子课题之一。毫不奇怪,有许多初创公司、研究人员和大型科技公司投入资源来完善这个持续存在的问题。

其中一家公司 Deepchecks 刚刚开源了他们的机器学*验证工具。该工具使用简单,可以在任何 Scikitlearn 模型上工作。

这听起来很棒,但是 Scikitlearn 提供了大量用于模型验证的内置工具。值得转行吗?

为了测试这个套件,我设置了一个相当简单的玩具问题。给定下面的数据帧模式和 550 个样本,我想预测列被浪费了

Index: CustomerID
LoanPayoffPeriodInMonths           object
LoanReason                         object
RequestedAmount                     int64
InterestRate                       object
Co-Applicant                       object
YearsAtCurrentEmployer             object
YearsInCurrentResidence             int64
Age                                 int64
RentOrOwnHome                      object
TypeOfCurrentEmployment            object
NumberOfDependantsIncludingSelf     int64
CheckingAccountBalance             object
DebtsPaid                          object
SavingsAccountBalance              object
CurrentOpenLoanApplications         int64
WasTheLoanApproved                 object

然后,我设置了一个故意不完美的随机森林分类器来解决这个问题,使用一些简单的参数调整,比如最小成本复杂性修剪,以及 80/20 的训练/测试分割。这个模型是故意不优化的,以评估发现常见问题的容易程度。

X = df[df.columns.values[:-1]]
Y = df["WasTheLoanApproved"]
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
clf=RandomForestClassifier(n_estimators=100, ccp_alpha=0.008)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)
y_pred_train=clf.predict(X_train)

scikit 学*简单验证

现在我已经训练好了我的简单模型,我可以使用 Scikitlearn 提供的一些简单的验证技术来识别我的模型的性能。我将查看我的训练与测试准确性、我的精确度、回忆和 F1 分数,以及我的特征重要性。下面是这样做所需的代码行:

#Let us look at train and test accuracy
print("Accuracy Train:",metrics.accuracy_score(y_train, y_pred_train))
print("Accuracy Test:",metrics.accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
#and feature importance
feature_imp = pd.Series(clf.feature_importances_,index=df_num.columns.values[:-1]).sort_values(ascending=False)
#A chart
sns.barplot(x=feature_imp, y=feature_imp.index)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Feature Importance")
plt.legend()
plt.show()

不错,在 10 行代码中,我能够得到以下结果:(如果你需要复*下面的分数,我推荐这篇中等文章,或者如果你想要完整的课程,我推荐数据科学道场)

Accuracy Train: 0.7985436893203883
Accuracy Test: 0.7184466019417476precision    recall  f1-score   support0       0.50      0.31      0.38        291       0.76      0.88      0.82        74accuracy                           0.72       103macro avg       0.63      0.59      0.60       103
weighted avg       0.69      0.72      0.70       103

作者图片

我认为解释这些结果非常容易——由于召回率低,0 的 F1 分数非常低,这意味着在这个数据集中,它将许多 0 错误地标记为 1。支持还表明数据集中 1 的实例比 0 的多得多,但这可能是也可能不是问题。特征重要性图看起来不错,表明似乎没有一个支配性特征控制分类器。一个有经验的 ML 工程师可以利用这些信息,推断出我们有一个不平衡的分类,并且可能需要尝试对 0 和 1 的比率进行更均匀的子采样,以获得更好的模型,但是这个结果可能不是每个人都清楚的。

深度检查现成的验证

Deepchecks 的优势在于它允许任何人用很少的代码运行一套验证指标。您所要做的就是创建 dataset 对象,指定标签列、索引(如果有意义的话)和分类特征(推荐,不是必需的)。

from deepchecks import Dataset
from deepchecks.suites import full_suite
ds_train = X_train.merge(y_train, left_index=True, right_index=True)
ds_test = X_test.merge(y_test, left_index=True, right_index=True)
ds_train = Dataset(ds_train, label="WasTheLoanApproved", cat_features=["TypeOfCurrentEmployment", "LoanReason", "DebtsPaid"])
ds_test =  Dataset(ds_test,  label="WasTheLoanApproved", cat_features=["TypeOfCurrentEmployment", "LoanReason", "DebtsPaid"])
suite = full_suite()
suite.run(train_dataset=ds_train, test_dataset=ds_test, model=clf)

在 8 行代码中,该套件对我的数据集运行了 30 多次检查。这些检查分为 4 个主要类别:数据分布(我的测试数据是否与我的训练数据相似)数据完整性(我的数据中是否有可能导致问题的错误值)方法(我的训练/测试集大小是否正确且没有泄漏)性能(相当明显——我的模型是否表现良好)。

作者图片

这是条件总结,可以看出,这是一个非常强大的验证工具。这不仅提供了与我运行的几个 Scikitlearn 测试相似的结果,而且像数据完整性和数据漂移这样的问题也很容易被忽视,并需要大量的代码来测试。拥有一个可以单独检查这些内容的平台使它值得使用。

现在让我们回到我的模型。所有这些测试都已运行,当前型号只有两项检查未通过,两项检查都与性能相关。带有超链接的测试有相关的图表。让我们来看看失败的例子。

作者图片

性能报告故障告诉我,模型稍微过拟合。特别是当查看 0 类(贷款未批准)时,测试集精度下降非常显著。

简单的模型比较告诉我,当前模型的预测方式并不比每次只猜测一个常数“1”好多少。这是一个很大的问题,也是一个明显的信号,表明 1 在数据集中被过多地表示了。我可以通过查看我们的测试集 ROC 报告来确认这一点,由于我们错误地分类了我们代表不足的类,所以测试集的 ROC 报告只能勉强接受。

作者认为 auc < 0.7 为失败|图片

总的来说,这使我得出了与内置的 Scikitlearn 方法大致相同的结论,但是 Deepchecks 以一种更容易产生和理解的方式提供了这些信息。

改进/缺点

既然我已经展示了这个测试套件的强大功能,我想深入了解一些我想看到的特性。其中一些更挑剔,但它们是我在整个平台中发现的弱点。

推断分类特征是不一致的

文档指出,强烈建议显式声明任何分类特性,但是如果没有指定,平台可以尝试推断哪些是分类特性。目前的推断过程使用简单的启发式,在我的测试中,我发现这是不可靠的。

测试推断的分类特征|作者图片

如您所见,第一个问题是它不一定能检测到相同的分类特征。第二个问题是缺乏准确性。训练集确定了 4 个分类特征,其中只有 1 个实际上是分类的。我希望看到一种统计方法来代替这种启发式方法,以获得可能更好的结果。同时,在使用这个包时,请定义你的分类变量。

声明数据集类会变得更容易

这属于吹毛求疵的范畴。第一个问题是声明一个索引。要声明一个索引(可以进行更多的数据完整性检查),必须将索引设为一列(使用 reset_index ),然后显式声明。如果有一个 use_dataframe_index=True/False 参数,可以轻松地绕过显式声明并使用数据帧本身的索引,这将是一个很好的改进。

第二个小的改进是能够分别传入 X(输入)和 Y(输出/预测)数据帧,而不是只接受带有显式声明标签的完整数据帧。这仅仅是因为这可以更好地匹配许多个人天生使用 Scikitlearn 的训练测试分割的方式。你可以在上面看到,我必须重新连接我的 X 和 Y 数据帧才能进入套件。

不一致的解释和解释资源

很大一部分图表很好地解释了测试是什么,为什么它很重要,然后是一些外部文档来做进一步的解释。这在校准度量测试中很容易看出。

校准度量测试|作者图片

由于这个原因,当图表/测试很少或没有解释时,我很失望,例如,ROC 报告

作者图片

我认为,对于最*才接触 ML 的人来说,这可能会导致信息过载的感觉,并且在出现问题时,对如何调试他们的模型缺乏指导。

宽松的通过-失败开箱即用

开箱即用的套件预先调整了一些关于什么是“好”模型的宽松定义。就拿我算法的测试 ROC 来说吧。当然,测试通过了,但它几乎是失败的。如果没有进一步的调查,这可能会导致用户忽略可能需要解决的问题。如果有预定义的性能层(例如,“严格”模式),它可能会抛出更多警告,让用户知道这不是一个确定的问题,但可能是值得考虑优化的问题。

这是一个吹毛求疵的问题,因为 Deepchecks 已经通过实现定制套件部分解决了这个问题。对于众多测试中的任何一个,都可以调整性能边界和度量标准,从而允许对合格模型的构成进行微调。这个建议纯粹是作为单一开箱即用套件和完全定制模型之间的“中间地带”。

仅限于 Scikitlearn

如果包可以处理不同的 ML 包就好了。比如 NLP 的 Gensim,或者深度学*的 TensorFlow。至少检测这些其他包中的数据漂移的能力是值得探索的。

结论

这个包虽然新,但非常棒,只会让机器学*模型评估变得更容易。手工运行所有这些测试需要数百行代码。将它简化为一个简单的函数调用将很容易地将这个包转移到一个我计划紧密集成到我的开发过程中的包中。我迫不及待地想用这个包来扩展过去的 Scikitlearn 并开发更复杂的见解。

如果你喜欢你所读的,请随意跟随我,阅读更多我写的东西。我倾向于每个月深入一个主题一次,这通常涉及新的包、技巧和窍门,或者 ML 空间中我认为需要更好解释的任何东西!

数据科学家一直在等待的无代码熊猫替代品

原文:https://towardsdatascience.com/the-no-code-pandas-alternative-that-data-scientists-have-been-waiting-for-9e22aaa9cf02

为所有人简化数据分析的一步

罗伯特·阿纳奇在 Unsplash 拍摄的照片

动机

讲述故事对于所有数据科学项目的工作流程都至关重要。

在这方面,从数据中获取有价值的见解是每个组织都希望数据科学家具备的基本技能。

令人欣慰的是,在过去的几年里,全球各地的开发人员为开发可靠而复杂的工具做出了巨大贡献,使数据科学家的工作变得相对容易。

Python 最流行的开源工具包括 Pandas、NumPy、Matplotlib、Seaborn 等等。

本质上,这些工具允许用户使用编码指令执行各种数据分析操作。

虽然它们巨大的效用使它们在今天的数据科学项目的工作流程中几乎不可或缺,但我相信:

没有经验的初学者在试图掌握这些工具时经常会不知所措。

→ #2 更令人担忧的是专家每天花费相当多的时间和精力反复编写相同的代码,进行跨不同项目的数据分析。

  • 为了获得一些观点,试着记住你已经明确地写了df.sort_values()pd.merge()df.value_counts()的次数,或者通过一遍又一遍地写相同的代码来创建不同的散点图。
  • 简单来说,冗余比你想象的更频繁,抑制了工作产出。

因此,这两个团队都特别寻找省时、无代码、基于 GUI 的工具,这些工具:

  1. 初学者有极低的准入门槛。
  2. 帮助专家根除多余的工作,做对他们重要的事情。

有人可能会说,在这种情况下,Excel 可能是一个潜在的选择。我部分同意这一点,因为 Excel 的最大问题是它的最大行数限制。这阻碍了涉及大规模数据分析的项目。

为此,我在这个博客中特别感兴趣讨论的是一个潜在的使用熊猫进行数据分析的无代码辅助工具,名为 Gigasheet 。

为了使表格数据分析相对容易,我将在 Pandas 中执行 15 个典型操作,并演示如何使用 Gigasheet 只需点击几下按钮即可完成这些操作。

我们开始吧🚀!

先决条件

要使用 Pandas,应该先导入库。如下所示:

要使用 Gigasheet,你应该有一个 Gigasheet 账户,所有东西都是预装的。

资料组

对于这个博客,我将使用一个由 30 万行和 9 列组成的自创数据集。前五行如下所示:

数据集的五个五行(图片由作者提供)

#1 阅读 CSV

熊猫

您可以使用pd.read_csv()方法读取 CSV 文件并创建 Pandas 数据帧。

千兆页

在这里阅读 CSV 也很简单。只需上传 CSV 文件,您就可以开始了。

阅读 CSV(作者 Gif)

您还可以上传其他文件格式,如 JSON、XLSX、TSV、GZIP 等等。

或者,你可以利用数据连接器,如亚马逊 S3、谷歌驱动、Dropbox 等。,以上传数据集。这节省了从本地机器上传文件的时间。

#2 数据帧的维度

熊猫

如果你想打印数据帧的形状(行数和列数),你可以使用数据帧的shape属性。

千兆页

在这里,一旦您上传文件,就会显示形状。

数据集的维度(图片由作者提供)

**注意:**它计算一个额外的列来说明索引。

#3 查看前 N 行

通常,在现实世界的数据集中,您将有许多行要处理。

在这种情况下,人们通常只对查看数据帧的前几行n感兴趣。

熊猫

您可以使用df.head(n)方法打印第一个n行:

千兆页

打开工作表后,默认情况下会显示前 100 行。这使您可以快速浏览数据集。

查看数据框的顶行(作者 Gif)

#4 查看列的数据类型

熊猫

您可以使用dtypes参数查看列的数据类型。

千兆页

要查看列的数据类型,请单击特定的列标题并选择“更改数据类型”

数据类型显示为突出显示的文本,在本例中为Company_Name列的“纯文本”。

查看列的数据类型(Gif by Author)

#5 修改列的数据类型

熊猫

要更改列的数据类型,可以使用如下的astype()方法:

千兆页

要更改列的数据类型,请单击特定的列标题并选择“更改数据类型”

更改列的数据类型(Gif by Author)

你可能已经注意到了,修改并没有到位。简单地说,它会自动创建一个具有所需数据类型的新列,并隐藏原始列以供将来引用。

#6 删除列

熊猫

如果你想删除一列,使用df.drop()方法:

千兆页

从工作区中删除列有两种方法。

第一种方法是暂时隐藏右侧边栏中的列。

删除列(Gif by Author)

第二种方法是永久删除该列。为此,单击特定的列标题并选择“删除”

删除列(Gif by Author)

#7 打印关于数据帧的描述性信息

熊猫

df.info()df.describe()是生成数据帧统计信息的两种常用方法。

千兆页

您可以使用工作表底部提供的各种聚合来查看上述信息。

打印列的描述性统计数据(Gif by Author)

#8 排序数据帧

熊猫

您可以使用df.sort_values()方法对数据帧进行排序。

千兆页

对数据帧排序(按作者排序的 Gif)

#9 重命名列

熊猫

如果您想要重命名列标题,请使用df.rename()方法,如下所示:

千兆页

要更改列名,请单击特定的列标题,然后选择“重命名”

重命名列(Gif by Author)

#10 过滤数据帧

熊猫

有多种方法来过滤数据帧。这些包括布尔过滤、选择列、按标签选择、按位置选择等。

千兆页

要过滤数据帧,请转到“过滤器”选项卡。选择列并指定要筛选的条件。

基于条件过滤数据帧(Gif by Author)

此外,它在工作表底部显示过滤后的行数。

#11 拆分列

熊猫

如果您想将一个列拆分成多个列(比如说NameFirst_NameLast_Name,您可以对一个字符串列使用split()方法。

千兆页

要拆分列,请转到“工具”→“列”→“拆分”

拆分列(作者 Gif)

#12 对数据帧进行分组

熊猫

您可以使用 Pandas 中的groupby()方法对数据帧进行分组并执行聚合:

千兆页

要对数据框进行分组,请点击顶部栏中的“分组”按钮。

分组后,您可以在这里执行各种常见的聚合。

将数据框分组(按作者分组的 Gif)

#13 添加新列

熊猫

您可以使用赋值运算符来添加新列:

千兆页

在这里,您可以转到“插入”→“计算”并执行上述操作,如下所示:

向数据框架添加新列(Gif by Author)

#14 合并数据帧

熊猫

如果你想用一个连接键合并两个数据帧,使用pd.merge()方法:

千兆页

为了演示这一点,我将合并下面的 CSV 文件。合并列是Employment_Status

下面演示了这些步骤。我们将使用“跨文件 VLOOKUP”工具来合并数据帧。

合并两个数据帧(Gif by Author)

#15 将数据帧存储到 CSV

熊猫

您可以使用df.to_csv()方法将数据帧转储到 CSV,如下所示:

千兆页

保存数据帧的步骤如下所示(文件→导出)。

存储数据帧(Gif by Author)

结论

在这篇博客中,我演示了如何利用 Gigasheet 来执行 15 个最常见的 Pandas 操作,而无需编写任何代码。

我是无代码解决方案的忠实粉丝。在我看来,当谈到消除多余的工作,从而使生活变得更容易时,他们确实是游戏规则的改变者。

当然,我同意编码解决方案提供定制(以及更多),这是它最重要的好处之一。因此,重申一下,我并不是说 Gigasheet 是(或将会是)熊猫的最终替代品。

然而,根据我的经验,我认为 Gigasheet 对于初学者来说非常方便,因为它降低了开始数据科学基本操作的门槛。

这个博客将帮助初学者学*如何在 Gigasheet 中对熊猫进行回溯引用操作。

同时,这个博客也可以帮助该领域的专家将常见的熊猫操作翻译成 Gigasheet。这将通过避免重复编写相同代码的冗余来帮助他们更快、更轻松地工作。

另一组可以利用 Gigasheet 的潜在用户是 Excel 用户。有人可能会说,这篇博客中演示的大多数操作都可以在 Excel 中轻松执行。

然而,Excel 最大的问题是它的最大行数限制。这阻碍了大规模数据分析项目的工作,而 Excel 不支持这种项目。

总之,虽然 Gigasheet 还没有达到杀死熊猫(或 Excel)的程度,但这种轨迹肯定是存在的。我渴望看到他们如何继续!

一如既往感谢阅读!我很乐意阅读您的回复:)

🚀订阅数据科学每日剂量。在这里,我分享关于数据科学的优雅技巧和诀窍,一天一个技巧。每天在你的收件箱里收到这些提示。

🧑‍💻成为数据科学专家!获取包含 450 多个熊猫、NumPy 和 SQL 问题的免费数据科学掌握工具包。

我喜欢探索、实验和撰写关于数据科学概念和工具的文章。你可以在 LinkedIn 上和我联系。

随机效应回归模型实用指南

原文:https://towardsdatascience.com/the-no-nonsense-guide-to-the-random-effects-regression-model-be899ce415a5

和 Python 教程,帮助您在真实数据集上使用 RE 模型

随机效应回归模型用于估计个人特定特征的效应,如内在不可测量的毅力或敏锐度。在面板数据研究中经常遇到这种个体特异性的影响。与 固定效应回归 模型一起,随机效应模型是研究个体特异性特征对面板数据集响应变量影响的常用技术。

本文是面板数据分析系列文章的第三部分:

  1. 如何为面板数据集构建混合 OLS 回归模型
  2. 了解固定效应回归模型
  3. 随机效应回归模型的实用指南

对于那些读过我关于固定效应模型和混合 OLS 模型的文章的人来说,这篇文章的前 10%可能感觉像是对概念的修正。

让我们从简单地(重新)了解面板数据开始。

什么是面板数据集?

面板数据集包含关于一组唯一可识别的个体或“事物”的数据,这些个体或“事物”在一段时间内被主动跟踪。每个个体或“事物”被称为一个单元。可以被认为是跟踪单元的例子有个人、家庭、树、车辆、公司和国家。通常,对于每个单元,在每个时间段测量一个或多个参数(又名回归变量效应)。属于一个单位(一个国家)的一组数据点称为

如果所有单元被跟踪相同数量的时间段,该数据面板被称为平衡面板。否则称为不平衡面板。如果在整个研究过程中跟踪同一组单元,则称之为固定面板,但如果在研究过程中单元发生变化,则称之为旋转面板

面板数据通常来源于已知的纵向研究,如 T2、弗雷明汉心脏研究、T4、T5、T6、T7 或 T9 英国家庭面板调查。

世界银行面板数据集

在本文中,我们将使用来自世界银行的面板数据集,其中包含七个国家的人均 GDP 年同比增长率数据。这些数据是从 1992 年到 2014 年采集的。以下是该面板数据集的外观:

a 专家组数据集(来源:世界发展指标数据 CC BY 4.0 license )(图片由作者提供)

上面的数据集中,单位是一个国家,有两个变量 : GDP 增长和 GCF 增长。因此,我们在 23 个时间段 (1992 年至 2014 年)内跟踪 7 个单位中每个单位的 2 个变量。这导致创建了 7 组数据。世界银行数据集是固定的平衡的。

回归目标

我们的目标是研究总资本形成年同比增长对 GDP 年同比增长的影响。

因此,我们的因变量反应变量 y 就是 Y-o-Y %的人均 GDP 增长率

自变量解释变量 X年-年资本形成总额增长率

我们将从直观地考察 GDP 增长和 GCF 增长之间的关系开始。

让我们创建一个 yX 的散点图,看看数据是什么样子的。

我们将从导入所有需要的 Python 包开始,包括我们稍后将用来构建随机效果模型的包。

**import** pandas **as** pd
**import** scipy.stats **as** st
**import** statsmodels.api **as** sm
**import** statsmodels.formula.api **as** smf
**from** matplotlib **import** pyplot **as** plt
**import** seaborn **as** sns

让我们将数据集加载到熊猫数据框中。数据集可以在 这里下载

df_panel = pd.**read_csv**('wb_data_panel_2ind_7units_1992_2014.csv', **header**=0)

我们将使用 Seaborn 绘制所有 7 个国家在所有时间段的人均 GDP 增长与每个国家总资本形成增长的关系图:

colors = [**'blue'**, **'red'**, **'orange'**, **'lime'**, **'yellow'**, **'cyan'**, **'violet'**]sns.**scatterplot**(**x**=df_panel[**'**GCF_GWTH_PCNT**'**], **y**=df_panel[**'**GDP_PCAP_GWTH_PCNT**'**],**hue**=df_panel[**'**COUNTRY**'**],**palette**=colors).**set**(**title**='Y-o-Y % Change in per-capita GDP versus Y-o-Y % Change in Gross capital formation')plt.**show**()

我们看到下面的情节:

国内生产总值同比增长%与总资本形成同比增长%的国家散点图(图片由作者提供)

GDP 和 GCF 增长之间的关系似乎是线性的,尽管数据中也有相当多的 异方差

作为一个工作假设,让我们假设以下线性函数形式的关系:

y= Y-o-Y %人均国内生产总值增长率,以及,

X= Y-o-Y 资本形成总额增长率

国家 I 的线性模型(图片由作者提供)

上述方程是一个矩阵方程,如变量的粗体字体所示。假设每组有 T 个时间段,每单位有 k 个回归变量,每单位有 n 个回归变量,方程中每个矩阵变量的维数如下:

  • y*_ I是单元 i 的响应变量。它是一个大小为【T×1】*的向量。
  • X*_ I是大小【T X k】*的回归变量矩阵。
  • β*_ I是大小为【k×1】的系数矩阵,包含**X****_ I .*中 k 个回归变量系数的总体(真)值
  • **_ I是一个大小为【t×1】的矩阵,包含模型的误差项,每个 T 时间段一个误差项。误差项定义为观察值和“模拟”值之间的差异。

下面是这个方程的矩阵形式:

国家 I 的线性回归模型的矩阵形式(图片由作者提供)

在世界银行面板数据集中, T=23,k=1n=7

在上述回归模型中,错误术语*_ I*产生的原因如下:**

  • 测量误差,
  • 实验装置中的随机噪声,
  • 由于一个或相关解释变量的意外或故意遗漏而引入的错误,
  • 回归模型选择不正确或模型中回归变量或响应变量的函数形式选择不正确。
  • 由于我们无法测量特定单元的某些特性而引入的误差。在国家数据面板中,这种特定单位的影响可能是该国在不同环境条件下促进或抑制 GDP 增长的社会经济结构**,以及该国数百年来演变的企业和政府决策的文化方面。**

特定单位的影响本质上是不可测量的(一些作者更愿意称之为不可观察的影响**)。**

我们仍然需要找到一种方法来测量它们对响应变量的影响,因为如果我们从回归分析中完全忽略它们,它们的影响将以一种不受控制的方式泄漏到误差项中(并因此泄漏到训练模型的残余误差中),并使我们的模型次优。

为此,我们将从重新陈述单元(即国家)的回归模型等式开始 i 如下:

国家 I 的线性模型的一般形式(图片由作者提供)

在上面的等式中:

  • y _i 是一个大小为【T x 1】的矩阵,包含国家 iT 观察值。
  • X_ I是一个大小为*【T X k】的矩阵,包含 k 回归变量的值,所有这些值都是可观察的和相关的。*
  • β_ I是一个大小为*【k x 1】的矩阵,包含 k 回归变量的回归系数的总体(真)值。*
  • Z_ I是一个大小为*【T x m】的矩阵,包含所有变量的(理论)值(数量为 m )和无法直接观察到的效应。*
  • γ_ I是一个大小为*【m×1】的矩阵,包含 m 个不可观测变量的回归系数的(理论)总体值。*
  • ε_ I是一个大小为*【T×1】的矩阵,包含对应于国家 iT 观测值的误差项。*

下面是矩阵乘法和加法的样子:

矩阵格式的国家 I 线性模型的一般形式(图片由作者提供)

所有特定于单元的效应都被假设为由术语Z***_ Iγ_ I .矩阵Z****_ I及其系数向量γ****_ I*是纯理论术语,因为它们所代表的内容实际上无法观察和测量。**

我们的目标是找到一种方法来估计_ Iy 的影响,即**_ Iγ_ I 对* y 的影响*****

为了简化估算,我们将把所有国家特有的不可观测效应的影响合并到一个变量中,对于国家 i ,我们称之为z***_ I*。z*_ I是一个大小为【T×1】的矩阵,因为它只包含一个变量 z_i ,并且它有 T 行对应于 T 个“测量值”,每一个值为z _ I .***

由于z***_ I*不可直接观测,为了衡量 z_i 的效果,我们需要将省略 z_i 的效果形式化。为此,我们将求助于统计学中的一个概念,称为省略变量偏差。**

省略可变偏差

在面板数据集上训练模型时,如果我们从模型中遗漏掉_ I*,就会造成所谓的遗漏变量偏差。可以看出,如果在不考虑 z_i 的情况下对回归模型进行估计,那么模型系数的估计值β***_ cap _ I*会有如下偏差:*****

省略变量偏差:由于省略变量z***_ I【图片由作者提供】而在β****_ I 的估计中引入的偏差*

在上式中可以看出,估计值_ cap _ I中引入的偏差是正比于省略变量 z _i 与解释变量X****_ I之间的协方差**。这表明了建立两种回归模型的动机:**

  1. 固定效应模型,其中协方差非零,即单位特定效应与回归变量相关,以及,
  2. 一个随机效应模型**,其中协方差项为零,即单位特定效应独立于回归变量。**

在以前的文章中,我们看到了如何构建固定效果模型。在本文中,我们将重点关注随机效应模型**,并将其性能与有限元模型和混合 OLS 回归模型进行比较。**

随机效应模型

为了理解随机效应模型的结构,从 FE 模型的结构开始,并将其与 re 模型的结构进行对比是很有用的。那么,让我们简单回顾一下固定效果模型的结构。

固定效应模型的关键假设是,不可观察的效应与模型的回归变量相关。在省略变量偏差一节中,我们看到这种相关性的存在将导致协方差项非零,进而导致偏差与该协方差的绝对值成比例。为了应对这种偏差,固定效应模型采用了将单位特定偏差项 c_i 引入回归方程的方法,如下所示:

固定效应回归模型(图片由作者提供)

请注意,我们已经用*_ I替换了术语z****_ Iγ_ I*,它是一个大小为*【T x1】的矩阵,其中每个元素都有相同的值 c_i.*

**c_i估计值,即(我们称之为 c_cap_i) 是一个具有一定概率分布的随机变量,其均值为 c_i. 在固定效应模型中,我们假设所有单位特定效应的估计值具有相同的常方差 *σ。*假设正态分布 c_cap_i 也很方便(尽管不是必需的)因此,我们有:

c_cap_i ~ N(c_i,σ )

下图说明了三个单元的 c_i 的分布:

面板数据集中三个不同单位的单位特异性效应 c_i 的概率分布(图片由作者提供)

现在让我们来看看随机效应模型的动机。

如果单位特定效应与回归变量不相关,则该效应完全成为误差项*的一部分。我们不能再使用我们在固定效应模型中使用的策略来补偿它的缺失,即我们不能再假设一个独特的、单位特定的效应 c_i 的存在,其效应将补偿由于从模型中省略所有未观察到的变量_ I而引入的偏差。***

因此,我们需要一种不同的方式来考虑单位特定的影响,为此,我们求助于一种巧妙的建模方法。

回忆以下回归方程:

国家 I 的线性模型的一般形式(图片由作者提供)

回想一下,术语Z***_ Iγ_ I产生特定于单元的效果。Z_ Iγ_ I*恰好是一个具有某种均值和方差的随机变量。**

在随机效应模型中,我们假设所有单元的单元特定效应根据某个未知概率分布分布在公共平均值周围。此外,该公共平均值在数据面板中的所有时间段内保持不变。****

在符号方面,这些假设产生了下面的条件期望对于术语Z***_ Iγ_ I*,这意味着捕捉所有不可观察的特定于单元的效应:**

E(Z_ Iγ***_ I |X_ I)=α***

现在,让我们从模型的回归方程的 R.H.S .中加减这个期望值:

图片作者)

在上式中,术语(Z_ Iγ_ I—E(Z_ Iγ_ I |X我们将用术语μ***_ I .来表示这种变化***

此外,我们已经假设上式中的黄色项(即所有单位特定效应的期望值)具有常量值 α ,即E(Z_ Iγ_ I |X

因此,我们得出随机效应回归模型的以下方程:

第一单元的随机效应模型(图片由作者提供)

上述等式表明了以下观点:

在估计模型的参数时,如果我们忽略特定于单元的效果_ Iγ_ I*,我们将引入两种情况:***

  1. 常数 α 捕捉所有单位特效的平均值。这个平均值不随时间变化,它有效地取代了回归模型的截距项。
  2. 误差项μ***_ I*,其大小与常数均值周围单位特定效应的方差成正比。**

从这个角度来看,我们有理由将_ I与误差项ϵ****_ I*组合在一起,形成一个复合误差项**,我们在括号中显示了该误差项。***

这个复合误差项是随机效应回归模型的定义特征。正如我们将很快看到的,复合误差项的各个分量需要作为 re 模型估计过程的一部分进行估计。

以下是单位 i 和特定时间段 t 的随机效应模型方程:

t 时段单位 I 的随机效应回归模型(图片由作者提供)

在上面的等式中:

  • y_i_t 是单位(国家) i 在时间段(年份) t 的响应变量的值(在 WB 数据集中的 GDP 增长百分比)。
  • x _i_t 是一个大小为【1 x k】的行向量,假设有 k 个回归变量(WB 数据面板的 k=1 )。X_ I _ T是我们前面看的大小为*【T X k】X****_ I回归矩阵中的第T*行。
  • β_ I是一个大小为*【k×1】的列向量。在世界银行的数据集中,只有一个回归变量:%总资本形成增长率。*
  • α 是共同偏倚(所有单位特异性效应的平均值)。它形成了线性回归模型的截距。
  • μ_i 是由单位 I 的单位特定效应引入的方差。请注意,它缺少时间下标 t,因为在数据面板中假设它在所有时间段内都是常数(也称为时间不变量)。
  • ϵ_i_t 是在时间段 t 内为单元 i 引入的所有其他来源的误差的余额。

下面是上述等式的矩阵形式:

时间周期 t 内单元 I 的随机效应回归模型(矩阵格式,图片由作者提供)

随机效应模型中复合误差项的特征

RE 模型的综合误差项有几个重要特征,决定了如何估算这些误差。

  1. 与固定效应模型一样,误差 ϵ_i_t 是一个随机变量,它被假定为以某种未知的(但通常被假定为正态的)概率分布围绕平均值 0波动。因此,误差的条件期望为零: e(ϵ_i_t|x_ I)= 0 对于所有单位 I 和时间段 t
  2. 假定误差项***【ϵ_i_t】在数据面板中的所有单位和所有时间段的零均值附*具有恒定方差 σ _ϵ 。从概率论中,我们知道随机变量的方差是以均值为中心的随机变量的平方的期望值。由于误差项的平均值为零,它只是误差平方的期望值,取决于该单元的其余回归变量值:
    e(ϵ_ I _ t |x_ I)=σ_ϵ
    *
  3. *误差项 ϵ_i_t 跨不同单位 i j 或不同时间段 t s (假设模型指定正确):
    e(ϵ_i_tϵ_j_s|x=j 或者 t!= s
  4. **特定于单元的效果 μ_i 围绕零均值波动,并且它们具有恒定方差σ_ u:
    E(μ_ I |X_ I)= 0
    E(μ_ I |X
  5. 特定于单元的效果 μ_i 与误差ϵ_i_t:
    e(μ_j
    ϵ_i_t|x_ I)= 0 对于所有 I,j,t
    *

随机效应回归模型的估计

RE 模型的估计涉及以下两件事:

  1. 方差分量的估计 σ _ϵσ _u 与复合残差(μ+ϵ)。**
  2. 回归系数 β 和公共偏差 α 的估计(我们形成回归模型的截距项)。

σ _ϵσ _u 的估计也为我们提供了一种估计随机效应模型能够解释的 y 中总方差分数的方法,如下所示:

随机效应模型能够解释的总方差在 y 中的分数(图片由作者提供)

随机效应模型的估计过程通过以下一系列步骤进行:

步骤 1:混合 OLSR 回归模型的估计

随机效果模型具有复合误差项(μ+ϵ)。在这一步中,我们将为估计与组件相关的方差 σ _ϵσ _u 做准备。稍后将需要这些方差估计来估计模型的系数。****

为此,我们将训练一个 汇集了 OLS 回归模型 模型的面板数据集。混合 OLSR 模型基本上是一个 OLS 回归模型,建立在面板数据组的扁平化版本上。

面板数据集的扁平化版本(图片由作者提供)

在世界银行数据集的情况下,我们在 GCF_GWTH_PCNT 上回归 GDP_PCAP_GWTH_PCNT:

汇集的 OLSR 数据模型(图片由作者提供)

我们真正感兴趣的是经过训练的 PLSR 模型的残差*【ϵ】*。在下一步中,我们将使用这些误差来估计随机效应模型的方差分量。

步骤 2:方差分量σ _ϵ和σ _ u 的估计

σ _ ϵσ _ μ 是误差分量 μϵ.的方差 为了估计方差,我们将使用样本方差的公式:

随机变量 W 与均值 w_bar 的样本方差公式(图片由作者提供)

可以看出,方差 σ _ ϵ 就是固定效应模型的误差项 ϵ 的方差。因此,为了估计这个方差,我们将在面板数据集上训练一个固定效应模型,如我在关于 固定效应模型 的文章中所示。然后,我们使用拟合模型的残差来计算 σ _ ϵ ,如下所示:

剩余误差方差的计算公式(图片由作者提供)

上式中, ϵ_i_t 为训练好的有限元模型在 t 时刻单元 i 的残差。请注意,我们没有对每个误差进行去均值处理(即减去均值),因为拟合的 OLSR 模型(实际上是有限元模型)的残差均值为零。

在上面的公式中,内部求和是单元 i 的残差的平方和。外部求和对数据面板中的所有 n 单元执行内部求和。

在分母中,我们通过固定效应模型使用的组数 (n) 和每个组中的回归变量数( k) 向下调整了总自由度( nT )。

计算 σ _u 的程序有点复杂,σ _u 是单位效应的方差。在面板数据回归的文献中至少有三个不同的公式。我们不会深入这些公式的细节和基本原理,而是简单陈述最容易理解的公式:

与随机效应回归模型的复合误差项相关的方差之间的关系(图片由作者提供)**

**上式中, σ _pooled 是在面板数据集上训练的 Pooled OLSR 模型的残差方差。回想一下,我们在步骤 1 中拟合了这个模型。我们已经看到如何估计 σ _ ϵ.因此,知道了 σ _pooledσ _ ϵ ,我们就可以用上面的公式来估算 σ _u

在接下来的两步中,我们将进一步为估计系数 β 和公共偏差 α做准备。

步骤 3:估计特定群体的平均数

在这一步,我们将计算数据面板中每组 i (即每个单元 i )的响应y***_ I和回归变量X****_ I的平均值。由于我们的数据面板是平衡的,每个组包含相同数量的 T 时间段。因此,计算组 i 的平均值需要对组 i 的响应值 y 的所有值求和(或对组 i 的回归变量x _ k*的所有值求和),然后除以 T

每个单元 I 的 Xy 值的组特定平均值(图片由作者提供)

下图说明了比利时的计算方法:

计算世界银行数据面板的特定群体平均值(图片由作者提供)

许多文本使用以下符号表示这种方法:

聚合值的点符号(图片由作者提供)

点的位置表示在其上执行聚合的矩阵维数。在上面的例子中,聚合是在时间维度上执行的。

下表包含 WB 数据集的特定组均值:

世界银行面板数据组的 X _i 和 y _i 的分组均值(图片由作者提供)

以下是这些值相互对比时的样子:

y _i 对 X _i 的分组均值(图片由作者提供)

我们将在下一步中使用这些组方法。

步骤 4:居中(减去平均值)数据面板的计算

在此步骤中,我们使用在步骤 3 中计算的各个组特定平均值,对每个单元的所有y***_ IX****_ I值进行去平均。但是,我们没有将数据集集中在特定组的原始平均值周围,而是将其集中在平均值的缩放版本周围,其中缩放因子 θ 体现了特定单元随机效应的贡献。以下是对中y****_ IX****_ I*值的公式:

每个单元 I 的 y _i 和 X _i 的对中(图片由作者提供)

比例因子 θ 可以用两个方差分量 σ _ϵσ _u 表示如下:

θ的估算(图片由作者提供)

步骤 5:使用减去平均值的数据面板估计随机效应模型系数β***_ I***

最后,我们估计随机效应模型的系数β***_ I*。我们通过在我们在步骤 4 中构建的均值减去数据面板( y * ,X ) 【T71)上拟合 OLSR 模型来做到这一点。在时间 t 时,单元 i 的模型方程如下:*

(图片由作者提供)

这就完成了随机效应模型的估算程序。

如何使用 Python 和 statsmodels 实现随机效应回归模型

现在,我们将使用上文概述的 5 步程序,说明在世界银行数据集上构建和训练随机效应回归模型的程序。

在本文的开始,我们已经导入了所有需要的包,并将世界银行数据集加载到 Pandas 数据框架中。

让我们列出所有代码,包括我们将在后面步骤中使用的公共变量定义:

*colors_master = [**'blue'**, **'red'**, **'orange'**, **'lime'**, **'yellow'**, **'cyan'**, **'violet'**, **'yellow'**, **'sandybrown'**, **'silver'**]*#Define the units (countries) of interest* unit_names = [**'Belgium'**, **'CzechRepublic'**, **'France'**, **'Ireland'**, **'Portugal'**, **'UK'**, **'USA'**]unit_names.**sort**()colors = colors_master[:**len**(unit_names)]unit_col_name=**'COUNTRY'** time_period_col_name=**'YEAR'** *#Define the y and X variable names* y_var_name = **'GDP_PCAP_GWTH_PCNT'** X_var_names = [**'GCF_GWTH_PCNT'**]***#Load the panel data set of World Bank published development indicators into a Pandas Dataframe***df_panel = pd.read_csv(**'wb_data_panel_2ind_7units_1992_2014.csv'**, **header**=0)***#Setup the variables that we will use in later steps to calculate the variance components******#n=number of groups***n=len(unit_names)***#T=number of time periods per unit***T=df_panel.shape[0]/n***#N=total number of rows in the panel data set***N=n*T***#k=number of regression variables of the Pooled OLS model***k=len(X_var_names)+1plot_against_X_index=0***#Use Seaborn to plot GDP growth over all time periods and across all countries versus gross*** *# capital formation growth:* sns.**scatterplot**(**x**=df_panel[X_var_names[plot_against_X_index]], **y**=df_panel[y_var_name], **hue**=df_panel[unit_col_name], palette=colors).**set**(**title**= 'Y-o-Y % Change in per-capita GDP versus Y-o-Y % Change in Gross capital formation')plt.**show**()*

数据集可以在 这里下载

步骤 1:估计混合 OLSR 回归模型

在这一步中,我们将使用 statsmodels 在 panel 数据集上构建和训练一个合并的 OLS 回归模型:

***#Carve out the pooled y and pooled X matrices**
grouped_y=df_panel_group_means[y_var_name]
grouped_X=df_panel_group_means[X_var_names]**#Add the placeholder for the regression intercept**
grouped_X = sm.add_constant(grouped_X)**#Build and train an OLSR model on the entire dataset**
pooled_olsr_model = sm.OLS(endog=pooled_y, exog=pooled_X)
pooled_olsr_model_results = pooled_olsr_model.fit()print(**'=============== Pooled OLSR Model ==============='**)
print(pooled_olsr_model_results.summary())*

我们得到以下输出:

集合 OLSR 模型的训练总结(图片由作者提供)

我们对该模型的残差感兴趣,如下所示:

***print**('residuals of the \'Pooled OLSR\' model:')
**print**(pooled_olsr_model_results.**resid**)*

混合 OLSR 模型的残差(图片由作者提供)

步骤 2:方差分量σ _ϵ和σ _ u 的计算

为了计算 σ _ϵ ,我们将在这个数据集上拟合固定效应模型。

在面板数据集上建立和拟合 LSDV(带虚拟变量的最小二乘)模型,以便我们可以访问它的 SSE。

创建虚拟变量,每个国家一个。

*df_dummies = pd.**get_dummies**(df_panel[unit_col_name])*

将假人数据框与面板数据集连接起来。

*df_panel_with_dummies = df_panel.**join**(df_dummies)*

构建 LSDV 模型的回归方程。请注意,我们省略了一个虚拟变量,以避免 7 个虚拟变量之间完全多重共线。回归模型的截距将包含被忽略的美国虚拟变量的系数值。

*lsdv_expr = y_var_name + **' ~ '** i = 0
**for** X_var_name **in** X_var_names:**if** i > 0:lsdv_expr = lsdv_expr + **' + '** + X_var_name**else**:lsdv_expr = lsdv_expr + X_var_namei = i + 1
**for** dummy_name **in** unit_names[:-1]:lsdv_expr = lsdv_expr + **' + '** + dummy_nameprint(**'Regression expression for OLS with dummies='** + lsdv_expr)*

建立和训练 LSDV 模型。

*lsdv_model = smf.**ols**(**formula**=lsdv_expr, **data**=df_panel_with_dummies)
lsdv_model_results = lsdv_model.**fit**()*

打印出培训总结。

*print(**'============= OLSR With Dummies ============='**)
print(lsdv_model_results.summary())*

我们看到以下输出:

固定效果(LSDV)模型训练总结(图片由作者提供)

*计算并打印 σ _ϵ 😗

*sigma2_epsilon = lsdv_model_results.**ssr**/(n*T-(n+k+1))
print(**'sigma2_epsilon = '** + **str**(sigma2_epsilon))*

我们得到 σ _ϵ: 的如下值

*sigma2_epsilon = **2.359048222628497***

计算 σ _pooled:

*sigma2_pooled = pooled_olsr_model_results.**ssr**/(n*T-(k+1))
print(**'sigma2_pooled** **= '** + **str**(sigma2_pooled))*

我们得到 σ _pooled 的以下值:

*sigma2_pooled = **2.4717633611733136***

计算 σ _u:

*sigma2_u = sigma2_pooled - sigma2_epsilon
print(**'sigma2_u = '** + **str**(sigma2_u))*

我们得到以下值:

*sigma2_u = **0.11271513854481663***

步骤 3:估计特定组的平均值

计算数据面板中各组(即每个单元 i )的y****_ IX****_ I值的平均值如下:

*df_panel_group_means = df_panel.**groupby**(unit_col_name).**mean**()**print**(df_panel_group_means)*

WB 数据面板的分组均值(图片由作者提供)

在上面的分组数据面板中,年份列可以忽略。

*让我们为这个数据帧添加一个存储回归截距的列。我们将在步骤 5 中使用该列来估计公共偏置 α 😗

*df_panel_group_means[**'const'**] = 1.0*

步骤 4:计算居中(减去平均值)的数据面板

在这一步中,我们将使用在第 2 步中计算的相应组特定平均值的缩放版本,对每个单元的所有 y _iX _i 值进行去平均。

*让我们来计算 θ 😗

*theta = 1 - math.**sqrt**(sigma2_epsilon/(sigma2_epsilon + T*sigma2_u))
print(**'theta = '** + **str**(theta))*

我们得到以下值:

*theta = 0.30975991786766044*

准备数据集,用于将 yy和 X 列居中:

*pooled_y_with_unit_name = pd.**concat**([df_panel[unit_col_name], pooled_y], **axis**=1)pooled_X_with_unit_name = pd.**concat**([df_panel[unit_col_name], pooled_X], **axis**=1)*

使用 θ- 缩放的组特定平均值,将每个 X 值居中:

*unit_name = ''
for row_index, row **in** pooled_X_with_unit_name.**iterrows**():for column_name, cell_value **in** row.**items**():if column_name == unit_col_name:unit_name = pooled_X_with_unit_name.**at**[row_index, column_name]else:pooled_X_group_mean = df_panel_group_means.**loc**[unit_name][column_name]pooled_X_with_unit_name.**at**[row_index, column_name] = pooled_X_with_unit_name.**at**[row_index, column_name] - theta*pooled_X_group_mean*

使用 θ- 缩放的组特定平均值将每个 y 值居中:

*unit_name = ''
for row_index, row **in** pooled_y_with_unit_name.**iterrows**():for column_name, cell_value **in** row.**items**():if column_name == unit_col_name:unit_name = pooled_y_with_unit_name.at[row_index, column_name]else:pooled_y_group_mean = df_panel_group_means.**loc**[unit_name][column_name]pooled_y_with_unit_name.**at**[row_index, column_name] = pooled_y_with_unit_name.**at**[row_index, column_name] - theta*pooled_y_group_mean*

步骤 5:使用减去平均值的数据面板估计随机效应模型系数β_i

最后,让我们在pooled_X_with_unit_namepooled_X_with_unit_name.上构建和训练 RE 模型

雕刻出 yX 矩阵:

*re_y=pooled_y_with_unit_name[**list**(pooled_y_with_unit_name.columns[1:])]re_X=pooled_X_with_unit_name[**list**(pooled_X_with_unit_name.columns[1:])]*

建立和训练 OLS 回归模型:

*re_model = sm.**OLS**(**endog**=re_y, **exog**=re_X)re_model_results = re_model.**fit**()*

打印培训总结:

***print**(re_model_results.**summary**())*

我们看到以下输出:

随机效应回归模型的训练总结(图片由作者提供)

这就完成了随机效应回归模型的估计过程。

检验随机效应的显著性

回想一下 σ _u 估计为 0.112723σ _ϵ 估计为 2.35905 。因此,可归因于单位特定随机效应的总方差的分数为:

***0.112723/(0.112723+2.35905)=*0.04560 即约 4%。

小规模的随机效应给出了第一个提示,即随机效应模型可能不适合这个数据集,而固定效应模型可能会提供更好的拟合。

我们可以使用 Breusch-Pagan LM 测试来测试随机效应的显著性。

breu sch-Pagan LM 检验的零假设是单位方差 σ _u 为零

测试统计如下:

检验随机效应显著性的 LM 检验的检验统计量 σ _u(图片由作者提供)

在 LM 检验的零假设下,检验统计量是卡方(1)分布的。

分母中的嵌套求和是我们在步骤 1 中拟合的混合 OLSR 模型的残差平方和。分子中的总和是来自混合 OLSR 模型的残差的分组均值的总和。请注意 ϵ 上的横条,它表明这是平均残差,以及“ i ”下标后的“点”,它表明该平均值是每组中所有时间段的集合。数据面板中有对应于 n 个单元的 n 个组。因此,分子中的总和从 1 到 n。

让我们计算一下世界银行数据集的这个统计值:

***#Concatenate the unit names column to the Dataframe containing the residuals from the Pooled OLSR model** df_pooled_olsr_resid_with_unitnames = pd.**concat**([df_panel[unit_col_name],pooled_olsr_model_results.**resid**], **axis**=1)df_pooled_olsr_resid_group_means = df_pooled_olsr_resid_with_unitnames.**groupby**(unit_col_name).**mean**()ssr_grouped_means=(df_pooled_olsr_resid_group_means[0]**2).**sum**()ssr_pooled_olsr=pooled_olsr_model_results.**ssr**LM_statistic = (n*T)/(2*(T-1))*math.**pow**(((T*T*ssr_grouped_means)/ssr_pooled_olsr - 1),2)print(**'BP LM Statistic='**+str(LM_statistic))*

我们看到以下输出:

*LM Statistic=**3.4625558219208075***

让我们打印出α= 0.05 时的临界卡方值:

*alpha=0.05
chi2_critical_value=st.**chi2**.**ppf**((1.0-alpha), 1)
print(**'chi2_critical_value='**+**str**(chi2_critical_value))*

我们看到以下输出:

*chi2_critical_value=**3.841458820694124***

在α= 0.05 时,LM 检验的检验统计量( 3.46256 )小于 3.84146 的卡方(1)临界值,这意味着在α= 0.05 时随机效应不显著。(不要把这个 α 和象征 RE 模型平均单位特效的那个搞混了!)

混合 OLSR、固定效应和随机效应模型的性能比较

在 WB 数据集上比较三个模型的性能将是有用的。对于合并的 OLSR 和有限元模型,我们将利用从相应的 文章中获得的这些模型的结果。

系数比较

我们发现三种模型估计的 GCF_GWTH_PCNT 回归变量的系数大致相同:

GCF_GWTH_PCNT 的系数(图片由作者提供)

拟合优度度量的比较

混合 OLSR、固定效应和随机效应模型的拟合优度比较(图片由作者提供)

我们看到,在固定效应模型中,调整后的 R 平方(在考虑了由于包含回归变量而导致的自由度减少后的 R 平方)比混合 OLSR 模型从 0.619 略微提高到 0.639,而随机效应模型在调整 R 平方方面几乎没有比混合 OLSR 模型提高。

FE 模型还产生了对数似然性从-300.29 到-292.91 的小幅增加,以及 AIC 评分从 604.6 到 601.8 的相应小幅改善(降低)。与有限元模型相比,RE 模型进一步提高了 AIC 得分,达到 597.1。

可以看出,有限元模型在拟合优度方面总体上优于混合模型(尽管差距很小),而随机模型的性能却并非如此。误差项方差中随机效应的微小贡献(4%)以及 LM 检验确定的其不显著性进一步证明了这一点。

以下是本文中使用的完整源代码:

参考文献、引文和版权

数据集

世界发展指标数据来自世界银行 CC BY 4.0 license 。 下载链接

纸质和图书链接

以下两本书基本上涵盖了面板数据分析领域,大多数从业者无需进一步研究:

巴蒂·h·巴尔塔吉, 面板数据的计量经济分析 ,第 6 版,施普林格

威廉·h·格林, 计量经济分析 ,第 8 版,* 2018,培生*

如果您是 Stata 用户,您可能会发现以下来自 Hun Myoung Park 的领域介绍和教程非常有用:面板数据建模实用指南:使用 Stata 的逐步分析

形象

本文中的所有图片版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。

吵闹的大象

原文:https://towardsdatascience.com/the-noisy-elephant-79e9071536e

无法获得更多数据?噪音小一点可能会有用

图 1 | 图片取自 DimaDim_art 来自 pixabay。

在制造业或医疗保健等更传统的行业,机器学*才刚刚开始展现其增加价值的潜力。这些行业的关键将是从以模型为中心转向以数据为中心的机器学*开发。[1]正如吴恩达(联合创始人 Coursera 和 deeplearning.ai ,谷歌大脑负责人[2])指出的,在这些行业,关键将是接受机器学*的“以数据为中心”的观点,重点是数据质量而不是数量。[3]

在这篇博文中,我们将探讨噪声(质量)和数据集大小(数量)对高斯过程回归的影响。[5]我们将会看到,提高数据质量并不会增加数据量,反而会提高拟合质量。我将分三步走。首先,我将介绍数据集。其次,我将定义要模拟并添加到数据中的噪声。第三,我将探讨数据集大小和噪声对回归模型准确性的影响。这些图和数值实验是使用 Julia 生成的。代码可以在 github 上找到。如果没有说明,这些数字是由代码(作者)生成的。

1.约翰·冯·诺依曼大象

为了探索数据集大小和噪声之间的关系,我们使用图 2 所示的冯诺依曼大象[6]。作为一个玩具数据集。

注: 约翰·冯·诺依曼(1903 — 1957) 是匈牙利出生的数学家。他在包括数学、物理、计算机科学和统计学在内的许多领域做出了重大贡献。在 1953 年与恩利克·费密的一次会面中,他批评了自己的工作,说“有了四个参数,我就能适应一头大象,有了五个参数,我就能让它扭动鼻子”[7]

图 2 | j . Mayer 等人[6]参数化的约翰·冯·诺依曼大象周长图

大象的周长(图 2)由一组点描述( x(t),y(t) ,其中 t 是一个参数。将 t 解释为时间 J. Mayer 等人【6】将 x(t)y(t) 分别展开为傅立叶级数

方程式 1 |傅立叶展开式

其中,上下标【T14(x,y)】表示 xy 展开,下下标 k 表示傅里叶展开中的第 k项。表 1 列出了 J. Mayer 等人发现的系数(A,B)。表 1 中列出的值还包括摆动参数摆动系数。=40* 和眼睛的坐标xₑ=yₑ=20【6】。*

表 1 |生成冯诺依曼象的傅立叶展开系数。[6]

事实上,我们需要 24 个实系数来制作大象,因为 k 的范围从 k=0 到 k=5,每个 k 需要四个系数。然而,J. Mayer 等人发现大多数系数可以设置为零,只留下八个非零参数。如果每对系数进一步总结成一个复数,大象轮廓(和躯干摆动)实际上被编码成一组四个(加一个)复数参数。

图 3 |冯·诺依曼象(左上)和傅立叶级数展开 x(t)(左下)和 y(t)(右上)的参数图。

在下文中,我们将使用曲线 x(t)y(t) ,其中t =[-π,π] 用于我们的实验(如图 3 所示)。

2.噪音

对于噪声,我们使用从均匀分布、标准正态分布或偏斜正态分布中抽取的随机数。噪声由伪随机数发生器产生。我们在 Julia 中使用基于 xoshiro 算法的默认伪随机数发生器。

2.1 均匀分布

当从连续均匀分布中取样时,区间*【a,b】中的每个实数都是等概率的。*图 4 显示了曲线 x(t)y(t) 包括直方图中的均匀分布噪声。在图 4 中,随机数的范围从 a=-1.5b=1.5

图 4 |显示了曲线 x(t)和 y(t)以及均匀分布噪声和噪声直方图(δx,δy)。噪声以 0 为中心,范围在[-1.5,1.5]之间。

2.2 标准正态分布

标准正态分布(也称为高斯分布)是实值随机变量的连续概率分布。方程给出了归一化概率密度函数(pdf)的一般形式。2

等式 2 |归一化概率密度函数的一般形式

其中参数μ是平均值(或期望值),σ是标准正态分布的方差。标准正态分布是一个对称分布,其均值、中位数和众数相等。标准正态分布在统计学中很重要的原因之一是中心极限定理。它指出,在某些条件下,许多具有有限均值和方差的独立随机变量的平均值的抽样分布接*正态分布,因为起作用的随机变量的数目趋于无穷大。[8]被认为是许多独立过程之和的物理量,如测量误差,通常是正态分布的。[9]因此,噪声通常可以*似为标准的正态分布。

图 5 |显示了数据 x(t)和 y(t)加上标准正态分布噪声以及噪声直方图(δx,δy)。噪声的均值为 0,标准差为σ=2。

图 5 显示了数据曲线 x(t)y(t) ,包括标准正态分布产生的噪声。在示例中(图 5),噪声的均值为μ=0,标准差为σ=2。

2.3 偏斜正态分布

偏斜正态分布代表一种非对称扰动正态分布。该分布可用于模拟不对称噪声,其中一条尾巴比另一条长。在偏态正态分布中,平均值和中位数通常是不同的。偏斜正态概率密度函数(pdf)的一般形式,如等式所示。3、是标准正态分布 pdf*φ(x ')*和误差函数ψ(α x ')的乘积。

等式 3 |偏斜正态概率密度函数

其中位置由ξ给出,标度由ω给出,参数α定义偏斜度。*φ(x’)*成为正态分布(方程式。2)对于等式中的α=0。3.通常,参数α被称为形状参数,因为它调节 pdf 的形状。如果α >为 0,则分布是右偏的,如果α <为 0,则分布是左偏的。

图 6 |显示了曲线 x(t)和 y(t)加上偏斜的标准正态分布噪声以及噪声直方图(δx,δy)。位置ξ=0,比例ω=3,形状α=4。

图 6 显示了数据曲线 x(t)y(t) ,包括偏斜正态分布产生的噪声。噪声是使用参数 location ξ=0,scale ω=3,shape α=4 生成的。

3.第一个实验:数据集大小和回归质量

对于第一个实验,让我们使用数据 y(t) 并添加由标准正态分布产生的噪声,其中 μ=0σ=2 (见图 5)。对于本例,我们采用如上所述的具有 N=1000 个数据点的数据集,从中随机选择 *10、50、100、*和 500 个数据点,如图 7 所示。为了拟合采样点,我们使用高斯过程。

为什么是高斯过程?除了被广泛使用之外,高斯过程在小数据集上工作得很好,并且与其他可比的机器学*方法相比,高斯过程在训练或推断期间更容易确定问题的原因。例如,高斯过程已经被月球探测器公司 X 在一个项目中使用,该项目是用平流层气球扩展互联网连接。利用高斯过程,每个气球决定如何最好地利用盛行风,使自己成为一个大型通信网络的一部分。[4]

图 7 |显示了高斯过程(a)对数据(蓝点)的拟合(青色线)和置信区间 0.95(蓝带),10(b)50(c)100(d)500 个数据点。

为了评估高斯过程回归的质量,我们基于真实值和拟合值之间的差异来计算误差。关于机器学*回归中的错误的简明介绍,参见参考文献。[10].在这里,我们计算平均绝对误差(MAE) 、均方误差(MSE) 、均方根误差(RMSE) 。表 2 列出了对应于我们上述回归(图 7)的 MAE、MSE 和 RMSE。

表 2 |对应于图 7 所示回归的 MAE、MSE 和 RMSE

从图 7 和 Tab。2,我们看到拟合的质量如何随着更多的数据点而提高。随着数据越来越多,拟合度越来越高,这并不令人惊讶。图 8 也在双对数图中显示了这种行为。

图 8 |显示了与图 7 /表 2 所示回归相对应的 MAE、MSE 和 RMSE。轴以对数刻度显示。灰色虚线表示用于比较的 1/N 比例。

我们看到,将点数从 N=50 增加到 N=500 会使 RMSE 降低 60%。稍后,我们将看到将噪声的影响减半会产生类似的减少。

**注意:**对于高斯过程回归,我们使用平方指数(se)函数作为核函数(等式)。4).在高斯过程回归中,SE 核是大多数机器学*库中的默认核。与其他内核相比,SE 有一些优势。例如,在其先验中的每个函数都是无限多次可微的。此外,它也只有两个参数:长度标度 和输出方差σ。长度标尺 决定函数中“摆动”的长度。输出方差σ决定了函数与其均值的平均距离。对于图 7 所示的拟合,我们选择了超参数 ℓ=8σ=75。

等式 4 |平方指数核

4.第二个实验:噪声类型的影响

接下来,我们使用数据 x (t) 并添加由三种不同分布产生的噪声:均匀分布、标准正态分布和偏斜正态分布,如章节所述。2 。对于均匀分布,我们从区间 a=-2.0b=2.0 进行采样。对于标准正态分布,我们使用参数 μ=0 表示平均值,使用参数 σ =4.0 表示方差。对于偏态正态分布,我们使用参数 ξ=0ω=2.0α=2.0 。对于所有三种分布,我们使用 N=1000 个数据点的数据集。从数据集中,我们随机选择了 500 个数据点,如图 9 的左栏所示。

图 9 |左栏:基于不同分布的曲线 x(t)和 y(t)加上噪声,以及噪声直方图(δx,δy)。右栏:显示拟合(青色线)采样点 y(t)+δy(蓝色点)和置信区间(蓝色带),由具有 500 个数据点的高斯过程给出。从上到下,它显示了从均匀(rand)、标准正态(randn)和偏斜正态(skewed)分布中提取的噪声。

我们使用高斯过程回归,就像之前在第二节中一样。3.高斯过程回归的结果显示在图 9 的右栏中。数据点显示为蓝色点,结果拟合为青色线。此外,我们看到拟合的置信区间(0.95)并将其可视化为蓝带。

对于均匀噪声和高斯噪声,均方根误差分别为 0.13 和 0.31。高斯拟合 RMSE 更高,因为噪声的方差也更大。偏斜的正常情况更困难。在高斯和均匀情况下,最小化拟合 RMSE 相当于找到最大似然拟合。然而,偏斜正态情况更困难,因为均值和众数(最大似然)是不同的。由于高斯过程回归优化最大似然拟合,而不是 RMSE 最小化,我们预计 RMSE 更高。事实上,RMSE 是 1.4,如图 9 所示。总之,我们看到了噪声的规模和形状如何影响我们所期望的拟合 RMSE。

5.第三个实验:噪音的影响

在第三个实验中,我们使用曲线 x (t) ,并添加均匀、标准正态和偏斜正态分布产生的噪声,如节所述。2 。我们按如下方式改变每个分布的噪声比例:

  • 均匀分布:[a,b] = {[-1,1],[-2,2],[-4,4],[-8,8]};平均值= 0
  • 正态分布:σ={1,2,4,8 };平均值 μ=0
  • 偏斜正态分布:ω={1,2,4,8 };参数 ξ=0α=2.0

我们对每个分布使用 N=5000 个数据点的数据集。我们从数据集中随机选择{50,100,500,1000}个点。对于数据点的规模、分布和数量的每种组合,我们使用高斯过程回归并计算拟合 RMSE 值,如前第节所述。3.RMSEs 在表中列出。下面 3。

表 3|生成数据中不同噪声等级的高斯过程回归的 RMSE。噪声采样自均匀、正态和偏斜分布。数据集大小从 50 到 1000 个数据点不等。

第三个实验表明,对于所有三种分布,数据点的数量必须随着噪声规模的增加而增加,以保持与 RSME 测量的相同的拟合质量。例如,从 N=100 个点的区间[-2,2](标度= 2)采样的均匀噪声开始,我们可以将点数增加到 N=1000,以减少 48%的 RMSE,或者通过从更小的区间-1,1采样来降低噪声,以减少 33%的 RMSE。看着标签。3,我们看到了其他尺度、数据集大小和噪声类型的类似权衡— 将噪声减半与将数据集大小增加 10 倍产生类似的改善。

6.结论

我们已经看到,更多的噪声数据导致更差的拟合。此外,即使对于相同的方差,噪声的形状也会对拟合质量产生深远的影响。最后,我们比较了改进数据质量和数量,发现降低噪声可以产生与增加数据点数量相似的拟合改进。

在工业应用中,数据集很小,更多的数据很难获得,理解、控制和减少数据的噪声提供了一种从根本上提高拟合质量的方法。有多种方法可以控制和有效地降低噪声。关于灵感,参见参考文献。[11].

参考

  1. 吴恩达“ AI 对你的业务来说不必太复杂或太昂贵 ”,《哈佛商业评论》(2021 年 7 月)
  2. 维基百科文章“ 吴恩达”(2021 年 12 月)
  3. 谷歌大脑 的联合创始人尼古拉斯·戈登(Nicholas Gordon)“不要相信‘大数据’的宣传”,fortune.com(2021 年 7 月)
  4. 詹姆士·威尔森、保罗·r·多尔蒂和蔡斯·达文波特" 人工智能的未来将是更少的数据,而不是更多的 ,《哈佛商业评论》(2019 年 1 月)
  5. 麦凯、戴维、j . c .《信息论、推理和学*算法 *》,*剑桥大学出版社。ISBN 978-0521642989(2003 年 9 月)
    Carl Eduard Rasmussen 和 Christopher K.I. Williams,“机器学*的高斯过程”,麻省理工学院出版社 ISBN 978-0262182539(2005 年 11 月)
  6. 于尔根·迈耶、哈立德·凯里和黄邦贤·霍华德“ 用四个复杂参数 画一头大象”,《美国物理学报》78,648,DOI:10.1119/1.3254017(2010 年 5 月)
  7. 弗里曼·戴森 与恩利克·费密 《自然》427,6972,297,DOI:10.1038/427297 A(2004 年 1 月)
  8. Julia Kho每个数据科学家都应该知道的一个定理,Medium.com—走向数据科学(2018 年 10 月)
  9. 库珀·道尔信号与噪音:中心极限定理如何使数据科学成为可能 ,Medium.com——走向数据科学(2021 年 9 月)
  10. Eugenio Zuccarelli “机器学*中的性能指标——第 2 部分:回归”,Medium.com——迈向数据科学(2021 年 1 月)
  11. Andrew Zhu “用 Python 中的傅里叶变换清理数据噪声”,【Medium.com】—走向数据科学(2021 年 10 月)

非公司特定的数据科学面试准备方法

原文:https://towardsdatascience.com/the-non-company-specific-approach-to-data-science-interview-preparation-98c86f2e3a47

数据科学面试

了解获得数据科学家工作所需的知识

在 Unsplash 上由 Van Tay Media 拍摄的照片

如果你曾经参加过数据科学职位的面试,你就会知道这不仅仅是通过一次面试。有电话筛选和多轮现场面试才能通过。无论你已经有面试或者只是在准备,光是想想你需要知道的一切就让人不知所措。

你到底需要知道什么?在这篇文章中,我们将消除面试准备中的一些恐惧和不确定性。我们将看看你在寻求分析驱动和算法驱动的数据科学家职位时会遇到的不同类型的面试,以及我推荐的高效和有效准备的非公司特定方法。一定要读完,这样你才不会错过为什么这个方法有效!

我们开始吧!

目录

  • 数据科学家的面试类型
    • 产品案例面试
    • SQL 面试
    • 概率与统计面试-
      -机器学*面试-
      -编码面试
    • 行为与体验面试
  • 我应该关注哪些面试?
  • 非公司特定方法的好处
  • 结论

数据科学家的面试类型

当面试一家科技公司的数据科学家职位时,你需要准备好面对多种类型的面试,所以准备的第一个关键部分是知道你应该期待什么样的面试,以及面试官在每次面试中对你有什么期望。

在我们深入研究不同的类型之前,让我们先多考虑一下这个过程。一旦你进入数据科学家职位的面试阶段,你能期待什么?面试通常包括 1 到 2 轮电话技术筛选和 4 到 6 轮现场面试。一些公司在面试过程中也有在线评估和带回家的作业。

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

这就是为什么你需要熟悉我将要概述的所有六种类型的面试。尽管你可能不会遇到所有的面试,但如果你想通过所有的面试并得到这份工作,你需要通过几次面试,这需要知道会发生什么。

因此,在我们讨论面试的类型时,我们将看看每一种面试是如何设计的,以及如何用它们来评估候选人。

产品案例访谈

产品案例面试,有时也被称为度量面试或业务案例面试,评估你的测量能力,以及你对产品和 a/b 测试的知识,这是数据科学家,尤其是分析驱动的数据科学家的核心技能。因此,产品案例面试旨在测试你的产品知识和批判性思维能力。

在产品案例面试中,给你一个商业场景或问题,然后要求你解释你解决问题的方法并提出建议。问题可能有很大不同,但可能包括以下内容:

  • 找出指标下降的原因
  • 设计实验
  • 决定是否推出产品。

一些面试问题示例如下:

  • 你能提供一些衡量用户参与度的指标吗?
  • 使用它们的利弊是什么?
  • 运行实验时需要考虑哪些事项?

要想在面试中表现出色,你需要展示出设计指标、诊断指标变化的能力,以及如何改进产品和解决业务问题的想法。要了解更多关于这种面试以及如何准备的信息,我推荐查看这个关于破解这种面试的完整播放列表,它不仅包括技巧,还包括真实面试问题的样本答案。

SQL 面试

SQL 面试至关重要,因为 SQL 在数据科学家的日常工作中经常使用。无论您是为小公司还是大公司工作,您都将始终如一地使用该工具进行数据分析、诊断问题并从数据中收集见解。因此,你必须在这次面试中表现出熟练程度。

SQL 面试将测试您对 SQL 语言、语法和功能的熟悉程度,但这还不是全部。它还将测试您在短时间内从逻辑上理解问题并创建高效查询的能力。这些问题包括以下内容:

  • 过滤数据
  • 连接不同的表
  • 根据用户活动或系统日志计算复杂的业务指标

这类面试我就不给出样题了,因为你可以在 Leetcode 和 Hackerrank 上找到很多样题。

概率统计面试

概率和统计面试非常专业。这些问题将测试你的应用统计和概率知识。作为数据科学家,应用统计学尤其重要。它帮助您领导 A/B 测试,进行数据分析,并做出数据驱动的决策。因此,在概率统计面试中,你必须证明你拥有完成工作所必需的技能。

这类面试中的问题可以是概念性的,例如:

  • 什么是 p 值?
  • 如何计算置信区间?
  • 你能解释一下中心极限定理吗?
  • 能列出线性回归的假设吗?

它们还可能涉及计算,例如:

  • 从 5 次抛硬币中获得 2 次连续正面的概率是多少?
  • 给定一些特定的条件,赢一局的概率有多大?

如果你想更好地理解统计学面试问题,请随意查看我的 YouTube 频道上的另一个播放列表,我在那里复*了一些常见问题和答案。

机器学*面试

机器学*面试与算法驱动岗位的职责密切相关。你必须展示你的机器学*基础知识。这些问题将涉及以下内容:

  • 机器学*模型如何工作
  • 不同模式的利弊
  • 处理不同数据集时应用的技术
  • 调谐超参数

这类面试的示例问题包括:

  • 什么是过拟合问题?
  • 你是怎么处理的?
  • 如何处理不平衡的数据集?
  • 随机森林模型中的随机是什么意思?
  • 评估分类模型的一些指标是什么?

关于机器学*面试的更多信息,我推荐我和我的朋友子的这个博客,他是谷歌的机器学*工程师。我的频道也有一个关于机器学*面试的播放列表,它涵盖了从机器学*面试概述到常见算法实现的各种主题。

编码面试

编码面试测试你的编码能力,包括对编程或脚本语言如 Python 的熟练程度。此外,你需要证明你拥有计算机科学的基础,包括对算法和数据结构的理解。

有人认为编码和 SQL 一样,其实不是。编码面试是指编码算法,如二分搜索法,快速选择和数据结构,如列表,堆栈,队列,树和图等。问题各不相同,从实现简单的算法,如快速选择,到解决更复杂的问题,包括使用搜索算法,如 BFS 或 DFS,对树或图形数据结构进行搜索**。**

在这次面试中,你需要对问题有逻辑的理解,并且能够在有限的时间内提出有效的解决方案。我不会给出这类面试的样题,因为你们大多数人都熟悉 LeetCode,在那里可以找到很多例子。

行为和经验访谈

数据科学家的最后一种面试是行为&体验面试。在这次面试中,你会被问到在假设的情况下你会怎么做,以及你过去是如何与他人合作的。你还会被问到过去的团队和项目。目标是确保你适应公司文化。

作为一名候选人,你不能忽视这次面试,认为它不那么重要,这一点很重要。它们当然非常重要!谷歌和亚马逊等大公司越来越重视这些面试。一些示例问题包括:

  • 能说说你之前做过的一个数据科学项目吗?
  • 你在目前或以前的工作中解决了什么问题,它对公司的整体成功有什么贡献?
  • 你能告诉我一次你超越职责的经历吗?
  • 你在过去的工作中遇到过哪些困难?你是如何解决这些问题的?

如果你想了解更多关于行为面试的知识,不要担心,我会帮你解决的。我还有一个关于行为面试的播放列表,包括如何在行为面试中展示过去的项目以及该做什么和不该做什么。

应该重点做哪些面试?

我们已经讨论了六种类型的面试,这是一个很大的工作量。在这一点上,记住你的目标职位的确切类型会影响你应该关注的面试,这是很有帮助的。如果你不确定你应该瞄准什么职位,那么我强烈推荐阅读这篇关于瞄准适合你的数据科学职位的博文。

虽然他们都是数据科学家,但分析驱动和算法驱动的角色确实不同,需要不同的技能,面试过程将反映这一点。**对于分析驱动的角色,你应该优先考虑产品案例和 SQL 访谈。对于算法驱动的角色,你应该专注于编码和机器学*。**概率和统计面试以及行为和经验面试对这两条路线都很重要。

非公司特定方法的好处

这就是面试的类型,在这一点上,你可能会开始感到不知所措。甚至当你考虑你的目标是什么职位时,仍然有很多面试准备工作要做。你应该如何处理这么大的任务?

我推荐的面试准备方法**是非公司特有的方法。**非公司特定的方法意味着专注于建立一个强大的基础,在处理面试问题之前,先在基础上工作,如统计、产品意识和 a/b 测试。

为了理解我为什么推荐非公司特定的方法,它有助于更仔细地研究替代方案,这将是一个公司特定的方法。很多人都是这样准备面试的。当他们得到一个特定公司的面试机会时,他们会在网上查找面试问题样本,并以此为面试做准备。

为什么我不推荐特定于公司的方法?第一个原因是你没有时间做好充分的准备。如果你等到实际上有面试的时候才开始准备,你将会在非常有限的时间里有很多内容要讲,尤其是如果你有不止一家公司的面试。有很多面试类型,所以如果你只有一次面试就开始,你将会做很多填鸭式的事情。你可能无法学*所有的东西,也没有时间真正学好任何东西。

有时,我有学生与我分享这种经历——“我无法相信我因为一个简单的 SQL 问题或一个简单的统计问题而没有通过面试。”

当我们调查为什么会发生这种情况时,通常会发现他们一直专注于在网上收集公司特有的问题,希望在真正的面试中得到完全相同的问题。结果是他们没有足够的时间复*基础知识,也没有准备好面试问题。

我不推荐公司特定方法的另一个原因是,它迫使你每次面试都从零开始,它留给你的是僵化而非灵活的工作知识。

如果你的准备侧重于学*你在网上找到的问题的答案,那么你可能不会无法适应与你所学*的不同的问题。这使得回答后续问题特别困难。如果你在网上找不到问题,或者面试官碰巧问了与你发现的不同的问题,这是很有可能的,那么你也很不幸。

相比之下,非公司特有的方法会让你有更深的理解,实际上也更有效率。你可以也应该在面试前开始,这意味着有更多的时间准备,如果你有多个面试,你可以同时准备。考虑到有多少类型的面试,能够有效地准备是非常重要的。

由布鲁克·卡吉尔在 Unsplash 拍摄的照片

一个非公司特定的方法更有价值,尽管它给你的知识类型。当你把注意力集中在基础问题而不是具体问题上时,你是在真正地学*而不是记忆。

这种方法迫使你对信息变得更加舒适和自信。当你用这种方法学*的时候,你就不需要每次面试都重新学*了,这也使得这种方法更加有效。

所以,当你开始准备面试时,不管你是否已经获得了第一次面试机会,我推荐一个更通用的方法。用这种方式学*可能会觉得信息太多,但从长远来看,这实际上会节省你的时间,帮助你更好地准备。

结论

本帖到此为止!记住,准备面试包括知道准备什么和积极主动地学*。不要等到你得到一个面试的机会,然后试图死记硬背!现在就开始学*吧!

说到学*,有六种类型的面试要准备,你可能想知道如何最大限度地利用你的学*时间。如果是这样的话,一定要看看这个博客,它会给你一些学*技巧来提高你的面试准备。

感谢阅读!

如果你喜欢这个帖子,想支持我…

  • 订阅我的YouTube 频道
  • 跟我上
  • 连接上Linkedin
  • 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!

非工程师的坏数据指南

原文:https://towardsdatascience.com/the-non-engineers-guide-to-bad-data-c5325d2b1458

为什么你最喜欢的仪表板坏了,以及如何修理它们。

图片由 Shutterstock 上的 fizkes 提供,购买使用标准许可。

根据 HFS 、、最*的一项研究,75%的高管不相信他们的数据。以下是为什么以及依赖数据的团队可以做些什么。

现在是周一早上 8 点 45 分——还有 15 分钟,你就要和你的营销主管进行电话讨论上个月广告活动的表现了。

为了准备会议,您在 Tableau 中刷新了一个仪表板(就是您每个月用于这个会议的那个仪表板!)来可视化一个新的推广对你网站访客数量的影响。

浏览了一下报告,你愣住了。

数据是完全错误的——11 月份的 50,000 次独立月访问量怎么会下降到 12 月份的 500 次?

呀。你在检查错误的仪表板吗?

不,是同一份(营销广告支出报告——很好——用这份——V2)。你快速侦查的尝试让你回到了起点。

你的下一个策略是什么?给数据部的吉尔发几条宽松的信息。

“为什么这个报道是错的?”

“我看到的是上个月的数据吗?”

“我们的营销主管会不高兴的。”

没反应。

时钟在上午 9 点敲响。你别无选择,只能两手空空地登录 Zoom,却一无所知。谁需要数据呢?

如果这种情况似曾相识,请放心:你并不孤单。

对于很多数据驱动的专业人士来说,这个问题, 数据宕机 ,是经常发生的事情,导致失去信任,浪费时间,处处让老板沮丧。数据宕机指的是数据丢失、不准确或出现其他错误的时间段,并且很少得到应有的关注。

您没有相信您的数据能够为决策提供信息,而是被迫质疑您团队的报告和仪表板是否可靠,以及从长远来看,您公司的任何数据是否可信。事实上,根据 HFS 研究公司 2021 年的一项研究,75%的高管不相信他们的数据。

但是事情并不一定是那样的。

在本文中,我们将介绍贵公司数据宕机的主要症状,强调数据中断的首要原因,并分享将信任和可靠性带入仪表板的更好方法。

但是首先:关于无畏的数据工程师的一句话。

在我们深入探讨之前,我要感谢现代数据团队的无名英雄: 数据工程师 **,**往往是抵御破碎仪表盘和报表的第一道防线。

每当你向你公司的数据工程师询问丢失的数据时,你可能会得到这样的回答(或者类似的话):“让我调查一下。”

如果你的 CMO 的主要目的是修改你的报告,那么每月与他们的会面会容易得多,但他们有很多事情要做,然而他们为组织带来的价值常常被忽视。

从回应来自分析团队的特别请求到构建您组织的数据基础设施(这样您就可以了解您的新登录页面有多粘,或者新功能在减少客户流失方面有多有效),成为一名数据工程师极具挑战性。数据工程师还确保数据在正确的时间流向正确的地方,将新的数据源纳入数据生态系统,构建新的数据产品,并设计更具弹性的数据系统。

在处理数据停机时,这些责任甚至还不算什么。

当您的数据出现问题时,他们会立即找出发生了什么(通常称为 根本原因分析 )、对业务的影响以及如何修复它。

为了把握这个责任的轻重,了解破碎数据对你公司的影响是有帮助的。

不良数据对您业务的影响

一个糟糕的仪表板就能毁掉一次完美的会议。图片由卢克·切瑟在 Unsplash 上提供。

不准确的报告、在会议中感到措手不及,或者缺少工作所需的重要信息,这些都是糟糕数据的常见后果,但现实对公司的底线有着更大的影响。

以下是一些与数据质量差相关的切实的业务问题,也许它们会引起共鸣:

  • **收入损失:**这是显而易见的:数据支持您的业务目标,从帮助您重新锁定潜在客户到优化客户体验。如果你的营销团队使用活动数据来预测广告支出,你的营销团队可能会在这些工作上超支或支出不足。
  • **资源分配不当:**数据宕机的最大后果之一是预算分配不当,这是由陈旧或不准确的数据导致的,这些数据为推动决策制定的关键报告提供了动力。如果你的季度预测显示,在密苏里州的堪萨斯城开一家新餐馆的最佳市场是,在你花费数百万美元开一家新餐馆之前,你最好确定数据是正确的。
  • **用于创新的时间更少:**平均而言,数据工程师每周花费超过 20 个小时 来调查和解决数据火灾演*。由于数据工程师一半以上的时间都用于解决数据质量问题,因此他们从事增值活动的能力有限,例如构建实验平台或其他产品来改进公司的产品和服务。

最终,坏数据会耗费你公司每个人的时间和金钱,而不仅仅是数据工程师。

在这种背景下,让我们回到最初的问题:为什么数据会损坏,以及如何帮助您的数据工程师修复它?

那么,数据为什么会断裂呢?

数据损坏可能有数百万种原因,由数据工程师来确定根本原因。图片由 Shutterstock 上的彼得拜尔提供。

数据中断的原因有很多,通常归结为不止一个根本原因。(我们就不说技术术语了,但好奇的读者应该去看看奥莱利关于数据质量的新书https://www.oreilly.com/library/view/data-quality-fundamentals/9781098112035/,了解数据可靠性和可信度的来龙去脉)。

当你和你的数据工程朋友一起修理你的仪表板时,它有助于理解幕后发生的事情。以下是即使是最懂数据的公司也面临的一些常见数据质量问题:

  • ****应用业务逻辑的系统出现故障:通常情况下,数据工程师会运行定制代码,将业务逻辑应用于数据(即特定范围内的值)。有时,SQL(或 Python 或 Apache Spark)命令完全失败,有时它不能正常运行,这两种情况都会导致坏数据从裂缝中溜走,破坏下游的仪表板。
  • 坏源数据:**当一个数据集或表格包含重复记录、不完整数据、过期列或格式不一致的数据时,我们称之为坏源数据。错误的源数据可能会中断进入报表、仪表板和产品的数据流。
  • ****未能验证您的数据:在数据被清理并采用适合您业务的格式后,需要对其进行验证,或者换句话说,根据业务要求进行检查,以确保数据有意义且正确。如果工程师无法验证他们的数据,坏数据进入有价值的仪表板和报告的可能性就会增加。
  • ****模式的意外变化:如果你不熟悉模式,它基本上是数据的 DNA。模式构成数据库和数据仓库,并包含如何设计数据库的说明。有时,当将代码推向生产时,工程师可能会在代码中出现一个小错误(例如将表名从“customer”更改为“customers”),这反过来会导致一系列问题。这些变化通常会被忽视,直到事实发生,损害已经造成。
  • ****bug 被引入代码:把 bug 想象成代码的错误或意外行为。随着公司的成长,预测和捕捉每一个可能发生的错误会变得非常困难,尤其是当代码变得越来越复杂的时候。错误代码是每个行业数据停机的主要原因,甚至导致一个价值 1 . 25 亿美元的 NASA 探测器崩溃。
  • ****贵组织运营环境的更新/变更:数据问题的另一个常见原因是运行数据作业的运营环境的变更,换句话说,是数据生命周期中的一个阶段。这背后的原因各不相同,从长时间运行的查询到意外丢失或放错数据的作业计划的更改。(通过我的同事弗朗西斯科了解更多关于这个话题的信息。

既然我们已经知道了损坏数据的症状、影响和原因,那么实际上我们该如何修复它呢?

如何用可观测性防止不良数据

数据可观察性为公司提供了一个 10,000 英尺的数据健康视图,帮助他们利用更准确的数据做出更好的决策。图片由哑光贵族在 Unsplash 上提供。

幸运的是,我们可以超越疯狂的懈怠信息和烦扰的文本,向我们在数据工程领域的朋友保持领先,以打破仪表板和报告。然而,要实现这一点,我们首先需要了解数据的健康状况。

一种越来越受公司欢迎的防止数据停机的方法是通过 数据可观测性 ,这是一种以协作和整体方式大规模处理数据质量的新方法。通过确保数据工程师在坏数据到达您的仪表板之前首先了解坏数据,数据可观察性有助于公司了解其数据在任何给定时间点的可靠性和可信度。

通过数据可观察性,即使是分析师和其他了解数据的业务用户也可以获得关键数据问题的警报,从而避免因凭直觉做出决策和丢失数据而导致的沮丧、尴尬和收入损失。现在,数据工程师可以在公司其他任何人意识到有问题之前排除故障并解决这些问题。

如果您的数据损坏并导致下游问题,可观察性使您的数据团队能够了解损坏的报告的影响,以便您可以相应地纠正过程,并防止丢失的值在周一上午的会议中造成影响。

在此之前,祝您拥有完美的仪表盘、准确的预测,最重要的是,没有数据宕机。

想了解 数据可观察性 如何修复您组织的破损仪表板和报表?

向巴尔伸出援手,团队在 蒙特卡洛 进行更多了解。

斯科特·奥利里 对本文有贡献。

笔记本引发的回归

原文:https://towardsdatascience.com/the-notebook-induced-regression-fc46b0e7f1dd

意见

笔记本的大量采用如何对数据科学中的代码质量产生负面影响

洛伦佐·埃雷拉在 Unsplash 上的照片

每个数据科学家都熟悉笔记本的定义:一个用于以交互方式编写和运行计算机程序的网络界面。笔记本可以连接到几个被称为内核的计算后端:它们提供了运行诸如 PythonRJulia 等许多其他语言所需的 API。

如今,笔记本电脑在很大程度上被社区所使用,特别是用于技术科学计算,如数据处理、机器学*和人工智能/深度学*任务。

笔记本有很多优点

笔记本为用户提供了一个完全交互式的环境,用户可以在其中写笔记和文档(即使有 Latex 支持),编写和运行特定部分的代码(即笔记本单元),并以数字或图形形式显示结果(如数据帧和图表)。因此,笔记本电脑丰富了基于控制台的方法,提供了身临其境的基于网络的编码体验。

JupyterLab 会话中的运行单元格-作者图片

事实上,我认为笔记本在很多方面都是一个很好的工具。它们允许快速开发和测试代码。它们也非常适合教学和演示。

我碰巧参加的任何基于代码的课程都是基于笔记本的。每当我教授包含代码的课程时,我也会使用笔记本,以便在课堂上演示和讨论例子和练*。

马修·奥斯本在 Unsplash 上拍摄的照片

最后但并非最不重要的是,笔记本可以无缝地用来创建漂亮的演示文稿,因为它们允许显示代码和开发过程中遵循的工作流程所获得的结果(并且根据 T2 文化编程的概念)。为此,笔记本可以导出并保存为 PDF、Latex 或 HTML 文档

相同的概念,许多产品

鉴于这一工具的广泛流行,在过去几年中已经开发了许多不同的笔记本电脑解决方案。一些最著名的包括 JupyterAmazon SageMaker (作为 AWS 工具的一部分)和 Google Colab ,但是还有许多其他的存在。你可以在这个网站上找到一个相当详尽的概述。

Jupyter 徽标,来自 Jupyter 主页——根据记名使用规则允许复制

从历史上看, Jupyter 是 2014 年作为 IPython 项目的副产品开发的第一款笔记本电脑。它是基于 Python 的完全免费的产品。它可以通过 pip 轻松安装,笔记本网络服务可以在本地运行(例如,在用于访问笔记本的同一台机器上)或通过网络运行。最*还推出了 JupyterLab ,它带有更高级的界面和附加功能。

又快又脏?

现在我们来看痛苦的音符。出于同样的原因,笔记本能够快速编写代码,笔记本用户的方法通常都是由良好的编程实践激发的。

以我的经验来看,主要是 Python,笔记本经常被糟糕的代码组织所困扰。例如,包的导入,在任何代码的开始都应该是总是的,被沿着单元传播,因为它们只是被插入到需要它们的地方。

因为笔记本并不鼓励创建像类和函数这样的结构,所以大部分代码都是由脚本和代码片段来表示的,但是当有类和函数时,它们也会沿着单元格分布,这符合已经提到的“我在需要时放置它”的原则。

互联网上常见笔记本电脑的典型结构—作者图片

对笔记本进行版本控制是有问题的

笔记本的另一个相关问题是代码版本。基本上,笔记本是 JSON 文件,表示单元格的输入(即代码或文本)、输出(即计算结果)和格式化元数据。当涉及到用版本控制系统组织笔记本的代码时,处理拉取请求和代码审查变成了一项复杂而令人沮丧的任务。

忘记清除输出使得比较一个文件的不同版本变得非常不切实际。但是即使没有输出,逐行比较仍然需要很大的耐心,因为我们必须处理格式化元数据带来的大量样板文件。

祝代码审查好运!—作者图片

协作也有问题

版本问题的直接后果是,开发人员之间的有效协作变得很难完成。我必须承认,有几次我发现自己通过电子邮件发送和接收笔记本,因为,尽管这是一种可悲的做法,但它仍然比试图使用 git 更方便。

有了这种(不好的)做法,同事之间交换困惑的问题是很常见的。

脚本的最新版本是什么?我可以用你一小时前寄给我的这个吗?你知道我昨天对这个函数的修改在哪里吗?

最后,难怪你会发现自己重复做同样的工作两次,也许是因为在这个“协作过程”中出了问题。毕竟, VCS 正是为了避免这些恼人的情况而被创造出来的。

原型与生产

许多数据科学家没有强大的 IT 背景,因此笔记本对他们来说是一个方便的工具。只需很少的努力,他们就可以处理数据,建立复杂的计算管道,开发尖端技术。从这个意义上来说,今天的笔记本电脑与多年前的 Matlab 非常相似(尽管程度较轻,但仍然如此):一个为工程师、研究人员和科学家设计的易用 IDE

然而,虽然像 Matlab 这样的工具很自然地在原型和生产级代码之间带来了清晰的界限,但是像 Python 这样的语言使得这一界限更加模糊。Python 生态系统足够灵活,可以容纳原型和生产系统。数据科学代码通常被设计为处于这些领域的中间,因为通常:

  • 它托管在公司服务器上,
  • 它的执行是用户触发的,然而
  • 它通常以一定的周期运行,
  • 有时,它必须在很短的时间内频繁运行(例如,由于项目的截止日期)。

底线

长话短说,笔记本是快速代码开发和测试的伟大工具。他们对于教学、以及展示和讨论用例也非常有用。

然而,在这些情况之外,特别是当目标是开发一个高质量的协作代码笔记本应该尽可能少地使用**。**

当它们存在时,在代码经过测试和验证之后,它们应该根据所用语言的最佳实践进行翻译和重新安排。

数据设计的晦涩艺术

原文:https://towardsdatascience.com/the-obscure-art-of-data-design-397ffb230596

为数字时代对抗尴尬的新炼金术

数据职业空间被令人厌恶地夸大了。不是夸大其词(这里的 从数据中获得的难以置信的价值),而是更像是“错误键入”——许多人出于所有错误的原因产生数据嗡嗡声。

兴奋的正确理由与一句老话有关,知识就是力量:改善你的业务、工作、个人生活和你周围世界的力量。随着存储和处理知识原材料的技术进步,有如此多的潜力等待着被发掘。这值得几卡车的炒作。

但是我希望你能和我一起对错误的类型说不:不要把数据等同于魔法。垃圾不会变成金子,不管你对它投入多少数学。工业界对数据炼金术的迷恋,就像 15 世纪对在铁屑上喃喃自语的拉丁语胡言乱语的迷恋一样令人尴尬。

不要把数据等同于魔法。

我希望我们都停止用大写字母“D”来读数据。数据并不神奇——仅仅因为你有一个充满数字的电子表格,并不保证你能从中获得任何有用的东西。GIGO 原则一如既往地适用。

垃圾进,垃圾出。

数据不是事实。远非如此。让我们用一个例子来说明这一点。下图是美国的象征,自由钟。在继续阅读之前,花点时间记下这个标志性物品所在的城市。

图片由作者改编自维基百科。

现在想象一下,你正在为一个旅游组织工作,你的任务是在你的用户人群中收集美国最令人愉快的度假目的地的数据。您创建了一个在线调查,邀请用户通过一个开放的表单字段告诉您他们最喜欢的三个旅游城市。会出什么问题呢?

作者创建的 Google 表单截图(心情沉重,因为这个调查太糟糕了)。

稍后,当你查看回复时,你会注意到一些关于自由钟城市的条目…

哦不。

诺诺诺诺诺诺。

这到底是什么奖励?

脱发症?

Phi-load-elphia??

Phpiladelphia???

在这一点上,最好把它拼写成 Pffffftiladelphia,因为这些用户生成的输入对你有好处。但是,让我们对人类慷慨一点,让我们自己有片刻的感激,因为正确的答案出现在了这辆小丑车上。但是哪个才是正确答案呢?

这个吗?

当然,但是这些怎么样?

这四个答案都不错…但是同一条目的四个不同版本并不是有自尊心的数据人的好主意。这不是扑克。如果你正在从你的数据中寻找最清晰、最干净的信号,那么*似的副本不是你的朋友。

此外,仅仅因为这些回答在技术上是正确的,并不意味着你会喜欢处理它们。例如,一个逗号——就像宾夕法尼亚州费城的一个逗号——可能会破坏您的 CSV 文件。为什么,哦为什么,你让用户这样对你?

这种情况很搞笑,但也很可悲。都是!哲学,真的。但更重要的是,这种情况是可以预防的*。*

在这个例子中,回答者真诚地试图提供帮助。没人想惹你。你让人们告诉你他们喜欢参观哪些城市,他们尽了最大努力。如果他们能正确拼写,也许他们会。这不像他们的答案是火星或他们的猫的名字什么的…他们真的是想告诉你,费城是一个不错的城市。

这些条目中的每一个都有费城的信号,但它们并不都一样。其中一些比其他的信号弱得多。你在追求尽可能多的信号,但是如果你让人们随心所欲地输入他们的数据,许多信号将会丢失,你将需要花费时间、精力和资源来清理这些信号以恢复它们。然而,如果你一开始就聪明地设计了这个数据集合,那么每个费城条目都将是信号,没有噪音。

再举一个例子,请看这张我在布鲁克林玉米卷工厂拍的照片。这是一家很棒的餐馆,菜单很丰富,顾客可以在便签卡上写下他们想要的任何东西。这里有一堆订单需要员工处理(我的订单在中间)。人类很神奇,因为他们能理解所有这些不同的格式,但请注意这些格式是如何随处可见的。我敢打赌,有些时候,即使是这个地方的胡说八道的员工也会因为顾客头脑中有意义的东西而感到困惑。还有其他收集数据的方法。更好的方法。不过,这里的食物是一流的。

如果任其自生自灭,人们会发现挫败你的数据收集意图的非凡方法。如果你把设计数据收集留给那些没有预见和预防问题的技能的人,你将浪费时间和金钱去清理一个混乱的数据集。(有时候,再多的努力都没有用,而且永远都毁了。)数据清理是圣人的工作,但应该是万不得已的工作。聪明地计划要比希望你能通过勤奋的清理来修正糟糕的计划好得多。

如果任其自生自灭,人们会发现挫败你的数据收集意图的非凡方法。

这就引出了我的主要观点。人们不是直观有序的数据设计者。设计数据收集需要专业知识,这样才能更快、更容易地让数据变得可用和有用。

还记得互联网看起来好像每个程序员都幻想自己是设计师吗?恶心。当没有人花时间去学*一些数据设计技巧时,数据集大概就是这个样子。

如果您对让数据变得有用感兴趣,我强烈建议您熟悉以下两个主题:

  • 主数据与继承数据
  • 真实世界数据收集

我欣喜若狂,因为我认识的一些最有激情的数据设计师最*发布了一份关于数据设计主题的培训手册,即数据卡行动手册。如果你对数据很认真的话,一定要去看看!

拿到这里:bit.ly/datacardsplaybook

记住,数据不欠你什么。对你的麻烦来说连像样的质量都没有。永远无法保证你的数据不是垃圾。如果你的组织中有数学魔法思维,并且你认为获取数据是容易的部分,那么你会忽略雇佣那些真正擅长确保这些数据不是垃圾的人。

是时候让我们开始重视制作好数据所涉及的技能了,至少要重视让现有数据变得有用的技能。

说到垃圾进,垃圾出,你的作者走进这个地方,出来的时候一模一样。_(ツ)_/

感谢阅读!YouTube 课程怎么样?

如果你在这里很开心,并且你正在寻找一个为初学者和专家设计的有趣的完整的应用人工智能课程,这里有一个我为你制作的娱乐课程:

点击在 YouTube 上欣赏课程。

又及:你有没有试过在 Medium 上不止一次点击拍手按钮,看看会发生什么? ❤️

寻找动手 ML/AI 教程?

以下是我最喜欢的 10 分钟演练:

  • AutoML
  • 顶点 AI
  • 人工智能笔记本
  • ML 为表格数据
  • 文本分类
  • 图像分类
  • 视频分类

不要忘记访问数据卡行动手册!

在这里获得:bit.ly/datacardsplaybook(图片由玛希玛·普什卡纳,剧本创作人之一,经许可使用)

尽管该网站强调数据文档和人工智能(必须抓住那个时代精神),但数据卡剧本远不止这些。这是我所知道的最强大的通用数据设计资源集。预览:

在这里获得:bit.ly/datacardsplaybook(图片由玛希玛·普什卡纳,剧本创作人之一,经许可使用)

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 、 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。

成为熊猫专家你应该掌握的 30 种方法

原文:https://towardsdatascience.com/the-only-30-methods-you-should-master-to-become-a-pandas-pro-749795084bb2

在使用熊猫三年多之后,这里是我几乎一直使用的 30 种方法

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

Pandas 无疑是 Python 中为表格数据争论和处理任务而构建的最好的库之一。

由于是开源的,来自世界各地的众多开发人员为它的开发做出了贡献,并使它达到了今天的水平——支持各种任务的数百种方法。

然而,如果你是一个新手,并试图在熊猫图书馆得到一个稳固的位置,如果你从熊猫的官方文件开始,事情一开始会显得非常令人生畏和令人不知所措。

主题列表如下所示:

熊猫官方 API 文档中的主题列表(图片由作者提供)(来源:此处)

我自己也去过那里,这个博客旨在帮助你开始接触熊猫。

换句话说,在这篇博客中,我将回顾我 3 年多来使用熊猫的经验,并分享我几乎一直使用的 30 种具体方法。

你可以在这里找到这篇文章的代码。

我们开始吧🚀!

导入库

当然,如果你想使用熊猫库,你应该导入它。这里广泛采用的惯例是将pandas的别名设置为pd

#1 阅读 CSV

CSV 通常是读取熊猫数据帧最流行的文件格式。

你可以使用pd.read_csv()方法创建一个熊猫数据帧:

我们可以验证使用type()方法创建的对象的类型。

#2 将数据帧存储到 CSV

正如 CSV 普遍用于读取数据帧一样,它们也广泛用于转储数据帧。

使用如下所示的df.to_csv()方法:

分隔符(sep)表示列分隔符,而index=False指示 Pandas而非将数据帧的索引写入 CSV 文件。

# 3–4 创建数据框架

为了创建熊猫数据帧,使用了pd.DataFrame()方法:

从列表列表中

一种流行的方法是将给定的列表转换成数据帧:

从字典上

另一种流行的方法是将 Python 字典转换成数据帧:

你可以在这里阅读更多关于创建数据框架的信息。

#5 数据帧的形状

数据帧本质上是一个带有列标题的矩阵。因此,它有特定的行数和列数。

可以用shape参数打印尺寸,如下所示:

这里,元组的第一个元素(2)是行数,第二个元素(3)是列数。

#6 查看前 N 行

通常,在现实世界的数据集中,您会有许多行。

在这种情况下,人们通常只对查看数据帧的前几行n感兴趣。

您可以使用df.head(n)方法打印第一个n行:

#7 打印列的数据类型

Pandas 为数据帧中的每一列分配适当的数据类型。

您可以使用dtypes参数打印所有列的数据类型:

#8 修改列的数据类型

如果你想改变一个列的数据类型,你可以使用如下的astype()方法:

# 9–10 打印关于数据帧的描述性信息

方法 1

第一种方法(df.info())用于打印缺失值统计和数据类型。

方法 2

这相对更具描述性,并打印标准统计数据,如meanstandard deviationmaximum等。每个数值型列的。

方法是df.describe()

#11 填充 NaN 值

在现实世界的数据集中,缺失数据几乎是不可避免的。

这里,您可以使用df.fillna()方法将它们替换为一个特定的值。

在我之前的博客中阅读更多关于处理缺失数据的内容:

#12 连接数据框

如果想用连接键合并两个数据帧,使用pd.merge()方法:

#13 排序数据帧

排序是数据科学家用来排序数据帧的另一种典型操作。

您可以使用df.sort_values()方法对数据帧进行排序。

#14 对数据帧进行分组

要对数据帧进行分组并执行聚合,请在 Pandas 中使用groupby()方法,如下所示:

#15 重命名列

如果您想要重命名列标题,请使用df.rename()方法,如下所示:

#16 删除列

如果你想删除一列,使用df.drop()方法:

#17 添加新列

添加新列的两种广泛使用的方法是:

方法 1

您可以使用赋值运算符来添加新列:

方法 2

或者,您也可以使用如下的df.assign()方法:

# 18–21 过滤数据帧

基于条件过滤数据帧有多种方法。

方法 1:布尔过滤

这里,如果一行上的条件评估为True,则选择该行。

对于要过滤的行,**col2**中的值应大于 5

isin()方法用于选择其值属于一个值列表的行。

你可以在我之前的博客中读到基于字符串的过滤:

</5-string-based-filtering-methods-every-pandas-user-should-know-48021938412e>

方法 2:获取列

您也可以按如下方式过滤整列:

方法 3:按标签选择

在基于标签的选择中,要求的每个标签都必须在数据帧的索引中。

整数也是有效的标签,但是它们指的是标签而不是位置。

考虑下面的数据帧。

我们使用df.loc方法进行基于标签的选择。

但是在df.loc[]中,不允许使用位置来过滤数据帧,如下图所示:

为了达到上述目的,您应该使用df.iloc[]进行基于位置的选择。

方法 4:按职位选择

# 22–23 在数据帧中查找唯一值

要打印一列中的所有不同值,请使用unique()方法。

如果您想打印唯一值的数量,请使用nunique()代替。

#24 将函数应用于数据帧

如果您想对列应用函数,使用如下所示的*apply()*方法:

您也可以将一种方法应用于单个列,如下所示:

# 25–26 处理重复

您可以使用df.duplicated()方法标记所有重复的行:

所有重复的行被标记为,keep =假。

此外,您可以使用df.drop_duplicates()方法删除重复的行,如下所示:

保留重复行的一个副本。

#27 寻找值的分布

要查找列中每个唯一值的频率,使用 value_counts()方法:

#28 重置数据帧的索引

要重置数据帧的索引,使用df.reset_index()方法:

要删除旧索引,请将drop=True作为参数传递给上述方法:

#29 查找交叉列表

要返回跨两列的每个值组合的频率,请使用pd.crosstab()方法:

#30 旋转数据框

数据透视表是 Excel 中常用的数据分析工具。与上面讨论的交叉表类似,Pandas 中的数据透视表提供了一种交叉制表的方法。

考虑下面的数据框架:

使用pd.pivot_table()方法,您可以将列条目转换为列标题:

恭喜🎊,你已经了解了熊猫最有用的 30 种方法。

总之,我可以自信地说,你可能会在 95%的时间里用这些方法和熊猫打交道。

这项研究得到了我自己的经验以及与其他数据科学家的合作和看到他们的工作的支持。

感谢阅读。我希望这篇文章是有帮助的。

🚀订阅每日数据科学。在这里,我分享关于数据科学的优雅技巧和诀窍,一天一个技巧。每天在你的收件箱里收到这些提示。

🧑‍💻成为数据科学专家!获取包含 450 多个熊猫、NumPy 和 SQL 问题的免费数据科学掌握工具包。

✉️ 注册我的电子邮件列表 不要错过另一篇关于数据科学指南、技巧和提示、机器学*、SQL、Python 等的文章。Medium 会将我的下一篇文章直接发送到你的收件箱。

ML 的开环——第一部分

原文:https://towardsdatascience.com/the-open-loop-of-ml-ee86a4597955

心理效应如何阻碍了多发性硬化症的发展

在过去的几年里,我观察了数百名学生和工程师构建机器学*模型。我有很多机会成为工程学院项目竞赛的评审团成员。类似地,我在一些黑客马拉松中担任评委,我看到参赛者在 36 或 48 小时内构建模型和系统,夜以继日地工作。作为我职责的一部分,我审查了许多实*生的工作,也面试了几个 ML 工程职位的候选人。

他们都旨在解决具有挑战性和突破性的问题。他们希望检测癌症、预测欺诈和估计项目延迟。让我惊讶的是,准确率始终在 90%以上,有时甚至超过 95%。

在 Unsplash 上由 Austin Distel 拍摄的照片

那么,我问自己,问题出在哪里?一方面,有如此多的精确模型来解决如此严重和重要的问题;另一方面,实际使用中几乎没有这样的系统。我们在经典软件中看不到这样的差距。在进入 AI/ML 之前,我写的是常规软件。作为一家健康信息公司的联合创始人,我为医院和临床医生开发软件。在那个世界里,解决一个重要问题并正常工作的软件总是有吸引力的。换句话说,如果一个非常需要的系统的开发者对它的准确性感到满意,那么这个系统在现实世界中被使用的机会就非常高。

我知道传统软件和 AI/ML 系统的开发和使用方式有很多不同。但是这些都不能解释这种非常精确的系统和几乎没有部署的系统之间的奇怪差距。

据我所见,这种现象的原因主要是心理上的。这是一种存在于软件开发人员头脑中的效果。但必须认真对待,因为它影响着整个 AI/ML 范式的进步。

这是关于结束。一个程序的开发者什么时候得到终结?程序是开发者的创造。像所有的创造一样,你写的每一个程序都会永远伴随着你。但是当其他人接受或者认可它的时候,你就得到了某种终结。

在传统软件中,这分两步进行。首先,有测试程序的测试人员。一旦这样做了,开发人员就会感到某种轻松。宝宝现在在现实世界里。但这并不总是发生。当我为医生写第一个软件时,我是一个人,没有测试人员。所以我直接进入第二步,也就是用户使用程序的时候。

请记住,我不是在谈论任何程序的错误修复等。这是你的创作被人利用的纯粹心理现象。毫无疑问,错误会被报告出来,你需要一段时间来修复它们,有时是几年。但是当其他人测试或使用程序时,而不是在修复了每个报告的 bug 之后,就会发现闭包。

在机器学*中,我观察到了一种新颖的闭合模式。就像我说的,我已经看到了很多 ML 系统的建立。建立机器学*模型本身涉及两个步骤——训练和测试。这里的“测试”是一个技术术语,是模型开发过程的一部分。它不是由测试人员或用户完成的事情。

我想描述的新奇事物从这个过程产生的东西开始。除了模型本身,大多数模型训练算法最终都会产生一个名为“准确度”的数字。有时候,这很简单——比如 90%的准确率。在某些情况下,措施更加复杂。我们将暂时忽略实际的度量,只注意过程产生它自己的精度度量。例如,如果您使用基本的 scikit-learn 来训练逻辑回归模型,或者使用 TensorFlow 来构建基于 CNN 的图像分类器,您将获得这个神奇的数字。

这个数字对开发者的头脑有着同样神奇的作用。造物主的封闭变得即时和自动可用。不需要测试人员,也不需要无休止地等待程序被实际使用——开发人员在模型创建过程的最后就找到了验证。

开发人员发现满意度的准确性随着开发人员的职位和经验而变化。虽然学生可能会对第一个数字感到满意,但数据科学家可能不会对开始的准确性感到满意,可能会希望进一步提高它。我不是指这种不满。关键是,无论开发人员对的准确性感到满意,它仍然是开发过程自己产生的一个数字。它不需要外界的任何东西或任何人。

我开始认为 ML 中新颖的关闭模式与部署差距有很大关系。准确度是对 ML 系统有用性的欺骗性测量。准确度可能达到 95%,但真正重要的问题是 5%误差的成本。比如 5%的癌症没有检测出来的代价是什么?更重要的是,我们能做些什么,超越 ML 来防止这种错误,或者至少大大降低成本?

在 ML 中,开发人员在心理上与他们程序生命中的这个阶段是分离的。他们的关闭来得更早,在模型训练结束时。我称之为“ML 的开环”。假设你是一个 ML 系统的用户。系统的制造者给了你一个准确率 98%的东西,但你却不太清楚如何使用它。

你觉得很难使用这个系统有两个原因。一个是错误的成本。我已经写了一整篇关于错误的后果的文章。我们现在不讨论这些细节,但是很容易看出,即使是几个错误的代价也是巨大的。但是你不能使用它的主要原因是完全不同的。你不知道这 2%的误差到底在哪里。在你提交的成千上万张图片中,哪些是模特不能“得到”的?当然,还有信心等其他指标,但我怀疑回答这个问题需要的不仅仅是另一个神奇的数字。

我们比任何数字都更需要一种不同的心态。结束循环的心态,这可能需要超越 ML,但仍然从中提取所有可能的帮助。

在这篇文章中,我试图定义我*距离观察到的问题。我没有想到什么解决办法,其中一些我已经在实践中尝试过了。但那要等到另一篇文章了。

ML 的开环——第二部分

原文:https://towardsdatascience.com/the-open-loop-of-ml-part-2-ff6f3d2e0ae6

为什么模型准确性是一个欺骗性的指标

这个系列的第一部分是关于 ML 开发者的心理。与模型开发相关联的“准确性”度量标准为模型构建者提供了一种心理上的封闭。然而,准确性度量是模型训练过程的结果,并且它与模型在真实世界中的有用性几乎没有关系。我已经提出,人为的封闭是原型和实际工作的 ML 系统之间的差异的主要原因。

在第一部分发表后,我收到了很多朋友的反馈,他们在构建行业级解决方案方面经验丰富,知识渊博。其中一些建议非常中肯。我可以把它们分成五大类:

  1. 通过仔细选择训练数据集,可以提高模型准确性的相关性。数据应该包含足够的数量和种类来反映真实世界。数据中的偏差也应该被识别和纠正。
  2. 任何系统都需要多次迭代才能在现实世界中变得有用。ML 系统一旦投入生产,也可以通过增量变化来改进。
  3. 为了构建更健壮的系统,设计应该分成许多部分。只有严格要求不确定推理的部分才应该使用模型来构建。
  4. 我们应该重新定义闭包的标准,就像我们对待任何正常的软件项目一样。我们应该激励正确的结果。
  5. ML 系统的有用性还取决于使用的类型。虽然“辅助”型需求很容易满足,但“替换”型需求很难满足。

我真的很高兴得到这些建议。回应告诉我,那些与现实问题斗争的人能够与 ML 的开放循环联系起来,他们已经在思考解决方案了。受此鼓舞,我决定将我的其余想法分成两部分——第二部分(这一部分)和第三部分(下一部分)。

  • 在这一部分,我将使用前两个建议。我将更多地关注模型的准确性以及为什么它不能反映正确的情况。我还将谈到实施建议 1 和 2 的挑战。
  • 在下一部分,我将使用建议 3、4 和 5。我将建议一个措施,使 ML 系统更有用,并可用作关闭标准。

那么,让我从精确度指标开始。不像上一部分,完全是基于我的实践经验,这一部分包含了一些理论材料。这些材料是我的经验和思考的结果,部分是受我正在写的关于智能机器数学的书的启发。

真实世界、观察和模型

模型是一种猜测的方法。更好的模型能做出更好的猜测。猜测过程由三个步骤组成:

观察(过去的数据收集)

检测模式(模型识别和训练)

使用模式(推理)

模式可以有多种类型。这里,我们将讨论一种特殊的模式——关系模式。我选择这种模式是有原因的。大多数流行的模型(回归、神经网络、贝叶斯)都使用这种模式。基于关系模式的 ML 算法通常被称为“参数化方法”。关系模式意味着我们感兴趣的量之间存在某种关系(或函数)。例如,回购利率和股票市场指数这两个量由一个关系模式连接。

当我们试图解决一个猜测问题时,我们会遇到三种不同的函数:

  • 真实世界函数(RWF):这是真实世界中存在的实际关系。一个例子是疫苗接种数量和传染病传播之间的关系。实际上没有人知道这个函数,因为如果我们知道,我们就不会费心去训练一个模型。
  • 被观察的函数(OF):这是我们 ML 工作的观察步骤的输出。我们以输入和输出变量记录的形式创建数据。数据本身是的。这个函数是“映射”形式的,这意味着你只看到数字对(或元组),而不是任何实际的函数。
  • 模型函数(MF):这是我们猜测 RWF 的尝试。这是一个实际的数学函数。虽然在某些情况下(如神经网络)不可能知道确切的功能,但肯定存在一个。在训练模型时,我们使用观察函数和最大似然算法来猜测最佳模型函数。

图片由 Rajashree Rajadhyax

现在,您可以很容易地理解为什么模型精度如此之低:

模型精度表明 MF 有多接* OF。让这个模型有用的是曼氏金融离 RWF 有多*。

稍微思考一下上面的问题,你就会意识到有用的先决条件:

奥林匹克公园应该靠* RWF。

考虑这两个函数的性质。真实世界函数是隐藏的,未知的。观察到的函数是你保存的真实世界现象的记录。事实上,RWF 通过观察来展现自己。为了使这个抽象的观点更简单,我们将举一个例子,这个例子对于 ML 文献的读者来说太熟悉了——识别一只猫。

现实世界的现象是,一张猫的图片包含了某些独特的形状,以及这些形状的一些有区别的排列。你收集的猫的照片是观察数据。神经网络可以学*这些形状/排列和猫的图片之间的关系。这就变成了学*的模型函数。在这个例子中,注意 RWF 和的性质。现实世界的现象产生了猫图片的特征。这样的图算什么?几乎是无限的。世界上的每一只猫,在它的每一个姿势,在每一个环境和光线下,都会产生一幅新的图画。不可能包含所有这些图片。因此:

的将永远是 RWF 所有表现的子集。

有了背景知识,我们列出了接* RWF 的挑战:

  • 缺乏知识:由于 RWF 未知,我们实际上不知道我们需要收集多少数据和哪些品种
  • 工作的指数性质:收集初始数据量的工作是合理的。随着我们追求更多的数量和品种,努力会成倍增加:

图 1:为什么收集更多数据越来越难

还有一个挑战,我稍后会描述。

这个讨论应该足以强调模型准确性的欺骗性。如果准确率为 90%,MF 和 OF 之间有相当于 10%的距离。但是 RWF 和 OF 之间的距离可能很远,因此这个模型在现实世界中的实用性现在还不知道。

我们如何衡量一个模型在现实世界中的有用性?我将在下一部分谈到这一点,但有一点应该是清楚的:

一个模型在现实世界中的有用性只能通过把它放到现实世界中来衡量。

这意味着,除非模型在实际情况下运行足够长的时间,否则它的有用性不会很明显。但是将模型投入现实世界有一个很大的障碍——错误的成本!

一个模型可以犯许多类型的错误。以识别癌症的模型为例。它会产生两种错误——假阳性(FP)和假阴性(FN)。对于这两种错误,错误的成本可以不同。在癌症的情况下,FN 的成本可能是巨大的,因为它错过了现有的医疗条件。现在考虑将模型放入现实世界的以下几点:

由于 RWF-OF 缺口的存在,模型会产生一些误差。

一些错误的代价可能很大。

这个困难来自于将模型投入生产的方式。然后,系统变成一个循环(称为错误成本循环):

RWF-的缺口->错误->不愿投入生产->无法填补 RWF-的缺口

这个循环阻碍了 ML 系统的增量改进。

结论和下一部分

我们最初的问题是实验和生产 ML 系统之间的差异。在这一部分中,我们讨论了模型准确性度量如此具有欺骗性的原因。虽然它表明了模型与可用数据的接*程度,但它并没有说明模型与现实世界现象的接*程度。事实上,错误循环的成本阻碍了将模型投入生产,并阻碍了进一步的数据收集。

我们现在知道我们必须找到两个问题的答案:

我们如何打破上述错误成本循环?

对于模型在现实世界中的有用性,我们可以提出什么样的衡量标准?

我将在下一部分尝试给出以上问题的答案。我希望能收到一些关于上述讨论的好的反馈。如果你能把你的想法写在评论里,这样我就可以很容易地参考它们,那真是太好了。

上一篇:[ML 的开环—第一部分](http://The Open Loop of ML - Part 1)

ML 的开环——第三部分

原文:https://towardsdatascience.com/the-open-loop-of-ml-part-3-f0ba4c6d225e

结束循环

介绍

本系列的目的是为 ML 系统提出一种新的性能测量方法。在第 1 部分和第 2 部分中,我们定义了这个问题,并将其称为“ML 的开环”。在这一部分,我们将提出一个补救措施,并声称已经完成了闭环。

图片来自 Rajashree Rajadhyax

首先,让我们快速回顾一下前两部分:

  • 第一部分指出,模型准确性的度量给了开发人员一个很好的结论,但并不表示系统在现实世界中的效用。这种心理因素造成了大量精确模型和少量工作系统之间的差距。
  • 在第二部分中,我们看到模型精度是欺骗性的,因为它是观察函数(OF)和模型函数(MF)之间的距离,而不是真实世界函数(RWF)和 MF 之间的距离。
  • 第二部分我们还研究了错误循环的代价。由于错误的高成本,不鼓励在现实世界中使用 ML 系统。如果没有实际使用,就无法收集真实世界的数据,模型的改进也会受阻。事实上,你在实际使用中看到的唯一系统是那些创造者以某种方式打破了错误成本循环的系统。

在这种背景下,我们现在给自己设定的任务是回答以下两个问题:

  • 如果模型的准确性是欺骗性的和不相关的,那么我们可以建议另一种方法来正确地反映 ML 系统的效用吗?
  • 我们如何打破错误成本循环?

很明显,这两个问题的答案都与同一个概念有关。但是首先我们需要更多地研究错误的代价。

错误的代价

现实世界中的任何猜测系统都会犯错误,因此会有相关的错误成本。假设一个 ML 系统 S 放在现实世界中,它每天处理 N 个输入。设 E 是它犯的错误数,C 是这些错误的总成本。

图 1:开环系统(图片由作者提供)

每犯一次错误的代价取决于应用程序。对于一些用例来说,每次错误的成本自然很低。这里有两个例子:

  • 在推荐系统中,错误不是很重要。想想你最喜欢的 OTT 平台向你展示关于观看什么的建议。如果系统做出一些错误的猜测也没关系,只要一些建议是正确的。
  • 一些用例本质上是统计性的。情感分析系统试图估计媒体中好评的比例。碰巧的是,一些正面评价被系统误归类为负面。但是错误也会反过来发生,负面评价会被认为是正面的。如果两者的错误比例大致相当,总体分析还是比较接*真实的。

然而在大多数其他系统中,错误的代价是巨大的。正如我们在癌症检测示例中看到的,医疗诊断中假阴性的成本非常高。在 OCR 或文档阅读系统中,提取的错误值会导致重大损失。在自动门禁系统中,你肯定不希望你的 CEO 等在门口,因为系统无法识别他们。(关于错误成本的更多例子,请参见我的文章您喜欢哪个错误,先生。)

我们可以说,对于任何真实世界的使用,都需要真实世界的精确度。如果系统的精度低于这个极限,系统就变得不可用。但并不是因为精度本身。这是因为错误的代价。对于推荐系统,即使准确度很低,错误的代价也是可以接受的。但是医疗系统只允许出现一些错误,因为每个错误的代价都很高。因此,实际上这意味着总成本(C)应该低于某个阈值,以使系统有用。误差的总成本才是有用性的真正衡量标准,而不是系统的准确性。

然而,无法衡量这一成本。只有将系统置于现实世界中,才能对其进行测量。正如我们已经看到的,成本本身阻止了这种情况的发生。所以我们又回到了起点。

补偿

我们现在将谈论这个难题的最后一块。我们需要的是系统中的一个组件,它将控制错误的成本。让我们加上这个成分,称之为‘补偿’。这是一个以某种方式纠正错误的组件。对于我们目前的目的,我们并不真的需要了解它是如何工作的。然而在大多数情况下,它是一个人。

图 2:添加了补偿的 ML 系统(图片由作者提供)

补偿的想法并不新鲜。它也存在于传统系统中。每当错误的代价很高时,你会看到补偿被添加到系统中。毕竟,犯错误的不仅仅是 ML 系统。人类也制造它们。所以又增加了一个人类作为补偿。这是指像制造商检查,质量控制,批准,第二意见等术语。

值得注意的是,补偿组件并不能纠正所有的错误。它将只关注那些代价巨大的错误。例如,考虑一个文档信息提取系统,它提取字段“Remarks”和其他字段。还假设备注字段中的错误与用例无关。补偿组件将纠正其他字段中的错误,但不纠正备注中的错误。

纠正错误显然是有成本的。在大多数情况下,人类正在纠正错误,因此必须考虑他们的时间和相关成本。现在总成本 C 变成了:

C =错误成本+补偿成本

由于补偿成本,总成本 C 可能仍然很高。但是补偿的主要作用是打破错误成本循环,使系统能够在现实世界中使用。数据科学和工程团队现在可以专注于降低补偿成本,以便总成本可以接受。这种减少通常来自于模型精度的提高(现在使用真实世界的数据),但也可以通过重新设计整个系统来实现。

通过设计,带补偿的整体系统精度保证高于所需水平。我们称之为闭环精度(CLA)。我们现在关心的不是精度,而是赔偿成本。

作为衡量标准补偿成本

此外,薪酬部分还为我们提供了急需的绩效衡量标准。补偿成本(CC)是系统有用性的一个极好的量度。让我们看看如何:

  • 它是在现实世界中衡量的。由于误差成本在可接受的限度之内,闭环 ML 系统可以放心地置于现实世界中。因此,当您测量 CC 时,系统在真实条件下运行。
  • 如果 CC 低,则该系统是有用的。高补偿成本在较长时期内是不可持续的,因此 ML 系统必须改进。因此,CC 是 ML 系统性能的直接度量。

在 CLA 系统中,可以测量底层 ML 系统的真实精度。

图 3:测量 CLA 系统中 S 的精确度(图片由作者提供)

S = (N-E) / N 的精度

但是 CC 仍然是比上述准确度更好的量度。原因是 CC 只关注相关错误。正如我们在“备注”字段示例中看到的,该字段中的错误会影响上述测量的准确性,但不会影响 CC。因此,CC 与用例更加相关。

CC 测量为 ML 系统开发过程提供了一些主要的好处:

  • 有了 CC 措施,开发和实施团队的工作现在集中在同一个目标上——降低补偿成本。由于系统已经在运行,这些工作可以使用敏捷方法。
  • CC 的减少来自于模型改进和一些聪明的软件工程的结合。使用 CC measure,重点是整个系统,而不仅仅是模型。
  • 性能的度量现在与系统的实际有用性一致。开发者和用户都可以期待同样的结果——低补偿成本。

结论

三部分系列现在已经完成。在这个系列中,我们处理了机器学*系统在现实世界中采用的挑战。挑战的出现是因为使用了错误的性能度量(模型准确性)。然后,我们提出,增加补偿成分和使用补偿成本作为绩效衡量标准可以帮助克服这一挑战。CC 度量使开发者的心理闭合和 ML 系统的可用性一致。补偿组件可以帮助打破错误成本循环。CC 度量还集成了模型改进和系统工程的工作,以使系统更加可用。

为使系统输出可用而引入补偿并不是一个新的想法,并且已经被大多数组织以某种方式使用。在 ML 理论中接受这种方法,并努力将 CC 度量形式化,可以大大加速 ML 系统的采用。

前情提要:

ML 的开环——第一部分:心理效应如何阻碍 ML 的发展

ML 的开环—第 2 部分:为什么模型准确性是一个欺骗性的度量

数据科学的开源精神

原文:https://towardsdatascience.com/the-open-source-spirit-of-data-science-18fa1cb9d3c1

数据科学和机器学*仅仅花了十年多一点的时间,就从企业内部的辅助功能发展成为独立的主要利润丰厚的行业。尽管如此,数据专业人员每天使用的许多工具都保留了一种基层的、社区驱动的方法,整个生态系统都保留了对免费共享的开源软件的喜爱。

本周,让我们探索数据科学和开源文化的交集。我们选择了一些最*的文章,庆祝这种关系,并集中项目和产品,避免技术的倾向,集中在围墙花园和底线。让我们开始吧。

  • 为 OS 项目做贡献的原因、方式和内容 。作为一名多产的贡献者, Maarten Grootendorst 对数据科学家通过 j 加入开源项目所能获得的好处有着独特的见解。他的经验还帮助他开发了一种实用的方法来应对结构化程度较低(有时完全混乱)的开发工作流的挑战。
  • 一门新兴编程语言的实用评估 。Python 和 R 的粉丝们已经就这两种语言各自的优势争论了很长时间,但是最*几年,由强大的开发者社区支持的 Julia 已经成为数据科学家最受欢迎的两种语言的替代者之一。 Natassha Selvaraj 向我们展示了使 Julia 成为引人注目的竞争者的因素,并提供了一个初学者友好的介绍,以防你想从基础开始。

杰夫·韦德在 Unsplash 上的照片

  • 有什么比一个开源工具更好的?他们两个和谐地工作着 。 Khuyen Tran 是为数据科学和 ML 从业者构建开源工作流的专家。最*的一个实践教程就是一个很好的例子:它结合了 GitHub Actions 和 DVC(数据版本控制)的力量来简化数据管道中的实验。
  • 科技巨头如何认识到开源的力量(和商业逻辑) 。作为一名在 Keras 图书馆工作的谷歌软件工程师,金海峰对导致 FAANG 规模的公司投资非专有技术的决策过程有着独特的观点。在他的第一篇 TDS 帖子中,他反思了 TensorFlow 如何以及为什么一直是开源产品,尽管它有商业化的潜力。

本周还有什么新的值得学*的内容?我们希望你能问。

  • 如果你是一名数据或 ML 专业人士,并且碰巧喜欢好的写作和与作者一起工作,我们目前正在接受三个志愿编辑助理职位的申请。
  • 最*,我们选择了一些关于地理空间数据的优秀文章来庆祝我们对地理空间数据相关事物的热爱。
  • 阿德里安娜·克莱恩广受欢迎的统计训练营系列回来了——不要错过最新的一期,它详细介绍了置信区间。
  • 对于异常检测基础知识的简明介绍,请直接前往 Abiodun Olaoye 的新讲解者。
  • 如果你发现自己(再一次)抱怨 Python 的缓慢,你会欣赏 Casey Cheng 的加速循环的彻底指南。
  • 有兴趣了解更多关于强化学*的知识吗? Hennie de Harder 在一篇新的可访问的帖子中展示了一个关于解决多兵种土匪问题的实际应用。

谢谢你一如既往的支持。如果你想产生最大的影响,考虑成为的中层成员。

直到下一个变量,

TDS 编辑

深度学*和线性回归的关联比你想象的要多得多

原文:https://towardsdatascience.com/the-opportunity-and-cost-of-the-ability-of-neural-networks-to-solve-any-problem-d678609c49f1

神经网络解决任何问题的能力的机会和成本

当我刚开始在大学学*统计学时,所有的统计模型似乎都是独一无二的工具。完全独立的知识孤岛:我们使用线性回归来预测给定山坡上的土壤侵蚀量,并使用克里金法对辐射值进行空间插值。然而,过了一段时间后,我意识到克里金法只是线性回归的一种特殊变体,其中的观测值在空间上是相互关联的。

神经网络尤其具有这种*乎神话般的独特性:这些神奇的黑盒模型解决了以前认为不可能解决的问题。但即使是神经网络也与经典统计学有着紧密的联系。在这篇文章中,我想探索其中的一些联系,以及它们对神经网络的泛化本质的看法。我在这里使用“概括”一词,是指神经网络提供了一类更一般的模型,能够模拟许多其他统计模型。更重要的是,在训练神经网络时,它会有效地选择要模仿的模型,或者创建自己的混合模型。这种变色龙般的特性使得神经网络能够在给出问题的情况下找到合适的解决方案。

所有这些模仿能力回避了一个问题:为什么你不应该使用神经网络?为了回答这个问题,我们将从建立一个燃料效率模型开始,该模型将各种形式的线性回归与神经网络很好地联系起来。

这篇文章和代码可以在 github 上找到。

燃油效率模型

这个案例基于经典的 mtcars 数据集,灵感来自教程中的,其中我们特别关注汽车重量与每加仑英里数(MPG)燃料用量之间的关系:

作者图片

我们看到更轻的汽车更省油。这是有意义的,因为汽车不必拖动所有额外的重量。

为了探索神经网络如何呈现更一般的模型类别,我们将实现以下非常简单的网络架构,并将其与来自statsmodels包的普通最小二乘(OLS)线性回归进行比较。

作者图片

我们将首先从比较 statsmodels 的网络 a 和 OLS 开始。

作为神经网络的 OLS

网络 a 本质上的行为与线性回归完全一样。实际运行该模型显示了这一点有多正确。

首先,我们需要标准化数据,没有它,Keras 很难拟合一个好的模型。此外,我们将数据分为训练集和测试集。

数据准备好了,我们就可以建立模型 a 和 OLS 模型。

查看 OLS 和神经网络的拟合系数,我们可以看到它们大致相同,截距约为-6.5,斜率为 23.5:

[array([[-6.6114306]], dtype=float32), array([23.516169], dtype=float32)]
Intercept      23.495049
Weight_norm    -6.500213
dtype: float64

所以网络 a 本质上是 OLS 线性回归。

非线性简介:多项式回归

重量和燃油效率之间的关系似乎不完全是线性的,但对于重量较大的汽车来说,这种关系会稍微减弱。我们可以通过尝试拟合一条二次线来考虑这一点。这正是网络 b 通过将权重和权重的平方作为单独的特征输入到网络中所做的事情(受启发的):

用数据绘制网络 b 和 OLS 的预测线很好地说明了所发生的情况:

作者图片

表明网络 b 本质上归结为二次线性回归。

神经网络的魔力

网络 b 的问题是,我们仍然必须通过向网络提供更多特征来手动决定拟合多项式回归。对我来说,神经网络的真正魔力是让数据告知关系的实际功能形式的能力,而不是必须手动做出选择。网络 c 通过使用一个隐藏层引入了这种灵活性,在这种情况下有 8 个神经元:

隐藏层允许网络自行发现哪种输入要素组合可产生最佳结果,而无需手动创建要素。下图描绘了网络 bc 和 OLS 的线路:

作者图片

model c 提出的解决方案甚至比二次线性回归更复杂,看起来更像一种局部回归。

作为一般化的神经网络

燃料效率模型的例子很好地说明了神经网络可以模拟输入和输出之间的任何函数,包括所有类型的(局部)回归。这就是我的意思,神经网络提供了一类更一般的模型。更重要的是,根据我们观察到的数据,它可以即时选择哪种回归是合适的。

当使用深度神经网络时,这种一般化的概念更进一步。这些深层网络可以解决使用更经典的统计问题无法解决的问题。例如,我们应该如何从包含猫和狗的一组图像中获得特征,以便逻辑回归可以有效地看出猫和狗之间的差异?深度神经网络在发现特征层中的什么表示最能让我们看到差异方面令人惊叹。

但是权衡是什么呢?

在如此热情洋溢地描述了(深度)神经网络的优点之后,我们为什么还要使用神经网络之外的任何东西呢?我认为神经网络面临以下挑战:

  • 灵活性与计算和数据。与传统方法相比,神经网络通常使用更多的系数来描述问题。这带来了惊人的灵活性,但需要更多的计算和数据来发现所有这些系数的值应该是多少。对于您的用例,考虑到您的计算资源或数据量,更传统的方法可能是更好的选择。
  • 要一把锤子,每个问题都是一颗钉子。当我们过多地将神经网络作为默认设置时,我们可能会对更简单有效的解决方案视而不见。例如,我们可以使用递归深度神经网络来尝试并分类公司的哪个部门应该转发支持电子邮件。然而,如果我们尝试了,一组简单的正则表达式可能会执行得更好。了解现有的所有模型,以及为什么它们在给定的环境中有意义。然后明智地选择适合您的问题的模型。
  • 可解释性。大量的相互作用系数使得很难解释为什么模型会做出特定的选择。对于许多用例来说,这可能不是问题,但例如在医疗应用中,这可能会带来真正的挑战。如果医生不明白为什么它会做出某些决定,他们可能不愿意使用这个模型。相反的效果也可能发生:缺乏可解释性可能导致模型被毫无疑问地遵循。当然有办法让(深层)神经系统变得更加透明,但是一个有几个系数的 OLS 更容易解释。这尤其适用于非技术观众。
  • 熟悉度。在你给定的上下文中,神经网络可能很少被使用。使用其他人都使用的模型使它更有可能被接受并产生影响。一个奇特的神经网络可能会工作得更好,但你必须首先赢得周围人的信任。

总的来说,我的建议是保持一个开放的心态,广泛地研究你可以使用的所有可能的统计技术。不要被机器学*的魅力所吸引,要为这项工作选择正确的工具。

我是谁?

我叫 Paul Hiemstra,是荷兰的一名教师和数据科学家。我是科学家和软件工程师的混合体,对与数据科学相关的一切都有广泛的兴趣。你可以在 medium 上关注我,或者在 LinkedIn 上关注。

如果你喜欢这篇文章,你可能也会喜欢我的其他一些文章:

  • 掌握数据科学并不是学*一系列技巧
  • 学* AI 机器人玩井字游戏系列文章
  • 牛郎星图解构:可视化气象数据的关联结构
  • 面向数据科学的高级函数式编程:用函数运算符构建代码架构
  • 通过规范化扩展您的回归曲目

数据可观测性的起源、目的和实践

原文:https://towardsdatascience.com/the-origins-purpose-and-practice-of-data-observability-baa12db46755

数据可观察性是一项新兴技术,它解决了一个古老的问题:了解数据系统的状态,以增加认知和信任。本文改编自作者在Open Data Science Conference 2022Data ops Unleashed 2022的演讲。

数千年来,数据一直被用来代表现实世界。虽然围绕数据的技术发生了变化,但问题并没有改变。图片由大都会艺术博物馆和作者提供。

一切旧的都是新的,尤其是在数据世界。随着对现代数据栈甚至后现代数据栈的大肆宣传,你应该退一步问“从第一台计算机开始,我们就没有处理过数据吗?自从 Edgar Codd 在 1970 年将关系数据库正式化以来,发生了什么变化?”

我们的现在确实是那个时刻的延续,但是它的血统可以一直追溯到人类首次发展文字的时候。

现存最古老的文字之一是大约 5000 年前在苏美尔创造的楔形文字板。这种文字不是史诗或宗教仪式,而是一份由一个叫 Kushim 的人签署的销售收据。

具体来说,这个粘土碎片记录了 37 个月内 29,805 斗大麦的运送情况。虽然 Kushim 当时无法访问企业软件,但这本质上是一项 Salesforce 交易。好在他的数据存储介质有自动保存功能。

虽然我们的技术已经超越了石碑,但客户的抱怨永远不会消失。图片由作者提供。图片由大都会艺术博物馆和大英博物馆的受托人提供。

数据可观察性的起源

虽然数据有几千年的历史,但可观测性却有几百年的历史。“数据可观测性”,一个描述我们对数据系统的可见程度的概念,是“软件可观测性”的翻版,它本身来自控制理论。

在 17 世纪,当荷兰学者克里斯蒂安·惠更斯不忙着研究土星环时,他在想风车。当时,风车经常被用来磨面粉。

但是有一个问题困扰着磨坊主:风以不同的速度吹着,当它吹得太快时,磨盘就会产生太大的摩擦。这种摩擦可能会烧焦面粉,甚至引起火花——然后点燃空气中的面粉,并可能导致整个面粉厂烧毁。

问题是调节转速,惠更斯的解决方案是离心调速器。就像溜冰者伸出手臂减速,收回手臂加速一样,调速器有两个摆动的钟摆,将磨盘的速度保持在可接受的范围内。

换句话说,惠更斯承认他无法控制输入(风速),并选择更好地控制系统(碾磨速度)。两百年后,苏格兰工程师詹姆斯·瓦特将离心调速器应用于工业,包括蒸汽机。

用于控制流出阀门的流速的离心调速器示意图。摘自 R. Routledge 的《十九世纪的发现与发明》。

像蒸汽机一样,离心调速器的技术出现在理论认识之前。在这种情况下,先驱是苏格兰同胞詹姆斯·克拉克·麦克斯韦,他也有一个主要的研究电磁学。

他的想法是:考虑到这个复杂的系统,在任何给定的时间观察每一条被处理的信息是站不住脚的,所以我们通过观察一些关键的输出并做出推论来满足自己。这就成了控制理论领域的“可观性”概念。

再过一百年,可观测性就有了更熟悉的形状。在 20 世纪 60 年代末和 70 年代初,IBM 的 Edward Codd 引入了关系数据库模型。Codd 有一个想法,即在诸如书页、复写纸和穿孔卡片等物理人工制品上收集的许多数据可以用表格的形式数字化地表示,并在它们之间建立关系。

这种关系模型和代数为关系数据库奠定了基础。此外,这些表和关系可以由一组定义良好的操作来操作,这些操作就是 SQL。这些早期的数据库原型催生了我们今天仍在使用的企业数据库。

我的观点是数据不是新的,可观察性也不是新的。以下是的新内容:在 Codd 时代,数据被输入贯穿整个组织的一条动脉。通过支持决策,数据是业务数据策略的补充。

如今,数据团队在越来越多样化的用例中为越来越多的利益相关者集中、转换和公开越来越多的数据。数据通过训练 ML/AI 模型来改善运营和产品体验,反馈到软件工具以实现运营目的,并驱动自动化行动,从而为企业提供动力。

在库希姆记录下古代苏美尔的大麦交易五千年后,我们终于实现了数据的承诺。

数据可观察性的目的

摩尔定律使得计算和数据存储的成本呈指数级下降,这导致了现代数据堆栈中我们熟悉和喜爱的参与者的崛起。越来越多的数据被 Fivetran 和 Airbyte 等工具复制到 Snowflake、BigQuery 和 Redshift 等云仓库,然后通过 dbt 等工具进行转换。

进步往往是一把双刃剑,数据的爆炸也不例外。问题是更多的数据意味着需要维护更多的表面积。随着维护开销的增加,数据破坏变得更加频繁和严重。随着数据分解,依赖数据的用例开始动摇。这往往会降低利益相关者对数据的信任。

不管你有多少 zettabytes 的数据,如果不能被信任,那都是没有用的。

正如熵会随着时间的推移而增加一样,创建更多的数据而不增加管理数据的能力只会导致更大的混乱和无序。数据的泛滥就像风在惠更斯的风车上吹得太猛。在这个例子中,数据可观测性是防止工厂烧毁的调速器。

现代数据技术使得接收、转换和激活数据比以往任何时候都更容易。但表面积越大,破损的可能性就越大,这会导致利益相关者失去信任。由作者提供。

这种与熵的斗争就是为什么数据可观测性不同于数据质量监控的原因,尽管有些人说它们可以互换。数据质量监控提醒我们注意问题,就像防盗警报一样。数据可观察性致力于了解问题发生的原因以及如何预防。它就像一个防盗报警器,有我们可以查看的监控录像。

数据可观察性的潜在用例不仅限于数据质量监控,还包括事件管理、根本原因分析和使用分析。在这些领域,组织可以应用数据可观察性概念来解决困扰数据团队的工作。

数据可观测性的核心组件是什么?数据工程仍然是一个相对年轻的学科。在整个开发过程中,它经常从其老大哥软件工程的例子中寻求指导。如果你知道软件可观察性的三个支柱:度量、跟踪和日志,“可观察性的支柱”听起来会很熟悉。数据可观测性遵循着相似的路径,尽管方向不同。

十年前,软件工程师和数据工程师处于同样的位置。从物理磁盘到云存储的转变意味着人们对软件寄予了更高的期望。更新速度的加快意味着熵的危险。这导致了像 Datadog 和 Sumo Logic 这样的软件可观察性工具的发展。

现在,我们正处于数据可观测性时代的黎明。虽然软件和数据有许多共同点,但它们也有一些基本的区别,这意味着我们不能盲目地将软件可观察性的原则复制到数据上。我们需要采用可观察性概念,并根据我们的特定领域对其进行调整。数据可观察性建立在四个支柱之上:指标、元数据、沿袭和日志:

  • 指标:数据的内部特征。示例:数字列的分布,分类列中的分组数。
  • 元数据:数据的外部特征。示例:表的模式、视图具体化后经过的时间、表中的行数。
  • 沿袭:数据之间的依赖关系。示例:数据库列和下游仪表板之间的列级沿袭。
  • **日志:**数据与外部世界的交互。示例:查看仪表板的次数,谁提交了最新的 dbt 提交。

总的来说,这四个支柱对于以任意细节描述数据系统在任意时间点的状态是必要且充分的。

以任意精度逼*我们的数据系统状态的四类信息。图片由作者提供。

实践中的数据可观测性

像数据质量一样,当头脑中有一个目标时,实现数据可观测性的努力是最成功的。通过与从小型初创公司到大型企业的各个垂直行业的数据团队合作,我们在采用数据可观察性时遇到了五个一致的目标:

  • **节省工程时间:**如果您的工程团队在处理入站服务单上花费了过多的时间,那么数据可观察性是一种可以更快解决问题并防止问题再次出现的方法。
  • **减少数据质量的失误:**尤其是当数据的可操作性超出了商业智能的范畴,为上市运营、自动化和客户体验提供动力时,数据质量差的成本会直接影响公司的顶线和底线。
  • **提高数据团队的杠杆作用:**大多数数据团队面临的最大问题是雇佣优秀的人才。一旦你有了优秀的人才,你不会希望他们的时间浪费在可以自动化的琐碎任务上。数据团队可以花时间向企业交付数据产品,而不是灭火。
  • **扩展数据意识:**有一个学派认为,数据从业者应该帮助其他团队做出更好的决策,自动化工作流,并了解他们工作的影响。但是数据团队呢?他们需要能够优化自己的工作流程。数据可观察性提供了他们需要的元数据。
  • **保持信任:**信任很容易失去,几乎不可能重新获得。一旦高管失去对数据的信任,他们的团队也开始失去对数据的信任。我们已经看到团队建立了替代的“影子”数据堆栈,使数据团队的工作无效,或者更糟,完全停止使用数据。恢复这种信任是一场艰苦的战斗,需要不断保证你的产品是正确的。

数据可观察性的目的,从最具体(但不一定是最有价值)到最抽象。图片由作者提供。

这五个目标是按照从最具体到最抽象的顺序排列的。然而,没有一个目标一定比其他目标更重要——这取决于你的业务。一旦确定了目标,下一步就是在指标、人员、流程和工具上达成一致:

  • 指标:我们在这里向唱诗班说教,但是为了确保针对某个目标的进展,一个有效的方法是定义代表该目标的清晰且可测量的指标。例如,如果您的目标是节省工程时间,您可以跟踪数据质量问题的数量、发现问题的平均时间或解决问题的平均时间。
  • :数据来自无数的工具,而的输出被组织中的每个人使用。那么谁来负责数据质量呢?我们已经看到在“仅数据团队”和“整个组织”之间的范围内到处都有团队所有都可以工作,但最重要的是对齐。只要组织接受了数据质量的重要性,并且感觉到他们的需求被听到了,那么数据团队就有权拥有测量和提高数据质量的过程。
  • 过程:有了目标,有了跟踪这些目标进展的度量标准,有了围绕这些度量标准的人,下一个难题就是实现系统化度量和改进的过程。这些流程包括持续监控四大支柱的被动可观察性、集成到 CI/CD 工作流中的主动可观察性、事件管理行动手册,以及服务级别目标/协议(SLO/SLA)。
  • 工具:引入数据可观察性工具的三个主要选项是构建一个内部工具、引入开源解决方案或者采用商业工具。每种方法在可定制性、支持、时间成本和财务成本方面都各有利弊。

摘要

旧的又是新的,但来势凶猛。自从我们可以在石碑上记录语言以来,人类已经记录了数据,并且我们总是试图应用输入来改善结果。摩尔定律使得以更大的数量和更大的效果移动、存储和激活数据成为可能。

随着数据表面积的增加,我们的数据系统的熵往往会增加,并导致失去信任,除非我们采取措施来维持秩序。数据可观察性是一种新兴技术,有助于维护数据的有序性。

如有反馈或想联系,请联系 凯文 在此抢个时间 。感谢阅读!

端到端 ML 平台的过度承诺:为什么一刀切的解决方案并不总是有效

原文:https://towardsdatascience.com/the-overpromise-of-end-to-end-ml-platforms-why-one-size-fits-all-solutions-dont-always-work-289032e535c7

意见

机器学*基础设施中定制和灵活性的重要性

DALL E -一个供应商锁定成本公司太多钱的例子

最*一年,我的收件箱被试图出售其一刀切基础设施的 MLOps 公司所淹没。但不仅仅是在那里,与 covid 之前的年份相比,会议上的参展商也由 ML(Ops)平台主导。你还可以在 medium 上的每篇相关文章下找到大量垃圾邮件,甚至一个付费的研讨会也只是这样一家公司的销售演示。虽然我通常对新产品持开放态度,但有太多的承诺,这篇文章是关于保持独立的重要性。

MLOps 是 DevOps + ML

MLOps,即机器学*操作,结合了软件工程和机器学*,使组织能够使用 DevOps 原则,以可扩展和可靠的方式部署和管理机器学*模型。MLOps 的一个关键挑战是模型的培训、部署、集成和监控伴随着一系列独特的需求和要求。对一家公司有效的平台不一定最适合另一家公司,即使他们在同一个行业。每个组织都有独特的数据源、业务流程和技术堆栈。

缺乏特色

大多数 MLOps 产品都提供 AWS、GCP 或 Azure 的简化版本。虽然学* AWS(或 GCP/Azure)配置很痛苦,如 AMI 角色、网络、EC2、Lambda 和处理这些的技术(如 terraform),但可能性很大,所有这些努力给了你一个构建高度定制化系统的机会。此外,您还可以提高工程师的技能,让他们为云做好准备。因此,本文不是针对云,而是针对来自单一提供商的完全集成的解决方案。

这些 ML/MLOps 平台试图通过将细节抽象为日常用例并将所有部分连接起来,使云的使用更加容易。它是关于外包你的 ML 基础设施。只要你只在这些简单的用例中运行,你就没问题,在这种情况下,你应该看看这些平台

不幸的是,生产中的机器学*很少适合这些“玩具”用例。根据我的经验,这非常类似于学术界的数据科学与行业中的数据。它始于一个简单的事实,即一些 ML 平台只支持 Python,这种限制应该已经很惊人了。此外,有些不允许区分批处理和 API 工作负载。有的不支持 GPUs 有些人甚至将您的算法选择限制在预先实现的列表中,或者不允许您根据 GPDR 要求保存数据。列表很长,我想参考这个存储库进行比较。

锁定风险投资资助的技术

但是总体来说,我并不是很关注特性。您可能会找到一个目前完全符合您需求的解决方案,但是如果在某个时候,您的需求发生了变化,而它不再是了,那该怎么办呢?您会并行构建第二个定制系统吗?你会转移到另一个平台吗?即使你选择了功能丰富、价格最贵的提供商,你认为的长期锁定值得吗?

一个付费的、昂贵的机器学*平台可能不是最具成本效益的解决方案,尤其是对一家更年轻的公司而言。这些平台可能成本高昂,像大多数风险投资平台一样,它们通过低廉的初始成本运作,消耗投资者的大量资金,直到拥有他们的客户(供应商锁定)。在某个时候,他们必须盈利,猜猜谁在为此买单?将 MLOps 外包给这些 SaaS 提供商可能会非常昂贵。

开源胜出

通过定制的开源方法,组织可以轻松地将其机器学*基础设施与现有系统集成,使他们能够快速轻松地部署和管理模型,而不会中断现有的运营。这是有代价的,你需要人们去做。

当然,有很多工具是你不应该自己开发的。对于标准用例,有些解决方案值得购买;数据摄取、实验跟踪、监控等等。其中大多数甚至是开源的,可以作为托管服务使用。通常,这些工具背后有一个咨询业务,你可以付钱给他们来帮助建立和扩展你的系统。但是这些工具通常是可以互换的,你可以保持被锁定的风险很小,并且你仍然在决定你的 ML 架构。您购买的不是整个堆栈,而是部分。

此外,请记住,通常存在明显的利益冲突。虽然 SaaS 提供商希望您每年花更多的钱,通常是通过基于消费的模式(按计算时间、数据量等付费),但通过尽可能高效地处理数据来降低您的账单对他们来说并不太有吸引力。

结论

总的来说,很明显,MLOps 不是一种一刀切的方法,付费的、昂贵的机器学*平台很少是最好的,也不是最便宜的解决方案。定制的开源方法提供了一定程度的灵活性和适应性,通常更适合公司的需求,可以帮助组织节省资金,同时购买他们真正需要的工具。

感知器算法

原文:https://towardsdatascience.com/the-perceptron-algorithm-b74d95d6e1cb

理解并用 R 或 Python 编写你自己的感知器算法

照片由 安德烈斯【哈罗】

感知器算法可能是最简单的二进制分类算法。最初由 Frank Rosenblatt 于 1958 年发明,人们很快发现单层感知器的限制使分类方法不切实际。然而,多层感知器今天仍然被用作“前馈”神经网络的基本构件。因此,对于任何有抱负的数据科学家来说,敏锐地理解这种算法是至关重要的。

这篇文章旨在作为算法背后的数学的高层次概述,以及一个关于如何编写自己的感知器算法的例子。虽然代码示例是用 R 语言编写的,但我用 Python 重新编写了类似的函数,你可以在这里找到。

r 包

在我们开始之前,我将快速分享本教程中使用的所有 R 包。如果当前没有安装,可以先安装。本教程使用的软件包有:
—data . table
—gg plot
—plot ly
—matlib

# Install packages if neededif (!require(data.table)) install.packages('data.table')if (!require(ggplot2)) install.packages('ggplot2')if (!require(plotly)) install.packages('plotly')if (!require(matlib)) install.packages('matlib')library(data.table)
library(ggplot2)
library(plotly)
library(matlib)

感知器算法的数学基础

为了理解感知器算法,必须首先理解以下数学原理的基本知识:

  • 向量(具体来说,如何计算方向和范数)
  • 点积

我假设大多数阅读这篇文章的人都事先了解这些基础知识。如果你没有,在这里可以找到一个很好的资源。我不打算尝试教授基础知识,因为已经有这么多(更好的)可用资源。

线性可分数据

如前所述,单层感知器的挑战之一是约束限制了算法准确分类数据的能力。具体来说,主要约束是数据必须是线性可分的。

线性可分数据的定义是不言自明的。在高层次上,对于可线性分离的数据来说,这仅仅意味着存在某个平面可以真正地“分离”数据。例如,考虑以下两个类的数据集:

DT <- data.table(class_ = c(rep(1, 31), rep(-1, 31)),x = c(seq(1, 4, .1), seq(7, 10, .1)),y = c(runif(31, 1, 4), runif(31, 7, 10))
)ggplot(DT, aes(x=x, y=y)) + geom_point(colour=c(rep('blue',31), rep('darkred', 31))) + theme(legend.position='none',axis.text.x=element_blank(),axis.text.y=element_blank())

作者图片

很明显,您可以画一条任意的线来分隔两个不同颜色的数据点:

ggplot(DT, aes(x=x, y=y)) + geom_point(colour=c(rep('blue',31), rep('darkred', 31))) + geom_abline(slope=-1.25, intercept=12) + theme(legend.position='none',axis.text.x=element_blank(),axis.text.y=element_blank())

作者图片

类似地,考虑以下三维数据:

DT <- DT[, z := c(runif(31, 1, 4), runif(31, 7, 10))]scene = list(camera = list(center = list(x = 0, y = 0, z = 0), eye = list(x = 1.75, y = .75, z = .25)),xaxis=list(title='x', showticklabels=F),yaxis=list(title='y', showticklabels=F),zaxis=list(title='z', showticklabels=F)
)plot_ly(data=DT,x=~x, y=~y, z=~z, color=~as.factor(class_),type='scatter3d',mode='markers', colors=c('darkred', 'blue'),showlegend=F) %>%layout(scene=scene)

作者图片

在这种情况下,当试图分离两个数据类时,一条线是不够的。相反,可以使用二维平面:

plot_ly(data=DT,colors=c('darkred', 'gray', 'blue')) %>%add_trace(x=~seq(min(x), max(x), .1)*1.5, y=~seq(min(y), max(y), .1)*1.5, z=~matrix(6, nrow=62, ncol=62),type='surface') %>%add_trace(x=~x, y=~y, z=~z, color=~as.factor(class_),type='scatter3d',mode='markers',showlegend=F) %>%layout(scene=scene) %>% hide_colorbar()

作者图片

当然,随着维度的不断增加,这变得更加难以想象,甚至难以解释。因此,使用了一个更广义的术语来描述这种线性分离:一个超平面

超平面

根据维基百科的定义:“在几何学中,超平面是一个维度比其周围空间的维度小一的子空间。”这是有道理的。看我们的第一个例子,数据的维度是两个,而用来分隔数据的线是一维的。在第二个例子中,数据是三维的,间隔是二。

感知器算法

现在假设你有一些向量的基础知识,我们已经回顾了线性可分性和超平面的含义,我们可以在这些知识的基础上理解感知器算法是如何工作的。

首先,考虑以下几点:

更简单地说,我们说数据中有两个类( x ),因此有一个二进制分类问题。我们称之为类 1 和-1,但它们可以是任何东西。假设这两个类是线性可分的,那么一定存在某个 w 使得当 xw 之间的点积(正偏差)为正时,类为 1。而当点积为负时,类为负 1。

为了找到最优的 w ,我们可以首先将向量初始化为随机值。从技术上讲,这些值可能都为零。我选择初始化 0 到 1 之间的随机值。

在本例中,我们将处理本文前面演示线性可分性的例子中给出的二维数据。因为数据是二维的( xy ),我们知道分隔类的超平面会是一条线。我们也知道向量 w 也会有二维,加上一些偏差 b

为了让事情变得简单一点,我们实际上可以完全消除等式中的偏差。为此,首先回忆一下:

这意味着:

为了消除偏差 b ,我们可以简单地向 xw 添加一个零分量,这样:

现在,原始函数可以写成:

在我们的二维例子中,这意味着 w 应该用 3 个值初始化,而不是原来的两个值。我们的矩阵 x 也应该增加一个附加的数据“列”,其中附加列中的每个值都等于 1。在 R 中,这些步骤看起来像下面的代码:

# Generate random weights (initialize `w` with 3 values)
w <- runif(3, min=0, max=1)# Remove `z` since we are using 2D data in this example
# Augment the data such that `x0` = 1
DT[, z := NULL][, x0 := 1]

既然 wx 都被初始化并增加以考虑任何偏差 b ,我们可以使用公式 f(x) 进行一些初始预测。这可以通过取 xw 的点积的符号来完成。我们还将确定初始预测哪里不正确,因为这些将在算法的下一步中发挥关键作用。

# Predict class (either -1 or 1) at each point by taking the dot
# product
pred <- apply(DT[, 2:4], 1, FUN = function(x) sign(sum(x * w)))# Get incorrect predictions
incorrect_preds <- DT[class_ != pred]

在下一步中,我们将从错误分类的预测中抽取一个随机样本,将样本的三个 x 值分别乘以实际类别(1 或-1),然后将样本的三个相应值分别添加到向量 w 。这给了我们一个更新的矢量 w 。然后,重复原来的过程。使用新的 w 进行预测,不正确的预测被识别并用于更新 w 。该过程重复进行,直到没有不正确的预测(或者达到预定义的阈值)。

为了理解这一过程背后的推理,它有助于描述向量实际上发生了什么。作为例子,考虑以下向量,其中x_sample1是从某个任意向量 x 的不正确预测中取得的随机样本,并且w1是计算中使用的权重向量:

x_sample1 <- c(.3, .8)
w1 <- c(.6, .1)

形象化,我们得到如下(其中θx_sample1w1之间的角度):

plot(1, type='n', xlim=c(-.1, 1), ylim=c(-.1, 1), xlab='', ylab='', xaxt='n', yaxt='n')
grid()vectors(x_sample1, labels=expression(x))
vectors(w1, labels=expression(w))arc(w1, c(0, 0), x_sample1, d=.1, absolute=T)
text(.15, .15, expression(theta), cex=1.5)

作者图片

我们可以看到两个向量x_sample1w1之间的角度小于 90°。我们也知道x_sample1的预测类别是不正确的,因为样本取自错误分类的数据。这意味着x_sample1的实际类与x_sample1w1的点积相反。现在,我们需要以某种方式调整w1,使x_sample1w1之间的点积的符号等于x_sample1的类。

为此,我们先来看看x_sample1的预测值是多少:

print(paste0('The predicted class is: ', sign(x_sample1 %*% w1)[1]))## [1] "The predicted class is: 1"

因为预测的类是 1,并且我们知道这个例子中的预测是不正确的,所以我们可以推断实际的类是-1。为了得到预测值 1,我们需要x_sample1和我们的 w 值之间的点积为负。

为此,我们可以简单地从w1中减去x_sample1:

plot(1, type='n', xlim=c(-.05, .7), ylim=c(-.8, .8), xlab='', ylab='', xaxt='n', yaxt='n')
grid()new_w1 <-  w1 - x_sample1vectors(x_sample1, labels=expression(x))
vectors(w1, labels=expression(w))
vectors(new_w1, labels=expression(w - x), col='darkred')arc(w1, c(0, 0), x_sample1, d=.3, absolute=F)
text(.2, .3, expression(theta), cex=1.5)arc(new_w1, c(0, 0), x_sample1, d=.2, col='darkred')
text(.12, .16, expression(beta), cex=1.5, col='darkred')

作者图片

这产生了以下预测:

print(paste0('The predicted class is: ', sign(x_sample1 %*% new_w1)[1]))## [1] "The predicted class is: -1"

现在,让我们再取两个任意向量x_sample2w2。设x_sample2w2的夹角大于 90 度,实际x_sample2的等级为 1,预测值为-1:

plot(1, type='n', xlim=c(-.8, 1), ylim=c(-.1, .6), xlab='', ylab='', xaxt='n', yaxt='n')
grid()x_sample2 <- c(-.7, .45)
w2 <- c(.9, .05)vectors(x_sample2, labels=expression(x))
vectors(w2, labels=expression(w))arc(w1, c(0, 0), x_sample2, d=.1)
text(.05, .07, expression(theta), cex=1.5)

作者图片

print(paste0('The predicted class is: ', sign(x_sample2 %*% w2)[1]))## [1] "The predicted class is: -1"

因为预测的类是-1,我们需要它是 1,我们实际上需要减小x_samplew2之间的角度。为此,我们将它们相加,而不是相减:

plot(1, type='n', xlim=c(-.9, 1.1), ylim=c(-.05, .6), xlab='', ylab='', xaxt='n', yaxt='n')
grid()new_w2 <-  w2 + x_sample2vectors(x_sample2, labels=expression(x))
vectors(w2, labels=expression(w))
vectors(new_w2, labels=expression(w + x), col='darkblue')arc(w2, c(0, 0), x_sample2, d=.1)
text(-.02, .08, expression(theta), cex=1.2)arc(new_w2, c(0, 0), x_sample2, d=.15, col='darkblue')
text(-.05, .18, expression(beta), cex=1.2, col='darkblue')

作者图片

print(paste0('The predicted class is: ', sign(x_sample2 %*% new_w2)[1]))## [1] "The predicted class is: 1"

如前所述,该过程对每个新的 w 进行迭代,直到没有不正确的预测,或者满足某个预定义的阈值。如果数据不是线性可分的,那么 w 永远不会收敛。

# Iteratively update weights
repeat{w <- w + unname(unlist(incorrect_preds[sample(1:nrow(incorrect_preds), 1)][, .SD * class_, .SDcols=2:4][1,]))pred <- apply(DT[, 2:4], 1, FUN = function(x) sign(sum(x * w)))incorrect_preds <- DT[class_ != pred]if (nrow(incorrect_preds) == 0) break
}# Plot
ggplot(data=DT, aes(x=x, y=y)) +geom_point(color=c(rep('blue',31), rep('darkred', 31))) +geom_abline(slope=-w[[2]] / w[[1]], intercept=-w[[3]] / w[[1]]) + theme(legend.position='none',axis.text.x=element_blank(),axis.text.y=element_blank())

作者图片

我们做到了!你可以自己尝试所有的代码。下面是一个完整的 R 脚本,算法中的所有步骤都被定义为函数。如果你还没有感受到用 Python 写的同样的代码这里。

在以后的文章中,我打算分享关于多层和内核感知机的内容,敬请关注!

也可以随意查看我最*的作品,这是一个关于使用 Python 解决微积分问题的 3 部分系列(目前仍在进行中)。

最后,如果你还没有订阅 Medium,并想阅读无限的文章,请查看这个链接。

参考

所有图片,除非特别注明,均为作者所有。

[1]维基百科*,*感知器(2022),https://en.wikipedia.org/wiki/Perceptron
【2】亚历山大·科瓦尔茨克,SVM 简洁地(2017),https://bitbucket . org/syncfusion tech/SVM-简洁地/src/master/
【3】维基百科,Hyperplanes (2021),https://en.wikipedia.org/wiki/Hyperplane

无拷贝数据帧操作的性能优势

原文:https://towardsdatascience.com/the-performance-advantage-of-no-copy-dataframe-operations-7bf8c565c9a0

StaticFrame 如何通过采用 NumPy 数组视图超越 Pandas

作者图片

NumPy 数组是一个 Python 对象,它将数据存储在一个连续的 C 数组缓冲区中。这些数组的优异性能不仅来自这种紧凑的表示,还来自数组在许多数组之间共享该缓冲区“视图”的能力。NumPy 经常使用“无复制”数组操作,在不复制底层数据缓冲区的情况下生成派生数组。通过充分利用 NumPy 的效率, StaticFrame DataFrame 库为许多常见操作提供了比 Pandas 好几个数量级的性能。

NumPy 数组的无拷贝操作

短语“无拷贝”描述了对容器(这里是数组或数据帧)的操作,其中创建了新的实例,但是底层数据被引用,而不是被拷贝。虽然为实例分配了一些新内存,但是与潜在的大量底层数据相比,这些内存的大小通常是微不足道的。

NumPy 使无拷贝操作成为处理数组的主要方式。当您对 NumPy 数组进行切片时,您将获得一个新数组,该数组共享从其切片的数据。对数组切片是一种无拷贝操作。通过不必复制已经分配的连续缓冲区,而是将偏移量和步长存储到该数据中,可以获得非凡的性能。

例如,对一个包含 100,000 个整数(~0.1 s)的数组进行切片,然后复制同一个数组(~10 s),两者之间的差别是两个数量级。

>>> import numpy as np
>>> data = np.arange(100_000)
>>> %timeit data[:50_000]
123 ns ± 0.565 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit data[:50_000].copy()
13.1 µs ± 48.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

我们可以通过检查 NumPy 数组的两个属性来说明这是如何工作的。flags属性显示了如何引用数组内存的详细信息。如果设置了base属性,它将提供一个数组句柄,该数组实际上保存了该数组引用的缓冲区。

在下面的例子中,我们创建一个数组,取一个切片,并查看切片的flags。我们看到,对于切片,OWNDATAFalse,切片的base是原始数组(它们有相同的对象标识符)。

>>> a1 = np.arange(12)
>>> a1
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])>>> a2 = a1[:6]
>>> a2.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : TrueOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False>>> id(a1), id(a2.base)
(140506320732848, 140506320732848)

这些派生的数组是原始数组的“视图”。视图只能在特定条件下拍摄:整形、转置或切片。

例如,在将最初的 1D 数组重新整形为 2D 数组后,OWNDATAFalse,表明它仍然引用原始数组的数据。

>>> a3 = a1.reshape(3,4)
>>> a3
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>> a3.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : FalseOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False>>> id(a3.base), id(a1)
(140506320732848, 140506320732848)

这个 2D 数组的水平和垂直切片同样会产生只引用原始数组数据的数组。同样,OWNDATAFalse,切片的base是原数组。

>>> a4 = a3[:, 2]
>>> a4
array([ 2,  6, 10])>>> a4.flagsC_CONTIGUOUS : FalseF_CONTIGUOUS : FalseOWNDATA : FalseWRITEABLE : TrueALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False>>> id(a1), id(a4.base)
(140506320732848, 140506320732848)

虽然创建共享内存缓冲区的轻量级视图提供了显著的性能优势,但也存在风险:改变这些数组中的任何一个都会改变所有数组。如下所示,将-1分配给我们的最具衍生性的数组反映在每个关联的数组中。

>>> a4[0] = -1
>>> a4
array([-1,  6, 10])
>>> a3
array([[ 0,  1, -1,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
>>> a2
array([ 0,  1, -1,  3,  4,  5])
>>> a1
array([ 0,  1, -1,  3,  4,  5,  6,  7,  8,  9, 10, 11])

像这样的副作用应该引起你的注意。将共享缓冲区的视图传递给可能改变这些缓冲区的客户端会导致严重的缺陷。这个问题有两个解决方案。

一种选择是调用者在每次创建新数组时进行显式的“防御性”复制。这消除了共享视图的性能优势,但确保了改变数组不会导致意外的副作用。

另一个不需要牺牲性能的选择是使数组不可变。通过这样做,可以共享数组的视图,而不用担心突变会导致意想不到的副作用。

通过在flags接口上将writeable标志设置为False,可以很容易地使 NumPy 数组成为不可变的。设置该值后,flags显示将WRITEABLE显示为False,试图改变该数组会导致异常。

>>> a1.flags.writeable = False
>>> a1.flagsC_CONTIGUOUS : TrueF_CONTIGUOUS : TrueOWNDATA : TrueWRITEABLE : FalseALIGNED : TrueWRITEBACKIFCOPY : FalseUPDATEIFCOPY : False>>> a1[0] = -1
Traceback (most recent call last):File "<console>", line 1, in <module>
ValueError: assignment destination is read-only

通过包含 NumPy 数组的不可变视图,最佳性能是可能的,并且没有副作用的风险。

无拷贝数据帧操作的优势

基于不可变数组的数据模型以最小的风险提供最佳的性能,这一见解是创建 StaticFrame 数据帧库的基础。由于 StaticFrame(像 Pandas)管理存储在 NumPy 数组中的数据,所以使用数组视图(而不必制作防御性副本)提供了显著的性能优势。如果没有不可变的数据模型,Pandas 就不能使用数组视图。

StaticFrame 并不总是比 Pandas 快:Pandas 对于连接和其他专门的转换有非常高性能的操作。但是当利用无拷贝数组操作时,StaticFrame 可以快得多。

为了比较性能,我们将使用 FrameFixtures 库创建两个 10,000 行、1,000 列的异构类型的数据帧。对于这两者,我们可以将静态框架Frame转换成熊猫DataFrame

>>> import static_frame as sf
>>> import pandas as pd
>>> sf.__version__, pd.__version__
('0.9.21', '1.5.1')>>> import frame_fixtures as ff
>>> f1 = ff.parse('s(10_000,1000)|v(int,int,str,float)')
>>> df1 = f1.to_pandas()
>>> f2 = ff.parse('s(10_000,1000)|v(int,bool,bool,float)')
>>> df2 = f2.to_pandas()

无复制操作优势的一个简单例子是重命名轴。对于熊猫,所有底层数据都是防御性复制的。使用 StaticFrame,所有底层数据都被重用;只需要制造轻质的外部容器。StaticFrame (~0.01 ms)几乎比熊猫(~100 ms)快四个数量级。

>>> %timeit f1.rename(index='foo')
35.8 µs ± 496 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit df1.rename_axis('foo')
167 ms ± 4.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

给定一个数据帧,通常需要在索引中加入一列。当 Pandas 这样做时,它必须将列数据复制到索引,以及复制所有底层数据。StaticFrame 可以重用索引中的列视图,也可以重用所有底层数据。StaticFrame (~1 ms)比熊猫(~100 ms)快两个数量级。

>>> %timeit f1.set_index(0)
1.25 ms ± 23.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df1.set_index(0, drop=False)
166 ms ± 3.52 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

从数据帧中提取列的子集是另一种常见的操作。对于 StaticFrame,这是一个无复制操作:返回的 DataFrame 只是保存原始 DataFrame 中列数据的视图。StaticFrame (~10 s)做这个比熊猫(~100 s)快一个数量级。

>>> %timeit f1[[10, 50, 100, 500]]
25.4 µs ± 471 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit df1[[10, 50, 100, 500]]
729 µs ± 4.14 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

连接两个或多个数据帧是很常见的。如果它们有相同的索引,并且我们水平连接它们,StaticFrame 可以重用输入的所有底层数据,使这种形式的连接成为无拷贝操作。StaticFrame (~1 ms)做这个比熊猫(~100 ms)快两个数量级。

>>> %timeit sf.Frame.from_concat((f1, f2), axis=1, columns=sf.IndexAutoFactory)
1.16 ms ± 50.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit pd.concat((df1, df2), axis=1)
102 ms ± 14.4 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

结论

NumPy 旨在利用数据的共享视图。因为 Pandas 允许就地变异,所以它不能充分利用 NumPy 数组视图。由于 StaticFrame 构建在不可变的数据模型上,因此消除了副作用突变的风险,并且包含了无拷贝操作,从而提供了显著的性能优势。

递归预测的危险

原文:https://towardsdatascience.com/the-perils-of-recursive-forecasting-82ebd218d147

为什么你的递归预测模型可能不尽如人意

康斯坦特·肯·林在 Unsplash 上的照片

时间序列的递归预测乍一看似乎很自然。你学会了如何预测下一步,并利用这些预测来预测下一步。这样,你可以预测任何数量的步骤。很棒,不是吗?

但是,有一点很奇怪。想象一个菜鸟消防员正在学*爬转盘梯子。他的教练告诉他如何从第一级爬到第二级。当学徒成功地练*后,教练说,“太好了,你做好了在紧急情况下一路爬到山顶的准备!只要重复你所学的,直到你到达篮筐。”

菜鸟有一种模糊的感觉,爬上 75 英尺的顶端与仅仅迈出第一步是不同的。

说到递归预测,也是类似的情况。正常的程序是训练模型预测下一步,但是预测下一步要比预测第一步困难得多。

与流行的观点相反,这不仅是关于误差随着每一步变大,而且学*的模型参数可能是错误的。

标准的一步到位培训

我们来做一个简单的例子。要预测的时间序列是一个简单的正弦波/正弦曲线,我们将尝试预测它的最后一部分(以红色显示)。

训练和测试分割(图片由作者提供)

预测这个时间序列会非常容易,但是为了说明问题,我们使用了一个不合适的模型:一个只能使用当前值来预测下一个值的线性模型。用数学术语来说 𝑦(𝑡+1) =𝑎𝑦 (𝑡) +𝑏,这基本上是一个 AR(1) 的过程。

模型的一个好的猜测是使用当前值𝑦 (t) 进行预测,因为下一个值总是非常接*当前值。所以这个模型会有𝑎=1 和𝑏=0.

训练该模型满足这一期望并产生𝑎=0.9948、𝑏=-0.0063。因此,该模型基本上预测𝑦*(𝑡+1)**(𝑡)*。

现在,让我们尝试用这个模型递归预测未来…

递归预测当前值会产生一条不符合正弦曲线的常数线(图片由作者提供)

这得出的 MSE(均方误差)为 1.26,看起来绝对不是一个好的预测。

看看训练集上一堆递归预测的痕迹。

标准拟合后递归预测的轨迹(图片由作者提供)

直觉上,一个简单预测零(𝑎=0 和𝑏=0)的模型会好得多。

预测零(=均值)是一个安全的赌注(图片由作者提供)

事实上,这减少了一半以上的误差(MSE 1.26 对 0.51)。

然而,该模型无法学*这种策略,因为它从未被训练为递归使用。

单步模型的递归训练

根据自己的预测递归地训练模型将会显示,甚至有比简单地预测零更好的策略。

这种递归训练是如何工作的?

首先,将在正常训练数据上训练模型。结果将是一个好的一步估计器。该估计器用于预测整个训练集。这些一步预测可以附加到训练集中,并且可以训练出好的两步预测器。根据它的预测,可以训练一个好的三步预测器,等等。一旦达到必要的预测步骤数,就可以根据参数是否已经收敛来进一步拟合模型。

在递归训练拟合模型 50 步之后,参数是𝑎=0.8584 和𝑏=0.0002,并且测试集的 MSE 已经减少到 0.44。

递归拟合:预测趋*于零(作者图片)

太棒了,AR(1)模型的最佳预测策略是逐渐接* 0,因此最初仍然利用与起始值的接*度。

查看训练集的跟踪…

递归拟合后的递归预测轨迹(作者图片)

这是递归训练的可视化。您可以看到,在最初的步骤中,数据几乎完全符合回归线。此后,随着每个训练步骤的进行,越远的预测点(黄色)越难到达,因此必须调整参数(注意黑色回归线的旋转)。为了整体预测的准确性,牺牲了短期的准确性。

递归训练的可视化(图片由作者提供)

我们可以对标准拟合进行相同的可视化(没有递归训练,模型只拟合一次)。

注意,回归线现在只代表递归生成的数据的最佳线性拟合。𝑏≈0. 𝑎≈1 每一步所用的模型都是一样的

您可以看到,从第一个模型递归地生成预测,然后根据生成的轨迹训练一个模型也是一种选择。它将产生大约零预测策略:𝑎≈0,𝑏≈0

递归预测标准拟合的可视化(图片由作者提供)

总之,与标准拟合相比,递归拟合将 MSE 降低了 66%。

在这种情况下,递归拟合明显优于一步拟合或常数零预测(图片由作者提供)

这种巨大的改进是由于例子的简单性和 AR(1)模型完全不适合数据的事实。

但是,当使用递归预测模型时,您仍然可以尝试检查递归训练是否改进了您的模型。

请记住,根据您的数据大小、预测步骤的数量和模型的复杂性,训练时间可能会显著增加。

不幸的是,除了增加训练时间之外,如果你的模型倾向于过度拟合,还有一个更糟糕的问题。

递归训练中过度拟合的后果

若要检查递归训练期间过度拟合的效果,可以使用一个带有内存的模型,该模型可以完美地再现所有训练数据。对于以前没有见过的数据,它将使用一种回退估计模型。

当递归使用时,过拟合模型完美地再现了样本中的一切。

然而,样本外我们又回到了我们最初开始的地方,就好像我们没有递归训练一样。

由于过度拟合,模型从未发现它会对看不见的数据产生错误,因此它不能在训练期间适当地调整参数。

你可以在附带的 Kaggle 笔记本里试试这个。

实用的建议

在现实生活的预测场景中解决这个问题并不容易。

完美的解决方案是在不同的数据上训练每个递归步骤。对于 24 的预测范围,您可以将定型数据拆分为 24 个部分,在第一部分定型一步估计器,预测第二部分,依此类推。但是,您可能没有足够的训练数据用于此策略,因此模型的性能可能会很差。

那么你必须有创意,使用更少的剪辑,添加从样本外预测中采样的噪声,等等。将训练数据分成 4 部分并递归拟合 4 个步骤对于 24 个月的预测来说可能并不理想,但如果真的有所不同呢?!

另一个你可以尝试的方法是用直接多步模型(DMS)代替递归策略。因此,您将训练一个模型来预测𝑦 (𝑡+1) ,另一个模型来预测𝑦 (𝑡+2) 等等。一些好处:

  • 与递归策略相比,预测误差不会增加
  • 无需预测可能有用但难以预测的额外变量,例如库存水平
  • 短期模型可以使用与长期模型不同的变量,例如,今天的销售和库存对短期模型很重要,但总体趋势和产品生命周期对长期模型更重要

最后一个提示:请务必查看随附的 Kaggle 笔记本中的,其中包括递归训练代码和绘图代码。如果你像我一样对预测感兴趣,你可能也想在这里或者在推特上关注我。

为什么人工智能模型组合在一起会失败

原文:https://towardsdatascience.com/the-pitfalls-of-using-ai-as-the-input-of-another-ai-e0a3f0f485e4

在复杂的人工智能流水线上错误是如何累积的

照片由汉娜·布斯在 Unsplash 上拍摄

在的上一篇文章中,我简要提到了顺序使用 AI 是一场噩梦。每当一个人工智能被用作另一个人工智能的输入时,每个模型的个体误差很快就会累积到不可接受的水平,或者简单地说,灾难性的失败。此外,随着你向链中添加更多的节点,问题会成倍恶化。在这篇文章中,我详细阐述了这个问题,解释了为什么序列模型会失败的直觉,以及我们如何补救这些问题。

下面的讨论对于任何开发复杂 AI 管道的人来说都是至关重要的,例如使用对象检测来找到感兴趣的对象,并对这些对象应用一些其他模型。同样,向聊天机器人人工智能提供情绪分析结果,或者尝试使用其他预测模型的结果来预测股票价格。如果第一种模式失败了,那么在所有这些情况下,很难甚至无法保证第二种模式会产生任何有价值的东西。

作为免责声明,串行使用 AI 是更成问题,并非不可能。关键在于理解模型之间的误差是如何累积的,并减轻其复合效应。串行人工智能完全是为了设计公差,而不是增加精度。换句话说,如何从第一个模型的错误中备份第二个模型。

我们走吧。

错误是如何组合的

考虑 MNIST 分类器的简单情况。如果你按照一个简单的教程,你会很快达到 97%左右的准确率,这已经相当不错了。这是一个 MNIST 数字的例子。

MNIST 数字样本(来源)

现在,考虑识别邮政服务的五位数邮政编码。显而易见的方法是对每个数字运行分类器,然后合并结果。总的来说,您将执行五个 97%准确的分类,并且您需要它们都成功地正确识别邮政编码。从数字上看,你的准确率现在下降到了 86%(或者 97%⁵).

换个角度来看,假设你的分类预测值是 10001,而正确值是 90009。然后,在谷歌上快速搜索一下,你就会发现一个寄往洛杉矶(90009)的包裹会被寄往纽约市(10001)!

当使用人工智能产品时,我们往往会被概率的含义搞得有点晕头转向。虽然 86%对于某些问题来说可能很高,但这还远远不够。它表示每 100 个包裹中有 14 个会被发送到错误的地址。这个失败率高得令人无法接受。如果考虑到每秒解析一封邮件,我们每七秒钟就会误读一次。

类似地,一个 9 位数的邮政编码分类器只有 76%的准确率。换句话说,大约四分之一的包裹会被发送到错误的地址。同样,邮政编码每四秒钟就会被误读一次。

这个例子显示了当我们增加成功所需的预测数量时,相对较低的误差(3%)如何迅速增长到不可接受的水平。然而,这仍然是一个微不足道的例子,因为每个数字都是相互独立的——实际的最坏情况是模型按顺序运行。

顺序误差

考虑一个有点类似的问题:从房屋照片中识别门牌号。例如,你需要找到下图中的数字(510),然后识别它的数字。

照片由乔恩·泰森在 Unsplash 拍摄

假设您的检测模型可以在 80%的情况下正确裁剪门牌号,并且您正在使用 MNIST 分类器来识别这三个数字(准确率约为 91%)。这种设置将我们引向以下三种情况:

  1. 该号码被找到(80%)并被正确识别(91%): 73%
  2. 该号码已被找到(80%),但未被正确识别(9%): 7%
  3. 没有找到数字:20%

在这个简单的例子中,很明显检测模型如何抑制了我们的总成功率:如果检测失败,我们甚至无法尝试得出一个数字。换句话说,即使我们有一个完美的数字解析器,我们仍然会受到检测器 80%精度的限制。

如果我们的模型在检测单个房子时有 73%的准确性,那么要完美地处理一张有三个房子的照片**,我们的系统只有 39%的准确性!**此外,至少有 50%的几率不会检测到一个家庭。此外,还有一种情况我们必须考虑:错误检测。

错误检测传播

对于第一个问题(邮政编码解析),每个数字都是独立的,这意味着一个数字分类的成功或失败不会影响其他数字。相反,在第二个问题上,只有当检测发现有用的感兴趣区域(ROI)时,数字识别才能发生。然而,如果我们得到一个坏检测呢?

**当一个人工智能算法的输入是另一个算法的输出时,它的结果只会和前一个算法的输出一样好。**在示例中,我提到只有首先找到门牌号,我们才能解析门牌号。但是,如果检测只发现了部分的门牌号呢?如果它检测到某个随机图像区域是一个数字呢?

你会怪算法检测出 4,79,1 吗?(来源 A 和 B )

这里我举例说明了三种情况,其中检测算法报告了一个数字,但是检测不适合于识别。在第一种情况下,很自然地假设 AI 可能会输出 4,而在第二种情况下,由于底部被裁剪,它可能会很高兴地将 32 误认为 79。在第三个案例中,它报告了一个没有车牌的图像区域。在这种情况下,数字识别算法给出的任何输出都没有意义。

回到概率,假设我们的探测器有 80%的机会探测到某些东西,我们仍然必须考虑这些探测有多好。换句话说,我们的成功率很可能远低于我们最初认为的 73%。

缓解策略

到目前为止,我们已经分析了多重预测如何损害整体准确性,以及当我们链接预测模型时情况会变得如何糟糕。然而,尽管这些问题总是存在,但是我们可以依靠一些技巧来减轻多模型的负面影响。

使用冗余检测器:与直觉相反,如果你部署了两个检测算法,你所需要的就是让其中一个找到你想要的东西(例如,一个门牌号)。由于不需要探测器同意,你将增加你得到一个好的预测的几率。另外,如果它们一致,您可以组合它们的输出。

**后处理检测:**假设第一个模型输出一个边界框。您可以预先计算数据集的平均边界框大小,并将算法输出至少放大到该大小。这对于不完整的检测非常有帮助。另一种方法是使用经过训练的分类器,以确保检测到的 ROI 属于您正在寻找的类别。这有助于抑制虚假检测的出现。

**不确定性建模:**如果一个模型向另一个模型提供错误的预测,研究不确定性建模技术可能会有所帮助。这里的目标是感知何时最好放弃一个预测,而不是沿着模型链强制一个坏的检测。一个简单的方法是蒙特卡罗丢弃:在测试时保持丢弃层活动,并运行模型几次。如果模型是确定的,它的预测应该具有低方差;相反,如果模型预测的是假样本,则输出会有很高的方差。

**模拟生产环境:**在与其生产环境非常相似的条件下训练第二个模型是至关重要的。例如,大量使用数据扩充来模拟检测错误,或者更好的是,将实际预测作为训练数据。

**尽可能使用原始输出:**假设您将一个分类器的结果提供给另一个分类器。使用由该算法产生的原始 logits 向量可能比 class-id 或 one-hot 向量更有利。对于边界框,将对象/置信度分数与坐标一起包含是有益的。天气预报就是一个很好的例子。大多数系统不会告诉你“会/不会下雨。”相反,他们会告诉你下雨的可能性。当你计划你的一天时,你要考虑可能性。

当处理视频/流时

在视频和流的特殊情况下,我们可以使用过去的数据对当前(和未来)的事态做出有根据的猜测。以下技巧都是关于外推过去填补空白:

**重复检测:**说你在前一帧检测到一个人,现在没有。人不容易在一帧中消失,所以在检测器再次检测到人之前,重复检测几帧可能不会有什么坏处。只要再多一点爱心,你就可以跟踪物体的边界框,并进行外推,而不是简单地重复它。

**追踪器:**如果想全程追踪,可以使用羽翼丰满的追踪器,比如 DeepSORT 。追踪器将为检测分配身份,并在处理诸如平滑和外推错过的检测之类的事情时,跟踪它们从一帧到另一帧的去向。

**使用移动平均线:**假设你的最终输出是一个从 0 到 1 的值。如果您将这个原始数字发送给最终用户,它可能看起来不稳定,好像算法是随机猜测的。因此,相反,你可以跟踪过去产出的移动平均值,以使事情变得平稳。使用这种技术,您可以优雅地处理丢失/伪造的检测,提供一个整体上更平滑的体验。

总的来说,这些技术旨在从第一个模型故障中备份系统,并为第二个模型的运行提供充足的空间。当谈到视频和流媒体时,你的大部分腿部空间来自于重用过去的数据来推断未来。然而,所有这些技术都有一个共同的特点:链接模型的关键是设计容错的管道

失败时有发生。每秒运行一次的 99%准确的模型仍然会几乎每隔一分钟错误预测一个样本。当使用人工智能时,不存在逃避错误的问题。然而,我们可以容忍它们。

他的一切都是为了现在。如果你对这篇文章有任何问题,请随时评论或与我联系。你也可以订阅我在你的收件箱这里发布的内容。你也可以通过请我喝杯咖啡:)来直接支持我

如果你是中新,我强烈推荐订阅。对于数据和 IT 专业人员来说,中型文章是 StackOverflow 的完美组合,对于新手来说更是如此。注册时请考虑使用我的会员链接。

感谢阅读:)

数据分析中模的力量

原文:https://towardsdatascience.com/the-power-of-modulo-in-data-analysis-fbd5ddfd561c

你可能知道不同编程语言中的模运算符。但是您如何使用这个操作符,以及为了什么?

在 Unsplash 由 Anoushka P 拍摄的照片

什么是模?

简而言之,模运算符返回除法的余数。

许多编程语言都有一个运算符或一个函数来计算模块。
T-SQL 有%操作符,DAX 有 MOD()函数。

如果您没有直接计算模数的方法,您可以使用以下公式从数字 A 计算模数 B:

A — A / B * B → A ( ( A / B) * B)

在 T-SQL 中,以下表达式都返回相同的结果:11

SELECT 263-((263/14)*14), 263%14;

但是,模运算有什么有趣的呢?

当您有一系列连续的数字,并且您对每个数字计算模 4 时,结果从 0 开始,上升到 3,然后再重新开始:

图 1 —以 4 为模的数列(作者提供的数字)

这种效应开启了很多可能性。

让我们来看三个我和我的客户一起工作的例子,其中模数简化了很多。

创建任意分段

我的一个客户问了我以下的问题:“我怎样才能任意地对我的客户进行细分?”

使用模运算,解决方案很简单:每个客户都有一个数字客户 ID。通过计算每个客户的模数,我以最小的努力将每个客户分配到任意的细分市场。

如果您没有数字 ID,您可以添加一个索引列,按您想要的任何列排序,并基于此计算模数以获得分段:

图 2——任意的客户细分(由作者提供)

计算每分钟的 15 分钟

另一个客户要求我将基于时间的数据汇总到每小时四个时间段。

  • 分钟 01–14→00
  • 第 15–29 分钟→ 15 分钟
  • 第 30–44 分钟→ 30 分钟
  • 第 45 分钟–60 分钟→ 45 分钟

图 3-分钟分段(作者提供的图)

现在,我可以通过 15min_Slice 列聚合数据。

结论

Modulo 在这两种情况下都帮助我创建了简单有效的解决方案。

尤其是第二个例子是一个解决挑战的突发奇想。

我希望这两个例子可以帮助您解决不使用模运算符就需要更复杂计算的挑战。

照片由 Riccardo Annandale 在 Unsplash 拍摄

参考

在我的示例中,我使用了 Contoso 示例数据集,就像我以前的文章中一样。你可以从微软这里免费下载 ContosoRetailDW 数据集。

Contoso 数据可以在 MIT 许可下自由使用,如这里的所述。

https://medium.com/@salvatorecagliari/membership

迪士尼数据的 SQL 聚合窗口函数的强大功能

原文:https://towardsdatascience.com/the-power-of-sql-aggregate-window-functions-with-disney-data-9c92ebbf2540

AVG(),计数(),最大值(),最小值(),总和()

Travis Gergen 在 Unsplash 上拍摄的照片

窗口函数允许我们在每一行上执行操作并显示结果,这与基于查询组合多行的普通 SQL 操作相反。普通的 SQL 聚合函数对于将多行分解成解决方案是必不可少的。例如,这些函数可以显示多行的平均值并输出单个数值,或者显示一组行中的实例数。在聚合窗口函数中,我们可以将这个聚合结果应用于数据的每一行。这使我们能够轻松地创建有用且高效的结果,例如累积和、特定行输出与所有行平均值的比较。

五种类型的聚合窗口函数是:

  • AVG()
  • 计数()
  • 最大()
  • 最小值()
  • 总和()

在我们进入每个聚合窗口函数的细节之前,我们应该看看这些函数通常是如何写出的:

[Aggregate Function]([column]) OVER([specific operation] column_name)

例如,一个示例 SQL 命令如下所示:

SELECT *, SUM(column_x) OVER(PARTITION BY column_y ORDER BY column_z)
FROM table

请注意,x、y 和 z 列可以相同,也可以不同

数据: 本文中使用的数据最初由 Rashik Rahman 发布到 Kaggle,授权为 CC0: Public Domain。拉西克的 Kaggle 个人资料的链接可以在这里找到(这里)。该数据由 1937 年至 2016 年的迪士尼电影组成,并显示以下变量名称:电影名称、电影上映日期、类型、mpaa 评级、总票房和通货膨胀调整后的票房。出于本文的目的,我将主要使用“标题”、“发行日期”、“流派”和“总收入”。此外,我将重点关注 2015 年上映的电影,以简化结果输出。数据示例如下:

作者图片

*这些数据将仅用于演示我们的聚合窗口函数,不应被视为这些电影的完整和准确的来源。

基本用例: 如前所述,聚合窗口函数的工作方式与普通聚合函数相同,但它不提供合并输出,而是将输出反映在表中的每一行上。例如,AVG()窗口函数完全按照您的预期工作,它创建给定分区中值的平均值,并将该值输出到数据的每一行。下面的 SQL 代码演示了这一点:

SELECT title, genre, total_gross, 
ROUND(AVG(total_gross) OVER(PARTITION BY genre),0) as average 
FROM disney
WHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'

作者图片

新的“平均”栏按类型划分,显示了每种类型的平均总票房收入。使用相同的概念和实践,我们可以使用所有五个聚合函数运行相似的指标。

SELECT title, genre, total_gross, 
ROUND(AVG(total_gross) OVER(PARTITION BY genre),0) as average,
ROUND(COUNT(*) OVER(PARTITION BY genre),0) as total_count,
ROUND(MAX(total_gross) OVER(PARTITION BY genre),0) as max_gross,
ROUND(MIN(total_gross) OVER(PARTITION BY genre),0) as min_gross,
ROUND(SUM(total_gross) OVER(PARTITION BY genre),0) as total_sum
FROM disney
WHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'

作者图片

这里我们看到了所使用的每个聚合函数及其输出。虽然获得这些信息会有所帮助,但是这种类型的操作也可以在没有窗口函数的情况下完成,而是使用连接到原始数据集的普通聚合嵌套查询来完成。下面是 AVG()函数的一个例子:

SELECT title, d.genre, total_gross, ROUND(average,0)
FROM disney d LEFT JOIN (SELECT genre, AVG(total_gross) as average FROM disneyWHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'GROUP BY genre) aON d.genre = a.genreWHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'
ORDER BY genre

上述代码块的结果与我们的窗口函数完全相同,但是上述代码块需要一个更复杂的语句。

累积案例:
在我看来,这些聚合窗函数最大的好处就是当它们被用来寻找累积值的时候。要对现有的代码块进行这种更改,我们需要做的就是在 OVER()语句中添加 ORDER BY 子句。能够在几个步骤中添加累积值有助于为这些聚合窗口函数增加巨大的力量。下面是一个使用 SUM()函数的例子。

SELECT title, genre, total_gross, 
ROUND(SUM(total_gross) OVER(PARTITION BY genre ORDER BY release_date),0) as cumulative_sum
FROM disney
WHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'

作者图片

这里我们看到了每个分区的 total_gross 列的累积方面。我们可以使用下面的代码块将同样的方法应用于所有函数:

SELECT title, genre, total_gross, ROUND(AVG(total_gross) OVER(PARTITION BY genre ORDER BY release_date),0) as cumulative_average,ROUND(COUNT(*) OVER(PARTITION BY genre ORDER BY release_date),0) as cumulative_count,ROUND(MAX(total_gross) OVER(PARTITION BY genre ORDER BY release_date),0) as max_gross,ROUND(MIN(total_gross) OVER(PARTITION BY genre ORDER BY release_date),0) as min_gross,ROUND(SUM(total_gross) OVER(PARTITION BY genre ORDER BY release_date),0) as cumulative_sumFROM disney
WHERE release_date >= '2015-01-01' AND release_date < '2016-01-01'

作者图片

利用这些函数的累积特性,我们现在可以看到一些有趣的结果。以“动作片”为例,我们可以看到,第一部《复仇者联盟:奥创时代》上映后,平均票房为 4.59 亿美元,而在《蚁人》上映后,平均票房降至 3.2 亿美元。cumulative_count 列只是计算行数并显示结果。我们看到两部电影的 max_gross 栏都保持在 4.59 亿美元,因为第一部电影的票房比第二部高,相反,当我们看 min_gross 时,我们看到它从 4.59 亿美元开始,然后在《蚁人》上映后下降到 1.8 亿美元。最后,cumulative_sum 的工作方式和我们之前解释的一样,在分区中添加每部电影的 total_gross。

结论:
使用聚合窗口函数可以帮助我们创建有用的信息指标,同时还可以帮助我们节省编写查询的时间。聚合窗口函数只是窗口函数的一个分支,你可以在这里找到我之前关于窗口函数排名的文章。感谢您花时间阅读本文,更多数据科学相关内容请关注我!

作者图片

YOLOv5 算法目标检测实用指南

原文:https://towardsdatascience.com/the-practical-guide-for-object-detection-with-yolov5-algorithm-74c04aac4843

详细教程解释了如何在您自己的自定义数据集上有效地训练对象检测算法 YOLOv5。

作者标签,国家科学基金会图片,http://www.nsf.gov/

简介

识别图像中的物体被认为是人脑的一项普通任务,尽管对机器来说并不那么简单。照片中物体的识别和定位是一项被称为“物体检测”的计算机视觉任务,在过去几年中出现了几种算法来解决这个问题。迄今为止最流行的实时对象检测算法之一是 YOLO(你只看一次),最初由 Redmond 等人提出。阿尔[1]。

在本教程中,您将学*使用 Ultralytics 开发的最新 YOLOv5 实现对自定义数据集执行端到端对象检测项目[2]。我们将使用迁移学*技术来训练我们自己的模型,评估它的性能,使用它进行推理,甚至将其转换为其他文件格式,如 ONNX 和 TensorRT。

本教程面向具有目标检测算法理论背景的人,他们寻求实际的实施指导。为了您的方便,下面提供了一个易于使用的 Jupiter 笔记本,并附有完整的代码。

数据处理

数据集创建

在本教程中,我从网上手动标记了大约 250 张企鹅的图片和视频,生成了自己的企鹅数据集。我花了几个小时使用 Roboflow 平台,该平台对公众用户友好且免费[3]。为了实现健壮的 YOLOv5 模型,建议每类训练 1500 个以上的图像,每类训练 10,000 个以上的实例。还建议添加高达 10%的背景图像,以减少假阳性错误。由于我的数据集非常小,我将使用迁移学*技术缩小训练过程。

YOLO 标签格式

大多数注释平台支持以 YOLO 标签格式导出,为每个图像提供一个注释文本文件。每个文本文件包含图像中每个对象的一个边界框(BBox)注释。注释被标准化为图像大小,并且在 0 到 1 的范围内。它们以下列格式表示:

< object-class-ID>

如果图像中有两个对象,YOLO 注释文本文件的内容可能如下所示:

数据目录结构

为了符合 Ultralytics 目录结构,数据以下列结构提供:

为了方便起见,我在笔记本上提供了一个自动创建这些目录的功能,只需将你的数据复制到正确的文件夹中。

配置文件

培训的配置分为三个 YAML 文件,它们随回购协议本身一起提供。我们将根据任务定制这些文件,以满足我们的需求。

  1. 数据配置文件描述了数据集参数。由于我们是在自定义的企鹅数据集上训练,我们将编辑这个文件并提供:训练、验证和测试(可选)数据集的路径;类的数量(NC);和类名,顺序与它们的索引相同。在本教程中,我们只有一个名为“企鹅”的类。我们将自定义数据配置文件命名为‘penguin _ data . YAML ’,并将其放在‘data’目录下。这个 YAML 文件内容如下:

2.模型配置文件规定了模型架构。Ultralytics 支持几种 YOLOv5 架构,命名为 P5 型号,主要因其参数大小而异:YOLOv5n (nano)、YOLOv5s (small)、YOLOv5m (medium)、YOLOv5l (large)、YOLOv5x (extra large)。这些架构适合于用 640640 像素图像尺寸进行训练。附加系列,针对 12801280 的较大图像尺寸的训练进行了优化,称为 P6 (YOLOv5n6、YOLOv5s6、YOLOv5m6、YOLOv5l6、YOLOv5x6)。P6 模型包括一个额外的输出层,用于检测较大的对象。他们从更高分辨率的训练中受益最多,并产生更好的结果[4]。

Ultralytics 为上述每个体系结构提供内置的模型配置文件,这些文件位于“models”目录下。如果您是从零开始训练,选择具有所需架构的模型配置YAML 文件(在本教程中为“YOLOv5s6.yaml”),然后只需将类的数量(nc)参数编辑为自定义数据中正确的类的数量。

当训练像本教程中一样从预训练的权重初始化时,不需要编辑模型配置文件,因为模型将使用预训练的权重提取。

3.超参数配置文件定义了训练的超参数,包括学*率、动量、损耗、增量等。Ultralytics 在“data/hyp/hyp.scratch.yaml”目录下提供了一个默认的超参数文件。正如我们将在本教程中所做的那样,我们主要建议从默认的超参数开始训练,以建立一个性能基线。

YAML 配置文件嵌套在以下目录中:

培训

为了本教程的简单性,我们将训练小参数大小的模型 YOLOv5s6,尽管可以使用更大的模型来改善结果。对于不同的情况,可以考虑不同的训练方法,这里我们将介绍最常用的技术。

从零开始训练

当拥有足够大的数据集时,模型将从零开始训练中受益最多。权重是通过向权重参数传递空字符串(“”)来随机初始化的。训练由以下命令引发:

  • 批次—批次大小(-1 表示自动批次大小)。使用硬件允许的最大批量。
  • 时期—时期的数量。
  • 数据—数据配置文件的路径。
  • cfg 模型配置文件的路径。
  • 权重-初始权重的路径。
  • 缓存—缓存图像以加快训练速度。
  • img —以像素为单位的图像大小(默认为 640)。

迁移学*

预训练模型热启动:

由于我的企鹅数据集相对较小(约 250 张图片),迁移学*有望产生比从头开始训练更好的结果。Ultralytic 的默认模型是在 COCO 数据集上预先训练的,尽管也支持其他预先训练的模型(VOC、Argoverse、VisDrone、GlobalWheat、xView、Objects365、SKU-110K)。COCO 是一个对象检测数据集,包含来自日常场景的图像。它包含 80 个类,包括相关的“鸟”类,但没有“企鹅”类。通过将模型的名称传递给“weights”参数,我们的模型将使用来自预训练 COCO 模型的权重进行初始化。将自动下载预训练模型。

特征提取

模型由两个主要部分组成:作为特征提取器的主干层和计算输出预测的头部层。为了进一步补偿较小的数据集大小,我们将使用与预训练 COCO 模型相同的主干,并且只训练模型的头部。YOLOv5s6 主干由 12 层组成,它们将由‘冻结’参数固定。

  • 权重-初始权重的路径。COCO 模型会自动下载。
  • 冻结(freeze )-要冻结的层数
  • 项目—项目的名称
  • 名称-运行的名称

如果提供了“项目”和“名称”参数,结果会自动保存在那里。否则,它们被保存到“运行/训练”目录。我们可以查看保存到 results.png 文件的指标和损失:

“特征提取”训练的结果|作者图片

为了更好地理解结果,让我们总结一下 YOLOv5 损失和指标。YOLO 损失函数由三部分组成:

  1. box_loss —包围盒回归损失(均方误差)。
  2. obj_loss —物体存在的置信度就是物体损失。
  3. cls_loss —分类损失(交叉熵)。

因为我们的数据只有一个类别,所以没有类别错误识别,并且分类错误始终为零。

精度测量 bbox 预测正确的程度(真阳性/(真阳性+假阳性)),而召回测量真 bbox 预测正确的程度(真阳性/(真阳性+假阴性))。“mAP_0.5”是 IoU(联合交集)阈值为 0.5 时的平均精度( mAP )。“mAP_0.5:0.95”是不同 IoU 阈值的平均 mAP,范围为 0.5 至 0.95。你可以在参考文献[5]中了解更多。

微调

训练的最后一个可选步骤是微调,包括解除冻结我们上面获得的整个模型,并以非常低的学*率根据我们的数据重新训练它。通过逐步调整预训练特征以适应新数据,这有可能实现有意义的改进。可以在超参数-配置文件中调整学*率参数。对于教程演示,我们将采用内置的“hyp.finetune.yaml”文件中定义的超参数,它的学*速率比默认的要小得多。权重将使用前一步骤中保存的权重进行初始化。

python train.py --hyp 'hyp.finetune.yaml' --batch 16 --epochs 100 --data 'data/penguins_data.yaml' --weights 'runs_penguins/feature_extraction/weights/best.pt' --project 'runs_penguins' --name 'fine-tuning' --cache
  • 超级-超级参数配置文件的路径

正如我们在下面看到的,在微调阶段,指标和损耗仍在改善。

“微调”训练的结果|作者提供的图片

验证

为了评估我们的模型,我们将利用验证脚本。性能可以通过训练、验证或测试数据集分割来评估,由“任务”参数控制。这里,正在评估测试数据集分割:

我们还可以获得精确召回曲线,它会在每次验证时自动保存。

精确度—测试数据的召回曲线分割|作者图片

推论

一旦我们获得了令人满意的训练性能,我们的模型就可以进行推理了。根据推断,我们可以通过应用测试时间增强(TTA)来进一步提高预测的准确性:每个图像都被增强(水平翻转和 3 个不同的分辨率),最终的预测是所有这些增强的集合。如果我们紧抓每秒帧数(FPS)速率,我们将不得不放弃 TTA,因为它的推论是 2-3 倍长。

用于推断的输入可以是图像、视频、目录、网络摄像头、流甚至 youtube 链接。在下面的检测命令中,测试数据用于推断。

  • 源—输入路径(0 表示网络摄像头)
  • 权重-权重路径
  • img —用于推断的图像大小,以像素为单位
  • conf —置信度阈值
  • iou—NMS 的 IoU 阈值(非最大抑制)
  • 增强——增强推理(TTA)

推理结果会自动保存到定义的文件夹中。让我们回顾一下测试预测的一个例子:

推理结果|作者图片

导出为其他文件格式

至此,我们的模型已经完成,并保存为带有。pt '文件扩展名。模型可以导出为其他文件格式,如 ONNX 和 TensorRT。ONNX 是一种中间的机器学*文件格式,用于在不同的机器学*框架之间进行转换[6]。TensorRT 是 NVIDIA 开发的一个用于优化机器学*模型的库,以在 NVIDIA 图形处理单元(GPU)上实现更快的推理[7]。

“export.py”脚本用于通过将类型格式应用于“include”参数,将 PyTorch 模型转换为 ONNX、TensorRT engine 或其他格式。以下命令用于将我们的企鹅模型导出到 ONNX 和 TensorRT。这些新的文件格式与 PyTorch 模型保存在同一个“权重”文件夹下。


感谢您的阅读!

想了解更多信息?

  • 探索 我写的附加文章
  • 订阅 在我发布文章时获得通知
  • 关注我的 Linkedin

本教程的完整代码在第一个参考资料[0]中提供:

参考文献

[0]完整代码:https://gist . github . com/Lihi-Gur-Arie/41f 014 BCF be 8 b 8e 1e 965 fa 11 a 6251 e 04

[1]https://arxiv.org/abs/1506.02640

https://github.com/ultralytics/yolov5

https://roboflow.com/

https://zenodo.org/record/4679653#.YfFLX3UzaV4

https://blog.paperspace.com/mean-average-precision/

https://onnx.ai/get-started.html

https://developer.nvidia.com/tensorrt

实用主义者线性回归假设指南

原文:https://towardsdatascience.com/the-pragmatists-guide-to-assumptions-in-linear-regression-fbb65482724b

忘记假设的清单:你需要什么取决于你的用例

图片由作者用 AI 模型 DALL E mini 生成。提示:“数学公式旁边的指南针”。学分:craiyon.com

许多关于线性回归及其假设的文章看起来像长长的洗衣单。而这些列表似乎与数据科学家在实践中使用线性回归的方式联系不大。此外,他们给出了错误的想法,除非你的数据满足所有的假设,否则你不应该使用线性模型。

这里我想改变通常的方法:我想从用例开始,而不是列出假设。你要线性回归做什么?你需要它来做预测吗?或者你需要它来理解因果关系?如果有,要不要量化它的不确定性?这些问题的答案告诉你你真正需要的假设是什么。

这种方法更有用,因为它反映了数据科学家的实际日常工作(我们从要解决的问题开始,然后考虑适当的统计工具箱,而不是相反!).

TL;速度三角形定位法(dead reckoning)

对于数据科学中的许多用例(侧重于预测),您只需要几个假设(随机抽样,没有完美的多重共线性)。如果你想要一个因果解释,那么你应该检查更复杂的假设(严格的外生性),特别是如果你想要通过一个标准的统计包量化因果效应的不确定性(同质性和正态性假设)。

用例 1:闭嘴,预测

假设您是一名数据科学家,为一家房地产中介工作。你一直在收集数据,现在你有很多关于市场上待售房屋的信息(大小、卧室数量、位置等。).您的老板现在希望您使用该数据集来构建一个潜在客户生成模型:即,一个可以找到最高预期售价的房屋的模型,以便您的公司可以联系业主并宣传其服务。

图片由作者用 AI 模型 DALL E mini 生成。提示:“一个房产中介机器人”。学分:craiyon.com

在这种情况下,您只需要找到一个具有良好预测能力的模型(特别是,善于预测房屋销售价格的模型)。如果我们使用线性回归模型,我们需要什么样的假设呢?因为我们只关心预测能力,所以假设列表减少到一个:

假设# 1——随机抽样:数据代表总体(又名无选择偏差)

对,就是这样!如果你只想最大化线性模型的预测能力,你只需要担心你的数据的代表性和无偏性。毕竟,您可能会沿着其他模型(包括参数模型和非参数模型)测试线性回归,并且您通常没有一系列假设来检查其他模型,所以您为什么要担心线性模型呢?

为什么我们需要这个假设?

假设#1 只不过是标准 ML 最佳实践的一种重述,著名的“确保你的训练集来自与测试集相同的分布”。因此,这种假设并不是线性回归所独有的。换句话说,没有必要记住假设 1,因为它可能已经是你的工具箱的一部分了。

用例 2:具有可解释性的预测

然而在实践中,我们很少把预测作为我们唯一的目标。我们经常想看一眼模型的系数并获得一些见解——如果不是关于世界,至少是为了检查模型的健全性。例如,我们可能希望利用销售团队中同事的专业知识来改进我们对房屋数据进行特征工程的方式。为此,我们首先需要了解哪些特征在模型预测中的权重最大(即测量其系数的绝对值),以及它们与目标变量是正相关还是负相关(即系数的符号)。简而言之,我们需要了解我们的模型是如何做出预测的。

我们只需要一个假设来确保我们可以明智地检查我们的线性模型:

假设# 2——没有完美的多重共线性:独立变量之间没有精确的线性关系。

为什么我们需要这个假设?

事实是,如果您的模型表现出完美的多重共线性,那么最小化残差的最小平方和的问题就有多个(实际上是无限个)解决方案。虽然这对于进行预测来说不一定是个问题,但它使得查看系数变得毫无意义:它们的值与特征和目标之间的真实相关性没有太大关系(与它们的估计量相关联的方差无限大)。

用例 3:带有因果解释的预测

现在让我们想象一个非常不同的场景。比方说,你对你的模型的准确性印象深刻,以至于你决定离开房地产经纪人,自己创业。你心目中的商业模式相当冒险:你想实际建造房屋,然后出售并获利。为了帮助你做到这一点,你希望你的模型告诉你每所房子应该有什么特征(大小,房间数量,位置等。)为了最大化售价。

就线性回归所需的假设而言,这意味着什么?这个场景与前两个场景非常不同。在没有意识到这一点的情况下,我们的新用例迫使我们离开相关性的世界,并把我们带到因果关系的狂野世界。这为我们的线性模型带来了新的假设。

让我们想象一下,在拟合我们的线性模型之前,我们只是检查上面的假设 1 和 2。让我们想象一下,我们的拟合模型告诉我们,在所有条件相同的情况下,一栋带游泳池的房子拥有迄今为止最高的预测市场价格。我们搓搓手,开始建一个带泳池的房子。当房子最终完工时,我们把它放在市场上……我们努力想卖掉它。在与几个潜在买家进行了几个月累人的谈判后,我们终于设法以远低于模型预测的市场价格卖掉了房子。尽管如此,该模型在用于挖掘潜在客户时仍有很强的预测能力(你以前的雇主,房地产经纪人,仍在利用同样的模型赚钱)。这怎么可能呢?

图片由作者用 AI 模型 DALL E mini 生成。提示:“多重共线性和外生性”。学分:craiyon.com

为什么事情会偏离正轨

事情是这样的,在这里你试图做一些与引导一代非常不同的事情:你通过建造一座新房子来影响这个世界,你要求模型预测你的行动会产生什么结果。对于一个模型来说,这是一个更具挑战性的问题,因为答案更依赖于你忽略的潜在预测因素。

让我们想象一下,例如,有游泳池的房子一般都建在山顶上(这样游泳者可以从高处欣赏风景)。让我们想象一下,实际上是山顶的位置(而不是游泳池的存在)吸引了潜在的买家,推高了这些房子的价格。如果你在你的模型中包括变量 pool ,但是你忘记了包括一个 hilltop_location 二进制变量,那么模型将为 pool 分配一个大的(正)系数:这是因为 poolhilltop_location 正相关,这反过来对价格有很大的影响。变量 pool 实际上是从 hilltop_location 中“借用”预测能力,这种预测能力在模型中是不存在的,只能通过 pool 来体现:这种影响称为混杂偏倚,而 hilltop_location 就是混杂变量。

如果我们使用该模型作为预测工具来进行潜在客户生成,那么 pool 只是借用预测能力这一事实并不是问题:是的,该模型将推荐带泳池的房子,但这些房子往往建在山顶上,因此它们可能对买家有吸引力。然而,如果我们将的大系数视为我们应该建造一个池来提高我们新房子的价格的建议,而不管它是否在山顶上,这确实成为一个问题:在这种情况下,我们真的想确定是真的导致了更高的市场价格,因为这是我们在现实世界中想要摆弄的唯一变量。

有没有办法从数据中发现我们的模型存在混杂偏倚?是的,这就是假设 3 派上用场的地方:

假设# 3——严格外生性——独立变量与误差项不相关。

为什么我们需要这个假设?

假设# 3 和混杂问题之间的关系可能不会立即显现出来,但是直观的想法是混杂变量的作用使得自变量和残差“一起移动” 2 。

如果我们检查假设# 3,我们会意识到变量实际上与误差项相关。这将告诉我们,一些其他变量混淆了价格之间的关系,为我们节省了很多钱…

用例 4:带有置信区间的因果预测

让我们回到我们假设的故事:在包含了 hilltop_location 之后,我们最终得到了一个适合因果解释的模型。在几年的时间里,我们成功地用这个模型建造了几栋房子,然后以预测的价格出售。我们赚了很多钱,我们很快乐。但我们也有科学抱负,这促使我们在同行评审的统计期刊上发表我们的模型。

该杂志的审稿人要求我们纳入与我们的模型系数相关的置信区间(CIs)。这些很重要,因为它们让读者了解我们的系数估计值有多不确定(或“嘈杂”)。我们以前没有计算 CIs,但是我们知道有一个简单的方法:如果我们的模型的残差遵循高斯分布,我们可以计算 CIs。这是需要检查线性回归的最后一个假设的时候:

假设# 4-同质性:给定任何特征值,残差具有相同的方差

假设# 5——正态假设:残差服从(相同的)高斯分布,均值为零,标准差为σ

为什么我们需要这些假设?

这两个假设都与模型错误的“行为”有关,因此它们与 CIs 的联系并不令人惊讶。如果我们满足假设 4。和 5。然后我们就可以开始了:我们可以通过使用任何假设高斯分布的标准统计包来计算 CIs。

结论

正如我们所见,线性回归中并非所有假设都是平等的:您需要哪一个取决于您的用例[3]——特别是,它取决于您想要的可解释性水平以及您是否想要对您的模型进行因果解释。对于数据科学中的许多用例(侧重于预测),您只需要几个假设(随机抽样,没有完美的多重共线性)。如果你想要一个因果解释,那么你应该检查更复杂的假设(严格的外生性),特别是如果你想要通过一个标准的统计包量化因果效应的不确定性(同质性和正态性假设)。

话虽如此,如果你真的想做因果分析,我强烈建议你检查一下在因果推理背景下开发的所有工具和技术(因果图、结构方程模型、工具变量……)[4]。与线性回归假设# 3–5 相比,这些工具提供了一种更加完整和可靠的方法来估计因果关系,而线性回归假设# 3–5 只是真实交易的*似值。

最后,看起来线性回归假设的标准清单要么太重(当我们只需要做出预测时),要么太轻(当我们需要实际的因果解释时)。也许没有洗衣单我们会做得更好…

[1]这并不意味着其他假设不能提高预测能力,只是意味着它们是不需要的。

[2]关于严格外生性和混杂变量问题之间关系的更深入的解释,请看吉姆·弗罗斯特的这篇博文。

[3]Jeffrey m . Wooldridge 所著的《计量经济学导论——现代方法》是对线性回归及其假设(以及更多内容)的一个很好的介绍。

[4]关于因果推理,我推荐朱迪亚·珀尔的《为什么之书》。如果你正在寻找更短的/博客风格的内容,我真的很喜欢肯·阿克夸的《因果流》

数据平台基于信用的定价问题

原文:https://towardsdatascience.com/the-problem-with-credit-based-pricing-for-data-platforms-d4835930c57c

安妮·斯普拉特在 Unsplash 上的照片

当您选择构成现代数据基础设施的平台和系统时,定价模式是一个需要考虑的主要因素。

你的数据仓库和数据管道每天都要处理大量的数据,它们可以很快地决定你的预算。准确评估如何以及为什么向你收费是一个关键的计划步骤。

可以说,定价对话没有得到应有的关注。相反,花言巧语经常集中在系统的性能、闪亮的新功能以及在我们的数据堆栈中使用它的“正确”方式上。(数据厂商对这种重定向尤其心虚。)

归根结底,您的数据的工作是推动您的业务底线。如果您必须每年向供应商支付数十万甚至数百万美元才能获得您需要的数据结果,那该怎么办?

嗯,你实际上可能根本没有达到你的商业目标。

在本文中,我们将研究数据仓库和数据管道平台的不透明定价模型的流行,以及这是如何造成问题的。在此过程中,我们将分解数据平台定价的其他方面:基于计算、基于存储以及其中的变化。

通过了解当今市场上流行的定价模式,您将能够更明智地选择您的供应商。即使你最终选择了一款不太好的产品,你也会知道会发生什么,并在合同谈判中做好更充分的准备。

通过数据仓库定价了解市场

数据仓库定价模型比数据管道定价模型讨论得多,但两者密切相关。

通常,数据管道的主要功能是将数据移入仓库。因此,这两个系统将由相似的客户购买,并处理相似数量的数据。

这个目标客户?大部分是大型企业,加上一些中小型企业。

数据量?巨大的。TB 级,并且还在快速增长。

这是关键。数据仓库(和相关技术)的目标市场是已经拥有大量数据的公司,随着时间的推移,他们将继续获取和使用越来越多的数据。

2021 年汽水数据和存储趋势调查了企业的总数据增长。它发现:

“根据 62%的样本报告,主流年数据增长率在 1-100tb 之间。但是,样本中有 9%的数据年增长率为 1PB 或更高。这是主流增长的 10 到 100 倍,很可能预示着许多企业将在几年内找到自己的位置。”

当然,这是总数据,而不是存储在仓库中的数据,但它表明了行业的整体趋势。调查还发现,46%的受访者“一直”在数据仓库上运行工作负载

数据仓库是现代数据栈的基石,和的研究也表明数据仓库的销售正在蓬勃发展。各行各业的公司需要数据仓库来支持高级分析、低延迟视图和运营分析等功能,这些功能正迅速变得不可或缺。

厂商对此心知肚明。他们还知道,一旦您迁移到某个产品,您就会被锁定—您依赖于该产品并围绕它构建您的基础架构。从长远来看,它们的潜在利润取决于它们如何构建定价模型。随着您的总数据量的增长,以及您使用的数据源和数据工具数量的增加,您的仓库和管道账单的增长可能会超出您的预期。

但是一旦你被锁定,你更有可能忍受不断增长的账单,而不是迁移到不同的平台。

计算与基于量的数据仓库定价模型

考虑到这一点,我们来看看一些常见的数据仓库定价模型。

您的数据仓库账单通常包含两个部分:存储计算。

存储定价非常简单:不可否认的是数据量的问题。您可以测量存储数据的字节数,并据此收费。这是意料之中的事,所以我们先把这个话题放在一边。

另一方面,对仓库计算的收费是事情变得有趣的地方。

数据仓库存储数据的方式是为分析查询性能而设计的。你特意把它放在那里,这样你就可以查询它,而这些查询是有成本的。

仓库供应商可以通过两种主要方式向您收取计算费用:

  • 通过运行查询在卷上扫描了个数据。
  • 上实际计算用于运行查询**。**

BigQuery:按扫描数据量收费

Google BigQuery 按查询处理期间读取的 TB 数收费。这是许多云提供商使用的一种简单、可预测的模型。

但是按数据量收取查询费用给谷歌制造了一个难题。如果谷歌的一个工程团队找到了一种让他们的查询更有效的方法——这通常是任何查询技术的目标——这实际上可能对他们的底线不利。

事实上,一些用户已经注意到在 BigQuery 中查询时的有趣行为,这些行为会导致它不必要地扫描整个数据集,但这些行为在生产中可能无法解决。

雪花:按计算收费…按“信用”

有人可能会说,根据供应商用来运行您的查询的实际计算资源来收费更有意义。毕竟,供应商是为支持您消费的计算资源而付费的,因此将定价与此挂钩可能会鼓励更公平的模式,而不会积极鼓励公司降低运营效率。

重要的是,公司在量化这些计算资源实际上是什么时要透明。

公平地说,衡量计算比衡量数据量要复杂一些。它包含许多因素,包括处理能力、网络和内存。但这并不能免除供应商记录其定价结构的技术细节的责任。

让我们看一个例子。数据仓库供应商 Snowflake 在最*几年获得了巨大的利润。一个特别有趣的指标是其净收入保持率——根据 Q1 2022 年的估计,雪花仅来自现有客户 的收入同比增长174%,远远超过其同行。

当然,这在很大程度上与产品质量和前面提到的企业数据量的增长有关。尽管如此,像这样的统计数据还是令人吃惊,雪花因其定价受到了一些审查。

雪花收费通过一个称为“信用”的单位来计算信用有点像垄断货币。它们与现实世界中任何可量化的事物都没有直接联系:比如说,所使用的硬件。这种缺乏透明度的情况引发了一些危险信号。客户如何才能真正知道他们是否为雪花公司正在做的事情支付了合理的价格?(他们不能。)

现在,我们已经了解了简单的基于数量的定价和基于信用的数据仓库定价,让我们将这些原则应用于数据管道定价。

基于行的数据管道定价

与仓库不同,计算与数据管道定价并不真正相关。几乎所有的供应商都根据数据量收费。尽管数据量是一个相对直接的指标,但许多定价结构会带来复杂性,正如我们在雪花的信用模型中看到的那样。

很多厂商不是按纯量收费,而是按**排收费。**这有一定的意义——数据管道读取的数据行数很容易预测和估计,大多数批处理管道工具都是按照行来考虑数据的。

包括 Fivetran 、 Airbyte 和 Stitch Data 在内的流行厂商使用基于行的定价的变体。

通过基于行的定价,您可以安全地预测您接收的数据量和运行管道的价格之间的线性关系。但是你可能无法预测那段关系的细节。

这是因为基于行的定价是数量的代理。基于行的数据管道定价的一些问题包括:

  • 并非所有行的大小都相同。
  • 对于较小的数据源(如 SaaS 应用程序),总体数据量通常非常小;使用行为供应商提供了回旋余地,可以对每个小的集成收取更多的费用。
  • 数据源系统以不同的方式对数据建模。有些不是基于行的;数据管道将这些数据重组为行的方式带来了另一层复杂性。

行虽然看起来是一种简单的数据量计费方式,但实际上并没有看起来那么透明。

除此之外,许多供应商在这种定价模型的基础上增加了额外的抽象,通常是——你猜对了!—学分。

数据管道基于数量的定价

当任何数据供应商对代理收费时,比如 rows 或 credits,作为消费者,您就失去了一些代理权。这并不一定意味着你会被占便宜,但这意味着你有责任询问你的销售代表,以确定确切地你将支付什么。

你应该可以随意协商,尤其是当你要介绍一个拥有大量数据的大客户时。

然而,最理想的情况是找到一个数据管道平台,依靠数据量收费。

当你按纯体积充电时:

  • 您不会为在管道中添加许多更小的数据系统而多付钱。
  • 无论您的源数据是如何建模的,您都可以更容易地预测您将支付的费用。
  • 你不需要非常警惕来确保你没有被多收了钱。

此时,您可能想知道:什么是数据管道中每单位数据量的合理价格?

这是一个很难回答的问题:这取决于市场,并且会随着时间的推移而不断变化。

它还取决于供应商的利润率,而利润率反过来又与他们提供的管道架构是否高效和高度可伸缩有关。

在理想的情况下,你的供应商可能希望降低自己的运营成本。如果它这样做了,它可以将这些节省下来的钱转给你,同时仍能盈利,并因其合理的定价而赢得更多的客户。

在任何情况下,您的供应商绝对应该提供大量折扣,这些折扣将随着您的数据量的增长而生效。

如何评价大数据工具的价格

在购买数据仓库和数据管道工具时,最好的办法是从多家供应商那里获取报价并进行比较。

当您这样做时,需要考虑以下四点:

小心小妖精。

正如我们在讨论数据仓库定价时所展示的,几乎任何定价模型都会鼓励供应商对系统中的某些低效率视而不见。

当然,目标应该是与那些你信任的拥有超级可靠产品的公司做生意,但你应该始终保持警惕。

最终,B2B 客户-供应商关系可以是积极的和互利的。但这需要双方认真谈判、诚实和关注细节。

关于这一点:

避免不透明的定价模式

您的数据账单肯定会随着时间的推移而增长,因为您的数据会随着时间的推移而增长。通过只同意透明和可扩展的定价模式来创建最佳方案。避免增加复杂层次的模型(如积分或行),这可能会掩盖您实际支付的费用。

随着时间的推移,继续谈判…

寻求大批量交易。

它们就在那里,最好的可能没有被宣传。

最后,如果你从这篇博文中只拿走一件东西,应该是这个:

在评估定价时,现实地考虑一下您数据的未来。

您的组织现在可能拥有大量数据。T4 变少的可能性极小。因此,问问你自己:定价模式是否以有利于你或供应商的方式扩展?

本帖原载于 河口博客。

模拟人工智能的前景

原文:https://towardsdatascience.com/the-promise-of-analog-ai-e3a8c0daf146

为什么模拟人工智能将出现在从 Alexa 到你的 iPhone 的所有东西中

Loewe 科技在 Unsplash 上的照片

神经网络变得越来越大,越来越耗能。因此,人工智能的未来取决于让人工智能在更小的设备上更有效地运行。

这就是为什么警告说,让人工智能更有效的进展正在放缓

人工智能最耗费资源的方面是数据传输。传输数据通常比实际计算花费更多的时间和能量。为了解决这个问题,目前流行的方法包括减少数据需要传输的距离和数据大小。芯片的尺寸是有限的,所以最小化距离只能做到这一点。类似地,降低数据精度在某种程度上是可行的,但随后会损害性能。

我们已经从 32 位和 64 位浮点数发展到具有 8 位数据的专用人工智能芯片。加速是惊人的,但是较低的精度会影响准确性。其他方法也在探索中,但是数字的极限已经开始被触及。

几十年前,由于对精度的需求,数字计算机胜过了模拟计算机。就像将数据精度从 32 位降低到 8 位不会影响学*的准确性一样,我们发现精度对 AI 来说不那么重要了。是模拟回归的时候了。研究人员和行业正在竞相迎接挑战,IBM 最*宣布通过模拟人工智能实现 100 倍性能的https://aihw-composer.draco.res.ibm.com/100 倍效率的 。这怎么可能?

照片由克里斯蒂安·恩格梅尔在 Unsplash 拍摄

冯·诺依曼瓶颈

在计算中,冯诺依曼瓶颈描述了这样一种现象,即系统吞吐量受限于数据处理与移动的相对速度**。如果我们能在同一个地方存储和处理数据,我们就能消除数据移动,消除这个瓶颈。**

使用模拟人工智能,数据在同一个地方存储和处理。使用非易失性存储设备,analog 可以在没有电源的情况下存储数据长达 10 年。

同时,数据比数字电路需要更少的晶体管。在数码机器中,你有 1 和 0**。要表示-128 到 127 范围内的一个数,需要 8 位。要将两个数相加,你需要大约 200 个晶体管。**

与数字不同,模拟不是二进制。它可以代表基于电导或电阻的整个数字范围(电流的测量)。正常情况下,数字有 0 和 1 的截止阈值,但模拟使用实际值。因此,你可以在一个晶体管中代表许多数字,只要你对晶体管的物理特性和随机性自然产生的可变性没有问题。这在传统计算中是有问题的,但在深度学*中是可行的。

模拟 AI 如何处理数据?

在神经网络中,最常见的运算符是乘累加。你将几组数字相乘,然后求和,就像矩阵乘法中使用的那样,这是深度学*的支柱。如果您将输入存储为数组,您实际上可以通过在一个全矩阵上并行利用物理工程定律(欧姆定律相乘,基尔霍夫定律求和)来一蹴而就。

这就是模拟 AI 的症结所在。如果真有那么简单,模拟 AI 早就用上了。为什么我们还没有使用模拟人工智能?

照片由以色列总统府在 Unsplash 上拍摄

可变性的问题

从芯片制造到环境因素,电导会因各种因素而异。这种差异会累积起来,扰乱神经网络。

早期的方法同时使用模拟和数字,在层间使用数模和模数转换器。然而,这需要加以限制,因为转换比保持模拟更慢且更耗能。它会产生自己的瓶颈。

**模拟也不是高精度应用的理想选择,因为在高精度应用中,每一位都很重要。对于可解释性很重要的应用程序也是如此:如果你想理解为什么你的神经网络做出了某种预测,引入可变性会使解释变得更具挑战性。你的网络不是决定性的。给定相同的数据,可变性可能导致网络下次做出不同的预测。

这就是为什么模拟人工智能现在最适合边缘设备上的人工智能,比如你的手机和 Google Home。你的电池将持续更长时间,你的能源账单将下降,你甚至可以得到一个更小的设备** ( 更少的晶体管)。**

研究人员正在研究更广泛采用的障碍。接下来是什么?

照片由 Nicole Avagliano 在 Unsplash 上拍摄

未来

目前,模拟人工智能在乘-累加运算方面工作得很成功。对于其他操作,提供他们自己的电路仍然是理想的,因为编程非易失性存储设备比传统设备花费更长的时间并导致更快的磨损

推理通常不需要重新编程这些设备,因为重量很少改变。然而,为了训练,它们需要不断地重新配置

此外,模拟的可变性导致前向传播误差(推理和反向传播误差(在训练期间计算误差)之间的不匹配。这可能会在培训过程中造成问题。这导致需要单独的反向传播电路,可能是数字的。然而,研究人员已经想出了在相同的模拟人工智能神经网络上进行训练的方法,因此它们是端到端的。例如,蒙特利尔大学和 Rain Neurophormics 的一个团队提出了用于端到端芯片的平衡传播。

外卖

随着使神经网络更快、更节能的方法实现收益递减, analog 可能会卷土重来。神经网络比传统计算有更低的精度需求,使模拟成为可能。

模拟人工智能有能力生产速度快几倍、体积更小、能效更高的网络,正成为一个热门的研究领域,并具有巨大的商业潜力。预计很快就会在智能手表、电话和家庭助理中看到模拟电路!

Python 机器学*生态系统

原文:https://towardsdatascience.com/the-python-machine-learning-ecosystem-7c05be4ac48d

6 Python 机器学*工具。它们是什么,什么时候应该使用它们?

本·沃恩在 Unsplash 上的照片

Python 作为数据科学家使用的头号编程语言继续发展。在 Anaconda 最*发布的《2021 年 T4 数据科学状况》报告中,63%接受调查的数据科学家表示他们总是或经常使用 Python。

Python 在数据科学社区中的流行部分是由于可用于机器学*和深度学*的良好支持的开源工具。目前,人工智能(AI)或其机器和深度学*子集没有一刀切的工具。因此,在开源 Python 生态系统中,有几个核心库,每个都服务于这个领域中的一组特定用例或问题。

理解使用哪些工具以及何时使用它们经常会令人困惑。在下面的文章中,我将简要介绍六个最广泛使用的机器学*包。涵盖了每个库的核心目的是什么以及何时应该使用它们。本帖中涉及的包有:

  • Scikit-learn
  • Pycaret
  • PyTorch
  • 张量流
  • Keras
  • FastAI

1.sci kit-学*

Scikit-learn 是用于实现机器学*算法的最广泛使用的 Python 包之一。它提供了一个干净、统一的 API,使您能够以标准化的方式与各种模型进行交互。

Scikit-learn 极大地简化了机器学*模型的开发,此外还提供了一系列用于数据预处理、模型选择、调整和评估的实用程序,所有这些都是通过一个转换、拟合和预测命令的通用界面实现的。

这个接口使得 Scikit-learn 非常容易上手,也有助于数据科学中的代码再现性。Scikit-learn 广泛应用于工业领域,目前是对表格数据进行机器学*的首选库。

2.Pycaret

Pycaret 是一个低代码的机器学*库,旨在让更多的用户能够使用机器学*。与 Sckit-learn 类似,它提供了一个一致且易于使用的界面来与机器学*算法进行交互。

然而,Pycaret 通过包含 AutoML 方面,如自动化数据预处理和模型选择,进一步简化了这个过程。Pycaret 还旨在通过与云提供商如 AWS 和 MLOps 包如 mlflow 集成,成为一个完整的端到端解决方案,包含机器学*部署工具和 MLOps 功能。

3.PyTorch

尽管 Scikit-learn 是一个基于表格数据的机器学*问题的伟大库,但它并不太适合处理自然语言或基于视觉的用例所需的大规模数据。对于这些应用,需要深度学*。

PyTorch 提供的功能主要集中在构建和训练神经网络——深度学*的主干。PyTorch 提供跨单个或多个 CPU 和 GPU 的可扩展分布式模型训练。它也有自己的生态系统,提供与 Scikit-learn (skorch)、模型服务(TorchServe)和调度(AdaptDL)的集成。

与 TensorFlow 相比,它相对较新,第一次发布是在 2016 年 9 月,但它很快被业界广泛采用,特斯拉自动驾驶仪和优步的 PyTorch 都是基于 py torch 开发的。

4.张量流

TensorFlow 最初由谷歌大脑团队开发,于 2015 年首次开源。这一点,对于一个深度学*库来说,使其相对成熟。

自发布以来,TensorFlow 通常被视为开发神经网络的首选工具。它可以用于 Python 之外的各种编程语言,包括 Javascript、C++和 Java。它还具有灵活的架构,这意味着它可以部署在各种平台上,从 CPU 和 GPU 到移动设备上的服务器。

正是这种灵活性使其适用于各种各样的行业和用例,也是为什么它仍然是深度学*最受欢迎的工具之一。

5.克拉斯

TensorFlow 虽然是一个高度可扩展和强大的深度学*库,但并不以拥有特别友好的用户界面而闻名。 Keras 将自己标榜为“为人类而非机器设计的 API”,是与 TensorFlow 交互的高级包装器。

Keras API 有一个与 Scikit-learn 相似的公共接口。具有一致的编译、拟合和预测命令。它旨在允许对 TensorFlow 库进行快速实验,同时也使深度学*可用于更广泛的用户。

6.法斯泰

FastAI 是另一个旨在让实践者更容易获得深度学*的库,同时也为研究人员提供解决方案。

它有一个高级 API 接口,可以抽象出许多复杂性,并允许从业者从深度学*中快速获得最先进的结果。同时还提供研究人员可以用来发现新方法的低级组件。

在引擎盖下,FastAI 使用 PyTorch。它本质上提供了一个更简单的抽象层,同时也引入了许多新的功能,如数据可视化和拆分及加载数据的新方法。

在本文中,我介绍了六个最流行的用于机器学*和深度学*的 Python 包。在 Python 生态系统中还有许多其他可用的工具,包括 Theano 、 Chainer 和 Spark ML 。

正如本文前面所述,对于机器学*来说,真的没有放之四海而皆准的库,更多的是为正确的工作选择正确的工具。

本文中描述的每个工具都为一组特定的问题或用例提供了解决方案。我在下面的一行中总结了每个库的主要用途。

Scikit-learn —机器学*的首选库,提供用户友好、一致的界面。

Pycaret —通过低代码、自动化和端到端解决方案降低机器学*的起点。

py torch——利用其高度灵活的架构构建和部署强大、可扩展的神经网络。

tensor flow——最成熟的深度学*库之一,高度灵活,适合广泛的应用。

Keras — TensorFlow 制作简单。

FastAI——通过构建在 PyTorch 之上的高级 API,使深度学*变得更容易访问。

感谢阅读!

用 Python 创建单词云的快速简单指南

原文:https://towardsdatascience.com/the-quick-and-easy-guide-to-create-wordclouds-in-python-7a81813e4cd5

创建不同形状的单词云以更好地传达信息

照片由像素的皮克斯拜拍摄

文字云是一种可视化文本数据的好方法。python 使创建一个变得很容易。在本帖中,我们将回顾一个使用 Wordcloud 库生成单词云的例子。

如果你不知道它是什么,单词云可以可视化单词在给定文本中出现的频率。一个词出现的次数越多,它在词云中的比重就会越大。

词云对于从评论中发现客户情绪非常有用。此外,一些网站使用文字云来显示网站上最受欢迎的话题。

你可以使用 Monkeylearn 单词云生成器工具进行离线用例。但是你经常不得不动态地或者大批量地生成单词云。

所以,让我们开始吧!

1.安装 Wordcloud 库

Wordcloud 是一个免费的开源 Python 库。截止到写这篇帖子, Wordcloud 的 GitHub repo 有 8.7k 星,2.2k 叉,62 人投稿。

你可以从 PyPI 安装 Wordcloud 库。

pip install wordcloud

如果您使用poem 来管理 Python 包,您可以使用下面的命令。

poetry add wordcloud

2.加载数据

对于本教程,我们将使用以下文本。

“Python 是一种广泛用于通用编程的高级解释语言。由吉多·范·罗苏姆创建并于 1991 年首次发布的 Python 拥有一种强调代码可读性的设计理念,特别是使用了大量的空白。它提供了能够在小规模和大规模上实现清晰编程的结构。”

您可以在 Python 中将它设置为一个变量,如下所示。

text = """ Python is a widely used high-level interpreted language for general-purpose programming. Created by Guido van Rossum and first released in 1991, Python has a design philosophy that emphasizes code readability, notably using significant whitespace. It provides constructs that enable clear programming on both small and large scales. """

但是,您可能需要加载比这多得多的数据。例如,如果您有一个评论数据集,您必须以不同的方式加载它们。

你可以从熊猫数据框中创建单词云。以下代码通过以下方式准备一个合并的审阅文本

  • 从 CSV 读取熊猫数据帧;
  • 加入所有用户评论;
  • 将它赋给一个新变量“text”
text = pd.read_csv("data.csv").Reviews.str.cat()

如果你没有熊猫数据框架,你也可以从文件中读取文本。

with open("data.txt", "r") as file: text = file.read()

无论哪种方式,你都应该得到一串文本。

3.生成单词云

现在我们已经加载了文本数据,让我们继续创建单词云。

使用单词云库创建单词云很容易。下面的代码将从我们之前加载的文本中创建一个单词云。

from wordcloud import WordCloud 
import matplotlib.pyplot as plt 
% matplotlib inline wordcloud = WordCloud().generate(text)plt.imshow(wordcloud, interpolation='bilinear')plt.axis("off")

首先,我们从单词云库中导入WordCloud类。然后,我们也导入matplotlib。我们使用%matplotlib inline魔法命令,让单词 cloud 出现在笔记本中。

然后,我们创建一个 WordCloud 实例,并使用文本变量生成 word cloud。

最后,我们使用plt.imshow()函数来显示单词 cloud。使用默认设置显示单词 cloud。

如果要更改单词云的外观,可以使用不同的设置。例如,您可以更改背景颜色、最大字数、最大字体大小等。

下面的代码演示了如何将背景色改为#e2e1eb,将 max_words 改为 10。

wordcloud = WordCloud(background_color="#e2e1eb", max_words=10).generate(text) plt.imshow(wordcloud, interpolation='bilinear') 
plt.axis("off")

正如你所看到的,单词 cloud 在这些设置下看起来是不同的。摆弄设置来得到你想要的单词云。

在形状中创建单词云

你可以通过创造单词云来发挥创造力。您可以将遮罩选项设置为图像,以获得按形状创建的单词云。蒙版图像应该在白色背景上有一个黑色对象。下面是我们如何把单词云做成心形的。

from PIL import Image 
import numpy as np mask_img = np.array(Image.open("./Untitled design.png"))wordcloud = WordCloud(background_color="#e2e1eb", max_words=100, mask=mask_img
).generate(text)

上面的代码将产生下面的图像。

结论

单词云是一种很好的交流热门话题的方式。

我们已经简要讨论了如何使用 Python 创建单词云并将其导出为 PNG。我们还制作了不同形状的单词云。

下面是完整的代码。

import pandas as pd
from wordcloud import WordCloudimport matplotlib.pyplot as plt
% matplotlib inlinetext = """
Python is a widely used high-level interpreted language for general-purpose programming. Created by Guido van Rossum and first released in 1991, Python has a design philosophy that emphasizes code readability, notably using significant whitespace. It provides constructs that enable clear programming on both small and large scales.
"""# Read and convert an mask image. It should have a white (not transparent) background with a black object.
mask_img = np.array(Image.open("./heart.png"))#
wordcloud = WordCloud(background_color="#e2e1eb", max_words=100, mask=mask_img).generate(text)# store to file
wordcloud.to_file("wc.png")# Show the image
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

感谢阅读,朋友!看来你和我有许多共同的兴趣。我很乐意在 【领英】推特媒体 上与你联系

还不是中等会员?请使用此链接 成为会员 因为,不需要你额外付费,我为你引荐赚取一小笔佣金。

拉冬变换:基本原理

原文:https://towardsdatascience.com/the-radon-transform-basic-principle-3179b33f773a

了解计算机断层扫描(CAT)、合成孔径雷达(SAR)等技术背后的数学原理

随意在任何上下文中重用图片,无需注明出处(不保留任何权利)。

动机和定义

让我们从一个激励性的问题开始:断层摄影。此外,我们还将见到与我们同名的约翰·拉冬。

断层重建是一种多维逆问题,其中的挑战是从有限数量的投影中产生特定系统的估计。断层成像的数学基础是由约翰·拉冬奠定的。维基百科

在什么样的真实世界环境下,我们可以很容易地获得投影,而不容易获得完整的体积?出奇的经常!让我们考虑一下脑成像的例子。

如果我们想获得大脑的三维立体图像,我们可以相对容易地获得完整的 2D 切片。想想 x 光!我们可以让能量通过这个体积,看看有多少能量通过。这些 2D x 射线图像中的每一个都表示通过 3D 体积的线积分。我们可以在颅骨周围的不同几何位置获取大量的 x 射线图像,例如,从左侧、从前面、从右侧以及其间的所有角度。

然而,给定一组在任意集合几何结构下获得的 2D 图像,我们如何*似地重建潜在的 3D 体积呢?

如果函数表示未知的密度,则拉冬变换表示作为断层扫描的输出而获得的投影数据。因此,Radon 变换的逆变换可用于从投影数据中重建原始密度[…] 维基百科

让我们看看 Radon 变换(及其逆变换)如何帮助我们解决这个确切的问题!

为什么这些细节对医学数据科学家很重要?轻松点。对成像方法的理解对于推理伪像、限制和计算机视觉解决方案的适当处理方法是至关重要的。

拉冬变换的力学

为了便于可视化,让我们用 2D 积分切片来简化我们的 3D 大脑,而代之以用 1D 积分切片来考虑 2D 图像。逻辑是一样的!这只是让我们的介绍不那么令人生畏。

让我们把基本的观察放在一边!傅立叶切片定理告诉我们…

如果我们通过 n 维体积(如 2D 图像)进行(n-1)维线积分(如列和),这些积分的(n-1)维傅立叶变换恢复原始的 n 维傅立叶值。

打开这个需要一分钟时间!具体来说:如果我旋转一幅 2D 图像,对列求和,并计算这些列和的 1D FFT,*我已经从原始图像的 2D FFT 中恢复了值。*所以,我们可以利用傅立叶变换来实现拉冬变换!

图 1 :未应用旋转的原理示例(0°)。图片作者。

在图 1 的中,显示了未应用旋转的图像的原理。我们只是把原图的各列相加。如果我们对这些列和进行 1D FFT,我们将在 2D 傅立叶空间中恢复一条水平线,该水平线与我们求和的轴正交!不出所料,如果我们称 2D 为 IFFT,我们得到的是垂直方向的线型。

现在,让我们应用 5°旋转,重复同样的过程!

图 2 :应用旋转的原理示例(5)。图片作者。

通过收集偏移了旋转角度的线积分,我们现在已经通过 2D FFT 恢复了新的正交切片。2D·IFFT 恢复了原始图像的略微改善(但仍然很糟糕)的*似。

然而,在极限情况下,如果我们对许多角度重复这个过程,我们会得到拉冬变换!拉冬变换是将我们的 n 维体积变换成一组完整的(n-1)维线积分。逆拉冬变换是从我们的完整(n-1)维线积分回到原始图像的变换。在引擎盖下,所有这些都是通过(逆)傅立叶变换完成的!

图 3 :从旋转角度 0°到 180°以 0.1 步重复该过程。图片作者。

正如所料,以紧密间隔的旋转角度重复恢复了我们原始 2D FFT 的精确*似和我们原始 2D 图像的相应精确*似(图 3 )!

实际限制

事实上,我们并没有得到完整的集合。相反,我们通常会受到时间、成本或额外图像的负面影响的限制,例如,给病人进行 10,000 次 x 光扫描是不可取的😉

让我们来看看我们从 5 个旋转间距得到的*似值(图 4 )!

图 4 :具有 5 个旋转偏移的迭代逼*。图片作者。

值得注意的是,即使我们从 2D 傅立叶空间稀疏地恢复了值,我们仍然恢复了图像内容的关键特征。

结论

我们现在理解了关于成像的 Radon 变换的基本原理!(逆)拉冬变换描述了线积分的傅立叶变换和被成像的全维体积的傅立叶变换之间的基本关系。

接下来,我们将遍历支持代码,并探索层析成像常见的处理工件。感谢阅读;希望你学到了一些东西!

COVID 时代的实时革命和数字经济

原文:https://towardsdatascience.com/the-real-time-revolution-and-digital-economics-in-the-covid-era-ed3eb927a3d4

在 COVID 的推动下,经济学家终于开始接受流媒体和实时数据——就像商业世界一样

Rockset 首席采购官和 SVP 市场部 Shruti Bhat

约书亚·索蒂诺在 Unsplash 上拍摄的照片

在新冠肺炎环球疫情制造的所有糟糕中,一些意想不到的一线希望出现了。其中之一是在经济学领域,在过去的一年里,经济学悄然经历了一场革命,这场革命反映了商业世界正在发生的一场革命。

对于一个局外人来说,经济学是一个被数字和统计数据主宰的领域。然而,正如《经济学人》杂志在其最*的封面故事“即时经济学:实时革命”中指出的那样,在经济学的实际实践中,长期以来一直严重缺乏及时的数据和统计数据——尤其是其最关键、最迷人的专业——经济预测。

政府利用宏观经济预测来指导决策。再次降息会刺激萎靡不振的经济吗?将最低工资提高到每小时 X 美元会导致多少人失业?

在 20 世纪之前,古典经济学家——比如亚当·斯密或托马斯·马尔萨斯——创立了宏大的统一理论。然而,数据是如此稀少和不稳定,以至于他们的论文读起来更像哲学而不是现代经济学。据《经济学人》报道,20 世纪 70 年代发表的超过一半的经济学论文缺乏任何数字数据。即使在今天,国家 GDP 或失业率等关键统计数据也需要几周甚至几个月的时间来收集、修改和最终确定。生产率等更复杂的数据甚至需要更长的时间。

这个时间框架对经济学教授来说还可以,但对政策制定者来说太慢了。问题仍然是双重的:官方的政府统计数据需要太长的时间才能出现,尤其是在危机时期;政策制定者手中的杠杆又太钝太慢。

一位前美国助理财政部长告诉《经济学人》,“传统的政府统计数据实际上并不那么有用——当它们出来的时候,数据已经过时了。”

面对这一数据困境,一些经济学家退回到理论和意识形态。供应方推动减税和监管,而需求方主张增加税收和政府支出。

其他人挖掘股票和债券市场价格等实时指标。尽管这些方法具有挖掘群体智慧的优点,但它们也容易受到一系列降低准确性因素的影响:市场操纵、投资者不必要的信心或恐慌、某个公司或行业特有的问题等。

陈旧数据耗费数万亿美元

《经济学人》写道:“说央行在盲目行动,这只是稍微有点夸张。”。因此,“糟糕和滞后的数据可能导致政策错误,导致数百万人失业和数万亿美元的产出损失。”

这正是 2008 年衰退期间发生的情况。当电视访谈节目主持人提到陈旧的经济数据显示一切正常时,房价暴跌,止赎飙升,经济一蹶不振。银行太大而不能倒,直到它们突然变得不那么大。缺乏可靠、新鲜的数据导致了糟糕的决策,从而加剧了衰退。

当新冠肺炎来袭时,新一波经济学家和政策制定者决心避免 2008 年的错误。

“没有时间等待官方调查来揭示病毒或锁定的影响,政府和央行已经进行了实验,跟踪手机、非接触式支付和飞机引擎的实时使用,”经济学家写道。“今天的明星经济学家,如哈佛大学的哈吉·柴提,并没有把自己锁在书房里写下一个‘通论’,而是经营着人员配备齐全的实验室来处理数据。”如果网飞确切地知道哪些节目是流行的,为什么政策制定者不能随着事情的发展更好地把握经济的脉搏?

更新分析,加快行动

新一波经济学家是从哪里获得这些数据集的?

  • 据《经济学家》报道,摩根大通“打开了银行余额和信用卡账单的数据宝库,有助于揭示人们是在消费还是在囤积现金。”
  • 谷歌发布了匿名的安卓手机用户位置的每日数据,允许研究人员制作每日锁定严重程度的测量
  • 来自 OpenTable.com,它发布了关于餐厅预订和用餐者的每日和历史数据
  • 来自工作安排 SaaS 提供商 Homebase,其每日就业数据被美联储用来跟踪就业水平的变化
  • 甚至政府机构也采取了行动,美国人口普查局(U.S. Census Bureau)开始发布就业和租金方面的每周调查数据,让更多经济学家对消费者信心有了新的见解。

更新的分析意味着更快的行动。对美国 600 美元刺激支票效果的首次分析仅在几周内就发表了。不到一个月,英国政府证实,一项让顾客重返餐厅的政策也增加了 COVID 感染人数。经济学家证实,大量工人在路上工作,部分原因是来自社交媒体帖子拥抱 #vanlife 。

《经济学人》宣称,“困惑的时代正开始让位于更大的启蒙”。

这导致了有针对性的、快速部署的经济政策。部分由于 OpenTable.com 的数据,美国刺激法案包括了对餐馆的特别支持。在香港,政府通过电子方式将现金发送到市民的电子钱包中,如果在某个日期之前没有消费掉,这些现金就会过期。使用分析,类似的即时现金施舍可以自动发送给失业的穷人,而不需要他们提交任何书面文件。或者贷款可以立即提供给被认定为低破产风险的企业。

相比之下,降息等基础广泛的货币政策需要多个季度才能完全生效,有许多意想不到的副作用,可能导致重大胜利,也可能导致重大失误。

数字经济带来更准确、更透明的政策

经济学家和政府决策者还没有赶上已经转型为数字企业的尖端企业。数据延迟是最明显的方面。为了确保数据的可靠性和质量,谷歌、OpenTable 和其他公司仍然在夜间发布他们的数据集,而不是发布直播流。

但是更多的实时数据来源正在出现。印度去年记录了 256 亿次实时电子支付。物联网传感器正被快速安装到机器和物体上。包括中国在内的 50 多个国家正在试验央行数字货币(CBDCs),也称为 GovCoins,作为纸币的补充。与比特币和其他匿名承诺的加密货币不同,政府硬币将可被政府发行者追踪——这对政策制定者来说是一个福音,但对关注隐私的个人来说却是一个负分。

新数字经济还有其他潜在的陷阱。发出经济方向性变化的信号很重要,但量化实际 GDP 产出或失业率是一个更困难的问题。数据相关性和数据漂移是永恒的问题。优步汽车共享出行的低迷是全球经济衰退的遥远预警,还是仅仅是公司失误的结果?企业发布的数据是否带有乐观偏见?这些都是合理的担忧,也是我们在商界的客户理所当然必须面对的问题。

尽管如此,《经济学人》写道,“随着技术渗透经济,这些趋势将会加剧”。这意味着更多、更新鲜的数据集可以以创造性的方式组合起来,产生快速但信息丰富的经济政策见解。

这正是我在商界看到的情况。从使用数据仓库的历史分析到使用更现代的数据堆栈的实时分析的持续转变为企业带来了大量机会,使其能够比以往任何时候都更快地做出更明智的数据驱动型决策。

《经济学人》写道:“实时革命有望使经济决策更加准确、透明和基于规则。”。我完全同意。

深度学*对时间序列预测的合理有效性

原文:https://towardsdatascience.com/the-reasonable-effectiveness-of-deep-learning-for-time-series-forecasting-60e2c8affb9

最先进模型的构建模块

在 Unsplash 上由 Mourizal Zativa 拍摄的照片

非常笼统的定义

当谈到时间序列时,人们往往倾向于以一种非常实用的面向数据的方式来做:如果你试图查找一些定义,你可能会发现这样的表达方式,如“按时间顺序索引(或列出或绘制)的一系列数据点”(维基百科),“在连续时间点或连续时间段收集的一组数据”(大英百科全书),“在某段时间内以连续顺序出现的数据点序列”( Investopedia )。

事实是,所有可以测量的东西都属于这一类;一旦我们开始关注和观察一个现象超过一个快照,我们就可以合理地用时间序列建模的既定理论来处理它。

我能想到的唯一对时间序列没有意义的量是基本的物理常数:光速 c ,引力常数 G ,基本电荷 e… 像他们这样的家伙真的永远不会改变,根本不会。

我想在这个问题上多花两句话,因为我需要把一个观点讲清楚:我们不能在完整性的伪装下谈论时间序列和处理它们的工具。

事实上,每个时间序列只不过是一个特定的、可能非常复杂的物理过程的单一实现,其自身可能具有无限的潜在随机结果。

认识到无限的可能性应该有助于我们降低寻找一个适合所有人的解决方案来描述、分类或预测时间序列的愿望。

时间序列的例子显示了它们的外观和生成过程是多么的不同[1]。

预测问题

简而言之,预测是根据一个目标时间序列的过去值、其他相关序列的值以及使这些序列相互关联的特征来预测其未来值的任务。

我们通常用 Y 表示目标序列,用 X 表示协变量;当然,这是任意的,因为我们使用的所有序列至少在原则上是相互协变的。

相反,用另一个字母,比如说 Z 来表示那些具有已知未来值的时间序列是一个有意义的区别:想想日历特征,比如周数和假日。

这些序列有助于推理和训练,必须区别对待:首先,它们不需要预测。

另一个值得一提的命名惯例与时间有关:系列开始于传统的初始时间 t=0,然后我们使用 T 来表示过去(t=0 到 T)和未来(t>T)之间的划分,或者训练和测试;h 表示预测的范围,即我们需要预测达到未来多少个时间单位(t=T+1 到 t=T+h)。

最后,为了说明所有协变量之间的不同子群和关系,预测模型通常允许指定所谓的静态特征(W);这些只不过是标记每个系列的值。

例如,我们可能有一组代表家庭用电量的序列,其静态特征描述了家庭本身(居住人数、房屋大小等)。

预测中使用的对象的基本分类。

请注意,图中的每个对象都用粗体表示,这通常是为向量保留的:这是因为,根据推理,我们也可以处理每个时间步长有多个值的序列。

我们称这样的多值序列为多变量,而不是更常见的单变量序列。这里我们借用了统计学术语:在统计学中,多变量概率分布是一种依赖于多个随机变量的分布。

分类

每当我们不得不面对一个预测问题时,我们可以通过给它贴上一些标签来立即揭示它;为此,我们可以根据我们到目前为止给出的定义记住以下分类:

数据驱动标准

  • 静态特性
  • 数据点的尺寸:一元或多元。

问题驱动标准

  • 预测类型、**、**点或概率性(分位数)。
  • 层位尺寸,即一遍预测的时间步数。

古典技术

时间序列预测是一个既定的领域,在更现代的机器学*技术出现之前,其中的统计工具和理论已经为人所知。我们不会太关注这些,但是浏览一下最常见的还是很有用的。

基线

当考虑某样东西的未来价值时,首先想到的肯定是看它的当前价值;再一想,你肯定也会看看过去的值,然后满足于一个平均值,或者试着跟随一个趋势。

所谓的“简单”预测方法[1]。

我们称这些方法为简单;它们在概念上很重要,因为它们已经告诉我们,不对称数据(向前的时间箭头,相对于表格数据的一致性,每个样本都以相同的方式处理)增加了复杂性,需要我们做出一些假设:

  • 未来会是现在的样子吗?
  • 过去是什么样子很重要吗?我们应该追溯到多远?
  • 结果背后的过程和以前一样吗?和以后一样吗?

如果这些问题的答案都是“是”,也就是说,我们假设所有过去的信息都是有用的,并且有一个单一的模式可以遵循,我们求助于回归方法,通过在越来越复杂的系列中搜索:线性、多项式、样条曲线等,找到逼*我们数据的最佳函数。

回归预测方法[1]。

除非我们出于某种原因知道要搜索的一些首选函数族,否则我们将只选择关于数据的最佳函数。然而,这又引发了一些疑问:

  • 我们是否期望最*的趋势会无限期地持续下去?
  • 过去的高峰和低谷会再次发生吗?
  • 数列达到回归预测的未来值有意义吗?

分解方法

现在应该很清楚,我们不能只依赖数据,我们至少需要关于产生数据的过程的上下文信息。

分解方法走的就是这个方向,当我们知道这个序列来自一个具有某种周期性的过程时,这种方法最有用。

在这些方法中最经典的是季节-趋势-余数分解,我们寻找缓慢变化的平滑基线(趋势),然后转向快速重复成分(季节性),最后我们将信号的其余部分视为随机噪声(余数)。

STR 分解预测法[1]。

分解方法让我们更自由地使用我们对数据的知识来预测其未来:例如,在旅游相关数据中,我们可能会发现每周(周末)或每年(夏季)的模式:将这些周期编码到模型中让我们放心,预测将更少“愚蠢”和更“知情”。

SARIMAX 方法

最后,对于经典预测方法的概述,SARIMAX 方法是一个更加灵活的框架,允许选择最接*时间序列的成分。

构成 SARIMAX 首字母缩写词的字母代表分析块,我们可以将它们组合到模型的方程中:

  • 季节性如果时间序列有周期性成分;
  • (向量)如果时间序列是多元的;
  • 自回归如果时间序列依赖于它以前的值;
  • 积分如果时间序列是非平稳的(如有趋势);
  • 移动平均如果时间序列依赖于以前的预测误差;
  • 外生变量是否有协变量可利用。

SARIMAX 模型在概念上相当简单的同时却取得了令人难以置信的成功,并且最好地代表了人们应该如何处理预测问题:使用您所拥有的关于该问题的所有信息来限制要搜索的模型类别,然后在该类别中寻找您的数据的最佳*似。

深度学*技术

许多最*的综述论文[2][3][4]概述了在从业者长期缺乏兴趣之后,机器学*模型,尤其是神经网络,如何在时间序列预测话语中变得越来越重要。

为了理解为什么深度学*特别适合这个问题,我们将把经典技术与最新最成功的架构联系起来。

简而言之,训练一个(密集的)神经网络。

深度学*的合理有效性

目前,我们知道许多类型的神经网络是任何(合理定义的)函数的通用*似器,只要它们有足够的数据和内存[5][6][7]。

这当然使它们成为任何监督学*问题的优秀候选,其中目标确实是学*满足已知输入输出关联的函数。

然而,可悲的是,像普适*似这样的理论属性在实践中往往不相关,定理假设不成立:特别是,我们从来没有足够的数据和内存来成功地执行任何通用通用架构的学*任务。

尽管神经网络的武器库中还有另一种武器,那就是注入关于问题的信息的可能性,这种方法可以帮助模型学*想要的功能,就好像我们有更多的数据或计算时间可以花一样。

我们可以通过配置网络的架构来做到这一点,即通过根据手头的问题设计特定的网络连接性和形状:这实质上等于约束可能函数的搜索空间强加导致网络最佳参数的计算流

根据这个想法,以及在这个方向上多年的研究,一个关于网络结构和它们有效解决的相关问题的分类法正在被编纂;这种方法有时有些手工和启发性,但一般化和优雅的数学理论也正在出现[8]。

从一般的密集网络到高度复杂的网络(TFT) [10]。

深度学*的关键优势不是它的普遍性,而是它的多功能性模块化:通过扩展、组合和重新连接节点来轻松处理网络的能力对于找到特定问题的正确候选模型至关重要。

此外,当找到这样的模型时,模块化可以简化向类似问题的过渡,而不会失去所有获得的专业知识(见迁移学*)。

所有这些特征使得深度学*成为经典技术的完美继任者,延续了模型复杂性和专业化不断增长的趋势,但也带来了普遍性和多功能性的巨大提升。

当代的 DL 架构,如 N-BEATS [9]是模块化和可组合的。

我们现在才开始理解塑造神经网络的架构如何改变它最接*的功能类别,但很明显,通过强加某种形状和结构来定制它以适应特定的问题类别是非常有益的:事实上,这种做法的优势在于从一开始就将网络指向正确的方向,从而减少在错误路径上花费的时间和资源。

照片由 Heidi Fin 在 Unsplash 上拍摄

积木

现在,对于构建可以解决最困难的预测问题的深度学*模型来说,最有用的成分是什么?

正如我们之前说过的,每个预测问题都需要它的解决方案;因此,观察一些选定的网络结构,并了解它们如何通过形成计算流程和最终的训练模型来解决问题的特定特征,是很有启发性的。

当适当地重新布线时,相同的节点可以变成不同的块[15]。

请注意,我们将只对将要讨论的架构进行非常简明的描述,然后只关注它们如何解决学*时间序列的特定特征。

不出所料,有许多资源涵盖了更多的技术和数学细节;比如潜入深度学*【15】就非常全面,应该涵盖了所有的基本概念和定义。

卷积神经网络

卷积网络,或 CNN,已经存在了相当长的时间,并证明了许多监督学*任务的成功。

他们最引人注目的成就是学*图像特征,例如根据图片中是否描绘了特定的东西来对图片进行分类。

更一般地说,只要我们手头有数据,CNN 就有用:

  • 可以有意义的用张量形式表示:1D 阵列,2D 矩阵…,
  • 在张量中彼此靠*的点中包含有意义的模式,但与它们在张量中的位置无关。

很容易看出图像分类是如何适应这种技术的:

  • 图片自然是像素矩阵,并且
  • 分类通常基于物体内部物体的存在,物体被描述为一组相邻的像素。

请注意,“有意义”取决于我们试图解决的问题,因为模式和表示可能只对某些目标有意义。

例如,考虑将名画正确地分配给其画家或其所属的艺术运动的问题:相邻像素的模式是否有助于分类并不明显,因为例如检测一个物体可能对一些人有用(文艺复兴时期的艺术家画了很多肖像),但对其他人却没有用(这对更现代的流派有什么帮助呢?) [16].

简而言之,CNN 可以通过应用具有共享权重的卷积**来学*上述局部模式:**卷积层中的每个节点是来自前一层的相邻节点(在图片的情况下是像素)的窗口和权重矩阵之间的点积。

实际上,对原始层中所有相同大小的窗口执行该乘积相当于应用卷积运算:卷积矩阵(在整个运算中是相同的)由可学*的网络参数组成,这些参数因此在节点之间共享。

通过这种方式,平移不变性得以加强:网络学*将局部模式与期望的输出相关联,而不管模式在张量中的位置如何。

见这里【11】一个优秀的和更广泛的解释。

在 CNN 中,通过在整个层上滑动一个窗口来共享参数[11]。

但是我们能在时间序列设置中成功地应用 CNN 吗?

当然,开头提到的两个必要条件必须成立:

  • 时间序列自然是有序的 1D 阵列,并且
  • 通常时间上接*的点会形成有趣的模式(趋势、峰值、振荡)。

通过沿着时间轴滑动其卷积阵列,CNN 通常能够在一系列中拾取重复的模式,就像它能够检测图片中的对象一样。

此外,我们可以通过众所周知的时间序列操作技术来修改 CNN 的输入序列,从而欺骗 CNN 学*不同的结构。

例如,通过对序列进行子采样,我们可以让卷积层检测不同时间尺度的模式;通过在频域中应用变换,我们可以让它学*平滑、去噪的模式[12]。

卷积网络作用于变换的时间序列[12]。

递归神经网络

如果 CNN 在图像和视频是最常见的数据格式的计算机视觉应用中找到了最佳点,那么递归神经网络似乎特别适合时间序列应用。

尽管如此,RNNs 最引人注目的成功来自自然语言处理领域,例如机器翻译或语音识别[17]。

事实上,当 CNN 寻找多维有序数据中的局部结构时,rnn 关注于单一维度并寻找持续时间更长的模式。

在处理某些类型的时间序列时,检测跨度很大的模式的能力特别有用,即那些呈现低频周期和季节性的时间序列,或者那些具有长期自相关的时间序列。

作用于有序 1D 输入数据的基本 RNN 层在那些数据点和层的节点之间具有一对一的关联;在此之上,层内连接形成了一个遵循输入数据排序的链。

训练过程包括将顺序数据分割成滑动的、重叠的块(长度与隐藏状态的数量相同):它们被顺序馈送,由通过它们传播的递归层内连接来链接。

我们通常将层节点表示为潜在或隐藏状态 h;它们对来自相应输入数据点的有意义信息进行编码,并与来自先前隐藏状态的递归信号进行协调。

一个基本的 RNN,折叠(左)和展开(右)[13]。

出于时间序列预测的目的,对于 n 的任何选择,可以训练递归层的输出节点来学* n 步预测,使得有序输出代表完整的预测路径;然而,通常情况下,RNN 只是更复杂架构中的一个模块。

在任何情况下,想法是处理和保留关于过去的信息,以便在训练过程中的任何点,算法可以访问所述信息并使用它。

正如在 CNN 中,这是一种形式的权重分配,因为时间序列的所有块进入相同的架构;出于同样的原因,平移不变性确保了无论某个模式何时发生,模型仍能将其与观察到的输出值相关联。

在简单的 RNN 中,隐藏状态通过经典的激活函数和线性标量积与输入节点和其他节点相联系;为了应对一些已知的限制,如 【消失渐变】【18】【19】,出现了许多不同的更复杂的“味道”,如 LSTM s 和 GRU 。

简而言之,消失梯度效应发生在反向传播期间,此时在长计算链中用乘积法则合成小导数会导致一些节点参数的无限小的更新,有效地中止了训练算法[20]。

****

不同的 RNN“风味”:LSTM(左),GRU(右)。

注意机制

注意力机制诞生于神经机器翻译任务的 NLP 环境中,其中能够从给定语言翻译任何句子的单个全局模型的想法需要比当时可用的技术更复杂的技术[22]。

AMs 通常出现在编码器-解码器架构中,它们允许捕捉最相关的信息。

注意机制在编码器-解码器架构中的实际使用示例[15]。

事实上,注意机制的一般思想是,将时态数据序列的所有位都视为同等重要,即使不会误导模型,也是一种浪费。

有些单词对于理解句子的语气和语境是非常重要的:它们需要和同一个句子中的大多数其他单词一起考虑。

实际上,模型需要保持警惕,随时准备对这些单词给予更多的关注,并使用它们来影响同一个句子中其他单词的翻译。

在时间序列应用中,对于时间序列的未来发展至关重要且具有影响力的时刻,也可以做出类似的论证:结构趋势变化、意外峰值(异常值)、异常长的低值期……只是在某些情况下可用于检测的一些模式。

多头注意力机制在谷歌 TFT 中的实际应用,检测波动性系列中的趋势变化[10]。

这基本上就是 AM 所做的事情:它获取任何给定的输入数据(有时称为查询),并根据查询本身的存在情况考虑所有可能的输入输出对(分别称为)。

QKV 符号中简化的注意机制[15]。

在此过程中,该模型计算关注分数**,该分数表示作为每个关键字的上下文的查询的重要性。**

请注意,评分函数可以是固定的(例如,计算序列中查询和关键字之间的距离),或者更有趣的是,可以参数化以便学*。

注意力分数通常被归一化为权重,并用于值的加权平均值,该平均值可被用作该机制的输出。****

注意机制的可能设计[15]。

剩余网络

剩余网络是现有模块的附件,提供所谓的跳过连接**:输入与块中发生的计算并行传输,然后两个版本在输出端合并(通常有加法或减法,效果截然不同)。**

例如,在加法的情况下,跳过连接的引入有效地使得跳过的块从学*某个原始变换 f(x)切换到它的残差**,f(x)-x**

剩余网络的基本结构,其中虚线框被剩余连接绕过[15]。

它们最初是通过应用于 CNN[21]而引入的,但现在它们基本上无处不在,因为它们提供了明显的优势,而没有增加太多的计算或复杂性。

从表面上看,RNs 是一个非常简单的概念;不过,它所达到的效果可能并不明显,所以现在让我们来分析一下它们的优势。

  • 促进信息传播:如前所述,长的计算链会遭受消失梯度的影响;剩余连接为梯度提供了附加项,该附加项不包含由跳过的块给出的导数的链积。
  • 避免精度饱和:已经证明[21]添加残差块有助于减轻这种影响,这种影响包括阻止通过添加更多层来实现通常的改善,有时甚至会导致恶化(“降级”)。
  • 提供开/关开关:被跳过的块学*残差 f(x)-x 的事实为模型打开了一种新的可能性,即设置块的所有参数,使得 f(x)=0,并且组合输出等于 x。这当然是恒等式**,意味着组合块被有效地关闭。**
  • 分解一个输入:学*残差的另一个作用是,如果你巧妙地将残差块串联起来(“级联”块),那么可以让第 n 个块学*输入中去掉前面 n-1 个块的结果。换句话说,每个方块都在学*期望结果的一小部分,可以通过在最后将这些部分相加来恢复。此外,我们可以定制每个级联块来学*不同的部分,以便我们有效地实现已知的时间序列分解,如 STR 或傅立叶变换[9]。

剩余网络将级联块分配给 N 拍时间序列中的不同相加分量[9]。

结论

希望在这一点上很清楚,就时间序列预测而言,深度学*已经走上了一条成功的道路。

这条路径代表了日益复杂和定制的模型的历史,专门研究时间序列的不同子类,并且它只是在最*才被神经网络填充;经典的统计模型比它们更早,但仍然显示出越来越多地为特定的预测任务手工制作的趋势。

在未来,这种考虑肯定适用于统计学*的其他领域(特别是机器学*),今天通常使用的有点手工的方法必须为数学框架腾出空间,该框架可以系统地将预测问题的特征与解决该问题的最佳可能架构联系起来。

我希望你喜欢这篇文章!请不要犹豫留下评论或反馈。

如果你愿意, 关注我 以免错过我的下一期出版物。

你也可以在LinkedIn或者通过我的公司、xtream找到我。

[1] R. J. Hyndman 等著,预测:原理与实践,第二版 (2018)。

[2] B. Lim 等,深度学*的时间序列预测:综述 (2020)。

[3] K. Benidis 等人,时间序列预测的深度学*:教程与文献综述 (2018)。

[4] R. Masini 等人,时间序列预测的机器学*进展 (2021)。

[5] K. Hornik 等人,多层前馈网络是通用逼*器 (1989)。

[6] Z. Lu 等,神经网络的表达能力:从宽度上看 (2017)。

[7] D .周等,深度卷积神经网络的普适性 (2018)。

[8] M. Bronstein 等人,几何深度学*:网格、组、图、测地线和量规 (2021)。

[9] B. N. Oreshkin 等人, N-BEATS:可解释时间序列预测的神经基础扩展分析 (2019)。

[10] B. Lim 等人,用于可解释多时间范围时间序列预测的时间融合转换器 (2021)。

https://www.jeremyjordan.me/convolutional-neural-networks/。

[12] Z .崔等,用于时间序列分类的多尺度卷积神经网络 (2016)。

[13]由 fdeloche-Own 工作,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=60109157

[14]由 fdeloche-Own 工作,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=60149410和https://commons.wikimedia.org/w/index.php?curid=60466441

[15] A .张等,潜入深度学* (2020)。

[16] W .赵等,比较模型在艺术分类中的表现 (2021)。

[17] I. Sutskever 等人,用神经网络进行序列对序列学* (2014)。

[18] S. Hochreiter 等人,长短期记忆 (1997)。

[19] K. Cho 等人,论神经机器翻译的性质:编码器-解码器方法 (2014)。

[20] S. Hochreiter 等人,递归网络中的梯度流:学*长期依赖性的困难 (2003)。

[21] K. He 等,用于图像识别的深度残差学* (2015)。

[22] Bahdanau 等人,通过联合学*对齐和翻译的神经机器翻译 (2014)。

可解释性与公平性的关系

原文:https://towardsdatascience.com/the-relationship-between-interpretability-and-fairness-627266bd6fda

为什么可解释的模型更可能是公平的 3 个原因

(来源: flaticon )

可解释性和公平性似乎是相辅相成的。可解释性包括理解模型如何做出预测。公平包括理解预测是否偏向某些群体。在负责任的人工智能框架和 ML 会议中,这些特征总是被一起提及。然而,可解释性并不一定意味着公平性。

也就是说,一个可解释的模型更有可能是公平的。这种联系有三个主要原因。对于可解释的模型,更容易确定不公平的原因。在一个可解释的模型中也更容易纠正不公平。一些方法,比如证明解释,甚至依赖于可解释性。最后,这两个特征通过在人工智能系统中建立信任的目标联系在一起。我们将深入讨论这些原因。

用不可知的方法测量偏差

在我们深入探讨这些之前,让我们先讨论一下如何分析公平性。这也将帮助我们理解为什么这不是可解释性和公平性相关的原因之一。通常,公平性的衡量标准是模型不可知的。这意味着它们可以用于任何型号。这包括内在可解释的模型,如线性回归和决策树。它还包括更难解释的模型,如随机森林甚至神经网络。

准确性是衡量公平性的一个简单例子。具体来说,我们将比较该模型在不同人群中的准确性。这里的子群体是由敏感的特征定义的,如种族或性别。如果其中一个小组的准确性明显较低,这表明该模型对该小组不公平。

为了计算这个公平的衡量标准,我们只需要模型的预测和实际的目标变量。我们不需要研究模型本身的内部工作原理。这意味着计算可解释模型和不太可解释模型的度量是一样容易的。换句话说,如果 一个模型不公平,可解释性并不会让理解 变得更容易。问题是,像这样的衡量标准并没有告诉我们 为什么 模型是不公平的。

原因 1:更容易确定不公平的原因

不公平有不同的原因 这包括用于训练模型的数据中的偏差。具体来说,历史偏差代理变量不平衡数据集会导致不公平的预测。我们围绕算法用户如何与模型互动的选择也会引入偏差。对于可解释的模型,更容易识别这些来源。

这是因为,对于可解释的模型,更容易理解模型如何工作。这意味着我们清楚地了解哪些特性是重要的。我们也理解这些特征和目标变量之间的关系。通常,与神经网络等模型相比,算法和成本函数也简单得多。所有这些都使得找出导致模型不公平的原因变得更加容易。

与这个原因相关的是模型是如何构建的。通常,当你建立一个可解释的模型(例如线性回归)时,你将最终选择 8 到 12 个模型特征。您还将花时间使用领域知识将特性趋势与预期进行比较。真的,更多的心思放在功能选择上。只要我们考虑到公平,我们可以在模型开发过程的早期提出问题。这意味着您甚至可以在偏差被引入模型之前就识别出偏差的来源。

原因 2:更容易纠正偏差

对于可解释的模型,也更容易纠正不公平 这部分源于上面讨论的第一个原因。我们采取的纠正不公平的方法可能取决于不公平的原因。因为更容易确定原因,所以更容易选择最佳方法来纠正它。例如,我们可以纠正不公平模型的方法之一是移除代理变量。这些特征与种族或性别等敏感特征密切相关。

像随机森林这样的模型可以有多达 30-40 个特征。模型结构还允许特性之间的交互。这种复杂性使得很难理解任何代理变量和目标变量之间的关系。更难理解的是,这种关系是否会导致不公平的决定。最终,决定删除哪些代理变量更加困难。

可以对算法本身进行其他修正。比如我们可以调整成本函数来考虑公平性。这可能涉及添加惩罚不公平决策的惩罚参数。换句话说,模型的目标不仅是做出准确的预测,而且是公平的预测。可解释模型的算法和成本函数通常更简单。这使得调整它们更容易。

确保公平的方法也可以超越上面提到的量化方法。对抗不公平的一个重要方法是为用户提供预测的解释,然后给用户挑战这些预测的权力。我们越了解一个模型是如何工作的,就越容易用一种人类友好的方式来解释它。换句话说,可解释性更容易给出好的解释。

原因 3:它们都是关于建立信任的

最重要的原因是可解释性和公平性的共同目标。它们都是关于建立对人工智能系统的信任。这主要是通过减少这些系统可能造成的伤害来实现的。也就是说,我们不会相信我们认为会对我们造成伤害的东西。

我们更容易相信我们理解的东西。此外,我们对某事了解得越多,就越能确定它不会造成伤害。从这个意义上说,可解释性可以建立信任。公平的目标更直接。它旨在减少不公平决定带来的伤害。最终,一个关心人工智能系统信任度的组织会同时关心可解释性和公平性。

这就是为什么你会经常在负责任的人工智能框架中看到公平性和可解释性被一起提及。这些治理框架旨在定义开发人工智能系统的道德准则和最佳实践。除了公平性和可解释性,这些框架还涵盖了安全、保密和隐私等主题。像谷歌、微软和 IBM 这样的公司都有自己的框架。他们明白客户不会使用他们不信任的系统。

人工智能的发展正在创造新的机会来改善世界各地人们的生活,从商业到医疗保健到教育。这也提出了新的问题,即在这些系统中构建公平性可解释性、隐私和安全性的最佳方式。

—谷歌人工智能研究负责任的人工智能实践

出于类似的原因,公平性和可解释性是相关的研究课题。例如,在下面你可以看到 FAccT 2022 会议论文的一些感兴趣的领域。这是一次关于公平、问责和透明的会议。公平性和可解释性是算法开发中首先提到的话题。一个对减少人工智能系统的危害感兴趣的研究者会对这两个话题感兴趣。

FAccT 2022 征集论文(来源: ACM FAccT )

对信任的需求是公平性和可解释性之间关系的真正驱动力。我们看到可解释模型的特征也使这种关系更加密切。一路上,我们谈到了一些与公平相关的话题。这就是不公平的原因分析公平保证公平的途径。下面的三篇文章深入探讨了这些主题。

我希望这篇文章对你有帮助!你可以成为我的 推荐会员 来支持我。你可以访问 medium 上的所有文章,我可以得到你的部分费用。

https://conorosullyds.medium.com/membership

你可以在|Twitter|YouTube|时事通讯上找到我——注册免费参加 Python SHAP 课程

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的保费计划中定义的“完全许可”。

参考

Birhane,a .(2021)算法的不公正:一种关系伦理方法。https://www . science direct . com/science/article/pii/s 2666389921000155

Pessach,d .和 Shmueli,e .(2020),算法公平性。https://arxiv.org/abs/2001.09784

Mehrabi,n .、Morstatter,f .、Saxena,n .、Lerman,k .和 Galstyan,A .,(2021),关于机器学*中的偏见和公平的调查。https://arxiv.org/abs/1908.09635

重塑“硅谷”SeeFood 应用程序

原文:https://towardsdatascience.com/the-remaking-of-the-silicon-valleys-series-seefood-app-d309068cae6d

马文·迈耶在 Unsplash 上的照片

重塑“硅谷”SeeFood 应用程序

使用可教的机器和颤振开发杨坚的应用程序

我花了整个圣诞假期重新看了一遍很棒的喜剧电视连续剧硅谷,其中杨坚开发了一个移动应用程序,将食物分类为“热狗”和“非热狗”。这里有一段插曲!

我对这个节目的热情,促使我重新创建应用程序的原型,基本上看起来像下面的图片:

作者图片

创建模型

首先,我们必须通过创建一个二元分类器来检测属于“热狗”类别的食物和不属于它的食物。在我的上一篇文章中,我说明了如何创建一个能够分类的深度学*系统,你可以在这里找到它。

为了简单起见,我将在这篇书面教程中介绍一个非常酷和高效的工具,叫做可教机器,它可以让你通过点击几下鼠标就能创建一个二进制分类器!

第一步,是建立一个新的形象工程。

截图来自 https://teachablemachine.withgoogle.com/train

之后,您将第一个类重命名为“热狗”,第二个类重命名为“非热狗”

截图来自https://teachablemachine.withgoogle.com/train/image

完成步骤 1 和 2 后,您可以将所有符合既定类别的图片拖放到“上传”按钮上进行上传。你可以在下面的 Kaggle 数据集上找到需要的图像。

最后点击“火车模型”等待。在培训阶段结束时,您应该能够下载 tensorflow lite 格式的培训模型。

下载后,您将解压压缩的归档文件,并打开 label.txt 文件。要保留普通的“热狗”和“非热狗”文本,请从文件中删除“0”和“1”字符。

数据

我提供的数据集——带有公共许可证——总共有 3000 张图像可用于训练:从这个数量中, 1500 张在图片中显示一个热狗,而在其余的图片上显示非热狗图像,如食物、人、宠物等。此外,测试集由两个类别的 322 张图片组成。

让我们构建移动应用程序

为了开发这个应用程序,我将在 Android Studio 中使用 Flutter。如果你不知道如何设置一个 Flutter 应用程序,只需遵循这些简单的 步骤

在您的资产文件夹(如果没有,创建一个即可)中插入提取的文件: labels.txtmodel_unquant.tflite

作者图片

我还添加了另外三张图片,当应用程序返回是否是热狗的结果时显示。

打开 pubspec.yaml 文件,粘贴到这些依赖项下面。

**dependencies**:**flutter**:**sdk**: flutter**image_picker**: ^0.8.4+4**tflite**: ^1.1.2**splashscreen**: ^1.3.5

如果您在安装这些软件包时遇到问题,只需在https://pub.dev/上查找它们,并按照说明进行操作。

您还需要在 pubspec.yaml 文件中添加(取消注释)资产目录:

*# To add assets to your application, add an assets section, like this:* **assets**:- assets/
*#   - images/a_dot_burr.jpeg
#   - images/a_dot_ham.jpeg*

打开Android/app/build . gradle,将以下代码粘贴到 android 块中:

aaptOptions{noCompress ‘tflite’noCompress ‘lite’
}

并将 minSdkVersion 改为 19

作者图片

现在,您只需要在 lib 文件夹中创建 2 个 dart 文件:

作者图片

现在,将以下代码复制并粘贴到 main.dart 文件中。

在前面的代码中,我们设置了应用程序标题,而主页被重定向到 home 类。现在,我们可以在 home.dart 文件中创建 Home 类了

即使这段代码看起来很难,但大部分都是通过设置颜色、布局、文本等让事情看起来更漂亮

重要的方法很少。让我们从 pickImagepick gallery image开始。这些是异步功能,因为它们需要用户从他的设备中拍摄或选择照片。在初始状态中, loadModel 方法只是加载我们使用*可示教机器开发的模型。之后,在处理方法中关闭模型。*该 classifyImage 方法是该应用的核心,即给定一个图片文件,返回“HotDog”和“Not HotDog”。

结论

这项工作的结果是,当你观看像硅谷这样的科技展时会发生什么。现在你只需要找到其他像你一样的书呆子,开发一个应用程序,让你成为像杨晶一样成功的人!

我在加拿大获得第一份 ML 实*的简历

原文:https://towardsdatascience.com/the-resume-with-which-i-got-my-first-ml-internship-in-canada-d1cd833cc452

机器学*怎么找工作?我的个人故事

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

你可能见过很多这样标题的文章。每个人的经历都是独特的,你可以从每个人的经历中获得一些有用的(同时也是独特的)信息。

然而,我遇到的大多数关于这个主题的文章对我来说听起来有点奇怪:这样一篇文章中的一份简历有两页,第二页是科学出版物和专利的列表(哇,令人印象深刻!).

TL;速度三角形定位法(dead reckoning)

我的故事和之前所有的故事有什么不同?好吧,如果我没有最差的简历,那么可能是最差的之一,至少在两个主要领域:

  • 教育——我是一个计算机科学学士,来自一个你从来不知道的城市;
  • 经验——我几乎没有相关的工作经验。

不过,我还是在加拿大找到了一份机器学*相关的工作,虽然很难而且花了整整一年

你可以在完整简历版块下载我的 pdf 和 docx 格式的简历。

教育

正如我已经说过的——我是一所不知名大学的计算机科学学士。当然,通过良好的教育,你有更好的机会找到工作,至少因为你有机会接触到的关系和网络。但是,如果你不够幸运,没能在顶尖大学学*,那就用其他方式证明你值得拥有一份工作。

简历中的教育部分。作者图片

经验

我想这是你简历中最重要的一点——你以前在哪里工作过,你如何展示你的工作成果极大地影响了你获得职位的机会。然而,每个人都需要从某个地方开始。这就是著名的权限悖论或者说经验悖论: 如果所有用人单位都要求员工有工作经验,那么如何获得这种工作经验?

我不是这方面的专家,但这是我从许多人那里听到的:你不能让这个字段为空。在这里列出大学实践并提及精心设计的课程或相应的学位项目可能是合适的。但是你不能让它空着。如果事情真的很糟糕,你可以找一个开源项目来贡献或者获得一些志愿者经验。

简历中的经历部分。作者图片

是的,个人项目(再次)

由于我的工作经历完全不起眼,数据科学/机器学*项目部分是我简历中最有价值和最强大的部分。如果你有类似的工作经历,你也应该有类似的项目经历。

那一部分可以让你找到工作。它可以告诉一个潜在的雇主:“嘿,我没有任何工作经验,但是我在努力,我在努力!”。

你可能不止一次听到这句话,但是如果你没有任何工作经验,个人项目对你来说至关重要。让它们尽可能有趣复杂,使用现代技术,尝试从零开始实现某些东西以更深入地理解特定算法是如何工作的,等等。

所有这些都表明你有兴趣,你准备好学*新东西*,准备好面对困难并克服困难。你真的是那样吗?证明一下!***

简历中的项目部分。作者图片

以下是我的项目链接。我不知道我写的关于数据科学的博客有多大帮助,但它首先帮助了我。只有向另一个人解释某事,你才能完全理解它。因此,撰写教程或个人专业博客是开始数据科学职业生涯的一个非常好的方式。

  • 预测 YouTube 视频上不喜欢的数量:第一部分和第二部分;
  • 自动视频编辑;
  • 实时“我不是我”人脸检测器。

你们的水平或兴趣可能有很大的不同,但是你需要找到一些能够启发你的东西。

如果你对项目没有任何想法,你可能还没有准备好实施它们。为了用机器学*术语来思考和观察这个世界,你需要一个非常严肃的知识库*。尝试阅读另一本书或参加另一门课程来消化这些知识,并再现自己的想法。*

如果你认为你已经准备好了,但是仍然没有想法,那就在网上找找看。通常这类文章的质量还有待提高(建议你对虹膜数据集进行分类,或者解决一些计算机视觉问题,尽管这些任务完全是不同层次的),但这可能会让你产生自己的想法。

其他部分

技能

老实说,我填写这一部分是为了尽可能多地列出关键词,以免一开始就被过滤掉。据我所知,关键词搜索程序是在选择简历时使用的,尤其是对于新手职位(如实*生或大三),因为 HR 专员无法手动处理。

此外,重要的是要记住,指定你实际上不具备的技能是一个坏主意

简历中的技能部分。作者图片

证书

这里我列出了我从中获得数据科学和机器学*主要知识的课程。

我也觉得它没有多大意义列举一下:

  • **个别课程因为单子会太长太细;相反,你应该列出你的课程/证书;
  • 入门级课程(比如斯坦福的机器学*)因为你的潜在雇主可能会认为你的知识/资历不足。

简历中的证书部分。作者图片

完整简历

把所有的部分放在一起,我得到了给我带来第一份机器学*工作、第一份加拿大工作和第一份好工作的简历。
谢谢,简历!

**

给我带来第一份 ML 实*的简历。作者图片

您可以从下面的资源库下载 pdf 和 docx 格式的完整简历。

*https://gitlab.com/Winston-90/ml_resume_first_job/ [## dmytro Nikolai ev/ML _ resume _ first _ job

gitlab.com](https://gitlab.com/Winston-90/ml_resume_first_job/)

结论和最后想法

找工作不容易。我花了整整一年的时间才得到一个面试邀请。老实说,我不知道这一年是我运气不好,还是相反,我有一次运气不错。

在我找工作的时候,我经常改变我的简历,增加和删除一些部分,改变公式,或者重新组织章节的顺序。我不知道这些转变中哪些是真正成功的,但我可以肯定地说:

  • 不要把你的简历复杂化。
    不要列出你生活中的所有项目或者你上过的所有课程。我认为对于一个初级员工来说,三个已经足够了。
  • 不要努力制作一页纸的简历。
    这是我个人的观点,也是我和几个人谈过的一条建议。所有的在线服务都说初学者的简历必须是一页纸,但是你不要太努力了。
  • 不要害怕寻求建议
    不要犹豫去寻求建议——每个人都从某个地方开始,许多人(如果不是所有人)都面临着问题,所以人们通常会理解这一点。也许你大学里的一些朋友或教授可以帮助你走上成功之路。如果你不能亲自寻求建议,使用互联网和相关的网站/论坛。有时候,当你感到困惑时,找个人倾诉是很重要的。

最后:永不放弃。在我收到回复之前,我发出了一百多份求职申请(这还远远没有达到极限)。找第一份工作很难,有时非常难,尤其是对移民或改变职业道路的人来说。但是第二份工作会比较好找,第三份会自己找你。

祝你好运。也许你今天会收到想要的报价!所以努力去做吧。*

感谢您的阅读!

  • 我希望这些材料对你有用。在 Medium 上关注我,获取更多这样的文章。
  • 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论里问我,或者通过 LinkedIn 或者 Twitter 联系。
  • 为了支持我作为一个作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。

适合您的人工智能工作负载的硬件—不同寻常的考虑

原文:https://towardsdatascience.com/the-right-hardware-for-your-ai-workload-unusual-considerations-84e072bb8a30

在为我们的人工智能工作负载设计最佳硬件组合时,我们指出了一些很少被提及和低估的特性和相互关系

图片来源:作者使用 Pixabay images ( image-1 、 image-2 、 image-3 、 image-4 、 image-5 )创建

软件控制的硬件

软件正在吞噬世界,人工智能(AI)/机器学*(ML)正在吞噬软件。

越来越多的商业领袖得出相同的结论,即每个企业,无论其最终产品或服务如何,都必须将人工智能工具和技术集成到其业务流程和路线图规划中。这也意味着随着越来越多的人工智能工作负载/任务消耗计算基础设施,该组织的信息技术(IT)工作负载的场景也在发生变化——无论是在内部还是在云上。

在这方面有趣的观察是,这些所谓的**“人工智能工作负载”最适合在特定的硬件配置上运行**。当然,它们可以运行在传统的通用计算基础设施上,而这些基础设施可能是一个组织在 10 年前就已经规划并实施的。但是最佳投资回报或更快的上市时间只有在硬件针对组织计划运行的特定人工智能工作负载进行了思考和优化的情况下才能实现。

20 世纪的最后几十年(可能也是 21 世纪的第一个十年)见证了摩尔定律推动的通用计算机器和软件的增长,这些机器和软件是为适应硬件的需求和限制而定制的。

我们已经深入到 21 世纪了。软件栈(主要是 AI)开始规定硬件要求和细节

图片来源:作者使用 Excalidraw 和 Pixabay 免费图片创建

有很多关于这个话题的高质量文章。在这篇文章中,我想指出一些很少被提及和低估的特性和相互关系,在为我们的人工智能工作负载设计最佳硬件组合时,我们可能要记住这些特性和相互关系。

CPU 没有死

在讨论 AI 专用硬件时,CPU 的选择和配置往往会受到兄弟般的对待。这是因为 GPU 在最受欢迎的 AI/ML 任务中的流行和主导地位——计算机视觉(CV)中的深度学*(DL),自然语言处理(NLP),或推荐系统。

但实际情况在不断变化。

大量非 GPU 优化的任务

然而,许多初创公司和成熟的科技巨头已经开始超越简单的 DL 工作负载,并围绕 DL 平台为其业务混合有趣的预处理或并行计算块。

这些想法几乎没有一个是全新的。它们中的大多数以前只在非常特定的情况下使用,或者没有在学术界或其特定应用领域之外广泛使用。有趣的是,它们现在正与 AI/ML 工作负载融合在一起,并在全球科技巨头的整个业务平台的性能和稳健性方面发挥着重要作用。

下面列出了一些例子,

  • 分子动力学
  • 基于物理的模拟
  • 大规模强化学*
  • 博弈论框架
  • 进化计算

由于其历史发展,这些类型的计算任务的大多数代码和算法还没有高度优化以集成到 GPU 中。这使得在设计和决定特定的服务器系统时,为这些任务选择 CPU 对于初创公司或 IT 组织来说至关重要。

图片来源:作者使用 Excalidraw 创建

全方位示例

最*,Nvidia 推出了 Omniverse 平台,彻底改变了产品和流程设计师在多个领域的合作方式——建筑、媒体、游戏设计、制造等。目标是将高性能计算(HPC)、AI/ML 模型、基于物理的模拟、设计自动化融合到一个平台上。

显然,传统上使用不同计算范式和风格的不同领域的融合需要在硬件方面进行仔细的优化,平衡 CPU/GPU/内存的需求。

图片来源:作者创作

另一个人工智能任务的例子

一个典型的例子是,CPU 必须进行大量的定制特征处理,包括预先丢失或杂乱的数据,并且只发送一小部分用于训练 DL 模型的好数据。完全可能的是,总计算时间和能量支出受到这种数据争论和 CPU 和板载存储的数据 I/O 的瓶颈,而不是 DL 模型训练或推断。

或者,在预先训练的模型可以在 GPU 上运行以进行推理之前,可能需要在前端进行大量的特定应用信号处理来提取特征。同样,瓶颈(和改进的机会)在前端 CPU 端。

对于这样的服务器设计来说,核心数量、boost、L1/L2 高速缓存的选择——所有与 CPU 家族相关的考虑因素——比在最好的 GPU 上花费时间和金钱更重要。

关键的 CPU 一代选择示例

有时,CPU 代的选择可能取决于微妙的考虑,例如 AI 工作负载是否要求主内存和 CPU 之间完全异步的通信。

图片来源:作者使用 Excalidraw 创建

有些类型的人工智能和数据分析代码利用了这种交流,有些则没有。当不需要时,它可能是多余的,因为支持这种硬件升级的 CPU 一代可能比上一代更昂贵、更耗电。与任何工程决策一样,优化在这种情况下至关重要。

每个人都知道 TCO 的概念,即服务器系统所有权的总成本(T2 ),总成本(T4)。但是有一个越来越重要的概念TCE——环境总成本——考虑到这种优化研究。

图片来源:作者使用 Excalidraw 创建

混搭也有助于优化。同样,混合策略需要根据应用程序工作负载进行调整。

图片来源:作者使用 Excalidraw 创建

被低估的 GPU 考虑因素

即使当 AI 工作负载包括大部分 DL 模型训练和推理时,硬件提供商或设计师也必须与潜在客户进行这些对话。

CPU 到 GPU 的进程

主要的 DL 框架,如 TensorFlow 和 PyTorch 已经变得更加灵活——只是在最*几天(过去的 1-2 年)——被用作通用的 ML 问题解决工具。这为将传统的 CPU 优化问题转化为适合 GPU 的任务铺平了道路。

然而,并不是所有的数据科学/ ML 团队都有足够的装备(或带宽有限)来利用这一进步。对于他们来说,在没有好的代码库的情况下,花很多钱在最新的 GPU 上,仍然是一种资源浪费。在这些情况下,混合服务器部署是一个好的起点。

图片来源:作者使用 Excalidraw 和 Pixabay 免费图片创建

支持较低精度的数字

许多 DL 工作负载可以通过在其模型和参数中使用较低精度的算法来获得足够的准确性,或者更重要的是,商业价值。这有效地允许组织在相同的硬件上运行更大的模型。

但是,并不是所有的 GPU 家族都原生支持这个特性。大多数老一代 GPU 需要大量的软件和编程调整和优化才能实现这一点。如果客户可以利用这一特性,硬件提供商应该相应地提出建议,并推广适合这一调整的 GPU。

多 GPU 集群映射到正确的软件/人工智能堆栈

许多多 GPU 系统是在没有适当规划或考虑人工智能/软件堆栈的情况下构建的,这些人工智能/软件堆栈可以真正利用这样的配置。除了传统的 DL 任务,许多分布式数据分析任务也可以利用多 GPU 系统(查看 Dask、RAPIDS 或 Ray 等库)。

https://medium.com/dataseries/gpu-powered-data-science-not-deep-learning-with-rapids-29f9ed8d51f3

因此,映射准确的软件堆栈和多 GPU 系统配置也是一个重要的考虑因素,其重要性将会增加。

edge——新的黑马

如果不提到黑马 edge 和混合云,人工智能优化硬件的未来发展和进步就不完整。

要改变的外形

硬件设计人员必须适应对外形规格的不寻常要求(甚至背离传统的 1U/2U/4U 设计)。真正的边缘设备通常有一些不寻常的安装限制—高度、空间、重量等。如果你 想象一下边缘服务器被安装在制造工厂 的大型机器旁边,你就会明白这个想法。

图片来源:作者使用 Excalidraw 和 Pixabay 免费图片创建

注重推理还是注重分析?

汽车、制造和物联网系统将成为边缘服务器和计算基础设施的主要驱动力。很容易想象,这种服务器上的大部分人工智能工作负载将是以推理为中心的。

但是,越来越多的**复杂的可视化和业务分析任务(通常涉及大型数据库提取)**正在被设想用于边缘智能平台。这种工作负载需要与纯粹专注于人工智能推理任务的硬件配置优化有所不同。

对象存储、视频分析、安全性考虑

新的令人兴奋的边缘计算和边缘分析应用领域为实现最佳硬件配置带来了新的挑战。这些问题中有些是值得问的

  • 边缘是否需要对象存储?
  • 是否有持续的视频分析任务在边缘运行?
  • 边缘数据(原始数据和已处理数据)的数据保留和安全考虑因素是什么?

总结和结论

总的来说,我们看到企业级计算基础设施的设计和安装不再是单行道。随着典型商业 IT 和工程环境中以 AI/ML 为中心的工作负载的出现和增长,将这种 AI 工作负载的确切需求和限制映射到硬件配置变得越来越重要。

多管齐下的策略、注重优化的心态、与软件团队的密切关系,以及对现代 AI/ML 工具和技术的深入了解是在这种情况下取得成功的必要条件。

喜欢这篇文章吗?成为 中等会员 继续 无限制学* 。如果您使用下面的链接, ,我将收取您的一部分会员费,而无需您支付额外费用

https://medium.com/@tirthajyoti/membership

正确的技能是允许你追求自己兴趣的技能

原文:https://towardsdatascience.com/the-right-skill-set-is-the-one-that-allows-you-to-pursue-your-interests-e49d7cfa1cc8

作者聚焦

Barry Smyth 回顾了他在学术界和工业界的双重职业生涯,以及年轻数据科学家不断变化的前景

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 巴里·史密斯 分享我们的对话。

照片由巴里·史密斯提供

Barry Smyth(理学学士、哲学博士、RGU、MRIA、欧洲研究与开发协会荣誉会员)是一名科学家和企业家。他是都柏林大学计算机科学的数字讲座教授。Barry 是皇家爱尔兰学院的成员,欧洲人工智能协会的成员,数据分析洞察中心的创始董事。

Barry 的研究兴趣包括机器学*、用户建模、个性化和推荐系统,他已经就这些主题发表了 400 多篇经同行评审的文章。作为一名企业家,他共同创立了 ChangingWorlds 和 HeyStaks,目前他担任人工智能领域几家欧洲初创公司的董事会成员和/或顾问。

你在一月份发布了一系列围绕 Wordle 的数据分析帖子,Wordle 是一个病毒性文字游戏。是什么吸引你进入这个话题,为什么你想深入探讨这个话题?

为了回答这个问题,我需要介绍一下我的工作背景。我的教学职责之一是一门名为实践中的数据科学的课程。它提供给三年级本科生数据科学学生,他们有两个选择:他们可以接受为期 5 个月的带薪行业实*,与经批准的行业合作伙伴合作;或者,他们可以参加我的数据科学实践课程,然后利用暑假时间追求自己的兴趣或进行短期实*。如果他们在实践中选择数据科学,那么他们必须在我的课程中投入 10 周时间:大约 300 多个小时的努力。

在 10 周内全职接触学生意味着实践中的数据科学已经被设计为非常雄心勃勃和具有挑战性,远远不是传统的基于讲座的课程。在这个项目中,学生分组合作(通常每组两名学生)来实施他们自己设计的数据科学项目。他们一起进行设计和编码,并完成期末课堂报告和详细的书面报告。在 10 周的时间里,他们还学*了大量补充技能,从源代码管理和代码审查到在两周一次的更新会议上向全班展示他们的进展,以及体验与项目合作伙伴合作的利弊。

这就是背景情况。沃尔多怎么办?每年,在本模块的第一周,我们都会参加我称之为“数据科学训练营”的活动。这是一个密集的准备周,在此期间,我向学生展示了一个样本数据科学项目,从开始到结束,让他们对他们的小组工作有所期待。每年,我都会尝试就一个当代话题创作一个新项目。过去,我曾报道过诸如马拉松比赛(与埃利德·基普卓格打破 2 小时障碍的努力有关)、好莱坞电影(电影真的很少像它们所依据的书一样好吗?),以及乔维德·疫情等人。

在训练营周期间,我描述了如何将一个主题从一个模糊的项目想法转变为一组具体的合适的研究问题,如何组装一个合适的数据集,如何清理和分析数据,以及如何使用分析结果以清晰和令人信服的方式仔细回答研究问题。

今年,选择的主题是 Wordle,主要是因为这款游戏变得多么受欢迎,以及它多么适合数据驱动的分析。当我为训练营周开发项目时,我在 TDS 上发表了几篇关于 T4 的文章来测试我的想法。事实证明,这是一组非常受欢迎的文章,这些回复帮助我的班级形成了这个项目。

作为一个发表过数百篇同行评议文章的人,你为什么决定为更广泛、更不专业的读者写作?

这被证明是一个幸福的意外。不久前,我开始跑马拉松——我想这是我的中年危机——我也想回到编码和进行一些我自己的个人研究,而不仅仅是监督别人的研究。作为一名学者,我花了很多时间指导博士生,他们通常会做所有有趣的技术工作。

我认为回到编码世界的一个好方法是开始我自己的兼职项目。当我开始我的马拉松之旅时,我决定通过分析从波士顿、纽约到伦敦和都柏林的各种大城市马拉松赛公布的比赛数据,尽可能地了解跑步。

随着我的分析的进展,我意识到它揭示了一些关于人们如何跑马拉松的有趣见解,我渴望展示我的发现。我开始在我自己的出版物https://medium.com/running-with-data下撰写各种研究和比赛报告,后来通过 TDS。很快,我的数据科学副业项目成为我的主要学术研究课题之一,因为我深化了我的研究,并将我从机器学*工作中了解到的知识应用到我正在寻找的体育科学和马拉松比赛中。我的博客帖子引发了几十篇新的学术研究论文。

我发现我真的很喜欢为更普通的读者写作,以及通过媒体和 TDS 收到反馈的即时性。这是对较慢的学术出版速度的一个很好的补充(一篇新文章可能需要几个月的时间才能被审查和发表)。

我的媒体文章也让我接触到我可能会错过的观众:跑步的大众、记者和作家,以及体育科学家。事实上,这被证明是一种非常有效的方式,可以提升我对体育分析的新兴趣,并与该领域的其他人建立联系,从而导致一些非常有成效和持久的合作。

最*你觉得什么样的问题最有趣——无论是在你的学术工作中还是在你的其他项目中?

我不确定是否有一组容易定义的问题吸引我,真的。概括地说,我(目前)的数据科学兴趣分为三个主要领域:

  1. 我的传统学术兴趣集中在机器学*和推荐系统上,通常是在电子商务或媒体中的应用。
  2. 最*,我对体育分析的尝试使我将我的机器学*兴趣转移到体育科学领域,我现在参与了几个项目,探索数据科学和机器学*如何影响我们训练和比赛的各种方式。能够将机器学*的想法应用到这个新颖的领域是非常棒的,显然在体育科学领域和更广泛的市场中对它有着巨大的需求。
  3. 此外,我总是关注其他话题,通常是从公共利益的角度。这些很少以正式的研究项目开始,但有时它们会把我引向一些非常有趣的方向。例如,最*我对数论的某些方面产生了兴趣,并发表了几篇关于倒数和质数的 TDS 文章。在这个过程中,我还发现了一些新的整数序列,它们被在线整数序列百科全书(OEIS)所接受,这是一个重要的数论资源。

总的来说,我被大大小小的各种主题中的问题所吸引,并且经常追求项目,只是因为它们看起来很有趣,或者因为它们允许我尝试一些新的编码想法或可视化技术。这是作为一名学者的最大特权之一,我可以用这种方式探索新的技术和领域。

你的职业生涯立足于学术界,但你也与行业实体广泛合作。你认为这种双轨道路有什么好处?

要回答这个问题,让我们回到 20 世纪 90 年代。我是一名从事人工智能(AI)和机器学*的大三学生。我在教学,建立一个研究小组,写补助金,出版我的研究成果。

当时,网络热潮正如火如荼,我有兴趣探索将我们在实验室开发的一些技术商业化的可能性。我致力于个性化技术,以帮助网站和应用程序了解并适应用户的需求和偏好。我意识到,这种技术不仅有明确的市场需求,而且将它们商业化也将为我提供一个在真实用户的生活中评估它们的机会,而不是在学术环境中可能进行的更有限的基于实验室的评估。

我和我早期的一个博士生共同创立了一家名为 ChangingWorlds 的公司,我们一起为媒体/电视公司和移动运营商开发个性化产品。那是在 iPhone 出现之前,所以网络看起来和现在很不一样,但是这种体验是非常有益的。我学到了很多关于创建一个成功的公司,雇佣合适的人,建立团队,以及将复杂的机器学*技术产品化的知识。

我很幸运能够继续做一名学者,并继续在商业世界和学术界之间分享我的时间。整个经历中最令人惊讶的一个方面是这种双重存在给我的商业和学术生活带来的价值。例如,我的学术经历帮助 ChangingWorlds 向客户展示了我们的产品和服务的影响和价值,因为我们知道如何建立和运行大规模的用户试验;这远在 A/B 测试被竞争对手发现之前。

与此同时,我的学术生活从商业方面受益匪浅,因为我能够用真实世界的实验和大规模的评估来撰写研究论文,这确实有助于我的研究获得认可。此外,我开始了解到一些最有趣和最具挑战性的问题存在于工业界,这有助于在工业界越来越多地将学术界视为重要的创新伙伴的时候塑造我未来的研究。我一直在基础研究和应用研究之间保持平衡,但后者通过与大大小小的行业伙伴合作而大大丰富了。

与此相关的是,许多数据和 ML 专业人员在职业生涯早期面临着行业和学术界之间的选择。在做决定之前,他们应该问自己什么问题?

在过去的十年左右,甚至更长的时间里,“学术界与工业界”之争的性质一直在变化。过去人们追求博士学位(计算机/数据科学)主要是因为他们对学术生涯感兴趣。在我看来,这不再是常态,大多数博士候选人似乎是被博士学位现在提供的行业研究机会所驱动的。事实上,世界上一些最好的研究正在行业研究实验室内进行,正如领先的人工智能和人工智能会议上由行业主导的研究数量所证明的那样。

当谈到数据科学和 ML 学生和专业人士应该问自己的问题时,我认为重点应该是发展正确的技能集,以追求他们感兴趣的职业生涯。有时我们过分强调技术技能(编码、数学、统计),但是现在协作、软件工程和交流技能也非常重要。数据科学家需要能够与其他人很好地合作(通常作为跨学科团队的一部分),他们需要遵循最佳实践软件工程原则,并且他们需要能够以清晰和令人信服的方式交流他们的工作结果。

我希望看到学生在本科培训期间接触到更多这方面的东西。这就是我以这种方式设计我的数据科学实践课程的原因,我认为学生们都同意,尽管这很有挑战性,但他们都学到了很多关于作为一名专业数据科学家意味着什么的知识。

作为一个在科技和数据相关领域有着长期职业生涯的人,你希望看到这个领域在未来几年的发展趋势是什么?

我们可以期待看到数据科学和机器学*的持续商品化。不久前,如果你想使用机器学*,你必须从头开始编写算法,并管理所有的训练和模型构建。不再是了。今天,最先进的技术通常只是一个 API 调用。这种做法的缺点是,它导致了机器学*“解决方案”的激增,但并不总是使用确保模型得到公平训练和正确部署所需的护栏。

例如,模型很容易过度适应其训练数据,而在新数据上表现不佳,用有偏差的数据集训练的模型必然会产生有偏差的结果。这并不新鲜,但如果机器学*和数据科学的力量被一些考虑不周的未能遵循最佳实践所玷污,这可能会成为一个越来越受 ML 驱动的世界的一个大问题。

我还相信,公司会逐渐意识到,将数据科学和 ML 技术融入到他们的产品和服务中,并不像乍看上去那样是灵丹妙药。雇佣一个有能力的数据科学团队既具有挑战性又成本高昂,而且新进入该领域的公司可能并不完全了解正确的要求,这使得提前雇佣成为一个有风险的提议。

在传统的软件工程中,维护和开发代码库一直很重要。在数据科学研究中,再现性是关键,在研究社区中,我们看到人们越来越重视开放数据集和代码可用性,这一切都是为了提高再现性。这方面一个有趣的挑战是我们将来如何管理数据集。我们已经*惯了 Git 和 GitHub 等源代码管理工具,但这些工具并不太适合管理不断发展的数据集。我们开始看到一种新的数据管理和协作工具的出现,我认为这将是未来的一个重要领域。

要了解更多关于 barrysmyth 的工作,并了解他的最新文章,请在媒体和推特上关注他,或者在谷歌学术上探索他的学术工作。以下是 Barry 在 Wordle、数论和公共卫生数据等主题上的一些出色的 TDS 贡献:

  • (2022 年 2 月,9 分钟)
  • 玩了一百多万场 Wordle 学到的东西(2022 年 1 月,18 分钟)
  • 大数据中的小字(2022 年 6 月 39 分钟)
  • 四个 F:如何为你的数据科学项目定义一个高质量的研究问题(2020 年 8 月,9 分钟)
  • 对消退锁定生效(2022 年 6 月 6 日分)

想和广大观众分享一些你自己的作品吗?我们很乐意收到你的来信。

为了长度和清晰起见,这个问题被稍微编辑了一下。

数据运营的兴起

原文:https://towardsdatascience.com/the-rise-of-dataops-2788958034ee

我们找到解决当今数据混乱和协作挑战的方法了吗?

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

数据变得越来越大,传统的数据管理已经不起作用了。DataOps 正在崛起,承诺驯服今天的混乱和环境挑战。

让我们面对现实—传统的数据管理不起作用。今天, 75%的高管不信任自己的数据,只有 27%的数据项目是成功的。在所谓的“数据黄金时代”中,这些数字令人沮丧。

随着数据的规模和复杂性不断增长,我们正在努力控制数据。更糟糕的是,数据团队及其成员、工具、基础设施和用例同时变得更加多样化。结果是我们从未见过的数据混乱。

DataOps 已经存在好几年了,但现在它火了,因为它承诺解决这个问题。仅隔一周,Forrester 和 Gartner 最*在认识到数据运营的重要性方面做出了重大转变。

今年 6 月 23 日,Forrester 发布了关于数据目录的最新版本的 Wave 报告——但他们没有像往常一样发布“机器学*数据目录”,而是将该类别重命名为“数据操作的企业数据目录”。一周后,在 30 日,Gartner 发布了其 2022 炒作周期,预测 DataOps 将在 2-5 年内完全渗透市场,并将其从曲线的最左侧移动到其“膨胀预期的峰值”。

谷歌自 2015 年以来对“数据行动”的全球搜索趋势数据。y 轴显示“随着时间推移的兴趣”,或搜索兴趣的归一化版本。100 表示在给定的时间和区域中该术语的最高流行度。(图片由作者提供。)

但是 DataOps 的崛起不仅仅来自分析师。我亲眼目睹了数据运营从一个不为人知的领域变成一个必备领域,一些公司甚至围绕数据运营建立了完整的战略、功能甚至角色。虽然结果各不相同,但我看到数据团队在敏捷性、速度和成果方面取得了令人难以置信的进步。

在这篇博客中,我将分解你应该知道的关于 DataOps 的一切——它是什么,它来自哪里,以及如何在你的组织中开始实施它。

什么是数据操作?

关于 DataOps,首先,也可能是最重要的一点是,它不是一种产品。它不是工具。事实上,这不是你能买到的任何东西,任何试图告诉你不是这样的人都是在欺骗你。

相反, DataOps 是一种思维模式或文化——一种帮助数据团队和人们更好地合作的方式。

数据操作可能有点难以理解,所以让我们从几个众所周知的定义开始。

“data ops 是一种协作式数据管理实践,专注于改善整个组织中数据管理者和数据消费者之间的沟通、集成和数据流自动化。”
Gartner

“数据运营是在从基础设施到体验的所有技术层中实现解决方案、开发数据产品和激活数据以实现商业价值的能力。”
——
福瑞

“data ops 是一种数据管理方法,强调数据工程师、数据科学家和其他数据专业人员之间的沟通、协作、集成、自动化和合作测量。”
安迪帕

如您所知,数据操作没有标准定义。然而,您会看到,每个人都在谈论超越技术或工具的数据操作。相反,他们关注的是诸如沟通协作整合体验合作等术语。

在我看来,DataOps 实际上是将当今日益多样化的数据团队聚集在一起,并帮助他们跨同样多样化的工具和流程工作。它的原则和过程帮助团队推动更好的数据管理,节省时间,并减少浪费的努力。

数据运营背后的四个基本理念

有些人喜欢说数据团队就像软件团队一样,他们试图将软件原理直接应用到数据工作中。但事实是,他们有天壤之别。

在软件中,你对你使用的代码有一定程度的控制。毕竟,某个地方的某个人正在写它。但是在一个数据团队中,您经常无法控制您的数据,因为它来自各种各样的源系统,格式不断变化。如果有什么不同的话,数据团队更像一个制造团队,将一堆难以驾驭的原材料转化为成品。或者,数据团队更像是产品团队,将产品带给各种各样的内部和外部最终消费者。

我喜欢思考 DataOps 的方式是,我们如何从其他团队吸取最佳经验,并应用它们来帮助数据团队更好地合作?DataOps 结合了精益、产品思维、敏捷和 DevOps 的最佳部分,并将其应用于数据管理领域。

数据运营背后的四个基本理念。(图片由作者提供。)

倾斜

关键思想:利用价值流图减少浪费。

尽管它的根源可以追溯到 18 世纪 30 年代本杰明·富兰克林的著作,精益却源于丰田在 20 世纪 50 年代的工作。在第二次世界大战的阴影下,汽车工业——以及整个世界——正在恢复元气。对于各地的汽车制造商来说,员工超负荷工作,订单延期,成本高,客户不满意。

为了解决这个问题,丰田创造了 丰田生产系统 ,这是一个通过消除浪费来节约资源的框架。它试图回答这样一个问题,如何在最短的时间内以最低的成本提供最高质量的产品?它的一个关键思想是在不牺牲质量的情况下,尽可能消除制造业中的八种浪费——生产过剩、等待时间、运输、工人利用不足等等。

TPS 是精益的前身,由商人约翰·克拉夫茨克于 1988 年发明,并于 1996 年由研究人员詹姆斯·沃马克和丹尼尔·琼斯推广。精益专注于价值流图的理念。就像你用 TPS 绘制一条生产线一样,你要极其详细地绘制一项业务活动,识别浪费,优化流程以保持质量,同时消除浪费。如果流程的一部分没有为客户增加价值,那么它就是浪费——所有的浪费都应该消除。

价值流图实际上是什么样的?让我们从现实世界中的一个例子开始。

在咖啡馆点咖啡的价值流图。(图片由作者提供。)

假设你拥有一家咖啡馆,你想改善你的顾客点一杯咖啡的方式。第一步是规划出顾客点咖啡时发生的一切:接订单、接受付款、煮咖啡、递给顾客,等等。对于其中的每一步,您都要解释可能会出现什么问题,以及这一步需要多长时间,例如,一位顾客很难找到他们应该点的菜,然后在他们到达后要花 7 分钟排队等候。

这个想法如何应用于数据团队?数据团队类似于制造团队。它们都与原始材料(即源数据)一起工作,直到它成为产品(即“数据产品”)并到达客户(即数据消费者或最终用户)。

那么,如果供应链有自己的价值流,那么数据价值流会是什么样的呢?我们如何将这些相同的原则应用于数据价值流映射?我们如何优化它们以消除浪费并提高数据团队的效率?

产品思维

关键思想:用待完成工作框架询问你的产品真正在完成什么工作。

产品思维的核心概念是要做的工作(JTBD)框架,由 Anthony Ulwick 于 2005 年推广。

理解这个想法最简单的方法是通过奶昔理论,一个来自克莱顿·克里斯滕森的故事。一家快餐店想增加他们奶昔的销量,所以他们尝试了很多不同的变化,比如使它们比竞争对手的奶昔更有巧克力味、更耐嚼、更便宜。然而,什么都没起作用,销售还是老样子。

接下来,他们派人在餐厅站几个小时,收集购买奶昔的顾客的数据。这让他们意识到,他们的奶昔有*一半是在早上 8 点前卖给单身顾客的。但是为什么呢?当他们第二天早上回来和这些人交谈时,他们得知这些人开车去上班很长时间,很无聊,需要一份他们可以在开车时在车上吃的早餐。百吉饼太干了,甜甜圈太乱了,香蕉太快了,不能吃……但奶昔正合适,因为它们需要一段时间才能喝完,让人们饱足一上午。

一旦他们意识到,对于这些顾客来说,奶昔的目的或“工作”是在通勤期间提供令人满意的、方便的早餐,他们就知道他们需要让他们的奶昔更方便、更有饱腹感——于是销量增加了。

JTBD 框架帮助你制造人们喜爱的产品,无论是奶昔还是仪表盘。例如,产品经理的 JTBD 可能是区分不同产品特性的优先级,以实现业务成果。

这个想法如何应用于数据团队?在数据世界中,有两种主要类型的客户:“内部”数据团队成员,他们需要更有效地处理数据;以及“外部”数据消费者,他们来自更大的组织,使用由数据团队创建的产品。

你可以使用 JTBD 框架来理解这些客户的工作。例如,分析师的 JTBD 可能是为这些产品优先级决策提供分析和见解。然后,一旦您创建了 JTBD,您就可以创建实现它所需的任务列表——每个任务都是一个数据价值流,并且可以使用上面的价值流映射流程进行映射和优化。

敏捷

关键思想:用 Scrum 提高速度,优先考虑 MVP 而不是成品。

如果你在科技或任何“现代”公司工作过,你可能用过敏捷。2001 年,随着敏捷软件开发宣言,敏捷被创建,是软件团队计划和跟踪他们工作的框架。

敏捷的核心思想是 Scrum ,一个基于创建 MVP 或最小可行产品的思想的迭代产品管理框架。

这里有一个例子:如果你想制造一辆汽车,你应该从哪里开始?你可以从进行采访、寻找供应商、建造和测试原型等等开始,但这将需要很长时间,在此期间,市场和世界将发生变化,你可能最终创造出人们实际上不喜欢的东西。

MVP 帮助改进开发的六种方式。(图片由作者提供。)

MVP 是关于缩短开发过程的。要创建一个 MVP,你会问什么是 JTBD——它真的是关于制造一辆汽车,还是关于提供交通工具?解决这项工作的第一个、最快的产品可能是自行车,而不是汽车。

Scrum 的目标是尽可能快地创造出可以推向市场并用于收集用户反馈的东西。如果你专注于寻找最小的解决方案,而不是创造理想或梦想的解决方案,你可以了解用户在测试你的 MVP 时真正想要的是什么——因为他们通常无法在采访中表达他们真正想要的。

这个想法如何应用于数据团队?许多数据团队在与组织其他部门隔离的孤岛中工作。当他们被分配到一个项目时,他们通常会为一个解决方案工作几个月,并将其推广到公司,却发现他们的解决方案是错误的。也许他们得到的问题陈述不正确,或者他们没有设计正确解决方案所需的环境,或者在他们构建解决方案时组织的需求发生了变化。

数据团队如何使用 MVP 方法来缩短时间并更快地得出答案?他们如何建立航运思维,并从利益相关者那里获得早期、频繁的反馈?

敏捷可用于开放孤立的数据团队,并改进他们与最终数据消费者的合作方式。它可以帮助数据团队找到正确的数据,将数据模型投入生产并更快地发布数据产品,使他们能够从业务用户那里获得反馈,并随着业务需求的变化迭代地改进和调整他们的工作。

DevOps

关键思想:改善与发布管理、CI/CD 和监控的协作。

DevOps 诞生于 2009 年的 Velocity Conference Movement,工程师 John Allspaw 和 Paul Hammond 在会上介绍了关于改善“开发&运营合作”的内容。

当时的传统思维是软件以线性流程移动——开发团队的工作是添加新功能,然后运营团队的工作是保持功能和软件稳定。然而,这次演讲引入了一个新的理念:开发人员和运营人员的工作都是支持业务。

DevOps 把线性开发流程变成了一个循环的、相互关联的流程,打破了这两个团队之间的孤岛。它有助于团队通过一套流程跨两个不同的职能部门一起工作。像发布管理(强制执行一套“运输标准”以确保质量)、运营和监控(创建监控系统以在出现问题时发出警报)和 CI/CD (持续集成和持续交付)这样的想法使这成为可能。

由 Kharnagy 在维基百科上创建的 DevOps 工具链,在知识共享许可下在此共享。

这个想法如何应用于数据团队?在数据世界中,数据工程师和分析师很容易独立工作——例如,工程师管理数据管道,而分析师建立模型——当事情不可避免地发生时,他们会互相指责。这非但不能解决问题,反而只会导致争吵和怨恨。相反,重要的是将它们整合到一个共同的目标下,使业务更加以数据为导向。

例如,您的数据科学家现在可能依赖工程或 IT 来部署他们的模型,从探索性数据分析到部署机器学*算法。借助 DataOps,他们可以自行部署模型并快速执行分析,不再有依赖性。

从 DevOps 到 DataOps。(图片由作者提供。)

注意:我再怎么强调这一点也不为过——data ops 不仅仅是通过数据管道进行开发。DevOps 解决的问题是软件开发和 IT 这两个高技术团队之间的问题。DataOps 解决复杂的问题,帮助日益多样化的技术和业务团队创建复杂的数据产品,从管道到仪表板或文档。了解更多。

你实际上是如何实现数据操作的?

今天,每个其他领域都有一个集中的实现功能。例如,销售运营和销售支持侧重于提高销售团队的生产率、加速时间和成功。DevOps 和开发人员生产力工程团队专注于改善软件团队之间的协作和开发人员的生产力。

为什么我们没有为数据团队提供类似的功能?DataOps 就是答案。下面是如何开始操作它。

确定最终消费者

DataOps 团队或职能部门帮助组织的其他部门从数据中获得价值,而不是执行数据项目。它专注于创建正确的工具、流程和文化,以帮助其他人在工作中取得成功。

数据运营的主要消费者。(图片由作者提供。)

创建专门的数据操作功能

当有专门的团队或职能部门支持时,DataOps 战略最为有效。该职能中有两个关键角色:

  • DataOps Enablement Lead :他们了解数据和用户,擅长跨团队协作和将人们聚集在一起。数据操作支持领导通常来自信息架构师、数据治理经理、图书馆学、数据战略家、数据传道者,甚至是外向的数据分析师和工程师。
  • **数据运营支持工程师:**他们是数据运营团队的自动化大脑。他们的主要优势是对数据以及数据如何在系统/团队之间流动的充分了解,在自动化方面扮演顾问和执行者的角色。他们通常是前开发人员、数据架构师、数据工程师和分析工程师。

WeWork 如何围绕两个关键角色构建他们的数据运营职能。(图片由作者提供。)

规划价值流,减少浪费,改善协作

在公司数据运营之旅的开始,数据运营主管可以使用 JBTD 框架来确定常见的数据“工作”或任务,也称为数据价值流。然后,通过精益,他们可以进行价值流映射练*,以识别和消除这些流程中浪费的时间和精力。

同时,来自敏捷的 Scrum 思想帮助数据团队理解如何更高效和有效地构建数据产品,而来自 DevOps 的想法展示了他们如何在这些数据产品上与组织的其余部分更好地协作。

数据团队可以从 DataOps 背后的四个动作中学到什么。(图片由作者提供。)

创建专用的数据运营策略和功能绝非易事。但是,如果您做得正确,DataOps 有潜力解决当今最大的一些数据挑战,节省整个组织的时间和资源,并增加您从数据中获得的价值。

在未来的博客中,我将根据我在世界各地的现代数据团队中看到的最佳实践,更深入地探讨“如何”实施数据运营战略——如何识别数据价值流,如何建立运输思维,如何创造更好的数据文化,等等。请继续关注,如果您有任何我应该回答的紧迫问题,请告诉我!

发现此内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学*建设的文章 【亚特兰】 在此订阅。

准备好了解有关实施数据运营的更多信息了吗?报名参加由来自 WeWork 的 Emily Lazio 举办的 五部分大师班 ,获得建立强大数据运营文化的可行路线图。

CDO 在数据网格世界中的角色

原文:https://towardsdatascience.com/the-role-of-the-cdo-in-the-data-mesh-world-f47af8ac7564

CDO 在数据网格世界中的角色

首席数据办公室及其组织的相关性在很大程度上取决于组织如何看待其数据。如果数据是流程和系统的“副产品”,那么 CDO 组织将只是另一个功能,它只是给真实业务的整体运行率增加了不必要的成本。如果组织将其数据视为其资产之一和“皇冠上的宝石”,就像其关键流程和应用程序一样,CDO 将在塑造数据文化方面发挥更加突出的作用。数据科学极大地挑战了 CDO 的传统角色,世界需要重新思考 CDO 在分析世界中的真正价值。

Zhamak Dehghani 的数据网格挑战组织对他们的数据进行不同的思考。像对待产品一样对待它,以支持分析和数据科学。可以利用数据网格从根本上重新思考 CDO 组织。传统的 CDO 可以通过两种方式处理数据网格。第一种观点认为网状网络是对现状的严重威胁——它会扰乱 CDO 和相关数据管理团队的正常运营。第二个观点是,网格是一个令人兴奋的机会,有可能从根本上改变组织中的数据叙事,因此是一个应该逐步探索的东西。两种观点都是对的。做得好的话,数据网格将极大地改变 CDO 的运营,但这应该是一种积极的颠覆,让 CDO 不仅保持相关性,而且实际上成为业务的一个更重要的部分,并成为将数据文化嵌入组织的真正领导者。

要了解 CDO 如何发展以支持数据网格,需要了解 CDO 如何随着时间的推移而发展。

CDO 觉醒

CDO 出现在企业中,帮助管理组织生成和使用的数据。它们的结构和它们扮演的角色通常反映了企业内部数据的逻辑组织方式。

一个相当典型的演变如下图所示:

作者图片

作者图片

进化阶梯上的第一个状态可以委婉地称为“分散的”。这实际上是蛮荒的西部,每个人都随心所欲,没有重复使用,没有共同的标准。此时,业务的各个部分负责他们自己的数据—本质上几乎都是事务性的。每个业务部门都以自己的方式存储和管理自己的数据—银行存款业务部门保存与客户存款相关的信息,投资业务部门保存与客户投资相关的信息,等等。这导致多个事务性数据池分散在整个组织中,并与职能业务部门保持一致。

在发生数据管理活动的地方,他们主要关注他们持有的交易数据的数据质量和完整性。数据标准是存在的,但是倾向于非常关注集成——定义内部和外部共享数据的文件格式。总的来说,很少或根本没有尝试在整个组织内协调数据活动的策略,数据在很大程度上被视为业务活动的“副产品”。

不足为奇的是,数据控制和使用在发生的地方都是局部优化的,几乎没有跨组织单位的协同作用。这种方法具有高度的灵活性,每个业务部门都可以自由地按照自己认为合适的方式操作和处理数据,但是在整个组织中有效地操作数据的宏伟目标却因此受到了影响。随着跨企业数据的价值开始变得明显,这很快成为一个问题。随着在整个组织中有效使用数据的需求增长,对某种形式的集中控制以帮助管理和协调数据活动的需求也在增长,这导致了 CDO 的诞生。

下一次进化与前一次截然相反。随着公司开始了解他们持有的数据的价值以及对其进行良好控制的重要性,他们开始关注技术和治理机制,以使这种情况更容易发生。正是在这个时候,我们看到了两个相互支持的发展的出现——数据仓库和 CDO / DMO。通过集中整个企业的数据并根据严格的治理控制来维护数据,数据仓库变得强大起来。到目前为止,组织已经确定数据是真正有价值的,因此 CDO 创建了许多机制来确保数据的最高质量。钟摆已经完全翻转,以前的蛮荒西部已经被一个像机器一样组织良好、中央管理的政府所取代——包括它的缺点。

在这一时期,CDO 的重点是确保数据被准确地复制到数据仓库,并且从源到目的地受到良好的治理。数据管理者和数据保管者成为与实施的大量数据管理/治理流程交织在一起的角色。

随着数据湖(另一种形式的中央存储库)的出现,各地的 CDO 只是扩大了他们的权限,并像以前一样继续运营。现在,数据进入了湖泊和仓库,但是数据在组织中流动的方式(通常是批处理驱动的)以及管理和控制数据的方式变化很小。

嗨,我是数据网格

随着我们离今天越来越*,对数据的期望也呈指数级增长——数量、丰富程度、需求和用例都大幅增加。在这些需求和先进的数据和技术思想的重压下,集中式模型开始出现问题,领导者开始定义一种不同的方式来看待这个问题。因此出现了数据网格。

Zhamak Dehgani 创建了一个基于域的范式来管理数据资产,以获得更好的分析结果,称为数据网格,它极大地影响了 CDO 建立的集中式结构。

总之,数据网格是一种联合架构,其中数据从逻辑域而不是从集中存储中获得。这些域提供它们负责的数据,消费者从一个或多个域中提取这些数据以满足他们的目的。这是一种数据生态系统,其中数据由最了解数据、最有能力确保数据质量的人提供给消费者。

这种新的架构风格对任何在通用集中模式下轻松运营的 CDO 都有影响。也许数据网格体系结构最基本的方面是数据的所有权和责任被联合到理解、创建和管理数据本身的业务领域——专家。试图遵循许多 CDO 支持的更传统的数据治理模式只会导致模糊的界限、灰色区域、差距和各方之间不必要的摩擦。

为数据网格支持的未来分析世界构建 CDO

下一代 CDO 必须适应新的企业数据模式。数据网格需要一个有效的 CDO 函数来达到最佳效果,但这个 CDO 必须是一个与之前几代非常不同的实体。以前主要关注数据管理,现在必须更加重视数据领先。领导力与管理是一个多年来一直让管理咨询公司和智库忙碌的话题,因此我不会详细讨论这个话题,但对我来说,这一切都源于 CDO 的积极主动和代理水平。

本质上,CDO 必须将联邦视角引入联邦架构。他们必须成为一个团队,确保这些域不仅仅是它们各个部分的总和,CDO 带来了一些附加值,使数据网格能够在比其他方式更高的水平上运行。从许多方面来说,这意味着 CDO 必须准备好做得更多,而不是更少,尽管事实上他们当前的一些职责将被纳入到域中(例如,域级数据质量、域级数据治理等)。

作者图片

成为推动数据议程向前发展的战略性变革思想家

这不再仅仅是确保每个数据资产都有必要的管理控制。相反,CDO 必须是大局观思想家,他们了解数据对组织的价值,并不懈地创新和鼓励使用企业数据来识别、实现甚至成为新的商业机会。

CDO 的团队成员必须真正具有战略头脑,对数据充满热情,并具备与商业领袖并肩工作、共同探索机遇所必需的庄重态度和沟通技巧。仅仅在某人的职位上加上“战略”是不够的!

成为推动者而不是实干家

CDO 必须认识到,他们的持续成功不在于他们做了什么,而在于他们让什么发生。在网状架构中,CDO 的角色是帮助领导域联盟。CDO 必须成为“秘方”,使各个领域在单独工作和协同工作时更加有效。

CDO 的定位应该是支持领域数据团队的活动——利用他们的专业知识和权威来帮助交付领域议程。但是他们也必须愿意让领域来领导这些活动,并扮演更多的支持和指导角色。如果需要的话,CDO 应该派遣教练到领域中去促进活动和鼓励新的想法,就像敏捷教练帮助组织适应敏捷的工作方式一样。

CDO 应该在跨域的互操作性方面领先——这就是为什么网状网络是一个联合架构,而不是纯粹的分散架构。CDO 应该积极引导领域协同工作,并引入轻量级标准、框架和其他工具,使它们更容易做到这一点。这可以通过标准定义小组正式完成,也可以通过同行团体非正式完成,但必须始终以务实的方式完成,不要扼杀创新。CDO 必须记住,当领域成功时,他们也成功了,而且企业数据现在拥有了共享所有权。

成为数据文化的冠军

CDO 职能部门必须承担的最重要的任务之一是在整个组织中倡导数据文化。很多时候,数据被认为是次要问题,是真实业务活动的副产品,而不是实际的资产或产品。因此,至关重要的是,由 CDO 来领导将“热爱数据”的文化植入组织中的工作,以激励团队生成更多更好的数据,利用数据做出更好的决策,并探索新的创新方法来从数据中创造价值。

由于数据网格的特殊结构,这种数据文化的创建实际上变得更加容易。在网格中,领域专家成为他们自己数据的管理者,而不是有一个负责所有数据的中央机构。从本质上说,这意味着企业中有多个团队每天都在处理数据,将数据视为一种产品,并根据需求进行创新和发展。在这样的模型中,这些领域数据团队将在进一步传播数据文化中发挥作用,并通过网格在自己的特定领域和相互关联的领域中充当倡导者。在许多方面,这类似于让影响者团队中的每一个都影响组织中的特定群体。因此,CDO 的角色是驾驭这些努力,提供方向,并成为新的、普遍的数据文化的典范。

实际了解数据

在建立 CDO 和 DMO 时,关注的焦点通常是与管理数据相关的机械流程的成功运行,并且倾向于招聘流程操作员或所有者,而不是真正了解数据的人。虽然这在以前可能是令人满意的,但重要的是,CDO 要配备理解数据及其带来的价值的人员,而不仅仅是知道如何管理多年来建立的各种治理流程。虽然流程仍然很重要,而且会一直如此,但人们会期望 CDO 是真正的数据专家——即使他们遵从专业领域的专业知识。

放眼企业之外

数据网格模型通过离散的逻辑域提供数据,为组织提供了从其拥有的数据资产中获取更大价值的绝佳机会。但是他们不持有的数据资产呢?这是一个强大的 CDO 能够脱颖而出的地方。有效的数据网格依赖于合并来自多个领域的数据,并找到构建复合价值的新方法。因此,它自然地有助于添加更多的领域数据源,这一次是来自外部数据源,因为治理结构、技术和工作方式已经基本就绪。这有可能进一步增加数据对企业的价值——通过向外扩展其自身的影响力,并成为更广泛的数据生态系统的一部分。

总之,CDO 必须从治理职能转变为支持分析和数据文化的职能。

作者图片

作者说明:

感谢您的阅读!

非常感谢您通读整篇文章——这是我关于数据网格对现有组织的影响的第二篇文章,我希望能写得更多。

如果您有任何问题/想法或想要分享任何建设性的批评,非常欢迎您通过 Nazia Shahrin 联系我。我的 LinkedIn:【https://www.linkedin.com/in/naziashahrin/】T2

参考资料:

德赫加尼,扎马克(2019 年 5 月 20 日)。如何从单一数据湖转移到分布式数据网格。martinFowler.com。https://Martin fowler . com/articles/data-monolith-to-mesh . html

简单解释了取样诺模图

原文:https://towardsdatascience.com/the-sampling-nomogram-simply-explained-241fef902a89

简单介绍一个实际的采矿应用程序和相关代码

抽样诺模图。作者图片

介绍

在颗粒材料中的元素浓度与采矿或环境应用等决策相关的行业中,从被考虑的体积或批次中提取个代表性样本至关重要。如果出现不良的取样做法,可能会做出错误的决定,因为通常只对一小部分批次进行取样。例如,采矿或环境应用中污染物浓度高/低的地区的矿石/废物限制可能被错误地定义。

下图举例说明了从一批 400 千克的岩石中取出 50 克的最终样品,为了确保 50 克代表 400 千克,需要遵循广泛接受的 Gy 的采样理论的适当破碎和二次采样策略。

示意图显示了一个 400 kg 的批次,从该批次中提取代表性子样本并粉碎以表征该批次。作者图片

商业软件可以帮助用户,如矿工和环境科学家,根据 Gy 的取样理论构建取样诺模图。采样诺模图用于通知采样决策或操作,但是这个软件可能昂贵抽象重要细节在后端运行。Gy 的采样诺模图实际上非常简单,可以用 Python 中的很容易地****构造。只要做一点工作,黑匣子就可以被揭示出来,从而允许对后端正在做的事情进行更好的解释。****

这里用实际采矿应用代码简单介绍Gy 的取样理论,以构建和解释取样诺模图。

基本误差的相对方差

Gy 的抽样理论[1]定义的基本误差是假设抽样实践完美的最小抽样误差。它是对相对方差的一种度量,通常从中取平方根以获得相对标准差,类似于变异系数。相对标准偏差通常以百分比表示,然后可用于确定理论采样精度对于当前应用是否足够好。

基本误差方程由六个独特的因素组成,如下所示并简要描述。

基本误差的相对方差方程。作者图片

人们提出了各种方法来量化每个变量。下面是对每一个变量的简要说明,但是量化变量的最佳方法取决于手边的应用。

标称粒度,d

标称颗粒尺寸*似于样品中最大颗粒的尺寸,单位为厘米。一个常见的定义是 95%通过粒度,即 95%的样品质量将通过的粒度。通常情况下,该值是通过检查估算的,但需要非常仔细地选择,最好使用颗粒筛分试验,因为它对基本误差有立方效应。

样品质量,毫秒

以克为单位测量的样品质量。增加样品质量将减少基本误差,因为代表了更大比例的批次。当采样方法在操作上受到限制时,基本误差方程常常被重新安排,以求解某个可接受误差所需的样本质量。

矿物学因素 c

也称为成分因素,矿物学因素描述了当感兴趣的材料完全从脉石材料中释放出来时达到的最大不均匀性。矿物学因素以 g/cm 的密度单位进行测量,并可使用以下公式进行估算。****

矿物学因素方程。作者图片

其中,aL 为无单位小数比例,λm 为含有分析物的颗粒密度,λg 为脉石密度。

解放因子,l

已经提出了许多不同的公式来量化释放系数,这是对矿物系数假设的修正。本质上,随着材料变得更加不均匀,释放因子越来越接* 1 ,此时感兴趣的分析物将与脉石材料完全分离。在下端的 0.05 处,材料将非常均匀,并且脉石和分析物共存于同一颗粒上

Gy 提出,释放因子可以通过感兴趣的分析物的释放直径除以颗粒直径的平方根来估算。

形状因子 f

形状因子也称为立方系数,是一个无量纲值,表示颗粒形状与立方体形状的匹配程度。更接*立方体形状的颗粒的 f=1,更接*球形的颗粒的 f=0.5,更接*片状材料的颗粒的 f=0.1。形状因子也可以通过将颗粒的体积除以其直径的立方来计算。

对于由多种形状颗粒组成的样品,最佳做法是使用目标分析物的平均形状因子。

粒度因子,g

也被称为粒度分布因子,这个无量纲变量考虑了变化的粒度,用于估计基本误差。估计该参数的常用方法是使用下面的离散表,其中描述了 Gy (1998) [2]提出的粒度系数的不同值:

  • g = 0.25:无差别、未分级的材料(大多数土壤)。
  • g = 0.40:材料通过筛网。
  • g = 0.50:筛网保留的材料。
  • g = 0.60–0.75:两个筛网之间的材料尺寸。
  • g = 0.75:自然大小的材料,如谷物颗粒、某些沙子。
  • g = 1.0:统一尺寸(例如,滚珠轴承)。

实际采矿应用

假设我们在 2D 有一个 8x 4 单元的场地,其椭圆形区域为高铜等级,如下图所示。铜品位升高的区域将是我们想要代表性地取样并获得品位的批次。下面显示的流程图说明了抽样策略,即从批次范围内随机抽取 10 个 40 千克的样品,总样品质量为 400 千克。然后,400 千克的样品经过两个阶段的压碎或粉碎,并使用旋转或 riffle 分裂器等工具进行二次取样,最终获得 0.5 千克的样品,该样品被送往实验室进行化验,以确定等级。

2D 的一个 8 乘 4 单位的场地,有一个高铜品位的椭圆形区域和显示取样策略的流程图。作者图片

我们将使用 Gy 的抽样理论,通过达到不确定性或相对标准偏差< 5% 来测试抽样是否具有代表性。

理论采样精度结果

使用一些假设的输入,下面的诺谟图是使用 github 上的 脚本中的matplotlib 输出的。下面的诺模图中标注的主要步骤也在此简要描述:

  • A 到 B 将 400 千克样品从 10 英寸到 1 英寸的公称尺寸进行初步破碎
  • B 至 C 在 1 英寸处对 400 千克至 20 千克进行二次取样
  • C 到 D 对 20 千克样品进行二次粉碎,从公称尺寸 1 英寸到 0.25 英寸
  • D 至 E 对 20 千克至 0.5 千克的样品进行二次取样,然后送至实验室进行化验
  • E 至 F 最终 0.5 千克样品的粉碎和化验准备

标有不同点的取样诺模图显示了 400 千克样品(标称粒径为 10 英寸)到 0.5 千克最终样品(标称粒径为 0.03 英寸)的反复破碎和二次取样。作者图片

下面显示的是总基本误差的计算结果,它是通过对二次采样的每个阶段(本例中为 B 至 C 和 D 至 E)的相对方差求和得到的。

通过对 BC 和 DE 的每个子采样阶段的相对方差求和,对总相对标准差进行假设和计算。作者图片

得到的相对标准偏差为 4.8% ,低于 5%的目标

使用 Python 代替商业软件的优势

****用现成的软件包也可以达到同样的效果。然而,了解细节并用 Python 代码进行测试可以让从业者轻松模拟不同的场景。例如,假设本例中的目标是 3%的相对标准偏差。从业者可以测试不同的较高样品质量或较小的标称颗粒尺寸,以获得较低的基本误差。或者,如果相对标准偏差目标是更灵活的 10%,则可以测试不同的场景,以确定哪个场景可以最小化所需的采样资源。

结论

对 Gy 取样理论的扎实理解对于确保代表性样品取自正在考虑的体积或批次非常重要。确定量化 Gy 基本误差的因素具有足够的挑战性,但是采样诺模图的实际构造和基本误差的计算实际上非常简单,可以用 Python 来完成。当简单的开源选项可用时,我们不应该总是依赖昂贵的软件和黑盒解决方案。

平衡理论和实践知识

理论方法,如 Gy 的采样理论,对于在现场做出决策非常有用,但是考虑可能存在的操作困难或限制也很重要。同样,如果程序没有理论上的考虑,纯粹基于操作简易性的决策可能导致错误的结果。最终,在实际 知识 之间需要平衡***,以便可以实现最优结果,该最优结果可能不是最佳的理论解决方案或最容易实现的解决方案,但是在给定可用资源和约束的情况下将提供最佳解决方案。***********

下图粗略说明了在平衡理论知识和基于实际操作的经验时如何实现最佳生产率。要么过分纠结于每一个微小的理论细节,要么只做最实际的事情,这都会导致次优的生产率。****

图解说明当生产时间与改进程序和生产效率所花费的时间和资源之间达到适当平衡时的最佳生产效率。作者图片

在我们对高铜品位批次进行取样的例子中,理论上的解决方案可能是多取样十倍,并将所有材料粉碎至 0.1 英寸,这在操作上变得具有挑战性,如果没有所需的设备,这可能是不可能的。类似地,仅仅抓取一块 1 公斤的石头很可能会给出不正确的结果,但是在实践中很容易做到。因此,需要两个之间的平衡来实现最佳结果。****

参考

[1]戈瑞,下午,1976 年。颗粒材料的取样——一般理论。里面的 j .迈纳。过程。, 3: 289–312.

[2] Gy,1998 年下午。用于分析目的的取样。英国奇切斯特威利。

做出好的决定:艺术,科学,还是两者兼而有之?

原文:https://towardsdatascience.com/the-science-and-art-of-making-good-decisions-31e7ae2195d3

作者聚焦

Cassie Kozyrkov,谷歌云的首席决策科学家,关于选择正确的职业道路和数据分析的价值

在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 凯西·科济尔科夫 分享我们的对话。

照片由凯西·科济尔科夫提供

作为谷歌云的首席决策科学家,Cassie 在决策过程、人工智能战略和建立数据驱动的组织方面为领导团队提供建议。她是将决策智能实践引入谷歌的创新者,亲自培训了 20,000 多名谷歌员工。在加入谷歌之前,Cassie 是一名数据科学家和顾问。她拥有数理统计、经济学、心理学和神经科学学位。你可以在这里 探索她热门的机器学*视频课程

重要的事情先来:首席决策科学家做什么——这个角色与首席信息官或数据科学主管的角色有什么不同?

好的决策是将信息转化为更好的行动的行为。随着数据科学的兴起,我们看到现代世界中可用的信息越来越复杂,并且以电子形式被捕获、存储和处理。换句话说,数据正在成为改善决策的改变游戏规则的机会。我甚至可以说,20 世纪教育决策专家定性决策技能而不培养他们的数据科学技能的模式不太可能经得起时间的考验。

虽然将数据科学定位为有效决策的现代必备工具似乎很简单,但反过来也有同样重要的需求:熟练的决策是有效数据科学的必备工具。信息越复杂,决定如何决定就需要越多的技术力量。换句话说,好的数据驱动决策是将数据转化为更好行动的行为。谁来决定“更好”应该意味着什么?哪些行动摆在桌面上,为什么?哪些信息与决策相关——为什么我们要权衡这个特定的决策集而不是另一个?首先什么是值得做的,需要什么信息来改变我们的想法?这些问题是成功的数据科学的先决条件,但它们完全属于单独角色的范围。这个角色经常被微妙地忽略,导致统计学家所谓的第三类错误:使用所有正确的数学和技术来解决错误的问题。

在我看来,一个组织对这个问题可能做出的三种反应中,有两种是非常脆弱的策略。一种方法——不幸的是,这是传统的方法——是完全忽略这个问题,希望团队中有人偶然发现他们内心的决策专家。不幸的是,专业技能需要训练、经验和有意的实践。因此,你在数据科学上的投资极有可能管理不善,从而损害你的业务或你雇佣的数据专业人士的职业生涯。另一种方法是要求每个拥有决策权的利益相关者同时是经过多年培训的专家决策者。这是一个很高的要求,使它成为另一个脆弱的组织战略。

第三个选择是与决策科学家合作。这包括对团队中所代表的决策技能进行清醒的盘点,如果需要更多的专业知识,让决策科学职能部门与决策者一起工作,补充他们而不是取代他们。决策科学家有助于确保数据科学是有效的,并应用于最有价值的问题,他们还能够对不涉及数据的决策提供帮助和建议。作为个人贡献者,他们提高队友决策和数据项目的质量。作为领导者,他们的角色是提升组织的卓越决策水平。

在谷歌之前,你做了很多年的顾问。在科技巨头工作的转变如何改变了你对数据科学作为一门学科的看法?

当我作为数据科学顾问工作时,我的大多数客户都没有多少内部数据科学专业知识。我想不出我当时帮助过的团队中有超过五名数据专业人员,所以我可能形成的关于数据科学组织如何在不同专业人员安排下运作的任何理论都只是理论。如果在那次经历后,我不得不从头开始建立一个大型组织,我会在蹒跚前行时完全虚构出来,就像我的许多同行在数据科学早期被迫做的那样。即使那样,我也只会看到一种没有反事实的策略的结果。

我可以滔滔不绝地讲述加入谷歌对我来说是一次不可思议的学*经历,所以我只关注这一点:我有机会观察并最终提出建议的各种数据项目和团队具有变革性。它让我更好地了解了什么可行,什么不可行,它教会我缩小视野,看到数据科学作为一门学科的更大图景。但是,最重要的是,它给了我一个新的视角,随着我们学*跨角色和领域更有效地协作,我们的领域可能会发生什么。

许多入门级的数据专业人士想知道他们是否应该以自由职业者的身份开始自己的职业生涯,加入一家小型创业公司,或者瞄准一家 FAANG 大小的公司。他们应该问自己什么样的问题才能做出正确的决定?

我建议他们首先问自己为什么想成为数据专家,他们希望在职业生涯中实现什么,以确保他们进入自己喜欢并感到满足的工作。

我还会鼓励他们思考自己是喜欢做专家还是多面手,以及哪种数据职业最符合他们的个性。说到 TDS 和选择数据科学专业,我会向入门级人士推荐几年前我为您写的文章。在不同规模的组织中,每个专业化都面临着不同的挑战。例如,在一个较小的组织中作为一名纯粹的统计人员工作,通常会比在一个较大的公司中做更大的自我宣传负担。

我还鼓励他们在权衡每种组织类型的利弊时考虑其他一些事情:

  • 基础设施。公司越大,让你的工具工作就越有可能是别人的工作(这样你就可以花更少的时间与基础设施作战,而花更多的时间处理实际数据)。如果你是一名自由职业者,你将与客户的基础设施打交道(或者缺乏基础设施),所以如果你选择与许多不同的中小型客户合作,你与基础设施的之战可能会成为传奇。
  • 决策者的素质。作为一名数据科学专业人员,你的影响力很容易受到你所服务的决策者的素质的影响。大型组织最大的优点是多样性:如果你被允许在项目和团队之间转移,你将有更多的机会被决策者所吸引,这些决策者为你创造了最佳工作条件。同样,自由职业者也学会寻找那些能为有效合作带来合适技能的客户。启动设置风险更大;如果你已经签约成为一位杰出决策者的数据专家,生活会很美好,但如果除了你的招聘经理没有人可以一起工作,而事实证明你误判了这个人充分利用你为他们创造的见解和模型的能力,那么在不辞职的情况下做出一个优雅的转变将会很棘手。另一方面,当身边合格的人越来越少时,往往更容易进入你是决策者的角色。如果你对此感兴趣,尽管有风险,启动设置可能很适合你。
  • 学*机会。你最有可能在大公司得到工作上的帮助,所以你可能会在那里更有效地发展你的技能,而在一家初创公司,你必须自己解决所有问题。关于自由职业的一个警告:虽然全职雇主通常很乐意投资你在工作中学*,因为他们希望你留下来,但作为一名自由职业者,你可能会发现你的客户坚持让你用自己的时间学*。
  • 访问数据。作为一名自由职业者,你将有机会筛选你的客户,拒绝没有数据和/或没有数据工程的工作(或者你会自愿接受一些有偿的数据设计工作,这很重要也很有价值),而如果你已经签约成为一个在获取数据方面有困难的组织的全职员工,你将面临无法产生影响的危险,同时还会被问到:“你最*为我们做了什么?”这是一个艰难的职业生涯,所以在开始之前,请确保检查有数据可供您应用数据科学。如果你作为早期员工加入一家初创公司,很有可能你不会被要求在同事搜寻数据时袖手旁观,而是被要求照顾数据项目生命周期中的每一步,包括数据设计、收集、数据工程,甚至与供应商谈判。有些人觉得挑战充满活力,而有些人则逃避,所以由你来决定什么最适合你。

您最*写了几篇文章,消除了关于数据分析师工作的常见误解。你认为所有这些误解来自哪里——为什么消除它们对你很重要?

正如我关于分析的第一篇文章的标题所示,我确实相信分析师是数据科学中最被误解的英雄。他们的工作非常有价值,但如果他们想在职业生涯中取得进展,他们经常被告知要学*统计学或机器学*。这是对潜力的悲剧性浪费——这对单个分析师来说是痛苦的,对组织来说会导致更糟糕的结果。

我怀疑分析师被低估的部分原因是,分析就像写作职业:基础知识很容易入门,是一门艺术,所以几乎没有进入门槛,任何人都可以自称为“作家”。标题中没有质量保证。然而,几乎不识字很难让你成为托尼·莫里森或加布里埃尔·加西亚·马尔克斯——最好的作家离初学者只有几光年远,他们改变了世界。

分析也是如此。这个行业的差异是巨大的。另一方面,比如说,统计学的准入门槛更高,所以最低级别的人比最低级别的分析师更令人印象深刻,但也有更窄的技能范围。处于行业顶端的分析师是一些最令人印象深刻的技术专业人士,但不幸的是,太多的雇主将所有分析师归为一类,低估了他们,错过了最有可能帮助他们识别威胁和机遇的英雄,而他们仍然有时间通过他们制定一个好的路线。

除了最*的这个系列,你多年来一直是一个多产的公众演说家和作家,包括在 TDS。你的那部分工作是否与你的正式角色相关,或者反馈给你的正式角色?

我的许多文章都源于学生、观众、同事和朋友向我提出的引人注目的问题。有时候,这些问题会在我的脑海中萦绕,直到我找到了正确的类比,然后我发现自己像一个盒子里的杰克一样在午夜从床上冲起来,在我忘记之前把它写下来。随着时间的推移,这些笔记越来越多,我写得越多,写作的过程就变得越愉快,所以我觉得我的许多文章都是自己写的。

另外,每次有人告诉我他们从我这里学到了一些有用的东西,我的脚步变得更有弹性了,这确实很有帮助。而且,在你和我之间,许多这样的问题会一遍又一遍地出现,所以我非常确定,从长远来看,我可以发送一个包含我的答案的链接来节省时间,而不是每次都开始独白。

要了解更多关于凯西的工作,了解她最新的文章和视频,请在媒体,在推特,在 YouTube 上关注她。为了探索她在 TDS 上的众多优秀贡献,这里有一个小样本的亮点:

  • 决策智能简介(2019 年 8 月,14 分钟)
  • 业余分析师和专业分析师的 10 个区别(2022 年 6 月,8 分钟)
  • 统计学:你是贝叶斯主义者还是频率主义者?(2021 年 6 月 6 分)
  • 统计要点列表:毫不客气的统计学家行话指南(2022 年 2 月,22 分钟)
  • 数据科学中最强大的思想(2019 年 8 月,8 分钟)
  • 分析卓越全在于速度(2022 年 5 月,6 分钟)

想和广大观众分享一些你自己的作品吗?我们希望听到您的意见。

这个问题&是为了长度和清晰度而稍加编辑的。

AlphaGo 和 AlphaGo Zero 背后的科学

原文:https://towardsdatascience.com/the-science-behind-alphago-and-alphago-zero-44aeef000448

概念性的友好解释

陈泰铭在 Unsplash 上拍照

背景

在我观看由谷歌研究实验室 DeepMind 开发的围棋计算机程序 AlphaGo 上的纪录片之前,我不知道在 AlphaGo 之前,计算机程序还无法在专业水平上与人类棋手竞争。我天真地认为,计算机程序能够从游戏的特定状态简单地模拟每一个可能的移动序列(“穷举搜索”),并选择具有最佳结果的移动。事实证明,由于可能的场景数量惊人,这甚至对于计算机也是不可行的。

这部纪录片只是简单地触及了 AlphaGo 背后的科学,我被这部纪录片迷住了,于是我转向 DeepMind 发表的研究论文,以了解用于开发 AlphaGo(以及 AlphaGo Zero,一个性能更好的 AlphaGo 版本)的机器学*技术。研究论文写得很好,但对于没有深度强化学*和蒙特卡罗树搜索知识的人来说,可能有点太专业了。尽管如此,这不应该阻止任何人抓住这些论文介绍的有趣概念和观察结果,因为人们普遍认为 AlphaGo 和 AlphaGo Zero 代表了开创性的机器学*应用。

写这篇文章的目的是用一种语言来解释 AlphaGo 和 AlphaGo Zero 背后的科学,这种语言让那些有兴趣了解他们如何在超人的水平上学会玩围棋的人理解,但可能会被强化学*或蒙特卡洛树搜索等术语所阻止。

简单的游戏规则,复杂的游戏方式

围棋的规则相对简单。游戏在棋盘上 19×19 的格子上进行,两名围棋手轮流在格子的交叉点上放置石头。如果被对手的石头包围,玩家的石头可以被捕获并从棋盘上移走。玩家的最终目标是用他们的石头在游戏板上包围尽可能多的区域。

然而,给定简单的规则,人类多年来已经发展出复杂的策略,以有效地走在周围的领土上。人类做出判断,例如评估现在形成坚固的领土和形成有助于在游戏后期建立影响力以获得领土的石头图案之间的权衡,识别连接不同石头组并防止它们被捕获的方法,等等。

从数学上来说,这个可能的移动序列(“搜索空间”)的数量大约是 250 ⁵⁰.这是因为为了决定一场围棋比赛的获胜者,棋手之间要进行大约 150 轮比赛,在给定的一轮中,每一步平均有大约 250 个合法位置。根据下面的 Python 代码,该数字有 360 位。

print(len(str(250**150)))

问题陈述实际上可以归结为寻找缩小搜索空间的方法,DeepMind 通过以下方式实现了这一点:

  • 训练一个策略来指导从游戏的当前状态中值得探索的移动顺序。这减少了(250)个合法移动的搜索空间。
  • 通过给定的棋盘位置训练游戏获胜者的预测器。这减少了(150)轮次的搜索空间。

政策

如前所述,需要一个策略来指导计算机程序搜索值得探索的移动序列,以便它最大程度地模拟这些序列中的游戏。对于 AlphaGo 来说,这一策略是通过观察职业选手如何基于来自 KGS Go 服务器的 3000 万场比赛来训练的。本质上,这个策略(“策略 A”)允许 AlphaGo 模仿人类职业比赛。

策略 A 的输出是合理移动的概率分布。为了用一个简单的例子来解释这一点,假设我们正在用下面游戏棋盘中的白石头进行下一步棋,策略 A 可能建议两种可能的棋,棋 1 和棋 2,概率分别为 60%和 40%。60%和 40%将基于人类职业游戏的历史,由此给定游戏的当前状态(即,具有一个黑石的棋盘),人类职业玩家在 100 次中已经移动 1 60 次(并且在 100 次中移动 2 40 次)。

图 1:策略网络演示。作者图片

然而,凭直觉,即使是职业棋手的模仿,也不一定能让计算机程序在围棋比赛中胜出。然后,策略 A 通过的自我游戏进行精炼,由策略 A 指导的两个计算机程序(最初)相互对抗,直到确定赢家。策略 A 将被更新以反映这个博弈的结果,成为策略 A 的更好版本。

有人可能会问,这如何提高政策的绩效。使用与上面相同的例子,计算机程序 A 可以选择进行移动 1,而计算机程序 B 可以选择相同的移动,或者选择探索移动 2,因为策略 A 最初应该引导计算机程序进行 100 次移动 1 60 次和 100 次移动 2 40 次。随着这种情况在游戏的每个回合都发生,可以证明移动 2(或者更一般地,在策略 A 下不一定达到最高概率的移动)将最终导致计算机程序 B 获胜,在这种情况下,两个移动的概率可以被更新。在这种情况下,在给定游戏结果的情况下,进行移动 1 的 60%概率减少,同时进行移动 2 的 40%概率增加。同样的过程在数百万次自我游戏中反复重复,直到形成接*最优的策略 B。理论上,策略 B 分配给一步棋的“学*”概率越高,这步棋导致的博弈结果就越好。

退一步说,我观察到,自我对弈隐含地奖励了人类职业棋手的发现,这在一定程度上促成了 AlphaGo 的成功。

预测器

预测器输出单个值,指示在给定游戏状态(即当前棋盘位置)的情况下玩家获胜的可能性。

用于训练预测器的数据通过自玩再次收集,这一次是在两个计算机程序之间,这两个程序都由策略 b 指导。在自玩的特定游戏中,收集许多棋盘位置和游戏结果(即,赢或输)。通过足够多的自玩游戏,预测器可以被训练为以良好的准确性告知在特定棋盘位置的玩家赢得游戏的概率。也就是说,它告知游戏的当前状态(和后续状态)对玩家进行下一步棋有多有利。

走一步棋——alpha go

概括地说,到目前为止,我们已经培训了以下内容:

  • 基于人类职业游戏的最佳策略
  • 策略 B,它根据策略 A 发起的自我游戏来通知最佳移动
  • 预测器,根据游戏的当前状态通知玩家获胜的可能性

为了选择下一步棋,AlphaGo 从游戏的当前状态开始执行 N 次模拟。简单介绍一下模拟,在我的工作中,模拟不仅有助于理解特定事件的平均结果(例如,平均索赔成本),而且有助于理解可能结果的范围(例如,每 200 年发生一次的不利索赔事件的成本,可以从 200 次模拟中返回最高索赔金额的模拟中获得)。在围棋中,模拟的走法序列假设你和你的对手会选择最佳走法,直到游戏结束。此外,模拟增加了选择一系列移动的随机性,这一点很重要,因为我们确实想探索可能没有被策略看到或引导的移动。

对于 AlphaGo 来说,在一个特定的模拟中 *n,*要模拟的走法顺序主要由以下几个因素控制:

  1. 特定序列被访问的次数
  2. 之前在特定动作序列中获胜的经验

我将用一个简单的例子来解释这两个要点。让我们假设在之前的模拟 n -1 中,在策略的指导下,选择了第一步之后是第四步的顺序(由下图中的蓝色实心箭头表示),并且基于第四步的游戏状态,预测器通知获胜。也就是说,这个特殊的模拟序列导致了胜利。

图 2:移动选择演示。作者图片

对于当前的模拟,AlphaGo 识别出已经访问了移动 1 之后是移动 4 的序列,然后它将驱动模拟更可能采用以前没有访问过的其他序列,例如移动 2,或者移动 1 之后是移动 3。这样做是为了鼓励探索。

另外,由于移动 1 后跟随移动 4 的顺序导致了上一次模拟中的胜利,它也将驱动模拟在当前模拟中采用这一特定顺序(反之亦然,即失败)。这有时被称为剥削

我想强调一下上面提到的一些有趣的结果:

  • 在游戏开始时,当 a 玩家有更多的选择来放置下一颗石头时,AlphaGo 鼓励搜索人员探索,因为先前的获胜经验是不确定的,因为即使在政策的指导下,下一步最好的棋也有很大的搜索空间。
  • 相比之下,当棋盘上合理地填满了石头时,来自策略或预测者的先前获胜经验会变得更有影响力,因为 AlphaGo 会推动一系列移动,从而导致最有可能获胜的状态或棋盘位置。这个利用了以前从人类专业人员以及自我游戏中获得的经验。
  • 我觉得有趣的是,模拟中的探索通常是由策略 A 而不是策略 B 指导的,因为人类的智能被认为是更加多样化的,机器无法完全学*。AlphaGo 策略 B 的主要用途是训练预测器。

在进行了 N 次模拟后,AlpohaGo 选择了访问次数最多的移动顺序(尽管只有第一个顺序是相关的)。默认情况下,这应该是在勘探和开发之间取得正确平衡的举措。

开始行动——alpha go Zero

简而言之,AlphaGo Zero 是 AlphaGo 的更好版本,“Zero”强调了与人类专业游戏的解耦。

虽然 AlphaGo Zero 的整体(训练)结构在很大程度上与 AlphaGo 一致,但它们的主要区别在于:

  1. AlphaGo Zero 的策略和预测器完全是靠自弹自演训练出来的。也就是说,在训练 AlphaGo Zero 时没有使用人类输入,如人类专业游戏。
  2. AlphaGo 架构使用了许多“手工制作”的功能。例子是空的相邻点的数量和捕获的石头的数量。这些在 AlphaGo Zero 中被删除,它只使用原始棋盘位置作为输入。
  3. Alpha Go Zero 结合了大部分策略和预测模型。也就是说,他们是一起受训的。
  4. 在 AlphaGo Zero 下训练的预测器进一步减少了模拟中的回合数。这在一定程度上加快了 AlphaGo Zero 的训练速度。

总的来说,AlphaGo Zero 是机器学*更通用的应用,相比 AlphaGo 结构更简单,人机交互更少。DeepMind 认识到,人类在围棋游戏中的知识可以通过单独的自我游戏和随机策略发起的来学*(并超越)。事实上,AlphaGo Zero 仅用了 40 个小时的训练就超过了 AlphaGo 的表现。

我发现这很有趣,但同时也很直观。让我们假设总有一个最优策略来引导玩家稳赢。给定我们的当前策略(很可能是一个随机的表现不佳的策略),通过自我游戏的迭代,随着时间的推移,当前策略应该逐渐收敛到最优策略。

用另一个简单的例子来说明,在下图所示的博弈状态中,我们假设最优策略的概率分布为(100%,0%),也就是说,采取行动 1 肯定会赢。另外,为了简单起见,我们假设游戏从当前状态一步结束。为了了解最优策略,如果我们通过自玩游戏的互动,分别从移动 1 和移动 2 的随机策略(50%,50%)开始,随机策略将总是收敛到最优策略,因为在每次自玩游戏中,策略将随着移动 1 的进行而更新以增加移动 1 的概率,反之亦然。

在 AlphaGo 下,我们以上面的(50%,50%)开始自玩的随机策略可能更接*策略 A 下的最优策略(例如(90%,10%)),因为它是基于人类职业游戏形成的。然而,AlphaGo Zero 证明了无论我们如何启动策略,机器总是可以通过与先前版本的策略进行博弈来学*迭代地改进策略,并最终找到接*最优策略的代理。

图 3:自学演示。作者图片

人类直觉的学*

正如 DeepMind 的研究论文所示,在 AlphaGo Zero 接受训练时,它学会了玩一些“普通角球序列”,这些策略是由人类开发并经常玩的,而不需要像 AlphaGo 一样“观察”人类专业人士如何玩。令人着迷的是,在这些策略被发现后的几个小时内,一些策略被忽略了,因为它发现了新的和据称更好的变化。

此外,在训练的早期,AlphaGo Zero 像人类初学者一样,专注于尝试立即捕捉对手的石头。这与展示更平衡的策略和随着自我游戏的继续掌握游戏的基本原理相比。

摘要

在这篇文章中,我用一些简单的例子解释了 AlphaGo 和 AlphaGo Zero 是如何被训练来选择最佳走法的。在高水平上,AlphaGo 和 AlphaGo Zero 通过有效地减少下一个最佳步骤的搜索空间的呼吸和深度,成功地实现了超人的性能。

关于 AlphaGo 和 AlphaGo Zero 的运行方式,有许多发人深省的观察,我想再次强调一下:

  • 尽管 AlphaGo Zero 并不依赖人类知识(即策略 A,尽管策略 B),但人类知识在 AlphaGo 搜索下一步最佳棋时具有更大的影响力,因为人类往往会选择“一系列不同的有前途的棋步”,尤其是在游戏的早期阶段,玩家往往会探索更多。
  • Alpha Go 和 AlphaGo Zero 背后的走法选择是由一个政策引导的,但同时鼓励违背政策建议的探索。在哲学层面上,它告诉我们,有时我们不应该害怕选择让我们走出舒适区的道路,这可能会更有回报。
  • 模拟或采样一系列动作有助于形成最佳策略。这与随机森林算法优于单个决策树的优势没有什么不同。你永远不知道在未知的道路上会发现什么!

以下是我从上述观察中得到的一些自我反思。

完美与实用

想象一下,我们确实有一个计算机程序,它可以进行彻底的搜索,寻找最佳的走法,并在每个回合都打出完美的走法。这有必要吗?

在许多商业应用中,某些任务达到 100%准确率的边际收益(相比之下,比如说 95%的准确率)可能不会超过收益递减的成本。例如,训练一个 0.05 或 5%精度改进的模型可能需要 10 倍的时间。另一个例子是,在职业锦标赛中,以 4 比 1 或 5 比 0 击败 Lee Sedol 是否有助于决定获胜者。

指导与说明

执行某项任务的政策或指令可能是一把双刃剑,在某种意义上,它为用户提供了指导,也带来了限制。AlphaGo Zero 通过删除先前被认为对训练 AlphaGo 有价值的人类知识,实现了更好的性能,这证明了这一点。

作为人事经理,我有时会根据自己的经验对完成任务的最佳方式有一个主观的看法,并倾向于根据这一看法向我的直接下属提供和执行这样的指示。指令可能更受过程驱动,而 AlphaGo 和 AlphaGo Zero 的成功告诉我,通过关注最终目标(或机器学*语言中的奖励)来领导更有效,允许人们“搜索”并学*完成任务的最佳方式。

勘探与开采

AlphaGo 和 AlphaGo Zero 背后的科学让我想起了生活中发生的事情。难道我们不都倾向于探索以获得经验,然后利用这些经验来做决定吗?

最后,对于有兴趣深入了解 AlphaGo 和 AlphaGo Zero 技术方面的读者,我推荐阅读这篇文章。

参考

[1] Silver,d .,Huang,a .,C. 用深度神经网络和树搜索掌握围棋博弈。自然 **529,**484–489(2016),https://storage . Google APIs . com/deepmindmaedia/alpha go/alpha gonaturepaper . pdf,2022 年 1 月 25 日获取

[2] Silver,d .,Schrittwieser,j .,Simonyan,K. 掌握无人类知识的围棋博弈。自然 **550,**354–359(2017)。https://doi.org/10.1038/nature24270,2022 年 1 月 26 日访问

精通量子计算的秘密成分

原文:https://towardsdatascience.com/the-secret-ingredient-to-quantum-computing-mastery-ca3bf1e1e28b

这不是数学或物理

量子机器学*要不要入门?看看 动手量子机器学*用 Python

精通量子计算的秘密成分不是物理学学位——当然,除非你想开发硬件。

但如果你想用量子计算解决任何经典计算机都无法解决的问题,你不需要成为物理学家。有当然好,但不是强制的。

当然,量子计算建立在只有一群卓越的物理学家理解的亚原子奇怪现象之上。但是一个人怎么可能使用他不了解的技术呢?

我不知道你怎么样,但我每天都这样。我不知道微波炉是如何工作的。

太大胆了!这是一个消费设备,“你说呢?

很公平。经典电脑怎么样?

我以编写经典计算机程序为生。我开发代码来解决实际问题。所以,我会说我在日常生活之外使用电脑。

作者图片

然而,我不太了解计算机的物理工作原理。我也不是电气工程方面的专家。承认,这些年我积累了一点知识。但是这对我的日常工作一点帮助都没有。

高深的数学能力也不是精通量子计算的秘密因素。

当你开始你的量子计算之旅时,你将不可避免地面对大量的数学。令人生畏。有些作者把数学公式扔给你,却懒得解释它们。

这些和埃及象形文字一样好。

作者图片

我不厌其烦地研究了好几个这样的公式。令人清醒。理解大多数公式在用量子计算解决问题时没有实际用途。

当然,通过一个公式来练*可以培养对基本概念的理解。但这并不是因为数学的精确性。这是因为你集中处理了这个主题。

如果你真的对量子计算感兴趣,你会*惯数学符号。你会放下敬畏。最后,你把一个等式当成一个单词。

例如,以这个等式为例。它描述了量子叠加。我在这篇文章中解释了这个等式。

如果你在这个领域花了一段时间,你甚至不会再经历这个等式的各个部分。相反,你认识到它是“量子叠加”以及它所包含的一切。做数学家可能会加快一点速度,但不是决定性的。

最后,计算机科学也不是掌握量子计算的秘密成分。这张真的很疼我!但这是真的。

作为一名计算机科学家,你知道如何利用技术解决问题。你可以运用逻辑推理。你知道如何写代码。

这些都是你需要具备的必备能力。然而,用数学术语来说,这些是充分条件,但不是必要条件。

换句话说,一旦你掌握了量子计算,你就会拥有这些能力。但这些能力并不一定意味着你会掌握量子计算。

**精通量子计算的秘密成分是领域知识。**这是对特定业务领域基本方面的理解。

如果你想用量子计算解决一个问题,你需要对问题有深刻的理解。

量子计算机不是更快或更大的经典计算机。相比之下,它很慢(就时钟速度而言),很小(就量子位而言)。量子计算机从以一种完全不同的方式解决问题的能力中获得能量。

要真正掌握量子计算,你需要理解这种不同的方式如何映射到你要解决的问题。

你不能把量子算法扔给一个问题,然后说,“做吧!”

但你必须巧妙地设计一种算法,提取问题的本质,并将其转化为解决方案。这是你不彻底了解问题就做不到的事情。

你可以从博客文章或教科书中了解量子计算是如何工作的。

通过这种方式,您将了解量子力学的物理定律,这些定律从概念上决定了量子计算的工作方式。量子叠加和纠缠听起来像是科幻小说的素材。尽情享受吧!

这样的话,你将会纠结于大量的数学公式。在解方程之前,试着理解基本概念。解方程有助于验证你是否理解了材料。对于一开始就抓住一个概念是没有用的。

通过这种方式,你将发展思考问题和解决问题的能力,包括经典的和量子计算机。

但是所有的量子计算专家都不会教你太多你想要解决的问题。所以这是你需要自己带的东西。

虽然有关于世界上每一个问题的博客文章和教科书,但处理问题的实际经验是至关重要的。

在我的职业生涯中,每当我处理一个问题时,我都知道那些没有描述过的细节的重要性。

有时候这些细节是我工作的行业特有的。

有时它们是针对我工作的公司的。

有时,它们对于我试图解决的问题来说是独一无二的。

了解一个重要问题的特殊性是掌握量子计算的秘密要素。这是一个你可以利用的不公平的优势。

你可以在书上或者网上了解到关于量子计算的一切。但是,即使是最聪明的物理学家、最杰出的数学家或最精明的计算机科学家也不知道你领域中问题的细节。

他们所能做的最好的事情就是从总体上解决这个问题。但通常情况下,这是不可能的——即使对于量子计算机来说也是如此。但是知道这些微小的细节使得问题变得容易处理——或者量子算法变得适用。

量子机器学*要不要入门?看看 动手量子机器学*用 Python

在这里免费获得前三章。

成为量子专家的秘密技能

原文:https://towardsdatascience.com/the-secret-skill-you-need-to-becoming-a-quantum-expert-6da3b298bf55

既不是数学也不是物理

量子机器学*要不要入门?看看 动手量子机器学*用 Python

作者图片

成为量子计算专家的秘密要素不是数学或物理学位。如果是这样的话,这些聪明的物理学家中的一个应该已经找到了解决人类迫切问题的方法。但是他们还没有。

该行业需要的是那些了解紧急问题的特殊性,同时确定可以从量子加速中受益的问题的专家。

最大的误解是量子计算机比经典计算机快。他们不是。

量子计算所做的只是让实现非确定性算法成为可能。

但是不用担心。这不是一件坏事!如果量子计算是一个解决世界上所有问题的通用工具,我们将受到少数理解量子计算的数学家的摆布。而仅限于少数人的知识是危险的。剥夺大部分人口的知识是民主的死亡和走向专制的道路。

但是量子计算不是数学家幕后操纵的神奇工具,这不仅对我们的社会有好处。相反,这是你分一杯羹的机会。

作者图片

你只需要了解什么是非确定性算法,以及如何识别可能从中受益的问题。

我们来考虑下面这个问题。你站在两扇门前(第一层)。您选择了一个门,然后再次看到两个门(在标高 2)。这种情况一直持续到你到达第 n 层。最后,在最后的第 n 层,有一扇门,门后有一个奖品。

作者图片

现在,让我们创建一个算法来解决这个问题。

传统上,我们使用确定性算法。这样的算法可以一步打开一扇门。所以它从第 1 步到第 n 步逐门打开,看是否包含价格。如果没有,则继续下一个。

解决这个问题需要几个步骤?

最好的情况下,需要 n 步。这是我们第一次尝试打开带价格的门时的情况。

然而,在最坏的情况下,它需要 2⁰+2 +…+2^(n-1)+2^n 步骤。这是门的总数。在这种不幸的情况下,我们打开的最后一扇门包含了奖品。

在这两种情况下,我们需要解决问题的步骤数随着 n 的增加而增加。然而,它们长得非常不同。因为第一个是线性增长的,我们说这个算法是多项式增长的。相比之下,第二个呈指数增长。你千万不要低估这种差异。

步骤数多项式增长的解可以快速求解,即使对于大 n 也是如此。即使我们没有计算能力来解决 n 值大的问题,我们也应该在几年内拥有它。

所以让我们回到门口。显然,假设我们第一次尝试就能找到价格是幼稚的。对于大的 n 来说尤其如此,因为我们拥有的门越多,任何特定的门包含奖品的可能性就越小。然而,在复杂性理论中,我们通常假设最坏的情况。

但是如果有人告诉你正确的门,那就完全不同了。然后,不管是哪扇门,你只需要 n 步就可以检查出答案。

作者图片

让我们考虑另一种算法——非确定性算法。这种算法可以在一个步骤中同时打开同一层的所有门。第一步,它打开第一层的两扇门。第二步,打开第二层的四扇门,依此类推。因此,它打开了第 n 层的 2^n 门。最终,该算法在 n(非确定性)步骤后找到价格。因此,解决这个问题的复杂性是多项式的——它是容易处理的。

现在,我们只需要一台能够执行非确定性算法的计算机。这种计算机可以解决门问题,因为算法的复杂性只是多项式增长。

一些聪明的数学家确实开发了非确定性算法。一些人处理数学玩具问题,像多伊奇和西蒙。其他人,像彼得·肖尔,处理相关的问题,如数字的因式分解。

但是为什么他们没有解决人类的紧迫问题呢?或者至少是对公司很重要的问题?

他们开发算法来解决他们最熟悉的问题。原因很简单。要创建一个解决问题的非确定性算法,你必须彻底了解问题的结构。

而数学家最懂什么?对,数学问题。

同时好消息和坏消息是,这些数学家不太了解你在日常工作中面临的问题。所以要解决它们,就得自己动手。

因此,要成为量子计算专家,你需要获得现实世界领域的专业知识。然后,用识别可能受益于非确定性算法的问题的能力来补充它。

量子机器学*要不要入门?看看 动手量子机器学*用 Python

在这里免费获得前三章。

MLOps 成熟的七个阶段

原文:https://towardsdatascience.com/the-seven-stages-of-mlops-maturity-ccb029530f2

构建最大化数据科学投资回报的关键 MLOps 功能的实用指南

拉蒙·萨利内罗在 Unsplash 上的照片

我很幸运地与一些最成熟的全球公司合作,研究他们的人工智能/人工智能计划。这些公司包括财富 500 强中许多家喻户晓的名字,来自保险、制药和制造等不同行业。每个公司都有几十到几千名数据科学家。虽然他们在人工智能和 ML 方面有大量投资,但在 MLOps 方面,他们表现出惊人的成熟度。在这篇文章中,我花一点时间来看看我从与这些公司的合作中学到了什么,并分享他们在 MLOps 旅程中出现的共同主题。我这样做的目标是提供一个框架,高管和领导者可以通过这个框架来衡量他们迈向人工智能卓越之旅的进展。

定义 MLOps

以我的经验,MLOps 的定义取决于受众。对于技术从业者,我会说,“MLOps 是特定于数据科学生命周期的开发运维任务的自动化。”对于关注跨组织扩展的高管,我首先会使用术语“企业 MLOps”,然后我会说,“企业 MLOps 是一组技术和最佳实践,可简化跨多样化企业的大规模数据科学模型的管理、开发、部署和维护。”

通过这种方式,MLOps 加快了一些领导者所说的“模型速度”,即公司在确保模型安全性、安全性和准确性的最高标准的同时可以生产模型的速度。

将技术能力与商业价值联系起来

在考察这些公司采用的技术 MLOps 能力时,有一些共同的主题。它们自然地分成几组,并表现出向高度成熟发展的趋势。我将使用成熟度曲线来帮助指导这些概念的讨论。沿着 x 轴将是 MLOps 能力的几个分组。y 轴是公司从每个分组中获得的商业价值。

最成熟的组织基于对业务价值的合理评估,优先考虑添加新的 MLOps 功能。他们的北极星是优化他们整个 ML/AI 投资的 ROI。为了给每个价值陈述增添质感,我将分享分析领导者的直接引语。听到他们用语言表达他们通过采用 MLOps 功能所看到的价值是很有趣的。

加速研究

作者图片

对数据的访问,对数据科学家日常使用的工具和 ide 的访问,以及对硬件的访问是第一组能力。为了扩大数据科学研究的规模,软件环境必须基于像 Docker 这样的容器技术。并且这些组件中的每一个都必须以一种 IT 不太介入的方式进行自助服务。如果一个数据科学家必须填写一张票,发送一封电子邮件,或扮演 Linux 管理员来访问这些,我们就偏离了轨道。

这种能力组合带来的商业价值是加速研究或更快地将数据转化为见解。在 MLOps 的初始阶段取得成功后,一位 IT 主管这样说道。

“以前,可能需要两到三周的时间来了解和启动基础架构,然后开始工作。过去需要几周时间,现在只需点击一下按钮。”

—制药行业数据平台总监

高效部署

作者图片

在下一组普遍采用的功能中,我们可以调度作业、管理实验的细节,并拥有某种类型的自动化部署流程,如 CI/CD 管道。这有助于高效部署报告、应用程序、模型和其他资产。当你到达这个成熟的阶段时,一个善于分析的领导者会给你的外表增色。

“当我们建立模型时,我们现在就可以发布应用程序…我团队中的任何人都可以在不到一周的时间内完成,有些人可以在几个小时内完成。”

—软件服务决策科学高级总监

高级人工智能解决方案

作者图片

在成熟的下一个阶段,公司通常会寻求构建一个堆栈,以创建现代、复杂的分析解决方案。这种复杂性的提升来自更大的数据规模(分布式框架)、数据中的相互关系(管道和功能服务)以及复杂的类似人工智能的解决方案(深度网络)。此外,我们超越了基本的模型托管,考虑大规模托管和具有更复杂推理机制的托管模型。

达到这种水平的 MLOps 成熟度代表了两个重要方面的重要里程碑。首先,能够达到这一水平的组织可以比竞争对手更快地扩展高级人工智能解决方案。这些组织是推动其行业挑战旧规范并创造新收入流的颠覆者。例如,保险公司正在重新思考人工智能如何改变客户的索赔流程,制药公司正在将人工智能与生物标记相结合,为患者定制治疗。第二,处于 MLOps 成熟阶段的公司可以吸引和留住顶级分析人才,这是当今竞争激烈的人才市场的重要一点。这两个好处在下面的引用中得到了体现。

“我们当然正在实施更精确的模型,甚至是我们以前在更复杂的工作流程中无法实现的模型。”

金融服务公司首席顾问

“如果我们没有首先投资MLOps,我根本不可能建立一个团队,因为如果不为他们提供最先进的工作环境,你就无法雇用高技能的数据科学家。”

—曹,保险

示范安全网

作者图片

在我们达到来自 MLOps 投资的价值拐点之前,还有一项功能需要添加。如今,大多数公司都明白监控其生产模型的重要性,以提供一个抵御模型风险的安全网。正如一位领导人所说,

“数据漂移会对预测产生重大影响,最终影响我们的业务。”

—机器学*负责人,保险

拐点

正在实现其人工智能战略目标的公司不会孤立地实现这四组能力。他们认为它们是统一 IT 框架的一部分。对于这些公司来说,他们的 MLOps 功能遵循一致的策略,这导致 IT 部门可以在没有通常的英雄主义的情况下进行管理。

此外,他们非常重视数据科学家的角色。他们将数据科学家视为自己的客户。这可能包括统计分析师、定量分析师、精算师、临床程序员等。这个想法是,他们不是从不同的开源 MLOps 技术中提取零碎的东西,而是将所有这些东西放在一个保护伞或平台下,根据数据科学优先的原则将这些能力结合在一起。这种以数据科学为先的思维方式体现在几个微妙但重要的方面,从跟踪元数据的方式到模型再训练自动化的方式。

这个拐点右侧的公司是那些在整个企业中成功扩展人工智能和人工智能的公司。

标准化、协作、简化、板载

作者图片

超越拐点的第一组功能采用了容器的概念,并将其发展为一个数据科学容器管理系统,专为数据科学家的工作和协作方式而构建。这包括管理、共享和版本控制。这也使得数据科学家修改和构建容器变得容易。此外,它还包括一个可搜索的知识库,其中可以标记、存储和索引工作的所有元数据,以便于发现和轻松协作,从而减少浪费的时间并加快项目的启动。该组还包括一个再现性引擎,其中您的工作痕迹就在您面前,很容易为审计人员和监管人员验证模型血统,并且只需单击一个按钮即可重新创建过去的工作。我还在这个组中包含了一个模型注册中心。拥有一个在一个地方捕获和管理所有模型的中央存储库是模型风险管理和模型治理的基础。

我工作过的大多数大型企业在其业务线、IT 部门、运营组织、研究团队和中央卓越中心中都有数据科学团队。在这种多样化的团队中实现 MLOps 最佳实践的标准化,可以培养强大的协作能力,从而实现规模化。谈到这一价值,一位领导人指出,

“[成熟的 MLOps 支持]再现性和发现。然而,真正的知识加速发生在平台上发现他人的研究。通过简单的关键字搜索,科学家可以找到其他相关的研究或主题专家。"

—生命科学工程与数据科学高级总监

最佳模型健康和风险规避

作者图片

在通过专注于统一的、最佳实践的、以数据科学为中心的 MLOps 方法实现这一价值飞跃后,更先进的组织会关闭模型风险和模型健康的环路。他们通过与之前采用的数据和研究能力相集成的监控来实现这一点。

当模型出错或数据漂移时,自动警报会触发补救工作。还集成了模型验证,为公司或监管框架要求提供内部检查。这可能包括偏见检查、同行代码审查、模型卡创建或可解释性分析。关键是,任何人看到一个模型都可以理解风险是如何被减轻的,并看到这个模型是如何被创建的。这优化了模型健康并避免了风险。

“[集成的]模型监控节省了我们以前在维护和调查上花费的大量时间,并使我们能够实时监控模型性能,并将其与我们的预期进行比较。”

—机器学*负责人,保险

可重复的人工智能利润和安全人工智能

作者图片

这最后一组功能对集中 MLOps 特性的想法提出了挑战。正是在这里,领导者们终于拥有了一个像机器一样运行的人工智能程序,在保持所有数据和知识产权安全的同时,输出一系列可靠的盈利、产生投资回报的模型。

第一个概念是项目管理。必须为数据科学家的工作方式建立工作流程,以便他们的研究能够以流畅的协作方式进行。项目流过熟悉的阶段,有逻辑检查点。该项目成为数据科学工作的记录系统。

所有这些都需要在一个集中的平台上进行,以便 IT 部门能够确保安全性、管理用户和监控成本。合作者、领导者、主题专家、验证者、数据工程师、云开发人员和分析师都可以参与项目工作,同时让平台管理安全问题。

有了这些结构,您的数据科学团队就成了创收机器。我甚至见过为数据科学团队设定收入目标的公司。

“[我们的]平台是我们现代数据科学环境的核心,它帮助我们最大限度地提高了数据科学团队的效率、生产力和产出,帮助我们推动创新以支持我们客户的使命。"

—制造部总监兼首席数据和分析官

自我评估

考虑您自己的 MLOps 之旅,并评估您在成熟度曲线上的位置。制定计划来填补你战略中的空白。请记住,超越价值拐点的关键是以数据科学为中心的方式紧密集成所有功能。远见和规划是必需的,否则你最终会得到一堆特性和功能,这些特性和功能会抑制而不是加速扩展。做对了这一点的公司将会看到他们的人工智能/人工智能投资的巨大回报。

t-SNE,UMAP,主成分分析和其他映射之间的定量比较。

原文:https://towardsdatascience.com/the-similarity-between-t-sne-umap-pca-and-other-mappings-c6453b80f303

低维投影有助于更好地理解样本之间的关系,但是一个地图与另一个地图有多相似呢?

在 Unsplash 上的 Mike U 拍照。

PCA、t-SNE 和 UMAP 等降维方法的使用是对低维样本进行特征降维和可视化的重要技术。如果我们可以看到样本是如何通过眼睛分布的,它可以提供新的关键见解。*但是,与(原始的)高维度相比,降维空间的代表性如何呢?或者 UMAP 的嵌入与 t-SNE 或 PCA 相比有多一致?*在这里,我将演示如何使用 flameplot 库中的计算方法来量化两幅地图之间的相似性。

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学*,并注册成为中级会员。另外, 关注我 关注我的最新内容!

介绍

主成分分析、t-SNE 和 UMAP 等特征提取方法的主要目的是以这样一种方式降低数据集中的维数,即低维空间是原始(或高维)空间的良好表示。

一般来说,有两种类型的特征提取方法;线性和非线性变换线性方法 如 PCA,基于原始特征的线性组合构造一组新的维度或潜变量。 非线性方法 另一方面,诸如 t 分布随机邻居嵌入(t-SNE),非线性地保留样本之间的局部相似性,代价是保留不同样本之间的相似性。因此,t-SNE 可以更好地保留局部(不)相似性,因为它不会因数据集中的巨大差异而被压缩。一个主要的优势是非线性映射非常适合低维表示或可视化。另一方面,线性归约方法,例如 PCA,优选地用于降低复杂度、改善运行时间、确定特征重要性,以及最后但并非最不重要的防止维数灾难。值得注意的是,当用于可视化目的时,PCA 方法也可以提供很多信息。关于如何更深入地了解数据的更多信息,请参见[1]关于五氯苯甲醚用量的博客。

如何量化地图之间的差异?

在将高维数据映射到低维数据时,重要的是 相似样本之间的距离被很好地保留,而不是样本的整体分布 *。*我们希望在原始(高维)空间中看到的低维表示中投影彼此相关的样本。这将允许通过目视检查发现样品之间的关系。这种量化方法最初在本文【2】中描述,具有以下步骤来量化两个图之间的样本相似性:

  1. 计算每个图中样本之间的欧几里德距离。
  2. 使用欧氏距离对样本进行排序。距离最小的样本在顶部。
  3. 对于 kX 和 kY 最*邻,将地图 X 的等级与地图 Y 的等级进行比较。
  4. 量化等级之间的重叠。

最终输出是一个矩阵,它描述了 k 个最*邻的映射有多相似。 得分是描述地图之间样本相似性的度量。两个地图之间的完美重叠将导致得分为 1,这意味着一个地图的所有 k 个最*邻与另一个地图相似。然后,我们可以将高值的矩阵染成红色,低值的矩阵染成蓝色。这种可视化可以帮助快速解释地图的比较。

图一。系统比较两个样本投影之间的局部和全局差异的示意图。图片来自作者。

让我们再多谈一点评分方法。分数基于每个样本的 kxky 最*邻。在第一步中,为图 X 中的样本 i 计算等级,并将其与 j 邻居进行比较; rxij 。样本 i 的第一个最*邻的等级为 1,第二个最*邻的等级为 2,依此类推。类似地, ryij 是样本 j 相对于样本 i 在图 Y 中的排序。现在我们可以在区间[0,1]上计算一个分数(见等式 1),其中变量 n 为样本总数,指标函数由等式 2 给出。

等式 1。

等式 2。

如果对于每个样本,图 X 中的所有 kx 最*邻也是图 Y 中的 ky 最*邻,则得分 Sx,y(kx,ky)将具有值 1,反之亦然。

使用主成分分析、t-SNE 和 UMAP 进行降维。

在以下示例中,我将使用 mnist 数据集,并使用 PCA、t-SNE 和 UMAP 创建嵌入。我们要回答的问题是: 就样本分布而言,不同的地图有多“相似” 。首先,我们需要安装flame plot,这将有助于量化地图之间的相似性,并创建有洞察力的情节。

*pip install flameplot*

我们可以使用主成分分析、t-SNE 和 UMAP 来降低维度,并绘制前两个维度(图 2、3 和 4)。很明显,与主成分分析相比,SNE 霸王龙和 UMAP 霸王龙表现出了更好的分类效果。但是 PCA 有 50 个维度,但是为了可视化的目的,我们仅限于绘制 2(或 3)个维度。虽然我们可以观察到各种类似乎被很好地分开,但仅仅通过眼睛是不可能将精确的样本分布与另一张地图进行比较的。

图二。mnist 数据集的前两个 PC 的 PCA 图。图片来自作者

图 3。mnist 数据集的 t-SNE 图。图片来自作者。

图 4。mnist 数据集的 UMAP。图片来自作者。图片来自作者。

创建交互式散点图。

使用 D3Blocks 库,我们可以创建一个交互式散点图,直观地查看样本在不同投影之间的分布情况。更多关于 D3blocks 的细节可以在这个博客中找到。

*pip install d3blocks*

用 D3Blocks 创建的交互式散点图。

量化地图之间的相似性。

使用 flameplot 库来量化两张地图之间的相似性是相当简单的。导入库后,我们可以使用比较功能,提供样本在地图中的坐标。

50D 主成分分析与 2D t-SNE 图的比较。

当我们量化 50D PCA 嵌入和 2D t-SNE 图之间的相似性时,我们可以直接看到局部和全局范围内的高分(图 5)。这表明,与 2D t-SNE 图中的样本分布相比,50D PCA 图中样本的邻居分布非常相似。或者换句话说,t-SNE 在降低维度和保持样本之间的局部相似性方面做得非常好。

图 5。轴表示最*邻居的数量。x 轴显示 50d-PCA,y 轴显示 t-SNE。颜色描述了 k 个最*邻居之间的相似性分数。图片来自作者。

2D 主成分分析与 2D t-SNE 图谱的比较。

2D PCA 与 2D t-SNE 之间的比较结果,平均而言,相似性较低。局部尺度,即最*邻居的最接*数量,显示出较低的分数。这意味着样本在两个图之间具有不同的邻居,因此两个图上存在不同的样本分布。在较大的比例下,分数会变得稍大(绿色),这意味着平均而言,在两张地图之间会看到更多相似的邻居。

图 6。轴表示最*邻居的数量。2d-PCA 显示在 x 轴上,t-SNE 显示在 y 轴上。颜色描述了 k 个最*邻居之间的相似性分数。图片来自作者。

t-SNE 和 UMAP 地图的比较。

t-SNE(图 3)和 UMAP(图 4)都清楚地区分了类别,但是还不知道确切的样本分布是否也相似。在这里,我们可以再次量化与https://erdogant.github.io/flameplot/库的相似性(图 7)。比较的结果是高分,这意味着地图之间在局部和全球尺度上的样本分布非常相似。然而,当我们仔细观察极低数量的邻居时,我们看到 6 个最*邻居的得分为 0.5–0.6(绿色)。这意味着在两个地图之间存在非常局部的相似性之间的一些差异。

图 7。轴表示最*邻居的数量。x 轴表示 UMAP,y 轴表示 SNE 霸王龙。颜色描述了 k 个最*邻居之间的相似性分数。图片来自作者。

t-SNE 与随机坐标的比较。

让我们做最后一个比较,看看当我们比较 t-SNE 图和随机数据点时,行为是怎样的。从图 8 中可以看出,它的得分很低,这意味着在局部和全局范围内都没有发现相似性。这证实了我们应该期待的。

图 8。轴表示最*邻居的数量。x 轴显示随机数据,y 轴显示 t-SNE。颜色描述了 k 个最*邻居之间的相似性分数。在当地或全球范围内看不到任何相似之处。图片来自作者。

收尾。

维数约减技术对于低维样本的特征约减和可视化非常有用。尽管我们期望低维空间应该代表(原始的)高维度,但情况并不总是如此。 flameplot 这种见解有助于确定映射的稳定性,和/或您是否希望将结果用于决策。当我们使用低维空间的结果进行决策时,我们应该始终意识到地图仅仅是更高复杂维空间的投影。

注意安全。保持冷静。

欢呼,E.

如果您觉得这篇文章很有帮助,请使用我的 推荐链接 继续无限制学*,并注册成为中级会员。另外, 关注我 关注我的最新内容!

软件

  • 火焰图库
  • D3Blocks 库

我们连线吧!

  • 让我们在 LinkedIn 上联系
  • 在 Github 上关注我
  • 在媒体上跟我来

参考

  1. E.什么是五氯苯甲醚负荷和双标图? ,中,走向数据科学,2022 年 4 月
  2. E.Taskesen 等人,2D 图谱中的泛癌亚分型显示了由分子特征 的特定组合驱动的亚结构,科学报告自然,2016
  3. E.Taskesen, D3Blocks:创建交互式和独立 D3js 图表的 Python 库 Medium,迈向数据科学,2022 年 9 月

数据科学初学者需要知道的简单事情

原文:https://towardsdatascience.com/the-simple-things-you-need-to-know-as-a-data-science-beginner-c4b9ffd0b516

你对数据科学好奇吗?你对你的数据科学家同事的工作感兴趣吗?你想成为一名数据科学家吗?这是你进入这个令人兴奋的领域的入门书!

图片由 Sai Kiran Anagani 在 Unsplash 上拍摄

目录

  1. 一段(非常简短的)历史
  2. 数据科学家如何利用数据创造价值
  3. 数据科学家使用的工具
  4. 数据科学家解决什么问题?
  5. 机器如何学*?
  6. 数据科学项目是什么样的?
  7. 结论

这篇文章是写给那些想要一本关于什么是数据科学、它是如何工作的以及它的用途的简单易懂的解释的人的。也许你听说过数据科学,你想了解更多。也许你与一位数据科学家一起工作,并希望更好地了解他们的角色,或者你甚至有成为一名数据科学家的目标。这篇文章以简单的术语定义和描述示例为特色,是为您而写的。

我叫 Ken Jee,是一名数据科学家和内容创作者。总的来说,我的任务是帮助每个人更容易进入这个领域(老实说,我也有点为我的父母写这篇文章,这样他们就不会再要求我解释我每周都在做什么)。话虽如此,我们还是直接进入主题吧。

如果您喜欢视频格式,请点击此处观看:

(非常简短的)历史

要了解现在的数据科学是什么,重要的是要了解它是从哪里开始的。数据科学存在的时间比我们大多数人意识到的要长。1974 年,著名的计算机科学家彼得·诺尔提出了数据科学作为计算机科学的替代名称。有趣的是,在 1985 年,C.F. Jeff Wu 在他的一次演讲中使用了这个术语作为一个完全不同的领域统计学的替代名称。如果这不是显而易见的,这里有一些相当杀手的伏笔。

数据科学家的官方头衔最早是由 LinkedIn 的 DJ Patil 推广的,他后来成为巴拉克·奥巴马政府下的第一位美国首席数据科学家。

虽然这一领域的起源实际上相当古老,但这一领域的真正演变却相对较新。由于存储和计算能力的巨大进步,在过去 10 年中,数据科学的发展方式发生了巨大变化。这些短时间内的快速变化是人们仍然普遍认为数据科学是一个新的或不断发展的学科的原因。

虽然计算机科学和统计学都被几位教授称为数据科学可能是巧合,但这已经成为现实。数据科学现在是这两个领域的完美结合。我们还应该加入一点业务和主题领域来平衡事情。

许多人仍然坚持认为数据科学只是用不同的名字称呼统计学。在 1985 年,这可能是真的在一个 C.F .杰夫吴的演讲。然而,我不认为现在还是这样。由于巨大的数据量和不断增加的计算复杂性,如果没有计算机科学的帮助和对他们所操作的独特领域的一些高级理解,数据科学家今天面临的许多问题都无法解决。

那么,实际上,现在的数据科学是什么?这些抽象的东西已经够多了。

数据科学是一个名副其实的领域。数据科学是一个我们使用数据来产生某种形式的价值的领域。我们用科学技术来提取这种价值。

作者图片

数据科学家如何用数据创造价值

让我们更深入地分析一下。我们如何处理数据来产生一些价值?数据科学家从数据中获取价值的方式在很大程度上源自数据科学生命周期。所有组织的数据通常都遵循这条路径。

作者图片

我们从数据中产生价值的第一种方式是通过收集数据。虽然这不一定是所有数据科学家的核心角色。一些数据科学家利用他们的技能来收集数据。这可以通过建立网页或调查等数据输入系统来实现,也可以通过编写代码从网上不同地方收集数据来实现。

数据科学家从数据中创造价值的另一种基本方式是组织数据。世界上绝大多数数据是非结构化的,这意味着它们没有被组织到数据库中。一些数据科学家可以将这种无序的数据转换成结构化的格式,使其更容易分析。作为该过程的一部分,他们还可以通过纠正拼写错误、修复错误、识别重复记录和识别缺失值来“清理”数据。如今,这些任务中有很多是由数据工程师处理的,但它们仍然属于数据科学的范畴。如果您想了解特定数据科学角色的更多细节,这里有一个视频。

我们从数据中创造价值的下一种方式是通过分析。简单分析从基础统计开始。例如,我们可能希望对比在线客户和店内客户的平均支出。像这样的见解可以帮助我们在如何销售或营销方面做出更明智的决策。通常,传达这些见解的最佳方式是通过漂亮的数据可视化。我们也可能想看看广告活动是否有效。我们可以进行一个 A/B 测试,看看两个广告位置中哪一个推动了最多的销售。

作者图片

这是很多科学开始出现的地方。对于这样的事情,我们希望使用科学的方法和概念,如假设检验,来评估群体和活动之间的差异。

在数据分析之后,我们开始进入大多数人认为性感的东西:建立预测模型。根据过去的数据,数据科学家通常可以建立比随机概率更好地预测未来结果的模型。这使得企业(有望)在如何分配资源方面做出更好的决策。例如,如果我们拥有一个农场,我们可以建立一个模型来预测我们每个月需要购买多少化肥。特别是如果肥料有保质期,如果我们能非常准确地预测它,就能为我们省钱。另一个例子是,如果我们打算特许经营一家新餐馆,我们可以在理论上建立一个模型,根据新地点的地理、交通模式和人口统计数据来预测投资回报。

数据科学家从数据中创造价值的最后一个主要方式是通过自动化。如果我们将我们构建的一些模型投入生产,它们通常会以远远超过人类的速度提出建议。网飞就是一个很好的例子。他们有机器学*算法,可以实时给你推荐视频。对于一个真人来说,做同样的服务,需要成千上万的人,成千上万的小时。在这种情况下,只需要几个算法就可以在瞬间完成。这些事情会有回报的。根据 Comparitech 的说法,显然网飞的推荐算法对他们来说每年价值超过 10 亿美元。

数据科学家使用的工具

现在你应该很有希望理解数据科学家在哪里创造价值。但是他们用什么工具,他们的工作是什么样子的?

在我看来,数据科学家工具箱中最重要的工具是编程。大多数数据科学家要么使用 Python,要么使用 R,Python 是两者中更受欢迎的。也使用其他语言,但通常是针对特定的领域或用例。数据科学家能够访问数据,操纵数据,创建可视化,建立模型,并通过编码生产他们的模型。编程是数据科学家的通用工具。

数据科学家也有他们使用的专业工具。为了获取和操作数据,数据科学家通常会使用 SQL。这使得数据科学家可以轻松地与存储数据的数据库进行通信。另一个专业工具是 Tableau 或 Power BI,它们提供了创建数据可视化和仪表板的图形界面。

对于一些项目,数据量太大,数据科学家需要使用更多的计算能力。在这些情况下,他们将访问亚马逊、谷歌或微软(也被称为云提供商)拥有的虚拟计算机来运行他们的分析。

最后一个越来越受欢迎的工具是 Git。Git 是为编写代码的人提供的版本控制工具。这里有一个关于这个的完整视频,供那些想要更深入了解的人观看。

数据科学家解决什么问题?

我们明白,数据科学家正在使用奇特的工具。但是他们实际上能帮助解决什么问题呢?我认为这对于非数据科学家来说非常重要。数据科学和机器学*擅长处理两种主要类型的问题:监督学*和非监督学*。

首先是监督学*。监督学*用于预测特定的结果。我们想预测一些事情,比如某人是否戴着面具,或者某人到底有多高。监督学*意味着我们有数据,我们想要预测的结果被标记出来。假设我们想预测一个木瓜是否成熟。如果我们的数据有一些木瓜的特征,如长度、柔软度、质量和含糖量,如果有人给它贴上“成熟”的标签,那么这将是一个监督学*问题。更具体地说,这将是一个分类问题。我们试图将木瓜分为成熟或不成熟两类。如果我们试图预测一个木瓜的克重,这将是一个回归问题,因为我们试图预测一个连续的数值。

无监督学*是另一回事。在无监督学*的情况下,我们通常没有预先定义好的类别。相反,我们看到哪些数据自然地组合在一起,并根据其相似性或差异创建新的类别。简单的客户细分就是一个例子。也许你根据购买模式将顾客分组,然后根据相似的特征给这些群体命名。另一种形式的无监督学*是生成式的,我们从在大规模语料库上训练的模型中创建文本或图像。

作者图片

再次强调,我认为理解机器学*和数据科学的局限性非常重要。我经常听到非数据科学家把这个领域说成是万灵药。是的,我们可以做一些不可思议的事情,但是基于具体的商业案例,仍然有一些限制。这里有一个很好的例子,说明数据科学会因为糟糕的假设而出错。

机器是如何学*的?

我意识到我在这篇文章中多次提到机器学*。事实上,我可能会将它与数据科学互换使用。我收到的很多问题是,什么是机器学*,什么是数据科学?机器实际上是如何学*的?

虽然我有一整段视频更深入地探讨了这个话题的细节,机器学*算法主要是数据科学家用来建立他们的模型的。我上面列举的有监督的&无监督的学*技术都是机器学*。另一方面,大多数数据分析、数据收集和数据清理技术都没有落入机器学*的范畴。

在很大程度上,每当我们制作一个预测未来结果的模型,用算法将数据点分组,或生成新材料时,我们所做的都被认为是机器学*。

但是学*真正发生在哪里呢?

每当数据科学家构建一个模型时,他们都会将其数据分成一个训练集和一个测试集。他们将使用训练数据来“教授模型”,然后他们将看到他们的模型在预测测试集中的结果方面做得如何。我们来做一个很简单的例子。我们的数据是根据某人制作的视频数量来预测他们在 YouTube 上的浏览量。通过简单的线性回归,训练我们的模型是拟合此数据的直线。这就是我们的模型从这些数据中学*的方式。为了对我们的测试数据进行预测,我们只需要根据我们在训练集中选择的数据点来查看我们的线的值。

训练模型的一种方法是使用一条平坦的线,然后改变模型的斜率和截距,以减少误差或我们对每个估计的错误程度。作者图片

如果我们的模型在预测这些测试值方面做得很好,那么我们可以认为它已经准备好应用于新数据。在模型训练中,你会听到过拟合和欠拟合、偏差和方差权衡之类的术语。我认为它们可能超出了本文的范围,但是如果您想让我就这些问题写单独的文章,请在评论部分告诉我。

数据科学项目是什么样的?

我们构建了这些模型,但是数据科学家工作的最终产品是什么样的呢?老实说,这因角色而异。数据科学的可交付成果通常有三种风格:1)指导业务利益相关者获得自己见解的仪表板,2)对特定问题提出建议或预测的可交付成果,以及 3)用户可以从中获得实时预测的训练模型。

我认为理解这一点非常重要,在这个领域中,没有明确的正确和错误的答案。只有确定性和不确定性的影子。我的意思是,我们建立的模型给了我们对可能发生的事情的估计。我们模型的可信度帮助我们决定是否应该采取行动。理论上,任何模型都可能是错误的,即使它是在预测第二天太阳是否会升起。

我们建立的大多数模型,尤其是那些与实时预测相关的模型,需要不断地维护、重新训练,并用新数据更新,以使它们尽可能准确。

作者图片

结论

希望本文能帮助您更好地理解数据科学以及数据科学家可以帮助解决的一些问题。如果您认为这篇文章对您的朋友、同事或希望成为数据科学家的人有所帮助,如果您转发这篇文章,我将不胜感激。

如果您喜欢这篇文章,请记得在 Medium 上关注我以获取更多类似内容,并注册我的简讯以获取我的内容创作和数据科学行业其他学*资源的每周更新!此外,考虑通过注册会员来支持我和成千上万的其他作家。

非常感谢您的阅读,祝您在数据科学之旅中好运。

您可以在不到一天的时间内建立最简单的分析架构

原文:https://towardsdatascience.com/the-simplest-possible-analytics-architecture-you-can-set-up-in-less-than-a-day-ea2b4a4d1127

只需几个小时,您就可以在笔记本电脑上从头开始设置和部署数据库、ETL 服务器和自动化报告。

分析和数据库工具的分拆在市场上造成了巨大的混乱。

企业需要简单、有效的报告和分析,但在过去几年中,从“我需要分析”到实际获得它的过程变得越来越具有挑战性。

负空间拍照:https://www . pexels . com/photo/blue-and-green-pie-chart-97080/

幸运的是,我个人已经在多家公司建立了几十个分析程序。在本文中,我将描述我所知道的建立和部署数据库和报告架构的最简单的方法。

这种方法非常简单,甚至非分析/非技术人员也可以使用它来开始自己的简单数据堆栈。

本文结束时,你将……

  • 了解如何从头开始建立简单完整的分析和数据库架构。
  • 了解如何为您、您的团队或您的企业节省数千美元的软件和数据处理成本。
  • 给你的老板和同事留下深刻印象,尤其是如果分析不是你的工作。

第一步。选择云服务提供商

第一步是选择一个云服务器来管理你的数据处理(你的 ETL 服务器和数据库)。

这里有许多选择,但最简单的是坚持使用三大选择——谷歌云、AWS 或 Azure。

我个人推荐使用谷歌云。在我看来,它有最简单的用户界面,并会使设置尽可能容易和简单。

前往 cloud.google.com,点击右上角的“控制台”。如果您尚未登录,将会要求您使用 gmail 帐户登录。你可以使用任何你想要的账户。

如果您尚未创建项目,您需要通过单击下拉菜单创建一个项目(在此屏幕截图中,它显示“我的项目”——您的项目可能为空)。你可以通过几个步骤来完成。

仅此而已。您已经完成了第 1 步!

第二步。创建数据库

在谷歌云控制台中,点击左上方的 4 个栏,向下滚动到显示“数据库”的位置,点击显示 SQL 的那个。

这里还有其他可能更受欢迎的选项——比如 Google Big Query——但是我们尽量保持简单,所以我们将使用基本的 SQL 选项。

在下一个屏幕上,它会要求您添加一个帐单帐户。不要在这里强调太多,因为你的成本会非常低。Google Cloud 将根据您选择的级别和您使用的资源量向您收费。当你开始的时候,这些水平会非常小。此外,谷歌云为首次用户提供 300 美元的免费积分。

选择“创建实例”,然后单击 Postgres SQL 的选项。为什么是 Postgres 而不是 MSSQL?这真的没有太大关系——但我个人发现 Postgres 是最简单的数据操作接口,编写 SQL,进行分析和摄取数据。这两者之间的细微差别使 Postgres 略胜一筹。

在下一个屏幕上,启用 API——这将允许 Google Cloud 通过云门户管理实例。

在下一页,您将通过输入实例 ID 和密码来完成设置。这些可以是你想要的任何东西。

对于本指南,请选择 Postgres 12(而不是最新版本),并选择“生产”作为您的“开始配置”对于您所在的地区,请选择您居住的地区,并将从该地区连接到数据库。那么现在选择“单一区域”。

在“机器类型”下,将设置更改为“轻量级”,因为我们保持事情小而简单。然后将存储空间调整为 10GB。这将为你节省大量的钱。GCP 将允许您以后根据需要扩大规模。

最后,点击页面底部的“创建实例”。

*忽略 PostgreSQL 14 —您的应该是 12

几分钟后,您的数据库将上线!

现在我们来连线。

我喜欢用一个叫 DBeaver 的数据库工具。你可以在这里免费下载。

打开 Dbeaver,单击左上方看起来像插头的图标,添加一个新连接。

在“连接到数据库”屏幕上(如上所示),双击 PostgreSQL。

您可以获得连接到 Google Cloud 中的新数据库所需的凭据。

在上面的截图中,它在我刚刚创建的数据库的概述页面中显示了我的新实例的 IP 地址。

您还需要您的用户名和密码。您的用户名可以通过点击屏幕左侧的用户选项卡获得。您的密码是您在数据库创建过程中设置的初始密码。如果您忘记了密码,可以在用户屏幕上重置。

在连接之前,您需要将您的 IP 地址加入白名单。在“连接”选项卡下,找到“授权网络”部分。然后点击“添加网络”,添加您的 IP 地址并给它一个名称。然后点击“保存”这将允许您从该特定 IP 地址登录到数据库。我建议在你的主要工作场所或家里做这件事。

完成后,在 DBeaver 中输入所需的凭证,然后点击“Test Connection”——您应该会看到如下所示的屏幕:

这意味着您已经成功连接!

现在让我们把一些数据输入你的数据库。

第三步。设置 ETL 工具或 ETL 服务器

有几十种方法可以将数据输入数据库。如果您有非常定制的需求,您可能会想要一个 ETL 服务器,您可以在其中托管和执行 Python(或类似的)脚本。如果你的需求更简单(比如获取 Linkedin、脸书营销数据等)。)可以用 Fivetran 之类的。我将介绍如何设置这两者。

虚拟机

回到谷歌云,点击屏幕左上角的 4 个工具条。然后向下滚动并悬停在“计算引擎”上在新选择栏的最顶端,单击“虚拟机”

点击“创建实例”

在下一个屏幕上,为虚拟机命名,并在“机器类型”下选择 e2-small。你可以在任何时候升级它,所以一开始总是选择尽可能小的。

在“防火墙”下,选中“允许 HTTP”和“允许 HTTPS”流量。

在“启动盘”下,你会看到“镜像”在 Debian 上被设置为默认操作系统。您可以通过单击“更改”来进行更改基于熟悉程度,我更喜欢使用 Ubuntu,但是你可以使用你最熟悉的。

将会有几个不同版本的操作系统选项,我建议你选择最新版本的操作系统。

设置完成后,滚动到底部并点击“创建”

几秒钟后,您应该会在下一个屏幕上看到一个绿色的勾号,表示您的服务器现在处于活动状态。

要设置对新虚拟机的访问,请单击虚拟机,然后单击“SSH”旁边的下拉菜单,并使用“在浏览器窗口中打开”

这将打开一个新的浏览器窗口,您将在其中连接到虚拟机。

每次都用这种方式连接效率很低,所以我建议创建 ssh-keys,这样您就可以使用 Windows 上的 Powershell 或 Mac 上的终端进行连接。

要在 Mac 上做到这一点,请进入终端并输入

cd ~/.ssh/

这将把您带到 ssh keys 文件夹,您将在这里存储 ssh 密钥以连接到您的新虚拟机。现在输入

ssh-keygen

该命令将提示您输入名称。我通常喜欢使用我刚刚创建的 VM 的名称,但是您可以使用任何您想要的名称。

将创建两个文件:一个名为name,另一个名为[name]。酒馆

要设置本地计算机连接到 VM,您需要在。pub 文件到您的新虚拟机。

你可以打开你的新虚拟机(按照上面的说明)并输入

cd ~/.ssh/

现在,您将位于虚拟机的 ssh 密钥文件夹中。

添加公钥(在。pub 文件)添加到授权密钥文件中

echo [PUBLIC KEY] >> authorized_keys

回到您的本地计算机,键入

vim ~/.ssh/config 

您需要在这里输入新连接的主机信息。如果您的机器上存储了多个密钥对,这一点尤其重要。

在配置文件中,您将添加以下内容

Host [whatever you want]
HostName [External IP Address]
User [username it shows on the VM]
IdentityFile ~/.ssh/[name of the private key - the file without .pub]
ServerAliveInterval 50

*请注意,您可以通过转到计算引擎>虚拟机>然后选择您的虚拟机,在 Google 云控制台中找到您的虚拟机的“外部 IP 地址”。

按 shift z,z 保存并退出。

要从您的本地机器连接到您的虚拟机,只需在终端中键入“ssh [Host]”,您就应该连接上了。

如果第一次尝试没有成功,不要担心。如果你有问题,请随时给我发消息或查看这篇文章以获得更多指导:https://www . digital ocean . com/community/tutorials/how-to-set-up-ssh-keys-on-Ubuntu-1804

现在您有了一个虚拟机,可以用来编写和部署 python 脚本,并设置自动化的 cron 作业,以有趣的方式部署或使用数据。

关于你能做什么的例子,请查看我的文章如何使用 Python 请求从 API 中提取数据。

ETL 工具

市场上有几十种 ETL 工具,带有一些最流行的应用程序、网站和 API 的现成连接器(通常每月花费 150 美元或更少)。

在这个例子中,我将使用名为 Fivetran 的 ETL 工具为我的公司提取一些 Linkedin 广告指标。

像 Fivetran 这样的工具使得 ETL 变得微不足道。

选择一个数据源和一个目的地(在本例中是 Postgres),添加您的凭证并按照说明进行操作。不要忘记将数据库中的 IP 地址列入白名单,以供您使用任何第三方工具。像 Fivetran 这样的工具有大量的帮助页面,会告诉你需要哪些 IP 地址才能让软件正常工作。(您可以按照上面的说明将 IP 列入白名单,我在上面讨论了如何将您的客户端 IP 列入 Dbeaver 的白名单。)

像 Fivetran 这样的工具可以对数据库进行完全同步,甚至不需要设置合并标准或配置数据模型。

数据会自动将预先建模的表同步到 Postgres 数据库中,无论您设置的步调是什么。

下面是它在数据库中的样子:

第三步。设置报告

只需两步,您就已经实现了 80%的自动化报告和分析。

你甚至不需要 Hadoop、雪花实例、DBT 或任何其他花哨的企业级工具来做这件事。

现在到了有趣的部分。

市场上有许多不同的 BI 和报告解决方案。Tableau 是最受欢迎的,但设置起来既昂贵又耗时。

Power BI 很便宜,很可能你的公司已经通过你的 Office 365 订阅为它付费了。

但是到目前为止,最好也是最简单的入门选择是 Google Data Studio。

转到 Google Data Studio,使用您用来访问 Google Cloud 控制台的相同登录帐户登录。点击左上角的“创建”并选择“数据源”

你会看到几十个不同的选项。在搜索框中键入“postgres”并选择“PostgreSQL”

在左上角你可以给你的数据源一个名字。只需使用您会记住的名称或与数据库同名的名称。

在下一个屏幕上,您需要再次添加您的数据库凭证并验证您的数据库。您首先需要将 Data Studio 用于连接的 IP 地址列入白名单(您可以按照步骤 1 中提供的相同说明将您的客户端 PC/笔记本电脑列入白名单)。

输入凭证后,您将看到数据库中反映的模式和表。

在这里,您可以选择一个表,或者您可以选择“自定义查询”选项并编写 SQL 来获得您想要的预聚合数据。

在下一页,您将能够根据您正在导入的自定义查询或表来格式化您的数据字段。这是根据数据的上下文将某些字段转换为文本、数字、货币或日期字段的好机会。

完成字段格式化后,点击右上角的“创建报告”。

此时,您将把新获取的数据处理成实际的报告。

根据数据的上下文,有数百种显示、聚合和格式化数据的选项。

我只用了几分钟就建立了这个 Linkedin 广告仪表板:

编辑完报告后,您可以单击“查看”来查看它的外观。然后,您可以直接在同一个屏幕上将其分享给团队成员或任何相关的利益相关者。

瞧啊。您刚刚创建了一个自动化仪表板。

只要您的数据源在数据库中被一致地更新(使用 Fivetran 或您的定制 ETL 脚本),每当用户打开它检查新数据时,报告将自动刷新。

下一步是什么?

恭喜你!如果您已经完成了本指南,那么您已经成功地建立了一个成熟的分析架构。

从这里开始,您可以使用 ETL 工具或者使用 Python 脚本的,添加新的数据源,构建更多更好的仪表板,或者使用 SQL 进行一些分析。

随着数据的增长,您可以使用 Google Cloud(或您选择的任何服务器)快速轻松地扩展您的数据库。

感谢阅读!如果您喜欢本指南,请在 Medium 上关注我的,了解更多关于分析和从数据中获取价值的文章。

如果你想和我在一个项目上合作,或者在为你的团队或业务建立单一来源真实分析方面获得帮助,直接联系我。

关于 Python 函数要知道的六件最重要的事情

原文:https://towardsdatascience.com/the-six-most-important-things-to-know-about-python-functions-e1eacaab412

如何使用这些强大的工具来编写更好的 Python 代码

图片来源:pixabay 的 Pixl2013

许多初学编程的人被函数弄得不知所措,努力理解他人的代码或在自己的脚本中使用函数。然而,函数是一个非常强大的编程特性,利用它们将会改进您的代码。为了帮助您学*这些技能,并立即开始编写优秀的函数,以下是关于使用 Python 函数需要了解的六件最重要的事情。

1.为什么应该使用函数

函数有用有两个原因。

首先,函数允许你一次编写一个代码块,然后多次使用它。您只需要编写和调试一次代码。这在将来为你节省了很多时间。函数也使你的代码更容易维护,因为如果你需要在某个时候更新你的函数,你只需要在一个地方编辑它。

其次,编写函数可以让读者更容易理解你的代码。如果你的函数有一个描述性的名字(例如,一个为计算餐馆账单上的小费而设计的函数可以被称为 calculate_tip ),那么任何阅读你的代码的人都可以理解每一行是做什么的,而不需要理解这些计算。

假设我已经编写了前面提到的 calculate_tip 函数,我想为我自己和我的朋友计算小费。我朋友的账单是 21 美元,我的是 32 美元,我们每个人都想留下 20%的小费。我可以编写下面的代码,调用 calculate_tip 两次来获得每一次的提示。现在不要担心函数的语法,我稍后会谈到。

friends_bill = 21my_bill = 32tip_percent = 20friends_tip = calculate_tip(friends_bill, tip_percent)my_tip = calculate_tip(my_bill, tip_percent)print(friends_tip)print(my_tip)

这段代码的输出将是我和我的朋友应该留下的小费金额。请注意阅读和理解这些代码是多么容易。对于这两种计算,我们只看到一行说明小费金额是根据账单和期望的百分比计算的,这非常直观。

2.Python 函数的基本结构

所有 Python 函数都使用相同的基本结构。首先,您需要定义函数,为它提供一个名称和函数处理所需的参数。然后,您需要定义每次调用时它将处理的代码。最后,当您调用函数时,您需要指定要返回的值(如果有的话)。让我们再次使用我们的 calculate_tip 函数示例:

def calculate_tip(bill, percent): tip = bill * percent/100 return tip

第一行代码定义了函数。

  • def 告诉 Python 该行正在创建一个新函数。
  • calculate_tip 是函数的名称,所以 Python 现在知道无论何时键入 calculate_tip 都要使用这段代码。
  • (bill,percent) 声明无论何时调用该函数,这两个输入都是必需的。
  • 结尾的 : 告诉程序在调用这个函数时运行下面的缩进代码。

第二行代表该函数使用的计算。每当有人想计算小费时,该函数将账单乘以所需的百分比,然后除以 100(将百分比转换为小数)来确定想要的小费金额。

最后,最后一行表示计算出的小费是函数的输出,可以根据需要传递给变量。

在之前计算朋友小费的例子中,我们使用了账单中的 21 美元和 20 百分比作为小费。调用 calculate_tip 的代码导致该代码以 bill = 21 和 percent = 20 运行。Tip 被计算为 21 * 20/100 ,或 4.2。****calculate _ tip函数然后返回 4.2 ,它被存储到变量 friends_tip *,*中,然后我们打印出来以便于查看。

3.返回值

上一节展示了从函数返回值的基础。您可以使用 return 命令,后跟一个值来声明您想要的输出。Python 函数的一个巧妙之处在于,只要将输出赋给足够多的变量,就可以返回任意多的输出。

例如,我们可以让 calculate_tip 更有用,让它返回包括小费在内的总账单。然后,用户可以看到留多少小费以及总共要付多少。为此,我们将修改 calculate_tip 如下。

def calculate_tip(bill, percent): tip = bill * percent/100 total = bill + tip return tip, total

该代码有两处补充。首先,我们在计算和返回小费之间添加了一行。这一行把小费加到账单上,算出总支付额。第二个变化是将 total 添加到返回行中,告诉 Python 无论何时我们调用 calculate_tip ,它都应该返回这两个值。

我们可以使用稍微更新的代码来存储和读取这些函数的输出,如下所示:

friends_tip, friends_total = calculate_tip(friends_bill, tip_percent)my_tip, my_total = calculate_tip(my_bill, tip_percent)print(friends_tip, friends_total)print(my_tip, my_total)

由于 calculate_tip 现在返回两个输出,我们需要更新调用它的代码行以接收两个输出。为此,两条线现在都有两个变量。一个存储算出的小费,另一个存储算出的总数。打印输出的语句也是如此。每行打印小费,然后打印总数。

4.使用参数

函数所需的输入通常称为参数。它们有时被称为参数,尽管实参是更常见的术语。

在处理参数时,您可以使用一些技巧。

首先,您可以直接在函数定义中为每个参数提供一个默认值。如果你知道你通常给 20%的小费,你可以把它作为默认值输入。如果你想用一个不同于 20%的数字,你只需要指定小费的百分比。例如,考虑下面的代码:

def calculate_tip(bill, percent = 20): tip = bill * percent/100 total = bill + tip return tip, totalfriends_bill = 21my_bill = 32tip_percent = 10friends_tip, friends_total = calculate_tip(friends_bill, tip_percent)my_tip, my_total = calculate_tip(my_bill)print(friends_tip, friends_total)print(my_tip, my_total)

在函数定义中,您可以看到 tip_percent 现在被设置为 20 ,这表明如果您在调用函数时没有指定值,将使用 20%。调用 calculate_tip 返回 my_tipmy_total 的行只传递 my_bill 作为输入。由于代码不会覆盖默认值 20%,因此 calculate_tip 在执行计算时会使用 20%。

另一方面,变量 tip_percent 被设置为 10 %,并在调用 calculate_tip 来标识 friends_tipfriends_total 时使用。这将覆盖默认的 20 %,并使用 10%执行计算。

Python 参数也可以是位置参数或关键字参数,代表指定其值的两种不同方式。位置参数是根据它们在函数调用中的位置来引用的,关键字参数是通过引用函数调用中的参数名称来指定的。

让我们看几个简单的例子。

你们已经熟悉位置论点了,因为这是我们目前为止一直在用的形式。为了突出这一点,请考虑下面的代码:

def calculate_tip(bill, percent = 20): tip = bill * percent/100 total = bill + tip return tip, totaltip, total = calculate_tip(21, 15)

请注意,函数调用没有包含任何指定哪个数字属于哪个参数的代码。因为没有指定,所以这些值根据它们的位置分配给参数。因为 calculate_tip 首先寻找账单变量,所以它使用第一个传递的值( 21 )。百分比也是如此;因为 calculate_bill 预期百分比是第二个,所以它使用第二个传递的变量( 15 )。

关键字参数是通过在传入参数时引用特定关键字来指定的。这允许您按照自己喜欢的任何顺序指定参数。例如,您可以使用以下代码:

def calculate_tip(bill, percent = 20): tip = bill * percent/100 total = bill + tip return tip, totaltip, total = calculate_tip(percent = 22, bill = 110)

在该示例中,函数调用明确声明 percent 为 22 ,bill 为 110 美元。事实上,它们的顺序与 calculate_tip 预期的顺序相反,这很好,因为 Python 使用了关键字而不是位置。

5.单独的名称空间

在 Python 中,名称空间是变量和关于这些变量的信息的集合。程序的不同方面会创建新的不同的名称空间,所以您需要注意如何传递变量。

函数能够从主外部名称空间读取值,但是除非明确声明,否则它们不会返回到外部名称空间。

记住这一点很重要,原因有二:

  1. 在函数内部定义变量时,你需要小心。如果不是这样,你可能会使用与函数外部相同的变量名,并且可能会使用错误的值。
  2. 您需要仔细考虑要从函数中返回的值。如果不将变量作为输出返回,外部名称空间就完全无法访问它。

这里有一个突出这些影响的例子:

def calculate_tip(bill, percent = 20): tip = bill * percent/100 total = bill + tip print(my_bill)my_bill = 32tip_percent = 10calculate_tip(friends_bill, tip_percent)print(total)

请注意这段代码的一些特殊之处。首先,我的账单既没有传入计算提示中也没有进行计算。它只存在于 calculate_tip 之外的名称空间中。其次, calculate_tip 没有返回值,因此函数中计算的 tip 和 total 变量在该名称空间内。

当我们运行该代码时,我们得到以下输出:

32Traceback (most recent call last): File “main.py”, line 18, in <module> print(total) NameError: name ‘total’ is not defined

您可以看到 calculate_tip 成功打印了 my_bill (32),因为它从外部名称空间继承了该信息。但是在打印 total 时代码出错,因为 total 只存在于calculate _ tip的名称空间中,不存在于主名称空间中。

6.记录您的功能

记录你的代码是非常重要的。这是你告诉用户如何使用你的代码,以及你为什么做出选择的方式。

您可能认为文档在您的大部分代码中并不重要,因为您是唯一使用它的人。然而,您会惊讶地发现,您很快就会忘记代码是如何工作的。如果你曾经写过一个函数,两年后再来看,你会非常感激你留给自己的注释。

最基本的代码文档是在函数开始时提供一些介绍。该文档应介绍功能的目的和方法,然后描述所需的输入和输出。这种描述通常是在一句输入和输出描述之前的两三句话。下面是我们的 calculate_tip 函数的一个例子:

def calculate_tip(bill, percent = 20): ''' Calculates the tip and total for a given bill and tip percentage. Processes for a single bill at a time. inputs bill: Float. The price to be paid by the person. percent: Float. The desired tip to be paid, expressed as a percent of the bill. outputs tip: Float. The tip to be paid for the bill and tip percent. total: Float. The total price to be paid, including the tip. ''' tip = bill * percent/100 total = bill + tip return tip, total

阅读该文档可为用户提供正确使用该功能所需的关键信息。其他人现在可以理解函数的目的、限制以及输入和输出的结构和目的。

另一个需要记住的要点是,你应该记录你所做的任何假设,或者强调为什么代码必须是你编程的方式(我在这里没有这样做,因为这是不言自明的)。这些包含的内容是一种很好的方式,可以与以后可能需要理解计算方法的其他人进行交流。

就是这样!现在你知道了使用 Python 函数的六个最重要的技巧。

数据科学项目的框架

原文:https://towardsdatascience.com/the-skeleton-of-a-data-science-project-1559138480d0

从头到尾,我们讨论了令人毛骨悚然的数据内部结构,它们创造了漂亮的图形、报告和见解

播放侏罗纪公园的音乐。乔恩·巴特沃斯在 Unsplash 上的照片

一个数据门外汉走进一个数据项目架构会议,肯定会很快被工程、数学、研究和统计淹没。再加上关于模型部署和拒绝处理代码的 GPU 的激烈讨论,就有了完美的信息风暴。

在一天结束的时候,它将会被整合成一根数据香肠,在这里你看起来会忘记所有独立的部分,但仍然非常美味可口。

为了充分理解数据项目创建的一般过程,我们需要将它分成关注的领域:每个步骤的输入和输出是什么,谁负责,以及我们应该知道什么工具才能有效地工作。

但是首先,让我们先做一些描述:**什么是数据项目?**简而言之,数据项目的目标是处理原始数据,使用某种聚合/组合/统计模型丰富原始数据,并以最终用户可以理解的方式交付原始数据。

https://www.oreilly.com/library/view/foundations-for-architecting/9781492038733/ch01.html

我们可以进一步分离一个数据项目:一个这样的分离是在 OSEMN 框架中(获取、清理、探索、建模、解释),它处理了上面抽象描述的几乎所有事情。对于数据科学家来说,这是一个创建独立项目的好方法,但是它仍然缺乏从开发到生产的途径。

</5-steps-of-a-data-science-project-lifecycle-26c50372b492>

香肠

最终的项目/味道可能包含任何这些步骤/味道。每个步骤也有一个基于字母的层次,表明它对项目的整体重要性。图片由我制作,以图表形式完成。

我们来解剖一下前面提到的香肠。您可能会注意到,OSEMN 步骤与本文中讨论的步骤有所重叠:

  1. 这一切都从计划阶段开始,在那里你描述你的项目的目标,每个处理步骤的输入和输出,以及你的团队在其中的角色。
  2. 如果我们手头没有原始数据,我们必须从某个地方搜集(获取) 数据,无论是从 API 还是网页。
  3. 原始数据的格式化是在争论(擦洗)阶段完成的。
  4. 有时我们需要那种最先进的模型,那是在研究阶段制造的。
  5. 一切就绪后,我们可以开始建模(探索/建模)
  6. 去镇上的工程区!我们需要使用 MLOps 来关注我们模型的生命周期…
  7. 并且在生产环境中部署我们的解决方案。
  8. 最后,我们收集丰富的数据,并使用仪表板和报告对其进行分析。

规划(必备)

规划一个数据项目意味着将原始信息为了变成可操作的知识而需要跟踪的路线写在纸上。这是通过会议和大量描述业务需求的文档(文本和视觉)来完成的,如何通过科学和工程工作来转化这些需求,项目的总体范围是什么,以及谁负责什么。

https://kubicle.com/learn/data-literacy/data-literacy-thinking-and-communicating-with-data-planning-a-data-project

这是一个团队的努力:科学家知道什么模型可以用于这项任务;工程师知道如何管理数据,并将数据从一个过程发送到另一个过程;PM 范围和时间盒。在这里,通才通常比专家更有价值:将来自多个领域的知识联系起来,可以减少产生孤立的机构知识的机会。

参与规划的人的工具箱包括:

  • 项目管理工具( JIRA泰加观念)来计划任务和目标;
  • 图表工具(米罗露西德查diagrams.net)创建可视化文档;
  • 要遵循的项目描述模板(征求意见)。下面的链接是一个数据科学项目 RFC 的例子:建模的抽象部分描述得非常好,但它也可以使用时间框和更好的分步实现描述。

https://docs.wellcomecollection.org/developers/rfcs/021-data_science_in_the_pipeline

刮擦(C-情景)

在某些情况下,你手头没有你需要的原始数据。这意味着您需要制定一个流程,通过 API 从数据供应商那里或者甚至从 Web 本身那里抓取数据。

这与软件工程人员更有关系,但对于对从基本上任何他们想要的东西制作概念证明感兴趣的数据科学家来说,这可能是一笔很好的资产(当然,要尊重你的国家关于个人数据的法律)。

刮刀工具包包括:

  • 易于部署的刮痧框架( Scrapy木偶师);
  • 查询 HTML 文档的语言( XPathCSS);
  • 在本地或云中保存原始数据的管道( Scrapy 管道,AWS 消防软管,GCP 数据流);
  • 原始数据查询和管理( AWS Glue/Athena )。

https://www.vittorionardone.it/en/2020/12/15/web-scraping-edge-aws-kinesis-data-firehose-glue/

争吵(有助于你的日常工作)

争论数据的行为意味着对数据进行打孔,直到它符合您的数据库建模。标准化、映射、清理、结构化……这一切都属于数据争论的范畴。

数据工程师通常主要负责基本的数据争论活动,管理表的血统及其结构完整性。

但我们也可以将这种活动与科学家通常对其数据集进行的预处理数据进行比较,以便训练和预测模型:L2 归一化、一键编码……这是局部争论(仅在模型上下文中使用)而不是全局争论(公司中的任何人都使用)。

牧马人的工具包包括靴子、套索和:

  • SQL 。牧马人的大部分工作将通过 SQL 查询完成,通过视图和过程导出数据,以及一般的优化。了解几个数据库的语法( PostgreSQLMySQLPresto )以及了解一个管理你的数据模型的工具( DBT )会给你的日常生活带来福音;

https://mode.com/sql-tutorial/data-wrangling-with-sql/

  • 你选择的语言的数据操作库(例如 Python 的 Pandas ,Scala 的Spark);
  • 数据验证概念和工具(远大前程,Pytest )。

https://www.digitalocean.com/community/tutorials/how-to-test-your-data-with-great-expectations

研究(C——情境)

大多数数据科学项目不需要最先进的准确性指标。对于那些这样做的人,我们需要研究和深入研究学术论文和博客,以精心制作一个接*任务目标的模型。

理论上,这种类型的研究应该由专注于学术知识领域的 ML 研究人员和数据科学家来完成。在实践中,数据科学家通常被期望帮助项目的其他方面(争论、部署、分析),并且也做研究,这使得数据科学的开发稍微复杂一些。

作为研究人员,您的日常生活包括:

  • 了解如何对学术文章进行搜索和编目(门德利arXiv谷歌学术);

https://www.mendeley.com/

  • 具备一定的神经网络建模框架知识( PytorchTensorflowKeras);

https://elitedatascience.com/keras-tutorial-deep-learning-in-python

  • 使用 GPU 加速处理来加速那些繁重的网络( CUDA /NVIDIA,ROCm/AMD);

https://rocmdocs.amd.com/en/latest/Tutorial/Tutorial.html

  • 使用所有与建模相关的工具…

建模(必备)

这是项目的关键,也是数据科学家日常生活的主要部分:创建从数据中产生知识的模型。这可以使用 ML 来完成更复杂的任务,但也可以使用基本的统计、聚合和变量组合来完成!有时,一个包含少量计算的 Excel 表格可能是解决问题的理想方案。

但是抛开基本的统计知识,做建模需要哪些工具呢?

  • 通用领域的基本建模框架( scikit-learn 用于一般的建模, spaCy 用于语言处理, OpenCV 用于计算机视觉,以及预先训练好的模型库,如 Keras 应用);

https://spacy.io/usage/spacy-101

  • 用于日常建模任务的高级自动化工具( PycaretAutoML 用于预处理和模型选择, SweetViz 用于探索性数据分析);

https://www.analyticsvidhya.com/blog/2021/04/top-python-libraries-to-automate-exploratory-data-analysis-in-2021/

  • 这里也需要像 PandasDask 这样的数据操作工具;
  • 如果你有太多的数据,并行处理是必不可少的: Spark 是实现这一点的最简单的方法,而 Databricks 可以帮助你适应笔记本电脑和管理集群。

https://docs.databricks.com/getting-started/quick-start.html

  • 其他笔记本服务工具也很有用(JupyterLab,Sagemaker)。

MLOps

MLOps 是机器学*和 DevOps 之间的结合点:管理数据应用程序整个生命周期的工具和技术。从数据接收到部署,它是将这个故事中的所有步骤与可观察性实践、部署策略和数据验证连接起来的粘合剂。

这是每个参与数据项目的人都应该顺便知道的事情:了解 MLOps 的数据科学家将创建具有适当日志记录、模块化设计和实验跟踪的可维护模型;数据工程师将能够轻松地编排这些模型,并以连续的方式部署它们。

有几个库和工具可以使 MLOps 变得更加容易。

  • MLOps 的基础在于存储您的 ML 实验参数和结果。为此,您可以使用权重&偏差mlflow :这两者都可以轻松集成到您的模型训练代码中,并且可以立即生成有趣的报告。

https://theaisummer.com/weights-and-biases-tutorial/ https://www.analyticsvidhya.com/blog/2021/07/machine-learning-workflow-using-mlflow-a-beginners-guide/

  • 如果你在你的 ML 管道中使用 Kubernetes,你应该看看 Kubeflow :它使用 K8s 的所有可伸缩性来处理模型的整个生命周期。

  • 如果你已经在某种程度上使用了气流,看看元流。它允许您使用类似 DAG 的代码模块化您的训练步骤。

  • 如果你想专注于云提供商,你也可以选择他们自己的 ML 部署套件,如 AWS SagemakerGCP 数据实验室

部署

在部署阶段,我们需要将我们的模型移植到当前的架构中。这主要是数据工程的责任,但数据科学家必须随时准备与他们一起工作,以调整他们的代码:在 Docker 环境中安装一个由 GPU 驱动的库,确保 AWS 批处理作业使用其实例的 100%的处理能力。

在这一步提高技能的最好方法是了解管道工具的一般原型,以及它们在其他云中的相似之处。Satish Chandra Gupta 有一篇关于它的精彩文章,去看看吧!

  • 通常,ML 相关的东西应该在 Docker 镜像中运行:为了训练/推理代码正确运行,需要预先安装大量的系统和 Python 库。
  • 你可以在 EC2/Compute 机器中手工执行那些代码,将它们包装在无服务器服务中,如 AWS BatchGCP 云函数,使用 Databricks 等外部平台,并通过气流触发笔记本……
  • 为了让您的部署看起来像一个微服务,您可以使用消息队列系统来定义输入和输出通道,例如 ActiveMQ、Kafka、SQS、Pub/Sub

https://www.datasciencecentral.com/apache-kafka-ksql-tensorflow-for-data-scientists-via-python/

  • 要将这一切投入生产,基础设施即代码(IaC)工具对于一个合理的 CI/CD 过程是必不可少的: Terraform无服务器包是您的基础设施和应用程序部署的好伙伴。

https://www.serverless.com/blog/definitive-guide-terraform-serverless/

分析

这是管道的尽头!有了这些经过处理的数据,我们就可以开始将它们咀嚼成易于理解的仪表板和报告,这样我们就可以从中获得可操作的见解。在这一部分,我们能够将业务度量与建模度量联系起来:我们的模型结果是否向我们的客户交付了我们期望的特性?

https://www.analyticsvidhya.com/blog/2021/09/how-to-evaluate-the-business-value-of-ml-model/

这部分的责任主要在数据分析师的手上,他们的能力涉及统计(理解数据)、仪表板(创建报告)和用户体验(创建好的报告)。数据科学家也是这个过程的一部分,通过讲故事,解释他们的模型结果和目标。

  • 最好的数据分析工具是我们已经熟悉的套件: Tableau、Looker、PowerBI 。这些价格昂贵,但非常值得他们的许可费。Apache 超集是一个开源的选择。
  • 仪表板工具对于分析过程也很有用:我个人使用过很多元数据库,带有到各种数据库的连接器和一个简单的部署脚本。也可以对 RedashGoogle Data Studio 感兴趣。
  • 但是这一步最好的工具不是具体的工具:业务领域知识对于了解客户需求和可能的数据相关特性之间的联系是必不可少的。

数据项目通常是有风险的工作,但是通过适当的计划、工具包和角色定义,我们可以最大限度地缩短从构思到执行的时间。如果你想增加你作为开发人员的影响和范围,开始寻找学*邻*领域的资源(例如,如果你知道如何争论,你可以在你的建模印章上工作,或者看看你的摄取管道如何工作)。

这个故事是我在# the deviconf 2022,TDC Connections 中所做演讲的总结。

缓慢的莫家伙现在由人工智能匹配

原文:https://towardsdatascience.com/the-slow-mo-guys-now-matched-by-ai-dba5e9e177c7

使用深度学*和视频帧插值在 5 分钟内提高您的慢动作视频的质量

克洛德·莫内画的相机——稳定扩散生成的图像

我们都同意慢动作视频创造了这种戏剧效果,这无疑为特定场景增添了额外的风味。另一方面,降低视频速度可能会产生一些不想要的伪像,这可能会被认为是不值得观看的。但是是什么让慢动作视频变得伟大呢?

让我们使用深度学*来产生能够以高帧率记录的高端相机的平滑结果。

除了其他方面,我认为最重要的方面是它的 FPS 数:每秒有多少帧被渲染到屏幕上。太低,视频会断断续续,造成不愉快的观看体验。**因此,我们需要一台昂贵的摄像机,能够以高帧率进行拍摄。或者,我们可以使用深度学*,尝试在两个连续的帧之间合成中间图像。**我有没有提到这会让我们多花 0 美元?

超级慢动作只是计算机视觉领域中众所周知的视频帧插值或 VFI 的应用之一。这个故事介绍了 *RIFE:视频帧插值的实时中间流估计。*我们介绍了它带来了什么,并使用我们自己的视频进行了快速试驾。让我们开始吧!

Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!

什么是 VFI?

**视频帧内插(VFI)的最终目的是提高帧速率,增强视频的视觉质量。**为了实现这一点,它试图合成两个连续帧之间的中间图像,这两个连续帧在空间和时间上都与现有上下文一致。

在其核心,我们发现另一个视觉任务命名为光流。所以,让我们快速绕一圈,看看什么是光流,以及它如何帮助我们处理 VFI。然后,我们将准备好观看 RIFE 的运行,并使用我们自己的视频来玩它。

光流

**广义而言,光流是理解事物在像素级图像中如何运动。**这对于许多下游视频编辑任务非常有用,例如视频分析、图像稳定和视频对齐。

一幅图像由许多像素组成,当我们移动相机时,这些像素会发生某种变化。光流试图找出这种运动是如何影响每个像素的。所以,我们试图给图像中的每个像素附加一个运动矢量,指示这个像素要移动到哪里。

光流—计算机爱好者

这些信息是理解图像中正在发生的事情、物体如何移动以及移动方向的关键。然后,下一步是在这些像素变化之间生成合理的帧。这就是 VFI 发挥作用的地方。

RIFE 简介

我们看到了什么是 VFI,以及它如何提高视频的视觉质量。我们还看到了什么是光流,为什么它被认为是 VFI 的核心元素,以及它如何帮助我们解决这个问题。现在,是时候介绍 RIFE 了。

RIFE 使用一个名为 IFNet 的神经网络,可以直接从图像中估计中间流。这项新工作的主要贡献总结如下:

  • 设计一种新颖高效的网络架构来简化基于流的 VFI 方法。因此,给定两个输入帧,所提出的模型可以从头开始训练,并直接逼*中间流。
  • 一个新的泄漏蒸馏损失函数,它导致更稳定的收敛和大的性能改善。
  • 首款基于流的实时 VFI 算法,能够以 30FPS 的速度处理 720p 视频

下面我们可以看到一些用 RIFE 处理的视频的例子。左边是原始视频,右边是增强版。看看处理后的版本有多平滑。

RIFE:视频帧插值

你可以阅读 ArXiv 上的论文并浏览该项目的页面了解更多细节。让我们进入有趣的部分:在我们自己的视频上使用 RIFE!

辅导的

在我们自己的视频上使用 RIFE 真的很容易。然而,如果我们真的想让它发光,我们需要一个 Nvidia GPU。为此,我们用谷歌 Colab 吧!

去colab.research.google.com用 GPU 运行时创建一个新的笔记本。如果您以前没有这样做过,从Runtime菜单中选择Change Runtime Type,然后选择GPU

现在,我们准备克隆 RIFE repo。在单元格中,键入以下内容:

!git clone [https://github.com/hzwer/arXiv2020-RIFE](https://github.com/hzwer/arXiv2020-RIFE)

接下来,在目录中创建一个名为train_logcd的新文件夹:

!mkdir /content/arXiv2020-RIFE/train_log
%cd /content/arXiv2020-RIFE/train_log

下载预先训练好的模型,为视频帧生成预测。为了实现这一点,我们使用了一个 Python 模块,使得从 Google Drive 下载对象变得容易:gdown

!gdown --id 1APIzVeI-4ZZCEuIRE1m6WYfSCaOsi_7_
!7z e RIFE_trained_model_v3.6.zip

接下来,我们应该安装项目的依赖项。cd到项目的文件夹中,使用pip安装必要的包:

%cd /content/arXiv2020-RIFE/
!pip3 install -r requirements.txt

如果您想快速尝试该模型,请下载作者提供的demo.mp4视频:

!gdown --id 1i3xlKb7ax7Y70khcTcuePi6E7crO_dFc

运行下面的脚本为demo.mp4生成一个增强的视频:

!python3 inference_video.py --exp=2 --video=demo.mp4 --montage

最后,如果您想在自己的视频上使用该模型,只需更改--video标志指向的视频的名称:

!python3 inference_video.py --exp=2 --video=mydemo.mp4 --montage

这个脚本将使视频中的帧数增加四倍。输出将存储在相同的位置,其名称将类似于mydemo_4X_120fps.mp4。恭喜你!您的新的、增强的视频现在准备好了!

注意,上传带音频的视频的时候好像有个 bug。为了获得最佳体验,请使用没有音频的视频,或者尝试使用--fps标志,直到问题得到解决。

结论

在这个故事中,我们看到了什么是光流,以及它与视频帧插值的关系。我们研究了这两种方法的目标,以及一种新技术 RIFE:VFI 实时中间流量估计如何用于生成令人印象深刻的新内容。

最后,我们玩了 RIFE 和我们自己的视频。我把最好的部分留到了最后:一个新的 Windows 应用程序已经使用 RIFE 为任何 GPU 提供快速视频插值: Flowframes 。然而,使用 python,您可以在任何支持 GPU 的机器上获得 RIFE 的好处!

关于作者

我叫 Dimitris Poulopoulos ,我是为 Arrikto 工作的机器学*工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。

如果你有兴趣阅读更多关于机器学*、深度学*、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。

所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。

用 PyPi 发布 Python 包的入门指南

原文:https://towardsdatascience.com/the-starters-guide-to-release-your-python-package-in-pypi-efd72cbc0011

一步一步的指导,有效地在 Python 包索引(PyPI)中发布您的 Python 包,以 pip 安装它

照片由 Aaron Burden 在 Unsplash

在 PyPi 中发布一个包并用 pip 安装它有很大的好处,因为它会自动解决依赖性,并且它可以在任何机器上访问。然而,发布开源 Python 包需要一些准备步骤,例如目录的明确结构、版本控制、归档构建和发布包。我将逐步展示如何 i) 用必要的文件构建目录, ii) 用版本控制创建发行版档案(也就是 Python 包),以及 iii) 在 PyPi 上发布。我还将演示如何使用I release来自动化所有这些步骤。在这篇博客的最后,你可以发布并安装你自己的库。**

如果你觉得这篇文章很有帮助,可以使用我的 推荐链接 继续无限制学*,并注册成为中级会员。另外, 关注我 关注我的最新内容!

Python 包。

Python 包是加载函数(集合)的基本构建块。这将防止每次启动时都要从头开始编写代码。物理上的,它是一个包含 Python 脚本的结构化文件夹。概念上的,是一个名称空间。或者换句话说,由一个包名绑定在一起的一组功能或模块。包保存在一个名为 PyPi 或 Python 包索引【1】的中央存储库中。可以用命令安装:pip install <package_name> 在后台,pip 工具会在服务器上搜索包名,然后安装到(本地)机器上。另一个优点是它自动解析依赖树。要创建 Python 包,需要遵循一些基本规则。 第一步是创建一个结构化的文件夹。

第一步。创建结构化文件夹。

构建您的目录是很重要的,即使您不想在 PyPi 上发布它。这将使你的项目可维护,对你未来的自己和那些想贡献或使用它的人来说都是可理解的。在创建结构化文件夹之前,我们需要一个包名。除了少数例外,可以自由选择包的名称。最重要的是,应该是在 PyPi 上没有注册。通过在 pypi.org 的搜索栏中搜索包名来找到它。如果名字已经存在,你需要有创意。

出于演示的目的,我将把我的包命名为: relevantpackage。 对于 Python 包文件夹主 Python 脚本的名称,建议并通常使用与完全相同的 名称(参见下面的代码部分)。但是,命名可能取决于项目的范围。只要确保明智地选择(文件夹/文件)名称,以避免导入过程中的混淆相关的包 的目录结构如下图所示。请注意,所有文件在开始时都可以是空的,因为我们将在下面的部分中填充它们。

*relevantpackage/
├── relevantpackage/        Python package folder.
|    ├── __init__.py        Make the folder a package.
|    └── relevantpackage.py The main Python file.
|
├── setup.py                Configuration file for the package and dependencies.
├── LICENSE                 License file.
└── README.md               Project information.*

相关包. py

我要创建的第一个文件是主 python 脚本。这个脚本的名字是relevantpackage.py.,它由一个名为Relevantpackage的类组成,我们可以导入并初始化这个类:from filename import classname或者在这个例子中:from relevantpackage import Relevantpackage

*"""This is the relevantpackage.py script."""# Import libraries
import osclass Relevantpackage():"""Relevant package class."""def __init__(self, message=None):"""Initialize with user-defined parameters."""self.message=messagedef show(self):"""Run the show function."""if self.message is None:print('No message was given as input during initialization.')else:print(self.message)# Returnreturn None*

init。巴拉圭

*package 文件夹是将要在 PyPi 上发布的文件夹,因此安装在(本地)机器上。要告诉 Python " 这是包目录",它需要一个名为__init__.py 的文件。在我的例子中,是目录 ***relevantpackage。**init 文件是包初始化时第一个执行的文件。如果你喜欢,它可以是空的,但是我推荐添加下面的信息。注意,这个 init 文件与脚本 relevantpackage.py 中写的def __init__(self, message=None)无关。

*# Change the content according to your package.
# from directory.filename.py import classname
from relevantpackage.relevantpackage import Relevantpackage__author__ = 'E.Taskesen'
__email__ = 'name@gmail.com'
__version__ = '0.1.0'# module level doc-string
__doc__ = """
relevantpackage
================Description
-----------
relevantpackage is a Python package created for demonstration purposes.
This information will show up when using the help function.Example
-------
>>> # Import library
>>> from relevantpackage import Relevantpackage
>>> # Initialize
>>> model = Relevantpackage(message='Hello World')
>>> # Run the model
>>> model.show()References
----------
* https://towardsdatascience.com/a-step-by-step-guide-in-detecting-causal-relationships-using-bayesian-structure-learning-in-python-c20c6b31cee5"""*

setup.py

setup.py是您的包的配置文件。它将包含依赖项、版本和其他相关信息(参见下面的代码部分)。对于 relevantpackage, 我们没有依赖项,但是我添加了最常用的库,比如 NumPy、Pandas 和 Matplotlib 用于演示目的。依赖项是被使用并导入到包中的库。

*# Change the content according to your package.
import setuptools
import re# Extract the version from the init file.
VERSIONFILE="relevantpackage/__init__.py"
getversion = re.search( r"^__version__ = ['\"]([^'\"]*)['\"]", open(VERSIONFILE, "rt").read(), re.M)
if getversion:new_version = getversion.group(1)
else:raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,))# Configurations
with open("README.md", "r") as fh:long_description = fh.read()
setuptools.setup(install_requires=['matplotlib','numpy','pandas'],        # Dependenciespython_requires='>=3',                                   # Minimum Python versionname='relevantpackage',                                  # Package nameversion=new_version,                                     # Versionauthor="E.Taskesen",                                     # Author nameauthor_email="name@gmail.com",                           # Author maildescription="Python package for my relevantpackage.",    # Short package descriptionlong_description=long_description,                       # Long package descriptionlong_description_content_type="text/markdown",url="https://github.com/erdogant/relevantpackage",       # Url to your Git Repodownload_url = 'https://github.com/erdogant/relevantpackage/archive/'+new_version+'.tar.gz',packages=setuptools.find_packages(),                     # Searches throughout all dirs for files to includeinclude_package_data=True,                               # Must be true to include files depicted in MANIFEST.inlicense_files=["LICENSE"],                               # License fileclassifiers=["Programming Language :: Python :: 3","License :: OSI Approved :: MIT License","Operating System :: OS Independent",],)*

README.md

README.md是一个降价文件,包含关于包和/或项目的一般信息。这是 GitHub 存储库上显示的第一页。我在自述文件中加入了 徽章 ,提供了该项目的概述。请注意,有些徽章只有在 PyPi 上提供该包后才有效。您可以通过将 相关包 名称更改为您的包名称来重复使用这些徽章。

*# relevantpackage[![Python](https://img.shields.io/pypi/pyversions/relevantpackage)](https://img.shields.io/pypi/pyversions/relevantpackage)
[![Pypi](https://img.shields.io/pypi/v/relevantpackage)](https://pypi.org/project/relevantpackage/)
[![LOC](https://sloc.xyz/github/erdogant/relevantpackage/?category=code)](https://github.com/erdogant/relevantpackage/)
[![Downloads](https://static.pepy.tech/personalized-badge/relevantpackage?period=month&units=international_system&left_color=grey&right_color=brightgreen&left_text=PyPI%20downloads/month)](https://pepy.tech/project/relevantpackage)
[![Downloads](https://static.pepy.tech/personalized-badge/relevantpackage?period=total&units=international_system&left_color=grey&right_color=brightgreen&left_text=Downloads)](https://pepy.tech/project/relevantpackage)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/erdogant/relevantpackage/blob/master/LICENSE)
[![Forks](https://img.shields.io/github/forks/erdogant/relevantpackage.svg)](https://github.com/erdogant/relevantpackage/network)
[![Issues](https://img.shields.io/github/issues/erdogant/relevantpackage.svg)](https://github.com/erdogant/relevantpackage/issues)
[![Project Status](http://www.repostatus.org/badges/latest/active.svg)](http://www.repostatus.org/#active)---------### Install relevantpackagefrom PyPi.
```bash
pip install relevantpackage

Example

  # Import libraryfrom relevantpackage import Relevantpackage# Initializemodel = Relevantpackage(message='Hello World')# Run the modelmodel.show()

## *许可证**`LICENSE`是开源软件的重要组成部分。为了让你的库真正开源,你需要许可它,这样其他人就知道如何使用、改变和分发软件。因此,选择正确的许可证非常重要。在[本页](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository)上阅读更多关于不同类型许可证的信息。创建新的存储库时,可以从下拉菜单中选择许可证,如图 1 所示。 ***相关包*** 将在 MIT 许可下可用。**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2022/-/raw/master/docs/img/6f7ca24ced3a8406fab8c71773bb7deb.png)**图一。创建新的存储库时,可以选择许可证(图片由作者提供)。*# *第二步。上传到 GitHub。**在您创建了包含所需文件*(如步骤 1 所示)*的结构化目录后,您可以在 [GitHub](http://github.com/) 上发布它。请注意,您需要为您的包更改`setup.py`中的变量,*如名称、描述、URL 等*。将文件推送到 GitHub 存储库之后,我们可以开始构建发行版档案,也就是 Python 包。图 2 显示了[***relevant package***](https://github.com/erdogant/relevantpackage)***的 [GitHub 库](https://github.com/erdogant/relevantpackage)。*** 请注意,有些徽章在开始时可能是红色的,但在 PyPi 上发布包后会变成绿色。**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2022/-/raw/master/docs/img/0b303faf7e9d54de10ab30f7078756f4.png)**图二。relevantpackage 的 GitHub 库截图(图片由作者提供)。*# *第三步。安装所需的工具。**为了在 PyPi 上创建发行版档案并发布包,我们需要一些库的帮助。 ***这里我要介绍一下 irelease 库[2]。irelease 库自动创建发行版档案、版本检查、在 GitHub 上创建标签和发布,以及在 PyPi*** 上发布。在下一节中,我将演示如何使用*库来释放 ***相关包*** 。此外,我将描述手动创建发行版归档文件的步骤。首先,让我们安装 ***irelease*** 库:**

pip install irelease


*****I release****库*使用 *Setuptools、Wheels 和 Twine* ,它们是众所周知的发布 Python 包的工具。简要描述如下:***   **[Setuptools](https://pypi.org/project/setuptools/) :用于创建和发布 Python 包。**
*   **[滚轮](https://pypi.org/project/wheel/):用于创建`.whl`文件,可通过`pip install`命令直接安装。该文件也被上传到 [P](https://pypi.org/) yPi。**
*   **[Twine](https://pypi.org/project/twine/) :在您的系统和 [PyPi](https://pypi.org/) 之间提供一个安全的、经过验证的连接。**# **第四步。软件包的安装和测试。****此时,我们创建了一个结构化的文件夹,其中包含所有必需的文件,应该可以通过 pip 安装。在 PyPi 上发布之前,建议首先检查本地机器上的工作是否正确。要创建包的安装,我们需要转到根目录(在这个例子中:***relevant package***)并安装:**

pip install -U -e .


**有三个输入参数,`-U`参数是`-Update`的缩写,它将强制安装当前版本。`-e`参数是`-editable`的缩写,它允许你进行编辑。`.`指当前工作目录。合起来就是在可编辑模式下强制安装当前目录(即 ***相关包*** )。现在,您可以导入包并测试功能,如下所示:**

**# Import library
from relevantpackage import Relevantpackage

Initialize

model = Relevantpackage(message='Hello World')

Run the model

model.show()**


# **第五步。创建一个包并发布到 PyPI 上。****此时,我们创建了一个包含所有必要文件的结构化文件夹,我们测试了包的正确工作,我们有一个可用于版本控制的 GitHub 存储库,安装了所有需要的库,并且在 [*Twine*](https://pypi.org/account/register/) 上创建了一个帐户,用于安全分发您的包。****下一步是构建发行版档案。这些是您的包的压缩文件,可以跨多个平台(Windows、UNIX、macOS)部署。要创建发行版归档文件并发布包,我们必须从您要发布的包的根目录运行 ***irelease*** 。在我的例子中,它是本地磁盘上的***relevant package***的根(图 3)。我们可以使用终端或(Anaconda)提示符,用一个命令发布这个包。您可以使用命令`irelease`或`pyrelease`。在下面的章节中,我将使用`irelease`这个名字,但是这两个命令做的完全一样。**

irelease


pyrelease


**`irelease`的默认设置是自动从`.git`和`setup.py`中提取*用户名*、*包名和路径位置*。您不需要提供任何输入参数,但是,这可能取决于您的系统配置。您可以提供输入参数,如下面的代码部分所示。**

**irelease -u erdogant -p relevantpackage

options:
-u USERNAME, --username USERNAME # Username on Github/Gitlab.
-p PACKAGE, --package PACKAGE # Package name to be released.
-c {0,1}, --clean {0,1} # Remove local builds: [dist], [build] and [x.egg-info].
-i {0,1}, --install {0,1} # Install this versions on local machine.
-t twine, --twine twine # Path to twine in case you have a custom build.
-v {0,1,2,3,4,5} # Verbosity, higher number tends to more information.**


**在终端中运行`irelease`后,如动画图(图 3)所示,将连续执行以下步骤:**1.  **从 GitHub 库获取最新信息。**
2.  **`__init__.py`中列出的版本与 GitHub 上发布的最新版本的比较。**
3.  **清理以前的构建目录,如`dist`和`build`,以防止错误构建的分发。**
4.  **使用以下命令创建新的分发归档文件:**

python setup.py bdist_wheel


python setup.py sdist


**5.在 Git 存储库中自动设置版本 ***标签*** 。这将冻结 GitHub 库的当前状态,并允许在需要时在版本之间来回切换。在这里可以找到 ***相关包*** 的标签:**

https://github.com/erdogant/relevantpackage/tags


**6.使用*绳*上传到 PyPi 的发行档案。请注意,您需要[绳线](https://pypi.org/project/twine/)的用户名和密码。正在使用的命令:**

twine upload dist/*


**7.打开 GitHub 存储库的发布页面,添加发布描述。****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2022/-/raw/master/docs/img/8ea578cdc46c9e4c5499b76b1ba4ed7c.png)****图 3。运行 irelease 创建发行版归档文件并在 PyPi 上发布包的示例(图片由作者提供)。****8.最后一步是在 GitHub 存储库上创建关于发布的描述。然后按下<*释放按钮>* 。注意,当使用 ***irelease*** 时,浏览器会自动打开(图 4)。****![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2022/-/raw/master/docs/img/50875c33848420e1b8501ab332482366.png)****图 4。最后一步是为你的发布写一个描述。[https://github.com/erdogant/relevantpackage/releases](https://github.com/erdogant/relevantpackage/releases)(图片由作者提供)。**# **第六步。Pip 安装您的软件包。****当你现在在 pypi.org[搜索你的包裹时,你应该能找到。这意味着您可以使用 pip 安装软件包,导入并使用库。让我们试试 ***相关包*** (参见下面的代码部分和图 5) *。*](https://pypi.org/)**

pip install relevantpackage


**# Import library
from relevantpackage import Relevantpackage

Initialize

model = Relevantpackage(message='Hello World')

Run the model

model.show()**


**![](https://gitcode.net/OpenDocCN/towardsdatascience-blog-zh-2022/-/raw/master/docs/img/8c3a947f8ecb5c12e75ba3a85d1a5127.png)****图 5。pip 安装相关包并运行示例代码(图片由作者提供)。**# **最后的话。****使用 ***irelease*** 库,您可以轻松地发布您的包,因为它自动化了创建发行版档案、版本检查、创建标签和发布到 PyPi 的步骤。释放你的包的好处,不管多小,都是巨大的。您的包可以在任何机器上访问,它解决了您的包所需的依赖树。另一个优点是,您必须创建一个具有明确目录结构的存储库。这将有助于使你的项目对你未来的自己来说是可维护的和可理解的,对其他想要使用或贡献的人来说也是如此。请注意,还有一些工具,如[cookiecutter](https://github.com/cookiecutter/cookiecutter)【3】,可以帮助创建必要的目录结构。****我没有描述的另外两个重要步骤是*测试和文档*,但是你可能想在发布你的包之前考虑一下。强烈建议在发布您的包之前编写测试。对于测试驱动开发来说,有很多很好的材料。此外,如果您发布了您的包,还建议您创建描述输入参数、输出和函数行为的文档。此外,创建许多演示用法的示例。最好的方法是在代码中创建带有描述和示例的文档字符串。然后,可以将文档字符串与诸如[Sphinx](https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html)【4】这样的工具一起使用。这里显示了一个例子,我在这里创建了 Sphinx 页面*D3 blocks**,它们主要依赖于代码中编写的文档字符串。*就是这个!我期待着听到你发表你的第一个包!******注意安全。保持冷静。*******欢呼,e .********如果你觉得这篇文章很有帮助,可以使用我的* [*推荐链接*](https://medium.com/@erdogant/membership) *继续无限制学*,并注册成为中级会员。另外,* [*关注我*](http://erdogant.medium.com) *关注我的最新内容!***# **软件***   **[irelease GitHub](https://github.com/erdogant/irelease)**# **我们连线吧!***   **让我们在 LinkedIn 上联系一下**
*   **[在 GitHub 上关注我](https://github.com/erdogant)**
*   **在媒体上跟随我**# **参考**1.  ***使用 Python 包索引查找、安装和发布 Python 包。*[https://pypi.org/](https://pypi.org/)**
2.  **Taskesen,E. (2020 年)。Python 包来发布你的包。[https://github.com/erdogant/irelease](https://github.com/erdogant/irelease)**
3.  ***从 cookiecutters(项目模板)创建项目的跨平台命令行实用程序,例如 Python 包项目、C 项目。*[https://github.com/cookiecutter/cookiecutter](https://github.com/cookiecutter/cookiecutter)**
4.  ***Sphinx 是一个强大的文档生成器,具有许多用于编写技术文档的强大功能,包括。*[https://docs . readthe docs . io/en/stable/intro/getting-started-with-sphinx . html](https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html)**
5.  ***Taskesen E,Verver O. D3Blocks:一个 Python 包,用于创建交互式 d3js 可视化。*[https://d3blocks.github.io/d3blocks](https://d3blocks.github.io/d3blocks)**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/816718.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TowardsDataScience-博客中文翻译-2022-二十九-

TowardsDataScience 博客中文翻译 2022(二十九)原文:TowardsDataScience 协议:CC BY-NC-SA 4.0如何使用计算机视觉读取酒瓶上的标签?(第一部分)原文:https://towardsdatascience.com/how-to-read-a-label-on-a-wine-bottle-using-computer-vision-part-1-25447f97a761欢迎…

格点拉格朗日插值与PME算法

本文介绍了使用基于格点拉格朗日插值法的Particle Mesh Ewald算法,降低分子力场中的静电势能项计算复杂度的基本原理。静电势能的计算在Ewald求和框架下被拆分成了远程相互作用项和短程相互作用项,其中短程相互作用项关于实空间的点电荷间距快速收敛,而远程相互作用项在倒易…

公司网站怎么修改?数据库内网站密码修改?

修改公司网站通常涉及以下几个步骤:确定需求:明确需要修改的内容,如页面设计、功能增加或信息更新等。 收集相关资料和内容,确保所有需要的信息都准备齐全。选择工具或平台:如果网站是基于WordPress、Joomla等CMS系统构建的,可以通过后台直接进行编辑。 对于自定义开发的…

修改默认登录网站密码?

修改默认登录网站密码通常涉及以下几个步骤,具体操作可能会根据不同的网站或系统有所差异:登录账户:打开你需要修改密码的网站。 使用当前的用户名和密码登录你的账户。进入账户设置:登录后,找到并点击“账户”、“个人资料”或“设置”等相关链接或按钮。 在账户设置页面…

如何在后台修改网站资料?网站后台如何修改字体?

在后台修改网站资料通常涉及以下几个步骤,具体操作可能会根据不同的内容管理系统(CMS)或网站平台有所不同:登录后台管理界面:使用管理员账号和密码登录到网站的后台管理界面。导航至内容管理:在后台找到“内容管理”、“页面管理”或类似的选项,这通常是编辑网站资料的地…

网站模板修改?网站模板咋样修改?

1. 确定修改目标功能需求:明确需要添加或删除的功能。 设计需求:确定颜色、布局、字体等视觉元素的调整。2. 备份现有模板在进行任何修改之前,确保备份当前使用的模板文件,以防修改过程中出现错误可以恢复原状。3. 修改HTML/CSSHTML:根据功能需求,编辑HTML结构,添加或删…

C语言小白记录自己的错题和总结

​ 计算n个a的思路都是用a+a10+a100…… 然后在累加 记得用include<math.h> pow 考察逗号表达式 即使像x+y x+7之类的 算出结果后 x和y还是不变 因为没有赋值 所以x和y都是原来的值 问号语句 先计算第一个表达式 若他的值为非0(即真)将表达式2的值作为条件表达式的值…

数据库系列:主从延时优化

相关文章 数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库系列:使用高区分度索引列提升性能 数据库系列:前缀索引和索引长…

平衡堆栈

理解并观测函数调用母函数做什么,子函数做什么cdecl调用约定#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>int __cdecl method(int x, int y){ return x + y;}int main(){ __asm mov eax, eax; // 此处设置断点 method(1, 2); return 0;}可以看出_…

怎样修改网站管理密码?

修改网站管理密码的方法取决于您使用的网站管理系统(CMS)或托管服务。以下是一些常见平台的修改方法: 1. WordPress通过WordPress后台:登录到WordPress后台。 进入“用户” > “我的个人资料”。 修改“密码”字段,输入新密码并确认。 点击“更新个人资料”保存更改。通…

视频监控人员行为识别

视频监控人员行为识别技术基于先进的计算机视觉和深度学习算法。视频监控人员行为识别利用大量的视频数据进行模型训练,使算法能够学习和识别员工的不同行为特征。然后,将训练好的模型应用到实际的监控系统中,对员工的行为进行实时监测和分析。视频监控人员行为识别通过视频…

海面漂浮物垃圾识别检测

海面漂浮物垃圾识别检测系统基于先进的图像识别技术,海面漂浮物垃圾识别检测通过海边已经安装了的高清摄像设备,能够实时拍摄海面情况,并将图像信号传输到专业的图像分析平台进行处理。海面漂浮物垃圾识别检测通过对这些图像进行深度学习和算法分析,系统能够准确识别并分类…